ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhOTE2NwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEzIEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlZmlsZSBmb3IgdGhlIExpbnV4IE5ldHdvcmsgRmlsZSBTeXN0ZW0KKyMgICAgICAoTkZTKSBVdGlsaXRpZXMgKG5mcy11dGlscykuCisjCisKK0J1aWxkQ29uZmlnU3BlY2lhbGl6ZWQJOj0gTm8KK0J1aWxkUHJvZHVjdFNwZWNpYWxpemVkCTo9IE5vCisKK2luY2x1ZGUgcHJlLm1haworCitQYWNrYWdlTmFtZQkJOj0gbmZzLXV0aWxzCisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmJ6MgorUGFja2FnZVNlcGFyYXRvcgk6PSAtCisKK1BhY2thZ2VQYXRjaEFyZ3MJOj0gLXAxCisKK1BhY2thZ2VBcmNoaXZlCQk6PSAkKFBhY2thZ2VOYW1lKS4kKFBhY2thZ2VFeHRlbnNpb24pCitQYWNrYWdlU291cmNlRGlyCTo9ICQoUGFja2FnZU5hbWUpJChQYWNrYWdlU2VwYXJhdG9yKSQoUGFja2FnZVZlcnNpb24pCisKK1BhY2thZ2VCdWlsZE1ha2VmaWxlCT0gJChjYWxsIEdlbmVyYXRlQnVpbGRQYXRocyxNYWtlZmlsZSkKKworQ2xlYW5QYXRocwkJKz0gJChQYWNrYWdlTGljZW5zZUZpbGUpCisKK0xpYkNhcERpcgkJOj0gc3cvdHBzL2xpYmNhcAorTGliQ2FwSW5jRGlyCQk6PSAkKGNhbGwgR2VuZXJhdGVSZXN1bHRQYXRocywkKExpYkNhcERpciksdXNyL2luY2x1ZGUpCitMaWJDYXBMaWJEaXIJCTo9ICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCQoTGliQ2FwRGlyKSxsaWIpCitUY3BXcmFwcGVyc0RpcgkJOj0gc3cvdHBzL3RjcF93cmFwcGVycworVGNwV3JhcHBlcnNTZWFyY2hQYXRoCTo9ICQoY2FsbCBHZW5lcmF0ZVJlc3VsdFBhdGhzLCQoVGNwV3JhcHBlcnNEaXIpLHVzcikKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpL0NPUFlJTkc6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoUGFja2FnZVNvdXJjZURpcikvQ09QWUlORworCSQoY29weS1yZXN1bHQpCisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICQoUGFja2FnZVNvdXJjZURpcikKKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisKKyQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpOiB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpY2QgJChCdWlsZERpcmVjdG9yeSkgJiYgXAorCSQoQ1VSRElSKS8kKFBhY2thZ2VTb3VyY2VEaXIpL2NvbmZpZ3VyZSBcCisJQ0M9IiQoQ0MpIiBBUj0kKEFSKSBSQU5MSUI9JChSQU5MSUIpIFNUUklQPSQoU1RSSVApIFwKKwlJTlNUQUxMPSIkKElOU1RBTEwpICQoSU5TVEFMTEZMQUdTKSIgXAorCUNQUEZMQUdTPS1JJChMaWJDYXBJbmNEaXIpIFwKKwlMREZMQUdTPS1MJChMaWJDYXBMaWJEaXIpIFwKKwktLWJ1aWxkPSQoSG9zdFR1cGxlKSBcCisJLS1ob3N0PSQoVGFyZ2V0VHVwbGUpIFwKKwktLXdpdGgtdGNwLXdyYXBwZXJzPSQoVGNwV3JhcHBlcnNTZWFyY2hQYXRoKSBcCisJLS1kaXNhYmxlLWdzcyBcCisJLS1kaXNhYmxlLW5mc3Y0IFwKKwktLWRpc2FibGUtdGlycGMgXAorCS0tZGlzYWJsZS11dWlkIFwKKwktLXByZWZpeD0vdXNyIFwKKwktLXN5c2NvbmZkaXI9L2V0YworCisjIENvbmZpZ3VyZSB0aGUgc291cmNlIGZvciBidWlsZGluZy4KKworLlBIT05ZOiBjb25maWd1cmUKK2NvbmZpZ3VyZTogc291cmNlICQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpCisKKyMgQnVpbGQgdGhlIHNvdXJjZS4KKyMKKyMgV2UgaGF2ZSB0byB1bnNldCBNQUtFRkxBR1Mgc2luY2UgdGhleSBjb25mdXNlIHRoZSBwYWNrYWdlIGJ1aWxkIG90aGVyd2lzZS4KKworLlBIT05ZOiBidWlsZAorYnVpbGQ6IGNvbmZpZ3VyZQorCSQoVmVyYm9zZSl1bnNldCBNQUtFRkxBR1MgJiYgXAorCSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgYWxsCisKKyMgU3RhZ2UgdGhlIGJ1aWxkIHRvIGEgdGVtcG9yYXJ5IGluc3RhbGxhdGlvbiBhcmVhLgorIworIyBXZSBoYXZlIHRvIHVuc2V0IE1BS0VGTEFHUyBzaW5jZSB0aGV5IGNvbmZ1c2UgdGhlIHBhY2thZ2UgYnVpbGQgb3RoZXJ3aXNlLgorCisuUEhPTlk6IHN0YWdlCitzdGFnZTogYnVpbGQgfCAkKFJlc3VsdERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpdW5zZXQgTUFLRUZMQUdTICYmIFwKKwkkKE1BS0UpICQoSk9CU0ZMQUcpIC1DICQoQnVpbGREaXJlY3RvcnkpIERFU1RESVI9JChSZXN1bHREaXJlY3RvcnkpIGluc3RhbGwKKworY2xlYW46CisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChQYWNrYWdlU291cmNlRGlyKQorCSQoVmVyYm9zZSkkKFJNKSAkKFJNRkxBR1MpIC1yICQoQnVpbGREaXJlY3RvcnkpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChSZXN1bHREaXJlY3RvcnkpCisKK2luY2x1ZGUgcG9zdC5tYWsKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9DT1BZSU5HIGIvbmZzLXV0aWxzLTEuMi4yL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NDliZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9DT1BZSU5HCkBAIC0wLDAgKzEsMzQwIEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9DaGFuZ2VMb2cgYi9uZnMtdXRpbHMtMS4yLjIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWU2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMzMyNCBAQAorQXV0aG9yOiBTdGVpbmFyIEguIEd1bmRlcnNvbiA8c2d1bmRlcnNvbkBiaWdmb290LmNvbT4KK0RhdGU6ICBXZWQgU2VwIDEzIDIyOjIzOjIzIENFU1QgMjAwNgorCisgICAgRml4IC1uIG9wdGlvbiB0byBtb3VudGQKKworICAgIFRoZSBnZXRvcHRfbG9uZygpIG9wdGlvbiBzdHJpbmcgaW4gbW91bnRkIHdhcyBoYXZpbmcgYSBzcHVyaW91cworICAgIGNvbG9uIGFmdGVyIHRoZSAnbicsIGxlYWRpbmcgdG8gdGhlIHNob3J0IGZvcm0gb2YgLS1uby10Y3Agbm90CisgICAgYmVpbmcgdXNhYmxlIChleHBlY3RpbmcgYSBwYXJhbWV0ZXIsIGNvbnRyYXJ5IHRvIHRoZSBsb25nIGZvcm0KKyAgICBhbmQgdGhlIGRvY3VtZW50YXRpb24pLiBGaXguCisgICAgCitBdXRob3I6IFN0ZWluYXIgSC4gR3VuZGVyc29uIDxzZ3VuZGVyc29uQGJpZ2Zvb3QuY29tPgorRGF0ZTogIFdlZCBTZXAgMTMgMjI6MTk6MzkgQ0VTVCAyMDA2CisKKyAgICBEb2N1bWVudCBzZW5zaXRpdmUgZ2lkcworCisgICAgVGhlIGV4cG9ydHMoOCkgbWFuIHBhZ2UgYWxyZWFkeSBtZW50aW9ucyB0aGF0IHNvbWUgbm9uLXJvb3QgdXNlcnMsCisgICAgc3VjaCBhcyBiaW4sIG1pZ2h0IGJlIGp1c3QgYXMgc2Vuc2l0aXZlIGFzIHJvb3QsIGFuZCB0aGF0IHJvb3Rfc3F1YXNoCisgICAgdGh1cyBtaWdodCBub3QgYmUgYXMgZWZmZWN0aXZlIGFzIG9uZSBjb3VsZCBob3BlIGZvci4gVXBkYXRlIHRoZQorICAgIGRvY3VtZW50YXRpb24gdG8gYWxzbyBtZW50aW9uIHRoYXQgdGhpcyBjb3VsZCBiZSB0aGUgY2FzZSBmb3Igbm9uLXJvb3QKKyAgICBncm91cHMsIHN1Y2ggYXMgc3RhZmYuCisKK0F1dGhvcjogTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CitEYXRlOiAgTW9uIEF1ZyAgNyAxNjozNTowMyBBRVNUIDIwMDYKKworICAgIFNldCB2ZXJzaW9uIHRvIDEuMC4xMAorCU5vdGU6IDEuMC4xMCBzaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvCisJIDEuMC45IGVzcGVjaWFsbHkgd2l0aCBrZXJuZWxzIDIuNi4xOCBhbmQgbGF0ZXIKKwkgb3RoZXJ3aXNlICdycGMubmZzZCBOJyB3b24ndCB3b3JrIHRvIGNoYW5nZSB0aGUKKwkgbnVtYmVyIG9mIHRocmVhZHMgYWZ0ZXIgbmZzZCBoYXMgYmVlbiBzdGFydGVkLgorCQorQXV0aG9yOiBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KK0RhdGU6ICBNb24gQXVnICA3IDE2OjM1OjAzIEFFU1QgMjAwNgorCisgICAgc3VwcG9ydC9uZnMvbmZzc3ZjLmM6ICBpZiBhbnkgcG9ydHMgYXJlIGFscmVhZHkgb3BlbiwKKwkgICBkb24ndCB0cnkgdG8gb3BlbiBhbnkgbW9yZS4gIAorCSBUaGlzIG1lYW5zIHRoYXQgb25jZSBuZnNkIGlzIHJ1bm5pbmcKKwkgICAgIHJwYy5uZnNkICBYCisJIHdpbGwganVzdCBjaGFuZ2UgdGhlIG51bWJlciBvZiB0aHJlYWRzLCBub3QgdGhlCisJIHBvcnRzIGluIHVzZS4KKworQXV0aG9yOiBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KK0RhdGU6ICBNb24gQXVnICA3IDE0OjAxOjM1IEFFU1QgMjAwNgorCisgICAgUmVtb3ZlIHdhcm5pbmcgaWYgbmVpdGhlciAnc3luYycgb3IgJ2FzeW5jJyBwcmVzZW50LgorICAgIEFkZCB3YXJuaW5nIG9mIG5laXRoZXIgJ3N1YnRyZWVfY2hlY2snIG9yICdub19zdWJ0cmVlX2NoZWNrJyBwcmVzZW50LgorCQorY29tbWl0IDcxOTRkN2Q2MzIwNzM2YzE0ZjQwZDMxYzM3MzhkNDBmMzExOWVhZDUKK0F1dGhvcjogS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorRGF0ZTogICBTYXQgSnVsIDggMTA6MDE6NDAgMjAwNiArMTAwMAorCisgICAgVXNlIHVpZC9naWQgb2YgLTEgdG8gaW5kaWNhdGUgdGhlIGV4cG9ydCdzIGFub251aWQvYW5vbmdpZCBzaG91bGQgYmUgdXNlZAorICAgIAorICAgIEtlcm5lbCByb3V0aW5lIG5mc2Rfc2V0dXNlcigpIGluIGZzL25mc2QvYXV0aC5jIGNoZWNrcyBmb3IgdGhlCisgICAgdmFsdWUgLTEgYW5kIGRlZmF1bHRzIHRoZSBjcmVkZW50aWFsJ3MgZnN1aWQvZnNnaWQgdG8gdGhlCisgICAgY29ycmVjdCBhbm9udWlkL2Fub25naWQgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gZXhwb3J0LiAgV2Ugc2hvdWxkCisgICAgYmUgcGFzc2luZyB0aGlzIHZhbHVlICgtMSkgZG93biB3aGVuIGEgbmFtZSBtYXBwaW5nIGNhbm5vdCBiZSBmb3VuZC4KKyAgICBUaGFua3MgdG8gSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQGZpZWxkc2VzLm9yZz4gZm9yIHRoZSByZWZlcmVuY2UuCisgICAgCisgICAgU2lnbmVkLW9mZi1ieTogS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorICAgIEFja2VkLWJ5OiBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAZmllbGRzZXMub3JnPgorCitjb21taXQgYjA2MDRjNjIzZjdhOThjNjA2MWRmZjE5OTg4NzIyZDNhZTg0OGJkNworQXV0aG9yOiBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CitEYXRlOiAgIFNhdCBKdWwgOCAwOTo1ODowMyAyMDA2ICsxMDAwCisKKyAgICBDaGFuZ2Ugc3ZjZ3NzZF9MREZMQUdTIHRvIG1hdGNoIGdzc2RfTERGTEFHUworCitjb21taXQgOTk0MTRiZDNlZWNmOTNmMjNjMzc4ZDNiYjNkNDViYzk4ZjM2NGFiYworQXV0aG9yOiBOZWlsIEJyb3duIDxuZWlsYkBzdXNlLmRlPgorRGF0ZTogICBTYXQgSnVsIDggMDk6NDE6NTggMjAwNiArMTAwMAorCisgICAgRGlzYWJsZSBidWlsZGluZy9pbnN0YWxsaW5nIG1vdW50Lm5mcyBieSBkZWZhdWx0LgorICAgIAorICAgIG1vdW50Lm5mcyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCAndXNlcicgb3B0aW9uIGFuZCBzb21lIG90aGVycy4KKyAgICBUbyBtYWtlIGl0IHN1cHBvcnQgdGhpcyB3ZSBuZWVkIHRvIG1ha2UgaXQgc2V0dWlkLXJvb3QsIGFuZAorICAgIHNvbWUgc2VjdXJpdHkgaXNzZXMgbmVlZCB0byBiZSByZXNvbHZlZCBiZWZvcmUgdGhhdCBjYW4gYmUgZG9uZQorICAgIHNhZmVseS4KKworY29tbWl0IGIwYzNjYmZlZTcwMmMwMTlkYWIwYTIyNTU3YmJmMzhlMjRkZmNlZTEKK0F1dGhvcjogU3RldmUgRGlja3NvbiA8c3RldmVkQHJlZGhhdC5jb20+CitEYXRlOiAgIFNhdCBKdWwgOCAwOTozNTowMiAyMDA2ICsxMDAwCisKKyAgICBDYWxsIG5mc3N2Y192ZXJzYml0cyBiZWZvcmUgbmZzc3ZjX3NldGZkcworICAgIAorICAgIG5mc3N2Y192ZXJzYml0cygpIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIG5mc3N2Y19zZXRmZHMoKQorICAgIGZvciB0aGUgdmVyc2lvbiBwcm9jZXNzaW5nIHRvIHdvcmsgY29ycmVjdGx5CisKK2NvbW1pdCAyNmZmZjkxMWIyMTk0M2YyMGUzOTM3YWUzZjJkMjlhMTU3MmQyMzA5CitBdXRob3I6IE5laWwgQnJvd24gPG5laWxiQHN1c2UuZGU+CitEYXRlOiAgIFRodSBKdWwgNiAxMzowNToxMSAyMDA2ICsxMDAwCisKKyAgICBPbmx5IHVzZSAtcnBhdGggZm9yIEtlcmJlcm9zIGxpYnMgd2hlbiBhY3R1YWxseSBuZWVkZWQuCisgICAgCisgICAgQXZvaWQgdXNhZ2Ugb2YgLXJwYXRoIGlzIGdlbmVyYWxseSBzYWZlciwgYW5kIGlzIHJlcXVpcmVkIGJ5IERlYmlhbiBwb2xpY3kuCisKK2NvbW1pdCAyOGE3NjAzYjcxOWY4ZDM1YmYyMmZkMzAxOGI2MTBiNDg5ZmVjNzhmCitBdXRob3I6IE5laWwgQnJvd24gPG5laWxiQHN1c2UuZGU+CitEYXRlOiAgIFRodSBKdWwgNiAxMjoyODozMyAyMDA2ICsxMDAwCisKKyAgICBVc2UgNjU1MzQgaW5zdGVhZCBvZiAtMiBpbiBzdmNnc3NkX3Byb2MuYworICAgIAorICAgIGFzIHRoaXMgaXMgbW9yZSBjb25zaXN0YW50IGFjcm9zcyBhY2hpdGVjdHVyZXMuCisKK2NvbW1pdCA5MDRkZTkyMGVhNGRhM2FkNTYwNGM0MTdmMGQ3ODRmY2RhODNlZDJhCitBdXRob3I6IFNoYW5rYXIgQW5hbmQgPHNoYW5hbmRAbm92ZWxsLmNvbT4KK0RhdGU6ICAgVHVlIEp1bCA0IDA4OjUwOjU2IDIwMDYgLTA2MDAKKworICAgIFRoaXMgcGF0Y2ggYWRkcyBjb2RlIHRvIG5mc3N0YXQgdG8gcmVhZCAvcHJvYy9uZXQvcnBjL25mc2QgZm9yIG5mc3Y0IHNlcnZlciBzdGF0aXN0aWNzIGFuZCBwcmludCB0aGVtLgorICAgIAorICAgIFN1Ym1pdHRlZCBieTogU2hhbmthciBBbmFuZCA8c2hhbmFuZEBub3ZlbGwuY29tPgorCitjb21taXQgMjE3OWMxMTJiOWEzODZjYTNkNTFkMGUxOTM5MGRkZmFkZDc0NTAzMAorQXV0aG9yOiBTdGVpbmFyIEguIEd1bmRlcnNvbiA8c2Vzc2VAZGViaWFuLm9yZz4KK0RhdGU6ICAgV2VkIEp1bCA1IDE1OjU1OjQ1IDIwMDYgKzEwMDAKKworICAgIEZpeCB0eXBvcyBpbiB2YXJpb3VzIG1hbiBwYWdlcy4KKworY29tbWl0IDM0MTllMzc1MDBkZmQxOWNiMmMyNDYyNjBkYmQyYmMwZWU0NzA0ZDQKK0F1dGhvcjogU3RlaW5hciBILiBHdW5kZXJzb24gPHNlc3NlQGRlYmlhbi5vcmc+CitEYXRlOiAgIFdlZCBKdWwgNSAxNTo1MTozMCAyMDA2ICsxMDAwCisKKyAgICBVc2UgNjU1MzQgZm9yIGFub24gdWlkL2dpZCByYXRoZXIgdGhhbiAtMgorICAgIAorICAgIFRoaXMgaXMgbW9yZSBjb25zaXN0YW50IGFjcm9zcyBwbGF0Zm9ybXMuCisKK2NvbW1pdCA2NTczNWVlZjhhOTQ0MTkwMTI0NWY2MDQ3ZWRhZmM1MGYyZDk3Yzk3CitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBjaG9vay5tZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgV2VkIEp1bCA1IDEzOjM3OjIxIDIwMDYgKzEwMDAKKworICAgIFVwZGF0ZSBycGNkZWJ1ZyB0byBrbm93IGFib3V0IG5ldyAyLjYgZGVidWcgZmxhZ3MuICBBZGRlZAorICAgIGEgbWFucGFnZSBhbmQgaW5zdGFsbGVkIHJwY2RlYnVnIChpbiBzYmluZGlyKS4KKworY29tbWl0IDIzYjNhOWQwMjg0ZDc4Y2I2YmY5NmI4Y2Q0NGU5YTQ2NjJmZjYwYWUKK0F1dGhvcjogR3JlZyBCYW5rcyA8Z25iQGNob29rLm1lbGJvdXJuZS5zZ2kuY29tPgorRGF0ZTogICBXZWQgSnVsIDUgMTI6MjI6NDUgMjAwNiArMTAwMAorCisgICAgSWdub3JlIG5ldyBnZW5lcmF0ZWQgZmlsZXMuCisKK2NvbW1pdCA4OTA1M2YzZjQ0MGI2Mjk5MTFjYjk5NGEyOTNkNWJlNzNiYjc5YmY5CitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBjaG9vay5tZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgV2VkIEp1bCA1IDEyOjIwOjIwIDIwMDYgKzEwMDAKKworICAgIEFkZCBycXVvdGEuaCB0byBCVUlMVF9TT1VSQ0VTIHNvIHJxdW90YWQgYnVpbGRzIG9uIHRoZSBmaXJzdCB0cnkuCisKK2NvbW1pdCA2NmY5ZDgyNTFjOTIxMjRlNDZhMjA5YzQ3ZTVjMGY3ZDNhMGM0ZTZlCitBdXRob3I6IE5laWwgQnJvd24gPG5laWxiQHN1c2UuZGU+CitEYXRlOiAgIFdlZCBKdWwgNSAxMTowNjowOSAyMDA2ICsxMDAwCisKKyAgICBHZW5lcmF0ZSBycXVvdGFfeGRyLmMgYW5kIHJxdW90YS5oIGZyb20gcnF1b3RhLngKKyAgICAKKyAgICBycXVvdGFfc3ZjLmMgaXMgc3RpbGwgYnktaGFuZCBhcyBpdCBjb250YWlucyBhbG90IG9mIGV4dHJhcy4KKyAgICBUaGVzZSBzaG91bGQgcmVhbGx5IGJlIG1vdmVkIHRvIHJxdW90YV9zZXJ2ZXIuYworCitjb21taXQgOWY1YjQwYjdhNjhmZTBhMjY0ODU2NWVjYmQ0YjA4YmY2MDI4NzEzMAorQXV0aG9yOiBOZWlsIEJyb3duIDxuZWlsYkBzdXNlLmRlPgorRGF0ZTogICBXZWQgSnVsIDUgMTA6NDE6MDMgMjAwNiArMTAwMAorCisgICAgUmVtb3ZlIHNvbWUgZmlsZXMgdGhhdCBvbGQsIHVudXNlZCwgdW5uZWVkZWQuCisgICAgCisgICAgCWRlbGV0ZWQ6ICBzdXBwb3J0L2V4cG9ydC9rZXlzLmMKKyAgICAJZGVsZXRlZDogIHN1cHBvcnQvaW5jbHVkZS9ycGNkaXNwYXRjaC5oCisgICAgCWRlbGV0ZWQ6ICBzdXBwb3J0L2luY2x1ZGUvcnBjc2VjLmgKKyAgICAJZGVsZXRlZDogIHN1cHBvcnQvaW5jbHVkZS92ZXJzaW9uLmgKKyAgICAJZGVsZXRlZDogIHN1cHBvcnQvaW5jbHVkZS95cHVwZGF0ZS5oCisgICAgCWRlbGV0ZWQ6ICBzdXBwb3J0L25mcy9jbGllbnRzLmMKKyAgICAJZGVsZXRlZDogIHN1cHBvcnQvbmZzL2tleXRhYi5jCisgICAgCWRlbGV0ZWQ6ICBzdXBwb3J0L25mcy95cHVwZGF0ZV94ZHIuYworICAgIAlkZWxldGVkOiAgc3VwcG9ydC9ycGMvaW5jbHVkZS9NYWtlZmlsZS5hbQorICAgIAlkZWxldGVkOiAgdG9vbHMvcnBjZGVidWcvbmVhdF9pZGVhLmMKKyAgICAJZGVsZXRlZDogIHV0aWxzL21vdW50ZC9tb3VudF94ZHIuYworICAgIAlkZWxldGVkOiAgdXRpbHMvcnF1b3RhZC9wYXRobmFtZXMuaAorCitjb21taXQgZmJiMTYwMmJiZDM0Y2JlODlkZDU1Y2E2ZWFhYTE5NDMyMjM3ZGIxZAorQXV0aG9yOiBOZWlsIEJyb3duIDxuZWlsYkBzdXNlLmRlPgorRGF0ZTogICBXZWQgSnVsIDUgMTA6MzA6NTEgMjAwNiArMTAwMAorCisgICAgQXZvaWQgZXJyb3IgY3JlYXRpbmcgYW4gZXhpc3Rpbmcgc3ltbGluaworICAgIAorICAgIEp1c3QgcmVtb3ZlIHRoZSBsaW5rIGZpcnN0LgorCitjb21taXQgMGJjNzEwYTVhMmI2OTUwMzk2MTNhOTE3ZTAwOWRiYTM1NTJhYjFjYworQXV0aG9yOiBrd2NAY2l0aS51bWljaC5lZHUgPGt3Y0BjaXRpLnVtaWNoLmVkdT4KK0RhdGU6ICAgTW9uIEp1bCAzIDE4OjMzOjU0IDIwMDYgLTA0MDAKKworICAgIERvbid0IGRlcGVuZCBvbiBLZXJiZXJvcyBoZWFkZXJzIHdoZW4gY2hlY2tpbmcgbGlicnBjc2VjZ3NzIGluIGNvbmZpZ3VyZQorICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKyAgICAKKyAgICBPbGRlciB2ZXJzaW9ucyBvZiBNSVQgS2VyYmVyb3MgYXJlIG1pc3NpbmcgYW4gT0lEIGRlZmluaXRpb24sIGNhdXNpbmcKKyAgICB0aGUgY29uZmlndXJlIGNoZWNrcyBmb3IgbGlicnBjc2VjZ3NzIHRvIGZhaWwuICBXZSBzaG91bGRuJ3QgYmUgZGVwZW5kaW5nCisgICAgb24gdGhlaXIgbGlicmFyaWVzIGR1cmluZyB0aGUgY29uZmlndXJlLgorCitjb21taXQgNWJmYTEwYzk0YzQ0ZjA4MmRjMjExYTVmYjQzMWUyMjAyZWE5YmIzNQorQXV0aG9yOiBHcmVnIEJhbmtzIDxnbmJAbWVsYm91cm5lLnNnaS5jb20+CitEYXRlOiAgIFR1ZSBKdWwgNCAxODozMzo1NiAyMDA2ICsxMDAwCisKKyAgICBFbGltaW5hdGUgd2FybmluZ3MgZnJvbSBjb2RlIGdlbmVyYXRlZCBieSBycGNnZW4KKyAgICAKKyAgICAgLSB1bnVzZWQgdmFyaWFibGUgJ2J1ZicKKyAgICAgICAgLSBlbWl0IGEgZGVjbGFyYXRpb24gZm9yIGBidWYnIG9uIGRlbWFuZC4KKyAgICAgLSB1bnVzZWQgdmFyaWFibGUgJ2knCisgICAgICAgIC0gZGVjbGFyZSBpIGltbWVkaWF0ZWx5IGJlZm9yZSB1c2UKKyAgICAgLSB1bnVzZWQgdmFsdWUgZnJvbSBJWERSX1BVVF8KKyAgICAgICAgLSBjYXN0IHRvICh2b2lkKQorICAgICAtIHR5cGUtcHVubmVkIHBvaW50ZXIgcmVmZXJlbmNlCisgICAgICAgIC0gY2FzdCB0byAodm9pZCopIGZpcnN0IDotKAorCitjb21taXQgYWNhZTQ0NDI0NjYzNWVjMmNhODk5MGQ1M2U2ODVjOTA2MmQ3MzA5MQorQXV0aG9yOiBrd2NAY2l0aS51bWljaC5lZHUgPGt3Y0BjaXRpLnVtaWNoLmVkdT4KK0RhdGU6ICAgTW9uIEp1bCAzIDE4OjM0OjQzIDIwMDYgLTA0MDAKKworICAgIEhhbmRsZSBtYXBwaW5nIGZhaWx1cmUgZnJvbSBnZXRfaWRzLgorICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKyAgICAKKyAgICBUZW1wb3JhcnkgcGF0Y2ggdG8gZG8gZGVmYXVsdCBtYXBwaW5nIGlmIHdlIGdldCBhbiBlcnJvciB3aGlsZSB0cnlpbmcgdG8KKyAgICBtYXAgYSBnc3MgcHJpbmNpcGFsIHRvIHRoZSBhcHByb3ByaWF0ZSB1aWQvZ2lkLiAgVGhpcyBjdXJyZW50bHkgcmV0dXJucworICAgIGhhcmRjb2RlZCB2YWx1ZXMuICBUaGlzIG1heSBiZSBjb3JyZWN0LCBvciB3ZSBtYXkgbmVlZCB0byB0cnkgYW5kIGZpZ3VyZQorICAgIG91dCB0aGUgY29ycmVjdCB2YWx1ZXMgdG8gbWF0Y2ggdGhlIGFub251aWQvYW5vbmdpZCBmb3IgdGhlIGV4cG9ydC4KKworY29tbWl0IDFmMWIwNWE2NWVmM2RjNjU5N2M3YmMxZTJhMzhmMzhhZTk1YmYyMzAKK0F1dGhvcjoga3djQGNpdGkudW1pY2guZWR1IDxrd2NAY2l0aS51bWljaC5lZHU+CitEYXRlOiAgIE1vbiBKdWwgMyAxODozNDozOCAyMDA2IC0wNDAwCisKKyAgICBQcm9wZXJseSByZXBvcnQgZXJyb3JzIGluIHJlYWRsaW5lKCkgZnVuY3Rpb24KKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisgICAgCisgICAgQ2hhbmdlIG1lc3NhZ2UgcHJpb3JpdGllcyBmb3IgZXJyb3JzIGFuZCBkZWJ1ZyBtZXNzYWdlcy4KKworY29tbWl0IGVlNjY0ZmQyNDZkNzcwMTBhZjEzZmI1NTc0MDdjNjEyNzUyYTVlYTgKK0F1dGhvcjoga3djQGNpdGkudW1pY2guZWR1IDxrd2NAY2l0aS51bWljaC5lZHU+CitEYXRlOiAgIE1vbiBKdWwgMyAxODozNDozMyAyMDA2IC0wNDAwCisKKyAgICBDaGFuZ2UgZGVmYXVsdCBidWZmZXIgc2l6ZSBpbmNyZW1lbnQgZm9yIHJlYWRsaW5lKCkKKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisgICAgCisgICAgVGhlIHJlYWRsaW5lIHJvdXRpbmUgZXhwZWN0cyBtdWNoIHNtYWxsZXIgbWVzc2FnZXMgdGhhbiB3ZSBhcmUgcGFzc2luZy4KKyAgICBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5pdGlhbCBhbGxvY2F0aW9uIGFuZCBpbmNyZW1lbnQgdmFsdWUgZnJvbSAxMjgKKyAgICB0byAyMDQ4LiAgVGhpcyBzYXZlcyBtYW55IGNhbGxzIHRvIHJlYWxsb2MoKS4KKworY29tbWl0IDNkYTY5Y2U1YzRmYWM1Njc3ZTkxYWEyMGU2MDc1MGFiOGRlMmFiOTcKK0F1dGhvcjoga3djQGNpdGkudW1pY2guZWR1IDxrd2NAY2l0aS51bWljaC5lZHU+CitEYXRlOiAgIE1vbiBKdWwgMyAxODozNDoyNyAyMDA2IC0wNDAwCisKKyAgICBDbGVhbiB1cCB0aGUgcHJpbnRlcnIoKSBsb2dnaW5nIGZ1bmN0aW9uLgorICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKyAgICAKKyAgICBVcGRhdGUgdGhlIHByaW50ZXJyKCkgZnVuY3Rpb24gdG86CisgICAgCisgICAgMSkgRGV0ZXJtaW5lIHdoZXRoZXIgd2UnbGwgcHJpbnQgdGhlIG1lc3NhZ2UgYmVmb3JlIGdvaW5nIHRvIGFsbCB0aGUKKyAgICAgICB3b3JrIG9mIGZvcm1hdHRpbmcgaXQuCisgICAgMikgRG9uJ3QganVzdCB0b3NzIGF3YXkgbWVzc2FnZXMgdGhhdCBhcmUgdG9vIGxvbmcgZm9yIHRoZSBidWZmZXIuCisgICAgICAgUHJpbnQgd2hhdCB3ZSBjYW4gYW5kIGdpdmUgYW4gaW5kaWNhdGlvbiBvZiB0aGUgdHJ1bmNhdGlvbiB3aXRoCisgICAgICAgIi4uLiIgYXQgdGhlIGVuZC4KKyAgICAzKSBVc2UgYSBzaW5nbGUgYnVmZmVyIHJhdGhlciB0aGFuIHR3by4KKyAgICA0KSBNZXNzYWdlcyBlaXRoZXIgZ28gdG8gc3lzbG9nICh3aXRoIGxldmVsIEVSUikgb3Igc3RkZXJyLiAgRG9uJ3QKKyAgICAgICBzZW5kIHNvbWUgbWVzc2FnZXMgdG8gc3lzbG9nIGxldmVsIERFQlVHLgorCitjb21taXQgMGIyYTViNTc0YzdmZmQ5OWFhMzIyNmQzNmUxZDI2MTgyNjQwNTYyNQorQXV0aG9yOiBrd2NAY2l0aS51bWljaC5lZHUgPGt3Y0BjaXRpLnVtaWNoLmVkdT4KK0RhdGU6ICAgTW9uIEp1bCAzIDE4OjM0OjIxIDIwMDYgLTA0MDAKKworICAgIFVzZSBzZXRmc3VpZCgpIHJhdGhlciB0aGFuIHNldGV1aWQoKSB3aGlsZSBjcmVhdGluZyBjb250ZXh0cworICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKyAgICAKKyAgICBBcyBzdWdnZXN0ZWQgYnkgT2xhZiBLaXJjaCA8b2tpckBzdXNlLmRlPiwgdXNlIHNldGZzdWlkKCkgcmF0aGVyIHRoYW4KKyAgICBzZXRldWlkKCkgd2hlbiBjcmVhdGluZyBhIGdzcyBjb250ZXh0LiAgVGhpcyBwcmV2ZW50cyB1c2VycyBmcm9tIHVzaW5nCisgICAgY3JlZGVudGlhbHMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZW0sIHdoaWxlIGFsc28gcHJldmVudGluZyB0aGVtIGZyb20KKyAgICBkb2luZyB0aGluZ3MgbGlrZSBraWxsaW5nLCByZW5pY2luZywgb3IgY2hhbmdpbmcgdGhlIHByaW9yaXR5IG9mIHRoZQorICAgIGdzc2QgcHJvY2VzcyB3aGlsZSBpdCBpcyBwcm9jZXNzaW5nIHRoZSBjb250ZXh0IGNyZWF0aW9uLgorCitjb21taXQgMGY4OTllNmQ4NjI5OTRmZmI0MzdhZTczZTA4N2M0YTIxYWI1OTcyMworQXV0aG9yOiBrd2NAY2l0aS51bWljaC5lZHUgPGt3Y0BjaXRpLnVtaWNoLmVkdT4KK0RhdGU6ICAgTW9uIEp1bCAzIDE4OjM0OjE2IDIwMDYgLTA0MDAKKworICAgIExpbWl0IGFjcXVpcmVfY3JlZCBjYWxsIHRvIHRvIEtlcmJlcm9zIG9ubHkKKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisgICAgCisgICAgU3BlY2lmeSB0aGF0IHRoZSBhY3F1aXJlX2NyZWQgY2FsbCBzaG91bGQgb25seSBiZSBjb25jZXJuZWQgd2l0aCByZXR1cm5pbmcKKyAgICBLZXJiZXJvcyBjcmVkZW50aWFscyBzaW5jZSB0aGlzIGlzIEtlcmJlcm9zLW9ubHkgZnVuY3Rpb25hbGl0eS4KKworY29tbWl0IDM4MjliYjkwZTc2NGNkNzJjMDAwOWNiMzJhOGIzOWQwZmFiODlkODEKK0F1dGhvcjoga3djQGNpdGkudW1pY2guZWR1IDxrd2NAY2l0aS51bWljaC5lZHU+CitEYXRlOiAgIE1vbiBKdWwgMyAxODozNDoxMCAyMDA2IC0wNDAwCisKKyAgICBDaGVjayB0aGF0IHRoZSBnc3NhcGkgbGlicmFyeSBpcyB1c2FibGUgZWFybHkgb24uCisgICAgCisgICAgU2lnbmVkLW9mZi1ieTogS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorICAgIAorICAgIERvIGEgY2FsbCB0byBkZXRlcm1pbmUgbWVjaGFuaXNtcyBzdXBwb3J0ZWQgYnkgdGhlIGdzc2FwaSBsaWJyYXJ5IGVhcmx5LgorICAgIFRoaXMgYWxsb3dzIHVzIHRvIGRpc2NvdmVyIGVhcmx5IGluIGNhc2UgdGhlIGdzc2FwaSBsaWJyYXJ5IGlzIHNvbWVob3cKKyAgICBtaXNjb25maWd1cmVkLiAgV2UgY2FuIGJhaWwgb3V0IGVhcmx5IGFuZCBnaXZlIGEgbWVhbmluZ2Z1bCBtZXNzYWdlCisgICAgcmF0aGVyIHRoYW4gZ2V0dGluZyBlcnJvcnMgb24gZWFjaCBhdHRlbXB0IGF0IGEgY29udGV4dCBuZWdvdGlhdGlvbi4KKworY29tbWl0IDExOWMzZTlhYWZlODRjMGY3YzI4NDZjNDZhZDVlNmY1ZWVlY2UwZGEKK0F1dGhvcjoga3djQGNpdGkudW1pY2guZWR1IDxrd2NAY2l0aS51bWljaC5lZHU+CitEYXRlOiAgIE1vbiBKdWwgMyAxODozNDowNSAyMDA2IC0wNDAwCisKKyAgICBGaXggcHJvYmxlbXMgd2l0aCA2NC1iaXQgYmlnLWVuZGlhbiBtYWNoaW5lcworICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKyAgICAKKyAgICBDb3JyZWN0IHRoZSBkZWZpbml0aW9uIG9mIG1lY2hfdXNlZCBpbiB0aGUgZ3NzIGNvbnRleHQgdG8gdXNlIGdzc19PSURfZGVzYy4KKyAgICBUaGlzIGZpeGVzIHByb2JsZW1zIG9uIDY0LWJpdCBtYWNoaW5lcyB3aGVuIHJlZmVyZW5jaW5nIHRoZSBPSUQuCisgICAgCisgICAgQWxzbyB1cGRhdGVzIHdyaXRlX2J1ZmZlciBmdW5jdGlvbiB0byB1c2UgdV9pbnQgcmF0aGVyIHRoYW4gc2l6ZV90IHdoZW4KKyAgICBkb2luZyBjYWxjdWxhdGlvbnMuCisKK2NvbW1pdCBjM2YwNTU0OGQ3YjNkNTg2ZTdlZWJiZGRlOTMzOTYxN2U4ODUzMGYzCitBdXRob3I6IGt3Y0BjaXRpLnVtaWNoLmVkdSA8a3djQGNpdGkudW1pY2guZWR1PgorRGF0ZTogICBNb24gSnVsIDMgMTg6MzM6NTkgMjAwNiAtMDQwMAorCisgICAgRGVmaW5lIENGTEFHUyBmb3IgZ3NzX2NsbnRfc2VuZF9lcnIgY29tcGlsZQorICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKyAgICAKKyAgICBBZGQgQ0ZMQUdTIHRvIG1ha2Ugc3VyZSB3ZSBmaW5kIGFuZCB1c2UgdGhlIGNvcnJlY3QgZ3NzYXBpLmggd2hlbgorICAgIGJ1aWxkaW5nIGdzc19jbG50X3NlbmRfZXJyCisKK2NvbW1pdCA0ZTllZDA2ZjhmOGEwY2Q5ZjM0YTY4MzBjMGZmMTQzNDRhNTI4MDQyCitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgTW9uIEp1bCAzIDE1OjU5OjU0IDIwMDYgKzEwMDAKKworICAgIFVzZSBzb2NrbGVuX3Qgc29tZSBtb3JlIHRvIGF2b2lkIHdhcm5pbmdzLgorCitjb21taXQgNmM0MDIzNjgyMGZkYTg5NjBhZjg5MWY0MWFhOWQ1M2Y4YmJlNTBhMgorQXV0aG9yOiBHcmVnIEJhbmtzIDxnbmJAbWVsYm91cm5lLnNnaS5jb20+CitEYXRlOiAgIE1vbiBKdWwgMyAxNTozOTo0MSAyMDA2ICsxMDAwCisKKyAgICBGaXggd2FybmluZyBhYm91dCBwb2ludGVyIHNpZ25lZG5lc3MgZGlmZmVyaW5nLgorCitjb21taXQgM2JmNzAyYjFhOTE0YjM4NjcxMTdiNzRkNTE5YzU1ZmE2OGY0ZGMyOAorQXV0aG9yOiBHcmVnIEJhbmtzIDxnbmJAbWVsYm91cm5lLnNnaS5jb20+CitEYXRlOiAgIE1vbiBKdWwgMyAxNToxNzozNCAyMDA2ICsxMDAwCisKKyAgICBJbmNsdWRlIHRoZSByaWdodCBoZWFkZXIgdG8gZ2V0IHhtYWxsb2MoKSBkZWNsYXJhdGlvbi4KKworY29tbWl0IDk0MGM3YzMwNGQ0YTQzYzAwYzI3NTI5Y2RkZGM3Yzg3ZGI2ZWVmODcKK01lcmdlOiBiOTBkMjAxLi4uIGE1MDM4NDguLi4KK0F1dGhvcjogR3JlZyBCYW5rcyA8Z25iQG1lbGJvdXJuZS5zZ2kuY29tPgorRGF0ZTogICBNb24gSnVsIDMgMTQ6MjE6NDggMjAwNiArMTAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdtYXN0ZXInIG9mIGdpdDovL2xpbnV4LW5mcy5vcmcvbmZzLXV0aWxzCisKK2NvbW1pdCBiOTBkMjAxNTUxYWFhNzEyYzAxMWMzZDVkZTkwMGZhZDcxNGEyNmE2CitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgVHVlIEp1biAyNyAyMTozMDoxOCAyMDA2ICsxMDAwCisKKyAgICBDb21tZW50IG91dCB1bnVzZWQgdmFyaWFibGUuCisKK2NvbW1pdCAzM2JlYjQyZDNkMmNkMTNhODJkZGJiZGM0Mjc1ZDJhMDQ4MDMwYWUzCitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgVHVlIEp1biAyNyAyMToyMjo1OSAyMDA2ICsxMDAwCisKKyAgICBDb21tZW50IG91dCB0aGUgZGVjYWRlcy1vbGQgU0NDUyBpZCBzdHJpbmdzIGZyb20gdGhlIG9yaWdpbmFsIFN1bgorICAgIGRpc3RyaWJ1dGlvbi4gIFRoZXkgY2F1c2UgY29tcGlsZSB3YXJuaW5ncywgdGhlcmUgaXMgbm8gbG9uZ2VyIGFueQorICAgIHJlYXNvbiB0byB0cnkgdG8gYnVpbGQgdGhlbSBpbnRvIHRoZSBiaW5hcmllcywgYW5kIGdjYyBzZWVtcyB0byBiZQorICAgIGVsaWRpbmcgc29tZSBvZiB0aGVtIGFueXdheS4KKworY29tbWl0IDMxNzIwNjNlYWQ2Yjk5NjExZDA0OWE1OTkzODgwOGE2MzU4ZjQ4YTQKK0F1dGhvcjogR3JlZyBCYW5rcyA8Z25iQG1lbGJvdXJuZS5zZ2kuY29tPgorRGF0ZTogICBUdWUgSnVuIDI3IDIwOjU1OjA3IDIwMDYgKzEwMDAKKworICAgIERldGVjdCBpZiBnbGliYyBwcm92aWRlcyBzb2NrbGVuX3QgYW5kIHVzZSB0aGF0IGluc3RlYWQKKyAgICBvZiBpbnQgaW4gdGhvc2UgY2FzZXMgd2hpY2ggZ2VuZXJhdGUgY29tcGlsZSB3YXJuaW5ncywKKyAgICBlLmcuIHRoZSBsYXN0IGFyZ3VtZW50IG9mIHJlY3Zmcm9tKCkuCisKK2NvbW1pdCBhMDllZWIzNmMyYzQ1MTUxYjliYjg5ZjUwMTVkYTBjNTg0Nzk5NzE2CitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgVHVlIEp1biAyNyAyMDoyODowMiAyMDA2ICsxMDAwCisKKyAgICBSZXBsYWNlIHRoZSBkZXByZWNhdGVkIHNpZ2Jsb2NrKCkgd2l0aCBtb3JlIG1vZGVybgorICAgIHNpZ25hbCBmdW5jdGlvbnMgdG8gYXZvaWQgY29tcGlsZSB3YXJuaW5ncy4KKworY29tbWl0IDkzNjA4YTUyNjU1YWJmNWFjMjM0MDRjNGI1Y2MwNWZlNTc1YTljMDQKK0F1dGhvcjogR3JlZyBCYW5rcyA8Z25iQG1lbGJvdXJuZS5zZ2kuY29tPgorRGF0ZTogICBUaHUgSnVuIDIyIDE4OjAxOjEwIDIwMDYgKzEwMDAKKworICAgIEZpeCBhIG51bWJlciBvZiB0aGUgZWFzaWVyIGNvbXBpbGUgd2FybmluZ3M6IHVudXNlZCB2YXJpYWJsZXMsCisgICAgdW51c2VkIGxhYmVscywgY29uc3RuZXNzLCBzaWduZWRuZXNzLgorCitjb21taXQgYTA3MzQzZWUwZGE0ZjA5NzRhMjNiNjczYWUxYjBkNDgyYzc0MjZhMQorQXV0aG9yOiBHcmVnIEJhbmtzIDxnbmJAbWVsYm91cm5lLnNnaS5jb20+CitEYXRlOiAgIFRodSBKdW4gMjIgMTc6MzE6MjQgMjAwNiArMTAwMAorCisgICAgRGV0ZWN0IHByZXNlbmNlIG9mIG5mczRfc2V0X2RlYnVnKCkgaW4gbGlibmZzaWRtYXAgYW5kCisgICAgZG9uJ3QgYm90aGVyIGNhbGxpbmcgaXQgaWYgaXQncyBtaXNzaW5nLgorCitjb21taXQgZGNmY2I2NzdiMzk0NDNiNjM5MmRiMzIzNGZkNTA0OThiYzE1ODUwNworQXV0aG9yOiBHcmVnIEJhbmtzIDxnbmJAbWVsYm91cm5lLnNnaS5jb20+CitEYXRlOiAgIFRodSBKdW4gMjIgMTc6MTk6MTcgMjAwNiArMTAwMAorCisgICAgUmVtb3ZlIHVzZWxlc3MgbTQgcXVvdGluZyBhcm91bmQgYXJncyB0byBQS0dfQ0hFQ0tfTU9EVUxFUygpLgorCitjb21taXQgMjRkMzAzZmZhZTY4NjE5MmJkYTBhNTk5NmU4NTkwMjE5ZGNjODJlNworQXV0aG9yOiBHcmVnIEJhbmtzIDxnbmJAbWVsYm91cm5lLnNnaS5jb20+CitEYXRlOiAgIFRodSBKdW4gMjIgMTc6MTY6MTkgMjAwNiArMTAwMAorCisgICAgRG8gbTQgcXVvdGluZyBvZiBBQ19NU0dfRVJST1IoKSBhbmQgQUNfTVNHX1dBUk4oKSBhcworICAgIHRoZSBhdXRvY29uZiBwZW9wbGUgaW50ZW5kZWQuICBUaGlzIGF2b2lkcyBlcnJvcnMgaW4KKyAgICBhdXRvY29uZiBvbiBTTEVTMTAuCisKK2NvbW1pdCA2NmE2OTlkOTUzNzI3ZDNhOTkyY2MwOWVkNTMwNGI4M2Q2NjFhNzM3CitBdXRob3I6IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KK0RhdGU6ICAgVGh1IEp1biAyMiAxNjo1MTo0NCAyMDA2ICsxMDAwCisKKyAgICBBZGQgYSAuZ2l0aWdub3JlIGZpbGUgdG8gc3VwcHJlc3MgdGhlIGZpbGVzIGdlbmVyYXRlZAorICAgIGR1cmluZyBhdXRvZ2VuLCBjb25maWd1cmUgYW5kIGJ1aWxkLgorY29tbWl0IDQ5YjE2NGQ5NzhlZTYyNjZkZjdiYTBiZDMzNWNiMzQzMzdlN2MzODEKK0F1dGhvcjogU3RldmUgRGlja3NvbiA8U3RldmVEQHJlZGhhdC5jb20+CitEYXRlOiAgIE1vbiBKdWwgMyAwOTo1MjowMCAyMDA2ICsxMDAwCisKKyAgICBBbGxvdyBycGMubmZzZCB0byBzdXBwcmVzcyB0Y3Agb3IgdWRwLCBhbmQgbGlzdGVuIG9uIGEgc3BlY2lmaWMgYWRkcmVzcy4KKyAgICAKKyAgICAgLVQgICAgICAgLSB3aWxsIHN1cHByZXNzaW5nIGxpc3RlbmluZyBmb3IgVENQIGNvbm5lY3Rpb24uCisgICAgIC1VICAgICAgIC0gd2lsbCBzdXBwcmVzcyBVRFAKKyAgICAgLUggaG9zdCAgLSB3aWxsIG9ubHkgbGlzdGVuIG9uIHRoYXQgbG9jYWwgYWRkcmVzcworICAgICAtcCBwb3J0ICAtIHdpbGwgbGlzdGVuIG9uIHRoYXQgcG9ydC4KKyAgICAKKyAgICBUaGlzIHJlcXVpcmVzIGtlcm5lbCBwYXRjaGVzIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlIGluIDIuNi4xOSBhbmQgcG9zc2libHkgc29tZQorICAgIGVhcmxpZXIgdGVzdCBhbmQgdmVuZG9yIGtlcm5lbHMuCisKK2NvbW1pdCBmZGUyYWU3Nzk0MDQ3YTY5OGZlZWFmMTc5NjNkNjkwYTFlNjYwYTgwCitBdXRob3I6IFN0ZXZlIERpY2tzb24gPFN0ZXZlREByZWRoYXQuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDE1OjIzOjE5IDIwMDYgKzEwMDAKKworICAgIEFkZCBzdXBwb3J0IGZvciBzdXBwcmVzc2luZyBkaWZmZXJlbnQgTkZTIHZlcnNpb25zLgorICAgIAorICAgIGUuZy4gIC1OIDIKKyAgICBtZWFucyB0aGF0IE5GU3YyIHdvbid0IGJlIHN1cHBvcnRlZCwganVzdCB2MyBhbmQgdjQgKGlmIHRoZSBrZXJuZWwKKyAgICBzdXBwb3J0cyB0aGVtKS4KKworY29tbWl0IDA1MjNmZDUxM2M2YmFhOGRiZjQ1ZDFhN2FmZWEyMDQ0MjYyYWViM2QKK0F1dGhvcjogTmVpbCBCcm93biA8bmVpbGJAc3VzZS5kZT4KK0RhdGU6ICAgRnJpIEp1biAyMyAxNzoxMDo1NiAyMDA2ICsxMDAwCisKKyAgICBGdXJ0aGVyIGNvdmVyaXR5IHJlbGF0ZWQgY2xlYW51cHMuCisgICAgCisgICAgR3JlZyBCYW5rcyBzdWdnZXN0ZWQgc29tZSB2YXJpYXRpb25zLCBwYXJ0aWN1bGFybHkgaW1wcm92ZWQKKyAgICB1c2Ugb2YgeG1hbGxvYy94c3RyZHVwIGZ1bmN0aW9ucy4gIFRoYW5rcy4KKworY29tbWl0IDJlMDc1YTE2ZGE0OTYzZjU0Y2Q1NTY0MDNjYTllMTVhNjhkZTI3ZmQKK0F1dGhvcjogTmVpbCBCcm93biA8bmVpbGJAc3VzZS5kZT4KK0RhdGU6ICAgRnJpIEp1biAyMyAxNDozODozMyAyMDA2ICsxMDAwCisKKyAgICBGaXggdmFyaW91cyBpc3N1ZXMgZGlzY292ZXJlZCBieSBDb3Zlcml0eQorICAgIAorICAgIFRoYW5rcyB0byBNaWNoYWVsIEhhbGNyb3cgZm9yIGZpbmRpbmcgdGhlbS4KKworY29tbWl0IGZmNDIxODA5MzBhNDQ0Y2VhN2YxOWU1NWUyY2QyYmZlNmQzZjEwOGIKK0F1dGhvcjogTmVpbCBCcm93biA8bmVpbGJAc3VzZS5kZT4KK0RhdGU6ICAgRnJpIEp1biAyMyAxNDowNjowMCAyMDA2ICsxMDAwCisKKyAgICBGaXggY29tbWVudCBwYXJzaW5nIChhZ2FpbikKKyAgICAKKyAgICBCcnVjZSBGaWVsZHMgbm90aWNlZCB0aGF0IEkgYnJva2UgY29tbWVudCBwYXJzaW5nLi4uCisgICAgCisgICAgYXMgeHNraXAoKSBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSB4Z2V0dG9rKCksIHRoYXQgaXMgdGhlCisgICAgYmVzdCBwbGFjZSB0byBwdXQgeHNraXBjb21tZW50IGFuZCBzdGlsbCBtYWludGFpbiBwcm9wZXIKKyAgICBzZW1hbnRpY3Mgb2YgeHNraXAgYW5kIHhnZXR0b2suCisKK2NvbW1pdCBiZWM5Njg1NzhkOTdlYWJjNjNhZTRhMTJiZGViMmIzM2Y0MGJhZWM0CitBdXRob3I6IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CitEYXRlOiAgIFRodSBKdW4gMjIgMTI6NTE6MDQgMjAwNiAtMDQwMAorCisgICAgQ2hhbmdlIG1vdW50IGNvbmZpZ3VyZSBvcHRpb24gdG8gLS1lbmFibGUtbW91bnQKKyAgICAKKyAgICBDaGFuZ2UgdGhlIGNvbmZpZ3VyZSBvcHRpb24gZnJvbSAtLXdpdGgtbW91bnQgdG8gLS1lbmFibGUtbW91bnQuCisgICAgCisgICAgU2lnbmVkLW9mZi1ieTogQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGV2ZSBEaWNrc29uIDxzdGV2ZWRAcmVkaGF0LmNvbT4KKworY29tbWl0IGNlZWZmYzFmNzY0ODViNDA4NGIyYzYxZjRmZjNjNDBlNGY1MWMzYjgKK0F1dGhvcjogQW1pdCBHdWQgPGd1ZEBldGgubmV0PgorRGF0ZTogICBUaHUgSnVuIDIyIDEyOjQ5OjI0IDIwMDYgLTA0MDAKKworICAgIE1lcmdlIG5mc21vdW50LnggYW5kIG1vdW50LnggaW50byBtb3VudC54CisgICAgCisgICAgCisgICAgTWVyZ2UgdXRpbHMvbW91bnQvbmZzbW91bnQueCBhbmQgc3VwcG9ydC9leHBvcnQvbW91bnQueCBpbnRvIHN1cHBvcnQvZXhwb3J0L21vdW50LnguCisgICAgCisgICAgU2lnbmVkLW9mZi1ieTogQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KKyAgICBTaWduZWQtb2ZmLWJ5OiBTdGV2ZSBEaWNrc29uIDxzdGV2ZWRAcmVkaGF0LmNvbT4KKworY29tbWl0IGMyZGI0MWU4YWJiNmRkYzlkMDNhMGM5MWM2ZGIwNDNmYTBmODVhOGYKK0F1dGhvcjogTmVpbCBCcm93biA8bmVpbGJAc3VzZS5kZT4KK0RhdGU6ICAgRnJpIEp1biAyMyAxMzozNzowOCAyMDA2ICsxMDAwCisKKyAgICBUcnkgdG8gbWFrZSBzdXJlIHRoYXQgY2xpZW50aWQgdXNlZCBmb3IgTkZTdjQgaXMgcmVsaWFibGUuCisgICAgCisgICAgV2UgbmVlZCB0byBnaXZlIGFuIElQIGFkZHJlc3MgdG8gaWRlbnRpZnkgdGhpcyBjbGllbnQgdG8gdGhlCisgICAgc2VydmVyLgorICAgIFRoZSBjdXJyZW50IGNvZGUgZG9lcyBhIGdldGhvc3RieW5hbWUgb2YgdGhlIGhvc3RuYW1lLiBPbmUKKyAgICBzb21lIHN5c3RlbXMgdGhpcyByZXR1cm5zIDEyNy4wLjAuMSBvciBzaW1pbGFyLCB3aGljaCBpcyBub3QgdXNlZnVsLgorICAgIAorICAgIEluc3RlYWQsIHVzZSBnZXRzb2NrbmFtZSBvZiB0aGUgc29jayB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlcgorICAgIHRvIGNvbmZpcm0gdGhhdCB0aGUgc2VydmVyIGlzIHdvcmtpbmcuICBUaGlzIGdpdmVzIHRoZSBhZGRyZXNzIG9uIHRoZQorICAgIGludGVyZmFjZSB0aGF0IHdhcyBjaG9zZW4gdG8gdGFsayB0byB0aGF0IHNlcnZlciwgd2hpY2ggaXMgdGhlCisgICAgYmVzdCBhZGRyZXNzIHdlIGNhbiBmaW5kIChpZiB0aGVyZSBpcyBhIE5BVCBpbiB0aGUgd2F5LCBpdCBtaWdodAorICAgIHN0aWxsIG5vdCB3b3JrLCBidXQgaW4gdGhhdCBjYXNlIHRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvKS4KKworY29tbWl0IDExZDM0ZDExMTUzZGYxOTgxMDNhNTcyOTE5MzdlYTlmZjhiNzM1NmUKK0F1dGhvcjogR3JlZyBCYW5rcyA8Z25iQG1lbGJvdXJuZS5zZ2kuY29tPgorRGF0ZTogICBXZWQgSnVuIDE0IDIyOjQ4OjEwIDIwMDYgKzEwMDAKKworICAgIG11bHRpcGxlIHRocmVhZHMgZm9yIG1vdW50ZAorICAgIAorICAgIAorICAgIEhvdyBhYm91dCB0aGUgYXR0YWNoZWQgcGF0Y2ggYWdhaW5zdCBuZnMtdXRpbHMgdG90PyAgSXQKKyAgICBhZGRzIGEgLXQgb3B0aW9uIHRvIHNldCB0aGUgbnVtYmVyIG9mIGZvcmtlZCB3b3JrZXJzLgorICAgIERlZmF1bHQgaXMgMSB0aHJlYWQsIGkuZS4gdGhlIG9sZCBiZWhhdmlvdXIuCisgICAgCisgICAgSSd2ZSB2ZXJpZmllZCB0aGF0IHNob3dtb3VudCAtZSwgdGhlIE9nYXRhIG1vdW50IGNsaWVudCwKKyAgICBhbmQgYSByZWFsIG1vdW50IGZyb20gTGludXggYW5kIElSSVggYm94ZXMgd29yayB3aXRoIGFuZAorICAgIHdpdGhvdXQgdGhlIG5ldyBvcHRpb24uCisgICAgCisgICAgSSd2ZSB2ZXJpZmllZCB0aGF0IHlvdSBjYW4gbWFudWFsbHkga2lsbCBhbnkgb2YgdGhlIHdvcmtlcnMKKyAgICB3aXRob3V0IHRoZSBwb3J0bWFwIHJlZ2lzdHJhdGlvbiBnb2luZyBhd2F5LCB0aGF0IGtpbGxpbmcKKyAgICBhbGwgdGhlIHdvcmtlcnMgY2F1c2VzIHRoZSBtYW5hZ2VyIHByb2Nlc3MgdG8gd2FrZSB1cCBhbmQKKyAgICB1bnJlZ2lzdGVyLCBhbmQga2lsbGluZyB0aGUgbWFuYWdlciBwcm9jZXNzIGNhdXNlcyB0aGUKKyAgICB3b3JrZXJzIHRvIGJlIGtpbGxlZCBhbmQgcG9ydG1hcCB1bnJlZ2lzdGVyZWQuCisgICAgCisgICAgSSd2ZSB2ZXJpZmllZCB0aGF0IGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbGUgZGVzY3JpcHRvcnMKKyAgICBmb3IgdGhlIHVkcCBzb2NrZXQgYW5kIHRoZSB0Y3AgcmVuZGV6dm91cyBzb2NrZXQsIHRoYXQKKyAgICBjb25uZWN0aW9ucyBhcmUgYmFsYW5jZWQgYWNyb3NzIGFsbCB0aGUgd29ya2VycyBpZiBzZXJ2aWNlCisgICAgdGltZXMgYXJlIHN1ZmZpY2llbnRseSBsb25nLCBhbmQgdGhhdCBwZXJmb3JtYW5jZSBpcworICAgIGltcHJvdmVkIGJ5IHRoYXQgcGFyYWxsZWxpc20sIGF0IGxlYXN0IGZvciBzbWFsbCBudW1iZXJzCisgICAgb2YgdGhyZWFkcy4gIEZvciBleGFtcGxlLCB3aXRoIDYwIHBhcmFsbGVsIE1PVU5UIGNhbGxzCisgICAgYW5kIGEgdGVzdGluZyBwYXRjaCB0byBtYWtlIEROUyBsb29rdXBzIHRha2UgMTAwIG1pbGxpc2Vjb25kcworICAgIHRpbWUgdG8gcGVyZm9ybSBhbGwgbW91bnRzIChhdmVyYWdlZCBvdmVyIDUgcnVucykgaXM6CisgICAgCisgICAgbnVtCQllbGFwc2VkCisgICAgdGhyZWFkcwkJdGltZSAoc2VjKQorICAgICAtLS0tLS0JCS0tLS0tLS0tLS0KKyAgICAxCQkxMy4xMjUKKyAgICAyIAkJIDYuODU5CisgICAgMwkJIDQuODM2CisgICAgNAkgCSAzLjg0MQorICAgIDUJCSAzLjMwMworICAgIDYJCSAzLjEwMAorICAgIDcJCSAzLjA3OAorICAgIDgJCSAzLjAxOAorICAgIAorICAgIEdyZWcuCisgICAgLS0KKyAgICBHcmVnIEJhbmtzLCBSJkQgU29mdHdhcmUgRW5naW5lZXIsIFNHSSBBdXN0cmFsaWFuIFNvZnR3YXJlIEdyb3VwLgorICAgIEkgZG9uJ3Qgc3BlYWsgZm9yIFNHSS4KKworY29tbWl0IGRiOTZkMDU2NTc4MzM4ZGQxYmIwMzcxZGM4NDYzODk3M2MxODdlYzYKK0F1dGhvcjogTmVpbCBCcm93biA8bmVpbGJAc3VzZS5kZT4KK0RhdGU6ICAgRnJpIEp1biAxNiAxMzoxNjowOSAyMDA2ICsxMDAwCisKKyAgICBSZW1vdmUgc29tZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBzaG91bGRuJ3QgYmUgaW4gJ2dpdCcuCisgICAgCisgICAgCWRlbGV0ZWQ6ICBjb21waWxlCisgICAgCWRlbGV0ZWQ6ICBjb25maWcuZ3Vlc3MKKyAgICAJZGVsZXRlZDogIGNvbmZpZy5zdWIKKyAgICAJZGVsZXRlZDogIGRlcGNvbXAKKyAgICAJZGVsZXRlZDogIGluc3RhbGwtc2gKKyAgICAJZGVsZXRlZDogIGx0bWFpbi5zaAorICAgIAlkZWxldGVkOiAgbWlzc2luZworCitjb21taXQgODJiNTMxODhhYWZmYWQwZTIzNzQ2MWY4ZjEyNzQ3OTQxNjZmZWIzYQorQXV0aG9yOiBOZWlsIEJyb3duIDxuZWlsYkBzdXNlLmRlPgorRGF0ZTogICBGcmkgSnVuIDE2IDEzOjA5OjI2IDIwMDYgKzEwMDAKKworICAgIEFkZCBzdXBwb3J0IHRvIGF1dG8tZ2VuZXJhdGUgbmZzbW91bnQqIGZpbGVzIGZvciBuZXcgbmZzLm1vdW50IHByb2dyYW0KKworY29tbWl0IDRlMmJhZTc5NWU1ZWFmOTkyMmYwYjk2NmFiNWRmNjQ5OTRjODM2YTIKK0F1dGhvcjogQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KK0RhdGU6ICAgTW9uIEp1biAxMiAxOTowODoyNyAyMDA2IC0wNDAwCisKKyAgICBNb3ZlIE5GUyBtb3VudCBjb2RlIGZyb20gdXRpbC1saW51eCB0byBuZnMtdXRpbHMgLSBwYXJ0IDIKKyAgICAKKyAgICBBZGRzIHRoZSBzdXBwb3J0IGZ1bmN0aW9ucyBuZWVkZWQgZm9yIG1vdW50IGFuZCB1bW91bnQuIFRoaXMKKyAgICBmdW5jdGlvbmFsaXR5IHdpbGwgc29tZWRheSBiZSBhdmFpbGFibGUgaW4gdGhlIGZvcm0gb2Ygc2hhcmVkIG1vdW50CisgICAgbGlicmFyeS4KKyAgICAKKyAgICBTaWduZWQtb2ZmLWJ5OiBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorICAgIFNpZ25lZC1vZmYtYnk6IFN0ZXZlIERpY2tzb24gPHN0ZXZlZEByZWRoYXQuY29tPgorCitjb21taXQgYTA1MjBmYTFhNDFiZDMzODE1YjMzMWI2NjBiNDU0NWYyNzIzNDk1YworQXV0aG9yOiBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorRGF0ZTogICBNb24gSnVuIDEyIDE5OjA2OjM2IDIwMDYgLTA0MDAKKworICAgIE1vdmUgTkZTIG1vdW50IGNvZGUgZnJvbSB1dGlsLWxpbnV4IHRvIG5mcy11dGlscyAtIHBhcnQgMQorICAgIAorICAgIEFkZHMgdGhlIG1vdW50IGRpcmVjdG9yeSBhbmQgdGhlIGNvZGUgdG8gbW91bnQgYW5kIHVtb3VudCB0aGUgTkZTIGZpbGUgc3lzdGVtLgorICAgIAorICAgIFNpZ25lZC1vZmYtYnk6IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CisgICAgU2lnbmVkLW9mZi1ieTogU3RldmUgRGlja3NvbiA8c3RldmVkQHJlZGhhdC5jb20+CisKKzIwMDYtMDYtMDUgTmVpbEJyb3duIDxuZWlsYkBzdXNlLmRlPgorCS0gUmVtb3ZlIGRlYmlhbi8gYXQgcmVxdWVzdCBvZiBEZWJpYW4gbWFpbnRhaW5lciAiU3RlaW5hciBILiBHdW5kZXJzb24iIDxzZXNzZUBkZWJpYW4ub3JnPgorCS0gZml4X2V4cG9ydGZzX3dpdGhfbXVsdGlwbGVfbWF0Y2hlcy5kaWZmOiBGaXhlcyBhIHByb2JsZW0gd2l0aCBleHBvcnRmcyAtbworCSAgYW5kIG11bHRpcGxlIGVudHJpZXMgb2YgdGhlIHNhbWUgdHlwZSBmb3IgdGhlIHNhbWUgcGF0Y2ggdGhhdCBtYXRjaGVzCisJICBhIGdpdmVuIGNsaWVudC4gVGhlIGVudGlyZSByYXRpb25hbGUgYW5kIHByb2JsZW0gZGVzY3JpcHRpb24gY2FuIGJlIGZvdW5kCisJICBhdCBodHRwOi8vYnVncy5kZWJpYW4ub3JnLzI0NTQ0OSAoZnVtaWhpa28ga2FrdW1hIDxrYWtteUBtdmguYmlnbG9iZS5uZS5qcD4pCisgICAgICAgIC0gZXNjYXBlIGhhc2hlcyBpbiBleHBvcnRzCisJICBNYWtlcyBzdXJlIGFueSAjIHNpZ25zIGluIHRoZSBwcmludGVkLW91dCBleHBvcnRzIGZpbGUgYXJlCisJICBlc2NhcGVkIChhcyB3aXRoIHF1b3Rlcywgc3BhY2VzLCBldGMuKSwgc28gdGhleSB3b24ndCBiZSB0cmVhdGVkCisJICBhcyBhIGNvbW1lbnQgd2hlbiB0aGV5J3JlIHJlYWQgYmFjayBpbiBhZ2Fpbi4KKwkgICAgICAgICJTdGVpbmFyIEguIEd1bmRlcnNvbiIgPHNlc3NlQGRlYmlhbi5vcmc+CisJLSBPbmx5IHRyZWF0ICcjJyBhcyBzdGFydGluZyBhIGNvbW1lbnQgd2hlbiBhdCB0aGUgc3RhcnQgb2YgYQorCSAgdG9rZW4sIG90aGVyd2lzZSAnIycgaW4gZmlsZW5hbWVzIGNhbm5vdCBiZSByZWFkLgorCSAgICAgICAgTmVpbEJyb3duCisJLSBkb2N1bWVudCBzeW5jIG9wdGlvbjoKKwkgIERvY3VtZW50IHRoZSAnc3luYycgb3B0aW9uIGluIHRoZSBleHBvcnRzKDUpIG1hbiBwYWdlIC0tIEFUTQorCSAgb25seSB0aGUgJ2FzeW5jJyBvcHRpb24gaXMgZG9jdW1lbnRlZCwgd2hpY2ggaXMgbm90IHZlcnkKKwkgIHN5bW1ldHJpYy4gOi0pICAiU3RlaW5hciBILiBHdW5kZXJzb24iIDxzZXNzZUBkZWJpYW4ub3JnPgorCS0gbW91bnRkIHN0YXRlIGRpcmVjdG9yeToKKwkgIExldCB0aGUgdXNlciBzZWxlY3QgKHZpYSBhIG5ldyBwYXJhbWV0ZXIpIHRoZSBwYXRoIHRvIHRoZSBORlMKKwkgIHN0YXRlIGRpcmVjdG9yeSBmb3IgbW91bnRkLCB0byBtYXRjaCB0aGUgc3RhdGQgZnVuY3Rpb25hbGl0eS4KKwkgICAgICAgICAiU3RlaW5hciBILiBHdW5kZXJzb24iIDxzZXNzZUBkZWJpYW4ub3JnPgorCS0gZml4IG5oZnNydW4gc2lnbmFsOgorCSAgbmhmc3J1biBpcyBzdXBwb3NlZCB0byBiZSBhYmxlIHRvIGJlIHNpZ25hbGxlZCB3aXRoIFNJR1VTUjEsIGJ1dAorCSAgdGhlIHNpZ25hbCB0cmFwcGVkIGlzIG51bWJlciAzMCwgd2hpY2ggaXMgc29tZXRoaW5nIGVsc2UKKwkgIGVudGlyZWx5IChTSUdQV1IpLiBUaGlzIHBhdGNoIHNpbXBseSBjaGFuZ2VzIGl0IHRvIHNheSAiVVNSMSIsCisJICB3aGljaCBnZXRzIGl0IHJpZ2h0IG5vIG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBpcy4KKwkgICAgICAgICAiU3RlaW5hciBILiBHdW5kZXJzb24iIDxzZXNzZUBkZWJpYW4ub3JnPgorCS0gTWlub3IgbWFuIHBhZ2UgdGlkeSB1cAorCQorMjAwNi0wNC0xMiBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+CisJUmVtb3ZlICoqL01ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmUsIGFuZAorCSBzdXBwb3J0L2luY2x1ZGUvY29uZmlnLmguaW4gZnJvbSBzb3VyY2UgY29udHJvbAorCVRoZXNlIGFyZSBhdXRvIGF1dG9nZW5lcmF0ZWQgYnkKKwkgIGFjbG9jYWwgLUkgYWNsb2NhbCA7IGF1dG9oZWFkZXIgOyBhdXRvbWFrZSA7IGF1dG9jb25mCisJCisyMDA2LTA0LTEyIE5laWxCcm93biA8bmVpbGJAc3VzZS5kZT4KKwl1dGlscy9zdGF0ZC9ybXRjYWxsLmM6IHVzZSBIQVZFX0lGQUREUlNfSCB0byBjb250cm9sIGNvbXBpbGF0aW9uCisJb2YgY29kZSB1c2luZyBpZmFkZHJzLmgKKwljb25maWd1cmUuaW46IHRlc3QgZm9yIHByZXNlbnQgb2YgaWZhZGRycy5oCisKKwlPbGQgZ2xpYmMncyBkb24ndCBoYXZlIGlmYWRkcnMuaAorCQorMjAwNi0wNi0xMiBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorCUFkZGVkIHRoZSBtb3VudCBmdW5jdGlvbmFsaXR5IGZyb20gdXRpbC1saW51eC4KKwlBZGRlZCAtLXdpdGhvdXQtbW91bnQgY29uZmlndXJlIG9wdGlvbi4KKworMjAwNi0wNC0xMiBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+CisJU2V0IHZlcnNpb24gdG8gMS4wLjgsIAorCWFjbG9jYWwgLUkgYWNsb2NhbCA7IGF1dG9oZWFkZXIgOyBhdXRvbWFrZSA7IGF1dG9jb25mCisKKzIwMDYtMDQtMTAgTmVpbEJyb3duIDxuZWlsYkBzdXNlLmRlPgorCVZhcmlvdXMgcGFyYW5vaWEgY2hlY2tzOgorCWdzc2RfcHJvYy5jOiBwYXNzIG1heF9maWVsZCBzaXplcyB0byBzc2NhbmYgdG8gYXZvaWQgYnVmZmVyCisJICBvdmVyZmxvdworCXN2Y2dzc2RfcHJvYy5jOiByYW5nZV9jaGVjayBuYW1lLmxlbmd0aCwgdG8gZW5zdXJlIG5hbWUubGVuZ3RoKzEKKwkgIGRvZXNuJ3Qgd3JhcAorCWlkbWFwZC5jKG5mc2RjYik6IG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFkIGJlZm9yZQorCSB6ZXJvaW5nIHRoZSBsYXN0IGJ5dGUgdGhhdCB3YXMgcmVhZCwgb3RoZXJ3aXNlIG1lbW9yeSBjb3JydXB0aW9uCisJIGlzIHBvc3NpYmxlLgorCisJRm91bmQgYnkgU3VTRSBzZWN1cml0eSBhdWRpdC4KKwkKKzIwMDYtMDQtMTAgIktldmluIENvZmZtYW4iIDxrd2NAY2l0aS51bWljaC5lZHU+CisJQ2hlY2sgZm9yIHN1ZmZpY2llbnQgdmVyc2lvbiBvZiBsaWJycGNzZWNnc3MgYW5kIGxpYmdzc2FwaQorCWluIGNvbmZpZ3VyZS5pbgorCisyMDA2LTA0LTEwICJLZXZpbiBDb2ZmbWFuIiA8a3djQGNpdGkudW1pY2guZWR1PgorCVVwZGF0ZSBhY2xvY2FsL3RjcC13cmFwcGVycy5tNCB0byBkZWZpbmUgSEFWRV9MSUJXUkFQIGFuZAorCUhBVkVfVENQX1dSQVBQRVJTIGFzIGFwcHJvcHJpYXRlLgkKKworMjAwNi0wNC0xMCBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+CisJQWRkIGNoZWNraW5nIGZvciBpbm5ldGdyIGJhY2sgdG8gY29uZmlndXJlLmluCisJCisyMDA2LTA0LTEwIGt3Y0BjaXRpLnVtaWNoLmVkdQorCVVwZGF0ZSBjYWxscyB0byBnc3NfZXhwb3J0X2x1Y2lkX3NlY19jb250ZXh0KCkKKwkKKwlDaGFuZ2UgdGhlIGNhbGxzIHRvIGdzc19leHBvcnRfbHVjaWRfc2VjX2NvbnRleHQoKSB0byBtYXRjaCB0aGUgY29ycmVjdGVkCisJaW50ZXJmYWNlIGRlZmluaXRpb24gaW4gbGliZ3NzYXBpLTAuOS4KKwkKKzIwMDYtMDQtMTAga3djQGNpdGkudW1pY2guZWR1CisJUGx1ZyBtZW1vcnkgbGVha3MgaW4gc3ZjZ3NzZAorCQorCVZhcmlvdXMgbWVtb3J5IGxlYWtzIGluIHRoZSBzdmNnc3NkIGNvbnRleHQgcHJvY2Vzc2luZyBhcmUgZWxpbWluYXRlZC4KKwkKKzIwMDYtMDQtMTAga3djQGNpdGkudW1pY2guZWR1CisJRml4IG1lbW9yeSBsZWFrIG9mIHRoZSBBVVRIIHN0cnVjdHVyZSBvbiBjb250ZXh0IG5lZ290aWF0aW9ucworCQorCUZyZWUgQVVUSCBzdHJ1Y3R1cmUgYWZ0ZXIgY29tcGxldGluZyBjb250ZXh0IG5lZ290aWF0aW9uIGFuZCBzZW5kaW5nCisJY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsLgorCQorMjAwNi0wNC0xMCBrd2NAY2l0aS51bWljaC5lZHUKKwlGaXggc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oLmluIHN1Y2ggYXMgd291bGQgYmUgZG9uZSBiZSBydW5uaW5nIGF1dG9oZWFkZXIuCisJCisyMDA2LTAzLTI4IE5laWxCcm93biA8bmVpbGJAc3VzZS5kZT4KKwkxLjAuOC1wcmUzLCBhY2xvY2FsL2F1dG9jb25mL2F1dG9tYWtlCisJCisyMDA2LTAzLTI4IGt3Y0BjaXRpLnVtaWNoLmVkdQorCVVzZSBQS0dDT05GSUcgdG8gbG9jYXRlIGdzc2FwaSBhbmQgcnBjc2VjZ3NzIGhlYWRlciBmaWxlcworCQorCUluc3RlYWQgb2YgaGF2aW5nIHNlcGFyYXRlIGNvcGllcyBvZiB0aGUgZ3NzYXBpIGFuZCBycGNzZWNnc3MKKwloZWFkZXIgZmlsZXMsIG9yIGRlcGVuZGluZyBvbiB0aGUgS2VyYmVyb3MgZ3NzYXBpIGhlYWRlciwKKwlsb2NhdGUgdGhlIGhlYWRlcnMgbm93IGluc3RhbGxlZCB3aXRoIHRoZSBsaWJnc3NhcGkgYW5kIGxpYnJwY3NlY2dzcworCWxpYnJhcmllcy4KKwkKKwlSZW1vdmUgbG9jYWwgY29waWVzIG9mIHRoZSBnc3NhcGkgYW5kIHJwY3NlY2dzcyBoZWFkZXIgZmlsZXMuCisJCisJVGhpcyBkZXBlbmRzIG9uIHRoZSBjb25maWd1cmVfdXNlX2F1dG90b29scyBwYXRjaC4KKwkKKzIwMDYtMDMtMjgga3djQGNpdGkudW1pY2guZWR1CisJQWRkIGRlYnVnZ2luZyB0byBiZXR0ZXIgZGV0ZWN0IG5lZ290aWF0aW9uIG9mIGVuY3R5cGUgbm90IHN1cHBvcnRlZCBieSBrZXJuZWwKKwkKKwlQcmludCBkZWJ1Z2dpbmcgbWVzc2FnZSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGVuY3J5cHRpb24ga2V5cyBiZWluZyBzZW50CisJZG93biB0byB0aGUga2VybmVsLiAgVGhpcyBzaG91bGQgbWFrZSBpdCBlYXNpZXIgdG8gZGV0ZWN0IGNhc2VzIHdoZXJlCisJdW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiB0eXBlcyBhcmUgYmVpbmcgbmVnb3RpYXRlZC4KKwkocmVhbGx5IHRoaXMgdGltZSkKKwkKKzIwMDYtMDMtMjgga3djQGNpdGkudW1pY2guZWR1CisJCisJRG9uJ3QgY2xvc2UgYW5kIHJlb3BlbiBhbGwgcGlwZXMgb24gZXZlcnkgRE5PVElGWSBzaWduYWwuCisJCisJRnJvbTogVmluY2UgQnVzYW0gPHZidXNhbUBnb29nbGUuY29tPgorCVNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwkKKwlEb24ndCB1bm5lY2Vzc2FyaWx5IGNsb3NlIGFuZCByZS1vcGVuIGFsbCBwaXBlcyBhZnRlciBldmVyeSBETk9USUZZCisJc2lnbmFsLiAgVGhlc2UgdW5uZWNlc3NhcnkgY2xvc2VzIHdlcmUgdHJpZ2dlcmluZyBhIGtlcm5lbCBPb3BzLgorCU9yaWdpbmFsIHBhdGNoIG1vZGlmaWVkIHRvIGNvcnJlY3Qgc2VnZmF1bHQgd2hlbiB1bm1vdW50aW5nIGxhc3QKKwlORlN2NCBtb3VudC4KKwkKKzIwMDYtMDMtMjgga3djQGNpdGkudW1pY2guZWR1CisJQWRkIG9wdGlvbiB0byBzcGVjaWZ5IGRpcmVjdG9yeSB0byBzZWFyY2ggZm9yIGNyZWRlbnRpYWxzIGNhY2hlIGZpbGVzCisJCisJCisJRnJvbTogVmluY2UgQnVzYW0gPHZidXNhbUBnb29nbGUuY29tPgorCVNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwkKKwlBZGQgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBzcGVjaWZ5IHdoaWNoIGRpcmVjdG9yeSBzaG91bGQgYmUgc2VhcmNoZWQKKwl0byBmaW5kIGNyZWRlbnRpYWxzIGNhY2hlcy4KKwkocmVhbGx5IHRoaXMgdGltZSkJCisJCisyMDA2LTAzLTI4IGt3Y0BjaXRpLnVtaWNoLmVkdQorCU11c3Qgc3RpbGwgdXNlIGtub3dsZWRnZSBvZiB0aGUgZ2x1ZSBjb250ZXh0IGZvciBwcmUtMS40IHZlcnNpb25zIG9mIE1JVCBrcmI1CisJCisJV2UgbmVlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCBrcmI1IGNvbnRleHQgcG9pbnRlciBmb3IKKwlvbGRlciAocHJlLTEuNCkgdmVyc2lvbnMgb2YgTUlUIEtlcmJlcm9zLiAgV2UgZ2V0IGEgcG9pbnRlciB0bworCXRoZSBnc3MgZ2x1ZSdzIGNvbnRleHQuICBHZXQgdGhlIHJpZ2h0IHBvaW50ZXIgYmVmb3JlIGFjY2Vzc2luZworCXRoZSBjb250ZXh0IGluZm9ybWF0aW9uLgorCShyZWFsbHkgdGhpcyB0aW1lKQorCQorMjAwNi0wMy0yOCBrd2NAY2l0aS51bWljaC5lZHUKKwkKKwlSZW1vdmUgdW51c2VkIGdyb3VwcyB2YXJpYWJsZSBmcm9tIGdldF9pZHMoKSB3aGljaCB3YXMgY2F1c2luZyBhIGNvbXBpbGVyIHdhcm5pbmcuCisJKHJlYWxseSB0aGlzIHRpbWUpCisJCisyMDA2LTAzLTI4IGt3Y0BjaXRpLnVtaWNoLmVkdQorCVVwZGF0ZSBrcmI1IGNvZGUgdG8gdXNlIGdsdWUgcm91dGluZSBsdWNpZCBjb250ZXh0IGZ1bmN0aW9ucworCQorCQorCQorCVRoZSBnc3NkIGNvZGUgc2hvdWxkIG5vdCBrbm93IGFib3V0IHRoZSBnbHVlIGxheWVyJ3MgY29udGV4dCBzdHJ1Y3R1cmUuCisJQSBwcmV2aW91cyBwYXRjaCBhZGRlZCBnc3NfZXhwb3J0X2x1Y2lkX3NlY19jb250ZXh0KCkgYW5kCisJZ3NzX2ZyZWVfbHVjaWRfc2VjX2NvbnRleHQoKSBmdW5jdGlvbnMgdG8gdGhlIGdzc2FwaSBnbHVlIGxheWVyLgorCVVzZSB0aGVzZSBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gY2FsbGluZyBkaXJlY3RseSB0byB0aGUgS2VyYmVyb3MKKwlnc3NhcGkgY29kZSAod2hpY2ggcmVxdWlyZXMgdGhlIEtlcmJlcm9zIGNvbnRleHQgaGFuZGxlIHJhdGhlcgorCXRoYW4gdGhlIGdsdWUncyBjb250ZXh0IGhhbmRsZSkuCisJCisJKHJlYWxseSB0aGlzIHRpbWUpCisJCisyMDA2LTAzLTI4IGt3Y0BjaXRpLnVtaWNoLmVkdQorCQorCVNlcGFyYXRlIG91dCBjb250ZXh0IGhhbmRsaW5nIGNvZGUgZm9yIE1JVCBLZXJiZXJvcyBhbmQgU1BLTTMKKwlpbnRvIHRoZWlyIG93biBmaWxlLgorCShSZWFsbHkgdGhpcyB0aW1lKQorCQorMjAwNi0wMy0yOCBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisJVXNlci1zZWxlY3RhYmxlIGlkbWFwcGluZyBjYWNoZSBsaWZldGltZQorCQorCVJlYWQgYW5kIHByb2Nlc3MgbmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBDYWNoZS1FeHBpcmF0aW9uLCBhbmQgdXNlCisJdGhlIHZhbHVlIHRvIGRldGVybWluZSBob3cgbG9uZyBpZG1hcHBpbmcgZW50cmllcyBhcmUgY2FjaGVkLgorCShSZWFsbHkgdGhpcyB0aW1lKQorCQorMjAwNi0wMy0yNyBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+CisJMS4wLjgtcmMzCisKKzIwMDYtMDMtMjcga3djQGNpdGkudW1pY2guZWR1CisJQWRkIGRlYnVnZ2luZyB0byBiZXR0ZXIgZGV0ZWN0IG5lZ290aWF0aW9uIG9mIGVuY3R5cGUgbm90IHN1cHBvcnRlZCBieSBrZXJuZWwKKworCVByaW50IGRlYnVnZ2luZyBtZXNzYWdlIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZW5jcnlwdGlvbiBrZXlzIGJlaW5nIHNlbnQKKwlkb3duIHRvIHRoZSBrZXJuZWwuICBUaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBkZXRlY3QgY2FzZXMgd2hlcmUKKwl1bnN1cHBvcnRlZCBlbmNyeXB0aW9uIHR5cGVzIGFyZSBiZWluZyBuZWdvdGlhdGVkLgorCQorMjAwNi0wMy0yNworCURvbid0IGNsb3NlIGFuZCByZW9wZW4gYWxsIHBpcGVzIG9uIGV2ZXJ5IEROT1RJRlkgc2lnbmFsLgorCQorCURvbid0IHVubmVjZXNzYXJpbHkgY2xvc2UgYW5kIHJlLW9wZW4gYWxsIHBpcGVzIGFmdGVyIGV2ZXJ5IEROT1RJRlkKKwlzaWduYWwuICBUaGVzZSB1bm5lY2Vzc2FyeSBjbG9zZXMgd2VyZSB0cmlnZ2VyaW5nIGEga2VybmVsIE9vcHMuCisJT3JpZ2luYWwgcGF0Y2ggbW9kaWZpZWQgdG8gY29ycmVjdCBzZWdmYXVsdCB3aGVuIHVubW91bnRpbmcgbGFzdAorCU5GU3Y0IG1vdW50LgorCQorMjAwNi0wMy0yNworCUFkZCBvcHRpb24gdG8gc3BlY2lmeSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBjcmVkZW50aWFscyBjYWNoZSBmaWxlcworCQorCUFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHNwZWNpZnkgd2hpY2ggZGlyZWN0b3J5IHNob3VsZCBiZSBzZWFyY2hlZAorCXRvIGZpbmQgY3JlZGVudGlhbHMgY2FjaGVzLgorCQorMjAwNi0wMy0yNyBrd2NAY2l0aS51bWljaC5lZHUKKwlNdXN0IHN0aWxsIHVzZSBrbm93bGVkZ2Ugb2YgdGhlIGdsdWUgY29udGV4dCBmb3IgcHJlLTEuNCB2ZXJzaW9ucyBvZiBNSVQga3JiNQorCQorCVdlIG5lZWQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgaW50ZXJuYWwga3JiNSBjb250ZXh0IHBvaW50ZXIgZm9yCisJb2xkZXIgKHByZS0xLjQpIHZlcnNpb25zIG9mIE1JVCBLZXJiZXJvcy4gIFdlIGdldCBhIHBvaW50ZXIgdG8KKwl0aGUgZ3NzIGdsdWUncyBjb250ZXh0LiAgR2V0IHRoZSByaWdodCBwb2ludGVyIGJlZm9yZSBhY2Nlc3NpbmcKKwl0aGUgY29udGV4dCBpbmZvcm1hdGlvbi4KKwkKKzIwMDYtMDMtMjcgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgY2F1c2luZyBjb21waWxlIHdhcm5pbmcKKwkKKwlSZW1vdmUgdW51c2VkIGdyb3VwcyB2YXJpYWJsZSBmcm9tIGdldF9pZHMoKSB3aGljaCB3YXMgY2F1c2luZyBhIGNvbXBpbGVyIHdhcm5pbmcuCisJCisyMDA2LTAzLTI3IGt3Y0BjaXRpLnVtaWNoLmVkdQorCVVwZGF0ZSBrcmI1IGNvZGUgdG8gdXNlIGdsdWUgcm91dGluZSBsdWNpZCBjb250ZXh0IGZ1bmN0aW9ucworCQorCVRoZSBnc3NkIGNvZGUgc2hvdWxkIG5vdCBrbm93IGFib3V0IHRoZSBnbHVlIGxheWVyJ3MgY29udGV4dCBzdHJ1Y3R1cmUuCisJQSBwcmV2aW91cyBwYXRjaCBhZGRlZCBnc3NfZXhwb3J0X2x1Y2lkX3NlY19jb250ZXh0KCkgYW5kCisJZ3NzX2ZyZWVfbHVjaWRfc2VjX2NvbnRleHQoKSBmdW5jdGlvbnMgdG8gdGhlIGdzc2FwaSBnbHVlIGxheWVyLgorCVVzZSB0aGVzZSBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gY2FsbGluZyBkaXJlY3RseSB0byB0aGUgS2VyYmVyb3MKKwlnc3NhcGkgY29kZSAod2hpY2ggcmVxdWlyZXMgdGhlIEtlcmJlcm9zIGNvbnRleHQgaGFuZGxlIHJhdGhlcgorCXRoYW4gdGhlIGdsdWUncyBjb250ZXh0IGhhbmRsZSkuCisJCisyMDA2LTAzLTI3IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwlTZXBhcmF0ZSBvdXQgY29udGV4dCBoYW5kbGluZyBjb2RlIGZvciBNSVQgS2VyYmVyb3MgYW5kIFNQS00zCisJaW50byB0aGVpciBvd24gZmlsZS4KKwkKKzIwMDYtMDMtMjcgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCUNvbnNvbGlkYXRlIGdzc2QgYW5kIHN2Y2dzc2Qgc2luY2UgdGhleSBzaGFyZSBtdWNoIGNvZGUKKwkKKwlSZW1vdmUgZGlyZWN0b3J5IHN2Y2dzc2Qgd2hpY2ggd2FzIG9ubHkgY3JlYXRlZCBiZWNhdXNlIHRoZSBvbGQKKwlidWlsZCBzeXN0ZW0gY291bGQgbm90IGhhbmRsZSBidWlsZGluZyB0d28gZGFlbW9ucyBpbiB0aGUgc2FtZQorCWRpcmVjdG9yeS4gIFRoaXMgZWxpbWluYXRlcyBidWlsZCBjb21wbGljYXRpb25zIHNpbmNlIGdzc2QgYW5kCisJc3ZjZ3NzZCBhbHNvIHNoYXJlIG1hbnkgc291cmNlIGZpbGVzLgorCQorCVRoaXMgcGF0Y2ggZWZmZWN0aXZlbHkgcmVtb3ZlcyB0aGUgdXRpbHMvc3ZjZ3NzZCBkaXJlY3RvcnksIG1vdmluZworCWFsbCBpdHMgZmlsZXMgdG8gdGhlIHV0aWxzL2dzc2QgZGlyZWN0b3J5LiAgRmlsZSB1dGlscy9nc3NkL01ha2VmaWxlLmFtCisJaXMgbW9kaWZpZWQgd2l0aCBkaXJlY3Rpb25zIHRvIGJ1aWxkIGJvdGggZ3NzZCBhbmQgc3ZjZ3NzZC4KKwkKKzIwMDYtMDMtMjcgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCVVzZSBQS0dDT05GSUcgdG8gbG9jYXRlIGdzc2FwaSBhbmQgcnBjc2VjZ3NzIGhlYWRlciBmaWxlcworCQorCUluc3RlYWQgb2YgaGF2aW5nIHNlcGFyYXRlIGNvcGllcyBvZiB0aGUgZ3NzYXBpIGFuZCBycGNzZWNnc3MKKwloZWFkZXIgZmlsZXMsIG9yIGRlcGVuZGluZyBvbiB0aGUgS2VyYmVyb3MgZ3NzYXBpIGhlYWRlciwKKwlsb2NhdGUgdGhlIGhlYWRlcnMgbm93IGluc3RhbGxlZCB3aXRoIHRoZSBsaWJnc3NhcGkgYW5kIGxpYnJwY3NlY2dzcworCWxpYnJhcmllcy4KKwkKKwlSZW1vdmUgbG9jYWwgY29waWVzIG9mIHRoZSBnc3NhcGkgYW5kIHJwY3NlY2dzcyBoZWFkZXIgZmlsZXMuCisJCisJVGhpcyBkZXBlbmRzIG9uIHRoZSBjb25maWd1cmVfdXNlX2F1dG90b29scyBwYXRjaC4KKwkKKzIwMDYtMDMtMjcgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCVVzZXItc2VsZWN0YWJsZSBpZG1hcHBpbmcgY2FjaGUgbGlmZXRpbWUKKwkKKwlSZWFkIGFuZCBwcm9jZXNzIG5ldyBjb25maWd1cmF0aW9uIG9wdGlvbiwgQ2FjaGUtRXhwaXJhdGlvbiwgYW5kIHVzZQorCXRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaG93IGxvbmcgaWRtYXBwaW5nIGVudHJpZXMgYXJlIGNhY2hlZC4KKwkKKzIwMDYtMDMtMjcgU3RldmUgRGlja3NvbiA8c3RldmVkQHJlZGhhdC5jb20+CisJU2V0IGxpYm5mc2lkbWFwIGxpYnJhcnkgZGVidWdnaW5nIGxldmVsIGFuZCBsb2dnaW5nIGZ1bmN0aW9uLgorCisJVGhpcyBwYXRjaCBhZGRzIGEgY2FsbCB0byB0aGUgbmV3IGxpYm5mc2lkbWFwIGxpYnJhcnkgZnVuY3Rpb24gCisJbmZzNF9zZXRfZGVidWcoKSwgd2hpY2ggZGVmaW5lcyB0aGUgdmVyYm9zaXR5IGxldmVsIGxpYm5mc2lkbWFwCisJc2hvdWxkIHVzZSBhcyB3ZWxsIGFzIHRoZSBsb2dnaW5nIGZ1bmN0aW9uLgorCisyMDA2LTAzLTI3IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwlEb24ndCBjbG9zZSBmaWxlIGRlc2NyaXB0b3IgdW50aWwgYWZ0ZXIgY2FsbGluZyBldmVudF9kZWwoKS4KKworCURlbGV0ZSBldmVudCBwcm9jZXNzaW5nIGZvciBhIGZpbGUgZGVzY3JpcHRvciBiZWZvcmUgY2xvc2luZyBpdC4KKwlUaGlzIHdhcyBjYXVzaW5nIGhhbmdzIHdoZW4gdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGxpYmV2ZW50LTEuMGIuCisKKzIwMDYtMDMtMjcga3djQGNpdGkudW1pY2guZWR1CisJRmluZCBrcmI1LWNvbmZpZyBvbiBTdVNFIDEwCisKKwlTdVNFIDEwLjAgcHV0cyBrcmI1LWNvbmZpZyBpbiB5ZXQgYW5vdGhlciBvYnNjdXJlIGxvY2F0aW9uLgorCUxvb2sgZm9yIGl0IHRoZXJlIGFuZCB1c2UgaXQgaWYgZm91bmQuCisKKzIwMDYtMDMtMjcgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCVVwZGF0ZSBkZWJpYW4gcGFja2FnZSBpbmZvcm1hdGlvbi4KKworMjAwNi0wMy0yNyBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisJSW5zdGFsbCAvdmFyL2xpYi9uZnMgZmlsZXMgdXNpbmcgREVTVERJUiBhbmQgYWRkIHJwY3NlYyBoZWFkZXJzIHRvIGRpc3RyaWJ1dGlvbgorCisJQWRkICIkKERFU1RESVIpIiB0byB0aGUgcGF0aHMgZm9yIHRoZSAiJChzdGF0ZWRpcikiIGZpbGVzIHNvIHRoZXkgYXJlCisJcHV0IGluIHRoZSByaWdodCBwbGFjZSB3aGVuIERFU1RESVIgaXMgZGVmaW5lZC4KKworCUFkZCB0aGUgcnBjc2VjIGhlYWRlciBmaWxlcyB0byBFWFRSQV9ESVNUIGxpc3QuCisKKzIwMDUtMTItMjEgTmVpbEJyb3duIDxuZWlsYkBzdXNlLmRlPgorCSp1dGlscy9ycXVvdGFkL3JxdW90YV9zZXJ2ZXIuYzogRGV0ZWN0IGFuZCBoYW5kbGUgYm90aCBvbGQtc3R5bGUKKwkoMi40KSBhbmQgbmV3LXN0eWxlKDIuNikgcXVvdGFjdGwuCisJKnV0aWxzL2dzc2QvZ3NzX2Rlc3Ryb3lfY3JlZDogcmVtb3ZlIGRlcGVuZGVuY2Ugb24gImhlYWQgLTEiIHdoaWNoCisJbWlnaHQgbmVlZCB0byBiZSAiaGVhZCAtbiAxIgorCSp1dGlscy9uaGZzc3RvbmUvbmhmc3J1bjogY29udmVydCAidGFpbCAtMSIgdG8gInRhaWwgLW4gMSIKKwkKKzIwMDUtMTItMjAgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PiBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+CisJU3Vic3RhbnRpYWwgTWFrZWZpbGUvY29uZmlndXJlIHJld3JpdGUuICAKKwlSdW4gJ2F1dG9nZW4uc2gnIHRvIGNyZWF0ZSAiTWFrZWZpbGUuaW4iIGV0Yy4KKworCUFsc28gYWRkIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgdG8gQ1BQX0ZMQUdTIHNvIHRoYXQgbW91bnRkIGNhbgorCXN0YXQgYW5kIGV4cG9ydCBmaWxlcyBsYXJnZXIgdGhhbiAyR2lnLgorCisJMS4wLjgtcmMyIHJlbGVhc2VkCisKKzIwMDUtMTItMjAgTmVpbEJyb3duIDxuZWlsYkBzdXNlLmRlPgorCXN1cHBvcnQvbmZzL2V4cG9ydHMuYyhnZXRleHBvcnRlbnQpOiBpcyBhIG51bGwgaG9zdCBuYW1lIGlzIGdpdmVuLAorCXJlcGxhY2UgaXQgd2l0aCAnKicgc28gd2UgaGF2ZSBhIG5vbi1lbXB0eSBob3N0IG5hbWUgZm9yIG1lc3NhZ2VzCisJZXRjLgorCXV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLm1hbjogQ29ycmVjdCBkb2N1bWVudGF0aW9uIGFib3V0IGRlZmF1bHQKKwlleHBvcnQgb3B0aW9ucy4KKworMjAwNS0xMi0yMCBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisJdXRpbHMvZ3NzZC9nc3NkX3Byb2MuYyhjcmVhdGVfYXV0aF9ycGNfY2xpZW50KTogVXNlIHNlcnZpY2UKKwkgIHBvcnRpb24gb2YgY2xwLT5zZXJ2aWNlbmFtZSByYXRoZXIgdGhhbiBoYXJkLWNvZGluZyAibmZzIi4gCisKKzIwMDUtMTItMTYgTmVpbEJyb3duIDxuZWlsYkBzdXNlLmRlPgorCTEuMC44LXJjMSByZWxlYXNlZAorCisyMDA1LTEyLTE2IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwlzdmNnc3NkIG5lZWRzIC1sbmZzIHdoZW4gdXNpbmcgbmV3IGZ1bmN0aW9uIGNsb3NlYWxsKCkuCisJCisJLS0tCisJUmVtb3ZlIHVudXNlZCBhcmd1bWVudCBmcm9tIG5mc2RvcGVuKCkKKwkKKwlBZnRlciBwcmV2aW91cyBjaGFuZ2VzLCB0aGUgYXJndWVtZW50IHRvIG5mc2RvcGVuKCkgaGFzIGJlY29tZSB1bnVzZWQuCisJUmVtb3ZlIGl0LgorCQorCS0tLQorCUZpeCBpZG1hcGQgZXJyb3IgcmVwb3J0aW5nIGFmdGVyIGNhbGwgdG8gbXlkYWVtb24oKQorCQorCUFmdGVyIGNhbGwgdG8gbXlkYWVtb24oKSwgY2FsbHMgdG8gZXJyW3hdIGFuZCB3YXJuW3hdIHJlc3VsdAorCWluIHRoZSBtZXNzYWdlIGdvaW5nIG5vd2hlcmUuICBDaGFuZ2UgdG8gdXNpbmcgaWRtYXBkXyoKKwl2ZXJzaW9ucyBvZiB0aGVzZSByb3V0aW5lcyB3aGljaCB3cml0ZSB0byBzeXNsb2cuCisJT3JpZ2luYWwgcHJvYmxlbSByZXBvcnRlZCBieSBWaW5jZW50IFJvcXVldGEgPHZpbmNlbnQucm9xdWV0YUBleHQuYnVsbC5uZXQ+CisJd2l0aCBhIGRpZmZlcmVudCBwYXRjaC4KKwkKKwktLS0KKwlEb24ndCBhZGQgQGRvbWFpbiB0byBuYW1lcyB0aGF0IGNhbm5vdCBiZSBtYXBwZWQuCisJCisJUGVyIHJmYzM1MzAgc2VjdGlvbiA1Ljg6IHdoZW4gdW5hYmxlIHRvIG1hcCBhIHVpZCB0byBhIG5hbWUsIGRvbid0CisJYWRkIHRoZSBAZG9tYWluIHRvIHRoZSAibm9ib2R5IiBuYW1lLgorCQorCS0tLQorCUZpeCBpZG1hcGQgZm9yIHN5c3RlbXMgd2hlcmUgc2l6ZW9mKHVpZF90KSE9NCBhbmQgc2l6ZW9mKGdpZF90KSE9NAorCQorCUZpeCBjb252ZXJzaW9uIGNhc2VzIHdoZXJlIHVpZF90IGFuZCBnaWRfdCBhcmUgbm90IDMyIGJpdHMuCisJCisJLS0tCisJRG9uJ3Qgc2VnZmF1bHQgYmVjYXVzZSBtZWNoIHdhc24ndCBmaWxsZWQgaW4gYmVjYXVzZSBvZiBhbiBlcnJvcgorCQorCUZyb20gS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCQorCUluaXRpYWxpemUgbWVjaCB0byBudWxsIHRvIGF2b2lkIHNlZ2ZhdWx0IGlmIGFuIGVycm9yIG9jY3VycworCWFuZCBtZWNoIGlzIG5ldmVyIHJldHVybmVkIGZyb20gZ3NzX2FjY2VwdF9zZWNfY29udGV4dC4KKwkKKwktLS0KKwlSZW1vdmUgdXNlIG9mIHN0YXRpYyBidWZmZXIgaW4gZG9fZG93bmNhbGwKKwkKKwlTaWduZWQtb2ZmLWJ5OiBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisJCisJRHluYW1pY2FsbHkgYWxsb2NhdGUgYnVmZmVyIG9mIHRoZSBjb3JyZWN0IGxlbmd0aCByYXRoZXIKKwl0aGFuIHVzaW5nIGZpeGVkLWxlbmd0aCBidWZmZXIuCisJCisJLS0tCisJUHJpbnQgYmV0dGVyIGVycm9yIG1lc3NhZ2UgaWYgcnBjIHJvdXRpbmUgY2xudF9jcmVhdGUoKSBmYWlscy4KKwkKKwktLS0KKwlQcmludCBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlcyBhZnRlciBnc3MgY2FsbHMuCisJCisJUHJpbnQgZ3NzIGVycm9yIG1lc3NhZ2VzIGFmdGVyIGNhbGxzIHRvIGdzcyBmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleQorCWFyZSBmb3IgS2VyYmVyb3Mgb25seS4KKwkKKwktLS0KKwlVcGRhdGUgZ3NzZCBhbmQgc3ZjZ3NzZCB0byB1c2UgdGhlIG5ldyBnc3MgbWVjaCBnbHVlIGx1Y2lkIGNvbnRleHQgY2FsbHMuCisJCisJU2lnbmVkLW9mZi1ieTogS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCQorCVVwZGF0ZSBnc3NkIGFuZCBzdmNnc3NkIHRvIHVzZSBhIGx1Y2lkIGNvbnRleHQgZnJvbSBTUEtNMyB0byBzZW5kIGRvd24KKwl0byB0aGUga2VybmVsLgorCVVwZGF0ZSBnc3NkIGFuZCBzdmNnc3NkIHRvIHVzZSB0aGUgbmV3IGdzcyBtZWNoIGdsdWUgbHVjaWQgY29udGV4dCBjYWxscy4KKwlBZGQgY29uZmlndXJlIGNoZWNrIHRvIHNlZSBpZiBzcGttMyBzdXBwb3J0IGlzIGF2YWlsYWJsZS4KKwkKKwktLS0KKwlBZGQgc3VwcG9ydCBmb3IgQ09OVElOVUVfTkVFREVEIHJldHVybiBmcm9tIGdzc19hY2NlcHRfc2VjX2NvbnRleHQuCisJCisJU2lnbmVkLW9mZi1ieTogS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCQorCUFkZCBDT05USU5VRV9JTklUIGhhbmRsaW5nIHRvIHN2Y2dzc2QuIFN0b3JlIHRoZSBwYXJ0aWFsbHkgY29tcGxldGUgc3BrbQorCWNvbnRleHQgaGFuZGxlIGluIHRoZSBvdXRfaGFuZGxlIG9mIENPTlRJTlVFX0lOSVQgbWVzc2FnZXMgc28gdGhhdCBpdCBpcworCXJldHVybmVkIGluIHRoZSBpbl9oYW5kbGUgb2Ygc3Vic2VxdWVudCBtZXNzYWdlcy4KKwkKKwktLS0KKwlSZXBsYWNlIEdTU19DX0FOT05fRkxBRyB3aXRoIEdTU19DX01VVFVBTF9GTEFHLgorCQorCVNpZ25lZC1vZmYtYnk6IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwkKKwlTcGVjaWZ5IEdTU19DX01VVFVBTF9GTEFHIHJhdGhlciB0aGFuIEdTU19DX0FOT05fRkxBRyBmb3IKKwlzcGttMy4KKwkKKwlOT1RFOiB3ZSBuZWVkIGEgd2F5IHRvIHBhc3MgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIHJhdGhlciB0aGFuCisJaGFyZC1jb2RpbmcgdGhpcyBmbGFnLgorCQorCS0tLQorCUluY3JlYXNlIHNpemUgb2YgcnBjIHNlbmQvcmVjZWl2ZSBidWZmZXJzCisJCisJQ2hhbmdlIHRoZSBjbG50X2NyZWF0ZSgpIHRvIHVzZSByb3V0aW5lcyB3aGljaCBhbGxvdyB1cyB0byBzZXQgdGhlCisJc2VuZCBhbmQgcmVjZWl2ZSBidWZmZXIgc2l6ZS4gIFRoaXMgaXMgbmVlZGVkIGZvciBsYXJnZXIgc3BrbTMKKwlleGNoYW5nZXMgaW5jbHVkaW5nIGNlcnRpZmljYXRlIGNoYWlucy4KKwkKKwlUaGlzIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2Ygc2tpcHBpbmcgdGhlIHBvcnRtYXAgY2FsbCBzaW5jZQorCXdlIHNwZWNpZnkgdGhlIHBvcnQgKGJ5IHNwZWNpZnlpbmcgdGhlIHNlcnZpY2UpIHdoZW4gZ2V0dGluZworCXRoZSBzZXJ2ZXIncyBhZGRyZXNzIGluZm9ybWF0aW9uLgorCQorCS0tLQorCURlZmluZSBfTElOVVhfUVVPVEFfVkVSU0lPTiB0byAxCisJCisJVGhlIHJxdW90YWQgY29kZSBpcyB3cml0dGVuIGFnYWluc3QgdGhlICJvbGQiIGtlcm5lbCBxdW90YSBpbnRlcmZhY2UuCisJRmVkb3JhIENvcmUgNCBpcyB0aGUgb25seSBwbGF0Zm9ybSBrbm93biB0byBjaGVjayBmb3IgZGlmZmVyZW50CisJdmVyc2lvbnMsIHNvIHRoaXMgc2hvdWxkIG5vdCBoYXZlIGFueSBhZmZlY3Qgb24gb3RoZXIgcGxhdGZvcm1zCisJYW5kIGZpeGVzIHRoZSBidWlsZCBmb3IgRkM0LgorCQorCS0tLQorCisyMDA1LTEyLTEyIFVzaGEgS2V0aW5lbmkgPGtldGluZW5pQHVzLmlibS5jb20+LCBOZWlsQnJvd24gPG5laWxiQHN1c2UuZGU+CisJKnN1cHBvcnQvbmZzL3JwY21pc2MuYyhycGNfaW5pdCk6IGlzIHN0ZGluIGlzIGEgc29ja2V0LCBidXQKKwlpcyBhbHJlYWR5IGNvbm5lY3RlZCAoYXMgZS5nLiBmcm9tIHNzaCksIGRvbid0IGFzc3VtZSB3ZQorCXdlcmUgc3RhcnRlZCBieSBpbmV0ZC4KKworMjAwNS0xMS0wMyBTdGV2ZSBEaWNrc29uIDxTdGV2ZURAcmVkaGF0LmNvbT4gTmVpbEJyb3duIDxuZWlsYkBzdXNlLmRlPgorCSp1dGlscy9pZG1hcGQvaWRtYXBzLmM6CisJCisJSSd2ZSByZWNlbnRseSB1cGRhdGVkIHRoZSBuZnMtdXRpbHMgaW4gcmF3aGlkZSB3aXRoIHRoZQorCWxhdGVzdCBwYXRjaGVzIGZyb20gdGhlIFNvdXJjZUZvcmdlIENWUyB0cmVlIGFuZCB0aGUKKwlsYXRlc3QgQ0lUSSBwYXRjaGVzICgxLjAuNy00KS4KKwkKKwlJbiB0ZXN0aW5nIHRoZXNlIHBhdGNoZXMsIEkgbm90aWNlIHRoYXQgd2hlbiB0aGUgc2VydmVyIHdhcyBzdGFydGVkCisJYW5kIGEgU0lHSFVQIHdhcyBzZW50IHRvIHJwYy5pZG1hcGQgdG8gb3BlbiB0aGUgbmZzNC5uYW1ldG9pZC9jaGFubmVsCisJYW5kIG5mczQuaWR0b25hbWUvY2hhbm5lbCBmaWxlcywgdGhlIHNlY29uZCBvcGVuICh0aGUgbmZzNC5pZHRvbmFtZSBvbmUpCisJZmFpbGVkIGJlY2F1c2UgdGhlIHBhdGggKGkuZS4gaWMtPmljX3BhdGgpIHdhcyBOVUxMLgorCQorCU5vdyB0aGUgcmVhc29uIHRoZSBpY19wYXRoIHdhcyBOVUxMIHdhcyBiZWNhdXNlIGl0IHdhcyBuZXZlciBzZXQKKwlkdXJpbmcgdGhlIGNhbGwgdG8gbmZzZG9wZW4oKS4gbmZzZG9wZW4oKSBsb29rcyBsaWtlOgorCW5mc2RvcGVuKGNoYXIgKnBhdGgpCisJeworCSAgICAgcmV0dXJuICgobmZzZG9wZW5vbmUoJm5mc2RfaWNbSUNfTkFNRUlEXSwgSUNfTkFNRUlELCBwYXRoKSA9PSAwICYmCisgICAgICAgICAgICAgbmZzZG9wZW5vbmUoJm5mc2RfaWNbSUNfSUROQU1FXSwgSUNfSUROQU1FLCBwYXRoKSA9PSAwKSA/IDAgCisJICAgICAgIDogLTEpOworCX0KKworCU5vdGU6IHRoZSBjYWxsIHRvIG5mc2RvcGVub25lKCkgaXMgaG93IHRoZSBwYXRoIGlzIHNldCBpbiBlYWNoIG5mc2RfaWNbXQorCWVudHJ5IGFuZCBuZnNkb3BlbigpIGlzIG9ubHkgY2FsbGVkIG9uY2UuCisJCisJU28gd2hlbiBycGMuaWRtYXAgY29tZXMgdXAgYW5kIHRoZSBmaXJzdCBjYWxsIHRvIG5mc2RvcGVub25lKCkgZmFpbHMKKwkoYmVjYXVzZSB0aGUgc2VydmVyIGlzIG5vdCBydW5uaW5nKSB0aGUgcGF0aCBpbiBuZnNkX2ljW0lDX0lETkFNRV0gaXMKKwluZXZlciBmaWxsZWQgaW4gYmVjYXVzZSB0aGUgc2Vjb25kIG5mc2RvcGVub25lKCkgbmV2ZXIgaGFwcGVuLi4uCisJCisJTm93IHRoZXJlIHdhcyBhIENJVEkgcGF0Y2hlIChpZG1hcGRfcmV2ZXJ0X2ZpeF9yZW9wZW5fb25fc2lnaHVwLmRpZikKKwl0aGF0IHRyaWVkIHRvIGFkZHJlc3MgdGhpcyBwcm9ibGVtIGJ1dCBkaWQgc2VlbSB0byBmaXggaXQuLiBUaGUKKwlhdHRhY2hlZCBwYXRjaCBmaXggdGhlIHByb2JsZW0gYnkgaW5pdGlhbGl6aW5nIGJvdGggbmZzZF9pY1tJQ19JRE5BTUVdCisJYW5kIG5mc2RfaWNbSUNfTkFNRUlEXSBzdHJ1Y3R1cmVzIHdpdGggdGhlIG5lZWRlZCBpbmZvLi4uCisJSSBmaWd1cmVkIHNpbmNlIHRoZXJlIGlzIG5vIHdheSBvZiBjaGFuZ2luZyB0aGVzZSBwYXRocyBvciBmaWxlbmFtZXMKKwlieSBjb21tYW5kIGxpbmUgYXJncywgd2h5IG5vdCBqdXN0IHNldCB0aGVtIGR1cmluZyBjb21waWxlIHRpbWUuLi4KKwlzbyB0aGF0J3Mgd2hhdCB0aGlzIHBhdGNoIGRvZXMuCisJCisJVGhpcyBwYXRjaCBhbHNvIGNoYW5nZXMgaG93IG5mc2RyZW9wZW5fb25lKCkgaGFuZGxlcyB0aGUKKwljYXNlIHdoZXJlIHRoZSBldmVudCBoYXMgYWxyZWFkeSBiZWVuIHNldC4gVW5saWtlIHRoZSBDSVRJCisJcGF0Y2ggKGlkbWFwZF9yZXZlcnRfZml4X3Jlb3Blbl9vbl9zaWdodXAuZGlmKSB3aGljaCBqdXN0CisJanVzdCBkb2VzIG5vdCByZWdpc3RlciB0aGUgc2Vjb25kIGV2ZW50LCBteSBwYXRjaCBkZWxldGVzCisJdGhlIG9sZCBldmVudCBhbmQgdGhlIHJlZ2lzdGVycyB0aGUgbmV3IG9uZS4gSXQganVzdCBzZWVtcyBsaWtlCisJdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIHNpbmNlIGEgU0lHSFVQIG1lYW5zIGEgbmV3IHNlcnZlciBqdXN0CisJc3RhcnRlZCBzbyB3ZSBwcm9iYWJseSBzaG91bGQgY3JlYXRlIGEgbmV3IGV2ZW50IGFzIHdlbGwuLi4KKwkKKwlzdGV2ZWQuCisJCisyMDA1LTEwLTE0IE5laWxCcm93biA8bmVpbGJAc3VzZS5kZT4KKwkqdXRpbHMvbW91bnRkL2NhY2hlLmMobmZzZF9maCk6IFVuZGVyc3RhbmQgdHlwZSAyIGFuZCB0eXBlIDMKKwlmaWxlc3lzdGVtIGlkZW50aWZpZXJzLCB3aGljaCBhcmUgdXNlZCB3aXRoIGRldmljZSBudW1iZXJzCisJVGhhdCBkb24ndCBmaXQgaW50byAxNiBiaXRzLgorCisyMDA1LTEwLTA3IE9sYWYgS2lyY2ggPG9raXJAc3VzZS5kZT4KKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyhnZXRfZXhwb3J0bGlzdCk6IFdpdGhvdXQgdGhpcyBwYXRjaCwKKwlzaG93bW91bnQgLWUgd291bGQgc29tZXRpbWVzIGRpc3BsYXkgaG9zdCBuYW1lcyB0aGF0IHNob3VsZCByZWFsbHkKKwloYXZlIGJlZW4gc3Vic3VtZWQgdW5kZXIgYSB3aWxkY2FyZCBlbnRyeS4KKworCVRoZSBwcm9ibGVtIHdhcyB0aGF0IHRoZSBjb2RlIGluIGdldF9leHBvcnRsaXN0IHdvdWxkIGFsd2F5cworCXNraXAgdGhlIG5leHQgZ3JvdXAgZW50cnkgYWZ0ZXIgcmVtb3Zpbmcgb25lIEZRRE4uCisKKzIwMDUtMTAtMDYgU3RldmUgRGlja3NvbiA8U3RldmVEQHJlZGhhdC5jb20+IE5laWxCcm93biA8bmVpbGJAc3VzZS5kZT4KKwkqIHN1cHBvcnQvbmZzL2V4cG9ydC5jOiBkb24ndCB3YXJuIGFib3V0IHN5bmMvYXN5bmMgZm9yIHJlYWRvbmx5CisJZXhwb3J0cworCSogc3VwcG9ydC9uZnMvY2xvc2VhbGwuYzogbmV3IGZpbGUgd2l0aCBmdW5jdGlvbiB0byBjbG9zZSBhbGwgCisJZmlsZSBkZXNjcmlwdG9ycyBmcm9tIGEgZ2l2ZSBtaW5pbXVtIHVwd2FyZHMuCisJKiBuZnNkL21vdW50ZC9zdGF0ZC9pZG1hcGQvZ3Nzc3ZjZDogdXNlIGNsb3NlYWxsLgorCSogdXRpbHMvbW91bnRkL21vdW50ZC5jOiBFbGltaW5hdGUgMyBzeXNsb2cgbWVzc2FnZSB0aGF0IGFyZQorCWxvZ2dlZCBmb3Igc3VjY2Vzc2Z1bCBldmVudHMuIAorCSogdXRpbHMvbW91bnRkL21vdW50ZC5jOiBtYWtlIHN1cmUgdGhlIGNvcnJlY3QgaG9zdG5hbWUgaXMgdXNlZCBpbgorCXRoZSBTTV9OT1RJRlkgbWVzc2FnZSB0aGF0IGlzIHNlbnQgZnJvbSBhIHJlYm9vdGVkIHNlcnZlciB3aGljaAorCWhhcyBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMuIChieiAxMzkxMDEpCisKKwlEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbjoKKwlodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzOTEwMQorCisJKnV0aWxzL2lkbWFwZC9pZG1hcGQuYzpGaXhlZCBzdWJzY3JpcHRpbmcgcHJvYmxlbSBpbiBpZG1hcGQgKGJ6CisJMTU4MTg4KSBUaGlzIGZpeGVzIHRoZSBmb2xsb3dpbmcgcHJvYmxlbTogCisgICAgICAgICBycGMuaWRtYXBkOiBuZnNkcmVvcGVuOiBPcGVuaW5nICcnIGZhaWxlZDogZXJybm8gMiAoTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSkKKworCSBEZXRhaWxzIGNhbiBiZSBmb3VuZCBpbjoKKwkgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xNTgxODgKKworCSp1dGlscy9zdGF0ZC9zdGF0ZC5jKGRyb3BfcHJpdnMpOiBjbGVhciBzdF9naWQgYXMgd2VsbCBhcyBzdF91aWQKKwlvZiBzdGF0IGZhaWxzLgorCSp1dGlscy9zdGF0ZC9zdmNfcnVuLmMobXlfc3ZjX3J1bik6IHJlbW92ZSB1c2FnZSBvZiB1bmRvY3VtZW50ZWQKKwklbSBmb3JtYXQgc3BlY2lmaWVyLgorCSp1dGlscy9zdGF0ZC9tb250b3IuYyhzbV9tb25fMV9zdmMpOiBhcyBhYm92ZQorCSpzdXBwb3J0L25mcy94bG9nLmMoeGxvZyk6IENoYW5nZWQgeGxvZyB0byB1c2UgTE9HX0lORk8gaW5zdGVhZCBvZgorCUxPR19ERUJVRyBzbyBkZWJ1ZyBtZXNzYWdlcyB3aWxsIGFwcGVhciB3L291dCBhbnkgY29uZmlnIGNoYW5nZXMKKwl0byBzeXNsb2cuY29uZi4gCisKKwkKKzIwMDUtMDktMDIgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc2VydmVyLmMoZ2V0cXVvdGFpbmZvKTogdXNlIGV4cGxpY2l0CisJc3RydXR1cmUtbWVtYmVyIGNvcHlpbmcgcmF0aGVyIHRoYW4gbWVtY3B5LCBhcyB0aGUgZWxlbWVudAorCXNpemVzIGFyZSB0aGUgc2FtZSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKworMjAwNS0wOC0yNiBLZXZpbiBDb2ZmbWFuIDxrd2NAY2l0aS51bWljaC5lZHU+CisJQWRkIG9wdGlvbiB0byBzZXQgcnBjc2VjX2dzcyBkZWJ1Z2dpbmcgbGV2ZWwgKGlmIGF2YWlsYWJsZSkKKworCUNoYW5nZXMgdG8gYWxsb3cgZ3NzZC9zdmNnc3NkIHRvIGJ1aWxkIHdoZW4gdXNpbmcgSGllbWRhbCBLZXJiZXJvcworCWxpYnJhcmllcy4gIE5vdGUgdGhhdCB0aGVyZSBhcmUgc3RpbGwgcnVuLXRpbWUgaXNzdWVzIHByZXZlbnRpbmcKKwl0aGlzIGZyb20gd29ya2luZyB3aGVuIHNoYXJlZCBsaWJyYXJpZXMgZm9yIGxpYmdzc2FwaSBhbmQgbGlicnBjc2VjZ3NzCisJYXJlIHVzZWQuCisJCisyMDA1LTA4LTI2IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwlSZW1vdmUgdGhlIHJwY3NlY19nc3MgY29kZSBhbmQgcmVseSBvbiBhbiBleHRlcm5hbCBsaWJyYXJ5IGluc3RlYWQuCisKKzIwMDUtMDgtMjYgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCSp1dGlscy9tb3VudGQvbW91bnRkLmM6CisJbW91bnRkIGN1cnJlbnRseSBhbHdheXMgcmV0dXJucyBBVVRIX05VTEwgYW5kIEFVVEhfU1lTIGFzIHRoZQorCWFsbG93YWJsZSBmbGF2b3JzIGluIG1vdW50IHJlcGxpZXMuICBXZSB3YW50IGl0IHRvIGFsc28gcmV0dXJuIGdzcworCWZsYXZvcnMgd2hlbiBhcHByb3ByaWF0ZS4gRm9yIG5vdyBhcyBhIGhhY2sgd2UganVzdCBoYXZlIGl0IGFsd2F5cworCXJldHVybiB0aGUgS1JCNSBmbGF2b3JzIGFzIHdlbGwuIAorCisJKnV0aWxzL21vdW50ZC9jYWNoZS5jOgorCQorCVdoZW4gYXR0ZW1wdGluZyB0byBtb3VudCBhbiBORlN2NCBwc2V1ZG9maWxlc3lzdGVtIChmc2lkPTApIGFuZCB0aGUKKwlhY3R1YWwgZXhwb3J0ZWQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBzZXJ2ZXIsIHJwYy5tb3VudGQKKwlkb2Vzbid0IGNoZWNrIHRoZSBkaXJlY3RvcnkgZXhpc3RzICh3aGVuIGZzaWR0eXBlPTEsIGkuZS4gdXNpbmcgZnNpZCwKKwlidXQgZG9lcyBjaGVjayBmb3IgZnNpZHR5cGU9MCwgaS5lLiB1c2luZyBkZXYvaW5vKS4gIFRoZSBub24tZXhpc3RlbnQKKwlleHBvcnRlZCBkaXJlY3RvcnkgcGF0aCB3aXRoIGZzaWQ9MCBpcyB3cml0dGVuIHRvIHRoZSBrZXJuZWwgdmlhCisJL3Byb2MvbmV0L3JwYy9uZnNkLmV4cG9ydC9jaGFubmVsLCB3aGljaCBsZWFkcyB0byBwYXRoX2xvb2t1cCgpIHRvCisJcmV0dXJuIEVOT0VOVCAoc2VlbXMgYXBwcm9wcmlhdGUpLiAgVW5mb3J0dW5hdGVseSwgdGhlIG5ld19jYWNoZQorCWFwcHJvYWNoIGlnbm9yZXMgZXJyb3JzIHJldHVybmVkIHdoZW4gd3JpdGluZyB2aWEgdGhlIGNoYW5uZWwgZmlsZSBzbworCXRoYXQgcGFydGljdWxhciBlcnJvciBpcyBsb3N0IGFuZCB0aGUgbW91bnQgcmVxdWVzdCBpcyBzaWxlbnRseSBpZ25vcmVkLgorCQorCUFzc3VtaW5nIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZXZhbXAgdGhlIG5ld19jYWNoZS91cC1jYWxsIG1ldGhvZCB0bworCW5vdCBpZ25vcmUgcmV0dXJuZWQgZXJyb3JzLCBpdCBzZWVtcyBhcHByb3ByaWF0ZSB0byBmaXggdGhlIGNhc2Ugd2hlcmUKKwlycGMubW91bnRkIGRvZXNuJ3QgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gZXhwb3J0ZWQgZGlyZWN0b3J5IHdpdGgKKwlmc2lkPSBzZW1hbnRpY3MuICBUaGUgZm9sbG93aW5nIHBhdGNoIGRvZXMgdGhpcyBieSBtb3ZpbmcgdGhlIHN0YXQoKSB1cAorCXNvIGl0IGlzIGRvbmUgZm9yIGJvdGggZnNpZHR5cGUncy4gIEknbSBub3QgY2VydGFpbiB3aGV0aGVyIHRoZSBvdGhlcgorCXRlc3RzIG5lZWQgdG8gYmUgZXhlY3V0ZWQgZm9yIGZzaWR0eXBlPTEsIGJ1dCBpdCBkb2Vzbid0IGFwcGVhciB0byBodXJ0CisJW05vdCBleGFjdGx5IHRydWU6IHRoZSBjb21wYXJpc29uIG9mIGlub2RlIG51bWJlcnMgY2F1c2VkIHByb2JsZW1zIHNvCisJbm93IGl0J3Mga2VwdCBmb3IgZnNpZHR5cGU9MCBvbmx5XS4KKwkKKwlXb3VsZCBpdCBiZSBhbHNvIGRlc2lyYWJsZSB0byBsb2cgYSB3YXJuaW5nIGZvciBldmVyeSBlcnJvciwgaWYgYW55LAorCXJldHVybmVkIGJ5IGEgd3JpdGUgdG8gYW55IG9mIHRoZSAvcHJvYy9uZXQvcnBjLyovY2hhbm5lbCBmaWxlcyB3aGljaAorCXdvdWxkIG90aGVyd2lzZSBiZSBpZ25vcmVkIChtYXliZSB1bmRlciBhIGRlYnVnIGZsYWcpPworCisJKiBnc3NkL21vdW50ZC9zdmNnc3NkOiBDaGFuZ2VzIGdzc2QsIHN2Y2dzc2QsIGFuZCBtb3VudGQgdG8gaWdub3JlIGEKKwlTSUdIVVAgcmF0aGVyIHRoYW4gZHlpbmcuCisKKwkqIG1hbnk6IFJlbW92ZSB0aGUgZ3NzYXBpIGNvZGUgYW5kIHJlbHkgb24gYW4gZXh0ZXJuYWwgbGlicmFyeSBpbnN0ZWFkLgorCisyMDA1LTA4LTI2IEtldmluIENvZmZtYW4gPGt3Y0BjaXRpLnVtaWNoLmVkdT4KKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydHMubWFuOiBEb2N1bWVudCB0aGUgImNyb3NzbW50IiBleHBvcnQgZXhwb3J0IG9wdGlvbgorCSogdXRpbHMvZ3NzZC9rcmI1X3V0aWwuYzogCisJQWRkIGJldHRlciBkZWJ1Z2dpbmcgYW5kIHBhcnRpYWxseSByZXZlcnQgdGhlIGZ1bmN0aW9uCisJY2hlY2sgZm9yIGdzc19rcmI1X2NjYWNoZV9uYW1lLgorCQorCUZvciBNSVQgS2VyYmVyb3MgcmVsZWFzZXMgdXAgdG8gYW5kIGluY2x1ZGluZyAxLjMuMSwgd2UgKm11c3QqCisJdXNlIHRoZSByb3V0aW5lIGdzc19rcmI1X2NjYWNoZV9uYW1lIHRvIGdldCB0aGUgSzUgZ3NzYXBpIGNvZGUKKwl0byB1c2UgYSBkaWZmZXJlbnQgY3JlZGVudGlhbHMgY2FjaGUuCisJCisJRm9yIHJlbGVhc2VzIDEuMy4yIGFuZCBvbiwgd2Ugd2FudCB0byB1c2UgdGhlIEtSQjVDQ05BTUUKKwllbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0ZWxsIGl0IHdoYXQgdG8gdXNlLgorCShBIHByb2JsZW0gd2FzIHJlcG9ydGVkIHdoZXJlIDEuMy41IHdhcyBiZWluZyB1c2VkLCBvdXIKKwljb2RlIHdhcyB1c2luZyBnc3Nfa3JiNV9jY2FjaGVfbmFtZSwgYnV0IHRoZSB1bmRlcmx5aW5nCisJY29kZSBjb250aW51ZWQgdG8gdXNlIHRoZSBmaXJzdCAob3IgZGVmYXVsdD8pIGNyZWRlbnRpYWxzCisJY2FjaGUuICBTd2l0Y2hpbmcgdG8gdXNpbmcgdGhlIGVudiB2YXJpYWJsZSBmaXhlZCB0aGUgcHJvYmxlbS4KKwlJIGNhbm5vdCByZWNyZWF0ZSB0aGlzIHByb2JsZW0uCisKKwkqdXRpbHMvZ3NzZC9rcmI1X3V0aWwuYzoKKwlBbmRyZXcgTWFob25lIDxhbmRyZXcubWFob25lQGdtYWlsLmNvbT4gcmVwb3J0ZWQgdGhhdCByZWlzZXI0CisJYWx3YXlzIGhhcyBEVF9VTktOT1dOLiAgSGUgc3VwcGxpZWQgcGF0Y2ggdG8gbW92ZSB0aGUgY2hlY2sKKwlmb3IgcmVndWxhciBmaWxlcyBhZnRlciB0aGUgc3RhdCgpIGNhbGwgdG8gY29ycmVjdGx5IGZpbmQKKwljY2FjaGUgZmlsZXMgaW4gcmVpc2VyNCBmaWxlc3lzdGVtLgorCQorCUFsc28gY2hhbmdlIHRoZSBuYW1lIGNvbXBhcmlzb24gc28gdGhhdCB0aGUgd3JvbmcgZmlsZSBpcworCW5vdCBzZWxlY3RlZCB3aGVuIHRoZSBzdWJzdHJpbmcgY29tcGFyaXNvbiBpcyBkb25lLgorCisJKnV0aWxzL2dzc2Qva3JiNV91dGlsLmM6CisJTGltaXQgdGhlIHNldCBvZiBlbmNyeXB0aW9uIHR5cGVzIHRoYXQgY2FuIGJlIG5lZ290aWF0ZWQgYnkKKwl0aGUgS2VyYmVyb3MgbGlicmFyeSB0byB0aG9zZSB0aGF0IHRoZSBrZXJuZWwgY29kZSBjdXJyZW50bHkKKwlzdXBwb3J0cy4KKwkKKwlUaGlzIHNob3VsZCBldmVudHVhbGx5IHF1ZXJ5IHRoZSBrZXJuZWwgZm9yIHRoZSBsaXN0IG9mCisJc3VwcG9ydGVkIGVuY3R5cGVzLgorCisJKnV0aWxzL2dzc2QvZ3NzX3V0aWwuYywgdXRpbHMvc3ZjZ3NzZC9zdmNnc3NkX21haW5fbG9vcC5jOgorCVByaW50IG1vcmUgaW5mb3JtYXRpb24gaW4gZXJyb3IgbWVzc2FnZXMgdG8gaGVscCBkZWJ1Z2dpbmcgZmFpbHVyZXMuCisKKwkqdXRpbHMvc3ZjZ3NzZC9zdmNnc3NkX3Byb2MuYzogSW5jcmVhc2UgdG9rZW4gYnVmZmVyIHNpemUgYW5kCisJdXBkYXRlIGVycm9yIGhhbmRsaW5nIHNvIHRoYXQgYSByZXNwb25zZSBpcyBhbHdheXMgc2VudC4KKworCSp1dGlscy9zdmNnc3NkL3N2Y2dzc2RfcHJvYy5jOiBBZGQgc3VwcG9ydCB0byByZXRyaWV2ZQorCXN1cHBsZW1lbnRhcnkgZ3JvdXBzLiAKKwkKKwkKKzIwMDUtMDgtMjYgS2V2aW4gQ29mZm1hbiA8a3djQGNpdGkudW1pY2guZWR1PgorCSogY29uZmlndXJlLmluIGV0YworCUNvbnNvbGlkYXRlIHNvbWUgb2YgdGhlIEtlcmJlcm9zIGNoZWNraW5nIGluc3RlYWQgb2YgcmVwZWF0aW5nCisJdGhlIHNhbWUgdGhpbmdzIGZvciBNSVQgYW5kIEhlaW1kYWwuCisJQWxzbyBhZGRzIG1vcmUgY2hlY2tzIHRvIGRpc3Rpbmd1aXNoIDMyLWJpdCBmcm9tIDY0LWJpdAorCShtYWlubHkgZm9yIGdzc2FwaS5oKQorCUZpeCBzdmNnc3NkIE1ha2VmaWxlIHNvIG1ha2UgVE9QPS4uLy4uLyB3b3JrcyBjb3JyZWN0bHkgdGhlcmUuCisJRW5hYmxlIHJ1bm5pbmcgYSBtb2Rlcm4gYXV0b2hlYWRlci4KKwkqIHV0aWxzL2dzc2QvZ3NzX29pZHMuYzogVXNlIGNvcnJlY3QgT0lEIHZhbHVlIGZvciBTUEtNLTMKKwkqIHV0aWxzL2dzc2QvZ3NzX3V0aWwuYzogRml4IGJ1aWxkIHdpdGggb2xkZXIgTUlUIHJlbGVhc2VzIHRoYXQgZG8gbm90IGRlZmluZSBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRQorCSogdXRpbHMvZ3NzZC93cml0ZV9ieXRlcy5oLCBzdXBwb3J0L2luY2x1ZGUvZ3NzYXBpL2dzc2FwaS5oOgorCUxlbmd0aCBvZiBnc3NfYnVmZmVyX2Rlc2MgaXMgYSBzaXplX3Qgd2hpY2ggaXMgNjQtYml0cyBvbiBhCisJNjQtYml0IG1hY2hpbmUuICBLZXJuZWwgY29kZSBleHBlY3RzIDMyLWJpdCBpbnRlZ2VyIGZvciBsZW5ndGguCisJQ29lcmNlIGxlbmd0aCB2YWx1ZSBpbnRvIGEgMzItYml0IHZhbHVlIHdoZW4gcmVhZGluZyBmcm9tIG9yCisJd3JpdGluZyB0byB0aGUga2VybmVsLgorCUNoYW5nZSBnc3NhcGkuaCB0byB1c2UgZGF0YXR5cGUgc2l6ZSB2YWx1ZXMgb2J0YWluZWQgZnJvbQorCWNvbmZpZ3VyZSByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIHZhbHVlcy4KKwkqIHV0aWxzL2lkbWFwZC9pZG1hcGQuYzogVGhlIEVWX0lOSVQgY2hlY2sgaGVyZSB3YXMgd3JvbmcsIGFuZCB3YXMKKwljYXVzaW5nIGlkbWFwZCB0byBiZWNvbWUgdW5yZXNwb25zaXZlIHRvIHNlcnZlciByZXF1ZXN0cyBhZnRlcgorCXJlY2VpdmluZyBhIHNpZ2h1cC4gCisJKiB1dGlscy9pZG1hcGQvaWRtYXBkLmM6IElkbWFwZCBzaG91bGQgZmx1c2ggdGhlIHNlcnZlciBpZDwtPm5hbWUKKwljYWNoZXMgd2hlbiBpdHMgc3RhcnRlZC4gCisKKzIwMDUtMDQtMTIgIEcuIEFsbGVuIE1vcnJpcyBJSUkgPGdhbTNAZ2FtMy5uZXQ+CisKKwkqIEFsbCBNYWtlZmlsZTogYWRkZWQgVE9QIGFzIG5lZWRlZCBmb3IgZWFzaWVyIGNvbXBpbGUuCisKKwkqIHV0aWxzL25mc3N0YXQvbmZzc3RhdC5jOiBhZGRlZCBORlMgVjQgc3VwcG9ydDsgYWRkZWQgdGhlIC1tCisJICBvcHRpb247IEFkZGVkIC0yLCAtMywgYW5kIC00IG9wdGlvbnM7IGNoYW5nZWQgLWEgb3B0aW9uIHRvIC12CisJICBvcHRpb247IGFkZGVkIGxvbmcgb3B0aW9uczsgY2hhbmdlZCBkZWZhdWx0IG91dHB1dCB0byBub3QKKwkgIHNob3cgVjIgTkZTIHN0YXRpc3RpY3MgdW5sZXNzIHVzZWQuCisKKwkqIHV0aWxzL25mc3N0YXQvbmZzc3RhdC5tYW46IERvY3VtZW50ZWQgYWJvdmUgY2hhbmdlczsgY2hhbmdlZAorCSAgYXV0aG9ycyBlbWFpbCBhZGRyZXNzOyBhZGRlZCBCVUdTIHNlY3Rpb24uCisKKzIwMDUtMDQtMDcgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDEuMC43LTIuCisKKzIwMDUtMDQtMDYgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWI6IFVwZGF0ZS4KKworCSogc3VwcG9ydC9ycGMvc3ZjX2F1dGhfZ3NzLmMgKF9zdmNhdXRoX2dzcyk6IEF2b2lkIHVzaW5nIGEgY2FzdCBhcworCWFuIGx2YWx1ZSwgYXMgaXQgaXMgbm9uLXBvcnRhYmxlLgorCisJKiBzdXBwb3J0L25mcy9leHBvcnRzLmMgKHBhcnNlb3B0cyk6IEFjY2VwdCAiYWNsIiBvcHRpb24gdG8gbWVhbgorCX5ORlNFWFBfTk9BQ0wsIGFuZCAibm9fYWNsIiB0byBtZWFuIE5GU0VYUF9OT0FDTC4KKwkocHV0ZXhwb3J0ZW50KTogUmVwb3J0IE5GU0VYUF9OT0FDTCBhcyAibm9fYWNsIiwgYW5kIH5ORlNFWFBfTk9BQ0wKKwlhcyAiYWNsIi4KKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMgKGR1bXApOiBSZXBvcnQgTkZTRVhQX05PQUNMIGFzCisJIm5vX2FjbCIuCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRzLm1hbjogRG9jdW1lbnQgIm5vX2FjbCIuCisKKzIwMDUtMDMtMTQgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCURlbmlzIFZsYXNlbmtvIDx2ZGFAaWxwb3J0LmNvbS51YT4KKwkqIHN1cHBvcnQvZXhwb3J0L2NsaWVudC5jKGNsaWVudF9pbml0IGFuZCBjbGllbnRfZ2V0dHlwZSk6CisJdHJlYXQgTi5OLk4uTiBhcyBhIHNwZWNpYWwgY2FzZSBvZiBNQ0xfU1VCTkVUV09SSyBpbnN0ZWFkIG9mIAorCU1DTF9GUUROCisKKzIwMDUtMDMtMDYgIEcuIEFsbGVuIE1vcnJpcyBJSUkgPGdhbTNAZ2FtMy5uZXQ+CisJKiBzdXBwb3J0L25mcy9jYWNoZWlvLmMocmVhZGxpbmUpOiBDb3VsZCBub3QgcmVhZCBsaW5lcyBncmVhdGVyCisJdGhhbiAxMjggYnl0ZXMuIFsxMTU3NzkxXSAKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydHMubWFuOiBBZGRlZCBhIFNFRSBBTFNPIHNlY3Rpb24gYW5kCisJZml4ZWQgMiB0eXBvcy4gWzEwMTg0NTBdCisKKzIwMDUtMDItMjggIFRyb25kIE15a2xlYnVzdCA8dHJvbmQubXlrbGVidXN0QGZ5cy51aW8ubm8+CisJKiB1dGlscy9zdGF0ZC9ybXRjYWxsLmMoc3RhdGRfZ2V0X3NvY2tldCk6IElmIGEgcG9ydCBudW1iZXIgaXMKKwlleHBsaWNpdGx5IGdpdmVuLCBtYWtlIHN1cmUgdG8gdHJ5IHRvIGJpbmQgdG8gdGhhdC4KKwkKKzIwMDUtMDEtMTEgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDEuMC43LTEuCisJKiBkZWJpYW4vbmZzLWNvbW1vbi5kZWZhdWx0IChORUVEX0lETUFQRCwgTkVFRF9HU1NEKToKKwlEaXNhYmxlIGJ5IGRlZmF1bHQsIG9uIGFkdmljZSBvZiB1cHN0cmVhbS4KKwkqIGRlYmlhbi9uZnMta2VybmVsLXNlcnZlci5kZWZhdWx0IChORUVEX1NWQ0dTU0QpOgorCUxpa2V3aXNlLgorCisJKiB1dGlscy9zdmNnc3NkL01ha2VmaWxlIChwcmVkZXApOiBTeW1ib2xpY2FsbHkgbGluayBkdXBsaWNhdGVkCisJc291cmNlIGZpbGVzLgorCShkaXN0Y2xlYW4pOiBSZW1vdmUgc3ltbGlua3MgdG8gZHVwbGljYXRlZCBmaWxlcy4KKworMjAwNC0xMi0xNyBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKwlSZWxlYXNlIDEuMC43CisKKwkqIGNvbmZpZy5taywgY29uZmlndXJlLmluOiB1cGRhdGUgdmVyc2lvbiBudW1iZXIsIHJ1biBhdXRvY29uZgorCSogY29uZmlndXJlLmluOiByZXF1aXJlIG5mc2lkbWFwLmggaWYgZ3NzIGlzIGVuYWJsZWQuCisJCisyMDA0LTEyLTEwIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCVJlbGVhc2UgMS4wLjctcHJlMgorCQorCSogY29uZmlnLm1rLCBjb25maWd1cmUuaW46IHVwZGF0ZSB2ZXJzaW9uIG51bWJlciwgcnVuIGF1dG9jb25mCisJCisyMDA0LTEyLTEwIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKwkqIFJFQURNRSA6IG5vdGUgZGVwZW5kYW5jeSBvbiBrZXJiZXJvcywgbGliZXZlbnQsIGFuZCBuZnNpZG1hcAorCSogY29uZmlndXJlLmluIDogZmFpbCBpZiAtLWVuYWJsZS1uZnN2NCBhbmQgbGliZXZlbnQgb3IKKwlsaWJuZnNpZG1hcCBhcmUgbWlzc2luZy4KKwkqIGNvbmZpZ3V5cmUuaW46IGltcHJvdmUgbWVzc2FnZSBpZiBrcmI1IHN1cHBvcnQgaXMgbWlzc2luZworCQorMjAwNC0xMi0wNiBQYXVsIENsZW1lbnRzIDxwYXVsLmNsZW1lbnRzQHN0ZWVsZXllLmNvbT4JCisJKiBzdXBwb3J0L2luY2x1ZGUvaGEtY2FsbG91dC5oOiBnZXQgcmV0dXJuIHN0YXR1cyBmcm9tIHdhaXRwaWQKKwljb3JyZWN0bHkuIAorCSogc3VwcG9ydC9pbmNsdWRlL2hhLWNhbGxvdXQuaDogZG9uJ3QgaWdub3JlIFNJR0NITEQgd2hpbGUgd2FpdGluZworCWZvciBhIGNhbGxvdXQgdG8gY29tcGxldGUuCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jKHNpZ3Vzcik6IHByaW50IGN1cnJlbnQgc3RhcnQgd2hlbiByZS1yZWFkaW5nCisJbm90aWZ5IGxpc3QgZHVlIHRvIFNJR1VTUjEKKwkqIHV0aWxzL3N0YXRkL3N2Y19ydW4uYyhteV9zdmNfcnVuKTogY2FsbCBjaGFuZ2Vfc3RhdGUgd2hlbgorCXJlLW5vdGlmeWluZyBjbGllbnRzLgorCQorMjAwNC0xMi0wNiBNYXJjIEVzaGVsIDxlc2hlbEBhbG1hZGVuLmlibS5jb20+CisJKiB1dGlscy9zdGF0ZC9zdmNfcnVuLmMobXlfc3ZjX3J1bik6IGFsbG93IGxvb3AgdG8gZXhpdCB3aGVuIGluCisJTU9ERV9OT1RJRllfT05MWQorCSp1dGlscy9zdGF0ZC9ybXRjYWxsLmMoc3RhdGRfZ2V0X3NvY2tldCk6IGlmIGEgaG9zdG5hbWUgaXMgZ2l2ZW4KKwl0byBzdGF0ZCB3aXRoIC1uLCBwcmVmZXIgaXQncyBJUCBhZGRyZXNzIHRvIHRoZSBkZWZhdWx0IGZvcgorCWxpc3RlbmluZyBvbi4KKwkKKzIwMDQtMTItMDYgQnJ1Y2UgQWxsYW4gPGJ3YUB1cy5pYm0uY29tPgorCSogdXRpbHMvbW91bnRkL2F1dGguYyhhdXRoX3JlbG9hZCkgIENsZWFyIHRoZSAibXlfY2xpZW50IiBjYWNoZSBvbgorCWFuIGF1dGhfcmVsb2FkIHRvIGF2b2lkIG9sZCBkYXRhIGdldHRpbmcgdXNlZC4KKwkKKzIwMDQtMTItMDMgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisJUmVsZWFzZSAxLjAuNy1wcmUxIGZvciB0ZXN0aW5nCisJCisJKiBjb25maWcubWssIGNvbmZpZ3VyZS5pbjogdXBkYXRlIHZlcnNpb24gbnVtYmVyLCBydW4gYXV0b2NvbmYKKwkKKzIwMDQtMTItMDMgVHJvbmQgTXlrbGVidXN0IDx0cm9uZC5teWtsZWJ1c3RAZnlzLnVpby5ubz4KKworCSogdXRpbHMvc3RhdGQvc3RhdGQuYyhtYWluKTogaWdub3JlIFNJR1BJUEUKKwkKKzIwMDQtMTEtMjIgIkouIEJydWNlIEZpZWxkcyIgPGJmaWVsZHNAZmllbGRzZXMub3JnPgorCisJKiB0b29scy9ycGNkZWJ1Zy9ycGNkZWJ1Zy5jOiBzdXBwb3J0IGFsaWFzZXMgIm5mc2RlYnVnIiBhbmQKKwkibmZzZGRlYnVnIiBhbmQgdXBkYXRlIGZsYWcgbmFtZXMuCisJKiBjb25maWd1cmUuaW4sIG5vZGlzdC8qIHJlZGhhdC8qIG5mcy11dGlscy5zcGVjKjogcmVtb3ZlIHJlZGhhdAorCXNwZWNpZmljIGZpbGVzIChhcyBuby1vbmUgYWN0dWFsbHkgdXNlcyB0aGVtLCBlc3BlY2lhbGx5IG5vdAorCXJlZGhhdCksIGFuZCB0aGUgbm9kaXN0IC9ldGMgZmlsZXMgKGFzIHRoZXkgZHJpZnQgb3V0LW9mLWRhdGUsIGFuZAorCXRoZSBkZWJpYW4gZGlyZWN0b3J5IHByb3ZpZGVzIGEgc3VpdGFibGUgZXhhbXBsZS4KKwkqIHV0aWxzL3N2Y2dzc2RfcHJvYy5jKGdldF9pZHMpOiBmaXggbWVtb3J5IGxlYWsKKwkqIHV0aWxzL3N2Y2dzc2Qvc3ZjZ3NzZF9wcm9jLmM6IFJlbHkgb24gY291bnQgb2YgdGhlIG51bWJlciBvZgorCWdyb3VwcyBpbnN0ZWFkIG9mIHVzaW5nIGEgc3BlY2lhbCBndWFyZCB2YWx1ZSB0byBpZGVudGlmeSB0aGUgZW5kCisJb2YgdGhlIGxpc3QuIAorCSogdXRpbHMvaWRtYXBkL2lkbWFwZC5jOiBkb24ndCBhbGxvdyBEZWZhdWx0IGRvbWFpbiBhbmQgYW5vbi11aWQKKwlvciAtZ2lkIHRvIGJlIHNwZWNpZmllZCBvbiBjb21tYW5kIGxpbmUuCisJKiB1dGlscy9pZG1hcGQvaWRtYXBkLmM6IGltcHJvdmUgZXJyb3IgbWVzc2FnZXMKKwkqIHV0aWxzL2lkbWFwZC9pZG1hcGQuYzogUmVvcGVuIG5mc2QgZmlsZXMgb24gc2lnaHVwLiAgQWxsb3dzIHVzCisJdG8gc3RhcnQgdXAgY2xpZW50IHNpZGUgb25seSAoZXZlbiB3aGVuIG5mc2QgbW9kdWxlIG5vdCBsb2FkZWQpLAorCWFuZCB0aGVuIHNpZ2h1cCBsYXRlciBhZnRlciBpbnNtb2RkaW5nIG5mc2QgbW9kdWxlLiAKKwkqIHV0aWxzL2lkbWFwZC9pZG1hcGQuYzogTWFrZSBzdXJlIHdlIGNhdGNoIGFsbCBlcnJvcnMgb24KKwlkYWVtb25pemluZyBieSB3YWl0aW5nIGZvciBjaGlsZCB0byByZXBvcnQgc3VjY2VzZnVsbCBzdGFydHVwCisJdXNpbmcgYSBwaXBlLiAKKwkqIHV0aWxzL2lkbWFwZC9pZG1hcGQuYzogTGV0IGxpYm5mc2lkbWFwZCBwYXJzZSB0aGUgaWRtYXBkLmNvbmYKKwlmaWxlIGZvciB0aGUgZGVmYXVsdCBkb21haW4sIGluc3RlYWQgb2YgZG9pbmcgdGhhdCBvdXJzZWx2ZXMuCisJKiB1dGlscy9nc3NkL2dzc2RfcHJvYy5jOiBNYWtlIHN1cmUgd2UgZ2V0IGFuIGVycm9yIHdoZW4gYSBnc3NkCisJZG93bmNhbGwgZmFpbHMuIAorCSogdXRpbHMvZ3NzZC9nc3NkX3Byb2MuYzogV2Ugd2VyZSBmb3JnZXR0aW5nIHRvIHJlc3RvcmUgdGhlIGV1aWQKKwlvbiBjZXJ0YWluIGZhaWx1cmVzLCB3aGljaCBtZWFudCBnc3NkIGNvdWxkIGdldCBzdHVjayBpbiBhIHN0YXRlCisJd2hlcmUgaXQgZGlkbid0IGhhdmUgcGVybWlzc2lvbnMgdG8gcmVhZCB0aGUgZmlsZXMgaW4gcnBjX3BpcGVmcworCXRoYXQgaXQgbmVlZGVkIHRvLiAKKwkqIHV0aWxzL2dzc2QvZ3NzZF9wcm9jLmM6IFVzZSBsaWJuZnNpZG1hcGQgdG8gbWFwIGdzcyBwcmluY2lwYWxzCisJdG8gdWlkcy4gCisJKiBkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIuZGVmYXVsdDogRG9jdW1lbnQgdGhlIE5FRURfU1ZDR1NTRAorCXZhcmlhYmxlIGluIC9ldGMvZGVmYXVsdC9uZnMta2VybmVsLXNlcnZlci4gCisKKwkKKzIwMDQtMTEtMjIgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHV0aWxzL2V4cG9ydGZzL25mc2QubWFuOiBjb3JyZWN0ZWQgdHlwbyBpbiAuQlIgbWFjcm8gdXNhZ2UgLQorCXJlcG9ydGVkIGJ5IEVyaWMgUmF5bW9uZAorCQorMjAwNC0xMC0xOSAiSi4gQnJ1Y2UgRmllbGRzIiA8YmZpZWxkc0BmaWVsZHNlcy5vcmc+CisKKwkqIHN1cHBvcnQvZ3NzYXBpLyogc3VwcG9ydC9ycGMvKiB1dGlscy9nc3NkLyogdXRpbHMvc3ZjZ3NzZC8qIGV0YworCWluaXRpYWwgc3VwcG9ydCBmb3IgR1NTQVBJIGF1dGhlbnRpY2F0aW9uCisJCisyMDA0LTA5LTE1IE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvc3RhdGQvbW9uaXRvci5jKHNtX3VubW9uXzFfc3ZjKTogaXMgUkVTVFJJQ1RFRF9TVEFURCwgdGhlbgorCWNoZWNrIElQIGFkZHJlc3MgYW5kIGZvcmNlIG15X25hbWUgdG8gMTI3LjAuMC4xIHRvIG1hdGNoIAorCXdoYXQgaGFwcGVucyBpbiBzbV9tb25fMV9zdmMuICBUaGlzIGF2b2lkIHNwdXJpb3VzICJlcnJvbmVvdXMKKwlTTV9VTk1PTiIgbWVzc2FnZXMuCisJKiB1dGlscy9zdGF0ZC5tb25pdG9yLmMoc21fdW5tb25fYWxsXzFfc3ZjKTogbGlrZXdpc2UKKwkKKzIwMDQtMDktMTUgIkouIEJydWNlIEZpZWxkcyIgPGJmaWVsZHNAZmllbGRzZXMub3JnPgkKKworCSogQXNzb3J0ZWQgY2hhbmdlcyB0byBzdXBwb3J0ICJnc3MvKiIgc3R5bGUgYXV0aGVudGljYXRpb24KKwkqIHV0aWxzL2lkbWFwZDogbmV3IGlkbWFwZCBkYWVtb24gZm9yIG5mc3Y0IHVzZXJuYW1lIGxvb2t1cAorCQorMjAwNC0wOS0wNiBUcm9uZCBNeWtsZWJ1c3QgPHRyb25kLm15a2xlYnVzdEBmeXMudWlvLm5vPgorCU5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvbW91bnRkL2F1dGguYyhhdXRoX2F1dGhlbnRpY2F0ZV9pbnRlcm5hbCk6IGZpeAorCXVuaW5pdGlhbHNlZCB2YXJpYWJsZSBwcm9ibGVtIChjYXVzZXMgYmFkIGVycm9yIG1lc3NhZ2VzKS4KKworMjAwNC0wOS0wNiBQYXVsIENsZW1lbnRzIDxwYXVsLmNsZW1lbnRzQHN0ZWVsZXllLmNvbT4KKwlOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyhtYWluKTogc3VwcG9ydCAtLWhhLWNhbGxvdXQgKC1IKSBmb3IKKwlzcGVjaWZ5aW5nIGEgY2FsbG91dCBwcm9ncmFtCisJKiB1dGlscy9tb3VudGQvcm10YWIuYzogQ2FsbCBoYV9jYWxsb3V0IG9uIG1vdW50L3VubW91bnQKKwkqIHV0aWxzL3N0YXRkL21vbml0b3IuYzogQ2FsbCBoYV9jYWxsb3V0IG9uIGFkZC9kZWwgY2xpZW50CisJKiB1dGlscy9zdGF0ZC9ybXRjYWxsLmM6IGFzIGFib3ZlCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jOiBoYW5kbGUgLS1oYS1jYWxsb3V0ICgtSCkKKwkqIHV0aWxzL3N0YXRkL3N2Y19ydW4uYzogY2FsbCBub3RpZnlfaG9zdHMgaXMgd2UgaGF2ZSByZWNlaXZlZCBhCisJc2lnaHVwCisJKiBzdXBwb3J0L2luY2x1ZGUvaGEtY2FsbG91dC5oOiBkZWZpbmUgaGFfY2FsbG91dCBmdW5jdGlvbgorCSAKKwkKKzIwMDQtMDgtMzEgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisJKiB1dGlscy9tb3VudGQvY2FjaGUuYyhjYWNoZV9wcm9jZXNzX3JlcSk6IGNsZWFyIGZkIGFmdGVyCisJcHJvY2Vzc2luZyBzbyBhcyBub3QgdG8gY29uZnVzZWQgbGliYy9zdW5ycGMgaW50byB0aGlua2luZworCWl0IG5lZWQgdG8gZG8gc29tZXRoaW5nIHdpdGggdGhhdCBmZC4KKwkKKzIwMDQtMDgtMzEgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIGRlYmlhbi9uZnMta2VybmVsLXNlcnZlci5pbml0KHN0YXJ0LHN0b3ApIG1vdW50IHRoZSBuZnNkCisJZmlsZXN5c3RlbSwgaWYgYXZhaWxhYmxlLCBiZWZvcmUgc3RhcnRpbmcgbmZzIHNlcnZpY2VzLCBhbmQgCisJdW5tb3VudCBpdCBhZnRlcndhcmRzLgorCSogZXRjL25vZGlzdC9uZnMtc2VydmVyOiBkaXR0bworCSogZXRjL3JlZGhhdC9uZnMuaW5pdDogbGlrZXdpc2UKKwkqIGV0Yy9yZWRoYXQvbmZzOiBhZGQgIk1PVU5UX05GU0QiIGZsYWcgdG8gY29udHJvbCBhYm92ZS4KKwkKKzIwMDQtMDYtMDggTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmM6IERvbid0IHJtdGFiX3JlYWQgaWYgbmV3X2NhY2hlLCBpdAorCSAgaXNuJ3QgbmVjZXNzYXJ5LgorCSogc3VwcG9ydC9uZnMvY2FjaGVpby5jKGNhY2hlX2ZsdXNoKTogQ2hhbmdlIG9yZGVyIGluIHdoaWNoIGNhY2hlcworCSAgYXJlIGZsdXNoZWQgc28gdGhhdCBkZXBlbmRhbmNpZXMgZG9uJ3Qga2VlcCB0aGluZ3MgaW4gdGhlIGNhY2hlCisJICB0b28gbG9uZy4KKwkKKzIwMDQtMDMtMTggIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDEuMC42LTIuCisKKzIwMDQtMDItMjQgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisJZnJvbSAiSi4gQnJ1Y2UgRmllbGRzIiA8YmZpZWxkc0BmaWVsZHNlcy5vcmc+CisKKwkqIHV0aWxzL21vdW50ZC9jYWNoZS5jOiBjYWxsIGF1dGhfcmVsb2FkIHRvIG1ha2Ugc3VyZSBhdXRoIGRhdGEgaXMKKwljdXJyZW50IGJlZm9yZSByZXNwb25kaW5nIHRvIGtlcm5lbCB1cGNhbGwuCisJCisyMDA0LTAyLTI0IE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCUJhc2VkIG9uIHBhdGNoIGZyb20gIEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KKworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0cy5tYW46IERvY3VtZW50IGZzaWQ9IG9wdGlvbi4KKwkKKzIwMDMtMDktMTUgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwlSZWxlYXNlIDEuMC42CisKKwkqIHJ1bGVzLm1rOiBBZGQgZGVwOiBydWxlIHdoZW4gbm8gT0JKUywgc28gIm1ha2UgZGVwIiB3b3JrcyBpbgorCXN1cHBvcnQvaW5jbHVkZSwgYW5kIGRlcGVuZCBpbiAicHJlZGVwIgorCSogc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUsIHRvb2xzL3JwY2dlbi9NYWtlZmlsZSwKKwl1dGlscy9zdGF0ZC9NYWtlZmlsZTogYWRkICJwcmVkZXAiIHJ1bGUgc28gdGhhdCAibWFrZSBkZXAiIHdvcmtzLgorCSogTWFrZWZpbGU6IGFsbG93IGEgc2ltcGxlICJtYWtlIiB0byBydW4gLi9jb25maWd1cmUgYW5kICJtYWtlIGRlcCIKKwlpZiBuZWVkZWQuCisJKiBjb25maWd1cmUuaW4sIG5mcy11dGlscy5zcGVjOiBVcGRhdGUgdmVyc2lvbiB0byAxLjAuNgorCSogcnVuIGF1dG9jb25mCisJCisyMDAzLTA5LTEyICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAxLjAuNi0xLgorCisyMDAzLTA5LTEyIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMobWFpbik6IEltcG9zZSBGRF9TRVRTSVpFIGFzIGFuIHVwcGVyIGxpbWl0CisJZm9yIFJMSU1JVF9OT0ZJTEUKKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmMobWFpbik6IERpdHRvLgorCisJICAgbWljaGFlbCA8bWljaGFlbEBuZXdkcmVhbS5uZXQ+IGRpc2NvdmVyZWQgdGhhdCBzdmNfc2V0cmVxc2l6ZQorCSAgIGluIGdsaWJjIGNhbiBzZWdmYXVsdCBpZiBSTElNSVRfTk9GSUxFIGlzIGJpZ2dlciB0aGFuCisJICAgRkRfU0VUU0laRSwgc28gYSBzaW1wbGUgc29sdXRpb24gaXMgdG8gaW1wb3NlIGEgaGFyZCBsaW1pdC4KKworMjAwMy0wOS0wOSAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIGRlYmlhbi9jaGFuZ2Vsb2c6IFZlcnNpb24gMS4wLjUtMy4KKwkqIHN1cHBvcnQvZXhwb3J0L2hvc3RuYW1lLmMgKGdldF9yZWxpYWJsZV9ob3N0YnlhZGRyKTogRml4IGNyYXNoCisJb24gaW52YWxpZCByZXZlcnNlIEROUy4KKwkqIHV0aWxzL3Nob3dtb3VudC9zaG93bW91bnQuYyAobWFpbik6IEZpeCBpbmV0X250b2EoKSBwYXJhbWV0ZXIuCisJKiB0b29scy9ycGNnZW4vcnBjX2NvdXQuYyAocHJpbnRfaGVhZGVyKTogUmVtb3ZlIHVudXNlZCB2YXJzLgorCSogdG9vbHMvcnBjZ2VuL3JwY19wYXJzZS5jIChkZWZfdW5pb24pOiBMaWtld2lzZS4KKworMjAwMy0wOC0yMiAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIHV0aWxzL3N0YXRkL3tsb2cuaCxsb2cuY306IFJlbmFtZSBsb2coKSB0byBub3RlKCkgYW5kIExfKiB0bworCU5fKiwgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBJU08gQyBidWlsdC1pbiBsb2coKSBmdW5jdGlvbi4KKwkqIHV0aWxzL3N0YXRkLyouYzogVXNlIG5vdGUoKS4KKworMjAwMy0wOC0yMCAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIGRlYmlhbi9jaGFuZ2Vsb2c6IFZlcnNpb24gMS4wLjUtMi4KKworMjAwMy0wOC0xMSBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvbW91bnRkL2NhY2hlLmMoY2FjaGVfZ2V0X2ZpbGVoYW5kbGUpOiBjbG9zZSB0aGUgZmlsZWhhbmRsZQorCWJlZm9yZSByZXR1cm5pbmcuCisJCisyMDAzLTA4LTA0IE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L2luY2x1ZGUvbmZzL2V4cG9ydC5oLCBzdXBwb3J0L25mcy9leHBvcnRzLmMsCisJdXRpbHMvZXhwb3J0ZnMvZXhwb3J0cy5jLCB1dGlscy9tb3VudGQvbW91bnRkLmM6ICBjaGFuZ2UKKwlORlNFWFBfQ1JPU1NNTlQgdG8gTkZTRVhQX0NST1NTTU9VTlQgdG8gYXZvaWQgY29uZnVzaW9uIHdpdGggb2xkZXIKKwltZWFuaW5nLiBBbHNvIHJlbW92ZSBtZWFuaW5nbGVzcworCU5GU0VYUF97VUlETUFQLEtFUkJFUk9TLFNVTlNFQ1VSRX0KKwkKKzIwMDMtMDgtMDQgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHN1cHBvcnQvZXhwb3J0L3h0YWIuYywgc3VwcG9ydC9pbmNsdWRlL25mc2xpYi5oLAorCXN1cHBvcnQvbmZzL2NhY2hlaW8uYywgc3VwcG9ydC9uZnMvbmZzc3ZjLmMsCisJdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYywgdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMubWFuLAorCXV0aWxzL2V4cG9ydGZzL25mc2QubWFuLCB1dGlscy9tb3VudGQvY2FjaGUuYzogc3VwcG9ydAorCS9wcm9jL2ZzL25mc2QvKiBhcyBhIHBlcmZlcnJlZCBhbHRlcm5hdGUgdG8gL3Byb2MvZnMvbmZzLyoKKwkobmZzLXV0aWxzLTEuMC41LXBvc3QyKQorCQorMjAwMy0wOC0wNCBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9uZnMvbmZzZXhwb3J0LmM6IG9wZW4gY2hhbm5lbCBmaWxlIE9fV1JPTkxZIHdoZW4KKwlvbmx5IHdyaXRpbmcuCisJKiB1dGlscy9tb3VudGQvY2FjaGUuYzogbWFpbnRhaW4gbW91bnRsaXN0IHdoZW4gbmV3X2NhY2hlIGlzCisJYWN0aXZlLiBBbHNvIHVzZSBPX1dST05MWSBmb3IgY2hhbm5lbCBmaWxlcy4KKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuaDogbW91bnRsaXN0X3tkZWwsYWRkfSBub3cgdGFrZSBhIGhvc3QgbmFtZQorCXJhdGhlciB0aGFuIGFuIG5mc19leHBvcnQuCisJKiB1dGlscy9tb3VudGQvcm10YWIuYzogZGl0dG8uCisJKG5mcy11dGlscy0xLjUuMC1wb3N0MSkKKwkKKzIwMDMtMDctMjQgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiBzdXBwb3J0L25mcy94bG9nLmMgKHhsb2cpOiBSZXZpc2UgYnVmZmVyLW92ZXJmbG93IGZpeCB0bworCXVzZSBEZWJpYW4gc2VjdXJpdHkgdGVhbSdzIGNsZWFuZXIgYXBwcm9hY2guCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDEuMC41LTEuCisJKiBkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIuaW5pdDogQ29zbWV0aWMgY2hhbmdlcy4KKworMjAwMy0wNy0xOCBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCVJlbGVhc2UgMS4wLjU6CisJIDEuMC40IHdhcyBhIGJpdCBvZiBhIGJyb3duLXBhcGVyLWJhZy1yZWxlYXNlIGJlY2F1c2Ugb2YgdGhlIGV4dHJhCisJICdmcmVlJyBpbiBhdXRoLmMuICBTbyBJJ20gcmVsZWFzaW5nIHRoaXMganVzdCBhIGZldyBkYXlzIGxhdGVyLgorCisJKiBzdXBwb3J0L25mcy9jYWNoZWlvLmMoY2FjaGVfZmx1c2gpOiBDb3JyZWN0IHRlc3QgZm9yICdvcGVuCisJZmFpbGVkJworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYyhtYWluKTogSWYgIi1mIiBnaXZlbiBhcyBsb25lIG9wdGlvbiwKKwljaGVjayBpZiBuZXdfY2FjaGUgaXMgZW5hYmxlZCwgZXJyb3IgaWYgbm90LCBmbHVzaCBhbmQgZXhpdCBpZiBpdAorCWlzLiAKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLm1hbjogRXhwbGFpbiAtZiBvcHRpb24gYW5kIGV4cGxhaW4gdGhlCisJdHdvIGRpZmZlcmVudCBtb2RlcyB0aGF0IGV4cG9ydGZzIGNhbiB3b3JrIGluLgorCSogdXRpbHMvbW91bnRkL21vdW50ZC5jOiBEbyBub3QgY2hhbmdlIFJMSU1JVF9OT0ZJTEUgaWYgdGhlIC1vCisJb3B0aW9uIHdhc24ndCBnaXZlbi4KKwkqIHV0aWxzL21vdW50ZC9tb3VudGQubWFuOiBSZWNvcmQgdGhlIGNoYW5nZSBpZiBkZWZhdWx0IGJlaGF2aW91cgorCWZvciBSTElNSVRfTk9GSUxFLgorCSogY29uZmlndXJlLmluLCBuZnMtdXRpbHMuc3BlYzogdXBkYXRlIHZlcnNpb24gdG8gMS4wLjUgYW5kCisJcnVuIGF1dG9jb25mCisJCisyMDAzLTA3LTE1IE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMobWFpbik6IGdldG9wdCBzdHJpbmcgZml4IGZvciAnbycKKwkqIHV0aWxzL21vdW50ZC9hdXRoLmMoYXV0aF9hdXRoZW50aWNhdGUpOiByZW1vdmUgZXh0cmEgJ2ZyZWUnCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jKG1haW4pOiBtYWtlICdleHBvcnRmcyAtZicganVzdCBmbHVzaAorCXRoZSBjYWNoZXMuCisJKiBzdXBwb3J0L2luY2x1ZGUvbmZzL2V4cG9ydC5oOiBSZXNlcnZlIGEgYml0IGZvciBwb3NzaWJsZSBBQ0wKKwlyZWxhdGVkIHVzZS4KKwkKKzIwMDMtMDctMDMgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHV0aWxzL2V4cG9ydGZzL25mc2QubWFuOiBuZXcgbWFuIHBhZ2UgZm9yIG5mc2QgZmlsZXN5c3RlbS4gQWxzbworCWFzc29ydGVkIGNoYW5nZWQgdG8gY29wZSB3aXRoIHNlY3Rpb24gNyBvZiB0aGUgbWFudWFsLgorCSogY29uZmlndXJlLmluLCBuZnMtdXRpbHMuc3BlYzogVXBkYXRlIHZlcnNpb24gdG8gMS4wLjQKKwkqIHJ1biBhdXRvY29uZgorCisJVGhpcyBpcyBhICdwcmUtcmVsZWFzZScgZm9yIDEuMS4wICBIb3BlZnVsbHkgMS4xLjAgd2lsbCBiZSB0aGUKKwliYXNlbGluZSBmb3IgMi42IGFuZCAyLjguICBJLmUuIGl0IHNob3VsZCBjb250aW51ZSB0byB3b3JrIHJpZ2h0CisJdGhyb3VnaCB0aGUgMi44IChvciAzLjApIGtlcm5lbCBzZXJpZXMuICBQcmV2aW91cyByZWxlYXNlcyB3b250LgorCisyMDAzLTA3LTA0IE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgkKKwlTdGV2ZSBEaWNrc29uIDxTdGV2ZURAcmVkaGF0LmNvbT4KKworCXN0YXRkIGNsZWFudXA6CisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jOiBjcmVhdGUgYSBwaWRmaWxlIHdpdGggcGlkIG9mIHN0YXRkLCBhbmQKKwl0cnVuY2F0ZSBpdCB3aGVuIHN0YXRkIGV4aXN0cy4KKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmM6IGRyb3AgcHJpdnMgYnkgc2V0dWlkIHRvIG93bmVyIG9mIFNNX0RJUiwKKwlhbmQgd2FybiBpZiB0aGlzIGlzIHJvb3QuCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jOiB3aGVuIHN0YXRkIGZvcmtzLCBjb25uZWN0IGNoaWxkIHRvIHBhcmVudAorCXdpdGggYSBwaXBlLCBhbmQgc2VuZCBhIGJ5dGUgZG93biB0aGUgcGlwZSBvbmNlIHRoZSBjaGlsZCBpcworCXdvcmtpbmcgcHJvcGVybHkuCisJKiBNYWtlZmlsZTogY3JlYXRlIGFuZCBjaG93biBzbSwgc20uYmFrLCBzdGF0ZSB3aGVuICJtYWtlIGluc3RhbGwiCisJKiBjb25maWd1cmUuaW46IGFkZCAtLXdpdGgtc3RhdGR1c2VyPSBvcHRpb24gd2hpY2ggZGVmYXVsdHMgdG8KKwkicnBjdXNlciIgb3IgIm5vYm9keSIKKwkqIGNvbmZpZy5tay5pbjogcGFzcyAic3RhdGR1c2VyIiB0aHJvdWdoIHRvIE1ha2VmaWxlCisJCisyMDAzLTA3LTAzIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L2luY2x1ZGUvbmZzL25mcy5oOiBNYWtlIHN1cmUgY29ycmVjdCBfX2tlcm5lbF9kZXZfdCBpcworCXVzZWQgYXMgdGhlIHNpemUgd2FzIGNoYW5nZWQgc29tZXdoZXJlIGluIDIuNS42MC0yLjUuNzAuICBXaXRob3V0CisJdGhpcyBuZnMtdXRpbHMgY29tcGlsZXMgYWdhaW5zdCAyLjYgaGVhZGVycyB3aWxsIG5vdCB3b3JrIG9uIGEKKwkyLjQga2VybmVsLgkKKwkKKzIwMDMtMDctMDMgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHN1cHBvcnQvbmZzL25mc3N2Yy5jKG5mc3N2Yyk6IElmIC9wcm9jL2ZzL25mcy90aHJlYWRzIGV4aXN0cywKKwlzZXQgbnVtYmVyIG9mIHRocmVhZHMgYnkgd3JpdGluZyB0byB0aGVyZS4gIFRoaXMgbWVhbnMgaXQgd2lsbAorCXN0aWxsIHdvcmsgd2hlbiB0aGUgc3lzY2FsbCBpbnRlcmZhY2UgZ29lcyBhd2F5IGluIDIuNy4KKworMjAwMy0wNy0wMyBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKwlmdW1paGlrbyBrYWt1bWEgPGtha215QG12aC5iaWdsb2JlLm5lLmpwPgorCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jKHVuZXhwb3J0ZnMpOiBpbXByb3ZlIGhvc3QgY29tcGFyaXNvbgorCXNvIGFzIHRvIG9ubHkgZXhwb3J0IHRoZSB3aWxkY2FyZCBleHBvcnRzIHRoYXQgd2VyZSBhc2tlZCBmb3IuCisJKiBzdXBwb3J0L2V4cG9ydC9leHBvcnQuYyhleHBvcnRfYWxsb3dlZCk6IGNoYW5nZWQgdG8gcmV0dXJuIHRoZQorCW5mc19leHBvcnQgcmF0aGVyIHRoYW4gYSAic3RydWN0IGV4cG9ydGVudCIsIGFzIG1fY2hhbmdlZCBpcworCW5lZWRlZCBieSBjYWxsZWQKKwkqIHN1cHBvcnQvZXhwb3J0L3JtdGFiLmMocm10YWJfcmVhZCk6IG1vZGlmaWVkIHRvIGRlYWwgd2l0aAorCWludGVyZmFjZSBjaGFuZ2UgZm9yIGV4cG9ydF9hbGxvd2VkKCksIGFuZCBlbmhhbmNlZCB0byBwcmVzZXJ2ZQorCW1fY2hhbmdlZCBmbGFnIHdoZW4gYSB3aWxkLWNhcmQgZXhwb3J0IGNhdXNlcyB0aGUgY3JlYXRpb24gb2YKKwlhIG5vbi13aWxkY2FyZCBleHBvcnQuCisJCisyMDAzLTA3LTAyIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCVN0ZXZlIERpY2tzb24gPFN0ZXZlREByZWRoYXQuY29tPgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLm1hbjogQWRkIHZhbGlkIGtpbmRzIG9mIGRlYnVnZ2luZy4KKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyhtYWluKTogaWdub3JlIFNJR1BJUEUKKwkqIHV0aWxzL25mc3N0YXQvbmZzc3RhdC5jOiBmaW5lLXR1bmUgcHJpbnRpbmcgb2Ygd2FybmluZyBzbworCXdlIGRvbid0IGdldCB3YXJuaW5ncyBhYm91dCB1bmF2YWlsYWJsZSBzdGF0cyB0aGF0IHdlcmVuJ3QgYXNrZWQKKwlmb3IuCisJCisyMDAzLTA2LTI0IE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L25mcy9uZnNleHBvcnQuYyhleHBfdW5leHApOiBXaGVuIHVuZXhwb3J0aW5nIGZpbGVzeXN0ZW1zCisJdmlhIC9ycGMvbmV0L3JwYy9uZnNkKi9jaGFubmVsLCBzZXQgdGhlIGV4cGlyeSBkYXRlIHRvIDEsIG5vdAorCSdmb3JldmVyJywgc28gdGhpbmdzIGRpc2FwcGVhciBvdXQgb2YgdGhlIGNhY2hlIHJhdGhlciB0aGFuIGp1c3QKKwliZSBpZ25vcmVkLiAKKwkKKzIwMDMtMDYtMTYgICJKLiBCcnVjZSBGaWVsZHMiIDxiZmllbGRzQGZpZWxkc2VzLm9yZz4KKworCSogdXRpbHMvbW91bnRkL2NhY2hlLmMobmZzZF9maCk6IGRvbid0IGV4cG9ydCB0aGUgZXhwb3J0X2VudAorCWlmIGl0IHdhc24ndCBmb3VuZC4KKworMjAwMy0wNi0xNiAgTmVpbEJyb3duCTxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIGRlYmlhbi9uZnMta2VybmVsLXNlcnZlci5pbml0LGV0Yy9ub2Rpc3QvbmZzLXNlcnZlciwKKwlldGMvcmVkaGF0L25mcy5pbml0OiB3aGVuIGNoZWNraW5nIGlmIFYzIGlzIHN1cHBvcnRlZCwgbWFrZSBzdXJlCisJbmZzIHNlcnZlciAna25vd3MnIGFib3V0IDEyNy4wLjAuMSBmaXJzdC4KKwkKKzIwMDMtMDYtMTAgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiBzdXBwb3J0L25mcy94bG9nLmMgKHhsb2cpOiBGaXggb2ZmLWJ5LW9uZSBidWZmZXIgb3ZlcmZsb3cgYnVnLgorCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAxLjAuMy0yLgorCisyMDAzLTA1LTMwIE1pY2hhZWwgR3JpZmZpdGggPGdyaWZAbWljaGFlbGdyaWZmaXRoLmNvbT4KKwlOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCXV0aWxzL25mc3N0YXQvbmZzc3RhdC5jKHByaW50X2NhbGxzdGF0cyk6IHVzZSB1bnNpZ25lZAorCWxvbmcgbG9uZyB0byBhdm9pZCBvdmVyZmxvdyB3aGVuIHByaW50aW5nIHN0YXRzLgorCQorMjAwMy0wNS0zMCAgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHN1cHBvcnQvZXhwb3J0L2V4cG9ydC5jLCBzdXBwb3J0L2luY2x1ZGUvbmZzbGliLmgsCisJc3VwcG9ydC9uZnMvZXhwb3J0LmMsIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMsCisJdXRpbHMvbW91bnRkL21vdW50ZC5jOiBuZXcgZXhwb3J0IG9wdGlvbiAibW91bnRwb2ludCIKKwlJZiBubyBwYXRoIGlzIGdpdmVuLCB0aGVuIHRoZSBleHBvcnQgcG9pbnQgbXVzdCBiZSBhCisJbW91bnQgcG9pbnQsIG9yIGl0IHdvbid0IGJlIGV4cG9ydGVkLiAgSWYgYSBwYXRoIGlzIAorCWdpdmVuIChlLmcuIG1vdW50cG9pbnQ9L3BhdGgpIHRoZW4gdGhhdCBwYXRoIG11c3QgYmUKKwlhIG1vdW50cG9pbnQgb3IgdGhlIGV4cG9ydHBvaW50IHdvbid0IGJlIGV4cG9ydGVkLgorCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMubWFuOiBkb2N1bWVudCBtb3VudHBvaW50IG9wdGlvbi4KKwkqIHN1cHBvcnQvbWlzYy9tb3VudHBvaW50LmM6IE5ldyBmaWxlIHdpdGggaXNfbW91bnRwb2ludCgpCisJdG8gZGV0ZXJtaW5lIGlmIHNvbWV0aGluZyBpcyBhIG1vdW50cG9pbnQuCisJCisyMDAzLTA1LTIzICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvbW91bnRkL2NhY2hlLmMoY2FjaGVfZ2V0X2ZpbGVoYW5kbGUpOiB0YWtlIGEgc2VwYXJhdGUgcGF0aAorCWFyZ3VtZW50IGFzIHdlIG1pZ2h0IG5vdCBiZSBnZXR0aW5nIHRoZSBmaWxlaGFuZGxlIGZvciB0aGUKKwltb3VudHBvaW50LgorCSogdXRpbHMvbW91bnRkL21vdW50ZC5jKGdldF9yb290ZmgpOiBwYXNzIHJlYWwgcGF0aCB3aGVuIGNhbGxpbmcKKwljYWNoZV9nZXRfZmlsZWhhbmRsZS4KKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyhnZXRfcm9vdGZoKTogY2hlY2sgZXhwb3J0IHBvaW50IGFuZAorCXJlcXVlc3RlZCBkaXJlY3RvcnkgYXJlIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0sIGFuZCBjb21wbGFpbiBpZgorCW5vdC4KKwkKKzIwMDMtMDUtMjIgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB1dGlscy9tb3VudGQvYXV0aC5jKGF1dGhfYXV0aGVudGljYXRlX2ludGVybmFsKTogbWFrZSBzdXJlCisJcG9ydG51bWJlciBpcyBzdGlsbCBjaGVja2VkIHdoZW4gdXNpbmcgbmV3IGNhY2hlIGxvb2t1cC4KKwkKKzIwMDMtMDUtMjEgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jOiBVc2UgY2hlY2tfbmV3X2NhY2hlIGFuZCBjYWNoZV9mbHVzaAorCSBEb24ndCBhY3R1YWxseSB0YWxrIHRvIGtlcm5lbCB3aGVuIG5ldyBjYWNoZSBpcyBpbiBlZmZlY3QsIGV4Y2VwdAorCSB0byBmbHVzaAorCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYzogYWRkIC1mIG9wdGlvbiB0byBmdWxseSBmbHVzaCBjYWNoZS4KKwkqIHN1cHBvcnQvZXhwb3J0L3h0YWIuYzogT25seSByZW5hbWUgbmV3IHh0YWIgaW50byBwbGFjZSBpZiBpdCBoYXMKKwkgY2hhbmdlZCwgdGh1cyBwcmVzZXJ2aW5nIG1vZGlmeSBkYXRlIGZvciBleHBvcnRmcyB0byB1c2Ugd2hlbgorCSBmbHVzaGluZy4KKwkqIHN1cHBvcnQvbmZzL2NhY2hlaW8uYzogQWRkIGNhY2hlX2ZsdXNoCisJKiBzdXBwb3J0L2V4cG9ydC94dGFiLmM6IE9ubHkgcmVuYW1lIG5ldyB4dGFiIGludG8gcGxhY2UgaWYgaXQgaGFzCisJIGNoYW5nZWQsIHRodXMgcHJlc2VydmluZyBtb2RpZnkgZGF0ZSBmb3IgZXhwb3J0ZnMgdG8gdXNlIHdoZW4KKwkgZmx1c2hpbmcuCisJCisyMDAzLTA1LTIxICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9leHBvcnQvY2xpZW50LmM6IEFkZCBjbGllbnRfY29tcG9zZSwgY2xpZW50X21lbWJlciB0bworCWhhbmRsZSBuZXcgY29tcG9zaXRlIGNsaWVudCBuYW1lcworCSogc3VwcG9ydC9pbmNsdWRlL2V4cG9ydGZzLmg6IERlY2xhcmUgYWJvdmUgZnVuY3Rpb25zLgorCSogdXRpbHMvbW91bnRkL2F1dGguYzogdXNlIGNsaWVudF9jb21wb3NlIHRvIGRldGVybWluZSBjYWxsaW5nCisJY2xpZW50IGlmIG5ldyBjYWNoZSBpcyBiZWluZyB1c2VkLgorCSogdXRpbHMvbW91bnRkL2F1dGguYzogY2FsbCBjYWNoZV9leHBvcnQgdG8gZXhwb3J0IGEgZmlsZXN5c3RlbSBpZgorCW5ld19jYWNoZSwgY2hlY2sgaWYgbmV3IGNhY2hlIGlzIHVzZWQsIGFuZCBjYWxsIG15X3N2Y19ydW4gaW5zdGVhZAorCW9mIHN2Y19ydW4KKwkqIHV0aWxzL21vdW50ZC9zdmNfcnVuLmM6IG5ldyBmaWxlIGRlZmluaW5nIG15X3N2Y19ydW4KKwkqIHV0aWxzL21vdW50ZC9jYWNoZS5jOiBuZXcgZmlsZSBmb3IgaGFuZGxpbmcgY2FjaGUgdXBjYWxscy4KKwkqIHN1cHBvcnQvbmZzL2NhY2hlaW8uYyhjaGVja19uZXdfY2FjaGUpOiBuZXcgZnVuY3Rpb24gdG8gY2hlY2sgaWYKKwluZXcgY2FjaGUgc2hvdWxkIGJlIHVzZWQuCisJCisJCisyMDAzLTA1LTIxICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9pbmNsdWRlL25mcy9leHBvcnQuaDogTmV3IENST1NTTU5UIGRpc3RpbmN0IGZyb20gTk9ISURFCisJKiBzdXBwb3J0L25mcy9leHBvcnRzLmM6IE1ha2UgQ1JPU1NNTlQgZGlzdGluY3QgZnJvbSBOT0hJREUKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMoZHVtcCk6IGRpdHRvCisJCisyMDAzLTA1LTIxICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9leHBvcnQvaG9zdG5hbWUuYyhnZXRfcmVsaWFibGVfaG9zdGJ5YWRkcik6IG5ldyBmdW5jdGlvbgorCXRvIGdldCBob3N0IG5hbWUgZnJvbSBhZGRyZXNzIHdpdGggZnVsbCBjaGVja2luZyBvZiBhdXRoZW50aWNpdHkuCisJKiBzdXBwb3J0L2luY2x1ZGUvbWlzYy5oOiBkZWNsYXJlIGFib3ZlIGZ1bmN0aW9uCisJKiB1dGlscy9tb3VudGQvYXV0aC5jKGF1dGhfYXV0aGVudGljYXRlX2ludGVybmFsKTogcmVtb3ZlIGFsbAorCWxvZ2ljIGZvciBhdXRoZW50aWNhdGluZyBhZGRyZXNzLgorCSogdXRpbHMvbW91bnRkL2F1dGguYyhhdXRoX2F1dGhlbnRpY2F0ZSk6IGNhbGwgbmV3CisJZ2V0X3JlbGlhYmxlX2hvc3RieWFkZHIgdG8gdG8gaG9zdG5hbWUgbG9va3VwIGJlZm9yZSBjYWxsaW5nIF9pbnRlcm5hbC4KKwkKKwkKKzIwMDMtMDMtMzAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB0b29scy9ycGNnZW4vcnBjX21haW4uYyhmaW5kX2NwcCk6IHJlbW92ZWQKKwkqIHRvb2xzL3JwY2dlbi9ycGNfbWFpbi5jKG9wZW5faW5wdXQpOiB1c2UgZXhlY3ZwIHRvIGZpbmQgImNwcCIsIAorCXRoZW4gdHJ5IGhhcmQtY29kZWQgcGF0aHMuCisJCisyMDAzLTAzLTI2ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAxLjAuMy0xLgorCisyMDAzLTAzLTI2IE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB1dGlscy9tb3VudGQvcm10YWIuYyAoc2xpbmtfc2FmZV9yZW5hbWUpOiByZWFsX25ld3BhdGggc2hvdWxkIGJlCisJImNvbnN0IGNoYXIqIiwgbm90ICJjaGFyKiIuCisKKzIwMDMtMDMtMjYgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMS4wLjMiLgorCSogbmZzLXV0aWxzLnNwZWM6IExpa2V3aXNlLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworMjAwMy0wMy0yNiBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9uZnMvY2FjaGVpby5jOiBOZXcgRmlsZSAtIHN1cHBvcnQgZm9yIHJlYWQvd3JpdGluZworCXRvIGV4cG9ydCBjYWNoZSBpbiAvcHJvYy9ycGMvKi9jaGFubmVsCisJKiBzdXBwb3J0L25mcy9NYWtlZmlsZTogY29tcGlsZSBjYWNoZWlvLmMKKwkqIHN1cHBvcnQvaW5jbHVkZS9uZnNsaWIuaDogZGVjbGFyZSBjYWNoZWlvLmMgZnVuY3Rpb25zCisJKiBzdXBwb3J0L25mcy9uZnNleHBvcnQuYzogZXhwb3J0IGFuZCB1bmV4cG9ydCB0aHJvdWdoCisJL3Byb2MvcnBjLyovY2hhbm5lbCBpZiBwb3NzaWJsZSwgYXMgb2xkIHN5c2NhbGwgaW50ZXJmYWNlCisJbWF5IG5vdCBzdXJ2aXZlIGludG8gMi42IG9uIGFsbCBhcmNoaXRlY3R1cmVzLgorCQorMjAwMy0wMi0xOSBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4JCisJQmVuIExlc2xpZSA8YmVubm9Ac2VzZ3JvdXAubmV0PgorCisJKiBzdXBwb3J0L25mcy9ycGNtaXNjLmMocnBjX2luaXQpOiAgY2hhbmdlIHRlc3QgZm9yIGlnbm9yaW5nCisJImRlZnBvcnQiIGZyb20gKF9fcnBjZmR0eXBlID09IDApIHRvIChfX3JwY3Btc3RhcnQ9PTApLiAgVGhlCisJZm9ybWVyIHdvdWxkIGluY29yZWN0bHkgaWdub3JlIGRlZnBvcnQgaWYgdGhlIGFwcGxpY2F0aW9uIAorCWV4cGxpY2l0bHkgc2V0IF9fcnBjZmR0eXBlLiAgVGhlIGxhdGVyIGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgdGhlCisJc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgY2FzZSB3aGVyZSBzdGRpbiBpcyBhbiBpbnRlcm5ldCBzb2NrZXQuCisKKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyhtYWluKTogQWRkICduJyB0byBvcHRpb24gbGlzdCBpbgorCWdldG9wdF9sb25nIGFzIHRoaXMgaXMgYSBzaG9ydCBmb3JtIG9mIC0tbm8tdGNwIHdoaWNoIHdhbnQgYmVpbmcKKwljaGVja2VkLgorCQorMjAwMy0wMi0xMiAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIGRlYmlhbi9jaGFuZ2Vsb2c6IFZlcnNpb24gMS4wLjItMi4KKworMjAwMi0xMS0yNyAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIHV0aWxzL21vdW50ZC9ybXRhYi5jIChzbGlua19zYWZlX3JlbmFtZSk6IEZpeCBvZmYtYnktb25lIGJ1ZmZlcgorCW92ZXJmbG93IGJ1Zy4gIFJlZm9ybWF0IHBlciByZXN0IG9mIHNvdXJjZSBmaWxlLgorCisyMDAyLTExLTE5ICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0cy5tYW46IENvcnJlY3Qgbm90ZXMgYWJvdXQgd2hldGhlciB0aGUgd2lsZAorCWNhcmQgY2hhcmFjdGVycyBtYXRjaCBhIHBlcmlvZC4gIFRoZXkgZG8uCisJCisyMDAyLTEwLTE1ICBKdWFuIEdvbWV6IDxqdWFuZ0B1cy5pYm0uY29tPgorCisJKiB1dGlscy9tb3VudGQvcm10YWIuYyAoc2xpbmtfc2FmZV9yZW5hbWUpOiBOZXcuIFN1cHBvcnQKKwlzeW1saW5rLgorCShtb3VudGxpc3RfYWRkKTogQ2FsbCBzbGlua19zYWZlX3JlbmFtZSBpbnN0ZWFkIG9mIHJlbmFtZS4KKworMjAwMi0xMC0xMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogc3VwcG9ydC9pbmNsdWRlL2V4cG9ydGZzLmggKGV4cG9ydF9lcnJubyk6IE5ldy4KKworCSogc3VwcG9ydC9uZnMvZXhwb3J0cy5jOiBJbmNsdWRlIDxlcnJuby5oPi4KKwkoZXhwb3J0X2Vycm5vKTogTmV3LgorCShnZXRleHBvcnRlbnQpOiBTZXQgZXhwb3J0X2Vycm5vIHRvIEVJTlZBTCBmb3IgYmFkIG9wdGlvbi4KKwkocGFyc2VvcHRzKTogTGlrZXdpc2UuCisJUmVwb3J0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVmYXVsdCBzeW5jL2FzeW5jIG9wdGlvbi4KKworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYyAobWFpbik6IEluaXRpYWxpemUgZXhwb3J0X2Vycm5vIHRvCisJMC4gUmV0dXJuIGV4cG9ydF9lcnJuby4KKworMjAwMi0xMC0xMSAgSnVhbiBHb21leiAgPGdvbWV6QGNzLnNqc3UuZWR1PgorCU5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJdXRpbHMvc3RhdGQvc3RhdGQuYyhraWxsZXIpOiBkb24ndCBwbWFwX3Vuc2V0IGlmIGluIG5vdGlmeV9vbmx5IG1vZGUKKwl1dGlscy9zdGF0ZC9zdGF0ZC5jKG1haW4pOiBkb24ndCBwbWFwX3Vuc2V0IGlmIGluIG5vdGlmeV9vbmx5IG1vZGUKKwkKKzIwMDItMDktMTYgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zdmMuYyAobWFpbik6IFVzZSBpbnQgZm9yIHZhbHVlIG9mIGdldG9wdC4KKworMjAwMi0wOS0xNSAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIHN1cHBvcnQvbmZzL3JwY21pc2MuYyAocnBjX2luaXQpOiBBbGxvdyBzdGRpbiB0byBiZSBhIG5vbi1JTkVUCisJc29ja2V0LCBhcyBvY2N1cnMgd2hlbiBydW4gZnJvbSBzc2hkLgorCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAxLjAuMi0xLgorCisyMDAyLTA5LTEyICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBzdXBwb3J0L25mcy9zdmNfc29ja2V0LmM6IFJlbW92ZSBIQVZFX1NWQ1RDUF9TT0NLRVQgYW5kCisJSEFWRV9TVkNVRFBfU09DS0VULgorCisyMDAyLTA5LTEyICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW46IFJlbW92ZSBjaGVja2luZyBzdmN0Y3Bfc29ja2V0IGFuZCBzdmN1ZHBfc29ja2V0LgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKworCSogc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oLmluIChIQVZFX1NWQ1RDUF9TT0NLRVQpOiBSZW1vdmVkLgorCShIQVZFX1NWQ1VEUF9TT0NLRVQpOiBSZW1vdmVkLgorCisJKiBzdXBwb3J0L2luY2x1ZGUvbmZzbGliLmg6IFVuZG8gdGhlIGxhc3QgY2hhbmdlLgorCisyMDAyLTA5LTEyICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBzdXBwb3J0L2luY2x1ZGUvbmZzbGliLmggKHN2Y3RjcF9zb2NrZXQpOiBQcm90ZWN0IGl0IHdpdGgKKwlIQVZFX1NWQ1RDUF9TT0NLRVQuCisJKHN2Y3VkcF9zb2NrZXQpOiBQcm90ZWN0IGl0IHdpdGggSEFWRV9TVkNVRFBfU09DS0VULgorCisyMDAyLTA5LTEyICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIjEuMC4yIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogTGlrZXdpc2UuCisKKzIwMDItMDktMTIgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgc3ZjdGNwX3NvY2tldCBhbmQgc3ZjdWRwX3NvY2tldC4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKwkqIHN1cHBvcnQvaW5jbHVkZS9jb25maWcuaC5pbiAoSEFWRV9TVkNUQ1BfU09DS0VUKTogTmV3LgorCShIQVZFX1NWQ1VEUF9TT0NLRVQpOiBOZXcuCisKKwkqIHN1cHBvcnQvaW5jbHVkZS9uZnNsaWIuaCAoc3ZjdGNwX3NvY2tldCk6IE5ldy4KKwkoc3ZjdWRwX3NvY2tldCk6IE5ldy4KKworCSogc3VwcG9ydC9uZnMvTWFrZWZpbGUgKE9CSlMpOiBBZGQgc3ZjX3NvY2tldC5vLgorCisJKiBzdXBwb3J0L25mcy9zdmNfc29ja2V0LmM6IE5ldy4KKworCSogc3VwcG9ydC9uZnMvcnBjbWlzYy5jIChycGNfaW5pdCk6IENhbGwgc3ZjdGNwX3NvY2tldCBhbmQKKwlzdmN1ZHBfc29ja2V0IGlmIHBvcnQgaXMgdW5zcGVjaWZpZWQuCisKKwkqIHV0aWxzL25mc2QvbmZzZC5jIChtYWluKTogQ2FsbCBnZXRzZXJ2YnluYW1lIGZvciBwb3J0LgorCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zdmMuYzogSW5jbHVkZSA8bmZzbGliLmg+LgorCShraWxsZXIpOiBOZXcuIFNpZ25hbCBoYW5kbGVyIHRvIHVucmVnaXN0ZXIuCisJKG1haW4pOiBVc2Uga2lsbGVyLiBDYWxsIHN2Y3VkcF9zb2NrZXQgdG8gZ2V0IHRoZSBkZWZhdWx0CisJc29ja2V0LgorCisyMDAyLTA5LTAyIEp1YW4gR29tZXogPGp1YW5nQHVzLmlibS5jb20+CisJTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwlBZGQgLU4gb3B0aW9uIHRvIHN0YXRkIHRvIHJ1biBpbiBub3RpZnktb25seSBtb2RlLgorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5oOiB1bmNvbW1lbnQgTU9ERV9OT1RJRllfT05MWQorCSogdXRpbHMvc3RhdGQvc3RhdGQubWFuOiBkb2N1bWVudCAtTgorCSogdXRpbHMvc3RhdGQvc3RhdGQuYzogZW5hYmxlZCAtTiwgbGFyZ2VseSBleGlzdHMgYnV0IG5lZWRlZCB0byBiZQorCXVuY29tbWVudGVkIGFuZCBjb21wbGV0ZWQKKwkKKzIwMDItMDktMDIgSnVhbiBHb21leiA8anVhbmdAdXMuaWJtLmNvbT4KKwlOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCXN0YXRkIHRvIGhhdmUgIiAtUCBkaXJlY3RvcnkiIGFyZyB0byB1c2UgdGhhdCBkaXJlY3RvcnkgaW5zdGVhZAorCW9mIC92YXIvbGliL25mcy4gIFRoaXMgaXMgdXNlZnVsIGZvciBmYWlsLW92ZXIgY2x1c3RlcnMuCisJCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5oOiBkZWZpbmUgU01fRElSIGV0YyBhcyB2YXIsIG5vdCBjb25zdC4KKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmM6IGRlZmluZSAiLVAiIG9wdGlvbiB0byBzZXQgU01fKgorCWFwcHJvcHJpYXRlbHkuCisJKiB1dGlscy9zdGF0ZC9tb25pdG9yLmM6IHNwcmludGYgdG8gY29wZSB3aXRoIFNNX0RJUiBub3QgYmVpbmcKKwlhIGNvbnN0YW50IGFueSBtb3JlLgorCSogdXRpbHMvc3RhdGQvbm90aWZ5LmM6IGRpdHRvLgorCSogdXRpbHMvc3RhdGQvc3RhdGQubWFuOiBkb2N1bWVudCAtUCBvcHRpb24uCisJCisyMDAyLTA4LTI2ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogdXRpbHMvbmZzZC9uZnNkLm1hbjogRml4IHR5cG8uCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDEuMC4xLTEuCisKKzIwMDItMDUtMjkgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIGxldCBwYXJzZW9wdHMga25vdyBpZiAvZXRjL2V4cG9ydHMgd2FzIGJlaW5nIHJlYWQgb3Igbm90LCAKKwlhbmQgaGF2ZSBpdCBvbmx5IHByaW50ICJubyBzeW5jIG9yIGFzeW5jIiB3YXJuaW5nIGluIHRoYXQgY2FzZS4KKwkKKzIwMDItMDUtMDYgVG9tIE1jTmVhbCA8dHJtY25lYWxAYXR0YmkuY29tPgorCU5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiB1dGlscy9uZnNzdGF0L25mc3N0YXQuYzogSGFuZGxlIGRpZmZlcmluZyBmb3JtYXQgZm9yCisJICAgL3Byb2MvbmV0L3JwYy9uZnNkIGJldHdlZW4gcHJlIGFuZCBwb3N0IDIuNC4wCisJCisyMDAyLTA0LTA5ICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKwlKYW1lcyBQZWFyc29uIDxqYW1lcy1wQG1vdmluZy1waWN0dXJlLmNvbT4KKworCSogc3VwcG9ydC9uZnMvcm10YWIuYyhmZW5kcm10YWJlbnQpOiBzeW5jIGNoYW5nZXMgdG8gCisJc3RvcmFnZSBiZWZvcmUgcmV0dXJuaW5nLCBhcyB0aGlzIGlzIGNyaXRpY2FsIHN0YXRlCisKKzIwMDItMDQtMDggIFNlYW4gTydDb25uZWxsIDxzZWFuQGVlLmR1a2UuZWR1PgorCSAgICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mczogTmV3LgorCisyMDAyLTA0LTA4ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mcy5pbml0OiBVcGRhdGVkLgorCisJKiBuZnMtdXRpbHMuc3BlYy5pbjogVXBkYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBSZWdlbmVyYXRlZC4KKworCSogdXRpbHMvbW91bnRkL21vdW50ZC5jIChsb25nb3B0cyk6IEZpeCBhIHR5cG8uCisKKwkqIHV0aWxzL21vdW50ZC9tb3VudGQubWFuOiBVcGRhdGVkLgorCisyMDAyLTA0LTA3ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mc2xvY2suaW5pdCAocmVzdGFydCk6IEp1c3QgZG8gc3RvcCBhbmQgc3RhcnQuCisKKwkqIGV0Yy9yZWRoYXQvbmZzLmluaXQ6IEZpeCBhIHR5cG8uCisKKzIwMDItMDQtMDcgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMS4wLjEiLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBMaWtld2lzZS4KKworCSogUkVBRE1FOiBVcGRhdGVkIGZvciAxLjAuMS4KKworMjAwMi0wNC0wNyAgU2VhbiBPJ0Nvbm5lbGwgPHNlYW5AZWUuZHVrZS5lZHU+CisJICAgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGV0Yy9yZWRoYXQvbmZzLmluaXQ6IFJlYWQgL2V0Yy9zeXNjb25maWcvbmZzZCBmb3IgTkZTIHR1bmluZy4KKworMjAwMi0wMi0yOCAgIFN0ZXZlbiBXaGl0ZWhvdXNlIDxzdGV2ZUBndy5jaHlnd3luLmNvbT4KKwkgICAgICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCUFkZCBzdXBwb3J0IGZvciBmc2lkPW5uIGV4cG9ydCBvcHRpb24gc28gdGhhdCBkZXZpY2UKKwludW1iZXJzIGRvbid0IGdvIGluIGZpbGVoYW5kbGVzLgorCSogc3VwcG9ydC9leHBvcnQvbmZzY3RsLmMoZXhwc2V0dXApOiBpZiBleHBvcnRpbmcgYW5kIE5GU0VYUF9GU0lECisJaXMgc2V0LCBwYXNzIHRoZSBmc2lkIGluLXBsYWNlIG9mIHRoZSBkZXZpY2UgbnVtYmVyCisJKiBzdXBwb3J0L25mcy9leHBvcnRzLmM6IHBhcnNlIGFuZCBwcmludCBmc2lkPSBvcHRpb24uCisJQWxzbyBjaGVjayBpZiBlZm5hbWUgaGFzIGJlZW4gc2V0LCBhbmQgdXNlICJjb21tYW5kIGxpbmUiCisJaW5zdGVhZCBpbiBlcnJvciBtZXNzYWdlcy4KKwlBbHNvLCB1c2Ugc3RydG9sIGluc3RlYWQgb2YgYXRvaSBmb3IgYW5vblt1Z11pZD0gc28gdGhhdAorCWJhZCBudW1iZXJzIGNhdXNlIGVycm9ycy4KKwkKKzIwMDItMDEtMTcgICBBZHJpYW4gRHJ6ZXdpZWNraSA8ZHJ6ZUBNaXNzaW9uQ3JpdGljYWxMaW51eC5jb20+CisJICAgICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9uZnMvZXhwb3J0cy5jOiByZW1vdmUgTkZTRVhQX0FTWU5DIGFzIGEgZGVmYXVsdAorCWZsYWcgc28gdGhhdCAic3luYyIgYmVjb21lcyB0aGUgZGVmYXVsdC4KKwlDaGVjayB0aGF0IGVpdGhlciAic3luYyIgb3IgImFzeW5jIiBpcyBnaXZlbiBhcyBhbiBvcHRpb24KKwlhbmQgd2FybiBpZiBuZWl0aGVyIGFyZSBwcmVzZW50CisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRzLm1hbjogY2hhbmdlIGRvY3VtZW50YXRpb24gZm9yICJzeW5jIgorCXRvIGJlIGRvY3VtZW50YXRpb24gZm9yICJhc3luYyIuCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5tYW46IG5vdGUgdGhhdCAic3luYyIgaXMgdGhlIGRlZmF1bHQKKwlyYXRoZXIgdGhhbiAiYXN5bmMiCisJCisJCisyMDAyLTAxLTAyICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogc3VwcG9ydC9leHBvcnQvbmZzY3RsLmMgKGV4cHNldHVwKTogRG9uJ3QgZXhwb3J0IGVudHJpZXMgdGhhdAorCXNwZWNpZnkgaWQgbWFwcGluZ3Mgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsLiAgTm8gZXh0YW50IGtlcm5lbAorCXN1cHBvcnRzIGFueSBzaWduaWZpY2FudCBtYXBwaW5nLCBvbmx5ICdpZGVudGl0eScgKGkuZS4gbm9uZSkuCisJV2hlbiBvdGhlciBtYXBwaW5ncyBhcmUgc3VwcG9ydGVkLCB0aGlzIGNvZGUgd2lsbCBuZWVkIGNoYW5naW5nLgorCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAxLjAtMi4KKworMjAwMS0xMi0yNiAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEBwb2JveC5jb20+CisKKwkqIG5mcy11dGlscy5zcGVjIChWZXJzaW9uKTogU2V0IHRvICIxLjAiLgorCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogTGlrZXdpc2UuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogUkVBRE1FOiBSZXdyaXR0ZW4uCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDEuMC0xLgorCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRzLm1hbjogRW1waGFzaXplIHRoZSBuZWVkIGZvciBvcHRpb25zIHRvCisJaW1tZWRpYXRlbHkgZm9sbG93IGNsaWVudCBuYW1lcy4gIEV4cGxhaW4gdGhhdCB3aWxkY2FyZHMgZG9uJ3QKKwl1c3VhbGx5IHdvcmsgb24gYWRkcmVzc2VzLCBidXQgbWF5IHdvcmsgd2hlbiByZXZlcnNlIEROUyBmYWlscy4KKwlDb21tZW50IG91dCBhIGxlZnRvdmVyIFRQIHRoYXQgd2FzIFRQaW5nIG91ciBpbmRlbnRhdGlvbi4KKwkqIHV0aWxzL21vdW50ZC9tb3VudGQubWFuLCB1dGlscy9ycXVvdGFkL3JxdW90YWQubWFuLAorCXV0aWxzL3N0YXRkL3N0YXRkLm1hbjogUmVtb3ZlIHJlZnMgdG8gbm9uLWV4aXN0ZW50ICJob3N0c19hbGxvdyg1KSIuCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDAuMy4zLTYuCisKKzIwMDEtMTItMjAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L2V4cG9ydC9jbGllbnQuYyhjbGllbnRfbG9va3VwKTogSWYgYSBob3N0IGhhcyBtdWx0aXBsZQorCUlQIGFkZHJlc3NlcywgdGhlbiB3ZSBtdXN0IGFsd2F5cyB1c2UgdGhlIHJlc3VsdCBvZiBhCisJZ2V0aG9zdGJ5bmFtZSwgbm90IHRoYXQgb2YgZ2V0aG9zdGJ5YWRkciBmb3IgZXhwb3J0aW5nCisJCisyMDAxLTEyLTIwICBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9leHBvcnQvY2xpZW50LmMgKGNsaWVudF9sb29rdXApOiB1c2Ugc3RyY2FzZWNtcCB3aGVuCisJY29tcGFyaW5nIGhvc3QgbmFtZXMKKwkqIHN1cHBvcnQvbmZzL2V4cG9ydC5jIChnZXRleHBvcnRlbnQpOiBhZGQgZnJvbWtlcm5lbCBhcmcgYW5kIHVzZQorCWRpZmZlcmVudCBkZWZhdWx0cyBhcyBrZXJuZWxzIHByaW9yIHRvIDIuNC4xMSBhc3N1bWUgZGlmZmVyZW50CisJZGVmYXVsdHMgaW4gL3Byb2MvZnMvbmZzL2V4cG9ydHMKKwkqIHN1cHBvcnQvaW5jbHVkZS9uZnNsaWIuaCwgc3VwcG9ydC9leHBvcnQvZXhwb3J0LmMsCisJc3VwcG9ydC9leHBvcnQveHRhYi5jOiAgc3VwcG9ydCBleHRyYSAiZnJvbWtlcm5lbCIgYXJnIGZvcgorCWdldGV4cG9ydGVudC4gCisJCisyMDAxLTEyLTEzICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAwLjMuMy01LgorCisyMDAxLTExLTI2ICBUQUtBSSBLb3VzdWtlIDx0YWthaUB2bHNpLmt1ZWUua3lvdG8tdS5hYy5qcD4KKworCSogc3VwcG9ydC9uZnMveGlvLmMgKHhza2lwKTogQ2FsbCBgeHVuZ2V0YycgaW5zdGVhZCBvZgorICAgICAgICBgdW5nZXRjJyB0byBrZWVwIHhfbGluZSBtb3JlIHByb3Blcmx5LgorCisyMDAxLTExLTI2ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogdXRpbHMvc2hvd21vdW50L3Nob3dtb3VudC5jIChtYWluKTogRG9uJ3QgYXNzdW1lIHRoYXQgc3RyaW5ncworCXN0YXJ0aW5nIHdpdGggZGlnaXRzIGFyZSBJUCBhZGRyZXNzZXMuCisJKiB1dGlscy9uZnNkL25mc2QuYyAobWFpbik6IENsb3NlIGFsbCBmZHMgYW5kIHJlb3BlbiAwLDEsMiBvbgorCS9kZXYvbnVsbCBiZWZvcmUgbmZzc3ZjKCkuICBVc2Ugc3lzbG9nIHRvIHJlcG9ydCBuZnNzdmMgZXJyb3JzLgorCSogc3VwcG9ydC9taXNjL3RjcHdyYXBwZXIuYywgdXRpbHMvbW91bnRkL21vdW50ZC5tYW4sCisJdXRpbHMvcnF1b3RhZC9ycXVvdGFkLm1hbiwgdXRpbHMvc3RhdGQvc3RhdGQubWFuOiBGaXggY29tbWVudHMgYW5kCisJbWFuIHBhZ2VzOiBXZSBjaGVjayBob3N0IG5hbWVzICphbmQqIGFkZHJlc3NlcyB3aXRoIHRjcHdyYXBwZXJzLgorCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAwLjMuMy00LgorCisyMDAxLTExLTIxICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogc3VwcG9ydC9uZnMvY2xpZW50cy5jIChjZm5hbWUpOiBBZGRlZDogY3VycmVudCBjbGllbnRzIGZpbGUgbmFtZS4KKwkoc2V0bmZzY2xudGVudCk6IFNldCBpdC4KKwkoe2dldCxlbmR9bmZzY2xudGVudCwgc3ludGF4ZXJyKTogVXNlIGl0LgorCSogc3VwcG9ydC9uZnMvZXhwb3J0cy5jIChlZm5hbWUpOiBBZGRlZDogY3VycmVudCBleHBvcnRzIGZpbGUgbmFtZS4KKwkoc2V0bmZzZXhwb3J0ZW50KTogU2V0IGl0LgorCShlbmRuZnNleHBvcnRlbnQsIHBhcnNlb3B0cywgZ2V0ZXhwb3J0LCBzeW50YXhlcnIpOiBVc2UgaXQuCisJKHBhcnNlb3B0cyk6IEFjY2VwdCBvbGQtc3R5bGUgImNyb3NzbW50IiBvcHRpb24sIGZvciBvbGQgeHRhYnMuCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDAuMy4zLTMuCisKKzIwMDEtMTAtMTEgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAcG9ib3guY29tPgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMgKG1haW4pOiBDbG9zZSBmZHMgPiAyIF9iZWZvcmVfIFJQQyBpbml0LgorCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAwLjMuMy0yLgorCisyMDAxLTEwLTA4ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHBvYm94LmNvbT4KKworCSogdXRpbHMvbW91bnRkL21vdW50ZC5jIChtYWluKTogV2hlbiBkYWVtb25pemluZywgY2xvc2UgYWxsIGZkcyA+IDIuCisJKiB1dGlscy9NYWtlZmlsZS5pbjogUmVtb3ZlIG9sZCBNYWtlZmlsZSBpbiB0YXJnZXQgJ2Rpc3RjbGVhbicuCisJKiB1dGlscy9tb3VudGQvbW91bnRkLm1hbjogVXBkYXRlIHBhdGhzIHRvIC92YXIvbGliLgorCSogZGViaWFuLyo6IFZlcnNpb24gMC4zLjMtMSwgd2l0aCBEZWJpYW4tc3BlY2lmaWMgZml4ZXMuCisKKzIwMDEtMTAtMDYgIFByZXN0b24gQnJvd24gPHBicm93bkByZWRoYXQuY29tPgorCisJKiB1dGlscy9uZnNzdGF0L25mc3N0YXQubWFuOiBVcGRhdGVkLgorCisyMDAxLTA5LTI0ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIjAuMy4zIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogTGlrZXdpc2UuCisKKwkqIFJFQURNRTogVXBkYXRlZCBmb3IgMC4zLjMuCisKKzIwMDEtMDktMjAgTmVpbEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwlBcnJhbmdlIHRoYXQgImV4cG9ydGZzIC1hdSIgbmV2ZXIgZG9lcyBETlMgbG9va3VwOgorCQorCSogc3VwcG9ydC9leHBvcnQvY2xpZW50LmMgKGNsaWVudF9sb29rdXApIDogYWRkICJjYW5vbmljYWwiCisJZmxhZyB3aGljaCBzYXlzIHRoYXQgdGhlIGhvc3RuYW1lIGlzIGtub3duIHRvIGJlIGNhbm9uaWNhbCwgc28KKwlkb24ndCBkbyBhIGxvb2t1cAorCisJKiBzdXBwb3J0L2V4cG9ydC9leHBvcnQuYyAoZXhwb3J0X2NyZWF0ZSkgOiBhZGQgImNhbm9uaWNhbCIKKwlmbGFnIHRvIGJlIHBhc3NlZCBkb3duIHRvIGNsaWVudF9sb29rdXAKKwkqIHN1cHBvcnQvZXhwb3J0L2V4cG9ydC5jIChleHBvcnRfbG9va3VwKSA6IExpa2V3aXNlCisKKwkqIHN1cHBvcnQvZXhwb3J0L3h0YWIuYyAoeHRhYl9yZWFkKSA6IHBhc3MgYXBwcm9wcmlhdGUKKwkiY2Fub25pY2FsIiBmbGFnIHRvIGV4cG9ydF9sb29rdXAgYW5kIGV4cG9ydF9jcmVhdGU6CisJc2V0IGlmIHJlYWRpbmcgbGlzdCBvZiBmaWxlc3lzdGVtcyBjdXJyZW50bHkgZXhwb3J0cworCShpc19leHBvcnQgIT0gMSkuIAorCisJKiBzdXBwb3J0L2V4cG9ydC9leHBvcnQuYyAoZXhwb3J0X3JlYWQpIDogcGFzcyAwIGFzIAorCSJjYW5vbmljYWwiIGZsYWcgdG8gZXhwb3J0X2xvb2t1cCBhbmQgZXhwb3J0X2NyZWF0ZQorCSogc3VwcG9ydC9leHBvcnQvcm10YWIucyAocm10YWJfcmVhZCkgOiBMaWtld2lzZQorCisJKiBzdXBwb3J0L2luY2x1ZGUvZXhwb3J0ZnMuaCA6IHJlZGVjbGFyZSB2YXJpb3VzIHJvdXRpbmVzCisJdG8gaGF2ZSAiY2Fub25pY2FsIiBmbGFnCisKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMgKG1haW4pIDogcmVkbyBsb2dpYyBmb3IgCisJIi1hdSIgdG8gcmVhZCBpbiB3aGF0IGlzIGN1cnJlbnRseSBleHBvcnRlZCwgYnV0IG5ldmVyIGV2ZW4gCisJbG9vayBhdCB3aGF0ICJzaG91bGQiIGJlIGV4cG9ydGVkLgorCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jICh1bmV4cG9ydGFsbCkgOiByZW1vdmUgdGhpcworCXJvdXRpbmUuIEZ1bmN0aW9uYWxpdHkgaXMgY29tcGxldGVseSBpbmNsdWRlZCBpbgorCWV4cG9ydHNfdXBkYXRlCisKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMgKGV4cG9ydGZzKSA6IHNldCAiY2Fub25pY2FsIgorCWZsYWcgdG8gemVybyBpbiBjYWxscyB0byBleHBvcnRfbG9va3VwIGFuZCBleHBvcnRfY3JlYXRlLgorCisJCisyMDAxLTA5LTIwIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCSAgICBBbm5lIE1pbGljaWEgPG1pbGljaWFAbWlzc2lvbmNyaXRpY2FsbGludXguY29tPgorCisJKiBzdXBwb3J0L2V4cG9ydC9jbGllbnQuYyAoY2xpZW50X2xvb2t1cCkgY2FsbCBnZXRob3N0YnlhZGQKKwl0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgY2Fub25pY2FsIGhvc3RuYW1lLCBldmVuIGZvcgorCWRvdHRlZC1xdWFkcworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYyAoZXhwb3J0ZnMpIExpa2V3aXNlCisJCisyMDAxLTA5LTEyIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L25mcy9leHBvcnRzLmMgKHB1dGV4cG9ydGVudCk6IFxvY3RhbCBxdW90ZSBhbnkgc3BhY2VzCisJZXRjIGluIGEgcGF0aCBuYW1lCisJKiBzdXBwb3J0L25mcy94aW8uYyAoeGdldHRvayk6IHJlY29nbmlzZSBkb3VibGUtcXVvdGUgYW5kCisJXG9jdGFsIHF1b3RpbmcgaW4gcGF0aCBuYW1lcworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0cy5tYW46IGRvY3VtZW50IHF1b3RpbmcgY29udmVudGlvbnMKKwlmb3IgcGF0aCBuYW1lcworCQorMjAwMS0wOS0xMiBOZWlsQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvbW91bnRkL2F1dGguYyAoYXV0aF9hdXRoZW50aWNhdGVfaW50ZXJuYWwpOiBSZXZlcnNlCisJICBjaGFuZ2UgZnJvbSAyMDAwLTA4LTAyOiAgSXQgY2F1c2VzIHByb2JsZW1zIGlmIHNvbWVvbmUgZXhwb3J0cworCSAgdG8gYm90aCBhIGhvc3RuYW1lIGFuZCBJUCBhZGRyZXNzZXMuICBuZnMtdXRpbHMgbXVzdCBiZQorCSAgY29uc2lzdGFudCBhYm91dCB0aGUgY2Fub25pY2FsIG5hbWUgdGhhdCBpdCBjaG9vc2VzLgorCisyMDAxLTA4LTE3ICBSYWduYXIgS2r4cnN0YWQgPG5mc0ByYWduYXJrLnZlc3RkYXRhLm5vPgorCSAgICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mc2xvY2suaW5pdCAoU1RBVERBUkcpOiBOZXcuIFBhc3MgaXQgdG8gcnBjLnN0YXRkLgorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jIChsb25nb3B0cyk6IEFkZCAibmFtZSIuCisJKHVzYWdlKTogQWRkICItbi8tLW5hbWUiLgorCShtYWluKTogU2V0IE1ZX05BTUUgd2l0aCAiLW4vLS1uYW1lIi4KKworCSogdXRpbHMvc3RhdGQvc3RhdGUuYyAoY2hhbmdlX3N0YXRlKTogU2V0IE1ZX05BTUUgb25seSBpZiBpdAorCWlzIE5VTEwuCisJCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5tYW46IFVwZGF0ZWQgZm9yICItbi8tLW5hbWUiLgorCisyMDAxLTA3LTI2ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBuZnMtdXRpbHMuc3BlYyAoUmVsZWFzZSk6IFNldCB0byA4LgorCisyMDAxLTA3LTI1ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mcy5pbml0OiBDaGVjayBpZiBycGMucnF1b3RhZCBleGlzdHMgYmVmb3JlIGRvaW5nCisJYW55dGhpbmcgYWJvdXQgaXQuCisKKzIwMDEtMDYtMjcgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGV0Yy9yZWRoYXQvbmZzLmluaXQ6IFJ1biBycGMucnF1b3RhZCBvbmx5IGlmIGl0IGV4aXN0cy4KKworMjAwMS0wNi0yNyAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc2VydmVyLmM6IERvbid0IGNhbGwgc3RhdGZzICgpIGZvcgorCXRoZSBibG9jayBzaXplLiBVc2UgQkxPQ0tfU0laRSBpbnN0ZWFkLgorCisyMDAxLTA2LTI3ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWcubWsuaW4gKENDX0ZPUl9CVUlMRCk6IFJlbmFtZWQgZnJvbSBCVUlMRF9DQy4KKwkoQ0ZMQUdTX0ZPUl9CVUlMRCk6IE5ldy4gRG9uJ3QgdXNlIEBDRkxBR1NALgorCisJKiBjb25maWd1cmUuaW4gKGVuYWJsZV9uZnN2Myk6IFNldCB0byB5ZXMgYnkgZGVmYXVsdC4KKwkoLS1lbmFibGUtcnF1b3RhZCk6IEFkZGVkCisJKEFDX1BST0dfQ1hYKTogUmVtb3ZlZC4KKwkoQUNfT1VUUFVUKTogQWRkIHV0aWxzL01ha2VmaWxlLgorCShDQ19GT1JfQlVJTEQpOiBSZW5hbWVkIGZyb20gQlVJTERfQ0MuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJKiB1dGlscy9NYWtlZmlsZTogUmVtb3ZlZC4KKworCSogdXRpbHMvTWFrZWZpbGUuaW46IE5ldy4KKworCSogbmZzLXV0aWxzLnNwZWMuaW4gKHJxdW90YWQpOiBOZXcuIFNldCB0byAwIHRvIGRpc2FibGUKKwlycXVvdGFkLgorCShDQ19GT1JfQlVJTEQpOiBSZW5hbWVkIGZyb20gQlVJTERfQ0MuCisJKiBuZnMtdXRpbHMuc3BlYzogUmVnZW5lcmF0ZWQuCisKKzIwMDEtMDYtMTUgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAZGViaWFuLm9yZz4KKworCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAwLjMuMi0yLgorCSogZGViaWFuLyouaW5pdDogTWlub3IgZml4ZXMuCisKKzIwMDEtMDYtMDcgIExvbiBILiBIb2hiZXJnZXIgPGhvaGJlcmdlckBtaXNzaW9uY3JpdGljYWxsaW51eC5jb20+CisKKwkqIGV0Yy9ub2Rpc3QvbmZzLXNlcnZlcjogRml4ZWQgYSBidWcgd2hlcmUgdGhlIHNjcmlwdCB3b3VsZAorCWRpc2FibGUgbW91bnRzIGZyb20gTkZTdjMgY2xpZW50cyBpZiBORlN2MyBpcyBwcmVzZW50LgorCisyMDAxLTA2LTA1ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMgKGxvbmdvcHRzKTogQWRkICJkZXNjcmlwdG9ycy9vIi4KKwkobWFpbik6IFN1cHBvcnQgLS1kZXNjcmlwdG9ycy8tbyB0byBzZXQgdGhlIGxpbWl0IG9mIHRoZSBudW1iZXIKKwlvZiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMuCisJKHVzYWdlKTogVXBkYXRlZC4KKworCSogdXRpbHMvbW91bnRkL21vdW50ZC5tYW46IFVwZGF0ZWQgZm9yIC0tZGVzY3JpcHRvcnMvLW8uCisKKzIwMDEtMDYtMDQgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIG5mcy11dGlscy5zcGVjIChSZWxlYXNlKTogU2V0IHRvIDYuCisKKzIwMDEtMDUtMjggIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL2xvY2tkL2xvY2tkLmMgKG1haW4pOiBjaGRpciB0byBORlNfU1RBVEVESVIuCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMgKG1haW4pOiBMaWtld2lzZS4KKwkqIHV0aWxzL25mc2QvbmZzZC5jIChtYWluKTogTGlrZXdpc2UuCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zdmMuYyAobWFpbik6IExpa2V3aXNlLgorCisyMDAxLTA1LTA2ICBBbm5lIE1pbGljaWEgPG1pbGljaWFAbWlzc2lvbmNyaXRpY2FsbGludXguY29tPgorCisJKiBzdXBwb3J0L2V4cG9ydC9jbGllbnQuYyAoY2xpZW50X2NoZWNrKTogQ2hlY2sgSVAgYWRkcmVzcworCWFnYWluZXQgbmV0Z3JvdXAuCisKKzIwMDEtMDUtMDYgIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9leHBvcnQvY2xpZW50LmMgKGNsaWVudF9nZXR0eXBlKTogVHJlYXQgYConIGFzCisJTUNMX0FOT05ZTU9VUy4KKworMjAwMS0wNC0yMiAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogbmZzLXV0aWxzLnNwZWMuaW46IEZpeCBhIHR5cG8uCisJKiBuZnMtdXRpbHMuc3BlYzogUmVnZW5lcmF0ZWQuCisKKzIwMDEtMDQtMjEgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIG5mcy11dGlscy5zcGVjLmluOiBGaXggY3Jvc3MgYnVpbGQuCisJKiBuZnMtdXRpbHMuc3BlYzogUmVnZW5lcmF0ZWQuCisJKFJlbGVhc2UpOiBTZXQgdG8gNS4KKworMjAwMS0wNC0xOCAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogbmZzLXV0aWxzLnNwZWMuaW46IFN1cHBvcnQgY3Jvc3MgYnVpbGQuCisJKiBuZnMtdXRpbHMuc3BlYzogUmVnZW5lcmF0ZWQuCisJKFJlbGVhc2UpOiBTZXQgdG8gNC4KKworCSogY29uZmlnLnN1YjogTmV3LgorCSogY29uZmlnLmd1ZXNzOiBOZXcuCisKKwkqIGNvbmZpZy5tay5pbiAoQlVJTERfQ0MpOiBOZXcuCisJKENDKTogU2V0IHRvICQoQlVJTERfQ0MpIGlmIEJVSUxEIGlzIGRlZmluZWQuCisJKEFSKTogU2V0IHRvIEBBUkAuCisJKExEKTogU2V0IHRvIEBMREAuCisJKFJBTkxJQik6IFNldCB0byBAUkFOTElCQC4KKworCSogY29uZmlndXJlLmluOiBDaGVjayBCVUlMRF9DQywgUkFOTElCLCBBUiBhbmQgTEQuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJKiB0b29scy9ycGNnZW4vTWFrZWZpbGUgKEJVSUxEKTogU2V0IHRvIHRydWUuCisKKzIwMDEtMDQtMDEgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAdmFsaW51eC5jb20+CisKKwkqIHRvb2xzL3JwY2dlbi9ycGNfc3Zjb3V0LmMgKHdyaXRlX3RpbWVvdXRfZnVuYyk6IFJlbW92ZQorCXJlZHVuZGFudCwgYW5kIHNvbWV0aW1lcyBicm9rZW4sIGRlY2xhcmF0aW9uIG9mIHN2Y19mZHNldDsKKwlpdCBtYXkgYmUgYSBtYWNyby4KKwkqIHN1cHBvcnQvbmZzL3JwY21pc2MuYyAoY2xvc2Vkb3duKTogTGlrZXdpc2UuCisJCisyMDAxLTAzLTIxICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBuZnMtdXRpbHMuc3BlYzogUmVnZW5lcmF0ZWQuCisJKFJlbGVhc2UpOiBTZXQgdG8gMy4KKworMjAwMS0wMy0yMSAgSW9uIEJhZHVsZXNjdSAgPGlvbnV0QGNzLmNvbHVtYmlhLmVkdT4KKworCSogdXRpbHMvc3RhdGQvc3RhdGQuYyAobWFpbik6IG1ha2Ugc3VyZSBmaWxlIGRlc2NyaXB0b3JzIDAtMgorCWFyZSBvcGVuIHRvIC9kZXYvbnVsbC4KKworMjAwMS0wMy0yMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogc3VwcG9ydC9uZnMvcnBjbWlzYy5jOiBSZXN0b3JlIHRoZSBjaGFuZ2UgbWFkZSBvbiAyMDAxLTAzLTEwLgorCSogc3VwcG9ydC9uZnMvcnBjbWlzYy5jOiBMaWtld2lzZS4KKwkqIHV0aWxzL3JxdW90YWQvcnF1b3RhX3N2Yy5jOiBMaWtld2lzZS4KKwkqIHV0aWxzL3JxdW90YWQvcnF1b3RhZC5tYW46IExpa2V3aXNlLgorCSogdXRpbHMvc3RhdGQvTWFrZWZpbGU6IExpa2V3aXNlLgorCSogdXRpbHMvc3RhdGQvcm10Y2FsbC5jOiBMaWtld2lzZS4KKwkqIHV0aWxzL3N0YXRkL3NpbXVsYXRlLmM6IExpa2V3aXNlLgorCSogdXRpbHMvc3RhdGQvc3RhdGQuYzogTGlrZXdpc2UuCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5tYW46IExpa2V3aXNlLgorCisyMDAxLTAzLTExICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFJFTEVBU0UpOiBOZXcuIERlZmF1bHQgdG8gMSwgc2V0IGJ5CisJLS13aXRoLXJlbGVhc2U9WFhYLiBTdWJzdGl0dXRlIG5mcy11dGlscy5zcGVjLgorCSogbmZzLXV0aWxzLnNwZWMuaW4gKFJlbGVhc2UpOiBTZXQgdG8gQFJFTEVBU0VALgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBMaWtld2lzZS4KKworMjAwMS0wMy0xMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFkLm1hbjogRml4IGEgdHlwby4KKworMjAwMS0wMy0xMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogc3VwcG9ydC9pbmNsdWRlL3JwY21pc2MuaDogVW5kbyB0aGUgY2hhbmdlIG1hZGUgb24gMjAwMS0wMy0xMC4KKwkqIHN1cHBvcnQvbmZzL3JwY21pc2MuYzogTGlrZXdpc2UuCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zdmMuYzogTGlrZXdpc2UuCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YWQubWFuOiBMaWtld2lzZS4KKwkqIHV0aWxzL3N0YXRkL01ha2VmaWxlOiBMaWtld2lzZS4KKwkqIHV0aWxzL3N0YXRkL3JtdGNhbGwuYzogTGlrZXdpc2UuCisJKiB1dGlscy9zdGF0ZC9zaW11bGF0ZS5jOiBMaWtld2lzZS4KKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmM6IExpa2V3aXNlLgorCSogdXRpbHMvc3RhdGQvc3RhdGQubWFuOiBMaWtld2lzZS4KKworMjAwMS0wMy0xMCAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjMuMiIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IExpa2V3aXNlLgorCisJKiBSRUFETUU6IFVwZGF0ZWQgZm9yIDAuMy4yLgorCisyMDAxLTAzLTEwICBUYXZpcyBCYXJyIDx0YXZpc0Bib29sZS5pc2V0ci5jb2x1bWJpYS5lZHU+CisKKwkqIHV0aWxzL3JxdW90YWQvcnF1b3RhZC5tYW46IFVwZGF0ZWQgZm9yIC1wLgorCSogdXRpbHMvc3RhdGQvc3RhdGQubWFuOiBMaWtld2lzZS4KKworMjAwMS0wMy0xMCAgSW9uIEJhZHVsZXNjdSAgPGlvbnV0QGNzLmNvbHVtYmlhLmVkdT4KKworCSogc3VwcG9ydC9uZnMvcnBjbWlzYy5jOiBleHBvcnQgbWFrZXNvY2soKQorCisJKiBzdXBwb3J0L2luY2x1ZGUvcnBjbWlzYy5oIChtYWtlc29jayk6IERlY2xhcmVkLgorCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zdmMuYzogYWRkZWQgbG9uZ29wdHMsIGFkZGVkIHN1cHBvcnQgZm9yCisJc3BlY2lmeWluZyB0aGUgcG9ydCB0byBiaW5kIHRvIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmM6IGRpdHRvLCBhbHNvIHNwZWNpZnkgcG9ydCB1c2VkIGZvcgorCW91dGdvaW5nIGNvbm5lY3Rpb25zLgorCShkb19yZWdpc3QpOiBSZW1vdmVkLgorCisJKiB1dGlscy9zdGF0ZC9ybXRjYWxsLmMgKHN0YXRkX2dldF9zb2NrZXQpOiBSZW5hbWVkIGZyb20KKwlnZXRfc29ja2V0LiBNYWtlIGl0IGV4dGVybi4KKworCSogdXRpbHMvc3RhdGQvc2ltdWxhdGUuYyAoZGFlbW9uX3NpbXVsYXRvcik6IENhbGwgcnBjX2luaXQKKwlpbnN0ZWFkIG9mIGRvX3JlZ2lzdC4KKworCSogdXRpbHMvc3RhdGQvTWFrZWZpbGUgKExJQlMpOiBsaW5rIHdpdGggb3VyIG93biBsaWJuZnMKKworMjAwMS0wMy0wOSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogZXRjL3JlZGhhdC9uZnNsb2NrLmluaXQ6IENoYW5nZWQgY2hrY29uZmlnIGxpbmUgdG8gNjAgODYuCisJKiBldGMvbm9kaXN0L25mcy1jbGllbnQ6IExpa2V3aXNlLgorCisyMDAxLTAyLTI2ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDAuMy4xLTEuCisJKiBNZW50aW9uIHVwc3RyZWFtIHNvdXJjZSBhbmQgbGljZW5zZSBpbiBjb3B5cmlnaHQgZmlsZS4KKwkqIEFkZCBidWlsZC1EZXBlbmRzIGZvciBkZWJoZWxwZXIgYW5kIGxpYndyYXAwLWRldi4KKworMjAwMS0wMi0yMCAgTG9uIEhvaGJlcmdlciA8aG9oYmVyZ2VyQG1pc3Npb25jcml0aWNhbGxpbnV4LmNvbT4KKworCSogZXRjL25vZGlzdC9uZnMtc2VydmVyOiBDaGFuZ2VkIGNoa2NvbmZpZyBsaW5lIHRvIDYwIDIwCisJKiBldGMvbm9kaXN0L25mcy1jbGllbnQ6IExpa2V3aXNlLgorCisyMDAxLTAyLTE4ICBMb24gSG9oYmVyZ2VyIDxob2hiZXJnZXJAbWlzc2lvbmNyaXRpY2FsbGludXguY29tPgorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5tYW46IENoYW5nZWQgL3Vzci9zYmluL3JwYy5zdGF0ZCB0bworCS9zYmluL3JwYy5zdGF0ZC4KKworMjAwMS0wMi0xNyAgUGF0cmljayBKLiBMb1ByZXN0aSA8cGF0bEBjdXJsLmNvbT4KKworCSogdXRpbHMvc3RhdGQvbG9nLmMgKGxvZ19pbml0KTogVXNlIExPR19EQUVNT04gaW5zdGVhZCBvZgorCUxPR19MT0NBTDUuCisKKzIwMDEtMDItMTQgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL3N0YXRkL3JtdGNhbGwuYzogSW5jbHVkZSA8dGltZS5oPi4KKwkqIHV0aWxzL3N0YXRkL3N2Y19ydW4uYzogTGlrZXdpc2UuCisKKzIwMDEtMDItMTQgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4zLjEiLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBMaWtld2lzZS4KKworCSogUkVBRE1FOiBVcGRhdGVkIGZvciAwLjMuMS4KKworMjAwMS0wMi0xNCAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogc3VwcG9ydC9uZnMvcnBjbWlzYy5jOiBJbmNsdWRlIDx0aW1lLmg+LgorCisyMDAxLTAyLTE0ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiBkZWJpYW4vY29udHJvbDogQ2hhbmdlIHByaW9yaXR5IG9mIG5oZnNzdG9uZSBwYWNrYWdlIHRvICdleHRyYScuCisKKzIwMDEtMDItMTIgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAdmFsaW51eC5jb20+CisKKwkqIGRlYmlhbi9jaGFuZ2Vsb2c6IFZlcnNpb24gMC4zLTIuCisKKzIwMDEtMDItMDIgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHN1cHBvcnQvaW5jbHVkZS9ycGNtaXNjLmggKHJwY19pbml0KTogUmVtb3ZlIGJ1ZnNpemUuCisJCisJKiBzdXBwb3J0L25mcy9ycGNtaXNjLmMgKG1ha2Vzb2NrKTogUmVtb3ZlIHNvY2tzeiBhbmQgY29tbWVudAorCW91dCBTT19TTkRCVUYvU09fUkNWQlVGLgorCShycGNfaW5pdCk6IFJlbW92ZSBidWZzaXplIGFuZCByZW1vdmUgc29ja3N6IGluIGNhbGxzIHRvCisJbWFrZXNvY2sgKCkuCisKKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyAobWFpbik6IFJlbW92ZSBidWZzaXplIGluIGNhbGxzIHRvCisJcnBjX2luaXQgKCkuCisKKzIwMDEtMDEtMjggIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAdmFsaW51eC5jb20+CisKKwkqIGRlYmlhbi9jaGFuZ2Vsb2c6IFZlcnNpb24gMC4zLTEuCisKKzIwMDEtMDEtMjUgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4zIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogTGlrZXdpc2UuCisKKwkqIFJFQURNRTogVXBkYXRlZCBmb3IgMC4zLgorCisyMDAxLTAxLTI1ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiB1dGlscy9sb2NrZC9sb2NrZC5jIChtYWluKTogSWdub3JlIGVycm5vID09IEVJTlZBTC4KKworMjAwMS0wMS0yMCAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEB2YWxpbnV4LmNvbT4KKworCSogc3VwcG9ydC9pbmNsdWRlL3hpby5oICh4Z2V0Yyk6IERlY2xhcmUgdG8gcmV0dXJuIGludC4KKwkqIHN1cHBvcnQvbmZzL3hpby5jICh4Z2V0Yyk6IFJldHVybiBpbnQuCisJKHhnZXR0b2ssIHhza2lwLCB4c2tpcGNvbW1lbnQpOiBVc2UgaW50IGZvciB2YWx1ZSBvZiB4Z2V0Yy4KKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmMgKG1haW4pOiBVc2UgaW50IGZvciB2YWx1ZSBvZiBnZXRvcHQuCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDAuMi4xLTUuCisJCisyMDAwLTEyLTEwICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiB1dGlscy9zdGF0ZC9tb25pdG9yLmMgKHNtX21vbl8xX3N2Yyk6IEZpeCBidWdneSBjaGVjayBmb3IKKwlwcm9ncmFtIGFuZCBwcm9jZWR1cmUgbnVtYmVycyBvZiBrZXJuZWwgbG9ja2QncyBjYWxsYmFjay4gIEFsc28sCisJYmVzaWRlcyB0aGUgb2xkIChhbmQgYnJva2VuKSBwcm9jZWR1cmUgIzI0LCBhbGxvdyAjMTYgcGVyIFRyb25kLgorCisyMDAwLTEyLTAzICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiBzdXBwb3J0L25mcy94aW8uYyAoeGZvcGVuKTogSW5pdGlhbGl6ZSB4X2xpbmUgdG8gb25lLCBub3QgemVyby4KKwkqIGRlYmlhbi9jb250cm9sOiBMZXQgbmhmc3N0b25lIHJlcGxhY2UgZmlsZXMgaW4gbmZzLWtlcm5lbC1zZXJ2ZXIuCisJKiBkZWJpYW4vY2hhbmdlbG9nOiBWZXJzaW9uIDAuMi4xLTQuCisKKzIwMDAtMTEtMjcgIFRvYmlhcyBSaW5nc3Ryb20gPHRvcmlAdGVsbHVzLm1pbmUubnU+CisKKwkqIHV0aWxzL21vdW50ZC9hdXRoLmMgKGF1dGhfYXV0aGVudGljYXRlKTogTG9nIHRoZSBiYWQgcGF0aAorCXdhcm5pbmcuCisKKzIwMDAtMTEtMjQgIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworICAgICAgICAqIHN1cHBvcnQvbmZzL2V4cG9ydHMuYyAoZ2V0ZXhwb3J0ZW50KTogQ2hlY2sgZm9yIGhvc3QgbmFtZQorCXdpdGhvdXQgb3B0aW9uLCBvciBvcHRpb25zIHdpdGhvdXQgaG9zdG5hbWUsIGFuZCBwcmludCBhIHdhcm5pbmcsCisJYXMgdGhpcyBpcyBtb3N0IGxpa2VseSBhIHR5cG8uCisKKzIwMDAtMTEtMTkgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAdmFsaW51eC5jb20+CisKKwkqIGRlYmlhbi9jb250cm9sOiBBZGQgZGVwZW5kZW5jeSBvbiBwb3J0bWFwLgorCSogZGViaWFuL2NoYW5nZWxvZzogVmVyc2lvbiAwLjIuMS0zLgorCisyMDAwLTExLTEwICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBuZnMtdXRpbHMuc3BlYy5pbjogRG9uJ3QgdXNlIGxpYnRvb2wuCisJQWRkIENoYW5nZUxvZyBhbmQgQ09QWUlORyB0byBkb2MuCisJKiBuZnMtdXRpbHMuc3BlYzogUmVidWlsZC4KKworMjAwMC0xMS0wOSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogZXRjL3JlZGhhdC9uZnMuaW5pdCAoc3RhcnQpOiBCYWNrIG91dCB0aGUgbGFzdCBjaGFuZ2UuCisKKzIwMDAtMTEtMDkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGV0Yy9yZWRoYXQvbmZzLmluaXQgKHN0YXJ0KTogUGFzcyAtLW5vLXRjcCB0byBtb3VudGQgaWYKKwlUQ1AgaXMgbm90IHN1cHBvcnRlZCBieSBrZXJuZWwuCisKKwkqIHN1cHBvcnQvbmZzL3JwY21pc2MuYyAocnBjX2luaXQpOiBEb24ndCBzZXQgX3JwY2ZkdHlwZSB0byAwLgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMgKGxvbmdvcHRzKTogQWRkICItbi8tLW5vLXRjcCIuCisJKG1haW4pOiBTZXQgdG8gX3JwY2ZkdHlwZSB0byBTT0NLX0RHUkFNIGZvciAiLW4vLS1uby10Y3AiLgorCisJKiB1dGlscy9tb3VudGQvbW91bnRkLm1hbjogVXBkYXRlZCBmb3IgIi1uLy0tbm8tdGNwIi4KKworMjAwMC0xMC0yNCAgTG9uIEhvaGJlcmdlciA8aG9oYmVyZ2VyQG1pc3Npb25jcml0aWNhbGxpbnV4LmNvbT4KKworCSogdXRpbHMvc3RhdGQvY2FsbGJhY2suYzogRml4IGJ1ZyBwcmV2ZW50aW5nIGNhbGxiYWNrcyB0byBsb2NhbCBsb2NrZC4KKwkqIHV0aWxzL3N0YXRkL3JtdGNhbGwuYzogQWRkIHNvbWUgSVAgYWRkcmVzcyBwYXJhbm9pYSB3aGVuIGRvaW5nCisJY2FsbGJhY2tzIHRvIGxvY2FsIGxvY2tkLgorCisyMDAwLTEwLTE4ICBTY290dCBNY0Rlcm1vdHQgPG1jZGVybW90QHF1ZXN0cmEuY29tPgorCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRzLm1hbjogVXBkYXRlZCBmb3IgQ0lEUiBuZXRtYXNrLgorCisyMDAwLTEwLTE3ICBTY290dCBNY0Rlcm1vdHQgPG1jZGVybW90QHF1ZXN0cmEuY29tPgorCisJKiBzdXBwb3J0L2V4cG9ydC9jbGllbnQuYyAoY2xpZW50X2luaXQpOiBTdXBwb3J0IENJRFIgbmV0bWFzaworCWluIC9ldGMvZXhwb3J0cy4KKworMjAwMC0xMC0xMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogYWNsb2NhbC5tNCAoQUNfVENQX1dSQVBQRVIpOiBGaXggYSB0eXBvLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisyMDAwLTEwLTA2ICBMb24gSG9oYmVyZ2VyIDxob2hiZXJnZXJAbWlzc2lvbmNyaXRpY2FsbGludXguY29tPgorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5tYW46IENoYW5nZSAiL3Zhci9saWIvbmZzL3NtL3N0YXRlIiB0bworCSIvdmFyL2xpYi9uZnMvc3RhdGUiLgorCisyMDAwLTEwLTA1ICBMb24gSG9oYmVyZ2VyIDxob2hiZXJnZXJAbWlzc2lvbmNyaXRpY2FsbGludXguY29tPgorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5oIChydW5fbW9kZSk6IE5ldyBnbG9iYWwgYml0bWFzayBvZiBydW50aW1lCisJYmVoYXZpb3JzOiBmZy9iZywgbG9nZ2luZywgZXRjLgorCSogdXRpbHMvc3RhdGQvc3RhdGQuYzogTmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtViAtaCAtPyAtZCAuCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5tYW46IFVwZGF0ZSBmb3IgY2hhbmdlcyB0byBzdGF0ZC4KKworCSogdXRpbHMvc3RhdGQvbG9nLmggKGxvZ19pbml0KTogUmVtb3ZlIHBhcmFtZXRlciBvZiBmdW5jdGlvbjsgdXNlCisJZ2xvYmFsIHZhcmlhYmxlICJuYW1lX3AiIGluc3RlYWQuCisJKiB1dGlscy9zdGF0ZC9sb2cuYzogQWRkIHN1cHBvcnQgZm9yIGxvZ2dpbmcgdG8gc3RkZXJyLgorCisJKiB1dGlscy9zdGF0ZC9ub3RsaXN0LmM6IFBhcnRpYWxseSByZXdyaXRlIG5vdGlmeSBsaXN0IGhhbmRsaW5nCisJZnVuY3Rpb25zLiAgRWxpbWluYXRlIHJ1bi1vZmYtZW5kLW9mLWxpc3QgYnVnIHdoZW4gY2FsbGluZworCW5saXN0X2luc2VydF90aW1lci4gIEFkZCBsb3RzIG9mIGNvbW1lbnRzLgorCQorMjAwMC0wOS0yNyAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogUkVBRE1FOiBVcGRhdGVkIGZvciBSZWRIYXQgNy4wLgorCisyMDAwLTA5LTI3ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBuZnMtdXRpbHMuc3BlYzogUmVidWlsZC4KKworMjAwMC0wOS0yNyAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogUkVBRE1FOiBVcGRhdGVkIGZvciAwLjIuMS4KKworMjAwMC0wOS0yNyAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogbmZzLXV0aWxzLnNwZWMuaW46IFVwZGF0ZWQgdG8gdXNlIHJwbSBtYWNyb3MgYW5kIHN1cHBvcnQKKwlSZWRIYXQgNy4wLgorCisyMDAwLTA5LTI1ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIjAuMi4xIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogVXBkYXRlZC4KKworMjAwMC0wOS0yNSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvbW91bnRkL2F1dGguYyAoYXV0aF9hdXRoZW50aWNhdGVfaW50ZXJuYWwpOiBNYWtlIHN1cmUgYQorCW5vbi1OVUxMIGhvc3RlbnQgaXMgYWx3YXlzIHJldHVybmVkLgorCisyMDAwLTA5LTExICBJb24gQmFkdWxlc2N1ICA8aW9udXRAY3MuY29sdW1iaWEuZWR1PgorCisJKiBldGMvcmVkaGF0L25mc2xvY2suaW5pdDogZG9uJ3Qga2lsbCBsb2NrZCBwcm9jZXNzZXMgdGhhdCBkbyBub3QKKwloYXZlIGFuIGV4ZWN1dGFibGUgKGkuZS4ga2VybmVsIHRocmVhZHMpCisKKzIwMDAtMDktMDEgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIFJFQURNRTogVXBkYXRlZCBmb3IgMC4yLgorCisyMDAwLTA5LTAxICBKYXkgV2ViZXIgPGp3ZWJlckB2YWxpbnV4LmNvbT4KKworCSogZXRjL3JlZGhhdC9uZnMuaW5pdDogQWRkZWQgYWJpbGl0eSBmb3IgcnBjLm1vdW50ZCB0byBkZWZhdWx0IHRvCisJc3VwcG9ydGluZyB2ZXJzaW9uIDMgb2YgbmZzIGlmIGF2YWlsYWJsZSwgZWxzZSBpdCB3aWxsIGZhbGwgYmFjayB0bworCXZlcnNpb24gMiBzdXBwb3J0IG9ubHkuCisKKzIwMDAtMDgtMzAgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4yIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogVXBkYXRlZC4KKworMjAwMC0wOC0yNSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogc3VwcG9ydC9taXNjL3RjcHdyYXBwZXIuYyAobG9naXQpOiBNb2RpZnkgdGhlIGxvZyBvdXRwdXQuCisKKzIwMDAtMDgtMjUgIElvbiBCYWR1bGVzY3UgIDxpb251dEBjcy5jb2x1bWJpYS5lZHU+CisKKwkqIHV0aWxzL3JxdW90YWQvcnF1b3RhZC5tYW4sIHV0aWxzL3N0YXRkL3N0YXRkLm1hbiwKKwl1dGlscy9tb3VudGQvbW91bnRkLm1hbjogdXBkYXRlZAorICAgICAgICAKKwkqIHV0aWxzL21vdW50ZC9NYWtlZmlsZSAoTElCUyk6IGFkZGVkIC1sbWlzYyAkKExJQldSQVApICQoTElCTlNMKQorCSogdXRpbHMvcnF1b3RhZC9NYWtlZmlsZTogZml4IGNvbW1lbnQKKworCSogc3VwcG9ydC9taXNjL3RjcHdyYXBwZXIuYyAobG9naXQpOiBhZGRlZCBjb21tZW50IGFib3V0IHdhaXRpbmcKKwlmb3IgdGhlIGNoaWxkcmVuIGFmdGVyIGZvcmsoKQorCQorCSogdXRpbHMvbW91bnRkL21vdW50ZC5jIChtYWluKTogaWdub3JlIFNJR0NITEQgdG8gcHJldmVudCBsZWF2aW5nCisJem9tYmllcyBiZWhpbmQgKGZyb20gbG9naXQoKSdzIGZvcmspCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zdmMuYyAobWFpbik6IGRpdHRvCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jIChtYWluKTogZGl0dG8KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc3ZjLmMgKHJxdW90YXByb2dfMSk6IHBhc3MgUlFVT1RBUFJPRworCXRvIGNoZWNrX2RlZmF1bHQgaW5zdGVhZCBvZiAwLCBmb3IgcHJvZ251bQorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jIChzbV9wcm9nXzFfd3JhcHBlcik6IHBhc3MgU01fUFJPRworCXRvIGNoZWNrX2RlZmF1bHQgaW5zdGVhZCBvZiAwLCBmb3IgcHJvZ251bQorCisJKiB1dGlscy9tb3VudGQvbW91bnRfZGlzcGF0Y2guYzogSW5jbHVkZSAidGNwd3JhcHBlci5oIiBpZgorCUhBVkVfVENQX1dSQVBQRVIgaXMgZGVmaW5lZC4KKwkobW91bnRfZGlzcGF0Y2gpOiBDYWxsIGNoZWNrX2RlZmF1bHQgKCkgaWYgSEFWRV9UQ1BfV1JBUFBFUiBpcworCWRlZmluZWQuIFJlamVjdCBhbiBSUEMgY2FsbCBpZiBjaGVja19kZWZhdWx0ICgpIGZhaWxzLgorCisyMDAwLTA4LTI1ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBzdXBwb3J0L2luY2x1ZGUvdGNwd3JhcHBlci5oOiBOZXcgZm9yIHRoZSB0Y3Agd3JhcHBlcgorCXN1cHBvcnQuCisJKiBzdXBwb3J0L21pc2MvTWFrZWZpbGU6IExpa2V3aXNlLgorCSogc3VwcG9ydC9taXNjL2Zyb21fbG9jYWwuYzogTGlrZXdpc2UuCisJKiBzdXBwb3J0L21pc2MvdGNwd3JhcHBlci5jOiBMaWtld2lzZS4KKworCSogYWNsb2NhbC5tNCAoQUNfVENQX1dSQVBQRVIpOiBOZXcuCisJKiBjb25maWd1cmUuaW46IFVzZSBpdC4gU3Vic3RpdHV0ZSBMSUJXUkFQLgorCSogY29uZmlndXJlOiBSZWJ1aWx0LgorCisJKiBjb25maWcubWsuaW4gKExJQk5TTCk6IE5ldy4KKwkoTElCV1JBUCk6IExpa2V3aXNlLgorCisJKiBzdXBwb3J0L01ha2VmaWxlIChTVUJESVJTKTogQWRkIG1pc2MuCisKKwkqIHN1cHBvcnQvbGliL01ha2VmaWxlIChMSUJTKTogQWRkIGxpYm1pc2MuYS4KKworCSogdXRpbHMvcnF1b3RhZC9NYWtlZmlsZSAoTElCUyk6IEFkZAorCQorCQktbG1pc2MgJChMSUJXUkFQKSAkKExJQk5TTCkKKworCSogdXRpbHMvc3RhdGQvTWFrZWZpbGUgKExJQlMpOiBMaWtld2lzZS4KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc3ZjLmM6IEluY2x1ZGUgInRjcHdyYXBwZXIuaCIgaWYKKwlIQVZFX1RDUF9XUkFQUEVSIGlzIGRlZmluZWQuCisJKHJxdW90YXByb2dfMSk6IENhbGwgY2hlY2tfZGVmYXVsdCAoKSBpZiBIQVZFX1RDUF9XUkFQUEVSIGlzCisJZGVmaW5lZC4gUmVqZWN0IGFuIFJQQyBjYWxsIGlmIGNoZWNrX2RlZmF1bHQgKCkgZmFpbHMuCisKKwkqIHV0aWxzL3N0YXRkL3N0YXRkLmM6IEluY2x1ZGUgInRjcHdyYXBwZXIuaCIgaWYKKwlIQVZFX1RDUF9XUkFQUEVSIGlzIGRlZmluZWQuCisJKHNtX3Byb2dfMV93cmFwcGVyKTogTmV3LiBBIHdyYXBwZXIgZm9yIHNtX3Byb2dfMS4gQ2FsbAorCWNoZWNrX2RlZmF1bHQgKCkgYmVmb3JlIGNhbGxpbmcgc21fcHJvZ18xICgpLiBEZWZpbmUgaXQgYXMKKwlzbV9wcm9nXzFfd3JhcHBlciBpZiBIQVZFX1RDUF9XUkFQUEVSIGlzIGRlZmluZWQuCisKKzIwMDAtMDgtMjUgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAdmFsaW51eC5jb20+CisKKwkqIGRlYmlhbi8qOiBDb21wbGV0ZSBEZWJpYW4gYnVpbGQgc3VwcG9ydC4KKwkqIGV0Yy9kZWJpYW4vKjogUmVtb3ZlLgorCisyMDAwLTA4LTI0ICBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIHN1cHBvcnQvZXhwb3J0L2NsaWVudC5jKGNsaWVudF9jaGVjayk6IHJlbW92ZWQgdGhlICJkb3QrMSIgYXMgYQorCSAgeXBkb21haW4gYXJndW1lbnQgdG8gaW5uZXRnciBhcyB0aGlzIGlzIGVudGlyZWx5IGJvZ3VzLgorCSAgSXQgc2hvdWxkIGFsd2F5cyBiZSBOVUxMLgorCQorMjAwMC0wOC0yMyAgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L2V4cG9ydC94dGFiLmMoeHRhYl9yZWFkKTogaW50cm9kdWNlIG5ldyBtb2RlIGZvcgorCSAgIHJlYWRpbmcgeHRhYi4gaS5lLiBhIGxpc3Qgb2YgZXhwb3J0cyB0aGF0IG1pZ2h0IGJlIGtub3duIHRvIHRoZQorCSAgIGtlcm5lbCwgb3IgbWlnaHQgbm90LiAgVGhlc2UgYXJlIGZsYWdnZWQgYXMgbV9leHBvcnRlZCA9PSAtMQorCSogc3VwcG9ydC9leHBvcnQveHRhYi5jKHh0YWJfbW91bnRfcmVhZCk6ICBjYWxsIHh0YWJfcmVhZCB3aXRoIG5ldworCSAgIHZhbHVlICIyIiBmb3IgeHRhYiwgbWVhbmluZyBkb24ndCB0cnVzdCB0aGlzIHRvbyBtdWNoLgorCSogc3VwcG9ydC9pbmNsdWRlL2V4cG9ydGZzLmgoc3RydWN0IG1leHBvcnQpOiBjaGFuZ2VkIG1fZXhwb3J0ZWQKKwkgICBmcm9tIG9uZSBiaXQgdG8gYW4gaW50IHNvIHRoYXQgaXQgY2FuIGhvbGQgbmV3IHZhbHVlCisJKiB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jKGV4cG9ydGZzX2lwZGF0ZSk6IGFkZCBhbiBleHBvcnQgdG8gdGhlCisJICAga2VybmVsIGlmIGl0IGlzIHVuY2VydGFpbiB3aGV0aGVyIHRoZSBrZXJuZWwga25vd3MgKG1fZXhwb3J0ZWQgPT0gLTEpCisJKiB1dGlscy9tb3VudGQvbW91bnRkLmMoZ2V0X3Jvb3RmaCk6IHNpbWlsYXJseSBleHBvcnQgdG8ga2VybmVsIGlmCisJICAgc3RhdHVzIGlzIHVuY2VydGFpbgorCisJKiBzdXBwb3J0L25mcy94aW8uYyh4ZmxvY2spOiBhZGRlZCBPX0NSRUFUIHdoZW4gZ2V0dGluZworCSAgIGEgd3JpdGUgbG9jayBzbyB0aGF0IG1pc3NpbmcgZmlsZXMgYXJlbid0IGZhdGFsLgorCisJKiBldGMvZGViaWFuL25mcy1jb21tb246IG5ldyBmaWxlIGZyb20gInBvdGF0byIKKwkqIGV0Yy9kZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXI6IG5ldyBmaWxlIGZyb20gInBvdGF0byIgcGx1cyBmaXhlcy4KKwkgCisyMDAwLTA4LTA5ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mcy5pbml0OiBSdW4gL3Vzci9zYmluL2V4cG9ydGZzIGZpcnN0IGR1cmluZworCXN0YXJ0dXAgdG8gZW5zdXJlIGFsbCBleGlzdGluZyBjbGllbnRzIHdvcmsgZmluZS4KKworCSogc3VwcG9ydC9leHBvcnQveHRhYi5jICh4dGFiX21vdW50X3JlYWQpOiBQYXNzIDEgaW5zdGVhZCBvZiAwCisJdG8geHRhYl9yZWFkICgpIGZvciByZWFkaW5nIF9QQVRIX1hUQUIuCisKKzIwMDAtMDgtMDIgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL21vdW50ZC9hdXRoLmMgKGF1dGhfYXV0aGVudGljYXRlX2ludGVybmFsKTogVHJ5IHRvCisJYXZvaWQgdGhlIHJldmVyc2UgbmFtZSBsb29rdXAuCisKKzIwMDAtMDctMDQgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL3N0YXRkL2xvZy5jOiBJbmNsdWRlIDxzdGRsaWIuaD4gZm9yIGV4aXQgKCkuCisKKwkqIHV0aWxzL3N0YXRkL21pc2MuYyAoeHVubGluayk6IEFkZCBgeycgYW5kIGB9JyB0byBxdWlldCB0aGUKKwlnY2Mgd2FybmluZy4KKworMjAwMC0wNy0wNCAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjEuOS4xIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogVXBkYXRlZC4KKworCSogUkVBRE1FOiBVcGRhdGVkLgorCisyMDAwLTA3LTA0ICBOZWlsIEJyb3duICA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L2V4cG9ydC9ob3N0bmFtZS5jIChob3N0ZW50X2R1cCk6IEhhbmRsZSB0aGUgTlVMTAorCWhfYWxpYXNlcyBmaWVsZC4KKworMjAwMC0wNy0wMyAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogUkVBRE1FOiBVcGRhdGUgdGhlIHV0aWwtbGludXggcmVxdWlyZW1lbnQuCisKKzIwMDAtMDctMDMgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4xLjkiLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBVcGRhdGVkLgorCisJKiBSRUFETUU6IFVwZGF0ZWQuCisKKzIwMDAtMDctMDMgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGV0Yy9yZWRoYXQvbmZzLmluaXQ6IFJ1biAvdXNyL3NiaW4vZXhwb3J0ZnMgbGFzdCBkdXJpbmcKKwlzdG9wIHRvIGVuc3VyZSBhbGwgY2xpZW50cyBjYW4gc3RpbGwgYWNjZXNzIHRoZSBzZXJ2ZXIKKwliZWZvcmUgaXQgaXMgc2h1dGRvd24uCisKKzIwMDAtMDYtMzAgIEplZmYgVXBob2ZmIDxqdXBob2ZmQHRyYW5zbWV0YS5jb20+CisKKwkqIHRvb2xzL3JwY2dlbi9ycGNfc3Zjb3V0LmMgKHdyaXRlX21zZ19vdXQpOiBHZW5lcmF0ZSBzeXNsb2coKQorIAljYWxscyB3aXRoIGZvcm1hdCBzdHJpbmcuCisJCisyMDAwLTA2LTI4ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiB1dGlscy9zdGF0ZC9sb2cuYyAobG9nKTogQ2FsbCBzeXNsb2cgd2l0aCBmb3JtYXQgc3RyaW5nLgorCisyMDAwLTA2LTI3ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiB1dGlscy9zdGF0ZC9zdGF0ZC5jIChtYWluKTogVXNlIHN5c2NvbmYgKF9TQ19PUEVOX01BWCkKKwlpbnN0ZWFkIG9mIE9QRU5fTUFYLgorCisyMDAwLTA2LTI3ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBSRUFETUU6IFVwZGF0ZWQuCisKKzIwMDAtMDYtMjcgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGV0Yy9yZWRoYXQvbmZzLmluaXQ6IFJ1biAvdXNyL3NiaW4vZXhwb3J0ZnMgbGFzdCBkdXJpbmcKKwlzdGFydHVwIHRvIGVuc3VyZSBhbGwgZXhpc3RpbmcgY2xpZW50cyBhcmUgZXhwb3J0ZWQuCisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4xLjguMiIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKzIwMDAtMDYtMDYgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4xLjguMSIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKzIwMDAtMDYtMDYgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyAobW91bnRfZHVtcF8xX3N2Yyk6IENhc3Qgc3ZjX2dldGNhbGxlcgorCXRvICJzdHJ1Y3Qgc29ja2FkZHJfaW4gKiIgZm9yIGdsaWJjIDIuMi4KKwkobW91bnRfdW1udF8xX3N2Yyk6IExpa2V3aXNlLgorCShtb3VudF91bW50YWxsXzFfc3ZjKTogTGlrZXdpc2UuCisJKG1vdW50X2V4cG9ydF8xX3N2Yyk6IExpa2V3aXNlLgorCShtb3VudF9leHBvcnRhbGxfMV9zdmMpOiBMaWtld2lzZS4KKwkobW91bnRfcGF0aGNvbmZfMl9zdmMpOiBMaWtld2lzZS4KKwkoZ2V0X3Jvb3RmaCk6IExpa2V3aXNlLgorCisyMDAwLTA2LTA0ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mcy5pbml0OiBGaXggYSB0eXBvIGluIGNvbW1lbnQuCisKKzIwMDAtMDUtMzEgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4xLjgiLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBVcGRhdGVkLgorCisJKiBSRUFETUU6IFVwZGF0ZWQuCisKKzIwMDAtMDUtMzEgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4xLjcuNSIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKwkqIHN1cHBvcnQvaW5jbHVkZS9uZnNsaWIuaCAoZXhwb3J0ZW50KTogQWRkIGEgbmV3IGZpZWxkLAorCXJfY291bnQsIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgbW91bnRzIGZyb20gYSBjbGllbnQuCisJKGdldHJtdGFiZW50KTogVGFrZSBhIG5ldyBhcmd1bWVudCBmb3IgcG9zaXRpb24gaW4gZmlsZS4KKwkocHV0cm10YWJlbnQpOiBMaWtld2lzZS4KKwkoZmdldHJtdGFiZW50KTogTGlrZXdpc2UuCisJKGZwdXRybXRhYmVudCk6IExpa2V3aXNlLgorCSogc3VwcG9ydC9uZnMvcm10YWIuYyAoZ2V0cm10YWJlbnQpOiBIYW5kbGUgdGhlIG5ldyBhcmd1bWVudAorCWZvciBwb3NpdGlvbiBpbiBmaWxlLgorCShmZ2V0cm10YWJlbnQpOiBMaWtld2lzZS4KKwkocHV0cm10YWJlbnQpOiBMaWtld2lzZS4KKwkoZnB1dHJtdGFiZW50KTogTGlrZXdpc2UuCisKKwkqIHN1cHBvcnQvbmZzL3JtdGFiLmMgKGZnZXRybXRhYmVudCk6IEdldCB2YWx1ZSBmb3IgdGhlIG5ldworCWZpZWxkLCByX2NvdW50LgorCisJKiBzdXBwb3J0L2V4cG9ydC9ybXRhYi5jIChybXRhYl9yZWFkKTogUGFzcyBOVUxMIGFzIHRoZSBuZXcKKwlhcmd1bWVudCB0byBnZXRybXRhYmVudCAoKSwgZmdldHJtdGFiZW50ICgpLCBwdXRybXRhYmVudCAoKQorCWFuZCBmcHV0cm10YWJlbnQgKCkuCisJKiB1dGlscy9tb3VudGQvcm10YWIuYyAobW91bnRsaXN0X2FkZCk6IExpa2V3aXNlLgorCShtb3VudGxpc3RfZGVsKTogTGlrZXdpc2UuCisJKG1vdW50bGlzdF9kZWxfYWxsKTogTGlrZXdpc2UuCisJKG1vdW50bGlzdF9saXN0KTogTGlrZXdpc2UuCisKKwkqIHV0aWxzL21vdW50ZC9ybXRhYi5jIChtb3VudGxpc3RfYWRkKTogSW5jcmVtZW50ICJyX2NvdW50IgorCWZvciB0aGUgZXhpc3RpbmcgZW50cnkgYW5kIGluaXRpYWxpemUgInJfY291bnQiIHRvIDEuCisJKG1vdW50bGlzdF9kZWwpOiBEZWNyZW1lbnQgInJfY291bnQiLgorCisyMDAwLTA1LTE4ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIjAuMS43LjQiLgorCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KKwkqIG5mcy11dGlscy5zcGVjOiBVcGRhdGVkLgorCisyMDAwLTA1LTE4ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBldGMvcmVkaGF0L25mcy5pbml0IChyZXN0YXJ0KTogSnVzdCBkbyBzdG9wIGFuZCBzdGFydC4KKworMjAwMC0wNS0wOSAgSmF5IFdlYmVyIDxqd2ViZXJAdmFsaW51eC5jb20+CisKKwkqIHV0aWxzL3JxdW90YWQvaGFzcXVvdGEuYzogYWRkZWQgc3VwcG9ydCBmb3IgZXh0MyByZWNvZ25pdGlvbgorCWluIHJxdW90YWQuCisJKiB1dGlscy9ycXVvdGFkL21udGVudC5oOiBMaWtld2lzZS4KKworMjAwMC0wNS0wMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjEuNy4zIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogVXBkYXRlZC4KKworMjAwMC0wNS0wMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc2VydmVyLmMgKGdldHF1b3RhaW5mbyk6IFNraXAgYmFkCisJbW91bnRpbmcgcG9pbnMgaW4gL2V0Yy9mc3RhYi4KKworMjAwMC0wNS0wMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjEuNy4yIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogVXBkYXRlZC4KKworMjAwMC0wNS0wMSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc2VydmVyLmMgKGdldHF1b3RhaW5mbyk6IENhbGwgc3RhdCAoKQorCXRvIGNoZWNrIGZvciB0aGUgbW91bnRpbmcgcG9pbnQuCisKKzIwMDAtMDQtMjkgIENoaXAgU2FsemVuYmVyZyAgPGNoaXBAdmFsaW51eC5jb20+CisJICAgIE5laWwgQnJvd24gIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKKwkqIFJlYWxseSByZS11c2UgUlBDIHBvcnRzLgorCSAgKEZpeGVzIGVhcmxpZXIgcGF0Y2guICBTb3JyeSwgTmVpbC4pCisKKzIwMDAtMDQtMjYgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAiMC4xLjcuMSIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKzIwMDAtMDQtMjYgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGV0Yy9yZWRoYXQvbmZzbG9jay5pbml0OiBDaGVjayBpZiBsb2NrZCBleGl0cyBiZWZvcmUga2lsbGluZworCWl0LgorCisyMDAwLTA0LTI1ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBSRUFETUU6IFJlcXVpcmUgdXRpbC1saW51eC0yLjEwZi1tb3VudC1ycGMucGF0Y2ggZm9yIG1vdW50LgorCisyMDAwLTAzLTIxIE1pY2hhZWwgV2Vpc2VyIDxtaWNoYWVsQHdlaXNlci5zYWFsZS1uZXQuZGU+CisKKwkqIHN1cHBvcnQvbmZzL2V4cG9ydHMuYyAocGFyc2VzcXVhc2gpOiBDb3JyZWN0bHkgc2V0IHRoZQorCXJldHVybiBwb2ludGVyLgorCitUdWUgTWFyIDIxIDExOjM4OjQ4IEVTVCAyMDAwIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L2luY2x1ZGUvbmZzL25mcy5oOiBSZW1vdmVkIGtub3dsZWRnZSBvZiBpbnRlcm5hbHMgb2YKKwkgICAgIGtlcm5lbCBmaWxlaGFuZGxlcyAod2hpY2ggY2FuIGNoYW5nZSkgYW5kIGRlZmluZWQgbmZzX2ZoX3NpemUKKwkgICAgIHdoaWNoIGhhcyB2YXJpYWJsZSBzaXplCisJCisJKiBzdXBwb3J0L25mcy9nZXRmaC5jOiBkZWZpbmVkIGdldGZoX3NpemUgdG8gdXNlIG5ldyBzeXNjYWxsIHRvCisJICAgICBnZXQgdmFyaWFibGUgc2l6ZWQgZmlsZSBoYW5kbGVzLCBhbmQgY2hhbmdlIGdldGZoeyxvbGR9IHRvCisJICAgICB1c2UgbmZzX2ZoX3NpemUJICAgIAorCQorCSogdXRpbHMvbW91bnRkL21vdW50ZC5jOiB1c2UgbmZkX2ZoX3NpemUgYW5kIGNhbGwgZ2V0Zmhfc2l6ZSBmb3IKKwkgICAgIE5GU3YzIGZpbGUgaGFuZGxlcworCisJKiB0b29scy9NYWtlZmlsZSwgdG9vbHMvbmxtdGVzdC9ubG10ZXN0LmMKKwkgICAgIG5sbXRlc3QuYyBkZXBlbmRlZCBvbiBpbnRlcm5lbCBmb3JtYXQgb2YgZmlsZSBoYW5kbGVzLCBzbyBub3cKKwkgICAgIGRvZXNuJ3Qgd29yay4KKworCQorMjAwMC0wMy0xMiAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEB2YWxpbnV4LmNvbT4KKwkgICAgTmVpbCBCcm93biAgPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9uZnMvcnBjbWlzYy5jIChycGNfaW5pdCk6IFNoYXJlIHRyYW5zcG9ydHMuCisKKzIwMDAtMDMtMTMgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogZXRjL3JlZGhhdC9uZnNkLmluaXQ6IFVwZGF0ZWQuCisKKwkqIGV0Yy9yZWRoYXQvbmZzbG9jay5pbml0OiBVcGRhdGVkLgorCisJKiBuZnMtdXRpbHMuc3BlYy5pbjogVXBkYXRlZC4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjEuNyIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKwkqIFJFQURNRTogVXBkYXRlZC4KKworV2VkIE1hciAgOCAwOTo0Mjo0MyAyMDAwIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYyAoZHVtcCk6IEluY2x1ZGVkIHByaW50aW5nIG9mCisJICAgbm9oaWRlLCBub19zdWJ0cmVlX2NoZWNrLCBhbmQgaW5zZWN1cmVfbG9ja3MKKworMjAwMC0wMi0yNiAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEB2YWxpbnV4LmNvbT4KKworCSogY29uZmlnLm1rLmluIChJTlNUQUxMU1VJRCk6IFN0cmlwICgiLXMiKS4KKwkoSU5TVEFMTFNDUklQVCk6IERlZmluZS4KKwkqIHV0aWxzL25oZnNzdG9uZS9NYWtlZmlsZTogVXNlIGl0LgorCisyMDAwLTAyLTI2ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiB1dGlscy9sb2NrZC9sb2NrZC5tYW46IENyZWF0ZS4KKwkqIHV0aWxzL2xvY2tkL01ha2VmaWxlOiBJbnN0YWxsIGl0LgorCSogdXRpbHMvbmhmc3N0b25lL25oZnN7cnVuLG51bXMsZ3JhcGh9Lm1hbjogQ3JlYXRlLgorCSogdXRpbHMvbmhmc3N0b25lL25oZnNzdG9uZS5tYW46IENoYW5nZSBzdWZmaXggZnJvbSAiLjEiLgorCSogdXRpbHMvbmhmc3N0b25lL01ha2VmaWxlOiBJbnN0YWxsIHRoZSBoZWxwZXIgc2NyaXB0cyBhbmQKKwkgIGFsbCBmb3VyIG1hbiBwYWdlcy4KKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydHMubWFuOiBGaXggdHlwby4KKworMjAwMC0wMi0yNiAgQ2hpcCBTYWx6ZW5iZXJnICA8Y2hpcEB2YWxpbnV4LmNvbT4KKworCSogc3VwcG9ydC9uZnMveGlvLmMgKHh1bmdldGMpOiBEZWNyZW1lbnQgbGluZSBudW1iZXIgd2hlbgorCWNoYXJhY3RlciB0byB1bmdldCBpcyBuZXdsaW5lLiAgTWFrZSBmaXJzdCBwYXJhbWV0ZXIgaW50LCBzbworCWl0IGNhbiBkaXN0aW5ndWlzaCBFT0YgZnJvbSBcMzc3LgorCSogc3VwcG9ydC9pbmNsdWRlL3hpby5oICh4dW5nZXRjKTogQWRqdXN0IHByb3RvdHlwZS4KKworRnJpIEZlYiAgNCAyMzo0MjoyMyAyMDAwIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogc3VwcG9ydC9pbmNsdWRlL25mcy9leHBvcnQuaDogYWRkZWQgTkZTRVhQX05PQVVUSE5MTQorCSogc3VwcG9ydC9uZnMvZXhwb3J0cy5jOiBhZGRlZCBoYW5kbGluZyBmb3IgTkZTRVhQX05PQVVUSE5MTQorCSogdXRpbHMvZXhwb3J0ZnMvZXhwb3J0cy5tYW46IGFkZGVkIGRvY3VtZW50YXRpb24gZm9yIG5vX2F1dGhfbmxtLgorCisJVGhpcyBpcyBmb3Igc3VwcG9ydGluZyBhIG5ldyBvcHRpb24gaW50cm9kdWNlZCBpbiAyLjMuNDIKKworVGh1IEZlYiAgMyAxNDo1NTo0OCAyMDAwIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIENPUFlJTkc6IEFkZGVkLiBHUEwuCisKK1RodSBGZWIgMDMgMTQ6NDA6NDAgMjAwMCBDcmlzdGlhbiBHYWZ0b24gPGdhZnRvbkByZWRoYXQuY29tPgorCisJKiB1dGlscy9ycXVvdGFkL3JxdW90YV9zZXJ2ZXIuYyAoZ2V0cXVvdGFpbmZvKTogQ2FsbCBzdGF0ZnMgKCkKKwl0byBnZXQgdGhlIGJsb2NrIHNpemUuCisKK1R1ZSBKYW4gMjUgMTE6MDQ6MTcgMjAwMCBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBuZnMtdXRpbHMuc3BlYy5pbjogVXBkYXRlIGZ0cCBzaXRlLgorCitNb24gSmFuIDE3IDExOjQ4OjE4IDIwMDAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogUkVBRE1FOiBVcGRhdGUgaG9zdG5hbWVzLgorCitUdWUgSmFuIDExIDEwOjA2OjIyIDIwMDAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjEuNiIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKwkqIFJFQURNRTogVXBkYXRlZC4KKworTW9uIEphbiAxMCAxNDoyNjozMyAyMDAwIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL21vdW50ZC9hdXRoLmMgKGF1dGhfYXV0aGVudGljYXRlX2ludGVybmFsKTogQ2FsbAorCXhzdHJkdXAgZm9yIGhvc3RuYW1lIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGdldGhvc3RieW5hbWUuCisKKwkqIHV0aWxzL21vdW50ZC9tb3VudGQuYyAoZ2V0X2V4cG9ydGxpc3QpOiBVc2UgeHN0cmR1cCBpbnN0ZWFkCisJb2Ygc3RyZHVwLgorCitTdW4gRGVjIDE5IDA5OjM1OjAxIDE5OTkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIFJFQURNRTogVXBkYXRlIHRoZSBtYWlsaW5nIGxpc3QgYWRkcmVzcy4KKworU3VuIERlYyAxOSAwOToyMjoyOCAxOTk5ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIjAuMS41Ii4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisJKiBuZnMtdXRpbHMuc3BlYzogVXBkYXRlZC4KKworCSogUkVBRE1FOiBVcGRhdGVkLgorCitNb24gRGVjIDEzIDEzOjQwOjIwIDE5OTkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHV0aWxzL3JxdW90YWQvaGFzcXVvdGEuYyAoaGFzcXVvdGEpOiBNYWxsb2Mgb25lIG1vcmUgY2hhcgorCWZvciAnLycuCisKK01vbiBEZWMgIDYgMDk6NDI6NDUgMTk5OSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICIwLjEuNCIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCSogbmZzLXV0aWxzLnNwZWM6IFVwZGF0ZWQuCisKKwkqIFJFQURNRTogVXBkYXRlZC4KKworTW9uIERlYyAgNiAwOToyODowNyAxOTk5ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBuZnMtdXRpbHMuc3BlYy5pbjogTmV3IGZpbGUuCisKKwkqIGNvbmZpZy5tay5pbiAoVkVSU0lPTik6IENoYW5nZWQgdG8gIm5mcy11dGlscyBAVkVSU0lPTkAiLgorCisJKiBjb25maWd1cmUuaW4gKG5mcy11dGlscy5zcGVjKTogQWRkZWQgdG8gQUNfT1VUUFVULgorCisxOTk5LTEyLTA0ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiBjb25maWcubWsuaW46IFVzZSAkKENDKSBhcyBzZXQgYnkgY29uZmlndXJlLgorCisxOTk5LTEyLTA0ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiBydWxlcy5tazogQ2FsbCAkKE1BS0UpIHdpdGggJChNRkxBR1MpLgorCitNb24gTm92IDI5IDExOjE3OjM1IDE5OTkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIHRvb2xzL3JwY2dlbi9ycGNfbWFpbi5jIChoX291dHB1dCk6IEdlbmVyYXRlIElYRFJfR0VUX0lOVDMyLAorCUlYRFJfUFVUX0lOVDMyLCBJWERSX0dFVF9VX0lOVDMyIGFuZCBJWERSX1BVVF9VX0lOVDMyLgorCitNb24gTm92IDI5IDExOjE3OjM1IDE5OTkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIG5mcy11dGlscy5zcGVjIChWZXJzaW9uKTogU2V0IHRvIDAuMS4zLgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIm5mcy11dGlscyAwLjEuMyIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJKiBSRUFETUU6IFVwZGF0ZWQuCisKK01vbiBOb3YgMjkgMTE6MTU6NDcgMTk5OSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvcnF1b3RhZC9ycXVvdGFfc2VydmVyLmMgKG5mc21vdW50X3RvX2Rldm5hbWUpOiBSZW1vdmVkLgorCShfUEFUSF9ERVZfRFNLKTogTGlrZXdpc2UuCisJKGdldHF1b3RhaW5mbyk6IE1hdGNoIHRoZSBtb3VudGluZyBwb2ludCBmcm9tIC9ldGMvbXRhYgorCWluc3RlYWQgb2YgY2FsbGluZyBuZnNtb3VudF90b19kZXZuYW1lICgpLgorCisxOTk5LTExLTI0ICBDaGlwIFNhbHplbmJlcmcgIDxjaGlwQHZhbGludXguY29tPgorCisJKiB1dGlscy9zdGF0ZC9tb25pdG9yLmMgKHNtX21vbl8xX3N2Yyk6IEFjY2VwdCBsb2NrZCBjYWxsYmFja3MKKwl0byB0aGUgbmV3IHBvcnQgMjQgYXMgd2VsbCBhcyB0aGUgaGlzdG9yaWNhbCBwb3J0IDEwMDAyMS4KKworVHVlIE5vdiAyMyAxMDoyMTozNCAxOTk5IE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworCSogZXRjL3JlZGhhdC9uZnNkLmluaXQgKHN0b3ApOiBtb3ZlZCBleHBvcnRmcyAtdWEgYWZ0ZXIKKwlzdG9wcGluZyBuZnNkIHRvIHN0b3Agc3B1cmlvdXMgRVNUQUxFIG9uIHNlcnZlciBzaHV0ZG93bi4KKwkKK1R1ZSBOb3YgMjMgMTA6MTM6MzkgMTk5OSAgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisJKiBzdXBwb3J0L25mcy9leHBvcnRzLmMgKHBhcnNlb3B0cyk6IG1ha2UgY29weSBvZiBvcHQgc3RyaW5nCisJYmVmb3JlICdudWwnaW5nIG91dCBjb21tYXMgc28gdGhhdAorCisJIyBleHBvcnRmcyAtbyBvcHRpb24xLG9wdGlvbjIgaG9zdGE6L2ZzIGhvc3RiOi9mcworCisgICAgICAgIGFwcGxpZXMgYm90aCBvcHRpb25zIHRvIGJvdGggZXhwb3J0cy4KKworVGh1IE9jdCAyOCAxMjo1NTo0MiAxOTk5ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBSRUFETUU6IEZpeCBhIGZldyB0eXBvcy4KKworCSogdG9vbHMvcnBjZ2VuL3JwY19jb3V0LmMgKHByaW50X2hlYWRlcik6IFVzZSBpbnQzMl90IGluc3RlYWQKKwlvZiBsb25nLgorCSogdG9vbHMvcnBjZ2VuL3JwY19ob3V0LmMgKHBkZWZpbmUpOiBMaWtld2lzZS4KKwkqIHRvb2xzL3JwY2dlbi9ycGNfbWFpbi5jIChjX2luaXRpYWxpemUpOiBMaWtld2lzZS4KKwkqIHRvb2xzL3JwY2dlbi9ycGNfcGFyc2UuYyAoZ2V0X3R5cGUpOiBMaWtld2lzZS4KKwkodW5zaWduZWRfZGVjKTogTGlrZXdpc2UuCisJKiB0b29scy9ycGNnZW4vcnBjX3NjYW4uYyAoc3ltYm9scyk6IExpa2V3aXNlLgorCSogdG9vbHMvcnBjZ2VuL3JwY191dGlsLmMgKHRva3N0cmluZ3MpOiBMaWtld2lzZS4KKworCSogdG9vbHMvcnBjZ2VuL3JwY19jb3V0LmMgKGVtaXRfc2luZ2xlX2luX2xpbmUpOiBVc2UgSU5UMzIKKwlpbnN0ZWFkIG9mIExPTkcuCisJKiB0b29scy9ycGNnZW4vcnBjX3BhcnNlLmMgKGdldF90eXBlKTogTGlrZXdpc2UuCisJKHVuc2lnbmVkX2RlYyk6IExpa2V3aXNlLgorCSogdG9vbHMvcnBjZ2VuL3JwY19zY2FuLmMgKHN5bWJvbHMpOiBMaWtld2lzZS4KKwkqIHRvb2xzL3JwY2dlbi9ycGNfc2Nhbi5oICh0b2tfa2luZCk6IExpa2V3aXNlLgorCSogdG9vbHMvcnBjZ2VuL3JwY191dGlsLmMgKHRva3N0cmluZ3MpOiBMaWtld2lzZS4KKworVGh1IE9jdCAyOCAxMToyNzo1MSAxOTk5IE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKworICAgICAgICAqIHN1cHBvcnQvaW5jbHVkZS9uZnMvZXhwb3J0LmggYWRkZWRkIE5GU0VYUF9OT1NVQlRSRUVDSEVDSworICAgICAgICAqIHN1cHBvcnQvbmZzL2V4cG9ydHMuYzogYWRkZWQge25vXyx9c3VidHJlZV9jaGVjayBhbmQgY2hhbmdlZAorICAgICAgICAgIGNyb3NzbW50IHRvIG5vaGlkZQorICAgICAgICAqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydHMubWFuOiBhZGRlZCBub19zdWJ0cmVlX2NoZWNrIGFuZCBub2hpZGUKKyAgICAgICAgICBhbmQgcmVtb3ZlZCBpcnJlbGV2YW50IHN0dWZmIGZyb20gdW5mc2QuCisgICAgICAgICogc3VwcG9ydC9leHBvcnQvcm10YWIuYzogcm10YWJfcmVhZCBkaWRuJ3QgcXVpdGUgZG8gdGhlIHJpZ2h0CisgICAgICAgICAgdGhpbmcgaWYgYSBwYXRobmFtZSBmcm9tIHJtdGFiIHdhcyBhIHN1YmRpcmVjdG9yeSBvZiBhbiBleHBvcnQtcG9pbnQKKworVHVlIE9jdCAyNiAxNzoyMjo0MCAxOTk5ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiBSRUFETUU6IFVwZGF0ZWQgZnRwIHNpdGUuCisKK01vbiBPY3QgMjUgMTg6MTI6NDUgMTk5OSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogbmZzLXV0aWxzLnNwZWMgKFZlcnNpb24pOiBTZXQgdG8gMC4xLjIuCisKKwkqIGNvbmZpZ3VyZS5pbiAoVkVSU0lPTik6IFNldCB0byAibmZzLXV0aWxzIDAuMS4yIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKKwkqIFJFQURNRTogVXBkYXRlZC4KKworTW9uIE9jdCAyNSAxODoxMToyMSAxOTk5ICBILkouIEx1IDxoamxAbHVjb24ub3JnPgorCisJKiB1dGlscy9tb3VudGQvYXV0aC5jIChhdXRoX2Vycm9yKTogQWRkICJub19mb3J3YXJkX2RucyIuCisJKGF1dGhfYXV0aGVudGljYXRlX2ludGVybmFsKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuIG9uIGZvcndhcmQKKwlETlMgbG9va3VwLgorCShhdXRoX2F1dGhlbnRpY2F0ZSk6IEhhbmRsZSAibm9fZm9yd2FyZF9kbnMiLgorCitUaHUgT2N0IDIxIDE2OjIyOjA2IDE5OTkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIFZlcnNpb24gMC4xLjEgcmVsZWFzZWQuCisKKwkqIG5mcy11dGlscy5zcGVjIChWZXJzaW9uKTogU2V0IHRvIDAuMS4xLgorCisJKiBjb25maWd1cmUuaW4gKFZFUlNJT04pOiBTZXQgdG8gIm5mcy11dGlscyAwLjEuMSIuCisJKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgorCisJKiBSRUFETUU6IFVwZGF0ZWQuCisKK01vbiBPY3QgMTggMTc6NDM6MjkgMTk5OSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogbmZzLXV0aWxzLnNwZWMgKE9ic29sZXRlcyk6IEZpeGVkIGEgdHlwbywgY2hhbmdlIGtuZnNkLWNsaWVudAorCXRvIGtuZnNkLWNsaWVudHMuCisJKFByb3ZpZGVzKTogTGlrZXdpc2UuCisKK01vbiBPY3QgMTggMTQ6NTY6MjIgMTk5OSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogSW5pdGlhbCB2ZXJzaW9uIDAuMSByZWxlYXNlZC4KKworCSogY29uZmlndXJlLmluIChWRVJTSU9OKTogU2V0IHRvICJuZnMtdXRpbHMgMC4xIi4KKwkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCisKK01vbiBPY3QgMTggMTQ6NTQ6NTcgMTk5OSAgSC5KLiBMdSA8aGpsQGx1Y29uLm9yZz4KKworCSogdXRpbHMvbW91bnRkL21vdW50ZC5jIChnZXRfZXhwb3J0bGlzdCk6IENsZWFudXAuCisKKwkqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMgKHVuZXhwb3J0X2FsbCk6IFVuZXhwb3J0IGZyb20KKwlrZXJuZWwgb25seSBpZiB0aGUgZW50cnkgaXMgZXhwb3J0ZWQgdG8ga2VybmVsLgorCSh1bmV4cG9ydGZzKTogTGlrZXdpc2UuCisKK1dlZCBTZXAgMDggMTY6NDk6MzIgMTk5OSAgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorCisxLyB1dGlscy9tb3VudGQvcm10YWIuYzo6bW91bnRsaXN0X2xpc3QKKworICAgICBUaGlzIHJvdXRpbmUgc3RhdHMgdGhlIHJtdGFiIGZpbGUgdG8gc2VlIGlmIGl0IGhhcyBjaGFuZ2VkLiAgSXQKKyAgICAgaWYgaGFzLCBpdCBjbGVhbnMgdXAgaXQncyBvbGQgY29weSBvZiB0aGUgZGF0YS4gQnV0IGl0IHN0aWxsCisgICAgIGFsd2F5cyByZS1yZWFkIHRoZSBmaWxlLCB0aHVzIHJldHVybmluZyBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlCisgICAgIGRhdGEgb24gY29uc2VjdXRpdmUgY2FsbHMgd2l0aG91dCBpbnRlcnZlbmluZyBjaGFuZ2VzLgorICAgICAiU2hvd21vdW50IC1hIiBkaWRuJ3Qgc2hvdyB0aGlzIGFzIGl0IGFwcGVhcnMgdG8gc29ydC91bmlxdWUgdGhlCisgICAgIGRhdGEsIGJ1dCAnc3RyYWNlIHNob3dtb3VudCAtYScgc2hvd2VkIHRoYXQgdGhlIHNpemUgb2YgdGhlCisgICAgIGRhdGFncmFtIHRoYXQgaXQgcmVjZWl2ZWQgZ3Jldy4KKworICAgICBJIG1vdmVkIHRoZSBnZXRybXRhYmVudCBsb29wIGluc2lkZSB0aGUgbXRpbWUgdGVzdC4KKworMi8gdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYworICAgCisgICAgIE1hbnkgcm91dGluZXMgdXNlZCB0aGUgbV9wYXRoIGZpZWxkIG9mIG1fZXhwb3J0IGluc3RlYWQgb2YKKyAgICAgZV9wYXRoLgorICAgICBBY2NvcmRpbmcgdG8gdGhlIGNvbW1lbnQgaW4gbmZzbGliLmgsIG1fcGF0aCBzaG91bGQgb25seQorICAgICBiZSB1c2VkIHdoZW4gcHJvY2Vzc2luZyBhIG1vdW50IHJlcXVlc3QgKGkuZS4gaW4gbW91bnRkKQorICAgICB3aGVyZSB0aGUgbW91bnRwb2ludCBtYXkgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIGV4cG9ydCBwb2ludC4KKworICAgICBJIGNoYW5nZWQgYWxsIG9jY3VyYW5jZXMgb2YgbV9wYXRoIHRvIGVfcGF0aAorCisKKzMvIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmM6bWFpbgorCisgICAgICBleHRyYSBhcmd1bWVudHMgYXJlIG5vdCBtZWFuaW5nZnVsIHdpdGggLWEgb3IgLXIsIGJ1dAorICAgICAgZXhwb3J0ZnMgYWNjZXB0ZWQgdGhlbSBhbmQgdGhlbiBpZ25vcmVkIHRoZSAtYS8tciwgZXhwZWN0IHRoYXQKKyAgICAgIC1yIHdvdWxkIHN0aWxsIHVuZXhwb3J0IGV2ZXJ5dGhpbmcgZmlyc3QuCisKKyAgICAgIEkgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgdGhlcmUgYXJlIGV4dHJhIGFyZ3MgYW5kIGZfYWxsCisKKzQvIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmM6bWFpbgorICAgICBleHRyYWN0IGR1bXAgb3V0IGFzIGEgc3BlY2lhbCBjYXNlLgorCis1LyB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jCisgICAgIG1hZGUgZl9yZWV4cG9ydCBhIGxvY2FsIHZhcmlhYmxlLgorCisKKzYvIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmM6bWFpbixleHBvcnRhbGwKKworICAgIHN1cHBvcnQvZXhwb3J0L3JtdGFiLmMKKyAgICAgICBvbmx5ICBtYXlleHBvcnQgb24gbmV3bHkgY3JlYXRlZCBlbnRyaWVzLCBkb24ndCBzZXQgeHRhYmVudCBhdCBhbGwKKworNy8gc3VwcG9ydC9pbmNsdWRlL25mc2xpYi5oCisKKyAgICAgIGFkZCAjZGVmaW5lIF9QQVRIX1BST0NfRVhQT1JUUyB0byBiZSAvcHJvYy9mcy9uZHMvZXhwb3J0cworCis4LyBzdXBwb3J0L2V4cG9ydC94dGFiLmMKKworICAgICAgeHRhYl9tb3VudF9yZWFkIGxvYWRzIGRhdGEgZnJvbSBfUEFUSF9QUk9DX0VYUE9SVFMgaWYgaXQgZXhpc3RzLAorICAgICAgZWxzZSBmcm9tIHh0YWIKKworCis5LyBzdXBwb3J0L2V4cG9ydC94dGFiLmMKKworICAgICAgeHRhYl9tb3VudF9yZWFkIG5vdyBzZXRzIG1fZXhwb3J0ZWQsIGFuZCBOT1QKKwl4dGFiZW50IGFuZCBtYXlleHBvcnQKKworICAgICAgcmVtb3ZlZCB0aGUgYXBwZW5kIGFyZ3VlbWVudCBmcm9tIHh0YWJfd3JpdGUgYXMgaXQgd2FzCisJbmV2ZXIgdXNlZC4KKworICAgICAgYWRkZWQgaXNfZXhwb3J0IGZsYWcgdG8geHRhYl93cml0ZSBzaW1pbGFyIHRvIHh0YWJfcmVhZAorCWlmIGlzX2V4cG9ydCwgb25seSB3cml0ZSBlbnRyaWVzIHdpdGggbV94dGFiZW50IG9yIG1fYWRkeHRhYgorCWlmICFpc19leHBvcnQsIG9ubHkgd3JpdGUgZW50cmllcyB3aXRoIG1fZXhwb3J0ZWQKKyAgICAgCisxMC8gc3VwcG9ydC9leHBvcnQvZXhwb3J0LmM6OmV4cG9ydF9hbGxvd2VkX2ludGVybmFsCisKKyAgICAgIGFkZGVkIHRlc3QgZm9yIGV4cC0+bV9tYXlleHBvcnQsIGFzIHRoZSBleHBvcnQgdHJlZQorCW1heSBoYXZlIGVudHJpZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gYmUgZXhwb3J0ZWQsCisJYW5kIHNvIHNob3VsZG4ndCBjYXVzZWQgZGVkdWNlZCBleHBvcnRlZCBieSBybXRhYl9yZWFkCisKKzExLyB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jOjptYWluCisJZXJyb3IgY2hlY2tpbmcgb2YgZmxhZ3MuCisKKzEyLyB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5jCisKKwl0b3RhbCByZXdyaXRlIG9mIGV4cG9ydCBhbmQgdW5leHBvcnQgbG9naWMuCisJV2Ugbm93OgorCS0gIGJ1aWxkIGFuIGV4cG9ydHNsaXN0IG9mIHZhbGlkIGV4cG9ydHMsIGJhc2VkIG9uCisJICAgY3VycmVudCBldGFiIGZpbGUgIGFuZCBhcmd1bWVudHMsCisgICAgICAgIC0gIHJlYWQgcm10YWIgdG8gaW5zdGFudGlhdGUgcmVsZXZhbnQgd2lsZCBjYXJkIGVudHJpZXMKKwktICByZWFkIGV0YWIgdG8gZmluZCBvdXQgd2hhdCBpcyBjdXJyZW50bHkgZXhwb3J0ZWQKKwktICBzeW5jaHJvbmlzZSBpbnRlbnRpb24gd2l0aCByZWFsaXR5CisJLSAgd3JpdGUgb3V0IGV0YWIgYW5kIHh0YWIKKworMTMvICB2YXJpb3VzCisJZGlzY2FyZCB0aGUgbV9hZGR4dGFiIGZsYWcKKwlhZGQgbV9jaGFuZ2VkIGZsYWcgc28gd2Uga25vdyB3aGF0IHRvIHJlcG9ydCBpbiBleHBvcnRmcworCisxNC8gdXRpbHMvbW91bnRkL2F1dGguYzphdXRoX2F1dGhlbnRpY2F0ZQorCisJdGhlIHZhbHVlIHJldHVybmVkIGJ5IGdldGhvc3RieWFkZHIgd2FzIHRydXN0ZWQuCisKKwlJdCBub3cgZm9sbG93cyB0aGlzIHdpdGggYSBjYWxsIHRvIGdldGhvc3RieW5hbWUKKwlhbmQgY2hlY2tzIHRoYXQgdGhlIGFkZHJlc3MgaXMgaW4gdGhlIGxpc3QuCisKKzE1LyBzdXBwb3J0L2V4cG9ydC9uZnNjdGwuYzo6Y2x0c2V0dXAsZXhwc2V0dXAKKworCWZvcmNlIGNsaWVudCBuYW1lcyB0byBsb3dlcmNhc2UgYXMga2VybmVsIGlzCisJc2Vuc2l0aXZlIHRvIGNhc2UKKworMTYvIHF1aWV0ZW5lZCBhIGZldyBjb21waWxlciB3YXJuaW5ncworCisxNy8gc3VwcG9ydC9leHBvcnQvY2xpZW50OmNsaWVudF9sb29rdXAKKworICAgICBsb29rIGZvciBwcmUtZXhpc3RpbmcgY2xpZW50IHdpdGggc2FtZSBuYW1lIGJlZm9yZSBjcmVhdGluZworCWEgbmV3IG9uZS4KKworMTgvIHN1cHBvcnQvaW5jbHVkZS9leHBvcnRmcy5oCisKKyAgICAgVGhlIG9yZGVyaW5nIG9mIHRoZSBNQ0xfKiBlbnVtIHdhczoKKwlBTk9OWU1PVVMsIEZRRE4sIFNVQk5FVFdPUkssIFdJTERDQVJELCBORVRHUk9VUAorCisgICAgIEkgbW92ZWQgQU5PTllNT1VTIHRvIHRoZSBlbmQuCisKKyAgICAgVGhlIG9yZGVyaW5nIGlzIHNpZ25pZmljYW50IHdoZW4gYW4gZXhwb3J0IGVudHJ5IGlzIGJlaW5nIHNlYXJjaGVkIGZvciB0byAKKwltYXRjaCBhIGdpdmVuIGFkZHJlc3MuICBUaGVyZSBhcmUgdHdvIHByb2JsZW1zIHdpdGggQU5PTllNT1VTIGJlaW5nIGZpcnN0LgorCisJMS8gaWYgYSBkaXJlY3RvcnkgaXMgZXhwb3J0ZWQgcncgdG8gYSBjb3VwbGUgb2YgaG9zdHMgYW5kIHJvIHRvIGV2ZXJ5b25lIGVsc2UsCisJICAgdGhlbiB0aGUgcm8gY2FzZSB3aWxsIGFsd2F5cyBiZSBmb3VuZCBmaXJzdCBhbmQgdGhlIHByaXZpbGVnZWQgaG9zdHMgd29uJ3QgZ2V0CisJICAgdGhlaXIgcHJpdmlsZWdlCisJMi8gV2hlbiBtb3VudGQgZ2V0cyBhIHJlcXVlc3QgdG8gbW91bnQgYW4gQU5PTllNT1VTbHkgZXhwb3J0ZWQgdHJlZSwgaXQgY3JlYXRlcyBhIEZRRE4KKwkgICBleHBvcnQgZW50cnkgZm9yIHRoZSBzcGVjaWZpYyBob3N0LCBhbmQgd3JpdGVzIGl0IHRvIHh0YWIuCisJICAgV2hlbiBhbm90aGVyIHJlcXVlc3QgY29tZXMgZnJvbSB0aGUgc2FtZSBob3N0LCB0aGUgQU5PTllNT1VTIGVudHJ5IGlzIGZvdW5kIGFnYWluLCAKKwkgICBiZWZvcmUgdGhlIG5ldyBGUUROIGVudHJ5LCBzbyBpdCBjcmVhdGVzIGFub3RoZXIgRlFETiBlbnRyeSBhbmQgd3JpdGVzIGl0IHRvIHh0YWIKKwkgICBhZ2Fpbi4gIElmIGNhdXNlcyBibG9hdCBpbiB4dGFiLgorCisgICAgICBQdXR0aW5nIEFOT05ZTU9VUyBhdCB0aGUgZW5kIHJlZmxlY3RzIGl0J3MgbmF0dXJlIGFzIGEgY2F0Y2gtYWxsCisKKzE5LyB1dGlscy9leHBvcnRmcy9leHBvcnRmcy5tYW4KKwltYW55IHVwZGF0ZXMgdG8gdGhlIG1hbiBwYWdlIHRvIHJlZmxlY3QgY2hhbmdlcyB0byB0aGUgY29kZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworVE9ETzoKKworLSBhbGxvdyBleHBvcnRmcyB0byBtb2RpZnkgcm10YWIgZmlsZQorLSBtYWtlIHN1cmUga2VybmVsIG5ldmVyIGdldHMgdHdvIGNsaWVudHMgd2l0aCBzYW1lIElQIGFkZHJlc3MKKyAgICAtIHBvc3NpYmxlIGtlcm5lbCBzaG91bGQgcmVqZWN0CisgICAgLSBuZWVkcyB0byBiZSBzb21lIHdheSB0byBsb29rdXAgY2xpZW50IGluIGtlcm5lbCBieSBJUCBhZGRyZXNzCistIG1heWJlIGdldCBrZXJuZWwgdG8gZG8gY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucyBvbiBjbGllbnQgbmFtZXMKKy0gcmVtb3ZlIHVudXNlZCBjbGllbnRzIGZyb20ga2VybmVsCisKKy0gY2hhbmdlIGV0YWIgdG8geHRhYiBhbmQgeHRhYiB0byB4dGFiLmFjdGl2ZQorCistIHRpbWVzdGFtcCBhbmQvb3Igc3RhdGQtc3RhbXAgaW4gcm10YWIgZm9yIHJlbW92aW5nIG9sZCBlbnRyaWVzLgorCitNb24gT2N0IDE4IDExOjQ4OjA3IDE5OTkgIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+CisKKwkqIGxpbnV4LW5mczogTmV3IGRpcmVjdG9yeS4KKwkqIGxpbnV4LW5mcy9DaGFuZ2VMb2c6IE1vdmVkIGZyb20gLi4KKwkqIGxpbnV4LW5mcy9JTlNUQUxMOiBMaWtld2lzZS4KKwkqIGxpbnV4LW5mcy9LTk9XTkJVR1M6IExpa2V3aXNlLgorCSogbGludXgtbmZzL05FVzogTGlrZXdpc2UuCisJKiBsaW51eC1uZnMvUkVBRE1FOiBMaWtld2lzZS4KKwkqIGxpbnV4LW5mcy9USEFOS1M6IExpa2V3aXNlLgorCSogbGludXgtbmZzL1RPRE86IExpa2V3aXNlLgorCisJKiBTdGFydGluZyBmcm9tIGtuZnNkIDEuNC43LgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL0lOU1RBTEwgYi9uZnMtdXRpbHMtMS4yLjIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDJhMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL0lOU1RBTEwKQEAgLTAsMCArMSwxODIgQEAKK0Jhc2ljIEluc3RhbGxhdGlvbgorPT09PT09PT09PT09PT09PT09CisKKyAgIFRoZXNlIGFyZSBnZW5lcmljIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisKKyAgIFRoZSBgY29uZmlndXJlJyBzaGVsbCBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgY29ycmVjdCB2YWx1ZXMgZm9yCit2YXJpb3VzIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIHVzZWQgZHVyaW5nIGNvbXBpbGF0aW9uLiAgSXQgdXNlcwordGhvc2UgdmFsdWVzIHRvIGNyZWF0ZSBhIGBNYWtlZmlsZScgaW4gZWFjaCBkaXJlY3Rvcnkgb2YgdGhlIHBhY2thZ2UuCitJdCBtYXkgYWxzbyBjcmVhdGUgb25lIG9yIG1vcmUgYC5oJyBmaWxlcyBjb250YWluaW5nIHN5c3RlbS1kZXBlbmRlbnQKK2RlZmluaXRpb25zLiAgRmluYWxseSwgaXQgY3JlYXRlcyBhIHNoZWxsIHNjcmlwdCBgY29uZmlnLnN0YXR1cycgdGhhdAoreW91IGNhbiBydW4gaW4gdGhlIGZ1dHVyZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhIGZpbGUKK2Bjb25maWcuY2FjaGUnIHRoYXQgc2F2ZXMgdGhlIHJlc3VsdHMgb2YgaXRzIHRlc3RzIHRvIHNwZWVkIHVwCityZWNvbmZpZ3VyaW5nLCBhbmQgYSBmaWxlIGBjb25maWcubG9nJyBjb250YWluaW5nIGNvbXBpbGVyIG91dHB1dAorKHVzZWZ1bCBtYWlubHkgZm9yIGRlYnVnZ2luZyBgY29uZmlndXJlJykuCisKKyAgIElmIHlvdSBuZWVkIHRvIGRvIHVudXN1YWwgdGhpbmdzIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UsIHBsZWFzZSB0cnkKK3RvIGZpZ3VyZSBvdXQgaG93IGBjb25maWd1cmUnIGNvdWxkIGNoZWNrIHdoZXRoZXIgdG8gZG8gdGhlbSwgYW5kIG1haWwKK2RpZmZzIG9yIGluc3RydWN0aW9ucyB0byB0aGUgYWRkcmVzcyBnaXZlbiBpbiB0aGUgYFJFQURNRScgc28gdGhleSBjYW4KK2JlIGNvbnNpZGVyZWQgZm9yIHRoZSBuZXh0IHJlbGVhc2UuICBJZiBhdCBzb21lIHBvaW50IGBjb25maWcuY2FjaGUnCitjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisKKyAgIFRoZSBmaWxlIGBjb25maWd1cmUuaW4nIGlzIHVzZWQgdG8gY3JlYXRlIGBjb25maWd1cmUnIGJ5IGEgcHJvZ3JhbQorY2FsbGVkIGBhdXRvY29uZicuICBZb3Ugb25seSBuZWVkIGBjb25maWd1cmUuaW4nIGlmIHlvdSB3YW50IHRvIGNoYW5nZQoraXQgb3IgcmVnZW5lcmF0ZSBgY29uZmlndXJlJyB1c2luZyBhIG5ld2VyIHZlcnNpb24gb2YgYGF1dG9jb25mJy4KKworVGhlIHNpbXBsZXN0IHdheSB0byBjb21waWxlIHRoaXMgcGFja2FnZSBpczoKKworICAxLiBgY2QnIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZSdzIHNvdXJjZSBjb2RlIGFuZCB0eXBlCisgICAgIGAuL2NvbmZpZ3VyZScgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlIGZvciB5b3VyIHN5c3RlbS4gIElmIHlvdSdyZQorICAgICB1c2luZyBgY3NoJyBvbiBhbiBvbGQgdmVyc2lvbiBvZiBTeXN0ZW0gViwgeW91IG1pZ2h0IG5lZWQgdG8gdHlwZQorICAgICBgc2ggLi9jb25maWd1cmUnIGluc3RlYWQgdG8gcHJldmVudCBgY3NoJyBmcm9tIHRyeWluZyB0byBleGVjdXRlCisgICAgIGBjb25maWd1cmUnIGl0c2VsZi4KKworICAgICBSdW5uaW5nIGBjb25maWd1cmUnIHRha2VzIGF3aGlsZS4gIFdoaWxlIHJ1bm5pbmcsIGl0IHByaW50cyBzb21lCisgICAgIG1lc3NhZ2VzIHRlbGxpbmcgd2hpY2ggZmVhdHVyZXMgaXQgaXMgY2hlY2tpbmcgZm9yLgorCisgIDIuIFR5cGUgYG1ha2UnIHRvIGNvbXBpbGUgdGhlIHBhY2thZ2UuCisKKyAgMy4gT3B0aW9uYWxseSwgdHlwZSBgbWFrZSBjaGVjaycgdG8gcnVuIGFueSBzZWxmLXRlc3RzIHRoYXQgY29tZSB3aXRoCisgICAgIHRoZSBwYWNrYWdlLgorCisgIDQuIFR5cGUgYG1ha2UgaW5zdGFsbCcgdG8gaW5zdGFsbCB0aGUgcHJvZ3JhbXMgYW5kIGFueSBkYXRhIGZpbGVzIGFuZAorICAgICBkb2N1bWVudGF0aW9uLgorCisgIDUuIFlvdSBjYW4gcmVtb3ZlIHRoZSBwcm9ncmFtIGJpbmFyaWVzIGFuZCBvYmplY3QgZmlsZXMgZnJvbSB0aGUKKyAgICAgc291cmNlIGNvZGUgZGlyZWN0b3J5IGJ5IHR5cGluZyBgbWFrZSBjbGVhbicuICBUbyBhbHNvIHJlbW92ZSB0aGUKKyAgICAgZmlsZXMgdGhhdCBgY29uZmlndXJlJyBjcmVhdGVkIChzbyB5b3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yCisgICAgIGEgZGlmZmVyZW50IGtpbmQgb2YgY29tcHV0ZXIpLCB0eXBlIGBtYWtlIGRpc3RjbGVhbicuICBUaGVyZSBpcworICAgICBhbHNvIGEgYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgdGFyZ2V0LCBidXQgdGhhdCBpcyBpbnRlbmRlZCBtYWlubHkKKyAgICAgZm9yIHRoZSBwYWNrYWdlJ3MgZGV2ZWxvcGVycy4gIElmIHlvdSB1c2UgaXQsIHlvdSBtYXkgaGF2ZSB0byBnZXQKKyAgICAgYWxsIHNvcnRzIG9mIG90aGVyIHByb2dyYW1zIGluIG9yZGVyIHRvIHJlZ2VuZXJhdGUgZmlsZXMgdGhhdCBjYW1lCisgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworQ29tcGlsZXJzIGFuZCBPcHRpb25zCis9PT09PT09PT09PT09PT09PT09PT0KKworICAgU29tZSBzeXN0ZW1zIHJlcXVpcmUgdW51c3VhbCBvcHRpb25zIGZvciBjb21waWxhdGlvbiBvciBsaW5raW5nIHRoYXQKK3RoZSBgY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3Qga25vdyBhYm91dC4gIFlvdSBjYW4gZ2l2ZSBgY29uZmlndXJlJworaW5pdGlhbCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBieSBzZXR0aW5nIHRoZW0gaW4gdGhlIGVudmlyb25tZW50LiAgVXNpbmcKK2EgQm91cm5lLWNvbXBhdGlibGUgc2hlbGwsIHlvdSBjYW4gZG8gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIGxpa2UKK3RoaXM6CisgICAgIENDPWM4OSBDRkxBR1M9LU8yIExJQlM9LWxwb3NpeCAuL2NvbmZpZ3VyZQorCitPciBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGUgYGVudicgcHJvZ3JhbSwgeW91IGNhbiBkbyBpdCBsaWtlIHRoaXM6CisgICAgIGVudiBDUFBGTEFHUz0tSS91c3IvbG9jYWwvaW5jbHVkZSBMREZMQUdTPS1zIC4vY29uZmlndXJlCisKK0NvbXBpbGluZyBGb3IgTXVsdGlwbGUgQXJjaGl0ZWN0dXJlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFlvdSBjYW4gY29tcGlsZSB0aGUgcGFja2FnZSBmb3IgbW9yZSB0aGFuIG9uZSBraW5kIG9mIGNvbXB1dGVyIGF0IHRoZQorc2FtZSB0aW1lLCBieSBwbGFjaW5nIHRoZSBvYmplY3QgZmlsZXMgZm9yIGVhY2ggYXJjaGl0ZWN0dXJlIGluIHRoZWlyCitvd24gZGlyZWN0b3J5LiAgVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIGEgdmVyc2lvbiBvZiBgbWFrZScgdGhhdAorc3VwcG9ydHMgdGhlIGBWUEFUSCcgdmFyaWFibGUsIHN1Y2ggYXMgR05VIGBtYWtlJy4gIGBjZCcgdG8gdGhlCitkaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdGhlIG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMgdG8gZ28gYW5kIHJ1bgordGhlIGBjb25maWd1cmUnIHNjcmlwdC4gIGBjb25maWd1cmUnIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGZvciB0aGUKK3NvdXJjZSBjb2RlIGluIHRoZSBkaXJlY3RvcnkgdGhhdCBgY29uZmlndXJlJyBpcyBpbiBhbmQgaW4gYC4uJy4KKworICAgSWYgeW91IGhhdmUgdG8gdXNlIGEgYG1ha2UnIHRoYXQgZG9lcyBub3Qgc3VwcG9ydHMgdGhlIGBWUEFUSCcKK3ZhcmlhYmxlLCB5b3UgaGF2ZSB0byBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBvbmUgYXJjaGl0ZWN0dXJlIGF0IGEgdGltZQoraW4gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yeS4gIEFmdGVyIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUgcGFja2FnZSBmb3IKK29uZSBhcmNoaXRlY3R1cmUsIHVzZSBgbWFrZSBkaXN0Y2xlYW4nIGJlZm9yZSByZWNvbmZpZ3VyaW5nIGZvciBhbm90aGVyCithcmNoaXRlY3R1cmUuCisKK0luc3RhbGxhdGlvbiBOYW1lcworPT09PT09PT09PT09PT09PT09CisKKyAgIEJ5IGRlZmF1bHQsIGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCB0aGUgcGFja2FnZSdzIGZpbGVzIGluCitgL3Vzci9sb2NhbC9iaW4nLCBgL3Vzci9sb2NhbC9tYW4nLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4KK2luc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBgL3Vzci9sb2NhbCcgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQorb3B0aW9uIGAtLXByZWZpeD1QQVRIJy4KKworICAgWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKK2FyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYgeW91CitnaXZlIGBjb25maWd1cmUnIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UEFUSCcsIHRoZSBwYWNrYWdlIHdpbGwgdXNlCitQQVRIIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KK0RvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgd2lsbCBzdGlsbCB1c2UgdGhlIHJlZ3VsYXIgcHJlZml4LgorCisgICBJbiBhZGRpdGlvbiwgaWYgeW91IHVzZSBhbiB1bnVzdWFsIGRpcmVjdG9yeSBsYXlvdXQgeW91IGNhbiBnaXZlCitvcHRpb25zIGxpa2UgYC0tYmluZGlyPVBBVEgnIHRvIHNwZWNpZnkgZGlmZmVyZW50IHZhbHVlcyBmb3IgcGFydGljdWxhcgora2luZHMgb2YgZmlsZXMuICBSdW4gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBhIGxpc3Qgb2YgdGhlIGRpcmVjdG9yaWVzCit5b3UgY2FuIHNldCBhbmQgd2hhdCBraW5kcyBvZiBmaWxlcyBnbyBpbiB0aGVtLgorCisgICBJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKK3dpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCitvcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgorCitPcHRpb25hbCBGZWF0dXJlcworPT09PT09PT09PT09PT09PT0KKworICAgU29tZSBwYWNrYWdlcyBwYXkgYXR0ZW50aW9uIHRvIGAtLWVuYWJsZS1GRUFUVVJFJyBvcHRpb25zIHRvCitgY29uZmlndXJlJywgd2hlcmUgRkVBVFVSRSBpbmRpY2F0ZXMgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgcGFja2FnZS4KK1RoZXkgbWF5IGFsc28gcGF5IGF0dGVudGlvbiB0byBgLS13aXRoLVBBQ0tBR0UnIG9wdGlvbnMsIHdoZXJlIFBBQ0tBR0UKK2lzIHNvbWV0aGluZyBsaWtlIGBnbnUtYXMnIG9yIGB4JyAoZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0pLiAgVGhlCitgUkVBRE1FJyBzaG91bGQgbWVudGlvbiBhbnkgYC0tZW5hYmxlLScgYW5kIGAtLXdpdGgtJyBvcHRpb25zIHRoYXQgdGhlCitwYWNrYWdlIHJlY29nbml6ZXMuCisKKyAgIEZvciBwYWNrYWdlcyB0aGF0IHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtLCBgY29uZmlndXJlJyBjYW4gdXN1YWxseQorZmluZCB0aGUgWCBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGF1dG9tYXRpY2FsbHksIGJ1dCBpZiBpdCBkb2Vzbid0LAoreW91IGNhbiB1c2UgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYC0teC1pbmNsdWRlcz1ESVInIGFuZAorYC0teC1saWJyYXJpZXM9RElSJyB0byBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9ucy4KKworU3BlY2lmeWluZyB0aGUgU3lzdGVtIFR5cGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgIFRoZXJlIG1heSBiZSBzb21lIGZlYXR1cmVzIGBjb25maWd1cmUnIGNhbiBub3QgZmlndXJlIG91dAorYXV0b21hdGljYWxseSwgYnV0IG5lZWRzIHRvIGRldGVybWluZSBieSB0aGUgdHlwZSBvZiBob3N0IHRoZSBwYWNrYWdlCit3aWxsIHJ1biBvbi4gIFVzdWFsbHkgYGNvbmZpZ3VyZScgY2FuIGZpZ3VyZSB0aGF0IG91dCwgYnV0IGlmIGl0IHByaW50cworYSBtZXNzYWdlIHNheWluZyBpdCBjYW4gbm90IGd1ZXNzIHRoZSBob3N0IHR5cGUsIGdpdmUgaXQgdGhlCitgLS1ob3N0PVRZUEUnIG9wdGlvbi4gIFRZUEUgY2FuIGVpdGhlciBiZSBhIHNob3J0IG5hbWUgZm9yIHRoZSBzeXN0ZW0KK3R5cGUsIHN1Y2ggYXMgYHN1bjQnLCBvciBhIGNhbm9uaWNhbCBuYW1lIHdpdGggdGhyZWUgZmllbGRzOgorICAgICBDUFUtQ09NUEFOWS1TWVNURU0KKworU2VlIHRoZSBmaWxlIGBjb25maWcuc3ViJyBmb3IgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBlYWNoIGZpZWxkLiAgSWYKK2Bjb25maWcuc3ViJyBpc24ndCBpbmNsdWRlZCBpbiB0aGlzIHBhY2thZ2UsIHRoZW4gdGhpcyBwYWNrYWdlIGRvZXNuJ3QKK25lZWQgdG8ga25vdyB0aGUgaG9zdCB0eXBlLgorCisgICBJZiB5b3UgYXJlIGJ1aWxkaW5nIGNvbXBpbGVyIHRvb2xzIGZvciBjcm9zcy1jb21waWxpbmcsIHlvdSBjYW4gYWxzbwordXNlIHRoZSBgLS10YXJnZXQ9VFlQRScgb3B0aW9uIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBzeXN0ZW0gdGhleSB3aWxsCitwcm9kdWNlIGNvZGUgZm9yIGFuZCB0aGUgYC0tYnVpbGQ9VFlQRScgb3B0aW9uIHRvIHNlbGVjdCB0aGUgdHlwZSBvZgorc3lzdGVtIG9uIHdoaWNoIHlvdSBhcmUgY29tcGlsaW5nIHRoZSBwYWNrYWdlLgorCitTaGFyaW5nIERlZmF1bHRzCis9PT09PT09PT09PT09PT09CisKKyAgIElmIHlvdSB3YW50IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgYGNvbmZpZ3VyZScgc2NyaXB0cyB0byBzaGFyZSwKK3lvdSBjYW4gY3JlYXRlIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FsbGVkIGBjb25maWcuc2l0ZScgdGhhdCBnaXZlcworZGVmYXVsdCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBsaWtlIGBDQycsIGBjYWNoZV9maWxlJywgYW5kIGBwcmVmaXgnLgorYGNvbmZpZ3VyZScgbG9va3MgZm9yIGBQUkVGSVgvc2hhcmUvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cywgdGhlbgorYFBSRUZJWC9ldGMvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cy4gIE9yLCB5b3UgY2FuIHNldCB0aGUKK2BDT05GSUdfU0lURScgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaXRlIHNjcmlwdC4KK0Egd2FybmluZzogbm90IGFsbCBgY29uZmlndXJlJyBzY3JpcHRzIGxvb2sgZm9yIGEgc2l0ZSBzY3JpcHQuCisKK09wZXJhdGlvbiBDb250cm9scworPT09PT09PT09PT09PT09PT09CisKKyAgIGBjb25maWd1cmUnIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IGl0CitvcGVyYXRlcy4KKworYC0tY2FjaGUtZmlsZT1GSUxFJworICAgICBVc2UgYW5kIHNhdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGluIEZJTEUgaW5zdGVhZCBvZgorICAgICBgLi9jb25maWcuY2FjaGUnLiAgU2V0IEZJTEUgdG8gYC9kZXYvbnVsbCcgdG8gZGlzYWJsZSBjYWNoaW5nLCBmb3IKKyAgICAgZGVidWdnaW5nIGBjb25maWd1cmUnLgorCitgLS1oZWxwJworICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgorCitgLS1xdWlldCcKK2AtLXNpbGVudCcKK2AtcScKKyAgICAgRG8gbm90IHByaW50IG1lc3NhZ2VzIHNheWluZyB3aGljaCBjaGVja3MgYXJlIGJlaW5nIG1hZGUuICBUbworICAgICBzdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dCwgcmVkaXJlY3QgaXQgdG8gYC9kZXYvbnVsbCcgKGFueSBlcnJvcgorICAgICBtZXNzYWdlcyB3aWxsIHN0aWxsIGJlIHNob3duKS4KKworYC0tc3JjZGlyPURJUicKKyAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQorICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCisKK2AtLXZlcnNpb24nCisgICAgIFByaW50IHRoZSB2ZXJzaW9uIG9mIEF1dG9jb25mIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGBjb25maWd1cmUnCisgICAgIHNjcmlwdCwgYW5kIGV4aXQuCisKK2Bjb25maWd1cmUnIGFsc28gYWNjZXB0cyBzb21lIG90aGVyLCBub3Qgd2lkZWx5IHVzZWZ1bCwgb3B0aW9ucy4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTdjZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjYgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbgorCitTVUJESVJTID0gdG9vbHMgc3VwcG9ydCB1dGlscyBsaW51eC1uZnMgdGVzdHMKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCitFWFRSQV9ESVNUID0gXAorCWF1dG9nZW4uc2ggXAorCVwKKwlkZWJpYW4vY2hhbmdlbG9nIFwKKwlkZWJpYW4vY29udHJvbCBcCisJZGViaWFuL2NvcHlyaWdodCBcCisJZGViaWFuL2V0Yy5leHBvcnRzIFwKKwlkZWJpYW4vaWRtYXBkLmNvbmYgXAorCWRlYmlhbi9uZnMtY29tbW9uLmNvbmZmaWxlcyBcCisJZGViaWFuL25mcy1jb21tb24uZGVmYXVsdCBcCisJZGViaWFuL25mcy1jb21tb24uZGlycyBcCisJZGViaWFuL25mcy1jb21tb24uZmlsZXMgXAorCWRlYmlhbi9uZnMtY29tbW9uLmluaXQgXAorCWRlYmlhbi9uZnMtY29tbW9uLmluc3RhbGwgXAorCWRlYmlhbi9uZnMtY29tbW9uLnBvc3RpbnN0IFwKKwlkZWJpYW4vbmZzLWNvbW1vbi5wb3N0cm0gXAorCWRlYmlhbi9uZnMtY29tbW9uLnByZXJtIFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIuTkVXUyBcCisJZGViaWFuL25mcy1rZXJuZWwtc2VydmVyLmNvbmZmaWxlcyBcCisJZGViaWFuL25mcy1rZXJuZWwtc2VydmVyLmRlZmF1bHQgXAorCWRlYmlhbi9uZnMta2VybmVsLXNlcnZlci5kaXJzIFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIuaW5pdCBcCisJZGViaWFuL25mcy1rZXJuZWwtc2VydmVyLnBvc3RpbnN0IFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIucG9zdHJtIFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIucHJlcm0gXAorCWRlYmlhbi9uaGZzc3RvbmUuZGlycyBcCisJZGViaWFuL25oZnNzdG9uZS5maWxlcyBcCisJZGViaWFuL25oZnNzdG9uZS5wb3N0aW5zdCBcCisJZGViaWFuL25oZnNzdG9uZS5wcmVybSBcCisJZGViaWFuL3J1bGVzIFwKKwlcCisJYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwlhY2xvY2FsL25mcy11dGlscy5tNCBcCisJYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCWFjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwlhY2xvY2FsL2xpYnRpcnBjLm00IFwKKwlhY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwlhY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwlhY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwlhY2xvY2FsL2lwdjYubTQKKworQUNMT0NBTF9BTUZMQUdTID0gLUkgYWNsb2NhbAorCitpbnN0YWxsLWRhdGEtaG9vazoKKwlpZiBbICEgLWQgJChERVNURElSKSQoc3RhdGVkaXIpIF07IHRoZW4gbWtkaXIgLXAgJChERVNURElSKSQoc3RhdGVkaXIpOyBmaQorCXRvdWNoICQoREVTVERJUikkKHN0YXRlZGlyKS94dGFiOyBjaG1vZCA2NDQgJChERVNURElSKSQoc3RhdGVkaXIpL3h0YWIKKwl0b3VjaCAkKERFU1RESVIpJChzdGF0ZWRpcikvZXRhYjsgY2htb2QgNjQ0ICQoREVTVERJUikkKHN0YXRlZGlyKS9ldGFiCisJdG91Y2ggJChERVNURElSKSQoc3RhdGVkaXIpL3JtdGFiOyBjaG1vZCA2NDQgJChERVNURElSKSQoc3RhdGVkaXIpL3JtdGFiCisJbWtkaXIgLXAgJChERVNURElSKSQoc3RhdGVkaXIpL3NtICQoREVTVERJUikkKHN0YXRlZGlyKS9zbS5iYWsKKwl0b3VjaCAkKERFU1RESVIpJChzdGF0ZWRpcikvc3RhdGUKKwljaG1vZCBnby1yd3ggJChERVNURElSKSQoc3RhdGVkaXIpL3NtICQoREVTVERJUikkKHN0YXRlZGlyKS9zbS5iYWsgJChERVNURElSKSQoc3RhdGVkaXIpL3N0YXRlCisJLWNob3duICQoc3RhdGR1c2VyKSAkKERFU1RESVIpJChzdGF0ZWRpcikvc20gJChERVNURElSKSQoc3RhdGVkaXIpL3NtLmJhayAkKERFU1RESVIpJChzdGF0ZWRpcikvc3RhdGUKKwordW5pbnN0YWxsLWhvb2s6CisJcm0gJChERVNURElSKSQoc3RhdGVkaXIpL3h0YWIKKwlybSAkKERFU1RESVIpJChzdGF0ZWRpcikvZXRhYgorCXJtICQoREVTVERJUikkKHN0YXRlZGlyKS9ybXRhYgorCXJtICQoREVTVERJUikkKHN0YXRlZGlyKS9zdGF0ZQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMmY3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw4MjAgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSAuCitESVNUX0NPTU1PTiA9IFJFQURNRSAkKGFtX19jb25maWd1cmVfZGVwcykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgQ09QWUlORyBcCisJQ2hhbmdlTG9nIElOU1RBTEwgTkVXUyBjb21waWxlIGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGRlcGNvbXAgXAorCWluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcKK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCithbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUyA9IGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgXAorIGNvbmZpZ3VyZS5saW5lbm8gY29uZmlnLnN0YXR1cy5saW5lbm8KK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitSRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCisJcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKK1JFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTID0gbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZQlcCisgIGRpc3RjbGVhbi1yZWN1cnNpdmUgbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKK0FNX1JFQ1VSU0lWRV9UQVJHRVRTID0gJChSRUNVUlNJVkVfVEFSR0VUUzotcmVjdXJzaXZlPSkgXAorCSQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIHRhZ3MgVEFHUyBjdGFncyBDVEFHUyBcCisJZGlzdGRpciBkaXN0IGRpc3QtYWxsIGRpc3RjaGVjaworRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK2Rpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKK3RvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQorYW1fX3JlbW92ZV9kaXN0ZGlyID0gXAorICB7IHRlc3QgISAtZCAiJChkaXN0ZGlyKSIgXAorICAgIHx8IHsgZmluZCAiJChkaXN0ZGlyKSIgLXR5cGUgZCAhIC1wZXJtIC0yMDAgLWV4ZWMgY2htb2QgdSt3IHt9ICc7JyBcCisgICAgICAgICAmJiBybSAtZnIgIiQoZGlzdGRpcikiOyB9OyB9CithbV9fcmVsYXRpdml6ZSA9IFwKKyAgZGlyMD1gcHdkYDsgXAorICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKKyAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKKyAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKKyAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCisgIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKKyAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCisgICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAorICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKKyAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCisgICAgICBlbHNlIFwKKyAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCisgICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCisgICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKKyAgICAgICAgZmk7IFwKKyAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKKyAgICAgIGZpOyBcCisgICAgZmk7IFwKKyAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKKyAgZG9uZTsgXAorICByZWxkaXI9IiQkZGlyMiIKK0RJU1RfQVJDSElWRVMgPSAkKGRpc3RkaXIpLnRhci5negorR1pJUF9FTlYgPSAtLWJlc3QKK2Rpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMgPSBmaW5kIC4gLXR5cGUgZiAtcHJpbnQKK2Rpc3RjbGVhbmNoZWNrX2xpc3RmaWxlcyA9IGZpbmQgLiAtdHlwZSBmIC1wcmludAorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gLUkgYWNsb2NhbAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitBVVRPTUFLRV9PUFRJT05TID0gZm9yZWlnbgorU1VCRElSUyA9IHRvb2xzIHN1cHBvcnQgdXRpbHMgbGludXgtbmZzIHRlc3RzCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCitFWFRSQV9ESVNUID0gXAorCWF1dG9nZW4uc2ggXAorCVwKKwlkZWJpYW4vY2hhbmdlbG9nIFwKKwlkZWJpYW4vY29udHJvbCBcCisJZGViaWFuL2NvcHlyaWdodCBcCisJZGViaWFuL2V0Yy5leHBvcnRzIFwKKwlkZWJpYW4vaWRtYXBkLmNvbmYgXAorCWRlYmlhbi9uZnMtY29tbW9uLmNvbmZmaWxlcyBcCisJZGViaWFuL25mcy1jb21tb24uZGVmYXVsdCBcCisJZGViaWFuL25mcy1jb21tb24uZGlycyBcCisJZGViaWFuL25mcy1jb21tb24uZmlsZXMgXAorCWRlYmlhbi9uZnMtY29tbW9uLmluaXQgXAorCWRlYmlhbi9uZnMtY29tbW9uLmluc3RhbGwgXAorCWRlYmlhbi9uZnMtY29tbW9uLnBvc3RpbnN0IFwKKwlkZWJpYW4vbmZzLWNvbW1vbi5wb3N0cm0gXAorCWRlYmlhbi9uZnMtY29tbW9uLnByZXJtIFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIuTkVXUyBcCisJZGViaWFuL25mcy1rZXJuZWwtc2VydmVyLmNvbmZmaWxlcyBcCisJZGViaWFuL25mcy1rZXJuZWwtc2VydmVyLmRlZmF1bHQgXAorCWRlYmlhbi9uZnMta2VybmVsLXNlcnZlci5kaXJzIFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIuaW5pdCBcCisJZGViaWFuL25mcy1rZXJuZWwtc2VydmVyLnBvc3RpbnN0IFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIucG9zdHJtIFwKKwlkZWJpYW4vbmZzLWtlcm5lbC1zZXJ2ZXIucHJlcm0gXAorCWRlYmlhbi9uaGZzc3RvbmUuZGlycyBcCisJZGViaWFuL25oZnNzdG9uZS5maWxlcyBcCisJZGViaWFuL25oZnNzdG9uZS5wb3N0aW5zdCBcCisJZGViaWFuL25oZnNzdG9uZS5wcmVybSBcCisJZGViaWFuL3J1bGVzIFwKKwlcCisJYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwlhY2xvY2FsL25mcy11dGlscy5tNCBcCisJYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCWFjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwlhY2xvY2FsL2xpYnRpcnBjLm00IFwKKwlhY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwlhY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwlhY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwlhY2xvY2FsL2lwdjYubTQKKworYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKK2FtLS1yZWZyZXNoOgorCUA6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICBlY2hvICcgY2QgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbic7IFwKKwkgICAgICAkKGFtX19jZCkgJChzcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZm9yZWlnbiBcCisJCSYmIGV4aXQgMDsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1mb3JlaWduIE1ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZm9yZWlnbiBNYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGVjaG8gJyAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMnOyBcCisJICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1czs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCSQoYW1fX2NkKSAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKSAkKEFDTE9DQUxfQU1GTEFHUykKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbi1saWJ0b29sOgorCS1ybSAtZiBsaWJ0b29sIGNvbmZpZy5sdAorCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJdGVzdCAtZCAiJChkaXN0ZGlyKSIgfHwgbWtkaXIgIiQoZGlzdGRpcikiCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAorCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCisJICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAorCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAorCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCisJCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKKwkJYW1fX3NraXBfbW9kZV9maXg9OiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwktdGVzdCAtbiAiJChhbV9fc2tpcF9tb2RlX2ZpeCkiIFwKKwl8fCBmaW5kICIkKGRpc3RkaXIpIiAtdHlwZSBkICEgLXBlcm0gLTc1NSBcCisJCS1leGVjIGNobW9kIHUrcnd4LGdvK3J4IHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWxpbmtzIDEgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00MDAgLWV4ZWMgY2htb2QgYStyIHt9IFw7IC1vIFwKKwkgICEgLXR5cGUgZCAhIC1wZXJtIC00NDQgLWV4ZWMgJChpbnN0YWxsX3NoKSAtYyAtbSBhK3Ige30ge30gXDsgXAorCXx8IGNobW9kIC1SIGErciAiJChkaXN0ZGlyKSIKK2Rpc3QtZ3ppcDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKK2Rpc3QtYnppcDI6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgYnppcDIgLTkgLWMgPiQoZGlzdGRpcikudGFyLmJ6MgorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LWx6bWE6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgbHptYSAtOSAtYyA+JChkaXN0ZGlyKS50YXIubHptYQorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXh6OiBkaXN0ZGlyCisJdGFyZGlyPSQoZGlzdGRpcikgJiYgJChhbV9fdGFyKSB8IHh6IC1jID4kKGRpc3RkaXIpLnRhci54egorCSQoYW1fX3JlbW92ZV9kaXN0ZGlyKQorCitkaXN0LXRhclo6IGRpc3RkaXIKKwl0YXJkaXI9JChkaXN0ZGlyKSAmJiAkKGFtX190YXIpIHwgY29tcHJlc3MgLWMgPiQoZGlzdGRpcikudGFyLloKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC1zaGFyOiBkaXN0ZGlyCisJc2hhciAkKGRpc3RkaXIpIHwgR1pJUD0kKEdaSVBfRU5WKSBnemlwIC1jID4kKGRpc3RkaXIpLnNoYXIuZ3oKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdC16aXA6IGRpc3RkaXIKKwktcm0gLWYgJChkaXN0ZGlyKS56aXAKKwl6aXAgLXJxICQoZGlzdGRpcikuemlwICQoZGlzdGRpcikKKwkkKGFtX19yZW1vdmVfZGlzdGRpcikKKworZGlzdCBkaXN0LWFsbDogZGlzdGRpcgorCXRhcmRpcj0kKGRpc3RkaXIpICYmICQoYW1fX3RhcikgfCBHWklQPSQoR1pJUF9FTlYpIGd6aXAgLWMgPiQoZGlzdGRpcikudGFyLmd6CisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisKKyMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KKyMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKKyMgdGFyZmlsZS4KK2Rpc3RjaGVjazogZGlzdAorCWNhc2UgJyQoRElTVF9BUkNISVZFUyknIGluIFwKKwkqLnRhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS50YXIuZ3ogfCAkKGFtX191bnRhcikgOztcCisJKi50YXIuYnoyKikgXAorCSAgYnppcDIgLWRjICQoZGlzdGRpcikudGFyLmJ6MiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5sem1hKikgXAorCSAgbHptYSAtZGMgJChkaXN0ZGlyKS50YXIubHptYSB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci54eiopIFwKKwkgIHh6IC1kYyAkKGRpc3RkaXIpLnRhci54eiB8ICQoYW1fX3VudGFyKSA7O1wKKwkqLnRhci5aKikgXAorCSAgdW5jb21wcmVzcyAtYyAkKGRpc3RkaXIpLnRhci5aIHwgJChhbV9fdW50YXIpIDs7XAorCSouc2hhci5neiopIFwKKwkgIEdaSVA9JChHWklQX0VOVikgZ3ppcCAtZGMgJChkaXN0ZGlyKS5zaGFyLmd6IHwgdW5zaGFyIDs7XAorCSouemlwKikgXAorCSAgdW56aXAgJChkaXN0ZGlyKS56aXAgOztcCisJZXNhYworCWNobW9kIC1SIGEtdyAkKGRpc3RkaXIpOyBjaG1vZCBhK3cgJChkaXN0ZGlyKQorCW1rZGlyICQoZGlzdGRpcikvX2J1aWxkCisJbWtkaXIgJChkaXN0ZGlyKS9faW5zdAorCWNobW9kIGEtdyAkKGRpc3RkaXIpCisJdGVzdCAtZCAkKGRpc3RkaXIpL19idWlsZCB8fCBleGl0IDA7IFwKKwlkY19pbnN0YWxsX2Jhc2U9YCQoYW1fX2NkKSAkKGRpc3RkaXIpL19pbnN0ICYmIHB3ZCB8IHNlZCAtZSAncyxeW146XFwvXTpbXFwvXSwvLCdgIFwKKwkgICYmIGRjX2Rlc3RkaXI9IiQke1RNUERJUi0vdG1wfS9hbS1kYy0kJCQkLyIgXAorCSAgJiYgYW1fX2N3ZD1gcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJChkaXN0ZGlyKS9fYnVpbGQgXAorCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSIkJGRjX2luc3RhbGxfYmFzZSIgXAorCSAgICAkKERJU1RDSEVDS19DT05GSUdVUkVfRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCisJICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdHVuaW5zdGFsbGNoZWNrX2Rpcj0iJCRkY19pbnN0YWxsX2Jhc2UiIFwKKwkgICAgICAgIGRpc3R1bmluc3RhbGxjaGVjayBcCisJICAmJiBjaG1vZCAtUiBhLXcgIiQkZGNfaW5zdGFsbF9iYXNlIiBcCisJICAmJiAoeyBcCisJICAgICAgIChjZCAuLi8uLiAmJiB1bWFzayAwNzcgJiYgbWtkaXIgIiQkZGNfZGVzdGRpciIpIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiBpbnN0YWxsIFwKKwkgICAgICAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgREVTVERJUj0iJCRkY19kZXN0ZGlyIiB1bmluc3RhbGwgXAorCSAgICAgICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBERVNURElSPSIkJGRjX2Rlc3RkaXIiIFwKKwkgICAgICAgICAgICBkaXN0dW5pbnN0YWxsY2hlY2tfZGlyPSIkJGRjX2Rlc3RkaXIiIGRpc3R1bmluc3RhbGxjaGVjazsgXAorCSAgICAgIH0gfHwgeyBybSAtcmYgIiQkZGNfZGVzdGRpciI7IGV4aXQgMTsgfSkgXAorCSAgJiYgcm0gLXJmICIkJGRjX2Rlc3RkaXIiIFwKKwkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGRpc3QgXAorCSAgJiYgcm0gLXJmICQoRElTVF9BUkNISVZFUykgXAorCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdGNsZWFuY2hlY2sgXAorCSAgJiYgY2QgIiQkYW1fX2N3ZCIgXAorCSAgfHwgZXhpdCAxCisJJChhbV9fcmVtb3ZlX2Rpc3RkaXIpCisJQChlY2hvICIkKGRpc3RkaXIpIGFyY2hpdmVzIHJlYWR5IGZvciBkaXN0cmlidXRpb246ICI7IFwKKwkgIGxpc3Q9JyQoRElTVF9BUkNISVZFUyknOyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lKSB8IFwKKwkgIHNlZCAtZSAxaCAtZSAxcy8uLz0vZyAtZSAxcCAtZSAxeCAtZSAnJCRwJyAtZSAnJCR4JworZGlzdHVuaW5zdGFsbGNoZWNrOgorCUAkKGFtX19jZCkgJyQoZGlzdHVuaW5zdGFsbGNoZWNrX2RpciknIFwKKwkmJiB0ZXN0IGAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIHwgd2MgLWxgIC1sZSAxIFwKKwkgICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGFmdGVyIHVuaW5zdGFsbDoiIDsgXAorCSAgICAgICAgaWYgdGVzdCAtbiAiJChERVNURElSKSI7IHRoZW4gXAorCSAgICAgICAgICBlY2hvICIgIChjaGVjayBERVNURElSIHN1cHBvcnQpIjsgXAorCSAgICAgICAgZmkgOyBcCisJICAgICAgICAkKGRpc3R1bmluc3RhbGxjaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICAgZXhpdCAxOyB9ID4mMgorZGlzdGNsZWFuY2hlY2s6IGRpc3RjbGVhbgorCUBpZiB0ZXN0ICckKHNyY2RpciknID0gLiA7IHRoZW4gXAorCSAgZWNobyAiRVJST1I6IGRpc3RjbGVhbmNoZWNrIGNhbiBvbmx5IHJ1biBmcm9tIGEgVlBBVEggYnVpbGQiIDsgXAorCSAgZXhpdCAxIDsgXAorCWZpCisJQHRlc3QgYCQoZGlzdGNsZWFuY2hlY2tfbGlzdGZpbGVzKSB8IHdjIC1sYCAtZXEgMCBcCisJICB8fCB7IGVjaG8gIkVSUk9SOiBmaWxlcyBsZWZ0IGluIGJ1aWxkIGRpcmVjdG9yeSBhZnRlciBkaXN0Y2xlYW46IiA7IFwKKwkgICAgICAgJChkaXN0Y2xlYW5jaGVja19saXN0ZmlsZXMpIDsgXAorCSAgICAgICBleGl0IDE7IH0gPiYyCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mICQoYW1fX0NPTkZJR19ESVNUQ0xFQU5fRklMRVMpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1kYXRhLWhvb2sKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgJChhbV9fQ09ORklHX0RJU1RDTEVBTl9GSUxFUykKKwktcm0gLXJmICQodG9wX3NyY2RpcikvYXV0b200dGUuY2FjaGUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtaG9vaworLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGN0YWdzLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsLWFtCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gYW0tLXJlZnJlc2ggY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdCBkaXN0LWFsbCBkaXN0LWJ6aXAyIFwKKwlkaXN0LWd6aXAgZGlzdC1sem1hIGRpc3Qtc2hhciBkaXN0LXRhclogZGlzdC14eiBkaXN0LXppcCBcCisJZGlzdGNoZWNrIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuY2hlY2sgZGlzdGRpciBkaXN0dW5pbnN0YWxsY2hlY2sgZHZpIFwKKwlkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gXAorCWluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhLWhvb2sgaW5zdGFsbC1kdmkgXAorCWluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIFwKKwlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCWluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBcCisJcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIFwKKwl1bmluc3RhbGwtaG9vaworCisKK2luc3RhbGwtZGF0YS1ob29rOgorCWlmIFsgISAtZCAkKERFU1RESVIpJChzdGF0ZWRpcikgXTsgdGhlbiBta2RpciAtcCAkKERFU1RESVIpJChzdGF0ZWRpcik7IGZpCisJdG91Y2ggJChERVNURElSKSQoc3RhdGVkaXIpL3h0YWI7IGNobW9kIDY0NCAkKERFU1RESVIpJChzdGF0ZWRpcikveHRhYgorCXRvdWNoICQoREVTVERJUikkKHN0YXRlZGlyKS9ldGFiOyBjaG1vZCA2NDQgJChERVNURElSKSQoc3RhdGVkaXIpL2V0YWIKKwl0b3VjaCAkKERFU1RESVIpJChzdGF0ZWRpcikvcm10YWI7IGNobW9kIDY0NCAkKERFU1RESVIpJChzdGF0ZWRpcikvcm10YWIKKwlta2RpciAtcCAkKERFU1RESVIpJChzdGF0ZWRpcikvc20gJChERVNURElSKSQoc3RhdGVkaXIpL3NtLmJhaworCXRvdWNoICQoREVTVERJUikkKHN0YXRlZGlyKS9zdGF0ZQorCWNobW9kIGdvLXJ3eCAkKERFU1RESVIpJChzdGF0ZWRpcikvc20gJChERVNURElSKSQoc3RhdGVkaXIpL3NtLmJhayAkKERFU1RESVIpJChzdGF0ZWRpcikvc3RhdGUKKwktY2hvd24gJChzdGF0ZHVzZXIpICQoREVTVERJUikkKHN0YXRlZGlyKS9zbSAkKERFU1RESVIpJChzdGF0ZWRpcikvc20uYmFrICQoREVTVERJUikkKHN0YXRlZGlyKS9zdGF0ZQorCit1bmluc3RhbGwtaG9vazoKKwlybSAkKERFU1RESVIpJChzdGF0ZWRpcikveHRhYgorCXJtICQoREVTVERJUikkKHN0YXRlZGlyKS9ldGFiCisJcm0gJChERVNURElSKSQoc3RhdGVkaXIpL3JtdGFiCisJcm0gJChERVNURElSKSQoc3RhdGVkaXIpL3N0YXRlCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9ORVdTIGIvbmZzLXV0aWxzLTEuMi4yL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwYWU4YQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9ORVdTCkBAIC0wLDAgKzEsNjMgQEAKK1NpZ25pZmljYW50IGNoYW5nZXMgZm9yIG5mcy11dGlscyAxLjEuMCAtIE1hcmNoL0FwcmlsIDIwMDcKKworIC0gcnBjLmxvY2tkIGlzIGdvbmUuICBPbmUgMyBvbGQga2VybmVsIHJlbGVhc2VzIG5lZWQgaXQuCisgLSBycGMucnF1b3RhZCBpcyBnb25lLiAgVXNlIHRoZSBvbmUgZnJvbSB0aGUgJ3F1b3RhJyBwYWNrYWdlLgorICAgRXZlcm9uZSBlbHNlIGRvZXMuCisgLSAvc2Jpbi97dSx9bW91bnQubmZzeyw0fSBhcmUgbm93IGluc3RhbGxlZCBzbyAnbW91bnQnIHdpbGwKKyAgIHVzZSB0aGVzZSB0byBtb3VudCBuZnMgZmlsZXN5c3RlbXMgaW5zdGVhZCBvZiBpbnRlcm5hbCBjb2RlLgorICArIG1vdW50Lm5mcyB3aWxsIGNoZWNrIGZvciAnc3RhdGQnIHRvIGJlIHJ1bm5pbmcgd2hlbiBtb3VudGluZworICAgIGEgZmlsZXN5c3RlbSB3aGljaCByZXF1aXJlcyBpdC4gIElmIGl0IGlzIG5vdCBydW5uaW5nIGl0IHdpbGwKKyAgICBydW4gIi91c3Ivc2Jpbi9zdGFydC1zdGF0ZCIgdG8gdHJ5IHRvIHN0YXJ0IGl0LgorICAgIElmIHN0YXRkIGlzIG5vdCBydW5uaW5nIGFuZCBjYW5ub3QgYmUgc3RhcnRlZCwgbW91bnQubmZzIHdpbGwKKyAgICByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0gYW5kIHdpbGwgc3VnZ2VzdCB0aGUgJ25vbG9jaycKKyAgICBvcHRpb24uCisgLSBTdWJzdGFudGlhbCBjaGFuZ2VzIHRvIHN0YXRkCisgICsgVGhlICdub3RpZnknIHByb2Nlc3MgdGhhdCBtdXN0IGhhcHBlbiBhdCBib290IGhhcyBiZWVuIHNwbGl0CisgICAgaW50byBhIHNlcGFyYXRlIHByb2dyYW0gInNtLW5vdGlmeSIuICBJdCBlbnN1cmVzIHRoYXQgaXQKKyAgICBvbmx5IHJ1bnMgb25jZSBldmVuIGlmIHlvdSByZXN0YXJ0IHN0YXRkLiAgVGhpcyBpcyBjb3JyZWN0CisgICAgYmVoYXZpb3VyLgorICArIHN0YXRkIHN0b3JlcyBzdGF0ZSBpbiB0aGUgZmlsZXMgaW4gL3Zhci9saWIvbmZzL3NtLyBzbyB0aGF0CisgICAgaWYgeW91IGtpbGwgYW5kIHJlc3RhcnQgaXQsIGl0IHdpbGwgcmVzdG9yZSB0aGF0IHN0YXRlIGFuZAorICAgIGNvbnRpbnVlIHdvcmtpbmcgY29ycmVjdGx5LgorICArIHN0YXRkIG1ha2VzIG1vcmUgdXNlIG9mIEROUyBsb29rdXAgYW5kIHNob3VsZCBoYW5kbGUKKyAgICBtdWx0aS1ob21lZCBwZWVycyBiZXR0ZXIuICBJbiBwYXJ0aWN1bGFyLCBmaWxlcyBpbgorICAgIC92YXIvbGliL25mcy9zbS8gYXJlIG5hbWVkIHdpdGggdGhlIEZ1bGwgUXVhbGlmaWVkIERvbWFpbiBOYW1lCisgICAgaWYgYXZhaWxhYmxlLgorIC0gSWYgeW91IGV4cG9ydCBhIGRpcmVjdG9yeSBhcyAnY3Jvc3NtbnQnLCBhbGwgZmlsZXN5c3RlbXMKKyAgIG1vdW50ZWQgYmVuZWF0aCBhcmUgYXV0b21hdGljYWxseSBleHBvcnRlZCB3aXRoIHRoZSBzYW1lCisgICBvcHRpb25zICh1bmxlc3MgZXhwbGljaXRseSBleHBvcnRlZCB3aXRoIGRpZmZlcmVudCBvcHRpb25zKS4KKyAtIHN1YnRyZWVfY2hlY2sgaXMgbm8tbG9uZ2VyIHRoZSBkZWZhdWx0LiAgVGhlIGRlZmF1bHQgaXMgbm93CisgICBub19zdWJ0cmVlX2NoZWNrLgorIC0gQnkgZGVmYXVsdCB0aGUgc3lzdGVtICdycGNnZW4nIGlzIHVzZWQgd2hpbGUgYnVpbGRpbmcKKyAgIG5mcy11dGlscyByYXRoZXIgdGhhbiB0aGUgaW50ZXJuYWwgb25lLgorIC0gRXhwb3J0ZnMgd2lsbCB3YXJuIGlmIHlvdSB0cnkgdG8gZXhwb3J0IGEgZmlsZXN5c3RlbSB0aGF0IGRvZXMKKyAgIG5vdCBzdXBwb3J0IE5GUyBleHBvcnQuCisgLSBDb21wcmVoZW5zaXZlIG5vdGVzIG9uIHN0YXJ0dXAgZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBhZGRlZAorICAgdG8gdGhlIFJFQURNRSBmaWxlLgorIC0gTW91bnQgYW5kIHN0YXRkIG5vdyBsaXN0ZW4gb24gYSBub24tcHJpdmlsZWdlZCBwb3J0IGJ5IGRlZmF1bHQuCisgICBGb3IgbWF4aW11bSBzYWZldHkgYW4gdXBncmFkZSB0byBwb3J0bWFwLTYuMCBpcyByZWNvbW1lbmRlZC4KKyAgICAgICAgaHR0cDovL25laWwuYnJvd24ubmFtZS9wb3J0bWFwLworICAgICAgICBnaXQ6Ly9uZWlsLmJyb3duLm5hbWUvcG9ydG1hcAorCisgLSBUaGlzIHJlbGVhc2Ugc2hvdWxkIHdvcmsgd2l0aCBNSVQgS2VyYmVyb3MgYW5kIEhlaW1kYWwgMC44LjEgYW5kIGxhdGVyLgorCisgLSBBIG5ldyBvcHRpb24sIC1uLCB3YXMgYWRkZWQgdG8gcnBjLmdzc2Qgd2hpY2ggc3BlY2lmaWVzIHRoYXQKKyAgIGFjY2Vzc2VzIGJ5IHJvb3Qgc2hvdWxkIG5vdCB1c2UgJ21hY2hpbmUgY3JlZGVudGlhbHMnIHdoZW4KKyAgIGFjY2Vzc2luZyBORlMgZmlsZSBzeXN0ZW1zIG1vdW50ZWQgd2l0aCBLZXJiZXJvcy4gIFVzaW5nIHRoaXMKKyAgIG9wdGlvbiBhbGxvd3MgdGhlIHJvb3QgdXNlciB0byBhY2Nlc3MgdGhlIE5GUyBzcGFjZSB1c2luZyBhbnkKKyAgIEtlcmJlcm9zIHByaW5jaXBhbCwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIHRoZSBtYWNoaW5lCisgICBjcmVkZW50aWFscy4gIEhvd2V2ZXIsIGl0cyB1c2UgYWxzbyByZXF1aXJlcyB0aGF0IHJvb3QgbWFudWFsbHkKKyAgIGF1dGhlbnRpY2F0ZSBiZWZvcmUgYXR0ZW1wdGluZyBhIG1vdW50IHdpdGggS2VyYmVyb3MuCisKKyAgIFdoZW4gcnBjLmdzc2QgdXNlcyBtYWNoaW5lIGNyZWRlbnRpYWxzLCB0aGUgc2VsZWN0aW9uIGFsZ29yaXRobSBoYXMKKyAgIGJlZW4gY2hhbmdlZC4gIEluc3RlYWQgb2Ygc2ltcGx5IHVzaW5nIHRoZSBmaXJzdCAibmZzLyoiIGtleSBpbiB0aGUKKyAgIGtleXRhYiwgdGhlIGtleXRhYiBpcyBub3cgc2VhcmNoZWQgZm9yIGtleXMgaW4gdGhlIGZvbGxvd2luZworICAgZGVmaW5lZCBvcmRlcjoKKworICAgICByb290LzxmcWRuPkBSRUFMTQorICAgICBuZnMvPGZxZG4+QFJFQUxNCisgICAgIGhvc3QvPGZxZG4+QFJFQUxNCisgICAgIHJvb3QvPGFueS1uYW1lPkBSRUFMTQorICAgICBuZnMvPGFueS1uYW1lPkBSRUFMTQorICAgICBob3N0LzxhbnktbmFtZT5AUkVBTE0KKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL1JFQURNRSBiL25mcy11dGlscy0xLjIuMi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ODhjZgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9SRUFETUUKQEAgLTAsMCArMSwxNjUgQEAKK1RoaXMgaXMgdmVyc2lvbiAxLjEuMCBvZiBuZnMtdXRpbHMsIHRoZSBMaW51eCBORlMgdXRpbGl0eSBwYWNrYWdlLgorCisKKzAuIFBST0pFQ1QgUkVTT1VSQ0VTCisKK0hvbWUgcGFnZTogIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvbmZzLworCitUbyB1c2UgdGhlICdnc3MnIHN1cHBvcnQgeW91IG11c3QgaGF2ZSBrZXJiZXJvcy01IGRldmVsb3BtZW50IAorbGlicmFyaWVzIGluc3RhbGxlZC4KK090aGVyd2lzZSB1c2UgICItLWRpc2FibGUtZ3NzIgorCitUbyB1c2UgbmZzdjQgc3VwcG9ydCB5b3UgbmVlZCBsaWJldmVudCBhbmQgbGlibmZzaWRtYXAgZGV2ZWxvcG1lbnQKK2xpYnJhcmllcy4gIFRoZXkgYXJlIGF2YWlsYWJsZSBmcm9tIAorICAgaHR0cDovL3d3dy5tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQvCisgICBodHRwOi8vd3d3LmNpdGkudW1pY2guZWR1L3Byb2plY3RzL25mc3Y0L2xpbnV4L2xpYm5mc2lkbWFwLworT3RoZXJ3aXNlIHVzZSAtLWRpc2FibGUtbmZzdjQKKworCisxLiBDT01QSUxJTkcKKworVW5wYWNrIHRoZSBzb3VyY2VzIGFuZCBydW4gdGhlc2UgY29tbWFuZHM6CisKKyAgICAjIC4vY29uZmlndXJlCisgICAgIyBtYWtlCisKK1RvIGluc3RhbGwgYmluYXJpZXMgYW5kIGRvY3VtZW5hdGlvbiwgcnVuIHRoaXMgY29tbWFuZDoKKworICAgICMgbWFrZSBpbnN0YWxsCisKKworMi4gQ09NUElMSU5HIEZST00gR0lUCisKK0dldHRpbmcgbmZzLXV0aWxzIGZvciB0aGUgZmlyc3QgdGltZToKKworCWdpdCBjbG9uZSBnaXQ6Ly9saW51eC1uZnMub3JnL25mcy11dGlscworCitVcGRhdGluZyB0byB0aGUgbGF0ZXN0IGhlYWQgYWZ0ZXIgeW91J3ZlIGFscmVhZHkgZ290IGl0LgorCisJZ2l0IHB1bGwKKworQnVpbGRpbmcgcmVxdWlyZXMgdGhhdCBhdXRvdG9vbHMgYmUgaW5zdGFsbGVkLiAgVG8gaW52b2tlIHRoZW0KK3NpbXBseQorCisJc2ggYXV0b2dlbi5zaAorCitGaW5hbGx5LCBidWlsZCBhcyB1c3VhbCBhcyBhYm92ZS4KKworMy4gREFFTU9OIFNUQVJUVVAgT1JERVIKKworVGhpcyBuZnMtdXRpbHMgcGFja2FnZXMgZG9lcyBub3QgcHJvdmlkZSBhbnkgc2NyaXB0cyBmb3Igc3RhcnRpbmcKK3ZhcmlvdXMgZGFlbW9ucyBhcyBtb3N0IGRpc3RyaWJ1dGlvbnMgcmVwbGFjZSB0aGVtIHdpdGggdGhlaXIgb3duLCBzbworYW55IHNjcmlwdHMgd2UgcGFja2FnZSB3b3VsZCBub3QgZ2V0IG11Y2ggdGVzdGluZy4KK0luc3RlYWQsIHdlIGV4cGxhaW4gdGhlIGRlcGVuZGVuY2llcyBpbnZvbHZlZCBpbiBzdGFydHVwIHNvIHRoYXQKK3NjcmlwdHMgY2FuIGJlIHdyaXR0ZW4gdG8gd29yayBjb3JyZWN0bHkuCisKKzMuMCAgIFBSRVJFUVVJU0lURVMgCisKKyAgIE5hbWUgc2VydmljZSAoaG9zdCBuYW1lIGxvb2t1cCkgc2hvdWxkIGJlIHdvcmtpbmcgYmVmb3JlIGFueQorICAgTkZTIHNlcnZpY2VzIGFyZSBzdGFydGVkLgorCisgICAicG9ydG1hcCIgbXVzdCBiZSBydW5uaW5nIGJlZm9yZSBhbnkgTkZTIHNlcnZpY2VzIChzZXJ2ZXIgb3IKKyAgIGNsaWVudCkgYXJlIHN0YXJ0ZWQuCisgICAKKyAgIE5vcm1hbGx5IG5ldHdvcmsgaW50ZXJmYWNlcyBzaG91bGQgYmUgY29uZmlndXJlZCBmaXJzdCBhcyB3ZWxsLAorICAgdGhvdWdoIHRoaXMgaXNuJ3QgY3JpdGljYWwgZm9yIHRoZSBORlMgc2VydmVyIChwcm92aWRpbmcgbmFtZQorICAgc2VydmljZSBpcyBoYW5kbGVkIGxvY2FsbHkpLgorICAgCiszLjEuICBTRVJWRVIgU1RBUlRVUAorCisKKyAgIEEvICBtb3VudCAtdCBuZnNkIC9wcm9jL2ZzL25mc2QKKyAgICAgIFRoaXMgZmlsZXN5c3RlbSBuZWVkcyB0byBiZSBtb3VudCBiZWZvcmUgbW9zdCBkYWVtb25zLAorICAgICAgcGFydGljdWxhcmx5IGV4cG9ydGZzLCBtb3VudGQsIHN2Y2dzc2QsIGlkbWFwZC4KKyAgICAgIEl0IGNvdWxkIGJlIG1vdW50ZWQgb25jZSwgb3IgdGhlIHNjcmlwdCB0aGF0IHN0YXJ0cyBlYWNoIGRhZW1vbgorICAgICAgY291bGQgdGVzdCBpZiBpdCBpcyBtb3VudGVkIGFuZCBtb3VudCBpdCBpZiBub3QuCisKKyAgIEIvIHN2Y2dzc2QgOyBpZG1hcGQKKyAgICAgICBUaGVzZSBzdXBwbHkgc2VydmljZXMgdG8gbmZzZCBhbmQgc28gc2hvdWxkIGJlIHN0YXJ0ZWQgYmVmb3JlCisgICAgICAgcnBjLm5mc2QuICBXaGVyZSB0aGV5IGNvbWUgYmV0d2VlbiBtb3VudGluZyB0aGUgbmZzZCBmaWxlc3lzdGVtCisgICAgICAgYW5kIHN0YXJ0aW5nIHRoZSBuZnNkIHNlcnZlciBpcyBub3QgaW1wb3J0YW50LgorICAgICAgIGlkbWFwZCBpcyBvbmx5IG5lZWRlZCBmb3IgTkZTdjQgc3VwcG9ydC4KKyAgICAgICBzdmNnc3NkIGlzIG9ubHkgbmVlZGVkIGlmIGV4cG9ydGZzIE5GUyBmaWxlc3lzdGVtIHdpdGggY3J5cHRvLQorICAgICAgIHNlY3VyaXR5IChLZXJiZXJvcyBvciBTUEtNMykuCisKKyAgIEMvIGV4cG9ydGZzIC1hdiA7IHJwYy5tb3VudGQKKyAgICAgICBJdCBpcyBpbXBvcnRhbnQgdGhhdCBleHBvcnRmcyBiZSBydW4gYmVmb3JlIG1vdW50ZCBzbyB0aGF0CisgICAgICAgbW91bnRkIGlzIHdvcmtpbmcgZnJvbSBjdXJyZW50IGluZm9ybWF0aW9uIChpbgorICAgICAgIC92YXIvbGliL25mcy9ldGFiKS4KKyAgICAgICBJdCBpcyBhbHNvIGltcG9ydGFudCB0aGF0IGJvdGggb2YgdGhlc2UgYXJlIHJ1biBiZWZvcmUKKyAgICAgICBycGMubmZzZC4KKyAgICAgICBJZiBub3QsIGFueSBORlMgcmVxdWVzdHMgdGhhdCBhcnJpdmUgYmVmb3JlIG1vdW50ZCBpcyBzdGFydGVkCisgICAgICAgd2lsbCBnZXQgcmVwbGllZCB0byB3aXRoIGEgJ1N0YWxlIE5GUyBGaWxlIGhhbmRsZScgZXJyb3IuCisKKyAgIEQvIHJwYy5zdGF0ZCAtLW5vLW5vdGlmeQorICAgICAgIEl0IGlzIGJlc3QgaWYgc3RhdGQgaXMgc3RhcnRlZCBiZWZvcmUgbmZzZCB0aG91Z2ggdGhpcyBpc24ndAorICAgICAgIGNyaXRpY2FsLiAgQ2VydGFpbmx5IGl0IHNob3VsZCBiZSBhdCBtb3N0IGEgZmV3IHNlY29uZHMgYWZ0ZXIKKyAgICAgICBuZnNkLgorICAgICAgIFdoZW4gbmZzZCBzdGFydHMgaXQgd2lsbCBzdGFydCBsb2NrZC4gSWYgbG9ja2QgdGhlbiByZWNlaXZlcyBhCisgICAgICAgbG9jayByZXF1ZXN0IGl0IHdpbGwgY29tbXVuaWNhdGUgd2l0aCBzdGF0ZC4gIElmIHN0YXRkIGlzIG5vdAorICAgICAgIHJ1bm5pbmcgbG9ja2Qgd2lsbCByZXRyeSwgYnV0IGl0IHdvbid0IHdhaXQgZm9yZXZlciBmb3IgYQorICAgICAgIHJlcGx5LgorICAgICAgIE5vdGUgdGhhdCBpZiBzdGF0ZCBpcyBzdGFydGVkIGJlZm9yZSBuZnNkLCB0aGUgLS1uby1ub3RpZnkKKyAgICAgICBvcHRpb24gbXVzdCBiZSB1c2VkLiAgSWYgbm90aWZ5IHJlcXVlc3RzIGFyZSBzZW50IG91dCBiZWZvcmUKKyAgICAgICBuZnNkIHN0YXJ0LCBjbGllbnRzIG1heSB0cnkgdG8gcmVjbGFpbSBsb2NrcyBhbmQsIG9uIGZpbmRpbmcKKyAgICAgICB0aGF0IGxvY2tkIGlzbid0IHJ1bm5pbmcsIHRoZXkgd2lsbCBnaXZlIHVwIGFuZCBuZXZlciByZWNsYWltCisgICAgICAgdGhlIGxvY2suCisgICAgICAgcnBjLnN0YXRkIGlzIG9ubHkgbmVlZGVkIGZvciBORlN2MiBhbmQgTkZTdjMgc3VwcG9ydC4KKworICAgRS8gcnBjLm5mc2QKKyAgICAgICBTdGFydGluZyBuZnNkIHdpbGwgYXV0b21hdGljYWxseSBzdGFydCBsb2NrZC4gIFRoZSBuZnMgc2VydmVyCisgICAgICAgd2lsbCBub3cgYmUgZnVsbHkgYWN0aXZlIGFuZCByZXNwb25kIHRvIGFueSByZXF1ZXN0cyBmcm9tCisgICAgICAgY2xpZW50cy4KKyAgICAgICAKKyAgIEYvIHNtLW5vdGlmeQorICAgICAgIFRoaXMgd2lsbCBub3RpZnkgYW55IGNsaWVudCB3aGljaCBtaWdodCBoYXZlIGxvY2tzIGZyb20gYmVmb3JlCisgICAgICAgYSByZWJvb3QgdG8gdHJ5IHRvIHJlY2xhaW0gdGhlaXIgbG9ja3MuICBUaGlzIHNob3VsZCBzdGFydAorICAgICAgIGltbWVkaWF0ZWx5IGFmdGVyIHJwYy5uZnNkIGlzIHN0YXJ0ZWQgc28gdGhhdCBjbGllbnRzIGhhdmUgYQorICAgICAgIGNoYW5jZSB0byByZWNsYWltIGxvY2tzIHdpdGhpbiB0aGUgOTAgc2Vjb25kIGdyYWNlIHBlcmlvZC4KKyAgICAgICBzbS1ub3RpZnkgaXMgb25seSBuZWVkZWQgZm9yIE5GU3YyIGFuZCBORlN2MyBzdXBwb3J0LgorCisKKzMuMi4gIENMSUVOVCBTVEFSVFVQCisKKyAgIEEvIHNtLW5vdGlmeQorICAgICAgVGhpcyBzaG91bGQgYmUgcnVuIHNob3J0bHkgYWZ0ZXIgYm9vdCBhbmQgYmVmb3JlIGFueSBORlMKKyAgICAgIGZpbGVzeXN0ZW1zIGFyZSBtb3VudGVkIHdpdGggcmVtb3RlLWxvY2tpbmcgc3VwcG9ydCAtCisgICAgICBmaWxlc3lzdGVtcyBjYW4gYmUgbW91bnRlZCB3aXRoICItbyBub2xvY2siIGJlZm9yZSBzbS1ub3RpZnkuCisgICAgICBUaGlzIGlzIGFwcHJvcHJpYXRlIGZvciAnLycsICcvdXNyJywgYW5kICcvdmFyJy4KKworICAgQi8gZ3NzZCA7IGlkbWFwZAorICAgICAgaWRtYXBkIHNob3VsZCBiZSBzdGFydGVkIGJlZm9yZSBtb3VudGluZyBhbnkgTkZTdjQgZmlsZXN5c3RlbXMuCisgICAgICBnc3NkIHNob3VsZCBiZSBzdGFydGVkIGJlZm9yZSBtb3VudGluZyBhbnkgTkZTIGZpbGVzeXN0ZW1zCisgICAgICBzZWN1cmVseSAod2l0aCBLZXJiZXJvcyBvZiBTUEtNMykuCisKKyAgIEMvIHN0YXRkIHNob3VsZCBiZSBydW4gYmVmb3JlIGFueSBORlN2MiBvciBORlN2MyBmaWxlc3lzdGVtIGlzCisgICAgICBtb3VudGVkIHdpdGggcmVtb3RlIGxvY2tpbmcgKGkuZS4gd2l0aG91dCAtbyBub2xvY2spLgorICAgICAgJ21vdW50JyB3aWxsIHRyeSB0byB1c2UgIi91c3Ivc2Jpbi9zdGFydC1zdGF0ZCIgdG8gc3RhcnQgc3RhdGQKKyAgICAgIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXhwbGljaXRseQorICAgICAgc3RhcnQgc3RhdGQgaW4gYm9vdC10aW1lIHNjcmlwdHMuCisKKzMuMy4gIFNFUlZFUi9DTElFTlQgSU5URVJBQ1RJT05TCisKKyAgIEEvIHNtLW5vdGlmeQorICAgICAgQm90aCB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IG5lZWQgc20tbm90aWZ5IHRvIGJlIHJ1bi4KKyAgICAgIEl0IHNob3VsZCBiZSBydW4gYWZ0ZXIgdGhlIE5GUyBzZXJ2ZXIgaXMgc3RhcnRlZCwgYnV0IGJlZm9yZQorICAgICAgYW5kIE5GUyBmaWxlc3lzdGVtcyBhcmUgbW91bnRlZCB3aXRoIHJlbW90ZSBsb2NraW5nLgorCisgICBCLyBycGMuc3RhdGQKKyAgICAgIEJvdGggdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBuZWVkIHJwYy5zdGF0ZCB0byBiZSBydW5uaW5nLgorICAgICAgRWFjaCBzaG91bGQgdHJ5IHRvIHN0YXJ0IHdoZW4gdGhleSBuZWVkIGl0LgorCisgICBDLyBpZG1hcGQKKworICAgICAgQm90aCB0aGUgc2VydmVyIGFuZCBjbGllbnQgbmVlZCBpZG1hcGQgdG8gYmUgcnVubmluZy4gIElmIGlkbWFwZAorICAgICAgaXMgc3RhcnRlZCAoZm9yIHRoZSBjbGllbnQpIGJlZm9yZSBzdGFydGluZyBuZnNkIHRoZSAnbmZzZCcKKyAgICAgIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCwgdGhlbiBpZG1hcGQgc2hvdWxkIGJlIHNlbnQgYSBIVVAgc2lnbmFsCisgICAgICBhZnRlcndhcmRzIHRvIHNpZ25hbCB0aGF0IHRoZSBzZXJ2ZXIgY2hhbm5lbHMgc2hvdWxkIGJlIG9wZW5lZC4KKworICAgCisgICAgICAKKworU2hhcmUgQW5kIEVuam95IQorCisgICAgLS0JdGhlIG5mcy11dGlscyBkZXZlbG9wZXJzCisJPGxpbnV4LW5mc0B2Z2VyLmtlcm5lbC5vcmc+CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC5tNCBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTI3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC5tNApAQCAtMCwwICsxLDkxNDMgQEAKKyMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjExLjEgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK200X2lmbmRlZihbQUNfQVVUT0NPTkZfVkVSU0lPTl0sCisgIFttNF9jb3B5KFttNF9QQUNLQUdFX1ZFUlNJT05dLCBbQUNfQVVUT0NPTkZfVkVSU0lPTl0pXSlkbmwKK200X2lmKG00X2RlZm4oW0FDX0FVVE9DT05GX1ZFUlNJT05dKSwgWzIuNjNdLCwKK1ttNF93YXJuaW5nKFt0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmb3IgYXV0b2NvbmYgMi42My4KK1lvdSBoYXZlIGFub3RoZXIgdmVyc2lvbiBvZiBhdXRvY29uZi4gIEl0IG1heSB3b3JrLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8uCitJZiB5b3UgaGF2ZSBwcm9ibGVtcywgeW91IG1heSBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGJ1aWxkIHN5c3RlbSBlbnRpcmVseS4KK1RvIGRvIHNvLCB1c2UgdGhlIHByb2NlZHVyZSBkb2N1bWVudGVkIGJ5IHRoZSBwYWNrYWdlLCB0eXBpY2FsbHkgYGF1dG9yZWNvbmYnLl0pXSkKKworIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCittNF9kZWZpbmUoW19MVF9DT1BZSU5HXSwgW2RubAorIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorXSkKKworIyBzZXJpYWwgNTYgTFRfSU5JVAorCisKKyMgTFRfUFJFUkVRKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21wbGFpbiBhbmQgZXhpdCBpZiB0aGlzIGxpYnRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYXQgVkVSU0lPTi4KK200X2RlZnVuKFtMVF9QUkVSRVFdLAorW200X2lmKG00X3ZlcnNpb25fY29tcGFyZShtNF9kZWZuKFtMVF9QQUNLQUdFX1ZFUlNJT05dKSwgWyQxXSksIC0xLAorICAgICAgIFttNF9kZWZhdWx0KFskM10sCisJCSAgIFttNF9mYXRhbChbTGlidG9vbCB2ZXJzaW9uICQxIG9yIGhpZ2hlciBpcyByZXF1aXJlZF0sCisJCSAgICAgICAgICAgICA2MyldKV0sCisgICAgICAgWyQyXSldKQorCisKKyMgX0xUX0NIRUNLX0JVSUxERElSCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21wbGFpbiBpZiB0aGUgYWJzb2x1dGUgYnVpbGQgZGlyZWN0b3J5IG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzCittNF9kZWZ1bihbX0xUX0NIRUNLX0JVSUxERElSXSwKK1tjYXNlIGBwd2RgIGluCisgICpcICogfCAqXAkqKQorICAgIEFDX01TR19XQVJOKFtMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gYHB3ZGBdKSA7OworZXNhYworXSkKKworCisjIExUX0lOSVQoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9JTklUXSwKK1tBQ19QUkVSRVEoWzIuNThdKWRubCBXZSB1c2UgQUNfSU5DTFVERVNfREVGQVVMVAorQUNfQkVGT1JFKFskMF0sIFtMVF9MQU5HXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRETF9JTklUXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19CVUlMRERJUl0pZG5sCisKK2RubCBBdXRvY29uZiBkb2Vzbid0IGNhdGNoIHVuZXhwYW5kZWQgTFRfIG1hY3JvcyBieSBkZWZhdWx0OgorbTRfcGF0dGVybl9mb3JiaWQoW15fP0xUX1tBLVpfXSskXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW14oX0xUX0VPRnxMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XfExUX01VTFRJX01PRFVMRSkkXSlkbmwKK2RubCBhY2xvY2FsIGRvZXNuJ3QgcHVsbCBsdG9wdGlvbnMubTQsIGx0c3VnYXIubTQsIG9yIGx0dmVyc2lvbi5tNAorZG5sIHVubGVzcyB3ZSByZXF1aXJlIGFuIEFDX0RFRlVOZWQgbWFjcm86CitBQ19SRVFVSVJFKFtMVE9QVElPTlNfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVFNVR0FSX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRWRVJTSU9OX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRPQlNPTEVURV9WRVJTSU9OXSlkbmwKK200X3JlcXVpcmUoW19MVF9QUk9HX0xUTUFJTl0pZG5sCisKK2RubCBQYXJzZSBPUFRJT05TCitfTFRfU0VUX09QVElPTlMoWyQwXSwgWyQxXSkKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkbHRtYWluIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCitfTFRfU0VUVVAKKworIyBPbmx5IGV4cGFuZCBvbmNlOgorbTRfZGVmaW5lKFtMVF9JTklUXSkKK10pIyBMVF9JTklUCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FDX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKK0FVX0FMSUFTKFtBTV9QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX0xJQlRPT0xdLCBbXSkKKworCisjIF9MVF9DQ19CQVNFTkFNRShDQykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCittNF9kZWZ1bihbX0xUX0NDX0JBU0VOQU1FXSwKK1tmb3IgY2NfdGVtcCBpbiAkMSIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbW1xcL11dY29tcGlsZSB8IGNjYWNoZSB8ICpbW1xcL11dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1tcXC9dXWRpc3RjYyB8IHB1cmlmeSB8ICpbW1xcL11dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKK10pCisKKworIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSXQgaXMgb2theSB0byB1c2UgdGhlc2UgZmlsZSBjb21tYW5kcyBhbmQgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIHNldAorIyBzZW5zaWJseSBhZnRlciBgbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pJy4KK200X2RlZnVuKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSwKK1s6ICR7Q1A9ImNwIC1mIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9CitdKSMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworCisKKyMgX0xUX1NFVFVQCisjIC0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9TRVRVUF0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF9hbGlhc10sIFswXSwgW1RoZSBob3N0IHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2hvc3RdLCBbMF0pZG5sCitfTFRfREVDTChbXSwgW2hvc3Rfb3NdLCBbMF0pZG5sCitkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRfYWxpYXNdLCBbMF0sIFtUaGUgYnVpbGQgc3lzdGVtXSlkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRdLCBbMF0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX29zXSwgWzBdKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCitfTFRfREVDTChbXSwgW0xOX1NdLCBbMV0sIFtXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzXSlkbmwKK2RubAorQUNfUkVRVUlSRShbTFRfQ01EX01BWF9MRU5dKWRubAorX0xUX0RFQ0woW29iamV4dF0sIFthY19vYmpleHRdLCBbMF0sIFtPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIildKWRubAorX0xUX0RFQ0woW10sIFtleGVleHRdLCBbMF0sIFtFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIildKWRubAorZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX1JFTE9BRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfT0xEX0FSQ0hJVkVdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCisKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorXSkKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworX0xUX0NIRUNLX09CSkRJUgorCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK19MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorc2VkX3F1b3RlX3N1YnN0PSdzL1woW1siYCRcXF1dXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbImBcXF1dXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKKword2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Cit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgX0xUX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK0xUX1NVUFBPUlRFRF9UQUcoW0NDXSkKK19MVF9MQU5HX0NfQ09ORklHCitfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworX0xUX0NPTkZJR19DT01NQU5EUworXSkjIF9MVF9TRVRVUAorCisKKyMgX0xUX1BST0dfTFRNQUlOCisjIC0tLS0tLS0tLS0tLS0tLQorIyBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBib3RoIGZyb20gYGNvbmZpZ3VyZScsIGFuZCBgY29uZmlnLnN0YXR1cycKKyMgbm93IHRoYXQgd2UgdXNlIEFDX0NPTkZJR19DT01NQU5EUyB0byBnZW5lcmF0ZSBsaWJ0b29sLiAgTm90YWJseSwKKyMgYGNvbmZpZy5zdGF0dXMnIGhhcyBubyB2YWx1ZSBmb3IgYWNfYXV4X2RpciB1bmxlc3Mgd2UgYXJlIHVzaW5nIEF1dG9tYWtlLAorIyBzbyB3ZSBwYXNzIGEgY29weSBhbG9uZyB0byBtYWtlIHN1cmUgaXQgaGFzIGEgc2Vuc2libGUgdmFsdWUgYW55d2F5LgorbTRfZGVmdW4oW19MVF9QUk9HX0xUTUFJTl0sCitbbTRfaWZkZWYoW0FDX1JFUVVJUkVfQVVYX0ZJTEVdLCBbQUNfUkVRVUlSRV9BVVhfRklMRShbbHRtYWluLnNoXSldKWRubAorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2FjX2F1eF9kaXI9JyRhY19hdXhfZGlyJ10pCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKK10pIyBfTFRfUFJPR19MVE1BSU4KKworCisKKyMgU28gdGhhdCB3ZSBjYW4gcmVjcmVhdGUgYSBmdWxsIGxpYnRvb2wgc2NyaXB0IGluY2x1ZGluZyBhZGRpdGlvbmFsCisjIHRhZ3MsIHdlIGFjY3VtdWxhdGUgdGhlIGNodW5rcyBvZiBjb2RlIHRvIHNlbmQgdG8gQUNfQ09ORklHX0NPTU1BTkRTCisjIGluIG1hY3JvcyBhbmQgdGhlbiBtYWtlIGEgc2luZ2xlIGNhbGwgYXQgdGhlIGVuZCB1c2luZyB0aGUgYGxpYnRvb2wnCisjIGxhYmVsLgorCisKKyMgX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW0lOSVQtQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZ2lzdGVyIElOSVQtQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MX0lOSVRdLAorW200X2lmdmFsKFskMV0sCisgICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdLAorICAgICAgICAgICAgICAgICAgICAgWyQxCitdKV0pXSkKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0pCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0woW0NPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZ2lzdGVyIENPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCittNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLAorICAgICAgICAgICAgICAgICAgICAgWyQxCitdKV0pXSkKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdKQorCisKKyMgX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFtDT01NQU5EU10sIFtJTklUX0NPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09ORklHX1NBVkVfQ09NTUFORFNdLAorW19MVF9DT05GSUdfTElCVE9PTChbJDFdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWyQyXSkKK10pCisKKworIyBfTFRfRk9STUFUX0NPTU1FTlQoW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgbGVhZGluZyBjb21tZW50IG1hcmtzIHRvIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUsIGFuZCBhIHRyYWlsaW5nCisjIGZ1bGwtc3RvcCB0byB0aGUgd2hvbGUgY29tbWVudCBpZiBvbmUgaXMgbm90IHByZXNlbnQgYWxyZWFkeS4KK200X2RlZmluZShbX0xUX0ZPUk1BVF9DT01NRU5UXSwKK1ttNF9pZnZhbChbJDFdLCBbCittNF9icGF0c3Vic3QoW200X2JwYXRzdWJzdChbJDFdLCBbXiAqXSwgWyMgXSldLAorICAgICAgICAgICAgICBbWydgJFxdXSwgW1xcXCZdKV1tNF9ibWF0Y2goWyQxXSwgW1shPy5dJF0sIFtdLCBbLl0pCispXSkKKworCisKKworCisjIF9MVF9ERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0sIFtJUy1UQUdHRUQ/XSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDT05GSUdOQU1FIGlzIHRoZSBuYW1lIGdpdmVuIHRvIHRoZSB2YWx1ZSBpbiB0aGUgbGlidG9vbCBzY3JpcHQuCisjIFZBUk5BTUUgaXMgdGhlIChiYXNlKSBuYW1lIHVzZWQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCisjIFZBTFVFIG1heSBiZSAwLCAxIG9yIDIgZm9yIGEgY29tcHV0ZWQgcXVvdGUgZXNjYXBlZCB2YWx1ZSBiYXNlZCBvbgorIyBWQVJOQU1FLiAgQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgdXNlZCBkaXJlY3RseS4KK200X2RlZmluZShbX0xUX0RFQ0xdLAorW2x0X2lmX2FwcGVuZF91bmlxKFtsdF9kZWNsX3Zhcm5hbWVzXSwgWyQyXSwgWywgXSwKKyAgICBbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbbGlidG9vbF9uYW1lXSwKKwlbbTRfaWZ2YWwoWyQxXSwgWyQxXSwgWyQyXSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW3ZhbHVlXSwgWyQzXSkKKyAgICBtNF9pZnZhbChbJDRdLAorCVtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtkZXNjcmlwdGlvbl0sIFskNF0pXSkKKyAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sCisJW3RhZ2dlZD9dLCBbbTRfaWZ2YWwoWyQ1XSwgW3llc10sIFtub10pXSldKQorXSkKKworCisjIF9MVF9UQUdERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdERUNMXSwgW19MVF9ERUNMKFskMV0sIFskMl0sIFskM10sIFskNF0sIFt5ZXNdKV0pCisKKworIyBsdF9kZWNsX3RhZ192YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfdGFnX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbeWVzXSwgJEApXSkKKworCisjIF9sdF9kZWNsX2ZpbHRlcihTVUJLRVksIFZBTFVFLCBbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX2x0X2RlY2xfZmlsdGVyXSwKK1ttNF9jYXNlKFskI10sCisgIFswXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjXSldLAorICBbMV0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkIzogJDFdKV0sCisgIFsyXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbXSwgbHRfZGVjbF92YXJuYW1lcyldLAorICBbM10sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgWyQzXSwgbHRfZGVjbF92YXJuYW1lcyldLAorICBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sICRAKV0pW11kbmwKK10pCisKKworIyBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzFdLCAkQCldKQorCisKKyMgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2RxdW90ZV92YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsyXSwgJEApXSkKKworCisjIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2Fzc2VydChbJCMgPD0gMl0pZG5sCitfJDAobTRfcXVvdGUobTRfZGVmYXVsdChbJDFdLCBbWywgXV0pKSwKKyAgICBtNF9pZnZhbChbJDJdLCBbWyQyXV0sIFttNF9kcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpXSksCisgICAgbTRfc3BsaXQobTRfbm9ybWFsaXplKG00X3F1b3RlKF9MVF9UQUdTKSksIFsgXSkpXSkKK200X2RlZmluZShbX2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwKK1ttNF9pZnZhbChbJDNdLCBbbHRfY29tYmluZShbJDFdLCBbJDJdLCBbX10sICQzKV0pXSkKKworCisjIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgICBtNF9pZihbJDJdLCBbXSwKKwkgICBtNF9xdW90ZShsdF9kZWNsX3Zhcm5hbWVzKSwKKwltNF9xdW90ZShtNF9zaGlmdCgkQCkpKSlbXWRubAorXSkKK200X2RlZmluZShbX2x0X2RlY2xfYWxsX3Zhcm5hbWVzXSwKK1tsdF9qb2luKCRALCBsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZChbJDFdLAorCQkJbHRfZGVjbF90YWdfdmFybmFtZXMoW1ssIF1dLCBtNF9zaGlmdCgkQCkpKSlkbmwKK10pCisKKworIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKFtWQVJOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFF1b3RlIGEgdmFyaWFibGUgdmFsdWUsIGFuZCBmb3J3YXJkIGl0IHRvIGBjb25maWcuc3RhdHVzJyBzbyB0aGF0IGl0cworIyBkZWNsYXJhdGlvbiB0aGVyZSB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaW4gYGNvbmZpZ3VyZScuICBWQVJOQU1FCisjIG11c3QgaGF2ZSBhIHNpbmdsZSBxdW90ZSBkZWxpbWl0ZWQgdmFsdWUgZm9yIHRoaXMgdG8gd29yay4KK200X2RlZmluZShbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRV0sCitbJDE9J2AkRUNITyAiWCRdWyQxIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2UgZGVsaW1pdCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBzbyB3aGVuCisjIHdlIHdyaXRlIHRoZW0gdG8gY29uZmlnLnN0YXR1cywgd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHF1b3RlIGFsbAorIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKKyMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CisjCisjICAgIDx2YXI+PSdgJEVDSE8gIlgkPHZhcj4iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK200X2RlZnVuKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX2FsbF92YXJuYW1lcyksCisgICAgW200X24oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKKworCisjIF9MVF9MSUJUT09MX1RBR1MKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgY29tbWVudCBhbmQgbGlzdCBvZiB0YWdzIHN1cHBvcnRlZCBieSB0aGUgc2NyaXB0CittNF9kZWZ1bihbX0xUX0xJQlRPT0xfVEFHU10sCitbX0xUX0ZPUk1BVF9DT01NRU5UKFtUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHRdKWRubAorYXZhaWxhYmxlX3RhZ3M9Il9MVF9UQUdTImRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0RFQ0xBUkUoVkFSTkFNRSwgW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4dHJhY3QgdGhlIGRpY3Rpb25hcnkgdmFsdWVzIGZvciBWQVJOQU1FIChvcHRpb25hbGx5IHdpdGggVEFHKSBhbmQKKyMgZXhwYW5kIHRvIGEgY29tbWVudGVkIHNoZWxsIHZhcmlhYmxlIHNldHRpbmc6CisjCisjICAgICMgU29tZSBjb21tZW50IGFib3V0IHdoYXQgVkFSIGlzIGZvci4KKyMgICAgdmlzaWJsZV9uYW1lPSRsdF9pbnRlcm5hbF9uYW1lCittNF9kZWZpbmUoW19MVF9MSUJUT09MX0RFQ0xBUkVdLAorW19MVF9GT1JNQVRfQ09NTUVOVChtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLAorCQkJCQkgICBbZGVzY3JpcHRpb25dKSkpW11kbmwKK200X3B1c2hkZWYoW19saWJ0b29sX25hbWVdLAorICAgIG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFtsaWJ0b29sX25hbWVdKSkpW11kbmwKK200X2Nhc2UobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSkpLAorICAgIFswXSwgW19saWJ0b29sX25hbWU9WyRdJDFdLAorICAgIFsxXSwgW19saWJ0b29sX25hbWU9JGx0X1tdJDFdLAorICAgIFsyXSwgW19saWJ0b29sX25hbWU9JGx0X1tdJDFdLAorICAgIFtfbGlidG9vbF9uYW1lPWx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pXSlbXWRubAorbTRfaWZ2YWwoWyQyXSwgW18kMl0pW11tNF9wb3BkZWYoW19saWJ0b29sX25hbWVdKVtdZG5sCitdKQorCisKKyMgX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBjb21tZW50ZWQgZGVjbGFyYXRpb25zIG9mIG5vbi10YWdnZWQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzCisjIHN1aXRhYmxlIGZvciBpbnNlcnRpb24gaW4gdGhlIExJQlRPT0wgQ09ORklHIHNlY3Rpb24gb2YgdGhlIGBsaWJ0b29sJworIyBzY3JpcHQuICBUYWdnZWQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzIChldmVuIGZvciB0aGUgTElCVE9PTCBDT05GSUcKKyMgc2VjdGlvbikgYXJlIHByb2R1Y2VkIGJ5IF9MVF9MSUJUT09MX1RBR19WQVJTLgorbTRfZGVmdW4oW19MVF9MSUJUT09MX0NPTkZJR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwKKyAgICBtNF9xdW90ZShfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbbm9dLCBbXSwgbHRfZGVjbF92YXJuYW1lcykpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdfVkFSUyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX0xJQlRPT0xfVEFHX1ZBUlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyksCisgICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhciwgWyQxXSldKV0pXSkKKworCisjIF9MVF9UQUdWQVIoVkFSTkFNRSwgW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR1ZBUl0sIFttNF9pZnZhbChbJDJdLCBbJDFfJDJdLCBbJDFdKV0pCisKKworIyBfTFRfQ09ORklHX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VuZCBhY2N1bXVsYXRlZCBvdXRwdXQgdG8gJENPTkZJR19TVEFUVVMuICBUaGFua3MgdG8gdGhlIGxpc3RzIG9mCisjIHZhcmlhYmxlcyBmb3Igc2luZ2xlIGFuZCBkb3VibGUgcXVvdGUgZXNjYXBpbmcgd2Ugc2F2ZWQgZnJvbSBjYWxscworIyB0byBfTFRfREVDTCwgd2UgY2FuIHB1dCBxdW90ZSBlc2NhcGVkIHZhcmlhYmxlcyBkZWNsYXJhdGlvbnMKKyMgaW50byBgY29uZmlnLnN0YXR1cycsIGFuZCB0aGVuIHRoZSBzaGVsbCBjb2RlIHRvIHF1b3RlIGVzY2FwZSB0aGVtIGluCisjIGZvciBsb29wcyBpbiBgY29uZmlnLnN0YXR1cycuICBGaW5hbGx5LCBhbnkgYWRkaXRpb25hbCBjb2RlIGFjY3VtdWxhdGVkCisjIGZyb20gY2FsbHMgdG8gX0xUX0NPTkZJR19MSUJUT09MX0lOSVQgaXMgZXhwYW5kZWQuCittNF9kZWZ1bihbX0xUX0NPTkZJR19DT01NQU5EU10sCitbQUNfUFJPVklERV9JRkVMU0UoW0xUX09VVFBVVF0sCisJZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBoYXMgYmVlbiBwbGFjZWQgaW4gJENPTkZJR19MVCwKKwlkbmwgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdCBhbGwgb3ZlciBhZ2FpbiBpbnRvIGNvbmZpZy5zdGF0dXMsCisJZG5sIHRoZW4gd2Ugd2lsbCBoYXZlIGNvbmZpZy5zdGF0dXMgcnVuICRDT05GSUdfTFQgbGF0ZXIsIHNvIGl0CisJZG5sIG5lZWRzIHRvIGtub3cgd2hhdCBuYW1lIGlzIHN0b3JlZCB0aGVyZToKKyAgICAgICAgW0FDX0NPTkZJR19DT01NQU5EUyhbbGlidG9vbF0sCisgICAgICAgICAgICBbJFNIRUxMICRDT05GSUdfTFQgfHwgQVNfRVhJVCgxKV0sIFtDT05GSUdfTFQ9JyRDT05GSUdfTFQnXSldLAorICAgIGRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaXMgZGVzdGluZWQgZm9yIGNvbmZpZy5zdGF0dXMsCisgICAgZG5sIGV4cGFuZCB0aGUgYWNjdW11bGF0ZWQgY29tbWFuZHMgYW5kIGluaXQgY29kZSBub3c6CisgICAgW0FDX0NPTkZJR19DT01NQU5EUyhbbGlidG9vbF0sCisgICAgICAgIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLCBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdKV0pCitdKSNfTFRfQ09ORklHX0NPTU1BTkRTCisKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0sCitbCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKK2RvdWJsZV9xdW90ZV9zdWJzdD0nJGRvdWJsZV9xdW90ZV9zdWJzdCcKK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSckZGVsYXlfdmFyaWFibGVfc3Vic3QnCitfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKK0xUQ0M9JyRMVENDJworTFRDRkxBR1M9JyRMVENGTEFHUycKK2NvbXBpbGVyPSckY29tcGlsZXJfREVGQVVMVCcKKworIyBRdW90ZSBldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMpOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgorICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPICJYXFxcXFwkXCR2YXIiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlhcXFwkXCR2YXJcXCIgfCBcXFwkWHNlZCAtZSBcXCJcXFwkZG91YmxlX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworZG9uZQorCisjIEZpeC11cCBmYWxsYmFjayBlY2hvIGlmIGl0IHdhcyBtYW5nbGVkIGJ5IHRoZSBhYm92ZSBxdW90aW5nIHJ1bGVzLgorY2FzZSBcJGx0X0VDSE8gaW4KKyonXFxcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJylkbmwgIgorICBsdF9FQ0hPPVxgXCRFQ0hPICJYXCRsdF9FQ0hPIiB8IFwkWHNlZCAtZSAncy9cXFxcXFxcXFxcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJcWyRdL1xbJF0wIC0tZmFsbGJhY2stZWNobyIvJ1xgCisgIDs7Citlc2FjCisKK19MVF9PVVRQVVRfTElCVE9PTF9JTklUCitdKQorCisKKyMgTFRfT1VUUFVUCisjIC0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIGFsbG93cyBlYXJseSBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdCAoYmVmb3JlCisjIEFDX09VVFBVVCBpcyBjYWxsZWQpLCBpbmNhc2UgaXQgaXMgdXNlZCBpbiBjb25maWd1cmUgZm9yIGNvbXBpbGF0aW9uCisjIHRlc3RzLgorQUNfREVGVU4oW0xUX09VVFBVVF0sCitbOiAke0NPTkZJR19MVD0uL2NvbmZpZy5sdH0KK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfTFRdKQorY2F0ID4iJENPTkZJR19MVCIgPDxfTFRFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIGEgbGlidG9vbCBzdHViIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKworbHRfY2xfc2lsZW50PWZhbHNlCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PFxfTFRFT0YKK0FTX1NIRUxMX1NBTklUSVpFCitfQVNfUFJFUEFSRQorCitleGVjIEFTX01FU1NBR0VfRkQ+JjEKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBBU19CT1goW1J1bm5pbmcgJGFzX21lLl0pCit9ID4mQVNfTUVTU0FHRV9MT0dfRkQKKworbHRfY2xfaGVscD0iXAorXGAkYXNfbWUnIGNyZWF0ZXMgYSBsb2NhbCBsaWJ0b29sIHN0dWIgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAorZm9yIHVzZSBpbiBmdXJ0aGVyIGNvbmZpZ3VyZSB0aW1lIHRlc3RzIGJlZm9yZSB0aGUgcmVhbCBsaWJ0b29sIGlzCitnZW5lcmF0ZWQuCisKK1VzYWdlOiAkWzBdIFtbT1BUSU9OU11dCisKKyAgLWgsIC0taGVscCAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKworbHRfY2xfdmVyc2lvbj0iXAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcubHRbXWRubAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKK2NvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgorCitDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCit3aGlsZSB0ZXN0ICRbI10gIT0gMAorZG8KKyAgY2FzZSAkWzFdIGluCisgICAgLS12ZXJzaW9uIHwgLS12KiB8IC1WICkKKyAgICAgIGVjaG8gIiRsdF9jbF92ZXJzaW9uIjsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgIGVjaG8gIiRsdF9jbF9oZWxwIjsgZXhpdCAwIDs7CisgICAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgICBkZWJ1Zz06IDs7CisgICAgLS1xdWlldCB8IC0tcSogfCAtLXNpbGVudCB8IC0tcyogfCAtcSApCisgICAgICBsdF9jbF9zaWxlbnQ9OiA7OworCisgICAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisKKyAgICAqKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBhcmd1bWVudDogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgJGx0X2NsX3NpbGVudDsgdGhlbgorICBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCitmaQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PF9MVEVPRgorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVQKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKQorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTCitBU19FWElUKDApCitfTFRFT0YKK2NobW9kICt4ICIkQ09ORklHX0xUIgorCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGJ1dCBjb25maWcubHQgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLAorIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKKyMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZworIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGx0X2NsX3N1Y2Nlc3M9OgorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGx0X2NvbmZpZ19sdF9hcmdzPSIkbHRfY29uZmlnX2x0X2FyZ3MgLS1xdWlldCIKKyAgZXhlYyBBU19NRVNTQUdFX0xPR19GRD4vZGV2L251bGwKKyAgJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQorICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCisgICRsdF9jbF9zdWNjZXNzIHx8IEFTX0VYSVQoMSkKK2ZpCitdKSMgTFRfT1VUUFVUCisKKworIyBfTFRfQ09ORklHKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tCisjIElmIFRBRyBpcyB0aGUgYnVpbHQtaW4gdGFnLCBjcmVhdGUgYW4gaW5pdGlhbCBsaWJ0b29sIHNjcmlwdCB3aXRoIGEKKyMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIHVudGFnZ2VkIGNvbmZpZyB2YXJzLiAgT3RoZXJ3aXNlIGFkZCBjb2RlCisjIHRvIGNvbmZpZy5zdGF0dXMgZm9yIGFwcGVuZGluZyB0aGUgY29uZmlndXJhdGlvbiBuYW1lZCBieSBUQUcgZnJvbSB0aGUKKyMgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorbTRfZGVmdW4oW19MVF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFsKKyAgbTRfZGVmaW5lKFtfTFRfVEFHXSwgbTRfaWYoWyQxXSwgW10sIFtDXSwgWyQxXSkpZG5sCisgIG00X2lmKF9MVF9UQUcsIFtDXSwgWworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCitfTFRfQ09QWUlORworX0xUX0xJQlRPT0xfVEFHUworCisjICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRworX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlMKK19MVF9MSUJUT09MX1RBR19WQVJTCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKyAgX0xUX1BST0dfTFRNQUlOCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlL3EnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIF9MVF9QUk9HX1hTSV9TSEVMTEZOUworCisgIHNlZCAtbiAnL14jIEdlbmVyYXRlZCBzaGVsbCBmdW5jdGlvbnMgaW5zZXJ0ZWQgaGVyZS8sJHAnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSwKK1tjYXQgPDxfTFRfRU9GID4+ICIkb2ZpbGUiCisKK2RubCBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlICQxIGhlcmUsIHNpbmNlIF9MVF9UQUcgaXMgbm90IGV4cGFuZGVkCitkbmwgaW4gYSBjb21tZW50IChpZSBhZnRlciBhICMpLgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0xJQlRPT0xfVEFHX1ZBUlMoX0xUX1RBRykKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfRU9GCitdKWRubCAvbTRfaWYKK10sCitbbTRfaWYoWyQxXSwgW10sIFsKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJ10sIFtdKQorXSlkbmwgL19MVF9DT05GSUdfU0FWRV9DT01NQU5EUworXSkjIF9MVF9DT05GSUcKKworCisjIExUX1NVUFBPUlRFRF9UQUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJhY2UgdGhpcyBtYWNybyB0byBkaXNjb3ZlciB3aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGlidG9vbAorIyAtLXRhZyBvcHRpb24sIHVzaW5nOgorIyAgICBhdXRvY29uZiAtLXRyYWNlICdMVF9TVVBQT1JURURfVEFHOiQxJworQUNfREVGVU4oW0xUX1NVUFBPUlRFRF9UQUddLCBbXSkKKworCisjIEMgc3VwcG9ydCBpcyBidWlsdC1pbiBmb3Igbm93CittNF9kZWZpbmUoW19MVF9MQU5HX0NfZW5hYmxlZF0sIFtdKQorbTRfZGVmaW5lKFtfTFRfVEFHU10sIFtdKQorCisKKyMgTFRfTEFORyhMQU5HKQorIyAtLS0tLS0tLS0tLS0tCisjIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLgorQUNfREVGVU4oW0xUX0xBTkddLAorW0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK200X2Nhc2UoWyQxXSwKKyAgW0NdLAkJCVtfTFRfTEFORyhDKV0sCisgIFtDKytdLAkJW19MVF9MQU5HKENYWCldLAorICBbSmF2YV0sCQlbX0xUX0xBTkcoR0NKKV0sCisgIFtGb3J0cmFuIDc3XSwJCVtfTFRfTEFORyhGNzcpXSwKKyAgW0ZvcnRyYW5dLAkJW19MVF9MQU5HKEZDKV0sCisgIFtXaW5kb3dzIFJlc291cmNlXSwJW19MVF9MQU5HKFJDKV0sCisgIFttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19DT05GSUddLAorICAgIFtfTFRfTEFORygkMSldLAorICAgIFttNF9mYXRhbChbJDA6IHVuc3VwcG9ydGVkIGxhbmd1YWdlOiAiJDEiXSldKV0pZG5sCitdKSMgTFRfTEFORworCisKKyMgX0xUX0xBTkcoTEFOR05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HXSwKK1ttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10sCisgIFtMVF9TVVBQT1JURURfVEFHKFskMV0pZG5sCisgIG00X2FwcGVuZChbX0xUX1RBR1NdLCBbJDEgXSlkbmwKKyAgbTRfZGVmaW5lKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSlkbmwKKyAgX0xUX0xBTkdfJDFfQ09ORklHKCQxKV0pZG5sCitdKSMgX0xUX0xBTkcKKworCisjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkdfREVGQVVMVF9DT05GSUddLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgIFtMVF9MQU5HKENYWCldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbTFRfTEFORyhDWFgpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICBbTFRfTEFORyhGNzcpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0xUX0xBTkcoRjc3KV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRkNdLAorICBbTFRfTEFORyhGQyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0ZDXSwgZGVmbihbQUNfUFJPR19GQ10pW0xUX0xBTkcoRkMpXSldKQorCitkbmwgVGhlIGNhbGwgdG8gW0FdW01fUFJPR19HQ0pdIGlzIHF1b3RlZCBsaWtlIHRoYXQgdG8gc3RvcCBhY2xvY2FsCitkbmwgcHVsbGluZyB0aGluZ3MgaW4gbmVlZGxlc3NseS4KK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgIFtMVF9MQU5HKEdDSildLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgIFtMVF9MQU5HKEdDSildLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19HQ0pdLAorICAgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgICBbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbTFRfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0xUX1BST0dfR0NKXSwgZGVmbihbTFRfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pXSldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX1JDXSwKKyAgW0xUX0xBTkcoUkMpXSwKKyAgW200X2RlZmluZShbTFRfUFJPR19SQ10sIGRlZm4oW0xUX1BST0dfUkNdKVtMVF9MQU5HKFJDKV0pXSkKK10pIyBfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworCisjIE9ic29sZXRlIG1hY3JvczoKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtMVF9MQU5HKEMrKyldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW0xUX0xBTkcoRm9ydHJhbiA3NyldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbTFRfTEFORyhGb3J0cmFuKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbTFRfTEFORyhKYXZhKV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbXSkKKworCisjIF9MVF9UQUdfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UQUdfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCitfTFRfREVDTChbTFRDQ10sIFtDQ10sIFsxXSwgW0EgQyBjb21waWxlcl0pZG5sCitfTFRfREVDTChbTFRDRkxBR1NdLCBbQ0ZMQUdTXSwgWzFdLCBbTFRDQyBjb21waWxlciBmbGFnc10pZG5sCitfTFRfVEFHREVDTChbQ0NdLCBbY29tcGlsZXJdLCBbMV0sIFtBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyXSlkbmwKK19MVF9UQUdERUNMKFt3aXRoX2djY10sIFtHQ0NdLCBbMF0sIFtJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj9dKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCitdKSMgX0xUX1RBR19DT01QSUxFUgorCisKKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCitdKSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIF9MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuX29uY2UoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSxbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4qKQorICAgIEFDX0NIRUNLX1RPT0woW0RTWU1VVElMXSwgW2RzeW11dGlsXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW05NRURJVF0sIFtubWVkaXRdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTElQT10sIFtsaXBvXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MXSwgW290b29sXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MNjRdLCBbb3Rvb2w2NF0sIFs6XSkKKyAgICBfTFRfREVDTChbXSwgW0RTWU1VVElMXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTk1FRElUXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW0xJUE9dLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTDY0XSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40XSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWddLFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kXSwKKyAgICAgIFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCisJIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCisJIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCisJIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQorCSMgbGluayBmbGFncy4KKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKKwllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCWlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaV0pCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnXSwKKyAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3RdLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubworICAgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgICBlY2hvICJfbWFpbiIgPiBjb25mdGVzdC5zeW0KKyAgICAgIExERkxBR1M9IiRMREZMQUdTIC1XbCwtZXhwb3J0ZWRfc3ltYm9sc19saXN0LGNvbmZ0ZXN0LnN5bSIKKyAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PXllc10sCisJW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ub10pCisJTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBdKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luMS4qKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbiopICMgZGFyd2luIDUueCBvbgorICAgICAgIyBpZiBydW5uaW5nIG9uIDEwLjUgb3IgbGF0ZXIsIHRoZSBkZXBsb3ltZW50IHRhcmdldCBkZWZhdWx0cworICAgICAgIyB0byB0aGUgT1MgdmVyc2lvbiwgaWYgb24geDg2LCBhbmQgMTAuNCwgdGhlIGRlcGxveW1lbnQKKyAgICAgICMgdGFyZ2V0IGRlZmF1bHRzIHRvIDEwLjQuIERvbid0IHlvdSBsb3ZlIGl0PworICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSwkaG9zdCBpbgorCTEwLjAsKjg2Ki1kYXJ3aW44KnwxMC4wLCotZGFyd2luW1s5MV1dKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKwkxMC5bWzAxMl1dKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKwkxMC4qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworICAgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9zaW5nbGVfbW9kPSckc2luZ2xlX21vZHVsZScKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9JyAke3dsfS1leHBvcnRlZF9zeW1ib2xzX2xpc3QsJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bScKKyAgICBlbHNlCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPSd+JE5NRURJVCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBmaQorICAgIGlmIHRlc3QgIiREU1lNVVRJTCIgIT0gIjoiOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCisKKworIyBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCittNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAorWworICBtNF9yZXF1aXJlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1lY2hvCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtNF9pZihbJDFdLCBbQ1hYXSwKK1sgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgIT0gInllcyI7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kc3ltdXRpbH0iCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBmaQorXSxbXSkKKyAgZWxzZQorICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgIGZpCitdKQorCisjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpbmtzIGEgbWluaW1hbCBwcm9ncmFtIGFuZCBjaGVja3MgdGhlIGV4ZWN1dGFibGUKKyMgZm9yIHRoZSBzeXN0ZW0gZGVmYXVsdCBoYXJkY29kZWQgbGlicmFyeSBwYXRoLiBJbiBtb3N0IGNhc2VzLAorIyB0aGlzIGlzIC91c3IvbGliOi9saWIsIGJ1dCB3aGVuIHRoZSBNUEkgY29tcGlsZXJzIGFyZSB1c2VkCisjIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tbXVuaWNhdGlvbiBhbmQgTVBJIGxpYnMgYXJlIGluY2x1ZGVkIHRvby4KKyMgSWYgd2UgZG9uJ3QgZmluZCBhbnl0aGluZywgdXNlIHRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBhY2NvcmRpbmcKKyMgdG8gdGhlIGFpeCBsZCBtYW51YWwuCittNF9kZWZ1bihbX0xUX1NZU19NT0RVTEVfUEFUSF9BSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWworbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJL14wLyB7CisJICAgIHMvXjAgICpcKC4qXCkkL1wxLworCSAgICBwCisJfQorICAgIH0nCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KKyAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCitmaV0sW10pCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKK10pIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorCisKKyMgX0xUX1NIRUxMX0lOSVQoQVJHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9TSEVMTF9JTklUXSwKK1tpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCisJICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAorCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCiskMQorQUNfRElWRVJUX1BPUAorXSkjIF9MVF9TSEVMTF9JTklUCisKKworIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKKyMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KK200X2RlZnVuKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbX0xUX1NIRUxMX0lOSVQoWworIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworY2FzZSBYJGx0X0VDSE8gaW4KK1gqLS1mYWxsYmFjay1lY2hvKQorICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgorICBFQ0hPPWBlY2hvICIkbHRfRUNITyIgfCBzZWQgJ3MsXFxcXFxbJF1cXFskXTAsJ1skXTAnLCdgCisgIDs7Citlc2FjCisKK0VDSE89JHtsdF9FQ0hPLWVjaG99CitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KKyAgIyBZaXBwZWUsICRFQ0hPIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KKyAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CitmaQorCitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PF9MVF9FT0YKK1skXSoKK19MVF9FT0YKKyAgZXhpdCAwCitmaQorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitpZiB0ZXN0IC16ICIkbHRfRUNITyI7IHRoZW4KKyAgaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgICAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCisgICAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgICAgaWYgeyBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgOyB9IDI+L2Rldi9udWxsICYmCisJIHsgdGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsCisgICAgICB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKworICBpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgZWNob190ZXN0aW5nX3N0cmluZz1geyAkRUNITyAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgorICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICA6CisgIGVsc2UKKyAgICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKKyAgICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgICAjCisgICAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgorCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKKyAgICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICAgRUNITz0iJGRpci9lY2hvIgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgICBpZiB0ZXN0ICJYJEVDSE8iID0gWGVjaG87IHRoZW4KKyAgICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgorICAgICAgaWYgdGVzdCAiWGB7IHByaW50IC1yICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWB7IHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGxgICYmCisgICAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgICAgRUNITz0ncHJpbnQgLXInCisgICAgICBlbGlmIHsgdGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dDsgfSAmJgorCSAgIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCisgICAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorICAgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAorICAgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KKyAgICAgIGVsc2UKKyAgICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgorICAgICAgICBFQ0hPPSdwcmludGYgJXNcbicKKyAgICAgICAgaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1geyAkRUNITyAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSAgIyBDb29sLCBwcmludGYgd29ya3MKKwkgIDoKKyAgICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJICBDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAorCSAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJICBleHBvcnQgU0hFTEwKKwkgIEVDSE89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSAgRUNITz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgICAgZWxzZQorCSAgIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwkgIHByZXY9OgorCisJICBmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCA1MHEgIlskXTAiJzsgZG8KKwkgICAgaWYgeyB0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCI7IH0gMj4vZGV2L251bGwKKwkgICAgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIHByZXY9IiRjbWQiCisJICBkb25lCisKKwkgIGlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCisJICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCisJICAgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCisJICAgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQorCSAgZWxzZQorCSAgICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgorCSAgICBFQ0hPPWVjaG8KKwkgIGZpCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitmaQorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCisjIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KK2x0X0VDSE89JEVDSE8KK2lmIHRlc3QgIlgkbHRfRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisgICBsdF9FQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcWyRdMCAtLWZhbGxiYWNrLWVjaG8iCitmaQorCitBQ19TVUJTVChsdF9FQ0hPKQorXSkKK19MVF9ERUNMKFtdLCBbU0hFTExdLCBbMV0sIFtTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzXSkKK19MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwKKyAgICBbQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzXSkKK10pIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX0VOQUJMRV9MT0NLCisjIC0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9FTkFCTEVfTE9DS10sCitbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKKyAgICBbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgICAqRUxGLTMyKikKKwlIUFVYX0lBNjRfTU9ERT0iMzIiCisJOzsKKyAgICAgICpFTEYtNjQqKQorCUhQVVhfSUE2NF9NT0RFPSI2NCIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC0zMiIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAorczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICA7OworCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisJICAgIDs7CisJICBzMzkweC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisJICAgIDs7CisJICBzcGFyYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICo2NC1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKwkgICAgOzsKKwkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisJICAgIDs7CisJICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAorICAgIFtBQ19MQU5HX1BVU0goQykKKyAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLFtbXV0pXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKKyAgICAgQUNfTEFOR19QT1BdKQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7Oworc3BhcmMqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKK10pIyBfTFRfRU5BQkxFX0xPQ0sKKworCisjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfT0xEX0FSQ0hJVkVdLAorW0FDX0NIRUNLX1RPT0woQVIsIGFyLCBmYWxzZSkKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0pCisKK0FDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06CitfTFRfREVDTChbXSwgW1NUUklQXSwgWzFdLCBbQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW1dKQorCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK19MVF9ERUNMKFtdLCBbUkFOTElCXSwgWzFdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQorCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKK19MVF9ERUNMKFtdLCBbb2xkX3Bvc3RpbnN0YWxsX2NtZHNdLCBbMl0pCitfTFRfREVDTChbXSwgW29sZF9wb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQorXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKworCisjIF9MVF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9DT01QSUxFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgbTRfaWYoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitlbHNlCisgICAgbTRfaWYoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBfTFRfQ09NUElMRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbX0xUX0NPTVBJTEVSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW10pCisKKworIyBfTFRfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmtlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfTElOS0VSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgJEVDSE8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgICQyPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICAkMj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gLXIgY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDRdLCAsIDosIFskNF0pCitlbHNlCisgICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQorZmkKK10pIyBfTFRfTElOS0VSX09QVElPTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtfTFRfTElOS0VSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtdKQorCisKKyMgTFRfQ01EX01BWF9MRU4KKyMtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9DTURfTUFYX0xFTl0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCitBQ19NU0dfQ0hFQ0tJTkcoW3RoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzXSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX21heF9jbWRfbGVuXSwgW2RubAorICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQorICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgorICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcworICAgIGZpCisgICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgOzsKKworICBpbnRlcml4KikKKyAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4CisgICAgOzsKKworICBvc2YqKQorICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQorICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90CisgICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KKyAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKKyAgICAjCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KKyAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCisgICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICBzY28zLjJ2NSopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAorICAgIDs7CisgIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKKyAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbWwkgXV0vLydgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4CisgICAgZmkKKyAgICA7OworICAqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICBlbHNlCisgICAgICAjIE1ha2UgdGVzdHN0cmluZyBhIGxpdHRsZSBiaWdnZXIgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggaXQuCisgICAgICAjIGEgMUsgc3RyaW5nIHNob3VsZCBiZSBhIHJlYXNvbmFibGUgc3RhcnQuCisgICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOyBkbworICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKKyAgICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICAgIHdoaWxlIHsgdGVzdCAiWCJgJFNIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgorCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgZG8KKyAgICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgIyBPbmx5IGNoZWNrIHRoZSBzdHJpbmcgbGVuZ3RoIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgCisgICAgICB0ZXN0c3RyaW5nPQorICAgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbgorICAgICAgIyBtYXNzaXZlIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUKKyAgICAgICMgbGlua2VyLiAgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KK19MVF9ERUNMKFtdLCBbbWF4X2NtZF9sZW5dLCBbMF0sCisgICAgW1doYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD9dKQorXSkjIExUX0NNRF9NQVhfTEVOCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbTFRfQ01EX01BWF9MRU5dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtdKQorCisKKyMgX0xUX0hFQURFUl9ETEZDTgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0hFQURFUl9ETEZDTl0sCitbQUNfQ0hFQ0tfSEVBREVSUyhbZGxmY24uaF0sIFtdLCBbXSwgW0FDX0lOQ0xVREVTX0RFRkFVTFRdKWRubAorXSkjIF9MVF9IRUFERVJfRExGQ04KKworCisjIF9MVF9UUllfRExPUEVOX1NFTEYgKEFDVElPTi1JRi1UUlVFLCBBQ1RJT04tSUYtVFJVRS1XLVVTQ09SRSwKKyMgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OLUlGLUZBTFNFLCBBQ1RJT04tSUYtQ1JPU1MtQ09NUElMSU5HKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1RSWV9ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIFskNF0KK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorWyNsaW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKwordm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9XQorX0xUX0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgJDMKKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCitdKSMgX0xUX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgTFRfU1lTX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgXSkKKyAgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSwKKwlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKKwkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKKwkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAorCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0pCisJICAgICAgXSkKKwkgICAgXSkKKwkgIF0pCisJXSkKKyAgICAgIF0pCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKKyAgICAgIF0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW2Rsb3Blbl9zdXBwb3J0XSwgW2VuYWJsZV9kbG9wZW5dLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZfc3RhdGljXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWNdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorXSkjIExUX1NZU19ETE9QRU5fU0VMRgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbTFRfU1lTX0RMT1BFTl9TRUxGXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlci4KKyMgVGhpcyBtYWNybyBkb2VzIG5vdCBoYXJkIGNvZGUgdGhlIGNvbXBpbGVyIGxpa2UgQUNfUFJPR19DQ19DX08uCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0NfT10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCitdKQorX0xUX1RBR0RFQ0woW2NvbXBpbGVyX2Nfb10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFsxXSwKKwlbRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zP10pCitdKSMgX0xUX0NPTVBJTEVSX0NfTworCisKKyMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1NdLAorW200X3JlcXVpcmUoW19MVF9FTkFCTEVfTE9DS10pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT01QSUxFUl9DX08oWyQxXSkKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKK19MVF9ERUNMKFtdLCBbbmVlZF9sb2Nrc10sIFsxXSwgW011c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uP10pCitdKSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MKKworCisjIF9MVF9DSEVDS19PQkpESVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DSEVDS19PQkpESVJdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCitbcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCitvYmpkaXI9JGx0X2N2X29iamRpcgorX0xUX0RFQ0woW10sIFtvYmpkaXJdLCBbMF0sCisgICAgICAgICBbVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW0xUX09CSkRJUl0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoTFRfT0JKRElSLCAiJGx0X2N2X29iamRpci8iLAorICBbRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy5dKQorXSkjIF9MVF9DSEVDS19PQkpESVIKKworCisjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEhdLAorW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCitfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQoraWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fAorICAgdGVzdCAtbiAiJF9MVF9UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwKKyAgIHRlc3QgIlgkX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbmsgfHwKKyAgIHRlc3QgIiRfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKSIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2FjdGlvbl0sIFswXSwKKyAgICBbSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGVdKQorXSkjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSAorCisKKyMgX0xUX0NNRF9TVFJJUExJQgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9TVFJJUExJQl0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtdLCBbb2xkX3N0cmlwbGliXSwgWzFdLCBbQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3RyaXBsaWJdLCBbMV0pCitdKSMgX0xUX0NNRF9TVFJJUExJQgorCisKKyMgX0xUX1NZU19EWU5BTUlDX0xJTktFUihbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKK200X2lmKFskMV0sCisJW10sIFsKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJEdSRVAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgZmkKKyAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKKyAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCisgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQorICBsdF9tdWx0aV9vc19kaXI9YCRDQyAkQ1BQRkxBR1MgJENGTEFHUyAkTERGTEFHUyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5IDI+L2Rldi9udWxsYAorICBmb3IgbHRfc3lzX3BhdGggaW4gJGx0X3NlYXJjaF9wYXRoX3NwZWM7IGRvCisgICAgaWYgdGVzdCAtZCAiJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiOyB0aGVuCisgICAgICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIgorICAgIGVsc2UKKyAgICAgIHRlc3QgLWQgIiRsdF9zeXNfcGF0aCIgJiYgXAorCWx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoIgorICAgIGZpCisgIGRvbmUKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIHwgYXdrICcKK0JFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKKyAgbHRfZm9vPSIiOworICBsdF9jb3VudD0wOworICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgeworICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKKyAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7CisgICAgICAgIGx0X2NvdW50Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgeworICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGx0X2NvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW1tsdF9mb29dXSsrOyB9CisgIGlmIChsdF9mcmVxW1tsdF9mb29dXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gJGx0X3NlYXJjaF9wYXRoX3NwZWNgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpXSkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbWzQtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgcG93ZXJwYykKKyAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCisgICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIDs7CisgIG02OGspCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgICAgOzsKKyAgZXNhYworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpW1s0NV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKiB8IHllcyxjZWdjYyopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgorICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KKyAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87CisgICAgICBmaScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCAkR1JFUCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgWyRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCittNF9pZihbJDFdLCBbXSxbCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xvY2FsL2xpYiJdKQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFtbMTIzXV0qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMDFdXSogfCBmcmVlYnNkZWxmMy5bWzAxXV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1syLTldXSogfCBmcmVlYnNkZWxmMy5bWzItOV1dKiB8IFwKKyAgZnJlZWJzZDQuW1swLTVdXSB8IGZyZWVic2RlbGY0LltbMC01XV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFtbMy05XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpXCI7IFwKKyAgICAgICBMREZMQUdTPVwiXCRMREZMQUdTICRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKVwiIgorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisgICAgW0FTX0lGKFsgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsXSwKKyAgICAgICBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllc10pXSkKKyAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgIGxpYmRpcj0kc2F2ZV9saWJkaXIKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFkZCBBQkktc3BlY2lmaWMgZGlyZWN0b3JpZXMgdG8gdGhlIHN5c3RlbSBsaWJyYXJ5IHBhdGguCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliNjQgL3Vzci9saWI2NCAvbGliIC91c3IvbGliIgorCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCityZG9zKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit0cGYqKQorICAjIFRQRiBpcyBhIGNyb3NzLXRhcmdldCBvbmx5LiAgUHJlZmVycmVkIGNyb3NzLWhvc3QgPSBHTlUvTGludXguCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKK19MVF9ERUNMKFtdLCBbdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmtdLCBbMV0sCisgICAgW1ZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorICAgIHJlc3RvcmVkIGF0IGxpbmsgdGltZV0pCitfTFRfREVDTChbXSwgW25lZWRfbGliX3ByZWZpeF0sIFswXSwKKyAgICBbRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzP10pCitfTFRfREVDTChbXSwgW25lZWRfdmVyc2lvbl0sIFswXSwgW0RvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/XSkKK19MVF9ERUNMKFtdLCBbdmVyc2lvbl90eXBlXSwgWzBdLCBbTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGVdKQorX0xUX0RFQ0woW10sIFtydW5wYXRoX3Zhcl0sIFswXSwgIFtTaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGVdKQorX0xUX0RFQ0woW10sIFtzaGxpYnBhdGhfdmFyXSwgWzBdLFtTaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwgWzBdLAorICAgIFtJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/XSkKK19MVF9ERUNMKFtdLCBbbGlibmFtZV9zcGVjXSwgWzFdLCBbRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXhdKQorX0xUX0RFQ0woW10sIFtsaWJyYXJ5X25hbWVzX3NwZWNdLCBbMV0sCisgICAgW1tMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorICAgIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUVdXSkKK19MVF9ERUNMKFtdLCBbc29uYW1lX3NwZWNdLCBbMV0sCisgICAgW1tUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZV1dKQorX0xUX0RFQ0woW10sIFtwb3N0aW5zdGFsbF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kIHRvIHVzZSBhZnRlciBpbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW2ZpbmlzaF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnldKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfZXZhbF0sIFsxXSwKKyAgICBbW0FzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorICAgIG5vdCBzaG93bl1dKQorX0xUX0RFQ0woW10sIFtoYXJkY29kZV9pbnRvX2xpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNdLCBbMl0sCisgICAgW0NvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitdKSMgX0xUX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX1BBVEhfVE9PTF9QUkVGSVgoVE9PTCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbX0xUX1BBVEhfVE9PTF9QUkVGSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJtNF9pZihbJDJdLCAsICRQQVRILCBbJDJdKSIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWNdKQorTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRNQUdJQ19DTUQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorX0xUX0RFQ0woW10sIFtNQUdJQ19DTURdLCBbMF0sCisJIFtVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiXSlkbmwKK10pIyBfTFRfUEFUSF9UT09MX1BSRUZJWAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX1BBVEhfVE9PTF9QUkVGSVhdLCBbX0xUX1BBVEhfVE9PTF9QUkVGSVhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW10pCisKKworIyBfTFRfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgYSBzaGFyZWQgbGlicmFyeQorbTRfZGVmdW4oW19MVF9QQVRIX01BR0lDXSwKK1tfTFRfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBfTFRfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQorICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCitdKSMgX0xUX1BBVEhfTUFHSUMKKworCisjIExUX1BBVEhfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihbTFRfUEFUSF9MRF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKKworQUNfQVJHX1dJVEgoW2dudS1sZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKKwlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKyAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKKyAgICBbd2l0aF9nbnVfbGQ9bm9dKWRubAorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSAkQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKKyAgICAgIHJlX2RpcmVsdD0nL1tbXi9dXVtbXi9dXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitfTFRfUEFUSF9MRF9HTlUKK0FDX1NVQlNUKFtMRF0pCisKK19MVF9UQUdERUNMKFtdLCBbTERdLCBbMV0sIFtUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzXSkKK10pIyBMVF9QQVRIX0xECisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitBVV9BTElBUyhbQUNfUFJPR19MRF0sIFtMVF9QQVRIX0xEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xEXSwgW10pCisKKworIyBfTFRfUEFUSF9MRF9HTlUKKyMtIC0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BBVEhfTERfR05VXSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCitdKSMgX0xUX1BBVEhfTERfR05VCisKKworIyBfTFRfQ01EX1JFTE9BRAorIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIHJlbG9hZCBmbGFnIGZvciBsaW5rZXIKKyMgICAtLSBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorbTRfZGVmdW4oW19MVF9DTURfUkVMT0FEXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGVsc2UKKyAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBmaQorICAgIDs7Citlc2FjCitfTFRfREVDTChbXSwgW3JlbG9hZF9mbGFnXSwgWzFdLCBbSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlc10pZG5sCitfTFRfREVDTChbXSwgW3JlbG9hZF9jbWRzXSwgWzJdKWRubAorXSkjIF9MVF9DTURfUkVMT0FECisKKworIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19NQUdJQ19NRVRIT0RdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllc10sCitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKK1tsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXhbWzQtOV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qKQorICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgOzsKKworbWluZ3cqIHwgcHczMiopCisgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcsCisgICMgdW5sZXNzIHdlIGZpbmQgJ2ZpbGUnLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcuCisgIGlmICggZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgZmkKKyAgOzsKKworY2VnY2MpCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18RUxGLVtbMC05XV1bWzAtOV1dKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgW2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBQQS1SSVNDIFswLTldLlswLTldJ10KKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251KQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworKm50byogfCAqcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8XC5zb3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBmaQorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3Jkb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBzaWVtZW5zKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgcGMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3RwZiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7Citlc2FjCitdKQorZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCitfTFRfREVDTChbXSwgW2RlcGxpYnNfY2hlY2tfbWV0aG9kXSwgWzFdLAorICAgIFtNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0c10pCitfTFRfREVDTChbXSwgW2ZpbGVfbWFnaWNfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09ICJmaWxlX21hZ2ljIl0pCitdKSMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAorCisKKyMgTFRfUEFUSF9OTQorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIGEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihbTFRfUEFUSF9OTV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pXSwgbHRfY3ZfcGF0aF9OTSwKK1tpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKKyAgZmkKKyAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCisgICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisJY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkgICovZGV2L251bGwqKQorCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCSAgICBicmVhaworCSAgICA7OworCSAgKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIGRvbmUKKyAgOiAke2x0X2N2X3BhdGhfTk09bm99CitmaV0pCitpZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgorICBOTT0iJGx0X2N2X3BhdGhfTk0iCitlbHNlCisgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgorICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbImR1bXBiaW4gLXN5bWJvbHMiICJsaW5rIC1kdW1wIC1zeW1ib2xzIl0sIDopCisgIEFDX1NVQlNUKFtEVU1QQklOXSkKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCitBQ19TVUJTVChbTk1dKQorX0xUX0RFQ0woW10sIFtOTV0sIFsxXSwgW0EgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyXSlkbmwKKworQUNfQ0FDSEVfQ0hFQ0soW3RoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2VdLCBbbHRfY3Zfbm1faW50ZXJmYWNlXSwKKyAgW2x0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGFjX2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiBvdXRwdXRcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgY2F0IGNvbmZ0ZXN0Lm91dCA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCpdKQorXSkjIExUX1BBVEhfTk0KKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQU1fUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK0FVX0FMSUFTKFtBQ19QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX05NXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1BST0dfTk1dLCBbXSkKKworCisjIExUX0xJQl9NCisjIC0tLS0tLS0tCisjIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKFtMVF9MSUJfTV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorTElCTT0KK2Nhc2UgJGhvc3QgaW4KKyotKi1iZW9zKiB8ICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAorICA7OworKi1uY3Itc3lzdjQuMyopCisgIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQorICA7OworKikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFtMSUJNXSkKK10pIyBMVF9MSUJfTQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0NIRUNLX0xJQk1dLCBbTFRfTElCX01dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfTk9fUlRUSV0sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKKyAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQorZmkKK19MVF9UQUdERUNMKFtub19idWlsdGluX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbMV0sCisJW0NvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnNdKQorXSkjIF9MVF9DT01QSUxFUl9OT19SVFRJCisKKworIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKK1sKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW1tCQ0RUXV0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCisgIDs7CitocHV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbW0FCQ0RFR1JTVF1dJworICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbW0JDREVHUVJTVF1dJworICA7Oworc29sYXJpcyopCisgIHN5bWNvZGU9J1tbQkRSVF1dJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgc3ltY29kZT0nW1tBQkRUXV0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW1tERk5TVFVdXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScgOzsKK2VzYWMKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KKyMgU29tZSBzeXN0ZW1zIChlc3AuIG9uIGlhNjQpIGxpbmsgZGF0YSBhbmQgY29kZSBzeW1ib2xzIGRpZmZlcmVudGx5LAorIyBzbyB1c2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChsaWJbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyBbJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAorIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKKyIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKKyIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAorIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCisiICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAorIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCisiICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKKyIgICAgICcgcHJmeD1eJGFjX3N5bXByZnhdIgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbCSBdXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbCSBdXVtbCSBdXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitfTFRfRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmICRHUkVQICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgJEdSRVAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxfTFRfRU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfTFRfRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAgICAgICAqYWRkcmVzczsKK30KK2x0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoZmFpbGVkKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG9rKQorZmkKKworX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfcGlwZV0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwgWzFdLAorICAgIFtUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyIHdoZW4gbGliIHByZWZpeCBpcyBuZWVkZWRdKQorXSkgIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisKKworIyBfTFRfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX1BJQ10sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10pCittNF9pZihbJDFdLCBbQ1hYXSwgWworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFtbNC05XV0qKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCopCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCogfCBrKmJzZCotZ251KQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgZWNwYyogKQorCSAgICAjIG9sZCBJbnRlbCBDKysgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBpY3BjKiApCisJICAgICMgSW50ZWwgQysrLCB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKwkgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKiB8IHBnY3BwKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgIHhsYyogfCB4bEMqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbHlueG9zKikKKwk7OworICAgICAgbTg4ayopCisJOzsKKyAgICAgIG12cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGN4eCopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKikKKwk7OworICAgICAgKnFueCogfCAqbnRvKikKKyAgICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgRGlnaXRhbC9Db21wYXEgQysrCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHBzb3MqKQorCTs7CisgICAgICBzb2xhcmlzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3Vub3M0KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB0YW5kZW0qKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCitdLAorWworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251KQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLS1zaGFyZWQnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctLXN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICB4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xIG9uIFBQQworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctcXN0YXRpY2xpbmsnCisJOzsKKyAgICAgICopCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIDs7CisJKlN1blwgRiopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPScnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKKyAgICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKV0pCitfTFRfVEFHREVDTChbd2xdLCBbbHRfcHJvZ19jb21waWxlcl93bF0sIFsxXSwKKwlbSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlcl0pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpXSwKKyAgICBbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCisgICAgW2Nhc2UgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7CisgICAgIGVzYWNdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQorZmkKK19MVF9UQUdERUNMKFtwaWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFsxXSwKKwlbQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitfTFRfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLAorICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCisgICRsdF90bXBfc3RhdGljX2ZsYWcsCisgIFtdLAorICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCitfTFRfVEFHREVDTChbbGlua19zdGF0aWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZ10pCitdKSMgX0xUX0NPTVBJTEVSX1BJQworCisKKyMgX0xUX0xJTktFUl9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9TSExJQlNdLAorW0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorbTRfaWYoWyQxXSwgW0NYWF0sIFsKKyAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbWzQtOV1dKikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLzsvXi4qW1sgXV1fX25tX18vcy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgOzsKKyAgZXNhYworICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KK10sIFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCisgIF9MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIF9MVF9UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSk9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKiddCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICAjIEV4Y2x1ZGUgc2hhcmVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIHN5bWJvbHMuCitkbmwgTm90ZSBhbHNvIGFkanVzdCBleGNsdWRlX2V4cHN5bXMgZm9yIEMrKyBhYm92ZS4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbWzMtOV1dKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW1tBSVRXXV1bWyBdXS9zLy4qW1sgXV0vLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPQorCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJbGY5NSopCQkJCSMgTGFoZXkgRm9ydHJhbiA4LjEKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKwkgIHRtcF9zaGFyZWRmbGFnPSctLXNoYXJlZCcgOzsKKwl4bFtbY0NdXSopCQkJIyBJQk0gWEwgQyA4LjAgb24gUFBDIChkZWFsIHdpdGggeGxmIGJlbG93KQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1xbWtzaHJvYmonCisJICB0bXBfYWRkZmxhZz0gOzsKKwllc2FjCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJZXNhYworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKyAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgICBmaQorCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgIGZpCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8ICRHUkVQICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cworCSAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKwkgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisJICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKyAgICAgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuICRFQ0hPICJYJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgfCAkWHNlZDsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKwkgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgJEVDSE8gIlgkZGVwbGlicyIgfCAkWHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBfTFRfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKT0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgxMSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAorCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKKwkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgorICAgICAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisgICAgICAgIEFDX0xJTktfSUZFTFNFKGludCBmb28odm9pZCkge30sCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICAgICkKKyAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisgICAgICBlbHNlCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJDb21waWxlcnMgNS4wIiopCisJICB3bGFyYz0nJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwkqKQorCSAgd2xhcmM9JyR7d2x9JworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKyAgICAgICopCisJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCisJIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCisJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJZWxzZQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisJIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisJc25pKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IHgkaG9zdF92ZW5kb3IgPSB4c25pOyB0aGVuCisgICAgICBjYXNlICRob3N0IGluCisgICAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmxhcmdlZHluc3ltJworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCit0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK19MVF9UQUdWQVIod2l0aF9nbnVfbGQsICQxKT0kd2l0aF9nbnVfbGQKKworX0xUX0RFQ0woW10sIFtsaWJleHRdLCBbMF0sIFtPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIildKWRubAorX0xUX0RFQ0woW10sIFtzaHJleHRfY21kc10sIFsxXSwgW1NoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXh0cmFjdF9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQorCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSkKKyAgICAgICRSTSBjb25mdGVzdCoKKyAgICAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKwlwaWNfZmxhZz0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgICAgICAgIGlmIEFDX1RSWV9FVkFMKF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpCisgICAgICAgIHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICBlbHNlCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisgICAgICAgIGZpCisgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkUk0gY29uZnRlc3QqCisgICAgICBBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpXSkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitfTFRfVEFHREVDTChbYnVpbGRfbGlidG9vbF9uZWVkX2xjXSwgW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFthbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXNdLAorICAgIFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zXSkKK19MVF9UQUdERUNMKFtdLCBbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlc10pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX25lZWRzX29iamVjdF0sIFsxXSwKKyAgICBbV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHldKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfY21kc10sIFsyXSwgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisgICAgYSBzaGFyZWQgYXJjaGl2ZS5dKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW3dpdGhfZ251X2xkXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIGFyZSBidWlsZGluZyB3aXRoIEdOVSBsZCBvciBub3RdKQorX0xUX1RBR0RFQ0woW10sIFthbGxvd191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHRdKQorX0xUX1RBR0RFQ0woW10sIFtub191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbRmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisgICAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFsxXSwKKyAgICBbW0lmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeQorICAgIGR1cmluZyBsaW5raW5nLiAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbMV0sCisgICAgW1doZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAiLXJwYXRoIiBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnRdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9kaXJlY3RdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisgICAgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisgICAgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkgYW5kIHRoZSByZXN1bHRpbmcgbGlicmFyeSBkZXBlbmRlbmN5IGlzCisgICAgImFic29sdXRlIiwgaS5lIGltcG9zc2libGUgdG8gY2hhbmdlIGJ5IHNldHRpbmcgJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyAgICBsaWJyYXJ5IGlzIHJlbG9jYXRlZF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX21pbnVzX0xdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisgICAgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisgICAgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2F1dG9tYXRpY10sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSCisgICAgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyAgICBhZ2FpbnN0IGl0XSkKK19MVF9UQUdERUNMKFtdLCBbaW5oZXJpdF9ycGF0aF0sIFswXSwKKyAgICBbU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyAgICB0byBydW50aW1lIHBhdGggbGlzdF0pCitfTFRfVEFHREVDTChbXSwgW2xpbmtfYWxsX2RlcGxpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllc10pCitfTFRfVEFHREVDTChbXSwgW2ZpeF9zcmNmaWxlX3BhdGhdLCBbMV0sCisgICAgW0ZpeCB0aGUgc2hlbGwgdmFyaWFibGUgJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlcl0pCitfTFRfVEFHREVDTChbXSwgW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X3N5bWJvbHNfY21kc10sIFsyXSwKKyAgICBbVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2V4Y2x1ZGVfZXhwc3ltc10sIFsxXSwKKyAgICBbU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2luY2x1ZGVfZXhwc3ltc10sIFsxXSwKKyAgICBbU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkXSkKK19MVF9UQUdERUNMKFtdLCBbcHJlbGlua19jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgcHJvZ3JhbXMgKGFnYWluc3QgbGlicmFyaWVzKSB3aXRoIHRlbXBsYXRlc10pCitfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQorZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCitkbmwgX0xUX1RBR0RFQ0woW10sIFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbMV0sCitkbmwgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkIHNhZmUgb2JqZWN0c10pCitdKSMgX0xUX0xJTktFUl9TSExJQlMKKworCisjIF9MVF9MQU5HX0NfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitsdF9zYXZlX0NDPSIkQ0MiCitBQ19MQU5HX1BVU0goQykKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCitfTFRfVEFHX0NPTVBJTEVSCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQorICBfTFRfQ09NUElMRVJfUElDKCQxKQorICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKyAgTFRfU1lTX0RMT1BFTl9TRUxGCisgIF9MVF9DTURfU1RSSVBMSUIKKworICAjIFJlcG9ydCB3aGljaCBsaWJyYXJ5IHR5cGVzIHdpbGwgYWN0dWFsbHkgYmUgYnVpbHQKKyAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICBjYXNlICRob3N0X29zIGluCisgIGFpeDMqKQorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICBmaQorICAgIDs7CisKKyAgYWl4W1s0LTldXSopCisgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCitBQ19MQU5HX1BPUAorQ0M9IiRsdF9zYXZlX0NDIgorXSkjIF9MVF9MQU5HX0NfQ09ORklHCisKKworIyBfTFRfUFJPR19DWFgKKyMgLS0tLS0tLS0tLS0tCisjIFNpbmNlIEFDX1BST0dfQ1hYIGlzIGJyb2tlbiwgaW4gdGhhdCBpdCByZXR1cm5zIGcrKyBpZiB0aGVyZSBpcyBubyBjKysKKyMgY29tcGlsZXIsIHdlIGhhdmUgb3VyIG93biB2ZXJzaW9uIGhlcmUuCittNF9kZWZ1bihbX0xUX1BST0dfQ1hYXSwKK1sKK3B1c2hkZWYoW0FDX01TR19FUlJPUl0sIFtfbHRfY2F1Z2h0X0NYWF9lcnJvcj15ZXNdKQorQUNfUFJPR19DWFgKK2lmIHRlc3QgLW4gIiRDWFgiICYmICggdGVzdCAiWCRDWFgiICE9ICJYbm8iICYmCisgICAgKCAodGVzdCAiWCRDWFgiID0gIlhnKysiICYmIGBnKysgLXYgPi9kZXYvbnVsbCAyPiYxYCApIHx8CisgICAgKHRlc3QgIlgkQ1hYIiAhPSAiWGcrKyIpKSkgOyB0aGVuCisgIEFDX1BST0dfQ1hYQ1BQCitlbHNlCisgIF9sdF9jYXVnaHRfQ1hYX2Vycm9yPXllcworZmkKK3BvcGRlZihbQUNfTVNHX0VSUk9SXSkKK10pIyBfTFRfUFJPR19DWFgKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19DWFhdLCBbXSkKKworCisjIF9MVF9MQU5HX0NYWF9DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBDKysgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NYWF9DT05GSUddLAorW0FDX1JFUVVJUkUoW19MVF9QUk9HX0NYWF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKKworQUNfTEFOR19QVVNIKEMrKykKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgQysrIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1jcHAKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMrKyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIENYWCBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0naW50IG1haW4oaW50LCBjaGFyICpbW11dKSB7IHJldHVybigwKTsgfScKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9JENDCisgIGx0X3NhdmVfTEQ9JExECisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgR0NDPSRHWFgKKyAgbHRfc2F2ZV93aXRoX2dudV9sZD0kd2l0aF9nbnVfbGQKKyAgbHRfc2F2ZV9wYXRoX0xEPSRsdF9jdl9wYXRoX0xECisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcHJvZ19nbnVfbGRjeHgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfY3ZfcHJvZ19nbnVfbGRjeHgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wcm9nX2dudV9sZAorICBmaQorICBpZiB0ZXN0IC1uICIke2x0X2N2X3BhdGhfTERDWFgrc2V0fSI7IHRoZW4KKyAgICBsdF9jdl9wYXRoX0xEPSRsdF9jdl9wYXRoX0xEQ1hYCisgIGVsc2UKKyAgICAkYXNfdW5zZXQgbHRfY3ZfcGF0aF9MRAorICBmaQorICB0ZXN0IC16ICIke0xEQ1hYK3NldH0iIHx8IExEPSRMRENYWAorICBDQz0ke0NYWC0iYysrIn0KKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorCisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICAjIFdlIGRvbid0IHdhbnQgLWZuby1leGNlcHRpb24gd2hlbiBjb21waWxpbmcgQysrIGNvZGUsIHNvIHNldCB0aGUKKyAgICAjIG5vX2J1aWx0aW5fZmxhZyBzZXBhcmF0ZWx5CisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0nIC1mbm8tYnVpbHRpbicKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9CisgICAgZmkKKworICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAjIFNldCB1cCBkZWZhdWx0IEdOVSBDKysgY29uZmlndXJhdGlvbgorCisgICAgICBMVF9QQVRIX0xECisKKyAgICAgICMgQ2hlY2sgaWYgR05VIEMrKyB1c2VzIEdOVSBsZCBhcyB0aGUgdW5kZXJseWluZyBsaW5rZXIsIHNpbmNlIHRoZQorICAgICAgIyBhcmNoaXZpbmcgY29tbWFuZHMgYmVsb3cgYXNzdW1lIHRoYXQgR05VIGxkIGlzIGJlaW5nIHVzZWQuCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKyAgICAgICAgIyBJZiBhcmNoaXZlX2NtZHMgcnVucyBMRCwgbm90IENDLCB3bGFyYyBzaG91bGQgYmUgZW1wdHkKKyAgICAgICAgIyBYWFggSSB0aGluayB3bGFyYyBjYW4gYmUgZWxpbWluYXRlZCBpbiBsdGNmLWN4eCwgYnV0IEkgbmVlZCB0bworICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZSBpdCBhIGxpdHRsZSBiaXQgbW9yZS4gKE1NKQorICAgICAgICB3bGFyYz0nJHt3bH0nCisKKyAgICAgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgICAgICBpZiBldmFsICJgJENDIC1wcmludC1wcm9nLW5hbWU9bGRgIC0taGVscCAyPiYxIiB8CisJICAkR1JFUCAnbm8td2hvbGUtYXJjaGl2ZScgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgIGVsc2UKKyAgICAgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CisgICAgICAgIGZpCisgICAgICBlbHNlCisgICAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICAgIHdsYXJjPQorCisgICAgICAgICMgQSBnZW5lcmljIGFuZCB2ZXJ5IHNpbXBsZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IGNyZWF0aW9uCisgICAgICAgICMgY29tbWFuZCBmb3IgR05VIEMrKyBmb3IgdGhlIGNhc2Ugd2hlcmUgaXQgdXNlcyB0aGUgbmF0aXZlCisgICAgICAgICMgbGlua2VyLCBpbnN0ZWFkIG9mIEdOVSBsZC4gIElmIHBvc3NpYmxlLCB0aGlzIHNldHRpbmcgc2hvdWxkCisgICAgICAgICMgb3ZlcnJpZGRlbiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlIGxpbmtlciBmZWF0dXJlcyBvbgorICAgICAgICAjIHRoZSBwbGF0Zm9ybSBpdCBpcyBiZWluZyB1c2VkIG9uLgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisgICAgICBmaQorCisgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisKKyAgICBlbHNlCisgICAgICBHWFg9bm8KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgICB3bGFyYz0KKyAgICBmaQorCisgICAgIyBQT1JUTUU6IGZpbGwgaW4gYSBkZXNjcmlwdGlvbiBvZiB5b3VyIHN5c3RlbSdzIEMrKyBsaW5rIGNoYXJhY3RlcmlzdGljcworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgJGNvbXBpbGVyIGxpbmtlciAoJExEKSBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisgICAgICAgICAgIyBPbiBJQTY0LCB0aGUgbGlua2VyIGRvZXMgcnVuIHRpbWUgbGlua2luZyBieSBkZWZhdWx0LCBzbyB3ZSBkb24ndAorICAgICAgICAgICMgaGF2ZSB0byBkbyBhbnl0aGluZyBzcGVjaWFsLgorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1CZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9IiIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9bm8KKworICAgICAgICAgICMgVGVzdCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIHVzZSBydW4gdGltZSBsaW5raW5nIG9yIG5vcm1hbAorICAgICAgICAgICMgQUlYIHN0eWxlIGxpbmtpbmcuIElmIC1icnRsIGlzIHNvbWV3aGVyZSBpbiBMREZMQUdTLCB3ZQorICAgICAgICAgICMgbmVlZCB0byBkbyBydW50aW1lIGxpbmtpbmcuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMjNdXXxhaXg0LltbMjNdXS4qfGFpeFtbNS05XV0qKQorCSAgICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgICAgICBjYXNlICRsZF9mbGFnIGluCisJICAgICAgKi1icnRsKikKKwkgICAgICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgICAgICBicmVhaworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICBleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworICAgICAgICAgIG5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgICAgZmkKKworICAgICAgICAjIFdoZW4gbGFyZ2UgZXhlY3V0YWJsZXMgb3Igc2hhcmVkIG9iamVjdHMgYXJlIGJ1aWx0LCBBSVggbGQgY2FuCisgICAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgICAjIG9yIHByb2dyYW0gcmVzdWx0cyBpbiAiZXJyb3IgVE9DIG92ZXJmbG93IiBhZGQgLW1taW5pbWFsLXRvYyB0bworICAgICAgICAjIENYWEZMQUdTL0NGTEFHUyBmb3IgZysrL2djYy4gIEluIHRoZSBjYXNlcyB3aGVyZSB0aGF0IGlzIG5vdAorICAgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPScnCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPSc6JworICAgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4gYWl4NC5bWzAxMl1dfGFpeDQuW1swMTJdXS4qKQorICAgICAgICAgICMgV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb24gQUlYIDQuMiBhbmQgbG93ZXIsIHRoZSBjaGVjaworICAgICAgICAgICMgYmVsb3cgZm9yIGJyb2tlbiBjb2xsZWN0MiBkb2Vzbid0IHdvcmsgdW5kZXIgNC4zKworCSAgY29sbGVjdDJuYW1lPWAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYAorCSAgaWYgdGVzdCAtZiAiJGNvbGxlY3QybmFtZSIgJiYKKwkgICAgIHN0cmluZ3MgIiRjb2xsZWN0Mm5hbWUiIHwgJEdSRVAgcmVzb2x2ZV9saWJfbmFtZSA+L2Rldi9udWxsCisJICB0aGVuCisJICAgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgICA6CisJICBlbHNlCisJICAgICMgV2UgaGF2ZSBvbGQgY29sbGVjdDIKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgICAjIEl0IGZhaWxzIHRvIGZpbmQgdW5pbnN0YWxsZWQgbGlicmFyaWVzIHdoZW4gdGhlIHVuaW5zdGFsbGVkCisJICAgICMgcGF0aCBpcyBub3QgbGlzdGVkIGluIHRoZSBsaWJwYXRoLiAgU2V0dGluZyBoYXJkY29kZV9taW51c19MCisJICAgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorICAgICAgICAgIGVzYWMKKyAgICAgICAgICBzaGFyZWRfZmxhZz0nLXNoYXJlZCcKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwkgIGZpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAjIG5vdCB1c2luZyBnY2MKKyAgICAgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkgICMgY2hva2VzIG9uIC1XbCwtRy4gVGhlIGZvbGxvd2luZyBsaW5lIGlzIGNvcnJlY3Q6CisJICBzaGFyZWRfZmxhZz0nLUcnCisgICAgICAgICAgZWxzZQorCSAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKwkgICAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgICAgZWxzZQorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1iTTpTUkUnCisJICAgIGZpCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKworICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1iZXhwYWxsJworICAgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICAgIyB1bmRlcnNjb3JlIChfKSwgc28gaXQgaXMgYmV0dGVyIHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBzeW1ib2xzIHRvCisJIyBleHBvcnQuCisgICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9eWVzCisgICAgICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorICAgICAgICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1bnRpbWUgbG9hZGluZyBmbGFncyAoLWJydGwpLAorICAgICAgICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Jy1iZXJvaycKKyAgICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4gZW1wdHkKKyAgICAgICAgICAjIGV4ZWN1dGFibGUuCisgICAgICAgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKyAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKworICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzIGBpZiB0ZXN0ICJ4JHthbGxvd191bmRlZmluZWRfZmxhZ30iICE9ICJ4IjsgdGhlbiAkRUNITyAiWCR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30iIHwgJFhzZWQ7IGVsc2UgOjsgZmlgICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzICRzaGFyZWRfZmxhZyIKKyAgICAgICAgZWxzZQorICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SICRsaWJkaXI6L3Vzci9saWI6L2xpYicKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIteiBub2RlZnMiCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorICAgICAgICAgIGVsc2UKKwkgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICAgICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgICAgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAgICMgV2FybmluZyAtIHdpdGhvdXQgdXNpbmcgdGhlIG90aGVyIHJ1biB0aW1lIGxvYWRpbmcgZmxhZ3MsCisJICAgICMgLWJlcm9rIHdpbGwgbGluayB3aXRob3V0IGVycm9yLCBidXQgbWF5IHByb2R1Y2UgYSBicm9rZW4gbGlicmFyeS4KKwkgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWJlcm9rJworCSAgICAjIEV4cG9ydGVkIHN5bWJvbHMgY2FuIGJlIHB1bGxlZCBpbnRvIHNoYXJlZCBvYmplY3RzIGZyb20gYXJjaGl2ZXMKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT15ZXMKKwkgICAgIyBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IEFJWCB0cmFkaXRpb25hbGx5IGJ1aWxkcyBpdHMgc2hhcmVkCisJICAgICMgbGlicmFyaWVzLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0iXCRDQyAkc2hhcmVkX2ZsYWciJyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICR7d2x9LWJub2VudHJ5ICRjb21waWxlcl9mbGFncyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMke2FsbG93X3VuZGVmaW5lZF9mbGFnfX4kQVIgJEFSX0ZMQUdTICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lJHJlbGVhc2UuYSAkb3V0cHV0X29iamRpci8kc29uYW1lJworICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgICAgIDs7CisKKyAgICAgIGJlb3MqKQorCWlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSAgIyBKb3NlcGggQmVja2VuYmFjaCA8anJiM0BiZXN0LmNvbT4gc2F5cyBzb21lIHJlbGVhc2VzIG9mIGdjYworCSAgIyBzdXBwb3J0IC0tdW5kZWZpbmVkLiAgVGhpcyBkZXNlcnZlcyBzb21lIGludmVzdGlnYXRpb24uICBGSVhNRQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIGNob3J1cyopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgKikKKwkgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAgICMgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSkgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsCisgICAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctTCRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICAgIF9MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPXllcworCisgICAgICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICdhdXRvLWltcG9ydCcgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICAgICAgIyBJZiB0aGUgZXhwb3J0LXN5bWJvbHMgZmlsZSBhbHJlYWR5IGlzIGEgLmRlZiBmaWxlICgxc3QgbGluZQorICAgICAgICAgICMgaXMgRVhQT1JUUyksIHVzZSBpdCBhcyBpczsgb3RoZXJ3aXNlLCBwcmVwZW5kLi4uCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2lmIHRlc3QgInhgJFNFRCAxcSAkZXhwb3J0X3N5bWJvbHNgIiA9IHhFWFBPUlRTOyB0aGVuCisJICAgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKyAgICAgICAgICBlbHNlCisJICAgIGVjaG8gRVhQT1JUUyA+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzID4+ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgICAgIGZpfgorICAgICAgICAgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAgIF9MVF9EQVJXSU5fTElOS0VSX0ZFQVRVUkVTKCQxKQorCTs7CisKKyAgICAgIGRndXgqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGVjKysqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGdoY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgZnJlZWJzZFtbMTJdXSopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgcmVwb3J0ZWQgdG8gYmUgZmFpcmx5IGJyb2tlbiBiZWZvcmUKKwkjIHN3aXRjaCB0byBFTEYKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkLWVsZiopCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICAgICAgICMgRnJlZUJTRCAzIGFuZCBsYXRlciB1c2UgR05VIEMrKyBhbmQgR05VIGxkIHdpdGggc3RhbmRhcmQgRUxGCisgICAgICAgICMgY29udmVudGlvbnMKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgZ251KikKKyAgICAgICAgOzsKKworICAgICAgaHB1eDkqKQorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzICMgTm90IGluIHRoZSBzZWFyY2ggUEFUSCwKKwkJCQkgICAgICAgICAgICAgIyBidXQgYXMgdGhlIGRlZmF1bHQKKwkJCQkgICAgICAgICAgICAgIyBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKyAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICBhQ0MqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1iICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisgICAgICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKyAgICAgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorICAgICAgICAgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKyAgICAgICAgICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGVwZW5kZW5jaWVzLgorICAgICAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRFR1JFUCAiXC1MImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJFJNICRvdXRwdXRfb2JqZGlyLyRzb25hbWV+JENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+dGVzdCAkb3V0cHV0X29iamRpci8kc29uYW1lID0gJGxpYiB8fCBtdiAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWInCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBocHV4MTAqfGhwdXgxMSopCisgICAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworICAgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisJICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICAgICAgaHBwYSo2NCp8aWE2NCopCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgICAgICAgOzsKKyAgICAgICAgICAqKQorICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCQkgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCQkgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGFDQyopCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgaHBwYSo2NCopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgIGlhNjQqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICBlc2FjCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAoJENDIC1iICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxKSB8ICRHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICR3aXRoX2dudV9sZCA9IG5vOyB0aGVuCisJICAgICAgICBjYXNlICRob3N0X2NwdSBpbgorCSAgICAgICAgICBocHBhKjY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgaWE2NCopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICAgICAgICAgIDs7CisJICAgICAgICAgICopCisJICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgIGVzYWMKKwkgICAgICBmaQorCSAgICBlbHNlCisJICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGludGVyaXhbWzMtOV1dKikKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSMgSGFjazogT24gSW50ZXJpeCAzLngsIHdlIGNhbm5vdCBjb21waWxlIFBJQyBiZWNhdXNlIG9mIGEgYnJva2VuIGdjYy4KKwkjIEluc3RlYWQsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGxvYWRlZCBhdCBhbiBpbWFnZSBiYXNlICgweDEwMDAwMDAwIGJ5CisJIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorCSMgY29uc3VtaW5nIGFuZCBmcmFnbWVudGluZyBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgcGljayBhIHJhbmRvbSwKKwkjIDI1NiBLaUItYWxpZ25lZCBpbWFnZSBiYXNlIGJldHdlZW4gMHg1MDAwMDAwMCBhbmQgMHg2RkZDMDAwMCBhdCBsaW5rCisJIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nc2VkICJzLF4sXywiICRleHBvcnRfc3ltYm9scyA+JG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW1+JENDIC1zaGFyZWQgJHBpY19mbGFnICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1oLCRzb25hbWUgJHt3bH0tLXJldGFpbi1zeW1ib2xzLWZpbGUsJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5leHBzeW0gJHt3bH0tLWltYWdlLWJhc2UsYGV4cHIgJHtSQU5ET00tJCR9ICUgNDA5NiAvIDIgXCogMjYyMTQ0ICsgMTM0MjE3NzI4MGAgLW8gJGxpYicKKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBTR0kgQysrCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1hbGwgLW11bHRpZ290ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLWFyIiwgd2hlcmUgIkNDIiBpcyB0aGUgSVJJWCBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1hciAtV1IsLXUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICBlbHNlCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAtbyAkbGliJworCSAgICAgIGZpCisJICAgIGZpCisJICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgICAgX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9eWVzCisgICAgICAgIDs7CisKKyAgICAgIGxpbnV4KiB8IGsqYnNkKi1nbnUpCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgS0NDKikKKwkgICAgIyBLdWNrIGFuZCBBc3NvY2lhdGVzLCBJbmMuIChLQUkpIEMrKyBDb21waWxlcgorCisJICAgICMgS0NDIHdpbGwgb25seSBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBpZiB0aGUgb3V0cHV0IGZpbGUKKwkgICAgIyBlbmRzIHdpdGggIi5zbyIgKG9yICIuc2wiIGZvciBIUC1VWCksIHNvIHJlbmFtZSB0aGUgbGlicmFyeQorCSAgICAjIHRvIGl0cyBwcm9wZXIgbmFtZSAod2l0aCB2ZXJzaW9uKSBhZnRlciBsaW5raW5nLgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0ZW1wZXh0PWBlY2hvICRzaGFyZWRfZXh0IHwgJFNFRCAtZSAnXCcncy9cKFtbXigpMC05QS1aYS16e31dXVwpL1xcXFxcMS9nJ1wnJ2A7IHRlbXBsaWI9YGVjaG8gJGxpYiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9sczsgbXYgXCR0ZW1wbGliICRsaWInCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMSB8ICRHUkVQICJsZCJgOyBybSAtZiBsaWJjb25mdGVzdCRzaGFyZWRfZXh0OyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAtQnN0YXRpYyIsIHdoZXJlICJDQyIgaXMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLUJzdGF0aWMgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKwkgIGljcGMqIHwgZWNwYyogKQorCSAgICAjIEludGVsIEMrKworCSAgICB3aXRoX2dudV9sZD15ZXMKKwkgICAgIyB2ZXJzaW9uIDguMCBhbmQgYWJvdmUgb2YgaWNwYyBjaG9rZSBvbiBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMKKwkgICAgIyBpZiB3ZSBhZGQgJHByZWRlcF9vYmplY3RzIGFuZCAkcG9zdGRlcF9vYmplY3RzLCBob3dldmVyIDcuMSBhbmQKKwkgICAgIyBlYXJsaWVyIGRvIG5vdCBhZGQgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy4KKwkgICAgY2FzZSBgJENDIC1WIDI+JjFgIGluCisJICAgICAgKiJWZXJzaW9uIDcuIiopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCQk7OworCSAgICAgICopICAjIFZlcnNpb24gOC4wIG9yIG5ld2VyCisJICAgICAgICB0bXBfaWR5bj0KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJCSAgaWE2NCopIHRtcF9pZHluPScgLWlfZHluYW1pYyc7OworCQllc2FjCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCciJHRtcF9pZHluIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICAgIDs7CisgICAgICAgICAgcGdDQyogfCBwZ2NwcCopCisgICAgICAgICAgICAjIFBvcnRsYW5kIEdyb3VwIEMrKyBjb21waWxlcgorCSAgICBjYXNlIGAkQ0MgLVZgIGluCisJICAgICpwZ0NDXCBbWzEtNV1dKiB8ICpwZ2NwcFwgW1sxLTVdXSopCisJICAgICAgX0xUX1RBR1ZBUihwcmVsaW5rX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJG9ianMgJGxpYm9ianMgJGNvbXBpbGVfZGVwbGlic34KKwkJY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGAiJworCSAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2xkb2JqcyRvbGRfZGVwbGlic34KKwkJJEFSICRBUl9GTEFHUyAkb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYH4KKwkJJFJBTkxJQiAkb2xkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkY29udmVuaWVuY2UgJHBvc3RkZXBfb2JqZWN0c34KKwkJJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgKikgIyBWZXJzaW9uIDYgd2lsbCB1c2Ugd2VhayBzeW1ib2xzCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIC1vICRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgICAgOzsKKwkgICAgZXNhYworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAgLW4gXCIkY29udlwiICYmIG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworICAgICAgICAgICAgOzsKKwkgIGN4eCopCisJICAgICMgQ29tcGFxIEMrKworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAgLW8gJGxpYiAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scycKKworCSAgICBydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiYDsgdGVtcGxpc3Q9YCRFQ0hPICJYJHRlbXBsaXN0IiB8ICRYc2VkIC1lICJzL1woXi4qbGQuKlwpXCggLipsZCAuKiRcKS9cMS8iYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisJICAgIDs7CisJICB4bCopCisJICAgICMgSUJNIFhMIDguMCBvbiBQUEMsIHdpdGggR05VIGxkCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJICAgIGlmIHRlc3QgIngkc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nIiA9IHh5ZXM7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJY2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQllY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkJJENDIC1xbWtzaHJvYmogJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXZlcnNpb24tc2NyaXB0ICR7d2x9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyIC1vICRsaWInCisJICAgIGZpCisJICAgIDs7CisJICAqKQorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMSB8IHNlZCA1cWAgaW4KKwkgICAgKlN1blwgQyopCisJICAgICAgIyBTdW4gQysrIDUuOQorCSAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBuZXdfY29udmVuaWVuY2U9OyBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0IC16IFwiJGNvbnZcIiB8fCBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCisJICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHNvbWV0aGluZyBiYXNlZCBvbgorCSAgICAgICMgJENDICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAtbyBsaWJjb25mdGVzdCRzaGFyZWRfZXh0IDI+JjEKKwkgICAgICAjIHdvdWxkIGJlIGJldHRlci4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKworCSAgICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBseW54b3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbTg4ayopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgbXZzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBjeHgqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCSAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKwllc2FjCisJOzsKKworICAgICAgbmV0YnNkKikKKyAgICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtQnNoYXJlYWJsZSAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkbGlua2VyX2ZsYWdzJworCSAgd2xhcmM9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJZmkKKwkjIFdvcmthcm91bmQgc29tZSBicm9rZW4gcHJlLTEuNSB0b29sY2hhaW5zCisJb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgY29uZnRlc3QuJG9iamV4dCB8ICRTRUQgLWUgInM6LWxnY2MgLWxjIC1sZ2NjOjoiJworCTs7CisKKyAgICAgICpudG8qIHwgKnFueCopCisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisJOzsKKworICAgICAgb3BlbmJzZDIqKQorICAgICAgICAjIEMrKyBzaGFyZWQgbGlicmFyaWVzIGFyZSBmYWlybHkgYnJva2VuCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCTs7CisKKyAgICAgIG9wZW5ic2QqKQorCWlmIHRlc3QgLWYgL3Vzci9saWJleGVjL2xkLnNvOyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1vICRsaWInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8IGdyZXAgX19FTEZfX2AiIHx8IHRlc3QgIiRob3N0X29zLSRob3N0X2NwdSIgPSAib3BlbmJzZDIuOC1wb3dlcnBjIjsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlLCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9IiR3bGFyYyInLS13aG9sZS1hcmNoaXZlJGNvbnZlbmllbmNlICciJHdsYXJjIictLW5vLXdob2xlLWFyY2hpdmUnCisJICBmaQorCSAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9ZWNobworCWVsc2UKKwkgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwlmaQorCTs7CisKKyAgICAgIG9zZjMqIHwgb3NmNCogfCBvc2Y1KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAiJGxpYiIgfCAkU0VEIC1lICJzL1wke3RlbXBleHR9XC4uKi8uc28vImA7ICRDQyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLS1zb25hbWUgJHNvbmFtZSAtbyBcJHRlbXBsaWI7IG12IFwkdGVtcGxpYiAkbGliJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgdGhlIEtBSSBDKysgY29tcGlsZXIuCisJICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICBvc2YzKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICAgICopIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLW8gJG9sZGxpYiAkb2xkb2JqcycgOzsKKwkgICAgZXNhYworCSAgICA7OworICAgICAgICAgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgY3h4KikKKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisJCTs7CisJICAgICAgKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZX4KKwkgICAgICAgICAgZWNobyAiLWhpZGRlbiI+PiAkbGliLmV4cH4KKwkgICAgICAgICAgJENDIC1zaGFyZWQkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1tc3ltIC1zb25hbWUgJHNvbmFtZSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGlifgorCSAgICAgICAgICAkUk0gJGxpYi5leHAnCisJICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLXJwYXRoICRsaWJkaXInCisJCTs7CisJICAgIGVzYWMKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgImxkIiB8ICRHUkVQIC12ICJsZDoiYDsgdGVtcGxpc3Q9YCRFQ0hPICJYJHRlbXBsaXN0IiB8ICRYc2VkIC1lICJzL1woXi4qbGQuKlwpXCggLipsZC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgb3NmMyopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICAgICopCisJICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tbXN5bSAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCQkgIDs7CisJICAgICAgZXNhYworCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisKKwkgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisKKwkgICAgZWxzZQorCSAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBwc29zKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgOzsKKworICAgICAgc3Vub3M0KikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LngKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBsY2MqKQorCSAgICAjIEx1Y2lkCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBzb2xhcmlzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgU3VuIEMrKyA0LjIsIDUueCBhbmQgQ2VudGVybGluZSBDKysKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsJDEpPXllcworCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtemRlZnMnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICAtaCRzb25hbWUgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAgICAgJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gJHt3bH0tTSAke3dsfSRsaWIuZXhwIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIHNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJICAgICAgKikKKwkJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkJIyBidXQgdW5kZXJzdGFuZHMgYC16IGxpbmtlcl9mbGFnJy4KKwkgICAgICAgICMgU3VwcG9ydGVkIHNpbmNlIFNvbGFyaXMgMi42IChtYXliZSAyLjUuMT8pCisJCV9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nLXogYWxsZXh0cmFjdCRjb252ZW5pZW5jZSAteiBkZWZhdWx0ZXh0cmFjdCcKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisKKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J2VjaG8nCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC14YXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBTdW4gQysrIGNvbXBpbGVyLiAgVGhpcyBpcworCSAgICAjIG5lY2Vzc2FyeSB0byBtYWtlIHN1cmUgaW5zdGFudGlhdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKKwkgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAteGFyIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgZ2N4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCisJICAgICMgVGhlIEMrKyBjb21waWxlciBtdXN0IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDICRMREZMQUdTIC1hcmNoaXZlIC1vICRvbGRsaWIgJG9sZG9ianMnCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBHTlUgQysrIGNvbXBpbGVyIHdpdGggU29sYXJpcyBsaW5rZXIKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0teiAke3dsfWRlZnMnCisJICAgICAgaWYgJENDIC0tdmVyc2lvbiB8ICRHUkVQIC12ICdeMlwuNycgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkTERGTEFHUyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCQkgICRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJcLUwiJworCSAgICAgIGVsc2UKKwkgICAgICAgICMgZysrIDIuNyBhcHBlYXJzIHRvIHJlcXVpcmUgYC1HJyBOT1QgYC1zaGFyZWQnIG9uIHRoaXMKKwkgICAgICAgICMgcGxhdGZvcm0uCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1HIC1ub3N0ZGxpYiAke3dsfS1NICR3bCRsaWIuZXhwIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICAgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSckQ0MgLUcgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKwkgICAgICBmaQorCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJHdsJGxpYmRpcicKKwkgICAgICBjYXNlICRob3N0X29zIGluCisJCXNvbGFyaXMyLltbMC01XV0gfCBzb2xhcmlzMi5bWzAtNV1dLiopIDs7CisJCSopCisJCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJCSAgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgQ0MqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorCSMgTm90ZTogV2UgY2FuIE5PVCB1c2UgLXogZGVmcyBhcyB3ZSBtaWdodCBkZXNpcmUsIGJlY2F1c2Ugd2UgZG8gbm90CisJIyBsaW5rIHdpdGggLWxjLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSBhbnkgc3ltYm9scyB1c2VkIGZyb20gbGliYyB0bworCSMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorCSMgZXZlciBsaW5rIGNvcnJlY3RseS4gIElmIHdlJ3JlIG5vdCB1c2luZyBHTlUgbGQgd2UgdXNlIC16IHRleHQKKwkjIHRob3VnaCwgd2hpY2ggZG9lcyBjYXRjaCBzb21lIGJhZCBzeW1ib2xzIGJ1dCBpc24ndCBhcyBoZWF2eS1oYW5kZWQKKwkjIGFzIC16IGRlZnMuCisJX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LHRleHQnCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScke3dsfS16LG5vZGVmcycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1SLCRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisJX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmV4cG9ydCcKKwlydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKwljYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJICAqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgIDs7CisJZXNhYworICAgICAgOzsKKworICAgICAgdGFuZGVtKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHZ4d29ya3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworICAgIGVzYWMKKworICAgIEFDX01TR19SRVNVTFQoWyRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpXSkKKyAgICB0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkR1hYIgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX1NZU19ISURERU5fTElCREVQUygkMSkKKyAgICBfTFRfQ09NUElMRVJfUElDKCQxKQorICAgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgICAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgICAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgICAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgICBfTFRfQ09ORklHKCQxKQorICBmaSAjIHRlc3QgLW4gIiRjb21waWxlciIKKworICBDQz0kbHRfc2F2ZV9DQworICBMRENYWD0kTEQKKyAgTEQ9JGx0X3NhdmVfTEQKKyAgR0NDPSRsdF9zYXZlX0dDQworICB3aXRoX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorICBsdF9jdl9wYXRoX0xEQ1hYPSRsdF9jdl9wYXRoX0xECisgIGx0X2N2X3BhdGhfTEQ9JGx0X3NhdmVfcGF0aF9MRAorICBsdF9jdl9wcm9nX2dudV9sZGN4eD0kbHRfY3ZfcHJvZ19nbnVfbGQKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9JGx0X3NhdmVfd2l0aF9nbnVfbGQKK2ZpICMgdGVzdCAiJF9sdF9jYXVnaHRfQ1hYX2Vycm9yIiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19DWFhfQ09ORklHCisKKworIyBfTFRfU1lTX0hJRERFTl9MSUJERVBTKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpZ3VyZSBvdXQgImhpZGRlbiIgbGlicmFyeSBkZXBlbmRlbmNpZXMgZnJvbSB2ZXJib3NlCisjIGNvbXBpbGVyIG91dHB1dCB3aGVuIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKyMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK200X2RlZnVuKFtfTFRfU1lTX0hJRERFTl9MSUJERVBTXSwKK1ttNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKKyMgRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdCBiZWluZyBsaW5rZWQ6CitfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPQorX0xUX1RBR1ZBUihwcmVkZXBzLCAkMSk9CitfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9CitfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPQorCitkbmwgd2UgY2FuJ3QgdXNlIHRoZSBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUgaGVyZSwKK2RubCBiZWNhdXNlIGl0IGNvbnRhaW5zIGNvZGUgaW50ZW5kZWQgZm9yIGFuIGV4ZWN1dGFibGUsCitkbmwgbm90IGEgbGlicmFyeS4gIEl0J3MgcG9zc2libGUgd2Ugc2hvdWxkIGxldCBlYWNoCitkbmwgdGFnIGRlZmluZSBhIG5ldyBsdF8/Pz8/X2xpbmtfdGVzdF9jb2RlIHZhcmlhYmxlLAorZG5sIGJ1dCBpdCdzIG9ubHkgdXNlZCBoZXJlLi4uCittNF9pZihbJDFdLCBbXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitpbnQgYTsKK3ZvaWQgZm9vICh2b2lkKSB7IGEgPSAwOyB9CitfTFRfRU9GCitdLCBbJDFdLCBbQ1hYXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitjbGFzcyBGb28KK3sKK3B1YmxpYzoKKyAgRm9vICh2b2lkKSB7IGEgPSAwOyB9Citwcml2YXRlOgorICBpbnQgYTsKK307CitfTFRfRU9GCitdLCBbJDFdLCBbRjc3XSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlcio0IGEKKyAgICAgIGE9MAorICAgICAgcmV0dXJuCisgICAgICBlbmQKK19MVF9FT0YKK10sIFskMV0sIFtGQ10sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorICAgICAgc3Vicm91dGluZSBmb28KKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorX0xUX0VPRgorXSwgWyQxXSwgW0dDSl0sIFtjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorcHVibGljIGNsYXNzIGZvbyB7CisgIHByaXZhdGUgaW50IGE7CisgIHB1YmxpYyB2b2lkIGJhciAodm9pZCkgeworICAgIGEgPSAwOworICB9Cit9OworX0xUX0VPRgorXSkKK2RubCBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKK2RubCBvYmplY3RzLCBsaWJyYXJpZXMgYW5kIGxpYnJhcnkgZmxhZ3MuCitpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAjIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorICAjIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KKworICAjIFNlbnRpbmVsIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYmVmb3JlCisgICMgdGhlIGNvbmZ0ZXN0IG9iamVjdCBmaWxlLgorICBwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lPW5vCisKKyAgZm9yIHAgaW4gYGV2YWwgIiRvdXRwdXRfdmVyYm9zZV9saW5rX2NtZCJgOyBkbworICAgIGNhc2UgJHAgaW4KKworICAgIC1MKiB8IC1SKiB8IC1sKikKKyAgICAgICAjIFNvbWUgY29tcGlsZXJzIHBsYWNlIHNwYWNlIGJldHdlZW4gIi17TCxSfSIgYW5kIHRoZSBwYXRoLgorICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZS4KKyAgICAgICBpZiB0ZXN0ICRwID0gIi1MIiB8fAorICAgICAgICAgIHRlc3QgJHAgPSAiLVIiOyB0aGVuCisJIHByZXY9JHAKKwkgY29udGludWUKKyAgICAgICBlbHNlCisJIHByZXY9CisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGNhc2UgJHAgaW4KKwkgLUwqIHwgLVIqKQorCSAgICMgSW50ZXJuYWwgY29tcGlsZXIgbGlicmFyeSBwYXRocyBzaG91bGQgY29tZSBhZnRlciB0aG9zZQorCSAgICMgcHJvdmlkZWQgdGhlIHVzZXIuICBUaGUgcG9zdGRlcHMgYWxyZWFkeSBjb21lIGFmdGVyIHRoZQorCSAgICMgdXNlciBzdXBwbGllZCBsaWJzIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvY2VzcyB0aGVtLgorCSAgIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpIjsgdGhlbgorCSAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtwcmV2fSR7cH0iCisJICAgZWxzZQorCSAgICAgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKT0iJHtfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpfSAke3ByZXZ9JHtwfSIKKwkgICBmaQorCSAgIDs7CisJICMgVGhlICItbCIgY2FzZSB3b3VsZCBuZXZlciBjb21lIGJlZm9yZSB0aGUgb2JqZWN0IGJlaW5nCisJICMgbGlua2VkLCBzbyBkb24ndCBib3RoZXIgaGFuZGxpbmcgdGhpcyBjYXNlLgorCSBlc2FjCisgICAgICAgZWxzZQorCSBpZiB0ZXN0IC16ICIkX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtwcmV2fSR7cH0iCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSk9IiR7X0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpfSAke3ByZXZ9JHtwfSIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqLiRvYmpleHQpCisgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBvYmplY3QgZmlsZSBvbmx5IHNob3dzIHVwCisgICAgICAgIyBvbmNlIGluIHRoZSBjb21waWxlciBvdXRwdXQuCisgICAgICAgaWYgdGVzdCAiJHAiID0gImNvbmZ0ZXN0LiRvYmpleHQiOyB0aGVuCisJIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9eWVzCisJIGNvbnRpbnVlCisgICAgICAgZmkKKworICAgICAgIGlmIHRlc3QgIiRwcmVfdGVzdF9vYmplY3RfZGVwc19kb25lIiA9IG5vOyB0aGVuCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkcCIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpIjsgdGhlbgorCSAgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkgJHAiCisJIGZpCisgICAgICAgZmkKKyAgICAgICA7OworCisgICAgKikgOzsgIyBJZ25vcmUgdGhlIHJlc3QuCisKKyAgICBlc2FjCisgIGRvbmUKKworICAjIENsZWFuIHVwLgorICBybSAtZiBhLm91dCBhLmV4ZQorZWxzZQorICBlY2hvICJsaWJ0b29sLm00OiBlcnJvcjogcHJvYmxlbSBjb21waWxpbmcgJDEgdGVzdCBwcm9ncmFtIgorZmkKKworJFJNIC1mIGNvbmZlc3QuJG9iamV4dAorCisjIFBPUlRNRTogb3ZlcnJpZGUgYWJvdmUgdGVzdCBvbiBzeXN0ZW1zIHdoZXJlIGl0IGlzIGJyb2tlbgorbTRfaWYoWyQxXSwgW0NYWF0sCitbY2FzZSAkaG9zdF9vcyBpbgoraW50ZXJpeFtbMy05XV0qKQorICAjIEludGVyaXggMy41IGluc3RhbGxzIGNvbXBsZXRlbHkgaG9zZWQgLmxhIGZpbGVzIGZvciBDKyssIHNvIHJhdGhlciB0aGFuCisgICMgaGFjayBhbGwgYXJvdW5kIGl0LCBsZXQncyBqdXN0IHRydXN0ICJnKysiIHRvIERUUlQuCisgIF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsJDEpPQorICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPQorICA7OworCitsaW51eCopCisgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorICAqU3VuXCBDKikKKyAgICAjIFN1biBDKysgNS45CisKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7CisKK3NvbGFyaXMqKQorICBjYXNlICRjY19iYXNlbmFtZSBpbgorICBDQyopCisgICAgIyBUaGUgbW9yZSBzdGFuZGFyZHMtY29uZm9ybWluZyBzdGxwb3J0NCBsaWJyYXJ5IGlzCisgICAgIyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgQ3N0ZCBsaWJyYXJ5LiBBdm9pZCBzcGVjaWZ5aW5nCisgICAgIyBpdCBpZiBpdCdzIGluIENYWEZMQUdTLiBJZ25vcmUgbGliQ3J1biBhcworICAgICMgLWxpYnJhcnk9c3RscG9ydDQgZGVwZW5kcyBvbiBpdC4KKyAgICBjYXNlICIgJENYWCAkQ1hYRkxBR1MgIiBpbgorICAgICoiIC1saWJyYXJ5PXN0bHBvcnQ0ICIqKQorICAgICAgc29sYXJpc191c2Vfc3RscG9ydDQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKworICAgICMgQWRkaW5nIHRoaXMgcmVxdWlyZXMgYSBrbm93bi1nb29kIHNldHVwIG9mIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisgICAgIyBTdW4gY29tcGlsZXIgdmVyc2lvbnMgYmVmb3JlIDUuNiwgZWxzZSBQSUMgb2JqZWN0cyBmcm9tIGFuIG9sZAorICAgICMgYXJjaGl2ZSB3aWxsIGJlIGxpbmtlZCBpbnRvIHRoZSBvdXRwdXQsIGxlYWRpbmcgdG8gc3VidGxlIGJ1Z3MuCisgICAgaWYgdGVzdCAiJHNvbGFyaXNfdXNlX3N0bHBvcnQ0IiAhPSB5ZXM7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIocG9zdGRlcHMsJDEpPSctbGlicmFyeT1Dc3RkIC1saWJyYXJ5PUNydW4nCisgICAgZmkKKyAgICA7OworICBlc2FjCisgIDs7Citlc2FjCitdKQorCitjYXNlICIgJF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKSAiIGluCisqIiAtbGMgIiopIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubyA7OworZXNhYworIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9CitpZiB0ZXN0IC1uICIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IjsgdGhlbgorIF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzLCAkMSk9YGVjaG8gIiAke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9IiB8ICR7U0VEfSAtZSAncyEgLUwhICFnJyAtZSAncyFeICEhJ2AKK2ZpCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX2xpYl9zZWFyY2hfZGlyc10sIFsxXSwKKyAgICBbVGhlIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGJ5IHRoaXMgY29tcGlsZXIgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcHJlZGVwX29iamVjdHNdLCBbMV0sCisgICAgW0RlcGVuZGVuY2llcyB0byBwbGFjZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvYmplY3RzIGJlaW5nIGxpbmtlZCB0bworICAgIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5XSkKK19MVF9UQUdERUNMKFtdLCBbcG9zdGRlcF9vYmplY3RzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwc10sIFsxXSkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoXSwgWzFdLAorICAgIFtUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvbXBpbGVyIHdoZW4gbGlua2luZworICAgIGEgc2hhcmVkIGxpYnJhcnldKQorXSkjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMKKworCisjIF9MVF9QUk9HX0Y3NworIyAtLS0tLS0tLS0tLS0KKyMgU2luY2UgQUNfUFJPR19GNzcgaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZworIyBpZiB0aGVyZSBpcyBubyBmb3J0cmFuIGNvbXBpbGVyLCB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBoZXJlLgorbTRfZGVmdW4oW19MVF9QUk9HX0Y3N10sCitbCitwdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2Rpc2FibGVfRjc3PXllc10pCitBQ19QUk9HX0Y3NworaWYgdGVzdCAteiAiJEY3NyIgfHwgdGVzdCAiWCRGNzciID0gIlhubyI7IHRoZW4KKyAgX2x0X2Rpc2FibGVfRjc3PXllcworZmkKK3BvcGRlZihbQUNfTVNHX0VSUk9SXSkKK10pIyBfTFRfUFJPR19GNzcKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19GNzddLCBbXSkKKworCisjIF9MVF9MQU5HX0Y3N19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIDc3IGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GNzdfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtfTFRfUFJPR19GNzddKWRubAorQUNfTEFOR19QVVNIKEZvcnRyYW4gNzcpCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmNzcgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWYKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGY3NyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEY3NyBjb21waWxlciBpc24ndCB3b3JraW5nLiAgU29tZSB2YXJpYWJsZXMgKGxpa2UgZW5hYmxlX3NoYXJlZCkKKyMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIGFwcGx5IHRvIGFsbCBjb21waWxlcnMgb24gdGhpcyBwbGF0Zm9ybSwKKyMgYW5kIHdpbGwgYmUgY29ycnVwdGVkIGJ5IHNldHRpbmcgdGhlbSBiYXNlZCBvbiBhIG5vbi13b3JraW5nIGNvbXBpbGVyLgoraWYgdGVzdCAiJF9sdF9kaXNhYmxlX0Y3NyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBDQz0ke0Y3Ny0iZjc3In0KKyAgY29tcGlsZXI9JENDCisgIF9MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKKyAgX0xUX0NDX0JBU0VOQU1FKFskY29tcGlsZXJdKQorICBHQ0M9JEc3NworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJEc3NyIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXMKKworQUNfTEFOR19QT1AKK10pIyBfTFRfTEFOR19GNzdfQ09ORklHCisKKworIyBfTFRfUFJPR19GQworIyAtLS0tLS0tLS0tLQorIyBTaW5jZSBBQ19QUk9HX0ZDIGlzIGJyb2tlbiwgaW4gdGhhdCBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcKKyMgaWYgdGhlcmUgaXMgbm8gZm9ydHJhbiBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KK200X2RlZnVuKFtfTFRfUFJPR19GQ10sCitbCitwdXNoZGVmKFtBQ19NU0dfRVJST1JdLCBbX2x0X2Rpc2FibGVfRkM9eWVzXSkKK0FDX1BST0dfRkMKK2lmIHRlc3QgLXogIiRGQyIgfHwgdGVzdCAiWCRGQyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GQz15ZXMKK2ZpCitwb3BkZWYoW0FDX01TR19FUlJPUl0pCitdKSMgX0xUX1BST0dfRkMKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtfTFRfUFJPR19GQ10sIFtdKQorCisKKyMgX0xUX0xBTkdfRkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgYSBGb3J0cmFuIGNvbXBpbGVyIGFyZQorIyBzdWl0YWJseSBkZWZpbmVkLiAgVGhlc2UgdmFyaWFibGVzIGFyZSBzdWJzZXF1ZW50bHkgdXNlZCBieSBfTFRfQ09ORklHCisjIHRvIHdyaXRlIHRoZSBjb21waWxlciBjb25maWd1cmF0aW9uIHRvIGBsaWJ0b29sJy4KK200X2RlZnVuKFtfTFRfTEFOR19GQ19DT05GSUddLAorW0FDX1JFUVVJUkUoW19MVF9QUk9HX0ZDXSlkbmwKK0FDX0xBTkdfUFVTSChGb3J0cmFuKQorCitfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KK19MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KK19MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCitfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworX0xUX1RBR1ZBUihtb2R1bGVfY21kcywgJDEpPQorX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXVua25vd24KK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCitfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgZmMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PSR7YWNfZmNfc3JjZXh0LWZ9CisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBmYyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgTm8gc2Vuc2UgaW4gcnVubmluZyBhbGwgdGhlc2UgdGVzdHMgaWYgd2UgYWxyZWFkeSBkZXRlcm1pbmVkIHRoYXQKKyMgdGhlIEZDIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9IlwKKyAgICAgIHN1YnJvdXRpbmUgdAorICAgICAgcmV0dXJuCisgICAgICBlbmQKKyIKKworICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworICBsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IlwKKyAgICAgIHByb2dyYW0gdAorICAgICAgZW5kCisiCisKKyAgIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorICBfTFRfVEFHX0NPTVBJTEVSCisKKyAgIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKKyAgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisgIF9MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworICAjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorICBsdF9zYXZlX0NDPSIkQ0MiCisgIGx0X3NhdmVfR0NDPSRHQ0MKKyAgQ0M9JHtGQy0iZjk1In0KKyAgY29tcGlsZXI9JENDCisgIEdDQz0kYWNfY3ZfZmNfY29tcGlsZXJfZ251CisKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgIEFDX01TR19DSEVDS0lORyhbaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICBBQ19NU0dfUkVTVUxUKFskY2FuX2J1aWxkX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgICAgdGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyAgICAjIE9uIEFJWCwgc2hhcmVkIGxpYnJhcmllcyBhbmQgc3RhdGljIGxpYnJhcmllcyB1c2UgdGhlIHNhbWUgbmFtZXNwYWNlLCBhbmQKKyAgICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisgICAgICAgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgICAgICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgICAgIHBvc3RpbnN0YWxsX2NtZHM9JyRSQU5MSUIgJGxpYicKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGFpeFtbNC05XV0qKQorCWlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NCAmJiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSBubyA7IHRoZW4KKwkgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyAmJiBlbmFibGVfc3RhdGljPW5vCisJZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAgICMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgorICAgIHRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IHllcyB8fCBlbmFibGVfc3RhdGljPXllcworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRhY19jdl9mY19jb21waWxlcl9nbnUiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIEdDQz0kbHRfc2F2ZV9HQ0MKKyAgQ0M9IiRsdF9zYXZlX0NDIgorZmkgIyB0ZXN0ICIkX2x0X2Rpc2FibGVfRkMiICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0ZDX0NPTkZJRworCisKKyMgX0xUX0xBTkdfR0NKX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgR05VIEphdmEgQ29tcGlsZXIgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0dDSl9DT05GSUddLAorW0FDX1JFUVVJUkUoW0xUX1BST0dfR0NKXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgSmF2YSB0ZXN0IHNvdXJjZXMuCithY19leHQ9amF2YQorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgSmF2YSB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImNsYXNzIGZvbyB7fSIKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKK2x0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0ncHVibGljIGNsYXNzIGNvbmZ0ZXN0IHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW1tdXSBhcmd2KSB7fTsgfScKKworIyBsdG1haW4gb25seSB1c2VzICRDQyBmb3IgdGFnZ2VkIGNvbmZpZ3VyYXRpb25zIHNvIG1ha2Ugc3VyZSAkQ0MgaXMgc2V0LgorX0xUX1RBR19DT01QSUxFUgorCisjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCitfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitsdF9zYXZlX0NDPSIkQ0MiCitsdF9zYXZlX0dDQz0kR0NDCitHQ0M9eWVzCitDQz0ke0dDSi0iZ2NqIn0KK2NvbXBpbGVyPSRDQworX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyMgR0NKIGRpZCBub3QgZXhpc3QgYXQgdGhlIHRpbWUgR0NDIGRpZG4ndCBpbXBsaWNpdGx5IGxpbmsgbGliYyBpbi4KK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworCitpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9OT19SVFRJKCQxKQorICBfTFRfQ09NUElMRVJfUElDKCQxKQorICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgX0xUX0xJTktFUl9TSExJQlMoJDEpCisgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKKworQUNfTEFOR19SRVNUT1JFCisKK0dDQz0kbHRfc2F2ZV9HQ0MKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBfTFRfTEFOR19HQ0pfQ09ORklHCisKKworIyBfTFRfTEFOR19SQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciB0aGUgV2luZG93cyByZXNvdXJjZSBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfUkNfQ09ORklHXSwKK1tBQ19SRVFVSVJFKFtMVF9QUk9HX1JDXSlkbmwKK0FDX0xBTkdfU0FWRQorCisjIFNvdXJjZSBmaWxlIGV4dGVuc2lvbiBmb3IgUkMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PXJjCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBSQyB0ZXN0IHNvdXJjZXMuCitvYmpleHQ9bworX0xUX1RBR1ZBUihvYmpleHQsICQxKT0kb2JqZXh0CisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCitsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9J3NhbXBsZSBNRU5VIHsgTUVOVUlURU0gIiZTb3VwIiwgMTAwLCBDSEVDS0VEIH0nCisKKyMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCitsdF9zaW1wbGVfbGlua190ZXN0X2NvZGU9IiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiCisKKyMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KK19MVF9UQUdfQ09NUElMRVIKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorbHRfc2F2ZV9DQz0iJENDIgorbHRfc2F2ZV9HQ0M9JEdDQworR0NDPQorQ0M9JHtSQy0id2luZHJlcyJ9Citjb21waWxlcj0kQ0MKK19MVF9UQUdWQVIoY29tcGlsZXIsICQxKT0kQ0MKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKK19MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKworaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICA6CisgIF9MVF9DT05GSUcoJDEpCitmaQorCitHQ0M9JGx0X3NhdmVfR0NDCitBQ19MQU5HX1JFU1RPUkUKK0NDPSIkbHRfc2F2ZV9DQyIKK10pIyBfTFRfTEFOR19SQ19DT05GSUcKKworCisjIExUX1BST0dfR0NKCisjIC0tLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19HQ0pdLAorW200X2lmZGVmKFtBQ19QUk9HX0dDSl0sIFtBQ19QUk9HX0dDSl0sCisgIFttNF9pZmRlZihbQV1bTV9QUk9HX0dDSl0sIFtBXVtNX1BST0dfR0NKXSwKKyAgICBbQUNfQ0hFQ0tfVE9PTChHQ0osIGdjaiwpCisgICAgICB0ZXN0ICJ4JHtHQ0pGTEFHUytzZXR9IiA9IHhzZXQgfHwgR0NKRkxBR1M9Ii1nIC1PMiIKKyAgICAgIEFDX1NVQlNUKEdDSkZMQUdTKV0pXSlbXWRubAorXSkKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX0dDSl0sIFtMVF9QUk9HX0dDSl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfR0NKXSwgW10pCisKKworIyBMVF9QUk9HX1JDCisjIC0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9QUk9HX1JDXSwKK1tBQ19DSEVDS19UT09MKFJDLCB3aW5kcmVzLCkKK10pCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19SQ10sIFtMVF9QUk9HX1JDXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19SQ10sIFtdKQorCisKKyMgX0xUX0RFQ0xfRUdSRVAKKyMgLS0tLS0tLS0tLS0tLS0KKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBlbm91Z2ggQXV0b2NvbmYgdG8gY2hvb3NlIHRoZSBiZXN0IGdyZXAKKyMgYXZhaWxhYmxlLCBjaG9vc2UgdGhlIG9uZSBmaXJzdCBpbiB0aGUgdXNlcidzIFBBVEguCittNF9kZWZ1bihbX0xUX0RFQ0xfRUdSRVBdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfRUdSRVBdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19GR1JFUF0pZG5sCit0ZXN0IC16ICIkR1JFUCIgJiYgR1JFUD1ncmVwCitfTFRfREVDTChbXSwgW0dSRVBdLCBbMV0sIFtBIGdyZXAgcHJvZ3JhbSB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lc10pCitfTFRfREVDTChbXSwgW0VHUkVQXSwgWzFdLCBbQW4gRVJFIG1hdGNoZXJdKQorX0xUX0RFQ0woW10sIFtGR1JFUF0sIFsxXSwgW0EgbGl0ZXJhbCBzdHJpbmcgbWF0Y2hlcl0pCitkbmwgTm9uLWJsZWVkaW5nLWVkZ2UgYXV0b2NvbmYgZG9lc24ndCBzdWJzdCBHUkVQLCBzbyBkbyBpdCBoZXJlIHRvbworQUNfU1VCU1QoW0dSRVBdKQorXSkKKworCisjIF9MVF9ERUNMX09CSkRVTVAKKyMgLS0tLS0tLS0tLS0tLS0KKyMgSWYgd2UgZG9uJ3QgaGF2ZSBhIG5ldyBlbm91Z2ggQXV0b2NvbmYgdG8gY2hvb3NlIHRoZSBiZXN0IG9iamR1bXAKKyMgYXZhaWxhYmxlLCBjaG9vc2UgdGhlIG9uZSBmaXJzdCBpbiB0aGUgdXNlcidzIFBBVEguCittNF9kZWZ1bihbX0xUX0RFQ0xfT0JKRFVNUF0sCitbQUNfQ0hFQ0tfVE9PTChPQkpEVU1QLCBvYmpkdW1wLCBmYWxzZSkKK3Rlc3QgLXogIiRPQkpEVU1QIiAmJiBPQkpEVU1QPW9iamR1bXAKK19MVF9ERUNMKFtdLCBbT0JKRFVNUF0sIFsxXSwgW0FuIG9iamVjdCBzeW1ib2wgZHVtcGVyXSkKK0FDX1NVQlNUKFtPQkpEVU1QXSkKK10pCisKKworIyBfTFRfREVDTF9TRUQKKyMgLS0tLS0tLS0tLS0tCisjIENoZWNrIGZvciBhIGZ1bGx5LWZ1bmN0aW9uYWwgc2VkIHByb2dyYW0sIHRoYXQgdHJ1bmNhdGVzCisjIGFzIGZldyBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlLiAgUHJlZmVyIEdOVSBzZWQgaWYgZm91bmQuCittNF9kZWZ1bihbX0xUX0RFQ0xfU0VEXSwKK1tBQ19QUk9HX1NFRAordGVzdCAteiAiJFNFRCIgJiYgU0VEPXNlZAorWHNlZD0iJFNFRCAtZSAxcy9eWC8vIgorX0xUX0RFQ0woW10sIFtTRURdLCBbMV0sIFtBIHNlZCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKK19MVF9ERUNMKFtdLCBbWHNlZF0sIFsiXCRTRUQgLWUgMXMvXlgvLyJdLAorICAgIFtTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbl0pCitdKSMgX0xUX0RFQ0xfU0VECisKK200X2lmbmRlZihbQUNfUFJPR19TRURdLCBbCisjIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKKyMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIworIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCisjICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKworbTRfZGVmdW4oW0FDX1BST0dfU0VEXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9TRUQsCitbIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBzZWQgYW5kIGdzZWQuCisjIFRoZW4gdXNlIHRoYXQgbGlzdCBvZiBzZWQncyBhcyBvbmVzIHRvIHRlc3QgZm9yIHRydW5jYXRpb24uCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGZvciBsdF9hY19wcm9nIGluIHNlZCBnc2VkOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgaWYgJGFzX2V4ZWN1dGFibGVfcCAiJGFzX2Rpci8kbHRfYWNfcHJvZyRhY19leGVjX2V4dCI7IHRoZW4KKyAgICAgICAgbHRfYWNfc2VkX2xpc3Q9IiRsdF9hY19zZWRfbGlzdCAkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IgorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK2RvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKK2x0X2FjX21heD0wCitsdF9hY19jb3VudD0wCisjIEFkZCAvdXNyL3hwZzQvYmluL3NlZCBhcyBpdCBpcyB0eXBpY2FsbHkgZm91bmQgb24gU29sYXJpcworIyBhbG9uZyB3aXRoIC9iaW4vc2VkIHRoYXQgdHJ1bmNhdGVzIG91dHB1dC4KK2ZvciBsdF9hY19zZWQgaW4gJGx0X2FjX3NlZF9saXN0IC91c3IveHBnNC9iaW4vc2VkOyBkbworICB0ZXN0ICEgLWYgJGx0X2FjX3NlZCAmJiBjb250aW51ZQorICBjYXQgL2Rldi9udWxsID4gY29uZnRlc3QuaW4KKyAgbHRfYWNfY291bnQ9MAorICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+Y29uZnRlc3QuaW4KKyAgIyBDaGVjayBmb3IgR05VIHNlZCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorICBpZiAiJGx0X2FjX3NlZCIgLS12ZXJzaW9uIDI+JjEgPCAvZGV2L251bGwgfCBncmVwICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGJyZWFrCisgIGZpCisgIHdoaWxlIHRydWU7IGRvCisgICAgY2F0IGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LmluID5jb25mdGVzdC50bXAKKyAgICBtdiBjb25mdGVzdC50bXAgY29uZnRlc3QuaW4KKyAgICBjcCBjb25mdGVzdC5pbiBjb25mdGVzdC5ubAorICAgIGVjaG8gPj5jb25mdGVzdC5ubAorICAgICRsdF9hY19zZWQgLWUgJ3MvYSQvLycgPCBjb25mdGVzdC5ubCA+Y29uZnRlc3Qub3V0IHx8IGJyZWFrCisgICAgY21wIC1zIGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5ubCB8fCBicmVhaworICAgICMgMTAwMDAgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGx0X2FjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICAgIGx0X2FjX2NvdW50PWBleHByICRsdF9hY19jb3VudCArIDFgCisgICAgaWYgdGVzdCAkbHRfYWNfY291bnQgLWd0ICRsdF9hY19tYXg7IHRoZW4KKyAgICAgIGx0X2FjX21heD0kbHRfYWNfY291bnQKKyAgICAgIGx0X2N2X3BhdGhfU0VEPSRsdF9hY19zZWQKKyAgICBmaQorICBkb25lCitkb25lCitdKQorU0VEPSRsdF9jdl9wYXRoX1NFRAorQUNfU1VCU1QoW1NFRF0pCitBQ19NU0dfUkVTVUxUKFskU0VEXSkKK10pI0FDX1BST0dfU0VECitdKSNtNF9pZm5kZWYKKworIyBPbGQgbmFtZToKK0FVX0FMSUFTKFtMVF9BQ19QUk9HX1NFRF0sIFtBQ19QUk9HX1NFRF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSwgW10pCisKKworIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgb3V0IHdoZXRoZXIgdGhlIHNoZWxsIGlzIEJvdXJuZSBvciBYU0kgY29tcGF0aWJsZSwKKyMgb3IgaGFzIHNvbWUgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLgorbTRfZGVmdW4oW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10sCitbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyBzb21lIFhTSSBjb25zdHJ1Y3RzXSkKKyMgVHJ5IHNvbWUgWFNJIGZlYXR1cmVzCit4c2lfc2hlbGw9bm8KKyggX2x0X2R1bW15PSJhL2IvYyIKKyAgdGVzdCAiJHtfbHRfZHVtbXkjIyovfSwke19sdF9kdW1teSUvKn0sIiR7X2x0X2R1bW15JSIkX2x0X2R1bW15In0sIFwKKyAgICAgID0gYyxhL2IsLCBcCisgICAgJiYgZXZhbCAndGVzdCAkKCggMSArIDEgKSkgLWVxIDIgXAorICAgICYmIHRlc3QgIiR7I19sdF9kdW1teX0iIC1lcSA1JyApID4vZGV2L251bGwgMj4mMSBcCisgICYmIHhzaV9zaGVsbD15ZXMKK0FDX01TR19SRVNVTFQoWyR4c2lfc2hlbGxdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW3hzaV9zaGVsbD0nJHhzaV9zaGVsbCddKQorCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICIrPSJdKQorbHRfc2hlbGxfYXBwZW5kPW5vCisoIGZvbz1iYXI7IHNldCBmb28gYmF6OyBldmFsICIkWzFdKz1cJFsyXSIgJiYgdGVzdCAiJGZvbyIgPSBiYXJiYXogKSBcCisgICAgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgbHRfc2hlbGxfYXBwZW5kPXllcworQUNfTVNHX1JFU1VMVChbJGx0X3NoZWxsX2FwcGVuZF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbbHRfc2hlbGxfYXBwZW5kPSckbHRfc2hlbGxfYXBwZW5kJ10pCisKK2lmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBsdF91bnNldD11bnNldAorZWxzZQorICBsdF91bnNldD1mYWxzZQorZmkKK19MVF9ERUNMKFtdLCBbbHRfdW5zZXRdLCBbMF0sIFt3aGV0aGVyIHRoZSBzaGVsbCB1bmRlcnN0YW5kcyAidW5zZXQiXSlkbmwKKworIyB0ZXN0IEVCQ0RJQyBvciBBU0NJSQorY2FzZSBgZWNobyBYfHRyIFggJ1wxMDEnYCBpbgorIEEpICMgQVNDSUkgYmFzZWQgc3lzdGVtCisgICAgIyBcbiBpcyBub3QgaW50ZXJwcmV0ZWQgY29ycmVjdGx5IGJ5IFNvbGFyaXMgOCAvdXNyL3VjYi90cgorICBsdF9TUDJOTD0ndHIgXDA0MCBcMDEyJworICBsdF9OTDJTUD0ndHIgXDAxNVwwMTIgXDA0MFwwNDAnCisgIDs7CisgKikgIyBFQkNESUMgYmFzZWQgc3lzdGVtCisgIGx0X1NQMk5MPSd0ciBcMTAwIFxuJworICBsdF9OTDJTUD0ndHIgXHJcbiBcMTAwXDEwMCcKKyAgOzsKK2VzYWMKK19MVF9ERUNMKFtTUDJOTF0sIFtsdF9TUDJOTF0sIFsxXSwgW3R1cm4gc3BhY2VzIGludG8gbmV3bGluZXNdKWRubAorX0xUX0RFQ0woW05MMlNQXSwgW2x0X05MMlNQXSwgWzFdLCBbdHVybiBuZXdsaW5lcyBpbnRvIHNwYWNlc10pZG5sCitdKSMgX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTCisKKworIyBfTFRfUFJPR19YU0lfU0hFTExGTlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJvdXJuZSBhbmQgWFNJIGNvbXBhdGlibGUgdmFyaWFudHMgb2Ygc29tZSB1c2VmdWwgc2hlbGwgZnVuY3Rpb25zLgorbTRfZGVmdW4oW19MVF9QUk9HX1hTSV9TSEVMTEZOU10sCitbY2FzZSAkeHNpX3NoZWxsIGluCisgIHllcykKKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgIGNhc2UgJHsxfSBpbgorICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OworICBlc2FjCit9CisKKyMgZnVuY19iYXNlbmFtZSBmaWxlCitmdW5jX2Jhc2VuYW1lICgpCit7CisgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSIKK30KKworIyBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBwZXJmb3JtIGZ1bmNfYmFzZW5hbWUgYW5kIGZ1bmNfZGlybmFtZSBpbiBhIHNpbmdsZSBmdW5jdGlvbgorIyBjYWxsOgorIyAgIGRpcm5hbWU6ICBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwKKyMgICAgICAgICAgICAgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LCBvdGhlcndpc2Ugc2V0IHJlc3VsdAorIyAgICAgICAgICAgICB0byBOT05ESVJfUkVQTEFDRU1FTlQuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVybmVkIGluICIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyMgICBiYXNlbmFtZTogQ29tcHV0ZSBmaWxlbmFtZSBvZiBGSUxFLgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1bmVkIGluICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisjIEltcGxlbWVudGF0aW9uIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCBmdW5jX2Rpcm5hbWUKKyMgYW5kIGZ1bmNfYmFzZW5hbWUuIEZvciBlZmZpY2llbmN5LCB3ZSBkbyBub3QgZGVsZWdhdGUgdG8KKyMgdGhvc2UgZnVuY3Rpb25zIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBoZXJlLgorZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAoKQoreworICBjYXNlICR7MX0gaW4KKyAgICAqLyopIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7MSUvKn0kezJ9IiA7OworICAgICogICkgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIgOzsKKyAgZXNhYworICBmdW5jX2Jhc2VuYW1lX3Jlc3VsdD0iJHsxIyMqL30iCit9CisKKyMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorZnVuY19zdHJpcG5hbWUgKCkKK3sKKyAgIyBwZGtzaCA1LjIuMTQgZG9lcyBub3QgZG8gJHtYJSRZfSBjb3JyZWN0bHkgaWYgYm90aCBYIGFuZCBZIGFyZQorICAjIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgc28gYXNzaWduIG9uZSB0byBvcmRpbmFyeSBwYXJhbWV0ZXIgZmlyc3QuCisgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0kezN9CisgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCMiJHsxfSJ9CisgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD0ke2Z1bmNfc3RyaXBuYW1lX3Jlc3VsdCUiJHsyfSJ9Cit9CisKKyMgZnVuY19vcHRfc3BsaXQKK2Z1bmNfb3B0X3NwbGl0ICgpCit7CisgIGZ1bmNfb3B0X3NwbGl0X29wdD0kezElJT0qfQorICBmdW5jX29wdF9zcGxpdF9hcmc9JHsxIyo9fQorfQorCisjIGZ1bmNfbG8ybyBvYmplY3QKK2Z1bmNfbG8ybyAoKQoreworICBjYXNlICR7MX0gaW4KKyAgICAqLmxvKSBmdW5jX2xvMm9fcmVzdWx0PSR7MSUubG99LiR7b2JqZXh0fSA7OworICAgICopICAgIGZ1bmNfbG8yb19yZXN1bHQ9JHsxfSA7OworICBlc2FjCit9CisKKyMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCitmdW5jX3hmb3JtICgpCit7CisgIGZ1bmNfeGZvcm1fcmVzdWx0PSR7MSUuKn0ubG8KK30KKworIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgorZnVuY19hcml0aCAoKQoreworICBmdW5jX2FyaXRoX3Jlc3VsdD0kKCggJFsqXSApKQorfQorCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgZnVuY19sZW5fcmVzdWx0PSR7IzF9Cit9CisKK19MVF9FT0YKKyAgICA7OworICAqKSAjIEJvdXJuZSBjb21wYXRpYmxlIGZ1bmN0aW9ucy4KKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfZGlybmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwKKyMgb3RoZXJ3aXNlIHNldCByZXN1bHQgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorZnVuY19kaXJuYW1lICgpCit7CisgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGRpcm5hbWUiYAorICBpZiB0ZXN0ICJYJGZ1bmNfZGlybmFtZV9yZXN1bHQiID0gIlgkezF9IjsgdGhlbgorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iCisgIGVsc2UKKyAgICBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdCR7Mn0iCisgIGZpCit9CisKKyMgZnVuY19iYXNlbmFtZSBmaWxlCitmdW5jX2Jhc2VuYW1lICgpCit7CisgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRiYXNlbmFtZSJgCit9CisKK2RubCBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lCitkbmwgQSBwb3J0YWJsZSB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgYWxyZWFkeSBkZWZpbmVkIGluIGdlbmVyYWwubTRzaAorZG5sIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGl0IGhlcmUuCisKKyMgZnVuY19zdHJpcG5hbWUgcHJlZml4IHN1ZmZpeCBuYW1lCisjIHN0cmlwIFBSRUZJWCBhbmQgU1VGRklYIG9mZiBvZiBOQU1FLgorIyBQUkVGSVggYW5kIFNVRkZJWCBtdXN0IG5vdCBjb250YWluIGdsb2JiaW5nIG9yIHJlZ2V4IHNwZWNpYWwKKyMgY2hhcmFjdGVycywgaGFzaGVzLCBwZXJjZW50IHNpZ25zLCBidXQgU1VGRklYIG1heSBjb250YWluIGEgbGVhZGluZworIyBkb3QgKGluIHdoaWNoIGNhc2UgdGhhdCBtYXRjaGVzIG9ubHkgYSBkb3QpLgorIyBmdW5jX3N0cmlwX3N1ZmZpeCBwcmVmaXggbmFtZQorZnVuY19zdHJpcG5hbWUgKCkKK3sKKyAgY2FzZSAkezJ9IGluCisgICAgLiopIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezN9IiBcCisgICAgICAgICAgIHwgJFhzZWQgLWUgInMlXiR7MX0lJSIgLWUgInMlXFxcXCR7Mn1cJCUlImA7OworICAgICopICBmdW5jX3N0cmlwbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHszfSIgXAorICAgICAgICAgICB8ICRYc2VkIC1lICJzJV4kezF9JSUiIC1lICJzJSR7Mn1cJCUlImA7OworICBlc2FjCit9CisKKyMgc2VkIHNjcmlwdHM6CitteV9zZWRfbG9uZ19vcHQ9JzFzL15cKC1bW149XV0qXCk9LiovXDEvO3EnCitteV9zZWRfbG9uZ19hcmc9JzFzL14tW1tePV1dKj0vLycKKworIyBmdW5jX29wdF9zcGxpdAorZnVuY19vcHRfc3BsaXQgKCkKK3sKKyAgZnVuY19vcHRfc3BsaXRfb3B0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgIiRteV9zZWRfbG9uZ19vcHQiYAorICBmdW5jX29wdF9zcGxpdF9hcmc9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJG15X3NlZF9sb25nX2FyZyJgCit9CisKKyMgZnVuY19sbzJvIG9iamVjdAorZnVuY19sbzJvICgpCit7CisgIGZ1bmNfbG8yb19yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGxvMm8iYAorfQorCisjIGZ1bmNfeGZvcm0gbGlib2JqLW9yLXNvdXJjZQorZnVuY194Zm9ybSAoKQoreworICBmdW5jX3hmb3JtX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICdzL1wuW1teLl1dKiQvLmxvLydgCit9CisKKyMgZnVuY19hcml0aCBhcml0aG1ldGljLXRlcm0uLi4KK2Z1bmNfYXJpdGggKCkKK3sKKyAgZnVuY19hcml0aF9yZXN1bHQ9YGV4cHIgIiRbQF0iYAorfQorCisjIGZ1bmNfbGVuIHN0cmluZworIyBTVFJJTkcgbWF5IG5vdCBzdGFydCB3aXRoIGEgaHlwaGVuLgorZnVuY19sZW4gKCkKK3sKKyAgZnVuY19sZW5fcmVzdWx0PWBleHByICIkWzFdIiA6ICIuKiIgMj4vZGV2L251bGwgfHwgZWNobyAkbWF4X2NtZF9sZW5gCit9CisKK19MVF9FT0YKK2VzYWMKKworY2FzZSAkbHRfc2hlbGxfYXBwZW5kIGluCisgIHllcykKKyAgICBjYXQgPDwgXF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorCisjIGZ1bmNfYXBwZW5kIHZhciB2YWx1ZQorIyBBcHBlbmQgVkFMVUUgdG8gdGhlIGVuZCBvZiBzaGVsbCB2YXJpYWJsZSBWQVIuCitmdW5jX2FwcGVuZCAoKQoreworICBldmFsICIkWzFdKz1cJFsyXSIKK30KK19MVF9FT0YKKyAgICA7OworICAqKQorICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCisjIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KK2Z1bmNfYXBwZW5kICgpCit7CisgIGV2YWwgIiRbMV09XCQkWzFdXCRbMl0iCit9CisKK19MVF9FT0YKKyAgICA7OworICBlc2FjCitdKQorCisjIEhlbHBlciBmdW5jdGlvbnMgZm9yIG9wdGlvbiBoYW5kbGluZy4gICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2IGx0b3B0aW9ucy5tNAorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUT1BUSU9OU19WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCisKKyMgX0xUX01BTkdMRV9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtfTFRfTUFOR0xFX09QVElPTl0sCitbW19MVF9PUFRJT05fXW00X2JwYXRzdWJzdCgkMV9fJDIsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKworIyBfTFRfU0VUX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gT1BUSU9OLU5BTUUgZm9yIG1hY3JvIE1BQ1JPLU5BTUUsIGFuZCBpZiB0aGVyZSBpcyBhCisjIG1hdGNoaW5nIGhhbmRsZXIgZGVmaW5lZCwgZGlzcGF0Y2ggdG8gaXQuICBPdGhlciBPUFRJT04tTkFNRXMgYXJlCisjIHNhdmVkIGFzIGEgZmxhZy4KK200X2RlZmluZShbX0xUX1NFVF9PUFRJT05dLAorW200X2RlZmluZShfTFRfTUFOR0xFX09QVElPTihbJDFdLCBbJDJdKSlkbmwKK200X2lmZGVmKF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksCisgICAgICAgIF9MVF9NQU5HTEVfREVGVU4oWyQxXSwgWyQyXSksCisgICAgW200X3dhcm5pbmcoW1Vua25vd24gJDEgb3B0aW9uIGAkMiddKV0pW11kbmwKK10pCisKKworIyBfTFRfSUZfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBJRi1TRVQsIFtJRi1OT1QtU0VUXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorbTRfZGVmaW5lKFtfTFRfSUZfT1BUSU9OXSwKK1ttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBbJDJdKSwgWyQzXSwgWyQ0XSldKQorCisKKyMgX0xUX1VOTEVTU19PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNULCBJRi1OT1QtU0VUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtTk9ULVNFVCB1bmxlc3MgYWxsIG9wdGlvbnMgaW4gT1BUSU9OLUxJU1QgZm9yIE1BQ1JPLU5BTUUKKyMgYXJlIHNldC4KK200X2RlZmluZShbX0xUX1VOTEVTU19PUFRJT05TXSwKK1ttNF9mb3JlYWNoKFtfTFRfT3B0aW9uXSwgbTRfc3BsaXQobTRfbm9ybWFsaXplKFskMl0pKSwKKwkgICAgW200X2lmZGVmKF9MVF9NQU5HTEVfT1BUSU9OKFskMV0sIF9MVF9PcHRpb24pLAorCQkgICAgICBbbTRfZGVmaW5lKFskMF9mb3VuZF0pXSldKVtdZG5sCittNF9pZmRlZihbJDBfZm91bmRdLCBbbTRfdW5kZWZpbmUoWyQwX2ZvdW5kXSldLCBbJDMKK10pW11kbmwKK10pCisKKworIyBfTFRfU0VUX09QVElPTlMoTUFDUk8tTkFNRSwgT1BUSU9OLUxJU1QpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OLUxJU1QgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBMaWJ0b29sIG9wdGlvbnMgYXNzb2NpYXRlZAorIyB3aXRoIE1BQ1JPLU5BTUUuICBJZiBhbnkgT1BUSU9OIGhhcyBhIG1hdGNoaW5nIGhhbmRsZXIgZGVjbGFyZWQgd2l0aAorIyBMVF9PUFRJT05fREVGSU5FLCBkaXNwYXRjaCB0byB0aGF0IG1hY3JvOyBvdGhlcndpc2UgY29tcGxhaW4gYWJvdXQKKyMgdGhlIHVua25vd24gb3B0aW9uIGFuZCBleGl0LgorbTRfZGVmdW4oW19MVF9TRVRfT1BUSU9OU10sCitbIyBTZXQgb3B0aW9ucworbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisgICAgW19MVF9TRVRfT1BUSU9OKFskMV0sIF9MVF9PcHRpb24pXSkKKworbTRfaWYoWyQxXSxbTFRfSU5JVF0sWworICBkbmwKKyAgZG5sIFNpbXBseSBzZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAoaS5lIG9mZikgaWYgYm9vbGVhbiBvcHRpb25zIHdlcmUgbm90CisgIGRubCBzcGVjaWZpZWQ6CisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtkbG9wZW5dLCBbZW5hYmxlX2Rsb3Blbj1ubworICBdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwgW2VuYWJsZV93aW4zMl9kbGw9bm8KKyAgXSkKKyAgZG5sCisgIGRubCBJZiBubyByZWZlcmVuY2Ugd2FzIG1hZGUgdG8gdmFyaW91cyBwYWlycyBvZiBvcHBvc2luZyBvcHRpb25zLCB0aGVuCisgIGRubCB3ZSBydW4gdGhlIGRlZmF1bHQgbW9kZSBoYW5kbGVyIGZvciB0aGUgcGFpci4gIEZvciBleGFtcGxlLCBpZiBuZWl0aGVyCisgIGRubCBgc2hhcmVkJyBub3IgYGRpc2FibGUtc2hhcmVkJyB3YXMgcGFzc2VkLCB3ZSBlbmFibGUgYnVpbGRpbmcgb2Ygc2hhcmVkCisgIGRubCBhcmNoaXZlcyBieSBkZWZhdWx0OgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbc2hhcmVkIGRpc2FibGUtc2hhcmVkXSwgW19MVF9FTkFCTEVfU0hBUkVEXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3N0YXRpYyBkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtwaWMtb25seSBuby1waWNdLCBbX0xUX1dJVEhfUElDXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbCBkaXNhYmxlLWZhc3QtaW5zdGFsbF0sCisgIAkJICAgW19MVF9FTkFCTEVfRkFTVF9JTlNUQUxMXSkKKyAgXSkKK10pIyBfTFRfU0VUX09QVElPTlMKKworCisKKyMgX0xUX01BTkdMRV9ERUZVTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9ERUZVTl0sCitbW19MVF9PUFRJT05fREVGVU5fXW00X2JwYXRzdWJzdChtNF90b3VwcGVyKFskMV9fJDJdKSwgW1teQS1aMC05X11dLCBbX10pXSkKKworCisjIExUX09QVElPTl9ERUZJTkUoTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUsIENPREUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW0xUX09QVElPTl9ERUZJTkVdLAorW200X2RlZmluZShfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLCBbJDNdKVtdZG5sCitdKSMgTFRfT1BUSU9OX0RFRklORQorCisKKyMgZGxvcGVuCisjIC0tLS0tLQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkbG9wZW5dLCBbZW5hYmxlX2Rsb3Blbj15ZXMKK10pCisKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0RMT1BFTl0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGxvcGVuXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGBkbG9wZW4nIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLCBbXSkKKworCisjIHdpbjMyLWRsbAorIyAtLS0tLS0tLS0KKyMgRGVjbGFyZSBwYWNrYWdlIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpbjMyIGRsbCdzLgorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFt3aW4zMi1kbGxdLAorW2VuYWJsZV93aW4zMl9kbGw9eWVzCisKK2Nhc2UgJGhvc3QgaW4KKyotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotY2VnY2MqKQorICBBQ19DSEVDS19UT09MKEFTLCBhcywgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woRExMVE9PTCwgZGxsdG9vbCwgZmFsc2UpCisgIEFDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCisgIDs7Citlc2FjCisKK3Rlc3QgLXogIiRBUyIgJiYgQVM9YXMKK19MVF9ERUNMKFtdLCBbQVNdLCAgICAgIFswXSwgW0Fzc2VtYmxlciBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAorX0xUX0RFQ0woW10sIFtETExUT09MXSwgWzBdLCBbRExMIGNyZWF0aW9uIHByb2dyYW1dKWRubAorCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMF0sIFtPYmplY3QgZHVtcGVyIHByb2dyYW1dKWRubAorXSkjIHdpbjMyLWRsbAorCitBVV9ERUZVTihbQUNfTElCVE9PTF9XSU4zMl9ETExdLAorW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKK19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgd2luMzItZGxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwgW10pCisKKworIyBfTFRfRU5BQkxFX1NIQVJFRChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zaGFyZWQgZmxhZywgYW5kIHN1cHBvcnRzIHRoZSBgc2hhcmVkJyBhbmQKKyMgYGRpc2FibGUtc2hhcmVkJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3NoYXJlZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zaGFyZWRAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKKyAgICBubykgZW5hYmxlX3NoYXJlZD1ubyA7OworICAgICopCisgICAgICBlbmFibGVfc2hhcmVkPW5vCisgICAgICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCisgICAgICBsdF9zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JFBBVEhfU0VQQVJBVE9SLCIKKyAgICAgIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KKwlJRlM9IiRsdF9zYXZlX2lmcyIKKwlpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgorCSAgZW5hYmxlX3NoYXJlZD15ZXMKKwlmaQorICAgICAgZG9uZQorICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICA7OworICAgIGVzYWNdLAorICAgIFtlbmFibGVfc2hhcmVkPV1fTFRfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKQorCisgICAgX0xUX0RFQ0woW2J1aWxkX2xpYnRvb2xfbGlic10sIFtlbmFibGVfc2hhcmVkXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NIQVJFRAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3NoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc2hhcmVkXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NIQVJFRF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbQUNfRU5BQkxFX1NIQVJFRCgkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU0hBUkVEXSwgW0FDX0RJU0FCTEVfU0hBUkVEKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NIQVJFRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX1NUQVRJQyhbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1zdGF0aWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBzdGF0aWMnIGFuZAorIyBgZGlzYWJsZS1zdGF0aWMnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ10sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbc3RhdGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXN0YXRpY0A8OkA9UEtHU0A6PkBdLAorCVtidWlsZCBzdGF0aWMgbGlicmFyaWVzIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX1NUQVRJQ19ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfc3RhdGljPXllcyA7OworICAgIG5vKSBlbmFibGVfc3RhdGljPW5vIDs7CisgICAgKikKKyAgICAgZW5hYmxlX3N0YXRpYz1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zdGF0aWM9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3N0YXRpYz1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9vbGRfbGlic10sIFtlbmFibGVfc3RhdGljXSwgWzBdLAorCVtXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKK10pIyBfTFRfRU5BQkxFX1NUQVRJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3N0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLXN0YXRpY10sIFtfTFRfRU5BQkxFX1NUQVRJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQUNfREVGVU4oW0FDX0VOQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbc3RhdGljXSkKK10pCisKK0FDX0RFRlVOKFtBQ19ESVNBQkxFX1NUQVRJQ10sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdKQorXSkKKworQVVfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbQUNfRU5BQkxFX1NUQVRJQygkQCldKQorQVVfREVGVU4oW0FNX0RJU0FCTEVfU1RBVElDXSwgW0FDX0RJU0FCTEVfU1RBVElDKCRAKV0pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fRU5BQkxFX1NUQVRJQ10sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtdKQorCisKKworIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbREVGQVVMVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBmYXN0LWluc3RhbGwnCisjIGFuZCBgZGlzYWJsZS1mYXN0LWluc3RhbGwnIExUX0lOSVQgb3B0aW9ucy4KKyMgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGB5ZXMnLgorbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0sCitbbTRfZGVmaW5lKFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgW200X2lmKCQxLCBubywgbm8sIHllcyldKWRubAorQUNfQVJHX0VOQUJMRShbZmFzdC1pbnN0YWxsXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWZhc3QtaW5zdGFsbEA8OkA9UEtHU0A6PkBdLAorICAgIFtvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX2Zhc3RfaW5zdGFsbD1dX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVCkKKworX0xUX0RFQ0woW2Zhc3RfaW5zdGFsbF0sIFtlbmFibGVfZmFzdF9pbnN0YWxsXSwgWzBdLAorCSBbV2hldGhlciBvciBub3QgdG8gb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uXSlkbmwKK10pIyBfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTAorCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW2Zhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtkaXNhYmxlLWZhc3QtaW5zdGFsbF0sIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTChbbm9dKV0pCisKKyMgT2xkIG5hbWVzOgorQVVfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgbTRfaWYoWyQxXSwgW25vXSwgW2Rpc2FibGUtXSlbZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBmYXN0LWluc3RhbGwnIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK0FVX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0sCitbX0xUX1NFVF9PUFRJT04oW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UgcHV0Cit0aGUgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9GQVNUX0lOU1RBTExdLCBbXSkKKworCisjIF9MVF9XSVRIX1BJQyhbTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS13aXRoLXBpYyBmbGFnLCBhbmQgc3VwcG9ydCB0aGUgYHBpYy1vbmx5JyBhbmQgYG5vLXBpYycKKyMgTFRfSU5JVCBvcHRpb25zLgorIyBNT0RFIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYGJvdGgnLgorbTRfZGVmaW5lKFtfTFRfV0lUSF9QSUNdLAorW0FDX0FSR19XSVRIKFtwaWNdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLXBpY10sCisJW3RyeSB0byB1c2Ugb25seSBQSUMvbm9uLVBJQyBvYmplY3RzIEA8OkBkZWZhdWx0PXVzZSBib3RoQDo+QF0pXSwKKyAgICBbcGljX21vZGU9IiR3aXRodmFsIl0sCisgICAgW3BpY19tb2RlPWRlZmF1bHRdKQorCit0ZXN0IC16ICIkcGljX21vZGUiICYmIHBpY19tb2RlPW00X2RlZmF1bHQoWyQxXSwgW2RlZmF1bHRdKQorCitfTFRfREVDTChbXSwgW3BpY19tb2RlXSwgWzBdLCBbV2hhdCB0eXBlIG9mIG9iamVjdHMgdG8gYnVpbGRdKWRubAorXSkjIF9MVF9XSVRIX1BJQworCitMVF9PUFRJT05fREVGSU5FKFtMVF9JTklUXSwgW3BpYy1vbmx5XSwgW19MVF9XSVRIX1BJQyhbeWVzXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtuby1waWNdLCBbX0xUX1dJVEhfUElDKFtub10pXSkKKworIyBPbGQgbmFtZToKK0FVX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW3BpYy1vbmx5XSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91CitwdXQgdGhlIGBwaWMtb25seScgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1BJQ01PREVdLCBbXSkKKworCittNF9kZWZpbmUoW19MVERMX01PREVdLCBbXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtub25yZWN1cnNpdmVdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtub25yZWN1cnNpdmVdKV0pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbcmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbcmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3N1YnByb2plY3RdLAorCQkgW200X2RlZmluZShbX0xURExfTU9ERV0sIFtzdWJwcm9qZWN0XSldKQorCittNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtpbnN0YWxsYWJsZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2luc3RhbGxhYmxlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW2NvbnZlbmllbmNlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX1RZUEVdLCBbY29udmVuaWVuY2VdKV0pCisKKyMgbHRzdWdhci5tNCAtLSBsaWJ0b29sIG00IGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgIC0qLUF1dG9jb25mLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2IGx0c3VnYXIubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVFNVR0FSX1ZFUlNJT05dLCBbbTRfaWYoWzAuMV0pXSkKKworCisjIGx0X2pvaW4oU0VQLCBBUkcxLCBbQVJHMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgQVJHMVNFUEFSRzIuLi5TRVBBUkduLCBvbWl0dGluZyBbXSBhcmd1bWVudHMgYW5kIHRoZWlyCisjIGFzc29jaWF0ZWQgc2VwYXJhdG9yLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfam9pbiBmcm9tIEF1dG9jb25mIDIuNjIsIHNpbmNlIGFsbCBlYXJsaWVyCisjIHZlcnNpb25zIGluIG00c3VnYXIgaGFkIGJ1Z3MuCittNF9kZWZpbmUoW2x0X2pvaW5dLAorW200X2lmKFskI10sIFsxXSwgW10sCisgICAgICAgWyQjXSwgWzJdLCBbWyQyXV0sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMl1fXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKK200X2RlZmluZShbX2x0X2pvaW5dLAorW200X2lmKFskIyQyXSwgWzJdLCBbXSwKKyAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQxJDJdXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKKworCisjIGx0X2NhcihMSVNUKQorIyBsdF9jZHIoTElTVCkKKyMgLS0tLS0tLS0tLS0tCisjIE1hbmlwdWxhdGUgbTQgbGlzdHMuCisjIFRoZXNlIG1hY3JvcyBhcmUgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2lsbCBzdGlsbCBuZWVkIHRvIHN1cHBvcnQKKyMgQXV0b2NvbmYtMi41OSB3aGljaCBxdW90ZXMgZGlmZmVyZW50bHkuCittNF9kZWZpbmUoW2x0X2Nhcl0sIFtbJDFdXSkKK200X2RlZmluZShbbHRfY2RyXSwKK1ttNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzXSldLAorICAgICAgIFskI10sIDEsIFtdLAorICAgICAgIFttNF9kcXVvdGUobTRfc2hpZnQoJEApKV0pXSkKK200X2RlZmluZShbbHRfdW5xdW90ZV0sICQxKQorCisKKyMgbHRfYXBwZW5kKE1BQ1JPLU5BTUUsIFNUUklORywgW1NFUEFSQVRPUl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWRlZmluZSBNQUNSTy1OQU1FIHRvIGhvbGQgaXRzIGZvcm1lciBjb250ZW50IHBsdXMgYFNFUEFSQVRPUidgU1RSSU5HJy4KKyMgTm90ZSB0aGF0IG5laXRoZXIgU0VQQVJBVE9SIG5vciBTVFJJTkcgYXJlIGV4cGFuZGVkOyB0aGV5IGFyZSBhcHBlbmRlZAorIyB0byBNQUNSTy1OQU1FIGFzIGlzIChsZWF2aW5nIHRoZSBleHBhbnNpb24gZm9yIHdoZW4gTUFDUk8tTkFNRSBpcyBpbnZva2VkKS4KKyMgTm8gU0VQQVJBVE9SIGlzIG91dHB1dCBpZiBNQUNSTy1OQU1FIHdhcyBwcmV2aW91c2x5IHVuZGVmaW5lZCAoZGlmZmVyZW50CisjIHRoYW4gZGVmaW5lZCBhbmQgZW1wdHkpLgorIworIyBUaGlzIG1hY3JvIGlzIG5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBBdXRvY29uZiAyLjYyLCBzaW5jZSBlYXJsaWVyCisjIHZlcnNpb25zIG9mIG00c3VnYXIgbWlzdGFrZW5seSBleHBhbmRlZCBTRVBBUkFUT1IgYnV0IG5vdCBTVFJJTkcuCittNF9kZWZpbmUoW2x0X2FwcGVuZF0sCitbbTRfZGVmaW5lKFskMV0sCisJICAgbTRfaWZkZWYoWyQxXSwgW200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKV0pCisKKworCisjIGx0X2NvbWJpbmUoU0VQLCBQUkVGSVgtTElTVCwgSU5GSVgsIFNVRkZJWDEsIFtTVUZGSVgyLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIGEgU0VQIGRlbGltaXRlZCBsaXN0IG9mIGFsbCBwYWlyZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mCisjIFBSRUZJWC1MSVNUIHdpdGggU1VGRklYMSB0aHJvdWdoIFNVRkZJWG4uICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKKyMgaGFzIHRoZSBmb3JtIFBSRUZJWG1JTkZJWFNVRkZJWG4uCisjIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9jb21iaW5lIGFkZGVkIGluIEF1dG9jb25mIDIuNjIuCittNF9kZWZpbmUoW2x0X2NvbWJpbmVdLAorW200X2lmKG00X2V2YWwoWyQjID4gM10pLCBbMV0sCisgICAgICAgW200X3B1c2hkZWYoW19MdF9zZXBdLCBbbTRfZGVmaW5lKFtfTHRfc2VwXSwgbTRfZGVmbihbbHRfY2FyXSkpXSldXWRubAorW1ttNF9mb3JlYWNoKFtfTHRfcHJlZml4XSwgWyQyXSwKKwkgICAgIFttNF9mb3JlYWNoKFtfTHRfc3VmZml4XSwKKwkJXW00X2RxdW90ZShtNF9kcXVvdGUobTRfc2hpZnQobTRfc2hpZnQobTRfc2hpZnQoJEApKSkpKVssCisJW19MdF9zZXAoWyQxXSlbXW00X2RlZm4oW19MdF9wcmVmaXhdKVskM11tNF9kZWZuKFtfTHRfc3VmZml4XSldKV0pXSldKQorCisKKyMgbHRfaWZfYXBwZW5kX3VuaXEoTUFDUk8tTkFNRSwgVkFSTkFNRSwgW1NFUEFSQVRPUl0sIFtVTklRXSwgW05PVC1VTklRXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWZmIE1BQ1JPLU5BTUUgZG9lcyBub3QgeWV0IGNvbnRhaW4gVkFSTkFNRSwgdGhlbiBhcHBlbmQgaXQgKGRlbGltaXRlZAorIyBieSBTRVBBUkFUT1IgaWYgc3VwcGxpZWQpIGFuZCBleHBhbmQgVU5JUSwgZWxzZSBOT1QtVU5JUS4KK200X2RlZmluZShbbHRfaWZfYXBwZW5kX3VuaXFdLAorW200X2lmZGVmKFskMV0sCisJICBbbTRfaWYobTRfaW5kZXgoWyQzXW00X2RlZm4oWyQxXSlbJDNdLCBbJDMkMiQzXSksIFstMV0sCisJCSBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLAorCQkgWyQ1XSldLAorCSAgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSldKQorCisKKyMgbHRfZGljdF9hZGQoRElDVCwgS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRdLAorW200X2RlZmluZShbJDEoJDIpXSwgWyQzXSldKQorCisKKyMgbHRfZGljdF9hZGRfc3Via2V5KERJQ1QsIEtFWSwgU1VCS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRfc3Via2V5XSwKK1ttNF9kZWZpbmUoWyQxKCQyOiQzKV0sIFskNF0pXSkKKworCisjIGx0X2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZldGNoXSwKK1ttNF9pZnZhbChbJDNdLAorCW00X2lmZGVmKFskMSgkMjokMyldLCBbbTRfZGVmbihbJDEoJDI6JDMpXSldKSwKKyAgICBtNF9pZmRlZihbJDEoJDIpXSwgW200X2RlZm4oWyQxKCQyKV0pXSkpXSkKKworCisjIGx0X2lmX2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSwgVkFMVUUsIElGLVRSVUUsIFtJRi1GQUxTRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2lmX2RpY3RfZmV0Y2hdLAorW200X2lmKGx0X2RpY3RfZmV0Y2goWyQxXSwgWyQyXSwgWyQzXSksIFskNF0sCisJWyQ1XSwKKyAgICBbJDZdKV0pCisKKworIyBsdF9kaWN0X2ZpbHRlcihESUNULCBbU1VCS0VZXSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBLRVksIFsuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZpbHRlcl0sCitbbTRfaWYoWyQ1XSwgW10sIFtdLAorICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskNF0sIFtbLCBdXSkpLAorICAgICAgICAgICBsdF91bnF1b3RlKG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9mb3JlYWNoKF9MdF9rZXksIGx0X2NhcihbbTRfc2hpZnRuKDQsICRAKV0pLAorCQkgICAgICBbbHRfaWZfZGljdF9mZXRjaChbJDFdLCBfTHRfa2V5LCBbJDJdLCBbJDNdLCBbX0x0X2tleSBdKV0pKSkpKV0pW11kbmwKK10pCisKKyMgbHR2ZXJzaW9uLm00IC0tIHZlcnNpb24gbnVtYmVycwkJCS0qLSBBdXRvY29uZiAtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBHZW5lcmF0ZWQgZnJvbSBsdHZlcnNpb24uaW4uCisKKyMgc2VyaWFsIDMwMTcgbHR2ZXJzaW9uLm00CisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sCisKK200X2RlZmluZShbTFRfUEFDS0FHRV9WRVJTSU9OXSwgWzIuMi42Yl0pCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfUkVWSVNJT05dLCBbMS4zMDE3XSkKKworQUNfREVGVU4oW0xUVkVSU0lPTl9WRVJTSU9OXSwKK1ttYWNyb192ZXJzaW9uPScyLjIuNmInCittYWNyb19yZXZpc2lvbj0nMS4zMDE3JworX0xUX0RFQ0woLCBtYWNyb192ZXJzaW9uLCAwLCBbV2hpY2ggcmVsZWFzZSBvZiBsaWJ0b29sLm00IHdhcyB1c2VkP10pCitfTFRfREVDTCgsIG1hY3JvX3JldmlzaW9uLCAwKQorXSkKKworIyBsdH5vYnNvbGV0ZS5tNCAtLSBhY2xvY2FsIHNhdGlzZnlpbmcgb2Jzb2xldGUgZGVmaW5pdGlvbnMuICAgIC0qLUF1dG9jb25mLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNC4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA0IGx0fm9ic29sZXRlLm00CisKKyMgVGhlc2UgZXhpc3QgZW50aXJlbHkgdG8gZm9vbCBhY2xvY2FsIHdoZW4gYm9vdHN0cmFwcGluZyBsaWJ0b29sLgorIworIyBJbiB0aGUgcGFzdCBsaWJ0b29sLm00IGhhcyBwcm92aWRlZCBtYWNyb3MgdmlhIEFDX0RFRlVOIChvciBBVV9ERUZVTikKKyMgd2hpY2ggaGF2ZSBsYXRlciBiZWVuIGNoYW5nZWQgdG8gbTRfZGVmaW5lIGFzIHRoZXkgYXJlbid0IHBhcnQgb2YgdGhlCisjIGV4cG9ydGVkIEFQSSwgb3IgbW92ZWQgdG8gQXV0b2NvbmYgb3IgQXV0b21ha2Ugd2hlcmUgdGhleSBiZWxvbmcuCisjCisjIFRoZSB0cm91YmxlIGlzLCBhY2xvY2FsIGlzIGEgYml0IHRoaWNrLiAgSXQnbGwgc2VlIHRoZSBvbGQgQUNfREVGVU4KKyMgaW4gL3Vzci9zaGFyZS9hY2xvY2FsL2xpYnRvb2wubTQgYW5kIHJlbWVtYmVyIGl0LCB0aGVuIHdoZW4gaXQgc2VlcyB1cworIyB1c2luZyBhIG1hY3JvIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBvdXIgbG9jYWwgbTQvbGlidG9vbC5tNCBpdCdsbAorIyBwdWxsIHRoZSBvbGQgbGlidG9vbC5tNCBpbiAoaXQgZG9lc24ndCBzZWUgb3VyIHNoaW55IG5ldyBtNF9kZWZpbmUKKyMgYW5kIGRvZXNuJ3Qga25vdyBhYm91dCBBdXRvY29uZiBtYWNyb3MgYXQgYWxsLikKKyMKKyMgU28gd2UgcHJvdmlkZSB0aGlzIGZpbGUsIHdoaWNoIGhhcyBhIHNpbGx5IGZpbGVuYW1lIHNvIGl0J3MgYWx3YXlzCisjIGluY2x1ZGVkIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgcHJvdmlkZXMgYWNsb2NhbCB3aXRoIHRoZQorIyBBQ19ERUZVTnMgaXQgd2FudHMsIGJ1dCB3aGVuIG00IHByb2Nlc3NlcyBpdCwgaXQgZG9lc24ndCBkbyBhbnl0aGluZworIyBiZWNhdXNlIHRob3NlIG1hY3JvcyBhbHJlYWR5IGV4aXN0LCBvciB3aWxsIGJlIG92ZXJ3cml0dGVuIGxhdGVyLgorIyBXZSB1c2UgQUNfREVGVU4gb3ZlciBBVV9ERUZVTiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFjbG9jYWwtMS42LiAKKyMKKyMgQW55dGltZSB3ZSB3aXRoZHJhdyBhbiBBQ19ERUZVTiBvciBBVV9ERUZVTiwgcmVtZW1iZXIgdG8gYWRkIGl0IGhlcmUuCisjIFllcywgdGhhdCBtZWFucyBldmVyeSBuYW1lIG9uY2UgdGFrZW4gd2lsbCBuZWVkIHRvIHJlbWFpbiBoZXJlIHVudGlsCisjIHdlIGdpdmUgdXAgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjcsIGF0IHdoaWNoIHBvaW50CisjIHdlIG5lZWQgdG8ga2VlcCBvbmx5IHRob3NlIG5hbWVzIHdoaWNoIHdlIHN0aWxsIHJlZmVyIHRvLgorCisjIFRoaXMgaXMgdG8gaGVscCBhY2xvY2FsIGZpbmQgdGhlc2UgbWFjcm9zLCBhcyBpdCBjYW4ndCBzZWUgbTRfZGVmaW5lLgorQUNfREVGVU4oW0xUT0JTT0xFVEVfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xJTktFUl9PUFRJT05dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0pXSkKK200X2lmbmRlZihbQUNfUFJPR19FR1JFUF0sCQlbQUNfREVGVU4oW0FDX1BST0dfRUdSRVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSwJW0FDX0RFRlVOKFtfTFRfQUNfUFJPR19FQ0hPX0JBQ0tTTEFTSF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NIRUxMX0lOSVRdLAkJW0FDX0RFRlVOKFtfTFRfQUNfU0hFTExfSU5JVF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0sCVtBQ19ERUZVTihbX0xUX0FDX1NZU19MSUJQQVRIX0FJWF0pXSkKK200X2lmbmRlZihbX0xUX1BST0dfTFRNQUlOXSwJCVtBQ19ERUZVTihbX0xUX1BST0dfTFRNQUlOXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHVkFSXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR1ZBUl0pXSkKK200X2lmbmRlZihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0sCVtBQ19ERUZVTihbQUNfTFRETF9FTkFCTEVfSU5TVEFMTF0pXSkKK200X2lmbmRlZihbQUNfTFRETF9QUkVPUEVOXSwJCVtBQ19ERUZVTihbQUNfTFRETF9QUkVPUEVOXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0NPTVBJTEVSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTE9DS10sCQlbQUNfREVGVU4oW19MVF9BQ19MT0NLXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfT0xEX0FSQ0hJVkVdKV0pCittNF9pZm5kZWYoW19MVF9BQ19UUllfRExPUEVOX1NFTEZdLAlbQUNfREVGVU4oW19MVF9BQ19UUllfRExPUEVOX1NFTEZdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DQ19DX09dKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0hBUkRfTElOS19MT0NLU10sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfT0JKRElSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX09CSkRJUl0sCQlbQUNfREVGVU4oW0FDX0xURExfT0JKRElSXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0xEX0hBUkRDT0RFX0xJQlBBVEhdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0xJQl9TVFJJUF0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSldKQorbTRfaWZuZGVmKFtBQ19QQVRIX01BR0lDXSwJCVtBQ19ERUZVTihbQUNfUEFUSF9NQUdJQ10pXSkKK200X2lmbmRlZihbQUNfUFJPR19MRF9HTlVdLAkJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX0dOVV0pXSkKK200X2lmbmRlZihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10sCVtBQ19ERUZVTihbQUNfUFJPR19MRF9SRUxPQURfRkxBR10pXSkKK200X2lmbmRlZihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdLAlbQUNfREVGVU4oW0FDX0RFUExJQlNfQ0hFQ0tfTUVUSE9EXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NPTVBJTEVSX05PX1JUVEldKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0dMT0JBTF9TWU1CT0xfUElQRV0sIFtBQ19ERUZVTihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfUElDXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfU0hMSUJTXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BPU1RERVBfUFJFREVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbTFRfQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbTFRfQUNfUFJPR19TRURdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX1NFRF0pXSkKK200X2lmbmRlZihbX0xUX0NDX0JBU0VOQU1FXSwJCVtBQ19ERUZVTihbX0xUX0NDX0JBU0VOQU1FXSldKQorbTRfaWZuZGVmKFtfTFRfQ09NUElMRVJfQk9JTEVSUExBVEVdLAlbQUNfREVGVU4oW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0pXSkKK200X2lmbmRlZihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0xJTktFUl9CT0lMRVJQTEFURV0pXSkKK200X2lmbmRlZihbX0FDX1BST0dfTElCVE9PTF0sCQlbQUNfREVGVU4oW19BQ19QUk9HX0xJQlRPT0xdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU0VUVVBdLAkJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NFVFVQXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfQ0hFQ0tfRExGQ05dLAkJW0FDX0RFRlVOKFtfTFRfQUNfQ0hFQ0tfRExGQ05dKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19EWU5BTUlDX0xJTktFUl0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RBR0NPTkZJR10sCQlbQUNfREVGVU4oW19MVF9BQ19UQUdDT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTF0pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzddLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl0sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9SQ10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUkNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfQ1hYX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19GNzdfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0dDSl9DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0dDSl9DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0NPTkZJR10sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfRklMRV9MVERMTF9DXSwJW0FDX0RFRlVOKFtfTFRfQUNfRklMRV9MVERMTF9DXSldKQorCisjIHBrZy5tNCAtIE1hY3JvcyB0byBsb2NhdGUgYW5kIHV0aWxpc2UgcGtnLWNvbmZpZy4gICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIAorIyBDb3B5cmlnaHQgwqkgMjAwNCBTY290dCBKYW1lcyBSZW1uYW50IDxzY290dEBuZXRzcGxpdC5jb20+LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgUEtHX1BST0dfUEtHX0NPTkZJRyhbTUlOLVZFUlNJT05dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbUEtHX1BST0dfUEtHX0NPTkZJR10sCitbbTRfcGF0dGVybl9mb3JiaWQoW15fP1BLR19bQS1aX10rJF0pCittNF9wYXR0ZXJuX2FsbG93KFteUEtHX0NPTkZJRyhfUEFUSCk/JF0pCitBQ19BUkdfVkFSKFtQS0dfQ09ORklHXSwgW3BhdGggdG8gcGtnLWNvbmZpZyB1dGlsaXR5XSlkbmwKK2lmIHRlc3QgIngkYWNfY3ZfZW52X1BLR19DT05GSUdfc2V0IiAhPSAieHNldCI7IHRoZW4KKwlBQ19QQVRIX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCitmaQoraWYgdGVzdCAtbiAiJFBLR19DT05GSUciOyB0aGVuCisJX3BrZ19taW5fdmVyc2lvbj1tNF9kZWZhdWx0KFskMV0sIFswLjkuMF0pCisJQUNfTVNHX0NIRUNLSU5HKFtwa2ctY29uZmlnIGlzIGF0IGxlYXN0IHZlcnNpb24gJF9wa2dfbWluX3ZlcnNpb25dKQorCWlmICRQS0dfQ09ORklHIC0tYXRsZWFzdC1wa2djb25maWctdmVyc2lvbiAkX3BrZ19taW5fdmVyc2lvbjsgdGhlbgorCQlBQ19NU0dfUkVTVUxUKFt5ZXNdKQorCWVsc2UKKwkJQUNfTVNHX1JFU1VMVChbbm9dKQorCQlQS0dfQ09ORklHPSIiCisJZmkKKwkJCitmaVtdZG5sCitdKSMgUEtHX1BST0dfUEtHX0NPTkZJRworCisjIFBLR19DSEVDS19FWElTVFMoTU9EVUxFUywgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKKyMKKyMgQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNldCBvZiBtb2R1bGVzIGV4aXN0cy4gIFNpbWlsYXIKKyMgdG8gUEtHX0NIRUNLX01PRFVMRVMoKSwgYnV0IGRvZXMgbm90IHNldCB2YXJpYWJsZXMgb3IgcHJpbnQgZXJyb3JzLgorIworIworIyBTaW1pbGFyIHRvIFBLR19DSEVDS19NT0RVTEVTLCBtYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YKKyMgdGhpcyBvciBQS0dfQ0hFQ0tfTU9EVUxFUyBpcyBjYWxsZWQsIG9yIG1ha2Ugc3VyZSB0byBjYWxsCisjIFBLR19DSEVDS19FWElTVFMgbWFudWFsbHkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfQ0hFQ0tfRVhJU1RTXSwKK1tBQ19SRVFVSVJFKFtQS0dfUFJPR19QS0dfQ09ORklHXSlkbmwKK2lmIHRlc3QgLW4gIiRQS0dfQ09ORklHIiAmJiBcCisgICAgQUNfUlVOX0xPRyhbJFBLR19DT05GSUcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgIiQxIl0pOyB0aGVuCisgIG00X2lmdmFsKFskMl0sIFskMl0sIFs6XSkKK200X2lmdmFsbihbJDNdLCBbZWxzZQorICAkM10pZG5sCitmaV0pCisKKworIyBfUEtHX0NPTkZJRyhbVkFSSUFCTEVdLCBbQ09NTUFORF0sIFtNT0RVTEVTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19QS0dfQ09ORklHXSwKK1tpZiB0ZXN0IC1uICIkJDEiOyB0aGVuCisgICAgcGtnX2N2X1tdJDE9IiQkMSIKKyBlbGlmIHRlc3QgLW4gIiRQS0dfQ09ORklHIjsgdGhlbgorICAgIFBLR19DSEVDS19FWElTVFMoWyQzXSwKKyAgICAgICAgICAgICAgICAgICAgIFtwa2dfY3ZfW10kMT1gJFBLR19DT05GSUcgLS1bXSQyICIkMyIgMj4vZGV2L251bGxgXSwKKwkJICAgICBbcGtnX2ZhaWxlZD15ZXNdKQorIGVsc2UKKyAgICBwa2dfZmFpbGVkPXVudHJpZWQKK2ZpW11kbmwKK10pIyBfUEtHX0NPTkZJRworCisjIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW19QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRF0sCitbQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pCitpZiAkUEtHX0NPTkZJRyAtLWF0bGVhc3QtcGtnY29uZmlnLXZlcnNpb24gMC4yMDsgdGhlbgorICAgICAgICBfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQ9eWVzCitlbHNlCisgICAgICAgIF9wa2dfc2hvcnRfZXJyb3JzX3N1cHBvcnRlZD1ubworZmlbXWRubAorXSkjIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorCisKKyMgUEtHX0NIRUNLX01PRFVMRVMoVkFSSUFCTEUtUFJFRklYLCBNT0RVTEVTLCBbQUNUSU9OLUlGLUZPVU5EXSwKKyMgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorIworIworIyBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGUgZmlyc3QgY2FsbCB0bworIyBQS0dfQ0hFQ0tfTU9EVUxFUyBtaWdodCBub3QgaGFwcGVuLCB5b3Ugc2hvdWxkIGJlIHN1cmUgdG8gaW5jbHVkZSBhbgorIyBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaW4geW91ciBjb25maWd1cmUuYWMKKyMKKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtQS0dfQ0hFQ0tfTU9EVUxFU10sCitbQUNfUkVRVUlSRShbUEtHX1BST0dfUEtHX0NPTkZJR10pZG5sCitBQ19BUkdfVkFSKFskMV1bX0NGTEFHU10sIFtDIGNvbXBpbGVyIGZsYWdzIGZvciAkMSwgb3ZlcnJpZGluZyBwa2ctY29uZmlnXSlkbmwKK0FDX0FSR19WQVIoWyQxXVtfTElCU10sIFtsaW5rZXIgZmxhZ3MgZm9yICQxLCBvdmVycmlkaW5nIHBrZy1jb25maWddKWRubAorCitwa2dfZmFpbGVkPW5vCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMV0pCisKK19QS0dfQ09ORklHKFskMV1bX0NGTEFHU10sIFtjZmxhZ3NdLCBbJDJdKQorX1BLR19DT05GSUcoWyQxXVtfTElCU10sIFtsaWJzXSwgWyQyXSkKKworbTRfZGVmaW5lKFtfUEtHX1RFWFRdLCBbQWx0ZXJuYXRpdmVseSwgeW91IG1heSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyAkMVtdX0NGTEFHUworYW5kICQxW11fTElCUyB0byBhdm9pZCB0aGUgbmVlZCB0byBjYWxsIHBrZy1jb25maWcuCitTZWUgdGhlIHBrZy1jb25maWcgbWFuIHBhZ2UgZm9yIG1vcmUgZGV0YWlscy5dKQorCitpZiB0ZXN0ICRwa2dfZmFpbGVkID0geWVzOyB0aGVuCisgICAgICAgIF9QS0dfU0hPUlRfRVJST1JTX1NVUFBPUlRFRAorICAgICAgICBpZiB0ZXN0ICRfcGtnX3Nob3J0X2Vycm9yc19zdXBwb3J0ZWQgPSB5ZXM7IHRoZW4KKwkgICAgICAgICQxW11fUEtHX0VSUk9SUz1gJFBLR19DT05GSUcgLS1zaG9ydC1lcnJvcnMgLS1wcmludC1lcnJvcnMgIiQyIiAyPiYxYAorICAgICAgICBlbHNlIAorCSAgICAgICAgJDFbXV9QS0dfRVJST1JTPWAkUEtHX0NPTkZJRyAtLXByaW50LWVycm9ycyAiJDIiIDI+JjFgCisgICAgICAgIGZpCisJIyBQdXQgdGhlIG5hc3R5IGVycm9yIG1lc3NhZ2UgaW4gY29uZmlnLmxvZyB3aGVyZSBpdCBiZWxvbmdzCisJZWNobyAiJCQxW11fUEtHX0VSUk9SUyIgPiZBU19NRVNTQUdFX0xPR19GRAorCisJaWZlbHNlKFskNF0sICwgW0FDX01TR19FUlJPUihkbmwKK1tQYWNrYWdlIHJlcXVpcmVtZW50cyAoJDIpIHdlcmUgbm90IG1ldDoKKworJCQxX1BLR19FUlJPUlMKKworQ29uc2lkZXIgYWRqdXN0aW5nIHRoZSBQS0dfQ09ORklHX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91CitpbnN0YWxsZWQgc29mdHdhcmUgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4LgorCitfUEtHX1RFWFQKK10pXSwKKwkJW0FDX01TR19SRVNVTFQoW25vXSkKKyAgICAgICAgICAgICAgICAkNF0pCitlbGlmIHRlc3QgJHBrZ19mYWlsZWQgPSB1bnRyaWVkOyB0aGVuCisJaWZlbHNlKFskNF0sICwgW0FDX01TR19GQUlMVVJFKGRubAorW1RoZSBwa2ctY29uZmlnIHNjcmlwdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgaXMgdG9vIG9sZC4gIE1ha2Ugc3VyZSBpdAoraXMgaW4geW91ciBQQVRIIG9yIHNldCB0aGUgUEtHX0NPTkZJRyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZnVsbAorcGF0aCB0byBwa2ctY29uZmlnLgorCitfUEtHX1RFWFQKKworVG8gZ2V0IHBrZy1jb25maWcsIHNlZSA8aHR0cDovL3BrZy1jb25maWcuZnJlZWRlc2t0b3Aub3JnLz4uXSldLAorCQlbJDRdKQorZWxzZQorCSQxW11fQ0ZMQUdTPSRwa2dfY3ZfW10kMVtdX0NGTEFHUworCSQxW11fTElCUz0kcGtnX2N2X1tdJDFbXV9MSUJTCisgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisJaWZlbHNlKFskM10sICwgOiwgWyQzXSkKK2ZpW11kbmwKK10pIyBQS0dfQ0hFQ0tfTU9EVUxFUworCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBBTV9BVVRPTUFLRV9WRVJTSU9OKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXV0b21ha2UgWC5ZIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGVuc3VyZSBhY2xvY2FsLm00IGhhcyBiZWVuCisjIGdlbmVyYXRlZCBmcm9tIHRoZSBtNCBmaWxlcyBhY2NvbXBhbnlpbmcgQXV0b21ha2UgWC5ZLgorIyAoVGhpcyBwcml2YXRlIG1hY3JvIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgdGhpcyBmaWxlLikKK0FDX0RFRlVOKFtBTV9BVVRPTUFLRV9WRVJTSU9OXSwKK1thbV9fYXBpX3ZlcnNpb249JzEuMTEnCitkbmwgU29tZSB1c2VycyBmaW5kIEFNX0FVVE9NQUtFX1ZFUlNJT04gYW5kIG1pc3Rha2UgaXQgZm9yIGEgd2F5IHRvCitkbmwgcmVxdWlyZSBzb21lIG1pbmltdW0gdmVyc2lvbi4gIFBvaW50IHRoZW0gdG8gdGhlIHJpZ2h0IG1hY3JvLgorbTRfaWYoWyQxXSwgWzEuMTEuMV0sIFtdLAorICAgICAgW0FDX0ZBVEFMKFtEbyBub3QgY2FsbCAkMCwgdXNlIEFNX0lOSVRfQVVUT01BS0UoWyQxXSkuXSldKWRubAorXSkKKworIyBfQU1fQVVUT0NPTkZfVkVSU0lPTihWRVJTSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhY2xvY2FsIHRyYWNlcyB0aGlzIG1hY3JvIHRvIGZpbmQgdGhlIEF1dG9jb25mIHZlcnNpb24uCisjIFRoaXMgaXMgYSBwcml2YXRlIG1hY3JvIHRvby4gIFVzaW5nIG00X2RlZmluZSBzaW1wbGlmaWVzCisjIHRoZSBsb2dpYyBpbiBhY2xvY2FsLCB3aGljaCBjYW4gc2ltcGx5IGlnbm9yZSB0aGlzIGRlZmluaXRpb24uCittNF9kZWZpbmUoW19BTV9BVVRPQ09ORl9WRVJTSU9OXSwgW10pCisKKyMgQU1fU0VUX0NVUlJFTlRfQVVUT01BS0VfVkVSU0lPTgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENhbGwgQU1fQVVUT01BS0VfVkVSU0lPTiBhbmQgQU1fQVVUT01BS0VfVkVSU0lPTiBzbyB0aGV5IGNhbiBiZSB0cmFjZWQuCisjIFRoaXMgZnVuY3Rpb24gaXMgQUNfUkVRVUlSRWQgYnkgQU1fSU5JVF9BVVRPTUFLRS4KK0FDX0RFRlVOKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSwKK1tBTV9BVVRPTUFLRV9WRVJTSU9OKFsxLjExLjFdKWRubAorbTRfaWZuZGVmKFtBQ19BVVRPQ09ORl9WRVJTSU9OXSwKKyAgW200X2NvcHkoW200X1BBQ0tBR0VfVkVSU0lPTl0sIFtBQ19BVVRPQ09ORl9WRVJTSU9OXSldKWRubAorX0FNX0FVVE9DT05GX1ZFUlNJT04obTRfZGVmbihbQUNfQVVUT0NPTkZfVkVSU0lPTl0pKV0pCisKKyMgQU1fQVVYX0RJUl9FWFBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgRm9yIHByb2plY3RzIHVzaW5nIEFDX0NPTkZJR19BVVhfRElSKFtmb29dKSwgQXV0b2NvbmYgc2V0cworIyAkYWNfYXV4X2RpciB0byBgJHNyY2Rpci9mb28nLiAgSW4gb3RoZXIgcHJvamVjdHMsIGl0IGlzIHNldCB0bworIyBgJHNyY2RpcicsIGAkc3JjZGlyLy4uJywgb3IgYCRzcmNkaXIvLi4vLi4nLgorIworIyBPZiBjb3Vyc2UsIEF1dG9tYWtlIG11c3QgaG9ub3IgdGhpcyB2YXJpYWJsZSB3aGVuZXZlciBpdCBjYWxscyBhCisjIHRvb2wgZnJvbSB0aGUgYXV4aWxpYXJ5IGRpcmVjdG9yeS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgJHNyY2RpciAoYW5kCisjIHRoZXJlZm9yZSAkYWNfYXV4X2RpciBhcyB3ZWxsKSBjYW4gYmUgZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLAorIyBkZXBlbmRpbmcgb24gaG93IGNvbmZpZ3VyZSBpcyBydW4uICBUaGlzIGlzIHByZXR0eSBhbm5veWluZywgc2luY2UKKyMgaXQgbWFrZXMgJGFjX2F1eF9kaXIgcXVpdGUgdW51c2FibGUgaW4gc3ViZGlyZWN0b3JpZXM6IGluIHRoZSB0b3AKKyMgc291cmNlIGRpcmVjdG9yeSwgYW55IGZvcm0gd2lsbCB3b3JrIGZpbmUsIGJ1dCBpbiBzdWJkaXJlY3RvcmllcyBhCisjIHJlbGF0aXZlIHBhdGggbmVlZHMgdG8gYmUgYWRqdXN0ZWQgZmlyc3QuCisjCisjICRhY19hdXhfZGlyL21pc3NpbmcKKyMgICAgZmFpbHMgd2hlbiBjYWxsZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSBpZiAkYWNfYXV4X2RpciBpcyByZWxhdGl2ZQorIyAkdG9wX3NyY2Rpci8kYWNfYXV4X2Rpci9taXNzaW5nCisjICAgIGZhaWxzIGlmICRhY19hdXhfZGlyIGlzIGFic29sdXRlLAorIyAgICBmYWlscyB3aGVuIGNhbGxlZCBmcm9tIGEgc3ViZGlyZWN0b3J5IGluIGEgVlBBVEggYnVpbGQgd2l0aAorIyAgICAgICAgICBhIHJlbGF0aXZlICRhY19hdXhfZGlyCisjCisjIFRoZSByZWFzb24gb2YgdGhlIGxhdHRlciBmYWlsdXJlIGlzIHRoYXQgJHRvcF9zcmNkaXIgYW5kICRhY19hdXhfZGlyCisjIGFyZSBib3RoIHByZWZpeGVkIGJ5ICRzcmNkaXIuICBJbiBhbiBpbi1zb3VyY2UgYnVpbGQgdGhpcyBpcyB1c3VhbGx5CisjIGhhcm1sZXNzIGJlY2F1c2UgJHNyY2RpciBpcyBgLicsIGJ1dCB0aGluZ3Mgd2lsbCBicm9rZSB3aGVuIHlvdQorIyBzdGFydCBhIFZQQVRIIGJ1aWxkIG9yIHVzZSBhbiBhYnNvbHV0ZSAkc3JjZGlyLgorIworIyBTbyB3ZSBjb3VsZCB1c2Ugc29tZXRoaW5nIHNpbWlsYXIgdG8gJHRvcF9zcmNkaXIvJGFjX2F1eF9kaXIvbWlzc2luZywKKyMgaWZmIHdlIHN0cmlwIHRoZSBsZWFkaW5nICRzcmNkaXIgZnJvbSAkYWNfYXV4X2Rpci4gIFRoYXQgd291bGQgYmU6CisjICAgYW1fYXV4X2Rpcj0nXCQodG9wX3NyY2RpcikvJ2BleHByICIkYWNfYXV4X2RpciIgOiAiJHNyY2Rpci8vKlwoLipcKSJgCisjIGFuZCB0aGVuIHdlIHdvdWxkIGRlZmluZSAkTUlTU0lORyBhcworIyAgIE1JU1NJTkc9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9taXNzaW5nIgorIyBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFzIE1JU1NJTkcgaXMgbm90IGNhbGxlZCBmcm9tIGNvbmZpZ3VyZSwgYmVjYXVzZQorIyB1bmZvcnR1bmF0ZWx5ICQodG9wX3NyY2RpcikgaGFzIG5vIG1lYW5pbmcgaW4gY29uZmlndXJlLgorIyBIb3dldmVyIHRoZXJlIGFyZSBvdGhlciB2YXJpYWJsZXMsIGxpa2UgQ0MsIHdoaWNoIGFyZSBvZnRlbiB1c2VkIGluCisjIGNvbmZpZ3VyZSwgYW5kIGNvdWxkIHRoZXJlZm9yZSBub3QgdXNlIHRoaXMgImZpeGVkIiAkYWNfYXV4X2Rpci4KKyMKKyMgQW5vdGhlciBzb2x1dGlvbiwgdXNlZCBoZXJlLCBpcyB0byBhbHdheXMgZXhwYW5kICRhY19hdXhfZGlyIHRvIGFuCisjIGFic29sdXRlIFBBVEguICBUaGUgZHJhd2JhY2sgaXMgdGhhdCB1c2luZyBhYnNvbHV0ZSBwYXRocyBwcmV2ZW50IGEKKyMgY29uZmlndXJlZCB0cmVlIHRvIGJlIG1vdmVkIHdpdGhvdXQgcmVjb25maWd1cmF0aW9uLgorCitBQ19ERUZVTihbQU1fQVVYX0RJUl9FWFBBTkRdLAorW2RubCBSZWx5IG9uIGF1dG9jb25mIHRvIHNldCB1cCBDRFBBVEggcHJvcGVybHkuCitBQ19QUkVSRVEoWzIuNTBdKWRubAorIyBleHBhbmQgJGFjX2F1eF9kaXIgdG8gYW4gYWJzb2x1dGUgcGF0aAorYW1fYXV4X2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAorXSkKKworIyBBTV9DT05ESVRJT05BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NywgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA5CisKKyMgQU1fQ09ORElUSU9OQUwoTkFNRSwgU0hFTEwtQ09ORElUSU9OKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBhIGNvbmRpdGlvbmFsLgorQUNfREVGVU4oW0FNX0NPTkRJVElPTkFMXSwKK1tBQ19QUkVSRVEoMi41MilkbmwKKyBpZmVsc2UoWyQxXSwgW1RSVUVdLCAgW0FDX0ZBVEFMKFskMDogaW52YWxpZCBjb25kaXRpb246ICQxXSldLAorCVskMV0sIFtGQUxTRV0sIFtBQ19GQVRBTChbJDA6IGludmFsaWQgY29uZGl0aW9uOiAkMV0pXSlkbmwKK0FDX1NVQlNUKFskMV9UUlVFXSlkbmwKK0FDX1NVQlNUKFskMV9GQUxTRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfVFJVRV0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbJDFfRkFMU0VdKWRubAorbTRfZGVmaW5lKFtfQU1fQ09ORF9WQUxVRV8kMV0sIFskMl0pZG5sCitpZiAkMjsgdGhlbgorICAkMV9UUlVFPQorICAkMV9GQUxTRT0nIycKK2Vsc2UKKyAgJDFfVFJVRT0nIycKKyAgJDFfRkFMU0U9CitmaQorQUNfQ09ORklHX0NPTU1BTkRTX1BSRSgKK1tpZiB0ZXN0IC16ICIkeyQxX1RSVUV9IiAmJiB0ZXN0IC16ICIkeyQxX0ZBTFNFfSI7IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFtbY29uZGl0aW9uYWwgIiQxIiB3YXMgbmV2ZXIgZGVmaW5lZC4KK1VzdWFsbHkgdGhpcyBtZWFucyB0aGUgbWFjcm8gd2FzIG9ubHkgaW52b2tlZCBjb25kaXRpb25hbGx5Ll1dKQorZmldKV0pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA5CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDEwCisKKyMgVGhlcmUgYXJlIGEgZmV3IGRpcnR5IGhhY2tzIGJlbG93IHRvIGF2b2lkIGxldHRpbmcgYEFDX1BST0dfQ0MnIGJlCisjIHdyaXR0ZW4gaW4gY2xlYXIsIGluIHdoaWNoIGNhc2UgYXV0b21ha2UsIHdoZW4gcmVhZGluZyBhY2xvY2FsLm00LAorIyB3aWxsIHRoaW5rIGl0IHNlZXMgYSAqdXNlKiwgYW5kIHRoZXJlZm9yZSB3aWxsIHRyaWdnZXIgYWxsIGl0J3MKKyMgQyBzdXBwb3J0IG1hY2hpbmVyeS4gIEFsc28gbm90ZSB0aGF0IGl0IG1lYW5zIHRoYXQgYXV0b3NjYW4sIHNlZWluZworIyBDQyBldGMuIGluIHRoZSBNYWtlZmlsZSwgd2lsbCBhc2sgZm9yIGFuIEFDX1BST0dfQ0MgdXNlLi4uCisKKworIyBfQU1fREVQRU5ERU5DSUVTKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VlIGhvdyB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyBkZXBlbmRlbmN5IGNoZWNraW5nLgorIyBOQU1FIGlzICJDQyIsICJDWFgiLCAiR0NKIiwgb3IgIk9CSkMiLgorIyBXZSB0cnkgYSBmZXcgdGVjaG5pcXVlcyBhbmQgdXNlIHRoYXQgdG8gc2V0IGEgc2luZ2xlIGNhY2hlIHZhcmlhYmxlLgorIworIyBXZSBkb24ndCBBQ19SRVFVSVJFIHRoZSBjb3JyZXNwb25kaW5nIEFDX1BST0dfQ0Mgc2luY2UgdGhlIGxhdHRlciB3YXMKKyMgbW9kaWZpZWQgdG8gaW52b2tlIF9BTV9ERVBFTkRFTkNJRVMoQ0MpOyB3ZSB3b3VsZCBoYXZlIGEgY2lyY3VsYXIKKyMgZGVwZW5kZW5jeSwgYW5kIGdpdmVuIHRoYXQgdGhlIHVzZXIgaXMgbm90IGV4cGVjdGVkIHRvIHJ1biB0aGlzIG1hY3JvLAorIyBqdXN0IHJlbHkgb24gQUNfUFJPR19DQy4KK0FDX0RFRlVOKFtfQU1fREVQRU5ERU5DSUVTXSwKK1tBQ19SRVFVSVJFKFtBTV9TRVRfREVQRElSXSlkbmwKK0FDX1JFUVVJUkUoW0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSlkbmwKK0FDX1JFUVVJUkUoW0FNX01BS0VfSU5DTFVERV0pZG5sCitBQ19SRVFVSVJFKFtBTV9ERVBfVFJBQ0tdKWRubAorCitpZmVsc2UoWyQxXSwgQ0MsICAgW2RlcGNjPSIkQ0MiICAgYW1fY29tcGlsZXJfbGlzdD1dLAorICAgICAgIFskMV0sIENYWCwgIFtkZXBjYz0iJENYWCIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBPQkpDLCBbZGVwY2M9IiRPQkpDIiBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgIFskMV0sIFVQQywgIFtkZXBjYz0iJFVQQyIgIGFtX2NvbXBpbGVyX2xpc3Q9XSwKKyAgICAgICBbJDFdLCBHQ0osICBbZGVwY2M9IiRHQ0oiICBhbV9jb21waWxlcl9saXN0PSdnY2MzIGdjYyddLAorICAgICAgICAgICAgICAgICAgIFtkZXBjYz0iJCQxIiAgIGFtX2NvbXBpbGVyX2xpc3Q9XSkKKworQUNfQ0FDSEVfQ0hFQ0soW2RlcGVuZGVuY3kgc3R5bGUgb2YgJGRlcGNjXSwKKyAgICAgICAgICAgICAgIFthbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0sCitbaWYgdGVzdCAteiAiJEFNREVQX1RSVUUiICYmIHRlc3QgLWYgIiRhbV9kZXBjb21wIjsgdGhlbgorICAjIFdlIG1ha2UgYSBzdWJkaXIgYW5kIGRvIHRoZSB0ZXN0cyB0aGVyZS4gIE90aGVyd2lzZSB3ZSBjYW4gZW5kIHVwCisgICMgbWFraW5nIGJvZ3VzIGZpbGVzIHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCBhbmQgbmV2ZXIgcmVtb3ZlLiAgRm9yCisgICMgaW5zdGFuY2UgaXQgd2FzIHJlcG9ydGVkIHRoYXQgb24gSFAtVVggdGhlIGdjYyB0ZXN0IHdpbGwgZW5kIHVwCisgICMgbWFraW5nIGEgZHVtbXkgZmlsZSBuYW1lZCBgRCcgLS0gYmVjYXVzZSBgLU1EJyBtZWFucyBgcHV0IHRoZSBvdXRwdXQKKyAgIyBpbiBEJy4KKyAgbWtkaXIgY29uZnRlc3QuZGlyCisgICMgQ29weSBkZXBjb21wIHRvIHN1YmRpciBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBmaW5kIGl0IGlmIHdlJ3JlCisgICMgdXNpbmcgYSByZWxhdGl2ZSBkaXJlY3RvcnkuCisgIGNwICIkYW1fZGVwY29tcCIgY29uZnRlc3QuZGlyCisgIGNkIGNvbmZ0ZXN0LmRpcgorICAjIFdlIHdpbGwgYnVpbGQgb2JqZWN0cyBhbmQgZGVwZW5kZW5jaWVzIGluIGEgc3ViZGlyZWN0b3J5IGJlY2F1c2UKKyAgIyBpdCBoZWxwcyB0byBkZXRlY3QgaW5hcHBsaWNhYmxlIGRlcGVuZGVuY3kgbW9kZXMuICBGb3IgaW5zdGFuY2UKKyAgIyBib3RoIFRydTY0J3MgY2MgYW5kIElDQyBzdXBwb3J0IC1NRCB0byBvdXRwdXQgZGVwZW5kZW5jaWVzIGFzIGEKKyAgIyBzaWRlIGVmZmVjdCBvZiBjb21waWxhdGlvbiwgYnV0IElDQyB3aWxsIHB1dCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoaWxlIFRydTY0IHdpbGwgcHV0IHRoZW0gaW4gdGhlIG9iamVjdAorICAjIGRpcmVjdG9yeS4KKyAgbWtkaXIgc3ViCisKKyAgYW1fY3ZfJDFfZGVwZW5kZW5jaWVzX2NvbXBpbGVyX3R5cGU9bm9uZQorICBpZiB0ZXN0ICIkYW1fY29tcGlsZXJfbGlzdCIgPSAiIjsgdGhlbgorICAgICBhbV9jb21waWxlcl9saXN0PWBzZWQgLW4gWydzL14jKlwoW2EtekEtWjAtOV0qXCkpJC9cMS9wJ10gPCAuL2RlcGNvbXBgCisgIGZpCisgIGFtX191bml2ZXJzYWw9ZmFsc2UKKyAgbTRfY2FzZShbJDFdLCBbQ0NdLAorICAgIFtjYXNlICIgJGRlcGNjICIgaW4gIygKKyAgICAgKlwgLWFyY2hcICpcIC1hcmNoXCAqKSBhbV9fdW5pdmVyc2FsPXRydWUgOzsKKyAgICAgZXNhY10sCisgICAgW0NYWF0sCisgICAgW2Nhc2UgIiAkZGVwY2MgIiBpbiAjKAorICAgICAqXCAtYXJjaFwgKlwgLWFyY2hcICopIGFtX191bml2ZXJzYWw9dHJ1ZSA7OworICAgICBlc2FjXSkKKworICBmb3IgZGVwbW9kZSBpbiAkYW1fY29tcGlsZXJfbGlzdDsgZG8KKyAgICAjIFNldHVwIGEgc291cmNlIHdpdGggbWFueSBkZXBlbmRlbmNpZXMsIGJlY2F1c2Ugc29tZSBjb21waWxlcnMKKyAgICAjIGxpa2UgdG8gd3JhcCBsYXJnZSBkZXBlbmRlbmN5IGxpc3RzIG9uIGNvbHVtbiA4MCAod2l0aCBcKSwgYW5kCisgICAgIyB3ZSBzaG91bGQgbm90IGNob29zZSBhIGRlcGNvbXAgbW9kZSB3aGljaCBpcyBjb25mdXNlZCBieSB0aGlzLgorICAgICMKKyAgICAjIFdlIG5lZWQgdG8gcmVjcmVhdGUgdGhlc2UgZmlsZXMgZm9yIGVhY2ggdGVzdCwgYXMgdGhlIGNvbXBpbGVyIG1heQorICAgICMgb3ZlcndyaXRlIHNvbWUgb2YgdGhlbSB3aGVuIHRlc3Rpbmcgd2l0aCBvYnNjdXJlIGNvbW1hbmQgbGluZXMuCisgICAgIyBUaGlzIGhhcHBlbnMgYXQgbGVhc3Qgd2l0aCB0aGUgQUlYIEMgY29tcGlsZXIuCisgICAgOiA+IHN1Yi9jb25mdGVzdC5jCisgICAgZm9yIGkgaW4gMSAyIDMgNCA1IDY7IGRvCisgICAgICBlY2hvICcjaW5jbHVkZSAiY29uZnRzdCckaScuaCInID4+IHN1Yi9jb25mdGVzdC5jCisgICAgICAjIFVzaW5nIGA6ID4gc3ViL2NvbmZ0c3QkaS5oJyBjcmVhdGVzIG9ubHkgc3ViL2NvbmZ0c3QxLmggd2l0aAorICAgICAgIyBTb2xhcmlzIDgncyB7L3Vzcix9L2Jpbi9zaC4KKyAgICAgIHRvdWNoIHN1Yi9jb25mdHN0JGkuaAorICAgIGRvbmUKKyAgICBlY2hvICIke2FtX19pbmNsdWRlfSAke2FtX19xdW90ZX1zdWIvY29uZnRlc3QuUG8ke2FtX19xdW90ZX0iID4gY29uZm1mCisKKyAgICAjIFdlIGNoZWNrIHdpdGggYC1jJyBhbmQgYC1vJyBmb3IgdGhlIHNha2Ugb2YgdGhlICJkYXNobXN0ZG91dCIKKyAgICAjIG1vZGUuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgU3VuUHJvIEMrKyBjb21waWxlciBkb2VzIG5vdCBwcm9wZXJseQorICAgICMgaGFuZGxlIGAtTSAtbycsIGFuZCB3ZSBuZWVkIHRvIGRldGVjdCB0aGlzLiAgQWxzbywgc29tZSBJbnRlbAorICAgICMgdmVyc2lvbnMgaGFkIHRyb3VibGUgd2l0aCBvdXRwdXQgaW4gc3ViZGlycworICAgIGFtX19vYmo9c3ViL2NvbmZ0ZXN0LiR7T0JKRVhULW99CisgICAgYW1fX21pbnVzX29iaj0iLW8gJGFtX19vYmoiCisgICAgY2FzZSAkZGVwbW9kZSBpbgorICAgIGdjYykKKyAgICAgICMgVGhpcyBkZXBtb2RlIGNhdXNlcyBhIGNvbXBpbGVyIHJhY2UgaW4gdW5pdmVyc2FsIG1vZGUuCisgICAgICB0ZXN0ICIkYW1fX3VuaXZlcnNhbCIgPSBmYWxzZSB8fCBjb250aW51ZQorICAgICAgOzsKKyAgICBub3NpZGVlZmZlY3QpCisgICAgICAjIGFmdGVyIHRoaXMgdGFnLCBtZWNoYW5pc21zIGFyZSBub3QgYnkgc2lkZS1lZmZlY3QsIHNvIHRoZXknbGwKKyAgICAgICMgb25seSBiZSB1c2VkIHdoZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgIGlmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciID0geHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBlbHNlCisJYnJlYWsKKyAgICAgIGZpCisgICAgICA7OworICAgIG1zdmlzdWFsY3BwIHwgbXN2Y21zeXMpCisgICAgICAjIFRoaXMgY29tcGlsZXIgd29uJ3QgZ3JvayBgLWMgLW8nLCBidXQgYWxzbywgdGhlIG1pbnVzbyB0ZXN0IGhhcworICAgICAgIyBub3QgcnVuIHlldC4gIFRoZXNlIGRlcG1vZGVzIGFyZSBsYXRlIGVub3VnaCBpbiB0aGUgZ2FtZSwgYW5kCisgICAgICAjIHNvIHdlYWsgdGhhdCB0aGVpciBmdW5jdGlvbmluZyBzaG91bGQgbm90IGJlIGltcGFjdGVkLgorICAgICAgYW1fX29iaj1jb25mdGVzdC4ke09CSkVYVC1vfQorICAgICAgYW1fX21pbnVzX29iaj0KKyAgICAgIDs7CisgICAgbm9uZSkgYnJlYWsgOzsKKyAgICBlc2FjCisgICAgaWYgZGVwbW9kZT0kZGVwbW9kZSBcCisgICAgICAgc291cmNlPXN1Yi9jb25mdGVzdC5jIG9iamVjdD0kYW1fX29iaiBcCisgICAgICAgZGVwZmlsZT1zdWIvY29uZnRlc3QuUG8gdG1wZGVwZmlsZT1zdWIvY29uZnRlc3QuVFBvIFwKKyAgICAgICAkU0hFTEwgLi9kZXBjb21wICRkZXBjYyAtYyAkYW1fX21pbnVzX29iaiBzdWIvY29uZnRlc3QuYyBcCisgICAgICAgICA+L2Rldi9udWxsIDI+Y29uZnRlc3QuZXJyICYmCisgICAgICAgZ3JlcCBzdWIvY29uZnRzdDEuaCBzdWIvY29uZnRlc3QuUG8gPiAvZGV2L251bGwgMj4mMSAmJgorICAgICAgIGdyZXAgc3ViL2NvbmZ0c3Q2Lmggc3ViL2NvbmZ0ZXN0LlBvID4gL2Rldi9udWxsIDI+JjEgJiYKKyAgICAgICBncmVwICRhbV9fb2JqIHN1Yi9jb25mdGVzdC5QbyA+IC9kZXYvbnVsbCAyPiYxICYmCisgICAgICAgJHtNQUtFLW1ha2V9IC1zIC1mIGNvbmZtZiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAjIGljYyBkb2Vzbid0IGNob2tlIG9uIHVua25vd24gb3B0aW9ucywgaXQgd2lsbCBqdXN0IGlzc3VlIHdhcm5pbmdzCisgICAgICAjIG9yIHJlbWFya3MgKGV2ZW4gd2l0aCAtV2Vycm9yKS4gIFNvIHdlIGdyZXAgc3RkZXJyIGZvciBhbnkgbWVzc2FnZQorICAgICAgIyB0aGF0IHNheXMgYW4gb3B0aW9uIHdhcyBpZ25vcmVkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICAjIFdoZW4gZ2l2ZW4gLU1QLCBpY2MgNy4wIGFuZCA3LjEgY29tcGxhaW4gdGh1c2x5OgorICAgICAgIyAgIGljYzogQ29tbWFuZCBsaW5lIHdhcm5pbmc6IGlnbm9yaW5nIG9wdGlvbiAnLU0nOyBubyBhcmd1bWVudCByZXF1aXJlZAorICAgICAgIyBUaGUgZGlhZ25vc2lzIGNoYW5nZWQgaW4gaWNjIDguMDoKKyAgICAgICMgICBpY2M6IENvbW1hbmQgbGluZSByZW1hcms6IG9wdGlvbiAnLU1QJyBub3Qgc3VwcG9ydGVkCisgICAgICBpZiAoZ3JlcCAnaWdub3Jpbmcgb3B0aW9uJyBjb25mdGVzdC5lcnIgfHwKKyAgICAgICAgICBncmVwICdub3Qgc3VwcG9ydGVkJyBjb25mdGVzdC5lcnIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgICAgICAgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPSRkZXBtb2RlCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGZpCisgIGRvbmUKKworICBjZCAuLgorICBybSAtcmYgY29uZnRlc3QuZGlyCitlbHNlCisgIGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlPW5vbmUKK2ZpCitdKQorQUNfU1VCU1QoWyQxREVQTU9ERV0sIFtkZXBtb2RlPSRhbV9jdl8kMV9kZXBlbmRlbmNpZXNfY29tcGlsZXJfdHlwZV0pCitBTV9DT05ESVRJT05BTChbYW1fX2Zhc3RkZXAkMV0sIFsKKyAgdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vIFwKKyAgJiYgdGVzdCAiJGFtX2N2XyQxX2RlcGVuZGVuY2llc19jb21waWxlcl90eXBlIiA9IGdjYzNdKQorXSkKKworCisjIEFNX1NFVF9ERVBESVIKKyMgLS0tLS0tLS0tLS0tLQorIyBDaG9vc2UgYSBkaXJlY3RvcnkgbmFtZSBmb3IgZGVwZW5kZW5jeSBmaWxlcy4KKyMgVGhpcyBtYWNybyBpcyBBQ19SRVFVSVJFZCBpbiBfQU1fREVQRU5ERU5DSUVTCitBQ19ERUZVTihbQU1fU0VUX0RFUERJUl0sCitbQUNfUkVRVUlSRShbQU1fU0VUX0xFQURJTkdfRE9UXSlkbmwKK0FDX1NVQlNUKFtERVBESVJdLCBbIiR7YW1fX2xlYWRpbmdfZG90fWRlcHMiXSlkbmwKK10pCisKKworIyBBTV9ERVBfVFJBQ0sKKyMgLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbQU1fREVQX1RSQUNLXSwKK1tBQ19BUkdfRU5BQkxFKGRlcGVuZGVuY3ktdHJhY2tpbmcsCitbICAtLWRpc2FibGUtZGVwZW5kZW5jeS10cmFja2luZyAgc3BlZWRzIHVwIG9uZS10aW1lIGJ1aWxkCisgIC0tZW5hYmxlLWRlcGVuZGVuY3ktdHJhY2tpbmcgICBkbyBub3QgcmVqZWN0IHNsb3cgZGVwZW5kZW5jeSBleHRyYWN0b3JzXSkKK2lmIHRlc3QgIngkZW5hYmxlX2RlcGVuZGVuY3lfdHJhY2tpbmciICE9IHhubzsgdGhlbgorICBhbV9kZXBjb21wPSIkYWNfYXV4X2Rpci9kZXBjb21wIgorICBBTURFUEJBQ0tTTEFTSD0nXCcKK2ZpCitBTV9DT05ESVRJT05BTChbQU1ERVBdLCBbdGVzdCAieCRlbmFibGVfZGVwZW5kZW5jeV90cmFja2luZyIgIT0geG5vXSkKK0FDX1NVQlNUKFtBTURFUEJBQ0tTTEFTSF0pZG5sCitfQU1fU1VCU1RfTk9UTUFLRShbQU1ERVBCQUNLU0xBU0hdKWRubAorXSkKKworIyBHZW5lcmF0ZSBjb2RlIHRvIHNldCB1cCBkZXBlbmRlbmN5IHRyYWNraW5nLiAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOAorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjc2VyaWFsIDUKKworIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKK1t7CisgICMgQXV0b2NvbmYgMi42MiBxdW90ZXMgLS1maWxlIGFyZ3VtZW50cyBmb3IgZXZhbCwgYnV0IG5vdCB3aGVuIGZpbGVzCisgICMgYXJlIGxpc3RlZCB3aXRob3V0IC0tZmlsZS4gIExldCdzIHBsYXkgc2FmZSBhbmQgb25seSBlbmFibGUgdGhlIGV2YWwKKyAgIyBpZiB3ZSBkZXRlY3QgdGhlIHF1b3RpbmcuCisgIGNhc2UgJENPTkZJR19GSUxFUyBpbgorICAqXCcqKSBldmFsIHNldCB4ICIkQ09ORklHX0ZJTEVTIiA7OworICAqKSAgIHNldCB4ICRDT05GSUdfRklMRVMgOzsKKyAgZXNhYworICBzaGlmdAorICBmb3IgbWYKKyAgZG8KKyAgICAjIFN0cmlwIE1GIHNvIHdlIGVuZCB1cCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgIG1mPWBlY2hvICIkbWYiIHwgc2VkIC1lICdzLzouKiQvLydgCisgICAgIyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYW4gQXV0b21ha2UgZ2VuZXJhdGVkIE1ha2VmaWxlIG9yIG5vdC4KKyAgICAjIFdlIHVzZWQgdG8gbWF0Y2ggb25seSB0aGUgZmlsZXMgbmFtZWQgYE1ha2VmaWxlLmluJywgYnV0CisgICAgIyBzb21lIHBlb3BsZSByZW5hbWUgdGhlbTsgc28gaW5zdGVhZCB3ZSBsb29rIGF0IHRoZSBmaWxlIGNvbnRlbnQuCisgICAgIyBHcmVwJ2luZyB0aGUgZmlyc3QgbGluZSBpcyBub3QgZW5vdWdoOiBzb21lIHBlb3BsZSBwb3N0LXByb2Nlc3MKKyAgICAjIGVhY2ggTWFrZWZpbGUuaW4gYW5kIGFkZCBhIG5ldyBsaW5lIG9uIHRvcCBvZiBlYWNoIGZpbGUgdG8gc2F5IHNvLgorICAgICMgR3JlcCdpbmcgdGhlIHdob2xlIGZpbGUgaXMgbm90IGdvb2QgZWl0aGVyOiBBSVggZ3JlcCBoYXMgYSBsaW5lCisgICAgIyBsaW1pdCBvZiAyMDQ4LCBidXQgYWxsIHNlZCdzIHdlIGtub3cgaGF2ZSB1bmRlcnN0YW5kIGF0IGxlYXN0IDQwMDAuCisgICAgaWYgc2VkIC1uICdzLF4jLipnZW5lcmF0ZWQgYnkgYXV0b21ha2UuKixYLHAnICIkbWYiIHwgZ3JlcCBYID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgICAgZGlycGFydD1gQVNfRElSTkFNRSgiJG1mIilgCisgICAgZWxzZQorICAgICAgY29udGludWUKKyAgICBmaQorICAgICMgRXh0cmFjdCB0aGUgZGVmaW5pdGlvbiBvZiBERVBESVIsIGFtX19pbmNsdWRlLCBhbmQgYW1fX3F1b3RlCisgICAgIyBmcm9tIHRoZSBNYWtlZmlsZSB3aXRob3V0IHJ1bm5pbmcgYG1ha2UnLgorICAgIERFUERJUj1gc2VkIC1uICdzL15ERVBESVIgPSAvL3AnIDwgIiRtZiJgCisgICAgdGVzdCAteiAiJERFUERJUiIgJiYgY29udGludWUKKyAgICBhbV9faW5jbHVkZT1gc2VkIC1uICdzL15hbV9faW5jbHVkZSA9IC8vcCcgPCAiJG1mImAKKyAgICB0ZXN0IC16ICJhbV9faW5jbHVkZSIgJiYgY29udGludWUKKyAgICBhbV9fcXVvdGU9YHNlZCAtbiAncy9eYW1fX3F1b3RlID0gLy9wJyA8ICIkbWYiYAorICAgICMgV2hlbiB1c2luZyBhbnNpMmtuciwgVSBtYXkgYmUgZW1wdHkgb3IgYW4gdW5kZXJzY29yZTsgZXhwYW5kIGl0CisgICAgVT1gc2VkIC1uICdzL15VID0gLy9wJyA8ICIkbWYiYAorICAgICMgRmluZCBhbGwgZGVwZW5kZW5jeSBvdXRwdXQgZmlsZXMsIHRoZXkgYXJlIGluY2x1ZGVkIGZpbGVzIHdpdGgKKyAgICAjICQoREVQRElSKSBpbiB0aGVpciBuYW1lcy4gIFdlIGludm9rZSBzZWQgdHdpY2UgYmVjYXVzZSBpdCBpcyB0aGUKKyAgICAjIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGNoYW5naW5nICQoREVQRElSKSB0byBpdHMgYWN0dWFsIHZhbHVlIGluIHRoZQorICAgICMgZXhwYW5zaW9uLgorICAgIGZvciBmaWxlIGluIGBzZWQgLW4gIgorICAgICAgcy9eJGFtX19pbmNsdWRlICRhbV9fcXVvdGVcKC4qKERFUERJUikuKlwpJGFtX19xdW90ZSInJC9cMS9wJyA8IiRtZiIgfCBcCisJIHNlZCAtZSAncy9cJChERVBESVIpLyciJERFUERJUiInL2cnIC1lICdzL1wkVS8nIiRVIicvZydgOyBkbworICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCisgICAgICB0ZXN0IC1mICIkZGlycGFydC8kZmlsZSIgJiYgY29udGludWUKKyAgICAgIGZkaXI9YEFTX0RJUk5BTUUoWyIkZmlsZSJdKWAKKyAgICAgIEFTX01LRElSX1AoWyRkaXJwYXJ0LyRmZGlyXSkKKyAgICAgICMgZWNobyAiY3JlYXRpbmcgJGRpcnBhcnQvJGZpbGUiCisgICAgICBlY2hvICcjIGR1bW15JyA+ICIkZGlycGFydC8kZmlsZSIKKyAgICBkb25lCisgIGRvbmUKK30KK10pIyBfQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFMKKworCisjIEFNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgbWFjcm8gc2hvdWxkIG9ubHkgYmUgaW52b2tlZCBvbmNlIC0tIHVzZSB2aWEgQUNfUkVRVUlSRS4KKyMKKyMgVGhpcyBjb2RlIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhdXRvbWF0aWMgZGVwZW5kZW5jeSB0cmFja2luZworIyBpcyBlbmFibGVkLiAgRklYTUUuICBUaGlzIGNyZWF0ZXMgZWFjaCBgLlAnIGZpbGUgdGhhdCB3ZSB3aWxsCisjIG5lZWQgaW4gb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBkZXBlbmRlbmN5IGhhbmRsaW5nIGNvZGUuCitBQ19ERUZVTihbQU1fT1VUUFVUX0RFUEVOREVOQ1lfQ09NTUFORFNdLAorW0FDX0NPTkZJR19DT01NQU5EUyhbZGVwZmlsZXNdLAorICAgICBbdGVzdCB4IiRBTURFUF9UUlVFIiAhPSB4IiIgfHwgX0FNX09VVFBVVF9ERVBFTkRFTkNZX0NPTU1BTkRTXSwKKyAgICAgW0FNREVQX1RSVUU9IiRBTURFUF9UUlVFIiBhY19hdXhfZGlyPSIkYWNfYXV4X2RpciJdKQorXSkKKworIyBEbyBhbGwgdGhlIHdvcmsgZm9yIEF1dG9tYWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwKKyMgMjAwNSwgMjAwNiwgMjAwOCwgMjAwOSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAxNgorCisjIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaC4gIFNvbWUgY2hlY2tzIGFyZSBvbmx5IG5lZWRlZCBpZgorIyB5b3VyIHBhY2thZ2UgZG9lcyBjZXJ0YWluIHRoaW5ncy4gIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgorCisjIEFNX0lOSVRfQVVUT01BS0UoUEFDS0FHRSwgVkVSU0lPTiwgW05PLURFRklORV0pCisjIEFNX0lOSVRfQVVUT01BS0UoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgY2FsbCB3aXRoIFBBQ0tBR0UgYW5kIFZFUlNJT04gYXJndW1lbnRzIGlzIHRoZSBvbGQgc3R5bGUKKyMgY2FsbCAocHJlIGF1dG9jb25mLTIuNTApLCB3aGljaCBpcyBiZWluZyBwaGFzZWQgb3V0LiAgUEFDS0FHRQorIyBhbmQgVkVSU0lPTiBzaG91bGQgbm93IGJlIHBhc3NlZCB0byBBQ19JTklUIGFuZCByZW1vdmVkIGZyb20KKyMgdGhlIGNhbGwgdG8gQU1fSU5JVF9BVVRPTUFLRS4KKyMgV2Ugc3VwcG9ydCBib3RoIGNhbGwgc3R5bGVzIGZvciB0aGUgdHJhbnNpdGlvbi4gIEFmdGVyCisjIHRoZSBuZXh0IEF1dG9tYWtlIHJlbGVhc2UsIEF1dG9jb25mIGNhbiBtYWtlIHRoZSBBQ19JTklUCisjIGFyZ3VtZW50cyBtYW5kYXRvcnksIGFuZCB0aGVuIHdlIGNhbiBkZXBlbmQgb24gYSBuZXcgQXV0b2NvbmYKKyMgcmVsZWFzZSBhbmQgZHJvcCB0aGUgb2xkIGNhbGwgc3VwcG9ydC4KK0FDX0RFRlVOKFtBTV9JTklUX0FVVE9NQUtFXSwKK1tBQ19QUkVSRVEoWzIuNjJdKWRubAorZG5sIEF1dG9jb25mIHdhbnRzIHRvIGRpc2FsbG93IEFNXyBuYW1lcy4gIFdlIGV4cGxpY2l0bHkgYWxsb3cKK2RubCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0LgorbTRfcGF0dGVybl9hbGxvdyhbXkFNX1tBLVpdK0ZMQUdTJF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfQ1VSUkVOVF9BVVRPTUFLRV9WRVJTSU9OXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pZG5sCitpZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiOyB0aGVuCisgICMgVXNlIC1JJChzcmNkaXIpIG9ubHkgd2hlbiAkKHNyY2RpcikgIT0gLiwgc28gdGhhdCBtYWtlJ3Mgb3V0cHV0CisgICMgaXMgbm90IHBvbGx1dGVkIHdpdGggcmVwZWF0ZWQgIi1JLiIKKyAgQUNfU1VCU1QoW2FtX19pc3JjXSwgWycgLUkkKHNyY2RpciknXSlfQU1fU1VCU1RfTk9UTUFLRShbYW1fX2lzcmNdKWRubAorICAjIHRlc3QgdG8gc2VlIGlmIHNyY2RpciBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgaWYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KKyAgICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCisgIGZpCitmaQorCisjIHRlc3Qgd2hldGhlciB3ZSBoYXZlIGN5Z3BhdGgKK2lmIHRlc3QgLXogIiRDWUdQQVRIX1ciOyB0aGVuCisgIGlmIChjeWdwYXRoIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIENZR1BBVEhfVz0nY3lncGF0aCAtdycKKyAgZWxzZQorICAgIENZR1BBVEhfVz1lY2hvCisgIGZpCitmaQorQUNfU1VCU1QoW0NZR1BBVEhfV10pCisKKyMgRGVmaW5lIHRoZSBpZGVudGl0eSBvZiB0aGUgcGFja2FnZS4KK2RubCBEaXN0aW5ndWlzaCBiZXR3ZWVuIG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGNhbGxzLgorbTRfaWZ2YWwoWyQyXSwKK1ttNF9pZnZhbChbJDNdLCBbX0FNX1NFVF9PUFRJT04oW25vLWRlZmluZV0pXSlkbmwKKyBBQ19TVUJTVChbUEFDS0FHRV0sIFskMV0pZG5sCisgQUNfU1VCU1QoW1ZFUlNJT05dLCBbJDJdKV0sCitbX0FNX1NFVF9PUFRJT05TKFskMV0pZG5sCitkbmwgRGlhZ25vc2Ugb2xkLXN0eWxlIEFDX0lOSVQgd2l0aCBuZXctc3R5bGUgQU1fQVVUT01BS0VfSU5JVC4KK200X2lmKG00X2lmZGVmKFtBQ19QQUNLQUdFX05BTUVdLCAxKW00X2lmZGVmKFtBQ19QQUNLQUdFX1ZFUlNJT05dLCAxKSwgMTEsLAorICBbbTRfZmF0YWwoW0FDX0lOSVQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHBhY2thZ2UgYW5kIHZlcnNpb24gYXJndW1lbnRzXSldKWRubAorIEFDX1NVQlNUKFtQQUNLQUdFXSwgWydBQ19QQUNLQUdFX1RBUk5BTUUnXSlkbmwKKyBBQ19TVUJTVChbVkVSU0lPTl0sIFsnQUNfUEFDS0FHRV9WRVJTSU9OJ10pXSlkbmwKKworX0FNX0lGX09QVElPTihbbm8tZGVmaW5lXSwsCitbQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQorIEFDX0RFRklORV9VTlFVT1RFRChWRVJTSU9OLCAiJFZFUlNJT04iLCBbVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZV0pXSlkbmwKKworIyBTb21lIHRvb2xzIEF1dG9tYWtlIG5lZWRzLgorQUNfUkVRVUlSRShbQU1fU0FOSVRZX0NIRUNLXSlkbmwKK0FDX1JFUVVJUkUoW0FDX0FSR19QUk9HUkFNXSlkbmwKK0FNX01JU1NJTkdfUFJPRyhBQ0xPQ0FMLCBhY2xvY2FsLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYpCitBTV9NSVNTSU5HX1BST0coQVVUT01BS0UsIGF1dG9tYWtlLSR7YW1fX2FwaV92ZXJzaW9ufSkKK0FNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyKQorQU1fTUlTU0lOR19QUk9HKE1BS0VJTkZPLCBtYWtlaW5mbykKK0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCitBQ19SRVFVSVJFKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdKWRubAorQUNfUkVRVUlSRShbQU1fUFJPR19NS0RJUl9QXSlkbmwKKyMgV2UgbmVlZCBhd2sgZm9yIHRoZSAiY2hlY2siIHRhcmdldC4gIFRoZSBzeXN0ZW0gImF3ayIgaXMgYmFkIG9uCisjIHNvbWUgcGxhdGZvcm1zLgorQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NQUtFX1NFVF0pZG5sCitBQ19SRVFVSVJFKFtBTV9TRVRfTEVBRElOR19ET1RdKWRubAorX0FNX0lGX09QVElPTihbdGFyLXVzdGFyXSwgW19BTV9QUk9HX1RBUihbdXN0YXJdKV0sCisJICAgICAgW19BTV9JRl9PUFRJT04oW3Rhci1wYXhdLCBbX0FNX1BST0dfVEFSKFtwYXhdKV0sCisJCQkgICAgIFtfQU1fUFJPR19UQVIoW3Y3XSldKV0pCitfQU1fSUZfT1BUSU9OKFtuby1kZXBlbmRlbmNpZXNdLCwKK1tBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19DQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NDXSwKKwkJCSAgZGVmbihbQUNfUFJPR19DQ10pW19BTV9ERVBFTkRFTkNJRVMoQ0MpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfQ1hYXSwKKwkJICBbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSwKKwkJICBbZGVmaW5lKFtBQ19QUk9HX0NYWF0sCisJCQkgIGRlZm4oW0FDX1BST0dfQ1hYXSlbX0FNX0RFUEVOREVOQ0lFUyhDWFgpXSldKWRubAorQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfT0JKQ10sCisJCSAgW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldLAorCQkgIFtkZWZpbmUoW0FDX1BST0dfT0JKQ10sCisJCQkgIGRlZm4oW0FDX1BST0dfT0JKQ10pW19BTV9ERVBFTkRFTkNJRVMoT0JKQyldKV0pZG5sCitdKQorX0FNX0lGX09QVElPTihbc2lsZW50LXJ1bGVzXSwgW0FDX1JFUVVJUkUoW0FNX1NJTEVOVF9SVUxFU10pXSlkbmwKK2RubCBUaGUgYHBhcmFsbGVsLXRlc3RzJyBkcml2ZXIgbWF5IG5lZWQgdG8ga25vdyBhYm91dCBFWEVFWFQsIHNvIGFkZCB0aGUKK2RubCBgYW1fX0VYRUVYVCcgY29uZGl0aW9uYWwgaWYgX0FNX0NPTVBJTEVSX0VYRUVYVCB3YXMgc2Vlbi4gIFRoaXMgbWFjcm8KK2RubCBpcyBob29rZWQgb250byBfQUNfQ09NUElMRVJfRVhFRVhUIGVhcmx5LCBzZWUgYmVsb3cuCitBQ19DT05GSUdfQ09NTUFORFNfUFJFKGRubAorW200X3Byb3ZpZGVfaWYoW19BTV9DT01QSUxFUl9FWEVFWFRdLAorICBbQU1fQ09ORElUSU9OQUwoW2FtX19FWEVFWFRdLCBbdGVzdCAtbiAiJEVYRUVYVCJdKV0pXSlkbmwKK10pCisKK2RubCBIb29rIGludG8gYF9BQ19DT01QSUxFUl9FWEVFWFQnIGVhcmx5IHRvIGxlYXJuIGl0cyBleHBhbnNpb24uICBEbyBub3QKK2RubCBhZGQgdGhlIGNvbmRpdGlvbmFsIHJpZ2h0IGhlcmUsIGFzIF9BQ19DT01QSUxFUl9FWEVFWFQgbWF5IGJlIGZ1cnRoZXIKK2RubCBtYW5nbGVkIGJ5IEF1dG9jb25mIGFuZCBydW4gaW4gYSBzaGVsbCBjb25kaXRpb25hbCBzdGF0ZW1lbnQuCittNF9kZWZpbmUoW19BQ19DT01QSUxFUl9FWEVFWFRdLAorbTRfZGVmbihbX0FDX0NPTVBJTEVSX0VYRUVYVF0pW200X3Byb3ZpZGUoW19BTV9DT01QSUxFUl9FWEVFWFRdKV0pCisKKworIyBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgorIyBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKKyMgdGhhdCBpcyBnZW5lcmF0ZWQuICBUaGUgc3RhbXAgZmlsZXMgYXJlIG51bWJlcmVkIHRvIGhhdmUgZGlmZmVyZW50IG5hbWVzLgorCisjIEF1dG9jb25mIGNhbGxzIF9BQ19BTV9DT05GSUdfSEVBREVSX0hPT0sgKHdoZW4gZGVmaW5lZCkgaW4gdGhlCisjIGxvb3Agd2hlcmUgY29uZmlnLnN0YXR1cyBjcmVhdGVzIHRoZSBoZWFkZXJzLCBzbyB3ZSBjYW4gZ2VuZXJhdGUKKyMgb3VyIHN0YW1wIGZpbGVzIHRoZXJlLgorQUNfREVGVU4oW19BQ19BTV9DT05GSUdfSEVBREVSX0hPT0tdLAorWyMgQ29tcHV0ZSAkMSdzIGluZGV4IGluICRjb25maWdfaGVhZGVycy4KK19hbV9hcmc9JDEKK19hbV9zdGFtcF9jb3VudD0xCitmb3IgX2FtX2hlYWRlciBpbiAkY29uZmlnX2hlYWRlcnMgOjsgZG8KKyAgY2FzZSAkX2FtX2hlYWRlciBpbgorICAgICRfYW1fYXJnIHwgJF9hbV9hcmc6KiApCisgICAgICBicmVhayA7OworICAgICogKQorICAgICAgX2FtX3N0YW1wX2NvdW50PWBleHByICRfYW1fc3RhbXBfY291bnQgKyAxYCA7OworICBlc2FjCitkb25lCitlY2hvICJ0aW1lc3RhbXAgZm9yICRfYW1fYXJnIiA+YEFTX0RJUk5BTUUoWyIkX2FtX2FyZyJdKWAvc3RhbXAtaFtdJF9hbV9zdGFtcF9jb3VudF0pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAzLCAyMDA1LCAyMDA4ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1BST0dfSU5TVEFMTF9TSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVmaW5lICRpbnN0YWxsX3NoLgorQUNfREVGVU4oW0FNX1BST0dfSU5TVEFMTF9TSF0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAoraWYgdGVzdCB4IiR7aW5zdGFsbF9zaH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBpbnN0YWxsX3NoPSJcJHtTSEVMTH0gJyRhbV9hdXhfZGlyL2luc3RhbGwtc2gnIiA7OworICAqKQorICAgIGluc3RhbGxfc2g9Ilwke1NIRUxMfSAkYW1fYXV4X2Rpci9pbnN0YWxsLXNoIgorICBlc2FjCitmaQorQUNfU1VCU1QoaW5zdGFsbF9zaCldKQorCisjIENvcHlyaWdodCAoQykgMjAwMywgMjAwNSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIENoZWNrIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgZmlsZS1zeXN0ZW0gc3VwcG9ydHMgZmlsZW5hbWVzCisjIHdpdGggYSBsZWFkaW5nIGRvdC4gIEZvciBpbnN0YW5jZSBNUy1ET1MgZG9lc24ndC4KK0FDX0RFRlVOKFtBTV9TRVRfTEVBRElOR19ET1RdLAorW3JtIC1yZiAudHN0IDI+L2Rldi9udWxsCitta2RpciAudHN0IDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC50c3Q7IHRoZW4KKyAgYW1fX2xlYWRpbmdfZG90PS4KK2Vsc2UKKyAgYW1fX2xlYWRpbmdfZG90PV8KK2ZpCitybWRpciAudHN0IDI+L2Rldi9udWxsCitBQ19TVUJTVChbYW1fX2xlYWRpbmdfZG90XSldKQorCisjIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4gICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjIEZyb20gSmltIE1leWVyaW5nCisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDUKKworIyBBTV9NQUlOVEFJTkVSX01PREUoW0RFRkFVTFQtTU9ERV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29udHJvbCBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcy4KKyMgRGVmYXVsdCBpcyB0byBkaXNhYmxlIHRoZW0sIHVubGVzcyBgZW5hYmxlJyBpcyBwYXNzZWQgbGl0ZXJhbGx5LgorIyBGb3Igc3ltbWV0cnksIGBkaXNhYmxlJyBtYXkgYmUgcGFzc2VkIGFzIHdlbGwuICBBbnl3YXksIHRoZSB1c2VyCisjIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSAtLWVuYWJsZS8tLWRpc2FibGUgc3dpdGNoLgorQUNfREVGVU4oW0FNX01BSU5UQUlORVJfTU9ERV0sCitbbTRfY2FzZShtNF9kZWZhdWx0KFskMV0sIFtkaXNhYmxlXSksCisgICAgICAgW2VuYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZGlzYWJsZV0pXSwKKyAgICAgICBbZGlzYWJsZV0sIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSldLAorICAgICAgIFttNF9kZWZpbmUoW2FtX21haW50YWluZXJfb3RoZXJdLCBbZW5hYmxlXSkKKyAgICAgICAgbTRfd2Fybihbc3ludGF4XSwgW3VuZXhwZWN0ZWQgYXJndW1lbnQgdG8gQU1AJnRAX01BSU5UQUlORVJfTU9ERTogJDFdKV0pCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYW1fbWFpbnRhaW5lcl9vdGhlciBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCisgIGRubCBtYWludGFpbmVyLW1vZGUncyBkZWZhdWx0IGlzICdkaXNhYmxlJyB1bmxlc3MgJ2VuYWJsZScgaXMgcGFzc2VkCisgIEFDX0FSR19FTkFCTEUoW21haW50YWluZXItbW9kZV0sCitbICAtLV1bYW1fbWFpbnRhaW5lcl9vdGhlcl1bLW1haW50YWluZXItbW9kZSAgYW1fbWFpbnRhaW5lcl9vdGhlciBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAorCQkJICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKKyAgICAgIFtVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWxdLAorICAgICAgW1VTRV9NQUlOVEFJTkVSX01PREU9XW00X2lmKGFtX21haW50YWluZXJfb3RoZXIsIFtlbmFibGVdLCBbbm9dLCBbeWVzXSkpCisgIEFDX01TR19SRVNVTFQoWyRVU0VfTUFJTlRBSU5FUl9NT0RFXSkKKyAgQU1fQ09ORElUSU9OQUwoW01BSU5UQUlORVJfTU9ERV0sIFt0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzXSkKKyAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCisgIEFDX1NVQlNUKFtNQUlOVF0pZG5sCitdCispCisKK0FVX0RFRlVOKFtqbV9NQUlOVEFJTkVSX01PREVdLCBbQU1fTUFJTlRBSU5FUl9NT0RFXSkKKworIyBDaGVjayB0byBzZWUgaG93ICdtYWtlJyB0cmVhdHMgaW5jbHVkZXMuCSAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQKKworIyBBTV9NQUtFX0lOQ0xVREUoKQorIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaG93IG1ha2UgdHJlYXRzIGluY2x1ZGVzLgorQUNfREVGVU4oW0FNX01BS0VfSU5DTFVERV0sCitbYW1fbWFrZT0ke01BS0UtbWFrZX0KK2NhdCA+IGNvbmZpbmMgPDwgJ0VORCcKK2FtX19kb2l0OgorCUBlY2hvIHRoaXMgaXMgdGhlIGFtX19kb2l0IHRhcmdldAorLlBIT05ZOiBhbV9fZG9pdAorRU5ECisjIElmIHdlIGRvbid0IGZpbmQgYW4gaW5jbHVkZSBkaXJlY3RpdmUsIGp1c3QgY29tbWVudCBvdXQgdGhlIGNvZGUuCitBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgJGFtX21ha2VdKQorYW1fX2luY2x1ZGU9IiMiCithbV9fcXVvdGU9CitfYW1fcmVzdWx0PW5vbmUKKyMgRmlyc3QgdHJ5IEdOVSBtYWtlIHN0eWxlIGluY2x1ZGUuCitlY2hvICJpbmNsdWRlIGNvbmZpbmMiID4gY29uZm1mCisjIElnbm9yZSBhbGwga2luZHMgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJvbSBgbWFrZScuCitjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgIGFtX19pbmNsdWRlPWluY2x1ZGUKKyAgYW1fX3F1b3RlPQorICBfYW1fcmVzdWx0PUdOVQorICA7OworZXNhYworIyBOb3cgdHJ5IEJTRCBtYWtlIHN0eWxlIGluY2x1ZGUuCitpZiB0ZXN0ICIkYW1fX2luY2x1ZGUiID0gIiMiOyB0aGVuCisgICBlY2hvICcuaW5jbHVkZSAiY29uZmluYyInID4gY29uZm1mCisgICBjYXNlIGAkYW1fbWFrZSAtcyAtZiBjb25mbWYgMj4gL2Rldi9udWxsYCBpbiAjKAorICAgKnRoZVwgYW1fX2RvaXRcIHRhcmdldCopCisgICAgIGFtX19pbmNsdWRlPS5pbmNsdWRlCisgICAgIGFtX19xdW90ZT0iXCIiCisgICAgIF9hbV9yZXN1bHQ9QlNECisgICAgIDs7CisgICBlc2FjCitmaQorQUNfU1VCU1QoW2FtX19pbmNsdWRlXSkKK0FDX1NVQlNUKFthbV9fcXVvdGVdKQorQUNfTVNHX1JFU1VMVChbJF9hbV9yZXN1bHRdKQorcm0gLWYgY29uZmluYyBjb25mbWYKK10pCisKKyMgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA4CisjIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDYKKworIyBBTV9QUk9HX0NDX0NfTworIyAtLS0tLS0tLS0tLS0tLQorIyBMaWtlIEFDX1BST0dfQ0NfQ19PLCBidXQgY2hhbmdlZCBmb3IgYXV0b21ha2UuCitBQ19ERUZVTihbQU1fUFJPR19DQ19DX09dLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NfQ19PXSlkbmwKK0FDX1JFUVVJUkUoW0FNX0FVWF9ESVJfRVhQQU5EXSlkbmwKK0FDX1JFUVVJUkVfQVVYX0ZJTEUoW2NvbXBpbGVdKWRubAorIyBGSVhNRTogd2UgcmVseSBvbiB0aGUgY2FjaGUgdmFyaWFibGUgbmFtZSBiZWNhdXNlCisjIHRoZXJlIGlzIG5vIG90aGVyIHdheS4KK3NldCBkdW1teSAkQ0MKK2FtX2NjPWBlY2hvICRbMl0gfCBzZWQgWydzL1teYS16QS1aMC05X10vXy9nO3MvXlswLTldL18vJ11gCitldmFsIGFtX3Q9XCRhY19jdl9wcm9nX2NjXyR7YW1fY2N9X2NfbworaWYgdGVzdCAiJGFtX3QiICE9IHllczsgdGhlbgorICAgIyBMb3NpbmcgY29tcGlsZXIsIHNvIG92ZXJyaWRlIHdpdGggdGhlIHNjcmlwdC4KKyAgICMgRklYTUU6IEl0IGlzIHdyb25nIHRvIHJld3JpdGUgQ0MuCisgICAjIEJ1dCBpZiB3ZSBkb24ndCB0aGVuIHdlIGdldCBpbnRvIHRyb3VibGUgb2Ygb25lIHNvcnQgb3IgYW5vdGhlci4KKyAgICMgQSBsb25nZXItdGVybSBmaXggd291bGQgYmUgdG8gaGF2ZSBhdXRvbWFrZSB1c2UgYW1fX0NDIGluIHRoaXMgY2FzZSwKKyAgICMgYW5kIHRoZW4gd2UgY291bGQgc2V0IGFtX19DQz0iXCQodG9wX3NyY2RpcikvY29tcGlsZSBcJChDQykiCisgICBDQz0iJGFtX2F1eF9kaXIvY29tcGlsZSAkQ0MiCitmaQorZG5sIE1ha2Ugc3VyZSBBQ19QUk9HX0NDIGlzIG5ldmVyIGNhbGxlZCBhZ2Fpbiwgb3IgaXQgd2lsbCBvdmVycmlkZSBvdXIKK2RubCBzZXR0aW5nIG9mIENDLgorbTRfZGVmaW5lKFtBQ19QUk9HX0NDXSwKKyAgICAgICAgICBbbTRfZmF0YWwoW0FDX1BST0dfQ0MgY2Fubm90IGJlIGNhbGxlZCBhZnRlciBBTV9QUk9HX0NDX0NfT10pXSkKK10pCisKKyMgRmFrZSB0aGUgZXhpc3RlbmNlIG9mIHByb2dyYW1zIHRoYXQgR05VIG1haW50YWluZXJzIHVzZS4gIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNgorCisjIEFNX01JU1NJTkdfUFJPRyhOQU1FLCBQUk9HUkFNKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9NSVNTSU5HX1BST0ddLAorW0FDX1JFUVVJUkUoW0FNX01JU1NJTkdfSEFTX1JVTl0pCiskMT0keyQxLSIke2FtX21pc3NpbmdfcnVufSQyIn0KK0FDX1NVQlNUKCQxKV0pCisKKworIyBBTV9NSVNTSU5HX0hBU19SVU4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBNSVNTSU5HIGlmIG5vdCBkZWZpbmVkIHNvIGZhciBhbmQgdGVzdCBpZiBpdCBzdXBwb3J0cyAtLXJ1bi4KKyMgSWYgaXQgZG9lcywgc2V0IGFtX21pc3NpbmdfcnVuIHRvIHVzZSBpdCwgb3RoZXJ3aXNlLCB0byBub3RoaW5nLgorQUNfREVGVU4oW0FNX01JU1NJTkdfSEFTX1JVTl0sCitbQUNfUkVRVUlSRShbQU1fQVVYX0RJUl9FWFBBTkRdKWRubAorQUNfUkVRVUlSRV9BVVhfRklMRShbbWlzc2luZ10pZG5sCitpZiB0ZXN0IHgiJHtNSVNTSU5HK3NldH0iICE9IHhzZXQ7IHRoZW4KKyAgY2FzZSAkYW1fYXV4X2RpciBpbgorICAqXCAqIHwgKlwJKikKKyAgICBNSVNTSU5HPSJcJHtTSEVMTH0gXCIkYW1fYXV4X2Rpci9taXNzaW5nXCIiIDs7CisgICopCisgICAgTUlTU0lORz0iXCR7U0hFTEx9ICRhbV9hdXhfZGlyL21pc3NpbmciIDs7CisgIGVzYWMKK2ZpCisjIFVzZSBldmFsIHRvIGV4cGFuZCAkU0hFTEwKK2lmIGV2YWwgIiRNSVNTSU5HIC0tcnVuIHRydWUiOyB0aGVuCisgIGFtX21pc3NpbmdfcnVuPSIkTUlTU0lORyAtLXJ1biAiCitlbHNlCisgIGFtX21pc3NpbmdfcnVuPQorICBBQ19NU0dfV0FSTihbYG1pc3NpbmcnIHNjcmlwdCBpcyB0b28gb2xkIG9yIG1pc3NpbmddKQorZmkKK10pCisKKyMgQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIEFNX1BST0dfTUtESVJfUAorIyAtLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGBta2RpciAtcCcuCitBQ19ERUZVTihbQU1fUFJPR19NS0RJUl9QXSwKK1tBQ19QUkVSRVEoWzIuNjBdKWRubAorQUNfUkVRVUlSRShbQUNfUFJPR19NS0RJUl9QXSlkbmwKK2RubCBBdXRvbWFrZSAxLjggdG8gMS45LjYgdXNlZCB0byBkZWZpbmUgbWtkaXJfcC4gIFdlIG5vdyB1c2UgTUtESVJfUCwKK2RubCB3aGlsZSBrZWVwaW5nIGEgZGVmaW5pdGlvbiBvZiBta2Rpcl9wIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorZG5sIEBNS0RJUl9QQCBpcyBtYWdpYzogQUNfT1VUUFVUIGFkanVzdHMgaXRzIHZhbHVlIGZvciBlYWNoIE1ha2VmaWxlLgorZG5sIEhvd2V2ZXIgd2UgY2Fubm90IGRlZmluZSBta2Rpcl9wIGFzICQoTUtESVJfUCkgZm9yIHRoZSBzYWtlIG9mCitkbmwgTWFrZWZpbGUuaW5zIHRoYXQgZG8gbm90IGRlZmluZSBNS0RJUl9QLCBzbyB3ZSBkbyBvdXIgb3duCitkbmwgYWRqdXN0bWVudCB1c2luZyB0b3BfYnVpbGRkaXIgKHdoaWNoIGlzIGRlZmluZWQgbW9yZSBvZnRlbiB0aGFuCitkbmwgTUtESVJfUCkuCitBQ19TVUJTVChbbWtkaXJfcF0sIFsiJE1LRElSX1AiXSlkbmwKK2Nhc2UgJG1rZGlyX3AgaW4KKyAgW1tcXC8kXV0qIHwgPzpbW1xcL11dKikgOzsKKyAgKi8qKSBta2Rpcl9wPSJcJCh0b3BfYnVpbGRkaXIpLyRta2Rpcl9wIiA7OworZXNhYworXSkKKworIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAgLSotIEF1dG9jb25mIC0qLQorCisjIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNSwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNAorCisjIF9BTV9NQU5HTEVfT1BUSU9OKE5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBQ19ERUZVTihbX0FNX01BTkdMRV9PUFRJT05dLAorW1tfQU1fT1BUSU9OX11tNF9icGF0c3Vic3QoJDEsIFtbXmEtekEtWjAtOV9dXSwgW19dKV0pCisKKyMgX0FNX1NFVF9PUFRJT04oTkFNRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNldCBvcHRpb24gTkFNRS4gIFByZXNlbnRseSB0aGF0IG9ubHkgbWVhbnMgZGVmaW5pbmcgYSBmbGFnIGZvciB0aGlzIG9wdGlvbi4KK0FDX0RFRlVOKFtfQU1fU0VUX09QVElPTl0sCitbbTRfZGVmaW5lKF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCAxKV0pCisKKyMgX0FNX1NFVF9PUFRJT05TKE9QVElPTlMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1BUSU9OUyBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIEF1dG9tYWtlIG9wdGlvbnMuCitBQ19ERUZVTihbX0FNX1NFVF9PUFRJT05TXSwKK1ttNF9mb3JlYWNoX3coW19BTV9PcHRpb25dLCBbJDFdLCBbX0FNX1NFVF9PUFRJT04oX0FNX09wdGlvbildKV0pCisKKyMgX0FNX0lGX09QVElPTihPUFRJT04sIElGLVNFVCwgW0lGLU5PVC1TRVRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4ZWN1dGUgSUYtU0VUIGlmIE9QVElPTiBpcyBzZXQsIElGLU5PVC1TRVQgb3RoZXJ3aXNlLgorQUNfREVGVU4oW19BTV9JRl9PUFRJT05dLAorW200X2lmc2V0KF9BTV9NQU5HTEVfT1BUSU9OKFskMV0pLCBbJDJdLCBbJDNdKV0pCisKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuICAgIC0qLSBBdXRvY29uZiAtKi0KKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDUsIDIwMDgKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNQorCisjIEFNX1NBTklUWV9DSEVDSworIyAtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtBTV9TQU5JVFlfQ0hFQ0tdLAorW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lXSkKKyMgSnVzdCBpbiBjYXNlCitzbGVlcCAxCitlY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0LmZpbGUKKyMgUmVqZWN0IHVuc2FmZSBjaGFyYWN0ZXJzIGluICRzcmNkaXIgb3IgdGhlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5CisjIG5hbWUuICBBY2NlcHQgc3BhY2UgYW5kIHRhYiBvbmx5IGluIHRoZSBsYXR0ZXIuCithbV9sZj0nCisnCitjYXNlIGBwd2RgIGluCisgICpbW1xcXCJcI1wkXCZcJ1xgJGFtX2xmXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIGFic29sdXRlIHdvcmtpbmcgZGlyZWN0b3J5IG5hbWVdKTs7Citlc2FjCitjYXNlICRzcmNkaXIgaW4KKyAgKltbXFxcIlwjXCRcJlwnXGAkYW1fbGZcIFwJXV0qKQorICAgIEFDX01TR19FUlJPUihbdW5zYWZlIHNyY2RpciB2YWx1ZTogYCRzcmNkaXInXSk7OworZXNhYworCisjIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCisjIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKKyMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKKyMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCisjIGRpcmVjdG9yeSkuCitpZiAoCisgICBzZXQgWCBgbHMgLUx0ICIkc3JjZGlyL2NvbmZpZ3VyZSIgY29uZnRlc3QuZmlsZSAyPiAvZGV2L251bGxgCisgICBpZiB0ZXN0ICIkWypdIiA9ICJYIjsgdGhlbgorICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KKyAgICAgIHNldCBYIGBscyAtdCAiJHNyY2Rpci9jb25maWd1cmUiIGNvbmZ0ZXN0LmZpbGVgCisgICBmaQorICAgcm0gLWYgY29uZnRlc3QuZmlsZQorICAgaWYgdGVzdCAiJFsqXSIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3QuZmlsZSIgXAorICAgICAgJiYgdGVzdCAiJFsqXSIgIT0gIlggY29uZnRlc3QuZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKworICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgorICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQorICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQorICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgorICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCithbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKKyAgIGZpCisKKyAgIHRlc3QgIiRbMl0iID0gY29uZnRlc3QuZmlsZQorICAgKQordGhlbgorICAgIyBPay4KKyAgIDoKK2Vsc2UKKyAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCitDaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCitmaQorQUNfTVNHX1JFU1VMVCh5ZXMpXSkKKworIyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDMsIDIwMDUgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgQU1fUFJPR19JTlNUQUxMX1NUUklQCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPbmUgaXNzdWUgd2l0aCB2ZW5kb3IgYGluc3RhbGwnIChldmVuIEdOVSkgaXMgdGhhdCB5b3UgY2FuJ3QKKyMgc3BlY2lmeSB0aGUgcHJvZ3JhbSB1c2VkIHRvIHN0cmlwIGJpbmFyaWVzLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisjIGFubm95aW5nIGluIGNyb3NzLWNvbXBpbGluZyBlbnZpcm9ubWVudHMsIHdoZXJlIHRoZSBidWlsZCdzIHN0cmlwCisjIGlzIHVubGlrZWx5IHRvIGhhbmRsZSB0aGUgaG9zdCdzIGJpbmFyaWVzLgorIyBGb3J0dW5hdGVseSBpbnN0YWxsLXNoIHdpbGwgaG9ub3IgYSBTVFJJUFBST0cgdmFyaWFibGUsIHNvIHdlCisjIGFsd2F5cyB1c2UgaW5zdGFsbC1zaCBpbiBgbWFrZSBpbnN0YWxsLXN0cmlwJywgYW5kIGluaXRpYWxpemUKKyMgU1RSSVBQUk9HIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBTVFJJUCB2YXJpYWJsZSAoc2V0IGJ5IHRoZSB1c2VyKS4KK0FDX0RFRlVOKFtBTV9QUk9HX0lOU1RBTExfU1RSSVBdLAorW0FDX1JFUVVJUkUoW0FNX1BST0dfSU5TVEFMTF9TSF0pZG5sCisjIEluc3RhbGxlZCBiaW5hcmllcyBhcmUgdXN1YWxseSBzdHJpcHBlZCB1c2luZyBgc3RyaXAnIHdoZW4gdGhlIHVzZXIKKyMgcnVuIGBtYWtlIGluc3RhbGwtc3RyaXAnLiAgSG93ZXZlciBgc3RyaXAnIG1pZ2h0IG5vdCBiZSB0aGUgcmlnaHQKKyMgdG9vbCB0byB1c2UgaW4gY3Jvc3MtY29tcGlsYXRpb24gZW52aXJvbm1lbnRzLCB0aGVyZWZvcmUgQXV0b21ha2UKKyMgd2lsbCBob25vciB0aGUgYFNUUklQJyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycnVsZSB0aGlzIHByb2dyYW0uCitkbmwgRG9uJ3QgdGVzdCBmb3IgJGNyb3NzX2NvbXBpbGluZyA9IHllcywgYmVjYXVzZSBpdCBtaWdodCBiZSBgbWF5YmUnLgoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0gbm87IHRoZW4KKyAgQUNfQ0hFQ0tfVE9PTChbU1RSSVBdLCBbc3RyaXBdLCA6KQorZmkKK0lOU1RBTExfU1RSSVBfUFJPR1JBTT0iXCQoaW5zdGFsbF9zaCkgLWMgLXMiCitBQ19TVUJTVChbSU5TVEFMTF9TVFJJUF9QUk9HUkFNXSldKQorCisjIENvcHlyaWdodCAoQykgMjAwNiwgMjAwOCAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgMgorCisjIF9BTV9TVUJTVF9OT1RNQUtFKFZBUklBQkxFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJldmVudCBBdXRvbWFrZSBmcm9tIG91dHB1dHRpbmcgVkFSSUFCTEUgPSBAVkFSSUFCTEVAIGluIE1ha2VmaWxlLmluLgorIyBUaGlzIG1hY3JvIGlzIHRyYWNlZCBieSBBdXRvbWFrZS4KK0FDX0RFRlVOKFtfQU1fU1VCU1RfTk9UTUFLRV0pCisKKyMgQU1fU1VCU1RfTk9UTUFLRShWQVJJQUJMRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFB1YmxpYyBzaXN0ZXIgb2YgX0FNX1NVQlNUX05PVE1BS0UuCitBQ19ERUZVTihbQU1fU1VCU1RfTk9UTUFLRV0sIFtfQU1fU1VCU1RfTk9UTUFLRSgkQCldKQorCisjIENoZWNrIGhvdyB0byBjcmVhdGUgYSB0YXJiYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisKKyMgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCAyCisKKyMgX0FNX1BST0dfVEFSKEZPUk1BVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgaG93IHRvIGNyZWF0ZSBhIHRhcmJhbGwgaW4gZm9ybWF0IEZPUk1BVC4KKyMgRk9STUFUIHNob3VsZCBiZSBvbmUgb2YgYHY3JywgYHVzdGFyJywgb3IgYHBheCcuCisjCisjIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX190YXIpIHRoYXQgaXMgYSBjb21tYW5kCisjIHdyaXRpbmcgdG8gc3Rkb3V0IGEgRk9STUFULXRhcmJhbGwgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5CisjICR0YXJkaXIuCisjICAgICB0YXJkaXI9ZGlyZWN0b3J5ICYmICQoYW1fX3RhcikgPiByZXN1bHQudGFyCisjCisjIFN1YnN0aXR1dGUgYSB2YXJpYWJsZSAkKGFtX191bnRhcikgdGhhdCBleHRyYWN0IHN1Y2gKKyMgYSB0YXJiYWxsIHJlYWQgZnJvbSBzdGRpbi4KKyMgICAgICQoYW1fX3VudGFyKSA8IHJlc3VsdC50YXIKK0FDX0RFRlVOKFtfQU1fUFJPR19UQVJdLAorWyMgQWx3YXlzIGRlZmluZSBBTVRBUiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK0FNX01JU1NJTkdfUFJPRyhbQU1UQVJdLCBbdGFyXSkKK200X2lmKFskMV0sIFt2N10sCisgICAgIFthbV9fdGFyPScke0FNVEFSfSBjaG9mIC0gIiQkdGFyZGlyIic7IGFtX191bnRhcj0nJHtBTVRBUn0geGYgLSddLAorICAgICBbbTRfY2FzZShbJDFdLCBbdXN0YXJdLCwgW3BheF0sLAorICAgICAgICAgICAgICBbbTRfZmF0YWwoW1Vua25vd24gdGFyIGZvcm1hdF0pXSkKK0FDX01TR19DSEVDS0lORyhbaG93IHRvIGNyZWF0ZSBhICQxIHRhciBhcmNoaXZlXSkKKyMgTG9vcCBvdmVyIGFsbCBrbm93biBtZXRob2RzIHRvIGNyZWF0ZSBhIHRhciBhcmNoaXZlIHVudGlsIG9uZSB3b3Jrcy4KK19hbV90b29scz0nZ251dGFyIG00X2lmKFskMV0sIFt1c3Rhcl0sIFtwbGFpbnRhcl0pIHBheCBjcGlvIG5vbmUnCitfYW1fdG9vbHM9JHthbV9jdl9wcm9nX3Rhcl8kMS0kX2FtX3Rvb2xzfQorIyBEbyBub3QgZm9sZCB0aGUgYWJvdmUgdHdvIGxpbmUgaW50byBvbmUsIGJlY2F1c2UgVHJ1NjQgc2ggYW5kCisjIFNvbGFyaXMgc2ggd2lsbCBub3QgZ3JvayBzcGFjZXMgaW4gdGhlIHJocyBvZiBgLScuCitmb3IgX2FtX3Rvb2wgaW4gJF9hbV90b29scworZG8KKyAgY2FzZSAkX2FtX3Rvb2wgaW4KKyAgZ251dGFyKQorICAgIGZvciBfYW1fdGFyIGluIHRhciBnbnV0YXIgZ3RhcjsKKyAgICBkbworICAgICAgQU1fUlVOX0xPRyhbJF9hbV90YXIgLS12ZXJzaW9uXSkgJiYgYnJlYWsKKyAgICBkb25lCisgICAgYW1fX3Rhcj0iJF9hbV90YXIgLS1mb3JtYXQ9bTRfaWYoWyQxXSwgW3BheF0sIFtwb3NpeF0sIFskMV0pIC1jaGYgLSAiJyIkJHRhcmRpciInCisgICAgYW1fX3Rhcl89IiRfYW1fdGFyIC0tZm9ybWF0PW00X2lmKFskMV0sIFtwYXhdLCBbcG9zaXhdLCBbJDFdKSAtY2hmIC0gIiciJHRhcmRpciInCisgICAgYW1fX3VudGFyPSIkX2FtX3RhciAteGYgLSIKKyAgICA7OworICBwbGFpbnRhcikKKyAgICAjIE11c3Qgc2tpcCBHTlUgdGFyOiBpZiBpdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9ybWF0PSBpdCBkb2Vzbid0IGNyZWF0ZQorICAgICMgdXN0YXIgdGFyYmFsbCBlaXRoZXIuCisgICAgKHRhciAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMSAmJiBjb250aW51ZQorICAgIGFtX190YXI9J3RhciBjaGYgLSAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSd0YXIgY2hmIC0gIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ndGFyIHhmIC0nCisgICAgOzsKKyAgcGF4KQorICAgIGFtX190YXI9J3BheCAtTCAteCAkMSAtdyAiJCR0YXJkaXIiJworICAgIGFtX190YXJfPSdwYXggLUwgLXggJDEgLXcgIiR0YXJkaXIiJworICAgIGFtX191bnRhcj0ncGF4IC1yJworICAgIDs7CisgIGNwaW8pCisgICAgYW1fX3Rhcj0nZmluZCAiJCR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3Rhcl89J2ZpbmQgIiR0YXJkaXIiIC1wcmludCB8IGNwaW8gLW8gLUggJDEgLUwnCisgICAgYW1fX3VudGFyPSdjcGlvIC1pIC1IICQxIC1kJworICAgIDs7CisgIG5vbmUpCisgICAgYW1fX3Rhcj1mYWxzZQorICAgIGFtX190YXJfPWZhbHNlCisgICAgYW1fX3VudGFyPWZhbHNlCisgICAgOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHZhbHVlIHdhcyBjYWNoZWQsIHN0b3Agbm93LiAgV2UganVzdCB3YW50ZWQgdG8gaGF2ZSBhbV9fdGFyCisgICMgYW5kIGFtX191bnRhciBzZXQuCisgIHRlc3QgLW4gIiR7YW1fY3ZfcHJvZ190YXJfJDF9IiAmJiBicmVhaworCisgICMgdGFyL3VudGFyIGEgZHVtbXkgZGlyZWN0b3J5LCBhbmQgc3RvcCBpZiB0aGUgY29tbWFuZCB3b3JrcworICBybSAtcmYgY29uZnRlc3QuZGlyCisgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorICBlY2hvIEdyZXBNZSA+IGNvbmZ0ZXN0LmRpci9maWxlCisgIEFNX1JVTl9MT0coW3RhcmRpcj1jb25mdGVzdC5kaXIgJiYgZXZhbCAkYW1fX3Rhcl8gPmNvbmZ0ZXN0LnRhcl0pCisgIHJtIC1yZiBjb25mdGVzdC5kaXIKKyAgaWYgdGVzdCAtcyBjb25mdGVzdC50YXI7IHRoZW4KKyAgICBBTV9SVU5fTE9HKFskYW1fX3VudGFyIDxjb25mdGVzdC50YXJdKQorICAgIGdyZXAgR3JlcE1lIGNvbmZ0ZXN0LmRpci9maWxlID4vZGV2L251bGwgMj4mMSAmJiBicmVhaworICBmaQorZG9uZQorcm0gLXJmIGNvbmZ0ZXN0LmRpcgorCitBQ19DQUNIRV9WQUwoW2FtX2N2X3Byb2dfdGFyXyQxXSwgW2FtX2N2X3Byb2dfdGFyXyQxPSRfYW1fdG9vbF0pCitBQ19NU0dfUkVTVUxUKFskYW1fY3ZfcHJvZ190YXJfJDFdKV0pCitBQ19TVUJTVChbYW1fX3Rhcl0pCitBQ19TVUJTVChbYW1fX3VudGFyXSkKK10pICMgX0FNX1BST0dfVEFSCisKK200X2luY2x1ZGUoW2FjbG9jYWwvYnNkc2lnbmFscy5tNF0pCittNF9pbmNsdWRlKFthY2xvY2FsL2lwdjYubTRdKQorbTRfaW5jbHVkZShbYWNsb2NhbC9rZXJiZXJvczUubTRdKQorbTRfaW5jbHVkZShbYWNsb2NhbC9saWJibGtpZC5tNF0pCittNF9pbmNsdWRlKFthY2xvY2FsL2xpYmNhcC5tNF0pCittNF9pbmNsdWRlKFthY2xvY2FsL2xpYmV2ZW50Lm00XSkKK200X2luY2x1ZGUoW2FjbG9jYWwvbGlibmZzaWRtYXAubTRdKQorbTRfaW5jbHVkZShbYWNsb2NhbC9saWJycGNzZWNnc3MubTRdKQorbTRfaW5jbHVkZShbYWNsb2NhbC9saWJ0aXJwYy5tNF0pCittNF9pbmNsdWRlKFthY2xvY2FsL25mcy11dGlscy5tNF0pCittNF9pbmNsdWRlKFthY2xvY2FsL3JwY3NlY192ZXJzLm00XSkKK200X2luY2x1ZGUoW2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00XSkKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2JzZHNpZ25hbHMubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9ic2RzaWduYWxzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTcyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9ic2RzaWduYWxzLm00CkBAIC0wLDAgKzEsMzYgQEAKK2RubCAqKioqKioqKioqKiBCU0QgdnMuIFBPU0lYIHNpZ25hbCBoYW5kbGluZyAqKioqKioqKioqKioqKgorQUNfREVGVU4oW0FDX0JTRF9TSUdOQUxTXSwgWworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEJTRCBzaWduYWwgc2VtYW50aWNzKQorICBBQ19DQUNIRV9WQUwoa25mc2RfY3ZfYnNkX3NpZ25hbHMsCisgICAgW0FDX1RSWV9SVU4oWworCSNpbmNsdWRlIDxzaWduYWwuaD4KKwkjaW5jbHVkZSA8dW5pc3RkLmg+CisJI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKwlzdGF0aWMgaW50IGNvdW50ZXIgPSAwOworCXN0YXRpYyBSRVRTSUdUWVBFIGhhbmRsZXIoaW50IG51bSkgeyBjb3VudGVyKys7IH0KKworCWludCBtYWluKCkKKwl7CisJCWludAlzOworCQlpZiAoKHMgPSBmb3JrKCkpIDwgMCkgcmV0dXJuIDE7CisJCWlmIChzICE9IDApIHsKKwkJCWlmICh3YWl0KCZzKSA8IDApIHJldHVybiAxOworCQkJcmV0dXJuIFdJRlNJR05BTEVEKHMpPyAxIDogMDsKKwkJfQorCisJCXNpZ25hbChTSUdIVVAsIGhhbmRsZXIpOworCQlraWxsKGdldHBpZCgpLCBTSUdIVVApOyBraWxsKGdldHBpZCgpLCBTSUdIVVApOworCQlyZXR1cm4gKGNvdW50ZXIgPT0gMik/IDAgOiAxOworCX0KKyAgICBdLCBrbmZzZF9jdl9ic2Rfc2lnbmFscz15ZXMsIGtuZnNkX2N2X2JzZF9zaWduYWxzPW5vLAorICAgIFsKKyAgICAgIGNhc2UgIiRob3N0X29zIiBpbgorICAgICAgICAqbGludXgqKSBrbmZzZF9jdl9ic2Rfc2lnbmFscz1ubzs7CisgICAgICAgICpic2QqKSAgIGtuZnNkX2N2X2JzZF9zaWduYWxzPXllczs7CisgICAgICAgICopICAgICAgIEFDX01TR19FUlJPUihbdW5hYmxlIHRvIGd1ZXNzIHNpZ25hbCBzZW1hbnRpY3MgZm9yICRob3N0X29zOyBwbGVhc2Ugc2V0IGtuZnNkX2N2X2JzZF9zaWduYWxzXSk7OworICAgICAgZXNhYworICAgIF0pXSkgZG5sCisgICAgQUNfTVNHX1JFU1VMVCgka25mc2RfY3ZfYnNkX3NpZ25hbHMpCisgICAgdGVzdCAka25mc2RfY3ZfYnNkX3NpZ25hbHMgPSB5ZXMgJiYgQUNfREVGSU5FKEhBVkVfQlNEX1NJR05BTFMsIDEsIFtEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byB1c2UgQlNEIHNpZ25hbCBzZW1hbnRpY3NdKQorXSlkbmwKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2lwdjYubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9pcHY2Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZThmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9pcHY2Lm00CkBAIC0wLDAgKzEsMjkgQEAKK2RubCBDaGVja3MgZm9yIElQdjYgc3VwcG9ydAorZG5sCitBQ19ERUZVTihbQUNfSVBWNl0sIFsKKworICBBQ19DSEVDS19ERUNMKFtBSV9BRERSQ09ORklHXSwKKyAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFtIQVZFX0RFQ0xfQUlfQUREUkNPTkZJR10sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGVmaW5lIHRoaXMgdG8gMSBpZiBBSV9BRERSQ09ORklHIG1hY3JvIGlzIGRlZmluZWRdKV0sICwKKyAgICAgICAgICAgICAgICBbICNpbmNsdWRlIDxuZXRkYi5oPiBdKQorCisgIGlmIHRlc3QgIiRlbmFibGVfaXB2NiIgPSB5ZXM7IHRoZW4KKworICAgIGRubCBUSS1SUEMgcmVxdWlyZWQgZm9yIElQdjYKKyAgICBpZiB0ZXN0ICIkZW5hYmxlX3RpcnBjIiA9IG5vOyB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoWyctLWVuYWJsZS1pcHY2JyByZXF1aXJlcyBUSVJQQyBzdXBwb3J0Ll0pCisgICAgZmkKKworICAgIGRubCBJUHY2LWVuYWJsZWQgbmV0d29ya2luZyBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIElQdjYKKyAgICBBQ19DSEVDS19GVU5DUyhbZ2V0aWZhZGRycyBnZXRuYW1laW5mbyBiaW5kcmVzdnBvcnRfc2FdLCAsCisgICAgICAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihbTWlzc2luZyBsaWJyYXJ5IGZ1bmN0aW9ucyBuZWVkZWQgZm9yIElQdjYuXSldKQorCisgICAgZG5sIE5lZWQgdG8gZGV0ZWN0IHByZXNlbmNlIG9mIElQdjYgbmV0d29ya2luZyBhdCBydW4gdGltZSB2aWEKKyAgICBkbmwgZ2V0YWRkcmluZm8oMyk7IG9sZCB2ZXJzaW9ucyBvZiBnbGliYyBkbyBub3Qgc3VwcG9ydCBBRERSQ09ORklHCisgICAgQUNfQ0hFQ0tfREVDTChbQUlfQUREUkNPTkZJR10sICwKKyAgICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2Z1bGwgZ2V0YWRkcmluZm8oMykgaW1wbGVtZW50YXRpb24gbmVlZGVkIGZvciBJUHY2IHN1cHBvcnRdKV0sCisgICAgICAgICAgICAgICAgICBbICNpbmNsdWRlIDxuZXRkYi5oPiBdKQorCisgIGZpCisKK10pZG5sCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9rZXJiZXJvczUubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9rZXJiZXJvczUubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhNTczOAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2tlcmJlcm9zNS5tNApAQCAtMCwwICsxLDExNSBAQAorZG5sIENoZWNrcyBmb3IgS2VyYmVyb3MKK2RubCBOT1RFOiB3aGlsZSB3ZSBpbnRlbmQgdG8gZG8gZ2VuZXJpYyBnc3MtYXBpLCBjdXJyZW50bHkgd2UKK2RubCBoYXZlIGEgcmVxdWlyZW1lbnQgdG8gZ2V0IGFuIGluaXRpYWwgS2VyYmVyb3MgbWFjaGluZQorZG5sIGNyZWRlbnRpYWwuICBUaHVzLCB0aGUgcmVxdWlyZW1lbnQgZm9yIEtlcmJlcm9zLgorZG5sIFRoZSBLZXJiZXJvcyBnc3NhcGkgbGlicmFyeSB3aWxsIGJlIGR5bmFtaWNhbGx5IGxvYWRlZD8KK0FDX0RFRlVOKFtBQ19LRVJCRVJPU19WNV0sWworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEtlcmJlcm9zIHY1KQorICBBQ19BUkdfV0lUSChrcmI1LAorICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1rcmI1PURJUl0sIFt1c2UgS2VyYmVyb3MgdjUgaW5zdGFsbGF0aW9uIGluIERJUl0pXSwKKyAgWyBjYXNlICIkd2l0aHZhbCIgaW4KKyAgICB5ZXN8bm8pCisgICAgICAga3JiNV93aXRoPSIiCisgICAgICAgOzsKKyAgICAqKQorICAgICAgIGtyYjVfd2l0aD0iJHdpdGh2YWwiCisgICAgICAgOzsKKyAgICBlc2FjIF0KKyAgKQorCisgIGZvciBkaXIgaW4gJGtyYjVfd2l0aCAvdXNyIC91c3Iva2VyYmVyb3MgL3Vzci9sb2NhbCAvdXNyL2xvY2FsL2tyYjUgXAorICAJICAgICAvdXNyL2tyYjUgL3Vzci9oZWltZGFsIC91c3IvbG9jYWwvaGVpbWRhbCAvdXNyL2F0aGVuYSA7IGRvCisgICAgZG5sIFRoaXMgdWdseSBoYWNrIGJyb3VnaHQgb24gYnkgdGhlIHNwbGl0IGluc3RhbGxhdGlvbiBvZgorICAgIGRubCBNSVQgS2VyYmVyb3Mgb24gRmVkb3JhIENvcmUgMQorICAgIEs1Q09ORklHPSIiCisgICAgaWYgdGVzdCAtZiAkZGlyL2Jpbi9rcmI1LWNvbmZpZzsgdGhlbgorICAgICAgSzVDT05GSUc9JGRpci9iaW4va3JiNS1jb25maWcKKyAgICBlbGlmIHRlc3QgLWYgIi91c3Iva2VyYmVyb3MvYmluL2tyYjUtY29uZmlnIjsgdGhlbgorICAgICAgSzVDT05GSUc9Ii91c3Iva2VyYmVyb3MvYmluL2tyYjUtY29uZmlnIgorICAgIGVsaWYgdGVzdCAtZiAiL3Vzci9saWIvbWl0L2Jpbi9rcmI1LWNvbmZpZyI7IHRoZW4KKyAgICAgIEs1Q09ORklHPSIvdXNyL2xpYi9taXQvYmluL2tyYjUtY29uZmlnIgorICAgIGZpCisgICAgaWYgdGVzdCAiJEs1Q09ORklHIiAhPSAiIjsgdGhlbgorICAgICAgS1JCQ0ZMQUdTPWAkSzVDT05GSUcgLS1jZmxhZ3NgCisgICAgICBLUkJMSUJTPWAkSzVDT05GSUcgLS1saWJzIGdzc2FwaWAKKyAgICAgIEs1VkVSUz1gJEs1Q09ORklHIC0tdmVyc2lvbiB8IGhlYWQgLW4gMSB8IGF3ayAne3NwbGl0KCQoNCksdiwiLiIpOyBpZiAodkA8OkAiMyJAOj5AID09ICIiKSB2QDw6QCIzIkA6PkAgPSAiMCI7IHByaW50IHZAPDpAIjEiQDo+QHZAPDpAIjIiQDo+QHZAPDpAIjMiQDo+QCB9J2AKKyAgICAgIEFDX0RFRklORV9VTlFVT1RFRChLUkI1X1ZFUlNJT04sICRLNVZFUlMsIFtEZWZpbmUgdGhpcyBhcyB0aGUgS2VyYmVyb3MgdmVyc2lvbiBudW1iZXJdKQorICAgICAgaWYgdGVzdCAtZiAkZGlyL2luY2x1ZGUvZ3NzYXBpL2dzc2FwaV9rcmI1LmggLWEgXAorICAgICAgICAgICAgICAgIFwoIC1mICRkaXIvbGliL2xpYmdzc2FwaV9rcmI1LmEgLW8gXAorICAgICAgICAgICAgICAgICAgIC1mICRkaXIvbGliNjQvbGliZ3NzYXBpX2tyYjUuYSAtbyBcCisgICAgICAgICAgICAgICAgICAgLWYgJGRpci9saWI2NC9saWJnc3NhcGlfa3JiNS5zbyAtbyBcCisgICAgICAgICAgICAgICAgICAgLWYgJGRpci9saWIvbGliZ3NzYXBpX2tyYjUuc28gXCkgOyB0aGVuCisgICAgICAgICBBQ19ERUZJTkUoSEFWRV9LUkI1LCAxLCBbRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgTUlUIEtlcmJlcm9zIGxpYnJhcmllc10pCisgICAgICAgICBLUkJESVI9IiRkaXIiCisgIGRubCBJZiB3ZSBhcmUgdXNpbmcgTUlUIEs1IDEuMy4xIGFuZCBiZWZvcmUsIHdlICpNVVNUKiB1c2UgdGhlCisgIGRubCBwcml2YXRlIGZ1bmN0aW9uIChnc3Nfa3JiNV9jY2FjaGVfbmFtZSkgdG8gZ2V0IGNvcnJlY3QKKyAgZG5sIGJlaGF2aW9yIG9mIGNoYW5naW5nIHRoZSBjY2FjaGUgdXNlZCBieSBnc3NhcGkuCisgIGRubCBTdGFydGluZyBpbiAxLjMuMiwgd2UgKkRPIE5PVCogd2FudCB0byB1c2UKKyAgZG5sIGdzc19rcmI1X2NjYWNoZV9uYW1lLCBpbnN0ZWFkIHdlIHdhbnQgdG8gc2V0IEtSQjVDQ05BTUUKKyAgZG5sIHRvIGdldCBnc3NhcGkgdG8gdXNlIGEgZGlmZmVyZW50IGNjYWNoZQorICAgICAgICAgaWYgdGVzdCAkSzVWRVJTIC1sZSAxMzE7IHRoZW4KKyAgICAgICAgICAgQUNfREVGSU5FKFVTRV9HU1NfS1JCNV9DQ0FDSEVfTkFNRSwgMSwgW0RlZmluZSB0aGlzIGlmIHRoZSBwcml2YXRlIGZ1bmN0aW9uLCBnc3Nfa3JiNV9jYWNoZV9uYW1lLCBtdXN0IGJlIHVzZWQgdG8gdGVsbCB0aGUgS2VyYmVyb3MgbGlicmFyeSB3aGljaCBjcmVkZW50aWFscyBjYWNoZSB0byB1c2UuIE90aGVyd2lzZSwgdGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgdGhlIEtSQjVDQ05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGVdKQorICAgICAgICAgZmkKKyAgICAgICAgIGdzc2FwaV9saWI9Z3NzYXBpX2tyYjUKKyAgICAgICAgIGJyZWFrCisgICAgICBkbmwgVGhlIGZvbGxvd2luZyB1Z2x5IGhhY2sgYnJvdWdodCBvbiBieSB0aGUgc3BsaXQgaW5zdGFsbGF0aW9uCisgICAgICBkbmwgb2YgSGVpbWRhbCBLZXJiZXJvcyBvbiBTdVNlCisgICAgICBlbGlmIHRlc3QgXCggLWYgJGRpci9pbmNsdWRlL2hlaW1fZXJyLmggLW9cCisgICAgICAJCSAtZiAkZGlyL2luY2x1ZGUvaGVpbWRhbC9oZWltX2Vyci5oIFwpIC1hIFwKKyAgICAgICAgICAgICAgICAtZiAkZGlyL2xpYi9saWJyb2tlbi5hOyB0aGVuCisgICAgICAgICBBQ19ERUZJTkUoSEFWRV9IRUlNREFMLCAxLCBbRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgSGVpbWRhbCBLZXJiZXJvcyBsaWJyYXJpZXNdKQorICAgICAgICAgS1JCRElSPSIkZGlyIgorICAgICAgICAgZ3NzYXBpX2xpYj1nc3NhcGkKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZmkKKyAgZG9uZQorICBkbmwgV2UgZGlkbid0IGZpbmQgYSB1c2FibGUgS2VyYmVyb3MgZW52aXJvbm1lbnQKKyAgaWYgdGVzdCAieCRLUkJESVIiID0gIngiOyB0aGVuCisgICAgaWYgdGVzdCAieCRrcmI1X3dpdGgiID0gIngiOyB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoS2VyYmVyb3MgdjUgd2l0aCBHU1Mgc3VwcG9ydCBub3QgZm91bmQ6IGNvbnNpZGVyIC0tZGlzYWJsZS1nc3Mgb3IgLS13aXRoLWtyYjU9KQorICAgIGVsc2UKKyAgICAgIEFDX01TR19FUlJPUihLZXJiZXJvcyB2NSB3aXRoIEdTUyBzdXBwb3J0IG5vdCBmb3VuZCBhdCAka3JiNV93aXRoKQorICAgIGZpCisgIGZpCisgIEFDX01TR19SRVNVTFQoJEtSQkRJUikKKworICBkbmwgQ2hlY2sgaWYgLXJwYXRoPSQoS1JCRElSKS9saWIgaXMgbmVlZGVkCisgIGVjaG8gIlRoZSBjdXJyZW50IEtSQkRJUiBpcyAkS1JCRElSIgorICBpZiB0ZXN0ICIkS1JCRElSL2xpYiIgPSAiL2xpYiIgLW8gIiRLUkJESVIvbGliIiA9ICIvdXNyL2xpYiIgXAorICAgICAgIC1vICIkS1JCRElSL2xpYiIgPSAiLy9saWIiIC1vICIkS1JCRElSL2xpYiIgPSAiL3Vzci8vbGliIiA7IHRoZW4KKyAgICBLUkJMREZMQUdTPSIiOworICBlbGlmIC9zYmluL2xkY29uZmlnIC1wIHwgZ3JlcCA+IC9kZXYvbnVsbCAiPT4gJEtSQkRJUi9saWIvIjsgdGhlbgorICAgIEtSQkxERkxBR1M9IiI7CisgIGVsc2UKKyAgICBLUkJMREZMQUdTPSItV2wsLXJwYXRoPSRLUkJESVIvbGliIgorICBmaQorCisgIGRubCBOb3cgY2hlY2sgZm9yIGZ1bmN0aW9ucyB3aXRoaW4gZ3NzYXBpIGxpYnJhcnkKKyAgQUNfQ0hFQ0tfTElCKCRnc3NhcGlfbGliLCBnc3Nfa3JiNV9leHBvcnRfbHVjaWRfc2VjX2NvbnRleHQsCisgICAgQUNfREVGSU5FKEhBVkVfTFVDSURfQ09OVEVYVF9TVVBQT1JULCAxLCBbRGVmaW5lIHRoaXMgaWYgdGhlIEtlcmJlcm9zIEdTUyBsaWJyYXJ5IHN1cHBvcnRzIGdzc19rcmI1X2V4cG9ydF9sdWNpZF9zZWNfY29udGV4dF0pLCAsJEtSQkxJQlMpCisgIEFDX0NIRUNLX0xJQigkZ3NzYXBpX2xpYiwgZ3NzX2tyYjVfc2V0X2FsbG93YWJsZV9lbmN0eXBlcywKKyAgICBBQ19ERUZJTkUoSEFWRV9TRVRfQUxMT1dBQkxFX0VOQ1RZUEVTLCAxLCBbRGVmaW5lIHRoaXMgaWYgdGhlIEtlcmJlcm9zIEdTUyBsaWJyYXJ5IHN1cHBvcnRzIGdzc19rcmI1X3NldF9hbGxvd2FibGVfZW5jdHlwZXNdKSwgLCRLUkJMSUJTKQorICBBQ19DSEVDS19MSUIoJGdzc2FwaV9saWIsIGdzc19rcmI1X2NjYWNoZV9uYW1lLAorICAgIEFDX0RFRklORShIQVZFX0dTU19LUkI1X0NDQUNIRV9OQU1FLCAxLCBbRGVmaW5lIHRoaXMgaWYgdGhlIEtlcmJlcm9zIEdTUyBsaWJyYXJ5IHN1cHBvcnRzIGdzc19rcmI1X2NjYWNoZV9uYW1lXSksICwkS1JCTElCUykKKworICBkbmwgQ2hlY2sgZm9yIG5ld2VyIGVycm9yIG1lc3NhZ2UgZmFjaWxpdHkKKyAgQUNfQ0hFQ0tfTElCKCRnc3NhcGlfbGliLCBrcmI1X2dldF9lcnJvcl9tZXNzYWdlLAorICAgIEFDX0RFRklORShIQVZFX0tSQjVfR0VUX0VSUk9SX01FU1NBR0UsIDEsIFtEZWZpbmUgdGhpcyBpZiB0aGUgZnVuY3Rpb24ga3JiNV9nZXRfZXJyb3JfbWVzc2FnZSBpcyBhdmFpbGFibGVdKSwgLCRLUkJMSUJTKQorCisgIGRubCBDaGVjayBmb3IgZnVuY3Rpb24gdG8gc3BlY2lmeSBhZGRyZXNzbGVzcyB0aWNrZXRzCisgIEFDX0NIRUNLX0xJQigkZ3NzYXBpX2xpYiwga3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfc2V0X2FkZHJlc3NsZXNzLAorICAgIEFDX0RFRklORShIQVZFX0tSQjVfR0VUX0lOSVRfQ1JFRFNfT1BUX1NFVF9BRERSRVNTTEVTUywgMSwgW0RlZmluZSB0aGlzIGlmIHRoZSBmdW5jdGlvbiBrcmI1X2dldF9pbml0X2NyZWRzX29wdF9zZXRfYWRkcmVzc2xlc3MgaXMgYXZhaWxhYmxlXSksICwkS1JCTElCUykKKworICBkbmwgSWYgdGhleSBzcGVjaWZpZWQgYSBkaXJlY3RvcnkgYW5kIGl0IGRpZG4ndCB3b3JrLCBnaXZlIHRoZW0gYSB3YXJuaW5nCisgIGlmIHRlc3QgIngka3JiNV93aXRoIiAhPSAieCIgLWEgIiRrcmI1X3dpdGgiICE9ICIkS1JCRElSIjsgdGhlbgorICAgIEFDX01TR19XQVJOKFVzaW5nICRLUkJESVIgaW5zdGVhZCBvZiByZXF1ZXN0ZWQgdmFsdWUgb2YgJGtyYjVfd2l0aCBmb3IgS2VyYmVyb3MhKQorICBmaQorCisgIEFDX1NVQlNUKFtLUkJESVJdKQorICBBQ19TVUJTVChbS1JCTElCU10pCisgIEFDX1NVQlNUKFtLUkJDRkxBR1NdKQorICBBQ19TVUJTVChbS1JCTERGTEFHU10pCisgIEFDX1NVQlNUKFtLNVZFUlNdKQorCitdKQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGliYmxraWQubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJibGtpZC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDgyNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGliYmxraWQubTQKQEAgLTAsMCArMSwxOSBAQAorZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKiBsaWJibGtpZCBuZWVkcyB2ZXJzaW9uIDEuNDAgb3IgbGF0ZXIgKioqKioqKioqKioqKioqKioqKioqKioKK0FDX0RFRlVOKFtBQ19CTEtJRF9WRVJTXSwgWworICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIHN1aXRhYmxlIGxpYmJsa2lkIHZlcnNpb24pCisgIEFDX0NBQ0hFX1ZBTChbbGliYmxraWRfY3ZfaXNfcmVjZW50XSwKKyAgIFsKKyAgICBzYXZlZF9MSUJTPSIkTElCUyIKKyAgICBMSUJTPS1sYmxraWQKKyAgICBBQ19UUllfUlVOKFsKKwkjaW5jbHVkZSA8YmxraWQvYmxraWQuaD4KKwlpbnQgbWFpbigpCisJeworCQlpbnQgdmVycyA9IGJsa2lkX2dldF9saWJyYXJ5X3ZlcnNpb24oMCwgMCk7CisJCXJldHVybiB2ZXJzID49IDE0MCA/IDAgOiAxOworCX0KKyAgICAgICBdLCBbbGliYmxraWRfY3ZfaXNfcmVjZW50PXllc10sIFtsaWJibGtpZF9jdl9pc19yZWNlbnQ9bm9dLAorICAgICAgIFtsaWJibGtpZF9jdl9pc19yZWNlbnQ9dW5rbm93bl0pCisgICAgTElCUz0iJHNhdmVkX0xJQlMiXSkKKyAgQUNfTVNHX1JFU1VMVCgkbGliYmxraWRfY3ZfaXNfcmVjZW50KQorXSlkbmwKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2xpYmNhcC5tNCBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2xpYmNhcC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGliY2FwLm00CkBAIC0wLDAgKzEsMTUgQEAKK2RubCBDaGVja3MgZm9yIGxpYmNhcC5zbworZG5sCitBQ19ERUZVTihbQUNfTElCQ0FQXSwgWworCisgIGRubCBsb29rIGZvciBwcmN0bAorICBBQ19DSEVDS19GVU5DKFtwcmN0bF0sICwgKQorCisgIGRubCBsb29rIGZvciB0aGUgbGlicmFyeTsgZG8gbm90IGFkZCB0byBMSUJTIGlmIGZvdW5kCisgIEFDX0NIRUNLX0xJQihbY2FwXSwgW2NhcF9nZXRfcHJvY10sIFtMSUJDQVA9LWxjYXBdLCAsKQorICBBQ19TVUJTVChMSUJDQVApCisKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL2NhcGFiaWxpdHkuaF0sICwKKyAgICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtsaWJjYXAgaGVhZGVycyBub3QgZm91bmQuXSldKQorCitdKWRubApkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGliZXZlbnQubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJldmVudC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk2MmIzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGliZXZlbnQubTQKQEAgLTAsMCArMSwxMSBAQAorZG5sIENoZWNrcyBmb3IgbGliZXZlbnQKK0FDX0RFRlVOKFtBQ19MSUJFVkVOVF0sIFsKKworICBkbmwgQ2hlY2sgZm9yIGxpYmV2ZW50LCBidXQgZG8gbm90IGFkZCAtbGV2ZW50IHRvIExJQlMKKyAgQUNfQ0hFQ0tfTElCKFtldmVudF0sIFtldmVudF9kaXNwYXRjaF0sIFtsaWJldmVudD0xXSwKKyAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2xpYmV2ZW50IG5vdCBmb3VuZC5dKV0pCisKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbZXZlbnQuaF0sICwKKyAgICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtsaWJldmVudCBoZWFkZXJzIG5vdCBmb3VuZC5dKV0pCisKK10pZG5sCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2xpYm5mc2lkbWFwLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2RlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJuZnNpZG1hcC5tNApAQCAtMCwwICsxLDE3IEBACitkbmwgQ2hlY2tzIGZvciBsaWJuZnNpZG1hcAorZG5sCitBQ19ERUZVTihbQUNfTElCTkZTSURNQVBdLCBbCisKKyAgZG5sIENoZWNrIGZvciBsaWJuZnNpZG1hcCwgYnV0IGRvIG5vdCBhZGQgLWxuZnNpZG1hcCB0byBMSUJTCisgIEFDX0NIRUNLX0xJQihbbmZzaWRtYXBdLCBbbmZzNF9pbml0X25hbWVfbWFwcGluZ10sIFtsaWJuZnNpZG1hcD0xXSwKKyAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2xpYm5mc2lkbWFwIG5vdCBmb3VuZC5dKV0pCisKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbbmZzaWRtYXAuaF0sICwKKyAgICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtsaWJuZnNpZG1hcCBoZWFkZXJzIG5vdCBmb3VuZC5dKV0pCisKKyAgZG5sIG5mczRfc2V0X2RlYnVnKCkgZG9lc24ndCBhcHBlYXIgaW4gYWxsIHZlcnNpb25zIG9mIGxpYm5mc2lkbWFwCisgIEFDX0NIRUNLX0xJQihbbmZzaWRtYXBdLCBbbmZzNF9zZXRfZGVidWddLAorICAgICAgICAgICAgICAgW0FDX0RFRklORShbSEFWRV9ORlM0X1NFVF9ERUJVR10sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG5mczRfc2V0X2RlYnVnJyBmdW5jdGlvbi5dKV0pCisKK10pZG5sCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJycGNzZWNnc3MubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkZDI1ZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNApAQCAtMCwwICsxLDE5IEBACitkbmwgQ2hlY2tzIGZvciBycGNzZWNnc3MgbGlicmFyeSBhbmQgaGVhZGVycworZG5sIEtSQjVMSUJTIG11c3QgYmUgc2V0IGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQuCitkbmwKK0FDX0RFRlVOKFtBQ19MSUJSUENTRUNHU1NdLCBbCisKKyAgZG5sIGxpYnRpcnBjIHByb3ZpZGVzIGFuIHJwY3NlY2dzcyBBUEkKKyAgaWYgdGVzdCAiJGVuYWJsZV90aXJwYyIgPSBubzsgdGhlbgorCisgICAgZG5sIENoZWNrIGZvciBsaWJyYXJ5LCBidXQgZG8gbm90IGFkZCAtbHJwY3NlY2dzcyB0byBMSUJTCisgICAgQUNfQ0hFQ0tfTElCKFtycGNzZWNnc3NdLCBbYXV0aGdzc19jcmVhdGVfZGVmYXVsdF0sIFtsaWJycGNzZWNnc3M9MV0sCisgICAgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW2xpYnJwY3NlY2dzcyBub3QgZm91bmQuXSldKQorCisgICAgQUNfQ0hFQ0tfTElCKFtycGNzZWNnc3NdLCBbYXV0aGdzc19zZXRfZGVidWdfbGV2ZWxdLAorICAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFtIQVZFX0FVVEhHU1NfU0VUX0RFQlVHX0xFVkVMXSwgMSwKKyAgICAgICAgICAgICAgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXV0aGdzc19zZXRfZGVidWdfbGV2ZWwnIGZ1bmN0aW9uLl0pXSkKKworICBmaQorCitdKWRubApkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGlidGlycGMubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJ0aXJwYy5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBmZGUwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbGlidGlycGMubTQKQEAgLTAsMCArMSw0MCBAQAorZG5sIENoZWNrcyBmb3IgVEktUlBDIGxpYnJhcnkgYW5kIGhlYWRlcnMKK2RubAorQUNfREVGVU4oW0FDX0xJQlRJUlBDXSwgWworCisgIEFDX0FSR19XSVRIKFt0aXJwY2luY2x1ZGVdLAorICAgICAgICAgICAgICBbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC10aXJwY2luY2x1ZGU9RElSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2UgVEktUlBDIGhlYWRlcnMgaW4gRElSXSldLAorICAgICAgICAgICAgICBbdGlycGNfaGVhZGVyX2Rpcj0kd2l0aHZhbF0sCisgICAgICAgICAgICAgIFt0aXJwY19oZWFkZXJfZGlyPS91c3IvaW5jbHVkZS90aXJwY10pCisKKyAgZG5sIGlmIC0tZW5hYmxlLXRpcnBjIHdhcyBzcGVjaWZlZCwgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzCisgIGRubCBtdXN0IGJlIHByZXNlbnQsIGFuZCB3ZSBzZXQgdXAgSEFWRV8gbWFjcm9zIGZvciB0aGVtLgorCisgIGlmIHRlc3QgIiRlbmFibGVfdGlycGMiICE9ICJubyI7IHRoZW4KKworICAgIGRubCBsb29rIGZvciB0aGUgbGlicmFyeTsgYWRkIHRvIExJQlMgaWYgZm91bmQKKyAgICBBQ19DSEVDS19MSUIoW3RpcnBjXSwgW2NsbnRfdGxpX2NyZWF0ZV0sICwKKyAgICAgICAgICAgICAgICAgW2lmIHRlc3QgIiRlbmFibGVfdGlycGMiID0gInllcyI7IHRoZW4KKwkJCUFDX01TR19FUlJPUihbbGlidGlycGMgbm90IGZvdW5kLl0pCisJCSAgZWxzZQorCQkJQUNfTVNHX1dBUk4oW2xpYnRpcnBjIG5vdCBmb3VuZC4gVElSUEMgZGlzYWJsZWQhXSkKKwkJCWVuYWJsZV90aXJwYz0ibm8iCisJCSAgZmldKQorICBmaQorCisgIGlmIHRlc3QgIiRlbmFibGVfdGlycGMiICE9ICJubyI7IHRoZW4KKyAgICBkbmwgYWxzbyBtdXN0IGhhdmUgdGhlIGhlYWRlcnMgaW5zdGFsbGVkIHdoZXJlIHdlIGV4cGVjdAorICAgIGRubCBsb29rIGZvciBoZWFkZXJzOyBhZGQgLUkgY29tcGlsZXIgb3B0aW9uIGlmIGZvdW5kCisgICAgQUNfQ0hFQ0tfSEVBREVSUyhbJHt0aXJwY19oZWFkZXJfZGlyfS9uZXRjb25maWcuaF0sCisgICAgCQkgICAgICBBQ19TVUJTVChbQU1fQ1BQRkxBR1NdLCBbIi1JJHt0aXJwY19oZWFkZXJfZGlyfSJdKSwKKwkJICAgICAgW2lmIHRlc3QgIiRlbmFibGVfdGlycGMiID0gInllcyI7IHRoZW4KKwkJCSBBQ19NU0dfRVJST1IoW2xpYnRpcnBjIGhlYWRlcnMgbm90IGZvdW5kLl0pCisJCSAgICAgICBlbHNlCisJCQkgQUNfTVNHX1dBUk4oW2xpYnRpcnBjIGhlYWRlcnMgbm90IGZvdW5kLiBUSVJQQyBkaXNhYmxlZCFdKQorCQkJIGVuYWJsZV90aXJwYz0ibm8iCisJCSAgICAgICBmaV0pCisKKyAgZmkKKworXSlkbmwKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2xpYnRvb2wubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJ0b29sLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWNkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9saWJ0b29sLm00CkBAIC0wLDAgKzEsNzM2MCBAQAorIyBsaWJ0b29sLm00IC0gQ29uZmlndXJlIGxpYnRvb2wgZm9yIHRoZSBob3N0IHN5c3RlbS4gLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDMsIDIwMDQsIDIwMDUsCisjICAgICAgICAgICAgICAgICAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQsIDE5OTYKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCittNF9kZWZpbmUoW19MVF9DT1BZSU5HXSwgW2RubAorIyAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMywgMjAwNCwgMjAwNSwKKyMgICAgICAgICAgICAgICAgIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBHb3Jkb24gTWF0emlna2VpdCwgMTk5NgorIworIyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBMaWJ0b29sLgorIworIyBHTlUgTGlidG9vbCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyMgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyBpZiB5b3UgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gb3IgbGlicmFyeSB0aGF0CisjIGlzIGJ1aWx0IHVzaW5nIEdOVSBMaWJ0b29sLCB5b3UgbWF5IGluY2x1ZGUgdGhpcyBmaWxlIHVuZGVyIHRoZQorIyBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKyMKKyMgR05VIExpYnRvb2wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIEdOVSBMaWJ0b29sOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgYSBjb3B5CisjIGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sLCBvcgorIyBvYnRhaW5lZCBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorXSkKKworIyBzZXJpYWwgNTYgTFRfSU5JVAorCisKKyMgTFRfUFJFUkVRKFZFUlNJT04pCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21wbGFpbiBhbmQgZXhpdCBpZiB0aGlzIGxpYnRvb2wgdmVyc2lvbiBpcyBsZXNzIHRoYXQgVkVSU0lPTi4KK200X2RlZnVuKFtMVF9QUkVSRVFdLAorW200X2lmKG00X3ZlcnNpb25fY29tcGFyZShtNF9kZWZuKFtMVF9QQUNLQUdFX1ZFUlNJT05dKSwgWyQxXSksIC0xLAorICAgICAgIFttNF9kZWZhdWx0KFskM10sCisJCSAgIFttNF9mYXRhbChbTGlidG9vbCB2ZXJzaW9uICQxIG9yIGhpZ2hlciBpcyByZXF1aXJlZF0sCisJCSAgICAgICAgICAgICA2MyldKV0sCisgICAgICAgWyQyXSldKQorCisKKyMgX0xUX0NIRUNLX0JVSUxERElSCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb21wbGFpbiBpZiB0aGUgYWJzb2x1dGUgYnVpbGQgZGlyZWN0b3J5IG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzCittNF9kZWZ1bihbX0xUX0NIRUNLX0JVSUxERElSXSwKK1tjYXNlIGBwd2RgIGluCisgICpcICogfCAqXAkqKQorICAgIEFDX01TR19XQVJOKFtMaWJ0b29sIGRvZXMgbm90IGNvcGUgd2VsbCB3aXRoIHdoaXRlc3BhY2UgaW4gYHB3ZGBdKSA7OworZXNhYworXSkKKworCisjIExUX0lOSVQoW09QVElPTlNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9JTklUXSwKK1tBQ19QUkVSRVEoWzIuNThdKWRubCBXZSB1c2UgQUNfSU5DTFVERVNfREVGQVVMVAorQUNfQkVGT1JFKFskMF0sIFtMVF9MQU5HXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK0FDX0JFRk9SRShbJDBdLCBbTFRETF9JTklUXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19CVUlMRERJUl0pZG5sCisKK2RubCBBdXRvY29uZiBkb2Vzbid0IGNhdGNoIHVuZXhwYW5kZWQgTFRfIG1hY3JvcyBieSBkZWZhdWx0OgorbTRfcGF0dGVybl9mb3JiaWQoW15fP0xUX1tBLVpfXSskXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW14oX0xUX0VPRnxMVF9ETEdMT0JBTHxMVF9ETExBWllfT1JfTk9XfExUX01VTFRJX01PRFVMRSkkXSlkbmwKK2RubCBhY2xvY2FsIGRvZXNuJ3QgcHVsbCBsdG9wdGlvbnMubTQsIGx0c3VnYXIubTQsIG9yIGx0dmVyc2lvbi5tNAorZG5sIHVubGVzcyB3ZSByZXF1aXJlIGFuIEFDX0RFRlVOZWQgbWFjcm86CitBQ19SRVFVSVJFKFtMVE9QVElPTlNfVkVSU0lPTl0pZG5sCitBQ19SRVFVSVJFKFtMVFNVR0FSX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRWRVJTSU9OX1ZFUlNJT05dKWRubAorQUNfUkVRVUlSRShbTFRPQlNPTEVURV9WRVJTSU9OXSlkbmwKK200X3JlcXVpcmUoW19MVF9QUk9HX0xUTUFJTl0pZG5sCisKK2RubCBQYXJzZSBPUFRJT05TCitfTFRfU0VUX09QVElPTlMoWyQwXSwgWyQxXSkKKworIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAorTElCVE9PTF9ERVBTPSIkbHRtYWluIgorCisjIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgorTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCitBQ19TVUJTVChMSUJUT09MKWRubAorCitfTFRfU0VUVVAKKworIyBPbmx5IGV4cGFuZCBvbmNlOgorbTRfZGVmaW5lKFtMVF9JTklUXSkKK10pIyBMVF9JTklUCisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FDX1BST0dfTElCVE9PTF0sIFtMVF9JTklUXSkKK0FVX0FMSUFTKFtBTV9QUk9HX0xJQlRPT0xdLCBbTFRfSU5JVF0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX1BST0dfTElCVE9PTF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX0xJQlRPT0xdLCBbXSkKKworCisjIF9MVF9DQ19CQVNFTkFNRShDQykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDYWxjdWxhdGUgY2NfYmFzZW5hbWUuICBTa2lwIGtub3duIGNvbXBpbGVyIHdyYXBwZXJzIGFuZCBjcm9zcy1wcmVmaXguCittNF9kZWZ1bihbX0xUX0NDX0JBU0VOQU1FXSwKK1tmb3IgY2NfdGVtcCBpbiAkMSIiOyBkbworICBjYXNlICRjY190ZW1wIGluCisgICAgY29tcGlsZSB8ICpbW1xcL11dY29tcGlsZSB8IGNjYWNoZSB8ICpbW1xcL11dY2NhY2hlICkgOzsKKyAgICBkaXN0Y2MgfCAqW1tcXC9dXWRpc3RjYyB8IHB1cmlmeSB8ICpbW1xcL11dcHVyaWZ5ICkgOzsKKyAgICBcLSopIDs7CisgICAgKikgYnJlYWs7OworICBlc2FjCitkb25lCitjY19iYXNlbmFtZT1gJEVDSE8gIlgkY2NfdGVtcCIgfCAkWHNlZCAtZSAncyUuKi8lJScgLWUgInMlXiRob3N0X2FsaWFzLSUlImAKK10pCisKKworIyBfTFRfRklMRVVUSUxTX0RFRkFVTFRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSXQgaXMgb2theSB0byB1c2UgdGhlc2UgZmlsZSBjb21tYW5kcyBhbmQgYXNzdW1lIHRoZXkgaGF2ZSBiZWVuIHNldAorIyBzZW5zaWJseSBhZnRlciBgbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pJy4KK200X2RlZnVuKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSwKK1s6ICR7Q1A9ImNwIC1mIn0KKzogJHtNVj0ibXYgLWYifQorOiAke1JNPSJybSAtZiJ9CitdKSMgX0xUX0ZJTEVVVElMU19ERUZBVUxUUworCisKKyMgX0xUX1NFVFVQCisjIC0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9TRVRVUF0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKK19MVF9ERUNMKFtdLCBbaG9zdF9hbGlhc10sIFswXSwgW1RoZSBob3N0IHN5c3RlbV0pZG5sCitfTFRfREVDTChbXSwgW2hvc3RdLCBbMF0pZG5sCitfTFRfREVDTChbXSwgW2hvc3Rfb3NdLCBbMF0pZG5sCitkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRfYWxpYXNdLCBbMF0sIFtUaGUgYnVpbGQgc3lzdGVtXSlkbmwKK19MVF9ERUNMKFtdLCBbYnVpbGRdLCBbMF0pZG5sCitfTFRfREVDTChbXSwgW2J1aWxkX29zXSwgWzBdKWRubAorZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCitkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCit0ZXN0IC16ICIkTE5fUyIgJiYgTE5fUz0ibG4gLXMiCitfTFRfREVDTChbXSwgW0xOX1NdLCBbMV0sIFtXaGV0aGVyIHdlIG5lZWQgc29mdCBvciBoYXJkIGxpbmtzXSlkbmwKK2RubAorQUNfUkVRVUlSRShbTFRfQ01EX01BWF9MRU5dKWRubAorX0xUX0RFQ0woW29iamV4dF0sIFthY19vYmpleHRdLCBbMF0sIFtPYmplY3QgZmlsZSBzdWZmaXggKG5vcm1hbGx5ICJvIildKWRubAorX0xUX0RFQ0woW10sIFtleGVleHRdLCBbMF0sIFtFeGVjdXRhYmxlIGZpbGUgc3VmZml4IChub3JtYWxseSAiIildKWRubAorZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9DSEVDS19TSEVMTF9GRUFUVVJFU10pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX1JFTE9BRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9EXSlkbmwKK200X3JlcXVpcmUoW19MVF9DTURfT0xEX0FSQ0hJVkVdKWRubAorbTRfcmVxdWlyZShbX0xUX0NNRF9HTE9CQUxfU1lNQk9MU10pZG5sCisKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFsKKyMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyMgY29tbWFuZHMgdGhyb3VnaCB3aXRob3V0IHJlbW92YWwgb2YgXCBlc2NhcGVzIElOSVQuCitpZiB0ZXN0IC1uICJcJHtaU0hfVkVSU0lPTitzZXR9IiA7IHRoZW4KKyAgIHNldG9wdCBOT19HTE9CX1NVQlNUCitmaQorXSkKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgOyB0aGVuCisgICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZmkKKworX0xUX0NIRUNLX09CSkRJUgorCittNF9yZXF1aXJlKFtfTFRfVEFHX0NPTVBJTEVSXSlkbmwKK19MVF9QUk9HX0VDSE9fQkFDS1NMQVNICisKK2Nhc2UgJGhvc3Rfb3MgaW4KK2FpeDMqKQorICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKKyAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCisgICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KKyAgaWYgdGVzdCAiWCR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorc2VkX3F1b3RlX3N1YnN0PSdzL1woW1siYCRcXF1dXCkvXFxcMS9nJworCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBkbyBub3QgcXVvdGUgdmFyaWFibGUgcmVmZXJlbmNlcy4KK2RvdWJsZV9xdW90ZV9zdWJzdD0ncy9cKFtbImBcXF1dXCkvXFxcMS9nJworCisjIFNlZCBzdWJzdGl0dXRpb24gdG8gZGVsYXkgZXhwYW5zaW9uIG9mIGFuIGVzY2FwZWQgc2hlbGwgdmFyaWFibGUgaW4gYQorIyBkb3VibGVfcXVvdGVfc3Vic3QnZWQgc3RyaW5nLgorZGVsYXlfdmFyaWFibGVfc3Vic3Q9J3MvXFxcXFxcXFxcXFwkL1xcXFxcXCQvZycKKworIyBTZWQgc3Vic3RpdHV0aW9uIHRvIGRlbGF5IGV4cGFuc2lvbiBvZiBhbiBlc2NhcGVkIHNpbmdsZSBxdW90ZS4KK2RlbGF5X3NpbmdsZV9xdW90ZV9zdWJzdD0ncy8nXCcnLydcJ1xcXFxcXFwnXCcnL2cnCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0byBhdm9pZCBhY2NpZGVudGFsIGdsb2JiaW5nIGluIGV2YWxlZCBleHByZXNzaW9ucworbm9fZ2xvYl9zdWJzdD0ncy9cKi9cXFwqL2cnCisKKyMgR2xvYmFsIHZhcmlhYmxlczoKK29maWxlPWxpYnRvb2wKK2Nhbl9idWlsZF9zaGFyZWQ9eWVzCisKKyMgQWxsIGtub3duIGxpbmtlcnMgcmVxdWlyZSBhIGAuYScgYXJjaGl2ZSBmb3Igc3RhdGljIGxpbmtpbmcgKGV4Y2VwdCBNU1ZDLAorIyB3aGljaCBuZWVkcyAnLmxpYicpLgorbGliZXh0PWEKKword2l0aF9nbnVfbGQ9IiRsdF9jdl9wcm9nX2dudV9sZCIKKworb2xkX0NDPSIkQ0MiCitvbGRfQ0ZMQUdTPSIkQ0ZMQUdTIgorCisjIFNldCBzYW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHZhcmlhYmxlcwordGVzdCAteiAiJENDIiAmJiBDQz1jYwordGVzdCAteiAiJExUQ0MiICYmIExUQ0M9JENDCit0ZXN0IC16ICIkTFRDRkxBR1MiICYmIExUQ0ZMQUdTPSRDRkxBR1MKK3Rlc3QgLXogIiRMRCIgJiYgTEQ9bGQKK3Rlc3QgLXogIiRhY19vYmpleHQiICYmIGFjX29iamV4dD1vCisKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGZvciBmaWxlLCBpZiB0aGUgY2hlY2sgbWV0aG9kIHJlcXVpcmVzIGl0Cit0ZXN0IC16ICIkTUFHSUNfQ01EIiAmJiBNQUdJQ19DTUQ9ZmlsZQorY2FzZSAkZGVwbGlic19jaGVja19tZXRob2QgaW4KK2ZpbGVfbWFnaWMqKQorICBpZiB0ZXN0ICIkZmlsZV9tYWdpY19jbWQiID0gJyRNQUdJQ19DTUQnOyB0aGVuCisgICAgX0xUX1BBVEhfTUFHSUMKKyAgZmkKKyAgOzsKK2VzYWMKKworIyBVc2UgQyBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlidG9vbCBzY3JpcHQKK0xUX1NVUFBPUlRFRF9UQUcoW0NDXSkKK19MVF9MQU5HX0NfQ09ORklHCitfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworX0xUX0NPTkZJR19DT01NQU5EUworXSkjIF9MVF9TRVRVUAorCisKKyMgX0xUX1BST0dfTFRNQUlOCisjIC0tLS0tLS0tLS0tLS0tLQorIyBOb3RlIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBib3RoIGZyb20gYGNvbmZpZ3VyZScsIGFuZCBgY29uZmlnLnN0YXR1cycKKyMgbm93IHRoYXQgd2UgdXNlIEFDX0NPTkZJR19DT01NQU5EUyB0byBnZW5lcmF0ZSBsaWJ0b29sLiAgTm90YWJseSwKKyMgYGNvbmZpZy5zdGF0dXMnIGhhcyBubyB2YWx1ZSBmb3IgYWNfYXV4X2RpciB1bmxlc3Mgd2UgYXJlIHVzaW5nIEF1dG9tYWtlLAorIyBzbyB3ZSBwYXNzIGEgY29weSBhbG9uZyB0byBtYWtlIHN1cmUgaXQgaGFzIGEgc2Vuc2libGUgdmFsdWUgYW55d2F5LgorbTRfZGVmdW4oW19MVF9QUk9HX0xUTUFJTl0sCitbbTRfaWZkZWYoW0FDX1JFUVVJUkVfQVVYX0ZJTEVdLCBbQUNfUkVRVUlSRV9BVVhfRklMRShbbHRtYWluLnNoXSldKWRubAorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW2FjX2F1eF9kaXI9JyRhY19hdXhfZGlyJ10pCitsdG1haW49IiRhY19hdXhfZGlyL2x0bWFpbi5zaCIKK10pIyBfTFRfUFJPR19MVE1BSU4KKworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBY2N1bXVsYXRlIGNvZGUgZm9yIGNyZWF0aW5nIGxpYnRvb2wuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisKKyMgU28gdGhhdCB3ZSBjYW4gcmVjcmVhdGUgYSBmdWxsIGxpYnRvb2wgc2NyaXB0IGluY2x1ZGluZyBhZGRpdGlvbmFsCisjIHRhZ3MsIHdlIGFjY3VtdWxhdGUgdGhlIGNodW5rcyBvZiBjb2RlIHRvIHNlbmQgdG8gQUNfQ09ORklHX0NPTU1BTkRTCisjIGluIG1hY3JvcyBhbmQgdGhlbiBtYWtlIGEgc2luZ2xlIGNhbGwgYXQgdGhlIGVuZCB1c2luZyB0aGUgYGxpYnRvb2wnCisjIGxhYmVsLgorCisKKyMgX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoW0lOSVQtQ09NTUFORFNdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZ2lzdGVyIElOSVQtQ09NTUFORFMgdG8gYmUgcGFzc2VkIHRvIEFDX0NPTkZJR19DT01NQU5EUyBsYXRlci4KK200X2RlZmluZShbX0xUX0NPTkZJR19MSUJUT09MX0lOSVRdLAorW200X2lmdmFsKFskMV0sCisgICAgICAgICAgW200X2FwcGVuZChbX0xUX09VVFBVVF9MSUJUT09MX0lOSVRdLAorICAgICAgICAgICAgICAgICAgICAgWyQxCitdKV0pXSkKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfSU5JVF0pCisKKworIyBfTFRfQ09ORklHX0xJQlRPT0woW0NPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlZ2lzdGVyIENPTU1BTkRTIHRvIGJlIHBhc3NlZCB0byBBQ19DT05GSUdfQ09NTUFORFMgbGF0ZXIuCittNF9kZWZpbmUoW19MVF9DT05GSUdfTElCVE9PTF0sCitbbTRfaWZ2YWwoWyQxXSwKKyAgICAgICAgICBbbTRfYXBwZW5kKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLAorICAgICAgICAgICAgICAgICAgICAgWyQxCitdKV0pXSkKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdKQorCisKKyMgX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFtDT01NQU5EU10sIFtJTklUX0NPTU1BTkRTXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09ORklHX1NBVkVfQ09NTUFORFNdLAorW19MVF9DT05GSUdfTElCVE9PTChbJDFdKQorX0xUX0NPTkZJR19MSUJUT09MX0lOSVQoWyQyXSkKK10pCisKKworIyBfTFRfRk9STUFUX0NPTU1FTlQoW0NPTU1FTlRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgbGVhZGluZyBjb21tZW50IG1hcmtzIHRvIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUsIGFuZCBhIHRyYWlsaW5nCisjIGZ1bGwtc3RvcCB0byB0aGUgd2hvbGUgY29tbWVudCBpZiBvbmUgaXMgbm90IHByZXNlbnQgYWxyZWFkeS4KK200X2RlZmluZShbX0xUX0ZPUk1BVF9DT01NRU5UXSwKK1ttNF9pZnZhbChbJDFdLCBbCittNF9icGF0c3Vic3QoW200X2JwYXRzdWJzdChbJDFdLCBbXiAqXSwgWyMgXSldLAorICAgICAgICAgICAgICBbWydgJFxdXSwgW1xcXCZdKV1tNF9ibWF0Y2goWyQxXSwgW1shPy5dJF0sIFtdLCBbLl0pCispXSkKKworCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRklYTUU6IEVsaW1pbmF0ZSBWQVJOQU1FICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworCisjIF9MVF9ERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0sIFtJUy1UQUdHRUQ/XSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDT05GSUdOQU1FIGlzIHRoZSBuYW1lIGdpdmVuIHRvIHRoZSB2YWx1ZSBpbiB0aGUgbGlidG9vbCBzY3JpcHQuCisjIFZBUk5BTUUgaXMgdGhlIChiYXNlKSBuYW1lIHVzZWQgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCisjIFZBTFVFIG1heSBiZSAwLCAxIG9yIDIgZm9yIGEgY29tcHV0ZWQgcXVvdGUgZXNjYXBlZCB2YWx1ZSBiYXNlZCBvbgorIyBWQVJOQU1FLiAgQW55IG90aGVyIHZhbHVlIHdpbGwgYmUgdXNlZCBkaXJlY3RseS4KK200X2RlZmluZShbX0xUX0RFQ0xdLAorW2x0X2lmX2FwcGVuZF91bmlxKFtsdF9kZWNsX3Zhcm5hbWVzXSwgWyQyXSwgWywgXSwKKyAgICBbbHRfZGljdF9hZGRfc3Via2V5KFtsdF9kZWNsX2RpY3RdLCBbJDJdLCBbbGlidG9vbF9uYW1lXSwKKwlbbTRfaWZ2YWwoWyQxXSwgWyQxXSwgWyQyXSldKQorICAgIGx0X2RpY3RfYWRkX3N1YmtleShbbHRfZGVjbF9kaWN0XSwgWyQyXSwgW3ZhbHVlXSwgWyQzXSkKKyAgICBtNF9pZnZhbChbJDRdLAorCVtsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sIFtkZXNjcmlwdGlvbl0sIFskNF0pXSkKKyAgICBsdF9kaWN0X2FkZF9zdWJrZXkoW2x0X2RlY2xfZGljdF0sIFskMl0sCisJW3RhZ2dlZD9dLCBbbTRfaWZ2YWwoWyQ1XSwgW3llc10sIFtub10pXSldKQorXSkKKworCisjIF9MVF9UQUdERUNMKFtDT05GSUdOQU1FXSwgVkFSTkFNRSwgVkFMVUUsIFtERVNDUklQVElPTl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9UQUdERUNMXSwgW19MVF9ERUNMKFskMV0sIFskMl0sIFskM10sIFskNF0sIFt5ZXNdKV0pCisKKworIyBsdF9kZWNsX3RhZ192YXJuYW1lcyhbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2RlY2xfdGFnX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbeWVzXSwgJEApXSkKKworCisjIF9sdF9kZWNsX2ZpbHRlcihTVUJLRVksIFZBTFVFLCBbU0VQQVJBVE9SXSwgW1ZBUk5BTUUxLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX2x0X2RlY2xfZmlsdGVyXSwKK1ttNF9jYXNlKFskI10sCisgIFswXSwgW200X2ZhdGFsKFskMDogdG9vIGZldyBhcmd1bWVudHM6ICQjXSldLAorICBbMV0sIFttNF9mYXRhbChbJDA6IHRvbyBmZXcgYXJndW1lbnRzOiAkIzogJDFdKV0sCisgIFsyXSwgW2x0X2RpY3RfZmlsdGVyKFtsdF9kZWNsX2RpY3RdLCBbJDFdLCBbJDJdLCBbXSwgbHRfZGVjbF92YXJuYW1lcyldLAorICBbM10sIFtsdF9kaWN0X2ZpbHRlcihbbHRfZGVjbF9kaWN0XSwgWyQxXSwgWyQyXSwgWyQzXSwgbHRfZGVjbF92YXJuYW1lcyldLAorICBbbHRfZGljdF9maWx0ZXIoW2x0X2RlY2xfZGljdF0sICRAKV0pW11kbmwKK10pCisKKworIyBsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX3F1b3RlX3Zhcm5hbWVzXSwKK1tfbHRfZGVjbF9maWx0ZXIoW3ZhbHVlXSwgWzFdLCAkQCldKQorCisKKyMgbHRfZGVjbF9kcXVvdGVfdmFybmFtZXMoW1NFUEFSQVRPUl0sIFtWQVJOQU1FMS4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kZWNsX2RxdW90ZV92YXJuYW1lc10sCitbX2x0X2RlY2xfZmlsdGVyKFt2YWx1ZV0sIFsyXSwgJEApXSkKKworCisjIGx0X2RlY2xfdmFybmFtZXNfdGFnZ2VkKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF92YXJuYW1lc190YWdnZWRdLAorW200X2Fzc2VydChbJCMgPD0gMl0pZG5sCitfJDAobTRfcXVvdGUobTRfZGVmYXVsdChbJDFdLCBbWywgXV0pKSwKKyAgICBtNF9pZnZhbChbJDJdLCBbWyQyXV0sIFttNF9kcXVvdGUobHRfZGVjbF90YWdfdmFybmFtZXMpXSksCisgICAgbTRfc3BsaXQobTRfbm9ybWFsaXplKG00X3F1b3RlKF9MVF9UQUdTKSksIFsgXSkpXSkKK200X2RlZmluZShbX2x0X2RlY2xfdmFybmFtZXNfdGFnZ2VkXSwKK1ttNF9pZnZhbChbJDNdLCBbbHRfY29tYmluZShbJDFdLCBbJDJdLCBbX10sICQzKV0pXSkKKworCisjIGx0X2RlY2xfYWxsX3Zhcm5hbWVzKFtTRVBBUkFUT1JdLCBbVkFSTkFNRTEuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGVjbF9hbGxfdmFybmFtZXNdLAorW18kMChtNF9xdW90ZShtNF9kZWZhdWx0KFskMV0sIFtbLCBdXSkpLAorICAgICBtNF9pZihbJDJdLCBbXSwKKwkgICBtNF9xdW90ZShsdF9kZWNsX3Zhcm5hbWVzKSwKKwltNF9xdW90ZShtNF9zaGlmdCgkQCkpKSlbXWRubAorXSkKK200X2RlZmluZShbX2x0X2RlY2xfYWxsX3Zhcm5hbWVzXSwKK1tsdF9qb2luKCRALCBsdF9kZWNsX3Zhcm5hbWVzX3RhZ2dlZChbJDFdLAorCQkJbHRfZGVjbF90YWdfdmFybmFtZXMoW1ssIF1dLCBtNF9zaGlmdCgkQCkpKSlkbmwKK10pCisKKworIyBfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJFKFtWQVJOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFF1b3RlIGEgdmFyaWFibGUgdmFsdWUsIGFuZCBmb3J3YXJkIGl0IHRvIGBjb25maWcuc3RhdHVzJyBzbyB0aGF0IGl0cworIyBkZWNsYXJhdGlvbiB0aGVyZSB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgaW4gYGNvbmZpZ3VyZScuICBWQVJOQU1FCisjIG11c3QgaGF2ZSBhIHNpbmdsZSBxdW90ZSBkZWxpbWl0ZWQgdmFsdWUgZm9yIHRoaXMgdG8gd29yay4KK200X2RlZmluZShbX0xUX0NPTkZJR19TVEFUVVNfREVDTEFSRV0sCitbJDE9J2AkRUNITyAiWCRdWyQxIiB8ICRYc2VkIC1lICIkZGVsYXlfc2luZ2xlX3F1b3RlX3N1YnN0ImAnXSkKKworCisjIF9MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkFUSU9OUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV2UgZGVsaW1pdCBsaWJ0b29sIGNvbmZpZyB2YXJpYWJsZXMgd2l0aCBzaW5nbGUgcXVvdGVzLCBzbyB3aGVuCisjIHdlIHdyaXRlIHRoZW0gdG8gY29uZmlnLnN0YXR1cywgd2UgaGF2ZSB0byBiZSBzdXJlIHRvIHF1b3RlIGFsbAorIyBlbWJlZGRlZCBzaW5nbGUgcXVvdGVzIHByb3Blcmx5LiAgSW4gY29uZmlndXJlLCB0aGlzIG1hY3JvIGV4cGFuZHMKKyMgZWFjaCB2YXJpYWJsZSBkZWNsYXJlZCB3aXRoIF9MVF9ERUNMIChhbmQgX0xUX1RBR0RFQ0wpIGludG86CisjCisjICAgIDx2YXI+PSdgJEVDSE8gIlgkPHZhcj4iIHwgJFhzZWQgLWUgIiRkZWxheV9zaW5nbGVfcXVvdGVfc3Vic3QiYCcKK200X2RlZnVuKFtfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX2FsbF92YXJuYW1lcyksCisgICAgW200X24oW19MVF9DT05GSUdfU1RBVFVTX0RFQ0xBUkUoX2x0X3ZhcildKV0pXSkKKworCisjIF9MVF9MSUJUT09MX1RBR1MKKyMgLS0tLS0tLS0tLS0tLS0tLQorIyBPdXRwdXQgY29tbWVudCBhbmQgbGlzdCBvZiB0YWdzIHN1cHBvcnRlZCBieSB0aGUgc2NyaXB0CittNF9kZWZ1bihbX0xUX0xJQlRPT0xfVEFHU10sCitbX0xUX0ZPUk1BVF9DT01NRU5UKFtUaGUgbmFtZXMgb2YgdGhlIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHRdKWRubAorYXZhaWxhYmxlX3RhZ3M9Il9MVF9UQUdTImRubAorXSkKKworCisjIF9MVF9MSUJUT09MX0RFQ0xBUkUoVkFSTkFNRSwgW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4dHJhY3QgdGhlIGRpY3Rpb25hcnkgdmFsdWVzIGZvciBWQVJOQU1FIChvcHRpb25hbGx5IHdpdGggVEFHKSBhbmQKKyMgZXhwYW5kIHRvIGEgY29tbWVudGVkIHNoZWxsIHZhcmlhYmxlIHNldHRpbmc6CisjCisjICAgICMgU29tZSBjb21tZW50IGFib3V0IHdoYXQgVkFSIGlzIGZvci4KKyMgICAgdmlzaWJsZV9uYW1lPSRsdF9pbnRlcm5hbF9uYW1lCittNF9kZWZpbmUoW19MVF9MSUJUT09MX0RFQ0xBUkVdLAorW19MVF9GT1JNQVRfQ09NTUVOVChtNF9xdW90ZShsdF9kaWN0X2ZldGNoKFtsdF9kZWNsX2RpY3RdLCBbJDFdLAorCQkJCQkgICBbZGVzY3JpcHRpb25dKSkpW11kbmwKK200X3B1c2hkZWYoW19saWJ0b29sX25hbWVdLAorICAgIG00X3F1b3RlKGx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFtsaWJ0b29sX25hbWVdKSkpW11kbmwKK200X2Nhc2UobTRfcXVvdGUobHRfZGljdF9mZXRjaChbbHRfZGVjbF9kaWN0XSwgWyQxXSwgW3ZhbHVlXSkpLAorICAgIFswXSwgW19saWJ0b29sX25hbWU9WyRdJDFdLAorICAgIFsxXSwgW19saWJ0b29sX25hbWU9JGx0X1tdJDFdLAorICAgIFsyXSwgW19saWJ0b29sX25hbWU9JGx0X1tdJDFdLAorICAgIFtfbGlidG9vbF9uYW1lPWx0X2RpY3RfZmV0Y2goW2x0X2RlY2xfZGljdF0sIFskMV0sIFt2YWx1ZV0pXSlbXWRubAorbTRfaWZ2YWwoWyQyXSwgW18kMl0pW11tNF9wb3BkZWYoW19saWJ0b29sX25hbWVdKVtdZG5sCitdKQorCisKKyMgX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvZHVjZSBjb21tZW50ZWQgZGVjbGFyYXRpb25zIG9mIG5vbi10YWdnZWQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzCisjIHN1aXRhYmxlIGZvciBpbnNlcnRpb24gaW4gdGhlIExJQlRPT0wgQ09ORklHIHNlY3Rpb24gb2YgdGhlIGBsaWJ0b29sJworIyBzY3JpcHQuICBUYWdnZWQgbGlidG9vbCBjb25maWcgdmFyaWFibGVzIChldmVuIGZvciB0aGUgTElCVE9PTCBDT05GSUcKKyMgc2VjdGlvbikgYXJlIHByb2R1Y2VkIGJ5IF9MVF9MSUJUT09MX1RBR19WQVJTLgorbTRfZGVmdW4oW19MVF9MSUJUT09MX0NPTkZJR19WQVJTXSwKK1ttNF9mb3JlYWNoKFtfbHRfdmFyXSwKKyAgICBtNF9xdW90ZShfbHRfZGVjbF9maWx0ZXIoW3RhZ2dlZD9dLCBbbm9dLCBbXSwgbHRfZGVjbF92YXJuYW1lcykpLAorICAgIFttNF9uKFtfTFRfTElCVE9PTF9ERUNMQVJFKF9sdF92YXIpXSldKV0pCisKKworIyBfTFRfTElCVE9PTF9UQUdfVkFSUyhUQUcpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX0xJQlRPT0xfVEFHX1ZBUlNdLAorW200X2ZvcmVhY2goW19sdF92YXJdLCBtNF9xdW90ZShsdF9kZWNsX3RhZ192YXJuYW1lcyksCisgICAgW200X24oW19MVF9MSUJUT09MX0RFQ0xBUkUoX2x0X3ZhciwgWyQxXSldKV0pXSkKKworCisjIF9MVF9UQUdWQVIoVkFSTkFNRSwgW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX1RBR1ZBUl0sIFttNF9pZnZhbChbJDJdLCBbJDFfJDJdLCBbJDFdKV0pCisKKworIyBfTFRfQ09ORklHX0NPTU1BTkRTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2VuZCBhY2N1bXVsYXRlZCBvdXRwdXQgdG8gJENPTkZJR19TVEFUVVMuICBUaGFua3MgdG8gdGhlIGxpc3RzIG9mCisjIHZhcmlhYmxlcyBmb3Igc2luZ2xlIGFuZCBkb3VibGUgcXVvdGUgZXNjYXBpbmcgd2Ugc2F2ZWQgZnJvbSBjYWxscworIyB0byBfTFRfREVDTCwgd2UgY2FuIHB1dCBxdW90ZSBlc2NhcGVkIHZhcmlhYmxlcyBkZWNsYXJhdGlvbnMKKyMgaW50byBgY29uZmlnLnN0YXR1cycsIGFuZCB0aGVuIHRoZSBzaGVsbCBjb2RlIHRvIHF1b3RlIGVzY2FwZSB0aGVtIGluCisjIGZvciBsb29wcyBpbiBgY29uZmlnLnN0YXR1cycuICBGaW5hbGx5LCBhbnkgYWRkaXRpb25hbCBjb2RlIGFjY3VtdWxhdGVkCisjIGZyb20gY2FsbHMgdG8gX0xUX0NPTkZJR19MSUJUT09MX0lOSVQgaXMgZXhwYW5kZWQuCittNF9kZWZ1bihbX0xUX0NPTkZJR19DT01NQU5EU10sCitbQUNfUFJPVklERV9JRkVMU0UoW0xUX09VVFBVVF0sCisJZG5sIElmIHRoZSBsaWJ0b29sIGdlbmVyYXRpb24gY29kZSBoYXMgYmVlbiBwbGFjZWQgaW4gJENPTkZJR19MVCwKKwlkbmwgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdCBhbGwgb3ZlciBhZ2FpbiBpbnRvIGNvbmZpZy5zdGF0dXMsCisJZG5sIHRoZW4gd2Ugd2lsbCBoYXZlIGNvbmZpZy5zdGF0dXMgcnVuICRDT05GSUdfTFQgbGF0ZXIsIHNvIGl0CisJZG5sIG5lZWRzIHRvIGtub3cgd2hhdCBuYW1lIGlzIHN0b3JlZCB0aGVyZToKKyAgICAgICAgW0FDX0NPTkZJR19DT01NQU5EUyhbbGlidG9vbF0sCisgICAgICAgICAgICBbJFNIRUxMICRDT05GSUdfTFQgfHwgQVNfRVhJVCgxKV0sIFtDT05GSUdfTFQ9JyRDT05GSUdfTFQnXSldLAorICAgIGRubCBJZiB0aGUgbGlidG9vbCBnZW5lcmF0aW9uIGNvZGUgaXMgZGVzdGluZWQgZm9yIGNvbmZpZy5zdGF0dXMsCisgICAgZG5sIGV4cGFuZCB0aGUgYWNjdW11bGF0ZWQgY29tbWFuZHMgYW5kIGluaXQgY29kZSBub3c6CisgICAgW0FDX0NPTkZJR19DT01NQU5EUyhbbGlidG9vbF0sCisgICAgICAgIFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNdLCBbX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVRdKV0pCitdKSNfTFRfQ09ORklHX0NPTU1BTkRTCisKKworIyBJbml0aWFsaXplLgorbTRfZGVmaW5lKFtfTFRfT1VUUFVUX0xJQlRPT0xfQ09NTUFORFNfSU5JVF0sCitbCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKK2RvdWJsZV9xdW90ZV9zdWJzdD0nJGRvdWJsZV9xdW90ZV9zdWJzdCcKK2RlbGF5X3ZhcmlhYmxlX3N1YnN0PSckZGVsYXlfdmFyaWFibGVfc3Vic3QnCitfTFRfQ09ORklHX1NUQVRVU19ERUNMQVJBVElPTlMKK0xUQ0M9JyRMVENDJworTFRDRkxBR1M9JyRMVENGTEFHUycKK2NvbXBpbGVyPSckY29tcGlsZXJfREVGQVVMVCcKKworIyBRdW90ZSBldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfcXVvdGVfdmFybmFtZXMpOyBkbworICAgIGNhc2UgXGBldmFsIFxcXFxcJEVDSE8gIlhcXFxcXCRcJHZhciJcYCBpbgorICAgICpbW1xcXFxcXFxgXFwiXFxcJF1dKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFxgXFxcJEVDSE8gXFwiWFxcXCRcJHZhclxcIiB8IFxcXCRYc2VkIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCJcXFxgXFxcXFxcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgImx0X1wkdmFyPVxcXFxcXCJcXFwkXCR2YXJcXFxcXFwiIgorICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKKyMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KK2ZvciB2YXIgaW4gbHRfZGVjbF9hbGxfdmFybmFtZXMoW1sgXAorXV0sIGx0X2RlY2xfZHF1b3RlX3Zhcm5hbWVzKTsgZG8KKyAgICBjYXNlIFxgZXZhbCBcXFxcXCRFQ0hPICJYXFxcXFwkXCR2YXIiXGAgaW4KKyAgICAqW1tcXFxcXFxcYFxcIlxcXCRdXSopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcYFxcXCRFQ0hPIFxcIlhcXFwkXCR2YXJcXCIgfCBcXFwkWHNlZCAtZSBcXCJcXFwkZG91YmxlX3F1b3RlX3N1YnN0XFwiIC1lIFxcIlxcXCRzZWRfcXVvdGVfc3Vic3RcXCIgLWUgXFwiXFxcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XFwiXFxcYFxcXFxcXCIiCisgICAgICA7OworICAgICopCisgICAgICBldmFsICJsdF9cJHZhcj1cXFxcXFwiXFxcJFwkdmFyXFxcXFxcIiIKKyAgICAgIDs7CisgICAgZXNhYworZG9uZQorCisjIEZpeC11cCBmYWxsYmFjayBlY2hvIGlmIGl0IHdhcyBtYW5nbGVkIGJ5IHRoZSBhYm92ZSBxdW90aW5nIHJ1bGVzLgorY2FzZSBcJGx0X0VDSE8gaW4KKyonXFxcWyRdMCAtLWZhbGxiYWNrLWVjaG8iJylkbmwgIgorICBsdF9FQ0hPPVxgXCRFQ0hPICJYXCRsdF9FQ0hPIiB8IFwkWHNlZCAtZSAncy9cXFxcXFxcXFxcXFxcXFxbJF0wIC0tZmFsbGJhY2stZWNobyJcWyRdL1xbJF0wIC0tZmFsbGJhY2stZWNobyIvJ1xgCisgIDs7Citlc2FjCisKK19MVF9PVVRQVVRfTElCVE9PTF9JTklUCitdKQorCisKKyMgTFRfT1VUUFVUCisjIC0tLS0tLS0tLQorIyBUaGlzIG1hY3JvIGFsbG93cyBlYXJseSBnZW5lcmF0aW9uIG9mIHRoZSBsaWJ0b29sIHNjcmlwdCAoYmVmb3JlCisjIEFDX09VVFBVVCBpcyBjYWxsZWQpLCBpbmNhc2UgaXQgaXMgdXNlZCBpbiBjb25maWd1cmUgZm9yIGNvbXBpbGF0aW9uCisjIHRlc3RzLgorQUNfREVGVU4oW0xUX09VVFBVVF0sCitbOiAke0NPTkZJR19MVD0uL2NvbmZpZy5sdH0KK0FDX01TR19OT1RJQ0UoW2NyZWF0aW5nICRDT05GSUdfTFRdKQorY2F0ID4iJENPTkZJR19MVCIgPDxfTFRFT0YKKyMhICRTSEVMTAorIyBHZW5lcmF0ZWQgYnkgJGFzX21lLgorIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIGEgbGlidG9vbCBzdHViIHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKworbHRfY2xfc2lsZW50PWZhbHNlCitTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PFxfTFRFT0YKK0FTX1NIRUxMX1NBTklUSVpFCitfQVNfUFJFUEFSRQorCitleGVjIEFTX01FU1NBR0VfRkQ+JjEKK2V4ZWMgQVNfTUVTU0FHRV9MT0dfRkQ+PmNvbmZpZy5sb2cKK3sKKyAgZWNobworICBBU19CT1goW1J1bm5pbmcgJGFzX21lLl0pCit9ID4mQVNfTUVTU0FHRV9MT0dfRkQKKworbHRfY2xfaGVscD0iXAorXGAkYXNfbWUnIGNyZWF0ZXMgYSBsb2NhbCBsaWJ0b29sIHN0dWIgZnJvbSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAorZm9yIHVzZSBpbiBmdXJ0aGVyIGNvbmZpZ3VyZSB0aW1lIHRlc3RzIGJlZm9yZSB0aGUgcmVhbCBsaWJ0b29sIGlzCitnZW5lcmF0ZWQuCisKK1VzYWdlOiAkWzBdIFtbT1BUSU9OU11dCisKKyAgLWgsIC0taGVscCAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC1WLCAtLXZlcnNpb24gICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0ICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyAgLWQsIC0tZGVidWcgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LiIKKworbHRfY2xfdmVyc2lvbj0iXAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfTkFNRV0sIFtBQ19QQUNLQUdFX05BTUUgXSljb25maWcubHRbXWRubAorbTRfaWZzZXQoW0FDX1BBQ0tBR0VfVkVSU0lPTl0sIFsgQUNfUEFDS0FHRV9WRVJTSU9OXSkKK2NvbmZpZ3VyZWQgYnkgJFswXSwgZ2VuZXJhdGVkIGJ5IG00X1BBQ0tBR0VfU1RSSU5HLgorCitDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGNvbmZpZy5sdCBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCit3aGlsZSB0ZXN0ICRbI10gIT0gMAorZG8KKyAgY2FzZSAkWzFdIGluCisgICAgLS12ZXJzaW9uIHwgLS12KiB8IC1WICkKKyAgICAgIGVjaG8gIiRsdF9jbF92ZXJzaW9uIjsgZXhpdCAwIDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgIGVjaG8gIiRsdF9jbF9oZWxwIjsgZXhpdCAwIDs7CisgICAgLS1kZWJ1ZyB8IC0tZCogfCAtZCApCisgICAgICBkZWJ1Zz06IDs7CisgICAgLS1xdWlldCB8IC0tcSogfCAtLXNpbGVudCB8IC0tcyogfCAtcSApCisgICAgICBsdF9jbF9zaWxlbnQ9OiA7OworCisgICAgLSopIEFDX01TR19FUlJPUihbdW5yZWNvZ25pemVkIG9wdGlvbjogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisKKyAgICAqKSBBQ19NU0dfRVJST1IoW3VucmVjb2duaXplZCBhcmd1bWVudDogJFsxXQorVHJ5IFxgJFswXSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLl0pIDs7CisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworaWYgJGx0X2NsX3NpbGVudDsgdGhlbgorICBleGVjIEFTX01FU1NBR0VfRkQ+L2Rldi9udWxsCitmaQorX0xURU9GCisKK2NhdCA+PiIkQ09ORklHX0xUIiA8PF9MVEVPRgorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTX0lOSVQKK19MVEVPRgorCitjYXQgPj4iJENPTkZJR19MVCIgPDxcX0xURU9GCitBQ19NU0dfTk9USUNFKFtjcmVhdGluZyAkb2ZpbGVdKQorX0xUX09VVFBVVF9MSUJUT09MX0NPTU1BTkRTCitBU19FWElUKDApCitfTFRFT0YKK2NobW9kICt4ICIkQ09ORklHX0xUIgorCisjIGNvbmZpZ3VyZSBpcyB3cml0aW5nIHRvIGNvbmZpZy5sb2csIGJ1dCBjb25maWcubHQgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLAorIyBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZywgd2hpY2ggZmFpbHMgb24gRE9TLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQKKyMgb3BlbiBieSBjb25maWd1cmUuICBIZXJlIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwgZWZmZWN0aXZlbHkgY2xvc2luZworIyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQgYXBwZW5kZWQgdG8gYnkgY29uZmlnLmx0LgoraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisgIGx0X2NsX3N1Y2Nlc3M9OgorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGx0X2NvbmZpZ19sdF9hcmdzPSIkbHRfY29uZmlnX2x0X2FyZ3MgLS1xdWlldCIKKyAgZXhlYyBBU19NRVNTQUdFX0xPR19GRD4vZGV2L251bGwKKyAgJFNIRUxMICIkQ09ORklHX0xUIiAkbHRfY29uZmlnX2x0X2FyZ3MgfHwgbHRfY2xfc3VjY2Vzcz1mYWxzZQorICBleGVjIEFTX01FU1NBR0VfTE9HX0ZEPj5jb25maWcubG9nCisgICRsdF9jbF9zdWNjZXNzIHx8IEFTX0VYSVQoMSkKK2ZpCitdKSMgTFRfT1VUUFVUCisKKworIyBfTFRfQ09ORklHKFRBRykKKyMgLS0tLS0tLS0tLS0tLS0tCisjIElmIFRBRyBpcyB0aGUgYnVpbHQtaW4gdGFnLCBjcmVhdGUgYW4gaW5pdGlhbCBsaWJ0b29sIHNjcmlwdCB3aXRoIGEKKyMgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIHVudGFnZ2VkIGNvbmZpZyB2YXJzLiAgT3RoZXJ3aXNlIGFkZCBjb2RlCisjIHRvIGNvbmZpZy5zdGF0dXMgZm9yIGFwcGVuZGluZyB0aGUgY29uZmlndXJhdGlvbiBuYW1lZCBieSBUQUcgZnJvbSB0aGUKKyMgbWF0Y2hpbmcgdGFnZ2VkIGNvbmZpZyB2YXJzLgorbTRfZGVmdW4oW19MVF9DT05GSUddLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorX0xUX0NPTkZJR19TQVZFX0NPTU1BTkRTKFsKKyAgbTRfZGVmaW5lKFtfTFRfVEFHXSwgbTRfaWYoWyQxXSwgW10sIFtDXSwgWyQxXSkpZG5sCisgIG00X2lmKF9MVF9UQUcsIFtDXSwgWworICAgICMgU2VlIGlmIHdlIGFyZSBydW5uaW5nIG9uIHpzaCwgYW5kIHNldCB0aGUgb3B0aW9ucyB3aGljaCBhbGxvdyBvdXIKKyAgICAjIGNvbW1hbmRzIHRocm91Z2ggd2l0aG91dCByZW1vdmFsIG9mIFwgZXNjYXBlcy4KKyAgICBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iIDsgdGhlbgorICAgICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKyAgICBmaQorCisgICAgY2ZnZmlsZT0iJHtvZmlsZX1UIgorICAgIHRyYXAgIiRSTSBcIiRjZmdmaWxlXCI7IGV4aXQgMSIgMSAyIDE1CisgICAgJFJNICIkY2ZnZmlsZSIKKworICAgIGNhdCA8PF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyEgJFNIRUxMCisKKyMgYCRFQ0hPICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRhc19tZSAoJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIyBMaWJ0b29sIHdhcyBjb25maWd1cmVkIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdG1haW4uc2guCisjCitfTFRfQ09QWUlORworX0xUX0xJQlRPT0xfVEFHUworCisjICMjIyBCRUdJTiBMSUJUT09MIENPTkZJRworX0xUX0xJQlRPT0xfQ09ORklHX1ZBUlMKK19MVF9MSUJUT09MX1RBR19WQVJTCisjICMjIyBFTkQgTElCVE9PTCBDT05GSUcKKworX0xUX0VPRgorCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgY2F0IDw8XF9MVF9FT0YgPj4gIiRjZmdmaWxlIgorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIlgke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gWHNldDsgdGhlbgorICBDT0xMRUNUX05BTUVTPQorICBleHBvcnQgQ09MTEVDVF9OQU1FUworZmkKK19MVF9FT0YKKyAgICA7OworICBlc2FjCisKKyAgX0xUX1BST0dfTFRNQUlOCisKKyAgIyBXZSB1c2Ugc2VkIGluc3RlYWQgb2YgY2F0IGJlY2F1c2UgYmFzaCBvbiBESkdQUCBnZXRzIGNvbmZ1c2VkIGlmCisgICMgaWYgZmluZHMgbWl4ZWQgQ1IvTEYgYW5kIExGLW9ubHkgbGluZXMuICBTaW5jZSBzZWQgb3BlcmF0ZXMgaW4KKyAgIyB0ZXh0IG1vZGUsIGl0IHByb3Blcmx5IGNvbnZlcnRzIGxpbmVzIHRvIENSL0xGLiAgVGhpcyBiYXNoIHByb2JsZW0KKyAgIyBpcyByZXBvcnRlZGx5IGZpeGVkLCBidXQgd2h5IG5vdCBydW4gb24gb2xkIHZlcnNpb25zIHRvbz8KKyAgc2VkICcvXiMgR2VuZXJhdGVkIHNoZWxsIGZ1bmN0aW9ucyBpbnNlcnRlZCBoZXJlL3EnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIF9MVF9QUk9HX1hTSV9TSEVMTEZOUworCisgIHNlZCAtbiAnL14jIEdlbmVyYXRlZCBzaGVsbCBmdW5jdGlvbnMgaW5zZXJ0ZWQgaGVyZS8sJHAnICIkbHRtYWluIiA+PiAiJGNmZ2ZpbGUiIFwKKyAgICB8fCAocm0gLWYgIiRjZmdmaWxlIjsgZXhpdCAxKQorCisgIG12IC1mICIkY2ZnZmlsZSIgIiRvZmlsZSIgfHwKKyAgICAocm0gLWYgIiRvZmlsZSIgJiYgY3AgIiRjZmdmaWxlIiAiJG9maWxlIiAmJiBybSAtZiAiJGNmZ2ZpbGUiKQorICBjaG1vZCAreCAiJG9maWxlIgorXSwKK1tjYXQgPDxfTFRfRU9GID4+ICIkb2ZpbGUiCisKK2RubCBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdXNlICQxIGhlcmUsIHNpbmNlIF9MVF9UQUcgaXMgbm90IGV4cGFuZGVkCitkbmwgaW4gYSBjb21tZW50IChpZSBhZnRlciBhICMpLgorIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkMQorX0xUX0xJQlRPT0xfVEFHX1ZBUlMoX0xUX1RBRykKKyMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICQxCitfTFRfRU9GCitdKWRubCAvbTRfaWYKK10sCitbbTRfaWYoWyQxXSwgW10sIFsKKyAgICBQQUNLQUdFPSckUEFDS0FHRScKKyAgICBWRVJTSU9OPSckVkVSU0lPTicKKyAgICBUSU1FU1RBTVA9JyRUSU1FU1RBTVAnCisgICAgUk09JyRSTScKKyAgICBvZmlsZT0nJG9maWxlJ10sIFtdKQorXSlkbmwgL19MVF9DT05GSUdfU0FWRV9DT01NQU5EUworXSkjIF9MVF9DT05GSUcKKworCisjIExUX1NVUFBPUlRFRF9UQUcoVEFHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVHJhY2UgdGhpcyBtYWNybyB0byBkaXNjb3ZlciB3aGF0IHRhZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGlidG9vbAorIyAtLXRhZyBvcHRpb24sIHVzaW5nOgorIyAgICBhdXRvY29uZiAtLXRyYWNlICdMVF9TVVBQT1JURURfVEFHOiQxJworQUNfREVGVU4oW0xUX1NVUFBPUlRFRF9UQUddLCBbXSkKKworCisjIEMgc3VwcG9ydCBpcyBidWlsdC1pbiBmb3Igbm93CittNF9kZWZpbmUoW19MVF9MQU5HX0NfZW5hYmxlZF0sIFtdKQorbTRfZGVmaW5lKFtfTFRfVEFHU10sIFtdKQorCisKKyMgTFRfTEFORyhMQU5HKQorIyAtLS0tLS0tLS0tLS0tCisjIEVuYWJsZSBsaWJ0b29sIHN1cHBvcnQgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLgorQUNfREVGVU4oW0xUX0xBTkddLAorW0FDX0JFRk9SRShbJDBdLCBbTFRfT1VUUFVUXSlkbmwKK200X2Nhc2UoWyQxXSwKKyAgW0NdLAkJCVtfTFRfTEFORyhDKV0sCisgIFtDKytdLAkJW19MVF9MQU5HKENYWCldLAorICBbSmF2YV0sCQlbX0xUX0xBTkcoR0NKKV0sCisgIFtGb3J0cmFuIDc3XSwJCVtfTFRfTEFORyhGNzcpXSwKKyAgW0ZvcnRyYW5dLAkJW19MVF9MQU5HKEZDKV0sCisgIFtXaW5kb3dzIFJlc291cmNlXSwJW19MVF9MQU5HKFJDKV0sCisgIFttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19DT05GSUddLAorICAgIFtfTFRfTEFORygkMSldLAorICAgIFttNF9mYXRhbChbJDA6IHVuc3VwcG9ydGVkIGxhbmd1YWdlOiAiJDEiXSldKV0pZG5sCitdKSMgTFRfTEFORworCisKKyMgX0xUX0xBTkcoTEFOR05BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9MQU5HXSwKK1ttNF9pZmRlZihbX0xUX0xBTkdfXSQxW19lbmFibGVkXSwgW10sCisgIFtMVF9TVVBQT1JURURfVEFHKFskMV0pZG5sCisgIG00X2FwcGVuZChbX0xUX1RBR1NdLCBbJDEgXSlkbmwKKyAgbTRfZGVmaW5lKFtfTFRfTEFOR19dJDFbX2VuYWJsZWRdLCBbXSlkbmwKKyAgX0xUX0xBTkdfJDFfQ09ORklHKCQxKV0pZG5sCitdKSMgX0xUX0xBTkcKKworCisjIF9MVF9MQU5HX0RFRkFVTFRfQ09ORklHCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0xBTkdfREVGQVVMVF9DT05GSUddLAorW0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0NYWF0sCisgIFtMVF9MQU5HKENYWCldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0NYWF0sIGRlZm4oW0FDX1BST0dfQ1hYXSlbTFRfTEFORyhDWFgpXSldKQorCitBQ19QUk9WSURFX0lGRUxTRShbQUNfUFJPR19GNzddLAorICBbTFRfTEFORyhGNzcpXSwKKyAgW200X2RlZmluZShbQUNfUFJPR19GNzddLCBkZWZuKFtBQ19QUk9HX0Y3N10pW0xUX0xBTkcoRjc3KV0pXSkKKworQUNfUFJPVklERV9JRkVMU0UoW0FDX1BST0dfRkNdLAorICBbTFRfTEFORyhGQyldLAorICBbbTRfZGVmaW5lKFtBQ19QUk9HX0ZDXSwgZGVmbihbQUNfUFJPR19GQ10pW0xUX0xBTkcoRkMpXSldKQorCitkbmwgVGhlIGNhbGwgdG8gW0FdW01fUFJPR19HQ0pdIGlzIHF1b3RlZCBsaWtlIHRoYXQgdG8gc3RvcCBhY2xvY2FsCitkbmwgcHVsbGluZyB0aGluZ3MgaW4gbmVlZGxlc3NseS4KK0FDX1BST1ZJREVfSUZFTFNFKFtBQ19QUk9HX0dDSl0sCisgIFtMVF9MQU5HKEdDSildLAorICBbQUNfUFJPVklERV9JRkVMU0UoW0FdW01fUFJPR19HQ0pdLAorICAgIFtMVF9MQU5HKEdDSildLAorICAgIFtBQ19QUk9WSURFX0lGRUxTRShbTFRfUFJPR19HQ0pdLAorICAgICAgW0xUX0xBTkcoR0NKKV0sCisgICAgICBbbTRfaWZkZWYoW0FDX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBQ19QUk9HX0dDSl0sIGRlZm4oW0FDX1BST0dfR0NKXSlbTFRfTEFORyhHQ0opXSldKQorICAgICAgIG00X2lmZGVmKFtBXVtNX1BST0dfR0NKXSwKKwlbbTRfZGVmaW5lKFtBXVtNX1BST0dfR0NKXSwgZGVmbihbQV1bTV9QUk9HX0dDSl0pW0xUX0xBTkcoR0NKKV0pXSkKKyAgICAgICBtNF9pZmRlZihbTFRfUFJPR19HQ0pdLAorCVttNF9kZWZpbmUoW0xUX1BST0dfR0NKXSwgZGVmbihbTFRfUFJPR19HQ0pdKVtMVF9MQU5HKEdDSildKV0pXSldKV0pCisKK0FDX1BST1ZJREVfSUZFTFNFKFtMVF9QUk9HX1JDXSwKKyAgW0xUX0xBTkcoUkMpXSwKKyAgW200X2RlZmluZShbTFRfUFJPR19SQ10sIGRlZm4oW0xUX1BST0dfUkNdKVtMVF9MQU5HKFJDKV0pXSkKK10pIyBfTFRfTEFOR19ERUZBVUxUX0NPTkZJRworCisjIE9ic29sZXRlIG1hY3JvczoKK0FVX0RFRlVOKFtBQ19MSUJUT09MX0NYWF0sIFtMVF9MQU5HKEMrKyldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW0xUX0xBTkcoRm9ydHJhbiA3NyldKQorQVVfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbTFRfTEFORyhGb3J0cmFuKV0pCitBVV9ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbTFRfTEFORyhKYXZhKV0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ1hYXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRjc3XSwgW10pCitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRkNdLCBbXSkKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9HQ0pdLCBbXSkKKworCisjIF9MVF9UQUdfQ09NUElMRVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9UQUdfQ09NUElMRVJdLAorW0FDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAorCitfTFRfREVDTChbTFRDQ10sIFtDQ10sIFsxXSwgW0EgQyBjb21waWxlcl0pZG5sCitfTFRfREVDTChbTFRDRkxBR1NdLCBbQ0ZMQUdTXSwgWzFdLCBbTFRDQyBjb21waWxlciBmbGFnc10pZG5sCitfTFRfVEFHREVDTChbQ0NdLCBbY29tcGlsZXJdLCBbMV0sIFtBIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyXSlkbmwKK19MVF9UQUdERUNMKFt3aXRoX2djY10sIFtHQ0NdLCBbMF0sIFtJcyB0aGUgY29tcGlsZXIgdGhlIEdOVSBjb21waWxlcj9dKWRubAorCisjIElmIG5vIEMgY29tcGlsZXIgd2FzIHNwZWNpZmllZCwgdXNlIENDLgorTFRDQz0ke0xUQ0MtIiRDQyJ9CisKKyMgSWYgbm8gQyBjb21waWxlciBmbGFncyB3ZXJlIHNwZWNpZmllZCwgdXNlIENGTEFHUy4KK0xUQ0ZMQUdTPSR7TFRDRkxBR1MtIiRDRkxBR1MifQorCisjIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgorY29tcGlsZXI9JENDCitdKSMgX0xUX1RBR19DT01QSUxFUgorCisKKyMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgY29tcGlsZXIgYm9pbGVycGxhdGUgb3V0cHV0IG9yIHdhcm5pbmdzIHdpdGgKKyMgdGhlIHNpbXBsZSBjb21waWxlciB0ZXN0IGNvZGUuCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0CitlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+Y29uZnRlc3QuJGFjX2V4dAorZXZhbCAiJGFjX2NvbXBpbGUiIDI+JjEgPi9kZXYvbnVsbCB8ICRTRUQgJy9eJC9kOyAvXiAqKy9kJyA+Y29uZnRlc3QuZXJyCitfbHRfY29tcGlsZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gY29uZnRlc3QqCitdKSMgX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFCisKKworIyBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hlY2sgZm9yIGxpbmtlciBib2lsZXJwbGF0ZSBvdXRwdXQgb3Igd2FybmluZ3Mgd2l0aAorIyB0aGUgc2ltcGxlIGxpbmsgdGVzdCBjb2RlLgorbTRfZGVmdW4oW19MVF9MSU5LRVJfQk9JTEVSUExBVEVdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCithY19vdXRmaWxlPWNvbmZ0ZXN0LiRhY19vYmpleHQKK2VjaG8gIiRsdF9zaW1wbGVfbGlua190ZXN0X2NvZGUiID5jb25mdGVzdC4kYWNfZXh0CitldmFsICIkYWNfbGluayIgMj4mMSA+L2Rldi9udWxsIHwgJFNFRCAnL14kL2Q7IC9eICorL2QnID5jb25mdGVzdC5lcnIKK19sdF9saW5rZXJfYm9pbGVycGxhdGU9YGNhdCBjb25mdGVzdC5lcnJgCiskUk0gLXIgY29uZnRlc3QqCitdKSMgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIF9MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuX29uY2UoW19MVF9SRVFVSVJFRF9EQVJXSU5fQ0hFQ0tTXSxbCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4qKQorICAgIEFDX0NIRUNLX1RPT0woW0RTWU1VVElMXSwgW2RzeW11dGlsXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW05NRURJVF0sIFtubWVkaXRdLCBbOl0pCisgICAgQUNfQ0hFQ0tfVE9PTChbTElQT10sIFtsaXBvXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MXSwgW290b29sXSwgWzpdKQorICAgIEFDX0NIRUNLX1RPT0woW09UT09MNjRdLCBbb3Rvb2w2NF0sIFs6XSkKKyAgICBfTFRfREVDTChbXSwgW0RTWU1VVElMXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gbWFuaXB1bGF0ZSBhcmNoaXZlZCBEV0FSRiBkZWJ1ZyBzeW1ib2wgZmlsZXMgb24gTWFjIE9TIFhdKQorICAgIF9MVF9ERUNMKFtdLCBbTk1FRElUXSwgWzFdLAorICAgICAgW1Rvb2wgdG8gY2hhbmdlIGdsb2JhbCB0byBsb2NhbCBzeW1ib2xzIG9uIE1hYyBPUyBYXSkKKyAgICBfTFRfREVDTChbXSwgW0xJUE9dLCBbMV0sCisgICAgICBbVG9vbCB0byBtYW5pcHVsYXRlIGZhdCBvYmplY3RzIGFuZCBhcmNoaXZlcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTF0sIFsxXSwKKyAgICAgIFtsZGQvcmVhZGVsZiBsaWtlIHRvb2wgZm9yIE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWF0pCisgICAgX0xUX0RFQ0woW10sIFtPVE9PTDY0XSwgWzFdLAorICAgICAgW2xkZC9yZWFkZWxmIGxpa2UgdG9vbCBmb3IgNjQgYml0IE1hY2gtTyBiaW5hcmllcyBvbiBNYWMgT1MgWCAxMC40XSkKKworICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgLXNpbmdsZV9tb2R1bGUgbGlua2VyIGZsYWddLFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kXSwKKyAgICAgIFtsdF9jdl9hcHBsZV9jY19zaW5nbGVfbW9kPW5vCisgICAgICBpZiB0ZXN0IC16ICIke0xUX01VTFRJX01PRFVMRX0iOyB0aGVuCisJIyBCeSBkZWZhdWx0IHdlIHdpbGwgYWRkIHRoZSAtc2luZ2xlX21vZHVsZSBmbGFnLiBZb3UgY2FuIG92ZXJyaWRlCisJIyBieSBlaXRoZXIgc2V0dGluZyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTFRfTVVMVElfTU9EVUxFCisJIyBub24tZW1wdHkgYXQgY29uZmlndXJlIHRpbWUsIG9yIGJ5IGFkZGluZyAtbXVsdGlfbW9kdWxlIHRvIHRoZQorCSMgbGluayBmbGFncy4KKwlybSAtcmYgbGliY29uZnRlc3QuZHlsaWIqCisJZWNobyAiaW50IGZvbyh2b2lkKXtyZXR1cm4gMTt9IiA+IGNvbmZ0ZXN0LmMKKwllY2hvICIkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwkkTFRDQyAkTFRDRkxBR1MgJExERkxBR1MgLW8gbGliY29uZnRlc3QuZHlsaWIgXAorCSAgLWR5bmFtaWNsaWIgLVdsLC1zaW5nbGVfbW9kdWxlIGNvbmZ0ZXN0LmMgMj5jb25mdGVzdC5lcnIKKyAgICAgICAgX2x0X3Jlc3VsdD0kPworCWlmIHRlc3QgLWYgbGliY29uZnRlc3QuZHlsaWIgJiYgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVyciAmJiB0ZXN0ICRfbHRfcmVzdWx0ID0gMDsgdGhlbgorCSAgbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZD15ZXMKKwllbHNlCisJICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorCXJtIC1yZiBsaWJjb25mdGVzdC5keWxpYioKKwlybSAtZiBjb25mdGVzdC4qCisgICAgICBmaV0pCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAtZXhwb3J0ZWRfc3ltYm9sc19saXN0IGxpbmtlciBmbGFnXSwKKyAgICAgIFtsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3RdLAorICAgICAgW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ubworICAgICAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgICAgICBlY2hvICJfbWFpbiIgPiBjb25mdGVzdC5zeW0KKyAgICAgIExERkxBR1M9IiRMREZMQUdTIC1XbCwtZXhwb3J0ZWRfc3ltYm9sc19saXN0LGNvbmZ0ZXN0LnN5bSIKKyAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sW10pXSwKKwlbbHRfY3ZfbGRfZXhwb3J0ZWRfc3ltYm9sc19saXN0PXllc10sCisJW2x0X2N2X2xkX2V4cG9ydGVkX3N5bWJvbHNfbGlzdD1ub10pCisJTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICBdKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICByaGFwc29keSogfCBkYXJ3aW4xLltbMDEyXV0pCisgICAgICBfbHRfZGFyX2FsbG93X3VuZGVmaW5lZD0nJHt3bH0tdW5kZWZpbmVkICR7d2x9c3VwcHJlc3MnIDs7CisgICAgZGFyd2luMS4qKQorICAgICAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LWZsYXRfbmFtZXNwYWNlICR7d2x9LXVuZGVmaW5lZCAke3dsfXN1cHByZXNzJyA7OworICAgIGRhcndpbiopICMgZGFyd2luIDUueCBvbgorICAgICAgIyBpZiBydW5uaW5nIG9uIDEwLjUgb3IgbGF0ZXIsIHRoZSBkZXBsb3ltZW50IHRhcmdldCBkZWZhdWx0cworICAgICAgIyB0byB0aGUgT1MgdmVyc2lvbiwgaWYgb24geDg2LCBhbmQgMTAuNCwgdGhlIGRlcGxveW1lbnQKKyAgICAgICMgdGFyZ2V0IGRlZmF1bHRzIHRvIDEwLjQuIERvbid0IHlvdSBsb3ZlIGl0PworICAgICAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSwkaG9zdCBpbgorCTEwLjAsKjg2Ki1kYXJ3aW44KnwxMC4wLCotZGFyd2luW1s5MV1dKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS11bmRlZmluZWQgJHt3bH1keW5hbWljX2xvb2t1cCcgOzsKKwkxMC5bWzAxMl1dKikKKwkgIF9sdF9kYXJfYWxsb3dfdW5kZWZpbmVkPScke3dsfS1mbGF0X25hbWVzcGFjZSAke3dsfS11bmRlZmluZWQgJHt3bH1zdXBwcmVzcycgOzsKKwkxMC4qKQorCSAgX2x0X2Rhcl9hbGxvd191bmRlZmluZWQ9JyR7d2x9LXVuZGVmaW5lZCAke3dsfWR5bmFtaWNfbG9va3VwJyA7OworICAgICAgZXNhYworICAgIDs7CisgIGVzYWMKKyAgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgPSAieWVzIjsgdGhlbgorICAgICAgX2x0X2Rhcl9zaW5nbGVfbW9kPSckc2luZ2xlX21vZHVsZScKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsdF9jdl9sZF9leHBvcnRlZF9zeW1ib2xzX2xpc3QiID0gInllcyI7IHRoZW4KKyAgICAgIF9sdF9kYXJfZXhwb3J0X3N5bXM9JyAke3dsfS1leHBvcnRlZF9zeW1ib2xzX2xpc3QsJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bScKKyAgICBlbHNlCisgICAgICBfbHRfZGFyX2V4cG9ydF9zeW1zPSd+JE5NRURJVCAtcyAkb3V0cHV0X29iamRpci8ke2xpYm5hbWV9LXN5bWJvbHMuZXhwc3ltICR7bGlifScKKyAgICBmaQorICAgIGlmIHRlc3QgIiREU1lNVVRJTCIgIT0gIjoiOyB0aGVuCisgICAgICBfbHRfZHN5bXV0aWw9J34kRFNZTVVUSUwgJGxpYiB8fCA6JworICAgIGVsc2UKKyAgICAgIF9sdF9kc3ltdXRpbD0KKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCisKKworIyBfTFRfREFSV0lOX0xJTktFUl9GRUFUVVJFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVja3MgZm9yIGxpbmtlciBhbmQgY29tcGlsZXIgZmVhdHVyZXMgb24gZGFyd2luCittNF9kZWZ1bihbX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVNdLAorWworICBtNF9yZXF1aXJlKFtfTFRfUkVRVUlSRURfREFSV0lOX0NIRUNLU10pCisgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9eWVzCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPXVuc3VwcG9ydGVkCisgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJworICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPSIkX2x0X2Rhcl9hbGxvd191bmRlZmluZWQiCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgIGlmb3J0KikgX2x0X2Rhcl9jYW5fc2hhcmVkPXllcyA7OworICAgICAqKSBfbHRfZGFyX2Nhbl9zaGFyZWQ9JEdDQyA7OworICBlc2FjCisgIGlmIHRlc3QgIiRfbHRfZGFyX2Nhbl9zaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1lY2hvCisgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0iXCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcgJF9sdF9kYXJfc2luZ2xlX21vZCR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9IlwkQ0MgXCRhbGxvd191bmRlZmluZWRfZmxhZyAtbyBcJGxpYiAtYnVuZGxlIFwkbGlib2JqcyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyR7X2x0X2RzeW11dGlsfSIKKyAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzIC1pbnN0YWxsX25hbWUgXCRycGF0aC9cJHNvbmFtZSBcJHZlcnN0cmluZyAke19sdF9kYXJfc2luZ2xlX21vZH0ke19sdF9kYXJfZXhwb3J0X3N5bXN9JHtfbHRfZHN5bXV0aWx9IgorICAgIF9MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9InNlZCAtZSAncyxeLF8sJyA8IFwkZXhwb3J0X3N5bWJvbHMgPiBcJG91dHB1dF9vYmpkaXIvXCR7bGlibmFtZX0tc3ltYm9scy5leHBzeW1+XCRDQyBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIC1idW5kbGUgXCRsaWJvYmpzIFwkZGVwbGlicyBcJGNvbXBpbGVyX2ZsYWdzJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBtNF9pZihbJDFdLCBbQ1hYXSwKK1sgICBpZiB0ZXN0ICIkbHRfY3ZfYXBwbGVfY2Nfc2luZ2xlX21vZCIgIT0gInllcyI7IHRoZW4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9IlwkQ0MgLXIgLWtlZXBfcHJpdmF0ZV9leHRlcm5zIC1ub3N0ZGxpYiAtbyBcJHtsaWJ9LW1hc3Rlci5vIFwkbGlib2Jqc35cJENDIC1keW5hbWljbGliIFwkYWxsb3dfdW5kZWZpbmVkX2ZsYWcgLW8gXCRsaWIgXCR7bGlifS1tYXN0ZXIubyBcJGRlcGxpYnMgXCRjb21waWxlcl9mbGFncyAtaW5zdGFsbF9uYW1lIFwkcnBhdGgvXCRzb25hbWUgXCR2ZXJzdHJpbmcke19sdF9kc3ltdXRpbH0iCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0ic2VkICdzLF4sXywnIDwgXCRleHBvcnRfc3ltYm9scyA+IFwkb3V0cHV0X29iamRpci9cJHtsaWJuYW1lfS1zeW1ib2xzLmV4cHN5bX5cJENDIC1yIC1rZWVwX3ByaXZhdGVfZXh0ZXJucyAtbm9zdGRsaWIgLW8gXCR7bGlifS1tYXN0ZXIubyBcJGxpYm9ianN+XCRDQyAtZHluYW1pY2xpYiBcJGFsbG93X3VuZGVmaW5lZF9mbGFnIC1vIFwkbGliIFwke2xpYn0tbWFzdGVyLm8gXCRkZXBsaWJzIFwkY29tcGlsZXJfZmxhZ3MgLWluc3RhbGxfbmFtZSBcJHJwYXRoL1wkc29uYW1lIFwkdmVyc3RyaW5nJHtfbHRfZGFyX2V4cG9ydF9zeW1zfSR7X2x0X2RzeW11dGlsfSIKKyAgICBmaQorXSxbXSkKKyAgZWxzZQorICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgIGZpCitdKQorCisjIF9MVF9TWVNfTU9EVUxFX1BBVEhfQUlYCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpbmtzIGEgbWluaW1hbCBwcm9ncmFtIGFuZCBjaGVja3MgdGhlIGV4ZWN1dGFibGUKKyMgZm9yIHRoZSBzeXN0ZW0gZGVmYXVsdCBoYXJkY29kZWQgbGlicmFyeSBwYXRoLiBJbiBtb3N0IGNhc2VzLAorIyB0aGlzIGlzIC91c3IvbGliOi9saWIsIGJ1dCB3aGVuIHRoZSBNUEkgY29tcGlsZXJzIGFyZSB1c2VkCisjIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tbXVuaWNhdGlvbiBhbmQgTVBJIGxpYnMgYXJlIGluY2x1ZGVkIHRvby4KKyMgSWYgd2UgZG9uJ3QgZmluZCBhbnl0aGluZywgdXNlIHRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBhY2NvcmRpbmcKKyMgdG8gdGhlIGFpeCBsZCBtYW51YWwuCittNF9kZWZ1bihbX0xUX1NZU19NT0RVTEVfUEFUSF9BSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCitBQ19MSU5LX0lGRUxTRShBQ19MQU5HX1BST0dSQU0sWworbHRfYWl4X2xpYnBhdGhfc2VkPScKKyAgICAvSW1wb3J0IEZpbGUgU3RyaW5ncy8sL14kLyB7CisJL14wLyB7CisJICAgIHMvXjAgICpcKC4qXCkkL1wxLworCSAgICBwCisJfQorICAgIH0nCithaXhfbGlicGF0aD1gZHVtcCAtSCBjb25mdGVzdCRhY19leGVleHQgMj4vZGV2L251bGwgfCAkU0VEIC1uIC1lICIkbHRfYWl4X2xpYnBhdGhfc2VkImAKKyMgQ2hlY2sgZm9yIGEgNjQtYml0IG9iamVjdCBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZy4KK2lmIHRlc3QgLXogIiRhaXhfbGlicGF0aCI7IHRoZW4KKyAgYWl4X2xpYnBhdGg9YGR1bXAgLUhYNjQgY29uZnRlc3QkYWNfZXhlZXh0IDI+L2Rldi9udWxsIHwgJFNFRCAtbiAtZSAiJGx0X2FpeF9saWJwYXRoX3NlZCJgCitmaV0sW10pCitpZiB0ZXN0IC16ICIkYWl4X2xpYnBhdGgiOyB0aGVuIGFpeF9saWJwYXRoPSIvdXNyL2xpYjovbGliIjsgZmkKK10pIyBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorCisKKyMgX0xUX1NIRUxMX0lOSVQoQVJHKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9TSEVMTF9JTklUXSwKK1tpZmRlZihbQUNfRElWRVJTSU9OX05PVElDRV0sCisJICAgICBbQUNfRElWRVJUX1BVU0goQUNfRElWRVJTSU9OX05PVElDRSldLAorCSBbQUNfRElWRVJUX1BVU0goTk9USUNFKV0pCiskMQorQUNfRElWRVJUX1BPUAorXSkjIF9MVF9TSEVMTF9JTklUCisKKworIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGQgc29tZSBjb2RlIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQgd2hpY2gKKyMgd2lsbCBmaW5kIGFuIGVjaG8gY29tbWFuZCB3aGljaCBkb2Vzbid0IGludGVycHJldCBiYWNrc2xhc2hlcy4KK200X2RlZnVuKFtfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSF0sCitbX0xUX1NIRUxMX0lOSVQoWworIyBDaGVjayB0aGF0IHdlIGFyZSBydW5uaW5nIHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLgorU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKworY2FzZSBYJGx0X0VDSE8gaW4KK1gqLS1mYWxsYmFjay1lY2hvKQorICAjIFJlbW92ZSBvbmUgbGV2ZWwgb2YgcXVvdGF0aW9uICh3aGljaCB3YXMgcmVxdWlyZWQgZm9yIE1ha2UpLgorICBFQ0hPPWBlY2hvICIkbHRfRUNITyIgfCBzZWQgJ3MsXFxcXFxbJF1cXFskXTAsJ1skXTAnLCdgCisgIDs7Citlc2FjCisKK0VDSE89JHtsdF9FQ0hPLWVjaG99CitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCisgIHNoaWZ0CitlbGlmIHRlc3QgIlhbJF0xIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JyA7IHRoZW4KKyAgIyBZaXBwZWUsICRFQ0hPIHdvcmtzIQorICA6CitlbHNlCisgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KKyAgZXhlYyAkU0hFTEwgIlskXTAiIC0tbm8tcmVleGVjICR7MSsiWyRdQCJ9CitmaQorCitpZiB0ZXN0ICJYWyRdMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCisgICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCisgIHNoaWZ0CisgIGNhdCA8PF9MVF9FT0YKK1skXSoKK19MVF9FT0YKKyAgZXhpdCAwCitmaQorCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgorKHVuc2V0IENEUEFUSCkgPi9kZXYvbnVsbCAyPiYxICYmIHVuc2V0IENEUEFUSAorCitpZiB0ZXN0IC16ICIkbHRfRUNITyI7IHRoZW4KKyAgaWYgdGVzdCAiWCR7ZWNob190ZXN0X3N0cmluZytzZXR9IiAhPSBYc2V0OyB0aGVuCisgICAgIyBmaW5kIGEgc3RyaW5nIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBhcyBsb25nIGFzIHRoZSBzaGVsbCBjYW4gY29wZSB3aXRoIGl0CisgICAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCAxMHEgIlskXTAiJyAnc2VkIDJxICJbJF0wIicgJ2VjaG8gdGVzdCc7IGRvCisgICAgICAjIGV4cGVjdGVkIHNpemVzOiBsZXNzIHRoYW4gMktiLCAxS2IsIDUxMiBieXRlcywgMTYgYnl0ZXMsIC4uLgorICAgICAgaWYgeyBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRjbWRgOyB9IDI+L2Rldi9udWxsICYmCisJIHsgdGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsCisgICAgICB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmkKKworICBpZiB0ZXN0ICJYYHsgJEVDSE8gJ1x0JzsgfSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgZWNob190ZXN0aW5nX3N0cmluZz1geyAkRUNITyAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgorICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICA6CisgIGVsc2UKKyAgICAjIFRoZSBTb2xhcmlzLCBBSVgsIGFuZCBEaWdpdGFsIFVuaXggZGVmYXVsdCBlY2hvIHByb2dyYW1zIHVucXVvdGUKKyAgICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCisgICAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgICAjCisgICAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgorCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGRpciBpbiAkUEFUSCAvdXNyL3VjYjsgZG8KKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgaWYgKHRlc3QgLWYgJGRpci9lY2hvIHx8IHRlc3QgLWYgJGRpci9lY2hvJGFjX2V4ZWV4dCkgJiYKKyAgICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKKyAgICAgICAgIGVjaG9fdGVzdGluZ19zdHJpbmc9YCgkZGlyL2VjaG8gIiRlY2hvX3Rlc3Rfc3RyaW5nIikgMj4vZGV2L251bGxgICYmCisgICAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICAgRUNITz0iJGRpci9lY2hvIgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisKKyAgICBpZiB0ZXN0ICJYJEVDSE8iID0gWGVjaG87IHRoZW4KKyAgICAgICMgV2UgZGlkbid0IGZpbmQgYSBiZXR0ZXIgZWNobywgc28gbG9vayBmb3IgYWx0ZXJuYXRpdmVzLgorICAgICAgaWYgdGVzdCAiWGB7IHByaW50IC1yICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisgICAgICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWB7IHByaW50IC1yICIkZWNob190ZXN0X3N0cmluZyI7IH0gMj4vZGV2L251bGxgICYmCisgICAgICAgICB0ZXN0ICJYJGVjaG9fdGVzdGluZ19zdHJpbmciID0gIlgkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KKyAgICAgICAgIyBUaGlzIHNoZWxsIGhhcyBhIGJ1aWx0aW4gcHJpbnQgLXIgdGhhdCBkb2VzIHRoZSB0cmljay4KKyAgICAgICAgRUNITz0ncHJpbnQgLXInCisgICAgICBlbGlmIHsgdGVzdCAtZiAvYmluL2tzaCB8fCB0ZXN0IC1mIC9iaW4va3NoJGFjX2V4ZWV4dDsgfSAmJgorCSAgIHRlc3QgIlgkQ09ORklHX1NIRUxMIiAhPSBYL2Jpbi9rc2g7IHRoZW4KKyAgICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgY29uZmlndXJlIGFnYWluIHdpdGggaXQuCisgICAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorICAgICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCisgICAgICAgIENPTkZJR19TSEVMTD0vYmluL2tzaAorICAgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCisgICAgICAgIGV4ZWMgJENPTkZJR19TSEVMTCAiWyRdMCIgLS1uby1yZWV4ZWMgJHsxKyJbJF1AIn0KKyAgICAgIGVsc2UKKyAgICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgorICAgICAgICBFQ0hPPSdwcmludGYgJXNcbicKKyAgICAgICAgaWYgdGVzdCAiWGB7ICRFQ0hPICdcdCc7IH0gMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCisJICAgZWNob190ZXN0aW5nX3N0cmluZz1geyAkRUNITyAiJGVjaG9fdGVzdF9zdHJpbmciOyB9IDI+L2Rldi9udWxsYCAmJgorCSAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSAgIyBDb29sLCBwcmludGYgd29ya3MKKwkgIDoKKyAgICAgICAgZWxpZiBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCAmJgorCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICdYXHQnICYmCisJICAgICBlY2hvX3Rlc3Rpbmdfc3RyaW5nPWAoJE9SSUdJTkFMX0NPTkZJR19TSEVMTCAiWyRdMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCAmJgorCSAgICAgdGVzdCAiWCRlY2hvX3Rlc3Rpbmdfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCisJICBDT05GSUdfU0hFTEw9JE9SSUdJTkFMX0NPTkZJR19TSEVMTAorCSAgZXhwb3J0IENPTkZJR19TSEVMTAorCSAgU0hFTEw9IiRDT05GSUdfU0hFTEwiCisJICBleHBvcnQgU0hFTEwKKwkgIEVDSE89IiRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iCisgICAgICAgIGVsaWYgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAgJiYKKwkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAnWFx0JyAmJgorCSAgICAgZWNob190ZXN0aW5nX3N0cmluZz1gKCRDT05GSUdfU0hFTEwgIlskXTAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAgJiYKKwkgICAgIHRlc3QgIlgkZWNob190ZXN0aW5nX3N0cmluZyIgPSAiWCRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgorCSAgRUNITz0iJENPTkZJR19TSEVMTCBbJF0wIC0tZmFsbGJhY2stZWNobyIKKyAgICAgICAgZWxzZQorCSAgIyBtYXliZSB3aXRoIGEgc21hbGxlciBzdHJpbmcuLi4KKwkgIHByZXY9OgorCisJICBmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIlskXTAiJyAnc2VkIDEwcSAiWyRdMCInICdzZWQgMjBxICJbJF0wIicgJ3NlZCA1MHEgIlskXTAiJzsgZG8KKwkgICAgaWYgeyB0ZXN0ICJYJGVjaG9fdGVzdF9zdHJpbmciID0gIlhgZXZhbCAkY21kYCI7IH0gMj4vZGV2L251bGwKKwkgICAgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIHByZXY9IiRjbWQiCisJICBkb25lCisKKwkgIGlmIHRlc3QgIiRwcmV2IiAhPSAnc2VkIDUwcSAiWyRdMCInOyB0aGVuCisJICAgIGVjaG9fdGVzdF9zdHJpbmc9YGV2YWwgJHByZXZgCisJICAgIGV4cG9ydCBlY2hvX3Rlc3Rfc3RyaW5nCisJICAgIGV4ZWMgJHtPUklHSU5BTF9DT05GSUdfU0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19ICJbJF0wIiAkezErIlskXUAifQorCSAgZWxzZQorCSAgICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgorCSAgICBFQ0hPPWVjaG8KKwkgIGZpCisgICAgICAgIGZpCisgICAgICBmaQorICAgIGZpCisgIGZpCitmaQorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHkgc3VpdGFibHkgZm9yIHBhc3NpbmcgdG8gbGlidG9vbCBmcm9tCisjIHRoZSBNYWtlZmlsZSwgaW5zdGVhZCBvZiBxdW90aW5nIHRoZSBvcmlnaW5hbCwgd2hpY2ggaXMgdXNlZCBsYXRlci4KK2x0X0VDSE89JEVDSE8KK2lmIHRlc3QgIlgkbHRfRUNITyIgPSAiWCRDT05GSUdfU0hFTEwgWyRdMCAtLWZhbGxiYWNrLWVjaG8iOyB0aGVuCisgICBsdF9FQ0hPPSIkQ09ORklHX1NIRUxMIFxcXCRcWyRdMCAtLWZhbGxiYWNrLWVjaG8iCitmaQorCitBQ19TVUJTVChsdF9FQ0hPKQorXSkKK19MVF9ERUNMKFtdLCBbU0hFTExdLCBbMV0sIFtTaGVsbCB0byB1c2Ugd2hlbiBpbnZva2luZyBzaGVsbCBzY3JpcHRzXSkKK19MVF9ERUNMKFtdLCBbRUNIT10sIFsxXSwKKyAgICBbQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzXSkKK10pIyBfTFRfUFJPR19FQ0hPX0JBQ0tTTEFTSAorCisKKyMgX0xUX0VOQUJMRV9MT0NLCisjIC0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9FTkFCTEVfTE9DS10sCitbQUNfQVJHX0VOQUJMRShbbGlidG9vbC1sb2NrXSwKKyAgW0FTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtbGlidG9vbC1sb2NrXSwKKyAgICBbYXZvaWQgbG9ja2luZyAobWlnaHQgYnJlYWsgcGFyYWxsZWwgYnVpbGRzKV0pXSkKK3Rlc3QgIngkZW5hYmxlX2xpYnRvb2xfbG9jayIgIT0geG5vICYmIGVuYWJsZV9saWJ0b29sX2xvY2s9eWVzCisKKyMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAorIyBsaWJ0b29sIHN1cHBvcnQuCitjYXNlICRob3N0IGluCitpYTY0LSotaHB1eCopCisgICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KKyAgZWNobyAnaW50IGk7JyA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICBjYXNlIGAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0LiRhY19vYmpleHRgIGluCisgICAgICAqRUxGLTMyKikKKwlIUFVYX0lBNjRfTU9ERT0iMzIiCisJOzsKKyAgICAgICpFTEYtNjQqKQorCUhQVVhfSUE2NF9NT0RFPSI2NCIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworKi0qLWlyaXg2KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0CisgIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICAgaWYgdGVzdCAiJGx0X2N2X3Byb2dfZ251X2xkIiA9IHllczsgdGhlbgorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmMzJic21pcCIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW1lbGYzMmJtaXBuMzIiCisJICA7OworCSo2NC1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC1tZWxmNjRibWlwIgorCTs7CisgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgY2FzZSBgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC4kYWNfb2JqZXh0YCBpbgorCSozMi1iaXQqKQorCSAgTEQ9IiR7TEQtbGR9IC0zMiIKKwkgIDs7CisJKk4zMiopCisJICBMRD0iJHtMRC1sZH0gLW4zMiIKKwkgIDs7CisJKjY0LWJpdCopCisJICBMRD0iJHtMRC1sZH0gLTY0IgorCSAgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKK3g4Nl82NC0qa2ZyZWVic2QqLWdudXx4ODZfNjQtKmxpbnV4KnxwcGMqLSpsaW51eCp8cG93ZXJwYyotKmxpbnV4KnwgXAorczM5MCotKmxpbnV4KnxzMzkwKi0qdHBmKnxzcGFyYyotKmxpbnV4KikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAgICozMi1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2X2Zic2QiCisJICAgIDs7CisJICB4ODZfNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl9pMzg2IgorCSAgICA7OworCSAgcHBjNjQtKmxpbnV4Knxwb3dlcnBjNjQtKmxpbnV4KikKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZjMycHBjbGludXgiCisJICAgIDs7CisJICBzMzkweC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3MzOTAiCisJICAgIDs7CisJICBzcGFyYzY0LSpsaW51eCopCisJICAgIExEPSIke0xELWxkfSAtbSBlbGYzMl9zcGFyYyIKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgICo2NC1iaXQqKQorCWNhc2UgJGhvc3QgaW4KKwkgIHg4Nl82NC0qa2ZyZWVic2QqLWdudSkKKwkgICAgTEQ9IiR7TEQtbGR9IC1tIGVsZl94ODZfNjRfZmJzZCIKKwkgICAgOzsKKwkgIHg4Nl82NC0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmX3g4Nl82NCIKKwkgICAgOzsKKwkgIHBwYyotKmxpbnV4Knxwb3dlcnBjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRwcGMiCisJICAgIDs7CisJICBzMzkwKi0qbGludXgqfHMzOTAqLSp0cGYqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfczM5MCIKKwkgICAgOzsKKwkgIHNwYXJjKi0qbGludXgqKQorCSAgICBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiCisJICAgIDs7CisJZXNhYworCTs7CisgICAgZXNhYworICBmaQorICBybSAtcmYgY29uZnRlc3QqCisgIDs7CisKKyotKi1zY28zLjJ2NSopCisgICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KKyAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKKyAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAorICAgIFtBQ19MQU5HX1BVU0goQykKKyAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbW11dLFtbXV0pXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSkKKyAgICAgQUNfTEFOR19QT1BdKQorICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgorICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgorICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgorICBmaQorICA7Oworc3BhcmMqLSpzb2xhcmlzKikKKyAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgorICBlY2hvICdpbnQgaTsnID4gY29uZnRlc3QuJGFjX2V4dAorICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgorICAgIGNhc2UgYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AgaW4KKyAgICAqNjQtYml0KikKKyAgICAgIGNhc2UgJGx0X2N2X3Byb2dfZ251X2xkIGluCisgICAgICB5ZXMqKSBMRD0iJHtMRC1sZH0gLW0gZWxmNjRfc3BhcmMiIDs7CisgICAgICAqKQorCWlmICR7TEQtbGR9IC02NCAtciAtbyBjb25mdGVzdDIubyBjb25mdGVzdC5vID4vZGV2L251bGwgMj4mMTsgdGhlbgorCSAgTEQ9IiR7TEQtbGR9IC02NCIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICA7OworZXNhYworCituZWVkX2xvY2tzPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKK10pIyBfTFRfRU5BQkxFX0xPQ0sKKworCisjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DTURfT0xEX0FSQ0hJVkVdLAorW0FDX0NIRUNLX1RPT0woQVIsIGFyLCBmYWxzZSkKK3Rlc3QgLXogIiRBUiIgJiYgQVI9YXIKK3Rlc3QgLXogIiRBUl9GTEFHUyIgJiYgQVJfRkxBR1M9Y3J1CitfTFRfREVDTChbXSwgW0FSXSwgWzFdLCBbVGhlIGFyY2hpdmVyXSkKK19MVF9ERUNMKFtdLCBbQVJfRkxBR1NdLCBbMV0pCisKK0FDX0NIRUNLX1RPT0woU1RSSVAsIHN0cmlwLCA6KQordGVzdCAteiAiJFNUUklQIiAmJiBTVFJJUD06CitfTFRfREVDTChbXSwgW1NUUklQXSwgWzFdLCBbQSBzeW1ib2wgc3RyaXBwaW5nIHByb2dyYW1dKQorCitBQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQordGVzdCAteiAiJFJBTkxJQiIgJiYgUkFOTElCPToKK19MVF9ERUNMKFtdLCBbUkFOTElCXSwgWzFdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQorCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiAkQVJfRkxBR1MgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgY2FzZSAkaG9zdF9vcyBpbgorICBvcGVuYnNkKikKKyAgICBvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzflwkUkFOTElCIC10IFwkb2xkbGliIgorICAgIDs7CisgICopCisgICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHM9IiRvbGRfcG9zdGluc3RhbGxfY21kc35cJFJBTkxJQiBcJG9sZGxpYiIKKyAgICA7OworICBlc2FjCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkb2xkbGliIgorZmkKK19MVF9ERUNMKFtdLCBbb2xkX3Bvc3RpbnN0YWxsX2NtZHNdLCBbMl0pCitfTFRfREVDTChbXSwgW29sZF9wb3N0dW5pbnN0YWxsX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW29sZF9hcmNoaXZlX2NtZHNdLCBbMl0sCisgICAgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW4gb2xkLXN0eWxlIGFyY2hpdmVdKQorXSkjIF9MVF9DTURfT0xEX0FSQ0hJVkUKKworCisjIF9MVF9DT01QSUxFUl9PUFRJT04oTUVTU0FHRSwgVkFSSUFCTEUtTkFNRSwgRkxBR1MsCisjCQlbT1VUUFVULUZJTEVdLCBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGNvbXBpbGVyIG9wdGlvbiB3b3JrcworQUNfREVGVU4oW19MVF9DT01QSUxFUl9PUFRJT05dLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX0NBQ0hFX0NIRUNLKFskMV0sIFskMl0sCisgIFskMj1ubworICAgbTRfaWYoWyQ0XSwgLCBbYWNfb3V0ZmlsZT1jb25mdGVzdC4kYWNfb2JqZXh0XSwgW2FjX291dGZpbGU9JDRdKQorICAgZWNobyAiJGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSIgPiBjb25mdGVzdC4kYWNfZXh0CisgICBsdF9jb21waWxlcl9mbGFnPSIkMyIKKyAgICMgSW5zZXJ0IHRoZSBvcHRpb24gZWl0aGVyICgxKSBhZnRlciB0aGUgbGFzdCAqRkxBR1MgdmFyaWFibGUsIG9yCisgICAjICgyKSBiZWZvcmUgYSB3b3JkIGNvbnRhaW5pbmcgImNvbmZ0ZXN0LiIsIG9yICgzKSBhdCB0aGUgZW5kLgorICAgIyBOb3RlIHRoYXQgJGFjX2NvbXBpbGUgaXRzZWxmIGRvZXMgbm90IGNvbnRhaW4gYmFja3NsYXNoZXMgYW5kIGJlZ2lucworICAgIyB3aXRoIGEgZG9sbGFyIHNpZ24gKG5vdCBhIGh5cGhlbiksIHNvIHRoZSBlY2hvIHNob3VsZCB3b3JrIGNvcnJlY3RseS4KKyAgICMgVGhlIG9wdGlvbiBpcyByZWZlcmVuY2VkIHZpYSBhIHZhcmlhYmxlIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuCisgICBsdF9jb21waWxlPWBlY2hvICIkYWNfY29tcGlsZSIgfCAkU0VEIFwKKyAgIC1lICdzOi4qRkxBR1N9XHswLDFcfSA6JiRsdF9jb21waWxlcl9mbGFnIDo7IHQnIFwKKyAgIC1lICdzOiBbW14gXV0qY29uZnRlc3RcLjogJGx0X2NvbXBpbGVyX2ZsYWcmOjsgdCcgXAorICAgLWUgJ3M6JDogJGx0X2NvbXBpbGVyX2ZsYWc6J2AKKyAgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICRsdF9jb21waWxlXCIiID4mQVNfTUVTU0FHRV9MT0dfRkQpCisgICAoZXZhbCAiJGx0X2NvbXBpbGUiIDI+Y29uZnRlc3QuZXJyKQorICAgYWNfc3RhdHVzPSQ/CisgICBjYXQgY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgIiRhY19vdXRmaWxlIjsgdGhlbgorICAgICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAorICAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3Mgb3RoZXIgdGhhbiB0aGUgdXN1YWwgb3V0cHV0LgorICAgICAkRUNITyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+Y29uZnRlc3QuZXhwCisgICAgICRTRUQgJy9eJC9kOyAvXiAqKy9kJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMgorICAgICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QuZXIyIHx8IGRpZmYgY29uZnRlc3QuZXhwIGNvbmZ0ZXN0LmVyMiA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgJDI9eWVzCisgICAgIGZpCisgICBmaQorICAgJFJNIGNvbmZ0ZXN0KgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDVdLCAsIDosIFskNV0pCitlbHNlCisgICAgbTRfaWYoWyQ2XSwgLCA6LCBbJDZdKQorZmkKK10pIyBfTFRfQ09NUElMRVJfT1BUSU9OCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9DT01QSUxFUl9PUFRJT05dLCBbX0xUX0NPTVBJTEVSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfQ09NUElMRVJfT1BUSU9OXSwgW10pCisKKworIyBfTFRfTElOS0VSX09QVElPTihNRVNTQUdFLCBWQVJJQUJMRS1OQU1FLCBGTEFHUywKKyMgICAgICAgICAgICAgICAgICBbQUNUSU9OLVNVQ0NFU1NdLCBbQUNUSU9OLUZBSUxVUkVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGxpbmtlciBvcHRpb24gd29ya3MKK0FDX0RFRlVOKFtfTFRfTElOS0VSX09QVElPTl0sCitbbTRfcmVxdWlyZShbX0xUX0ZJTEVVVElMU19ERUZBVUxUU10pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorQUNfQ0FDSEVfQ0hFQ0soWyQxXSwgWyQyXSwKKyAgWyQyPW5vCisgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgTERGTEFHUz0iJExERkxBR1MgJDMiCisgICBlY2hvICIkbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGlmIChldmFsICRhY19saW5rIDI+Y29uZnRlc3QuZXJyKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgorICAgICAjIFRoZSBsaW5rZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKKyAgICAgIyBTbyBzYXkgbm8gaWYgdGhlcmUgYXJlIHdhcm5pbmdzCisgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgJEVDSE8gIlgkX2x0X2xpbmtlcl9ib2lsZXJwbGF0ZSIgfCAkWHNlZCAtZSAnL14kL2QnID4gY29uZnRlc3QuZXhwCisgICAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIyCisgICAgICAgaWYgZGlmZiBjb25mdGVzdC5leHAgY29uZnRlc3QuZXIyID4vZGV2L251bGw7IHRoZW4KKyAgICAgICAgICQyPXllcworICAgICAgIGZpCisgICAgIGVsc2UKKyAgICAgICAkMj15ZXMKKyAgICAgZmkKKyAgIGZpCisgICAkUk0gLXIgY29uZnRlc3QqCisgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorXSkKKworaWYgdGVzdCB4IlskXSQyIiA9IHh5ZXM7IHRoZW4KKyAgICBtNF9pZihbJDRdLCAsIDosIFskNF0pCitlbHNlCisgICAgbTRfaWYoWyQ1XSwgLCA6LCBbJDVdKQorZmkKK10pIyBfTFRfTElOS0VSX09QVElPTgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtfTFRfTElOS0VSX09QVElPTl0pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sIFtdKQorCisKKyMgTFRfQ01EX01BWF9MRU4KKyMtLS0tLS0tLS0tLS0tLS0KK0FDX0RFRlVOKFtMVF9DTURfTUFYX0xFTl0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorIyBmaW5kIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCitBQ19NU0dfQ0hFQ0tJTkcoW3RoZSBtYXhpbXVtIGxlbmd0aCBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzXSkKK0FDX0NBQ0hFX1ZBTChbbHRfY3Zfc3lzX21heF9jbWRfbGVuXSwgW2RubAorICBpPTAKKyAgdGVzdHN0cmluZz0iQUJDRCIKKworICBjYXNlICRidWlsZF9vcyBpbgorICBtc2Rvc2RqZ3BwKikKKyAgICAjIE9uIERKR1BQLCB0aGlzIHRlc3QgY2FuIGJsb3cgdXAgcHJldHR5IGJhZGx5IGR1ZSB0byBwcm9ibGVtcyBpbiBsaWJjCisgICAgIyAoYW55IHNpbmdsZSBhcmd1bWVudCBleGNlZWRpbmcgMjAwMCBieXRlcyBjYXVzZXMgYSBidWZmZXIgb3ZlcnJ1bgorICAgICMgZHVyaW5nIGdsb2IgZXhwYW5zaW9uKS4gIEV2ZW4gaWYgaXQgd2VyZSBmaXhlZCwgdGhlIHJlc3VsdCBvZiB0aGlzCisgICAgIyBjaGVjayB3b3VsZCBiZSBsYXJnZXIgdGhhbiBpdCBzaG91bGQgYmUuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEyMjg4OyAgICAjIDEySyBpcyBhYm91dCByaWdodAorICAgIDs7CisKKyAgZ251KikKKyAgICAjIFVuZGVyIEdOVSBIdXJkLCB0aGlzIHRlc3QgaXMgbm90IHJlcXVpcmVkIGJlY2F1c2UgdGhlcmUgaXMKKyAgICAjIG5vIGxpbWl0IHRvIHRoZSBsZW5ndGggb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAjIExpYnRvb2wgd2lsbCBpbnRlcnByZXQgLTEgYXMgbm8gbGltaXQgd2hhdHNvZXZlcgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj0tMTsKKyAgICA7OworCisgIGN5Z3dpbiogfCBtaW5ndyogfCBjZWdjYyopCisgICAgIyBPbiBXaW45eC9NRSwgdGhpcyB0ZXN0IGJsb3dzIHVwIC0tIGl0IHN1Y2NlZWRzLCBidXQgdGFrZXMKKyAgICAjIGFib3V0IDUgbWludXRlcyBhcyB0aGUgdGVzdHN0cmluZyBncm93cyBleHBvbmVudGlhbGx5LgorICAgICMgV29yc2UsIHNpbmNlIDl4L01FIGFyZSBub3QgcHJlLWVtcHRpdmVseSBtdWx0aXRhc2tpbmcsCisgICAgIyB5b3UgZW5kIHVwIHdpdGggYSAiZnJvemVuIiBjb21wdXRlciwgZXZlbiB0aG91Z2ggd2l0aCBwYXRpZW5jZQorICAgICMgdGhlIHRlc3QgZXZlbnR1YWxseSBzdWNjZWVkcyAod2l0aCBhIG1heCBsaW5lIGxlbmd0aCBvZiAyNTZrKS4KKyAgICAjIEluc3RlYWQsIGxldCdzIGp1c3QgcHVudDogdXNlIHRoZSBtaW5pbXVtIGxpbmVsZW5ndGggcmVwb3J0ZWQgYnkKKyAgICAjIGFsbCBvZiB0aGUgc3VwcG9ydGVkIHBsYXRmb3JtczogODE5MiAob24gTlQvMksvWFApLgorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj04MTkyOworICAgIDs7CisKKyAgYW1pZ2FvcyopCisgICAgIyBPbiBBbWlnYU9TIHdpdGggcGRrc2gsIHRoaXMgdGVzdCB0YWtlcyBob3VycywgbGl0ZXJhbGx5LgorICAgICMgU28gd2UganVzdCBwdW50IGFuZCB1c2UgYSBtaW5pbXVtIGxpbmUgbGVuZ3RoIG9mIDgxOTIuCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTgxOTI7CisgICAgOzsKKworICBuZXRic2QqIHwgZnJlZWJzZCogfCBvcGVuYnNkKiB8IGRhcndpbiogfCBkcmFnb25mbHkqKQorICAgICMgVGhpcyBoYXMgYmVlbiBhcm91bmQgc2luY2UgMzg2QlNELCBhdCBsZWFzdC4gIExpa2VseSBmdXJ0aGVyLgorICAgIGlmIHRlc3QgLXggL3NiaW4vc3lzY3RsOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YC9zYmluL3N5c2N0bCAtbiBrZXJuLmFyZ21heGAKKyAgICBlbGlmIHRlc3QgLXggL3Vzci9zYmluL3N5c2N0bDsgdGhlbgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWAvdXNyL3NiaW4vc3lzY3RsIC1uIGtlcm4uYXJnbWF4YAorICAgIGVsc2UKKyAgICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj02NTUzNgkjIHVzYWJsZSBkZWZhdWx0IGZvciBhbGwgQlNEcworICAgIGZpCisgICAgIyBBbmQgYWRkIGEgc2FmZXR5IHpvbmUKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gZXhwciAkbHRfY3Zfc3lzX21heF9jbWRfbGVuIFwqIDNgCisgICAgOzsKKworICBpbnRlcml4KikKKyAgICAjIFdlIGtub3cgdGhlIHZhbHVlIDI2MjE0NCBhbmQgaGFyZGNvZGUgaXQgd2l0aCBhIHNhZmV0eSB6b25lIChsaWtlIEJTRCkKKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTk2NjA4CisgICAgOzsKKworICBvc2YqKQorICAgICMgRHIuIEhhbnMgRWtrZWhhcmQgUGxlc3NlciByZXBvcnRzIHNlZWluZyBhIGtlcm5lbCBwYW5pYyBydW5uaW5nIGNvbmZpZ3VyZQorICAgICMgZHVlIHRvIHRoaXMgdGVzdCB3aGVuIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXQgaXMgMSBvbiBUcnU2NC4gSXQgaXMgbm90CisgICAgIyBuaWNlIHRvIGNhdXNlIGtlcm5lbCBwYW5pY3Mgc28gbGV0cyBhdm9pZCB0aGUgbG9vcCBiZWxvdy4KKyAgICAjIEZpcnN0IHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdC4KKyAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49MTYzODQKKyAgICAjCisgICAgaWYgdGVzdCAteCAvc2Jpbi9zeXNjb25maWc7IHRoZW4KKyAgICAgIGNhc2UgYC9zYmluL3N5c2NvbmZpZyAtcSBwcm9jIGV4ZWNfZGlzYWJsZV9hcmdfbGltaXRgIGluCisgICAgICAgICoxKikgbHRfY3Zfc3lzX21heF9jbWRfbGVuPS0xIDs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICBzY28zLjJ2NSopCisgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTEwMjQwMAorICAgIDs7CisgIHN5c3Y1KiB8IHNjbzV2NiogfCBzeXN2NC4ydXcyKikKKyAgICBrYXJnbWF4PWBncmVwIEFSR19NQVggL2V0Yy9jb25mL2NmLmQvc3R1bmUgMj4vZGV2L251bGxgCisgICAgaWYgdGVzdCAtbiAiJGthcmdtYXgiOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGVjaG8gJGthcmdtYXggfCBzZWQgJ3MvLipbWwkgXV0vLydgCisgICAgZWxzZQorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPTMyNzY4CisgICAgZmkKKyAgICA7OworICAqKQorICAgIGx0X2N2X3N5c19tYXhfY21kX2xlbj1gKGdldGNvbmYgQVJHX01BWCkgMj4gL2Rldi9udWxsYAorICAgIGlmIHRlc3QgLW4gIiRsdF9jdl9zeXNfbWF4X2NtZF9sZW4iOyB0aGVuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgJGx0X2N2X3N5c19tYXhfY21kX2xlbiBcLyA0YAorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXCogM2AKKyAgICBlbHNlCisgICAgICAjIE1ha2UgdGVzdHN0cmluZyBhIGxpdHRsZSBiaWdnZXIgYmVmb3JlIHdlIGRvIGFueXRoaW5nIHdpdGggaXQuCisgICAgICAjIGEgMUsgc3RyaW5nIHNob3VsZCBiZSBhIHJlYXNvbmFibGUgc3RhcnQuCisgICAgICBmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOyBkbworICAgICAgICB0ZXN0c3RyaW5nPSR0ZXN0c3RyaW5nJHRlc3RzdHJpbmcKKyAgICAgIGRvbmUKKyAgICAgIFNIRUxMPSR7U0hFTEwtJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH19CisgICAgICAjIElmIHRlc3QgaXMgbm90IGEgc2hlbGwgYnVpbHQtaW4sIHdlJ2xsIHByb2JhYmx5IGVuZCB1cCBjb21wdXRpbmcgYQorICAgICAgIyBtYXhpbXVtIGxlbmd0aCB0aGF0IGlzIG9ubHkgaGFsZiBvZiB0aGUgYWN0dWFsIG1heGltdW0gbGVuZ3RoLCBidXQKKyAgICAgICMgd2UgY2FuJ3QgdGVsbC4KKyAgICAgIHdoaWxlIHsgdGVzdCAiWCJgJFNIRUxMIFskXTAgLS1mYWxsYmFjay1lY2hvICJYJHRlc3RzdHJpbmckdGVzdHN0cmluZyIgMj4vZGV2L251bGxgIFwKKwkgICAgICAgICA9ICJYWCR0ZXN0c3RyaW5nJHRlc3RzdHJpbmciOyB9ID4vZGV2L251bGwgMj4mMSAmJgorCSAgICAgIHRlc3QgJGkgIT0gMTcgIyAxLzIgTUIgc2hvdWxkIGJlIGVub3VnaAorICAgICAgZG8KKyAgICAgICAgaT1gZXhwciAkaSArIDFgCisgICAgICAgIHRlc3RzdHJpbmc9JHRlc3RzdHJpbmckdGVzdHN0cmluZworICAgICAgZG9uZQorICAgICAgIyBPbmx5IGNoZWNrIHRoZSBzdHJpbmcgbGVuZ3RoIG91dHNpZGUgdGhlIGxvb3AuCisgICAgICBsdF9jdl9zeXNfbWF4X2NtZF9sZW49YGV4cHIgIlgkdGVzdHN0cmluZyIgOiAiLioiIDI+JjFgCisgICAgICB0ZXN0c3RyaW5nPQorICAgICAgIyBBZGQgYSBzaWduaWZpY2FudCBzYWZldHkgZmFjdG9yIGJlY2F1c2UgQysrIGNvbXBpbGVycyBjYW4gdGFjayBvbgorICAgICAgIyBtYXNzaXZlIGFtb3VudHMgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUKKyAgICAgICMgbGlua2VyLiAgSXQgYXBwZWFycyBhcyB0aG91Z2ggMS8yIGlzIGEgdXNhYmxlIHZhbHVlLgorICAgICAgbHRfY3Zfc3lzX21heF9jbWRfbGVuPWBleHByICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gXC8gMmAKKyAgICBmaQorICAgIDs7CisgIGVzYWMKK10pCitpZiB0ZXN0IC1uICRsdF9jdl9zeXNfbWF4X2NtZF9sZW4gOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJGx0X2N2X3N5c19tYXhfY21kX2xlbikKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChub25lKQorZmkKK21heF9jbWRfbGVuPSRsdF9jdl9zeXNfbWF4X2NtZF9sZW4KK19MVF9ERUNMKFtdLCBbbWF4X2NtZF9sZW5dLCBbMF0sCisgICAgW1doYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgY29tbWFuZD9dKQorXSkjIExUX0NNRF9NQVhfTEVOCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbQUNfTElCVE9PTF9TWVNfTUFYX0NNRF9MRU5dLCBbTFRfQ01EX01BWF9MRU5dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19NQVhfQ01EX0xFTl0sIFtdKQorCisKKyMgX0xUX0hFQURFUl9ETEZDTgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0hFQURFUl9ETEZDTl0sCitbQUNfQ0hFQ0tfSEVBREVSUyhbZGxmY24uaF0sIFtdLCBbXSwgW0FDX0lOQ0xVREVTX0RFRkFVTFRdKWRubAorXSkjIF9MVF9IRUFERVJfRExGQ04KKworCisjIF9MVF9UUllfRExPUEVOX1NFTEYgKEFDVElPTi1JRi1UUlVFLCBBQ1RJT04tSUYtVFJVRS1XLVVTQ09SRSwKKyMgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OLUlGLUZBTFNFLCBBQ1RJT04tSUYtQ1JPU1MtQ09NUElMSU5HKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1RSWV9ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbiA6CisgIFskNF0KK2Vsc2UKKyAgbHRfZGx1bmtub3duPTA7IGx0X2Rsbm9fdXNjb3JlPTE7IGx0X2RsbmVlZF91c2NvcmU9MgorICBsdF9zdGF0dXM9JGx0X2RsdW5rbm93bgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorWyNsaW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZiBIQVZFX0RMRkNOX0gKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgUlRMRF9HTE9CQUwKKyMgIGRlZmluZSBMVF9ETEdMT0JBTAkJUlRMRF9HTE9CQUwKKyNlbHNlCisjICBpZmRlZiBETF9HTE9CQUwKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQlETF9HTE9CQUwKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExUX0RMR0xPQkFMCQkwCisjICBlbmRpZgorI2VuZGlmCisKKy8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVF9ETExBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKKyAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KKyNpZm5kZWYgTFRfRExMQVpZX09SX05PVworIyAgaWZkZWYgUlRMRF9MQVpZCisjICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlSVExEX0xBWlkKKyMgIGVsc2UKKyMgICAgaWZkZWYgRExfTEFaWQorIyAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCQlETF9MQVpZCisjICAgIGVsc2UKKyMgICAgICBpZmRlZiBSVExEX05PVworIyAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJUlRMRF9OT1cKKyMgICAgICBlbHNlCisjICAgICAgICBpZmRlZiBETF9OT1cKKyMgICAgICAgICAgZGVmaW5lIExUX0RMTEFaWV9PUl9OT1cJRExfTk9XCisjICAgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBMVF9ETExBWllfT1JfTk9XCTAKKyMgICAgICAgIGVuZGlmCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKwordm9pZCBmbm9yZCgpIHsgaW50IGk9NDI7fQoraW50IG1haW4gKCkKK3sKKyAgdm9pZCAqc2VsZiA9IGRsb3BlbiAoMCwgTFRfRExHTE9CQUx8TFRfRExMQVpZX09SX05PVyk7CisgIGludCBzdGF0dXMgPSAkbHRfZGx1bmtub3duOworCisgIGlmIChzZWxmKQorICAgIHsKKyAgICAgIGlmIChkbHN5bSAoc2VsZiwiZm5vcmQiKSkgICAgICAgc3RhdHVzID0gJGx0X2Rsbm9fdXNjb3JlOworICAgICAgZWxzZSBpZiAoZGxzeW0oIHNlbGYsIl9mbm9yZCIpKSBzdGF0dXMgPSAkbHRfZGxuZWVkX3VzY29yZTsKKyAgICAgIC8qIGRsY2xvc2UgKHNlbGYpOyAqLworICAgIH0KKyAgZWxzZQorICAgIHB1dHMgKGRsZXJyb3IgKCkpOworCisgIHJldHVybiBzdGF0dXM7Cit9XQorX0xUX0VPRgorICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9IDI+L2Rldi9udWxsOyB0aGVuCisgICAgKC4vY29uZnRlc3Q7IGV4aXQ7ICkgPiZBU19NRVNTQUdFX0xPR19GRCAyPi9kZXYvbnVsbAorICAgIGx0X3N0YXR1cz0kPworICAgIGNhc2UgeCRsdF9zdGF0dXMgaW4KKyAgICAgIHgkbHRfZGxub191c2NvcmUpICQxIDs7CisgICAgICB4JGx0X2RsbmVlZF91c2NvcmUpICQyIDs7CisgICAgICB4JGx0X2RsdW5rbm93bnx4KikgJDMgOzsKKyAgICBlc2FjCisgIGVsc2UgOgorICAgICMgY29tcGlsYXRpb24gZmFpbGVkCisgICAgJDMKKyAgZmkKK2ZpCitybSAtZnIgY29uZnRlc3QqCitdKSMgX0xUX1RSWV9ETE9QRU5fU0VMRgorCisKKyMgTFRfU1lTX0RMT1BFTl9TRUxGCisjIC0tLS0tLS0tLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1NZU19ETE9QRU5fU0VMRl0sCitbbTRfcmVxdWlyZShbX0xUX0hFQURFUl9ETEZDTl0pZG5sCitpZiB0ZXN0ICJ4JGVuYWJsZV9kbG9wZW4iICE9IHh5ZXM7IHRoZW4KKyAgZW5hYmxlX2Rsb3Blbj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZj11bmtub3duCisgIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93bgorZWxzZQorICBsdF9jdl9kbG9wZW49bm8KKyAgbHRfY3ZfZGxvcGVuX2xpYnM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBiZW9zKikKKyAgICBsdF9jdl9kbG9wZW49ImxvYWRfYWRkX29uIgorICAgIGx0X2N2X2Rsb3Blbl9saWJzPQorICAgIGx0X2N2X2Rsb3Blbl9zZWxmPXllcworICAgIDs7CisKKyAgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgbHRfY3ZfZGxvcGVuPSJMb2FkTGlicmFyeSIKKyAgICBsdF9jdl9kbG9wZW5fbGlicz0KKyAgICA7OworCisgIGN5Z3dpbiopCisgICAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgOzsKKworICBkYXJ3aW4qKQorICAjIGlmIGxpYmRsIGlzIGluc3RhbGxlZCB3ZSBuZWVkIHRvIGxpbmsgYWdhaW5zdCBpdAorICAgIEFDX0NIRUNLX0xJQihbZGxdLCBbZGxvcGVuXSwKKwkJW2x0X2N2X2Rsb3Blbj0iZGxvcGVuIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbCJdLFsKKyAgICBsdF9jdl9kbG9wZW49ImR5bGQiCisgICAgbHRfY3ZfZGxvcGVuX2xpYnM9CisgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCisgICAgXSkKKyAgICA7OworCisgICopCisgICAgQUNfQ0hFQ0tfRlVOQyhbc2hsX2xvYWRdLAorCSAgW2x0X2N2X2Rsb3Blbj0ic2hsX2xvYWQiXSwKKyAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtzaGxfbG9hZF0sCisJICAgIFtsdF9jdl9kbG9wZW49InNobF9sb2FkIiBsdF9jdl9kbG9wZW5fbGlicz0iLWxkbGQiXSwKKwlbQUNfQ0hFQ0tfRlVOQyhbZGxvcGVuXSwKKwkgICAgICBbbHRfY3ZfZGxvcGVuPSJkbG9wZW4iXSwKKwkgIFtBQ19DSEVDS19MSUIoW2RsXSwgW2Rsb3Blbl0sCisJCVtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiXSwKKwkgICAgW0FDX0NIRUNLX0xJQihbc3ZsZF0sIFtkbG9wZW5dLAorCQkgIFtsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sc3ZsZCJdLAorCSAgICAgIFtBQ19DSEVDS19MSUIoW2RsZF0sIFtkbGRfbGlua10sCisJCSAgICBbbHRfY3ZfZGxvcGVuPSJkbGRfbGluayIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGxkIl0pCisJICAgICAgXSkKKwkgICAgXSkKKwkgIF0pCisJXSkKKyAgICAgIF0pCisgICAgOzsKKyAgZXNhYworCisgIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KKyAgICBlbmFibGVfZGxvcGVuPXllcworICBlbHNlCisgICAgZW5hYmxlX2Rsb3Blbj1ubworICBmaQorCisgIGNhc2UgJGx0X2N2X2Rsb3BlbiBpbgorICBkbG9wZW4pCisgICAgc2F2ZV9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2RsZmNuX2giID0geHllcyAmJiBDUFBGTEFHUz0iJENQUEZMQUdTIC1ESEFWRV9ETEZDTl9IIgorCisgICAgc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKKyAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCisKKyAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgIExJQlM9IiRsdF9jdl9kbG9wZW5fbGlicyAkTElCUyIKKworICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZiwgW2RubAorCSAgX0xUX1RSWV9ETE9QRU5fU0VMRigKKwkgICAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzLCBsdF9jdl9kbG9wZW5fc2VsZj15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmPW5vLCBsdF9jdl9kbG9wZW5fc2VsZj1jcm9zcykKKyAgICBdKQorCisgICAgaWYgdGVzdCAieCRsdF9jdl9kbG9wZW5fc2VsZiIgPSB4eWVzOyB0aGVuCisgICAgICB3bD0kbHRfcHJvZ19jb21waWxlcl93bCBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGx0X3Byb2dfY29tcGlsZXJfc3RhdGljXCIKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIGEgc3RhdGljYWxseSBsaW5rZWQgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZl0sCisJICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMsIFtkbmwKKwkgIF9MVF9UUllfRExPUEVOX1NFTEYoCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz15ZXMsCisJICAgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1ubywgIGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYz1jcm9zcykKKyAgICAgIF0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkc2F2ZV9DUFBGTEFHUyIKKyAgICBMREZMQUdTPSIkc2F2ZV9MREZMQUdTIgorICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGx0X2N2X2Rsb3Blbl9zZWxmIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmPSRsdF9jdl9kbG9wZW5fc2VsZiA7OworICAqKSBlbmFibGVfZGxvcGVuX3NlbGY9dW5rbm93biA7OworICBlc2FjCisKKyAgY2FzZSAkbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIGluCisgIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7CisgICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OworICBlc2FjCitmaQorX0xUX0RFQ0woW2Rsb3Blbl9zdXBwb3J0XSwgW2VuYWJsZV9kbG9wZW5dLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBpcyBzdXBwb3J0ZWRdKQorX0xUX0RFQ0woW2Rsb3Blbl9zZWxmXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl0sIFswXSwKKwkgW1doZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZF0pCitfTFRfREVDTChbZGxvcGVuX3NlbGZfc3RhdGljXSwgW2VuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWNdLCBbMF0sCisJIFtXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWRdKQorXSkjIExUX1NZU19ETE9QRU5fU0VMRgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0xJQlRPT0xfRExPUEVOX1NFTEZdLCBbTFRfU1lTX0RMT1BFTl9TRUxGXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5fU0VMRl0sIFtdKQorCisKKyMgX0xUX0NPTVBJTEVSX0NfTyhbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtYyBhbmQgLW8gYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlci4KKyMgVGhpcyBtYWNybyBkb2VzIG5vdCBoYXJkIGNvZGUgdGhlIGNvbXBpbGVyIGxpa2UgQUNfUFJPR19DQ19DX08uCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0NfT10sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitBQ19DQUNIRV9DSEVDSyhbaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuJGFjX29iamV4dF0sCisgIFtfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSldLAorICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX2NfbywgJDEpPW5vCisgICAkUk0gLXIgY29uZnRlc3QgMj4vZGV2L251bGwKKyAgIG1rZGlyIGNvbmZ0ZXN0CisgICBjZCBjb25mdGVzdAorICAgbWtkaXIgb3V0CisgICBlY2hvICIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIiA+IGNvbmZ0ZXN0LiRhY19leHQKKworICAgbHRfY29tcGlsZXJfZmxhZz0iLW8gb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0IgorICAgIyBJbnNlcnQgdGhlIG9wdGlvbiBlaXRoZXIgKDEpIGFmdGVyIHRoZSBsYXN0ICpGTEFHUyB2YXJpYWJsZSwgb3IKKyAgICMgKDIpIGJlZm9yZSBhIHdvcmQgY29udGFpbmluZyAiY29uZnRlc3QuIiwgb3IgKDMpIGF0IHRoZSBlbmQuCisgICAjIE5vdGUgdGhhdCAkYWNfY29tcGlsZSBpdHNlbGYgZG9lcyBub3QgY29udGFpbiBiYWNrc2xhc2hlcyBhbmQgYmVnaW5zCisgICAjIHdpdGggYSBkb2xsYXIgc2lnbiAobm90IGEgaHlwaGVuKSwgc28gdGhlIGVjaG8gc2hvdWxkIHdvcmsgY29ycmVjdGx5LgorICAgbHRfY29tcGlsZT1gZWNobyAiJGFjX2NvbXBpbGUiIHwgJFNFRCBcCisgICAtZSAnczouKkZMQUdTfVx7MCwxXH0gOiYkbHRfY29tcGlsZXJfZmxhZyA6OyB0JyBcCisgICAtZSAnczogW1teIF1dKmNvbmZ0ZXN0XC46ICRsdF9jb21waWxlcl9mbGFnJjo7IHQnIFwKKyAgIC1lICdzOiQ6ICRsdF9jb21waWxlcl9mbGFnOidgCisgICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiAkbHRfY29tcGlsZVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZEKQorICAgKGV2YWwgIiRsdF9jb21waWxlIiAyPm91dC9jb25mdGVzdC5lcnIpCisgICBhY19zdGF0dXM9JD8KKyAgIGNhdCBvdXQvY29uZnRlc3QuZXJyID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGVjaG8gIiRhc19tZTpfX29saW5lX186IFwkPyA9ICRhY19zdGF0dXMiID4mQVNfTUVTU0FHRV9MT0dfRkQKKyAgIGlmIChleGl0ICRhY19zdGF0dXMpICYmIHRlc3QgLXMgb3V0L2NvbmZ0ZXN0Mi4kYWNfb2JqZXh0CisgICB0aGVuCisgICAgICMgVGhlIGNvbXBpbGVyIGNhbiBvbmx5IHdhcm4gYW5kIGlnbm9yZSB0aGUgb3B0aW9uIGlmIG5vdCByZWNvZ25pemVkCisgICAgICMgU28gc2F5IG5vIGlmIHRoZXJlIGFyZSB3YXJuaW5ncworICAgICAkRUNITyAiWCRfbHRfY29tcGlsZXJfYm9pbGVycGxhdGUiIHwgJFhzZWQgLWUgJy9eJC9kJyA+IG91dC9jb25mdGVzdC5leHAKKyAgICAgJFNFRCAnL14kL2Q7IC9eICorL2QnIG91dC9jb25mdGVzdC5lcnIgPm91dC9jb25mdGVzdC5lcjIKKyAgICAgaWYgdGVzdCAhIC1zIG91dC9jb25mdGVzdC5lcjIgfHwgZGlmZiBvdXQvY29uZnRlc3QuZXhwIG91dC9jb25mdGVzdC5lcjIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgIF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKT15ZXMKKyAgICAgZmkKKyAgIGZpCisgICBjaG1vZCB1K3cgLiAyPiZBU19NRVNTQUdFX0xPR19GRAorICAgJFJNIGNvbmZ0ZXN0KgorICAgIyBTR0kgQysrIGNvbXBpbGVyIHdpbGwgY3JlYXRlIGRpcmVjdG9yeSBvdXQvaWlfZmlsZXMvIGZvcgorICAgIyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCisgICB0ZXN0IC1kIG91dC9paV9maWxlcyAmJiAkUk0gb3V0L2lpX2ZpbGVzLyogJiYgcm1kaXIgb3V0L2lpX2ZpbGVzCisgICAkUk0gb3V0LyogJiYgcm1kaXIgb3V0CisgICBjZCAuLgorICAgJFJNIC1yIGNvbmZ0ZXN0CisgICAkUk0gY29uZnRlc3QqCitdKQorX0xUX1RBR0RFQ0woW2NvbXBpbGVyX2Nfb10sIFtsdF9jdl9wcm9nX2NvbXBpbGVyX2Nfb10sIFsxXSwKKwlbRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zP10pCitdKSMgX0xUX0NPTVBJTEVSX0NfTworCisKKyMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1NdLAorW200X3JlcXVpcmUoW19MVF9FTkFCTEVfTE9DS10pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK19MVF9DT01QSUxFUl9DX08oWyQxXSkKKworaGFyZF9saW5rcz0ibm90dGVzdGVkIgoraWYgdGVzdCAiJF9MVF9UQUdWQVIobHRfY3ZfcHJvZ19jb21waWxlcl9jX28sICQxKSIgPSBubyAmJiB0ZXN0ICIkbmVlZF9sb2NrcyIgIT0gbm87IHRoZW4KKyAgIyBkbyBub3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBvZiBuZWVkX2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyCisgIEFDX01TR19DSEVDS0lORyhbaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzXSkKKyAgaGFyZF9saW5rcz15ZXMKKyAgJFJNIGNvbmZ0ZXN0KgorICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4vZGV2L251bGwgJiYgaGFyZF9saW5rcz1ubworICB0b3VjaCBjb25mdGVzdC5hCisgIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPiY1IHx8IGhhcmRfbGlua3M9bm8KKyAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KKyAgQUNfTVNHX1JFU1VMVChbJGhhcmRfbGlua3NdKQorICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgorICAgIEFDX01TR19XQVJOKFtgJENDJyBkb2VzIG5vdCBzdXBwb3J0IGAtYyAtbycsIHNvIGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlXSkKKyAgICBuZWVkX2xvY2tzPXdhcm4KKyAgZmkKK2Vsc2UKKyAgbmVlZF9sb2Nrcz1ubworZmkKK19MVF9ERUNMKFtdLCBbbmVlZF9sb2Nrc10sIFsxXSwgW011c3Qgd2UgbG9jayBmaWxlcyB3aGVuIGRvaW5nIGNvbXBpbGF0aW9uP10pCitdKSMgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MKKworCisjIF9MVF9DSEVDS19PQkpESVIKKyMgLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmdW4oW19MVF9DSEVDS19PQkpESVJdLAorW0FDX0NBQ0hFX0NIRUNLKFtmb3Igb2JqZGlyXSwgW2x0X2N2X29iamRpcl0sCitbcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKK21rZGlyIC5saWJzIDI+L2Rldi9udWxsCitpZiB0ZXN0IC1kIC5saWJzOyB0aGVuCisgIGx0X2N2X29iamRpcj0ubGlicworZWxzZQorICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgorICBsdF9jdl9vYmpkaXI9X2xpYnMKK2ZpCitybWRpciAubGlicyAyPi9kZXYvbnVsbF0pCitvYmpkaXI9JGx0X2N2X29iamRpcgorX0xUX0RFQ0woW10sIFtvYmpkaXJdLCBbMF0sCisgICAgICAgICBbVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRlbXBvcmFyeSBsaWJ0b29sIGZpbGVzXSlkbmwKK200X3BhdHRlcm5fYWxsb3coW0xUX09CSkRJUl0pZG5sCitBQ19ERUZJTkVfVU5RVU9URUQoTFRfT0JKRElSLCAiJGx0X2N2X29iamRpci8iLAorICBbRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy5dKQorXSkjIF9MVF9DSEVDS19PQkpESVIKKworCisjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSChbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENoZWNrIGhhcmRjb2RpbmcgYXR0cmlidXRlcy4KK200X2RlZnVuKFtfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEhdLAorW0FDX01TR19DSEVDS0lORyhbaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtc10pCitfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPQoraWYgdGVzdCAtbiAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpIiB8fAorICAgdGVzdCAtbiAiJF9MVF9UQUdWQVIocnVucGF0aF92YXIsICQxKSIgfHwKKyAgIHRlc3QgIlgkX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKSIgPSAiWHllcyIgOyB0aGVuCisKKyAgIyBXZSBjYW4gaGFyZGNvZGUgbm9uLWV4aXN0ZW50IGRpcmVjdG9yaWVzLgorICBpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKSIgIT0gbm8gJiYKKyAgICAgIyBJZiB0aGUgb25seSBtZWNoYW5pc20gdG8gYXZvaWQgaGFyZGNvZGluZyBpcyBzaGxpYnBhdGhfdmFyLCB3ZQorICAgICAjIGhhdmUgdG8gcmVsaW5rLCBvdGhlcndpc2Ugd2UgbWlnaHQgbGluayB3aXRoIGFuIGluc3RhbGxlZCBsaWJyYXJ5CisgICAgICMgd2hlbiB3ZSBzaG91bGQgYmUgbGlua2luZyB3aXRoIGEgeWV0LXRvLWJlLWluc3RhbGxlZCBvbmUKKyAgICAgIyMgdGVzdCAiJF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpIiAhPSBubyAmJgorICAgICB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSkiICE9IG5vOyB0aGVuCisgICAgIyBMaW5raW5nIGFsd2F5cyBoYXJkY29kZXMgdGhlIHRlbXBvcmFyeSBsaWJyYXJ5IGRpcmVjdG9yeS4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXJlbGluaworICBlbHNlCisgICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KKyAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPWltbWVkaWF0ZQorICBmaQorZWxzZQorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZywgb3IgZWxzZSB3ZSBjYW4gb25seSBoYXJkY29kZSBleGlzdGluZworICAjIGRpcmVjdG9yaWVzLgorICBfTFRfVEFHVkFSKGhhcmRjb2RlX2FjdGlvbiwgJDEpPXVuc3VwcG9ydGVkCitmaQorQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIoaGFyZGNvZGVfYWN0aW9uLCAkMSldKQorCitpZiB0ZXN0ICIkX0xUX1RBR1ZBUihoYXJkY29kZV9hY3Rpb24sICQxKSIgPSByZWxpbmsgfHwKKyAgIHRlc3QgIiRfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKSIgPSB5ZXM7IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KK2VsaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgfHwKKyAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm87IHRoZW4KKyAgIyBGYXN0IGluc3RhbGxhdGlvbiBpcyBub3QgbmVjZXNzYXJ5CisgIGVuYWJsZV9mYXN0X2luc3RhbGw9bmVlZGxlc3MKK2ZpCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2FjdGlvbl0sIFswXSwKKyAgICBbSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGVdKQorXSkjIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSAorCisKKyMgX0xUX0NNRF9TVFJJUExJQgorIyAtLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NNRF9TVFJJUExJQl0sCitbbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKQorc3RyaXBsaWI9CitvbGRfc3RyaXBsaWI9CitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgc3RyaXBwaW5nIGxpYnJhcmllcyBpcyBwb3NzaWJsZV0pCitpZiB0ZXN0IC1uICIkU1RSSVAiICYmICRTVFJJUCAtViAyPiYxIHwgJEdSRVAgIkdOVSBzdHJpcCIgPi9kZXYvbnVsbDsgdGhlbgorICB0ZXN0IC16ICIkb2xkX3N0cmlwbGliIiAmJiBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtLXN0cmlwLWRlYnVnIgorICB0ZXN0IC16ICIkc3RyaXBsaWIiICYmIHN0cmlwbGliPSIkU1RSSVAgLS1zdHJpcC11bm5lZWRlZCIKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyMgRklYTUUgLSBpbnNlcnQgc29tZSByZWFsIHRlc3RzLCBob3N0X29zIGlzbid0IHJlYWxseSBnb29kIGVub3VnaAorICBjYXNlICRob3N0X29zIGluCisgIGRhcndpbiopCisgICAgaWYgdGVzdCAtbiAiJFNUUklQIiA7IHRoZW4KKyAgICAgIHN0cmlwbGliPSIkU1RSSVAgLXgiCisgICAgICBvbGRfc3RyaXBsaWI9IiRTVFJJUCAtUyIKKyAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgZWxzZQorICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgIGZpCisgICAgOzsKKyAgKikKKyAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgOzsKKyAgZXNhYworZmkKK19MVF9ERUNMKFtdLCBbb2xkX3N0cmlwbGliXSwgWzFdLCBbQ29tbWFuZHMgdG8gc3RyaXAgbGlicmFyaWVzXSkKK19MVF9ERUNMKFtdLCBbc3RyaXBsaWJdLCBbMV0pCitdKSMgX0xUX0NNRF9TVFJJUExJQgorCisKKyMgX0xUX1NZU19EWU5BTUlDX0xJTktFUihbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK200X2RlZnVuKFtfTFRfU1lTX0RZTkFNSUNfTElOS0VSXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZHluYW1pYyBsaW5rZXIgY2hhcmFjdGVyaXN0aWNzXSkKK200X2lmKFskMV0sCisJW10sIFsKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKSBsdF9hd2tfYXJnPSIvXmxpYnJhcmllczovLC9MUi8iIDs7CisgICAgKikgbHRfYXdrX2FyZz0iL15saWJyYXJpZXM6LyIgOzsKKyAgZXNhYworICBsdF9zZWFyY2hfcGF0aF9zcGVjPWAkQ0MgLXByaW50LXNlYXJjaC1kaXJzIHwgYXdrICRsdF9hd2tfYXJnIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICBpZiAkRUNITyAiJGx0X3NlYXJjaF9wYXRoX3NwZWMiIHwgJEdSRVAgJzsnID4vZGV2L251bGwgOyB0aGVuCisgICAgIyBpZiB0aGUgcGF0aCBjb250YWlucyAiOyIgdGhlbiB3ZSBhc3N1bWUgaXQgdG8gYmUgdGhlIHNlcGFyYXRvcgorICAgICMgb3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIHBhdGggc2VwYXJhdG9yIChpLmUuICI6IikgLSBpdCBpcworICAgICMgYXNzdW1lZCB0aGF0IG5vIHBhcnQgb2YgYSBub3JtYWwgcGF0aG5hbWUgY29udGFpbnMgIjsiIGJ1dCB0aGF0IHNob3VsZAorICAgICMgb2theSBpbiB0aGUgcmVhbCB3b3JsZCB3aGVyZSAiOyIgaW4gZGlycGF0aHMgaXMgaXRzZWxmIHByb2JsZW1hdGljLgorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEIC1lICdzLzsvIC9nJ2AKKyAgZWxzZQorICAgIGx0X3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkbHRfc2VhcmNoX3BhdGhfc3BlYyIgfCAkU0VEICAtZSAicy8kUEFUSF9TRVBBUkFUT1IvIC9nImAKKyAgZmkKKyAgIyBPaywgbm93IHdlIGhhdmUgdGhlIHBhdGgsIHNlcGFyYXRlZCBieSBzcGFjZXMsIHdlIGNhbiBzdGVwIHRocm91Z2ggaXQKKyAgIyBhbmQgYWRkIG11bHRpbGliIGRpciBpZiBuZWNlc3NhcnkuCisgIGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPQorICBsdF9tdWx0aV9vc19kaXI9YCRDQyAkQ1BQRkxBR1MgJENGTEFHUyAkTERGTEFHUyAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5IDI+L2Rldi9udWxsYAorICBmb3IgbHRfc3lzX3BhdGggaW4gJGx0X3NlYXJjaF9wYXRoX3NwZWM7IGRvCisgICAgaWYgdGVzdCAtZCAiJGx0X3N5c19wYXRoLyRsdF9tdWx0aV9vc19kaXIiOyB0aGVuCisgICAgICBsdF90bXBfbHRfc2VhcmNoX3BhdGhfc3BlYz0iJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjICRsdF9zeXNfcGF0aC8kbHRfbXVsdGlfb3NfZGlyIgorICAgIGVsc2UKKyAgICAgIHRlc3QgLWQgIiRsdF9zeXNfcGF0aCIgJiYgXAorCWx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfdG1wX2x0X3NlYXJjaF9wYXRoX3NwZWMgJGx0X3N5c19wYXRoIgorICAgIGZpCisgIGRvbmUKKyAgbHRfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gJGx0X3RtcF9sdF9zZWFyY2hfcGF0aF9zcGVjIHwgYXdrICcKK0JFR0lOIHtSUz0iICI7IEZTPSIvfFxuIjt9IHsKKyAgbHRfZm9vPSIiOworICBsdF9jb3VudD0wOworICBmb3IgKGx0X2kgPSBORjsgbHRfaSA+IDA7IGx0X2ktLSkgeworICAgIGlmICgkbHRfaSAhPSAiIiAmJiAkbHRfaSAhPSAiLiIpIHsKKyAgICAgIGlmICgkbHRfaSA9PSAiLi4iKSB7CisgICAgICAgIGx0X2NvdW50Kys7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobHRfY291bnQgPT0gMCkgeworICAgICAgICAgIGx0X2Zvbz0iLyIgJGx0X2kgbHRfZm9vOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGx0X2NvdW50LS07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGx0X2ZvbyAhPSAiIikgeyBsdF9mcmVxW1tsdF9mb29dXSsrOyB9CisgIGlmIChsdF9mcmVxW1tsdF9mb29dXSA9PSAxKSB7IHByaW50IGx0X2ZvbzsgfQorfSdgCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz1gJEVDSE8gJGx0X3NlYXJjaF9wYXRoX3NwZWNgCitlbHNlCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL2xpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKK2ZpXSkKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3NocmV4dF9jbWRzPSIuc28iCitwb3N0aW5zdGFsbF9jbWRzPQorcG9zdHVuaW5zdGFsbF9jbWRzPQorZmluaXNoX2NtZHM9CitmaW5pc2hfZXZhbD0KK3NobGlicGF0aF92YXI9CitzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9dW5rbm93bgordmVyc2lvbl90eXBlPW5vbmUKK2R5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBsZC5zbyIKK3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliIC91c3IvbGliIgorbmVlZF9saWJfcHJlZml4PXVua25vd24KK2hhcmRjb2RlX2ludG9fbGlicz1ubworCisjIHdoZW4geW91IHNldCBuZWVkX3ZlcnNpb24gdG8gbm8sIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBjYXVzZSAtc2V0X3ZlcnNpb24KKyMgZmxhZ3MgdG8gYmUgbGVmdCB3aXRob3V0IGFyZ3VtZW50cworbmVlZF92ZXJzaW9uPXVua25vd24KKworY2FzZSAkaG9zdF9vcyBpbgorYWl4MyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUuYScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisKKyAgIyBBSVggMyBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyB3ZSBhcHBlbmQgYSBtYWpvciB2ZXJzaW9uIHRvIHRoZSBuYW1lLgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICA7OworCithaXhbWzQtOV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorICAgICMgQUlYIDUgc3VwcG9ydHMgSUE2NAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIGVsc2UKKyAgICAjIFdpdGggR0NDIHVwIHRvIDIuOTUueCwgY29sbGVjdDIgd291bGQgY3JlYXRlIGFuIGltcG9ydCBmaWxlCisgICAgIyBmb3IgZGVwZW5kZW5jZSBsaWJyYXJpZXMuICBUaGUgaW1wb3J0IGZpbGUgd291bGQgc3RhcnQgd2l0aAorICAgICMgdGhlIGxpbmUgYCMhIC4nLiAgVGhpcyB3b3VsZCBjYXVzZSB0aGUgZ2VuZXJhdGVkIGxpYnJhcnkgdG8KKyAgICAjIGRlcGVuZCBvbiBgLicsIGFsd2F5cyBhbiBpbnZhbGlkIGxpYnJhcnkuICBUaGlzIHdhcyBmaXhlZCBpbgorICAgICMgZGV2ZWxvcG1lbnQgc25hcHNob3RzIG9mIEdDQyBwcmlvciB0byAzLjAuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4NCB8IGFpeDQuW1swMV1dIHwgYWl4NC5bWzAxXV0uKikKKyAgICAgIGlmIHsgZWNobyAnI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA5NyknCisJICAgZWNobyAnIHllcyAnCisJICAgZWNobyAnI2VuZGlmJzsgfSB8ICR7Q0N9IC1FIC0gfCAkR1JFUCB5ZXMgPiAvZGV2L251bGw7IHRoZW4KKwk6CisgICAgICBlbHNlCisJY2FuX2J1aWxkX3NoYXJlZD1ubworICAgICAgZmkKKyAgICAgIDs7CisgICAgZXNhYworICAgICMgQUlYIChvbiBQb3dlciopIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIGN1cnJlbnRseSB3ZSBjYW4gbm90IGhhcmRjb2RlIGNvcnJlY3QKKyAgICAjIHNvbmFtZSBpbnRvIGV4ZWN1dGFibGUuIFByb2JhYmx5IHdlIGNhbiBhZGQgdmVyc2lvbmluZyBzdXBwb3J0IHRvCisgICAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KKyAgICBpZiB0ZXN0ICIkYWl4X3VzZV9ydW50aW1lbGlua2luZyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgSWYgdXNpbmcgcnVuIHRpbWUgbGlua2luZyAob24gQUlYIDQuMiBvciBsYXRlcikgdXNlIGxpYjxuYW1lPi5zbworICAgICAgIyBpbnN0ZWFkIG9mIGxpYjxuYW1lPi5hIHRvIGxldCBwZW9wbGUga25vdyB0aGF0IHRoZXNlIGFyZSBub3QKKyAgICAgICMgdHlwaWNhbCBBSVggc2hhcmVkIGxpYnJhcmllcy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIGVsc2UKKyAgICAgICMgV2UgcHJlc2VydmUgLmEgYXMgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyaWVzIHRocm91Z2ggQUlYNC4yCisgICAgICAjIGFuZCBsYXRlciB3aGVuIHdlIGFyZSBub3QgZG9pbmcgcnVuIHRpbWUgbGlua2luZy4KKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uYSAkbGlibmFtZS5hJworICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBmaQorICAgIHNobGlicGF0aF92YXI9TElCUEFUSAorICBmaQorICA7OworCithbWlnYW9zKikKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgcG93ZXJwYykKKyAgICAjIFNpbmNlIEp1bHkgMjAwNyBBbWlnYU9TNCBvZmZpY2lhbGx5IHN1cHBvcnRzIC5zbyBsaWJyYXJpZXMuCisgICAgIyBXaGVuIGNvbXBpbGluZyB0aGUgZXhlY3V0YWJsZSwgYWRkIC11c2UtZHlubGQgLUxzb2JqczogdG8gdGhlIGNvbXBpbGVsaW5lLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIDs7CisgIG02OGspCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKKyAgICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICAgIGZpbmlzaF9ldmFsPSdmb3IgbGliIGluIGBscyAkbGliZGlyLyouaXhsaWJyYXJ5IDI+L2Rldi9udWxsYDsgZG8gbGlibmFtZT1gJEVDSE8gIlgkbGliIiB8ICRYc2VkIC1lICdcJydzJV4uKi9cKFtbXi9dXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkUk0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICJjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hIjsgY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSB8fCBleGl0IDE7IGRvbmUnCisgICAgOzsKKyAgZXNhYworICA7OworCitiZW9zKikKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtzaGFyZWRfZXh0fScKKyAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgorICBzaGxpYnBhdGhfdmFyPUxJQlJBUllfUEFUSAorICA7OworCitic2RpW1s0NV1dKikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgJGxpYmRpcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9YMTEvbGliIC91c3IvY29udHJpYi9saWIgL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9zaGxpYiAvdXNyL2xpYiAvdXNyL2xvY2FsL2xpYiIKKyAgIyB0aGUgZGVmYXVsdCBsZC5zby5jb25mIGFsc28gY29udGFpbnMgL3Vzci9jb250cmliL2xpYiBhbmQKKyAgIyAvdXNyL1gxMVI2L2xpYiAoL3Vzci9YMTEgaXMgYSBsaW5rIHRvIC91c3IvWDExUjYpLCBidXQgbGV0IHVzIGFsbG93CisgICMgbGlidG9vbCB0byBoYXJkLWNvZGUgdGhlc2UgaW50byBwcm9ncmFtcworICA7OworCitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHZlcnNpb25fdHlwZT13aW5kb3dzCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX3ZlcnNpb249bm8KKyAgbmVlZF9saWJfcHJlZml4PW5vCisKKyAgY2FzZSAkR0NDLCRob3N0X29zIGluCisgIHllcyxjeWd3aW4qIHwgeWVzLG1pbmd3KiB8IHllcyxwdzMyKiB8IHllcyxjZWdjYyopCisgICAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwuYScKKyAgICAjIERMTCBpcyBpbnN0YWxsZWQgdG8gJChsaWJkaXIpLy4uL2JpbiBieSBwb3N0aW5zdGFsbF9jbWRzCisgICAgcG9zdGluc3RhbGxfY21kcz0nYmFzZV9maWxlPWBiYXNlbmFtZSBcJHtmaWxlfWB+CisgICAgICBkbHBhdGg9YCRTSEVMTCAyPiYxIC1jICdcJycuICRkaXIvJ1wnJ1wke2Jhc2VfZmlsZX0nXCcnaTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxkaXI9JGRlc3RkaXIvYGRpcm5hbWUgXCRkbHBhdGhgfgorICAgICAgdGVzdCAtZCBcJGRsZGlyIHx8IG1rZGlyIC1wIFwkZGxkaXJ+CisgICAgICAkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSBcJGRsZGlyLyRkbG5hbWV+CisgICAgICBjaG1vZCBhK3ggXCRkbGRpci8kZGxuYW1lfgorICAgICAgaWYgdGVzdCAtbiAnXCcnJHN0cmlwbWUnXCcnICYmIHRlc3QgLW4gJ1wnJyRzdHJpcGxpYidcJyc7IHRoZW4KKyAgICAgICAgZXZhbCAnXCcnJHN0cmlwbGliIFwkZGxkaXIvJGRsbmFtZSdcJycgfHwgZXhpdCBcJD87CisgICAgICBmaScKKyAgICBwb3N0dW5pbnN0YWxsX2NtZHM9J2RsZGxsPWAkU0hFTEwgMj4mMSAtYyAnXCcnLiAkZmlsZTsgZWNobyBcJGRsbmFtZSdcJydgfgorICAgICAgZGxwYXRoPSRkaXIvXCRkbGRsbH4KKyAgICAgICAkUk0gXCRkbHBhdGgnCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGN5Z3dpbiopCisgICAgICAjIEN5Z3dpbiBETExzIHVzZSAnY3lnJyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIHNvbmFtZV9zcGVjPSdgZWNobyAke2xpYm5hbWV9IHwgc2VkIC1lICdzL15saWIvY3lnLydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiAvbGliL3czMmFwaSAvbGliIC91c3IvbG9jYWwvbGliIgorICAgICAgOzsKKyAgICBtaW5ndyogfCBjZWdjYyopCisgICAgICAjIE1pbkdXIERMTHMgdXNlIHRyYWRpdGlvbmFsICdsaWInIHByZWZpeAorICAgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX1gZWNobyAke3JlbGVhc2V9IHwgJFNFRCAtZSAncy9bWy5dXS8tL2cnYCR7dmVyc3VmZml4fSR7c2hhcmVkX2V4dH0nCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRDQyAtcHJpbnQtc2VhcmNoLWRpcnMgfCAkR1JFUCAiXmxpYnJhcmllczoiIHwgJFNFRCAtZSAicy9ebGlicmFyaWVzOi8vIiAtZSAicyw9LywvLGciYAorICAgICAgaWYgJEVDSE8gIiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiIHwgWyRHUkVQICc7W2MtekMtWl06LycgPi9kZXYvbnVsbF07IHRoZW4KKyAgICAgICAgIyBJdCBpcyBtb3N0IHByb2JhYmx5IGEgV2luZG93cyBmb3JtYXQgUEFUSCBwcmludGVkIGJ5CisgICAgICAgICMgbWluZ3cgZ2NjLCBidXQgd2UgYXJlIHJ1bm5pbmcgb24gQ3lnd2luLiBHY2MgcHJpbnRzIGl0cyBzZWFyY2gKKyAgICAgICAgIyBwYXRoIHdpdGggOyBzZXBhcmF0b3JzLCBhbmQgd2l0aCBkcml2ZSBsZXR0ZXJzLiBXZSBjYW4gaGFuZGxlIHRoZQorICAgICAgICAjIGRyaXZlIGxldHRlcnMgKGN5Z3dpbiBmaWxldXRpbHMgdW5kZXJzdGFuZHMgdGhlbSksIHNvIGxlYXZlIHRoZW0sCisgICAgICAgICMgZXNwZWNpYWxseSBhcyB3ZSBtaWdodCBwYXNzIGZpbGVzIGZvdW5kIHRoZXJlIHRvIGEgbWluZ3cgb2JqZHVtcCwKKyAgICAgICAgIyB3aGljaCB3b3VsZG4ndCB1bmRlcnN0YW5kIGEgY3lnd2luaWZpZWQgcGF0aC4gQWhoLgorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgLWUgJ3MvOy8gL2cnYAorICAgICAgZWxzZQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9YCRFQ0hPICIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIiB8ICRTRUQgIC1lICJzLyRQQVRIX1NFUEFSQVRPUi8gL2ciYAorICAgICAgZmkKKyAgICAgIDs7CisgICAgcHczMiopCisgICAgICAjIHB3MzIgRExMcyB1c2UgJ3B3JyBwcmVmaXggcmF0aGVyIHRoYW4gJ2xpYicKKyAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nYGVjaG8gJHtsaWJuYW1lfSB8IHNlZCAtZSAncy9ebGliL3B3LydgYGVjaG8gJHtyZWxlYXNlfSB8ICRTRUQgLWUgJ3MvW1suXV0vLS9nJ2Ake3ZlcnN1ZmZpeH0ke3NoYXJlZF9leHR9JworICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKworICAqKQorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCAkU0VEIC1lICdzL1tbLl1dLy0vZydgJHt2ZXJzdWZmaXh9JHtzaGFyZWRfZXh0fSAkbGlibmFtZS5saWInCisgICAgOzsKKyAgZXNhYworICBkeW5hbWljX2xpbmtlcj0nV2luMzIgbGQuZXhlJworICAjIEZJWE1FOiBmaXJzdCB3ZSBzaG91bGQgc2VhcmNoIC4gYW5kIHRoZSBkaXJlY3RvcnkgdGhlIGV4ZWN1dGFibGUgaXMgaW4KKyAgc2hsaWJwYXRoX3Zhcj1QQVRICisgIDs7CisKK2RhcndpbiogfCByaGFwc29keSopCisgIGR5bmFtaWNfbGlua2VyPSIkaG9zdF9vcyBkeWxkIgorICB2ZXJzaW9uX3R5cGU9ZGFyd2luCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7bWFqb3J9JHNoYXJlZF9leHQgJHtsaWJuYW1lfSRzaGFyZWRfZXh0JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke21ham9yfSRzaGFyZWRfZXh0JworICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIHNobGlicGF0aF92YXI9RFlMRF9MSUJSQVJZX1BBVEgKKyAgc2hyZXh0X2NtZHM9J2B0ZXN0IC4kbW9kdWxlID0gLnllcyAmJiBlY2hvIC5zbyB8fCBlY2hvIC5keWxpYmAnCittNF9pZihbJDFdLCBbXSxbCisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYyAvdXNyL2xvY2FsL2xpYiJdKQorICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL2xpYiAvdXNyL2xpYicKKyAgOzsKKworZGd1eCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUkc2hhcmVkX2V4dCcKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKworZnJlZWJzZDEqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCitmcmVlYnNkKiB8IGRyYWdvbmZseSopCisgICMgRHJhZ29uRmx5IGRvZXMgbm90IGhhdmUgYW91dC4gIFdoZW4vaWYgdGhleSBpbXBsZW1lbnQgYSBuZXcKKyAgIyB2ZXJzaW9uaW5nIG1lY2hhbmlzbSwgYWRqdXN0IHRoaXMuCisgIGlmIHRlc3QgLXggL3Vzci9iaW4vb2JqZm9ybWF0OyB0aGVuCisgICAgb2JqZm9ybWF0PWAvdXNyL2Jpbi9vYmpmb3JtYXRgCisgIGVsc2UKKyAgICBjYXNlICRob3N0X29zIGluCisgICAgZnJlZWJzZFtbMTIzXV0qKSBvYmpmb3JtYXQ9YW91dCA7OworICAgICopIG9iamZvcm1hdD1lbGYgOzsKKyAgICBlc2FjCisgIGZpCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLSRvYmpmb3JtYXQKKyAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisgICAgZnJlZWJzZC1lbGYqKQorICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgICBuZWVkX3ZlcnNpb249bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBmcmVlYnNkLSopCisgICAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCcKKyAgICAgIG5lZWRfdmVyc2lvbj15ZXMKKyAgICAgIDs7CisgIGVzYWMKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBmcmVlYnNkMiopCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworICAgIDs7CisgIGZyZWVic2QzLltbMDFdXSogfCBmcmVlYnNkZWxmMy5bWzAxXV0qKQorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgOzsKKyAgZnJlZWJzZDMuW1syLTldXSogfCBmcmVlYnNkZWxmMy5bWzItOV1dKiB8IFwKKyAgZnJlZWJzZDQuW1swLTVdXSB8IGZyZWVic2RlbGY0LltbMC01XV0gfCBmcmVlYnNkNC4xLjEgfCBmcmVlYnNkZWxmNC4xLjEpCisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgICopICMgZnJvbSA0LjYgb24sIGFuZCBEcmFnb25GbHkKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgICAgaGFyZGNvZGVfaW50b19saWJzPXllcworICAgIDs7CisgIGVzYWMKKyAgOzsKKworZ251KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR7bWFqb3J9ICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgIDs7CisKK2hwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBjYXNlICRob3N0X2NwdSBpbgorICBpYTY0KikKKyAgICBzaHJleHRfY21kcz0nLnNvJworICAgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNvIgorICAgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgICAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcyAjIFVubGVzcyArbm9lbnZ2YXIgaXMgc3BlY2lmaWVkLgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgaWYgdGVzdCAiWCRIUFVYX0lBNjRfTU9ERSIgPSBYMzI7IHRoZW4KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9saWIvaHB1eDMyIC91c3IvbG9jYWwvbGliL2hwdXgzMiAvdXNyL2xvY2FsL2xpYiIKKyAgICBlbHNlCisgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL2hwdXg2NCAvdXNyL2xvY2FsL2xpYi9ocHV4NjQiCisgICAgZmkKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBoYXJkY29kZV9pbnRvX2xpYnM9eWVzCisgICAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKKyAgICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSCAjIEhvdyBzaG91bGQgd2UgaGFuZGxlIFNITElCX1BBVEgKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzICMgVW5sZXNzICtub2VudnZhciBpcyBzcGVjaWZpZWQuCisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliL3BhMjBfNjQgL3Vzci9jY3MvbGliL3BhMjBfNjQiCisgICAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYworICAgIDs7CisgICopCisgICAgc2hyZXh0X2NtZHM9Jy5zbCcKKyAgICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICAgIHNobGlicGF0aF92YXI9U0hMSUJfUEFUSAorICAgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubyAjICtzIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBTSExJQl9QQVRICisgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgICA7OworICBlc2FjCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaW50ZXJpeFtbMy05XV0qKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBkeW5hbWljX2xpbmtlcj0nSW50ZXJpeCAzLnggbGQuc28uMSAoUEUsIGxpa2UgRUxGKScKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgY2FzZSAkaG9zdF9vcyBpbgorICAgIG5vbnN0b3B1eCopIHZlcnNpb25fdHlwZT1ub25zdG9wdXggOzsKKyAgICAqKQorCWlmIHRlc3QgIiRsdF9jdl9wcm9nX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkJdmVyc2lvbl90eXBlPWxpbnV4CisJZWxzZQorCQl2ZXJzaW9uX3R5cGU9aXJpeAorCWZpIDs7CisgIGVzYWMKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgaXJpeDUqIHwgbm9uc3RvcHV4KikKKyAgICBsaWJzdWZmPSBzaGxpYnN1ZmY9CisgICAgOzsKKyAgKikKKyAgICBjYXNlICRMRCBpbiAjIGxpYnRvb2wubTQgd2lsbCBhZGQgb25lIG9mIHRoZXNlIHN3aXRjaGVzIHRvIExECisgICAgKi0zMnwqIi0zMiAifCotbWVsZjMyYnNtaXB8KiItbWVsZjMyYnNtaXAgIikKKyAgICAgIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKKyAgICAqLW4zMnwqIi1uMzIgInwqLW1lbGYzMmJtaXBuMzJ8KiItbWVsZjMyYm1pcG4zMiAiKQorICAgICAgbGlic3VmZj0zMiBzaGxpYnN1ZmY9TjMyIGxpYm1hZ2ljPU4zMjs7CisgICAgKi02NHwqIi02NCAifCotbWVsZjY0Ym1pcHwqIi1tZWxmNjRibWlwICIpCisgICAgICBsaWJzdWZmPTY0IHNobGlic3VmZj02NCBsaWJtYWdpYz02NC1iaXQ7OworICAgICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OworICAgIGVzYWMKKyAgICA7OworICBlc2FjCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliJHtsaWJzdWZmfSAvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvdXNyL2xpYiR7bGlic3VmZn0gL2xpYiR7bGlic3VmZn0iCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgOzsKKworIyBObyBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIExpbnV4IG9sZGxkLCBhb3V0LCBvciBjb2ZmLgorbGludXgqb2xkbGQqIHwgbGludXgqYW91dCogfCBsaW51eCpjb2ZmKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworIyBUaGlzIG11c3QgYmUgTGludXggRUxGLgorbGludXgqIHwgaypic2QqLWdudSkKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubworICAjIFNvbWUgYmludXRpbHMgbGQgYXJlIHBhdGNoZWQgdG8gc2V0IERUX1JVTlBBVEgKKyAgc2F2ZV9MREZMQUdTPSRMREZMQUdTCisgIHNhdmVfbGliZGlyPSRsaWJkaXIKKyAgZXZhbCAibGliZGlyPS9mb287IHdsPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpXCI7IFwKKyAgICAgICBMREZMQUdTPVwiXCRMREZMQUdTICRfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKVwiIgorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCisgICAgW0FTX0lGKFsgKCRPQkpEVU1QIC1wIGNvbmZ0ZXN0JGFjX2V4ZWV4dCkgMj4vZGV2L251bGwgfCBncmVwICJSVU5QQVRILiokbGliZGlyIiA+L2Rldi9udWxsXSwKKyAgICAgICBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllc10pXSkKKyAgTERGTEFHUz0kc2F2ZV9MREZMQUdTCisgIGxpYmRpcj0kc2F2ZV9saWJkaXIKKworICAjIFRoaXMgaW1wbGllcyBubyBmYXN0X2luc3RhbGwsIHdoaWNoIGlzIHVuYWNjZXB0YWJsZS4KKyAgIyBTb21lIHJld29yayB3aWxsIGJlIG5lZWRlZCB0byBhbGxvdyBmb3IgZmFzdF9pbnN0YWxsCisgICMgYmVmb3JlIHRoaXMgY2FuIGJlIGVuYWJsZWQuCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKworICAjIEFkZCBBQkktc3BlY2lmaWMgZGlyZWN0b3JpZXMgdG8gdGhlIHN5c3RlbSBsaWJyYXJ5IHBhdGguCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliNjQgL3Vzci9saWI2NCAvbGliIC91c3IvbGliIgorCisgICMgQXBwZW5kIGxkLnNvLmNvbmYgY29udGVudHMgdG8gdGhlIHNlYXJjaCBwYXRoCisgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgbHRfbGRfZXh0cmE9YGF3ayAnL15pbmNsdWRlIC8geyBzeXN0ZW0oc3ByaW50ZigiY2QgL2V0YzsgY2F0ICVzIDI+L2Rldi9udWxsIiwgXFskXTIpKTsgc2tpcCA9IDE7IH0geyBpZiAoIXNraXApIHByaW50IFxbJF0wOyBza2lwID0gMDsgfScgPCAvZXRjL2xkLnNvLmNvbmYgfCAkU0VEIC1lICdzLyMuKi8vOy9eWwkgXSpod2NhcFsJIF0vZDtzL1s6LAldLyAvZztzLz1bXj1dKiQvLztzLz1bXj0gXSogLyAvZzsvXiQvZCcgfCB0ciAnXG4nICcgJ2AKKyAgICBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0iJHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjICRsdF9sZF9leHRyYSIKKyAgZmkKKworICAjIFdlIHVzZWQgdG8gdGVzdCBmb3IgL2xpYi9sZC5zby4xIGFuZCBkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMgb24KKyAgIyBwb3dlcnBjLCBiZWNhdXNlIE1rTGludXggb25seSBzdXBwb3J0ZWQgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHRoZQorICAjIEdOVSBkeW5hbWljIGxpbmtlci4gIFNpbmNlIHRoaXMgd2FzIGJyb2tlbiB3aXRoIGNyb3NzIGNvbXBpbGVycywKKyAgIyBtb3N0IHBvd2VycGMtbGludXggYm94ZXMgc3VwcG9ydCBkeW5hbWljIGxpbmtpbmcgdGhlc2UgZGF5cyBhbmQKKyAgIyBwZW9wbGUgY2FuIGFsd2F5cyAtLWRpc2FibGUtc2hhcmVkLCB0aGUgdGVzdCB3YXMgcmVtb3ZlZCwgYW5kIHdlCisgICMgYXNzdW1lIHRoZSBHTlUvTGludXggZHluYW1pYyBsaW5rZXIgaXMgaW4gdXNlLgorICBkeW5hbWljX2xpbmtlcj0nR05VL0xpbnV4IGxkLnNvJworICA7OworCituZXRic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbmVlZF9saWJfcHJlZml4PW5vCisgIG5lZWRfdmVyc2lvbj1ubworICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgICAgZmluaXNoX2NtZHM9J1BBVEg9IlwkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKKyAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCisgIGVsc2UKKyAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICR7bGlibmFtZX0ke3NoYXJlZF9leHR9JworICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3InCisgICAgZHluYW1pY19saW5rZXI9J05ldEJTRCBsZC5lbGZfc28nCisgIGZpCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCituZXdzb3M2KQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgOzsKKworKm50byogfCAqcW54KikKKyAgdmVyc2lvbl90eXBlPXFueAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICBkeW5hbWljX2xpbmtlcj0nbGRxbnguc28nCisgIDs7CisKK29wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii91c3IvbGliIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgIyBTb21lIG9sZGVyIHZlcnNpb25zIG9mIE9wZW5CU0QgKDMuMyBhdCBsZWFzdCkgKmRvKiBuZWVkIHZlcnNpb25lZCBsaWJzLgorICBjYXNlICRob3N0X29zIGluCisgICAgb3BlbmJzZDMuMyB8IG9wZW5ic2QzLjMuKikJbmVlZF92ZXJzaW9uPXllcyA7OworICAgICopCQkJCW5lZWRfdmVyc2lvbj1ubyAgOzsKKyAgZXNhYworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgb3BlbmJzZDIuW1s4OV1dIHwgb3BlbmJzZDIuW1s4OV1dLiopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPW5vCisJOzsKKyAgICAgICopCisJc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcworCTs7CisgICAgICBlc2FjCisgIGVsc2UKKyAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGZpCisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIHNocmV4dF9jbWRzPSIuZGxsIgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUuYScKKyAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJworICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKKyAgOzsKKworb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIG5lZWRfbGliX3ByZWZpeD1ubworICBuZWVkX3ZlcnNpb249bm8KKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3Vzci9zaGxpYiAvdXNyL2Njcy9saWIgL3Vzci9saWIvY21wbHJzL2NjIC91c3IvbGliIC91c3IvbG9jYWwvbGliIC92YXIvc2hsaWIiCisgIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIkc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorICA7OworCityZG9zKikKKyAgZHluYW1pY19saW5rZXI9bm8KKyAgOzsKKworc29sYXJpcyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgIyBsZGQgY29tcGxhaW5zIHVubGVzcyBsaWJyYXJpZXMgYXJlIGV4ZWN1dGFibGUKKyAgcG9zdGluc3RhbGxfY21kcz0nY2htb2QgK3ggJGxpYicKKyAgOzsKKworc3Vub3M0KikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXgnCisgIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIG5lZWRfbGliX3ByZWZpeD1ubworICBmaQorICBuZWVkX3ZlcnNpb249eWVzCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yICRsaWJuYW1lJHtzaGFyZWRfZXh0fScKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9JHtzaGFyZWRfZXh0fSRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgY2FzZSAkaG9zdF92ZW5kb3IgaW4KKyAgICBzbmkpCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgcnVucGF0aF92YXI9TERfUlVOX1BBVEgKKyAgICAgIDs7CisgICAgc2llbWVucykKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgOzsKKyAgICBtb3Rvcm9sYSkKKyAgICAgIG5lZWRfbGliX3ByZWZpeD1ubworICAgICAgbmVlZF92ZXJzaW9uPW5vCisgICAgICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL2xpYiAvdXNyL2xpYiAvdXNyL2Njcy9saWInCisgICAgICA7OworICBlc2FjCisgIDs7CisKK3N5c3Y0Kk1QKikKKyAgaWYgdGVzdCAtZCAvdXNyL25lYyA7dGhlbgorICAgIHZlcnNpb25fdHlwZT1saW51eAorICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUke3NoYXJlZF9leHR9LiR2ZXJzdWZmaXggJGxpYm5hbWUke3NoYXJlZF9leHR9LiRtYWpvciAkbGlibmFtZSR7c2hhcmVkX2V4dH0nCisgICAgc29uYW1lX3NwZWM9JyRsaWJuYW1lJHtzaGFyZWRfZXh0fS4kbWFqb3InCisgICAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgZmkKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIHZlcnNpb25fdHlwZT1mcmVlYnNkLWVsZgorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0gJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9eWVzCisgIGhhcmRjb2RlX2ludG9fbGlicz15ZXMKKyAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICAgIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0nL3Vzci9sb2NhbC9saWIgL3Vzci9nbnUvbGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYiAvbGliJworICBlbHNlCisgICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPScvdXNyL2Njcy9saWIgL3Vzci9saWInCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc2NvMy4ydjUqKQorICAgICAgICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgL2xpYiIKKwk7OworICAgIGVzYWMKKyAgZmkKKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Jy91c3IvbGliJworICA7OworCit0cGYqKQorICAjIFRQRiBpcyBhIGNyb3NzLXRhcmdldCBvbmx5LiAgUHJlZmVycmVkIGNyb3NzLWhvc3QgPSBHTlUvTGludXguCisgIHZlcnNpb25fdHlwZT1saW51eAorICBuZWVkX2xpYl9wcmVmaXg9bm8KKyAgbmVlZF92ZXJzaW9uPW5vCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KKyAgaGFyZGNvZGVfaW50b19saWJzPXllcworICA7OworCit1dHM0KikKKyAgdmVyc2lvbl90eXBlPWxpbnV4CisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfSR7c2hhcmVkX2V4dH0kbWFqb3IgJGxpYm5hbWUke3NoYXJlZF9leHR9JworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0ke3NoYXJlZF9leHR9JG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJGR5bmFtaWNfbGlua2VyXSkKK3Rlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK3ZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSJQQVRIICRzaGxpYnBhdGhfdmFyICRydW5wYXRoX3ZhciIKK2lmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgIHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rPSIkdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmsgR0NDX0VYRUNfUFJFRklYIENPTVBJTEVSX1BBVEggTElCUkFSWV9QQVRIIgorZmkKKworaWYgdGVzdCAiJHtsdF9jdl9zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIkbHRfY3Zfc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIgorZmkKK2lmIHRlc3QgIiR7bHRfY3Zfc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRsdF9jdl9zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYyIKK2ZpCisKK19MVF9ERUNMKFtdLCBbdmFyaWFibGVzX3NhdmVkX2Zvcl9yZWxpbmtdLCBbMV0sCisgICAgW1ZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgc2hvdWxkIGJlIHNhdmVkIGluIGxpYnRvb2wgd3JhcHBlciBzY3JpcHRzIGFuZAorICAgIHJlc3RvcmVkIGF0IGxpbmsgdGltZV0pCitfTFRfREVDTChbXSwgW25lZWRfbGliX3ByZWZpeF0sIFswXSwKKyAgICBbRG8gd2UgbmVlZCB0aGUgImxpYiIgcHJlZml4IGZvciBtb2R1bGVzP10pCitfTFRfREVDTChbXSwgW25lZWRfdmVyc2lvbl0sIFswXSwgW0RvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/XSkKK19MVF9ERUNMKFtdLCBbdmVyc2lvbl90eXBlXSwgWzBdLCBbTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGVdKQorX0xUX0RFQ0woW10sIFtydW5wYXRoX3Zhcl0sIFswXSwgIFtTaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGVdKQorX0xUX0RFQ0woW10sIFtzaGxpYnBhdGhfdmFyXSwgWzBdLFtTaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlXSkKK19MVF9ERUNMKFtdLCBbc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoXSwgWzBdLAorICAgIFtJcyBzaGxpYnBhdGggc2VhcmNoZWQgYmVmb3JlIHRoZSBoYXJkLWNvZGVkIGxpYnJhcnkgc2VhcmNoIHBhdGg/XSkKK19MVF9ERUNMKFtdLCBbbGlibmFtZV9zcGVjXSwgWzFdLCBbRm9ybWF0IG9mIGxpYnJhcnkgbmFtZSBwcmVmaXhdKQorX0xUX0RFQ0woW10sIFtsaWJyYXJ5X25hbWVzX3NwZWNdLCBbMV0sCisgICAgW1tMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorICAgIFRoZSBsYXN0IG5hbWUgaXMgdGhlIG9uZSB0aGF0IHRoZSBsaW5rZXIgZmluZHMgd2l0aCAtbE5BTUVdXSkKK19MVF9ERUNMKFtdLCBbc29uYW1lX3NwZWNdLCBbMV0sCisgICAgW1tUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZV1dKQorX0xUX0RFQ0woW10sIFtwb3N0aW5zdGFsbF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kIHRvIHVzZSBhZnRlciBpbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW3Bvc3R1bmluc3RhbGxfY21kc10sIFsyXSwKKyAgICBbQ29tbWFuZCB0byB1c2UgYWZ0ZXIgdW5pbnN0YWxsYXRpb24gb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfREVDTChbXSwgW2ZpbmlzaF9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnldKQorX0xUX0RFQ0woW10sIFtmaW5pc2hfZXZhbF0sIFsxXSwKKyAgICBbW0FzICJmaW5pc2hfY21kcyIsIGV4Y2VwdCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dAorICAgIG5vdCBzaG93bl1dKQorX0xUX0RFQ0woW10sIFtoYXJkY29kZV9pbnRvX2xpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgd2Ugc2hvdWxkIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBsaWJyYXJpZXNdKQorX0xUX0RFQ0woW10sIFtzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWNdLCBbMl0sCisgICAgW0NvbXBpbGUtdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitfTFRfREVDTChbXSwgW3N5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjXSwgWzJdLAorICAgIFtSdW4tdGltZSBzeXN0ZW0gc2VhcmNoIHBhdGggZm9yIGxpYnJhcmllc10pCitdKSMgX0xUX1NZU19EWU5BTUlDX0xJTktFUgorCisKKyMgX0xUX1BBVEhfVE9PTF9QUkVGSVgoVE9PTCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZmluZCBhIGZpbGUgcHJvZ3JhbSB3aGljaCBjYW4gcmVjb2duaXplIHNoYXJlZCBsaWJyYXJ5CitBQ19ERUZVTihbX0xUX1BBVEhfVE9PTF9QUkVGSVhdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK0FDX01TR19DSEVDS0lORyhbZm9yICQxXSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX01BR0lDX0NNRCwKK1tjYXNlICRNQUdJQ19DTUQgaW4KK1tbXFwvKl0gfCAgPzpbXFwvXSpdKQorICBsdF9jdl9wYXRoX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgIDs7CisqKQorICBsdF9zYXZlX01BR0lDX0NNRD0iJE1BR0lDX0NNRCIKKyAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitkbmwgJGFjX2R1bW15IGZvcmNlcyBzcGxpdHRpbmcgb24gY29uc3RhbnQgdXNlci1zdXBwbGllZCBwYXRocy4KK2RubCBQT1NJWC4yIHdvcmQgc3BsaXR0aW5nIGlzIGRvbmUgb25seSBvbiB0aGUgb3V0cHV0IG9mIHdvcmQgZXhwYW5zaW9ucywKK2RubCBub3QgZXZlcnkgd29yZC4gIFRoaXMgY2xvc2VzIGEgbG9uZ3N0YW5kaW5nIHNoIHNlY3VyaXR5IGhvbGUuCisgIGFjX2R1bW15PSJtNF9pZihbJDJdLCAsICRQQVRILCBbJDJdKSIKKyAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKyAgICBpZiB0ZXN0IC1mICRhY19kaXIvJDE7IHRoZW4KKyAgICAgIGx0X2N2X3BhdGhfTUFHSUNfQ01EPSIkYWNfZGlyLyQxIgorICAgICAgaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIjsgdGhlbgorCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJImZpbGVfbWFnaWMgIiopCisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogImZpbGVfbWFnaWMgXCguKlwpImAKKwkgIE1BR0lDX0NNRD0iJGx0X2N2X3BhdGhfTUFHSUNfQ01EIgorCSAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAorCSAgICAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICA6CisJICBlbHNlCisJICAgIGNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAorKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgorKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCisqKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKKyoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAorKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQorKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bworKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKKworX0xUX0VPRgorCSAgZmkgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGx0X3NhdmVfaWZzIgorICBNQUdJQ19DTUQ9IiRsdF9zYXZlX01BR0lDX0NNRCIKKyAgOzsKK2VzYWNdKQorTUFHSUNfQ01EPSIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiCitpZiB0ZXN0IC1uICIkTUFHSUNfQ01EIjsgdGhlbgorICBBQ19NU0dfUkVTVUxUKCRNQUdJQ19DTUQpCitlbHNlCisgIEFDX01TR19SRVNVTFQobm8pCitmaQorX0xUX0RFQ0woW10sIFtNQUdJQ19DTURdLCBbMF0sCisJIFtVc2VkIHRvIGV4YW1pbmUgbGlicmFyaWVzIHdoZW4gZmlsZV9tYWdpY19jbWQgYmVnaW5zIHdpdGggImZpbGUiXSlkbmwKK10pIyBfTFRfUEFUSF9UT09MX1BSRUZJWAorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX1BBVEhfVE9PTF9QUkVGSVhdLCBbX0xUX1BBVEhfVE9PTF9QUkVGSVhdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19QQVRIX1RPT0xfUFJFRklYXSwgW10pCisKKworIyBfTFRfUEFUSF9NQUdJQworIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIGEgZmlsZSBwcm9ncmFtIHdoaWNoIGNhbiByZWNvZ25pemUgYSBzaGFyZWQgbGlicmFyeQorbTRfZGVmdW4oW19MVF9QQVRIX01BR0lDXSwKK1tfTFRfUEFUSF9UT09MX1BSRUZJWCgke2FjX3Rvb2xfcHJlZml4fWZpbGUsIC91c3IvYmluJFBBVEhfU0VQQVJBVE9SJFBBVEgpCitpZiB0ZXN0IC16ICIkbHRfY3ZfcGF0aF9NQUdJQ19DTUQiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgICBfTFRfUEFUSF9UT09MX1BSRUZJWChmaWxlLCAvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRIKQorICBlbHNlCisgICAgTUFHSUNfQ01EPToKKyAgZmkKK2ZpCitdKSMgX0xUX1BBVEhfTUFHSUMKKworCisjIExUX1BBVEhfTEQKKyMgLS0tLS0tLS0tLQorIyBmaW5kIHRoZSBwYXRobmFtZSB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCitBQ19ERUZVTihbTFRfUEFUSF9MRF0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfU0VEXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKKworQUNfQVJHX1dJVEgoW2dudS1sZF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtZ251LWxkXSwKKwlbYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKyAgICBbdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzXSwKKyAgICBbd2l0aF9nbnVfbGQ9bm9dKWRubAorCithY19wcm9nPWxkCitpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgbGQgdXNlZCBieSAkQ0NdKQorICBjYXNlICRob3N0IGluCisgICotKi1taW5ndyopCisgICAgIyBnY2MgbGVhdmVzIGEgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuIHdoaWNoIHVwc2V0cyBtaW5ndworICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNSB8IHRyIC1kICdcMDE1J2AgOzsKKyAgKikKKyAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgIDs7CisgIGVzYWMKKyAgY2FzZSAkYWNfcHJvZyBpbgorICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgorICAgIFtbXFwvXV0qIHwgPzpbW1xcL11dKikKKyAgICAgIHJlX2RpcmVsdD0nL1tbXi9dXVtbXi9dXSovXC5cLi8nCisgICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aG5hbWUgb2YgbGQKKyAgICAgIGFjX3Byb2c9YCRFQ0hPICIkYWNfcHJvZyJ8ICRTRUQgJ3MlXFxcXCUvJWcnYAorICAgICAgd2hpbGUgJEVDSE8gIiRhY19wcm9nIiB8ICRHUkVQICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbworCWFjX3Byb2c9YCRFQ0hPICRhY19wcm9nfCAkU0VEICJzJSRyZV9kaXJlbHQlLyUiYAorICAgICAgZG9uZQorICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCisgICAgICA7OworICAiIikKKyAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KKyAgICBhY19wcm9nPWxkCisgICAgOzsKKyAgKikKKyAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCisgICAgd2l0aF9nbnVfbGQ9dW5rbm93bgorICAgIDs7CisgIGVzYWMKK2VsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHTlUgbGRdKQorZWxzZQorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBub24tR05VIGxkXSkKK2ZpCitBQ19DQUNIRV9WQUwobHRfY3ZfcGF0aF9MRCwKK1tpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCisgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSRQQVRIX1NFUEFSQVRPUgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyIgfHwgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyRhY19leGVleHQiOyB0aGVuCisgICAgICBsdF9jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgorICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAorICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIHZhcmlhbnRzIG9mIEdOVSBsZCBvbmx5IGFjY2VwdCAtdi4KKyAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorICAgICAgY2FzZSBgIiRsdF9jdl9wYXRoX0xEIiAtdiAyPiYxIDwvZGV2L251bGxgIGluCisgICAgICAqR05VKiB8ICond2l0aCBCRkQnKikKKwl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJOzsKKyAgICAgICopCisJdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkbHRfc2F2ZV9pZnMiCitlbHNlCisgIGx0X2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCitmaV0pCitMRD0iJGx0X2N2X3BhdGhfTEQiCitpZiB0ZXN0IC1uICIkTEQiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoJExEKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG5vKQorZmkKK3Rlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCitfTFRfUEFUSF9MRF9HTlUKK0FDX1NVQlNUKFtMRF0pCisKK19MVF9UQUdERUNMKFtdLCBbTERdLCBbMV0sIFtUaGUgbGlua2VyIHVzZWQgdG8gYnVpbGQgbGlicmFyaWVzXSkKK10pIyBMVF9QQVRIX0xECisKKyMgT2xkIG5hbWVzOgorQVVfQUxJQVMoW0FNX1BST0dfTERdLCBbTFRfUEFUSF9MRF0pCitBVV9BTElBUyhbQUNfUFJPR19MRF0sIFtMVF9QQVRIX0xEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQU1fUFJPR19MRF0sIFtdKQorZG5sIEFDX0RFRlVOKFtBQ19QUk9HX0xEXSwgW10pCisKKworIyBfTFRfUEFUSF9MRF9HTlUKKyMtIC0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX1BBVEhfTERfR05VXSwKK1tBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBsdF9jdl9wcm9nX2dudV9sZCwKK1sjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZHMgb25seSBhY2NlcHQgLXYuCitjYXNlIGAkTEQgLXYgMj4mMSA8L2Rldi9udWxsYCBpbgorKkdOVSogfCAqJ3dpdGggQkZEJyopCisgIGx0X2N2X3Byb2dfZ251X2xkPXllcworICA7OworKikKKyAgbHRfY3ZfcHJvZ19nbnVfbGQ9bm8KKyAgOzsKK2VzYWNdKQord2l0aF9nbnVfbGQ9JGx0X2N2X3Byb2dfZ251X2xkCitdKSMgX0xUX1BBVEhfTERfR05VCisKKworIyBfTFRfQ01EX1JFTE9BRAorIyAtLS0tLS0tLS0tLS0tLQorIyBmaW5kIHJlbG9hZCBmbGFnIGZvciBsaW5rZXIKKyMgICAtLSBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgorbTRfZGVmdW4oW19MVF9DTURfUkVMT0FEXSwKK1tBQ19DQUNIRV9DSEVDSyhbZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlc10sCisgIGx0X2N2X2xkX3JlbG9hZF9mbGFnLAorICBbbHRfY3ZfbGRfcmVsb2FkX2ZsYWc9Jy1yJ10pCityZWxvYWRfZmxhZz0kbHRfY3ZfbGRfcmVsb2FkX2ZsYWcKK2Nhc2UgJHJlbG9hZF9mbGFnIGluCisiIiB8ICIgIiopIDs7CisqKSByZWxvYWRfZmxhZz0iICRyZWxvYWRfZmxhZyIgOzsKK2VzYWMKK3JlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKK2Nhc2UgJGhvc3Rfb3MgaW4KKyAgZGFyd2luKikKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgICAgcmVsb2FkX2NtZHM9JyRMVENDICRMVENGTEFHUyAtbm9zdGRsaWIgJHt3bH0tciAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworICAgIGVsc2UKKyAgICAgIHJlbG9hZF9jbWRzPSckTEQkcmVsb2FkX2ZsYWcgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKyAgICBmaQorICAgIDs7Citlc2FjCitfTFRfREVDTChbXSwgW3JlbG9hZF9mbGFnXSwgWzFdLCBbSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlc10pZG5sCitfTFRfREVDTChbXSwgW3JlbG9hZF9jbWRzXSwgWzJdKWRubAorXSkjIF9MVF9DTURfUkVMT0FECisKKworIyBfTFRfQ0hFQ0tfTUFHSUNfTUVUSE9ECisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaG93IHRvIGNoZWNrIGZvciBsaWJyYXJ5IGRlcGVuZGVuY2llcworIyAgLS0gUE9SVE1FIGZpbGwgaW4gd2l0aCB0aGUgZHluYW1pYyBsaWJyYXJ5IGNoYXJhY3RlcmlzdGljcworbTRfZGVmdW4oW19MVF9DSEVDS19NQUdJQ19NRVRIT0RdLAorW200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSkKK200X3JlcXVpcmUoW19MVF9ERUNMX09CSkRVTVBdKQorQUNfQ0FDSEVfQ0hFQ0soW2hvdyB0byByZWNvZ25pemUgZGVwZW5kZW50IGxpYnJhcmllc10sCitsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZCwKK1tsdF9jdl9maWxlX21hZ2ljX2NtZD0nJE1BR0lDX0NNRCcKK2x0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPQorbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCisjIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKKyMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KKyMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgorIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCisjICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCisjICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCisjICdmaWxlX21hZ2ljIFtbcmVnZXhdXScgLS0gY2hlY2sgYnkgbG9va2luZyBmb3IgZmlsZXMgaW4gbGlicmFyeSBwYXRoCisjIHdoaWNoIHJlc3BvbmRzIHRvIHRoZSAkZmlsZV9tYWdpY19jbWQgd2l0aCBhIGdpdmVuIGV4dGVuZGVkIHJlZ2V4LgorIyBJZiB5b3UgaGF2ZSBgZmlsZScgb3IgZXF1aXZhbGVudCBvbiB5b3VyIHN5c3RlbSBhbmQgeW91J3JlIG5vdCBzdXJlCisjIHdoZXRoZXIgYHBhc3NfYWxsJyB3aWxsICphbHdheXMqIHdvcmssIHlvdSBwcm9iYWJseSB3YW50IHRoaXMgb25lLgorCitjYXNlICRob3N0X29zIGluCithaXhbWzQtOV1dKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworYmVvcyopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK2JzZGlbWzQ1XV0qKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW01MXV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiknCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvdXNyL2Jpbi9maWxlIC1MJworICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vc2hsaWIvbGliYy5zbworICA7OworCitjeWd3aW4qKQorICAjIGZ1bmNfd2luMzJfbGliaWQgaXMgYSBzaGVsbCBmdW5jdGlvbiBkZWZpbmVkIGluIGx0bWFpbi5zaAorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBeeDg2IGFyY2hpdmUgaW1wb3J0fF54ODYgRExMJworICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgOzsKKworbWluZ3cqIHwgcHczMiopCisgICMgQmFzZSBNU1lTL01pbkdXIGRvIG5vdCBwcm92aWRlIHRoZSAnZmlsZScgY29tbWFuZCBuZWVkZWQgYnkKKyAgIyBmdW5jX3dpbjMyX2xpYmlkIHNoZWxsIGZ1bmN0aW9uLCBzbyB1c2UgYSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcsCisgICMgdW5sZXNzIHdlIGZpbmQgJ2ZpbGUnLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcuCisgIGlmICggZmlsZSAvICkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgXng4NiBhcmNoaXZlIGltcG9ydHxeeDg2IERMTCcKKyAgICBsdF9jdl9maWxlX21hZ2ljX2NtZD0nZnVuY193aW4zMl9saWJpZCcKKyAgZWxzZQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlaSotaTM4NiguKmFyY2hpdGVjdHVyZTogaTM4Nik/JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgZmkKKyAgOzsKKworY2VnY2MpCisgICMgdXNlIHRoZSB3ZWFrZXIgdGVzdCBiYXNlZCBvbiAnb2JqZHVtcCcuIFNlZSBtaW5ndyouCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIGZpbGUgZm9ybWF0IHBlLWFybS0uKmxpdHRsZSguKmFyY2hpdGVjdHVyZTogYXJtKT8nCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPSckT0JKRFVNUCAtZicKKyAgOzsKKworZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBjYXNlICRob3N0X2NwdSBpbgorICAgIGkqODYgKQorICAgICAgIyBOb3Qgc3VyZSB3aGV0aGVyIHRoZSBwcmVzZW5jZSBvZiBPcGVuQlNEIGhlcmUgd2FzIGEgbWlzdGFrZS4KKyAgICAgICMgTGV0J3MgYWNjZXB0IGJvdGggb2YgdGhlbSB1bnRpbCB0aGlzIGlzIGNsZWFyZWQgdXAuCisgICAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyAoRnJlZUJTRHxPcGVuQlNEfERyYWdvbkZseSkvaVtbMy05XV04NiAoY29tcGFjdCApP2RlbWFuZCBwYWdlZCBzaGFyZWQgbGlicmFyeScKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC91c3IvbGliL2xpYmMuc28uKmAKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgZmkKKyAgOzsKKworZ251KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworaHB1eDEwLjIwKiB8IGhwdXgxMSopCisgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKKyAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgaWE2NCopCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgKHNbWzAtOV1dW1swLTldXVtbMC05XV18RUxGLVtbMC05XV1bWzAtOV1dKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBJQTY0JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2hwdXgzMi9saWJjLnNvCisgICAgOzsKKyAgaHBwYSo2NCopCisgICAgW2x0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzWzAtOV1bMC05XVswLTldfEVMRi1bMC05XVswLTldKSBzaGFyZWQgb2JqZWN0IGZpbGUgLSBQQS1SSVNDIFswLTldLlswLTldJ10KKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9wYTIwXzY0L2xpYmMuc2wKKyAgICA7OworICAqKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIChzW1swLTldXVtbMC05XV1bWzAtOV1dfFBBLVJJU0NbWzAtOV1dLltbMC05XV0pIHNoYXJlZCBsaWJyYXJ5JworICAgIGx0X2N2X2ZpbGVfbWFnaWNfdGVzdF9maWxlPS91c3IvbGliL2xpYmMuc2wKKyAgICA7OworICBlc2FjCisgIDs7CisKK2ludGVyaXhbWzMtOV1dKikKKyAgIyBQSUMgY29kZSBpcyBicm9rZW4gb24gSW50ZXJpeCAzLngsIHRoYXQncyB3aHkgfFwuYSBub3QgfF9waWNcLmEgaGVyZQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvfFwuYSkkJworICA7OworCitpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqKQorICBjYXNlICRMRCBpbgorICAqLTMyfCoiLTMyICIpIGxpYm1hZ2ljPTMyLWJpdDs7CisgICotbjMyfCoiLW4zMiAiKSBsaWJtYWdpYz1OMzI7OworICAqLTY0fCoiLTY0ICIpIGxpYm1hZ2ljPTY0LWJpdDs7CisgICopIGxpYm1hZ2ljPW5ldmVyLW1hdGNoOzsKKyAgZXNhYworICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eCogfCBrKmJzZCotZ251KQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCituZXRic2QqKQorICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBlbHNlCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J21hdGNoX3BhdHRlcm4gL2xpYltbXi9dXSsoXC5zb3xfcGljXC5hKSQnCisgIGZpCisgIDs7CisKK25ld29zNiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChleGVjdXRhYmxlfGR5bmFtaWMgbGliKScKKyAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQorICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vdXNyL2xpYi9saWJubHMuc28KKyAgOzsKKworKm50byogfCAqcW54KikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworb3BlbmJzZCopCisgIGlmIHRlc3QgLXogImBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX19gIiB8fCB0ZXN0ICIkaG9zdF9vcy0kaG9zdF9jcHUiID0gIm9wZW5ic2QyLjgtcG93ZXJwYyI7IHRoZW4KKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8XC5zb3xfcGljXC5hKSQnCisgIGVsc2UKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0nbWF0Y2hfcGF0dGVybiAvbGliW1teL11dKyhcLnNvXC5bWzAtOV1dK1wuW1swLTldXSt8X3BpY1wuYSkkJworICBmaQorICA7OworCitvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3Jkb3MqKQorICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAorICA7OworCitzb2xhcmlzKikKKyAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgOzsKKworc3lzdjUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKiB8IHN5c3Y0KnV3MiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7CisKK3N5c3Y0IHwgc3lzdjQuMyopCisgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisgIG1vdG9yb2xhKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbWzAtOV1dW1swLTldXSotYml0IFtbTUxdXVNCIChzaGFyZWQgb2JqZWN0fGR5bmFtaWMgbGliKSBNW1swLTldXVtbMC05XV0qIFZlcnNpb24gW1swLTldXScKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKKyAgICA7OworICBuY3IpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBzZXF1ZW50KQorICAgIGx0X2N2X2ZpbGVfbWFnaWNfY21kPScvYmluL2ZpbGUnCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgRUxGIFtbMC05XV1bWzAtOV1dKi1iaXQgW1tMTV1dU0IgKHNoYXJlZCBvYmplY3R8ZHluYW1pYyBsaWIgKScKKyAgICA7OworICBzbmkpCisgICAgbHRfY3ZfZmlsZV9tYWdpY19jbWQ9Jy9iaW4vZmlsZScKKyAgICBsdF9jdl9kZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgW1swLTldXVtbMC05XV0qLWJpdCBbW0xNXV1TQiBkeW5hbWljIGxpYiIKKyAgICBsdF9jdl9maWxlX21hZ2ljX3Rlc3RfZmlsZT0vbGliL2xpYmMuc28KKyAgICA7OworICBzaWVtZW5zKQorICAgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgICAgOzsKKyAgcGMpCisgICAgbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2Q9cGFzc19hbGwKKyAgICA7OworICBlc2FjCisgIDs7CisKK3RwZiopCisgIGx0X2N2X2RlcGxpYnNfY2hlY2tfbWV0aG9kPXBhc3NfYWxsCisgIDs7Citlc2FjCitdKQorZmlsZV9tYWdpY19jbWQ9JGx0X2N2X2ZpbGVfbWFnaWNfY21kCitkZXBsaWJzX2NoZWNrX21ldGhvZD0kbHRfY3ZfZGVwbGlic19jaGVja19tZXRob2QKK3Rlc3QgLXogIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgJiYgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgorCitfTFRfREVDTChbXSwgW2RlcGxpYnNfY2hlY2tfbWV0aG9kXSwgWzFdLAorICAgIFtNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0c10pCitfTFRfREVDTChbXSwgW2ZpbGVfbWFnaWNfY21kXSwgWzFdLAorICAgIFtDb21tYW5kIHRvIHVzZSB3aGVuIGRlcGxpYnNfY2hlY2tfbWV0aG9kID09ICJmaWxlX21hZ2ljIl0pCitdKSMgX0xUX0NIRUNLX01BR0lDX01FVEhPRAorCisKKyMgTFRfUEFUSF9OTQorIyAtLS0tLS0tLS0tCisjIGZpbmQgdGhlIHBhdGhuYW1lIHRvIGEgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCitBQ19ERUZVTihbTFRfUEFUSF9OTV0sCitbQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCitBQ19DQUNIRV9DSEVDSyhbZm9yIEJTRC0gb3IgTVMtY29tcGF0aWJsZSBuYW1lIGxpc3RlciAobm0pXSwgbHRfY3ZfcGF0aF9OTSwKK1tpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCisgICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorICBsdF9jdl9wYXRoX05NPSIkTk0iCitlbHNlCisgIGx0X25tX3RvX2NoZWNrPSIke2FjX3Rvb2xfcHJlZml4fW5tIgorICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiICYmIHRlc3QgIiRidWlsZCIgPSAiJGhvc3QiOyB0aGVuCisgICAgbHRfbm1fdG9fY2hlY2s9IiRsdF9ubV90b19jaGVjayBubSIKKyAgZmkKKyAgZm9yIGx0X3RtcF9ubSBpbiAkbHRfbm1fdG9fY2hlY2s7IGRvCisgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisgICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4vZWxmIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbworICAgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgdG1wX25tPSIkYWNfZGlyLyRsdF90bXBfbm0iCisgICAgICBpZiB0ZXN0IC1mICIkdG1wX25tIiB8fCB0ZXN0IC1mICIkdG1wX25tJGFjX2V4ZWV4dCIgOyB0aGVuCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisJIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKKwkjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCisJIyBUcnU2NCdzIG5tIGNvbXBsYWlucyB0aGF0IC9kZXYvbnVsbCBpcyBhbiBpbnZhbGlkIG9iamVjdCBmaWxlCisJY2FzZSBgIiR0bXBfbm0iIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSdgIGluCisJKi9kZXYvbnVsbCogfCAqJ0ludmFsaWQgZmlsZSBvciBvYmplY3QgdHlwZScqKQorCSAgbHRfY3ZfcGF0aF9OTT0iJHRtcF9ubSAtQiIKKwkgIGJyZWFrCisJICA7OworCSopCisJICBjYXNlIGAiJHRtcF9ubSIgLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJ2AgaW4KKwkgICovZGV2L251bGwqKQorCSAgICBsdF9jdl9wYXRoX05NPSIkdG1wX25tIC1wIgorCSAgICBicmVhaworCSAgICA7OworCSAgKikKKwkgICAgbHRfY3ZfcGF0aF9OTT0ke2x0X2N2X3BhdGhfTk09IiR0bXBfbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKKwkgICAgY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkbHRfc2F2ZV9pZnMiCisgIGRvbmUKKyAgOiAke2x0X2N2X3BhdGhfTk09bm99CitmaV0pCitpZiB0ZXN0ICIkbHRfY3ZfcGF0aF9OTSIgIT0gIm5vIjsgdGhlbgorICBOTT0iJGx0X2N2X3BhdGhfTk0iCitlbHNlCisgICMgRGlkbid0IGZpbmQgYW55IEJTRCBjb21wYXRpYmxlIG5hbWUgbGlzdGVyLCBsb29rIGZvciBkdW1wYmluLgorICBBQ19DSEVDS19UT09MUyhEVU1QQklOLCBbImR1bXBiaW4gLXN5bWJvbHMiICJsaW5rIC1kdW1wIC1zeW1ib2xzIl0sIDopCisgIEFDX1NVQlNUKFtEVU1QQklOXSkKKyAgaWYgdGVzdCAiJERVTVBCSU4iICE9ICI6IjsgdGhlbgorICAgIE5NPSIkRFVNUEJJTiIKKyAgZmkKK2ZpCit0ZXN0IC16ICIkTk0iICYmIE5NPW5tCitBQ19TVUJTVChbTk1dKQorX0xUX0RFQ0woW10sIFtOTV0sIFsxXSwgW0EgQlNELSBvciBNUy1jb21wYXRpYmxlIG5hbWUgbGlzdGVyXSlkbmwKKworQUNfQ0FDSEVfQ0hFQ0soW3RoZSBuYW1lIGxpc3RlciAoJE5NKSBpbnRlcmZhY2VdLCBbbHRfY3Zfbm1faW50ZXJmYWNlXSwKKyAgW2x0X2N2X25tX2ludGVyZmFjZT0iQlNEIG5tIgorICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LiRhY19leHQKKyAgKGV2YWwgZWNobyAiXCJcJGFzX21lOl9fb2xpbmVfXzogJGFjX2NvbXBpbGVcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiRhY19jb21waWxlIiAyPmNvbmZ0ZXN0LmVycikKKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JkFTX01FU1NBR0VfTE9HX0ZECisgIChldmFsIGVjaG8gIlwiXCRhc19tZTpfX29saW5lX186ICROTSBcXFwiY29uZnRlc3QuJGFjX29iamV4dFxcXCJcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgKGV2YWwgIiROTSBcImNvbmZ0ZXN0LiRhY19vYmpleHRcIiIgMj5jb25mdGVzdC5lcnIgPiBjb25mdGVzdC5vdXQpCisgIGNhdCBjb25mdGVzdC5lcnIgPiZBU19NRVNTQUdFX0xPR19GRAorICAoZXZhbCBlY2hvICJcIlwkYXNfbWU6X19vbGluZV9fOiBvdXRwdXRcIiIgPiZBU19NRVNTQUdFX0xPR19GRCkKKyAgY2F0IGNvbmZ0ZXN0Lm91dCA+JkFTX01FU1NBR0VfTE9HX0ZECisgIGlmICRHUkVQICdFeHRlcm5hbC4qc29tZV92YXJpYWJsZScgY29uZnRlc3Qub3V0ID4gL2Rldi9udWxsOyB0aGVuCisgICAgbHRfY3Zfbm1faW50ZXJmYWNlPSJNUyBkdW1wYmluIgorICBmaQorICBybSAtZiBjb25mdGVzdCpdKQorXSkjIExUX1BBVEhfTk0KKworIyBPbGQgbmFtZXM6CitBVV9BTElBUyhbQU1fUFJPR19OTV0sIFtMVF9QQVRIX05NXSkKK0FVX0FMSUFTKFtBQ19QUk9HX05NXSwgW0xUX1BBVEhfTk1dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBTV9QUk9HX05NXSwgW10pCitkbmwgQUNfREVGVU4oW0FDX1BST0dfTk1dLCBbXSkKKworCisjIExUX0xJQl9NCisjIC0tLS0tLS0tCisjIGNoZWNrIGZvciBtYXRoIGxpYnJhcnkKK0FDX0RFRlVOKFtMVF9MSUJfTV0sCitbQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAorTElCTT0KK2Nhc2UgJGhvc3QgaW4KKyotKi1iZW9zKiB8ICotKi1jeWd3aW4qIHwgKi0qLXB3MzIqIHwgKi0qLWRhcndpbiopCisgICMgVGhlc2Ugc3lzdGVtIGRvbid0IGhhdmUgbGlibSwgb3IgZG9uJ3QgbmVlZCBpdAorICA7OworKi1uY3Itc3lzdjQuMyopCisgIEFDX0NIRUNLX0xJQihtdywgX213dmFsaWRjaGVja2wsIExJQk09Ii1sbXciKQorICBBQ19DSEVDS19MSUIobSwgY29zLCBMSUJNPSIkTElCTSAtbG0iKQorICA7OworKikKKyAgQUNfQ0hFQ0tfTElCKG0sIGNvcywgTElCTT0iLWxtIikKKyAgOzsKK2VzYWMKK0FDX1NVQlNUKFtMSUJNXSkKK10pIyBMVF9MSUJfTQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0FDX0NIRUNLX0xJQk1dLCBbTFRfTElCX01dKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19DSEVDS19MSUJNXSwgW10pCisKKworIyBfTFRfQ09NUElMRVJfTk9fUlRUSShbVEFHTkFNRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ09NUElMRVJfTk9fUlRUSV0sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKworaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zXSwKKyAgICBsdF9jdl9wcm9nX2NvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucywKKyAgICBbLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9uc10sIFtdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyJdKQorZmkKK19MVF9UQUdERUNMKFtub19idWlsdGluX2ZsYWddLCBbbHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWddLCBbMV0sCisJW0NvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnNdKQorXSkjIF9MVF9DT01QSUxFUl9OT19SVFRJCisKKworIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZnVuKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitBQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKK0FDX1JFUVVJUkUoW0xUX1BBVEhfTk1dKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9MRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfREVDTF9TRURdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCisKKyMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCitBQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCBmcm9tICRjb21waWxlciBvYmplY3RdKQorQUNfQ0FDSEVfVkFMKFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwKK1sKKyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgorIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KKworIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgorc3ltY29kZT0nW1tCQ0RFR1JTVF1dJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbW19BLVphLXpdXVtbX0EtWmEtejAtOV1dKlwpJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAkaG9zdF9vcyBpbgorYWl4KikKKyAgc3ltY29kZT0nW1tCQ0RUXV0nCisgIDs7CitjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgIHN5bWNvZGU9J1tbQUJDREdJU1RXXV0nCisgIDs7CitocHV4KikKKyAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICBzeW1jb2RlPSdbW0FCQ0RFR1JTVF1dJworICBmaQorICA7OworaXJpeCogfCBub25zdG9wdXgqKQorICBzeW1jb2RlPSdbW0JDREVHUlNUXV0nCisgIDs7Citvc2YqKQorICBzeW1jb2RlPSdbW0JDREVHUVJTVF1dJworICA7Oworc29sYXJpcyopCisgIHN5bWNvZGU9J1tbQkRSVF1dJworICA7Oworc2NvMy4ydjUqKQorICBzeW1jb2RlPSdbW0RUXV0nCisgIDs7CitzeXN2NC4ydXcyKikKKyAgc3ltY29kZT0nW1tEVF1dJworICA7Oworc3lzdjUqIHwgc2NvNXY2KiB8IHVuaXh3YXJlKiB8IE9wZW5VTklYKikKKyAgc3ltY29kZT0nW1tBQkRUXV0nCisgIDs7CitzeXN2NCkKKyAgc3ltY29kZT0nW1tERk5TVFVdXScKKyAgOzsKK2VzYWMKKworIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCitjYXNlIGAkTk0gLVYgMj4mMWAgaW4KKypHTlUqIHwgKid3aXRoIEJGRCcqKQorICBzeW1jb2RlPSdbW0FCQ0RHSVJTVFddXScgOzsKK2VzYWMKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbi4KKyMgU29tZSBzeXN0ZW1zIChlc3AuIG9uIGlhNjQpIGxpbmsgZGF0YSBhbmQgY29kZSBzeW1ib2xzIGRpZmZlcmVudGx5LAorIyBzbyB1c2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoLgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBpbnQgXDEoKTsvcCcgLWUgJ3MvXiRzeW1jb2RlKiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKKworIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gc3ltYm9sIG5hbWUgYW5kIHN5bWJvbCBhZGRyZXNzCitsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzcz0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeD0ic2VkIC1uIC1lICdzL146IFwoW1teIF1dKlwpICQvICB7XFxcIlwxXFxcIiwgKHZvaWQgKikgMH0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChsaWJbW14gXV0qXCkkLyAge1wiXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIC1lICdzL14kc3ltY29kZSogXChbW14gXV0qXCkgXChbW14gXV0qXCkkLyAge1wibGliXDJcIiwgKHZvaWQgKikgXCZcMn0sL3AnIgorCisjIEhhbmRsZSBDUkxGIGluIG1pbmd3IHRvb2wgY2hhaW4KK29wdF9jcj0KK2Nhc2UgJGJ1aWxkX29zIGluCittaW5ndyopCisgIG9wdF9jcj1gJEVDSE8gJ3hcezAsMVx9JyB8IHRyIHggJ1wwMTUnYCAjIG9wdGlvbiBjciBpbiByZWdleHAKKyAgOzsKK2VzYWMKKworIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcnNjb3JlLCB0aGVuIHdpdGggaXQuCitmb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCisKKyAgIyBUcmFuc2Zvcm0gc3ltY29kZSwgc3ltcGF0LCBhbmQgc3ltcHJmeCBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KKyAgc3lteGZybT0iXFwxICRhY19zeW1wcmZ4XFwyIFxcMiIKKworICAjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCisgIGlmIHRlc3QgIiRsdF9jdl9ubV9pbnRlcmZhY2UiID0gIk1TIGR1bXBiaW4iOyB0aGVuCisgICAgIyBGYWtlIGl0IGZvciBkdW1wYmluIGFuZCBzYXkgVCBmb3IgYW55IG5vbi1zdGF0aWMgZnVuY3Rpb24KKyAgICAjIGFuZCBEIGZvciBhbnkgZ2xvYmFsIHZhcmlhYmxlLgorICAgICMgQWxzbyBmaW5kIEMrKyBhbmQgX19mYXN0Y2FsbCBzeW1ib2xzIGZyb20gTVNWQysrLAorICAgICMgd2hpY2ggc3RhcnQgd2l0aCBAIG9yID8uCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0iJEFXSyBbJyJcCisiICAgICB7bGFzdF9zZWN0aW9uPXNlY3Rpb247IHNlY3Rpb249XCQgM307IlwKKyIgICAgIC9TZWN0aW9uIGxlbmd0aCAuKiNyZWxvY3MuKihwaWNrIGFueSkve2hpZGVbbGFzdF9zZWN0aW9uXT0xfTsiXAorIiAgICAgXCQgMCF+L0V4dGVybmFsICpcfC97bmV4dH07IlwKKyIgICAgIC8gMCsgVU5ERUYgL3tuZXh0fTsgLyBVTkRFRiBcKFtefF1cKSooKS97bmV4dH07IlwKKyIgICAgIHtpZihoaWRlW3NlY3Rpb25dKSBuZXh0fTsiXAorIiAgICAge2Y9MH07IFwkIDB+L1woXCkuKlx8L3tmPTF9OyB7cHJpbnRmIGYgPyBcIlQgXCIgOiBcIkQgXCJ9OyJcCisiICAgICB7c3BsaXQoXCQgMCwgYSwgL1x8fFxyLyk7IHNwbGl0KGFbMl0sIHMpfTsiXAorIiAgICAgc1sxXX4vXltAP10ve3ByaW50IHNbMV0sIHNbMV07IG5leHR9OyJcCisiICAgICBzWzFdfnByZngge3NwbGl0KHNbMV0sdCxcIkBcIik7IHByaW50IHRbMV0sIHN1YnN0cih0WzFdLGxlbmd0aChwcmZ4KSl9IlwKKyIgICAgICcgcHJmeD1eJGFjX3N5bXByZnhdIgorICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKltbCSBdXVwoJHN5bWNvZGUkc3ltY29kZSpcKVtbCSBdXVtbCSBdXSokYWNfc3ltcHJmeCRzeW1wYXQkb3B0X2NyJC8kc3lteGZybS9wJyIKKyAgZmkKKworICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KKyAgcGlwZV93b3Jrcz1ubworCisgIHJtIC1mIGNvbmZ0ZXN0KgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8X0xUX0VPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKHZvaWQpOwordm9pZCBubV90ZXN0X2Z1bmModm9pZCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK2ludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYygpO3JldHVybigwKTt9CitfTFRfRU9GCisKKyAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KKyAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KKyAgICBubGlzdD1jb25mdGVzdC5ubQorICAgIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJG5saXN0KSAmJiB0ZXN0IC1zICIkbmxpc3QiOyB0aGVuCisgICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgorICAgICAgaWYgc29ydCAiJG5saXN0IiB8IHVuaXEgPiAiJG5saXN0IlQ7IHRoZW4KKwltdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKyAgICAgIGVsc2UKKwlybSAtZiAiJG5saXN0IlQKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICAgIGlmICRHUkVQICcgbm1fdGVzdF92YXIkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJaWYgJEdSRVAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJICBjYXQgPDxfTFRfRU9GID4gY29uZnRlc3QuJGFjX2V4dAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitfTFRfRU9GCisJICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCisJICBldmFsICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0JworCisJICBjYXQgPDxfTFRfRU9GID4+IGNvbmZ0ZXN0LiRhY19leHQKKworLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICAqLworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAgICAgICAqYWRkcmVzczsKK30KK2x0X19QUk9HUkFNX19MVFhfcHJlbG9hZGVkX3N5bWJvbHNbW11dID0KK3sKKyAgeyAiQFBST0dSQU1AIiwgKHZvaWQgKikgMCB9LAorX0xUX0VPRgorCSAgJFNFRCAicy9eJHN5bWNvZGUkc3ltY29kZSogXCguKlwpIFwoLipcKSQvICB7XCJcMlwiLCAodm9pZCAqKSBcJlwyfSwvIiA8ICIkbmxpc3QiIHwgJEdSRVAgLXYgbWFpbiA+PiBjb25mdGVzdC4kYWNfZXh0CisJICBjYXQgPDxcX0xUX0VPRiA+PiBjb25mdGVzdC4kYWNfZXh0CisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfX1BST0dSQU1fX0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorX0xUX0VPRgorCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKwkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRzdG0uJGFjX29iamV4dAorCSAgbHRfc2F2ZV9MSUJTPSIkTElCUyIKKwkgIGx0X3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorCSAgTElCUz0iY29uZnRzdG0uJGFjX29iamV4dCIKKwkgIENGTEFHUz0iJENGTEFHUyRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfbm9fYnVpbHRpbl9mbGFnLCAkMSkiCisJICBpZiBBQ19UUllfRVZBTChhY19saW5rKSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCisJICAgIHBpcGVfd29ya3M9eWVzCisJICBmaQorCSAgTElCUz0iJGx0X3NhdmVfTElCUyIKKwkgIENGTEFHUz0iJGx0X3NhdmVfQ0ZMQUdTIgorCWVsc2UKKwkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mQVNfTUVTU0FHRV9MT0dfRkQKKwlmaQorICAgICAgZWxzZQorCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRubGlzdCIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgcnVuICRsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgZmkKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBmaQorICBybSAtcmYgY29uZnRlc3QqIGNvbmZ0c3QqCisKKyAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgorICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KKyAgICBicmVhaworICBlbHNlCisgICAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KKyAgZmkKK2RvbmUKK10pCitpZiB0ZXN0IC16ICIkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKyAgbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9CitmaQoraWYgdGVzdCAteiAiJGx0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUkbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiOyB0aGVuCisgIEFDX01TR19SRVNVTFQoZmFpbGVkKQorZWxzZQorICBBQ19NU0dfUkVTVUxUKG9rKQorZmkKKworX0xUX0RFQ0woW2dsb2JhbF9zeW1ib2xfcGlwZV0sIFtsdF9jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlXSwgWzFdLAorICAgIFtUYWtlIHRoZSBvdXRwdXQgb2Ygbm0gYW5kIHByb2R1Y2UgYSBsaXN0aW5nIG9mIHJhdyBzeW1ib2xzIGFuZCBDIG5hbWVzXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgW2x0X2N2X3N5c19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsXSwgWzFdLAorICAgIFtUcmFuc2Zvcm0gdGhlIG91dHB1dCBvZiBubSBpbiBhIHByb3BlciBDIGRlY2xhcmF0aW9uXSkKK19MVF9ERUNMKFtnbG9iYWxfc3ltYm9sX3RvX2NfbmFtZV9hZGRyZXNzXSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NdLCBbMV0sCisgICAgW1RyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgQyBuYW1lIGFkZHJlc3MgcGFpcl0pCitfTFRfREVDTChbZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4XSwKKyAgICBbbHRfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3NfbGliX3ByZWZpeF0sIFsxXSwKKyAgICBbVHJhbnNmb3JtIHRoZSBvdXRwdXQgb2Ygbm0gaW4gYSBDIG5hbWUgYWRkcmVzcyBwYWlyIHdoZW4gbGliIHByZWZpeCBpcyBuZWVkZWRdKQorXSkgIyBfTFRfQ01EX0dMT0JBTF9TWU1CT0xTCisKKworIyBfTFRfQ09NUElMRVJfUElDKFtUQUdOQU1FXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZ1bihbX0xUX0NPTVBJTEVSX1BJQ10sCitbbTRfcmVxdWlyZShbX0xUX1RBR19DT01QSUxFUl0pZG5sCitfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KK19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0KKworQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGNvbXBpbGVyIG9wdGlvbiB0byBwcm9kdWNlIFBJQ10pCittNF9pZihbJDFdLCBbQ1hYXSwgWworICAjIEMrKyBzcGVjaWZpYyBjYXNlcyBmb3IgcGljLCBzdGF0aWMsIHdsLCBldGMuCisgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworICAgIG1pbmd3KiB8IGN5Z3dpbiogfCBvczIqIHwgcHczMiogfCBjZWdjYyopCisgICAgICAjIFRoaXMgaGFjayBpcyBzbyB0aGF0IHRoZSBzb3VyY2UgZmlsZSBjYW4gdGVsbCB3aGV0aGVyIGl0IGlzIGJlaW5nCisgICAgICAjIGJ1aWx0IGZvciBpbmNsdXNpb24gaW4gYSBkbGwgKGFuZCBzaG91bGQgZXhwb3J0IHN5bWJvbHMgZm9yIGV4YW1wbGUpLgorICAgICAgIyBBbHRob3VnaCB0aGUgY3lnd2luIGdjYyBpZ25vcmVzIC1mUElDLCBzdGlsbCBuZWVkIHRoaXMgZm9yIG9sZC1zdHlsZQorICAgICAgIyAoLS1kaXNhYmxlLWF1dG8taW1wb3J0KSBsaWJyYXJpZXMKKyAgICAgIG00X2lmKFskMV0sIFtHQ0pdLCBbXSwKKwlbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctRERMTF9FWFBPUlQnXSkKKyAgICAgIDs7CisgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICMgQ29tbW9uIHN5bWJvbHMgbm90IGFsbG93ZWQgaW4gTUhfRFlMSUIgZmlsZXMKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZuby1jb21tb24nCisgICAgICA7OworICAgICpkamdwcCopCisgICAgICAjIERKR1BQIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKyAgICAgIDs7CisgICAgaW50ZXJpeFtbMy05XV0qKQorICAgICAgIyBJbnRlcml4IDMueCBnY2MgLWZwaWMvLWZQSUMgb3B0aW9ucyBnZW5lcmF0ZSBicm9rZW4gY29kZS4KKyAgICAgICMgSW5zdGVhZCwgd2UgcmVsb2NhdGUgc2hhcmVkIGxpYnJhcmllcyBhdCBydW50aW1lLgorICAgICAgOzsKKyAgICBzeXN2NCpNUCopCisgICAgICBpZiB0ZXN0IC1kIC91c3IvbmVjOyB0aGVuCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPS1LY29uZm9ybV9waWMKKyAgICAgIGZpCisgICAgICA7OworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJOzsKKyAgICAgICopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKyAgICAqcW54KiB8ICpudG8qKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisgICAgKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICA7OworICAgIGVzYWMKKyAgZWxzZQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeFtbNC05XV0qKQorCSMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KKwlpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSAgIyBBSVggNSBub3cgc3VwcG9ydHMgSUE2NCBwcm9jZXNzb3IKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCisJZmkKKwk7OworICAgICAgY2hvcnVzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCWN4Y2g2OCopCisJICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgIyBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Ii0tbm9fYXV0b19pbnN0YW50aWF0aW9uIC11IF9fbWFpbiAtdSBfX3ByZW1haW4gLXUgX2Fib3J0IC1yICRDT09MX0RJUi9saWIvbGliT3JiLmEgJE1WTUVfRElSL2xpYi9DQy9saWJDLmEgJE1WTUVfRElSL2xpYi9jbGFzc2l4L2xpYmN4LnMuYSIKKwkgIDs7CisJZXNhYworCTs7CisgICAgICBkZ3V4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgZWMrKyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIDs7CisJICBnaGN4KikKKwkgICAgIyBHcmVlbiBIaWxscyBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKwkjIEZyZWVCU0QgdXNlcyBHTlUgQysrCisJOzsKKyAgICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9JyR7d2x9LWEgJHt3bH1hcmNoaXZlJworCSAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQ7IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCSAgICBmaQorCSAgICA7OworCSAgYUNDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisJICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgIGhwcGEqNjQqfGlhNjQqKQorCSAgICAgICMgK1ogdGhlIGRlZmF1bHQKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nK1onCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIGludGVyaXgqKQorCSMgVGhpcyBpcyBjODksIHdoaWNoIGlzIE1TIFZpc3VhbCBDKysgKG5vIHNoYXJlZCBsaWJzKQorCSMgQW55b25lIHdhbnRzIHRvIGRvIGEgcG9ydD8KKwk7OworICAgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgIyBDQyBwaWMgZmxhZyAtS1BJQyBpcyB0aGUgZGVmYXVsdC4KKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICBsaW51eCogfCBrKmJzZCotZ251KQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBLQ0MqKQorCSAgICAjIEtBSSBDKysgQ29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy0tYmFja2VuZCAtV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICA7OworCSAgZWNwYyogKQorCSAgICAjIG9sZCBJbnRlbCBDKysgZm9yIHg4Nl82NCB3aGljaCBzdGlsbCBzdXBwb3J0ZWQgLUtQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBpY3BjKiApCisJICAgICMgSW50ZWwgQysrLCB1c2VkIHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIEdDQy4KKwkgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1zdGF0aWMnCisJICAgIDs7CisJICBwZ0NDKiB8IHBnY3BwKikKKwkgICAgIyBQb3J0bGFuZCBHcm91cCBDKysgY29tcGlsZXIKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZwaWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJICBjeHgqKQorCSAgICAjIENvbXBhcSBDKysKKwkgICAgIyBNYWtlIHN1cmUgdGhlIFBJQyBmbGFnIGlzIGVtcHR5LiAgSXQgYXBwZWFycyB0aGF0IGFsbCBBbHBoYQorCSAgICAjIExpbnV4IGFuZCBDb21wYXEgVHJ1NjQgVW5peCBvYmplY3RzIGFyZSBQSUMuCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKwkgICAgOzsKKwkgIHhsYyogfCB4bEMqKQorCSAgICAjIElCTSBYTCA4LjAgb24gUFBDCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1xcGljJworCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1xc3RhdGljbGluaycKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworCSAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbHlueG9zKikKKwk7OworICAgICAgbTg4ayopCisJOzsKKyAgICAgIG12cyopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGN4eCopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLVcgYyxleHBvcnRhbGwnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgbmV0YnNkKikKKwk7OworICAgICAgKnFueCogfCAqbnRvKikKKyAgICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mUElDIC1zaGFyZWQnCisgICAgICAgIDs7CisgICAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIEtDQyopCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctLWJhY2tlbmQgLVdsLCcKKwkgICAgOzsKKwkgIFJDQyopCisJICAgICMgUmF0aW9uYWwgQysrIDIuNC4xCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgOzsKKwkgIGN4eCopCisJICAgICMgRGlnaXRhbC9Db21wYXEgQysrCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCSAgICAjIE1ha2Ugc3VyZSB0aGUgUElDIGZsYWcgaXMgZW1wdHkuICBJdCBhcHBlYXJzIHRoYXQgYWxsIEFscGhhCisJICAgICMgTGludXggYW5kIENvbXBhcSBUcnU2NCBVbml4IG9iamVjdHMgYXJlIFBJQy4KKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPQorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ub25fc2hhcmVkJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHBzb3MqKQorCTs7CisgICAgICBzb2xhcmlzKikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC4yLCA1LnggYW5kIENlbnRlcmxpbmUgQysrCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctUW9wdGlvbiBsZCAnCisJICAgIDs7CisJICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1QSUMnCisJICAgIDs7CisJICAqKQorCSAgICA7OworCWVzYWMKKwk7OworICAgICAgc3Vub3M0KikKKwljYXNlICRjY19iYXNlbmFtZSBpbgorCSAgQ0MqKQorCSAgICAjIFN1biBDKysgNC54CisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXBpYycKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgICAgOzsKKwkgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworCSAgICA7OworCSAgKikKKwkgICAgOzsKKwllc2FjCisJOzsKKyAgICAgIHN5c3Y1KiB8IHVuaXh3YXJlKiB8IHNjbzMuMnY1KiB8IHNjbzV2NiogfCBPcGVuVU5JWCopCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIENDKikKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisJICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB0YW5kZW0qKQorCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisJICBOQ0MqKQorCSAgICAjIE5vblN0b3AtVVggTkNDIDMuMjAKKwkgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgICAgOzsKKwkgICopCisJICAgIDs7CisJZXNhYworCTs7CisgICAgICB2eHdvcmtzKikKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfY2FuX2J1aWxkX3NoYXJlZCwgJDEpPW5vCisJOzsKKyAgICBlc2FjCisgIGZpCitdLAorWworICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeCopCisgICAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisgICAgICAgIDs7CisgICAgICBtNjhrKQorICAgICAgICAgICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAorICAgICAgICAgICAgIyBhZGRpbmcgdGhlIGAtbTY4MDIwJyBmbGFnIHRvIEdDQyBwcmV2ZW50cyBidWlsZGluZyBhbnl0aGluZyBiZXR0ZXIsCisgICAgICAgICAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgICAgICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBub25zdG9wdXgqIHwgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIHRoZXNlIE9TZXMuCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICAjIEFsdGhvdWdoIHRoZSBjeWd3aW4gZ2NjIGlnbm9yZXMgLWZQSUMsIHN0aWxsIG5lZWQgdGhpcyBmb3Igb2xkLXN0eWxlCisgICAgICAjICgtLWRpc2FibGUtYXV0by1pbXBvcnQpIGxpYnJhcmllcworICAgICAgbTRfaWYoWyQxXSwgW0dDSl0sIFtdLAorCVtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1ERExMX0VYUE9SVCddKQorICAgICAgOzsKKworICAgIGRhcndpbiogfCByaGFwc29keSopCisgICAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAjIENvbW1vbiBzeW1ib2xzIG5vdCBhbGxvd2VkIGluIE1IX0RZTElCIGZpbGVzCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mbm8tY29tbW9uJworICAgICAgOzsKKworICAgIGhwdXgqKQorICAgICAgIyBQSUMgaXMgdGhlIGRlZmF1bHQgZm9yIDY0LWJpdCBQQSBIUC1VWCwgYnV0IG5vdCBmb3IgMzItYml0CisgICAgICAjIFBBIEhQLVVYLiAgT24gSUE2NCBIUC1VWCwgUElDIGlzIHRoZSBkZWZhdWx0IGJ1dCB0aGUgcGljIGZsYWcKKyAgICAgICMgc2V0cyB0aGUgZGVmYXVsdCBUTFMgbW9kZWwgYW5kIGFmZmVjdHMgaW5saW5pbmcuCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgaHBwYSo2NCopCisJIyArWiB0aGUgZGVmYXVsdAorCTs7CisgICAgICAqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICAjIEludGVyaXggMy54IGdjYyAtZnBpYy8tZlBJQyBvcHRpb25zIGdlbmVyYXRlIGJyb2tlbiBjb2RlLgorICAgICAgIyBJbnN0ZWFkLCB3ZSByZWxvY2F0ZSBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICA7OworCisgICAgbXNkb3NkamdwcCopCisgICAgICAjIEp1c3QgYmVjYXVzZSB3ZSB1c2UgR0NDIGRvZXNuJ3QgbWVhbiB3ZSBzdWRkZW5seSBnZXQgc2hhcmVkIGxpYnJhcmllcworICAgICAgIyBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgOzsKKworICAgICpudG8qIHwgKnFueCopCisgICAgICAjIFFOWCB1c2VzIEdOVSBDKyssIGJ1dCBuZWVkIHRvIGRlZmluZSAtc2hhcmVkIG9wdGlvbiB0b28sIG90aGVyd2lzZQorICAgICAgIyBpdCB3aWxsIGNvcmVkdW1wLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQyAtc2hhcmVkJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9LUtjb25mb3JtX3BpYworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctZlBJQycKKyAgICAgIDs7CisgICAgZXNhYworICBlbHNlCisgICAgIyBQT1JUTUUgQ2hlY2sgZm9yIGZsYWcgdG8gcGFzcyBsaW5rZXIgZmxhZ3MgdGhyb3VnaCB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1XbCwnCisgICAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiID0gaWE2NDsgdGhlbgorCSMgQUlYIDUgbm93IHN1cHBvcnRzIElBNjQgcHJvY2Vzc29yCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1ibnNvIC1iSTovbGliL3N5c2NhbGxzLmV4cCcKKyAgICAgIGZpCisgICAgICA7OworCisgICAgbWluZ3cqIHwgY3lnd2luKiB8IHB3MzIqIHwgb3MyKiB8IGNlZ2NjKikKKyAgICAgICMgVGhpcyBoYWNrIGlzIHNvIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGNhbiB0ZWxsIHdoZXRoZXIgaXQgaXMgYmVpbmcKKyAgICAgICMgYnVpbHQgZm9yIGluY2x1c2lvbiBpbiBhIGRsbCAoYW5kIHNob3VsZCBleHBvcnQgc3ltYm9scyBmb3IgZXhhbXBsZSkuCisgICAgICBtNF9pZihbJDFdLCBbR0NKXSwgW10sCisJW19MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLURETExfRVhQT1JUJ10pCisgICAgICA7OworCisgICAgaHB1eDkqIHwgaHB1eDEwKiB8IGhwdXgxMSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciBJQTY0IEhQLVVYIGFuZCA2NC1iaXQgSFAtVVgsIGJ1dAorICAgICAgIyBub3QgZm9yIFBBIEhQLVVYLgorICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgIGhwcGEqNjQqfGlhNjQqKQorCSMgK1ogdGhlIGRlZmF1bHQKKwk7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9JytaJworCTs7CisgICAgICBlc2FjCisgICAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGx0X3Byb2dfY29tcGlsZXJfc3RhdGljIHRoYXQgd29ya3Mgd2l0aCB0aGUgYnVuZGxlZCBDQz8KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nJHt3bH0tYSAke3dsfWFyY2hpdmUnCisgICAgICA7OworCisgICAgaXJpeDUqIHwgaXJpeDYqIHwgbm9uc3RvcHV4KikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgIyBQSUMgKHdpdGggLUtQSUMpIGlzIHRoZSBkZWZhdWx0LgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICBsaW51eCogfCBrKmJzZCotZ251KQorICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICMgb2xkIEludGVsIGZvciB4ODZfNjQgd2hpY2ggc3RpbGwgc3VwcG9ydGVkIC1LUElDLgorICAgICAgZWNjKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLXN0YXRpYycKKyAgICAgICAgOzsKKyAgICAgICMgaWNjIHVzZWQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggR0NDLgorICAgICAgIyBJQ0MgMTAgZG9lc24ndCBhY2NlcHQgLUtQSUMgYW55IG1vcmUuCisgICAgICBpY2MqIHwgaWZvcnQqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctc3RhdGljJworICAgICAgICA7OworICAgICAgIyBMYWhleSBGb3J0cmFuIDguMS4KKyAgICAgIGxmOTUqKQorCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLS1zaGFyZWQnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctLXN0YXRpYycKKwk7OworICAgICAgcGdjYyogfCBwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCisgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgY29tcGlsZXJzICgqbm90KiB0aGUgUGVudGl1bSBnY2MgY29tcGlsZXIsCisJIyB3aGljaCBsb29rcyB0byBiZSBhIGRlYWQgcHJvamVjdCkKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1mcGljJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICAgIDs7CisgICAgICBjY2MqKQorICAgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICAgIyBBbGwgQWxwaGEgY29kZSBpcyBQSUMuCisgICAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICAgIDs7CisgICAgICB4bCopCisJIyBJQk0gWEwgQyA4LjAvRm9ydHJhbiAxMC4xIG9uIFBQQworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworCV9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLXFwaWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctcXN0YXRpY2xpbmsnCisJOzsKKyAgICAgICopCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCisJICAjIFN1biBDIDUuOQorCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKwkgIDs7CisJKlN1blwgRiopCisJICAjIFN1biBGb3J0cmFuIDguMyBwYXNzZXMgYWxsIHVucmVjb2duaXplZCBmbGFncyB0byB0aGUgbGlua2VyCisJICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworCSAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKwkgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPScnCisJICA7OworCWVzYWMKKwk7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIG5ld3NvczYpCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgIyBRTlggdXNlcyBHTlUgQysrLCBidXQgbmVlZCB0byBkZWZpbmUgLXNoYXJlZCBvcHRpb24gdG9vLCBvdGhlcndpc2UKKyAgICAgICMgaXQgd2lsbCBjb3JlZHVtcC4KKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLWZQSUMgLXNoYXJlZCcKKyAgICAgIDs7CisKKyAgICBvc2YzKiB8IG9zZjQqIHwgb3NmNSopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgICMgQWxsIE9TRi8xIGNvZGUgaXMgUElDLgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctbm9uX3NoYXJlZCcKKyAgICAgIDs7CisKKyAgICByZG9zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLW5vbl9zaGFyZWQnCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICBmNzcqIHwgZjkwKiB8IGY5NSopCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSk9Jy1Rb3B0aW9uIGxkICc7OworICAgICAgKikKKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCc7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVFvcHRpb24gbGQgJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctUElDJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyopCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfd2wsICQxKT0nLVdsLCcKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0nLUtQSUMnCisgICAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfc3RhdGljLCAkMSk9Jy1Cc3RhdGljJworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWMgO3RoZW4KKwlfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9Jy1LY29uZm9ybV9waWMnCisJX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc3lzdjUqIHwgdW5peHdhcmUqIHwgc2NvMy4ydjUqIHwgc2NvNXY2KiB8IE9wZW5VTklYKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctS1BJQycKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKT0nLUJzdGF0aWMnCisgICAgICA7OworCisgICAgdW5pY29zKikKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpPSctV2wsJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKworICAgIHV0czQqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpPSctcGljJworICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPSctQnN0YXRpYycKKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX2Nhbl9idWlsZF9zaGFyZWQsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCitdKQorY2FzZSAkaG9zdF9vcyBpbgorICAjIEZvciBwbGF0Zm9ybXMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUElDLCAtRFBJQyBpcyBtZWFuaW5nbGVzczoKKyAgKmRqZ3BwKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgOzsKKyAgKikKKyAgICBfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9IiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSlAJnRAbTRfaWYoWyQxXSxbXSxbIC1EUElDXSxbbTRfaWYoWyQxXSxbQ1hYXSxbIC1EUElDXSxbXSldKSIKKyAgICA7OworZXNhYworQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKV0pCitfTFRfVEFHREVDTChbd2xdLCBbbHRfcHJvZ19jb21waWxlcl93bF0sIFsxXSwKKwlbSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlcl0pCisKKyMKKyMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBQSUMgZmxhZyBhY3R1YWxseSB3b3Jrcy4KKyMKK2lmIHRlc3QgLW4gIiRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiOyB0aGVuCisgIF9MVF9DT01QSUxFUl9PUFRJT04oW2lmICRjb21waWxlciBQSUMgZmxhZyAkX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpIHdvcmtzXSwKKyAgICBbX0xUX1RBR1ZBUihsdF9jdl9wcm9nX2NvbXBpbGVyX3BpY193b3JrcywgJDEpXSwKKyAgICBbJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKUAmdEBtNF9pZihbJDFdLFtdLFsgLURQSUNdLFttNF9pZihbJDFdLFtDWFhdLFsgLURQSUNdLFtdKV0pXSwgW10sCisgICAgW2Nhc2UgJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKSBpbgorICAgICAiIiB8ICIgIiopIDs7CisgICAgICopIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9waWMsICQxKT0iICRfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSkiIDs7CisgICAgIGVzYWNdLAorICAgIFtfTFRfVEFHVkFSKGx0X3Byb2dfY29tcGlsZXJfcGljLCAkMSk9CisgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9jYW5fYnVpbGRfc2hhcmVkLCAkMSk9bm9dKQorZmkKK19MVF9UQUdERUNMKFtwaWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3BpY10sIFsxXSwKKwlbQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzXSkKKworIworIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBmbGFnIGFjdHVhbGx5IHdvcmtzLgorIword2w9JF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl93bCwgJDEpIGV2YWwgbHRfdG1wX3N0YXRpY19mbGFnPVwiJF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9zdGF0aWMsICQxKVwiCitfTFRfTElOS0VSX09QVElPTihbaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsdF90bXBfc3RhdGljX2ZsYWcgd29ya3NdLAorICBfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfc3RhdGljX3dvcmtzLCAkMSksCisgICRsdF90bXBfc3RhdGljX2ZsYWcsCisgIFtdLAorICBbX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYywgJDEpPV0pCitfTFRfVEFHREVDTChbbGlua19zdGF0aWNfZmxhZ10sIFtsdF9wcm9nX2NvbXBpbGVyX3N0YXRpY10sIFsxXSwKKwlbQ29tcGlsZXIgZmxhZyB0byBwcmV2ZW50IGR5bmFtaWMgbGlua2luZ10pCitdKSMgX0xUX0NPTVBJTEVSX1BJQworCisKKyMgX0xUX0xJTktFUl9TSExJQlMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCittNF9kZWZ1bihbX0xUX0xJTktFUl9TSExJQlNdLAorW0FDX1JFUVVJUkUoW0xUX1BBVEhfTERdKWRubAorQUNfUkVRVUlSRShbTFRfUEFUSF9OTV0pZG5sCittNF9yZXF1aXJlKFtfTFRfRklMRVVUSUxTX0RFRkFVTFRTXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX0VHUkVQXSlkbmwKK200X3JlcXVpcmUoW19MVF9ERUNMX1NFRF0pZG5sCittNF9yZXF1aXJlKFtfTFRfQ01EX0dMT0JBTF9TWU1CT0xTXSlkbmwKK200X3JlcXVpcmUoW19MVF9UQUdfQ09NUElMRVJdKWRubAorQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorbTRfaWYoWyQxXSwgW0NYWF0sIFsKKyAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBhaXhbWzQtOV1dKikKKyAgICAjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB3ZSBkb24ndCB3YW50IHRoZSAiLUMiIG9wdGlvbi4KKyAgICAjIC1DIG1lYW5zIGRlbWFuZ2xlIHRvIEFJWCBubSwgYnV0IG1lYW5zIGRvbid0IGRlbWFuZ2xlIHdpdGggR05VIG5tCisgICAgaWYgJE5NIC1WIDI+JjEgfCAkR1JFUCAnR05VJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAtQnBnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBlbHNlCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CQ3BnICRsaWJvYmpzICRjb252ZW5pZW5jZSB8IGF3ayAnXCcneyBpZiAoKChcJCAyID09ICJUIikgfHwgKFwkIDIgPT0gIkQiKSB8fCAoXCQgMiA9PSAiQiIpKSAmJiAoW3N1YnN0cl0oXCQgMywxLDEpICE9ICIuIikpIHsgcHJpbnQgXCQgMyB9IH0nXCcnIHwgc29ydCAtdSA+ICRleHBvcnRfc3ltYm9scycKKyAgICBmaQorICAgIDs7CisgIHB3MzIqKQorICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSIkbHRkbGxfY21kcyIKKyAgOzsKKyAgY3lnd2luKiB8IG1pbmd3KiB8IGNlZ2NjKikKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEIC1lICdcJycvXltbQkNER1JTXV1bWyBdXS9zLy4qW1sgXV1cKFtbXiBdXSpcKS9cMSBEQVRBLzsvXi4qW1sgXV1fX25tX18vcy9eLipbWyBdXV9fbm1fX1woW1teIF1dKlwpW1sgXV1bW14gXV0qL1wxIERBVEEvOy9eSVtbIF1dL2Q7L15bW0FJVFddXVtbIF1dL3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCisgIDs7CisgICopCisgICAgX0xUX1RBR1ZBUihleHBvcnRfc3ltYm9sc19jbWRzLCAkMSk9JyROTSAkbGlib2JqcyAkY29udmVuaWVuY2UgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgJFNFRCAnXCcncy8uKiAvLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKyAgOzsKKyAgZXNhYworICBfTFRfVEFHVkFSKGV4Y2x1ZGVfZXhwc3ltcywgJDEpPVsnX0dMT0JBTF9PRkZTRVRfVEFCTEVffF9HTE9CQUxfX0ZbSURdXy4qJ10KK10sIFsKKyAgcnVucGF0aF92YXI9CisgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0KKyAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPQorICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihjb21waWxlcl9uZWVkc19vYmplY3QsICQxKT1ubworICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT1ubworICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NICRsaWJvYmpzICRjb252ZW5pZW5jZSB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCAkU0VEICdcJydzLy4qIC8vJ1wnJyB8IHNvcnQgfCB1bmlxID4gJGV4cG9ydF9zeW1ib2xzJworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2F1dG9tYXRpYywgJDEpPW5vCisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9CisgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT11bnN1cHBvcnRlZAorICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT1ubworICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCisgIF9MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihtb2R1bGVfZXhwc3ltX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzLCAkMSk9CisgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMsICQxKT0KKyAgX0xUX1RBR1ZBUih0aHJlYWRfc2FmZV9mbGFnX3NwZWMsICQxKT0KKyAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorICAjIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCisgICMgaW5jbHVkZWQgaW4gdGhlIHN5bWJvbCBsaXN0CisgIF9MVF9UQUdWQVIoaW5jbHVkZV9leHBzeW1zLCAkMSk9CisgICMgZXhjbHVkZV9leHBzeW1zIGNhbiBiZSBhbiBleHRlbmRlZCByZWdleHAgb2Ygc3ltYm9scyB0byBleGNsdWRlCisgICMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKKyAgIyBlbmQgb2YgbGluZS4gIEV4YW1wbGU6IGBhfGJjfC4qZC4qJyB3aWxsIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgYGEnIGFuZCBgYmMnLAorICAjIGFzIHdlbGwgYXMgYW55IHN5bWJvbCB0aGF0IGNvbnRhaW5zIGBkJy4KKyAgX0xUX1RBR1ZBUihleGNsdWRlX2V4cHN5bXMsICQxKT1bJ19HTE9CQUxfT0ZGU0VUX1RBQkxFX3xfR0xPQkFMX19GW0lEXV8uKiddCisgICMgQWx0aG91Z2ggX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGlzIGEgdmFsaWQgc3ltYm9sIEMgbmFtZSwgbW9zdCBhLm91dAorICAjIHBsYXRmb3JtcyAoYWIpdXNlIGl0IGluIFBJQyBjb2RlLCBidXQgdGhlaXIgbGlua2VycyBnZXQgY29uZnVzZWQgaWYKKyAgIyB0aGUgc3ltYm9sIGlzIGV4cGxpY2l0bHkgcmVmZXJlbmNlZC4gIFNpbmNlIHBvcnRhYmxlIGNvZGUgY2Fubm90CisgICMgcmVseSBvbiB0aGlzIHN5bWJvbCBuYW1lLCBpdCdzIHByb2JhYmx5IGZpbmUgdG8gbmV2ZXIgaW5jbHVkZSBpdCBpbgorICAjIHByZWxvYWRlZCBzeW1ib2wgdGFibGVzLgorICAjIEV4Y2x1ZGUgc2hhcmVkIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24vZmluYWxpemF0aW9uIHN5bWJvbHMuCitkbmwgTm90ZSBhbHNvIGFkanVzdCBleGNsdWRlX2V4cHN5bXMgZm9yIEMrKyBhYm92ZS4KKyAgZXh0cmFjdF9leHBzeW1zX2NtZHM9CisKKyAgY2FzZSAkaG9zdF9vcyBpbgorICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBjZWdjYyopCisgICAgIyBGSVhNRTogdGhlIE1TVkMrKyBwb3J0IGhhc24ndCBiZWVuIHRlc3RlZCBpbiBhIGxvb29vbmcgdGltZQorICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KKyAgICBpZiB0ZXN0ICIkR0NDIiAhPSB5ZXM7IHRoZW4KKyAgICAgIHdpdGhfZ251X2xkPW5vCisgICAgZmkKKyAgICA7OworICBpbnRlcml4KikKKyAgICAjIHdlIGp1c3QgaG9wZS9hc3N1bWUgdGhpcyBpcyBnY2MgYW5kIG5vdCBjODkgKD0gTVNWQysrKQorICAgIHdpdGhfZ251X2xkPXllcworICAgIDs7CisgIG9wZW5ic2QqKQorICAgIHdpdGhfZ251X2xkPW5vCisgICAgOzsKKyAgZXNhYworCisgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgIHdsYXJjPScke3dsfScKKworICAgICMgU2V0IHNvbWUgZGVmYXVsdHMgZm9yIEdOVSBsZCB3aXRoIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuIFRoZXNlCisgICAgIyBhcmUgcmVzZXQgbGF0ZXIgaWYgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm90IHN1cHBvcnRlZC4gUHV0dGluZyB0aGVtCisgICAgIyBoZXJlIGFsbG93cyB0aGVtIHRvIGJlIG92ZXJyaWRkZW4gaWYgbmVjZXNzYXJ5LgorICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisgICAgIyBhbmNpZW50IEdOVSBsZCBkaWRuJ3Qgc3VwcG9ydCAtLXdob2xlLWFyY2hpdmUgZXQuIGFsLgorICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSIkd2xhcmMiJy0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAnIiR3bGFyYyInLS1uby13aG9sZS1hcmNoaXZlJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICAgIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz1ubworICAgIGNhc2UgYCRMRCAtdiAyPiYxYCBpbgorICAgICAgKlwgW1swMV1dLiogfCAqXCAyLltbMC05XV0uKiB8ICpcIDIuMTAuKikgOzsgIyBjYXRjaCB2ZXJzaW9ucyA8IDIuMTEKKyAgICAgICpcIDIuMTEuOTMuMC4yXCAqKSBzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmc9eWVzIDs7ICMgUkg3LjMgLi4uCisgICAgICAqXCAyLjExLjkyLjAuMTJcICopIHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZz15ZXMgOzsgIyBNYW5kcmFrZSA4LjIgLi4uCisgICAgICAqXCAyLjExLiopIDs7ICMgb3RoZXIgMi4xMSB2ZXJzaW9ucworICAgICAgKikgc3VwcG9ydHNfYW5vbl92ZXJzaW9uaW5nPXllcyA7OworICAgIGVzYWMKKworICAgICMgU2VlIGlmIEdOVSBsZCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXhbWzMtOV1dKikKKyAgICAgICMgT24gQUlYL1BQQywgdGhlIEdOVSBsaW5rZXIgaXMgdmVyeSBicm9rZW4KKyAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgIT0gaWE2NDsgdGhlbgorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwljYXQgPDxfTFRfRU9GIDE+JjIKKworKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAorKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCisqKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKKyoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKKyoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCisKK19MVF9FT0YKKyAgICAgIGZpCisgICAgICA7OworCisgICAgYW1pZ2FvcyopCisgICAgICBjYXNlICRob3N0X2NwdSBpbgorICAgICAgcG93ZXJwYykKKyAgICAgICAgICAgICMgc2VlIGNvbW1lbnQgYWJvdXQgQW1pZ2FPUzQgLnNvIHN1cHBvcnQKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JycKKyAgICAgICAgOzsKKyAgICAgIG02OGspCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBOQU1FICRsaWJuYW1lIiA+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIFJFVklTSU9OICRyZXZpc2lvbiIgPj4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgJEFSX0ZMQUdTICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb3V0cHV0X29iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgICA7OworICAgICAgZXNhYworICAgICAgOzsKKworICAgIGJlb3MqKQorICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorCSMgSm9zZXBoIEJlY2tlbmJhY2ggPGpyYjNAYmVzdC5jb20+IHNheXMgc29tZSByZWxlYXNlcyBvZiBnY2MKKwkjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1ub3N0YXJ0ICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworCisgICAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICMgYXMgdGhlcmUgaXMgbm8gc2VhcmNoIHBhdGggZm9yIERMTHMuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8ICRTRUQgLWUgJ1wnJy9eW1tCQ0RHUlNdXVtbIF1dL3MvLipbWyBdXVwoW1teIF1dKlwpL1wxIERBVEEvJ1wnJyB8ICRTRUQgLWUgJ1wnJy9eW1tBSVRXXV1bWyBdXS9zLy4qW1sgXV0vLydcJycgfCBzb3J0IHwgdW5pcSA+ICRleHBvcnRfc3ltYm9scycKKworICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKwkjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisJIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgIGNwICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwllbHNlCisJICBlY2hvIEVYUE9SVFMgPiAkb3V0cHV0X29iamRpci8kc29uYW1lLmRlZjsKKwkgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJZml+CisJJENDIC1zaGFyZWQgJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWYgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJHt3bH0tLWVuYWJsZS1hdXRvLWltYWdlLWJhc2UgLVhsaW5rZXIgLS1vdXQtaW1wbGliIC1YbGlua2VyICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBpbnRlcml4W1szLTldXSopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorICAgICAgIyBJbnN0ZWFkLCBzaGFyZWQgbGlicmFyaWVzIGFyZSBsb2FkZWQgYXQgYW4gaW1hZ2UgYmFzZSAoMHgxMDAwMDAwMCBieQorICAgICAgIyBkZWZhdWx0KSBhbmQgcmVsb2NhdGVkIGlmIHRoZXkgY29uZmxpY3QsIHdoaWNoIGlzIGEgc2xvdyB2ZXJ5IG1lbW9yeQorICAgICAgIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorICAgICAgIyAyNTYgS2lCLWFsaWduZWQgaW1hZ2UgYmFzZSBiZXR3ZWVuIDB4NTAwMDAwMDAgYW5kIDB4NkZGQzAwMDAgYXQgbGluaworICAgICAgIyB0aW1lLiAgTW92aW5nIHVwIGZyb20gMHgxMDAwMDAwMCBhbHNvIGFsbG93cyBtb3JlIHNicmsoMikgc3BhY2UuCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3NlZCAicyxeLF8sIiAkZXhwb3J0X3N5bWJvbHMgPiRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltfiRDQyAtc2hhcmVkICRwaWNfZmxhZyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCwkc29uYW1lICR7d2x9LS1yZXRhaW4tc3ltYm9scy1maWxlLCRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZXhwc3ltICR7d2x9LS1pbWFnZS1iYXNlLGBleHByICR7UkFORE9NLSQkfSAlIDQwOTYgLyAyIFwqIDI2MjE0NCArIDEzNDIxNzcyODBgIC1vICRsaWInCisgICAgICA7OworCisgICAgZ251KiB8IGxpbnV4KiB8IHRwZiogfCBrKmJzZCotZ251KQorICAgICAgdG1wX2RpZXQ9bm8KKyAgICAgIGlmIHRlc3QgIiRob3N0X29zIiA9IGxpbnV4LWRpZXRsaWJjOyB0aGVuCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwkgIGRpZXRcICopIHRtcF9kaWV0PXllczs7CSMgbGludXgtZGlldGxpYmMgd2l0aCBzdGF0aWMgbGlua2luZyAoIWRpZXQtZHluKQorCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkRUdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbCBcCisJICYmIHRlc3QgIiR0bXBfZGlldCIgPSBubworICAgICAgdGhlbgorCXRtcF9hZGRmbGFnPQorCXRtcF9zaGFyZWRmbGFnPSctc2hhcmVkJworCWNhc2UgJGNjX2Jhc2VuYW1lLCRob3N0X2NwdSBpbgorICAgICAgICBwZ2NjKikJCQkJIyBQb3J0bGFuZCBHcm91cCBDIGNvbXBpbGVyCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnJworCSAgOzsKKwlwZ2Y3NyogfCBwZ2Y5MCogfCBwZ2Y5NSopCSMgUG9ydGxhbmQgR3JvdXAgZjc3IGFuZCBmOTAgY29tcGlsZXJzCisJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgIC1uIFwiJGNvbnZcIiAmJiBuZXdfY29udmVuaWVuY2U9XCIkbmV3X2NvbnZlbmllbmNlLCRjb252XCI7IGRvbmU7ICRFQ0hPIFwiJG5ld19jb252ZW5pZW5jZVwiYCAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIHRtcF9hZGRmbGFnPScgJHBpY19mbGFnIC1Nbm9tYWluJyA7OworCWVjYyosaWE2NCogfCBpY2MqLGlhNjQqKQkjIEludGVsIEMgY29tcGlsZXIgb24gaWE2NAorCSAgdG1wX2FkZGZsYWc9JyAtaV9keW5hbWljJyA7OworCWVmYyosaWE2NCogfCBpZm9ydCosaWE2NCopCSMgSW50ZWwgRm9ydHJhbiBjb21waWxlciBvbiBpYTY0CisJICB0bXBfYWRkZmxhZz0nIC1pX2R5bmFtaWMgLW5vZm9yX21haW4nIDs7CisJaWZjKiB8IGlmb3J0KikJCQkjIEludGVsIEZvcnRyYW4gY29tcGlsZXIKKwkgIHRtcF9hZGRmbGFnPScgLW5vZm9yX21haW4nIDs7CisJbGY5NSopCQkJCSMgTGFoZXkgRm9ydHJhbiA4LjEKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKwkgIHRtcF9zaGFyZWRmbGFnPSctLXNoYXJlZCcgOzsKKwl4bFtbY0NdXSopCQkJIyBJQk0gWEwgQyA4LjAgb24gUFBDIChkZWFsIHdpdGggeGxmIGJlbG93KQorCSAgdG1wX3NoYXJlZGZsYWc9Jy1xbWtzaHJvYmonCisJICB0bXBfYWRkZmxhZz0gOzsKKwllc2FjCisJY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisJKlN1blwgQyopCQkJIyBTdW4gQyA1LjkKKwkgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0nJHt3bH0tLXdob2xlLWFyY2hpdmVgbmV3X2NvbnZlbmllbmNlPTsgZm9yIGNvbnYgaW4gJGNvbnZlbmllbmNlXCJcIjsgZG8gdGVzdCAteiBcIiRjb252XCIgfHwgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisJICBfTFRfVEFHVkFSKGNvbXBpbGVyX25lZWRzX29iamVjdCwgJDEpPXllcworCSAgdG1wX3NoYXJlZGZsYWc9Jy1HJyA7OworCSpTdW5cIEYqKQkJCSMgU3VuIEZvcnRyYW4gOC4zCisJICB0bXBfc2hhcmVkZmxhZz0nLUcnIDs7CisJZXNhYworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAnIiR0bXBfc2hhcmVkZmxhZyIiJHRtcF9hZGRmbGFnIicgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisKKyAgICAgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICBjYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJICAgIGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAkQ0MgJyIkdG1wX3NoYXJlZGZsYWciIiR0bXBfYWRkZmxhZyInICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS12ZXJzaW9uLXNjcmlwdCAke3dsfSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlciAtbyAkbGliJworICAgICAgICBmaQorCisJY2FzZSAkY2NfYmFzZW5hbWUgaW4KKwl4bGYqKQorCSAgIyBJQk0gWEwgRm9ydHJhbiAxMC4xIG9uIFBQQyBjYW5ub3QgY3JlYXRlIHNoYXJlZCBsaWJzIGl0c2VsZgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSctLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgLS1uby13aG9sZS1hcmNoaXZlJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0nLXJwYXRoICRsaWJkaXInCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC1vICRsaWInCisJICBpZiB0ZXN0ICJ4JHN1cHBvcnRzX2Fub25fdmVyc2lvbmluZyIgPSB4eWVzOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCSAgICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgfCBzZWQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICBlY2hvICJsb2NhbDogKjsgfTsiID4+ICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnZlcn4KKwkgICAgICAkTEQgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIC12ZXJzaW9uLXNjcmlwdCAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgIGZpCisJICA7OworCWVzYWMKKyAgICAgIGVsc2UKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBuZXRic2QqKQorICAgICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fID4vZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncyAtbyAkbGliJworCXdsYXJjPQorICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBpZiAkTEQgLXYgMj4mMSB8ICRHUkVQICdCRkQgMlwuOCcgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJY2F0IDw8X0xUX0VPRiAxPiYyCisKKyoqKiBXYXJuaW5nOiBUaGUgcmVsZWFzZXMgMi44Liogb2YgdGhlIEdOVSBsaW5rZXIgY2Fubm90IHJlbGlhYmx5CisqKiogY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gU29sYXJpcyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjkuMSBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisgICAgICBlbGlmICRMRCAtLWhlbHAgMj4mMSB8ICRHUkVQICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqIHwgdW5peHdhcmUqIHwgT3BlblVOSVgqKQorICAgICAgY2FzZSBgJExEIC12IDI+JjFgIGluCisgICAgICAgICpcIFtbMDFdXS4qIHwgKlwgMi5bWzAtOV1dLiogfCAqXCAyLjFbWzAtNV1dLiopCisJX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWNhdCA8PF9MVF9FT0YgMT4mMgorCisqKiogV2FybmluZzogUmVsZWFzZXMgb2YgdGhlIEdOVSBsaW5rZXIgcHJpb3IgdG8gMi4xNi45MS4wLjMgY2FuIG5vdAorKioqIHJlbGlhYmx5IGNyZWF0ZSBzaGFyZWQgbGlicmFyaWVzIG9uIFNDTyBzeXN0ZW1zLiAgVGhlcmVmb3JlLCBsaWJ0b29sCisqKiogaXMgZGlzYWJsaW5nIHNoYXJlZCBsaWJyYXJpZXMgc3VwcG9ydC4gIFdlIHVyZ2UgeW91IHRvIHVwZ3JhZGUgR05VCisqKiogYmludXRpbHMgdG8gcmVsZWFzZSAyLjE2LjkxLjAuMyBvciBuZXdlci4gIEFub3RoZXIgb3B0aW9uIGlzIHRvIG1vZGlmeQorKioqIHlvdXIgUEFUSCBvciBjb21waWxlciBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhlIG5hdGl2ZSBsaW5rZXIgaXMKKyoqKiB1c2VkLCBhbmQgdGhlbiByZXN0YXJ0LgorCitfTFRfRU9GCisJOzsKKwkqKQorCSAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IGFsd2F5cworCSAgIyB1c2UgYWJzb2x1dGUgcGF0aHMgZm9yIG5hbWluZyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgZXhjbHVkZSB0aGUKKwkgICMgRFRfUlVOUEFUSCB0YWcgZnJvbSBleGVjdXRhYmxlcyBhbmQgbGlicmFyaWVzLiAgQnV0IGRvaW5nIHNvCisJICAjIHJlcXVpcmVzIHRoYXQgeW91IGNvbXBpbGUgZXZlcnl0aGluZyB0d2ljZSwgd2hpY2ggaXMgYSBwYWluLgorCSAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCSAgZWxzZQorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICBmaQorCTs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgc3Vub3M0KikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICB3bGFyYz0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICopCisgICAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCAkR1JFUCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vOyB0aGVuCisgICAgICBydW5wYXRoX3Zhcj0KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPQorICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0KKyAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICBmaQorICBlbHNlCisgICAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBhaXgzKikKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT11bnN1cHBvcnRlZAorICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckTEQgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC1iRTokZXhwb3J0X3N5bWJvbHMgLVQ1MTIgLUg1MTIgLWJNOlNSRX4kQVIgJEFSX0ZMQUdTICRsaWIgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKyAgICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzICYmIHRlc3QgLXogIiRsdF9wcm9nX2NvbXBpbGVyX3N0YXRpYyI7IHRoZW4KKwkjIE5laXRoZXIgZGlyZWN0IGhhcmRjb2Rpbmcgbm9yIHN0YXRpYyBsaW5raW5nIGlzIHN1cHBvcnRlZCB3aXRoIGEKKwkjIGJyb2tlbiBjb2xsZWN0Mi4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisgICAgICBmaQorICAgICAgOzsKKworICAgIGFpeFtbNC05XV0qKQorICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisJIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCWV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisJbm9fZW50cnlfZmxhZz0iIgorICAgICAgZWxzZQorCSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHdlIGRvbid0IHdhbnQgdGhlICItQyIgb3B0aW9uLgorCSMgLUMgbWVhbnMgZGVtYW5nbGUgdG8gQUlYIG5tLCBidXQgbWVhbnMgZG9uJ3QgZGVtYW5nbGUgd2l0aCBHTlUgbm0KKwlpZiAkTk0gLVYgMj4mMSB8ICRHUkVQICdHTlUnID4gL2Rldi9udWxsOyB0aGVuCisJICBfTFRfVEFHVkFSKGV4cG9ydF9zeW1ib2xzX2NtZHMsICQxKT0nJE5NIC1CcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWVsc2UKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X3N5bWJvbHNfY21kcywgJDEpPSckTk0gLUJDcGcgJGxpYm9ianMgJGNvbnZlbmllbmNlIHwgYXdrICdcJyd7IGlmICgoKFwkIDIgPT0gIlQiKSB8fCAoXCQgMiA9PSAiRCIpIHx8IChcJCAyID09ICJCIikpICYmIChbc3Vic3RyXShcJCAzLDEsMSkgIT0gIi4iKSkgeyBwcmludCBcJCAzIH0gfSdcJycgfCBzb3J0IC11ID4gJGV4cG9ydF9zeW1ib2xzJworCWZpCisJYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisJIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisJIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisJIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICBmb3IgbGRfZmxhZyBpbiAkTERGTEFHUzsgZG8KKwkgIGlmICh0ZXN0ICRsZF9mbGFnID0gIi1icnRsIiB8fCB0ZXN0ICRsZF9mbGFnID0gIi1XbCwtYnJ0bCIpOyB0aGVuCisJICAgIGFpeF91c2VfcnVudGltZWxpbmtpbmc9eWVzCisJICAgIGJyZWFrCisJICBmaQorCSAgZG9uZQorCSAgOzsKKwllc2FjCisKKwlleHBfc3ltX2ZsYWc9Jy1iZXhwb3J0JworCW5vX2VudHJ5X2ZsYWc9Jy1ibm9lbnRyeScKKyAgICAgIGZpCisKKyAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICMgaGF2ZSBwcm9ibGVtcyBjcmVhdGluZyB0aGUgdGFibGUgb2YgY29udGVudHMuICBJZiBsaW5raW5nIGEgbGlicmFyeQorICAgICAgIyBvciBwcm9ncmFtIHJlc3VsdHMgaW4gImVycm9yIFRPQyBvdmVyZmxvdyIgYWRkIC1tbWluaW1hbC10b2MgdG8KKyAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAjIGVub3VnaCB0byBmaXggdGhlIHByb2JsZW0sIGFkZCAtV2wsLWJiaWd0b2MgdG8gTERGTEFHUy4KKworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihmaWxlX2xpc3Rfc3BlYywgJDEpPScke3dsfS1mLCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwljYXNlICRob3N0X29zIGluIGFpeDQuW1swMTJdXXxhaXg0LltbMDEyXV0uKikKKwkjIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uIEFJWCA0LjIgYW5kIGxvd2VyLCB0aGUgY2hlY2sKKwkjIGJlbG93IGZvciBicm9rZW4gY29sbGVjdDIgZG9lc24ndCB3b3JrIHVuZGVyIDQuMysKKwkgIGNvbGxlY3QybmFtZT1gJHtDQ30gLXByaW50LXByb2ctbmFtZT1jb2xsZWN0MmAKKwkgIGlmIHRlc3QgLWYgIiRjb2xsZWN0Mm5hbWUiICYmCisJICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICMgV2UgaGF2ZSByZXdvcmtlZCBjb2xsZWN0MgorCSAgOgorCSAgZWxzZQorCSAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT11bnN1cHBvcnRlZAorCSAgIyBJdCBmYWlscyB0byBmaW5kIHVuaW5zdGFsbGVkIGxpYnJhcmllcyB3aGVuIHRoZSB1bmluc3RhbGxlZAorCSAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgdG8gdW5zdXBwb3J0ZWQgZm9yY2VzIHJlbGlua2luZworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CisJICBmaQorCSAgOzsKKwllc2FjCisJc2hhcmVkX2ZsYWc9Jy1zaGFyZWQnCisJaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICBzaGFyZWRfZmxhZz0iJHNoYXJlZF9mbGFnICInJHt3bH0tRycKKwlmaQorICAgICAgZWxzZQorCSMgbm90IHVzaW5nIGdjYworCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJIyBWaXN1YWxBZ2UgQysrLCBWZXJzaW9uIDUuNSBmb3IgQUlYIDVMIGZvciBJQS02NCwgQmV0YSAzIFJlbGVhc2UKKwkjIGNob2tlcyBvbiAtV2wsLUcuIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0OgorCSAgc2hhcmVkX2ZsYWc9Jy1HJworCWVsc2UKKwkgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICBzaGFyZWRfZmxhZz0nJHt3bH0tRycKKwkgIGVsc2UKKwkgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgIGZpCisJZmkKKyAgICAgIGZpCisKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCisgICAgICAjIEl0IHNlZW1zIHRoYXQgLWJleHBhbGwgZG9lcyBub3QgZXhwb3J0IHN5bWJvbHMgYmVnaW5uaW5nIHdpdGgKKyAgICAgICMgdW5kZXJzY29yZSAoXyksIHNvIGl0IGlzIGJldHRlciB0byBnZW5lcmF0ZSBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleHBvcnQuCisgICAgICBfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPXllcworICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisJIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKyAgICAgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuICRFQ0hPICJYJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgfCAkWHNlZDsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgZWxzZQorCWlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkbGliZGlyOi91c3IvbGliOi9saWInCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJyJcJHt3bH0kbm9fZW50cnlfZmxhZyInICRjb21waWxlcl9mbGFncyAke3dsfSR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICciXCR7d2x9JGV4cF9zeW1fZmxhZzpcJGV4cG9ydF9zeW1ib2xzIgorCWVsc2UKKwkgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgbGlicGF0aCBmcm9tIHRoZSB2YWx1ZSBlbmNvZGVkIGluIGFuCisJICMgZW1wdHkgZXhlY3V0YWJsZS4KKwkgX0xUX1NZU19NT0RVTEVfUEFUSF9BSVgKKwkgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJsaWJwYXRoOiRsaWJkaXI6JyIkYWl4X2xpYnBhdGgiCisJICAjIFdhcm5pbmcgLSB3aXRob3V0IHVzaW5nIHRoZSBvdGhlciBydW4gdGltZSBsb2FkaW5nIGZsYWdzLAorCSAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVybm90b2snCisJICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJvaycKKwkgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPSckY29udmVuaWVuY2UnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisJICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQgbGlicmFyaWVzLgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAke3dsfS1ibm9lbnRyeSAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tYkU6JGV4cG9ydF9zeW1ib2xzJHthbGxvd191bmRlZmluZWRfZmxhZ31+JEFSICRBUl9GTEFHUyAkb3V0cHV0X29iamRpci8kbGlibmFtZSRyZWxlYXNlLmEgJG91dHB1dF9vYmpkaXIvJHNvbmFtZScKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBhbWlnYW9zKikKKyAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisgICAgICBwb3dlcnBjKQorICAgICAgICAgICAgIyBzZWUgY29tbWVudCBhYm91dCBBbWlnYU9TNCAuc28gc3VwcG9ydAorICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJworICAgICAgICA7OworICAgICAgbTY4aykKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRFQ0hPICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG91dHB1dF9vYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kRUNITyAiI2RlZmluZSBMSUJSQVJZX0lEIDEiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvdXRwdXRfb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEVDSE8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb3V0cHV0X29iamRpci9hMml4bGlicmFyeS5kYXRhfiRBUiAkQVJfRkxBR1MgJGxpYiAkbGlib2Jqc34kUkFOTElCICRsaWJ+KGNkICRvdXRwdXRfb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICA7OworCisgICAgYnNkaVtbNDVdXSopCisgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPS1yZHluYW1pYworICAgICAgOzsKKworICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCisgICAgICAjIE1pY3Jvc29mdCBWaXN1YWwgQysrLgorICAgICAgIyBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGlzIGFjdHVhbGx5IG1lYW5pbmdsZXNzLCBhcyB0aGVyZSBpcworICAgICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScgJworICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICAjIFRlbGwgbHRtYWluIHRvIG1ha2UgLmxpYiBmaWxlcywgbm90IC5hIGZpbGVzLgorICAgICAgbGliZXh0PWxpYgorICAgICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5kbGwgZmlsZXMsIG5vdCAuc28gZmlsZXMuCisgICAgICBzaHJleHRfY21kcz0iLmRsbCIKKyAgICAgICMgRklYTUU6IFNldHRpbmcgbGlua25hbWVzIGhlcmUgaXMgYSBiYWQgaGFjay4KKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkbGliICRsaWJvYmpzICRjb21waWxlcl9mbGFncyBgJEVDSE8gIlgkZGVwbGlicyIgfCAkWHNlZCAtZSAnXCcncy8gLWxjJC8vJ1wnJ2AgLWxpbmsgLWRsbH5saW5rbmFtZXM9JworICAgICAgIyBUaGUgbGlua2VyIHdpbGwgYXV0b21hdGljYWxseSBidWlsZCBhIC5saWIgZmlsZSBpZiB3ZSBidWlsZCBhIERMTC4KKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSd0cnVlJworICAgICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSdsaWIgLU9VVDokb2xkbGliJG9sZG9ianMkb2xkX2RlcGxpYnMnCisgICAgICBfTFRfVEFHVkFSKGZpeF9zcmNmaWxlX3BhdGgsICQxKT0nYGN5Z3BhdGggLXcgIiRzcmNmaWxlImAnCisgICAgICBfTFRfVEFHVkFSKGVuYWJsZV9zaGFyZWRfd2l0aF9zdGF0aWNfcnVudGltZXMsICQxKT15ZXMKKyAgICAgIDs7CisKKyAgICBkYXJ3aW4qIHwgcmhhcHNvZHkqKQorICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisgICAgICA7OworCisgICAgZGd1eCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBmcmVlYnNkMSopCisgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICA7OworCisgICAgIyBGcmVlQlNEIDIuMi5bMDEyXSBhbGxvd3MgdXMgdG8gaW5jbHVkZSBjKytydDAubyB0byBnZXQgQysrIGNvbnN0cnVjdG9yCisgICAgIyBzdXBwb3J0LiAgRnV0dXJlIHZlcnNpb25zIGRvIHRoaXMgYXV0b21hdGljYWxseSwgYnV0IGFuIGV4cGxpY2l0IGMrK3J0MC5vCisgICAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICAgIyBleHRyYSBzcGFjZSkuCisgICAgZnJlZWJzZDIuMiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzIC91c3IvbGliL2MrK3J0MC5vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgICBmcmVlYnNkMiopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAjIEZyZWVCU0QgMyBhbmQgZ3JlYXRlciB1c2VzIGdjYyAtc2hhcmVkIHRvIGRvIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZnJlZWJzZCogfCBkcmFnb25mbHkqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgaHB1eDkqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtZlBJQyAke3dsfStiICR7d2x9JGluc3RhbGxfbGliZGlyIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZWxzZQorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRSTSAkb3V0cHV0X29iamRpci8kc29uYW1lfiRMRCAtYiArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzfnRlc3QgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisKKyAgICAgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tRScKKyAgICAgIDs7CisKKyAgICBocHV4MTAqKQorICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgLWEgIiR3aXRoX2dudV9sZCIgPSBubzsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1iICtoICRzb25hbWUgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkLCAkMSk9JytiICRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCSMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJIyBidXQgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisJX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIGhwdXgxMSopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyAtYSAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9K2ggJHt3bH0kc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwlpYTY0KikKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1mUElDICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIDs7CisJZXNhYworICAgICAgZWxzZQorCWNhc2UgJGhvc3RfY3B1IGluCisJaHBwYSo2NCopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWlhNjQqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K25vZGVmYXVsdHJwYXRoIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKwkqKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1iICR7d2x9K2ggJHt3bH0kc29uYW1lICR7d2x9K2IgJHt3bH0kaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0rYiAke3dsfSRsaWJkaXInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJY2FzZSAkaG9zdF9jcHUgaW4KKwlocHBhKjY0KnxpYTY0KikKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisKKwkgICMgaGFyZGNvZGVfbWludXNfTDogTm90IHJlYWxseSBpbiB0aGUgc2VhcmNoIFBBVEgsCisJICAjIGJ1dCBhcyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbGlicmFyeS4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgOzsKKwllc2FjCisgICAgICBmaQorICAgICAgOzsKKworICAgIGlyaXg1KiB8IGlyaXg2KiB8IG5vbnN0b3B1eCopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkjIFRyeSB0byB1c2UgdGhlIC1leHBvcnRlZF9zeW1ib2wgbGQgb3B0aW9uLCBpZiBpdCBkb2VzIG5vdAorCSMgd29yaywgYXNzdW1lIHRoYXQgLWV4cG9ydHNfZmlsZSBkb2VzIG5vdCB3b3JrIGVpdGhlciBhbmQKKwkjIGltcGxpY2l0bHkgZXhwb3J0IGFsbCBzeW1ib2xzLgorICAgICAgICBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAtc2hhcmVkICR7d2x9LWV4cG9ydGVkX3N5bWJvbCAke3dsfWZvbyAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0vZGV2L251bGwiCisgICAgICAgIEFDX0xJTktfSUZFTFNFKGludCBmb28odm9pZCkge30sCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgJHt3bH0tZXhwb3J0c19maWxlICR7d2x9JGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisgICAgICAgICkKKyAgICAgICAgTERGTEFHUz0iJHNhdmVfTERGTEFHUyIKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLWV4cG9ydHNfZmlsZSAkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9J25vJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKyAgICAgIF9MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisgICAgICA7OworCisgICAgbmV0YnNkKikKKyAgICAgIGlmIGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgJEdSRVAgX19FTEZfXyA+L2Rldi9udWxsOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycgICMgYS5vdXQKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnICAgICAgIyBFTEYKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICA7OworCisgICAgbmV3c29zNikKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqbnRvKiB8ICpxbngqKQorICAgICAgOzsKKworICAgIG9wZW5ic2QqKQorICAgICAgaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwlpZiB0ZXN0IC16ICJgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCAkR1JFUCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworCWVsc2UKKwkgIGNhc2UgJGhvc3Rfb3MgaW4KKwkgICBvcGVuYnNkW1swMV1dLiogfCBvcGVuYnNkMi5bWzAtN11dIHwgb3BlbmJzZDIuW1swLTddXS4qKQorCSAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICAgICA7OworCSAgICopCisJICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGgsJGxpYmRpcicKKwkgICAgIDs7CisJICBlc2FjCisJZmkKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICBmaQorICAgICAgOzsKKworICAgIG9zMiopCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9eWVzCisgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9dW5zdXBwb3J0ZWQKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRFQ0hPICJMSUJSQVJZICRsaWJuYW1lIElOSVRJTlNUQU5DRSIgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JEVDSE8gIkRFU0NSSVBUSU9OIFwiJGxpYm5hbWVcIiIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIERBVEEgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPICIgU0lOR0xFIE5PTlNIQVJFRCIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfiRFQ0hPIEVYUE9SVFMgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWZ+JENDIC1aZGxsIC1aY3J0ZGxsIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcywgJDEpPSdlbXhpbXAgLW8gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuYSAkb3V0cHV0X29iamRpci8kbGlibmFtZS5kZWYnCisgICAgICA7OworCisgICAgb3NmMyopCisgICAgICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCV9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nICR7d2x9LWV4cGVjdF91bnJlc29sdmVkICR7d2x9XConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgOzsKKworICAgIG9zZjQqIHwgb3NmNSopCSMgYXMgb3NmMyogd2l0aCB0aGUgYWRkaXRpb24gb2YgLW1zeW0gZmxhZworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJHthbGxvd191bmRlZmluZWRfZmxhZ30gJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LW1zeW0gJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2ZvciBpIGluIGBjYXQgJGV4cG9ydF9zeW1ib2xzYDsgZG8gcHJpbnRmICIlcyAlc1xcbiIgLWV4cG9ydGVkX3N5bWJvbCAiXCRpIiA+PiAkbGliLmV4cDsgZG9uZTsgcHJpbnRmICIlc1xcbiIgIi1oaWRkZW4iPj4gJGxpYi5leHB+CisJJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1pbnB1dCAke3dsfSRsaWIuZXhwICRjb21waWxlcl9mbGFncyAkbGlib2JqcyAkZGVwbGlicyAtc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYLXNldF92ZXJzaW9uICR2ZXJzdHJpbmciIHwgJFhzZWRgIC11cGRhdGVfcmVnaXN0cnkgJHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYn4kUk0gJGxpYi5leHAnCisKKwkjIEJvdGggYyBhbmQgY3h4IGNvbXBpbGVyIHN1cHBvcnQgLXJwYXRoIGRpcmVjdGx5CisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1ycGF0aCAkbGliZGlyJworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT0nbm8nCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT06CisgICAgICA7OworCisgICAgc29sYXJpcyopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAteiBkZWZzJworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwl3bGFyYz0nJHt3bH0nCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0teiAke3dsfXRleHQgJHt3bH0taCAke3dsfSRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICRDQyAtc2hhcmVkICR7d2x9LXogJHt3bH10ZXh0ICR7d2x9LU0gJHt3bH0kbGliLmV4cCAke3dsfS1oICR7d2x9JHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFnc34kUk0gJGxpYi5leHAnCisgICAgICBlbHNlCisJY2FzZSBgJENDIC1WIDI+JjFgIGluCisJKiJDb21waWxlcnMgNS4wIiopCisJICB3bGFyYz0nJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZWNobyAieyBnbG9iYWw6IiA+ICRsaWIuZXhwfmNhdCAkZXhwb3J0X3N5bWJvbHMgfCAkU0VEIC1lICJzL1woLipcKS9cMTsvIiA+PiAkbGliLmV4cH5lY2hvICJsb2NhbDogKjsgfTsiID4+ICRsaWIuZXhwfgorCSAgJExEIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLU0gJGxpYi5leHAgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCSAgOzsKKwkqKQorCSAgd2xhcmM9JyR7d2x9JworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtTSAkbGliLmV4cCAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKwkgIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKyAgICAgICopCisJIyBUaGUgY29tcGlsZXIgZHJpdmVyIHdpbGwgY29tYmluZSBhbmQgcmVvcmRlciBsaW5rZXIgb3B0aW9ucywKKwkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLiAgR0NDIGRpc2NhcmRzIGl0IHdpdGhvdXQgYCR3bCcsCisJIyBidXQgaXMgY2FyZWZ1bCBlbm91Z2ggbm90IHRvIHJlb3JkZXIuCisJIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS16ICR7d2x9YWxsZXh0cmFjdCRjb252ZW5pZW5jZSAke3dsfS16ICR7d2x9ZGVmYXVsdGV4dHJhY3QnCisJZWxzZQorCSAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgOzsKKworICAgIHN1bm9zNCopCisgICAgICBpZiB0ZXN0ICJ4JGhvc3RfdmVuZG9yIiA9IHhzZXF1ZW50OyB0aGVuCisJIyBVc2UgJENDIHRvIGxpbmsgdW5kZXIgc2VxdWVudCwgYmVjYXVzZSBpdCB0aHJvd3MgaW4gc29tZSBleHRyYSAubworCSMgZmlsZXMgdGhhdCBtYWtlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucyB3b3JrLgorCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1hc3NlcnQgcHVyZS10ZXh0IC1Cc3RhdGljIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKyAgICAgIGZpCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICBzeXN2NCkKKyAgICAgIGNhc2UgJGhvc3RfdmVuZG9yIGluCisJc25pKQorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMgIyBpcyB0aGlzIHJlYWxseSB0cnVlPz8/CisJOzsKKwlzaWVtZW5zKQorCSAgIyMgTEQgaXMgbGQgaXQgbWFrZXMgYSBQTEFNTElCCisJICAjIyBDQyBqdXN0IG1ha2VzIGEgR3Jvc3NNb2R1bGUuCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihyZWxvYWRfY21kcywgJDEpPSckQ0MgLXIgLW8gJG91dHB1dCRyZWxvYWRfb2JqcycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgICAgOzsKKwltb3Rvcm9sYSkKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtlcl9mbGFncycKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8gI01vdG9yb2xhIG1hbnVhbCBzYXlzIHllcywgYnV0IG15IHRlc3RzIHNheSB0aGV5IGxpZQorCTs7CisgICAgICBlc2FjCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgOzsKKworICAgIHN5c3Y0LjMqKQorICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1HIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua2VyX2ZsYWdzJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9Jy1CZXhwb3J0JworICAgICAgOzsKKworICAgIHN5c3Y0Kk1QKikKKyAgICAgIGlmIHRlc3QgLWQgL3Vzci9uZWM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlydW5wYXRoX3Zhcj1MRF9SVU5fUEFUSAorCWhhcmRjb2RlX3J1bnBhdGhfdmFyPXllcworCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgICBmaQorICAgICAgOzsKKworICAgIHN5c3Y0KnV3MiogfCBzeXN2NU9wZW5VTklYKiB8IHN5c3Y1VW5peFdhcmU3LltbMDFdXS5bWzEwXV0qIHwgdW5peHdhcmU3KiB8IHNjbzMuMnY1LjAuW1swMjRdXSopCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIHJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworICAgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGVsc2UKKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLUcgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBzeXN2NSogfCBzY28zLjJ2NSogfCBzY281djYqKQorICAgICAgIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKyAgICAgICMgbGluayB3aXRoIC1sYywgYW5kIHRoYXQgd291bGQgY2F1c2UgYW55IHN5bWJvbHMgdXNlZCBmcm9tIGxpYmMgdG8KKyAgICAgICMgYWx3YXlzIGJlIHVucmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGp1c3QgYWJvdXQgbm8gbGlicmFyeSB3b3VsZAorICAgICAgIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorICAgICAgIyB0aG91Z2gsIHdoaWNoIGRvZXMgY2F0Y2ggc29tZSBiYWQgc3ltYm9scyBidXQgaXNuJ3QgYXMgaGVhdnktaGFuZGVkCisgICAgICAjIGFzIC16IGRlZnMuCisgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKyAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teixub2RlZnMnCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKyAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKyAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUJleHBvcnQnCisgICAgICBydW5wYXRoX3Zhcj0nTERfUlVOX1BBVEgnCisKKyAgICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisgICAgICBlbHNlCisJX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKyAgICAgIGZpCisgICAgICA7OworCisgICAgdXRzNCopCisgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rZXJfZmxhZ3MnCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKyAgICAgIDs7CisKKyAgICAqKQorICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IHgkaG9zdF92ZW5kb3IgPSB4c25pOyB0aGVuCisgICAgICBjYXNlICRob3N0IGluCisgICAgICBzeXN2NCB8IHN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCisJX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tQmxhcmdlZHluc3ltJworCTs7CisgICAgICBlc2FjCisgICAgZmkKKyAgZmkKK10pCitBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKV0pCit0ZXN0ICIkX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKSIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCisKK19MVF9UQUdWQVIod2l0aF9nbnVfbGQsICQxKT0kd2l0aF9nbnVfbGQKKworX0xUX0RFQ0woW10sIFtsaWJleHRdLCBbMF0sIFtPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIildKWRubAorX0xUX0RFQ0woW10sIFtzaHJleHRfY21kc10sIFsxXSwgW1NoYXJlZCBsaWJyYXJ5IHN1ZmZpeCAobm9ybWFsbHkgIi5zbyIpXSlkbmwKK19MVF9ERUNMKFtdLCBbZXh0cmFjdF9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW1RoZSBjb21tYW5kcyB0byBleHRyYWN0IHRoZSBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIGEgc2hhcmVkIGFyY2hpdmVdKQorCisjCisjIERvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBsaW5rIGxpYmM/CisjCitjYXNlICJ4JF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKSIgaW4KK3h8eHllcykKKyAgIyBBc3N1bWUgLWxjIHNob3VsZCBiZSBhZGRlZAorICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisKKyAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgY2FzZSAkX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKSBpbgorICAgIConficqKQorICAgICAgIyBGSVhNRTogd2UgbWF5IGhhdmUgdG8gZGVhbCB3aXRoIG11bHRpLWNvbW1hbmQgc2VxdWVuY2VzLgorICAgICAgOzsKKyAgICAnJENDICcqKQorICAgICAgIyBUZXN0IHdoZXRoZXIgdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgbGlua3Mgd2l0aCAtbGMgc2luY2Ugb24gc29tZQorICAgICAgIyBzeXN0ZW1zLCAtbGdjYyBoYXMgdG8gY29tZSBiZWZvcmUgLWxjLiBJZiBnY2MgYWxyZWFkeSBwYXNzZXMgLWxjCisgICAgICAjIHRvIGxkLCBkb24ndCBhZGQgLWxjIGJlZm9yZSAtbGdjYy4KKyAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciAtbGMgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbGlua2VkIGluXSkKKyAgICAgICRSTSBjb25mdGVzdCoKKyAgICAgIGVjaG8gIiRsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGUiID4gY29uZnRlc3QuJGFjX2V4dAorCisgICAgICBpZiBBQ19UUllfRVZBTChhY19jb21waWxlKSAyPmNvbmZ0ZXN0LmVycjsgdGhlbgorICAgICAgICBzb25hbWU9Y29uZnRlc3QKKyAgICAgICAgbGliPWNvbmZ0ZXN0CisgICAgICAgIGxpYm9ianM9Y29uZnRlc3QuJGFjX29iamV4dAorICAgICAgICBkZXBsaWJzPQorICAgICAgICB3bD0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3dsLCAkMSkKKwlwaWNfZmxhZz0kX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX3BpYywgJDEpCisgICAgICAgIGNvbXBpbGVyX2ZsYWdzPS12CisgICAgICAgIGxpbmtlcl9mbGFncz0tdgorICAgICAgICB2ZXJzdHJpbmc9CisgICAgICAgIG91dHB1dF9vYmpkaXI9LgorICAgICAgICBsaWJuYW1lPWNvbmZ0ZXN0CisgICAgICAgIGx0X3NhdmVfYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKQorICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CisgICAgICAgIGlmIEFDX1RSWV9FVkFMKF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSkgMlw+XCYxIFx8ICRHUkVQIFwiIC1sYyBcIiBcPi9kZXYvbnVsbCAyXD5cJjEpCisgICAgICAgIHRoZW4KKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworICAgICAgICBlbHNlCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9eWVzCisgICAgICAgIGZpCisgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0kbHRfc2F2ZV9hbGxvd191bmRlZmluZWRfZmxhZworICAgICAgZWxzZQorICAgICAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICAgIGZpCisgICAgICAkUk0gY29uZnRlc3QqCisgICAgICBBQ19NU0dfUkVTVUxUKFskX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpXSkKKyAgICAgIDs7CisgICAgZXNhYworICBmaQorICA7OworZXNhYworCitfTFRfVEFHREVDTChbYnVpbGRfbGlidG9vbF9uZWVkX2xjXSwgW2FyY2hpdmVfY21kc19uZWVkX2xjXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBhZGQgLWxjIGZvciBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzXSkKK19MVF9UQUdERUNMKFthbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXNdLAorICAgIFtlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzXSwgWzBdLAorICAgIFtXaGV0aGVyIG9yIG5vdCB0byBkaXNhbGxvdyBzaGFyZWQgbGlicyB3aGVuIHJ1bnRpbWUgbGlicyBhcmUgc3RhdGljXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXSwgWzFdLAorICAgIFtDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zXSkKK19MVF9UQUdERUNMKFtdLCBbd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNdLCBbMV0sCisgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlc10pCitfTFRfVEFHREVDTChbXSwgW2NvbXBpbGVyX25lZWRzX29iamVjdF0sIFsxXSwKKyAgICBbV2hldGhlciB0aGUgY29tcGlsZXIgY29wZXMgd2l0aCBwYXNzaW5nIG5vIG9iamVjdHMgZGlyZWN0bHldKQorX0xUX1RBR0RFQ0woW10sIFtvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzXSwgWzJdLAorICAgIFtDcmVhdGUgYW4gb2xkLXN0eWxlIGFyY2hpdmUgZnJvbSBhIHNoYXJlZCBhcmNoaXZlXSkKK19MVF9UQUdERUNMKFtdLCBbb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHNdLCBbMl0sCisgICAgW0NyZWF0ZSBhIHRlbXBvcmFyeSBvbGQtc3R5bGUgYXJjaGl2ZSB0byBsaW5rIGluc3RlYWQgb2YgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfY21kc10sIFsyXSwgW0NvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYSBzaGFyZWQgYXJjaGl2ZV0pCitfTFRfVEFHREVDTChbXSwgW2FyY2hpdmVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW21vZHVsZV9jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGEgbG9hZGFibGUgbW9kdWxlIGlmIGRpZmZlcmVudCBmcm9tIGJ1aWxkaW5nCisgICAgYSBzaGFyZWQgYXJjaGl2ZS5dKQorX0xUX1RBR0RFQ0woW10sIFttb2R1bGVfZXhwc3ltX2NtZHNdLCBbMl0pCitfTFRfVEFHREVDTChbXSwgW3dpdGhfZ251X2xkXSwgWzFdLAorICAgIFtXaGV0aGVyIHdlIGFyZSBidWlsZGluZyB3aXRoIEdOVSBsZCBvciBub3RdKQorX0xUX1RBR0RFQ0woW10sIFthbGxvd191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHRdKQorX0xUX1RBR0RFQ0woW10sIFtub191bmRlZmluZWRfZmxhZ10sIFsxXSwKKyAgICBbRmxhZyB0aGF0IGVuZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzXSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY10sIFsxXSwKKyAgICBbRmxhZyB0byBoYXJkY29kZSAkbGliZGlyIGludG8gYSBiaW5hcnkgZHVyaW5nIGxpbmtpbmcuCisgICAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XSkKK19MVF9UQUdERUNMKFtdLCBbaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZF0sIFsxXSwKKyAgICBbW0lmIGxkIGlzIHVzZWQgd2hlbiBsaW5raW5nLCBmbGFnIHRvIGhhcmRjb2RlICRsaWJkaXIgaW50byBhIGJpbmFyeQorICAgIGR1cmluZyBsaW5raW5nLiAgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiAkbGliZGlyIGRvZXMgbm90IGV4aXN0XV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3JdLCBbMV0sCisgICAgW1doZXRoZXIgd2UgbmVlZCBhIHNpbmdsZSAiLXJwYXRoIiBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnRdKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9kaXJlY3RdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisgICAgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnldKQorX0xUX1RBR0RFQ0woW10sIFtoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGVdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyBESVIvbGliTkFNRSR7c2hhcmVkX2V4dH0gZHVyaW5nIGxpbmtpbmcgaGFyZGNvZGVzCisgICAgRElSIGludG8gdGhlIHJlc3VsdGluZyBiaW5hcnkgYW5kIHRoZSByZXN1bHRpbmcgbGlicmFyeSBkZXBlbmRlbmN5IGlzCisgICAgImFic29sdXRlIiwgaS5lIGltcG9zc2libGUgdG8gY2hhbmdlIGJ5IHNldHRpbmcgJHtzaGxpYnBhdGhfdmFyfSBpZiB0aGUKKyAgICBsaWJyYXJ5IGlzIHJlbG9jYXRlZF0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX21pbnVzX0xdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisgICAgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX3NobGlicGF0aF92YXJdLCBbMF0sCisgICAgW1NldCB0byAieWVzIiBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSCisgICAgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeV0pCitfTFRfVEFHREVDTChbXSwgW2hhcmRjb2RlX2F1dG9tYXRpY10sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIGJ1aWxkaW5nIGEgc2hhcmVkIGxpYnJhcnkgYXV0b21hdGljYWxseSBoYXJkY29kZXMgRElSCisgICAgaW50byB0aGUgbGlicmFyeSBhbmQgYWxsIHN1YnNlcXVlbnQgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyBsaW5rZWQKKyAgICBhZ2FpbnN0IGl0XSkKK19MVF9UQUdERUNMKFtdLCBbaW5oZXJpdF9ycGF0aF0sIFswXSwKKyAgICBbU2V0IHRvIHllcyBpZiBsaW5rZXIgYWRkcyBydW50aW1lIHBhdGhzIG9mIGRlcGVuZGVudCBsaWJyYXJpZXMKKyAgICB0byBydW50aW1lIHBhdGggbGlzdF0pCitfTFRfVEFHREVDTChbXSwgW2xpbmtfYWxsX2RlcGxpYnNdLCBbMF0sCisgICAgW1doZXRoZXIgbGlidG9vbCBtdXN0IGxpbmsgYSBwcm9ncmFtIGFnYWluc3QgYWxsIGl0cyBkZXBlbmRlbmN5IGxpYnJhcmllc10pCitfTFRfVEFHREVDTChbXSwgW2ZpeF9zcmNmaWxlX3BhdGhdLCBbMV0sCisgICAgW0ZpeCB0aGUgc2hlbGwgdmFyaWFibGUgJHNyY2ZpbGUgZm9yIHRoZSBjb21waWxlcl0pCitfTFRfVEFHREVDTChbXSwgW2Fsd2F5c19leHBvcnRfc3ltYm9sc10sIFswXSwKKyAgICBbU2V0IHRvICJ5ZXMiIGlmIGV4cG9ydGVkIHN5bWJvbHMgYXJlIHJlcXVpcmVkXSkKK19MVF9UQUdERUNMKFtdLCBbZXhwb3J0X3N5bWJvbHNfY21kc10sIFsyXSwKKyAgICBbVGhlIGNvbW1hbmRzIHRvIGxpc3QgZXhwb3J0ZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2V4Y2x1ZGVfZXhwc3ltc10sIFsxXSwKKyAgICBbU3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgbGlzdGVkIGluIHRoZSBwcmVsb2FkZWQgc3ltYm9sc10pCitfTFRfVEFHREVDTChbXSwgW2luY2x1ZGVfZXhwc3ltc10sIFsxXSwKKyAgICBbU3ltYm9scyB0aGF0IG11c3QgYWx3YXlzIGJlIGV4cG9ydGVkXSkKK19MVF9UQUdERUNMKFtdLCBbcHJlbGlua19jbWRzXSwgWzJdLAorICAgIFtDb21tYW5kcyBuZWNlc3NhcnkgZm9yIGxpbmtpbmcgcHJvZ3JhbXMgKGFnYWluc3QgbGlicmFyaWVzKSB3aXRoIHRlbXBsYXRlc10pCitfTFRfVEFHREVDTChbXSwgW2ZpbGVfbGlzdF9zcGVjXSwgWzFdLAorICAgIFtTcGVjaWZ5IGZpbGVuYW1lIGNvbnRhaW5pbmcgaW5wdXQgZmlsZXNdKQorZG5sIEZJWE1FOiBOb3QgeWV0IGltcGxlbWVudGVkCitkbmwgX0xUX1RBR0RFQ0woW10sIFt0aHJlYWRfc2FmZV9mbGFnX3NwZWNdLCBbMV0sCitkbmwgICAgW0NvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkIHNhZmUgb2JqZWN0c10pCitdKSMgX0xUX0xJTktFUl9TSExJQlMKKworCisjIF9MVF9MQU5HX0NfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMgY29tcGlsZXIgYXJlIHN1aXRhYmx5CisjIGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcgdG8gd3JpdGUKKyMgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0NfQ09ORklHXSwKK1ttNF9yZXF1aXJlKFtfTFRfREVDTF9FR1JFUF0pZG5sCitsdF9zYXZlX0NDPSIkQ0MiCitBQ19MQU5HX1BVU0goQykKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIEMgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWMKKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIEMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJpbnQgc29tZV92YXJpYWJsZSA9IDA7IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbigpe3JldHVybigwKTt9JworCitfTFRfVEFHX0NPTVBJTEVSCisjIFNhdmUgdGhlIGRlZmF1bHQgY29tcGlsZXIsIHNpbmNlIGl0IGdldHMgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgb3RoZXIKKyMgdGFncyBhcmUgYmVpbmcgdGVzdGVkLCBhbmQgX0xUX1RBR1ZBUihjb21waWxlciwgW10pIGlzIGEgTk9QLgorY29tcGlsZXJfREVGQVVMVD0kQ0MKKworIyBzYXZlIHdhcm5pbmdzL2JvaWxlcnBsYXRlIG9mIHNpbXBsZSB0ZXN0IGNvZGUKK19MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisjIyBDQVZFQVQgRU1QVE9SOgorIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgX0xUX0NPTVBJTEVSX05PX1JUVEkoJDEpCisgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgIF9MVF9DT01QSUxFUl9DX08oJDEpCisgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgX0xUX1NZU19EWU5BTUlDX0xJTktFUigkMSkKKyAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorICBMVF9TWVNfRExPUEVOX1NFTEYKKyAgX0xUX0NNRF9TVFJJUExJQgorCisgICMgUmVwb3J0IHdoaWNoIGxpYnJhcnkgdHlwZXMgd2lsbCBhY3R1YWxseSBiZSBidWlsdAorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCisgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAjIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgYWl4MyopCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgYXJjaGl2ZV9jbWRzPSIkYXJjaGl2ZV9jbWRzflwkUkFOTElCIFwkbGliIgorICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgIGZpCisgICAgOzsKKworICBhaXhbWzQtOV1dKikKKyAgICBpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgIGZpCisgICAgOzsKKyAgZXNhYworICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXNdKQorICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc3RhdGljXSkKKworICBfTFRfQ09ORklHKCQxKQorZmkKK0FDX0xBTkdfUE9QCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfQ19DT05GSUcKKworCisjIF9MVF9QUk9HX0NYWAorIyAtLS0tLS0tLS0tLS0KKyMgU2luY2UgQUNfUFJPR19DWFggaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgZysrIGlmIHRoZXJlIGlzIG5vIGMrKworIyBjb21waWxlciwgd2UgaGF2ZSBvdXIgb3duIHZlcnNpb24gaGVyZS4KK200X2RlZnVuKFtfTFRfUFJPR19DWFhdLAorWworcHVzaGRlZihbQUNfTVNHX0VSUk9SXSwgW19sdF9jYXVnaHRfQ1hYX2Vycm9yPXllc10pCitBQ19QUk9HX0NYWAoraWYgdGVzdCAtbiAiJENYWCIgJiYgKCB0ZXN0ICJYJENYWCIgIT0gIlhubyIgJiYKKyAgICAoICh0ZXN0ICJYJENYWCIgPSAiWGcrKyIgJiYgYGcrKyAtdiA+L2Rldi9udWxsIDI+JjFgICkgfHwKKyAgICAodGVzdCAiWCRDWFgiICE9ICJYZysrIikpKSA7IHRoZW4KKyAgQUNfUFJPR19DWFhDUFAKK2Vsc2UKKyAgX2x0X2NhdWdodF9DWFhfZXJyb3I9eWVzCitmaQorcG9wZGVmKFtBQ19NU0dfRVJST1JdKQorXSkjIF9MVF9QUk9HX0NYWAorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW19MVF9QUk9HX0NYWF0sIFtdKQorCisKKyMgX0xUX0xBTkdfQ1hYX0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEMrKyBjb21waWxlciBhcmUgc3VpdGFibHkKKyMgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRyB0byB3cml0ZQorIyB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfQ1hYX0NPTkZJR10sCitbQUNfUkVRVUlSRShbX0xUX1BST0dfQ1hYXSlkbmwKK200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorbTRfcmVxdWlyZShbX0xUX0RFQ0xfRUdSRVBdKWRubAorCitBQ19MQU5HX1BVU0goQysrKQorX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCitfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCitfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9bm8KK19MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9dW5zdXBwb3J0ZWQKK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBDKysgdGVzdCBzb3VyY2VzLgorYWNfZXh0PWNwcAorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgQysrIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgQ1hYIGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllczsgdGhlbgorICAjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworICBsdF9zaW1wbGVfY29tcGlsZV90ZXN0X2NvZGU9ImludCBzb21lX3ZhcmlhYmxlID0gMDsiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdpbnQgbWFpbihpbnQsIGNoYXIgKltbXV0pIHsgcmV0dXJuKDApOyB9JworCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0kQ0MKKyAgbHRfc2F2ZV9MRD0kTEQKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBHQ0M9JEdYWAorICBsdF9zYXZlX3dpdGhfZ251X2xkPSR3aXRoX2dudV9sZAorICBsdF9zYXZlX3BhdGhfTEQ9JGx0X2N2X3BhdGhfTEQKKyAgaWYgdGVzdCAtbiAiJHtsdF9jdl9wcm9nX2dudV9sZGN4eCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3Byb2dfZ251X2xkPSRsdF9jdl9wcm9nX2dudV9sZGN4eAorICBlbHNlCisgICAgJGFzX3Vuc2V0IGx0X2N2X3Byb2dfZ251X2xkCisgIGZpCisgIGlmIHRlc3QgLW4gIiR7bHRfY3ZfcGF0aF9MRENYWCtzZXR9IjsgdGhlbgorICAgIGx0X2N2X3BhdGhfTEQ9JGx0X2N2X3BhdGhfTERDWFgKKyAgZWxzZQorICAgICRhc191bnNldCBsdF9jdl9wYXRoX0xECisgIGZpCisgIHRlc3QgLXogIiR7TERDWFgrc2V0fSIgfHwgTEQ9JExEQ1hYCisgIENDPSR7Q1hYLSJjKysifQorICBjb21waWxlcj0kQ0MKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisKKyAgaWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICAgICMgV2UgZG9uJ3Qgd2FudCAtZm5vLWV4Y2VwdGlvbiB3aGVuIGNvbXBpbGluZyBDKysgY29kZSwgc28gc2V0IHRoZQorICAgICMgbm9fYnVpbHRpbl9mbGFnIHNlcGFyYXRlbHkKKyAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihsdF9wcm9nX2NvbXBpbGVyX25vX2J1aWx0aW5fZmxhZywgJDEpPScgLWZuby1idWlsdGluJworICAgIGVsc2UKKyAgICAgIF9MVF9UQUdWQVIobHRfcHJvZ19jb21waWxlcl9ub19idWlsdGluX2ZsYWcsICQxKT0KKyAgICBmaQorCisgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgICMgU2V0IHVwIGRlZmF1bHQgR05VIEMrKyBjb25maWd1cmF0aW9uCisKKyAgICAgIExUX1BBVEhfTEQKKworICAgICAgIyBDaGVjayBpZiBHTlUgQysrIHVzZXMgR05VIGxkIGFzIHRoZSB1bmRlcmx5aW5nIGxpbmtlciwgc2luY2UgdGhlCisgICAgICAjIGFyY2hpdmluZyBjb21tYW5kcyBiZWxvdyBhc3N1bWUgdGhhdCBHTlUgbGQgaXMgYmVpbmcgdXNlZC4KKyAgICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAke3dsfS1yZXRhaW4tc3ltYm9scy1maWxlICR3bCRleHBvcnRfc3ltYm9scyAtbyAkbGliJworCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKworICAgICAgICAjIElmIGFyY2hpdmVfY21kcyBydW5zIExELCBub3QgQ0MsIHdsYXJjIHNob3VsZCBiZSBlbXB0eQorICAgICAgICAjIFhYWCBJIHRoaW5rIHdsYXJjIGNhbiBiZSBlbGltaW5hdGVkIGluIGx0Y2YtY3h4LCBidXQgSSBuZWVkIHRvCisgICAgICAgICMgICAgIGludmVzdGlnYXRlIGl0IGEgbGl0dGxlIGJpdCBtb3JlLiAoTU0pCisgICAgICAgIHdsYXJjPScke3dsfScKKworICAgICAgICAjIGFuY2llbnQgR05VIGxkIGRpZG4ndCBzdXBwb3J0IC0td2hvbGUtYXJjaGl2ZSBldC4gYWwuCisgICAgICAgIGlmIGV2YWwgImAkQ0MgLXByaW50LXByb2ctbmFtZT1sZGAgLS1oZWxwIDI+JjEiIHwKKwkgICRHUkVQICduby13aG9sZS1hcmNoaXZlJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKyAgICAgICAgZWxzZQorICAgICAgICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgICAgd2xhcmM9CisKKyAgICAgICAgIyBBIGdlbmVyaWMgYW5kIHZlcnkgc2ltcGxlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgY3JlYXRpb24KKyAgICAgICAgIyBjb21tYW5kIGZvciBHTlUgQysrIGZvciB0aGUgY2FzZSB3aGVyZSBpdCB1c2VzIHRoZSBuYXRpdmUKKyAgICAgICAgIyBsaW5rZXIsIGluc3RlYWQgb2YgR05VIGxkLiAgSWYgcG9zc2libGUsIHRoaXMgc2V0dGluZyBzaG91bGQKKyAgICAgICAgIyBvdmVycmlkZGVuIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBuYXRpdmUgbGlua2VyIGZlYXR1cmVzIG9uCisgICAgICAgICMgdGhlIHBsYXRmb3JtIGl0IGlzIGJlaW5nIHVzZWQgb24uCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKyAgICAgIGZpCisKKyAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKworICAgIGVsc2UKKyAgICAgIEdYWD1ubworICAgICAgd2l0aF9nbnVfbGQ9bm8KKyAgICAgIHdsYXJjPQorICAgIGZpCisKKyAgICAjIFBPUlRNRTogZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgQysrIGxpbmsgY2hhcmFjdGVyaXN0aWNzCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSAkY29tcGlsZXIgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9eWVzCisgICAgY2FzZSAkaG9zdF9vcyBpbgorICAgICAgYWl4MyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKyAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKyAgICAgICAgICAjIE9uIElBNjQsIHRoZSBsaW5rZXIgZG9lcyBydW4gdGltZSBsaW5raW5nIGJ5IGRlZmF1bHQsIHNvIHdlIGRvbid0CisgICAgICAgICAgIyBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLUJleHBvcnQnCisgICAgICAgICAgbm9fZW50cnlfZmxhZz0iIgorICAgICAgICBlbHNlCisgICAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz1ubworCisgICAgICAgICAgIyBUZXN0IGlmIHdlIGFyZSB0cnlpbmcgdG8gdXNlIHJ1biB0aW1lIGxpbmtpbmcgb3Igbm9ybWFsCisgICAgICAgICAgIyBBSVggc3R5bGUgbGlua2luZy4gSWYgLWJydGwgaXMgc29tZXdoZXJlIGluIExERkxBR1MsIHdlCisgICAgICAgICAgIyBuZWVkIHRvIGRvIHJ1bnRpbWUgbGlua2luZy4KKyAgICAgICAgICBjYXNlICRob3N0X29zIGluIGFpeDQuW1syM11dfGFpeDQuW1syM11dLip8YWl4W1s1LTldXSopCisJICAgIGZvciBsZF9mbGFnIGluICRMREZMQUdTOyBkbworCSAgICAgIGNhc2UgJGxkX2ZsYWcgaW4KKwkgICAgICAqLWJydGwqKQorCSAgICAgICAgYWl4X3VzZV9ydW50aW1lbGlua2luZz15ZXMKKwkgICAgICAgIGJyZWFrCisJICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgICA7OworICAgICAgICAgIGVzYWMKKworICAgICAgICAgIGV4cF9zeW1fZmxhZz0nLWJleHBvcnQnCisgICAgICAgICAgbm9fZW50cnlfZmxhZz0nLWJub2VudHJ5JworICAgICAgICBmaQorCisgICAgICAgICMgV2hlbiBsYXJnZSBleGVjdXRhYmxlcyBvciBzaGFyZWQgb2JqZWN0cyBhcmUgYnVpbHQsIEFJWCBsZCBjYW4KKyAgICAgICAgIyBoYXZlIHByb2JsZW1zIGNyZWF0aW5nIHRoZSB0YWJsZSBvZiBjb250ZW50cy4gIElmIGxpbmtpbmcgYSBsaWJyYXJ5CisgICAgICAgICMgb3IgcHJvZ3JhbSByZXN1bHRzIGluICJlcnJvciBUT0Mgb3ZlcmZsb3ciIGFkZCAtbW1pbmltYWwtdG9jIHRvCisgICAgICAgICMgQ1hYRkxBR1MvQ0ZMQUdTIGZvciBnKysvZ2NjLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoYXQgaXMgbm90CisgICAgICAgICMgZW5vdWdoIHRvIGZpeCB0aGUgcHJvYmxlbSwgYWRkIC1XbCwtYmJpZ3RvYyB0byBMREZMQUdTLgorCisgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JycKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9JzonCisgICAgICAgIF9MVF9UQUdWQVIobGlua19hbGxfZGVwbGlicywgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGZpbGVfbGlzdF9zcGVjLCAkMSk9JyR7d2x9LWYsJworCisgICAgICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisgICAgICAgICAgY2FzZSAkaG9zdF9vcyBpbiBhaXg0LltbMDEyXV18YWl4NC5bWzAxMl1dLiopCisgICAgICAgICAgIyBXZSBvbmx5IHdhbnQgdG8gZG8gdGhpcyBvbiBBSVggNC4yIGFuZCBsb3dlciwgdGhlIGNoZWNrCisgICAgICAgICAgIyBiZWxvdyBmb3IgYnJva2VuIGNvbGxlY3QyIGRvZXNuJ3Qgd29yayB1bmRlciA0LjMrCisJICBjb2xsZWN0Mm5hbWU9YCR7Q0N9IC1wcmludC1wcm9nLW5hbWU9Y29sbGVjdDJgCisJICBpZiB0ZXN0IC1mICIkY29sbGVjdDJuYW1lIiAmJgorCSAgICAgc3RyaW5ncyAiJGNvbGxlY3QybmFtZSIgfCAkR1JFUCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKKwkgIHRoZW4KKwkgICAgIyBXZSBoYXZlIHJld29ya2VkIGNvbGxlY3QyCisJICAgIDoKKwkgIGVsc2UKKwkgICAgIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXVuc3VwcG9ydGVkCisJICAgICMgSXQgZmFpbHMgdG8gZmluZCB1bmluc3RhbGxlZCBsaWJyYXJpZXMgd2hlbiB0aGUgdW5pbnN0YWxsZWQKKwkgICAgIyBwYXRoIGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGxpYnBhdGguICBTZXR0aW5nIGhhcmRjb2RlX21pbnVzX0wKKwkgICAgIyB0byB1bnN1cHBvcnRlZCBmb3JjZXMgcmVsaW5raW5nCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLUwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0KKwkgIGZpCisgICAgICAgICAgZXNhYworICAgICAgICAgIHNoYXJlZF9mbGFnPSctc2hhcmVkJworCSAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisJICAgIHNoYXJlZF9mbGFnPSIkc2hhcmVkX2ZsYWcgIicke3dsfS1HJworCSAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICMgbm90IHVzaW5nIGdjYworICAgICAgICAgIGlmIHRlc3QgIiRob3N0X2NwdSIgPSBpYTY0OyB0aGVuCisJICAjIFZpc3VhbEFnZSBDKyssIFZlcnNpb24gNS41IGZvciBBSVggNUwgZm9yIElBLTY0LCBCZXRhIDMgUmVsZWFzZQorCSAgIyBjaG9rZXMgb24gLVdsLC1HLiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgY29ycmVjdDoKKwkgIHNoYXJlZF9mbGFnPSctRycKKyAgICAgICAgICBlbHNlCisJICAgIGlmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IHllczsgdGhlbgorCSAgICAgIHNoYXJlZF9mbGFnPScke3dsfS1HJworCSAgICBlbHNlCisJICAgICAgc2hhcmVkX2ZsYWc9JyR7d2x9LWJNOlNSRScKKwkgICAgZmkKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LWJleHBhbGwnCisgICAgICAgICMgSXQgc2VlbXMgdGhhdCAtYmV4cGFsbCBkb2VzIG5vdCBleHBvcnQgc3ltYm9scyBiZWdpbm5pbmcgd2l0aAorICAgICAgICAjIHVuZGVyc2NvcmUgKF8pLCBzbyBpdCBpcyBiZXR0ZXIgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgdG8KKwkjIGV4cG9ydC4KKyAgICAgICAgX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT15ZXMKKyAgICAgICAgaWYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0geWVzOyB0aGVuCisgICAgICAgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVudGltZSBsb2FkaW5nIGZsYWdzICgtYnJ0bCksCisgICAgICAgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorICAgICAgICAgIF9MVF9UQUdWQVIoYWxsb3dfdW5kZWZpbmVkX2ZsYWcsICQxKT0nLWJlcm9rJworICAgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxpYnBhdGggZnJvbSB0aGUgdmFsdWUgZW5jb2RlZCBpbiBhbiBlbXB0eQorICAgICAgICAgICMgZXhlY3V0YWJsZS4KKyAgICAgICAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ibGlicGF0aDokbGliZGlyOiciJGFpeF9saWJwYXRoIgorCisgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICciXCR7d2x9JG5vX2VudHJ5X2ZsYWciJyAkY29tcGlsZXJfZmxhZ3MgYGlmIHRlc3QgIngke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgIT0gIngiOyB0aGVuICRFQ0hPICJYJHt3bH0ke2FsbG93X3VuZGVmaW5lZF9mbGFnfSIgfCAkWHNlZDsgZWxzZSA6OyBmaWAgJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMgJHNoYXJlZF9mbGFnIgorICAgICAgICBlbHNlCisgICAgICAgICAgaWYgdGVzdCAiJGhvc3RfY3B1IiA9IGlhNjQ7IHRoZW4KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIgJGxpYmRpcjovdXNyL2xpYjovbGliJworCSAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9Ii16IG5vZGVmcyIKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9IlwkQ0MgJHNoYXJlZF9mbGFnIicgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAnIlwke3dsfSRub19lbnRyeV9mbGFnIicgJGNvbXBpbGVyX2ZsYWdzICR7d2x9JHthbGxvd191bmRlZmluZWRfZmxhZ30gJyJcJHt3bH0kZXhwX3N5bV9mbGFnOlwkZXhwb3J0X3N5bWJvbHMiCisgICAgICAgICAgZWxzZQorCSAgICAjIERldGVybWluZSB0aGUgZGVmYXVsdCBsaWJwYXRoIGZyb20gdGhlIHZhbHVlIGVuY29kZWQgaW4gYW4KKwkgICAgIyBlbXB0eSBleGVjdXRhYmxlLgorCSAgICBfTFRfU1lTX01PRFVMRV9QQVRIX0FJWAorCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tYmxpYnBhdGg6JGxpYmRpcjonIiRhaXhfbGlicGF0aCIKKwkgICAgIyBXYXJuaW5nIC0gd2l0aG91dCB1c2luZyB0aGUgb3RoZXIgcnVuIHRpbWUgbG9hZGluZyBmbGFncywKKwkgICAgIyAtYmVyb2sgd2lsbCBsaW5rIHdpdGhvdXQgZXJyb3IsIGJ1dCBtYXkgcHJvZHVjZSBhIGJyb2tlbiBsaWJyYXJ5LgorCSAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1iZXJub3RvaycKKwkgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tYmVyb2snCisJICAgICMgRXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgcHVsbGVkIGludG8gc2hhcmVkIG9iamVjdHMgZnJvbSBhcmNoaXZlcworCSAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyRjb252ZW5pZW5jZScKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPXllcworCSAgICAjIFRoaXMgaXMgc2ltaWxhciB0byBob3cgQUlYIHRyYWRpdGlvbmFsbHkgYnVpbGRzIGl0cyBzaGFyZWQKKwkgICAgIyBsaWJyYXJpZXMuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSJcJENDICRzaGFyZWRfZmxhZyInIC1vICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYm9ianMgJGRlcGxpYnMgJHt3bH0tYm5vZW50cnkgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWJFOiRleHBvcnRfc3ltYm9scyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9fiRBUiAkQVJfRkxBR1MgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUkcmVsZWFzZS5hICRvdXRwdXRfb2JqZGlyLyRzb25hbWUnCisgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgYmVvcyopCisJaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisJICAjIEpvc2VwaCBCZWNrZW5iYWNoIDxqcmIzQGJlc3QuY29tPiBzYXlzIHNvbWUgcmVsZWFzZXMgb2YgZ2NjCisJICAjIHN1cHBvcnQgLS11bmRlZmluZWQuICBUaGlzIGRlc2VydmVzIHNvbWUgaW52ZXN0aWdhdGlvbi4gIEZJWE1FCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLW5vc3RhcnQgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgY2hvcnVzKikKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICAqKQorCSAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGN5Z3dpbiogfCBtaW5ndyogfCBwdzMyKiB8IGNlZ2NjKikKKyAgICAgICAgIyBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKSBpcyBhY3R1YWxseSBtZWFuaW5nbGVzcywKKyAgICAgICAgIyBhcyB0aGVyZSBpcyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1MJGxpYmRpcicKKyAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPXVuc3VwcG9ydGVkCisgICAgICAgIF9MVF9UQUdWQVIoYWx3YXlzX2V4cG9ydF9zeW1ib2xzLCAkMSk9bm8KKyAgICAgICAgX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9eWVzCisKKyAgICAgICAgaWYgJExEIC0taGVscCAyPiYxIHwgJEdSRVAgJ2F1dG8taW1wb3J0JyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJG91dHB1dF9vYmpkaXIvJHNvbmFtZSAke3dsfS0tZW5hYmxlLWF1dG8taW1hZ2UtYmFzZSAtWGxpbmtlciAtLW91dC1pbXBsaWIgLVhsaW5rZXIgJGxpYicKKyAgICAgICAgICAjIElmIHRoZSBleHBvcnQtc3ltYm9scyBmaWxlIGFscmVhZHkgaXMgYSAuZGVmIGZpbGUgKDFzdCBsaW5lCisgICAgICAgICAgIyBpcyBFWFBPUlRTKSwgdXNlIGl0IGFzIGlzOyBvdGhlcndpc2UsIHByZXBlbmQuLi4KKyAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0naWYgdGVzdCAieGAkU0VEIDFxICRleHBvcnRfc3ltYm9sc2AiID0geEVYUE9SVFM7IHRoZW4KKwkgICAgY3AgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmOworICAgICAgICAgIGVsc2UKKwkgICAgZWNobyBFWFBPUlRTID4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisJICAgIGNhdCAkZXhwb3J0X3N5bWJvbHMgPj4gJG91dHB1dF9vYmpkaXIvJHNvbmFtZS5kZWY7CisgICAgICAgICAgZml+CisgICAgICAgICAgJENDIC1zaGFyZWQgLW5vc3RkbGliICRvdXRwdXRfb2JqZGlyLyRzb25hbWUuZGVmICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICR7d2x9LS1lbmFibGUtYXV0by1pbWFnZS1iYXNlIC1YbGlua2VyIC0tb3V0LWltcGxpYiAtWGxpbmtlciAkbGliJworICAgICAgICBlbHNlCisgICAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgZGFyd2luKiB8IHJoYXBzb2R5KikKKyAgICAgICAgX0xUX0RBUldJTl9MSU5LRVJfRkVBVFVSRVMoJDEpCisJOzsKKworICAgICAgZGd1eCopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgZWMrKyopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgZ2hjeCopCisJICAgICMgR3JlZW4gSGlsbHMgQysrIENvbXBpbGVyCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgKikKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgICBmcmVlYnNkW1sxMl1dKikKKyAgICAgICAgIyBDKysgc2hhcmVkIGxpYnJhcmllcyByZXBvcnRlZCB0byBiZSBmYWlybHkgYnJva2VuIGJlZm9yZQorCSMgc3dpdGNoIHRvIEVMRgorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QtZWxmKikKKyAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgIGZyZWVic2QqIHwgZHJhZ29uZmx5KikKKyAgICAgICAgIyBGcmVlQlNEIDMgYW5kIGxhdGVyIHVzZSBHTlUgQysrIGFuZCBHTlUgbGQgd2l0aCBzdGFuZGFyZCBFTEYKKyAgICAgICAgIyBjb252ZW50aW9ucworICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPXllcworICAgICAgICA7OworCisgICAgICBnbnUqKQorICAgICAgICA7OworCisgICAgICBocHV4OSopCisgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT15ZXMgIyBOb3QgaW4gdGhlIHNlYXJjaCBQQVRILAorCQkJCSAgICAgICAgICAgICAjIGJ1dCBhcyB0aGUgZGVmYXVsdAorCQkJCSAgICAgICAgICAgICAjIGxvY2F0aW9uIG9mIHRoZSBsaWJyYXJ5LgorCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgICAgICA7OworICAgICAgICAgIGFDQyopCisgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLWIgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKyAgICAgICAgICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorICAgICAgICAgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisgICAgICAgICAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorICAgICAgICAgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorICAgICAgICAgICAgIyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEVHUkVQICJcLUwiYDsgbGlzdD0iIjsgZm9yIHogaW4gJHRlbXBsaXN0OyBkbyBjYXNlICR6IGluIGNvbmZ0ZXN0LiRvYmpleHQpIGxpc3Q9IiRsaXN0ICR6Ijs7ICouJG9iamV4dCk7OyAqKSBsaXN0PSIkbGlzdCAkeiI7O2VzYWM7IGRvbmU7ICRFQ0hPICJYJGxpc3QiIHwgJFhzZWQnCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorICAgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckUk0gJG91dHB1dF9vYmpkaXIvJHNvbmFtZX4kQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkb3V0cHV0X29iamRpci8kc29uYW1lICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFnc350ZXN0ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgPSAkbGliIHx8IG12ICRvdXRwdXRfb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIGhwdXgxMCp8aHB1eDExKikKKyAgICAgICAgaWYgdGVzdCAkd2l0aF9nbnVfbGQgPSBubzsgdGhlbgorCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9K2IgJHt3bH0kbGliZGlyJworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisgICAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgICAgICAgIGhwcGEqNjQqfGlhNjQqKQorICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKwkgICAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1FJworICAgICAgICAgICAgICA7OworICAgICAgICAgIGVzYWMKKyAgICAgICAgZmkKKyAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKyAgICAgICAgICBocHBhKjY0KnxpYTY0KikKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworICAgICAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKyAgICAgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbWludXNfTCwgJDEpPXllcyAjIE5vdCBpbiB0aGUgc2VhcmNoIFBBVEgsCisJCQkJCSAgICAgICAgICMgYnV0IGFzIHRoZSBkZWZhdWx0CisJCQkJCSAgICAgICAgICMgbG9jYXRpb24gb2YgdGhlIGxpYnJhcnkuCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBDQyopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgICAgYUNDKikKKwkgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkgICAgICBocHBhKjY0KikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtYiAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgICAgaWE2NCopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICA7OworCSAgICAgICopCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLWIgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgIDs7CisJICAgIGVzYWMKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCgkQ0MgLWIgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEpIHwgJEdSRVAgIlwtTCJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllczsgdGhlbgorCSAgICAgIGlmIHRlc3QgJHdpdGhfZ251X2xkID0gbm87IHRoZW4KKwkgICAgICAgIGNhc2UgJGhvc3RfY3B1IGluCisJICAgICAgICAgIGhwcGEqNjQqKQorCSAgICAgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAtZlBJQyAke3dsfStoICR7d2x9JHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgICBpYTY0KikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rbm9kZWZhdWx0cnBhdGggLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MnCisJICAgICAgICAgICAgOzsKKwkgICAgICAgICAgKikKKwkgICAgICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgLWZQSUMgJHt3bH0raCAke3dsfSRzb25hbWUgJHt3bH0rYiAke3dsfSRpbnN0YWxsX2xpYmRpciAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICAgICAgICA7OworCSAgICAgICAgZXNhYworCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIGZpCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgaW50ZXJpeFtbMy05XV0qKQorCV9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9bm8KKwlfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCV9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJIyBIYWNrOiBPbiBJbnRlcml4IDMueCwgd2UgY2Fubm90IGNvbXBpbGUgUElDIGJlY2F1c2Ugb2YgYSBicm9rZW4gZ2NjLgorCSMgSW5zdGVhZCwgc2hhcmVkIGxpYnJhcmllcyBhcmUgbG9hZGVkIGF0IGFuIGltYWdlIGJhc2UgKDB4MTAwMDAwMDAgYnkKKwkjIGRlZmF1bHQpIGFuZCByZWxvY2F0ZWQgaWYgdGhleSBjb25mbGljdCwgd2hpY2ggaXMgYSBzbG93IHZlcnkgbWVtb3J5CisJIyBjb25zdW1pbmcgYW5kIGZyYWdtZW50aW5nIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCB3ZSBwaWNrIGEgcmFuZG9tLAorCSMgMjU2IEtpQi1hbGlnbmVkIGltYWdlIGJhc2UgYmV0d2VlbiAweDUwMDAwMDAwIGFuZCAweDZGRkMwMDAwIGF0IGxpbmsKKwkjIHRpbWUuICBNb3ZpbmcgdXAgZnJvbSAweDEwMDAwMDAwIGFsc28gYWxsb3dzIG1vcmUgc2JyaygyKSBzcGFjZS4KKwlfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdzZWQgInMsXixfLCIgJGV4cG9ydF9zeW1ib2xzID4kb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bX4kQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWgsJHNvbmFtZSAke3dsfS0tcmV0YWluLXN5bWJvbHMtZmlsZSwkb3V0cHV0X29iamRpci8kc29uYW1lLmV4cHN5bSAke3dsfS0taW1hZ2UtYmFzZSxgZXhwciAke1JBTkRPTS0kJH0gJSA0MDk2IC8gMiBcKiAyNjIxNDQgKyAxMzQyMTc3MjgwYCAtbyAkbGliJworCTs7CisgICAgICBpcml4NSogfCBpcml4NiopCisgICAgICAgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICAjIFNHSSBDKysKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLWFsbCAtbXVsdGlnb3QgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCisJICAgICMgQXJjaGl2ZXMgY29udGFpbmluZyBDKysgb2JqZWN0IGZpbGVzIG11c3QgYmUgY3JlYXRlZCB1c2luZworCSAgICAjICJDQyAtYXIiLCB3aGVyZSAiQ0MiIGlzIHRoZSBJUklYIEMrKyBjb21waWxlci4gIFRoaXMgaXMKKwkgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICMgaW4gdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgLWFyIC1XUiwtdSAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworICAgICAgICAgICopCisJICAgIGlmIHRlc3QgIiRHWFgiID0geWVzOyB0aGVuCisJICAgICAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAtbm9zdGRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nIiB8ICRYc2VkYCAke3dsfS11cGRhdGVfcmVnaXN0cnkgJHt3bH0ke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgIGVsc2UKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkIC1ub3N0ZGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgJEVDSE8gIlgke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgIC1vICRsaWInCisJICAgICAgZmkKKwkgICAgZmkKKwkgICAgX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9eWVzCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorICAgICAgICBfTFRfVEFHVkFSKGluaGVyaXRfcnBhdGgsICQxKT15ZXMKKyAgICAgICAgOzsKKworICAgICAgbGludXgqIHwgaypic2QqLWdudSkKKyAgICAgICAgY2FzZSAkY2NfYmFzZW5hbWUgaW4KKyAgICAgICAgICBLQ0MqKQorCSAgICAjIEt1Y2sgYW5kIEFzc29jaWF0ZXMsIEluYy4gKEtBSSkgQysrIENvbXBpbGVyCisKKwkgICAgIyBLQ0Mgd2lsbCBvbmx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBvdXRwdXQgZmlsZQorCSAgICAjIGVuZHMgd2l0aCAiLnNvIiAob3IgIi5zbCIgZm9yIEhQLVVYKSwgc28gcmVuYW1lIHRoZSBsaWJyYXJ5CisJICAgICMgdG8gaXRzIHByb3BlciBuYW1lICh3aXRoIHZlcnNpb24pIGFmdGVyIGxpbmtpbmcuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J3RlbXBleHQ9YGVjaG8gJHNoYXJlZF9leHQgfCAkU0VEIC1lICdcJydzL1woW1teKCkwLTlBLVphLXp7fV1dXCkvXFxcXFwxL2cnXCcnYDsgdGVtcGxpYj1gZWNobyAkbGliIHwgJFNFRCAtZSAicy9cJHt0ZW1wZXh0fVwuLiovLnNvLyJgOyAkQ0MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzIC0tc29uYW1lICRzb25hbWUgLW8gXCR0ZW1wbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzOyBtdiBcJHRlbXBsaWIgJGxpYicKKwkgICAgIyBDb21tYW5kcyB0byBtYWtlIGNvbXBpbGVyIHByb2R1Y2UgdmVyYm9zZSBvdXRwdXQgdGhhdCBsaXN0cworCSAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgIyBsaW5raW5nIGEgc2hhcmVkIGxpYnJhcnkuCisJICAgICMKKwkgICAgIyBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSB0byBwcmV2ZW50IHRoaXMgY29tcGlsZXIgZnJvbQorCSAgICAjIGV4cGxpY2l0bHkgbGlua2luZyBzeXN0ZW0gb2JqZWN0IGZpbGVzIHNvIHdlIG5lZWQgdG8gc3RyaXAgdGhlbQorCSAgICAjIGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5CisJICAgICMgZGVwZW5kZW5jaWVzLgorCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0ndGVtcGxpc3Q9YCRDQyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgLW8gbGliY29uZnRlc3Qkc2hhcmVkX2V4dCAyPiYxIHwgJEdSRVAgImxkImA7IHJtIC1mIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQ7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS0tZXhwb3J0LWR5bmFtaWMnCisKKwkgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICMgIkNDIC1Cc3RhdGljIiwgd2hlcmUgIkNDIiBpcyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtQnN0YXRpYyAtbyAkb2xkbGliICRvbGRvYmpzJworCSAgICA7OworCSAgaWNwYyogfCBlY3BjKiApCisJICAgICMgSW50ZWwgQysrCisJICAgIHdpdGhfZ251X2xkPXllcworCSAgICAjIHZlcnNpb24gOC4wIGFuZCBhYm92ZSBvZiBpY3BjIGNob2tlIG9uIG11bHRpcGx5IGRlZmluZWQgc3ltYm9scworCSAgICAjIGlmIHdlIGFkZCAkcHJlZGVwX29iamVjdHMgYW5kICRwb3N0ZGVwX29iamVjdHMsIGhvd2V2ZXIgNy4xIGFuZAorCSAgICAjIGVhcmxpZXIgZG8gbm90IGFkZCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLgorCSAgICBjYXNlIGAkQ0MgLVYgMj4mMWAgaW4KKwkgICAgICAqIlZlcnNpb24gNy4iKikKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCQlfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJCTs7CisJICAgICAgKikgICMgVmVyc2lvbiA4LjAgb3IgbmV3ZXIKKwkgICAgICAgIHRtcF9pZHluPQorCSAgICAgICAgY2FzZSAkaG9zdF9jcHUgaW4KKwkJICBpYTY0KikgdG1wX2lkeW49JyAtaV9keW5hbWljJzs7CisJCWVzYWMKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkJX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkJyIkdG1wX2lkeW4iJyAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkJOzsKKwkgICAgZXNhYworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kc19uZWVkX2xjLCAkMSk9bm8KKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZSRjb252ZW5pZW5jZSAke3dsfS0tbm8td2hvbGUtYXJjaGl2ZScKKwkgICAgOzsKKyAgICAgICAgICBwZ0NDKiB8IHBnY3BwKikKKyAgICAgICAgICAgICMgUG9ydGxhbmQgR3JvdXAgQysrIGNvbXBpbGVyCisJICAgIGNhc2UgYCRDQyAtVmAgaW4KKwkgICAgKnBnQ0NcIFtbMS01XV0qIHwgKnBnY3BwXCBbWzEtNV1dKikKKwkgICAgICBfTFRfVEFHVkFSKHByZWxpbmtfY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkb2JqcyAkbGlib2JqcyAkY29tcGlsZV9kZXBsaWJzfgorCQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYCInCisJICAgICAgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9J3RwbGRpcj1UZW1wbGF0ZS5kaXJ+CisJCXJtIC1yZiAkdHBsZGlyfgorCQkkQ0MgLS1wcmVsaW5rX29iamVjdHMgLS1pbnN0YW50aWF0aW9uX2RpciAkdHBsZGlyICRvbGRvYmpzJG9sZF9kZXBsaWJzfgorCQkkQVIgJEFSX0ZMQUdTICRvbGRsaWIkb2xkb2JqcyRvbGRfZGVwbGlicyBgZmluZCAkdHBsZGlyIC1uYW1lIFwqLm8gfCAkTkwyU1BgfgorCQkkUkFOTElCICRvbGRsaWInCisJICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndHBsZGlyPVRlbXBsYXRlLmRpcn4KKwkJcm0gLXJmICR0cGxkaXJ+CisJCSRDQyAtLXByZWxpbmtfb2JqZWN0cyAtLWluc3RhbnRpYXRpb25fZGlyICR0cGxkaXIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRjb252ZW5pZW5jZSAkcG9zdGRlcF9vYmplY3RzfgorCQkkQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzIGBmaW5kICR0cGxkaXIgLW5hbWUgXCoubyB8ICROTDJTUGAgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR7d2x9JHNvbmFtZSAtbyAkbGliJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSd0cGxkaXI9VGVtcGxhdGUuZGlyfgorCQlybSAtcmYgJHRwbGRpcn4KKwkJJENDIC0tcHJlbGlua19vYmplY3RzIC0taW5zdGFudGlhdGlvbl9kaXIgJHRwbGRpciAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJGNvbnZlbmllbmNlICRwb3N0ZGVwX29iamVjdHN+CisJCSRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgYGZpbmQgJHRwbGRpciAtbmFtZSBcKi5vIHwgJE5MMlNQYCAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICAqKSAjIFZlcnNpb24gNiB3aWxsIHVzZSB3ZWFrIHN5bWJvbHMKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgLW8gJGxpYicKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHBpY19mbGFnICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKKwkgICAgICA7OworCSAgICBlc2FjCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1ycGF0aCAke3dsfSRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKKwkgICAgX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScke3dsfS0td2hvbGUtYXJjaGl2ZWBmb3IgY29udiBpbiAkY29udmVuaWVuY2VcIlwiOyBkbyB0ZXN0ICAtbiBcIiRjb252XCIgJiYgbmV3X2NvbnZlbmllbmNlPVwiJG5ld19jb252ZW5pZW5jZSwkY29udlwiOyBkb25lOyAkRUNITyBcIiRuZXdfY29udmVuaWVuY2VcImAgJHt3bH0tLW5vLXdob2xlLWFyY2hpdmUnCisgICAgICAgICAgICA7OworCSAgY3h4KikKKwkgICAgIyBDb21wYXEgQysrCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lICAtbyAkbGliICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHdsJGV4cG9ydF9zeW1ib2xzJworCisJICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9OgorCisJICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgIyB3aGF0ICJoaWRkZW4iIGxpYnJhcmllcywgb2JqZWN0IGZpbGVzIGFuZCBmbGFncyBhcmUgdXNlZCB3aGVuCisJICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAjCisJICAgICMgVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB3YXkgdG8gcHJldmVudCB0aGlzIGNvbXBpbGVyIGZyb20KKwkgICAgIyBleHBsaWNpdGx5IGxpbmtpbmcgc3lzdGVtIG9iamVjdCBmaWxlcyBzbyB3ZSBuZWVkIHRvIHN0cmlwIHRoZW0KKwkgICAgIyBmcm9tIHRoZSBvdXRwdXQgc28gdGhhdCB0aGV5IGRvbid0IGdldCBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeQorCSAgICAjIGRlcGVuZGVuY2llcy4KKwkgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9J3RlbXBsaXN0PWAkQ0MgLXNoYXJlZCAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJsZCJgOyB0ZW1wbGlzdD1gJEVDSE8gIlgkdGVtcGxpc3QiIHwgJFhzZWQgLWUgInMvXCheLipsZC4qXClcKCAuKmxkIC4qJFwpL1wxLyJgOyBsaXN0PSIiOyBmb3IgeiBpbiAkdGVtcGxpc3Q7IGRvIGNhc2UgJHogaW4gY29uZnRlc3QuJG9iamV4dCkgbGlzdD0iJGxpc3QgJHoiOzsgKi4kb2JqZXh0KTs7ICopIGxpc3Q9IiRsaXN0ICR6Ijs7ZXNhYzsgZG9uZTsgJEVDSE8gIlgkbGlzdCIgfCAkWHNlZCcKKwkgICAgOzsKKwkgIHhsKikKKwkgICAgIyBJQk0gWEwgOC4wIG9uIFBQQywgd2l0aCBHTlUgbGQKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkgICAgX0xUX1RBR1ZBUihleHBvcnRfZHluYW1pY19mbGFnX3NwZWMsICQxKT0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgaWYgdGVzdCAieCRzdXBwb3J0c19hbm9uX3ZlcnNpb25pbmciID0geHllczsgdGhlbgorCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQljYXQgJGV4cG9ydF9zeW1ib2xzIHwgc2VkIC1lICJzL1woLipcKS9cMTsvIiA+PiAkb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXJ+CisJCWVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudmVyfgorCQkkQ0MgLXFta3Nocm9iaiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tdmVyc2lvbi1zY3JpcHQgJHt3bH0kb3V0cHV0X29iamRpci8kbGlibmFtZS52ZXIgLW8gJGxpYicKKwkgICAgZmkKKwkgICAgOzsKKwkgICopCisJICAgIGNhc2UgYCRDQyAtViAyPiYxIHwgc2VkIDVxYCBpbgorCSAgICAqU3VuXCBDKikKKwkgICAgICAjIFN1biBDKysgNS45CisJICAgICAgX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPScgLXpkZWZzJworCSAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUgJHt3bH0kZXhwb3J0X3N5bWJvbHMnCisJICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9Jy1SJGxpYmRpcicKKwkgICAgICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LS13aG9sZS1hcmNoaXZlYG5ld19jb252ZW5pZW5jZT07IGZvciBjb252IGluICRjb252ZW5pZW5jZVwiXCI7IGRvIHRlc3QgLXogXCIkY29udlwiIHx8IG5ld19jb252ZW5pZW5jZT1cIiRuZXdfY29udmVuaWVuY2UsJGNvbnZcIjsgZG9uZTsgJEVDSE8gXCIkbmV3X2NvbnZlbmllbmNlXCJgICR7d2x9LS1uby13aG9sZS1hcmNoaXZlJworCSAgICAgIF9MVF9UQUdWQVIoY29tcGlsZXJfbmVlZHNfb2JqZWN0LCAkMSk9eWVzCisKKwkgICAgICAjIE5vdCBzdXJlIHdoZXRoZXIgc29tZXRoaW5nIGJhc2VkIG9uCisJICAgICAgIyAkQ0MgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IC1vIGxpYmNvbmZ0ZXN0JHNoYXJlZF9leHQgMj4mMQorCSAgICAgICMgd291bGQgYmUgYmV0dGVyLgorCSAgICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSdlY2hvJworCisJICAgICAgIyBBcmNoaXZlcyBjb250YWluaW5nIEMrKyBvYmplY3QgZmlsZXMgbXVzdCBiZSBjcmVhdGVkIHVzaW5nCisJICAgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICAgIyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgYXJlIGluY2x1ZGVkCisJICAgICAgIyBpbiB0aGUgYXJjaGl2ZS4KKwkgICAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCTs7CisKKyAgICAgIGx5bnhvcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCV9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBtODhrKikKKyAgICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisgICAgICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwk7OworCisgICAgICBtdnMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIGN4eCopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisJICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworCWVzYWMKKwk7OworCisgICAgICBuZXRic2QqKQorICAgICAgICBpZiBlY2hvIF9fRUxGX18gfCAkQ0MgLUUgLSB8ICRHUkVQIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgorCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJExEIC1Cc2hhcmVhYmxlICAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRsaW5rZXJfZmxhZ3MnCisJICB3bGFyYz0KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctUiRsaWJkaXInCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPXllcworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9zaGxpYnBhdGhfdmFyLCAkMSk9bm8KKwlmaQorCSMgV29ya2Fyb3VuZCBzb21lIGJyb2tlbiBwcmUtMS41IHRvb2xjaGFpbnMKKwlvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCBjb25mdGVzdC4kb2JqZXh0IHwgJFNFRCAtZSAiczotbGdjYyAtbGMgLWxnY2M6OiInCisJOzsKKworICAgICAgKm50byogfCAqcW54KikKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT15ZXMKKwk7OworCisgICAgICBvcGVuYnNkMiopCisgICAgICAgICMgQysrIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGZhaXJseSBicm9rZW4KKwlfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJOzsKKworICAgICAgb3BlbmJzZCopCisJaWYgdGVzdCAtZiAvdXNyL2xpYmV4ZWMvbGQuc287IHRoZW4KKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfZGlyZWN0LCAkMSk9eWVzCisJICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT15ZXMKKwkgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICRwaWNfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW8gJGxpYicKKwkgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPScke3dsfS1ycGF0aCwkbGliZGlyJworCSAgaWYgdGVzdCAteiAiYGVjaG8gX19FTEZfXyB8ICRDQyAtRSAtIHwgZ3JlcCBfX0VMRl9fYCIgfHwgdGVzdCAiJGhvc3Rfb3MtJGhvc3RfY3B1IiA9ICJvcGVuYnNkMi44LXBvd2VycGMiOyB0aGVuCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcGljX2ZsYWcgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LXJldGFpbi1zeW1ib2xzLWZpbGUsJGV4cG9ydF9zeW1ib2xzIC1vICRsaWInCisJICAgIF9MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LUUnCisJICAgIF9MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKKwkgIGZpCisJICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD1lY2hvCisJZWxzZQorCSAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCWZpCisJOzsKKworICAgICAgb3NmMyogfCBvc2Y0KiB8IG9zZjUqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIEtDQyopCisJICAgICMgS3VjayBhbmQgQXNzb2NpYXRlcywgSW5jLiAoS0FJKSBDKysgQ29tcGlsZXIKKworCSAgICAjIEtDQyB3aWxsIG9ubHkgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIG91dHB1dCBmaWxlCisJICAgICMgZW5kcyB3aXRoICIuc28iIChvciAiLnNsIiBmb3IgSFAtVVgpLCBzbyByZW5hbWUgdGhlIGxpYnJhcnkKKwkgICAgIyB0byBpdHMgcHJvcGVyIG5hbWUgKHdpdGggdmVyc2lvbikgYWZ0ZXIgbGlua2luZy4KKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0ndGVtcGV4dD1gZWNobyAkc2hhcmVkX2V4dCB8ICRTRUQgLWUgJ1wnJ3MvXChbW14oKTAtOUEtWmEtent9XV1cKS9cXFxcXDEvZydcJydgOyB0ZW1wbGliPWBlY2hvICIkbGliIiB8ICRTRUQgLWUgInMvXCR7dGVtcGV4dH1cLi4qLy5zby8iYDsgJENDICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAtLXNvbmFtZSAkc29uYW1lIC1vIFwkdGVtcGxpYjsgbXYgXCR0ZW1wbGliICRsaWInCisKKwkgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoLCRsaWJkaXInCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyB0aGUgS0FJIEMrKyBjb21waWxlci4KKwkgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgIG9zZjMqKSBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC1Cc3RhdGljIC1vICRvbGRsaWIgJG9sZG9ianMnIDs7CisJICAgICAgKikgX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtbyAkb2xkbGliICRvbGRvYmpzJyA7OworCSAgICBlc2FjCisJICAgIDs7CisgICAgICAgICAgUkNDKikKKwkgICAgIyBSYXRpb25hbCBDKysgMi40LjEKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICBjeHgqKQorCSAgICBjYXNlICRob3N0IGluCisJICAgICAgb3NmMyopCisJICAgICAgICBfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0tc29uYW1lICRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICJYJHt3bH0tc2V0X3ZlcnNpb24gJHZlcnN0cmluZyIgfCAkWHNlZGAgLXVwZGF0ZV9yZWdpc3RyeSAke291dHB1dF9vYmpkaXJ9L3NvX2xvY2F0aW9ucyAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKwkJOzsKKwkgICAgICAqKQorCSAgICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgLWV4cGVjdF91bnJlc29sdmVkIFwqJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJICAgICAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nZm9yIGkgaW4gYGNhdCAkZXhwb3J0X3N5bWJvbHNgOyBkbyBwcmludGYgIiVzICVzXFxuIiAtZXhwb3J0ZWRfc3ltYm9sICJcJGkiID4+ICRsaWIuZXhwOyBkb25lfgorCSAgICAgICAgICBlY2hvICItaGlkZGVuIj4+ICRsaWIuZXhwfgorCSAgICAgICAgICAkQ0MgLXNoYXJlZCRhbGxvd191bmRlZmluZWRfZmxhZyAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgLW1zeW0gLXNvbmFtZSAkc29uYW1lICR7d2x9LWlucHV0ICR7d2x9JGxpYi5leHAgIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nIiB8ICRYc2VkYCAtdXBkYXRlX3JlZ2lzdHJ5ICR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWJ+CisJICAgICAgICAgICRSTSAkbGliLmV4cCcKKwkgICAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYywgJDEpPSctcnBhdGggJGxpYmRpcicKKwkJOzsKKwkgICAgZXNhYworCisJICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICMgd2hhdCAiaGlkZGVuIiBsaWJyYXJpZXMsIG9iamVjdCBmaWxlcyBhbmQgZmxhZ3MgYXJlIHVzZWQgd2hlbgorCSAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgIworCSAgICAjIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIHByZXZlbnQgdGhpcyBjb21waWxlciBmcm9tCisJICAgICMgZXhwbGljaXRseSBsaW5raW5nIHN5c3RlbSBvYmplY3QgZmlsZXMgc28gd2UgbmVlZCB0byBzdHJpcCB0aGVtCisJICAgICMgZnJvbSB0aGUgb3V0cHV0IHNvIHRoYXQgdGhleSBkb24ndCBnZXQgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkKKwkgICAgIyBkZXBlbmRlbmNpZXMuCisJICAgIG91dHB1dF92ZXJib3NlX2xpbmtfY21kPSd0ZW1wbGlzdD1gJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAibGQiIHwgJEdSRVAgLXYgImxkOiJgOyB0ZW1wbGlzdD1gJEVDSE8gIlgkdGVtcGxpc3QiIHwgJFhzZWQgLWUgInMvXCheLipsZC4qXClcKCAuKmxkLiokXCkvXDEvImA7IGxpc3Q9IiI7IGZvciB6IGluICR0ZW1wbGlzdDsgZG8gY2FzZSAkeiBpbiBjb25mdGVzdC4kb2JqZXh0KSBsaXN0PSIkbGlzdCAkeiI7OyAqLiRvYmpleHQpOzsgKikgbGlzdD0iJGxpc3QgJHoiOztlc2FjOyBkb25lOyAkRUNITyAiWCRsaXN0IiB8ICRYc2VkJworCSAgICA7OworCSAgKikKKwkgICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXMgJiYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IG5vOyB0aGVuCisJICAgICAgX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPScgJHt3bH0tZXhwZWN0X3VucmVzb2x2ZWQgJHt3bH1cKicKKwkgICAgICBjYXNlICRob3N0IGluCisJICAgICAgICBvc2YzKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiAkRUNITyAiWCR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZyIgfCAkWHNlZGAgJHt3bH0tdXBkYXRlX3JlZ2lzdHJ5ICR7d2x9JHtvdXRwdXRfb2JqZGlyfS9zb19sb2NhdGlvbnMgLW8gJGxpYicKKwkJICA7OworCSAgICAgICAgKikKKwkgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1tc3ltICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmICRFQ0hPICIke3dsfS1zZXRfdmVyc2lvbiAke3dsfSR2ZXJzdHJpbmciIHwgJFhzZWRgICR7d2x9LXVwZGF0ZV9yZWdpc3RyeSAke3dsfSR7b3V0cHV0X29iamRpcn0vc29fbG9jYXRpb25zIC1vICRsaWInCisJCSAgOzsKKwkgICAgICBlc2FjCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJworCSAgICAgIF9MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPToKKworCSAgICAgICMgQ29tbWFuZHMgdG8gbWFrZSBjb21waWxlciBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0IHRoYXQgbGlzdHMKKwkgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAjIGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeS4KKwkgICAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nJENDIC1zaGFyZWQgJENGTEFHUyAtdiBjb25mdGVzdC4kb2JqZXh0IDI+JjEgfCAkR1JFUCAiXC1MIicKKworCSAgICBlbHNlCisJICAgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICBmaQorCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHBzb3MqKQorICAgICAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKyAgICAgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworICAgICAgICA7OworCisgICAgICBzdW5vczQqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBTdW4gQysrIDQueAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgIGxjYyopCisJICAgICMgTHVjaWQKKwkgICAgIyBGSVhNRTogaW5zZXJ0IHByb3BlciBDKysgbGlicmFyeSBzdXBwb3J0CisJICAgIF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSk9bm8KKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIDs7CisKKyAgICAgIHNvbGFyaXMqKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIENDKikKKwkgICAgIyBTdW4gQysrIDQuMiwgNS54IGFuZCBDZW50ZXJsaW5lIEMrKworICAgICAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywkMSk9eWVzCisJICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nIC16ZGVmcycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1HJHthbGxvd191bmRlZmluZWRfZmxhZ30gIC1oJHNvbmFtZSAtbyAkbGliICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkgICAgICAkQ0MgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAke3dsfS1NICR7d2x9JGxpYi5leHAgLWgkc29uYW1lIC1vICRsaWIgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzfiRSTSAkbGliLmV4cCcKKworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nLVIkbGliZGlyJworCSAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKwkgICAgICAqKQorCQkjIFRoZSBjb21waWxlciBkcml2ZXIgd2lsbCBjb21iaW5lIGFuZCByZW9yZGVyIGxpbmtlciBvcHRpb25zLAorCQkjIGJ1dCB1bmRlcnN0YW5kcyBgLXogbGlua2VyX2ZsYWcnLgorCSAgICAgICAgIyBTdXBwb3J0ZWQgc2luY2UgU29sYXJpcyAyLjYgKG1heWJlIDIuNS4xPykKKwkJX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPScteiBhbGxleHRyYWN0JGNvbnZlbmllbmNlIC16IGRlZmF1bHRleHRyYWN0JworCSAgICAgICAgOzsKKwkgICAgZXNhYworCSAgICBfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKworCSAgICBvdXRwdXRfdmVyYm9zZV9saW5rX2NtZD0nZWNobycKKworCSAgICAjIEFyY2hpdmVzIGNvbnRhaW5pbmcgQysrIG9iamVjdCBmaWxlcyBtdXN0IGJlIGNyZWF0ZWQgdXNpbmcKKwkgICAgIyAiQ0MgLXhhciIsIHdoZXJlICJDQyIgaXMgdGhlIFN1biBDKysgY29tcGlsZXIuICBUaGlzIGlzCisJICAgICMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSBpbnN0YW50aWF0ZWQgdGVtcGxhdGVzIGFyZSBpbmNsdWRlZAorCSAgICAjIGluIHRoZSBhcmNoaXZlLgorCSAgICBfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0nJENDIC14YXIgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICBnY3gqKQorCSAgICAjIEdyZWVuIEhpbGxzIEMrKyBDb21waWxlcgorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3MgJHt3bH0taCAkd2wkc29uYW1lIC1vICRsaWInCisKKwkgICAgIyBUaGUgQysrIGNvbXBpbGVyIG11c3QgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFyY2hpdmUuCisJICAgIF9MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSckQ0MgJExERkxBR1MgLWFyY2hpdmUgLW8gJG9sZGxpYiAkb2xkb2JqcycKKwkgICAgOzsKKyAgICAgICAgICAqKQorCSAgICAjIEdOVSBDKysgY29tcGlsZXIgd2l0aCBTb2xhcmlzIGxpbmtlcgorCSAgICBpZiB0ZXN0ICIkR1hYIiA9IHllcyAmJiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0gbm87IHRoZW4KKwkgICAgICBfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyAke3dsfS16ICR7d2x9ZGVmcycKKwkgICAgICBpZiAkQ0MgLS12ZXJzaW9uIHwgJEdSRVAgLXYgJ14yXC43JyA+IC9kZXYvbnVsbDsgdGhlbgorCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgLW5vc3RkbGliICRMREZMQUdTICRwcmVkZXBfb2JqZWN0cyAkbGlib2JqcyAkZGVwbGlicyAkcG9zdGRlcF9vYmplY3RzICRjb21waWxlcl9mbGFncyAke3dsfS1oICR3bCRzb25hbWUgLW8gJGxpYicKKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9leHBzeW1fY21kcywgJDEpPSdlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8ICRTRUQgLWUgInMvXCguKlwpL1wxOy8iID4+ICRsaWIuZXhwfmVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+CisJCSAgJENDIC1zaGFyZWQgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtc2hhcmVkICRDRkxBR1MgLXYgY29uZnRlc3QuJG9iamV4dCAyPiYxIHwgJEdSRVAgIlwtTCInCisJICAgICAgZWxzZQorCSAgICAgICAgIyBnKysgMi43IGFwcGVhcnMgdG8gcmVxdWlyZSBgLUcnIE5PVCBgLXNoYXJlZCcgb24gdGhpcworCSAgICAgICAgIyBwbGF0Zm9ybS4KKwkgICAgICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtRyAtbm9zdGRsaWIgJExERkxBR1MgJHByZWRlcF9vYmplY3RzICRsaWJvYmpzICRkZXBsaWJzICRwb3N0ZGVwX29iamVjdHMgJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWggJHdsJHNvbmFtZSAtbyAkbGliJworCSAgICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9J2VjaG8gInsgZ2xvYmFsOiIgPiAkbGliLmV4cH5jYXQgJGV4cG9ydF9zeW1ib2xzIHwgJFNFRCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+ZWNobyAibG9jYWw6ICo7IH07IiA+PiAkbGliLmV4cH4KKwkJICAkQ0MgLUcgLW5vc3RkbGliICR7d2x9LU0gJHdsJGxpYi5leHAgLW8gJGxpYiAkcHJlZGVwX29iamVjdHMgJGxpYm9ianMgJGRlcGxpYnMgJHBvc3RkZXBfb2JqZWN0cyAkY29tcGlsZXJfZmxhZ3N+JFJNICRsaWIuZXhwJworCisJICAgICAgICAjIENvbW1hbmRzIHRvIG1ha2UgY29tcGlsZXIgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCB0aGF0IGxpc3RzCisJICAgICAgICAjIHdoYXQgImhpZGRlbiIgbGlicmFyaWVzLCBvYmplY3QgZmlsZXMgYW5kIGZsYWdzIGFyZSB1c2VkIHdoZW4KKwkgICAgICAgICMgbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgICAgICAgb3V0cHV0X3ZlcmJvc2VfbGlua19jbWQ9JyRDQyAtRyAkQ0ZMQUdTIC12IGNvbmZ0ZXN0LiRvYmpleHQgMj4mMSB8ICRHUkVQICJcLUwiJworCSAgICAgIGZpCisKKwkgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0nJHt3bH0tUiAkd2wkbGliZGlyJworCSAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKwkJc29sYXJpczIuW1swLTVdXSB8IHNvbGFyaXMyLltbMC01XV0uKikgOzsKKwkJKikKKwkJICBfTFRfVEFHVkFSKHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LXogJHt3bH1hbGxleHRyYWN0JGNvbnZlbmllbmNlICR7d2x9LXogJHt3bH1kZWZhdWx0ZXh0cmFjdCcKKwkJICA7OworCSAgICAgIGVzYWMKKwkgICAgZmkKKwkgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworCisgICAgc3lzdjQqdXcyKiB8IHN5c3Y1T3BlblVOSVgqIHwgc3lzdjVVbml4V2FyZTcuW1swMV1dLltbMTBdXSogfCB1bml4d2FyZTcqIHwgc2NvMy4ydjUuMC5bWzAyNF1dKikKKyAgICAgIF9MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0nJHt3bH0teix0ZXh0JworICAgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisgICAgICBfTFRfVEFHVkFSKGhhcmRjb2RlX3NobGlicGF0aF92YXIsICQxKT1ubworICAgICAgcnVucGF0aF92YXI9J0xEX1JVTl9QQVRIJworCisgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICBDQyopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtRyAke3dsfS1CZXhwb3J0OiRleHBvcnRfc3ltYm9scyAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICA7OworCSopCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLXNoYXJlZCAke3dsfS1oLCRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkY29tcGlsZXJfZmxhZ3MnCisJICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1zaGFyZWQgJHt3bH0tQmV4cG9ydDokZXhwb3J0X3N5bWJvbHMgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgOzsKKyAgICAgIGVzYWMKKyAgICAgIDs7CisKKyAgICAgIHN5c3Y1KiB8IHNjbzMuMnY1KiB8IHNjbzV2NiopCisJIyBOb3RlOiBXZSBjYW4gTk9UIHVzZSAteiBkZWZzIGFzIHdlIG1pZ2h0IGRlc2lyZSwgYmVjYXVzZSB3ZSBkbyBub3QKKwkjIGxpbmsgd2l0aCAtbGMsIGFuZCB0aGF0IHdvdWxkIGNhdXNlIGFueSBzeW1ib2xzIHVzZWQgZnJvbSBsaWJjIHRvCisJIyBhbHdheXMgYmUgdW5yZXNvbHZlZCwgd2hpY2ggbWVhbnMganVzdCBhYm91dCBubyBsaWJyYXJ5IHdvdWxkCisJIyBldmVyIGxpbmsgY29ycmVjdGx5LiAgSWYgd2UncmUgbm90IHVzaW5nIEdOVSBsZCB3ZSB1c2UgLXogdGV4dAorCSMgdGhvdWdoLCB3aGljaCBkb2VzIGNhdGNoIHNvbWUgYmFkIHN5bWJvbHMgYnV0IGlzbid0IGFzIGhlYXZ5LWhhbmRlZAorCSMgYXMgLXogZGVmcy4KKwlfTFRfVEFHVkFSKG5vX3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosdGV4dCcKKwlfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9JyR7d2x9LXosbm9kZWZzJworCV9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworCV9MVF9UQUdWQVIoaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciwgJDEpPW5vCisJX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9JyR7d2x9LVIsJGxpYmRpcicKKwlfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IsICQxKT0nOicKKwlfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT15ZXMKKwlfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPScke3dsfS1CZXhwb3J0JworCXJ1bnBhdGhfdmFyPSdMRF9SVU5fUEFUSCcKKworCWNhc2UgJGNjX2Jhc2VuYW1lIGluCisgICAgICAgICAgQ0MqKQorCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfY21kcywgJDEpPSckQ0MgLUcgJHt3bH0taCwkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGNvbXBpbGVyX2ZsYWdzJworCSAgICBfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0nJENDIC1HICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgOzsKKwkgICopCisJICAgIF9MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9JyRDQyAtc2hhcmVkICR7d2x9LUJleHBvcnQ6JGV4cG9ydF9zeW1ib2xzICR7d2x9LWgsJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRjb21waWxlcl9mbGFncycKKwkgICAgOzsKKwllc2FjCisgICAgICA7OworCisgICAgICB0YW5kZW0qKQorICAgICAgICBjYXNlICRjY19iYXNlbmFtZSBpbgorICAgICAgICAgIE5DQyopCisJICAgICMgTm9uU3RvcC1VWCBOQ0MgMy4yMAorCSAgICAjIEZJWE1FOiBpbnNlcnQgcHJvcGVyIEMrKyBsaWJyYXJ5IHN1cHBvcnQKKwkgICAgX0xUX1RBR1ZBUihsZF9zaGxpYnMsICQxKT1ubworCSAgICA7OworICAgICAgICAgICopCisJICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorCSAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisJICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgOzsKKworICAgICAgdnh3b3JrcyopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRklYTUU6IGluc2VydCBwcm9wZXIgQysrIGxpYnJhcnkgc3VwcG9ydAorICAgICAgICBfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpPW5vCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgQUNfTVNHX1JFU1VMVChbJF9MVF9UQUdWQVIobGRfc2hsaWJzLCAkMSldKQorICAgIHRlc3QgIiRfTFRfVEFHVkFSKGxkX3NobGlicywgJDEpIiA9IG5vICYmIGNhbl9idWlsZF9zaGFyZWQ9bm8KKworICAgIF9MVF9UQUdWQVIoR0NDLCAkMSk9IiRHWFgiCisgICAgX0xUX1RBR1ZBUihMRCwgJDEpPSIkTEQiCisKKyAgICAjIyBDQVZFQVQgRU1QVE9SOgorICAgICMjIFRoZXJlIGlzIG5vIGVuY2Fwc3VsYXRpb24gd2l0aGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBkbyBub3QgY2hhbmdlCisgICAgIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyAgICAjIyB3aGF0IHlvdSBhcmUgZG9pbmcuLi4KKyAgICBfTFRfU1lTX0hJRERFTl9MSUJERVBTKCQxKQorICAgIF9MVF9DT01QSUxFUl9QSUMoJDEpCisgICAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgICBfTFRfQ09NUElMRVJfRklMRV9MT0NLUygkMSkKKyAgICBfTFRfTElOS0VSX1NITElCUygkMSkKKyAgICBfTFRfU1lTX0RZTkFNSUNfTElOS0VSKCQxKQorICAgIF9MVF9MSU5LRVJfSEFSRENPREVfTElCUEFUSCgkMSkKKworICAgIF9MVF9DT05GSUcoJDEpCisgIGZpICMgdGVzdCAtbiAiJGNvbXBpbGVyIgorCisgIENDPSRsdF9zYXZlX0NDCisgIExEQ1hYPSRMRAorICBMRD0kbHRfc2F2ZV9MRAorICBHQ0M9JGx0X3NhdmVfR0NDCisgIHdpdGhfZ251X2xkPSRsdF9zYXZlX3dpdGhfZ251X2xkCisgIGx0X2N2X3BhdGhfTERDWFg9JGx0X2N2X3BhdGhfTEQKKyAgbHRfY3ZfcGF0aF9MRD0kbHRfc2F2ZV9wYXRoX0xECisgIGx0X2N2X3Byb2dfZ251X2xkY3h4PSRsdF9jdl9wcm9nX2dudV9sZAorICBsdF9jdl9wcm9nX2dudV9sZD0kbHRfc2F2ZV93aXRoX2dudV9sZAorZmkgIyB0ZXN0ICIkX2x0X2NhdWdodF9DWFhfZXJyb3IiICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0NYWF9DT05GSUcKKworCisjIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoW1RBR05BTUVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlndXJlIG91dCAiaGlkZGVuIiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmcm9tIHZlcmJvc2UKKyMgY29tcGlsZXIgb3V0cHV0IHdoZW4gbGlua2luZyBhIHNoYXJlZCBsaWJyYXJ5LgorIyBQYXJzZSB0aGUgY29tcGlsZXIgb3V0cHV0IGFuZCBleHRyYWN0IHRoZSBuZWNlc3NhcnkKKyMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorbTRfZGVmdW4oW19MVF9TWVNfSElEREVOX0xJQkRFUFNdLAorW200X3JlcXVpcmUoW19MVF9GSUxFVVRJTFNfREVGQVVMVFNdKWRubAorIyBEZXBlbmRlbmNpZXMgdG8gcGxhY2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgb2JqZWN0IGJlaW5nIGxpbmtlZDoKK19MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKT0KK19MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSk9CitfTFRfVEFHVkFSKHByZWRlcHMsICQxKT0KK19MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0KK19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSk9CisKK2RubCB3ZSBjYW4ndCB1c2UgdGhlIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZSBoZXJlLAorZG5sIGJlY2F1c2UgaXQgY29udGFpbnMgY29kZSBpbnRlbmRlZCBmb3IgYW4gZXhlY3V0YWJsZSwKK2RubCBub3QgYSBsaWJyYXJ5LiAgSXQncyBwb3NzaWJsZSB3ZSBzaG91bGQgbGV0IGVhY2gKK2RubCB0YWcgZGVmaW5lIGEgbmV3IGx0Xz8/Pz9fbGlua190ZXN0X2NvZGUgdmFyaWFibGUsCitkbmwgYnV0IGl0J3Mgb25seSB1c2VkIGhlcmUuLi4KK200X2lmKFskMV0sIFtdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2ludCBhOwordm9pZCBmb28gKHZvaWQpIHsgYSA9IDA7IH0KK19MVF9FT0YKK10sIFskMV0sIFtDWFhdLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKK2NsYXNzIEZvbworeworcHVibGljOgorICBGb28gKHZvaWQpIHsgYSA9IDA7IH0KK3ByaXZhdGU6CisgIGludCBhOworfTsKK19MVF9FT0YKK10sIFskMV0sIFtGNzddLCBbY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PF9MVF9FT0YKKyAgICAgIHN1YnJvdXRpbmUgZm9vCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBpbnRlZ2VyKjQgYQorICAgICAgYT0wCisgICAgICByZXR1cm4KKyAgICAgIGVuZAorX0xUX0VPRgorXSwgWyQxXSwgW0ZDXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCisgICAgICBzdWJyb3V0aW5lIGZvbworICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciBhCisgICAgICBhPTAKKyAgICAgIHJldHVybgorICAgICAgZW5kCitfTFRfRU9GCitdLCBbJDFdLCBbR0NKXSwgW2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxfTFRfRU9GCitwdWJsaWMgY2xhc3MgZm9vIHsKKyAgcHJpdmF0ZSBpbnQgYTsKKyAgcHVibGljIHZvaWQgYmFyICh2b2lkKSB7CisgICAgYSA9IDA7CisgIH0KK307CitfTFRfRU9GCitdKQorZG5sIFBhcnNlIHRoZSBjb21waWxlciBvdXRwdXQgYW5kIGV4dHJhY3QgdGhlIG5lY2Vzc2FyeQorZG5sIG9iamVjdHMsIGxpYnJhcmllcyBhbmQgbGlicmFyeSBmbGFncy4KK2lmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCisgICMgUGFyc2UgdGhlIGNvbXBpbGVyIG91dHB1dCBhbmQgZXh0cmFjdCB0aGUgbmVjZXNzYXJ5CisgICMgb2JqZWN0cywgbGlicmFyaWVzIGFuZCBsaWJyYXJ5IGZsYWdzLgorCisgICMgU2VudGluZWwgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBiZWZvcmUKKyAgIyB0aGUgY29uZnRlc3Qgb2JqZWN0IGZpbGUuCisgIHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmU9bm8KKworICBmb3IgcCBpbiBgZXZhbCAiJG91dHB1dF92ZXJib3NlX2xpbmtfY21kImA7IGRvCisgICAgY2FzZSAkcCBpbgorCisgICAgLUwqIHwgLVIqIHwgLWwqKQorICAgICAgICMgU29tZSBjb21waWxlcnMgcGxhY2Ugc3BhY2UgYmV0d2VlbiAiLXtMLFJ9IiBhbmQgdGhlIHBhdGguCisgICAgICAgIyBSZW1vdmUgdGhlIHNwYWNlLgorICAgICAgIGlmIHRlc3QgJHAgPSAiLUwiIHx8CisgICAgICAgICAgdGVzdCAkcCA9ICItUiI7IHRoZW4KKwkgcHJldj0kcAorCSBjb250aW51ZQorICAgICAgIGVsc2UKKwkgcHJldj0KKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgY2FzZSAkcCBpbgorCSAtTCogfCAtUiopCisJICAgIyBJbnRlcm5hbCBjb21waWxlciBsaWJyYXJ5IHBhdGhzIHNob3VsZCBjb21lIGFmdGVyIHRob3NlCisJICAgIyBwcm92aWRlZCB0aGUgdXNlci4gIFRoZSBwb3N0ZGVwcyBhbHJlYWR5IGNvbWUgYWZ0ZXIgdGhlCisJICAgIyB1c2VyIHN1cHBsaWVkIGxpYnMgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBwcm9jZXNzIHRoZW0uCisJICAgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSkiOyB0aGVuCisJICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke3ByZXZ9JHtwfSIKKwkgICBlbHNlCisJICAgICBfTFRfVEFHVkFSKGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCwgJDEpPSIke19MVF9UQUdWQVIoY29tcGlsZXJfbGliX3NlYXJjaF9wYXRoLCAkMSl9ICR7cHJldn0ke3B9IgorCSAgIGZpCisJICAgOzsKKwkgIyBUaGUgIi1sIiBjYXNlIHdvdWxkIG5ldmVyIGNvbWUgYmVmb3JlIHRoZSBvYmplY3QgYmVpbmcKKwkgIyBsaW5rZWQsIHNvIGRvbid0IGJvdGhlciBoYW5kbGluZyB0aGlzIGNhc2UuCisJIGVzYWMKKyAgICAgICBlbHNlCisJIGlmIHRlc3QgLXogIiRfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpPSIke3ByZXZ9JHtwfSIKKwkgZWxzZQorCSAgIF9MVF9UQUdWQVIocG9zdGRlcHMsICQxKT0iJHtfTFRfVEFHVkFSKHBvc3RkZXBzLCAkMSl9ICR7cHJldn0ke3B9IgorCSBmaQorICAgICAgIGZpCisgICAgICAgOzsKKworICAgICouJG9iamV4dCkKKyAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0ZXN0IG9iamVjdCBmaWxlIG9ubHkgc2hvd3MgdXAKKyAgICAgICAjIG9uY2UgaW4gdGhlIGNvbXBpbGVyIG91dHB1dC4KKyAgICAgICBpZiB0ZXN0ICIkcCIgPSAiY29uZnRlc3QuJG9iamV4dCI7IHRoZW4KKwkgcHJlX3Rlc3Rfb2JqZWN0X2RlcHNfZG9uZT15ZXMKKwkgY29udGludWUKKyAgICAgICBmaQorCisgICAgICAgaWYgdGVzdCAiJHByZV90ZXN0X29iamVjdF9kZXBzX2RvbmUiID0gbm87IHRoZW4KKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocHJlZGVwX29iamVjdHMsICQxKSI7IHRoZW4KKwkgICBfTFRfVEFHVkFSKHByZWRlcF9vYmplY3RzLCAkMSk9IiRwIgorCSBlbHNlCisJICAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpPSIkX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywgJDEpICRwIgorCSBmaQorICAgICAgIGVsc2UKKwkgaWYgdGVzdCAteiAiJF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCAkMSkiOyB0aGVuCisJICAgX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKT0iJHAiCisJIGVsc2UKKwkgICBfTFRfVEFHVkFSKHBvc3RkZXBfb2JqZWN0cywgJDEpPSIkX0xUX1RBR1ZBUihwb3N0ZGVwX29iamVjdHMsICQxKSAkcCIKKwkgZmkKKyAgICAgICBmaQorICAgICAgIDs7CisKKyAgICAqKSA7OyAjIElnbm9yZSB0aGUgcmVzdC4KKworICAgIGVzYWMKKyAgZG9uZQorCisgICMgQ2xlYW4gdXAuCisgIHJtIC1mIGEub3V0IGEuZXhlCitlbHNlCisgIGVjaG8gImxpYnRvb2wubTQ6IGVycm9yOiBwcm9ibGVtIGNvbXBpbGluZyAkMSB0ZXN0IHByb2dyYW0iCitmaQorCiskUk0gLWYgY29uZmVzdC4kb2JqZXh0CisKKyMgUE9SVE1FOiBvdmVycmlkZSBhYm92ZSB0ZXN0IG9uIHN5c3RlbXMgd2hlcmUgaXQgaXMgYnJva2VuCittNF9pZihbJDFdLCBbQ1hYXSwKK1tjYXNlICRob3N0X29zIGluCitpbnRlcml4W1szLTldXSopCisgICMgSW50ZXJpeCAzLjUgaW5zdGFsbHMgY29tcGxldGVseSBob3NlZCAubGEgZmlsZXMgZm9yIEMrKywgc28gcmF0aGVyIHRoYW4KKyAgIyBoYWNrIGFsbCBhcm91bmQgaXQsIGxldCdzIGp1c3QgdHJ1c3QgImcrKyIgdG8gRFRSVC4KKyAgX0xUX1RBR1ZBUihwcmVkZXBfb2JqZWN0cywkMSk9CisgIF9MVF9UQUdWQVIocG9zdGRlcF9vYmplY3RzLCQxKT0KKyAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9CisgIDs7CisKK2xpbnV4KikKKyAgY2FzZSBgJENDIC1WIDI+JjEgfCBzZWQgNXFgIGluCisgICpTdW5cIEMqKQorICAgICMgU3VuIEMrKyA1LjkKKworICAgICMgVGhlIG1vcmUgc3RhbmRhcmRzLWNvbmZvcm1pbmcgc3RscG9ydDQgbGlicmFyeSBpcworICAgICMgaW5jb21wYXRpYmxlIHdpdGggdGhlIENzdGQgbGlicmFyeS4gQXZvaWQgc3BlY2lmeWluZworICAgICMgaXQgaWYgaXQncyBpbiBDWFhGTEFHUy4gSWdub3JlIGxpYkNydW4gYXMKKyAgICAjIC1saWJyYXJ5PXN0bHBvcnQ0IGRlcGVuZHMgb24gaXQuCisgICAgY2FzZSAiICRDWFggJENYWEZMQUdTICIgaW4KKyAgICAqIiAtbGlicmFyeT1zdGxwb3J0NCAiKikKKyAgICAgIHNvbGFyaXNfdXNlX3N0bHBvcnQ0PXllcworICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgOzsKKworc29sYXJpcyopCisgIGNhc2UgJGNjX2Jhc2VuYW1lIGluCisgIENDKikKKyAgICAjIFRoZSBtb3JlIHN0YW5kYXJkcy1jb25mb3JtaW5nIHN0bHBvcnQ0IGxpYnJhcnkgaXMKKyAgICAjIGluY29tcGF0aWJsZSB3aXRoIHRoZSBDc3RkIGxpYnJhcnkuIEF2b2lkIHNwZWNpZnlpbmcKKyAgICAjIGl0IGlmIGl0J3MgaW4gQ1hYRkxBR1MuIElnbm9yZSBsaWJDcnVuIGFzCisgICAgIyAtbGlicmFyeT1zdGxwb3J0NCBkZXBlbmRzIG9uIGl0LgorICAgIGNhc2UgIiAkQ1hYICRDWFhGTEFHUyAiIGluCisgICAgKiIgLWxpYnJhcnk9c3RscG9ydDQgIiopCisgICAgICBzb2xhcmlzX3VzZV9zdGxwb3J0ND15ZXMKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBBZGRpbmcgdGhpcyByZXF1aXJlcyBhIGtub3duLWdvb2Qgc2V0dXAgb2Ygc2hhcmVkIGxpYnJhcmllcyBmb3IKKyAgICAjIFN1biBjb21waWxlciB2ZXJzaW9ucyBiZWZvcmUgNS42LCBlbHNlIFBJQyBvYmplY3RzIGZyb20gYW4gb2xkCisgICAgIyBhcmNoaXZlIHdpbGwgYmUgbGlua2VkIGludG8gdGhlIG91dHB1dCwgbGVhZGluZyB0byBzdWJ0bGUgYnVncy4KKyAgICBpZiB0ZXN0ICIkc29sYXJpc191c2Vfc3RscG9ydDQiICE9IHllczsgdGhlbgorICAgICAgX0xUX1RBR1ZBUihwb3N0ZGVwcywkMSk9Jy1saWJyYXJ5PUNzdGQgLWxpYnJhcnk9Q3J1bicKKyAgICBmaQorICAgIDs7CisgIGVzYWMKKyAgOzsKK2VzYWMKK10pCisKK2Nhc2UgIiAkX0xUX1RBR1ZBUihwb3N0ZGVwcywgJDEpICIgaW4KKyoiIC1sYyAiKikgX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vIDs7Citlc2FjCisgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX2RpcnMsICQxKT0KK2lmIHRlc3QgLW4gIiR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0iOyB0aGVuCisgX0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX2RpcnMsICQxKT1gZWNobyAiICR7X0xUX1RBR1ZBUihjb21waWxlcl9saWJfc2VhcmNoX3BhdGgsICQxKX0iIHwgJHtTRUR9IC1lICdzISAtTCEgIWcnIC1lICdzIV4gISEnYAorZmkKK19MVF9UQUdERUNMKFtdLCBbY29tcGlsZXJfbGliX3NlYXJjaF9kaXJzXSwgWzFdLAorICAgIFtUaGUgZGlyZWN0b3JpZXMgc2VhcmNoZWQgYnkgdGhpcyBjb21waWxlciB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnldKQorX0xUX1RBR0RFQ0woW10sIFtwcmVkZXBfb2JqZWN0c10sIFsxXSwKKyAgICBbRGVwZW5kZW5jaWVzIHRvIHBsYWNlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG9iamVjdHMgYmVpbmcgbGlua2VkIHRvCisgICAgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnldKQorX0xUX1RBR0RFQ0woW10sIFtwb3N0ZGVwX29iamVjdHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW3ByZWRlcHNdLCBbMV0pCitfTFRfVEFHREVDTChbXSwgW3Bvc3RkZXBzXSwgWzFdKQorX0xUX1RBR0RFQ0woW10sIFtjb21waWxlcl9saWJfc2VhcmNoX3BhdGhdLCBbMV0sCisgICAgW1RoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcGlsZXIgd2hlbiBsaW5raW5nCisgICAgYSBzaGFyZWQgbGlicmFyeV0pCitdKSMgX0xUX1NZU19ISURERU5fTElCREVQUworCisKKyMgX0xUX1BST0dfRjc3CisjIC0tLS0tLS0tLS0tLQorIyBTaW5jZSBBQ19QUk9HX0Y3NyBpcyBicm9rZW4sIGluIHRoYXQgaXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nCisjIGlmIHRoZXJlIGlzIG5vIGZvcnRyYW4gY29tcGlsZXIsIHdlIGhhdmUgb3VyIG93biB2ZXJzaW9uIGhlcmUuCittNF9kZWZ1bihbX0xUX1BST0dfRjc3XSwKK1sKK3B1c2hkZWYoW0FDX01TR19FUlJPUl0sIFtfbHRfZGlzYWJsZV9GNzc9eWVzXSkKK0FDX1BST0dfRjc3CitpZiB0ZXN0IC16ICIkRjc3IiB8fCB0ZXN0ICJYJEY3NyIgPSAiWG5vIjsgdGhlbgorICBfbHRfZGlzYWJsZV9GNzc9eWVzCitmaQorcG9wZGVmKFtBQ19NU0dfRVJST1JdKQorXSkjIF9MVF9QUk9HX0Y3NworCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW19MVF9QUk9HX0Y3N10sIFtdKQorCisKKyMgX0xUX0xBTkdfRjc3X0NPTkZJRyhbVEFHXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gNzcgY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0Y3N19DT05GSUddLAorW0FDX1JFUVVJUkUoW19MVF9QUk9HX0Y3N10pZG5sCitBQ19MQU5HX1BVU0goRm9ydHJhbiA3NykKKworX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCitfTFRfVEFHVkFSKGFsbG93X3VuZGVmaW5lZF9mbGFnLCAkMSk9CitfTFRfVEFHVkFSKGFsd2F5c19leHBvcnRfc3ltYm9scywgJDEpPW5vCitfTFRfVEFHVkFSKGFyY2hpdmVfZXhwc3ltX2NtZHMsICQxKT0KK19MVF9UQUdWQVIoZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdCwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2RpcmVjdF9hYnNvbHV0ZSwgJDEpPW5vCitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY19sZCwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX21pbnVzX0wsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9hdXRvbWF0aWMsICQxKT1ubworX0xUX1RBR1ZBUihpbmhlcml0X3JwYXRoLCAkMSk9bm8KK19MVF9UQUdWQVIobW9kdWxlX2NtZHMsICQxKT0KK19MVF9UQUdWQVIobW9kdWxlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGxpbmtfYWxsX2RlcGxpYnMsICQxKT11bmtub3duCitfTFRfVEFHVkFSKG9sZF9hcmNoaXZlX2NtZHMsICQxKT0kb2xkX2FyY2hpdmVfY21kcworX0xUX1RBR1ZBUihub191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUih3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihlbmFibGVfc2hhcmVkX3dpdGhfc3RhdGljX3J1bnRpbWVzLCAkMSk9bm8KKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIGY3NyB0ZXN0IHNvdXJjZXMuCithY19leHQ9ZgorCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgZjc3IHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgRjc3IGNvbXBpbGVyIGlzbid0IHdvcmtpbmcuICBTb21lIHZhcmlhYmxlcyAobGlrZSBlbmFibGVfc2hhcmVkKQorIyBhcmUgY3VycmVudGx5IGFzc3VtZWQgdG8gYXBwbHkgdG8gYWxsIGNvbXBpbGVycyBvbiB0aGlzIHBsYXRmb3JtLAorIyBhbmQgd2lsbCBiZSBjb3JydXB0ZWQgYnkgc2V0dGluZyB0aGVtIGJhc2VkIG9uIGEgbm9uLXdvcmtpbmcgY29tcGlsZXIuCitpZiB0ZXN0ICIkX2x0X2Rpc2FibGVfRjc3IiAhPSB5ZXM7IHRoZW4KKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKKyAgbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSJcCisgICAgICBzdWJyb3V0aW5lIHQKKyAgICAgIHJldHVybgorICAgICAgZW5kCisiCisKKyAgIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGxpbmsgdGVzdHMKKyAgbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSJcCisgICAgICBwcm9ncmFtIHQKKyAgICAgIGVuZAorIgorCisgICMgbHRtYWluIG9ubHkgdXNlcyAkQ0MgZm9yIHRhZ2dlZCBjb25maWd1cmF0aW9ucyBzbyBtYWtlIHN1cmUgJENDIGlzIHNldC4KKyAgX0xUX1RBR19DT01QSUxFUgorCisgICMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCisgIF9MVF9DT01QSUxFUl9CT0lMRVJQTEFURQorICBfTFRfTElOS0VSX0JPSUxFUlBMQVRFCisKKyAgIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KKyAgbHRfc2F2ZV9DQz0iJENDIgorICBsdF9zYXZlX0dDQz0kR0NDCisgIENDPSR7Rjc3LSJmNzcifQorICBjb21waWxlcj0kQ0MKKyAgX0xUX1RBR1ZBUihjb21waWxlciwgJDEpPSRDQworICBfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCisgIEdDQz0kRzc3CisgIGlmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIGxpYnRvb2wgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllc10pCisgICAgQUNfTVNHX1JFU1VMVChbJGNhbl9idWlsZF9zaGFyZWRdKQorCisgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIHRlc3QgIiRjYW5fYnVpbGRfc2hhcmVkIiA9ICJubyIgJiYgZW5hYmxlX3NoYXJlZD1ubworCisgICAgIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCisgICAgIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgIGFpeDMqKQorICAgICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICAgICAgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgICAgICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKKyAgICAgICAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgICAgICAgIGZpCisgICAgICAgIDs7CisgICAgICBhaXhbWzQtOV1dKikKKwlpZiB0ZXN0ICIkaG9zdF9jcHUiICE9IGlhNjQgJiYgdGVzdCAiJGFpeF91c2VfcnVudGltZWxpbmtpbmciID0gbm8gOyB0aGVuCisJICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworCWZpCisgICAgICAgIDs7CisgICAgZXNhYworICAgIEFDX01TR19SRVNVTFQoWyRlbmFibGVfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzXSkKKyAgICAjIE1ha2Ugc3VyZSBlaXRoZXIgZW5hYmxlX3NoYXJlZCBvciBlbmFibGVfc3RhdGljIGlzIHllcy4KKyAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3N0YXRpY10pCisKKyAgICBfTFRfVEFHVkFSKEdDQywgJDEpPSIkRzc3IgorICAgIF9MVF9UQUdWQVIoTEQsICQxKT0iJExEIgorCisgICAgIyMgQ0FWRUFUIEVNUFRPUjoKKyAgICAjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorICAgICMjIHRoZSBydW5uaW5nIG9yZGVyIG9yIG90aGVyd2lzZSBtb3ZlIHRoZW0gYXJvdW5kIHVubGVzcyB5b3Uga25vdyBleGFjdGx5CisgICAgIyMgd2hhdCB5b3UgYXJlIGRvaW5nLi4uCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgR0NDPSRsdF9zYXZlX0dDQworICBDQz0iJGx0X3NhdmVfQ0MiCitmaSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GNzciICE9IHllcworCitBQ19MQU5HX1BPUAorXSkjIF9MVF9MQU5HX0Y3N19DT05GSUcKKworCisjIF9MVF9QUk9HX0ZDCisjIC0tLS0tLS0tLS0tCisjIFNpbmNlIEFDX1BST0dfRkMgaXMgYnJva2VuLCBpbiB0aGF0IGl0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZworIyBpZiB0aGVyZSBpcyBubyBmb3J0cmFuIGNvbXBpbGVyLCB3ZSBoYXZlIG91ciBvd24gdmVyc2lvbiBoZXJlLgorbTRfZGVmdW4oW19MVF9QUk9HX0ZDXSwKK1sKK3B1c2hkZWYoW0FDX01TR19FUlJPUl0sIFtfbHRfZGlzYWJsZV9GQz15ZXNdKQorQUNfUFJPR19GQworaWYgdGVzdCAteiAiJEZDIiB8fCB0ZXN0ICJYJEZDIiA9ICJYbm8iOyB0aGVuCisgIF9sdF9kaXNhYmxlX0ZDPXllcworZmkKK3BvcGRlZihbQUNfTVNHX0VSUk9SXSkKK10pIyBfTFRfUFJPR19GQworCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW19MVF9QUk9HX0ZDXSwgW10pCisKKworIyBfTFRfTEFOR19GQ19DT05GSUcoW1RBR10pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGZvciBhIEZvcnRyYW4gY29tcGlsZXIgYXJlCisjIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX0ZDX0NPTkZJR10sCitbQUNfUkVRVUlSRShbX0xUX1BST0dfRkNdKWRubAorQUNfTEFOR19QVVNIKEZvcnRyYW4pCisKK19MVF9UQUdWQVIoYXJjaGl2ZV9jbWRzX25lZWRfbGMsICQxKT1ubworX0xUX1RBR1ZBUihhbGxvd191bmRlZmluZWRfZmxhZywgJDEpPQorX0xUX1RBR1ZBUihhbHdheXNfZXhwb3J0X3N5bWJvbHMsICQxKT1ubworX0xUX1RBR1ZBUihhcmNoaXZlX2V4cHN5bV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYywgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3QsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUsICQxKT1ubworX0xUX1RBR1ZBUihoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjLCAkMSk9CitfTFRfVEFHVkFSKGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGQsICQxKT0KK19MVF9UQUdWQVIoaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciwgJDEpPQorX0xUX1RBR1ZBUihoYXJkY29kZV9taW51c19MLCAkMSk9bm8KK19MVF9UQUdWQVIoaGFyZGNvZGVfYXV0b21hdGljLCAkMSk9bm8KK19MVF9UQUdWQVIoaW5oZXJpdF9ycGF0aCwgJDEpPW5vCitfTFRfVEFHVkFSKG1vZHVsZV9jbWRzLCAkMSk9CitfTFRfVEFHVkFSKG1vZHVsZV9leHBzeW1fY21kcywgJDEpPQorX0xUX1RBR1ZBUihsaW5rX2FsbF9kZXBsaWJzLCAkMSk9dW5rbm93bgorX0xUX1RBR1ZBUihvbGRfYXJjaGl2ZV9jbWRzLCAkMSk9JG9sZF9hcmNoaXZlX2NtZHMKK19MVF9UQUdWQVIobm9fdW5kZWZpbmVkX2ZsYWcsICQxKT0KK19MVF9UQUdWQVIod2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMsICQxKT0KK19MVF9UQUdWQVIoZW5hYmxlX3NoYXJlZF93aXRoX3N0YXRpY19ydW50aW1lcywgJDEpPW5vCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBmYyB0ZXN0IHNvdXJjZXMuCithY19leHQ9JHthY19mY19zcmNleHQtZn0KKworIyBPYmplY3QgZmlsZSBleHRlbnNpb24gZm9yIGNvbXBpbGVkIGZjIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBObyBzZW5zZSBpbiBydW5uaW5nIGFsbCB0aGVzZSB0ZXN0cyBpZiB3ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdAorIyB0aGUgRkMgY29tcGlsZXIgaXNuJ3Qgd29ya2luZy4gIFNvbWUgdmFyaWFibGVzIChsaWtlIGVuYWJsZV9zaGFyZWQpCisjIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBhcHBseSB0byBhbGwgY29tcGlsZXJzIG9uIHRoaXMgcGxhdGZvcm0sCisjIGFuZCB3aWxsIGJlIGNvcnJ1cHRlZCBieSBzZXR0aW5nIHRoZW0gYmFzZWQgb24gYSBub24td29ya2luZyBjb21waWxlci4KK2lmIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzOyB0aGVuCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBjb21waWxlIHRlc3RzCisgIGx0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iXAorICAgICAgc3Vicm91dGluZSB0CisgICAgICByZXR1cm4KKyAgICAgIGVuZAorIgorCisgICMgQ29kZSB0byBiZSB1c2VkIGluIHNpbXBsZSBsaW5rIHRlc3RzCisgIGx0X3NpbXBsZV9saW5rX3Rlc3RfY29kZT0iXAorICAgICAgcHJvZ3JhbSB0CisgICAgICBlbmQKKyIKKworICAjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCisgIF9MVF9UQUdfQ09NUElMRVIKKworICAjIHNhdmUgd2FybmluZ3MvYm9pbGVycGxhdGUgb2Ygc2ltcGxlIHRlc3QgY29kZQorICBfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKKyAgX0xUX0xJTktFUl9CT0lMRVJQTEFURQorCisgICMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCisgIGx0X3NhdmVfQ0M9IiRDQyIKKyAgbHRfc2F2ZV9HQ0M9JEdDQworICBDQz0ke0ZDLSJmOTUifQorICBjb21waWxlcj0kQ0MKKyAgR0NDPSRhY19jdl9mY19jb21waWxlcl9nbnUKKworICBfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCisgIF9MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworICBpZiB0ZXN0IC1uICIkY29tcGlsZXIiOyB0aGVuCisgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXNdKQorICAgIEFDX01TR19SRVNVTFQoWyRjYW5fYnVpbGRfc2hhcmVkXSkKKworICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzXSkKKyAgICB0ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KKworICAgICMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorICAgICMgYXJlIGFsbCBidWlsdCBmcm9tIFBJQy4KKyAgICBjYXNlICRob3N0X29zIGluCisgICAgICBhaXgzKikKKyAgICAgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgICAgICAgICBhcmNoaXZlX2NtZHM9IiRhcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRsaWIiCisgICAgICAgICAgcG9zdGluc3RhbGxfY21kcz0nJFJBTkxJQiAkbGliJworICAgICAgICBmaQorICAgICAgICA7OworICAgICAgYWl4W1s0LTldXSopCisJaWYgdGVzdCAiJGhvc3RfY3B1IiAhPSBpYTY0ICYmIHRlc3QgIiRhaXhfdXNlX3J1bnRpbWVsaW5raW5nIiA9IG5vIDsgdGhlbgorCSAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzICYmIGVuYWJsZV9zdGF0aWM9bm8KKwlmaQorICAgICAgICA7OworICAgIGVzYWMKKyAgICBBQ19NU0dfUkVTVUxUKFskZW5hYmxlX3NoYXJlZF0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCisgICAgIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCisgICAgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCisgICAgQUNfTVNHX1JFU1VMVChbJGVuYWJsZV9zdGF0aWNdKQorCisgICAgX0xUX1RBR1ZBUihHQ0MsICQxKT0iJGFjX2N2X2ZjX2NvbXBpbGVyX2dudSIKKyAgICBfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKKworICAgICMjIENBVkVBVCBFTVBUT1I6CisgICAgIyMgVGhlcmUgaXMgbm8gZW5jYXBzdWxhdGlvbiB3aXRoaW4gdGhlIGZvbGxvd2luZyBtYWNyb3MsIGRvIG5vdCBjaGFuZ2UKKyAgICAjIyB0aGUgcnVubmluZyBvcmRlciBvciBvdGhlcndpc2UgbW92ZSB0aGVtIGFyb3VuZCB1bmxlc3MgeW91IGtub3cgZXhhY3RseQorICAgICMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgorICAgIF9MVF9TWVNfSElEREVOX0xJQkRFUFMoJDEpCisgICAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgICBfTFRfQ09NUElMRVJfQ19PKCQxKQorICAgIF9MVF9DT01QSUxFUl9GSUxFX0xPQ0tTKCQxKQorICAgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICAgIF9MVF9TWVNfRFlOQU1JQ19MSU5LRVIoJDEpCisgICAgX0xUX0xJTktFUl9IQVJEQ09ERV9MSUJQQVRIKCQxKQorCisgICAgX0xUX0NPTkZJRygkMSkKKyAgZmkgIyB0ZXN0IC1uICIkY29tcGlsZXIiCisKKyAgR0NDPSRsdF9zYXZlX0dDQworICBDQz0iJGx0X3NhdmVfQ0MiCitmaSAjIHRlc3QgIiRfbHRfZGlzYWJsZV9GQyIgIT0geWVzCisKK0FDX0xBTkdfUE9QCitdKSMgX0xUX0xBTkdfRkNfQ09ORklHCisKKworIyBfTFRfTEFOR19HQ0pfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFbnN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBHTlUgSmF2YSBDb21waWxlciBjb21waWxlcgorIyBhcmUgc3VpdGFibHkgZGVmaW5lZC4gIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic2VxdWVudGx5IHVzZWQgYnkgX0xUX0NPTkZJRworIyB0byB3cml0ZSB0aGUgY29tcGlsZXIgY29uZmlndXJhdGlvbiB0byBgbGlidG9vbCcuCittNF9kZWZ1bihbX0xUX0xBTkdfR0NKX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19HQ0pdKWRubAorQUNfTEFOR19TQVZFCisKKyMgU291cmNlIGZpbGUgZXh0ZW5zaW9uIGZvciBKYXZhIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1qYXZhCisKKyMgT2JqZWN0IGZpbGUgZXh0ZW5zaW9uIGZvciBjb21waWxlZCBKYXZhIHRlc3Qgc291cmNlcy4KK29iamV4dD1vCitfTFRfVEFHVkFSKG9iamV4dCwgJDEpPSRvYmpleHQKKworIyBDb2RlIHRvIGJlIHVzZWQgaW4gc2ltcGxlIGNvbXBpbGUgdGVzdHMKK2x0X3NpbXBsZV9jb21waWxlX3Rlc3RfY29kZT0iY2xhc3MgZm9vIHt9IgorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSdwdWJsaWMgY2xhc3MgY29uZnRlc3QgeyBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbW11dIGFyZ3YpIHt9OyB9JworCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz15ZXMKK0NDPSR7R0NKLSJnY2oifQorY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfVEFHVkFSKExELCAkMSk9IiRMRCIKK19MVF9DQ19CQVNFTkFNRShbJGNvbXBpbGVyXSkKKworIyBHQ0ogZGlkIG5vdCBleGlzdCBhdCB0aGUgdGltZSBHQ0MgZGlkbid0IGltcGxpY2l0bHkgbGluayBsaWJjIGluLgorX0xUX1RBR1ZBUihhcmNoaXZlX2NtZHNfbmVlZF9sYywgJDEpPW5vCisKK19MVF9UQUdWQVIob2xkX2FyY2hpdmVfY21kcywgJDEpPSRvbGRfYXJjaGl2ZV9jbWRzCisKKyMjIENBVkVBVCBFTVBUT1I6CisjIyBUaGVyZSBpcyBubyBlbmNhcHN1bGF0aW9uIHdpdGhpbiB0aGUgZm9sbG93aW5nIG1hY3JvcywgZG8gbm90IGNoYW5nZQorIyMgdGhlIHJ1bm5pbmcgb3JkZXIgb3Igb3RoZXJ3aXNlIG1vdmUgdGhlbSBhcm91bmQgdW5sZXNzIHlvdSBrbm93IGV4YWN0bHkKKyMjIHdoYXQgeW91IGFyZSBkb2luZy4uLgoraWYgdGVzdCAtbiAiJGNvbXBpbGVyIjsgdGhlbgorICBfTFRfQ09NUElMRVJfTk9fUlRUSSgkMSkKKyAgX0xUX0NPTVBJTEVSX1BJQygkMSkKKyAgX0xUX0NPTVBJTEVSX0NfTygkMSkKKyAgX0xUX0NPTVBJTEVSX0ZJTEVfTE9DS1MoJDEpCisgIF9MVF9MSU5LRVJfU0hMSUJTKCQxKQorICBfTFRfTElOS0VSX0hBUkRDT0RFX0xJQlBBVEgoJDEpCisKKyAgX0xUX0NPTkZJRygkMSkKK2ZpCisKK0FDX0xBTkdfUkVTVE9SRQorCitHQ0M9JGx0X3NhdmVfR0NDCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfR0NKX0NPTkZJRworCisKKyMgX0xUX0xBTkdfUkNfQ09ORklHKFtUQUddKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVuc3VyZSB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBmb3IgdGhlIFdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIKKyMgYXJlIHN1aXRhYmx5IGRlZmluZWQuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHN1YnNlcXVlbnRseSB1c2VkIGJ5IF9MVF9DT05GSUcKKyMgdG8gd3JpdGUgdGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gdG8gYGxpYnRvb2wnLgorbTRfZGVmdW4oW19MVF9MQU5HX1JDX0NPTkZJR10sCitbQUNfUkVRVUlSRShbTFRfUFJPR19SQ10pZG5sCitBQ19MQU5HX1NBVkUKKworIyBTb3VyY2UgZmlsZSBleHRlbnNpb24gZm9yIFJDIHRlc3Qgc291cmNlcy4KK2FjX2V4dD1yYworCisjIE9iamVjdCBmaWxlIGV4dGVuc2lvbiBmb3IgY29tcGlsZWQgUkMgdGVzdCBzb3VyY2VzLgorb2JqZXh0PW8KK19MVF9UQUdWQVIob2JqZXh0LCAkMSk9JG9iamV4dAorCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgY29tcGlsZSB0ZXN0cworbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlPSdzYW1wbGUgTUVOVSB7IE1FTlVJVEVNICImU291cCIsIDEwMCwgQ0hFQ0tFRCB9JworCisjIENvZGUgdG8gYmUgdXNlZCBpbiBzaW1wbGUgbGluayB0ZXN0cworbHRfc2ltcGxlX2xpbmtfdGVzdF9jb2RlPSIkbHRfc2ltcGxlX2NvbXBpbGVfdGVzdF9jb2RlIgorCisjIGx0bWFpbiBvbmx5IHVzZXMgJENDIGZvciB0YWdnZWQgY29uZmlndXJhdGlvbnMgc28gbWFrZSBzdXJlICRDQyBpcyBzZXQuCitfTFRfVEFHX0NPTVBJTEVSCisKKyMgc2F2ZSB3YXJuaW5ncy9ib2lsZXJwbGF0ZSBvZiBzaW1wbGUgdGVzdCBjb2RlCitfTFRfQ09NUElMRVJfQk9JTEVSUExBVEUKK19MVF9MSU5LRVJfQk9JTEVSUExBVEUKKworIyBBbGxvdyBDQyB0byBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3VtZW50cy4KK2x0X3NhdmVfQ0M9IiRDQyIKK2x0X3NhdmVfR0NDPSRHQ0MKK0dDQz0KK0NDPSR7UkMtIndpbmRyZXMifQorY29tcGlsZXI9JENDCitfTFRfVEFHVkFSKGNvbXBpbGVyLCAkMSk9JENDCitfTFRfQ0NfQkFTRU5BTUUoWyRjb21waWxlcl0pCitfTFRfVEFHVkFSKGx0X2N2X3Byb2dfY29tcGlsZXJfY19vLCAkMSk9eWVzCisKK2lmIHRlc3QgLW4gIiRjb21waWxlciI7IHRoZW4KKyAgOgorICBfTFRfQ09ORklHKCQxKQorZmkKKworR0NDPSRsdF9zYXZlX0dDQworQUNfTEFOR19SRVNUT1JFCitDQz0iJGx0X3NhdmVfQ0MiCitdKSMgX0xUX0xBTkdfUkNfQ09ORklHCisKKworIyBMVF9QUk9HX0dDSgorIyAtLS0tLS0tLS0tLQorQUNfREVGVU4oW0xUX1BST0dfR0NKXSwKK1ttNF9pZmRlZihbQUNfUFJPR19HQ0pdLCBbQUNfUFJPR19HQ0pdLAorICBbbTRfaWZkZWYoW0FdW01fUFJPR19HQ0pdLCBbQV1bTV9QUk9HX0dDSl0sCisgICAgW0FDX0NIRUNLX1RPT0woR0NKLCBnY2osKQorICAgICAgdGVzdCAieCR7R0NKRkxBR1Mrc2V0fSIgPSB4c2V0IHx8IEdDSkZMQUdTPSItZyAtTzIiCisgICAgICBBQ19TVUJTVChHQ0pGTEFHUyldKV0pW11kbmwKK10pCisKKyMgT2xkIG5hbWU6CitBVV9BTElBUyhbTFRfQUNfUFJPR19HQ0pdLCBbTFRfUFJPR19HQ0pdKQorZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtMVF9BQ19QUk9HX0dDSl0sIFtdKQorCisKKyMgTFRfUFJPR19SQworIyAtLS0tLS0tLS0tCitBQ19ERUZVTihbTFRfUFJPR19SQ10sCitbQUNfQ0hFQ0tfVE9PTChSQywgd2luZHJlcywpCitdKQorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfUkNdLCBbTFRfUFJPR19SQ10pCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0xUX0FDX1BST0dfUkNdLCBbXSkKKworCisjIF9MVF9ERUNMX0VHUkVQCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBncmVwCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX0VHUkVQXSwKK1tBQ19SRVFVSVJFKFtBQ19QUk9HX0VHUkVQXSlkbmwKK0FDX1JFUVVJUkUoW0FDX1BST0dfRkdSRVBdKWRubAordGVzdCAteiAiJEdSRVAiICYmIEdSRVA9Z3JlcAorX0xUX0RFQ0woW10sIFtHUkVQXSwgWzFdLCBbQSBncmVwIHByb2dyYW0gdGhhdCBoYW5kbGVzIGxvbmcgbGluZXNdKQorX0xUX0RFQ0woW10sIFtFR1JFUF0sIFsxXSwgW0FuIEVSRSBtYXRjaGVyXSkKK19MVF9ERUNMKFtdLCBbRkdSRVBdLCBbMV0sIFtBIGxpdGVyYWwgc3RyaW5nIG1hdGNoZXJdKQorZG5sIE5vbi1ibGVlZGluZy1lZGdlIGF1dG9jb25mIGRvZXNuJ3Qgc3Vic3QgR1JFUCwgc28gZG8gaXQgaGVyZSB0b28KK0FDX1NVQlNUKFtHUkVQXSkKK10pCisKKworIyBfTFRfREVDTF9PQkpEVU1QCisjIC0tLS0tLS0tLS0tLS0tCisjIElmIHdlIGRvbid0IGhhdmUgYSBuZXcgZW5vdWdoIEF1dG9jb25mIHRvIGNob29zZSB0aGUgYmVzdCBvYmpkdW1wCisjIGF2YWlsYWJsZSwgY2hvb3NlIHRoZSBvbmUgZmlyc3QgaW4gdGhlIHVzZXIncyBQQVRILgorbTRfZGVmdW4oW19MVF9ERUNMX09CSkRVTVBdLAorW0FDX0NIRUNLX1RPT0woT0JKRFVNUCwgb2JqZHVtcCwgZmFsc2UpCit0ZXN0IC16ICIkT0JKRFVNUCIgJiYgT0JKRFVNUD1vYmpkdW1wCitfTFRfREVDTChbXSwgW09CSkRVTVBdLCBbMV0sIFtBbiBvYmplY3Qgc3ltYm9sIGR1bXBlcl0pCitBQ19TVUJTVChbT0JKRFVNUF0pCitdKQorCisKKyMgX0xUX0RFQ0xfU0VECisjIC0tLS0tLS0tLS0tLQorIyBDaGVjayBmb3IgYSBmdWxseS1mdW5jdGlvbmFsIHNlZCBwcm9ncmFtLCB0aGF0IHRydW5jYXRlcworIyBhcyBmZXcgY2hhcmFjdGVycyBhcyBwb3NzaWJsZS4gIFByZWZlciBHTlUgc2VkIGlmIGZvdW5kLgorbTRfZGVmdW4oW19MVF9ERUNMX1NFRF0sCitbQUNfUFJPR19TRUQKK3Rlc3QgLXogIiRTRUQiICYmIFNFRD1zZWQKK1hzZWQ9IiRTRUQgLWUgMXMvXlgvLyIKK19MVF9ERUNMKFtdLCBbU0VEXSwgWzFdLCBbQSBzZWQgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dF0pCitfTFRfREVDTChbXSwgW1hzZWRdLCBbIlwkU0VEIC1lIDFzL15YLy8iXSwKKyAgICBbU2VkIHRoYXQgaGVscHMgdXMgYXZvaWQgYWNjaWRlbnRhbGx5IHRyaWdnZXJpbmcgZWNobygxKSBvcHRpb25zIGxpa2UgLW5dKQorXSkjIF9MVF9ERUNMX1NFRAorCittNF9pZm5kZWYoW0FDX1BST0dfU0VEXSwgWworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PVEU6IFRoaXMgbWFjcm8gaGFzIGJlZW4gc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW50byAgICMKKyMgIEdOVSBBdXRvY29uZiBhcyBBQ19QUk9HX1NFRC4gIFdoZW4gaXQgaXMgYXZhaWxhYmxlIGluICAgIworIyAgYSByZWxlYXNlZCB2ZXJzaW9uIG9mIEF1dG9jb25mIHdlIHNob3VsZCByZW1vdmUgdGhpcyAgICAjCisjICBtYWNybyBhbmQgdXNlIGl0IGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCittNF9kZWZ1bihbQUNfUFJPR19TRURdLAorW0FDX01TR19DSEVDS0lORyhbZm9yIGEgc2VkIHRoYXQgZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0XSkKK0FDX0NBQ0hFX1ZBTChsdF9jdl9wYXRoX1NFRCwKK1sjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIHNlZCBhbmQgZ3NlZC4KKyMgVGhlbiB1c2UgdGhhdCBsaXN0IG9mIHNlZCdzIGFzIG9uZXMgdG8gdGVzdCBmb3IgdHJ1bmNhdGlvbi4KK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgZm9yIGx0X2FjX3Byb2cgaW4gc2VkIGdzZWQ7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBpZiAkYXNfZXhlY3V0YWJsZV9wICIkYXNfZGlyLyRsdF9hY19wcm9nJGFjX2V4ZWNfZXh0IjsgdGhlbgorICAgICAgICBsdF9hY19zZWRfbGlzdD0iJGx0X2FjX3NlZF9saXN0ICRhc19kaXIvJGx0X2FjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorZG9uZQorSUZTPSRhc19zYXZlX0lGUworbHRfYWNfbWF4PTAKK2x0X2FjX2NvdW50PTAKKyMgQWRkIC91c3IveHBnNC9iaW4vc2VkIGFzIGl0IGlzIHR5cGljYWxseSBmb3VuZCBvbiBTb2xhcmlzCisjIGFsb25nIHdpdGggL2Jpbi9zZWQgdGhhdCB0cnVuY2F0ZXMgb3V0cHV0LgorZm9yIGx0X2FjX3NlZCBpbiAkbHRfYWNfc2VkX2xpc3QgL3Vzci94cGc0L2Jpbi9zZWQ7IGRvCisgIHRlc3QgISAtZiAkbHRfYWNfc2VkICYmIGNvbnRpbnVlCisgIGNhdCAvZGV2L251bGwgPiBjb25mdGVzdC5pbgorICBsdF9hY19jb3VudD0wCisgIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID5jb25mdGVzdC5pbgorICAjIENoZWNrIGZvciBHTlUgc2VkIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgIGlmICIkbHRfYWNfc2VkIiAtLXZlcnNpb24gMj4mMSA8IC9kZXYvbnVsbCB8IGdyZXAgJ0dOVScgPiAvZGV2L251bGw7IHRoZW4KKyAgICBsdF9jdl9wYXRoX1NFRD0kbHRfYWNfc2VkCisgICAgYnJlYWsKKyAgZmkKKyAgd2hpbGUgdHJ1ZTsgZG8KKyAgICBjYXQgY29uZnRlc3QuaW4gY29uZnRlc3QuaW4gPmNvbmZ0ZXN0LnRtcAorICAgIG12IGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5pbgorICAgIGNwIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm5sCisgICAgZWNobyA+PmNvbmZ0ZXN0Lm5sCisgICAgJGx0X2FjX3NlZCAtZSAncy9hJC8vJyA8IGNvbmZ0ZXN0Lm5sID5jb25mdGVzdC5vdXQgfHwgYnJlYWsKKyAgICBjbXAgLXMgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0Lm5sIHx8IGJyZWFrCisgICAgIyAxMDAwMCBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkbHRfYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgICAgbHRfYWNfY291bnQ9YGV4cHIgJGx0X2FjX2NvdW50ICsgMWAKKyAgICBpZiB0ZXN0ICRsdF9hY19jb3VudCAtZ3QgJGx0X2FjX21heDsgdGhlbgorICAgICAgbHRfYWNfbWF4PSRsdF9hY19jb3VudAorICAgICAgbHRfY3ZfcGF0aF9TRUQ9JGx0X2FjX3NlZAorICAgIGZpCisgIGRvbmUKK2RvbmUKK10pCitTRUQ9JGx0X2N2X3BhdGhfU0VECitBQ19TVUJTVChbU0VEXSkKK0FDX01TR19SRVNVTFQoWyRTRURdKQorXSkjQUNfUFJPR19TRUQKK10pI200X2lmbmRlZgorCisjIE9sZCBuYW1lOgorQVVfQUxJQVMoW0xUX0FDX1BST0dfU0VEXSwgW0FDX1BST0dfU0VEXSkKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbTFRfQUNfUFJPR19TRURdLCBbXSkKKworCisjIF9MVF9DSEVDS19TSEVMTF9GRUFUVVJFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmluZCBvdXQgd2hldGhlciB0aGUgc2hlbGwgaXMgQm91cm5lIG9yIFhTSSBjb21wYXRpYmxlLAorIyBvciBoYXMgc29tZSBvdGhlciB1c2VmdWwgZmVhdHVyZXMuCittNF9kZWZ1bihbX0xUX0NIRUNLX1NIRUxMX0ZFQVRVUkVTXSwKK1tBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzIHNvbWUgWFNJIGNvbnN0cnVjdHNdKQorIyBUcnkgc29tZSBYU0kgZmVhdHVyZXMKK3hzaV9zaGVsbD1ubworKCBfbHRfZHVtbXk9ImEvYi9jIgorICB0ZXN0ICIke19sdF9kdW1teSMjKi99LCR7X2x0X2R1bW15JS8qfSwiJHtfbHRfZHVtbXklIiRfbHRfZHVtbXkifSwgXAorICAgICAgPSBjLGEvYiwsIFwKKyAgICAmJiBldmFsICd0ZXN0ICQoKCAxICsgMSApKSAtZXEgMiBcCisgICAgJiYgdGVzdCAiJHsjX2x0X2R1bW15fSIgLWVxIDUnICkgPi9kZXYvbnVsbCAyPiYxIFwKKyAgJiYgeHNpX3NoZWxsPXllcworQUNfTVNHX1JFU1VMVChbJHhzaV9zaGVsbF0pCitfTFRfQ09ORklHX0xJQlRPT0xfSU5JVChbeHNpX3NoZWxsPSckeHNpX3NoZWxsJ10pCisKK0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgc2hlbGwgdW5kZXJzdGFuZHMgIis9Il0pCitsdF9zaGVsbF9hcHBlbmQ9bm8KKyggZm9vPWJhcjsgc2V0IGZvbyBiYXo7IGV2YWwgIiRbMV0rPVwkWzJdIiAmJiB0ZXN0ICIkZm9vIiA9IGJhcmJheiApIFwKKyAgICA+L2Rldi9udWxsIDI+JjEgXAorICAmJiBsdF9zaGVsbF9hcHBlbmQ9eWVzCitBQ19NU0dfUkVTVUxUKFskbHRfc2hlbGxfYXBwZW5kXSkKK19MVF9DT05GSUdfTElCVE9PTF9JTklUKFtsdF9zaGVsbF9hcHBlbmQ9JyRsdF9zaGVsbF9hcHBlbmQnXSkKKworaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGx0X3Vuc2V0PXVuc2V0CitlbHNlCisgIGx0X3Vuc2V0PWZhbHNlCitmaQorX0xUX0RFQ0woW10sIFtsdF91bnNldF0sIFswXSwgW3doZXRoZXIgdGhlIHNoZWxsIHVuZGVyc3RhbmRzICJ1bnNldCJdKWRubAorCisjIHRlc3QgRUJDRElDIG9yIEFTQ0lJCitjYXNlIGBlY2hvIFh8dHIgWCAnXDEwMSdgIGluCisgQSkgIyBBU0NJSSBiYXNlZCBzeXN0ZW0KKyAgICAjIFxuIGlzIG5vdCBpbnRlcnByZXRlZCBjb3JyZWN0bHkgYnkgU29sYXJpcyA4IC91c3IvdWNiL3RyCisgIGx0X1NQMk5MPSd0ciBcMDQwIFwwMTInCisgIGx0X05MMlNQPSd0ciBcMDE1XDAxMiBcMDQwXDA0MCcKKyAgOzsKKyAqKSAjIEVCQ0RJQyBiYXNlZCBzeXN0ZW0KKyAgbHRfU1AyTkw9J3RyIFwxMDAgXG4nCisgIGx0X05MMlNQPSd0ciBcclxuIFwxMDBcMTAwJworICA7OworZXNhYworX0xUX0RFQ0woW1NQMk5MXSwgW2x0X1NQMk5MXSwgWzFdLCBbdHVybiBzcGFjZXMgaW50byBuZXdsaW5lc10pZG5sCitfTFRfREVDTChbTkwyU1BdLCBbbHRfTkwyU1BdLCBbMV0sIFt0dXJuIG5ld2xpbmVzIGludG8gc3BhY2VzXSlkbmwKK10pIyBfTFRfQ0hFQ0tfU0hFTExfRkVBVFVSRVMKKworCisjIF9MVF9QUk9HX1hTSV9TSEVMTEZOUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQm91cm5lIGFuZCBYU0kgY29tcGF0aWJsZSB2YXJpYW50cyBvZiBzb21lIHVzZWZ1bCBzaGVsbCBmdW5jdGlvbnMuCittNF9kZWZ1bihbX0xUX1BST0dfWFNJX1NIRUxMRk5TXSwKK1tjYXNlICR4c2lfc2hlbGwgaW4KKyAgeWVzKQorICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgZnVuY19kaXJuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LAorIyBvdGhlcndpc2Ugc2V0IHJlc3VsdCB0byBOT05ESVJfUkVQTEFDRU1FTlQuCitmdW5jX2Rpcm5hbWUgKCkKK3sKKyAgY2FzZSAkezF9IGluCisgICAgKi8qKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezElLyp9JHsyfSIgOzsKKyAgICAqICApIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiR7M30iIDs7CisgIGVzYWMKK30KKworIyBmdW5jX2Jhc2VuYW1lIGZpbGUKK2Z1bmNfYmFzZW5hbWUgKCkKK3sKKyAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9IiR7MSMjKi99IgorfQorCisjIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgZmlsZSBhcHBlbmQgbm9uZGlyX3JlcGxhY2VtZW50CisjIHBlcmZvcm0gZnVuY19iYXNlbmFtZSBhbmQgZnVuY19kaXJuYW1lIGluIGEgc2luZ2xlIGZ1bmN0aW9uCisjIGNhbGw6CisjICAgZGlybmFtZTogIENvbXB1dGUgdGhlIGRpcm5hbWUgb2YgRklMRS4gIElmIG5vbmVtcHR5LAorIyAgICAgICAgICAgICBhZGQgQVBQRU5EIHRvIHRoZSByZXN1bHQsIG90aGVyd2lzZSBzZXQgcmVzdWx0CisjICAgICAgICAgICAgIHRvIE5PTkRJUl9SRVBMQUNFTUVOVC4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dXJuZWQgaW4gIiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorIyAgIGJhc2VuYW1lOiBDb21wdXRlIGZpbGVuYW1lIG9mIEZJTEUuCisjICAgICAgICAgICAgIHZhbHVlIHJldHVuZWQgaW4gIiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyMgSW1wbGVtZW50YXRpb24gbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIGZ1bmNfZGlybmFtZQorIyBhbmQgZnVuY19iYXNlbmFtZS4gRm9yIGVmZmljaWVuY3ksIHdlIGRvIG5vdCBkZWxlZ2F0ZSB0bworIyB0aG9zZSBmdW5jdGlvbnMgYnV0IGluc3RlYWQgZHVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IGhlcmUuCitmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICgpCit7CisgIGNhc2UgJHsxfSBpbgorICAgICovKikgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHsxJS8qfSR7Mn0iIDs7CisgICAgKiAgKSBmdW5jX2Rpcm5hbWVfcmVzdWx0PSIkezN9IiA7OworICBlc2FjCisgIGZ1bmNfYmFzZW5hbWVfcmVzdWx0PSIkezEjIyovfSIKK30KKworIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCitmdW5jX3N0cmlwbmFtZSAoKQoreworICAjIHBka3NoIDUuMi4xNCBkb2VzIG5vdCBkbyAke1glJFl9IGNvcnJlY3RseSBpZiBib3RoIFggYW5kIFkgYXJlCisgICMgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBzbyBhc3NpZ24gb25lIHRvIG9yZGluYXJ5IHBhcmFtZXRlciBmaXJzdC4KKyAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7M30KKyAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0IyIkezF9In0KKyAgZnVuY19zdHJpcG5hbWVfcmVzdWx0PSR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0JSIkezJ9In0KK30KKworIyBmdW5jX29wdF9zcGxpdAorZnVuY19vcHRfc3BsaXQgKCkKK3sKKyAgZnVuY19vcHRfc3BsaXRfb3B0PSR7MSUlPSp9CisgIGZ1bmNfb3B0X3NwbGl0X2FyZz0kezEjKj19Cit9CisKKyMgZnVuY19sbzJvIG9iamVjdAorZnVuY19sbzJvICgpCit7CisgIGNhc2UgJHsxfSBpbgorICAgICoubG8pIGZ1bmNfbG8yb19yZXN1bHQ9JHsxJS5sb30uJHtvYmpleHR9IDs7CisgICAgKikgICAgZnVuY19sbzJvX3Jlc3VsdD0kezF9IDs7CisgIGVzYWMKK30KKworIyBmdW5jX3hmb3JtIGxpYm9iai1vci1zb3VyY2UKK2Z1bmNfeGZvcm0gKCkKK3sKKyAgZnVuY194Zm9ybV9yZXN1bHQ9JHsxJS4qfS5sbworfQorCisjIGZ1bmNfYXJpdGggYXJpdGhtZXRpYy10ZXJtLi4uCitmdW5jX2FyaXRoICgpCit7CisgIGZ1bmNfYXJpdGhfcmVzdWx0PSQoKCAkWypdICkpCit9CisKKyMgZnVuY19sZW4gc3RyaW5nCisjIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCitmdW5jX2xlbiAoKQoreworICBmdW5jX2xlbl9yZXN1bHQ9JHsjMX0KK30KKworX0xUX0VPRgorICAgIDs7CisgICopICMgQm91cm5lIGNvbXBhdGlibGUgZnVuY3Rpb25zLgorICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgZnVuY19kaXJuYW1lIGZpbGUgYXBwZW5kIG5vbmRpcl9yZXBsYWNlbWVudAorIyBDb21wdXRlIHRoZSBkaXJuYW1lIG9mIEZJTEUuICBJZiBub25lbXB0eSwgYWRkIEFQUEVORCB0byB0aGUgcmVzdWx0LAorIyBvdGhlcndpc2Ugc2V0IHJlc3VsdCB0byBOT05ESVJfUkVQTEFDRU1FTlQuCitmdW5jX2Rpcm5hbWUgKCkKK3sKKyAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKyAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkZGlybmFtZSJgCisgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgZWxzZQorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgZmkKK30KKworIyBmdW5jX2Jhc2VuYW1lIGZpbGUKK2Z1bmNfYmFzZW5hbWUgKCkKK3sKKyAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKK30KKworZG5sIGZ1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUKK2RubCBBIHBvcnRhYmxlIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZ2VuZXJhbC5tNHNoCitkbmwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgaXQgaGVyZS4KKworIyBmdW5jX3N0cmlwbmFtZSBwcmVmaXggc3VmZml4IG5hbWUKKyMgc3RyaXAgUFJFRklYIGFuZCBTVUZGSVggb2ZmIG9mIE5BTUUuCisjIFBSRUZJWCBhbmQgU1VGRklYIG11c3Qgbm90IGNvbnRhaW4gZ2xvYmJpbmcgb3IgcmVnZXggc3BlY2lhbAorIyBjaGFyYWN0ZXJzLCBoYXNoZXMsIHBlcmNlbnQgc2lnbnMsIGJ1dCBTVUZGSVggbWF5IGNvbnRhaW4gYSBsZWFkaW5nCisjIGRvdCAoaW4gd2hpY2ggY2FzZSB0aGF0IG1hdGNoZXMgb25seSBhIGRvdCkuCisjIGZ1bmNfc3RyaXBfc3VmZml4IHByZWZpeCBuYW1lCitmdW5jX3N0cmlwbmFtZSAoKQoreworICBjYXNlICR7Mn0gaW4KKyAgICAuKikgZnVuY19zdHJpcG5hbWVfcmVzdWx0PWAkRUNITyAiWCR7M30iIFwKKyAgICAgICAgICAgfCAkWHNlZCAtZSAicyVeJHsxfSUlIiAtZSAicyVcXFxcJHsyfVwkJSUiYDs7CisgICAgKikgIGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezN9IiBcCisgICAgICAgICAgIHwgJFhzZWQgLWUgInMlXiR7MX0lJSIgLWUgInMlJHsyfVwkJSUiYDs7CisgIGVzYWMKK30KKworIyBzZWQgc2NyaXB0czoKK215X3NlZF9sb25nX29wdD0nMXMvXlwoLVtbXj1dXSpcKT0uKi9cMS87cScKK215X3NlZF9sb25nX2FyZz0nMXMvXi1bW149XV0qPS8vJworCisjIGZ1bmNfb3B0X3NwbGl0CitmdW5jX29wdF9zcGxpdCAoKQoreworICBmdW5jX29wdF9zcGxpdF9vcHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJG15X3NlZF9sb25nX29wdCJgCisgIGZ1bmNfb3B0X3NwbGl0X2FyZz1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkbXlfc2VkX2xvbmdfYXJnImAKK30KKworIyBmdW5jX2xvMm8gb2JqZWN0CitmdW5jX2xvMm8gKCkKK3sKKyAgZnVuY19sbzJvX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkbG8ybyJgCit9CisKKyMgZnVuY194Zm9ybSBsaWJvYmotb3Itc291cmNlCitmdW5jX3hmb3JtICgpCit7CisgIGZ1bmNfeGZvcm1fcmVzdWx0PWAkRUNITyAiWCR7MX0iIHwgJFhzZWQgLWUgJ3MvXC5bW14uXV0qJC8ubG8vJ2AKK30KKworIyBmdW5jX2FyaXRoIGFyaXRobWV0aWMtdGVybS4uLgorZnVuY19hcml0aCAoKQoreworICBmdW5jX2FyaXRoX3Jlc3VsdD1gZXhwciAiJFtAXSJgCit9CisKKyMgZnVuY19sZW4gc3RyaW5nCisjIFNUUklORyBtYXkgbm90IHN0YXJ0IHdpdGggYSBoeXBoZW4uCitmdW5jX2xlbiAoKQoreworICBmdW5jX2xlbl9yZXN1bHQ9YGV4cHIgIiRbMV0iIDogIi4qIiAyPi9kZXYvbnVsbCB8fCBlY2hvICRtYXhfY21kX2xlbmAKK30KKworX0xUX0VPRgorZXNhYworCitjYXNlICRsdF9zaGVsbF9hcHBlbmQgaW4KKyAgeWVzKQorICAgIGNhdCA8PCBcX0xUX0VPRiA+PiAiJGNmZ2ZpbGUiCisKKyMgZnVuY19hcHBlbmQgdmFyIHZhbHVlCisjIEFwcGVuZCBWQUxVRSB0byB0aGUgZW5kIG9mIHNoZWxsIHZhcmlhYmxlIFZBUi4KK2Z1bmNfYXBwZW5kICgpCit7CisgIGV2YWwgIiRbMV0rPVwkWzJdIgorfQorX0xUX0VPRgorICAgIDs7CisgICopCisgICAgY2F0IDw8IFxfTFRfRU9GID4+ICIkY2ZnZmlsZSIKKworIyBmdW5jX2FwcGVuZCB2YXIgdmFsdWUKKyMgQXBwZW5kIFZBTFVFIHRvIHRoZSBlbmQgb2Ygc2hlbGwgdmFyaWFibGUgVkFSLgorZnVuY19hcHBlbmQgKCkKK3sKKyAgZXZhbCAiJFsxXT1cJCRbMV1cJFsyXSIKK30KKworX0xUX0VPRgorICAgIDs7CisgIGVzYWMKK10pCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9sdG9wdGlvbnMubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9sdG9wdGlvbnMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxNTFhMwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2x0b3B0aW9ucy5tNApAQCAtMCwwICsxLDM2OCBAQAorIyBIZWxwZXIgZnVuY3Rpb25zIGZvciBvcHRpb24gaGFuZGxpbmcuICAgICAgICAgICAgICAgICAgICAtKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgR2FyeSBWLiBWYXVnaGFuLCAyMDA0CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGdpdmVzCisjIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBzZXJpYWwgNiBsdG9wdGlvbnMubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVE9QVElPTlNfVkVSU0lPTl0sIFttNF9pZihbMV0pXSkKKworCisjIF9MVF9NQU5HTEVfT1BUSU9OKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbX0xUX01BTkdMRV9PUFRJT05dLAorW1tfTFRfT1BUSU9OX11tNF9icGF0c3Vic3QoJDFfXyQyLCBbW15hLXpBLVowLTlfXV0sIFtfXSldKQorCisKKyMgX0xUX1NFVF9PUFRJT04oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgb3B0aW9uIE9QVElPTi1OQU1FIGZvciBtYWNybyBNQUNSTy1OQU1FLCBhbmQgaWYgdGhlcmUgaXMgYQorIyBtYXRjaGluZyBoYW5kbGVyIGRlZmluZWQsIGRpc3BhdGNoIHRvIGl0LiAgT3RoZXIgT1BUSU9OLU5BTUVzIGFyZQorIyBzYXZlZCBhcyBhIGZsYWcuCittNF9kZWZpbmUoW19MVF9TRVRfT1BUSU9OXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSkpZG5sCittNF9pZmRlZihfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgICAgICBfTFRfTUFOR0xFX0RFRlVOKFskMV0sIFskMl0pLAorICAgIFttNF93YXJuaW5nKFtVbmtub3duICQxIG9wdGlvbiBgJDInXSldKVtdZG5sCitdKQorCisKKyMgX0xUX0lGX09QVElPTihNQUNSTy1OQU1FLCBPUFRJT04tTkFNRSwgSUYtU0VULCBbSUYtTk9ULVNFVF0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLVNFVCBpZiBPUFRJT04gaXMgc2V0LCBJRi1OT1QtU0VUIG90aGVyd2lzZS4KK200X2RlZmluZShbX0xUX0lGX09QVElPTl0sCitbbTRfaWZkZWYoX0xUX01BTkdMRV9PUFRJT04oWyQxXSwgWyQyXSksIFskM10sIFskNF0pXSkKKworCisjIF9MVF9VTkxFU1NfT1BUSU9OUyhNQUNSTy1OQU1FLCBPUFRJT04tTElTVCwgSUYtTk9ULVNFVCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeGVjdXRlIElGLU5PVC1TRVQgdW5sZXNzIGFsbCBvcHRpb25zIGluIE9QVElPTi1MSVNUIGZvciBNQUNSTy1OQU1FCisjIGFyZSBzZXQuCittNF9kZWZpbmUoW19MVF9VTkxFU1NfT1BUSU9OU10sCitbbTRfZm9yZWFjaChbX0xUX09wdGlvbl0sIG00X3NwbGl0KG00X25vcm1hbGl6ZShbJDJdKSksCisJICAgIFttNF9pZmRlZihfTFRfTUFOR0xFX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKSwKKwkJICAgICAgW200X2RlZmluZShbJDBfZm91bmRdKV0pXSlbXWRubAorbTRfaWZkZWYoWyQwX2ZvdW5kXSwgW200X3VuZGVmaW5lKFskMF9mb3VuZF0pXSwgWyQzCitdKVtdZG5sCitdKQorCisKKyMgX0xUX1NFVF9PUFRJT05TKE1BQ1JPLU5BTUUsIE9QVElPTi1MSVNUKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE9QVElPTi1MSVNUIGlzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgTGlidG9vbCBvcHRpb25zIGFzc29jaWF0ZWQKKyMgd2l0aCBNQUNSTy1OQU1FLiAgSWYgYW55IE9QVElPTiBoYXMgYSBtYXRjaGluZyBoYW5kbGVyIGRlY2xhcmVkIHdpdGgKKyMgTFRfT1BUSU9OX0RFRklORSwgZGlzcGF0Y2ggdG8gdGhhdCBtYWNybzsgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0CisjIHRoZSB1bmtub3duIG9wdGlvbiBhbmQgZXhpdC4KK200X2RlZnVuKFtfTFRfU0VUX09QVElPTlNdLAorWyMgU2V0IG9wdGlvbnMKK200X2ZvcmVhY2goW19MVF9PcHRpb25dLCBtNF9zcGxpdChtNF9ub3JtYWxpemUoWyQyXSkpLAorICAgIFtfTFRfU0VUX09QVElPTihbJDFdLCBfTFRfT3B0aW9uKV0pCisKK200X2lmKFskMV0sW0xUX0lOSVRdLFsKKyAgZG5sCisgIGRubCBTaW1wbHkgc2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKGkuZSBvZmYpIGlmIGJvb2xlYW4gb3B0aW9ucyB3ZXJlIG5vdAorICBkbmwgc3BlY2lmaWVkOgorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49bm8KKyAgXSkKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3dpbjMyLWRsbF0sIFtlbmFibGVfd2luMzJfZGxsPW5vCisgIF0pCisgIGRubAorICBkbmwgSWYgbm8gcmVmZXJlbmNlIHdhcyBtYWRlIHRvIHZhcmlvdXMgcGFpcnMgb2Ygb3Bwb3Npbmcgb3B0aW9ucywgdGhlbgorICBkbmwgd2UgcnVuIHRoZSBkZWZhdWx0IG1vZGUgaGFuZGxlciBmb3IgdGhlIHBhaXIuICBGb3IgZXhhbXBsZSwgaWYgbmVpdGhlcgorICBkbmwgYHNoYXJlZCcgbm9yIGBkaXNhYmxlLXNoYXJlZCcgd2FzIHBhc3NlZCwgd2UgZW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZAorICBkbmwgYXJjaGl2ZXMgYnkgZGVmYXVsdDoKKyAgX0xUX1VOTEVTU19PUFRJT05TKFtMVF9JTklUXSwgW3NoYXJlZCBkaXNhYmxlLXNoYXJlZF0sIFtfTFRfRU5BQkxFX1NIQVJFRF0pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtzdGF0aWMgZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUNdKQorICBfTFRfVU5MRVNTX09QVElPTlMoW0xUX0lOSVRdLCBbcGljLW9ubHkgbm8tcGljXSwgW19MVF9XSVRIX1BJQ10pCisgIF9MVF9VTkxFU1NfT1BUSU9OUyhbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGwgZGlzYWJsZS1mYXN0LWluc3RhbGxdLAorICAJCSAgIFtfTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pCisgIF0pCitdKSMgX0xUX1NFVF9PUFRJT05TCisKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWNyb3MgdG8gaGFuZGxlIExUX0lOSVQgb3B0aW9ucy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIF9MVF9NQU5HTEVfREVGVU4oTUFDUk8tTkFNRSwgT1BUSU9OLU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW19MVF9NQU5HTEVfREVGVU5dLAorW1tfTFRfT1BUSU9OX0RFRlVOX11tNF9icGF0c3Vic3QobTRfdG91cHBlcihbJDFfXyQyXSksIFtbXkEtWjAtOV9dXSwgW19dKV0pCisKKworIyBMVF9PUFRJT05fREVGSU5FKE1BQ1JPLU5BTUUsIE9QVElPTi1OQU1FLCBDT0RFKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtMVF9PUFRJT05fREVGSU5FXSwKK1ttNF9kZWZpbmUoX0xUX01BTkdMRV9ERUZVTihbJDFdLCBbJDJdKSwgWyQzXSlbXWRubAorXSkjIExUX09QVElPTl9ERUZJTkUKKworCisjIGRsb3BlbgorIyAtLS0tLS0KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGxvcGVuXSwgW2VuYWJsZV9kbG9wZW49eWVzCitdKQorCitBVV9ERUZVTihbQUNfTElCVE9PTF9ETE9QRU5dLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rsb3Blbl0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgZGxvcGVuJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FDX0xJQlRPT0xfRExPUEVOXSwgW10pCisKKworIyB3aW4zMi1kbGwKKyMgLS0tLS0tLS0tCisjIERlY2xhcmUgcGFja2FnZSBzdXBwb3J0IGZvciBidWlsZGluZyB3aW4zMiBkbGwncy4KK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbd2luMzItZGxsXSwKK1tlbmFibGVfd2luMzJfZGxsPXllcworCitjYXNlICRob3N0IGluCisqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLWNlZ2NjKikKKyAgQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQorICBBQ19DSEVDS19UT09MKE9CSkRVTVAsIG9iamR1bXAsIGZhbHNlKQorICA7OworZXNhYworCit0ZXN0IC16ICIkQVMiICYmIEFTPWFzCitfTFRfREVDTChbXSwgW0FTXSwgICAgICBbMF0sIFtBc3NlbWJsZXIgcHJvZ3JhbV0pZG5sCisKK3Rlc3QgLXogIiRETExUT09MIiAmJiBETExUT09MPWRsbHRvb2wKK19MVF9ERUNMKFtdLCBbRExMVE9PTF0sIFswXSwgW0RMTCBjcmVhdGlvbiBwcm9ncmFtXSlkbmwKKwordGVzdCAteiAiJE9CSkRVTVAiICYmIE9CSkRVTVA9b2JqZHVtcAorX0xUX0RFQ0woW10sIFtPQkpEVU1QXSwgWzBdLCBbT2JqZWN0IGR1bXBlciBwcm9ncmFtXSlkbmwKK10pIyB3aW4zMi1kbGwKKworQVVfREVGVU4oW0FDX0xJQlRPT0xfV0lOMzJfRExMXSwKK1tBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCitfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFt3aW4zMi1kbGxdKQorQUNfRElBR05PU0UoW29ic29sZXRlXSwKK1skMDogUmVtb3ZlIHRoaXMgd2FybmluZyBhbmQgdGhlIGNhbGwgdG8gX0xUX1NFVF9PUFRJT04gd2hlbiB5b3UKK3B1dCB0aGUgYHdpbjMyLWRsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19MSUJUT09MX1dJTjMyX0RMTF0sIFtdKQorCisKKyMgX0xUX0VOQUJMRV9TSEFSRUQoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcsIGFuZCBzdXBwb3J0cyB0aGUgYHNoYXJlZCcgYW5kCisjIGBkaXNhYmxlLXNoYXJlZCcgTFRfSU5JVCBvcHRpb25zLgorIyBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gYHllcycuCittNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEXSwKK1ttNF9kZWZpbmUoW19MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBbbTRfaWYoJDEsIG5vLCBubywgeWVzKV0pZG5sCitBQ19BUkdfRU5BQkxFKFtzaGFyZWRdLAorICAgIFtBU19IRUxQX1NUUklORyhbLS1lbmFibGUtc2hhcmVkQDw6QD1QS0dTQDo+QF0sCisJW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9XV9MVF9FTkFCTEVfU0hBUkVEX0RFRkFVTFRbQDo+QF0pXSwKKyAgICBbcD0ke1BBQ0tBR0UtZGVmYXVsdH0KKyAgICBjYXNlICRlbmFibGV2YWwgaW4KKyAgICB5ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7CisgICAgbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKyAgICAqKQorICAgICAgZW5hYmxlX3NoYXJlZD1ubworICAgICAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgorICAgICAgbHRfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSRQQVRIX1NFUEFSQVRPUiwiCisgICAgICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCisJSUZTPSIkbHRfc2F2ZV9pZnMiCisJaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KKwkgIGVuYWJsZV9zaGFyZWQ9eWVzCisJZmkKKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJGx0X3NhdmVfaWZzIgorICAgICAgOzsKKyAgICBlc2FjXSwKKyAgICBbZW5hYmxlX3NoYXJlZD1dX0xUX0VOQUJMRV9TSEFSRURfREVGQVVMVCkKKworICAgIF9MVF9ERUNMKFtidWlsZF9saWJ0b29sX2xpYnNdLCBbZW5hYmxlX3NoYXJlZF0sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TSEFSRUQKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zaGFyZWRdLCBbX0xUX0VOQUJMRV9TSEFSRUQoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU0hBUkVEXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3NoYXJlZF0pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TSEFSRURdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc2hhcmVkXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU0hBUkVEXSwgW0FDX0VOQUJMRV9TSEFSRUQoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NIQVJFRF0sIFtBQ19ESVNBQkxFX1NIQVJFRCgkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TSEFSRURdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TSEFSRURdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9TVEFUSUMoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgc3RhdGljJyBhbmQKKyMgYGRpc2FibGUtc3RhdGljJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW3N0YXRpY10sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zdGF0aWNAPDpAPVBLR1NAOj5AXSwKKwlbYnVpbGQgc3RhdGljIGxpYnJhcmllcyBAPDpAZGVmYXVsdD1dX0xUX0VOQUJMRV9TVEFUSUNfREVGQVVMVFtAOj5AXSldLAorICAgIFtwPSR7UEFDS0FHRS1kZWZhdWx0fQorICAgIGNhc2UgJGVuYWJsZXZhbCBpbgorICAgIHllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKKyAgICBubykgZW5hYmxlX3N0YXRpYz1ubyA7OworICAgICopCisgICAgIGVuYWJsZV9zdGF0aWM9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfc3RhdGljPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9zdGF0aWM9XV9MVF9FTkFCTEVfU1RBVElDX0RFRkFVTFQpCisKKyAgICBfTFRfREVDTChbYnVpbGRfb2xkX2xpYnNdLCBbZW5hYmxlX3N0YXRpY10sIFswXSwKKwlbV2hldGhlciBvciBub3QgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllc10pCitdKSMgX0xUX0VOQUJMRV9TVEFUSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtzdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1zdGF0aWNdLCBbX0xUX0VOQUJMRV9TVEFUSUMoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FDX0RFRlVOKFtBQ19FTkFCTEVfU1RBVElDXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW3N0YXRpY10pCitdKQorCitBQ19ERUZVTihbQUNfRElTQUJMRV9TVEFUSUNdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtc3RhdGljXSkKK10pCisKK0FVX0RFRlVOKFtBTV9FTkFCTEVfU1RBVElDXSwgW0FDX0VOQUJMRV9TVEFUSUMoJEApXSkKK0FVX0RFRlVOKFtBTV9ESVNBQkxFX1NUQVRJQ10sIFtBQ19ESVNBQkxFX1NUQVRJQygkQCldKQorCitkbmwgYWNsb2NhbC0xLjQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CitkbmwgQUNfREVGVU4oW0FNX0VOQUJMRV9TVEFUSUNdLCBbXSkKK2RubCBBQ19ERUZVTihbQU1fRElTQUJMRV9TVEFUSUNdLCBbXSkKKworCisKKyMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW0RFRkFVTFRdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcsIGFuZCBzdXBwb3J0IHRoZSBgZmFzdC1pbnN0YWxsJworIyBhbmQgYGRpc2FibGUtZmFzdC1pbnN0YWxsJyBMVF9JTklUIG9wdGlvbnMuCisjIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byBgeWVzJy4KK200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExdLAorW200X2RlZmluZShbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIFttNF9pZigkMSwgbm8sIG5vLCB5ZXMpXSlkbmwKK0FDX0FSR19FTkFCTEUoW2Zhc3QtaW5zdGFsbF0sCisgICAgW0FTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1mYXN0LWluc3RhbGxAPDpAPVBLR1NAOj5AXSwKKyAgICBbb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIEA8OkBkZWZhdWx0PV1fTFRfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUW0A6PkBdKV0sCisgICAgW3A9JHtQQUNLQUdFLWRlZmF1bHR9CisgICAgY2FzZSAkZW5hYmxldmFsIGluCisgICAgeWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7OworICAgIG5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7CisgICAgKikKKyAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KKyAgICAgICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KKyAgICAgIGx0X3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30kUEFUSF9TRVBBUkFUT1IsIgorICAgICAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbworCUlGUz0iJGx0X3NhdmVfaWZzIgorCWlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCisJICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcworCWZpCisgICAgICBkb25lCisgICAgICBJRlM9IiRsdF9zYXZlX2lmcyIKKyAgICAgIDs7CisgICAgZXNhY10sCisgICAgW2VuYWJsZV9mYXN0X2luc3RhbGw9XV9MVF9FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpCisKK19MVF9ERUNMKFtmYXN0X2luc3RhbGxdLCBbZW5hYmxlX2Zhc3RfaW5zdGFsbF0sIFswXSwKKwkgW1doZXRoZXIgb3Igbm90IHRvIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbl0pZG5sCitdKSMgX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtmYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbZGlzYWJsZS1mYXN0LWluc3RhbGxdLCBbX0xUX0VOQUJMRV9GQVNUX0lOU1RBTEwoW25vXSldKQorCisjIE9sZCBuYW1lczoKK0FVX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIG00X2lmKFskMV0sIFtub10sIFtkaXNhYmxlLV0pW2Zhc3QtaW5zdGFsbF0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdSBwdXQKK3RoZSBgZmFzdC1pbnN0YWxsJyBvcHRpb24gaW50byBMVF9JTklUJ3MgZmlyc3QgcGFyYW1ldGVyLl0pCitdKQorCitBVV9ERUZVTihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAorW19MVF9TRVRfT1BUSU9OKFtMVF9JTklUXSwgW2Rpc2FibGUtZmFzdC1pbnN0YWxsXSkKK0FDX0RJQUdOT1NFKFtvYnNvbGV0ZV0sCitbJDA6IFJlbW92ZSB0aGlzIHdhcm5pbmcgYW5kIHRoZSBjYWxsIHRvIF9MVF9TRVRfT1BUSU9OIHdoZW4geW91IHB1dAordGhlIGBkaXNhYmxlLWZhc3QtaW5zdGFsbCcgb3B0aW9uIGludG8gTFRfSU5JVCdzIGZpcnN0IHBhcmFtZXRlci5dKQorXSkKKworZG5sIGFjbG9jYWwtMS40IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorZG5sIEFDX0RFRlVOKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSwgW10pCitkbmwgQUNfREVGVU4oW0FNX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSwgW10pCisKKworIyBfTFRfV0lUSF9QSUMoW01PREVdKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbXBsZW1lbnQgdGhlIC0td2l0aC1waWMgZmxhZywgYW5kIHN1cHBvcnQgdGhlIGBwaWMtb25seScgYW5kIGBuby1waWMnCisjIExUX0lOSVQgb3B0aW9ucy4KKyMgTU9ERSBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIGBib3RoJy4KK200X2RlZmluZShbX0xUX1dJVEhfUElDXSwKK1tBQ19BUkdfV0lUSChbcGljXSwKKyAgICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1waWNdLAorCVt0cnkgdG8gdXNlIG9ubHkgUElDL25vbi1QSUMgb2JqZWN0cyBAPDpAZGVmYXVsdD11c2UgYm90aEA6PkBdKV0sCisgICAgW3BpY19tb2RlPSIkd2l0aHZhbCJdLAorICAgIFtwaWNfbW9kZT1kZWZhdWx0XSkKKwordGVzdCAteiAiJHBpY19tb2RlIiAmJiBwaWNfbW9kZT1tNF9kZWZhdWx0KFskMV0sIFtkZWZhdWx0XSkKKworX0xUX0RFQ0woW10sIFtwaWNfbW9kZV0sIFswXSwgW1doYXQgdHlwZSBvZiBvYmplY3RzIHRvIGJ1aWxkXSlkbmwKK10pIyBfTFRfV0lUSF9QSUMKKworTFRfT1BUSU9OX0RFRklORShbTFRfSU5JVF0sIFtwaWMtb25seV0sIFtfTFRfV0lUSF9QSUMoW3llc10pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xUX0lOSVRdLCBbbm8tcGljXSwgW19MVF9XSVRIX1BJQyhbbm9dKV0pCisKKyMgT2xkIG5hbWU6CitBVV9ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwKK1tfTFRfU0VUX09QVElPTihbTFRfSU5JVF0sIFtwaWMtb25seV0pCitBQ19ESUFHTk9TRShbb2Jzb2xldGVdLAorWyQwOiBSZW1vdmUgdGhpcyB3YXJuaW5nIGFuZCB0aGUgY2FsbCB0byBfTFRfU0VUX09QVElPTiB3aGVuIHlvdQorcHV0IHRoZSBgcGljLW9ubHknIG9wdGlvbiBpbnRvIExUX0lOSVQncyBmaXJzdCBwYXJhbWV0ZXIuXSkKK10pCisKK2RubCBhY2xvY2FsLTEuNCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eToKK2RubCBBQ19ERUZVTihbQUNfTElCVE9PTF9QSUNNT0RFXSwgW10pCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBMVERMX0lOSVQgT3B0aW9ucyAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbbm9ucmVjdXJzaXZlXSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbbm9ucmVjdXJzaXZlXSldKQorTFRfT1BUSU9OX0RFRklORShbTFRETF9JTklUXSwgW3JlY3Vyc2l2ZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9NT0RFXSwgW3JlY3Vyc2l2ZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtzdWJwcm9qZWN0XSwKKwkJIFttNF9kZWZpbmUoW19MVERMX01PREVdLCBbc3VicHJvamVjdF0pXSkKKworbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW10pCitMVF9PUFRJT05fREVGSU5FKFtMVERMX0lOSVRdLCBbaW5zdGFsbGFibGVdLAorCQkgW200X2RlZmluZShbX0xURExfVFlQRV0sIFtpbnN0YWxsYWJsZV0pXSkKK0xUX09QVElPTl9ERUZJTkUoW0xURExfSU5JVF0sIFtjb252ZW5pZW5jZV0sCisJCSBbbTRfZGVmaW5lKFtfTFRETF9UWVBFXSwgW2NvbnZlbmllbmNlXSldKQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvbHRzdWdhci5tNCBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2x0c3VnYXIubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwMGEwNQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2x0c3VnYXIubTQKQEAgLTAsMCArMSwxMjMgQEAKKyMgbHRzdWdhci5tNCAtLSBsaWJ0b29sIG00IGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgIC0qLUF1dG9jb25mLSotCisjCisjIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgV3JpdHRlbiBieSBHYXJ5IFYuIFZhdWdoYW4sIDIwMDQKKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKKyMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIHNlcmlhbCA2IGx0c3VnYXIubTQKKworIyBUaGlzIGlzIHRvIGhlbHAgYWNsb2NhbCBmaW5kIHRoZXNlIG1hY3JvcywgYXMgaXQgY2FuJ3Qgc2VlIG00X2RlZmluZS4KK0FDX0RFRlVOKFtMVFNVR0FSX1ZFUlNJT05dLCBbbTRfaWYoWzAuMV0pXSkKKworCisjIGx0X2pvaW4oU0VQLCBBUkcxLCBbQVJHMi4uLl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFByb2R1Y2UgQVJHMVNFUEFSRzIuLi5TRVBBUkduLCBvbWl0dGluZyBbXSBhcmd1bWVudHMgYW5kIHRoZWlyCisjIGFzc29jaWF0ZWQgc2VwYXJhdG9yLgorIyBOZWVkZWQgdW50aWwgd2UgY2FuIHJlbHkgb24gbTRfam9pbiBmcm9tIEF1dG9jb25mIDIuNjIsIHNpbmNlIGFsbCBlYXJsaWVyCisjIHZlcnNpb25zIGluIG00c3VnYXIgaGFkIGJ1Z3MuCittNF9kZWZpbmUoW2x0X2pvaW5dLAorW200X2lmKFskI10sIFsxXSwgW10sCisgICAgICAgWyQjXSwgWzJdLCBbWyQyXV0sCisgICAgICAgW200X2lmKFskMl0sIFtdLCBbXSwgW1skMl1fXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKK200X2RlZmluZShbX2x0X2pvaW5dLAorW200X2lmKFskIyQyXSwgWzJdLCBbXSwKKyAgICAgICBbbTRfaWYoWyQyXSwgW10sIFtdLCBbWyQxJDJdXSkkMChbJDFdLCBtNF9zaGlmdChtNF9zaGlmdCgkQCkpKV0pXSkKKworCisjIGx0X2NhcihMSVNUKQorIyBsdF9jZHIoTElTVCkKKyMgLS0tLS0tLS0tLS0tCisjIE1hbmlwdWxhdGUgbTQgbGlzdHMuCisjIFRoZXNlIG1hY3JvcyBhcmUgbmVjZXNzYXJ5IGFzIGxvbmcgYXMgd2lsbCBzdGlsbCBuZWVkIHRvIHN1cHBvcnQKKyMgQXV0b2NvbmYtMi41OSB3aGljaCBxdW90ZXMgZGlmZmVyZW50bHkuCittNF9kZWZpbmUoW2x0X2Nhcl0sIFtbJDFdXSkKK200X2RlZmluZShbbHRfY2RyXSwKK1ttNF9pZihbJCNdLCAwLCBbbTRfZmF0YWwoWyQwOiBjYW5ub3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzXSldLAorICAgICAgIFskI10sIDEsIFtdLAorICAgICAgIFttNF9kcXVvdGUobTRfc2hpZnQoJEApKV0pXSkKK200X2RlZmluZShbbHRfdW5xdW90ZV0sICQxKQorCisKKyMgbHRfYXBwZW5kKE1BQ1JPLU5BTUUsIFNUUklORywgW1NFUEFSQVRPUl0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWRlZmluZSBNQUNSTy1OQU1FIHRvIGhvbGQgaXRzIGZvcm1lciBjb250ZW50IHBsdXMgYFNFUEFSQVRPUidgU1RSSU5HJy4KKyMgTm90ZSB0aGF0IG5laXRoZXIgU0VQQVJBVE9SIG5vciBTVFJJTkcgYXJlIGV4cGFuZGVkOyB0aGV5IGFyZSBhcHBlbmRlZAorIyB0byBNQUNSTy1OQU1FIGFzIGlzIChsZWF2aW5nIHRoZSBleHBhbnNpb24gZm9yIHdoZW4gTUFDUk8tTkFNRSBpcyBpbnZva2VkKS4KKyMgTm8gU0VQQVJBVE9SIGlzIG91dHB1dCBpZiBNQUNSTy1OQU1FIHdhcyBwcmV2aW91c2x5IHVuZGVmaW5lZCAoZGlmZmVyZW50CisjIHRoYW4gZGVmaW5lZCBhbmQgZW1wdHkpLgorIworIyBUaGlzIG1hY3JvIGlzIG5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBBdXRvY29uZiAyLjYyLCBzaW5jZSBlYXJsaWVyCisjIHZlcnNpb25zIG9mIG00c3VnYXIgbWlzdGFrZW5seSBleHBhbmRlZCBTRVBBUkFUT1IgYnV0IG5vdCBTVFJJTkcuCittNF9kZWZpbmUoW2x0X2FwcGVuZF0sCitbbTRfZGVmaW5lKFskMV0sCisJICAgbTRfaWZkZWYoWyQxXSwgW200X2RlZm4oWyQxXSlbJDNdXSlbJDJdKV0pCisKKworCisjIGx0X2NvbWJpbmUoU0VQLCBQUkVGSVgtTElTVCwgSU5GSVgsIFNVRkZJWDEsIFtTVUZGSVgyLi4uXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9kdWNlIGEgU0VQIGRlbGltaXRlZCBsaXN0IG9mIGFsbCBwYWlyZWQgY29tYmluYXRpb25zIG9mIGVsZW1lbnRzIG9mCisjIFBSRUZJWC1MSVNUIHdpdGggU1VGRklYMSB0aHJvdWdoIFNVRkZJWG4uICBFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QKKyMgaGFzIHRoZSBmb3JtIFBSRUZJWG1JTkZJWFNVRkZJWG4uCisjIE5lZWRlZCB1bnRpbCB3ZSBjYW4gcmVseSBvbiBtNF9jb21iaW5lIGFkZGVkIGluIEF1dG9jb25mIDIuNjIuCittNF9kZWZpbmUoW2x0X2NvbWJpbmVdLAorW200X2lmKG00X2V2YWwoWyQjID4gM10pLCBbMV0sCisgICAgICAgW200X3B1c2hkZWYoW19MdF9zZXBdLCBbbTRfZGVmaW5lKFtfTHRfc2VwXSwgbTRfZGVmbihbbHRfY2FyXSkpXSldXWRubAorW1ttNF9mb3JlYWNoKFtfTHRfcHJlZml4XSwgWyQyXSwKKwkgICAgIFttNF9mb3JlYWNoKFtfTHRfc3VmZml4XSwKKwkJXW00X2RxdW90ZShtNF9kcXVvdGUobTRfc2hpZnQobTRfc2hpZnQobTRfc2hpZnQoJEApKSkpKVssCisJW19MdF9zZXAoWyQxXSlbXW00X2RlZm4oW19MdF9wcmVmaXhdKVskM11tNF9kZWZuKFtfTHRfc3VmZml4XSldKV0pXSldKQorCisKKyMgbHRfaWZfYXBwZW5kX3VuaXEoTUFDUk8tTkFNRSwgVkFSTkFNRSwgW1NFUEFSQVRPUl0sIFtVTklRXSwgW05PVC1VTklRXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSWZmIE1BQ1JPLU5BTUUgZG9lcyBub3QgeWV0IGNvbnRhaW4gVkFSTkFNRSwgdGhlbiBhcHBlbmQgaXQgKGRlbGltaXRlZAorIyBieSBTRVBBUkFUT1IgaWYgc3VwcGxpZWQpIGFuZCBleHBhbmQgVU5JUSwgZWxzZSBOT1QtVU5JUS4KK200X2RlZmluZShbbHRfaWZfYXBwZW5kX3VuaXFdLAorW200X2lmZGVmKFskMV0sCisJICBbbTRfaWYobTRfaW5kZXgoWyQzXW00X2RlZm4oWyQxXSlbJDNdLCBbJDMkMiQzXSksIFstMV0sCisJCSBbbHRfYXBwZW5kKFskMV0sIFskMl0sIFskM10pJDRdLAorCQkgWyQ1XSldLAorCSAgW2x0X2FwcGVuZChbJDFdLCBbJDJdLCBbJDNdKSQ0XSldKQorCisKKyMgbHRfZGljdF9hZGQoRElDVCwgS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRdLAorW200X2RlZmluZShbJDEoJDIpXSwgWyQzXSldKQorCisKKyMgbHRfZGljdF9hZGRfc3Via2V5KERJQ1QsIEtFWSwgU1VCS0VZLCBWQUxVRSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK200X2RlZmluZShbbHRfZGljdF9hZGRfc3Via2V5XSwKK1ttNF9kZWZpbmUoWyQxKCQyOiQzKV0sIFskNF0pXSkKKworCisjIGx0X2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZldGNoXSwKK1ttNF9pZnZhbChbJDNdLAorCW00X2lmZGVmKFskMSgkMjokMyldLCBbbTRfZGVmbihbJDEoJDI6JDMpXSldKSwKKyAgICBtNF9pZmRlZihbJDEoJDIpXSwgW200X2RlZm4oWyQxKCQyKV0pXSkpXSkKKworCisjIGx0X2lmX2RpY3RfZmV0Y2goRElDVCwgS0VZLCBbU1VCS0VZXSwgVkFMVUUsIElGLVRSVUUsIFtJRi1GQUxTRV0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittNF9kZWZpbmUoW2x0X2lmX2RpY3RfZmV0Y2hdLAorW200X2lmKGx0X2RpY3RfZmV0Y2goWyQxXSwgWyQyXSwgWyQzXSksIFskNF0sCisJWyQ1XSwKKyAgICBbJDZdKV0pCisKKworIyBsdF9kaWN0X2ZpbHRlcihESUNULCBbU1VCS0VZXSwgVkFMVUUsIFtTRVBBUkFUT1JdLCBLRVksIFsuLi5dKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbTRfZGVmaW5lKFtsdF9kaWN0X2ZpbHRlcl0sCitbbTRfaWYoWyQ1XSwgW10sIFtdLAorICBbbHRfam9pbihtNF9xdW90ZShtNF9kZWZhdWx0KFskNF0sIFtbLCBdXSkpLAorICAgICAgICAgICBsdF91bnF1b3RlKG00X3NwbGl0KG00X25vcm1hbGl6ZShtNF9mb3JlYWNoKF9MdF9rZXksIGx0X2NhcihbbTRfc2hpZnRuKDQsICRAKV0pLAorCQkgICAgICBbbHRfaWZfZGljdF9mZXRjaChbJDFdLCBfTHRfa2V5LCBbJDJdLCBbJDNdLCBbX0x0X2tleSBdKV0pKSkpKV0pW11kbmwKK10pCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9sdHZlcnNpb24ubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9sdHZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjNTMwOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2x0dmVyc2lvbi5tNApAQCAtMCwwICsxLDIzIEBACisjIGx0dmVyc2lvbi5tNCAtLSB2ZXJzaW9uIG51bWJlcnMJCQktKi0gQXV0b2NvbmYgLSotCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyAgIFdyaXR0ZW4gYnkgU2NvdHQgSmFtZXMgUmVtbmFudCwgMjAwNAorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgR2VuZXJhdGVkIGZyb20gbHR2ZXJzaW9uLmluLgorCisjIHNlcmlhbCAzMDE3IGx0dmVyc2lvbi5tNAorIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgTGlidG9vbAorCittNF9kZWZpbmUoW0xUX1BBQ0tBR0VfVkVSU0lPTl0sIFsyLjIuNmJdKQorbTRfZGVmaW5lKFtMVF9QQUNLQUdFX1JFVklTSU9OXSwgWzEuMzAxN10pCisKK0FDX0RFRlVOKFtMVFZFUlNJT05fVkVSU0lPTl0sCitbbWFjcm9fdmVyc2lvbj0nMi4yLjZiJworbWFjcm9fcmV2aXNpb249JzEuMzAxNycKK19MVF9ERUNMKCwgbWFjcm9fdmVyc2lvbiwgMCwgW1doaWNoIHJlbGVhc2Ugb2YgbGlidG9vbC5tNCB3YXMgdXNlZD9dKQorX0xUX0RFQ0woLCBtYWNyb19yZXZpc2lvbiwgMCkKK10pCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9sdH5vYnNvbGV0ZS5tNCBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL2x0fm9ic29sZXRlLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2JiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9sdH5vYnNvbGV0ZS5tNApAQCAtMCwwICsxLDkyIEBACisjIGx0fm9ic29sZXRlLm00IC0tIGFjbG9jYWwgc2F0aXNmeWluZyBvYnNvbGV0ZSBkZWZpbml0aW9ucy4gICAgLSotQXV0b2NvbmYtKi0KKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjICAgV3JpdHRlbiBieSBTY290dCBKYW1lcyBSZW1uYW50LCAyMDA0LgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBnaXZlcworIyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgc2VyaWFsIDQgbHR+b2Jzb2xldGUubTQKKworIyBUaGVzZSBleGlzdCBlbnRpcmVseSB0byBmb29sIGFjbG9jYWwgd2hlbiBib290c3RyYXBwaW5nIGxpYnRvb2wuCisjCisjIEluIHRoZSBwYXN0IGxpYnRvb2wubTQgaGFzIHByb3ZpZGVkIG1hY3JvcyB2aWEgQUNfREVGVU4gKG9yIEFVX0RFRlVOKQorIyB3aGljaCBoYXZlIGxhdGVyIGJlZW4gY2hhbmdlZCB0byBtNF9kZWZpbmUgYXMgdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUKKyMgZXhwb3J0ZWQgQVBJLCBvciBtb3ZlZCB0byBBdXRvY29uZiBvciBBdXRvbWFrZSB3aGVyZSB0aGV5IGJlbG9uZy4KKyMKKyMgVGhlIHRyb3VibGUgaXMsIGFjbG9jYWwgaXMgYSBiaXQgdGhpY2suICBJdCdsbCBzZWUgdGhlIG9sZCBBQ19ERUZVTgorIyBpbiAvdXNyL3NoYXJlL2FjbG9jYWwvbGlidG9vbC5tNCBhbmQgcmVtZW1iZXIgaXQsIHRoZW4gd2hlbiBpdCBzZWVzIHVzCisjIHVzaW5nIGEgbWFjcm8gd2l0aCB0aGUgc2FtZSBuYW1lIGluIG91ciBsb2NhbCBtNC9saWJ0b29sLm00IGl0J2xsCisjIHB1bGwgdGhlIG9sZCBsaWJ0b29sLm00IGluIChpdCBkb2Vzbid0IHNlZSBvdXIgc2hpbnkgbmV3IG00X2RlZmluZQorIyBhbmQgZG9lc24ndCBrbm93IGFib3V0IEF1dG9jb25mIG1hY3JvcyBhdCBhbGwuKQorIworIyBTbyB3ZSBwcm92aWRlIHRoaXMgZmlsZSwgd2hpY2ggaGFzIGEgc2lsbHkgZmlsZW5hbWUgc28gaXQncyBhbHdheXMKKyMgaW5jbHVkZWQgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBwcm92aWRlcyBhY2xvY2FsIHdpdGggdGhlCisjIEFDX0RFRlVOcyBpdCB3YW50cywgYnV0IHdoZW4gbTQgcHJvY2Vzc2VzIGl0LCBpdCBkb2Vzbid0IGRvIGFueXRoaW5nCisjIGJlY2F1c2UgdGhvc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QsIG9yIHdpbGwgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIuCisjIFdlIHVzZSBBQ19ERUZVTiBvdmVyIEFVX0RFRlVOIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYWNsb2NhbC0xLjYuIAorIworIyBBbnl0aW1lIHdlIHdpdGhkcmF3IGFuIEFDX0RFRlVOIG9yIEFVX0RFRlVOLCByZW1lbWJlciB0byBhZGQgaXQgaGVyZS4KKyMgWWVzLCB0aGF0IG1lYW5zIGV2ZXJ5IG5hbWUgb25jZSB0YWtlbiB3aWxsIG5lZWQgdG8gcmVtYWluIGhlcmUgdW50aWwKKyMgd2UgZ2l2ZSB1cCBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuNywgYXQgd2hpY2ggcG9pbnQKKyMgd2UgbmVlZCB0byBrZWVwIG9ubHkgdGhvc2UgbmFtZXMgd2hpY2ggd2Ugc3RpbGwgcmVmZXIgdG8uCisKKyMgVGhpcyBpcyB0byBoZWxwIGFjbG9jYWwgZmluZCB0aGVzZSBtYWNyb3MsIGFzIGl0IGNhbid0IHNlZSBtNF9kZWZpbmUuCitBQ19ERUZVTihbTFRPQlNPTEVURV9WRVJTSU9OXSwgW200X2lmKFsxXSldKQorCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTElOS0VSX09QVElPTl0sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MSU5LRVJfT1BUSU9OXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0VHUkVQXSwJCVtBQ19ERUZVTihbQUNfUFJPR19FR1JFUF0pXSkKK200X2lmbmRlZihbX0xUX0FDX1BST0dfRUNIT19CQUNLU0xBU0hdLAlbQUNfREVGVU4oW19MVF9BQ19QUk9HX0VDSE9fQkFDS1NMQVNIXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU0hFTExfSU5JVF0sCQlbQUNfREVGVU4oW19MVF9BQ19TSEVMTF9JTklUXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSwJW0FDX0RFRlVOKFtfTFRfQUNfU1lTX0xJQlBBVEhfQUlYXSldKQorbTRfaWZuZGVmKFtfTFRfUFJPR19MVE1BSU5dLAkJW0FDX0RFRlVOKFtfTFRfUFJPR19MVE1BSU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19UQUdWQVJdLAkJW0FDX0RFRlVOKFtfTFRfQUNfVEFHVkFSXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSwJW0FDX0RFRlVOKFtBQ19MVERMX0VOQUJMRV9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtBQ19MVERMX1BSRU9QRU5dLAkJW0FDX0RFRlVOKFtBQ19MVERMX1BSRU9QRU5dKV0pCittNF9pZm5kZWYoW19MVF9BQ19TWVNfQ09NUElMRVJdLAlbQUNfREVGVU4oW19MVF9BQ19TWVNfQ09NUElMRVJdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MT0NLXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xPQ0tdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfU1lTX09MRF9BUkNISVZFXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19PTERfQVJDSElWRV0pXSkKK200X2lmbmRlZihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0sCVtBQ19ERUZVTihbX0xUX0FDX1RSWV9ETE9QRU5fU0VMRl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9QUk9HX0NDX0NfT10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfSEFSRF9MSU5LX0xPQ0tTXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19IQVJEX0xJTktfTE9DS1NdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xURExfT0JKRElSXSwJCVtBQ19ERUZVTihbQUNfTFRETF9PQkpESVJdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9IQVJEQ09ERV9MSUJQQVRIXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfTERfSEFSRENPREVfTElCUEFUSF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfTElCX1NUUklQXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19MSUJfU1RSSVBdKV0pCittNF9pZm5kZWYoW0FDX1BBVEhfTUFHSUNdLAkJW0FDX0RFRlVOKFtBQ19QQVRIX01BR0lDXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX0dOVV0sCQlbQUNfREVGVU4oW0FDX1BST0dfTERfR05VXSldKQorbTRfaWZuZGVmKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSwJW0FDX0RFRlVOKFtBQ19QUk9HX0xEX1JFTE9BRF9GTEFHXSldKQorbTRfaWZuZGVmKFtBQ19ERVBMSUJTX0NIRUNLX01FVEhPRF0sCVtBQ19ERUZVTihbQUNfREVQTElCU19DSEVDS19NRVRIT0RdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9OT19SVFRJXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1BST0dfQ09NUElMRVJfTk9fUlRUSV0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfR0xPQkFMX1NZTUJPTF9QSVBFXSwgW0FDX0RFRlVOKFtBQ19MSUJUT09MX1NZU19HTE9CQUxfU1lNQk9MX1BJUEVdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdLCBbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19DT01QSUxFUl9QSUNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUFJPR19MRF9TSExJQlNdKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfUE9TVERFUF9QUkVERVBdKV0pCittNF9pZm5kZWYoW0xUX0FDX1BST0dfRUdSRVBdLAkJW0FDX0RFRlVOKFtMVF9BQ19QUk9HX0VHUkVQXSldKQorbTRfaWZuZGVmKFtMVF9BQ19QUk9HX1NFRF0sCQlbQUNfREVGVU4oW0xUX0FDX1BST0dfU0VEXSldKQorbTRfaWZuZGVmKFtfTFRfQ0NfQkFTRU5BTUVdLAkJW0FDX0RFRlVOKFtfTFRfQ0NfQkFTRU5BTUVdKV0pCittNF9pZm5kZWYoW19MVF9DT01QSUxFUl9CT0lMRVJQTEFURV0sCVtBQ19ERUZVTihbX0xUX0NPTVBJTEVSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSwJW0FDX0RFRlVOKFtfTFRfTElOS0VSX0JPSUxFUlBMQVRFXSldKQorbTRfaWZuZGVmKFtfQUNfUFJPR19MSUJUT09MXSwJCVtBQ19ERUZVTihbX0FDX1BST0dfTElCVE9PTF0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TRVRVUF0sCQlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU0VUVVBdKV0pCittNF9pZm5kZWYoW19MVF9BQ19DSEVDS19ETEZDTl0sCQlbQUNfREVGVU4oW19MVF9BQ19DSEVDS19ETEZDTl0pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9TWVNfRFlOQU1JQ19MSU5LRVJdLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfU1lTX0RZTkFNSUNfTElOS0VSXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfVEFHQ09ORklHXSwJCVtBQ19ERUZVTihbX0xUX0FDX1RBR0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfRElTQUJMRV9GQVNUX0lOU1RBTExdLAlbQUNfREVGVU4oW0FDX0RJU0FCTEVfRkFTVF9JTlNUQUxMXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhdLAkJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhdKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N10sCQlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKXSwJCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX1JDXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9SQ10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfQ19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0NfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX0NYWF9DT05GSUddLAlbQUNfREVGVU4oW0FDX0xJQlRPT0xfTEFOR19DWFhfQ09ORklHXSldKQorbTRfaWZuZGVmKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19DWFhfQ09ORklHXSldKQorbTRfaWZuZGVmKFtBQ19MSUJUT09MX0xBTkdfRjc3X0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX0Y3N19DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19MQU5HX0Y3N19DT05GSUddLAlbQUNfREVGVU4oW19MVF9BQ19MQU5HX0Y3N19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfTEFOR19HQ0pfQ09ORklHXSwJW0FDX0RFRlVOKFtBQ19MSUJUT09MX0xBTkdfR0NKX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10sCVtBQ19ERUZVTihbX0xUX0FDX0xBTkdfR0NKX0NPTkZJR10pXSkKK200X2lmbmRlZihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10sCVtBQ19ERUZVTihbQUNfTElCVE9PTF9MQU5HX1JDX0NPTkZJR10pXSkKK200X2lmbmRlZihbX0xUX0FDX0xBTkdfUkNfQ09ORklHXSwJW0FDX0RFRlVOKFtfTFRfQUNfTEFOR19SQ19DT05GSUddKV0pCittNF9pZm5kZWYoW0FDX0xJQlRPT0xfQ09ORklHXSwJCVtBQ19ERUZVTihbQUNfTElCVE9PTF9DT05GSUddKV0pCittNF9pZm5kZWYoW19MVF9BQ19GSUxFX0xURExMX0NdLAlbQUNfREVGVU4oW19MVF9BQ19GSUxFX0xURExMX0NdKV0pCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9uZnMtdXRpbHMubTQgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC9uZnMtdXRpbHMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlOGI5NQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL25mcy11dGlscy5tNApAQCAtMCwwICsxLDE3IEBACitkbmwgKioqKioqKioqKiogR05VIGxpYmMgMiAqKioqKioqKioqKioqKioKK0FDX0RFRlVOKFtBQ19HTlVMSUJDXSxbCisgIEFDX01TR19DSEVDS0lORyhmb3IgR05VIGxpYmMyKQorICBBQ19DQUNIRV9WQUwoa25mc2RfY3ZfZ2xpYmMyLAorICBbQUNfVFJZX0NQUChbCisgICAgICAjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyAgICAgICNpZiAhZGVmaW5lZChfX0dMSUJDX18pCisgICAgICAjIGVycm9yIE5vcGUKKyAgICAgICNlbmRpZgorICAgICAgXSwKKyAga25mc2RfY3ZfZ2xpYmMyPXllcywga25mc2RfY3ZfZ2xpYmMyPW5vKV0pCisgIEFDX01TR19SRVNVTFQoJGtuZnNkX2N2X2dsaWJjMikKKyAgaWYgdGVzdCAka25mc2RfY3ZfZ2xpYmMyID0geWVzOyB0aGVuCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9HTlVfU09VUkNFIgorICAgIENQUEZMQUdTX0ZPUl9CVUlMRD0iJENQUEZMQUdTX0ZPUl9CVUlMRCAtRF9HTlVfU09VUkNFIgorICBmaQorXSkKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL3JwY3NlY192ZXJzLm00IGIvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5MDJjYQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9hY2xvY2FsL3JwY3NlY192ZXJzLm00CkBAIC0wLDAgKzEsMTEgQEAKK2RubCBDaGVja3MgbGlicnBjc2VjIHZlcnNpb24KK0FDX0RFRlVOKFtBQ19SUENTRUNfVkVSU0lPTl0sIFsKKworICBQS0dfQ0hFQ0tfTU9EVUxFUyhbR1NTR0xVRV0sIFtsaWJnc3NnbHVlID49IDAuMV0pCisKKyAgZG5sIFRJLVJQQyByZXBsYWNlcyBsaWJycGNzZWNnc3MKKyAgaWYgdGVzdCAiJGVuYWJsZV90aXJwYyIgPSBubzsgdGhlbgorICAgIFBLR19DSEVDS19NT0RVTEVTKFtSUENTRUNHU1NdLCBbbGlicnBjc2VjZ3NzID49IDAuMTZdKQorICBmaQorCitdKWRubApkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IGIvbmZzLXV0aWxzLTEuMi4yL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YWM4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQKQEAgLTAsMCArMSw1NCBAQAorIyBDaGVjayB3aGV0aGVyIHVzZXIgd2FudHMgVENQIHdyYXBwZXJzIHN1cHBvcnQKK0FDX0RFRlVOKFtBQ19UQ1BfV1JBUFBFUlNdLFsKKyAgVENQV19NU0c9Im5vIgorICBBQ19BUkdfV0lUSCh0Y3Atd3JhcHBlcnMsCisgICAgWyAgLS13aXRoLXRjcC13cmFwcGVyc1tbPVBBVEhdXSAgICAgIEVuYWJsZSB0Y3B3cmFwcGVycyBzdXBwb3J0CisgICAgICAgICAgICAgICAgIChvcHRpb25hbGx5IGluIFBBVEgpXSwKKyAgICB3aXRoX3RjcHc9JHdpdGh2YWwsIHdpdGhfdGNwdz15ZXMpCisgICAgICAgIGlmIHRlc3QgIngkd2l0aF90Y3B3IiAhPSAieG5vIiA7IHRoZW4KKyAgICAgICAgICAgIHNhdmVkX0xJQlM9IiRMSUJTIgorICAgICAgICAgICAgc2F2ZWRfTERGTEFHUz0iJExERkxBR1MiCisgICAgICAgICAgICBzYXZlZF9DUFBGTEFHUz0iJENQUEZMQUdTIgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJHt3aXRoX3RjcHd9IiAtYSAiJHt3aXRoX3RjcHd9IiAhPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiR7d2l0aF90Y3B3fS9saWIiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgTERGTEFHUz0iLUwke3dpdGhfdGNwd30vbGliIC1SJHt3aXRoX3RjcHd9L2xpYiAke0xERkxBR1N9IgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBMREZMQUdTPSItTCR7d2l0aF90Y3B3fS9saWIgJHtMREZMQUdTfSIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiR7bmVlZF9kYXNoX3J9IjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgTERGTEFHUz0iLUwke3dpdGhfdGNwd30gLVIke3dpdGhfdGNwd30gJHtMREZMQUdTfSIKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgTERGTEFHUz0iLUwke3dpdGhfdGNwd30gJHtMREZMQUdTfSIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiR7d2l0aF90Y3B3fS9pbmNsdWRlIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBDUFBGTEFHUz0iLUkke3dpdGhfdGNwd30vaW5jbHVkZSAke0NQUEZMQUdTfSIKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIENQUEZMQUdTPSItSSR7d2l0aF90Y3B3fSAke0NQUEZMQUdTfSIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIExJQldSQVA9Ii1sd3JhcCIKKyAgICAgICAgICAgIExJQlM9IiRMSUJXUkFQICRMSUJTIgorICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBsaWJ3cmFwKQorICAgICAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworICAgICAgICAgICAgICAgICNpbmNsdWRlIDx0Y3BkLmg+CisgICAgICAgICAgICAgICAgaW50IGRlbnlfc2V2ZXJpdHkgPSAwLCBhbGxvd19zZXZlcml0eSA9IDA7CisgICAgICAgICAgICAgICAgXV0sIFtbaG9zdHNfYWNjZXNzKDApO11dKV0sWworICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICAgICAgICAgIEFDX1NVQlNUKExJQldSQVApCisgICAgICAgICAgICAgICAgQUNfREVGSU5FKFtMSUJXUkFQXSwgWzFdLCBbdGNwLXdyYXBwZXJdKQorICAgICAgICAgICAgICAgIEFDX0RFRklORShbSEFWRV9MSUJXUkFQXSwgWzFdLCBbdGNwLXdyYXBwZXJdKQorICAgICAgICAgICAgICAgIEFDX0RFRklORShbSEFWRV9UQ1BfV1JBUFBFUl0sIFsxXSwgW3RjcC13cmFwcGVyXSkKKyAgICAgICAgICAgICAgICBUQ1BXX01TRz0ieWVzIgorICAgICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgIEFDX01TR19FUlJPUihbKioqIGxpYndyYXAgbWlzc2luZ10pCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBdKQorICAgICAgICAgICAgTElCUz0iJHNhdmVkX0xJQlMiCisgICAgICAgIGZpCisgIEFDX1NVQlNUKExJQldSQVApCisgIEFDX1NVQlNUKEhBVkVfTElCV1JBUCkKKyAgQUNfU1VCU1QoSEFWRV9UQ1BfV1JBUFBFUikKK10pCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvYXV0b2dlbi5zaCBiL25mcy11dGlscy0xLjIuMi9hdXRvZ2VuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOGI4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvYXV0b2dlbi5zaApAQCAtMCwwICsxLDQyIEBACisjIS9iaW4vc2ggLWUKKworZWNobyAtbiBjbGVhbmluZyB1cCAuCisKKyMgQ2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBjcnVkCisoCisJZm9yIEZJTEUgaW4gY29tcGlsZSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBkZXBjb21wIGluc3RhbGwtc2ggbHRtYWluLnNoIG1pc3NpbmcgbWtpbnN0YWxsZGlyczsgZG8KKwkgICAgaWYgdGVzdCAtZiAkRklMRTsgdGhlbgorCQlybSAtZiAkRklMRQorCSAgICBmaQorCSAgICBlY2hvIC1uIC4KKwlkb25lCispCisKK2ZvciBGSUxFIGluIGFjbG9jYWwubTQgY29uZmlndXJlIGNvbmZpZy5oLmluOyBkbworICAgIGlmIHRlc3QgLWYgJEZJTEU7IHRoZW4KKwlybSAtZiAkRklMRQorICAgIGZpCisJZWNobyAtbiAuCitkb25lCisKK2ZvciBESVIgaW4gYXV0b200dGUuY2FjaGU7IGRvCisgICAgaWYgdGVzdCAtZCAkRElSOyB0aGVuCisJcm0gLXJmICRESVIKKyAgICBmaQorCWVjaG8gLW4gLgorZG9uZQorCitmaW5kIC4gLXR5cGUgZiAtbmFtZSAnTWFrZWZpbGUuaW4nIC1wcmludDAgfCB4YXJncyAtcjAgIHJtIC1mIC0tCitmaW5kIC4gLXR5cGUgZiAtbmFtZSAnTWFrZWZpbGUnIC1wcmludDAgfCB4YXJncyAtcjAgcm0gLWYgLS0KKworZWNobyAnIGRvbmUnCisKK2lmIHRlc3QgeCIkezF9IiA9IHgiY2xlYW4iOyB0aGVuCisgICAgZXhpdAorZmkKKworYWNsb2NhbCAtSSBhY2xvY2FsCitsaWJ0b29saXplIC0tZm9yY2UgLS1jb3B5CithdXRvaGVhZGVyCithdXRvbWFrZSAtLWFkZC1taXNzaW5nIC0tY29weSAtLWdudSAjIC1XYWxsCithdXRvY29uZiAjIC1XYWxsCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvY29tcGlsZSBiL25mcy11dGlscy0xLjIuMi9jb21waWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwMDk2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvY29tcGlsZQpAQCAtMCwwICsxLDE0MyBAQAorIyEgL2Jpbi9zaAorIyBXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KKworc2NyaXB0dmVyc2lvbj0yMDA5LTEwLTA2LjIwOyAjIFVUQworCisjIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMywgMjAwNCwgMjAwNSwgMjAwOSAgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuCisjIFdyaXR0ZW4gYnkgVG9tIFRyb21leSA8dHJvbWV5QGN5Z251cy5jb20+LgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhpcyBmaWxlIGlzIG1haW50YWluZWQgaW4gQXV0b21ha2UsIHBsZWFzZSByZXBvcnQKKyMgYnVncyB0byA8YnVnLWF1dG9tYWtlQGdudS5vcmc+IG9yIHNlbmQgcGF0Y2hlcyB0bworIyA8YXV0b21ha2UtcGF0Y2hlc0BnbnUub3JnPi4KKworY2FzZSAkMSBpbgorICAnJykKKyAgICAgZWNobyAiJDA6IE5vIGNvbW1hbmQuICBUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICBleGl0IDE7CisgICAgIDs7CisgIC1oIHwgLS1oKikKKyAgICBjYXQgPDxcRU9GCitVc2FnZTogY29tcGlsZSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBQUk9HUkFNIFtBUkdTXQorCitXcmFwcGVyIGZvciBjb21waWxlcnMgd2hpY2ggZG8gbm90IHVuZGVyc3RhbmQgYC1jIC1vJy4KK1JlbW92ZSBgLW8gZGVzdC5vJyBmcm9tIEFSR1MsIHJ1biBQUk9HUkFNIHdpdGggdGhlIHJlbWFpbmluZworYXJndW1lbnRzLCBhbmQgcmVuYW1lIHRoZSBvdXRwdXQgYXMgZXhwZWN0ZWQuCisKK0lmIHlvdSBhcmUgdHJ5aW5nIHRvIGJ1aWxkIGEgd2hvbGUgcGFja2FnZSB0aGlzIGlzIG5vdCB0aGUKK3JpZ2h0IHNjcmlwdCB0byBydW46IHBsZWFzZSBzdGFydCBieSByZWFkaW5nIHRoZSBmaWxlIGBJTlNUQUxMJy4KKworUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4KK0VPRgorICAgIGV4aXQgJD8KKyAgICA7OworICAtdiB8IC0tdiopCisgICAgZWNobyAiY29tcGlsZSAkc2NyaXB0dmVyc2lvbiIKKyAgICBleGl0ICQ/CisgICAgOzsKK2VzYWMKKworb2ZpbGU9CitjZmlsZT0KK2VhdD0KKworZm9yIGFyZworZG8KKyAgaWYgdGVzdCAtbiAiJGVhdCI7IHRoZW4KKyAgICBlYXQ9CisgIGVsc2UKKyAgICBjYXNlICQxIGluCisgICAgICAtbykKKwkjIGNvbmZpZ3VyZSBtaWdodCBjaG9vc2UgdG8gcnVuIGNvbXBpbGUgYXMgYGNvbXBpbGUgY2MgLW8gZm9vIGZvby5jJy4KKwkjIFNvIHdlIHN0cmlwIGAtbyBhcmcnIG9ubHkgaWYgYXJnIGlzIGFuIG9iamVjdC4KKwllYXQ9MQorCWNhc2UgJDIgaW4KKwkgICoubyB8ICoub2JqKQorCSAgICBvZmlsZT0kMgorCSAgICA7OworCSAgKikKKwkgICAgc2V0IHggIiRAIiAtbyAiJDIiCisJICAgIHNoaWZ0CisJICAgIDs7CisJZXNhYworCTs7CisgICAgICAqLmMpCisJY2ZpbGU9JDEKKwlzZXQgeCAiJEAiICIkMSIKKwlzaGlmdAorCTs7CisgICAgICAqKQorCXNldCB4ICIkQCIgIiQxIgorCXNoaWZ0CisJOzsKKyAgICBlc2FjCisgIGZpCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgLXogIiRvZmlsZSIgfHwgdGVzdCAteiAiJGNmaWxlIjsgdGhlbgorICAjIElmIG5vIGAtbycgb3B0aW9uIHdhcyBzZWVuIHRoZW4gd2UgbWlnaHQgaGF2ZSBiZWVuIGludm9rZWQgZnJvbSBhCisgICMgcGF0dGVybiBydWxlIHdoZXJlIHdlIGRvbid0IG5lZWQgb25lLiAgVGhhdCBpcyBvayAtLSB0aGlzIGlzIGEKKyAgIyBub3JtYWwgY29tcGlsYXRpb24gdGhhdCB0aGUgbG9zaW5nIGNvbXBpbGVyIGNhbiBoYW5kbGUuICBJZiBubworICAjIGAuYycgZmlsZSB3YXMgc2VlbiB0aGVuIHdlIGFyZSBwcm9iYWJseSBsaW5raW5nLiAgVGhhdCBpcyBhbHNvCisgICMgb2suCisgIGV4ZWMgIiRAIgorZmkKKworIyBOYW1lIG9mIGZpbGUgd2UgZXhwZWN0IGNvbXBpbGVyIHRvIGNyZWF0ZS4KK2NvZmlsZT1gZWNobyAiJGNmaWxlIiB8IHNlZCAnc3xeLipbXFwvXXx8OyBzfF5bYS16QS1aXTp8fDsgcy9cLmMkLy5vLydgCisKKyMgQ3JlYXRlIHRoZSBsb2NrIGRpcmVjdG9yeS4KKyMgTm90ZTogdXNlIGBbL1xcOi4tXScgaGVyZSB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB1c2UgdGhlIHNhbWUgbmFtZQorIyB0aGF0IHdlIGFyZSB1c2luZyBmb3IgdGhlIC5vIGZpbGUuICBBbHNvLCBiYXNlIHRoZSBuYW1lIG9uIHRoZSBleHBlY3RlZAorIyBvYmplY3QgZmlsZSBuYW1lLCBzaW5jZSB0aGF0IGlzIHdoYXQgbWF0dGVycyB3aXRoIGEgcGFyYWxsZWwgYnVpbGQuCitsb2NrZGlyPWBlY2hvICIkY29maWxlIiB8IHNlZCAtZSAnc3xbL1xcOi4tXXxffGcnYC5kCit3aGlsZSB0cnVlOyBkbworICBpZiBta2RpciAiJGxvY2tkaXIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgIGJyZWFrCisgIGZpCisgIHNsZWVwIDEKK2RvbmUKKyMgRklYTUU6IHJhY2UgY29uZGl0aW9uIGhlcmUgaWYgdXNlciBraWxscyBiZXR3ZWVuIG1rZGlyIGFuZCB0cmFwLgordHJhcCAicm1kaXIgJyRsb2NrZGlyJzsgZXhpdCAxIiAxIDIgMTUKKworIyBSdW4gdGhlIGNvbXBpbGUuCisiJEAiCityZXQ9JD8KKworaWYgdGVzdCAtZiAiJGNvZmlsZSI7IHRoZW4KKyAgdGVzdCAiJGNvZmlsZSIgPSAiJG9maWxlIiB8fCBtdiAiJGNvZmlsZSIgIiRvZmlsZSIKK2VsaWYgdGVzdCAtZiAiJHtjb2ZpbGV9YmoiOyB0aGVuCisgIHRlc3QgIiR7Y29maWxlfWJqIiA9ICIkb2ZpbGUiIHx8IG12ICIke2NvZmlsZX1iaiIgIiRvZmlsZSIKK2ZpCisKK3JtZGlyICIkbG9ja2RpciIKK2V4aXQgJHJldAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2NvbmZpZy5ndWVzcyBiL25mcy11dGlscy0xLjIuMi9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGM4NGM2OAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9jb25maWcuZ3Vlc3MKQEAgLTAsMCArMSwxNTAxIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA5LTExLTIwJworCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisKKyMgT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLiAgUGxlYXNlIHNlbmQgcGF0Y2hlcyAoY29udGV4dAorIyBkaWZmIGZvcm1hdCkgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGFuZCBpbmNsdWRlIGEgQ2hhbmdlTG9nCisjIGVudHJ5LgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuZ3Vlc3M7aGI9SEVBRAorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXQorCitPdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCisKK09wZXJhdGlvbiBtb2RlczoKKyAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0CisgIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKKworUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKKwordmVyc2lvbj0iXAorR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKKworT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgorQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKKworaGVscD0iCitUcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisKKyMgUGFyc2UgY29tbWFuZCBsaW5lCit3aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCisgICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDs7CisgICAgLS12ZXJzaW9uIHwgLXYgKQorICAgICAgIGVjaG8gIiR2ZXJzaW9uIiA7IGV4aXQgOzsKKyAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQorICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgOzsKKyAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKKyAgICAgICBzaGlmdDsgYnJlYWsgOzsKKyAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCisgICAgICAgYnJlYWsgOzsKKyAgICAtKiApCisgICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKKyAgICAgICBleGl0IDEgOzsKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2lmIHRlc3QgJCMgIT0gMDsgdGhlbgorICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICdleGl0IDEnIDEgMiAxNQorCisjIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCisjIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCisjIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKKyMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KKworIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAorIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgorCisjIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCisKK3NldF9jY19mb3JfYnVpbGQ9JwordHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Cit0cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOworOiAke1RNUERJUj0vdG1wfSA7CisgeyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAorIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8CisgeyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8CisgeyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOworZHVtbXk9JHRtcC9kdW1teSA7Cit0bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKK2Nhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KKyAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKKwlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCisJICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7CisJICBmaSA7CisJZG9uZSA7CisJaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KKwkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7CisJZmkKKwk7OworICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7CisgLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OworZXNhYyA7IHNldF9jY19mb3JfYnVpbGQ9IDsnCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCisjIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgMTk5NC0wOC0yNCkKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KK1VOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgorCisjIE5vdGU6IG9yZGVyIGlzIHNpZ25pZmljYW50IC0gdGhlIGNhc2UgYnJhbmNoZXMgYXJlIG5vdCBleGNsdXNpdmUuCisKK2Nhc2UgIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgaW4KKyAgICAqOk5ldEJTRDoqOiopCisJIyBOZXRCU0QgKG5ic2QpIHRhcmdldHMgc2hvdWxkICh3aGVyZSBhcHBsaWNhYmxlKSBtYXRjaCBvbmUgb3IKKwkjIG1vcmUgb2YgdGhlIHR1cHBsZXM6ICotKi1uZXRic2RlbGYqLCAqLSotbmV0YnNkYW91dCosCisJIyAqLSotbmV0YnNkZWNvZmYqIGFuZCAqLSotbmV0YnNkKi4gIEZvciB0YXJnZXRzIHRoYXQgcmVjZW50bHkKKwkjIHN3aXRjaGVkIHRvIEVMRiwgKi0qLW5ldGJzZCogd291bGQgc2VsZWN0IHRoZSBvbGQKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoaXMgcHJvdmlkZXMgYm90aCBmb3J3YXJkCisJIyBjb21wYXRpYmlsaXR5IGFuZCBhIGNvbnNpc3RlbnQgbWVjaGFuaXNtIGZvciBzZWxlY3RpbmcgdGhlCisJIyBvYmplY3QgZmlsZSBmb3JtYXQuCisJIworCSMgTm90ZTogTmV0QlNEIGRvZXNuJ3QgcGFydGljdWxhcmx5IGNhcmUgYWJvdXQgdGhlIHZlbmRvcgorCSMgcG9ydGlvbiBvZiB0aGUgbmFtZS4gIFdlIGFsd2F5cyBzZXQgaXQgdG8gInVua25vd24iLgorCXN5c2N0bD0ic3lzY3RsIC1uIGh3Lm1hY2hpbmVfYXJjaCIKKwlVTkFNRV9NQUNISU5FX0FSQ0g9YCgvc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IFwKKwkgICAgL3Vzci9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKWAKKwljYXNlICIke1VOQU1FX01BQ0hJTkVfQVJDSH0iIGluCisJICAgIGFybWViKSBtYWNoaW5lPWFybWViLXVua25vd24gOzsKKwkgICAgYXJtKikgbWFjaGluZT1hcm0tdW5rbm93biA7OworCSAgICBzaDNlbCkgbWFjaGluZT1zaGwtdW5rbm93biA7OworCSAgICBzaDNlYikgbWFjaGluZT1zaC11bmtub3duIDs7CisJICAgIHNoNWVsKSBtYWNoaW5lPXNoNWxlLXVua25vd24gOzsKKwkgICAgKikgbWFjaGluZT0ke1VOQU1FX01BQ0hJTkVfQVJDSH0tdW5rbm93biA7OworCWVzYWMKKwkjIFRoZSBPcGVyYXRpbmcgU3lzdGVtIGluY2x1ZGluZyBvYmplY3QgZm9ybWF0LCBpZiBpdCBoYXMgc3dpdGNoZWQKKwkjIHRvIEVMRiByZWNlbnRseSwgb3Igd2lsbCBpbiB0aGUgZnV0dXJlLgorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtKnxpMzg2fG02OGt8bnMzMmt8c2gzKnxzcGFyY3x2YXgpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgZWNobyBfX0VMRl9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkJCXwgZ3JlcCAtcSBfX0VMRl9fCisJCXRoZW4KKwkJICAgICMgT25jZSBhbGwgdXRpbGl0aWVzIGNhbiBiZSBFQ09GRiAobmV0YnNkZWNvZmYpIG9yIGEub3V0IChuZXRic2Rhb3V0KS4KKwkJICAgICMgUmV0dXJuIG5ldGJzZCBmb3IgZWl0aGVyLiAgRklYPworCQkgICAgb3M9bmV0YnNkCisJCWVsc2UKKwkJICAgIG9zPW5ldGJzZGVsZgorCQlmaQorCQk7OworCSAgICAqKQorCSAgICAgICAgb3M9bmV0YnNkCisJCTs7CisJZXNhYworCSMgVGhlIE9TIHJlbGVhc2UKKwkjIERlYmlhbiBHTlUvTmV0QlNEIG1hY2hpbmVzIGhhdmUgYSBkaWZmZXJlbnQgdXNlcmxhbmQsIGFuZAorCSMgdGh1cywgbmVlZCBhIGRpc3RpbmN0IHRyaXBsZXQuIEhvd2V2ZXIsIHRoZXkgZG8gbm90IG5lZWQKKwkjIGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzbyBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhCisJIyBzdWl0YWJsZSB0YWcsIGluIHRoZSBzdHlsZSBvZiBsaW51eC1nbnUuCisJY2FzZSAiJHtVTkFNRV9WRVJTSU9OfSIgaW4KKwkgICAgRGViaWFuKikKKwkJcmVsZWFzZT0nLWdudScKKwkJOzsKKwkgICAgKikKKwkJcmVsZWFzZT1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwkJOzsKKwllc2FjCisJIyBTaW5jZSBDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU06CisJIyBjb250YWlucyByZWR1bmRhbnQgaW5mb3JtYXRpb24sIHRoZSBzaG9ydGVyIGZvcm06CisJIyBDUFVfVFlQRS1NQU5VRkFDVFVSRVItT1BFUkFUSU5HX1NZU1RFTSBpcyB1c2VkLgorCWVjaG8gIiR7bWFjaGluZX0tJHtvc30ke3JlbGVhc2V9IgorCWV4aXQgOzsKKyAgICAqOk9wZW5CU0Q6KjoqKQorCVVOQU1FX01BQ0hJTkVfQVJDSD1gYXJjaCB8IHNlZCAncy9PcGVuQlNELi8vJ2AKKwllY2hvICR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6ZWtrb0JTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZWtrb2JzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpTb2xpZEJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc29saWRic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1hY3BwYzpNaXJCU0Q6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpNaXJCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1pcmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYWxwaGE6T1NGMToqOiopCisJY2FzZSAkVU5BTUVfUkVMRUFTRSBpbgorCSo0LjApCisJCVVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQzfSdgCisJCTs7CisJKjUuKikKKwkgICAgICAgIFVOQU1FX1JFTEVBU0U9YC91c3Ivc2Jpbi9zaXplciAtdiB8IGF3ayAne3ByaW50ICQ0fSdgCisJCTs7CisJZXNhYworCSMgQWNjb3JkaW5nIHRvIENvbXBhcSwgL3Vzci9zYmluL3BzcmluZm8gaGFzIGJlZW4gYXZhaWxhYmxlIG9uCisJIyBPU0YvMSBhbmQgVHJ1NjQgc3lzdGVtcyBwcm9kdWNlZCBzaW5jZSAxOTk1LiAgSSBob3BlIHRoYXQKKwkjIGNvdmVycyBtb3N0IHN5c3RlbXMgcnVubmluZyB0b2RheS4gIFRoaXMgY29kZSBwaXBlcyB0aGUgQ1BVCisJIyB0eXBlcyB0aHJvdWdoIGhlYWQgLW4gMSwgc28gd2Ugb25seSBkZXRlY3QgdGhlIHR5cGUgb2YgQ1BVIDAuCisJQUxQSEFfQ1BVX1RZUEU9YC91c3Ivc2Jpbi9wc3JpbmZvIC12IHwgc2VkIC1uIC1lICdzL14gIFRoZSBhbHBoYSBcKC4qXCkgcHJvY2Vzc29yLiokL1wxL3AnIHwgaGVhZCAtbiAxYAorCWNhc2UgIiRBTFBIQV9DUFVfVFlQRSIgaW4KKwkgICAgIkVWNCAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJFVjQuNSAoMjEwNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGEiIDs7CisJICAgICJMQ0E0ICgyMTA2Ni8yMTA2OCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNSAoMjExNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiIDs7CisJICAgICJFVjUuNiAoMjExNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIgOzsKKwkgICAgIkVWNS42ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiIDs7CisJICAgICJFVjUuNyAoMjExNjRQQykiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU3IiA7OworCSAgICAiRVY2ICgyMTI2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIgOzsKKwkgICAgIkVWNi43ICgyMTI2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY3IiA7OworCSAgICAiRVY2LjhDQiAoMjEyNjRDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44QUwgKDIxMjY0QikiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOENYICgyMTI2NEQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjlBICgyMTI2NC9FVjY5QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjkiIDs7CisJICAgICJFVjcgKDIxMzY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3IiA7OworCSAgICAiRVY3LjkgKDIxMzY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NzkiIDs7CisJZXNhYworCSMgQSBQbi5uIHZlcnNpb24gaXMgYSBwYXRjaGVkIHZlcnNpb24uCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltQVlRYXS8vJyB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6J2AKKwlleGl0IDs7CisgICAgQWxwaGFcICo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBTaG91bGQgd2UgY2hhbmdlIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkCisJIyBvZiB0aGUgc3BlY2lmaWMgQWxwaGEgbW9kZWw/CisJZWNobyBhbHBoYS1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKKwllY2hvIGFscGhhLWRlYy13aW5udDMuNQorCWV4aXQgOzsKKyAgICBBbWlnYSo6VU5JWF9TeXN0ZW1fVjo0LjA6KikKKwllY2hvIG02OGstdW5rbm93bi1zeXN2NAorCWV4aXQgOzsKKyAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKKwlleGl0IDs7CisgICAgKjpbTW1db3JwaFtPb11bU3NdOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1tb3JwaG9zCisJZXhpdCA7OworICAgICo6T1MvMzkwOio6KikKKwllY2hvIGkzNzAtaWJtLW9wZW5lZGl0aW9uCisJZXhpdCA7OworICAgICo6ei9WTToqOiopCisJZWNobyBzMzkwLWlibS16dm1vZQorCWV4aXQgOzsKKyAgICAqOk9TNDAwOio6KikKKyAgICAgICAgZWNobyBwb3dlcnBjLWlibS1vczQwMAorCWV4aXQgOzsKKyAgICBhcm06UklTQyo6MS5bMDEyXSo6Knxhcm06cmlzY2l4OjEuWzAxMl0qOiopCisJZWNobyBhcm0tYWNvcm4tcmlzY2l4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhcm06cmlzY29zOio6Knxhcm06UklTQ09TOio6KikKKwllY2hvIGFybS11bmtub3duLXJpc2NvcworCWV4aXQgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KiB8IFNSODAwMDpISS1VWC9NUFA6KjoqKQorCWVjaG8gaHBwYTEuMS1oaXRhY2hpLWhpdXhtcHAKKwlleGl0IDs7CisgICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCisJIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KKwlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCisJZWxzZQorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBOSUxFKjoqOio6ZGNvc3gpCisJZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDp1bml4OjQuMDo2KikKKwllY2hvIHNwYXJjLWljbC1ueDYKKwlleGl0IDs7CisgICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqIHwgRFJTPzYwMDA6aXNpczo0LjIqOjcqKQorCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgorCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3OyBleGl0IDs7CisJZXNhYyA7OworICAgIHMzOTB4OlN1bk9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjRIOlN1bk9TOjUuKjoqKQorCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgaTg2cGM6QXVyb3JhVVg6NS4qOiogfCBpODZ4ZW46QXVyb3JhVVg6NS4qOiopCisJZWNobyBpMzg2LXBjLWF1cm9yYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpODZwYzpTdW5PUzo1Lio6KiB8IGk4NnhlbjpTdW5PUzo1Lio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJU1VOX0FSQ0g9ImkzODYiCisJIyBJZiB0aGVyZSBpcyBhIGNvbXBpbGVyLCBzZWUgaWYgaXQgaXMgY29uZmlndXJlZCBmb3IgNjQtYml0IG9iamVjdHMuCisJIyBOb3RlIHRoYXQgdGhlIFN1biBjYyBkb2VzIG5vdCB0dXJuIF9fTFA2NF9fIGludG8gMSBsaWtlIGdjYyBkb2VzLgorCSMgVGhpcyB0ZXN0IHdvcmtzIGZvciBib3RoIGNvbXBpbGVycy4KKwlpZiBbICIkQ0NfRk9SX0JVSUxEIiAhPSAnbm9fY29tcGlsZXJfZm91bmQnIF07IHRoZW4KKwkgICAgaWYgKGVjaG8gJyNpZmRlZiBfX2FtZDY0JzsgZWNobyBJU182NEJJVF9BUkNIOyBlY2hvICcjZW5kaWYnKSB8IFwKKwkJKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8IFwKKwkJZ3JlcCBJU182NEJJVF9BUkNIID4vZGV2L251bGwKKwkgICAgdGhlbgorCQlTVU5fQVJDSD0ieDg2XzY0IgorCSAgICBmaQorCWZpCisJZWNobyAke1NVTl9BUkNIfS1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBzdW40KjpTdW5PUzo2KjoqKQorCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCisJIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKKwkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgorCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOio6KikKKwljYXNlICJgL3Vzci9iaW4vYXJjaCAta2AiIGluCisJICAgIFNlcmllcyp8UzQqKQorCQlVTkFNRV9SRUxFQVNFPWB1bmFtZSAtdmAKKwkJOzsKKwllc2FjCisJIyBKYXBhbmVzZSBMYW5ndWFnZSB2ZXJzaW9ucyBoYXZlIGEgdmVyc2lvbiBudW1iZXIgbGlrZSBgNC4xLjMtSkwnLgorCWVjaG8gc3BhcmMtc3VuLXN1bm9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fLydgCisJZXhpdCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzdW4qOio6NC4yQlNEOiopCisJVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDs7CisgICAgYXVzaHA6U3VuT1M6KjoqKQorCWVjaG8gc3BhcmMtYXVzcGV4LXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAjIFRoZSBzaXR1YXRpb24gZm9yIE1pTlQgaXMgYSBsaXR0bGUgY29uZnVzaW5nLiAgVGhlIG1hY2hpbmUgbmFtZQorICAgICMgY2FuIGJlIHZpcnR1YWxseSBldmVyeXRoaW5nIChldmVyeXRoaW5nIHdoaWNoIGlzIG5vdAorICAgICMgImF0YXJpc3QiIG9yICJhdGFyaXN0ZSIgYXQgbGVhc3Qgc2hvdWxkIGhhdmUgYSBwcm9jZXNzb3IKKyAgICAjID4gbTY4MDAwKS4gIFRoZSBzeXN0ZW0gbmFtZSByYW5nZXMgZnJvbSAiTWlOVCIgb3ZlciAiRnJlZU1pTlQiCisgICAgIyB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gIm1pbnQiIChvciAiZnJlZW1pbnQiKS4gIEZpbmFsbHkKKyAgICAjIHRoZSBzeXN0ZW0gbmFtZSAiVE9TIiBkZW5vdGVzIGEgc3lzdGVtIHdoaWNoIGlzIGFjdHVhbGx5IG5vdAorICAgICMgTWlOVC4gIEJ1dCBNaU5UIGlzIGRvd253YXJkIGNvbXBhdGlibGUgdG8gVE9TLCBzbyB0aGlzIHNob3VsZAorICAgICMgYmUgbm8gcHJvYmxlbS4KKyAgICBhdGFyaXN0W2VdOipNaU5UOio6KiB8IGF0YXJpc3RbZV06Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWF0YXJpLW1pbnQke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKKwllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICpmYWxjb24qOipNaU5UOio6KiB8ICpmYWxjb24qOiptaW50Oio6KiB8ICpmYWxjb24qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWlsYW4qOipNaU5UOio6KiB8IG1pbGFuKjoqbWludDoqOiogfCAqbWlsYW4qOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstbWlsYW4tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9CisgICAgICAgIGV4aXQgOzsKKyAgICAqOipNaU5UOio6KiB8ICo6Km1pbnQ6KjoqIHwgKjoqVE9TOio6KikKKyAgICAgICAgZWNobyBtNjhrLXVua25vd24tbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgIG02OGs6bWFjaHRlbjoqOiopCisJZWNobyBtNjhrLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFJJU0MqOk1hY2g6KjoqKQorCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKKwlleGl0IDs7CisgICAgUklTQyo6VUxUUklYOio6KikKKwllY2hvIG1pcHMtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKKwllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKyNpZmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGlvLmg+ICAvKiBmb3IgcHJpbnRmKCkgcHJvdG90eXBlICovCisJaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyNlbHNlCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICphcmd2W107IHsKKyNlbmRpZgorCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJgorCSAgZHVtbXlhcmc9YGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgJiYKKwkgIFNZU1RFTV9OQU1FPWAkZHVtbXkgJGR1bW15YXJnYCAmJgorCSAgICB7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE1vdG9yb2xhOlBvd2VyTUFYX09TOio6KikKKwllY2hvIHBvd2VycGMtbW90b3JvbGEtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTW90b3JvbGE6Kjo0LjM6UEw4LSopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKKwlleGl0IDs7CisgICAgTmlnaHRfSGF3azpQb3dlcl9VTklYOio6KikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VydW5peAorCWV4aXQgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgOzsKKyAgICBtODhrOio6NCo6UjQqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAorCWV4aXQgOzsKKyAgICBtODhrOio6Myo6UjMqKQorCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisJaWYgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODEwMCBdIHx8IFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXQorCXRoZW4KKwkgICAgaWYgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSBtODhrZGd1eGVsZnggXSB8fCBcCisJICAgICAgIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0geCBdCisJICAgIHRoZW4KKwkJZWNobyBtODhrLWRnLWRndXgke1VOQU1FX1JFTEVBU0V9CisJICAgIGVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJICAgIGZpCisJZWxzZQorCSAgICBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwlmaQorIAlleGl0IDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgOzsKKyAgICBNODgqOio6UjMqOiopCisJIyBEZWx0YSA4OGsgc3lzdGVtIHJ1bm5pbmcgU1ZSMworCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2MworCWV4aXQgOzsKKyAgICBYRDg4KjoqOio6KikgIyBUZWt0cm9uaXggWEQ4OCBzeXN0ZW0gcnVubmluZyBVVGVrViAoU1ZSMykKKwllY2hvIG04OGstdGVrdHJvbml4LXN5c3YzCisJZXhpdCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDs7CisgICAgKjpJUklYKjoqOiopCisJZWNobyBtaXBzLXNnaS1pcml4YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvLS9fL2cnYAorCWV4aXQgOzsKKyAgICA/Pz8/Pz8/PzpBSVg/OlsxMl0uMToyKSAgICMgQUlYIDIuMi4xIG9yIEFJWCAyLjEuMSBpcyBSVC9QQyBBSVguCisJZWNobyByb21wLWlibS1haXggICAgICMgdW5hbWUgLW0gZ2l2ZXMgYW4gOCBoZXgtY29kZSBDUFUgaWQKKwlleGl0IDs7ICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaSo4NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCA7OworICAgIGlhNjQ6QUlYOio6KikKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCXNlZCAncy9eCQkvLycgPDwgRU9GID4kZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCWlmICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmIFNZU1RFTV9OQU1FPWAkZHVtbXlgCisJCXRoZW4KKwkJCWVjaG8gIiRTWVNURU1fTkFNRSIKKwkJZWxzZQorCQkJZWNobyByczYwMDAtaWJtLWFpeDMuMi41CisJCWZpCisJZWxpZiBncmVwIGJvczMyNCAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMi40CisJZWxzZQorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yCisJZmkKKwlleGl0IDs7CisgICAgKjpBSVg6KjpbNDU2XSkKKwlJQk1fQ1BVX0lEPWAvdXNyL3NiaW4vbHNkZXYgLUMgLWMgcHJvY2Vzc29yIC1TIGF2YWlsYWJsZSB8IHNlZCAxcSB8IGF3ayAneyBwcmludCAkMSB9J2AKKwlpZiAvdXNyL3NiaW4vbHNhdHRyIC1FbCAke0lCTV9DUFVfSUR9IHwgZ3JlcCAnIFBPV0VSJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJSUJNX0FSQ0g9cnM2MDAwCisJZWxzZQorCQlJQk1fQVJDSD1wb3dlcnBjCisJZmkKKwlpZiBbIC14IC91c3IvYmluL29zbGV2ZWwgXSA7IHRoZW4KKwkJSUJNX1JFVj1gL3Vzci9iaW4vb3NsZXZlbGAKKwllbHNlCisJCUlCTV9SRVY9JHtVTkFNRV9WRVJTSU9OfS4ke1VOQU1FX1JFTEVBU0V9CisJZmkKKwllY2hvICR7SUJNX0FSQ0h9LWlibS1haXgke0lCTV9SRVZ9CisJZXhpdCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCA7OworICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQorCWVjaG8gcm9tcC1pYm0tYnNkNC40CisJZXhpdCA7OworICAgIGlibXJ0OipCU0Q6Knxyb21wLWlibTpCU0Q6KikgICAgICAgICAgICAjIGNvdmVycyBSVC9QQyBCU0QgYW5kCisJZWNobyByb21wLWlibS1ic2Qke1VOQU1FX1JFTEVBU0V9ICAgIyA0LjMgd2l0aCB1bmFtZSBhZGRlZCB0bworCWV4aXQgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwb3J0OiByb21wLWlibSBCU0QgNC4zCisgICAgKjpCT1NYOio6KikKKwllY2hvIHJzNjAwMC1idWxsLWJvc3gKKwlleGl0IDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgOzsKKyAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCisJZWNobyBtNjhrLWhwLWJzZAorCWV4aXQgOzsKKyAgICBocDMwMDo0LjRCU0Q6KjoqIHwgOTAwMC9bMzRdPz86NC4zYnNkOjIuKjoqKQorCWVjaG8gbTY4ay1ocC1ic2Q0LjQKKwlleGl0IDs7CisgICAgOTAwMC9bMzQ2NzhdPz86SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCisJICAgIDkwMDAvMzE/ICkgICAgICAgICAgICBIUF9BUkNIPW02ODAwMCA7OworCSAgICA5MDAwL1szNF0/PyApICAgICAgICAgSFBfQVJDSD1tNjhrIDs7CisJICAgIDkwMDAvWzY3OF1bMC05XVswLTldKQorCQlpZiBbIC14IC91c3IvYmluL2dldGNvbmYgXTsgdGhlbgorCQkgICAgc2NfY3B1X3ZlcnNpb249YC91c3IvYmluL2dldGNvbmYgU0NfQ1BVX1ZFUlNJT04gMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIHNjX2tlcm5lbF9iaXRzPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0tFUk5FTF9CSVRTIDI+L2Rldi9udWxsYAorICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2NwdV92ZXJzaW9ufSIgaW4KKyAgICAgICAgICAgICAgICAgICAgICA1MjMpIEhQX0FSQ0g9ImhwcGExLjAiIDs7ICMgQ1BVX1BBX1JJU0MxXzAKKyAgICAgICAgICAgICAgICAgICAgICA1MjgpIEhQX0FSQ0g9ImhwcGExLjEiIDs7ICMgQ1BVX1BBX1JJU0MxXzEKKyAgICAgICAgICAgICAgICAgICAgICA1MzIpICAgICAgICAgICAgICAgICAgICAgICMgQ1BVX1BBX1JJU0MyXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2Nfa2VybmVsX2JpdHN9IiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAzMikgSFBfQVJDSD0iaHBwYTIuMG4iIDs7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSBIUF9BUkNIPSJocHBhMi4wdyIgOzsKKwkJCSAgJycpIEhQX0FSQ0g9ImhwcGEyLjAiIDs7ICAgIyBIUC1VWCAxMC4yMAorICAgICAgICAgICAgICAgICAgICAgICAgZXNhYyA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisJCWZpCisJCWlmIFsgIiR7SFBfQVJDSH0iID0gIiIgXTsgdGhlbgorCQkgICAgZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQkgICAgc2VkICdzL14gICAgICAgICAgICAgIC8vJyA8PCBFT0YgPiRkdW1teS5jCisKKyAgICAgICAgICAgICAgI2RlZmluZSBfSFBVWF9TT1VSQ0UKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAgICAgICAgICAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyAgICAgICAgICAgICAgaW50IG1haW4gKCkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgbG9uZyBjcHUgID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKKworICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpCisgICAgICAgICAgICAgIAl7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzJfMDoKKyAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQorICAgICAgICAgICAgICAJICAgIHN3aXRjaCAoYml0cykKKyAgICAgICAgICAgICAgCQl7CisgICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOworICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKKyAgICAgICAgICAgICAgCQl9IGJyZWFrOworICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLworICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgCWRlZmF1bHQ6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgICAgZXhpdCAoMCk7CisgICAgICAgICAgICAgIH0KK0VPRgorCQkgICAgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwpICYmIEhQX0FSQ0g9YCRkdW1teWAKKwkJICAgIHRlc3QgLXogIiRIUF9BUkNIIiAmJiBIUF9BUkNIPWhwcGEKKwkJZmkgOzsKKwllc2FjCisJaWYgWyAke0hQX0FSQ0h9ID0gImhwcGEyLjB3IiBdCisJdGhlbgorCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisKKwkgICAgIyBocHBhMi4wdy1ocC1ocHV4KiBoYXMgYSA2NC1iaXQga2VybmVsIGFuZCBhIGNvbXBpbGVyIGdlbmVyYXRpbmcKKwkgICAgIyAzMi1iaXQgY29kZS4gIGhwcGE2NC1ocC1ocHV4KiBoYXMgdGhlIHNhbWUga2VybmVsIGFuZCBhIGNvbXBpbGVyCisJICAgICMgZ2VuZXJhdGluZyA2NC1iaXQgY29kZS4gIEdOVSBhbmQgSFAgdXNlIGRpZmZlcmVudCBub21lbmNsYXR1cmU6CisJICAgICMKKwkgICAgIyAkIENDX0ZPUl9CVUlMRD1jYyAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGEyLjB3LWhwLWhwdXgxMS4yMworCSAgICAjICQgQ0NfRk9SX0JVSUxEPSJjYyArREEyLjB3IiAuL2NvbmZpZy5ndWVzcworCSAgICAjID0+IGhwcGE2NC1ocC1ocHV4MTEuMjMKKworCSAgICBpZiBlY2hvIF9fTFA2NF9fIHwgKENDT1BUUz0gJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsKSB8CisJCWdyZXAgLXEgX19MUDY0X18KKwkgICAgdGhlbgorCQlIUF9BUkNIPSJocHBhMi4wdyIKKwkgICAgZWxzZQorCQlIUF9BUkNIPSJocHBhNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9CisJZXhpdCA7OworICAgIGlhNjQ6SFAtVVg6KjoqKQorCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAorCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgMzA1MCo6SEktVVg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpbmNsdWRlIDx1bmlzdGQuaD4KKwlpbnQKKwltYWluICgpCisJeworCSAgbG9uZyBjcHUgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCSAgLyogVGhlIG9yZGVyIG1hdHRlcnMsIGJlY2F1c2UgQ1BVX0lTX0hQX01DNjhLIGVycm9uZW91c2x5IHJldHVybnMKKwkgICAgIHRydWUgZm9yIENQVV9QQV9SSVNDMV8wLiAgQ1BVX0lTX1BBX1JJU0MgcmV0dXJucyBjb3JyZWN0CisJICAgICByZXN1bHRzLCBob3dldmVyLiAgKi8KKwkgIGlmIChDUFVfSVNfUEFfUklTQyAoY3B1KSkKKwkgICAgeworCSAgICAgIHN3aXRjaCAoY3B1KQorCQl7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzE6IHB1dHMgKCJocHBhMS4xLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBjYXNlIENQVV9QQV9SSVNDMl8wOiBwdXRzICgiaHBwYTIuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgZGVmYXVsdDogcHV0cyAoImhwcGEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQl9CisJICAgIH0KKwkgIGVsc2UgaWYgKENQVV9JU19IUF9NQzY4SyAoY3B1KSkKKwkgICAgcHV0cyAoIm02OGstaGl0YWNoaS1oaXV4d2UyIik7CisJICBlbHNlIHB1dHMgKCJ1bmtub3duLWhpdGFjaGktaGl1eHdlMiIpOworCSAgZXhpdCAoMCk7CisJfQorRU9GCisJJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwkJeyBlY2hvICIkU1lTVEVNX05BTUUiOyBleGl0OyB9CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgOzsKKyAgICA5MDAwLzc/Pzo0LjNic2Q6KjoqIHwgOTAwMC84P1s3OV06NC4zYnNkOio6KiApCisJZWNobyBocHBhMS4xLWhwLWJzZAorCWV4aXQgOzsKKyAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1ic2QKKwlleGl0IDs7CisgICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAorCWV4aXQgOzsKKyAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtb3NmCisJZXhpdCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDs7CisgICAgaSo4NjpPU0YxOio6KikKKwlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtaworCWVsc2UKKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQorCWZpCisJZXhpdCA7OworICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKKwllY2hvIGhwcGExLjEtaHAtbGl0ZXMKKwlleGl0IDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorICAgICAgICBleGl0IDs7CisgICAgQzM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM0KjoqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQorCWVjaG8gYzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQ1JBWSpZLU1QOio6KjoqKQorCWVjaG8geW1wLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqW0EtWl05MDoqOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IFwKKwl8IHNlZCAtZSAncy9DUkFZLipcKFtBLVpdOTBcKS9cMS8nIFwKKwkgICAgICAtZSB5L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaL2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LyBcCisJICAgICAgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlRTOio6KjoqKQorCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVDNFOio6KjoqKQorCWVjaG8gYWxwaGFldjUtY3JheS11bmljb3NtayR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBDUkFZKlNWMToqOio6KikKKwllY2hvIHN2MS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICAqOlVOSUNPUy9tcDoqOiopCisJZWNobyBjcmF5bnYtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJworCWV4aXQgOzsKKyAgICBGMzBbMDFdOlVOSVhfU3lzdGVtX1Y6KjoqIHwgRjcwMDpVTklYX1N5c3RlbV9WOio6KikKKwlGVUpJVFNVX1BST0M9YHVuYW1lIC1tIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCisgICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCisgICAgICAgIGVjaG8gIiR7RlVKSVRTVV9QUk9DfS1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgOzsKKyAgICA1MDAwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAic3BhcmMtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgorCWV4aXQgOzsKKyAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgc3BhcmMqOkJTRC9PUzoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWNhc2UgJHtVTkFNRV9NQUNISU5FfSBpbgorCSAgICBwYzk4KQorCQllY2hvIGkzODYtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICBhbWQ2NCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCSAgICAqKQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYCA7OworCWVzYWMKKwlleGl0IDs7CisgICAgaSo6Q1lHV0lOKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KKwlleGl0IDs7CisgICAgKjpNSU5HVyo6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgorCWV4aXQgOzsKKyAgICBpKjp3aW5kb3dzMzIqOiopCisgICAgCSMgdW5hbWUgLW0gaW5jbHVkZXMgIi1wYyIgb24gdGhpcyBzeXN0ZW0uCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOlBXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCisJZXhpdCA7OworICAgICo6SW50ZXJpeCo6KikKKyAgICAJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHg4NikKKwkJZWNobyBpNTg2LXBjLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwkgICAgYXV0aGVudGljYW1kIHwgZ2VudWluZWludGVsIHwgRU02NFQpCisJCWVjaG8geDg2XzY0LXVua25vd24taW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBJQTY0KQorCQllY2hvIGlhNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJZXNhYyA7OworICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKKwllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcworCWV4aXQgOzsKKyAgICA4NjY0OldpbmRvd3NfTlQ6KikKKwllY2hvIHg4Nl82NC1wYy1ta3MKKwlleGl0IDs7CisgICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCisJIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPworCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCisJIyBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZCBvZiBpMzg2PworCWVjaG8gaTU4Ni1wYy1pbnRlcml4CisJZXhpdCA7OworICAgIGkqOlVXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KKwlleGl0IDs7CisgICAgYW1kNjQ6Q1lHV0lOKjoqOiogfCB4ODZfNjQ6Q1lHV0lOKjoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcCo6Q1lHV0lOKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luCisJZXhpdCA7OworICAgIHByZXAqOlN1bk9TOjUuKjoqKQorCWVjaG8gcG93ZXJwY2xlLXVua25vd24tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgKjpHTlU6KjoqKQorCSMgdGhlIEdOVSBzeXN0ZW0KKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDs7CisgICAgKjpHTlUvKjoqOiopCisJIyBvdGhlciBzeXN0ZW1zIHdpdGggR05VIGxpYmMgYW5kIHVzZXJsYW5kCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYGVjaG8gJHtVTkFNRV9TWVNURU19IHwgc2VkICdzLF5bXi9dKi8sLCcgfCB0ciAnW0EtWl0nICdbYS16XSdgYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy0oXS4qLy8nYC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpNaW5peDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW1pbml4CisJZXhpdCA7OworICAgIGFscGhhOkxpbnV4Oio6KikKKwljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgorCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKKwkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OworCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OworCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKKwkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OworCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7CisgICAgICAgIGVzYWMKKwlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIC1xIGxkLnNvLjEKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbiBMSUJDPSJsaWJjMSIgOyBlbHNlIExJQkM9IiIgOyBmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudSR7TElCQ30KKwlleGl0IDs7CisgICAgYXJtKjpMaW51eDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCWlmIGVjaG8gX19BUk1fRUFCSV9fIHwgJENDX0ZPUl9CVUlMRCAtRSAtIDI+L2Rldi9udWxsIFwKKwkgICAgfCBncmVwIC1xIF9fQVJNX0VBQklfXworCXRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVlYWJpCisJZmkKKwlleGl0IDs7CisgICAgYXZyMzIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3JpczpMaW51eDoqOiopCisJZWNobyBjcmlzLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGNyaXN2MzI6TGludXg6KjoqKQorCWVjaG8gY3Jpc3YzMi1heGlzLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBmcnY6TGludXg6KjoqKQorICAgIAllY2hvIGZydi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkxpbnV4Oio6KikKKwlMSUJDPWdudQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSNpZmRlZiBfX2RpZXRsaWJjX18KKwlMSUJDPWRpZXRsaWJjCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkxJQkMnYAorCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtJHtMSUJDfSIKKwlleGl0IDs7CisgICAgaWE2NDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG0zMnIqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTY4KjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIG1pcHM6TGludXg6KjoqIHwgbWlwczY0OkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKKwkjdW5kZWYgQ1BVCisJI3VuZGVmICR7VU5BTUVfTUFDSElORX0KKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfWVsCisJI2lmIGRlZmluZWQoX19NSVBTRUxfXykgfHwgZGVmaW5lZChfX01JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKE1JUFNFTCkKKwlDUFU9JHtVTkFNRV9NQUNISU5FfWVsCisJI2Vsc2UKKwkjaWYgZGVmaW5lZChfX01JUFNFQl9fKSB8fCBkZWZpbmVkKF9fTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoTUlQU0VCKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9CisJI2Vsc2UKKwlDUFU9CisJI2VuZGlmCisJI2VuZGlmCitFT0YKKwlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCAnXkNQVSdgCisJdGVzdCB4IiR7Q1BVfSIgIT0geCAmJiB7IGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSI7IGV4aXQ7IH0KKwk7OworICAgIG9yMzI6TGludXg6KjoqKQorCWVjaG8gb3IzMi11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYWRyZTpMaW51eDoqOiopCisJZWNobyBzcGFyYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwYXJpc2M2NDpMaW51eDoqOiogfCBocHBhNjQ6TGludXg6KjoqKQorCWVjaG8gaHBwYTY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKKwkjIExvb2sgZm9yIENQVSBsZXZlbAorCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCisJICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKKwkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OworCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBwcGM2NDpMaW51eDoqOiopCisJZWNobyBwb3dlcnBjNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcHBjOkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgczM5MDpMaW51eDoqOiogfCBzMzkweDpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LWlibS1saW51eAorCWV4aXQgOzsKKyAgICBzaDY0KjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzaCo6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzcGFyYzpMaW51eDoqOiogfCBzcGFyYzY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgdmF4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB4ODZfNjQ6TGludXg6KjoqKQorCWVjaG8geDg2XzY0LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHh0ZW5zYSo6TGludXg6KjoqKQorICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgaSo4NjpEWU5JWC9wdHg6NCo6KikKKwkjIHB0eCA0LjAgZG9lcyB1bmFtZSAtcyBjb3JyZWN0bHksIHdpdGggRFlOSVgvcHR4IGluIHRoZXJlLgorCSMgZWFybGllciB2ZXJzaW9ucyBhcmUgbWVzc2VkIHVwIGFuZCBwdXQgdGhlIG5vZGVuYW1lIGluIGJvdGgKKwkjIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCisgICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KKyAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgorICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCisJIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgorICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Ok9TLzI6KjoqKQorCSMgSWYgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgYHVuYW1lJywgdGhlbiBFTVggVW5peCBjb21wYXRpYmlsaXR5CisJIyBpcyBwcm9iYWJseSBpbnN0YWxsZWQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLW9zMi1lbXgKKwlleGl0IDs7CisgICAgaSo4NjpYVFMtMzAwOio6U1RPUCkKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zdG9wCisJZXhpdCA7OworICAgIGkqODY6YXRoZW9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKKwlleGl0IDs7CisgICAgaSo4NjpzeWxsYWJsZToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5bGxhYmxlCisJZXhpdCA7OworICAgIGkqODY6THlueE9TOjIuKjoqIHwgaSo4NjpMeW54T1M6My5bMDFdKjoqIHwgaSo4NjpMeW54T1M6NC5bMDJdKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgaSo4NjoqRE9TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAorCWV4aXQgOzsKKyAgICBpKjg2Oio6NC4qOiogfCBpKjg2OlNZU1RFTV9WOjQuKjoqKQorCVVOQU1FX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgc2VkICdzL1wvTVAkLy8nYAorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTH0KKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2JHtVTkFNRV9SRUx9CisJZmkKKwlleGl0IDs7CisgICAgaSo4NjoqOjU6WzY3OF0qKQorICAgIAkjIFVuaXhXYXJlIDcueCwgT3BlblVOSVggYW5kIE9wZW5TZXJ2ZXIgNi4KKwljYXNlIGAvYmluL3VuYW1lIC1YIHwgZ3JlcCAiXk1hY2hpbmUiYCBpbgorCSAgICAqNDg2KikJICAgICBVTkFNRV9NQUNISU5FPWk0ODYgOzsKKwkgICAgKlBlbnRpdW0pCSAgICAgVU5BTUVfTUFDSElORT1pNTg2IDs7CisJICAgICpQZW50KnwqQ2VsZXJvbikgVU5BTUVfTUFDSElORT1pNjg2IDs7CisJZXNhYworCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9JHtVTkFNRV9TWVNURU19JHtVTkFNRV9WRVJTSU9OfQorCWV4aXQgOzsKKyAgICBpKjg2Oio6My4yOiopCisJaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgorCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCisJZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8Z3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCBpODA0ODYgPi9kZXYvbnVsbCkgJiYgVU5BTUVfTUFDSElORT1pNDg2CisJCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnQgKklJJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0gUHJvJyA+L2Rldi9udWxsKSBcCisJCQkmJiBVTkFNRV9NQUNISU5FPWk2ODYKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNjbyRVTkFNRV9SRUwKKwllbHNlCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2MzIKKwlmaQorCWV4aXQgOzsKKyAgICBwYzoqOio6KikKKwkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKKyAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKKyAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTU4Ni4KKwkjIE5vdGU6IHdoYXRldmVyIHRoaXMgaXMsIGl0IE1VU1QgYmUgdGhlIHNhbWUgYXMgd2hhdCBjb25maWcuc3ViCisJIyBwcmludHMgZm9yIHRoZSAiZGpncHAiIGhvc3QsIG9yIGVsc2UgR0RCIGNvbmZpZ3VyeSB3aWxsIGRlY2lkZSB0aGF0CisJIyB0aGlzIGlzIGEgY3Jvc3MtYnVpbGQuCisJZWNobyBpNTg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCA7OworICAgIEludGVsOk1hY2g6Myo6KikKKwllY2hvIGkzODYtcGMtbWFjaDMKKwlleGl0IDs7CisgICAgcGFyYWdvbjoqOio6KikKKwllY2hvIGk4NjAtaW50ZWwtb3NmMQorCWV4aXQgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCA7OworICAgIG1pbmkqOkNUSVg6U1lTKjU6KikKKwkjICJtaW5pZnJhbWUiCisJZWNobyBtNjgwMTAtY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKKwllY2hvIG02OGstY29udmVyZ2VudC1zeXN2CisJZXhpdCA7OworICAgIE02ODA/MDpELU5JWDo1LjM6KikKKwllY2hvIG02OGstZGlhYi1kbml4CisJZXhpdCA7OworICAgIE02OCo6KjpSM1ZbNTY3OF0qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIHsgZWNobyAnbTY4ay1tb3Rvcm9sYS1zeXN2JzsgZXhpdDsgfSA7OworICAgIDNbMzQ1XT8/Oio6NC4wOjMuMCB8IDNbMzRdPz9BOio6NC4wOjMuMCB8IDNbMzRdPz8sKjoqOjQuMDozLjAgfCAzWzM0XT8/Lyo6Kjo0LjA6My4wIHwgNDQwMDoqOjQuMDozLjAgfCA0ODUwOio6NC4wOjMuMCB8IFNLQTQwOio6NC4wOjMuMCB8IFNEUzI6Kjo0LjA6My4wIHwgU0hHMjoqOjQuMDozLjAgfCBTNzUwMSo6Kjo0LjA6My4wKQorCU9TX1JFTD0nJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSYmIE9TX1JFTD0uYHNlZCAtbiAncy9bXiBdKiBbXiBdKiBcKFswLTldWzAtOV1cKS4qL1wxL3AnIDwgL2V0Yy8ucmVsaWRgCisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0OyBleGl0OyB9IDs7CisgICAgTkNSKjoqOjQuMjoqIHwgTVBSQVMqOio6NC4yOiopCisJT1NfUkVMPScuMycKKwl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKKwkgICAgJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk0ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0KKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIHB0ZXJvbiA+L2Rldi9udWxsIFwKKwkgICAgJiYgeyBlY2hvIGk1ODYtbmNyLXN5c3Y0LjMke09TX1JFTH07IGV4aXQ7IH0gOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KiB8IG02OCo6THlueE9TOjMuMCo6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1jNjgwMzA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKwllY2hvIG02OGstYXRhcmktc3lzdjQKKwlleGl0IDs7CisgICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCisJZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcnM2MDAwOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXJQQzpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzozLlswMV0qOiogfCBQb3dlclBDOkx5bnhPUzo0LlswMl0qOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUk0qOlJlbGlhbnRVTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgUk0qOlNJTklYLSo6KjoqKQorCWVjaG8gbWlwcy1zbmktc3lzdjQKKwlleGl0IDs7CisgICAgKjpTSU5JWC0qOio6KikKKwlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgorCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAorCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0CisJZWxzZQorCQllY2hvIG5zMzJrLXNuaS1zeXN2CisJZmkKKwlleGl0IDs7CisgICAgUEVOVElVTToqOjQuMCo6KikgIyBVbmlzeXMgYENsZWFyUGF0aCBITVAgSVggNDAwMCcgU1ZSNC9NUCBlZmZvcnQKKyAgICAgICAgICAgICAgICAgICAgICAjIHNheXMgPFJpY2hhcmQuTS5CYXJ0ZWxAY2NNYWlsLkNlbnN1cy5HT1Y+CisgICAgICAgIGVjaG8gaTU4Ni11bmlzeXMtc3lzdjQKKyAgICAgICAgZXhpdCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgOzsKKyAgICAqOio6KjpGVFgqKQorCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgorCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgIGkqODY6Vk9TOio6KikKKwkjIEZyb20gUGF1bC5HcmVlbkBzdHJhdHVzLmNvbS4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tc3RyYXR1cy12b3MKKwlleGl0IDs7CisgICAgKjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBuZXdzKjpORVdTLU9TOjYqOiopCisJZWNobyBtaXBzLXNvbnktbmV3c29zNgorCWV4aXQgOzsKKyAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKKwlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KKwkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwllbHNlCisJICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWJlLWJlb3MKKwlleGl0IDs7CisgICAgQmVNYWM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIE1hYyBvciBNYWMgY2xvbmUsIFBQQyBvbmx5LgorCWVjaG8gcG93ZXJwYy1hcHBsZS1iZW9zCisJZXhpdCA7OworICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpIYWlrdToqOiopCSMgSGFpa3UgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgorCWVjaG8gaTU4Ni1wYy1oYWlrdQorCWV4aXQgOzsKKyAgICBTWC00OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNTpTVVBFUi1VWDoqOiopCisJZWNobyBzeDUtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTY6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g2LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC03OlNVUEVSLVVYOio6KikKKwllY2hvIHN4Ny1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtODpTVVBFUi1VWDoqOiopCisJZWNobyBzeDgtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLThSOlNVUEVSLVVYOio6KikKKwllY2hvIHN4OHItbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFBvd2VyKjpSaGFwc29keToqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLXJoYXBzb2R5JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlJoYXBzb2R5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RGFyd2luOio6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYCB8fCBVTkFNRV9QUk9DRVNTT1I9dW5rbm93bgorCWNhc2UgJFVOQU1FX1BST0NFU1NPUiBpbgorCSAgICBpMzg2KQorCQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCQkgIGlmIChlY2hvICcjaWZkZWYgX19MUDY0X18nOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkgICAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQkgICAgICBncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCQkgIHRoZW4KKwkJICAgICAgVU5BTUVfUFJPQ0VTU09SPSJ4ODZfNjQiCisJCSAgZmkKKwkJZmkgOzsKKwkgICAgdW5rbm93bikgVU5BTUVfUFJPQ0VTU09SPXBvd2VycGMgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tYXBwbGUtZGFyd2luJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKKwlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAorCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KKwkJVU5BTUVfUFJPQ0VTU09SPWkzODYKKwkJVU5BTUVfTUFDSElORT1wYworCWZpCisJZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlFOWDoqOjQqKQorCWVjaG8gaTM4Ni1wYy1xbngKKwlleGl0IDs7CisgICAgTlNFLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNlLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIE5TUi0/Ok5PTlNUT1BfS0VSTkVMOio6KikKKwllY2hvIG5zci10YW5kZW0tbnNrJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk5vblN0b3AtVVg6KjoqKQorCWVjaG8gbWlwcy1jb21wYXEtbm9uc3RvcHV4CisJZXhpdCA7OworICAgIEJTMjAwMDpQT1NJWCo6KjoqKQorCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgorCWV4aXQgOzsKKyAgICBEUy8qOlVOSVhfU3lzdGVtX1Y6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS0ke1VOQU1FX1NZU1RFTX0tJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlBsYW45Oio6KikKKwkjICJ1bmFtZSAtbSIgaXMgbm90IGNvbnNpc3RlbnQsIHNvIHVzZSAkY3B1dHlwZSBpbnN0ZWFkLiAzODYKKwkjIGlzIGNvbnZlcnRlZCB0byBpMzg2IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHg4NgorCSMgb3BlcmF0aW5nIHN5c3RlbXMuCisJaWYgdGVzdCAiJGNwdXR5cGUiID0gIjM4NiI7IHRoZW4KKwkgICAgVU5BTUVfTUFDSElORT1pMzg2CisJZWxzZQorCSAgICBVTkFNRV9NQUNISU5FPSIkY3B1dHlwZSIKKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXBsYW45CisJZXhpdCA7OworICAgICo6VE9QUy0xMDoqOiopCisJZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAorCWV4aXQgOzsKKyAgICAqOlRFTkVYOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdGVuZXgKKwlleGl0IDs7CisgICAgS1MxMDpUT1BTLTIwOio6KiB8IEtMMTA6VE9QUy0yMDoqOiogfCBUWVBFNDpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLWRlYy10b3BzMjAKKwlleGl0IDs7CisgICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXhrbC10b3BzMjAKKwlleGl0IDs7CisgICAgKjpUT1BTLTIwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczIwCisJZXhpdCA7OworICAgICo6SVRTOio6KikKKwllY2hvIHBkcDEwLXVua25vd24taXRzCisJZXhpdCA7OworICAgIFNFSToqOio6U0VJVVgpCisgICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RHJhZ29uRmx5Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1kcmFnb25mbHlgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCA7OworICAgICo6KlZNUzoqOiopCisgICAgCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgQSopIGVjaG8gYWxwaGEtZGVjLXZtcyA7IGV4aXQgOzsKKwkgICAgSSopIGVjaG8gaWE2NC1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBWKikgZWNobyB2YXgtZGVjLXZtcyA7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgKjpYRU5JWDoqOlN5c1YpCisJZWNobyBpMzg2LXBjLXhlbml4CisJZXhpdCA7OworICAgIGkqODY6c2t5b3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1za3lvc2BlY2hvICR7VU5BTUVfUkVMRUFTRX1gIHwgc2VkIC1lICdzLyAuKiQvLycKKwlleGl0IDs7CisgICAgaSo4NjpyZG9zOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtcmRvcworCWV4aXQgOzsKKyAgICBpKjg2OkFST1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1hcm9zCisJZXhpdCA7OworZXNhYworCisjZWNobyAnKE5vIHVuYW1lIGNvbW1hbmQgb3IgdW5hbWUgb3V0cHV0IG5vdCByZWNvZ25pemVkLiknIDE+JjIKKyNlY2hvICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIDE+JjIKKworZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorY2F0ID4kZHVtbXkuYyA8PEVPRgorI2lmZGVmIF9TRVFVRU5UXworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNlbmRpZgorbWFpbiAoKQoreworI2lmIGRlZmluZWQgKHNvbnkpCisjaWYgZGVmaW5lZCAoTUlQU0VCKQorICAvKiBCRkQgd2FudHMgImJzZCIgaW5zdGVhZCBvZiAibmV3c29zIi4gIFBlcmhhcHMgQkZEIHNob3VsZCBiZSBjaGFuZ2VkLAorICAgICBJIGRvbid0IGtub3cuLi4uICAqLworICBwcmludGYgKCJtaXBzLXNvbnktYnNkXG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorICBwcmludGYgKCJtNjhrLXNvbnktbmV3c29zJXNcbiIsCisjaWZkZWYgTkVXU09TNAorICAgICAgICAgICI0IgorI2Vsc2UKKwkgICIiCisjZW5kaWYKKyAgICAgICAgICk7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fYXJtKSAmJiBkZWZpbmVkIChfX2Fjb3JuKSAmJiBkZWZpbmVkIChfX3VuaXgpCisgIHByaW50ZiAoImFybS1hY29ybi1yaXNjaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoaHAzMDApICYmICFkZWZpbmVkIChocHV4KQorICBwcmludGYgKCJtNjhrLWhwLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChOZVhUKQorI2lmICFkZWZpbmVkIChfX0FSQ0hJVEVDVFVSRV9fKQorI2RlZmluZSBfX0FSQ0hJVEVDVFVSRV9fICJtNjhrIgorI2VuZGlmCisgIGludCB2ZXJzaW9uOworICB2ZXJzaW9uPWAoaG9zdGluZm8gfCBzZWQgLW4gJ3MvLipOZVhUIE1hY2ggXChbMC05XSpcKS4qL1wxL3AnKSAyPi9kZXYvbnVsbGA7CisgIGlmICh2ZXJzaW9uIDwgNCkKKyAgICBwcmludGYgKCIlcy1uZXh0LW5leHRzdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBlbHNlCisgICAgcHJpbnRmICgiJXMtbmV4dC1vcGVuc3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjIGlmICFkZWZpbmVkICh1bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyMgIGlmIGRlZmluZWQgKEJTRCkKKyMgICBpZiBCU0QgPT0gNDMKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zXG4iKTsgZXhpdCAoMCk7CisjICAgZWxzZQorIyAgICBpZiBCU0QgPT0gMTk5MDA2CisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZDQuM3Jlbm9cbiIpOyBleGl0ICgwKTsKKyMgICAgZWxzZQorICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZWxzZQorICAgIHByaW50ZiAoInZheC1kZWMtYnNkXG4iKTsgZXhpdCAoMCk7CisjICBlbmRpZgorIyBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy11bHRyaXhcbiIpOyBleGl0ICgwKTsKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgMj4vZGV2L251bGwgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAgJiYKKwl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKworIyBBcG9sbG9zIHB1dCB0aGUgc3lzdGVtIHR5cGUgaW4gdGhlIGVudmlyb25tZW50LgorCit0ZXN0IC1kIC91c3IvYXBvbGxvICYmIHsgZWNobyAke0lTUH0tYXBvbGxvLSR7U1lTVFlQRX07IGV4aXQ7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMiopCisJaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCisJdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCisJZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKKwlmaQorCWV4aXQgOzsKKyAgICBjMzQqKQorCWVjaG8gYzM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGM0KikKKwllY2hvIGM0LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgZXNhYworZmkKKworY2F0ID4mMiA8PEVPRgorJDA6IHVuYWJsZSB0byBndWVzcyBzeXN0ZW0gdHlwZQorCitUaGlzIHNjcmlwdCwgbGFzdCBtb2RpZmllZCAkdGltZXN0YW1wLCBoYXMgZmFpbGVkIHRvIHJlY29nbml6ZQordGhlIG9wZXJhdGluZyBzeXN0ZW0geW91IGFyZSB1c2luZy4gSXQgaXMgYWR2aXNlZCB0aGF0IHlvdQorZG93bmxvYWQgdGhlIG1vc3QgdXAgdG8gZGF0ZSB2ZXJzaW9uIG9mIHRoZSBjb25maWcgc2NyaXB0cyBmcm9tCisKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5ndWVzcztoYj1IRUFECithbmQKKyAgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCitJZiB0aGUgdmVyc2lvbiB5b3UgcnVuICgkMCkgaXMgYWxyZWFkeSB1cCB0byBkYXRlLCBwbGVhc2UKK3NlbmQgdGhlIGZvbGxvd2luZyBkYXRhIGFuZCBhbnkgaW5mb3JtYXRpb24geW91IHRoaW5rIG1pZ2h0IGJlCitwZXJ0aW5lbnQgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+IGluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIG5lZWRlZAoraW5mb3JtYXRpb24gdG8gaGFuZGxlIHlvdXIgc3lzdGVtLgorCitjb25maWcuZ3Vlc3MgdGltZXN0YW1wID0gJHRpbWVzdGFtcAorCit1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXMgPSBgKHVuYW1lIC1zKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKworL3Vzci9iaW4vdW5hbWUgLXAgPSBgKC91c3IvYmluL3VuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKy9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbGAKKworaG9zdGluZm8gICAgICAgICAgICAgICA9IGAoaG9zdGluZm8pIDI+L2Rldi9udWxsYAorL2Jpbi91bml2ZXJzZSAgICAgICAgICA9IGAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbGAKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGxgCisvdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbGAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsYAorCitVTkFNRV9NQUNISU5FID0gJHtVTkFNRV9NQUNISU5FfQorVU5BTUVfUkVMRUFTRSA9ICR7VU5BTUVfUkVMRUFTRX0KK1VOQU1FX1NZU1RFTSAgPSAke1VOQU1FX1NZU1RFTX0KK1VOQU1FX1ZFUlNJT04gPSAke1VOQU1FX1ZFUlNJT059CitFT0YKKworZXhpdCAxCisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9jb25maWcuc3ViIGIvbmZzLXV0aWxzLTEuMi4yL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmE1NWE1MAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9jb25maWcuc3ViCkBAIC0wLDAgKzEsMTcwNSBAQAorIyEgL2Jpbi9zaAorIyBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gc3Vicm91dGluZSBzY3JpcHQuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorIyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkKKyMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKwordGltZXN0YW1wPScyMDA5LTExLTIwJworCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAorIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBHTlUgQ2hhbmdlTG9nIGVudHJ5LgorIworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBZb3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBzY3JpcHQgZnJvbToKKyMgaHR0cDovL2dpdC5zYXZhbm5haC5nbnUub3JnL2dpdHdlYi8/cD1jb25maWcuZ2l0O2E9YmxvYl9wbGFpbjtmPWNvbmZpZy5zdWI7aGI9SEVBRAorCisjIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcworIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKKyMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KKyMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKKyMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCisjIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKKyMgY29uZmlndXJhdGlvbi4KKworIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KKyMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KKyMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgorIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KKyMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgorCittZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCisgICAgICAgJDAgW09QVElPTl0gQUxJQVMKKworQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQorCitDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCisyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCisgICAgICAgZXhpdCAxIDs7CisKKyAgICAqbG9jYWwqKQorICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorICAgICAgIGVjaG8gJDEKKyAgICAgICBleGl0IDs7CisKKyAgICAqICkKKyAgICAgICBicmVhayA7OworICBlc2FjCitkb25lCisKK2Nhc2UgJCMgaW4KKyAwKSBlY2hvICIkbWU6IG1pc3NpbmcgYXJndW1lbnQkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKKyAxKSA7OworICopIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICAgIGV4aXQgMTs7Citlc2FjCisKKyMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KKyMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCittYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKK2Nhc2UgJG1heWJlX29zIGluCisgIG50by1xbngqIHwgbGludXgtZ251KiB8IGxpbnV4LWRpZXRsaWJjIHwgbGludXgtbmV3bGliKiB8IGxpbnV4LXVjbGliYyogfCBcCisgIHVjbGludXgtdWNsaWJjKiB8IHVjbGludXgtZ251KiB8IGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IFwKKyAga29wZW5zb2xhcmlzKi1nbnUqIHwgXAorICBzdG9ybS1jaGFvcyogfCBvczItZW14KiB8IHJ0bWstbm92YSopCisgICAgb3M9LSRtYXliZV9vcworICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCisgICAgOzsKKyAgKikKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCisgICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCisgICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAorICAgIGVsc2Ugb3M9OyBmaQorICAgIDs7Citlc2FjCisKKyMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbworIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KKyMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKKyMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgorY2FzZSAkb3MgaW4KKwktc3VuKm9zKikKKwkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCisJCTs7CisJLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKKwktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKKwktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAorCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCisJLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKKwktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKKwktYXBwbGUgfCAtYXhpcyB8IC1rbnV0aCB8IC1jcmF5IHwgLW1pY3JvYmxhemUpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgICAgICAgIC1ibHVlZ2VuZSopCisJICAgICAgICBvcz0tY25rCisJCTs7CisJLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCisJCW9zPQorCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisJLXNjb3V0KQorCQk7OworCS13cnMpCisJCW9zPS12eHdvcmtzCisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktY2hvcnVzb3MqKQorCQlvcz0tY2hvcnVzb3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworIAktY2hvcnVzcmRiKQorIAkJb3M9LWNob3J1c3JkYgorCQliYXNpY19tYWNoaW5lPSQxCisgCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNikKKwkJb3M9LXNjbzV2NgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzUpCisJCW9zPS1zY28zLjJ2NQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzQpCisJCW9zPS1zY28zLjJ2NAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMi5bNC05XSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjJ2WzQtOV0qKQorCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzV2NiopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvKikKKwkJb3M9LXNjbzMuMnYyCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktdWRrKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKKwktbWludCB8IC1taW50WzAtOV0qKQorCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKKwkJb3M9LW1pbnQKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCTE3NTBhIHwgNTgwIFwKKwl8IGEyOWsgXAorCXwgYWxwaGEgfCBhbHBoYWV2WzQtOF0gfCBhbHBoYWV2NTYgfCBhbHBoYWV2Nls3OF0gfCBhbHBoYXBjYTVbNjddIFwKKwl8IGFscGhhNjQgfCBhbHBoYTY0ZXZbNC04XSB8IGFscGhhNjRldjU2IHwgYWxwaGE2NGV2Nls3OF0gfCBhbHBoYTY0cGNhNVs2N10gXAorCXwgYW0zM18yLjAgXAorCXwgYXJjIHwgYXJtIHwgYXJtW2JsXWUgfCBhcm1lW2xiXSB8IGFybXZbMjM0NV0gfCBhcm12WzM0NV1bbGJdIHwgYXZyIHwgYXZyMzIgXAorCXwgYmZpbiBcCisJfCBjNHggfCBjbGlwcGVyIFwKKwl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCisJfCBmaWRvIHwgZnIzMCB8IGZydiBcCisJfCBoODMwMCB8IGg4NTAwIHwgaHBwYSB8IGhwcGExLlswMV0gfCBocHBhMi4wIHwgaHBwYTIuMFtud10gfCBocHBhNjQgXAorCXwgaTM3MCB8IGk4NjAgfCBpOTYwIHwgaWE2NCBcCisJfCBpcDJrIHwgaXEyMDAwIFwKKwl8IGxtMzIgXAorCXwgbTMyYyB8IG0zMnIgfCBtMzJybGUgfCBtNjgwMDAgfCBtNjhrIHwgbTg4ayBcCisJfCBtYXhxIHwgbWIgfCBtaWNyb2JsYXplIHwgbWNvcmUgfCBtZXAgfCBtZXRhZyBcCisJfCBtaXBzIHwgbWlwc2JlIHwgbWlwc2ViIHwgbWlwc2VsIHwgbWlwc2xlIFwKKwl8IG1pcHMxNiBcCisJfCBtaXBzNjQgfCBtaXBzNjRlbCBcCisJfCBtaXBzNjRvY3Rlb24gfCBtaXBzNjRvY3Rlb25lbCBcCisJfCBtaXBzNjRvcmlvbiB8IG1pcHM2NG9yaW9uZWwgXAorCXwgbWlwczY0cjU5MDAgfCBtaXBzNjRyNTkwMGVsIFwKKwl8IG1pcHM2NHZyIHwgbWlwczY0dnJlbCBcCisJfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCisJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCisJfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCisJfCBtaXBzNjR2cjU5MDAgfCBtaXBzNjR2cjU5MDBlbCBcCisJfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCisJfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAorCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAorCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKKwl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKKwl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCisJfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAorCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAorCXwgbW94aWUgXAorCXwgbXQgXAorCXwgbXNwNDMwIFwKKwl8IG5pb3MgfCBuaW9zMiBcCisJfCBuczE2ayB8IG5zMzJrIFwKKwl8IG9yMzIgXAorCXwgcGRwMTAgfCBwZHAxMSB8IHBqIHwgcGpsIFwKKwl8IHBvd2VycGMgfCBwb3dlcnBjNjQgfCBwb3dlcnBjNjRsZSB8IHBvd2VycGNsZSB8IHBwY2JlIFwKKwl8IHB5cmFtaWQgXAorCXwgcnggXAorCXwgc2NvcmUgXAorCXwgc2ggfCBzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGViIHwgc2hiZSB8IHNobGUgfCBzaFsxMjM0XWxlIHwgc2gzZWxlIFwKKwl8IHNoNjQgfCBzaDY0bGUgXAorCXwgc3BhcmMgfCBzcGFyYzY0IHwgc3BhcmM2NGIgfCBzcGFyYzY0diB8IHNwYXJjODZ4IHwgc3BhcmNsZXQgfCBzcGFyY2xpdGUgXAorCXwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2IFwKKwl8IHNwdSB8IHN0cm9uZ2FybSBcCisJfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAorCXwgdWJpY29tMzIgXAorCXwgdjg1MCB8IHY4NTBlIFwKKwl8IHdlMzJrIFwKKwl8IHg4NiB8IHhjMTZ4IHwgeHNjYWxlIHwgeHNjYWxlZVtibF0gfCB4c3Rvcm15MTYgfCB4dGVuc2EgXAorCXwgejhrIHwgejgwKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwltNjgxMSB8IG02OGhjMTEgfCBtNjgxMiB8IG02OGhjMTIgfCBwaWNvY2hpcCkKKwkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQlvcz0tbm9uZQorCQk7OworCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQorCQk7OworCW1zMSkKKwkJYmFzaWNfbWFjaGluZT1tdC11bmtub3duCisJCTs7CisKKwkjIFdlIHVzZSBgcGMnIHJhdGhlciB0aGFuIGB1bmtub3duJworCSMgYmVjYXVzZSAoMSkgdGhhdCdzIHdoYXQgdGhleSBub3JtYWxseSBhcmUsIGFuZAorCSMgKDIpIHRoZSB3b3JkICJ1bmtub3duIiB0ZW5kcyB0byBjb25mdXNlIGJlZ2lubmluZyB1c2Vycy4KKwlpKjg2IHwgeDg2XzY0KQorCSAgYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS1wYworCSAgOzsKKwkjIE9iamVjdCBpZiBtb3JlIHRoYW4gb25lIGNvbXBhbnkgbmFtZSB3b3JkLgorCSotKi0qKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRoIGNvbXBhbnkgbmFtZS4KKwk1ODAtKiBcCisJfCBhMjlrLSogXAorCXwgYWxwaGEtKiB8IGFscGhhZXZbNC04XS0qIHwgYWxwaGFldjU2LSogfCBhbHBoYWV2Nls3OF0tKiBcCisJfCBhbHBoYTY0LSogfCBhbHBoYTY0ZXZbNC04XS0qIHwgYWxwaGE2NGV2NTYtKiB8IGFscGhhNjRldjZbNzhdLSogXAorCXwgYWxwaGFwY2E1WzY3XS0qIHwgYWxwaGE2NHBjYTVbNjddLSogfCBhcmMtKiBcCisJfCBhcm0tKiAgfCBhcm1iZS0qIHwgYXJtbGUtKiB8IGFybWViLSogfCBhcm12Ki0qIFwKKwl8IGF2ci0qIHwgYXZyMzItKiBcCisJfCBiZmluLSogfCBiczIwMDAtKiBcCisJfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKKwl8IGNsaXBwZXItKiB8IGNyYXludi0qIHwgY3lkcmEtKiBcCisJfCBkMTB2LSogfCBkMzB2LSogfCBkbHgtKiBcCisJfCBlbHhzaS0qIFwKKwl8IGYzMFswMV0tKiB8IGY3MDAtKiB8IGZpZG8tKiB8IGZyMzAtKiB8IGZydi0qIHwgZng4MC0qIFwKKwl8IGg4MzAwLSogfCBoODUwMC0qIFwKKwl8IGhwcGEtKiB8IGhwcGExLlswMV0tKiB8IGhwcGEyLjAtKiB8IGhwcGEyLjBbbnddLSogfCBocHBhNjQtKiBcCisJfCBpKjg2LSogfCBpODYwLSogfCBpOTYwLSogfCBpYTY0LSogXAorCXwgaXAyay0qIHwgaXEyMDAwLSogXAorCXwgbG0zMi0qIFwKKwl8IG0zMmMtKiB8IG0zMnItKiB8IG0zMnJsZS0qIFwKKwl8IG02ODAwMC0qIHwgbTY4MFswMTIzNDZdMC0qIHwgbTY4MzYwLSogfCBtNjgzPzItKiB8IG02OGstKiBcCisJfCBtODgxMTAtKiB8IG04OGstKiB8IG1heHEtKiB8IG1jb3JlLSogfCBtZXRhZy0qIHwgbWljcm9ibGF6ZS0qIFwKKwl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKKwl8IG1pcHMxNi0qIFwKKwl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCisJfCBtaXBzNjRvY3Rlb24tKiB8IG1pcHM2NG9jdGVvbmVsLSogXAorCXwgbWlwczY0b3Jpb24tKiB8IG1pcHM2NG9yaW9uZWwtKiBcCisJfCBtaXBzNjRyNTkwMC0qIHwgbWlwczY0cjU5MDBlbC0qIFwKKwl8IG1pcHM2NHZyLSogfCBtaXBzNjR2cmVsLSogXAorCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKKwl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCisJfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAorCXwgbWlwczY0dnI1OTAwLSogfCBtaXBzNjR2cjU5MDBlbC0qIFwKKwl8IG1pcHNpc2EzMi0qIHwgbWlwc2lzYTMyZWwtKiBcCisJfCBtaXBzaXNhMzJyMi0qIHwgbWlwc2lzYTMycjJlbC0qIFwKKwl8IG1pcHNpc2E2NC0qIHwgbWlwc2lzYTY0ZWwtKiBcCisJfCBtaXBzaXNhNjRyMi0qIHwgbWlwc2lzYTY0cjJlbC0qIFwKKwl8IG1pcHNpc2E2NHNiMS0qIHwgbWlwc2lzYTY0c2IxZWwtKiBcCisJfCBtaXBzaXNhNjRzcjcxay0qIHwgbWlwc2lzYTY0c3I3MWtlbC0qIFwKKwl8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCXwgbW1peC0qIFwKKwl8IG10LSogXAorCXwgbXNwNDMwLSogXAorCXwgbmlvcy0qIHwgbmlvczItKiBcCisJfCBub25lLSogfCBucDEtKiB8IG5zMTZrLSogfCBuczMyay0qIFwKKwl8IG9yaW9uLSogXAorCXwgcGRwMTAtKiB8IHBkcDExLSogfCBwai0qIHwgcGpsLSogfCBwbi0qIHwgcG93ZXItKiBcCisJfCBwb3dlcnBjLSogfCBwb3dlcnBjNjQtKiB8IHBvd2VycGM2NGxlLSogfCBwb3dlcnBjbGUtKiB8IHBwY2JlLSogXAorCXwgcHlyYW1pZC0qIFwKKwl8IHJvbXAtKiB8IHJzNjAwMC0qIHwgcngtKiBcCisJfCBzaC0qIHwgc2hbMTIzNF0tKiB8IHNoWzI0XWEtKiB8IHNoWzI0XWFlYi0qIHwgc2hbMjNdZS0qIHwgc2hbMzRdZWItKiB8IHNoZWItKiB8IHNoYmUtKiBcCisJfCBzaGxlLSogfCBzaFsxMjM0XWxlLSogfCBzaDNlbGUtKiB8IHNoNjQtKiB8IHNoNjRsZS0qIFwKKwl8IHNwYXJjLSogfCBzcGFyYzY0LSogfCBzcGFyYzY0Yi0qIHwgc3BhcmM2NHYtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIFwKKwl8IHNwYXJjbGl0ZS0qIFwKKwl8IHNwYXJjdjgtKiB8IHNwYXJjdjktKiB8IHNwYXJjdjliLSogfCBzcGFyY3Y5di0qIHwgc3Ryb25nYXJtLSogfCBzdjEtKiB8IHN4Py0qIFwKKwl8IHRhaG9lLSogfCB0aHVtYi0qIFwKKwl8IHRpYzMwLSogfCB0aWM0eC0qIHwgdGljNTR4LSogfCB0aWM1NXgtKiB8IHRpYzZ4LSogfCB0aWM4MC0qIHwgdGlsZS0qIFwKKwl8IHRyb24tKiBcCisJfCB1Ymljb20zMi0qIFwKKwl8IHY4NTAtKiB8IHY4NTBlLSogfCB2YXgtKiBcCisJfCB3ZTMyay0qIFwKKwl8IHg4Ni0qIHwgeDg2XzY0LSogfCB4YzE2eC0qIHwgeHBzMTAwLSogfCB4c2NhbGUtKiB8IHhzY2FsZWVbYmxdLSogXAorCXwgeHN0b3JteTE2LSogfCB4dGVuc2EqLSogXAorCXwgeW1wLSogXAorCXwgejhrLSogfCB6ODAtKikKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLCB3aXRoIGdsb2IgbWF0Y2guCisJeHRlbnNhKikKKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCTs7CisJIyBSZWNvZ25pemUgdGhlIHZhcmlvdXMgbWFjaGluZSBuYW1lcyBhbmQgYWxpYXNlcyB3aGljaCBzdGFuZAorCSMgZm9yIGEgQ1BVIHR5cGUgYW5kIGEgY29tcGFueSBhbmQgc29tZXRpbWVzIGV2ZW4gYW4gT1MuCisJMzg2YnNkKQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tYnNkCisJCTs7CisJM2IxIHwgNzMwMCB8IDczMDAtYXR0IHwgYXR0LTczMDAgfCBwYzczMDAgfCBzYWZhcmkgfCB1bml4cGMpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWF0dAorCQk7OworCTNiKikKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlhMjlraGlmKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKyAgICAJYWJhY3VzKQorCQliYXNpY19tYWNoaW5lPWFiYWN1cy11bmtub3duCisJCTs7CisJYWRvYmU2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCisJCW9zPS1zY291dAorCQk7OworCWFsbGlhbnQgfCBmeDgwKQorCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAorCQk7OworCWFsdG9zIHwgYWx0b3MzMDY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKKwkJOzsKKwlhbTI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKKwkJb3M9LWJzZAorCQk7OworCWFtZDY0KQorCQliYXNpY19tYWNoaW5lPXg4Nl82NC1wYworCQk7OworCWFtZDY0LSopCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCTs7CisJYW1pZ2FvcyB8IGFtaWdhZG9zKQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tYW1pZ2FvcworCQk7OworCWFtaWdhdW5peCB8IGFtaXgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXBvbGxvNjhic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LWJzZAorCQk7OworCWFyb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tYXJvcworCQk7OworCWF1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwcGxlCisJCW9zPS1hdXgKKwkJOzsKKwliYWxhbmNlKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJYmxhY2tmaW4pCisJCWJhc2ljX21hY2hpbmU9YmZpbi11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCWJsYWNrZmluLSopCisJCWJhc2ljX21hY2hpbmU9YmZpbi1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlibHVlZ2VuZSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KKwkJb3M9LWNuaworCQk7OworCWM5MCkKKwkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisgICAgICAgIGNlZ2NjKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1jZWdjYworCQk7OworCWNvbnZleC1jMSkKKwkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMikKKwkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzIpCisJCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzNCkKKwkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM4KQorCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNyYXkgfCBqOTApCisJCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyYXludikKKwkJYmFzaWNfbWFjaGluZT1jcmF5bnYtY3JheQorCQlvcz0tdW5pY29zbXAKKwkJOzsKKwljcjE2KQorCQliYXNpY19tYWNoaW5lPWNyMTYtdW5rbm93bgorCQlvcz0tZWxmCisJCTs7CisJY3JkcyB8IHVub3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCisJCTs7CisJY3Jpc3YzMiB8IGNyaXN2MzItKiB8IGV0cmF4ZnMqKQorCQliYXNpY19tYWNoaW5lPWNyaXN2MzItYXhpcworCQk7OworCWNyaXMgfCBjcmlzLSogfCBldHJheCopCisJCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCisJCTs7CisJY3J4KQorCQliYXNpY19tYWNoaW5lPWNyeC11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwlkYTMwIHwgZGEzMC0qKQorCQliYXNpY19tYWNoaW5lPW02OGstZGEzMAorCQk7OworCWRlY3N0YXRpb24gfCBkZWNzdGF0aW9uLTMxMDAgfCBwbWF4IHwgcG1heC0qIHwgcG1pbiB8IGRlYzMxMDAgfCBkZWNzdGF0bikKKwkJYmFzaWNfbWFjaGluZT1taXBzLWRlYworCQk7OworCWRlY3N5c3RlbTEwKiB8IGRlYzEwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMxMAorCQk7OworCWRlY3N5c3RlbTIwKiB8IGRlYzIwKikKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC1kZWMKKwkJb3M9LXRvcHMyMAorCQk7OworCWRlbHRhIHwgMzMwMCB8IG1vdG9yb2xhLTMzMDAgfCBtb3Rvcm9sYS1kZWx0YSBcCisJICAgICAgfCAzMzAwLW1vdG9yb2xhIHwgZGVsdGEtbW90b3JvbGEpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1tb3Rvcm9sYQorCQk7OworCWRlbHRhODgpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1tb3Rvcm9sYQorCQlvcz0tc3lzdjMKKwkJOzsKKwlkaWNvcykKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCW9zPS1kaWNvcworCQk7OworCWRqZ3BwKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJb3M9LW1zZG9zZGpncHAKKwkJOzsKKwlkcHgyMCB8IGRweDIwLSopCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWJ1bGwKKwkJb3M9LWJvc3gKKwkJOzsKKwlkcHgyKiB8IGRweDIqLWJ1bGwpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MworCQk7OworCWVibW9uMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS1lYm1vbgorCQk7OworCWVseHNpKQorCQliYXNpY19tYWNoaW5lPWVseHNpLWVseHNpCisJCW9zPS1ic2QKKwkJOzsKKwllbmNvcmUgfCB1bWF4IHwgbW1heCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1lbmNvcmUKKwkJOzsKKwllczE4MDAgfCBPU0U2OGsgfCBvc2U2OGsgfCBvc2UgfCBPU0UpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJZngyODAwKQorCQliYXNpY19tYWNoaW5lPWk4NjAtYWxsaWFudAorCQk7OworCWdlbml4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLW5zCisJCTs7CisJZ21pY3JvKQorCQliYXNpY19tYWNoaW5lPXRyb24tZ21pY3JvCisJCW9zPS1zeXN2CisJCTs7CisJZ28zMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1nbzMyCisJCTs7CisJaDMwNTByKiB8IGhpdXgqKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQorCQlvcz0taGl1eHdlMgorCQk7OworCWg4MzAwaG1zKQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCWg4MzAweHJheSkKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS14cmF5CisJCTs7CisJaDg1MDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDg1MDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaGFycmlzKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1zeXN2MworCQk7OworCWhwMzAwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwMzAwYnNkKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWJzZAorCQk7OworCWhwMzAwaHB1eCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCW9zPS1ocHV4CisJCTs7CisJaHAzazlbMC05XVswLTldIHwgaHA5WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHA5azJbMC05XVswLTldIHwgaHA5azMxWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWhwCisJCTs7CisJaHA5azNbMi05XVswLTldKQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJOzsKKwlocDlrNlswLTldWzAtOV0gfCBocDZbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrN1swLTc5XVswLTldIHwgaHA3WzAtNzldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs3OFswLTldIHwgaHA3OFswLTldKQorCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFs2N10xIHwgaHA4WzY3XTEgfCBocDlrODBbMjRdIHwgaHA4MFsyNF0gfCBocDlrOFs3OF05IHwgaHA4Wzc4XTkgfCBocDlrODkzIHwgaHA4OTMpCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMTM2NzldIHwgaHA4WzAtOV1bMTM2NzldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJOzsKKwlocDlrOFswLTldWzAtOV0gfCBocDhbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocHBhLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwlocHBhb3NmKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LW9zZgorCQk7OworCWhwcHJvKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKKwkJb3M9LXByb2VsZgorCQk7OworCWkzNzAtaWJtKiB8IGlibSopCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJOzsKKyMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPworCWkqODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaSo4NnY0KikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2NAorCQk7OworCWkqODZ2KQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3YKKwkJOzsKKwlpKjg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWkzODZtYWNoKQorCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAorCQlvcz0tbWFjaAorCQk7OworCWkzODYtdnN0YSB8IHZzdGEpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS12c3RhCisJCTs7CisJaXJpcyB8IGlyaXM0ZCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNnaQorCQljYXNlICRvcyBpbgorCQkgICAgLWlyaXgqKQorCQkJOzsKKwkJICAgICopCisJCQlvcz0taXJpeDQKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwlpc2k2OCB8IGlzaSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWlzaQorCQlvcz0tc3lzdgorCQk7OworCW02OGtub21tdSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJbTY4a25vbW11LSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKyAgICAgICAgbWljcm9ibGF6ZSkKKwkJYmFzaWNfbWFjaGluZT1taWNyb2JsYXplLXhpbGlueAorCQk7OworCW1pbmd3MzIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCW1pbmd3MzJjZSkKKwkJYmFzaWNfbWFjaGluZT1hcm0tdW5rbm93bgorCQlvcz0tbWluZ3czMmNlCisJCTs7CisJbWluaWZyYW1lKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1jb252ZXJnZW50CisJCTs7CisJKm1pbnQgfCAtbWludFswLTldKiB8ICpNaU5UIHwgKk1pTlRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworCW1pcHMzKi0qKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYAorCQk7OworCW1pcHMzKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9taXBzMy9taXBzNjQvJ2AtdW5rbm93bgorCQk7OworCW1vbml0b3IpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwltb3JwaG9zKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQlvcz0tbW9ycGhvcworCQk7OworCW1zZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LW1zZG9zCisJCTs7CisJbXMxLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbXMxLS9tdC0vJ2AKKwkJOzsKKwltdnMpCisJCWJhc2ljX21hY2hpbmU9aTM3MC1pYm0KKwkJb3M9LW12cworCQk7OworCW5jcjMwMDApCisJCWJhc2ljX21hY2hpbmU9aTQ4Ni1uY3IKKwkJb3M9LXN5c3Y0CisJCTs7CisJbmV0YnNkMzg2KQorCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgorCQlvcz0tbmV0YnNkCisJCTs7CisJbmV0d2luZGVyKQorCQliYXNpY19tYWNoaW5lPWFybXY0bC1yZWJlbAorCQlvcz0tbGludXgKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5lY3Y3MCkKKwkJYmFzaWNfbWFjaGluZT12NzAtbmVjCisJCW9zPS1zeXN2CisJCTs7CisJbmV4dCB8IG0qLW5leHQgKQorCQliYXNpY19tYWNoaW5lPW02OGstbmV4dAorCQljYXNlICRvcyBpbgorCQkgICAgLW5leHRzdGVwKiApCisJCQk7OworCQkgICAgLW5zMiopCisJCSAgICAgIG9zPS1uZXh0c3RlcDIKKwkJCTs7CisJCSAgICAqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAzCisJCQk7OworCQllc2FjCisJCTs7CisJbmgzMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmhbNDVdMDAwKQorCQliYXNpY19tYWNoaW5lPW04OGstaGFycmlzCisJCW9zPS1jeHV4CisJCTs7CisJbmluZHk5NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbmluZHkKKwkJOzsKKwltb245NjApCisJCWJhc2ljX21hY2hpbmU9aTk2MC1pbnRlbAorCQlvcz0tbW9uOTYwCisJCTs7CisJbm9uc3RvcHV4KQorCQliYXNpY19tYWNoaW5lPW1pcHMtY29tcGFxCisJCW9zPS1ub25zdG9wdXgKKwkJOzsKKwlucDEpCisJCWJhc2ljX21hY2hpbmU9bnAxLWdvdWxkCisJCTs7CisJbnNyLXRhbmRlbSkKKwkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCisJCTs7CisJb3A1MG4tKiB8IG9wNjBjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJb3M9LXByb2VsZgorCQk7OworCW9wZW5yaXNjIHwgb3BlbnJpc2MtKikKKwkJYmFzaWNfbWFjaGluZT1vcjMyLXVua25vd24KKwkJOzsKKwlvczQwMCkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tb3M0MDAKKwkJOzsKKwlPU0U2ODAwMCB8IG9zZTY4MDAwKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1lcmljc3NvbgorCQlvcz0tb3NlCisJCTs7CisJb3M2OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ub25lCisJCW9zPS1vczY4aworCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYXJpc2MpCisJCWJhc2ljX21hY2hpbmU9aHBwYS11bmtub3duCisJCW9zPS1saW51eAorCQk7OworCXBhcmlzYy0qKQorCQliYXNpY19tYWNoaW5lPWhwcGEtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJb3M9LWxpbnV4CisJCTs7CisJcGJkKQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQorCQk7OworCXBiYikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQorCQk7OworCXBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBjOTgpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQk7OworCXBjOTgtKikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bSB8IHA1IHwgazUgfCBrNiB8IG5leGdlbiB8IHZpYWMzKQorCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKKwkJOzsKKwlwZW50aXVtcHJvIHwgcDYgfCA2eDg2IHwgYXRobG9uIHwgYXRobG9uXyopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW1paSB8IHBlbnRpdW0yIHwgcGVudGl1bWlpaSB8IHBlbnRpdW0zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJOzsKKwlwZW50aXVtNCkKKwkJYmFzaWNfbWFjaGluZT1pNzg2LXBjCisJCTs7CisJcGVudGl1bS0qIHwgcDUtKiB8IGs1LSogfCBrNi0qIHwgbmV4Z2VuLSogfCB2aWFjMy0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qIHwgYXRobG9uLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1paS0qIHwgcGVudGl1bTItKiB8IHBlbnRpdW1paWktKiB8IHBlbnRpdW0zLSopCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW00LSopCisJCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBuKQorCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCisJCTs7CisJcG93ZXIpCWJhc2ljX21hY2hpbmU9cG93ZXItaWJtCisJCTs7CisJcHBjKQliYXNpY19tYWNoaW5lPXBvd2VycGMtdW5rbm93bgorCQk7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCQk7OworCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjQpCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LXVua25vd24KKwkJOzsKKwlwcGM2NC0qKSBiYXNpY19tYWNoaW5lPXBvd2VycGM2NC1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwYzY0bGUgfCBwb3dlcnBjNjRsaXR0bGUgfCBwcGM2NC1sZSB8IHBvd2VycGM2NC1saXR0bGUpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtdW5rbm93bgorCQk7OworCXBwYzY0bGUtKiB8IHBvd2VycGM2NGxpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCisJCTs7CisJcHczMikKKwkJYmFzaWNfbWFjaGluZT1pNTg2LXVua25vd24KKwkJb3M9LXB3MzIKKwkJOzsKKwlyZG9zKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LXJkb3MKKwkJOzsKKwlyb202OGspCisJCWJhc2ljX21hY2hpbmU9bTY4ay1yb202OGsKKwkJb3M9LWNvZmYKKwkJOzsKKwlybVs0Nl0wMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNpZW1lbnMKKwkJOzsKKwlydHBjIHwgcnRwYy0qKQorCQliYXNpY19tYWNoaW5lPXJvbXAtaWJtCisJCTs7CisJczM5MCB8IHMzOTAtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkwLWlibQorCQk7OworCXMzOTB4IHwgczM5MHgtKikKKwkJYmFzaWNfbWFjaGluZT1zMzkweC1pYm0KKwkJOzsKKwlzYTI5MjAwKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwlzYjEpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxLXVua25vd24KKwkJOzsKKwlzYjFlbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjFlbC11bmtub3duCisJCTs7CisJc2RlKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2EzMi1zZGUKKwkJb3M9LWVsZgorCQk7OworCXNlaSkKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQorCQlvcz0tc2VpdXgKKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNoNWVsKQorCQliYXNpY19tYWNoaW5lPXNoNWxlLXVua25vd24KKwkJOzsKKwlzaDY0KQorCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgorCQk7OworCXNwYXJjbGl0ZS13cnMgfCBzaW1zby13cnMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmNsaXRlLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3QyMDAwKQorCQliYXNpY19tYWNoaW5lPW02OGstdGFuZGVtCisJCTs7CisJc3RyYXR1cykKKwkJYmFzaWNfbWFjaGluZT1pODYwLXN0cmF0dXMKKwkJb3M9LXN5c3Y0CisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3YxKQorCQliYXNpY19tYWNoaW5lPXN2MS1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlzeW1tZXRyeSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKKwkJb3M9LWR5bml4CisJCTs7CisJdDNlKQorCQliYXNpY19tYWNoaW5lPWFscGhhZXY1LWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXQ5MCkKKwkJYmFzaWNfbWFjaGluZT10OTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdGljNTR4IHwgYzU0eCopCisJCWJhc2ljX21hY2hpbmU9dGljNTR4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWM1NXggfCBjNTV4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NXgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzZ4IHwgYzZ4KikKKwkJYmFzaWNfbWFjaGluZT10aWM2eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGlsZSopCisJCWJhc2ljX21hY2hpbmU9dGlsZS11bmtub3duCisJCW9zPS1saW51eC1nbnUKKwkJOzsKKwl0eDM5KQorCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KKwkJOzsKKwl0eDM5ZWwpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCisJCTs7CisJdG9hZDEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCisJCW9zPS10b3BzMjAKKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdHBmKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQlvcz0tdHBmCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2ODEwIHwgbmVjdjgxMCkKKwkJYmFzaWNfbWFjaGluZT12ODEwLW5lYworCQlvcz0tbm9uZQorCQk7OworCXZheHYpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tc3lzdgorCQk7OworCXZtcykKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS12bXMKKwkJOzsKKwl2cHAqfHZ4fHZ4LSopCisJCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1CisJCTs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl3NjUqKQorCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKKwkJb3M9LW5vbmUKKwkJOzsKKwl3ODlrLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCW9zPS1wcm9lbGYKKwkJOzsKKwl4Ym94KQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LW1pbmd3MzIKKwkJOzsKKwl4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCXltcCkKKwkJYmFzaWNfbWFjaGluZT15bXAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJejhrLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJejgwLSotY29mZikKKwkJYmFzaWNfbWFjaGluZT16ODAtdW5rbm93bgorCQlvcz0tc2ltCisJCTs7CisJbm9uZSkKKwkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKKwkJb3M9LW5vbmUKKwkJOzsKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgorIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgorCXc4OWspCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCisJCTs7CisJb3A1MG4pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKKwkJOzsKKwlvcDYwYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwltbWl4KQorCQliYXNpY19tYWNoaW5lPW1taXgta251dGgKKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTApCisJCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc2hbMTIzNF0gfCBzaFsyNF1hIHwgc2hbMjRdYWViIHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQorCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KKwkJOzsKKwlzcGFyYyB8IHNwYXJjdjggfCBzcGFyY3Y5IHwgc3BhcmN2OWIgfCBzcGFyY3Y5dikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJOzsKKwljeWRyYSkKKwkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCisJCTs7CisJb3Jpb24pCisJCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCisJCTs7CisJb3Jpb24xMDUpCisJCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKKwkJOzsKKwltYWMgfCBtcHcgfCBtYWMtbXB3KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJOzsKKwlwbWFjIHwgcG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQorCQk7OworCSotdW5rbm93bikKKwkJIyBNYWtlIHN1cmUgdG8gbWF0Y2ggYW4gYWxyZWFkeS1jYW5vbmljYWxpemVkIG1hY2hpbmUgbmFtZS4KKwkJOzsKKwkqKQorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCisKKyMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotZGlnaXRhbCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAorCQk7OworCSotY29tbW9kb3JlKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKKwkJOzsKKwkqKQorCQk7OworZXNhYworCisjIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KKworaWYgWyB4IiRvcyIgIT0geCIiIF0KK3RoZW4KK2Nhc2UgJG9zIGluCisgICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCisgICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCisJIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCisgICAgICAgIC1hdXJvcmF1eCkKKwkgICAgICAgIG9zPS1hdXJvcmF1eAorCQk7OworCS1zb2xhcmlzMSB8IC1zb2xhcmlzMS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c29sYXJpczF8c3Vub3M0fCdgCisJCTs7CisJLXNvbGFyaXMpCisJCW9zPS1zb2xhcmlzMgorCQk7OworCS1zdnI0KikKKwkJb3M9LXN5c3Y0CisJCTs7CisJLXVuaXh3YXJlKikKKwkJb3M9LXN5c3Y0LjJ1dworCQk7OworCS1nbnUvbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8Z251L2xpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCSMgRmlyc3QgYWNjZXB0IHRoZSBiYXNpYyBzeXN0ZW0gdHlwZXMuCisJIyBUaGUgcG9ydGFibGUgc3lzdGVtcyBjb21lcyBmaXJzdC4KKwkjIEVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gQSAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCSMgLXN5c3YqIGlzIG5vdCBoZXJlIGJlY2F1c2UgaXQgY29tZXMgbGF0ZXIsIGFmdGVyIHN5c3ZyNC4KKwktZ251KiB8IC1ic2QqIHwgLW1hY2gqIHwgLW1pbml4KiB8IC1nZW5peCogfCAtdWx0cml4KiB8IC1pcml4KiBcCisJICAgICAgfCAtKnZtcyogfCAtc2NvKiB8IC1lc2l4KiB8IC1pc2MqIHwgLWFpeCogfCAtY25rKiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAorCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtYXVyb3JhdXgqIHwgLXNvbGFyaXMqIFwKKwkgICAgICB8IC1zeW0qIHwgLWtvcGVuc29sYXJpcyogXAorCSAgICAgIHwgLWFtaWdhb3MqIHwgLWFtaWdhZG9zKiB8IC1tc2RvcyogfCAtbmV3c29zKiB8IC11bmljb3MqIHwgLWFvZiogXAorCSAgICAgIHwgLWFvcyogfCAtYXJvcyogXAorCSAgICAgIHwgLW5pbmR5KiB8IC12eHNpbSogfCAtdnh3b3JrcyogfCAtZWJtb24qIHwgLWhtcyogfCAtbXZzKiBcCisJICAgICAgfCAtY2xpeCogfCAtcmlzY29zKiB8IC11bmlwbHVzKiB8IC1pcmlzKiB8IC1ydHUqIHwgLXhlbml4KiBcCisJICAgICAgfCAtaGl1eCogfCAtMzg2YnNkKiB8IC1rbmV0YnNkKiB8IC1taXJic2QqIHwgLW5ldGJzZCogXAorCSAgICAgIHwgLW9wZW5ic2QqIHwgLXNvbGlkYnNkKiBcCisJICAgICAgfCAtZWtrb2JzZCogfCAta2ZyZWVic2QqIHwgLWZyZWVic2QqIHwgLXJpc2NpeCogfCAtbHlueG9zKiBcCisJICAgICAgfCAtYm9zeCogfCAtbmV4dHN0ZXAqIHwgLWN4dXgqIHwgLWFvdXQqIHwgLWVsZiogfCAtb2FiaSogXAorCSAgICAgIHwgLXB0eCogfCAtY29mZiogfCAtZWNvZmYqIHwgLXdpbm50KiB8IC1kb21haW4qIHwgLXZzdGEqIFwKKwkgICAgICB8IC11ZGkqIHwgLWVhYmkqIHwgLWxpdGVzKiB8IC1pZWVlKiB8IC1nbzMyKiB8IC1hdXgqIFwKKwkgICAgICB8IC1jaG9ydXNvcyogfCAtY2hvcnVzcmRiKiB8IC1jZWdjYyogXAorCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKKwkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLWxpbnV4LW5ld2xpYiogfCAtbGludXgtdWNsaWJjKiBcCisJICAgICAgfCAtdXhwdiogfCAtYmVvcyogfCAtbXBlaXgqIHwgLXVkayogXAorCSAgICAgIHwgLWludGVyaXgqIHwgLXV3aW4qIHwgLW1rcyogfCAtcmhhcHNvZHkqIHwgLWRhcndpbiogfCAtb3BlbmVkKiBcCisJICAgICAgfCAtb3BlbnN0ZXAqIHwgLW9za2l0KiB8IC1jb25peCogfCAtcHczMiogfCAtbm9uc3RvcHV4KiBcCisJICAgICAgfCAtc3Rvcm0tY2hhb3MqIHwgLXRvcHMxMCogfCAtdGVuZXgqIHwgLXRvcHMyMCogfCAtaXRzKiBcCisJICAgICAgfCAtb3MyKiB8IC12b3MqIHwgLXBhbG1vcyogfCAtdWNsaW51eCogfCAtbnVjbGV1cyogXAorCSAgICAgIHwgLW1vcnBob3MqIHwgLXN1cGVydXgqIHwgLXJ0bWsqIHwgLXJ0bWstbm92YSogfCAtd2luZGlzcyogXAorCSAgICAgIHwgLXBvd2VybWF4KiB8IC1kbml4KiB8IC1ueDYgfCAtbng3IHwgLXNlaSogfCAtZHJhZ29uZmx5KiBcCisJICAgICAgfCAtc2t5b3MqIHwgLWhhaWt1KiB8IC1yZG9zKiB8IC10b3BwZXJzKiB8IC1kcm9wcyogfCAtZXMqKQorCSMgUmVtZW1iZXIsIGVhY2ggYWx0ZXJuYXRpdmUgTVVTVCBFTkQgSU4gKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkJOzsKKwktcW54KikKKwkJY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCQkgICAgeDg2LSogfCBpKjg2LSopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1udG8kb3MKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwktbnRvLXFueCopCisJCTs7CisJLW50byopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xudG98bnRvLXFueHwnYAorCQk7OworCS1zaW0gfCAtZXMxODAwKiB8IC1obXMqIHwgLXhyYXkgfCAtb3M2OGsqIHwgLW5vbmUqIHwgLXY4OHIqIFwKKwkgICAgICB8IC13aW5kb3dzKiB8IC1vc3ggfCAtYWJ1ZyB8IC1uZXR3YXJlKiB8IC1vczkqIHwgLWJlb3MqIHwgLWhhaWt1KiBcCisJICAgICAgfCAtbWFjb3MqIHwgLW1wdyogfCAtbWFnaWMqIHwgLW1taXh3YXJlKiB8IC1tb245NjAqIHwgLWxuZXdzKikKKwkJOzsKKwktbWFjKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAorCQk7OworCS1saW51eC1kaWV0bGliYykKKwkJb3M9LWxpbnV4LWRpZXRsaWJjCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3BlbmVkKikKKwkJb3M9LW9wZW5lZGl0aW9uCisJCTs7CisgICAgICAgIC1vczQwMCopCisJCW9zPS1vczQwMAorCQk7OworCS13aW5jZSopCisJCW9zPS13aW5jZQorCQk7OworCS1vc2Zyb3NlKikKKwkJb3M9LW9zZnJvc2UKKwkJOzsKKwktb3NmKikKKwkJb3M9LW9zZgorCQk7OworCS11dGVrKikKKwkJb3M9LWJzZAorCQk7OworCS1keW5peCopCisJCW9zPS1ic2QKKwkJOzsKKwktYWNpcyopCisJCW9zPS1hb3MKKwkJOzsKKwktYXRoZW9zKikKKwkJb3M9LWF0aGVvcworCQk7OworCS1zeWxsYWJsZSopCisJCW9zPS1zeWxsYWJsZQorCQk7OworCS0zODZic2QpCisJCW9zPS1ic2QKKwkJOzsKKwktY3RpeCogfCAtdXRzKikKKwkJb3M9LXN5c3YKKwkJOzsKKwktbm92YSopCisJCW9zPS1ydG1rLW5vdmEKKwkJOzsKKwktbnMyICkKKwkJb3M9LW5leHRzdGVwMgorCQk7OworCS1uc2sqKQorCQlvcz0tbnNrCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKyAgICAgICAgLXRwZiopCisJCW9zPS10cGYKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwktb3NlKikKKwkJb3M9LW9zZQorCQk7OworCS1lczE4MDAqKQorCQlvcz0tb3NlCisJCTs7CisJLXhlbml4KQorCQlvcz0teGVuaXgKKwkJOzsKKwktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQlvcz0tbWludAorCQk7OworCS1hcm9zKikKKwkJb3M9LWFyb3MKKwkJOzsKKwkta2FvcyopCisJCW9zPS1rYW9zCisJCTs7CisJLXp2bW9lKQorCQlvcz0tenZtb2UKKwkJOzsKKwktZGljb3MqKQorCQlvcz0tZGljb3MKKwkJOzsKKwktbm9uZSkKKwkJOzsKKwkqKQorCQkjIEdldCByaWQgb2YgdGhlIGAtJyBhdCB0aGUgYmVnaW5uaW5nIG9mICRvcy4KKwkJb3M9YGVjaG8gJG9zIHwgc2VkICdzL1teLV0qLS8vJ2AKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBzeXN0ZW0gXGAkb3NcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworZXNhYworZWxzZQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgbWFjaGluZXMuCisjIFRoZSB2YWx1ZSBzaG91bGQgYmUgd2hhdCB0aGUgdmVuZG9yIGN1cnJlbnRseSBzaGlwcyBvdXQgdGhlIGRvb3Igd2l0aCB0aGVpcgorIyBtYWNoaW5lIG9yIHB1dCBhbm90aGVyIHdheSwgdGhlIG1vc3QgcG9wdWxhciBvcyBwcm92aWRlZCB3aXRoIHRoZSBtYWNoaW5lLgorCisjIE5vdGUgdGhhdCBpZiB5b3UncmUgZ29pbmcgdG8gdHJ5IHRvIG1hdGNoICItTUFOVUZBQ1RVUkVSIiBoZXJlIChzYXksCisjICItc3VuIiksIHRoZW4geW91IGhhdmUgdG8gdGVsbCB0aGUgY2FzZSBzdGF0ZW1lbnQgdXAgdG93YXJkcyB0aGUgdG9wCisjIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBPdGhlcndpc2UsIGNvZGUgYWJvdmUKKyMgd2lsbCBzaWduYWwgYW4gZXJyb3Igc2F5aW5nIHRoYXQgTUFOVUZBQ1RVUkVSIGlzbid0IGFuIG9wZXJhdGluZworIyBzeXN0ZW0sIGFuZCB3ZSdsbCBuZXZlciBnZXQgdG8gdGhpcyBwb2ludC4KKworY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorICAgICAgICBzY29yZS0qKQorCQlvcz0tZWxmCisJCTs7CisgICAgICAgIHNwdS0qKQorCQlvcz0tZWxmCisJCTs7CisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotcmViZWwpCisJCW9zPS1saW51eAorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgYzR4LSogfCB0aWM0eC0qKQorICAgICAgICAJb3M9LWNvZmYKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGJlZm9yZSB0aGUgKi1kZWMgZW50cnkuCisJcGRwMTAtKikKKwkJb3M9LXRvcHMyMAorCQk7OworCXBkcDExLSopCisJCW9zPS1ub25lCisJCTs7CisJKi1kZWMgfCB2YXgtKikKKwkJb3M9LXVsdHJpeDQuMgorCQk7OworCW02OCotYXBvbGxvKQorCQlvcz0tZG9tYWluCisJCTs7CisJaTM4Ni1zdW4pCisJCW9zPS1zdW5vczQuMC4yCisJCTs7CisJbTY4MDAwLXN1bikKKwkJb3M9LXN1bm9zMworCQkjIFRoaXMgYWxzbyBleGlzdHMgaW4gdGhlIGNvbmZpZ3VyZSBwcm9ncmFtLCBidXQgd2FzIG5vdCB0aGUKKwkJIyBkZWZhdWx0LgorCQkjIG9zPS1zdW5vczQKKwkJOzsKKwltNjgqLWNpc2NvKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBtZXAtKikKKwkJb3M9LWVsZgorCQk7OworCW1pcHMqLWNpc2NvKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotKikKKwkJb3M9LWVsZgorCQk7OworCW9yMzItKikKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLXR0aSkJIyBtdXN0IGJlIGJlZm9yZSBzcGFyYyBlbnRyeSBvciB3ZSBnZXQgdGhlIHdyb25nIG9zLgorCQlvcz0tc3lzdjMKKwkJOzsKKwlzcGFyYy0qIHwgKi1zdW4pCisJCW9zPS1zdW5vczQuMS4xCisJCTs7CisJKi1iZSkKKwkJb3M9LWJlb3MKKwkJOzsKKwkqLWhhaWt1KQorCQlvcz0taGFpa3UKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworICAgIAkqLWtudXRoKQorCQlvcz0tbW1peHdhcmUKKwkJOzsKKwkqLXdlYykKKwkJb3M9LXByb2VsZgorCQk7OworCSotd2luYm9uZCkKKwkJb3M9LXByb2VsZgorCQk7OworCSotb2tpKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1ocCkKKwkJb3M9LWhwdXgKKwkJOzsKKwkqLWhpdGFjaGkpCisJCW9zPS1oaXV4CisJCTs7CisJaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQorCQlvcz0tc3lzdgorCQk7OworCSotY2JtKQorCQlvcz0tYW1pZ2FvcworCQk7OworCSotZGcpCisJCW9zPS1kZ3V4CisJCTs7CisJKi1kb2xwaGluKQorCQlvcz0tc3lzdjMKKwkJOzsKKwltNjhrLWNjdXIpCisJCW9zPS1ydHUKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJb3M9LWx1bmEKKwkJOzsKKwkqLW5leHQgKQorCQlvcz0tbmV4dHN0ZXAKKwkJOzsKKwkqLXNlcXVlbnQpCisJCW9zPS1wdHgKKwkJOzsKKwkqLWNyZHMpCisJCW9zPS11bm9zCisJCTs7CisJKi1ucykKKwkJb3M9LWdlbml4CisJCTs7CisJaTM3MC0qKQorCQlvcz0tbXZzCisJCTs7CisJKi1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJKi1nb3VsZCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisJKi1zZ2kpCisJCW9zPS1pcml4CisJCTs7CisJKi1zaWVtZW5zKQorCQlvcz0tc3lzdjQKKwkJOzsKKwkqLW1hc3Njb21wKQorCQlvcz0tcnR1CisJCTs7CisJZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQorCQlvcz0tdXhwdgorCQk7OworCSotcm9tNjhrKQorCQlvcz0tY29mZgorCQk7OworCSotKmJ1ZykKKwkJb3M9LWNvZmYKKwkJOzsKKwkqLWFwcGxlKQorCQlvcz0tbWFjb3MKKwkJOzsKKwkqLWF0YXJpKikKKwkJb3M9LW1pbnQKKwkJOzsKKwkqKQorCQlvcz0tbm9uZQorCQk7OworZXNhYworZmkKKworIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKKyMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCit2ZW5kb3I9dW5rbm93bgorY2FzZSAkYmFzaWNfbWFjaGluZSBpbgorCSotdW5rbm93bikKKwkJY2FzZSAkb3MgaW4KKwkJCS1yaXNjaXgqKQorCQkJCXZlbmRvcj1hY29ybgorCQkJCTs7CisJCQktc3Vub3MqKQorCQkJCXZlbmRvcj1zdW4KKwkJCQk7OworCQkJLWNuayp8LWFpeCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktYmVvcyopCisJCQkJdmVuZG9yPWJlCisJCQkJOzsKKwkJCS1ocHV4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLW1wZWl4KikKKwkJCQl2ZW5kb3I9aHAKKwkJCQk7OworCQkJLWhpdXgqKQorCQkJCXZlbmRvcj1oaXRhY2hpCisJCQkJOzsKKwkJCS11bm9zKikKKwkJCQl2ZW5kb3I9Y3JkcworCQkJCTs7CisJCQktZGd1eCopCisJCQkJdmVuZG9yPWRnCisJCQkJOzsKKwkJCS1sdW5hKikKKwkJCQl2ZW5kb3I9b21yb24KKwkJCQk7OworCQkJLWdlbml4KikKKwkJCQl2ZW5kb3I9bnMKKwkJCQk7OworCQkJLW12cyogfCAtb3BlbmVkKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1vczQwMCopCisJCQkJdmVuZG9yPWlibQorCQkJCTs7CisJCQktcHR4KikKKwkJCQl2ZW5kb3I9c2VxdWVudAorCQkJCTs7CisJCQktdHBmKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQkJLWhtcyopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLW1wdyogfCAtbWFjb3MqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQorCQkJCXZlbmRvcj1hdGFyaQorCQkJCTs7CisJCQktdm9zKikKKwkJCQl2ZW5kb3I9c3RyYXR1cworCQkJCTs7CisJCWVzYWMKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKKwkJOzsKK2VzYWMKKworZWNobyAkYmFzaWNfbWFjaGluZSRvcworZXhpdAorCisjIExvY2FsIHZhcmlhYmxlczoKKyMgZXZhbDogKGFkZC1ob29rICd3cml0ZS1maWxlLWhvb2tzICd0aW1lLXN0YW1wKQorIyB0aW1lLXN0YW1wLXN0YXJ0OiAidGltZXN0YW1wPSciCisjIHRpbWUtc3RhbXAtZm9ybWF0OiAiJTp5LSUwMm0tJTAyZCIKKyMgdGltZS1zdGFtcC1lbmQ6ICInIgorIyBFbmQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvY29uZmlndXJlIGIvbmZzLXV0aWxzLTEuMi4yL2NvbmZpZ3VyZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDgwYmUzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2NvbmZpZ3VyZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvY29uZmlndXJlLmFjIGIvbmZzLXV0aWxzLTEuMi4yL2NvbmZpZ3VyZS5hYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzUyMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDQ0MSBAQAorZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCitkbmwKK0FDX0lOSVQoW2xpbnV4IG5mcy11dGlsc10sWzEuMi4yXSxbbGludXgtbmZzQHZnZXIua2VybmVsLm9yZ10sW25mcy11dGlsc10pCitBQ19DQU5PTklDQUxfQlVJTEQoW10pCitBQ19DQU5PTklDQUxfSE9TVChbXSkKK0FDX0NPTkZJR19NQUNST19ESVIoYWNsb2NhbCkKK0FNX0lOSVRfQVVUT01BS0UKK0FDX1BSRVJFUSgyLjU5KQorQUNfUFJFRklYX0RFRkFVTFQoL3VzcikKK0FNX01BSU5UQUlORVJfTU9ERQorCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sICogRGVmaW5lIHRoZSBzZXQgb2YgYXBwbGljYWJsZSBvcHRpb25zCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQUNfQVJHX1dJVEgocmVsZWFzZSwKKwlbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1yZWxlYXNlPVhYWF0sIFtzZXQgcmVsZWFzZSB0byBYWFggWzFdXSldLAorCVJFTEVBU0U9JHdpdGh2YWwsCisJUkVMRUFTRT0xKQorCUFDX1NVQlNUKFJFTEVBU0UpCitBQ19BUkdfV0lUSChzdGF0ZWRpciwKKwlbICAtLXdpdGgtc3RhdGVkaXI9L2ZvbyAgICB1c2Ugc3RhdGUgZGlyIC9mb28gWy92YXIvbGliL25mc11dLAorCXN0YXRlZGlyPSR3aXRodmFsLAorCXN0YXRlZGlyPS92YXIvbGliL25mcykKKwlBQ19TVUJTVChzdGF0ZWRpcikKK0FDX0FSR19XSVRIKHN0YXRkdXNlciwKKwlbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1zdGF0ZHVzZXI9cnBjdXNlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdGQgdG8gcnVuIHVuZGVyIEA8OkBycGN1c2VyIG9yIG5vYm9keUA6PkBdCisJKV0sCisJc3RhdGR1c2VyPSR3aXRodmFsLAorCWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisJCWlmIGdyZXAgLXMgJ15ycGN1c2VyOicgL2V0Yy9wYXNzd2QgPiAvZGV2L251bGw7IHRoZW4KKwkJCXN0YXRkdXNlcj1ycGN1c2VyCisJCWVsc2UKKwkJCXN0YXRkdXNlcj1ub2JvZHkKKwkJZmkKKwllbHNlCisJCXN0YXRkdXNlcj1ub2JvZHkKKwlmaSkKKwlBQ19TVUJTVChzdGF0ZHVzZXIpCitBQ19BUkdfV0lUSChzdGFydC1zdGF0ZCwKKwlbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1zdGFydC1zdGF0ZD1zY3JpcHRuYW1lXSwKKwkJCVtXaGVuIGFuIG5mcyBmaWxlc3lzdGVtcyBpcyBtb3VudGVkIHdpdGggbG9ja2luZywgcnVuIHRoaXMgc2NyaXB0XQorCSldLAorCXN0YXJ0c3RhdGQ9JHdpdGh2YWwsCisJc3RhcnRzdGF0ZD0vdXNyL3NiaW4vc3RhcnQtc3RhdGQKKwkpCisJQUNfU1VCU1Qoc3RhcnRzdGF0ZCkKKwlBQ19ERUZJTkVfVU5RVU9URUQoU1RBUlRfU1RBVEQsICIkc3RhcnRzdGF0ZCIsIFtEZWZpbmUgdGhpcyB0byBhIHNjcmlwdCB3aGljaCBjYW4gc3RhcnQgc3RhdGQgb24gbW91bnRdKQorQUNfQVJHX0VOQUJMRShuZnN2MywKKwlbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5mc3YzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGUgc3VwcG9ydCBmb3IgTkZTdjMgQDw6QGRlZmF1bHQ9eWVzQDo+QF0pXSwKKwllbmFibGVfbmZzdjM9JGVuYWJsZXZhbCwKKwllbmFibGVfbmZzdjM9eWVzKQorCWlmIHRlc3QgIiRlbmFibGVfbmZzdjMiID0geWVzOyB0aGVuCisJCUFDX0RFRklORShORlMzX1NVUFBPUlRFRCwgMSwgW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IE5GU3YzIHN1cHBvcnQgY29tcGlsZWQgaW5dKQorCWVsc2UKKwkJZW5hYmxlX25mc3YzPQorCWZpCisJQUNfU1VCU1QoZW5hYmxlX25mc3YzKQorQUNfQVJHX0VOQUJMRShuZnN2NCwKKwlbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW5mc3Y0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGUgc3VwcG9ydCBmb3IgTkZTdjQgQDw6QGRlZmF1bHQ9eWVzQDo+QF0pXSwKKwllbmFibGVfbmZzdjQ9JGVuYWJsZXZhbCwKKwllbmFibGVfbmZzdjQ9eWVzKQorCWlmIHRlc3QgIiRlbmFibGVfbmZzdjQiID0geWVzOyB0aGVuCisJCUFDX0RFRklORShORlM0X1NVUFBPUlRFRCwgMSwgW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IE5GU3Y0IHN1cHBvcnQgY29tcGlsZWQgaW5dKQorCQlJRE1BUEQ9aWRtYXBkCisJZWxzZQorCQllbmFibGVfbmZzdjQ9CisJCUlETUFQRD0KKwlmaQorCUFDX1NVQlNUKElETUFQRCkKKwlBQ19TVUJTVChlbmFibGVfbmZzdjQpCisJQU1fQ09ORElUSU9OQUwoQ09ORklHX05GU1Y0LCBbdGVzdCAiJGVuYWJsZV9uZnN2NCIgPSAieWVzIl0pCisKK0FDX0FSR19FTkFCTEUobmZzdjQxLAorCVtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbmZzdjQxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGUgc3VwcG9ydCBmb3IgTkZTdjQxIEA8OkBkZWZhdWx0PW5vQDo+QF0pXSwKKwllbmFibGVfbmZzdjQxPSRlbmFibGV2YWwsCisJZW5hYmxlX25mc3Y0MT1ubykKKwlpZiB0ZXN0ICIkZW5hYmxlX25mc3Y0MSIgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKE5GUzQxX1NVUFBPUlRFRCwgMSwgW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IE5GU3Y0MSBzdXBwb3J0IGNvbXBpbGVkIGluXSkKKwllbHNlCisJCWVuYWJsZV9uZnN2ND0KKwlmaQorCUFDX1NVQlNUKGVuYWJsZV9uZnN2NDEpCisJQU1fQ09ORElUSU9OQUwoQ09ORklHX05GU1Y0MSwgW3Rlc3QgIiRlbmFibGVfbmZzdjQxIiA9ICJ5ZXMiXSkKKworQUNfQVJHX0VOQUJMRShnc3MsCisJW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1nc3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZSBzdXBwb3J0IGZvciBycGNzZWNfZ3NzIEA8OkBkZWZhdWx0PXllc0A6PkBdKV0sCisJZW5hYmxlX2dzcz0kZW5hYmxldmFsLAorCWVuYWJsZV9nc3M9eWVzKQorCWlmIHRlc3QgIiRlbmFibGVfZ3NzIiA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoR1NTX1NVUFBPUlRFRCwgMSwgW0RlZmluZSB0aGlzIGlmIHlvdSB3YW50IHJwY3NlY19nc3Mgc3VwcG9ydCBjb21waWxlZCBpbl0pCisJCUdTU0Q9Z3NzZAorCQlTVkNHU1NEPXN2Y2dzc2QKKwllbHNlCisJCWVuYWJsZV9nc3M9CisJCUdTU0Q9CisJCVNWQ0dTU0Q9CisJZmkKKwlBQ19TVUJTVChHU1NEKQorCUFDX1NVQlNUKFNWQ0dTU0QpCisJQUNfU1VCU1QoZW5hYmxlX2dzcykKKwlBTV9DT05ESVRJT05BTChDT05GSUdfR1NTLCBbdGVzdCAiJGVuYWJsZV9nc3MiID0gInllcyJdKQorQUNfQVJHX0VOQUJMRShrcHJlZml4LAorCVtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUta3ByZWZpeF0sIFtpbnN0YWxsIHByb2dzIGFzIHJwYy5rbmZzZCBldGNdKV0sCisJdGVzdCAiJGVuYWJsZXZhbCIgPSAieWVzIiAmJiBrcHJlZml4PWssCisJa3ByZWZpeD0pCisJQUNfU1VCU1Qoa3ByZWZpeCkKK0FDX0FSR19XSVRIKHJwY2dlbiwKKwlbQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1ycGNnZW49aW50ZXJuYWxdLCBbdXNlIGludGVybmFsIHJwY2dlbiBpbnN0ZWFkIG9mIHN5c3RlbSBvbmVdKV0sCisJcnBjZ2VuX3BhdGg9JHdpdGh2YWwsCisJcnBjZ2VuX3BhdGg9eWVzICkKKwlSUENHRU5fUEFUSD0KKwlpZiB0ZXN0ICIkcnBjZ2VuX3BhdGgiID09ICJ5ZXMiOyB0aGVuCisJICAgIGZvciBwIGluIC91c3IvbG9jYWwvYmluL3JwY2dlbiAvdXNyL2Jpbi9ycGNnZW4gL2Jpbi9ycGNnZW4KKwkgICAgZG8gaWYgdGVzdCAtZiAkcCA7IHRoZW4gUlBDR0VOX1BBVEg9JHAgOyBicmVhazsgZmkgOyBkb25lCisJZWxpZiB0ZXN0ICIkcnBjZ2VuX3BhdGgiICE9ICJpbnRlcm5hbCI7IHRoZW4KKwkgICAgUlBDR0VOX1BBVEg9JHJwY2dlbl9wYXRoCisJZmkKKwlBQ19TVUJTVChSUENHRU5fUEFUSCkKKwlBTV9DT05ESVRJT05BTChDT05GSUdfUlBDR0VOLCBbdGVzdCAiJFJQQ0dFTl9QQVRIIiA9PSAiIl0pCitBQ19BUkdfRU5BQkxFKHV1aWQsCisJW0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtdXVpZF0sIFtFeGNsdWRlIHV1aWQgc3VwcG9ydCB0byBhdm9pZCBidWdneSBsaWJibGtpZF0pXSwKKwlpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJ5ZXMiIDsgdGhlbiBjaG9vc2VfYmxraWQ9eWVzOyBlbHNlIGNob29zZV9ibGtpZD1ubzsgZmksCisJY2hvb3NlX2Jsa2lkPWRlZmF1bHQpCitBQ19BUkdfRU5BQkxFKG1vdW50LAorCVtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtbW91bnRdLAorCQkJW0NyZWF0ZSBtb3VudC5uZnMgYW5kIGRvbid0IHVzZSB0aGUgdXRpbC1saW51eCBtb3VudCg4KSBmdW5jdGlvbmFsaXR5LiBAPDpAZGVmYXVsdD15ZXNAOj5AXSldLAorCWVuYWJsZV9tb3VudD0kZW5hYmxldmFsLAorCWVuYWJsZV9tb3VudD15ZXMpCisJQU1fQ09ORElUSU9OQUwoQ09ORklHX01PVU5ULCBbdGVzdCAiJGVuYWJsZV9tb3VudCIgPSAieWVzIl0pCitBQ19BUkdfRU5BQkxFKHRpcnBjLAorCVtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtdGlycGNdLAorCQkJW2VuYWJsZSB1c2Ugb2YgVEktUlBDIEA8OkBkZWZhdWx0PXllc0A6PkBdKV0sCisJZW5hYmxlX3RpcnBjPSRlbmFibGV2YWwsCisJZW5hYmxlX3RpcnBjPSd5ZXMnKQorQUNfQVJHX0VOQUJMRShpcHY2LAorCVtBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtaXB2Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlIHN1cHBvcnQgZm9yIElQdjYgQDw6QGRlZmF1bHQ9bm9AOj5AXSldLAorCWVuYWJsZV9pcHY2PSRlbmFibGV2YWwsCisJZW5hYmxlX2lwdjY9bm8pCisJaWYgdGVzdCAiJGVuYWJsZV9pcHY2IiA9IHllczsgdGhlbgorCQlBQ19ERUZJTkUoSVBWNl9TVVBQT1JURUQsIDEsIFtEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBJUHY2IHN1cHBvcnQgY29tcGlsZWQgaW5dKQorCWVsc2UKKwkJZW5hYmxlX2lwdjY9CisJZmkKKwlBQ19TVUJTVChlbmFibGVfaXB2NikKKwlBTV9DT05ESVRJT05BTChDT05GSUdfSVBWNiwgW3Rlc3QgIiRlbmFibGVfaXB2NiIgPSAieWVzIl0pCisKK2lmIHRlc3QgIiRlbmFibGVfbW91bnQiID0geWVzOyB0aGVuCisJQUNfQVJHX0VOQUJMRShtb3VudGNvbmZpZywKKwlbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW1vdW50Y29uZmlnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtlbmFibGUgbW91bnQgdG8gdXNlIGEgY29uZmlndXJhdGlvbiBmaWxlXSldLAorCW1vdW50Y29uZmlnPSRlbmFibGV2YWwsCisJbW91bnRjb25maWc9bm8pCisJaWYgdGVzdCAiJGVuYWJsZV9tb3VudGNvbmZpZyIgPSB5ZXM7IHRoZW4KKwkJQUNfREVGSU5FKE1PVU5UX0NPTkZJRywgMSwgCisJCQlbRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgbW91bnQgdG8gcmVhZCBhIGNvbmZpZ3VyYXRpb24gZmlsZV0pCisJCUFDX0FSR19XSVRIKG1vdW50ZmlsZSwKKwkJCVtBQ19IRUxQX1NUUklORyhbLS13aXRoLW1vdW50ZmlsZT1maWxlbmFtZV0sCisJCQlbVXNpbmcgZmlsZW5hbWUgYXMgdGhlIE5GUyBtb3VudCBvcHRpb25zIGZpbGUgWy9ldGMvbmZzbW91bnRzLmNvbmZdXQorCQkJKV0sCisJCW1vdW50ZmlsZT0kd2l0aHZhbCwKKwkJbW91bnRmaWxlPS9ldGMvbmZzbW91bnQuY29uZikKKwkJQUNfU1VCU1QobW91bnRmaWxlKQorCQlBQ19ERUZJTkVfVU5RVU9URUQoTU9VTlRPUFRTX0NPTkZGSUxFLCAiJG1vdW50ZmlsZSIsIAorCQkJW1RoaXMgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIE5GUyBtb3VudCBjb25maWd1cmF0aW9uIGZpbGVdKQorCWVsc2UKKwkJZW5hYmxlX21vdW50Y29uZmlnPQorCWZpCisJQUNfU1VCU1QoZW5hYmxlX21vdW50Y29uZmlnKQorCUFNX0NPTkRJVElPTkFMKE1PVU5UX0NPTkZJRywgW3Rlc3QgIiRlbmFibGVfbW91bnRjb25maWciID0gInllcyJdKQorZWxzZQorCUFNX0NPTkRJVElPTkFMKE1PVU5UX0NPTkZJRywgW3Rlc3QgIiRlbmFibGVfbW91bnQiID0gInllcyJdKQorZmkKKworZG5sIENoZWNrIGZvciBUSS1SUEMgbGlicmFyeSBhbmQgaGVhZGVycworQUNfTElCVElSUEMKKworZG5sIENoZWNrIGZvciAtbGNhcAorQUNfTElCQ0FQCisKKyMgQ2hlY2sgd2hldGhlciB1c2VyIHdhbnRzIFRDUCB3cmFwcGVycyBzdXBwb3J0CitBQ19UQ1BfV1JBUFBFUlMKKworIyBBcnJhbmdlIGZvciBsYXJnZS1maWxlIHN1cHBvcnQKK0FDX1NZU19MQVJHRUZJTEUKKworQUNfQ09ORklHX1NSQ0RJUihbc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oLmluXSkKK0FDX0NPTkZJR19IRUFERVJTKFtzdXBwb3J0L2luY2x1ZGUvY29uZmlnLmhdKQorCisjIENoZWNrcyBmb3IgcHJvZ3JhbXMuCitBQ19QUk9HX0NYWAorQUNfUFJPR19DQworQUNfUFJPR19DUFAKK0FDX1BST0dfSU5TVEFMTAorQUNfUFJPR19MTl9TCitBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0xJQlRPT0wKK0FNX1BST0dfQ0NfQ19PCisKK2lmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCisJQ0NfRk9SX0JVSUxEPSR7Q0NfRk9SX0JVSUxELSR7Q0MtZ2NjfX0KK2Vsc2UKKwlDQ19GT1JfQlVJTEQ9JHtDQ19GT1JfQlVJTEQtZ2NjfQorZmkKKworQUNfU1VCU1QoQ0NfRk9SX0JVSUxEKQorCitBQ19DSEVDS19UT09MKEFSLCBhcikKK0FDX0NIRUNLX1RPT0woTEQsIGxkKQorCitBQ19IRUFERVJfU1REQyhbXSkKK0FDX0dOVUxJQkMKK0FDX0JTRF9TSUdOQUxTCisKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgKiBDaGVjayBmb3IgcmVxdWlyZWQgbGlicmFyaWVzCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitBQ19DSEVDS19GVU5DKFtnZXRob3N0YnluYW1lXSwgLAorICAgICAgICAgICAgICBbQUNfQ0hFQ0tfTElCKFtuc2xdLCBbZ2V0aG9zdGJ5bmFtZV0sIFtMSUJOU0w9Ii1sbnNsIl0pXSkKK0FDX1NVQlNUKExJQk5TTCkKKworQUNfQ0hFQ0tfRlVOQyhbY29ubmVjdF0sICwKKyAgICAgICAgICAgICAgW0FDX0NIRUNLX0xJQihbc29ja2V0XSwgW2Nvbm5lY3RdLCBbTElCU09DS0VUPSItbHNvY2tldCJdLAorICAgICAgICAgICAgICAgICAgICBbQUNfTVNHX0VSUk9SKFtGdW5jdGlvbiAnc29ja2V0JyBub3QgZm91bmQuXSldLCBbJExJQk5TTF0pXSkKKworQUNfQ0hFQ0tfRlVOQyhbZ2V0YWRkcmluZm9dLCAsCisgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW0Z1bmN0aW9uICdnZXRhZGRyaW5mbycgbm90IGZvdW5kLl0pXSkKKworQUNfQ0hFQ0tfRlVOQyhbZ2V0cnBjYnludW1iZXJdLCAsCisgICAgICAgICAgICAgIFtBQ19NU0dfRVJST1IoW0Z1bmN0aW9uICdnZXRycGNieW51bWJlcicgbm90IGZvdW5kLl0pXSkKKworQUNfQ0hFQ0tfRlVOQyhbZ2V0c2VydmJ5bmFtZV0sICwKKyAgICAgICAgICAgICAgW0FDX01TR19FUlJPUihbRnVuY3Rpb24gJ2dldHNlcnZieW5hbWUnIG5vdCBmb3VuZC5dKV0pCisKK0FDX0NIRUNLX0xJQihbY3J5cHRdLCBbY3J5cHRdLCBbTElCQ1JZUFQ9Ii1sY3J5cHQiXSkKKworaWYgdGVzdCAiJGVuYWJsZV9uZnN2NCIgPSB5ZXM7IHRoZW4KKyAgZG5sIGNoZWNrIGZvciBsaWJldmVudCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMKKyAgQUNfTElCRVZFTlQKKworICBkbmwgY2hlY2sgZm9yIG5mc2lkbWFwIGxpYnJhcmllcyBhbmQgaGVhZGVycworICBBQ19MSUJORlNJRE1BUAorCisgIGRubCBsaWJycGNzZWNnc3MgYWxyZWFkeSBoYXMgYSBkZXBlbmRlbmN5IG9uIGxpYmdzc2FwaSwKKyAgZG5sIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBnZXQgdGhlIHJpZ2h0IHZlcnNpb24KKyAgaWYgdGVzdCAiJGVuYWJsZV9nc3MiID0geWVzOyB0aGVuCisgICAgQUNfUlBDU0VDX1ZFUlNJT04KKyAgZmkKK2ZpCisKK2lmIHRlc3QgIiRrbmZzZF9jdl9nbGliYzIiID0gbm87IHRoZW4KKyAgICBBQ19DSEVDS19MSUIoYnNkLCBkYWVtb24sIFtMSUJCU0Q9Ii1sYnNkIl0pCitmaQorCitpZiB0ZXN0ICIkY2hvb3NlX2Jsa2lkIiAhPSBubzsgdGhlbiAKKyAgIEFDX0NIRUNLX0xJQihibGtpZCwgYmxraWRfZ2V0X2xpYnJhcnlfdmVyc2lvbiwgW0xJQkJMS0lEPSItbGJsa2lkIl0sIEFDX01TR19FUlJPUihbbGliYmxraWQgbmVlZGVkXSkpCisgICBBQ19DSEVDS19IRUFERVIoYmxraWQvYmxraWQuaCwgLCBBQ19NU0dfRVJST1IoW0Nhbm5vdCBmaW5kIGxpYmJsa2lkIGhlYWRlciBmaWxlIGJsa2lkL2Jsa2lkLmhdKSkKKyAgIEFDX0JMS0lEX1ZFUlMKKyAgIGlmIHRlc3QgJGNob29zZV9ibGtpZCA9IHllczsgdGhlbgorICAgICAgdXNlX2Jsa2lkPTEKKyAgICAgIHRlc3QgJGxpYmJsa2lkX2N2X2lzX3JlY2VudCA9IG5vICYmIEFDX01TR19XQVJOKFtsaWJibGtpZCBpcyBvbGQgYW5kIG1heSBjYXVzZSBtb3VudGQgdG8gbGVhayBtZW1vcnldKQorICAgZWxzZQorICAgICAgaWYgdGVzdCAkbGliYmxraWRfY3ZfaXNfcmVjZW50ID0geWVzCisgICAgICB0aGVuIHVzZV9ibGtpZD0xCisgICAgICBlbHNlIHVzZV9ibGtpZD0wCisJICAgQUNfTVNHX1dBUk4oW3V1aWQgc3VwcG9ydCBkaXNhYmxlZCBhcyBsaWJibGtpZCBpcyB0b28gb2xkXSkKKyAgICAgIGZpCisgICAgZmkKKyAgICBBQ19ERUZJTkVfVU5RVU9URUQoVVNFX0JMS0lELCAkdXNlX2Jsa2lkLCBbRGVmaW5lIGlmIHlvdSB3YW50IHRvIHVzZSBibGtpZCB0byBmaW5kIHV1aWQgb2YgZmlsZXN5c3RlbXNdKQorZmkKK0FDX1NVQlNUKExJQlNPQ0tFVCkKK0FDX1NVQlNUKExJQkNSWVBUKQorQUNfU1VCU1QoTElCQlNEKQorQUNfU1VCU1QoTElCQkxLSUQpCisKK2lmIHRlc3QgIiRlbmFibGVfZ3NzIiA9IHllczsgdGhlbgorICBkbmwgJ2dzcycgcmVxdWlyZXMgZ2V0bmFtZWluZm8gLSBhdCBsZWFzdCBmb3IgZ3NzZF9wcm9jLmMKKyAgQUNfQ0hFQ0tfRlVOQyhbZ2V0bmFtZWluZm9dLCAsIFtBQ19NU0dfRVJST1IoW0dTU0FQSSBzdXBwb3J0IHJlcXVpcmVzICdnZXRuYW1laW5mbycgZnVuY3Rpb25dKV0pCisKKyAgZG5sICdnc3MnIGFsc28gZGVwZW5kcyBvbiBuZnNpZG1hcC5oIC0gYXQgbGVhc3QgZm9yIHN2Y2dzc2RfcHJvYy5jCisgIEFDX0xJQk5GU0lETUFQCisKKyAgQUNfQ0hFQ0tfSEVBREVSUyhbc3BrbTMuaF0sICwKKyAgICAgICAgICAgICAgICAgICBbQUNfTVNHX1dBUk4oW0NvdWxkIG5vdCBsb2NhdGUgU1BLTTMgaGVhZGVyOyB3aWxsIG5vdCBoYXZlIFNQS00zIHN1cHBvcnRdKV0pCisKKyAgZG5sIENoZWNrIGZvciBLZXJiZXJvcyBWNQorICBBQ19LRVJCRVJPU19WNQorCisgIGRubCBJbnZva2VkIGFmdGVyIEFDX0tFUkJFUk9TX1Y1OyBBQ19MSUJSUENTRUNHU1MgbmVlZHMgdG8gaGF2ZSBLUkJMSUJTIHNldAorICBBQ19MSUJSUENTRUNHU1MKKworZmkKKworZG5sIENoZWNrIGZvciBJUHY2IHN1cHBvcnQKK0FDX0lQVjYKKworZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2RubCBDaGVjayBmb3IgaGVhZGVycworZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FDX0NIRUNLX0hFQURFUlMoW2FycGEvaW5ldC5oIGZjbnRsLmggbGliaW50bC5oIGxpbWl0cy5oIFwKKyAgICAgICAgICAgICAgICAgbWFsbG9jLmggbWVtb3J5LmggbmV0ZGIuaCBuZXRpbmV0L2luLmggcGF0aHMuaCBcCisgICAgICAgICAgICAgICAgIHN0ZGxpYi5oIHN0cmluZy5oIHN5cy9maWxlLmggc3lzL2lvY3RsLmggc3lzL21vdW50LmggXAorICAgICAgICAgICAgICAgICBzeXMvcGFyYW0uaCBzeXMvc29ja2V0Lmggc3lzL3RpbWUuaCBzeXMvdmZzLmggXAorICAgICAgICAgICAgICAgICBzeXNsb2cuaCB1bmlzdGQuaCBjb21fZXJyLmggZXQvY29tX2Vyci5oIFwKKyAgICAgICAgICAgICAgICAgaWZhZGRycy5oXSkKKworZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2RubCBDaGVja3MgZm9yIHR5cGVkZWZzLCBzdHJ1Y3R1cmVzLCBhbmQgY29tcGlsZXIgY2hhcmFjdGVyaXN0aWNzCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQUNfQ19DT05TVAorQUNfVFlQRV9VSURfVAorQUNfQ19JTkxJTkUKK0FDX1RZUEVfT0ZGX1QKK0FDX1RZUEVfUElEX1QKK0FDX1RZUEVfU0laRV9UCitBQ19IRUFERVJfVElNRQorQUNfU1RSVUNUX1RNCisKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgQ2hlY2sgZm9yIGZ1bmN0aW9ucworZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FDX0ZVTkNfQUxMT0NBCitBQ19GVU5DX0NMT1NFRElSX1ZPSUQKK0FDX0ZVTkNfRVJST1JfQVRfTElORQorQUNfRlVOQ19GT1JLCitBQ19GVU5DX0dFVEdST1VQUworQUNfRlVOQ19HRVRNTlRFTlQKK0FDX1BST0dfR0NDX1RSQURJVElPTkFMCitBQ19GVU5DX0xTVEFUCitBQ19GVU5DX0xTVEFUX0ZPTExPV1NfU0xBU0hFRF9TWU1MSU5LCitBQ19IRUFERVJfTUFKT1IKKyNBQ19GVU5DX01BTExPQworQUNfRlVOQ19NRU1DTVAKKyNBQ19GVU5DX1JFQUxMT0MKK0FDX0ZVTkNfU0VMRUNUX0FSR1RZUEVTCitBQ19UWVBFX1NJR05BTAorQUNfRlVOQ19TVEFUCitBQ19GVU5DX1ZQUklOVEYKK0FDX0NIRUNLX0ZVTkNTKFthbGFybSBhdGV4aXQgZHVwMiBmZGF0YXN5bmMgZnRydW5jYXRlIGdldGN3ZCBcCisgICAgICAgICAgICAgICBnZXRob3N0YnlhZGRyIGdldGhvc3RieW5hbWUgZ2V0aG9zdG5hbWUgZ2V0bW50ZW50IFwKKyAgICAgICAgICAgICAgIGdldG5hbWVpbmZvIGdldHJwY2J5bmFtZSBnZXRpZmFkZHJzIFwKKyAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSBoYXNtbnRvcHQgaW5ldF9udG9hIGlubmV0Z3IgbWVtc2V0IG1rZGlyIHBhdGhjb25mIFwKKyAgICAgICAgICAgICAgIHJlYWxwYXRoIHJtZGlyIHNlbGVjdCBzb2NrZXQgc3RyY2FzZWNtcCBzdHJjaHIgc3RyZHVwIFwKKyAgICAgICAgICAgICAgIHN0cmVycm9yIHN0cnJjaHIgc3RydG9sIHN0cnRvdWwgc2lncHJvY21hc2tdKQorCisKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgQ2hlY2sgZm9yIGRhdGEgc2l6ZXMKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBQ19DSEVDS19TSVpFT0Yoc2hvcnQpCitBQ19DSEVDS19TSVpFT0YoaW50KQorQUNfQ0hFQ0tfU0laRU9GKGxvbmcpCitBQ19DSEVDS19TSVpFT0Yoc2l6ZV90KQorQUNfQ0hFQ0tfU0laRU9GKHNvY2tsZW5fdCkKKworCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sIEV4cG9ydCBzb21lIHBhdGggbmFtZXMgdG8gY29uZmlnLmgKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitBQ19ERUZJTkVfVU5RVU9URUQoTkZTX1NUQVRFRElSLCAiJHN0YXRlZGlyIiwgW1RoaXMgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIE5GUyBzdGF0ZSBmaWxlcy4gV2FybmluZzogdGhpcyBtdXN0IG1hdGNoIGRlZmluaXRpb25zIGluIGNvbmZpZy5tayFdKQorCitpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgorCUNGTEFHU19GT1JfQlVJTEQ9JHtDRkxBR1NfRk9SX0JVSUxELSIkQ0ZMQUdTIn0KKwlDWFhGTEFHU19GT1JfQlVJTEQ9JHtDWFhGTEFHU19GT1JfQlVJTEQtIiRDWFhGTEFHUyJ9CisJQ1BQRkxBR1NfRk9SX0JVSUxEPSR7Q1BQRkxBR1NfRk9SX0JVSUxELSIkQ1BQRkxBR1MifQorCUxERkxBR1NfRk9SX0JVSUxEPSR7TERGTEFHU19GT1JfQlVJTEQtIiRMREZMQUdTIn0KK2Vsc2UKKwlDRkxBR1NfRk9SX0JVSUxEPSR7Q0ZMQUdTX0ZPUl9CVUlMRC0iIn0KKwlDWFhGTEFHU19GT1JfQlVJTEQ9JHtDWFhGTEFHU19GT1JfQlVJTEQtIiJ9CisJQ1BQRkxBR1NfRk9SX0JVSUxEPSR7Q1BQRkxBR1NfRk9SX0JVSUxELSIifQorCUxERkxBR1NfRk9SX0JVSUxEPSR7TERGTEFHU19GT1JfQlVJTEQtIiJ9CitmaQorCitBQ19TVUJTVChDRkxBR1MpCitBQ19TVUJTVChDWFhGTEFHUykKK0FDX1NVQlNUKENQUEZMQUdTKQorQUNfU1VCU1QoTERGTEFHUykKKworQUNfU1VCU1QoQ0ZMQUdTX0ZPUl9CVUlMRCkKK0FDX1NVQlNUKENYWEZMQUdTX0ZPUl9CVUlMRCkKK0FDX1NVQlNUKENQUEZMQUdTX0ZPUl9CVUlMRCkKK0FDX1NVQlNUKExERkxBR1NfRk9SX0JVSUxEKQorCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sIFNldCB1cCAiZ2xvYmFsIiBDRkxBR1MKK2RubCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkbmwgVXNlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb21waWxlIGZsYWdzCitkbmwgKFdlIHVzZSAkaG9zdCBhbmQgbm90ICRidWlsZCBpbiBjYXNlIHdlIGFyZSBjcm9zcy1jb21waWxpbmcpCitkbmwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZG5sIE5vdGU6IHdlIG5vIGxvbmdlciBoYXZlIGFyY2ggc3BlY2lmaWMgY29tcGlsZSBmbGFncywgYnV0IAorZG5sIHRoZSBzdHViIGlzIGxlZnQgaGVyZSBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZCBvbmUgZGF5LgorY2FzZSAkaG9zdCBpbgorICAqKQorICAgIEFSQ0hGTEFHUz0iIiA7OworZXNhYworCitteV9hbV9jZmxhZ3M9Ii1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgJEFSQ0hGTEFHUyAtcGlwZSIKKworQUNfU1VCU1QoW0FNX0NGTEFHU10sIFsiJG15X2FtX2NmbGFncyJdKQorCisjIE1ha2Ugc3VyZSB0aGF0ICRBQ0xPQ0FMX0ZMQUdTIGFyZSB1c2VkIGR1cmluZyBhIHJlYnVpbGQKK0FDX1NVQlNUKFtBQ0xPQ0FMX0FNRkxBR1NdLCBbIi1JICRhY19tYWNyb19kaXIgXCQoQUNMT0NBTF9GTEFHUykiXSkKKworQUNfQ09ORklHX0ZJTEVTKFsKKwlNYWtlZmlsZQorCWxpbnV4LW5mcy9NYWtlZmlsZQorCXN1cHBvcnQvTWFrZWZpbGUKKwlzdXBwb3J0L2V4cG9ydC9NYWtlZmlsZQorCXN1cHBvcnQvaW5jbHVkZS9uZnMvTWFrZWZpbGUKKwlzdXBwb3J0L2luY2x1ZGUvcnBjc3ZjL01ha2VmaWxlCisJc3VwcG9ydC9pbmNsdWRlL3N5cy9mcy9NYWtlZmlsZQorCXN1cHBvcnQvaW5jbHVkZS9zeXMvTWFrZWZpbGUKKwlzdXBwb3J0L2luY2x1ZGUvTWFrZWZpbGUKKwlzdXBwb3J0L21pc2MvTWFrZWZpbGUKKwlzdXBwb3J0L25mcy9NYWtlZmlsZQorCXN1cHBvcnQvbnNtL01ha2VmaWxlCisJdG9vbHMvTWFrZWZpbGUKKwl0b29scy9sb2NrdGVzdC9NYWtlZmlsZQorCXRvb2xzL25sbXRlc3QvTWFrZWZpbGUKKwl0b29scy9ycGNkZWJ1Zy9NYWtlZmlsZQorCXRvb2xzL3JwY2dlbi9NYWtlZmlsZQorCXV0aWxzL01ha2VmaWxlCisJdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUKKwl1dGlscy9nc3NkL01ha2VmaWxlCisJdXRpbHMvaWRtYXBkL01ha2VmaWxlCisJdXRpbHMvbW91bnQvTWFrZWZpbGUKKwl1dGlscy9tb3VudGQvTWFrZWZpbGUKKwl1dGlscy9uZnNkL01ha2VmaWxlCisJdXRpbHMvbmZzc3RhdC9NYWtlZmlsZQorCXV0aWxzL3Nob3dtb3VudC9NYWtlZmlsZQorCXV0aWxzL3N0YXRkL01ha2VmaWxlCisJdGVzdHMvTWFrZWZpbGUKKwl0ZXN0cy9uc21fY2xpZW50L01ha2VmaWxlXSkKK0FDX09VVFBVVAorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvZGVwY29tcCBiL25mcy11dGlscy0xLjIuMi9kZXBjb21wCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmOGVlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvZGVwY29tcApAQCAtMCwwICsxLDYzMCBAQAorIyEgL2Jpbi9zaAorIyBkZXBjb21wIC0gY29tcGlsZSBhIHByb2dyYW0gZ2VuZXJhdGluZyBkZXBlbmRlbmNpZXMgYXMgc2lkZS1lZmZlY3RzCisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDkgRnJlZQorIyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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+JjIKKyAgZXhpdCAxCisgIDs7Citlc2FjCisKK2V4aXQgMAorCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTogc2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOiAyCisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2luc3RhbGwtc2ggYi9uZnMtdXRpbHMtMS4yLjIvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzgxYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2luc3RhbGwtc2gKQEAgLTAsMCArMSw1MjAgQEAKKyMhL2Jpbi9zaAorIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKworc2NyaXB0dmVyc2lvbj0yMDA5LTA0LTI4LjIxOyAjIFVUQworCisjIFRoaXMgb3JpZ2luYXRlcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLCB3aGljaCB3YXMKKyMgbGF0ZXIgcmVsZWFzZWQgaW4gWDExUjYgKHhjL2NvbmZpZy91dGlsL2luc3RhbGwuc2gpIHdpdGggdGhlCisjIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UuCisjCisjIENvcHlyaWdodCAoQykgMTk5NCBYIENvbnNvcnRpdW0KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorIyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyMgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyMgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisjIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisjIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisjIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQy0KKyMgVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyMKKyMgRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCBub3QKKyMgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWwtCisjIGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYIENvbnNvci0KKyMgdGl1bS4KKyMKKyMKKyMgRlNGIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGFyZSBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guCisKK25sPScKKycKK0lGUz0iICIiCSRubCIKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9JHtET0lUUFJPRy19CitpZiB0ZXN0IC16ICIkZG9pdCI7IHRoZW4KKyAgZG9pdF9leGVjPWV4ZWMKK2Vsc2UKKyAgZG9pdF9leGVjPSRkb2l0CitmaQorCisjIFB1dCBpbiBhYnNvbHV0ZSBmaWxlIG5hbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOworIyBvciB1c2UgZW52aXJvbm1lbnQgdmFycy4KKworY2hncnBwcm9nPSR7Q0hHUlBQUk9HLWNoZ3JwfQorY2htb2Rwcm9nPSR7Q0hNT0RQUk9HLWNobW9kfQorY2hvd25wcm9nPSR7Q0hPV05QUk9HLWNob3dufQorY21wcHJvZz0ke0NNUFBST0ctY21wfQorY3Bwcm9nPSR7Q1BQUk9HLWNwfQorbWtkaXJwcm9nPSR7TUtESVJQUk9HLW1rZGlyfQorbXZwcm9nPSR7TVZQUk9HLW12fQorcm1wcm9nPSR7Uk1QUk9HLXJtfQorc3RyaXBwcm9nPSR7U1RSSVBQUk9HLXN0cmlwfQorCitwb3NpeF9nbG9iPSc/JworaW5pdGlhbGl6ZV9wb3NpeF9nbG9iPScKKyAgdGVzdCAiJHBvc2l4X2dsb2IiICE9ICI/IiB8fCB7CisgICAgaWYgKHNldCAtZikgMj4vZGV2L251bGw7IHRoZW4KKyAgICAgIHBvc2l4X2dsb2I9CisgICAgZWxzZQorICAgICAgcG9zaXhfZ2xvYj06CisgICAgZmkKKyAgfQorJworCitwb3NpeF9ta2Rpcj0KKworIyBEZXNpcmVkIG1vZGUgb2YgaW5zdGFsbGVkIGZpbGUuCittb2RlPTA3NTUKKworY2hncnBjbWQ9CitjaG1vZGNtZD0kY2htb2Rwcm9nCitjaG93bmNtZD0KK212Y21kPSRtdnByb2cKK3JtY21kPSIkcm1wcm9nIC1mIgorc3RyaXBjbWQ9CisKK3NyYz0KK2RzdD0KK2Rpcl9hcmc9Citkc3RfYXJnPQorCitjb3B5X29uX2NoYW5nZT1mYWxzZQorbm9fdGFyZ2V0X2RpcmVjdG9yeT0KKwordXNhZ2U9IlwKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbLVRdIFNSQ0ZJTEUgRFNURklMRQorICAgb3I6ICQwIFtPUFRJT05dLi4uIFNSQ0ZJTEVTLi4uIERJUkVDVE9SWQorICAgb3I6ICQwIFtPUFRJT05dLi4uIC10IERJUkVDVE9SWSBTUkNGSUxFUy4uLgorICAgb3I6ICQwIFtPUFRJT05dLi4uIC1kIERJUkVDVE9SSUVTLi4uCisKK0luIHRoZSAxc3QgZm9ybSwgY29weSBTUkNGSUxFIHRvIERTVEZJTEUuCitJbiB0aGUgMm5kIGFuZCAzcmQsIGNvcHkgYWxsIFNSQ0ZJTEVTIHRvIERJUkVDVE9SWS4KK0luIHRoZSA0dGgsIGNyZWF0ZSBESVJFQ1RPUklFUy4KKworT3B0aW9uczoKKyAgICAgLS1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdC4KKyAgICAgLS12ZXJzaW9uICBkaXNwbGF5IHZlcnNpb24gaW5mbyBhbmQgZXhpdC4KKworICAtYyAgICAgICAgICAgIChpZ25vcmVkKQorICAtQyAgICAgICAgICAgIGluc3RhbGwgb25seSBpZiBkaWZmZXJlbnQgKHByZXNlcnZlIHRoZSBsYXN0IGRhdGEgbW9kaWZpY2F0aW9uIHRpbWUpCisgIC1kICAgICAgICAgICAgY3JlYXRlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgaW5zdGFsbGluZyBmaWxlcy4KKyAgLWcgR1JPVVAgICAgICAkY2hncnBwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBHUk9VUC4KKyAgLW0gTU9ERSAgICAgICAkY2htb2Rwcm9nIGluc3RhbGxlZCBmaWxlcyB0byBNT0RFLgorICAtbyBVU0VSICAgICAgICRjaG93bnByb2cgaW5zdGFsbGVkIGZpbGVzIHRvIFVTRVIuCisgIC1zICAgICAgICAgICAgJHN0cmlwcHJvZyBpbnN0YWxsZWQgZmlsZXMuCisgIC10IERJUkVDVE9SWSAgaW5zdGFsbCBpbnRvIERJUkVDVE9SWS4KKyAgLVQgICAgICAgICAgICByZXBvcnQgYW4gZXJyb3IgaWYgRFNURklMRSBpcyBhIGRpcmVjdG9yeS4KKworRW52aXJvbm1lbnQgdmFyaWFibGVzIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbW1hbmRzOgorICBDSEdSUFBST0cgQ0hNT0RQUk9HIENIT1dOUFJPRyBDTVBQUk9HIENQUFJPRyBNS0RJUlBST0cgTVZQUk9HCisgIFJNUFJPRyBTVFJJUFBST0cKKyIKKword2hpbGUgdGVzdCAkIyAtbmUgMDsgZG8KKyAgY2FzZSAkMSBpbgorICAgIC1jKSA7OworCisgICAgLUMpIGNvcHlfb25fY2hhbmdlPXRydWU7OworCisgICAgLWQpIGRpcl9hcmc9dHJ1ZTs7CisKKyAgICAtZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJc2hpZnQ7OworCisgICAgLS1oZWxwKSBlY2hvICIkdXNhZ2UiOyBleGl0ICQ/OzsKKworICAgIC1tKSBtb2RlPSQyCisJY2FzZSAkbW9kZSBpbgorCSAgKicgJyogfCAqJwknKiB8IConCisnKgkgIHwgKicqJyogfCAqJz8nKiB8IConWycqKQorCSAgICBlY2hvICIkMDogaW52YWxpZCBtb2RlOiAkbW9kZSIgPiYyCisJICAgIGV4aXQgMTs7CisJZXNhYworCXNoaWZ0OzsKKworICAgIC1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKKwlzaGlmdDs7CisKKyAgICAtcykgc3RyaXBjbWQ9JHN0cmlwcHJvZzs7CisKKyAgICAtdCkgZHN0X2FyZz0kMgorCXNoaWZ0OzsKKworICAgIC1UKSBub190YXJnZXRfZGlyZWN0b3J5PXRydWU7OworCisgICAgLS12ZXJzaW9uKSBlY2hvICIkMCAkc2NyaXB0dmVyc2lvbiI7IGV4aXQgJD87OworCisgICAgLS0pCXNoaWZ0CisJYnJlYWs7OworCisgICAgLSopCWVjaG8gIiQwOiBpbnZhbGlkIG9wdGlvbjogJDEiID4mMgorCWV4aXQgMTs7CisKKyAgICAqKSAgYnJlYWs7OworICBlc2FjCisgIHNoaWZ0Citkb25lCisKK2lmIHRlc3QgJCMgLW5lIDAgJiYgdGVzdCAteiAiJGRpcl9hcmckZHN0X2FyZyI7IHRoZW4KKyAgIyBXaGVuIC1kIGlzIHVzZWQsIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBkaXJlY3RvcmllcyB0byBjcmVhdGUuCisgICMgV2hlbiAtdCBpcyB1c2VkLCB0aGUgZGVzdGluYXRpb24gaXMgYWxyZWFkeSBzcGVjaWZpZWQuCisgICMgT3RoZXJ3aXNlLCB0aGUgbGFzdCBhcmd1bWVudCBpcyB0aGUgZGVzdGluYXRpb24uICBSZW1vdmUgaXQgZnJvbSAkQC4KKyAgZm9yIGFyZworICBkbworICAgIGlmIHRlc3QgLW4gIiRkc3RfYXJnIjsgdGhlbgorICAgICAgIyAkQCBpcyBub3QgZW1wdHk6IGl0IGNvbnRhaW5zIGF0IGxlYXN0ICRhcmcuCisgICAgICBzZXQgZm5vcmQgIiRAIiAiJGRzdF9hcmciCisgICAgICBzaGlmdCAjIGZub3JkCisgICAgZmkKKyAgICBzaGlmdCAjIGFyZworICAgIGRzdF9hcmc9JGFyZworICBkb25lCitmaQorCitpZiB0ZXN0ICQjIC1lcSAwOyB0aGVuCisgIGlmIHRlc3QgLXogIiRkaXJfYXJnIjsgdGhlbgorICAgIGVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZC4iID4mMgorICAgIGV4aXQgMQorICBmaQorICAjIEl0J3MgT0sgdG8gY2FsbCBgaW5zdGFsbC1zaCAtZCcgd2l0aG91dCBhcmd1bWVudC4KKyAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBjcmVhdGluZyBjb25kaXRpb25hbCBkaXJlY3Rvcmllcy4KKyAgZXhpdCAwCitmaQorCitpZiB0ZXN0IC16ICIkZGlyX2FyZyI7IHRoZW4KKyAgdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKKworICAjIFNldCB1bWFzayBzbyBhcyBub3QgdG8gY3JlYXRlIHRlbXBzIHdpdGggdG9vLWdlbmVyb3VzIG1vZGVzLgorICAjIEhvd2V2ZXIsICdzdHJpcCcgcmVxdWlyZXMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgdG8gdGVtcHMuCisgIGNhc2UgJG1vZGUgaW4KKyAgICAjIE9wdGltaXplIGNvbW1vbiBjYXNlcy4KKyAgICAqNjQ0KSBjcF91bWFzaz0xMzM7OworICAgICo3NTUpIGNwX3VtYXNrPTIyOzsKKworICAgICpbMC03XSkKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSclIDIwMCcKKyAgICAgIGZpCisgICAgICBjcF91bWFzaz1gZXhwciAnKCcgNzc3IC0gJG1vZGUgJSAxMDAwICcpJyAkdV9wbHVzX3J3YDs7CisgICAgKikKKyAgICAgIGlmIHRlc3QgLXogIiRzdHJpcGNtZCI7IHRoZW4KKwl1X3BsdXNfcnc9CisgICAgICBlbHNlCisJdV9wbHVzX3J3PSx1K3J3CisgICAgICBmaQorICAgICAgY3BfdW1hc2s9JG1vZGUkdV9wbHVzX3J3OzsKKyAgZXNhYworZmkKKworZm9yIHNyYworZG8KKyAgIyBQcm90ZWN0IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nLgorICBjYXNlICRzcmMgaW4KKyAgICAtKikgc3JjPS4vJHNyYzs7CisgIGVzYWMKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICBkc3Q9JHNyYworICAgIGRzdGRpcj0kZHN0CisgICAgdGVzdCAtZCAiJGRzdGRpciIKKyAgICBkc3RkaXJfc3RhdHVzPSQ/CisgIGVsc2UKKworICAgICMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRjcHByb2cgJHNyYyAkZHN0dG1wIiBjb21tYW5kCisgICAgIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorICAgICMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorICAgIGlmIHRlc3QgISAtZiAiJHNyYyIgJiYgdGVzdCAhIC1kICIkc3JjIjsgdGhlbgorICAgICAgZWNobyAiJDA6ICRzcmMgZG9lcyBub3QgZXhpc3QuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBpZiB0ZXN0IC16ICIkZHN0X2FyZyI7IHRoZW4KKyAgICAgIGVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQuIiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBkc3Q9JGRzdF9hcmcKKyAgICAjIFByb3RlY3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBgLScuCisgICAgY2FzZSAkZHN0IGluCisgICAgICAtKikgZHN0PS4vJGRzdDs7CisgICAgZXNhYworCisgICAgIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgd29uJ3Qgd29yaworICAgICMgaWYgZG91YmxlIHNsYXNoZXMgYXJlbid0IGlnbm9yZWQuCisgICAgaWYgdGVzdCAtZCAiJGRzdCI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiRub190YXJnZXRfZGlyZWN0b3J5IjsgdGhlbgorCWVjaG8gIiQwOiAkZHN0X2FyZzogSXMgYSBkaXJlY3RvcnkiID4mMgorCWV4aXQgMQorICAgICAgZmkKKyAgICAgIGRzdGRpcj0kZHN0CisgICAgICBkc3Q9JGRzdGRpci9gYmFzZW5hbWUgIiRzcmMiYAorICAgICAgZHN0ZGlyX3N0YXR1cz0wCisgICAgZWxzZQorICAgICAgIyBQcmVmZXIgZGlybmFtZSwgYnV0IGZhbGwgYmFjayBvbiBhIHN1YnN0aXR1dGUgaWYgZGlybmFtZSBmYWlscy4KKyAgICAgIGRzdGRpcj1gCisJKGRpcm5hbWUgIiRkc3QiKSAyPi9kZXYvbnVsbCB8fAorCWV4cHIgWCIkZHN0IiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvL1wpJCcgXHwgXAorCSAgICAgWCIkZHN0IiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKwllY2hvIFgiJGRzdCIgfAorCSAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXClbXi9dLioveworCQkgICBzLy9cMS8KKwkJICAgcQorCQkgfQorCQkgL15YXChcL1wvXCkkL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIC9eWFwoXC9cKS4qL3sKKwkJICAgcy8vXDEvCisJCSAgIHEKKwkJIH0KKwkJIHMvLiovLi87IHEnCisgICAgICBgCisKKyAgICAgIHRlc3QgLWQgIiRkc3RkaXIiCisgICAgICBkc3RkaXJfc3RhdHVzPSQ/CisgICAgZmkKKyAgZmkKKworICBvYnNvbGV0ZV9ta2Rpcl91c2VkPWZhbHNlCisKKyAgaWYgdGVzdCAkZHN0ZGlyX3N0YXR1cyAhPSAwOyB0aGVuCisgICAgY2FzZSAkcG9zaXhfbWtkaXIgaW4KKyAgICAgICcnKQorCSMgQ3JlYXRlIGludGVybWVkaWF0ZSBkaXJzIHVzaW5nIG1vZGUgNzU1IGFzIG1vZGlmaWVkIGJ5IHRoZSB1bWFzay4KKwkjIFRoaXMgaXMgbGlrZSBGcmVlQlNEICdpbnN0YWxsJyBhcyBvZiAxOTk3LTEwLTI4LgorCXVtYXNrPWB1bWFza2AKKwljYXNlICRzdHJpcGNtZC4kdW1hc2sgaW4KKwkgICMgT3B0aW1pemUgY29tbW9uIGNhc2VzLgorCSAgKlsyMzY3XVsyMzY3XSkgbWtkaXJfdW1hc2s9JHVtYXNrOzsKKwkgIC4qMFswMl1bMDJdIHwgLlswMl1bMDJdIHwgLlswMl0pIG1rZGlyX3VtYXNrPTIyOzsKKworCSAgKlswLTddKQorCSAgICBta2Rpcl91bWFzaz1gZXhwciAkdW1hc2sgKyAyMiBcCisJICAgICAgLSAkdW1hc2sgJSAxMDAgJSA0MCArICR1bWFzayAlIDIwIFwKKwkgICAgICAtICR1bWFzayAlIDEwICUgNCArICR1bWFzayAlIDIKKwkgICAgYDs7CisJICAqKSBta2Rpcl91bWFzaz0kdW1hc2ssZ28tdzs7CisJZXNhYworCisJIyBXaXRoIC1kLCBjcmVhdGUgdGhlIG5ldyBkaXJlY3Rvcnkgd2l0aCB0aGUgdXNlci1zcGVjaWZpZWQgbW9kZS4KKwkjIE90aGVyd2lzZSwgcmVseSBvbiAkbWtkaXJfdW1hc2suCisJaWYgdGVzdCAtbiAiJGRpcl9hcmciOyB0aGVuCisJICBta2Rpcl9tb2RlPS1tJG1vZGUKKwllbHNlCisJICBta2Rpcl9tb2RlPQorCWZpCisKKwlwb3NpeF9ta2Rpcj1mYWxzZQorCWNhc2UgJHVtYXNrIGluCisJICAqWzEyMzU2N11bMC03XVswLTddKQorCSAgICAjIFBPU0lYIG1rZGlyIC1wIHNldHMgdSt3eCBiaXRzIHJlZ2FyZGxlc3Mgb2YgdW1hc2ssIHdoaWNoCisJICAgICMgaXMgaW5jb21wYXRpYmxlIHdpdGggRnJlZUJTRCAnaW5zdGFsbCcgd2hlbiAodW1hc2sgJiAzMDApICE9IDAuCisJICAgIDs7CisJICAqKQorCSAgICB0bXBkaXI9JHtUTVBESVItL3RtcH0vaW5zJFJBTkRPTS0kJAorCSAgICB0cmFwICdyZXQ9JD87IHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIiAyPi9kZXYvbnVsbDsgZXhpdCAkcmV0JyAwCisKKwkgICAgaWYgKHVtYXNrICRta2Rpcl91bWFzayAmJgorCQlleGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiR0bXBkaXIvZCIpID4vZGV2L251bGwgMj4mMQorCSAgICB0aGVuCisJICAgICAgaWYgdGVzdCAteiAiJGRpcl9hcmciIHx8IHsKKwkJICAgIyBDaGVjayBmb3IgUE9TSVggaW5jb21wYXRpYmlsaXRpZXMgd2l0aCAtbS4KKwkJICAgIyBIUC1VWCAxMS4yMyBhbmQgSVJJWCA2LjUgbWtkaXIgLW0gLXAgc2V0cyBncm91cC0gb3IKKwkJICAgIyBvdGhlci13cml0ZWFibGUgYml0IG9mIHBhcmVudCBkaXJlY3Rvcnkgd2hlbiBpdCBzaG91bGRuJ3QuCisJCSAgICMgRnJlZUJTRCA2LjEgbWtkaXIgLW0gLXAgc2V0cyBtb2RlIG9mIGV4aXN0aW5nIGRpcmVjdG9yeS4KKwkJICAgbHNfbGRfdG1wZGlyPWBscyAtbGQgIiR0bXBkaXIiYAorCQkgICBjYXNlICRsc19sZF90bXBkaXIgaW4KKwkJICAgICBkPz8/Py0/ci0qKSBkaWZmZXJlbnRfbW9kZT03MDA7OworCQkgICAgIGQ/Pz8/LT8tLSopIGRpZmZlcmVudF9tb2RlPTc1NTs7CisJCSAgICAgKikgZmFsc2U7OworCQkgICBlc2FjICYmCisJCSAgICRta2RpcnByb2cgLW0kZGlmZmVyZW50X21vZGUgLXAgLS0gIiR0bXBkaXIiICYmIHsKKwkJICAgICBsc19sZF90bXBkaXJfMT1gbHMgLWxkICIkdG1wZGlyImAKKwkJICAgICB0ZXN0ICIkbHNfbGRfdG1wZGlyIiA9ICIkbHNfbGRfdG1wZGlyXzEiCisJCSAgIH0KKwkJIH0KKwkgICAgICB0aGVuIHBvc2l4X21rZGlyPToKKwkgICAgICBmaQorCSAgICAgIHJtZGlyICIkdG1wZGlyL2QiICIkdG1wZGlyIgorCSAgICBlbHNlCisJICAgICAgIyBSZW1vdmUgYW55IGRpcnMgbGVmdCBiZWhpbmQgYnkgYW5jaWVudCBta2RpciBpbXBsZW1lbnRhdGlvbnMuCisJICAgICAgcm1kaXIgLi8kbWtkaXJfbW9kZSAuLy1wIC4vLS0gMj4vZGV2L251bGwKKwkgICAgZmkKKwkgICAgdHJhcCAnJyAwOzsKKwllc2FjOzsKKyAgICBlc2FjCisKKyAgICBpZgorICAgICAgJHBvc2l4X21rZGlyICYmICgKKwl1bWFzayAkbWtkaXJfdW1hc2sgJiYKKwkkZG9pdF9leGVjICRta2RpcnByb2cgJG1rZGlyX21vZGUgLXAgLS0gIiRkc3RkaXIiCisgICAgICApCisgICAgdGhlbiA6CisgICAgZWxzZQorCisgICAgICAjIFRoZSB1bWFzayBpcyByaWRpY3Vsb3VzLCBvciBta2RpciBkb2VzIG5vdCBjb25mb3JtIHRvIFBPU0lYLAorICAgICAgIyBvciBpdCBmYWlsZWQgcG9zc2libHkgZHVlIHRvIGEgcmFjZSBjb25kaXRpb24uICBDcmVhdGUgdGhlCisgICAgICAjIGRpcmVjdG9yeSB0aGUgc2xvdyB3YXksIHN0ZXAgYnkgc3RlcCwgY2hlY2tpbmcgZm9yIHJhY2VzIGFzIHdlIGdvLgorCisgICAgICBjYXNlICRkc3RkaXIgaW4KKwkvKikgcHJlZml4PScvJzs7CisJLSopIHByZWZpeD0nLi8nOzsKKwkqKSAgcHJlZml4PScnOzsKKyAgICAgIGVzYWMKKworICAgICAgZXZhbCAiJGluaXRpYWxpemVfcG9zaXhfZ2xvYiIKKworICAgICAgb0lGUz0kSUZTCisgICAgICBJRlM9LworICAgICAgJHBvc2l4X2dsb2Igc2V0IC1mCisgICAgICBzZXQgZm5vcmQgJGRzdGRpcgorICAgICAgc2hpZnQKKyAgICAgICRwb3NpeF9nbG9iIHNldCArZgorICAgICAgSUZTPSRvSUZTCisKKyAgICAgIHByZWZpeGVzPQorCisgICAgICBmb3IgZAorICAgICAgZG8KKwl0ZXN0IC16ICIkZCIgJiYgY29udGludWUKKworCXByZWZpeD0kcHJlZml4JGQKKwlpZiB0ZXN0IC1kICIkcHJlZml4IjsgdGhlbgorCSAgcHJlZml4ZXM9CisJZWxzZQorCSAgaWYgJHBvc2l4X21rZGlyOyB0aGVuCisJICAgICh1bWFzaz0kbWtkaXJfdW1hc2sgJiYKKwkgICAgICRkb2l0X2V4ZWMgJG1rZGlycHJvZyAkbWtkaXJfbW9kZSAtcCAtLSAiJGRzdGRpciIpICYmIGJyZWFrCisJICAgICMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkgICAgdGVzdCAtZCAiJHByZWZpeCIgfHwgZXhpdCAxCisJICBlbHNlCisJICAgIGNhc2UgJHByZWZpeCBpbgorCSAgICAgICpcJyopIHFwcmVmaXg9YGVjaG8gIiRwcmVmaXgiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsKKwkgICAgICAqKSBxcHJlZml4PSRwcmVmaXg7OworCSAgICBlc2FjCisJICAgIHByZWZpeGVzPSIkcHJlZml4ZXMgJyRxcHJlZml4JyIKKwkgIGZpCisJZmkKKwlwcmVmaXg9JHByZWZpeC8KKyAgICAgIGRvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHByZWZpeGVzIjsgdGhlbgorCSMgRG9uJ3QgZmFpbCBpZiB0d28gaW5zdGFuY2VzIGFyZSBydW5uaW5nIGNvbmN1cnJlbnRseS4KKwkodW1hc2sgJG1rZGlyX3VtYXNrICYmCisJIGV2YWwgIlwkZG9pdF9leGVjIFwkbWtkaXJwcm9nICRwcmVmaXhlcyIpIHx8CisJICB0ZXN0IC1kICIkZHN0ZGlyIiB8fCBleGl0IDEKKwlvYnNvbGV0ZV9ta2Rpcl91c2VkPXRydWUKKyAgICAgIGZpCisgICAgZmkKKyAgZmkKKworICBpZiB0ZXN0IC1uICIkZGlyX2FyZyI7IHRoZW4KKyAgICB7IHRlc3QgLXogIiRjaG93bmNtZCIgfHwgJGRvaXQgJGNob3duY21kICIkZHN0IjsgfSAmJgorICAgIHsgdGVzdCAteiAiJGNoZ3JwY21kIiB8fCAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyB9ICYmCisgICAgeyB0ZXN0ICIkb2Jzb2xldGVfbWtkaXJfdXNlZCRjaG93bmNtZCRjaGdycGNtZCIgPSBmYWxzZSB8fAorICAgICAgdGVzdCAteiAiJGNobW9kY21kIiB8fCAkZG9pdCAkY2htb2RjbWQgJG1vZGUgIiRkc3QiOyB9IHx8IGV4aXQgMQorICBlbHNlCisKKyAgICAjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorICAgIGRzdHRtcD0kZHN0ZGlyL19pbnN0LiQkXworICAgIHJtdG1wPSRkc3RkaXIvX3JtLiQkXworCisgICAgIyBUcmFwIHRvIGNsZWFuIHVwIHRob3NlIHRlbXAgZmlsZXMgYXQgZXhpdC4KKyAgICB0cmFwICdyZXQ9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRyZXQnIDAKKworICAgICMgQ29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUuCisgICAgKHVtYXNrICRjcF91bWFzayAmJiAkZG9pdF9leGVjICRjcHByb2cgIiRzcmMiICIkZHN0dG1wIikgJiYKKworICAgICMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cy4KKyAgICAjCisgICAgIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bworICAgICMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorICAgICMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkY3Bwcm9nICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKyAgICAjCisgICAgeyB0ZXN0IC16ICIkY2hvd25jbWQiIHx8ICRkb2l0ICRjaG93bmNtZCAiJGRzdHRtcCI7IH0gJiYKKyAgICB7IHRlc3QgLXogIiRjaGdycGNtZCIgfHwgJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgfSAmJgorICAgIHsgdGVzdCAteiAiJHN0cmlwY21kIiB8fCAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyB9ICYmCisgICAgeyB0ZXN0IC16ICIkY2htb2RjbWQiIHx8ICRkb2l0ICRjaG1vZGNtZCAkbW9kZSAiJGRzdHRtcCI7IH0gJiYKKworICAgICMgSWYgLUMsIGRvbid0IGJvdGhlciB0byBjb3B5IGlmIGl0IHdvdWxkbid0IGNoYW5nZSB0aGUgZmlsZS4KKyAgICBpZiAkY29weV9vbl9jaGFuZ2UgJiYKKyAgICAgICBvbGQ9YExDX0FMTD1DIGxzIC1kbEwgIiRkc3QiCTI+L2Rldi9udWxsYCAmJgorICAgICAgIG5ldz1gTENfQUxMPUMgbHMgLWRsTCAiJGRzdHRtcCIJMj4vZGV2L251bGxgICYmCisKKyAgICAgICBldmFsICIkaW5pdGlhbGl6ZV9wb3NpeF9nbG9iIiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCAtZiAmJgorICAgICAgIHNldCBYICRvbGQgJiYgb2xkPTokMjokNDokNTokNiAmJgorICAgICAgIHNldCBYICRuZXcgJiYgbmV3PTokMjokNDokNTokNiAmJgorICAgICAgICRwb3NpeF9nbG9iIHNldCArZiAmJgorCisgICAgICAgdGVzdCAiJG9sZCIgPSAiJG5ldyIgJiYKKyAgICAgICAkY21wcHJvZyAiJGRzdCIgIiRkc3R0bXAiID4vZGV2L251bGwgMj4mMQorICAgIHRoZW4KKyAgICAgIHJtIC1mICIkZHN0dG1wIgorICAgIGVsc2UKKyAgICAgICMgUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorICAgICAgJGRvaXQgJG12Y21kIC1mICIkZHN0dG1wIiAiJGRzdCIgMj4vZGV2L251bGwgfHwKKworICAgICAgIyBUaGUgcmVuYW1lIGZhaWxlZCwgcGVyaGFwcyBiZWNhdXNlIG12IGNhbid0IHJlbmFtZSBzb21ldGhpbmcgZWxzZQorICAgICAgIyB0byBpdHNlbGYsIG9yIHBlcmhhcHMgYmVjYXVzZSBtdiBpcyBzbyBhbmNpZW50IHRoYXQgaXQgZG9lcyBub3QKKyAgICAgICMgc3VwcG9ydCAtZi4KKyAgICAgIHsKKwkjIE5vdyByZW1vdmUgb3IgbW92ZSBhc2lkZSBhbnkgb2xkIGZpbGUgYXQgZGVzdGluYXRpb24gbG9jYXRpb24uCisJIyBXZSB0cnkgdGhpcyB0d28gd2F5cyBzaW5jZSBybSBjYW4ndCB1bmxpbmsgaXRzZWxmIG9uIHNvbWUKKwkjIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyCisJIyByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cCBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3CisJIyBmaWxlIHNob3VsZCBzdGlsbCBpbnN0YWxsIHN1Y2Nlc3NmdWxseS4KKwl7CisJICB0ZXN0ICEgLWYgIiRkc3QiIHx8CisJICAkZG9pdCAkcm1jbWQgLWYgIiRkc3QiIDI+L2Rldi9udWxsIHx8CisJICB7ICRkb2l0ICRtdmNtZCAtZiAiJGRzdCIgIiRybXRtcCIgMj4vZGV2L251bGwgJiYKKwkgICAgeyAkZG9pdCAkcm1jbWQgLWYgIiRybXRtcCIgMj4vZGV2L251bGw7IDo7IH0KKwkgIH0gfHwKKwkgIHsgZWNobyAiJDA6IGNhbm5vdCB1bmxpbmsgb3IgcmVuYW1lICRkc3QiID4mMgorCSAgICAoZXhpdCAxKTsgZXhpdCAxCisJICB9CisJfSAmJgorCisJIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3QiCisgICAgICB9CisgICAgZmkgfHwgZXhpdCAxCisKKyAgICB0cmFwICcnIDAKKyAgZmkKK2RvbmUKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9DaGFuZ2VMb2cgYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZmZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9DaGFuZ2VMb2cKQEAgLTAsMCArMSw3OCBAQAorCitSZWxlYXNlIDAuNC4xMQorCisgKglBZGRlZCBhc3luYyB3cml0ZXMuCisgKglGaXhlZCBidWcgd2hlcmUgdHdvIHJwY2lvZCdzIHdvdWxkIGJlIHN0YXJ0ZWQgd2hlbiBpbnNtb2QnaW5nCisJYm90aCBuZnMubyBhbmQgbmZzZC5vLgorCitSZWxlYXNlIDAuNC4xMgorCisgKglGaXhlZCBjb21waWxlIHByb2JsZW0gYWZ0ZXIgcmVuYW1pbmcgc29tZSBkZWJ1ZyBtYWNyb3MuCisgKglJbXByb3ZlZCByZWFkZGlyIGNhY2hlLCB3aGljaCBjYW4gbm93IGhvbGQgdXAgdG8gMTYgKGNvbmZpZ3VyYWJsZSkKKwlyZWFkZGlyIHJlcGxpZXMuCisgKglGaXhlZCBhc3luYyB3cml0ZSBidWcocykKKyAqCWNsaWVudCBmaWxlIGxvY2tpbmcgbm93IGRvZXMgYXQgbGVhc3QgbG9jay91bmxvY2sgd2l0aG91dAorCWNyYXNoaW5nIHRoZSBtYWNoaW5lCisgKglTdGFydGVkIHRvIHdvcmsgb24gTkZTIHN3YXBwaW5nCisgKgluZnNfZ2V0X3N1cGVyIG5vIGxvbmdlciByZXF1aXJlcyB0aGUgZmlsZSBoYW5kbGUgcGFzc2VkIGJ5CisJbW91bnQgYnV0IGRvZXMgYSBzdHJhaWdodCB4cHJ0X2NyZWF0ZV9wcm90bygpLgorICoJVENQIHJlY29ubmVjdCBzaG91bGQgd29yayBub3cgKG5vdCB5ZXQgdGVzdGVkIGZvciBsb25nIGRpc2Nvbm5lY3QKKwlwZXJpb2RzLCBidXQgaXQgZG9lcyB3b3JrIGlmIHlvdSBraWxsIGFuZCByZXN0YXJ0IG5mc2QpLgorCitSZWxlYXNlIDAuNC4xMworCisgKglNb3JlIHdyaXRlYmFjayBidWdzIHJlbW92ZWQuCisgKglBZGRlZCBhIG1vZGlmaWVkIChhbmQgYW5zaWZpZWQpIHRpcnBjIHJwY2dlbiB0byBnZXQgcmlkIG9mIGFsbAorCXRoZSB3YXJuaW5ncyBpbiBmaWxlcyBnZW5lcmF0ZWQgZnJvbSAqLnggZGVzY3JpcHRpb25zLiBUaGF0IG9sZCBTdW4KKwljb2RlIGlzIGEgcmVhbCBtZXNzLgorICoJQ2xlYW5lZCB1cCBuZnNkIGV4cG9ydCBoYW5kbGluZyBhIGJpdC4gQWxsIHN5c2NhbGxzIG5vdworCXRha2UgZGV2L2lubyByYXRoZXIgdGhhbiB0aGUgcGF0aG5hbWUuCisgKglBZGRlZCBzeXNjdGwgaW50ZXJmYWNlIHRvIHNldC9nZXQgZGVidWcgZmxhZ3MgKHNlZSB0b29scy9ycGNkZWJ1ZykuCisgKglDbGVhbmVkIHVwIE1ha2VmaWxlcy4KKyAqCShleHBlcmltZW50YWwpIEdhdGhlcmVkIHdyaXRlcyBmb3IgbmZzZCAodXNlIHRoZSB3ZGVsYXkgb3B0aW9uIGluCisJL2V0Yy9leHBvcnRzKS4KKyAqCUZpeGVkIHNpbGx5IGJ1ZyBpbiBuZnNfcmVhZGRpciAodGhlIGluLXBsYWNlIGRlY29kaW5nIG9mIHJlYWRkaXIKKwlyZXBsaWVzIHJlcXVpcmVzIGEgdGVtcG9yYXJ5IGJ1ZmZlcikuCisgKglGaXhlZCByZWFkZGlyIGJ1ZyBpbiBuZnNkIChsb25nIGRpcmVjdG9yaWVzIHdlcmUgdHJ1bmNhdGVkKS4KKworUmVsZWFzZSAwLjQuMTQKKworICoJVXBncmFkZWQgdG8ga2VybmVsIDIuMC4yMworICoJRml4ZWQgYnVnIGluIHJwY2RlYnVnCisgKglyZWFkZGlyIHN0aWxsIGRpZG4ndCB3b3JrIHJpZ2h0IGluIG5mc2QuIEFyZ2ghCisgKgluZnNkIHdvdWxkIHJlZnVzZSB0byBjcmVhdGUgc3ltbGlua3Mgd2l0aCBzbGFzaGVzIGluIHRoZW06LSkKKyAqCW5mc2QncyBSUEMgcmVwbHkgY2FjaGUgc2hvdWxkIG5vdyB3b3JrIGFnYWluLgorICoJSGVhdmlseSBtb2RpZmllZCBycGMuc3RhdGQgZm9yIG1vcmUgcm9idXN0IGNhbGxiYWNrL25vdGlmeSBoYW5kbGluZworCitSZWxlYXNlIDAuNC4xNworCisgKglVcGdyYWRlZCB0byBrZXJuZWwgMi4xLjE0CisgKglHb3QgbG9ja2Qgd29ya2luZyB3aXRoIEhQVVggaW4gbW9zdCBhcmVhcy4KKworUmVsZWFzZSAwLjQuMTkKKworICoJUlBDIHNlcnZlciBVRFAgc29ja2V0cyBub3cgcmVjZWl2ZSB0aGUgc2tfYnVmZiBkaXJlY3RseSByYXRoZXIKKwl0aGFuIGdvaW5nIHRocm91Z2ggc29jay0+b3BzLT5yZWN2bXNnLgorCUFsc28gZ290IHJpZCBvZiBhbGwgdGhvc2UgY2xpL3N0aSdzIGFuZCByZXBsYWNlZCB0aGVtIHdpdGgKKwlkaXNhYmxlX2JoL2VuYWJsZV9iaCBjYWxscy4KKyAqCUZpeGVkIGEgYnVnIGluIG5mc2QncyBoYW5kbGluZyBvZiByZW5hbWUgYW5kIGZyaWVuZHMuCisKK1JlbGVhc2UgMC40LjIwCisKKyAqCVNvbWUgYnVnZml4ZXMsIGVzcCBpbiB0aGUgd3JpdGViYWNrIGNvZGUKKyAqCUF2b2lkIHNvbWUgdW5uZWNlc3NhcnkgY2xpL3N0aSBwYWlycworICoJQWRkZWQgbmhmc3N0b25lCisKK1JlbGVhc2UgMC40LjIxCisKKyAqCU1pbm9yIGJ1Z2ZpeGVzCisgKglNb3ZlZCB0byBwb3N0LTIuMS4xNiBtb2R1bGUgaGFuZGxpbmcgY29kZQorCitSZWxlYXNlIDAuNC4yMgorCisgKglGaXhlZCBhIGJ1ZyB0aGF0IG1hZGUgcnBjaW5mbyAtdSBob3N0IG5sb2NrbWdyIHByb3Zva2UgYSBrZXJuZWwKKwlvb3BzLgorICoJVXBncmFkZWQgdG8gbW91bnQtMi42YgorICoJQWRkZWQgTkZTdjMgc3VwcG9ydCB0byBtb3VudGQgYW5kIG5mc2QKKyAqCU1hZGUgc3VyZSBpdCBjb21waWxlcyB3aXRoIGdsaWJjMi4KKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9JTlNUQUxMIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MWY3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL0lOU1RBTEwKQEAgLTAsMCArMSwxMSBAQAorCitFdmVuIHRob3VnaCB0aGUgTWFrZWZpbGVzIG9mZmVyIGEgYG1ha2UgaW5zdGFsbCcgaW5zdHJ1Y3Rpb24sCitJIHdvdWxkIHN1Z2dlc3QgYWdhaW5zdCB1c2luZyBpdCB5ZXQuIEkgaGF2ZSBydW4gbmZzZCBhbmQgdGhlIG5mcworY2xpZW50IHdpdGhvdXQga2VybmVsIG9vcHNlcyBmb3IgYSB3aGlsZSwgYnV0IHRoZSBwaWN0dXJlIG1heSBjaGFuZ2UKK2lmIHlvdSBzdGFydCBwbGF5aW5nIHdpdGggbG9ja2QuIEF1dG9tYXRpYyBpbnN0YWxsYXRpb24gbWF5IG5vdCBldmVuCit3b3JrIGZvciB0aGUga2VybmVsIG1ha2VmaWxlcyB5ZXQuCisKK0knZCB0aGVyZWZvcmUgYWR2aXNlIHRoYXQgeW91IHVzZSBhIHNlcGFyYXRlIExpbnV4IGJveCBmb3IgdGVzdGluZworaWYgeW91IGhhdmUgb25lLiBVc2UgdGhlIGV0Yy9jb3B5IHNjcmlwdCB0byBjb3B5IGFsbCBtb2R1bGVzIGFuZAorc3VwcG9ydCBwcm9ncmFtcywgYW5kIHJ1biB0aGUgaW5zIHNjcmlwdCB0byBzdGFydCB0aGUgc2hvdy4gcm1tCit3aWxsIGNsZWFuIHVwIGFmdGVyd2FyZHMgKHByb3ZpZGVkIHlvdSBkaWRuJ3QgdHJpZ2dlciBhbiBvb3BzKS4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9saW51eC1uZnMvS05PV05CVUdTIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9LTk9XTkJVR1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlY2Q1YwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9saW51eC1uZnMvS05PV05CVUdTCkBAIC0wLDAgKzEsMzcgQEAKKworbmZzZDoKKworICoJV2UgY3VycmVudGx5IGtlZXAgdGhlIGlub2RlIGluIHRoZSBleHBvcnRzIHN0cnVjdC4gVGhpcyBpcworCWEgYmFkIGlkZWEgd2l0aCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzCisJYSBtb3VudCBwb2ludC4gTXVzdCBzdG9yZSB0aGUgZmlsZSBuYW1lIGluc3RlYWQgYW5kIGRvIGEKKwlsb29rdXAgd2hlbiBnZXRmaCBpcyBjYWxsZWQuIFl1Y2shCisKKwlFdmVuIHl1Y2tpZXI6IHdoYXQgZG8gd2UgZG8gYWJvdXQgZXhwb3J0cyBtYXRjaGluZyB3aGVuIHdlCisJY2FuJ3Qga2VlcCB0aGUgaW5vZGUgbnVtYmVyPworCisgKglzdGF0aW5nIGEgZmlsZSBvbiByZW1vdGUgY2Ryb20gcmV0dXJucyBzdF9ibG9ja3MgPT0gMCBmb3Igc29tZQorCWFwcHMuCisKKyAqCVNob3VsZCBhbGxvdyBtdWx0aXBsZSBleHBvcnRzIHBlciBkZXYgaWYgb25lIG9mIHRoZSBkaXJlY3RvcmllcworCWlzbid0IGEgc3ViZGlyIG9mIHRoZSBvdGhlci4KKworbmZzY2xudDoKKworICoJT24gc29tZSBvY2Nhc2lvbnMsIGFuIEVBR0FJTiByZXBvcnRlZCBieSB0aGUgdHJhbnNwb3J0IGxheWVyCisJd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBWRlMuCisgKglTb21lIG9wZXJhdGlvbnMgZG8gbm90IHNlZW0gdG8gcmVsZWFzZSB0aGUgaW5vZGUgcHJvcGVybHksIHNvCisJdW5tb3VudGluZyB0aGUgZGV2aWNlIGZhaWxzLgorCitsb2NrZDoKKworICoJSGFuZGxlIHBvcnRtYXAgcmVnaXN0cmF0aW9uIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBwb3J0bWFwIG1heQorCW5vdCBiZSBydW5uaW5nIHdoZW4gd2UgdHJ5IHRvIG1vdW50IHRoZSBmaXJzdCBORlMgdm9sdW1lIChlc3AuCisJd2hlbiBtb3VudGluZyAvdXNyKS4KKworICoJRG9lcyBub3QgaW5mb3JtIHJwYy5zdGF0ZCB3aGVuIGhvc3RzIG5vIGxvbmdlciByZXF1aXJlCisJbW9uaXRvcmluZzsgaG9zdHMgYXJlIGluY29ycmVjdGx5IG1vbml0b3JlZCB1bnRpbCBuZXh0IHN5c3RlbQorCXJlYm9vdC4KKworZXhwb3J0ZnMvbW91bnRkOgorCisgKglFeHBvcnQgaGFuZGxpbmcgaXMgcmVwb3J0ZWQgdG8gZG8gb2RkIHRoaW5ncyBhdCB0aW1lcy4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9saW51eC1uZnMvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjA2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK0VYVFJBX0RJU1QgPSBDaGFuZ2VMb2cgSU5TVEFMTCBLTk9XTkJVR1MgTkVXIFJFQURNRSBUSEFOS1MgVE9ETworCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDBmODQzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQxMiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IGxpbnV4LW5mcworRElTVF9DT01NT04gPSBSRUFETUUgJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBcCisJQ2hhbmdlTG9nIElOU1RBTEwgVEhBTktTIFRPRE8KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FDTE9DQUxfQU1GTEFHUyA9IEBBQ0xPQ0FMX0FNRkxBR1NACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBTV9DRkxBR1MgPSBAQU1fQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSBAQU1fQ1BQRkxBR1NACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK0VYVFJBX0RJU1QgPSBDaGFuZ2VMb2cgSU5TVEFMTCBLTk9XTkJVR1MgTkVXIFJFQURNRSBUSEFOS1MgVE9ETworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgbGludXgtbmZzL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IGxpbnV4LW5mcy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGRpciBkdmkgXAorCWR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBcCisJaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBcCisJaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIFwKKwlpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBcCisJaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL05FVyBiL25mcy11dGlscy0xLjIuMi9saW51eC1uZnMvTkVXCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjVjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL05FVwpAQCAtMCwwICsxLDMxOSBAQAorVGhpcyBpcyB0aGUgTGludXgga2VybmVsIE5GUyBkYWVtb24gMS40LjcuIEl0IGlzIGJhc2VkIG9uIGxpbnV4LW5mcworMC40LjIyLiBJdCBpcyB0ZXN0ZWQgb24gTGludXgvYWxwaGEgYW5kIExpbnV4L3g4NiBydW5uaW5nIGdsaWJjIDIuMS4xLgorCitXQVJOSU5HOiBUaGUgTkZTIHNlcnZlcnMgaW4gTGludXggMi4yIHRvIDIuMi4xMSBhcmUgbm90IGNvbXBhdGlibGUgd2l0aAorb3RoZXIgTkZTIGNsaWVudCBpbXBsZW1lbmF0aW9ucy4gSWYgeW91IHBsYW4gdG8gdXNlIExpbnV4IDIuMi54IGFzIGFuCitORlMgc2VydmVyIGZvciBub24tTGludXggTkZTIGNsaWVudHMsIHlvdSBzaG91bGQgYXBwbHkgdGhlIHBhdGNoZXMKK2VubG9zZWQgaGVyZS4KKworbGludXgtMi4yLjctc3VucnBjLnBhdGNoLCBuZnNkLTIuMi43LTIubG9ja2QucGF0Y2gsIG5mc2QtMi4yLjctMy5wYXRjaAorYW5kIG5mc2QtMi4yLjctbmZzZmgucGF0Y2ggYXJlIHJlcXVpcmVkIGZvciBMaW51eCAyLjIuNyB0byAyLjIuMTEuCitGb3Igb3RoZXIga2VybmVsIHZlcnNpb25zLCB0aGV5IGhhdmUgdG8gYmUgYXBwbGllZCBieSBoYW5kIGlmIHRoZXkgYXJlCitzdGlsbCBuZWVkZWQuCisKK0ZvciBMaW51eCAyLjIuNyB0byAyLjIuMTAsIG5mc2QtMi4yLjctMS5sb2NrLnBhdGNoIGlzIGFsc28gcmVxdWlyZWQuCisKK0kgbWFkZSBteSBrbmZzZCBwYWNrYWdlIGF2YWlsYWJsZSBvbmx5IGJlY2F1c2UgSSB1c2UgaXQgYW5kIG5vb25lIGVsc2UKK3NlZW1zIHRvIG1haW50YWluIGl0LiBCdXQgSSBkb24ndCBoYXZlIG11Y2ggdGltZSB0byByZWFsbHkgd29yayBvbiBpdC4KK0kgd2lsbCBvbmx5IGZpeCBidWdzIGluIHRoZSBORlMgdXRpbGl0aWVzIGFuZCBzZXJpb3VzIGtlcm5lbCBORlMgYnVncword2hpY2ggSSBjYW4gZHVwbGNhdGUgZWFzaWx5LiBJZiB5b3UgaGF2ZSBhbnkga2VybmVsIE5GUyBzZXJ2ZXIgcHJvYmxlbSwKK3BsZWFzZSByZXBvcnQgaXQgdG8gdGhlIExpbnV4IGtlcm5lbCBtYWlsaW5nIGxpc3QuIElmIGl0IGNhbiBiZQorcmVwcm9kdWNlZCB3aXRoIExpbnV4IE5GUyBzZXJ2ZXIgYW5kIGNsaWVudCBpbiBsZXNzIHRoYW4gNSBtaW51dGVzLCB5b3UKK2NhbiBhbHNvIHNlbmQgbWUgYSBjb3B5IGluIGFkZGl0aW9uIHRvIHNlbmRpbmcgaXQgdG8gdGhlIExpbnV4IGtlcm5lbAorbWFpbGluZyBsaXN0LiBJIG1heSB0YWtlIGEgbG9vayB3aGVuIEkgaGF2ZSB0aW1lLiBIb3dldmVyIEkgd2lsbCBjb2xsZWN0CitrZXJuZWwgTkZTIHJlbGF0ZWQgcGF0Y2hlcy4gQ29udHJpYnV0aW9ucyBhcmUgbW9yZSB0aGFuIHdlbGNvbWUuCisKK1RoZSBORlMgbG9jayBvbmx5IHdvcmtzIHdpdGggbG9ja2QuIFBsZWFzZSBtYWtlIHN1cmUgdGhlIHBvcnRtYXBwZXIsCitwb3J0bWFwLCBpcyBzdGFydGVkIGJlZm9yZSBtb3VudGluZyBORlMuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjQuNjoKKworMS4gRml4IGEgdHlwbyBpbiBrbmZzbG9jay5pbml0LgorMi4gQSBuZXcga2VybmVsIHBhdGNoLCBuZnNkLTIuMi43LTEubG9jay5wYXRjaCwgdG8gZml4IHNvbWUgTkZTIGxvY2sKKyAgIGJ1Z3MuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjQuNToKKworMS4gUmVuYW1lIC92YXIvbGliL25mcy94dGFiLmV4cG9ydCB0byAvdmFyL2xpYi9uZnMvZXRhYi4KKworQ2hhbmdlcyBmcm9tIGtuZnNkIDEuNC40OgorCisxLiBUcnkgdG8gZml4IG1vdW50ZCBwZXJmb3JtYW5jZSBwcm9ibGVtIGJ5IGludHJvZHVjaW5nCisgICAvdmFyL2xpYi9uZnMveHRhYi5leHBvcnQuIFRoYXQgaXMKKyAgIAorICBhLiAiZXhwb3J0ZnMiIHJlYWRzIGZyb20gL3Zhci9saWIvbmZzL3h0YWIgYW5kIHdyaXRlcyB0bworICAgICAvdmFyL2xpYi9uZnMveHRhYi5leHBvcnQuCisgIGIuICJtb3VudGQiIHJlYWRzIGZyb20gL3Zhci9saWIvbmZzL3h0YWIuZXhwb3J0IGFuZCB3cml0ZXMgdG8KKyAgICAgL3Zhci9saWIvbmZzL3h0YWIuCisKKyAgVGhlIGlkZWEgaXMgIm1vdW50ZCIgZG9lc24ndCBoYXZlIHRvIHJlYWQgL3Zhci9saWIvbmZzL3h0YWIsIHdoaWNoCisgIGlzIHZlcnkgZXhwZW5zaXZlLgorCitDaGFuZ2VzIGZyb20ga25mc2QgMS40LjM6CisKKzEuIG5mc2QtMi4yLjctbmZzZmgucGF0Y2gsIGEgbmV3IGtlcm5lbCBwYXRjaCBmb3IgZmlsZWhhbmRsZS4KKzIuIG5mc2QtMi4yLjctMi5sb2NrZC5wYXRjaCwgYSBuZXcgcGF0Y2ggZm9yIGxvY2tkLgorMy4gTWlzYyBidWcgZml4ZXMuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjQuMjoKKworMS4gQSBtb3VudGQgcGF0Y2ggc28gdGhhdCB0aGUgc3lzbG9nIHJlcG9ydHMgdW5rbm93biByZXF1ZXN0cywgYW5kIGFsc28KKyAgIHJlcG9ydHMgKndoYXQqIGlzIGJlaW5nICh1biltb3VudGVkLCBmcm9tIFBpZXRlIEJyb29rcworICAgPFBpZXRlLkJyb29rc0BjbC5jYW0uYWMudWs+LgorMi4gRml4IGtuZnNkLmluaXQgZm9yIHJlc3RhcnQuCiszLiBBZGQga25mc2xvY2suaW5pdC4KKzQuIGtuZnNkLWNvbXBhdC5zcGVjIGlzIHJlbW92ZWQuCis1LiBuZnNkLTIuMi43LWxvY2tkLnBhdGNoLCBhIHBhdGNoIHRvIHN0YXJ0IGxvY2tkIGluZGVwZW5kZW50IG9mCisgICBuZnMgYW5kIG5mc2QuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjQuMToKKworMS4gUmVzb2x2ZSBzeW1saW5rIGZvciB1bW91bnQgZnJvbSBQaWV0ZS5Ccm9va3NAY2wuY2FtLmFjLnVrIChQaWV0ZQorICAgQnJvb2tzKQorMi4gRml4IGtuZnNkLmluaXQgZm9yIHN0YXRkLgorCitDaGFuZ2VzIGZyb20ga25mc2QgMS40OgorCisxLiBuZnNkLTIuMi43LTMucGF0Y2guIFRoaXMgaXMgdGhlIG9ubHkgcGF0Y2ggeW91IG5lZWQgZm9yIExpbnV4IDIuMi43CisgICB0byAyLjIuMTAuCisyLiBSZW1vdmUKKwluZnNkLTIuMi41LTEucGF0Y2gKKwluZnNkLTIuMi41LTMucGF0Y2gKKwluZnNkLTIuMi44LTEucGF0Y2gKKwluZnNkLTIuMi43LWlnZXQuZGlmZgorCW5mc2QtMi4yLjUtbmZzZmguZGlmZgorCW5mc2QtMi4yLjUtZmlsZS5wYXRjaAorCW5mc2QtMi4yLjctcXVvdGEucGF0Y2gKKwluZnNkLTIuMi43LW1rbm9kLnBhdGNoCiszLiBTdGF0ZCB1cGRhdGUgYnkgSmVmZiBVcGhvZmYgPGp1cGhvZmZAdHJhbnNtZXRhLmNvbT4uCis0LiBuZXRncm91cHMgcGF0Y2ggZnJvbSBQZXRlciBCcmVpdGVubG9obmVyIDxwZWJAbXBwbXUubXBnLmRlPi4KKzUuIEFkZCBvcHRpb24gY2hlY2tpbmcgdG8gZXhwb3J0ZnMuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjMuM2I6CisKKzEuIEFkZCBsaW51eC0yLjIuNy1zdW5ycGMucGF0Y2ggZm9yIGEgU01QIGJ1ZyBpbiBzdW5ycGMuCisyLiBBZGQgLS1wb3J0Ly1QIHRvIG5mc2QvbW91bnRkLCBieSBKZWZmIEpvaG5zb24gPGpiakByZWRoYXQuY29tPi4KKzMuIEFkZCBuZnNkLjgsIG1vdW50ZC44IGFuZCBzdGF0ZC5tYW4sIGJ5IE9sYWYgS2lyY2gKKyAgIDxva2lyQG1vbmFkLnN3Yi5kZT4uCis0LiBVcGRhdGUgbmZzc3RhdC5tYW4gYnkgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+LgorNS4gU3RhdGQgZml4IGJ5IEplZmYgVXBob2ZmIDxqdXBob2ZmQHRyYW5zbWV0YS5jb20+LgorNi4gUmVtb3ZlIGtuZnNkLW5vay5wYXRjaC4KKworQ2hhbmdlcyBmcm9tIGtuZnNkIDEuMy4zYToKKworMS4gRml4IHN0ZGluL3N0ZG91dC9zdGRvdXQgaGFuZGxpbmcgaW4gbW91bnRkLgorMi4gbmZzZC0yLjIuNy1ta25vZC5wYXRjaC4gQSBwYXRjaCBmb3IgbWtub2QuCiszLiBuZnNkLTIuMi43LXF1b3RhLnBhdGNoLiBBIHBhdGNoIGZvciBxdW90YS4KKworQ2hhbmdlcyBmcm9tIGtuZnNkIDEuMy4zOgorCisxLiBGaXggaG9zdG5hbWUgbWF0Y2hpbmcgZm9yIHdpbGRjYXJkLCBzdWJuZXQgYW5kIG5ldGdyb3VwLgorCitDaGFuZ2VzIGZyb20ga25mc2QgMS4zLjI6CisKKzEuIE1vZGlmaWVkIG1vdW50ZCB0byBhbGxvdyBjbGllbnRzIHdpdGhvdXQgSVAgYWRkcmVzcyB0byBob3N0bmFtZSBtYXAuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjMuMWE6CisKKzEuIG5mc2QtMi4yLjUtMy5wYXRjaC4gVGhpcyBpcyB0aGUgb25seSBwYXRjaCB5b3UgbmVlZCBmb3IgTGludXggMi4yLjUuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjMuMToKKworMS4gQSBwYXRjaCBmb3Iga25mc2Quc3BlYyBmcm9tIE1hcmt1cyBMaW5uYWxhIDxtYWFnZUBjcy50dXQuZmk+LgorCitDaGFuZ2VzIGZyb20ga25mc2QgMS4zYToKKworMS4gbmZzZC0yLjIuOC0xLnBhdGNoLiBUaGlzIGlzIHRoZSBvbmx5IHBhdGNoIHlvdSBuZWVkIGZvciBMaW51eCAyLjIuOC4KKzIuIG5mc2QtMi4yLjctMi5wYXRjaC4gVGhpcyBpcyB0aGUgb25seSBwYXRjaCB5b3UgbmVlZCBmb3IgTGludXggMi4yLjcuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjM6CisKKzEuIEFkZGluZyAiLS1uby1uZnMtdmVyc2lvbiAzIiB0byBtb3VudGQgaW4ga25mc2QuaW5pdCBmcm9tIFJlZEhhdCA2LjAuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjIuMmE6CisKKzEuIFVwZGF0ZWQga25mc2QuaW5pdCBmcm9tIFJlZEhhdCA2LjAuCisyLiBuZnNkLTIuMi43LTEucGF0Y2guIFRoaXMgaXMgdGhlIG9ubHkgcGF0Y2ggeW91IG5lZWQgZm9yIExpbnV4IDIuMi43LgorMy4gTWlzYyB1cGRhdGVzIGZyb20gUmVkSGF0IDYuMC4KKworQ2hhbmdlcyBmcm9tIGtuZnNkIDEuMi4yOgorCisxLiBNYWtlIHRoZSBkZWZhdWx0IE5GUyBzZXJ2ZXIga2VybmVsIHRocmVhZCB0byA4IGluIHRoZSByYyBzY3JpcHQuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjI6CisKKzEuIE1vdmVkIGtuZnNkLnNwZWMgdG8ga25mc2QtY29tcGF0LnNwZWMuCisyLiBVcGRhdGUga25mc2Quc3BlYyBmcm9tIGtuZnNkLTk4MTIwNC0zLnNyYy5ycG0uCiszLiBGaXggdGhlIHNxdWFzaF9bdWddaWQgcGFyc2luZyBpbiAvZXRjL2V4cG9ydHMgZnJvbSBBbmRlcnMKKyAgIEhhbW1hcnF1aXN0IDxpa29AY2QuY2hhbG1lcnMuc2U+LgorNC4gbmZzZC0yLjIuNS1maWxlLnBhdGNoIHRvIGNsZWFyIHRoZSBib2d1cyBiaXQgZm9yIE1LRElSIGFuZCBTWU1MSU5LLgorNS4gbmZzZC0yLjIuNS0xLnBhdGNoLiBBIE5GUyBwYXRjaCBiYXNlZCBvbiBuZnNkLTIuMi4zLTEucGF0Y2ggZm9yCisgICBMaW51eCAyLjIuNS4KKworQ2hhbmdlcyBmcm9tIGtuZnNkIDEuMToKKworMS4gUmVtb3ZlCisJY2FjaGUtMi4xLjEzMS0xLnBhdGNoCisJbGludXgtMi4xLjF4eC5kaWZmCisJbG9jay0yLjEuMTMxLmRpZmYKKwlsb2NrLTIuMS4xeHguZGlmZgorCW5mc2QtMi4xLjEyNy01LnBhdGNoCisJbnVsbHByb2MtMi4xLjF4eC5kaWZmCisJcHJvY2ZzLTIuMS4xMjcucGF0Y2gKKwlxdW90YS0yLjEuMXh4LmRpZmYKKwlyb290LTIuMS4xeHguZGlmZgorCXNvY2tldC0yLjEuMXh4LmRpZmYKKwlzdW5ycGMtMi4xLjEyMy0xLnBhdGNoCisyLiBsb2Nrcy0yLjIuMy5kaWZmLiBBIHBhdGNoIGZvciBmaWxlIGxvY2suCiszLiBuZnNkLTIuMi4zLTEucGF0Y2guIEEgTkZTIHBhdGNoIGJ5ICJHLiBBbGxlbiBNb3JyaXMgSUlJIgorKGdhbTNAYWNtLm9yZykuCisKK0NoYW5nZXMgZnJvbSBrbmZzZCAxLjA6CisKKzEuIEhhbmRsZSBicm9rZW4gL3Zhci9saWIvbmZzL3JtdGFiLgorMi4gSGFuZGxlIGxvd2VyL3VwcGVyIGNhc2VzIGluIHdpbGRjYXJkIGhvc3RuYW1lcyBpbiAvZXRjL2V4cG9ydHMuCisKK0NoYW5nZXMgZnJvbSBrbmZzZC05ODEyMDQ6CisKKzEuIE1vZGlmeSBldGMvcmMubmZzZCB0byBjaGVjayAvdmFyL2xpYi9uZnMvcm10YWIgZHVyaW5nIHN0YXJ0dXAuCisyLiBBZGQga25mc2Quc3BlYyBmb3IgUmVkSGF0IDUuIE5lZWQgbmZzLXNlcnZlci0yLjJiZXRhMzctMS4xLnNyYy5ycG0KKyAgIGFuZCBpbml0c2NyaXB0cy0zLjc4LjEtMi5zcmMucnBtLgorMy4gQWRkIHN1cHBvcnQgZm9yICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIuCisKK0NoYW5nZXMgZnJvbSBrbmZzZC05ODExMjI6CisKKzEuIE1vZGlmeSBldGMvcmMubmZzZCBhbmQgZXRjL3JjLm5mc2ZzIHRvIGhhbmRsZSBzdGF0ZCBkdXJpbmcgc2h1dGRvd24uCisyLiBSZW1vdmUgbWF4aW11bSBrbmZzZCBjb3VudCBjaGVja2luZy4KKzMuIENsZWFuIHVwIG1vdW50ZC4KKzQuIGNhY2hlLTIuMS4xMzEtMS5wYXRjaCBmcm9tIEcuIEFsbGVuIE1vcnJpcyBJSUkgKGdhbTNAYWNtLm9yZykuCis1LiBsb2NrLTIuMS4xMzEuZGlmZi4gQSBuZnNkIGxvY2sgcGF0Y2ggZm9yIExpbnV4IDIuMS4xMzEuCisKK0NoYW5nZXMgZnJvbSBrbmZzZC05ODExMTM6CisKKzEuIHByb2Nmcy0yLjEuMTI3LnBhdGNoIGZyb20gRy4gQWxsZW4gTW9ycmlzIElJSSAoZ2FtM0BhY20ub3JnKS4KKzIuIE1vZGlmeSBldGMvcmMubmZzZCBhbmQgZXRjL3JjLm5mc2ZzIHRvIGJldHRlciBoYW5kbGUgc3RhdGQuCiszLiBGaXggdGhlIHN1Yi1tb3VudGVkIGRpcmVjdG9yaWVzLgorCitDaGFuZ2VzIGZyb20ga25mc2QtOTgxMDIyOgorCisxLiBGaXggYnVmZmVyIG92ZXJydW5zIGZyb20gUGV0ZXIgQmVuaWUgPHBqYjEwMDhAY3VzLmNhbS5hYy51az4uCisyLiBGaXggaG9zdG5hbWUgbWF0Y2hpbmcuCiszLiBDb3JyZWN0bHkgaGFuZGxlIGR1cGlsY2F0aW9ucyBpbiAvZXRjL2V4cG9ydHMuCis0LiBBZGQgLUYgZmxhZyB0byBzdGF0ZC4KKzUuIG5mc2QtMi4xLjEyNy01LnBhdGNoIGZyb20gRy4gQWxsZW4gTW9ycmlzIElJSSAoZ2FtM0BhY20ub3JnKS4KKworQ2hhbmdlcyBmcm9tIGtuZnNkLTk4MTAxNDoKKworMS4gbG9jay0yLjEuMXh4LmRpZmYuIEEgbmZzZCBsb2NrIHBhdGNoLgorMi4gbnVsbHByb2MtMi4xLjF4eC5kaWZmLiBBbGxvdyBhbnkgY2xpZW50cyB0byBjYWxsIHRoZSBuZnNkIE5VTEwgcHJvYy4KKzMuIEFkZCBldGMvcmMubmZzZnMgdG8gaGFuZGxlIHN0YXRkLgorMy4gVXBkYXRlIGV0Yy9yYy5uZnNkIHRvIGhhbmRsZSBzdGF0ZC4KKzQuIG5mc2QtMi4xLjEyNS0yLnBhdGNoIGZyb20gRy4gQWxsZW4gTW9ycmlzIElJSSAoZ2FtM0BhY20ub3JnKS4KKzUuIEZpeCBpbmV0X250b2EgdXNhZ2UgaW4gc3RhdGQuCisKK0NoYW5nZXMgZnJvbSBrbmZzZC05ODEwMTA6CisKKzEuIENoZWNrIGNsaWVudCBhbGlhc2VzIHdoZW4gbWF0Y2hpbmcgZm9yIHdpbGRjYXJkIGNsaWVudCBob3N0bmFtZXMuCisyLiBGaXggbWVtb3J5IGxlYWsgaW4gbW91bnRkLgorMy4gRml4IGZpbGVuYW1lIGluIG5mc2QtMi4xLjEyNS0xLnBhdGNoLgorCitDaGFuZ2VzIGZyb20ga25mc2QtOTgwOTMwOgorCisxLiBuZnNkLTIuMS4xMjUtMS5wYXRjaCBmcm9tIEcuIEFsbGVuIE1vcnJpcyBJSUkgKGdhbTNAYWNtLm9yZykgYW5kIG1lLgorMi4gRml4IHRoZSBob3N0ZW50IGJ1Z3MgaW4gbW91bnRkIGFuZCBzdGF0ZC4KKzMuIFJlbW92ZSAia2V4cG9ydGZzIC1hdSIgZm9yICJyYy5uZnNkIHN0b3AiLgorCitDaGFuZ2VzIGZyb20ga25mc2QtOTgwOTI1OgorCisxLiBzb2NrZXQtMi4xLjF4eC5kaWZmIGZvciBjcmVhdGluZyBzb2NrZXQgb24gTkZTIGNsaWVudC4KKzIuIFRoZXJlIGlzIGEga25zZmQgcm9vdF9zcXVhc2ggcGF0Y2ggZm9yIExpbnV4IDIuMS4xeHgsCisgICByb290LTIuMS4xeHguZGlmZi4gSXQgaXMgb25seSB0ZXN0ZWQgb24gbGludXggMi4xLjEyMy4KKyAgIEl0IGFsc28gZml4ZXMgdGhlIHNlcnZlciBzaWRlIDA3MTEgbW9kZSBidWcuCiszLiBzdW5ycGMtMi4xLjEyMy0xLnBhdGNoIGZyb20gQmlsbCBIYXdlcyA8d2hhd2VzQHRyYW5zbWV0YS5jb20+LgorNC4gbmZzZC0yLjEuMTIyLTMucGF0Y2ggZnJvbSBHLiBBbGxlbiBNb3JyaXMgSUlJIChnYW0zQGFjbS5vcmcpLgorNS4gVmFyaW91cyBidWZmZXIgb3ZlcnJ1biBjaGFuZ2VzLgorNi4gRml4IG1vdW50ZCB0byBjaGVjayB0aGUgZHVwbGljYXRlZCBlbnRyeSBpbiBybXRhYi4KKzcuIENoYW5nZSBleHBvcnRmcyB0byBpZ25vcmUgd2FybmluZ3MgZm9yICItciIuCis4LiBGaXggc2hvd21vdW50IC1lLgorCitDaGFuZ2VzIGZyb20ga25mc2QtOTgwOTIyOgorCisxLiBuZnNkLTIuMS4xMjEtNC5wYXRjaCBmcm9tIEcuIEFsbGVuIE1vcnJpcyBJSUkgKGdhbTNAYWNtLm9yZykuCisyLiBNYWtlIGFzeW5jIGFzIGRlZmF1bHQgZm9yIGV4cG9ydC4gSXQgbWF0Y2hlcyB0aGUgdXNlciBzcGFjZSBORlMKKyAgIHNlcnZlci4KKworQ2hhbmdlcyBmcm9tIGtuZnNkLTk4MDkyMDoKKworMS4gQWRkIE5GUyBtb3VudCB2ZXJzaW9uIGZsYWdzIHRvIG1vdW50ZC4gQ2hhbmdlIHJjLm5mc2QgdG8gZGlzYWJsZQorICAgTkZTIFYzIGZvciBtb3VudGQuCisyLiBGaXggY2xpZW50IGhvc3RuYW1lLgorMy4gcmMubmZzZCBydW5zIGtleHBvcnRmcyB3aXRoIC1yIGluc3RlYWQgb2YgLWEgZm9yIHJlc3RhcnQgYW5kIHJlbG9hZC4KKworQ2hhbmdlcyBmcm9tIGtuZnNkLTk4MDkxNToKKworMS4gVGhlcmUgaXMgYSBrbnNmZCBxdW90YSBwYXRjaCBmb3IgTGludXggMi4xLjF4eCwgcXVvdGEtMi4xLjF4eC5kaWZmLgorICAgSXQgaXMgb25seSB0ZXN0ZWQgb24gbGludXggMi4xLjEyMi4KKzIuIFRoZSBzdWJtb3VudCBwYXRobmFtZSBpcyByZW1vdmVkIGZyb20gdGhlIHh0YWIgZmlsZS4KKzMuIHJjLm5mc2QgcnVucyBrZXhwb3J0ZnMgd2l0aCAtciBpbnN0ZWFkIG9mIC1hIGZvciBzdGFydC4KKzQuIEZpeCBrc2hvd21vdW50IC1lLgorNS4gRml4IGhvc3RuYW1lIG1hdGNoaW5nLgorNi4gRml4IGNvbXBpbGluZyBvbiBsaWJjIDUuCisKK0NoYW5nZXMgZnJvbSBrbmZzZC05ODA5MTA6CisKKzEuIG5mc2QtMi4xLjEyMS0zLnBhdGNoIGZyb20gRy4gQWxsZW4gTW9ycmlzIElJSSAoZ2FtM0BhY20ub3JnKS4KKzIuIEEgbmV3IGZsYWcsIC1yLCBmb3IgZXhwb3J0ZnMuCiszLiBEb24ndCBwdXQgYW4gZW50cnkgaW4geHRhYiBpZiBrZXJuZWwgcmVqZWN0cyBpdC4KKzQuIFVzZSB0aGUgb2ZmaWNpYWwgaG9zdG5hbWUgd2hlbiBjaGVja2luZyBpZiAyIGhvc3RuYW1lcyBhcmUgdGhlIHNhbWUuCis1LiBBbGxvdyBzdWJtb3VudHMuCisKK0l0IGlzIGF2YWlsYWJsZSBhdAorCitmdHA6Ly9mdHAudmFyZXNlYXJjaC5jb20vcHViL3N1cHBvcnQvaGpsL2tuZnNkL2tuZnNkLTEuNC43LnRhci5negorZnRwOi8vZnRwLnZhcmVzZWFyY2guY29tL3B1Yi9zdXBwb3J0L2hqbC9rbmZzZC9rbmZzZC0xLjQuNi0xLjQuNy5kaWZmLmd6CitmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvZGV2ZWwvZ2NjL2tuZnNkLTEuNC43LnRhci5negorZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2RldmVsL2djYy9rbmZzZC0xLjQuNi0xLjQuNy5kaWZmLmd6CisKK1lvdSBoYXZlIHRvIGFwcGx5IHRoZSBwYXRjaCwgbG9ja3MtMi4yLjMuZGlmZiwgdG8gdGhlIExpbnV4IGtlcm5lbAorZmlyc3QuIEl0IGZpeGVzIHF1aXRlIHNvbWUgZmlsZSBsb2NrIGJ1Z3MuIFRoYXQgcGF0Y2ggaXMgYWdhaW5zdCBMaW51eAorMi4yLjMuIElmIHlvdXIga2VybmVsIGlzIGRpZmZlcmVudCwgeW91IGhhdmUgdG8gYXBwbHkgaXQgYnkgaGFuZC4KKworbmZzZC0yLjIuMy0xLnBhdGNoIGlzIGEgbmV3IGtuZnNkIHBhdGNoIGFnYWluc3QgbGludXggMi4yLjMgZnJvbQorIkcuIEFsbGVuIE1vcnJpcyBJSUkiIChnYW0zQGFjbS5vcmcpLiBJdCB3b3JrcyBmb3IgbWUgb24geDg2IGFuZCBhbHBoYS4KK0l0IGlzIG5lZWRlZCBmb3IgdGhlIG5vbmUtTGludXggTkZTIGNsaWVudHMuIFlvdSBjYW4gZ2V0IEFsbGVuJ3MKK2N1cnJlbnQgcGF0Y2ggZnJvbQorCitodHRwOi8vd3d3LkNTVUEuQmVya2VsZXkuRURVL35nYW0zL2tuZnNkLworCituZnNkLTIuMi43LTMucGF0Y2ggaXMgYmFzZWQgb24gbmZzZC0yLjIuMy0xLnBhdGNoIGZvciBMaW51eCAyLjIuNy4gSWYKK3lvdSB1c2UgTGludXggMi4yLjcsIHlvdSBzaG91bGQgYXBwbHkgbmZzZC0yLjIuNy0zLnBhdGNoIGluc3RlYWQgb2YKK25mc2QtMi4yLjMtMS5wYXRjaC4gUGxlYXNlIGRvbid0IHVzZSBhbnkgb3RoZXIgcGF0Y2hlcyBpbmNsdWRlZCBoZXJlCitmb3IgTGludXggMi4yLjcuIEZvciBvdGhlciBrZXJuZWwgdmVyc2lvbnMsIHlvdSBtYXkgaGF2ZSB0byBhcHBseSBpdAorYnkgaGFuZC4KKworbmZzZC0yLjIuNy0yLmxvY2tkLnBhdGNoIGlzIGFsc28gbmVjZXNzYXJ5IHRvIHN0YXJ0IGxvY2tkIGluZGVwZW5kZW50CitvZiBuZnMgYW5kIG5mc2QuCisKK1RvIGNvbXBpbGUsIGp1c3QgZG8KKworIyAuL2NvbmZpZ3VyZQorIyBtYWtlCisKK01ha2VmaWxlIHdpbGwgdHJ5IHRvIGRldGVybWluZSB3aGljaCBDIGxpYnJhcnkgeW91IGFyZSB1c2luZyBhbmQgY29tcGlsZQordGhpcyBwYWNrYWdlIGFjY29yZGluZ2x5LgorCisjIG1ha2UgaW5zdGFsbAorCit3aWxsIGluc3RhbGwgdGhlIGtuZnNkIGJpbmFyaWVzLiBZb3UgaGF2ZSB0byBpbnN0YWxsIGEga25mcyBzdGFydCB1cAorc2NyaXB0IGJ5IGhhbmQuIFRoZXJlIGlzIGEgbmV3IHJjLm5mc2QgaW4gZXRjLiBJIHVzZSBpdCBmb3IgYm90aCB0aGUKK3VzZXItc3BhY2UgbmZzZCBhbmQgdGhlIGtlcm5lbCBuZnNkLgorCitUaGVyZSBpcyBvbmUgUlBNIHNwZWMgZmlsZSwga25mcy5zcGVjLCB3aGljaCBpcyBmb3IgYSBMaW51eCBzeXN0ZW0KK2Jhc2VkIG9uIExpbnV4IDIuMiB3aXRob3V0IHN1cHBvcnQgZm9yIExpbnV4IDIuMC4gWW91IGFsc28gbmVlZAora25mc2QtMS40LjYudGFyLmd6IHRvIGNyZWF0ZSB0aGUga25mc2QgUlBNcy4KKworVGhhbmtzLgorCitILkouCitoamxAbHVjb24ub3JnCiswOC8xNC85OQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9SRUFETUUgYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEwYzYxCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9SRUFETUUKQEAgLTAsMCArMSw1NiBAQAorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgYSBncmVhdGx5IHJldmlzZWQgTkZTIGltcGxlbWVudGF0aW9uIGZvciBMaW51eAorYWxvbmcgd2l0aCB0aGUgbmVjZXNzYXJ5IGRhZW1vbnMgYW5kIHV0aWxpdGllcy4gVGhlcmUgYXJlIHN0aWxsIHNldmVyYWwKK2ZlYXR1cmVzIG1pc3NpbmcgdGhhdCBJJ2Qgd2FudCB0byBpbmNsdWRlLCBhbmQgdGhlcmUgYXJlIHNvbWUgcmVjZW50CitpbXByb3ZlbWVudHMgdG8gdGhlIExpbnV4IE5GUyBrZXJuZWwgY2xpZW50IG5vdCByZWZsZWN0ZWQgaGVyZSAobm90YWJseQordGhlIGF0dHJ0aW1lbyBmaXgpLgorCitUaGlzIHRoaW5nIGhhcyBiZWNvbWUgbXVjaCB0b28gbGFyZ2UgZm9yIG1lIHRvIGhhbmRsZSBhbGwgYWxvbmUgYW55bW9yZS4KK09yaWdpbmFsbHksIEkgaGFkIHBsYW5uZWQgdG8gaGF2ZSBtb3N0IG9mIHRoZSBORlMgaW1wbGVtZW50YXRpb24gcnVubmluZworc3RhYmx5IGJ5IEF1Z3VzdCwgc28gSSBjb3VsZCBzdGFydCB0byBjb25jZW50cmF0ZSBtb3JlIG9uIG90aGVyIGpvYnMgdGhhdAorYXJlIGN1cnJlbnRseSBpbiB0aGUgcXVldWUgKGxpa2UgdXBkYXRpbmcgdGhlIE5BRykuIEFzIGl0IHR1cm5lZCBvdXQsIGl0Cit3YXMgbXVjaCBtb3JlIHdvcmsgdGhhbiBJIGFudGljaXBhdGVkLCBhbmQgSSBmZWxsIHNob3J0IG9mIG15IHRpbWUgZ29hbC4KK0knbSB0aGVyZWZvcmUgbG9va2luZyBmb3Igdm9sdW50ZWVycyB3aG8gd291bGQgbGlrZSB0byB3b3JrIHdpdGggbWUgb24KK2ZpbmlzaGluZyB0aGlzIHBhY2thZ2UuIE90aGVyd2lzZSwgdGhpcyBwcm9qZWN0IGNvdWxkIGVuZCB1cCBydXN0aW5nIGluCit0aGUgY29ybmVyIG9mIHNvbWUgRlRQIHNpdGUuLi4KKworSWRlYWxseSwgSSB3b3VsZCB3YW50IHRvIGhhbmQgb3ZlciBwYXJ0cyBvZiB0aGUgc291cmNlIHRyZWUgdG8gb3RoZXIKK2hhY2tlcnMgdG8gbWFpbnRhaW4vZW5oYW5jZS9ldGMuIEJ1dCB0aGF0J3Mgbm90IGEgcmVxdWlyZW1lbnQ7IGlmIHlvdQorZmVlbCB5b3UgZG9uJ3QgaGF2ZSB0aGF0IG11Y2ggdGltZSwgeW91IGNhbiBhbHNvIGNvbnRyaWJ1dGUgYnkgcGlja2luZwordXAgb25lIG9mIHRoZSBsb29zZSBlbmRzIGFuZCBmaW5pc2ggd2hhdCBuZWVkcyB0byBiZSBkb25lICh0YWtlIGEgbG9vaworYXQgdGhlIFRPRE8gZmlsZS4uLikgQW5kIHRoZW4sIHlvdSBjYW4gYWxzbyBiZSBwbGFpbmx5IGEgdGVzdGVyLgorCitUaGVyZSdzIGN1cnJlbnRseSBhIG1haWxpbmcgbGlzdCBmb3IgbG9ja2QgZGV2ZWxvcG1lbnQgYXQgTlJBTworKGxvY2tkLXN0YXRkQGxpbnV4Lm5yYW8uZWR1IC0tLSBtYWlsIG1ham9yZG9tb0BsaW51eC5ucmFvLmVkdSB0bworc3Vic2NyaWJlKS4gSWYgSmVmZiBhZ3Jlc3MsIHdlIGNvdWxkIHR1cm4gdGhpcyBpbnRvIGEgZ2VuZXJhbCBsaW51eC1uZnMKK21haWxpbmcgbGlzdC4KKworCitIb3BlIHRoaXMgY292ZXJzIGFib3V0IHdoYXQgSSB3YW50ZWQgdG8gc2F5LAorT2xhZgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisJCQlTT1VSQ0UgVFJFRSBPVkVSVklFVworCisKKworc3VwcG9ydC8JU3VwcG9ydCBsaWJyYXJpZXMgZm9yIHVzZXItc3BhY2UgcHJvZ3JhbXMKKworc3VwcG9ydC9uZnMJR2VuZXJpYyBsaWJyYXJ5IGZvciBuZnNkIHV0aWxpdGllcworc3VwcG9ydC9leHBvcnQJTWFuaXB1bGF0aW9uIG9mIC9ldGMvZXhwb3J0cyBhbmQgL3Zhci9saWIvbmZzL3t4dGFiLHJtdGFifQorCit1dGlscy8JCUNvZGUgZm9yIHZhcmlvdXMgdXNlci1zcGFjZSBwcm9ncmFtcy4KK3V0aWxzL2V4cG9ydGZzCU1hbmFnZW1lbnQgb2YgbmZzZCBleHBvcnQgdGFibGUuCit1dGlscy9tb3VudAlNb2RpZmllZCBtb3VudCBjb21tYW5kIHRvIHN1cHBvcnQgTkZTIG92ZXIgVENQLgordXRpbHMvbW91bnRkCU5ldyBycGMubW91bnRkIGZvciBrZXJuZWwgbmZzZC4KK3V0aWxzL25mc2QJTmV3IG5mc2QgKGp1c3Qgc3RhcnRzIGtlcm5lbCBuZnNkKS4KK3V0aWxzL25mc3N0YXQJUHJldHR5LXByaW50IE5GUyBzdGF0cyBmcm9tIC9wcm9jL25ldC9ycGMvbmZzKgordXRpbHMvcnF1b3RhZAlNYXJjbyB2YW4gV2llcmluZ2VuJ3MgcnF1b3RhZAordXRpbHMvc2hvd21vdW50CVJpY2sgU2xhZGtleSdzIHNob3dtb3VudCBjbGllbnQKK3V0aWxzL3N0YXRkCUplZmYgVXBob2ZmJ3MgcnBjLnN0YXRkLgorCit0b29scy8JCVN1cHBvcnQgdG9vbHMgZm9yIGRldmVsb3BlcnMvZGVidWdnZXJzL3Rlc3RlcnMKK3Rvb2xzL3JwY2RlYnVnCVRoaXMgb25lIHNldHMvZ2V0cyB0aGUgZGVidWcgZmxhZ3MgZm9yIGVhY2ggb2YgdGhlIGtlcm5lbAorCQltb2R1bGVzLgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9USEFOS1MgYi9uZnMtdXRpbHMtMS4yLjIvbGludXgtbmZzL1RIQU5LUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE4MGRjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9USEFOS1MKQEAgLTAsMCArMSwxMCBAQAorCisJVGhpcyBwaWVjZSBvZiBzb2Z0d2FyZSBvd2VzIGEgbG90IHRvIGFsbCB0aGUgcGVvcGxlIHdobworCWhhY2tlZCBvbiBMaW51eCBORlMgYmVmb3JlIG1lLCBtb3N0IG5vdGFibHkgUmljayBTbGFka2V5CisJYW5kIERvbmFsZCBCZWNrZXIuCisKKwlJIGFsc28gd2lzaCB0byB0aGFuayBIb2xnZXIgR3JvdGhlIGZvciBsb2FuaW5nIG1lIGEgaGFyZAorCWRpc2sgYW5kIGEgbW9uaXRvciB0byBnZXQgbXkgb2xkIDQ4NiBmbHlpbmcgYWdhaW4gc28gSSBoYXZlCisJYSBkZWNlbnRpc2ggdGVzdCBwbGF0Zm9ybS4KKworCU9sYWYKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9saW51eC1uZnMvVE9ETyBiL25mcy11dGlscy0xLjIuMi9saW51eC1uZnMvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQzOWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2xpbnV4LW5mcy9UT0RPCkBAIC0wLDAgKzEsMTIxIEBACisKK1RvZG8vU3RhdHVzIExpc3QgZm9yIExpbnV4LU5GUworCisgKglkZW5vdGVzIHRvIGJlIGRvbmU7CisgbwlkZW5vdGVzIGRyYWZ0IGltcGxlbWVudGF0aW9uLCBwb3NzaWJseSBjb21tZW50ZWQgb3V0CisgLQlkZW5vdGVzIGRvbmUsCisgKwlkZW5vdGVzIGRvbmUgYW5kIHRlc3RlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JQQzoKKworICoJU2VydmVyLXNpZGUgQVVUSF9ERVMgYXV0aGVudGljYXRpb24KKworTkZTOgorCisgKglzdGF0KCkgY2FsbHMgZG9uJ3QgY2hlY2sgd2hldGhlciB0aGUgY2FjaGVkIGF0dHJzIGFyZSBzdGlsIHZhbGlkCisJKHRoaXMgaXMgYSBwcm9ibGVtIGluIHRoZSBWRlMpLgorIC0JTkZTX1JPT1Qgc3R1ZmYgbmVlZHMgZml4aW5nLgorIG8JU3dhcHBpbmcgb3ZlciBORlMuCisKKwlJc3N1ZXMgb2Ygc3dhcG91dDoKKwkgKglBdm9pZCByZWN1cnNpb24gaW4gbG93IG1lbW9yeSBzaXR1YXRpb25zIHdoZXJlCisJCWttYWxsb2MgbWF5IGNhbGwgdHJ5X3RvX3N3YXBfb3V0IGV0YyBhZCBpbmYuCisJICoJRG9uJ3QgZG8gYXN5bmMgSS9PIG9uIHN3YXAgZmlsZXMuCisKKwlGb3Igc3BlY2lhbC1jYXNpbmcgcmVsYXRlZCB0byBORlMgc3dhcCBJL08sIGZsYWcgc3dhcCBmaWxlIAorCXNlbWFudGljcyBpbiBpbm9kZS0+aV9mbGFncy4gSW4gc3dhcGZpbGUuYywgY2hhbmdlIGZ1bmN0aW9ucworCXRvIGNhbGwgcmVhZHBhZ2Uvd3JpdGVwYWdlIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHByb2NlZWQKKwlhcyB1c3VhbC4KKworIC0JV3JpdGUtYmFjayBzdXBwb3J0LgorICoJRGlzYWJsZSBwYWdlIGNhY2hlIGludmFsaWRhdGlvbi9mbHVzaGluZyBmb3IgbG9ja2VkIGZpbGUKKwlyZWdpb25zLgorIC0JRGlyZWN0b3J5IGNhY2hpbmcgKHdlIG5vdyBoYXZlIHBhZ2Utc2l6ZWQgZGlyY2FjaGUgZW50cmllcworCXdoaWNoIGNvdWxkIGVhc2lseSBiZSBvcmdhbml6ZWQgaW50byBhIGxpbmtlZCBsaXN0KS4gVGhlc2UKKwlkaXJjYWNoZSBwYWdlcyBjb21lIGFsb25nIGFzIGEgbGlua2VkIGxpc3QgdGhhdCBjYW4gYmUgY29waWVkCisJYWxtb3N0IDEtdG8tMSBpbnRvIGEgZGlyZW50IHN0cnVjdC4gSWYgdGhpcyBpcyBwdXQgaW50byB0aGUKKwlWRlMsIG90aGVyIHJlbW90ZSBmcydzIHdpbGwgYWxzbyBiZW5lZml0LgorCisJW05vdGU6IEkganVzdCBpbmNyZWFzZWQgdGhlIHJlYWRkaXIgY2FjaGUgdG8gaG9sZCBtb3JlIHRoYW4KKwlvbmUgZGlyZWN0b3J5LiBXaXRoIHRoaXMsIHRoZSBleGNsdXNpdmUgbG9jayBvbiByZWFkZGlyIGdvZXMKKwlhd2F5LCB0b28uIFdpdGggYSBsYXJnZXIgY2FjaGUsIGl0IG1heSBhbHNvIGJlIHdvcnRoIHRvIHRoaW5rCisJYWJvdXQgZGlyZWN0b3J5IHJlYWRhaGVhZC4uLl0KKyAqCUJldHRlciBsb29rdXAgY2FjaGluZz8KKyAqCVdoZW4gYSByZWFkIGxvY2sgaXMgcHJlc2VudCwgZG9uJ3QgdGltZSBvdXQgYXR0ciBjYWNoZSBvcgorCXBhZ2UgY2FjaGUgZm9yIHRoYXQgcmVnaW9uLiBMaWtld2lzZSwgaWYgYSB3cml0ZSBsb2NrIGlzIHByZXNlbnQsCisJYmUgbGF6eSBvbiB3cml0ZS1iYWNrLgorICoJSW1wbGVtZW50IENUTy4KKyAtCUJVRzogSW52YWxpZGF0ZSByZWFkZGlyIGNhY2hlIGFmdGVyIHJlbW92ZS9yZW5hbWUvdW5saW5rCisgKglBdXRvbWF0aWMgYG1vdW50aW5nJyB3aGVuIHRoZSBzZXJ2ZXIgY3Jvc3NlcyBtb3VudCBwb2ludHMKKwl0cmFuc3BhcmVudGx5IChzb21lIElSSVggbWFjaGluZXMgc2VlbSB0byBkbyB0aGlzIHdoZW4KKwl1c2luZyAtbm9oaWRlKS4KKyAqCU5GU3YzIHN1cHBvcnQuIFRoaXMgcmVxdWlyZXMgY2FyZWZ1bCBkZXNpZ24gdG8gbWF4aW1pemUKKwljb2RlIHNoYXJpbmcgYmV0d2VlbiBORlN2MiBhbmQgTkZTdjMuCisgKglNb3JlIHJvYnVzdCByZW5hbWUgaGFuZGxpbmcgKHNlZSBjb21tZW50IGJlZm9yZSBuZnNfcmVuYW1lKS4KKyAqCUFkZCBNaXF1ZWwncyBPX0VYQ0wgaGFjayBmb3IgZmlsZSBjcmVhdGlvbi4KKyAqCVBlcmZvcm1hbmNlIGltcHJvdmVtZW50OiBXaGVuIGEgY29tcGxldGUgcmVwbHkgaXMgcmVjZWl2ZWQsIGFuZAorCXRoZSAoYXN5bmMpIHRhc2sgaXMgd29rZW4gdXAsIGRvbid0IHB1dCBpdCBvbiBycGNpb2QncyBzY2hlZHVsaW5nCisJcXVldWUsIGJ1dCBhZGQgaXQgdG8gYSBgZmFzdCBzY2hlZHVsZXIgcXVldWUuJyBUaGUgZmFzdCBzY2hlZHVsZXIKKwljb3VsZCBiZSBhIHNwZWNpYWwgaGFuZGxlciB0aGF0J3MgcmVnaXN0ZXJlZCBvbiB0aGUgdHFfc2NoZWR1bGVyIHRhc2sKKwlxdWV1ZS4gVGhpcyBxdWV1ZSBpcyBmaXJlZCBieSB0aGUga2VybmVsIHNjaGVkdWxlciBhcyBzb29uIGFzCisJdGhlIG90aGVyIGJvdHRvbSBoYWx2ZXMgaGF2ZSBiZWVuIHJ1bi4KKworCU5vdGUgdGhhdCBpbXBsZW1lbnRpbmcgdGhpcyBmb3Igc3luYyB0YXNrcyBpcyBldmVuIHRyaWNraWVyIHRoYW4KKwlmb3IgYXN5bmMgdGFza3MsIGJlY2F1c2UgeW91IGhhdmUgdG8gbWFrZSBzdXJlIHlvdSBkbyB0aGUgcmlnaHQKKwl0aGluZyBpbiBycGNfc2xlZXBfb24oKS4KKyAqCXdyaXRlYmFjayBvZiB3cml0YWJsZSBtbWFwcy4gRGlydHkgcGFnZXMgYXJlIG5vdCBzdWJqZWN0IHRvCisJd3JpdGViYWNrIHNjaGVkdWxpbmcuIEFsc28sIG1zeW5jIHNob3VsZCBtYWtlIHN1cmUgcGFnZXMgYXJlCisJd3JpdHRlbiB3aXRoIE9fU1lOQyBvbi4KKworCituZnNkOgorCisgKgl1aWQvZ2lkIG1hcHBpbmcsIGFuZCBycGMudWdpZGQgc3VwcG9ydAorIC0JRG9uJ3QgcmVhZC93cml0ZSBhIGZpbGUgdGhhdCBtaWdodCBoYXZlIG1hbmRhdG9yeSBsb2Nrcy4KKyAqCUltcGxlbWVudCBzZWN1cmUva2VyYmVyb3MgZXhwb3J0IG9wdGlvbnMgKHRha2UgY2FyZSBvZiBsb2NrZAorCWZvcGVuKCkgY2FsbHMtLW1vc3QgY2xpZW50cyBzZWVtIHRvIHVzZSBOVUxMIGNyZWRzIGZvciBsb2NrZCkuCisgLQl0aGVyZSdzIGEgYnVnIGluIHJlYWRkaXIgd3J0IGxhcmdlIGRpcmVjdG9yaWVzLiBUcnkgbW91bnRpbmcKKwl0aGUgbGludXggc291cmNlIHRyZWUgYW5kIGRvIGFuIGxzIG9uIGluY2x1ZGUvbGludXguLi4KKyAqCVN1cHBvcnQgZm9yIFVOSVggc29ja2V0IGNyZWF0aW9uLgorICoJU29tZW9uZSBzaG91bGQgbG9vayBvdmVyIHRoZSBlcnJvciByZXR1cm4gY29kZXMuIEkgdGVuZCB0bworCW1peCB1cCBFUEVSTSBhbmQgRUFDQ0VTLgorICoJTkZTdjMgc3VwcG9ydC4KKyAtCVJlZnVzZSB0byBsb29rIHVwIGlub2RlcyBpbiBwcm9jZnMgKHNlY3VyaXR5IGlzc3VlcykuCisgbwlEZWxheWVkIHdyaXRlcyAoZGVsYXkgc3luY2luZyBvZiBmaWxlIGRhdGEgd2hlbiBuZnNkIGhhbmRsZXMKKwlzZXZlcmFsIHdyaXRlIHJlcXVlc3RzIGZvciB0aGUgc2FtZSBmaWxlIGNvbmN1cnJlbnRseSkuCisJKERyYWZ0IC0gc2VlIG5mc2Rfd3JpdGUgaW4gZnMvbmZzZC93cml0ZS5jLiBOZWVkcyBiZW5jaG1hcmtpbmcpLgorICoJRmFzdGVyIHJlYWQgb3BlcmF0aW9ucyAoc2luZ2xlIGNvcHkpOiBtbWFwIHRoZSBmaWxlIHJlZ2lvbgorCXRvIGJlIHJlYWQgaW50byBWTSwgYW5kIHBhc3MgdGhlIFZNQSB0byB0aGUgeGRyIHJvdXRpbmVzCisJd2hpY2ggcGFzcyB0aGUgcmVnaW9uJ3MgVk0gYWRkcmVzcyBpbnRvIHNvY2stPm9wcy0+d3JpdGVtc2cuCisJVGhpcyBjb3BpZXMgdGhlIGZpbGUgZGF0YSBkaXJlY3RseSBmcm9tIHRoZSBwYWdlIGNhY2hlIGludG8KKwl0aGUgbmV0d29yayBidWZmZXIuCisJUmVsZWFzZSB0aGUgdm1hIHJlZ2lvbiBhZnRlciBlbmNvZGluZy4KKyAqCUZhc3RlciB3cml0ZSBvcGVyYXRpb25zIChzaW5nbGUgY29weSwgd2l0aCBJUHY2IG5ldCBsYXlvdXQpOgorCUdldCB0aGUgdW5mcmFnbWVudGVkIFVEUCBkYXRhZ3JhbSwgcHVsbCB0aGUgaGVhZGVyIGFuZAorCWRvIG5vcm1hbCBwcm9jZXNzaW5nLiBUaGVuIG1tYXAgdGhlIGZpbGUsIGNvcHkgdGhlIHdyaXRlIGRhdGEsCisJYW5kIHJlbGVhc2UgVk1BLgorIC0JQ2xlYXIgc2V0dWlkL3NldGdpZCBiaXQgYWZ0ZXIgd3JpdGUoKS4KKyAqCVF1b3RhIHN1cHBvcnQuCisKK2xvY2tkOgorCisgKglTZXJ2ZXIgc2hvdWxkIHJ1biBvbiBwcml2aWxlZ2VkIHBvcnQuCisgKglUZXN0aW5nIHJlY2xhaW0gc3VwcG9ydC4KKyAqCUhQIGxvY2tkIGFjY2VwdHMgb3VyIEdSQU5UX01TRyBjYWxsYmFjayBhbmQgcGFzc2VzIG9uIHRoZSBncmFudAorCXRvIHRoZSBibG9ja2luZyBwcm9jZXNzLCBidXQgZG9lc24ndCByZXBseSB3aXRoIGEgR1JBTlRfUkVTLiAKKwlJdCdzIG5vdCBjbGVhciB0byBtZSB3aHkgaXQgd291bGQgZG8gdGhpcy4KKyAqCVVucmVnaXN0ZXIgaG9zdHMgKFNNX1VOTU9OKSB3aXRoIHJwYy5zdGF0ZCB3aGVuIGFwcHJvcHJpYXRlLgorCittb3VudGQKKworICoJVW5yZWdpc3RlciBzZXJ2aWNlIGZyb20gcG9ydG1hcHBlciB1cG9uIGV4aXQvU0lHVEVSTQorCittb3VudAorCisgKglJZiBhdmFpbGFibGUsIHVzZSB2ZXJzaW9uIDMgb2YgdGhlIG1vdW50IHByb3RvY29sIGFuZAorCW9idGFpbiBwYXRoY29uZiBkYXRhIChmaWxsIGluIGRhdGEtPmJzaXplKS4KKworZG9jdW1lbnRhdGlvbjoKKworIC0JTWFucGFnZXMgbmVlZCB0byBiZSB3cml0dGVuCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvbHRtYWluLnNoIGIvbmZzLXV0aWxzLTEuMi4yL2x0bWFpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNzJmMmZkCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL2x0bWFpbi5zaApAQCAtMCwwICsxLDg0MDYgQEAKKyMgR2VuZXJhdGVkIGZyb20gbHRtYWluLm00c2guCisKKyMgbHRtYWluLnNoIChHTlUgbGlidG9vbCkgMi4yLjZiCisjIFdyaXR0ZW4gYnkgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisKKyMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCisjIHdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCisjIEdOVSBMaWJ0b29sIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIGlmIHlvdSBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSBvciBsaWJyYXJ5IHRoYXQKKyMgaXMgYnVpbHQgdXNpbmcgR05VIExpYnRvb2wsIHlvdSBtYXkgaW5jbHVkZSB0aGlzIGZpbGUgdW5kZXIgdGhlCisjIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorIworIyBHTlUgTGlidG9vbCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggR05VIExpYnRvb2w7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCBhIGNvcHkKKyMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwsCisjIG9yIG9idGFpbmVkIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisKKyMgVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisjCisjIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIworIyAgICAgLS1jb25maWcgICAgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKKyMgICAgIC0tZGVidWcgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKKyMgLW4sIC0tZHJ5LXJ1biAgICAgICAgICAgIGRpc3BsYXkgY29tbWFuZHMgd2l0aG91dCBtb2RpZnlpbmcgYW55IGZpbGVzCisjICAgICAtLWZlYXR1cmVzICAgICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyMgICAgIC0tbW9kZT1NT0RFICAgICAgICAgIHVzZSBvcGVyYXRpb24gbW9kZSBNT0RFCisjICAgICAtLXByZXNlcnZlLWR1cC1kZXBzICBkb24ndCByZW1vdmUgZHVwbGljYXRlIGRlcGVuZGVuY3kgbGlicmFyaWVzCisjICAgICAtLXF1aWV0LCAtLXNpbGVudCAgICBkb24ndCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisjICAgICAtLXRhZz1UQUcgICAgICAgICAgICB1c2UgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgZnJvbSB0YWcgVEFHCisjIC12LCAtLXZlcmJvc2UgICAgICAgICAgICBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIChkZWZhdWx0KQorIyAgICAgLS12ZXJzaW9uICAgICAgICAgICAgcHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbgorIyAtaCwgLS1oZWxwICAgICAgICAgICAgICAgcHJpbnQgc2hvcnQgb3IgbG9uZyBoZWxwIG1lc3NhZ2UKKyMKKyMgTU9ERSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorIworIyAgICAgICBjbGVhbiAgICAgICAgICAgICAgcmVtb3ZlIGZpbGVzIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeQorIyAgICAgICBjb21waWxlICAgICAgICAgICAgY29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIG9iamVjdAorIyAgICAgICBleGVjdXRlICAgICAgICAgICAgYXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0KKyMgICAgICAgZmluaXNoICAgICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyMgICAgICAgaW5zdGFsbCAgICAgICAgICAgIGluc3RhbGwgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzCisjICAgICAgIGxpbmsgICAgICAgICAgICAgICBjcmVhdGUgYSBsaWJyYXJ5IG9yIGFuIGV4ZWN1dGFibGUKKyMgICAgICAgdW5pbnN0YWxsICAgICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisjCisjIE1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4KKyMgVHJ5IGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT1NT0RFJyBmb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuCisjCisjIFdoZW4gcmVwb3J0aW5nIGEgYnVnLCBwbGVhc2UgZGVzY3JpYmUgYSB0ZXN0IGNhc2UgdG8gcmVwcm9kdWNlIGl0IGFuZAorIyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246CisjCisjICAgICAgIGhvc3QtdHJpcGxldDoJJGhvc3QKKyMgICAgICAgc2hlbGw6CQkkU0hFTEwKKyMgICAgICAgY29tcGlsZXI6CQkkTFRDQworIyAgICAgICBjb21waWxlciBmbGFnczoJCSRMVENGTEFHUworIyAgICAgICBsaW5rZXI6CQkkTEQgKGdudT8gJHdpdGhfZ251X2xkKQorIyAgICAgICAkcHJvZ25hbWU6CQkoR05VIGxpYnRvb2wpIDIuMi42YgorIyAgICAgICBhdXRvbWFrZToJCSRhdXRvbWFrZV92ZXJzaW9uCisjICAgICAgIGF1dG9jb25mOgkJJGF1dG9jb25mX3ZlcnNpb24KKyMKKyMgUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1saWJ0b29sQGdudS5vcmc+LgorCitQUk9HUkFNPWx0bWFpbi5zaAorUEFDS0FHRT1saWJ0b29sCitWRVJTSU9OPTIuMi42YgorVElNRVNUQU1QPSIiCitwYWNrYWdlX3JldmlzaW9uPTEuMzAxNworCisjIEJlIEJvdXJuZSBjb21wYXRpYmxlCitpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZW11bGF0ZSBzaAorICBOVUxMQ01EPToKKyAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICpwb3NpeCopIHNldCAtbyBwb3NpeDs7IGVzYWMKK2ZpCitCSU5fU0g9eHBnNDsgZXhwb3J0IEJJTl9TSCAjIGZvciBUcnU2NAorRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorCisjIE5MUyBudWlzYW5jZXM6IFdlIHNhdmUgdGhlIG9sZCB2YWx1ZXMgdG8gcmVzdG9yZSBkdXJpbmcgZXhlY3V0ZSBtb2RlLgorIyBPbmx5IHNldCBMQU5HIGFuZCBMQ19BTEwgdG8gQyBpZiBhbHJlYWR5IHNldC4KKyMgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseSBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kCisjIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCitsdF91c2VyX2xvY2FsZT0KK2x0X3NhZmVfbG9jYWxlPQorZm9yIGx0X3ZhciBpbiBMQU5HIExBTkdVQUdFIExDX0FMTCBMQ19DVFlQRSBMQ19DT0xMQVRFIExDX01FU1NBR0VTCitkbworICBldmFsICJpZiB0ZXN0IFwiXCR7JGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICBzYXZlXyRsdF92YXI9XCQkbHRfdmFyCisgICAgICAgICAgJGx0X3Zhcj1DCisJICBleHBvcnQgJGx0X3ZhcgorCSAgbHRfdXNlcl9sb2NhbGU9XCIkbHRfdmFyPVxcXCRzYXZlX1wkbHRfdmFyOyBcJGx0X3VzZXJfbG9jYWxlXCIKKwkgIGx0X3NhZmVfbG9jYWxlPVwiJGx0X3Zhcj1DOyBcJGx0X3NhZmVfbG9jYWxlXCIKKwlmaSIKK2RvbmUKKworJGx0X3Vuc2V0IENEUEFUSAorCisKKworCisKKzogJHtDUD0iY3AgLWYifQorOiAke0VDSE89ImVjaG8ifQorOiAke0VHUkVQPSIvYmluL2dyZXAgLUUifQorOiAke0ZHUkVQPSIvYmluL2dyZXAgLUYifQorOiAke0dSRVA9Ii9iaW4vZ3JlcCJ9Cis6ICR7TE5fUz0ibG4gLXMifQorOiAke01BS0U9Im1ha2UifQorOiAke01LRElSPSJta2RpciJ9Cis6ICR7TVY9Im12IC1mIn0KKzogJHtSTT0icm0gLWYifQorOiAke1NFRD0iL2Jpbi9zZWQifQorOiAke1NIRUxMPSIke0NPTkZJR19TSEVMTC0vYmluL3NofSJ9Cis6ICR7WHNlZD0iJFNFRCAtZSAxcy9eWC8vIn0KKworIyBHbG9iYWwgdmFyaWFibGVzOgorRVhJVF9TVUNDRVNTPTAKK0VYSVRfRkFJTFVSRT0xCitFWElUX01JU01BVENIPTYzICAjICQ/ID0gNjMgaXMgdXNlZCB0byBpbmRpY2F0ZSB2ZXJzaW9uIG1pc21hdGNoIHRvIG1pc3NpbmcuCitFWElUX1NLSVA9NzcJICAjICQ/ID0gNzcgaXMgdXNlZCB0byBpbmRpY2F0ZSBhIHNraXBwZWQgdGVzdCB0byBhdXRvbWFrZS4KKworZXhpdF9zdGF0dXM9JEVYSVRfU1VDQ0VTUworCisjIE1ha2Ugc3VyZSBJRlMgaGFzIGEgc2Vuc2libGUgZGVmYXVsdAorbHRfbmw9JworJworSUZTPSIgCSRsdF9ubCIKKworZGlybmFtZT0icywvW14vXSokLCwiCitiYXNlbmFtZT0icyxeLiovLCwiCisKKyMgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSBmaWxlIGFwcGVuZCBub25kaXJfcmVwbGFjZW1lbnQKKyMgcGVyZm9ybSBmdW5jX2Jhc2VuYW1lIGFuZCBmdW5jX2Rpcm5hbWUgaW4gYSBzaW5nbGUgZnVuY3Rpb24KKyMgY2FsbDoKKyMgICBkaXJuYW1lOiAgQ29tcHV0ZSB0aGUgZGlybmFtZSBvZiBGSUxFLiAgSWYgbm9uZW1wdHksCisjICAgICAgICAgICAgIGFkZCBBUFBFTkQgdG8gdGhlIHJlc3VsdCwgb3RoZXJ3aXNlIHNldCByZXN1bHQKKyMgICAgICAgICAgICAgdG8gTk9ORElSX1JFUExBQ0VNRU5ULgorIyAgICAgICAgICAgICB2YWx1ZSByZXR1cm5lZCBpbiAiJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisjICAgYmFzZW5hbWU6IENvbXB1dGUgZmlsZW5hbWUgb2YgRklMRS4KKyMgICAgICAgICAgICAgdmFsdWUgcmV0dW5lZCBpbiAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorIyBJbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggZnVuY19kaXJuYW1lCisjIGFuZCBmdW5jX2Jhc2VuYW1lLiBGb3IgZWZmaWNpZW5jeSwgd2UgZG8gbm90IGRlbGVnYXRlIHRvCisjIHRob3NlIGZ1bmN0aW9ucyBidXQgaW5zdGVhZCBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgaGVyZS4KK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgKCkKK3sKKyAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKyAgZnVuY19kaXJuYW1lX3Jlc3VsdD1gJEVDSE8gIlgkezF9IiB8ICRYc2VkIC1lICIkZGlybmFtZSJgCisgIGlmIHRlc3QgIlgkZnVuY19kaXJuYW1lX3Jlc3VsdCIgPSAiWCR7MX0iOyB0aGVuCisgICAgZnVuY19kaXJuYW1lX3Jlc3VsdD0iJHszfSIKKyAgZWxzZQorICAgIGZ1bmNfZGlybmFtZV9yZXN1bHQ9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0JHsyfSIKKyAgZmkKKyAgZnVuY19iYXNlbmFtZV9yZXN1bHQ9YCRFQ0hPICJYJHsxfSIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKK30KKworIyBHZW5lcmF0ZWQgc2hlbGwgZnVuY3Rpb25zIGluc2VydGVkIGhlcmUuCisKKyMgV29yayBhcm91bmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSBvbiBJUklYIDYuNS4gT24gSVJJWCA2LjQrLCBzaAorIyBpcyBrc2ggYnV0IHdoZW4gdGhlIHNoZWxsIGlzIGludm9rZWQgYXMgInNoIiBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YKKyMgdGhlIF9YUEcgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIDEgKG9uZSksIHRoZSBzcGVjaWFsCisjIHBvc2l0aW9uYWwgcGFyYW1ldGVyICQwLCB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsLCBpcyB0aGUgbmFtZSBvZiB0aGUKKyMgZnVuY3Rpb24uCitwcm9ncGF0aD0iJDAiCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtOgorIyBJbiB0aGUgdW5saWtlbHkgZXZlbnQgJHByb2duYW1lIGJlZ2FuIHdpdGggYSAnLScsIGl0IHdvdWxkIHBsYXkgaGF2b2Mgd2l0aAorIyBmdW5jX2VjaG8gKGltYWdpbmUgcHJvZ25hbWU9LW4pLCBzbyB3ZSBwcmVwZW5kIC4vIGluIHRoYXQgY2FzZToKK2Z1bmNfZGlybmFtZV9hbmRfYmFzZW5hbWUgIiRwcm9ncGF0aCIKK3Byb2duYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorY2FzZSAkcHJvZ25hbWUgaW4KKyAgLSopIHByb2duYW1lPS4vJHByb2duYW1lIDs7Citlc2FjCisKKyMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBmb3IgcmVleGVjdXRpb246CitjYXNlICRwcm9ncGF0aCBpbgorICBbXFwvXSp8W0EtWmEtel06XFwqKSA7OworICAqW1xcL10qKQorICAgICBwcm9nZGlyPSRmdW5jX2Rpcm5hbWVfcmVzdWx0CisgICAgIHByb2dkaXI9YGNkICIkcHJvZ2RpciIgJiYgcHdkYAorICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgorICAgICA7OworICAqKQorICAgICBzYXZlX0lGUz0iJElGUyIKKyAgICAgSUZTPToKKyAgICAgZm9yIHByb2dkaXIgaW4gJFBBVEg7IGRvCisgICAgICAgSUZTPSIkc2F2ZV9JRlMiCisgICAgICAgdGVzdCAteCAiJHByb2dkaXIvJHByb2duYW1lIiAmJiBicmVhaworICAgICBkb25lCisgICAgIElGUz0iJHNhdmVfSUZTIgorICAgICB0ZXN0IC1uICIkcHJvZ2RpciIgfHwgcHJvZ2Rpcj1gcHdkYAorICAgICBwcm9ncGF0aD0iJHByb2dkaXIvJHByb2duYW1lIgorICAgICA7OworZXNhYworCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0iJHtTRUR9IicgLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtgIiRcXF1cKS9cXFwxL2cnCisKKyMgU2FtZSBhcyBhYm92ZSwgYnV0IGRvIG5vdCBxdW90ZSB2YXJpYWJsZSByZWZlcmVuY2VzLgorZG91YmxlX3F1b3RlX3N1YnN0PSdzL1woWyJgXFxdXCkvXFxcMS9nJworCisjIFJlLWBcJyBwYXJhbWV0ZXIgZXhwYW5zaW9ucyBpbiBvdXRwdXQgb2YgZG91YmxlX3F1b3RlX3N1YnN0IHRoYXQgd2VyZQorIyBgXCctZWQgaW4gaW5wdXQgdG8gdGhlIHNhbWUuICBJZiBhbiBvZGQgbnVtYmVyIG9mIGBcJyBwcmVjZWRlZCBhICckJworIyBpbiBpbnB1dCB0byBkb3VibGVfcXVvdGVfc3Vic3QsIHRoYXQgJyQnIHdhcyBwcm90ZWN0ZWQgZnJvbSBleHBhbnNpb24uCisjIFNpbmNlIGVhY2ggaW5wdXQgYFwnIGlzIG5vdyB0d28gYFwncywgbG9vayBmb3IgYW55IG51bWJlciBvZiBydW5zIG9mCisjIGZvdXIgYFwncyBmb2xsb3dlZCBieSB0d28gYFwncyBhbmQgdGhlbiBhICckJy4gIGBcJyB0aGF0ICckJy4KK2JzPSdcXCcKK2JzMj0nXFxcXCcKK2JzND0nXFxcXFxcXFwnCitkb2xsYXI9J1wkJworc2VkX2RvdWJsZV9iYWNrc2xhc2g9IlwKKyAgcy8kYnM0LyZcXAorL2cKKyAgcy9eJGJzMiRkb2xsYXIvJGJzJi8KKyAgcy9cXChbXiRic11cXCkkYnMyJGRvbGxhci9cXDEkYnMyJGJzJGRvbGxhci9nCisgIHMvXG4vL2ciCisKKyMgU3RhbmRhcmQgb3B0aW9uczoKK29wdF9kcnlfcnVuPWZhbHNlCitvcHRfaGVscD1mYWxzZQorb3B0X3F1aWV0PWZhbHNlCitvcHRfdmVyYm9zZT1mYWxzZQorb3B0X3dhcm5pbmc9OgorCisjIGZ1bmNfZWNobyBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSwgYWxvbmcgd2l0aCB0aGUgY3VycmVudCBtb2RlCisjIG5hbWUgaWYgaXQgaGFzIGJlZW4gc2V0IHlldC4KK2Z1bmNfZWNobyAoKQoreworICAgICRFQ0hPICIkcHJvZ25hbWUke21vZGUrOiB9JG1vZGU6ICQqIgorfQorCisjIGZ1bmNfdmVyYm9zZSBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSBpbiB2ZXJib3NlIG1vZGUgb25seS4KK2Z1bmNfdmVyYm9zZSAoKQoreworICAgICRvcHRfdmVyYm9zZSAmJiBmdW5jX2VjaG8gJHsxKyIkQCJ9CisKKyAgICAjIEEgYnVnIGluIGJhc2ggaGFsdHMgdGhlIHNjcmlwdCBpZiB0aGUgbGFzdCBsaW5lIG9mIGEgZnVuY3Rpb24KKyAgICAjIGZhaWxzIHdoZW4gc2V0IC1lIGlzIGluIGZvcmNlLCBzbyB3ZSBuZWVkIGFub3RoZXIgY29tbWFuZCB0bworICAgICMgd29yayBhcm91bmQgdGhhdDoKKyAgICA6Cit9CisKKyMgZnVuY19lcnJvciBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KK2Z1bmNfZXJyb3IgKCkKK3sKKyAgICAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiAiJHsxKyIkQCJ9IDE+JjIKK30KKworIyBmdW5jX3dhcm5pbmcgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIHdhcm5pbmcgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KK2Z1bmNfd2FybmluZyAoKQoreworICAgICRvcHRfd2FybmluZyAmJiAkRUNITyAiJHByb2duYW1lJHttb2RlKzogfSRtb2RlOiB3YXJuaW5nOiAiJHsxKyIkQCJ9IDE+JjIKKworICAgICMgYmFzaCBidWcgYWdhaW46CisgICAgOgorfQorCisjIGZ1bmNfZmF0YWxfZXJyb3IgYXJnLi4uCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IsIGFuZCBleGl0LgorZnVuY19mYXRhbF9lcnJvciAoKQoreworICAgIGZ1bmNfZXJyb3IgJHsxKyIkQCJ9CisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCit9CisKKyMgZnVuY19mYXRhbF9oZWxwIGFyZy4uLgorIyBFY2hvIHByb2dyYW0gbmFtZSBwcmVmaXhlZCBtZXNzYWdlIHRvIHN0YW5kYXJkIGVycm9yLCBmb2xsb3dlZCBieQorIyBhIGhlbHAgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2hlbHAgKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZmF0YWxfZXJyb3IgIiRoZWxwIgorfQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAgIyMgZGVmYXVsdAorCisKKyMgZnVuY19ncmVwIGV4cHJlc3Npb24gZmlsZW5hbWUKKyMgQ2hlY2sgd2hldGhlciBFWFBSRVNTSU9OIG1hdGNoZXMgYW55IGxpbmUgb2YgRklMRU5BTUUsIHdpdGhvdXQgb3V0cHV0LgorZnVuY19ncmVwICgpCit7CisgICAgJEdSRVAgIiQxIiAiJDIiID4vZGV2L251bGwgMj4mMQorfQorCisKKyMgZnVuY19ta2Rpcl9wIGRpcmVjdG9yeS1wYXRoCisjIE1ha2Ugc3VyZSB0aGUgZW50aXJlIHBhdGggdG8gRElSRUNUT1JZLVBBVEggaXMgYXZhaWxhYmxlLgorZnVuY19ta2Rpcl9wICgpCit7CisgICAgbXlfZGlyZWN0b3J5X3BhdGg9IiQxIgorICAgIG15X2Rpcl9saXN0PQorCisgICAgaWYgdGVzdCAtbiAiJG15X2RpcmVjdG9yeV9wYXRoIiAmJiB0ZXN0ICIkb3B0X2RyeV9ydW4iICE9ICI6IjsgdGhlbgorCisgICAgICAjIFByb3RlY3QgZGlyZWN0b3J5IG5hbWVzIHN0YXJ0aW5nIHdpdGggYC0nCisgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbgorICAgICAgICAtKikgbXlfZGlyZWN0b3J5X3BhdGg9Ii4vJG15X2RpcmVjdG9yeV9wYXRoIiA7OworICAgICAgZXNhYworCisgICAgICAjIFdoaWxlIHNvbWUgcG9ydGlvbiBvZiBESVIgZG9lcyBub3QgeWV0IGV4aXN0Li4uCisgICAgICB3aGlsZSB0ZXN0ICEgLWQgIiRteV9kaXJlY3RvcnlfcGF0aCI7IGRvCisgICAgICAgICMgLi4ubWFrZSBhIGxpc3QgaW4gdG9wbW9zdCBmaXJzdCBvcmRlci4gIFVzZSBhIGNvbG9uIGRlbGltaXRlZAorCSMgbGlzdCBpbmNhc2Ugc29tZSBwb3J0aW9uIG9mIHBhdGggY29udGFpbnMgd2hpdGVzcGFjZS4KKyAgICAgICAgbXlfZGlyX2xpc3Q9IiRteV9kaXJlY3RvcnlfcGF0aDokbXlfZGlyX2xpc3QiCisKKyAgICAgICAgIyBJZiB0aGUgbGFzdCBwb3J0aW9uIGFkZGVkIGhhcyBubyBzbGFzaCBpbiBpdCwgdGhlIGxpc3QgaXMgZG9uZQorICAgICAgICBjYXNlICRteV9kaXJlY3RvcnlfcGF0aCBpbiAqLyopIDs7ICopIGJyZWFrIDs7IGVzYWMKKworICAgICAgICAjIC4uLm90aGVyd2lzZSB0aHJvdyBhd2F5IHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kIGxvb3AKKyAgICAgICAgbXlfZGlyZWN0b3J5X3BhdGg9YCRFQ0hPICJYJG15X2RpcmVjdG9yeV9wYXRoIiB8ICRYc2VkIC1lICIkZGlybmFtZSJgCisgICAgICBkb25lCisgICAgICBteV9kaXJfbGlzdD1gJEVDSE8gIlgkbXlfZGlyX2xpc3QiIHwgJFhzZWQgLWUgJ3MsOiokLCwnYAorCisgICAgICBzYXZlX21rZGlyX3BfSUZTPSIkSUZTIjsgSUZTPSc6JworICAgICAgZm9yIG15X2RpciBpbiAkbXlfZGlyX2xpc3Q7IGRvCisJSUZTPSIkc2F2ZV9ta2Rpcl9wX0lGUyIKKyAgICAgICAgIyBta2RpciBjYW4gZmFpbCB3aXRoIGEgYEZpbGUgZXhpc3QnIGVycm9yIGlmIHR3byBwcm9jZXNzZXMKKyAgICAgICAgIyB0cnkgdG8gY3JlYXRlIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMgY29uY3VycmVudGx5LiAgRG9uJ3QKKyAgICAgICAgIyBzdG9wIGluIHRoYXQgY2FzZSEKKyAgICAgICAgJE1LRElSICIkbXlfZGlyIiAyPi9kZXYvbnVsbCB8fCA6CisgICAgICBkb25lCisgICAgICBJRlM9IiRzYXZlX21rZGlyX3BfSUZTIgorCisgICAgICAjIEJhaWwgb3V0IGlmIHdlIChvciBzb21lIG90aGVyIHByb2Nlc3MpIGZhaWxlZCB0byBjcmVhdGUgYSBkaXJlY3RvcnkuCisgICAgICB0ZXN0IC1kICIkbXlfZGlyZWN0b3J5X3BhdGgiIHx8IFwKKyAgICAgICAgZnVuY19mYXRhbF9lcnJvciAiRmFpbGVkIHRvIGNyZWF0ZSBcYCQxJyIKKyAgICBmaQorfQorCisKKyMgZnVuY19ta3RlbXBkaXIgW3N0cmluZ10KKyMgTWFrZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3b24ndCBjbGFzaCB3aXRoIG90aGVyIHJ1bm5pbmcKKyMgbGlidG9vbCBwcm9jZXNzZXMsIGFuZCBhdm9pZHMgcmFjZSBjb25kaXRpb25zIGlmIHBvc3NpYmxlLiAgSWYKKyMgZ2l2ZW4sIFNUUklORyBpcyB0aGUgYmFzZW5hbWUgZm9yIHRoYXQgZGlyZWN0b3J5LgorZnVuY19ta3RlbXBkaXIgKCkKK3sKKyAgICBteV90ZW1wbGF0ZT0iJHtUTVBESVItL3RtcH0vJHsxLSRwcm9nbmFtZX0iCisKKyAgICBpZiB0ZXN0ICIkb3B0X2RyeV9ydW4iID0gIjoiOyB0aGVuCisgICAgICAjIFJldHVybiBhIGRpcmVjdG9yeSBuYW1lLCBidXQgZG9uJ3QgY3JlYXRlIGl0IGluIGRyeS1ydW4gbW9kZQorICAgICAgbXlfdG1wZGlyPSIke215X3RlbXBsYXRlfS0kJCIKKyAgICBlbHNlCisKKyAgICAgICMgSWYgbWt0ZW1wIHdvcmtzLCB1c2UgdGhhdCBmaXJzdCBhbmQgZm9yZW1vc3QKKyAgICAgIG15X3RtcGRpcj1gbWt0ZW1wIC1kICIke215X3RlbXBsYXRlfS1YWFhYWFhYWCIgMj4vZGV2L251bGxgCisKKyAgICAgIGlmIHRlc3QgISAtZCAiJG15X3RtcGRpciI7IHRoZW4KKyAgICAgICAgIyBGYWlsaW5nIHRoYXQsIGF0IGxlYXN0IHRyeSBhbmQgdXNlICRSQU5ET00gdG8gYXZvaWQgYSByYWNlCisgICAgICAgIG15X3RtcGRpcj0iJHtteV90ZW1wbGF0ZX0tJHtSQU5ET00tMH0kJCIKKworICAgICAgICBzYXZlX21rdGVtcGRpcl91bWFzaz1gdW1hc2tgCisgICAgICAgIHVtYXNrIDAwNzcKKyAgICAgICAgJE1LRElSICIkbXlfdG1wZGlyIgorICAgICAgICB1bWFzayAkc2F2ZV9ta3RlbXBkaXJfdW1hc2sKKyAgICAgIGZpCisKKyAgICAgICMgSWYgd2UncmUgbm90IGluIGRyeS1ydW4gbW9kZSwgYm9tYiBvdXQgb24gZmFpbHVyZQorICAgICAgdGVzdCAtZCAiJG15X3RtcGRpciIgfHwgXAorICAgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgXGAkbXlfdG1wZGlyJyIKKyAgICBmaQorCisgICAgJEVDSE8gIlgkbXlfdG1wZGlyIiB8ICRYc2VkCit9CisKKworIyBmdW5jX3F1b3RlX2Zvcl9ldmFsIGFyZworIyBBZXN0aGV0aWNhbGx5IHF1b3RlIEFSRyB0byBiZSBldmFsZWQgbGF0ZXIuCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzOiBGVU5DX1FVT1RFX0ZPUl9FVkFMX1JFU1VMVAorIyBpcyBkb3VibGUtcXVvdGVkLCBzdWl0YWJsZSBmb3IgYSBzdWJzZXF1ZW50IGV2YWwsIHdoZXJlYXMKKyMgRlVOQ19RVU9URV9GT1JfRVZBTF9VTlFVT1RFRF9SRVNVTFQgaGFzIG1lcmVseSBhbGwgY2hhcmFjdGVycworIyB3aGljaCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUgcXVvdGVzIGJhY2tzbGFzaGlmaWVkLgorZnVuY19xdW90ZV9mb3JfZXZhbCAoKQoreworICAgIGNhc2UgJDEgaW4KKyAgICAgICpbXFxcYFwiXCRdKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD1gJEVDSE8gIlgkMSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdD0iJDEiIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkZnVuY19xdW90ZV9mb3JfZXZhbF91bnF1b3RlZF9yZXN1bHQgaW4KKyAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycyB0byBkZWxheQorICAgICAgIyB3b3JkIHNwbGl0dGluZywgY29tbWFuZCBzdWJzdGl0dXRpb24gYW5kIGFuZCB2YXJpYWJsZQorICAgICAgIyBleHBhbnNpb24gZm9yIGEgc3Vic2VxdWVudCBldmFsLgorICAgICAgIyBNYW55IEJvdXJuZSBzaGVsbHMgY2Fubm90IGhhbmRsZSBjbG9zZSBicmFja2V0cyBjb3JyZWN0bHkKKyAgICAgICMgaW4gc2NhbiBzZXRzLCBzbyB3ZSBzcGVjaWZ5IGl0IHNlcGFyYXRlbHkuCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKnwiIikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ9IlwiJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0XCIiCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdD0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfdW5xdW90ZWRfcmVzdWx0IgorICAgIGVzYWMKK30KKworCisjIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCBhcmcKKyMgQWVzdGhldGljYWxseSBxdW90ZSBBUkcgdG8gYmUgZXZhbGVkIGxhdGVyOyBzYW1lIGFzIGFib3ZlLAorIyBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitmdW5jX3F1b3RlX2Zvcl9leHBhbmQgKCkKK3sKKyAgICBjYXNlICQxIGluCisgICAgICAqW1xcXGBcIl0qKQorCW15X2FyZz1gJEVDSE8gIlgkMSIgfCAkWHNlZCBcCisJICAgIC1lICIkZG91YmxlX3F1b3RlX3N1YnN0IiAtZSAiJHNlZF9kb3VibGVfYmFja3NsYXNoImAgOzsKKyAgICAgICopCisgICAgICAgIG15X2FyZz0iJDEiIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkbXlfYXJnIGluCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMgdG8gZGVsYXkKKyAgICAgICMgd29yZCBzcGxpdHRpbmcgYW5kIGNvbW1hbmQgc3Vic3RpdHV0aW9uIGZvciBhIHN1YnNlcXVlbnQgZXZhbC4KKyAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5CisgICAgICAjIGluIHNjYW4gc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSp8IiIpCisgICAgICAgIG15X2FyZz0iXCIkbXlfYXJnXCIiCisgICAgICAgIDs7CisgICAgZXNhYworCisgICAgZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdD0iJG15X2FyZyIKK30KKworCisjIGZ1bmNfc2hvd19ldmFsIGNtZCBbZmFpbF9leHBdCisjIFVubGVzcyBvcHRfc2lsZW50IGlzIHRydWUsIHRoZW4gb3V0cHV0IENNRC4gIFRoZW4sIGlmIG9wdF9kcnlydW4gaXMKKyMgbm90IHRydWUsIGV2YWx1YXRlIENNRC4gIElmIHRoZSBldmFsdWF0aW9uIG9mIENNRCBmYWlscywgYW5kIEZBSUxfRVhQCisjIGlzIGdpdmVuLCB0aGVuIGV2YWx1YXRlIGl0LgorZnVuY19zaG93X2V2YWwgKCkKK3sKKyAgICBteV9jbWQ9IiQxIgorICAgIG15X2ZhaWxfZXhwPSIkezItOn0iCisKKyAgICAke29wdF9zaWxlbnQtZmFsc2V9IHx8IHsKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJG15X2NtZCIKKyAgICAgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKyAgICB9CisKKyAgICBpZiAke29wdF9kcnlfcnVuLWZhbHNlfTsgdGhlbiA6OyBlbHNlCisgICAgICBldmFsICIkbXlfY21kIgorICAgICAgbXlfc3RhdHVzPSQ/CisgICAgICBpZiB0ZXN0ICIkbXlfc3RhdHVzIiAtZXEgMDsgdGhlbiA6OyBlbHNlCisJZXZhbCAiKGV4aXQgJG15X3N0YXR1cyk7ICRteV9mYWlsX2V4cCIKKyAgICAgIGZpCisgICAgZmkKK30KKworCisjIGZ1bmNfc2hvd19ldmFsX2xvY2FsZSBjbWQgW2ZhaWxfZXhwXQorIyBVbmxlc3Mgb3B0X3NpbGVudCBpcyB0cnVlLCB0aGVuIG91dHB1dCBDTUQuICBUaGVuLCBpZiBvcHRfZHJ5cnVuIGlzCisjIG5vdCB0cnVlLCBldmFsdWF0ZSBDTUQuICBJZiB0aGUgZXZhbHVhdGlvbiBvZiBDTUQgZmFpbHMsIGFuZCBGQUlMX0VYUAorIyBpcyBnaXZlbiwgdGhlbiBldmFsdWF0ZSBpdC4gIFVzZSB0aGUgc2F2ZWQgbG9jYWxlIGZvciBldmFsdWF0aW9uLgorZnVuY19zaG93X2V2YWxfbG9jYWxlICgpCit7CisgICAgbXlfY21kPSIkMSIKKyAgICBteV9mYWlsX2V4cD0iJHsyLTp9IgorCisgICAgJHtvcHRfc2lsZW50LWZhbHNlfSB8fCB7CisgICAgICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRteV9jbWQiCisgICAgICBldmFsICJmdW5jX2VjaG8gJGZ1bmNfcXVvdGVfZm9yX2V4cGFuZF9yZXN1bHQiCisgICAgfQorCisgICAgaWYgJHtvcHRfZHJ5X3J1bi1mYWxzZX07IHRoZW4gOjsgZWxzZQorICAgICAgZXZhbCAiJGx0X3VzZXJfbG9jYWxlCisJICAgICRteV9jbWQiCisgICAgICBteV9zdGF0dXM9JD8KKyAgICAgIGV2YWwgIiRsdF9zYWZlX2xvY2FsZSIKKyAgICAgIGlmIHRlc3QgIiRteV9zdGF0dXMiIC1lcSAwOyB0aGVuIDo7IGVsc2UKKwlldmFsICIoZXhpdCAkbXlfc3RhdHVzKTsgJG15X2ZhaWxfZXhwIgorICAgICAgZmkKKyAgICBmaQorfQorCisKKworCisKKyMgZnVuY192ZXJzaW9uCisjIEVjaG8gdmVyc2lvbiBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfdmVyc2lvbiAoKQoreworICAgICRTRUQgLW4gJy9eIyAnJFBST0dSQU0nIChHTlUgLywvIyB3YXJyYW50eTsgLyB7CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKyAgICAgICAgcy9cKChDKVwpWyAwLTksLV0qXCggWzEtOV1bMC05XSpcKS9cMVwyLworICAgICAgICBwCisgICAgIH0nIDwgIiRwcm9ncGF0aCIKKyAgICAgZXhpdCAkPworfQorCisjIGZ1bmNfdXNhZ2UKKyMgRWNobyBzaG9ydCBoZWxwIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgorZnVuY191c2FnZSAoKQoreworICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIC1oLyB7CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKwlzL1wkcHJvZ25hbWUvJyRwcm9nbmFtZScvCisJcAorICAgIH0nIDwgIiRwcm9ncGF0aCIKKyAgICAkRUNITworICAgICRFQ0hPICJydW4gXGAkcHJvZ25hbWUgLS1oZWxwIHwgbW9yZScgZm9yIGZ1bGwgdXNhZ2UiCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfaGVscAorIyBFY2hvIGxvbmcgaGVscCBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KK2Z1bmNfaGVscCAoKQoreworICAgICRTRUQgLW4gJy9eIyBVc2FnZTovLC8jIFJlcG9ydCBidWdzIHRvLyB7CisgICAgICAgIHMvXiMgLy8KKwlzL14jICokLy8KKwlzKlwkcHJvZ25hbWUqJyRwcm9nbmFtZScqCisJcypcJGhvc3QqJyIkaG9zdCInKgorCXMqXCRTSEVMTConIiRTSEVMTCInKgorCXMqXCRMVENDKiciJExUQ0MiJyoKKwlzKlwkTFRDRkxBR1MqJyIkTFRDRkxBR1MiJyoKKwlzKlwkTEQqJyIkTEQiJyoKKwlzL1wkd2l0aF9nbnVfbGQvJyIkd2l0aF9nbnVfbGQiJy8KKwlzL1wkYXV0b21ha2VfdmVyc2lvbi8nImAoYXV0b21ha2UgLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlzL1wkYXV0b2NvbmZfdmVyc2lvbi8nImAoYXV0b2NvbmYgLS12ZXJzaW9uKSAyPi9kZXYvbnVsbCB8JFNFRCAxcWAiJy8KKwlwCisgICAgIH0nIDwgIiRwcm9ncGF0aCIKKyAgICBleGl0ICQ/Cit9CisKKyMgZnVuY19taXNzaW5nX2FyZyBhcmduYW1lCisjIEVjaG8gcHJvZ3JhbSBuYW1lIHByZWZpeGVkIG1lc3NhZ2UgdG8gc3RhbmRhcmQgZXJyb3IgYW5kIHNldCBnbG9iYWwKKyMgZXhpdF9jbWQuCitmdW5jX21pc3NpbmdfYXJnICgpCit7CisgICAgZnVuY19lcnJvciAibWlzc2luZyBhcmd1bWVudCBmb3IgJDEiCisgICAgZXhpdF9jbWQ9ZXhpdAorfQorCitleGl0X2NtZD06CisKKworCisKKworIyBDaGVjayB0aGF0IHdlIGhhdmUgYSB3b3JraW5nICRFQ0hPLgoraWYgdGVzdCAiWCQxIiA9IFgtLW5vLXJlZXhlYzsgdGhlbgorICAjIERpc2NhcmQgdGhlIC0tbm8tcmVleGVjIGZsYWcsIGFuZCBjb250aW51ZS4KKyAgc2hpZnQKK2VsaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyBBdm9pZCBpbmxpbmUgZG9jdW1lbnQgaGVyZSwgaXQgbWF5IGJlIGxlZnQgb3ZlcgorICA6CitlbGlmIHRlc3QgIlhgeyAkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbgorICAjIFlpcHBlZSwgJEVDSE8gd29ya3MhCisgIDoKK2Vsc2UKKyAgIyBSZXN0YXJ0IHVuZGVyIHRoZSBjb3JyZWN0IHNoZWxsLCBhbmQgdGhlbiBtYXliZSAkRUNITyB3aWxsIHdvcmsuCisgIGV4ZWMgJFNIRUxMICIkcHJvZ3BhdGgiIC0tbm8tcmVleGVjICR7MSsiJEAifQorZmkKKworaWYgdGVzdCAiWCQxIiA9IFgtLWZhbGxiYWNrLWVjaG87IHRoZW4KKyAgIyB1c2VkIGFzIGZhbGxiYWNrIGVjaG8KKyAgc2hpZnQKKyAgY2F0IDw8RU9GCiskKgorRU9GCisgIGV4aXQgJEVYSVRfU1VDQ0VTUworZmkKKworbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWFnaWNfZXhlPSIlJSVNQUdJQyBFWEUgdmFyaWFibGUlJSUiCisKKyMgR2xvYmFsIHZhcmlhYmxlcy4KKyMgJG1vZGUgaXMgdW5zZXQKK25vbm9wdD0KK2V4ZWN1dGVfZGxmaWxlcz0KK3ByZXNlcnZlX2FyZ3M9CitsbzJvPSJzL1xcLmxvXCQvLiR7b2JqZXh0fS8iCitvMmxvPSJzL1xcLiR7b2JqZXh0fVwkLy5sby8iCitleHRyYWN0ZWRfYXJjaGl2ZXM9CitleHRyYWN0ZWRfc2VyaWFsPTAKKworb3B0X2RyeV9ydW49ZmFsc2UKK29wdF9kdXBsaWNhdGVfZGVwcz1mYWxzZQorb3B0X3NpbGVudD1mYWxzZQorb3B0X2RlYnVnPToKKworIyBJZiB0aGlzIHZhcmlhYmxlIGlzIHNldCBpbiBhbnkgb2YgdGhlIGFjdGlvbnMsIHRoZSBjb21tYW5kIGluIGl0CisjIHdpbGwgYmUgZXhlY2VkIGF0IHRoZSBlbmQuICBUaGlzIHByZXZlbnRzIGhlcmUtZG9jdW1lbnRzIGZyb20gYmVpbmcKKyMgbGVmdCBvdmVyIGJ5IHNoZWxscy4KK2V4ZWNfY21kPQorCisjIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiBhcmcuLi4KKyMgRWNobyBwcm9ncmFtIG5hbWUgcHJlZml4ZWQgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkKKyMgYSBjb25maWd1cmF0aW9uIGZhaWx1cmUgaGludCwgYW5kIGV4aXQuCitmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gKCkKK3sKKyAgICBmdW5jX2Vycm9yICR7MSsiJEAifQorICAgIGZ1bmNfZXJyb3IgIlNlZSB0aGUgJFBBQ0tBR0UgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCisgICAgZnVuY19mYXRhbF9lcnJvciAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4iCit9CisKKworIyBmdW5jX2NvbmZpZworIyBEaXNwbGF5IHRoZSBjb25maWd1cmF0aW9uIGZvciBhbGwgdGhlIHRhZ3MgaW4gdGhpcyBzY3JpcHQuCitmdW5jX2NvbmZpZyAoKQoreworICAgIHJlX2JlZ2luY2Y9J14jICMjIyBCRUdJTiBMSUJUT09MJworICAgIHJlX2VuZGNmPSdeIyAjIyMgRU5EIExJQlRPT0wnCisKKyAgICAjIERlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAkU0VEICIxLC8kcmVfYmVnaW5jZiBDT05GSUcvZDsvJHJlX2VuZGNmIENPTkZJRy8sXCRkIiA8ICIkcHJvZ3BhdGgiCisKKyAgICAjIE5vdyBwcmludCB0aGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSB0YWdzLgorICAgIGZvciB0YWduYW1lIGluICR0YWdsaXN0OyBkbworICAgICAgJFNFRCAtbiAiLyRyZV9iZWdpbmNmIFRBRyBDT05GSUc6ICR0YWduYW1lXCQvLC8kcmVfZW5kY2YgVEFHIENPTkZJRzogJHRhZ25hbWVcJC9wIiA8ICIkcHJvZ3BhdGgiCisgICAgZG9uZQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZmVhdHVyZXMKKyMgRGlzcGxheSB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0LgorZnVuY19mZWF0dXJlcyAoKQoreworICAgICRFQ0hPICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJEVDSE8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGVsc2UKKyAgICAgICRFQ0hPICJkaXNhYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAkRUNITyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgJEVDSE8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKKyAgICBmaQorCisgICAgZXhpdCAkPworfQorCisjIGZ1bmNfZW5hYmxlX3RhZyB0YWduYW1lCisjIFZlcmlmeSB0aGF0IFRBR05BTUUgaXMgdmFsaWQsIGFuZCBlaXRoZXIgZmxhZyBhbiBlcnJvciBhbmQgZXhpdCwgb3IKKyMgZW5hYmxlIHRoZSBUQUdOQU1FIHRhZy4gIFdlIGFsc28gYWRkIFRBR05BTUUgdG8gdGhlIGdsb2JhbCAkdGFnbGlzdAorIyB2YXJpYWJsZSBoZXJlLgorZnVuY19lbmFibGVfdGFnICgpCit7CisgICMgR2xvYmFsIHZhcmlhYmxlOgorICB0YWduYW1lPSIkMSIKKworICByZV9iZWdpbmNmPSJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkdGFnbmFtZVwkIgorICByZV9lbmRjZj0iXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICR0YWduYW1lXCQiCisgIHNlZF9leHRyYWN0Y2Y9Ii8kcmVfYmVnaW5jZi8sLyRyZV9lbmRjZi9wIgorCisgICMgVmFsaWRhdGUgdGFnbmFtZS4KKyAgY2FzZSAkdGFnbmFtZSBpbgorICAgICpbIS1fQS1aYS16MC05LC9dKikKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgImludmFsaWQgdGFnIG5hbWU6ICR0YWduYW1lIgorICAgICAgOzsKKyAgZXNhYworCisgICMgRG9uJ3QgdGVzdCBmb3IgdGhlICJkZWZhdWx0IiBDIHRhZywgYXMgd2Uga25vdyBpdCdzCisgICMgdGhlcmUgYnV0IG5vdCBzcGVjaWFsbHkgbWFya2VkLgorICBjYXNlICR0YWduYW1lIGluCisgICAgQ0MpIDs7CisgICAgKikKKyAgICAgIGlmICRHUkVQICIkcmVfYmVnaW5jZiIgIiRwcm9ncGF0aCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJdGFnbGlzdD0iJHRhZ2xpc3QgJHRhZ25hbWUiCisKKwkjIEV2YWx1YXRlIHRoZSBjb25maWd1cmF0aW9uLiAgQmUgY2FyZWZ1bCB0byBxdW90ZSB0aGUgcGF0aAorCSMgYW5kIHRoZSBzZWQgc2NyaXB0LCB0byBhdm9pZCBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgYnV0CisJIyBhbHNvIGRvbid0IHVzZSBub24tcG9ydGFibGUgcXVvdGVzIHdpdGhpbiBiYWNrcXVvdGVzIHdpdGhpbgorCSMgcXVvdGVzIHdlIGhhdmUgdG8gZG8gaXQgaW4gMiBzdGVwczoKKwlleHRyYWN0ZWRjZj1gJFNFRCAtbiAtZSAiJHNlZF9leHRyYWN0Y2YiIDwgIiRwcm9ncGF0aCJgCisJZXZhbCAiJGV4dHJhY3RlZGNmIgorICAgICAgZWxzZQorCWZ1bmNfZXJyb3IgImlnbm9yaW5nIHVua25vd24gdGFnICR0YWduYW1lIgorICAgICAgZmkKKyAgICAgIDs7CisgIGVzYWMKK30KKworIyBQYXJzZSBvcHRpb25zIG9uY2UsIHRob3JvdWdobHkuICBUaGlzIGNvbWVzIGFzIHNvb24gYXMgcG9zc2libGUgaW4KKyMgdGhlIHNjcmlwdCB0byBtYWtlIHRoaW5ncyBsaWtlIGBsaWJ0b29sIC0tdmVyc2lvbicgaGFwcGVuIHF1aWNrbHkuCit7CisKKyAgIyBTaG9ydGhhbmQgZm9yIC0tbW9kZT1mb28sIG9ubHkgdmFsaWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CisgIGNhc2UgJDEgaW4KKyAgY2xlYW58Y2xlYXxjbGV8Y2wpCisgICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY2xlYW4gJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGNvbXBpbGV8Y29tcGlsfGNvbXBpfGNvbXB8Y29tfGNvfGMpCisgICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgY29tcGlsZSAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgZXhlY3V0ZXxleGVjdXR8ZXhlY3V8ZXhlY3xleGV8ZXh8ZSkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBleGVjdXRlICR7MSsiJEAifTsgc2hpZnQKKyAgICA7OworICBmaW5pc2h8ZmluaXN8ZmluaXxmaW58Zml8ZikKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBmaW5pc2ggJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGluc3RhbGx8aW5zdGFsfGluc3RhfGluc3R8aW5zfGlufGkpCisgICAgc2hpZnQ7IHNldCBkdW1teSAtLW1vZGUgaW5zdGFsbCAkezErIiRAIn07IHNoaWZ0CisgICAgOzsKKyAgbGlua3xsaW58bGl8bCkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSBsaW5rICR7MSsiJEAifTsgc2hpZnQKKyAgICA7OworICB1bmluc3RhbGx8dW5pbnN0YWx8dW5pbnN0YXx1bmluc3R8dW5pbnN8dW5pbnx1bml8dW58dSkKKyAgICBzaGlmdDsgc2V0IGR1bW15IC0tbW9kZSB1bmluc3RhbGwgJHsxKyIkQCJ9OyBzaGlmdAorICAgIDs7CisgIGVzYWMKKworICAjIFBhcnNlIG5vbi1tb2RlIHNwZWNpZmljIGFyZ3VtZW50czoKKyAgd2hpbGUgdGVzdCAiJCMiIC1ndCAwOyBkbworICAgIG9wdD0iJDEiCisgICAgc2hpZnQKKworICAgIGNhc2UgJG9wdCBpbgorICAgICAgLS1jb25maWcpCQlmdW5jX2NvbmZpZwkJCQkJOzsKKworICAgICAgLS1kZWJ1ZykJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQiCisJCQlmdW5jX2VjaG8gImVuYWJsaW5nIHNoZWxsIHRyYWNlIG1vZGUiCisJCQlvcHRfZGVidWc9J3NldCAteCcKKwkJCSRvcHRfZGVidWcKKwkJCTs7CisKKyAgICAgIC1kbG9wZW4pCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKKwkJCWV4ZWN1dGVfZGxmaWxlcz0iJGV4ZWN1dGVfZGxmaWxlcyAkMSIKKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAtLWRyeS1ydW4gfCAtbikJb3B0X2RyeV9ydW49OgkJCQkJOzsKKyAgICAgIC0tZmVhdHVyZXMpICAgICAgIGZ1bmNfZmVhdHVyZXMJCQkJCTs7CisgICAgICAtLWZpbmlzaCkJCW1vZGU9ImZpbmlzaCIJCQkJCTs7CisKKyAgICAgIC0tbW9kZSkJCXRlc3QgIiQjIiAtZXEgMCAmJiBmdW5jX21pc3NpbmdfYXJnICIkb3B0IiAmJiBicmVhaworCQkJY2FzZSAkMSBpbgorCQkJICAjIFZhbGlkIG1vZGUgYXJndW1lbnRzOgorCQkJICBjbGVhbikJOzsKKwkJCSAgY29tcGlsZSkJOzsKKwkJCSAgZXhlY3V0ZSkJOzsKKwkJCSAgZmluaXNoKQk7OworCQkJICBpbnN0YWxsKQk7OworCQkJICBsaW5rKQkJOzsKKwkJCSAgcmVsaW5rKQk7OworCQkJICB1bmluc3RhbGwpCTs7CisKKwkJCSAgIyBDYXRjaCBhbnl0aGluZyBlbHNlIGFzIGFuIGVycm9yCisJCQkgICopIGZ1bmNfZXJyb3IgImludmFsaWQgYXJndW1lbnQgZm9yICRvcHQiCisJCQkgICAgIGV4aXRfY21kPWV4aXQKKwkJCSAgICAgYnJlYWsKKwkJCSAgICAgOzsKKwkJICAgICAgICBlc2FjCisKKwkJCW1vZGU9IiQxIgorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC0tcHJlc2VydmUtZHVwLWRlcHMpCisJCQlvcHRfZHVwbGljYXRlX2RlcHM9OgkJCQk7OworCisgICAgICAtLXF1aWV0fC0tc2lsZW50KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgorCQkJb3B0X3NpbGVudD06CisJCQk7OworCisgICAgICAtLXZlcmJvc2V8IC12KQlwcmVzZXJ2ZV9hcmdzPSIkcHJlc2VydmVfYXJncyAkb3B0IgorCQkJb3B0X3NpbGVudD1mYWxzZQorCQkJOzsKKworICAgICAgLS10YWcpCQl0ZXN0ICIkIyIgLWVxIDAgJiYgZnVuY19taXNzaW5nX2FyZyAiJG9wdCIgJiYgYnJlYWsKKwkJCXByZXNlcnZlX2FyZ3M9IiRwcmVzZXJ2ZV9hcmdzICRvcHQgJDEiCisJCQlmdW5jX2VuYWJsZV90YWcgIiQxIgkjIHRhZ25hbWUgaXMgc2V0IGhlcmUKKwkJCXNoaWZ0CisJCQk7OworCisgICAgICAjIFNlcGFyYXRlIG9wdGFyZ3MgdG8gbG9uZyBvcHRpb25zOgorICAgICAgLWRsb3Blbj0qfC0tbW9kZT0qfC0tdGFnPSopCisJCQlmdW5jX29wdF9zcGxpdCAiJG9wdCIKKwkJCXNldCBkdW1teSAiJGZ1bmNfb3B0X3NwbGl0X29wdCIgIiRmdW5jX29wdF9zcGxpdF9hcmciICR7MSsiJEAifQorCQkJc2hpZnQKKwkJCTs7CisKKyAgICAgIC1cP3wtaCkJCWZ1bmNfdXNhZ2UJCQkJCTs7CisgICAgICAtLWhlbHApCQlvcHRfaGVscD06CQkJCQk7OworICAgICAgLS12ZXJzaW9uKQlmdW5jX3ZlcnNpb24JCQkJCTs7CisKKyAgICAgIC0qKQkJZnVuY19mYXRhbF9oZWxwICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgJG9wdCciCTs7CisKKyAgICAgICopCQlub25vcHQ9IiRvcHQiCisJCQlicmVhaworCQkJOzsKKyAgICBlc2FjCisgIGRvbmUKKworCisgIGNhc2UgJGhvc3QgaW4KKyAgICAqY3lnd2luKiB8ICptaW5ndyogfCAqcHczMiogfCAqY2VnY2MqKQorICAgICAgIyBkb24ndCBlbGltaW5hdGUgZHVwbGljYXRpb25zIGluICRwb3N0ZGVwcyBhbmQgJHByZWRlcHMKKyAgICAgIG9wdF9kdXBsaWNhdGVfY29tcGlsZXJfZ2VuZXJhdGVkX2RlcHM9OgorICAgICAgOzsKKyAgICAqKQorICAgICAgb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwcz0kb3B0X2R1cGxpY2F0ZV9kZXBzCisgICAgICA7OworICBlc2FjCisKKyAgIyBIYXZpbmcgd2FybmVkIGFib3V0IGFsbCBtaXMtc3BlY2lmaWVkIG9wdGlvbnMsIGJhaWwgb3V0IGlmCisgICMgYW55dGhpbmcgd2FzIHdyb25nLgorICAkZXhpdF9jbWQgJEVYSVRfRkFJTFVSRQorfQorCisjIGZ1bmNfY2hlY2tfdmVyc2lvbl9tYXRjaAorIyBFbnN1cmUgdGhhdCB3ZSBhcmUgdXNpbmcgbTQgbWFjcm9zLCBhbmQgbGlidG9vbCBzY3JpcHQgZnJvbSB0aGUgc2FtZQorIyByZWxlYXNlIG9mIGxpYnRvb2wuCitmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2ggKCkKK3sKKyAgaWYgdGVzdCAiJHBhY2thZ2VfcmV2aXNpb24iICE9ICIkbWFjcm9fcmV2aXNpb24iOyB0aGVuCisgICAgaWYgdGVzdCAiJFZFUlNJT04iICE9ICIkbWFjcm9fdmVyc2lvbiI7IHRoZW4KKyAgICAgIGlmIHRlc3QgLXogIiRtYWNyb192ZXJzaW9uIjsgdGhlbgorICAgICAgICBjYXQgPiYyIDw8X0xUX0VPRgorJHByb2duYW1lOiBWZXJzaW9uIG1pc21hdGNoIGVycm9yLiAgVGhpcyBpcyAkUEFDS0FHRSAkVkVSU0lPTiwgYnV0IHRoZQorJHByb2duYW1lOiBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIGFuIG9sZGVyIHJlbGVhc2UuCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBlbHNlCisgICAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCBidXQgdGhlCiskcHJvZ25hbWU6IGRlZmluaXRpb24gb2YgdGhpcyBMVF9JTklUIGNvbWVzIGZyb20gJFBBQ0tBR0UgJG1hY3JvX3ZlcnNpb24uCiskcHJvZ25hbWU6IFlvdSBzaG91bGQgcmVjcmVhdGUgYWNsb2NhbC5tNCB3aXRoIG1hY3JvcyBmcm9tICRQQUNLQUdFICRWRVJTSU9OCiskcHJvZ25hbWU6IGFuZCBydW4gYXV0b2NvbmYgYWdhaW4uCitfTFRfRU9GCisgICAgICBmaQorICAgIGVsc2UKKyAgICAgIGNhdCA+JjIgPDxfTFRfRU9GCiskcHJvZ25hbWU6IFZlcnNpb24gbWlzbWF0Y2ggZXJyb3IuICBUaGlzIGlzICRQQUNLQUdFICRWRVJTSU9OLCByZXZpc2lvbiAkcGFja2FnZV9yZXZpc2lvbiwKKyRwcm9nbmFtZTogYnV0IHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgTFRfSU5JVCBjb21lcyBmcm9tIHJldmlzaW9uICRtYWNyb19yZXZpc2lvbi4KKyRwcm9nbmFtZTogWW91IHNob3VsZCByZWNyZWF0ZSBhY2xvY2FsLm00IHdpdGggbWFjcm9zIGZyb20gcmV2aXNpb24gJHBhY2thZ2VfcmV2aXNpb24KKyRwcm9nbmFtZTogb2YgJFBBQ0tBR0UgJFZFUlNJT04gYW5kIHJ1biBhdXRvY29uZiBhZ2Fpbi4KK19MVF9FT0YKKyAgICBmaQorCisgICAgZXhpdCAkRVhJVF9NSVNNQVRDSAorICBmaQorfQorCisKKyMjIC0tLS0tLS0tLS0tICMjCisjIyAgICBNYWluLiAgICAjIworIyMgLS0tLS0tLS0tLS0gIyMKKworJG9wdF9oZWxwIHx8IHsKKyAgIyBTYW5pdHkgY2hlY2tzIGZpcnN0OgorICBmdW5jX2NoZWNrX3ZlcnNpb25fbWF0Y2gKKworICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gIm5vdCBjb25maWd1cmVkIHRvIGJ1aWxkIGFueSBraW5kIG9mIGxpYnJhcnkiCisgIGZpCisKKyAgdGVzdCAteiAiJG1vZGUiICYmIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiB5b3UgbXVzdCBzcGVjaWZ5IGEgTU9ERS4iCisKKworICAjIERhcndpbiBzdWNrcworICBldmFsIHN0ZF9zaHJleHQ9XCIkc2hyZXh0X2NtZHNcIgorCisKKyAgIyBPbmx5IGV4ZWN1dGUgbW9kZSBpcyBhbGxvd2VkIHRvIGhhdmUgLWRsb3BlbiBmbGFncy4KKyAgaWYgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgdGVzdCAiJG1vZGUiICE9IGV4ZWN1dGU7IHRoZW4KKyAgICBmdW5jX2Vycm9yICJ1bnJlY29nbml6ZWQgb3B0aW9uIFxgLWRsb3BlbiciCisgICAgJEVDSE8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAkRVhJVF9GQUlMVVJFCisgIGZpCisKKyAgIyBDaGFuZ2UgdGhlIGhlbHAgbWVzc2FnZSB0byBhIG1vZGUtc3BlY2lmaWMgb25lLgorICBnZW5lcmljX2hlbHA9IiRoZWxwIgorICBoZWxwPSJUcnkgXGAkcHJvZ25hbWUgLS1oZWxwIC0tbW9kZT0kbW9kZScgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorfQorCisKKyMgZnVuY19sYWxpYl9wIGZpbGUKKyMgVHJ1ZSBpZmYgRklMRSBpcyBhIGxpYnRvb2wgYC5sYScgbGlicmFyeSBvciBgLmxvJyBvYmplY3QgZmlsZS4KKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2xhbGliX3AgKCkKK3sKKyAgICB0ZXN0IC1mICIkMSIgJiYKKyAgICAgICRTRUQgLWUgNHEgIiQxIiAyPi9kZXYvbnVsbCBcCisgICAgICAgIHwgJEdSRVAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIiA+IC9kZXYvbnVsbCAyPiYxCit9CisKKyMgZnVuY19sYWxpYl91bnNhZmVfcCBmaWxlCisjIFRydWUgaWZmIEZJTEUgaXMgYSBsaWJ0b29sIGAubGEnIGxpYnJhcnkgb3IgYC5sbycgb2JqZWN0IGZpbGUuCisjIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgc2FtZSBjaGVjayBhcyBmdW5jX2xhbGliX3Agd2l0aG91dAorIyByZXNvcnRpbmcgdG8gZXh0ZXJuYWwgcHJvZ3JhbXMuICBUbyB0aGlzIGVuZCwgaXQgcmVkaXJlY3RzIHN0ZGluIGFuZAorIyBjbG9zZXMgaXQgYWZ0ZXJ3YXJkcywgd2l0aG91dCBzYXZpbmcgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvci4KKyMgQXMgYSBzYWZldHkgbWVhc3VyZSwgdXNlIGl0IG9ubHkgd2hlcmUgYSBuZWdhdGl2ZSByZXN1bHQgd291bGQgYmUKKyMgZmF0YWwgYW55d2F5LiAgV29ya3MgaWYgYGZpbGUnIGRvZXMgbm90IGV4aXN0LgorZnVuY19sYWxpYl91bnNhZmVfcCAoKQoreworICAgIGxhbGliX3A9bm8KKyAgICBpZiB0ZXN0IC1mICIkMSIgJiYgdGVzdCAtciAiJDEiICYmIGV4ZWMgNTwmMCA8IiQxIjsgdGhlbgorCWZvciBsYWxpYl9wX2wgaW4gMSAyIDMgNAorCWRvCisJICAgIHJlYWQgbGFsaWJfcF9saW5lCisJICAgIGNhc2UgIiRsYWxpYl9wX2xpbmUiIGluCisJCVwjXCBHZW5lcmF0ZWRcIGJ5XCAqJFBBQ0tBR0UqICkgbGFsaWJfcD15ZXM7IGJyZWFrOzsKKwkgICAgZXNhYworCWRvbmUKKwlleGVjIDA8JjUgNTwmLQorICAgIGZpCisgICAgdGVzdCAiJGxhbGliX3AiID0geWVzCit9CisKKyMgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdAorIyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYSBiYXNpYyBzYW5pdHkgY2hlY2s7IGl0IHdpbGwgaGFyZGx5IGZsdXNoIG91dAorIyBkZXRlcm1pbmVkIGltcG9zdGVycy4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICgpCit7CisgICAgZnVuY19sYWxpYl9wICIkMSIKK30KKworIyBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9leGVjX3N1ZmZpeD0KKyAgICBjYXNlICQxIGluCisgICAgKi5leGUpIDs7CisgICAgKikgZnVuY19sdHdyYXBwZXJfZXhlY19zdWZmaXg9LmV4ZSA7OworICAgIGVzYWMKKyAgICAkR1JFUCAiJG1hZ2ljX2V4ZSIgIiQxJGZ1bmNfbHR3cmFwcGVyX2V4ZWNfc3VmZml4IiA+L2Rldi9udWxsIDI+JjEKK30KKworIyBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lIGZpbGUKKyMgQXNzdW1lcyBmaWxlIGlzIGFuIGx0d3JhcHBlcl9leGVjdXRhYmxlCisjIHVzZXMgJGZpbGUgdG8gZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBmaWxlbmFtZSBmb3IgYQorIyB0ZW1wb3JhcnkgbHR3cmFwcGVyX3NjcmlwdC4KK2Z1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgKCkKK3sKKyAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdD0iIgorICAgIGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJDEiOyB0aGVuCisJZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJDEiICIiICIuIgorCWZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCWZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0PSIkZnVuY19kaXJuYW1lX3Jlc3VsdC8kb2JqZGlyLyR7ZnVuY19zdHJpcG5hbWVfcmVzdWx0fV9sdHNod3JhcHBlciIKKyAgICBmaQorfQorCisjIGZ1bmNfbHR3cmFwcGVyX3AgZmlsZQorIyBUcnVlIGlmZiBGSUxFIGlzIGEgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBvciB3cmFwcGVyIGV4ZWN1dGFibGUKKyMgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGEgYmFzaWMgc2FuaXR5IGNoZWNrOyBpdCB3aWxsIGhhcmRseSBmbHVzaCBvdXQKKyMgZGV0ZXJtaW5lZCBpbXBvc3RlcnMuCitmdW5jX2x0d3JhcHBlcl9wICgpCit7CisgICAgZnVuY19sdHdyYXBwZXJfc2NyaXB0X3AgIiQxIiB8fCBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiQxIgorfQorCisKKyMgZnVuY19leGVjdXRlX2NtZHMgY29tbWFuZHMgZmFpbF9jbWQKKyMgRXhlY3V0ZSB0aWxkZS1kZWxpbWl0ZWQgQ09NTUFORFMuCisjIElmIEZBSUxfQ01EIGlzIGdpdmVuLCBldmFsIHRoYXQgdXBvbiBmYWlsdXJlLgorIyBGQUlMX0NNRCBtYXkgcmVhZC1hY2Nlc3MgdGhlIGN1cnJlbnQgY29tbWFuZCBpbiB2YXJpYWJsZSBDTUQhCitmdW5jX2V4ZWN1dGVfY21kcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBzYXZlX2lmcz0kSUZTOyBJRlM9J34nCisgICAgZm9yIGNtZCBpbiAkMTsgZG8KKyAgICAgIElGUz0kc2F2ZV9pZnMKKyAgICAgIGV2YWwgY21kPVwiJGNtZFwiCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGNtZCIgIiR7Mi06fSIKKyAgICBkb25lCisgICAgSUZTPSRzYXZlX2lmcworfQorCisKKyMgZnVuY19zb3VyY2UgZmlsZQorIyBTb3VyY2UgRklMRSwgYWRkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQgaWYgbmVjZXNzYXJ5LgorIyBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyeSBvbiBjeWd3aW4vbWluZ3cgdG8gYXBwZW5kIGEgZG90IHRvCisjIEZJTEUgZXZlbiBpZiBib3RoIEZJTEUgYW5kIEZJTEUuZXhlIGV4aXN0OiBhdXRvbWF0aWMtYXBwZW5kLS5leGUKKyMgYmVoYXZpb3IgaGFwcGVucyBvbmx5IGZvciBleGVjKDMpLCBub3QgZm9yIG9wZW4oMikhICBBbHNvLCBzb3VyY2luZworIyBgRklMRS4nIGRvZXMgbm90IHdvcmsgb24gY3lnd2luIG1hbmFnZWQgbW91bnRzLgorZnVuY19zb3VyY2UgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkMSBpbgorICAgICovKiB8ICpcXCopCS4gIiQxIiA7OworICAgICopCQkuICIuLyQxIiA7OworICAgIGVzYWMKK30KKworCisjIGZ1bmNfaW5mZXJfdGFnIGFyZworIyBJbmZlciB0YWdnZWQgY29uZmlndXJhdGlvbiB0byB1c2UgaWYgYW55IGFyZSBhdmFpbGFibGUgYW5kCisjIGlmIG9uZSB3YXNuJ3QgY2hvc2VuIHZpYSB0aGUgIi0tdGFnIiBjb21tYW5kIGxpbmUgb3B0aW9uLgorIyBPbmx5IGF0dGVtcHQgdGhpcyBpZiB0aGUgY29tcGlsZXIgaW4gdGhlIGJhc2UgY29tcGlsZQorIyBjb21tYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIGRlZmF1bHQgY29tcGlsZXIuCisjIGFyZyBpcyB1c3VhbGx5IG9mIHRoZSBmb3JtICdnY2MgLi4uJworZnVuY19pbmZlcl90YWcgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgaWYgdGVzdCAtbiAiJGF2YWlsYWJsZV90YWdzIiAmJiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKyAgICAgIENDX3F1b3RlZD0KKyAgICAgIGZvciBhcmcgaW4gJENDOyBkbworICAgICAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCUNDX3F1b3RlZD0iJENDX3F1b3RlZCAkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICBkb25lCisgICAgICBjYXNlICRAIGluCisgICAgICAjIEJsYW5rcyBpbiB0aGUgY29tbWFuZCBtYXkgaGF2ZSBiZWVuIHN0cmlwcGVkIGJ5IHRoZSBjYWxsaW5nIHNoZWxsLAorICAgICAgIyBidXQgbm90IGZyb20gdGhlIENDIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gY29uZmlndXJlIHdhcyBydW4uCisgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikgOzsKKyAgICAgICMgQmxhbmtzIGF0IHRoZSBzdGFydCBvZiAkYmFzZV9jb21waWxlIHdpbGwgY2F1c2UgdGhpcyB0byBmYWlsCisgICAgICAjIGlmIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtIGFzIHdlbGwuCisgICAgICAqKQorCWZvciB6IGluICRhdmFpbGFibGVfdGFnczsgZG8KKwkgIGlmICRHUkVQICJeIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiAkeiQiIDwgIiRwcm9ncGF0aCIgPiAvZGV2L251bGw7IHRoZW4KKwkgICAgIyBFdmFsdWF0ZSB0aGUgY29uZmlndXJhdGlvbi4KKwkgICAgZXZhbCAiYCR7U0VEfSAtbiAtZSAnL14jICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6ICckeickLywvXiMgIyMjIEVORCBMSUJUT09MIFRBRyBDT05GSUc6ICckeickL3AnIDwgJHByb2dwYXRoYCIKKwkgICAgQ0NfcXVvdGVkPQorCSAgICBmb3IgYXJnIGluICRDQzsgZG8KKwkgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisJICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwkgICAgICBDQ19xdW90ZWQ9IiRDQ19xdW90ZWQgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgICBkb25lCisJICAgIGNhc2UgIiRAICIgaW4KKwkgICAgICAiICRDQyAiKiB8ICIkQ0MgIiogfCAiIGAkRUNITyAkQ0NgICIqIHwgImAkRUNITyAkQ0NgICIqIHwgIiAkQ0NfcXVvdGVkIiogfCAiJENDX3F1b3RlZCAiKiB8ICIgYCRFQ0hPICRDQ19xdW90ZWRgICIqIHwgImAkRUNITyAkQ0NfcXVvdGVkYCAiKikKKwkgICAgICAjIFRoZSBjb21waWxlciBpbiB0aGUgYmFzZSBjb21waWxlIGNvbW1hbmQgbWF0Y2hlcworCSAgICAgICMgdGhlIG9uZSBpbiB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24uCisJICAgICAgIyBBc3N1bWUgdGhpcyBpcyB0aGUgdGFnZ2VkIGNvbmZpZ3VyYXRpb24gd2Ugd2FudC4KKwkgICAgICB0YWduYW1lPSR6CisJICAgICAgYnJlYWsKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaQorCWRvbmUKKwkjIElmICR0YWduYW1lIHN0aWxsIGlzbid0IHNldCwgdGhlbiBubyB0YWdnZWQgY29uZmlndXJhdGlvbgorCSMgd2FzIGZvdW5kIGFuZCBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSAiLS10YWciIGNvbW1hbmQKKwkjIGxpbmUgb3B0aW9uIG11c3QgYmUgdXNlZC4KKwlpZiB0ZXN0IC16ICIkdGFnbmFtZSI7IHRoZW4KKwkgIGZ1bmNfZWNobyAidW5hYmxlIHRvIGluZmVyIHRhZ2dlZCBjb25maWd1cmF0aW9uIgorCSAgZnVuY19mYXRhbF9lcnJvciAic3BlY2lmeSBhIHRhZyB3aXRoIFxgLS10YWcnIgorIwllbHNlCisjCSAgZnVuY192ZXJib3NlICJ1c2luZyAkdGFnbmFtZSB0YWdnZWQgY29uZmlndXJhdGlvbiIKKwlmaQorCTs7CisgICAgICBlc2FjCisgICAgZmkKK30KKworCisKKyMgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCBvdXRwdXRfbmFtZSBwaWNfbmFtZSBub25waWNfbmFtZQorIyBDcmVhdGUgYSBsaWJ0b29sIG9iamVjdCBmaWxlIChhbmFsb2dvdXMgdG8gYSAiLmxhIiBmaWxlKSwKKyMgYnV0IGRvbid0IGNyZWF0ZSBpdCBpZiB3ZSdyZSBkb2luZyBhIGRyeSBydW4uCitmdW5jX3dyaXRlX2xpYnRvb2xfb2JqZWN0ICgpCit7CisgICAgd3JpdGVfbGlib2JqPSR7MX0KKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgd3JpdGVfbG9iaj1cJyR7Mn1cJworICAgIGVsc2UKKyAgICAgIHdyaXRlX2xvYmo9bm9uZQorICAgIGZpCisKKyAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICB3cml0ZV9vbGRvYmo9XCckezN9XCcKKyAgICBlbHNlCisgICAgICB3cml0ZV9vbGRvYmo9bm9uZQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgY2F0ID4ke3dyaXRlX2xpYm9ian1UIDw8RU9GCisjICR3cml0ZV9saWJvYmogLSBhIGxpYnRvb2wgb2JqZWN0IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBOYW1lIG9mIHRoZSBQSUMgb2JqZWN0LgorcGljX29iamVjdD0kd3JpdGVfbG9iagorCisjIE5hbWUgb2YgdGhlIG5vbi1QSUMgb2JqZWN0Citub25fcGljX29iamVjdD0kd3JpdGVfb2xkb2JqCisKK0VPRgorICAgICAgJE1WICIke3dyaXRlX2xpYm9ian1UIiAiJHt3cml0ZV9saWJvYmp9IgorICAgIH0KK30KKworIyBmdW5jX21vZGVfY29tcGlsZSBhcmcuLi4KK2Z1bmNfbW9kZV9jb21waWxlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIHNyY2ZpbGU9IiRub25vcHQiICAjICBhbHdheXMga2VlcCBhIG5vbi1lbXB0eSB2YWx1ZSBpbiAic3JjZmlsZSIKKyAgICBzdXBwcmVzc19vcHQ9eWVzCisgICAgc3VwcHJlc3Nfb3V0cHV0PQorICAgIGFyZ19tb2RlPW5vcm1hbAorICAgIGxpYm9iaj0KKyAgICBsYXRlcj0KKyAgICBwaWVfZmxhZz0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnX21vZGUgaW4KKyAgICAgIGFyZyAgKQorCSMgZG8gbm90ICJjb250aW51ZSIuICBJbnN0ZWFkLCBhZGQgdGhpcyB0byBiYXNlX2NvbXBpbGUKKwlsYXN0YXJnPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCTs7CisKKyAgICAgIHRhcmdldCApCisJbGlib2JqPSIkYXJnIgorCWFyZ19tb2RlPW5vcm1hbAorCWNvbnRpbnVlCisJOzsKKworICAgICAgbm9ybWFsICkKKwkjIEFjY2VwdCBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMuCisJY2FzZSAkYXJnIGluCisJLW8pCisJICB0ZXN0IC1uICIkbGlib2JqIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBjYW5ub3Qgc3BlY2lmeSBcYC1vJyBtb3JlIHRoYW4gb25jZSIKKwkgIGFyZ19tb2RlPXRhcmdldAorCSAgY29udGludWUKKwkgIDs7CisKKwktcGllIHwgLWZwaWUgfCAtZlBJRSkKKyAgICAgICAgICBwaWVfZmxhZz0iJHBpZV9mbGFnICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1zaGFyZWQgfCAtc3RhdGljIHwgLXByZWZlci1waWMgfCAtcHJlZmVyLW5vbi1waWMpCisJICBsYXRlcj0iJGxhdGVyICRhcmciCisJICBjb250aW51ZQorCSAgOzsKKworCS1uby1zdXBwcmVzcykKKwkgIHN1cHByZXNzX29wdD1ubworCSAgY29udGludWUKKwkgIDs7CisKKwktWGNvbXBpbGVyKQorCSAgYXJnX21vZGU9YXJnICAjICB0aGUgbmV4dCBvbmUgZ29lcyBpbnRvIHRoZSAiYmFzZV9jb21waWxlIiBhcmcgbGlzdAorCSAgY29udGludWUgICAgICAjICBUaGUgY3VycmVudCAic3JjZmlsZSIgd2lsbCBlaXRoZXIgYmUgcmV0YWluZWQgb3IKKwkgIDs7ICAgICAgICAgICAgIyAgcmVwbGFjZWQgbGF0ZXIuICBJIHdvdWxkIGd1ZXNzIHRoYXQgd291bGQgYmUgYSBidWcuCisKKwktV2MsKikKKwkgIGZ1bmNfc3RyaXBuYW1lICctV2MsJyAnJyAiJGFyZyIKKwkgIGFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgbGFzdGFyZz0KKwkgIHNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCSAgZm9yIGFyZyBpbiAkYXJnczsgZG8KKwkgICAgSUZTPSIkc2F2ZV9pZnMiCisJICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJICAgIGxhc3Rhcmc9IiRsYXN0YXJnICRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGRvbmUKKwkgIElGUz0iJHNhdmVfaWZzIgorCSAgZnVuY19zdHJpcG5hbWUgJyAnICcnICIkbGFzdGFyZyIKKwkgIGxhc3Rhcmc9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisJICAjIEFkZCB0aGUgYXJndW1lbnRzIHRvIGJhc2VfY29tcGlsZS4KKwkgIGJhc2VfY29tcGlsZT0iJGJhc2VfY29tcGlsZSAkbGFzdGFyZyIKKwkgIGNvbnRpbnVlCisJICA7OworCisJKikKKwkgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKwkgICMgVGhlIHByZXZpb3VzICJzcmNmaWxlIiBiZWNvbWVzIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorCSAgIworCSAgbGFzdGFyZz0iJHNyY2ZpbGUiCisJICBzcmNmaWxlPSIkYXJnIgorCSAgOzsKKwllc2FjICAjICBjYXNlICRhcmcKKwk7OworICAgICAgZXNhYyAgICAjICBjYXNlICRhcmdfbW9kZQorCisgICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgorICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGxhc3RhcmciCisgICAgICBiYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGRvbmUgIyBmb3IgYXJnCisKKyAgICBjYXNlICRhcmdfbW9kZSBpbgorICAgIGFyZykKKyAgICAgIGZ1bmNfZmF0YWxfZXJyb3IgInlvdSBtdXN0IHNwZWNpZnkgYW4gYXJndW1lbnQgZm9yIC1YY29tcGlsZSIKKyAgICAgIDs7CisgICAgdGFyZ2V0KQorICAgICAgZnVuY19mYXRhbF9lcnJvciAieW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCB3aXRoIFxgLW8nIgorICAgICAgOzsKKyAgICAqKQorICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgeworCWZ1bmNfYmFzZW5hbWUgIiRzcmNmaWxlIgorCWxpYm9iaj0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgICAgfQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCisgICAgY2FzZSAkbGlib2JqIGluCisgICAgKi5bY0NGU2lmbXNvXSB8IFwKKyAgICAqLmFkYSB8ICouYWRiIHwgKi5hZHMgfCAqLmFzbSB8IFwKKyAgICAqLmMrKyB8ICouY2MgfCAqLmlpIHwgKi5jbGFzcyB8ICouY3BwIHwgKi5jeHggfCBcCisgICAgKi5bZkZdWzA5XT8gfCAqLmZvciB8ICouamF2YSB8ICoub2JqIHwgKi5zeCkKKyAgICAgIGZ1bmNfeGZvcm0gIiRsaWJvYmoiCisgICAgICBsaWJvYmo9JGZ1bmNfeGZvcm1fcmVzdWx0CisgICAgICA7OworICAgIGVzYWMKKworICAgIGNhc2UgJGxpYm9iaiBpbgorICAgICoubG8pIGZ1bmNfbG8ybyAiJGxpYm9iaiI7IG9iaj0kZnVuY19sbzJvX3Jlc3VsdCA7OworICAgICopCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIG5hbWUgb2YgbGlicmFyeSBvYmplY3QgZnJvbSBcYCRsaWJvYmonIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICBmb3IgYXJnIGluICRsYXRlcjsgZG8KKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLXNoYXJlZCkKKwl0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgXAorCSAgZnVuY19mYXRhbF9jb25maWd1cmF0aW9uICJjYW4gbm90IGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkiCisJYnVpbGRfb2xkX2xpYnM9bm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC1zdGF0aWMpCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtcHJlZmVyLXBpYykKKwlwaWNfbW9kZT15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1wcmVmZXItbm9uLXBpYykKKwlwaWNfbW9kZT1ubworCWNvbnRpbnVlCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkbGlib2JqIgorICAgIHRlc3QgIlgkbGlib2JqIiAhPSAiWCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIgXAorICAgICAgJiYgJEVDSE8gIlgkbGlib2JqIiB8ICRHUkVQICdbXX4jXip7fTs8Pj8iJyInIicJICYoKXxgJFtdJyBcCisgICAgICAmJiBmdW5jX3dhcm5pbmcgImxpYm9iaiBuYW1lIFxgJGxpYm9iaicgbWF5IG5vdCBjb250YWluIHNoZWxsIHNwZWNpYWwgY2hhcmFjdGVycy4iCisgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG9iaiIgIi8iICIiCisgICAgb2JqbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgIGxvYmo9JHt4ZGlyfSRvYmpkaXIvJG9iam5hbWUKKworICAgIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiCisKKyAgICAjIERlbGV0ZSBhbnkgbGVmdG92ZXIgbGlicmFyeSBvYmplY3RzLgorICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgIHJlbW92ZWxpc3Q9IiRvYmogJGxvYmogJGxpYm9iaiAke2xpYm9ian1UIgorICAgIGVsc2UKKyAgICAgIHJlbW92ZWxpc3Q9IiRsb2JqICRsaWJvYmogJHtsaWJvYmp9VCIKKyAgICBmaQorCisgICAgIyBPbiBDeWd3aW4gdGhlcmUncyBubyAicmVhbCIgUElDIGZsYWcgc28gd2UgbXVzdCBidWlsZCBib3RoIG9iamVjdCB0eXBlcworICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBjeWd3aW4qIHwgbWluZ3cqIHwgcHczMiogfCBvczIqIHwgY2VnY2MqKQorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgICAgOzsKKyAgICBlc2FjCisgICAgaWYgdGVzdCAiJHBpY19tb2RlIiA9IG5vICYmIHRlc3QgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgIT0gcGFzc19hbGw7IHRoZW4KKyAgICAgICMgbm9uLVBJQyBjb2RlIGluIHNoYXJlZCBsaWJyYXJpZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgcGljX21vZGU9ZGVmYXVsdAorICAgIGZpCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBvYmplY3QgaWYgY29tcGlsZXIgZG9lcworICAgICMgbm90IHN1cHBvcnQgLW8gd2l0aCAtYworICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0gbm87IHRoZW4KKyAgICAgIG91dHB1dF9vYmo9YCRFQ0hPICJYJHNyY2ZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncyVcLlteLl0qJCUlJ2AuJHtvYmpleHR9CisgICAgICBsb2NrZmlsZT0iJG91dHB1dF9vYmoubG9jayIKKyAgICBlbHNlCisgICAgICBvdXRwdXRfb2JqPQorICAgICAgbmVlZF9sb2Nrcz1ubworICAgICAgbG9ja2ZpbGU9CisgICAgZmkKKworICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCisgICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQorICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgorICAgICAgdW50aWwgJG9wdF9kcnlfcnVuIHx8IGxuICIkcHJvZ3BhdGgiICIkbG9ja2ZpbGUiIDI+L2Rldi9udWxsOyBkbworCWZ1bmNfZWNobyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCisJc2xlZXAgMgorICAgICAgZG9uZQorICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgorICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgorCSRFQ0hPICJcCisqKiogRVJST1IsICRsb2NrZmlsZSBleGlzdHMgYW5kIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmoiCisgICAgICAkRUNITyAiJHNyY2ZpbGUiID4gIiRsb2NrZmlsZSIKKyAgICBmaQorCisgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdAorICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRsb2NrZmlsZSIKKyAgICB0cmFwICckb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnIDEgMiAxNQorCisgICAgaWYgdGVzdCAtbiAiJGZpeF9zcmNmaWxlX3BhdGgiOyB0aGVuCisgICAgICBldmFsIHNyY2ZpbGU9XCIkZml4X3NyY2ZpbGVfcGF0aFwiCisgICAgZmkKKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkc3JjZmlsZSIKKyAgICBxc3JjZmlsZT0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQKKworICAgICMgT25seSBidWlsZCBhIFBJQyBvYmplY3QgaWYgd2UgYXJlIGJ1aWxkaW5nIGxpYnRvb2wgbGlicmFyaWVzLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAjIFdpdGhvdXQgdGhpcyBhc3NpZ25tZW50LCBiYXNlX2NvbXBpbGUgZ2V0cyBlbXB0aWVkLgorICAgICAgZmJzZF9oaWRlb3VzX3NoX2J1Zz0kYmFzZV9jb21waWxlCisKKyAgICAgIGlmIHRlc3QgIiRwaWNfbW9kZSIgIT0gbm87IHRoZW4KKwljb21tYW5kPSIkYmFzZV9jb21waWxlICRxc3JjZmlsZSAkcGljX2ZsYWciCisgICAgICBlbHNlCisJIyBEb24ndCBidWlsZCBQSUMgY29kZQorCWNvbW1hbmQ9IiRiYXNlX2NvbXBpbGUgJHFzcmNmaWxlIgorICAgICAgZmkKKworICAgICAgZnVuY19ta2Rpcl9wICIkeGRpciRvYmpkaXIiCisKKyAgICAgIGlmIHRlc3QgLXogIiRvdXRwdXRfb2JqIjsgdGhlbgorCSMgUGxhY2UgUElDIG9iamVjdHMgaW4gJG9iamRpcgorCWNvbW1hbmQ9IiRjb21tYW5kIC1vICRsb2JqIgorICAgICAgZmkKKworICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIJXAorICAgICAgICAgICd0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJFJNICRyZW1vdmVsaXN0OyBleGl0ICRFWElUX0ZBSUxVUkUnCisKKyAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKKwkgdGVzdCAiWGBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0gIlgkc3JjZmlsZSI7IHRoZW4KKwkkRUNITyAiXAorKioqIEVSUk9SLCAkbG9ja2ZpbGUgY29udGFpbnM6CitgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKKworYnV0IGl0IHNob3VsZCBjb250YWluOgorJHNyY2ZpbGUKKworVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQordGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoreW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQorcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgorYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKK2NvbXBpbGVyLiIKKworCSRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3QKKwlleGl0ICRFWElUX0ZBSUxVUkUKKyAgICAgIGZpCisKKyAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICBpZiB0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgdGVzdCAiWCRvdXRwdXRfb2JqIiAhPSAiWCRsb2JqIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJGxvYmoiJyBcCisJICAnZXJyb3I9JD87ICRvcHRfZHJ5X3J1biB8fCAkUk0gJHJlbW92ZWxpc3Q7IGV4aXQgJGVycm9yJworICAgICAgZmkKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgaWYgdGVzdCAiJHN1cHByZXNzX29wdCIgPSB5ZXM7IHRoZW4KKwlzdXBwcmVzc19vdXRwdXQ9JyA+L2Rldi9udWxsIDI+JjEnCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgaWYgdGVzdCAiJHBpY19tb2RlIiAhPSB5ZXM7IHRoZW4KKwkjIERvbid0IGJ1aWxkIFBJQyBjb2RlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUkcGllX2ZsYWciCisgICAgICBlbHNlCisJY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcXNyY2ZpbGUgJHBpY19mbGFnIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCisJY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKKyAgICAgIGZpCisKKyAgICAgICMgU3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGlmIHdlIGFscmVhZHkgZGlkIGEgUElDIGNvbXBpbGF0aW9uLgorICAgICAgY29tbWFuZD0iJGNvbW1hbmQkc3VwcHJlc3Nfb3V0cHV0IgorICAgICAgZnVuY19zaG93X2V2YWxfbG9jYWxlICIkY29tbWFuZCIgXAorICAgICAgICAnJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkRVhJVF9GQUlMVVJFJworCisgICAgICBpZiB0ZXN0ICIkbmVlZF9sb2NrcyIgPSB3YXJuICYmCisJIHRlc3QgIlhgY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAiICE9ICJYJHNyY2ZpbGUiOyB0aGVuCisJJEVDSE8gIlwKKyoqKiBFUlJPUiwgJGxvY2tmaWxlIGNvbnRhaW5zOgorYGNhdCAkbG9ja2ZpbGUgMj4vZGV2L251bGxgCisKK2J1dCBpdCBzaG91bGQgY29udGFpbjoKKyRzcmNmaWxlCisKK1RoaXMgaW5kaWNhdGVzIHRoYXQgYW5vdGhlciBwcm9jZXNzIGlzIHRyeWluZyB0byB1c2UgdGhlIHNhbWUKK3RlbXBvcmFyeSBvYmplY3QgZmlsZSwgYW5kIGxpYnRvb2wgY291bGQgbm90IHdvcmsgYXJvdW5kIGl0IGJlY2F1c2UKK3lvdXIgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBcYC1jJyBhbmQgXGAtbycgdG9nZXRoZXIuICBJZiB5b3UKK3JlcGVhdCB0aGlzIGNvbXBpbGF0aW9uLCBpdCBtYXkgc3VjY2VlZCwgYnkgY2hhbmNlLCBidXQgeW91IGhhZCBiZXR0ZXIKK2F2b2lkIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikgaW4gdGhpcyBwbGF0Zm9ybSwgb3IgZ2V0IGEgYmV0dGVyCitjb21waWxlci4iCisKKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRyZW1vdmVsaXN0CisJZXhpdCAkRVhJVF9GQUlMVVJFCisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0IGlmIG5lZWRlZAorICAgICAgaWYgdGVzdCAtbiAiJG91dHB1dF9vYmoiICYmIHRlc3QgIlgkb3V0cHV0X29iaiIgIT0gIlgkb2JqIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICckTVYgIiRvdXRwdXRfb2JqIiAiJG9iaiInIFwKKwkgICdlcnJvcj0kPzsgJG9wdF9kcnlfcnVuIHx8ICRSTSAkcmVtb3ZlbGlzdDsgZXhpdCAkZXJyb3InCisgICAgICBmaQorICAgIGZpCisKKyAgICAkb3B0X2RyeV9ydW4gfHwgeworICAgICAgZnVuY193cml0ZV9saWJ0b29sX29iamVjdCAiJGxpYm9iaiIgIiRvYmpkaXIvJG9iam5hbWUiICIkb2JqbmFtZSIKKworICAgICAgIyBVbmxvY2sgdGhlIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgd2FzIGxvY2tlZAorICAgICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCisJcmVtb3ZlbGlzdD0kbG9ja2ZpbGUKKyAgICAgICAgJFJNICIkbG9ja2ZpbGUiCisgICAgICBmaQorICAgIH0KKworICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworfQorCiskb3B0X2hlbHAgfHwgewordGVzdCAiJG1vZGUiID0gY29tcGlsZSAmJiBmdW5jX21vZGVfY29tcGlsZSAkezErIiRAIn0KK30KKworZnVuY19tb2RlX2hlbHAgKCkKK3sKKyAgICAjIFdlIG5lZWQgdG8gZGlzcGxheSBoZWxwIGZvciBlYWNoIG9mIHRoZSBtb2Rlcy4KKyAgICBjYXNlICRtb2RlIGluCisgICAgICAiIikKKyAgICAgICAgIyBHZW5lcmljIGhlbHAgaXMgZXh0cmFjdGVkIGZyb20gdGhlIHVzYWdlIGNvbW1lbnRzCisgICAgICAgICMgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZmlsZS4KKyAgICAgICAgZnVuY19oZWxwCisgICAgICAgIDs7CisKKyAgICAgIGNsZWFuKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y2xlYW4gUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgZmlsZXMgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBvYmplY3Qgb3IgcHJvZ3JhbSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkCit3aXRoIGl0IGFyZSBkZWxldGVkLiBPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgICAgICAgIDs7CisKKyAgICAgIGNvbXBpbGUpCisgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9Y29tcGlsZSBDT01QSUxFLUNPTU1BTkQuLi4gU09VUkNFRklMRQorCitDb21waWxlIGEgc291cmNlIGZpbGUgaW50byBhIGxpYnRvb2wgbGlicmFyeSBvYmplY3QuCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1vIE9VVFBVVC1GSUxFICAgIHNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZSB0byBPVVRQVVQtRklMRQorICAtbm8tc3VwcHJlc3MgICAgICBkbyBub3Qgc3VwcHJlc3MgY29tcGlsZXIgb3V0cHV0IGZvciBtdWx0aXBsZSBwYXNzZXMKKyAgLXByZWZlci1waWMgICAgICAgdHJ5IHRvIGJ1aWxkaW5nIFBJQyBvYmplY3RzIG9ubHkKKyAgLXByZWZlci1ub24tcGljICAgdHJ5IHRvIGJ1aWxkaW5nIG5vbi1QSUMgb2JqZWN0cyBvbmx5CisgIC1zaGFyZWQgICAgICAgICAgIGRvIG5vdCBidWlsZCBhIFxgLm8nIGZpbGUgc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nCisgIC1zdGF0aWMgICAgICAgICAgIG9ubHkgYnVpbGQgYSBcYC5vJyBmaWxlIHN1aXRhYmxlIGZvciBzdGF0aWMgbGlua2luZworCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KKworVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCitTT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKK2xpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKKyAgICAgICAgOzsKKworICAgICAgZXhlY3V0ZSkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KKworQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCisKK1RoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKK2ZsYWdzLgorCitJZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCitpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKK2RpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgorCitUaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKKyAgICAgICAgOzsKKworICAgICAgZmluaXNoKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCisKK0NvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCisKK0VhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCisKK1RoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQordGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCisgICAgICAgIDs7CisKKyAgICAgIGluc3RhbGwpCisgICAgICAgICRFQ0hPIFwKKyJVc2FnZTogJHByb2duYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgorCitJbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KKworSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCitlaXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIElOU1RBTEwtQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWluc3QtcHJlZml4IFBSRUZJWC1ESVIgIFVzZSBQUkVGSVgtRElSIGFzIGEgc3RhZ2luZyBhcmVhIGZvciBpbnN0YWxsYXRpb24KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICAgICAgICA7OworCisgICAgICBsaW5rKQorICAgICAgICAkRUNITyBcCisiVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1hdm9pZC12ZXJzaW9uICAgIGRvIG5vdCBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCBpZiBwb3NzaWJsZQorICAtZGxvcGVuIEZJTEUgICAgICBcYC1kbHByZW9wZW4nIEZJTEUgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkIGF0IHJ1bnRpbWUKKyAgLWRscHJlb3BlbiBGSUxFICAgbGluayBpbiBGSUxFIGFuZCBhZGQgaXRzIHN5bWJvbHMgdG8gbHRfcHJlbG9hZGVkX3N5bWJvbHMKKyAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKKyAgLWV4cG9ydC1zeW1ib2xzIFNZTUZJTEUKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGV4cG9ydCBvbmx5IHRoZSBzeW1ib2xzIGxpc3RlZCBpbiBTWU1GSUxFCisgIC1leHBvcnQtc3ltYm9scy1yZWdleCBSRUdFWAorICAgICAgICAgICAgICAgICAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbWF0Y2hpbmcgUkVHRVgKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKKyAgLW5vLWZhc3QtaW5zdGFsbCAgZGlzYWJsZSB0aGUgZmFzdC1pbnN0YWxsIG1vZGUKKyAgLW5vLWluc3RhbGwgICAgICAgbGluayBhIG5vdC1pbnN0YWxsYWJsZSBleGVjdXRhYmxlCisgIC1uby11bmRlZmluZWQgICAgIGRlY2xhcmUgdGhhdCBhIGxpYnJhcnkgZG9lcyBub3QgcmVmZXIgdG8gZXh0ZXJuYWwgc3ltYm9scworICAtbyBPVVRQVVQtRklMRSAgICBjcmVhdGUgT1VUUFVULUZJTEUgZnJvbSB0aGUgc3BlY2lmaWVkIG9iamVjdHMKKyAgLW9iamVjdGxpc3QgRklMRSAgVXNlIGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgZm91bmQgaW4gRklMRSB0byBzcGVjaWZ5IG9iamVjdHMKKyAgLXByZWNpb3VzLWZpbGVzLXJlZ2V4IFJFR0VYCisgICAgICAgICAgICAgICAgICAgIGRvbid0IHJlbW92ZSBvdXRwdXQgZmlsZXMgbWF0Y2hpbmcgUkVHRVgKKyAgLXJlbGVhc2UgUkVMRUFTRSAgc3BlY2lmeSBwYWNrYWdlIHJlbGVhc2UgaW5mb3JtYXRpb24KKyAgLXJwYXRoIExJQkRJUiAgICAgdGhlIGNyZWF0ZWQgbGlicmFyeSB3aWxsIGV2ZW50dWFsbHkgYmUgaW5zdGFsbGVkIGluIExJQkRJUgorICAtUlsgXUxJQkRJUiAgICAgICBhZGQgTElCRElSIHRvIHRoZSBydW50aW1lIHBhdGggb2YgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcworICAtc2hhcmVkICAgICAgICAgICBvbmx5IGRvIGR5bmFtaWMgbGlua2luZyBvZiBsaWJ0b29sIGxpYnJhcmllcworICAtc2hyZXh0IFNVRkZJWCAgICBvdmVycmlkZSB0aGUgc3RhbmRhcmQgc2hhcmVkIGxpYnJhcnkgZmlsZSBleHRlbnNpb24KKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXN0YXRpYy1saWJ0b29sLWxpYnMKKyAgICAgICAgICAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQorICAtd2VhayBMSUJOQU1FICAgICBkZWNsYXJlIHRoYXQgdGhlIHRhcmdldCBwcm92aWRlcyB0aGUgTElCTkFNRSBpbnRlcmZhY2UKKworQWxsIG90aGVyIG9wdGlvbnMgKGFyZ3VtZW50cyBiZWdpbm5pbmcgd2l0aCBcYC0nKSBhcmUgaWdub3JlZC4KKworRXZlcnkgb3RoZXIgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGVuYW1lLiAgRmlsZXMgZW5kaW5nIGluIFxgLmxhJyBhcmUKK3RyZWF0ZWQgYXMgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMsIG90aGVyIGZpbGVzIGFyZSBzdGFuZGFyZCBvciBsaWJyYXJ5CitvYmplY3QgZmlsZXMuCisKK0lmIHRoZSBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxhJywgdGhlbiBhIGxpYnRvb2wgbGlicmFyeSBpcyBjcmVhdGVkLAorb25seSBsaWJyYXJ5IG9iamVjdHMgKFxgLmxvJyBmaWxlcykgbWF5IGJlIHNwZWNpZmllZCwgYW5kIFxgLXJwYXRoJyBpcworcmVxdWlyZWQsIGV4Y2VwdCB3aGVuIGNyZWF0aW5nIGEgY29udmVuaWVuY2UgbGlicmFyeS4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5hJyBvciBcYC5saWInLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkCit1c2luZyBcYGFyJyBhbmQgXGByYW5saWInLCBvciBvbiBXaW5kb3dzIHVzaW5nIFxgbGliJy4KKworSWYgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sbycgb3IgXGAuJHtvYmpleHR9JywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUKK2lzIGNyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgICAgICAgIDs7CisKKyAgICAgIHVuaW5zdGFsbCkKKyAgICAgICAgJEVDSE8gXAorIlVzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gLS1tb2RlPXVuaW5zdGFsbCBSTSBbUk0tT1BUSU9OXS4uLiBGSUxFLi4uCisKK1JlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCitSTSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byB1c2UgdG8gZGVsZXRlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIEZJTEUKKyh0eXBpY2FsbHkgXGAvYmluL3JtJykuICBSTS1PUFRJT05TIGFyZSBvcHRpb25zIChzdWNoIGFzIFxgLWYnKSB0byBiZSBwYXNzZWQKK3RvIFJNLgorCitJZiBGSUxFIGlzIGEgbGlidG9vbCBsaWJyYXJ5LCBhbGwgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgZGVsZXRlZC4KK090aGVyd2lzZSwgb25seSBGSUxFIGl0c2VsZiBpcyBkZWxldGVkIHVzaW5nIFJNLiIKKyAgICAgICAgOzsKKworICAgICAgKikKKyAgICAgICAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgorICAgICAgICA7OworICAgIGVzYWMKKworICAgICRFQ0hPCisgICAgJEVDSE8gIlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKKworICAgIGV4aXQgJD8KK30KKworICAjIE5vdyB0aGF0IHdlJ3ZlIGNvbGxlY3RlZCBhIHBvc3NpYmxlIC0tbW9kZSBhcmcsIHNob3cgaGVscCBpZiBuZWNlc3NhcnkKKyAgJG9wdF9oZWxwICYmIGZ1bmNfbW9kZV9oZWxwCisKKworIyBmdW5jX21vZGVfZXhlY3V0ZSBhcmcuLi4KK2Z1bmNfbW9kZV9leGVjdXRlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjb21tYW5kIG5hbWUuCisgICAgY21kPSIkbm9ub3B0IgorICAgIHRlc3QgLXogIiRjbWQiICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiCisKKyAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgorICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCisgICAgICB0ZXN0IC1mICIkZmlsZSIgXAorCXx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgZmlsZSIKKworICAgICAgZGlyPQorICAgICAgY2FzZSAkZmlsZSBpbgorICAgICAgKi5sYSkKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgorCWZ1bmNfbGFsaWJfdW5zYWZlX3AgIiRmaWxlIiBcCisJICB8fCBmdW5jX2ZhdGFsX2hlbHAgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCisJZGxuYW1lPQorCWxpYnJhcnlfbmFtZXM9CisJZnVuY19zb3VyY2UgIiRmaWxlIgorCisJIyBTa2lwIHRoaXMgbGlicmFyeSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQuCisJaWYgdGVzdCAteiAiJGRsbmFtZSI7IHRoZW4KKwkgICMgV2FybiBpZiBpdCB3YXMgYSBzaGFyZWQgbGlicmFyeS4KKwkgIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIiAmJiBcCisJICAgIGZ1bmNfd2FybmluZyAiXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCisJICBjb250aW51ZQorCWZpCisKKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCisJICBkaXI9IiRkaXIvJG9iamRpciIKKwllbHNlCisJICBpZiB0ZXN0ICEgLWYgIiRkaXIvJGRsbmFtZSI7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiIiAiLiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCTs7CisKKyAgICAgICopCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAtKikgOzsKKyAgICAgICopCisJIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICIkZmlsZSIKKwkgICMgVHJhbnNmb3JtIGFyZyB0byB3cmFwcGVkIG5hbWUuCisJICBmaWxlPSIkcHJvZ2Rpci8kcHJvZ3JhbSIKKwllbGlmIGZ1bmNfbHR3cmFwcGVyX2V4ZWN1dGFibGVfcCAiJGZpbGUiOyB0aGVuCisJICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgIGZ1bmNfc291cmNlICIkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQiCisJICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgorCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmaWxlIgorICAgICAgYXJncz0iJGFyZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgIlgkb3B0X2RyeV9ydW4iID0gWGZhbHNlOyB0aGVuCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKwkjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KKwlldmFsICJleHBvcnQgJHNobGlicGF0aF92YXIiCisgICAgICBmaQorCisgICAgICAjIFJlc3RvcmUgc2F2ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICBmb3IgbHRfdmFyIGluIExBTkcgTEFOR1VBR0UgTENfQUxMIExDX0NUWVBFIExDX0NPTExBVEUgTENfTUVTU0FHRVMKKyAgICAgIGRvCisJZXZhbCAiaWYgdGVzdCBcIlwke3NhdmVfJGx0X3ZhcitzZXR9XCIgPSBzZXQ7IHRoZW4KKyAgICAgICAgICAgICAgICAkbHRfdmFyPVwkc2F2ZV8kbHRfdmFyOyBleHBvcnQgJGx0X3ZhcgorCSAgICAgIGVsc2UKKwkJJGx0X3Vuc2V0ICRsdF92YXIKKwkgICAgICBmaSIKKyAgICAgIGRvbmUKKworICAgICAgIyBOb3cgcHJlcGFyZSB0byBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXhlY19jbWQ9IlwkY21kJGFyZ3MiCisgICAgZWxzZQorICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KKyAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorCWV2YWwgIlwkRUNITyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCisJJEVDSE8gImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKKyAgICAgIGZpCisgICAgICAkRUNITyAiJGNtZCRhcmdzIgorICAgICAgZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgZmkKK30KKwordGVzdCAiJG1vZGUiID0gZXhlY3V0ZSAmJiBmdW5jX21vZGVfZXhlY3V0ZSAkezErIiRAIn0KKworCisjIGZ1bmNfbW9kZV9maW5pc2ggYXJnLi4uCitmdW5jX21vZGVfZmluaXNoICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGxpYmRpcnM9IiRub25vcHQiCisgICAgYWRtaW5jbWRzPQorCisgICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KKyAgICAgIGZvciBkaXIKKyAgICAgIGRvCisJbGliZGlycz0iJGxpYmRpcnMgJGRpciIKKyAgICAgIGRvbmUKKworICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRmaW5pc2hfY21kcyIgJ2FkbWluY21kcz0iJGFkbWluY21kcworJyIkY21kIiciJworCWZpCisJaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgorCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKKwkgICRvcHRfZHJ5X3J1biB8fCBldmFsICIkY21kcyIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCisgICAgICAgJGNtZHMiCisJZmkKKyAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIyBFeGl0IGhlcmUgaWYgdGhleSB3YW50ZWQgc2lsZW50IG1vZGUuCisgICAgJG9wdF9zaWxlbnQgJiYgZXhpdCAkRVhJVF9TVUNDRVNTCisKKyAgICAkRUNITyAiWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIHwgJFhzZWQKKyAgICAkRUNITyAiTGlicmFyaWVzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW46IgorICAgIGZvciBsaWJkaXIgaW4gJGxpYmRpcnM7IGRvCisgICAgICAkRUNITyAiICAgJGxpYmRpciIKKyAgICBkb25lCisgICAgJEVDSE8KKyAgICAkRUNITyAiSWYgeW91IGV2ZXIgaGFwcGVuIHRvIHdhbnQgdG8gbGluayBhZ2FpbnN0IGluc3RhbGxlZCBsaWJyYXJpZXMiCisgICAgJEVDSE8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgorICAgICRFQ0hPICJzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBsaWJyYXJ5LCBvciB1c2UgdGhlIFxgLUxMSUJESVInIgorICAgICRFQ0hPICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCisgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCisgICAgICAkRUNITyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRzaGxpYnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgICRFQ0hPICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAkRUNITyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICAkRUNITyAiICAgICBkdXJpbmcgbGlua2luZyIKKyAgICBmaQorICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgbGliZGlyPUxJQkRJUgorICAgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorCisgICAgICAkRUNITyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgIGZpCisgICAgaWYgdGVzdCAtbiAiJGFkbWluY21kcyI7IHRoZW4KKyAgICAgICRFQ0hPICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCisgICAgICAkRUNITyAiICAgLSBoYXZlIHlvdXIgc3lzdGVtIGFkbWluaXN0cmF0b3IgYWRkIExJQkRJUiB0byBcYC9ldGMvbGQuc28uY29uZiciCisgICAgZmkKKyAgICAkRUNITworCisgICAgJEVDSE8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgorICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgIHNvbGFyaXMyLls2Nzg5XXxzb2xhcmlzMi4xWzAtOV0pCisgICAgICAgICRFQ0hPICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSwgY3JsZSgxKSBhbmQgbGQuc28oOCkgbWFudWFsIgorCSRFQ0hPICJwYWdlcy4iCisJOzsKKyAgICAgICopCisgICAgICAgICRFQ0hPICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKKyAgICAgICAgOzsKKyAgICBlc2FjCisgICAgJEVDSE8gIlgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIiB8ICRYc2VkCisgICAgZXhpdCAkRVhJVF9TVUNDRVNTCit9CisKK3Rlc3QgIiRtb2RlIiA9IGZpbmlzaCAmJiBmdW5jX21vZGVfZmluaXNoICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX2luc3RhbGwgYXJnLi4uCitmdW5jX21vZGVfaW5zdGFsbCAoKQoreworICAgICRvcHRfZGVidWcKKyAgICAjIFRoZXJlIG1heSBiZSBhbiBvcHRpb25hbCBzaCgxKSBhcmd1bWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgICAgIyBpbnN0YWxsX3Byb2cgKGVzcGVjaWFsbHkgb24gV2luZG93cyBOVCkuCisgICAgaWYgdGVzdCAiJG5vbm9wdCIgPSAiJFNIRUxMIiB8fCB0ZXN0ICIkbm9ub3B0IiA9IC9iaW4vc2ggfHwKKyAgICAgICAjIEFsbG93IHRoZSB1c2Ugb2YgR05VIHNodG9vbCdzIGluc3RhbGwgY29tbWFuZC4KKyAgICAgICAkRUNITyAiWCRub25vcHQiIHwgJEdSRVAgc2h0b29sID4vZGV2L251bGw7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRub25vcHQiCisgICAgICBpbnN0YWxsX3Byb2c9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCAiCisgICAgICBhcmc9JDEKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSRub25vcHQKKyAgICBmaQorCisgICAgIyBUaGUgcmVhbCBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbGxhdGlvbiBwcm9ncmFtLgorICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKworICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KKyAgICBkZXN0PQorICAgIGZpbGVzPQorICAgIG9wdHM9CisgICAgcHJldj0KKyAgICBpbnN0YWxsX3R5cGU9CisgICAgaXNkaXI9bm8KKyAgICBzdHJpcG1lPQorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCisJZmlsZXM9IiRmaWxlcyAkZGVzdCIKKwlkZXN0PSRhcmcKKwljb250aW51ZQorICAgICAgZmkKKworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZCkgaXNkaXI9eWVzIDs7CisgICAgICAtZikKKwljYXNlICIgJGluc3RhbGxfcHJvZyAiIGluCisJKltcXFwgL11jcFwgKikgOzsKKwkqKSBwcmV2PSRhcmcgOzsKKwllc2FjCisJOzsKKyAgICAgIC1nIHwgLW0gfCAtbykKKwlwcmV2PSRhcmcKKwk7OworICAgICAgLXMpCisJc3RyaXBtZT0iIC1zIgorCWNvbnRpbnVlCisJOzsKKyAgICAgIC0qKQorCTs7CisgICAgICAqKQorCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKwlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKwkgIHByZXY9CisJZWxzZQorCSAgZGVzdD0kYXJnCisJICBjb250aW51ZQorCWZpCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorICAgIGRvbmUKKworICAgIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciICYmIFwKKyAgICAgIGZ1bmNfZmF0YWxfaGVscCAieW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCisJZnVuY19mYXRhbF9oZWxwICJubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKKyAgICAgIGVsc2UKKwlmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIKKyAgICAgIGZpCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGZ1bmNfc3RyaXBuYW1lICcnICcvJyAiJGRlc3QiCisgICAgZGVzdD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBmdW5jX2Rpcm5hbWVfYW5kX2Jhc2VuYW1lICIkZGVzdCIgIiIgIi4iCisgICAgICBkZXN0ZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKyAgICAgIGRlc3RuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisKKyAgICAgICMgTm90IGEgZGlyZWN0b3J5LCBzbyBjaGVjayB0byBzZWUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmaWxlIHNwZWNpZmllZC4KKyAgICAgIHNldCBkdW1teSAkZmlsZXM7IHNoaWZ0CisgICAgICB0ZXN0ICIkIyIgLWd0IDEgJiYgXAorCWZ1bmNfZmF0YWxfaGVscCAiXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IgorICAgIGZpCisgICAgY2FzZSAkZGVzdGRpciBpbgorICAgIFtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKyAgICAqKQorICAgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworCWNhc2UgJGZpbGUgaW4KKwkqLmxvKSA7OworCSopCisJICBmdW5jX2ZhdGFsX2hlbHAgIlxgJGRlc3RkaXInIG11c3QgYmUgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUiCisJICA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICRmaWxlIGluCisgICAgICAqLiRsaWJleHQpCisJIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKwlzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZmlsZSIKKwk7OworCisgICAgICAqLmxhKQorCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGZpbGUiIFwKKwkgIHx8IGZ1bmNfZmF0YWxfaGVscCAiXGAkZmlsZScgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCisJbGlicmFyeV9uYW1lcz0KKwlvbGRfbGlicmFyeT0KKwlyZWxpbmtfY29tbWFuZD0KKwlmdW5jX3NvdXJjZSAiJGZpbGUiCisKKwkjIEFkZCB0aGUgbGliZGlyIHRvIGN1cnJlbnRfbGliZGlycyBpZiBpdCBpcyB0aGUgZGVzdGluYXRpb24uCisJaWYgdGVzdCAiWCRkZXN0ZGlyIiA9ICJYJGxpYmRpciI7IHRoZW4KKwkgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGN1cnJlbnRfbGliZGlycz0iJGN1cnJlbnRfbGliZGlycyAkbGliZGlyIiA7OworCSAgZXNhYworCWVsc2UKKwkgICMgTm90ZSB0aGUgbGliZGlyIGFzIGEgZnV0dXJlIGxpYmRpci4KKwkgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZnV0dXJlX2xpYmRpcnM9IiRmdXR1cmVfbGliZGlycyAkbGliZGlyIiA7OworCSAgZXNhYworCWZpCisKKwlmdW5jX2Rpcm5hbWUgIiRmaWxlIiAiLyIgIiIKKwlkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCWRpcj0iJGRpciRvYmpkaXIiCisKKwlpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJICAjIERldGVybWluZSB0aGUgcHJlZml4IHRoZSB1c2VyIGhhcyBhcHBsaWVkIHRvIG91ciBmdXR1cmUgZGlyLgorCSAgaW5zdF9wcmVmaXhfZGlyPWAkRUNITyAiWCRkZXN0ZGlyIiB8ICRYc2VkIC1lICJzJSRsaWJkaXJcJCUlImAKKworCSAgIyBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBwbGFjZSB1cyBvdXRzaWRlIG9mIG91ciBleHBlY3RlZAorCSAgIyBsb2NhdGlvbiBiL2MgdGhpcyBwcmV2ZW50cyBmaW5kaW5nIGRlcGVuZGVudCBsaWJyYXJpZXMgdGhhdAorCSAgIyBhcmUgaW5zdGFsbGVkIHRvIHRoZSBzYW1lIHByZWZpeC4KKwkgICMgQXQgcHJlc2VudCwgdGhpcyBjaGVjayBkb2Vzbid0IGFmZmVjdCB3aW5kb3dzIC5kbGwncyB0aGF0CisJICAjIGFyZSBpbnN0YWxsZWQgaW50byAkbGliZGlyLy4uL2JpbiAoY3VycmVudGx5LCB0aGF0IHdvcmtzIGZpbmUpCisJICAjIGJ1dCBpdCdzIHNvbWV0aGluZyB0byBrZWVwIGFuIGV5ZSBvbi4KKwkgIHRlc3QgIiRpbnN0X3ByZWZpeF9kaXIiID0gIiRkZXN0ZGlyIiAmJiBcCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImVycm9yOiBjYW5ub3QgaW5zdGFsbCBcYCRmaWxlJyB0byBhIGRpcmVjdG9yeSBub3QgZW5kaW5nIGluICRsaWJkaXIiCisKKwkgIGlmIHRlc3QgLW4gIiRpbnN0X3ByZWZpeF9kaXIiOyB0aGVuCisJICAgICMgU3RpY2sgdGhlIGluc3RfcHJlZml4X2RpciBkYXRhIGludG8gdGhlIGxpbmsgY29tbWFuZC4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBpbnN0X3ByZWZpeF9kaXJAJS1pbnN0LXByZWZpeC1kaXIgJGluc3RfcHJlZml4X2RpciUiYAorCSAgZWxzZQorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQGluc3RfcHJlZml4X2RpckAlJSJgCisJICBmaQorCisJICBmdW5jX3dhcm5pbmcgInJlbGlua2luZyBcYCRmaWxlJyIKKwkgIGZ1bmNfc2hvd19ldmFsICIkcmVsaW5rX2NvbW1hbmQiIFwKKwkgICAgJ2Z1bmNfZmF0YWxfZXJyb3IgImVycm9yOiByZWxpbmsgXGAkZmlsZSdcJycgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCInCisJZmkKKworCSMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisJc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzOyBzaGlmdAorCWlmIHRlc3QgLW4gIiQxIjsgdGhlbgorCSAgcmVhbG5hbWU9IiQxIgorCSAgc2hpZnQKKworCSAgc3JjbmFtZT0iJHJlYWxuYW1lIgorCSAgdGVzdCAtbiAiJHJlbGlua19jb21tYW5kIiAmJiBzcmNuYW1lPSIkcmVhbG5hbWUiVAorCisJICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZGlyLyRzcmNuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIgXAorCSAgICAgICdleGl0ICQ/JworCSAgdHN0cmlwbWU9IiRzdHJpcG1lIgorCSAgY2FzZSAkaG9zdF9vcyBpbgorCSAgY3lnd2luKiB8IG1pbmd3KiB8IHB3MzIqIHwgY2VnY2MqKQorCSAgICBjYXNlICRyZWFsbmFtZSBpbgorCSAgICAqLmRsbC5hKQorCSAgICAgIHRzdHJpcG1lPSIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgZXNhYworCSAgaWYgdGVzdCAtbiAiJHRzdHJpcG1lIiAmJiB0ZXN0IC1uICIkc3RyaXBsaWIiOyB0aGVuCisJICAgIGZ1bmNfc2hvd19ldmFsICIkc3RyaXBsaWIgJGRlc3RkaXIvJHJlYWxuYW1lIiAnZXhpdCAkPycKKwkgIGZpCisKKwkgIGlmIHRlc3QgIiQjIiAtZ3QgMDsgdGhlbgorCSAgICAjIERlbGV0ZSB0aGUgb2xkIHN5bWxpbmtzLCBhbmQgY3JlYXRlIG5ldyBvbmVzLgorCSAgICAjIFRyeSBgbG4gLXNmJyBmaXJzdCwgYmVjYXVzZSB0aGUgYGxuJyBiaW5hcnkgbWlnaHQgZGVwZW5kIG9uCisJICAgICMgdGhlIHN5bWxpbmsgd2UgcmVwbGFjZSEgIFNvbGFyaXMgL2Jpbi9sbiBkb2VzIG5vdCB1bmRlcnN0YW5kIC1mLAorCSAgICAjIHNvIHdlIGFsc28gbmVlZCB0byB0cnkgcm0gJiYgbG4gLXMuCisJICAgIGZvciBsaW5rbmFtZQorCSAgICBkbworCSAgICAgIHRlc3QgIiRsaW5rbmFtZSIgIT0gIiRyZWFsbmFtZSIgXAorCQkmJiBmdW5jX3Nob3dfZXZhbCAiKGNkICRkZXN0ZGlyICYmIHsgJExOX1MgLWYgJHJlYWxuYW1lICRsaW5rbmFtZSB8fCB7ICRSTSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZTsgfTsgfSkiCisJICAgIGRvbmUKKwkgIGZpCisKKwkgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKwkgIGxpYj0iJGRlc3RkaXIvJHJlYWxuYW1lIgorCSAgZnVuY19leGVjdXRlX2NtZHMgIiRwb3N0aW5zdGFsbF9jbWRzIiAnZXhpdCAkPycKKwlmaQorCisJIyBJbnN0YWxsIHRoZSBwc2V1ZG8tbGlicmFyeSBmb3IgaW5mb3JtYXRpb24gcHVycG9zZXMuCisJZnVuY19iYXNlbmFtZSAiJGZpbGUiCisJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCWluc3RuYW1lPSIkZGlyLyRuYW1lImkKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkaW5zdG5hbWUgJGRlc3RkaXIvJG5hbWUiICdleGl0ICQ/JworCisJIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorCXRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGRpci8kb2xkX2xpYnJhcnkiCisJOzsKKworICAgICAgKi5sbykKKwkjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisJY2FzZSAkZGVzdGZpbGUgaW4KKwkqLmxvKQorCSAgZnVuY19sbzJvICIkZGVzdGZpbGUiCisJICBzdGF0aWNkZXN0PSRmdW5jX2xvMm9fcmVzdWx0CisJICA7OworCSouJG9iamV4dCkKKwkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKKwkgIGRlc3RmaWxlPQorCSAgOzsKKwkqKQorCSAgZnVuY19mYXRhbF9oZWxwICJjYW5ub3QgY29weSBhIGxpYnRvb2wgb2JqZWN0IHRvIFxgJGRlc3RmaWxlJyIKKwkgIDs7CisJZXNhYworCisJIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisJdGVzdCAtbiAiJGRlc3RmaWxlIiAmJiBcCisJICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiICdleGl0ICQ/JworCisJIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCisJaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKwkgIGZ1bmNfbG8ybyAiJGZpbGUiCisJICBzdGF0aWNvYmo9JGZ1bmNfbG8yb19yZXN1bHQKKwkgIGZ1bmNfc2hvd19ldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgJ2V4aXQgJD8nCisJZmkKKwlleGl0ICRFWElUX1NVQ0NFU1MKKwk7OworCisgICAgICAqKQorCSMgRmlndXJlIG91dCBkZXN0aW5hdGlvbiBmaWxlIG5hbWUsIGlmIGl0IHdhc24ndCBhbHJlYWR5IHNwZWNpZmllZC4KKwlpZiB0ZXN0IC1uICIkZGVzdG5hbWUiOyB0aGVuCisJICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorCWVsc2UKKwkgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorCSAgZGVzdGZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCisJZmkKKworCSMgSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYW5kIHRoZXJlIGlzIGEgLmV4ZSBvbiB0aGUgZW5kLCBzdHJpcCBpdAorCSMgYmVjYXVzZSBpdCBpcyBtb3N0IGxpa2VseSBhIGxpYnRvb2wgc2NyaXB0IHdlIGFjdHVhbGx5IHdhbnQgdG8KKwkjIGluc3RhbGwKKwlzdHJpcHBlZF9leHQ9IiIKKwljYXNlICRmaWxlIGluCisJICAqLmV4ZSkKKwkgICAgaWYgdGVzdCAhIC1mICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICAgIGZpbGU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIHN0cmlwcGVkX2V4dD0iLmV4ZSIKKwkgICAgZmkKKwkgICAgOzsKKwllc2FjCisKKwkjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyByZWFsbHkgYSBsaWJ0b29sIHByb2dyYW0uCisJY2FzZSAkaG9zdCBpbgorCSpjeWd3aW4qIHwgKm1pbmd3KikKKwkgICAgaWYgZnVuY19sdHdyYXBwZXJfZXhlY3V0YWJsZV9wICIkZmlsZSI7IHRoZW4KKwkgICAgICBmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICBlbHNlCisJICAgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkZmlsZSIKKwkgICAgICB3cmFwcGVyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZmkKKwkgICAgOzsKKwkqKQorCSAgICB3cmFwcGVyPSRmaWxlCisJICAgIDs7CisJZXNhYworCWlmIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdF9wICIkd3JhcHBlciI7IHRoZW4KKwkgIG5vdGluc3RfZGVwbGlicz0KKwkgIHJlbGlua19jb21tYW5kPQorCisJICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCisKKwkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorCSAgdGVzdCAteiAiJGdlbmVyYXRlZF9ieV9saWJ0b29sX3ZlcnNpb24iICYmIFwKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiaW52YWxpZCBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IFxgJHdyYXBwZXInIgorCisJICBmaW5hbGl6ZT15ZXMKKwkgIGZvciBsaWIgaW4gJG5vdGluc3RfZGVwbGliczsgZG8KKwkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgorCSAgICBsaWJkaXI9CisJICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCisJICAgICAgZnVuY19zb3VyY2UgIiRsaWIiCisJICAgIGZpCisJICAgIGxpYmZpbGU9IiRsaWJkaXIvImAkRUNITyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgICMjIyB0ZXN0c3VpdGU6IHNraXAgbmVzdGVkIHF1b3RpbmcgdGVzdAorCSAgICBpZiB0ZXN0IC1uICIkbGliZGlyIiAmJiB0ZXN0ICEgLWYgIiRsaWJmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfd2FybmluZyAiXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciCisJICAgICAgZmluYWxpemU9bm8KKwkgICAgZmkKKwkgIGRvbmUKKworCSAgcmVsaW5rX2NvbW1hbmQ9CisJICBmdW5jX3NvdXJjZSAiJHdyYXBwZXIiCisKKwkgIG91dHB1dG5hbWU9CisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBpZiB0ZXN0ICIkZmluYWxpemUiID0geWVzOyB0aGVuCisJICAgICAgICB0bXBkaXI9YGZ1bmNfbWt0ZW1wZGlyYAorCQlmdW5jX2Jhc2VuYW1lICIkZmlsZSRzdHJpcHBlZF9leHQiCisJCWZpbGU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkgICAgICAgIG91dHB1dG5hbWU9IiR0bXBkaXIvJGZpbGUiCisJICAgICAgICAjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJICAgICAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkcmVsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0bmFtZSInJWcnYAorCisJICAgICAgICAkb3B0X3NpbGVudCB8fCB7CisJICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJHJlbGlua19jb21tYW5kIgorCQkgIGV2YWwgImZ1bmNfZWNobyAkZnVuY19xdW90ZV9mb3JfZXhwYW5kX3Jlc3VsdCIKKwkgICAgICAgIH0KKwkgICAgICAgIGlmIGV2YWwgIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4gOgorCSAgICAgICAgICBlbHNlCisJCSAgZnVuY19lcnJvciAiZXJyb3I6IHJlbGluayBcYCRmaWxlJyB3aXRoIHRoZSBhYm92ZSBjb21tYW5kIGJlZm9yZSBpbnN0YWxsaW5nIGl0IgorCQkgICRvcHRfZHJ5X3J1biB8fCAke1JNfXIgIiR0bXBkaXIiCisJCSAgY29udGludWUKKwkgICAgICAgIGZpCisJICAgICAgICBmaWxlPSIkb3V0cHV0bmFtZSIKKwkgICAgICBlbHNlCisJICAgICAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCByZWxpbmsgXGAkZmlsZSciCisJICAgICAgZmkKKwkgICAgfQorCSAgZWxzZQorCSAgICAjIEluc3RhbGwgdGhlIGJpbmFyeSB0aGF0IHdlIGNvbXBpbGVkIGVhcmxpZXIuCisJICAgIGZpbGU9YCRFQ0hPICJYJGZpbGUkc3RyaXBwZWRfZXh0IiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAorCSAgZmkKKwlmaQorCisJIyByZW1vdmUgLmV4ZSBzaW5jZSBjeWd3aW4gL3Vzci9iaW4vaW5zdGFsbCB3aWxsIGFwcGVuZCBhbm90aGVyCisJIyBvbmUgYW55d2F5CisJY2FzZSAkaW5zdGFsbF9wcm9nLCRob3N0IGluCisJKi91c3IvYmluL2luc3RhbGwqLCpjeWd3aW4qKQorCSAgY2FzZSAkZmlsZTokZGVzdGZpbGUgaW4KKwkgICouZXhlOiouZXhlKQorCSAgICAjIHRoaXMgaXMgb2sKKwkgICAgOzsKKwkgICouZXhlOiopCisJICAgIGRlc3RmaWxlPSRkZXN0ZmlsZS5leGUKKwkgICAgOzsKKwkgICo6Ki5leGUpCisJICAgIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJGRlc3RmaWxlIgorCSAgICBkZXN0ZmlsZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgIDs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwlmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0ZmlsZSIgJ2V4aXQgJD8nCisJJG9wdF9kcnlfcnVuIHx8IGlmIHRlc3QgLW4gIiRvdXRwdXRuYW1lIjsgdGhlbgorCSAgJHtSTX1yICIkdG1wZGlyIgorCWZpCisJOzsKKyAgICAgIGVzYWMKKyAgICBkb25lCisKKyAgICBmb3IgZmlsZSBpbiAkc3RhdGljbGliczsgZG8KKyAgICAgIGZ1bmNfYmFzZW5hbWUgIiRmaWxlIgorICAgICAgbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisgICAgICAjIFNldCB1cCB0aGUgcmFubGliIHBhcmFtZXRlcnMuCisgICAgICBvbGRsaWI9IiRkZXN0ZGlyLyRuYW1lIgorCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJGluc3RhbGxfcHJvZyBcJGZpbGUgXCRvbGRsaWIiICdleGl0ICQ/JworCisgICAgICBpZiB0ZXN0IC1uICIkc3RyaXBtZSIgJiYgdGVzdCAtbiAiJG9sZF9zdHJpcGxpYiI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAiJG9sZF9zdHJpcGxpYiAkb2xkbGliIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX3Bvc3RpbnN0YWxsX2NtZHMiICdleGl0ICQ/JworICAgIGRvbmUKKworICAgIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyIgJiYgXAorICAgICAgZnVuY193YXJuaW5nICJyZW1lbWJlciB0byBydW4gXGAkcHJvZ25hbWUgLS1maW5pc2gkZnV0dXJlX2xpYmRpcnMnIgorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gJiYgY3VycmVudF9saWJkaXJzPSIgLW4kY3VycmVudF9saWJkaXJzIgorICAgICAgZXhlY19jbWQ9JyRTSEVMTCAkcHJvZ3BhdGggJHByZXNlcnZlX2FyZ3MgLS1maW5pc2gkY3VycmVudF9saWJkaXJzJworICAgIGVsc2UKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgIGZpCit9CisKK3Rlc3QgIiRtb2RlIiA9IGluc3RhbGwgJiYgZnVuY19tb2RlX2luc3RhbGwgJHsxKyIkQCJ9CisKKworIyBmdW5jX2dlbmVyYXRlX2Rsc3ltcyBvdXRwdXRuYW1lIG9yaWdpbmF0b3IgcGljX3AKKyMgRXh0cmFjdCBzeW1ib2xzIGZyb20gZGxwcmVmaWxlcyBhbmQgY3JlYXRlICR7b3V0cHV0bmFtZX1TLm8gd2l0aAorIyBhIGRscHJlb3BlbiBzeW1ib2wgdGFibGUuCitmdW5jX2dlbmVyYXRlX2Rsc3ltcyAoKQoreworICAgICRvcHRfZGVidWcKKyAgICBteV9vdXRwdXRuYW1lPSIkMSIKKyAgICBteV9vcmlnaW5hdG9yPSIkMiIKKyAgICBteV9waWNfcD0iJHszLW5vfSIKKyAgICBteV9wcmVmaXg9YCRFQ0hPICIkbXlfb3JpZ2luYXRvciIgfCBzZWQgJ3MlW15hLXpBLVowLTldJV8lZydgCisgICAgbXlfZGxzeW1zPQorCisgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgIT0gbm87IHRoZW4KKyAgICAgIGlmIHRlc3QgLW4gIiROTSIgJiYgdGVzdCAtbiAiJGdsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KKwlteV9kbHN5bXM9IiR7bXlfb3V0cHV0bmFtZX1TLmMiCisgICAgICBlbHNlCisJZnVuY19lcnJvciAibm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJG15X2Rsc3ltcyI7IHRoZW4KKyAgICAgIGNhc2UgJG15X2Rsc3ltcyBpbgorICAgICAgIiIpIDs7CisgICAgICAqLmMpCisJIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKwlubGlzdD0iJG91dHB1dF9vYmpkaXIvJHtteV9vdXRwdXRuYW1lfS5ubSIKKworCWZ1bmNfc2hvd19ldmFsICIkUk0gJG5saXN0ICR7bmxpc3R9UyAke25saXN0fVQiCisKKwkjIFBhcnNlIHRoZSBuYW1lIGxpc3QgaW50byBhIHNvdXJjZSBmaWxlLgorCWZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgJG91dHB1dF9vYmpkaXIvJG15X2Rsc3ltcyIKKworCSRvcHRfZHJ5X3J1biB8fCAkRUNITyA+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorLyogJG15X2Rsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRteV9vdXRwdXRuYW1lJyBkbHN5bSBlbXVsYXRpb24uICovCisvKiBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuIFwiQ1wiIHsKKyNlbmRpZgorCisvKiBFeHRlcm5hbCBzeW1ib2wgZGVjbGFyYXRpb25zIGZvciB0aGUgY29tcGlsZXIuICovXAorIgorCisJaWYgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KKwkgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkb3V0cHV0JyIKKworCSAgJG9wdF9kcnlfcnVuIHx8IGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgorCisJICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgc3ltYm9sIGxpc3QuCisJICBwcm9nZmlsZXM9YCRFQ0hPICJYJG9ianMkb2xkX2RlcGxpYnMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgIiRsbzJvIiB8ICROTDJTUGAKKwkgIGZvciBwcm9nZmlsZSBpbiAkcHJvZ2ZpbGVzOyBkbworCSAgICBmdW5jX3ZlcmJvc2UgImV4dHJhY3RpbmcgZ2xvYmFsIEMgc3ltYm9scyBmcm9tIFxgJHByb2dmaWxlJyIKKwkgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiROTSAkcHJvZ2ZpbGUgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorCSAgZG9uZQorCisJICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgorCSAgICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICAgIGV2YWwgJyRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCisJICAgIH0KKwkgIGZpCisKKwkgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBldmFsICckRUdSRVAgLWUgIiRleHBvcnRfc3ltYm9sc19yZWdleCIgIiRubGlzdCIgPiAiJG5saXN0IlQnCisJICAgICAgZXZhbCAnJE1WICIkbmxpc3QiVCAiJG5saXN0IicKKwkgICAgfQorCSAgZmkKKworCSAgIyBQcmVwYXJlIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHN5bWJvbHMKKwkgIGlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkUk0gJGV4cG9ydF9zeW1ib2xzCisJICAgICAgZXZhbCAiJHtTRUR9IC1uIC1lICcvXjogQFBST0dSQU1AICQvZCcgLWUgJ3MvXi4qIFwoLipcKSQvXDEvcCcgIic8ICIkbmxpc3QiID4gIiRleHBvcnRfc3ltYm9scyInCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyogKQorICAgICAgICAgICAgICAgIGV2YWwgImVjaG8gRVhQT1JUUyAiJz4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lLmRlZiInCisgICAgICAgICAgICAgICAgZXZhbCAnY2F0ICIkZXhwb3J0X3N5bWJvbHMiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgOzsKKwkgICAgICBlc2FjCisJICAgIH0KKwkgIGVsc2UKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICBldmFsICIke1NFRH0gLWUgJ3MvXChbXS5bKl4kXVwpL1xcXFxcMS9nJyAtZSAncy9eLyAvJyAtZSAncy8kLyQvJyInIDwgIiRleHBvcnRfc3ltYm9scyIgPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIicKKwkgICAgICBldmFsICckR1JFUCAtZiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZXhwIiA8ICIkbmxpc3QiID4gIiRubGlzdCJUJworCSAgICAgIGV2YWwgJyRNViAiJG5saXN0IlQgIiRubGlzdCInCisJICAgICAgY2FzZSAkaG9zdCBpbgorCSAgICAgICAgKmN5Z3dpbiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgICAgICAgICAgZXZhbCAiZWNobyBFWFBPUlRTICInPiAiJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUuZGVmIicKKwkgICAgICAgICAgZXZhbCAnY2F0ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZS5kZWYiJworCSAgICAgICAgICA7OworCSAgICAgIGVzYWMKKwkgICAgfQorCSAgZmkKKwlmaQorCisJZm9yIGRscHJlZmlsZSBpbiAkZGxwcmVmaWxlczsgZG8KKwkgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkZGxwcmVmaWxlJyIKKwkgIGZ1bmNfYmFzZW5hbWUgIiRkbHByZWZpbGUiCisJICBuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAkb3B0X2RyeV9ydW4gfHwgeworCSAgICBldmFsICckRUNITyAiOiAkbmFtZSAiID4+ICIkbmxpc3QiJworCSAgICBldmFsICIkTk0gJGRscHJlZmlsZSAyPi9kZXYvbnVsbCB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCisJICB9CisJZG9uZQorCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KKwkgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCisKKwkgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICRFR1JFUCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUCisJICAgICRNViAiJG5saXN0IlQgIiRubGlzdCIKKwkgIGZpCisKKwkgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICBpZiAkR1JFUCAtdiAiXjogIiA8ICIkbmxpc3QiIHwKKwkgICAgICBpZiBzb3J0IC1rIDMgPC9kZXYvbnVsbCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJc29ydCAtayAzCisJICAgICAgZWxzZQorCQlzb3J0ICsyCisJICAgICAgZmkgfAorCSAgICAgIHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KKwkgICAgOgorCSAgZWxzZQorCSAgICAkR1JFUCAtdiAiXjogIiA8ICIkbmxpc3QiID4gIiRubGlzdCJTCisJICBmaQorCisJICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRubGlzdCJTID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIicKKwkgIGVsc2UKKwkgICAgJEVDSE8gJy8qIE5PTkUgKi8nID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgZmkKKworCSAgJEVDSE8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgdm9pZCAqYWRkcmVzczsKK30gbHRfZGxzeW1saXN0OworIgorCSAgY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqIHwgKmNlZ2NjKiApCisJICAgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorLyogREFUQSBpbXBvcnRzIGZyb20gRExMcyBvbiBXSU4zMiBjb24ndCBiZSBjb25zdCwgYmVjYXVzZQorICAgcnVudGltZSByZWxvY2F0aW9ucyBhcmUgcGVyZm9ybWVkIC0tIHNlZSBsZCdzIGRvY3VtZW50YXRpb24KKyAgIG9uIHBzZXVkby1yZWxvY3MuICAqLyIKKwkgICAgbHRfZGxzeW1fY29uc3Q9IDs7CisJICAqb3NmNSopCisJICAgIGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisvKiBUaGlzIHN5c3RlbSBkb2VzIG5vdCBjb3BlIHdlbGwgd2l0aCByZWxvY2F0aW9ucyBpbiBjb25zdCBkYXRhICovIgorCSAgICBsdF9kbHN5bV9jb25zdD0gOzsKKwkgICopCisJICAgIGx0X2Rsc3ltX2NvbnN0PWNvbnN0IDs7CisJICBlc2FjCisKKwkgICRFQ0hPID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIiAiXAorZXh0ZXJuICRsdF9kbHN5bV9jb25zdCBsdF9kbHN5bWxpc3QKK2x0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXTsKKyRsdF9kbHN5bV9jb25zdCBsdF9kbHN5bWxpc3QKK2x0XyR7bXlfcHJlZml4fV9MVFhfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Cit7XAorICB7IFwiJG15X29yaWdpbmF0b3JcIiwgKHZvaWQgKikgMCB9LCIKKworCSAgY2FzZSAkbmVlZF9saWJfcHJlZml4IGluCisJICBubykKKwkgICAgZXZhbCAiJGdsb2JhbF9zeW1ib2xfdG9fY19uYW1lX2FkZHJlc3MiIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiCisJICAgIDs7CisJICAqKQorCSAgICBldmFsICIkZ2xvYmFsX3N5bWJvbF90b19jX25hbWVfYWRkcmVzc19saWJfcHJlZml4IiA8ICIkbmxpc3QiID4+ICIkb3V0cHV0X29iamRpci8kbXlfZGxzeW1zIgorCSAgICA7OworCSAgZXNhYworCSAgJEVDSE8gPj4gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICJcCisgIHswLCAodm9pZCAqKSAwfQorfTsKKworLyogVGhpcyB3b3JrcyBhcm91bmQgYSBwcm9ibGVtIGluIEZyZWVCU0QgbGlua2VyICovCisjaWZkZWYgRlJFRUJTRF9XT1JLQVJPVU5ECitzdGF0aWMgY29uc3Qgdm9pZCAqbHRfcHJlbG9hZGVkX3NldHVwKCkgeworICByZXR1cm4gbHRfJHtteV9wcmVmaXh9X0xUWF9wcmVsb2FkZWRfc3ltYm9sczsKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZlwKKyIKKwl9ICMgISRvcHRfZHJ5X3J1bgorCisJcGljX2ZsYWdfZm9yX3N5bXRhYmxlPQorCWNhc2UgIiRjb21waWxlX2NvbW1hbmQgIiBpbgorCSoiIC1zdGF0aWMgIiopIDs7CisJKikKKwkgIGNhc2UgJGhvc3QgaW4KKwkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAorCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCisJICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCisJICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KKwkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCisJICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKnwqLSotZnJlZWJzZGVsZjMuMCopCisJICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtREZSRUVCU0RfV09SS0FST1VORCIgOzsKKwkgICotKi1ocHV4KikKKwkgICAgcGljX2ZsYWdfZm9yX3N5bXRhYmxlPSIgJHBpY19mbGFnIiAgOzsKKwkgICopCisJICAgIGlmIHRlc3QgIlgkbXlfcGljX3AiICE9IFhubzsgdGhlbgorCSAgICAgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworCXN5bXRhYl9jZmxhZ3M9CisJZm9yIGFyZyBpbiAkTFRDRkxBR1M7IGRvCisJICBjYXNlICRhcmcgaW4KKwkgIC1waWUgfCAtZnBpZSB8IC1mUElFKSA7OworCSAgKikgc3ltdGFiX2NmbGFncz0iJHN5bXRhYl9jZmxhZ3MgJGFyZyIgOzsKKwkgIGVzYWMKKwlkb25lCisKKwkjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgorCWZ1bmNfc2hvd19ldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJExUQ0Mkc3ltdGFiX2NmbGFncyAtYyRub19idWlsdGluX2ZsYWckcGljX2ZsYWdfZm9yX3N5bXRhYmxlICIkbXlfZGxzeW1zIiknICdleGl0ICQ/JworCisJIyBDbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGZpbGVzLgorCWZ1bmNfc2hvd19ldmFsICckUk0gIiRvdXRwdXRfb2JqZGlyLyRteV9kbHN5bXMiICIkbmxpc3QiICIke25saXN0fVMiICIke25saXN0fVQiJworCisJIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKwlzeW1maWxlb2JqPSIkb3V0cHV0X29iamRpci8ke215X291dHB1dG5hbWV9Uy4kb2JqZXh0IgorCWNhc2UgJGhvc3QgaW4KKwkqY3lnd2luKiB8ICptaW5ndyogfCAqY2VnY2MqICkKKwkgIGlmIHRlc3QgLWYgIiRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiI7IHRoZW4KKwkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvdXRwdXRfb2JqZGlyLyRteV9vdXRwdXRuYW1lLmRlZiAkc3ltZmlsZW9iaiUiYAorCSAgICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkb3V0cHV0X29iamRpci8kbXlfb3V0cHV0bmFtZS5kZWYgJHN5bWZpbGVvYmolImAKKwkgIGVsc2UKKwkgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaQorCSAgOzsKKwkqKQorCSAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRzeW1maWxlb2JqJSJgCisJICBmaW5hbGl6ZV9jb21tYW5kPWAkRUNITyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBTWU1GSUxFQCUkc3ltZmlsZW9iaiUiYAorCSAgOzsKKwllc2FjCisJOzsKKyAgICAgICopCisJZnVuY19mYXRhbF9lcnJvciAidW5rbm93biBzdWZmaXggZm9yIFxgJG15X2Rsc3ltcyciCisJOzsKKyAgICAgIGVzYWMKKyAgICBlbHNlCisgICAgICAjIFdlIGtlZXAgZ29pbmcganVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCByZWZlciB0bworICAgICAgIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQorICAgICAgIyByZWFsbHkgd2FzIHJlcXVpcmVkLgorCisgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorICAgICAgY29tcGlsZV9jb21tYW5kPWAkRUNITyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRFQ0hPICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICBmaQorfQorCisjIGZ1bmNfd2luMzJfbGliaWQgYXJnCisjIHJldHVybiB0aGUgbGlicmFyeSB0eXBlIG9mIGZpbGUgJ2FyZycKKyMKKyMgTmVlZCBhIGxvdCBvZiBnb28gdG8gaGFuZGxlICpib3RoKiBETExzIGFuZCBpbXBvcnQgbGlicworIyBIYXMgdG8gYmUgYSBzaGVsbCBmdW5jdGlvbiBpbiBvcmRlciB0byAnZWF0JyB0aGUgYXJndW1lbnQKKyMgdGhhdCBpcyBzdXBwbGllZCB3aGVuICRmaWxlX21hZ2ljX2NvbW1hbmQgaXMgY2FsbGVkLgorZnVuY193aW4zMl9saWJpZCAoKQoreworICAkb3B0X2RlYnVnCisgIHdpbjMyX2xpYmlkX3R5cGU9InVua25vd24iCisgIHdpbjMyX2ZpbGVyZXM9YGZpbGUgLUwgJDEgMj4vZGV2L251bGxgCisgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgKmFyXCBhcmNoaXZlXCBpbXBvcnRcIGxpYnJhcnkqKSAjIGRlZmluaXRlbHkgaW1wb3J0CisgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0IgorICAgIDs7CisgICphclwgYXJjaGl2ZSopICMgY291bGQgYmUgYW4gaW1wb3J0LCBvciBzdGF0aWMKKyAgICBpZiBldmFsICRPQkpEVU1QIC1mICQxIHwgJFNFRCAtZSAnMTBxJyAyPi9kZXYvbnVsbCB8CisgICAgICAgJEVHUkVQICdmaWxlIGZvcm1hdCBwZS1pMzg2KC4qYXJjaGl0ZWN0dXJlOiBpMzg2KT8nID4vZGV2L251bGwgOyB0aGVuCisgICAgICB3aW4zMl9ubXJlcz1gZXZhbCAkTk0gLWYgcG9zaXggLUEgJDEgfAorCSRTRUQgLW4gLWUgJworCSAgICAxLDEwMHsKKwkJLyBJIC97CisJCSAgICBzLC4qLGltcG9ydCwKKwkJICAgIHAKKwkJICAgIHEKKwkJfQorCSAgICB9J2AKKyAgICAgIGNhc2UgJHdpbjMyX25tcmVzIGluCisgICAgICBpbXBvcnQqKSAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgaW1wb3J0Ijs7CisgICAgICAqKSAgICAgICAgd2luMzJfbGliaWRfdHlwZT0ieDg2IGFyY2hpdmUgc3RhdGljIjs7CisgICAgICBlc2FjCisgICAgZmkKKyAgICA7OworICAqRExMKikKKyAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgorICAgIDs7CisgICpleGVjdXRhYmxlKikgIyBidXQgc2hlbGwgc2NyaXB0cyBhcmUgImV4ZWN1dGFibGUiIHRvby4uLgorICAgIGNhc2UgJHdpbjMyX2ZpbGVyZXMgaW4KKyAgICAqTVNcIFdpbmRvd3NcIFBFXCBJbnRlbCopCisgICAgICB3aW4zMl9saWJpZF90eXBlPSJ4ODYgRExMIgorICAgICAgOzsKKyAgICBlc2FjCisgICAgOzsKKyAgZXNhYworICAkRUNITyAiJHdpbjMyX2xpYmlkX3R5cGUiCit9CisKKworCisjIGZ1bmNfZXh0cmFjdF9hbl9hcmNoaXZlIGRpciBvbGRsaWIKK2Z1bmNfZXh0cmFjdF9hbl9hcmNoaXZlICgpCit7CisgICAgJG9wdF9kZWJ1ZworICAgIGZfZXhfYW5fYXJfZGlyPSIkMSI7IHNoaWZ0CisgICAgZl9leF9hbl9hcl9vbGRsaWI9IiQxIgorICAgIGZ1bmNfc2hvd19ldmFsICIoY2QgXCRmX2V4X2FuX2FyX2RpciAmJiAkQVIgeCBcIlwkZl9leF9hbl9hcl9vbGRsaWJcIikiICdleGl0ICQ/JworICAgIGlmICgkQVIgdCAiJGZfZXhfYW5fYXJfb2xkbGliIiB8IHNvcnQgfCBzb3J0IC11YyA+L2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgIDoKKyAgICBlbHNlCisgICAgICBmdW5jX2ZhdGFsX2Vycm9yICJvYmplY3QgbmFtZSBjb25mbGljdHMgaW4gYXJjaGl2ZTogJGZfZXhfYW5fYXJfZGlyLyRmX2V4X2FuX2FyX29sZGxpYiIKKyAgICBmaQorfQorCisKKyMgZnVuY19leHRyYWN0X2FyY2hpdmVzIGdlbnRvcCBvbGRsaWIgLi4uCitmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgbXlfZ2VudG9wPSIkMSI7IHNoaWZ0CisgICAgbXlfb2xkbGlicz0kezErIiRAIn0KKyAgICBteV9vbGRvYmpzPSIiCisgICAgbXlfeGxpYj0iIgorICAgIG15X3hhYnM9IiIKKyAgICBteV94ZGlyPSIiCisKKyAgICBmb3IgbXlfeGxpYiBpbiAkbXlfb2xkbGliczsgZG8KKyAgICAgICMgRXh0cmFjdCB0aGUgb2JqZWN0cy4KKyAgICAgIGNhc2UgJG15X3hsaWIgaW4KKwlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIG15X3hhYnM9IiRteV94bGliIiA7OworCSopIG15X3hhYnM9YHB3ZGAiLyRteV94bGliIiA7OworICAgICAgZXNhYworICAgICAgZnVuY19iYXNlbmFtZSAiJG15X3hsaWIiCisgICAgICBteV94bGliPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgICBteV94bGliX3U9JG15X3hsaWIKKyAgICAgIHdoaWxlIDo7IGRvCisgICAgICAgIGNhc2UgIiAkZXh0cmFjdGVkX2FyY2hpdmVzICIgaW4KKwkqIiAkbXlfeGxpYl91ICIqKQorCSAgZnVuY19hcml0aCAkZXh0cmFjdGVkX3NlcmlhbCArIDEKKwkgIGV4dHJhY3RlZF9zZXJpYWw9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICBteV94bGliX3U9bHQkZXh0cmFjdGVkX3NlcmlhbC0kbXlfeGxpYiA7OworCSopIGJyZWFrIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZXh0cmFjdGVkX2FyY2hpdmVzPSIkZXh0cmFjdGVkX2FyY2hpdmVzICRteV94bGliX3UiCisgICAgICBteV94ZGlyPSIkbXlfZ2VudG9wLyRteV94bGliX3UiCisKKyAgICAgIGZ1bmNfbWtkaXJfcCAiJG15X3hkaXIiCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotZGFyd2luKikKKwlmdW5jX3ZlcmJvc2UgIkV4dHJhY3RpbmcgJG15X3hhYnMiCisJIyBEbyBub3QgYm90aGVyIGRvaW5nIGFueXRoaW5nIGlmIGp1c3QgYSBkcnkgcnVuCisJJG9wdF9kcnlfcnVuIHx8IHsKKwkgIGRhcndpbl9vcmlnX2Rpcj1gcHdkYAorCSAgY2QgJG15X3hkaXIgfHwgZXhpdCAkPworCSAgZGFyd2luX2FyY2hpdmU9JG15X3hhYnMKKwkgIGRhcndpbl9jdXJkaXI9YHB3ZGAKKwkgIGRhcndpbl9iYXNlX2FyY2hpdmU9YGJhc2VuYW1lICIkZGFyd2luX2FyY2hpdmUiYAorCSAgZGFyd2luX2FyY2hlcz1gJExJUE8gLWluZm8gIiRkYXJ3aW5fYXJjaGl2ZSIgMj4vZGV2L251bGwgfCAkR1JFUCBBcmNoaXRlY3R1cmVzIDI+L2Rldi9udWxsIHx8IHRydWVgCisJICBpZiB0ZXN0IC1uICIkZGFyd2luX2FyY2hlcyI7IHRoZW4KKwkgICAgZGFyd2luX2FyY2hlcz1gJEVDSE8gIiRkYXJ3aW5fYXJjaGVzIiB8ICRTRUQgLWUgJ3MvLiphcmU6Ly8nYAorCSAgICBkYXJ3aW5fYXJjaD0KKwkgICAgZnVuY192ZXJib3NlICIkZGFyd2luX2Jhc2VfYXJjaGl2ZSBoYXMgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAkZGFyd2luX2FyY2hlcyIKKwkgICAgZm9yIGRhcndpbl9hcmNoIGluICAkZGFyd2luX2FyY2hlcyA7IGRvCisJICAgICAgZnVuY19ta2Rpcl9wICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9IgorCSAgICAgICRMSVBPIC10aGluICRkYXJ3aW5fYXJjaCAtb3V0cHV0ICJ1bmZhdC0kJC8ke2Rhcndpbl9iYXNlX2FyY2hpdmV9LSR7ZGFyd2luX2FyY2h9LyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0iICIke2Rhcndpbl9hcmNoaXZlfSIKKwkgICAgICBjZCAidW5mYXQtJCQvJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfS0ke2Rhcndpbl9hcmNofSIKKwkgICAgICBmdW5jX2V4dHJhY3RfYW5fYXJjaGl2ZSAiYHB3ZGAiICIke2Rhcndpbl9iYXNlX2FyY2hpdmV9IgorCSAgICAgIGNkICIkZGFyd2luX2N1cmRpciIKKwkgICAgICAkUk0gInVuZmF0LSQkLyR7ZGFyd2luX2Jhc2VfYXJjaGl2ZX0tJHtkYXJ3aW5fYXJjaH0vJHtkYXJ3aW5fYmFzZV9hcmNoaXZlfSIKKwkgICAgZG9uZSAjICRkYXJ3aW5fYXJjaGVzCisgICAgICAgICAgICAjIyBPa2F5IG5vdyB3ZSd2ZSBhIGJ1bmNoIG9mIHRoaW4gb2JqZWN0cywgZ290dGEgZmF0dGVuIHRoZW0gdXAgOikKKwkgICAgZGFyd2luX2ZpbGVsaXN0PWBmaW5kIHVuZmF0LSQkIC10eXBlIGYgLW5hbWUgXCoubyAtcHJpbnQgLW8gLW5hbWUgXCoubG8gLXByaW50IHwgJFNFRCAtZSAiJGJhc2VuYW1lIiB8IHNvcnQgLXVgCisJICAgIGRhcndpbl9maWxlPQorCSAgICBkYXJ3aW5fZmlsZXM9CisJICAgIGZvciBkYXJ3aW5fZmlsZSBpbiAkZGFyd2luX2ZpbGVsaXN0OyBkbworCSAgICAgIGRhcndpbl9maWxlcz1gZmluZCB1bmZhdC0kJCAtbmFtZSAkZGFyd2luX2ZpbGUgLXByaW50IHwgJE5MMlNQYAorCSAgICAgICRMSVBPIC1jcmVhdGUgLW91dHB1dCAiJGRhcndpbl9maWxlIiAkZGFyd2luX2ZpbGVzCisJICAgIGRvbmUgIyAkZGFyd2luX2ZpbGVsaXN0CisJICAgICRSTSAtcmYgdW5mYXQtJCQKKwkgICAgY2QgIiRkYXJ3aW5fb3JpZ19kaXIiCisJICBlbHNlCisJICAgIGNkICRkYXJ3aW5fb3JpZ19kaXIKKwkgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJICBmaSAjICRkYXJ3aW5fYXJjaGVzCisJfSAjICEkb3B0X2RyeV9ydW4KKwk7OworICAgICAgKikKKyAgICAgICAgZnVuY19leHRyYWN0X2FuX2FyY2hpdmUgIiRteV94ZGlyIiAiJG15X3hhYnMiCisJOzsKKyAgICAgIGVzYWMKKyAgICAgIG15X29sZG9ianM9IiRteV9vbGRvYmpzICJgZmluZCAkbXlfeGRpciAtbmFtZSBcKi4kb2JqZXh0IC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCisgICAgZG9uZQorCisgICAgZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdD0iJG15X29sZG9ianMiCit9CisKKworCisjIGZ1bmNfZW1pdF93cmFwcGVyX3BhcnQxIFthcmc9bm9dCisjCisjIEVtaXQgdGhlIGZpcnN0IHBhcnQgb2YgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoCisjIGZ1bmNfZW1pdF93cmFwcGVyKCksIGJlbG93LgorZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgKCkKK3sKKwlmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MV9hcmcxPW5vCisJaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgorCSAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDFfYXJnMT0kMQorCWZpCisKKwkkRUNITyAiXAorIyEgJFNIRUxMCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQorIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSRUSU1FU1RBTVApICRWRVJTSU9OCisjCisjIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAorIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisjCisjIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPScke1NFRH0gLWUgMXMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKKworIyBCZSBCb3VybmUgY29tcGF0aWJsZQoraWYgdGVzdCAtbiBcIlwke1pTSF9WRVJTSU9OK3NldH1cIiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgWnNoIDMueCBhbmQgNC54IHBlcmZvcm1zIHdvcmQgc3BsaXR0aW5nIG9uIFwkezErXCJcJEBcIn0sIHdoaWNoCisgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCisgIGFsaWFzIC1nICdcJHsxK1wiXCRAXCJ9Jz0nXCJcJEBcIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBcYChzZXQgLW8pIDI+L2Rldi9udWxsXGAgaW4gKnBvc2l4Kikgc2V0IC1vIHBvc2l4OzsgZXNhYworZmkKK0JJTl9TSD14cGc0OyBleHBvcnQgQklOX1NIICMgZm9yIFRydTY0CitEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK3JlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBnZW5lcmF0ZWRfYnlfbGlidG9vbF92ZXJzaW9uPSckbWFjcm9fdmVyc2lvbicKKyAgbm90aW5zdF9kZXBsaWJzPSckbm90aW5zdF9kZXBsaWJzJworZWxzZQorICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkRUNITyBhcmUgYWxyZWFkeSBzZXQuCisgIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KKyAgICBFQ0hPPVwiJHFlY2hvXCIKKyAgICBmaWxlPVwiXCQwXCIKKyAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgorICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KKyAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgorICAgICAgc2hpZnQKKyAgICBlbGlmIHRlc3QgXCJYXGB7IFwkRUNITyAnXHQnOyB9IDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCisgICAgICAjIFlpcHBlZSwgXCRFQ0hPIHdvcmtzIQorICAgICAgOgorICAgIGVsc2UKKyAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRFQ0hPIHdpbGwgd29yay4KKyAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQorICAgIGZpCisgIGZpXAorIgorCSRFQ0hPICJcCisKKyAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KKyAgdGhpc2Rpcj1cYFwkRUNITyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKKyAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgorCisgICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgorICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCAke1NFRH0gLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJEVDSE8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgW1xcXFwvXSogfCBbQS1aYS16XTpbXFxcXC9dKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7CisgICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7CisgICAgICBlc2FjCisgICAgZmkKKworICAgIGZpbGU9XGBcJEVDSE8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCisgICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8ICR7U0VEfSAtbiAncy8uKi0+IC8vcCdcYAorICBkb25lCisiCit9CisjIGVuZDogZnVuY19lbWl0X3dyYXBwZXJfcGFydDEKKworIyBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MiBbYXJnPW5vXQorIworIyBFbWl0IHRoZSBzZWNvbmQgcGFydCBvZiBhIGxpYnRvb2wgd3JhcHBlciBzY3JpcHQgb24gc3Rkb3V0LgorIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBkZXNjcmlwdGlvbiBhc3NvY2lhdGVkIHdpdGgKKyMgZnVuY19lbWl0X3dyYXBwZXIoKSwgYmVsb3cuCitmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MiAoKQoreworCWZ1bmNfZW1pdF93cmFwcGVyX3BhcnQyX2FyZzE9bm8KKwlpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCisJICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0Ml9hcmcxPSQxCisJZmkKKworCSRFQ0hPICJcCisKKyAgIyBVc3VhbGx5ICdubycsIGV4Y2VwdCBvbiBjeWd3aW4vbWluZ3cgd2hlbiBlbWJlZGRlZCBpbnRvCisgICMgdGhlIGN3cmFwcGVyLgorICBXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUj0kZnVuY19lbWl0X3dyYXBwZXJfcGFydDJfYXJnMQorICBpZiB0ZXN0IFwiXCRXUkFQUEVSX1NDUklQVF9CRUxPTkdTX0lOX09CSkRJUlwiID0gXCJ5ZXNcIjsgdGhlbgorICAgICMgc3BlY2lhbCBjYXNlIGZvciAnLicKKyAgICBpZiB0ZXN0IFwiXCR0aGlzZGlyXCIgPSBcIi5cIjsgdGhlbgorICAgICAgdGhpc2Rpcj1cYHB3ZFxgCisgICAgZmkKKyAgICAjIHJlbW92ZSAubGlicyBmcm9tIHRoaXNkaXIKKyAgICBjYXNlIFwiXCR0aGlzZGlyXCIgaW4KKyAgICAqW1xcXFwvXSRvYmpkaXIgKSB0aGlzZGlyPVxgXCRFQ0hPIFwiWFwkdGhpc2RpclwiIHwgXCRYc2VkIC1lICdzJVtcXFxcL11bXlxcXFwvXSokJSUnXGAgOzsKKyAgICAkb2JqZGlyICkgICB0aGlzZGlyPS4gOzsKKyAgICBlc2FjCisgIGZpCisKKyAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KKyAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAorICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgorIgorCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KKwkgICRFQ0hPICJcCisgIHByb2dyYW09bHQtJyRvdXRwdXRuYW1lJyRleGVleHQKKyAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKKworICBpZiB0ZXN0ICEgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCIgfHwKKyAgICAgeyBmaWxlPVxgbHMgLTFkdCBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcIlwkcHJvZ2Rpci8uLi9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8ICR7U0VEfSAxcVxgOyBcXAorICAgICAgIHRlc3QgXCJYXCRmaWxlXCIgIT0gXCJYXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9OyB0aGVuCisKKyAgICBmaWxlPVwiXCRcJC1cJHByb2dyYW1cIgorCisgICAgaWYgdGVzdCAhIC1kIFwiXCRwcm9nZGlyXCI7IHRoZW4KKyAgICAgICRNS0RJUiBcIlwkcHJvZ2RpclwiCisgICAgZWxzZQorICAgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgICAgZmkiCisKKwkgICRFQ0hPICJcCisKKyAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQorICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KKyAgICAgIGlmIHJlbGlua19jb21tYW5kX291dHB1dD1cYGV2YWwgXCRyZWxpbmtfY29tbWFuZCAyPiYxXGA7IHRoZW4gOgorICAgICAgZWxzZQorCSRFQ0hPIFwiXCRyZWxpbmtfY29tbWFuZF9vdXRwdXRcIiA+JjIKKwkkUk0gXCJcJHByb2dkaXIvXCRmaWxlXCIKKwlleGl0IDEKKyAgICAgIGZpCisgICAgZmkKKworICAgICRNViBcIlwkcHJvZ2Rpci9cJGZpbGVcIiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiAyPi9kZXYvbnVsbCB8fAorICAgIHsgJFJNIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOworICAgICAgJE1WIFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB9CisgICAgJFJNIFwiXCRwcm9nZGlyL1wkZmlsZVwiCisgIGZpIgorCWVsc2UKKwkgICRFQ0hPICJcCisgIHByb2dyYW09JyRvdXRwdXRuYW1lJworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorIgorCWZpCisKKwkkRUNITyAiXAorCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKwkjIEV4cG9ydCBvdXIgc2hsaWJwYXRoX3ZhciBpZiB3ZSBoYXZlIG9uZS4KKwlpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyAmJiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciIgJiYgdGVzdCAtbiAiJHRlbXBfcnBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCisgICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgorCisgICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCisgICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkRUNITyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAorCisgICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCisiCisJZmkKKworCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCisJaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCisJICAkRUNITyAiXAorICAgICMgQWRkIHRoZSBkbGwgc2VhcmNoIHBhdGggY29tcG9uZW50cyB0byB0aGUgZXhlY3V0YWJsZSBQQVRICisgICAgUEFUSD0kZGxsc2VhcmNocGF0aDpcJFBBVEgKKyIKKwlmaQorCisJJEVDSE8gIlwKKyAgICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiAhPSBcIiRtYWdpY1wiOyB0aGVuCisgICAgICAjIFJ1biB0aGUgYWN0dWFsIHByb2dyYW0gd2l0aCBvdXIgYXJndW1lbnRzLgorIgorCWNhc2UgJGhvc3QgaW4KKwkjIEJhY2tzbGFzaGVzIHNlcGFyYXRlIGRpcmVjdG9yaWVzIG9uIHBsYWluIHdpbmRvd3MKKwkqLSotbWluZ3cgfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgJEVDSE8gIlwKKyAgICAgIGV4ZWMgXCJcJHByb2dkaXJcXFxcXCRwcm9ncmFtXCIgXCR7MStcIlwkQFwifQorIgorCSAgOzsKKworCSopCisJICAkRUNITyAiXAorICAgICAgZXhlYyBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiBcJHsxK1wiXCRAXCJ9CisiCisJICA7OworCWVzYWMKKwkkRUNITyAiXAorICAgICAgXCRFQ0hPIFwiXCQwOiBjYW5ub3QgZXhlYyBcJHByb2dyYW0gXCQqXCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJEVDSE8gXCJcJDA6IGVycm9yOiBcXFxgXCRwcm9nZGlyL1wkcHJvZ3JhbScgZG9lcyBub3QgZXhpc3RcIiAxPiYyCisgICAgXCRFQ0hPIFwiVGhpcyBzY3JpcHQgaXMganVzdCBhIHdyYXBwZXIgZm9yIFwkcHJvZ3JhbS5cIiAxPiYyCisgICAgJEVDSE8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCit9CisjIGVuZDogZnVuY19lbWl0X3dyYXBwZXJfcGFydDIKKworCisjIGZ1bmNfZW1pdF93cmFwcGVyIFthcmc9bm9dCisjCisjIEVtaXQgYSBsaWJ0b29sIHdyYXBwZXIgc2NyaXB0IG9uIHN0ZG91dC4KKyMgRG9uJ3QgZGlyZWN0bHkgb3BlbiBhIGZpbGUgYmVjYXVzZSB3ZSBtYXkgd2FudCB0bworIyBpbmNvcnBvcmF0ZSB0aGUgc2NyaXB0IGNvbnRlbnRzIHdpdGhpbiBhIGN5Z3dpbi9taW5ndworIyB3cmFwcGVyIGV4ZWN1dGFibGUuICBNdXN0IE9OTFkgYmUgY2FsbGVkIGZyb20gd2l0aGluCisjIGZ1bmNfbW9kZV9saW5rIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBhIG51bWJlciBvZiB2YXJpYWJsZXMKKyMgc2V0IHRoZXJlaW4uCisjCisjIEFSRyBpcyB0aGUgdmFsdWUgdGhhdCB0aGUgV1JBUFBFUl9TQ1JJUFRfQkVMT05HU19JTl9PQkpESVIKKyMgdmFyaWFibGUgd2lsbCB0YWtlLiAgSWYgJ3llcycsIHRoZW4gdGhlIGVtaXR0ZWQgc2NyaXB0CisjIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBpdCBpcyBzdG9yZWQgaXMKKyMgdGhlICRvYmpkaXIgZGlyZWN0b3J5LiAgVGhpcyBpcyBhIGN5Z3dpbi9taW5ndy1zcGVjaWZpYworIyBiZWhhdmlvci4KK2Z1bmNfZW1pdF93cmFwcGVyICgpCit7CisJZnVuY19lbWl0X3dyYXBwZXJfYXJnMT1ubworCWlmIHRlc3QgLW4gIiQxIiA7IHRoZW4KKwkgIGZ1bmNfZW1pdF93cmFwcGVyX2FyZzE9JDEKKwlmaQorCisJIyBzcGxpdCB0aGlzIHVwIHNvIHRoYXQgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCSMgY2FuIGNhbGwgZWFjaCBwYXJ0IGluZGVwZW5kZW50bHkuCisJZnVuY19lbWl0X3dyYXBwZXJfcGFydDEgIiR7ZnVuY19lbWl0X3dyYXBwZXJfYXJnMX0iCisJZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgIiR7ZnVuY19lbWl0X3dyYXBwZXJfYXJnMX0iCit9CisKKworIyBmdW5jX3RvX2hvc3RfcGF0aCBhcmcKKyMKKyMgQ29udmVydCBwYXRocyB0byBob3N0IGZvcm1hdCB3aGVuIHVzZWQgd2l0aCBidWlsZCB0b29scy4KKyMgSW50ZW5kZWQgZm9yIHVzZSB3aXRoICJuYXRpdmUiIG1pbmd3ICh3aGVyZSBsaWJ0b29sIGl0c2VsZgorIyBpcyBydW5uaW5nIHVuZGVyIHRoZSBtc3lzIHNoZWxsKSwgb3IgaW4gdGhlIGZvbGxvd2luZyBjcm9zcy0KKyMgYnVpbGQgZW52aXJvbm1lbnRzOgorIyAgICAkYnVpbGQgICAgICAgICAgJGhvc3QKKyMgICAgbWluZ3cgKG1zeXMpICAgIG1pbmd3ICBbZS5nLiBuYXRpdmVdCisjICAgIGN5Z3dpbiAgICAgICAgICBtaW5ndworIyAgICAqbml4ICsgd2luZSAgICAgbWluZ3cKKyMgd2hlcmUgd2luZSBpcyBlcXVpcHBlZCB3aXRoIHRoZSBgd2luZXBhdGgnIGV4ZWN1dGFibGUuCisjIEluIHRoZSBuYXRpdmUgbWluZ3cgY2FzZSwgdGhlIChtc3lzKSBzaGVsbCBhdXRvbWF0aWNhbGx5CisjIGNvbnZlcnRzIHBhdGhzIGZvciBhbnkgbm9uLW1zeXMgYXBwbGljYXRpb25zIGl0IGxhdW5jaGVzLAorIyBidXQgdGhhdCBmYWNpbGl0eSBpc24ndCBhdmFpbGFibGUgZnJvbSBpbnNpZGUgdGhlIGN3cmFwcGVyLgorIyBTaW1pbGFyIGFjY29tbW9kYXRpb25zIGFyZSBuZWNlc3NhcnkgZm9yICRob3N0IG1pbmd3IGFuZAorIyAkYnVpbGQgY3lnd2luLiAgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGRvZXMgbm8gaGFybSBmb3Igb3RoZXIKKyMgJGhvc3QvJGJ1aWxkIGNvbWJpbmF0aW9ucyBub3QgbGlzdGVkIGFib3ZlLgorIworIyBBUkcgaXMgdGhlIHBhdGggKG9uICRidWlsZCkgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvCisjIHRoZSBwcm9wZXIgcmVwcmVzZW50YXRpb24gZm9yICRob3N0LiBUaGUgcmVzdWx0IGlzIHN0b3JlZAorIyBpbiAkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGggKCkKK3sKKyAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgorICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICptaW5ndyogKQorICAgICAgICBsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5PSdzfFxcXFwqfFxcfGc7c3wvfFxcfGc7c3xcXHxcXFxcfGcnCisgICAgICAgIGNhc2UgJGJ1aWxkIGluCisgICAgICAgICAgKm1pbmd3KiApICMgYWN0dWFsbHksIG1zeXMKKyAgICAgICAgICAgICMgYXdrd2FyZDogY21kIGFwcGVuZHMgc3BhY2VzIHRvIHJlc3VsdAorICAgICAgICAgICAgbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcz0icy9bIF0qXCQvLyIKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3RtcDE9YCggY21kIC8vYyBlY2hvICIkMSIgfFwKKyAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9zdHJpcF90cmFpbGluZ19zcGFjZXMiICkgMj4vZGV2L251bGwgfHwgZWNobyAiImAKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRoX3RtcDEiIHxcCisgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgKmN5Z3dpbiogKQorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gY3lncGF0aCAtdyAiJDEiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhfdG1wMSIgfFwKKyAgICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnkiYAorICAgICAgICAgICAgOzsKKyAgICAgICAgICAqICkKKyAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSwgd2luZXBhdGggZG9lcyBub3QgZXhpdCB3aXRoIGEgbm9uLXplcm8KKyAgICAgICAgICAgICMgZXJyb3IgY29kZSwgc28gd2UgYXJlIGZvcmNlZCB0byBjaGVjayB0aGUgY29udGVudHMgb2YKKyAgICAgICAgICAgICMgc3Rkb3V0LiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGNvbW1hbmQgaXMgbm90CisgICAgICAgICAgICAjIGZvdW5kLCB0aGUgc2hlbGwgd2lsbCBzZXQgYW4gZXhpdCBjb2RlIG9mIDEyNyBhbmQgcHJpbnQKKyAgICAgICAgICAgICMgKmFuIGVycm9yIG1lc3NhZ2UqIHRvIHN0ZG91dC4gU28gd2UgbXVzdCBjaGVjayBmb3IgYm90aAorICAgICAgICAgICAgIyBlcnJvciBjb2RlIG9mIHplcm8gQU5EIG5vbi1lbXB0eSBzdGRvdXQsIHdoaWNoIGV4cGxhaW5zCisgICAgICAgICAgICAjIHRoZSBvZGQgY29uc3RydWN0aW9uOgorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfdG1wMT1gd2luZXBhdGggLXcgIiQxIiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgIGlmIHRlc3QgIiQ/IiAtZXEgMCAmJiB0ZXN0IC1uICIke2Z1bmNfdG9faG9zdF9wYXRoX3RtcDF9IjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9YGVjaG8gIiRmdW5jX3RvX2hvc3RfcGF0aF90bXAxIiB8XAorICAgICAgICAgICAgICAgICRTRUQgLWUgIiRsdF9zZWRfbmFpdmVfYmFja3NsYXNoaWZ5ImAKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIyBBbGxvdyB3YXJuaW5nIGJlbG93LgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQ9IiIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aF9yZXN1bHQiIDsgdGhlbgorICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvdWxkIG5vdCBkZXRlcm1pbmUgaG9zdCBwYXRoIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgICAgICAgZnVuY19lcnJvciAiICAnJDEnIgorICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICAgICAgICMgRmFsbGJhY2s6CisgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhfcmVzdWx0PSIkMSIKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICBlc2FjCisgIGZpCit9CisjIGVuZDogZnVuY190b19ob3N0X3BhdGgKKworIyBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgYXJnCisjCisjIENvbnZlcnQgcGF0aGxpc3RzIHRvIGhvc3QgZm9ybWF0IHdoZW4gdXNlZCB3aXRoIGJ1aWxkIHRvb2xzLgorIyBTZWUgZnVuY190b19ob3N0X3BhdGgoKSwgYWJvdmUuIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgdGhlCisjIGZvbGxvd2luZyAkYnVpbGQvJGhvc3QgY29tYmluYXRpb25zIChidXQgZG9lcyBubyBoYXJtIGZvcgorIyBjb21iaW5hdGlvbnMgbm90IGxpc3RlZCBoZXJlKToKKyMgICAgJGJ1aWxkICAgICAgICAgICRob3N0CisjICAgIG1pbmd3IChtc3lzKSAgICBtaW5ndyAgW2UuZy4gbmF0aXZlXQorIyAgICBjeWd3aW4gICAgICAgICAgbWluZ3cKKyMgICAgKm5peCArIHdpbmUgICAgIG1pbmd3CisjCisjIFBhdGggc2VwYXJhdG9ycyBhcmUgYWxzbyBjb252ZXJ0ZWQgZnJvbSAkYnVpbGQgZm9ybWF0IHRvCisjICRob3N0IGZvcm1hdC4gSWYgQVJHIGJlZ2lucyBvciBlbmRzIHdpdGggYSBwYXRoIHNlcGFyYXRvcgorIyBjaGFyYWN0ZXIsIGl0IGlzIHByZXNlcnZlZCAoYnV0IGNvbnZlcnRlZCB0byAkaG9zdCBmb3JtYXQpCisjIG9uIG91dHB1dC4KKyMKKyMgQVJHIGlzIGEgcGF0aGxpc3QgKG9uICRidWlsZCkgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvCisjIHRoZSBwcm9wZXIgcmVwcmVzZW50YXRpb24gb24gJGhvc3QuIFRoZSByZXN1bHQgaXMgc3RvcmVkCisjIGluICRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0LgorZnVuY190b19ob3N0X3BhdGhsaXN0ICgpCit7CisgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ9IiQxIgorICBpZiB0ZXN0IC1uICIkMSIgOyB0aGVuCisgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKm1pbmd3KiApCisgICAgICAgIGx0X3NlZF9uYWl2ZV9iYWNrc2xhc2hpZnk9J3N8XFxcXCp8XFx8ZztzfC98XFx8ZztzfFxcfFxcXFx8ZycKKyAgICAgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tCisgICAgICAgICMgQVJHLiBtc3lzIGJlaGF2aW9yIGlzIGluY29uc2lzdGVudCBoZXJlLCBjeWdwYXRoIHR1cm5zIHRoZW0KKyAgICAgICAgIyBpbnRvICcuOycgYW5kICc7LicsIGFuZCB3aW5lcGF0aCBpZ25vcmVzIHRoZW0gY29tcGxldGVseS4KKyAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDI9IiQxIgorICAgICAgICAjIE9uY2Ugc2V0IGZvciB0aGlzIGNhbGwsIHRoaXMgdmFyaWFibGUgc2hvdWxkIG5vdCBiZQorICAgICAgICAjIHJlYXNzaWduZWQuIEl0IGlzIHVzZWQgaW4gdGhhIGZhbGxiYWNrIGNhc2UuCisgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxPWBlY2hvICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDIiIHxcCisgICAgICAgICAgJFNFRCAtZSAnc3xeOip8fCcgLWUgJ3N8OiokfHwnYAorICAgICAgICBjYXNlICRidWlsZCBpbgorICAgICAgICAgICptaW5ndyogKSAjIEFjdHVhbGx5LCBtc3lzLgorICAgICAgICAgICAgIyBBd2t3YXJkOiBjbWQgYXBwZW5kcyBzcGFjZXMgdG8gcmVzdWx0LgorICAgICAgICAgICAgbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcz0icy9bIF0qXCQvLyIKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPWAoIGNtZCAvL2MgZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX3N0cmlwX3RyYWlsaW5nX3NwYWNlcyIgKSAyPi9kZXYvbnVsbCB8fCBlY2hvICIiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgICAgICAgICA7OworICAgICAgICAgICpjeWd3aW4qICkKKyAgICAgICAgICAgIGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyPWBjeWdwYXRoIC13IC1wICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3RtcDEiYAorICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAyIiB8XAorICAgICAgICAgICAgICAkU0VEIC1lICIkbHRfc2VkX25haXZlX2JhY2tzbGFzaGlmeSJgCisgICAgICAgICAgICA7OworICAgICAgICAgICogKQorICAgICAgICAgICAgIyB1bmZvcnR1bmF0ZWx5LCB3aW5lcGF0aCBkb2Vzbid0IGNvbnZlcnQgcGF0aGxpc3RzCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSIiCisgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTPSRJRlMKKyAgICAgICAgICAgIElGUz06CisgICAgICAgICAgICBmb3IgZnVuY190b19ob3N0X3BhdGhsaXN0X2YgaW4gJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIDsgZG8KKyAgICAgICAgICAgICAgSUZTPSRmdW5jX3RvX2hvc3RfcGF0aGxpc3Rfb2xkSUZTCisgICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIgOyB0aGVuCisgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGggIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfZiIKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkZnVuY190b19ob3N0X3BhdGhfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ7JGZ1bmNfdG9faG9zdF9wYXRoX3Jlc3VsdCIKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgSUZTPToKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIElGUz0kZnVuY190b19ob3N0X3BhdGhsaXN0X29sZElGUworICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBpZiB0ZXN0IC16ICIkZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdCIgOyB0aGVuCisgICAgICAgICAgZnVuY19lcnJvciAiQ291bGQgbm90IGRldGVybWluZSB0aGUgaG9zdCBwYXRoKHMpIGNvcnJlc3BvbmRpbmcgdG8iCisgICAgICAgICAgZnVuY19lcnJvciAiICAnJDEnIgorICAgICAgICAgIGZ1bmNfZXJyb3IgIkNvbnRpbnVpbmcsIGJ1dCB1bmluc3RhbGxlZCBleGVjdXRhYmxlcyBtYXkgbm90IHdvcmsuIgorICAgICAgICAgICMgRmFsbGJhY2suIFRoaXMgbWF5IGJyZWFrIGlmICQxIGNvbnRhaW5zIERPUy1zdHlsZSBkcml2ZQorICAgICAgICAgICMgc3BlY2lmaWNhdGlvbnMuIFRoZSBmaXggaXMgbm90IHRvIGNvbXBsaWNhdGUgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgICAjIGJlbG93LCBidXQgZm9yIHRoZSB1c2VyIHRvIHByb3ZpZGUgYSB3b3JraW5nIHdpbmUgaW5zdGFsbGF0aW9uCisgICAgICAgICAgIyB3aXRoIHdpbmVwYXRoIHNvIHRoYXQgcGF0aCB0cmFuc2xhdGlvbiBpbiB0aGUgY3Jvc3MtdG8tbWluZ3cKKyAgICAgICAgICAjIGNhc2Ugd29ya3MgcHJvcGVybHkuCisgICAgICAgICAgbHRfcmVwbGFjZV9wYXRoc2VwX25peF90b19kb3M9InN8Onw7fGciCisgICAgICAgICAgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD1gZWNobyAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF90bXAxIiB8XAorICAgICAgICAgICAgJFNFRCAtZSAiJGx0X3JlcGxhY2VfcGF0aHNlcF9uaXhfdG9fZG9zImAKKyAgICAgICAgZmkKKyAgICAgICAgIyBOb3csIGFkZCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcGF0aCBzZXBhcmF0b3JzIGJhY2sKKyAgICAgICAgY2FzZSAiJDEiIGluCisgICAgICAgICAgOiogKSBmdW5jX3RvX2hvc3RfcGF0aGxpc3RfcmVzdWx0PSI7JGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGNhc2UgIiQxIiBpbgorICAgICAgICAgICo6ICkgZnVuY190b19ob3N0X3BhdGhsaXN0X3Jlc3VsdD0iJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQ7IgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICA7OworICAgIGVzYWMKKyAgZmkKK30KKyMgZW5kOiBmdW5jX3RvX2hvc3RfcGF0aGxpc3QKKworIyBmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjCisjIGVtaXQgdGhlIHNvdXJjZSBjb2RlIGZvciBhIHdyYXBwZXIgZXhlY3V0YWJsZSBvbiBzdGRvdXQKKyMgTXVzdCBPTkxZIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBmdW5jX21vZGVfbGluayBiZWNhdXNlCisjIGl0IGRlcGVuZHMgb24gYSBudW1iZXIgb2YgdmFyaWFibGUgc2V0IHRoZXJlaW4uCitmdW5jX2VtaXRfY3dyYXBwZXJleGVfc3JjICgpCit7CisJY2F0IDw8RU9GCisKKy8qICRjd3JhcHBlcnNvdXJjZSAtIHRlbXBvcmFyeSB3cmFwcGVyIGV4ZWN1dGFibGUgZm9yICRvYmpkaXIvJG91dHB1dG5hbWUKKyAgIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAoR05VICRQQUNLQUdFJFRJTUVTVEFNUCkgJFZFUlNJT04KKworICAgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisgICBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCisKKyAgIFRoaXMgd3JhcHBlciBleGVjdXRhYmxlIHNob3VsZCBuZXZlciBiZSBtb3ZlZCBvdXQgb2YgdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgIElmIGl0IGlzLCBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4KKworICAgQ3VycmVudGx5LCBpdCBzaW1wbHkgZXhlY3MgdGhlIHdyYXBwZXIgKnNjcmlwdCogIiRTSEVMTCAkb3V0cHV0IiwKKyAgIGJ1dCBjb3VsZCBldmVudHVhbGx5IGFic29yYiBhbGwgb2YgdGhlIHNjcmlwdHMgZnVuY3Rpb25hbGl0eSBhbmQKKyAgIGV4ZWMgJG9iamRpci8kb3V0cHV0bmFtZSBkaXJlY3RseS4KKyovCitFT0YKKwkgICAgY2F0IDw8IkVPRiIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmZGVmIF9NU0NfVkVSCisjIGluY2x1ZGUgPGRpcmVjdC5oPgorIyBpbmNsdWRlIDxwcm9jZXNzLmg+CisjIGluY2x1ZGUgPGlvLmg+CisjIGRlZmluZSBzZXRtb2RlIF9zZXRtb2RlCisjZWxzZQorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGlmZGVmIF9fQ1lHV0lOX18KKyMgIGluY2x1ZGUgPGlvLmg+CisjICBkZWZpbmUgSEFWRV9TRVRFTlYKKyMgIGlmZGVmIF9fU1RSSUNUX0FOU0lfXworY2hhciAqcmVhbHBhdGggKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK2ludCBwdXRlbnYgKGNoYXIgKik7CitpbnQgc2V0ZW52IChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWYgZGVmaW5lZChQQVRIX01BWCkKKyMgZGVmaW5lIExUX1BBVEhNQVggUEFUSF9NQVgKKyNlbGlmIGRlZmluZWQoTUFYUEFUSExFTikKKyMgZGVmaW5lIExUX1BBVEhNQVggTUFYUEFUSExFTgorI2Vsc2UKKyMgZGVmaW5lIExUX1BBVEhNQVggMTAyNAorI2VuZGlmCisKKyNpZm5kZWYgU19JWE9USAorIyBkZWZpbmUgU19JWE9USCAwCisjZW5kaWYKKyNpZm5kZWYgU19JWEdSUAorIyBkZWZpbmUgU19JWEdSUCAwCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjIGRlZmluZSBTX0lYVVNSIF9TX0lFWEVDCisjIGRlZmluZSBzdGF0IF9zdGF0CisjIGlmbmRlZiBfSU5UUFRSX1RfREVGSU5FRAorIyAgZGVmaW5lIGludHB0cl90IGludAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUgorIyBkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKKyMgZGVmaW5lIFBBVEhfU0VQQVJBVE9SICc6JworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX19ESkdQUF9fKSB8fCBcCisgIGRlZmluZWQgKF9fT1MyX18pCisjIGRlZmluZSBIQVZFX0RPU19CQVNFRF9GSUxFX1NZU1RFTQorIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorIyBpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjICBkZWZpbmUgRElSX1NFUEFSQVRPUl8yICdcXCcKKyMgZW5kaWYKKyMgaWZuZGVmIFBBVEhfU0VQQVJBVE9SXzIKKyMgIGRlZmluZSBQQVRIX1NFUEFSQVRPUl8yICc7JworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRElSX1NFUEFSQVRPUl8yCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSAoKGNoKSA9PSBESVJfU0VQQVJBVE9SKQorI2Vsc2UgLyogRElSX1NFUEFSQVRPUl8yICovCisjIGRlZmluZSBJU19ESVJfU0VQQVJBVE9SKGNoKSBcCisJKCgoY2gpID09IERJUl9TRVBBUkFUT1IpIHx8ICgoY2gpID09IERJUl9TRVBBUkFUT1JfMikpCisjZW5kaWYgLyogRElSX1NFUEFSQVRPUl8yICovCisKKyNpZm5kZWYgUEFUSF9TRVBBUkFUT1JfMgorIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SKQorI2Vsc2UgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworIyBkZWZpbmUgSVNfUEFUSF9TRVBBUkFUT1IoY2gpICgoY2gpID09IFBBVEhfU0VQQVJBVE9SXzIpCisjZW5kaWYgLyogUEFUSF9TRVBBUkFUT1JfMiAqLworCisjaWZkZWYgX19DWUdXSU5fXworIyBkZWZpbmUgRk9QRU5fV0IgIndiIgorI2VuZGlmCisKKyNpZm5kZWYgRk9QRU5fV0IKKyMgZGVmaW5lIEZPUEVOX1dCICJ3IgorI2VuZGlmCisjaWZuZGVmIF9PX0JJTkFSWQorIyBkZWZpbmUgX09fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIFhNQUxMT0ModHlwZSwgbnVtKSAgICAgICgodHlwZSAqKSB4bWFsbG9jICgobnVtKSAqIHNpemVvZih0eXBlKSkpCisjZGVmaW5lIFhGUkVFKHN0YWxlKSBkbyB7IFwKKyAgaWYgKHN0YWxlKSB7IGZyZWUgKCh2b2lkICopIHN0YWxlKTsgc3RhbGUgPSAwOyB9IFwKK30gd2hpbGUgKDApCisKKyN1bmRlZiBMVFdSQVBQRVJfREVCVUdQUklOVEYKKyNpZiBkZWZpbmVkIERFQlVHV1JBUFBFUgorIyBkZWZpbmUgTFRXUkFQUEVSX0RFQlVHUFJJTlRGKGFyZ3MpIGx0d3JhcHBlcl9kZWJ1Z3ByaW50ZiBhcmdzCitzdGF0aWMgdm9pZAorbHR3cmFwcGVyX2RlYnVncHJpbnRmIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgKHZvaWQpIHZmcHJpbnRmIChzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgdmFfZW5kIChhcmdzKTsKK30KKyNlbHNlCisjIGRlZmluZSBMVFdSQVBQRVJfREVCVUdQUklOVEYoYXJncykKKyNlbmRpZgorCitjb25zdCBjaGFyICpwcm9ncmFtX25hbWUgPSBOVUxMOworCit2b2lkICp4bWFsbG9jIChzaXplX3QgbnVtKTsKK2NoYXIgKnhzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cmluZyk7Citjb25zdCBjaGFyICpiYXNlX25hbWUgKGNvbnN0IGNoYXIgKm5hbWUpOworY2hhciAqZmluZF9leGVjdXRhYmxlIChjb25zdCBjaGFyICp3cmFwcGVyKTsKK2NoYXIgKmNoYXNlX3N5bWxpbmtzIChjb25zdCBjaGFyICpwYXRoc3BlYyk7CitpbnQgbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKK2ludCBjaGVja19leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKTsKK2NoYXIgKnN0cmVuZHphcCAoY2hhciAqc3RyLCBjb25zdCBjaGFyICpwYXQpOwordm9pZCBsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKTsKK3ZvaWQgbHRfc2V0ZW52IChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CitjaGFyICpsdF9leHRlbmRfc3RyIChjb25zdCBjaGFyICpvcmlnX3ZhbHVlLCBjb25zdCBjaGFyICphZGQsIGludCB0b19lbmQpOwordm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChjb25zdCBjaGFyICphcmcpOwordm9pZCBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoY29uc3QgY2hhciAqYXJnKTsKK3ZvaWQgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAoY29uc3QgY2hhciAqYXJnKTsKK2ludCBsdF9zcGxpdF9uYW1lX3ZhbHVlIChjb25zdCBjaGFyICphcmcsIGNoYXIqKiBuYW1lLCBjaGFyKiogdmFsdWUpOwordm9pZCBsdF91cGRhdGVfZXhlX3BhdGggKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKK3ZvaWQgbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpzY3JpcHRfdGV4dF9wYXJ0MSA9CitFT0YKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlcl9wYXJ0MSB5ZXMgfAorCSAgICAgICAgJFNFRCAtZSAncy9cKFtcXCJdXCkvXFxcMS9nJyBcCisJICAgICAgICAgICAgIC1lICdzL14vICAiLycgLWUgJ3MvJC9cXG4iLycKKwkgICAgZWNobyAiOyIKKwkgICAgY2F0IDw8RU9GCisKK3N0YXRpYyBjb25zdCBjaGFyICpzY3JpcHRfdGV4dF9wYXJ0MiA9CitFT0YKKwkgICAgZnVuY19lbWl0X3dyYXBwZXJfcGFydDIgeWVzIHwKKwkgICAgICAgICRTRUQgLWUgJ3MvXChbXFwiXVwpL1xcXDEvZycgXAorCSAgICAgICAgICAgICAtZSAncy9eLyAgIi8nIC1lICdzLyQvXFxuIi8nCisJICAgIGVjaG8gIjsiCisKKwkgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogTUFHSUNfRVhFID0gIiRtYWdpY19leGUiOworY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBUk5BTUUgPSAiJHNobGlicGF0aF92YXIiOworRU9GCisKKwkgICAgaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgIiR0ZW1wX3JwYXRoIgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIExJQl9QQVRIX1ZBTFVFICAgPSAiIjsKK0VPRgorCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgorICAgICAgICAgICAgICBmdW5jX3RvX2hvc3RfcGF0aGxpc3QgIiRkbGxzZWFyY2hwYXRoOiIKKwkgICAgICBjYXQgPDxFT0YKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQVJOQU1FID0gIlBBVEgiOworY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBTFVFICAgPSAiJGZ1bmNfdG9faG9zdF9wYXRobGlzdF9yZXN1bHQiOworRU9GCisJICAgIGVsc2UKKwkgICAgICBjYXQgPDwiRU9GIgorY29uc3QgY2hhciAqIEVYRV9QQVRIX1ZBUk5BTUUgPSAiIjsKK2NvbnN0IGNoYXIgKiBFWEVfUEFUSF9WQUxVRSAgID0gIiI7CitFT0YKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICAgIGNhdCA8PEVPRgorY29uc3QgY2hhciAqIFRBUkdFVF9QUk9HUkFNX05BTUUgPSAibHQtJG91dHB1dG5hbWUiOyAvKiBob3BlZnVsbHksIG5vIC5leGUgKi8KK0VPRgorCSAgICBlbHNlCisJICAgICAgY2F0IDw8RU9GCitjb25zdCBjaGFyICogVEFSR0VUX1BST0dSQU1fTkFNRSA9ICIkb3V0cHV0bmFtZSI7IC8qIGhvcGVmdWxseSwgbm8gLmV4ZSAqLworRU9GCisJICAgIGZpCisKKworCSAgICBjYXQgPDwiRU9GIgorCisjZGVmaW5lIExUV1JBUFBFUl9PUFRJT05fUFJFRklYICAgICAgICAgIi0tbHQtIgorI2RlZmluZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWF9MRU5HVEggIDUKKworc3RhdGljIGNvbnN0IHNpemVfdCBvcHRfcHJlZml4X2xlbiAgICAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIOworc3RhdGljIGNvbnN0IGNoYXIgKmx0d3JhcHBlcl9vcHRpb25fcHJlZml4ID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVg7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkdW1wc2NyaXB0X29wdCAgICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYICJkdW1wLXNjcmlwdCI7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgZW52X3NldF9vcHRfbGVuICAgICA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCArIDc7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X3NldF9vcHQgICAgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZW52LXNldCI7CisgIC8qIGFyZ3VtZW50IGlzIHB1dGVudi1zdHlsZSAiZm9vPWJhciIsIHZhbHVlIG9mIGZvbyBpcyBzZXQgdG8gYmFyICovCisKK3N0YXRpYyBjb25zdCBzaXplX3QgZW52X3ByZXBlbmRfb3B0X2xlbiA9IExUV1JBUFBFUl9PUFRJT05fUFJFRklYX0xFTkdUSCArIDExOworc3RhdGljIGNvbnN0IGNoYXIgKmVudl9wcmVwZW5kX29wdCAgICAgID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVggImVudi1wcmVwZW5kIjsKKyAgLyogYXJndW1lbnQgaXMgcHV0ZW52LXN0eWxlICJmb289YmFyIiwgbmV3IHZhbHVlIG9mIGZvbyBpcyBiYXIke2Zvb30gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBlbnZfYXBwZW5kX29wdF9sZW4gID0gTFRXUkFQUEVSX09QVElPTl9QUkVGSVhfTEVOR1RIICsgMTA7CitzdGF0aWMgY29uc3QgY2hhciAqZW52X2FwcGVuZF9vcHQgICAgICAgPSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWCAiZW52LWFwcGVuZCI7CisgIC8qIGFyZ3VtZW50IGlzIHB1dGVudi1zdHlsZSAiZm9vPWJhciIsIG5ldyB2YWx1ZSBvZiBmb28gaXMgJHtmb299YmFyICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgY2hhciAqKm5ld2FyZ3o7CisgIGludCAgbmV3YXJnYzsKKyAgY2hhciAqdG1wX3BhdGhzcGVjOworICBjaGFyICphY3R1YWxfY3dyYXBwZXJfcGF0aDsKKyAgY2hhciAqYWN0dWFsX2N3cmFwcGVyX25hbWU7CisgIGNoYXIgKnRhcmdldF9uYW1lOworICBjaGFyICpsdF9hcmd2X3plcm87CisgIGludHB0cl90IHJ2YWwgPSAxMjc7CisKKyAgaW50IGk7CisKKyAgcHJvZ3JhbV9uYW1lID0gKGNoYXIgKikgeHN0cmR1cCAoYmFzZV9uYW1lIChhcmd2WzBdKSk7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgYXJndlswXSAgICAgIDogJXNcbiIsIGFyZ3ZbMF0pKTsKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBwcm9ncmFtX25hbWUgOiAlc1xuIiwgcHJvZ3JhbV9uYW1lKSk7CisKKyAgLyogdmVyeSBzaW1wbGUgYXJnIHBhcnNpbmc7IGRvbid0IHdhbnQgdG8gcmVseSBvbiBnZXRvcHQgKi8KKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICB7CisgICAgICBpZiAoc3RyY21wIChhcmd2W2ldLCBkdW1wc2NyaXB0X29wdCkgPT0gMCkKKwl7CitFT0YKKwkgICAgY2FzZSAiJGhvc3QiIGluCisJICAgICAgKm1pbmd3KiB8ICpjeWd3aW4qICkKKwkJIyBtYWtlIHN0ZG91dCB1c2UgInVuaXgiIGxpbmUgZW5kaW5ncworCQllY2hvICIgICAgICAgICAgc2V0bW9kZSgxLF9PX0JJTkFSWSk7IgorCQk7OworCSAgICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorCSAgcHJpbnRmICgiJXMiLCBzY3JpcHRfdGV4dF9wYXJ0MSk7CisJICBwcmludGYgKCIlcyIsIHNjcmlwdF90ZXh0X3BhcnQyKTsKKwkgIHJldHVybiAwOworCX0KKyAgICB9CisKKyAgbmV3YXJneiA9IFhNQUxMT0MgKGNoYXIgKiwgYXJnYyArIDEpOworICB0bXBfcGF0aHNwZWMgPSBmaW5kX2V4ZWN1dGFibGUgKGFyZ3ZbMF0pOworICBpZiAodG1wX3BhdGhzcGVjID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJDb3VsZG4ndCBmaW5kICVzIiwgYXJndlswXSk7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZm91bmQgZXhlIChiZWZvcmUgc3ltbGluayBjaGFzZSkgYXQgOiAlc1xuIiwKKwkJCSAgdG1wX3BhdGhzcGVjKSk7CisKKyAgYWN0dWFsX2N3cmFwcGVyX3BhdGggPSBjaGFzZV9zeW1saW5rcyAodG1wX3BhdGhzcGVjKTsKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBmb3VuZCBleGUgKGFmdGVyIHN5bWxpbmsgY2hhc2UpIGF0IDogJXNcbiIsCisJCQkgIGFjdHVhbF9jd3JhcHBlcl9wYXRoKSk7CisgIFhGUkVFICh0bXBfcGF0aHNwZWMpOworCisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0geHN0cmR1cCggYmFzZV9uYW1lIChhY3R1YWxfY3dyYXBwZXJfcGF0aCkpOworICBzdHJlbmR6YXAgKGFjdHVhbF9jd3JhcHBlcl9wYXRoLCBhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisKKyAgLyogd3JhcHBlciBuYW1lIHRyYW5zZm9ybXMgKi8KKyAgc3RyZW5kemFwIChhY3R1YWxfY3dyYXBwZXJfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAoYWN0dWFsX2N3cmFwcGVyX25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFIChhY3R1YWxfY3dyYXBwZXJfbmFtZSk7CisgIGFjdHVhbF9jd3JhcHBlcl9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIC8qIHRhcmdldF9uYW1lIHRyYW5zZm9ybXMgLS0gdXNlIGFjdHVhbCB0YXJnZXQgcHJvZ3JhbSBuYW1lOyBtaWdodCBoYXZlIGx0LSBwcmVmaXggKi8KKyAgdGFyZ2V0X25hbWUgPSB4c3RyZHVwIChiYXNlX25hbWUgKFRBUkdFVF9QUk9HUkFNX05BTUUpKTsKKyAgc3RyZW5kemFwICh0YXJnZXRfbmFtZSwgIi5leGUiKTsKKyAgdG1wX3BhdGhzcGVjID0gbHRfZXh0ZW5kX3N0ciAodGFyZ2V0X25hbWUsICIuZXhlIiwgMSk7CisgIFhGUkVFICh0YXJnZXRfbmFtZSk7CisgIHRhcmdldF9uYW1lID0gdG1wX3BhdGhzcGVjOworICB0bXBfcGF0aHNwZWMgPSAwOworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgbGlidG9vbCB0YXJnZXQgbmFtZTogJXNcbiIsCisJCQkgIHRhcmdldF9uYW1lKSk7CitFT0YKKworCSAgICBjYXQgPDxFT0YKKyAgbmV3YXJnelswXSA9CisgICAgWE1BTExPQyAoY2hhciwgKHN0cmxlbiAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpICsKKwkJICAgIHN0cmxlbiAoIiRvYmpkaXIiKSArIDEgKyBzdHJsZW4gKGFjdHVhbF9jd3JhcHBlcl9uYW1lKSArIDEpKTsKKyAgc3RyY3B5IChuZXdhcmd6WzBdLCBhY3R1YWxfY3dyYXBwZXJfcGF0aCk7CisgIHN0cmNhdCAobmV3YXJnelswXSwgIiRvYmpkaXIiKTsKKyAgc3RyY2F0IChuZXdhcmd6WzBdLCAiLyIpOworRU9GCisKKwkgICAgY2F0IDw8IkVPRiIKKyAgLyogc3RvcCBoZXJlLCBhbmQgY29weSBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoaXMgdHdpY2UgKi8KKyAgdG1wX3BhdGhzcGVjID0geHN0cmR1cCAobmV3YXJnelswXSk7CisKKyAgLyogZG8gTk9UIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSwgc28gdXNlIGFjdHVhbF9jd3JhcHBlcl9uYW1lICovCisgIHN0cmNhdCAobmV3YXJnelswXSwgYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIC8qIERPIHdhbnQgdGhlIGx0LSBwcmVmaXggaGVyZSBpZiBpdCBleGlzdHMsIHNvIHVzZSB0YXJnZXRfbmFtZSAqLworICBsdF9hcmd2X3plcm8gPSBsdF9leHRlbmRfc3RyICh0bXBfcGF0aHNwZWMsIHRhcmdldF9uYW1lLCAxKTsKKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisgIHRtcF9wYXRoc3BlYyA9IE5VTEw7CitFT0YKKworCSAgICBjYXNlICRob3N0X29zIGluCisJICAgICAgbWluZ3cqKQorCSAgICBjYXQgPDwiRU9GIgorICB7CisgICAgY2hhciogcDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIgKG5ld2FyZ3pbMF0sICdcXCcpKSAhPSBOVUxMKQorICAgICAgeworCSpwID0gJy8nOworICAgICAgfQorICAgIHdoaWxlICgocCA9IHN0cmNociAobHRfYXJndl96ZXJvLCAnXFwnKSkgIT0gTlVMTCkKKyAgICAgIHsKKwkqcCA9ICcvJzsKKyAgICAgIH0KKyAgfQorRU9GCisJICAgIDs7CisJICAgIGVzYWMKKworCSAgICBjYXQgPDwiRU9GIgorICBYRlJFRSAodGFyZ2V0X25hbWUpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX3BhdGgpOworICBYRlJFRSAoYWN0dWFsX2N3cmFwcGVyX25hbWUpOworCisgIGx0X3NldGVudiAoIkJJTl9TSCIsICJ4cGc0Iik7IC8qIGZvciBUcnU2NCAqLworICBsdF9zZXRlbnYgKCJEVUFMQ0FTRSIsICIxIik7ICAvKiBmb3IgTVNLIHNoICovCisgIGx0X3VwZGF0ZV9saWJfcGF0aCAoTElCX1BBVEhfVkFSTkFNRSwgTElCX1BBVEhfVkFMVUUpOworICBsdF91cGRhdGVfZXhlX3BhdGggKEVYRV9QQVRIX1ZBUk5BTUUsIEVYRV9QQVRIX1ZBTFVFKTsKKworICBuZXdhcmdjPTA7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgaWYgKHN0cm5jbXAgKGFyZ3ZbaV0sIGVudl9zZXRfb3B0LCBlbnZfc2V0X29wdF9sZW4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXJndltpXVtlbnZfc2V0X29wdF9sZW5dID09ICc9JykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqcCA9IGFyZ3ZbaV0gKyBlbnZfc2V0X29wdF9sZW4gKyAxOworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfc2V0IChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmd2W2ldW2Vudl9zZXRfb3B0X2xlbl0gPT0gJ1wwJyAmJiBpICsgMSA8IGFyZ2MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9zZXQgKGFyZ3ZbKytpXSk7IC8qIGRvbid0IGNvcHkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBsdF9mYXRhbCAoIiVzIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQiLCBlbnZfc2V0X29wdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfcHJlcGVuZF9vcHQsIGVudl9wcmVwZW5kX29wdF9sZW4pID09IDApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoYXJndltpXVtlbnZfcHJlcGVuZF9vcHRfbGVuXSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X3ByZXBlbmRfb3B0X2xlbiArIDE7CisgICAgICAgICAgICAgIGx0X29wdF9wcm9jZXNzX2Vudl9wcmVwZW5kIChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIGlmIChhcmd2W2ldW2Vudl9wcmVwZW5kX29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoYXJndlsrK2ldKTsgLyogZG9uJ3QgY29weSAqLworICAgICAgICAgICAgfQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGx0X2ZhdGFsICgiJXMgbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCIsIGVudl9wcmVwZW5kX29wdCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIGlmIChzdHJuY21wIChhcmd2W2ldLCBlbnZfYXBwZW5kX29wdCwgZW52X2FwcGVuZF9vcHRfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgaWYgKGFyZ3ZbaV1bZW52X2FwcGVuZF9vcHRfbGVuXSA9PSAnPScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBhcmd2W2ldICsgZW52X2FwcGVuZF9vcHRfbGVuICsgMTsKKyAgICAgICAgICAgICAgbHRfb3B0X3Byb2Nlc3NfZW52X2FwcGVuZCAocCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZSBpZiAoYXJndltpXVtlbnZfYXBwZW5kX29wdF9sZW5dID09ICdcMCcgJiYgaSArIDEgPCBhcmdjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBsdF9vcHRfcHJvY2Vzc19lbnZfYXBwZW5kIChhcmd2WysraV0pOyAvKiBkb24ndCBjb3B5ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbHRfZmF0YWwgKCIlcyBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IiwgZW52X2FwcGVuZF9vcHQpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICBpZiAoc3RybmNtcCAoYXJndltpXSwgbHR3cmFwcGVyX29wdGlvbl9wcmVmaXgsIG9wdF9wcmVmaXhfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgLyogaG93ZXZlciwgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZSwgYnV0IGl0IGlzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2Uga25vdyBhYm91dCBhbmQKKyAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZGVhbHQgd2l0aCwgYWJvdmUgKGlubHVkaW5nIGR1bXAtc2NyaXB0KSwgdGhlbgorICAgICAgICAgICAgIHJlcG9ydCBhbiBlcnJvci4gT3RoZXJ3aXNlLCB0YXJnZXRzIG1pZ2h0IGJlZ2luIHRvIGJlbGlldmUKKyAgICAgICAgICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIHVzZSBvcHRpb25zIGluIHRoZSBMVFdSQVBQRVJfT1BUSU9OX1BSRUZJWAorICAgICAgICAgICAgIG5hbWVzcGFjZS4gVGhlIGZpcnN0IHRpbWUgYW55IHVzZXIgY29tcGxhaW5zIGFib3V0IHRoaXMsIHdlJ2xsCisgICAgICAgICAgICAgbmVlZCB0byBtYWtlIExUV1JBUFBFUl9PUFRJT05fUFJFRklYIGEgY29uZmlndXJlLXRpbWUgb3B0aW9uCisgICAgICAgICAgICAgb3IgYSBjb25maWd1cmUuYWMtc2V0dGFibGUgdmFsdWUuCisgICAgICAgICAgICovCisgICAgICAgICAgbHRfZmF0YWwgKCJVbnJlY29nbml6ZWQgb3B0aW9uIGluICVzIG5hbWVzcGFjZTogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGx0d3JhcHBlcl9vcHRpb25fcHJlZml4LCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgLyogb3RoZXJ3aXNlIC4uLiAqLworICAgICAgbmV3YXJnelsrK25ld2FyZ2NdID0geHN0cmR1cCAoYXJndltpXSk7CisgICAgfQorICBuZXdhcmd6WysrbmV3YXJnY10gPSBOVUxMOworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAgICAgKCgiKG1haW4pIGx0X2FyZ3ZfemVybyA6ICVzXG4iLCAobHRfYXJndl96ZXJvID8gbHRfYXJndl96ZXJvIDogIjxOVUxMPiIpKSk7CisgIGZvciAoaSA9IDA7IGkgPCBuZXdhcmdjOyBpKyspCisgICAgeworICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihtYWluKSBuZXdhcmd6WyVkXSAgIDogJXNcbiIsIGksIChuZXdhcmd6W2ldID8gbmV3YXJneltpXSA6ICI8TlVMTD4iKSkpOworICAgIH0KKworRU9GCisKKwkgICAgY2FzZSAkaG9zdF9vcyBpbgorCSAgICAgIG1pbmd3KikKKwkJY2F0IDw8IkVPRiIKKyAgLyogZXhlY3YgZG9lc24ndCBhY3R1YWxseSB3b3JrIG9uIG1pbmd3IGFzIGV4cGVjdGVkIG9uIHVuaXggKi8KKyAgcnZhbCA9IF9zcGF3bnYgKF9QX1dBSVQsIGx0X2FyZ3ZfemVybywgKGNvbnN0IGNoYXIgKiBjb25zdCAqKSBuZXdhcmd6KTsKKyAgaWYgKHJ2YWwgPT0gLTEpCisgICAgeworICAgICAgLyogZmFpbGVkIHRvIHN0YXJ0IHByb2Nlc3MgKi8KKyAgICAgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFpbikgZmFpbGVkIHRvIGxhdW5jaCB0YXJnZXQgXCIlc1wiOiBlcnJubyA9ICVkXG4iLCBsdF9hcmd2X3plcm8sIGVycm5vKSk7CisgICAgICByZXR1cm4gMTI3OworICAgIH0KKyAgcmV0dXJuIHJ2YWw7CitFT0YKKwkJOzsKKwkgICAgICAqKQorCQljYXQgPDwiRU9GIgorICBleGVjdiAobHRfYXJndl96ZXJvLCBuZXdhcmd6KTsKKyAgcmV0dXJuIHJ2YWw7IC8qID0xMjcsIGJ1dCBhdm9pZHMgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcgKi8KK0VPRgorCQk7OworCSAgICBlc2FjCisKKwkgICAgY2F0IDw8IkVPRiIKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3QgbnVtKQoreworICB2b2lkICpwID0gKHZvaWQgKikgbWFsbG9jIChudW0pOworICBpZiAoIXApCisgICAgbHRfZmF0YWwgKCJNZW1vcnkgZXhoYXVzdGVkIik7CisKKyAgcmV0dXJuIHA7Cit9CisKK2NoYXIgKgoreHN0cmR1cCAoY29uc3QgY2hhciAqc3RyaW5nKQoreworICByZXR1cm4gc3RyaW5nID8gc3RyY3B5ICgoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHN0cmluZykgKyAxKSwKKwkJCSAgc3RyaW5nKSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKgorYmFzZV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICBjb25zdCBjaGFyICpiYXNlOworCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIC8qIFNraXAgb3ZlciB0aGUgZGlzayBuYW1lIGluIE1TRE9TIHBhdGhuYW1lcy4gKi8KKyAgaWYgKGlzYWxwaGEgKCh1bnNpZ25lZCBjaGFyKSBuYW1lWzBdKSAmJiBuYW1lWzFdID09ICc6JykKKyAgICBuYW1lICs9IDI7CisjZW5kaWYKKworICBmb3IgKGJhc2UgPSBuYW1lOyAqbmFtZTsgbmFtZSsrKQorICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICgqbmFtZSkpCisgICAgICBiYXNlID0gbmFtZSArIDE7CisgIHJldHVybiBiYXNlOworfQorCitpbnQKK2NoZWNrX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIoY2hlY2tfZXhlY3V0YWJsZSkgIDogJXNcbiIsCisJCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoKHN0YXQgKHBhdGgsICZzdCkgPj0gMCkKKyAgICAgICYmIChzdC5zdF9tb2RlICYgKFNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCkpKQorICAgIHJldHVybiAxOworICBlbHNlCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorbWFrZV9leGVjdXRhYmxlIChjb25zdCBjaGFyICpwYXRoKQoreworICBpbnQgcnZhbCA9IDA7CisgIHN0cnVjdCBzdGF0IHN0OworCisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobWFrZV9leGVjdXRhYmxlKSAgIDogJXNcbiIsCisJCQkgIHBhdGggPyAoKnBhdGggPyBwYXRoIDogIkVNUFRZISIpIDogIk5VTEwhIikpOworICBpZiAoKCFwYXRoKSB8fCAoISpwYXRoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3RhdCAocGF0aCwgJnN0KSA+PSAwKQorICAgIHsKKyAgICAgIHJ2YWwgPSBjaG1vZCAocGF0aCwgc3Quc3RfbW9kZSB8IFNfSVhPVEggfCBTX0lYR1JQIHwgU19JWFVTUik7CisgICAgfQorICByZXR1cm4gcnZhbDsKK30KKworLyogU2VhcmNoZXMgZm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIHdyYXBwZXIuICBSZXR1cm5zCisgICBuZXdseSBhbGxvY2F0ZWQgZnVsbCBwYXRoIG5hbWUgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgICBEb2VzIG5vdCBjaGFzZSBzeW1saW5rcywgZXZlbiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IHRoZW0uCisqLworY2hhciAqCitmaW5kX2V4ZWN1dGFibGUgKGNvbnN0IGNoYXIgKndyYXBwZXIpCit7CisgIGludCBoYXNfc2xhc2ggPSAwOworICBjb25zdCBjaGFyICpwOworICBjb25zdCBjaGFyICpwX25leHQ7CisgIC8qIHN0YXRpYyBidWZmZXIgZm9yIGdldGN3ZCAqLworICBjaGFyIHRtcFtMVF9QQVRITUFYICsgMV07CisgIGludCB0bXBfbGVuOworICBjaGFyICpjb25jYXRfbmFtZTsKKworICBMVFdSQVBQRVJfREVCVUdQUklOVEYgKCgiKGZpbmRfZXhlY3V0YWJsZSkgICA6ICVzXG4iLAorCQkJICB3cmFwcGVyID8gKCp3cmFwcGVyID8gd3JhcHBlciA6ICJFTVBUWSEiKSA6ICJOVUxMISIpKTsKKworICBpZiAoKHdyYXBwZXIgPT0gTlVMTCkgfHwgKCp3cmFwcGVyID09ICdcMCcpKQorICAgIHJldHVybiBOVUxMOworCisgIC8qIEFic29sdXRlIHBhdGg/ICovCisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgIGlmIChpc2FscGhhICgodW5zaWduZWQgY2hhcikgd3JhcHBlclswXSkgJiYgd3JhcHBlclsxXSA9PSAnOicpCisgICAgeworICAgICAgY29uY2F0X25hbWUgPSB4c3RyZHVwICh3cmFwcGVyKTsKKyAgICAgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisJcmV0dXJuIGNvbmNhdF9uYW1lOworICAgICAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisjZW5kaWYKKyAgICAgIGlmIChJU19ESVJfU0VQQVJBVE9SICh3cmFwcGVyWzBdKSkKKwl7CisJICBjb25jYXRfbmFtZSA9IHhzdHJkdXAgKHdyYXBwZXIpOworCSAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgWEZSRUUgKGNvbmNhdF9uYW1lKTsKKwl9CisjaWYgZGVmaW5lZCAoSEFWRV9ET1NfQkFTRURfRklMRV9TWVNURU0pCisgICAgfQorI2VuZGlmCisKKyAgZm9yIChwID0gd3JhcHBlcjsgKnA7IHArKykKKyAgICBpZiAoKnAgPT0gJy8nKQorICAgICAgeworCWhhc19zbGFzaCA9IDE7CisJYnJlYWs7CisgICAgICB9CisgIGlmICghaGFzX3NsYXNoKQorICAgIHsKKyAgICAgIC8qIG5vIHNsYXNoZXM7IHNlYXJjaCBQQVRIICovCisgICAgICBjb25zdCBjaGFyICpwYXRoID0gZ2V0ZW52ICgiUEFUSCIpOworICAgICAgaWYgKHBhdGggIT0gTlVMTCkKKwl7CisJICBmb3IgKHAgPSBwYXRoOyAqcDsgcCA9IHBfbmV4dCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKnE7CisJICAgICAgc2l6ZV90IHBfbGVuOworCSAgICAgIGZvciAocSA9IHA7ICpxOyBxKyspCisJCWlmIChJU19QQVRIX1NFUEFSQVRPUiAoKnEpKQorCQkgIGJyZWFrOworCSAgICAgIHBfbGVuID0gcSAtIHA7CisJICAgICAgcF9uZXh0ID0gKCpxID09ICdcMCcgPyBxIDogcSArIDEpOworCSAgICAgIGlmIChwX2xlbiA9PSAwKQorCQl7CisJCSAgLyogZW1wdHkgcGF0aDogY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisJCSAgICBsdF9mYXRhbCAoImdldGN3ZCBmYWlsZWQiKTsKKwkJICB0bXBfbGVuID0gc3RybGVuICh0bXApOworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHRtcF9sZW4gKyAxICsgc3RybGVuICh3cmFwcGVyKSArIDEpOworCQkgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisJCSAgY29uY2F0X25hbWVbdG1wX2xlbl0gPSAnLyc7CisJCSAgc3RyY3B5IChjb25jYXRfbmFtZSArIHRtcF9sZW4gKyAxLCB3cmFwcGVyKTsKKwkJfQorCSAgICAgIGVsc2UKKwkJeworCQkgIGNvbmNhdF9uYW1lID0KKwkJICAgIFhNQUxMT0MgKGNoYXIsIHBfbGVuICsgMSArIHN0cmxlbiAod3JhcHBlcikgKyAxKTsKKwkJICBtZW1jcHkgKGNvbmNhdF9uYW1lLCBwLCBwX2xlbik7CisJCSAgY29uY2F0X25hbWVbcF9sZW5dID0gJy8nOworCQkgIHN0cmNweSAoY29uY2F0X25hbWUgKyBwX2xlbiArIDEsIHdyYXBwZXIpOworCQl9CisJICAgICAgaWYgKGNoZWNrX2V4ZWN1dGFibGUgKGNvbmNhdF9uYW1lKSkKKwkJcmV0dXJuIGNvbmNhdF9uYW1lOworCSAgICAgIFhGUkVFIChjb25jYXRfbmFtZSk7CisJICAgIH0KKwl9CisgICAgICAvKiBub3QgZm91bmQgaW4gUEFUSDsgYXNzdW1lIGN1cmRpciAqLworICAgIH0KKyAgLyogUmVsYXRpdmUgcGF0aCB8IG5vdCBmb3VuZCBpbiBwYXRoOiBwcmVwZW5kIGN3ZCAqLworICBpZiAoZ2V0Y3dkICh0bXAsIExUX1BBVEhNQVgpID09IE5VTEwpCisgICAgbHRfZmF0YWwgKCJnZXRjd2QgZmFpbGVkIik7CisgIHRtcF9sZW4gPSBzdHJsZW4gKHRtcCk7CisgIGNvbmNhdF9uYW1lID0gWE1BTExPQyAoY2hhciwgdG1wX2xlbiArIDEgKyBzdHJsZW4gKHdyYXBwZXIpICsgMSk7CisgIG1lbWNweSAoY29uY2F0X25hbWUsIHRtcCwgdG1wX2xlbik7CisgIGNvbmNhdF9uYW1lW3RtcF9sZW5dID0gJy8nOworICBzdHJjcHkgKGNvbmNhdF9uYW1lICsgdG1wX2xlbiArIDEsIHdyYXBwZXIpOworCisgIGlmIChjaGVja19leGVjdXRhYmxlIChjb25jYXRfbmFtZSkpCisgICAgcmV0dXJuIGNvbmNhdF9uYW1lOworICBYRlJFRSAoY29uY2F0X25hbWUpOworICByZXR1cm4gTlVMTDsKK30KKworY2hhciAqCitjaGFzZV9zeW1saW5rcyAoY29uc3QgY2hhciAqcGF0aHNwZWMpCit7CisjaWZuZGVmIFNfSVNMTksKKyAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyNlbHNlCisgIGNoYXIgYnVmW0xUX1BBVEhNQVhdOworICBzdHJ1Y3Qgc3RhdCBzOworICBjaGFyICp0bXBfcGF0aHNwZWMgPSB4c3RyZHVwIChwYXRoc3BlYyk7CisgIGNoYXIgKnA7CisgIGludCBoYXNfc3ltbGlua3MgPSAwOworICB3aGlsZSAoc3RybGVuICh0bXBfcGF0aHNwZWMpICYmICFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoImNoZWNraW5nIHBhdGggY29tcG9uZW50IGZvciBzeW1saW5rczogJXNcbiIsCisJCQkgICAgICB0bXBfcGF0aHNwZWMpKTsKKyAgICAgIGlmIChsc3RhdCAodG1wX3BhdGhzcGVjLCAmcykgPT0gMCkKKwl7CisJICBpZiAoU19JU0xOSyAocy5zdF9tb2RlKSAhPSAwKQorCSAgICB7CisJICAgICAgaGFzX3N5bWxpbmtzID0gMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCisJICAvKiBzZWFyY2ggYmFja3dhcmRzIGZvciBsYXN0IERJUl9TRVBBUkFUT1IgKi8KKwkgIHAgPSB0bXBfcGF0aHNwZWMgKyBzdHJsZW4gKHRtcF9wYXRoc3BlYykgLSAxOworCSAgd2hpbGUgKChwID4gdG1wX3BhdGhzcGVjKSAmJiAoIUlTX0RJUl9TRVBBUkFUT1IgKCpwKSkpCisJICAgIHAtLTsKKwkgIGlmICgocCA9PSB0bXBfcGF0aHNwZWMpICYmICghSVNfRElSX1NFUEFSQVRPUiAoKnApKSkKKwkgICAgeworCSAgICAgIC8qIG5vIG1vcmUgRElSX1NFUEFSQVRPUlMgbGVmdCAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAqcCA9ICdcMCc7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGNoYXIgKmVycnN0ciA9IHN0cmVycm9yIChlcnJubyk7CisJICBsdF9mYXRhbCAoIkVycm9yIGFjY2Vzc2luZyBmaWxlICVzICglcykiLCB0bXBfcGF0aHNwZWMsIGVycnN0cik7CisJfQorICAgIH0KKyAgWEZSRUUgKHRtcF9wYXRoc3BlYyk7CisKKyAgaWYgKCFoYXNfc3ltbGlua3MpCisgICAgeworICAgICAgcmV0dXJuIHhzdHJkdXAgKHBhdGhzcGVjKTsKKyAgICB9CisKKyAgdG1wX3BhdGhzcGVjID0gcmVhbHBhdGggKHBhdGhzcGVjLCBidWYpOworICBpZiAodG1wX3BhdGhzcGVjID09IDApCisgICAgeworICAgICAgbHRfZmF0YWwgKCJDb3VsZCBub3QgZm9sbG93IHN5bWxpbmtzIGZvciAlcyIsIHBhdGhzcGVjKTsKKyAgICB9CisgIHJldHVybiB4c3RyZHVwICh0bXBfcGF0aHNwZWMpOworI2VuZGlmCit9CisKK2NoYXIgKgorc3RyZW5kemFwIChjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKyAgc2l6ZV90IGxlbiwgcGF0bGVuOworCisgIGFzc2VydCAoc3RyICE9IE5VTEwpOworICBhc3NlcnQgKHBhdCAhPSBOVUxMKTsKKworICBsZW4gPSBzdHJsZW4gKHN0cik7CisgIHBhdGxlbiA9IHN0cmxlbiAocGF0KTsKKworICBpZiAocGF0bGVuIDw9IGxlbikKKyAgICB7CisgICAgICBzdHIgKz0gbGVuIC0gcGF0bGVuOworICAgICAgaWYgKHN0cmNtcCAoc3RyLCBwYXQpID09IDApCisJKnN0ciA9ICdcMCc7CisgICAgfQorICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgdm9pZAorbHRfZXJyb3JfY29yZSAoaW50IGV4aXRfc3RhdHVzLCBjb25zdCBjaGFyICptb2RlLAorCSAgICAgICBjb25zdCBjaGFyICptZXNzYWdlLCB2YV9saXN0IGFwKQoreworICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICIsIHByb2dyYW1fbmFtZSwgbW9kZSk7CisgIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFwKTsKKyAgZnByaW50ZiAoc3RkZXJyLCAiLlxuIik7CisKKyAgaWYgKGV4aXRfc3RhdHVzID49IDApCisgICAgZXhpdCAoZXhpdF9zdGF0dXMpOworfQorCit2b2lkCitsdF9mYXRhbCAoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKQoreworICB2YV9saXN0IGFwOworICB2YV9zdGFydCAoYXAsIG1lc3NhZ2UpOworICBsdF9lcnJvcl9jb3JlIChFWElUX0ZBSUxVUkUsICJGQVRBTCIsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kIChhcCk7Cit9CisKK3ZvaWQKK2x0X3NldGVudiAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfc2V0ZW52KSBzZXR0aW5nICclcycgdG8gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworICB7CisjaWZkZWYgSEFWRV9TRVRFTlYKKyAgICAvKiBhbHdheXMgbWFrZSBhIGNvcHksIGZvciBjb25zaXN0ZW5jeSB3aXRoICFIQVZFX1NFVEVOViAqLworICAgIGNoYXIgKnN0ciA9IHhzdHJkdXAgKHZhbHVlKTsKKyAgICBzZXRlbnYgKG5hbWUsIHN0ciwgMSk7CisjZWxzZQorICAgIGludCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMSArIHN0cmxlbiAodmFsdWUpICsgMTsKKyAgICBjaGFyICpzdHIgPSBYTUFMTE9DIChjaGFyLCBsZW4pOworICAgIHNwcmludGYgKHN0ciwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOworICAgIGlmIChwdXRlbnYgKHN0cikgIT0gRVhJVF9TVUNDRVNTKQorICAgICAgeworICAgICAgICBYRlJFRSAoc3RyKTsKKyAgICAgIH0KKyNlbmRpZgorICB9Cit9CisKK2NoYXIgKgorbHRfZXh0ZW5kX3N0ciAoY29uc3QgY2hhciAqb3JpZ192YWx1ZSwgY29uc3QgY2hhciAqYWRkLCBpbnQgdG9fZW5kKQoreworICBjaGFyICpuZXdfdmFsdWU7CisgIGlmIChvcmlnX3ZhbHVlICYmICpvcmlnX3ZhbHVlKQorICAgIHsKKyAgICAgIGludCBvcmlnX3ZhbHVlX2xlbiA9IHN0cmxlbiAob3JpZ192YWx1ZSk7CisgICAgICBpbnQgYWRkX2xlbiA9IHN0cmxlbiAoYWRkKTsKKyAgICAgIG5ld192YWx1ZSA9IFhNQUxMT0MgKGNoYXIsIGFkZF9sZW4gKyBvcmlnX3ZhbHVlX2xlbiArIDEpOworICAgICAgaWYgKHRvX2VuZCkKKyAgICAgICAgeworICAgICAgICAgIHN0cmNweSAobmV3X3ZhbHVlLCBvcmlnX3ZhbHVlKTsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIG9yaWdfdmFsdWVfbGVuLCBhZGQpOworICAgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSwgYWRkKTsKKyAgICAgICAgICBzdHJjcHkgKG5ld192YWx1ZSArIGFkZF9sZW4sIG9yaWdfdmFsdWUpOworICAgICAgICB9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmV3X3ZhbHVlID0geHN0cmR1cCAoYWRkKTsKKyAgICB9CisgIHJldHVybiBuZXdfdmFsdWU7Cit9CisKK2ludAorbHRfc3BsaXRfbmFtZV92YWx1ZSAoY29uc3QgY2hhciAqYXJnLCBjaGFyKiogbmFtZSwgY2hhcioqIHZhbHVlKQoreworICBjb25zdCBjaGFyICpwOworICBpbnQgbGVuOworICBpZiAoIWFyZyB8fCAhKmFyZykKKyAgICByZXR1cm4gMTsKKworICBwID0gc3RyY2hyIChhcmcsIChpbnQpJz0nKTsKKworICBpZiAoIXApCisgICAgcmV0dXJuIDE7CisKKyAgKnZhbHVlID0geHN0cmR1cCAoKytwKTsKKworICBsZW4gPSBzdHJsZW4gKGFyZykgLSBzdHJsZW4gKCp2YWx1ZSk7CisgICpuYW1lID0gWE1BTExPQyAoY2hhciwgbGVuKTsKKyAgc3RybmNweSAoKm5hbWUsIGFyZywgbGVuLTEpOworICAoKm5hbWUpW2xlbiAtIDFdID0gJ1wwJzsKKworICByZXR1cm4gMDsKK30KKwordm9pZAorbHRfb3B0X3Byb2Nlc3NfZW52X3NldCAoY29uc3QgY2hhciAqYXJnKQoreworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworCisgIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCisgICAgeworICAgICAgWEZSRUUgKG5hbWUpOworICAgICAgWEZSRUUgKHZhbHVlKTsKKyAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9zZXRfb3B0LCBhcmcpOworICAgIH0KKworICBsdF9zZXRlbnYgKG5hbWUsIHZhbHVlKTsKKyAgWEZSRUUgKG5hbWUpOworICBYRlJFRSAodmFsdWUpOworfQorCit2b2lkCitsdF9vcHRfcHJvY2Vzc19lbnZfcHJlcGVuZCAoY29uc3QgY2hhciAqYXJnKQoreworICBjaGFyICpuYW1lID0gTlVMTDsKKyAgY2hhciAqdmFsdWUgPSBOVUxMOworICBjaGFyICpuZXdfdmFsdWUgPSBOVUxMOworCisgIGlmIChsdF9zcGxpdF9uYW1lX3ZhbHVlIChhcmcsICZuYW1lLCAmdmFsdWUpICE9IDApCisgICAgeworICAgICAgWEZSRUUgKG5hbWUpOworICAgICAgWEZSRUUgKHZhbHVlKTsKKyAgICAgIGx0X2ZhdGFsICgiYmFkIGFyZ3VtZW50IGZvciAlczogJyVzJyIsIGVudl9wcmVwZW5kX29wdCwgYXJnKTsKKyAgICB9CisKKyAgbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgIFhGUkVFIChuZXdfdmFsdWUpOworICBYRlJFRSAobmFtZSk7CisgIFhGUkVFICh2YWx1ZSk7Cit9CisKK3ZvaWQKK2x0X29wdF9wcm9jZXNzX2Vudl9hcHBlbmQgKGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgY2hhciAqbmFtZSA9IE5VTEw7CisgIGNoYXIgKnZhbHVlID0gTlVMTDsKKyAgY2hhciAqbmV3X3ZhbHVlID0gTlVMTDsKKworICBpZiAobHRfc3BsaXRfbmFtZV92YWx1ZSAoYXJnLCAmbmFtZSwgJnZhbHVlKSAhPSAwKQorICAgIHsKKyAgICAgIFhGUkVFIChuYW1lKTsKKyAgICAgIFhGUkVFICh2YWx1ZSk7CisgICAgICBsdF9mYXRhbCAoImJhZCBhcmd1bWVudCBmb3IgJXM6ICclcyciLCBlbnZfYXBwZW5kX29wdCwgYXJnKTsKKyAgICB9CisKKyAgbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDEpOworICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgIFhGUkVFIChuZXdfdmFsdWUpOworICBYRlJFRSAobmFtZSk7CisgIFhGUkVFICh2YWx1ZSk7Cit9CisKK3ZvaWQKK2x0X3VwZGF0ZV9leGVfcGF0aCAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIExUV1JBUFBFUl9ERUJVR1BSSU5URiAoKCIobHRfdXBkYXRlX2V4ZV9wYXRoKSBtb2RpZnlpbmcgJyVzJyBieSBwcmVwZW5kaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lID8gbmFtZSA6ICI8TlVMTD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID8gdmFsdWUgOiAiPE5VTEw+IikpKTsKKworICBpZiAobmFtZSAmJiAqbmFtZSAmJiB2YWx1ZSAmJiAqdmFsdWUpCisgICAgeworICAgICAgY2hhciAqbmV3X3ZhbHVlID0gbHRfZXh0ZW5kX3N0ciAoZ2V0ZW52IChuYW1lKSwgdmFsdWUsIDApOworICAgICAgLyogc29tZSBzeXN0ZW1zIGNhbid0IGNvcGUgd2l0aCBhICc6Jy10ZXJtaW5hdGVkIHBhdGggIycgKi8KKyAgICAgIGludCBsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSk7CisgICAgICB3aGlsZSAoKChsZW4gPSBzdHJsZW4gKG5ld192YWx1ZSkpID4gMCkgJiYgSVNfUEFUSF9TRVBBUkFUT1IgKG5ld192YWx1ZVtsZW4tMV0pKQorICAgICAgICB7CisgICAgICAgICAgbmV3X3ZhbHVlW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgIGx0X3NldGVudiAobmFtZSwgbmV3X3ZhbHVlKTsKKyAgICAgIFhGUkVFIChuZXdfdmFsdWUpOworICAgIH0KK30KKwordm9pZAorbHRfdXBkYXRlX2xpYl9wYXRoIChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgTFRXUkFQUEVSX0RFQlVHUFJJTlRGICgoIihsdF91cGRhdGVfbGliX3BhdGgpIG1vZGlmeWluZyAnJXMnIGJ5IHByZXBlbmRpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUgPyBuYW1lIDogIjxOVUxMPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPyB2YWx1ZSA6ICI8TlVMTD4iKSkpOworCisgIGlmIChuYW1lICYmICpuYW1lICYmIHZhbHVlICYmICp2YWx1ZSkKKyAgICB7CisgICAgICBjaGFyICpuZXdfdmFsdWUgPSBsdF9leHRlbmRfc3RyIChnZXRlbnYgKG5hbWUpLCB2YWx1ZSwgMCk7CisgICAgICBsdF9zZXRlbnYgKG5hbWUsIG5ld192YWx1ZSk7CisgICAgICBYRlJFRSAobmV3X3ZhbHVlKTsKKyAgICB9Cit9CisKKworRU9GCit9CisjIGVuZDogZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYworCisjIGZ1bmNfbW9kZV9saW5rIGFyZy4uLgorZnVuY19tb2RlX2xpbmsgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgY2FzZSAkaG9zdCBpbgorICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi1jZWdjYyopCisgICAgICAjIEl0IGlzIGltcG9zc2libGUgdG8gbGluayBhIGRsbCB3aXRob3V0IHRoaXMgc2V0dGluZywgYW5kCisgICAgICAjIHdlIHNob3VsZG4ndCBmb3JjZSB0aGUgbWFrZWZpbGUgbWFpbnRhaW5lciB0byBmaWd1cmUgb3V0CisgICAgICAjIHdoaWNoIHN5c3RlbSB3ZSBhcmUgY29tcGlsaW5nIGZvciBpbiBvcmRlciB0byBwYXNzIGFuIGV4dHJhCisgICAgICAjIGZsYWcgZm9yIGV2ZXJ5IGxpYnRvb2wgaW52b2NhdGlvbi4KKyAgICAgICMgYWxsb3dfdW5kZWZpbmVkPW5vCisKKyAgICAgICMgRklYTUU6IFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIHRoZSBhYm92ZSB3aGVuIHRyeWluZworICAgICAgIyB0byBtYWtlIGEgZGxsIHdoaWNoIGhhcyB1bmRlZmluZWQgc3ltYm9scywgaW4gd2hpY2ggY2FzZSBub3QKKyAgICAgICMgZXZlbiBhIHN0YXRpYyBsaWJyYXJ5IGlzIGJ1aWx0LiAgRm9yIG5vdywgd2UgbmVlZCB0byBzcGVjaWZ5CisgICAgICAjIC1uby11bmRlZmluZWQgb24gdGhlIGxpYnRvb2wgbGluayBsaW5lIHdoZW4gd2UgY2FuIGJlIGNlcnRhaW4KKyAgICAgICMgdGhhdCBhbGwgc3ltYm9scyBhcmUgc2F0aXNmaWVkLCBvdGhlcndpc2Ugd2UgZ2V0IGEgc3RhdGljIGxpYnJhcnkuCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgICopCisgICAgICBhbGxvd191bmRlZmluZWQ9eWVzCisgICAgICA7OworICAgIGVzYWMKKyAgICBsaWJ0b29sX2FyZ3M9JG5vbm9wdAorICAgIGJhc2VfY29tcGlsZT0iJG5vbm9wdCAkQCIKKyAgICBjb21waWxlX2NvbW1hbmQ9JG5vbm9wdAorICAgIGZpbmFsaXplX2NvbW1hbmQ9JG5vbm9wdAorCisgICAgY29tcGlsZV9ycGF0aD0KKyAgICBmaW5hbGl6ZV9ycGF0aD0KKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgY29udmVuaWVuY2U9CisgICAgb2xkX2NvbnZlbmllbmNlPQorICAgIGRlcGxpYnM9CisgICAgb2xkX2RlcGxpYnM9CisgICAgY29tcGlsZXJfZmxhZ3M9CisgICAgbGlua2VyX2ZsYWdzPQorICAgIGRsbHNlYXJjaHBhdGg9CisgICAgbGliX3NlYXJjaF9wYXRoPWBwd2RgCisgICAgaW5zdF9wcmVmaXhfZGlyPQorICAgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPQorCisgICAgYXZvaWRfdmVyc2lvbj1ubworICAgIGRsZmlsZXM9CisgICAgZGxwcmVmaWxlcz0KKyAgICBkbHNlbGY9bm8KKyAgICBleHBvcnRfZHluYW1pYz1ubworICAgIGV4cG9ydF9zeW1ib2xzPQorICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQorICAgIGdlbmVyYXRlZD0KKyAgICBsaWJvYmpzPQorICAgIGx0bGlicz0KKyAgICBtb2R1bGU9bm8KKyAgICBub19pbnN0YWxsPW5vCisgICAgb2Jqcz0KKyAgICBub25fcGljX29iamVjdHM9CisgICAgcHJlY2lvdXNfZmlsZXNfcmVnZXg9CisgICAgcHJlZmVyX3N0YXRpY19saWJzPW5vCisgICAgcHJlbG9hZD1ubworICAgIHByZXY9CisgICAgcHJldmFyZz0KKyAgICByZWxlYXNlPQorICAgIHJwYXRoPQorICAgIHhycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdGhyZWFkX3NhZmU9bm8KKyAgICB2aW5mbz0KKyAgICB2aW5mb19udW1iZXI9bm8KKyAgICB3ZWFrX2xpYnM9CisgICAgc2luZ2xlX21vZHVsZT0iJHt3bH0tc2luZ2xlX21vZHVsZSIKKyAgICBmdW5jX2luZmVyX3RhZyAkYmFzZV9jb21waWxlCisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICRhcmcgaW4KKyAgICAgIC1zaGFyZWQpCisJdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIFwKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAiY2FuIG5vdCBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IgorCWJ1aWxkX29sZF9saWJzPW5vCisJYnJlYWsKKwk7OworICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljIHwgLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJY2FzZSAkYXJnIGluCisJLWFsbC1zdGF0aWMpCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjb21wbGV0ZSBzdGF0aWMgbGlua2luZyBpcyBpbXBvc3NpYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbiIKKwkgIGZpCisJICBpZiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgZGxvcGVuX3NlbGY9JGRsb3Blbl9zZWxmX3N0YXRpYworCSAgZmkKKwkgIHByZWZlcl9zdGF0aWNfbGlicz15ZXMKKwkgIDs7CisJLXN0YXRpYykKKwkgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAgIGRsb3Blbl9zZWxmPSRkbG9wZW5fc2VsZl9zdGF0aWMKKwkgIGZpCisJICBwcmVmZXJfc3RhdGljX2xpYnM9YnVpbHQKKwkgIDs7CisJLXN0YXRpYy1saWJ0b29sLWxpYnMpCisJICBpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgorCSAgICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCisJICBmaQorCSAgcHJlZmVyX3N0YXRpY19saWJzPXllcworCSAgOzsKKwllc2FjCisJYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisJYnJlYWsKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgU2VlIGlmIG91ciBzaGFyZWQgYXJjaGl2ZXMgZGVwZW5kIG9uIHN0YXRpYyBhcmNoaXZlcy4KKyAgICB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgYnVpbGRfb2xkX2xpYnM9eWVzCisKKyAgICAjIEdvIHRocm91Z2ggdGhlIGFyZ3VtZW50cywgdHJhbnNmb3JtaW5nIHRoZW0gb24gdGhlIHdheS4KKyAgICB3aGlsZSB0ZXN0ICIkIyIgLWd0IDA7IGRvCisgICAgICBhcmc9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisgICAgICBxYXJnPSRmdW5jX3F1b3RlX2Zvcl9ldmFsX3VucXVvdGVkX3Jlc3VsdAorICAgICAgZnVuY19hcHBlbmQgbGlidG9vbF9hcmdzICIgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCisgICAgICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorCWNhc2UgJHByZXYgaW4KKwlvdXRwdXQpCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiBAT1VUUFVUQCIKKwkgIDs7CisJZXNhYworCisJY2FzZSAkcHJldiBpbgorCWRsZmlsZXN8ZGxwcmVmaWxlcykKKwkgIGlmIHRlc3QgIiRwcmVsb2FkIiA9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiIEBTWU1GSUxFQCIKKwkgICAgcHJlbG9hZD15ZXMKKwkgIGZpCisJICBjYXNlICRhcmcgaW4KKwkgICoubGEgfCAqLmxvKSA7OyAgIyBXZSBoYW5kbGUgdGhlc2UgY2FzZXMgYmVsb3cuCisJICBmb3JjZSkKKwkgICAgaWYgdGVzdCAiJGRsc2VsZiIgPSBubzsgdGhlbgorCSAgICAgIGRsc2VsZj1uZWVkbGVzcworCSAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgICBmaQorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgICA7OworCSAgc2VsZikKKwkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgICAgIGRsc2VsZj15ZXMKKwkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCisJICAgICAgZGxzZWxmPXllcworCSAgICBlbHNlCisJICAgICAgZGxzZWxmPW5lZWRsZXNzCisJICAgICAgZXhwb3J0X2R5bmFtaWM9eWVzCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAgICAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKKwkgICAgZWxzZQorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICAgIGZpCisJICAgIHByZXY9CisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICBlc2FjCisJICA7OworCWV4cHN5bXMpCisJICBleHBvcnRfc3ltYm9scz0iJGFyZyIKKwkgIHRlc3QgLWYgIiRhcmciIFwKKwkgICAgfHwgZnVuY19mYXRhbF9lcnJvciAic3ltYm9sIGZpbGUgXGAkYXJnJyBkb2VzIG5vdCBleGlzdCIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlleHBzeW1zX3JlZ2V4KQorCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJZnJhbWV3b3JrKQorCSAgY2FzZSAkaG9zdCBpbgorCSAgICAqLSotZGFyd2luKikKKwkgICAgICBjYXNlICIkZGVwbGlicyAiIGluCisJCSoiICRxYXJnLmx0ZnJhbWV3b3JrICIqKSA7OworCQkqKSBkZXBsaWJzPSIkZGVwbGlicyAkcWFyZy5sdGZyYW1ld29yayIgIyB0aGlzIGlzIGZpeGVkIGxhdGVyCisJCSAgIDs7CisJICAgICAgZXNhYworCSAgICAgIDs7CisJICBlc2FjCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJaW5zdF9wcmVmaXgpCisJICBpbnN0X3ByZWZpeF9kaXI9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJb2JqZWN0bGlzdCkKKwkgIGlmIHRlc3QgLWYgIiRhcmciOyB0aGVuCisJICAgIHNhdmVfYXJnPSRhcmcKKwkgICAgbW9yZWFyZ3M9CisJICAgIGZvciBmaWwgaW4gYGNhdCAiJHNhdmVfYXJnImAKKwkgICAgZG8KKyMJICAgICAgbW9yZWFyZ3M9IiRtb3JlYXJncyAkZmlsIgorCSAgICAgIGFyZz0kZmlsCisJICAgICAgIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJICAgICAgaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkJcGljX29iamVjdD0KKwkJbm9uX3BpY19vYmplY3Q9CisKKwkJIyBSZWFkIHRoZSAubG8gZmlsZQorCQlmdW5jX3NvdXJjZSAiJGFyZyIKKworCQlpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwKKwkJICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCQkgICB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lICYmCisJCSAgIHRlc3QgIiRub25fcGljX29iamVjdCIgPSBub25lOyB0aGVuCisJCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJCWZpCisKKwkJIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkJeGRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisKKwkJaWYgdGVzdCAiJHBpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIHBpY19vYmplY3Q9IiR4ZGlyJHBpY19vYmplY3QiCisKKwkJICBpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCSAgICAgIGRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQkgICAgICBwcmV2PQorCQkgICAgICBjb250aW51ZQorCQkgICAgZWxzZQorCQkgICAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCQkgICAgICBwcmV2PWRscHJlZmlsZXMKKwkJICAgIGZpCisJCSAgZmkKKworCQkgICMgQ0hFQ0sgTUU6ICBJIHRoaW5rIEkgYnVzdGVkIHRoaXMuICAtT3NzYW1hCisJCSAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCQkgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJHBpY19vYmplY3QiCisJCSAgICBwcmV2PQorCQkgIGZpCisKKwkJICAjIEEgUElDIG9iamVjdC4KKwkJICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJCSAgYXJnPSIkcGljX29iamVjdCIKKwkJZmkKKworCQkjIE5vbi1QSUMgb2JqZWN0LgorCQlpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkJICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkeGRpciRub25fcGljX29iamVjdCIKKworCQkgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCQkgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkJICBpZiB0ZXN0IC16ICIkcGljX29iamVjdCIgfHwgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSA7IHRoZW4KKwkJICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCQkgIGZpCisJCWVsc2UKKwkJICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJCSAgIyAkeGRpciB3YXMgcHJlcGVuZGVkIHRvICRwaWNfb2JqZWN0IGFib3ZlLgorCQkgIG5vbl9waWNfb2JqZWN0PSIkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJCWZpCisJICAgICAgZWxzZQorCQkjIE9ubHkgYW4gZXJyb3IgaWYgbm90IGRvaW5nIGEgZHJ5LXJ1bi4KKwkJaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJCSAgIyBFeHRyYWN0IHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBhcmd1bWVudC4KKwkJICBmdW5jX2Rpcm5hbWUgIiRhcmciICIvIiAiIgorCQkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJCSAgZnVuY19sbzJvICIkYXJnIgorCQkgIHBpY19vYmplY3Q9JHhkaXIkb2JqZGlyLyRmdW5jX2xvMm9fcmVzdWx0CisJCSAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCQkgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkJICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgICAgICBlbHNlCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkJZmkKKwkgICAgICBmaQorCSAgICBkb25lCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImxpbmsgaW5wdXQgZmlsZSBcYCRhcmcnIGRvZXMgbm90IGV4aXN0IgorCSAgZmkKKwkgIGFyZz0kc2F2ZV9hcmcKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlwcmVjaW91c19yZWdleCkKKwkgIHByZWNpb3VzX2ZpbGVzX3JlZ2V4PSIkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXJlbGVhc2UpCisJICByZWxlYXNlPSItJGFyZyIKKwkgIHByZXY9CisJICBjb250aW51ZQorCSAgOzsKKwlycGF0aCB8IHhycGF0aCkKKwkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCSAgY2FzZSAkYXJnIGluCisJICBbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIDs7CisJICAqKQorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRwcmV2IiA9IHJwYXRoOyB0aGVuCisJICAgIGNhc2UgIiRycGF0aCAiIGluCisJICAgICoiICRhcmcgIiopIDs7CisJICAgICopIHJwYXRoPSIkcnBhdGggJGFyZyIgOzsKKwkgICAgZXNhYworCSAgZWxzZQorCSAgICBjYXNlICIkeHJwYXRoICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKikgeHJwYXRoPSIkeHJwYXRoICRhcmciIDs7CisJICAgIGVzYWMKKwkgIGZpCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJc2hyZXh0KQorCSAgc2hyZXh0X2NtZHM9IiRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisJd2VhaykKKwkgIHdlYWtfbGlicz0iJHdlYWtfbGlicyAkYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCXhjY2xpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwl4Y29tcGlsZXIpCisJICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRxYXJnIgorCSAgcHJldj0KKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRxYXJnIgorCSAgZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRxYXJnIgorCSAgY29udGludWUKKwkgIDs7CisJeGxpbmtlcikKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkcWFyZyIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJHdsJHFhcmciCisJICBwcmV2PQorCSAgZnVuY19hcHBlbmQgY29tcGlsZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJHdsJHFhcmciCisJICBjb250aW51ZQorCSAgOzsKKwkqKQorCSAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMKKyAgICAgIGZpICMgdGVzdCAtbiAiJHByZXYiCisKKyAgICAgIHByZXZhcmc9IiRhcmciCisKKyAgICAgIGNhc2UgJGFyZyBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisJICAjIFNlZSBjb21tZW50IGZvciAtc3RhdGljIGZsYWcgYmVsb3csIGZvciBtb3JlIGRldGFpbHMuCisJICBmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwkgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkbGlua19zdGF0aWNfZmxhZyIKKwlmaQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJZnVuY19mYXRhbF9lcnJvciAiXGAtYWxsb3ctdW5kZWZpbmVkJyBtdXN0IG5vdCBiZSB1c2VkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiCisJOzsKKworICAgICAgLWF2b2lkLXZlcnNpb24pCisJYXZvaWRfdmVyc2lvbj15ZXMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisJcHJldj1kbGZpbGVzCisJY29udGludWUKKwk7OworCisgICAgICAtZGxwcmVvcGVuKQorCXByZXY9ZGxwcmVmaWxlcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorCWV4cG9ydF9keW5hbWljPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLWV4cG9ydC1zeW1ib2xzIHwgLWV4cG9ydC1zeW1ib2xzLXJlZ2V4KQorCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgfHwgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzX3JlZ2V4IjsgdGhlbgorCSAgZnVuY19mYXRhbF9lcnJvciAibW9yZSB0aGFuIG9uZSAtZXhwb3J0ZWQtc3ltYm9scyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCIKKwlmaQorCWlmIHRlc3QgIlgkYXJnIiA9ICJYLWV4cG9ydC1zeW1ib2xzIjsgdGhlbgorCSAgcHJldj1leHBzeW1zCisJZWxzZQorCSAgcHJldj1leHBzeW1zX3JlZ2V4CisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1mcmFtZXdvcmspCisJcHJldj1mcmFtZXdvcmsKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1pbnN0LXByZWZpeC1kaXIpCisJcHJldj1pbnN0X3ByZWZpeAorCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUaGUgbmF0aXZlIElSSVggbGlua2VyIHVuZGVyc3RhbmRzIC1MQU5HOiosIC1MSVNUOiogYW5kIC1MTk86KgorICAgICAgIyBzbywgaWYgd2Ugc2VlIHRoZXNlIGZsYWdzIGJlIGNhcmVmdWwgbm90IHRvIHRyZWF0IHRoZW0gbGlrZSAtTAorICAgICAgLUxbQS1aXVtBLVpdKjoqKQorCWNhc2UgJHdpdGhfZ2NjLyRob3N0IGluCisJbm8vKi0qLWlyaXgqIHwgLyotKi1pcml4KikKKwkgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKwkgIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLUwqKQorCWZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRhcmciCisJZGlyPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwlpZiB0ZXN0IC16ICIkZGlyIjsgdGhlbgorCSAgaWYgdGVzdCAiJCMiIC1ndCAwOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgInJlcXVpcmUgbm8gc3BhY2UgYmV0d2VlbiBcYC1MJyBhbmQgXGAkMSciCisJICBlbHNlCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIm5lZWQgcGF0aCBmb3IgXGAtTCcgb3B0aW9uIgorCSAgZmkKKwlmaQorCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCWNhc2UgJGRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgOzsKKwkqKQorCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCSAgdGVzdCAteiAiJGFic2RpciIgJiYgXAorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGRpciciCisJICBkaXI9IiRhYnNkaXIiCisJICA7OworCWVzYWMKKwljYXNlICIkZGVwbGlicyAiIGluCisJKiIgLUwkZGlyICIqKSA7OworCSopCisJICBkZXBsaWJzPSIkZGVwbGlicyAtTCRkaXIiCisJICBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciIKKwkgIDs7CisJZXNhYworCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJEVDSE8gIlgkZGlyIiB8ICRYc2VkIC1lICdzKi9saWIkKi9iaW4qJ2AKKwkgIGNhc2UgOiRkbGxzZWFyY2hwYXRoOiBpbgorCSAgKiI6JGRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSRkaXI7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JGRpciI7OworCSAgZXNhYworCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokdGVzdGJpbmRpcjoiKikgOzsKKwkgIDo6KSBkbGxzZWFyY2hwYXRoPSR0ZXN0YmluZGlyOzsKKwkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiR0ZXN0YmluZGlyIjs7CisJICBlc2FjCisJICA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1sKikKKwlpZiB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgfHwgdGVzdCAiWCRhcmciID0gIlgtbG0iOyB0aGVuCisJICBjYXNlICRob3N0IGluCisJICAqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotYmVvcyogfCAqLWNlZ2NjKikKKwkgICAgIyBUaGVzZSBzeXN0ZW1zIGRvbid0IGFjdHVhbGx5IGhhdmUgYSBDIG9yIG1hdGggbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgICotKi1vczIqKQorCSAgICAjIFRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIEMgbGlicmFyeSAoYXMgc3VjaCkKKwkgICAgdGVzdCAiWCRhcmciID0gIlgtbGMiICYmIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotb3BlbmJzZCogfCAqLSotZnJlZWJzZCogfCAqLSotZHJhZ29uZmx5KikKKwkgICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjIGR1ZSB0byB1cyBoYXZpbmcgbGliYy9saWJjX3IuCisJICAgIHRlc3QgIlgkYXJnIiA9ICJYLWxjIiAmJiBjb250aW51ZQorCSAgICA7OworCSAgKi0qLXJoYXBzb2R5KiB8ICotKi1kYXJ3aW4xLlswMTJdKQorCSAgICAjIFJoYXBzb2R5IEMgYW5kIG1hdGggbGlicmFyaWVzIGFyZSBpbiB0aGUgU3lzdGVtIGZyYW1ld29yaworCSAgICBkZXBsaWJzPSIkZGVwbGlicyBTeXN0ZW0ubHRmcmFtZXdvcmsiCisJICAgIGNvbnRpbnVlCisJICAgIDs7CisJICAqLSotc2NvMy4ydjUqIHwgKi0qLXNjbzV2NiopCisJICAgICMgQ2F1c2VzIHByb2JsZW1zIHdpdGggX19jdHlwZQorCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICB0ZXN0ICJYJGFyZyIgPSAiWC1sYyIgJiYgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMKKwllbGlmIHRlc3QgIlgkYXJnIiA9ICJYLWxjX3IiOyB0aGVuCisJIGNhc2UgJGhvc3QgaW4KKwkgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgIyBEbyBub3QgaW5jbHVkZSBsaWJjX3IgZGlyZWN0bHksIHVzZSAtcHRocmVhZCBmbGFnLgorCSAgIGNvbnRpbnVlCisJICAgOzsKKwkgZXNhYworCWZpCisJZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tb2R1bGUpCisJbW9kdWxlPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgIyBUcnU2NCBVTklYIHVzZXMgLW1vZGVsIFthcmddIHRvIGRldGVybWluZSB0aGUgbGF5b3V0IG9mIEMrKworICAgICAgIyBjbGFzc2VzLCBuYW1lIG1hbmdsaW5nLCBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nLgorICAgICAgIyBEYXJ3aW4gdXNlcyB0aGUgLWFyY2ggZmxhZyB0byBkZXRlcm1pbmUgb3V0cHV0IGFyY2hpdGVjdHVyZS4KKyAgICAgIC1tb2RlbHwtYXJjaHwtaXN5c3Jvb3QpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJcHJldj14Y29tcGlsZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1tdHwtbXRocmVhZHN8LWt0aHJlYWR8LUt0aHJlYWR8LXB0aHJlYWR8LXB0aHJlYWRzfC0tdGhyZWFkLXNhZmV8LXRocmVhZHMpCisJY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkYXJnIgorCWZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisJZnVuY19hcHBlbmQgZmluYWxpemVfY29tbWFuZCAiICRhcmciCisJY2FzZSAiJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgKiIgJGFyZyAiKikgOzsKKwkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGFyZyIgOzsKKwllc2FjCisJY29udGludWUKKwk7OworCisgICAgICAtbXVsdGlfbW9kdWxlKQorCXNpbmdsZV9tb2R1bGU9IiR7d2x9LW11bHRpX21vZHVsZSIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby1mYXN0LWluc3RhbGwpCisJZmFzdF9pbnN0YWxsPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtbm8taW5zdGFsbCkKKwljYXNlICRob3N0IGluCisJKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLXB3MzIqIHwgKi0qLW9zMiogfCAqLSotZGFyd2luKiB8ICotY2VnY2MqKQorCSAgIyBUaGUgUEFUSCBoYWNrZXJ5IGluIHdyYXBwZXIgc2NyaXB0cyBpcyByZXF1aXJlZCBvbiBXaW5kb3dzCisJICAjIGFuZCBEYXJ3aW4gaW4gb3JkZXIgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBhbnkgZGxscyBpdCBuZWVkcy4KKwkgIGZ1bmNfd2FybmluZyAiXGAtbm8taW5zdGFsbCcgaXMgaWdub3JlZCBmb3IgJGhvc3QiCisJICBmdW5jX3dhcm5pbmcgImFzc3VtaW5nIFxgLW5vLWZhc3QtaW5zdGFsbCcgaW5zdGVhZCIKKwkgIGZhc3RfaW5zdGFsbD1ubworCSAgOzsKKwkqKSBub19pbnN0YWxsPXllcyA7OworCWVzYWMKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1uby11bmRlZmluZWQpCisJYWxsb3dfdW5kZWZpbmVkPW5vCisJY29udGludWUKKwk7OworCisgICAgICAtb2JqZWN0bGlzdCkKKwlwcmV2PW9iamVjdGxpc3QKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1vKSBwcmV2PW91dHB1dCA7OworCisgICAgICAtcHJlY2lvdXMtZmlsZXMtcmVnZXgpCisJcHJldj1wcmVjaW91c19yZWdleAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJlbGVhc2UpCisJcHJldj1yZWxlYXNlCisJY29udGludWUKKwk7OworCisgICAgICAtcnBhdGgpCisJcHJldj1ycGF0aAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLVIpCisJcHJldj14cnBhdGgKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1SKikKKwlmdW5jX3N0cmlwbmFtZSAnLVInICcnICIkYXJnIgorCWRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJIyBXZSBuZWVkIGFuIGFic29sdXRlIHBhdGguCisJY2FzZSAkZGlyIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSA7OworCSopCisJICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGFic29sdXRlIHJ1bi1wYXRocyBhcmUgYWxsb3dlZCIKKwkgIDs7CisJZXNhYworCWNhc2UgIiR4cnBhdGggIiBpbgorCSoiICRkaXIgIiopIDs7CisJKikgeHJwYXRoPSIkeHJwYXRoICRkaXIiIDs7CisJZXNhYworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNoYXJlZCkKKwkjIFRoZSBlZmZlY3RzIG9mIC1zaGFyZWQgYXJlIGRlZmluZWQgaW4gYSBwcmV2aW91cyBsb29wLgorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXNocmV4dCkKKwlwcmV2PXNocmV4dAorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXN0YXRpYyB8IC1zdGF0aWMtbGlidG9vbC1saWJzKQorCSMgVGhlIGVmZmVjdHMgb2YgLXN0YXRpYyBhcmUgZGVmaW5lZCBpbiBhIHByZXZpb3VzIGxvb3AuCisJIyBXZSB1c2VkIHRvIGRvIHRoZSBzYW1lIGFzIC1hbGwtc3RhdGljIG9uIHBsYXRmb3JtcyB0aGF0CisJIyBkaWRuJ3QgaGF2ZSBhIFBJQyBmbGFnLCBidXQgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZWZmZWN0cworCSMgd291bGQgYmUgZXF1aXZhbGVudCB3YXMgd3JvbmcuICBJdCB3b3VsZCBicmVhayBvbiBhdCBsZWFzdAorCSMgRGlnaXRhbCBVbml4IGFuZCBBSVguCisJY29udGludWUKKwk7OworCisgICAgICAtdGhyZWFkLXNhZmUpCisJdGhyZWFkX3NhZmU9eWVzCisJY29udGludWUKKwk7OworCisgICAgICAtdmVyc2lvbi1pbmZvKQorCXByZXY9dmluZm8KKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLW51bWJlcikKKwlwcmV2PXZpbmZvCisJdmluZm9fbnVtYmVyPXllcworCWNvbnRpbnVlCisJOzsKKworICAgICAgLXdlYWspCisgICAgICAgIHByZXY9d2VhaworCWNvbnRpbnVlCisJOzsKKworICAgICAgLVdjLCopCisJZnVuY19zdHJpcG5hbWUgJy1XYywnICcnICIkYXJnIgorCWFyZ3M9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWFyZz0KKwlzYXZlX2lmcz0iJElGUyI7IElGUz0nLCcKKwlmb3IgZmxhZyBpbiAkYXJnczsgZG8KKwkgIElGUz0iJHNhdmVfaWZzIgorICAgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRmbGFnIgorCSAgYXJnPSIkYXJnICR3bCRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwkgIGNvbXBpbGVyX2ZsYWdzPSIkY29tcGlsZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtV2wsKikKKwlmdW5jX3N0cmlwbmFtZSAnLVdsLCcgJycgIiRhcmciCisJYXJncz0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJYXJnPQorCXNhdmVfaWZzPSIkSUZTIjsgSUZTPScsJworCWZvciBmbGFnIGluICRhcmdzOyBkbworCSAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGZsYWciCisJICBhcmc9IiRhcmcgJHdsJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkd2wkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisJICBsaW5rZXJfZmxhZ3M9IiRsaW5rZXJfZmxhZ3MgJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCWRvbmUKKwlJRlM9IiRzYXZlX2lmcyIKKwlmdW5jX3N0cmlwbmFtZSAnICcgJycgIiRhcmciCisJYXJnPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwk7OworCisgICAgICAtWGNvbXBpbGVyKQorCXByZXY9eGNvbXBpbGVyCisJY29udGludWUKKwk7OworCisgICAgICAtWGxpbmtlcikKKwlwcmV2PXhsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1YQ0NsaW5rZXIpCisJcHJldj14Y2NsaW5rZXIKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgLW1zZ18qIGZvciBvc2YgY2MKKyAgICAgIC1tc2dfKikKKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisKKyAgICAgICMgLTY0LCAtbWlwc1swLTldIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgU0dJIGNvbXBpbGVyCisgICAgICAjIC1yWzAtOV1bMC05XSogc3BlY2lmaWVzIHRoZSBwcm9jZXNzb3Igb24gdGhlIFNHSSBjb21waWxlcgorICAgICAgIyAteGFyY2g9KiwgLXh0YXJnZXQ9KiBlbmFibGUgNjQtYml0IG1vZGUgb24gdGhlIFN1biBjb21waWxlcgorICAgICAgIyArREEqLCArREQqIGVuYWJsZSA2NC1iaXQgbW9kZSBvbiB0aGUgSFAgY29tcGlsZXIKKyAgICAgICMgLXEqIHBhc3MgdGhyb3VnaCBjb21waWxlciBhcmdzIGZvciB0aGUgSUJNIGNvbXBpbGVyCisgICAgICAjIC1tKiwgLXRbNDVdKiwgLXR4c2NhbGUqIHBhc3MgdGhyb3VnaCBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKKyAgICAgICMgY29tcGlsZXIgYXJncyBmb3IgR0NDCisgICAgICAjIC1GL3BhdGggZ2l2ZXMgcGF0aCB0byB1bmluc3RhbGxlZCBmcmFtZXdvcmtzLCBnY2Mgb24gZGFyd2luCisgICAgICAjIC1wLCAtcGcsIC0tY292ZXJhZ2UsIC1mcHJvZmlsZS0qIHBhc3MgdGhyb3VnaCBwcm9maWxpbmcgZmxhZyBmb3IgR0NDCisgICAgICAjIEBmaWxlIEdDQyByZXNwb25zZSBmaWxlcworICAgICAgLTY0fC1taXBzWzAtOV18LXJbMC05XVswLTldKnwteGFyY2g9KnwteHRhcmdldD0qfCtEQSp8K0REKnwtcSp8LW0qfCBcCisgICAgICAtdFs0NV0qfC10eHNjYWxlKnwtcHwtcGd8LS1jb3ZlcmFnZXwtZnByb2ZpbGUtKnwtRip8QCopCisgICAgICAgIGZ1bmNfcXVvdGVfZm9yX2V2YWwgIiRhcmciCisJYXJnPSIkZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQiCisgICAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICAgIGZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICRhcmciCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBmbGFnLgorICAgICAgLSogfCArKikKKyAgICAgICAgZnVuY19xdW90ZV9mb3JfZXZhbCAiJGFyZyIKKwlhcmc9IiRmdW5jX3F1b3RlX2Zvcl9ldmFsX3Jlc3VsdCIKKwk7OworCisgICAgICAqLiRvYmpleHQpCisJIyBBIHN0YW5kYXJkIG9iamVjdC4KKwlvYmpzPSIkb2JqcyAkYXJnIgorCTs7CisKKyAgICAgICoubG8pCisJIyBBIGxpYnRvb2wtY29udHJvbGxlZCBvYmplY3QuCisKKwkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBvYmplY3QuCisJaWYgZnVuY19sYWxpYl91bnNhZmVfcCAiJGFyZyI7IHRoZW4KKwkgIHBpY19vYmplY3Q9CisJICBub25fcGljX29iamVjdD0KKworCSAgIyBSZWFkIHRoZSAubG8gZmlsZQorCSAgZnVuY19zb3VyY2UgIiRhcmciCisKKwkgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAteiAiJG5vbl9waWNfb2JqZWN0IiB8fAorCSAgICAgdGVzdCAiJHBpY19vYmplY3QiID0gbm9uZSAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiA9IG5vbmU7IHRoZW4KKwkgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBvYmplY3QgZm9yIFxgJGFyZyciCisJICBmaQorCisJICAjIEV4dHJhY3Qgc3ViZGlyZWN0b3J5IGZyb20gdGhlIGFyZ3VtZW50LgorCSAgZnVuY19kaXJuYW1lICIkYXJnIiAiLyIgIiIKKwkgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICBpZiB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICAjIFByZXBlbmQgdGhlIHN1YmRpcmVjdG9yeSB0aGUgb2JqZWN0IGlzIGZvdW5kIGluLgorCSAgICBwaWNfb2JqZWN0PSIkeGRpciRwaWNfb2JqZWN0IgorCisJICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0geWVzOyB0aGVuCisJCWRsZmlsZXM9IiRkbGZpbGVzICRwaWNfb2JqZWN0IgorCQlwcmV2PQorCQljb250aW51ZQorCSAgICAgIGVsc2UKKwkJIyBJZiBsaWJ0b29sIG9iamVjdHMgYXJlIHVuc3VwcG9ydGVkLCB0aGVuIHdlIG5lZWQgdG8gcHJlbG9hZC4KKwkJcHJldj1kbHByZWZpbGVzCisJICAgICAgZmkKKwkgICAgZmkKKworCSAgICAjIENIRUNLIE1FOiAgSSB0aGluayBJIGJ1c3RlZCB0aGlzLiAgLU9zc2FtYQorCSAgICBpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCisJICAgICAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorCSAgICAgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRwaWNfb2JqZWN0IgorCSAgICAgIHByZXY9CisJICAgIGZpCisKKwkgICAgIyBBIFBJQyBvYmplY3QuCisJICAgIGZ1bmNfYXBwZW5kIGxpYm9ianMgIiAkcGljX29iamVjdCIKKwkgICAgYXJnPSIkcGljX29iamVjdCIKKwkgIGZpCisKKwkgICMgTm9uLVBJQyBvYmplY3QuCisJICBpZiB0ZXN0ICIkbm9uX3BpY19vYmplY3QiICE9IG5vbmU7IHRoZW4KKwkgICAgIyBQcmVwZW5kIHRoZSBzdWJkaXJlY3RvcnkgdGhlIG9iamVjdCBpcyBmb3VuZCBpbi4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiR4ZGlyJG5vbl9waWNfb2JqZWN0IgorCisJICAgICMgQSBzdGFuZGFyZCBub24tUElDIG9iamVjdAorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICAgIGlmIHRlc3QgLXogIiRwaWNfb2JqZWN0IiB8fCB0ZXN0ICIkcGljX29iamVjdCIgPSBub25lIDsgdGhlbgorCSAgICAgIGFyZz0iJG5vbl9waWNfb2JqZWN0IgorCSAgICBmaQorCSAgZWxzZQorCSAgICAjIElmIHRoZSBQSUMgb2JqZWN0IGV4aXN0cywgdXNlIGl0IGluc3RlYWQuCisJICAgICMgJHhkaXIgd2FzIHByZXBlbmRlZCB0byAkcGljX29iamVjdCBhYm92ZS4KKwkgICAgbm9uX3BpY19vYmplY3Q9IiRwaWNfb2JqZWN0IgorCSAgICBmdW5jX2FwcGVuZCBub25fcGljX29iamVjdHMgIiAkbm9uX3BpY19vYmplY3QiCisJICBmaQorCWVsc2UKKwkgICMgT25seSBhbiBlcnJvciBpZiBub3QgZG9pbmcgYSBkcnktcnVuLgorCSAgaWYgJG9wdF9kcnlfcnVuOyB0aGVuCisJICAgICMgRXh0cmFjdCBzdWJkaXJlY3RvcnkgZnJvbSB0aGUgYXJndW1lbnQuCisJICAgIGZ1bmNfZGlybmFtZSAiJGFyZyIgIi8iICIiCisJICAgIHhkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCisJICAgIGZ1bmNfbG8ybyAiJGFyZyIKKwkgICAgcGljX29iamVjdD0keGRpciRvYmpkaXIvJGZ1bmNfbG8yb19yZXN1bHQKKwkgICAgbm9uX3BpY19vYmplY3Q9JHhkaXIkZnVuY19sbzJvX3Jlc3VsdAorCSAgICBmdW5jX2FwcGVuZCBsaWJvYmpzICIgJHBpY19vYmplY3QiCisJICAgIGZ1bmNfYXBwZW5kIG5vbl9waWNfb2JqZWN0cyAiICRub25fcGljX29iamVjdCIKKwkgIGVsc2UKKwkgICAgZnVuY19mYXRhbF9lcnJvciAiXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIG9iamVjdCIKKwkgIGZpCisJZmkKKwk7OworCisgICAgICAqLiRsaWJleHQpCisJIyBBbiBhcmNoaXZlLgorCWRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJb2xkX2RlcGxpYnM9IiRvbGRfZGVwbGlicyAkYXJnIgorCWNvbnRpbnVlCisJOzsKKworICAgICAgKi5sYSkKKwkjIEEgbGlidG9vbC1jb250cm9sbGVkIGxpYnJhcnkuCisKKwlpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzOyB0aGVuCisJICAjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBwcmV2PQorCWVsaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgorCSAgIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRhcmciCisJICBwcmV2PQorCWVsc2UKKwkgIGRlcGxpYnM9IiRkZXBsaWJzICRhcmciCisJZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KKyAgICAgICopCisJIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCisJIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KKwlmdW5jX3F1b3RlX2Zvcl9ldmFsICIkYXJnIgorCWFyZz0iJGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0IgorCTs7CisgICAgICBlc2FjICMgYXJnCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwlmdW5jX2FwcGVuZCBjb21waWxlX2NvbW1hbmQgIiAkYXJnIgorCWZ1bmNfYXBwZW5kIGZpbmFsaXplX2NvbW1hbmQgIiAkYXJnIgorICAgICAgZmkKKyAgICBkb25lICMgYXJndW1lbnQgcGFyc2luZyBsb29wCisKKyAgICB0ZXN0IC1uICIkcHJldiIgJiYgXAorICAgICAgZnVuY19mYXRhbF9oZWxwICJ0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IgorCisgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKyAgICAgIGZ1bmNfYXBwZW5kIGNvbXBpbGVfY29tbWFuZCAiICRhcmciCisgICAgICBmdW5jX2FwcGVuZCBmaW5hbGl6ZV9jb21tYW5kICIgJGFyZyIKKyAgICBmaQorCisgICAgb2xkbGlicz0KKyAgICAjIGNhbGN1bGF0ZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgd2l0aG91dCBpdHMgZGlyZWN0b3J5CisgICAgZnVuY19iYXNlbmFtZSAiJG91dHB1dCIKKyAgICBvdXRwdXRuYW1lPSIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisgICAgbGlib2Jqc19zYXZlPSIkbGlib2JqcyIKKworICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgIyBnZXQgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiAkc2hsaWJwYXRoX3ZhcgorICAgICAgZXZhbCBzaGxpYl9zZWFyY2hfcGF0aD1cYFwkRUNITyBcIlhcJHskc2hsaWJwYXRoX3Zhcn1cIiBcfCBcJFhzZWQgLWUgXCdzLzovIC9nXCdcYAorICAgIGVsc2UKKyAgICAgIHNobGliX3NlYXJjaF9wYXRoPQorICAgIGZpCisgICAgZXZhbCBzeXNfbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wiCisgICAgZXZhbCBzeXNfbGliX2Rsc2VhcmNoX3BhdGg9XCIkc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWNcIgorCisgICAgZnVuY19kaXJuYW1lICIkb3V0cHV0IiAiLyIgIiIKKyAgICBvdXRwdXRfb2JqZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCRvYmpkaXIiCisgICAgIyBDcmVhdGUgdGhlIG9iamVjdCBkaXJlY3RvcnkuCisgICAgZnVuY19ta2Rpcl9wICIkb3V0cHV0X29iamRpciIKKworICAgICMgRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG91dHB1dAorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICIiKQorICAgICAgZnVuY19mYXRhbF9oZWxwICJ5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dCBmaWxlIgorICAgICAgOzsKKyAgICAqLiRsaWJleHQpIGxpbmttb2RlPW9sZGxpYiA7OworICAgICoubG8gfCAqLiRvYmpleHQpIGxpbmttb2RlPW9iaiA7OworICAgICoubGEpIGxpbmttb2RlPWxpYiA7OworICAgICopIGxpbmttb2RlPXByb2cgOzsgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCisgICAgZXNhYworCisgICAgc3BlY2lhbGRlcGxpYnM9CisKKyAgICBsaWJzPQorICAgICMgRmluZCBhbGwgaW50ZXJkZXBlbmRlbnQgZGVwbGlicyBieSBzZWFyY2hpbmcgZm9yIGxpYnJhcmllcworICAgICMgdGhhdCBhcmUgbGlua2VkIG1vcmUgdGhhbiBvbmNlIChlLmcuIC1sYSAtbGIgLWxhKQorICAgIGZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9kZXBzIDsgdGhlbgorCWNhc2UgIiRsaWJzICIgaW4KKwkqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGxpYnM9IiRsaWJzICRkZXBsaWIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IGxpYjsgdGhlbgorICAgICAgbGlicz0iJHByZWRlcHMgJGxpYnMgJGNvbXBpbGVyX2xpYl9zZWFyY2hfcGF0aCAkcG9zdGRlcHMiCisKKyAgICAgICMgQ29tcHV0ZSBsaWJyYXJpZXMgdGhhdCBhcmUgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluICRwcmVkZXBzCisgICAgICAjICRwb3N0ZGVwcyBhbmQgbWFyayB0aGVtIGFzIHNwZWNpYWwgKGkuZS4sIHdob3NlIGR1cGxpY2F0ZXMgYXJlCisgICAgICAjIG5vdCB0byBiZSBlbGltaW5hdGVkKS4KKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgICBpZiAkb3B0X2R1cGxpY2F0ZV9jb21waWxlcl9nZW5lcmF0ZWRfZGVwczsgdGhlbgorCWZvciBwcmVfcG9zdF9kZXAgaW4gJHByZWRlcHMgJHBvc3RkZXBzOyBkbworCSAgY2FzZSAiJHByZV9wb3N0X2RlcHMgIiBpbgorCSAgKiIgJHByZV9wb3N0X2RlcCAiKikgc3BlY2lhbGRlcGxpYnM9IiRzcGVjaWFsZGVwbGlicyAkcHJlX3Bvc3RfZGVwcyIgOzsKKwkgIGVzYWMKKwkgIHByZV9wb3N0X2RlcHM9IiRwcmVfcG9zdF9kZXBzICRwcmVfcG9zdF9kZXAiCisJZG9uZQorICAgICAgZmkKKyAgICAgIHByZV9wb3N0X2RlcHM9CisgICAgZmkKKworICAgIGRlcGxpYnM9CisgICAgbmV3ZGVwZW5kZW5jeV9saWJzPQorICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0KKyAgICBuZWVkX3JlbGluaz1ubyAjIHdoZXRoZXIgd2UncmUgbGlua2luZyBhbnkgdW5pbnN0YWxsZWQgbGlidG9vbCBsaWJyYXJpZXMKKyAgICBub3RpbnN0X2RlcGxpYnM9ICMgbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworICAgIG5vdGluc3RfcGF0aD0gIyBwYXRocyB0aGF0IGNvbnRhaW4gbm90LWluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcworCisgICAgY2FzZSAkbGlua21vZGUgaW4KKyAgICBsaWIpCisJcGFzc2VzPSJjb252IGRscHJlb3BlbiBsaW5rIgorCWZvciBmaWxlIGluICRkbGZpbGVzICRkbHByZWZpbGVzOyBkbworCSAgY2FzZSAkZmlsZSBpbgorCSAgKi5sYSkgOzsKKwkgICopCisJICAgIGZ1bmNfZmF0YWxfaGVscCAibGlicmFyaWVzIGNhbiBcYC1kbG9wZW4nIG9ubHkgbGlidG9vbCBsaWJyYXJpZXM6ICRmaWxlIgorCSAgICA7OworCSAgZXNhYworCWRvbmUKKwk7OworICAgIHByb2cpCisJY29tcGlsZV9kZXBsaWJzPQorCWZpbmFsaXplX2RlcGxpYnM9CisJYWxsZGVwbGlicz1ubworCW5ld2RsZmlsZXM9CisJbmV3ZGxwcmVmaWxlcz0KKwlwYXNzZXM9ImNvbnYgc2NhbiBkbG9wZW4gZGxwcmVvcGVuIGxpbmsiCisJOzsKKyAgICAqKSAgcGFzc2VzPSJjb252IgorCTs7CisgICAgZXNhYworCisgICAgZm9yIHBhc3MgaW4gJHBhc3NlczsgZG8KKyAgICAgICMgVGhlIHByZW9wZW4gcGFzcyBpbiBsaWIgbW9kZSByZXZlcnNlcyAkZGVwbGliczsgcHV0IGl0IGJhY2sgaGVyZQorICAgICAgIyBzbyB0aGF0IC1MIGNvbWVzIGJlZm9yZSBsaWJzIHRoYXQgbmVlZCBpdCBmb3IgaW5zdGFuY2UuLi4KKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiOyB0aGVuCisJIyMgRklYTUU6IEZpbmQgdGhlIHBsYWNlIHdoZXJlIHRoZSBsaXN0IGlzIHJlYnVpbHQgaW4gdGhlIHdyb25nCisJIyMgICAgICAgIG9yZGVyLCBhbmQgZml4IGl0IHRoZXJlIHByb3Blcmx5CisgICAgICAgIHRtcF9kZXBsaWJzPQorCWZvciBkZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICB0bXBfZGVwbGlicz0iJGRlcGxpYiAkdG1wX2RlcGxpYnMiCisJZG9uZQorCWRlcGxpYnM9IiR0bXBfZGVwbGlicyIKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAibGliLGxpbmsiIHx8CisJIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIjsgdGhlbgorCWxpYnM9IiRkZXBsaWJzIgorCWRlcGxpYnM9CisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwljYXNlICRwYXNzIGluCisJZGxvcGVuKSBsaWJzPSIkZGxmaWxlcyIgOzsKKwlkbHByZW9wZW4pIGxpYnM9IiRkbHByZWZpbGVzIiA7OworCWxpbmspIGxpYnM9IiRkZXBsaWJzICVERVBMSUJTJSAkZGVwZW5kZW5jeV9saWJzIiA7OworCWVzYWMKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixkbHByZW9wZW4iOyB0aGVuCisJIyBDb2xsZWN0IGFuZCBmb3J3YXJkIGRlcGxpYnMgb2YgcHJlb3BlbmVkIGxpYnRvb2wgbGlicworCWZvciBsaWIgaW4gJGRscHJlZmlsZXM7IGRvCisJICAjIElnbm9yZSBub24tbGlidG9vbC1saWJzCisJICBkZXBlbmRlbmN5X2xpYnM9CisJICBjYXNlICRsaWIgaW4KKwkgICoubGEpCWZ1bmNfc291cmNlICIkbGliIiA7OworCSAgZXNhYworCisJICAjIENvbGxlY3QgcHJlb3BlbmVkIGxpYnRvb2wgZGVwbGlicywgZXhjZXB0IGFueSB0aGlzIGxpYnJhcnkKKwkgICMgaGFzIGRlY2xhcmVkIGFzIHdlYWsgbGlicworCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworICAgICAgICAgICAgZGVwbGliX2Jhc2U9YCRFQ0hPICJYJGRlcGxpYiIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKwkgICAgY2FzZSAiICR3ZWFrX2xpYnMgIiBpbgorCSAgICAqIiAkZGVwbGliX2Jhc2UgIiopIDs7CisJICAgICopIGRlcGxpYnM9IiRkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlkb25lCisJbGlicz0iJGRscHJlZmlsZXMiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAiJHBhc3MiID0gZGxvcGVuOyB0aGVuCisJIyBDb2xsZWN0IGRscHJlb3BlbmVkIGxpYnJhcmllcworCXNhdmVfZGVwbGlicz0iJGRlcGxpYnMiCisJZGVwbGlicz0KKyAgICAgIGZpCisKKyAgICAgIGZvciBkZXBsaWIgaW4gJGxpYnM7IGRvCisJbGliPQorCWZvdW5kPW5vCisJY2FzZSAkZGVwbGliIGluCisJLW10fC1tdGhyZWFkc3wta3RocmVhZHwtS3RocmVhZHwtcHRocmVhZHwtcHRocmVhZHN8LS10aHJlYWQtc2FmZXwtdGhyZWFkcykKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCSAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAkZGVwbGliIgorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliIDsgdGhlbgorCQljYXNlICIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgIiBpbgorCQkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkJICAgICogKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRkZXBsaWIiIDs7CisJCWVzYWMKKwkgICAgZmkKKwkgIGZpCisJICBjb250aW51ZQorCSAgOzsKKwktbCopCisJICBpZiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYiAmJiB0ZXN0ICIkbGlua21vZGUiICE9IHByb2c7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJcYC1sJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcy9vYmplY3RzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGZ1bmNfc3RyaXBuYW1lICctbCcgJycgIiRkZXBsaWIiCisJICBuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgICAgc2VhcmNoZGlycz0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGliX3NlYXJjaF9wYXRoICRjb21waWxlcl9saWJfc2VhcmNoX2RpcnMgJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZWxzZQorCSAgICBzZWFyY2hkaXJzPSIkbmV3bGliX3NlYXJjaF9wYXRoICRsaWJfc2VhcmNoX3BhdGggJHN5c19saWJfc2VhcmNoX3BhdGggJHNobGliX3NlYXJjaF9wYXRoIgorCSAgZmkKKwkgIGZvciBzZWFyY2hkaXIgaW4gJHNlYXJjaGRpcnM7IGRvCisJICAgIGZvciBzZWFyY2hfZXh0IGluIC5sYSAkc3RkX3NocmV4dCAuc28gLmE7IGRvCisJICAgICAgIyBTZWFyY2ggdGhlIGxpYnRvb2wgbGlicmFyeQorCSAgICAgIGxpYj0iJHNlYXJjaGRpci9saWIke25hbWV9JHtzZWFyY2hfZXh0fSIKKwkgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorCQlpZiB0ZXN0ICIkc2VhcmNoX2V4dCIgPSAiLmxhIjsgdGhlbgorCQkgIGZvdW5kPXllcworCQllbHNlCisJCSAgZm91bmQ9bm8KKwkJZmkKKwkJYnJlYWsgMgorCSAgICAgIGZpCisJICAgIGRvbmUKKwkgIGRvbmUKKwkgIGlmIHRlc3QgIiRmb3VuZCIgIT0geWVzOyB0aGVuCisJICAgICMgZGVwbGliIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGxpYnRvb2wgbGlicmFyeQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkgICAgICB0ZXN0ICIkbGlua21vZGUiID0gbGliICYmIG5ld2RlcGVuZGVuY3lfbGlicz0iJGRlcGxpYiAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaQorCSAgICBjb250aW51ZQorCSAgZWxzZSAjIGRlcGxpYiBpcyBhIGxpYnRvb2wgbGlicmFyeQorCSAgICAjIElmICRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMgJiYgJGRlcGxpYiBpcyBhIHN0ZGxpYiwKKwkgICAgIyBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCB0aGluZ3MgaGVyZSwgYW5kIG5vdCBsYXRlci4KKwkgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCSAgICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopCisJCWlmIGZ1bmNfbGFsaWJfcCAiJGxpYiI7IHRoZW4KKwkJICBsaWJyYXJ5X25hbWVzPQorCQkgIG9sZF9saWJyYXJ5PQorCQkgIGZ1bmNfc291cmNlICIkbGliIgorCQkgIGZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkJICAgIGxsPSIkbCIKKwkJICBkb25lCisJCSAgaWYgdGVzdCAiWCRsbCIgPSAiWCRvbGRfbGlicmFyeSIgOyB0aGVuICMgb25seSBzdGF0aWMgdmVyc2lvbiBhdmFpbGFibGUKKwkJICAgIGZvdW5kPW5vCisJCSAgICBmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCQkgICAgbGFkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorCQkgICAgbGliPSRsYWRpci8kb2xkX2xpYnJhcnkKKwkJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxsaW5rIjsgdGhlbgorCQkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkJICAgIGVsc2UKKwkJICAgICAgZGVwbGlicz0iJGRlcGxpYiAkZGVwbGlicyIKKwkJICAgICAgdGVzdCAiJGxpbmttb2RlIiA9IGxpYiAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkJICAgIGZpCisJCSAgICBjb250aW51ZQorCQkgIGZpCisJCWZpCisJCTs7CisJICAgICAgKikgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBmaQorCSAgOzsgIyAtbAorCSoubHRmcmFtZXdvcmspCisJICBpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9IiRkZXBsaWIgJGZpbmFsaXplX2RlcGxpYnMiCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgOyB0aGVuCisJCWNhc2UgIiRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyAiIGluCisJCSAgICAqIiAkZGVwbGliICIqKSA7OworCQkgICAgKiApIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGRlcGxpYiIgOzsKKwkJZXNhYworCSAgICBmaQorCSAgZmkKKwkgIGNvbnRpbnVlCisJICA7OworCS1MKikKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIHRlc3QgIiRwYXNzIiA9IGNvbnYgJiYgY29udGludWUKKwkgICAgbmV3ZGVwZW5kZW5jeV9saWJzPSIkZGVwbGliICRuZXdkZXBlbmRlbmN5X2xpYnMiCisJICAgIGZ1bmNfc3RyaXBuYW1lICctTCcgJycgIiRkZXBsaWIiCisJICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgICAgY29udGludWUKKwkgICAgZmkKKwkgICAgaWYgdGVzdCAiJHBhc3MiID0gc2NhbjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICBjb21waWxlX2RlcGxpYnM9IiRkZXBsaWIgJGNvbXBpbGVfZGVwbGlicyIKKwkgICAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGVwbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBmaQorCSAgICBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICBuZXdsaWJfc2VhcmNoX3BhdGg9IiRuZXdsaWJfc2VhcmNoX3BhdGggJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdCIKKwkgICAgOzsKKwkgICopCisJICAgIGZ1bmNfd2FybmluZyAiXGAtTCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMvb2JqZWN0cyIKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgY29udGludWUKKwkgIDs7ICMgLUwKKwktUiopCisJICBpZiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgIGZ1bmNfc3RyaXBuYW1lICctUicgJycgIiRkZXBsaWIiCisJICAgIGRpcj0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICMgTWFrZSBzdXJlIHRoZSB4cnBhdGggY29udGFpbnMgb25seSB1bmlxdWUgZGlyZWN0b3JpZXMuCisJICAgIGNhc2UgIiR4cnBhdGggIiBpbgorCSAgICAqIiAkZGlyICIqKSA7OworCSAgICAqKSB4cnBhdGg9IiR4cnBhdGggJGRpciIgOzsKKwkgICAgZXNhYworCSAgZmkKKwkgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICBjb250aW51ZQorCSAgOzsKKwkqLmxhKSBsaWI9IiRkZXBsaWIiIDs7CisJKi4kbGliZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBjb250aW51ZQorCSAgZmkKKwkgIGNhc2UgJGxpbmttb2RlIGluCisJICBsaWIpCisJICAgICMgTGlua2luZyBjb252ZW5pZW5jZSBtb2R1bGVzIGludG8gc2hhcmVkIGxpYnJhcmllcyBpcyBhbGxvd2VkLAorCSAgICAjIGJ1dCBsaW5raW5nIG90aGVyIHN0YXRpYyBsaWJyYXJpZXMgaXMgbm9uLXBvcnRhYmxlLgorCSAgICBjYXNlICIgJGRscHJlY29udmVuaWVuY2VsaWJzICIgaW4KKwkgICAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICAgKikKKwkgICAgICB2YWxpZF9hX2xpYj1ubworCSAgICAgIGNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJCW1hdGNoX3BhdHRlcm4qKQorCQkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJCSAgbWF0Y2hfcGF0dGVybl9yZWdleD1gZXhwciAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA6ICIkMSBcKC4qXCkiYAorCQkgIGlmIGV2YWwgIlwkRUNITyBcIlgkZGVwbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIFwKKwkJICAgIHwgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgIHZhbGlkX2FfbGliPXllcworCQkgIGZpCisJCTs7CisJCXBhc3NfYWxsKQorCQkgIHZhbGlkX2FfbGliPXllcworCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBpZiB0ZXN0ICIkdmFsaWRfYV9saWIiICE9IHllczsgdGhlbgorCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IFRyeWluZyB0byBsaW5rIHdpdGggc3RhdGljIGxpYiBhcmNoaXZlICRkZXBsaWIuIgorCQkkRUNITyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKKwkJJEVDSE8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCisJCSRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIHlvdSBkbyBub3QgYXBwZWFyIHRvIGhhdmUiCisJCSRFQ0hPICIqKiogYmVjYXVzZSB0aGUgZmlsZSBleHRlbnNpb25zIC4kbGliZXh0IG9mIHRoaXMgYXJndW1lbnQgbWFrZXMgbWUgYmVsaWV2ZSIKKwkJJEVDSE8gIioqKiB0aGF0IGl0IGlzIGp1c3QgYSBzdGF0aWMgYXJjaGl2ZSB0aGF0IEkgc2hvdWxkIG5vdCB1c2UgaGVyZS4iCisJICAgICAgZWxzZQorCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IExpbmtpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5ICRvdXRwdXQgYWdhaW5zdCB0aGUiCisJCSRFQ0hPICIqKiogc3RhdGljIGxpYnJhcnkgJGRlcGxpYiBpcyBub3QgcG9ydGFibGUhIgorCQlkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICAgIGZpCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjb250aW51ZQorCSAgICA7OworCSAgcHJvZykKKwkgICAgaWYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZmkKKwkgICAgY29udGludWUKKwkgICAgOzsKKwkgIGVzYWMgIyBsaW5rbW9kZQorCSAgOzsgIyAqLiRsaWJleHQKKwkqLmxvIHwgKi4kb2JqZXh0KQorCSAgaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBpZiB0ZXN0ICIkcGFzcyIgPSBkbHByZW9wZW4gfHwgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICAgICMgSWYgdGhlcmUgaXMgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAorCSAgICAgICMgd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICAgIG5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRkZXBsaWIiCisJICAgICAgY29tcGlsZV9kZXBsaWJzPSIkZGVwbGliICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgZmluYWxpemVfZGVwbGlicz0iJGRlcGxpYiAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgZWxzZQorCSAgICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRkZXBsaWIiCisJICAgIGZpCisJICBmaQorCSAgY29udGludWUKKwkgIDs7CisJJURFUExJQlMlKQorCSAgYWxsZGVwbGlicz15ZXMKKwkgIGNvbnRpbnVlCisJICA7OworCWVzYWMgIyBjYXNlICRkZXBsaWIKKworCWlmIHRlc3QgIiRmb3VuZCIgPSB5ZXMgfHwgdGVzdCAtZiAiJGxpYiI7IHRoZW4gOgorCWVsc2UKKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIHRoZSBsaWJyYXJ5IFxgJGxpYicgb3IgdW5oYW5kbGVkIGFyZ3VtZW50IFxgJGRlcGxpYiciCisJZmkKKworCSMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisJZnVuY19sYWxpYl91bnNhZmVfcCAiJGxpYiIgXAorCSAgfHwgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisKKwlmdW5jX2Rpcm5hbWUgIiRsaWIiICIiICIuIgorCWxhZGlyPSIkZnVuY19kaXJuYW1lX3Jlc3VsdCIKKworCWRsbmFtZT0KKwlkbG9wZW49CisJZGxwcmVvcGVuPQorCWxpYmRpcj0KKwlsaWJyYXJ5X25hbWVzPQorCW9sZF9saWJyYXJ5PQorCWluaGVyaXRlZF9saW5rZXJfZmxhZ3M9CisJIyBJZiB0aGUgbGlicmFyeSB3YXMgaW5zdGFsbGVkIHdpdGggYW4gb2xkIHJlbGVhc2Ugb2YgbGlidG9vbCwKKwkjIGl0IHdpbGwgbm90IHJlZGVmaW5lIHZhcmlhYmxlcyBpbnN0YWxsZWQsIG9yIHNob3VsZG5vdGxpbmsKKwlpbnN0YWxsZWQ9eWVzCisJc2hvdWxkbm90bGluaz1ubworCWF2b2lkdGVtcHJwYXRoPQorCisKKwkjIFJlYWQgdGhlIC5sYSBmaWxlCisJZnVuY19zb3VyY2UgIiRsaWIiCisKKwkjIENvbnZlcnQgIi1mcmFtZXdvcmsgZm9vIiB0byAiZm9vLmx0ZnJhbWV3b3JrIgorCWlmIHRlc3QgLW4gIiRpbmhlcml0ZWRfbGlua2VyX2ZsYWdzIjsgdGhlbgorCSAgdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZ3M9YCRFQ0hPICJYJGluaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MvLWZyYW1ld29yayBcKFteICRdKlwpL1wxLmx0ZnJhbWV3b3JrL2cnYAorCSAgZm9yIHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWcgaW4gJHRtcF9pbmhlcml0ZWRfbGlua2VyX2ZsYWdzOyBkbworCSAgICBjYXNlICIgJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICIgaW4KKwkgICAgICAqIiAkdG1wX2luaGVyaXRlZF9saW5rZXJfZmxhZyAiKikgOzsKKwkgICAgICAqKSBuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICR0bXBfaW5oZXJpdGVkX2xpbmtlcl9mbGFnIjs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWRlcGVuZGVuY3lfbGlicz1gJEVDSE8gIlggJGRlcGVuZGVuY3lfbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gImxpYixsaW5rIiB8fAorCSAgIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgPSAicHJvZyxzY2FuIiB8fAorCSAgIHsgdGVzdCAiJGxpbmttb2RlIiAhPSBwcm9nICYmIHRlc3QgIiRsaW5rbW9kZSIgIT0gbGliOyB9OyB0aGVuCisJICB0ZXN0IC1uICIkZGxvcGVuIiAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkZGxvcGVuIgorCSAgdGVzdCAtbiAiJGRscHJlb3BlbiIgJiYgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRscHJlb3BlbiIKKwlmaQorCisJaWYgdGVzdCAiJHBhc3MiID0gY29udjsgdGhlbgorCSAgIyBPbmx5IGNoZWNrIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMKKwkgIGRlcGxpYnM9IiRsaWIgJGRlcGxpYnMiCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgICBpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGZpbmQgbmFtZSBvZiBsaW5rIGxpYnJhcnkgZm9yIFxgJGxpYiciCisJICAgIGZpCisJICAgICMgSXQgaXMgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnksIHNvIGFkZCBpbiBpdHMgb2JqZWN0cy4KKwkgICAgY29udmVuaWVuY2U9IiRjb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICAgIG9sZF9jb252ZW5pZW5jZT0iJG9sZF9jb252ZW5pZW5jZSAkbGFkaXIvJG9iamRpci8kb2xkX2xpYnJhcnkiCisJICBlbGlmIHRlc3QgIiRsaW5rbW9kZSIgIT0gcHJvZyAmJiB0ZXN0ICIkbGlua21vZGUiICE9IGxpYjsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJcYCRsaWInIGlzIG5vdCBhIGNvbnZlbmllbmNlIGxpYnJhcnkiCisJICBmaQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRkZXBlbmRlbmN5X2xpYnM7IGRvCisJICAgIGRlcGxpYnM9IiRkZXBsaWIgJGRlcGxpYnMiCisJICAgIGlmICRvcHRfZHVwbGljYXRlX2RlcHMgOyB0aGVuCisJICAgICAgY2FzZSAiJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSBzcGVjaWFsZGVwbGlicz0iJHNwZWNpYWxkZXBsaWJzICRkZXBsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICB0bXBfbGlicz0iJHRtcF9saWJzICRkZXBsaWIiCisJICBkb25lCisJICBjb250aW51ZQorCWZpICMgJHBhc3MgPSBjb252CisKKworCSMgR2V0IHRoZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdlIGxpbmsgYWdhaW5zdC4KKwlsaW5rbGliPQorCWZvciBsIGluICRvbGRfbGlicmFyeSAkbGlicmFyeV9uYW1lczsgZG8KKwkgIGxpbmtsaWI9IiRsIgorCWRvbmUKKwlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKwkgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRsaWInIgorCWZpCisKKwkjIFRoaXMgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRsb3Blbi4KKwlpZiB0ZXN0ICIkcGFzcyIgPSBkbG9wZW47IHRoZW4KKwkgIGlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJICAgIGZ1bmNfZmF0YWxfZXJyb3IgImNhbm5vdCAtZGxvcGVuIGEgY29udmVuaWVuY2UgbGlicmFyeTogXGAkbGliJyIKKwkgIGZpCisJICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fAorCSAgICAgdGVzdCAiJGRsb3Blbl9zdXBwb3J0IiAhPSB5ZXMgfHwKKwkgICAgIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbm87IHRoZW4KKwkgICAgIyBJZiB0aGVyZSBpcyBubyBkbG5hbWUsIG5vIGRsb3BlbiBzdXBwb3J0IG9yIHdlJ3JlIGxpbmtpbmcKKwkgICAgIyBzdGF0aWNhbGx5LCB3ZSBuZWVkIHRvIHByZWxvYWQuICBXZSBhbHNvIG5lZWQgdG8gcHJlbG9hZCBhbnkKKwkgICAgIyBkZXBlbmRlbnQgbGlicmFyaWVzIHNvIGxpYmx0ZGwncyBkZXBsaWIgcHJlbG9hZGVyIGRvZXNuJ3QKKwkgICAgIyBib21iIG91dCBpbiB0aGUgbG9hZCBkZXBsaWJzIHBoYXNlLgorCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkbGliICRkZXBlbmRlbmN5X2xpYnMiCisJICBlbHNlCisJICAgIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiCisJICBmaQorCSAgY29udGludWUKKwlmaSAjICRwYXNzID0gZGxvcGVuCisKKwkjIFdlIG5lZWQgYW4gYWJzb2x1dGUgcGF0aC4KKwljYXNlICRsYWRpciBpbgorCVtcXC9dKiB8IFtBLVphLXpdOltcXC9dKikgYWJzX2xhZGlyPSIkbGFkaXIiIDs7CisJKikKKwkgIGFic19sYWRpcj1gY2QgIiRsYWRpciIgJiYgcHdkYAorCSAgaWYgdGVzdCAteiAiJGFic19sYWRpciI7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJjYW5ub3QgZGV0ZXJtaW5lIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIG9mIFxgJGxhZGlyJyIKKwkgICAgZnVuY193YXJuaW5nICJwYXNzaW5nIGl0IGxpdGVyYWxseSB0byB0aGUgbGlua2VyLCBhbHRob3VnaCBpdCBtaWdodCBmYWlsIgorCSAgICBhYnNfbGFkaXI9IiRsYWRpciIKKwkgIGZpCisJICA7OworCWVzYWMKKwlmdW5jX2Jhc2VuYW1lICIkbGliIgorCWxhbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCisJIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCisJaWYgdGVzdCAiWCRpbnN0YWxsZWQiID0gWHllczsgdGhlbgorCSAgaWYgdGVzdCAhIC1mICIkbGliZGlyLyRsaW5rbGliIiAmJiB0ZXN0IC1mICIkYWJzX2xhZGlyLyRsaW5rbGliIjsgdGhlbgorCSAgICBmdW5jX3dhcm5pbmcgImxpYnJhcnkgXGAkbGliJyB3YXMgbW92ZWQuIgorCSAgICBkaXI9IiRsYWRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyIgorCSAgICBsaWJkaXI9IiRhYnNfbGFkaXIiCisJICBlbHNlCisJICAgIGRpcj0iJGxpYmRpciIKKwkgICAgYWJzZGlyPSIkbGliZGlyIgorCSAgZmkKKwkgIHRlc3QgIlgkaGFyZGNvZGVfYXV0b21hdGljIiA9IFh5ZXMgJiYgYXZvaWR0ZW1wcnBhdGg9eWVzCisJZWxzZQorCSAgaWYgdGVzdCAhIC1mICIkbGFkaXIvJG9iamRpci8kbGlua2xpYiIgJiYgdGVzdCAtZiAiJGFic19sYWRpci8kbGlua2xpYiI7IHRoZW4KKwkgICAgZGlyPSIkbGFkaXIiCisJICAgIGFic2Rpcj0iJGFic19sYWRpciIKKwkgICAgIyBSZW1vdmUgdGhpcyBzZWFyY2ggcGF0aCBsYXRlcgorCSAgICBub3RpbnN0X3BhdGg9IiRub3RpbnN0X3BhdGggJGFic19sYWRpciIKKwkgIGVsc2UKKwkgICAgZGlyPSIkbGFkaXIvJG9iamRpciIKKwkgICAgYWJzZGlyPSIkYWJzX2xhZGlyLyRvYmpkaXIiCisJICAgICMgUmVtb3ZlIHRoaXMgc2VhcmNoIHBhdGggbGF0ZXIKKwkgICAgbm90aW5zdF9wYXRoPSIkbm90aW5zdF9wYXRoICRhYnNfbGFkaXIiCisJICBmaQorCWZpICMgJGluc3RhbGxlZCA9IHllcworCWZ1bmNfc3RyaXBuYW1lICdsaWInICcubGEnICIkbGFuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCisJIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisJaWYgdGVzdCAiJHBhc3MiID0gZGxwcmVvcGVuOyB0aGVuCisJICBpZiB0ZXN0IC16ICIkbGliZGlyIiAmJiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICBmdW5jX2ZhdGFsX2Vycm9yICJvbmx5IGxpYnJhcmllcyBtYXkgLWRscHJlb3BlbiBhIGNvbnZlbmllbmNlIGxpYnJhcnk6IFxgJGxpYiciCisJICBmaQorCSAgIyBQcmVmZXIgdXNpbmcgYSBzdGF0aWMgbGlicmFyeSAoc28gdGhhdCBubyBzaWxseSBfRFlOQU1JQyBzeW1ib2xzCisJICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKwkgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisJICAgICMgS2VlcCBhIGxpc3Qgb2YgcHJlb3BlbmVkIGNvbnZlbmllbmNlIGxpYnJhcmllcyB0byBjaGVjaworCSAgICAjIHRoYXQgdGhleSBhcmUgYmVpbmcgdXNlZCBjb3JyZWN0bHkgaW4gdGhlIGxpbmsgcGFzcy4KKwkgICAgdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQlkbHByZWNvbnZlbmllbmNlbGlicz0iJGRscHJlY29udmVuaWVuY2VsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorCSAgIyBPdGhlcndpc2UsIHVzZSB0aGUgZGxuYW1lLCBzbyB0aGF0IGx0X2Rsb3BlbiBmaW5kcyBpdC4KKwkgIGVsaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKwkgICAgbmV3ZGxwcmVmaWxlcz0iJG5ld2RscHJlZmlsZXMgJGRpci8kZGxuYW1lIgorCSAgZWxzZQorCSAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorCSAgZmkKKwlmaSAjICRwYXNzID0gZGxwcmVvcGVuCisKKwlpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorCSAgIyBMaW5rIHRoZSBjb252ZW5pZW5jZSBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gbGliOyB0aGVuCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgZWxpZiB0ZXN0ICIkbGlua21vZGUsJHBhc3MiID0gInByb2csbGluayI7IHRoZW4KKwkgICAgY29tcGlsZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRvbGRfbGlicmFyeSAkZmluYWxpemVfZGVwbGlicyIKKwkgIGVsc2UKKwkgICAgZGVwbGlicz0iJGxpYiAkZGVwbGlicyIgIyB1c2VkIGZvciBwcm9nLHNjYW4gcGFzcworCSAgZmkKKwkgIGNvbnRpbnVlCisJZmkKKworCisJaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgJiYgdGVzdCAiJHBhc3MiICE9IGxpbms7IHRoZW4KKwkgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkbGFkaXIiCisJICBkZXBsaWJzPSIkbGliICRkZXBsaWJzIgorCisJICBsaW5rYWxsZGVwbGlicz1ubworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vIHx8IHRlc3QgLXogIiRsaWJyYXJ5X25hbWVzIiB8fAorCSAgICAgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgorCSAgICBsaW5rYWxsZGVwbGlicz15ZXMKKwkgIGZpCisKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgLUwqKSBmdW5jX3N0cmlwbmFtZSAnLUwnICcnICIkZGVwbGliIgorCSAgICAgICAgIG5ld2xpYl9zZWFyY2hfcGF0aD0iJG5ld2xpYl9zZWFyY2hfcGF0aCAkZnVuY19zdHJpcG5hbWVfcmVzdWx0IgorCQkgOzsKKwkgICAgZXNhYworCSAgICAjIE5lZWQgdG8gbGluayBhZ2FpbnN0IGFsbCBkZXBlbmRlbmN5X2xpYnM/CisJICAgIGlmIHRlc3QgIiRsaW5rYWxsZGVwbGlicyIgPSB5ZXM7IHRoZW4KKwkgICAgICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgIyBOZWVkIHRvIGhhcmRjb2RlIHNoYXJlZCBsaWJyYXJ5IHBhdGhzCisJICAgICAgIyBvci9hbmQgbGluayBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgZmkKKwkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUgIyBmb3IgZGVwbGliCisJICBjb250aW51ZQorCWZpICMgJGxpbmttb2RlID0gcHJvZy4uLgorCisJaWYgdGVzdCAiJGxpbmttb2RlLCRwYXNzIiA9ICJwcm9nLGxpbmsiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYKKwkgICAgIHsgeyB0ZXN0ICIkcHJlZmVyX3N0YXRpY19saWJzIiA9IG5vIHx8CisJICAgICAgICAgdGVzdCAiJHByZWZlcl9zdGF0aWNfbGlicywkaW5zdGFsbGVkIiA9ICJidWlsdCx5ZXMiOyB9IHx8CisJICAgICAgIHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgICAgIyBXZSBuZWVkIHRvIGhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGgKKwkgICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLXogIiRhdm9pZHRlbXBycGF0aCIgOyB0aGVuCisJICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorCSAgICAgIGNhc2UgIiR0ZW1wX3JwYXRoOiIgaW4KKwkgICAgICAqIiRhYnNkaXI6IiopIDs7CisJICAgICAgKikgdGVtcF9ycGF0aD0iJHRlbXBfcnBhdGgkYWJzZGlyOiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisKKwkgICAgIyBIYXJkY29kZSB0aGUgbGlicmFyeSBwYXRoLgorCSAgICAjIFNraXAgZGlyZWN0b3JpZXMgdGhhdCBhcmUgaW4gdGhlIHN5c3RlbSBkZWZhdWx0IHJ1bi10aW1lCisJICAgICMgc2VhcmNoIHBhdGguCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkY29tcGlsZV9ycGF0aCAiIGluCisJICAgICAgKiIgJGFic2RpciAiKikgOzsKKwkgICAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICAgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KKwkgICAgKiIgJGxpYmRpciAiKikgOzsKKwkgICAgKikKKwkgICAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICAgKikgZmluYWxpemVfcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCAkbGliZGlyIgorCSAgICAgIGVzYWMKKwkgICAgICA7OworCSAgICBlc2FjCisJICBmaSAjICRsaW5rbW9kZSwkcGFzcyA9IHByb2csbGluay4uLgorCisJICBpZiB0ZXN0ICIkYWxsZGVwbGlicyIgPSB5ZXMgJiYKKwkgICAgIHsgdGVzdCAiJGRlcGxpYnNfY2hlY2tfbWV0aG9kIiA9IHBhc3NfYWxsIHx8CisJICAgICAgIHsgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYKKwkJIHRlc3QgLW4gIiRsaWJyYXJ5X25hbWVzIjsgfTsgfTsgdGhlbgorCSAgICAjIFdlIG9ubHkgbmVlZCB0byBzZWFyY2ggZm9yIHN0YXRpYyBsaWJyYXJpZXMKKwkgICAgY29udGludWUKKwkgIGZpCisJZmkKKworCWxpbmtfc3RhdGljPW5vICMgV2hldGhlciB0aGUgZGVwbGliIHdpbGwgYmUgbGlua2VkIHN0YXRpY2FsbHkKKwl1c2Vfc3RhdGljX2xpYnM9JHByZWZlcl9zdGF0aWNfbGlicworCWlmIHRlc3QgIiR1c2Vfc3RhdGljX2xpYnMiID0gYnVpbHQgJiYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgIHVzZV9zdGF0aWNfbGlicz1ubworCWZpCisJaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmCisJICAgeyB0ZXN0ICIkdXNlX3N0YXRpY19saWJzIiA9IG5vIHx8IHRlc3QgLXogIiRvbGRfbGlicmFyeSI7IH07IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qIHwgKm1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgIyBObyBwb2ludCBpbiByZWxpbmtpbmcgRExMcyBiZWNhdXNlIHBhdGhzIGFyZSBub3QgZW5jb2RlZAorCSAgICAgIG5vdGluc3RfZGVwbGlicz0iJG5vdGluc3RfZGVwbGlicyAkbGliIgorCSAgICAgIG5lZWRfcmVsaW5rPW5vCisJICAgIDs7CisJICAqKQorCSAgICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vOyB0aGVuCisJICAgICAgbm90aW5zdF9kZXBsaWJzPSIkbm90aW5zdF9kZXBsaWJzICRsaWIiCisJICAgICAgbmVlZF9yZWxpbms9eWVzCisJICAgIGZpCisJICAgIDs7CisJICBlc2FjCisJICAjIFRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeQorCisJICAjIFdhcm4gYWJvdXQgcG9ydGFiaWxpdHksIGNhbid0IGxpbmsgYWdhaW5zdCAtbW9kdWxlJ3Mgb24gc29tZQorCSAgIyBzeXN0ZW1zIChkYXJ3aW4pLiAgRG9uJ3QgYmxlYXQgYWJvdXQgZGxvcGVuZWQgbW9kdWxlcyB0aG91Z2ghCisJICBkbG9wZW5tb2R1bGU9IiIKKwkgIGZvciBkbHByZW1vZHVsZXRlc3QgaW4gJGRscHJlZmlsZXM7IGRvCisJICAgIGlmIHRlc3QgIlgkZGxwcmVtb2R1bGV0ZXN0IiA9ICJYJGxpYiI7IHRoZW4KKwkgICAgICBkbG9wZW5tb2R1bGU9IiRkbHByZW1vZHVsZXRlc3QiCisJICAgICAgYnJlYWsKKwkgICAgZmkKKwkgIGRvbmUKKwkgIGlmIHRlc3QgLXogIiRkbG9wZW5tb2R1bGUiICYmIHRlc3QgIiRzaG91bGRub3RsaW5rIiA9IHllcyAmJiB0ZXN0ICIkcGFzcyIgPSBsaW5rOyB0aGVuCisJICAgICRFQ0hPCisJICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBleGVjdXRhYmxlICRvdXRwdXQgYWdhaW5zdCB0aGUgbG9hZGFibGUgbW9kdWxlIgorCSAgICBlbHNlCisJICAgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIGxvYWRhYmxlIG1vZHVsZSIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiAkbGlua2xpYiBpcyBub3QgcG9ydGFibGUhIgorCSAgZmkKKwkgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWIgJiYKKwkgICAgIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAgICMgSGFyZGNvZGUgdGhlIGxpYnJhcnkgcGF0aC4KKwkgICAgIyBTa2lwIGRpcmVjdG9yaWVzIHRoYXQgYXJlIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCBydW4tdGltZQorCSAgICAjIHNlYXJjaCBwYXRoLgorCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgorCSAgICAgICoiICRhYnNkaXIgIiopIDs7CisJICAgICAgKikgY29tcGlsZV9ycGF0aD0iJGNvbXBpbGVfcnBhdGggJGFic2RpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgICBjYXNlICIgJHN5c19saWJfZGxzZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRsaWJkaXIgIiopIDs7CisJICAgICopCisJICAgICAgY2FzZSAiJGZpbmFsaXplX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZmkKKworCSAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fZXhwc3ltc19jbWRzIjsgdGhlbgorCSAgICAjIGZpZ3VyZSBvdXQgdGhlIHNvbmFtZQorCSAgICBzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKKwkgICAgc2hpZnQKKwkgICAgcmVhbG5hbWU9IiQxIgorCSAgICBzaGlmdAorCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkgICAgIyB1c2UgZGxuYW1lIGlmIHdlIGdvdCBpdC4gaXQncyBwZXJmZWN0bHkgZ29vZCwgbm8/CisJICAgIGlmIHRlc3QgLW4gIiRkbG5hbWUiOyB0aGVuCisJICAgICAgc29uYW1lPSIkZGxuYW1lIgorCSAgICBlbGlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KKwkgICAgICAjIGJsZWggd2luZG93cworCSAgICAgIGNhc2UgJGhvc3QgaW4KKwkgICAgICAqY3lnd2luKiB8IG1pbmd3KiB8ICpjZWdjYyopCisJICAgICAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCQltYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJdmVyc3VmZml4PSItJG1ham9yIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJICAgIGVsc2UKKwkgICAgICBzb25hbWU9IiRyZWFsbmFtZSIKKwkgICAgZmkKKworCSAgICAjIE1ha2UgYSBuZXcgbmFtZSBmb3IgdGhlIGV4dHJhY3RfZXhwc3ltc19jbWRzIHRvIHVzZQorCSAgICBzb3Jvb3Q9IiRzb25hbWUiCisJICAgIGZ1bmNfYmFzZW5hbWUgIiRzb3Jvb3QiCisJICAgIHNvbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBmdW5jX3N0cmlwbmFtZSAnbGliJyAnLmRsbCcgIiRzb25hbWUiCisJICAgIG5ld2xpYj1saWJpbXAtJGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdC5hCisKKwkgICAgIyBJZiB0aGUgbGlicmFyeSBoYXMgbm8gZXhwb3J0IGxpc3QsIHRoZW4gY3JlYXRlIG9uZSBub3cKKwkgICAgaWYgdGVzdCAtZiAiJG91dHB1dF9vYmpkaXIvJHNvbmFtZS1kZWYiOyB0aGVuIDoKKwkgICAgZWxzZQorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZXh0cmFjdGluZyBleHBvcnRlZCBzeW1ib2wgbGlzdCBmcm9tIFxgJHNvbmFtZSciCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRleHRyYWN0X2V4cHN5bXNfY21kcyIgJ2V4aXQgJD8nCisJICAgIGZpCisKKwkgICAgIyBDcmVhdGUgJG5ld2xpYgorCSAgICBpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8kbmV3bGliIjsgdGhlbiA6OyBlbHNlCisJICAgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIGltcG9ydCBsaWJyYXJ5IGZvciBcYCRzb25hbWUnIgorCSAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkb2xkX2FyY2hpdmVfZnJvbV9leHBzeW1zX2NtZHMiICdleGl0ICQ/JworCSAgICBmaQorCSAgICAjIG1ha2Ugc3VyZSB0aGUgbGlicmFyeSB2YXJpYWJsZXMgYXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgbGlicmFyeQorCSAgICBkaXI9JG91dHB1dF9vYmpkaXIKKwkgICAgbGlua2xpYj0kbmV3bGliCisJICBmaSAjIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX2V4cHN5bXNfY21kcyIKKworCSAgaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2cgfHwgdGVzdCAiJG1vZGUiICE9IHJlbGluazsgdGhlbgorCSAgICBhZGRfc2hsaWJwYXRoPQorCSAgICBhZGRfZGlyPQorCSAgICBhZGQ9CisJICAgIGxpYl9saW5rZWQ9eWVzCisJICAgIGNhc2UgJGhhcmRjb2RlX2FjdGlvbiBpbgorCSAgICBpbW1lZGlhdGUgfCB1bnN1cHBvcnRlZCkKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisJCWFkZD0iJGRpci8kbGlua2xpYiIKKwkJY2FzZSAkaG9zdCBpbgorCQkgICotKi1zY28zLjJ2NS4wLlswMjRdKikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1zeXN2NCp1dzIqKSBhZGRfZGlyPSItTCRkaXIiIDs7CisJCSAgKi0qLXN5c3Y1T3BlblVOSVgqIHwgKi0qLXN5c3Y1VW5peFdhcmU3LlswMV0uWzEwXSogfCBcCisJCSAgICAqLSotdW5peHdhcmU3KikgYWRkX2Rpcj0iLUwkZGlyIiA7OworCQkgICotKi1kYXJ3aW4qICkKKwkJICAgICMgaWYgdGhlIGxpYiBpcyBhIChub24tZGxvcGVuZWQpIG1vZHVsZSB0aGVuIHdlIGNhbiBub3QKKwkJICAgICMgbGluayBhZ2FpbnN0IGl0LCBzb21lb25lIGlzIGlnbm9yaW5nIHRoZSBlYXJsaWVyIHdhcm5pbmdzCisJCSAgICBpZiAvdXNyL2Jpbi9maWxlIC1MICRhZGQgMj4gL2Rldi9udWxsIHwKKwkJCSAkR1JFUCAiOiBbXjpdKiBidW5kbGUiID4vZGV2L251bGwgOyB0aGVuCisJCSAgICAgIGlmIHRlc3QgIlgkZGxvcGVubW9kdWxlIiAhPSAiWCRsaWIiOyB0aGVuCisJCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpYiAkbGlua2xpYiBpcyBhIG1vZHVsZSwgbm90IGEgc2hhcmVkIGxpYnJhcnkiCisJCQlpZiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiIDsgdGhlbgorCQkJICAkRUNITworCQkJICAkRUNITyAiKioqIEFuZCB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBzdGF0aWMgYXJjaGl2ZSBhdmFpbGFibGUiCisJCQkgICRFQ0hPICIqKiogVGhlIGxpbmsgd2lsbCBwcm9iYWJseSBmYWlsLCBzb3JyeSIKKwkJCWVsc2UKKwkJCSAgYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJCWZpCisJCSAgICAgIGVsaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgorCQkJYWRkPSIkZGlyLyRvbGRfbGlicmFyeSIKKwkJICAgICAgZmkKKwkJICAgIGZpCisJCWVzYWMKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IG5vOyB0aGVuCisJCWNhc2UgJGhvc3QgaW4KKwkJKi0qLXN1bm9zKikgYWRkX3NobGlicGF0aD0iJGRpciIgOzsKKwkJZXNhYworCQlhZGRfZGlyPSItTCRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgIHJlbGluaykKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICAgIHRlc3QgIiRoYXJkY29kZV9kaXJlY3RfYWJzb2x1dGUiID0gbm87IHRoZW4KKwkJYWRkPSIkZGlyLyRsaW5rbGliIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisJCWFkZF9kaXI9Ii1MJGRpciIKKwkJIyBUcnkgbG9va2luZyBmaXJzdCBpbiB0aGUgbG9jYXRpb24gd2UncmUgYmVpbmcgaW5zdGFsbGVkIHRvLgorCQlpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIjsgdGhlbgorCQkgIGNhc2UgJGxpYmRpciBpbgorCQkgICAgW1xcL10qKQorCQkgICAgICBhZGRfZGlyPSIkYWRkX2RpciAtTCRpbnN0X3ByZWZpeF9kaXIkbGliZGlyIgorCQkgICAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkJYWRkPSItbCRuYW1lIgorCSAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJCWFkZF9zaGxpYnBhdGg9IiRkaXIiCisJCWFkZD0iLWwkbmFtZSIKKwkgICAgICBlbHNlCisJCWxpYl9saW5rZWQ9bm8KKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopIGxpYl9saW5rZWQ9bm8gOzsKKwkgICAgZXNhYworCisJICAgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KKwkgICAgICBmdW5jX2ZhdGFsX2NvbmZpZ3VyYXRpb24gInVuc3VwcG9ydGVkIGhhcmRjb2RlIHByb3BlcnRpZXMiCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJGFkZF9zaGxpYnBhdGgiOyB0aGVuCisJICAgICAgY2FzZSA6JGNvbXBpbGVfc2hsaWJwYXRoOiBpbgorCSAgICAgICoiOiRhZGRfc2hsaWJwYXRoOiIqKSA7OworCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWRkX3NobGlicGF0aDoiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBjb21waWxlX2RlcGxpYnM9IiRhZGRfZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgY29tcGlsZV9kZXBsaWJzPSIkYWRkICRjb21waWxlX2RlcGxpYnMiCisJICAgIGVsc2UKKwkgICAgICB0ZXN0IC1uICIkYWRkX2RpciIgJiYgZGVwbGlicz0iJGFkZF9kaXIgJGRlcGxpYnMiCisJICAgICAgdGVzdCAtbiAiJGFkZCIgJiYgZGVwbGlicz0iJGFkZCAkZGVwbGlicyIKKwkgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiAhPSB5ZXMgJiYKKwkJIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorCQljYXNlIDokZmluYWxpemVfc2hsaWJwYXRoOiBpbgorCQkqIjokbGliZGlyOiIqKSA7OworCQkqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiIgOzsKKwkJZXNhYworCSAgICAgIGZpCisJICAgIGZpCisJICBmaQorCisJICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZyB8fCB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgYWRkX3NobGlicGF0aD0KKwkgICAgYWRkX2Rpcj0KKwkgICAgYWRkPQorCSAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorCSAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IHllcyAmJgorCSAgICAgICB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0X2Fic29sdXRlIiA9IG5vOyB0aGVuCisJICAgICAgYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9taW51c19MIiA9IHllczsgdGhlbgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0geWVzOyB0aGVuCisJICAgICAgY2FzZSA6JGZpbmFsaXplX3NobGlicGF0aDogaW4KKwkgICAgICAqIjokbGliZGlyOiIqKSA7OworCSAgICAgICopIGZpbmFsaXplX3NobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCRsaWJkaXI6IiA7OworCSAgICAgIGVzYWMKKwkgICAgICBhZGQ9Ii1sJG5hbWUiCisJICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX2F1dG9tYXRpYyIgPSB5ZXM7IHRoZW4KKwkgICAgICBpZiB0ZXN0IC1uICIkaW5zdF9wcmVmaXhfZGlyIiAmJgorCQkgdGVzdCAtZiAiJGluc3RfcHJlZml4X2RpciRsaWJkaXIvJGxpbmtsaWIiIDsgdGhlbgorCQlhZGQ9IiRpbnN0X3ByZWZpeF9kaXIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGVsc2UKKwkJYWRkPSIkbGliZGlyLyRsaW5rbGliIgorCSAgICAgIGZpCisJICAgIGVsc2UKKwkgICAgICAjIFdlIGNhbm5vdCBzZWVtIHRvIGhhcmRjb2RlIGl0LCBndWVzcyB3ZSdsbCBmYWtlIGl0LgorCSAgICAgIGFkZF9kaXI9Ii1MJGxpYmRpciIKKwkgICAgICAjIFRyeSBsb29raW5nIGZpcnN0IGluIHRoZSBsb2NhdGlvbiB3ZSdyZSBiZWluZyBpbnN0YWxsZWQgdG8uCisJICAgICAgaWYgdGVzdCAtbiAiJGluc3RfcHJlZml4X2RpciI7IHRoZW4KKwkJY2FzZSAkbGliZGlyIGluCisJCSAgW1xcL10qKQorCQkgICAgYWRkX2Rpcj0iJGFkZF9kaXIgLUwkaW5zdF9wcmVmaXhfZGlyJGxpYmRpciIKKwkJICAgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGFkZD0iLWwkbmFtZSIKKwkgICAgZmkKKworCSAgICBpZiB0ZXN0ICIkbGlua21vZGUiID0gcHJvZzsgdGhlbgorCSAgICAgIHRlc3QgLW4gIiRhZGRfZGlyIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkX2RpciAkZmluYWxpemVfZGVwbGlicyIKKwkgICAgICB0ZXN0IC1uICIkYWRkIiAmJiBmaW5hbGl6ZV9kZXBsaWJzPSIkYWRkICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgICBlbHNlCisJICAgICAgdGVzdCAtbiAiJGFkZF9kaXIiICYmIGRlcGxpYnM9IiRhZGRfZGlyICRkZXBsaWJzIgorCSAgICAgIHRlc3QgLW4gIiRhZGQiICYmIGRlcGxpYnM9IiRhZGQgJGRlcGxpYnMiCisJICAgIGZpCisJICBmaQorCWVsaWYgdGVzdCAiJGxpbmttb2RlIiA9IHByb2c7IHRoZW4KKwkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKKwkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAorCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgorCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCisJICAgIGNvbXBpbGVfZGVwbGlicz0iJGRpci8kbGlua2xpYiAkY29tcGlsZV9kZXBsaWJzIgorCSAgICBmaW5hbGl6ZV9kZXBsaWJzPSIkZGlyLyRsaW5rbGliICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZWxzZQorCSAgICBjb21waWxlX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRjb21waWxlX2RlcGxpYnMiCisJICAgIGZpbmFsaXplX2RlcGxpYnM9Ii1sJG5hbWUgLUwkZGlyICRmaW5hbGl6ZV9kZXBsaWJzIgorCSAgZmkKKwllbGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJICAjIE5vdCBhIHNoYXJlZCBsaWJyYXJ5CisJICBpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICAgICMgV2UncmUgdHJ5aW5nIGxpbmsgYSBzaGFyZWQgbGlicmFyeSBhZ2FpbnN0IGEgc3RhdGljIG9uZQorCSAgICAjIGJ1dCB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKworCSAgICAjIEp1c3QgcHJpbnQgYSB3YXJuaW5nIGFuZCBhZGQgdGhlIGxpYnJhcnkgdG8gZGVwZW5kZW5jeV9saWJzIHNvCisJICAgICMgdGhhdCB0aGUgcHJvZ3JhbSBjYW4gYmUgbGlua2VkIGFnYWluc3QgdGhlIHN0YXRpYyBsaWJyYXJ5LgorCSAgICAkRUNITworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IFRoaXMgc3lzdGVtIGNhbiBub3QgbGluayB0byBzdGF0aWMgbGliIGFyY2hpdmUgJGxpYi4iCisJICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCSAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZS4iCisJICAgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzOyB0aGVuCisJICAgICAgJEVDSE8gIioqKiBCdXQgYXMgeW91IHRyeSB0byBidWlsZCBhIG1vZHVsZSBsaWJyYXJ5LCBsaWJ0b29sIHdpbGwgc3RpbGwgY3JlYXRlICIKKwkgICAgICAkRUNITyAiKioqIGEgc3RhdGljIG1vZHVsZSwgdGhhdCBzaG91bGQgd29yayBhcyBsb25nIGFzIHRoZSBkbG9wZW5pbmcgYXBwbGljYXRpb24iCisJICAgICAgJEVDSE8gIioqKiBpcyBsaW5rZWQgd2l0aCB0aGUgLWRsb3BlbiBmbGFnIHRvIHJlc29sdmUgc3ltYm9scyBhdCBydW50aW1lLiIKKwkgICAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCQkkRUNITworCQkkRUNITyAiKioqIEhvd2V2ZXIsIHRoaXMgd291bGQgb25seSB3b3JrIGlmIGxpYnRvb2wgd2FzIGFibGUgdG8gZXh0cmFjdCBzeW1ib2wiCisJCSRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCQkkRUNITyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgorCQkkRUNITyAiKioqIFxgbm0nIGZyb20gR05VIGJpbnV0aWxzIGFuZCBhIGZ1bGwgcmVidWlsZCBtYXkgaGVscC4iCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkJYnVpbGRfbGlidG9vbF9saWJzPW1vZHVsZQorCQlidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgICBlbHNlCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICAgIGZpCisJICAgIGZpCisJICBlbHNlCisJICAgIGRlcGxpYnM9IiRkaXIvJG9sZF9saWJyYXJ5ICRkZXBsaWJzIgorCSAgICBsaW5rX3N0YXRpYz15ZXMKKwkgIGZpCisJZmkgIyBsaW5rIHNoYXJlZC9zdGF0aWMgbGlicmFyeT8KKworCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKwkgIGlmIHRlc3QgLW4gIiRkZXBlbmRlbmN5X2xpYnMiICYmCisJICAgICB7IHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiICE9IHllcyB8fAorCSAgICAgICB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzIHx8CisJICAgICAgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSB5ZXM7IH07IHRoZW4KKwkgICAgIyBFeHRyYWN0IC1SIGZyb20gZGVwZW5kZW5jeV9saWJzCisJICAgIHRlbXBfZGVwbGlicz0KKwkgICAgZm9yIGxpYmRpciBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGxpYmRpciBpbgorCSAgICAgIC1SKikgZnVuY19zdHJpcG5hbWUgJy1SJyAnJyAiJGxpYmRpciIKKwkgICAgICAgICAgIHRlbXBfeHJwYXRoPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkJICAgY2FzZSAiICR4cnBhdGggIiBpbgorCQkgICAqIiAkdGVtcF94cnBhdGggIiopIDs7CisJCSAgICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKKwkJICAgZXNhYzs7CisJICAgICAgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRsaWJkaXIiOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkdGVtcF9kZXBsaWJzIgorCSAgZmkKKworCSAgbmV3bGliX3NlYXJjaF9wYXRoPSIkbmV3bGliX3NlYXJjaF9wYXRoICRhYnNkaXIiCisJICAjIExpbmsgYWdhaW5zdCB0aGlzIGxpYnJhcnkKKwkgIHRlc3QgIiRsaW5rX3N0YXRpYyIgPSBubyAmJiBuZXdkZXBlbmRlbmN5X2xpYnM9IiRhYnNfbGFkaXIvJGxhbmFtZSAkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgIyAuLi4gYW5kIGl0cyBkZXBlbmRlbmN5X2xpYnMKKwkgIHRtcF9saWJzPQorCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICBuZXdkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWIgJG5ld2RlcGVuZGVuY3lfbGlicyIKKwkgICAgaWYgJG9wdF9kdXBsaWNhdGVfZGVwcyA7IHRoZW4KKwkgICAgICBjYXNlICIkdG1wX2xpYnMgIiBpbgorCSAgICAgICoiICRkZXBsaWIgIiopIHNwZWNpYWxkZXBsaWJzPSIkc3BlY2lhbGRlcGxpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICAgIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIKKwkgIGRvbmUKKworCSAgaWYgdGVzdCAiJGxpbmtfYWxsX2RlcGxpYnMiICE9IG5vOyB0aGVuCisJICAgICMgQWRkIHRoZSBzZWFyY2ggcGF0aHMgb2YgYWxsIGRlcGVuZGVuY3kgbGlicmFyaWVzCisJICAgIGZvciBkZXBsaWIgaW4gJGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICAgICBjYXNlICRkZXBsaWIgaW4KKwkgICAgICAtTCopIHBhdGg9IiRkZXBsaWIiIDs7CisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfZGlybmFtZSAiJGRlcGxpYiIgIiIgIi4iCisJCWRpcj0iJGZ1bmNfZGlybmFtZV9yZXN1bHQiCisJCSMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorCQljYXNlICRkaXIgaW4KKwkJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBhYnNkaXI9IiRkaXIiIDs7CisJCSopCisJCSAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorCQkgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCisJCSAgICBmdW5jX3dhcm5pbmcgImNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIKKwkJICAgIGFic2Rpcj0iJGRpciIKKwkJICBmaQorCQkgIDs7CisJCWVzYWMKKwkJaWYgJEdSRVAgIl5pbnN0YWxsZWQ9bm8iICRkZXBsaWIgPiAvZGV2L251bGw7IHRoZW4KKwkJY2FzZSAkaG9zdCBpbgorCQkqLSotZGFyd2luKikKKwkJICBkZXBkZXBsPQorCQkgIGV2YWwgZGVwbGlicmFyeV9uYW1lcz1gJHtTRUR9IC1uIC1lICdzL15saWJyYXJ5X25hbWVzPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJICBpZiB0ZXN0IC1uICIkZGVwbGlicmFyeV9uYW1lcyIgOyB0aGVuCisJCSAgICBmb3IgdG1wIGluICRkZXBsaWJyYXJ5X25hbWVzIDsgZG8KKwkJICAgICAgZGVwZGVwbD0kdG1wCisJCSAgICBkb25lCisJCSAgICBpZiB0ZXN0IC1mICIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiIDsgdGhlbgorCQkgICAgICBkZXBkZXBsPSIkYWJzZGlyLyRvYmpkaXIvJGRlcGRlcGwiCisJCSAgICAgIGRhcndpbl9pbnN0YWxsX25hbWU9YCR7T1RPT0x9IC1MICRkZXBkZXBsIHwgYXdrICd7aWYgKE5SID09IDIpIHtwcmludCAkMTtleGl0fX0nYAorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRkYXJ3aW5faW5zdGFsbF9uYW1lIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXJ3aW5faW5zdGFsbF9uYW1lPWAke09UT09MNjR9IC1MICRkZXBkZXBsICB8IGF3ayAne2lmIChOUiA9PSAyKSB7cHJpbnQgJDE7ZXhpdH19J2AKKyAgICAgICAgICAgICAgICAgICAgICBmaQorCQkgICAgICBjb21waWxlcl9mbGFncz0iJGNvbXBpbGVyX2ZsYWdzICR7d2x9LWR5bGliX2ZpbGUgJHt3bH0ke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAtZHlsaWJfZmlsZSAke2Rhcndpbl9pbnN0YWxsX25hbWV9OiR7ZGVwZGVwbH0iCisJCSAgICAgIHBhdGg9CisJCSAgICBmaQorCQkgIGZpCisJCSAgOzsKKwkJKikKKwkJICBwYXRoPSItTCRhYnNkaXIvJG9iamRpciIKKwkJICA7OworCQllc2FjCisJCWVsc2UKKwkJICBldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkZGVwbGliYAorCQkgIHRlc3QgLXogIiRsaWJkaXIiICYmIFwKKwkJICAgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQkgIHRlc3QgIiRhYnNkaXIiICE9ICIkbGliZGlyIiAmJiBcCisJCSAgICBmdW5jX3dhcm5pbmcgIlxgJGRlcGxpYicgc2VlbXMgdG8gYmUgbW92ZWQiCisKKwkJICBwYXRoPSItTCRhYnNkaXIiCisJCWZpCisJCTs7CisJICAgICAgZXNhYworCSAgICAgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAgICAgKiIgJHBhdGggIiopIDs7CisJICAgICAgKikgZGVwbGlicz0iJHBhdGggJGRlcGxpYnMiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaSAjIGxpbmtfYWxsX2RlcGxpYnMgIT0gbm8KKwlmaSAjIGxpbmttb2RlID0gbGliCisgICAgICBkb25lICMgZm9yIGRlcGxpYiBpbiAkbGlicworICAgICAgaWYgdGVzdCAiJHBhc3MiID0gbGluazsgdGhlbgorCWlmIHRlc3QgIiRsaW5rbW9kZSIgPSAicHJvZyI7IHRoZW4KKwkgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzICRjb21waWxlX2RlcGxpYnMiCisJICBmaW5hbGl6ZV9kZXBsaWJzPSIkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MgJGZpbmFsaXplX2RlcGxpYnMiCisJZWxzZQorCSAgY29tcGlsZXJfZmxhZ3M9IiRjb21waWxlcl9mbGFncyAiYCRFQ0hPICJYICRuZXdfaW5oZXJpdGVkX2xpbmtlcl9mbGFncyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwlmaQorICAgICAgZmkKKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJG5ld2RlcGVuZGVuY3lfbGlicyIKKyAgICAgIGlmIHRlc3QgIiRwYXNzIiA9IGRscHJlb3BlbjsgdGhlbgorCSMgTGluayB0aGUgZGxwcmVvcGVuZWQgbGlicmFyaWVzIGJlZm9yZSBvdGhlciBsaWJyYXJpZXMKKwlmb3IgZGVwbGliIGluICRzYXZlX2RlcGxpYnM7IGRvCisJICBkZXBsaWJzPSIkZGVwbGliICRkZXBsaWJzIgorCWRvbmUKKyAgICAgIGZpCisgICAgICBpZiB0ZXN0ICIkcGFzcyIgIT0gZGxvcGVuOyB0aGVuCisJaWYgdGVzdCAiJHBhc3MiICE9IGNvbnY7IHRoZW4KKwkgICMgTWFrZSBzdXJlIGxpYl9zZWFyY2hfcGF0aCBjb250YWlucyBvbmx5IHVuaXF1ZSBkaXJlY3Rvcmllcy4KKwkgIGxpYl9zZWFyY2hfcGF0aD0KKwkgIGZvciBkaXIgaW4gJG5ld2xpYl9zZWFyY2hfcGF0aDsgZG8KKwkgICAgY2FzZSAiJGxpYl9zZWFyY2hfcGF0aCAiIGluCisJICAgICoiICRkaXIgIiopIDs7CisJICAgICopIGxpYl9zZWFyY2hfcGF0aD0iJGxpYl9zZWFyY2hfcGF0aCAkZGlyIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBuZXdsaWJfc2VhcmNoX3BhdGg9CisJZmkKKworCWlmIHRlc3QgIiRsaW5rbW9kZSwkcGFzcyIgIT0gInByb2csbGluayI7IHRoZW4KKwkgIHZhcnM9ImRlcGxpYnMiCisJZWxzZQorCSAgdmFycz0iY29tcGlsZV9kZXBsaWJzIGZpbmFsaXplX2RlcGxpYnMiCisJZmkKKwlmb3IgdmFyIGluICR2YXJzIGRlcGVuZGVuY3lfbGliczsgZG8KKwkgICMgQWRkIGxpYnJhcmllcyB0byAkdmFyIGluIHJldmVyc2Ugb3JkZXIKKwkgIGV2YWwgdG1wX2xpYnM9XCJcJCR2YXJcIgorCSAgbmV3X2xpYnM9CisJICBmb3IgZGVwbGliIGluICR0bXBfbGliczsgZG8KKwkgICAgIyBGSVhNRTogUGVkYW50aWNhbGx5LCB0aGlzIGlzIHRoZSByaWdodCB0aGluZyB0byBkbywgc28KKwkgICAgIyAgICAgICAgdGhhdCBzb21lIG5hc3R5IGRlcGVuZGVuY3kgbG9vcCBpc24ndCBhY2NpZGVudGFsbHkKKwkgICAgIyAgICAgICAgYnJva2VuOgorCSAgICAjbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIgorCSAgICAjIFByYWdtYXRpY2FsbHksIHRoaXMgc2VlbXMgdG8gY2F1c2UgdmVyeSBmZXcgcHJvYmxlbXMgaW4KKwkgICAgIyBwcmFjdGljZToKKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAtUiopIDs7CisJICAgICopCisJICAgICAgIyBBbmQgaGVyZSBpcyB0aGUgcmVhc29uOiB3aGVuIGEgbGlicmFyeSBhcHBlYXJzIG1vcmUKKwkgICAgICAjIHRoYW4gb25jZSBhcyBhbiBleHBsaWNpdCBkZXBlbmRlbmNlIG9mIGEgbGlicmFyeSwgb3IKKwkgICAgICAjIGlzIGltcGxpY2l0bHkgbGlua2VkIGluIG1vcmUgdGhhbiBvbmNlIGJ5IHRoZQorCSAgICAgICMgY29tcGlsZXIsIGl0IGlzIGNvbnNpZGVyZWQgc3BlY2lhbCwgYW5kIG11bHRpcGxlCisJICAgICAgIyBvY2N1cnJlbmNlcyB0aGVyZW9mIGFyZSBub3QgcmVtb3ZlZC4gIENvbXBhcmUgdGhpcworCSAgICAgICMgd2l0aCBoYXZpbmcgdGhlIHNhbWUgbGlicmFyeSBiZWluZyBsaXN0ZWQgYXMgYQorCSAgICAgICMgZGVwZW5kZW5jeSBvZiBtdWx0aXBsZSBvdGhlciBsaWJyYXJpZXM6IGluIHRoaXMgY2FzZSwKKwkgICAgICAjIHdlIGtub3cgKHBlZGFudGljYWxseSwgd2UgYXNzdW1lKSB0aGUgbGlicmFyeSBkb2VzIG5vdAorCSAgICAgICMgbmVlZCB0byBiZSBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIHdlIGtlZXAgb25seSB0aGUKKwkgICAgICAjIGxhc3QgY29weS4gIFRoaXMgaXMgbm90IGFsd2F5cyByaWdodCwgYnV0IGl0IGlzIHJhcmUKKwkgICAgICAjIGVub3VnaCB0aGF0IHdlIHJlcXVpcmUgdXNlcnMgdGhhdCByZWFsbHkgbWVhbiB0byBwbGF5CisJICAgICAgIyBzdWNoIHVucG9ydGFibGUgbGlua2luZyB0cmlja3MgdG8gbGluayB0aGUgbGlicmFyeQorCSAgICAgICMgdXNpbmcgLVdsLC1sbmFtZSwgc28gdGhhdCBsaWJ0b29sIGRvZXMgbm90IGNvbnNpZGVyIGl0CisJICAgICAgIyBmb3IgZHVwbGljYXRlIHJlbW92YWwuCisJICAgICAgY2FzZSAiICRzcGVjaWFsZGVwbGlicyAiIGluCisJICAgICAgKiIgJGRlcGxpYiAiKikgbmV3X2xpYnM9IiRkZXBsaWIgJG5ld19saWJzIiA7OworCSAgICAgICopCisJCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCQkqIiAkZGVwbGliICIqKSA7OworCQkqKSBuZXdfbGlicz0iJGRlcGxpYiAkbmV3X2xpYnMiIDs7CisJCWVzYWMKKwkJOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZQorCSAgdG1wX2xpYnM9CisJICBmb3IgZGVwbGliIGluICRuZXdfbGliczsgZG8KKwkgICAgY2FzZSAkZGVwbGliIGluCisJICAgIC1MKikKKwkgICAgICBjYXNlICIgJHRtcF9saWJzICIgaW4KKwkgICAgICAqIiAkZGVwbGliICIqKSA7OworCSAgICAgICopIHRtcF9saWJzPSIkdG1wX2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgICAgOzsKKwkgICAgKikgdG1wX2xpYnM9IiR0bXBfbGlicyAkZGVwbGliIiA7OworCSAgICBlc2FjCisJICBkb25lCisJICBldmFsICR2YXI9XCIkdG1wX2xpYnNcIgorCWRvbmUgIyBmb3IgdmFyCisgICAgICBmaQorICAgICAgIyBMYXN0IHN0ZXA6IHJlbW92ZSBydW50aW1lIGxpYnMgZnJvbSBkZXBlbmRlbmN5X2xpYnMKKyAgICAgICMgKHRoZXkgc3RheSBpbiBkZXBsaWJzKQorICAgICAgdG1wX2xpYnM9CisgICAgICBmb3IgaSBpbiAkZGVwZW5kZW5jeV9saWJzIDsgZG8KKwljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICRjb21waWxlcl9saWJfc2VhcmNoX3BhdGggIiBpbgorCSoiICRpICIqKQorCSAgaT0iIgorCSAgOzsKKwllc2FjCisJaWYgdGVzdCAtbiAiJGkiIDsgdGhlbgorCSAgdG1wX2xpYnM9IiR0bXBfbGlicyAkaSIKKwlmaQorICAgICAgZG9uZQorICAgICAgZGVwZW5kZW5jeV9saWJzPSR0bXBfbGlicworICAgIGRvbmUgIyBmb3IgcGFzcworICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nOyB0aGVuCisgICAgICBkbGZpbGVzPSIkbmV3ZGxmaWxlcyIKKyAgICBmaQorICAgIGlmIHRlc3QgIiRsaW5rbW9kZSIgPSBwcm9nIHx8IHRlc3QgIiRsaW5rbW9kZSIgPSBsaWI7IHRoZW4KKyAgICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorICAgIGZpCisKKyAgICBjYXNlICRsaW5rbW9kZSBpbgorICAgIG9sZGxpYikKKyAgICAgIGlmIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiIHx8IHRlc3QgIiRkbHNlbGYiICE9IG5vOyB0aGVuCisJZnVuY193YXJuaW5nICJcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgOzsKKyAgICAgIGVzYWMKKworICAgICAgdGVzdCAtbiAiJHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiR4cnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICB0ZXN0IC1uICIkcmVsZWFzZSIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiCisKKyAgICAgIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZXhwb3J0LXN5bWJvbHMnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIgorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgb2xkbGlicz0iJG91dHB1dCIKKyAgICAgIG9ianM9IiRvYmpzJG9sZF9kZXBsaWJzIgorICAgICAgOzsKKworICAgIGxpYikKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgJG91dHB1dG5hbWUgaW4KKyAgICAgIGxpYiopCisJZnVuY19zdHJpcG5hbWUgJ2xpYicgJy5sYScgIiRvdXRwdXRuYW1lIgorCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCWV2YWwgc2hhcmVkX2V4dD1cIiRzaHJleHRfY21kc1wiCisJZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJOzsKKyAgICAgICopCisJdGVzdCAiJG1vZHVsZSIgPSBubyAmJiBcCisJICBmdW5jX2ZhdGFsX2hlbHAgImxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciCisKKwlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgorCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICBldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCSAgZXZhbCBsaWJuYW1lPVwiJGxpYm5hbWVfc3BlY1wiCisJZWxzZQorCSAgZnVuY19zdHJpcG5hbWUgJycgJy5sYScgIiRvdXRwdXRuYW1lIgorCSAgbGlibmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJZmkKKwk7OworICAgICAgZXNhYworCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKwlpZiB0ZXN0ICIkZGVwbGlic19jaGVja19tZXRob2QiICE9IHBhc3NfYWxsOyB0aGVuCisJICBmdW5jX2ZhdGFsX2Vycm9yICJjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIG9uIHRoaXMgaG9zdDokb2JqcyIKKwllbHNlCisJICAkRUNITworCSAgJEVDSE8gIioqKiBXYXJuaW5nOiBMaW5raW5nIHRoZSBzaGFyZWQgbGlicmFyeSAkb3V0cHV0IGFnYWluc3QgdGhlIG5vbi1saWJ0b29sIgorCSAgJEVDSE8gIioqKiBvYmplY3RzICRvYmpzIGlzIG5vdCBwb3J0YWJsZSEiCisJICBsaWJvYmpzPSIkbGlib2JqcyAkb2JqcyIKKwlmaQorICAgICAgZmkKKworICAgICAgdGVzdCAiJGRsc2VsZiIgIT0gbm8gJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuIHNlbGYnIGlzIGlnbm9yZWQgZm9yIGxpYnRvb2wgbGlicmFyaWVzIgorCisgICAgICBzZXQgZHVtbXkgJHJwYXRoCisgICAgICBzaGlmdAorICAgICAgdGVzdCAiJCMiIC1ndCAxICYmIFwKKwlmdW5jX3dhcm5pbmcgImlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IgorCisgICAgICBpbnN0YWxsX2xpYmRpcj0iJDEiCisKKyAgICAgIG9sZGxpYnM9CisgICAgICBpZiB0ZXN0IC16ICIkcnBhdGgiOyB0aGVuCisJaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKwkgICMgQnVpbGRpbmcgYSBsaWJ0b29sIGNvbnZlbmllbmNlIGxpYnJhcnkuCisJICAjIFNvbWUgY29tcGlsZXJzIGhhdmUgcHJvYmxlbXMgd2l0aCBhIGAuYWwnIGV4dGVuc2lvbiBzbworCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZXh0ZW5zaW9uIGFuCisJICAjIGFyY2hpdmUgbm9ybWFsbHkgd291bGQuCisJICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0ICRvbGRsaWJzIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPWNvbnZlbmllbmNlCisJICBidWlsZF9vbGRfbGlicz15ZXMKKwlmaQorCisJdGVzdCAtbiAiJHZpbmZvIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mby8tdmVyc2lvbi1udW1iZXInIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKworCXRlc3QgLW4gIiRyZWxlYXNlIiAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIGNvbnZlbmllbmNlIGxpYnJhcmllcyIKKyAgICAgIGVsc2UKKworCSMgUGFyc2UgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gYXJndW1lbnQuCisJc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzonCisJc2V0IGR1bW15ICR2aW5mbyAwIDAgMAorCXNoaWZ0CisJSUZTPSIkc2F2ZV9pZnMiCisKKwl0ZXN0IC1uICIkNyIgJiYgXAorCSAgZnVuY19mYXRhbF9oZWxwICJ0b28gbWFueSBwYXJhbWV0ZXJzIHRvIFxgLXZlcnNpb24taW5mbyciCisKKwkjIGNvbnZlcnQgYWJzb2x1dGUgdmVyc2lvbiBudW1iZXJzIHRvIGxpYnRvb2wgYWdlcworCSMgdGhpcyByZXRhaW5zIGNvbXBhdGliaWxpdHkgd2l0aCAubGEgZmlsZXMgYW5kIGF0dGVtcHRzCisJIyB0byBtYWtlIHRoZSBjb2RlIGJlbG93IGEgYml0IG1vcmUgY29tcHJlaGVuc2libGUKKworCWNhc2UgJHZpbmZvX251bWJlciBpbgorCXllcykKKwkgIG51bWJlcl9tYWpvcj0iJDEiCisJICBudW1iZXJfbWlub3I9IiQyIgorCSAgbnVtYmVyX3JldmlzaW9uPSIkMyIKKwkgICMKKwkgICMgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBraW5kcyAtLSB0aG9zZSB0aGF0CisJICAjIHVzZSB0aGUgY3VycmVudCByZXZpc2lvbiBhcyB0aGUgbWFqb3IgdmVyc2lvbgorCSAgIyBhbmQgdGhvc2UgdGhhdCBzdWJ0cmFjdCBhZ2UgYW5kIHVzZSBhZ2UgYXMKKwkgICMgYSBtaW5vciB2ZXJzaW9uLiAgQnV0LCB0aGVuIHRoZXJlIGlzIGlyaXgKKwkgICMgd2hpY2ggaGFzIGFuIGV4dHJhIDEgYWRkZWQganVzdCBmb3IgZnVuCisJICAjCisJICBjYXNlICR2ZXJzaW9uX3R5cGUgaW4KKwkgIGRhcndpbnxsaW51eHxvc2Z8d2luZG93c3xub25lKQorCSAgICBmdW5jX2FyaXRoICRudW1iZXJfbWFqb3IgKyAkbnVtYmVyX21pbm9yCisJICAgIGN1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGFnZT0iJG51bWJlcl9taW5vciIKKwkgICAgcmV2aXNpb249IiRudW1iZXJfcmV2aXNpb24iCisJICAgIDs7CisJICBmcmVlYnNkLWFvdXR8ZnJlZWJzZC1lbGZ8c3Vub3MpCisJICAgIGN1cnJlbnQ9IiRudW1iZXJfbWFqb3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBhZ2U9IjAiCisJICAgIDs7CisJICBpcml4fG5vbnN0b3B1eCkKKwkgICAgZnVuY19hcml0aCAkbnVtYmVyX21ham9yICsgJG51bWJlcl9taW5vcgorCSAgICBjdXJyZW50PSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBhZ2U9IiRudW1iZXJfbWlub3IiCisJICAgIHJldmlzaW9uPSIkbnVtYmVyX21pbm9yIgorCSAgICBsdF9pcml4X2luY3JlbWVudD1ubworCSAgICA7OworCSAgZXNhYworCSAgOzsKKwlubykKKwkgIGN1cnJlbnQ9IiQxIgorCSAgcmV2aXNpb249IiQyIgorCSAgYWdlPSIkMyIKKwkgIDs7CisJZXNhYworCisJIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKwljYXNlICRjdXJyZW50IGluCisJMHxbMS05XXxbMS05XVswLTldfFsxLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XXxbMS05XVswLTldWzAtOV1bMC05XVswLTldKSA7OworCSopCisJICBmdW5jX2Vycm9yICJDVVJSRU5UIFxgJGN1cnJlbnQnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRyZXZpc2lvbiBpbgorCTB8WzEtOV18WzEtOV1bMC05XXxbMS05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV18WzEtOV1bMC05XVswLTldWzAtOV1bMC05XSkgOzsKKwkqKQorCSAgZnVuY19lcnJvciAiUkVWSVNJT04gXGAkcmV2aXNpb24nIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwljYXNlICRhZ2UgaW4KKwkwfFsxLTldfFsxLTldWzAtOV18WzEtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldfFsxLTldWzAtOV1bMC05XVswLTldWzAtOV0pIDs7CisJKikKKwkgIGZ1bmNfZXJyb3IgIkFHRSBcYCRhZ2UnIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIgorCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIgorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkYWdlIiAtZ3QgIiRjdXJyZW50IjsgdGhlbgorCSAgZnVuY19lcnJvciAiQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciCisJICBmdW5jX2ZhdGFsX2Vycm9yICJcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iCisJZmkKKworCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KKwltYWpvcj0KKwl2ZXJzdWZmaXg9CisJdmVyc3RyaW5nPQorCWNhc2UgJHZlcnNpb25fdHlwZSBpbgorCW5vbmUpIDs7CisKKwlkYXJ3aW4pCisJICAjIExpa2UgTGludXgsIGJ1dCB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gYXZhaWxhYmxlIGluCisJICAjIHZlcnN0cmluZyBmb3IgY29kaW5nIGl0IGludG8gdGhlIGxpYnJhcnkgaGVhZGVyCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICAjIERhcndpbiBsZCBkb2Vzbid0IGxpa2UgMCBmb3IgdGhlc2Ugb3B0aW9ucy4uLgorCSAgZnVuY19hcml0aCAkY3VycmVudCArIDEKKwkgIG1pbm9yX2N1cnJlbnQ9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB4bGN2ZXJzdHJpbmc9IiR7d2x9LWNvbXBhdGliaWxpdHlfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50ICR7d2x9LWN1cnJlbnRfdmVyc2lvbiAke3dsfSRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIHZlcnN0cmluZz0iLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkbWlub3JfY3VycmVudCAtY3VycmVudF92ZXJzaW9uICRtaW5vcl9jdXJyZW50LiRyZXZpc2lvbiIKKwkgIDs7CisKKwlmcmVlYnNkLWFvdXQpCisJICBtYWpvcj0iLiRjdXJyZW50IgorCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKKwkgIDs7CisKKwlmcmVlYnNkLWVsZikKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlpcml4IHwgbm9uc3RvcHV4KQorCSAgaWYgdGVzdCAiWCRsdF9pcml4X2luY3JlbWVudCIgPSAiWG5vIjsgdGhlbgorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgZWxzZQorCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZSArIDEKKwkgIGZpCisJICBtYWpvcj0kZnVuY19hcml0aF9yZXN1bHQKKworCSAgY2FzZSAkdmVyc2lvbl90eXBlIGluCisJICAgIG5vbnN0b3B1eCkgdmVyc3RyaW5nX3ByZWZpeD1ub25zdG9wdXggOzsKKwkgICAgKikgICAgICAgICB2ZXJzdHJpbmdfcHJlZml4PXNnaSA7OworCSAgZXNhYworCSAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nX3ByZWZpeCRtYWpvci4kcmV2aXNpb24iCisKKwkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisJICBsb29wPSRyZXZpc2lvbgorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRyZXZpc2lvbiAtICRsb29wCisJICAgIGlmYWNlPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICBmdW5jX2FyaXRoICRsb29wIC0gMQorCSAgICBsb29wPSRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmdfcHJlZml4JG1ham9yLiRpZmFjZTokdmVyc3RyaW5nIgorCSAgZG9uZQorCisJICAjIEJlZm9yZSB0aGlzIHBvaW50LCAkbWFqb3IgbXVzdCBub3QgY29udGFpbiBgLicuCisJICBtYWpvcj0uJG1ham9yCisJICB2ZXJzdWZmaXg9IiRtYWpvci4kcmV2aXNpb24iCisJICA7OworCisJbGludXgpCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9LiRmdW5jX2FyaXRoX3Jlc3VsdAorCSAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisJICA7OworCisJb3NmKQorCSAgZnVuY19hcml0aCAkY3VycmVudCAtICRhZ2UKKwkgIG1ham9yPS4kZnVuY19hcml0aF9yZXN1bHQKKwkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRhZ2UuJHJldmlzaW9uIgorCSAgdmVyc3RyaW5nPSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKworCSAgIyBBZGQgaW4gYWxsIHRoZSBpbnRlcmZhY2VzIHRoYXQgd2UgYXJlIGNvbXBhdGlibGUgd2l0aC4KKwkgIGxvb3A9JGFnZQorCSAgd2hpbGUgdGVzdCAiJGxvb3AiIC1uZSAwOyBkbworCSAgICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGxvb3AKKwkgICAgaWZhY2U9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXJpdGggJGxvb3AgLSAxCisJICAgIGxvb3A9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgorCSAgZG9uZQorCisJICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCisJICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgorCSAgOzsKKworCXFueCkKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudCIKKwkgIDs7CisKKwlzdW5vcykKKwkgIG1ham9yPSIuJGN1cnJlbnQiCisJICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kcmV2aXNpb24iCisJICA7OworCisJd2luZG93cykKKwkgICMgVXNlICctJyByYXRoZXIgdGhhbiAnLicsIHNpbmNlIHdlIG9ubHkgd2FudCBvbmUKKwkgICMgZXh0ZW5zaW9uIG9uIERPUyA4LjMgZmlsZXN5c3RlbXMuCisJICBmdW5jX2FyaXRoICRjdXJyZW50IC0gJGFnZQorCSAgbWFqb3I9JGZ1bmNfYXJpdGhfcmVzdWx0CisJICB2ZXJzdWZmaXg9Ii0kbWFqb3IiCisJICA7OworCisJKikKKwkgIGZ1bmNfZmF0YWxfY29uZmlndXJhdGlvbiAidW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIgorCSAgOzsKKwllc2FjCisKKwkjIENsZWFyIHRoZSB2ZXJzaW9uIGluZm8gaWYgd2UgZGVmYXVsdGVkLCBhbmQgdGhleSBzcGVjaWZpZWQgYSByZWxlYXNlLgorCWlmIHRlc3QgLXogIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisJICBtYWpvcj0KKwkgIGNhc2UgJHZlcnNpb25fdHlwZSBpbgorCSAgZGFyd2luKQorCSAgICAjIHdlIGNhbid0IGNoZWNrIGZvciAiMC4wIiBpbiBhcmNoaXZlX2NtZHMgZHVlIHRvIHF1b3RpbmcKKwkgICAgIyBwcm9ibGVtcywgc28gd2UgcmVzZXQgaXQgY29tcGxldGVseQorCSAgICB2ZXJzdHJpbmc9CisJICAgIDs7CisJICAqKQorCSAgICB2ZXJzdHJpbmc9IjAuMCIKKwkgICAgOzsKKwkgIGVzYWMKKwkgIGlmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KKwkgICAgdmVyc3VmZml4PQorCSAgZWxzZQorCSAgICB2ZXJzdWZmaXg9Ii4wLjAiCisJICBmaQorCWZpCisKKwkjIFJlbW92ZSB2ZXJzaW9uIGluZm8gZnJvbSBuYW1lIGlmIHZlcnNpb25pbmcgc2hvdWxkIGJlIGF2b2lkZWQKKwlpZiB0ZXN0ICIkYXZvaWRfdmVyc2lvbiIgPSB5ZXMgJiYgdGVzdCAiJG5lZWRfdmVyc2lvbiIgPSBubzsgdGhlbgorCSAgbWFqb3I9CisJICB2ZXJzdWZmaXg9CisJICB2ZXJzdHJpbmc9IiIKKwlmaQorCisJIyBDaGVjayB0byBzZWUgaWYgdGhlIGFyY2hpdmUgd2lsbCBoYXZlIHVuZGVmaW5lZCBzeW1ib2xzLgorCWlmIHRlc3QgIiRhbGxvd191bmRlZmluZWQiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKwkgICAgZnVuY193YXJuaW5nICJ1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIgorCSAgICBidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisJICBmaQorCWVsc2UKKwkgICMgRG9uJ3QgYWxsb3cgdW5kZWZpbmVkIHN5bWJvbHMuCisJICBhbGxvd191bmRlZmluZWRfZmxhZz0iJG5vX3VuZGVmaW5lZF9mbGFnIgorCWZpCisKKyAgICAgIGZpCisKKyAgICAgIGZ1bmNfZ2VuZXJhdGVfZGxzeW1zICIkbGlibmFtZSIgIiRsaWJuYW1lIiAieWVzIgorICAgICAgbGlib2Jqcz0iJGxpYm9ianMgJHN5bWZpbGVvYmoiCisgICAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCisgICAgICBpZiB0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rOyB0aGVuCisJIyBSZW1vdmUgb3VyIG91dHB1dHMsIGJ1dCBkb24ndCByZW1vdmUgb2JqZWN0IGZpbGVzIHNpbmNlIHRoZXkKKwkjIG1heSBoYXZlIGJlZW4gY3JlYXRlZCB3aGVuIGNvbXBpbGluZyBQSUMgb2JqZWN0cy4KKwlyZW1vdmVsaXN0PQorCXRlbXByZW1vdmVsaXN0PWAkRUNITyAiJG91dHB1dF9vYmpkaXIvKiJgCisJZm9yIHAgaW4gJHRlbXByZW1vdmVsaXN0OyBkbworCSAgY2FzZSAkcCBpbgorCSAgICAqLiRvYmpleHQgfCAqLmdjbm8pCisJICAgICAgIDs7CisJICAgICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lIHwgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuKiB8ICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LiopCisJICAgICAgIGlmIHRlc3QgIlgkcHJlY2lvdXNfZmlsZXNfcmVnZXgiICE9ICJYIjsgdGhlbgorCQkgaWYgJEVDSE8gIiRwIiB8ICRFR1JFUCAtZSAiJHByZWNpb3VzX2ZpbGVzX3JlZ2V4IiA+L2Rldi9udWxsIDI+JjEKKwkJIHRoZW4KKwkJICAgY29udGludWUKKwkJIGZpCisJICAgICAgIGZpCisJICAgICAgIHJlbW92ZWxpc3Q9IiRyZW1vdmVsaXN0ICRwIgorCSAgICAgICA7OworCSAgICAqKSA7OworCSAgZXNhYworCWRvbmUKKwl0ZXN0IC1uICIkcmVtb3ZlbGlzdCIgJiYgXAorCSAgZnVuY19zaG93X2V2YWwgIiR7Uk19ciBcJHJlbW92ZWxpc3QiCisgICAgICBmaQorCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0gY29udmVuaWVuY2UgOyB0aGVuCisJb2xkbGlicz0iJG9sZGxpYnMgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCIKKworCSMgVHJhbnNmb3JtIC5sbyBmaWxlcyB0byAubyBmaWxlcy4KKwlvbGRvYmpzPSIkb2JqcyAiYCRFQ0hPICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0nJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgIyBFbGltaW5hdGUgYWxsIHRlbXBvcmFyeSBkaXJlY3Rvcmllcy4KKyAgICAgICNmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworICAgICAgIwlsaWJfc2VhcmNoX3BhdGg9YCRFQ0hPICJYJGxpYl9zZWFyY2hfcGF0aCAiIHwgJFhzZWQgLWUgInMlICRwYXRoICUgJWciYAorICAgICAgIwlkZXBsaWJzPWAkRUNITyAiWCRkZXBsaWJzICIgfCAkWHNlZCAtZSAicyUgLUwkcGF0aCAlICVnImAKKyAgICAgICMJZGVwZW5kZW5jeV9saWJzPWAkRUNITyAiWCRkZXBlbmRlbmN5X2xpYnMgIiB8ICRYc2VkIC1lICJzJSAtTCRwYXRoICUgJWciYAorICAgICAgI2RvbmUKKworICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KKwkjIElmIHRoZSB1c2VyIHNwZWNpZmllZCBhbnkgcnBhdGggZmxhZ3MsIHRoZW4gYWRkIHRoZW0uCisJdGVtcF94cnBhdGg9CisJZm9yIGxpYmRpciBpbiAkeHJwYXRoOyBkbworCSAgdGVtcF94cnBhdGg9IiR0ZW1wX3hycGF0aCAtUiRsaWJkaXIiCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisJaWYgdGVzdCAiJGhhcmRjb2RlX2ludG9fbGlicyIgIT0geWVzIHx8IHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KKwkgIGRlcGVuZGVuY3lfbGlicz0iJHRlbXBfeHJwYXRoICRkZXBlbmRlbmN5X2xpYnMiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgTWFrZSBzdXJlIGRsZmlsZXMgY29udGFpbnMgb25seSB1bmlxdWUgZmlsZXMgdGhhdCB3b24ndCBiZSBkbHByZW9wZW5lZAorICAgICAgb2xkX2RsZmlsZXM9IiRkbGZpbGVzIgorICAgICAgZGxmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbGZpbGVzOyBkbworCWNhc2UgIiAkZGxwcmVmaWxlcyAkZGxmaWxlcyAiIGluCisJKiIgJGxpYiAiKikgOzsKKwkqKSBkbGZpbGVzPSIkZGxmaWxlcyAkbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKworICAgICAgIyBNYWtlIHN1cmUgZGxwcmVmaWxlcyBjb250YWlucyBvbmx5IHVuaXF1ZSBmaWxlcworICAgICAgb2xkX2RscHJlZmlsZXM9IiRkbHByZWZpbGVzIgorICAgICAgZGxwcmVmaWxlcz0KKyAgICAgIGZvciBsaWIgaW4gJG9sZF9kbHByZWZpbGVzOyBkbworCWNhc2UgIiRkbHByZWZpbGVzICIgaW4KKwkqIiAkbGliICIqKSA7OworCSopIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICRsaWIiIDs7CisJZXNhYworICAgICAgZG9uZQorCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KKwkgIGNhc2UgJGhvc3QgaW4KKwkgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1wdzMyKiB8ICotKi1vczIqIHwgKi0qLWJlb3MqIHwgKi1jZWdjYyopCisJICAgICMgdGhlc2Ugc3lzdGVtcyBkb24ndCBhY3R1YWxseSBoYXZlIGEgYyBsaWJyYXJ5IChhcyBzdWNoKSEKKwkgICAgOzsKKwkgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkgICAgIyBSaGFwc29keSBDIGxpYnJhcnkgaXMgaW4gdGhlIFN5c3RlbSBmcmFtZXdvcmsKKwkgICAgZGVwbGlicz0iJGRlcGxpYnMgU3lzdGVtLmx0ZnJhbWV3b3JrIgorCSAgICA7OworCSAgKi0qLW5ldGJzZCopCisJICAgICMgRG9uJ3QgbGluayB3aXRoIGxpYmMgdW50aWwgdGhlIGEub3V0IGxkLnNvIGlzIGZpeGVkLgorCSAgICA7OworCSAgKi0qLW9wZW5ic2QqIHwgKi0qLWZyZWVic2QqIHwgKi0qLWRyYWdvbmZseSopCisJICAgICMgRG8gbm90IGluY2x1ZGUgbGliYyBkdWUgdG8gdXMgaGF2aW5nIGxpYmMvbGliY19yLgorCSAgICA7OworCSAgKi0qLXNjbzMuMnY1KiB8ICotKi1zY281djYqKQorCSAgICAjIENhdXNlcyBwcm9ibGVtcyB3aXRoIF9fY3R5cGUKKwkgICAgOzsKKwkgICotKi1zeXN2NC4ydXcyKiB8ICotKi1zeXN2NSogfCAqLSotdW5peHdhcmUqIHwgKi0qLU9wZW5VTklYKikKKwkgICAgIyBDb21waWxlciBpbnNlcnRzIGxpYmMgaW4gdGhlIGNvcnJlY3QgcGxhY2UgZm9yIHRocmVhZHMgdG8gd29yaworCSAgICA7OworCSAgKikKKwkgICAgIyBBZGQgbGliYyB0byBkZXBsaWJzIG9uIGFsbCBvdGhlciBzeXN0ZW1zIGlmIG5lY2Vzc2FyeS4KKwkgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbmVlZF9sYyIgPSAieWVzIjsgdGhlbgorCSAgICAgIGRlcGxpYnM9IiRkZXBsaWJzIC1sYyIKKwkgICAgZmkKKwkgICAgOzsKKwkgIGVzYWMKKwlmaQorCisJIyBUcmFuc2Zvcm0gZGVwbGlicyBpbnRvIG9ubHkgZGVwbGlicyB0aGF0IGNhbiBiZSBsaW5rZWQgaW4gc2hhcmVkLgorCW5hbWVfc2F2ZT0kbmFtZQorCWxpYm5hbWVfc2F2ZT0kbGlibmFtZQorCXJlbGVhc2Vfc2F2ZT0kcmVsZWFzZQorCXZlcnN1ZmZpeF9zYXZlPSR2ZXJzdWZmaXgKKwltYWpvcl9zYXZlPSRtYWpvcgorCSMgSSdtIG5vdCBzdXJlIGlmIEknbSB0cmVhdGluZyB0aGUgcmVsZWFzZSBjb3JyZWN0bHkuICBJIHRoaW5rCisJIyByZWxlYXNlIHNob3VsZCBzaG93IHVwIGluIHRoZSAtbCAoaWUgLWxnbXA1KSBzbyB3ZSBkb24ndCB3YW50IHRvCisJIyBhZGQgaXQgaW4gdHdpY2UuICBJcyB0aGF0IGNvcnJlY3Q/CisJcmVsZWFzZT0iIgorCXZlcnN1ZmZpeD0iIgorCW1ham9yPSIiCisJbmV3ZGVwbGlicz0KKwlkcm9wcGVkZGVwcz1ubworCWNhc2UgJGRlcGxpYnNfY2hlY2tfbWV0aG9kIGluCisJcGFzc19hbGwpCisJICAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KKwkgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKKwkgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KKwkgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAorCSAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3IuCisJICBuZXdkZXBsaWJzPSRkZXBsaWJzCisJICA7OworCXRlc3RfY29tcGlsZSkKKwkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCisJICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAorCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKKwkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdC5jCisJICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCisJICBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KK0VPRgorCSAgJG9wdF9kcnlfcnVuIHx8ICRSTSBjb25mdGVzdAorCSAgaWYgJExUQ0MgJExUQ0ZMQUdTIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnM7IHRoZW4KKwkgICAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQlpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJCSAgY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSAgKiIgJGkgIiopCisJCSAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkaSIKKwkJICAgIGk9IiIKKwkJICAgIDs7CisJCSAgZXNhYworCQlmaQorCQlpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgbGlibmFtZT1gZXZhbCAiXFwkRUNITyBcIiRsaWJuYW1lX3NwZWNcIiJgCisJCSAgZGVwbGliX21hdGNoZXM9YGV2YWwgIlxcJEVDSE8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCIiYAorCQkgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgZGVwbGliX21hdGNoPSQxCisJCSAgaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgorCQkgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgZWxzZQorCQkgICAgZHJvcHBlZGRlcHM9eWVzCisJCSAgICAkRUNITworCQkgICAgJEVDSE8gIioqKiBXYXJuaW5nOiBkeW5hbWljIGxpbmtlciBkb2VzIG5vdCBhY2NlcHQgbmVlZGVkIGxpYnJhcnkgJGkuIgorCQkgICAgJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICRFQ0hPICIqKiogc2hhcmVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIHdoaWNoIEkgYmVsaWV2ZSB5b3UgZG8gbm90IGhhdmUiCisJCSAgICAkRUNITyAiKioqIGJlY2F1c2UgYSB0ZXN0X2NvbXBpbGUgZGlkIHJldmVhbCB0aGF0IHRoZSBsaW5rZXIgZGlkIG5vdCB1c2UgaXQgZm9yIgorCQkgICAgJEVDSE8gIioqKiBpdHMgZHluYW1pYyBkZXBlbmRlbmN5IGxpc3QgdGhhdCBwcm9ncmFtcyBnZXQgcmVzb2x2ZWQgd2l0aCBhdCBydW50aW1lLiIKKwkJICBmaQorCQlmaQorCQk7OworCSAgICAgICopCisJCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQk7OworCSAgICAgIGVzYWMKKwkgICAgZG9uZQorCSAgZWxzZQorCSAgICAjIEVycm9yIG9jY3VycmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UKKwkgICAgIyB0aGUgc2l0dWF0aW9uOiBDb21waWxlIGEgc2VwYXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgorCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KKwkgICAgICBjYXNlICRpIGluCisJICAgICAgLWwqKQorCQlmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGkiCisJCW5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCQkkb3B0X2RyeV9ydW4gfHwgJFJNIGNvbmZ0ZXN0CisJCWlmICRMVENDICRMVENGTEFHUyAtbyBjb25mdGVzdCBjb25mdGVzdC5jICRpOyB0aGVuCisJCSAgbGRkX291dHB1dD1gbGRkIGNvbmZ0ZXN0YAorCQkgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJICAgIGNhc2UgIiAkcHJlZGVwcyAkcG9zdGRlcHMgIiBpbgorCQkgICAgKiIgJGkgIiopCisJCSAgICAgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgorCQkgICAgICBpPSIiCisJCSAgICAgIDs7CisJCSAgICBlc2FjCisJCSAgZmkKKwkJICBpZiB0ZXN0IC1uICIkaSIgOyB0aGVuCisJCSAgICBsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsICJcXCRFQ0hPIFwiJGxpYnJhcnlfbmFtZXNfc3BlY1wiImAKKwkJICAgIHNldCBkdW1teSAkZGVwbGliX21hdGNoZXM7IHNoaWZ0CisJCSAgICBkZXBsaWJfbWF0Y2g9JDEKKwkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCSAgICBlbHNlCisJCSAgICAgIGRyb3BwZWRkZXBzPXllcworCQkgICAgICAkRUNITworCQkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGFjY2VwdCBuZWVkZWQgbGlicmFyeSAkaS4iCisJCSAgICAgICRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkgICAgICAkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJICAgICAgJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJICAgICAgJEVDSE8gIioqKiBiZWNhdXNlIGEgdGVzdF9jb21waWxlIGRpZCByZXZlYWwgdGhhdCB0aGUgbGlua2VyIGRpZCBub3QgdXNlIHRoaXMgb25lIgorCQkgICAgICAkRUNITyAiKioqIGFzIGEgZHluYW1pYyBkZXBlbmRlbmN5IHRoYXQgcHJvZ3JhbXMgY2FuIGdldCByZXNvbHZlZCB3aXRoIGF0IHJ1bnRpbWUuIgorCQkgICAgZmkKKwkJICBmaQorCQllbHNlCisJCSAgZHJvcHBlZGRlcHM9eWVzCisJCSAgJEVDSE8KKwkJICAkRUNITyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgorCQkgICRFQ0hPICIqKiogbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCisJCSAgJEVDSE8gIioqKiBsaWJyYXJ5IHRoYXQgaXQgZGVwZW5kcyBvbiBiZWZvcmUgdGhpcyBsaWJyYXJ5IHdpbGwgYmUgZnVsbHkiCisJCSAgJEVDSE8gIioqKiBmdW5jdGlvbmFsLiAgSW5zdGFsbGluZyBpdCBiZWZvcmUgY29udGludWluZyB3b3VsZCBiZSBldmVuIGJldHRlci4iCisJCWZpCisJCTs7CisJICAgICAgKikKKwkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICBmaQorCSAgOzsKKwlmaWxlX21hZ2ljKikKKwkgIHNldCBkdW1teSAkZGVwbGlic19jaGVja19tZXRob2Q7IHNoaWZ0CisJICBmaWxlX21hZ2ljX3JlZ2V4PWBleHByICIkZGVwbGlic19jaGVja19tZXRob2QiIDogIiQxIFwoLipcKSJgCisJICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCisJICAgIGNhc2UgJGFfZGVwbGliIGluCisJICAgIC1sKikKKwkgICAgICBmdW5jX3N0cmlwbmFtZSAtbCAnJyAiJGFfZGVwbGliIgorCSAgICAgIG5hbWU9JGZ1bmNfc3RyaXBuYW1lX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIlgkYWxsb3dfbGlidG9vbF9saWJzX3dpdGhfc3RhdGljX3J1bnRpbWVzIiA9ICJYeWVzIiA7IHRoZW4KKwkJY2FzZSAiICRwcmVkZXBzICRwb3N0ZGVwcyAiIGluCisJCSoiICRhX2RlcGxpYiAiKikKKwkJICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJCSAgYV9kZXBsaWI9IiIKKwkJICA7OworCQllc2FjCisJICAgICAgZmkKKwkgICAgICBpZiB0ZXN0IC1uICIkYV9kZXBsaWIiIDsgdGhlbgorCQlsaWJuYW1lPWBldmFsICJcXCRFQ0hPIFwiJGxpYm5hbWVfc3BlY1wiImAKKwkJZm9yIGkgaW4gJGxpYl9zZWFyY2hfcGF0aCAkc3lzX2xpYl9zZWFyY2hfcGF0aCAkc2hsaWJfc2VhcmNoX3BhdGg7IGRvCisJCSAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCisJCSAgZm9yIHBvdGVudF9saWIgaW4gJHBvdGVudGlhbF9saWJzOyBkbworCQkgICAgICAjIEZvbGxvdyBzb2Z0IGxpbmtzLgorCQkgICAgICBpZiBscyAtbExkICIkcG90ZW50X2xpYiIgMj4vZGV2L251bGwgfAorCQkJICRHUkVQICIgLT4gIiA+L2Rldi9udWxsOyB0aGVuCisJCQljb250aW51ZQorCQkgICAgICBmaQorCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KKwkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgorCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCisJCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKKwkJICAgICAgIyBidXQgc28gd2hhdD8KKwkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKKwkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCisJCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8ICR7U0VEfSAncy8uKiAtPiAvLydgCisJCQljYXNlICRwb3RsaWJsaW5rIGluCisJCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIHBvdGxpYj0iJHBvdGxpYmxpbmsiOzsKKwkJCSopIHBvdGxpYj1gJEVDSE8gIlgkcG90bGliIiB8ICRYc2VkIC1lICdzLFteL10qJCwsJ2AiJHBvdGxpYmxpbmsiOzsKKwkJCWVzYWMKKwkJICAgICAgZG9uZQorCQkgICAgICBpZiBldmFsICRmaWxlX21hZ2ljX2NtZCBcIlwkcG90bGliXCIgMj4vZGV2L251bGwgfAorCQkJICRTRUQgLWUgMTBxIHwKKwkJCSAkRUdSRVAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgorCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkJYV9kZXBsaWI9IiIKKwkJCWJyZWFrIDIKKwkJICAgICAgZmkKKwkJICBkb25lCisJCWRvbmUKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWRyb3BwZWRkZXBzPXllcworCQkkRUNITworCQkkRUNITyAiKioqIFdhcm5pbmc6IGxpbmtlciBwYXRoIGRvZXMgbm90IGhhdmUgcmVhbCBmaWxlIGZvciBsaWJyYXJ5ICRhX2RlcGxpYi4iCisJCSRFQ0hPICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgorCQkkRUNITyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKKwkJJEVDSE8gIioqKiBzaGFyZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgd2hpY2ggeW91IGRvIG5vdCBhcHBlYXIgdG8gaGF2ZSIKKwkJJEVDSE8gIioqKiBiZWNhdXNlIEkgZGlkIGNoZWNrIHRoZSBsaW5rZXIgcGF0aCBsb29raW5nIGZvciBhIGZpbGUgc3RhcnRpbmciCisJCWlmIHRlc3QgLXogIiRwb3RsaWIiIDsgdGhlbgorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBidXQgbm8gY2FuZGlkYXRlcyB3ZXJlIGZvdW5kLiAoLi4uZm9yIGZpbGUgbWFnaWMgdGVzdCkiCisJCWVsc2UKKwkJICAkRUNITyAiKioqIHdpdGggJGxpYm5hbWUgYW5kIG5vbmUgb2YgdGhlIGNhbmRpZGF0ZXMgcGFzc2VkIGEgZmlsZSBmb3JtYXQgdGVzdCIKKwkJICAkRUNITyAiKioqIHVzaW5nIGEgZmlsZSBtYWdpYy4gTGFzdCBmaWxlIGNoZWNrZWQ6ICRwb3RsaWIiCisJCWZpCisJICAgICAgZmkKKwkgICAgICA7OworCSAgICAqKQorCSAgICAgICMgQWRkIGEgLUwgYXJndW1lbnQuCisJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCSAgICAgIDs7CisJICAgIGVzYWMKKwkgIGRvbmUgIyBHb25lIHRocm91Z2ggYWxsIGRlcGxpYnMuCisJICA7OworCW1hdGNoX3BhdHRlcm4qKQorCSAgc2V0IGR1bW15ICRkZXBsaWJzX2NoZWNrX21ldGhvZDsgc2hpZnQKKwkgIG1hdGNoX3BhdHRlcm5fcmVnZXg9YGV4cHIgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgOiAiJDEgXCguKlwpImAKKwkgIGZvciBhX2RlcGxpYiBpbiAkZGVwbGliczsgZG8KKwkgICAgY2FzZSAkYV9kZXBsaWIgaW4KKwkgICAgLWwqKQorCSAgICAgIGZ1bmNfc3RyaXBuYW1lIC1sICcnICIkYV9kZXBsaWIiCisJICAgICAgbmFtZT0kZnVuY19zdHJpcG5hbWVfcmVzdWx0CisJICAgICAgaWYgdGVzdCAiWCRhbGxvd19saWJ0b29sX2xpYnNfd2l0aF9zdGF0aWNfcnVudGltZXMiID0gIlh5ZXMiIDsgdGhlbgorCQljYXNlICIgJHByZWRlcHMgJHBvc3RkZXBzICIgaW4KKwkJKiIgJGFfZGVwbGliICIqKQorCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRhX2RlcGxpYiIKKwkJICBhX2RlcGxpYj0iIgorCQkgIDs7CisJCWVzYWMKKwkgICAgICBmaQorCSAgICAgIGlmIHRlc3QgLW4gIiRhX2RlcGxpYiIgOyB0aGVuCisJCWxpYm5hbWU9YGV2YWwgIlxcJEVDSE8gXCIkbGlibmFtZV9zcGVjXCIiYAorCQlmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoICRzeXNfbGliX3NlYXJjaF9wYXRoICRzaGxpYl9zZWFyY2hfcGF0aDsgZG8KKwkJICBwb3RlbnRpYWxfbGlicz1gbHMgJGkvJGxpYm5hbWVbLi1dKiAyPi9kZXYvbnVsbGAKKwkJICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCisJCSAgICBwb3RsaWI9IiRwb3RlbnRfbGliIiAjIHNlZSBzeW1saW5rLWNoZWNrIGFib3ZlIGluIGZpbGVfbWFnaWMgdGVzdAorCQkgICAgaWYgZXZhbCAiXCRFQ0hPIFwiWCRwb3RlbnRfbGliXCIiIDI+L2Rldi9udWxsIHwgJFhzZWQgLWUgMTBxIHwgXAorCQkgICAgICAgJEVHUkVQICIkbWF0Y2hfcGF0dGVybl9yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KKwkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgorCQkgICAgICBhX2RlcGxpYj0iIgorCQkgICAgICBicmVhayAyCisJCSAgICBmaQorCQkgIGRvbmUKKwkJZG9uZQorCSAgICAgIGZpCisJICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KKwkJZHJvcHBlZGRlcHM9eWVzCisJCSRFQ0hPCisJCSRFQ0hPICIqKiogV2FybmluZzogbGlua2VyIHBhdGggZG9lcyBub3QgaGF2ZSByZWFsIGZpbGUgZm9yIGxpYnJhcnkgJGFfZGVwbGliLiIKKwkJJEVDSE8gIioqKiBJIGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8gbWFrZSB0aGF0IGxpYnJhcnkgYXV0b21hdGljYWxseSBsaW5rIGluIHdoZW4iCisJCSRFQ0hPICIqKiogeW91IGxpbmsgdG8gdGhpcyBsaWJyYXJ5LiAgQnV0IEkgY2FuIG9ubHkgZG8gdGhpcyBpZiB5b3UgaGF2ZSBhIgorCQkkRUNITyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlIgorCQkkRUNITyAiKioqIGJlY2F1c2UgSSBkaWQgY2hlY2sgdGhlIGxpbmtlciBwYXRoIGxvb2tpbmcgZm9yIGEgZmlsZSBzdGFydGluZyIKKwkJaWYgdGVzdCAteiAiJHBvdGxpYiIgOyB0aGVuCisJCSAgJEVDSE8gIioqKiB3aXRoICRsaWJuYW1lIGJ1dCBubyBjYW5kaWRhdGVzIHdlcmUgZm91bmQuICguLi5mb3IgcmVnZXggcGF0dGVybiB0ZXN0KSIKKwkJZWxzZQorCQkgICRFQ0hPICIqKiogd2l0aCAkbGlibmFtZSBhbmQgbm9uZSBvZiB0aGUgY2FuZGlkYXRlcyBwYXNzZWQgYSBmaWxlIGZvcm1hdCB0ZXN0IgorCQkgICRFQ0hPICIqKiogdXNpbmcgYSByZWdleCBwYXR0ZXJuLiBMYXN0IGZpbGUgY2hlY2tlZDogJHBvdGxpYiIKKwkJZmkKKwkgICAgICBmaQorCSAgICAgIDs7CisJICAgICopCisJICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KKwkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCisJICAgICAgOzsKKwkgICAgZXNhYworCSAgZG9uZSAjIEdvbmUgdGhyb3VnaCBhbGwgZGVwbGlicy4KKwkgIDs7CisJbm9uZSB8IHVua25vd24gfCAqKQorCSAgbmV3ZGVwbGlicz0iIgorCSAgdG1wX2RlcGxpYnM9YCRFQ0hPICJYICRkZXBsaWJzIiB8ICRYc2VkIFwKKwkgICAgICAtZSAncy8gLWxjJC8vJyAtZSAncy8gLVtMUl1bXiBdKi8vZydgCisJICBpZiB0ZXN0ICJYJGFsbG93X2xpYnRvb2xfbGlic193aXRoX3N0YXRpY19ydW50aW1lcyIgPSAiWHllcyIgOyB0aGVuCisJICAgIGZvciBpIGluICRwcmVkZXBzICRwb3N0ZGVwcyA7IGRvCisJICAgICAgIyBjYW4ndCB1c2UgWHNlZCBiZWxvdywgYmVjYXVzZSAkaSBtaWdodCBjb250YWluICcvJworCSAgICAgIHRtcF9kZXBsaWJzPWAkRUNITyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgInMsJGksLCJgCisJICAgIGRvbmUKKwkgIGZpCisJICBpZiAkRUNITyAiWCAkdG1wX2RlcGxpYnMiIHwgJFhzZWQgLWUgJ3MvWwkgXS8vZycgfAorCSAgICAgJEdSRVAgLiA+L2Rldi9udWxsOyB0aGVuCisJICAgICRFQ0hPCisJICAgIGlmIHRlc3QgIlgkZGVwbGlic19jaGVja19tZXRob2QiID0gIlhub25lIjsgdGhlbgorCSAgICAgICRFQ0hPICIqKiogV2FybmluZzogaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBwbGF0Zm9ybS4iCisJICAgIGVsc2UKKwkgICAgICAkRUNITyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKKwkgICAgZmkKKwkgICAgJEVDSE8gIioqKiBBbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGRyb3BwZWQuIgorCSAgICBkcm9wcGVkZGVwcz15ZXMKKwkgIGZpCisJICA7OworCWVzYWMKKwl2ZXJzdWZmaXg9JHZlcnN1ZmZpeF9zYXZlCisJbWFqb3I9JG1ham9yX3NhdmUKKwlyZWxlYXNlPSRyZWxlYXNlX3NhdmUKKwlsaWJuYW1lPSRsaWJuYW1lX3NhdmUKKwluYW1lPSRuYW1lX3NhdmUKKworCWNhc2UgJGhvc3QgaW4KKwkqLSotcmhhcHNvZHkqIHwgKi0qLWRhcndpbjEuWzAxMl0pCisJICAjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSB3aXRoIHRoZSBTeXN0ZW0gZnJhbWV3b3JrCisJICBuZXdkZXBsaWJzPWAkRUNITyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCSAgOzsKKwllc2FjCisKKwlpZiB0ZXN0ICIkZHJvcHBlZGRlcHMiID0geWVzOyB0aGVuCisJICBpZiB0ZXN0ICIkbW9kdWxlIiA9IHllczsgdGhlbgorCSAgICAkRUNITworCSAgICAkRUNITyAiKioqIFdhcm5pbmc6IGxpYnRvb2wgY291bGQgbm90IHNhdGlzZnkgYWxsIGRlY2xhcmVkIGludGVyLWxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogZGVwZW5kZW5jaWVzIG9mIG1vZHVsZSAkbGlibmFtZS4gIFRoZXJlZm9yZSwgbGlidG9vbCB3aWxsIGNyZWF0ZSIKKwkgICAgJEVDSE8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgorCSAgICAkRUNITyAiKioqIGFwcGxpY2F0aW9uIGlzIGxpbmtlZCB3aXRoIHRoZSAtZGxvcGVuIGZsYWcuIgorCSAgICBpZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgorCSAgICAgICRFQ0hPCisJICAgICAgJEVDSE8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgorCSAgICAgICRFQ0hPICIqKiogbGlzdHMgZnJvbSBhIHByb2dyYW0sIHVzaW5nIFxgbm0nIG9yIGVxdWl2YWxlbnQsIGJ1dCBsaWJ0b29sIGNvdWxkIgorCSAgICAgICRFQ0hPICIqKiogbm90IGZpbmQgc3VjaCBhIHByb2dyYW0uICBTbywgdGhpcyBtb2R1bGUgaXMgcHJvYmFibHkgdXNlbGVzcy4iCisJICAgICAgJEVDSE8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KKwkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKKwkgICAgZWxzZQorCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworCSAgICBmaQorCSAgZWxzZQorCSAgICAkRUNITyAiKioqIFRoZSBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkIGhlcmUgd2lsbCBiZSIKKwkgICAgJEVDSE8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCisJICAgICRFQ0hPICIqKiogb3IgaXMgZGVjbGFyZWQgdG8gLWRsb3BlbiBpdC4iCisKKwkgICAgaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSBubzsgdGhlbgorCSAgICAgICRFQ0hPCisJICAgICAgJEVDSE8gIioqKiBTaW5jZSB0aGlzIGxpYnJhcnkgbXVzdCBub3QgY29udGFpbiB1bmRlZmluZWQgc3ltYm9scywiCisJICAgICAgJEVDSE8gIioqKiBiZWNhdXNlIGVpdGhlciB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCB0aGVtIG9yIgorCSAgICAgICRFQ0hPICIqKiogaXQgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggLW5vLXVuZGVmaW5lZCwiCisJICAgICAgJEVDSE8gIioqKiBsaWJ0b29sIHdpbGwgb25seSBjcmVhdGUgYSBzdGF0aWMgdmVyc2lvbiBvZiBpdC4iCisJICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IG5vOyB0aGVuCisJCW9sZGxpYnM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiRsaWJleHQiCisJCWJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKKwkJYnVpbGRfb2xkX2xpYnM9eWVzCisJICAgICAgZWxzZQorCQlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwkgICAgICBmaQorCSAgICBmaQorCSAgZmkKKwlmaQorCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQorCWRlcGxpYnM9JG5ld2RlcGxpYnMKKyAgICAgIGZpCisgICAgICAjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisgICAgICBjYXNlICRob3N0IGluCisJKi0qLWRhcndpbiopCisJICBuZXdkZXBsaWJzPWAkRUNITyAiWCAkbmV3ZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIG5ld19pbmhlcml0ZWRfbGlua2VyX2ZsYWdzPWAkRUNITyAiWCAkbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MiIHwgJFhzZWQgLWUgJ3MlIFwoW14gJF0qXCkubHRmcmFtZXdvcmslIC1mcmFtZXdvcmsgXDElZydgCisJICBkZXBsaWJzPWAkRUNITyAiWCAkZGVwbGlicyIgfCAkWHNlZCAtZSAncyUgXChbXiAkXSpcKS5sdGZyYW1ld29yayUgLWZyYW1ld29yayBcMSVnJ2AKKwkgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgbW92ZSBsaWJyYXJ5IHNlYXJjaCBwYXRocyB0aGF0IGNvaW5jaWRlIHdpdGggcGF0aHMgdG8gbm90IHlldAorICAgICAgIyBpbnN0YWxsZWQgbGlicmFyaWVzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIGxpc3QKKyAgICAgIG5ld19saWJzPQorICAgICAgZm9yIHBhdGggaW4gJG5vdGluc3RfcGF0aDsgZG8KKwljYXNlICIgJG5ld19saWJzICIgaW4KKwkqIiAtTCRwYXRoLyRvYmpkaXIgIiopIDs7CisJKikKKwkgIGNhc2UgIiAkZGVwbGlicyAiIGluCisJICAqIiAtTCRwYXRoLyRvYmpkaXIgIiopCisJICAgIG5ld19saWJzPSIkbmV3X2xpYnMgLUwkcGF0aC8kb2JqZGlyIiA7OworCSAgZXNhYworCSAgOzsKKwllc2FjCisgICAgICBkb25lCisgICAgICBmb3IgZGVwbGliIGluICRkZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGRlcGxpYnM9IiRuZXdfbGlicyIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorCisgICAgICAjIFRlc3QgYWdhaW4sIHdlIG1heSBoYXZlIGRlY2lkZWQgbm90IHRvIGJ1aWxkIGl0IGFueSBtb3JlCisgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCWlmIHRlc3QgIiRoYXJkY29kZV9pbnRvX2xpYnMiID0geWVzOyB0aGVuCisJICAjIEhhcmRjb2RlIHRoZSBsaWJyYXJ5IHBhdGhzCisJICBoYXJkY29kZV9saWJkaXJzPQorCSAgZGVwX3JwYXRoPQorCSAgcnBhdGg9IiRmaW5hbGl6ZV9ycGF0aCIKKwkgIHRlc3QgIiRtb2RlIiAhPSByZWxpbmsgJiYgcnBhdGg9IiRjb21waWxlX3JwYXRoJHJwYXRoIgorCSAgZm9yIGxpYmRpciBpbiAkcnBhdGg7IGRvCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCQlpZiB0ZXN0IC16ICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwkJICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorCQllbHNlCisJCSAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQkgIGNhc2UgJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIGluCisJCSAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQorCQkgICAgOzsKKwkJICAqKQorCQkgICAgaGFyZGNvZGVfbGliZGlycz0iJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIiCisJCSAgICA7OworCQkgIGVzYWMKKwkJZmkKKwkgICAgICBlbHNlCisJCWV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkJZGVwX3JwYXRoPSIkZGVwX3JwYXRoICRmbGFnIgorCSAgICAgIGZpCisJICAgIGVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgorCSAgICAgIGNhc2UgIiRwZXJtX3JwYXRoICIgaW4KKwkgICAgICAqIiAkbGliZGlyICIqKSA7OworCSAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisJICAgICAgZXNhYworCSAgICBmaQorCSAgZG9uZQorCSAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKwkgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSAgICAgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgIGxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCisJICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjX2xkIjsgdGhlbgorCSAgICAgIGV2YWwgZGVwX3JwYXRoPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNfbGRcIgorCSAgICBlbHNlCisJICAgICAgZXZhbCBkZXBfcnBhdGg9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisJICAgIGZpCisJICBmaQorCSAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKwkgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKwkgICAgcnBhdGg9CisJICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisJICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorCSAgICBkb25lCisJICAgIGV2YWwgIiRydW5wYXRoX3Zhcj0nJHJwYXRoXCQkcnVucGF0aF92YXInOyBleHBvcnQgJHJ1bnBhdGhfdmFyIgorCSAgZmkKKwkgIHRlc3QgLW4gIiRkZXBfcnBhdGgiICYmIGRlcGxpYnM9IiRkZXBfcnBhdGggJGRlcGxpYnMiCisJZmkKKworCXNobGlicGF0aD0iJGZpbmFsaXplX3NobGlicGF0aCIKKwl0ZXN0ICIkbW9kZSIgIT0gcmVsaW5rICYmIHNobGlicGF0aD0iJGNvbXBpbGVfc2hsaWJwYXRoJHNobGlicGF0aCIKKwlpZiB0ZXN0IC1uICIkc2hsaWJwYXRoIjsgdGhlbgorCSAgZXZhbCAiJHNobGlicGF0aF92YXI9JyRzaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyJzsgZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCWZpCisKKwkjIEdldCB0aGUgcmVhbCBhbmQgbGluayBuYW1lcyBvZiB0aGUgbGlicmFyeS4KKwlldmFsIHNoYXJlZF9leHQ9XCIkc2hyZXh0X2NtZHNcIgorCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgorCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcworCXNoaWZ0CisJcmVhbG5hbWU9IiQxIgorCXNoaWZ0CisKKwlpZiB0ZXN0IC1uICIkc29uYW1lX3NwZWMiOyB0aGVuCisJICBldmFsIHNvbmFtZT1cIiRzb25hbWVfc3BlY1wiCisJZWxzZQorCSAgc29uYW1lPSIkcmVhbG5hbWUiCisJZmkKKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgZGxuYW1lPSRzb25hbWUKKwlmaQorCisJbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCisJbGlua25hbWVzPQorCWZvciBsaW5rCisJZG8KKwkgIGxpbmtuYW1lcz0iJGxpbmtuYW1lcyAkbGluayIKKwlkb25lCisKKwkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYworCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJEVDSE8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorCXRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisKKwlkZWxmaWxlcz0KKwlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgY3AgIiRleHBvcnRfc3ltYm9scyIgIiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLnVleHAiCisJICBleHBvcnRfc3ltYm9scz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUudWV4cCIKKwkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzIgorCWZpCisKKwlvcmlnX2V4cG9ydF9zeW1ib2xzPQorCWNhc2UgJGhvc3Rfb3MgaW4KKwljeWd3aW4qIHwgbWluZ3cqIHwgY2VnY2MqKQorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiOyB0aGVuCisJICAgICMgZXhwb3J0aW5nIHVzaW5nIHVzZXIgc3VwcGxpZWQgc3ltZmlsZQorCSAgICBpZiB0ZXN0ICJ4YCRTRUQgMXEgJGV4cG9ydF9zeW1ib2xzYCIgIT0geEVYUE9SVFM7IHRoZW4KKwkgICAgICAjIGFuZCBpdCdzIE5PVCBhbHJlYWR5IGEgLmRlZiBmaWxlLiBNdXN0IGZpZ3VyZSBvdXQKKwkgICAgICAjIHdoaWNoIG9mIHRoZSBnaXZlbiBzeW1ib2xzIGFyZSBkYXRhIHN5bWJvbHMgYW5kIHRhZworCSAgICAgICMgdGhlbSBhcyBzdWNoLiBTbywgdHJpZ2dlciB1c2Ugb2YgZXhwb3J0X3N5bWJvbHNfY21kcy4KKwkgICAgICAjIGV4cG9ydF9zeW1ib2xzIGdldHMgcmVhc3NpZ25lZCBpbnNpZGUgdGhlICJwcmVwYXJlCisJICAgICAgIyB0aGUgbGlzdCBvZiBleHBvcnRlZCBzeW1ib2xzIiBpZiBzdGF0ZW1lbnQsIHNvIHRoZQorCSAgICAgICMgaW5jbHVkZV9leHBzeW1zIGxvZ2ljIHN0aWxsIHdvcmtzLgorCSAgICAgIG9yaWdfZXhwb3J0X3N5bWJvbHM9IiRleHBvcnRfc3ltYm9scyIKKwkgICAgICBleHBvcnRfc3ltYm9scz0KKwkgICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCisJICAgIGZpCisJICBmaQorCSAgOzsKKwllc2FjCisKKwkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scworCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KKwkgICAgZnVuY192ZXJib3NlICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRsaWJuYW1lLmxhJyIKKwkgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgJG9wdF9kcnlfcnVuIHx8ICRSTSAkZXhwb3J0X3N5bWJvbHMKKwkgICAgY21kcz0kZXhwb3J0X3N5bWJvbHNfY21kcworCSAgICBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKKwkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKwkgICAgICBJRlM9IiRzYXZlX2lmcyIKKwkgICAgICBldmFsIGNtZD1cIiRjbWRcIgorCSAgICAgIGZ1bmNfbGVuICIgJGNtZCIKKwkgICAgICBsZW49JGZ1bmNfbGVuX3Jlc3VsdAorCSAgICAgIGlmIHRlc3QgIiRsZW4iIC1sdCAiJG1heF9jbWRfbGVuIiB8fCB0ZXN0ICIkbWF4X2NtZF9sZW4iIC1sZSAtMTsgdGhlbgorCQlmdW5jX3Nob3dfZXZhbCAiJGNtZCIgJ2V4aXQgJD8nCisJCXNraXBwZWRfZXhwb3J0PWZhbHNlCisJICAgICAgZWxzZQorCQkjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gZXhlY3V0ZSBpbiBvbmUgc3RlcC4KKwkJZnVuY192ZXJib3NlICJ1c2luZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlIGZvciBleHBvcnQgbGlzdC4uLiIKKwkJc2tpcHBlZF9leHBvcnQ9OgorCQkjIEJyZWFrIG91dCBlYXJseSwgb3RoZXJ3aXNlIHNraXBwZWRfZXhwb3J0IG1heSBiZQorCQkjIHNldCB0byBmYWxzZSBieSBhIGxhdGVyIGJ1dCBzaG9ydGVyIGNtZC4KKwkJYnJlYWsKKwkgICAgICBmaQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiI7IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGluY2x1ZGVfZXhwc3ltcyI7IHRoZW4KKwkgIHRtcF9leHBvcnRfc3ltYm9scz0iJGV4cG9ydF9zeW1ib2xzIgorCSAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnJEVDSE8gIlgkaW5jbHVkZV9leHBzeW1zIiB8ICRYc2VkIHwgJFNQMk5MID4+ICIkdG1wX2V4cG9ydF9zeW1ib2xzIicKKwlmaQorCisJaWYgdGVzdCAiWCRza2lwcGVkX2V4cG9ydCIgIT0gIlg6IiAmJiB0ZXN0IC1uICIkb3JpZ19leHBvcnRfc3ltYm9scyI7IHRoZW4KKwkgICMgVGhlIGdpdmVuIGV4cG9ydHNfc3ltYm9scyBmaWxlIGhhcyB0byBiZSBmaWx0ZXJlZCwgc28gZmlsdGVyIGl0LgorCSAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAjIEZJWE1FOiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIgcG90ZW50aWFsbHkgY29udGFpbnMgbG90cyBvZgorCSAgIyAncycgY29tbWFuZHMgd2hpY2ggbm90IGFsbCBzZWRzIGNhbiBoYW5kbGUuIEdOVSBzZWQgc2hvdWxkIGJlIGZpbmUKKwkgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgIyBnbG9iYWwgdmFyaWFibGVzLiBqb2luKDEpIHdvdWxkIGJlIG5pY2UgaGVyZSwgYnV0IHVuZm9ydHVuYXRlbHkKKwkgICMgaXNuJ3QgYSBibGVzc2VkIHRvb2wuCisJICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJGV4cG9ydF9zeW1ib2xzICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmZpbHRlciIKKwkgIGV4cG9ydF9zeW1ib2xzPSRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmRlZgorCSAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwlmaQorCisJdG1wX2RlcGxpYnM9CisJZm9yIHRlc3RfZGVwbGliIGluICRkZXBsaWJzOyBkbworCSAgY2FzZSAiICRjb252ZW5pZW5jZSAiIGluCisJICAqIiAkdGVzdF9kZXBsaWIgIiopIDs7CisJICAqKQorCSAgICB0bXBfZGVwbGlicz0iJHRtcF9kZXBsaWJzICR0ZXN0X2RlcGxpYiIKKwkgICAgOzsKKwkgIGVzYWMKKwlkb25lCisJZGVwbGlicz0iJHRtcF9kZXBsaWJzIgorCisJaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIiAmJgorCSAgICB0ZXN0ICIkY29tcGlsZXJfbmVlZHNfb2JqZWN0IiA9IHllcyAmJgorCSAgICB0ZXN0IC16ICIkbGlib2JqcyI7IHRoZW4KKwkgICAgIyBleHRyYWN0IHRoZSBhcmNoaXZlcywgc28gd2UgaGF2ZSBvYmplY3RzIHRvIGxpc3QuCisJICAgICMgVE9ETzogY291bGQgb3B0aW1pemUgdGhpcyB0byBqdXN0IGV4dHJhY3Qgb25lIGFyY2hpdmUuCisJICAgIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPQorCSAgZmkKKwkgIGlmIHRlc3QgLW4gIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgc2F2ZV9saWJvYmpzPSRsaWJvYmpzCisJICAgIGV2YWwgbGlib2Jqcz1cIlwkbGlib2JqcyAkd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWNcIgorCSAgICB0ZXN0ICJYJGxpYm9ianMiID0gIlggIiAmJiBsaWJvYmpzPQorCSAgZWxzZQorCSAgICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgICBmdW5jX2V4dHJhY3RfYXJjaGl2ZXMgJGdlbnRvcCAkY29udmVuaWVuY2UKKwkgICAgbGlib2Jqcz0iJGxpYm9ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJICAgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJICBmaQorCWZpCisKKwlpZiB0ZXN0ICIkdGhyZWFkX3NhZmUiID0geWVzICYmIHRlc3QgLW4gIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWMiOyB0aGVuCisJICBldmFsIGZsYWc9XCIkdGhyZWFkX3NhZmVfZmxhZ19zcGVjXCIKKwkgIGxpbmtlcl9mbGFncz0iJGxpbmtlcl9mbGFncyAkZmxhZyIKKwlmaQorCisJIyBNYWtlIGEgYmFja3VwIG9mIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IHdoZW4gcmVsaW5raW5nCisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVUgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVUpJyB8fCBleGl0ICQ/CisJZmkKKworCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyAmJiB0ZXN0IC1uICIkbW9kdWxlX2NtZHMiIDsgdGhlbgorCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9zeW1ib2xzIiAmJiB0ZXN0IC1uICIkbW9kdWxlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRtb2R1bGVfZXhwc3ltX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgIGVsc2UKKwkgICAgZXZhbCB0ZXN0X2NtZHM9XCIkbW9kdWxlX2NtZHNcIgorCSAgICBjbWRzPSRtb2R1bGVfY21kcworCSAgZmkKKwllbHNlCisJICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2V4cHN5bV9jbWRzXCIKKwkgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgZWxzZQorCSAgICBldmFsIHRlc3RfY21kcz1cIiRhcmNoaXZlX2NtZHNcIgorCSAgICBjbWRzPSRhcmNoaXZlX2NtZHMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYKKwkgICBmdW5jX2xlbiAiICR0ZXN0X2NtZHMiICYmCisJICAgbGVuPSRmdW5jX2xlbl9yZXN1bHQgJiYKKwkgICB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIDoKKwllbHNlCisJICAjIFRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBwaWVjZXdpc2UKKwkgICMgb3IsIGlmIHVzaW5nIEdOVSBsZCBhbmQgc2tpcHBlZF9leHBvcnQgaXMgbm90IDosIHVzZSBhIGxpbmtlcgorCSAgIyBzY3JpcHQuCisKKwkgICMgU2F2ZSB0aGUgdmFsdWUgb2YgJG91dHB1dCBhbmQgJGxpYm9ianMgYmVjYXVzZSB3ZSB3YW50IHRvCisJICAjIHVzZSB0aGVtIGxhdGVyLiAgSWYgd2UgaGF2ZSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYywgd2UKKwkgICMgd2FudCB0byB1c2Ugc2F2ZV9saWJvYmpzIGFzIGl0IHdhcyBiZWZvcmUKKwkgICMgd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWMgd2FzIGV4cGFuZGVkLCBiZWNhdXNlIHdlIGNhbid0CisJICAjIGFzc3VtZSB0aGUgbGlua2VyIHVuZGVyc3RhbmRzIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjLgorCSAgIyBUaGlzIG1heSBoYXZlIHRvIGJlIHJldmlzaXRlZCwgaW4gY2FzZSB0b28gbWFueQorCSAgIyBjb252ZW5pZW5jZSBsaWJyYXJpZXMgZ2V0IGxpbmtlZCBpbiBhbmQgZW5kIHVwIGV4Y2VlZGluZworCSAgIyB0aGUgc3BlYy4KKwkgIGlmIHRlc3QgLXogIiRjb252ZW5pZW5jZSIgfHwgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBzYXZlX2xpYm9ianM9JGxpYm9ianMKKwkgIGZpCisJICBzYXZlX291dHB1dD0kb3V0cHV0CisJICBvdXRwdXRfbGE9YCRFQ0hPICJYJG91dHB1dCIgfCAkWHNlZCAtZSAiJGJhc2VuYW1lImAKKworCSAgIyBDbGVhciB0aGUgcmVsb2FkYWJsZSBvYmplY3QgY3JlYXRpb24gY29tbWFuZCBxdWV1ZSBhbmQKKwkgICMgaW5pdGlhbGl6ZSBrIHRvIG9uZS4KKwkgIHRlc3RfY21kcz0KKwkgIGNvbmNhdF9jbWRzPQorCSAgb2JqbGlzdD0KKwkgIGxhc3Rfcm9iaj0KKwkgIGs9MQorCisJICBpZiB0ZXN0IC1uICIkc2F2ZV9saWJvYmpzIiAmJiB0ZXN0ICJYJHNraXBwZWRfZXhwb3J0IiAhPSAiWDoiICYmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKwkgICAgb3V0cHV0PSR7b3V0cHV0X29iamRpcn0vJHtvdXRwdXRfbGF9Lmxua3NjcmlwdAorCSAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nIEdOVSBsZCBzY3JpcHQ6ICRvdXRwdXQiCisJICAgICRFQ0hPICdJTlBVVCAoJyA+ICRvdXRwdXQKKwkgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgIGRvCisJICAgICAgJEVDSE8gIiRvYmoiID4+ICRvdXRwdXQKKwkgICAgZG9uZQorCSAgICAkRUNITyAnKScgPj4gJG91dHB1dAorCSAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisJICBlbGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmIHRlc3QgIlgkc2tpcHBlZF9leHBvcnQiICE9ICJYOiIgJiYgdGVzdCAiWCRmaWxlX2xpc3Rfc3BlYyIgIT0gWDsgdGhlbgorCSAgICBvdXRwdXQ9JHtvdXRwdXRfb2JqZGlyfS8ke291dHB1dF9sYX0ubG5rCisJICAgIGZ1bmNfdmVyYm9zZSAiY3JlYXRpbmcgbGlua2VyIGlucHV0IGZpbGUgbGlzdDogJG91dHB1dCIKKwkgICAgOiA+ICRvdXRwdXQKKwkgICAgc2V0IHggJHNhdmVfbGlib2JqcworCSAgICBzaGlmdAorCSAgICBmaXJzdG9iaj0KKwkgICAgaWYgdGVzdCAiJGNvbXBpbGVyX25lZWRzX29iamVjdCIgPSB5ZXM7IHRoZW4KKwkgICAgICBmaXJzdG9iaj0iJDEgIgorCSAgICAgIHNoaWZ0CisJICAgIGZpCisJICAgIGZvciBvYmoKKwkgICAgZG8KKwkgICAgICAkRUNITyAiJG9iaiIgPj4gJG91dHB1dAorCSAgICBkb25lCisJICAgIGRlbGZpbGVzPSIkZGVsZmlsZXMgJG91dHB1dCIKKwkgICAgb3V0cHV0PSRmaXJzdG9ialwiJGZpbGVfbGlzdF9zcGVjJG91dHB1dFwiCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiOyB0aGVuCisJICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4uLiIKKwkgICAgICBvdXRwdXQ9JG91dHB1dF9vYmpkaXIvJG91dHB1dF9sYS0ke2t9LiRvYmpleHQKKwkgICAgICBldmFsIHRlc3RfY21kcz1cIiRyZWxvYWRfY21kc1wiCisJICAgICAgZnVuY19sZW4gIiAkdGVzdF9jbWRzIgorCSAgICAgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgICAgIGxlbj0kbGVuMAorCisJICAgICAgIyBMb29wIG92ZXIgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBiZSBsaW5rZWQuCisJICAgICAgZm9yIG9iaiBpbiAkc2F2ZV9saWJvYmpzCisJICAgICAgZG8KKwkJZnVuY19sZW4gIiAkb2JqIgorCQlmdW5jX2FyaXRoICRsZW4gKyAkZnVuY19sZW5fcmVzdWx0CisJCWxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJaWYgdGVzdCAiWCRvYmpsaXN0IiA9IFggfHwKKwkJICAgdGVzdCAiJGxlbiIgLWx0ICIkbWF4X2NtZF9sZW4iOyB0aGVuCisJCSAgZnVuY19hcHBlbmQgb2JqbGlzdCAiICRvYmoiCisJCWVsc2UKKwkJICAjIFRoZSBjb21tYW5kICR0ZXN0X2NtZHMgaXMgYWxtb3N0IHRvbyBsb25nLCBhZGQgYQorCQkgICMgY29tbWFuZCB0byB0aGUgcXVldWUuCisJCSAgaWYgdGVzdCAiJGsiIC1lcSAxIDsgdGhlbgorCQkgICAgIyBUaGUgZmlyc3QgZmlsZSBkb2Vzbid0IGhhdmUgYSBwcmV2aW91cyBjb21tYW5kIHRvIGFkZC4KKwkJICAgIGV2YWwgY29uY2F0X2NtZHM9XCIkcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ialwiCisJCSAgZWxzZQorCQkgICAgIyBBbGwgc3Vic2VxdWVudCByZWxvYWRhYmxlIG9iamVjdCBmaWxlcyB3aWxsIGxpbmsgaW4KKwkJICAgICMgdGhlIGxhc3Qgb25lIGNyZWF0ZWQuCisJCSAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCRjb25jYXRfY21kc34kcmVsb2FkX2NtZHMgJG9iamxpc3QgJGxhc3Rfcm9ian5cJFJNICRsYXN0X3JvYmpcIgorCQkgIGZpCisJCSAgbGFzdF9yb2JqPSRvdXRwdXRfb2JqZGlyLyRvdXRwdXRfbGEtJHtrfS4kb2JqZXh0CisJCSAgZnVuY19hcml0aCAkayArIDEKKwkJICBrPSRmdW5jX2FyaXRoX3Jlc3VsdAorCQkgIG91dHB1dD0kb3V0cHV0X29iamRpci8kb3V0cHV0X2xhLSR7a30uJG9iamV4dAorCQkgIG9iamxpc3Q9JG9iagorCQkgIGZ1bmNfbGVuICIgJGxhc3Rfcm9iaiIKKwkJICBmdW5jX2FyaXRoICRsZW4wICsgJGZ1bmNfbGVuX3Jlc3VsdAorCQkgIGxlbj0kZnVuY19hcml0aF9yZXN1bHQKKwkJZmkKKwkgICAgICBkb25lCisJICAgICAgIyBIYW5kbGUgdGhlIHJlbWFpbmluZyBvYmplY3RzIGJ5IGNyZWF0aW5nIG9uZSBsYXN0CisJICAgICAgIyByZWxvYWRhYmxlIG9iamVjdCBmaWxlLiAgQWxsIHN1YnNlcXVlbnQgcmVsb2FkYWJsZSBvYmplY3QKKwkgICAgICAjIGZpbGVzIHdpbGwgbGluayBpbiB0aGUgbGFzdCBvbmUgY3JlYXRlZC4KKwkgICAgICB0ZXN0IC16ICIkY29uY2F0X2NtZHMiIHx8IGNvbmNhdF9jbWRzPSRjb25jYXRfY21kc34KKwkgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9JHJlbG9hZF9jbWRzICRvYmpsaXN0ICRsYXN0X3JvYmpcIgorCSAgICAgIGlmIHRlc3QgLW4gIiRsYXN0X3JvYmoiOyB0aGVuCisJICAgICAgICBldmFsIGNvbmNhdF9jbWRzPVwiXCR7Y29uY2F0X2NtZHN9flwkUk0gJGxhc3Rfcm9ialwiCisJICAgICAgZmkKKwkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRvdXRwdXQiCisKKwkgICAgZWxzZQorCSAgICAgIG91dHB1dD0KKwkgICAgZmkKKworCSAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICAgIGZ1bmNfdmVyYm9zZSAiZ2VuZXJhdGluZyBzeW1ib2wgbGlzdCBmb3IgXGAkbGlibmFtZS5sYSciCisJICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLmV4cCIKKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRleHBvcnRfc3ltYm9scworCSAgICAgIGxpYm9ianM9JG91dHB1dAorCSAgICAgICMgQXBwZW5kIHRoZSBjb21tYW5kIHRvIGNyZWF0ZSB0aGUgZXhwb3J0IGZpbGUuCisJICAgICAgdGVzdCAteiAiJGNvbmNhdF9jbWRzIiB8fCBjb25jYXRfY21kcz0kY29uY2F0X2NtZHN+CisJICAgICAgZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHMkZXhwb3J0X3N5bWJvbHNfY21kc1wiCisJICAgICAgaWYgdGVzdCAtbiAiJGxhc3Rfcm9iaiI7IHRoZW4KKwkJZXZhbCBjb25jYXRfY21kcz1cIlwkY29uY2F0X2NtZHN+XCRSTSAkbGFzdF9yb2JqXCIKKwkgICAgICBmaQorCSAgICBmaQorCisJICAgIHRlc3QgLW4gIiRzYXZlX2xpYm9ianMiICYmCisJICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyBhIHRlbXBvcmFyeSByZWxvYWRhYmxlIG9iamVjdCBmaWxlOiAkb3V0cHV0IgorCisJICAgICMgTG9vcCB0aHJvdWdoIHRoZSBjb21tYW5kcyBnZW5lcmF0ZWQgYWJvdmUgYW5kIGV4ZWN1dGUgdGhlbS4KKwkgICAgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCisJICAgIGZvciBjbWQgaW4gJGNvbmNhdF9jbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRvcHRfc2lsZW50IHx8IHsKKwkJICBmdW5jX3F1b3RlX2Zvcl9leHBhbmQgIiRjbWQiCisJCSAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgICAgIH0KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAiJGNtZCIgfHwgeworCQlsdF9leGl0PSQ/CisKKwkJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJCWlmIHRlc3QgIiRtb2RlIiA9IHJlbGluazsgdGhlbgorCQkgICggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiBcCisJCSAgICAkUk0gIiR7cmVhbG5hbWV9VCIgJiYgXAorCQkgICAgJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkJZmkKKworCQlleGl0ICRsdF9leGl0CisJICAgICAgfQorCSAgICBkb25lCisJICAgIElGUz0iJHNhdmVfaWZzIgorCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCIgJiYgJHtza2lwcGVkX2V4cG9ydC1mYWxzZX07IHRoZW4KKwkgICAgICBmdW5jX3Nob3dfZXZhbCAnJEVHUkVQIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCisJICAgICAgZnVuY19zaG93X2V2YWwgJyRNViAiJHtleHBvcnRfc3ltYm9sc31UIiAiJGV4cG9ydF9zeW1ib2xzIicKKwkgICAgZmkKKwkgIGZpCisKKyAgICAgICAgICBpZiAke3NraXBwZWRfZXhwb3J0LWZhbHNlfTsgdGhlbgorCSAgICBpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCisJICAgICAgdG1wX2V4cG9ydF9zeW1ib2xzPSIkZXhwb3J0X3N5bWJvbHMiCisJICAgICAgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiICYmIHRtcF9leHBvcnRfc3ltYm9scz0iJG9yaWdfZXhwb3J0X3N5bWJvbHMiCisJICAgICAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgJyRFQ0hPICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkWHNlZCB8ICRTUDJOTCA+PiAiJHRtcF9leHBvcnRfc3ltYm9scyInCisJICAgIGZpCisKKwkgICAgaWYgdGVzdCAtbiAiJG9yaWdfZXhwb3J0X3N5bWJvbHMiOyB0aGVuCisJICAgICAgIyBUaGUgZ2l2ZW4gZXhwb3J0c19zeW1ib2xzIGZpbGUgaGFzIHRvIGJlIGZpbHRlcmVkLCBzbyBmaWx0ZXIgaXQuCisJICAgICAgZnVuY192ZXJib3NlICJmaWx0ZXIgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIHRvIHRhZyBEQVRBIGV4cG9ydHMiCisJICAgICAgIyBGSVhNRTogJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIHBvdGVudGlhbGx5IGNvbnRhaW5zIGxvdHMgb2YKKwkgICAgICAjICdzJyBjb21tYW5kcyB3aGljaCBub3QgYWxsIHNlZHMgY2FuIGhhbmRsZS4gR05VIHNlZCBzaG91bGQgYmUgZmluZQorCSAgICAgICMgdGhvdWdoLiBBbHNvLCB0aGUgZmlsdGVyIHNjYWxlcyBzdXBlcmxpbmVhcmx5IHdpdGggdGhlIG51bWJlciBvZgorCSAgICAgICMgZ2xvYmFsIHZhcmlhYmxlcy4gam9pbigxKSB3b3VsZCBiZSBuaWNlIGhlcmUsIGJ1dCB1bmZvcnR1bmF0ZWx5CisJICAgICAgIyBpc24ndCBhIGJsZXNzZWQgdG9vbC4KKwkgICAgICAkb3B0X2RyeV9ydW4gfHwgJFNFRCAtZSAnL1sgLF1EQVRBLyFkO3MsXCguKlwpXChbIFwsXS4qXCksc3xeXDEkfFwxXDJ8LCcgPCAkZXhwb3J0X3N5bWJvbHMgPiAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIKKwkgICAgICBkZWxmaWxlcz0iJGRlbGZpbGVzICRleHBvcnRfc3ltYm9scyAkb3V0cHV0X29iamRpci8kbGlibmFtZS5maWx0ZXIiCisJICAgICAgZXhwb3J0X3N5bWJvbHM9JG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZGVmCisJICAgICAgJG9wdF9kcnlfcnVuIHx8ICRTRUQgLWYgJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuZmlsdGVyIDwgJG9yaWdfZXhwb3J0X3N5bWJvbHMgPiAkZXhwb3J0X3N5bWJvbHMKKwkgICAgZmkKKwkgIGZpCisKKwkgIGxpYm9ianM9JG91dHB1dAorCSAgIyBSZXN0b3JlIHRoZSB2YWx1ZSBvZiBvdXRwdXQuCisJICBvdXRwdXQ9JHNhdmVfb3V0cHV0CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSIgJiYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKKwkgICAgdGVzdCAiWCRsaWJvYmpzIiA9ICJYICIgJiYgbGlib2Jqcz0KKwkgIGZpCisJICAjIEV4cGFuZCB0aGUgbGlicmFyeSBsaW5raW5nIGNvbW1hbmRzIGFnYWluIHRvIHJlc2V0IHRoZQorCSAgIyB2YWx1ZSBvZiAkbGlib2JqcyBmb3IgcGllY2V3aXNlIGxpbmtpbmcuCisKKwkgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKwkgIGlmIHRlc3QgIiRtb2R1bGUiID0geWVzICYmIHRlc3QgLW4gIiRtb2R1bGVfY21kcyIgOyB0aGVuCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJG1vZHVsZV9leHBzeW1fY21kcyI7IHRoZW4KKwkgICAgICBjbWRzPSRtb2R1bGVfZXhwc3ltX2NtZHMKKwkgICAgZWxzZQorCSAgICAgIGNtZHM9JG1vZHVsZV9jbWRzCisJICAgIGZpCisJICBlbHNlCisJICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyIgJiYgdGVzdCAtbiAiJGFyY2hpdmVfZXhwc3ltX2NtZHMiOyB0aGVuCisJICAgICAgY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcworCSAgICBlbHNlCisJICAgICAgY21kcz0kYXJjaGl2ZV9jbWRzCisJICAgIGZpCisJICBmaQorCWZpCisKKwlpZiB0ZXN0IC1uICIkZGVsZmlsZXMiOyB0aGVuCisJICAjIEFwcGVuZCB0aGUgY29tbWFuZCB0byByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIHRvICRjbWRzLgorCSAgZXZhbCBjbWRzPVwiXCRjbWRzflwkUk0gJGRlbGZpbGVzXCIKKwlmaQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBsaWJvYmpzPSIkbGlib2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwkgIHRlc3QgIlgkbGlib2JqcyIgPSAiWCAiICYmIGxpYm9ianM9CisJZmkKKworCXNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JworCWZvciBjbWQgaW4gJGNtZHM7IGRvCisJICBJRlM9IiRzYXZlX2lmcyIKKwkgIGV2YWwgY21kPVwiJGNtZFwiCisJICAkb3B0X3NpbGVudCB8fCB7CisJICAgIGZ1bmNfcXVvdGVfZm9yX2V4cGFuZCAiJGNtZCIKKwkgICAgZXZhbCAiZnVuY19lY2hvICRmdW5jX3F1b3RlX2Zvcl9leHBhbmRfcmVzdWx0IgorCSAgfQorCSAgJG9wdF9kcnlfcnVuIHx8IGV2YWwgIiRjbWQiIHx8IHsKKwkgICAgbHRfZXhpdD0kPworCisJICAgICMgUmVzdG9yZSB0aGUgdW5pbnN0YWxsZWQgbGlicmFyeSBhbmQgZXhpdAorCSAgICBpZiB0ZXN0ICIkbW9kZSIgPSByZWxpbms7IHRoZW4KKwkgICAgICAoIGNkICIkb3V0cHV0X29iamRpciIgJiYgXAorCSAgICAgICAgJFJNICIke3JlYWxuYW1lfVQiICYmIFwKKwkJJE1WICIke3JlYWxuYW1lfVUiICIkcmVhbG5hbWUiICkKKwkgICAgZmkKKworCSAgICBleGl0ICRsdF9leGl0CisJICB9CisJZG9uZQorCUlGUz0iJHNhdmVfaWZzIgorCisJIyBSZXN0b3JlIHRoZSB1bmluc3RhbGxlZCBsaWJyYXJ5IGFuZCBleGl0CisJaWYgdGVzdCAiJG1vZGUiID0gcmVsaW5rOyB0aGVuCisJICAkb3B0X2RyeV9ydW4gfHwgZXZhbCAnKGNkICRvdXRwdXRfb2JqZGlyICYmICRSTSAke3JlYWxuYW1lfVQgJiYgJE1WICRyZWFsbmFtZSAke3JlYWxuYW1lfVQgJiYgJE1WICR7cmVhbG5hbWV9VSAkcmVhbG5hbWUpJyB8fCBleGl0ICQ/CisKKwkgIGlmIHRlc3QgLW4gIiRjb252ZW5pZW5jZSI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgICAgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCSAgICBmaQorCSAgZmkKKworCSAgZXhpdCAkRVhJVF9TVUNDRVNTCisJZmkKKworCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCisJZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisJICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCisJICAgIGZ1bmNfc2hvd19ldmFsICcoY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRsaW5rbmFtZSIgJiYgJExOX1MgIiRyZWFsbmFtZSIgIiRsaW5rbmFtZSIpJyAnZXhpdCAkPycKKwkgIGZpCisJZG9uZQorCisJIyBJZiAtbW9kdWxlIG9yIC1leHBvcnQtZHluYW1pYyB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGRsbmFtZS4KKwlpZiB0ZXN0ICIkbW9kdWxlIiA9IHllcyB8fCB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisJICAjIE9uIGFsbCBrbm93biBvcGVyYXRpbmcgc3lzdGVtcywgdGhlc2UgYXJlIGlkZW50aWNhbC4KKwkgIGRsbmFtZT0iJHNvbmFtZSIKKwlmaQorICAgICAgZmkKKyAgICAgIDs7CisKKyAgICBvYmopCisgICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIiB8fCB0ZXN0ICIkZGxzZWxmIiAhPSBubzsgdGhlbgorCWZ1bmNfd2FybmluZyAiXGAtZGxvcGVuJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorICAgICAgZmkKKworICAgICAgY2FzZSAiICRkZXBsaWJzIiBpbgorICAgICAgKlwgLWwqIHwgKlwgLUwqKQorCWZ1bmNfd2FybmluZyAiXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBvYmplY3RzIiA7OworICAgICAgZXNhYworCisgICAgICB0ZXN0IC1uICIkcnBhdGgiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJwYXRoJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkeHJwYXRoIiAmJiBcCisJZnVuY193YXJuaW5nICJcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIgorCisgICAgICB0ZXN0IC1uICIkdmluZm8iICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiCisKKyAgICAgIGNhc2UgJG91dHB1dCBpbgorICAgICAgKi5sbykKKwl0ZXN0IC1uICIkb2JqcyRvbGRfZGVwbGlicyIgJiYgXAorCSAgZnVuY19mYXRhbF9lcnJvciAiY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIgorCisJbGlib2JqPSRvdXRwdXQKKwlmdW5jX2xvMm8gIiRsaWJvYmoiCisJb2JqPSRmdW5jX2xvMm9fcmVzdWx0CisJOzsKKyAgICAgICopCisJbGlib2JqPQorCW9iaj0iJG91dHB1dCIKKwk7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvYmogJGxpYm9iagorCisgICAgICAjIE9iamVjdHMgZnJvbSBjb252ZW5pZW5jZSBsaWJyYXJpZXMuICBUaGlzIGFzc3VtZXMKKyAgICAgICMgc2luZ2xlLXZlcnNpb24gY29udmVuaWVuY2UgbGlicmFyaWVzLiAgV2hlbmV2ZXIgd2UgY3JlYXRlCisgICAgICAjIGRpZmZlcmVudCBvbmVzIGZvciBQSUMvbm9uLVBJQywgdGhpcyB3ZSdsbCBoYXZlIHRvIGR1cGxpY2F0ZQorICAgICAgIyB0aGUgZXh0cmFjdGlvbi4KKyAgICAgIHJlbG9hZF9jb252X29ianM9CisgICAgICBnZW50b3A9CisgICAgICAjIHJlbG9hZF9jbWRzIHJ1bnMgJExEIGRpcmVjdGx5LCBzbyBsZXQgdXMgZ2V0IHJpZCBvZgorICAgICAgIyAtV2wgZnJvbSB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYyBhbmQgaG9wZSB3ZSBjYW4gZ2V0IGJ5IHdpdGgKKyAgICAgICMgdHVybmluZyBjb21tYSBpbnRvIHNwYWNlLi4KKyAgICAgIHdsPQorCisgICAgICBpZiB0ZXN0IC1uICIkY29udmVuaWVuY2UiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgorCSAgZXZhbCB0bXBfd2hvbGVfYXJjaGl2ZV9mbGFncz1cIiR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlY1wiCisJICByZWxvYWRfY29udl9vYmpzPSRyZWxvYWRfb2Jqc1wgYCRFQ0hPICJYJHRtcF93aG9sZV9hcmNoaXZlX2ZsYWdzIiB8ICRYc2VkIC1lICdzfCx8IHxnJ2AKKwllbHNlCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b2JqfXgiCisJICBnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJGdlbnRvcCIKKworCSAgZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGNvbnZlbmllbmNlCisJICByZWxvYWRfY29udl9vYmpzPSIkcmVsb2FkX29ianMgJGZ1bmNfZXh0cmFjdF9hcmNoaXZlc19yZXN1bHQiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgQ3JlYXRlIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgorICAgICAgcmVsb2FkX29ianM9IiRvYmpzJG9sZF9kZXBsaWJzICJgJEVDSE8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSQnL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgIiAkcmVsb2FkX2NvbnZfb2JqcyIgIyMjIHRlc3RzdWl0ZTogc2tpcCBuZXN0ZWQgcXVvdGluZyB0ZXN0CisKKyAgICAgIG91dHB1dD0iJG9iaiIKKyAgICAgIGZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworCisgICAgICAjIEV4aXQgaWYgd2UgYXJlbid0IGRvaW5nIGEgbGlicmFyeSBvYmplY3QgZmlsZS4KKyAgICAgIGlmIHRlc3QgLXogIiRsaWJvYmoiOyB0aGVuCisJaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwkgIGZ1bmNfc2hvd19ldmFsICcke1JNfXIgIiRnZW50b3AiJworCWZpCisKKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorCWlmIHRlc3QgLW4gIiRnZW50b3AiOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKwlmaQorCisJIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKKwkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorCSMgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKwkjICRvcHRfZHJ5X3J1biB8fCBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KKwlleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgfHwgdGVzdCAiJHBpY19tb2RlIiAhPSBkZWZhdWx0OyB0aGVuCisJIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKwlyZWxvYWRfb2Jqcz0iJGxpYm9ianMgJHJlbG9hZF9jb252X29ianMiCisJb3V0cHV0PSIkbGlib2JqIgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcmVsb2FkX2NtZHMiICdleGl0ICQ/JworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGdlbnRvcCI7IHRoZW4KKwlmdW5jX3Nob3dfZXZhbCAnJHtSTX1yICIkZ2VudG9wIicKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgJEVYSVRfU1VDQ0VTUworICAgICAgOzsKKworICAgIHByb2cpCisgICAgICBjYXNlICRob3N0IGluCisJKmN5Z3dpbiopIGZ1bmNfc3RyaXBuYW1lICcnICcuZXhlJyAiJG91dHB1dCIKKwkgICAgICAgICAgb3V0cHV0PSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQuZXhlOzsKKyAgICAgIGVzYWMKKyAgICAgIHRlc3QgLW4gIiR2aW5mbyIgJiYgXAorCWZ1bmNfd2FybmluZyAiXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIKKworICAgICAgdGVzdCAtbiAiJHJlbGVhc2UiICYmIFwKKwlmdW5jX3dhcm5pbmcgIlxgLXJlbGVhc2UnIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIgorCisgICAgICB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgXAorICAgICAgICAmJiB0ZXN0ICIkZGxvcGVuX3N1cHBvcnQiID0gdW5rbm93biBcCisJJiYgdGVzdCAiJGRsb3Blbl9zZWxmIiA9IHVua25vd24gXAorCSYmIHRlc3QgIiRkbG9wZW5fc2VsZl9zdGF0aWMiID0gdW5rbm93biAmJiBcCisJICBmdW5jX3dhcm5pbmcgIlxgTFRfSU5JVChbZGxvcGVuXSknIG5vdCB1c2VkLiBBc3N1bWluZyBubyBkbG9wZW4gc3VwcG9ydC4iCisKKyAgICAgIGNhc2UgJGhvc3QgaW4KKyAgICAgICotKi1yaGFwc29keSogfCAqLSotZGFyd2luMS5bMDEyXSkKKwkjIE9uIFJoYXBzb2R5IHJlcGxhY2UgdGhlIEMgbGlicmFyeSBpcyB0aGUgU3lzdGVtIGZyYW1ld29yaworCWNvbXBpbGVfZGVwbGlicz1gJEVDSE8gIlggJGNvbXBpbGVfZGVwbGlicyIgfCAkWHNlZCAtZSAncy8gLWxjIC8gU3lzdGVtLmx0ZnJhbWV3b3JrIC8nYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMgLyBTeXN0ZW0ubHRmcmFtZXdvcmsgLydgCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKi0qLWRhcndpbiopCisJIyBEb24ndCBhbGxvdyBsYXp5IGxpbmtpbmcsIGl0IGJyZWFrcyBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycworCSMgQnV0IGlzIHN1cHBvc2VkbHkgZml4ZWQgb24gMTAuNCBvciBsYXRlciAoeWF5ISkuCisJaWYgdGVzdCAiJHRhZ25hbWUiID0gQ1hYIDsgdGhlbgorCSAgY2FzZSAke01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC0xMC4wfSBpbgorCSAgICAxMC5bMDEyM10pCisJICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICR7d2x9LWJpbmRfYXRfbG9hZCIKKwkgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAke3dsfS1iaW5kX2F0X2xvYWQiCisJICAgIDs7CisJICBlc2FjCisJZmkKKwkjIFRpbWUgdG8gY2hhbmdlIGFsbCBvdXIgImZvby5sdGZyYW1ld29yayIgc3R1ZmYgYmFjayB0byAiLWZyYW1ld29yayBmb28iCisJY29tcGlsZV9kZXBsaWJzPWAkRUNITyAiWCAkY29tcGlsZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCWZpbmFsaXplX2RlcGxpYnM9YCRFQ0hPICJYICRmaW5hbGl6ZV9kZXBsaWJzIiB8ICRYc2VkIC1lICdzJSBcKFteICRdKlwpLmx0ZnJhbWV3b3JrJSAtZnJhbWV3b3JrIFwxJWcnYAorCTs7CisgICAgICBlc2FjCisKKworICAgICAgIyBtb3ZlIGxpYnJhcnkgc2VhcmNoIHBhdGhzIHRoYXQgY29pbmNpZGUgd2l0aCBwYXRocyB0byBub3QgeWV0CisgICAgICAjIGluc3RhbGxlZCBsaWJyYXJpZXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlicmFyeSBzZWFyY2ggbGlzdAorICAgICAgbmV3X2xpYnM9CisgICAgICBmb3IgcGF0aCBpbiAkbm90aW5zdF9wYXRoOyBkbworCWNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSoiIC1MJHBhdGgvJG9iamRpciAiKikgOzsKKwkqKQorCSAgY2FzZSAiICRjb21waWxlX2RlcGxpYnMgIiBpbgorCSAgKiIgLUwkcGF0aC8kb2JqZGlyICIqKQorCSAgICBuZXdfbGlicz0iJG5ld19saWJzIC1MJHBhdGgvJG9iamRpciIgOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgZm9yIGRlcGxpYiBpbiAkY29tcGlsZV9kZXBsaWJzOyBkbworCWNhc2UgJGRlcGxpYiBpbgorCS1MKikKKwkgIGNhc2UgIiAkbmV3X2xpYnMgIiBpbgorCSAgKiIgJGRlcGxpYiAiKikgOzsKKwkgICopIG5ld19saWJzPSIkbmV3X2xpYnMgJGRlcGxpYiIgOzsKKwkgIGVzYWMKKwkgIDs7CisJKikgbmV3X2xpYnM9IiRuZXdfbGlicyAkZGVwbGliIiA7OworCWVzYWMKKyAgICAgIGRvbmUKKyAgICAgIGNvbXBpbGVfZGVwbGlicz0iJG5ld19saWJzIgorCisKKyAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkY29tcGlsZV9kZXBsaWJzIgorICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGZpbmFsaXplX2RlcGxpYnMiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCR4cnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoICR4cnBhdGg7IGRvCisJICAjIFRoaXMgaXMgdGhlIG1hZ2ljIHRvIHVzZSAtcnBhdGguCisJICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgorCSAgKiIgJGxpYmRpciAiKikgOzsKKwkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlkb25lCisgICAgICBmaQorCisgICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorCWNhc2UgJGhvc3QgaW4KKwkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotcHczMiogfCAqLSotb3MyKiB8ICotY2VnY2MqKQorCSAgdGVzdGJpbmRpcj1gJHtFQ0hPfSAiJGxpYmRpciIgfCAke1NFRH0gLWUgJ3MqL2xpYiQqL2JpbionYAorCSAgY2FzZSA6JGRsbHNlYXJjaHBhdGg6IGluCisJICAqIjokbGliZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JGxpYmRpcjs7CisJICAqKSBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNocGF0aDokbGliZGlyIjs7CisJICBlc2FjCisJICBjYXNlIDokZGxsc2VhcmNocGF0aDogaW4KKwkgICoiOiR0ZXN0YmluZGlyOiIqKSA7OworCSAgOjopIGRsbHNlYXJjaHBhdGg9JHRlc3RiaW5kaXI7OworCSAgKikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaHBhdGg6JHRlc3RiaW5kaXIiOzsKKwkgIGVzYWMKKwkgIDs7CisJZXNhYworICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGNvbXBpbGVfcnBhdGg9IiRycGF0aCIKKworICAgICAgcnBhdGg9CisgICAgICBoYXJkY29kZV9saWJkaXJzPQorICAgICAgZm9yIGxpYmRpciBpbiAkZmluYWxpemVfcnBhdGg7IGRvCisJaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCisJICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCisJICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKKwkgICAgZWxzZQorCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KKwkgICAgICBjYXNlICRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGhhcmRjb2RlX2xpYmRpcnMkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciBpbgorCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJOzsKKwkgICAgICAqKQorCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKKwkJOzsKKwkgICAgICBlc2FjCisJICAgIGZpCisJICBlbHNlCisJICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKwkgICAgcnBhdGg9IiRycGF0aCAkZmxhZyIKKwkgIGZpCisJZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJICBjYXNlICIkZmluYWxpemVfcGVybV9ycGF0aCAiIGluCisJICAqIiAkbGliZGlyICIqKSA7OworCSAgKikgZmluYWxpemVfcGVybV9ycGF0aD0iJGZpbmFsaXplX3Blcm1fcnBhdGggJGxpYmRpciIgOzsKKwkgIGVzYWMKKwlmaQorICAgICAgZG9uZQorICAgICAgIyBTdWJzdGl0dXRlIHRoZSBoYXJkY29kZWQgbGliZGlycyBpbnRvIHRoZSBycGF0aC4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiAmJgorCSB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlycyI7IHRoZW4KKwlsaWJkaXI9IiRoYXJkY29kZV9saWJkaXJzIgorCWV2YWwgcnBhdGg9XCIgJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgorICAgICAgZmkKKyAgICAgIGZpbmFsaXplX3JwYXRoPSIkcnBhdGgiCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisJIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgorCWNvbXBpbGVfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCisJZmluYWxpemVfY29tbWFuZD1gJEVDSE8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAorICAgICAgZmkKKworICAgICAgZnVuY19nZW5lcmF0ZV9kbHN5bXMgIiRvdXRwdXRuYW1lIiAiQFBST0dSQU1AIiAibm8iCisKKyAgICAgICMgdGVtcGxhdGUgcHJlbGlua2luZyBzdGVwCisgICAgICBpZiB0ZXN0IC1uICIkcHJlbGlua19jbWRzIjsgdGhlbgorCWZ1bmNfZXhlY3V0ZV9jbWRzICIkcHJlbGlua19jbWRzIiAnZXhpdCAkPycKKyAgICAgIGZpCisKKyAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPXllcworICAgICAgY2FzZSAkaG9zdCBpbgorICAgICAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgICpjZWdjYykKKyAgICAgICAgIyBEaXNhYmxlIHdyYXBwZXJzIGZvciBjZWdjYywgd2UgYXJlIGNyb3NzIGNvbXBpbGluZyBhbnl3YXkuCisgICAgICAgIHdyYXBwZXJzX3JlcXVpcmVkPW5vCisgICAgICAgIDs7CisgICAgICAqKQorICAgICAgICBpZiB0ZXN0ICIkbmVlZF9yZWxpbmsiID0gbm8gfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICAgd3JhcHBlcnNfcmVxdWlyZWQ9bm8KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgIGlmIHRlc3QgIiR3cmFwcGVyc19yZXF1aXJlZCIgPSBubzsgdGhlbgorCSMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKwljb21waWxlX2NvbW1hbmQ9YCRFQ0hPICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXQiJyVnJ2AKKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKworCSMgV2UgaGF2ZSBubyB1bmluc3RhbGxlZCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgc28gZmluYWxpemUgcmlnaHQgbm93LgorCWV4aXRfc3RhdHVzPTAKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXRfc3RhdHVzPSQ/JworCisJIyBEZWxldGUgdGhlIGdlbmVyYXRlZCBmaWxlcy4KKwlpZiB0ZXN0IC1mICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iOyB0aGVuCisJICBmdW5jX3Nob3dfZXZhbCAnJFJNICIkb3V0cHV0X29iamRpci8ke291dHB1dG5hbWV9Uy4ke29iamV4dH0iJworCWZpCisKKwlleGl0ICRleGl0X3N0YXR1cworICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoJGZpbmFsaXplX3NobGlicGF0aFwkJHNobGlicGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgZmkKKyAgICAgIGlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9zaGxpYnBhdGgiOyB0aGVuCisJZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY29tcGlsZV92YXI9CisgICAgICBmaW5hbGl6ZV92YXI9CisgICAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisJaWYgdGVzdCAtbiAiJHBlcm1fcnBhdGgiOyB0aGVuCisJICAjIFdlIHNob3VsZCBzZXQgdGhlIHJ1bnBhdGhfdmFyLgorCSAgcnBhdGg9CisJICBmb3IgZGlyIGluICRwZXJtX3JwYXRoOyBkbworCSAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisJICBkb25lCisJICBjb21waWxlX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKwlpZiB0ZXN0IC1uICIkZmluYWxpemVfcGVybV9ycGF0aCI7IHRoZW4KKwkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCisJICBycGF0aD0KKwkgIGZvciBkaXIgaW4gJGZpbmFsaXplX3Blcm1fcnBhdGg7IGRvCisJICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKKwkgIGRvbmUKKwkgIGZpbmFsaXplX3Zhcj0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAiCisJZmkKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgIiRub19pbnN0YWxsIiA9IHllczsgdGhlbgorCSMgV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSB3cmFwcGVyIHNjcmlwdC4KKwlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkjIFJlcGxhY2UgdGhlIG91dHB1dCBmaWxlIHNwZWNpZmljYXRpb24uCisJbGlua19jb21tYW5kPWAkRUNITyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisJIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKwkkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQKKwkjIExpbmsgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXQKKwlmdW5jX3Nob3dfZXZhbCAiJGxpbmtfY29tbWFuZCIgJ2V4aXQgJD8nCisJZXhpdCAkRVhJVF9TVUNDRVNTCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgorCSMgRmFzdCBpbnN0YWxsYXRpb24gaXMgbm90IHN1cHBvcnRlZAorCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgorCXJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisKKwlmdW5jX3dhcm5pbmcgInRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIgorCWZ1bmNfd2FybmluZyAiXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iCisgICAgICBlbHNlCisJaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgIT0gbm87IHRoZW4KKwkgIGxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRjb21waWxlX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IHllczsgdGhlbgorCSAgICByZWxpbmtfY29tbWFuZD1gJEVDSE8gIlgkY29tcGlsZV92YXIkY29tcGlsZV9jb21tYW5kJGNvbXBpbGVfcnBhdGgiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlXCRwcm9nZGlyL1wkZmlsZSVnJ2AKKwkgIGVsc2UKKwkgICAgIyBmYXN0X2luc3RhbGwgaXMgc2V0IHRvIG5lZWRsZXNzCisJICAgIHJlbGlua19jb21tYW5kPQorCSAgZmkKKwllbHNlCisJICBsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKKwkgIHJlbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGZpbmFsaXplX2NvbW1hbmQkZmluYWxpemVfcnBhdGgiCisJZmkKKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGxpbmtfY29tbWFuZD1gJEVDSE8gIlgkbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiJyVnJ2AKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZXMuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgJFJNICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKKworICAgICAgZnVuY19zaG93X2V2YWwgIiRsaW5rX2NvbW1hbmQiICdleGl0ICQ/JworCisgICAgICAjIE5vdyBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0LgorICAgICAgZnVuY192ZXJib3NlICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCisJIyBQcmVzZXJ2ZSBhbnkgdmFyaWFibGVzIHRoYXQgbWF5IGFmZmVjdCBjb21waWxlciBiZWhhdmlvcgorCWZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCSAgaWYgZXZhbCB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9InsgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiIHx8ICRsdF91bnNldCAkdmFyIHx8IHsgJHZhcj07IGV4cG9ydCAkdmFyOyB9OyB9OyAkcmVsaW5rX2NvbW1hbmQiCisJICBlbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgICAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCSAgZWxzZQorCSAgICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgICByZWxpbmtfY29tbWFuZD0iJHZhcj0kZnVuY19xdW90ZV9mb3JfZXZhbF9yZXN1bHQ7IGV4cG9ydCAkdmFyOyAkcmVsaW5rX2NvbW1hbmQiCisJICBmaQorCWRvbmUKKwlyZWxpbmtfY29tbWFuZD0iKGNkIGBwd2RgOyAkcmVsaW5rX2NvbW1hbmQpIgorCXJlbGlua19jb21tYW5kPWAkRUNITyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIFF1b3RlICRFQ0hPIGZvciBzaGlwcGluZy4KKyAgICAgIGlmIHRlc3QgIlgkRUNITyIgPSAiWCRTSEVMTCAkcHJvZ3BhdGggLS1mYWxsYmFjay1lY2hvIjsgdGhlbgorCWNhc2UgJHByb2dwYXRoIGluCisJW1xcL10qIHwgW0EtWmEtel06W1xcL10qKSBxZWNobz0iJFNIRUxMICRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyRwcm9ncGF0aCAtLWZhbGxiYWNrLWVjaG8iOzsKKwllc2FjCisJcWVjaG89YCRFQ0hPICJYJHFlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGVsc2UKKwlxZWNobz1gJEVDSE8gIlgkRUNITyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBmaQorCisgICAgICAjIE9ubHkgYWN0dWFsbHkgZG8gdGhpbmdzIGlmIG5vdCBpbiBkcnkgcnVuIG1vZGUuCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCSMgd2luMzIgd2lsbCB0aGluayB0aGUgc2NyaXB0IGlzIGEgYmluYXJ5IGlmIGl0IGhhcworCSMgYSAuZXhlIHN1ZmZpeCwgc28gd2Ugc3RyaXAgaXQgb2ZmIGhlcmUuCisJY2FzZSAkb3V0cHV0IGluCisJICAqLmV4ZSkgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkb3V0cHV0IgorCSAgICAgICAgIG91dHB1dD0kZnVuY19zdHJpcG5hbWVfcmVzdWx0IDs7CisJZXNhYworCSMgdGVzdCBmb3IgY3lnd2luIGJlY2F1c2UgbXYgZmFpbHMgdy9vIC5leGUgZXh0ZW5zaW9ucworCWNhc2UgJGhvc3QgaW4KKwkgICpjeWd3aW4qKQorCSAgICBleGVleHQ9LmV4ZQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRvdXRwdXRuYW1lIgorCSAgICBvdXRwdXRuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQgOzsKKwkgICopIGV4ZWV4dD0gOzsKKwllc2FjCisJY2FzZSAkaG9zdCBpbgorCSAgKmN5Z3dpbiogfCAqbWluZ3cqICkKKwkgICAgZnVuY19kaXJuYW1lX2FuZF9iYXNlbmFtZSAiJG91dHB1dCIgIiIgIi4iCisJICAgIG91dHB1dF9uYW1lPSRmdW5jX2Jhc2VuYW1lX3Jlc3VsdAorCSAgICBvdXRwdXRfcGF0aD0kZnVuY19kaXJuYW1lX3Jlc3VsdAorCSAgICBjd3JhcHBlcnNvdXJjZT0iJG91dHB1dF9wYXRoLyRvYmpkaXIvbHQtJG91dHB1dF9uYW1lLmMiCisJICAgIGN3cmFwcGVyPSIkb3V0cHV0X3BhdGgvJG91dHB1dF9uYW1lLmV4ZSIKKwkgICAgJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXIKKwkgICAgdHJhcCAiJFJNICRjd3JhcHBlcnNvdXJjZSAkY3dyYXBwZXI7IGV4aXQgJEVYSVRfRkFJTFVSRSIgMSAyIDE1CisKKwkgICAgZnVuY19lbWl0X2N3cmFwcGVyZXhlX3NyYyA+ICRjd3JhcHBlcnNvdXJjZQorCisJICAgICMgVGhlIHdyYXBwZXIgZXhlY3V0YWJsZSBpcyBidWlsdCB1c2luZyB0aGUgJGhvc3QgY29tcGlsZXIsCisJICAgICMgYmVjYXVzZSBpdCBjb250YWlucyAkaG9zdCBwYXRocyBhbmQgZmlsZXMuIElmIGNyb3NzLQorCSAgICAjIGNvbXBpbGluZywgaXQsIGxpa2UgdGhlIHRhcmdldCBleGVjdXRhYmxlLCBtdXN0IGJlCisJICAgICMgZXhlY3V0ZWQgb24gdGhlICRob3N0IG9yIHVuZGVyIGFuIGVtdWxhdGlvbiBlbnZpcm9ubWVudC4KKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAkTFRDQyAkTFRDRkxBR1MgLW8gJGN3cmFwcGVyICRjd3JhcHBlcnNvdXJjZQorCSAgICAgICRTVFJJUCAkY3dyYXBwZXIKKwkgICAgfQorCisJICAgICMgTm93LCBjcmVhdGUgdGhlIHdyYXBwZXIgc2NyaXB0IGZvciBmdW5jX3NvdXJjZSB1c2U6CisJICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgJGN3cmFwcGVyCisJICAgICRSTSAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgdHJhcCAiJFJNICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKwkgICAgJG9wdF9kcnlfcnVuIHx8IHsKKwkgICAgICAjIG5vdGU6IHRoaXMgc2NyaXB0IHdpbGwgbm90IGJlIGV4ZWN1dGVkLCBzbyBkbyBub3QgY2htb2QuCisJICAgICAgaWYgdGVzdCAieCRidWlsZCIgPSAieCRob3N0IiA7IHRoZW4KKwkJJGN3cmFwcGVyIC0tbHQtZHVtcC1zY3JpcHQgPiAkZnVuY19sdHdyYXBwZXJfc2NyaXB0bmFtZV9yZXN1bHQKKwkgICAgICBlbHNlCisJCWZ1bmNfZW1pdF93cmFwcGVyIG5vID4gJGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWVfcmVzdWx0CisJICAgICAgZmkKKwkgICAgfQorCSAgOzsKKwkgICogKQorCSAgICAkUk0gJG91dHB1dAorCSAgICB0cmFwICIkUk0gJG91dHB1dDsgZXhpdCAkRVhJVF9GQUlMVVJFIiAxIDIgMTUKKworCSAgICBmdW5jX2VtaXRfd3JhcHBlciBubyA+ICRvdXRwdXQKKwkgICAgY2htb2QgK3ggJG91dHB1dAorCSAgOzsKKwllc2FjCisgICAgICB9CisgICAgICBleGl0ICRFWElUX1NVQ0NFU1MKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgZm9yIG9sZGxpYiBpbiAkb2xkbGliczsgZG8KKworICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBjb252ZW5pZW5jZTsgdGhlbgorCW9sZG9ianM9IiRsaWJvYmpzX3NhdmUgJHN5bWZpbGVvYmoiCisJYWRkbGlicz0iJGNvbnZlbmllbmNlIgorCWJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgZWxzZQorCWlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0gbW9kdWxlOyB0aGVuCisJICBvbGRvYmpzPSIkbGlib2Jqc19zYXZlIgorCSAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJZWxzZQorCSAgb2xkb2Jqcz0iJG9sZF9kZXBsaWJzICRub25fcGljX29iamVjdHMiCisJICBpZiB0ZXN0ICIkcHJlbG9hZCIgPSB5ZXMgJiYgdGVzdCAtZiAiJHN5bWZpbGVvYmoiOyB0aGVuCisJICAgIG9sZG9ianM9IiRvbGRvYmpzICRzeW1maWxlb2JqIgorCSAgZmkKKwlmaQorCWFkZGxpYnM9IiRvbGRfY29udmVuaWVuY2UiCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkYWRkbGlicyI7IHRoZW4KKwlnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCWdlbmVyYXRlZD0iJGdlbmVyYXRlZCAkZ2VudG9wIgorCisJZnVuY19leHRyYWN0X2FyY2hpdmVzICRnZW50b3AgJGFkZGxpYnMKKwlvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKyAgICAgIGZpCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJY21kcz0kb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcworICAgICAgZWxzZQorCisJIyBBZGQgYW55IG9iamVjdHMgZnJvbSBwcmVsb2FkZWQgY29udmVuaWVuY2UgbGlicmFyaWVzCisJaWYgdGVzdCAtbiAiJGRscHJlZmlsZXMiOyB0aGVuCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisKKwkgIGZ1bmNfZXh0cmFjdF9hcmNoaXZlcyAkZ2VudG9wICRkbHByZWZpbGVzCisJICBvbGRvYmpzPSIkb2xkb2JqcyAkZnVuY19leHRyYWN0X2FyY2hpdmVzX3Jlc3VsdCIKKwlmaQorCisJIyBQT1NJWCBkZW1hbmRzIG5vIHBhdGhzIHRvIGJlIGVuY29kZWQgaW4gYXJjaGl2ZXMuICBXZSBoYXZlCisJIyB0byBhdm9pZCBjcmVhdGluZyBhcmNoaXZlcyB3aXRoIGR1cGxpY2F0ZSBiYXNlbmFtZXMgaWYgd2UKKwkjIG1pZ2h0IGhhdmUgdG8gZXh0cmFjdCB0aGVtIGFmdGVyd2FyZHMsIGUuZy4sIHdoZW4gY3JlYXRpbmcgYQorCSMgc3RhdGljIGFyY2hpdmUgb3V0IG9mIGEgY29udmVuaWVuY2UgbGlicmFyeSwgb3Igd2hlbiBsaW5raW5nCisJIyB0aGUgZW50aXJldHkgb2YgYSBsaWJ0b29sIGFyY2hpdmUgaW50byBhbm90aGVyIChjdXJyZW50bHkKKwkjIG5vdCBzdXBwb3J0ZWQgYnkgbGlidG9vbCkuCisJaWYgKGZvciBvYmogaW4gJG9sZG9ianMKKwkgICAgZG8KKwkgICAgICBmdW5jX2Jhc2VuYW1lICIkb2JqIgorCSAgICAgICRFQ0hPICIkZnVuY19iYXNlbmFtZV9yZXN1bHQiCisJICAgIGRvbmUgfCBzb3J0IHwgc29ydCAtdWMgPi9kZXYvbnVsbCAyPiYxKTsgdGhlbgorCSAgOgorCWVsc2UKKwkgICRFQ0hPICJjb3B5aW5nIHNlbGVjdGVkIG9iamVjdCBmaWxlcyB0byBhdm9pZCBiYXNlbmFtZSBjb25mbGljdHMuLi4iCisJICBnZW50b3A9IiRvdXRwdXRfb2JqZGlyLyR7b3V0cHV0bmFtZX14IgorCSAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICRnZW50b3AiCisJICBmdW5jX21rZGlyX3AgIiRnZW50b3AiCisJICBzYXZlX29sZG9ianM9JG9sZG9ianMKKwkgIG9sZG9ianM9CisJICBjb3VudGVyPTEKKwkgIGZvciBvYmogaW4gJHNhdmVfb2xkb2JqcworCSAgZG8KKwkgICAgZnVuY19iYXNlbmFtZSAiJG9iaiIKKwkgICAgb2JqYmFzZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCSAgICBjYXNlICIgJG9sZG9ianMgIiBpbgorCSAgICAiICIpIG9sZG9ianM9JG9iaiA7OworCSAgICAqW1wgL10iJG9iamJhc2UgIiopCisJICAgICAgd2hpbGUgOjsgZG8KKwkJIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcGljayBhbiBhbHRlcm5hdGUgbmFtZSB0aGF0IGFsc28KKwkJIyBvdmVybGFwcy4KKwkJbmV3b2JqPWx0JGNvdW50ZXItJG9iamJhc2UKKwkJZnVuY19hcml0aCAkY291bnRlciArIDEKKwkJY291bnRlcj0kZnVuY19hcml0aF9yZXN1bHQKKwkJY2FzZSAiICRvbGRvYmpzICIgaW4KKwkJKltcIC9dIiRuZXdvYmogIiopIDs7CisJCSopIGlmIHRlc3QgISAtZiAiJGdlbnRvcC8kbmV3b2JqIjsgdGhlbiBicmVhazsgZmkgOzsKKwkJZXNhYworCSAgICAgIGRvbmUKKwkgICAgICBmdW5jX3Nob3dfZXZhbCAibG4gJG9iaiAkZ2VudG9wLyRuZXdvYmogfHwgY3AgJG9iaiAkZ2VudG9wLyRuZXdvYmoiCisJICAgICAgb2xkb2Jqcz0iJG9sZG9ianMgJGdlbnRvcC8kbmV3b2JqIgorCSAgICAgIDs7CisJICAgICopIG9sZG9ianM9IiRvbGRvYmpzICRvYmoiIDs7CisJICAgIGVzYWMKKwkgIGRvbmUKKwlmaQorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKworCWZ1bmNfbGVuICIgJGNtZHMiCisJbGVuPSRmdW5jX2xlbl9yZXN1bHQKKwlpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiIgfHwgdGVzdCAiJG1heF9jbWRfbGVuIiAtbGUgLTE7IHRoZW4KKwkgIGNtZHM9JG9sZF9hcmNoaXZlX2NtZHMKKwllbHNlCisJICAjIHRoZSBjb21tYW5kIGxpbmUgaXMgdG9vIGxvbmcgdG8gbGluayBpbiBvbmUgc3RlcCwgbGluayBpbiBwYXJ0cworCSAgZnVuY192ZXJib3NlICJ1c2luZyBwaWVjZXdpc2UgYXJjaGl2ZSBsaW5raW5nLi4uIgorCSAgc2F2ZV9SQU5MSUI9JFJBTkxJQgorCSAgUkFOTElCPToKKwkgIG9iamxpc3Q9CisJICBjb25jYXRfY21kcz0KKwkgIHNhdmVfb2xkb2Jqcz0kb2xkb2JqcworCSAgb2xkb2Jqcz0KKwkgICMgSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IG9mIGZpbmRpbmcgdGhlIGxhc3Qgb2JqZWN0IGluIHRoZSBsaXN0PworCSAgZm9yIG9iaiBpbiAkc2F2ZV9vbGRvYmpzCisJICBkbworCSAgICBsYXN0X29sZG9iaj0kb2JqCisJICBkb25lCisJICBldmFsIHRlc3RfY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKwkgIGZ1bmNfbGVuICIgJHRlc3RfY21kcyIKKwkgIGxlbjA9JGZ1bmNfbGVuX3Jlc3VsdAorCSAgbGVuPSRsZW4wCisJICBmb3Igb2JqIGluICRzYXZlX29sZG9ianMKKwkgIGRvCisJICAgIGZ1bmNfbGVuICIgJG9iaiIKKwkgICAgZnVuY19hcml0aCAkbGVuICsgJGZ1bmNfbGVuX3Jlc3VsdAorCSAgICBsZW49JGZ1bmNfYXJpdGhfcmVzdWx0CisJICAgIGZ1bmNfYXBwZW5kIG9iamxpc3QgIiAkb2JqIgorCSAgICBpZiB0ZXN0ICIkbGVuIiAtbHQgIiRtYXhfY21kX2xlbiI7IHRoZW4KKwkgICAgICA6CisJICAgIGVsc2UKKwkgICAgICAjIHRoZSBhYm92ZSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGJlZm9yZSBpdCBnZXRzIHRvbyBsb25nCisJICAgICAgb2xkb2Jqcz0kb2JqbGlzdAorCSAgICAgIGlmIHRlc3QgIiRvYmoiID0gIiRsYXN0X29sZG9iaiIgOyB0aGVuCisJCVJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgICAgICBmaQorCSAgICAgIHRlc3QgLXogIiRjb25jYXRfY21kcyIgfHwgY29uY2F0X2NtZHM9JGNvbmNhdF9jbWRzfgorCSAgICAgIGV2YWwgY29uY2F0X2NtZHM9XCJcJHtjb25jYXRfY21kc30kb2xkX2FyY2hpdmVfY21kc1wiCisJICAgICAgb2JqbGlzdD0KKwkgICAgICBsZW49JGxlbjAKKwkgICAgZmkKKwkgIGRvbmUKKwkgIFJBTkxJQj0kc2F2ZV9SQU5MSUIKKwkgIG9sZG9ianM9JG9iamxpc3QKKwkgIGlmIHRlc3QgIlgkb2xkb2JqcyIgPSAiWCIgOyB0aGVuCisJICAgIGV2YWwgY21kcz1cIlwkY29uY2F0X2NtZHNcIgorCSAgZWxzZQorCSAgICBldmFsIGNtZHM9XCJcJGNvbmNhdF9jbWRzflwkb2xkX2FyY2hpdmVfY21kc1wiCisJICBmaQorCWZpCisgICAgICBmaQorICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRjbWRzIiAnZXhpdCAkPycKKyAgICBkb25lCisKKyAgICB0ZXN0IC1uICIkZ2VuZXJhdGVkIiAmJiBcCisgICAgICBmdW5jX3Nob3dfZXZhbCAiJHtSTX1yJGdlbmVyYXRlZCIKKworICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgorICAgIGNhc2UgJG91dHB1dCBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLiRsaWJleHQiCisgICAgICBmdW5jX3ZlcmJvc2UgImNyZWF0aW5nICRvdXRwdXQiCisKKyAgICAgICMgUHJlc2VydmUgYW55IHZhcmlhYmxlcyB0aGF0IG1heSBhZmZlY3QgY29tcGlsZXIgYmVoYXZpb3IKKyAgICAgIGZvciB2YXIgaW4gJHZhcmlhYmxlc19zYXZlZF9mb3JfcmVsaW5rOyBkbworCWlmIGV2YWwgdGVzdCAteiBcIlwkeyR2YXIrc2V0fVwiOyB0aGVuCisJICByZWxpbmtfY29tbWFuZD0ieyB0ZXN0IC16IFwiXCR7JHZhcitzZXR9XCIgfHwgJGx0X3Vuc2V0ICR2YXIgfHwgeyAkdmFyPTsgZXhwb3J0ICR2YXI7IH07IH07ICRyZWxpbmtfY29tbWFuZCIKKwllbGlmIGV2YWwgdmFyX3ZhbHVlPVwkJHZhcjsgdGVzdCAteiAiJHZhcl92YWx1ZSI7IHRoZW4KKwkgIHJlbGlua19jb21tYW5kPSIkdmFyPTsgZXhwb3J0ICR2YXI7ICRyZWxpbmtfY29tbWFuZCIKKwllbHNlCisJICBmdW5jX3F1b3RlX2Zvcl9ldmFsICIkdmFyX3ZhbHVlIgorCSAgcmVsaW5rX2NvbW1hbmQ9IiR2YXI9JGZ1bmNfcXVvdGVfZm9yX2V2YWxfcmVzdWx0OyBleHBvcnQgJHZhcjsgJHJlbGlua19jb21tYW5kIgorCWZpCisgICAgICBkb25lCisgICAgICAjIFF1b3RlIHRoZSBsaW5rIGNvbW1hbmQgZm9yIHNoaXBwaW5nLgorICAgICAgcmVsaW5rX2NvbW1hbmQ9IihjZCBgcHdkYDsgJFNIRUxMICRwcm9ncGF0aCAkcHJlc2VydmVfYXJncyAtLW1vZGU9cmVsaW5rICRsaWJ0b29sX2FyZ3MgQGluc3RfcHJlZml4X2RpckApIgorICAgICAgcmVsaW5rX2NvbW1hbmQ9YCRFQ0hPICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9hdXRvbWF0aWMiID0geWVzIDsgdGhlbgorCXJlbGlua19jb21tYW5kPQorICAgICAgZmkKKworICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCisgICAgICAkb3B0X2RyeV9ydW4gfHwgeworCWZvciBpbnN0YWxsZWQgaW4gbm8geWVzOyBkbworCSAgaWYgdGVzdCAiJGluc3RhbGxlZCIgPSB5ZXM7IHRoZW4KKwkgICAgaWYgdGVzdCAteiAiJGluc3RhbGxfbGliZGlyIjsgdGhlbgorCSAgICAgIGJyZWFrCisJICAgIGZpCisJICAgIG91dHB1dD0iJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUiaQorCSAgICAjIFJlcGxhY2UgYWxsIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzIHdpdGggdGhlIGluc3RhbGxlZCBvbmVzCisJICAgIG5ld2RlcGVuZGVuY3lfbGlicz0KKwkgICAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbworCSAgICAgIGNhc2UgJGRlcGxpYiBpbgorCSAgICAgICoubGEpCisJCWZ1bmNfYmFzZW5hbWUgIiRkZXBsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGRlcGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGRlcGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQluZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGxpYmRpci8kbmFtZSIKKwkJOzsKKwkgICAgICAqKSBuZXdkZXBlbmRlbmN5X2xpYnM9IiRuZXdkZXBlbmRlbmN5X2xpYnMgJGRlcGxpYiIgOzsKKwkgICAgICBlc2FjCisJICAgIGRvbmUKKwkgICAgZGVwZW5kZW5jeV9saWJzPSIkbmV3ZGVwZW5kZW5jeV9saWJzIgorCSAgICBuZXdkbGZpbGVzPQorCisJICAgIGZvciBsaWIgaW4gJGRsZmlsZXM7IGRvCisJICAgICAgY2FzZSAkbGliIGluCisJICAgICAgKi5sYSkKKwkgICAgICAgIGZ1bmNfYmFzZW5hbWUgIiRsaWIiCisJCW5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKwkJZXZhbCBsaWJkaXI9YCR7U0VEfSAtbiAtZSAncy9ebGliZGlyPVwoLipcKSQvXDEvcCcgJGxpYmAKKwkJdGVzdCAteiAiJGxpYmRpciIgJiYgXAorCQkgIGZ1bmNfZmF0YWxfZXJyb3IgIlxgJGxpYicgaXMgbm90IGEgdmFsaWQgbGlidG9vbCBhcmNoaXZlIgorCQluZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkbGliZGlyLyRuYW1lIgorCQk7OworCSAgICAgICopIG5ld2RsZmlsZXM9IiRuZXdkbGZpbGVzICRsaWIiIDs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCSAgICAgICoubGEpCisJCSMgT25seSBwYXNzIHByZW9wZW5lZCBmaWxlcyB0byB0aGUgcHNldWRvLWFyY2hpdmUgKGZvcgorCQkjIGV2ZW50dWFsIGxpbmtpbmcgd2l0aCB0aGUgYXBwLiB0aGF0IGxpbmtzIGl0KSBpZiB3ZQorCQkjIGRpZG4ndCBhbHJlYWR5IGxpbmsgdGhlIHByZW9wZW5lZCBvYmplY3RzIGRpcmVjdGx5IGludG8KKwkJIyB0aGUgbGlicmFyeToKKwkJZnVuY19iYXNlbmFtZSAiJGxpYiIKKwkJbmFtZT0iJGZ1bmNfYmFzZW5hbWVfcmVzdWx0IgorCQlldmFsIGxpYmRpcj1gJHtTRUR9IC1uIC1lICdzL15saWJkaXI9XCguKlwpJC9cMS9wJyAkbGliYAorCQl0ZXN0IC16ICIkbGliZGlyIiAmJiBcCisJCSAgZnVuY19mYXRhbF9lcnJvciAiXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiCisJCW5ld2RscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzICRsaWJkaXIvJG5hbWUiCisJCTs7CisJICAgICAgZXNhYworCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZWxzZQorCSAgICBuZXdkbGZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbGZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbGZpbGVzPSIkbmV3ZGxmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRsZmlsZXM9IiRuZXdkbGZpbGVzIgorCSAgICBuZXdkbHByZWZpbGVzPQorCSAgICBmb3IgbGliIGluICRkbHByZWZpbGVzOyBkbworCSAgICAgIGNhc2UgJGxpYiBpbgorCQlbXFwvXSogfCBbQS1aYS16XTpbXFwvXSopIGFicz0iJGxpYiIgOzsKKwkJKikgYWJzPWBwd2RgIi8kbGliIiA7OworCSAgICAgIGVzYWMKKwkgICAgICBuZXdkbHByZWZpbGVzPSIkbmV3ZGxwcmVmaWxlcyAkYWJzIgorCSAgICBkb25lCisJICAgIGRscHJlZmlsZXM9IiRuZXdkbHByZWZpbGVzIgorCSAgZmkKKwkgICRSTSAkb3V0cHV0CisJICAjIHBsYWNlIGRsbmFtZSBpbiBjb3JyZWN0IHBvc2l0aW9uIGZvciBjeWd3aW4KKwkgIHRkbG5hbWU9JGRsbmFtZQorCSAgY2FzZSAkaG9zdCwkb3V0cHV0LCRpbnN0YWxsZWQsJG1vZHVsZSwkZGxuYW1lIGluCisJICAgICpjeWd3aW4qLCpsYWkseWVzLG5vLCouZGxsIHwgKm1pbmd3KiwqbGFpLHllcyxubywqLmRsbCB8ICpjZWdjYyosKmxhaSx5ZXMsbm8sKi5kbGwpIHRkbG5hbWU9Li4vYmluLyRkbG5hbWUgOzsKKwkgIGVzYWMKKwkgICRFQ0hPID4gJG91dHB1dCAiXAorIyAkb3V0cHV0bmFtZSAtIGEgbGlidG9vbCBsaWJyYXJ5IGZpbGUKKyMgR2VuZXJhdGVkIGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UkVElNRVNUQU1QKSAkVkVSU0lPTgorIworIyBQbGVhc2UgRE8gTk9UIGRlbGV0ZSB0aGlzIGZpbGUhCisjIEl0IGlzIG5lY2Vzc2FyeSBmb3IgbGlua2luZyB0aGUgbGlicmFyeS4KKworIyBUaGUgbmFtZSB0aGF0IHdlIGNhbiBkbG9wZW4oMykuCitkbG5hbWU9JyR0ZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlua2VyIGZsYWdzIHRoYXQgY2FuIG5vdCBnbyBpbiBkZXBlbmRlbmN5X2xpYnMuCitpbmhlcml0ZWRfbGlua2VyX2ZsYWdzPSckbmV3X2luaGVyaXRlZF9saW5rZXJfZmxhZ3MnCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIE5hbWVzIG9mIGFkZGl0aW9uYWwgd2VhayBsaWJyYXJpZXMgcHJvdmlkZWQgYnkgdGhpcyBsaWJyYXJ5Cit3ZWFrX2xpYnJhcnlfbmFtZXM9JyR3ZWFrX2xpYnMnCisKKyMgVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgJGxpYm5hbWUuCitjdXJyZW50PSRjdXJyZW50CithZ2U9JGFnZQorcmV2aXNpb249JHJldmlzaW9uCisKKyMgSXMgdGhpcyBhbiBhbHJlYWR5IGluc3RhbGxlZCBsaWJyYXJ5PworaW5zdGFsbGVkPSRpbnN0YWxsZWQKKworIyBTaG91bGQgd2Ugd2FybiBhYm91dCBwb3J0YWJpbGl0eSB3aGVuIGxpbmtpbmcgYWdhaW5zdCAtbW9kdWxlcz8KK3Nob3VsZG5vdGxpbms9JG1vZHVsZQorCisjIEZpbGVzIHRvIGRsb3Blbi9kbHByZW9wZW4KK2Rsb3Blbj0nJGRsZmlsZXMnCitkbHByZW9wZW49JyRkbHByZWZpbGVzJworCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpciciCisJICBpZiB0ZXN0ICIkaW5zdGFsbGVkIiA9IG5vICYmIHRlc3QgIiRuZWVkX3JlbGluayIgPSB5ZXM7IHRoZW4KKwkgICAgJEVDSE8gPj4gJG91dHB1dCAiXAorcmVsaW5rX2NvbW1hbmQ9XCIkcmVsaW5rX2NvbW1hbmRcIiIKKwkgIGZpCisJZG9uZQorICAgICAgfQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgZnVuY19zaG93X2V2YWwgJyggY2QgIiRvdXRwdXRfb2JqZGlyIiAmJiAkUk0gIiRvdXRwdXRuYW1lIiAmJiAkTE5fUyAiLi4vJG91dHB1dG5hbWUiICIkb3V0cHV0bmFtZSIgKScgJ2V4aXQgJD8nCisgICAgICA7OworICAgIGVzYWMKKyAgICBleGl0ICRFWElUX1NVQ0NFU1MKK30KKworeyB0ZXN0ICIkbW9kZSIgPSBsaW5rIHx8IHRlc3QgIiRtb2RlIiA9IHJlbGluazsgfSAmJgorICAgIGZ1bmNfbW9kZV9saW5rICR7MSsiJEAifQorCisKKyMgZnVuY19tb2RlX3VuaW5zdGFsbCBhcmcuLi4KK2Z1bmNfbW9kZV91bmluc3RhbGwgKCkKK3sKKyAgICAkb3B0X2RlYnVnCisgICAgUk09IiRub25vcHQiCisgICAgZmlsZXM9CisgICAgcm1mb3JjZT0KKyAgICBleGl0X3N0YXR1cz0wCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHZhcmlhYmxlcyByYXRoZXIKKyAgICAjIHRoYW4gcnVubmluZyB0aGVpciBwcm9ncmFtcy4KKyAgICBsaWJ0b29sX2luc3RhbGxfbWFnaWM9IiRtYWdpYyIKKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAkYXJnIGluCisgICAgICAtZikgUk09IiRSTSAkYXJnIjsgcm1mb3JjZT15ZXMgOzsKKyAgICAgIC0qKSBSTT0iJFJNICRhcmciIDs7CisgICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgdGVzdCAteiAiJFJNIiAmJiBcCisgICAgICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYW4gUk0gcHJvZ3JhbSIKKworICAgIHJtZGlycz0KKworICAgIG9yaWdvYmpkaXI9IiRvYmpkaXIiCisgICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbworICAgICAgZnVuY19kaXJuYW1lICIkZmlsZSIgIiIgIi4iCisgICAgICBkaXI9IiRmdW5jX2Rpcm5hbWVfcmVzdWx0IgorICAgICAgaWYgdGVzdCAiWCRkaXIiID0gWC47IHRoZW4KKwlvYmpkaXI9IiRvcmlnb2JqZGlyIgorICAgICAgZWxzZQorCW9iamRpcj0iJGRpci8kb3JpZ29iamRpciIKKyAgICAgIGZpCisgICAgICBmdW5jX2Jhc2VuYW1lICIkZmlsZSIKKyAgICAgIG5hbWU9IiRmdW5jX2Jhc2VuYW1lX3Jlc3VsdCIKKyAgICAgIHRlc3QgIiRtb2RlIiA9IHVuaW5zdGFsbCAmJiBvYmpkaXI9IiRkaXIiCisKKyAgICAgICMgUmVtZW1iZXIgb2JqZGlyIGZvciByZW1vdmFsIGxhdGVyLCBiZWluZyBjYXJlZnVsIHRvIGF2b2lkIGR1cGxpY2F0ZXMKKyAgICAgIGlmIHRlc3QgIiRtb2RlIiA9IGNsZWFuOyB0aGVuCisJY2FzZSAiICRybWRpcnMgIiBpbgorCSAgKiIgJG9iamRpciAiKikgOzsKKwkgICopIHJtZGlycz0iJHJtZGlycyAkb2JqZGlyIiA7OworCWVzYWMKKyAgICAgIGZpCisKKyAgICAgICMgRG9uJ3QgZXJyb3IgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBhbmQgcm0gLWYgd2FzIHVzZWQuCisgICAgICBpZiB7IHRlc3QgLUwgIiRmaWxlIjsgfSA+L2Rldi9udWxsIDI+JjEgfHwKKwkgeyB0ZXN0IC1oICIkZmlsZSI7IH0gPi9kZXYvbnVsbCAyPiYxIHx8CisJIHRlc3QgLWYgIiRmaWxlIjsgdGhlbgorCToKKyAgICAgIGVsaWYgdGVzdCAtZCAiJGZpbGUiOyB0aGVuCisJZXhpdF9zdGF0dXM9MQorCWNvbnRpbnVlCisgICAgICBlbGlmIHRlc3QgIiRybWZvcmNlIiA9IHllczsgdGhlbgorCWNvbnRpbnVlCisgICAgICBmaQorCisgICAgICBybWZpbGVzPSIkZmlsZSIKKworICAgICAgY2FzZSAkbmFtZSBpbgorICAgICAgKi5sYSkKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCisJaWYgZnVuY19sYWxpYl9wICIkZmlsZSI7IHRoZW4KKwkgIGZ1bmNfc291cmNlICRkaXIvJG5hbWUKKworCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KKwkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworCSAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRuIgorCSAgZG9uZQorCSAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRvbGRfbGlicmFyeSIKKworCSAgY2FzZSAiJG1vZGUiIGluCisJICBjbGVhbikKKwkgICAgY2FzZSAiICAkbGlicmFyeV9uYW1lcyAiIGluCisJICAgICMgIiAgIiBpbiB0aGUgYmVnaW5uaW5nIGNhdGNoZXMgZW1wdHkgJGRsbmFtZQorCSAgICAqIiAkZGxuYW1lICIqKSA7OworCSAgICAqKSBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyLyRkbG5hbWUiIDs7CisJICAgIGVzYWMKKwkgICAgdGVzdCAtbiAiJGxpYmRpciIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci8kbmFtZSAkb2JqZGlyLyR7bmFtZX1pIgorCSAgICA7OworCSAgdW5pbnN0YWxsKQorCSAgICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgICBmdW5jX2V4ZWN1dGVfY21kcyAiJHBvc3R1bmluc3RhbGxfY21kcyIgJ3Rlc3QgIiRybWZvcmNlIiA9IHllcyB8fCBleGl0X3N0YXR1cz0xJworCSAgICBmaQorCisJICAgIGlmIHRlc3QgLW4gIiRvbGRfbGlicmFyeSI7IHRoZW4KKwkgICAgICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgb2xkX3Bvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgICAgZnVuY19leGVjdXRlX2NtZHMgIiRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIiAndGVzdCAiJHJtZm9yY2UiID0geWVzIHx8IGV4aXRfc3RhdHVzPTEnCisJICAgIGZpCisJICAgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgorCSAgICA7OworCSAgZXNhYworCWZpCisJOzsKKworICAgICAgKi5sbykKKwkjIFBvc3NpYmx5IGEgbGlidG9vbCBvYmplY3QsIHNvIHZlcmlmeSBpdC4KKwlpZiBmdW5jX2xhbGliX3AgIiRmaWxlIjsgdGhlbgorCisJICAjIFJlYWQgdGhlIC5sbyBmaWxlCisJICBmdW5jX3NvdXJjZSAkZGlyLyRuYW1lCisKKwkgICMgQWRkIFBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJHBpY19vYmplY3QiICYmCisJICAgICB0ZXN0ICIkcGljX29iamVjdCIgIT0gbm9uZTsgdGhlbgorCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRwaWNfb2JqZWN0IgorCSAgZmkKKworCSAgIyBBZGQgbm9uLVBJQyBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlLgorCSAgaWYgdGVzdCAtbiAiJG5vbl9waWNfb2JqZWN0IiAmJgorCSAgICAgdGVzdCAiJG5vbl9waWNfb2JqZWN0IiAhPSBub25lOyB0aGVuCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG5vbl9waWNfb2JqZWN0IgorCSAgZmkKKwlmaQorCTs7CisKKyAgICAgICopCisJaWYgdGVzdCAiJG1vZGUiID0gY2xlYW4gOyB0aGVuCisJICBub2V4ZW5hbWU9JG5hbWUKKwkgIGNhc2UgJGZpbGUgaW4KKwkgICouZXhlKQorCSAgICBmdW5jX3N0cmlwbmFtZSAnJyAnLmV4ZScgIiRmaWxlIgorCSAgICBmaWxlPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgZnVuY19zdHJpcG5hbWUgJycgJy5leGUnICIkbmFtZSIKKwkgICAgbm9leGVuYW1lPSRmdW5jX3N0cmlwbmFtZV9yZXN1bHQKKwkgICAgIyAkZmlsZSB3aXRoIC5leGUgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBybWZpbGVzLAorCSAgICAjIGFkZCAkZmlsZSB3aXRob3V0IC5leGUKKwkgICAgcm1maWxlcz0iJHJtZmlsZXMgJGZpbGUiCisJICAgIDs7CisJICBlc2FjCisJICAjIERvIGEgdGVzdCB0byBzZWUgaWYgdGhpcyBpcyBhIGxpYnRvb2wgcHJvZ3JhbS4KKwkgIGlmIGZ1bmNfbHR3cmFwcGVyX3AgIiRmaWxlIjsgdGhlbgorCSAgICBpZiBmdW5jX2x0d3JhcHBlcl9leGVjdXRhYmxlX3AgIiRmaWxlIjsgdGhlbgorCSAgICAgIGZ1bmNfbHR3cmFwcGVyX3NjcmlwdG5hbWUgIiRmaWxlIgorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdAorCSAgICAgIHJtZmlsZXM9IiRybWZpbGVzICRmdW5jX2x0d3JhcHBlcl9zY3JpcHRuYW1lX3Jlc3VsdCIKKwkgICAgZWxzZQorCSAgICAgIHJlbGlua19jb21tYW5kPQorCSAgICAgIGZ1bmNfc291cmNlICRkaXIvJG5vZXhlbmFtZQorCSAgICBmaQorCisJICAgICMgbm90ZSAkbmFtZSBzdGlsbCBjb250YWlucyAuZXhlIGlmIGl0IHdhcyBpbiAkZmlsZSBvcmlnaW5hbGx5CisJICAgICMgYXMgZG9lcyB0aGUgdmVyc2lvbiBvZiAkZmlsZSB0aGF0IHdhcyBhZGRlZCBpbnRvICRybWZpbGVzCisJICAgIHJtZmlsZXM9IiRybWZpbGVzICRvYmpkaXIvJG5hbWUgJG9iamRpci8ke25hbWV9Uy4ke29iamV4dH0iCisJICAgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KKwkgICAgICBybWZpbGVzPSIkcm1maWxlcyAkb2JqZGlyL2x0LSRuYW1lIgorCSAgICBmaQorCSAgICBpZiB0ZXN0ICJYJG5vZXhlbmFtZSIgIT0gIlgkbmFtZSIgOyB0aGVuCisJICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJG9iamRpci9sdC0ke25vZXhlbmFtZX0uYyIKKwkgICAgZmkKKwkgIGZpCisJZmkKKwk7OworICAgICAgZXNhYworICAgICAgZnVuY19zaG93X2V2YWwgIiRSTSAkcm1maWxlcyIgJ2V4aXRfc3RhdHVzPTEnCisgICAgZG9uZQorICAgIG9iamRpcj0iJG9yaWdvYmpkaXIiCisKKyAgICAjIFRyeSB0byByZW1vdmUgdGhlICR7b2JqZGlyfXMgaW4gdGhlIGRpcmVjdG9yaWVzIHdoZXJlIHdlIGRlbGV0ZWQgZmlsZXMKKyAgICBmb3IgZGlyIGluICRybWRpcnM7IGRvCisgICAgICBpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgorCWZ1bmNfc2hvd19ldmFsICJybWRpciAkZGlyID4vZGV2L251bGwgMj4mMSIKKyAgICAgIGZpCisgICAgZG9uZQorCisgICAgZXhpdCAkZXhpdF9zdGF0dXMKK30KKworeyB0ZXN0ICIkbW9kZSIgPSB1bmluc3RhbGwgfHwgdGVzdCAiJG1vZGUiID0gY2xlYW47IH0gJiYKKyAgICBmdW5jX21vZGVfdW5pbnN0YWxsICR7MSsiJEAifQorCit0ZXN0IC16ICIkbW9kZSIgJiYgeworICBoZWxwPSIkZ2VuZXJpY19oZWxwIgorICBmdW5jX2ZhdGFsX2hlbHAgInlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIgorfQorCit0ZXN0IC16ICIkZXhlY19jbWQiICYmIFwKKyAgZnVuY19mYXRhbF9oZWxwICJpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIgorCitpZiB0ZXN0IC1uICIkZXhlY19jbWQiOyB0aGVuCisgIGV2YWwgZXhlYyAiJGV4ZWNfY21kIgorICBleGl0ICRFWElUX0ZBSUxVUkUKK2ZpCisKK2V4aXQgJGV4aXRfc3RhdHVzCisKKworIyBUaGUgVEFHcyBiZWxvdyBhcmUgZGVmaW5lZCBzdWNoIHRoYXQgd2UgbmV2ZXIgZ2V0IGludG8gYSBzaXR1YXRpb24KKyMgaW4gd2hpY2ggd2UgZGlzYWJsZSBib3RoIGtpbmRzIG9mIGxpYnJhcmllcy4gIEdpdmVuIGNvbmZsaWN0aW5nCisjIGNob2ljZXMsIHdlIGdvIGZvciBhIHN0YXRpYyBsaWJyYXJ5LCB0aGF0IGlzIHRoZSBtb3N0IHBvcnRhYmxlLAorIyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgc2hhcmVkIGxpYnJhcmllcyB3ZXJlIGRpc2FibGVkIGJlY2F1c2UKKyMgdGhlIHVzZXIgYXNrZWQgZm9yIHRoYXQgb3IgYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0CisjIHRoZW0uICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgb24gQUlYLCBiZWNhdXNlIHdlIGRvbid0CisjIHN1cHBvcnQgaGF2aW5nIGJvdGggc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYXQgdGhlIHNhbWUKKyMgdGltZSBvbiB0aGF0IHBsYXRmb3JtLCBzbyB3ZSBkZWZhdWx0IHRvIGEgc2hhcmVkLW9ubHkgY29uZmlndXJhdGlvbi4KKyMgSWYgYSBkaXNhYmxlLXNoYXJlZCB0YWcgaXMgZ2l2ZW4sIHdlJ2xsIGZhbGxiYWNrIHRvIGEgc3RhdGljLW9ubHkKKyMgY29uZmlndXJhdGlvbi4gIEJ1dCB3ZSdsbCBuZXZlciBnbyBmcm9tIHN0YXRpYy1vbmx5IHRvIHNoYXJlZC1vbmx5LgorCisjICMjIyBCRUdJTiBMSUJUT09MIFRBRyBDT05GSUc6IGRpc2FibGUtc2hhcmVkCitidWlsZF9saWJ0b29sX2xpYnM9bm8KK2J1aWxkX29sZF9saWJzPXllcworIyAjIyMgRU5EIExJQlRPT0wgVEFHIENPTkZJRzogZGlzYWJsZS1zaGFyZWQKKworIyAjIyMgQkVHSU4gTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworYnVpbGRfb2xkX2xpYnM9YGNhc2UgJGJ1aWxkX2xpYnRvb2xfbGlicyBpbiB5ZXMpIGVjaG8gbm87OyAqKSBlY2hvIHllczs7IGVzYWNgCisjICMjIyBFTkQgTElCVE9PTCBUQUcgQ09ORklHOiBkaXNhYmxlLXN0YXRpYworCisjIExvY2FsIFZhcmlhYmxlczoKKyMgbW9kZTpzaGVsbC1zY3JpcHQKKyMgc2gtaW5kZW50YXRpb246MgorIyBFbmQ6CisjIHZpOnN3PTIKKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL21pc3NpbmcgYi9uZnMtdXRpbHMtMS4yLjIvbWlzc2luZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODA1NWQyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL21pc3NpbmcKQEAgLTAsMCArMSwzNzYgQEAKKyMhIC9iaW4vc2gKKyMgQ29tbW9uIHN0dWIgZm9yIGEgZmV3IG1pc3NpbmcgR05VIHByb2dyYW1zIHdoaWxlIGluc3RhbGxpbmcuCisKK3NjcmlwdHZlcnNpb249MjAwOS0wNC0yOC4yMTsgIyBVVEMKKworIyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDAsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsCisjIDIwMDgsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIE9yaWdpbmFsbHkgYnkgRnJhbixjb2lzIFBpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+LCAxOTk2LgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKK2lmIHRlc3QgJCMgLWVxIDA7IHRoZW4KKyAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICBleGl0IDEKK2ZpCisKK3J1bj06CitzZWRfb3V0cHV0PSdzLy4qIC0tb3V0cHV0WyA9XVwoW14gXSpcKS4qL1wxL3AnCitzZWRfbWludXNvPSdzLy4qIC1vIFwoW14gXSpcKS4qL1wxL3AnCisKKyMgSW4gdGhlIGNhc2VzIHdoZXJlIHRoaXMgbWF0dGVycywgYG1pc3NpbmcnIGlzIGJlaW5nIHJ1biBpbiB0aGUKKyMgc3JjZGlyIGFscmVhZHkuCitpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5hYzsgdGhlbgorICBjb25maWd1cmVfYWM9Y29uZmlndXJlLmFjCitlbHNlCisgIGNvbmZpZ3VyZV9hYz1jb25maWd1cmUuaW4KK2ZpCisKK21zZz0ibWlzc2luZyBvbiB5b3VyIHN5c3RlbSIKKworY2FzZSAkMSBpbgorLS1ydW4pCisgICMgVHJ5IHRvIHJ1biByZXF1ZXN0ZWQgcHJvZ3JhbSwgYW5kIGp1c3QgZXhpdCBpZiBpdCBzdWNjZWVkcy4KKyAgcnVuPQorICBzaGlmdAorICAiJEAiICYmIGV4aXQgMAorICAjIEV4aXQgY29kZSA2MyBtZWFucyB2ZXJzaW9uIG1pc21hdGNoLiAgVGhpcyBvZnRlbiBoYXBwZW5zCisgICMgd2hlbiB0aGUgdXNlciB0cnkgdG8gdXNlIGFuIGFuY2llbnQgdmVyc2lvbiBvZiBhIHRvb2wgb24KKyAgIyBhIGZpbGUgdGhhdCByZXF1aXJlcyBhIG1pbmltdW0gdmVyc2lvbi4gIEluIHRoaXMgY2FzZSB3ZQorICAjIHdlIHNob3VsZCBwcm9jZWVkIGhhcyBpZiB0aGUgcHJvZ3JhbSBoYWQgYmVlbiBhYnNlbnQsIG9yCisgICMgaWYgLS1ydW4gaGFkbid0IGJlZW4gcGFzc2VkLgorICBpZiB0ZXN0ICQ/ID0gNjM7IHRoZW4KKyAgICBydW49OgorICAgIG1zZz0icHJvYmFibHkgdG9vIG9sZCIKKyAgZmkKKyAgOzsKKworICAtaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisgICAgZWNobyAiXAorJDAgW09QVElPTl0uLi4gUFJPR1JBTSBbQVJHVU1FTlRdLi4uCisKK0hhbmRsZSBcYFBST0dSQU0gW0FSR1VNRU5UXS4uLicgZm9yIHdoZW4gUFJPR1JBTSBpcyBtaXNzaW5nLCBvciByZXR1cm4gYW4KK2Vycm9yIHN0YXR1cyBpZiB0aGVyZSBpcyBubyBrbm93biBoYW5kbGluZyBmb3IgUFJPR1JBTS4KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gICBvdXRwdXQgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorICAtLXJ1biAgICAgICAgICAgdHJ5IHRvIHJ1biB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIGVtdWxhdGUgaXQgaWYgaXQgZmFpbHMKKworU3VwcG9ydGVkIFBST0dSQU0gdmFsdWVzOgorICBhY2xvY2FsICAgICAgdG91Y2ggZmlsZSBcYGFjbG9jYWwubTQnCisgIGF1dG9jb25mICAgICB0b3VjaCBmaWxlIFxgY29uZmlndXJlJworICBhdXRvaGVhZGVyICAgdG91Y2ggZmlsZSBcYGNvbmZpZy5oLmluJworICBhdXRvbTR0ZSAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlLCBvciBjcmVhdGUgYSBzdHViIG9uZQorICBhdXRvbWFrZSAgICAgdG91Y2ggYWxsIFxgTWFrZWZpbGUuaW4nIGZpbGVzCisgIGJpc29uICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKyAgZmxleCAgICAgICAgIGNyZWF0ZSBcYGxleC55eS5jJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLmMKKyAgaGVscDJtYW4gICAgIHRvdWNoIHRoZSBvdXRwdXQgZmlsZQorICBsZXggICAgICAgICAgY3JlYXRlIFxgbGV4Lnl5LmMnLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuYworICBtYWtlaW5mbyAgICAgdG91Y2ggdGhlIG91dHB1dCBmaWxlCisgIHRhciAgICAgICAgICB0cnkgdGFyLCBnbnV0YXIsIGd0YXIsIHRoZW4gdGFyIHdpdGhvdXQgbm9uLXBvcnRhYmxlIGZsYWdzCisgIHlhY2MgICAgICAgICBjcmVhdGUgXGB5LnRhYi5bY2hdJywgaWYgcG9zc2libGUsIGZyb20gZXhpc3RpbmcgLltjaF0KKworVmVyc2lvbiBzdWZmaXhlcyB0byBQUk9HUkFNIGFzIHdlbGwgYXMgdGhlIHByZWZpeGVzIFxgZ251LScsIFxgZ251JywgYW5kCitcYGcnIGFyZSBpZ25vcmVkIHdoZW4gY2hlY2tpbmcgdGhlIG5hbWUuCisKK1NlbmQgYnVnIHJlcG9ydHMgdG8gPGJ1Zy1hdXRvbWFrZUBnbnUub3JnPi4iCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJzfC0tdmVyc2l8LS12ZXJzaW98LS12ZXJzaW9uKQorICAgIGVjaG8gIm1pc3NpbmcgJHNjcmlwdHZlcnNpb24gKEdOVSBBdXRvbWFrZSkiCisgICAgZXhpdCAkPworICAgIDs7CisKKyAgLSopCisgICAgZWNobyAxPiYyICIkMDogVW5rbm93biBcYCQxJyBvcHRpb24iCisgICAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgorICAgIGV4aXQgMQorICAgIDs7CisKK2VzYWMKKworIyBub3JtYWxpemUgcHJvZ3JhbSBuYW1lIHRvIGNoZWNrIGZvci4KK3Byb2dyYW09YGVjaG8gIiQxIiB8IHNlZCAnCisgIHMvXmdudS0vLzsgdAorICBzL15nbnUvLzsgdAorICBzL15nLy87IHQnYAorCisjIE5vdyBleGl0IGlmIHdlIGhhdmUgaXQsIGJ1dCBpdCBmYWlsZWQuICBBbHNvIGV4aXQgbm93IGlmIHdlCisjIGRvbid0IGhhdmUgaXQgYW5kIC0tdmVyc2lvbiB3YXMgcGFzc2VkIChtb3N0IGxpa2VseSB0byBkZXRlY3QKKyMgdGhlIHByb2dyYW0pLiAgVGhpcyBpcyBhYm91dCBub24tR05VIHByb2dyYW1zLCBzbyB1c2UgJDEgbm90CisjICRwcm9ncmFtLgorY2FzZSAkMSBpbgorICBsZXgqfHlhY2MqKQorICAgICMgTm90IEdOVSBwcm9ncmFtcywgdGhleSBkb24ndCBoYXZlIC0tdmVyc2lvbi4KKyAgICA7OworCisgIHRhciopCisgICAgaWYgdGVzdCAtbiAiJHJ1biI7IHRoZW4KKyAgICAgICBlY2hvIDE+JjIgIkVSUk9SOiBcYHRhcicgcmVxdWlyZXMgLS1ydW4iCisgICAgICAgZXhpdCAxCisgICAgZWxpZiB0ZXN0ICJ4JDIiID0gIngtLXZlcnNpb24iIHx8IHRlc3QgIngkMiIgPSAieC0taGVscCI7IHRoZW4KKyAgICAgICBleGl0IDEKKyAgICBmaQorICAgIDs7CisKKyAgKikKKyAgICBpZiB0ZXN0IC16ICIkcnVuIiAmJiAoJDEgLS12ZXJzaW9uKSA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIyBXZSBoYXZlIGl0LCBidXQgaXQgZmFpbGVkLgorICAgICAgIGV4aXQgMQorICAgIGVsaWYgdGVzdCAieCQyIiA9ICJ4LS12ZXJzaW9uIiB8fCB0ZXN0ICJ4JDIiID0gIngtLWhlbHAiOyB0aGVuCisgICAgICAgIyBDb3VsZCBub3QgcnVuIC0tdmVyc2lvbiBvciAtLWhlbHAuICBUaGlzIGlzIHByb2JhYmx5IHNvbWVvbmUKKyAgICAgICAjIHJ1bm5pbmcgYCRUT09MIC0tdmVyc2lvbicgb3IgYCRUT09MIC0taGVscCcgdG8gY2hlY2sgd2hldGhlcgorICAgICAgICMgJFRPT0wgZXhpc3RzIGFuZCBub3Qga25vd2luZyAkVE9PTCB1c2VzIG1pc3NpbmcuCisgICAgICAgZXhpdCAxCisgICAgZmkKKyAgICA7OworZXNhYworCisjIElmIGl0IGRvZXMgbm90IGV4aXN0LCBvciBmYWlscyB0byBydW4gKHBvc3NpYmx5IGFuIG91dGRhdGVkIHZlcnNpb24pLAorIyB0cnkgdG8gZW11bGF0ZSBpdC4KK2Nhc2UgJHByb2dyYW0gaW4KKyAgYWNsb2NhbCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KKyAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICB0b3VjaCBhY2xvY2FsLm00CisgICAgOzsKKworICBhdXRvY29uZiopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBcYCR7Y29uZmlndXJlX2FjfScuICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZQorICAgICAgICAgXGBBdXRvY29uZicgYW5kIFxgR05VIG00JyBwYWNrYWdlcy4gIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisgICAgdG91Y2ggY29uZmlndXJlCisgICAgOzsKKworICBhdXRvaGVhZGVyKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorICAgICAgICAgeW91IG1vZGlmaWVkIFxgYWNjb25maWcuaCcgb3IgXGAke2NvbmZpZ3VyZV9hY30nLiAgWW91IG1pZ2h0IHdhbnQKKyAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b2NvbmYnIGFuZCBcYEdOVSBtNCcgcGFja2FnZXMuICBHcmFiIHRoZW0KKyAgICAgICAgIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIGZpbGVzPWBzZWQgLW4gJ3MvXlsgXSpBW0NNXV9DT05GSUdfSEVBREVSKFwoW14pXSpcKSkuKi9cMS9wJyAke2NvbmZpZ3VyZV9hY31gCisgICAgdGVzdCAteiAiJGZpbGVzIiAmJiBmaWxlcz0iY29uZmlnLmgiCisgICAgdG91Y2hfZmlsZXM9CisgICAgZm9yIGYgaW4gJGZpbGVzOyBkbworICAgICAgY2FzZSAkZiBpbgorICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKKwkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7CisgICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7CisgICAgICBlc2FjCisgICAgZG9uZQorICAgIHRvdWNoICR0b3VjaF9maWxlcworICAgIDs7CisKKyAgYXV0b21ha2UqKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgXGBNYWtlZmlsZS5hbScsIFxgYWNpbmNsdWRlLm00JyBvciBcYCR7Y29uZmlndXJlX2FjfScuCisgICAgICAgICBZb3UgbWlnaHQgd2FudCB0byBpbnN0YWxsIHRoZSBcYEF1dG9tYWtlJyBhbmQgXGBQZXJsJyBwYWNrYWdlcy4KKyAgICAgICAgIEdyYWIgdGhlbSBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBmaW5kIC4gLXR5cGUgZiAtbmFtZSBNYWtlZmlsZS5hbSAtcHJpbnQgfAorCSAgIHNlZCAncy9cLmFtJC8uaW4vJyB8CisJICAgd2hpbGUgcmVhZCBmOyBkbyB0b3VjaCAiJGYiOyBkb25lCisgICAgOzsKKworICBhdXRvbTR0ZSopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGJ1dCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLgorICAgICAgICAgWW91IGNhbiBnZXQgXGAkMScgYXMgcGFydCBvZiBcYEF1dG9jb25mJyBmcm9tIGFueSBHTlUKKyAgICAgICAgIGFyY2hpdmUgc2l0ZS4iCisKKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuCisJdG91Y2ggJGZpbGUKKyAgICBlbHNlCisJdGVzdCAteiAiJGZpbGUiIHx8IGV4ZWMgPiRmaWxlCisJZWNobyAiIyEgL2Jpbi9zaCIKKwllY2hvICIjIENyZWF0ZWQgYnkgR05VIEF1dG9tYWtlIG1pc3NpbmcgYXMgYSByZXBsYWNlbWVudCBvZiIKKwllY2hvICIjICAkICRAIgorCWVjaG8gImV4aXQgMCIKKwljaG1vZCAreCAkZmlsZQorCWV4aXQgMQorICAgIGZpCisgICAgOzsKKworICBiaXNvbip8eWFjYyopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKKyAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKKyAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAorICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAkTEFTVEFSRyBpbgorCSoueSkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL3kkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCisJICAgIGZpCisJICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCisJICAgIGlmIHRlc3QgLWYgIiRTUkNGSUxFIjsgdGhlbgorCSAgICAgICAgIGNwICIkU1JDRklMRSIgeS50YWIuaAorCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgeS50YWIuaDsgdGhlbgorCWVjaG8gPnkudGFiLmgKKyAgICBmaQorICAgIGlmIHRlc3QgISAtZiB5LnRhYi5jOyB0aGVuCisJZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCisgICAgZmkKKyAgICA7OworCisgIGxleCp8ZmxleCopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyAkbXNnLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKKyAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLmwnIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgRmxleCcgcGFja2FnZQorICAgICAgICAgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZSBlZmZlY3QuICBZb3UgY2FuIGdldAorICAgICAgICAgXGBGbGV4JyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKyAgICBybSAtZiBsZXgueXkuYworICAgIGlmIHRlc3QgJCMgLW5lIDE7IHRoZW4KKyAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCisJY2FzZSAkTEFTVEFSRyBpbgorCSoubCkKKwkgICAgU1JDRklMRT1gZWNobyAiJExBU1RBUkciIHwgc2VkICdzL2wkL2MvJ2AKKwkgICAgaWYgdGVzdCAtZiAiJFNSQ0ZJTEUiOyB0aGVuCisJICAgICAgICAgY3AgIiRTUkNGSUxFIiBsZXgueXkuYworCSAgICBmaQorCSAgOzsKKwllc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0ICEgLWYgbGV4Lnl5LmM7IHRoZW4KKwllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCisgICAgZmkKKyAgICA7OworCisgIGhlbHAybWFuKikKKyAgICBlY2hvIDE+JjIgIlwKK1dBUk5JTkc6IFxgJDEnIGlzICRtc2cuICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgorCSB5b3UgbW9kaWZpZWQgYSBkZXBlbmRlbmN5IG9mIGEgbWFudWFsIHBhZ2UuICBZb3UgbWF5IG5lZWQgdGhlCisJIFxgSGVscDJtYW4nIHBhY2thZ2UgaW4gb3JkZXIgZm9yIHRob3NlIG1vZGlmaWNhdGlvbnMgdG8gdGFrZQorCSBlZmZlY3QuICBZb3UgY2FuIGdldCBcYEhlbHAybWFuJyBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKKworICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAiJHNlZF9vdXRwdXQiYAorICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfbWludXNvImAKKyAgICBpZiB0ZXN0IC1mICIkZmlsZSI7IHRoZW4KKwl0b3VjaCAkZmlsZQorICAgIGVsc2UKKwl0ZXN0IC16ICIkZmlsZSIgfHwgZXhlYyA+JGZpbGUKKwllY2hvICIuYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlIgorCWV4aXQgJD8KKyAgICBmaQorICAgIDs7CisKKyAgbWFrZWluZm8qKQorICAgIGVjaG8gMT4mMiAiXAorV0FSTklORzogXGAkMScgaXMgJG1zZy4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCisgICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQorICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCisgICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAorICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCisgICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgorICAgICMgVGhlIGZpbGUgdG8gdG91Y2ggaXMgdGhhdCBzcGVjaWZpZWQgd2l0aCAtbyAuLi4KKyAgICBmaWxlPWBlY2hvICIkKiIgfCBzZWQgLW4gIiRzZWRfb3V0cHV0ImAKKyAgICB0ZXN0IC16ICIkZmlsZSIgJiYgZmlsZT1gZWNobyAiJCoiIHwgc2VkIC1uICIkc2VkX21pbnVzbyJgCisgICAgaWYgdGVzdCAteiAiJGZpbGUiOyB0aGVuCisgICAgICAjIC4uLiBvciBpdCBpcyB0aGUgb25lIHNwZWNpZmllZCB3aXRoIEBzZXRmaWxlbmFtZSAuLi4KKyAgICAgIGluZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAorICAgICAgZmlsZT1gc2VkIC1uICcKKwkvXkBzZXRmaWxlbmFtZS97CisJICBzLy4qIFwoW14gXSpcKSAqJC9cMS8KKwkgIHAKKwkgIHEKKwl9JyAkaW5maWxlYAorICAgICAgIyAuLi4gb3IgaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBzb3VyY2UgbmFtZSAoZGlyL2YudGV4aSBiZWNvbWVzIGYuaW5mbykKKyAgICAgIHRlc3QgLXogIiRmaWxlIiAmJiBmaWxlPWBlY2hvICIkaW5maWxlIiB8IHNlZCAncywuKi8sLDtzLC5bXi5dKiQsLCdgLmluZm8KKyAgICBmaQorICAgICMgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSB1c2VyIHJlYWxseSBuZWVkcyBtYWtlaW5mbzsKKyAgICAjIGxldCdzIGZhaWwgd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KKyAgICB0ZXN0IC1mICRmaWxlIHx8IGV4aXQgMQorICAgIHRvdWNoICRmaWxlCisgICAgOzsKKworICB0YXIqKQorICAgIHNoaWZ0CisKKyAgICAjIFdlIGhhdmUgYWxyZWFkeSB0cmllZCB0YXIgaW4gdGhlIGdlbmVyaWMgcGFydC4KKyAgICAjIExvb2sgZm9yIGdudXRhci9ndGFyIGJlZm9yZSBpbnZvY2F0aW9uIHRvIGF2b2lkIHVnbHkgZXJyb3IKKyAgICAjIG1lc3NhZ2VzLgorICAgIGlmIChnbnV0YXIgLS12ZXJzaW9uID4gL2Rldi9udWxsIDI+JjEpOyB0aGVuCisgICAgICAgZ251dGFyICIkQCIgJiYgZXhpdCAwCisgICAgZmkKKyAgICBpZiAoZ3RhciAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSk7IHRoZW4KKyAgICAgICBndGFyICIkQCIgJiYgZXhpdCAwCisgICAgZmkKKyAgICBmaXJzdGFyZz0iJDEiCisgICAgaWYgc2hpZnQ7IHRoZW4KKwljYXNlICRmaXJzdGFyZyBpbgorCSpvKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9vLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKwljYXNlICRmaXJzdGFyZyBpbgorCSpoKikKKwkgICAgZmlyc3Rhcmc9YGVjaG8gIiRmaXJzdGFyZyIgfCBzZWQgcy9oLy9gCisJICAgIHRhciAiJGZpcnN0YXJnIiAiJEAiICYmIGV4aXQgMAorCSAgICA7OworCWVzYWMKKyAgICBmaQorCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBJIGNhbid0IHNlZW0gdG8gYmUgYWJsZSB0byBydW4gXGB0YXInIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgICAgICAgIFlvdSBtYXkgd2FudCB0byBpbnN0YWxsIEdOVSB0YXIgb3IgRnJlZSBwYXh1dGlscywgb3IgY2hlY2sgdGhlCisgICAgICAgICBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgZWNobyAxPiYyICJcCitXQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCBpcyAkbXNnLgorICAgICAgICAgWW91IG1pZ2h0IGhhdmUgbW9kaWZpZWQgc29tZSBmaWxlcyB3aXRob3V0IGhhdmluZyB0aGUKKyAgICAgICAgIHByb3BlciB0b29scyBmb3IgZnVydGhlciBoYW5kbGluZyB0aGVtLiAgQ2hlY2sgdGhlIFxgUkVBRE1FJyBmaWxlLAorICAgICAgICAgaXQgb2Z0ZW4gdGVsbHMgeW91IGFib3V0IHRoZSBuZWVkZWQgcHJlcmVxdWlzaXRlcyBmb3IgaW5zdGFsbGluZworICAgICAgICAgdGhpcyBwYWNrYWdlLiAgWW91IG1heSBhbHNvIHBlZWsgYXQgYW55IEdOVSBhcmNoaXZlIHNpdGUsIGluIGNhc2UKKyAgICAgICAgIHNvbWUgb3RoZXIgcGFja2FnZSB3b3VsZCBjb250YWluIHRoaXMgbWlzc2luZyBcYCQxJyBwcm9ncmFtLiIKKyAgICBleGl0IDEKKyAgICA7OworZXNhYworCitleGl0IDAKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInNjcmlwdHZlcnNpb249IgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQuJTAySCIKKyMgdGltZS1zdGFtcC10aW1lLXpvbmU6ICJVVEMiCisjIHRpbWUtc3RhbXAtZW5kOiAiOyAjIFVUQyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM3NzMzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworU1VCRElSUyA9IGV4cG9ydCBpbmNsdWRlIG1pc2MgbmZzIG5zbQorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxN2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjEzIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gc3VwcG9ydAorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCisJJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKKwlkaXN0ZGlyCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMpCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitTVUJESVJTID0gZXhwb3J0IGluY2x1ZGUgbWlzYyBuZnMgbnNtCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSBzdXBwb3J0L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8ICQoTUtESVJfUCkgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQoZGlzdGRpcikvJCRzdWJkaXIiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld19kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGRpcjE9JCRzdWJkaXI7IGRpcjI9IiQodG9wX2Rpc3RkaXIpIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfdG9wX2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZWNobyAiIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFxcIjsgXAorCSAgICBlY2hvICIgICAgIGFtX19yZW1vdmVfZGlzdGRpcj06IGFtX19za2lwX2xlbmd0aF9jaGVjaz06IGFtX19za2lwX21vZGVfZml4PTogZGlzdGRpcikiOyBcCisJICAgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgXAorCSAgICAgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKKwkgICAgICAgIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgXAorCSAgICAgICAgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXAorCQlhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBcCisJCWFtX19za2lwX2xlbmd0aF9jaGVjaz06IFwKKwkJYW1fX3NraXBfbW9kZV9maXg9OiBcCisJICAgICAgICBkaXN0ZGlyKSBcCisJICAgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktcmVjdXJzaXZlCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1yZWN1cnNpdmUKKworaHRtbC1hbToKKworaW5mbzogaW5mby1yZWN1cnNpdmUKKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktcmVjdXJzaXZlCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtcmVjdXJzaXZlCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1yZWN1cnNpdmUKKworcGRmLWFtOgorCitwczogcHMtcmVjdXJzaXZlCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBjdGFncy1yZWN1cnNpdmUgXAorCWluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQorCisuUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKKwlhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKKwlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdGFncy1yZWN1cnNpdmUgXAorCXVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNjI0OQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2V4cG9ydC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU0IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworCitHRU5GSUxFU19DTE5UCT0gbW91bnRfY2xudC5jCitHRU5GSUxFU19YRFIJPSBtb3VudF94ZHIuYworR0VORklMRVNfSAk9IG1vdW50LmgKKworR0VORklMRVMJPSAkKEdFTkZJTEVTX0NMTlQpICQoR0VORklMRVNfU1ZDKSAkKEdFTkZJTEVTX1hEUikgJChHRU5GSUxFU19IKQorCitFWFRSQV9ESVNUCT0gbW91bnQueAorCitub2luc3RfTElCUkFSSUVTID0gbGliZXhwb3J0LmEKK2xpYmV4cG9ydF9hX1NPVVJDRVMgPSBjbGllbnQuYyBleHBvcnQuYyBob3N0bmFtZS5jIG5mc2N0bC5jIHJtdGFiLmMgXAorCQkgICAgICB4dGFiLmMgbW91bnRfY2xudC5jIG1vdW50X3hkci5jCitCVUlMVF9TT1VSQ0VTIAk9ICQoR0VORklMRVMpCisKK25vaW5zdF9IRUFERVJTID0gbW91bnQuaAorCitkaXN0LWhvb2s6CisJZm9yIGYgaW4gJChHRU5GSUxFUyk7IGRvIFwKKwkgIHJtICR7ZGlzdGRpcn0vJCRmOyBcCisJZG9uZQorCitpZiBDT05GSUdfUlBDR0VOCitSUENHRU4JCT0gJCh0b3BfYnVpbGRkaXIpL3Rvb2xzL3JwY2dlbi9ycGNnZW4KKyQoUlBDR0VOKToKKwltYWtlIC1DICQodG9wX3NyY2RpcikvdG9vbHMvcnBjZ2VuIGFsbAorZWxzZQorUlBDR0VOID0gQFJQQ0dFTl9QQVRIQAorZW5kaWYKKworJChHRU5GSUxFU19DTE5UKTogJV9jbG50LmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1sIC1vICRAICQ8CisJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisJcm0gLWYgJEAKKwltdiAtZiAkQC5OICRACisKKyQoR0VORklMRVNfWERSKTogJV94ZHIuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWMgLW8gJEAgJDwKKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKwlybSAtZiAkQAorCW12IC1mICRALk4gJEAKKworJChHRU5GSUxFU19IKTogJS5oOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtaCAtbyAkQCAkPAorCXJtIC1mICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvbW91bnQuaAorCSQoTE5fUykgLi4vZXhwb3J0L21vdW50LmggJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9tb3VudC5oCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KKworQ0xFQU5GSUxFUyA9ICQoR0VORklMRVMpICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvbW91bnQuaApkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyN2Q4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1ODMgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gc3VwcG9ydC9leHBvcnQKK0RJU1RfQ09NTU9OID0gJChub2luc3RfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorTElCUkFSSUVTID0gJChub2luc3RfTElCUkFSSUVTKQorQVJGTEFHUyA9IGNydQorbGliZXhwb3J0X2FfQVIgPSAkKEFSKSAkKEFSRkxBR1MpCitsaWJleHBvcnRfYV9MSUJBREQgPQorYW1fbGliZXhwb3J0X2FfT0JKRUNUUyA9IGNsaWVudC4kKE9CSkVYVCkgZXhwb3J0LiQoT0JKRVhUKSBcCisJaG9zdG5hbWUuJChPQkpFWFQpIG5mc2N0bC4kKE9CSkVYVCkgcm10YWIuJChPQkpFWFQpIFwKKwl4dGFiLiQoT0JKRVhUKSBtb3VudF9jbG50LiQoT0JKRVhUKSBtb3VudF94ZHIuJChPQkpFWFQpCitsaWJleHBvcnRfYV9PQkpFQ1RTID0gJChhbV9saWJleHBvcnRfYV9PQkpFQ1RTKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKGxpYmV4cG9ydF9hX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGxpYmV4cG9ydF9hX1NPVVJDRVMpCitIRUFERVJTID0gJChub2luc3RfSEVBREVSUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitHRU5GSUxFU19DTE5UID0gbW91bnRfY2xudC5jCitHRU5GSUxFU19YRFIgPSBtb3VudF94ZHIuYworR0VORklMRVNfSCA9IG1vdW50LmgKK0dFTkZJTEVTID0gJChHRU5GSUxFU19DTE5UKSAkKEdFTkZJTEVTX1NWQykgJChHRU5GSUxFU19YRFIpICQoR0VORklMRVNfSCkKK0VYVFJBX0RJU1QgPSBtb3VudC54Citub2luc3RfTElCUkFSSUVTID0gbGliZXhwb3J0LmEKK2xpYmV4cG9ydF9hX1NPVVJDRVMgPSBjbGllbnQuYyBleHBvcnQuYyBob3N0bmFtZS5jIG5mc2N0bC5jIHJtdGFiLmMgXAorCQkgICAgICB4dGFiLmMgbW91bnRfY2xudC5jIG1vdW50X3hkci5jCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkZJTEVTKQorbm9pbnN0X0hFQURFUlMgPSBtb3VudC5oCitAQ09ORklHX1JQQ0dFTl9GQUxTRUBSUENHRU4gPSBAUlBDR0VOX1BBVEhACitAQ09ORklHX1JQQ0dFTl9UUlVFQFJQQ0dFTiA9ICQodG9wX2J1aWxkZGlyKS90b29scy9ycGNnZW4vcnBjZ2VuCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCitDTEVBTkZJTEVTID0gJChHRU5GSUxFUykgJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9tb3VudC5oCithbGw6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2NsZWFuLW5vaW5zdExJQlJBUklFUzoKKwktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQorbGliZXhwb3J0LmE6ICQobGliZXhwb3J0X2FfT0JKRUNUUykgJChsaWJleHBvcnRfYV9ERVBFTkRFTkNJRVMpIAorCS1ybSAtZiBsaWJleHBvcnQuYQorCSQobGliZXhwb3J0X2FfQVIpIGxpYmV4cG9ydC5hICQobGliZXhwb3J0X2FfT0JKRUNUUykgJChsaWJleHBvcnRfYV9MSUJBREQpCisJJChSQU5MSUIpIGxpYmV4cG9ydC5hCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jbGllbnQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2V4cG9ydC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvaG9zdG5hbWUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21vdW50X2NsbnQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21vdW50X3hkci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbmZzY3RsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ybXRhYi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikveHRhYi5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIFwKKwkgIGRpc3QtaG9vaworY2hlY2stYW06IGFsbC1hbQorY2hlY2s6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGFsbCBjaGVjayBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY3RhZ3MgZGlzdC1ob29rIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwlwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKK2Rpc3QtaG9vazoKKwlmb3IgZiBpbiAkKEdFTkZJTEVTKTsgZG8gXAorCSAgcm0gJHtkaXN0ZGlyfS8kJGY7IFwKKwlkb25lCitAQ09ORklHX1JQQ0dFTl9UUlVFQCQoUlBDR0VOKToKK0BDT05GSUdfUlBDR0VOX1RSVUVACW1ha2UgLUMgJCh0b3Bfc3JjZGlyKS90b29scy9ycGNnZW4gYWxsCisKKyQoR0VORklMRVNfQ0xOVCk6ICVfY2xudC5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtbCAtbyAkQCAkPAorCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorCXJtIC1mICRACisJbXYgLWYgJEAuTiAkQAorCiskKEdFTkZJTEVTX1hEUik6ICVfeGRyLmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1jIC1vICRAICQ8CisJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisJcm0gLWYgJEAKKwltdiAtZiAkQC5OICRACisKKyQoR0VORklMRVNfSCk6ICUuaDogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWggLW8gJEAgJDwKKwlybSAtZiAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL21vdW50LmgKKwkkKExOX1MpIC4uL2V4cG9ydC9tb3VudC5oICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvbW91bnQuaAorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvY2xpZW50LmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzNjU2MQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2V4cG9ydC9jbGllbnQuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIHN1cHBvcnQvZXhwb3J0L2NsaWVudC5jCisgKgorICogTWFpbnRhaW4gbGlzdCBvZiBuZnNkIGNsaWVudHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJuZnNsaWIuaCIKKyNpbmNsdWRlICJleHBvcnRmcy5oIgorCisvKiBuZXRncm91cCBzdHVmZiBuZXZlciBzZWVtcyB0byBiZSBkZWZpbmVkIGluIGFueSBoZWFkZXIgZmlsZS4gTGludXggaXMKKyAqIG5vdCBhbG9uZSBpbiB0aGlzLgorICovCisjaWYgIWRlZmluZWQoX19HTElCQ19fKSB8fCBfX0dMSUJDX18gPCAyCitleHRlcm4gaW50CWlubmV0Z3IoY2hhciAqbmV0Z3IsIGNoYXIgKmhvc3QsIGNoYXIgKiwgY2hhciAqKTsKKyNlbmRpZgorc3RhdGljIHZvaWQJY2xpZW50X2luaXQobmZzX2NsaWVudCAqY2xwLCBjb25zdCBjaGFyICpobmFtZSwKKwkJCQkJc3RydWN0IGhvc3RlbnQgKmhwKTsKK3N0YXRpYyBpbnQJY2xpZW50X2NoZWNrYWRkcihuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBpbl9hZGRyIGFkZHIpOworCituZnNfY2xpZW50CSpjbGllbnRsaXN0W01DTF9NQVhUWVBFU10gPSB7IE5VTEwsIH07CisKKworLyogaWYgY2Fub25pY2FsIGlzIHNldCwgdGhlbiB3ZSAqa25vdyogdGhpcyBpcyBhbHJlYWR5IGEgY2Fub25pY2FsIG5hbWUKKyAqIHNvIGhvc3RuYW1lIGxvb2t1cCBpcyBhdm9pZGVkLgorICogVGhpcyBpcyB1c2VkIHdoZW4gcmVhZGluZyAvcHJvYy9mcy9uZnMvZXhwb3J0cworICovCituZnNfY2xpZW50ICoKK2NsaWVudF9sb29rdXAoY2hhciAqaG5hbWUsIGludCBjYW5vbmljYWwpCit7CisJbmZzX2NsaWVudAkqY2xwID0gTlVMTDsKKwlpbnQJCWh0eXBlOworCXN0cnVjdCBob3N0ZW50CSpocCA9IE5VTEw7CisKKwlodHlwZSA9IGNsaWVudF9nZXR0eXBlKGhuYW1lKTsKKworCWlmIChodHlwZSA9PSBNQ0xfRlFETiAmJiAhY2Fub25pY2FsKSB7CisJCXN0cnVjdCBob3N0ZW50ICpocDI7CisJCWhwID0gZ2V0aG9zdGJ5bmFtZShobmFtZSk7CisJCWlmIChocCA9PSBOVUxMIHx8IGhwLT5oX2FkZHJ0eXBlICE9IEFGX0lORVQpIHsKKwkJCXhsb2coTF9FUlJPUiwgIiVzIGhhcyBub24taW5ldCBhZGRyIiwgaG5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogbWFrZSBzdXJlIHdlIGhhdmUgY2Fub25pY2FsIG5hbWUgKi8KKwkJaHAyID0gaG9zdGVudF9kdXAoaHApOworCQlocCA9IGdldGhvc3RieWFkZHIoaHAyLT5oX2FkZHIsIGhwMi0+aF9sZW5ndGgsCisJCQkJICAgaHAyLT5oX2FkZHJ0eXBlKTsKKwkJaWYgKGhwKSB7CisJCQlocCA9IGhvc3RlbnRfZHVwKGhwKTsKKwkJCS8qIGJ1dCBub3cgd2UgbWlnaHQgbm90IGhhdmUgYWxsIGFkZHJlc3Nlcy4uLiAqLworCQkJaWYgKGhwMi0+aF9hZGRyX2xpc3RbMV0pIHsKKwkJCQlzdHJ1Y3QgaG9zdGVudCAqaHAzID0KKwkJCQkJZ2V0aG9zdGJ5bmFtZShocC0+aF9uYW1lKTsKKwkJCQlpZiAoaHAzKSB7CisJCQkJCWZyZWUoaHApOworCQkJCQlocCA9IGhvc3RlbnRfZHVwKGhwMyk7CisJCQkJfQorCQkJfQorCQkJZnJlZShocDIpOworCQl9IGVsc2UKKwkJCWhwID0gaHAyOworCisJCWhuYW1lID0gKGNoYXIgKikgaHAtPmhfbmFtZTsKKworCQlmb3IgKGNscCA9IGNsaWVudGxpc3RbaHR5cGVdOyBjbHA7IGNscCA9IGNscC0+bV9uZXh0KSB7CisJCQlpZiAoY2xpZW50X2NoZWNrKGNscCwgaHApKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChjbHAgPSBjbGllbnRsaXN0W2h0eXBlXTsgY2xwOyBjbHAgPSBjbHAtPm1fbmV4dCkgeworCQkJaWYgKHN0cmNhc2VjbXAoaG5hbWUsIGNscC0+bV9ob3N0bmFtZSk9PTApCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWNscCkgeworCQljbHAgPSAobmZzX2NsaWVudCAqKSB4bWFsbG9jKHNpemVvZigqY2xwKSk7CisJCW1lbXNldChjbHAsIDAsIHNpemVvZigqY2xwKSk7CisJCWNscC0+bV90eXBlID0gaHR5cGU7CisJCWNsaWVudF9pbml0KGNscCwgaG5hbWUsIE5VTEwpOworCQljbGllbnRfYWRkKGNscCk7CisJfQorCisJaWYgKGh0eXBlID09IE1DTF9GUUROICYmIGNscC0+bV9uYWRkciA9PSAwICYmIGhwICE9IE5VTEwpIHsKKwkJY2hhcgkqKmFwID0gaHAtPmhfYWRkcl9saXN0OworCQlpbnQJaTsKKworCQlmb3IgKGkgPSAwOyAqYXAgJiYgaSA8IE5GU0NMTlRfQUREUk1BWDsgaSsrLCBhcCsrKQorCQkJY2xwLT5tX2FkZHJsaXN0W2ldID0gKihzdHJ1Y3QgaW5fYWRkciAqKSphcDsKKwkJY2xwLT5tX25hZGRyID0gaTsKKwl9CisKKwlpZiAoaHApCisJCWZyZWUgKGhwKTsKKworCXJldHVybiBjbHA7Cit9CisKK25mc19jbGllbnQgKgorY2xpZW50X2R1cChuZnNfY2xpZW50ICpjbHAsIHN0cnVjdCBob3N0ZW50ICpocCkKK3sKKwluZnNfY2xpZW50CQkqbmV3OworCisJbmV3ID0gKG5mc19jbGllbnQgKikgeG1hbGxvYyhzaXplb2YoKm5ldykpOworCW1lbWNweShuZXcsIGNscCwgc2l6ZW9mKCpuZXcpKTsKKwluZXctPm1fdHlwZSA9IE1DTF9GUUROOworCW5ldy0+bV9ob3N0bmFtZSA9IE5VTEw7CisKKwljbGllbnRfaW5pdChuZXcsIChjaGFyICopIGhwLT5oX25hbWUsIGhwKTsKKwljbGllbnRfYWRkKG5ldyk7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIHZvaWQKK2NsaWVudF9pbml0KG5mc19jbGllbnQgKmNscCwgY29uc3QgY2hhciAqaG5hbWUsIHN0cnVjdCBob3N0ZW50ICpocCkKK3sKKwl4ZnJlZShjbHAtPm1faG9zdG5hbWUpOworCWlmIChocCkKKwkJY2xwLT5tX2hvc3RuYW1lID0geHN0cmR1cChocC0+aF9uYW1lKTsKKwllbHNlCisJCWNscC0+bV9ob3N0bmFtZSA9IHhzdHJkdXAoaG5hbWUpOworCisJY2xwLT5tX2V4cG9ydGVkID0gMDsKKwljbHAtPm1fY291bnQgPSAwOworCisJaWYgKGNscC0+bV90eXBlID09IE1DTF9TVUJORVRXT1JLKSB7CisJCWNoYXIJKmNwID0gc3RyY2hyKGNscC0+bV9ob3N0bmFtZSwgJy8nKTsKKwkJc3RhdGljIGNoYXIgc2xhc2gzMltdID0gIi8zMiI7CisKKwkJaWYoIWNwKSBjcCA9IHNsYXNoMzI7CisJCSpjcCA9ICdcMCc7CisJCWNscC0+bV9hZGRybGlzdFswXS5zX2FkZHIgPSBpbmV0X2FkZHIoY2xwLT5tX2hvc3RuYW1lKTsKKwkJaWYgKHN0cmNocihjcCArIDEsICcuJykpIHsKKwkJCWNscC0+bV9hZGRybGlzdFsxXS5zX2FkZHIgPSBpbmV0X2FkZHIoY3ArMSk7CisJCX0KKwkJZWxzZSB7CisJCQlpbnQgbmV0bWFzayA9IGF0b2koY3AgKyAxKTsKKwkJCWlmICgwIDwgbmV0bWFzayAmJiBuZXRtYXNrIDw9IDMyKSB7CisJCQkJY2xwLT5tX2FkZHJsaXN0WzFdLnNfYWRkciA9CisJCQkJCWh0b25sICgodWludDMyX3QpIH4wIDw8ICgzMiAtIG5ldG1hc2spKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXhsb2coTF9GQVRBTCwgImludmFsaWQgbmV0bWFzayBgJXMnIGZvciAlcyIsCisJCQkJICAgICBjcCArIDEsIGNscC0+bV9ob3N0bmFtZSk7CisJCQl9CisJCX0KKwkJKmNwID0gJy8nOworCQljbHAtPm1fbmFkZHIgPSAwOworCX0gZWxzZSBpZiAoIWhwKSB7CisJCWNscC0+bV9uYWRkciA9IDA7CisJfSBlbHNlIHsKKwkJY2hhcgkqKmFwID0gaHAtPmhfYWRkcl9saXN0OworCQlpbnQJaTsKKworCQlmb3IgKGkgPSAwOyAqYXAgJiYgaSA8IE5GU0NMTlRfQUREUk1BWDsgaSsrLCBhcCsrKSB7CisJCQljbHAtPm1fYWRkcmxpc3RbaV0gPSAqKHN0cnVjdCBpbl9hZGRyICopKmFwOworCQl9CisJCWNscC0+bV9uYWRkciA9IGk7CisJfQorfQorCit2b2lkCitjbGllbnRfYWRkKG5mc19jbGllbnQgKmNscCkKK3sKKwluZnNfY2xpZW50CSoqY3BwOworCisJaWYgKGNscC0+bV90eXBlIDwgMCB8fCBjbHAtPm1fdHlwZSA+PSBNQ0xfTUFYVFlQRVMpCisJCXhsb2coTF9GQVRBTCwgInVua25vd24gY2xpZW50IHR5cGUgaW4gY2xpZW50X2FkZCIpOworCWNwcCA9IGNsaWVudGxpc3QgKyBjbHAtPm1fdHlwZTsKKwl3aGlsZSAoKmNwcCkKKwkJY3BwID0gJigoKmNwcCktPm1fbmV4dCk7CisJY2xwLT5tX25leHQgPSBOVUxMOworCSpjcHAgPSBjbHA7Cit9CisKK3ZvaWQKK2NsaWVudF9yZWxlYXNlKG5mc19jbGllbnQgKmNscCkKK3sKKwlpZiAoY2xwLT5tX2NvdW50IDw9IDApCisJCXhsb2coTF9GQVRBTCwgImNsaWVudF9mcmVlOiBtX2NvdW50IDw9IDAhIik7CisJY2xwLT5tX2NvdW50LS07Cit9CisKK3ZvaWQKK2NsaWVudF9mcmVlYWxsKHZvaWQpCit7CisJbmZzX2NsaWVudAkqY2xwLCAqKmhlYWQ7CisJaW50CQlpOworCisJZm9yIChpID0gMDsgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKSB7CisJCWhlYWQgPSBjbGllbnRsaXN0ICsgaTsKKwkJd2hpbGUgKCpoZWFkKSB7CisJCQkqaGVhZCA9IChjbHAgPSAqaGVhZCktPm1fbmV4dDsKKwkJCXhmcmVlKGNscC0+bV9ob3N0bmFtZSk7CisJCQl4ZnJlZShjbHApOworCQl9CisJfQorfQorCituZnNfY2xpZW50ICoKK2NsaWVudF9maW5kKHN0cnVjdCBob3N0ZW50ICpocCkKK3sKKwluZnNfY2xpZW50CSpjbHA7CisJaW50CQlpOworCisJZm9yIChpID0gMDsgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKSB7CisJCWZvciAoY2xwID0gY2xpZW50bGlzdFtpXTsgY2xwOyBjbHAgPSBjbHAtPm1fbmV4dCkgeworCQkJaWYgKCFjbGllbnRfY2hlY2soY2xwLCBocCkpCisJCQkJY29udGludWU7CisjaWZkZWYgbm90ZGVmCisJCQlpZiAoY2xwLT5tX3R5cGUgPT0gTUNMX0ZRRE4pCisJCQkJcmV0dXJuIGNscDsKKwkJCXJldHVybiBjbGllbnRfZHVwKGNscCwgaHApOworI2Vsc2UKKwkJCXJldHVybiBjbHA7CisjZW5kaWYKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGhvc3RlbnQgKgorY2xpZW50X3Jlc29sdmUoc3RydWN0IGluX2FkZHIgYWRkcikKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaGUgPSBOVUxMOworCisJaWYgKGNsaWVudGxpc3RbTUNMX1dJTERDQVJEXSB8fCBjbGllbnRsaXN0W01DTF9ORVRHUk9VUF0pCisJCWhlID0gZ2V0X3JlbGlhYmxlX2hvc3RieWFkZHIoKGNvbnN0IGNoYXIqKSZhZGRyLCBzaXplb2YoYWRkciksIEFGX0lORVQpOworCWlmIChoZSA9PSBOVUxMKQorCQloZSA9IGdldF9ob3N0ZW50KChjb25zdCBjaGFyKikmYWRkciwgc2l6ZW9mKGFkZHIpLCBBRl9JTkVUKTsKKworCXJldHVybiBoZTsKK30KKworLyoKKyAqIEZpbmQgY2xpZW50IG5hbWUgZ2l2ZW4gYW4gSVAgYWRkcmVzcworICogVGhpcyBpcyBmb3VuZCBieSBnYXRoZXJpbmcgYWxsIGtub3duIG5hbWVzIHRoYXQgbWF0Y2ggdGhhdCBJUCBhZGRyZXNzLAorICogc29ydGluZyB0aGVtIGFuZCBqb2luaW5nIHRoZW0gd2l0aCAnKycKKyAqCisgKi8KK3N0YXRpYyBjaGFyICphZGRfbmFtZShjaGFyICpvbGQsIGNoYXIgKmFkZCk7CisKK2NoYXIgKgorY2xpZW50X2NvbXBvc2Uoc3RydWN0IGhvc3RlbnQgKmhlKQoreworCWNoYXIgKm5hbWUgPSBOVUxMOworCWludCBpOworCisJZm9yIChpID0gMCA7IGkgPCBNQ0xfTUFYVFlQRVM7IGkrKykgeworCQluZnNfY2xpZW50CSpjbHA7CisJCWZvciAoY2xwID0gY2xpZW50bGlzdFtpXTsgY2xwIDsgY2xwID0gY2xwLT5tX25leHQpIHsKKwkJCWlmICghY2xpZW50X2NoZWNrKGNscCwgaGUpKQorCQkJCWNvbnRpbnVlOworCQkJbmFtZSA9IGFkZF9uYW1lKG5hbWUsIGNscC0+bV9ob3N0bmFtZSk7CisJCX0KKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK2ludAorY2xpZW50X21lbWJlcihjaGFyICpjbGllbnQsIGNoYXIgKm5hbWUpCit7CisJLyogY2hlY2sgaWYgImNsaWVudCIgKGEgJywnIHNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzKQorCSAqIGNvbnRhaW5zICduYW1lJyBhcyBhIG1lbWJlcgorCSAqLworCWludCBsID0gc3RybGVuKG5hbWUpOworCXdoaWxlICgqY2xpZW50KSB7CisJCWlmIChzdHJuY21wKGNsaWVudCwgbmFtZSwgbCkgPT0gMCAmJgorCQkgICAgKGNsaWVudFtsXSA9PSAnLCcgfHwgY2xpZW50W2xdID09ICdcMCcpKQorCQkJcmV0dXJuIDE7CisJCWNsaWVudCA9IHN0cmNocihjbGllbnQsICcsJyk7CisJCWlmIChjbGllbnQgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQljbGllbnQrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworaW50CituYW1lX2NtcChjaGFyICphLCBjaGFyICpiKQoreworCS8qIGNvbXBhcmUgc3RyaW5ncyBhIGFuZCBiLCBidXQgb25seSB1cHRvICcsJyBpbiBhICovCisJd2hpbGUgKCphICYmICpiICYmICphICE9ICcsJyAmJiAqYSA9PSAqYikKKwkJYSsrLCBiKys7CisJaWYgKCEqYiAmJiAoISphIHx8ICphID09ICcsJykpCisJCXJldHVybiAwOworCWlmICghKmIpIHJldHVybiAxOworCWlmICghKmEgfHwgKmEgPT0gJywnKSByZXR1cm4gLTE7CisJcmV0dXJuICphIC0gKmI7Cit9CisKK3N0YXRpYyBjaGFyICoKK2FkZF9uYW1lKGNoYXIgKm9sZCwgY2hhciAqYWRkKQoreworCWludCBsZW4gPSBzdHJsZW4oYWRkKSsyOworCWNoYXIgKm5ldzsKKwljaGFyICpjcDsKKwlpZiAob2xkKSBsZW4gKz0gc3RybGVuKG9sZCk7CisJCisJbmV3ID0gbWFsbG9jKGxlbik7CisJaWYgKCFuZXcpIHsKKwkJZnJlZShvbGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3AgPSBvbGQ7CisJd2hpbGUgKGNwICYmICpjcCAmJiBuYW1lX2NtcChjcCwgYWRkKSA8IDApIHsKKwkJLyogc3RlcCBjcCBmb3J3YXJkIG92ZXIgYSBuYW1lICovCisJCWNoYXIgKmUgPSBzdHJjaHIoY3AsICcsJyk7CisJCWlmIChlKQorCQkJY3AgPSBlKzE7CisJCWVsc2UKKwkJCWNwID0gY3AgKyBzdHJsZW4oY3ApOworCX0KKwlzdHJuY3B5KG5ldywgb2xkLCBjcC1vbGQpOworCW5ld1tjcC1vbGRdID0gMDsKKwlpZiAoY3AgIT0gb2xkICYmICEqY3ApCisJCXN0cmNhdChuZXcsICIsIik7CisJc3RyY2F0KG5ldywgYWRkKTsKKwlpZiAoY3AgJiYgKmNwKSB7CisJCXN0cmNhdChuZXcsICIsIik7CisJCXN0cmNhdChuZXcsIGNwKTsKKwl9CisJZnJlZShvbGQpOworCXJldHVybiBuZXc7Cit9CisKKy8qCisgKiBNYXRjaCBhIGhvc3QgKGdpdmVuIGl0cyBob3N0ZW50IHJlY29yZCkgdG8gYSBjbGllbnQgcmVjb3JkLiBUaGlzCisgKiBpcyB1c3VhbGx5IGNhbGxlZCBmcm9tIG1vdW50ZC4KKyAqLworaW50CitjbGllbnRfY2hlY2sobmZzX2NsaWVudCAqY2xwLCBzdHJ1Y3QgaG9zdGVudCAqaHApCit7CisJY2hhcgkqaG5hbWUgPSAoY2hhciAqKSBocC0+aF9uYW1lOworCWNoYXIJKmNuYW1lID0gY2xwLT5tX2hvc3RuYW1lOworCWNoYXIJKiphcDsKKworCXN3aXRjaCAoY2xwLT5tX3R5cGUpIHsKKwljYXNlIE1DTF9GUUROOgorCWNhc2UgTUNMX1NVQk5FVFdPUks6CisJCWZvciAoYXAgPSBocC0+aF9hZGRyX2xpc3Q7ICphcDsgYXArKykgeworCQkJaWYgKGNsaWVudF9jaGVja2FkZHIoY2xwLCAqKHN0cnVjdCBpbl9hZGRyICopICphcCkpCisJCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBNQ0xfV0lMRENBUkQ6CisJCWlmICh3aWxkbWF0KGhuYW1lLCBjbmFtZSkpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSB7CisJCQlmb3IgKGFwID0gaHAtPmhfYWxpYXNlczsgKmFwOyBhcCsrKQorCQkJCWlmICh3aWxkbWF0KCphcCwgY25hbWUpKQorCQkJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIE1DTF9ORVRHUk9VUDoKKyNpZmRlZiBIQVZFX0lOTkVUR1IKKwkJeworCQkJY2hhcgkqZG90OworCQkJaW50CW1hdGNoLCBpOworCQkJc3RydWN0IGhvc3RlbnQgKm5ocCA9IE5VTEw7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKworCQkJLyogRmlyc3QsIHRyeSB0byBtYXRjaCB0aGUgaG9zdG5hbWUgd2l0aG91dAorCQkJICogc3BsaXR0aW5nIG9mZiB0aGUgZG9tYWluICovCisJCQlpZiAoaW5uZXRncihjbmFtZSsxLCBobmFtZSwgTlVMTCwgTlVMTCkpCisJCQkJcmV0dXJuIDE7CisKKwkJCS8qIHRyeSB0aGUgYWxpYXNlcyBhcyB3ZWxsICovCisJCQlmb3IgKGkgPSAwOyBocC0+aF9hbGlhc2VzW2ldOyBpKyspIHsKKwkJCQlpZiAoaW5uZXRncihjbmFtZSsxLCBocC0+aF9hbGlhc2VzW2ldLCBOVUxMLCBOVUxMKSkKKwkJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCS8qIElmIGhuYW1lIGlzIGlwIGFkZHJlc3MgY29udmVydCB0byBGUUROICovCisJCQlpZiAoaW5ldF9hdG9uKGhuYW1lLCAmYWRkci5zaW5fYWRkcikgJiYKKwkJCSAgIChuaHAgPSBnZXRob3N0YnlhZGRyKChjb25zdCBjaGFyICopJihhZGRyLnNpbl9hZGRyKSwKKwkJCSAgICBzaXplb2YoYWRkci5zaW5fYWRkciksIEFGX0lORVQpKSkgeworCQkJCWhuYW1lID0gKGNoYXIgKiluaHAtPmhfbmFtZTsKKwkJCQlpZiAoaW5uZXRncihjbmFtZSsxLCBobmFtZSwgTlVMTCwgTlVMTCkpCisJCQkJCXJldHVybiAxOworCQkJfQorCisJCQkvKiBPa2F5LCBzdHJpcCBvZmYgdGhlIGRvbWFpbiAoaWYgd2UgaGF2ZSBvbmUpICovCisJCQlpZiAoKGRvdCA9IHN0cmNocihobmFtZSwgJy4nKSkgPT0gTlVMTCkKKwkJCQlyZXR1cm4gMDsKKworCQkJKmRvdCA9ICdcMCc7CisJCQltYXRjaCA9IGlubmV0Z3IoY25hbWUrMSwgaG5hbWUsIE5VTEwsIE5VTEwpOworCQkJKmRvdCA9ICcuJzsKKworCQkJcmV0dXJuIG1hdGNoOworCQl9CisjZWxzZQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWNhc2UgTUNMX0FOT05ZTU9VUzoKKwkJcmV0dXJuIDE7CisJY2FzZSBNQ0xfR1NTOgorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQl4bG9nKExfRkFUQUwsICJpbnRlcm5hbDogYmFkIGNsaWVudCB0eXBlICVkIiwgY2xwLT5tX3R5cGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitjbGllbnRfY2hlY2thZGRyKG5mc19jbGllbnQgKmNscCwgc3RydWN0IGluX2FkZHIgYWRkcikKK3sKKwlpbnQJaTsKKworCXN3aXRjaCAoY2xwLT5tX3R5cGUpIHsKKwljYXNlIE1DTF9GUUROOgorCQlmb3IgKGkgPSAwOyBpIDwgY2xwLT5tX25hZGRyOyBpKyspIHsKKwkJCWlmIChjbHAtPm1fYWRkcmxpc3RbaV0uc19hZGRyID09IGFkZHIuc19hZGRyKQorCQkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCWNhc2UgTUNMX1NVQk5FVFdPUks6CisJCXJldHVybiAhKChjbHAtPm1fYWRkcmxpc3RbMF0uc19hZGRyIF4gYWRkci5zX2FkZHIpCisJCQkmIGNscC0+bV9hZGRybGlzdFsxXS5zX2FkZHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitjbGllbnRfZ2V0dHlwZShjaGFyICppZGVudCkKK3sKKwljaGFyCSpzcDsKKworCWlmIChpZGVudFswXSA9PSAnXDAnIHx8IHN0cmNtcChpZGVudCwgIioiKT09MCkKKwkJcmV0dXJuIE1DTF9BTk9OWU1PVVM7CisJaWYgKHN0cm5jbXAoaWRlbnQsICJnc3MvIiwgNCkgPT0gMCkKKwkJcmV0dXJuIE1DTF9HU1M7CisJaWYgKGlkZW50WzBdID09ICdAJykgeworI2lmbmRlZiBIQVZFX0lOTkVUR1IKKwkJeGxvZyhMX1dBUk5JTkcsICJuZXRncm91cCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiIpOworI2VuZGlmCisJCXJldHVybiBNQ0xfTkVUR1JPVVA7CisJfQorCWZvciAoc3AgPSBpZGVudDsgKnNwOyBzcCsrKSB7CisJCWlmICgqc3AgPT0gJyonIHx8ICpzcCA9PSAnPycgfHwgKnNwID09ICdbJykKKwkJCXJldHVybiBNQ0xfV0lMRENBUkQ7CisJCWlmICgqc3AgPT0gJy8nKQorCQkJcmV0dXJuIE1DTF9TVUJORVRXT1JLOworCQlpZiAoKnNwID09ICdcXCcgJiYgc3BbMV0pCisJCQlzcCsrOworCX0KKwkvKiBjaGVjayBmb3IgTi5OLk4uTiAqLworCXNwID0gaWRlbnQ7CisJaWYoIWlzZGlnaXQoKnNwKSB8fCBzdHJ0b3VsKHNwLCAmc3AsIDEwKSA+IDI1NSB8fCAqc3AgIT0gJy4nKSByZXR1cm4gTUNMX0ZRRE47CisJc3ArKzsgaWYoIWlzZGlnaXQoKnNwKSB8fCBzdHJ0b3VsKHNwLCAmc3AsIDEwKSA+IDI1NSB8fCAqc3AgIT0gJy4nKSByZXR1cm4gTUNMX0ZRRE47CisJc3ArKzsgaWYoIWlzZGlnaXQoKnNwKSB8fCBzdHJ0b3VsKHNwLCAmc3AsIDEwKSA+IDI1NSB8fCAqc3AgIT0gJy4nKSByZXR1cm4gTUNMX0ZRRE47CisJc3ArKzsgaWYoIWlzZGlnaXQoKnNwKSB8fCBzdHJ0b3VsKHNwLCAmc3AsIDEwKSA+IDI1NSB8fCAqc3AgIT0gJ1wwJykgcmV0dXJuIE1DTF9GUUROOworCS8qIHdlIGxpZSBoZXJlIGEgYml0LiBidXQgdGVjaG5pY2FsbHkgTi5OLk4uTiA9PSBOLk4uTi5OLzMyIDopICovCisJcmV0dXJuIE1DTF9TVUJORVRXT1JLOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L2V4cG9ydC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L2V4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDM0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvZXhwb3J0LmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBzdXBwb3J0L2V4cG9ydC9leHBvcnQuYworICoKKyAqIE1haW50YWluIGxpc3Qgb2YgZXhwb3J0ZWQgZmlsZSBzeXN0ZW1zLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm5mc2xpYi5oIgorI2luY2x1ZGUgImV4cG9ydGZzLmgiCisKK2V4cF9oYXNoX3RhYmxlIGV4cG9ydGxpc3RbTUNMX01BWFRZUEVTXSA9IHt7TlVMTCwge3tOVUxMLE5VTEx9LCB9fSwgfTsgCitzdGF0aWMgaW50IGV4cG9ydF9oYXNoKGNoYXIgKik7CisKK3N0YXRpYyB2b2lkCWV4cG9ydF9pbml0KG5mc19leHBvcnQgKmV4cCwgbmZzX2NsaWVudCAqY2xwLAorCQkJCQlzdHJ1Y3QgZXhwb3J0ZW50ICpuZXApOworc3RhdGljIGludAlleHBvcnRfY2hlY2sobmZzX2V4cG9ydCAqLCBzdHJ1Y3QgaG9zdGVudCAqLCBjaGFyICopOworc3RhdGljIG5mc19leHBvcnQgKgorCQlleHBvcnRfYWxsb3dlZF9pbnRlcm5hbChzdHJ1Y3QgaG9zdGVudCAqaHAsIGNoYXIgKnBhdGgpOworCitzdGF0aWMgdm9pZCB3YXJuX2R1cGxpY2F0ZWRfZXhwb3J0cyhuZnNfZXhwb3J0ICpleHAsIHN0cnVjdCBleHBvcnRlbnQgKmVlcCkKK3sKKwlpZiAoZXhwLT5tX2V4cG9ydC5lX2ZsYWdzICE9IGVlcC0+ZV9mbGFncykgeworCQl4bG9nKExfRVJST1IsICJpbmNvbXBhdGlibGUgZHVwbGljYXRlZCBleHBvcnQgZW50cmllczoiKTsKKwkJeGxvZyhMX0VSUk9SLCAiXHQlczolcyAoMHgleCkgW0lHTk9SRURdIiwgZWVwLT5lX2hvc3RuYW1lLAorCQkJCWVlcC0+ZV9wYXRoLCBlZXAtPmVfZmxhZ3MpOworCQl4bG9nKExfRVJST1IsICJcdCVzOiVzICgweCV4KSIsIGV4cC0+bV9leHBvcnQuZV9ob3N0bmFtZSwKKwkJCQlleHAtPm1fZXhwb3J0LmVfcGF0aCwgZXhwLT5tX2V4cG9ydC5lX2ZsYWdzKTsKKwl9IGVsc2UgeworCQl4bG9nKExfRVJST1IsICJkdXBsaWNhdGVkIGV4cG9ydCBlbnRyaWVzOiIpOworCQl4bG9nKExfRVJST1IsICJcdCVzOiVzIiwgZWVwLT5lX2hvc3RuYW1lLCBlZXAtPmVfcGF0aCk7CisJCXhsb2coTF9FUlJPUiwgIlx0JXM6JXMiLCBleHAtPm1fZXhwb3J0LmVfaG9zdG5hbWUsCisJCQkJZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCX0KK30KKworaW50CitleHBvcnRfcmVhZChjaGFyICpmbmFtZSkKK3sKKwlzdHJ1Y3QgZXhwb3J0ZW50CSplZXA7CisJbmZzX2V4cG9ydAkJKmV4cDsKKworCXNldGV4cG9ydGVudChmbmFtZSwgInIiKTsKKwl3aGlsZSAoKGVlcCA9IGdldGV4cG9ydGVudCgwLDEpKSAhPSBOVUxMKSB7CisJCWV4cCA9IGV4cG9ydF9sb29rdXAoZWVwLT5lX2hvc3RuYW1lLCBlZXAtPmVfcGF0aCwgMCk7CisJCWlmICghZXhwKQorCQkJZXhwb3J0X2NyZWF0ZShlZXAsIDApOworCQllbHNlCisJCQl3YXJuX2R1cGxpY2F0ZWRfZXhwb3J0cyhleHAsIGVlcCk7CisJfQorCWVuZGV4cG9ydGVudCgpOworCXJldHVybiAwOworfQorCisvKgorICogQ3JlYXRlIGFuIGluLWNvcmUgZXhwb3J0IHN0cnVjdCBmcm9tIGFuIGV4cG9ydCBlbnRyeS4KKyAqLworbmZzX2V4cG9ydCAqCitleHBvcnRfY3JlYXRlKHN0cnVjdCBleHBvcnRlbnQgKnhlcCwgaW50IGNhbm9uaWNhbCkKK3sKKwluZnNfY2xpZW50CSpjbHA7CisJbmZzX2V4cG9ydAkqZXhwOworCisJaWYgKCEoY2xwID0gY2xpZW50X2xvb2t1cCh4ZXAtPmVfaG9zdG5hbWUsIGNhbm9uaWNhbCkpKSB7CisJCS8qIGJhZCBleHBvcnQgZW50cnk7IGNvbXBsYWludCBhbHJlYWR5IGxvZ2dlZCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJZXhwID0gKG5mc19leHBvcnQgKikgeG1hbGxvYyhzaXplb2YoKmV4cCkpOworCWV4cG9ydF9pbml0KGV4cCwgY2xwLCB4ZXApOworCWV4cG9ydF9hZGQoZXhwKTsKKworCXJldHVybiBleHA7Cit9CisKK3N0YXRpYyB2b2lkCitleHBvcnRfaW5pdChuZnNfZXhwb3J0ICpleHAsIG5mc19jbGllbnQgKmNscCwgc3RydWN0IGV4cG9ydGVudCAqbmVwKQoreworCXN0cnVjdCBleHBvcnRlbnQJKmUgPSAmZXhwLT5tX2V4cG9ydDsKKworCWR1cGV4cG9ydGVudChlLCBuZXApOworCWlmIChuZXAtPmVfaG9zdG5hbWUpCisJCWUtPmVfaG9zdG5hbWUgPSB4c3RyZHVwKG5lcC0+ZV9ob3N0bmFtZSk7CisKKwlleHAtPm1fZXhwb3J0ZWQgPSAwOworCWV4cC0+bV94dGFiZW50ID0gMDsKKwlleHAtPm1fbWF5ZXhwb3J0ID0gMDsKKwlleHAtPm1fY2hhbmdlZCA9IDA7CisJZXhwLT5tX3dhcm5lZCA9IDA7CisJZXhwLT5tX2NsaWVudCA9IGNscDsKKwljbHAtPm1fY291bnQrKzsKK30KKworLyoKKyAqIER1cGxpY2F0ZSBleHBvcnRzIGRhdGEuIFRoZSBpbi1jb3JlIGV4cG9ydCBzdHJ1Y3QgcmV0YWlucyB0aGUKKyAqIG9yaWdpbmFsIGhvc3RuYW1lIGZyb20gL2V0Yy9leHBvcnRzLCB3aGlsZSB0aGUgaW4tY29yZSBjbGllbnQgc3RydWN0CisgKiBnZXRzIHRoZSBuZXdseSBmb3VuZCBGUUROLgorICovCituZnNfZXhwb3J0ICoKK2V4cG9ydF9kdXAobmZzX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgaG9zdGVudCAqaHApCit7CisJbmZzX2V4cG9ydAkJKm5ldzsKKwluZnNfY2xpZW50CQkqY2xwOworCisJbmV3ID0gKG5mc19leHBvcnQgKikgeG1hbGxvYyhzaXplb2YoKm5ldykpOworCW1lbWNweShuZXcsIGV4cCwgc2l6ZW9mKCpuZXcpKTsKKwlkdXBleHBvcnRlbnQoJm5ldy0+bV9leHBvcnQsICZleHAtPm1fZXhwb3J0KTsKKwlpZiAoZXhwLT5tX2V4cG9ydC5lX2hvc3RuYW1lKQorCQluZXctPm1fZXhwb3J0LmVfaG9zdG5hbWUgPSB4c3RyZHVwKGV4cC0+bV9leHBvcnQuZV9ob3N0bmFtZSk7CisJY2xwID0gY2xpZW50X2R1cChleHAtPm1fY2xpZW50LCBocCk7CisJY2xwLT5tX2NvdW50Kys7CisJbmV3LT5tX2NsaWVudCA9IGNscDsKKwluZXctPm1fbWF5ZXhwb3J0ID0gZXhwLT5tX21heWV4cG9ydDsKKwluZXctPm1fZXhwb3J0ZWQgPSAwOworCW5ldy0+bV94dGFiZW50ID0gMDsKKwluZXctPm1fY2hhbmdlZCA9IDA7CisJbmV3LT5tX3dhcm5lZCA9IDA7CisJZXhwb3J0X2FkZChuZXcpOworCisJcmV0dXJuIG5ldzsKK30KKy8qCisgKiBBZGQgZXhwb3J0IGVudHJ5IHRvIGhhc2ggdGFibGUKKyAqLwordm9pZCAKK2V4cG9ydF9hZGQobmZzX2V4cG9ydCAqZXhwKQoreworCWV4cF9oYXNoX3RhYmxlICpwX3RibDsKKwlleHBfaGFzaF9lbnRyeSAqcF9oZW47CisJbmZzX2V4cG9ydCAqcF9uZXh0OworCisJaW50IHR5cGUgPSBleHAtPm1fY2xpZW50LT5tX3R5cGU7CisJaW50IHBvczsKKworCXBvcyA9IGV4cG9ydF9oYXNoKGV4cC0+bV9leHBvcnQuZV9wYXRoKTsKKwlwX3RibCA9ICYoZXhwb3J0bGlzdFt0eXBlXSk7IC8qIHBvaW50ZXIgdG8gaGFzaCB0YWJsZSAqLworCXBfaGVuID0gJihwX3RibC0+ZW50cmllc1twb3NdKTsgLyogcG9pbnRlciB0byBoYXNoIHRhYmxlIGVudHJ5ICovCisKKwlpZiAoIShwX2hlbi0+cF9maXJzdCkpIHsgLyogaGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eSAqLyAKKyAJCXBfaGVuLT5wX2ZpcnN0ID0gZXhwOworIAkJcF9oZW4tPnBfbGFzdCAgPSBleHA7CisKKyAJCWV4cC0+bV9uZXh0ID0gcF90YmwtPnBfaGVhZDsKKyAJCXBfdGJsLT5wX2hlYWQgPSBleHA7CisJfSBlbHNlIHsgLyogaGFzaCB0YWJsZSBlbnRyeSBpcyBOT1QgZW1wdHkgKi8KKwkJcF9uZXh0ID0gcF9oZW4tPnBfbGFzdC0+bV9uZXh0OworCQlwX2hlbi0+cF9sYXN0LT5tX25leHQgPSBleHA7CisJCWV4cC0+bV9uZXh0ID0gcF9uZXh0OworCQlwX2hlbi0+cF9sYXN0ID0gZXhwOworCX0KK30KKworbmZzX2V4cG9ydCAqCitleHBvcnRfZmluZChzdHJ1Y3QgaG9zdGVudCAqaHAsIGNoYXIgKnBhdGgpCit7CisJbmZzX2V4cG9ydAkqZXhwOworCWludAkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQ0xfTUFYVFlQRVM7IGkrKykgeworCQlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaV0ucF9oZWFkOyBleHA7IGV4cCA9IGV4cC0+bV9uZXh0KSB7CisJCQlpZiAoIWV4cG9ydF9jaGVjayhleHAsIGhwLCBwYXRoKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChleHAtPm1fY2xpZW50LT5tX3R5cGUgPT0gTUNMX0ZRRE4pCisJCQkJcmV0dXJuIGV4cDsKKwkJCXJldHVybiBleHBvcnRfZHVwKGV4cCwgaHApOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBuZnNfZXhwb3J0ICoKK2V4cG9ydF9hbGxvd2VkX2ludGVybmFsIChzdHJ1Y3QgaG9zdGVudCAqaHAsIGNoYXIgKnBhdGgpCit7CisJbmZzX2V4cG9ydAkqZXhwOworCWludAkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQ0xfTUFYVFlQRVM7IGkrKykgeworCQlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaV0ucF9oZWFkOyBleHA7IGV4cCA9IGV4cC0+bV9uZXh0KSB7CisJCQlpZiAoIWV4cC0+bV9tYXlleHBvcnQgfHwKKwkJCSAgICAhZXhwb3J0X2NoZWNrKGV4cCwgaHAsIHBhdGgpKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIGV4cDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCituZnNfZXhwb3J0ICoKK2V4cG9ydF9hbGxvd2VkKHN0cnVjdCBob3N0ZW50ICpocCwgY2hhciAqcGF0aCkKK3sKKwluZnNfZXhwb3J0CQkqZXhwOworCWNoYXIJCQllcGF0aFtNQVhQQVRITEVOKzFdOworCWNoYXIJCQkqcCA9IE5VTEw7CisKKwlpZiAocGF0aCBbMF0gIT0gJy8nKSByZXR1cm4gTlVMTDsKKworCXN0cm5jcHkoZXBhdGgsIHBhdGgsIHNpemVvZiAoZXBhdGgpIC0gMSk7CisJZXBhdGhbc2l6ZW9mIChlcGF0aCkgLSAxXSA9ICdcMCc7CisKKwkvKiBUcnkgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgZXhwb3J0ZWQgcGF0aG5hbWUuICovCisJd2hpbGUgKDEpIHsKKwkJZXhwID0gZXhwb3J0X2FsbG93ZWRfaW50ZXJuYWwgKGhwLCBlcGF0aCk7CisJCWlmIChleHApCisJCQlyZXR1cm4gZXhwOworCQkvKiBXZSBoYXZlIHRvIHRyZWF0IHRoZSByb290LCAiLyIsIHNwZWNpYWxseS4gKi8KKwkJaWYgKHAgPT0gJmVwYXRoWzFdKSBicmVhazsKKwkJcCA9IHN0cnJjaHIoZXBhdGgsICcvJyk7CisJCWlmIChwID09IGVwYXRoKSBwKys7CisJCSpwID0gJ1wwJzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNlYXJjaCBoYXNoIHRhYmxlIGZvciBleHBvcnQgZW50cnkuIAorICovICAKK25mc19leHBvcnQgKgorZXhwb3J0X2xvb2t1cChjaGFyICpobmFtZSwgY2hhciAqcGF0aCwgaW50IGNhbm9uaWNhbCkgCit7CisJbmZzX2NsaWVudCAqY2xwOworCW5mc19leHBvcnQgKmV4cDsKKwlleHBfaGFzaF9lbnRyeSAqcF9oZW47CisKKwlpbnQgcG9zOworCisJY2xwID0gY2xpZW50X2xvb2t1cChobmFtZSwgY2Fub25pY2FsKTsKKwlpZihjbHAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb3MgPSBleHBvcnRfaGFzaChwYXRoKTsKKwlwX2hlbiA9ICYoZXhwb3J0bGlzdFtjbHAtPm1fdHlwZV0uZW50cmllc1twb3NdKTsgCisJZm9yKGV4cCA9IHBfaGVuLT5wX2ZpcnN0OyBleHAgJiYgKGV4cCAhPSBwX2hlbi0+cF9sYXN0LT5tX25leHQpOyAKKyAgCQkJZXhwID0gZXhwLT5tX25leHQpIHsKKwkJaWYgKGV4cC0+bV9jbGllbnQgPT0gY2xwICYmICFzdHJjbXAoZXhwLT5tX2V4cG9ydC5lX3BhdGgsIHBhdGgpKSB7CisgIAkJCXJldHVybiBleHA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2V4cG9ydF9jaGVjayhuZnNfZXhwb3J0ICpleHAsIHN0cnVjdCBob3N0ZW50ICpocCwgY2hhciAqcGF0aCkKK3sKKwlpZiAoc3RyY21wKHBhdGgsIGV4cC0+bV9leHBvcnQuZV9wYXRoKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY2xpZW50X2NoZWNrKGV4cC0+bV9jbGllbnQsIGhwKTsKK30KKwordm9pZAorZXhwb3J0X2ZyZWVhbGwodm9pZCkKK3sKKwluZnNfZXhwb3J0CSpleHAsICpueHQ7CisJaW50CQlpLCBqOworCisJZm9yIChpID0gMDsgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKSB7CisJCWZvciAoZXhwID0gZXhwb3J0bGlzdFtpXS5wX2hlYWQ7IGV4cDsgZXhwID0gbnh0KSB7CisJCQlueHQgPSBleHAtPm1fbmV4dDsKKwkJCWNsaWVudF9yZWxlYXNlKGV4cC0+bV9jbGllbnQpOworCQkJaWYgKGV4cC0+bV9leHBvcnQuZV9zcXVpZHMpCisJCQkJeGZyZWUoZXhwLT5tX2V4cG9ydC5lX3NxdWlkcyk7CisJCQlpZiAoZXhwLT5tX2V4cG9ydC5lX3NxZ2lkcykKKwkJCQl4ZnJlZShleHAtPm1fZXhwb3J0LmVfc3FnaWRzKTsKKwkJCWlmIChleHAtPm1fZXhwb3J0LmVfbW91bnRwb2ludCkKKwkJCQlmcmVlKGV4cC0+bV9leHBvcnQuZV9tb3VudHBvaW50KTsKKwkJCWlmIChleHAtPm1fZXhwb3J0LmVfZnNsb2NkYXRhKQorCQkJCXhmcmVlKGV4cC0+bV9leHBvcnQuZV9mc2xvY2RhdGEpOworCQkJeGZyZWUoZXhwLT5tX2V4cG9ydC5lX2hvc3RuYW1lKTsKKwkJCXhmcmVlKGV4cCk7CisJCX0KKyAgICAgIGZvcihqID0gMDsgaiA8IEhBU0hfVEFCTEVfU0laRTsgaisrKSB7CisgICAgICAgIGV4cG9ydGxpc3RbaV0uZW50cmllc1tqXS5wX2ZpcnN0ID0gTlVMTDsKKyAgICAgICAgZXhwb3J0bGlzdFtpXS5lbnRyaWVzW2pdLnBfbGFzdCA9IE5VTEw7CisgICAgICB9CisgICAgICBleHBvcnRsaXN0W2ldLnBfaGVhZCA9IE5VTEw7CisJfQorCWNsaWVudF9mcmVlYWxsKCk7Cit9CisKKy8qCisgKiBDb21wdXRlIGFuZCByZXR1cm5zIGludGVnZXIgZnJvbSBzdHJpbmcuIAorICogTm90ZTogSXRzIHVuZGVyc3Rvb2QgdGhlIHNtYWUgaW50ZWdlcnMgY2FuIGJlIHNhbWUgZm9yIAorICogICAgICAgZGlmZmVyZW50IHN0cmluZ3MsIGJ1dCBpdCBzaG91bGQgbm90IG1hdHRlci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCAKK3N0cnRvaW50KGNoYXIgKnN0cikKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgaW50IG4gPSAwOworCisJd2hpbGUgKCBzdHJbaV0gIT0gJ1wwJykgeworCQluKz0oKGludClzdHJbaV0pKmk7CisJCWkrKzsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBIYXNoIGZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbnQgCitleHBvcnRfaGFzaChjaGFyICpzdHIpCit7CisJaW50IG51bSA9IHN0cnRvaW50KHN0cik7CisKKwlyZXR1cm4gbnVtICUgSEFTSF9UQUJMRV9TSVpFOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L2hvc3RuYW1lLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvaG9zdG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTIzYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L2hvc3RuYW1lLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBzdXBwb3J0L2V4cG9ydC9ob3N0bmFtZS5jCisgKgorICogRnVuY3Rpb25zIGZvciBob3N0bmFtZS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisvKgorI2RlZmluZSBURVNUCisqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8eGxvZy5oPgorI2lmZGVmIFRFU1QKKyNkZWZpbmUgeG1hbGxvYyBtYWxsb2MKKyNlbHNlCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNlbmRpZgorCisjZGVmaW5lIEFMSUdOTUVOVAlzaXplb2YgKGNoYXIgKikKKworc3RhdGljIGludAorYWxpZ24gKGludCBsZW4sIGludCBhbCkKK3sKKyAgaW50IGk7CisgIGkgPSBsZW4gJSBhbDsKKyAgaWYgKGkpCisgICAgbGVuICs9IGFsIC0gaTsKKyAgcmV0dXJuIGxlbjsKK30KKworc3RydWN0IGhvc3RlbnQgKgorZ2V0X2hvc3RlbnQgKGNvbnN0IGNoYXIgKmFkZHIsIGludCBsZW4sIGludCB0eXBlKQoreworICBzdHJ1Y3QgaG9zdGVudCAqY3A7CisgIGludCBsZW5fZW50OworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgbGVuX25hbWU7CisgIGludCBudW1fYWxpYXNlcyA9IDE7CisgIGludCBsZW5fYWxpYXNlcyA9IHNpemVvZiAoY2hhciAqKTsKKyAgaW50IG51bV9hZGRyX2xpc3QgPSAxOworICBpbnQgbGVuX2FkZHJfbGlzdCA9IHNpemVvZiAoY2hhciAqKTsKKyAgaW50IHBvczsKKyAgc3RydWN0IGluX2FkZHIgKmlwdjQ7CisKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICBpcHY0ID0gKHN0cnVjdCBpbl9hZGRyICopIGFkZHI7CisgICAgICBuYW1lID0gaW5ldF9udG9hICgqaXB2NCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgbGVuX2VudCA9IGFsaWduIChzaXplb2YgKCpjcCksIEFMSUdOTUVOVCk7CisgIGxlbl9uYW1lID0gYWxpZ24gKHN0cmxlbiAobmFtZSkgKyAxLCBBTElHTk1FTlQpOworCisgIG51bV9hZGRyX2xpc3QrKzsKKyAgbGVuX2FkZHJfbGlzdCArPSBhbGlnbiAobGVuLCBBTElHTk1FTlQpICsgc2l6ZW9mIChjaGFyICopOworCisgIGNwID0gKHN0cnVjdCBob3N0ZW50ICopIHhtYWxsb2MgKGxlbl9lbnQgKyBsZW5fbmFtZSArIGxlbl9hbGlhc2VzCisJCQkJICAgKyBsZW5fYWRkcl9saXN0KTsKKworICBjcC0+aF9hZGRydHlwZSA9IHR5cGU7CisgIGNwLT5oX2xlbmd0aCA9IGxlbjsKKyAgcG9zID0gbGVuX2VudDsKKyAgY3AtPmhfbmFtZSA9IChjaGFyICopICYoKChjaGFyICopIGNwKSBbcG9zXSk7CisgIHN0cmNweSAoY3AtPmhfbmFtZSwgbmFtZSk7CisKKyAgcG9zICs9IGxlbl9uYW1lOworICBjcC0+aF9hbGlhc2VzID0gKGNoYXIgKiopICYoKChjaGFyICopIGNwKSBbcG9zXSk7CisgIHBvcyArPSBudW1fYWxpYXNlcyAqIHNpemVvZiAoY2hhciAqKTsKKyAgY3AtPmhfYWxpYXNlcyBbMF0gPSBOVUxMOworCisgIHBvcyA9IGxlbl9lbnQgKyBsZW5fbmFtZSArIGxlbl9hbGlhc2VzOworICBjcC0+aF9hZGRyX2xpc3QgPSAoY2hhciAqKikgJigoKGNoYXIgKikgY3ApIFtwb3NdKTsKKyAgcG9zICs9IG51bV9hZGRyX2xpc3QgKiBzaXplb2YgKGNoYXIgKik7CisgIGNwLT5oX2FkZHJfbGlzdCBbMF0gPSAoY2hhciAqKSAmKCgoY2hhciAqKSBjcCkgW3Bvc10pOworICBtZW1jcHkgKGNwLT5oX2FkZHJfbGlzdCBbMF0sIGFkZHIsIGNwLT5oX2xlbmd0aCk7CisgIHBvcyArPSBhbGlnbiAoY3AtPmhfbGVuZ3RoLCBBTElHTk1FTlQpOworICBjcC0+aF9hZGRyX2xpc3QgWzFdID0gTlVMTDsKKworICByZXR1cm4gY3A7Cit9CisKK3N0cnVjdCBob3N0ZW50ICoKK2hvc3RlbnRfZHVwIChzdHJ1Y3QgaG9zdGVudCAqaHApCit7CisgIGludCBsZW5fZW50ID0gYWxpZ24gKHNpemVvZiAoKmhwKSwgQUxJR05NRU5UKTsKKyAgaW50IGxlbl9uYW1lID0gYWxpZ24gKHN0cmxlbiAoaHAtPmhfbmFtZSkgKyAxLCBBTElHTk1FTlQpOworICBpbnQgbnVtX2FsaWFzZXMgPSAxOworICBpbnQgbGVuX2FsaWFzZXMgPSBzaXplb2YgKGNoYXIgKik7CisgIGludCBudW1fYWRkcl9saXN0ID0gMTsKKyAgaW50IGxlbl9hZGRyX2xpc3QgPSBzaXplb2YgKGNoYXIgKik7CisgIGludCBwb3MsIGk7CisgIGNoYXIgKipzcDsKKyAgc3RydWN0IGhvc3RlbnQgKmNwOworCisgIGZvciAoc3AgPSBocC0+aF9hbGlhc2VzOyBzcCAmJiAqc3A7IHNwKyspCisgICAgeworICAgICAgbnVtX2FsaWFzZXMrKzsKKyAgICAgIGxlbl9hbGlhc2VzICs9IGFsaWduIChzdHJsZW4gKCpzcCkgKyAxLCBBTElHTk1FTlQpCisJCSAgICAgKyBzaXplb2YgKGNoYXIgKik7CisgICAgfQorCisgIGZvciAoc3AgPSBocC0+aF9hZGRyX2xpc3Q7ICpzcDsgc3ArKykKKyAgICB7CisgICAgICBudW1fYWRkcl9saXN0Kys7CisgICAgICBsZW5fYWRkcl9saXN0ICs9IGFsaWduIChocC0+aF9sZW5ndGgsIEFMSUdOTUVOVCkKKwkJICAgICAgICsgc2l6ZW9mIChjaGFyICopOworICAgIH0KKworICBjcCA9IChzdHJ1Y3QgaG9zdGVudCAqKSB4bWFsbG9jIChsZW5fZW50ICsgbGVuX25hbWUgKyBsZW5fYWxpYXNlcworCQkJCSAgICsgbGVuX2FkZHJfbGlzdCk7CisKKyAgKmNwID0gKmhwOworICBwb3MgPSBsZW5fZW50OworICBjcC0+aF9uYW1lID0gKGNoYXIgKikgJigoKGNoYXIgKikgY3ApIFtwb3NdKTsKKyAgc3RyY3B5IChjcC0+aF9uYW1lLCBocC0+aF9uYW1lKTsKKworICBwb3MgKz0gbGVuX25hbWU7CisgIGNwLT5oX2FsaWFzZXMgPSAoY2hhciAqKikgJigoKGNoYXIgKikgY3ApIFtwb3NdKTsKKyAgcG9zICs9IG51bV9hbGlhc2VzICogc2l6ZW9mIChjaGFyICopOworICBmb3IgKHNwID0gaHAtPmhfYWxpYXNlcywgaSA9IDA7IGkgPCBudW1fYWxpYXNlczsgaSsrLCBzcCsrKQorICAgIGlmIChzcCAmJiAqc3ApCisgICAgICB7CisJY3AtPmhfYWxpYXNlcyBbaV0gPSAoY2hhciAqKSAmKCgoY2hhciAqKSBjcCkgW3Bvc10pOworCXN0cmNweSAoY3AtPmhfYWxpYXNlcyBbaV0sICpzcCk7CisJcG9zICs9IGFsaWduIChzdHJsZW4gKCpzcCkgKyAxLCBBTElHTk1FTlQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIGNwLT5oX2FsaWFzZXMgW2ldID0gTlVMTDsKKworICBwb3MgPSBsZW5fZW50ICsgbGVuX25hbWUgKyBsZW5fYWxpYXNlczsKKyAgY3AtPmhfYWRkcl9saXN0ID0gKGNoYXIgKiopICYoKChjaGFyICopIGNwKSBbcG9zXSk7CisgIHBvcyArPSBudW1fYWRkcl9saXN0ICogc2l6ZW9mIChjaGFyICopOworICBmb3IgKHNwID0gaHAtPmhfYWRkcl9saXN0LCBpID0gMDsgaSA8IG51bV9hZGRyX2xpc3Q7IGkrKywgc3ArKykKKyAgICBpZiAoKnNwKQorICAgICAgeworCWNwLT5oX2FkZHJfbGlzdCBbaV0gPSAoY2hhciAqKSAmKCgoY2hhciAqKSBjcCkgW3Bvc10pOworCW1lbWNweSAoY3AtPmhfYWRkcl9saXN0IFtpXSwgKnNwLCBocC0+aF9sZW5ndGgpOworCXBvcyArPSBhbGlnbiAoaHAtPmhfbGVuZ3RoLCBBTElHTk1FTlQpOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIGNwLT5oX2FkZHJfbGlzdCBbaV0gPSAqc3A7CisKKyAgcmV0dXJuIGNwOworfQorCitzdGF0aWMgaW50Citpc19ob3N0bmFtZShjb25zdCBjaGFyICpzcCkKK3sKKyAgaWYgKCpzcCA9PSAnXDAnIHx8ICpzcCA9PSAnQCcpCisgICAgcmV0dXJuIDA7CisKKyAgZm9yICg7ICpzcDsgc3ArKykKKyAgICB7CisgICAgICBpZiAoKnNwID09ICcqJyB8fCAqc3AgPT0gJz8nIHx8ICpzcCA9PSAnWycgfHwgKnNwID09ICcvJykKKwlyZXR1cm4gMDsKKyAgICAgIGlmICgqc3AgPT0gJ1xcJyAmJiBzcFsxXSkKKwlzcCsrOworICAgIH0KKworICByZXR1cm4gMTsKK30KKworaW50CittYXRjaGhvc3RuYW1lIChjb25zdCBjaGFyICpoMSwgY29uc3QgY2hhciAqaDIpCit7CisgIHN0cnVjdCBob3N0ZW50ICpocDEsICpocDI7CisgIGludCBzdGF0dXM7CisKKyAgaWYgKHN0cmNhc2VjbXAgKGgxLCBoMikgPT0gMCkKKyAgICByZXR1cm4gMTsKKworICBpZiAoIWlzX2hvc3RuYW1lIChoMSkgfHwgIWlzX2hvc3RuYW1lIChoMikpCisgICAgcmV0dXJuIDA7CisKKyAgaHAxID0gZ2V0aG9zdGJ5bmFtZSAoaDEpOworICBpZiAoaHAxID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisKKyAgaHAxID0gaG9zdGVudF9kdXAgKGhwMSk7CisKKyAgaHAyID0gZ2V0aG9zdGJ5bmFtZSAoaDIpOworICBpZiAoaHAyKQorICAgIHsKKyAgICAgIGlmIChzdHJjYXNlY21wIChocDEtPmhfbmFtZSwgaHAyLT5oX25hbWUpID09IDApCisJc3RhdHVzID0gMTsKKyAgICAgIGVsc2UKKwl7CisJICBjaGFyICoqYXAxLCAqKmFwMjsKKworCSAgc3RhdHVzID0gMDsKKwkgIGZvciAoYXAxID0gaHAxLT5oX2FkZHJfbGlzdDsgKmFwMSAmJiBzdGF0dXMgPT0gMDsgYXAxKyspCisJICAgIGZvciAoYXAyID0gaHAyLT5oX2FkZHJfbGlzdDsgKmFwMjsgYXAyKyspCisJICAgICAgaWYgKG1lbWNtcCAoKmFwMSwgKmFwMiwgc2l6ZW9mIChzdHJ1Y3QgaW5fYWRkcikpID09IDApCisJCXsKKwkJICBzdGF0dXMgPSAxOworCQkgIGJyZWFrOworCQl9CisJfQorICAgIH0KKyAgZWxzZQorICAgIHN0YXR1cyA9IDA7CisKKyAgZnJlZSAoaHAxKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKiBNYXAgSVAgdG8gaG9zdG5hbWUsIGFuZCB0aGVuIG1hcCBiYWNrIHRvIGFkZHIgdG8gbWFrZSBzdXJlIGl0IGlzIGEKKyAqIHJlbGlhYmxlIGhvc3RuYW1lCisgKi8KK3N0cnVjdCBob3N0ZW50ICoKK2dldF9yZWxpYWJsZV9ob3N0YnlhZGRyKGNvbnN0IGNoYXIgKmFkZHIsIGludCBsZW4sIGludCB0eXBlKQoreworCXN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CisKKwlzdHJ1Y3QgaG9zdGVudCAqcmV2ZXJzZTsKKwlzdHJ1Y3QgaG9zdGVudCAqZm9yd2FyZDsKKwljaGFyICoqc3A7CisKKwlyZXZlcnNlID0gZ2V0aG9zdGJ5YWRkciAoYWRkciwgbGVuLCB0eXBlKTsKKwlpZiAoIXJldmVyc2UpCisJCXJldHVybiBOVUxMOworCisJLyogbXVzdCBtYWtlIHN1cmUgdGhlIGhvc3RlbnQgaXMgYXV0aG9yYXRpdmUuICovCisKKwlyZXZlcnNlID0gaG9zdGVudF9kdXAgKHJldmVyc2UpOworCWZvcndhcmQgPSBnZXRob3N0YnluYW1lIChyZXZlcnNlLT5oX25hbWUpOworCisJaWYgKGZvcndhcmQpIHsKKwkJLyogbm93IG1ha2Ugc3VyZSB0aGUgImFkZHIiIGlzIGluIHRoZSBsaXN0ICovCisJCWZvciAoc3AgPSBmb3J3YXJkLT5oX2FkZHJfbGlzdCA7ICpzcCA7IHNwKyspIHsKKwkJCWlmIChtZW1jbXAgKCpzcCwgYWRkciwgZm9yd2FyZC0+aF9sZW5ndGgpID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKnNwKSB7CisJCQkvKiBpdCdzIHZhbGlkICovCisJCQlocCA9IGhvc3RlbnRfZHVwIChmb3J3YXJkKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIGl0IHdhcyBhIEZBS0UgKi8KKwkJCXhsb2cgKExfV0FSTklORywgIkZha2UgaG9zdG5hbWUgJXMgZm9yICVzIC0gZm9yd2FyZCBsb29rdXAgZG9lc24ndCBtYXRjaCByZXZlcnNlIiwKKwkJCSAgICAgIHJldmVyc2UtPmhfbmFtZSwgaW5ldF9udG9hKCooc3RydWN0IGluX2FkZHIqKWFkZHIpKTsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogbmV2ZXIgaGVhcmQgb2YgaXQuIG1pc2NvbmZpZ3VyZWQgRE5TPyAqLworCQl4bG9nIChMX1dBUk5JTkcsICJGYWtlIGhvc3RuYW1lICVzIGZvciAlcyAtIGZvcndhcmQgbG9va3VwIGRvZXNuJ3QgZXhpc3QiLAorCQkgICAgICByZXZlcnNlLT5oX25hbWUsIGluZXRfbnRvYSgqKHN0cnVjdCBpbl9hZGRyKilhZGRyKSk7CisJfQorCisJZnJlZSAocmV2ZXJzZSk7CisJcmV0dXJuIGhwOworfQorCisKKyNpZmRlZiBURVNUCit2b2lkCitwcmludF9ob3N0IChzdHJ1Y3QgaG9zdGVudCAqaHApCit7CisgIGNoYXIgKipzcDsKKworICBpZiAoaHApCisgICAgeworICAgICAgcHJpbnRmICgib2ZmaWNpYWwgaG9zdG5hbWU6ICVzXG4iLCBocC0+aF9uYW1lKTsKKyAgICAgIHByaW50ZiAoImFsaWFzZXM6XG4iKTsKKyAgICAgIGZvciAoc3AgPSBocC0+aF9hbGlhc2VzOyAqc3A7IHNwKyspCisJcHJpbnRmICgiICAlc1xuIiwgKnNwKTsKKyAgICAgIHByaW50ZiAoIklQIGFkZHJlc3NlczpcbiIpOworICAgICAgZm9yIChzcCA9IGhwLT5oX2FkZHJfbGlzdDsgKnNwOyBzcCsrKQorCXByaW50ZiAoIiAgJXNcbiIsIGluZXRfbnRvYSAoKihzdHJ1Y3QgaW5fYWRkciAqKSAqc3ApKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYgKCJOb3QgaG9zdCBpbmZvcm1hdGlvblxuIik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBnZXRob3N0YnluYW1lIChhcmd2IFsxXSk7CisgIHN0cnVjdCBob3N0ZW50ICpjcDsKKyAgc3RydWN0IGluX2FkZHIgYWRkcjsKKworICBwcmludF9ob3N0IChocCk7CisKKyAgaWYgKGhwKQorICAgIHsKKyAgICAgIGNwID0gaG9zdGVudF9kdXAgKGhwKTsKKyAgICAgIHByaW50X2hvc3QgKGNwKTsKKyAgICAgIGZyZWUgKGNwKTsKKyAgICB9CisgIHByaW50ZiAoIjEyNy4wLjAuMSA9PSAlczogJWRcbiIsIGFyZ3YgWzFdLAorCSAgbWF0Y2hob3N0bmFtZSAoIjEyNy4wLjAuMSIsIGFyZ3YgWzFdKSk7CisgIGFkZHIuc19hZGRyID0gaW5ldF9hZGRyKGFyZ3YgWzJdKTsKKyAgcHJpbnRmICgiJXNcbiIsIGluZXRfbnRvYSAoYWRkcikpOworICBjcCA9IGdldF9ob3N0ZW50ICgoY29uc3QgY2hhciAqKSZhZGRyLCBzaXplb2YoYWRkciksIEFGX0lORVQpOworICBwcmludF9ob3N0IChjcCk7CisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvbW91bnQueCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2V4cG9ydC9tb3VudC54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZmQ4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvbW91bnQueApAQCAtMCwwICsxLDM0MyBAQAorJS8qCislICogQ29weXJpZ2h0IChjKSAyMDA5LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCislICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyUgKgorJSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorJSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorJSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorJSAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyUgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyUgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyUgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorJSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCislICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyUgKiAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyUgKgorJSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorJSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyUgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorJSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyUgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCislICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyUgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyUgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorJSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCislICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyUgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyUgKi8KKworJS8qCislICogQ29weXJpZ2h0IChjKSAxOTg1LCAxOTkwIGJ5IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyUgKi8KKyUKKyUvKiBmcm9tIEAoIyltb3VudC54CTEuMyA5MS8wMy8xMSBUSVJQQyAxLjAgKi8KKworLyoKKyAqIFByb3RvY29sIGRlc2NyaXB0aW9uIGZvciB0aGUgbW91bnQgcHJvZ3JhbQorICovCisKKyNpZmRlZiBSUENfSERSCislI2lmbmRlZiBfcnBjc3ZjX21vdW50X2gKKyUjZGVmaW5lIF9ycGNzdmNfbW91bnRfaAorJSNpbmNsdWRlIDxtZW1vcnkuaD4KKyNlbmRpZgorCitjb25zdCBNTlRQQVRITEVOID0gMTAyNDsJLyogbWF4aW11bSBieXRlcyBpbiBhIHBhdGhuYW1lIGFyZ3VtZW50ICovCitjb25zdCBNTlROQU1MRU4gPSAyNTU7CQkvKiBtYXhpbXVtIGJ5dGVzIGluIGEgbmFtZSBhcmd1bWVudCAqLworY29uc3QgRkhTSVpFID0gMzI7CQkvKiBzaXplIGluIGJ5dGVzIG9mIGEgZmlsZSBoYW5kbGUgKi8KKworLyoKKyAqIFRoZSBmaGFuZGxlIGlzIHRoZSBmaWxlIGhhbmRsZSB0aGF0IHRoZSBzZXJ2ZXIgcGFzc2VzIHRvIHRoZSBjbGllbnQuCisgKiBBbGwgZmlsZSBvcGVyYXRpb25zIGFyZSBkb25lIHVzaW5nIHRoZSBmaWxlIGhhbmRsZXMgdG8gcmVmZXIgdG8gYSBmaWxlCisgKiBvciBhIGRpcmVjdG9yeS4gVGhlIGZpbGUgaGFuZGxlIGNhbiBjb250YWluIHdoYXRldmVyIGluZm9ybWF0aW9uIHRoZQorICogc2VydmVyIG5lZWRzIHRvIGRpc3Rpbmd1aXNoIGFuIGluZGl2aWR1YWwgZmlsZS4KKyAqLwordHlwZWRlZiBvcGFxdWUgZmhhbmRsZVtGSFNJWkVdOwkKKworLyoKKyAqIElmIGEgc3RhdHVzIG9mIHplcm8gaXMgcmV0dXJuZWQsIHRoZSBjYWxsIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIGFuZCAKKyAqIGEgZmlsZSBoYW5kbGUgZm9yIHRoZSBkaXJlY3RvcnkgZm9sbG93cy4gQSBub24temVybyBzdGF0dXMgaW5kaWNhdGVzCisgKiBzb21lIHNvcnQgb2YgZXJyb3IuIFRoZSBzdGF0dXMgY29ycmVzcG9uZHMgd2l0aCBVTklYIGVycm9yIG51bWJlcnMuCisgKi8KK3VuaW9uIGZoc3RhdHVzIHN3aXRjaCAodW5zaWduZWQgZmhzX3N0YXR1cykgeworY2FzZSAwOgorCWZoYW5kbGUgZmhzX2ZoYW5kbGU7CitkZWZhdWx0OgorCXZvaWQ7Cit9OworCisvKgorICogVGhlIHR5cGUgZGlycGF0aCBpcyB0aGUgcGF0aG5hbWUgb2YgYSBkaXJlY3RvcnkKKyAqLwordHlwZWRlZiBzdHJpbmcgZGlycGF0aDxNTlRQQVRITEVOPjsKKworLyoKKyAqIFRoZSB0eXBlIG5hbWUgaXMgdXNlZCBmb3IgYXJiaXRyYXJ5IG5hbWVzIChob3N0bmFtZXMsIGdyb3VwbmFtZXMpCisgKi8KK3R5cGVkZWYgc3RyaW5nIG5hbWU8TU5UTkFNTEVOPjsKKworLyoKKyAqIEEgbGlzdCBvZiB3aG8gaGFzIHdoYXQgbW91bnRlZAorICovCit0eXBlZGVmIHN0cnVjdCBtb3VudGJvZHkgKm1vdW50bGlzdDsKK3N0cnVjdCBtb3VudGJvZHkgeworCW5hbWUgbWxfaG9zdG5hbWU7CisJZGlycGF0aCBtbF9kaXJlY3Rvcnk7CisJbW91bnRsaXN0IG1sX25leHQ7Cit9OworCisvKgorICogQSBsaXN0IG9mIG5ldGdyb3VwcworICovCit0eXBlZGVmIHN0cnVjdCBncm91cG5vZGUgKmdyb3VwczsKK3N0cnVjdCBncm91cG5vZGUgeworCW5hbWUgZ3JfbmFtZTsKKwlncm91cHMgZ3JfbmV4dDsKK307CisKKy8qCisgKiBBIGxpc3Qgb2Ygd2hhdCBpcyBleHBvcnRlZCBhbmQgdG8gd2hvbQorICovCit0eXBlZGVmIHN0cnVjdCBleHBvcnRub2RlICpleHBvcnRzOworc3RydWN0IGV4cG9ydG5vZGUgeworCWRpcnBhdGggZXhfZGlyOworCWdyb3VwcyBleF9ncm91cHM7CisJZXhwb3J0cyBleF9uZXh0OworfTsKKworLyoKKyAqIFBPU0lYIHBhdGhjb25mIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBwcGF0aGNuZiB7CisJaW50CXBjX2xpbmtfbWF4OwkvKiBtYXggbGlua3MgYWxsb3dlZCAqLworCXNob3J0CXBjX21heF9jYW5vbjsJLyogbWF4IGxpbmUgbGVuIGZvciBhIHR0eSAqLworCXNob3J0CXBjX21heF9pbnB1dDsJLyogaW5wdXQgYSB0dHkgY2FuIGVhdCBhbGwgYXQgb25jZSAqLworCXNob3J0CXBjX25hbWVfbWF4OwkvKiBtYXggZmlsZSBuYW1lIGxlbmd0aCAoZGlyIGVudHJ5KSAqLworCXNob3J0CXBjX3BhdGhfbWF4OwkvKiBtYXggcGF0aCBuYW1lIGxlbmd0aCAoL3gveS94Ly4uICkgKi8KKwlzaG9ydAlwY19waXBlX2J1ZjsJLyogc2l6ZSBvZiBhIHBpcGUgKGJ5dGVzKSAqLworCXVfY2hhcglwY192ZGlzYWJsZTsJLyogc2FmZSBjaGFyIHRvIHR1cm4gb2ZmIGNfY2NbaV0gKi8KKwljaGFyCXBjX3h4eDsJCS8qIGFsaWdubWVudCBwYWRkaW5nOyBjY190ID09IGNoYXIgKi8KKwlzaG9ydAlwY19tYXNrWzJdOwkvKiB2YWxpZGl0eSBhbmQgYm9vbGVhbiBiaXRzICovCit9OworCisvKgorICogTkZTdjMgZmlsZSBoYW5kbGUKKyAqLworY29uc3QgRkhTSVpFMyA9CTY0OwkJLyogbWF4IHNpemUgb2YgTkZTdjMgZmlsZSBoYW5kbGUgaW4gYnl0ZXMgKi8KK3R5cGVkZWYgb3BhcXVlCQlmaGFuZGxlMzxGSFNJWkUzPjsKKworLyoKKyAqIE5GU3YzIG1vdW50IHN0YXR1cworICovCitlbnVtIG1vdW50c3RhdDMgeworCU1OVF9PSwkJCT0gMCwJLyogbm8gZXJyb3IgKi8KKwlNTlQzRVJSX1BFUk0JCT0gMSwJLyogbm90IG93bmVyICovCisJTU5UM0VSUl9OT0VOVAkJPSAyLAkvKiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICovCisJTU5UM0VSUl9JTwkJPSA1LAkvKiBJL08gZXJyb3IgKi8KKwlNTlQzRVJSX0FDQ0VTCQk9IDEzLAkvKiBQZXJtaXNzaW9uIGRlbmllZCAqLworCU1OVDNFUlJfTk9URElSCQk9IDIwLAkvKiBOb3QgYSBkaXJlY3RvcnkgKi8KKwlNTlQzRVJSX0lOVkFMCQk9IDIyLAkvKiBJbnZhbGlkIGFyZ3VtZW50ICovCisJTU5UM0VSUl9OQU1FVE9PTE9ORwk9IDYzLAkvKiBGaWxlIG5hbWUgdG9vIGxvbmcgKi8KKwlNTlQzRVJSX05PVFNVUFAJCT0gMTAwMDQsLyogT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KKwlNTlQzRVJSX1NFUlZFUkZBVUxUCT0gMTAwMDYJLyogQSBmYWlsdXJlIG9uIHRoZSBzZXJ2ZXIgKi8KK307CisKKy8qCisgKiBORlN2MyBtb3VudCByZXN1bHQKKyAqLworc3RydWN0IG1vdW50cmVzM19vayB7CisJZmhhbmRsZTMJZmhhbmRsZTsKKwlpbnQJCWF1dGhfZmxhdm9yczw+OworfTsKKwordW5pb24gbW91bnRyZXMzIHN3aXRjaCAobW91bnRzdGF0MyBmaHNfc3RhdHVzKSB7CitjYXNlIE1OVF9PSzoKKwltb3VudHJlczNfb2sJbW91bnRpbmZvOyAvKiBGaWxlIGhhbmRsZSBhbmQgc3VwcG9ydGVkIGZsYXZvcnMgKi8KK2RlZmF1bHQ6CisJdm9pZDsKK307CisKK3Byb2dyYW0gTU9VTlRQUk9HIHsKKwkvKgorCSAqIFZlcnNpb24gb25lIG9mIHRoZSBtb3VudCBwcm90b2NvbCBjb21tdW5pY2F0ZXMgd2l0aCB2ZXJzaW9uIHR3bworCSAqIG9mIHRoZSBORlMgcHJvdG9jb2wuIFRoZSBvbmx5IGNvbm5lY3RpbmcgcG9pbnQgaXMgdGhlIGZoYW5kbGUgCisJICogc3RydWN0dXJlLCB3aGljaCBpcyB0aGUgc2FtZSBmb3IgYm90aCBwcm90b2NvbHMuCisJICovCisJdmVyc2lvbiBNT1VOVFZFUlMgeworCQkvKgorCQkgKiBEb2VzIG5vIHdvcmsuIEl0IGlzIG1hZGUgYXZhaWxhYmxlIGluIGFsbCBSUEMgc2VydmljZXMKKwkJICogdG8gYWxsb3cgc2VydmVyIHJlcG9uc2UgdGVzdGluZyBhbmQgdGltaW5nCisJCSAqLworCQl2b2lkCisJCU1PVU5UUFJPQ19OVUxMKHZvaWQpID0gMDsKKworCQkvKgkKKwkJICogSWYgZmhzX3N0YXR1cyBpcyAwLCB0aGVuIGZoc19maGFuZGxlIGNvbnRhaW5zIHRoZQorCSAJICogZmlsZSBoYW5kbGUgZm9yIHRoZSBkaXJlY3RvcnkuIFRoaXMgZmlsZSBoYW5kbGUgbWF5CisJCSAqIGJlIHVzZWQgaW4gdGhlIE5GUyBwcm90b2NvbC4gVGhpcyBwcm9jZWR1cmUgYWxzbyBhZGRzCisJCSAqIGEgbmV3IGVudHJ5IHRvIHRoZSBtb3VudCBsaXN0IGZvciB0aGlzIGNsaWVudCBtb3VudGluZworCQkgKiB0aGUgZGlyZWN0b3J5LgorCQkgKiBVbml4IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLgorCQkgKi8KKwkJZmhzdGF0dXMgCisJCU1PVU5UUFJPQ19NTlQoZGlycGF0aCkgPSAxOworCisJCS8qCisJCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVtb3RlbHkgbW91bnRlZCBmaWxlc3lzdGVtcy4gVGhlIAorCQkgKiBtb3VudGxpc3QgY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIGhvc3RuYW1lIGFuZCAKKwkJICogZGlyZWN0b3J5IHBhaXIuCisJCSAqLworCQltb3VudGxpc3QKKwkJTU9VTlRQUk9DX0RVTVAodm9pZCkgPSAyOworCisJCS8qCisJCSAqIFJlbW92ZXMgdGhlIG1vdW50IGxpc3QgZW50cnkgZm9yIHRoZSBkaXJlY3RvcnkKKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX1VNTlQoZGlycGF0aCkgPSAzOworCisJCS8qCisJCSAqIFJlbW92ZXMgYWxsIG9mIHRoZSBtb3VudCBsaXN0IGVudHJpZXMgZm9yIHRoaXMgY2xpZW50CisJCSAqIFVuaXggYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisJCSAqLworCQl2b2lkCisJCU1PVU5UUFJPQ19VTU5UQUxMKHZvaWQpID0gNDsKKworCQkvKgorCQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGV4cG9ydGVkIGZpbGVzeXN0ZW1zLCBhbmQgd2hpY2gKKwkJICogbWFjaGluZXMgYXJlIGFsbG93ZWQgdG8gaW1wb3J0IGl0LgorCQkgKi8KKwkJZXhwb3J0cworCQlNT1VOVFBST0NfRVhQT1JUKHZvaWQpICA9IDU7CisKKwkJLyoKKwkJICogSWRlbnRpY2FsIHRvIE1PVU5UUFJPQ19FWFBPUlQgYWJvdmUKKwkJICovCisJCWV4cG9ydHMKKwkJTU9VTlRQUk9DX0VYUE9SVEFMTCh2b2lkKSA9IDY7CisJfSA9IDE7CisKKwkvKgorCSAqIFZlcnNpb24gdHdvIG9mIHRoZSBtb3VudCBwcm90b2NvbCBjb21tdW5pY2F0ZXMgd2l0aCB2ZXJzaW9uIHR3bworCSAqIG9mIHRoZSBORlMgcHJvdG9jb2wuCisJICogVGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIHZlcnNpb24gb25lIGlzIHRoZSBhZGRpdGlvbiBvZiBhIFBPU0lYCisJICogcGF0aGNvbmYgY2FsbC4KKwkgKi8KKwl2ZXJzaW9uIE1PVU5UVkVSU19QT1NJWCB7CisJCS8qCisJCSAqIERvZXMgbm8gd29yay4gSXQgaXMgbWFkZSBhdmFpbGFibGUgaW4gYWxsIFJQQyBzZXJ2aWNlcworCQkgKiB0byBhbGxvdyBzZXJ2ZXIgcmVwb25zZSB0ZXN0aW5nIGFuZCB0aW1pbmcKKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX05VTEwodm9pZCkgPSAwOworCisJCS8qCQorCQkgKiBJZiBmaHNfc3RhdHVzIGlzIDAsIHRoZW4gZmhzX2ZoYW5kbGUgY29udGFpbnMgdGhlCisJIAkgKiBmaWxlIGhhbmRsZSBmb3IgdGhlIGRpcmVjdG9yeS4gVGhpcyBmaWxlIGhhbmRsZSBtYXkKKwkJICogYmUgdXNlZCBpbiB0aGUgTkZTIHByb3RvY29sLiBUaGlzIHByb2NlZHVyZSBhbHNvIGFkZHMKKwkJICogYSBuZXcgZW50cnkgdG8gdGhlIG1vdW50IGxpc3QgZm9yIHRoaXMgY2xpZW50IG1vdW50aW5nCisJCSAqIHRoZSBkaXJlY3RvcnkuCisJCSAqIFVuaXggYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisJCSAqLworCQlmaHN0YXR1cyAKKwkJTU9VTlRQUk9DX01OVChkaXJwYXRoKSA9IDE7CisKKwkJLyoKKwkJICogUmV0dXJucyB0aGUgbGlzdCBvZiByZW1vdGVseSBtb3VudGVkIGZpbGVzeXN0ZW1zLiBUaGUgCisJCSAqIG1vdW50bGlzdCBjb250YWlucyBvbmUgZW50cnkgZm9yIGVhY2ggaG9zdG5hbWUgYW5kIAorCQkgKiBkaXJlY3RvcnkgcGFpci4KKwkJICovCisJCW1vdW50bGlzdAorCQlNT1VOVFBST0NfRFVNUCh2b2lkKSA9IDI7CisKKwkJLyoKKwkJICogUmVtb3ZlcyB0aGUgbW91bnQgbGlzdCBlbnRyeSBmb3IgdGhlIGRpcmVjdG9yeQorCQkgKiBVbml4IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLgorCQkgKi8KKwkJdm9pZAorCQlNT1VOVFBST0NfVU1OVChkaXJwYXRoKSA9IDM7CisKKwkJLyoKKwkJICogUmVtb3ZlcyBhbGwgb2YgdGhlIG1vdW50IGxpc3QgZW50cmllcyBmb3IgdGhpcyBjbGllbnQKKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DX1VNTlRBTEwodm9pZCkgPSA0OworCisJCS8qCisJCSAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgZXhwb3J0ZWQgZmlsZXN5c3RlbXMsIGFuZCB3aGljaAorCQkgKiBtYWNoaW5lcyBhcmUgYWxsb3dlZCB0byBpbXBvcnQgaXQuCisJCSAqLworCQlleHBvcnRzCisJCU1PVU5UUFJPQ19FWFBPUlQodm9pZCkgID0gNTsKKworCQkvKgorCQkgKiBJZGVudGljYWwgdG8gTU9VTlRQUk9DX0VYUE9SVCBhYm92ZQorCQkgKi8KKwkJZXhwb3J0cworCQlNT1VOVFBST0NfRVhQT1JUQUxMKHZvaWQpID0gNjsKKworCQkvKgorCQkgKiBQT1NJWCBwYXRoY29uZiBpbmZvIChTdW4gaGFjaykKKwkJICovCisJCXBwYXRoY25mCisJCU1PVU5UUFJPQ19QQVRIQ09ORihkaXJwYXRoKSA9IDc7CisJfSA9IDI7CisKKwkvKgorCSAqIFZlcnNpb24gMyBvZiB0aGUgcHJvdG9jb2wgaXMgZm9yIE5GU3YzCisJICovCisJdmVyc2lvbiBNT1VOVFZFUlNfTkZTVjMgeworCQkvKgorCQkgKiBEb2VzIG5vIHdvcmsuIEl0IGlzIG1hZGUgYXZhaWxhYmxlIGluIGFsbCBSUEMgc2VydmljZXMKKwkJICogdG8gYWxsb3cgc2VydmVyIHJlcG9uc2UgdGVzdGluZyBhbmQgdGltaW5nCisJCSAqLworCQl2b2lkCisJCU1PVU5UUFJPQzNfTlVMTCh2b2lkKSA9IDA7CisKKwkJLyoJCisJCSAqIElmIGZoc19zdGF0dXMgaXMgMCwgdGhlbiBmaHNfZmhhbmRsZSBjb250YWlucyB0aGUKKwkgCSAqIGZpbGUgaGFuZGxlIGZvciB0aGUgZGlyZWN0b3J5LiBUaGlzIGZpbGUgaGFuZGxlIG1heQorCQkgKiBiZSB1c2VkIGluIHRoZSBORlMgcHJvdG9jb2wuIFRoaXMgcHJvY2VkdXJlIGFsc28gYWRkcworCQkgKiBhIG5ldyBlbnRyeSB0byB0aGUgbW91bnQgbGlzdCBmb3IgdGhpcyBjbGllbnQgbW91bnRpbmcKKwkJICogdGhlIGRpcmVjdG9yeS4KKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCW1vdW50cmVzMyAKKwkJTU9VTlRQUk9DM19NTlQoZGlycGF0aCkgPSAxOworCisJCS8qCisJCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVtb3RlbHkgbW91bnRlZCBmaWxlc3lzdGVtcy4gVGhlIAorCQkgKiBtb3VudGxpc3QgY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIGhvc3RuYW1lIGFuZCAKKwkJICogZGlyZWN0b3J5IHBhaXIuCisJCSAqLworCQltb3VudGxpc3QKKwkJTU9VTlRQUk9DM19EVU1QKHZvaWQpID0gMjsKKworCQkvKgorCQkgKiBSZW1vdmVzIHRoZSBtb3VudCBsaXN0IGVudHJ5IGZvciB0aGUgZGlyZWN0b3J5CisJCSAqIFVuaXggYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisJCSAqLworCQl2b2lkCisJCU1PVU5UUFJPQzNfVU1OVChkaXJwYXRoKSA9IDM7CisKKwkJLyoKKwkJICogUmVtb3ZlcyBhbGwgb2YgdGhlIG1vdW50IGxpc3QgZW50cmllcyBmb3IgdGhpcyBjbGllbnQKKwkJICogVW5peCBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKwkJICovCisJCXZvaWQKKwkJTU9VTlRQUk9DM19VTU5UQUxMKHZvaWQpID0gNDsKKworCQkvKgorCQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhlIGV4cG9ydGVkIGZpbGVzeXN0ZW1zLCBhbmQgd2hpY2gKKwkJICogbWFjaGluZXMgYXJlIGFsbG93ZWQgdG8gaW1wb3J0IGl0LgorCQkgKi8KKwkJZXhwb3J0cworCQlNT1VOVFBST0MzX0VYUE9SVCh2b2lkKSAgPSA1OworCX0gPSAzOworfSA9IDEwMDAwNTsKKworI2lmZGVmIFJQQ19IRFIKKyUjZW5kaWYgLyohX3JwY3N2Y19tb3VudF9oKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L25mc2N0bC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvZXhwb3J0L25mc2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODc3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvbmZzY3RsLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBzdXBwb3J0L2V4cG9ydC9uZnNjdGwuYworICoKKyAqIENvbW11bmljYXRlIGV4cG9ydCBpbmZvcm1hdGlvbiB0byBrbmZzZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAibmZzbGliLmgiCisjaW5jbHVkZSAiZXhwb3J0ZnMuaCIKKyNpbmNsdWRlICJ4aW8uaCIKKworc3RhdGljIGludAlleHBzZXR1cChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZXhwYXJnLCBuZnNfZXhwb3J0ICpleHAsIGludCB1bmV4cG9ydCk7CitzdGF0aWMgaW50CWNsdHNldHVwKHN0cnVjdCBuZnNjdGxfY2xpZW50ICpjbHRhcmcsIG5mc19jbGllbnQgKmNscCk7CisKK2ludAorZXhwb3J0X2V4cG9ydChuZnNfZXhwb3J0ICpleHApCit7CisJbmZzX2NsaWVudCAqCWNscCA9IGV4cC0+bV9jbGllbnQ7CisJc3RydWN0IG5mc2N0bF9leHBvcnQJZXhwYXJnOworCXN0cnVjdCBuZnNjdGxfY2xpZW50CWNsdGFyZzsKKworCWlmICghY2xwLT5tX2V4cG9ydGVkICYmIChjbHAtPm1fdHlwZSAhPSBNQ0xfR1NTKSkgeworCQlpZiAoIWNsdHNldHVwKCZjbHRhcmcsIGNscCkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5mc2FkZGNsaWVudCgmY2x0YXJnKSA8IDApCisJCQlyZXR1cm4gMDsKKwkJY2xwLT5tX2V4cG9ydGVkID0gMTsKKwl9CisJaWYgKCFleHBzZXR1cCgmZXhwYXJnLCBleHAsIDApKQorCQlyZXR1cm4gMDsKKwlpZiAobmZzZXhwb3J0KCZleHBhcmcpIDwgMCkKKwkJcmV0dXJuIDA7CisJZXhwLT5tX2V4cG9ydGVkID0gMTsKKwlyZXR1cm4gMTsKK30KKworaW50CitleHBvcnRfdW5leHBvcnQobmZzX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBuZnNjdGxfZXhwb3J0CWV4cGFyZzsKKworCWlmICghZXhwc2V0dXAoJmV4cGFyZywgZXhwLCAxKSB8fCBuZnN1bmV4cG9ydCgmZXhwYXJnKSA8IDApCisJCXJldHVybiAwOworCWV4cC0+bV9leHBvcnRlZCA9IDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJfdG9sb3dlcihjaGFyICpzKQoreworCWZvciAoIDsgKnM7IHMrKykKKwkJaWYgKGlzdXBwZXIoKnMpKQorCQkJKnMgPSB0b2xvd2VyKCpzKTsKK30KKworc3RhdGljIGludAorY2x0c2V0dXAoc3RydWN0IG5mc2N0bF9jbGllbnQgKmNsdGFyZywgbmZzX2NsaWVudCAqY2xwKQoreworCWludAlpOworCisJaWYgKGNscC0+bV90eXBlICE9IE1DTF9GUUROKSB7CisJCXhsb2coTF9FUlJPUiwgImludGVybmFsOiBjYW4ndCBleHBvcnQgbm9uLUZRRE4gaG9zdCIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KGNsdGFyZywgMCwgc2l6ZW9mKCpjbHRhcmcpKTsKKwlzdHJuY3B5KGNsdGFyZy0+Y2xfaWRlbnQsIGNscC0+bV9ob3N0bmFtZSwKKwkJc2l6ZW9mIChjbHRhcmctPmNsX2lkZW50KSAtIDEpOworCXN0cl90b2xvd2VyKGNsdGFyZy0+Y2xfaWRlbnQpOworCWNsdGFyZy0+Y2xfbmFkZHIgPSBjbHAtPm1fbmFkZHI7CisJZm9yIChpID0gMDsgaSA8IGNsdGFyZy0+Y2xfbmFkZHIgJiYgaSA8IE5GU0NMTlRfQUREUk1BWDsgaSsrKQorCQljbHRhcmctPmNsX2FkZHJsaXN0W2ldID0gY2xwLT5tX2FkZHJsaXN0W2ldOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2V4cHNldHVwKHN0cnVjdCBuZnNjdGxfZXhwb3J0ICpleHBhcmcsIG5mc19leHBvcnQgKmV4cCwgaW50IHVuZXhwb3J0KQoreworCW5mc19jbGllbnQJCSpjbHAgPSBleHAtPm1fY2xpZW50OworCXN0cnVjdCBzdGF0CQlzdGI7CisKKwlpZiAoc3RhdChleHAtPm1fZXhwb3J0LmVfcGF0aCwgJnN0YikgPCAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldChleHBhcmcsIDAsIHNpemVvZigqZXhwYXJnKSk7CisJc3RybmNweShleHBhcmctPmV4X3BhdGgsIGV4cC0+bV9leHBvcnQuZV9wYXRoLAorCQlzaXplb2YgKGV4cGFyZy0+ZXhfcGF0aCkgLSAxKTsKKwlzdHJuY3B5KGV4cGFyZy0+ZXhfY2xpZW50LCBjbHAtPm1faG9zdG5hbWUsCisJCXNpemVvZiAoZXhwYXJnLT5leF9jbGllbnQpIC0gMSk7CisJc3RyX3RvbG93ZXIoZXhwYXJnLT5leF9jbGllbnQpOworCWV4cGFyZy0+ZXhfZmxhZ3MgICAgPSBleHAtPm1fZXhwb3J0LmVfZmxhZ3M7CisJZXhwYXJnLT5leF9kZXYgICAgICA9ICghdW5leHBvcnQgJiYgKGV4cC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9GU0lEKSkgPworCQkJCWV4cC0+bV9leHBvcnQuZV9mc2lkIDogc3RiLnN0X2RldjsKKwlleHBhcmctPmV4X2lubyAgICAgID0gc3RiLnN0X2lubzsKKwlleHBhcmctPmV4X2Fub25fdWlkID0gZXhwLT5tX2V4cG9ydC5lX2Fub251aWQ7CisJZXhwYXJnLT5leF9hbm9uX2dpZCA9IGV4cC0+bV9leHBvcnQuZV9hbm9uZ2lkOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvcm10YWIuYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2V4cG9ydC9ybXRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OWUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQvcm10YWIuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogc3VwcG9ydC9leHBvcnQvcm1udGFiLmMKKyAqCisgKiBJbnRlcmZhY2UgdG8gdGhlIHJtbnQgZmlsZS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAibWlzYy5oIgorI2luY2x1ZGUgIm5mc2xpYi5oIgorI2luY2x1ZGUgImV4cG9ydGZzLmgiCisjaW5jbHVkZSAieGlvLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCitpbnQKK3JtdGFiX3JlYWQodm9pZCkKK3sKKwlzdHJ1Y3Qgcm10YWJlbnQJCSpyZXA7CisJbmZzX2V4cG9ydAkJKmV4cCA9IE5VTEw7CisKKwlzZXRybXRhYmVudCgiciIpOworCXdoaWxlICgocmVwID0gZ2V0cm10YWJlbnQoMSwgTlVMTCkpICE9IE5VTEwpIHsKKwkJc3RydWN0IGhvc3RlbnQJCSpocCA9IE5VTEw7CisJCWludAkJCWh0eXBlOworCQkKKwkJaHR5cGUgPSBjbGllbnRfZ2V0dHlwZShyZXAtPnJfY2xpZW50KTsKKwkJaWYgKChodHlwZSA9PSBNQ0xfRlFETiB8fCBodHlwZSA9PSBNQ0xfU1VCTkVUV09SSykKKwkJICAgICYmIChocCA9IGdldGhvc3RieW5hbWUgKHJlcC0+cl9jbGllbnQpKQorCQkgICAgJiYgKGhwID0gaG9zdGVudF9kdXAgKGhwKSwKKwkJCWV4cCA9IGV4cG9ydF9hbGxvd2VkIChocCwgcmVwLT5yX3BhdGgpKSkgeworCQkJLyogc2VlIGlmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cywgb3RoZXJ3aXNlIHRoaXMgd2FzIGFuIGluc3RhbnRpYXRlZAorCQkJICogd2lsZCBjYXJkLCBhbmQgd2UgbXVzdCBhZGQgaXQKKwkJCSAqLworCQkJbmZzX2V4cG9ydCAqZXhwMiA9IGV4cG9ydF9sb29rdXAocmVwLT5yX2NsaWVudCwKKwkJCQkJCQlleHAtPm1fZXhwb3J0LmVfcGF0aCwgMCk7CisJCQlpZiAoIWV4cDIpIHsKKwkJCQlzdHJ1Y3QgZXhwb3J0ZW50IGVlOworCQkJCWR1cGV4cG9ydGVudCgmZWUsICZleHAtPm1fZXhwb3J0KTsKKwkJCQllZS5lX2hvc3RuYW1lID0gcmVwLT5yX2NsaWVudDsKKwkJCQlleHAyID0gZXhwb3J0X2NyZWF0ZSgmZWUsIDApOworCQkJCWV4cDItPm1fY2hhbmdlZCA9IGV4cC0+bV9jaGFuZ2VkOworCQkJfQorCQkJZnJlZSAoaHApOworCQkJZXhwMi0+bV9tYXlleHBvcnQgPSAxOworCQl9IGVsc2UgaWYgKGhwKSAvKiBleHBvcnRfYWxsb3dlZCBmYWlsZWQgKi8KKwkJCWZyZWUoaHApOworCX0KKwlpZiAoZXJybm8gPT0gRUlOVkFMKSB7CisJCS8qIFNvbWV0aGluZyBnb2VzIHdyb25nLiBXZSBuZWVkIHRvIGZpeCB0aGUgcm10YWIKKwkJICAgZmlsZS4gKi8KKwkJaW50CWxvY2tpZDsKKwkJRklMRQkqZnA7CisJCWlmICgobG9ja2lkID0geGZsb2NrKF9QQVRIX1JNVEFCTENLLCAidyIpKSA8IDApCisJCQlyZXR1cm4gLTE7CisJCXJld2luZHJtdGFiZW50KCk7CisJCWlmICghKGZwID0gZnNldHJtdGFiZW50KF9QQVRIX1JNVEFCVE1QLCAidyIpKSkgeworCQkJZW5kcm10YWJlbnQgKCk7CisJCQl4ZnVubG9jayhsb2NraWQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXdoaWxlICgocmVwID0gZ2V0cm10YWJlbnQoMCwgTlVMTCkpICE9IE5VTEwpIHsKKwkJCWZwdXRybXRhYmVudChmcCwgcmVwLCBOVUxMKTsKKwkJfQorCQlpZiAocmVuYW1lKF9QQVRIX1JNVEFCVE1QLCBfUEFUSF9STVRBQikgPCAwKSB7CisJCQl4bG9nKExfRVJST1IsICJjb3VsZG4ndCByZW5hbWUgJXMgdG8gJXMiLAorCQkJICAgICBfUEFUSF9STVRBQlRNUCwgX1BBVEhfUk1UQUIpOworCQl9CisJCWVuZHJtdGFiZW50KCk7CisJCWZlbmRybXRhYmVudChmcCk7CisJCXhmdW5sb2NrKGxvY2tpZCk7CisJfQorCWVsc2UgeworCQllbmRybXRhYmVudCgpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2V4cG9ydC94dGFiLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQveHRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9leHBvcnQveHRhYi5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogc3VwcG9ydC9leHBvcnQveHRhYi5jCisgKgorICogSW50ZXJmYWNlIHRvIHRoZSB4dGFiIGZpbGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJuZnNsaWIuaCIKKyNpbmNsdWRlICJleHBvcnRmcy5oIgorI2luY2x1ZGUgInhpby5oIgorI2luY2x1ZGUgInhsb2cuaCIKKyNpbmNsdWRlICJ2NHJvb3QuaCIKKworaW50IHY0cm9vdF9uZWVkZWQ7CitzdGF0aWMgdm9pZCBjb25kX3JlbmFtZShjaGFyICpuZXdmaWxlLCBjaGFyICpvbGRmaWxlKTsKKworc3RhdGljIGludAoreHRhYl9yZWFkKGNoYXIgKnh0YWIsIGNoYXIgKmxvY2tmbiwgaW50IGlzX2V4cG9ydCkKK3sKKyAgICAvKiBpc19leHBvcnQgPT0gMCAgPT4gcmVhZGluZyAvcHJvYy9mcy9uZnMvZXhwb3J0cyAtIHdlIGtub3cgdGhlc2UgdGhpbmdzIGFyZSBleHBvcnRlZCB0byBrZXJuZWwKKyAgICAgKiBpc19leHBvcnQgPT0gMSAgPT4gcmVhZGluZyAvdmFyL2xpYi9uZnMvZXRhYiAtIHRoZXNlIHRoaW5ncyBhcmUgYWxsb3dlZCB0byBiZSBleHBvcnRlZAorICAgICAqIGlzX2V4cG9ydCA9PSAyICA9PiByZWFkaW5nIC92YXIvbGliL25mcy94dGFiIC0gdGhlc2UgdGhpbmdzIG1pZ2h0IGJlIGtub3duIHRvIGtlcm5lbAorICAgICAqLworCXN0cnVjdCBleHBvcnRlbnQJKnhwOworCW5mc19leHBvcnQJCSpleHA7CisJaW50CQkJbG9ja2lkOworCisJaWYgKChsb2NraWQgPSB4ZmxvY2sobG9ja2ZuLCAiciIpKSA8IDApCisJCXJldHVybiAwOworCXNldGV4cG9ydGVudCh4dGFiLCAiciIpOworCWlmIChpc19leHBvcnQgPT0gMSkKKwkJdjRyb290X25lZWRlZCA9IDE7CisJd2hpbGUgKCh4cCA9IGdldGV4cG9ydGVudChpc19leHBvcnQ9PTAsIDApKSAhPSBOVUxMKSB7CisJCWlmICghKGV4cCA9IGV4cG9ydF9sb29rdXAoeHAtPmVfaG9zdG5hbWUsIHhwLT5lX3BhdGgsIGlzX2V4cG9ydCAhPSAxKSkgJiYKKwkJICAgICEoZXhwID0gZXhwb3J0X2NyZWF0ZSh4cCwgaXNfZXhwb3J0IT0xKSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAoaXNfZXhwb3J0KSB7CisJCWNhc2UgMDoKKwkJCWV4cC0+bV9leHBvcnRlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJZXhwLT5tX3h0YWJlbnQgPSAxOworCQkJZXhwLT5tX21heWV4cG9ydCA9IDE7CisJCQlpZiAoKHhwLT5lX2ZsYWdzICYgTkZTRVhQX0ZTSUQpICYmIHhwLT5lX2ZzaWQgPT0gMCkKKwkJCQl2NHJvb3RfbmVlZGVkID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlleHAtPm1fZXhwb3J0ZWQgPSAtMTsvKiBtYXkgYmUgZXhwb3J0ZWQgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCWVuZGV4cG9ydGVudCgpOworCXhmdW5sb2NrKGxvY2tpZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50Cit4dGFiX21vdW50X3JlYWQodm9pZCkKK3sKKwlpbnQgZmQ7CisJaWYgKChmZD1vcGVuKF9QQVRIX1BST0NfRVhQT1JUUywgT19SRE9OTFkpKT49MCkgeworCQljbG9zZShmZCk7CisJCXJldHVybiB4dGFiX3JlYWQoX1BBVEhfUFJPQ19FWFBPUlRTLAorCQkJCSBfUEFUSF9QUk9DX0VYUE9SVFMsIDApOworCX0gZWxzZSBpZiAoKGZkPW9wZW4oX1BBVEhfUFJPQ19FWFBPUlRTX0FMVCwgT19SRE9OTFkpID49IDApKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHh0YWJfcmVhZChfUEFUSF9QUk9DX0VYUE9SVFNfQUxULAorCQkJCSBfUEFUSF9QUk9DX0VYUE9SVFNfQUxULCAwKTsKKwl9IGVsc2UKKwkJcmV0dXJuIHh0YWJfcmVhZChfUEFUSF9YVEFCLCBfUEFUSF9YVEFCTENLLCAyKTsKK30KKworaW50Cit4dGFiX2V4cG9ydF9yZWFkKHZvaWQpCit7CisJcmV0dXJuIHh0YWJfcmVhZChfUEFUSF9FVEFCLCBfUEFUSF9FVEFCTENLLCAxKTsKK30KKworLyoKKyAqIG1vdW50ZCBub3cga2VlcHMgYW4gb3BlbiBmZCBmb3IgdGhlIGV0YWIgYXQgYWxsIHRpbWVzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICogaW5vZGUgbnVtYmVyIGNoYW5nZXMgd2hlbiB0aGUgeHRhYl9leHBvcnRfd3JpdGUgaXMgZG9uZS4gSWYgeW91IGNoYW5nZSB0aGUKKyAqIHJvdXRpbmUgYmVsb3cgc3VjaCB0aGF0IHRoZSBmaWxlcyBhcmUgZWRpdGVkIGluIHBsYWNlLCB0aGVuIHlvdSdsbCBuZWVkIHRvCisgKiBmaXggdGhlIGF1dGhfcmVsb2FkIGxvZ2ljIGFzIHdlbGwuLi4KKyAqLworc3RhdGljIGludAoreHRhYl93cml0ZShjaGFyICp4dGFiLCBjaGFyICp4dGFidG1wLCBjaGFyICpsb2NrZm4sIGludCBpc19leHBvcnQpCit7CisJc3RydWN0IGV4cG9ydGVudAl4ZTsKKwluZnNfZXhwb3J0CQkqZXhwOworCWludAkJCWxvY2tpZCwgaTsKKworCWlmICgobG9ja2lkID0geGZsb2NrKGxvY2tmbiwgInciKSkgPCAwKSB7CisJCXhsb2coTF9FUlJPUiwgImNhbid0IGxvY2sgJXMgZm9yIHdyaXRpbmciLCB4dGFiKTsKKwkJcmV0dXJuIDA7CisJfQorCXNldGV4cG9ydGVudCh4dGFidG1wLCAidyIpOworCisJZm9yIChpID0gMDsgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKSB7CisJCWZvciAoZXhwID0gZXhwb3J0bGlzdFtpXS5wX2hlYWQ7IGV4cDsgZXhwID0gZXhwLT5tX25leHQpIHsKKwkJCWlmIChpc19leHBvcnQgJiYgIWV4cC0+bV94dGFiZW50KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFpc19leHBvcnQgJiYgISBleHAtPm1fZXhwb3J0ZWQpCisJCQkJY29udGludWU7CisKKwkJCS8qIHdyaXRlIG91dCB0aGUgZXhwb3J0IGVudHJ5IHVzaW5nIHRoZSBGUUROICovCisJCQl4ZSA9IGV4cC0+bV9leHBvcnQ7CisJCQl4ZS5lX2hvc3RuYW1lID0gZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZTsKKwkJCXB1dGV4cG9ydGVudCgmeGUpOworCQl9CisJfQorCWVuZGV4cG9ydGVudCgpOworCisJY29uZF9yZW5hbWUoeHRhYnRtcCwgeHRhYik7CisKKwl4ZnVubG9jayhsb2NraWQpOworCisJcmV0dXJuIDE7Cit9CisKK2ludAoreHRhYl9leHBvcnRfd3JpdGUoKQoreworCXJldHVybiB4dGFiX3dyaXRlKF9QQVRIX0VUQUIsIF9QQVRIX0VUQUJUTVAsIF9QQVRIX0VUQUJMQ0ssIDEpOworfQorCitpbnQKK3h0YWJfbW91bnRfd3JpdGUoKQoreworCXJldHVybiB4dGFiX3dyaXRlKF9QQVRIX1hUQUIsIF9QQVRIX1hUQUJUTVAsIF9QQVRIX1hUQUJMQ0ssIDApOworfQorCit2b2lkCit4dGFiX2FwcGVuZChuZnNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IGV4cG9ydGVudCB4ZTsKKwlpbnQJCWxvY2tpZDsKKworCWlmICgobG9ja2lkID0geGZsb2NrKF9QQVRIX1hUQUJMQ0ssICJ3IikpIDwgMCkKKwkJcmV0dXJuOworCXNldGV4cG9ydGVudChfUEFUSF9YVEFCLCAiYSIpOworCXhlID0gZXhwLT5tX2V4cG9ydDsKKwl4ZS5lX2hvc3RuYW1lID0gZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZTsKKwlwdXRleHBvcnRlbnQoJnhlKTsKKwllbmRleHBvcnRlbnQoKTsKKwl4ZnVubG9jayhsb2NraWQpOworCWV4cC0+bV94dGFiZW50ID0gMTsKK30KKworLyoKKyAqIHJlbmFtZSBuZXdmaWxlIG9udG8gb2xkZmlsZSB1bmxlc3MKKyAqIHRoZXkgYXJlIGlkZW50aWNhbAorICovCitzdGF0aWMgdm9pZCBjb25kX3JlbmFtZShjaGFyICpuZXdmaWxlLCBjaGFyICpvbGRmaWxlKQoreworCWludCBuZmQsIG9mZDsKKwljaGFyIG5idWZbNDA5Nl0sIG9idWZbNDA5Nl07CisJaW50IG5jbnQsIG9jbnQ7CisKKwluZmQgPSBvcGVuKG5ld2ZpbGUsIDApOworCWlmIChuZmQgPCAwKQorCQlyZXR1cm47CisJb2ZkID0gb3BlbihvbGRmaWxlLCAwKTsKKwlpZiAob2ZkIDwgMCkgeworCQljbG9zZShuZmQpOworCQlyZW5hbWUobmV3ZmlsZSwgb2xkZmlsZSk7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCW5jbnQgPSByZWFkKG5mZCwgbmJ1Ziwgc2l6ZW9mKG5idWYpKTsKKwkJaWYgKG5jbnQgPCAwKQorCQkJYnJlYWs7CisJCW9jbnQgPSByZWFkKG9mZCwgb2J1Ziwgc2l6ZW9mKG9idWYpKTsKKwkJaWYgKG9jbnQgPCAwKQorCQkJYnJlYWs7CisJCWlmIChuY250ICE9IG9jbnQpCisJCQlicmVhazsKKwkJaWYgKG5jbnQgPT0gMCkgeworCQkJY2xvc2UobmZkKTsKKwkJCWNsb3NlKG9mZCk7CisJCQl1bmxpbmsobmV3ZmlsZSk7CisJCQlyZXR1cm47CisJCX0KKwl9IHdoaWxlIChtZW1jbXAob2J1ZiwgbmJ1ZiwgbmNudCkgPT0gMCk7CisKKwkvKiBzb21lIG1pcy1tYXRjaCAqLworCWNsb3NlKG5mZCk7CisJY2xvc2Uob2ZkKTsKKwlyZW5hbWUobmV3ZmlsZSwgb2xkZmlsZSk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzM2VlOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyMiBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK1NVQkRJUlMgPSBuZnMgcnBjc3ZjIHN5cworCitub2luc3RfSEVBREVSUyA9IFwKKwlleHBvcnRmcy5oIFwKKwloYS1jYWxsb3V0LmggXAorCW1pc2MuaCBcCisJbmZzX21udGVudC5oIFwKKwluZnNfcGF0aHMuaCBcCisJbmZzbGliLmggXAorCW5mc3JwYy5oIFwKKwluc20uaCBcCisJcnBjbWlzYy5oIFwKKwl0Y3B3cmFwcGVyLmggXAorCXhpby5oIFwKKwl4bG9nLmggXAorCXhtYWxsb2MuaCBcCisJeGNvbW1vbi5oIFwKKwljb25mZmlsZS5oCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlM2Q3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjUxIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBzdXBwb3J0L2luY2x1ZGUKK0RJU1RfQ09NTU9OID0gJChub2luc3RfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gJChzcmNkaXIpL2NvbmZpZy5oLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSBjb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitSRUNVUlNJVkVfVEFSR0VUUyA9IGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmUgXAorCWh0bWwtcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAorCWluc3RhbGwtZHZpLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWh0bWwtcmVjdXJzaXZlIGluc3RhbGwtaW5mby1yZWN1cnNpdmUgXAorCWluc3RhbGwtcGRmLXJlY3Vyc2l2ZSBpbnN0YWxsLXBzLXJlY3Vyc2l2ZSBpbnN0YWxsLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgcGRmLXJlY3Vyc2l2ZSBcCisJcHMtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUKK0hFQURFUlMgPSAkKG5vaW5zdF9IRUFERVJTKQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCisJJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKKwlkaXN0ZGlyCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNUX1NVQkRJUlMgPSAkKFNVQkRJUlMpCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitTVUJESVJTID0gbmZzIHJwY3N2YyBzeXMKK25vaW5zdF9IRUFERVJTID0gXAorCWV4cG9ydGZzLmggXAorCWhhLWNhbGxvdXQuaCBcCisJbWlzYy5oIFwKKwluZnNfbW50ZW50LmggXAorCW5mc19wYXRocy5oIFwKKwluZnNsaWIuaCBcCisJbmZzcnBjLmggXAorCW5zbS5oIFwKKwlycGNtaXNjLmggXAorCXRjcHdyYXBwZXIuaCBcCisJeGlvLmggXAorCXhsb2cuaCBcCisJeG1hbGxvYy5oIFwKKwl4Y29tbW9uLmggXAorCWNvbmZmaWxlLmgKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBjb25maWcuaAorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9pbmNsdWRlL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvaW5jbHVkZS9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworY29uZmlnLmg6IHN0YW1wLWgxCisJQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCisJICBybSAtZiBzdGFtcC1oMTsgXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgc3RhbXAtaDE7IFwKKwllbHNlIDo7IGZpCisKK3N0YW1wLWgxOiAkKHNyY2RpcikvY29uZmlnLmguaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAcm0gLWYgc3RhbXAtaDEKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIHN1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorJChzcmNkaXIpL2NvbmZpZy5oLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKSAKKwkoJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKSkKKwlybSAtZiBzdGFtcC1oMQorCXRvdWNoICRACisKK2Rpc3RjbGVhbi1oZHI6CisJLXJtIC1mIGNvbmZpZy5oIHN0YW1wLWgxCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCitjdGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpIGNvbmZpZy5oLmluICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgY29uZmlnLmguaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgY29uZmlnLmguaW4gJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKKwkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAorCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJCWFtX19za2lwX21vZGVfZml4PTogXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlICQoSEVBREVSUykgY29uZmlnLmgKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGFsbCBcCisJY3RhZ3MtcmVjdXJzaXZlIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQorCisuUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKKwlhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBcCisJY3RhZ3MgY3RhZ3MtcmVjdXJzaXZlIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdGFncy1yZWN1cnNpdmUgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvY29uZmZpbGUuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvY29uZmZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTdhYTIxCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9jb25mZmlsZS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qICRPcGVuQlNEOiBjb25mLmgsdiAxLjMwIDIwMDQvMDYvMjUgMjA6MjU6MzQgaHNob2V4ZXIgRXhwICQJICovCisvKiAkRU9NOiBjb25mLmgsdiAxLjEzIDIwMDAvMDkvMTggMDA6MDE6NDcgaG8gRXhwICQJICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTksIDIwMDEgTmlrbGFzIEhhbGxxdmlzdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSOVrYW4gT2xzc29uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1bmRlciBmdW5kaW5nIGJ5IEVyaWNzc29uIFJhZGlvIFN5c3RlbXMuCisgKi8KKworI2lmbmRlZiBfQ09ORkZJTEVfSF8KKyNkZWZpbmUgX0NPTkZGSUxFX0hfCisKKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitzdHJ1Y3QgY29uZl9saXN0X25vZGUgeworCVRBSUxRX0VOVFJZKGNvbmZfbGlzdF9ub2RlKSBsaW5rOworCWNoYXIJKmZpZWxkOworfTsKKworc3RydWN0IGNvbmZfbGlzdCB7CisJc2l6ZV90CWNudDsKKwlUQUlMUV9IRUFEKGNvbmZfbGlzdF9maWVsZHNfaGVhZCwgY29uZl9saXN0X25vZGUpIGZpZWxkczsKK307CisKK2V4dGVybiBjaGFyICAgICpjb25mX3BhdGg7CisKK2V4dGVybiBpbnQgICAgICBjb25mX2JlZ2luKHZvaWQpOworZXh0ZXJuIGludCAgICAgIGNvbmZfZGVjb2RlX2Jhc2U2NCh1X2ludDhfdCAqLCB1X2ludDMyX3QgKiwgdV9jaGFyICopOworZXh0ZXJuIGludCAgICAgIGNvbmZfZW5kKGludCwgaW50KTsKK2V4dGVybiB2b2lkICAgICBjb25mX2ZyZWVfbGlzdChzdHJ1Y3QgY29uZl9saXN0ICopOworZXh0ZXJuIHN0cnVjdCBzb2NrYWRkciAqY29uZl9nZXRfYWRkcmVzcyhjaGFyICosIGNoYXIgKik7CitleHRlcm4gc3RydWN0IGNvbmZfbGlzdCAqY29uZl9nZXRfbGlzdChjaGFyICosIGNoYXIgKik7CitleHRlcm4gc3RydWN0IGNvbmZfbGlzdCAqY29uZl9nZXRfdGFnX2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgICAgICBjb25mX2dldF9udW0oY2hhciAqLCBjaGFyICosIGludCk7CitleHRlcm4gY2hhciAgICAqY29uZl9nZXRfc3RyKGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBjaGFyICAgICpjb25mX2dldF9zZWN0aW9uKGNoYXIgKiwgY2hhciAqLCBjaGFyICopOworZXh0ZXJuIHZvaWQgICAgIGNvbmZfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgICAgICBjb25mX21hdGNoX251bShjaGFyICosIGNoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkICAgICBjb25mX3JlaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgICAgICBjb25mX3JlbW92ZShpbnQsIGNoYXIgKiwgY2hhciAqKTsKK2V4dGVybiBpbnQgICAgICBjb25mX3JlbW92ZV9zZWN0aW9uKGludCwgY2hhciAqKTsKK2V4dGVybiB2b2lkICAgICBjb25mX3JlcG9ydCh2b2lkKTsKKworLyoKKyAqIENvbnZlcnQgbGV0dGVyIGZyb20gdXBwZXIgY2FzZSB0byBsb3dlciBjYXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1cHBlcjJsb3dlcihjaGFyICpzdHIpCit7CisJY2hhciBjOworCisJd2hpbGUgKChjID0gdG9sb3dlcigqc3RyKSkpCisJCSpzdHIrKyA9IGM7Cit9CisKKworI2VuZGlmCQkJCS8qIF9DT05GRklMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaC5pbiBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjOWNlYgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTAsMCArMSw0NzUgQEAKKy8qIHN1cHBvcnQvaW5jbHVkZS9jb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIGBjbG9zZWRpcicgZnVuY3Rpb24gcmV0dXJucyB2b2lkIGluc3RlYWQgb2YgYGludCcuICovCisjdW5kZWYgQ0xPU0VESVJfVk9JRAorCisvKiBEZWZpbmUgdG8gb25lIG9mIGBfZ2V0YjY3JywgYEdFVEI2NycsIGBnZXRiNjcnIGZvciBDcmF5LTIgYW5kIENyYXktWU1QCisgICBzeXN0ZW1zLiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBgYWxsb2NhLmMnIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4KKyAgICovCisjdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKKworLyogRGVmaW5lIHRvIDEgaWYgdXNpbmcgYGFsbG9jYS5jJy4gKi8KKyN1bmRlZiBDX0FMTE9DQQorCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IHNldCBieSBgZ2V0Z3JvdXBzJy4gVXN1YWxseQorICAgdGhpcyBpcyBlaXRoZXIgYGludCcgb3IgYGdpZF90Jy4gKi8KKyN1bmRlZiBHRVRHUk9VUFNfVAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBycGNzZWNfZ3NzIHN1cHBvcnQgY29tcGlsZWQgaW4gKi8KKyN1bmRlZiBHU1NfU1VQUE9SVEVECisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWxhcm0nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQUxBUk0KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgYGFsbG9jYScsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICovCisjdW5kZWYgSEFWRV9BTExPQ0EKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLgorICAgKi8KKyN1bmRlZiBIQVZFX0FMTE9DQV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQVJQQV9JTkVUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGV4aXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQVRFWElUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXV0aGdzc19zZXRfZGVidWdfbGV2ZWwnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQVVUSEdTU19TRVRfREVCVUdfTEVWRUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiaW5kcmVzdnBvcnRfc2EnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQklORFJFU1ZQT1JUX1NBCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHRvIHVzZSBCU0Qgc2lnbmFsIHNlbWFudGljcyAqLworI3VuZGVmIEhBVkVfQlNEX1NJR05BTFMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjb21fZXJyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ09NX0VSUl9ICisKKy8qIERlZmluZSB0aGlzIHRvIDEgaWYgQUlfQUREUkNPTkZJRyBtYWNybyBpcyBkZWZpbmVkICovCisjdW5kZWYgSEFWRV9ERUNMX0FJX0FERFJDT05GSUcKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKyN1bmRlZiBIQVZFX0RJUkVOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBkb24ndCBoYXZlIGB2cHJpbnRmJyBidXQgZG8gaGF2ZSBgX2RvcHJudC4nICovCisjdW5kZWYgSEFWRV9ET1BSTlQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkdXAyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0RVUDIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxldC9jb21fZXJyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRVRfQ09NX0VSUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXZlbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9FVkVOVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9GQ05UTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmRhdGFzeW5jJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0ZEQVRBU1lOQworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZvcmsnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9GVFJVTkNBVEUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUQ1dECisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgc3lzdGVtIGhhcyBhIHdvcmtpbmcgYGdldGdyb3VwcycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRHUk9VUFMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnlhZGRyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEhPU1RCWUFERFIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0bmFtZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRIT1NUTkFNRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGlmYWRkcnMnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUSUZBRERSUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG1udGVudCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRNTlRFTlQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRuYW1laW5mbycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVROQU1FSU5GTworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJwY2J5bmFtZScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9HRVRSUENCWU5BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUVElNRU9GREFZCisKKy8qIERlZmluZSB0aGlzIGlmIHRoZSBLZXJiZXJvcyBHU1MgbGlicmFyeSBzdXBwb3J0cyBnc3Nfa3JiNV9jY2FjaGVfbmFtZSAqLworI3VuZGVmIEhBVkVfR1NTX0tSQjVfQ0NBQ0hFX05BTUUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBoYXNtbnRvcHQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfSEFTTU5UT1BUCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIEhlaW1kYWwgS2VyYmVyb3MgbGlicmFyaWVzICovCisjdW5kZWYgSEFWRV9IRUlNREFMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aWZhZGRycy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lGQUREUlNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGluZXRfbnRvYScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9JTkVUX05UT0EKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbm5ldGdyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0lOTkVUR1IKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgTUlUIEtlcmJlcm9zIGxpYnJhcmllcyAqLworI3VuZGVmIEhBVkVfS1JCNQorCisvKiBEZWZpbmUgdGhpcyBpZiB0aGUgZnVuY3Rpb24ga3JiNV9nZXRfZXJyb3JfbWVzc2FnZSBpcyBhdmFpbGFibGUgKi8KKyN1bmRlZiBIQVZFX0tSQjVfR0VUX0VSUk9SX01FU1NBR0UKKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIGZ1bmN0aW9uIGtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0X3NldF9hZGRyZXNzbGVzcyBpcworICAgYXZhaWxhYmxlICovCisjdW5kZWYgSEFWRV9LUkI1X0dFVF9JTklUX0NSRURTX09QVF9TRVRfQUREUkVTU0xFU1MKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElCSU5UTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGlycGMnIGxpYnJhcnkgKC1sdGlycGMpLiAqLworI3VuZGVmIEhBVkVfTElCVElSUEMKKworLyogdGNwLXdyYXBwZXIgKi8KKyN1bmRlZiBIQVZFX0xJQldSQVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU1JVFNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiBgbHN0YXQnIGhhcyB0aGUgYnVnIHRoYXQgaXQgc3VjY2VlZHMgd2hlbiBnaXZlbiB0aGUKKyAgIHplcm8tbGVuZ3RoIGZpbGUgbmFtZSBhcmd1bWVudC4gKi8KKyN1bmRlZiBIQVZFX0xTVEFUX0VNUFRZX1NUUklOR19CVUcKKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIEtlcmJlcm9zIEdTUyBsaWJyYXJ5IHN1cHBvcnRzCisgICBnc3Nfa3JiNV9leHBvcnRfbHVjaWRfc2VjX2NvbnRleHQgKi8KKyN1bmRlZiBIQVZFX0xVQ0lEX0NPTlRFWFRfU1VQUE9SVAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX01BTExPQ19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTUVNT1JZX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1zZXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUVNU0VUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtkaXInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfTUtESVIKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4gKi8KKyN1bmRlZiBIQVZFX05ESVJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkVUREJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRJTkVUX0lOX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuZnM0X3NldF9kZWJ1ZycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9ORlM0X1NFVF9ERUJVRworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5mc2lkbWFwLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkZTSURNQVBfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhdGhjb25mJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1BBVEhDT05GCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cGF0aHMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QQVRIU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhbHBhdGgnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfUkVBTFBBVEgKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBybWRpcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9STURJUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNlbGVjdCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TRUxFQ1QKKworLyogRGVmaW5lIHRoaXMgaWYgdGhlIEtlcmJlcm9zIEdTUyBsaWJyYXJ5IHN1cHBvcnRzCisgICBnc3Nfa3JiNV9zZXRfYWxsb3dhYmxlX2VuY3R5cGVzICovCisjdW5kZWYgSEFWRV9TRVRfQUxMT1dBQkxFX0VOQ1RZUEVTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lncHJvY21hc2snIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU0lHUFJPQ01BU0sKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzb2NrZXQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU09DS0VUCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3BrbTMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TUEtNM19ICisKKy8qIERlZmluZSB0byAxIGlmIGBzdGF0JyBoYXMgdGhlIGJ1ZyB0aGF0IGl0IHN1Y2NlZWRzIHdoZW4gZ2l2ZW4gdGhlCisgICB6ZXJvLWxlbmd0aCBmaWxlIG5hbWUgYXJndW1lbnQuICovCisjdW5kZWYgSEFWRV9TVEFUX0VNUFRZX1NUUklOR19CVUcKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERJTlRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJDQVNFQ01QCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2hyJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkNIUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJEVVAKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcicgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJFUlJPUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVFJJTkdfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnJjaHInIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU1RSUkNIUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbCcgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJUT0wKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJ0b3VsJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUlRPVUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXNsb2cuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNMT0dfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9jYXBhYmlsaXR5Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0NBUEFCSUxJVFlfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKyN1bmRlZiBIQVZFX1NZU19ESVJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19JT0NUTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21vdW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX01PVU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworI3VuZGVmIEhBVkVfU1lTX05ESVJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19QQVJBTV9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU09DS0VUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19TVEFUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy92ZnMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfVkZTX0gKKworLyogdGNwLXdyYXBwZXIgKi8KKyN1bmRlZiBIQVZFX1RDUF9XUkFQUEVSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2Zm9yaycgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9WRk9SSworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHZmb3JrLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfVkZPUktfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZwcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVlBSSU5URgorCisvKiBEZWZpbmUgdG8gMSBpZiBgZm9yaycgd29ya3MuICovCisjdW5kZWYgSEFWRV9XT1JLSU5HX0ZPUksKKworLyogRGVmaW5lIHRvIDEgaWYgYHZmb3JrJyB3b3Jrcy4gKi8KKyN1bmRlZiBIQVZFX1dPUktJTkdfVkZPUksKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgSVB2NiBzdXBwb3J0IGNvbXBpbGVkIGluICovCisjdW5kZWYgSVBWNl9TVVBQT1JURUQKKworLyogRGVmaW5lIHRoaXMgYXMgdGhlIEtlcmJlcm9zIHZlcnNpb24gbnVtYmVyICovCisjdW5kZWYgS1JCNV9WRVJTSU9OCisKKy8qIHRjcC13cmFwcGVyICovCisjdW5kZWYgTElCV1JBUAorCisvKiBEZWZpbmUgdG8gMSBpZiBgbHN0YXQnIGRlcmVmZXJlbmNlcyBhIHN5bWxpbmsgc3BlY2lmaWVkIHdpdGggYSB0cmFpbGluZworICAgc2xhc2guICovCisjdW5kZWYgTFNUQVRfRk9MTE9XU19TTEFTSEVEX1NZTUxJTksKKworLyogRGVmaW5lIHRvIHRoZSBzdWItZGlyZWN0b3J5IGluIHdoaWNoIGxpYnRvb2wgc3RvcmVzIHVuaW5zdGFsbGVkIGxpYnJhcmllcy4KKyAgICovCisjdW5kZWYgTFRfT0JKRElSCisKKy8qIERlZmluZSB0byAxIGlmIGBtYWpvcicsIGBtaW5vcicsIGFuZCBgbWFrZWRldicgYXJlIGRlY2xhcmVkIGluIDxta2Rldi5oPi4KKyAgICovCisjdW5kZWYgTUFKT1JfSU5fTUtERVYKKworLyogRGVmaW5lIHRvIDEgaWYgYG1ham9yJywgYG1pbm9yJywgYW5kIGBtYWtlZGV2JyBhcmUgZGVjbGFyZWQgaW4KKyAgIDxzeXNtYWNyb3MuaD4uICovCisjdW5kZWYgTUFKT1JfSU5fU1lTTUFDUk9TCisKKy8qIFRoaXMgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIE5GUyBtb3VudCBjb25maWd1cmF0aW9uIGZpbGUgKi8KKyN1bmRlZiBNT1VOVE9QVFNfQ09ORkZJTEUKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgbW91bnQgdG8gcmVhZCBhIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworI3VuZGVmIE1PVU5UX0NPTkZJRworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCBORlN2MyBzdXBwb3J0IGNvbXBpbGVkIGluICovCisjdW5kZWYgTkZTM19TVVBQT1JURUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgTkZTdjQxIHN1cHBvcnQgY29tcGlsZWQgaW4gKi8KKyN1bmRlZiBORlM0MV9TVVBQT1JURUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgTkZTdjQgc3VwcG9ydCBjb21waWxlZCBpbiAqLworI3VuZGVmIE5GUzRfU1VQUE9SVEVECisKKy8qIFRoaXMgZGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIE5GUyBzdGF0ZSBmaWxlcy4gV2FybmluZzogdGhpcyBtdXN0IG1hdGNoCisgICBkZWZpbml0aW9ucyBpbiBjb25maWcubWshICovCisjdW5kZWYgTkZTX1NUQVRFRElSCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgQyBjb21waWxlciBkb2Vzbid0IGFjY2VwdCAtYyBhbmQgLW8gdG9nZXRoZXIuICovCisjdW5kZWYgTk9fTUlOVVNfQ19NSU5VU19PCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI3VuZGVmIFBBQ0tBR0UKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjdW5kZWYgUEFDS0FHRV9CVUdSRVBPUlQKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjdW5kZWYgUEFDS0FHRV9TVFJJTkcKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVEFSTkFNRQorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KKyN1bmRlZiBSRVRTSUdUWVBFCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhcmcgMSBmb3IgYHNlbGVjdCcuICovCisjdW5kZWYgU0VMRUNUX1RZUEVfQVJHMQorCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYXJncyAyLCAzIGFuZCA0IGZvciBgc2VsZWN0Jy4gKi8KKyN1bmRlZiBTRUxFQ1RfVFlQRV9BUkcyMzQKKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFyZyA1IGZvciBgc2VsZWN0Jy4gKi8KKyN1bmRlZiBTRUxFQ1RfVFlQRV9BUkc1CisKKy8qIFRoZSBzaXplIG9mIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX0lOVAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyN1bmRlZiBTSVpFT0ZfTE9ORworCisvKiBUaGUgc2l6ZSBvZiBgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1NIT1JUCisKKy8qIFRoZSBzaXplIG9mIGBzaXplX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjdW5kZWYgU0laRU9GX1NJWkVfVAorCisvKiBUaGUgc2l6ZSBvZiBgc29ja2xlbl90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI3VuZGVmIFNJWkVPRl9TT0NLTEVOX1QKKworLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCisgICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW50aW1lLgorCVNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKKwlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKKwlTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAqLworI3VuZGVmIFNUQUNLX0RJUkVDVElPTgorCisvKiBEZWZpbmUgdGhpcyB0byBhIHNjcmlwdCB3aGljaCBjYW4gc3RhcnQgc3RhdGQgb24gbW91bnQgKi8KKyN1bmRlZiBTVEFSVF9TVEFURAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyN1bmRlZiBTVERDX0hFQURFUlMKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCisjdW5kZWYgVElNRV9XSVRIX1NZU19USU1FCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgPHN5cy90aW1lLmg+IGRlY2xhcmVzIGBzdHJ1Y3QgdG0nLiAqLworI3VuZGVmIFRNX0lOX1NZU19USU1FCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byB1c2UgYmxraWQgdG8gZmluZCB1dWlkIG9mIGZpbGVzeXN0ZW1zICovCisjdW5kZWYgVVNFX0JMS0lECisKKy8qIERlZmluZSB0aGlzIGlmIHRoZSBwcml2YXRlIGZ1bmN0aW9uLCBnc3Nfa3JiNV9jYWNoZV9uYW1lLCBtdXN0IGJlIHVzZWQgdG8KKyAgIHRlbGwgdGhlIEtlcmJlcm9zIGxpYnJhcnkgd2hpY2ggY3JlZGVudGlhbHMgY2FjaGUgdG8gdXNlLiBPdGhlcndpc2UsIHRoaXMKKyAgIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgS1JCNUNDTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworI3VuZGVmIFVTRV9HU1NfS1JCNV9DQ0FDSEVfTkFNRQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjdW5kZWYgVkVSU0lPTgorCisvKiBOdW1iZXIgb2YgYml0cyBpbiBhIGZpbGUgb2Zmc2V0LCBvbiBob3N0cyB3aGVyZSB0aGlzIGlzIHNldHRhYmxlLiAqLworI3VuZGVmIF9GSUxFX09GRlNFVF9CSVRTCisKKy8qIERlZmluZSBmb3IgbGFyZ2UgZmlsZXMsIG9uIEFJWC1zdHlsZSBob3N0cy4gKi8KKyN1bmRlZiBfTEFSR0VfRklMRVMKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICovCisjdW5kZWYgZ2lkX3QKKworLyogRGVmaW5lIHRvIGBfX2lubGluZV9fJyBvciBgX19pbmxpbmUnIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyCisgICBjYWxscyBpdCwgb3IgdG8gbm90aGluZyBpZiAnaW5saW5lJyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyIGFueSBuYW1lLiAgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyN1bmRlZiBpbmxpbmUKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gYGxvbmcgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisjdW5kZWYgcGlkX3QKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworI3VuZGVmIHNpemVfdAorCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gKi8KKyN1bmRlZiB1aWRfdAorCisvKiBEZWZpbmUgYXMgYGZvcmsnIGlmIGB2Zm9yaycgZG9lcyBub3Qgd29yay4gKi8KKyN1bmRlZiB2Zm9yawpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9leHBvcnRmcy5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9leHBvcnRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGIyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL2V4cG9ydGZzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBzdXBwb3J0L2luY2x1ZGUvZXhwb3J0ZnMuaAorICoKKyAqIERlY2xhcmF0aW9ucyBmb3IgZXhwb3J0ZnMgYW5kIG1vdW50ZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIEVYUE9SVEZTX0gKKyNkZWZpbmUgRVhQT1JURlNfSAorCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlICJuZnNsaWIuaCIKKworZW51bSB7CisJTUNMX0ZRRE4gPSAwLAorCU1DTF9TVUJORVRXT1JLLAorCU1DTF9JUEFERFIgPSBNQ0xfU1VCTkVUV09SSywKKwlNQ0xfV0lMRENBUkQsCisJTUNMX05FVEdST1VQLAorCU1DTF9BTk9OWU1PVVMsCisJTUNMX0dTUywKKwlNQ0xfTUFYVFlQRVMKK307CisKK2VudW0geworCUZTTE9DX05PTkUgPSAwLAorCUZTTE9DX1JFRkVSLAorCUZTTE9DX1JFUExJQ0EsCisJRlNMT0NfU1RVQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWNsaWVudCB7CisJc3RydWN0IG1jbGllbnQgKgltX25leHQ7CisJY2hhciAqCQkJbV9ob3N0bmFtZTsKKwlpbnQJCQltX3R5cGU7CisJaW50CQkJbV9uYWRkcjsKKwlzdHJ1Y3QgaW5fYWRkcgkJbV9hZGRybGlzdFtORlNDTE5UX0FERFJNQVhdOworCWludAkJCW1fZXhwb3J0ZWQ7CS8qIGV4cG9ydGVkIHRvIG5mc2QgKi8KKwlpbnQJCQltX2NvdW50OworfSBuZnNfY2xpZW50OworCit0eXBlZGVmIHN0cnVjdCBtZXhwb3J0IHsKKwlzdHJ1Y3QgbWV4cG9ydCAqCW1fbmV4dDsKKwlzdHJ1Y3QgbWNsaWVudCAqCW1fY2xpZW50OworCXN0cnVjdCBleHBvcnRlbnQJbV9leHBvcnQ7CisJaW50CQkJbV9leHBvcnRlZDsJLyoga25vd24gdG8ga25mc2QuIC0xIG1lYW5zIG5vdCBzdXJlICovCisJaW50CQkJbV94dGFiZW50ICA6IDEsCS8qIHh0YWIgZW50cnkgZXhpc3RzICovCisJCQkJbV9tYXlleHBvcnQ6IDEsCS8qIGRlcml2ZWQgZnJvbSB4dGFiYmVkICovCisJCQkJbV9jaGFuZ2VkICA6IDEsIC8qIG9wdGlvbnMgKG1heSkgaGF2ZSBjaGFuZ2VkICovCisJCQkJbV93YXJuZWQgICA6IDE7IC8qIHdhcm5lZCBhYm91dCBtdWx0aXBsZSBleHBvcnRzCisJCQkJCQkgKiBtYXRjaGluZyBvbmUgY2xpZW50ICovCit9IG5mc19leHBvcnQ7CisKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFIDEwMjEKKwordHlwZWRlZiBzdHJ1Y3QgX2V4cF9oYXNoX2VudHJ5IHsKKwluZnNfZXhwb3J0ICogcF9maXJzdDsKKyAgCW5mc19leHBvcnQgKiBwX2xhc3Q7Cit9IGV4cF9oYXNoX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfZXhwX2hhc2hfdGFibGUgeworCW5mc19leHBvcnQgKiBwX2hlYWQ7CisJZXhwX2hhc2hfZW50cnkgZW50cmllc1tIQVNIX1RBQkxFX1NJWkVdOworfSBleHBfaGFzaF90YWJsZTsKKworZXh0ZXJuIGV4cF9oYXNoX3RhYmxlIGV4cG9ydGxpc3RbTUNMX01BWFRZUEVTXTsKKworZXh0ZXJuIG5mc19jbGllbnQgKgkJY2xpZW50bGlzdFtNQ0xfTUFYVFlQRVNdOworCituZnNfY2xpZW50ICoJCQljbGllbnRfbG9va3VwKGNoYXIgKmhuYW1lLCBpbnQgY2Fub25pY2FsKTsKK25mc19jbGllbnQgKgkJCWNsaWVudF9maW5kKHN0cnVjdCBob3N0ZW50ICopOwordm9pZAkJCQljbGllbnRfYWRkKG5mc19jbGllbnQgKik7CituZnNfY2xpZW50ICoJCQljbGllbnRfZHVwKG5mc19jbGllbnQgKiwgc3RydWN0IGhvc3RlbnQgKik7CitpbnQJCQkJY2xpZW50X2dldHR5cGUoY2hhciAqaG5hbWUpOworaW50CQkJCWNsaWVudF9jaGVjayhuZnNfY2xpZW50ICosIHN0cnVjdCBob3N0ZW50ICopOworaW50CQkJCWNsaWVudF9tYXRjaChuZnNfY2xpZW50ICosIGNoYXIgKmhuYW1lKTsKK3ZvaWQJCQkJY2xpZW50X3JlbGVhc2UobmZzX2NsaWVudCAqKTsKK3ZvaWQJCQkJY2xpZW50X2ZyZWVhbGwodm9pZCk7CitjaGFyICoJCQkJY2xpZW50X2NvbXBvc2Uoc3RydWN0IGhvc3RlbnQgKmhlKTsKK3N0cnVjdCBob3N0ZW50ICoJCWNsaWVudF9yZXNvbHZlKHN0cnVjdCBpbl9hZGRyIGFkZHIpOworaW50IAkJCQljbGllbnRfbWVtYmVyKGNoYXIgKmNsaWVudCwgY2hhciAqbmFtZSk7CisKK2ludAkJCQlleHBvcnRfcmVhZChjaGFyICpmbmFtZSk7Cit2b2lkCQkJZXhwb3J0X2FkZChuZnNfZXhwb3J0ICopOwordm9pZAkJCQlleHBvcnRfcmVzZXQobmZzX2V4cG9ydCAqKTsKK25mc19leHBvcnQgKgkJCWV4cG9ydF9sb29rdXAoY2hhciAqaG5hbWUsIGNoYXIgKnBhdGgsIGludCBjYWNvbmljYWwpOworbmZzX2V4cG9ydCAqCQkJZXhwb3J0X2ZpbmQoc3RydWN0IGhvc3RlbnQgKiwgY2hhciAqcGF0aCk7CituZnNfZXhwb3J0ICoJCQlleHBvcnRfYWxsb3dlZChzdHJ1Y3QgaG9zdGVudCAqLCBjaGFyICpwYXRoKTsKK25mc19leHBvcnQgKgkJCWV4cG9ydF9jcmVhdGUoc3RydWN0IGV4cG9ydGVudCAqLCBpbnQgY2Fub25pY2FsKTsKK25mc19leHBvcnQgKgkJCWV4cG9ydF9kdXAobmZzX2V4cG9ydCAqLCBzdHJ1Y3QgaG9zdGVudCAqKTsKK3ZvaWQJCQkJZXhwb3J0X2ZyZWVhbGwodm9pZCk7CitpbnQJCQkJZXhwb3J0X2V4cG9ydChuZnNfZXhwb3J0ICopOworaW50CQkJCWV4cG9ydF91bmV4cG9ydChuZnNfZXhwb3J0ICopOworCitpbnQJCQkJeHRhYl9tb3VudF9yZWFkKHZvaWQpOworaW50CQkJCXh0YWJfZXhwb3J0X3JlYWQodm9pZCk7CitpbnQJCQkJeHRhYl9tb3VudF93cml0ZSh2b2lkKTsKK2ludAkJCQl4dGFiX2V4cG9ydF93cml0ZSh2b2lkKTsKK3ZvaWQJCQkJeHRhYl9hcHBlbmQobmZzX2V4cG9ydCAqKTsKKworaW50CQkJCXNlY2luZm9fYWRkZmxhdm9yKHN0cnVjdCBmbGF2X2luZm8gKiwgc3RydWN0IGV4cG9ydGVudCAqKTsKKworaW50CQkJCXJtdGFiX3JlYWQodm9pZCk7CisKK3N0cnVjdCBuZnNrZXkgKgkJCWtleV9sb29rdXAoY2hhciAqaG5hbWUpOworCitzdHJ1Y3QgZXhwb3J0X2ZlYXR1cmVzIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHNlY2luZm9fZmxhZ3M7Cit9OworCitzdHJ1Y3QgZXhwb3J0X2ZlYXR1cmVzICpnZXRfZXhwb3J0X2ZlYXR1cmVzKHZvaWQpOworCisvKiBSZWNvcmQgZXhwb3J0IGVycm9yLiAgKi8KK2V4dGVybiBpbnQgZXhwb3J0X2Vycm5vOworCisjZW5kaWYgLyogRVhQT1JURlNfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9oYS1jYWxsb3V0LmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL2hhLWNhbGxvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTY0MzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9oYS1jYWxsb3V0LmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIHN1cHBvcnQvaW5jbHVkZS9oYS1jYWxsb3V0LmgKKyAqCisgKiBIaWdoIEF2YWlsYWJpbGl0eSBORlMgQ2FsbG91dCBzdXBwb3J0IHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBQYXVsIENsZW1lbnRzLCBTdGVlbEV5ZSBUZWNobm9sb2d5CisgKgorICogSW4gb3JkZXIgdG8gaW1wbGVtZW50IEhBIE5GUywgd2UgbmVlZCBzZXZlcmFsIGNhbGxvdXRzIGF0IGtleQorICogcG9pbnRzIGluIHN0YXRkIGFuZCBtb3VudGQuIFRoZXNlIGNhbGxvdXRzIGFsbCBjb21lIHRvIGhhX2NhbGxvdXQoKSwKKyAqIHdoaWNoLCBpbiB0dXJuLCBjYWxscyBvdXQgdG8gYW4gaGEtY2FsbG91dCBzY3JpcHQgKG5vdCBwYXJ0IG9mIG5mcy11dGlsczsKKyAqIGRlZmluZWQgYnkgLUggYXJndW1lbnQgdG8gcnBjLnN0YXRkIGFuZCBycGMubW91bnRkKS4KKyAqLworI2lmbmRlZiBIQV9DQUxMT1VUX0gKKyNkZWZpbmUgSEFfQ0FMTE9VVF9ICisKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitleHRlcm4gY2hhciAqaGFfY2FsbG91dF9wcm9nOworCitzdGF0aWMgaW5saW5lIHZvaWQKK2hhX2NhbGxvdXQoY2hhciAqZXZlbnQsIGNoYXIgKmFyZzEsIGNoYXIgKmFyZzIsIGludCBhcmczKQoreworCWNoYXIgYnVmWzE2XTsgLyogc2hvdWxkIGJlIHBsZW50eSAqLworCXBpZF90IHBpZDsKKwlpbnQgcmV0ID0gLTE7CisJc3RydWN0IHNpZ2FjdGlvbiBvbGRhY3QsIG5ld2FjdDsKKworCWlmICghaGFfY2FsbG91dF9wcm9nKSAvKiBIQSBjYWxsb3V0IGlzIG5vdCBlbmFibGVkICovCisJCXJldHVybjsKKworCXNwcmludGYoYnVmLCAiJWQiLCBhcmczKTsKKworCS8qIG1hbnkgZGFlbW9ucyBpZ25vcmUgU0lHQ0hMRCBhcyB0Y3B3cmFwcGVycyB3aWxsCisJICogZm9yayBhIGNoaWxkIHRvIGRvIGxvZ2dpbmcuICBXZSBuZWVkIHRvIHdhaXQKKwkgKiBmb3IgYSBjaGlsZCBoZXJlLCBzbyB3ZSBuZWVkIHRvIHVuLWlnbm9yZQorCSAqIFNJR0NITEQgdGVtcG9yYXJpbHkKKwkgKi8KKwluZXdhY3Quc2FfaGFuZGxlciA9IFNJR19ERkw7CisJbmV3YWN0LnNhX2ZsYWdzID0gMDsKKwlzaWdlbXB0eXNldCgmbmV3YWN0LnNhX21hc2spOworCXNpZ2FjdGlvbihTSUdDSExELCAmbmV3YWN0LCAmb2xkYWN0KTsKKwlwaWQgPSBmb3JrKCk7CisJc3dpdGNoIChwaWQpIHsKKwkJY2FzZSAwOiBleGVjbChoYV9jYWxsb3V0X3Byb2csIGhhX2NhbGxvdXRfcHJvZywKKwkJCQlldmVudCwgYXJnMSwgYXJnMiwgCisJCQkgICAgICBhcmczIDwgMCA/IE5VTEwgOiBidWYsCisJCQkgICAgICBOVUxMKTsKKwkJCXBlcnJvcigiZXhlY2wiKTsKKwkJCWV4aXQoMik7CisJCWNhc2UgLTE6IHBlcnJvcigiZm9yayIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IHBpZCA9IHdhaXRwaWQocGlkLCAmcmV0LCAwKTsKKyAgCX0KKwlzaWdhY3Rpb24oU0lHQ0hMRCwgJm9sZGFjdCwgJm5ld2FjdCk7CisJeGxvZyhEX0dFTkVSQUwsICJoYSBjYWxsb3V0IHJldHVybmVkICVkXG4iLCBXRVhJVFNUQVRVUyhyZXQpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL21pc2MuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMWIyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL21pc2MuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogbWlzYy5oCUFsbCB0aGF0IGRpZG4ndCBmaXQgZWxzZXdoZXJlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZuZGVmIE1JU0NfSAorI2RlZmluZSBNSVNDX0gKKworLyoKKyAqIEdlbmVyYXRlIHJhbmRvbSBrZXksIHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQuIEN1cnJlbnRseSwKKyAqIHdlYWtyYW5kb21rZXkgZ2VuZXJhdGVzIGEgbWF4aW11bSBvZiAyMCBieXRlcyBhcmUgZ2VuZXJhdGVkLCBidXQgdGhpcworICogbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK2ludAlyYW5kb21rZXkodW5zaWduZWQgY2hhciAqa2V5b3V0LCBpbnQgbGVuKTsKK2ludAl3ZWFrcmFuZG9ta2V5KHVuc2lnbmVkIGNoYXIgKmtleW91dCwgaW50IGxlbik7CisKK2ludAltYXRjaGhvc3RuYW1lKGNvbnN0IGNoYXIgKmgxLCBjb25zdCBjaGFyICpoMik7IAorCitzdHJ1Y3QgaG9zdGVudDsKK3N0cnVjdCBob3N0ZW50CSpob3N0ZW50X2R1cChzdHJ1Y3QgaG9zdGVudCAqaHApOworc3RydWN0IGhvc3RlbnQJKmdldF9ob3N0ZW50IChjb25zdCBjaGFyICphZGRyLCBpbnQgbGVuLCBpbnQgdHlwZSk7CitzdHJ1Y3QgaG9zdGVudCAqZ2V0X3JlbGlhYmxlX2hvc3RieWFkZHIoY29uc3QgY2hhciAqYWRkciwgaW50IGxlbiwgaW50IHR5cGUpOworCitleHRlcm4gaW50IGlzX21vdW50cG9pbnQoY2hhciAqcGF0aCk7CisKKyNlbmRpZiAvKiBNSVNDX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzL01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwM2JhMQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK25vaW5zdF9IRUFERVJTID0gZGVidWcuaCBleHBvcnQuaCBuZnMuaAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mcy9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGQwOWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ2NCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gc3VwcG9ydC9pbmNsdWRlL25mcworRElTVF9DT01NT04gPSAkKG5vaW5zdF9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitIRUFERVJTID0gJChub2luc3RfSEVBREVSUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitub2luc3RfSEVBREVSUyA9IGRlYnVnLmggZXhwb3J0LmggbmZzLmgKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvaW5jbHVkZS9uZnMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9pbmNsdWRlL25mcy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChIRUFERVJTKQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJ0b29sIGN0YWdzIGRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKKwlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIFwKKwl1bmluc3RhbGwtYW0KKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mcy9kZWJ1Zy5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnMvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkxZTkxCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnMvZGVidWcuaApAQCAtMCwwICsxLDgxIEBACisjaWZuZGVmIF9ORlNfREVCVUdfSAorI2RlZmluZSBfTkZTX0RFQlVHX0gKKworLyoKKyAqIFJQQyBkZWJ1ZyBmYWNpbGl0aWVzCisgKi8KKyNkZWZpbmUgUlBDREJHX1hQUlQJCTB4MDAwMQorI2RlZmluZSBSUENEQkdfQ0FMTAkJMHgwMDAyCisjZGVmaW5lIFJQQ0RCR19ERUJVRwkJMHgwMDA0CisjZGVmaW5lIFJQQ0RCR19ORlMJCTB4MDAwOAorI2RlZmluZSBSUENEQkdfQVVUSAkJMHgwMDEwCisjZGVmaW5lIFJQQ0RCR19CSU5ECQkweDAwMjAKKyNkZWZpbmUgUlBDREJHX1NDSEVECQkweDAwNDAKKyNkZWZpbmUgUlBDREJHX1RSQU5TCQkweDAwODAKKyNkZWZpbmUgUlBDREJHX1NWQ1NPQ0sJCTB4MDEwMAorI2RlZmluZSBSUENEQkdfU1ZDRFNQCQkweDAyMDAKKyNkZWZpbmUgUlBDREJHX01JU0MJCTB4MDQwMAorI2RlZmluZSBSUENEQkdfQ0FDSEUJCTB4MDgwMAorI2RlZmluZSBSUENEQkdfQUxMCQkweDdmZmYKKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgdGhlIHN5c2N0bCBkZWJ1ZyBpbnRlcmZhY2UsIHdoaWNoIGFsbG93cyB0byByZWFkIG9yCisgKiBjaGFuZ2UgdGhlIGRlYnVnIGZsYWdzIGZvciBycGMsIG5mcywgbmZzZCwgYW5kIGxvY2tkLiBTaW5jZSB0aGUgc3VucnBjCisgKiBtb2R1bGUgY3VycmVudGx5IHJlZ2lzdGVycyBpdHMgc3lzY3RsIHRhYmxlIGR5bmFtaWNhbGx5LCB0aGUgc3lzY3RsIHBhdGgKKyAqIGZvciBtb2R1bGUgRk9PIGlzIDxDVExfU1VOUlBDLCBDVExfRk9PREVCVUc+LgorICovCisjZGVmaW5lIENUTF9TVU5SUEMJNzI0OQkvKiBhcmJpdHJhcnkgYW5kIGhvcGVmdWxseSB1bnVzZWQgKi8KKworZW51bSB7CisJQ1RMX1JQQ0RFQlVHID0gMSwKKwlDVExfTkZTREVCVUcsCisJQ1RMX05GU0RERUJVRywKKwlDVExfTkxNREVCVUcsCit9OworCisKKy8qCisgKiBrbmZzZCBkZWJ1ZyBmbGFncworICovCisjZGVmaW5lIE5GU0REQkdfU09DSwkJMHgwMDAxCisjZGVmaW5lIE5GU0REQkdfRkgJCTB4MDAwMgorI2RlZmluZSBORlNEREJHX0VYUE9SVAkJMHgwMDA0CisjZGVmaW5lIE5GU0REQkdfU1ZDCQkweDAwMDgKKyNkZWZpbmUgTkZTRERCR19QUk9DCQkweDAwMTAKKyNkZWZpbmUgTkZTRERCR19GSUxFT1AJCTB4MDAyMAorI2RlZmluZSBORlNEREJHX0FVVEgJCTB4MDA0MAorI2RlZmluZSBORlNEREJHX1JFUENBQ0hFCTB4MDA4MAorI2RlZmluZSBORlNEREJHX1hEUgkJMHgwMTAwCisjZGVmaW5lIE5GU0REQkdfTE9DS0QJCTB4MDIwMAorI2RlZmluZSBORlNEREJHX0FMTAkJMHg3RkZGCisjZGVmaW5lIE5GU0REQkdfTk9DSEFOR0UJMHhGRkZGCisKKy8qCisgKiBEZWJ1ZyBmbGFncworICovCisjZGVmaW5lIE5MTURCR19TVkMJCTB4MDAwMQorI2RlZmluZSBOTE1EQkdfQ0xJRU5UCQkweDAwMDIKKyNkZWZpbmUgTkxNREJHX0NMTlRMT0NLCQkweDAwMDQKKyNkZWZpbmUgTkxNREJHX1NWQ0xPQ0sJCTB4MDAwOAorI2RlZmluZSBOTE1EQkdfTU9OSVRPUgkJMHgwMDEwCisjZGVmaW5lIE5MTURCR19DTE5UU1VCUwkJMHgwMDIwCisjZGVmaW5lIE5MTURCR19TVkNTVUJTCQkweDAwNDAKKyNkZWZpbmUgTkxNREJHX0hPU1RDQUNIRQkweDAwODAKKyNkZWZpbmUgTkxNREJHX1hEUgkJMHgwMTAwCisjZGVmaW5lIE5MTURCR19BTEwJCTB4N2ZmZgorCisKKyNkZWZpbmUgTkZTREJHX1ZGUwkJMHgwMDAxCisjZGVmaW5lIE5GU0RCR19ESVJDQUNIRQkJMHgwMDAyCisjZGVmaW5lIE5GU0RCR19MT09LVVBDQUNIRQkweDAwMDQKKyNkZWZpbmUgTkZTREJHX1BBR0VDQUNIRQkweDAwMDgKKyNkZWZpbmUgTkZTREJHX1BST0MJCTB4MDAxMAorI2RlZmluZSBORlNEQkdfWERSCQkweDAwMjAKKyNkZWZpbmUgTkZTREJHX0ZJTEUJCTB4MDA0MAorI2RlZmluZSBORlNEQkdfUk9PVAkJMHgwMDgwCisjZGVmaW5lIE5GU0RCR19DQUxMQkFDSwkJMHgwMTAwCisjZGVmaW5lIE5GU0RCR19DTElFTlQJCTB4MDIwMAorI2RlZmluZSBORlNEQkdfTU9VTlQJCTB4MDQwMAorI2RlZmluZSBORlNEQkdfQUxMCQkweEZGRkYKKworI2VuZGlmIC8qIF9ORlNfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnMvZXhwb3J0LmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mcy9leHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTQ3YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnMvZXhwb3J0LmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBfTlNGX0VYUE9SVF9ICisjZGVmaW5lIF9OU0ZfRVhQT1JUX0gKKworLyoKKyAqIEltcG9ydGFudCBsaW1pdHMgZm9yIHRoZSBleHBvcnRzIHN0dWZmLgorICovCisjZGVmaW5lIE5GU0NMTlRfSURNQVgJCTEwMjQKKyNkZWZpbmUgTkZTQ0xOVF9BRERSTUFYCQkxNgorI2RlZmluZSBORlNDTE5UX0tFWU1BWAkJMzIKKworLyoKKyAqIEV4cG9ydCBmbGFncy4KKyAqLworI2RlZmluZSBORlNFWFBfUkVBRE9OTFkJCTB4MDAwMQorI2RlZmluZSBORlNFWFBfSU5TRUNVUkVfUE9SVAkweDAwMDIKKyNkZWZpbmUgTkZTRVhQX1JPT1RTUVVBU0gJMHgwMDA0CisjZGVmaW5lIE5GU0VYUF9BTExTUVVBU0gJMHgwMDA4CisjZGVmaW5lIE5GU0VYUF9BU1lOQwkJMHgwMDEwCisjZGVmaW5lIE5GU0VYUF9HQVRIRVJFRF9XUklURVMJMHgwMDIwCisvKiA0MCwgODAsIDEwMCB1bnVzZWQgKi8KKyNkZWZpbmUgTkZTRVhQX05PSElERQkJMHgwMjAwCisjZGVmaW5lIE5GU0VYUF9OT1NVQlRSRUVDSEVDSwkweDA0MDAKKyNkZWZpbmUgTkZTRVhQX05PQVVUSE5MTQkweDA4MDAKKyNkZWZpbmUgTkZTRVhQX0ZTSUQJCTB4MjAwMAorI2RlZmluZQlORlNFWFBfQ1JPU1NNT1VOVAkweDQwMDAKKyNkZWZpbmUgTkZTRVhQX05PQUNMCQkweDgwMDAgLyogcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIEFDTCByZWxhdGVkIHVzZSAqLworI2RlZmluZSBORlNFWFBfVjRST09UCQkweDEwMDAwCisvKgorICogQWxsIGZsYWdzIHN1cHBvcnRlZCBieSB0aGUga2VybmVsIGJlZm9yZSBhZGRpdGlvbiBvZiB0aGUKKyAqIGV4cG9ydF9mZWF0dXJlcyBpbnRlcmZhY2U6CisgKi8KKyNkZWZpbmUgTkZTRVhQX09MREZMQUdTCQkweDdFM0YKKy8qCisgKiBGbGFncyB0aGF0IGNhbiB2YXJ5IHBlciBmbGF2b3IsIGZvciBrZXJuZWxzIGJlZm9yZSBhZGRpdGlvbiBvZiB0aGUKKyAqIGV4cG9ydF9mZWF0dXJlcyBpbnRlcmZhY2U6CisgKi8KKyNkZWZpbmUgTkZTRVhQX09MRF9TRUNJTkZPX0ZMQUdTIChORlNFWFBfUkVBRE9OTFkgfCBORlNFWFBfUk9PVFNRVUFTSCBcCisJCQkJCXwgTkZTRVhQX0FMTFNRVUFTSCkKKworI2VuZGlmIC8qIF9OU0ZfRVhQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzL25mcy5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnMvbmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzOWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzL25mcy5oCkBAIC0wLDAgKzEsMTY4IEBACisjaWZuZGVmIF9ORlNfTkZTX0gKKyNkZWZpbmUgX05GU19ORlNfSAorCisjaW5jbHVkZSA8Y29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxycGNzdmMvbmZzX3Byb3QuaD4KKyNpbmNsdWRlIDxuZnMvZXhwb3J0Lmg+CisKKyNkZWZpbmUJTkZTM19GSFNJWkUJNjQKKyNkZWZpbmUJTkZTX0ZIU0laRQkzMgorCisjZGVmaW5lIE5GU0RfTUlOVkVSUyAyCisjZGVmaW5lIE5GU0RfTUFYVkVSUyA0CisKKyNkZWZpbmUgTkZTRF9NSU5NSU5PUlZFUlM0IDEKKyNpZmRlZiAgTkZTNDFfU1VQUE9SVEVECisjZGVmaW5lIE5GU0RfTUFYTUlOT1JWRVJTNCAxCisjZWxzZQorI2RlZmluZSBORlNEX01BWE1JTk9SVkVSUzQgMAorI2VuZGlmCisKK3N0cnVjdCBuZnNfZmhfbGVuIHsKKwlpbnQJCWZoX3NpemU7CisJdV9pbnQ4X3QJZmhfaGFuZGxlW05GUzNfRkhTSVpFXTsKK307CitzdHJ1Y3QgbmZzX2ZoX29sZCB7CisJdV9pbnQ4X3QJZmhfaGFuZGxlW05GU19GSFNJWkVdOworfTsKKworLyoKKyAqIFZlcnNpb24gb2YgdGhlIHN5c2NhbGwgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgTkZTQ1RMX1ZFUlNJT04JCTB4MDIwMQorCisvKgorICogVGhlc2UgYXJlIHRoZSBjb21tYW5kcyB1bmRlcnN0b29kIGJ5IG5mc2N0bCgpLgorICovCisjZGVmaW5lIE5GU0NUTF9TVkMJCTAJLyogVGhpcyBpcyBhIHNlcnZlciBwcm9jZXNzLiAqLworI2RlZmluZSBORlNDVExfQUREQ0xJRU5UCTEJLyogQWRkIGFuIE5GUyBjbGllbnQuICovCisjZGVmaW5lIE5GU0NUTF9ERUxDTElFTlQJMgkvKiBSZW1vdmUgYW4gTkZTIGNsaWVudC4gKi8KKyNkZWZpbmUgTkZTQ1RMX0VYUE9SVAkJMwkvKiBleHBvcnQgYSBmaWxlIHN5c3RlbS4gKi8KKyNkZWZpbmUgTkZTQ1RMX1VORVhQT1JUCQk0CS8qIHVuZXhwb3J0IGEgZmlsZSBzeXN0ZW0uICovCisjZGVmaW5lIE5GU0NUTF9VR0lEVVBEQVRFCTUJLyogdXBkYXRlIGEgY2xpZW50J3MgdWlkL2dpZCBtYXAuICovCisjZGVmaW5lIE5GU0NUTF9HRVRGSAkJNgkvKiBnZXQgYW4gZmggKHVzZWQgYnkgbW91bnRkKSAqLworI2RlZmluZSBORlNDVExfR0VURkQJCTcJLyogZ2V0IGFuIGZoIGJ5IHBhdGggKHVzZWQgYnkgbW91bnRkKSAqLworI2RlZmluZSBORlNDVExfR0VURlMJCTgJLyogZ2V0IGFuIGZoIGJ5IHBhdGggd2l0aCBtYXggc2l6ZSAodXNlZCBieSBtb3VudGQpICovCisKKyNkZWZpbmUgTkZTQ1RMX1VEUEJJVAkJICAgICAgKDEgPDwgKDE3IC0gMSkpCisjZGVmaW5lIE5GU0NUTF9UQ1BCSVQJCSAgICAgICgxIDw8ICgxOCAtIDEpKQorCisjZGVmaW5lIE5GU0NUTF9WRVJVTlNFVChfY2x0Yml0cywgX3YpICgoX2NsdGJpdHMpICY9IH4oMSA8PCAoKF92KSAtIDEpKSkgCisjZGVmaW5lIE5GU0NUTF9VRFBVTlNFVChfY2x0Yml0cykgICAgICgoX2NsdGJpdHMpICY9IH5ORlNDVExfVURQQklUKSAKKyNkZWZpbmUgTkZTQ1RMX1RDUFVOU0VUKF9jbHRiaXRzKSAgICAgKChfY2x0Yml0cykgJj0gfk5GU0NUTF9UQ1BCSVQpIAorCisjZGVmaW5lIE5GU0NUTF9WRVJJU1NFVChfY2x0Yml0cywgX3YpICgoX2NsdGJpdHMpICYgKDEgPDwgKChfdikgLSAxKSkpIAorI2RlZmluZSBORlNDVExfVURQSVNTRVQoX2NsdGJpdHMpICAgICAoKF9jbHRiaXRzKSAmIE5GU0NUTF9VRFBCSVQpIAorI2RlZmluZSBORlNDVExfVENQSVNTRVQoX2NsdGJpdHMpICAgICAoKF9jbHRiaXRzKSAmIE5GU0NUTF9UQ1BCSVQpIAorCisjZGVmaW5lIE5GU0NUTF9VRFBTRVQoX2NsdGJpdHMpICAgICAgICgoX2NsdGJpdHMpIHw9IE5GU0NUTF9VRFBCSVQpCisjZGVmaW5lIE5GU0NUTF9UQ1BTRVQoX2NsdGJpdHMpICAgICAgICgoX2NsdGJpdHMpIHw9IE5GU0NUTF9UQ1BCSVQpCisKKyNkZWZpbmUgTkZTQ1RMX0FOWVBST1RPKF9jbHRiaXRzKSAgICAgKChfY2x0Yml0cykgJiAoTkZTQ1RMX1VEUEJJVCB8IE5GU0NUTF9UQ1BCSVQpKQorI2RlZmluZSBORlNDVExfQUxMQklUUyAofjApCisKKy8qIFNWQyAqLworc3RydWN0IG5mc2N0bF9zdmMgeworCXVuc2lnbmVkIHNob3J0CQlzdmNfcG9ydDsKKwlpbnQJCQlzdmNfbnRocmVhZHM7Cit9OworCisvKiBBRERDTElFTlQvREVMQ0xJRU5UICovCitzdHJ1Y3QgbmZzY3RsX2NsaWVudCB7CisJY2hhcgkJCWNsX2lkZW50W05GU0NMTlRfSURNQVgrMV07CisJaW50CQkJY2xfbmFkZHI7CisJc3RydWN0IGluX2FkZHIJCWNsX2FkZHJsaXN0W05GU0NMTlRfQUREUk1BWF07CisJaW50CQkJY2xfZmhrZXl0eXBlOworCWludAkJCWNsX2Zoa2V5bGVuOworCXVuc2lnbmVkIGNoYXIJCWNsX2Zoa2V5W05GU0NMTlRfS0VZTUFYXTsKK307CisKKy8qIElOIDIuNS42PyBfX2tlcm5lbF9kZXZfdCBjaGFuZ2VkIHNpemUsIGFuZCBfX2tlcm5lbF9vbGRfZGV2X3Qgd2FzIGxlZnQKKyAqIHdpdGggdGhlIG9sZCB2YWx1ZS4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHVzZSB0aGUgcmlnaHQgb25lLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzApCisjIGRlZmluZSBfX25mc2RfZGV2X3QgIF9fa2VybmVsX29sZF9kZXZfdAorI2Vsc2UKKyMgZGVmaW5lIF9fbmZzZF9kZXZfdCAgX19rZXJuZWxfZGV2X3QKKyNlbmRpZgorCisvKiBFWFBPUlQvVU5FWFBPUlQgKi8KK3N0cnVjdCBuZnNjdGxfZXhwb3J0IHsKKwljaGFyCQkJZXhfY2xpZW50W05GU0NMTlRfSURNQVgrMV07CisJY2hhcgkJCWV4X3BhdGhbTkZTX01BWFBBVEhMRU4rMV07CisJX19uZnNkX2Rldl90CQlleF9kZXY7CisJX19rZXJuZWxfaW5vX3QJCWV4X2lubzsKKwlpbnQJCQlleF9mbGFnczsKKwlfX2tlcm5lbF91aWRfdAkJZXhfYW5vbl91aWQ7CisJX19rZXJuZWxfZ2lkX3QJCWV4X2Fub25fZ2lkOworfTsKKworLyogVUdJRFVQREFURSAqLworc3RydWN0IG5mc2N0bF91aWRtYXAgeworCWNoYXIgKgkJCXVnX2lkZW50OworCV9fa2VybmVsX3VpZF90CQl1Z191aWRiYXNlOworCWludAkJCXVnX3VpZGxlbjsKKwlfX2tlcm5lbF91aWRfdCAqCXVnX3VkaW1hcDsKKwlfX2tlcm5lbF9naWRfdAkJdWdfZ2lkYmFzZTsKKwlpbnQJCQl1Z19naWRsZW47CisJX19rZXJuZWxfZ2lkX3QgKgl1Z19nZGltYXA7Cit9OworCisvKiBHRVRGSCAqLworc3RydWN0IG5mc2N0bF9maHBhcm0geworCXN0cnVjdCBzb2NrYWRkcgkJZ2ZfYWRkcjsKKwlfX25mc2RfZGV2X3QJCWdmX2RldjsKKwlfX2tlcm5lbF9pbm9fdAkJZ2ZfaW5vOworCWludAkJCWdmX3ZlcnNpb247Cit9OworCisvKiBHRVRGRCAqLworc3RydWN0IG5mc2N0bF9mZHBhcm0geworCXN0cnVjdCBzb2NrYWRkcgkJZ2RfYWRkcjsKKwljaGFyCQkJZ2RfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKKwlpbnQJCQlnZF92ZXJzaW9uOworfTsKKworLyogR0VURlMgLSBHRVQgRmlsZWhhbmRsZSB3aXRoIFNpemUgKi8KK3N0cnVjdCBuZnNjdGxfZnNwYXJtIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJCWdkX2FkZHI7CisJY2hhcgkJCWdkX3BhdGhbTkZTX01BWFBBVEhMRU4rMV07CisJaW50CQkJZ2RfbWF4bGVuOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGFyZ3VtZW50IHVuaW9uLgorICovCitzdHJ1Y3QgbmZzY3RsX2FyZyB7CisJaW50CQkJY2FfdmVyc2lvbjsJLyogc2FmZWd1YXJkICovCisJdW5pb24geworCQlzdHJ1Y3QgbmZzY3RsX3N2Ywl1X3N2YzsKKwkJc3RydWN0IG5mc2N0bF9jbGllbnQJdV9jbGllbnQ7CisJCXN0cnVjdCBuZnNjdGxfZXhwb3J0CXVfZXhwb3J0OworCQlzdHJ1Y3QgbmZzY3RsX3VpZG1hcAl1X3VtYXA7CisJCXN0cnVjdCBuZnNjdGxfZmhwYXJtCXVfZ2V0Zmg7CisJCXN0cnVjdCBuZnNjdGxfZmRwYXJtCXVfZ2V0ZmQ7CisJCXN0cnVjdCBuZnNjdGxfZnNwYXJtCXVfZ2V0ZnM7CisJfSB1OworI2RlZmluZSBjYV9zdmMJCXUudV9zdmMKKyNkZWZpbmUgY2FfY2xpZW50CXUudV9jbGllbnQKKyNkZWZpbmUgY2FfZXhwb3J0CXUudV9leHBvcnQKKyNkZWZpbmUgY2FfdW1hcAkJdS51X3VtYXAKKyNkZWZpbmUgY2FfZ2V0ZmgJdS51X2dldGZoCisjZGVmaW5lIGNhX2dldGZkCXUudV9nZXRmZAorI2RlZmluZSBjYV9nZXRmcwl1LnVfZ2V0ZnMKKyNkZWZpbmUgY2FfYXV0aGQJdS51X2F1dGhkCit9OworCit1bmlvbiBuZnNjdGxfcmVzIHsKKwlzdHJ1Y3QgbmZzX2ZoX29sZAljcl9nZXRmaDsKKwlzdHJ1Y3QgbmZzX2ZoX2xlbgljcl9nZXRmczsKK307CisKKyNlbmRpZiAvKiBfTkZTX05GU19IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mc19tbnRlbnQuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzX21udGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMGRmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mc19tbnRlbnQuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogMjAwNi0wNi0wOCBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorICogLSBNb3ZlZCBjb2RlIHNuaXBwZXRzIGhlcmUgZnJvbSB1dGlsLWxpbnV4L21vdW50L215X21udGVudC5oCisgKi8KKworI2lmbmRlZiBfTkZTX01OVEVOVF9ICisjZGVmaW5lIF9ORlNfTU5URU5UX0gKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKworI2RlZmluZSBFUlJfTUFYIDUKKwordHlwZWRlZiBzdHJ1Y3QgbW50RklMRXN0cnVjdCB7CisJRklMRSAqbW50ZW50X2ZwOworCWNoYXIgKm1udGVudF9maWxlOworCWludCBtbnRlbnRfbGluZW5vOworCWludCBtbnRlbnRfZXJyczsKKwlpbnQgbW50ZW50X3NvZnRlcnJzOworfSBtbnRGSUxFOworCittbnRGSUxFICpuZnNfc2V0bW50ZW50IChjb25zdCBjaGFyICpmaWxlLCBjaGFyICptb2RlKTsKK3ZvaWQgbmZzX2VuZG1udGVudCAobW50RklMRSAqbWZwKTsKK2ludCBuZnNfYWRkbW50ZW50IChtbnRGSUxFICptZnAsIHN0cnVjdCBtbnRlbnQgKm1udCk7CitzdHJ1Y3QgbmZzX21udGVudCAqbXlfZ2V0bW50ZW50IChtbnRGSUxFICptZnApOworc3RydWN0IG1udGVudCAqbmZzX2dldG1udGVudCAobW50RklMRSAqbWZwKTsKKworI2VuZGlmIC8qIF9ORlNfTU5URU5UX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzX3BhdGhzLmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mc19wYXRocy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGFjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25mc19wYXRocy5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgX05GU19QQVRIU19ICisjZGVmaW5lIF9ORlNfUEFUSFNfSAorCisjaWZuZGVmIF9QQVRIX01PVU5URUQKKyNkZWZpbmUgX1BBVEhfTU9VTlRFRCAiL2V0Yy9mc3RhYiIKKyNlbmRpZgorI2RlZmluZSBNT1VOVEVEX0xPQ0sJX1BBVEhfTU9VTlRFRCAifiIKKyNkZWZpbmUgTU9VTlRFRF9URU1QCV9QQVRIX01PVU5URUQgIi50bXAiCisKKyNlbmRpZiAvKiBfTkZTX1BBVEhTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnNsaWIuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3YTMxZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzbGliLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBzdXBwb3J0L2luY2x1ZGUvbmZzbGliLmgKKyAqCisgKiBHZW5lcmFsIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBORlMgdXNlci1zcGFjZSBwcm9ncmFtcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBORlNMSUJfSAorI2RlZmluZSBORlNMSUJfSAorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxycGNzdmMvbmZzX3Byb3QuaD4KKyNpbmNsdWRlIDxuZnMvbmZzLmg+CisjaW5jbHVkZSAieGxvZy5oIgorCisjaWZuZGVmIF9QQVRIX0VYUE9SVFMKKyNkZWZpbmUgX1BBVEhfRVhQT1JUUwkJIi9ldGMvZXhwb3J0cyIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9JRE1BUERDT05GCisjZGVmaW5lIF9QQVRIX0lETUFQRENPTkYJIi9ldGMvaWRtYXBkLmNvbmYiCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfWFRBQgorI2RlZmluZSBfUEFUSF9YVEFCCQlORlNfU1RBVEVESVIgIi94dGFiIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX1hUQUJUTVAKKyNkZWZpbmUgX1BBVEhfWFRBQlRNUAkJTkZTX1NUQVRFRElSICIveHRhYi50bXAiCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfWFRBQkxDSworI2RlZmluZSBfUEFUSF9YVEFCTENLCQlORlNfU1RBVEVESVIgIi8ueHRhYi5sb2NrIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX0VUQUIKKyNkZWZpbmUgX1BBVEhfRVRBQgkJTkZTX1NUQVRFRElSICIvZXRhYiIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9FVEFCVE1QCisjZGVmaW5lIF9QQVRIX0VUQUJUTVAJCU5GU19TVEFURURJUiAiL2V0YWIudG1wIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX0VUQUJMQ0sKKyNkZWZpbmUgX1BBVEhfRVRBQkxDSwkJTkZTX1NUQVRFRElSICIvLmV0YWIubG9jayIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9STVRBQgorI2RlZmluZSBfUEFUSF9STVRBQgkJTkZTX1NUQVRFRElSICIvcm10YWIiCisjZW5kaWYKKyNpZm5kZWYgX1BBVEhfUk1UQUJUTVAKKyNkZWZpbmUgX1BBVEhfUk1UQUJUTVAJCV9QQVRIX1JNVEFCICIudG1wIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX1JNVEFCTENLCisjZGVmaW5lIF9QQVRIX1JNVEFCTENLCQlORlNfU1RBVEVESVIgIi8ucm10YWIubG9jayIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9QUk9DX0VYUE9SVFMKKyNkZWZpbmUJX1BBVEhfUFJPQ19FWFBPUlRTCSIvcHJvYy9mcy9uZnMvZXhwb3J0cyIKKyNkZWZpbmUJX1BBVEhfUFJPQ19FWFBPUlRTX0FMVAkiL3Byb2MvZnMvbmZzZC9leHBvcnRzIgorI2VuZGlmCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHNlY3VyaXR5IGZsYXZvcnMgb24gYW4gZXhwb3J0OiAqLworI2RlZmluZSBTRUNGTEFWT1JfQ09VTlQgOAorCitzdHJ1Y3Qgc2VjX2VudHJ5IHsKKwlzdHJ1Y3QgZmxhdl9pbmZvICpmbGF2OworCWludCBmbGFnczsKK307CisKKy8qCisgKiBEYXRhIHJlbGF0ZWQgdG8gYSBzaW5nbGUgZXhwb3J0cyBlbnRyeSBhcyByZXR1cm5lZCBieSBnZXRleHBvcnRlbnQuCisgKiBGSVhNRTogZXhwb3J0IG9wdGlvbnMgc2hvdWxkIHByb2JhYmx5IGJlIHBhcnNlZCBhdCBhIGxhdGVyIHRpbWUgdG8KKyAqIGFsbG93IG92ZXJyaWRlcyB3aGVuIHVzaW5nIGV4cG9ydGZzLgorICovCitzdHJ1Y3QgZXhwb3J0ZW50IHsKKwljaGFyICoJCWVfaG9zdG5hbWU7CisJY2hhcgkJZV9wYXRoW05GU19NQVhQQVRITEVOKzFdOworCWludAkJZV9mbGFnczsKKwlpbnQJCWVfYW5vbnVpZDsKKwlpbnQJCWVfYW5vbmdpZDsKKwlpbnQgKgkJZV9zcXVpZHM7CisJaW50CQllX25zcXVpZHM7CisJaW50ICoJCWVfc3FnaWRzOworCWludAkJZV9uc3FnaWRzOworCWludAkJZV9mc2lkOworCWNoYXIgKgkJZV9tb3VudHBvaW50OworCWludCAgICAgICAgICAgICBlX2ZzbG9jbWV0aG9kOworCWNoYXIgKiAgICAgICAgICBlX2ZzbG9jZGF0YTsKKwljaGFyICoJCWVfdXVpZDsKKwlzdHJ1Y3Qgc2VjX2VudHJ5IGVfc2VjaW5mb1tTRUNGTEFWT1JfQ09VTlQrMV07Cit9OworCitzdHJ1Y3Qgcm10YWJlbnQgeworCWNoYXIJCXJfY2xpZW50W05GU0NMTlRfSURNQVgrMV07CisJY2hhcgkJcl9wYXRoW05GU19NQVhQQVRITEVOKzFdOworCWludAkJcl9jb3VudDsKK307CisKKy8qCisgKiBjb25maWd1cmF0aW9uIGZpbGUgcGFyc2luZworICovCit2b2lkCQkJc2V0ZXhwb3J0ZW50KGNoYXIgKmZuYW1lLCBjaGFyICp0eXBlKTsKK3N0cnVjdCBleHBvcnRlbnQgKglnZXRleHBvcnRlbnQoaW50LGludCk7Cit2b2lkIAkJCXNlY2luZm9fc2hvdyhGSUxFICpmcCwgc3RydWN0IGV4cG9ydGVudCAqZXApOwordm9pZAkJCXB1dGV4cG9ydGVudChzdHJ1Y3QgZXhwb3J0ZW50ICp4ZXApOwordm9pZAkJCWVuZGV4cG9ydGVudCh2b2lkKTsKK3N0cnVjdCBleHBvcnRlbnQgKglta2V4cG9ydGVudChjaGFyICpobmFtZSwgY2hhciAqcGF0aCwgY2hhciAqb3B0cyk7Cit2b2lkCQkJZHVwZXhwb3J0ZW50KHN0cnVjdCBleHBvcnRlbnQgKmRzdCwKKwkJCQkJc3RydWN0IGV4cG9ydGVudCAqc3JjKTsKK2ludAkJCXVwZGF0ZWV4cG9ydGVudChzdHJ1Y3QgZXhwb3J0ZW50ICplZXAsIGNoYXIgKm9wdGlvbnMpOworCitpbnQJCQlzZXRybXRhYmVudChjaGFyICp0eXBlKTsKK3N0cnVjdCBybXRhYmVudCAqCWdldHJtdGFiZW50KGludCBsb2csIGxvbmcgKnBvcyk7Cit2b2lkCQkJcHV0cm10YWJlbnQoc3RydWN0IHJtdGFiZW50ICp4ZXAsIGxvbmcgKnBvcyk7Cit2b2lkCQkJZW5kcm10YWJlbnQodm9pZCk7Cit2b2lkCQkJcmV3aW5kcm10YWJlbnQodm9pZCk7CitGSUxFICoJCQlmc2V0cm10YWJlbnQoY2hhciAqZm5hbWUsIGNoYXIgKnR5cGUpOworc3RydWN0IHJtdGFiZW50ICoJZmdldHJtdGFiZW50KEZJTEUgKmZwLCBpbnQgbG9nLCBsb25nICpwb3MpOwordm9pZAkJCWZwdXRybXRhYmVudChGSUxFICpmcCwgc3RydWN0IHJtdGFiZW50ICp4ZXAsIGxvbmcgKnBvcyk7Cit2b2lkCQkJZmVuZHJtdGFiZW50KEZJTEUgKmZwKTsKK3ZvaWQJCQlmcmV3aW5kcm10YWJlbnQoRklMRSAqZnApOworCisvKgorICogd2lsZG1hdCBib3Jyb3dlZCBmcm9tIElOTgorICovCitpbnQJCQl3aWxkbWF0KGNoYXIgKnRleHQsIGNoYXIgKnBhdHRlcm4pOworCisvKgorICogbmZzZCBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAqLworaW50CQkJbmZzY3RsKGludCwgc3RydWN0IG5mc2N0bF9hcmcgKiwgdW5pb24gbmZzY3RsX3JlcyAqKTsKK2ludAkJCW5mc2FkZGNsaWVudChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqY2xwKTsKK2ludAkJCW5mc2RlbGNsaWVudChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqY2xwKTsKK2ludAkJCW5mc2V4cG9ydChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZXhwKTsKK2ludAkJCW5mc3VuZXhwb3J0KHN0cnVjdCBuZnNjdGxfZXhwb3J0ICpleHApOworc3RydWN0IG5mc19maF9sZW4gKglnZXRmaF9vbGQoc3RydWN0IHNvY2thZGRyICphZGRyLCBkZXZfdCBkZXYsIGlub190IGlubyk7CitzdHJ1Y3QgbmZzX2ZoX2xlbiAqCWdldGZoKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgY29uc3QgY2hhciAqKTsKK3N0cnVjdCBuZnNfZmhfbGVuICoJZ2V0Zmhfc2l6ZShzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGNvbnN0IGNoYXIgKiwgaW50IHNpemUpOworCit2b2lkIHF3b3JkX3ByaW50KEZJTEUgKmYsIGNoYXIgKnN0cik7Cit2b2lkIHF3b3JkX3ByaW50aGV4KEZJTEUgKmYsIGNoYXIgKnN0ciwgaW50IHNsZW4pOwordm9pZCBxd29yZF9wcmludGludChGSUxFICpmLCBpbnQgbnVtKTsKK2ludCBxd29yZF9lb2woRklMRSAqZik7CitpbnQgcmVhZGxpbmUoaW50IGZkLCBjaGFyICoqYnVmLCBpbnQgKmxlbnApOworaW50IHF3b3JkX2dldChjaGFyICoqYnBwLCBjaGFyICpkZXN0LCBpbnQgYnVmc2l6ZSk7CitpbnQgcXdvcmRfZ2V0X2ludChjaGFyICoqYnBwLCBpbnQgKmFuaW50KTsKK3ZvaWQgY2FjaGVfZmx1c2goaW50IGZvcmNlKTsKK2ludCBjaGVja19uZXdfY2FjaGUodm9pZCk7Cit2b2lkIHF3b3JkX2FkZChjaGFyICoqYnBwLCBpbnQgKmxwLCBjaGFyICpzdHIpOwordm9pZCBxd29yZF9hZGRoZXgoY2hhciAqKmJwcCwgaW50ICpscCwgY2hhciAqYnVmLCBpbnQgYmxlbik7Cit2b2lkIHF3b3JkX2FkZGludChjaGFyICoqYnBwLCBpbnQgKmxwLCBpbnQgbik7Cit2b2lkIHF3b3JkX2FkZHVpbnQoY2hhciAqKmJwcCwgaW50ICpscCwgdW5zaWduZWQgaW50IG4pOwordm9pZCBxd29yZF9hZGRlb2woY2hhciAqKmJwcCwgaW50ICpscCk7CisKK3ZvaWQgY2xvc2VhbGwoaW50IG1pbik7CisKK2ludAkJCXN2Y3RjcF9zb2NrZXQgKHVfbG9uZyBfX251bWJlciwgaW50IF9fcmV1c2UpOworaW50CQkJc3ZjdWRwX3NvY2tldCAodV9sb25nIF9fbnVtYmVyLCBpbnQgX19yZXVzZSk7CisKKyNlbmRpZiAvKiBORlNMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9uZnNycGMuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzcnBjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiMzVhYgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmZzcnBjLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBuZnNycGMuaCAtLSBSUEMgY2xpZW50IEFQSXMgcHJvdmlkZWQgYnkgc3VwcG9ydC9uZnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX19ORlNfVVRJTFNfTkZTUlBDX0gKKyNkZWZpbmUgX19ORlNfVVRJTFNfTkZTUlBDX0gKKworI2luY2x1ZGUgPHJwYy90eXBlcy5oPgorI2luY2x1ZGUgPHJwYy9jbG50Lmg+CisKKy8qCisgKiBDb252ZW50aW9uYWwgUlBDIHByb2dyYW0gbnVtYmVycworICovCisjaWZuZGVmIFJQQ0JQUk9HCisjZGVmaW5lIFJQQ0JQUk9HCSgocnBjcHJvZ190KTEwMDAwMCkKKyNlbmRpZgorI2lmbmRlZiBQTUFQUFJPRworI2RlZmluZSBQTUFQUFJPRwkoKHJwY3Byb2dfdCkxMDAwMDApCisjZW5kaWYKKworI2lmbmRlZiBORlNQUk9HCisjZGVmaW5lIE5GU1BST0cJCSgocnBjcHJvZ190KTEwMDAwMykKKyNlbmRpZgorI2lmbmRlZiBNT1VOVFBST0cKKyNkZWZpbmUgTU9VTlRQUk9HCSgocnBjcHJvZ190KTEwMDAwNSkKKyNlbmRpZgorI2lmbmRlZiBOTE1QUk9HCisjZGVmaW5lIE5MTVBST0cJCSgocnBjcHJvZ190KTEwMDAyMSkKKyNlbmRpZgorI2lmbmRlZiBOU01QUk9HCisjZGVmaW5lIE5TTVBST0cJCSgocnBjcHJvZ190KTEwMDAyNCkKKyNlbmRpZgorCisvKioKKyAqIG5mc19jbGVhcl9ycGNfY3JlYXRlZXJyIC0gemFwIGFsbCBlcnJvciByZXBvcnRpbmcgZmllbGRzCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIodm9pZCkKK3sKKwltZW1zZXQoJnJwY19jcmVhdGVlcnIsIDAsIHNpemVvZihycGNfY3JlYXRlZXJyKSk7Cit9CisKKy8qCisgKiBMb29rIHVwIGFuIFJQQyBwcm9ncmFtIG5hbWUgaW4gL2V0Yy9ycGMKKyAqLworZXh0ZXJuIHJwY3Byb2dfdAluZnNfZ2V0cnBjYnluYW1lKGNvbnN0IHJwY3Byb2dfdCwgY29uc3QgY2hhciAqdGFibGVbXSk7CisKKy8qCisgKiBBY3F1aXJlIGFuIFJQQyBDTElFTlQgKiB3aXRoIGFuIGVwaGVtZXJhbCBzb3VyY2UgcG9ydAorICovCitleHRlcm4gQ0xJRU5UCQkqbmZzX2dldF9ycGNjbGllbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICosCisJCQkJY29uc3Qgc29ja2xlbl90LCBjb25zdCB1bnNpZ25lZCBzaG9ydCwKKwkJCQljb25zdCBycGNwcm9nX3QsIGNvbnN0IHJwY3ZlcnNfdCwKKwkJCQlzdHJ1Y3QgdGltZXZhbCAqKTsKKworLyoKKyAqIEFjcXVpcmUgYW4gUlBDIENMSUVOVCAqIHdpdGggYSBwcml2aWxlZ2VkIHNvdXJjZSBwb3J0CisgKi8KK2V4dGVybiBDTElFTlQJCSpuZnNfZ2V0X3ByaXZfcnBjY2xpZW50KCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwKKwkJCQljb25zdCBzb2NrbGVuX3QsIGNvbnN0IHVuc2lnbmVkIHNob3J0LAorCQkJCWNvbnN0IHJwY3Byb2dfdCwgY29uc3QgcnBjdmVyc190LAorCQkJCXN0cnVjdCB0aW1ldmFsICopOworCisvKgorICogQ29udmVydCBhIG5ldGlkIHRvIGEgcHJvdG9jb2wgbnVtYmVyIGFuZCBwcm90b2NvbCBmYW1pbHkKKyAqLworZXh0ZXJuIGludAkJbmZzX2dldF9wcm90byhjb25zdCBjaGFyICpuZXRpZCwgc2FfZmFtaWx5X3QgKmZhbWlseSwKKwkJCQl1bnNpZ25lZCBsb25nICpwcm90b2NvbCk7CisKKy8qCisgKiBDb252ZXJ0IGEgcHJvdG9jb2wgZmFtaWx5IGFuZCBwcm90b2NvbCBuYW1lIHRvIGEgbmV0aWQKKyAqLworZXh0ZXJuIGNoYXIJCSpuZnNfZ2V0X25ldGlkKGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSwKKwkJCQljb25zdCB1bnNpZ25lZCBsb25nIHByb3RvY29sKTsKKworLyoKKyAqIENvbnZlcnQgYSBzb2NrZXQgYWRkcmVzcyB0byBhIHVuaXZlcnNhbCBhZGRyZXNzCisgKi8KK2V4dGVybiBjaGFyCQkqbmZzX3NvY2thZGRyMnVuaXZlcnNhbChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKik7CisKKy8qCisgKiBFeHRyYWN0IHBvcnQgbnVtYmVyIGZyb20gYSB1bml2ZXJzYWwgYWRkcmVzcworICovCitleHRlcm4gaW50CQluZnNfdW5pdmVyc2FsMnBvcnQoY29uc3QgY2hhciAqKTsKKworLyoKKyAqIEdlbmVyaWMgZnVuY3Rpb24gdGhhdCBtYXBzIGFuIFJQQyBzZXJ2aWNlIHR1cGxlIHRvIGFuIElQIHBvcnQKKyAqIG51bWJlciBvZiB0aGUgc2VydmljZSBvbiBhIHJlbW90ZSBwb3N0LCBhbmQgc2VuZHMgYSBOVUxMCisgKiByZXF1ZXN0IHRvIGRldGVybWluZSBpZiB0aGUgc2VydmljZSBpcyByZXNwb25kaW5nIHRvIHJlcXVlc3RzCisgKi8KK2V4dGVybiBpbnQJCW5mc19nZXRwb3J0X3Bpbmcoc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJCWNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJCWNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sKTsKKworLyoKKyAqIEdlbmVyaWMgZnVuY3Rpb24gdGhhdCBtYXBzIGFuIFJQQyBzZXJ2aWNlIHR1cGxlIHRvIGFuIElQIHBvcnQKKyAqIG51bWJlciBvZiB0aGUgc2VydmljZSBvbiBhIHJlbW90ZSBob3N0CisgKi8KK2V4dGVybiB1bnNpZ25lZCBzaG9ydAluZnNfZ2V0cG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwKKwkJCQljb25zdCBzb2NrbGVuX3QsIGNvbnN0IHJwY3Byb2dfdCwKKwkJCQljb25zdCBycGN2ZXJzX3QsIGNvbnN0IHVuc2lnbmVkIHNob3J0KTsKKworLyoKKyAqIEdlbmVyaWMgZnVuY3Rpb24gdGhhdCBtYXBzIGFuIFJQQyBzZXJ2aWNlIHR1cGxlIHRvIGFuIElQIHBvcnQKKyAqIG51bWJlciBvZiB0aGUgc2VydmljZSBvbiB0aGUgbG9jYWwgaG9zdAorICovCitleHRlcm4gdW5zaWduZWQgc2hvcnQJbmZzX2dldGxvY2FscG9ydChjb25zdCBycGNwcm90X3QsCisJCQkJY29uc3QgcnBjdmVyc190LCBjb25zdCB1bnNpZ25lZCBzaG9ydCk7CisKKy8qCisgKiBGdW5jdGlvbiB0byBpbnZva2UgYW4gcnBjYmluZCB2My92NCBHRVRBRERSIHJlcXVlc3QKKyAqLworZXh0ZXJuIHVuc2lnbmVkIHNob3J0CW5mc19ycGNiX2dldGFkZHIoY29uc3Qgc3RydWN0IHNvY2thZGRyICosCisJCQkJY29uc3Qgc29ja2xlbl90LAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0LAorCQkJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLAorCQkJCWNvbnN0IHJwY3Byb2dfdCwKKwkJCQljb25zdCBycGN2ZXJzX3QsCisJCQkJY29uc3QgdW5zaWduZWQgc2hvcnQsCisJCQkJY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7CisKKy8qCisgKiBGdW5jdGlvbiB0byBpbnZva2UgYSBwb3J0bWFwIEdFVFBPUlQgcmVxdWVzdAorICovCitleHRlcm4gdW5zaWduZWQgbG9uZwluZnNfcG1hcF9nZXRwb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqLAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0LAorCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcsCisJCQkJY29uc3QgdW5zaWduZWQgbG9uZywKKwkJCQljb25zdCB1bnNpZ25lZCBsb25nLAorCQkJCWNvbnN0IHN0cnVjdCB0aW1ldmFsICopOworCisvKgorICogQ29udGFjdCBhIHJlbW90ZSBSUEMgc2VydmljZSB0byBkaXNjb3ZlciB3aGV0aGVyIGl0IGlzIHJlc3BvbmRpbmcKKyAqIHRvIHJlcXVlc3RzLgorICovCitleHRlcm4gaW50CQluZnNfcnBjX3BpbmcoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJCWNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJCWNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJCWNvbnN0IHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KTsKKworI2VuZGlmCS8qICFfX05GU19VVElMU19ORlNSUENfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9ubHMuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5ZThkNwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbmxzLmgKQEAgLTAsMCArMSwyNyBAQAorLyogCisgKiAyMDA2LTA2LTA4IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CisgKiAtIENvcGllZCB0byBuZnMtdXRpbHMvc3VwcG9ydC9pbmNsdWRlIGZyb20gdXRpbC1saW51eC9tb3VudAorICovCisKKyNpZm5kZWYgTE9DQUxFRElSCisjZGVmaW5lIExPQ0FMRURJUiAiL3Vzci9zaGFyZS9sb2NhbGUiCisjZW5kaWYKKworI2lmZGVmIEVOQUJMRV9OTFMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorIyBkZWZpbmUgXyhUZXh0KSBnZXR0ZXh0IChUZXh0KQorIyBpZmRlZiBnZXR0ZXh0X25vb3AKKyMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQorIyBlbHNlCisjICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQorIyBlbmRpZgorI2Vsc2UKKyMgdW5kZWYgYmluZHRleHRkb21haW4KKyMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbiwgRGlyZWN0b3J5KSAvKiBlbXB0eSAqLworIyB1bmRlZiB0ZXh0ZG9tYWluCisjIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbikgLyogZW1wdHkgKi8KKyMgZGVmaW5lIF8oVGV4dCkgKFRleHQpCisjIGRlZmluZSBOXyhUZXh0KSAoVGV4dCkKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvbnNtLmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25zbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNGQ4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL25zbS5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5mcy11dGlscy4KKyAqCisgKiBuZnMtdXRpbHMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5mcy11dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggbmZzLXV0aWxzLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKyNpZm5kZWYgTkZTX1VUSUxTX1NVUFBPUlRfTlNNX0gKKyNkZWZpbmUgTkZTX1VUSUxTX1NVUFBPUlRfTlNNX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInNtX2ludGVyLmgiCisKK3R5cGVkZWYgdW5zaWduZWQgaW50CisJCSgqbnNtX3BvcHVsYXRlX3QpKGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCWNvbnN0IHN0cnVjdCBtb24gKm1vbiwKKwkJCQljb25zdCB0aW1lX3QgdGltZXN0YW1wKTsKKworLyogZmlsZS5jICovCisKK2V4dGVybiBfQm9vbAluc21fc2V0dXBfcGF0aG5hbWVzKGNvbnN0IGNoYXIgKnByb2duYW1lLAorCQkJCWNvbnN0IGNoYXIgKnBhcmVudGRpcik7CitleHRlcm4gX0Jvb2wJbnNtX2lzX2RlZmF1bHRfcGFyZW50ZGlyKHZvaWQpOworZXh0ZXJuIF9Cb29sCW5zbV9kcm9wX3ByaXZpbGVnZXMoY29uc3QgaW50IHBpZGZkKTsKKworZXh0ZXJuIGludAluc21fZ2V0X3N0YXRlKF9Cb29sIHVwZGF0ZSk7CitleHRlcm4gdm9pZAluc21fdXBkYXRlX2tlcm5lbF9zdGF0ZShjb25zdCBpbnQgc3RhdGUpOworCitleHRlcm4gdW5zaWduZWQgaW50CisJCW5zbV9yZXRpcmVfbW9uaXRvcmVkX2hvc3RzKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGludAorCQluc21fbG9hZF9tb25pdG9yX2xpc3QobnNtX3BvcHVsYXRlX3QgZnVuYyk7CitleHRlcm4gdW5zaWduZWQgaW50CisJCW5zbV9sb2FkX25vdGlmeV9saXN0KG5zbV9wb3B1bGF0ZV90IGZ1bmMpOworCitleHRlcm4gX0Jvb2wJbnNtX2luc2VydF9tb25pdG9yZWRfaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCBzdHJ1Y3QgbW9uICptKTsKK2V4dGVybiB2b2lkCW5zbV9kZWxldGVfbW9uaXRvcmVkX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCQljb25zdCBjaGFyICptb25fbmFtZSwgY29uc3QgY2hhciAqbXlfbmFtZSk7CitleHRlcm4gdm9pZAluc21fZGVsZXRlX25vdGlmaWVkX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCQljb25zdCBjaGFyICptb25fbmFtZSwgY29uc3QgY2hhciAqbXlfbmFtZSk7CitleHRlcm4gc2l6ZV90CW5zbV9wcml2X3RvX2hleChjb25zdCBjaGFyICpwcml2LCBjaGFyICpidWYsCisJCQkJY29uc3Qgc2l6ZV90IGJ1Zmxlbik7CisKKy8qIHJwYy5jICovCisKKyNkZWZpbmUgTlNNX01BWE1TR1NJWkUJKDIwNDh1KQorCitleHRlcm4gdWludDMyX3QgbnNtX3htaXRfZ2V0cG9ydChjb25zdCBpbnQgc29jaywKKwkJCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLAorCQkJY29uc3QgdW5zaWduZWQgbG9uZyBwcm9ncmFtLAorCQkJY29uc3QgdW5zaWduZWQgbG9uZyB2ZXJzaW9uKTsKK2V4dGVybiB1aW50MzJfdCBuc21feG1pdF9nZXRhZGRyKGNvbnN0IGludCBzb2NrLAorCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiwKKwkJCWNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLCBjb25zdCBycGN2ZXJzX3QgdmVyc2lvbik7CitleHRlcm4gdWludDMyX3QgbnNtX3htaXRfcnBjYmluZChjb25zdCBpbnQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQljb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwgY29uc3QgcnBjdmVyc190IHZlcnNpb24pOworZXh0ZXJuIHVpbnQzMl90IG5zbV94bWl0X25vdGlmeShjb25zdCBpbnQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQljb25zdCBzb2NrbGVuX3Qgc2FsZW4sIGNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJY29uc3QgY2hhciAqbW9uX25hbWUsIGNvbnN0IGludCBzdGF0ZSk7CitleHRlcm4gdWludDMyX3QgbnNtX3htaXRfbmxtY2FsbChjb25zdCBpbnQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQljb25zdCBzb2NrbGVuX3Qgc2FsZW4sIGNvbnN0IHN0cnVjdCBtb24gKm0sCisJCQljb25zdCBpbnQgc3RhdGUpOworZXh0ZXJuIHVpbnQzMl90IG5zbV9wYXJzZV9yZXBseShYRFIgKnhkcnMpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcKKwkJbnNtX3JlY3ZfZ2V0cG9ydChYRFIgKnhkcnMpOworZXh0ZXJuIHVpbnQxNl90IG5zbV9yZWN2X2dldGFkZHIoWERSICp4ZHJzKTsKK2V4dGVybiB1aW50MTZfdCBuc21fcmVjdl9ycGNiaW5kKGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSwgWERSICp4ZHJzKTsKKworI2VuZGlmCS8qICFORlNfVVRJTFNfU1VQUE9SVF9OU01fSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9wc2V1ZG9mbGF2b3JzLmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3BzZXVkb2ZsYXZvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjEwODdiCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9wc2V1ZG9mbGF2b3JzLmgKQEAgLTAsMCArMSwxNyBAQAorI2RlZmluZSBSUENfQVVUSF9HU1NfS1JCNSAgICAgICAzOTAwMDMKKyNkZWZpbmUgUlBDX0FVVEhfR1NTX0tSQjVJICAgICAgMzkwMDA0CisjZGVmaW5lIFJQQ19BVVRIX0dTU19LUkI1UCAgICAgIDM5MDAwNQorI2RlZmluZSBSUENfQVVUSF9HU1NfTEtFWSAgICAgICAzOTAwMDYKKyNkZWZpbmUgUlBDX0FVVEhfR1NTX0xLRVlJICAgICAgMzkwMDA3CisjZGVmaW5lIFJQQ19BVVRIX0dTU19MS0VZUCAgICAgIDM5MDAwOAorI2RlZmluZSBSUENfQVVUSF9HU1NfU1BLTSAgICAgICAzOTAwMDkKKyNkZWZpbmUgUlBDX0FVVEhfR1NTX1NQS01JICAgICAgMzkwMDEwCisjZGVmaW5lIFJQQ19BVVRIX0dTU19TUEtNUCAgICAgIDM5MDAxMQorCitzdHJ1Y3QgZmxhdl9pbmZvIHsKKwljaGFyICAgICpmbGF2b3VyOworCWludCAgICAgZm51bTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZmxhdl9pbmZvIGZsYXZfbWFwW107CitleHRlcm4gY29uc3QgaW50IGZsYXZfbWFwX3NpemU7CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3JwY21pc2MuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvcnBjbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOGY0MTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3JwY21pc2MuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogcnBjbWlzYwlTdXBwb3J0IGZvciBSUEMgc3RhcnR1cCwgZGlzcGF0Y2hpbmcgYW5kIGxvZ2dpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgUlBDTUlTQ19ICisjZGVmaW5lIFJQQ01JU0NfSAorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwYy9wbWFwX2NsbnQuaD4KKworI2lmZGVmIF9fU1REQ19fCisjICAgZGVmaW5lIENPTkNBVChhLGIpCQlhIyNiCisjICAgZGVmaW5lIFNUUklORyhhKQkJI2EKKyNlbHNlCisjICAgZGVmaW5lIENPTkNBVChhLGIpCQlhLyoqL2IKKyMgICBkZWZpbmUgU1RSSU5HKGEpCQkiYSIKKyNlbmRpZgorCit0eXBlZGVmIGJvb2xfdAkoKnJwY3N2Y19mbl90KShzdHJ1Y3Qgc3ZjX3JlcSAqLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKTsKKworc3RydWN0IHJwY19kZW50cnkgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJcnBjc3ZjX2ZuX3QJZnVuYzsKKwl4ZHJwcm9jX3QJeGRyX2FyZ19mbjsJCS8qIGFyZ3VtZW50IFhEUiAqLworCXNpemVfdAkJeGRyX2FyZ19zaXplOworCXhkcnByb2NfdAl4ZHJfcmVzX2ZuOwkJLyogcmVzdWx0IFhEUiAqLworCXNpemVfdAkJeGRyX3Jlc19zaXplOworfTsKKworc3RydWN0IHJwY19kdGFibGUgeworCXN0cnVjdCBycGNfZGVudHJ5ICplbnRyaWVzOworCWludAkJbnByb2M7Cit9OworCisjZGVmaW5lIGR0YWJsZV9lbnQoZnVuYywgdmVycywgYXJnX3R5cGUsIHJlc190eXBlKSBcCisJewlTVFJJTkcoZnVuYyksIFwKKwkJKHJwY3N2Y19mbl90KWZ1bmMjI18jI3ZlcnMjI19zdmMsIFwKKwkJKHhkcnByb2NfdCl4ZHJfIyNhcmdfdHlwZSwgc2l6ZW9mKGFyZ190eXBlKSwgXAorCQkoeGRycHJvY190KXhkcl8jI3Jlc190eXBlLCBzaXplb2YocmVzX3R5cGUpLCBcCisJfQorCit2b2lkCQluZnNfc3ZjX3VucmVnaXN0ZXIoY29uc3QgcnBjcHJvZ190IHByb2dyYW0sCisJCQkJY29uc3QgcnBjdmVyc190IHZlcnNpb24pOwordW5zaWduZWQgaW50CW5mc19zdmNfY3JlYXRlKGNoYXIgKm5hbWUsIGNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJCWNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCXZvaWQgKCpkaXNwYXRjaCkoc3RydWN0IHN2Y19yZXEgKiwgU1ZDWFBSVCAqKSwKKwkJCQljb25zdCB1aW50MTZfdCBwb3J0KTsKK3ZvaWQJCXJwY19pbml0KGNoYXIgKm5hbWUsIGludCBwcm9nLCBpbnQgdmVycywKKwkJCQl2b2lkICgqZGlzcGF0Y2gpKHN0cnVjdCBzdmNfcmVxICosIFNWQ1hQUlQgKiksCisJCQkJaW50IGRlZnBvcnQpOwordm9pZAkJcnBjX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcmVxICpycSwgU1ZDWFBSVCAqeHBydCwKKwkJCQlzdHJ1Y3QgcnBjX2R0YWJsZSAqZHRhYmxlLCBpbnQgbnZlcnMsCisJCQkJdm9pZCAqYXJncCwgdm9pZCAqcmVzcCk7CisKK2V4dGVybiBpbnQJX3JwY3Btc3RhcnQ7CitleHRlcm4gaW50CV9ycGNmZHR5cGU7CitleHRlcm4gaW50CV9ycGNzdmNkaXJ0eTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29ja2FkZHJfaW4gKm5mc19nZXRycGNjYWxsZXJfaW4oU1ZDWFBSVCAqeHBydCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXN2Y19nZXRjYWxsZXIoeHBydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2thZGRyICpuZnNfZ2V0cnBjY2FsbGVyKFNWQ1hQUlQgKnhwcnQpCit7CisJcmV0dXJuIChzdHJ1Y3Qgc29ja2FkZHIgKilzdmNfZ2V0Y2FsbGVyKHhwcnQpOworfQorCisjZW5kaWYgLyogUlBDTUlTQ19IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3JwY3N2Yy9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvcnBjc3ZjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmJmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3JwY3N2Yy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitub2luc3RfSEVBREVSUyA9IG5mc19wcm90LmgKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9ycGNzdmMvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3JwY3N2Yy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTMyNzQwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9ycGNzdmMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0NjQgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IHN1cHBvcnQvaW5jbHVkZS9ycGNzdmMKK0RJU1RfQ09NTU9OID0gJChub2luc3RfSEVBREVSUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorSEVBREVSUyA9ICQobm9pbnN0X0hFQURFUlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbm9pbnN0X0hFQURFUlMgPSBuZnNfcHJvdC5oCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBzdXBwb3J0L2luY2x1ZGUvcnBjc3ZjL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvaW5jbHVkZS9ycGNzdmMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoSEVBREVSUykKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCBcCisJdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9ycGNzdmMvbmZzX3Byb3QuaCBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxMTM0MQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvcnBjc3ZjL25mc19wcm90LmgKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLgorICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uCisgKi8KKworI2lmbmRlZiBfTkZTX1BST1RfSF9SUENHRU4KKyNkZWZpbmUgX05GU19QUk9UX0hfUlBDR0VOCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKyNkZWZpbmUgTkZTX1BPUlQgMjA0OQorI2RlZmluZSBORlNfTUFYREFUQSA4MTkyCisjZGVmaW5lIE5GU19NQVhQQVRITEVOIDEwMjQKKyNkZWZpbmUgTkZTX01BWE5BTUxFTiAyNTUKKyNkZWZpbmUgTkZTX0ZIU0laRSAzMgorI2RlZmluZSBORlNfQ09PS0lFU0laRSA0CisjZGVmaW5lIE5GU19GSUZPX0RFViAtMQorI2RlZmluZSBORlNNT0RFX0ZNVCAwMTcwMDAwCisjZGVmaW5lIE5GU01PREVfRElSIDAwNDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9DSFIgMDAyMDAwMAorI2RlZmluZSBORlNNT0RFX0JMSyAwMDYwMDAwCisjZGVmaW5lIE5GU01PREVfUkVHIDAxMDAwMDAKKyNkZWZpbmUgTkZTTU9ERV9MTksgMDEyMDAwMAorI2RlZmluZSBORlNNT0RFX1NPQ0sgMDE0MDAwMAorI2RlZmluZSBORlNNT0RFX0ZJRk8gMDAxMDAwMAorCitlbnVtIG5mc3N0YXQgeworCU5GU19PSyA9IDAsCisJTkZTRVJSX1BFUk0gPSAxLAorCU5GU0VSUl9OT0VOVCA9IDIsCisJTkZTRVJSX0lPID0gNSwKKwlORlNFUlJfTlhJTyA9IDYsCisJTkZTRVJSX0FDQ0VTID0gMTMsCisJTkZTRVJSX0VYSVNUID0gMTcsCisJTkZTRVJSX05PREVWID0gMTksCisJTkZTRVJSX05PVERJUiA9IDIwLAorCU5GU0VSUl9JU0RJUiA9IDIxLAorCU5GU0VSUl9GQklHID0gMjcsCisJTkZTRVJSX05PU1BDID0gMjgsCisJTkZTRVJSX1JPRlMgPSAzMCwKKwlORlNFUlJfTkFNRVRPT0xPTkcgPSA2MywKKwlORlNFUlJfTk9URU1QVFkgPSA2NiwKKwlORlNFUlJfRFFVT1QgPSA2OSwKKwlORlNFUlJfU1RBTEUgPSA3MCwKKwlORlNFUlJfV0ZMVVNIID0gOTksCit9OwordHlwZWRlZiBlbnVtIG5mc3N0YXQgbmZzc3RhdDsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9uZnNzdGF0KFhEUiAqLCBuZnNzdGF0Kik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9uZnNzdGF0KFhEUiAqLCBuZnNzdGF0Kik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfbmZzc3RhdCgpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKK2VudW0gZnR5cGUgeworCU5GTk9OID0gMCwKKwlORlJFRyA9IDEsCisJTkZESVIgPSAyLAorCU5GQkxLID0gMywKKwlORkNIUiA9IDQsCisJTkZMTksgPSA1LAorCU5GU09DSyA9IDYsCisJTkZCQUQgPSA3LAorCU5GRklGTyA9IDgsCit9OwordHlwZWRlZiBlbnVtIGZ0eXBlIGZ0eXBlOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2Z0eXBlKFhEUiAqLCBmdHlwZSopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfZnR5cGUoWERSICosIGZ0eXBlKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfZnR5cGUoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgbmZzX2ZoIHsKKwljaGFyIGRhdGFbTkZTX0ZIU0laRV07Cit9OwordHlwZWRlZiBzdHJ1Y3QgbmZzX2ZoIG5mc19maDsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9uZnNfZmgoWERSICosIG5mc19maCopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfbmZzX2ZoKFhEUiAqLCBuZnNfZmgqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9uZnNfZmgoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgbmZzdGltZSB7CisJdV9pbnQgc2Vjb25kczsKKwl1X2ludCB1c2Vjb25kczsKK307Cit0eXBlZGVmIHN0cnVjdCBuZnN0aW1lIG5mc3RpbWU7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfbmZzdGltZShYRFIgKiwgbmZzdGltZSopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfbmZzdGltZShYRFIgKiwgbmZzdGltZSopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX25mc3RpbWUoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgZmF0dHIgeworCWZ0eXBlIHR5cGU7CisJdV9pbnQgbW9kZTsKKwl1X2ludCBubGluazsKKwl1X2ludCB1aWQ7CisJdV9pbnQgZ2lkOworCXVfaW50IHNpemU7CisJdV9pbnQgYmxvY2tzaXplOworCXVfaW50IHJkZXY7CisJdV9pbnQgYmxvY2tzOworCXVfaW50IGZzaWQ7CisJdV9pbnQgZmlsZWlkOworCW5mc3RpbWUgYXRpbWU7CisJbmZzdGltZSBtdGltZTsKKwluZnN0aW1lIGN0aW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGZhdHRyIGZhdHRyOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2ZhdHRyKFhEUiAqLCBmYXR0ciopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfZmF0dHIoWERSICosIGZhdHRyKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfZmF0dHIoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3Qgc2F0dHIgeworCXVfaW50IG1vZGU7CisJdV9pbnQgdWlkOworCXVfaW50IGdpZDsKKwl1X2ludCBzaXplOworCW5mc3RpbWUgYXRpbWU7CisJbmZzdGltZSBtdGltZTsKK307Cit0eXBlZGVmIHN0cnVjdCBzYXR0ciBzYXR0cjsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9zYXR0cihYRFIgKiwgc2F0dHIqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3NhdHRyKFhEUiAqLCBzYXR0ciopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3NhdHRyKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKwordHlwZWRlZiBjaGFyICpmaWxlbmFtZTsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9maWxlbmFtZShYRFIgKiwgZmlsZW5hbWUqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX2ZpbGVuYW1lKFhEUiAqLCBmaWxlbmFtZSopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX2ZpbGVuYW1lKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKwordHlwZWRlZiBjaGFyICpuZnNwYXRoOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX25mc3BhdGgoWERSICosIG5mc3BhdGgqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX25mc3BhdGgoWERSICosIG5mc3BhdGgqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9uZnNwYXRoKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGF0dHJzdGF0IHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCWZhdHRyIGF0dHJpYnV0ZXM7CisJfSBhdHRyc3RhdF91OworfTsKK3R5cGVkZWYgc3RydWN0IGF0dHJzdGF0IGF0dHJzdGF0OworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2F0dHJzdGF0KFhEUiAqLCBhdHRyc3RhdCopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfYXR0cnN0YXQoWERSICosIGF0dHJzdGF0Kik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfYXR0cnN0YXQoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3Qgc2F0dHJhcmdzIHsKKwluZnNfZmggZmlsZTsKKwlzYXR0ciBhdHRyaWJ1dGVzOworfTsKK3R5cGVkZWYgc3RydWN0IHNhdHRyYXJncyBzYXR0cmFyZ3M7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfc2F0dHJhcmdzKFhEUiAqLCBzYXR0cmFyZ3MqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3NhdHRyYXJncyhYRFIgKiwgc2F0dHJhcmdzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfc2F0dHJhcmdzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGRpcm9wYXJncyB7CisJbmZzX2ZoIGRpcjsKKwlmaWxlbmFtZSBuYW1lOworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wYXJncyBkaXJvcGFyZ3M7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfZGlyb3BhcmdzKFhEUiAqLCBkaXJvcGFyZ3MqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX2Rpcm9wYXJncyhYRFIgKiwgZGlyb3BhcmdzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfZGlyb3BhcmdzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGRpcm9wb2tyZXMgeworCW5mc19maCBmaWxlOworCWZhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGlyb3Bva3JlcyBkaXJvcG9rcmVzOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2Rpcm9wb2tyZXMoWERSICosIGRpcm9wb2tyZXMqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX2Rpcm9wb2tyZXMoWERSICosIGRpcm9wb2tyZXMqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9kaXJvcG9rcmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGRpcm9wcmVzIHsKKwluZnNzdGF0IHN0YXR1czsKKwl1bmlvbiB7CisJCWRpcm9wb2tyZXMgZGlyb3ByZXM7CisJfSBkaXJvcHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IGRpcm9wcmVzIGRpcm9wcmVzOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2Rpcm9wcmVzKFhEUiAqLCBkaXJvcHJlcyopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfZGlyb3ByZXMoWERSICosIGRpcm9wcmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfZGlyb3ByZXMoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgcmVhZGxpbmtyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJbmZzcGF0aCBkYXRhOworCX0gcmVhZGxpbmtyZXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkbGlua3JlcyByZWFkbGlua3JlczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9yZWFkbGlua3JlcyhYRFIgKiwgcmVhZGxpbmtyZXMqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3JlYWRsaW5rcmVzKFhEUiAqLCByZWFkbGlua3JlcyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3JlYWRsaW5rcmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IHJlYWRhcmdzIHsKKwluZnNfZmggZmlsZTsKKwl1X2ludCBvZmZzZXQ7CisJdV9pbnQgY291bnQ7CisJdV9pbnQgdG90YWxjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkYXJncyByZWFkYXJnczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9yZWFkYXJncyhYRFIgKiwgcmVhZGFyZ3MqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3JlYWRhcmdzKFhEUiAqLCByZWFkYXJncyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3JlYWRhcmdzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IHJlYWRva3JlcyB7CisJZmF0dHIgYXR0cmlidXRlczsKKwlzdHJ1Y3QgeworCQl1X2ludCBkYXRhX2xlbjsKKwkJY2hhciAqZGF0YV92YWw7CisJfSBkYXRhOworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRva3JlcyByZWFkb2tyZXM7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfcmVhZG9rcmVzKFhEUiAqLCByZWFkb2tyZXMqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3JlYWRva3JlcyhYRFIgKiwgcmVhZG9rcmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfcmVhZG9rcmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IHJlYWRyZXMgeworCW5mc3N0YXQgc3RhdHVzOworCXVuaW9uIHsKKwkJcmVhZG9rcmVzIHJlcGx5OworCX0gcmVhZHJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRyZXMgcmVhZHJlczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9yZWFkcmVzKFhEUiAqLCByZWFkcmVzKik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkcmVzKFhEUiAqLCByZWFkcmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfcmVhZHJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKK3N0cnVjdCB3cml0ZWFyZ3MgeworCW5mc19maCBmaWxlOworCXVfaW50IGJlZ2lub2Zmc2V0OworCXVfaW50IG9mZnNldDsKKwl1X2ludCB0b3RhbGNvdW50OworCXN0cnVjdCB7CisJCXVfaW50IGRhdGFfbGVuOworCQljaGFyICpkYXRhX3ZhbDsKKwl9IGRhdGE7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgd3JpdGVhcmdzIHdyaXRlYXJnczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl93cml0ZWFyZ3MoWERSICosIHdyaXRlYXJncyopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfd3JpdGVhcmdzKFhEUiAqLCB3cml0ZWFyZ3MqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl93cml0ZWFyZ3MoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgY3JlYXRlYXJncyB7CisJZGlyb3BhcmdzIHdoZXJlOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY3JlYXRlYXJncyBjcmVhdGVhcmdzOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2NyZWF0ZWFyZ3MoWERSICosIGNyZWF0ZWFyZ3MqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX2NyZWF0ZWFyZ3MoWERSICosIGNyZWF0ZWFyZ3MqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9jcmVhdGVhcmdzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IHJlbmFtZWFyZ3MgeworCWRpcm9wYXJncyBmcm9tOworCWRpcm9wYXJncyB0bzsKK307Cit0eXBlZGVmIHN0cnVjdCByZW5hbWVhcmdzIHJlbmFtZWFyZ3M7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfcmVuYW1lYXJncyhYRFIgKiwgcmVuYW1lYXJncyopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfcmVuYW1lYXJncyhYRFIgKiwgcmVuYW1lYXJncyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3JlbmFtZWFyZ3MoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgbGlua2FyZ3MgeworCW5mc19maCBmcm9tOworCWRpcm9wYXJncyB0bzsKK307Cit0eXBlZGVmIHN0cnVjdCBsaW5rYXJncyBsaW5rYXJnczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9saW5rYXJncyhYRFIgKiwgbGlua2FyZ3MqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX2xpbmthcmdzKFhEUiAqLCBsaW5rYXJncyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX2xpbmthcmdzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IHN5bWxpbmthcmdzIHsKKwlkaXJvcGFyZ3MgZnJvbTsKKwluZnNwYXRoIHRvOworCXNhdHRyIGF0dHJpYnV0ZXM7Cit9OwordHlwZWRlZiBzdHJ1Y3Qgc3ltbGlua2FyZ3Mgc3ltbGlua2FyZ3M7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfc3ltbGlua2FyZ3MoWERSICosIHN5bWxpbmthcmdzKik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9zeW1saW5rYXJncyhYRFIgKiwgc3ltbGlua2FyZ3MqKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9zeW1saW5rYXJncygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKK3R5cGVkZWYgY2hhciBuZnNjb29raWVbTkZTX0NPT0tJRVNJWkVdOworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX25mc2Nvb2tpZShYRFIgKiwgbmZzY29va2llKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX25mc2Nvb2tpZShYRFIgKiwgbmZzY29va2llKTsKKyNlbHNlIC8qIE9sZCBTdHlsZSBDICovIAorYm9vbF90IHhkcl9uZnNjb29raWUoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgcmVhZGRpcmFyZ3MgeworCW5mc19maCBkaXI7CisJbmZzY29va2llIGNvb2tpZTsKKwl1X2ludCBjb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCByZWFkZGlyYXJncyByZWFkZGlyYXJnczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9yZWFkZGlyYXJncyhYRFIgKiwgcmVhZGRpcmFyZ3MqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3JlYWRkaXJhcmdzKFhEUiAqLCByZWFkZGlyYXJncyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3JlYWRkaXJhcmdzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IGVudHJ5IHsKKwl1X2ludCBmaWxlaWQ7CisJZmlsZW5hbWUgbmFtZTsKKwluZnNjb29raWUgY29va2llOworCXN0cnVjdCBlbnRyeSAqbmV4dGVudHJ5OworfTsKK3R5cGVkZWYgc3RydWN0IGVudHJ5IGVudHJ5OworI2lmZGVmIF9fY3BsdXNwbHVzIAorZXh0ZXJuICJDIiBib29sX3QgeGRyX2VudHJ5KFhEUiAqLCBlbnRyeSopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfZW50cnkoWERSICosIGVudHJ5Kik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfZW50cnkoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgZGlybGlzdCB7CisJZW50cnkgKmVudHJpZXM7CisJYm9vbF90IGVvZjsKK307Cit0eXBlZGVmIHN0cnVjdCBkaXJsaXN0IGRpcmxpc3Q7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfZGlybGlzdChYRFIgKiwgZGlybGlzdCopOworI2VsaWYgX19TVERDX18gCitleHRlcm4gIGJvb2xfdCB4ZHJfZGlybGlzdChYRFIgKiwgZGlybGlzdCopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX2Rpcmxpc3QoKTsKKyNlbmRpZiAvKiBPbGQgU3R5bGUgQyAqLyAKKworCitzdHJ1Y3QgcmVhZGRpcnJlcyB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQlkaXJsaXN0IHJlcGx5OworCX0gcmVhZGRpcnJlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHJlYWRkaXJyZXMgcmVhZGRpcnJlczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9yZWFkZGlycmVzKFhEUiAqLCByZWFkZGlycmVzKik7CisjZWxpZiBfX1NURENfXyAKK2V4dGVybiAgYm9vbF90IHhkcl9yZWFkZGlycmVzKFhEUiAqLCByZWFkZGlycmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfcmVhZGRpcnJlcygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisKK3N0cnVjdCBzdGF0ZnNva3JlcyB7CisJdV9pbnQgdHNpemU7CisJdV9pbnQgYnNpemU7CisJdV9pbnQgYmxvY2tzOworCXVfaW50IGJmcmVlOworCXVfaW50IGJhdmFpbDsKK307Cit0eXBlZGVmIHN0cnVjdCBzdGF0ZnNva3JlcyBzdGF0ZnNva3JlczsKKyNpZmRlZiBfX2NwbHVzcGx1cyAKK2V4dGVybiAiQyIgYm9vbF90IHhkcl9zdGF0ZnNva3JlcyhYRFIgKiwgc3RhdGZzb2tyZXMqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3N0YXRmc29rcmVzKFhEUiAqLCBzdGF0ZnNva3JlcyopOworI2Vsc2UgLyogT2xkIFN0eWxlIEMgKi8gCitib29sX3QgeGRyX3N0YXRmc29rcmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworc3RydWN0IHN0YXRmc3JlcyB7CisJbmZzc3RhdCBzdGF0dXM7CisJdW5pb24geworCQlzdGF0ZnNva3JlcyByZXBseTsKKwl9IHN0YXRmc3Jlc191OworfTsKK3R5cGVkZWYgc3RydWN0IHN0YXRmc3JlcyBzdGF0ZnNyZXM7CisjaWZkZWYgX19jcGx1c3BsdXMgCitleHRlcm4gIkMiIGJvb2xfdCB4ZHJfc3RhdGZzcmVzKFhEUiAqLCBzdGF0ZnNyZXMqKTsKKyNlbGlmIF9fU1REQ19fIAorZXh0ZXJuICBib29sX3QgeGRyX3N0YXRmc3JlcyhYRFIgKiwgc3RhdGZzcmVzKik7CisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKK2Jvb2xfdCB4ZHJfc3RhdGZzcmVzKCk7CisjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gCisKKworI2RlZmluZSBORlNfUFJPR1JBTSAoKHVfbG9uZykxMDAwMDMpCisjZGVmaW5lIE5GU19WRVJTSU9OICgodV9sb25nKTIpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBORlNQUk9DX05VTEwgKCh1X2xvbmcpMCkKK2V4dGVybiAiQyIgdm9pZCAqIG5mc3Byb2NfbnVsbF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiB2b2lkICogbmZzcHJvY19udWxsXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfR0VUQVRUUiAoKHVfbG9uZykxKQorZXh0ZXJuICJDIiBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKG5mc19maCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSICgodV9sb25nKTIpCitleHRlcm4gIkMiIGF0dHJzdGF0ICogbmZzcHJvY19zZXRhdHRyXzIoc2F0dHJhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMl9zdmMoc2F0dHJhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JPT1QgKCh1X2xvbmcpMykKK2V4dGVybiAiQyIgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiB2b2lkICogbmZzcHJvY19yb290XzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTE9PS1VQICgodV9sb25nKTQpCitleHRlcm4gIkMiIGRpcm9wcmVzICogbmZzcHJvY19sb29rdXBfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFETElOSyAoKHVfbG9uZyk1KQorZXh0ZXJuICJDIiByZWFkbGlua3JlcyAqIG5mc3Byb2NfcmVhZGxpbmtfMihuZnNfZmggKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiByZWFkbGlua3JlcyAqIG5mc3Byb2NfcmVhZGxpbmtfMl9zdmMobmZzX2ZoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFQUQgKCh1X2xvbmcpNikKK2V4dGVybiAiQyIgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yKHJlYWRhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yX3N2YyhyZWFkYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19XUklURUNBQ0hFICgodV9sb25nKTcpCitleHRlcm4gIkMiIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgdm9pZCAqIG5mc3Byb2Nfd3JpdGVjYWNoZV8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1dSSVRFICgodV9sb25nKTgpCitleHRlcm4gIkMiIGF0dHJzdGF0ICogbmZzcHJvY193cml0ZV8yKHdyaXRlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIGF0dHJzdGF0ICogbmZzcHJvY193cml0ZV8yX3N2Yyh3cml0ZWFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfQ1JFQVRFICgodV9sb25nKTkpCitleHRlcm4gIkMiIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMihjcmVhdGVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgZGlyb3ByZXMgKiBuZnNwcm9jX2NyZWF0ZV8yX3N2YyhjcmVhdGVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFTU9WRSAoKHVfbG9uZykxMCkKK2V4dGVybiAiQyIgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzIoZGlyb3BhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgKCh1X2xvbmcpMTEpCitleHRlcm4gIkMiIG5mc3N0YXQgKiBuZnNwcm9jX3JlbmFtZV8yKHJlbmFtZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBuZnNzdGF0ICogbmZzcHJvY19yZW5hbWVfMl9zdmMocmVuYW1lYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19MSU5LICgodV9sb25nKTEyKQorZXh0ZXJuICJDIiBuZnNzdGF0ICogbmZzcHJvY19saW5rXzIobGlua2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBuZnNzdGF0ICogbmZzcHJvY19saW5rXzJfc3ZjKGxpbmthcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1NZTUxJTksgKCh1X2xvbmcpMTMpCitleHRlcm4gIkMiIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMihzeW1saW5rYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIkMiIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoc3ltbGlua2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTUtESVIgKCh1X2xvbmcpMTQpCitleHRlcm4gIkMiIGRpcm9wcmVzICogbmZzcHJvY19ta2Rpcl8yKGNyZWF0ZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMl9zdmMoY3JlYXRlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19STURJUiAoKHVfbG9uZykxNSkKK2V4dGVybiAiQyIgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICJDIiBuZnNzdGF0ICogbmZzcHJvY19ybWRpcl8yX3N2YyhkaXJvcGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUkVBRERJUiAoKHVfbG9uZykxNikKK2V4dGVybiAiQyIgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yKHJlYWRkaXJhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YyhyZWFkZGlyYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TVEFURlMgKCh1X2xvbmcpMTcpCitleHRlcm4gIkMiIHN0YXRmc3JlcyAqIG5mc3Byb2Nfc3RhdGZzXzIobmZzX2ZoICosIENMSUVOVCAqKTsKK2V4dGVybiAiQyIgc3RhdGZzcmVzICogbmZzcHJvY19zdGF0ZnNfMl9zdmMobmZzX2ZoICosIHN0cnVjdCBzdmNfcmVxICopOworCisjZWxpZiBfX1NURENfXworI2RlZmluZSBORlNQUk9DX05VTEwgKCh1X2xvbmcpMCkKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2NfbnVsbF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmZzcHJvY19udWxsXzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfR0VUQVRUUiAoKHVfbG9uZykxKQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKG5mc19maCAqLCBDTElFTlQgKik7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKG5mc19maCAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TRVRBVFRSICgodV9sb25nKTIpCitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19zZXRhdHRyXzIoc2F0dHJhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3NldGF0dHJfMl9zdmMoc2F0dHJhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JPT1QgKCh1X2xvbmcpMykKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yKHZvaWQgKiwgQ0xJRU5UICopOworZXh0ZXJuICB2b2lkICogbmZzcHJvY19yb290XzJfc3ZjKHZvaWQgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTE9PS1VQICgodV9sb25nKTQpCitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19sb29rdXBfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFETElOSyAoKHVfbG9uZyk1KQorZXh0ZXJuICByZWFkbGlua3JlcyAqIG5mc3Byb2NfcmVhZGxpbmtfMihuZnNfZmggKiwgQ0xJRU5UICopOworZXh0ZXJuICByZWFkbGlua3JlcyAqIG5mc3Byb2NfcmVhZGxpbmtfMl9zdmMobmZzX2ZoICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFQUQgKCh1X2xvbmcpNikKK2V4dGVybiAgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yKHJlYWRhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yX3N2YyhyZWFkYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19XUklURUNBQ0hFICgodV9sb25nKTcpCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMih2b2lkICosIENMSUVOVCAqKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfd3JpdGVjYWNoZV8yX3N2Yyh2b2lkICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1dSSVRFICgodV9sb25nKTgpCitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY193cml0ZV8yKHdyaXRlYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY193cml0ZV8yX3N2Yyh3cml0ZWFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfQ1JFQVRFICgodV9sb25nKTkpCitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMihjcmVhdGVhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2NyZWF0ZV8yX3N2YyhjcmVhdGVhcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1JFTU9WRSAoKHVfbG9uZykxMCkKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzIoZGlyb3BhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2NfcmVtb3ZlXzJfc3ZjKGRpcm9wYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgKCh1X2xvbmcpMTEpCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbmFtZV8yKHJlbmFtZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW5hbWVfMl9zdmMocmVuYW1lYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19MSU5LICgodV9sb25nKTEyKQorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzIobGlua2FyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzJfc3ZjKGxpbmthcmdzICosIHN0cnVjdCBzdmNfcmVxICopOworI2RlZmluZSBORlNQUk9DX1NZTUxJTksgKCh1X2xvbmcpMTMpCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMihzeW1saW5rYXJncyAqLCBDTElFTlQgKik7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoc3ltbGlua2FyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfTUtESVIgKCh1X2xvbmcpMTQpCitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19ta2Rpcl8yKGNyZWF0ZWFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbWtkaXJfMl9zdmMoY3JlYXRlYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19STURJUiAoKHVfbG9uZykxNSkKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMihkaXJvcGFyZ3MgKiwgQ0xJRU5UICopOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19ybWRpcl8yX3N2YyhkaXJvcGFyZ3MgKiwgc3RydWN0IHN2Y19yZXEgKik7CisjZGVmaW5lIE5GU1BST0NfUkVBRERJUiAoKHVfbG9uZykxNikKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yKHJlYWRkaXJhcmdzICosIENMSUVOVCAqKTsKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YyhyZWFkZGlyYXJncyAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKTsKKyNkZWZpbmUgTkZTUFJPQ19TVEFURlMgKCh1X2xvbmcpMTcpCitleHRlcm4gIHN0YXRmc3JlcyAqIG5mc3Byb2Nfc3RhdGZzXzIobmZzX2ZoICosIENMSUVOVCAqKTsKK2V4dGVybiAgc3RhdGZzcmVzICogbmZzcHJvY19zdGF0ZnNfMl9zdmMobmZzX2ZoICosIHN0cnVjdCBzdmNfcmVxICopOworCisjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyAKKyNkZWZpbmUgTkZTUFJPQ19OVUxMICgodV9sb25nKTApCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX251bGxfMigpOworZXh0ZXJuICB2b2lkICogbmZzcHJvY19udWxsXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfR0VUQVRUUiAoKHVfbG9uZykxKQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2NfZ2V0YXR0cl8yKCk7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19nZXRhdHRyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfU0VUQVRUUiAoKHVfbG9uZykyKQorZXh0ZXJuICBhdHRyc3RhdCAqIG5mc3Byb2Nfc2V0YXR0cl8yKCk7CitleHRlcm4gIGF0dHJzdGF0ICogbmZzcHJvY19zZXRhdHRyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUk9PVCAoKHVfbG9uZykzKQorZXh0ZXJuICB2b2lkICogbmZzcHJvY19yb290XzIoKTsKK2V4dGVybiAgdm9pZCAqIG5mc3Byb2Nfcm9vdF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX0xPT0tVUCAoKHVfbG9uZyk0KQorZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfbG9va3VwXzIoKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX2xvb2t1cF8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFQURMSU5LICgodV9sb25nKTUpCitleHRlcm4gIHJlYWRsaW5rcmVzICogbmZzcHJvY19yZWFkbGlua18yKCk7CitleHRlcm4gIHJlYWRsaW5rcmVzICogbmZzcHJvY19yZWFkbGlua18yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1JFQUQgKCh1X2xvbmcpNikKK2V4dGVybiAgcmVhZHJlcyAqIG5mc3Byb2NfcmVhZF8yKCk7CitleHRlcm4gIHJlYWRyZXMgKiBuZnNwcm9jX3JlYWRfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19XUklURUNBQ0hFICgodV9sb25nKTcpCitleHRlcm4gIHZvaWQgKiBuZnNwcm9jX3dyaXRlY2FjaGVfMigpOworZXh0ZXJuICB2b2lkICogbmZzcHJvY193cml0ZWNhY2hlXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfV1JJVEUgKCh1X2xvbmcpOCkKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3dyaXRlXzIoKTsKK2V4dGVybiAgYXR0cnN0YXQgKiBuZnNwcm9jX3dyaXRlXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfQ1JFQVRFICgodV9sb25nKTkpCitleHRlcm4gIGRpcm9wcmVzICogbmZzcHJvY19jcmVhdGVfMigpOworZXh0ZXJuICBkaXJvcHJlcyAqIG5mc3Byb2NfY3JlYXRlXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUkVNT1ZFICgodV9sb25nKTEwKQorZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMigpOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19yZW1vdmVfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19SRU5BTUUgKCh1X2xvbmcpMTEpCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbmFtZV8yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JlbmFtZV8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX0xJTksgKCh1X2xvbmcpMTIpCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX2xpbmtfMigpOworZXh0ZXJuICBuZnNzdGF0ICogbmZzcHJvY19saW5rXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfU1lNTElOSyAoKHVfbG9uZykxMykKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfc3ltbGlua18yKCk7CitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3N5bWxpbmtfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19NS0RJUiAoKHVfbG9uZykxNCkKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX21rZGlyXzIoKTsKK2V4dGVybiAgZGlyb3ByZXMgKiBuZnNwcm9jX21rZGlyXzJfc3ZjKCk7CisjZGVmaW5lIE5GU1BST0NfUk1ESVIgKCh1X2xvbmcpMTUpCitleHRlcm4gIG5mc3N0YXQgKiBuZnNwcm9jX3JtZGlyXzIoKTsKK2V4dGVybiAgbmZzc3RhdCAqIG5mc3Byb2Nfcm1kaXJfMl9zdmMoKTsKKyNkZWZpbmUgTkZTUFJPQ19SRUFERElSICgodV9sb25nKTE2KQorZXh0ZXJuICByZWFkZGlycmVzICogbmZzcHJvY19yZWFkZGlyXzIoKTsKK2V4dGVybiAgcmVhZGRpcnJlcyAqIG5mc3Byb2NfcmVhZGRpcl8yX3N2YygpOworI2RlZmluZSBORlNQUk9DX1NUQVRGUyAoKHVfbG9uZykxNykKK2V4dGVybiAgc3RhdGZzcmVzICogbmZzcHJvY19zdGF0ZnNfMigpOworZXh0ZXJuICBzdGF0ZnNyZXMgKiBuZnNwcm9jX3N0YXRmc18yX3N2YygpOworI2VuZGlmIC8qIE9sZCBTdHlsZSBDICovIAorCisjZW5kaWYgLyogIV9ORlNfUFJPVF9IX1JQQ0dFTiAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zb2NrYWRkci5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zb2NrYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3NvY2thZGRyLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5mcy11dGlscy4KKyAqCisgKiBuZnMtdXRpbHMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5mcy11dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggbmZzLXV0aWxzLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgTkZTX1VUSUxTX1NPQ0tBRERSX0gKKyNkZWZpbmUgTkZTX1VUSUxTX1NPQ0tBRERSX0gKKworI2luY2x1ZGUgPGxpYmlvLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKy8qCisgKiBUaGlzIHR5cGUgaXMgZm9yIGRlZmluaW5nIGJ1ZmZlcnMgdGhhdCBjb250YWluIG5ldHdvcmsgc29ja2V0CisgKiBhZGRyZXNzZXMuCisgKgorICogQ2FzdGluZyBhICJzdHJ1Y3Qgc29ja2FkZHIgKiIgdG8gdGhlIGFkZHJlc3Mgb2YgYSAic3RydWN0CisgKiBzb2NrYWRkcl9zdG9yYWdlIiBicmVha3MgQyBhbGlhc2luZyBydWxlcy4gIFRoZSAidW5pb24KKyAqIG5mc19zb2NrYWRkciIgdHlwZSBmb2xsb3dzIEMgYWxpYXNpbmcgcnVsZXMgeWV0IHNwZWNpZmljYWxseQorICogYWxsb3dzIGNvbnZlcnRpbmcgcG9pbnRlcnMgdG8gaXQgYmV0d2VlbiAic3RydWN0IHNvY2thZGRyICoiCisgKiBhbmQgYSBmZXcgb3RoZXIgbmV0d29yayBzb2NrYWRkci1yZWxhdGVkIHBvaW50ZXIgdHlwZXMuCisgKgorICogTm90ZSB0aGF0IHRoaXMgdW5pb24gaXMgbXVjaCBzbWFsbGVyIHRoYW4gYSBzb2NrYWRkcl9zdG9yYWdlLgorICogSXQgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgQUZfSU5FVCBvciBBRl9JTkVUNiBzb2NrZXQgYWRkcmVzc2VzLgorICogQW4gQUZfTE9DQUwgc29ja2FkZHJfdW4sIGZvciBleGFtcGxlLCB3aWxsIGNsZWFybHkgbm90IGZpdCBpbnRvCisgKiBhIGJ1ZmZlciBvZiB0aGlzIHR5cGUuCisgKi8KK3VuaW9uIG5mc19zb2NrYWRkciB7CisJc3RydWN0IHNvY2thZGRyCQlzYTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4JczQ7CisJc3RydWN0IHNvY2thZGRyX2luNglzNjsKK307CisKKyNpZiBTSVpFT0ZfU09DS0xFTl9UIC0gMCA9PSAwCisjZGVmaW5lIHNvY2tsZW5fdCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjZGVmaW5lIFNJWkVPRl9TT0NLQUREUl9VTktOT1dOCShzb2NrbGVuX3QpMAorI2RlZmluZSBTSVpFT0ZfU09DS0FERFJfSU4JKHNvY2tsZW5fdClzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKQorCisjaWZkZWYgSVBWNl9TVVBQT1JURUQKKyNkZWZpbmUgU0laRU9GX1NPQ0tBRERSX0lONgkoc29ja2xlbl90KXNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KQorI2Vsc2UJLyogIUlQVjZfU1VQUE9SVEVEICovCisjZGVmaW5lIFNJWkVPRl9TT0NLQUREUl9JTjYJU0laRU9GX1NPQ0tBRERSX1VOS05PV04KKyNlbmRpZgkvKiAhSVBWNl9TVVBQT1JURUQgKi8KKworLyoqCisgKiBuZnNfc29ja2FkZHJfbGVuZ3RoIC0gcmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc29ja2V0IGFkZHJlc3MKKyAqIEBzYXA6IHBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIG9mIEBzYXAsIG9yIHplcm8gaWYgdGhlIGZhbWlseSBpcworICogbm90IHJlY29nbml6ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc29ja2xlbl90CituZnNfc29ja2FkZHJfbGVuZ3RoKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBTSVpFT0ZfU09DS0FERFJfSU47CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIFNJWkVPRl9TT0NLQUREUl9JTjY7CisJfQorCXJldHVybiBTSVpFT0ZfU09DS0FERFJfVU5LTk9XTjsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdAorZ2V0X3BvcnQ0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcDsKKwlyZXR1cm4gbnRvaHMoc2luLT5zaW5fcG9ydCk7Cit9CisKKyNpZmRlZiBJUFY2X1NVUFBPUlRFRAorc3RhdGljIGlubGluZSB1aW50MTZfdAorZ2V0X3BvcnQ2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKKwlyZXR1cm4gbnRvaHMoc2luNi0+c2luNl9wb3J0KTsKK30KKyNlbHNlCS8qICFJUFY2X1NVUFBPUlRFRCAqLworc3RhdGljIGlubGluZSB1aW50MTZfdAorZ2V0X3BvcnQ2KF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkvKiAhSVBWNl9TVVBQT1JURUQgKi8KKworLyoqCisgKiBuZnNfZ2V0X3BvcnQgLSBleHRyYWN0IHBvcnQgdmFsdWUgZnJvbSBhIHNvY2tldCBhZGRyZXNzCisgKiBAc2FwOiBwb2ludGVyIHRvIHNvY2tldCBhZGRyZXNzCisgKgorICogUmV0dXJucyBwb3J0IHZhbHVlIGluIGhvc3QgYnl0ZSBvcmRlciwgb3IgemVybyBpZiB0aGUKKyAqIHNvY2tldCBhZGRyZXNzIGNvbnRhaW5zIGFuIHVucmVjb2duaXplZCBmYW1pbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK25mc19nZXRfcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXR1cm4gZ2V0X3BvcnQ0KHNhcCk7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIGdldF9wb3J0NihzYXApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzZXRfcG9ydDQoc3RydWN0IHNvY2thZGRyICpzYXAsIGNvbnN0IHVpbnQxNl90IHBvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FwOworCXNpbi0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKK30KKworI2lmZGVmIElQVjZfU1VQUE9SVEVECitzdGF0aWMgaW5saW5lIHZvaWQKK3NldF9wb3J0NihzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3QgdWludDE2X3QgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXA7CisJc2luNi0+c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7Cit9CisjZWxzZQkvKiAhSVBWNl9TVVBQT1JURUQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X3BvcnQ2KF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIGNvbnN0IHVpbnQxNl90IHBvcnQpCit7Cit9CisjZW5kaWYJLyogIUlQVjZfU1VQUE9SVEVEICovCisKKy8qKgorICogbmZzX3NldF9wb3J0IC0gc2V0IHBvcnQgdmFsdWUgaW4gYSBzb2NrZXQgYWRkcmVzcworICogQHNhcDogcG9pbnRlciB0byBzb2NrZXQgYWRkcmVzcworICogQHBvcnQ6IHBvcnQgdmFsdWUgdG8gc2V0CisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK25mc19zZXRfcG9ydChzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3QgdWludDE2X3QgcG9ydCkKK3sKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlzZXRfcG9ydDQoc2FwLCBwb3J0KTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJc2V0X3BvcnQ2KHNhcCwgcG9ydCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBuZnNfaXNfdjRfbG9vcGJhY2sgLSB0ZXN0IHRvIHNlZSBpZiBzb2NrZXQgYWRkcmVzcyBpcyBBRl9JTkVUIGxvb3BiYWNrCisgKiBAc2FwOiBwb2ludGVyIHRvIHNvY2tldCBhZGRyZXNzCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBzb2NrZXQgYWRkcmVzcyBpcyB0aGUgc3RhbmRhcmQgSVB2NCBsb29wYmFjaworICogYWRkcmVzczsgb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW5saW5lIF9Cb29sCituZnNfaXNfdjRfbG9vcGJhY2soY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopc2FwOworCisJaWYgKHNpbi0+c2luX2ZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHNpbi0+c2luX2FkZHIuc19hZGRyICE9IGh0b25sKElOQUREUl9MT09QQkFDSykpCisJCXJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgX0Jvb2wKK2NvbXBhcmVfc29ja2FkZHI0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2ExLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhMikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjEgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopc2ExOworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luMiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYTI7CisJcmV0dXJuIHNpbjEtPnNpbl9hZGRyLnNfYWRkciA9PSBzaW4yLT5zaW5fYWRkci5zX2FkZHI7Cit9CisKKyNpZmRlZiBJUFY2X1NVUFBPUlRFRAorc3RhdGljIGlubGluZSBfQm9vbAorY29tcGFyZV9zb2NrYWRkcjYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYTEsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EyKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjEgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKXNhMTsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW4yID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTI7CisKKwlpZiAoKElONl9JU19BRERSX0xJTktMT0NBTCgoY2hhciAqKSZzaW4xLT5zaW42X2FkZHIpICYmCisJICAgICBJTjZfSVNfQUREUl9MSU5LTE9DQUwoKGNoYXIgKikmc2luMi0+c2luNl9hZGRyKSkgfHwKKwkgICAgKElONl9JU19BRERSX1NJVEVMT0NBTCgoY2hhciAqKSZzaW4xLT5zaW42X2FkZHIpICYmCisJICAgICBJTjZfSVNfQUREUl9TSVRFTE9DQUwoKGNoYXIgKikmc2luMi0+c2luNl9hZGRyKSkpCisJCWlmIChzaW4xLT5zaW42X3Njb3BlX2lkICE9IHNpbjItPnNpbjZfc2NvcGVfaWQpCisJCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gSU42X0FSRV9BRERSX0VRVUFMKChjaGFyICopJnNpbjEtPnNpbjZfYWRkciwKKwkJCQkJKGNoYXIgKikmc2luMi0+c2luNl9hZGRyKTsKK30KKyNlbHNlCS8qICFJUFY2X1NVUFBPUlRFRCAqLworc3RhdGljIGlubGluZSBfQm9vbAorY29tcGFyZV9zb2NrYWRkcjYoX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2ExLAorCQlfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYTIpCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCS8qICFJUFY2X1NVUFBPUlRFRCAqLworCisvKioKKyAqIG5mc19jb21wYXJlX3NvY2thZGRyIC0gY29tcGFyZSB0d28gc29ja2V0IGFkZHJlc3NlcyBmb3IgZXF1YWxpdHkKKyAqIEBzYTE6IHBvaW50ZXIgdG8gYSBzb2NrZXQgYWRkcmVzcworICogQHNhMjogcG9pbnRlciB0byBhIHNvY2tldCBhZGRyZXNzCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gc29ja2V0IGFkZHJlc3NlcyBjb250YWluIGVxdWl2YWxlbnQKKyAqIG5ldHdvcmsgYWRkcmVzc2VzOyBvdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgX0Jvb2wKK25mc19jb21wYXJlX3NvY2thZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2ExLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhMikKK3sKKwlpZiAoc2ExID09IE5VTEwgfHwgc2EyID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzYTEtPnNhX2ZhbWlseSA9PSBzYTItPnNhX2ZhbWlseSkKKwkJc3dpdGNoIChzYTEtPnNhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlyZXR1cm4gY29tcGFyZV9zb2NrYWRkcjQoc2ExLCBzYTIpOworCQljYXNlIEFGX0lORVQ2OgorCQkJcmV0dXJuIGNvbXBhcmVfc29ja2FkZHI2KHNhMSwgc2EyKTsKKwkJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisjZW5kaWYJLyogIU5GU19VVElMU19TT0NLQUREUl9IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvc3lzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYWQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitTVUJESVJTID0gZnMKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zeXMvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI0NzExCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zeXMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw2MTMgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBzdXBwb3J0L2luY2x1ZGUvc3lzCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAorCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCitSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAorICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCitBTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKKwkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAorCWRpc3RkaXIKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RfU1VCRElSUyA9ICQoU1VCRElSUykKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCithbV9fcmVsYXRpdml6ZSA9IFwKKyAgZGlyMD1gcHdkYDsgXAorICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKKyAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKKyAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKKyAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCisgIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKKyAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCisgICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAorICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKKyAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCisgICAgICBlbHNlIFwKKyAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCisgICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCisgICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKKyAgICAgICAgZmk7IFwKKyAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKKyAgICAgIGZpOyBcCisgICAgZmk7IFwKKyAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKKyAgZG9uZTsgXAorICByZWxkaXI9IiQkZGlyMiIKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FDTE9DQUxfQU1GTEFHUyA9IEBBQ0xPQ0FMX0FNRkxBR1NACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBTV9DRkxBR1MgPSBAQU1fQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSBAQU1fQ1BQRkxBR1NACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK1NVQkRJUlMgPSBmcworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvaW5jbHVkZS9zeXMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9pbmNsdWRlL3N5cy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCiskKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKKwlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKK2N0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKKwkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAorCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJCWFtX19za2lwX21vZGVfZml4PTogXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtcmVjdXJzaXZlCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtcmVjdXJzaXZlCisKK3BkZi1hbToKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgY3RhZ3MtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCisJYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zeXMvZnMvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9mcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVmYTQzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zeXMvZnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworbm9pbnN0X0hFQURFUlMgPSBleHQyZnMuaAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9mcy9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvc3lzL2ZzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGM0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9mcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDQ2NCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gc3VwcG9ydC9pbmNsdWRlL3N5cy9mcworRElTVF9DT01NT04gPSAkKG5vaW5zdF9IRUFERVJTKSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gXAorCSQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitIRUFERVJTID0gJChub2luc3RfSEVBREVSUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitub2luc3RfSEVBREVSUyA9IGV4dDJmcy5oCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBzdXBwb3J0L2luY2x1ZGUvc3lzL2ZzL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvaW5jbHVkZS9zeXMvZnMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoSEVBREVSUykKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjdGFncyBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCBcCisJdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zeXMvZnMvZXh0MmZzLmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3N5cy9mcy9leHQyZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2IzZTJiCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS9zeXMvZnMvZXh0MmZzLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBfU1lTX0ZTX0VYVDJGU19ICisjZGVmaW5lIF9TWVNfRlNfRVhUMkZTX0gKKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzCisgKi8KKyNkZWZpbmUJRVhUMl9JT0NfR0VURkxBR1MJCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZQlFWFQyX0lPQ19TRVRGTEFHUwkJX0lPVygnZicsIDIsIGxvbmcpCisjZGVmaW5lCUVYVDJfSU9DX0dFVFZFUlNJT04JCV9JT1IoJ3YnLCAxLCBsb25nKQorI2RlZmluZQlFWFQyX0lPQ19TRVRWRVJTSU9OCQlfSU9XKCd2JywgMiwgbG9uZykKKworLyoKKyAqIEZpbGUgc3lzdGVtIHN0YXRlcworICovCisjZGVmaW5lCUVYVDJfVkFMSURfRlMJCQkweDAwMDEJLyogVW5tb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUJRVhUMl9FUlJPUl9GUwkJCTB4MDAwMgkvKiBFcnJvcnMgZGV0ZWN0ZWQgKi8KKworLyoKKyAqIE1vdW50IGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9DSEVDS19OT1JNQUwJCTB4MDAwMQkvKiBEbyBzb21lIG1vcmUgY2hlY2tzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfQ0hFQ0tfU1RSSUNUCQkweDAwMDIJLyogRG8gYWdhaW4gbW9yZSBjaGVja3MgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9DSEVDSwkJKEVYVDJfTU9VTlRfQ0hFQ0tfTk9STUFMIHwgXAorCQkJCQkgRVhUMl9NT1VOVF9DSEVDS19TVFJJQ1QpCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQSUQJCTB4MDAwNAkvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQyX01PVU5UX0RFQlVHCQkweDAwMDgJLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDEwCS8qIENvbnRpbnVlIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19STwkJMHgwMDIwCS8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwNDAJLyogUGFuaWMgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTUlOSVhfREYJCTB4MDA4MAkvKiBNaW1pY3MgdGhlIE1pbml4IHN0YXRmcyAqLworCisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQyX01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKChzYiktPnUuZXh0Ml9zYi5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDJfTU9VTlRfIyNvcHQpCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQyX0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworI2VuZGlmCS8qIF9TWVNfRlNfRVhUMkZTX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvdGNwd3JhcHBlci5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS90Y3B3cmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczNTEwNgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvdGNwd3JhcHBlci5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgVENQX1dSQVBQRVJfSAorI2RlZmluZSBUQ1BfV1JBUFBFUl9ICisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCitleHRlcm4gaW50IGZyb21fbG9jYWwoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApOworZXh0ZXJuIGludCBjaGVja19kZWZhdWx0KGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJY29uc3QgdW5zaWduZWQgbG9uZyBwcm9ncmFtKTsKKworI2VuZGlmIC8qIFRDUF9XUkFQUEVSX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUvdjRyb290LmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3Y0cm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNmMxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3Y0cm9vdC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCA8bmZzQHJlZGhhdC5jb20+CisgKiBzdXBwb3J0L2luY2x1ZGUvdjRyb290LmgKKyAqCisgKiBTdXBwb3J0IHJvdXRpbmVzIGZvciBkeW5hbWljIHBzZXVkbyByb290cy4KKyAqCisgKi8KKworI2lmbmRlZiBWNFJPT1RfSAorI2RlZmluZSBWNFJPT1RfSAorCitleHRlcm4gaW50IHY0cm9vdF9uZWVkZWQ7CitleHRlcm4gdm9pZCB2NHJvb3Rfc2V0KHZvaWQpOworCisjZW5kaWYgLyogVjRST09UX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUveGNvbW1vbi5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS94Y29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFhNGIxOAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUveGNvbW1vbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiB4Y29tbW9uLmggLS0gU3VwcG9ydCBmdW5jdGlvbiBwcm90b3R5cGVzLiBGdW5jdGlvbnMgYXJlIGluIHhjb21tb24uYy4KKyAqCisgKiAyMDA2LTA2LTA2IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CisgKiAtIE1vdmVkIGNvZGUgc25pcHBldHMgIGZyb20gbW91bnQvc3VuZHJpZXMuaCBvZiB1dGlsLWxpbnV4CisgKiAgIGFuZCBtZXJnZWQgY29kZSBmcm9tIHN1cHBvcnQvbmZzL3htYWxsb2MuYyBieSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4gaGVyZS4KKyAqLworCisjaWZuZGVmIF9YTUFMTE9DX0gKKyNkZWZpbmUgX01BTExPQ19ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIHN0cmVxKHMsIHQpCShzdHJjbXAgKChzKSwgKHQpKSA9PSAwKQorCisvKiBGdW5jdGlvbnMgaW4gc3VuZHJpZXMuYyB0aGF0IGFyZSB1c2VkIGluIG1vdW50LmMgYW5kIHVtb3VudC5jICAqLyAKK2NoYXIgKmNhbm9uaWNhbGl6ZSAoY29uc3QgY2hhciAqcGF0aCk7Cit2b2lkIG5mc19lcnJvciAoY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCAqeG1hbGxvYyAoc2l6ZV90IHNpemUpOwordm9pZCAqeHJlYWxsb2Modm9pZCAqcCwgc2l6ZV90IHNpemUpOwordm9pZCB4ZnJlZSh2b2lkICopOworY2hhciAqeHN0cmR1cCAoY29uc3QgY2hhciAqcyk7CitjaGFyICp4c3RybmR1cCAoY29uc3QgY2hhciAqcywgaW50IG4pOworY2hhciAqeHN0cmNvbmNhdDIgKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2NoYXIgKnhzdHJjb25jYXQzIChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2NoYXIgKnhzdHJjb25jYXQ0IChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwordm9pZCBkaWUgKGludCBlcnJjb2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK2V4dGVybiB2b2lkIGRpZShpbnQgZXJyLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCAoKmF0X2RpZSkodm9pZCk7CisKKy8qIGV4aXQgc3RhdHVzIC0gYml0cyBiZWxvdyBhcmUgT1JlZCAqLworI2RlZmluZSBFWF9TVUNDRVNTCTAJLyogbm8gZmFpbHVyZSBvY2N1cnJlZCAqLworI2RlZmluZSBFWF9VU0FHRQkxCS8qIGluY29ycmVjdCBpbnZvY2F0aW9uIG9yIHBlcm1pc3Npb24gKi8KKyNkZWZpbmUgRVhfU1lTRVJSCTIJLyogb3V0IG9mIG1lbW9yeSwgY2Fubm90IGZvcmssIC4uLiAqLworI2RlZmluZSBFWF9TT0ZUV0FSRQk0CS8qIGludGVybmFsIG1vdW50IGJ1ZyBvciB3cm9uZyB2ZXJzaW9uICovCisjZGVmaW5lIEVYX1VTRVIJCTgJLyogdXNlciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRVhfRklMRUlPICAgICAgMTYJLyogcHJvYmxlbXMgd3JpdGluZywgbG9ja2luZywgLi4uIG10YWIvZnN0YWIgKi8KKyNkZWZpbmUgRVhfRkFJTAkgICAgICAgMzIJLyogbW91bnQgZmFpbHVyZSAqLworI2RlZmluZSBFWF9TT01FT0sgICAgICA2NAkvKiBzb21lIG1vdW50IHN1Y2NlZWRlZCAqLworI2RlZmluZSBFWF9CRyAgICAgICAgIDI1NiAgICAgICAvKiByZXRyeSBpbiBiYWNrZ3JvdW5kIChpbnRlcm5hbCBvbmx5KSAqLworCisjZW5kaWYgLyogWE1BTExPQ19IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3hpby5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS94aW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGUyODhlCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS94aW8uaApAQCAtMCwwICsxLDI2IEBACisvKgorICogeGlvLmgJRGVjbGFyYXRpb25zIGZvciBzaW1wbGUgcGFyc2luZyBmdW5jdGlvbnMuCisgKgorICovCisKKyNpZm5kZWYgWElPX0gKKyNkZWZpbmUgWElPX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3R5cGVkZWYgc3RydWN0IFhGSUxFIHsKKwlGSUxFCQkqeF9mcDsKKwlpbnQJCXhfbGluZTsKK30gWEZJTEU7CisKK1hGSUxFCSp4Zm9wZW4oY2hhciAqZm5hbWUsIGNoYXIgKnR5cGUpOworaW50CXhmbG9jayhjaGFyICpmbmFtZSwgY2hhciAqdHlwZSk7Cit2b2lkCXhmdW5sb2NrKGludCBsb2NraWQpOwordm9pZAl4ZmNsb3NlKFhGSUxFICp4ZnApOworaW50CXhnZXR0b2soWEZJTEUgKnhmcCwgY2hhciBzZXBhLCBjaGFyICp0b2ssIGludCBsZW4pOworaW50CXhnZXRjKFhGSUxFICp4ZnApOwordm9pZAl4dW5nZXRjKGludCBjLCBYRklMRSAqeGZwKTsKK3ZvaWQJeHNraXAoWEZJTEUgKnhmcCwgY2hhciAqc3RyKTsKK2NoYXIJeHNraXBjb21tZW50KFhGSUxFICp4ZnApOworCisjZW5kaWYgLyogWElPX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUveGxvZy5oIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS94bG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxYTNmNAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L2luY2x1ZGUveGxvZy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiB4bG9nCQlMb2dnaW5nIGZ1bmN0aW9uYWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmbmRlZiBYTE9HX0gKKyNkZWZpbmUgWExPR19ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogVGhlc2UgYXJlIGxvZ2dlZCBhbHdheXMuIExfRkFUQUwgYWxzbyBkb2VzIGV4aXQoMSkgKi8KKyNkZWZpbmUgTF9GQVRBTAkJMHgwMTAwCisjZGVmaW5lIExfRVJST1IJCTB4MDIwMAorI2RlZmluZSBMX1dBUk5JTkcJMHgwNDAwCisjZGVmaW5lIExfTk9USUNFCTB4MDgwMAorI2RlZmluZSBMX0FMTAkJMHhGRjAwCisKKy8qIFRoZXNlIGFyZSBsb2dnZWQgaWYgZW5hYmxlZCB3aXRoIHhsb2dfW3NdY29uZmlnICovCisvKiBOQjogY29kZSBkb2VzIG5vdCBleHBlY3QgT1JpbmcgdG9nZXRoZXIgRF8gYW5kIExfICovCisjZGVmaW5lIERfR0VORVJBTAkweDAwMDEJCS8qIGdlbmVyYWwgZGVidWcgaW5mbyAqLworI2RlZmluZSBEX0NBTEwJCTB4MDAwMgorI2RlZmluZSBEX0FVVEgJCTB4MDAwNAorI2RlZmluZSBEX0ZBQzMJCTB4MDAwOAorI2RlZmluZSBEX0ZBQzQJCTB4MDAxMAorI2RlZmluZSBEX0ZBQzUJCTB4MDAyMAorI2RlZmluZSBEX1BBUlNFCQkweDAwNDAKKyNkZWZpbmUgRF9GQUM3CQkweDAwODAKKyNkZWZpbmUgRF9BTEwJCTB4MDBGRgorCisvKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBzeW1ib2xpYyBsb2cgbmFtZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvCisgKiB4bG9nX2NvbmZpZy4gKi8KK3N0cnVjdCB4bG9nX2RlYnVnZmFjIHsKKwljaGFyCQkqZGZfbmFtZTsKKwlpbnQJCWRmX2ZhYzsKK307CisKK3ZvaWQJCQl4bG9nX29wZW4oY2hhciAqcHJvZ25hbWUpOwordm9pZAkJCXhsb2dfc3RkZXJyKGludCBvbik7Cit2b2lkCQkJeGxvZ19zeXNsb2coaW50IG9uKTsKK3ZvaWQJCQl4bG9nX2NvbmZpZyhpbnQgZmFjLCBpbnQgb24pOwordm9pZAkJCXhsb2dfc2NvbmZpZyhjaGFyICosIGludCBvbik7CitpbnQJCQl4bG9nX2VuYWJsZWQoaW50IGZhYyk7Cit2b2lkCQkJeGxvZyhpbnQgZmFjLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkCQkJeGxvZ193YXJuKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3ZvaWQJCQl4bG9nX2Vycihjb25zdCBjaGFyICpmbXQsIC4uLik7Cit2b2lkCQkJeGxvZ19iYWNrZW5kKGludCBmYWMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKKworI2VuZGlmIC8qIFhMT0dfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS94bWFsbG9jLmggYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9pbmNsdWRlL3htYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjgyODAwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvaW5jbHVkZS94bWFsbG9jLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgInhjb21tb24uaCIKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9taXNjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDg1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9taXNjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNiBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJtaXNjLmEKK2xpYm1pc2NfYV9TT1VSQ0VTID0gdGNwd3JhcHBlci5jIGZyb21fbG9jYWwuYyBtb3VudHBvaW50LmMKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbWlzYy9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2MTIzNgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw1MjcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3N1YmRpciA9IHN1cHBvcnQvbWlzYworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK0xJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKK0FSRkxBR1MgPSBjcnUKK2xpYm1pc2NfYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKK2xpYm1pc2NfYV9MSUJBREQgPQorYW1fbGlibWlzY19hX09CSkVDVFMgPSB0Y3B3cmFwcGVyLiQoT0JKRVhUKSBmcm9tX2xvY2FsLiQoT0JKRVhUKSBcCisJbW91bnRwb2ludC4kKE9CSkVYVCkKK2xpYm1pc2NfYV9PQkpFQ1RTID0gJChhbV9saWJtaXNjX2FfT0JKRUNUUykKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChsaWJtaXNjX2FfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGlibWlzY19hX1NPVVJDRVMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYm1pc2MuYQorbGlibWlzY19hX1NPVVJDRVMgPSB0Y3B3cmFwcGVyLmMgZnJvbV9sb2NhbC5jIG1vdW50cG9pbnQuYworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgc3VwcG9ydC9taXNjL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvbWlzYy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworY2xlYW4tbm9pbnN0TElCUkFSSUVTOgorCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCitsaWJtaXNjLmE6ICQobGlibWlzY19hX09CSkVDVFMpICQobGlibWlzY19hX0RFUEVOREVOQ0lFUykgCisJLXJtIC1mIGxpYm1pc2MuYQorCSQobGlibWlzY19hX0FSKSBsaWJtaXNjLmEgJChsaWJtaXNjX2FfT0JKRUNUUykgJChsaWJtaXNjX2FfTElCQUREKQorCSQoUkFOTElCKSBsaWJtaXNjLmEKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2Zyb21fbG9jYWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21vdW50cG9pbnQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3RjcHdyYXBwZXIuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbWlzYy9mcm9tX2xvY2FsLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9taXNjL2Zyb21fbG9jYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRlOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbWlzYy9mcm9tX2xvY2FsLmMKQEAgLTAsMCArMSwyNjggQEAKKyAvKgorICAqIENoZWNrIGlmIGFuIGFkZHJlc3MgYmVsb25ncyB0byB0aGUgbG9jYWwgc3lzdGVtLiBBZGFwdGVkIGZyb206CisgICogCisgICogQCgjKXBtYXBfc3ZjLmMgMS4zMiA5MS8wMy8xMSBDb3B5cmlnaHQgMTk4NCwxOTkwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAgKiBAKCMpZ2V0X215YWRkcmVzcy5jICAyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQy4KKyAgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIykgZnJvbV9sb2NhbC5jIDEuMyA5Ni8wNS8zMSAxNTo1Mjo1NyI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJ0Y3B3cmFwcGVyLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUJVFJVRQkxCisjZGVmaW5lIEZBTFNFCTAKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9HRVRJRkFERFJTCisKKyNpbmNsdWRlIDxpZmFkZHJzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisvKioKKyAqIGZyb21fbG9jYWwgLSBkZXRlcm1pbmUgd2hldGhlciByZXF1ZXN0IGNvbWVzIGZyb20gdGhlIGxvY2FsIHN5c3RlbQorICogQHNhcDogcG9pbnRlciB0byBzb2NrZXQgYWRkcmVzcyB0byBjaGVjaworICoKKyAqIFdpdGggdmlydHVhbCBob3N0aW5nLCBlYWNoIGhhcmR3YXJlIG5ldHdvcmsgaW50ZXJmYWNlIGNhbiBoYXZlCisgKiBtdWx0aXBsZSBuZXR3b3JrIGFkZHJlc3Nlcy4gT24gc3VjaCBtYWNoaW5lcyB0aGUgbnVtYmVyIG9mIG1hY2hpbmUKKyAqIGFkZHJlc3NlcyBjYW4gYmUgc3VycHJpc2luZ2x5IGxhcmdlLgorICoKKyAqIFdlIGFsc28gZXhwZWN0IHRoZSBsb2NhbCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gdG8gY2hhbmdlIG92ZXIgdGltZSwKKyAqIHNvIGNhbGwgZ2V0aWZhZGRycygzKSBtb3JlIHRoYW4gb25jZSwgYnV0IG5vdCB0b28gb2Z0ZW4uCisgKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBzb2NrYWRkciBjb250YWlucyBhbiBhZGRyZXNzIG9mIG9uZSBvZiB0aGUgbG9jYWwKKyAqIG5ldHdvcmsgaW50ZXJmYWNlcy4gIE90aGVyd2lzZSBGQUxTRSBpcyByZXR1cm5lZC4KKyAqLworaW50Citmcm9tX2xvY2FsKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXN0YXRpYyBzdHJ1Y3QgaWZhZGRycyAqaWZhZGRyID0gTlVMTDsKKwlzdGF0aWMgdGltZV90IGxhc3RfdXBkYXRlID0gMDsKKwlzdHJ1Y3QgaWZhZGRycyAqaWZhOworCXVuc2lnbmVkIGludCBjb3VudDsKKwl0aW1lX3Qgbm93OworCisJaWYgKHRpbWUoJm5vdykgPT0gKCh0aW1lX3QpLTEpKSB7CisJCXhsb2coTF9FUlJPUiwgIiVzOiB0aW1lKDIpOiAlbSIsIF9fZnVuY19fKTsKKworCQkvKiBJZiB3ZSBkb24ndCBrbm93IHdoYXQgdGltZSBpdCBpcywgdXNlIHRoZQorCQkgKiBleGlzdGluZyBpZmFkZHIgbGlzdCwgaWYgb25lIGV4aXN0cyAgKi8KKwkJbm93ID0gbGFzdF91cGRhdGU7CisJCWlmIChpZmFkZHIgPT0gTlVMTCkKKwkJCW5vdysrOworCX0KKwlpZiAobm93ICE9IGxhc3RfdXBkYXRlKSB7CisJCXhsb2coRF9HRU5FUkFMLCAiJXM6IHVwZGF0aW5nIGxvY2FsIGlmIGFkZHIgbGlzdCIsIF9fZnVuY19fKTsKKworCQlpZiAoaWZhZGRyKQorCQkJZnJlZWlmYWRkcnMoaWZhZGRyKTsKKworCQlpZiAoZ2V0aWZhZGRycygmaWZhZGRyKSA9PSAtMSkgeworCQkJeGxvZyhMX0VSUk9SLCAiJXM6IGdldGlmYWRkcnMoMyk6ICVtIiwgX19mdW5jX18pOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJbGFzdF91cGRhdGUgPSBub3c7CisJfQorCisJY291bnQgPSAwOworCWZvciAoaWZhID0gaWZhZGRyOyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpIHsKKwkJaWYgKChpZmEtPmlmYV9mbGFncyAmIElGRl9VUCkgJiYKKwkJICAgIG5mc19jb21wYXJlX3NvY2thZGRyKHNhcCwgaWZhLT5pZmFfYWRkcikpIHsKKwkJCXhsb2coRF9HRU5FUkFMLCAiJXM6IGluY29taW5nIGFkZHJlc3MgbWF0Y2hlcyAiCisJCQkJCSJsb2NhbCBpbnRlcmZhY2UgYWRkcmVzcyIsIF9fZnVuY19fKTsKKwkJCXJldHVybiBUUlVFOworCQl9IGVsc2UKKwkJCWNvdW50Kys7CisJfQorCisJeGxvZyhEX0dFTkVSQUwsICIlczogY2hlY2tlZCAldSBsb2NhbCBpZiBhZGRyczsgIgorCQkJImluY29taW5nIGFkZHJlc3Mgbm90IGZvdW5kIiwgX19mdW5jX18sIGNvdW50KTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKyNlbHNlCS8qICFIQVZFX0dFVElGQUREUlMgKi8KKworc3RhdGljIGludCBudW1fbG9jYWw7CitzdGF0aWMgaW50IG51bV9hZGRyczsKK3N0YXRpYyBzdHJ1Y3QgaW5fYWRkciAqYWRkcnM7CisKKy8qIGdyb3dfYWRkcnMgLSBleHRlbmQgbGlzdCBvZiBsb2NhbCBpbnRlcmZhY2UgYWRkcmVzc2VzICovCisKK3N0YXRpYyBpbnQgZ3Jvd19hZGRycyh2b2lkKQoreworICAgIHN0cnVjdCBpbl9hZGRyICpuZXdfYWRkcnM7CisgICAgaW50ICAgICBuZXdfbnVtOworCisgICAgLyoKKyAgICAgKiBLZWVwIHRoZSBwcmV2aW91cyByZXN1bHQgaWYgd2UgcnVuIG91dCBvZiBtZW1vcnkuIFRoZSBzeXN0ZW0gd291bGQKKyAgICAgKiByZWFsbHkgZ2V0IGhvc2VkIGlmIHdlIHNpbXBseSBnaXZlIHVwLgorICAgICAqLworICAgIG5ld19udW0gPSAoYWRkcnMgPT0gMCkgPyAxIDogbnVtX2FkZHJzICsgbnVtX2FkZHJzOworICAgIG5ld19hZGRycyA9IChzdHJ1Y3QgaW5fYWRkciAqKSBtYWxsb2Moc2l6ZW9mKCphZGRycykgKiBuZXdfbnVtKTsKKyAgICBpZiAobmV3X2FkZHJzID09IDApIHsKKwl4bG9nX3dhcm4oIiVzOiBvdXQgb2YgbWVtb3J5IiwgX19mdW5jX18pOworCXJldHVybiAoMCk7CisgICAgfSBlbHNlIHsKKwlpZiAoYWRkcnMgIT0gMCkgeworCSAgICBtZW1jcHkoKGNoYXIgKikgbmV3X2FkZHJzLCAoY2hhciAqKSBhZGRycywKKwkJICAgc2l6ZW9mKCphZGRycykgKiBudW1fYWRkcnMpOworCSAgICBmcmVlKChjaGFyICopIGFkZHJzKTsKKwl9CisJbnVtX2FkZHJzID0gbmV3X251bTsKKwlhZGRycyA9IG5ld19hZGRyczsKKwlyZXR1cm4gKDEpOworICAgIH0KK30KKworLyogZmluZF9sb2NhbCAtIGZpbmQgYWxsIElQIGFkZHJlc3NlcyBmb3IgdGhpcyBob3N0ICovCitzdGF0aWMgaW50CitmaW5kX2xvY2FsKHZvaWQpCit7CisgICAgc3RydWN0IGlmY29uZiBpZmM7CisgICAgc3RydWN0IGlmcmVxIGlmcmVxOworICAgIHN0cnVjdCBpZnJlcSAqaWZyOworICAgIHN0cnVjdCBpZnJlcSAqdGhlX2VuZDsKKyAgICBpbnQgICAgIHNvY2s7CisgICAgY2hhciAgICBidWZbQlVGU0laXTsKKworICAgIC8qCisgICAgICogR2V0IGxpc3Qgb2YgbmV0d29yayBpbnRlcmZhY2VzLiBXZSB1c2UgYSBodWdlIGJ1ZmZlciB0byBhbGxvdyBmb3IgdGhlCisgICAgICogcHJlc2VuY2Ugb2Ygbm9uLUlQIGludGVyZmFjZXMuCisgICAgICovCisKKyAgICBpZiAoKHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgeworCXhsb2dfd2FybigiJXM6IHNvY2tldCgyKTogJW0iLCBfX2Z1bmNfXyk7CisJcmV0dXJuICgwKTsKKyAgICB9CisgICAgaWZjLmlmY19sZW4gPSBzaXplb2YoYnVmKTsKKyAgICBpZmMuaWZjX2J1ZiA9IGJ1ZjsKKyAgICBpZiAoaW9jdGwoc29jaywgU0lPQ0dJRkNPTkYsIChjaGFyICopICZpZmMpIDwgMCkgeworCXhsb2dfd2FybigiJXM6IGlvY3RsKFNJT0NHSUZDT05GKTogJW0iLCBfX2Z1bmNfXyk7CisJKHZvaWQpIGNsb3NlKHNvY2spOworCXJldHVybiAoMCk7CisgICAgfQorICAgIC8qIEdldCBJUCBhZGRyZXNzIG9mIGVhY2ggYWN0aXZlIElQIG5ldHdvcmsgaW50ZXJmYWNlLiAqLworCisgICAgdGhlX2VuZCA9IChzdHJ1Y3QgaWZyZXEgKikgKGlmYy5pZmNfYnVmICsgaWZjLmlmY19sZW4pOworICAgIG51bV9sb2NhbCA9IDA7CisgICAgZm9yIChpZnIgPSBpZmMuaWZjX3JlcTsgaWZyIDwgdGhlX2VuZDsgaWZyKyspIHsKKwlpZiAoaWZyLT5pZnJfYWRkci5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewkvKiBJUCBuZXQgaW50ZXJmYWNlICovCisJICAgIGlmcmVxID0gKmlmcjsKKwkgICAgaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZGTEFHUywgKGNoYXIgKikgJmlmcmVxKSA8IDApIHsKKwkJeGxvZ193YXJuKCIlczogaW9jdGwoU0lPQ0dJRkZMQUdTKTogJW0iLCBfX2Z1bmNfXyk7CisJICAgIH0gZWxzZSBpZiAoaWZyZXEuaWZyX2ZsYWdzICYgSUZGX1VQKSB7CS8qIGFjdGl2ZSBpbnRlcmZhY2UgKi8KKwkJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZBRERSLCAoY2hhciAqKSAmaWZyZXEpIDwgMCkgeworCQkgICAgeGxvZ193YXJuKCIlczogaW9jdGwoU0lPQ0dJRkFERFIpOiAlbSIsIF9fZnVuY19fKTsKKwkJfSBlbHNlIHsKKwkJICAgIGlmIChudW1fbG9jYWwgPj0gbnVtX2FkZHJzKQorCQkJaWYgKGdyb3dfYWRkcnMoKSA9PSAwKQorCQkJICAgIGJyZWFrOworCQkgICAgYWRkcnNbbnVtX2xvY2FsKytdID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKKwkJCQkJICAmIGlmcmVxLmlmcl9hZGRyKS0+c2luX2FkZHI7CisJCX0KKwkgICAgfQorCX0KKwkvKiBTdXBwb3J0IGZvciB2YXJpYWJsZS1sZW5ndGggYWRkcmVzc2VzLiAqLworI2lmZGVmIEhBU19TQV9MRU4KKwlpZnIgPSAoc3RydWN0IGlmcmVxICopICgoY2FkZHJfdCkgaWZyCisJCSAgICAgICsgaWZyLT5pZnJfYWRkci5zYV9sZW4gLSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisjZW5kaWYKKyAgICB9CisgICAgKHZvaWQpIGNsb3NlKHNvY2spOworICAgIHJldHVybiAobnVtX2xvY2FsKTsKK30KKworLyoqCisgKiBmcm9tX2xvY2FsIC0gZGV0ZXJtaW5lIHdoZXRoZXIgcmVxdWVzdCBjb21lcyBmcm9tIHRoZSBsb2NhbCBzeXN0ZW0KKyAqIEBzYXA6IHBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3MgdG8gY2hlY2sKKyAqCisgKiBXaXRoIHZpcnR1YWwgaG9zdGluZywgZWFjaCBoYXJkd2FyZSBuZXR3b3JrIGludGVyZmFjZSBjYW4gaGF2ZQorICogbXVsdGlwbGUgbmV0d29yayBhZGRyZXNzZXMuIE9uIHN1Y2ggbWFjaGluZXMgdGhlIG51bWJlciBvZiBtYWNoaW5lCisgKiBhZGRyZXNzZXMgY2FuIGJlIHN1cnByaXNpbmdseSBsYXJnZS4KKyAqCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIHNvY2thZGRyIGNvbnRhaW5zIGFuIGFkZHJlc3Mgb2Ygb25lIG9mIHRoZSBsb2NhbAorICogbmV0d29yayBpbnRlcmZhY2VzLiAgT3RoZXJ3aXNlIEZBTFNFIGlzIHJldHVybmVkLgorICovCitpbnQKK2Zyb21fbG9jYWwoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICphZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcDsKKyAgICBpbnQgICAgIGk7CisKKyAgICBpZiAoc2FwLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkKKwlyZXR1cm4gKEZBTFNFKTsKKworICAgIGlmIChhZGRycyA9PSAwICYmIGZpbmRfbG9jYWwoKSA9PSAwKQorCXhsb2coTF9FUlJPUiwgIkNhbm5vdCBmaW5kIGFueSBhY3RpdmUgbG9jYWwgbmV0d29yayBpbnRlcmZhY2VzIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2xvY2FsOyBpKyspIHsKKwlpZiAobWVtY21wKChjaGFyICopICYoYWRkci0+c2luX2FkZHIpLCAoY2hhciAqKSAmKGFkZHJzW2ldKSwKKwkJICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgPT0gMCkKKwkgICAgcmV0dXJuIChUUlVFKTsKKyAgICB9CisgICAgcmV0dXJuIChGQUxTRSk7Cit9CisKKyNpZmRlZiBURVNUCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50ICAgICBpOworCisgICAgZmluZF9sb2NhbCgpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fbG9jYWw7IGkrKykKKwlwcmludGYoIiVzXG4iLCBpbmV0X250b2EoYWRkcnNbaV0pKTsKK30KKworI2VuZGlmCS8qIFRFU1QgKi8KKworI2VuZGlmCS8qICFIQVZFX0dFVElGQUREUlMgKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvbW91bnRwb2ludC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbWlzYy9tb3VudHBvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyZmI5MgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvbW91bnRwb2ludC5jCkBAIC0wLDAgKzEsMzkgQEAKKworLyoKKyAqIGNoZWNrIGlmIGEgZ2l2ZW4gcGF0aCBpcyBhIG1vdW50cG9pbnQgCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInhjb21tb24uaCIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCitpbnQKK2lzX21vdW50cG9pbnQoY2hhciAqcGF0aCkKK3sKKwkvKiBDaGVjayBpZiAncGF0aCcgaXMgYSBjdXJyZW50IG1vdW50cG9pbnQuCisJICogUG9zc2libHkgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaXQgaXMgdGhlIG1vdW50cG9pbnQgb2YgdGhlIAorCSAqIGZpbGVzeXN0ZW0gaG9sZGluZyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSwgYnV0IHRoZXJlIGRvZXNuJ3QKKwkgKiBzZWVtIGEgbG90IG9mIHBvaW50LgorCSAqCisJICogV2UgZGVlbSBpdCB0byBiZSBhIG1vdW50cG9pbnQgaWYgYXBwZW5kaW5nIGEgIi4uIiBnaXZlcyBhIGRpZmZlcmVudAorCSAqIGRldmljZSBvciB0aGUgc2FtZSBpbm9kZSBudW1iZXIuCisJICovCisJY2hhciAqZG90ZG90OworCXN0cnVjdCBzdGF0IHN0YiwgcHN0YjsKKwlpbnQgcnY7CisKKwlkb3Rkb3QgPSB4bWFsbG9jKHN0cmxlbihwYXRoKSs0KTsKKworCXN0cmNhdChzdHJjcHkoZG90ZG90LCBwYXRoKSwgIi8uLiIpOworCWlmIChsc3RhdChwYXRoLCAmc3RiKSAhPSAwIHx8CisJICAgIGxzdGF0KGRvdGRvdCwgJnBzdGIpICE9IDApCisJCXJ2ID0gMDsKKwllbHNlCisJCWlmIChzdGIuc3RfZGV2ICE9IHBzdGIuc3RfZGV2IHx8CisJCSAgICBzdGIuc3RfaW5vID09IHBzdGIuc3RfaW5vKQorCQkJcnYgPSAxOworCQllbHNlCisJCQlydiA9IDA7CisJZnJlZShkb3Rkb3QpOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvdGNwd3JhcHBlci5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbWlzYy90Y3B3cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiMGE0NgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L21pc2MvdGNwd3JhcHBlci5jCkBAIC0wLDAgKzEsMjY5IEBACisvKiBUaGlzIGlzIGNvcGllZCBmcm9tIHBvcnRtYXAgNC4wLTI5IGluIFJlZEhhdC4gKi8KKworIC8qCisgICogcG1hcF9jaGVjayAtIGFkZGl0aW9uYWwgcG9ydG1hcCBzZWN1cml0eS4KKyAgKiAKKyAgKiBBbHdheXMgcmVqZWN0IG5vbi1sb2NhbCByZXF1ZXN0cyB0byB1cGRhdGUgdGhlIHBvcnRtYXBwZXIgdGFibGVzLgorICAqIAorICAqIFJlZnVzZSB0byBmb3J3YXJkIG1vdW50IHJlcXVlc3RzIHRvIHRoZSBuZnMgbW91bnQgZGFlbW9uLiBPdGhlcndpc2UsIHRoZQorICAqIHJlcXVlc3RzIHdvdWxkIGFwcGVhciB0byBjb21lIGZyb20gdGhlIGxvY2FsIHN5c3RlbSwgYW5kIG5mcyBleHBvcnQKKyAgKiByZXN0cmljdGlvbnMgY291bGQgYmUgYnlwYXNzZWQuCisgICogCisgICogUmVmdXNlIHRvIGZvcndhcmQgcmVxdWVzdHMgdG8gdGhlIG5mc2QgcHJvY2Vzcy4KKyAgKiAKKyAgKiBSZWZ1c2UgdG8gZm9yd2FyZCByZXF1ZXN0cyB0byBOSVMgKFlQKSBkYWVtb25zOyBUaGUgb25seSBleGNlcHRpb24gaXMgdGhlCisgICogWVBQUk9DX0RPTUFJTl9OT05BQ0sgYnJvYWRjYXN0IHJwYyBjYWxsIHRoYXQgaXMgdXNlZCB0byBlc3RhYmxpc2ggaW5pdGlhbAorICAqIGNvbnRhY3Qgd2l0aCB0aGUgTklTIHNlcnZlci4KKyAgKiAKKyAgKiBBbHdheXMgYWxsb2NhdGUgYW4gdW5wcml2aWxlZ2VkIHBvcnQgd2hlbiBmb3J3YXJkaW5nIGEgcmVxdWVzdC4KKyAgKiAKKyAgKiBJZiBjb21waWxlZCB3aXRoIC1EQ0hFQ0tfUE9SVCwgcmVxdWlyZSB0aGF0IHJlcXVlc3RzIHRvIHJlZ2lzdGVyIG9yCisgICogdW5yZWdpc3RlciBhIHByaXZpbGVnZWQgcG9ydCBjb21lIGZyb20gYSBwcml2aWxlZ2VkIHBvcnQuIFRoaXMgbWFrZXMgaXQKKyAgKiBtb3JlIGRpZmZpY3VsdCB0byByZXBsYWNlIGEgY3JpdGljYWwgc2VydmljZSBieSBhIHRyb2phbi4KKyAgKiAKKyAgKiBJZiBjb21waWxlZCB3aXRoIC1ESE9TVFNfQUNDRVNTLCByZWplY3QgcmVxdWVzdHMgZnJvbSBob3N0cyB0aGF0IGFyZSBub3QKKyAgKiBhdXRob3JpemVkIGJ5IHRoZSAvZXRjL2hvc3RzLnthbGxvdyxkZW55fSBmaWxlcy4gVGhlIGxvY2FsIHN5c3RlbSBpcworICAqIGFsd2F5cyB0cmVhdGVkIGFzIGFuIGF1dGhvcml6ZWQgaG9zdC4gVGhlIGFjY2VzcyBjb250cm9sIHRhYmxlcyBhcmUgbmV2ZXIKKyAgKiBjb25zdWx0ZWQgZm9yIHJlcXVlc3RzIGZyb20gdGhlIGxvY2FsIHN5c3RlbSwgYW5kIGFyZSBhbHdheXMgY29uc3VsdGVkCisgICogZm9yIHJlcXVlc3RzIGZyb20gb3RoZXIgaG9zdHMuCisgICogCisgICogQXV0aG9yOiBXaWV0c2UgVmVuZW1hICh3aWV0c2VAd3p2Lndpbi50dWUubmwpLCBkZXB0LiBvZiBNYXRoZW1hdGljcyBhbmQKKyAgKiBDb21wdXRpbmcgU2NpZW5jZSwgRWluZGhvdmVuIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSwgVGhlIE5ldGhlcmxhbmRzLgorICAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0xJQldSQVAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dGNwZC5oPgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJ0Y3B3cmFwcGVyLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCisjaWZkZWYgU1lTVjQwCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHJwYy9ycGNlbnQuaD4KKyNlbmRpZgkvKiBTWVNWNDAgKi8KKworI2RlZmluZSBBTExPVyAxCisjZGVmaW5lIERFTlkgMAorCisjaWZkZWYgSVBWNl9TVVBQT1JURUQKK3N0YXRpYyB2b2lkCitwcmVzZW50X2FkZHJlc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsIGNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGJ1ZmxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwOworCXNvY2tsZW5fdCBsZW4gPSAoc29ja2xlbl90KWJ1ZmxlbjsKKworCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWlmIChpbmV0X250b3AoQUZfSU5FVCwgJnNpbi0+c2luX2FkZHIsIGJ1ZiwgbGVuKSAhPSAwKQorCQkJcmV0dXJuOworCWNhc2UgQUZfSU5FVDY6CisJCWlmIChpbmV0X250b3AoQUZfSU5FVDYsICZzaW42LT5zaW42X2FkZHIsIGJ1ZiwgbGVuKSAhPSAwKQorCQkJcmV0dXJuOworCX0KKworCW1lbXNldChidWYsIDAsIGJ1Zmxlbik7CisJc3RybmNweShidWYsICJ1bnJlY29nbml6ZWQgY2FsbGVyIiwgYnVmbGVuKTsKK30KKyNlbHNlCS8qICFJUFY2X1NVUFBPUlRFRCAqLworc3RhdGljIHZvaWQKK3ByZXNlbnRfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY2hhciAqYnVmLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcDsKKwlzb2NrbGVuX3QgbGVuID0gKHNvY2tsZW5fdClidWZsZW47CisKKwlpZiAoc2FwLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJaWYgKGluZXRfbnRvcChBRl9JTkVULCAmc2luLT5zaW5fYWRkciwgYnVmLCBsZW4pICE9IDApCisJCQlyZXR1cm47CisKKwltZW1zZXQoYnVmLCAwLCBidWZsZW4pOworCXN0cm5jcHkoYnVmLCAidW5yZWNvZ25pemVkIGNhbGxlciIsIChzaXplX3QpYnVmbGVuKTsKK30KKyNlbmRpZgkvKiAhSVBWNl9TVVBQT1JURUQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2hhY2Nlc3NfdCB7CisJVEFJTFFfRU5UUlkoX2hhY2Nlc3NfdCkJbGlzdDsKKwlpbnQJCQlhbGxvd2VkOworCXVuaW9uIG5mc19zb2NrYWRkcglhZGRyZXNzOworfSBoYWNjZXNzX3Q7CisKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFIDEwMjEKK3R5cGVkZWYgc3RydWN0IF9oYXNoX2hlYWQgeworCVRBSUxRX0hFQUQoaG9zdF9saXN0LCBfaGFjY2Vzc190KSBoX2hlYWQ7Cit9IGhhc2hfaGVhZDsKKworc3RhdGljIGhhc2hfaGVhZCBoYWNjZXNzX3RibFtIQVNIX1RBQkxFX1NJWkVdOworCitzdGF0aWMgdW5zaWduZWQgbG9uZworc3RydG9pbnQoY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbiA9IDA7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQluICs9ICh1bnNpZ25lZCBjaGFyKXN0cltpXSAqIGk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraGFzaGludChjb25zdCB1bnNpZ25lZCBsb25nIG51bSkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkobnVtICUgSEFTSF9UQUJMRV9TSVpFKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorSEFTSChjb25zdCBjaGFyICphZGRyLCBjb25zdCB1bnNpZ25lZCBsb25nIHByb2dyYW0pCit7CisJcmV0dXJuIGhhc2hpbnQoc3RydG9pbnQoYWRkcikgKyBwcm9ncmFtKTsKK30KKworc3RhdGljIHZvaWQKK2hhY2Nlc3NfYWRkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCBjaGFyICphZGRyZXNzLAorCQljb25zdCB1bnNpZ25lZCBsb25nIHByb2dyYW0sIGNvbnN0IGludCBhbGxvd2VkKQoreworCWhhc2hfaGVhZCAqaGVhZDsKKwloYWNjZXNzX3QgKmhwdHI7CisJdW5zaWduZWQgaW50IGhhc2g7CisKKwlocHRyID0gKGhhY2Nlc3NfdCAqKW1hbGxvYyhzaXplb2YoaGFjY2Vzc190KSk7CisJaWYgKGhwdHIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaGFzaCA9IEhBU0goYWRkcmVzcywgcHJvZ3JhbSk7CisJaGVhZCA9ICYoaGFjY2Vzc190YmxbaGFzaF0pOworCisJaHB0ci0+YWxsb3dlZCA9IGFsbG93ZWQ7CisJbWVtY3B5KCZocHRyLT5hZGRyZXNzLCBzYXAsIChzaXplX3QpbmZzX3NvY2thZGRyX2xlbmd0aChzYXApKTsKKworCWlmIChUQUlMUV9FTVBUWSgmaGVhZC0+aF9oZWFkKSkKKwkJVEFJTFFfSU5TRVJUX0hFQUQoJmhlYWQtPmhfaGVhZCwgaHB0ciwgbGlzdCk7CisJZWxzZQorCQlUQUlMUV9JTlNFUlRfVEFJTCgmaGVhZC0+aF9oZWFkLCBocHRyLCBsaXN0KTsKK30KKworc3RhdGljIGhhY2Nlc3NfdCAqCitoYWNjZXNzX2xvb2t1cChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3QgY2hhciAqYWRkcmVzcywKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBwcm9ncmFtKQoreworCWhhc2hfaGVhZCAqaGVhZDsKKwloYWNjZXNzX3QgKmhwdHI7CisJdW5zaWduZWQgaW50IGhhc2g7CisKKwloYXNoID0gSEFTSChhZGRyZXNzLCBwcm9ncmFtKTsKKwloZWFkID0gJihoYWNjZXNzX3RibFtoYXNoXSk7CisKKwlUQUlMUV9GT1JFQUNIKGhwdHIsICZoZWFkLT5oX2hlYWQsIGxpc3QpIHsKKwkJaWYgKG5mc19jb21wYXJlX3NvY2thZGRyKCZocHRyLT5hZGRyZXNzLnNhLCBzYXApKQorCQkJcmV0dXJuIGhwdHI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorbG9naXQoY29uc3QgY2hhciAqYWRkcmVzcykKK3sKKwl4bG9nX3dhcm4oImNvbm5lY3QgZnJvbSAlcyBkZW5pZWQ6IHJlcXVlc3QgZnJvbSB1bmF1dGhvcml6ZWQgaG9zdCIsCisJCQlhZGRyZXNzKTsKK30KKworc3RhdGljIGludAorZ29vZF9jbGllbnQoY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJc3RydWN0IHJlcXVlc3RfaW5mbyByZXE7CisKKwlyZXF1ZXN0X2luaXQoJnJlcSwgUlFfREFFTU9OLCBuYW1lLCBSUV9DTElFTlRfU0lOLCBzYXAsIDApOworCXNvY2tfbWV0aG9kcygmcmVxKTsKKworCWlmIChob3N0c19hY2Nlc3MoJnJlcSkpIAorCQlyZXR1cm4gQUxMT1c7CisKKwlyZXR1cm4gREVOWTsKK30KKworc3RhdGljIGludAorY2hlY2tfZmlsZXModm9pZCkKK3sKKwlzdGF0aWMgdGltZV90IGFsbG93X210aW1lLCBkZW55X210aW1lOworCXN0cnVjdCBzdGF0IGFzdGF0LCBkc3RhdDsKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwlpZiAoc3RhdCgiL2V0Yy9ob3N0cy5hbGxvdyIsICZhc3RhdCkgPCAwKQorCQlhc3RhdC5zdF9tdGltZSA9IDA7CisJaWYgKHN0YXQoIi9ldGMvaG9zdHMuZGVueSIsICZkc3RhdCkgPCAwKQorCQlkc3RhdC5zdF9tdGltZSA9IDA7CisKKwlpZighYXN0YXQuc3RfbXRpbWUgfHwgIWRzdGF0LnN0X210aW1lKQorCQlyZXR1cm4gY2hhbmdlZDsKKworCWlmIChhc3RhdC5zdF9tdGltZSAhPSBhbGxvd19tdGltZSkKKwkJY2hhbmdlZCA9IDE7CisJZWxzZSBpZiAoZHN0YXQuc3RfbXRpbWUgIT0gZGVueV9tdGltZSkKKwkJY2hhbmdlZCA9IDE7CisKKwlhbGxvd19tdGltZSA9IGFzdGF0LnN0X210aW1lOworCWRlbnlfbXRpbWUgPSBkc3RhdC5zdF9tdGltZTsKKworCXJldHVybiBjaGFuZ2VkOworfQorCisvKioKKyAqIGNoZWNrX2RlZmF1bHQgLSBhZGRpdGlvbmFsIGNoZWNrcyBmb3IgTlVMTCwgRFVNUCwgR0VUUE9SVCBhbmQgdW5rbm93bgorICogQG5hbWU6IHBvaW50ZXIgdG8gJ1wwJy10ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIG5hbWUgb2YgdGhlCisgKgkJZGFlbW9uIHJlcXVlc3RpbmcgdGhlIGFjY2VzcyBjaGVjaworICogQHNhcDogcG9pbnRlciB0byBzb2NrYWRkciBjb250YWluaW5nIG5ldHdvcmsgYWRkcmVzcyBvZiBjYWxsZXIKKyAqIEBwcm9ncmFtOiBSUEMgcHJvZ3JhbSBudW1iZXIgY2FsbGVyIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzCisgKgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBjYWxsZXIgaXMgYWxsb3dlZCBhY2Nlc3M7IG90aGVyd2lzZSBGQUxTRSBpcyByZXR1cm5lZC4KKyAqLworaW50CitjaGVja19kZWZhdWx0KGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCB1bnNpZ25lZCBsb25nIHByb2dyYW0pCit7CisJaGFjY2Vzc190ICphY2MgPSBOVUxMOworCWludCBjaGFuZ2VkID0gY2hlY2tfZmlsZXMoKTsKKwljaGFyIGJ1ZltJTkVUNl9BRERSU1RSTEVOXTsKKworCXByZXNlbnRfYWRkcmVzcyhzYXAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisJYWNjID0gaGFjY2Vzc19sb29rdXAoc2FwLCBidWYsIHByb2dyYW0pOworCWlmIChhY2MgIT0gTlVMTCAmJiBjaGFuZ2VkID09IDApIHsKKwkJeGxvZyhEX0dFTkVSQUwsICIlczogYWNjZXNzIGJ5ICVzICVzIChjYWNoZWQpIiwgX19mdW5jX18sCisJCQlidWYsIGFjYy0+YWxsb3dlZCA/ICJBTExPV0VEIiA6ICJERU5JRUQiKTsKKwkJcmV0dXJuIGFjYy0+YWxsb3dlZDsKKwl9CisKKwlpZiAoIShmcm9tX2xvY2FsKHNhcCkgfHwgZ29vZF9jbGllbnQobmFtZSwgc2FwKSkpIHsKKwkJbG9naXQoYnVmKTsKKwkJaWYgKGFjYyAhPSBOVUxMKQorCQkJYWNjLT5hbGxvd2VkID0gRkFMU0U7CisJCWVsc2UKKwkJCWhhY2Nlc3NfYWRkKHNhcCwgYnVmLCBwcm9ncmFtLCBGQUxTRSk7CisJCXhsb2coRF9HRU5FUkFMLCAiJXM6IGFjY2VzcyBieSAlcyBERU5JRUQiLCBfX2Z1bmNfXywgYnVmKTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCisJaWYgKGFjYyAhPSBOVUxMKQorCQlhY2MtPmFsbG93ZWQgPSBUUlVFOworCWVsc2UKKwkJaGFjY2Vzc19hZGQoc2FwLCBidWYsIHByb2dyYW0sIFRSVUUpOworCXhsb2coRF9HRU5FUkFMLCAiJXM6IGFjY2VzcyBieSAlcyBBTExPV0VEIiwgX19mdW5jX18sIGJ1Zik7CisKKwlyZXR1cm4gKFRSVUUpOworfQorCisjZW5kaWYJLyogSEFWRV9MSUJXUkFQICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MDBiMgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworbm9pbnN0X0xJQlJBUklFUyA9IGxpYm5mcy5hCitsaWJuZnNfYV9TT1VSQ0VTID0gZXhwb3J0cy5jIHJtdGFiLmMgeGlvLmMgcnBjbWlzYy5jIHJwY2Rpc3BhdGNoLmMgXAorCQkgICB4bG9nLmMgeGNvbW1vbi5jIHdpbGRtYXQuYyBuZnNjbGllbnQuYyBcCisJCSAgIG5mc2V4cG9ydC5jIGdldGZoLmMgbmZzY3RsLmMgcnBjX3NvY2tldC5jIGdldHBvcnQuYyBcCisJCSAgIHN2Y19zb2NrZXQuYyBjYWNoZWlvLmMgY2xvc2VhbGwuYyBuZnNfbW50ZW50LmMgY29uZmZpbGUuYyBcCisJCSAgIHN2Y19jcmVhdGUuYworCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJjNGQwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNTU0IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzdWJkaXIgPSBzdXBwb3J0L25mcworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK0xJQlJBUklFUyA9ICQobm9pbnN0X0xJQlJBUklFUykKK0FSRkxBR1MgPSBjcnUKK2xpYm5mc19hX0FSID0gJChBUikgJChBUkZMQUdTKQorbGlibmZzX2FfTElCQUREID0KK2FtX2xpYm5mc19hX09CSkVDVFMgPSBleHBvcnRzLiQoT0JKRVhUKSBybXRhYi4kKE9CSkVYVCkgeGlvLiQoT0JKRVhUKSBcCisJcnBjbWlzYy4kKE9CSkVYVCkgcnBjZGlzcGF0Y2guJChPQkpFWFQpIHhsb2cuJChPQkpFWFQpIFwKKwl4Y29tbW9uLiQoT0JKRVhUKSB3aWxkbWF0LiQoT0JKRVhUKSBuZnNjbGllbnQuJChPQkpFWFQpIFwKKwluZnNleHBvcnQuJChPQkpFWFQpIGdldGZoLiQoT0JKRVhUKSBuZnNjdGwuJChPQkpFWFQpIFwKKwlycGNfc29ja2V0LiQoT0JKRVhUKSBnZXRwb3J0LiQoT0JKRVhUKSBzdmNfc29ja2V0LiQoT0JKRVhUKSBcCisJY2FjaGVpby4kKE9CSkVYVCkgY2xvc2VhbGwuJChPQkpFWFQpIG5mc19tbnRlbnQuJChPQkpFWFQpIFwKKwljb25mZmlsZS4kKE9CSkVYVCkgc3ZjX2NyZWF0ZS4kKE9CSkVYVCkKK2xpYm5mc19hX09CSkVDVFMgPSAkKGFtX2xpYm5mc19hX09CSkVDVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGlibmZzX2FfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGlibmZzX2FfU09VUkNFUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitub2luc3RfTElCUkFSSUVTID0gbGlibmZzLmEKK2xpYm5mc19hX1NPVVJDRVMgPSBleHBvcnRzLmMgcm10YWIuYyB4aW8uYyBycGNtaXNjLmMgcnBjZGlzcGF0Y2guYyBcCisJCSAgIHhsb2cuYyB4Y29tbW9uLmMgd2lsZG1hdC5jIG5mc2NsaWVudC5jIFwKKwkJICAgbmZzZXhwb3J0LmMgZ2V0ZmguYyBuZnNjdGwuYyBycGNfc29ja2V0LmMgZ2V0cG9ydC5jIFwKKwkJICAgc3ZjX3NvY2tldC5jIGNhY2hlaW8uYyBjbG9zZWFsbC5jIG5mc19tbnRlbnQuYyBjb25mZmlsZS5jIFwKKwkJICAgc3ZjX2NyZWF0ZS5jCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvbmZzL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHN1cHBvcnQvbmZzL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCitjbGVhbi1ub2luc3RMSUJSQVJJRVM6CisJLXRlc3QgLXogIiQobm9pbnN0X0xJQlJBUklFUykiIHx8IHJtIC1mICQobm9pbnN0X0xJQlJBUklFUykKK2xpYm5mcy5hOiAkKGxpYm5mc19hX09CSkVDVFMpICQobGlibmZzX2FfREVQRU5ERU5DSUVTKSAKKwktcm0gLWYgbGlibmZzLmEKKwkkKGxpYm5mc19hX0FSKSBsaWJuZnMuYSAkKGxpYm5mc19hX09CSkVDVFMpICQobGlibmZzX2FfTElCQUREKQorCSQoUkFOTElCKSBsaWJuZnMuYQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2FjaGVpby5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvY2xvc2VhbGwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NvbmZmaWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9leHBvcnRzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nZXRmaC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ2V0cG9ydC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbmZzX21udGVudC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbmZzY2xpZW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZnNjdGwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL25mc2V4cG9ydC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcm10YWIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY19zb2NrZXQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY2Rpc3BhdGNoLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ycGNtaXNjLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNfY3JlYXRlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNfc29ja2V0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS93aWxkbWF0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94Y29tbW9uLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS94aW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3hsb2cuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChMSUJSQVJJRVMpCitpbnN0YWxsZGlyczoKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2NhY2hlaW8uYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9jYWNoZWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNWQ4NAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9jYWNoZWlvLmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBzdXBwb3J0L25mcy9jYWNoZWlvLmMKKyAqIHN1cHBvcnQgSU8gb24gdGhlIGNhY2hlIGNoYW5uZWwgZmlsZXMgaW4gMi41IGFuZCBiZXlvbmQuCisgKiBUaGVzZSB1c2UgJ3F3b3Jkcycgd2hpY2ggYXJlIGxpa2Ugd29yZHMsIGJ1dCB3aXRoIGEgbGl0dGxlIHF1b3RpbmcuCisgKgorICovCisKKworLyoKKyAqIFN1cHBvcnQgcm91dGluZXMgZm9yIHRleHQtYmFzZWQgdXBjYWxscy4KKyAqIEZpZWxkcyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcy4KKyAqIEZpZWxkcyBhcmUgZWl0aGVyIG1hbmdsZWQgdG8gcXVvdGUgc3BhY2UgdGFiIG5ld2xpbmUgc2xvc2ggd2l0aCBzbG9zaAorICogb3IgYSBoZXhpZmllZCB3aXRoIGEgbGVhZGluZyBceAorICogUmVjb3JkIGlzIHRlcm1pbmF0ZWQgd2l0aCBuZXdsaW5lLgorICoKKyAqLworCisjaW5jbHVkZSA8bmZzbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpb19leHQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKwordm9pZCBxd29yZF9hZGQoY2hhciAqKmJwcCwgaW50ICpscCwgY2hhciAqc3RyKQoreworCWNoYXIgKmJwID0gKmJwcDsKKwlpbnQgbGVuID0gKmxwOworCWNoYXIgYzsKKworCWlmIChsZW4gPCAwKSByZXR1cm47CisKKwl3aGlsZSAoKGM9KnN0cisrKSAmJiBsZW4pCisJCXN3aXRjaChjKSB7CisJCWNhc2UgJyAnOgorCQljYXNlICdcdCc6CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXFwnOgorCQkJaWYgKGxlbiA+PSA0KSB7CisJCQkJKmJwKysgPSAnXFwnOworCQkJCSpicCsrID0gJzAnICsgKChjICYgMDMwMCk+PjYpOworCQkJCSpicCsrID0gJzAnICsgKChjICYgMDA3MCk+PjMpOworCQkJCSpicCsrID0gJzAnICsgKChjICYgMDAwNyk+PjApOworCQkJfQorCQkJbGVuIC09IDQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCSpicCsrID0gYzsKKwkJCWxlbi0tOworCQl9CisJaWYgKGMgfHwgbGVuIDwxKSBsZW4gPSAtMTsKKwllbHNlIHsKKwkJKmJwKysgPSAnICc7CisJCWxlbi0tOworCX0KKwkqYnBwID0gYnA7CisJKmxwID0gbGVuOworfQorCit2b2lkIHF3b3JkX2FkZGhleChjaGFyICoqYnBwLCBpbnQgKmxwLCBjaGFyICpidWYsIGludCBibGVuKQoreworCWNoYXIgKmJwID0gKmJwcDsKKwlpbnQgbGVuID0gKmxwOworCisJaWYgKGxlbiA8IDApIHJldHVybjsKKworCWlmIChsZW4gPiAyKSB7CisJCSpicCsrID0gJ1xcJzsKKwkJKmJwKysgPSAneCc7CisJCWxlbiAtPSAyOworCQl3aGlsZSAoYmxlbiAmJiBsZW4gPj0gMikgeworCQkJdW5zaWduZWQgY2hhciBjID0gKmJ1ZisrOworCQkJKmJwKysgPSAnMCcgKyAoKGMmMHhmMCk+PjQpICsgKGM+PTB4YTApKignYSctJzknLTEpOworCQkJKmJwKysgPSAnMCcgKyAoYyYweDBmKSArICgoYyYweDBmKT49MHgwYSkqKCdhJy0nOSctMSk7CisJCQlsZW4gLT0gMjsKKwkJCWJsZW4tLTsKKwkJfQorCX0KKwlpZiAoYmxlbiB8fCBsZW48MSkgbGVuID0gLTE7CisJZWxzZSB7CisJCSpicCsrID0gJyAnOworCQlsZW4tLTsKKwl9CisJKmJwcCA9IGJwOworCSpscCA9IGxlbjsKK30KKwordm9pZCBxd29yZF9hZGRpbnQoY2hhciAqKmJwcCwgaW50ICpscCwgaW50IG4pCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKCpicHAsICpscCwgIiVkICIsIG4pOworCWlmIChsZW4gPiAqbHApCisJCWxlbiA9ICpscDsKKwkqYnBwICs9IGxlbjsKKwkqbHAgLT0gbGVuOworfQorCit2b2lkIHF3b3JkX2FkZHVpbnQoY2hhciAqKmJwcCwgaW50ICpscCwgdW5zaWduZWQgaW50IG4pCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKCpicHAsICpscCwgIiV1ICIsIG4pOworCWlmIChsZW4gPiAqbHApCisJCWxlbiA9ICpscDsKKwkqYnBwICs9IGxlbjsKKwkqbHAgLT0gbGVuOworfQorCit2b2lkIHF3b3JkX2FkZGVvbChjaGFyICoqYnBwLCBpbnQgKmxwKQoreworCWlmICgqbHAgPD0gMCkKKwkJcmV0dXJuOworCSoqYnBwID0gJ1xuJzsKKwkoKmJwcCkrKzsKKwkoKmxwKS0tOworfQorCitzdGF0aWMgY2hhciBxd29yZF9idWZbODE5Ml07Cit2b2lkIHF3b3JkX3ByaW50KEZJTEUgKmYsIGNoYXIgKnN0cikKK3sKKwljaGFyICpicCA9IHF3b3JkX2J1ZjsKKwlpbnQgbGVuID0gc2l6ZW9mKHF3b3JkX2J1Zik7CisJcXdvcmRfYWRkKCZicCwgJmxlbiwgc3RyKTsKKwlpZiAoZndyaXRlKHF3b3JkX2J1ZiwgYnAtcXdvcmRfYnVmLCAxLCBmKSAhPSAxKSB7CisJCXhsb2dfd2FybigicXdvcmRfcHJpbnQ6IGZ3cml0ZSBmYWlsZWQ6IGVycm5vICVkICglcykiLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCit2b2lkIHF3b3JkX3ByaW50aGV4KEZJTEUgKmYsIGNoYXIgKnN0ciwgaW50IHNsZW4pCit7CisJY2hhciAqYnAgPSBxd29yZF9idWY7CisJaW50IGxlbiA9IHNpemVvZihxd29yZF9idWYpOworCXF3b3JkX2FkZGhleCgmYnAsICZsZW4sIHN0ciwgc2xlbik7CisJaWYgKGZ3cml0ZShxd29yZF9idWYsIGJwLXF3b3JkX2J1ZiwgMSwgZikgIT0gMSkgeworCQl4bG9nX3dhcm4oInF3b3JkX3ByaW50aGV4OiBmd3JpdGUgZmFpbGVkOiBlcnJubyAlZCAoJXMpIiwKKwkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOworCX0KK30KKwordm9pZCBxd29yZF9wcmludGludChGSUxFICpmLCBpbnQgbnVtKQoreworCWZwcmludGYoZiwgIiVkICIsIG51bSk7Cit9CisKK2ludCBxd29yZF9lb2woRklMRSAqZikKK3sKKwlpbnQgZXJyOworCisJZnByaW50ZihmLCJcbiIpOworCWVyciA9IGZmbHVzaChmKTsKKwlpZiAoZXJyKSB7CisJCXhsb2dfd2FybigicXdvcmRfZW9sOiBmZmx1c2ggZmFpbGVkOiBlcnJubyAlZCAoJXMpIiwKKwkJCSAgICBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJLyoKKwkgKiBXZSBtdXN0IHNlbmQgb25lIGxpbmUgKGFuZCBvbmUgbGluZSBvbmx5KSBpbiBhIHNpbmdsZSB3cml0ZQorCSAqIGNhbGwuICBJbiBjYXNlIG9mIGEgd3JpdGUgZXJyb3IsIGxpYmMgbWF5IGFjY3VtdWxhdGUgdGhlCisJICogdW53cml0dGVuIGRhdGEgYW5kIHRyeSB0byB3cml0ZSBpdCBhZ2FpbiBsYXRlciwgcmVzdWx0aW5nIGluIGEKKwkgKiBtdWx0aS1saW5lIHdyaXRlLiAgU28gd2UgbXVzdCBleHBsaWNpdGx5IGFzayBpdCB0byB0aHJvdyBhd2F5CisJICogYW55IHN1Y2ggY2FjaGVkIGRhdGEuICBCdXQgd2UgcmV0dXJuIGFueSBvcmlnaW5hbCBlcnJvcgorCSAqIGluZGljYXRpb24gdG8gdGhlIGNhbGxlci4KKwkgKi8KKwlfX2ZwdXJnZShmKTsKKwlmZmx1c2goZik7CisJcmV0dXJuIGVycjsKK30KKworCisKKyNkZWZpbmUgaXNvZGlnaXQoYykgKGlzZGlnaXQoYykgJiYgYyA8PSAnNycpCitpbnQgcXdvcmRfZ2V0KGNoYXIgKipicHAsIGNoYXIgKmRlc3QsIGludCBidWZzaXplKQoreworCS8qIHJldHVybiBieXRlcyBjb3BpZWQsIG9yIC0xIG9uIGVycm9yICovCisJY2hhciAqYnAgPSAqYnBwOworCWludCBsZW4gPSAwOworCisJd2hpbGUgKCpicCA9PSAnICcpIGJwKys7CisKKwlpZiAoYnBbMF0gPT0gJ1xcJyAmJiBicFsxXSA9PSAneCcpIHsKKwkJLyogSEVYIFNUUklORyAqLworCQlicCArPSAyOworCQl3aGlsZSAoaXN4ZGlnaXQoYnBbMF0pICYmIGlzeGRpZ2l0KGJwWzFdKSAmJiBsZW4gPCBidWZzaXplKSB7CisJCQlpbnQgYnl0ZSA9IGlzZGlnaXQoKmJwKSA/ICpicC0nMCcgOiB0b3VwcGVyKCpicCktJ0EnKzEwOworCQkJYnArKzsKKwkJCWJ5dGUgPDw9IDQ7CisJCQlieXRlIHw9IGlzZGlnaXQoKmJwKSA/ICpicC0nMCcgOiB0b3VwcGVyKCpicCktJ0EnKzEwOworCQkJKmRlc3QrKyA9IGJ5dGU7CisJCQlicCsrOworCQkJbGVuKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiB0ZXh0IHdpdGggXG5ubiBvY3RhbCBxdW90aW5nICovCisJCXdoaWxlICgqYnAgIT0gJyAnICYmICpicCAhPSAnXG4nICYmICpicCAmJiBsZW4gPCBidWZzaXplLTEpIHsKKwkJCWlmICgqYnAgPT0gJ1xcJyAmJgorCQkJICAgIGlzb2RpZ2l0KGJwWzFdKSAmJiAoYnBbMV0gPD0gJzMnKSAmJgorCQkJICAgIGlzb2RpZ2l0KGJwWzJdKSAmJgorCQkJICAgIGlzb2RpZ2l0KGJwWzNdKSkgeworCQkJCWludCBieXRlID0gKCorK2JwIC0nMCcpOworCQkJCWJwKys7CisJCQkJYnl0ZSA9IChieXRlIDw8IDMpIHwgKCpicCsrIC0gJzAnKTsKKwkJCQlieXRlID0gKGJ5dGUgPDwgMykgfCAoKmJwKysgLSAnMCcpOworCQkJCSpkZXN0KysgPSBieXRlOworCQkJCWxlbisrOworCQkJfSBlbHNlIHsKKwkJCQkqZGVzdCsrID0gKmJwKys7CisJCQkJbGVuKys7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoKmJwICE9ICcgJyAmJiAqYnAgIT0gJ1xuJyAmJiAqYnAgIT0gJ1wwJykKKwkJcmV0dXJuIC0xOworCXdoaWxlICgqYnAgPT0gJyAnKSBicCsrOworCSpicHAgPSBicDsKKwkqZGVzdCA9ICdcMCc7CisJcmV0dXJuIGxlbjsKK30KKworaW50IHF3b3JkX2dldF9pbnQoY2hhciAqKmJwcCwgaW50ICphbmludCkKK3sKKwljaGFyIGJ1Zls1MF07CisJY2hhciAqZXA7CisJaW50IHJ2OworCWludCBsZW4gPSBxd29yZF9nZXQoYnBwLCBidWYsIDUwKTsKKwlpZiAobGVuIDwgMCkgcmV0dXJuIC0xOworCWlmIChsZW4gPT0wKSByZXR1cm4gLTE7CisJcnYgPSBzdHJ0b2woYnVmLCAmZXAsIDApOworCWlmICgqZXApIHJldHVybiAtMTsKKwkqYW5pbnQgPSBydjsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBSRUFETElORV9CVUZGRVJfSU5DUkVNRU5UIDIwNDgKKworaW50IHJlYWRsaW5lKGludCBmZCwgY2hhciAqKmJ1ZiwgaW50ICpsZW5wKQoreworCS8qIHJlYWQgYSBsaW5lIGludG8gKmJ1Ziwgd2hpY2ggaXMgbWFsbG9jZWQgKmxlbiBsb25nCisJICogcmVhbGxvYyBpZiBuZWVkZWQgdW50aWwgd2UgZmluZCBhIFxuCisJICogbnVsIG91dCB0aGUgXG4gYW5kIHJldHVybgorCSAqIDAgb24gZW9mLCAxIG9uIHN1Y2Nlc3MKKwkgKi8KKwlpbnQgbGVuOworCisJaWYgKCpsZW5wID09IDApIHsKKwkJY2hhciAqYiA9IG1hbGxvYyhSRUFETElORV9CVUZGRVJfSU5DUkVNRU5UKTsKKwkJaWYgKGIgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQkqYnVmID0gYjsKKwkJKmxlbnAgPSBSRUFETElORV9CVUZGRVJfSU5DUkVNRU5UOworCX0KKwlsZW4gPSByZWFkKGZkLCAqYnVmLCAqbGVucCk7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoKCpidWYpW2xlbi0xXSAhPSAnXG4nKSB7CisJLyogbm93IHRoZSBsZXNzIGNvbW1vbiBjYXNlLiAgVGhlcmUgd2FzIG5vIG5ld2xpbmUsCisJICogc28gd2UgaGF2ZSB0byBrZWVwIHJlYWRpbmcgYWZ0ZXIgcmUtYWxsb2MKKwkgKi8KKwkJY2hhciAqbmV3OworCQlpbnQgbmw7CisJCSpsZW5wICs9IFJFQURMSU5FX0JVRkZFUl9JTkNSRU1FTlQ7CisJCW5ldyA9IHJlYWxsb2MoKmJ1ZiwgKmxlbnApOworCQlpZiAobmV3ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJKmJ1ZiA9IG5ldzsKKwkJbmwgPSByZWFkKGZkLCAqYnVmICsgbGVuLCAqbGVucCAtIGxlbik7CisJCWlmIChubCA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWxlbiArPSBubDsKKwl9CisJKCpidWYpW2xlbi0xXSA9ICdcMCc7CisJcmV0dXJuIDE7Cit9CisKKworLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgbmV3IGNhY2hpbmcgaW50ZXJmYWNlCisgKiBUaGlzIHN1Y2NlZWRzIGlmZiB0aGUgIm5mc2QiIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCBvbgorICogL3Byb2MvZnMvbmZzCisgKi8KK2ludAorY2hlY2tfbmV3X2NhY2hlKHZvaWQpCit7CisJcmV0dXJuCShhY2Nlc3MoIi9wcm9jL2ZzL25mcy9maWxlaGFuZGxlIiwgRl9PSykgPT0gMCkgfHwKKwkJKGFjY2VzcygiL3Byb2MvZnMvbmZzZC9maWxlaGFuZGxlIiwgRl9PSykgPT0gMCk7Cit9CQorCisKKy8qIGZsdXNoIHRoZSBrTkZTZCBjYWNoZXMuCisgKiBTZXQgdGhlIGZsdXNoIHRpbWUgdG8gdGhlIG10aW1lIG9mIF9QQVRIX0VUQUIgb3IKKyAqIGlmIGZvcmNlLCB0byBub3cuCisgKiB0aGUgY2FjaGVzIHRvIGZsdXNoIGFyZToKKyAqICBhdXRoLnVuaXguaXAgbmZzZC5leHBvcnQgbmZzZC5maAorICovCisKK3ZvaWQKK2NhY2hlX2ZsdXNoKGludCBmb3JjZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGI7CisJaW50IGM7CisJY2hhciBzdGltZVsyMF07CisJY2hhciBwYXRoWzIwMF07CisJdGltZV90IG5vdzsKKwkvKiBOb3RlOiB0aGUgb3JkZXIgb2YgdGhlc2UgY2FjaGVzIGlzIGltcG9ydGFudC4KKwkgKiBUaGV5IG5lZWQgdG8gYmUgZmx1c2hlZCBpbiBkZXBlbmRhbmN5IG9yZGVyLiBTbworCSAqIGEgY2FjaGUgdGhhdCByZWZlcmVuY2VzIGl0ZW1zIGluIGFub3RoZXIgY2FjaGUsCisJICogYXMgbmZzZC5maCBlbnRyaWVzIHJlZmVyZW5jZSBpdGVtcyBpbiBuZnNkLmV4cG9ydCwKKwkgKiBtdXN0IGJlIGZsdXNoZWQgYmVmb3JlIHRoZSBjYWNoZSB0aGF0IGl0IHJlZmVyZW5jZXMuCisJICovCisJc3RhdGljIGNoYXIgKmNhY2hlbGlzdFtdID0geworCQkiYXV0aC51bml4LmlwIiwKKwkJImF1dGgudW5peC5naWQiLAorCQkibmZzZC5maCIsCisJCSJuZnNkLmV4cG9ydCIsCisJCU5VTEwKKwl9OworCW5vdyA9IHRpbWUoMCk7CisJaWYgKGZvcmNlIHx8CisJICAgIHN0YXQoX1BBVEhfRVRBQiwgJnN0YikgIT0gMCB8fAorCSAgICBzdGIuc3RfbXRpbWUgPiBub3cpCisJCXN0Yi5zdF9tdGltZSA9IHRpbWUoMCk7CisJCisJc3ByaW50ZihzdGltZSwgIiVsZFxuIiwgc3RiLnN0X210aW1lKTsKKwlmb3IgKGM9MDsgY2FjaGVsaXN0W2NdOyBjKyspIHsKKwkJaW50IGZkOworCQlzcHJpbnRmKHBhdGgsICIvcHJvYy9uZXQvcnBjLyVzL2ZsdXNoIiwgY2FjaGVsaXN0W2NdKTsKKwkJZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisJCWlmIChmZCA+PSAwKSB7CisJCQlpZiAod3JpdGUoZmQsIHN0aW1lLCBzdHJsZW4oc3RpbWUpKSAhPSBzdHJsZW4oc3RpbWUpKSB7CisJCQkJeGxvZ193YXJuKCJXcml0aW5nIHRvICclcycgZmFpbGVkOiBlcnJubyAlZCAoJXMpIiwKKwkJCQlwYXRoLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCWNsb3NlKGZkKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9jbG9zZWFsbC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2Nsb3NlYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmYjE2MgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9jbG9zZWFsbC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBzdXBwb3J0L25mcy9jbG9zZWFsbC5jCisgKiBDbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBncmVhdGVyIHRoYW4gc29tZSBsaW1pdCwKKyAqIFVzZSByZWFkZGlyICIvcHJvYy9zZWxmL2ZkIiB0byBhdm9pZCBleGNlc3MgY2xvc2UoMikgY2FsbHMuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKK3ZvaWQKK2Nsb3NlYWxsKGludCBtaW4pCit7CisJY2hhciAqZW5kcDsKKwlsb25nIG47CisJRElSICpkaXIgPSBvcGVuZGlyKCIvcHJvYy9zZWxmL2ZkIik7CisKKwlpZiAoZGlyICE9IE5VTEwpIHsKKwkJaW50IGRmZCA9IGRpcmZkKGRpcik7CisJCXN0cnVjdCBkaXJlbnQgKmQ7CisKKwkJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQllcnJubyA9IDA7CisJCQluID0gc3RydG9sKGQtPmRfbmFtZSwgJmVuZHAsIDEwKTsKKwkJCWlmICghZXJybm8gJiYgKmVuZHAgPT0gJ1wwJyAmJiBlbmRwICE9IGQtPmRfbmFtZSAmJgorCQkJICAgIG4gPj0gbWluICYmIG4gIT0gZGZkKQorCQkJCSh2b2lkKSBjbG9zZShuKTsKKwkJfQorCQljbG9zZWRpcihkaXIpOworCX0gZWxzZSB7CisJCWludCBmZCA9IHN5c2NvbmYoX1NDX09QRU5fTUFYKTsKKwkJd2hpbGUgKC0tZmQgPj0gbWluKQorCQkJKHZvaWQpIGNsb3NlKGZkKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvY29uZmZpbGUuYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9jb25mZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzdjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvY29uZmZpbGUuYwpAQCAtMCwwICsxLDk2MiBAQAorLyoJJE9wZW5CU0Q6IGNvbmYuYyx2IDEuNTUgMjAwMy8wNi8wMyAxNDoyODoxNiBobyBFeHAgJAkqLworLyoJJEVPTTogY29uZi5jLHYgMS40OCAyMDAwLzEyLzA0IDAyOjA0OjI5IGFuZ2Vsb3MgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSBOaWtsYXMgSGFsbHF2aXN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBI5WthbiBPbHNzb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHVuZGVyIGZ1bmRpbmcgYnkgRXJpY3Nzb24gUmFkaW8gU3lzdGVtcy4KKyAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworI2luY2x1ZGUgImNvbmZmaWxlLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCitzdGF0aWMgdm9pZCBjb25mX2xvYWRfZGVmYXVsdHMgKGludCk7CitzdGF0aWMgaW50IGNvbmZfc2V0KGludCAsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIAorCWNoYXIgKiwgaW50ICwgaW50ICk7CisKK3N0cnVjdCBjb25mX3RyYW5zIHsKKwlUQUlMUV9FTlRSWSAoY29uZl90cmFucykgbGluazsKKwlpbnQgdHJhbnM7CisJZW51bSBjb25mX29wIHsgQ09ORl9TRVQsIENPTkZfUkVNT1ZFLCBDT05GX1JFTU9WRV9TRUNUSU9OIH0gb3A7CisJY2hhciAqc2VjdGlvbjsKKwljaGFyICphcmc7CisJY2hhciAqdGFnOworCWNoYXIgKnZhbHVlOworCWludCBvdmVycmlkZTsKKwlpbnQgaXNfZGVmYXVsdDsKK307CisKK1RBSUxRX0hFQUQgKGNvbmZfdHJhbnNfaGVhZCwgY29uZl90cmFucykgY29uZl90cmFuc19xdWV1ZTsKKworLyoKKyAqIFJhZGl4LTY0IEVuY29kaW5nLgorICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYmluMmFzY1tdCisgID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYXNjMmJpbltdID0KK3sKKyAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAyNTUsIDI1NSwgMjU1LCAgNjIsIDI1NSwgMjU1LCAyNTUsICA2MywKKyAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksCisgICA2MCwgIDYxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAyNTUsICAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwKKyAgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsCisgICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLAorICAgMjMsICAyNCwgIDI1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgMjU1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsCisgICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLAorICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwKKyAgIDQ5LCAgNTAsICA1MSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUKK307CisKK3N0cnVjdCBjb25mX2JpbmRpbmcgeworICBMSVNUX0VOVFJZIChjb25mX2JpbmRpbmcpIGxpbms7CisgIGNoYXIgKnNlY3Rpb247CisgIGNoYXIgKmFyZzsKKyAgY2hhciAqdGFnOworICBjaGFyICp2YWx1ZTsKKyAgaW50IGlzX2RlZmF1bHQ7Cit9OworCitjaGFyICpjb25mX3BhdGg7CitMSVNUX0hFQUQgKGNvbmZfYmluZGluZ3MsIGNvbmZfYmluZGluZykgY29uZl9iaW5kaW5nc1syNTZdOworCitzdGF0aWMgY2hhciAqY29uZl9hZGRyOworCitzdGF0aWMgX19pbmxpbmVfXyB1X2ludDhfdAorY29uZl9oYXNoKGNoYXIgKnMpCit7CisJdV9pbnQ4X3QgaGFzaCA9IDA7CisKKwl3aGlsZSAoKnMpIHsKKwkJaGFzaCA9ICgoaGFzaCA8PCAxKSB8IChoYXNoID4+IDcpKSBeIHRvbG93ZXIgKCpzKTsKKwkJcysrOworCX0KKwlyZXR1cm4gaGFzaDsKK30KKworLyoKKyAqIEluc2VydCBhIHRhZy12YWx1ZSBjb21iaW5hdGlvbiBmcm9tIExJTkUgKHRoZSBlcXVhbCBzaWduIGlzIGF0IFBPUykKKyAqLworc3RhdGljIGludAorY29uZl9yZW1vdmVfbm93KGNoYXIgKnNlY3Rpb24sIGNoYXIgKnRhZykKK3sKKwlzdHJ1Y3QgY29uZl9iaW5kaW5nICpjYiwgKm5leHQ7CisKKwljYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOworCWZvciAoOyBjYjsgY2IgPSBuZXh0KSB7CisJCW5leHQgPSBMSVNUX05FWFQoY2IsIGxpbmspOworCQlpZiAoc3RyY2FzZWNtcChjYi0+c2VjdGlvbiwgc2VjdGlvbikgPT0gMAorCQkJCSYmIHN0cmNhc2VjbXAoY2ItPnRhZywgdGFnKSA9PSAwKSB7CisJCQlMSVNUX1JFTU9WRShjYiwgbGluayk7CisJCQl4bG9nKExPR19JTkZPLCJbJXNdOiVzLT4lcyByZW1vdmVkIiwgc2VjdGlvbiwgdGFnLCBjYi0+dmFsdWUpOworCQkJZnJlZShjYi0+c2VjdGlvbik7CisJCQlmcmVlKGNiLT5hcmcpOworCQkJZnJlZShjYi0+dGFnKTsKKwkJCWZyZWUoY2ItPnZhbHVlKTsKKwkJCWZyZWUoY2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NvbmZfcmVtb3ZlX3NlY3Rpb25fbm93KGNoYXIgKnNlY3Rpb24pCit7CisgIHN0cnVjdCBjb25mX2JpbmRpbmcgKmNiLCAqbmV4dDsKKyAgaW50IHVuc2VlbiA9IDE7CisKKwljYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOworCWZvciAoOyBjYjsgY2IgPSBuZXh0KSB7CisJCW5leHQgPSBMSVNUX05FWFQoY2IsIGxpbmspOworCQlpZiAoc3RyY2FzZWNtcChjYi0+c2VjdGlvbiwgc2VjdGlvbikgPT0gMCkgeworCQkJdW5zZWVuID0gMDsKKwkJCUxJU1RfUkVNT1ZFKGNiLCBsaW5rKTsKKwkJCXhsb2coTE9HX0lORk8sICJbJXNdOiVzLT4lcyByZW1vdmVkIiwgc2VjdGlvbiwgY2ItPnRhZywgY2ItPnZhbHVlKTsKKwkJCWZyZWUoY2ItPnNlY3Rpb24pOworCQkJZnJlZShjYi0+YXJnKTsKKwkJCWZyZWUoY2ItPnRhZyk7CisJCQlmcmVlKGNiLT52YWx1ZSk7CisJCQlmcmVlKGNiKTsKKwkJCX0KKwkJfQorCXJldHVybiB1bnNlZW47Cit9CisKKy8qCisgKiBJbnNlcnQgYSB0YWctdmFsdWUgY29tYmluYXRpb24gZnJvbSBMSU5FICh0aGUgZXF1YWwgc2lnbiBpcyBhdCBQT1MpCisgKiBpbnRvIFNFQ1RJT04gb2Ygb3VyIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UuCisgKi8KK3N0YXRpYyBpbnQKK2NvbmZfc2V0X25vdyhjaGFyICpzZWN0aW9uLCBjaGFyICphcmcsIGNoYXIgKnRhZywgCisJY2hhciAqdmFsdWUsIGludCBvdmVycmlkZSwgaW50IGlzX2RlZmF1bHQpCit7CisJc3RydWN0IGNvbmZfYmluZGluZyAqbm9kZSA9IDA7CisKKwlpZiAob3ZlcnJpZGUpCisJCWNvbmZfcmVtb3ZlX25vdyhzZWN0aW9uLCB0YWcpOworCWVsc2UgaWYgKGNvbmZfZ2V0X3NlY3Rpb24oc2VjdGlvbiwgYXJnLCB0YWcpKSB7CisJCWlmICghaXNfZGVmYXVsdCkgeworCQkJeGxvZyhMT0dfSU5GTywgImNvbmZfc2V0OiBkdXBsaWNhdGUgdGFnIFslc106JXMsIGlnbm9yaW5nLi4uXG4iLCAKKwkJCQlzZWN0aW9uLCB0YWcpOworCQl9CisJCXJldHVybiAxOworCX0KKwlub2RlID0gY2FsbG9jKDEsIHNpemVvZiAqbm9kZSk7CisJaWYgKCFub2RlKSB7CisJCXhsb2dfd2FybigiY29uZl9zZXQ6IGNhbGxvYyAoMSwgJWx1KSBmYWlsZWQiLCAodW5zaWduZWQgbG9uZylzaXplb2YgKm5vZGUpOworCQlyZXR1cm4gMTsKKwl9CisJbm9kZS0+c2VjdGlvbiA9IHN0cmR1cChzZWN0aW9uKTsKKwlpZiAoYXJnKQorCQlub2RlLT5hcmcgPSBzdHJkdXAoYXJnKTsKKwlub2RlLT50YWcgPSBzdHJkdXAodGFnKTsKKwlub2RlLT52YWx1ZSA9IHN0cmR1cCh2YWx1ZSk7CisJbm9kZS0+aXNfZGVmYXVsdCA9IGlzX2RlZmF1bHQ7CisKKwlMSVNUX0lOU0VSVF9IRUFEKCZjb25mX2JpbmRpbmdzW2NvbmZfaGFzaCAoc2VjdGlvbildLCBub2RlLCBsaW5rKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIHRoZSBsaW5lIExJTkUgb2YgU1ogYnl0ZXMuICBTa2lwIENvbW1lbnRzLCByZWNvZ25pemUgc2VjdGlvbgorICogaGVhZGVycyBhbmQgZmVlZCB0YWctdmFsdWUgcGFpcnMgaW50byBvdXIgY29uZmlndXJhdGlvbiBkYXRhYmFzZS4KKyAqLworc3RhdGljIHZvaWQKK2NvbmZfcGFyc2VfbGluZShpbnQgdHJhbnMsIGNoYXIgKmxpbmUsIHNpemVfdCBzeikKK3sKKwljaGFyICp2YWwsICpwdHI7CisJc2l6ZV90IGk7CisJaW50IGo7CisJc3RhdGljIGNoYXIgKnNlY3Rpb24gPSAwOworCXN0YXRpYyBjaGFyICphcmcgPSAwOworCXN0YXRpYyBpbnQgbG4gPSAwOworCisJLyogTGluZXMgc3RhcnRpbmcgd2l0aCAnIycgb3IgJzsnIGFyZSBjb21tZW50cy4gICovCisJbG4rKzsKKwkvKiBJZ25vcmUgYmxhbmsgbGluZXMgKi8KKwlpZiAoKmxpbmUgPT0gJ1wwJykKKwkJcmV0dXJuOworCisJLyogU3RyaXAgb2ZmIGFueSBsZWFkaW5nIGJsYW5rcyAqLworCXdoaWxlIChpc2JsYW5rKCpsaW5lKSkgCisJCWxpbmUrKzsKKworCWlmICgqbGluZSA9PSAnIycgfHwgKmxpbmUgPT0gJzsnKQorCQlyZXR1cm47CisKKwkvKiAnW3NlY3Rpb25dJyBwYXJzaW5nLi4uICAqLworCWlmICgqbGluZSA9PSAnWycpIHsKKwkJbGluZSsrOworCQkvKiBTdHJpcCBvZmYgYW55IGJsYW5rcyBhZnRlciAnWycgKi8KKwkJd2hpbGUgKGlzYmxhbmsoKmxpbmUpKSAKKwkJCWxpbmUrKzsKKwkJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspIHsKKwkJCWlmIChsaW5lW2ldID09ICddJykgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChzZWN0aW9uKQorCQkJZnJlZShzZWN0aW9uKTsKKwkJaWYgKGkgPT0gc3opIHsKKwkJCXhsb2dfd2FybigiY29uZmlnIGZpbGUgZXJyb3I6IGxpbmUgJWQ6ICIKKyAJCQkJIm5vbi1tYXRjaGVkICddJywgaWdub3JpbmcgdW50aWwgbmV4dCBzZWN0aW9uIiwgbG4pOworCQkJc2VjdGlvbiA9IDA7CisJCQlyZXR1cm47CisJCX0KKwkJLyogU3RyaXAgb2ZmIGFueSBibGFua3MgYmVmb3JlICddJyAqLworCQl2YWwgPSBsaW5lOworCQl3aGlsZSAoKnZhbCAmJiAhaXNibGFuaygqdmFsKSkgCisJCQl2YWwrKywgaisrOworCQlpZiAoKnZhbCkKKwkJCWkgPSBqOworCQlzZWN0aW9uID0gbWFsbG9jKGkpOworCQlpZiAoIXNlY3Rpb24pIHsKKwkJCXhsb2dfd2FybigiY29uZl9wYXJzZV9saW5lOiAlZDogbWFsbG9jICglbHUpIGZhaWxlZCIsIGxuLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpaSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3RybmNweShzZWN0aW9uLCBsaW5lLCBpKTsKKworCQlpZiAoYXJnKSAKKwkJCWZyZWUoYXJnKTsKKwkJYXJnID0gMDsKKworCQlwdHIgPSBzdHJjaHIodmFsLCAnIicpOworCQlpZiAocHRyID09IE5VTEwpCisJCQlyZXR1cm47CisJCWxpbmUgPSArK3B0cjsKKwkJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnIicpCisJCQlwdHIrKzsKKwkJaWYgKCpwdHIgPT0gJ1wwJykgeworCQkJeGxvZ193YXJuKCJjb25maWcgZmlsZSBlcnJvcjogbGluZSAlZDogIgorIAkJCQkibm9uLW1hdGNoZWQgJ1wiJywgaWdub3JpbmcgdW50aWwgbmV4dCBzZWN0aW9uIiwgbG4pOworCQl9ICBlbHNlIHsKKwkJCSpwdHIgPSAnXDAnOworCQkJYXJnID0gc3RyZHVwKGxpbmUpOworCQkJaWYgKCFhcmcpIAorCQkJCXhsb2dfd2FybigiY29uZl9wYXJzZV9saW5lOiAlZDogbWFsbG9jIGFyZyBmYWlsZWQiLCBsbik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIERlYWwgd2l0aCBhc3NpZ25tZW50cy4gICovCisJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspIHsKKwkJaWYgKGxpbmVbaV0gPT0gJz0nKSB7CisJCQkvKiBJZiBubyBzZWN0aW9uLCB3ZSBhcmUgaWdub3JpbmcgdGhlIGxpbmVzLiAgKi8KKwkJCWlmICghc2VjdGlvbikgeworCQkJeGxvZ193YXJuKCJjb25maWcgZmlsZSBlcnJvcjogbGluZSAlZDogIgorCQkJCSJpZ25vcmluZyBsaW5lIGR1ZSB0byBubyBzZWN0aW9uIiwgbG4pOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWxpbmVbc3RyY3NwbiAobGluZSwgIiBcdD0iKV0gPSAnXDAnOworCQkJdmFsID0gbGluZSArIGkgKyAxICsgc3Ryc3BuIChsaW5lICsgaSArIDEsICIgXHQiKTsKKworCQkJLyogU2tpcCB0cmFpbGluZyBjb21tZW50cywgaWYgYW55ICovCisJCQlmb3IgKGogPSAwOyBqIDwgc3ogLSAodmFsIC0gbGluZSk7IGorKykgeworCQkJCWlmICh2YWxbal0gPT0gJyMnIHx8IHZhbFtqXSA9PSAnOycpIHsKKwkJCQkJdmFsW2pdID0gJ1wwJzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGlmIGFueSAqLworCQkJZm9yIChqLS07IGogPiAwOyBqLS0pIHsKKwkJCQlpZiAoaXNzcGFjZSh2YWxbal0pKQorCQkJCQl2YWxbal0gPSAnXDAnOworCQkJCWVsc2UgCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBYWFggUGVyaGFwcyBzaG91bGQgd2Ugbm90IGlnbm9yZSBlcnJvcnM/ICAqLworCQkJY29uZl9zZXQodHJhbnMsIHNlY3Rpb24sIGFyZywgbGluZSwgdmFsLCAwLCAwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBPdGhlciBub24tZW1wdHkgbGluZXMgYXJlIHdlaXJkLiAgKi8KKwlpID0gc3Ryc3BuKGxpbmUsICIgXHQiKTsKKwlpZiAobGluZVtpXSkKKwkJeGxvZ193YXJuKCJjb25maWcgZmlsZSBlcnJvcjogbGluZSAlZDoiLCBsbik7CisKKwlyZXR1cm47Cit9CisKKy8qIFBhcnNlIHRoZSBtYXBwZWQgY29uZmlndXJhdGlvbiBmaWxlLiAgKi8KK3N0YXRpYyB2b2lkCitjb25mX3BhcnNlKGludCB0cmFucywgY2hhciAqYnVmLCBzaXplX3Qgc3opCit7CisJY2hhciAqY3AgPSBidWY7CisJY2hhciAqYnVmZW5kID0gYnVmICsgc3o7CisJY2hhciAqbGluZTsKKworCWxpbmUgPSBjcDsKKwl3aGlsZSAoY3AgPCBidWZlbmQpIHsKKwkJaWYgKCpjcCA9PSAnXG4nKSB7CisJCQkvKiBDaGVjayBmb3IgZXNjYXBlZCBuZXdsaW5lcy4gICovCisJCQlpZiAoY3AgPiBidWYgJiYgKihjcCAtIDEpID09ICdcXCcpCisJCQkJKihjcCAtIDEpID0gKmNwID0gJyAnOworCQkJZWxzZSB7CisJCQkJKmNwID0gJ1wwJzsKKwkJCQljb25mX3BhcnNlX2xpbmUodHJhbnMsIGxpbmUsIGNwIC0gbGluZSk7CisJCQkJbGluZSA9IGNwICsgMTsKKwkJCX0KKwkJfQorCQljcCsrOworCX0KKwlpZiAoY3AgIT0gbGluZSkKKwkJeGxvZ193YXJuKCJjb25mX3BhcnNlOiBsYXN0IGxpbmUgbm9uLXRlcm1pbmF0ZWQsIGlnbm9yZWQuIik7Cit9CisKK3N0YXRpYyB2b2lkCitjb25mX2xvYWRfZGVmYXVsdHMoaW50IHRyKQoreworCS8qIE5vIGRlZmF1bHRzICovCisJcmV0dXJuOworfQorCit2b2lkCitjb25mX2luaXQgKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGNvbmZfYmluZGluZ3MgLyBzaXplb2YgY29uZl9iaW5kaW5nc1swXTsgaSsrKQorCQlMSVNUX0lOSVQgKCZjb25mX2JpbmRpbmdzW2ldKTsKKworCVRBSUxRX0lOSVQgKCZjb25mX3RyYW5zX3F1ZXVlKTsKKwljb25mX3JlaW5pdCgpOworfQorCisvKiBPcGVuIHRoZSBjb25maWcgZmlsZSBhbmQgbWFwIGl0IGludG8gb3VyIGFkZHJlc3Mgc3BhY2UsIHRoZW4gcGFyc2UgaXQuICAqLwordm9pZAorY29uZl9yZWluaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY29uZl9iaW5kaW5nICpjYiA9IDA7CisJaW50IGZkLCB0cmFuczsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzaXplX3Qgc3o7CisJY2hhciAqbmV3X2NvbmZfYWRkciA9IDA7CisJc3RydWN0IHN0YXQgc2I7CisKKwlpZiAoKHN0YXQgKGNvbmZfcGF0aCwgJnNiKSA9PSAwKSB8fCAoZXJybm8gIT0gRU5PRU5UKSkgeworCQlzeiA9IHNiLnN0X3NpemU7CisJCWZkID0gb3BlbiAoY29uZl9wYXRoLCBPX1JET05MWSwgMCk7CisJCWlmIChmZCA9PSAtMSkgeworCQkJeGxvZ193YXJuKCJjb25mX3JlaW5pdDogb3BlbiAoXCIlc1wiLCBPX1JET05MWSkgZmFpbGVkIiwgY29uZl9wYXRoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW5ld19jb25mX2FkZHIgPSBtYWxsb2Moc3opOworCQlpZiAoIW5ld19jb25mX2FkZHIpIHsKKwkJCXhsb2dfd2FybigiY29uZl9yZWluaXQ6IG1hbGxvYyAoJWx1KSBmYWlsZWQiLCAodW5zaWduZWQgbG9uZylzeik7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQkvKiBYWFggSSBhc3N1bWUgc2hvcnQgcmVhZHMgd29uJ3QgaGFwcGVuIGhlcmUuICAqLworCQlpZiAocmVhZCAoZmQsIG5ld19jb25mX2FkZHIsIHN6KSAhPSAoaW50KXN6KSB7CisJCQl4bG9nX3dhcm4oImNvbmZfcmVpbml0OiByZWFkICglZCwgJXAsICVsdSkgZmFpbGVkIiwKKyAgIAkJCQlmZCwgbmV3X2NvbmZfYWRkciwgKHVuc2lnbmVkIGxvbmcpc3opOworCQkJZ290byBmYWlsOworCQl9CisJCWNsb3NlKGZkKTsKKworCQl0cmFucyA9IGNvbmZfYmVnaW4oKTsKKwkJLyogWFhYIFNob3VsZCB3ZSBub3QgY2FyZSBhYm91dCBlcnJvcnMgYW5kIHJvbGxiYWNrPyAgKi8KKwkJY29uZl9wYXJzZSh0cmFucywgbmV3X2NvbmZfYWRkciwgc3opOworCX0KKwllbHNlCisJCXRyYW5zID0gY29uZl9iZWdpbigpOworCisJLyogTG9hZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdmFsdWVzLiAgKi8KKwljb25mX2xvYWRfZGVmYXVsdHModHJhbnMpOworCisJLyogRnJlZSBwb3RlbnRpYWwgZXhpc3RpbmcgY29uZmlndXJhdGlvbi4gICovCisJaWYgKGNvbmZfYWRkcikgeworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGNvbmZfYmluZGluZ3MgLyBzaXplb2YgY29uZl9iaW5kaW5nc1swXTsgaSsrKSB7CisJCQljYiA9IExJU1RfRklSU1QgKCZjb25mX2JpbmRpbmdzW2ldKTsKKwkJCWZvciAoOyBjYjsgY2IgPSBMSVNUX0ZJUlNUICgmY29uZl9iaW5kaW5nc1tpXSkpCisJCQkJY29uZl9yZW1vdmVfbm93KGNiLT5zZWN0aW9uLCBjYi0+dGFnKTsKKwkJfQorCQlmcmVlIChjb25mX2FkZHIpOworCX0KKworCWNvbmZfZW5kKHRyYW5zLCAxKTsKKwljb25mX2FkZHIgPSBuZXdfY29uZl9hZGRyOworCXJldHVybjsKKworZmFpbDoKKwlpZiAobmV3X2NvbmZfYWRkcikKKwkJZnJlZShuZXdfY29uZl9hZGRyKTsKKwljbG9zZSAoZmQpOworfQorCisvKgorICogUmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGRlbm90ZWQgYnkgVEFHIGluIHNlY3Rpb24gU0VDVElPTiBvciBERUYKKyAqIGlmIHRoYXQgdGFnIGRvZXMgbm90IGV4aXN0LgorICovCitpbnQKK2NvbmZfZ2V0X251bShjaGFyICpzZWN0aW9uLCBjaGFyICp0YWcsIGludCBkZWYpCit7CisJY2hhciAqdmFsdWUgPSBjb25mX2dldF9zdHIoc2VjdGlvbiwgdGFnKTsKKworCWlmICh2YWx1ZSkKKwkJcmV0dXJuIGF0b2kodmFsdWUpOworCisJcmV0dXJuIGRlZjsKK30KKworLyogVmFsaWRhdGUgWCBhY2NvcmRpbmcgdG8gdGhlIHJhbmdlIGRlbm90ZWQgYnkgVEFHIGluIHNlY3Rpb24gU0VDVElPTi4gICovCitpbnQKK2NvbmZfbWF0Y2hfbnVtKGNoYXIgKnNlY3Rpb24sIGNoYXIgKnRhZywgaW50IHgpCit7CisJY2hhciAqdmFsdWUgPSBjb25mX2dldF9zdHIgKHNlY3Rpb24sIHRhZyk7CisJaW50IHZhbCwgbWluLCBtYXgsIG47CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gMDsKKwluID0gc3NjYW5mICh2YWx1ZSwgIiVkLCVkOiVkIiwgJnZhbCwgJm1pbiwgJm1heCk7CisJc3dpdGNoIChuKSB7CisJY2FzZSAxOgorCQl4bG9nKExPR19JTkZPLCAiY29uZl9tYXRjaF9udW06ICVzOiVzICVkPT0lZD8iLCBzZWN0aW9uLCB0YWcsIHZhbCwgeCk7CisJCXJldHVybiB4ID09IHZhbDsKKwljYXNlIDM6CisJCXhsb2coTE9HX0lORk8sICJjb25mX21hdGNoX251bTogJXM6JXMgJWQ8PSVkPD0lZD8iLCBzZWN0aW9uLCAKKwkJCXRhZywgbWluLCB4LCBtYXgpOworCQlyZXR1cm4gbWluIDw9IHggJiYgbWF4ID49IHg7CisJZGVmYXVsdDoKKwkJeGxvZyhMT0dfSU5GTywgImNvbmZfbWF0Y2hfbnVtOiBzZWN0aW9uICVzIHRhZyAlczogaW52YWxpZCBudW1iZXIgc3BlYyAlcyIsCisJCQlzZWN0aW9uLCB0YWcsIHZhbHVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgc3RyaW5nIHZhbHVlIGRlbm90ZWQgYnkgVEFHIGluIHNlY3Rpb24gU0VDVElPTi4gICovCitjaGFyICoKK2NvbmZfZ2V0X3N0cihjaGFyICpzZWN0aW9uLCBjaGFyICp0YWcpCit7CisJc3RydWN0IGNvbmZfYmluZGluZyAqY2I7CisKKwljYiA9IExJU1RfRklSU1QgKCZjb25mX2JpbmRpbmdzW2NvbmZfaGFzaCAoc2VjdGlvbildKTsKKwlmb3IgKDsgY2I7IGNiID0gTElTVF9ORVhUIChjYiwgbGluaykpIHsKKwkJaWYgKHN0cmNhc2VjbXAgKHNlY3Rpb24sIGNiLT5zZWN0aW9uKSA9PSAwCisJCQkJJiYgc3RyY2FzZWNtcCAodGFnLCBjYi0+dGFnKSA9PSAwKQorCQkJcmV0dXJuIGNiLT52YWx1ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisvKgorICogRmluZCBhIHNlY3Rpb24gdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFyZ3VtZW50CisgKi8KK2NoYXIgKgorY29uZl9nZXRfc2VjdGlvbihjaGFyICpzZWN0aW9uLCBjaGFyICphcmcsIGNoYXIgKnRhZykKK3sKKwlzdHJ1Y3QgY29uZl9iaW5kaW5nICpjYjsKKworCWNiID0gTElTVF9GSVJTVCAoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOworCWZvciAoOyBjYjsgY2IgPSBMSVNUX05FWFQgKGNiLCBsaW5rKSkgeworCQlpZiAoc3RyY2FzZWNtcChzZWN0aW9uLCBjYi0+c2VjdGlvbikgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoYXJnICYmIHN0cmNhc2VjbXAoYXJnLCBjYi0+YXJnKSAhPSAwKQorCQkJY29udGludWU7CisJCWlmIChzdHJjYXNlY21wKHRhZywgY2ItPnRhZykgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gY2ItPnZhbHVlOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1aWxkIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzIG91dCBvZiB0aGUgY29tbWEgc2VwYXJhdGVkIHZhbHVlIGRlbm90ZWQgYnkKKyAqIFRBRyBpbiBTRUNUSU9OLgorICovCitzdHJ1Y3QgY29uZl9saXN0ICoKK2NvbmZfZ2V0X2xpc3QoY2hhciAqc2VjdGlvbiwgY2hhciAqdGFnKQoreworCWNoYXIgKmxpc3RzdHIgPSAwLCAqcCwgKmZpZWxkLCAqdDsKKwlzdHJ1Y3QgY29uZl9saXN0ICpsaXN0ID0gMDsKKwlzdHJ1Y3QgY29uZl9saXN0X25vZGUgKm5vZGU7CisKKwlsaXN0ID0gbWFsbG9jIChzaXplb2YgKmxpc3QpOworCWlmICghbGlzdCkKKwkJZ290byBjbGVhbnVwOworCVRBSUxRX0lOSVQgKCZsaXN0LT5maWVsZHMpOworCWxpc3QtPmNudCA9IDA7CisJbGlzdHN0ciA9IGNvbmZfZ2V0X3N0cihzZWN0aW9uLCB0YWcpOworCWlmICghbGlzdHN0cikKKwkJZ290byBjbGVhbnVwOworCWxpc3RzdHIgPSBzdHJkdXAgKGxpc3RzdHIpOworCWlmICghbGlzdHN0cikKKwkJZ290byBjbGVhbnVwOworCXAgPSBsaXN0c3RyOworCXdoaWxlICgoZmllbGQgPSBzdHJzZXAgKCZwLCAiLCIpKSAhPSBOVUxMKSB7CisJCS8qIFNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisJCXdoaWxlIChpc3NwYWNlICgqZmllbGQpKQorCQkJZmllbGQrKzsKKwkJLyogU2tpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJCWlmIChwKSB7CisJCQlmb3IgKHQgPSBwIC0gMTsgdCA+IGZpZWxkICYmIGlzc3BhY2UgKCp0KTsgdC0tKQorCQkJCSp0ID0gJ1wwJzsKKwkJfQorCQlpZiAoKmZpZWxkID09ICdcMCcpIHsKKwkJCXhsb2coTE9HX0lORk8sICJjb25mX2dldF9saXN0OiBlbXB0eSBmaWVsZCwgaWdub3JpbmcuLi4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxpc3QtPmNudCsrOworCQlub2RlID0gY2FsbG9jICgxLCBzaXplb2YgKm5vZGUpOworCQlpZiAoIW5vZGUpCisJCQlnb3RvIGNsZWFudXA7CisJCW5vZGUtPmZpZWxkID0gc3RyZHVwIChmaWVsZCk7CisJCWlmICghbm9kZS0+ZmllbGQpIHsKKwkJCWZyZWUobm9kZSk7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJVEFJTFFfSU5TRVJUX1RBSUwgKCZsaXN0LT5maWVsZHMsIG5vZGUsIGxpbmspOworCX0KKwlmcmVlIChsaXN0c3RyKTsKKwlyZXR1cm4gbGlzdDsKKworY2xlYW51cDoKKwlpZiAobGlzdCkKKwkJY29uZl9mcmVlX2xpc3QobGlzdCk7CisJaWYgKGxpc3RzdHIpCisJCWZyZWUobGlzdHN0cik7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb25mX2xpc3QgKgorY29uZl9nZXRfdGFnX2xpc3QoY2hhciAqc2VjdGlvbikKK3sKKwlzdHJ1Y3QgY29uZl9saXN0ICpsaXN0ID0gMDsKKwlzdHJ1Y3QgY29uZl9saXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGNvbmZfYmluZGluZyAqY2I7CisKKwlsaXN0ID0gbWFsbG9jKHNpemVvZiAqbGlzdCk7CisJaWYgKCFsaXN0KQorCQlnb3RvIGNsZWFudXA7CisJVEFJTFFfSU5JVCgmbGlzdC0+ZmllbGRzKTsKKwlsaXN0LT5jbnQgPSAwOworCWNiID0gTElTVF9GSVJTVCgmY29uZl9iaW5kaW5nc1tjb25mX2hhc2ggKHNlY3Rpb24pXSk7CisJZm9yICg7IGNiOyBjYiA9IExJU1RfTkVYVChjYiwgbGluaykpIHsKKwkJaWYgKHN0cmNhc2VjbXAgKHNlY3Rpb24sIGNiLT5zZWN0aW9uKSA9PSAwKSB7CisJCQlsaXN0LT5jbnQrKzsKKwkJCW5vZGUgPSBjYWxsb2MoMSwgc2l6ZW9mICpub2RlKTsKKwkJCWlmICghbm9kZSkKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlub2RlLT5maWVsZCA9IHN0cmR1cChjYi0+dGFnKTsKKwkJCWlmICghbm9kZS0+ZmllbGQpIHsKKwkJCQlmcmVlKG5vZGUpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCVRBSUxRX0lOU0VSVF9UQUlMKCZsaXN0LT5maWVsZHMsIG5vZGUsIGxpbmspOworCQl9CisJfQorCXJldHVybiBsaXN0OworCitjbGVhbnVwOgorCWlmIChsaXN0KQorCQljb25mX2ZyZWVfbGlzdChsaXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyogRGVjb2RlIGEgUEVNIGVuY29kZWQgYnVmZmVyLiAgKi8KK2ludAorY29uZl9kZWNvZGVfYmFzZTY0ICh1X2ludDhfdCAqb3V0LCB1X2ludDMyX3QgKmxlbiwgdV9jaGFyICpidWYpCit7CisJdV9pbnQzMl90IGMgPSAwOworCXVfaW50OF90IGMxLCBjMiwgYzMsIGM0OworCisJd2hpbGUgKCpidWYpIHsKKwkJaWYgKCpidWYgPiAxMjcgfHwgKGMxID0gYXNjMmJpblsqYnVmXSkgPT0gMjU1KQorCQkJcmV0dXJuIDA7CisKKwkJYnVmKys7CisJCWlmICgqYnVmID4gMTI3IHx8IChjMiA9IGFzYzJiaW5bKmJ1Zl0pID09IDI1NSkKKwkJCXJldHVybiAwOworCisJCWJ1ZisrOworCQlpZiAoKmJ1ZiA9PSAnPScpIHsKKwkJCWMzID0gYzQgPSAwOworCQkJYysrOworCisJCQkvKiBDaGVjayBsYXN0IGZvdXIgYml0ICovCisJCQlpZiAoYzIgJiAweEYpCisJCQkJcmV0dXJuIDA7CisKKwkJCWlmIChzdHJjbXAoKGNoYXIgKilidWYsICI9PSIpID09IDApCisJCQkJYnVmKys7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKmJ1ZiA+IDEyNyB8fCAoYzMgPSBhc2MyYmluWypidWZdKSA9PSAyNTUpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQlpZiAoKisrYnVmID09ICc9JykgeworCQkJCWM0ID0gMDsKKwkJCQljICs9IDI7CisKKwkJCQkvKiBDaGVjayBsYXN0IHR3byBiaXQgKi8KKwkJCQlpZiAoYzMgJiAzKQorCQkJCQlyZXR1cm4gMDsKKworCQkJaWYgKHN0cmNtcCgoY2hhciAqKWJ1ZiwgIj0iKSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSBpZiAoKmJ1ZiA+IDEyNyB8fCAoYzQgPSBhc2MyYmluWypidWZdKSA9PSAyNTUpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJYyArPSAzOworCQl9CisKKwkJYnVmKys7CisJCSpvdXQrKyA9IChjMSA8PCAyKSB8IChjMiA+PiA0KTsKKwkJKm91dCsrID0gKGMyIDw8IDQpIHwgKGMzID4+IDIpOworCQkqb3V0KysgPSAoYzMgPDwgNikgfCBjNDsKKwl9CisKKwkqbGVuID0gYzsKKwlyZXR1cm4gMTsKK30KKwordm9pZAorY29uZl9mcmVlX2xpc3Qoc3RydWN0IGNvbmZfbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgY29uZl9saXN0X25vZGUgKm5vZGUgPSBUQUlMUV9GSVJTVCgmbGlzdC0+ZmllbGRzKTsKKworCXdoaWxlIChub2RlKSB7CisJCVRBSUxRX1JFTU9WRSgmbGlzdC0+ZmllbGRzLCBub2RlLCBsaW5rKTsKKwkJaWYgKG5vZGUtPmZpZWxkKQorCQkJZnJlZShub2RlLT5maWVsZCk7CisJCWZyZWUgKG5vZGUpOworCQlub2RlID0gVEFJTFFfRklSU1QoJmxpc3QtPmZpZWxkcyk7CisJfQorCWZyZWUgKGxpc3QpOworfQorCitpbnQKK2NvbmZfYmVnaW4odm9pZCkKK3sKKyAgc3RhdGljIGludCBzZXEgPSAwOworCisgIHJldHVybiArK3NlcTsKK30KKworc3RhdGljIHN0cnVjdCBjb25mX3RyYW5zICoKK2NvbmZfdHJhbnNfbm9kZShpbnQgdHJhbnNhY3Rpb24sIGVudW0gY29uZl9vcCBvcCkKK3sKKwlzdHJ1Y3QgY29uZl90cmFucyAqbm9kZTsKKworCW5vZGUgPSBjYWxsb2MgKDEsIHNpemVvZiAqbm9kZSk7CisJaWYgKCFub2RlKSB7CisJCXhsb2dfd2FybigiY29uZl90cmFuc19ub2RlOiBjYWxsb2MgKDEsICVsdSkgZmFpbGVkIiwKKwkJKHVuc2lnbmVkIGxvbmcpc2l6ZW9mICpub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCW5vZGUtPnRyYW5zID0gdHJhbnNhY3Rpb247CisJbm9kZS0+b3AgPSBvcDsKKwlUQUlMUV9JTlNFUlRfVEFJTCAoJmNvbmZfdHJhbnNfcXVldWUsIG5vZGUsIGxpbmspOworCXJldHVybiBub2RlOworfQorCisvKiBRdWV1ZSBhIHNldCBvcGVyYXRpb24uICAqLworc3RhdGljIGludAorY29uZl9zZXQoaW50IHRyYW5zYWN0aW9uLCBjaGFyICpzZWN0aW9uLCBjaGFyICphcmcsCisJY2hhciAqdGFnLCBjaGFyICp2YWx1ZSwgaW50IG92ZXJyaWRlLCBpbnQgaXNfZGVmYXVsdCkKK3sKKwlzdHJ1Y3QgY29uZl90cmFucyAqbm9kZTsKKworCW5vZGUgPSBjb25mX3RyYW5zX25vZGUodHJhbnNhY3Rpb24sIENPTkZfU0VUKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAxOworCW5vZGUtPnNlY3Rpb24gPSBzdHJkdXAoc2VjdGlvbik7CisJaWYgKCFub2RlLT5zZWN0aW9uKSB7CisJCXhsb2dfd2FybigiY29uZl9zZXQ6IHN0cmR1cChcIiVzXCIpIGZhaWxlZCIsIHNlY3Rpb24pOworCQlnb3RvIGZhaWw7CisJfQorCS8qIE1ha2UgU2VjdGlvbiBuYW1lcyBjYXNlLWluc2Vuc2l0aXZlICovCisJdXBwZXIybG93ZXIobm9kZS0+c2VjdGlvbik7CisKKwlpZiAoYXJnKSB7CisJCW5vZGUtPmFyZyA9IHN0cmR1cChhcmcpOworCQlpZiAoIW5vZGUtPmFyZykgeworCQkJeGxvZ193YXJuKCJjb25mX3NldDogc3RyZHVwKFwiJXNcIikgZmFpbGVkIiwgYXJnKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZQorCQlub2RlLT5hcmcgPSBOVUxMOworCisJbm9kZS0+dGFnID0gc3RyZHVwKHRhZyk7CisJaWYgKCFub2RlLT50YWcpIHsKKwkJeGxvZ193YXJuKCJjb25mX3NldDogc3RyZHVwKFwiJXNcIikgZmFpbGVkIiwgdGFnKTsKKwkJZ290byBmYWlsOworCX0KKwlub2RlLT52YWx1ZSA9IHN0cmR1cCh2YWx1ZSk7CisJaWYgKCFub2RlLT52YWx1ZSkgeworCQl4bG9nX3dhcm4oImNvbmZfc2V0OiBzdHJkdXAoXCIlc1wiKSBmYWlsZWQiLCB2YWx1ZSk7CisJCWdvdG8gZmFpbDsKKwl9CisJbm9kZS0+b3ZlcnJpZGUgPSBvdmVycmlkZTsKKwlub2RlLT5pc19kZWZhdWx0ID0gaXNfZGVmYXVsdDsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpZiAobm9kZS0+dGFnKQorCQlmcmVlKG5vZGUtPnRhZyk7CisJaWYgKG5vZGUtPnNlY3Rpb24pCisJCWZyZWUobm9kZS0+c2VjdGlvbik7CisJaWYgKG5vZGUpCisJCWZyZWUobm9kZSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFF1ZXVlIGEgcmVtb3ZlIG9wZXJhdGlvbi4gICovCitpbnQKK2NvbmZfcmVtb3ZlKGludCB0cmFuc2FjdGlvbiwgY2hhciAqc2VjdGlvbiwgY2hhciAqdGFnKQoreworCXN0cnVjdCBjb25mX3RyYW5zICpub2RlOworCisJbm9kZSA9IGNvbmZfdHJhbnNfbm9kZSh0cmFuc2FjdGlvbiwgQ09ORl9SRU1PVkUpOworCWlmICghbm9kZSkKKwkJZ290byBmYWlsOworCW5vZGUtPnNlY3Rpb24gPSBzdHJkdXAoc2VjdGlvbik7CisJaWYgKCFub2RlLT5zZWN0aW9uKSB7CisJCXhsb2dfd2FybigiY29uZl9yZW1vdmU6IHN0cmR1cChcIiVzXCIpIGZhaWxlZCIsIHNlY3Rpb24pOworCQlnb3RvIGZhaWw7CisJfQorCW5vZGUtPnRhZyA9IHN0cmR1cCh0YWcpOworCWlmICghbm9kZS0+dGFnKSB7CisJCXhsb2dfd2FybigiY29uZl9yZW1vdmU6IHN0cmR1cChcIiVzXCIpIGZhaWxlZCIsIHRhZyk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKG5vZGUgJiYgbm9kZS0+c2VjdGlvbikKKwkJZnJlZSAobm9kZS0+c2VjdGlvbik7CisJaWYgKG5vZGUpCisJCWZyZWUgKG5vZGUpOworCXJldHVybiAxOworfQorCisvKiBRdWV1ZSBhIHJlbW92ZSBzZWN0aW9uIG9wZXJhdGlvbi4gICovCitpbnQKK2NvbmZfcmVtb3ZlX3NlY3Rpb24oaW50IHRyYW5zYWN0aW9uLCBjaGFyICpzZWN0aW9uKQoreworCXN0cnVjdCBjb25mX3RyYW5zICpub2RlOworCisJbm9kZSA9IGNvbmZfdHJhbnNfbm9kZSh0cmFuc2FjdGlvbiwgQ09ORl9SRU1PVkVfU0VDVElPTik7CisJaWYgKCFub2RlKQorCQlnb3RvIGZhaWw7CisJbm9kZS0+c2VjdGlvbiA9IHN0cmR1cChzZWN0aW9uKTsKKwlpZiAoIW5vZGUtPnNlY3Rpb24pIHsKKwkJeGxvZ193YXJuKCJjb25mX3JlbW92ZV9zZWN0aW9uOiBzdHJkdXAoXCIlc1wiKSBmYWlsZWQiLCBzZWN0aW9uKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gMDsKKworZmFpbDoKKwlpZiAobm9kZSkKKwkJZnJlZShub2RlKTsKKwlyZXR1cm4gMTsKK30KKworLyogRXhlY3V0ZSBhbGwgcXVldWVkIG9wZXJhdGlvbnMgZm9yIHRoaXMgdHJhbnNhY3Rpb24uICBDbGVhbnVwLiAgKi8KK2ludAorY29uZl9lbmQoaW50IHRyYW5zYWN0aW9uLCBpbnQgY29tbWl0KQoreworCXN0cnVjdCBjb25mX3RyYW5zICpub2RlLCAqbmV4dDsKKworCWZvciAobm9kZSA9IFRBSUxRX0ZJUlNUKCZjb25mX3RyYW5zX3F1ZXVlKTsgbm9kZTsgbm9kZSA9IG5leHQpIHsKKwkJbmV4dCA9IFRBSUxRX05FWFQobm9kZSwgbGluayk7CisJCWlmIChub2RlLT50cmFucyA9PSB0cmFuc2FjdGlvbikgeworCQkJaWYgKGNvbW1pdCkgeworCQkJCXN3aXRjaCAobm9kZS0+b3ApIHsKKwkJCQljYXNlIENPTkZfU0VUOgorCQkJCQljb25mX3NldF9ub3cobm9kZS0+c2VjdGlvbiwgbm9kZS0+YXJnLCAKKwkJCQkJCW5vZGUtPnRhZywgbm9kZS0+dmFsdWUsIG5vZGUtPm92ZXJyaWRlLCAKKwkJCQkJCW5vZGUtPmlzX2RlZmF1bHQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIENPTkZfUkVNT1ZFOgorCQkJCQljb25mX3JlbW92ZV9ub3cobm9kZS0+c2VjdGlvbiwgbm9kZS0+dGFnKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBDT05GX1JFTU9WRV9TRUNUSU9OOgorCQkJCQljb25mX3JlbW92ZV9zZWN0aW9uX25vdyhub2RlLT5zZWN0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJeGxvZyhMT0dfSU5GTywgImNvbmZfZW5kOiB1bmtub3duIG9wZXJhdGlvbjogJWQiLCBub2RlLT5vcCk7CisJCQkJfQorCQkJfQorCQkJVEFJTFFfUkVNT1ZFICgmY29uZl90cmFuc19xdWV1ZSwgbm9kZSwgbGluayk7CisJCQlpZiAobm9kZS0+c2VjdGlvbikKKwkJCQlmcmVlKG5vZGUtPnNlY3Rpb24pOworCQkJaWYgKG5vZGUtPnRhZykKKwkJCQlmcmVlKG5vZGUtPnRhZyk7CisJCQlpZiAobm9kZS0+dmFsdWUpCisJCQkJZnJlZShub2RlLT52YWx1ZSk7CisJCQlmcmVlIChub2RlKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIER1bXAgcnVubmluZyBjb25maWd1cmF0aW9uIHVwb24gU0lHVVNSMS4KKyAqIENvbmZpZ3VyYXRpb24gaXMgInN0b3JlZCBpbiByZXZlcnNlIG9yZGVyIiwgc28gcmV2ZXJzZSBpdCBhZ2Fpbi4KKyAqLworc3RydWN0IGR1bXBlciB7CisJY2hhciAqcywgKnY7CisJc3RydWN0IGR1bXBlciAqbmV4dDsKK307CisKK3N0YXRpYyB2b2lkCitjb25mX3JlcG9ydF9kdW1wKHN0cnVjdCBkdW1wZXIgKm5vZGUpCit7CisJLyogUmVjdXJzaXZlLCBjbGVhbnVwIHdoZW4gd2UncmUgZG9uZS4gICovCisJaWYgKG5vZGUtPm5leHQpCisJCWNvbmZfcmVwb3J0X2R1bXAobm9kZS0+bmV4dCk7CisKKwlpZiAobm9kZS0+dikKKwkJeGxvZyhMT0dfSU5GTywgIiVzPVx0JXMiLCBub2RlLT5zLCBub2RlLT52KTsKKwllbHNlIGlmIChub2RlLT5zKSB7CisJCXhsb2coTE9HX0lORk8sICIlcyIsIG5vZGUtPnMpOworCQlpZiAoc3RybGVuKG5vZGUtPnMpID4gMCkKKwkJCWZyZWUobm9kZS0+cyk7CisJfQorCisJZnJlZSAobm9kZSk7Cit9CisKK3ZvaWQKK2NvbmZfcmVwb3J0ICh2b2lkKQoreworCXN0cnVjdCBjb25mX2JpbmRpbmcgKmNiLCAqbGFzdCA9IDA7CisJdW5zaWduZWQgaW50IGksIGxlbiwgZGlmZl9hcmcgPSAwOworCWNoYXIgKmN1cnJlbnRfc2VjdGlvbiA9IChjaGFyICopMDsKKwljaGFyICpjdXJyZW50X2FyZyA9IChjaGFyICopMDsKKwlzdHJ1Y3QgZHVtcGVyICpkdW1wZXIsICpkbm9kZTsKKworCWR1bXBlciA9IGRub2RlID0gKHN0cnVjdCBkdW1wZXIgKiljYWxsb2MoMSwgc2l6ZW9mICpkdW1wZXIpOworCWlmICghZHVtcGVyKQorCQlnb3RvIG1lbV9mYWlsOworCisJeGxvZyhMT0dfSU5GTywgImNvbmZfcmVwb3J0OiBkdW1waW5nIHJ1bm5pbmcgY29uZmlndXJhdGlvbiIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiBjb25mX2JpbmRpbmdzIC8gc2l6ZW9mIGNvbmZfYmluZGluZ3NbMF07IGkrKykKKwkJZm9yIChjYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbaV0pOyBjYjsgY2IgPSBMSVNUX05FWFQoY2IsIGxpbmspKSB7CisJCQlpZiAoIWNiLT5pc19kZWZhdWx0KSB7CisJCQkJLyogTWFrZSBzdXJlIHRoZSBTZWN0aW9uIGFydWdtZW50IGlzIHRoZSBzYW1lICovCisJCQkJaWYgKGN1cnJlbnRfYXJnICYmIGN1cnJlbnRfc2VjdGlvbiAmJiBjYi0+YXJnKSB7CisJCQkJCWlmIChzdHJjbXAoY2ItPnNlY3Rpb24sIGN1cnJlbnRfc2VjdGlvbikgPT0gMCAmJgorCQkJCQkJc3RyY21wKGNiLT5hcmcsIGN1cnJlbnRfYXJnKSAhPSAwKQorCQkJCQlkaWZmX2FyZyA9IDE7CisJCQkJfQorCQkJCS8qIER1bXAgdGhpcyBlbnRyeS4gICovCisJCQkJaWYgKCFjdXJyZW50X3NlY3Rpb24gfHwgc3RyY21wKGNiLT5zZWN0aW9uLCBjdXJyZW50X3NlY3Rpb24pIAorCQkJCQkJCXx8IGRpZmZfYXJnKSB7CisJCQkJCWlmIChjdXJyZW50X3NlY3Rpb24gfHwgZGlmZl9hcmcpIHsKKwkJCQkJCWxlbiA9IHN0cmxlbiAoY3VycmVudF9zZWN0aW9uKSArIDM7CisJCQkJCQlpZiAoY3VycmVudF9hcmcpCisJCQkJCQkJbGVuICs9IHN0cmxlbihjdXJyZW50X2FyZykgKyAzOworCQkJCQkJZG5vZGUtPnMgPSBtYWxsb2MobGVuKTsKKwkJCQkJCWlmICghZG5vZGUtPnMpCisJCQkJCQkJZ290byBtZW1fZmFpbDsKKworCQkJCQkJaWYgKGN1cnJlbnRfYXJnKQorCQkJCQkJCXNucHJpbnRmKGRub2RlLT5zLCBsZW4sICJbJXMgXCIlc1wiXSIsIAorCQkJCQkJCQljdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfYXJnKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQlzbnByaW50Zihkbm9kZS0+cywgbGVuLCAiWyVzXSIsIGN1cnJlbnRfc2VjdGlvbik7CisKKwkJCQkJCWRub2RlLT5uZXh0ID0gCisJCQkJCQkJKHN0cnVjdCBkdW1wZXIgKiljYWxsb2MoMSwgc2l6ZW9mIChzdHJ1Y3QgZHVtcGVyKSk7CisJCQkJCQlkbm9kZSA9IGRub2RlLT5uZXh0OworCQkJCQkJaWYgKCFkbm9kZSkKKwkJCQkJCQlnb3RvIG1lbV9mYWlsOworCisJCQkJCQlkbm9kZS0+cyA9ICIiOworCQkJCQkJZG5vZGUtPm5leHQgPSAKKwkJCQkJCQkoc3RydWN0IGR1bXBlciAqKWNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBkdW1wZXIpKTsKKwkJCQkJCWRub2RlID0gZG5vZGUtPm5leHQ7CisJCQkJCQlpZiAoIWRub2RlKQorCQkJCQkJZ290byBtZW1fZmFpbDsKKwkJCQkJfQorCQkJCQljdXJyZW50X3NlY3Rpb24gPSBjYi0+c2VjdGlvbjsKKwkJCQkJY3VycmVudF9hcmcgPSBjYi0+YXJnOworCQkJCQlkaWZmX2FyZyA9IDA7CisJCQkJfQorCQkJCWRub2RlLT5zID0gY2ItPnRhZzsKKwkJCQlkbm9kZS0+diA9IGNiLT52YWx1ZTsKKwkJCQlkbm9kZS0+bmV4dCA9IChzdHJ1Y3QgZHVtcGVyICopY2FsbG9jICgxLCBzaXplb2YgKHN0cnVjdCBkdW1wZXIpKTsKKwkJCQlkbm9kZSA9IGRub2RlLT5uZXh0OworCQkJCWlmICghZG5vZGUpCisJCQkJCWdvdG8gbWVtX2ZhaWw7CisJCQkJbGFzdCA9IGNiOworCQl9CisJfQorCisJaWYgKGxhc3QpIHsKKwkJbGVuID0gc3RybGVuKGxhc3QtPnNlY3Rpb24pICsgMzsKKwkJaWYgKGxhc3QtPmFyZykKKwkJCWxlbiArPSBzdHJsZW4obGFzdC0+YXJnKSArIDM7CisJCWRub2RlLT5zID0gbWFsbG9jKGxlbik7CisJCWlmICghZG5vZGUtPnMpCisJCQlnb3RvIG1lbV9mYWlsOworCQlpZiAobGFzdC0+YXJnKQorCQkJc25wcmludGYoZG5vZGUtPnMsIGxlbiwgIlslcyBcIiVzXCJdIiwgbGFzdC0+c2VjdGlvbiwgbGFzdC0+YXJnKTsKKwkJZWxzZQorCQkJc25wcmludGYoZG5vZGUtPnMsIGxlbiwgIlslc10iLCBsYXN0LT5zZWN0aW9uKTsKKwl9CisJY29uZl9yZXBvcnRfZHVtcChkdW1wZXIpOworCXJldHVybjsKKworbWVtX2ZhaWw6CisJeGxvZ193YXJuKCJjb25mX3JlcG9ydDogbWFsbG9jL2NhbGxvYyBmYWlsZWQiKTsKKwl3aGlsZSAoKGRub2RlID0gZHVtcGVyKSAhPSAwKSB7CisJCWR1bXBlciA9IGR1bXBlci0+bmV4dDsKKwkJaWYgKGRub2RlLT5zKQorCQkJZnJlZShkbm9kZS0+cyk7CisJCWZyZWUoZG5vZGUpOworCX0KKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvZXhwb3J0cy5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2V4cG9ydHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTM5NDFjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2V4cG9ydHMuYwpAQCAtMCwwICsxLDc5MSBAQAorLyoKKyAqIHN1cHBvcnQvbmZzL2V4cG9ydC5jCisgKgorICogUGFyc2UgdGhlIGV4cG9ydHMgZmlsZS4gRGVyaXZlZCBmcm9tIHRoZSB1bmZzZCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBBdXRob3JzOglEb25hbGQgSi4gQmVja2VyLCA8YmVja2VyQHN1cGVyLm9yZz4KKyAqCQlSaWNrIFNsYWRrZXksIDxqcnNAd29ybGQuc3RkLmNvbT4KKyAqCQlGcmVkIE4uIHZhbiBLZW1wZW4sIDx3YWx0amVAdVdhbHQuTkwuTXVnbmV0Lk9SRz4KKyAqCQlPbGFmIEtpcmNoLCA8b2tpckBtb25hZC5zd2IuZGU+CisgKgkJQWxleGFuZGVyIE8uIFl1cmlldiwgPGFsZXhAYmFjaC5jaXMudGVtcGxlLmVkdT4KKyAqCisgKgkJVGhpcyBzb2Z0d2FyZSBtYXliZSBiZSB1c2VkIGZvciBhbnkgcHVycG9zZSBwcm92aWRlZAorICoJCXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkLiAgSXQgaXMgc3VwcGxpZWQKKyAqCQlhcyBpcywgd2l0aCBubyB3YXJyYW50eSBleHByZXNzZWQgb3IgaW1wbGllZC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJuZnNsaWIuaCIKKyNpbmNsdWRlICJleHBvcnRmcy5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisjaW5jbHVkZSAieGlvLmgiCisjaW5jbHVkZSAicHNldWRvZmxhdm9ycy5oIgorCisjZGVmaW5lIEVYUE9SVF9ERUZBVUxUX0ZMQUdTCVwKKyAgKE5GU0VYUF9SRUFET05MWXxORlNFWFBfUk9PVFNRVUFTSHxORlNFWFBfR0FUSEVSRURfV1JJVEVTfE5GU0VYUF9OT1NVQlRSRUVDSEVDSykKKworc3RydWN0IGZsYXZfaW5mbyBmbGF2X21hcFtdID0geworCXsgImtyYjUiLAlSUENfQVVUSF9HU1NfS1JCNQl9LAorCXsgImtyYjVpIiwJUlBDX0FVVEhfR1NTX0tSQjVJCX0sCisJeyAia3JiNXAiLAlSUENfQVVUSF9HU1NfS1JCNVAJfSwKKwl7ICJsaXBrZXkiLAlSUENfQVVUSF9HU1NfTEtFWQl9LAorCXsgImxpcGtleS1pIiwJUlBDX0FVVEhfR1NTX0xLRVlJCX0sCisJeyAibGlwa2V5LXAiLAlSUENfQVVUSF9HU1NfTEtFWVAJfSwKKwl7ICJzcGttMyIsCVJQQ19BVVRIX0dTU19TUEtNCX0sCisJeyAic3BrbTNpIiwJUlBDX0FVVEhfR1NTX1NQS01JCX0sCisJeyAic3BrbTNwIiwJUlBDX0FVVEhfR1NTX1NQS01QCX0sCisJeyAidW5peCIsCUFVVEhfVU5JWAkJfSwKKwl7ICJzeXMiLAlBVVRIX1NZUwkJfSwKKwl7ICJudWxsIiwJQVVUSF9OVUxMCQl9LAorCXsgIm5vbmUiLAlBVVRIX05PTkUJCX0sCit9OworCitjb25zdCBpbnQgZmxhdl9tYXBfc2l6ZSA9IHNpemVvZihmbGF2X21hcCkvc2l6ZW9mKGZsYXZfbWFwWzBdKTsKKworaW50IGV4cG9ydF9lcnJubzsKKworc3RhdGljIGNoYXIJKmVmbmFtZSA9IE5VTEw7CitzdGF0aWMgWEZJTEUJKmVmcCA9IE5VTEw7CitzdGF0aWMgaW50CWZpcnN0Oworc3RhdGljIGludAloYXNfZGVmYXVsdF9vcHRzLCBoYXNfZGVmYXVsdF9zdWJ0cmVlX29wdHM7CitzdGF0aWMgaW50CSpzcXVpZHMgPSBOVUxMLCBuc3F1aWRzID0gMCwKKwkJKnNxZ2lkcyA9IE5VTEwsIG5zcWdpZHMgPSAwOworCitzdGF0aWMgaW50CWdldGV4cG9ydChjaGFyICpleHAsIGludCBsZW4pOworc3RhdGljIGludAlnZXRwYXRoKGNoYXIgKnBhdGgsIGludCBsZW4pOworc3RhdGljIGludAlwYXJzZW9wdHMoY2hhciAqY3AsIHN0cnVjdCBleHBvcnRlbnQgKmVwLCBpbnQgd2FybiwgaW50ICpoYWRfc3VidHJlZV9vcHRfcHRyKTsKK3N0YXRpYyBpbnQJcGFyc2VzcXVhc2goY2hhciAqbGlzdCwgaW50ICoqaWRwLCBpbnQgKmxlbnAsIGNoYXIgKiplcCk7CitzdGF0aWMgaW50CXBhcnNlbnVtKGNoYXIgKipjcHApOworc3RhdGljIHZvaWQJZnJlZXNxdWFzaCh2b2lkKTsKK3N0YXRpYyB2b2lkCXN5bnRheGVycihjaGFyICptc2cpOworCit2b2lkCitzZXRleHBvcnRlbnQoY2hhciAqZm5hbWUsIGNoYXIgKnR5cGUpCit7CisJaWYgKGVmcCkKKwkJZW5kZXhwb3J0ZW50KCk7CisJaWYgKCFmbmFtZSkKKwkJZm5hbWUgPSBfUEFUSF9FWFBPUlRTOworCWlmICghKGVmcCA9IHhmb3BlbihmbmFtZSwgdHlwZSkpKQorCQl4bG9nKExfRVJST1IsICJjYW4ndCBvcGVuICVzIGZvciAlc2luZyIsCisJCQkJZm5hbWUsIHN0cmNtcCh0eXBlLCAiciIpPyAid3JpdCIgOiAicmVhZCIpOworCWVmbmFtZSA9IHN0cmR1cChmbmFtZSk7CisJZmlyc3QgPSAxOworfQorCitzdGF0aWMgdm9pZCBpbml0X2V4cG9ydGVudCAoc3RydWN0IGV4cG9ydGVudCAqZWUsIGludCBmcm9ta2VybmVsKQoreworCWVlLT5lX2ZsYWdzID0gRVhQT1JUX0RFRkFVTFRfRkxBR1M7CisJLyogc29tZSBrZXJuZWxzIGFzc3VtZSB0aGUgZGVmYXVsdCBpcyBzeW5jIHJhdGhlciB0aGFuCisJICogYXN5bmMuICBNb3JlIHJlY2VudCBrZXJuZWxzIGFsd2F5cyByZXBvcnQgb25lIG9yIG90aGVyLAorCSAqIGJ1dCB0aGlzIHRlc3QgbWFrZXMgc3VyZSB3ZSBhc3N1bWUgc2FtZSBhcyBrZXJuZWwKKwkgKiBEaXR0byBmb3Igd2dhdGhlcgorCSAqLworCWlmIChmcm9ta2VybmVsKSB7CisJCWVlLT5lX2ZsYWdzICY9IH5ORlNFWFBfQVNZTkM7CisJCWVlLT5lX2ZsYWdzICY9IH5ORlNFWFBfR0FUSEVSRURfV1JJVEVTOworCX0KKwllZS0+ZV9hbm9udWlkID0gNjU1MzQ7CisJZWUtPmVfYW5vbmdpZCA9IDY1NTM0OworCWVlLT5lX3NxdWlkcyA9IE5VTEw7CisJZWUtPmVfc3FnaWRzID0gTlVMTDsKKwllZS0+ZV9tb3VudHBvaW50ID0gTlVMTDsKKwllZS0+ZV9mc2xvY21ldGhvZCA9IEZTTE9DX05PTkU7CisJZWUtPmVfZnNsb2NkYXRhID0gTlVMTDsKKwllZS0+ZV9zZWNpbmZvWzBdLmZsYXYgPSBOVUxMOworCWVlLT5lX25zcXVpZHMgPSAwOworCWVlLT5lX25zcWdpZHMgPSAwOworCWVlLT5lX3V1aWQgPSBOVUxMOworfQorCitzdHJ1Y3QgZXhwb3J0ZW50ICoKK2dldGV4cG9ydGVudChpbnQgZnJvbWtlcm5lbCwgaW50IGZyb21leHBvcnRzKQoreworCXN0YXRpYyBzdHJ1Y3QgZXhwb3J0ZW50CWVlLCBkZWZfZWU7CisJY2hhcgkJZXhwWzUxMl0sICpob3N0bmFtZTsKKwljaGFyCQlycGF0aFtNQVhQQVRITEVOKzFdOworCWNoYXIJCSpvcHQsICpzcDsKKwlpbnQJCW9rOworCisJaWYgKCFlZnApCisJCXJldHVybiBOVUxMOworCisJZnJlZXNxdWFzaCgpOworCisJaWYgKGZpcnN0IHx8IChvayA9IGdldGV4cG9ydChleHAsIHNpemVvZihleHApKSkgPT0gMCkgeworCQloYXNfZGVmYXVsdF9vcHRzID0gMDsKKwkJaGFzX2RlZmF1bHRfc3VidHJlZV9vcHRzID0gMDsKKwkKKwkJaW5pdF9leHBvcnRlbnQoJmRlZl9lZSwgZnJvbWtlcm5lbCk7CisKKwkJb2sgPSBnZXRwYXRoKGRlZl9lZS5lX3BhdGgsIHNpemVvZihkZWZfZWUuZV9wYXRoKSk7CisJCWlmIChvayA8PSAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJb2sgPSBnZXRleHBvcnQoZXhwLCBzaXplb2YoZXhwKSk7CisJfQorCWlmIChvayA8IDApIHsKKwkJeGxvZyhMX0VSUk9SLCAiZXhwZWN0ZWQgY2xpZW50KG9wdGlvbnMuLi4pIik7CisJCWV4cG9ydF9lcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZpcnN0ID0gMDsKKwkJCisJLyogQ2hlY2sgZm9yIGRlZmF1bHQgb3B0aW9ucyAqLworCWlmIChleHBbMF0gPT0gJy0nKSB7CisJCWlmIChwYXJzZW9wdHMoZXhwICsgMSwgJmRlZl9lZSwgMCwgJmhhc19kZWZhdWx0X3N1YnRyZWVfb3B0cykgPCAwKQorCQkJcmV0dXJuIE5VTEw7CisJCQorCQloYXNfZGVmYXVsdF9vcHRzID0gMTsKKworCQlvayA9IGdldGV4cG9ydChleHAsIHNpemVvZihleHApKTsKKwkJaWYgKG9rIDwgMCkgeworCQkJeGxvZyhMX0VSUk9SLCAiZXhwZWN0ZWQgY2xpZW50KG9wdGlvbnMuLi4pIik7CisJCQlleHBvcnRfZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWVlID0gZGVmX2VlOworCisJLyogQ2hlY2sgZm9yIGRlZmF1bHQgY2xpZW50ICovCisJaWYgKG9rID09IDApCisJCWV4cFswXSA9ICdcMCc7CisKKwlob3N0bmFtZSA9IGV4cDsKKwlpZiAoKG9wdCA9IHN0cmNocihleHAsICcoJykpICE9IE5VTEwpIHsKKwkJaWYgKG9wdCA9PSBleHApIHsKKwkJCXhsb2coTF9XQVJOSU5HLCAiTm8gaG9zdCBuYW1lIGdpdmVuIHdpdGggJXMgJXMsIHN1Z2dlc3QgKiVzIHRvIGF2b2lkIHdhcm5pbmciLCBlZS5lX3BhdGgsIGV4cCwgZXhwKTsKKwkJCWhvc3RuYW1lID0gIioiOworCQl9CisJCSpvcHQrKyA9ICdcMCc7CisJCWlmICghKHNwID0gc3RyY2hyKG9wdCwgJyknKSkgfHwgc3BbMV0gIT0gJ1wwJykgeworCQkJc3ludGF4ZXJyKCJiYWQgb3B0aW9uIGxpc3QiKTsKKwkJCWV4cG9ydF9lcnJubyA9IEVJTlZBTDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSpzcCA9ICdcMCc7CisJfSBlbHNlIHsKKwkJaWYgKCFoYXNfZGVmYXVsdF9vcHRzKQorCQkJeGxvZyhMX1dBUk5JTkcsICJObyBvcHRpb25zIGZvciAlcyAlczogc3VnZ2VzdCAlcyhzeW5jKSB0byBhdm9pZCB3YXJuaW5nIiwgZWUuZV9wYXRoLCBleHAsIGV4cCk7CisJfQorCXhmcmVlKGVlLmVfaG9zdG5hbWUpOworCWVlLmVfaG9zdG5hbWUgPSB4c3RyZHVwKGhvc3RuYW1lKTsKKworCWlmIChwYXJzZW9wdHMob3B0LCAmZWUsIGZyb21leHBvcnRzICYmICFoYXNfZGVmYXVsdF9zdWJ0cmVlX29wdHMsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiByZXNvbHZlIHN5bWxpbmtzICovCisJaWYgKHJlYWxwYXRoKGVlLmVfcGF0aCwgcnBhdGgpICE9IE5VTEwpIHsKKwkJcnBhdGhbc2l6ZW9mIChycGF0aCkgLSAxXSA9ICdcMCc7CisJCXN0cm5jcHkoZWUuZV9wYXRoLCBycGF0aCwgc2l6ZW9mIChlZS5lX3BhdGgpIC0gMSk7CisJCWVlLmVfcGF0aFtzaXplb2YgKGVlLmVfcGF0aCkgLSAxXSA9ICdcMCc7CisJfQorCisJcmV0dXJuICZlZTsKK30KKwordm9pZCBzZWNpbmZvX3Nob3coRklMRSAqZnAsIHN0cnVjdCBleHBvcnRlbnQgKmVwKQoreworCXN0cnVjdCBzZWNfZW50cnkgKnAxLCAqcDI7CisJaW50IGZsYWdzOworCisJZm9yIChwMT1lcC0+ZV9zZWNpbmZvOyBwMS0+ZmxhdjsgcDE9cDIpIHsKKworCQlmcHJpbnRmKGZwLCAiLHNlYz0lcyIsIHAxLT5mbGF2LT5mbGF2b3VyKTsKKwkJZm9yIChwMj1wMSsxOyAocDItPmZsYXYgIT0gTlVMTCkgJiYgKHAxLT5mbGFncyA9PSBwMi0+ZmxhZ3MpOworCQkJCQkJCQlwMisrKSB7CisJCQlmcHJpbnRmKGZwLCAiOiVzIiwgcDItPmZsYXYtPmZsYXZvdXIpOworCQl9CisJCWZsYWdzID0gcDEtPmZsYWdzOworCQlmcHJpbnRmKGZwLCAiLCVzIiwgKGZsYWdzICYgTkZTRVhQX1JFQURPTkxZKSA/ICJybyIgOiAicnciKTsKKwkJZnByaW50ZihmcCwgIiwlc3Jvb3Rfc3F1YXNoIiwgKGZsYWdzICYgTkZTRVhQX1JPT1RTUVVBU0gpPworCQkJCSIiIDogIm5vXyIpOworCQlmcHJpbnRmKGZwLCAiLCVzYWxsX3NxdWFzaCIsIChmbGFncyAmIE5GU0VYUF9BTExTUVVBU0gpPworCQkJCSIiIDogIm5vXyIpOworCX0KK30KKwordm9pZAorcHV0ZXhwb3J0ZW50KHN0cnVjdCBleHBvcnRlbnQgKmVwKQoreworCUZJTEUJKmZwOworCWludAkqaWQsIGk7CisJY2hhcgkqZXNjPWVwLT5lX3BhdGg7CisKKwlpZiAoIWVmcCkKKwkJcmV0dXJuOworCisJZnAgPSBlZnAtPnhfZnA7CisJZm9yIChpPTA7IGVzY1tpXTsgaSsrKQorCSAgICAgICAgaWYgKGlzY250cmwoZXNjW2ldKSB8fCBlc2NbaV0gPT0gJyInIHx8IGVzY1tpXSA9PSAnXFwnIHx8IGVzY1tpXSA9PSAnIycgfHwgaXNzcGFjZShlc2NbaV0pKQorCQkJZnByaW50ZihmcCwgIlxcJTAzbyIsIGVzY1tpXSk7CisJCWVsc2UKKwkJCWZwcmludGYoZnAsICIlYyIsIGVzY1tpXSk7CisKKwlmcHJpbnRmKGZwLCAiXHQlcygiLCBlcC0+ZV9ob3N0bmFtZSk7CisJZnByaW50ZihmcCwgIiVzLCIsIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9SRUFET05MWSk/ICJybyIgOiAicnciKTsKKwlmcHJpbnRmKGZwLCAiJXNzeW5jLCIsIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9BU1lOQyk/ICJhIiA6ICIiKTsKKwlmcHJpbnRmKGZwLCAiJXN3ZGVsYXksIiwgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX0dBVEhFUkVEX1dSSVRFUyk/CisJCQkJIiIgOiAibm9fIik7CisJZnByaW50ZihmcCwgIiVzaGlkZSwiLCAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfTk9ISURFKT8KKwkJCQkibm8iIDogIiIpOworCWZwcmludGYoZnAsICIlc2Nyb3NzbW50LCIsIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9DUk9TU01PVU5UKT8KKwkJCQkiIiA6ICJubyIpOworCWZwcmludGYoZnAsICIlc3NlY3VyZSwiLCAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfSU5TRUNVUkVfUE9SVCk/CisJCQkJImluIiA6ICIiKTsKKwlmcHJpbnRmKGZwLCAiJXNyb290X3NxdWFzaCwiLCAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfUk9PVFNRVUFTSCk/CisJCQkJIiIgOiAibm9fIik7CisJZnByaW50ZihmcCwgIiVzYWxsX3NxdWFzaCwiLCAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfQUxMU1FVQVNIKT8KKwkJCQkiIiA6ICJub18iKTsKKwlmcHJpbnRmKGZwLCAiJXNzdWJ0cmVlX2NoZWNrLCIsIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9OT1NVQlRSRUVDSEVDSyk/CisJCSJub18iIDogIiIpOworCWZwcmludGYoZnAsICIlc3NlY3VyZV9sb2NrcywiLCAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfTk9BVVRITkxNKT8KKwkJImluIiA6ICIiKTsKKwlmcHJpbnRmKGZwLCAiJXNhY2wsIiwgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX05PQUNMKT8KKwkJIm5vXyIgOiAiIik7CisJaWYgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX0ZTSUQpIHsKKwkJZnByaW50ZihmcCwgImZzaWQ9JWQsIiwgZXAtPmVfZnNpZCk7CisJfQorCWlmIChlcC0+ZV91dWlkKQorCQlmcHJpbnRmKGZwLCAiZnNpZD0lcywiLCBlcC0+ZV91dWlkKTsKKwlpZiAoZXAtPmVfbW91bnRwb2ludCkKKwkJZnByaW50ZihmcCwgIm1vdW50cG9pbnQlcyVzLCIsCisJCQllcC0+ZV9tb3VudHBvaW50WzBdPyI9IjoiIiwgZXAtPmVfbW91bnRwb2ludCk7CisJc3dpdGNoIChlcC0+ZV9mc2xvY21ldGhvZCkgeworCWNhc2UgRlNMT0NfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBGU0xPQ19SRUZFUjoKKwkJZnByaW50ZihmcCwgInJlZmVyPSVzLCIsIGVwLT5lX2ZzbG9jZGF0YSk7CisJCWJyZWFrOworCWNhc2UgRlNMT0NfUkVQTElDQToKKwkJZnByaW50ZihmcCwgInJlcGxpY2FzPSVzLCIsIGVwLT5lX2ZzbG9jZGF0YSk7CisJCWJyZWFrOworI2lmZGVmIERFQlVHCisJY2FzZSBGU0xPQ19TVFVCOgorCQlmcHJpbnRmKGZwLCAiZnNsb2M9c3R1YiwiKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQl4bG9nKExfRVJST1IsICJ1bmtub3duIGZzbG9jIG1ldGhvZCBmb3IgJXM6JXMiLAorCQkgICAgIGVwLT5lX2hvc3RuYW1lLCBlcC0+ZV9wYXRoKTsKKwl9CisJaWYgKChpZCA9IGVwLT5lX3NxdWlkcykgIT0gTlVMTCkgeworCQlmcHJpbnRmKGZwLCAic3F1YXNoX3VpZHM9Iik7CisJCWZvciAoaSA9IDA7IGkgPCBlcC0+ZV9uc3F1aWRzOyBpICs9IDIpCisJCQlpZiAoaWRbaV0gIT0gaWRbaSsxXSkKKwkJCQlmcHJpbnRmKGZwLCAiJWQtJWQsIiwgaWRbaV0sIGlkW2krMV0pOworCQkJZWxzZQorCQkJCWZwcmludGYoZnAsICIlZCwiLCBpZFtpXSk7CisJfQorCWlmICgoaWQgPSBlcC0+ZV9zcWdpZHMpICE9IE5VTEwpIHsKKwkJZnByaW50ZihmcCwgInNxdWFzaF9naWRzPSIpOworCQlmb3IgKGkgPSAwOyBpIDwgZXAtPmVfbnNxdWlkczsgaSArPSAyKQorCQkJaWYgKGlkW2ldICE9IGlkW2krMV0pCisJCQkJZnByaW50ZihmcCwgIiVkLSVkLCIsIGlkW2ldLCBpZFtpKzFdKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKGZwLCAiJWQsIiwgaWRbaV0pOworCX0KKwlmcHJpbnRmKGZwLCAiYW5vbnVpZD0lZCxhbm9uZ2lkPSVkIiwgZXAtPmVfYW5vbnVpZCwgZXAtPmVfYW5vbmdpZCk7CisJc2VjaW5mb19zaG93KGZwLCBlcCk7CisJZnByaW50ZihmcCwgIilcbiIpOworfQorCit2b2lkCitlbmRleHBvcnRlbnQodm9pZCkKK3sKKwlpZiAoZWZwKQorCQl4ZmNsb3NlKGVmcCk7CisJZWZwID0gTlVMTDsKKwlpZiAoZWZuYW1lKQorCQlmcmVlKGVmbmFtZSk7CisJZWZuYW1lID0gTlVMTDsKKwlmcmVlc3F1YXNoKCk7Cit9CisKK3ZvaWQKK2R1cGV4cG9ydGVudChzdHJ1Y3QgZXhwb3J0ZW50ICpkc3QsIHN0cnVjdCBleHBvcnRlbnQgKnNyYykKK3sKKwlpbnQJbjsKKworCSpkc3QgPSAqc3JjOworCWlmICgobiA9IHNyYy0+ZV9uc3F1aWRzKSAhPSAwKSB7CisJCWRzdC0+ZV9zcXVpZHMgPSAoaW50ICopIHhtYWxsb2MobiAqIHNpemVvZihpbnQpKTsKKwkJbWVtY3B5KGRzdC0+ZV9zcXVpZHMsIHNyYy0+ZV9zcXVpZHMsIG4gKiBzaXplb2YoaW50KSk7CisJfQorCWlmICgobiA9IHNyYy0+ZV9uc3FnaWRzKSAhPSAwKSB7CisJCWRzdC0+ZV9zcWdpZHMgPSAoaW50ICopIHhtYWxsb2MobiAqIHNpemVvZihpbnQpKTsKKwkJbWVtY3B5KGRzdC0+ZV9zcWdpZHMsIHNyYy0+ZV9zcWdpZHMsIG4gKiBzaXplb2YoaW50KSk7CisJfQorCWlmIChzcmMtPmVfbW91bnRwb2ludCkKKwkJZHN0LT5lX21vdW50cG9pbnQgPSBzdHJkdXAoc3JjLT5lX21vdW50cG9pbnQpOworCWlmIChzcmMtPmVfZnNsb2NkYXRhKQorCQlkc3QtPmVfZnNsb2NkYXRhID0gc3RyZHVwKHNyYy0+ZV9mc2xvY2RhdGEpOworCWRzdC0+ZV9ob3N0bmFtZSA9IE5VTEw7Cit9CisKK3N0cnVjdCBleHBvcnRlbnQgKgorbWtleHBvcnRlbnQoY2hhciAqaG5hbWUsIGNoYXIgKnBhdGgsIGNoYXIgKm9wdGlvbnMpCit7CisJc3RhdGljIHN0cnVjdCBleHBvcnRlbnQJZWU7CisKKwlpbml0X2V4cG9ydGVudCgmZWUsIDApOworCisJeGZyZWUoZWUuZV9ob3N0bmFtZSk7CisJZWUuZV9ob3N0bmFtZSA9IHhzdHJkdXAoaG5hbWUpOworCisJaWYgKHN0cmxlbihwYXRoKSA+PSBzaXplb2YoZWUuZV9wYXRoKSkgeworCQl4bG9nKExfV0FSTklORywgInBhdGggbmFtZSAlcyB0b28gbG9uZyIsIHBhdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3RybmNweShlZS5lX3BhdGgsIHBhdGgsIHNpemVvZiAoZWUuZV9wYXRoKSk7CisJZWUuZV9wYXRoW3NpemVvZiAoZWUuZV9wYXRoKSAtIDFdID0gJ1wwJzsKKwlpZiAocGFyc2VvcHRzKG9wdGlvbnMsICZlZSwgMCwgTlVMTCkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVlOworfQorCitpbnQKK3VwZGF0ZWV4cG9ydGVudChzdHJ1Y3QgZXhwb3J0ZW50ICplZXAsIGNoYXIgKm9wdGlvbnMpCit7CisJaWYgKHBhcnNlb3B0cyhvcHRpb25zLCBlZXAsIDAsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCB2YWxpZF91dWlkKGNoYXIgKnV1aWQpCit7CisJLyogbXVzdCBoYXZlIDMyIGhleCBkaWdpdHMgKi8KKwlpbnQgY250OworCWZvciAoY250ID0gMCA7ICp1dWlkOyB1dWlkKyspCisJCWlmIChpc3hkaWdpdCgqdXVpZCkpCisJCQljbnQrKzsKKwlyZXR1cm4gY250ID09IDMyOworfQorCisvKgorICogQXBwZW5kIHRoZSBnaXZlbiBmbGF2b3IgdG8gdGhlIGV4cG9ydGVudCdzIGVfc2VjaW5mbyBhcnJheSwgb3IKKyAqIGRvIG5vdGhpbmcgaWYgaXQncyBhbHJlYWR5IHRoZXJlLiAgUmV0dXJucyB0aGUgaW5kZXggb2YgZmxhdm9yCisgKiBpbiB0aGUgcmVzdWx0aW5nIGFycmF5IGluIGFueSBjYXNlLgorICovCitpbnQgc2VjaW5mb19hZGRmbGF2b3Ioc3RydWN0IGZsYXZfaW5mbyAqZmxhdiwgc3RydWN0IGV4cG9ydGVudCAqZXApCit7CisJc3RydWN0IHNlY19lbnRyeSAqcDsKKworCWZvciAocD1lcC0+ZV9zZWNpbmZvOyBwLT5mbGF2OyBwKyspIHsKKwkJaWYgKHAtPmZsYXYgPT0gZmxhdikKKwkJCXJldHVybiBwIC0gZXAtPmVfc2VjaW5mbzsKKwl9CisJaWYgKHAgLSBlcC0+ZV9zZWNpbmZvID49IFNFQ0ZMQVZPUl9DT1VOVCkgeworCQl4bG9nKExfRVJST1IsICJtb3JlIHRoYW4gJWQgc2VjdXJpdHkgZmxhdm9ycyBvbiBhbiBleHBvcnRcbiIsCisJCQlTRUNGTEFWT1JfQ09VTlQpOworCQlyZXR1cm4gLTE7CisJfQorCXAtPmZsYXYgPSBmbGF2OworCXAtPmZsYWdzID0gZXAtPmVfZmxhZ3M7CisJKHArMSktPmZsYXYgPSBOVUxMOworCXJldHVybiBwIC0gZXAtPmVfc2VjaW5mbzsKK30KKworc3RhdGljIHN0cnVjdCBmbGF2X2luZm8gKmZpbmRfZmxhdm9yKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZsYXZfaW5mbyAqZmxhdjsKKwlmb3IgKGZsYXYgPSBmbGF2X21hcDsgZmxhdiA8IGZsYXZfbWFwICsgZmxhdl9tYXBfc2l6ZTsgZmxhdisrKQorCQlpZiAoc3RyY21wKGZsYXYtPmZsYXZvdXIsIG5hbWUpID09IDApCisJCQlyZXR1cm4gZmxhdjsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQHN0ciBpcyBhIGNvbG9uIHNlcGVyYXRlZCBsaXN0IG9mIHNlY3VyaXR5IGZsYXZvcnMuICBUaGVpciBvcmRlcgorICogaXMgcmVjb3JkZWQgaW4gQGVwLCBhbmQgYSBiaXRtYXAgY29ycmVzcG9uZGluZyB0byB0aGUgbGlzdCBpcyByZXR1cm5lZC4KKyAqIEEgemVybyByZXR1cm4gaW5kaWNhdGVzIGFuIGVycm9yLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBhcnNlX2ZsYXZvcnMoY2hhciAqc3RyLCBzdHJ1Y3QgZXhwb3J0ZW50ICplcCkKK3sKKwl1bnNpZ25lZCBpbnQgb3V0PTA7CisJY2hhciAqZmxhdm9yOworCWludCBiaXQ7CisKKwl3aGlsZSAoIChmbGF2b3I9c3Ryc2VwKCZzdHIsICI6IikpICkgeworCQlzdHJ1Y3QgZmxhdl9pbmZvICpmbGF2ID0gZmluZF9mbGF2b3IoZmxhdm9yKTsKKwkJaWYgKGZsYXYgPT0gTlVMTCkgeworCQkJeGxvZyhMX0VSUk9SLCAidW5rbm93biBmbGF2b3IgJXNcbiIsIGZsYXZvcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQliaXQgPSBzZWNpbmZvX2FkZGZsYXZvcihmbGF2LCBlcCk7CisJCWlmIChiaXQgPCAwKQorCQkJcmV0dXJuIDA7CisJCW91dCB8PSAxPDxiaXQ7CisJfQorCXJldHVybiBvdXQ7Cit9CisKKy8qIFNldHMgdGhlIGJpdHMgaW4gQG1hc2sgZm9yIHRoZSBhcHByb3ByaWF0ZSBzZWN1cml0eSBmbGF2b3IgZmxhZ3MuICovCitzdGF0aWMgdm9pZCBzZXRmbGFncyhpbnQgbWFzaywgdW5zaWduZWQgaW50IGFjdGl2ZSwgc3RydWN0IGV4cG9ydGVudCAqZXApCit7CisJaW50IGJpdD0wOworCisJZXAtPmVfZmxhZ3MgfD0gbWFzazsKKworCXdoaWxlIChhY3RpdmUpIHsKKwkJaWYgKGFjdGl2ZSAmIDEpCisJCQllcC0+ZV9zZWNpbmZvW2JpdF0uZmxhZ3MgfD0gbWFzazsKKwkJYml0Kys7CisJCWFjdGl2ZSA+Pj0gMTsKKwl9Cit9CisKKy8qIENsZWFycyB0aGUgYml0cyBpbiBAbWFzayBmb3IgdGhlIGFwcHJvcHJpYXRlIHNlY3VyaXR5IGZsYXZvciBmbGFncy4gKi8KK3N0YXRpYyB2b2lkIGNsZWFyZmxhZ3MoaW50IG1hc2ssIHVuc2lnbmVkIGludCBhY3RpdmUsIHN0cnVjdCBleHBvcnRlbnQgKmVwKQoreworCWludCBiaXQ9MDsKKworCWVwLT5lX2ZsYWdzICY9IH5tYXNrOworCisJd2hpbGUgKGFjdGl2ZSkgeworCQlpZiAoYWN0aXZlICYgMSkKKwkJCWVwLT5lX3NlY2luZm9bYml0XS5mbGFncyAmPSB+bWFzazsKKwkJYml0Kys7CisJCWFjdGl2ZSA+Pj0gMTsKKwl9Cit9CisKKy8qCisgKiBGb3IgdGhvc2UgZmxhZ3Mgd2hpY2ggYXJlIG5vdCBhbGxvd2VkIHRvIHZhcnkgYnkgcHNldWRvZmxhdm9yLAorICogZW5zdXJlIHRoYXQgdGhlIGV4cG9ydCBmbGFncyBhZ3JlZSB3aXRoIHRoZSBmbGFncyBvbiBlYWNoCisgKiBwc2V1ZG9mbGF2b3I6CisgKi8KK3N0YXRpYyB2b2lkIGZpeF9wc2V1ZG9mbGF2b3JfZmxhZ3Moc3RydWN0IGV4cG9ydGVudCAqZXApCit7CisJc3RydWN0IGV4cG9ydF9mZWF0dXJlcyAqZWY7CisJc3RydWN0IHNlY19lbnRyeSAqcDsKKworCWVmID0gZ2V0X2V4cG9ydF9mZWF0dXJlcygpOworCWZvciAocCA9IGVwLT5lX3NlY2luZm87IHAtPmZsYXY7IHArKykKKwkJcC0+ZmxhZ3MgfD0gZXAtPmVfZmxhZ3MgJiB+ZWYtPnNlY2luZm9fZmxhZ3M7Cit9CisKKy8qCisgKiBQYXJzZSBvcHRpb24gc3RyaW5nIHBvaW50ZWQgdG8gYnkgY3AgYW5kIHNldCBtb3VudCBvcHRpb25zIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgaW50CitwYXJzZW9wdHMoY2hhciAqY3AsIHN0cnVjdCBleHBvcnRlbnQgKmVwLCBpbnQgd2FybiwgaW50ICpoYWRfc3VidHJlZV9vcHRfcHRyKQoreworCWludAloYWRfc3VidHJlZV9vcHQgPSAwOworCWNoYXIgCSpmbG5hbWUgPSBlZm5hbWU/ZWZuYW1lOiJjb21tYW5kIGxpbmUiOworCWludAlmbGxpbmUgPSBlZnA/ZWZwLT54X2xpbmU6MDsKKwl1bnNpZ25lZCBpbnQgYWN0aXZlID0gMDsKKworCXNxdWlkcyA9IGVwLT5lX3NxdWlkczsgbnNxdWlkcyA9IGVwLT5lX25zcXVpZHM7CisJc3FnaWRzID0gZXAtPmVfc3FnaWRzOyBuc3FnaWRzID0gZXAtPmVfbnNxZ2lkczsKKwlpZiAoIWNwKQorCQlnb3RvIG91dDsKKworCXdoaWxlIChpc2JsYW5rKCpjcCkpCisJCWNwKys7CisKKwl3aGlsZSAoKmNwKSB7CisJCWNoYXIgKm9wdCA9IHN0cmR1cChjcCk7CisJCWNoYXIgKm9wdHN0YXJ0ID0gY3A7CisJCXdoaWxlICgqY3AgJiYgKmNwICE9ICcsJykKKwkJCWNwKys7CisJCWlmICgqY3ApIHsKKwkJCW9wdFtjcC1vcHRzdGFydF0gPSAnXDAnOworCQkJY3ArKzsKKwkJfQorCisJCS8qIHByb2Nlc3Mga2V5d29yZCAqLworCQlpZiAoc3RyY21wKG9wdCwgInJvIikgPT0gMCkKKwkJCXNldGZsYWdzKE5GU0VYUF9SRUFET05MWSwgYWN0aXZlLCBlcCk7CisJCWVsc2UgaWYgKHN0cmNtcChvcHQsICJydyIpID09IDApCisJCQljbGVhcmZsYWdzKE5GU0VYUF9SRUFET05MWSwgYWN0aXZlLCBlcCk7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic2VjdXJlIikpCisJCQljbGVhcmZsYWdzKE5GU0VYUF9JTlNFQ1VSRV9QT1JULCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJpbnNlY3VyZSIpKQorCQkJc2V0ZmxhZ3MoTkZTRVhQX0lOU0VDVVJFX1BPUlQsIGFjdGl2ZSwgZXApOworCQllbHNlIGlmICghc3RyY21wKG9wdCwgInN5bmMiKSkKKwkJCWNsZWFyZmxhZ3MoTkZTRVhQX0FTWU5DLCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhc3luYyIpKQorCQkJc2V0ZmxhZ3MoTkZTRVhQX0FTWU5DLCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJub2hpZGUiKSkKKwkJCXNldGZsYWdzKE5GU0VYUF9OT0hJREUsIGFjdGl2ZSwgZXApOworCQllbHNlIGlmICghc3RyY21wKG9wdCwgImhpZGUiKSkKKwkJCWNsZWFyZmxhZ3MoTkZTRVhQX05PSElERSwgYWN0aXZlLCBlcCk7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiY3Jvc3NtbnQiKSkKKwkJCXNldGZsYWdzKE5GU0VYUF9DUk9TU01PVU5ULCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJub2Nyb3NzbW50IikpCisJCQljbGVhcmZsYWdzKE5GU0VYUF9DUk9TU01PVU5ULCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJ3ZGVsYXkiKSkKKwkJCXNldGZsYWdzKE5GU0VYUF9HQVRIRVJFRF9XUklURVMsIGFjdGl2ZSwgZXApOworCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5vX3dkZWxheSIpKQorCQkJY2xlYXJmbGFncyhORlNFWFBfR0FUSEVSRURfV1JJVEVTLCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoc3RyY21wKG9wdCwgInJvb3Rfc3F1YXNoIikgPT0gMCkKKwkJCXNldGZsYWdzKE5GU0VYUF9ST09UU1FVQVNILCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJub19yb290X3NxdWFzaCIpKQorCQkJY2xlYXJmbGFncyhORlNFWFBfUk9PVFNRVUFTSCwgYWN0aXZlLCBlcCk7CisJCWVsc2UgaWYgKHN0cmNtcChvcHQsICJhbGxfc3F1YXNoIikgPT0gMCkKKwkJCXNldGZsYWdzKE5GU0VYUF9BTExTUVVBU0gsIGFjdGl2ZSwgZXApOworCQllbHNlIGlmIChzdHJjbXAob3B0LCAibm9fYWxsX3NxdWFzaCIpID09IDApCisJCQljbGVhcmZsYWdzKE5GU0VYUF9BTExTUVVBU0gsIGFjdGl2ZSwgZXApOworCQllbHNlIGlmIChzdHJjbXAob3B0LCAic3VidHJlZV9jaGVjayIpID09IDApIHsKKwkJCWhhZF9zdWJ0cmVlX29wdCA9IDE7CisJCQljbGVhcmZsYWdzKE5GU0VYUF9OT1NVQlRSRUVDSEVDSywgYWN0aXZlLCBlcCk7CisJCX0gZWxzZSBpZiAoc3RyY21wKG9wdCwgIm5vX3N1YnRyZWVfY2hlY2siKSA9PSAwKSB7CisJCQloYWRfc3VidHJlZV9vcHQgPSAxOworCQkJc2V0ZmxhZ3MoTkZTRVhQX05PU1VCVFJFRUNIRUNLLCBhY3RpdmUsIGVwKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAob3B0LCAiYXV0aF9ubG0iKSA9PSAwKQorCQkJY2xlYXJmbGFncyhORlNFWFBfTk9BVVRITkxNLCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoc3RyY21wKG9wdCwgIm5vX2F1dGhfbmxtIikgPT0gMCkKKwkJCXNldGZsYWdzKE5GU0VYUF9OT0FVVEhOTE0sIGFjdGl2ZSwgZXApOworCQllbHNlIGlmIChzdHJjbXAob3B0LCAic2VjdXJlX2xvY2tzIikgPT0gMCkKKwkJCWNsZWFyZmxhZ3MoTkZTRVhQX05PQVVUSE5MTSwgYWN0aXZlLCBlcCk7CisJCWVsc2UgaWYgKHN0cmNtcChvcHQsICJpbnNlY3VyZV9sb2NrcyIpID09IDApCisJCQlzZXRmbGFncyhORlNFWFBfTk9BVVRITkxNLCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoc3RyY21wKG9wdCwgImFjbCIpID09IDApCisJCQljbGVhcmZsYWdzKE5GU0VYUF9OT0FDTCwgYWN0aXZlLCBlcCk7CisJCWVsc2UgaWYgKHN0cmNtcChvcHQsICJub19hY2wiKSA9PSAwKQorCQkJc2V0ZmxhZ3MoTkZTRVhQX05PQUNMLCBhY3RpdmUsIGVwKTsKKwkJZWxzZSBpZiAoc3RybmNtcChvcHQsICJhbm9udWlkPSIsIDgpID09IDApIHsKKwkJCWNoYXIgKm9lOworCQkJZXAtPmVfYW5vbnVpZCA9IHN0cnRvbChvcHQrOCwgJm9lLCAxMCk7CisJCQlpZiAob3B0WzhdPT0nXDAnIHx8ICpvZSAhPSAnXDAnKSB7CisJCQkJeGxvZyhMX0VSUk9SLCAiJXM6ICVkOiBiYWQgYW5vbnVpZCBcIiVzXCJcbiIsCisJCQkJICAgICBmbG5hbWUsIGZsbGluZSwgb3B0KTsJCitiYWRfb3B0aW9uOgorCQkJCWZyZWUob3B0KTsKKwkJCQlleHBvcnRfZXJybm8gPSBFSU5WQUw7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5jbXAob3B0LCAiYW5vbmdpZD0iLCA4KSA9PSAwKSB7CisJCQljaGFyICpvZTsKKwkJCWVwLT5lX2Fub25naWQgPSBzdHJ0b2wob3B0KzgsICZvZSwgMTApOworCQkJaWYgKG9wdFs4XT09J1wwJyB8fCAqb2UgIT0gJ1wwJykgeworCQkJCXhsb2coTF9FUlJPUiwgIiVzOiAlZDogYmFkIGFub25naWQgXCIlc1wiXG4iLAorCQkJCSAgICAgZmxuYW1lLCBmbGxpbmUsIG9wdCk7CQorCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuY21wKG9wdCwgInNxdWFzaF91aWRzPSIsIDEyKSA9PSAwKSB7CisJCQlpZiAocGFyc2VzcXVhc2gob3B0KzEyLCAmc3F1aWRzLCAmbnNxdWlkcywgJmNwKSA8IDApIHsKKwkJCQlnb3RvIGJhZF9vcHRpb247CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmNtcChvcHQsICJzcXVhc2hfZ2lkcz0iLCAxMikgPT0gMCkgeworCQkJaWYgKHBhcnNlc3F1YXNoKG9wdCsxMiwgJnNxZ2lkcywgJm5zcWdpZHMsICZjcCkgPCAwKSB7CisJCQkJZ290byBiYWRfb3B0aW9uOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5jbXAob3B0LCAiZnNpZD0iLCA1KSA9PSAwKSB7CisJCQljaGFyICpvZTsKKwkJCWlmIChzdHJjbXAob3B0KzUsICJyb290IikgPT0gMCkgeworCQkJCWVwLT5lX2ZzaWQgPSAwOworCQkJCXNldGZsYWdzKE5GU0VYUF9GU0lELCBhY3RpdmUsIGVwKTsKKwkJCX0gZWxzZSB7CisJCQkJZXAtPmVfZnNpZCA9IHN0cnRvdWwob3B0KzUsICZvZSwgMCk7CisJCQkJaWYgKG9wdFs1XSE9J1wwJyAmJiAqb2UgPT0gJ1wwJykgCisJCQkJCXNldGZsYWdzKE5GU0VYUF9GU0lELCBhY3RpdmUsIGVwKTsKKwkJCQllbHNlIGlmICh2YWxpZF91dWlkKG9wdCs1KSkKKwkJCQkJZXAtPmVfdXVpZCA9IHN0cmR1cChvcHQrNSk7CisJCQkJZWxzZSB7CisJCQkJCXhsb2coTF9FUlJPUiwgIiVzOiAlZDogYmFkIGZzaWQgXCIlc1wiXG4iLAorCQkJCQkgICAgIGZsbmFtZSwgZmxsaW5lLCBvcHQpOwkKKwkJCQkJZ290byBiYWRfb3B0aW9uOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJjbXAob3B0LCAibW91bnRwb2ludCIpPT0wIHx8CisJCQkgICBzdHJjbXAob3B0LCAibXAiKSA9PSAwIHx8CisJCQkgICBzdHJuY21wKG9wdCwgIm1vdW50cG9pbnQ9IiwgMTEpPT0wIHx8CisJCQkgICBzdHJuY21wKG9wdCwgIm1wPSIsIDMpID09IDApIHsKKwkJCWNoYXIgKiBtcCA9IHN0cmNocihvcHQsICc9Jyk7CisJCQlpZiAobXApCisJCQkJZXAtPmVfbW91bnRwb2ludCA9IHN0cmR1cChtcCsxKTsKKwkJCWVsc2UKKwkJCQllcC0+ZV9tb3VudHBvaW50ID0gc3RyZHVwKCIiKTsKKyNpZmRlZiBERUJVRworCQl9IGVsc2UgaWYgKHN0cm5jbXAob3B0LCAiZnNsb2M9IiwgNikgPT0gMCkgeworCQkJaWYgKHN0cmNtcChvcHQrNiwgInN0dWIiKSA9PSAwKQorCQkJCWVwLT5lX2ZzbG9jbWV0aG9kID0gRlNMT0NfU1RVQjsKKwkJCWVsc2UgeworCQkJCXhsb2coTF9FUlJPUiwgIiVzOiVkOiBiYWQgb3B0aW9uICVzXG4iLAorCQkJCSAgICAgZmxuYW1lLCBmbGxpbmUsIG9wdCk7CisJCQkJZ290byBiYWRfb3B0aW9uOworCQkJfQorI2VuZGlmCisJCX0gZWxzZSBpZiAoc3RybmNtcChvcHQsICJyZWZlcj0iLCA2KSA9PSAwKSB7CisJCQllcC0+ZV9mc2xvY21ldGhvZCA9IEZTTE9DX1JFRkVSOworCQkJZXAtPmVfZnNsb2NkYXRhID0gc3RyZHVwKG9wdCs2KTsKKwkJfSBlbHNlIGlmIChzdHJuY21wKG9wdCwgInJlcGxpY2FzPSIsIDkpID09IDApIHsKKwkJCWVwLT5lX2ZzbG9jbWV0aG9kID0gRlNMT0NfUkVQTElDQTsKKwkJCWVwLT5lX2ZzbG9jZGF0YSA9IHN0cmR1cChvcHQrOSk7CisJCX0gZWxzZSBpZiAoc3RybmNtcChvcHQsICJzZWM9IiwgNCkgPT0gMCkgeworCQkJYWN0aXZlID0gcGFyc2VfZmxhdm9ycyhvcHQrNCwgZXApOworCQkJaWYgKCFhY3RpdmUpCisJCQkJZ290byBiYWRfb3B0aW9uOworCQl9IGVsc2UgeworCQkJeGxvZyhMX0VSUk9SLCAiJXM6JWQ6IHVua25vd24ga2V5d29yZCBcIiVzXCJcbiIsCisJCQkJCWZsbmFtZSwgZmxsaW5lLCBvcHQpOworCQkJc2V0ZmxhZ3MoTkZTRVhQX0FMTFNRVUFTSCB8IE5GU0VYUF9SRUFET05MWSwgYWN0aXZlLCBlcCk7CisJCQlnb3RvIGJhZF9vcHRpb247CisJCX0KKwkJZnJlZShvcHQpOworCQl3aGlsZSAoaXNibGFuaygqY3ApKQorCQkJY3ArKzsKKwl9CisKKwlmaXhfcHNldWRvZmxhdm9yX2ZsYWdzKGVwKTsKKwllcC0+ZV9zcXVpZHMgPSBzcXVpZHM7CisJZXAtPmVfc3FnaWRzID0gc3FnaWRzOworCWVwLT5lX25zcXVpZHMgPSBuc3F1aWRzOworCWVwLT5lX25zcWdpZHMgPSBuc3FnaWRzOworCitvdXQ6CisJaWYgKHdhcm4gJiYgIWhhZF9zdWJ0cmVlX29wdCkKKwkJeGxvZyhMX1dBUk5JTkcsICIlcyBbJWRdOiBOZWl0aGVyICdzdWJ0cmVlX2NoZWNrJyBvciAnbm9fc3VidHJlZV9jaGVjaycgc3BlY2lmaWVkIGZvciBleHBvcnQgXCIlczolc1wiLlxuIgorCQkJCSIgIEFzc3VtaW5nIGRlZmF1bHQgYmVoYXZpb3VyICgnbm9fc3VidHJlZV9jaGVjaycpLlxuIgorCQkgICAgIAkJIiAgTk9URTogdGhpcyBkZWZhdWx0IGhhcyBjaGFuZ2VkIHNpbmNlIG5mcy11dGlscyB2ZXJzaW9uIDEuMC54XG4iLAorCisJCQkJZmxuYW1lLCBmbGxpbmUsCisJCQkJZXAtPmVfaG9zdG5hbWUsIGVwLT5lX3BhdGgpOworCWlmIChoYWRfc3VidHJlZV9vcHRfcHRyKQorCQkqaGFkX3N1YnRyZWVfb3B0X3B0ciA9IGhhZF9zdWJ0cmVlX29wdDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitwYXJzZXNxdWFzaChjaGFyICpsaXN0LCBpbnQgKippZHAsIGludCAqbGVucCwgY2hhciAqKmVwKQoreworCWNoYXIJKmNwID0gbGlzdDsKKwlpbnQJaWQwLCBpZDE7CisJaW50CWxlbiA9ICpsZW5wOworCWludAkqaWQgPSAqaWRwOworCisJaWYgKCoqZXApCisJICAgICotLSgqZXApID0gJywnOworCisJZG8geworCQlpZDAgPSBwYXJzZW51bSgmY3ApOworCQlpZiAoKmNwID09ICctJykgeworCQkJY3ArKzsKKwkJCWlkMSA9IHBhcnNlbnVtKCZjcCk7CisJCX0gZWxzZSB7CisJCQlpZDEgPSBpZDA7CisJCX0KKwkJaWYgKGlkMCA9PSAtMSB8fCBpZDEgPT0gLTEpIHsKKwkJCXN5bnRheGVycigidWlkL2dpZCAtMSBub3QgcGVybWl0dGVkIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKChsZW4gJSA4KSA9PSAwKQorCQkJaWQgPSAoaW50ICopIHhyZWFsbG9jKGlkLCAobGVuICsgOCkgKiBzaXplb2YoKmlkKSk7CisJCWlkW2xlbisrXSA9IGlkMDsKKwkJaWRbbGVuKytdID0gaWQxOworCQlpZiAoISpjcCB8fCAqY3AgPT0gJyknIHx8ICgqY3AgPT0gJywnICYmICFpc2RpZ2l0KGNwWzFdKSkpCisJCQlicmVhazsKKwkJaWYgKCpjcCAhPSAnLCcpIHsKKwkJCXN5bnRheGVycigiYmFkIHVpZC9naWQgbGlzdCIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWNwKys7CisJfSB3aGlsZSgxKTsKKworCWlmICgqKmVwID09ICcsJykgKCplcCkrKzsKKworCSpsZW5wID0gbGVuOworCSppZHAgPSBpZDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVzcXVhc2godm9pZCkKK3sKKwlpZiAoc3F1aWRzKSB7CisJCXhmcmVlIChzcXVpZHMpOworCQlzcXVpZHMgPSBOVUxMOworCQluc3F1aWRzID0gMDsKKwl9CisJaWYgKHNxZ2lkcykgeworCQl4ZnJlZSAoc3FnaWRzKTsKKwkJc3FnaWRzID0gTlVMTDsKKwkJbnNxZ2lkcyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50CitwYXJzZW51bShjaGFyICoqY3BwKQoreworCWNoYXIJKmNwID0gKmNwcCwgYzsKKwlpbnQJbnVtID0gMDsKKworCWlmICgqKmNwcCA9PSAnLScpCisJCSgqY3BwKSsrOworCXdoaWxlIChpc2RpZ2l0KCoqY3BwKSkKKwkJKCpjcHApKys7CisJYyA9ICoqY3BwOyAqKmNwcCA9ICdcMCc7IG51bSA9IGF0b2koY3ApOyAqKmNwcCA9IGM7CisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIGludAorZ2V0cGF0aChjaGFyICpwYXRoLCBpbnQgbGVuKQoreworCXhza2lwKGVmcCwgIiBcdFxuIik7CisJcmV0dXJuIHhnZXR0b2soZWZwLCAwLCBwYXRoLCBsZW4pOworfQorCitzdGF0aWMgaW50CitnZXRleHBvcnQoY2hhciAqZXhwLCBpbnQgbGVuKQoreworCWludAlvazsKKworCXhza2lwKGVmcCwgIiBcdCIpOworCWlmICgob2sgPSB4Z2V0dG9rKGVmcCwgMCwgZXhwLCBsZW4pKSA8IDApCisJCXhsb2coTF9FUlJPUiwgIiVzOiVkOiBzeW50YXggZXJyb3IiLAorCQkJZWZuYW1lPyJjb21tYW5kIGxpbmUiOmVmbmFtZSwgZWZwLT54X2xpbmUpOworCXJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQKK3N5bnRheGVycihjaGFyICptc2cpCit7CisJeGxvZyhMX0VSUk9SLCAiJXM6JWQ6IHN5bnRheCBlcnJvcjogJXMiLAorCQkJZWZuYW1lLCBlZnA/ZWZwLT54X2xpbmU6MCwgbXNnKTsKK30KK3N0cnVjdCBleHBvcnRfZmVhdHVyZXMgKmdldF9leHBvcnRfZmVhdHVyZXModm9pZCkKK3sKKwlzdGF0aWMgY2hhciAqcGF0aCA9ICIvcHJvYy9mcy9uZnNkL2V4cG9ydF9mZWF0dXJlcyI7CisJc3RhdGljIHN0cnVjdCBleHBvcnRfZmVhdHVyZXMgZWY7CisJc3RhdGljIGludCBjYWNoZWQgPSAwOworCWNoYXIgYnVmWzUwXTsKKwlpbnQgYzsKKwlpbnQgZmQ7CisKKwlpZiAoY2FjaGVkKQorCQlyZXR1cm4gJmVmOworCisJZWYuZmxhZ3MgPSBORlNFWFBfT0xERkxBR1M7CisJZWYuc2VjaW5mb19mbGFncyA9IE5GU0VYUF9PTERfU0VDSU5GT19GTEFHUzsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xKQorCQlnb3RvIGdvb2Q7CisJZmQgPSByZWFkKGZkLCBidWYsIDUwKTsKKwlpZiAoZmQgPT0gLTEpCisJCWdvdG8gZXJyOworCWMgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmZWYuZmxhZ3MsICZlZi5zZWNpbmZvX2ZsYWdzKTsKKwlpZiAoYyAhPSAyKQorCQlnb3RvIGVycjsKK2dvb2Q6CisJY2FjaGVkID0gMTsKKwlyZXR1cm4gJmVmOworZXJyOgorCXhsb2coTF9XQVJOSU5HLCAidW5leHBlY3RlZCBlcnJvciByZWFkaW5nICVzIiwgcGF0aCk7CisJcmV0dXJuICZlZjsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9mc3RhYi5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2ZzdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmODcxMAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9mc3RhYi5jCkBAIC0wLDAgKzEsNTU0IEBACisvKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqIFN1biBNYXIgMjEgMTk5OSAtIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogLSBmaXhlZCBzdHJlcnIoZXJybm8pIGluIGdldHRleHQgY2FsbHMKKyAqCisgKiAyMDA2LTA2LTA4IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CisgKiAtIE1vdmVkIGNvZGUgdG8gbmZzLXV0aWxzL3N1cHBvcnQvbmZzIGZyb20gdXRpbC1saW51eC9tb3VudC4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KKworI2luY2x1ZGUgImZzdGFiLmgiCisjaW5jbHVkZSAieGNvbW1vbi5oIgorI2luY2x1ZGUgIm5mc19tbnRlbnQuaCIKKyNpbmNsdWRlICJuZnNfcGF0aHMuaCIKKyNpbmNsdWRlICJubHMuaCIKKworI2RlZmluZSBMT0NLX1RJTUVPVVQJMTAKKyNkZWZpbmUgc3RyZXEocywgdCkJKHN0cmNtcCAoKHMpLCAodCkpID09IDApCisjZGVmaW5lIFBST0NfTU9VTlRTCQkiL3Byb2MvbW91bnRzIgorCitleHRlcm4gaW50IHZlcmJvc2U7CisKKy8qIEluZm9ybWF0aW9uIGFib3V0IG10YWIuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IGhhdmVfbXRhYl9pbmZvID0gMDsKK3N0YXRpYyBpbnQgdmFyX210YWJfZG9lc19ub3RfZXhpc3QgPSAwOworc3RhdGljIGludCB2YXJfbXRhYl9pc19hX3N5bWxpbmsgPSAwOworCitzdGF0aWMgdm9pZAorZ2V0X210YWJfaW5mbyh2b2lkKSB7CisJc3RydWN0IHN0YXQgbXRhYl9zdGF0OworCisJaWYgKCFoYXZlX210YWJfaW5mbykgeworCQlpZiAobHN0YXQoTU9VTlRFRCwgJm10YWJfc3RhdCkpCisJCQl2YXJfbXRhYl9kb2VzX25vdF9leGlzdCA9IDE7CisJCWVsc2UgaWYgKFNfSVNMTksobXRhYl9zdGF0LnN0X21vZGUpKQorCQkJdmFyX210YWJfaXNfYV9zeW1saW5rID0gMTsKKwkJaGF2ZV9tdGFiX2luZm8gPSAxOworCX0KK30KKworaW50CittdGFiX2RvZXNfbm90X2V4aXN0KHZvaWQpIHsKKwlnZXRfbXRhYl9pbmZvKCk7CisJcmV0dXJuIHZhcl9tdGFiX2RvZXNfbm90X2V4aXN0OworfQorCitzdGF0aWMgaW50CittdGFiX2lzX2Ffc3ltbGluayh2b2lkKSB7CisgICAgICAgIGdldF9tdGFiX2luZm8oKTsKKyAgICAgICAgcmV0dXJuIHZhcl9tdGFiX2lzX2Ffc3ltbGluazsKK30KKworaW50CittdGFiX2lzX3dyaXRhYmxlKCkgeworCWludCBmZDsKKworCS8qIFNob3VsZCB3ZSB3cml0ZSB0byAvZXRjL210YWIgdXBvbiBhbiB1cGRhdGU/CisJICAgUHJvYmFibHkgbm90IGlmIGl0IGlzIGEgc3ltbGluayB0byAvcHJvYy9tb3VudHMsIHNpbmNlIHRoYXQKKwkgICB3b3VsZCBjcmVhdGUgYSBmaWxlIC9wcm9jL21vdW50cyBpbiBjYXNlIHRoZSBwcm9jIGZpbGVzeXN0ZW0KKwkgICBpcyBub3QgbW91bnRlZC4gKi8KKwlpZiAobXRhYl9pc19hX3N5bWxpbmsoKSkKKwkJcmV0dXJuIDA7CisKKwlmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSIHwgT19DUkVBVCwgMDY0NCk7CisJaWYgKGZkID49IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIENvbnRlbnRzIG9mIG10YWIgYW5kIGZzdGFiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBtbnRlbnRjaG4gbW91bnR0YWJsZTsKK3N0YXRpYyBpbnQgZ290X210YWIgPSAwOworc3RydWN0IG1udGVudGNobiBmc3RhYjsKK3N0YXRpYyBpbnQgZ290X2ZzdGFiID0gMDsKKworc3RhdGljIHZvaWQgcmVhZF9tb3VudHRhYmxlKHZvaWQpOworc3RhdGljIHZvaWQgcmVhZF9mc3RhYih2b2lkKTsKKworc3RhdGljIHN0cnVjdCBtbnRlbnRjaG4gKgorbXRhYl9oZWFkKHZvaWQpIHsKKwlpZiAoIWdvdF9tdGFiKQorCQlyZWFkX21vdW50dGFibGUoKTsKKwlyZXR1cm4gJm1vdW50dGFibGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW50ZW50Y2huICoKK2ZzdGFiX2hlYWQodm9pZCkKK3sKKwlpZiAoIWdvdF9mc3RhYikKKwkJcmVhZF9mc3RhYigpOworCXJldHVybiAmZnN0YWI7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZAorbXlfZnJlZShjb25zdCB2b2lkICpzKSB7CisJaWYgKHMpCisJCWZyZWUoKHZvaWQgKikgcyk7Cit9CisKK3N0YXRpYyB2b2lkCitkaXNjYXJkX21udGVudGNobihzdHJ1Y3QgbW50ZW50Y2huICptYzApIHsKKwlzdHJ1Y3QgbW50ZW50Y2huICptYywgKm1jMTsKKworCWZvciAobWMgPSBtYzAtPm54dDsgbWMgJiYgbWMgIT0gbWMwOyBtYyA9IG1jMSkgeworCQltYzEgPSBtYy0+bnh0OworCQlteV9mcmVlKG1jLT5tLm1udF9mc25hbWUpOworCQlteV9mcmVlKG1jLT5tLm1udF9kaXIpOworCQlteV9mcmVlKG1jLT5tLm1udF90eXBlKTsKKwkJbXlfZnJlZShtYy0+bS5tbnRfb3B0cyk7CisJCWZyZWUobWMpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcmVhZF9tbnRlbnRjaG4obW50RklMRSAqbWZwLCBjb25zdCBjaGFyICpmbmFtLCBzdHJ1Y3QgbW50ZW50Y2huICptYzApIHsKKwlzdHJ1Y3QgbW50ZW50Y2huICptYyA9IG1jMDsKKwlzdHJ1Y3QgbW50ZW50ICptbnQ7CisKKwl3aGlsZSAoKG1udCA9IG5mc19nZXRtbnRlbnQobWZwKSkgIT0gTlVMTCkgeworCQlpZiAoIXN0cmVxKG1udC0+bW50X3R5cGUsIE1OVFRZUEVfSUdOT1JFKSkgeworCQkJbWMtPm54dCA9IChzdHJ1Y3QgbW50ZW50Y2huICopIHhtYWxsb2Moc2l6ZW9mKCptYykpOworCQkJbWMtPm54dC0+cHJldiA9IG1jOworCQkJbWMgPSBtYy0+bnh0OworCQkJbWMtPm0gPSAqbW50OworCQkJbWMtPm54dCA9IG1jMDsKKwkJfQorCX0KKwltYzAtPnByZXYgPSBtYzsKKwlpZiAoZmVycm9yKG1mcC0+bW50ZW50X2ZwKSkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJbmZzX2Vycm9yKF8oIndhcm5pbmc6IGVycm9yIHJlYWRpbmcgJXM6ICVzIiksCisJCSAgICAgIGZuYW0sIHN0cmVycm9yIChlcnJzdikpOworCQltYzAtPm54dCA9IG1jMC0+cHJldiA9IE5VTEw7CisJfQorCW5mc19lbmRtbnRlbnQobWZwKTsKK30KKworLyoKKyAqIFJlYWQgL2V0Yy9tdGFiLiAgSWYgdGhhdCBmYWlscywgdHJ5IC9wcm9jL21vdW50cy4KKyAqIFRoaXMgcHJvZHVjZXMgYSBsaW5rZWQgbGlzdC4gVGhlIGxpc3QgaGVhZCBtb3VudHRhYmxlIGlzIGEgZHVtbXkuCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgdm9pZAorcmVhZF9tb3VudHRhYmxlKCkgeworICAgICAgICBtbnRGSUxFICptZnA7CisgICAgICAgIGNvbnN0IGNoYXIgKmZuYW07CisgICAgICAgIHN0cnVjdCBtbnRlbnRjaG4gKm1jID0gJm1vdW50dGFibGU7CisKKyAgICAgICAgZ290X210YWIgPSAxOworICAgICAgICBtYy0+bnh0ID0gbWMtPnByZXYgPSBOVUxMOworCisgICAgICAgIGZuYW0gPSBNT1VOVEVEOworICAgICAgICBtZnAgPSBuZnNfc2V0bW50ZW50IChmbmFtLCAiciIpOworICAgICAgICBpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tbnRlbnRfZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBlcnJzdiA9IGVycm5vOworICAgICAgICAgICAgICAgIGZuYW0gPSBQUk9DX01PVU5UUzsKKyAgICAgICAgICAgICAgICBtZnAgPSBuZnNfc2V0bW50ZW50IChmbmFtLCAiciIpOworICAgICAgICAgICAgICAgIGlmIChtZnAgPT0gTlVMTCB8fCBtZnAtPm1udGVudF9mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZnNfZXJyb3IoXygid2FybmluZzogY2FuJ3Qgb3BlbiAlczogJXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVU5URUQsIHN0cmVycm9yIChlcnJzdikpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoXygibW91bnQ6IGNvdWxkIG5vdCBvcGVuICVzIC0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAlcyBpbnN0ZWFkXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9VTlRFRCwgUFJPQ19NT1VOVFMpOworICAgICAgICB9CisgICAgICAgIHJlYWRfbW50ZW50Y2huKG1mcCwgZm5hbSwgbWMpOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9mc3RhYigpCit7CisJbW50RklMRSAqbWZwID0gTlVMTDsKKwljb25zdCBjaGFyICpmbmFtOworCXN0cnVjdCBtbnRlbnRjaG4gKm1jID0gJmZzdGFiOworCisJZ290X2ZzdGFiID0gMTsKKwltYy0+bnh0ID0gbWMtPnByZXYgPSBOVUxMOworCisJZm5hbSA9IF9QQVRIX0ZTVEFCOworCW1mcCA9IG5mc19zZXRtbnRlbnQgKGZuYW0sICJyIik7CisJaWYgKG1mcCA9PSBOVUxMIHx8IG1mcC0+bW50ZW50X2ZwID09IE5VTEwpIHsKKwkJaW50IGVycnN2ID0gZXJybm87CisJCW5mc19lcnJvcihfKCJ3YXJuaW5nOiBjYW4ndCBvcGVuICVzOiAlcyIpLAorCQkJICBfUEFUSF9GU1RBQiwgc3RyZXJyb3IgKGVycnN2KSk7CisJCXJldHVybjsKKwl9CisJcmVhZF9tbnRlbnRjaG4obWZwLCBmbmFtLCBtYyk7Cit9CisKKy8qCisgKiBHaXZlbiB0aGUgZGlyZWN0b3J5IG5hbWUgTkFNRSwgYW5kIHRoZSBwbGFjZSBNQ1BSRVYgd2UgZm91bmQgaXQgbGFzdCB0aW1lLAorICogdHJ5IHRvIGZpbmQgbW9yZSBvY2N1cnJlbmNlcy4KKyAqLyAKK3N0cnVjdCBtbnRlbnRjaG4gKgorZ2V0bW50ZGlyYmFja3dhcmQgKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtbnRlbnRjaG4gKm1jcHJldikgeworCXN0cnVjdCBtbnRlbnRjaG4gKm1jLCAqbWMwOworCisJbWMwID0gbXRhYl9oZWFkKCk7CisJaWYgKCFtY3ByZXYpCisJCW1jcHJldiA9IG1jMDsKKwlmb3IgKG1jID0gbWNwcmV2LT5wcmV2OyBtYyAmJiBtYyAhPSBtYzA7IG1jID0gbWMtPnByZXYpCisJCWlmIChzdHJlcShtYy0+bS5tbnRfZGlyLCBuYW1lKSkKKwkJCXJldHVybiBtYzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBkZXZpY2UgbmFtZSBOQU1FLCBhbmQgdGhlIHBsYWNlIE1DUFJFViB3ZSBmb3VuZCBpdCBsYXN0IHRpbWUsCisgKiB0cnkgdG8gZmluZCBtb3JlIG9jY3VycmVuY2VzLgorICovIAorc3RydWN0IG1udGVudGNobiAqCitnZXRtbnRkZXZiYWNrd2FyZCAoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1udGVudGNobiAqbWNwcmV2KSB7CisJc3RydWN0IG1udGVudGNobiAqbWMsICptYzA7CisKKwltYzAgPSBtdGFiX2hlYWQoKTsKKwlpZiAoIW1jcHJldikKKwkJbWNwcmV2ID0gbWMwOworCWZvciAobWMgPSBtY3ByZXYtPnByZXY7IG1jICYmIG1jICE9IG1jMDsgbWMgPSBtYy0+cHJldikKKwkJaWYgKHN0cmVxKG1jLT5tLm1udF9mc25hbWUsIG5hbWUpKQorCQkJcmV0dXJuIG1jOworCXJldHVybiBOVUxMOworfQorCisvKiBGaW5kIHRoZSBkaXIgRklMRSBpbiBmc3RhYi4gICovCitzdHJ1Y3QgbW50ZW50Y2huICoKK2dldGZzZmlsZSAoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgbW50ZW50Y2huICptYywgKm1jMDsKKworCW1jMCA9IGZzdGFiX2hlYWQoKTsKKwlmb3IgKG1jID0gbWMwLT5ueHQ7IG1jICYmIG1jICE9IG1jMDsgbWMgPSBtYy0+bnh0KQorCQlpZiAoc3RyZXEobWMtPm0ubW50X2RpciwgZmlsZSkpCisJCQlyZXR1cm4gbWM7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZpbmQgdGhlIGRldmljZSBTUEVDIGluIGZzdGFiLiAgKi8KK3N0cnVjdCBtbnRlbnRjaG4gKgorZ2V0ZnNzcGVjIChjb25zdCBjaGFyICpzcGVjKQoreworCXN0cnVjdCBtbnRlbnRjaG4gKm1jLCAqbWMwOworCisJbWMwID0gZnN0YWJfaGVhZCgpOworCWZvciAobWMgPSBtYzAtPm54dDsgbWMgJiYgbWMgIT0gbWMwOyBtYyA9IG1jLT5ueHQpCisJCWlmIChzdHJlcShtYy0+bS5tbnRfZnNuYW1lLCBzcGVjKSkKKwkJCXJldHVybiBtYzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVXBkYXRpbmcgbXRhYiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRmxhZyBmb3IgYWxyZWFkeSBleGlzdGluZyBsb2NrIGZpbGUuICovCitzdGF0aWMgaW50IHdlX2NyZWF0ZWRfbG9ja2ZpbGUgPSAwOworc3RhdGljIGludCBsb2NrZmlsZV9mZCA9IC0xOworCisvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgc2lnbmFscyBoYXZlIGJlZW4gc2V0IHVwLiAqLworc3RhdGljIGludCBzaWduYWxzX2hhdmVfYmVlbl9zZXR1cCA9IDA7CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBsb2NrIGlzIHJlbGVhc2VkIGlmIHdlIGFyZSBpbnRlcnJ1cHRlZC4gICovCitleHRlcm4gY2hhciAqc3Ryc2lnbmFsKGludCBzaWcpOwkvKiBub3QgYWx3YXlzIGluIDxzdHJpbmcuaD4gKi8KKworc3RhdGljIHZvaWQKK2hhbmRsZXIgKGludCBzaWcpIHsKKyAgICAgZGllKEVYX1VTRVIsICIlcyIsIHN0cnNpZ25hbChzaWcpKTsKK30KKworc3RhdGljIHZvaWQKK3NldGxrd190aW1lb3V0IChpbnQgc2lnKSB7CisgICAgIC8qIG5vdGhpbmcsIGZjbnRsIHdpbGwgZmFpbCBhbnl3YXkgKi8KK30KKworLyogUmVtb3ZlIGxvY2sgZmlsZS4gICovCit2b2lkCit1bmxvY2tfbXRhYiAodm9pZCkgeworCWlmICh3ZV9jcmVhdGVkX2xvY2tmaWxlKSB7CisJCWNsb3NlKGxvY2tmaWxlX2ZkKTsKKwkJbG9ja2ZpbGVfZmQgPSAtMTsKKwkJdW5saW5rIChNT1VOVEVEX0xPQ0spOworCQl3ZV9jcmVhdGVkX2xvY2tmaWxlID0gMDsKKwl9Cit9CisKKy8qIENyZWF0ZSB0aGUgbG9jayBmaWxlLgorICAgVGhlIGxvY2sgZmlsZSB3aWxsIGJlIHJlbW92ZWQgaWYgd2UgY2F0Y2ggYSBzaWduYWwgb3Igd2hlbiB3ZSBleGl0LiAqLworLyogVGhlIG9sZCBjb2RlIGhlcmUgdXNlZCBmbG9jayBvbiBhIGxvY2sgZmlsZSAvZXRjL210YWJ+IGFuZCBkZWxldGVkCisgICB0aGlzIGxvY2sgZmlsZSBhZnRlcndhcmRzLiBIb3dldmVyLCBhcyByZ29vY2ggcmVtYXJrcywgdGhhdCBoYXMgYQorICAgcmFjZTogYSBzZWNvbmQgbW91bnQgbWF5IGJlIHdhaXRpbmcgb24gdGhlIGxvY2sgYW5kIHByb2NlZWQgYXMKKyAgIHNvb24gYXMgdGhlIGxvY2sgZmlsZSBpcyBkZWxldGVkIGJ5IHRoZSBmaXJzdCBtb3VudCwgYW5kIGltbWVkaWF0ZWx5CisgICBhZnRlcndhcmRzIGEgdGhpcmQgbW91bnQgY29tZXMsIGNyZWF0ZXMgYSBuZXcgL2V0Yy9tdGFifiwgYXBwbGllcworICAgZmxvY2sgdG8gdGhhdCwgYW5kIGFsc28gcHJvY2VlZHMsIHNvIHRoYXQgdGhlIHNlY29uZCBhbmQgdGhpcmQgbW91bnQKKyAgIG5vdyBib3RoIGFyZSBzY3JpYmJsaW5nIGluIC9ldGMvbXRhYi4KKyAgIFRoZSBuZXcgY29kZSB1c2VzIGEgbGluaygpIGluc3RlYWQgb2YgYSBjcmVhdCgpLCB3aGVyZSB3ZSBwcm9jZWVkCisgICBvbmx5IGlmIGl0IHdhcyB1cyB0aGF0IGNyZWF0ZWQgdGhlIGxvY2ssIGFuZCBoZW5jZSB3ZSBhbHdheXMgaGF2ZQorICAgdG8gZGVsZXRlIHRoZSBsb2NrIGFmdGVyd2FyZHMuIE5vdyB0aGUgdXNlIG9mIGZsb2NrKCkgaXMgaW4gcHJpbmNpcGxlCisgICBzdXBlcmZsdW91cywgYnV0IGF2b2lkcyBhbiBhcmJpdHJhcnkgc2xlZXAoKS4gKi8KKworLyogV2hlcmUgZG9lcyB0aGUgbGluayBwb2ludCB0bz8gT2J2aW91cyBjaG9pY2VzIGFyZSBtdGFiIGFuZCBtdGFifn4uCisgICBISkx1IHBvaW50cyBvdXQgdGhhdCB0aGUgbGF0dGVyIGxlYWRzIHRvIHJhY2VzLiBSaWdodCBub3cgd2UgdXNlCisgICBtdGFifi48cGlkPiBpbnN0ZWFkLiBVc2UgMjAgYXMgdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgJWQuICovCisjZGVmaW5lIE1PVU5UTE9DS19MSU5LVEFSR0VUCQlNT1VOVEVEX0xPQ0sgIiVkIgorI2RlZmluZSBNT1VOVExPQ0tfTElOS1RBUkdFVF9MVEgJKHNpemVvZihNT1VOVEVEX0xPQ0spKzIwKQorCit2b2lkCitsb2NrX210YWIgKHZvaWQpIHsKKwlpbnQgdHJpZXMgPSAxMDAwMDAsIGk7CisJY2hhciBsaW5rdGFyZ2V0ZmlsZVtNT1VOVExPQ0tfTElOS1RBUkdFVF9MVEhdOworCisJYXRfZGllID0gdW5sb2NrX210YWI7CisKKwlpZiAoIXNpZ25hbHNfaGF2ZV9iZWVuX3NldHVwKSB7CisJCWludCBzaWcgPSAwOworCQlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCisJCXNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCQlzYS5zYV9mbGFncyA9IDA7CisJCXNpZ2ZpbGxzZXQgKCZzYS5zYV9tYXNrKTsKKyAgCisJCXdoaWxlIChzaWdpc21lbWJlciAoJnNhLnNhX21hc2ssICsrc2lnKSAhPSAtMQorCQkgICAgICAgJiYgc2lnICE9IFNJR0NITEQpIHsKKwkJCWlmIChzaWcgPT0gU0lHQUxSTSkKKwkJCQlzYS5zYV9oYW5kbGVyID0gc2V0bGt3X3RpbWVvdXQ7CisJCQllbHNlCisJCQkJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJCQlzaWdhY3Rpb24gKHNpZywgJnNhLCAoc3RydWN0IHNpZ2FjdGlvbiAqKSAwKTsKKwkJfQorCQlzaWduYWxzX2hhdmVfYmVlbl9zZXR1cCA9IDE7CisJfQorCisJc3ByaW50ZihsaW5rdGFyZ2V0ZmlsZSwgTU9VTlRMT0NLX0xJTktUQVJHRVQsIGdldHBpZCAoKSk7CisKKwlpID0gb3BlbiAobGlua3RhcmdldGZpbGUsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOworCWlmIChpIDwgMCkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJLyogbGlua3RhcmdldGZpbGUgZG9lcyBub3QgZXhpc3QgKGFzIGEgZmlsZSkKKwkJICAgYW5kIHdlIGNhbm5vdCBjcmVhdGUgaXQuIFJlYWQtb25seSBmaWxlc3lzdGVtPworCQkgICBUb28gbWFueSBmaWxlcyBvcGVuIGluIHRoZSBzeXN0ZW0/CisJCSAgIEZpbGVzeXN0ZW0gZnVsbD8gKi8KKwkJZGllIChFWF9GSUxFSU8sIF8oImNhbid0IGNyZWF0ZSBsb2NrIGZpbGUgJXM6ICVzICIKKwkJCQkJCSAgIih1c2UgLW4gZmxhZyB0byBvdmVycmlkZSkiKSwKKwkJCSBsaW5rdGFyZ2V0ZmlsZSwgc3RyZXJyb3IgKGVycnN2KSk7CisJfQorCWNsb3NlKGkpOworCQorCS8qIFJlcGVhdCB1bnRpbCBpdCB3YXMgdXMgd2hvIG1hZGUgdGhlIGxpbmsgKi8KKwl3aGlsZSAoIXdlX2NyZWF0ZWRfbG9ja2ZpbGUpIHsKKwkJc3RydWN0IGZsb2NrIGZsb2NrOworCQlpbnQgZXJyc3YsIGo7CisKKwkJaiA9IGxpbmsobGlua3RhcmdldGZpbGUsIE1PVU5URURfTE9DSyk7CisJCWVycnN2ID0gZXJybm87CisKKwkJaWYgKGogPT0gMCkKKwkJCXdlX2NyZWF0ZWRfbG9ja2ZpbGUgPSAxOworCisJCWlmIChqIDwgMCAmJiBlcnJzdiAhPSBFRVhJU1QpIHsKKwkJCSh2b2lkKSB1bmxpbmsobGlua3RhcmdldGZpbGUpOworCQkJZGllIChFWF9GSUxFSU8sIF8oImNhbid0IGxpbmsgbG9jayBmaWxlICVzOiAlcyAiCisJCQkgICAgICIodXNlIC1uIGZsYWcgdG8gb3ZlcnJpZGUpIiksCisJCQkgICAgIE1PVU5URURfTE9DSywgc3RyZXJyb3IgKGVycnN2KSk7CisJCX0KKworCQlsb2NrZmlsZV9mZCA9IG9wZW4gKE1PVU5URURfTE9DSywgT19XUk9OTFkpOworCisJCWlmIChsb2NrZmlsZV9mZCA8IDApIHsKKwkJCWludCBlcnJzdiA9IGVycm5vOworCQkJLyogU3RyYW5nZS4uLiBNYXliZSB0aGUgZmlsZSB3YXMganVzdCBkZWxldGVkPyAqLworCQkJaWYgKGVycm5vID09IEVOT0VOVCAmJiB0cmllcy0tID4gMCkgeworCQkJCWlmICh0cmllcyAlIDIwMCA9PSAwKQorCQkJCQl1c2xlZXAoMzApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKHZvaWQpIHVubGluayhsaW5rdGFyZ2V0ZmlsZSk7CisJCQlkaWUgKEVYX0ZJTEVJTywgXygiY2FuJ3Qgb3BlbiBsb2NrIGZpbGUgJXM6ICVzICIKKwkJCSAgICAgIih1c2UgLW4gZmxhZyB0byBvdmVycmlkZSkiKSwKKwkJCSAgICAgTU9VTlRFRF9MT0NLLCBzdHJlcnJvciAoZXJyc3YpKTsKKwkJfQorCisJCWZsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisJCWZsb2NrLmxfd2hlbmNlID0gU0VFS19TRVQ7CisJCWZsb2NrLmxfc3RhcnQgPSAwOworCQlmbG9jay5sX2xlbiA9IDA7CisKKwkJaWYgKGogPT0gMCkgeworCQkJLyogV2UgbWFkZSB0aGUgbGluay4gTm93IGNsYWltIHRoZSBsb2NrLiAqLworCQkJaWYgKGZjbnRsIChsb2NrZmlsZV9mZCwgRl9TRVRMSywgJmZsb2NrKSA9PSAtMSkgeworCQkJCWlmICh2ZXJib3NlKSB7CisJCQkJICAgIGludCBlcnJzdiA9IGVycm5vOworCQkJCSAgICBwcmludGYoXygiQ2FuJ3QgbG9jayBsb2NrIGZpbGUgJXM6ICVzXG4iKSwKKwkJCQkJICAgTU9VTlRFRF9MT0NLLCBzdHJlcnJvciAoZXJyc3YpKTsKKwkJCQl9CisJCQkJLyogcHJvY2VlZCBhbnl3YXkgKi8KKwkJCX0KKwkJCSh2b2lkKSB1bmxpbmsobGlua3RhcmdldGZpbGUpOworCQl9IGVsc2UgeworCQkJc3RhdGljIGludCB0cmllcyA9IDA7CisKKwkJCS8qIFNvbWVvbmUgZWxzZSBtYWRlIHRoZSBsaW5rLiBXYWl0LiAqLworCQkJYWxhcm0oTE9DS19USU1FT1VUKTsKKwkJCWlmIChmY250bCAobG9ja2ZpbGVfZmQsIEZfU0VUTEtXLCAmZmxvY2spID09IC0xKSB7CisJCQkJaW50IGVycnN2ID0gZXJybm87CisJCQkJKHZvaWQpIHVubGluayhsaW5rdGFyZ2V0ZmlsZSk7CisJCQkJZGllIChFWF9GSUxFSU8sIF8oImNhbid0IGxvY2sgbG9jayBmaWxlICVzOiAlcyIpLAorCQkJCSAgICAgTU9VTlRFRF9MT0NLLCAoZXJybm8gPT0gRUlOVFIpID8KKwkJCQkgICAgIF8oInRpbWVkIG91dCIpIDogc3RyZXJyb3IgKGVycnN2KSk7CisJCQl9CisJCQlhbGFybSgwKTsKKwkJCS8qIExpbWl0IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyAtIG1heWJlIHRoZXJlCisJCQkgICBzdGlsbCBpcyBzb21lIG9sZCAvZXRjL210YWJ+ICovCisJCQkrK3RyaWVzOworCQkJaWYgKHRyaWVzICUgMjAwID09IDApCisJCQkgICB1c2xlZXAoMzApOworCQkJaWYgKHRyaWVzID4gMTAwMDAwKSB7CisJCQkJKHZvaWQpIHVubGluayhsaW5rdGFyZ2V0ZmlsZSk7CisJCQkJY2xvc2UobG9ja2ZpbGVfZmQpOworCQkJCWRpZSAoRVhfRklMRUlPLCBfKCJDYW5ub3QgY3JlYXRlIGxpbmsgJXNcbiIKKwkJCQkJCSAgIlBlcmhhcHMgdGhlcmUgaXMgYSBzdGFsZSBsb2NrIGZpbGU/XG4iKSwKKwkJCQkJIE1PVU5URURfTE9DSyk7CisgCQkJfQorCQkJY2xvc2UobG9ja2ZpbGVfZmQpOworCQl9CisJfQorfQorCisvKgorICogVXBkYXRlIHRoZSBtdGFiLgorICogIFVzZWQgYnkgdW1vdW50IHdpdGggbnVsbCBJTlNURUFEOiByZW1vdmUgdGhlIGxhc3QgRElSIGVudHJ5LgorICogIFVzZWQgYnkgbW91bnQgdXBvbiBhIHJlbW91bnQ6IHVwZGF0ZSBvcHRpb24gcGFydCwKKyAqICAgYW5kIGNvbXBsYWluIGlmIGEgd3JvbmcgZGV2aWNlIG9yIHR5cGUgd2FzIGdpdmVuLgorICogICBbTm90ZSB0aGF0IG9mdGVuIGEgcmVtb3VudCB3aWxsIGJlIGEgcncgcmVtb3VudCBvZiAvCisgKiAgICB3aGVyZSB0aGVyZSB3YXMgbm8gZW50cnkgYmVmb3JlLCBhbmQgd2UnbGwgaGF2ZSB0byBiZWxpZXZlCisgKiAgICB0aGUgdmFsdWVzIGdpdmVuIGluIElOU1RFQUQuXQorICovCisKK3ZvaWQKK3VwZGF0ZV9tdGFiIChjb25zdCBjaGFyICpkaXIsIHN0cnVjdCBtbnRlbnQgKmluc3RlYWQpCit7CisJbW50RklMRSAqbWZwLCAqbWZ0bXA7CisJY29uc3QgY2hhciAqZm5hbSA9IE1PVU5URUQ7CisJc3RydWN0IG1udGVudGNobiBtdGFiaGVhZDsJLyogZHVtbXkgKi8KKwlzdHJ1Y3QgbW50ZW50Y2huICptYywgKm1jMCwgKmFic2VudCA9IE5VTEw7CisKKwlpZiAobXRhYl9kb2VzX25vdF9leGlzdCgpIHx8ICFtdGFiX2lzX3dyaXRhYmxlKCkpCisJCXJldHVybjsKKworCWxvY2tfbXRhYigpOworCisJLyogaGF2aW5nIGxvY2tlZCBtdGFiLCByZWFkIGl0IGFnYWluICovCisJbWMwID0gbWMgPSAmbXRhYmhlYWQ7CisJbWMtPm54dCA9IG1jLT5wcmV2ID0gTlVMTDsKKworCW1mcCA9IG5mc19zZXRtbnRlbnQoZm5hbSwgInIiKTsKKwlpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tbnRlbnRfZnAgPT0gTlVMTCkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJbmZzX2Vycm9yIChfKCJjYW5ub3Qgb3BlbiAlcyAoJXMpIC0gbXRhYiBub3QgdXBkYXRlZCIpLAorCQkgICAgICAgZm5hbSwgc3RyZXJyb3IgKGVycnN2KSk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJcmVhZF9tbnRlbnRjaG4obWZwLCBmbmFtLCBtYyk7CisKKwkvKiBmaW5kIGxhc3Qgb2NjdXJyZW5jZSBvZiBkaXIgKi8KKwlmb3IgKG1jID0gbWMwLT5wcmV2OyBtYyAmJiBtYyAhPSBtYzA7IG1jID0gbWMtPnByZXYpCisJCWlmIChzdHJlcShtYy0+bS5tbnRfZGlyLCBkaXIpKQorCQkJYnJlYWs7CisJaWYgKG1jICYmIG1jICE9IG1jMCkgeworCQlpZiAoaW5zdGVhZCA9PSBOVUxMKSB7CisJCQkvKiBBbiB1bW91bnQgLSByZW1vdmUgZW50cnkgKi8KKwkJCWlmIChtYyAmJiBtYyAhPSBtYzApIHsKKwkJCQltYy0+cHJldi0+bnh0ID0gbWMtPm54dDsKKwkJCQltYy0+bnh0LT5wcmV2ID0gbWMtPnByZXY7CisJCQkJZnJlZShtYyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBIHJlbW91bnQgKi8KKwkJCW1jLT5tLm1udF9vcHRzID0gaW5zdGVhZC0+bW50X29wdHM7CisJCX0KKwl9IGVsc2UgaWYgKGluc3RlYWQpIHsKKwkJLyogbm90IGZvdW5kLCBhZGQgYSBuZXcgZW50cnkgKi8KKwkJYWJzZW50ID0geG1hbGxvYyhzaXplb2YoKmFic2VudCkpOworCQlhYnNlbnQtPm0gPSAqaW5zdGVhZDsKKwkJYWJzZW50LT5ueHQgPSBtYzA7CisJCWFic2VudC0+cHJldiA9IG1jMC0+cHJldjsKKwkJbWMwLT5wcmV2ID0gYWJzZW50OworCQlpZiAobWMwLT5ueHQgPT0gTlVMTCkKKwkJCW1jMC0+bnh0ID0gYWJzZW50OworCX0KKworCS8qIHdyaXRlIGNoYWluIHRvIG10ZW1wICovCisJbWZ0bXAgPSBuZnNfc2V0bW50ZW50IChNT1VOVEVEX1RFTVAsICJ3Iik7CisJaWYgKG1mdG1wID09IE5VTEwgfHwgbWZ0bXAtPm1udGVudF9mcCA9PSBOVUxMKSB7CisJCWludCBlcnJzdiA9IGVycm5vOworCQluZnNfZXJyb3IgKF8oImNhbm5vdCBvcGVuICVzICglcykgLSBtdGFiIG5vdCB1cGRhdGVkIiksCisJCSAgICAgICBNT1VOVEVEX1RFTVAsIHN0cmVycm9yIChlcnJzdikpOworCQlnb3RvIGxlYXZlOworCX0KKworCWZvciAobWMgPSBtYzAtPm54dDsgbWMgJiYgbWMgIT0gbWMwOyBtYyA9IG1jLT5ueHQpIHsKKwkJaWYgKG5mc19hZGRtbnRlbnQobWZ0bXAsICYobWMtPm0pKSA9PSAxKSB7CisJCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJCWRpZSAoRVhfRklMRUlPLCBfKCJlcnJvciB3cml0aW5nICVzOiAlcyIpLAorCQkJICAgICBNT1VOVEVEX1RFTVAsIHN0cmVycm9yIChlcnJzdikpOworCQl9CisJfQorCisjaWYgMAorCS8qIHRoZSBjaGFpbiBtaWdodCBoYXZlIHN0cmluZ3MgY29waWVkIGZyb20gJ2luc3RlYWQnLAorCSAqIHNvIHdlIGNhbm5vdCBzYWZlbHkgZnJlZSBpdC4KKwkgKiBBbmQgdGhlcmUgaXMgbm8gbmVlZCBhbnl3YXkgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gZXhpdAorCSAqIHNob3J0bHkuICBTbyBqdXN0IGRvbid0IGNhbGwgZGlzY2FyZF9tbnRlbnRjaG4uLi4uCisJICovCisJZGlzY2FyZF9tbnRlbnRjaG4obWMwKTsKKyNlbmRpZgorCWlmIChmY2htb2QgKGZpbGVubyAobWZ0bXAtPm1udGVudF9mcCksCisJCSAgICBTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lST1RIKSA8IDApIHsKKwkJaW50IGVycnN2ID0gZXJybm87CisJCWZwcmludGYoc3RkZXJyLCBfKCJlcnJvciBjaGFuZ2luZyBtb2RlIG9mICVzOiAlc1xuIiksCisJCQlNT1VOVEVEX1RFTVAsIHN0cmVycm9yIChlcnJzdikpOworCX0KKwluZnNfZW5kbW50ZW50IChtZnRtcCk7CisKKwl7IC8qCisJICAgKiBJZiBtb3VudCBpcyBzZXR1aWQgYW5kIHNvbWUgbm9uLXJvb3QgdXNlciBtb3VudHMgc3RoLAorCSAgICogdGhlbiBtdGFiLnRtcCBtaWdodCBnZXQgdGhlIGdyb3VwIG9mIHRoaXMgdXNlci4gQ29weSB1aWQvZ2lkCisJICAgKiBmcm9tIHRoZSBwcmVzZW50IG10YWIgYmVmb3JlIHJlbmFtaW5nLgorCSAgICovCisJICAgIHN0cnVjdCBzdGF0IHNidWY7CisJICAgIGlmIChzdGF0IChNT1VOVEVELCAmc2J1ZikgPT0gMCkKKwkJY2hvd24gKE1PVU5URURfVEVNUCwgc2J1Zi5zdF91aWQsIHNidWYuc3RfZ2lkKTsKKwl9CisKKwkvKiByZW5hbWUgbXRlbXAgdG8gbXRhYiAqLworCWlmIChyZW5hbWUgKE1PVU5URURfVEVNUCwgTU9VTlRFRCkgPCAwKSB7CisJCWludCBlcnJzdiA9IGVycm5vOworCQlmcHJpbnRmKHN0ZGVyciwgXygiY2FuJ3QgcmVuYW1lICVzIHRvICVzOiAlc1xuIiksCisJCQlNT1VOVEVEX1RFTVAsIE1PVU5URUQsIHN0cmVycm9yKGVycnN2KSk7CisJfQorCisgbGVhdmU6CisJdW5sb2NrX210YWIoKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9nZXRmaC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2dldGZoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyNjZmZAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9nZXRmaC5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBzdXBwb3J0L25mcy9nZXRmaC5jCisgKgorICogR2V0IHRoZSBGSCBmb3IgYSBnaXZlbiBjbGllbnQgYW5kIGRpcmVjdG9yeS4gVGhpcyBmdW5jdGlvbiB0YWtlcworICogdGhlIE5GUyBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaGFzIG5vdGhpbmcgaW4gY29tbW9uIHdpdGggdGhlIFN1bk9TIGdldGZoIGZ1bmN0aW9uLAorICogd2hpY2ggaXMgYSBmcm9udC1lbmQgdG8gdGhlIFJQQyBtb3VudCBjYWxsLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIm5mc2xpYi5oIgorCitzdHJ1Y3QgbmZzX2ZoX2xlbiAqCitnZXRmaF9vbGQgKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgZGV2X3QgZGV2LCBpbm9fdCBpbm8pCit7CisJdW5pb24gbmZzY3RsX3JlcwlyZXM7CisJc3RydWN0IG5mc2N0bF9hcmcJYXJnOworCXN0YXRpYyBzdHJ1Y3QgbmZzX2ZoX2xlbiByZmg7CisKKwlhcmcuY2FfdmVyc2lvbiA9IE5GU0NUTF9WRVJTSU9OOworCWFyZy5jYV9nZXRmaC5nZl92ZXJzaW9uID0gMjsJLyogb2Jzb2xldGUgKi8KKwlhcmcuY2FfZ2V0ZmguZ2ZfZGV2ID0gZGV2OworCWFyZy5jYV9nZXRmaC5nZl9pbm8gPSBpbm87CisJbWVtY3B5KCZhcmcuY2FfZ2V0ZmguZ2ZfYWRkciwgYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCisJaWYgKG5mc2N0bChORlNDVExfR0VURkgsICZhcmcsICZyZXMpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZmguZmhfc2l6ZSA9IDMyOworCW1lbWNweShyZmguZmhfaGFuZGxlLCAmcmVzLmNyX2dldGZoLCAzMik7CisJcmV0dXJuICZyZmg7Cit9CisKK3N0cnVjdCBuZnNfZmhfbGVuICoKK2dldGZoKHN0cnVjdCBzb2NrYWRkciAqYWRkciwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdGF0aWMgdW5pb24gbmZzY3RsX3JlcyByZXM7CisgICAgICAgIHN0cnVjdCBuZnNjdGxfYXJnICAgICAgIGFyZzsKKwlzdGF0aWMgc3RydWN0IG5mc19maF9sZW4gcmZoOworCisgICAgICAgIGFyZy5jYV92ZXJzaW9uID0gTkZTQ1RMX1ZFUlNJT047CisgICAgICAgIGFyZy5jYV9nZXRmZC5nZF92ZXJzaW9uID0gMjsgICAgLyogb2Jzb2xldGUgKi8KKyAgICAgICAgc3RybmNweShhcmcuY2FfZ2V0ZmQuZ2RfcGF0aCwgcGF0aCwKKwkJc2l6ZW9mKGFyZy5jYV9nZXRmZC5nZF9wYXRoKSAtIDEpOworCWFyZy5jYV9nZXRmZC5nZF9wYXRoW3NpemVvZiAoYXJnLmNhX2dldGZkLmdkX3BhdGgpIC0gMV0gPSAnXDAnOworICAgICAgICBtZW1jcHkoJmFyZy5jYV9nZXRmZC5nZF9hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisKKyAgICAgICAgaWYgKG5mc2N0bChORlNDVExfR0VURkQsICZhcmcsICZyZXMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworCXJmaC5maF9zaXplID0gMzI7CisJbWVtY3B5KHJmaC5maF9oYW5kbGUsICZyZXMuY3JfZ2V0ZmgsIDMyKTsKKwlyZXR1cm4gJnJmaDsKK30KKworc3RydWN0IG5mc19maF9sZW4gKgorZ2V0Zmhfc2l6ZShzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBzaXplKQoreworICAgICAgICBzdGF0aWMgdW5pb24gbmZzY3RsX3JlcyByZXM7CisgICAgICAgIHN0cnVjdCBuZnNjdGxfYXJnICAgICAgIGFyZzsKKworICAgICAgICBhcmcuY2FfdmVyc2lvbiA9IE5GU0NUTF9WRVJTSU9OOworICAgICAgICBzdHJuY3B5KGFyZy5jYV9nZXRmcy5nZF9wYXRoLCBwYXRoLAorCQlzaXplb2YoYXJnLmNhX2dldGZzLmdkX3BhdGgpIC0gMSk7CisJYXJnLmNhX2dldGZzLmdkX3BhdGhbc2l6ZW9mIChhcmcuY2FfZ2V0ZnMuZ2RfcGF0aCkgLSAxXSA9ICdcMCc7CisgICAgICAgIG1lbWNweSgmYXJnLmNhX2dldGZzLmdkX2FkZHIsIGFkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwlhcmcuY2FfZ2V0ZnMuZ2RfbWF4bGVuID0gc2l6ZTsKKworICAgICAgICBpZiAobmZzY3RsKE5GU0NUTF9HRVRGUywgJmFyZywgJnJlcykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHJldHVybiAmcmVzLmNyX2dldGZzOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL2dldHBvcnQuYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9nZXRwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzMDUzOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9nZXRwb3J0LmMKQEAgLTAsMCArMSwxMDc5IEBACisvKgorICogUHJvdmlkZSBhIHZhcmlldHkgb2YgQVBJcyB0aGF0IHF1ZXJ5IGFuIHJwY2JpbmQgZGFlbW9uIHRvCisgKiBkaXNjb3ZlciBSUEMgc2VydmljZSBwb3J0cyBhbmQgYWxsb3dlZCBwcm90b2NvbCB2ZXJzaW9uCisgKiBudW1iZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgorCisjaWZkZWYgSEFWRV9MSUJUSVJQQworI2luY2x1ZGUgPG5ldGNvbmZpZy5oPgorI2luY2x1ZGUgPHJwYy9ycGNiX3Byb3QuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJuZnNycGMuaCIKKworLyoKKyAqIFRyeSBhIGxvY2FsIHNvY2tldCBmaXJzdCB0byBhY2Nlc3MgdGhlIGxvY2FsIHJwY2JpbmQgZGFlbW9uCisgKgorICogUnBjYmluZCdzIGxvY2FsIHNvY2tldCBzZXJ2aWNlIGRvZXMgbm90IHNlZW0gdG8gYmUgd29ya2luZy4KKyAqIERpc2FibGUgdGhpcyBsb2dpYyBmb3Igbm93LgorICovCisjaWZkZWYgSEFWRV9MSUJUSVJQQworI3VuZGVmIE5GU19HUF9MT0NBTAorI2Vsc2UJLyogIUhBVkVfTElCVElSUEMgKi8KKyN1bmRlZiBORlNfR1BfTE9DQUwKKyNlbmRpZgkvKiAhSEFWRV9MSUJUSVJQQyAqLworCisjaWZkZWYgSEFWRV9MSUJUSVJQQworc3RhdGljIGNvbnN0IHJwY3ZlcnNfdCBkZWZhdWx0X3JwY2JfdmVyc2lvbiA9IFJQQ0JWRVJTXzQ7CisjZWxzZQkvKiAhSEFWRV9MSUJUSVJQQyAqLworc3RhdGljIGNvbnN0IHJwY3ZlcnNfdCBkZWZhdWx0X3JwY2JfdmVyc2lvbiA9IFBNQVBWRVJTOworI2VuZGlmCS8qICFIQVZFX0xJQlRJUlBDICovCisKKy8qCisgKiBIaXN0b3JpY2FsOiBNYXAgVENQIGNvbm5lY3QgdGltZW91dHMgdG8gdGltZW91dAorICogZXJyb3IgY29kZSB1c2VkIGJ5IFVEUC4KKyAqLworc3RhdGljIHZvaWQKK25mc19ncF9tYXBfdGNwX2Vycm9yY29kZXMoY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wpCit7CisJaWYgKHByb3RvY29sICE9IElQUFJPVE9fVENQKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHJwY19jcmVhdGVlcnIuY2ZfZXJyb3IucmVfZXJybm8pIHsKKwljYXNlIEVUSU1FRE9VVDoKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1RJTUVET1VUOworCQlicmVhazsKKwljYXNlIEVDT05OUkVGVVNFRDoKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX0NBTlRSRUNWOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBUaGVyZSdzIG5vIGVhc3kgd2F5IHRvIHRlbGwgaG93IHRoZSBsb2NhbCBzeXN0ZW0ncyBuZXR3b3JraW5nCisgKiBhbmQgcnBjYmluZCBpcyBjb25maWd1cmVkIChpZS4gd2hldGhlciB3ZSB3YW50IHRvIHVzZSBJUHY2IG9yCisgKiBJUHY0IGxvb3BiYWNrIHRvIGNvbnRhY3QgUlBDIHNlcnZpY2VzIG9uIHRoZSBsb2NhbCBob3N0KS4gIFdlCisgKiBwdW50IGFuZCBzaW1wbHkgdHJ5IHRvIGxvb2sgdXAgImxvY2FsaG9zdCIuCisgKgorICogUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2dwX2xvb3BiYWNrX2FkZHJlc3Moc3RydWN0IHNvY2thZGRyICpzYXAsIHNvY2tsZW5fdCAqc2FsZW4pCit7CisJc3RydWN0IGFkZHJpbmZvICpnYWlfcmVzdWx0czsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChnZXRhZGRyaW5mbygibG9jYWxob3N0IiwgTlVMTCwgTlVMTCwgJmdhaV9yZXN1bHRzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKnNhbGVuID49IGdhaV9yZXN1bHRzLT5haV9hZGRybGVuKSB7CisJCW1lbWNweShzYXAsIGdhaV9yZXN1bHRzLT5haV9hZGRyLAorCQkJCWdhaV9yZXN1bHRzLT5haV9hZGRybGVuKTsKKwkJKnNhbGVuID0gZ2FpX3Jlc3VsdHMtPmFpX2FkZHJsZW47CisJCXJldCA9IDE7CisJfQorCisJZnJlZWFkZHJpbmZvKGdhaV9yZXN1bHRzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTG9vayB1cCBhIG5ldHdvcmsgc2VydmljZSBpbiAvZXRjL3NlcnZpY2VzIGFuZCByZXR1cm4gdGhlCisgKiBuZXR3b3JrLW9yZGVyIHBvcnQgbnVtYmVyIG9mIHRoYXQgc2VydmljZS4KKyAqLworc3RhdGljIGluX3BvcnRfdCBuZnNfZ3BfZ2V0c2VydmJ5bmFtZShjb25zdCBjaGFyICpzZXJ2aWNlLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sKQoreworCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyBnYWlfaGludCA9IHsKKwkJLmFpX2ZhbWlseQk9IEFGX0lORVQsCisJCS5haV9wcm90b2NvbAk9IHByb3RvY29sLAorCQkuYWlfZmxhZ3MJPSBBSV9QQVNTSVZFLAorCX07CisJc3RydWN0IGFkZHJpbmZvICpnYWlfcmVzdWx0czsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwlpbl9wb3J0X3QgcG9ydDsKKworCWlmIChnZXRhZGRyaW5mbyhOVUxMLCBzZXJ2aWNlLCAmZ2FpX2hpbnQsICZnYWlfcmVzdWx0cykgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzaW4gPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopZ2FpX3Jlc3VsdHMtPmFpX2FkZHI7CisJcG9ydCA9IHNpbi0+c2luX3BvcnQ7CisJCisJZnJlZWFkZHJpbmZvKGdhaV9yZXN1bHRzKTsKKwlyZXR1cm4gcG9ydDsKK30KKworLyoKKyAqIERpc2NvdmVyIHRoZSBwb3J0IG51bWJlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNvbnRhY3QgYW4KKyAqIHJwY2JpbmQgc2VydmljZS4gIFRoaXMgd2lsbCBkZXRlY3QgaWYgdGhlIHBvcnQgaGFzIGEgbG9jYWwKKyAqIHZhbHVlIHRoYXQgbWF5IGhhdmUgYmVlbiBzZXQgaW4gL2V0Yy9zZXJ2aWNlcy4KKyAqCisgKiBSZXR1cm5zIG5ldHdvcmsgYnl0ZS1vcmRlciBwb3J0IG51bWJlciBvZiBycGNiaW5kIHNlcnZpY2UKKyAqIG9uIHRoaXMgc3lzdGVtLgorICovCitzdGF0aWMgaW5fcG9ydF90IG5mc19ncF9nZXRfcnBjYl9wb3J0KGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpycGNiX25ldG5hbWV0YmxbXSA9IHsKKwkJInJwY2JpbmQiLAorCQkicG9ydG1hcHBlciIsCisJCSJzdW5ycGMiLAorCQlOVUxMLAorCX07CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBycGNiX25ldG5hbWV0YmxbaV0gIT0gTlVMTDsgaSsrKSB7CisJCWluX3BvcnRfdCBwb3J0OworCisJCXBvcnQgPSBuZnNfZ3BfZ2V0c2VydmJ5bmFtZShycGNiX25ldG5hbWV0YmxbaV0sIHByb3RvY29sKTsKKwkJaWYgKHBvcnQgIT0gMCkKKwkJCXJldHVybiBwb3J0OworCX0KKworCXJldHVybiAoaW5fcG9ydF90KWh0b25zKCh1aW50MTZfdClQTUFQUE9SVCk7Cit9CisKKy8qCisgKiBTZXQgdXAgYW4gUlBDIGNsaWVudCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIGFuIHJwY2JpbmQgZGFlbW9uIGF0CisgKiBAc2FwIG92ZXIgQHRyYW5zcG9ydCB3aXRoIHByb3RvY29sIHZlcnNpb24gQHZlcnNpb24uCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBwcmVwYXJlZCBSUEMgY2xpZW50IGlmIHN1Y2Nlc3NmdWwsIGFuZAorICogQHRpbWVvdXQgaXMgaW5pdGlhbGl6ZWQ7IGNhbGxlciBtdXN0IGRlc3Ryb3kgYSBub24tTlVMTCByZXR1cm5lZCBSUEMKKyAqIGNsaWVudC4gIE90aGVyd2lzZSByZXR1cm5zIE5VTEwsIGFuZCBycGNfY3JlYXRlZXJyLmNmX3N0YXQgaXMgc2V0IHRvCisgKiByZWZsZWN0IHRoZSBlcnJvci4KKyAqLworc3RhdGljIENMSUVOVCAqbmZzX2dwX2dldF9ycGNiY2xpZW50KHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCSAgICAgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgdHJhbnNwb3J0LAorCQkJCSAgICAgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkJICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqcnBjYl9wZ210YmxbXSA9IHsKKwkJInJwY2JpbmQiLAorCQkicG9ydG1hcCIsCisJCSJwb3J0bWFwcGVyIiwKKwkJInN1bnJwYyIsCisJCU5VTEwsCisJfTsKKwlycGNwcm9nX3QgcnBjYl9wcm9nID0gbmZzX2dldHJwY2J5bmFtZShSUENCUFJPRywgcnBjYl9wZ210YmwpOworCUNMSUVOVCAqY2xudDsKKworCW5mc19zZXRfcG9ydChzYXAsIG50b2hzKG5mc19ncF9nZXRfcnBjYl9wb3J0KHRyYW5zcG9ydCkpKTsKKwljbG50ID0gbmZzX2dldF9ycGNjbGllbnQoc2FwLCBzYWxlbiwgdHJhbnNwb3J0LCBycGNiX3Byb2csCisJCQkJCQkJdmVyc2lvbiwgdGltZW91dCk7CisJbmZzX2dwX21hcF90Y3BfZXJyb3Jjb2Rlcyh0cmFuc3BvcnQpOworCXJldHVybiBjbG50OworfQorCisvKioKKyAqIG5mc19nZXRfcHJvdG8gLSBDb252ZXJ0IGEgbmV0aWQgdG8gYW4gYWRkcmVzcyBmYW1pbHkgYW5kIHByb3RvY29sIG51bWJlcgorICogQG5ldGlkOiBDIHN0cmluZyBjb250YWluaW5nIGEgbmV0aWQKKyAqIEBmYW1pbHk6IE9VVDogYWRkcmVzcyBmYW1pbHkKKyAqIEBwcm90b2NvbDogT1VUOiBwcm90b2NvbCBudW1iZXIKKyAqCisgKiBSZXR1cm5zIDEgYW5kIGZpbGxzIGluIEBwcm90b2NvbCBpZiB0aGUgbmV0aWQgd2FzIHJlY29nbml6ZWQ7CisgKiBvdGhlcndpc2UgemVybyBpcyByZXR1cm5lZC4KKyAqLworI2lmZGVmIEhBVkVfTElCVElSUEMKK2ludAorbmZzX2dldF9wcm90byhjb25zdCBjaGFyICpuZXRpZCwgc2FfZmFtaWx5X3QgKmZhbWlseSwgdW5zaWduZWQgbG9uZyAqcHJvdG9jb2wpCit7CisJc3RydWN0IG5ldGNvbmZpZyAqbmNvbmY7CisJc3RydWN0IHByb3RvZW50ICpwcm90bzsKKworCW5jb25mID0gZ2V0bmV0Y29uZmlnZW50KG5ldGlkKTsKKwlpZiAobmNvbmYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlwcm90byA9IGdldHByb3RvYnluYW1lKG5jb25mLT5uY19wcm90byk7CisJaWYgKHByb3RvID09IE5VTEwpIHsKKwkJZnJlZW5ldGNvbmZpZ2VudChuY29uZik7CisJCXJldHVybiAwOworCX0KKworCSpmYW1pbHkgPSBBRl9VTlNQRUM7CisJaWYgKHN0cmNtcChuY29uZi0+bmNfcHJvdG9mbWx5LCBOQ19JTkVUKSA9PSAwKQorCQkqZmFtaWx5ID0gQUZfSU5FVDsKKwlpZiAoc3RyY21wKG5jb25mLT5uY19wcm90b2ZtbHksIE5DX0lORVQ2KSA9PSAwKQorCQkqZmFtaWx5ID0gQUZfSU5FVDY7CisJZnJlZW5ldGNvbmZpZ2VudChuY29uZik7CisKKwkqcHJvdG9jb2wgPSAodW5zaWduZWQgbG9uZylwcm90by0+cF9wcm90bzsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCS8qICFIQVZFX0xJQlRJUlBDICovCitpbnQKK25mc19nZXRfcHJvdG8oY29uc3QgY2hhciAqbmV0aWQsIHNhX2ZhbWlseV90ICpmYW1pbHksIHVuc2lnbmVkIGxvbmcgKnByb3RvY29sKQoreworCXN0cnVjdCBwcm90b2VudCAqcHJvdG87CisKKwlwcm90byA9IGdldHByb3RvYnluYW1lKG5ldGlkKTsKKwlpZiAocHJvdG8gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkqZmFtaWx5ID0gQUZfSU5FVDsKKwkqcHJvdG9jb2wgPSAodW5zaWduZWQgbG9uZylwcm90by0+cF9wcm90bzsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiAhSEFWRV9MSUJUSVJQQyAqLworCisvKioKKyAqIG5mc19nZXRfbmV0aWQgLSBDb252ZXJ0IGEgcHJvdG9jb2wgZmFtaWx5IGFuZCBwcm90b2NvbCBuYW1lIHRvIGEgbmV0aWQKKyAqIEBmYW1pbHk6IHByb3RvY29sIGZhbWlseQorICogQHByb3RvY29sOiBwcm90b2NvbCBudW1iZXIKKyAqCisgKiBPbmUgb2YgdGhlIGFyZ3VtZW50cyBwYXNzZWQgd2hlbiBxdWVyeWluZyByZW1vdGUgcnBjYmluZCBzZXJ2aWNlcworICogdmlhIHJwY2JpbmQgdjMgb3IgdjQgaXMgYSBuZXRpZCBzdHJpbmcuICBUaGlzIHJlcGxhY2VzIHRoZSBwbV9wcm90CisgKiBmaWVsZCB1c2VkIGluIGxlZ2FjeSBQTUFQX0dFVFBPUlQgY2FsbHMuCisgKgorICogUkZDIDE4MzMgc2F5cyBuZXRpZHMgYXJlIG5vdCBzdGFuZGFyZCBidXQgcmF0aGVyIGRlZmluZWQgb24gdGhlIGxvY2FsCisgKiBob3N0LiAgVGhlcmUgYXJlLCBob3dldmVyLCBzdGFuZGFyZCBkZWZpbml0aW9ucyBmb3IgbmNfcHJvdG9mbWx5IGFuZAorICogbmNfcHJvdG8gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXJpdmUgYSBuZXRpZCBzdHJpbmcgb24gdGhlIGxvY2FsIGhvc3QsCisgKiBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgL2V0Yy9uZXRjb25maWcuCisgKgorICogV2FsayB0aHJvdWdoIHRoZSBsb2NhbCBuZXRjb25maWcgZGF0YWJhc2UgYW5kIGdyYWIgdGhlIG5ldGlkIG9mIHRoZQorICogZmlyc3QgZW50cnkgdGhhdCBtYXRjaGVzIEBmYW1pbHkgYW5kIEBwcm90b2NvbCBhbmQgd2hvc2UgbmV0aWQgc3RyaW5nCisgKiBmaXRzIGluIHRoZSBwcm92aWRlZCBidWZmZXIuCisgKgorICogUmV0dXJucyBhICdcMCctdGVybWluYXRlZCBzdHJpbmcgaWYgc3VjY2Vzc2Z1bC4gIENhbGxlciBtdXN0CisgKiBmcmVlIHRoZSByZXR1cm5lZCBzdHJpbmcuICBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZCwgYW5kCisgKiBycGNfY3JlYXRlZXJyLmNmX3N0YXQgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIGVycm9yLgorICovCisjaWZkZWYgSEFWRV9MSUJUSVJQQworY2hhciAqbmZzX2dldF9uZXRpZChjb25zdCBzYV9mYW1pbHlfdCBmYW1pbHksIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvdG9jb2wpCit7CisJY2hhciAqbmNfcHJvdG9mbWx5LCAqbmNfcHJvdG8sICpuY19uZXRpZDsKKwlzdHJ1Y3QgbmV0Y29uZmlnICpuY29uZjsKKwlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOworCXZvaWQgKmhhbmRsZTsKKworCXN3aXRjaCAoZmFtaWx5KSB7CisJY2FzZSBBRl9MT0NBTDoKKwljYXNlIEFGX0lORVQ6CisJCW5jX3Byb3RvZm1seSA9IE5DX0lORVQ7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCW5jX3Byb3RvZm1seSA9IE5DX0lORVQ2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKKwl9CisKKwlwcm90byA9IGdldHByb3RvYnludW1iZXIocHJvdG9jb2wpOworCWlmIChwcm90byA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwluY19wcm90byA9IHByb3RvLT5wX25hbWU7CisKKwloYW5kbGUgPSBzZXRuZXRjb25maWcoKTsKKwl3aGlsZSAoKG5jb25mID0gZ2V0bmV0Y29uZmlnKGhhbmRsZSkpICE9IE5VTEwpIHsKKworCQlpZiAobmNvbmYtPm5jX3Byb3RvZm1seSAhPSBOVUxMICYmCisJCSAgICBzdHJjbXAobmNvbmYtPm5jX3Byb3RvZm1seSwgbmNfcHJvdG9mbWx5KSAhPSAwKQorCQkJY29udGludWU7CisJCWlmIChuY29uZi0+bmNfcHJvdG8gIT0gTlVMTCAmJgorCQkgICAgc3RyY21wKG5jb25mLT5uY19wcm90bywgbmNfcHJvdG8pICE9IDApCisJCQljb250aW51ZTsKKworCQluY19uZXRpZCA9IHN0cmR1cChuY29uZi0+bmNfbmV0aWQpOworCQllbmRuZXRjb25maWcoaGFuZGxlKTsKKworCQlpZiAobmNfbmV0aWQgPT0gTlVMTCkKKwkJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19TWVNURU1FUlJPUjsKKwkJcmV0dXJuIG5jX25ldGlkOworCX0KKwllbmRuZXRjb25maWcoaGFuZGxlKTsKKworb3V0OgorCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19VTktOT1dOUFJPVE87CisJcmV0dXJuIE5VTEw7Cit9CisjZWxzZQkvKiAhSEFWRV9MSUJUSVJQQyAqLworY2hhciAqbmZzX2dldF9uZXRpZChjb25zdCBzYV9mYW1pbHlfdCBmYW1pbHksIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvdG9jb2wpCit7CisJc3RydWN0IHByb3RvZW50ICpwcm90bzsKKwljaGFyICpuZXRpZDsKKworCWlmIChmYW1pbHkgIT0gQUZfSU5FVCkKKwkJZ290byBvdXQ7CisJcHJvdG8gPSBnZXRwcm90b2J5bnVtYmVyKChpbnQpcHJvdG9jb2wpOworCWlmIChwcm90byA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCW5ldGlkID0gc3RyZHVwKHByb3RvLT5wX25hbWUpOworCWlmIChuZXRpZCA9PSBOVUxMKQorCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfU1lTVEVNRVJST1I7CisJcmV0dXJuIG5ldGlkOworCitvdXQ6CisJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1VOS05PV05QUk9UTzsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgkvKiAhSEFWRV9MSUJUSVJQQyAqLworCisvKgorICogRXh0cmFjdCBhIHBvcnQgbnVtYmVyIGZyb20gYSB1bml2ZXJzYWwgYWRkcmVzcywgYW5kIHRlcm1pbmF0ZSB0aGUKKyAqIHN0cmluZyBpbiBAYWRkcnN0ciBqdXN0IGFmdGVyIHRoZSBhZGRyZXNzIHBhcnQuCisgKgorICogUmV0dXJucyAtMSBpZiB1bnN1Y2Nlc2Z1bDsgb3RoZXJ3aXNlIGEgZGVjb2RlZCBwb3J0IG51bWJlciAocG9zc2libHkgMCkKKyAqIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IG5mc19ncF91bml2ZXJzYWxfcG9ydGhlbHBlcihjaGFyICphZGRyc3RyKQoreworCWNoYXIgKnAsICplbmRwdHI7CisJdW5zaWduZWQgbG9uZyBwb3J0bG8sIHBvcnRoaTsKKwlpbnQgcG9ydCA9IC0xOworCisJcCA9IHN0cnJjaHIoYWRkcnN0ciwgJy4nKTsKKwlpZiAocCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlwb3J0bG8gPSBzdHJ0b3VsKHAgKyAxLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJyB8fCBwb3J0bG8gPiAyNTUpCisJCWdvdG8gb3V0OworCSpwID0gJ1wwJzsKKworCXAgPSBzdHJyY2hyKGFkZHJzdHIsICcuJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJcG9ydGhpID0gc3RydG91bChwICsgMSwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcgfHwgcG9ydGhpID4gMjU1KQorCQlnb3RvIG91dDsKKwkqcCA9ICdcMCc7CisJcG9ydCA9IChwb3J0aGkgPDwgOCkgfCBwb3J0bG87CisKK291dDoKKwlyZXR1cm4gcG9ydDsKK30KKworLyoqCisgKiBuZnNfdW5pdmVyc2FsMnBvcnQgLSBleHRyYWN0IHBvcnQgbnVtYmVyIGZyb20gYSAidW5pdmVyc2FsIGFkZHJlc3MiCisgKiBAdWFkZHI6ICdcMCctdGVybWluYXRlZCBDIHN0cmluZyBjb250YWluaW5nIGEgdW5pdmVyc2FsIGFkZHJlc3MKKyAqCisgKiBVbml2ZXJzYWwgYWRkcmVzc2VzIChkZWZpbmVkIGluIFJGQyAxODMzKSBhcmUgdXNlZCB3aGVuIGNhbGxpbmcgYW4KKyAqIHJwY2JpbmQgZGFlbW9uIHZpYSBwcm90b2NvbCB2ZXJzaW9ucyAzIG9yIDQuLgorICoKKyAqIFJldHVybnMgLTEgaWYgdW5zdWNjZXNmdWw7IG90aGVyd2lzZSBhIGRlY29kZWQgcG9ydCBudW1iZXIgKHBvc3NpYmx5IDApCisgKiBpcyByZXR1cm5lZC4KKyAqLworaW50IG5mc191bml2ZXJzYWwycG9ydChjb25zdCBjaGFyICp1YWRkcikKK3sKKwljaGFyICphZGRyc3RyOworCWludCBwb3J0ID0gLTE7CisKKwlhZGRyc3RyID0gc3RyZHVwKHVhZGRyKTsKKwlpZiAoYWRkcnN0ciAhPSBOVUxMKSB7CisJCXBvcnQgPSBuZnNfZ3BfdW5pdmVyc2FsX3BvcnRoZWxwZXIoYWRkcnN0cik7CisJCWZyZWUoYWRkcnN0cik7CisJfQorCXJldHVybiBwb3J0OworfQorCisvKioKKyAqIG5mc19zb2NrYWRkcjJ1bml2ZXJzYWwgLSBjb252ZXJ0IGEgc29ja2FkZHIgdG8gYSAidW5pdmVyc2FsIGFkZHJlc3MiCisgKiBAc2FwOiBwb2ludGVyIHRvIGEgc29ja2V0IGFkZHJlc3MKKyAqCisgKiBVbml2ZXJzYWwgYWRkcmVzc2VzIChkZWZpbmVkIGluIFJGQyAxODMzKSBhcmUgdXNlZCB3aGVuIGNhbGxpbmcgYW4KKyAqIHJwY2JpbmQgZGFlbW9uIHZpYSBwcm90b2NvbCB2ZXJzaW9ucyAzIG9yIDQuLgorICoKKyAqIFJldHVybnMgYSAnXDAnLXRlcm1pbmF0ZWQgc3RyaW5nIGlmIHN1Y2Nlc3NmdWw7IGNhbGxlciBtdXN0IGZyZWUKKyAqIHRoZSByZXR1cm5lZCBzdHJpbmcuICBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZCBhbmQKKyAqIHJwY19jcmVhdGVlcnIuY2Zfc3RhdCBpcyBzZXQgdG8gcmVmbGVjdCB0aGUgZXJyb3IuCisgKgorICogaW5ldF9udG9wKDMpIGlzIHVzZWQgaGVyZSwgc2luY2UgZ2V0bmFtZWluZm8oMykgaXMgbm90IGF2YWlsYWJsZQorICogaW4gc29tZSBlYXJsaWVyIGdsaWJjIHJlbGVhc2VzLCBhbmQgd2UgZG9uJ3QgcmVxdWlyZSBzdXBwb3J0IGZvcgorICogc2NvcGUgSURzIGZvciB1bml2ZXJzYWwgYWRkcmVzc2VzLgorICovCitjaGFyICpuZnNfc29ja2FkZHIydW5pdmVyc2FsKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKXNhcDsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1biA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfdW4gKilzYXA7CisJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopc2FwOworCWNoYXIgYnVmW0lORVQ2X0FERFJTVFJMRU4gKyA4IC8qIGZvciBwb3J0IGluZm9ybWF0aW9uICovXTsKKwl1aW50MTZfdCBwb3J0OworCXNpemVfdCBjb3VudDsKKwljaGFyICpyZXN1bHQ7CisJaW50IGxlbjsKKworCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0xPQ0FMOgorCQlyZXR1cm4gc3RybmR1cChzdW4tPnN1bl9wYXRoLCBzaXplb2Yoc3VuLT5zdW5fcGF0aCkpOworCWNhc2UgQUZfSU5FVDoKKwkJaWYgKGluZXRfbnRvcChBRl9JTkVULCAoY29uc3Qgdm9pZCAqKSZzaW4tPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJYnVmLCAoc29ja2xlbl90KXNpemVvZihidWYpKSA9PSBOVUxMKQorCQkJZ290byBvdXRfZXJyOworCQlwb3J0ID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisJCWJyZWFrOworCWNhc2UgQUZfSU5FVDY6CisJCWlmIChpbmV0X250b3AoQUZfSU5FVDYsIChjb25zdCB2b2lkICopJnNpbjYtPnNpbjZfYWRkciwKKwkJCQkJYnVmLCAoc29ja2xlbl90KXNpemVvZihidWYpKSA9PSBOVUxMKQorCQkJZ290byBvdXRfZXJyOworCQlwb3J0ID0gbnRvaHMoc2luNi0+c2luNl9wb3J0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXRfZXJyOworCX0KKworCWNvdW50ID0gc2l6ZW9mKGJ1ZikgLSBzdHJsZW4oYnVmKTsKKwlsZW4gPSBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgY291bnQsICIuJXUuJXUiLAorCQkJKHVuc2lnbmVkKShwb3J0ID4+IDgpLCAodW5zaWduZWQpKHBvcnQgJiAweGZmKSk7CisJLyogYmVmb3JlIGdsaWJjIDIuMC42LCBzbnByaW50ZigzKSBjb3VsZCByZXR1cm4gLTEgKi8KKwlpZiAobGVuIDwgMCB8fCAoc2l6ZV90KWxlbiA+IGNvdW50KQorCQlnb3RvIG91dF9lcnI7CisKKwlyZXN1bHQgPSBzdHJkdXAoYnVmKTsKKwlpZiAocmVzdWx0ICE9IE5VTEwpCisJCXJldHVybiByZXN1bHQ7CisKK291dF9lcnI6CisJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX04yQVhMQVRFRkFJTFVSRTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFNlbmQgYSBOVUxMIHJlcXVlc3QgdG8gdGhlIGluZGljYXRlZCBSUEMgc2VydmljZS4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIHNlcnZpY2UgcmVzcG9uZGVkOyBvdGhlcndpc2UgMDsKKyAqLworc3RhdGljIGludCBuZnNfZ3BfcGluZyhDTElFTlQgKmNsaWVudCwgc3RydWN0IHRpbWV2YWwgdGltZW91dCkKK3sKKwllbnVtIGNsbnRfc3RhdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBDTE5UX0NBTEwoY2xpZW50LCBOVUxMUFJPQywKKwkJCSAgICh4ZHJwcm9jX3QpeGRyX3ZvaWQsIE5VTEwsCisJCQkgICAoeGRycHJvY190KXhkcl92b2lkLCBOVUxMLAorCQkJICAgdGltZW91dCk7CisKKwlpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKSB7CisJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IHN0YXR1czsKKwkJQ0xOVF9HRVRFUlIoY2xpZW50LCAmcnBjX2NyZWF0ZWVyci5jZl9lcnJvcik7CisJfQorCXJldHVybiAoaW50KShzdGF0dXMgPT0gUlBDX1NVQ0NFU1MpOworfQorCisjaWZkZWYgSEFWRV9MSUJUSVJQQworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcnBjYiBhcmd1bWVudCBmb3IgYSBHRVRBRERSIHJlcXVlc3QuCisgKgorICogUmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwsIGFuZCBjYWxsZXIgbXVzdCBmcmVlIHN0cmluZ3MgcG9pbnRlZAorICogdG8gYnkgcl9uZXRpZCBhbmQgcl9hZGRyOyBvdGhlcndpc2UgMC4KKyAqLworc3RhdGljIGludCBuZnNfZ3BfaW5pdF9ycGNiX3Bhcm1zKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCSAgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sCisJCQkJICBjb25zdCBycGN2ZXJzX3QgdmVyc2lvbiwKKwkJCQkgIGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJCSAgc3RydWN0IHJwY2IgKnBhcm1zKQoreworCWNoYXIgKm5ldGlkLCAqYWRkcjsKKworCW5ldGlkID0gbmZzX2dldF9uZXRpZChzYXAtPnNhX2ZhbWlseSwgcHJvdG9jb2wpOworCWlmIChuZXRpZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWFkZHIgPSBuZnNfc29ja2FkZHIydW5pdmVyc2FsKHNhcCk7CisJaWYgKGFkZHIgPT0gTlVMTCkgeworCQlmcmVlKG5ldGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KHBhcm1zLCAwLCBzaXplb2YoKnBhcm1zKSk7CisJcGFybXMtPnJfcHJvZwk9IHByb2dyYW07CisJcGFybXMtPnJfdmVycwk9IHZlcnNpb247CisJcGFybXMtPnJfbmV0aWQJPSBuZXRpZDsKKwlwYXJtcy0+cl9hZGRyCT0gYWRkcjsKKwlwYXJtcy0+cl9vd25lcgk9ICIiOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19ncF9mcmVlX3JwY2JfcGFybXMoc3RydWN0IHJwY2IgKnBhcm1zKQoreworCWZyZWUocGFybXMtPnJfbmV0aWQpOworCWZyZWUocGFybXMtPnJfYWRkcik7Cit9CisKKy8qCisgKiBUcnkgcnBjYmluZCBHRVRBRERSIHZpYSB2ZXJzaW9uIDQuICBJZiB0aGF0IGZhaWxzLCB0cnkgc2FtZQorICogcmVxdWVzdCB2aWEgdmVyc2lvbiAzLgorICoKKyAqIFJldHVybnMgbm9uLXplcm8gcG9ydCBudW1iZXIgb24gc3VjY2Vzczsgb3RoZXJ3aXNlIHJldHVybnMKKyAqIHplcm8uICBycGNjcmVhdGVlcnIgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBuZnNfZ3BfcnBjYl9nZXRhZGRyKENMSUVOVCAqY2xpZW50LAorCQkJCQkgIHN0cnVjdCBycGNiICpwYXJtcywKKwkJCQkJICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0KQoreworCXJwY3ZlcnNfdCBycGNiX3ZlcnNpb247CisJc3RydWN0IHJwY19lcnIgcnBjZXJyOworCWludCBwb3J0ID0gMDsKKworCWZvciAocnBjYl92ZXJzaW9uID0gUlBDQlZFUlNfNDsKKwkgICAgIHJwY2JfdmVyc2lvbiA+PSBSUENCVkVSU18zOworCSAgICAgcnBjYl92ZXJzaW9uLS0pIHsKKwkJZW51bSBjbG50X3N0YXQgc3RhdHVzOworCQljaGFyICp1YWRkciA9IE5VTEw7CisKKwkJQ0xOVF9DT05UUk9MKGNsaWVudCwgQ0xTRVRfVkVSUywgKHZvaWQgKikmcnBjYl92ZXJzaW9uKTsKKwkJc3RhdHVzID0gQ0xOVF9DQUxMKGNsaWVudCwgKHJwY3Byb2NfdClSUENCUFJPQ19HRVRBRERSLAorCQkJCSAgICh4ZHJwcm9jX3QpeGRyX3JwY2IsICh2b2lkICopcGFybXMsCisJCQkJICAgKHhkcnByb2NfdCl4ZHJfd3JhcHN0cmluZywgKHZvaWQgKikmdWFkZHIsCisJCQkJICAgdGltZW91dCk7CisKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSBSUENfU1VDQ0VTUzoKKwkJCWlmICgodWFkZHIgPT0gTlVMTCkgfHwgKHVhZGRyWzBdID09ICdcMCcpKSB7CisJCQkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1BST0dOT1RSRUdJU1RFUkVEOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlwb3J0ID0gbmZzX3VuaXZlcnNhbDJwb3J0KHVhZGRyKTsKKwkJCXhkcl9mcmVlKCh4ZHJwcm9jX3QpeGRyX3dyYXBzdHJpbmcsIChjaGFyICopJnVhZGRyKTsKKwkJCWlmIChwb3J0ID09IC0xKSB7CisJCQkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX04yQVhMQVRFRkFJTFVSRTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJldHVybiAodW5zaWduZWQgc2hvcnQpcG9ydDsKKwkJY2FzZSBSUENfUFJPR1ZFUlNNSVNNQVRDSDoKKwkJCWNsbnRfZ2V0ZXJyKGNsaWVudCwgJnJwY2Vycik7CisJCQlpZiAocnBjZXJyLnJlX3ZlcnMubG93ID4gUlBDQlZFUlM0KQorCQkJCXJldHVybiAwOworCQkJY29udGludWU7CisJCWNhc2UgUlBDX1BST0NVTkFWQUlMOgorCQljYXNlIFJQQ19QUk9HVU5BVkFJTDoKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJLyogTW9zdCBsaWtlbHkgUlBDX1RJTUVET1VUIG9yIFJQQ19DQU5UUkVDViAqLworCQkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gc3RhdHVzOworCQkJY2xudF9nZXRlcnIoY2xpZW50LCAmcnBjX2NyZWF0ZWVyci5jZl9lcnJvcik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJfQorCisJaWYgKHBvcnQgPT0gMCkgeworCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfUFJPR05PVFJFR0lTVEVSRUQ7CisJCWNsbnRfZ2V0ZXJyKGNsaWVudCwgJnJwY19jcmVhdGVlcnIuY2ZfZXJyb3IpOworCX0KKwlyZXR1cm4gcG9ydDsKK30KKworI2VuZGlmCS8qIEhBVkVfTElCVElSUEMgKi8KKworLyoKKyAqIFRyeSBHRVRQT1JUIHJlcXVlc3QgdmlhIHJwY2JpbmQgdmVyc2lvbiAyLgorICoKKyAqIFJldHVybnMgbm9uLXplcm8gcG9ydCBudW1iZXIgb24gc3VjY2Vzczsgb3RoZXJ3aXNlIHJldHVybnMKKyAqIHplcm8uICBycGNjcmVhdGVlcnIgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5mc19ncF9wbWFwX2dldHBvcnQoQ0xJRU5UICpjbGllbnQsCisJCQkJCSBzdHJ1Y3QgcG1hcCAqcGFybXMsCisJCQkJCSBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0KQoreworCWVudW0gY2xudF9zdGF0IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisKKwlzdGF0dXMgPSBDTE5UX0NBTEwoY2xpZW50LCAocnBjcHJvY190KVBNQVBQUk9DX0dFVFBPUlQsCisJCQkgICAoeGRycHJvY190KXhkcl9wbWFwLCAodm9pZCAqKXBhcm1zLAorCQkJICAgKHhkcnByb2NfdCl4ZHJfdV9sb25nLCAodm9pZCAqKSZwb3J0LAorCQkJICAgdGltZW91dCk7CisKKwlpZiAoc3RhdHVzICE9IFJQQ19TVUNDRVNTKSB7CisJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IHN0YXR1czsKKwkJQ0xOVF9HRVRFUlIoY2xpZW50LCAmcnBjX2NyZWF0ZWVyci5jZl9lcnJvcik7CisJCXBvcnQgPSAwOworCX0gZWxzZSBpZiAocG9ydCA9PSAwKQorCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfUFJPR05PVFJFR0lTVEVSRUQ7CisKKwlyZXR1cm4gcG9ydDsKK30KKworI2lmZGVmIEhBVkVfTElCVElSUEMKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5mc19ncF9nZXRwb3J0X3JwY2IoQ0xJRU5UICpjbGllbnQsCisJCQkJCSAgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJCSAgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sCisJCQkJCSAgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkJCSAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkJCSAgc3RydWN0IHRpbWV2YWwgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBwb3J0ID0gMDsKKwlzdHJ1Y3QgcnBjYiBwYXJtczsKKworCWlmIChuZnNfZ3BfaW5pdF9ycGNiX3Bhcm1zKHNhcCwgcHJvZ3JhbSwgdmVyc2lvbiwKKwkJCQkJcHJvdG9jb2wsICZwYXJtcykgIT0gMCkgeworCQlwb3J0ID0gbmZzX2dwX3JwY2JfZ2V0YWRkcihjbGllbnQsICZwYXJtcywgdGltZW91dCk7CisJCW5mc19ncF9mcmVlX3JwY2JfcGFybXMoJnBhcm1zKTsKKwl9CisKKwlyZXR1cm4gcG9ydDsKK30KKworI2VuZGlmCS8qIEhBVkVfTElCVElSUEMgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmZzX2dwX2dldHBvcnRfcG1hcChDTElFTlQgKmNsaWVudCwKKwkJCQkJIGNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJCQkgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkJCSBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbCwKKwkJCQkJIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQpCit7CisJc3RydWN0IHBtYXAgcGFybXMgPSB7CisJCS5wbV9wcm9nCT0gcHJvZ3JhbSwKKwkJLnBtX3ZlcnMJPSB2ZXJzaW9uLAorCQkucG1fcHJvdAk9IHByb3RvY29sLAorCX07CisJcnBjdmVyc190IHBtYXBfdmVyc2lvbiA9IFBNQVBWRVJTOworCisJQ0xOVF9DT05UUk9MKGNsaWVudCwgQ0xTRVRfVkVSUywgKHZvaWQgKikmcG1hcF92ZXJzaW9uKTsKKwlyZXR1cm4gbmZzX2dwX3BtYXBfZ2V0cG9ydChjbGllbnQsICZwYXJtcywgdGltZW91dCk7Cit9CisKKy8qCisgKiBUcnkgYW4gQUZfSU5FVDYgcmVxdWVzdCB2aWEgcnBjYmluZCB2NC92MzsgdHJ5IGFuIEFGX0lORVQKKyAqIHJlcXVlc3QgdmlhIHJwY2JpbmQgdjIuCisgKgorICogUmV0dXJucyBub24temVybyBwb3J0IG51bWJlciBvbiBzdWNjZXNzOyBvdGhlcndpc2UgcmV0dXJucworICogemVyby4gIHJwY2NyZWF0ZWVyciBpcyBzZXQgdG8gcmVmbGVjdCB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvci4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5mc19ncF9nZXRwb3J0KENMSUVOVCAqY2xpZW50LAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJICAgICBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwKKwkJCQkgICAgIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsCisJCQkJICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0KQoreworCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIG5mc19ncF9nZXRwb3J0X3JwY2IoY2xpZW50LCBzYXAsIHByb2dyYW0sCisJCQkJCQl2ZXJzaW9uLCBwcm90b2NvbCwgdGltZW91dCk7CisjZW5kaWYJLyogSEFWRV9MSUJUSVJQQyAqLworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIG5mc19ncF9nZXRwb3J0X3BtYXAoY2xpZW50LCBwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJCXByb3RvY29sLCB0aW1lb3V0KTsKKwl9CisKKwlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfVU5LTk9XTkFERFI7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmZzX3JwY19waW5nIC0gRGV0ZXJtaW5lIGlmIFJQQyBzZXJ2aWNlIGlzIHJlc3BvbmRpbmcgdG8gcmVxdWVzdHMKKyAqIEBzYXA6IHBvaW50ZXIgdG8gYWRkcmVzcyBvZiBzZXJ2ZXIgdG8gcXVlcnkgKHBvcnQgaXMgYWxyZWFkeSBmaWxsZWQgaW4pCisgKiBAc2FsZW46IGxlbmd0aCBvZiBzZXJ2ZXIgYWRkcmVzcworICogQHByb2dyYW06IHJlcXVlc3RlZCBSUEMgcHJvZ3JhbSBudW1iZXIKKyAqIEB2ZXJzaW9uOiByZXF1ZXN0ZWQgUlBDIHZlcnNpb24gbnVtYmVyCisgKiBAcHJvdG9jb2w6IHJlcXVlc3RlZCBJUFBST1RPXyB2YWx1ZSBvZiB0cmFuc3BvcnQgcHJvdG9jb2wKKyAqIEB0aW1lb3V0OiBwb2ludGVyIHRvIHJlcXVlc3QgdGltZW91dCAoTlVMTCBtZWFucyB1c2UgZGVmYXVsdCB0aW1lb3V0KQorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgcmVtb3RlIHNlcnZpY2UgcmVzcG9uZGVkIHdpdGhvdXQgYW4gZXJyb3I7IG90aGVyd2lzZQorICogemVyby4KKyAqLworaW50IG5mc19ycGNfcGluZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wsIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQoreworCXVuaW9uIG5mc19zb2NrYWRkciBhZGRyZXNzOworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSAmYWRkcmVzcy5zYTsKKwlDTElFTlQgKmNsaWVudDsKKwlzdHJ1Y3QgdGltZXZhbCB0b3V0ID0geyAtMSwgMCB9OworCWludCByZXN1bHQgPSAwOworCisJaWYgKHRpbWVvdXQgIT0gTlVMTCkKKwkJdG91dCA9ICp0aW1lb3V0OworCisJbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIoKTsKKworCW1lbWNweShzYWRkciwgc2FwLCAoc2l6ZV90KXNhbGVuKTsKKwljbGllbnQgPSBuZnNfZ2V0X3JwY2NsaWVudChzYWRkciwgc2FsZW4sIHByb3RvY29sLAorCQkJCQkJcHJvZ3JhbSwgdmVyc2lvbiwgJnRvdXQpOworCWlmIChjbGllbnQgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBuZnNfZ3BfcGluZyhjbGllbnQsIHRvdXQpOworCQluZnNfZ3BfbWFwX3RjcF9lcnJvcmNvZGVzKHByb3RvY29sKTsKKwkJQ0xOVF9ERVNUUk9ZKGNsaWVudCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBuZnNfZ2V0cG9ydCAtIHF1ZXJ5IHNlcnZlcidzIHJwY2JpbmQgdG8gZ2V0IHBvcnQgbnVtYmVyIGZvciBhbiBSUEMgc2VydmljZQorICogQHNhcDogcG9pbnRlciB0byBhZGRyZXNzIG9mIHNlcnZlciB0byBxdWVyeQorICogQHNhbGVuOiBsZW5ndGggb2Ygc2VydmVyJ3MgYWRkcmVzcworICogQHByb2dyYW06IHJlcXVlc3RlZCBSUEMgcHJvZ3JhbSBudW1iZXIKKyAqIEB2ZXJzaW9uOiByZXF1ZXN0ZWQgUlBDIHZlcnNpb24gbnVtYmVyCisgKiBAcHJvdG9jb2w6IElQUFJPVE9fIHZhbHVlIG9mIHJlcXVlc3RlZCB0cmFuc3BvcnQgcHJvdG9jb2wKKyAqCisgKiBVc2VzIGFueSBhY2NlcHRhYmxlIHJwY2JpbmQgdmVyc2lvbiB0byBkaXNjb3ZlciB0aGUgcG9ydCBudW1iZXIgZm9yIHRoZQorICogUlBDIHNlcnZpY2UgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBbcHJvZ3JhbSwgdmVyc2lvbiwgdHJhbnNwb3J0XSB0dXBsZS4KKyAqIFVzZXMgYSBxdWljayB0aW1lb3V0IGFuZCBhbiBlcGhlbWVyYWwgc291cmNlIHBvcnQuICBTdXBwb3J0cyBBRl9JTkVUIGFuZAorICogQUZfSU5FVDYgc2VydmVyIGFkZHJlc3Nlcy4KKyAqCisgKiBSZXR1cm5zIGEgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBSUEMKKyAqIHNlcnZpY2UgYWR2ZXJ0aXNlZCBieSB0aGUgc2VydmVyIChpbiBob3N0IGJ5dGUgb3JkZXIpLCBvciB6ZXJvIGlmIHRoZQorICogc2VydmljZSBpcyBub3QgYWR2ZXJ0aXNlZCBvciB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIHF1ZXJ5aW5nIHRoZSBzZXJ2ZXIncworICogcnBjYmluZCBkYWVtb24uICBycGNjcmVhdGVlcnIgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIHVuZGVybHlpbmcgY2F1c2Ugb2YKKyAqIHRoZSBlcnJvci4KKyAqCisgKiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIHdheXMgdG8gY2hvb3NlIHdoaWNoIHRyYW5zcG9ydCBhbmQgcnBjYmluZCB2ZXJzaW9ucworICogdG8gdXNlLiAgV2UgY2hvc2UgdG8gY29uc2VydmUgbG9jYWwgcmVzb3VyY2VzIGFuZCB0cnkgdG8gYXZvaWQgaW5jdXJyaW5nCisgKiB0aW1lb3V0cy4KKyAqCisgKiBUcmFuc3BvcnQKKyAqIFRvIHByb3ZpZGUgcnVkaW1lbnRhcnkgc3VwcG9ydCBmb3IgdHJhdmVyc2luZyBmaXJld2FsbHMsIHF1ZXJ5IHRoZSByZW1vdGUKKyAqIHVzaW5nIHRoZSBzYW1lIHRyYW5zcG9ydCBhcyB0aGUgcmVxdWVzdGVkIHNlcnZpY2UuICBUaGlzIHByb3ZpZGVzIHNvbWUKKyAqIGd1YXJhbnRlZSB0aGF0IHRoZSByZXF1ZXN0ZWQgdHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBiZXR3ZWVuIHRoaXMgY2xpZW50CisgKiBhbmQgdGhlIHNlcnZlciwgYW5kIGlmIHRoZSBjYWxsZXIgc3BlY2lmaWNhbGx5IHJlcXVlc3RzIFRDUCwgZm9yIGV4YW1wbGUsCisgKiB0aGlzIG1heSBiZSBiZWN1YXNlIGEgZmlyZXdhbGwgaXMgaW4gcGxhY2UgdGhhdCBibG9ja3MgVURQIHRyYWZmaWMuICBXZQorICogY291bGQgdHJ5IGJvdGgsIGJ1dCB0aGF0IGNvdWxkIGludm9sdmUgYSBsZW5ndGh5IHRpbWVvdXQgaW4gc2V2ZXJhbCBjYXNlcywKKyAqIGFuZCB3b3VsZCBvZnRlbiBjb25zdW1lIGFuIGV4dHJhIGVwaGVtZXJhbCBwb3J0LgorICoKKyAqIFJwY2JpbmQgdmVyc2lvbgorICogVG8gYXZvaWQgdXNpbmcgdXAgdG9vIG1hbnkgZXBoZW1lcmFsIHBvcnRzLCBBRl9JTkVUIHF1ZXJpZXMgdXNlIHRyaWVkLWFuZC0KKyAqIHRydWUgcnBjYmluZHYyLCBhbmQgZG9uJ3QgdHJ5IHRoZSBuZXdlciB2ZXJzaW9uczsgYW5kIEFGX0lORVQ2IHF1ZXJpZXMgdXNlCisgKiBycGNiaW5kdjQsIHRoZW4gcnBjYmluZHYzIG9uIHRoZSBzYW1lIHNvY2tldC4gIFRoZSBuZXdlciBycGNiaW5kIHByb3RvY29sCisgKiB2ZXJzaW9ucyBjYW4gYWRlcXVhdGVseSBkZXRlY3QgaWYgYSByZW1vdGUgUlBDIHNlcnZpY2UgZG9lcyBub3Qgc3VwcG9ydAorICogQUZfSU5FVDYgYXQgYWxsLiAgVGhlIHJwY2JpbmQgc29ja2V0IGlzIHJlLXVzZWQgaW4gYW4gYXR0ZW1wdCB0byBrZWVwIHRoZQorICogb3ZlcmFsbCBudW1iZXIgb2YgY29uc3VtZWQgZXBoZW1lcmFsIHBvcnRzIGxvdy4KKyAqLwordW5zaWduZWQgc2hvcnQgbmZzX2dldHBvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkgICBjb25zdCBzb2NrbGVuX3Qgc2FsZW4sCisJCQkgICBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwKKwkJCSAgIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJICAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wpCit7CisJdW5pb24gbmZzX3NvY2thZGRyIGFkZHJlc3M7CisJc3RydWN0IHNvY2thZGRyICpzYWRkciA9ICZhZGRyZXNzLnNhOworCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQgPSB7IC0xLCAwIH07CisJdW5zaWduZWQgc2hvcnQgcG9ydCA9IDA7CisJQ0xJRU5UICpjbGllbnQ7CisKKwluZnNfY2xlYXJfcnBjX2NyZWF0ZWVycigpOworCisJbWVtY3B5KHNhZGRyLCBzYXAsIChzaXplX3Qpc2FsZW4pOworCWNsaWVudCA9IG5mc19ncF9nZXRfcnBjYmNsaWVudChzYWRkciwgc2FsZW4sIHByb3RvY29sLAorCQkJCQkJZGVmYXVsdF9ycGNiX3ZlcnNpb24sICZ0aW1lb3V0KTsKKwlpZiAoY2xpZW50ICE9IE5VTEwpIHsKKwkJcG9ydCA9IG5mc19ncF9nZXRwb3J0KGNsaWVudCwgc2FkZHIsIHByb2dyYW0sCisJCQkJCXZlcnNpb24sIHByb3RvY29sLCB0aW1lb3V0KTsKKwkJQ0xOVF9ERVNUUk9ZKGNsaWVudCk7CisJfQorCisJcmV0dXJuIHBvcnQ7Cit9CisKKy8qKgorICogbmZzX2dldHBvcnRfcGluZyAtIHF1ZXJ5IHNlcnZlcidzIHJwY2JpbmQgYW5kIGRvIFJQQyBwaW5nIHRvIHZlcmlmeSByZXN1bHQKKyAqIEBzYXA6IElOOiBwb2ludGVyIHRvIGFkZHJlc3Mgb2Ygc2VydmVyIHRvIHF1ZXJ5OworICoJIE9VVDogcG9pbnRlciB0byB1cGRhdGVkIGFkZHJlc3MKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNlcnZlcidzIGFkZHJlc3MKKyAqIEBwcm9ncmFtOiByZXF1ZXN0ZWQgUlBDIHByb2dyYW0gbnVtYmVyCisgKiBAdmVyc2lvbjogcmVxdWVzdGVkIFJQQyB2ZXJzaW9uIG51bWJlcgorICogQHByb3RvY29sOiBJUFBST1RPXyB2YWx1ZSBvZiByZXF1ZXN0ZWQgdHJhbnNwb3J0IHByb3RvY29sCisgKgorICogVXNlcyBhbnkgYWNjZXB0YWJsZSBycGNiaW5kIHZlcnNpb24gdG8gZGlzY292ZXIgdGhlIHBvcnQgbnVtYmVyIGZvciB0aGUKKyAqIFJQQyBzZXJ2aWNlIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gW3Byb2dyYW0sIHZlcnNpb24sIHRyYW5zcG9ydF0gdHVwbGUuCisgKiBVc2VzIGEgcXVpY2sgdGltZW91dCBhbmQgYW4gZXBoZW1lcmFsIHNvdXJjZSBwb3J0LiAgU3VwcG9ydHMgQUZfSU5FVCBhbmQKKyAqIEFGX0lORVQ2IHNlcnZlciBhZGRyZXNzZXMuCisgKgorICogUmV0dXJucyBhIDEgYW5kIHNldHMgdGhlIHBvcnQgbnVtYmVyIGluIHRoZSBwYXNzZWQtaW4gc2VydmVyIGFkZHJlc3MKKyAqIGlmIGJvdGggdGhlIHF1ZXJ5IGFuZCB0aGUgcGluZyB3ZXJlIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSB6ZXJvLgorICogcnBjY3JlYXRlZXJyIGlzIHNldCB0byByZWZsZWN0IHRoZSB1bmRlcmx5aW5nIGNhdXNlIG9mIHRoZSBlcnJvci4KKyAqLworaW50IG5mc19nZXRwb3J0X3Bpbmcoc3RydWN0IHNvY2thZGRyICpzYXAsIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJICAgICBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCSAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2wpCit7CisJc3RydWN0IHRpbWV2YWwgdGltZW91dCA9IHsgLTEsIDAgfTsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0ID0gMDsKKwlDTElFTlQgKmNsaWVudDsKKwlpbnQgcmVzdWx0ID0gMDsKKwkKKwluZnNfY2xlYXJfcnBjX2NyZWF0ZWVycigpOworCisJY2xpZW50ID0gbmZzX2dwX2dldF9ycGNiY2xpZW50KHNhcCwgc2FsZW4sIHByb3RvY29sLAorCQkJCQkJZGVmYXVsdF9ycGNiX3ZlcnNpb24sICZ0aW1lb3V0KTsKKwlpZiAoY2xpZW50ICE9IE5VTEwpIHsKKwkJcG9ydCA9IG5mc19ncF9nZXRwb3J0KGNsaWVudCwgc2FwLCBwcm9ncmFtLAorCQkJCQl2ZXJzaW9uLCBwcm90b2NvbCwgdGltZW91dCk7CisJCUNMTlRfREVTVFJPWShjbGllbnQpOworCQljbGllbnQgPSBOVUxMOworCX0KKworCWlmIChwb3J0ICE9IDApIHsKKwkJdW5pb24gbmZzX3NvY2thZGRyIGFkZHJlc3M7CisJCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSAmYWRkcmVzcy5zYTsKKworCQltZW1jcHkoc2FkZHIsIHNhcCwgKHNpemVfdClzYWxlbik7CisJCW5mc19zZXRfcG9ydChzYWRkciwgcG9ydCk7CisKKwkJbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIoKTsKKworCQljbGllbnQgPSBuZnNfZ2V0X3JwY2NsaWVudChzYWRkciwgc2FsZW4sIHByb3RvY29sLAorCQkJCQkJcHJvZ3JhbSwgdmVyc2lvbiwgJnRpbWVvdXQpOworCQlpZiAoY2xpZW50ICE9IE5VTEwpIHsKKwkJCXJlc3VsdCA9IG5mc19ncF9waW5nKGNsaWVudCwgdGltZW91dCk7CisJCQluZnNfZ3BfbWFwX3RjcF9lcnJvcmNvZGVzKHByb3RvY29sKTsKKwkJCUNMTlRfREVTVFJPWShjbGllbnQpOworCQl9CisJfQorCisJaWYgKHJlc3VsdCkKKwkJbmZzX3NldF9wb3J0KHNhcCwgcG9ydCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG5mc19nZXRsb2NhbHBvcnQgLSBxdWVyeSBsb2NhbCBycGNiaW5kIHRvIGdldCBwb3J0IG51bWJlciBmb3IgYW4gUlBDIHNlcnZpY2UKKyAqIEBwcm9ncmFtOiByZXF1ZXN0ZWQgUlBDIHByb2dyYW0gbnVtYmVyCisgKiBAdmVyc2lvbjogcmVxdWVzdGVkIFJQQyB2ZXJzaW9uIG51bWJlcgorICogQHByb3RvY29sOiBJUFBST1RPXyB2YWx1ZSBvZiByZXF1ZXN0ZWQgdHJhbnNwb3J0IHByb3RvY29sCisgKgorICogVXNlcyBhbnkgYWNjZXB0YWJsZSBycGNiaW5kIHZlcnNpb24gdG8gZGlzY292ZXIgdGhlIHBvcnQgbnVtYmVyIGZvciB0aGUKKyAqIFJQQyBzZXJ2aWNlIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gW3Byb2dyYW0sIHZlcnNpb24sIHRyYW5zcG9ydF0gdHVwbGUuCisgKiBVc2VzIGEgcXVpY2sgdGltZW91dCBhbmQgYW4gZXBoZW1lcmFsIHNvdXJjZSBwb3J0LiAgU3VwcG9ydHMgQUZfSU5FVCBhbmQKKyAqIEFGX0lORVQ2IGxvY2FsIGFkZHJlc3Nlcy4KKyAqCisgKiBSZXR1cm5zIGEgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBSUEMKKyAqIHNlcnZpY2UgYWR2ZXJ0aXNlZCBieSB0aGUgc2VydmVyIChpbiBob3N0IGJ5dGUgb3JkZXIpLCBvciB6ZXJvIGlmIHRoZQorICogc2VydmljZSBpcyBub3QgYWR2ZXJ0aXNlZCBvciB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIHF1ZXJ5aW5nIHRoZSBzZXJ2ZXIncworICogcnBjYmluZCBkYWVtb24uICBycGNjcmVhdGVlcnIgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIHVuZGVybHlpbmcgY2F1c2Ugb2YKKyAqIHRoZSBlcnJvci4KKyAqCisgKiBUcnkgYW4gQUZfTE9DQUwgY29ubmVjdGlvbiBmaXJzdC4gIFRoZSBycGNiaW5kIGRhZW1vbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQKKyAqIGxpc3RlbiBvbiBBRl9MT0NBTC4KKyAqCisgKiBJZiB0aGF0IGRvZXNuJ3Qgd29yayAoZm9yIGV4YW1wbGUsIGlmIHBvcnRtYXBwZXIgaXMgcnVubmluZywgb3IgcnBjYmluZAorICogaXNuJ3QgbGlzdGVuaW5nIG9uIC92YXIvcnVuL3JwY2JpbmQuc29jayksIHNlbmQgYSBxdWVyeSB2aWEgVURQIHRvIGxvY2FsaG9zdAorICogKFVEUCBkb2Vzbid0IGxlYXZlIGEgc29ja2V0IGluIFRJTUVfV0FJVCwgYW5kIHRoZSB0aW1lb3V0IGlzIGEgcmVsYXRpdmVseQorICogc2hvcnQgMyBzZWNvbmRzKS4KKyAqLwordW5zaWduZWQgc2hvcnQgbmZzX2dldGxvY2FscG9ydChjb25zdCBycGNwcm90X3QgcHJvZ3JhbSwKKwkJCQljb25zdCBycGN2ZXJzX3QgdmVyc2lvbiwKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbCkKK3sKKwl1bmlvbiBuZnNfc29ja2FkZHIgYWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmxiX2FkZHIgPSAmYWRkcmVzcy5zYTsKKwlzb2NrbGVuX3QgbGJfbGVuID0gc2l6ZW9mKCpsYl9hZGRyKTsKKwl1bnNpZ25lZCBzaG9ydCBwb3J0ID0gMDsKKworI2lmZGVmIE5GU19HUF9MT0NBTAorCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl91biBzdW4gPSB7CisJCS5zdW5fZmFtaWx5CT0gQUZfTE9DQUwsCisJCS5zdW5fcGF0aAk9IF9QQVRIX1JQQ0JJTkRTT0NLLAorCX07CisJY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJnN1bjsKKwljb25zdCBzb2NrbGVuX3Qgc2FsZW4gPSBTVU5fTEVOKCZzdW4pOworCUNMSUVOVCAqY2xpZW50OworCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQgPSB7IC0xLCAwIH07CisKKwluZnNfY2xlYXJfcnBjX2NyZWF0ZWVycigpOworCisJY2xpZW50ID0gbmZzX2dwX2dldF9ycGNiY2xpZW50KHNhcCwgc2FsZW4sIDAsIFJQQ0JWRVJTXzQsICZ0aW1lb3V0KTsKKwlpZiAoY2xpZW50ICE9IE5VTEwpIHsKKwkJc3RydWN0IHJwY2IgcGFybXM7CisKKwkJaWYgKG5mc19ncF9pbml0X3JwY2JfcGFybXMoc2FwLCBwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJcHJvdG9jb2wsICZwYXJtcykgIT0gMCkgeworCQkJcG9ydCA9IG5mc19ncF9ycGNiX2dldGFkZHIoY2xpZW50LCAmcGFybXMsIHRpbWVvdXQpOworCQkJbmZzX2dwX2ZyZWVfcnBjYl9wYXJtcygmcGFybXMpOworCQl9CisJCUNMTlRfREVTVFJPWShjbGllbnQpOworCX0KKyNlbmRpZgkvKiBORlNfR1BfTE9DQUwgKi8KKworCWlmIChwb3J0ID09IDApIHsKKwkJbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIoKTsKKworCQlpZiAobmZzX2dwX2xvb3BiYWNrX2FkZHJlc3MobGJfYWRkciwgJmxiX2xlbikpIHsKKwkJCXBvcnQgPSBuZnNfZ2V0cG9ydChsYl9hZGRyLCBsYl9sZW4sCisJCQkJCQlwcm9ncmFtLCB2ZXJzaW9uLCBwcm90b2NvbCk7CisJCX0gZWxzZQorCQkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1VOS05PV05BRERSOworCX0KKworCXJldHVybiBwb3J0OworfQorCisvKioKKyAqIG5mc19ycGNiX2dldGFkZHIgLSBxdWVyeSBycGNiaW5kIHZpYSBycGNiaW5kIHZlcnNpb25zIDQgYW5kIDMKKyAqIEBzYXA6IHBvaW50ZXIgdG8gYWRkcmVzcyBvZiBzZXJ2ZXIgdG8gcXVlcnkKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNlcnZlciBhZGRyZXNzCisgKiBAdHJhbnNwb3J0OiB0cmFuc3BvcnQgcHJvdG9jb2wgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAqIEBhZGRyOiBwb2ludGVyIHRvIHJfYWRkciBhZGRyZXNzCisgKiBAcHJvZ3JhbTogcmVxdWVzdGVkIFJQQyBwcm9ncmFtIG51bWJlcgorICogQHZlcnNpb246IHJlcXVlc3RlZCBSUEMgdmVyc2lvbiBudW1iZXIKKyAqIEBwcm90b2NvbDogcmVxdWVzdGVkIElQUFJPVE9fIHZhbHVlIG9mIHRyYW5zcG9ydCBwcm90b2NvbAorICogQHRpbWVvdXQ6IHBvaW50ZXIgdG8gcmVxdWVzdCB0aW1lb3V0IChOVUxMIG1lYW5zIHVzZSBkZWZhdWx0IHRpbWVvdXQpCisgKgorICogUmV0dXJucyBhIHBvc2l0aXZlIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBwb3J0IG51bWJlciBvZiB0aGUgUlBDCisgKiBzZXJ2aWNlIGFkdmVydGlzZWQgYnkgdGhlIHNlcnZlciAoaW4gaG9zdCBieXRlIG9yZGVyKSwgb3IgemVybyBpZiB0aGUKKyAqIHNlcnZpY2UgaXMgbm90IGFkdmVydGlzZWQgb3IgdGhlcmUgd2FzIHNvbWUgcHJvYmxlbSBxdWVyeWluZyB0aGUKKyAqIHNlcnZlcidzIHJwY2JpbmQgZGFlbW9uLiAgcnBjY3JlYXRlZXJyIGlzIHNldCB0byByZWZsZWN0IHRoZQorICogdW5kZXJseWluZyBjYXVzZSBvZiB0aGUgZXJyb3IuCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgdG8gbmZzX3BtYXBfZ2V0cG9ydCgpLAorICogYnV0IHBlcmZvcm1zIHRoZSBycGNiaW5kIGxvb2t1cCB2aWEgcnBjYmluZCB2ZXJzaW9uIDQuICBJZiB0aGUgc2VydmVyCisgKiBkb2Vzbid0IHN1cHBvcnQgcnBjYmluZCB2ZXJzaW9uIDQsIGl0IHdpbGwgcmV0cnkgd2l0aCB2ZXJzaW9uIDMuCisgKiBUaGUgR0VUQUREUiBwcm9jZWR1cmUgaXMgZXhhY3RseSB0aGUgc2FtZSBpbiB0aGVzZSB0d28gdmVyc2lvbnMgb2YKKyAqIHRoZSBycGNiaW5kIHByb3RvY29sLCBzbyB0aGUgc29ja2V0LCBSUEMgY2xpZW50LCBhbmQgYXJndW1lbnRzIGFyZQorICogcmUtdXNlZCB3aGVuIHJldHJ5aW5nLCBzYXZpbmcgZXBoZW1lcmFsIHBvcnQgc3BhY2UuCisgKgorICogVGhlc2UgUlBDIHByb2NlZHVyZXMgdGFrZSBhIHVuaXZlcnNhbCBhZGRyZXNzIGFzIGFuIGFyZ3VtZW50LCBzbyB0aGUKKyAqIHF1ZXJ5IHdpbGwgZmFpbCBpZiB0aGUgcmVtb3RlIHJwY2JpbmQgZGFlbW9uIGRvZXNuJ3QgZmluZCBhbiBlbnRyeQorICogd2l0aCBhIG1hdGNoaW5nIGFkZHJlc3MuICBBIG1hdGNoaW5nIGFkZHJlc3MgaW5jbHVkZXMgYW4gQU5ZQUREUgorICogYWRkcmVzcyBvZiB0aGUgc2FtZSBhZGRyZXNzIGZhbWlseS4gIEluIHRoaXMgd2F5IGFuIFJQQyBzZXJ2ZXIgY2FuCisgKiBhZHZlcnRpc2UgdmlhIHJwY2JpbmQgdGhhdCBpdCBkb2VzIG5vdCBzdXBwb3J0IEFGX0lORVQ2LgorICovCisjaWZkZWYgSEFWRV9MSUJUSVJQQworCit1bnNpZ25lZCBzaG9ydCBuZnNfcnBjYl9nZXRhZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCWNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCQljb25zdCB1bnNpZ25lZCBzaG9ydCB0cmFuc3BvcnQsCisJCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJCWNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJCWNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCWNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJCWNvbnN0IHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQoreworCXVuaW9uIG5mc19zb2NrYWRkciBhZGRyZXNzOworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSAmYWRkcmVzcy5zYTsKKwlDTElFTlQgKmNsaWVudDsKKwlzdHJ1Y3QgcnBjYiBwYXJtczsKKwlzdHJ1Y3QgdGltZXZhbCB0b3V0ID0geyAtMSwgMCB9OworCXVuc2lnbmVkIHNob3J0IHBvcnQgPSAwOworCisJaWYgKHRpbWVvdXQgIT0gTlVMTCkKKwkJdG91dCA9ICp0aW1lb3V0OworCisJbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIoKTsKKworCW1lbWNweShzYWRkciwgc2FwLCAoc2l6ZV90KXNhbGVuKTsKKwljbGllbnQgPSBuZnNfZ3BfZ2V0X3JwY2JjbGllbnQoc2FkZHIsIHNhbGVuLCB0cmFuc3BvcnQsCisJCQkJCQkJUlBDQlZFUlNfNCwgJnRvdXQpOworCWlmIChjbGllbnQgIT0gTlVMTCkgeworCQlpZiAobmZzX2dwX2luaXRfcnBjYl9wYXJtcyhhZGRyLCBwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJcHJvdG9jb2wsICZwYXJtcykgIT0gMCkgeworCQkJcG9ydCA9IG5mc19ncF9ycGNiX2dldGFkZHIoY2xpZW50LCAmcGFybXMsIHRvdXQpOworCQkJbmZzX2dwX2ZyZWVfcnBjYl9wYXJtcygmcGFybXMpOworCQl9CisJCUNMTlRfREVTVFJPWShjbGllbnQpOworCX0KKworCXJldHVybiBwb3J0OworfQorCisjZWxzZQkvKiAhSEFWRV9MSUJUSVJQQyAqLworCit1bnNpZ25lZCBzaG9ydCBuZnNfcnBjYl9nZXRhZGRyKF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCQlfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBjb25zdCB1bnNpZ25lZCBzaG9ydCB0cmFuc3BvcnQsCisJCQkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyLAorCQkJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLAorCQkJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJCV9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQoreworCW5mc19jbGVhcl9ycGNfY3JlYXRlZXJyKCk7CisKKwlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfVU5LTk9XTkFERFI7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiAhSEFWRV9MSUJUSVJQQyAqLworCisvKioKKyAqIG5mc19wbWFwX2dldHBvcnQgLSBxdWVyeSBycGNiaW5kIHZpYSB0aGUgcG9ydG1hcCBwcm90b2NvbCAocnBjYmluZHYyKQorICogQHNpbjogcG9pbnRlciB0byBBRl9JTkVUIGFkZHJlc3Mgb2Ygc2VydmVyIHRvIHF1ZXJ5CisgKiBAdHJhbnNwb3J0OiB0cmFuc3BvcnQgcHJvdG9jb2wgdG8gdXNlIGZvciB0aGUgcXVlcnkKKyAqIEBwcm9ncmFtOiByZXF1ZXN0ZWQgUlBDIHByb2dyYW0gbnVtYmVyCisgKiBAdmVyc2lvbjogcmVxdWVzdGVkIFJQQyB2ZXJzaW9uIG51bWJlcgorICogQHByb3RvY29sOiByZXF1ZXN0ZWQgSVBQUk9UT18gdmFsdWUgb2YgdHJhbnNwb3J0IHByb3RvY29sCisgKiBAdGltZW91dDogcG9pbnRlciB0byByZXF1ZXN0IHRpbWVvdXQgKE5VTEwgbWVhbnMgdXNlIGRlZmF1bHQgdGltZW91dCkKKyAqCisgKiBSZXR1cm5zIGEgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIHBvcnQgbnVtYmVyIG9mIHRoZSBSUEMgc2VydmljZQorICogYWR2ZXJ0aXNlZCBieSB0aGUgc2VydmVyIChpbiBob3N0IGJ5dGUgb3JkZXIpLCBvciB6ZXJvIGlmIHRoZSBzZXJ2aWNlIGlzCisgKiBub3QgYWR2ZXJ0aXNlZCBvciB0aGVyZSB3YXMgc29tZSBwcm9ibGVtIHF1ZXJ5aW5nIHRoZSBzZXJ2ZXIncyBycGNiaW5kCisgKiBkYWVtb24uICBycGNjcmVhdGVlcnIgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIHVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGVycm9yLgorICoKKyAqIG5mc19wbWFwX2dldHBvcnQoKSBpcyB2ZXJ5IHNpbWlsYXIgdG8gcG1hcF9nZXRwb3J0KCksIGV4Y2VwdCB0aGF0OgorICoKKyAqICAxLglUaGlzIHZlcnNpb24gYWx3YXlzIHRyaWVzIHRvIHVzZSBhbiBlcGhlbWVyYWwgcG9ydCwgc2luY2UgcmVzZXJ2ZWQKKyAqCXBvcnRzIGFyZSBub3QgbmVlZGVkIGZvciBHRVRQT1JUIHF1ZXJpZXMuICBUaGlzIGNvbnNlcnZlcyB0aGUgdmVyeQorICoJbGltaXRlZCByZXNlcnZlZCBwb3J0IHNwYWNlLCBoZWxwaW5nIHJlZHVjZSBmYWlsZWQgc29ja2V0IGJpbmRzCisgKglkdXJpbmcgbW91bnQgc3Rvcm1zLgorICoKKyAqICAyLglUaGlzIHZlcnNpb24gdGltZXMgb3V0IHF1aWNrbHkgYnkgZGVmYXVsdC4gIEl0IHRpbWUtbGltaXRzIHRoZQorICoJY29ubmVjdCBwcm9jZXNzIGFzIHdlbGwgYXMgdGhlIGFjdHVhbCBSUEMgY2FsbCwgYW5kIGV2ZW4gYWxsb3dzIHRoZQorICoJY2FsbGVyIHRvIHNwZWNpZnkgdGhlIHRpbWVvdXQuCisgKgorICogIDMuCVRoaXMgdmVyc2lvbiBzaGFyZXMgY29kZSB3aXRoIHRoZSBycGNiaW5kdjMgYW5kIHJwY2JpbmR2NCBxdWVyeQorICoJZnVuY3Rpb25zLiAgSXQgY2FuIHVzZSBhIFRJLVJQQyBnZW5lcmF0ZWQgQ0xJRU5ULgorICovCit1bnNpZ25lZCBsb25nIG5mc19wbWFwX2dldHBvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgdHJhbnNwb3J0LAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvZ3JhbSwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIHZlcnNpb24sCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBwcm90b2NvbCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzOworCUNMSUVOVCAqY2xpZW50OworCXN0cnVjdCBwbWFwIHBhcm1zID0geworCQkucG1fcHJvZwk9IHByb2dyYW0sCisJCS5wbV92ZXJzCT0gdmVyc2lvbiwKKwkJLnBtX3Byb3QJPSBwcm90b2NvbCwKKwl9OworCXN0cnVjdCB0aW1ldmFsIHRvdXQgPSB7IC0xLCAwIH07CisJdW5zaWduZWQgbG9uZyBwb3J0ID0gMDsKKworCWlmICh0aW1lb3V0ICE9IE5VTEwpCisJCXRvdXQgPSAqdGltZW91dDsKKworCW5mc19jbGVhcl9ycGNfY3JlYXRlZXJyKCk7CisKKwltZW1jcHkoc2FkZHIsIHNpbiwgc2l6ZW9mKGFkZHJlc3MpKTsKKwljbGllbnQgPSBuZnNfZ3BfZ2V0X3JwY2JjbGllbnQoc2FkZHIsIChzb2NrbGVuX3Qpc2l6ZW9mKCpzaW4pLAorCQkJCQl0cmFuc3BvcnQsIFBNQVBWRVJTLCAmdG91dCk7CisJaWYgKGNsaWVudCAhPSBOVUxMKSB7CisJCXBvcnQgPSBuZnNfZ3BfcG1hcF9nZXRwb3J0KGNsaWVudCwgJnBhcm1zLCB0b3V0KTsKKwkJQ0xOVF9ERVNUUk9ZKGNsaWVudCk7CisJfQorCisJcmV0dXJuIHBvcnQ7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvbmZzX21udGVudC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL25mc19tbnRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZlY2ZjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL25mc19tbnRlbnQuYwpAQCAtMCwwICsxLDIyNyBAQAorLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIHRoZSBsaWJjICptbnRlbnQoKSByb3V0aW5lcy4gKi8KKy8qIE5vdGUgc2xpZ2h0bHkgZGlmZmVyZW50IHByb3RvdHlwZXMuICovCisKKy8qIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgorICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICoKKyAqIDIwMDYtMDYtMDggQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KKyAqIC0gTW92ZWQgdG8gbmZzLXV0aWxzL3N1cHBvcnQvbmZzIGZyb20gdXRpbC1saW51eC9tb3VudAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgkJLyogZm9yIGluZGV4ICovCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIGZvciBpc2RpZ2l0ICovCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4JCS8qIGZvciB1bWFzayAqLworCisjaW5jbHVkZSAibmZzX21udGVudC5oIgorI2luY2x1ZGUgIm5scy5oIgorI2luY2x1ZGUgInhjb21tb24uaCIKKworLyogVW5mb3J0dW5hdGVseSB0aGUgY2xhc3NpY2FsIFVuaXggL2V0Yy9tdGFiIGFuZCAvZXRjL2ZzdGFiCisgICBkbyBub3QgaGFuZGxlIGRpcmVjdG9yeSBuYW1lcyBjb250YWluaW5nIHNwYWNlcy4KKyAgIEhlcmUgd2UgbWFuZ2xlIHRoZW0sIHJlcGxhY2luZyBhIHNwYWNlIGJ5IFwwNDAuCisgICBXaGF0IGRvIG90aGVyIFVuaWNlcyBkbz8gKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmVlZF9lc2NhcGluZ1tdID0geyAnICcsICdcdCcsICdcbicsICdcXCcgfTsKKworc3RhdGljIGNoYXIgKgorbWFuZ2xlKGNvbnN0IGNoYXIgKmFyZykgeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWFyZzsKKwljaGFyICpzcywgKnNwOworCWludCBuOworCisJbiA9IHN0cmxlbihhcmcpOworCXNzID0gc3AgPSB4bWFsbG9jKDQqbisxKTsKKwl3aGlsZSgxKSB7CisJCWZvciAobiA9IDA7IG4gPCBzaXplb2YobmVlZF9lc2NhcGluZyk7IG4rKykgeworCQkJaWYgKCpzID09IG5lZWRfZXNjYXBpbmdbbl0pIHsKKwkJCQkqc3ArKyA9ICdcXCc7CisJCQkJKnNwKysgPSAnMCcgKyAoKCpzICYgMDMwMCkgPj4gNik7CisJCQkJKnNwKysgPSAnMCcgKyAoKCpzICYgMDcwKSA+PiAzKTsKKwkJCQkqc3ArKyA9ICcwJyArICgqcyAmIDA3KTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0KKwkJKnNwKysgPSAqczsKKwkJaWYgKCpzID09IDApCisJCQlicmVhazsKKwluZXh0OgorCQlzKys7CisJfQorCXJldHVybiBzczsKK30KKworc3RhdGljIGludAoraXNfc3BhY2Vfb3JfdGFiIChjaGFyIGMpIHsKKwlyZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Cit9CisKK3N0YXRpYyBjaGFyICoKK3NraXBfc3BhY2VzKGNoYXIgKnMpIHsKKwl3aGlsZSAoaXNfc3BhY2Vfb3JfdGFiKCpzKSkKKwkJcysrOworCXJldHVybiBzOworfQorCitzdGF0aWMgY2hhciAqCitza2lwX25vbnNwYWNlcyhjaGFyICpzKSB7CisJd2hpbGUgKCpzICYmICFpc19zcGFjZV9vcl90YWIoKnMpKQorCQlzKys7CisJcmV0dXJuIHM7Cit9CisKKyNkZWZpbmUgaXNvY3RhbChhKSAoKChhKSAmIH43KSA9PSAnMCcpCisKKy8qIHJldHVybnMgbWFsbG9jZWQgcG9pbnRlciAtIG5vIG1vcmUgc3RyZHVwIHJlcXVpcmVkICovCitzdGF0aWMgY2hhciAqCit1bm1hbmdsZShjaGFyICpzKSB7CisJY2hhciAqcmV0LCAqc3MsICpzcDsKKworCXNzID0gc2tpcF9ub25zcGFjZXMocyk7CisJcmV0ID0gc3AgPSB4bWFsbG9jKHNzLXMrMSk7CisJd2hpbGUocyAhPSBzcykgeworCQlpZiAoKnMgPT0gJ1xcJyAmJiBpc29jdGFsKHNbMV0pICYmIGlzb2N0YWwoc1syXSkgJiYgaXNvY3RhbChzWzNdKSkgeworCQkJKnNwKysgPSA2NCooc1sxXSAmIDcpICsgOCooc1syXSAmIDcpICsgKHNbM10gJiA3KTsKKwkJCXMgKz0gNDsKKwkJfSBlbHNlCisJCQkqc3ArKyA9ICpzKys7CisJfQorCSpzcCA9IDA7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGZzdGF0J2luZyB0aGUgZmlsZSBhbmQgYWxsb2NhdGluZyBhIGJ1ZmZlciBob2xkaW5nIGFsbCBvZiBpdAorICogbWF5IGJlIGEgYmFkIGlkZWE6IGlmIHRoZSBmaWxlIGlzIC9wcm9jL21vdW50cywgdGhlIHN0YXQKKyAqIHJldHVybnMgMC4KKyAqIChPbiB0aGUgb3RoZXIgaGFuZCwgbWFuZ2xpbmcgYW5kIHVubWFuZ2xpbmcgaXMgbWVhbmluZ2xlc3MKKyAqICBmb3IgL3Byb2MvbW91bnRzLikKKyAqLworCittbnRGSUxFICoKK25mc19zZXRtbnRlbnQgKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKm1vZGUpIHsKKwltbnRGSUxFICptZnAgPSB4bWFsbG9jKHNpemVvZigqbWZwKSk7CisJbW9kZV90IG9sZF91bWFzayA9IHVtYXNrKDA3Nyk7CisKKwltZnAtPm1udGVudF9mcCA9IGZvcGVuKGZpbGUsIG1vZGUpOworCXVtYXNrKG9sZF91bWFzayk7CisJbWZwLT5tbnRlbnRfZmlsZSA9IHhzdHJkdXAoZmlsZSk7CisJbWZwLT5tbnRlbnRfZXJycyA9IChtZnAtPm1udGVudF9mcCA9PSBOVUxMKTsKKwltZnAtPm1udGVudF9zb2Z0ZXJycyA9IDA7CisJbWZwLT5tbnRlbnRfbGluZW5vID0gMDsKKwlyZXR1cm4gbWZwOworfQorCit2b2lkCituZnNfZW5kbW50ZW50IChtbnRGSUxFICptZnApIHsKKwlpZiAobWZwKSB7CisJCWlmIChtZnAtPm1udGVudF9mcCkKKwkJCWZjbG9zZShtZnAtPm1udGVudF9mcCk7CisJCWlmIChtZnAtPm1udGVudF9maWxlKQorCQkJZnJlZShtZnAtPm1udGVudF9maWxlKTsKKwkJZnJlZShtZnApOworCX0KK30KKworaW50CituZnNfYWRkbW50ZW50IChtbnRGSUxFICptZnAsIHN0cnVjdCBtbnRlbnQgKm1udCkgeworCWNoYXIgKm0xLCAqbTIsICptMywgKm00OworCWludCByZXM7CisKKwlpZiAoZnNlZWsgKG1mcC0+bW50ZW50X2ZwLCAwLCBTRUVLX0VORCkpCisJCXJldHVybiAxOwkJCS8qIGZhaWx1cmUgKi8KKworCW0xID0gbWFuZ2xlKG1udC0+bW50X2ZzbmFtZSk7CisJbTIgPSBtYW5nbGUobW50LT5tbnRfZGlyKTsKKwltMyA9IG1hbmdsZShtbnQtPm1udF90eXBlKTsKKwltNCA9IG1hbmdsZShtbnQtPm1udF9vcHRzKTsKKworCXJlcyA9IGZwcmludGYgKG1mcC0+bW50ZW50X2ZwLCAiJXMgJXMgJXMgJXMgJWQgJWRcbiIsCisJCSAgICAgICBtMSwgbTIsIG0zLCBtNCwgbW50LT5tbnRfZnJlcSwgbW50LT5tbnRfcGFzc25vKTsKKworCWZyZWUobTEpOworCWZyZWUobTIpOworCWZyZWUobTMpOworCWZyZWUobTQpOworCXJldHVybiAocmVzIDwgMCkgPyAxIDogMDsKK30KKworLyogUmVhZCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBmaWxlIGZwLiBTdG9wIHJlYWRpbmcgYXQgYW4gaW5jb3JyZWN0IGVudHJ5LiAqLworc3RydWN0IG1udGVudCAqCituZnNfZ2V0bW50ZW50IChtbnRGSUxFICptZnApIHsKKwlzdGF0aWMgY2hhciBidWZbNDA5Nl07CisJc3RhdGljIHN0cnVjdCBtbnRlbnQgbWU7CisJY2hhciAqczsKKworIGFnYWluOgorCWlmIChtZnAtPm1udGVudF9lcnJzIHx8IG1mcC0+bW50ZW50X3NvZnRlcnJzID49IEVSUl9NQVgpCisJCXJldHVybiBOVUxMOworCisJLyogcmVhZCB0aGUgbmV4dCBub24tYmxhbmsgbm9uLWNvbW1lbnQgbGluZSAqLworCWRvIHsKKwkJaWYgKGZnZXRzIChidWYsIHNpemVvZihidWYpLCBtZnAtPm1udGVudF9mcCkgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCW1mcC0+bW50ZW50X2xpbmVubysrOworCQlzID0gaW5kZXggKGJ1ZiwgJ1xuJyk7CisJCWlmIChzID09IE5VTEwpIHsKKwkJCS8qIE1pc3NpbmcgZmluYWwgbmV3bGluZT8gIE90aGVyd2lzZSBleHRyZW1lbHkgKi8KKwkJCS8qIGxvbmcgbGluZSAtIGFzc3VtZSBmaWxlIHdhcyBjb3JydXB0ZWQgKi8KKwkJCWlmIChmZW9mKG1mcC0+bW50ZW50X2ZwKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCBfKCJbbW50ZW50XTogd2FybmluZzogbm8gZmluYWwgIgorCQkJCQkibmV3bGluZSBhdCB0aGUgZW5kIG9mICVzXG4iKSwKKwkJCQkJbWZwLT5tbnRlbnRfZmlsZSk7CisJCQkJcyA9IGluZGV4IChidWYsIDApOworCQkJfSBlbHNlIHsKKwkJCQltZnAtPm1udGVudF9lcnJzID0gMTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQkqcyA9IDA7CisJCWlmICgtLXMgPj0gYnVmICYmICpzID09ICdccicpCisJCQkqcyA9IDA7CisJCXMgPSBza2lwX3NwYWNlcyhidWYpOworCX0gd2hpbGUgKCpzID09ICdcMCcgfHwgKnMgPT0gJyMnKTsKKworCW1lLm1udF9mc25hbWUgPSB1bm1hbmdsZShzKTsKKwlzID0gc2tpcF9ub25zcGFjZXMocyk7CisJcyA9IHNraXBfc3BhY2VzKHMpOworCW1lLm1udF9kaXIgPSB1bm1hbmdsZShzKTsKKwlzID0gc2tpcF9ub25zcGFjZXMocyk7CisJcyA9IHNraXBfc3BhY2VzKHMpOworCW1lLm1udF90eXBlID0gdW5tYW5nbGUocyk7CisJcyA9IHNraXBfbm9uc3BhY2VzKHMpOworCXMgPSBza2lwX3NwYWNlcyhzKTsKKwltZS5tbnRfb3B0cyA9IHVubWFuZ2xlKHMpOworCXMgPSBza2lwX25vbnNwYWNlcyhzKTsKKwlzID0gc2tpcF9zcGFjZXMocyk7CisKKwlpZiAoaXNkaWdpdCgqcykpIHsKKwkJbWUubW50X2ZyZXEgPSBhdG9pKHMpOworCQl3aGlsZShpc2RpZ2l0KCpzKSkgcysrOworCX0gZWxzZQorCQltZS5tbnRfZnJlcSA9IDA7CisJaWYoKnMgJiYgIWlzX3NwYWNlX29yX3RhYigqcykpCisJCWdvdG8gZXJyOworCisJcyA9IHNraXBfc3BhY2VzKHMpOworCWlmKGlzZGlnaXQoKnMpKSB7CisJCW1lLm1udF9wYXNzbm8gPSBhdG9pKHMpOworCQl3aGlsZShpc2RpZ2l0KCpzKSkgcysrOworCX0gZWxzZQorCQltZS5tbnRfcGFzc25vID0gMDsKKwlpZigqcyAmJiAhaXNfc3BhY2Vfb3JfdGFiKCpzKSkKKwkJZ290byBlcnI7CisKKwkvKiBhbGxvdyBtb3JlIHN0dWZmLCBlLmcuIGNvbW1lbnRzLCBvbiB0aGlzIGxpbmUgKi8KKworCXJldHVybiAmbWU7CisKKyBlcnI6CisJbWZwLT5tbnRlbnRfc29mdGVycnMrKzsKKwlmcHJpbnRmKHN0ZGVyciwgXygiW21udGVudF06IGxpbmUgJWQgaW4gJXMgaXMgYmFkJXNcbiIpLAorCQltZnAtPm1udGVudF9saW5lbm8sIG1mcC0+bW50ZW50X2ZpbGUsCisJCShtZnAtPm1udGVudF9lcnJzIHx8IG1mcC0+bW50ZW50X3NvZnRlcnJzID49IEVSUl9NQVgpID8KKwkJXygiOyByZXN0IG9mIGZpbGUgaWdub3JlZCIpIDogIiIpOworCWdvdG8gYWdhaW47Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvbmZzY2xpZW50LmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvbmZzY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyMjQwOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9uZnNjbGllbnQuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogc3VwcG9ydC9uZnMvY2xpZW50LmMKKyAqCisgKiBBZGQgb3IgZGVsZXRlIGFuIE5GUyBjbGllbnQgaW4ga25mc2QuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIm5mc2xpYi5oIgorCitpbnQKK25mc2FkZGNsaWVudChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnNjdGxfYXJnCWFyZzsKKworCWFyZy5jYV92ZXJzaW9uID0gTkZTQ1RMX1ZFUlNJT047CisJbWVtY3B5KCZhcmcuY2FfY2xpZW50LCBjbHAsIHNpemVvZihhcmcuY2FfY2xpZW50KSk7CisJcmV0dXJuIG5mc2N0bChORlNDVExfQUREQ0xJRU5ULCAmYXJnLCBOVUxMKTsKK30KKworaW50CituZnNkZWxjbGllbnQoc3RydWN0IG5mc2N0bF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2FyZwlhcmc7CisKKwlhcmcuY2FfdmVyc2lvbiA9IE5GU0NUTF9WRVJTSU9OOworCW1lbWNweSgmYXJnLmNhX2NsaWVudCwgY2xwLCBzaXplb2YoYXJnLmNhX2NsaWVudCkpOworCXJldHVybiBuZnNjdGwoTkZTQ1RMX0RFTENMSUVOVCwgJmFyZywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvbmZzY3RsLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvbmZzY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYTFhNAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9uZnNjdGwuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogc3VwcG9ydC9uZnMvbmZzY3RsLmMKKyAqCisgKiBDZW50cmFsIHN5c2NhbGwgdG8gdGhlIG5mc2Qga2VybmVsIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgIm5mc2xpYi5oIgorCisvKiBjb21wYXRpYmlsaXR5IGhhY2suLi4gKi8KKyNpZm5kZWYgX19OUl9uZnNjdGwKKyNkZWZpbmUgX19OUl9uZnNjdGwJX19OUl9uZnNzZXJ2Y3RsCisjZW5kaWYKKworaW50CituZnNjdGwgKGludCBjbWQsIHN0cnVjdCBuZnNjdGxfYXJnICogYXJncCwgdW5pb24gbmZzY3RsX3JlcyAqIHJlc3ApCit7CisgIHJldHVybiBzeXNjYWxsIChfX05SX25mc2N0bCwgY21kLCBhcmdwLCByZXNwKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9uZnNleHBvcnQuYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9uZnNleHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTI5ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL25mc2V4cG9ydC5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogc3VwcG9ydC9uZnMvZXhwb3J0LmMKKyAqCisgKiBBZGQgb3IgZGVsZXRlIGFuIE5GUyBleHBvcnQgaW4ga25mc2QuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgIm5mc2xpYi5oIgorCisJLyogaWYgL3Byb2MvbmV0L3JwYy8uLi4gZXhpc3RzLCB0aGVuIAorCSAqIHdyaXRlIHRvIGl0LCBhcyB0aGF0IGludGVyZmFjZSBpcyBtb3JlIHN0YWJsZS4KKwkgKiBXcml0ZToKKwkgKiAgY2xpZW50IGZzaWR0eXBlIGZzaWQgcGF0aAorCSAqIHRvIC9wcm9jL25ldC9ycGMvbmZzZC5maC9jaGFubmVsCisJICogYW5kCisJICogIGNsaWVudCBwYXRoIGV4cGlyeSBmbGFncyBhbm9udWlkIGFub25naWQgZnNpZAorCSAqIHRvIC9wcm9jL25ldC9ycGMvbmZzZC5leHBvcnQvY2hhbm5lbAorCSAqLworCitzdGF0aWMgaW50CitleHBfdW5leHAoc3RydWN0IG5mc2N0bF9leHBvcnQgKmV4cCwgaW50IGV4cG9ydCkKK3sKKwlGSUxFICpmOworCXN0cnVjdCBzdGF0IHN0YjsKKwlfX3UzMiBmc2lkOworCWNoYXIgZnNpZHN0cls4XTsKKwlfX3UxNiBkZXY7CisJX191MzIgaW5vZGU7CisJaW50IGVycjsKKworCisJZiA9IGZvcGVuKCIvcHJvYy9uZXQvcnBjL25mc2QuZXhwb3J0L2NoYW5uZWwiLCAidyIpOworCWlmIChmID09IE5VTEwpIHJldHVybiAtMTsKKwlxd29yZF9wcmludChmLCBleHAtPmV4X2NsaWVudCk7CisJcXdvcmRfcHJpbnQoZiwgZXhwLT5leF9wYXRoKTsKKwlpZiAoZXhwb3J0KSB7CisJCXF3b3JkX3ByaW50aW50KGYsIDB4N2ZmZmZmZmYpOworCQlxd29yZF9wcmludGludChmLCBleHAtPmV4X2ZsYWdzKTsKKwkJcXdvcmRfcHJpbnRpbnQoZiwgZXhwLT5leF9hbm9uX3VpZCk7CisJCXF3b3JkX3ByaW50aW50KGYsIGV4cC0+ZXhfYW5vbl9naWQpOworCQlxd29yZF9wcmludGludChmLCBleHAtPmV4X2Rldik7CisJfSBlbHNlCisJCXF3b3JkX3ByaW50aW50KGYsIDEpOworCisJZXJyID0gcXdvcmRfZW9sKGYpOworCWZjbG9zZShmKTsKKworCWlmIChzdGF0KGV4cC0+ZXhfcGF0aCwgJnN0YikgIT0gMCkKKwkJcmV0dXJuIC0xOworCWYgPSBmb3BlbigiL3Byb2MvbmV0L3JwYy9uZnNkLmZoL2NoYW5uZWwiLCAidyIpOworCWlmIChmPT1OVUxMKSByZXR1cm4gLTE7CisJaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkgeworCQlxd29yZF9wcmludChmLGV4cC0+ZXhfY2xpZW50KTsKKwkJcXdvcmRfcHJpbnRpbnQoZiwxKTsKKwkJZnNpZCA9IGV4cC0+ZXhfZGV2OworCQlxd29yZF9wcmludGhleChmLCAoY2hhciopJmZzaWQsIDQpOworCQlpZiAoZXhwb3J0KSB7CisJCQlxd29yZF9wcmludGludChmLCAweDdmZmZmZmZmKTsKKwkJCXF3b3JkX3ByaW50KGYsIGV4cC0+ZXhfcGF0aCk7CisJCX0gZWxzZQorCQkJcXdvcmRfcHJpbnRpbnQoZiwgMSk7CisKKwkJZXJyID0gcXdvcmRfZW9sKGYpIHx8IGVycjsKKwl9CisJcXdvcmRfcHJpbnQoZixleHAtPmV4X2NsaWVudCk7CisJcXdvcmRfcHJpbnRpbnQoZiwwKTsKKwlkZXYgPSBodG9ucyhtYWpvcihzdGIuc3RfZGV2KSk7IG1lbWNweShmc2lkc3RyLCAmZGV2LCAyKTsKKwlkZXYgPSBodG9ucyhtaW5vcihzdGIuc3RfZGV2KSk7IG1lbWNweShmc2lkc3RyKzIsICZkZXYsIDIpOworCWlub2RlID0gc3RiLnN0X2lubzsgbWVtY3B5KGZzaWRzdHIrNCwgJmlub2RlLCA0KTsKKwkKKwlxd29yZF9wcmludGhleChmLCBmc2lkc3RyLCA4KTsKKwlpZiAoZXhwb3J0KSB7CisJCXF3b3JkX3ByaW50aW50KGYsIDB4N2ZmZmZmZmYpOworCQlxd29yZF9wcmludChmLCBleHAtPmV4X3BhdGgpOworCX0gZWxzZQorCQlxd29yZF9wcmludGludChmLCAxKTsKKwllcnIgPSBxd29yZF9lb2woZikgfHwgZXJyOworCWZjbG9zZShmKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQKK25mc2V4cG9ydChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBuZnNjdGxfYXJnCWFyZzsKKwlpbnQgZmQ7CisJaWYgKChmZD1vcGVuKCIvcHJvYy9uZXQvcnBjL25mc2QuZmgvY2hhbm5lbCIsIE9fV1JPTkxZKSk+PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIGV4cF91bmV4cChleHAsIDEpOworCX0KKwlhcmcuY2FfdmVyc2lvbiA9IE5GU0NUTF9WRVJTSU9OOworCW1lbWNweSgmYXJnLmNhX2V4cG9ydCwgZXhwLCBzaXplb2YoYXJnLmNhX2V4cG9ydCkpOworCXJldHVybiBuZnNjdGwoTkZTQ1RMX0VYUE9SVCwgJmFyZywgTlVMTCk7Cit9CisKK2ludAorbmZzdW5leHBvcnQoc3RydWN0IG5mc2N0bF9leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2FyZwlhcmc7CisKKwlpbnQgZmQ7CisJaWYgKChmZD1vcGVuKCIvcHJvYy9uZXQvcnBjL25mc2QuZmgvY2hhbm5lbCIsIE9fV1JPTkxZKSk+PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIGV4cF91bmV4cChleHAsIDApOworCX0KKworCWFyZy5jYV92ZXJzaW9uID0gTkZTQ1RMX1ZFUlNJT047CisJbWVtY3B5KCZhcmcuY2FfZXhwb3J0LCBleHAsIHNpemVvZihhcmcuY2FfZXhwb3J0KSk7CisJcmV0dXJuIG5mc2N0bChORlNDVExfVU5FWFBPUlQsICZhcmcsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3JtdGFiLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvcm10YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhhYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3JtdGFiLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBzdXBwb3J0L25mcy9ybXRhYi5jCisgKgorICogSGFuZGxpbmcgZm9yIHJtdGFiLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAibmZzbGliLmgiCisKK3N0YXRpYyBGSUxFCSpybWZwID0gTlVMTDsKKworaW50CitzZXRybXRhYmVudChjaGFyICp0eXBlKQoreworCWlmIChybWZwKQorCQlmY2xvc2Uocm1mcCk7CisJcm1mcCA9IGZzZXRybXRhYmVudChfUEFUSF9STVRBQiwgdHlwZSk7CisJcmV0dXJuIChybWZwICE9IE5VTEwpOworfQorCitGSUxFICoKK2ZzZXRybXRhYmVudChjaGFyICpmbmFtZSwgY2hhciAqdHlwZSkKK3sKKwlpbnQJcmVhZG9ubHkgPSAhc3RyY21wKHR5cGUsICJyIik7CisJRklMRQkqZnA7CisKKwlpZiAoIWZuYW1lKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGZwID0gZm9wZW4oZm5hbWUsIHR5cGUpKSA9PSBOVUxMKSB7CisJCXhsb2coTF9FUlJPUiwgImNhbid0IG9wZW4gJXMgZm9yICVzaW5nIiwgZm5hbWUsCisJCQkJcmVhZG9ubHkgPyAicmVhZCIgOiAid3JpdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZwOworfQorCitzdHJ1Y3Qgcm10YWJlbnQgKgorZ2V0cm10YWJlbnQoaW50IGxvZywgbG9uZyAqcG9zKQoreworCXJldHVybiBmZ2V0cm10YWJlbnQocm1mcCwgbG9nLCBwb3MpOworfQorCitzdHJ1Y3Qgcm10YWJlbnQgKgorZmdldHJtdGFiZW50KEZJTEUgKmZwLCBpbnQgbG9nLCBsb25nICpwb3MpCit7CisJc3RhdGljIHN0cnVjdCBybXRhYmVudAlyZTsKKwljaGFyCWJ1ZlsyMDQ4XSwgKmNvdW50LCAqaG9zdCwgKnBhdGg7CisKKwllcnJubyA9IDA7CisJaWYgKCFmcCkKKwkJcmV0dXJuIE5VTEw7CisJZG8geworCQlpZiAocG9zKQorCQkJKnBvcyA9IGZ0ZWxsIChmcCk7CisJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLTEsIGZwKSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWhvc3QgPSBidWY7CisJCWlmICgocGF0aCA9IHN0cmNocihob3N0LCAnXG4nKSkgIT0gTlVMTCkKKwkJCSpwYXRoID0gJ1wwJzsKKwkJaWYgKCEocGF0aCA9IHN0cmNocihob3N0LCAnOicpKSkgeworCQkJaWYgKGxvZykKKwkJCQl4bG9nKExfRVJST1IsICJtYWxmb3JtZWQgZW50cnkgaW4gcm10YWIgZmlsZSIpOworCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkqcGF0aCsrID0gJ1wwJzsKKwkJY291bnQgPSBzdHJjaHIocGF0aCwgJzonKTsKKwkJaWYgKGNvdW50KSB7CisJCQkqY291bnQrKyA9ICdcMCc7CisJCQlyZS5yX2NvdW50ID0gc3RydG9sIChjb3VudCwgTlVMTCwgMCk7CisJCX0KKwkJZWxzZQorCQkJcmUucl9jb3VudCA9IDE7CisJfSB3aGlsZSAoMCk7CisJc3RybmNweShyZS5yX2NsaWVudCwgaG9zdCwgc2l6ZW9mIChyZS5yX2NsaWVudCkgLSAxKTsKKwlyZS5yX2NsaWVudFtzaXplb2YgKHJlLnJfY2xpZW50KSAtIDFdID0gJ1wwJzsKKwlzdHJuY3B5KHJlLnJfcGF0aCwgcGF0aCwgc2l6ZW9mIChyZS5yX3BhdGgpIC0gMSk7CisJcmUucl9wYXRoW3NpemVvZiAocmUucl9wYXRoKSAtIDFdID0gJ1wwJzsKKwlyZXR1cm4gJnJlOworfQorCit2b2lkCitwdXRybXRhYmVudChzdHJ1Y3Qgcm10YWJlbnQgKnJlcCwgbG9uZyAqcG9zKQoreworCWZwdXRybXRhYmVudChybWZwLCByZXAsIHBvcyk7Cit9CisKK3ZvaWQKK2ZwdXRybXRhYmVudChGSUxFICpmcCwgc3RydWN0IHJtdGFiZW50ICpyZXAsIGxvbmcgKnBvcykKK3sKKwlpZiAoIWZwIHx8IChwb3MgJiYgZnNlZWsgKGZwLCAqcG9zLCBTRUVLX1NFVCkgIT0gMCkpCisJCXJldHVybjsKKwlmcHJpbnRmKGZwLCAiJXM6JXM6MHglLjh4XG4iLCByZXAtPnJfY2xpZW50LCByZXAtPnJfcGF0aCwKKwkJcmVwLT5yX2NvdW50KTsKK30KKwordm9pZAorZW5kcm10YWJlbnQodm9pZCkKK3sKKwlmZW5kcm10YWJlbnQocm1mcCk7CisJcm1mcCA9IE5VTEw7Cit9CisKK3ZvaWQKK2ZlbmRybXRhYmVudChGSUxFICpmcCkKK3sKKwlpZiAoZnApIHsKKwkJc3RhdGljIGludCBoYXZlX25ld19jYWNoZSA9IC0xOworCQlpZiAoaGF2ZV9uZXdfY2FjaGUgPT0gLTEpIC8qIGNoZWNrIG9ubHkgb25jZSAqLworCQkJaGF2ZV9uZXdfY2FjaGUgPSBjaGVja19uZXdfY2FjaGUoKTsKKworCQlpZiAoIWhhdmVfbmV3X2NhY2hlKSB7CisJCQkvKgorCQkJICogSWYgd2UgYXJlIHVzaW5nIHRoZSBvbGQgY2FjaGluZyBpbnRlcmZhY2U6IGV4cG9ydGZzCisJCQkgKiB1c2VzIHRoZSBybXRhYiB0byBkZXRlcm1pbmUgd2hhdCBzaG91bGQgYmUgZXhwb3J0ZWQsCisJCQkgKiBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCBpdCBiZSB1cC10by1kYXRlLgorCQkJICoKKwkJCSAqIElmIHdlIGFyZSB1c2luZyB0aGUgbmV3IGNhY2hpbmcgaW50ZXJmYWNlOiB0aGUgcm10YWIKKwkJCSAqIGlzIGlnbm9yZWQgYnkgZXhwb3J0ZnMgYW5kIHRoZSBmZGF0YXN5bmMgb25seSBzZXJ2ZXMKKwkJCSAqIHRvIHNsb3cgdXMgZG93bi4KKwkJCSAqLworCQkJZmZsdXNoKGZwKTsKKwkJCWZkYXRhc3luYyhmaWxlbm8oZnApKTsKKwkJfQorCisJCWZjbG9zZShmcCk7CisJfQorfQorCit2b2lkCityZXdpbmRybXRhYmVudCh2b2lkKQoreworCWlmIChybWZwKQorCQlyZXdpbmQocm1mcCk7Cit9CisKK3ZvaWQKK2ZyZXdpbmRybXRhYmVudChGSUxFICpmcCkKK3sKKwlpZiAoZnApCisJCXJld2luZCAoZnApOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3JwY19zb2NrZXQuYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9ycGNfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyMDgyNAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9ycGNfc29ja2V0LmMKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisgKiBHZW5lcmljIFJQQyBjbGllbnQgc29ja2V0LWxldmVsIEFQSXMgZm9yIG5mcy11dGlscworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJuZnNycGMuaCIKKworI2lmZGVmIEhBVkVfTElCVElSUEMKKyNpbmNsdWRlIDxuZXRjb25maWcuaD4KKyNpbmNsdWRlIDxycGMvcnBjYl9wcm90Lmg+CisjZW5kaWYJLyogSEFWRV9MSUJUSVJQQyAqLworCisvKgorICogSWYgIi0xIiBpcyBzcGVjaWZpZWQgaW4gdGhlIHR2X3NlYyBmaWVsZCwgdXNlIHRoZXNlIGRlZmF1bHRzIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgTkZTUlBDX1RJTUVPVVRfVURQCSgzKQorI2RlZmluZSBORlNSUENfVElNRU9VVF9UQ1AJKDEwKQorCisKKy8qCisgKiBTZXQgdXAgYW4gUlBDIGNsaWVudCBmb3IgY29tbXVuaWNhdGluZyB2aWEgYSBBRl9MT0NBTCBzb2NrZXQuCisgKgorICogQHRpbWVvdXQgaXMgaW5pdGlhbGl6ZWQgdXBvbiByZXR1cm4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHByZXBhcmVkIFJQQyBjbGllbnQgaWYgc3VjY2Vzc2Z1bDsgY2FsbGVyCisgKiBtdXN0IGRlc3Ryb3kgYSBub24tTlVMTCByZXR1cm5lZCBSUEMgY2xpZW50LiAgT3RoZXJ3aXNlIE5VTEwsIGFuZAorICogcnBjX2NyZWF0ZWVyci5jZl9zdGF0IGlzIHNldCB0byByZWZsZWN0IHRoZSBlcnJvci4KKyAqLworc3RhdGljIENMSUVOVCAqbmZzX2dldF9sb2NhbGNsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCQkgICBjb25zdCBzb2NrbGVuX3Qgc2FsZW4sCisJCQkJICAgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sCisJCQkJICAgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkJICAgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpCit7CisjaWZkZWYgSEFWRV9MSUJUSVJQQworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJY29uc3Qgc3RydWN0IG5ldGJ1ZiBuYnVmID0geworCQkubWF4bGVuCQk9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pLAorCQkubGVuCQk9IChzaXplX3Qpc2FsZW4sCisJCS5idWYJCT0gJmFkZHJlc3MsCisJfTsKKyNlbmRpZgkvKiBIQVZFX0xJQlRJUlBDICovCisJQ0xJRU5UICpjbGllbnQ7CisJaW50IHNvY2s7CisKKwlzb2NrID0gc29ja2V0KEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHNvY2sgPT0gLTEpIHsKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1NZU1RFTUVSUk9SOworCQlycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vID0gZXJybm87CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh0aW1lb3V0LT50dl9zZWMgPT0gLTEpCisJCXRpbWVvdXQtPnR2X3NlYyA9IE5GU1JQQ19USU1FT1VUX1RDUDsKKworI2lmZGVmIEhBVkVfTElCVElSUEMKKwltZW1jcHkobmJ1Zi5idWYsIHNhcCwgKHNpemVfdClzYWxlbik7CisJY2xpZW50ID0gY2xudF92Y19jcmVhdGUoc29jaywgJm5idWYsIHByb2dyYW0sIHZlcnNpb24sIDAsIDApOworI2Vsc2UJLyogIUhBVkVfTElCVElSUEMgKi8KKwljbGllbnQgPSBjbG50dW5peF9jcmVhdGUoKHN0cnVjdCBzb2NrYWRkcl91biAqKXNhcCwKKwkJCQkJcHJvZ3JhbSwgdmVyc2lvbiwgJnNvY2ssIDAsIDApOworI2VuZGlmCS8qICFIQVZFX0xJQlRJUlBDICovCisJaWYgKGNsaWVudCAhPSBOVUxMKQorCQlDTE5UX0NPTlRST0woY2xpZW50LCBDTFNFVF9GRF9DTE9TRSwgTlVMTCk7CisJZWxzZQorCQkodm9pZCljbG9zZShzb2NrKTsKKworCXJldHVybiBjbGllbnQ7Cit9CisKKy8qCisgKiBCaW5kIGEgc29ja2V0IHVzaW5nIGFuIHVudXNlZCBlcGhlbWVyYWwgc291cmNlIHBvcnQuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIHJldHVybnMgLTEgb24gZXJyb3IuICBlcnJubyBpcworICogc2V0IHRvIHJlZmxlY3QgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2JpbmQoY29uc3QgaW50IHNvY2ssIGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0geworCQkuc2luX2ZhbWlseQkJPSBBRl9JTkVULAorCQkuc2luX2FkZHIuc19hZGRyCT0gaHRvbmwoSU5BRERSX0FOWSksCisJfTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjYgPSB7CisJCS5zaW42X2ZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLnNpbjZfYWRkcgkJPSBJTjZBRERSX0FOWV9JTklULAorCX07CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKShjaGFyICopJnNpbiwKKwkJCQkJKHNvY2tsZW5fdClzaXplb2Yoc2luKSk7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKShjaGFyICopJnNpbjYsCisJCQkJCShzb2NrbGVuX3Qpc2l6ZW9mKHNpbjYpKTsKKwl9CisKKwllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwlyZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisKKy8qCisgKiBCaW5kIGEgc29ja2V0IHVzaW5nIGFuIHVudXNlZCBwcml2aWxlZ2VkIHNvdXJjZSBwb3J0LgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciByZXR1cm5zIC0xIG9uIGVycm9yLiAgZXJybm8gaXMKKyAqIHNldCB0byByZWZsZWN0IHRoZSBuYXR1cmUgb2YgdGhlIGVycm9yLgorICovCitzdGF0aWMgaW50IG5mc19iaW5kcmVzdnBvcnQoY29uc3QgaW50IHNvY2ssIGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0geworCQkuc2luX2ZhbWlseQkJPSBBRl9JTkVULAorCQkuc2luX2FkZHIuc19hZGRyCT0gaHRvbmwoSU5BRERSX0FOWSksCisJfTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNpbjYgPSB7CisJCS5zaW42X2ZhbWlseQkJPSBBRl9JTkVUNiwKKwkJLnNpbjZfYWRkcgkJPSBJTjZBRERSX0FOWV9JTklULAorCX07CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIGJpbmRyZXN2cG9ydF9zYShzb2NrLCAoc3RydWN0IHNvY2thZGRyICopKGNoYXIgKikmc2luKTsKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gYmluZHJlc3Zwb3J0X3NhKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikoY2hhciAqKSZzaW42KTsKKwl9CisKKwllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwlyZXR1cm4gLTE7Cit9CisKKyNlbHNlCS8qICFIQVZFX0xJQlRJUlBDICovCisKKy8qCisgKiBCaW5kIGEgc29ja2V0IHVzaW5nIGFuIHVudXNlZCBwcml2aWxlZ2VkIHNvdXJjZSBwb3J0LgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCBvciByZXR1cm5zIC0xIG9uIGVycm9yLiAgZXJybm8gaXMKKyAqIHNldCB0byByZWZsZWN0IHRoZSBuYXR1cmUgb2YgdGhlIGVycm9yLgorICovCitzdGF0aWMgaW50IG5mc19iaW5kcmVzdnBvcnQoY29uc3QgaW50IHNvY2ssIGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSkKK3sKKwlpZiAoZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gYmluZHJlc3Zwb3J0KHNvY2ssIE5VTEwpOworfQorCisjZW5kaWYJLyogIUhBVkVfTElCVElSUEMgKi8KKworLyoKKyAqIFBlcmZvcm0gYSBub24tYmxvY2tpbmcgY29ubmVjdCBvbiB0aGUgc29ja2V0IGZkLgorICoKKyAqIEB0aW1lb3V0IGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIHRpbWUgcmVtYWluaW5nIChpLmUuIHRpbWUgcHJvdmlkZWQKKyAqIG1pbnVzIHRpbWUgZWxhc3BlZCkuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIG9yIHJldHVybnMgLTEgb24gZXJyb3IuICBlcnJubyBpcworICogc2V0IHRvIHJlZmxlY3QgdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2Nvbm5lY3RfbmIoY29uc3QgaW50IGZkLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCSAgY29uc3Qgc29ja2xlbl90IHNhbGVuLCBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKwlpbnQgZmxhZ3MsIHJldDsKKwlmZF9zZXQgcnNldDsKKworCWZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOworCWlmIChmbGFncyA8IDApCisJCXJldHVybiAtMTsKKworCXJldCA9IGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIEZyb20gaGVyZSBvbiBzdWJzZXF1ZW50IHN5cyBjYWxscyBjb3VsZCBjaGFuZ2UgZXJybm8gc28KKwkgKiB3ZSBzZXQgcmV0ID0gLWVycm5vIHRvIGNhcHR1cmUgaXQgaW4gY2FzZSB3ZSBkZWNpZGUgdG8KKwkgKiB1c2UgaXQgbGF0ZXIuCisJICovCisJcmV0ID0gY29ubmVjdChmZCwgc2FwLCBzYWxlbik7CisJaWYgKHJldCA8IDAgJiYgZXJybm8gIT0gRUlOUFJPR1JFU1MpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAocmV0ID09IDApCisJCWdvdG8gZG9uZTsKKworCS8qIG5vdyB3YWl0ICovCisJRkRfWkVSTygmcnNldCk7CisJRkRfU0VUKGZkLCAmcnNldCk7CisKKwlyZXQgPSBzZWxlY3QoZmQgKyAxLCBOVUxMLCAmcnNldCwgTlVMTCwgdGltZW91dCk7CisJaWYgKHJldCA8PSAwKSB7CisJCWlmIChyZXQgPT0gMCkKKwkJCWVycm5vID0gRVRJTUVET1VUOworCQlyZXQgPSAtMTsKKwkJZ290byBkb25lOworCX0KKworCWlmIChGRF9JU1NFVChmZCwgJnJzZXQpKSB7CisJCWludCBzdGF0dXM7CisJCXNvY2tsZW5fdCBsZW4gPSAoc29ja2xlbl90KXNpemVvZihyZXQpOworCisJCXN0YXR1cyA9IGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmcmV0LCAmbGVuKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXJldCA9IC0xOworCQkJZ290byBkb25lOworCQl9CisKKwkJLyogT29wcyAtIHNvbWV0aGluZyB3cm9uZyB3aXRoIGNvbm5lY3QgKi8KKwkJaWYgKHJldCAhPSAwKSB7CisJCQllcnJubyA9IHJldDsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCitkb25lOgorCSh2b2lkKWZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNldCB1cCBhbiBSUEMgY2xpZW50IGZvciBjb21tdW5pY2F0aW5nIHZpYSBhIGRhdGFncmFtIHNvY2tldC4KKyAqIEEgY29ubmVjdGVkIFVEUCBzb2NrZXQgaXMgdXNlZCB0byBkZXRlY3QgYSBtaXNzaW5nIHJlbW90ZQorICogbGlzdGVuZXIgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKyAqCisgKiBAdGltZW91dCBpcyBpbml0aWFsaXplZCB1cG9uIHJldHVybgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGEgcHJlcGFyZWQgUlBDIGNsaWVudCBpZiBzdWNjZXNzZnVsOyBjYWxsZXIKKyAqIG11c3QgZGVzdHJveSBhIG5vbi1OVUxMIHJldHVybmVkIFJQQyBjbGllbnQuICBPdGhlcndpc2UgTlVMTCwgYW5kCisgKiBycGNfY3JlYXRlZXJyLmNmX3N0YXQgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIGVycm9yLgorICovCitzdGF0aWMgQ0xJRU5UICpuZnNfZ2V0X3VkcGNsaWVudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCQkgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJCSBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwKKwkJCQkgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkJIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0LAorCQkJCSBjb25zdCBpbnQgcmVzdnBvcnQpCit7CisJQ0xJRU5UICpjbGllbnQ7CisJaW50IHJldCwgc29jazsKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisJc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcmVzczsKKwljb25zdCBzdHJ1Y3QgbmV0YnVmIG5idWYgPSB7CisJCS5tYXhsZW4JCT0gc2FsZW4sCisJCS5sZW4JCT0gc2FsZW4sCisJCS5idWYJCT0gJmFkZHJlc3MsCisJfTsKKworI2Vsc2UJLyogIUhBVkVfTElCVElSUEMgKi8KKworCWlmIChzYXAtPnNhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19VTktOT1dOUFJPVE87CisJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgkvKiAhSEFWRV9MSUJUSVJQQyAqLworCisJc29jayA9IHNvY2tldCgoaW50KXNhcC0+c2FfZmFtaWx5LCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHNvY2sgPT0gLTEpIHsKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1NZU1RFTUVSUk9SOworCQlycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vID0gZXJybm87CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChyZXN2cG9ydCkKKwkJcmV0ID0gbmZzX2JpbmRyZXN2cG9ydChzb2NrLCBzYXAtPnNhX2ZhbWlseSk7CisJZWxzZQorCQlyZXQgPSBuZnNfYmluZChzb2NrLCBzYXAtPnNhX2ZhbWlseSk7CisJaWYgKHJldCA8IDApIHsKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1NZU1RFTUVSUk9SOworCQlycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vID0gZXJybm87CisJCSh2b2lkKWNsb3NlKHNvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodGltZW91dC0+dHZfc2VjID09IC0xKQorCQl0aW1lb3V0LT50dl9zZWMgPSBORlNSUENfVElNRU9VVF9VRFA7CisKKwlyZXQgPSBuZnNfY29ubmVjdF9uYihzb2NrLCBzYXAsIHNhbGVuLCB0aW1lb3V0KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1NZU1RFTUVSUk9SOworCQlycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vID0gZXJybm87CisJCSh2b2lkKWNsb3NlKHNvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisJbWVtY3B5KG5idWYuYnVmLCBzYXAsIChzaXplX3Qpc2FsZW4pOworCWNsaWVudCA9IGNsbnRfZGdfY3JlYXRlKHNvY2ssICZuYnVmLCBwcm9ncmFtLCB2ZXJzaW9uLCAwLCAwKTsKKyNlbHNlCS8qICFIQVZFX0xJQlRJUlBDICovCisJY2xpZW50ID0gY2xudHVkcF9jcmVhdGUoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcCwgcHJvZ3JhbSwKKwkJCQkJdmVyc2lvbiwgKnRpbWVvdXQsICZzb2NrKTsKKyNlbmRpZgkvKiAhSEFWRV9MSUJUSVJQQyAqLworCWlmIChjbGllbnQgIT0gTlVMTCkgeworCQlzdHJ1Y3QgdGltZXZhbCByZXRyeV90aW1lb3V0ID0geyAxLCAwIH07CisJCUNMTlRfQ09OVFJPTChjbGllbnQsIENMU0VUX1JFVFJZX1RJTUVPVVQsCisJCQkJCQkoY2hhciAqKSZyZXRyeV90aW1lb3V0KTsKKwkJQ0xOVF9DT05UUk9MKGNsaWVudCwgQ0xTRVRfRkRfQ0xPU0UsIE5VTEwpOworCX0gZWxzZQorCQkodm9pZCljbG9zZShzb2NrKTsKKworCXJldHVybiBjbGllbnQ7Cit9CisKKy8qCisgKiBTZXQgdXAgYW5kIGNvbm5lY3QgYW4gUlBDIGNsaWVudCBmb3IgY29tbXVuaWNhdGluZyB2aWEgYSBzdHJlYW0gc29ja2V0LgorICoKKyAqIEB0aW1lb3V0IGlzIGluaXRpYWxpemVkIHVwb24gcmV0dXJuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBwcmVwYXJlZCBhbmQgY29ubmVjdGVkIFJQQyBjbGllbnQgaWYKKyAqIHN1Y2Nlc3NmdWw7IGNhbGxlciBtdXN0IGRlc3Ryb3kgYSBub24tTlVMTCByZXR1cm5lZCBSUEMgY2xpZW50LgorICogT3RoZXJ3aXNlIE5VTEwsIGFuZCBycGNfY3JlYXRlZXJyLmNmX3N0YXQgaXMgc2V0IHRvIHJlZmxlY3QgdGhlCisgKiBlcnJvci4KKyAqLworc3RhdGljIENMSUVOVCAqbmZzX2dldF90Y3BjbGllbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkJIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCQkgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sCisJCQkJIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJCSBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCwKKwkJCQkgY29uc3QgaW50IHJlc3Zwb3J0KQoreworCUNMSUVOVCAqY2xpZW50OworCWludCByZXQsIHNvY2s7CisjaWZkZWYgSEFWRV9MSUJUSVJQQworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7CisJY29uc3Qgc3RydWN0IG5ldGJ1ZiBuYnVmID0geworCQkubWF4bGVuCQk9IHNhbGVuLAorCQkubGVuCQk9IHNhbGVuLAorCQkuYnVmCQk9ICZhZGRyZXNzLAorCX07CisKKyNlbHNlCS8qICFIQVZFX0xJQlRJUlBDICovCisKKwlpZiAoc2FwLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfVU5LTk9XTlBST1RPOworCQlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYJLyogIUhBVkVfTElCVElSUEMgKi8KKworCXNvY2sgPSBzb2NrZXQoKGludClzYXAtPnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwlpZiAoc29jayA9PSAtMSkgeworCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfU1lTVEVNRVJST1I7CisJCXJwY19jcmVhdGVlcnIuY2ZfZXJyb3IucmVfZXJybm8gPSBlcnJubzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHJlc3Zwb3J0KQorCQlyZXQgPSBuZnNfYmluZHJlc3Zwb3J0KHNvY2ssIHNhcC0+c2FfZmFtaWx5KTsKKwllbHNlCisJCXJldCA9IG5mc19iaW5kKHNvY2ssIHNhcC0+c2FfZmFtaWx5KTsKKwlpZiAocmV0IDwgMCkgeworCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfU1lTVEVNRVJST1I7CisJCXJwY19jcmVhdGVlcnIuY2ZfZXJyb3IucmVfZXJybm8gPSBlcnJubzsKKwkJKHZvaWQpY2xvc2Uoc29jayk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICh0aW1lb3V0LT50dl9zZWMgPT0gLTEpCisJCXRpbWVvdXQtPnR2X3NlYyA9IE5GU1JQQ19USU1FT1VUX1RDUDsKKworCXJldCA9IG5mc19jb25uZWN0X25iKHNvY2ssIHNhcCwgc2FsZW4sIHRpbWVvdXQpOworCWlmIChyZXQgIT0gMCkgeworCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfU1lTVEVNRVJST1I7CisJCXJwY19jcmVhdGVlcnIuY2ZfZXJyb3IucmVfZXJybm8gPSBlcnJubzsKKwkJKHZvaWQpY2xvc2Uoc29jayk7CisJCXJldHVybiBOVUxMOworCX0KKworI2lmZGVmIEhBVkVfTElCVElSUEMKKwltZW1jcHkobmJ1Zi5idWYsIHNhcCwgKHNpemVfdClzYWxlbik7CisJY2xpZW50ID0gY2xudF92Y19jcmVhdGUoc29jaywgJm5idWYsIHByb2dyYW0sIHZlcnNpb24sIDAsIDApOworI2Vsc2UJLyogIUhBVkVfTElCVElSUEMgKi8KKwljbGllbnQgPSBjbG50dGNwX2NyZWF0ZSgoc3RydWN0IHNvY2thZGRyX2luICopc2FwLAorCQkJCQlwcm9ncmFtLCB2ZXJzaW9uLCAmc29jaywgMCwgMCk7CisjZW5kaWYJLyogIUhBVkVfTElCVElSUEMgKi8KKwlpZiAoY2xpZW50ICE9IE5VTEwpCisJCUNMTlRfQ09OVFJPTChjbGllbnQsIENMU0VUX0ZEX0NMT1NFLCBOVUxMKTsKKwllbHNlCisJCSh2b2lkKWNsb3NlKHNvY2spOworCisJcmV0dXJuIGNsaWVudDsKK30KKworLyoqCisgKiBuZnNfZ2V0X3JwY2NsaWVudCAtIGFjcXVpcmUgYW4gUlBDIGNsaWVudAorICogQHNhcDogcG9pbnRlciB0byBzb2NrZXQgYWRkcmVzcyBvZiBSUEMgc2VydmVyCisgKiBAc2FsZW46IGxlbmd0aCBvZiBzb2NrZXQgYWRkcmVzcworICogQHRyYW5zcG9ydDogSVBQUk9UT18gdmFsdWUgb2YgdHJhbnNwb3J0IHByb3RvY29sIHRvIHVzZQorICogQHByb2dyYW06IFJQQyBwcm9ncmFtIG51bWJlcgorICogQHZlcnNpb246IFJQQyB2ZXJzaW9uIG51bWJlcgorICogQHRpbWVvdXQ6IHBvaW50ZXIgdG8gcmVxdWVzdCB0aW1lb3V0IChtdXN0IG5vdCBiZSBOVUxMKQorICoKKyAqIFNldCB1cCBhbiBSUEMgY2xpZW50IGZvciBjb21tdW5pY2F0aW5nIHdpdGggYW4gUlBDIHByb2dyYW0gQHByb2dyYW0KKyAqIGFuZCBAdmVyc2lvbiBvbiB0aGUgc2VydmVyIEBzYXAgb3ZlciBAdHJhbnNwb3J0LiAgQW4gdW5wcml2aWxlZ2VkCisgKiBzb3VyY2UgcG9ydCBpcyB1c2VkLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGEgcHJlcGFyZWQgUlBDIGNsaWVudCBpZiBzdWNjZXNzZnVsLCBhbmQKKyAqIEB0aW1lb3V0IGlzIGluaXRpYWxpemVkOyBjYWxsZXIgbXVzdCBkZXN0cm95IGEgbm9uLU5VTEwgcmV0dXJuZWQgUlBDCisgKiBjbGllbnQuICBPdGhlcndpc2UgcmV0dXJucyBOVUxMLCBhbmQgcnBjX2NyZWF0ZWVyci5jZl9zdGF0IGlzIHNldCB0bworICogcmVmbGVjdCB0aGUgZXJyb3IuCisgKi8KK0NMSUVOVCAqbmZzX2dldF9ycGNjbGllbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkgIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCSAgY29uc3QgdW5zaWduZWQgc2hvcnQgdHJhbnNwb3J0LAorCQkJICBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwKKwkJCSAgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQoreworCW5mc19jbGVhcl9ycGNfY3JlYXRlZXJyKCk7CisKKwlzd2l0Y2ggKHNhcC0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9MT0NBTDoKKwkJcmV0dXJuIG5mc19nZXRfbG9jYWxjbGllbnQoc2FwLCBzYWxlbiwgcHJvZ3JhbSwKKwkJCQkJCXZlcnNpb24sIHRpbWVvdXQpOworCWNhc2UgQUZfSU5FVDoKKwljYXNlIEFGX0lORVQ2OgorCQlpZiAobmZzX2dldF9wb3J0KHNhcCkgPT0gMCkgeworCQkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1VOS05PV05BRERSOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1VOS05PV05BRERSOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzd2l0Y2ggKHRyYW5zcG9ydCkgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCXJldHVybiBuZnNfZ2V0X3RjcGNsaWVudChzYXAsIHNhbGVuLCBwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJdGltZW91dCwgMCk7CisJY2FzZSAwOgorCWNhc2UgSVBQUk9UT19VRFA6CisJCXJldHVybiBuZnNfZ2V0X3VkcGNsaWVudChzYXAsIHNhbGVuLCBwcm9ncmFtLCB2ZXJzaW9uLAorCQkJCQkJdGltZW91dCwgMCk7CisJfQorCisJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1VOS05PV05QUk9UTzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBuZnNfZ2V0X3ByaXZfcnBjY2xpZW50IC0gYWNxdWlyZSBhbiBSUEMgY2xpZW50CisgKiBAc2FwOiBwb2ludGVyIHRvIHNvY2tldCBhZGRyZXNzIG9mIFJQQyBzZXJ2ZXIKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNvY2tldCBhZGRyZXNzCisgKiBAdHJhbnNwb3J0OiBJUFBST1RPXyB2YWx1ZSBvZiB0cmFuc3BvcnQgcHJvdG9jb2wgdG8gdXNlCisgKiBAcHJvZ3JhbTogUlBDIHByb2dyYW0gbnVtYmVyCisgKiBAdmVyc2lvbjogUlBDIHZlcnNpb24gbnVtYmVyCisgKiBAdGltZW91dDogcG9pbnRlciB0byByZXF1ZXN0IHRpbWVvdXQgKG11c3Qgbm90IGJlIE5VTEwpCisgKgorICogU2V0IHVwIGFuIFJQQyBjbGllbnQgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhbiBSUEMgcHJvZ3JhbSBAcHJvZ3JhbQorICogYW5kIEB2ZXJzaW9uIG9uIHRoZSBzZXJ2ZXIgQHNhcCBvdmVyIEB0cmFuc3BvcnQuICBBIHByaXZpbGVnZWQKKyAqIHNvdXJjZSBwb3J0IGlzIHVzZWQuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBwcmVwYXJlZCBSUEMgY2xpZW50IGlmIHN1Y2Nlc3NmdWwsIGFuZAorICogQHRpbWVvdXQgaXMgaW5pdGlhbGl6ZWQ7IGNhbGxlciBtdXN0IGRlc3Ryb3kgYSBub24tTlVMTCByZXR1cm5lZCBSUEMKKyAqIGNsaWVudC4gIE90aGVyd2lzZSByZXR1cm5zIE5VTEwsIGFuZCBycGNfY3JlYXRlZXJyLmNmX3N0YXQgaXMgc2V0IHRvCisgKiByZWZsZWN0IHRoZSBlcnJvci4KKyAqLworQ0xJRU5UICpuZnNfZ2V0X3ByaXZfcnBjY2xpZW50KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJICAgICAgIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCB0cmFuc3BvcnQsCisJCQkgICAgICAgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sCisJCQkgICAgICAgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCQkgICAgICAgc3RydWN0IHRpbWV2YWwgKnRpbWVvdXQpCit7CisJbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIoKTsKKworCXN3aXRjaCAoc2FwLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0xPQ0FMOgorCQlyZXR1cm4gbmZzX2dldF9sb2NhbGNsaWVudChzYXAsIHNhbGVuLCBwcm9ncmFtLAorCQkJCQkJdmVyc2lvbiwgdGltZW91dCk7CisJY2FzZSBBRl9JTkVUOgorCWNhc2UgQUZfSU5FVDY6CisJCWlmIChuZnNfZ2V0X3BvcnQoc2FwKSA9PSAwKSB7CisJCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfVU5LTk9XTkFERFI7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfVU5LTk9XTkFERFI7CisJCXJldHVybiBOVUxMOworCX0KKworCXN3aXRjaCAodHJhbnNwb3J0KSB7CisJY2FzZSBJUFBST1RPX1RDUDoKKwkJcmV0dXJuIG5mc19nZXRfdGNwY2xpZW50KHNhcCwgc2FsZW4sIHByb2dyYW0sIHZlcnNpb24sCisJCQkJCQl0aW1lb3V0LCAxKTsKKwljYXNlIDA6CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJcmV0dXJuIG5mc19nZXRfdWRwY2xpZW50KHNhcCwgc2FsZW4sIHByb2dyYW0sIHZlcnNpb24sCisJCQkJCQl0aW1lb3V0LCAxKTsKKwl9CisKKwlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfVU5LTk9XTlBST1RPOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG5mc19nZXRycGNieW5hbWUgLSBjb252ZXJ0IGFuIFJQQyBwcm9ncmFtIG5hbWUgdG8gYSBycGNwcm9nX3QKKyAqIEBwcm9ncmFtOiBkZWZhdWx0IHByb2dyYW0gbnVtYmVyIHRvIHVzZSBpZiBuYW1lcyBub3QgZm91bmQgaW4gZGIKKyAqIEB0YWJsZTogcG9pbnRlciB0byB0YWJsZSBvZiAnY2hhciAqJyBuYW1lcyB0byB0cnkgdG8gZmluZAorICoKKyAqIFJldHVybnMgcHJvZ3JhbSBudW1iZXIgb2YgZmlyc3QgbmFtZSB0byBiZSBzdWNjZXNzZnVsbHkgbG9va2VkCisgKiB1cCwgb3IgdGhlIGRlZmF1bHQgcHJvZ3JhbSBudW1iZXIgaWYgYWxsIGxvb2t1cHMgZmFpbC4KKyAqLworcnBjcHJvZ190IG5mc19nZXRycGNieW5hbWUoY29uc3QgcnBjcHJvZ190IHByb2dyYW0sIGNvbnN0IGNoYXIgKnRhYmxlW10pCit7CisjaWZkZWYgSEFWRV9HRVRSUENCWU5BTUUKKwlzdHJ1Y3QgcnBjZW50ICplbnRyeTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh0YWJsZSAhPSBOVUxMKQorCQlmb3IgKGkgPSAwOyB0YWJsZVtpXSAhPSBOVUxMOyBpKyspIHsKKwkJCWVudHJ5ID0gZ2V0cnBjYnluYW1lKHRhYmxlW2ldKTsKKwkJCWlmIChlbnRyeSkKKwkJCQlyZXR1cm4gKHJwY3Byb2dfdCllbnRyeS0+cl9udW1iZXI7CisJCX0KKyNlbmRpZgkvKiBIQVZFX0dFVFJQQ0JZTkFNRSAqLworCisJcmV0dXJuIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvcnBjZGlzcGF0Y2guYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9ycGNkaXNwYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmZjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvcnBjZGlzcGF0Y2guYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogc3VwcG9ydC9uZnMvcmNwZGlzcGF0Y2guYworICoKKyAqIEdlbmVyaWMgUlBDIGRpc3BhdGNoZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJycGNtaXNjLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCit2b2lkCitycGNfZGlzcGF0Y2goc3RydWN0IHN2Y19yZXEgKnJxc3RwLCBTVkNYUFJUICp0cmFuc3AsCisJCQlzdHJ1Y3QgcnBjX2R0YWJsZSAqZHRhYmxlLCBpbnQgbnZlcnMsCisJCQl2b2lkICphcmdwLCB2b2lkICpyZXNwKQoreworCXN0cnVjdCBycGNfZGVudHJ5CSpkZW50OworCisJaWYgKHJxc3RwLT5ycV92ZXJzID4gbnZlcnMpIHsKKwkJc3ZjZXJyX3Byb2d2ZXJzKHRyYW5zcCwgMSwgbnZlcnMpOworCQlyZXR1cm47CisJfQorCWR0YWJsZSArPSAocnFzdHAtPnJxX3ZlcnMgLSAxKTsKKwlpZiAocnFzdHAtPnJxX3Byb2MgPiBkdGFibGUtPm5wcm9jKSB7CisJCXN2Y2Vycl9ub3Byb2ModHJhbnNwKTsKKwkJcmV0dXJuOworCX0KKworCWRlbnQgPSBkdGFibGUtPmVudHJpZXMgKyBycXN0cC0+cnFfcHJvYzsKKworCWlmIChkZW50LT5mdW5jID09IE5VTEwpIHsKKwkJc3ZjZXJyX25vcHJvYyh0cmFuc3ApOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KGFyZ3AsIDAsIGRlbnQtPnhkcl9hcmdfc2l6ZSk7CisJbWVtc2V0KHJlc3AsIDAsIGRlbnQtPnhkcl9yZXNfc2l6ZSk7CisKKwlpZiAoIXN2Y19nZXRhcmdzKHRyYW5zcCwgZGVudC0+eGRyX2FyZ19mbiwgYXJncCkpIHsKKwkJc3ZjZXJyX2RlY29kZSh0cmFuc3ApOworCQlyZXR1cm47CisJfQorCisJaWYgKChkZW50LT5mdW5jKShycXN0cCwgYXJncCwgcmVzcCkgJiYgcmVzcCAhPSAwKSB7CisJCWlmICghc3ZjX3NlbmRyZXBseSh0cmFuc3AsIGRlbnQtPnhkcl9yZXNfZm4sIChjYWRkcl90KXJlc3ApKSAKKwkJCXN2Y2Vycl9zeXN0ZW1lcnIodHJhbnNwKTsKKwl9CisJaWYgKCFzdmNfZnJlZWFyZ3ModHJhbnNwLCBkZW50LT54ZHJfYXJnX2ZuLCBhcmdwKSkgeworCQl4bG9nKExfRVJST1IsICJmYWlsZWQgdG8gZnJlZSBSUEMgYXJndW1lbnRzIik7CisJCWV4aXQgKDIpOworCX0KK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy9ycGNtaXNjLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvcnBjbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODU0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvcnBjbWlzYy5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTWlzY2VsbGFuZW91cyBmdW5jdGlvbnMgZm9yIFJQQyBzZXJ2aWNlIHN0YXJ0dXAgYW5kIHNodXRkb3duLgorICoKKyAqIFRoaXMgY29kZSBpcyBwYXJ0aWFsbHkgc25hcmZlZCBmcm9tIHJwY2dlbiAtcyB0Y3AgLXMgdWRwLAorICogcGFydGx5IHdyaXR0ZW4gYnkgTWFyayBTaGFuZCwgRG9uYWxkIEJlY2tlciwgYW5kIFJpY2sKKyAqIFNsYWRrZXkuIEl0IHdhcyB0d2Vha2VkIHNsaWdodGx5IGJ5IE9sYWYgS2lyY2ggdG8gYmUKKyAqIHVzYWJsZSBieSBib3RoIHVuZnNkIGFuZCBtb3VudGQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UgcHJvdmlkZWQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkLiAgSXQgaXMgc3VwcGxpZWQKKyAqIGFzIGlzLCB3aXRoIG5vIHdhcnJhbnR5IGV4cHJlc3NlZCBvciBpbXBsaWVkLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJuZnNsaWIuaCIKKworI2lmIFNJWkVPRl9TT0NLTEVOX1QgLSAwID09IDAKKyNkZWZpbmUgc29ja2xlbl90IGludAorI2VuZGlmCisKKyNkZWZpbmUgX1JQQ1NWQ19DTE9TRURPV04JMTIwCitpbnQJX3JwY3Btc3RhcnQgPSAwOworaW50CV9ycGNmZHR5cGUgPSAwOworaW50CV9ycGNzdmNkaXJ0eSA9IDA7CisKK3N0YXRpYyB2b2lkCitjbG9zZWRvd24oaW50IHNpZykKK3sKKwkodm9pZCkgc2lnbmFsKHNpZywgY2xvc2Vkb3duKTsKKworCWlmIChfcnBjc3ZjZGlydHkgPT0gMCkgeworCQlzdGF0aWMgaW50IHNpemU7CisJCWludCBpLCBvcGVuZmQ7CisKKwkJaWYgKF9ycGNmZHR5cGUgPT0gU09DS19ER1JBTSkKKwkJCWV4aXQoMCk7CisKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXNpemUgPSBnZXRkdGFibGVzaXplKCk7CisKKwkJZm9yIChpID0gMCwgb3BlbmZkID0gMDsgaSA8IHNpemUgJiYgb3BlbmZkIDwgMjsgaSsrKQorCQkJaWYgKEZEX0lTU0VUKGksICZzdmNfZmRzZXQpKQorCQkJCW9wZW5mZCsrOworCQlpZiAob3BlbmZkIDw9IDEpCisJCQlleGl0KDApOworCX0KKworCSh2b2lkKSBhbGFybShfUlBDU1ZDX0NMT1NFRE9XTik7Cit9CisKKy8qCisgKiBDcmVhdGUgbGlzdGVuZXIgc29ja2V0IGZvciBhIGdpdmVuIHBvcnQKKyAqCisgKiBSZXR1cm4gYW4gb3BlbiBuZXR3b3JrIHNvY2tldCBvbiBzdWNjZXNzOyBvdGhlcndpc2UgcmV0dXJuIC0xCisgKiBpZiBzb21lIGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludAorbWFrZXNvY2soaW50IHBvcnQsIGludCBwcm90bykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludAlzb2NrLCBzb2NrX3R5cGUsIHZhbDsKKworCXNvY2tfdHlwZSA9IChwcm90byA9PSBJUFBST1RPX1VEUCkgPyBTT0NLX0RHUkFNIDogU09DS19TVFJFQU07CisJc29jayA9IHNvY2tldChBRl9JTkVULCBzb2NrX3R5cGUsIHByb3RvKTsKKwlpZiAoc29jayA8IDApIHsKKwkJeGxvZyhMX0ZBVEFMLCAiQ291bGQgbm90IG1ha2UgYSBzb2NrZXQ6ICVzIiwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQoKGNoYXIgKikgJnNpbiwgMCwgc2l6ZW9mKHNpbikpOworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4uc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisJc2luLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKwl2YWwgPSAxOworCWlmIChwcm90byA9PSBJUFBST1RPX1RDUCkKKwkJaWYgKHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAorCQkJICAgICAgICZ2YWwsIHNpemVvZih2YWwpKSA8IDApCisJCQl4bG9nKExfRVJST1IsICJzZXRzb2Nrb3B0IGZhaWxlZDogJXMiLAorCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCisJaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2luLCBzaXplb2Yoc2luKSkgPT0gLTEpIHsKKwkJeGxvZyhMX0ZBVEFMLCAiQ291bGQgbm90IGJpbmQgbmFtZSB0byBzb2NrZXQ6ICVzIiwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBzb2NrOworfQorCit2b2lkCitycGNfaW5pdChjaGFyICpuYW1lLCBpbnQgcHJvZywgaW50IHZlcnMsCisJIHZvaWQgKCpkaXNwYXRjaCkoc3RydWN0IHN2Y19yZXEgKiwgcmVnaXN0ZXIgU1ZDWFBSVCAqKSwKKwkgaW50IGRlZnBvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCVNWQ1hQUlQJKnRyYW5zcDsKKwlpbnQJc29jazsKKwlzb2NrbGVuX3QgYXNpemU7CisKKwlhc2l6ZSA9IHNpemVvZihzYWRkcik7CisJc29jayA9IDA7CisJaWYgKGdldHNvY2tuYW1lKDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmYXNpemUpID09IDAKKwkgICAgJiYgc2FkZHIuc2luX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXNvY2tsZW5fdCBzc2l6ZSA9IHNpemVvZihpbnQpOworCQlpbnQgZmR0eXBlID0gMDsKKwkJaWYgKGdldHNvY2tvcHQoMCwgU09MX1NPQ0tFVCwgU09fVFlQRSwKKwkJCQkoY2hhciAqKSZmZHR5cGUsICZzc2l6ZSkgPT0gLTEpCisJCQl4bG9nKExfRkFUQUwsICJnZXRzb2Nrb3B0IGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkvKiBpbmV0ZCBwYXNzZXMgYSBVRFAgc29ja2V0IG9yIGEgbGlzdGVuaW5nIFRDUCBzb2NrZXQuCisJCSAqIGxpc3RlbiB3aWxsIGZhaWwgb24gYSBjb25uZWN0ZWQgVENQIHNvY2tldChwYXNzZWQgYnkgcnNoKS4KKwkJICovCisJCWlmICghKGZkdHlwZSA9PSBTT0NLX1NUUkVBTSAmJiBsaXN0ZW4oMCw1KSA9PSAtMSkpIHsKKwkJCV9ycGNmZHR5cGUgPSBmZHR5cGU7CisJCQlfcnBjcG1zdGFydCA9IDE7CisJCX0KKwl9CisJaWYgKCFfcnBjcG1zdGFydCkgeworCQlwbWFwX3Vuc2V0KHByb2csIHZlcnMpOworCQlzb2NrID0gUlBDX0FOWVNPQ0s7CisJfQorCisJaWYgKChfcnBjZmR0eXBlID09IDApIHx8IChfcnBjZmR0eXBlID09IFNPQ0tfREdSQU0pKSB7CisJCXN0YXRpYyBTVkNYUFJUICpsYXN0X3RyYW5zcCA9IE5VTEw7CisKKwkJaWYgKF9ycGNwbXN0YXJ0ID09IDApIHsKKwkJCWlmIChsYXN0X3RyYW5zcAorCQkJICAgICYmICghZGVmcG9ydCB8fCBkZWZwb3J0ID09IGxhc3RfdHJhbnNwLT54cF9wb3J0KSkgeworCQkJCXRyYW5zcCA9IGxhc3RfdHJhbnNwOworCQkJCWdvdG8gdWRwX3RyYW5zcG9ydDsKKwkJCX0KKwkJCWlmIChkZWZwb3J0ID09IDApCisJCQkJc29jayA9IFJQQ19BTllTT0NLOworCQkJZWxzZQorCQkJCXNvY2sgPSBtYWtlc29jayhkZWZwb3J0LCBJUFBST1RPX1VEUCk7CisJCX0KKwkJaWYgKHNvY2sgPT0gUlBDX0FOWVNPQ0spCisJCQlzb2NrID0gc3ZjdWRwX3NvY2tldCAocHJvZywgMSk7CisJCXRyYW5zcCA9IHN2Y3VkcF9jcmVhdGUoc29jayk7CisJCWlmICh0cmFuc3AgPT0gTlVMTCkgeworCQkJeGxvZyhMX0ZBVEFMLCAiY2Fubm90IGNyZWF0ZSB1ZHAgc2VydmljZS4iKTsKKwkJfQorICAgICAgdWRwX3RyYW5zcG9ydDoKKwkJaWYgKCFzdmNfcmVnaXN0ZXIodHJhbnNwLCBwcm9nLCB2ZXJzLCBkaXNwYXRjaCwgSVBQUk9UT19VRFApKSB7CisJCQl4bG9nKExfRkFUQUwsICJ1bmFibGUgdG8gcmVnaXN0ZXIgKCVzLCAlZCwgdWRwKS4iLAorCQkJCQluYW1lLCB2ZXJzKTsKKwkJfQorCQlsYXN0X3RyYW5zcCA9IHRyYW5zcDsKKwl9CisKKwlpZiAoKF9ycGNmZHR5cGUgPT0gMCkgfHwgKF9ycGNmZHR5cGUgPT0gU09DS19TVFJFQU0pKSB7CisJCXN0YXRpYyBTVkNYUFJUICpsYXN0X3RyYW5zcCA9IE5VTEw7CisKKwkJaWYgKF9ycGNwbXN0YXJ0ID09IDApIHsKKwkJCWlmIChsYXN0X3RyYW5zcAorCQkJICAgICYmICghZGVmcG9ydCB8fCBkZWZwb3J0ID09IGxhc3RfdHJhbnNwLT54cF9wb3J0KSkgeworCQkJCXRyYW5zcCA9IGxhc3RfdHJhbnNwOworCQkJCWdvdG8gdGNwX3RyYW5zcG9ydDsKKwkJCX0KKwkJCWlmIChkZWZwb3J0ID09IDApCisJCQkJc29jayA9IFJQQ19BTllTT0NLOworCQkJZWxzZQorCQkJCXNvY2sgPSBtYWtlc29jayhkZWZwb3J0LCBJUFBST1RPX1RDUCk7CisJCX0KKwkJaWYgKHNvY2sgPT0gUlBDX0FOWVNPQ0spCisJCQlzb2NrID0gc3ZjdGNwX3NvY2tldCAocHJvZywgMSk7CisJCXRyYW5zcCA9IHN2Y3RjcF9jcmVhdGUoc29jaywgMCwgMCk7CisJCWlmICh0cmFuc3AgPT0gTlVMTCkgeworCQkJeGxvZyhMX0ZBVEFMLCAiY2Fubm90IGNyZWF0ZSB0Y3Agc2VydmljZS4iKTsKKwkJfQorICAgICAgdGNwX3RyYW5zcG9ydDoKKwkJaWYgKCFzdmNfcmVnaXN0ZXIodHJhbnNwLCBwcm9nLCB2ZXJzLCBkaXNwYXRjaCwgSVBQUk9UT19UQ1ApKSB7CisJCQl4bG9nKExfRkFUQUwsICJ1bmFibGUgdG8gcmVnaXN0ZXIgKCVzLCAlZCwgdGNwKS4iLAorCQkJCQluYW1lLCB2ZXJzKTsKKwkJfQorCQlsYXN0X3RyYW5zcCA9IHRyYW5zcDsKKwl9CisKKwlpZiAoX3JwY3Btc3RhcnQpIHsKKwkJc2lnbmFsKFNJR0FMUk0sIGNsb3NlZG93bik7CisJCWFsYXJtKF9SUENTVkNfQ0xPU0VET1dOKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvc3ZjX2NyZWF0ZS5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3N2Y19jcmVhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJhNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3N2Y19jcmVhdGUuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmZzLXV0aWxzLgorICoKKyAqIG5mcy11dGlscyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbmZzLXV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBuZnMtdXRpbHMuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwYy9zdmMuaD4KKworI2lmZGVmIEhBVkVfVENQX1dSQVBQRVIKKyNpbmNsdWRlICJ0Y3B3cmFwcGVyLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInJwY21pc2MuaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisKKy8qCisgKiBTZXQgdXAgYW4gYXBwcm9wcmlhdGUgYmluZCBhZGRyZXNzLCBnaXZlbiBAcG9ydCBhbmQgQG5jb25mLgorICoKKyAqIFJldHVybnMgZ2V0YWRkcmluZm8oMykgcmVzdWx0cyBpZiBzdWNjZXNzZnVsLiAgQ2FsbGVyIG11c3QKKyAqIGludm9rZSBmcmVlYWRkcmluZm8oMykgb24gdGhlc2UgcmVzdWx0cy4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZCBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK19fYXR0cmlidXRlX21hbGxvY19fCitzdGF0aWMgc3RydWN0IGFkZHJpbmZvICoKK3N2Y19jcmVhdGVfYmluZGFkZHIoc3RydWN0IG5ldGNvbmZpZyAqbmNvbmYsIGNvbnN0IHVpbnQxNl90IHBvcnQpCit7CisJc3RydWN0IGFkZHJpbmZvICphaSA9IE5VTEw7CisJc3RydWN0IGFkZHJpbmZvIGhpbnQgPSB7CisJCS5haV9mbGFncwk9IEFJX1BBU1NJVkUgfCBBSV9OVU1FUklDU0VSViwKKwl9OworCWNoYXIgYnVmWzhdOworCWludCBlcnJvcjsKKworCWlmIChzdHJjbXAobmNvbmYtPm5jX3Byb3RvZm1seSwgTkNfSU5FVCkgPT0gMCkKKwkJaGludC5haV9mYW1pbHkgPSBBRl9JTkVUOworI2lmZGVmIElQVjZfU1VQUE9SVEVECisJZWxzZSBpZiAoc3RyY21wKG5jb25mLT5uY19wcm90b2ZtbHksIE5DX0lORVQ2KSA9PSAwKQorCQloaW50LmFpX2ZhbWlseSA9IEFGX0lORVQ2OworI2VuZGlmCS8qIElQVjZfU1VQUE9SVEVEICovCisJZWxzZSB7CisJCXhsb2coRF9HRU5FUkFMLCAiVW5yZWNvZ25pemVkIGJpbmQgYWRkcmVzcyBmYW1pbHk6ICVzIiwKKwkJCW5jb25mLT5uY19wcm90b2ZtbHkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc3RyY21wKG5jb25mLT5uY19wcm90bywgTkNfVURQKSA9PSAwKQorCQloaW50LmFpX3Byb3RvY29sID0gKGludClJUFBST1RPX1VEUDsKKwllbHNlIGlmIChzdHJjbXAobmNvbmYtPm5jX3Byb3RvLCBOQ19UQ1ApID09IDApCisJCWhpbnQuYWlfcHJvdG9jb2wgPSAoaW50KUlQUFJPVE9fVENQOworCWVsc2UgeworCQl4bG9nKERfR0VORVJBTCwgIlVucmVjb2duaXplZCBiaW5kIGFkZHJlc3MgcHJvdG9jb2w6ICVzIiwKKwkJCW5jb25mLT5uY19wcm90byk7CisJCXJldHVybiBOVUxMOworCX0KKworCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldSIsIHBvcnQpOworCWVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgYnVmLCAmaGludCwgJmFpKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gY29uc3RydWN0IGJpbmQgYWRkcmVzczogJXMiLAorCQkJZ2FpX3N0cmVycm9yKGVycm9yKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBhaTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc3ZjX2NyZWF0ZV9uY29uZihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwKKwkJY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCXZvaWQgKCpkaXNwYXRjaCkoc3RydWN0IHN2Y19yZXEgKiwgU1ZDWFBSVCAqKSwKKwkJY29uc3QgdWludDE2X3QgcG9ydCwgc3RydWN0IG5ldGNvbmZpZyAqbmNvbmYpCit7CisJc3RydWN0IHRfYmluZCBiaW5kYWRkcjsKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworCVNWQ1hQUlQJKnhwcnQ7CisKKwlhaSA9IHN2Y19jcmVhdGVfYmluZGFkZHIobmNvbmYsIHBvcnQpOworCWlmIChhaSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWJpbmRhZGRyLmFkZHIuYnVmID0gYWktPmFpX2FkZHI7CisJYmluZGFkZHIucWxlbiA9IFNPTUFYQ09OTjsKKworCXhwcnQgPSBzdmNfdGxpX2NyZWF0ZShSUENfQU5ZRkQsIG5jb25mLCAmYmluZGFkZHIsIDAsIDApOworCWZyZWVhZGRyaW5mbyhhaSk7CisJaWYgKHhwcnQgPT0gTlVMTCkgeworCQl4bG9nKERfR0VORVJBTCwgIkZhaWxlZCB0byBjcmVhdGUgbGlzdGVuZXIgeHBydCAiCisJCQkJIiglcywgJXUsICVzKSIsIG5hbWUsIHZlcnNpb24sIG5jb25mLT5uY19uZXRpZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3ZjX3JlZyh4cHJ0LCBwcm9ncmFtLCB2ZXJzaW9uLCBkaXNwYXRjaCwgbmNvbmYpKSB7CisJCS8qIHN2Y19yZWcoMykgZGVzdHJveXMgQHhwcnQgaW4gdGhpcyBjYXNlICovCisJCXhsb2coRF9HRU5FUkFMLCAiRmFpbGVkIHRvIHJlZ2lzdGVyICglcywgJXUsICVzKSIsCisJCQkJbmFtZSwgdmVyc2lvbiwgbmNvbmYtPm5jX25ldGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogbmZzX3N2Y19jcmVhdGUgLSBzdGFydCB1cCBSUEMgc3ZjIGxpc3RlbmVycworICogQG5hbWU6IEMgc3RyaW5nIGNvbnRhaW5pbmcgbmFtZSBvZiBuZXcgc2VydmljZQorICogQHByb2dyYW06IFJQQyBwcm9ncmFtIG51bWJlciB0byByZWdpc3RlcgorICogQHZlcnNpb246IFJQQyB2ZXJzaW9uIG51bWJlciB0byByZWdpc3RlcgorICogQGRpc3BhdGNoOiBhZGRyZXNzIG9mIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBpbmNvbWluZyBSUEMgcmVxdWVzdHMKKyAqIEBwb3J0OiBpZiBub3QgemVybywgdHJhbnNwb3J0IGxpc3RlbnMgb24gdGhpcyBwb3J0CisgKgorICogU2V0cyB1cCBuZXR3b3JrIHRyYW5zcG9ydHMgZm9yIHJlY2VpdmluZyBSUEMgcmVxdWVzdHMsIGFuZCBzdGFydHMKKyAqIHRoZSBSUEMgZGlzcGF0Y2hlci4gIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGFydGVkIG5ldHdvcmsgdHJhbnNwb3J0cy4KKyAqLwordW5zaWduZWQgaW50CituZnNfc3ZjX2NyZWF0ZShfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBjaGFyICpuYW1lLAorCQljb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwgY29uc3QgcnBjdmVyc190IHZlcnNpb24sCisJCXZvaWQgKCpkaXNwYXRjaCkoc3RydWN0IHN2Y19yZXEgKiwgU1ZDWFBSVCAqKSwKKwkJY29uc3QgdWludDE2X3QgcG9ydCkKK3sKKwljb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uIGNyZWF0ZV9zaWdhY3Rpb24gPSB7CisJCS5zYV9oYW5kbGVyCT0gU0lHX0lHTiwKKwl9OworCXVuc2lnbmVkIGludCB2aXNpYmxlLCB1cDsKKwlzdHJ1Y3QgbmV0Y29uZmlnICpuY29uZjsKKwl2b2lkICpoYW5kbGVwOworCisJLyoKKwkgKiBJZ25vcmUgU0lHUElQRSB0byBhdm9pZCBleGl0aW5nIHNpZGV3YXlzIHdoZW4gcGVlcnMKKwkgKiBjbG9zZSB0aGVpciBUQ1AgY29ubmVjdGlvbiB3aGlsZSB3ZSdyZSB0cnlpbmcgdG8gcmVwbHkKKwkgKiB0byB0aGVtLgorCSAqLworCSh2b2lkKXNpZ2FjdGlvbihTSUdQSVBFLCAmY3JlYXRlX3NpZ2FjdGlvbiwgTlVMTCk7CisKKwloYW5kbGVwID0gc2V0bmV0Y29uZmlnKCk7CisJaWYgKGhhbmRsZXAgPT0gTlVMTCkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gYWNjZXNzIGxvY2FsIG5ldGNvbmZpZyBkYXRhYmFzZTogJXMiLAorCQkJbmNfc3BlcnJvcigpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdmlzaWJsZSA9IDA7CisJdXAgPSAwOworCXdoaWxlICgobmNvbmYgPSBnZXRuZXRjb25maWcoaGFuZGxlcCkpICE9IE5VTEwpIHsKKwkJaWYgKCEobmNvbmYtPm5jX2ZsYWcgJiBOQ19WSVNJQkxFKSkKKwkJCWNvbnRpbnVlOworCQl2aXNpYmxlKys7CisJCXVwICs9IHN2Y19jcmVhdGVfbmNvbmYobmFtZSwgcHJvZ3JhbSwgdmVyc2lvbiwgZGlzcGF0Y2gsCisJCQkJCQlwb3J0LCBuY29uZik7CisJfQorCisJaWYgKHZpc2libGUgPT0gMCkKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgYW55IHZpc2libGUgbmV0Y29uZmlnIGVudHJpZXMiKTsKKworCWlmIChlbmRuZXRjb25maWcoaGFuZGxlcCkgPT0gLTEpCisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBjbG9zZSBsb2NhbCBuZXRjb25maWcgZGF0YWJhc2U6ICVzIiwKKwkJCW5jX3NwZXJyb3IoKSk7CisKKwlyZXR1cm4gdXA7Cit9CisKKy8qKgorICogbmZzX3N2Y191bnJlZ2lzdGVyIC0gcmVtb3ZlIHNlcnZpY2UgcmVnaXN0cmF0aW9ucyBmcm9tIGxvY2FsIHJwY2JpbmQgZGF0YWJhc2UKKyAqIEBwcm9ncmFtOiBSUEMgcHJvZ3JhbSBudW1iZXIgdG8gdW5yZWdpc3RlcgorICogQHZlcnNpb246IFJQQyB2ZXJzaW9uIG51bWJlciB0byB1bnJlZ2lzdGVyCisgKgorICogUmVtb3ZlcyBhbGwgcmVnaXN0cmF0aW9ucyBmb3IgWyBAcHJvZ3JhbSwgQHZlcnNpb24gXSAuCisgKi8KK3ZvaWQKK25mc19zdmNfdW5yZWdpc3Rlcihjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwgY29uc3QgcnBjdmVyc190IHZlcnNpb24pCit7CisJaWYgKHJwY2JfdW5zZXQocHJvZ3JhbSwgdmVyc2lvbiwgTlVMTCkgPT0gRkFMU0UpCisJCXhsb2coRF9HRU5FUkFMLCAiRmFpbGVkIHRvIHVucmVnaXN0ZXIgcHJvZ3JhbSAlbHUsIHZlcnNpb24gJWx1IiwKKwkJCSh1bnNpZ25lZCBsb25nKXByb2dyYW0sICh1bnNpZ25lZCBsb25nKXZlcnNpb24pOworfQorCisjZWxzZQkvKiAhSEFWRV9MSUJUSVJQQyAqLworCisvKioKKyAqIG5mc19zdmNfY3JlYXRlIC0gc3RhcnQgdXAgUlBDIHN2YyBsaXN0ZW5lcnMKKyAqIEBuYW1lOiBDIHN0cmluZyBjb250YWluaW5nIG5hbWUgb2YgbmV3IHNlcnZpY2UKKyAqIEBwcm9ncmFtOiBSUEMgcHJvZ3JhbSBudW1iZXIgdG8gcmVnaXN0ZXIKKyAqIEB2ZXJzaW9uOiBSUEMgdmVyc2lvbiBudW1iZXIgdG8gcmVnaXN0ZXIKKyAqIEBkaXNwYXRjaDogYWRkcmVzcyBvZiBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgaW5jb21pbmcgUlBDIHJlcXVlc3RzCisgKiBAcG9ydDogaWYgbm90IHplcm8sIHRyYW5zcG9ydCBsaXN0ZW5zIG9uIHRoaXMgcG9ydAorICoKKyAqIFNldHMgdXAgbmV0d29yayB0cmFuc3BvcnRzIGZvciByZWNlaXZpbmcgUlBDIHJlcXVlc3RzLCBhbmQgc3RhcnRzCisgKiB0aGUgUlBDIGRpc3BhdGNoZXIuICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RhcnRlZCBuZXR3b3JrIHRyYW5zcG9ydHMuCisgKi8KK3Vuc2lnbmVkIGludAorbmZzX3N2Y19jcmVhdGUoY2hhciAqbmFtZSwgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQl2b2lkICgqZGlzcGF0Y2gpKHN0cnVjdCBzdmNfcmVxICosIFNWQ1hQUlQgKiksCisJCWNvbnN0IHVpbnQxNl90IHBvcnQpCit7CisJcnBjX2luaXQobmFtZSwgKGludClwcm9ncmFtLCAoaW50KXZlcnNpb24sIGRpc3BhdGNoLCAoaW50KXBvcnQpOworCXJldHVybiAxOworfQorCisvKioKKyAqIG5mc19zdmNfdW5yZWdpc3RlciAtIHJlbW92ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbnMgZnJvbSBsb2NhbCBycGNiaW5kIGRhdGFiYXNlCisgKiBAcHJvZ3JhbTogUlBDIHByb2dyYW0gbnVtYmVyIHRvIHVucmVnaXN0ZXIKKyAqIEB2ZXJzaW9uOiBSUEMgdmVyc2lvbiBudW1iZXIgdG8gdW5yZWdpc3RlcgorICoKKyAqIFJlbW92ZXMgYWxsIHJlZ2lzdHJhdGlvbnMgZm9yIFsgQHByb2dyYW0sIEB2ZXJzaW9uIF0gLgorICovCit2b2lkCituZnNfc3ZjX3VucmVnaXN0ZXIoY29uc3QgcnBjcHJvZ190IHByb2dyYW0sIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uKQoreworCWlmIChwbWFwX3Vuc2V0KCh1bnNpZ25lZCBsb25nKXByb2dyYW0sICh1bnNpZ25lZCBsb25nKXZlcnNpb24pID09IEZBTFNFKQorCQl4bG9nKERfR0VORVJBTCwgIkZhaWxlZCB0byB1bnJlZ2lzdGVyIHByb2dyYW0gJWx1LCB2ZXJzaW9uICVsdSIsCisJCQkodW5zaWduZWQgbG9uZylwcm9ncmFtLCAodW5zaWduZWQgbG9uZyl2ZXJzaW9uKTsKK30KKworI2VuZGlmCS8qICFIQVZFX0xJQlRJUlBDICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvc3ZjX3NvY2tldC5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3N2Y19zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQyMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3N2Y19zb2NrZXQuYwpAQCAtMCwwICsxLDIwOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICAgMDIxMTEtMTMwNyBVU0EuICAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmZGVmIF9MSUJDCisjIGluY2x1ZGUgPGxpYmludGwuaD4KKyNlbHNlCisjIGlmbmRlZiBfCisjICBkZWZpbmUgXyhzKQkJCShzKQorIyBlbmRpZgorIyBkZWZpbmUgX19zb2NrZXQoZCwgdCwgcCkJc29ja2V0ICgoZCksICh0KSwgKHApKQorIyBkZWZpbmUgX19jbG9zZShmKQkJY2xvc2UgKChmKSkKKyNlbmRpZgorCitzdGF0aWMgaW50CitzdmNfc29ja2V0ICh1X2xvbmcgbnVtYmVyLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBpbnQgcmV1c2UpCit7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICBjaGFyIHJwY2RhdGEgWzEwMjRdLCBzZXJ2ZGF0YSBbMTAyNF07CisgIHN0cnVjdCBycGNlbnQgcnBjYnVmLCAqcnBjcDsKKyAgc3RydWN0IHNlcnZlbnQgc2VydmJ1ZiwgKnNlcnZwID0gTlVMTDsKKyAgaW50IHNvY2ssIHJldDsKKyAgY29uc3QgY2hhciAqcHJvdG8gPSBwcm90b2NvbCA9PSBJUFBST1RPX1RDUCA/ICJ0Y3AiIDogInVkcCI7CisKKyAgaWYgKChzb2NrID0gX19zb2NrZXQgKEFGX0lORVQsIHR5cGUsIHByb3RvY29sKSkgPCAwKQorICAgIHsKKyAgICAgIHBlcnJvciAoXygic3ZjX3NvY2tldDogc29ja2V0IGNyZWF0aW9uIHByb2JsZW0iKSk7CisgICAgICByZXR1cm4gc29jazsKKyAgICB9CisKKyAgaWYgKHJldXNlKQorICAgIHsKKyAgICAgIHJldCA9IDE7CisgICAgICByZXQgPSBzZXRzb2Nrb3B0IChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZyZXQsCisJCQlzaXplb2YgKHJldCkpOworICAgICAgaWYgKHJldCA8IDApCisJeworCSAgcGVycm9yIChfKCJzdmNfc29ja2V0OiBzb2NrZXQgcmV1c2UgcHJvYmxlbSIpKTsKKwkgIHJldHVybiByZXQ7CisJfQorICAgIH0KKworICBtZW1zZXQgKCZhZGRyLCAwLCBzaXplb2YgKGFkZHIpKTsKKyAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKworICByZXQgPSBnZXRycGNieW51bWJlcl9yIChudW1iZXIsICZycGNidWYsIHJwY2RhdGEsIHNpemVvZiBycGNkYXRhLAorCQkJICAmcnBjcCk7CisgIGlmIChyZXQgPT0gMCAmJiBycGNwICE9IE5VTEwpCisgICAgeworICAgICAgLyogRmlyc3QgdHJ5IG5hbWUuICAqLworICAgICAgcmV0ID0gZ2V0c2VydmJ5bmFtZV9yIChycGNwLT5yX25hbWUsIHByb3RvLCAmc2VydmJ1Ziwgc2VydmRhdGEsCisJCQkgICAgIHNpemVvZiBzZXJ2ZGF0YSwgJnNlcnZwKTsKKyAgICAgIGlmICgocmV0ICE9IDAgfHwgc2VydnAgPT0gTlVMTCkgJiYgcnBjcC0+cl9hbGlhc2VzKQorCXsKKwkgIGNvbnN0IGNoYXIgKiphOworCisJICAvKiBUaGVuIHdlIHRyeSBhbGlhc2VzLiAgKi8KKwkgIGZvciAoYSA9IChjb25zdCBjaGFyICoqKSBycGNwLT5yX2FsaWFzZXM7ICphICE9IE5VTEw7IGErKykgCisJICAgIHsKKwkgICAgICByZXQgPSBnZXRzZXJ2YnluYW1lX3IgKCphLCBwcm90bywgJnNlcnZidWYsIHNlcnZkYXRhLAorCQkJCSAgICAgc2l6ZW9mIHNlcnZkYXRhLCAmc2VydnApOworCSAgICAgIGlmIChyZXQgPT0gMCAmJiBzZXJ2cCAhPSBOVUxMKQorCQlicmVhazsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgaWYgKHJldCA9PSAwICYmIHNlcnZwICE9IE5VTEwpCisgICAgeworICAgICAgYWRkci5zaW5fcG9ydCA9IHNlcnZwLT5zX3BvcnQ7CisgICAgICBpZiAoYmluZCAoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgbGVuKSA8IDApCisJeworCSAgcGVycm9yIChfKCJzdmNfc29ja2V0OiBiaW5kIHByb2JsZW0iKSk7CisJICAodm9pZCkgX19jbG9zZSAoc29jayk7CisJICBzb2NrID0gLTE7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKwkgIGFkZHIuc2luX3BvcnQgPSAwOworCSAgaWYgKGJpbmQgKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIGxlbikgPCAwKQorCSAgICB7CisJICAgICAgcGVycm9yIChfKCJzdmNfc29ja2V0OiBiaW5kIHByb2JsZW0iKSk7CisJICAgICAgKHZvaWQpIF9fY2xvc2UgKHNvY2spOworCSAgICAgIHNvY2sgPSAtMTsKKwkgICAgfQorICAgIH0KKworICBpZiAoc29jayA+PSAwKQorICAgIHsKKwkgICAgLyogVGhpcyBzb2NrZXQgbWlnaHQgYmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIHByb2Nlc3NlcworCSAgICAgKiBpZiBtb3VudGQgaXMgcnVuIG11bHRpLXRocmVhZGVkLiAgU28gaXQgaXMgc2FmZXN0IHRvCisJICAgICAqIG1ha2UgaXQgbm9uLWJsb2NraW5nLCBlbHNlIGFsbCB0aHJlYWRzIG1pZ2h0IHdha2UKKwkgICAgICogb25lIHdpbGwgZ2V0IHRoZSBkYXRhLCBhbmQgdGhlIG90aGVycyB3aWxsIGJsb2NrCisJICAgICAqIGluZGVmaW5pdGVseS4KKwkgICAgICogSW4gYWxsIGNhc2VzLCB0cmFuc2FjdGlvbiBvbiB0aGlzIHNvY2tldCBhcmUgYXRvbWljCisJICAgICAqIChhY2NlcHQgZm9yIFRDUCwgcGFja2V0LXJlYWQgYW5kIHBhY2tldC13cml0ZSBmb3IgVURQKQorCSAgICAgKiBzbyBPX05PTkJMT0NLIHdpbGwgbm90IGNvbmZ1c2UgdW5wcmVwYXJlZCBjb2RlIGNhdXNpbmcKKwkgICAgICogaXQgdG8gY29ycnVwdCBtZXNzYWdlcy4KKwkgICAgICogSXQgZ2VuZXJhbGx5IHNhZmVzdCB0byBoYXZlIE9fTk9OQkxPQ0sgd2hlbiBkb2luZyBhbiBhY2NlcHQKKwkgICAgICogYXMgaWYgd2UgZ2V0IGEgUlNUIGFmdGVyIHRoZSBTWU4gYW5kIGJlZm9yZSBhY2NlcHQgcnVucywKKwkgICAgICogd2UgY2FuIGJsb2NrIGRlc3BpdGUgYmVpbmcgdG9sZCB0aGVyZSB3YXMgYW4gYWNjZXB0YWJsZQorCSAgICAgKiBjb25uZWN0aW9uLgorCSAgICAgKi8KKwlpbnQgZmxhZ3M7CisJaWYgKChmbGFncyA9IGZjbnRsKHNvY2ssIEZfR0VURkwpKSA8IDApCisJICB7CisJICAgICAgcGVycm9yIChfKCJzdmNfc29ja2V0OiBjYW4ndCBnZXQgc29ja2V0IGZsYWdzIikpOworCSAgICAgICh2b2lkKSBfX2Nsb3NlIChzb2NrKTsKKwkgICAgICBzb2NrID0gLTE7CisJICB9CisJZWxzZSBpZiAoZmNudGwoc29jaywgRl9TRVRGTCwgZmxhZ3N8T19OT05CTE9DSykgPCAwKQorCSAgeworCSAgICAgIHBlcnJvciAoXygic3ZjX3NvY2tldDogY2FuJ3Qgc2V0IHNvY2tldCBmbGFncyIpKTsKKwkgICAgICAodm9pZCkgX19jbG9zZSAoc29jayk7CisJICAgICAgc29jayA9IC0xOworCSAgfQorICAgIH0KKworICByZXR1cm4gc29jazsKK30KKworLyoKKyAqIENyZWF0ZSBhbmQgYmluZCBhIFRDUCBzb2NrZXQgYmFzZWQgb24gcHJvZ3JhbSBudW1iZXIKKyAqLworaW50CitzdmN0Y3Bfc29ja2V0ICh1X2xvbmcgbnVtYmVyLCBpbnQgcmV1c2UpCit7CisgIHJldHVybiBzdmNfc29ja2V0IChudW1iZXIsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgcmV1c2UpOworfQorCisvKgorICogQ3JlYXRlIGFuZCBiaW5kIGEgVURQIHNvY2tldCBiYXNlZCBvbiBwcm9ncmFtIG51bWJlcgorICovCitpbnQKK3N2Y3VkcF9zb2NrZXQgKHVfbG9uZyBudW1iZXIsIGludCByZXVzZSkKK3sKKyAgcmV0dXJuIHN2Y19zb2NrZXQgKG51bWJlciwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAsIDApOworfQorCisjaWZkZWYgVEVTVAorc3RhdGljIGludAorY2hlY2sgKHVfbG9uZyBudW1iZXIsIHVfc2hvcnQgcG9ydCwgaW50IHByb3RvY29sLCBpbnQgcmV1c2UpCit7CisgIGludCBzb2NrZXQ7CisgIGludCByZXN1bHQ7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCisgIGlmIChwcm90b2NvbCA9PSBJUFBST1RPX1RDUCkKKyAgICBzb2NrZXQgPSBzdmN0Y3Bfc29ja2V0IChudW1iZXIsIHJldXNlKTsKKyAgZWxzZQorICAgIHNvY2tldCA9IHN2Y3VkcF9zb2NrZXQgKG51bWJlciwgcmV1c2UpOworCisgIGlmIChzb2NrZXQgPCAwKQorICAgIHJldHVybiAxOworCisgIHJlc3VsdCA9IGdldHNvY2tuYW1lIChzb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsICZsZW4pOworICBpZiAocmVzdWx0ID09IDApCisgICAgeworICAgICAgaWYgKHBvcnQgIT0gMCAmJiBudG9ocyAoYWRkci5zaW5fcG9ydCkgIT0gcG9ydCkKKwlwcmludGYgKCJQcm9ncmFtOiAlbGQsIGV4cGVjdCBwb3J0OiAlZCwgZ290OiAlZFxuIiwKKwkJbnVtYmVyLCBwb3J0LCBudG9ocyAoYWRkci5zaW5fcG9ydCkpOyAKKyAgICAgIGVsc2UKKwlwcmludGYgKCJQcm9ncmFtOiAlbGQsIHBvcnQ6ICVkXG4iLAorCQludW1iZXIsIG50b2hzIChhZGRyLnNpbl9wb3J0KSk7IAorICAgIH0KKworICBjbG9zZSAoc29ja2V0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50CittYWluICh2b2lkKQoreworICBpbnQgcmVzdWx0ID0gMDsKKworICByZXN1bHQgKz0gY2hlY2sgKDEwMDAwMSwgMCwgSVBQUk9UT19UQ1AsIDApOworICByZXN1bHQgKz0gY2hlY2sgKDEwMDAwMSwgMCwgSVBQUk9UT19VRFAsIDApOworICByZXN1bHQgKz0gY2hlY2sgKDEwMDAwMywgMjA0OSwgSVBQUk9UT19UQ1AsIDEpOworICByZXN1bHQgKz0gY2hlY2sgKDEwMDAwMywgMjA0OSwgSVBQUk9UT19VRFAsIDEpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy93aWxkbWF0LmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvd2lsZG1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjRjNzgKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMvd2lsZG1hdC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKiAgJFJldmlzaW9uOiAwLjIuMTguMSAkCisqKgorKiogIERvIHNoZWxsLXN0eWxlIHBhdHRlcm4gbWF0Y2hpbmcgZm9yID8sIFwsIFtdLCBhbmQgKiBjaGFyYWN0ZXJzLgorKiogIE1pZ2h0IG5vdCBiZSByb2J1c3QgaW4gZmFjZSBvZiBtYWxmb3JtZWQgcGF0dGVybnM7IGUuZy4sICJmb29bYS0iCisqKiAgY291bGQgY2F1c2UgYSBzZWdtZW50YXRpb24gdmlvbGF0aW9uLiAgSXQgaXMgOGJpdCBjbGVhbi4KKyoqCisqKiAgV3JpdHRlbiBieSBSaWNoICRhbHosIG1pcnJvciFycywgV2VkIE5vdiAyNiAxOTowMzoxNyBFU1QgMTk4Ni4KKyoqICBSaWNoICRhbHogaXMgbm93IDxyc2FsekBvc2Yub3JnPi4KKyoqICBBcHJpbCwgMTk5MTogIFJlcGxhY2VkIG11dHVhbGx5LXJlY3Vyc2l2ZSBjYWxscyB3aXRoIGluLWxpbmUgY29kZQorKiogIGZvciB0aGUgc3RhciBjaGFyYWN0ZXIuCisqKgorKiogIFNwZWNpYWwgdGhhbmtzIHRvIExhcnMgTWF0aGllc2VuIDx0aG9yaW5uQGRpa3UuZGs+IGZvciB0aGUgQUJPUlQgY29kZS4KKyoqICBUaGlzIGNhbiBncmVhdGx5IHNwZWVkIHVwIGZhaWxpbmcgd2lsZGNhcmQgcGF0dGVybnMuICBGb3IgZXhhbXBsZToKKyoqCXBhdHRlcm46IC0qLSotKi0qLSotKi0xMi0qLSotKi1tLSotKi0qCisqKgl0ZXh0IDE6CSAtYWRvYmUtY291cmllci1ib2xkLW8tbm9ybWFsLS0xMi0xMjAtNzUtNzUtbS03MC1pc284ODU5LTEKKyoqCXRleHQgMjoJIC1hZG9iZS1jb3VyaWVyLWJvbGQtby1ub3JtYWwtLTEyLTEyMC03NS03NS1YLTcwLWlzbzg4NTktMQorKiogIFRleHQgMSBtYXRjaGVzIHdpdGggNTEgY2FsbHMsIHdoaWxlIHRleHQgMiBmYWlscyB3aXRoIDU0IGNhbGxzLiAgV2l0aG91dAorKiogIHRoZSBBQk9SVCBjb2RlLCBpdCB0YWtlcyAyMjMxMCBjYWxscyB0byBmYWlsLiAgVWdoLiAgVGhlIGZvbGxvd2luZworKiogIGV4cGxhbmF0aW9uIGlzIGZyb20gTGFyczoKKyoqICBUaGUgcHJlY29uZGl0aW9uIHRoYXQgbXVzdCBiZSBmdWxmaWxsZWQgaXMgdGhhdCBEb01hdGNoIHdpbGwgY29uc3VtZQorKiogIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGV4dC4gIFRoaXMgaXMgdHJ1ZSBpZiAqcCBpcyBuZWl0aGVyICcqJyBub3IKKyoqICAnXDAnLikgIFRoZSBsYXN0IHJldHVybiBoYXMgQUJPUlQgaW5zdGVhZCBvZiBGQUxTRSB0byBhdm9pZCBxdWFkcmF0aWMKKyoqICBiZWhhdmlvdXIgaW4gY2FzZXMgbGlrZSBwYXR0ZXJuICIqYSpiKmMqZCIgd2l0aCB0ZXh0ICJhYmN4eHh4eCIuICBXaXRoCisqKiAgRkFMU0UsIGVhY2ggc3Rhci1sb29wIGhhcyB0byBydW4gdG8gdGhlIGVuZCBvZiB0aGUgdGV4dDsgd2l0aCBBQk9SVAorKiogIG9ubHkgdGhlIGxhc3Qgb25lIGRvZXMuCisqKgorKiogIE9uY2UgdGhlIGNvbnRyb2wgb2Ygb25lIGluc3RhbmNlIG9mIERvTWF0Y2ggZW50ZXJzIHRoZSBzdGFyLWxvb3AsIHRoYXQKKyoqICBpbnN0YW5jZSB3aWxsIHJldHVybiBlaXRoZXIgVFJVRSBvciBBQk9SVCwgYW5kIGFueSBjYWxsaW5nIGluc3RhbmNlCisqKiAgd2lsbCB0aGVyZWZvcmUgcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyICh3aXRob3V0IGNhbGxpbmcgcmVjdXJzaXZlbHkKKyoqICBhZ2FpbikuICBJbiBlZmZlY3QsIG9ubHkgb25lIHN0YXItbG9vcCBpcyBldmVyIGFjdGl2ZS4gIEl0IHdvdWxkIGJlCisqKiAgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBjb2RlIHRvIG1haW50YWluIHRoaXMgY29udGV4dCBleHBsaWNpdGx5LAorKiogIGVsaW1pbmF0aW5nIGFsbCByZWN1cnNpdmUgY2FsbHMgYXQgdGhlIGNvc3Qgb2Ygc29tZSBjb21wbGljYXRpb24gYW5kCisqKiAgbG9zcyBvZiBjbGFyaXR5IChhbmQgdGhlIEFCT1JUIHN0dWZmIHNlZW1zIHRvIGJlIHVuY2xlYXIgZW5vdWdoIGJ5CisqKiAgaXRzZWxmKS4gIEkgdGhpbmsgaXQgd291bGQgYmUgdW53aXNlIHRvIHRyeSB0byBnZXQgdGhpcyBpbnRvIGEKKyoqICByZWxlYXNlZCB2ZXJzaW9uIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgdGVzdCBkYXRhIGJhc2UgdG8gdHJ5IGl0IG91dAorKiogIG9uLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2RlZmluZSBUUlVFCQkJMQorI2RlZmluZSBGQUxTRQkJCTAKKyNkZWZpbmUgQUJPUlQJCQktMQorCisKKyAgICAvKiBXaGF0IGNoYXJhY3RlciBtYXJrcyBhbiBpbnZlcnRlZCBjaGFyYWN0ZXIgY2xhc3M/ICovCisjZGVmaW5lIE5FR0FURV9DTEFTUwkJJ14nCisgICAgLyogSXMgIioiIGEgY29tbW9uIHBhdHRlcm4/ICovCisjZGVmaW5lIE9QVElNSVpFX0pVU1RfU1RBUgorICAgIC8qIERvIHRhcigxKSBtYXRjaGluZyBydWxlcywgd2hpY2ggaWdub3JlIGEgdHJhaWxpbmcgc2xhc2g/ICovCisjdW5kZWYgTUFUQ0hfVEFSX1BBVFRFUk4KKworCisvKgorKiogIE1hdGNoIHRleHQgYW5kIHAsIHJldHVybiBUUlVFLCBGQUxTRSwgb3IgQUJPUlQuCisqLworc3RhdGljIGludAorRG9NYXRjaChjaGFyICp0ZXh0LCBjaGFyICpwKQoreworICAgIHJlZ2lzdGVyIGludAlsYXN0OworICAgIHJlZ2lzdGVyIGludAltYXRjaGVkOworICAgIHJlZ2lzdGVyIGludAlyZXZlcnNlOworCisgICAgZm9yICggOyAqcDsgdGV4dCsrLCBwKyspIHsKKwlpZiAoKnRleHQgPT0gJ1wwJyAmJiAqcCAhPSAnKicpCisJICAgIHJldHVybiBBQk9SVDsKKwlzd2l0Y2ggKCpwKSB7CisJY2FzZSAnXFwnOgorCSAgICAvKiBMaXRlcmFsIG1hdGNoIHdpdGggZm9sbG93aW5nIGNoYXJhY3Rlci4gKi8KKwkgICAgcCsrOworCSAgICAvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJICAgIGlmICh0b3VwcGVyICgqdGV4dCkgIT0gdG91cHBlciAoKnApKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIGNvbnRpbnVlOworCWNhc2UgJz8nOgorCSAgICAvKiBNYXRjaCBhbnl0aGluZy4gKi8KKwkgICAgY29udGludWU7CisJY2FzZSAnKic6CisJICAgIHdoaWxlICgqKytwID09ICcqJykKKwkJLyogQ29uc2VjdXRpdmUgc3RhcnMgYWN0IGp1c3QgbGlrZSBvbmUuICovCisJCWNvbnRpbnVlOworCSAgICBpZiAoKnAgPT0gJ1wwJykKKwkJLyogVHJhaWxpbmcgc3RhciBtYXRjaGVzIGV2ZXJ5dGhpbmcuICovCisJCXJldHVybiBUUlVFOworCSAgICB3aGlsZSAoKnRleHQpCisJCWlmICgobWF0Y2hlZCA9IERvTWF0Y2godGV4dCsrLCBwKSkgIT0gRkFMU0UpCisJCSAgICByZXR1cm4gbWF0Y2hlZDsKKwkgICAgcmV0dXJuIEFCT1JUOworCWNhc2UgJ1snOgorCSAgICByZXZlcnNlID0gcFsxXSA9PSBORUdBVEVfQ0xBU1MgPyBUUlVFIDogRkFMU0U7CisJICAgIGlmIChyZXZlcnNlKQorCQkvKiBJbnZlcnRlZCBjaGFyYWN0ZXIgY2xhc3MuICovCisJCXArKzsKKwkgICAgbWF0Y2hlZCA9IEZBTFNFOworCSAgICBpZiAocFsxXSA9PSAnXScgfHwgcFsxXSA9PSAnLScpCisJCWlmICh0b3VwcGVyICgqKytwKSA9PSB0b3VwcGVyKCp0ZXh0KSkKKwkJICAgIG1hdGNoZWQgPSBUUlVFOworCSAgICBmb3IgKGxhc3QgPSAqcDsgKisrcCAmJiAqcCAhPSAnXSc7IGxhc3QgPSAqcCkKKwkJLyogVGhpcyBuZXh0IGxpbmUgcmVxdWlyZXMgYSBnb29kIEMgY29tcGlsZXIuICovCisJCWlmICgqcCA9PSAnLScgJiYgcFsxXSAhPSAnXScKKwkJICAgID8gKnRleHQgPD0gKisrcCAmJiAqdGV4dCA+PSBsYXN0CisJCSAgICAgIDogdG91cHBlciAoKnRleHQpID09IHRvdXBwZXIgKCpwKSkKKwkJICAgIG1hdGNoZWQgPSBUUlVFOworCSAgICBpZiAobWF0Y2hlZCA9PSByZXZlcnNlKQorCQlyZXR1cm4gRkFMU0U7CisJICAgIGNvbnRpbnVlOworCX0KKyAgICB9CisKKyNpZmRlZglNQVRDSF9UQVJfUEFUVEVSTgorICAgIGlmICgqdGV4dCA9PSAnLycpCisJcmV0dXJuIFRSVUU7CisjZW5kaWYJLyogTUFUQ0hfVEFSX0FUVEVSTiAqLworICAgIHJldHVybiAqdGV4dCA9PSAnXDAnOworfQorCisKKy8qCisqKiAgVXNlci1sZXZlbCByb3V0aW5lLiAgUmV0dXJucyBUUlVFIG9yIEZBTFNFLgorKi8KK2ludAord2lsZG1hdChjaGFyICp0ZXh0LCBjaGFyICpwKQoreworI2lmZGVmCU9QVElNSVpFX0pVU1RfU1RBUgorICAgIGlmIChwWzBdID09ICcqJyAmJiBwWzFdID09ICdcMCcpCisJcmV0dXJuIFRSVUU7CisjZW5kaWYJLyogT1BUSU1JWkVfSlVTVF9TVEFSICovCisgICAgcmV0dXJuIERvTWF0Y2godGV4dCwgcCkgPT0gVFJVRTsKK30KKworDAorCisjaWYJZGVmaW5lZChURVNUKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFllcywgd2UgdXNlIGdldHMgbm90IGZnZXRzLiAgU3VlIG1lLiAqLworZXh0ZXJuIGNoYXIJKmdldHMoKTsKKworCitpbnQKK21haW4oKQoreworICAgIGNoYXIJIHBbODBdOworICAgIGNoYXIJIHRleHRbODBdOworCisgICAgcHJpbnRmKCJXaWxkbWF0IHRlc3Rlci4gIEVudGVyIHBhdHRlcm4sIHRoZW4gc3RyaW5ncyB0byB0ZXN0LlxuIik7CisgICAgcHJpbnRmKCJBIGJsYW5rIGxpbmUgZ2V0cyBwcm9tcHRzIGZvciBhIG5ldyBwYXR0ZXJuOyBhIGJsYW5rIHBhdHRlcm5cbiIpOworICAgIHByaW50ZigiZXhpdHMgdGhlIHByb2dyYW0uXG4iKTsKKworICAgIGZvciAoIDsgOyApIHsKKwlwcmludGYoIlxuRW50ZXIgcGF0dGVybjogICIpOworCSh2b2lkKWZmbHVzaChzdGRvdXQpOworCWlmIChnZXRzKHApID09IE5VTEwgfHwgcFswXSA9PSAnXDAnKQorCSAgICBicmVhazsKKwlmb3IgKCA7IDsgKSB7CisJICAgIHByaW50ZigiRW50ZXIgdGV4dDogICIpOworCSAgICAodm9pZClmZmx1c2goc3Rkb3V0KTsKKwkgICAgaWYgKGdldHModGV4dCkgPT0gTlVMTCkKKwkJZXhpdCgwKTsKKwkgICAgaWYgKHRleHRbMF0gPT0gJ1wwJykKKwkJLyogQmxhbmsgbGluZTsgZ28gYmFjayBhbmQgZ2V0IGEgbmV3IHBhdHRlcm4uICovCisJCWJyZWFrOworCSAgICBwcmludGYoIiAgICAgICVzXG4iLCB3aWxkbWF0KHRleHQsIHApID8gIllFUyIgOiAiTk8iKTsKKwl9CisgICAgfQorCisgICAgZXhpdCgwKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCit9CisjZW5kaWYJLyogZGVmaW5lZChURVNUKSAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3hjb21tb24uYyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy94Y29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2MmEwNwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25mcy94Y29tbW9uLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiB4Y29tbW9uLmMgLSB2YXJpb3VzIGZ1bmN0aW9ucyBwdXQgdG9nZXRoZXIgdG8gYXZvaWQgYmFzaWMgZXJyb3IgY2hlY2tpbmcuCisgKgorICogYWRkZWQgZmNudGwgbG9ja2luZyBieSBLamV0aWwgVC4gKGtqZXRpbGhvQG1hdGgudWlvLm5vKSAtIGFlYiwgOTUwOTI3CisgKgorICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CisgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKgorICogMjAwNi0wNi0wNiBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorICogLSBNb3ZlZCBjb2RlIHNuaXBwZXRzIGhlcmUgZnJvbSBtb3VudC9zdW5kcmllcy5jIG9mIHV0aWwtbGludXgKKyAqICAgYW5kIG1lcmdlZCBjb2RlIGZyb20gc3VwcG9ydC9uZnMveG1hbGxvYy5jIGJ5IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPiBoZXJlLgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ4Y29tbW9uLmgiCisjaW5jbHVkZSAibmxzLmgiCS8qIF8oKSAqLworCit2b2lkICgqYXRfZGllKSh2b2lkICkgPSBOVUxMOworCitjaGFyICoKK3hzdHJuZHVwIChjb25zdCBjaGFyICpzLCBpbnQgbikgeworICAgICBjaGFyICp0OworCisgICAgIGlmIChzID09IE5VTEwpCisJICBkaWUgKEVYX1NPRlRXQVJFLCBfKCJidWcgaW4geHN0cm5kdXAgY2FsbCIpKTsKKworICAgICB0ID0geG1hbGxvYyhuKzEpOworICAgICBzdHJuY3B5KHQscyxuKTsKKyAgICAgdFtuXSA9IDA7CisKKyAgICAgcmV0dXJuIHQ7Cit9CisKK2NoYXIgKgoreHN0cmNvbmNhdDIgKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQpIHsKKyAgICAgY2hhciAqcmVzOworCisgICAgIGlmICghcykgcyA9ICIiOworICAgICBpZiAoIXQpIHQgPSAiIjsKKyAgICAgcmVzID0geG1hbGxvYyhzdHJsZW4ocykgKyBzdHJsZW4odCkgKyAxKTsKKyAgICAgc3RyY3B5KHJlcywgcyk7CisgICAgIHN0cmNhdChyZXMsIHQpOworICAgICByZXR1cm4gcmVzOworfQorCisvKiBmcmVlcyBpdHMgZmlyc3QgYXJnIC0gdHlwaWNhbCB1c2U6IHMgPSB4c3RyY29uY2F0MyhzLHQsdSk7ICovCitjaGFyICoKK3hzdHJjb25jYXQzIChjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICp0LCBjb25zdCBjaGFyICp1KSB7CisgICAgIGNoYXIgKnJlczsKKworICAgICBpZiAoIXMpIHMgPSAiIjsKKyAgICAgaWYgKCF0KSB0ID0gIiI7CisgICAgIGlmICghdSkgdSA9ICIiOworICAgICByZXMgPSB4bWFsbG9jKHN0cmxlbihzKSArIHN0cmxlbih0KSArIHN0cmxlbih1KSArIDEpOworICAgICBzdHJjcHkocmVzLCBzKTsKKyAgICAgc3RyY2F0KHJlcywgdCk7CisgICAgIHN0cmNhdChyZXMsIHUpOworICAgICBmcmVlKCh2b2lkICopIHMpOworICAgICByZXR1cm4gcmVzOworfQorCisvKiBmcmVlcyBpdHMgZmlyc3QgYXJnIC0gdHlwaWNhbCB1c2U6IHMgPSB4c3RyY29uY2F0NChzLHQsdSx2KTsgKi8KK2NoYXIgKgoreHN0cmNvbmNhdDQgKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKnQsIGNvbnN0IGNoYXIgKnUsIGNvbnN0IGNoYXIgKnYpIHsKKyAgICAgY2hhciAqcmVzOworCisgICAgIGlmICghcykgcyA9ICIiOworICAgICBpZiAoIXQpIHQgPSAiIjsKKyAgICAgaWYgKCF1KSB1ID0gIiI7CisgICAgIGlmICghdikgdiA9ICIiOworICAgICByZXMgPSB4bWFsbG9jKHN0cmxlbihzKSArIHN0cmxlbih0KSArIHN0cmxlbih1KSArIHN0cmxlbih2KSArIDEpOworICAgICBzdHJjcHkocmVzLCBzKTsKKyAgICAgc3RyY2F0KHJlcywgdCk7CisgICAgIHN0cmNhdChyZXMsIHUpOworICAgICBzdHJjYXQocmVzLCB2KTsKKyAgICAgZnJlZSgodm9pZCAqKSBzKTsKKyAgICAgcmV0dXJuIHJlczsKK30KKworLyogTm9uLWZhdGFsIGVycm9yLiAgUHJpbnQgbWVzc2FnZSBhbmQgcmV0dXJuLiAgKi8KKy8qIChwcmludCB0aGUgbWVzc2FnZSBpbiBhIHNpbmdsZSBwcmludGYsIGluIGFuIGF0dGVtcHQKKyAgICB0byBhdm9pZCBtaXhpbmcgb3V0cHV0IG9mIHNldmVyYWwgdGhyZWFkcykgKi8KK3ZvaWQKK25mc19lcnJvciAoY29uc3QgY2hhciAqZm10LCAuLi4pIHsKKyAgICAgdmFfbGlzdCBhcmdzOworICAgICBjaGFyICpmbXQyOworCisgICAgIGZtdDIgPSB4c3RyY29uY2F0MiAoZm10LCAiXG4iKTsKKyAgICAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisgICAgIHZmcHJpbnRmIChzdGRlcnIsIGZtdDIsIGFyZ3MpOworICAgICB2YV9lbmQgKGFyZ3MpOworICAgICBmcmVlIChmbXQyKTsKK30KKworLyogTWFrZSBhIGNhbm9uaWNhbCBwYXRobmFtZSBmcm9tIFBBVEguICBSZXR1cm5zIGEgZnJlc2hseSBtYWxsb2NlZCBzdHJpbmcuCisgICBJdCBpcyB1cCB0aGUgKmNhbGxlciogdG8gZW5zdXJlIHRoYXQgdGhlIFBBVEggaXMgc2Vuc2libGUuICBpLmUuCisgICBjYW5vbmljYWxpemUgKCIvZGV2L2ZkMC8uIikgcmV0dXJucyAiL2Rldi9mZDAiIGV2ZW4gdGhvdWdoIGBgL2Rldi9mZDAvLicnCisgICBpcyBub3QgYSBsZWdhbCBwYXRobmFtZSBmb3IgYGAvZGV2L2ZkMCcnLiAgQW55dGhpbmcgd2UgY2Fubm90IHBhcnNlCisgICB3ZSByZXR1cm4gdW5tb2RpZmllZC4gICAqLworY2hhciAqY2Fub25pY2FsaXplIChjb25zdCBjaGFyICpwYXRoKSB7CisJY2hhciBjYW5vbmljYWxbUEFUSF9NQVgrMl07CisKKwlpZiAocGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworI2lmIDEKKwlpZiAoc3RyZXEocGF0aCwgIm5vbmUiKSB8fAorCSAgICBzdHJlcShwYXRoLCAicHJvYyIpIHx8CisJICAgIHN0cmVxKHBhdGgsICJkZXZwdHMiKSkKKwkJcmV0dXJuIHhzdHJkdXAocGF0aCk7CisjZW5kaWYKKwlpZiAocmVhbHBhdGggKHBhdGgsIGNhbm9uaWNhbCkpCisJCXJldHVybiB4c3RyZHVwKGNhbm9uaWNhbCk7CisKKwlyZXR1cm4geHN0cmR1cChwYXRoKTsKK30KKworLyogRmF0YWwgZXJyb3IuICBQcmludCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KK3ZvaWQKK2RpZShpbnQgZXJyLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAoYXRfZGllKQorCQkoKmF0X2RpZSkoKTsKKworCWV4aXQoZXJyKTsKK30KKworc3RhdGljIHZvaWQKK2RpZV9pZl9udWxsKHZvaWQgKnQpIHsKKwlpZiAodCA9PSBOVUxMKQorCQlkaWUoRVhfU1lTRVJSLCBfKCJub3QgZW5vdWdoIG1lbW9yeSIpKTsKK30KKwordm9pZCAqCit4bWFsbG9jIChzaXplX3Qgc2l6ZSkgeworCXZvaWQgKnQ7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXQgPSBtYWxsb2Moc2l6ZSk7CisJZGllX2lmX251bGwodCk7CisKKwlyZXR1cm4gdDsKK30KKwordm9pZCAqCit4cmVhbGxvYyAodm9pZCAqcCwgc2l6ZV90IHNpemUpIHsKKwl2b2lkICp0OworCisJdCA9IHJlYWxsb2MocCwgc2l6ZSk7CisJZGllX2lmX251bGwodCk7CisKKwlyZXR1cm4gdDsKK30KKwordm9pZAoreGZyZWUodm9pZCAqcHRyKQoreworCWZyZWUocHRyKTsKK30KKworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzKSB7CisJY2hhciAqdDsKKworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdCA9IHN0cmR1cChzKTsKKwlkaWVfaWZfbnVsbCh0KTsKKworCXJldHVybiB0OworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3hpby5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3hpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDI3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMveGlvLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBzdXBwb3J0L25mcy94aW8uYworICogCisgKiBTaW1wbGUgSS9PIGZ1bmN0aW9ucyBmb3IgdGhlIHBhcnNpbmcgb2YgL2V0Yy9leHBvcnRzIGFuZCAvZXRjL25mc2NsaWVudHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisjaW5jbHVkZSAieGlvLmgiCisKK1hGSUxFICoKK3hmb3BlbihjaGFyICpmbmFtZSwgY2hhciAqdHlwZSkKK3sKKwlYRklMRQkqeGZwOworCUZJTEUJKmZwOworCisJaWYgKCEoZnAgPSBmb3BlbihmbmFtZSwgdHlwZSkpKQorCQlyZXR1cm4gTlVMTDsKKwl4ZnAgPSAoWEZJTEUgKikgeG1hbGxvYyhzaXplb2YoKnhmcCkpOworCXhmcC0+eF9mcCA9IGZwOworCXhmcC0+eF9saW5lID0gMTsKKworCXJldHVybiB4ZnA7Cit9CisKK3ZvaWQKK3hmY2xvc2UoWEZJTEUgKnhmcCkKK3sKKwlmY2xvc2UoeGZwLT54X2ZwKTsKKwl4ZnJlZSh4ZnApOworfQorCitpbnQKK3hmbG9jayhjaGFyICpmbmFtZSwgY2hhciAqdHlwZSkKK3sKKwlpbnQJCXJlYWRvbmx5ID0gIXN0cmNtcCh0eXBlLCAiciIpOworCXN0cnVjdCBmbG9jawlmbCA9IHsgcmVhZG9ubHk/IEZfUkRMQ0sgOiBGX1dSTENLLCBTRUVLX1NFVCwgMCwgMCwgMCB9OworCWludAkJZmQ7CisKKwlpZiAocmVhZG9ubHkpCisJCWZkID0gb3BlbihmbmFtZSwgKE9fUkRPTkxZfE9fQ1JFQVQpLCAwNjAwKTsKKwllbHNlCisJCWZkID0gb3BlbihmbmFtZSwgKE9fUkRXUnxPX0NSRUFUKSwgMDYwMCk7CisJaWYgKGZkIDwgMCkgeworCQl4bG9nKExfV0FSTklORywgImNvdWxkIG5vdCBvcGVuICVzIGZvciBsb2NraW5nOiBlcnJubyAlZCAoJXMpIiwKKwkJCQlmbmFtZSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZmNudGwoZmQsIEZfU0VUTEtXLCAmZmwpIDwgMCkgeworCQl4bG9nKExfV0FSTklORywgImZhaWxlZCB0byBsb2NrICVzOiBlcnJubyAlZCAoJXMpIiwKKwkJCQlmbmFtZSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJZmQgPSAtMTsKKwl9CisKKwlyZXR1cm4gZmQ7Cit9CisKK3ZvaWQKK3hmdW5sb2NrKGludCBmZCkKK3sKKwljbG9zZShmZCk7Cit9CisKKyNkZWZpbmUgaXNvY3RhbCh4KSAoaXNkaWdpdCh4KSAmJiAoKHgpPCc4JykpCitpbnQKK3hnZXR0b2soWEZJTEUgKnhmcCwgY2hhciBzZXBhLCBjaGFyICp0b2ssIGludCBsZW4pCit7CisJaW50CWkgPSAwOworCWludAljID0gMDsKKwlpbnQgCXF1b3RlZD0wOworCisJd2hpbGUgKGkgPCBsZW4gJiYgKGMgPSB4Z2V0Yyh4ZnApKSAhPSBFT0YgJiYKKwkgICAgICAgKHF1b3RlZCB8fCAoYyAhPSBzZXBhICYmICFpc3NwYWNlKGMpKSkpIHsKKwkJaWYgKGMgPT0gJyInKSB7CisJCQlxdW90ZWQgPSAhcXVvdGVkOworCQkJY29udGludWU7CisJCX0KKwkJdG9rW2krK10gPSBjOworCQlpZiAoaSA+PSA0ICYmCisJCSAgICB0b2tbaS00XSA9PSAnXFwnICYmCisJCSAgICBpc29jdGFsKHRva1tpLTNdKSAmJgorCQkgICAgaXNvY3RhbCh0b2tbaS0yXSkgJiYKKwkJICAgIGlzb2N0YWwodG9rW2ktMV0pICYmCisJCSAgICAoKHRva1tpXT0wKSwKKwkJICAgICAoYyA9IHN0cnRvbCh0b2sraS0zLE5VTEwsIDgpKSA8IDI1NikpIHsKKwkJCWkgLT0gNDsKKwkJCXRva1tpKytdID0gYzsKKwkJfQorCX0JCisJaWYgKGMgPT0gJ1xuJykKKwkJeHVuZ2V0YyhjLCB4ZnApOworCWlmICghaSkKKwkJcmV0dXJuIDA7CisJaWYgKGkgPj0gbGVuIHx8IChzZXBhICYmIGMgIT0gc2VwYSkpCisJCXJldHVybiAtMTsKKwl0b2tbaV0gPSAnXDAnOworCXJldHVybiAxOworfQorCitpbnQKK3hnZXRjKFhGSUxFICp4ZnApCit7CisJaW50CWMgPSBnZXRjKHhmcC0+eF9mcCk7CisKKwlpZiAoYyA9PSBFT0YpCisJCXJldHVybiBjOworCWlmIChjID09ICdcXCcpIHsKKwkJaWYgKChjID0gZ2V0Yyh4ZnAtPnhfZnApKSAhPSAnXG4nKSB7CisJCQl1bmdldGMoYywgeGZwLT54X2ZwKTsKKwkJCXJldHVybiAnXFwnOworCQl9CisJCXhmcC0+eF9saW5lKys7CisJCXdoaWxlICgoYyA9IGdldGMoeGZwLT54X2ZwKSkgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7CisJCXVuZ2V0YyhjLCB4ZnAtPnhfZnApOworCQlyZXR1cm4gJyAnOworCX0KKwlpZiAoYyA9PSAnXG4nKQorCQl4ZnAtPnhfbGluZSsrOworCXJldHVybiBjOworfQorCit2b2lkCit4dW5nZXRjKGludCBjLCBYRklMRSAqeGZwKQoreworCWlmIChjID09IEVPRikKKwkJcmV0dXJuOworCisJdW5nZXRjKGMsIHhmcC0+eF9mcCk7CisJaWYgKGMgPT0gJ1xuJykKKwkJeGZwLT54X2xpbmUtLTsKK30KKwordm9pZAoreHNraXAoWEZJTEUgKnhmcCwgY2hhciAqc3RyKQoreworCWludAljOworCisJd2hpbGUgKChjID0geGdldGMoeGZwKSkgIT0gRU9GKSB7CisJCWlmIChjID09ICcjJykKKwkJCWMgPSB4c2tpcGNvbW1lbnQoeGZwKTsKKwkJaWYgKHN0cmNocihzdHIsIGMpID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJeHVuZ2V0YyhjLCB4ZnApOworfQorCitjaGFyCit4c2tpcGNvbW1lbnQoWEZJTEUgKnhmcCkKK3sKKwlpbnQJYzsKKworCXdoaWxlICgoYyA9IGdldGMoeGZwLT54X2ZwKSkgIT0gRU9GICYmIGMgIT0gJ1xuJyk7CisJcmV0dXJuIGM7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uZnMveGxvZy5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3hsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODIwMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbmZzL3hsb2cuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIHN1cHBvcnQvbmZzL3hsb2cuYworICoKKyAqIFRoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIGxvZ2dpbmcgb2YgcmVxdWVzdHMuCisgKgorICogVE9ETzoJTWVyZ2UgdGhlIHR3byAiWFhYX2xvZygpIGNhbGxzLgorICoKKyAqIEF1dGhvcnM6CURvbmFsZCBKLiBCZWNrZXIsIDxiZWNrZXJAc3VwZXIub3JnPgorICoJCVJpY2sgU2xhZGtleSwgPGpyc0B3b3JsZC5zdGQuY29tPgorICoJCUZyZWQgTi4gdmFuIEtlbXBlbiwgPHdhbHRqZUB1V2FsdC5OTC5NdWduZXQuT1JHPgorICoJCU9sYWYgS2lyY2gsIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqCisgKgkJVGhpcyBzb2Z0d2FyZSBtYXliZSBiZSB1c2VkIGZvciBhbnkgcHVycG9zZSBwcm92aWRlZAorICoJCXRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkLiAgSXQgaXMgc3VwcGxpZWQKKyAqCQlhcyBpcywgd2l0aCBubyB3YXJyYW50eSBleHByZXNzZWQgb3IgaW1wbGllZC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlICJuZnNsaWIuaCIKKworI3VuZGVmCVZFUkJPU0VfUFJJTlRGCisKK3N0YXRpYyBpbnQgIGxvZ19zdGRlcnIgPSAxOworc3RhdGljIGludCAgbG9nX3N5c2xvZyA9IDE7CitzdGF0aWMgaW50ICBsb2dnaW5nID0gMDsJCS8qIGVuYWJsZS9kaXNhYmxlIERFQlVHIGxvZ3MJKi8KK3N0YXRpYyBpbnQgIGxvZ21hc2sgPSAwOwkJLyogV2hhdCB3aWxsIGJlIGxvZ2dlZAkJKi8KK3N0YXRpYyBjaGFyIGxvZ19uYW1lWzI1Nl07CQkvKiBuYW1lIG9mIHRoaXMgcHJvZ3JhbQkJKi8KK3N0YXRpYyBpbnQgIGxvZ19waWQgPSAtMTsJCS8qIFBJRCBvZiB0aGlzIHByb2dyYW0JCSovCisKK3N0YXRpYyB2b2lkCXhsb2dfdG9nZ2xlKGludCBzaWcpOworc3RhdGljIHN0cnVjdCB4bG9nX2RlYnVnZmFjCWRlYnVnbmFtZXNbXSA9IHsKKwl7ICJnZW5lcmFsIiwJRF9HRU5FUkFMLCB9LAorCXsgImNhbGwiLAlEX0NBTEwsIH0sCisJeyAiYXV0aCIsCURfQVVUSCwgfSwKKwl7ICJwYXJzZSIsCURfUEFSU0UsIH0sCisJeyAiYWxsIiwJRF9BTEwsIH0sCisJeyBOVUxMLAkJMCwgfSwKK307CisKK3ZvaWQKK3hsb2dfb3BlbihjaGFyICpwcm9nbmFtZSkKK3sKKwlvcGVubG9nKHByb2duYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKworCXN0cm5jcHkobG9nX25hbWUsIHByb2duYW1lLCBzaXplb2YgKGxvZ19uYW1lKSAtIDEpOworCWxvZ19uYW1lIFtzaXplb2YgKGxvZ19uYW1lKSAtIDFdID0gJ1wwJzsKKwlsb2dfcGlkID0gZ2V0cGlkKCk7CisKKwlzaWduYWwoU0lHVVNSMSwgeGxvZ190b2dnbGUpOworCXNpZ25hbChTSUdVU1IyLCB4bG9nX3RvZ2dsZSk7Cit9CisKK3ZvaWQKK3hsb2dfc3RkZXJyKGludCBvbikKK3sKKwlsb2dfc3RkZXJyID0gb247Cit9CisKK3ZvaWQKK3hsb2dfc3lzbG9nKGludCBvbikKK3sKKwlsb2dfc3lzbG9nID0gb247Cit9CisKK3N0YXRpYyB2b2lkCit4bG9nX3RvZ2dsZShpbnQgc2lnKQoreworCXVuc2lnbmVkIGludAl0bXAsIGk7CisKKwlpZiAoc2lnID09IFNJR1VTUjEpIHsKKwkJaWYgKChsb2dtYXNrICYgRF9BTEwpICYmICFsb2dnaW5nKSB7CisJCQl4bG9nKERfR0VORVJBTCwgInR1cm5lZCBvbiBsb2dnaW5nIik7CisJCQlsb2dnaW5nID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQl0bXAgPSB+bG9nbWFzazsKKwkJbG9nbWFzayB8PSAoKGxvZ21hc2sgJiBEX0FMTCkgPDwgMSkgfCBEX0dFTkVSQUw7CisJCWZvciAoaSA9IC0xLCB0bXAgJj0gbG9nbWFzazsgdG1wOyB0bXAgPj49IDEsIGkrKykKKwkJCWlmICh0bXAgJiAxKQorCQkJCXhsb2coRF9HRU5FUkFMLAorCQkJCQkidHVybmVkIG9uIGxvZ2dpbmcgbGV2ZWwgJWQiLCBpKTsKKwl9IGVsc2UgeworCQl4bG9nKERfR0VORVJBTCwgInR1cm5lZCBvZmYgbG9nZ2luZyIpOworCQlsb2dnaW5nID0gMDsKKwl9CisJc2lnbmFsKHNpZywgeGxvZ190b2dnbGUpOworfQorCit2b2lkCit4bG9nX2NvbmZpZyhpbnQgZmFjLCBpbnQgb24pCit7CisJaWYgKG9uKQorCQlsb2dtYXNrIHw9IGZhYzsKKwllbHNlCisJCWxvZ21hc2sgJj0gfmZhYzsKKwlpZiAob24pCisJCWxvZ2dpbmcgPSAxOworfQorCit2b2lkCit4bG9nX3Njb25maWcoY2hhciAqa2luZCwgaW50IG9uKQoreworCXN0cnVjdCB4bG9nX2RlYnVnZmFjCSp0YmwgPSBkZWJ1Z25hbWVzOworCisJd2hpbGUgKHRibC0+ZGZfbmFtZSAhPSBOVUxMICYmIHN0cmNhc2VjbXAodGJsLT5kZl9uYW1lLCBraW5kKSkgCisJCXRibCsrOworCWlmICghdGJsLT5kZl9uYW1lKSB7CisJCXhsb2cgKExfV0FSTklORywgIkludmFsaWQgZGVidWcgZmFjaWxpdHk6ICVzXG4iLCBraW5kKTsKKwkJcmV0dXJuOworCX0KKwl4bG9nX2NvbmZpZyh0YmwtPmRmX2ZhYywgb24pOworfQorCitpbnQKK3hsb2dfZW5hYmxlZChpbnQgZmFjKQoreworCXJldHVybiAobG9nZ2luZyAmJiAoZmFjICYgbG9nbWFzaykpOworfQorCisKKy8qIFdyaXRlIHNvbWV0aGluZyB0byB0aGUgc3lzdGVtIGxvZ2ZpbGUgYW5kL29yIHN0ZGVyciAqLwordm9pZAoreGxvZ19iYWNrZW5kKGludCBraW5kLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwl2YV9saXN0IGFyZ3MyOworCisJaWYgKCEoa2luZCAmIChMX0FMTCkpICYmICEobG9nZ2luZyAmJiAoa2luZCAmIGxvZ21hc2spKSkKKwkJcmV0dXJuOworCisJaWYgKGxvZ19zdGRlcnIpCisJCXZhX2NvcHkoYXJnczIsIGFyZ3MpOworCisJaWYgKGxvZ19zeXNsb2cpIHsKKwkJc3dpdGNoIChraW5kKSB7CisJCWNhc2UgTF9GQVRBTDoKKwkJCXZzeXNsb2coTE9HX0VSUiwgZm10LCBhcmdzKTsKKwkJCWJyZWFrOworCQljYXNlIExfRVJST1I6CisJCQl2c3lzbG9nKExPR19FUlIsIGZtdCwgYXJncyk7CisJCQlicmVhazsKKwkJY2FzZSBMX1dBUk5JTkc6CisJCQl2c3lzbG9nKExPR19XQVJOSU5HLCBmbXQsIGFyZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgTF9OT1RJQ0U6CisJCQl2c3lzbG9nKExPR19OT1RJQ0UsIGZtdCwgYXJncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICghbG9nX3N0ZGVycikKKwkJCQl2c3lzbG9nKExPR19JTkZPLCBmbXQsIGFyZ3MpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobG9nX3N0ZGVycikgeworI2lmZGVmIFZFUkJPU0VfUFJJTlRGCisJCXRpbWVfdAkJbm93OworCQlzdHJ1Y3QgdG0JKnRtOworCisJCXRpbWUoJm5vdyk7CisJCXRtID0gbG9jYWx0aW1lKCZub3cpOworCQlmcHJpbnRmKHN0ZGVyciwgIiVzWyVkXSAlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCAiLAorCQkJCWxvZ19uYW1lLCBsb2dfcGlkLAorCQkJCXRtLT50bV95ZWFyKzE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKKwkJCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisjZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBsb2dfbmFtZSk7CisjZW5kaWYKKwkJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MyKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQl2YV9lbmQoYXJnczIpOworCX0KKworCWlmIChraW5kID09IExfRkFUQUwpCisJCWV4aXQoMSk7Cit9CisKK3ZvaWQKK3hsb2coaW50IGtpbmQsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJeGxvZ19iYWNrZW5kKGtpbmQsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkCit4bG9nX3dhcm4oY29uc3QgY2hhciogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl4bG9nX2JhY2tlbmQoTF9XQVJOSU5HLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KKworCit2b2lkCit4bG9nX2Vycihjb25zdCBjaGFyKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXhsb2dfYmFja2VuZChMX0ZBVEFMLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25zbS9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25zbS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQ4NWIzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbnNtL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTQgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitHRU5GSUxFU19DTE5UCT0gc21faW50ZXJfY2xudC5jCitHRU5GSUxFU19TVkMJPSBzbV9pbnRlcl9zdmMuYworR0VORklMRVNfWERSCT0gc21faW50ZXJfeGRyLmMKK0dFTkZJTEVTX0gJPSBzbV9pbnRlci5oCisKK0dFTkZJTEVTCT0gJChHRU5GSUxFU19DTE5UKSAkKEdFTkZJTEVTX1NWQykgJChHRU5GSUxFU19YRFIpICQoR0VORklMRVNfSCkKKworRVhUUkFfRElTVAk9IHNtX2ludGVyLngKKworbm9pbnN0X0xJQlJBUklFUyA9IGxpYm5zbS5hCitsaWJuc21fYV9TT1VSQ0VTID0gJChHRU5GSUxFUykgZmlsZS5jIHJwYy5jCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkZJTEVTKQorCitpZiBDT05GSUdfUlBDR0VOCitSUENHRU4JPSAkKHRvcF9idWlsZGRpcikvdG9vbHMvcnBjZ2VuL3JwY2dlbgorJChSUENHRU4pOgorCW1ha2UgLUMgLi4vLi4vdG9vbHMvcnBjZ2VuIGFsbAorZWxzZQorUlBDR0VOID0gQFJQQ0dFTl9QQVRIQAorZW5kaWYKKworJChHRU5GSUxFU19DTE5UKTogJV9jbG50LmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1sIC1vICRAICQ8CisJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisJcm0gLWYgJEAKKwltdiAtZiAkQC5OICRACisKKyQoR0VORklMRVNfU1ZDKTogJV9zdmMuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLW0gLW8gJEAgJDwKKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKwlybSAtZiAkQAorCW12IC1mICRALk4gJEAKKworJChHRU5GSUxFU19YRFIpOiAlX3hkci5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtYyAtbyAkQCAkPAorCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorCXJtIC1mICRACisJbXYgLWYgJEAuTiAkQAorCiskKEdFTkZJTEVTX0gpOiAlLmg6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1oIC1vICRAICQ8CisJcm0gLWYgJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9zbV9pbnRlci5oCisJJChMTl9TKSAuLi9uc20vc21faW50ZXIuaCAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL3NtX2ludGVyLmgKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCitDTEVBTkZJTEVTID0gJChHRU5GSUxFUykgJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9zbV9pbnRlci5oCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uc20vTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uc20vTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3M2UzNAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25zbS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDU3OCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gc3VwcG9ydC9uc20KK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitMSUJSQVJJRVMgPSAkKG5vaW5zdF9MSUJSQVJJRVMpCitBUkZMQUdTID0gY3J1CitsaWJuc21fYV9BUiA9ICQoQVIpICQoQVJGTEFHUykKK2xpYm5zbV9hX0xJQkFERCA9CithbV9fb2JqZWN0c18xID0gc21faW50ZXJfY2xudC4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzIgPSBzbV9pbnRlcl9zdmMuJChPQkpFWFQpCithbV9fb2JqZWN0c18zID0gc21faW50ZXJfeGRyLiQoT0JKRVhUKQorYW1fX29iamVjdHNfNCA9CithbV9fb2JqZWN0c181ID0gJChhbV9fb2JqZWN0c18xKSAkKGFtX19vYmplY3RzXzIpICQoYW1fX29iamVjdHNfMykgXAorCSQoYW1fX29iamVjdHNfNCkKK2FtX2xpYm5zbV9hX09CSkVDVFMgPSAkKGFtX19vYmplY3RzXzUpIGZpbGUuJChPQkpFWFQpIHJwYy4kKE9CSkVYVCkKK2xpYm5zbV9hX09CSkVDVFMgPSAkKGFtX2xpYm5zbV9hX09CSkVDVFMpCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobGlibnNtX2FfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQobGlibnNtX2FfU09VUkNFUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitHRU5GSUxFU19DTE5UID0gc21faW50ZXJfY2xudC5jCitHRU5GSUxFU19TVkMgPSBzbV9pbnRlcl9zdmMuYworR0VORklMRVNfWERSID0gc21faW50ZXJfeGRyLmMKK0dFTkZJTEVTX0ggPSBzbV9pbnRlci5oCitHRU5GSUxFUyA9ICQoR0VORklMRVNfQ0xOVCkgJChHRU5GSUxFU19TVkMpICQoR0VORklMRVNfWERSKSAkKEdFTkZJTEVTX0gpCitFWFRSQV9ESVNUID0gc21faW50ZXIueAorbm9pbnN0X0xJQlJBUklFUyA9IGxpYm5zbS5hCitsaWJuc21fYV9TT1VSQ0VTID0gJChHRU5GSUxFUykgZmlsZS5jIHJwYy5jCitCVUlMVF9TT1VSQ0VTID0gJChHRU5GSUxFUykKK0BDT05GSUdfUlBDR0VOX0ZBTFNFQFJQQ0dFTiA9IEBSUENHRU5fUEFUSEAKK0BDT05GSUdfUlBDR0VOX1RSVUVAUlBDR0VOID0gJCh0b3BfYnVpbGRkaXIpL3Rvb2xzL3JwY2dlbi9ycGNnZW4KK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KK0NMRUFORklMRVMgPSAkKEdFTkZJTEVTKSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL3NtX2ludGVyLmgKK2FsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSBzdXBwb3J0L25zbS9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSBzdXBwb3J0L25zbS9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworY2xlYW4tbm9pbnN0TElCUkFSSUVTOgorCS10ZXN0IC16ICIkKG5vaW5zdF9MSUJSQVJJRVMpIiB8fCBybSAtZiAkKG5vaW5zdF9MSUJSQVJJRVMpCitsaWJuc20uYTogJChsaWJuc21fYV9PQkpFQ1RTKSAkKGxpYm5zbV9hX0RFUEVOREVOQ0lFUykgCisJLXJtIC1mIGxpYm5zbS5hCisJJChsaWJuc21fYV9BUikgbGlibnNtLmEgJChsaWJuc21fYV9PQkpFQ1RTKSAkKGxpYm5zbV9hX0xJQkFERCkKKwkkKFJBTkxJQikgbGlibnNtLmEKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2ZpbGUuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwYy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc21faW50ZXJfY2xudC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc21faW50ZXJfc3ZjLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zbV9pbnRlcl94ZHIuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKEJVSUxUX1NPVVJDRVMpIiB8fCBybSAtZiAkKEJVSUxUX1NPVVJDRVMpCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGFsbCBjaGVjayBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RMSUJSQVJJRVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKK0BDT05GSUdfUlBDR0VOX1RSVUVAJChSUENHRU4pOgorQENPTkZJR19SUENHRU5fVFJVRUAJbWFrZSAtQyAuLi8uLi90b29scy9ycGNnZW4gYWxsCisKKyQoR0VORklMRVNfQ0xOVCk6ICVfY2xudC5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtbCAtbyAkQCAkPAorCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorCXJtIC1mICRACisJbXYgLWYgJEAuTiAkQAorCiskKEdFTkZJTEVTX1NWQyk6ICVfc3ZjLmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1tIC1vICRAICQ8CisJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisJcm0gLWYgJEAKKwltdiAtZiAkQC5OICRACisKKyQoR0VORklMRVNfWERSKTogJV94ZHIuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWMgLW8gJEAgJDwKKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKwlybSAtZiAkQAorCW12IC1mICRALk4gJEAKKworJChHRU5GSUxFU19IKTogJS5oOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtaCAtbyAkQCAkPAorCXJtIC1mICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvc21faW50ZXIuaAorCSQoTE5fUykgLi4vbnNtL3NtX2ludGVyLmggJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9zbV9pbnRlci5oCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25zbS9maWxlLmMgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uc20vZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjkyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uc20vZmlsZS5jCkBAIC0wLDAgKzEsMTA2NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbmZzLXV0aWxzLgorICoKKyAqIG5mcy11dGlscyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogbmZzLXV0aWxzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBuZnMtdXRpbHMuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyoKKyAqIE5TTSBmb3IgTGludXguCisgKgorICogQ2FsbGJhY2sgaW5mb3JtYXRpb24gYW5kIE5TTSBzdGF0ZSBpcyBzdG9yZWQgaW4gZmlsZXMsIHVzdWFsbHkKKyAqIHVuZGVyIC92YXIvbGliL25mcy4gIEEgZGF0YWJhc2Ugb2YgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIGxvY2FsCisgKiBmaWxlcyBzdG9yZXMgTkxNIGNhbGxiYWNrIGRhdGEgYW5kIHdoYXQgcmVtb3RlIHBlZXJzIHRvIG5vdGlmeSBvZgorICogcmVib290cy4KKyAqCisgKiBGb3IgZWFjaCBtb25pdG9yZWQgcmVtb3RlIHBlZXIsIGEgdGV4dCBmaWxlIGlzIGNyZWF0ZWQgdW5kZXIgdGhlCisgKiBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IE5TTV9NT05JVE9SX0RJUi4gIFRoZSBuYW1lIG9mIHRoZSBmaWxlCisgKiBpcyBhIHZhbGlkIEROUyBob3N0bmFtZS4gIFRoZSBob3N0bmFtZSBzdHJpbmcgbXVzdCBiZSBhIHZhbGlkCisgKiBBU0NJSSBETlMgbmFtZSwgYW5kIG11c3Qgbm90IGNvbnRhaW4gc2xhc2ggY2hhcmFjdGVycywgd2hpdGUgc3BhY2UsCisgKiBvciAnXDAnIChpZS4gYW55dGhpbmcgdGhhdCBtaWdodCBoYXZlIHNvbWUgc3BlY2lhbCBtZWFuaW5nIGluIGEKKyAqIHBhdGggbmFtZSkuCisgKgorICogVGhlIGNvbnRlbnRzIG9mIGVhY2ggZmlsZSBpbmNsdWRlIHNldmVuIGJsYW5rLXNlcGFyYXRlZCBmaWVsZHMgb2YKKyAqIHRleHQsIGZpbmlzaGVkIHdpdGggJ1xuJy4gIFRoZSBmaXJzdCBmaWVsZCBjb250YWlucyB0aGUgbmV0d29yaworICogYWRkcmVzcyBvZiB0aGUgTkxNIHNlcnZpY2UgdG8gY2FsbCBiYWNrLiAgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKyAqIHN1cHBvcnRzIHVzaW5nIG9ubHkgSVB2NCBhZGRyZXNzZXMsIHNvIHRoZSBvbmx5IGNvbnRlbnRzIG9mIHRoaXMKKyAqIGZpZWxkIGFyZSBhIG5ldHdvcmsgb3JkZXIgSVB2NCBhZGRyZXNzIGV4cHJlc3NlZCBpbiA4IGhleGFkZWNpbWFsCisgKiBjaGFyYWN0ZXJzLgorICoKKyAqIFRoZSBuZXh0IGZvdXIgZmllbGRzIGFyZSB0ZXh0IHN0cmluZ3Mgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVycywKKyAqIHJlcHJlc2VudGluZzoKKyAqCisgKiAyLiBBIDQgYnl0ZSBSUEMgcHJvZ3JhbSBudW1iZXIgb2YgdGhlIE5MTSBzZXJ2aWNlIHRvIGNhbGwgYmFjaworICogMy4gQSA0IGJ5dGUgUlBDIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBOTE0gc2VydmljZSB0byBjYWxsIGJhY2sKKyAqIDQuIEEgNCBieXRlIFJQQyBwcm9jZWR1cmUgbnVtYmVyIG9mIHRoZSBOTE0gc2VydmljZSB0byBjYWxsIGJhY2sKKyAqIDUuIEEgMTYgYnl0ZSBvcGFxdWUgY29va2llIHRoYXQgdGhlIE5MTSBzZXJ2aWNlIHVzZXMgdG8gaWRlbnRpZnkKKyAqICAgIHRoZSBtb25pdG9yZWQgaG9zdAorICoKKyAqIFRoZSBzaXh0aCBmaWVsZCBpcyB0aGUgbW9uaXRvcmVkIGhvc3QncyBtb25fbmFtZSwgcGFzc2VkIHRvIHN0YXRkCisgKiB2aWEgYW4gU01fTU9OIHJlcXVlc3QuCisgKgorICogVGhlIHNldmVudGggZmllbGQgaXMgdGhlIG15X25hbWUgZm9yIHRoaXMgcGVlciwgd2hpY2ggaXMgdGhlCisgKiBob3N0bmFtZSBvZiB0aGUgbG9jYWwgTkxNIChjdXJyZW50bHkgb24gTGludXgsIHRoZSByZXN1bHQgb2YKKyAqIGB1bmFtZSAtbmApLiAgVGhpcyBjYW4gYmUgdXNlZCBhcyB0aGUgc291cmNlIGFkZHJlc3MvaG9zdG5hbWUKKyAqIHdoZW4gc2VuZGluZyBTTV9OT1RJRlkgcmVxdWVzdHMuCisgKgorICogVGhlIE5TTSBwcm90b2NvbCBkb2VzIG5vdCBsaW1pdCB0aGUgY29udGVudHMgb2YgdGhlc2Ugc3RyaW5ncworICogaW4gYW55IHdheSBleGNlcHQgdGhhdCB0aGV5IG11c3QgZml0IGludG8gMTAyNCBieXRlcy4gIE91cgorICogaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhhdCB0aGVzZSBzdHJpbmdzIG5vdCBjb250YWluCisgKiB3aGl0ZSBzcGFjZSBvciAnXDAnLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWZuZGVmIFNfU1BMSU5UX1MKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGdycC5oPgorCisjaW5jbHVkZSAieGxvZy5oIgorI2luY2x1ZGUgIm5zbS5oIgorCisjZGVmaW5lIFJQQ0FSR1NMRU4JKDQgKiAoOCArIDEpKQorI2RlZmluZSBMSU5FTEVOCQkoUlBDQVJHU0xFTiArIFNNX1BSSVZfU0laRSAqIDIgKyAxKQorCisjZGVmaW5lIE5TTV9LRVJORUxfU1RBVEVfRklMRQkiL3Byb2Mvc3lzL2ZzL25mcy9uc21fbG9jYWxfc3RhdGUiCisKKy8qCisgKiBTb21lIGRpc3RyaWJ1dGlvbnMgcGxhY2Ugc3RhdGQncyBmaWxlcyBpbiBhIHN1YmRpcmVjdG9yeQorICovCisjZGVmaW5lIE5TTV9QQVRIX0VYVEVOU0lPTgorLyogI2RlZmluZSBOU01fUEFUSF9FWFRFTlNJT04JIi9zdGF0ZCIgKi8KKworI2RlZmluZSBOU01fREVGQVVMVF9TVEFURURJUgkJTkZTX1NUQVRFRElSIE5TTV9QQVRIX0VYVEVOU0lPTgorCitzdGF0aWMgY2hhciBuc21fYmFzZV9kaXJuYW1lW1BBVEhfTUFYXSA9IE5TTV9ERUZBVUxUX1NUQVRFRElSOworCisjZGVmaW5lIE5TTV9NT05JVE9SX0RJUgkic20iCisjZGVmaW5lIE5TTV9OT1RJRllfRElSCSJzbS5iYWsiCisjZGVmaW5lIE5TTV9TVEFURV9GSUxFCSJzdGF0ZSIKKworCitzdGF0aWMgX0Jvb2wKK2Vycm9yX2NoZWNrKGNvbnN0IGludCBsZW4sIGNvbnN0IHNpemVfdCBidWZsZW4pCit7CisJcmV0dXJuIChsZW4gPCAwKSB8fCAoKHNpemVfdClsZW4gPj0gYnVmbGVuKTsKK30KKworc3RhdGljIF9Cb29sCitleGFjdF9lcnJvcl9jaGVjayhjb25zdCBzc2l6ZV90IGxlbiwgY29uc3Qgc2l6ZV90IGJ1ZmxlbikKK3sKKwlyZXR1cm4gKGxlbiA8IDApIHx8ICgoc2l6ZV90KWxlbiAhPSBidWZsZW4pOworfQorCisvKgorICogUmV0dXJucyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwgJ1wwJy10ZXJtaW5hdGVkIGJ1ZmZlcgorICogY29udGFpbmluZyBhbiBhcHByb3ByaWF0ZSBwYXRobmFtZSwgb3IgTlVMTCBpZiBhbiBlcnJvcgorICogb2NjdXJzLiAgQ2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgcmVzdWx0IHdpdGggZnJlZSgzKS4KKyAqLworX19hdHRyaWJ1dGVfbWFsbG9jX18KK3N0YXRpYyBjaGFyICoKK25zbV9tYWtlX3JlY29yZF9wYXRobmFtZShjb25zdCBjaGFyICpkaXJlY3RvcnksIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQoreworCWNvbnN0IGNoYXIgKmM7CisJc2l6ZV90IHNpemU7CisJY2hhciAqcGF0aDsKKwlpbnQgbGVuOworCisJLyoKKwkgKiBCbG9jayBob3N0bmFtZXMgdGhhdCBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBoYXZlCisJICogbWVhbmluZyB0byB0aGUgZmlsZSBzeXN0ZW0gKGxpa2UgJy8nKSwgb3IgdGhhdCBjYW4KKwkgKiBiZSBjb25mdXNpbmcgb24gdmlzdWFsIGluc3BlY3Rpb24gKGxpa2UgJyAnKS4KKwkgKi8KKwlmb3IgKGMgPSBob3N0bmFtZTsgKmMgIT0gJ1wwJzsgYysrKQorCQlpZiAoKmMgPT0gJy8nIHx8IGlzc3BhY2UoKGludCkqYykgIT0gMCkgeworCQkJeGxvZyhEX0dFTkVSQUwsICJIb3N0bmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwlzaXplID0gc3RybGVuKG5zbV9iYXNlX2Rpcm5hbWUpICsgc3RybGVuKGRpcmVjdG9yeSkgKyBzdHJsZW4oaG9zdG5hbWUpICsgMzsKKwlpZiAoc2l6ZSA+IFBBVEhfTUFYKSB7CisJCXhsb2coRF9HRU5FUkFMLCAiSG9zdG5hbWUgcmVzdWx0cyBpbiBwYXRobmFtZSB0aGF0IGlzIHRvbyBsb25nIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXBhdGggPSBtYWxsb2Moc2l6ZSk7CisJaWYgKHBhdGggPT0gTlVMTCkgeworCQl4bG9nKERfR0VORVJBTCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBhdGhuYW1lIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxlbiA9IHNucHJpbnRmKHBhdGgsIHNpemUsICIlcy8lcy8lcyIsCisJCQluc21fYmFzZV9kaXJuYW1lLCBkaXJlY3RvcnksIGhvc3RuYW1lKTsKKwlpZiAoZXJyb3JfY2hlY2sobGVuLCBzaXplKSkgeworCQl4bG9nKERfR0VORVJBTCwgIlBhdGhuYW1lIGRpZCBub3QgZml0IGluIHNwZWNpZmllZCBidWZmZXIiKTsKKwkJZnJlZShwYXRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCAnXDAnLXRlcm1pbmF0ZWQgYnVmZmVyCisgKiBjb250YWluaW5nIGFuIGFwcHJvcHJpYXRlIHBhdGhuYW1lLCBvciBOVUxMIGlmIGFuIGVycm9yCisgKiBvY2N1cnMuICBDYWxsZXIgbXVzdCBmcmVlIHRoZSByZXR1cm5lZCByZXN1bHQgd2l0aCBmcmVlKDMpLgorICovCitfX2F0dHJpYnV0ZV9tYWxsb2NfXworc3RhdGljIGNoYXIgKgorbnNtX21ha2VfcGF0aG5hbWUoY29uc3QgY2hhciAqZGlyZWN0b3J5KQoreworCXNpemVfdCBzaXplOworCWNoYXIgKnBhdGg7CisJaW50IGxlbjsKKworCXNpemUgPSBzdHJsZW4obnNtX2Jhc2VfZGlybmFtZSkgKyBzdHJsZW4oZGlyZWN0b3J5KSArIDI7CisJaWYgKHNpemUgPiBQQVRIX01BWCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXRoID0gbWFsbG9jKHNpemUpOworCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gc25wcmludGYocGF0aCwgc2l6ZSwgIiVzLyVzIiwgbnNtX2Jhc2VfZGlybmFtZSwgZGlyZWN0b3J5KTsKKwlpZiAoZXJyb3JfY2hlY2sobGVuLCBzaXplKSkgeworCQlmcmVlKHBhdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcGF0aDsKK30KKworLyoKKyAqIFJldHVybnMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQsICdcMCctdGVybWluYXRlZCBidWZmZXIKKyAqIGNvbnRhaW5pbmcgYW4gYXBwcm9wcmlhdGUgcGF0aG5hbWUsIG9yIE5VTEwgaWYgYW4gZXJyb3IKKyAqIG9jY3Vycy4gIENhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIHJlc3VsdCB3aXRoIGZyZWUoMykuCisgKi8KK19fYXR0cmlidXRlX21hbGxvY19fCitzdGF0aWMgY2hhciAqCituc21fbWFrZV90ZW1wX3BhdGhuYW1lKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCXNpemVfdCBzaXplOworCWNoYXIgKnBhdGg7CisJaW50IGxlbjsKKworCXNpemUgPSBzdHJsZW4ocGF0aG5hbWUpICsgc2l6ZW9mKCIubmV3IikgKyAyOworCWlmIChzaXplID4gUEFUSF9NQVgpCisJCXJldHVybiBOVUxMOworCisJcGF0aCA9IG1hbGxvYyhzaXplKTsKKwlpZiAocGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNucHJpbnRmKHBhdGgsIHNpemUsICIlcy5uZXciLCBwYXRobmFtZSk7CisJaWYgKGVycm9yX2NoZWNrKGxlbiwgc2l6ZSkpIHsKKwkJZnJlZShwYXRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKy8qCisgKiBVc2UgIm1rdGVtcCwgd3JpdGUsIHJlbmFtZSIgdG8gdXBkYXRlIHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXRvbWljYWxseS4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgY29tcGxldGVseSBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiBzb21lIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgX0Jvb2wKK25zbV9hdG9taWNfd3JpdGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3Qgdm9pZCAqYnVmLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworCV9Cb29sIHJlc3VsdCA9IGZhbHNlOworCXNzaXplX3QgbGVuOworCWNoYXIgKnRlbXA7CisJaW50IGZkOworCisJdGVtcCA9IG5zbV9tYWtlX3RlbXBfcGF0aG5hbWUocGF0aCk7CisJaWYgKHRlbXAgPT0gTlVMTCkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIG5ldyBwYXRoIGZvciAlcyIsIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisKKwlmZCA9IG9wZW4odGVtcCwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1NZTkMgfCBPX1dST05MWSwgMDY0NCk7CisJaWYgKGZkID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgJXM6ICVtIiwgdGVtcCk7CisJCWdvdG8gb3V0OworCX0KKworCWxlbiA9IHdyaXRlKGZkLCBidWYsIGJ1Zmxlbik7CisJaWYgKGV4YWN0X2Vycm9yX2NoZWNrKGxlbiwgYnVmbGVuKSkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgJXM6ICVtIiwgdGVtcCk7CisJCSh2b2lkKWNsb3NlKGZkKTsKKwkJKHZvaWQpdW5saW5rKHRlbXApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY2xvc2UoZmQpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBjbG9zZSAlczogJW0iLCB0ZW1wKTsKKwkJKHZvaWQpdW5saW5rKHRlbXApOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmVuYW1lKHRlbXAsIHBhdGgpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byByZW5hbWUgJXMgLT4gJXM6ICVtIiwKKwkJCQl0ZW1wLCBwYXRoKTsKKwkJKHZvaWQpdW5saW5rKHRlbXApOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBPc3RlbnNpYmx5LCBhIHN5bmMoMikgaXMgbm90IG5lZWRlZCBoZXJlIGJlY2F1c2UKKwkgKiBvcGVuKE9fQ1JFQVQpLCB3cml0ZShPX1NZTkMpLCBhbmQgcmVuYW1lKDIpIGFyZQorCSAqIGFscmVhZHkgc3luY2hyb25vdXMgd2l0aCBwZXJzaXN0ZW50IHN0b3JhZ2UsIGZvcgorCSAqIGFueSBmaWxlIHN5c3RlbSB3ZSBjYXJlIGFib3V0LiAqLworCisJcmVzdWx0ID0gdHJ1ZTsKKworb3V0OgorCWZyZWUodGVtcCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBuc21fc2V0dXBfcGF0aG5hbWVzIC0gc2V0IHVwIHBhdGhuYW1lCisgKiBAcHJvZ25hbWU6IEMgc3RyaW5nIGNvbnRhaW5pbmcgbmFtZSBvZiBwcm9ncmFtLCBmb3IgZXJyb3IgbWVzc2FnZXMKKyAqIEBwYXJlbnRkaXI6IEMgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aG5hbWUgdG8gb24tZGlzayBzdGF0ZSwgb3IgTlVMTAorICoKKyAqIFRoaXMgcnVucyBiZWZvcmUgbG9nZ2luZyBpcyBzZXQgdXAsIHNvIGVycm9yIG1lc3NhZ2VzIGFyZSBkaXJlY3RlZAorICogdG8gc3RkZXJyLgorICoKKyAqIFJldHVybnMgdHJ1ZSBhbmQgc2V0cyB1cCBvdXIgcGF0aG5hbWVzLCBpZiBAcGFyZW50ZGlyIHdhcyB2YWxpZAorICogYW5kIHVzYWJsZTsgb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgorICovCitfQm9vbAorbnNtX3NldHVwX3BhdGhuYW1lcyhjb25zdCBjaGFyICpwcm9nbmFtZSwgY29uc3QgY2hhciAqcGFyZW50ZGlyKQoreworCXN0YXRpYyBjaGFyIGJ1ZltQQVRIX01BWF07CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqcGF0aDsKKworCS8qIEZpcnN0OiB0ZXN0IGxlbmd0aCBvZiBuYW1lIGFuZCB3aGV0aGVyIGl0IGV4aXN0cyAqLworCWlmIChsc3RhdChwYXJlbnRkaXIsICZzdCkgPT0gLTEpIHsKKwkJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogRmFpbGVkIHRvIHN0YXQgJXM6ICVzIiwKKwkJCQlwcm9nbmFtZSwgcGFyZW50ZGlyLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogRW5zdXJlIHdlIGhhdmUgYSBjbGVhbiBkaXJlY3RvcnkgcGF0aG5hbWUgKi8KKwlzdHJuY3B5KGJ1ZiwgcGFyZW50ZGlyLCBzaXplb2YoYnVmKSk7CisJcGF0aCA9IGRpcm5hbWUoYnVmKTsKKwlpZiAoKnBhdGggPT0gJy4nKSB7CisJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IFVudXNhYmxlIGRpcmVjdG9yeSAlcyIsCisJCQkJcHJvZ25hbWUsIHBhcmVudGRpcik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwl4bG9nKERfQ0FMTCwgIlVzaW5nICVzIGFzIHRoZSBzdGF0ZSBkaXJlY3RvcnkiLCBwYXJlbnRkaXIpOworCXN0cm5jcHkobnNtX2Jhc2VfZGlybmFtZSwgcGFyZW50ZGlyLCBzaXplb2YobnNtX2Jhc2VfZGlybmFtZSkpOworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIG5zbV9pc19kZWZhdWx0X3BhcmVudGRpciAtIGNoZWNrIGlmIHBhcmVudCBkaXJlY3RvcnkgaXMgZGVmYXVsdAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aXZlIHN0YXRkIHBhcmVudCBkaXJlY3RvcnksIHNldCBieQorICogbnNtX2NoYW5nZV9wYXRobmFtZSgpLCBpcyB0aGUgc2FtZSBhcyB0aGUgYnVpbHQtaW4gZGVmYXVsdAorICogcGFyZW50IGRpcmVjdG9yeTsgb3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgorICovCitfQm9vbAorbnNtX2lzX2RlZmF1bHRfcGFyZW50ZGlyKHZvaWQpCit7CisJcmV0dXJuIHN0cmNtcChuc21fYmFzZV9kaXJuYW1lLCBOU01fREVGQVVMVF9TVEFURURJUikgPT0gMDsKK30KKworLyoKKyAqIENsZWFyIGFsbCBjYXBhYmlsaXRpZXMgYnV0IENBUF9ORVRfQklORF9TRVJWSUNFLiAgVGhpcyBwZXJtaXRzCisgKiBjYWxsZXJzIHRvIGFjcXVpcmUgcHJpdmlsZWdlZCBzb3VyY2UgcG9ydHMsIGJ1dCBhbGwgb3RoZXIgcm9vdAorICogY2FwYWJpbGl0aWVzIGFyZSBkaXNhbGxvd2VkLgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiBzb21lIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgX0Jvb2wKK25zbV9jbGVhcl9jYXBhYmlsaXRpZXModm9pZCkKK3sKKwljYXBfdCBjYXBzOworCisJY2FwcyA9IGNhcF9mcm9tX3RleHQoImNhcF9uZXRfYmluZF9zZXJ2aWNlPWVwIik7CisJaWYgKGNhcHMgPT0gTlVMTCkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2FwYWJpbGl0eTogJW0iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChjYXBfc2V0X3Byb2MoY2FwcykgPT0gLTEpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBjYXBhYmlsaXR5IGZsYWdzOiAlbSIpOworCQkodm9pZCljYXBfZnJlZShjYXBzKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCSh2b2lkKWNhcF9mcmVlKGNhcHMpOworCXJldHVybiB0cnVlOworfQorCisvKioKKyAqIG5zbV9kcm9wX3ByaXZpbGVnZXMgLSBkcm9wIHJvb3QgcHJpdmlsZWdlcworICogQHBpZGZkOiBmaWxlIGRlc2NyaXB0b3Igb2YgYSBwaWQgZmlsZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiBzb21lIGVycm9yIG9jY3VycmVkLgorICoKKyAqIFNldCBvdXIgZWZmZWN0aXZlIFVJRCBhbmQgR0lEIHRvIHRoYXQgb2Ygb3VyIG9uLWRpc2sgZGF0YWJhc2UuCisgKi8KK19Cb29sCituc21fZHJvcF9wcml2aWxlZ2VzKGNvbnN0IGludCBwaWRmZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCSh2b2lkKXVtYXNrKFNfSVJXWE8pOworCisJLyoKKwkgKiBYWFg6IElmIHdlIGNhbid0IHN0YXQgZGlybmFtZSwgb3IgaWYgZGlybmFtZSBpcyBvd25lZCBieQorCSAqICAgICAgcm9vdCwgd2Ugc2hvdWxkIHVzZSAic3RhdGR1c2VyIiBpbnN0ZWFkLCB3aGljaCBpcyBzZXQgdXAKKwkgKiAgICAgIGJ5IGNvbmZpZ3VyZS5hYy4gIE5vdGhpbmcgaW4gbmZzLXV0aWxzIHNlZW1zIHRvIHVzZQorCSAqICAgICAgInN0YXRkdXNlciwiIHRob3VnaC4KKwkgKi8KKwlpZiAobHN0YXQobnNtX2Jhc2VfZGlybmFtZSwgJnN0KSA9PSAtMSkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gc3RhdCAlczogJW0iLCBuc21fYmFzZV9kaXJuYW1lKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChzdC5zdF91aWQgPT0gMCkgeworCQl4bG9nX3dhcm4oIlJ1bm5pbmcgYXMgcm9vdC4gICIKKwkJCSJjaG93biAlcyB0byBjaG9vc2UgZGlmZmVyZW50IHVzZXIiLCBuc21fYmFzZV9kaXJuYW1lKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaWYgKGNoZGlyKG5zbV9iYXNlX2Rpcm5hbWUpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBjaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkgdG8gJXM6ICVtIiwKKwkJCQluc21fYmFzZV9kaXJuYW1lKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogSWYgdGhlIHBpZGZpbGUgaGFwcGVucyB0byByZXNpZGUgb24gTkZTLCBkcm9wcGluZyBwcml2aWxlZ2VzCisJICogd2lsbCBwcm9iYWJseSBjYXVzZSB1cyB0byBsb3NlIGFjY2VzcywgZXZlbiB0aG91Z2ggd2UgYXJlCisJICogaG9sZGluZyBpdCBvcGVuLiAgQ2hvd24gaXQgdG8gcHJldmVudCB0aGlzLgorCSAqLworCWlmIChwaWRmZCA+PSAwKQorCQlpZiAoZmNob3duKHBpZGZkLCBzdC5zdF91aWQsIHN0LnN0X2dpZCkgPT0gLTEpCisJCQl4bG9nX3dhcm4oIkZhaWxlZCB0byBjaGFuZ2Ugb3duZXIgb2YgcGlkZmlsZTogJW0iKTsKKworCS8qCisJICogRG9uJ3QgY2xlYXIgY2FwYWJpbGl0aWVzIHdoZW4gZHJvcHBpbmcgcm9vdC4KKwkgKi8KKyAgICAgICAgaWYgKHByY3RsKFBSX1NFVF9LRUVQQ0FQUywgMSwgMCwgMCwgMCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICB4bG9nKExfRVJST1IsICJwcmN0bChQUl9TRVRfS0VFUENBUFMpIGZhaWxlZDogJW0iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNldGdyb3VwcygwLCBOVUxMKSA9PSAtMSkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwczogJW0iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogT1JERVIKKwkgKgorCSAqIHNldGdpZCgyKSBmaXJzdCwgYXMgc2V0dWlkKDIpIG1heSByZW1vdmUgcHJpdmlsZWdlcyBuZWVkZWQKKwkgKiB0byBzZXQgdGhlIGdyb3VwIGlkLgorCSAqLworCWlmIChzZXRnaWQoc3Quc3RfZ2lkKSA9PSAtMSB8fCBzZXR1aWQoc3Quc3RfdWlkKSA9PSAtMSkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gZHJvcCBwcml2aWxlZ2VzOiAlbSIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJeGxvZyhEX0NBTEwsICJFZmZlY3RpdmUgVUlELCBHSUQ6ICV1LCAldSIsIHN0LnN0X3VpZCwgc3Quc3RfZ2lkKTsKKworCXJldHVybiBuc21fY2xlYXJfY2FwYWJpbGl0aWVzKCk7Cit9CisKKy8qKgorICogbnNtX2dldF9zdGF0ZSAtIHJldHJpZXZlIG9uLWRpc2sgTlNNIHN0YXRlIG51bWJlcgorICoKKyAqIFJldHVybnMgYW4gb2RkIE5TTSBzdGF0ZSBudW1iZXIgcmVhZCBmcm9tIGRpc2ssIG9yIGFuIGluaXRpYWwKKyAqIHN0YXRlIG51bWJlci4gIFplcm8gaXMgcmV0dXJuZWQgaWYgc29tZSBlcnJvciBvY2N1cnMuCisgKi8KK2ludAorbnNtX2dldF9zdGF0ZShfQm9vbCB1cGRhdGUpCit7CisJaW50IGZkLCBzdGF0ZSA9IDA7CisJc3NpemVfdCByZXN1bHQ7CisJY2hhciAqcGF0aCA9IE5VTEw7CisKKwlwYXRoID0gbnNtX21ha2VfcGF0aG5hbWUoTlNNX1NUQVRFX0ZJTEUpOworCWlmIChwYXRoID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHBhdGggZm9yICIgTlNNX1NUQVRFX0ZJTEUpOworCQlnb3RvIG91dDsKKwl9CisKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gb3BlbiAlczogJW0iLCBwYXRoKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJeGxvZyhMX05PVElDRSwgIkluaXRpYWxpemluZyBOU00gc3RhdGUiKTsKKwkJc3RhdGUgPSAxOworCQl1cGRhdGUgPSB0cnVlOworCQlnb3RvIHVwZGF0ZTsKKwl9CisKKwlyZXN1bHQgPSByZWFkKGZkLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCWlmIChleGFjdF9lcnJvcl9jaGVjayhyZXN1bHQsIHNpemVvZihzdGF0ZSkpKSB7CisJCXhsb2dfd2FybigiRmFpbGVkIHRvIHJlYWQgJXM6ICVtIiwgcGF0aCk7CisKKwkJeGxvZyhMX05PVElDRSwgIkluaXRpYWxpemluZyBOU00gc3RhdGUiKTsKKwkJc3RhdGUgPSAxOworCQl1cGRhdGUgPSB0cnVlOworCQlnb3RvIHVwZGF0ZTsKKwl9CisKKwlpZiAoKHN0YXRlICYgMSkgPT0gMCkKKwkJc3RhdGUrKzsKKwordXBkYXRlOgorCSh2b2lkKWNsb3NlKGZkKTsKKworCWlmICh1cGRhdGUpIHsKKwkJc3RhdGUgKz0gMjsKKwkJaWYgKCFuc21fYXRvbWljX3dyaXRlKHBhdGgsICZzdGF0ZSwgc2l6ZW9mKHN0YXRlKSkpCisJCQlzdGF0ZSA9IDA7CisJfQorCitvdXQ6CisJZnJlZShwYXRoKTsKKwlyZXR1cm4gc3RhdGU7Cit9CisKKy8qKgorICogbnNtX3VwZGF0ZV9rZXJuZWxfc3RhdGUgLSBhdHRlbXB0IHRvIHBvc3QgbmV3IE5TTSBzdGF0ZSB0byBrZXJuZWwKKyAqIEBzdGF0ZTogTlNNIHN0YXRlIG51bWJlcgorICoKKyAqLwordm9pZAorbnNtX3VwZGF0ZV9rZXJuZWxfc3RhdGUoY29uc3QgaW50IHN0YXRlKQoreworCXNzaXplX3QgcmVzdWx0OworCWNoYXIgYnVmWzIwXTsKKwlpbnQgZmQsIGxlbjsKKworCWZkID0gb3BlbihOU01fS0VSTkVMX1NUQVRFX0ZJTEUsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJeGxvZyhEX0dFTkVSQUwsICJGYWlsZWQgdG8gb3BlbiAiIE5TTV9LRVJORUxfU1RBVEVfRklMRSAiOiAlbSIpOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgc3RhdGUpOworCWlmIChlcnJvcl9jaGVjayhsZW4sIHNpemVvZihidWYpKSkgeworCQl4bG9nX3dhcm4oIkZhaWxlZCB0byBmb3JtIE5TTSBzdGF0ZSBudW1iZXIgc3RyaW5nIik7CisJCXJldHVybjsKKwl9CisKKwlyZXN1bHQgPSB3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSk7CisJaWYgKGV4YWN0X2Vycm9yX2NoZWNrKHJlc3VsdCwgc3RybGVuKGJ1ZikpKQorCQl4bG9nX3dhcm4oIkZhaWxlZCB0byB3cml0ZSBOU00gc3RhdGUgbnVtYmVyOiAlbSIpOworCisJaWYgKGNsb3NlKGZkKSA9PSAtMSkKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGNsb3NlIE5TTSBzdGF0ZSBmaWxlICIKKwkJCQlOU01fS0VSTkVMX1NUQVRFX0ZJTEUgIjogJW0iKTsKK30KKworLyoqCisgKiBuc21fcmV0aXJlX21vbml0b3JlZF9ob3N0cyAtIGJhY2sgdXAgYWxsIGhvc3RzIGZyb20gInNtLyIgdG8gInNtLmJhay8iCisgKgorICogUmV0dXJucyB0aGUgY291bnQgb2YgaG9zdCByZWNvcmRzIHRoYXQgd2VyZSBtb3ZlZC4KKyAqCisgKiBOb3RlIHRoYXQgaWYgYW55IGVycm9yIG9jY3VycyBkdXJpbmcgdGhpcyBwcm9jZXNzLCBzb21lIG1vbml0b3IKKyAqIHJlY29yZHMgbWF5IGJlIGxlZnQgaW4gdGhlICJzbSIgZGlyZWN0b3J5LgorICovCit1bnNpZ25lZCBpbnQKK25zbV9yZXRpcmVfbW9uaXRvcmVkX2hvc3RzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwljaGFyICpwYXRoOworCURJUiAqZGlyOworCisJcGF0aCA9IG5zbV9tYWtlX3BhdGhuYW1lKE5TTV9NT05JVE9SX0RJUik7CisJaWYgKHBhdGggPT0gTlVMTCkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgcGF0aCBmb3IgIiBOU01fTU9OSVRPUl9ESVIpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJZGlyID0gb3BlbmRpcihwYXRoKTsKKwlmcmVlKHBhdGgpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQl4bG9nX3dhcm4oIkZhaWxlZCB0byBvcGVuICIgTlNNX01PTklUT1JfRElSICI6ICVtIik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWNoYXIgKnNyYywgKmRzdDsKKworCQlpZiAoZGUtPmRfdHlwZSAhPSAodW5zaWduZWQgY2hhcilEVF9SRUcpCisJCQljb250aW51ZTsKKwkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJY29udGludWU7CisKKwkJc3JjID0gbnNtX21ha2VfcmVjb3JkX3BhdGhuYW1lKE5TTV9NT05JVE9SX0RJUiwgZGUtPmRfbmFtZSk7CisJCWlmIChzcmMgPT0gTlVMTCkgeworCQkJeGxvZ193YXJuKCJCYWQgbW9uaXRvciBmaWxlIG5hbWUsIHNraXBwaW5nIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRzdCA9IG5zbV9tYWtlX3JlY29yZF9wYXRobmFtZShOU01fTk9USUZZX0RJUiwgZGUtPmRfbmFtZSk7CisJCWlmIChkc3QgPT0gTlVMTCkgeworCQkJZnJlZShzcmMpOworCQkJeGxvZ193YXJuKCJCYWQgbm90aWZ5IGZpbGUgbmFtZSwgc2tpcHBpbmciKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJlbmFtZShzcmMsIGRzdCkgPT0gLTEpCisJCQl4bG9nX3dhcm4oIkZhaWxlZCB0byByZW5hbWUgJXMgLT4gJXM6ICVtIiwKKwkJCQlzcmMsIGRzdCk7CisJCWVsc2UgeworCQkJeGxvZyhEX0dFTkVSQUwsICJSZXRpcmVkIHJlY29yZCBmb3IgbW9uX25hbWUgJXMiLAorCQkJCQlkZS0+ZF9uYW1lKTsKKwkJCWNvdW50Kys7CisJCX0KKworCQlmcmVlKGRzdCk7CisJCWZyZWUoc3JjKTsKKwl9CisKKwkodm9pZCljbG9zZWRpcihkaXIpOworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIG5zbV9wcml2X3RvX2hleCAtIGNvbnZlcnQgYSBOU00gcHJpdmF0ZSBjb29raWUgdG8gYSBoZXggc3RyaW5nLgorICoKKyAqIEBwcml2OiBidWZmZXIgaG9sZGluZyB0aGUgYmluYXJ5IE5TTSBwcml2YXRlIGNvb2tpZQorICogQGJ1Zjogb3V0cHV0IGJ1ZmZlciBmb3IgTlVMTCB0ZXJtaW5hdGVkIGhleCBzdHJpbmcKKyAqIEBidWZsZW46IHNpemUgb2Ygb3V0cHV0IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyBvciAwIG9uIGVycm9yCisgKi8KK3NpemVfdAorbnNtX3ByaXZfdG9faGV4KGNvbnN0IGNoYXIgKnByaXYsIGNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGJ1ZmxlbikKK3sKKwlpbnQgaSwgbGVuOworCXNpemVfdCByZW1haW5pbmcgPSBidWZsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgU01fUFJJVl9TSVpFOyBpKyspIHsKKwkJbGVuID0gc25wcmludGYoYnVmLCByZW1haW5pbmcsICIlMDJ4IiwKKwkJCQkodW5zaWduZWQgaW50KSgweGZmICYgcHJpdltpXSkpOworCQlpZiAoZXJyb3JfY2hlY2sobGVuLCByZW1haW5pbmcpKQorCQkJcmV0dXJuIDA7CisJCWJ1ZiArPSBsZW47CisJCXJlbWFpbmluZyAtPSAoc2l6ZV90KWxlbjsKKwl9CisKKwlyZXR1cm4gYnVmbGVuIC0gcmVtYWluaW5nOworfQorCisvKgorICogUmV0dXJucyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjcmVhdGVkIHJlY29yZC4KKyAqLworX19hdHRyaWJ1dGVfbm9pbmxpbmVfXworc3RhdGljIHNpemVfdAorbnNtX2NyZWF0ZV9tb25pdG9yX3JlY29yZChjaGFyICpidWYsIGNvbnN0IHNpemVfdCBidWZsZW4sCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCBzdHJ1Y3QgbW9uICptKQoreworCWNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcDsKKwlzaXplX3QgaGV4bGVuLCByZW1haW5pbmcgPSBidWZsZW47CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgcmVtYWluaW5nLCAiJTA4eCAlMDh4ICUwOHggJTA4eCAiLAorCQkJKHVuc2lnbmVkIGludClzaW4tPnNpbl9hZGRyLnNfYWRkciwKKwkJCSh1bnNpZ25lZCBpbnQpbS0+bW9uX2lkLm15X2lkLm15X3Byb2csCisJCQkodW5zaWduZWQgaW50KW0tPm1vbl9pZC5teV9pZC5teV92ZXJzLAorCQkJKHVuc2lnbmVkIGludCltLT5tb25faWQubXlfaWQubXlfcHJvYyk7CisJaWYgKGVycm9yX2NoZWNrKGxlbiwgcmVtYWluaW5nKSkKKwkJcmV0dXJuIDA7CisJYnVmICs9IGxlbjsKKwlyZW1haW5pbmcgLT0gKHNpemVfdClsZW47CisKKwloZXhsZW4gPSBuc21fcHJpdl90b19oZXgobS0+cHJpdiwgYnVmLCByZW1haW5pbmcpOworCWlmIChoZXhsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisJYnVmICs9IGhleGxlbjsKKwlyZW1haW5pbmcgLT0gaGV4bGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCByZW1haW5pbmcsICIgJXMgJXNcbiIsCisJCQltLT5tb25faWQubW9uX25hbWUsIG0tPm1vbl9pZC5teV9pZC5teV9uYW1lKTsKKwlpZiAoZXJyb3JfY2hlY2sobGVuLCByZW1haW5pbmcpKQorCQlyZXR1cm4gMDsKKwlyZW1haW5pbmcgLT0gKHNpemVfdClsZW47CisKKwlyZXR1cm4gYnVmbGVuIC0gcmVtYWluaW5nOworfQorCitzdGF0aWMgX0Jvb2wKK25zbV9hcHBlbmRfbW9uaXRvcmVkX2hvc3QoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbGluZSkKK3sKKwlfQm9vbCByZXN1bHQgPSBmYWxzZTsKKwljaGFyICpidWYgPSBOVUxMOworCXN0cnVjdCBzdGF0IHN0YjsKKwlzaXplX3QgYnVmbGVuOworCXNzaXplX3QgbGVuOworCWludCBmZDsKKworCWlmIChzdGF0KHBhdGgsICZzdGIpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQ6ICIKKwkJCSJjb3VsZCBub3Qgc3RhdCBvcmlnaW5hbCBmaWxlICVzOiAlbSIsIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisJYnVmbGVuID0gKHNpemVfdClzdGIuc3Rfc2l6ZSArIHN0cmxlbihsaW5lKTsKKworCWJ1ZiA9IG1hbGxvYyhidWZsZW4gKyAxKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGluc2VydDogbm8gbWVtb3J5Iik7CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoYnVmLCAwLCBidWZsZW4gKyAxKTsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQ6ICIKKwkJCSJjb3VsZCBub3Qgb3BlbiBvcmlnaW5hbCBmaWxlICVzOiAlbSIsIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisKKwlsZW4gPSByZWFkKGZkLCBidWYsIChzaXplX3Qpc3RiLnN0X3NpemUpOworCWlmIChleGFjdF9lcnJvcl9jaGVjayhsZW4sIChzaXplX3Qpc3RiLnN0X3NpemUpKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQ6ICIKKwkJCSJjb3VsZCBub3QgcmVhZCBvcmlnaW5hbCBmaWxlICVzOiAlbSIsIHBhdGgpOworCQkodm9pZCljbG9zZShmZCk7CisJCWdvdG8gb3V0OworCX0KKwkodm9pZCljbG9zZShmZCk7CisKKwlzdHJjYXQoYnVmLCBsaW5lKTsKKworCWlmIChuc21fYXRvbWljX3dyaXRlKHBhdGgsIGJ1ZiwgYnVmbGVuKSkKKwkJcmVzdWx0ID0gdHJ1ZTsKKworb3V0OgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG5zbV9pbnNlcnRfbW9uaXRvcmVkX2hvc3QgLSB3cml0ZSBjYWxsYmFjayBkYXRhIGZvciBvbmUgaG9zdCB0byBkaXNrCisgKiBAaG9zdG5hbWU6IEMgc3RyaW5nIGNvbnRhaW5pbmcgYSBob3N0bmFtZQorICogQHNhcDogc29ja2FkZHIgY29udGFpbmluZyBOTE0gY2FsbGJhY2sgYWRkcmVzcworICogQG1vbjogU01fTU9OIGFyZ3VtZW50cyB0byBzYXZlCisgKgorICogUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZSBpZiBzb21lIGVycm9yIG9jY3Vycy4KKyAqLworX0Jvb2wKK25zbV9pbnNlcnRfbW9uaXRvcmVkX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQljb25zdCBzdHJ1Y3QgbW9uICptKQoreworCXN0YXRpYyBjaGFyIGJ1ZltMSU5FTEVOICsgMSArIFNNX01BWFNUUkxFTiArIDJdOworCWNoYXIgKnBhdGg7CisJX0Jvb2wgcmVzdWx0ID0gZmFsc2U7CisJc3NpemVfdCBsZW47CisJc2l6ZV90IHNpemU7CisJaW50IGZkOworCisJcGF0aCA9IG5zbV9tYWtlX3JlY29yZF9wYXRobmFtZShOU01fTU9OSVRPUl9ESVIsIGhvc3RuYW1lKTsKKwlpZiAocGF0aCA9PSBOVUxMKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQ6IGJhZCBtb25pdG9yIGhvc3RuYW1lICclcyciLAorCQkJCWhvc3RuYW1lKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXNpemUgPSBuc21fY3JlYXRlX21vbml0b3JfcmVjb3JkKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHNhcCwgbSk7CisJaWYgKHNpemUgPT0gMCkgeworCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gaW5zZXJ0OiByZWNvcmQgdG9vIGxvbmciKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiBleGNsdXNpdmUgY3JlYXRlIGZhaWxzLCB3ZSdyZSBhZGRpbmcgYSBuZXcgbGluZSB0byBhbgorCSAqIGV4aXN0aW5nIGZpbGUuCisJICovCisJZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fU1lOQywgU19JUlVTUiB8IFNfSVdVU1IpOworCWlmIChmZCA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRUVYSVNUKSB7CisJCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gaW5zZXJ0OiBjcmVhdGluZyAlczogJW0iLCBwYXRoKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmVzdWx0ID0gbnNtX2FwcGVuZF9tb25pdG9yZWRfaG9zdChwYXRoLCBidWYpOworCQlnb3RvIG91dDsKKwl9CisJcmVzdWx0ID0gdHJ1ZTsKKworCWxlbiA9IHdyaXRlKGZkLCBidWYsIHNpemUpOworCWlmIChleGFjdF9lcnJvcl9jaGVjayhsZW4sIHNpemUpKSB7CisJCXhsb2dfd2FybigiRmFpbGVkIHRvIGluc2VydDogd3JpdGluZyAlczogJW0iLCBwYXRoKTsKKwkJKHZvaWQpdW5saW5rKHBhdGgpOworCQlyZXN1bHQgPSBmYWxzZTsKKwl9CisKKwlpZiAoY2xvc2UoZmQpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQ6IGNsb3NpbmcgJXM6ICVtIiwgcGF0aCk7CisJCSh2b2lkKXVubGluayhwYXRoKTsKKwkJcmVzdWx0ID0gZmFsc2U7CisJfQorCitvdXQ6CisJZnJlZShwYXRoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitfX2F0dHJpYnV0ZV9ub2lubGluZV9fCitzdGF0aWMgX0Jvb2wKK25zbV9wYXJzZV9saW5lKGNoYXIgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCBzdHJ1Y3QgbW9uICptKQoreworCXVuc2lnbmVkIGludCBpLCB0bXA7CisJaW50IGNvdW50OworCWNoYXIgKmM7CisKKwljID0gc3RyY2hyKGxpbmUsICdcbicpOworCWlmIChjICE9IE5VTEwpCisJCSpjID0gJ1wwJzsKKworCWNvdW50ID0gc3NjYW5mKGxpbmUsICIlOHggJTh4ICU4eCAlOHggIiwKKwkJCSh1bnNpZ25lZCBpbnQgKikmc2luLT5zaW5fYWRkci5zX2FkZHIsCisJCQkodW5zaWduZWQgaW50ICopJm0tPm1vbl9pZC5teV9pZC5teV9wcm9nLAorCQkJKHVuc2lnbmVkIGludCAqKSZtLT5tb25faWQubXlfaWQubXlfdmVycywKKwkJCSh1bnNpZ25lZCBpbnQgKikmbS0+bW9uX2lkLm15X2lkLm15X3Byb2MpOworCWlmIChjb3VudCAhPSA0KQorCQlyZXR1cm4gZmFsc2U7CisKKwljID0gbGluZSArIFJQQ0FSR1NMRU47CisJZm9yIChpID0gMDsgaSA8IFNNX1BSSVZfU0laRTsgaSsrKSB7CisJCWlmIChzc2NhbmYoYywgIiUyeCIsICZ0bXApICE9IDEpCisJCQlyZXR1cm4gZmFsc2U7CisJCW0tPnByaXZbaV0gPSAoY2hhcil0bXA7CisJCWMgKz0gMjsKKwl9CisKKwljKys7CisJbS0+bW9uX2lkLm1vbl9uYW1lID0gYzsKKwl3aGlsZSAoKmMgIT0gJ1wwJyAmJiAqYyAhPSAnICcpCisJCWMrKzsKKwlpZiAoKmMgIT0gJ1wwJykKKwkJKmMrKyA9ICdcMCc7CisJd2hpbGUgKCpjID09ICcgJykKKwkJYysrOworCW0tPm1vbl9pZC5teV9pZC5teV9uYW1lID0gYzsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogU3R1ZmYgYSAnc3RydWN0IG1vbicgd2l0aCBjYWxsYmFjayBkYXRhLCBhbmQgY2FsbCBAZnVuYy4KKyAqCisgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiBpbi1jb3JlIHJlY29yZHMgY3JlYXRlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorbnNtX3JlYWRfbGluZShjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgdGltZV90IHRpbWVzdGFtcCwgY2hhciAqbGluZSwKKwkJbnNtX3BvcHVsYXRlX3QgZnVuYykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luID0geworCQkuc2luX2ZhbWlseQkJPSBBRl9JTkVULAorCX07CisJc3RydWN0IG1vbiBtOworCisJaWYgKCFuc21fcGFyc2VfbGluZShsaW5lLCAmc2luLCAmbSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGZ1bmMoaG9zdG5hbWUsIChzdHJ1Y3Qgc29ja2FkZHIgKikoY2hhciAqKSZzaW4sICZtLCB0aW1lc3RhbXApOworfQorCisvKgorICogR2l2ZW4gYSBmaWxlbmFtZSwgcmVhZHMgZGF0YSBmcm9tIGEgZmlsZSB1bmRlciBOU01fTU9OSVRPUl9ESVIKKyAqIGFuZCBpbnZva2VzIEBmdW5jIHNvIGNhbGxlciBjYW4gcG9wdWxhdGUgdGhlaXIgaW4tY29yZQorICogZGF0YWJhc2Ugd2l0aCB0aGlzIGRhdGEuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK25zbV9sb2FkX2hvc3QoY29uc3QgY2hhciAqZGlyZWN0b3J5LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgbnNtX3BvcHVsYXRlX3QgZnVuYykKK3sKKwljaGFyIGJ1ZltMSU5FTEVOICsgMSArIFNNX01BWFNUUkxFTiArIDJdOworCXVuc2lnbmVkIGludCByZXN1bHQgPSAwOworCXN0cnVjdCBzdGF0IHN0YjsKKwljaGFyICpwYXRoOworCUZJTEUgKmY7CisKKwlwYXRoID0gbnNtX21ha2VfcmVjb3JkX3BhdGhuYW1lKGRpcmVjdG9yeSwgZmlsZW5hbWUpOworCWlmIChwYXRoID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChzdGF0KHBhdGgsICZzdGIpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBzdGF0ICVzOiAlbSIsIHBhdGgpOworCQlnb3RvIG91dF9mcmVlcGF0aDsKKwl9CisKKwlmID0gZm9wZW4ocGF0aCwgInIiKTsKKwlpZiAoZiA9PSBOVUxMKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBvcGVuICVzOiAlbSIsIHBhdGgpOworCQlnb3RvIG91dF9mcmVlcGF0aDsKKwl9CisKKwl3aGlsZSAoZmdldHMoYnVmLCAoaW50KXNpemVvZihidWYpLCBmKSAhPSBOVUxMKSB7CisJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKKwkJcmVzdWx0ICs9IG5zbV9yZWFkX2xpbmUoZmlsZW5hbWUsIHN0Yi5zdF9tdGltZSwgYnVmLCBmdW5jKTsKKwl9CisJaWYgKHJlc3VsdCA9PSAwKQorCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBtb25pdG9yIGRhdGEgZnJvbSAlcyIsIHBhdGgpOworCisJKHZvaWQpZmNsb3NlKGYpOworCitvdXRfZnJlZXBhdGg6CisJZnJlZShwYXRoKTsKK291dF9lcnI6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorbnNtX2xvYWRfZGlyKGNvbnN0IGNoYXIgKmRpcmVjdG9yeSwgbnNtX3BvcHVsYXRlX3QgZnVuYykKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgKnBhdGg7CisJRElSICpkaXI7CisKKwlwYXRoID0gbnNtX21ha2VfcGF0aG5hbWUoZGlyZWN0b3J5KTsKKwlpZiAocGF0aCA9PSBOVUxMKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBwYXRoIGZvciBkaXJlY3RvcnkgJXMiLAorCQkJCWRpcmVjdG9yeSk7CisJCXJldHVybiAwOworCX0KKworCWRpciA9IG9wZW5kaXIocGF0aCk7CisJZnJlZShwYXRoKTsKKwlpZiAoZGlyID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gZGlyZWN0b3J5ICVzOiAlbSIsCisJCQkJZGlyZWN0b3J5KTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpZiAoZGUtPmRfdHlwZSAhPSAodW5zaWduZWQgY2hhcilEVF9SRUcpCisJCQljb250aW51ZTsKKwkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJY29udGludWU7CisKKwkJY291bnQgKz0gbnNtX2xvYWRfaG9zdChkaXJlY3RvcnksIGRlLT5kX25hbWUsIGZ1bmMpOworCX0KKworCSh2b2lkKWNsb3NlZGlyKGRpcik7CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIG5zbV9sb2FkX21vbml0b3JfbGlzdCAtIGxvYWQgbGlzdCBvZiBob3N0cyB0byBtb25pdG9yCisgKiBAZnVuYzogY2FsbGJhY2sgZnVuY3Rpb24gdG8gY3JlYXRlIGVudHJ5IGZvciBvbmUgaG9zdAorICoKKyAqIFJldHVybnMgdGhlIGNvdW50IG9mIGhvc3RzIHRoYXQgd2VyZSBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5LgorICovCit1bnNpZ25lZCBpbnQKK25zbV9sb2FkX21vbml0b3JfbGlzdChuc21fcG9wdWxhdGVfdCBmdW5jKQoreworCXJldHVybiBuc21fbG9hZF9kaXIoTlNNX01PTklUT1JfRElSLCBmdW5jKTsKK30KKworLyoqCisgKiBuc21fbG9hZF9ub3RpZnlfbGlzdCAtIGxvYWQgbGlzdCBvZiBob3N0cyB0byBub3RpZnkKKyAqIEBmdW5jOiBjYWxsYmFjayBmdW5jdGlvbiB0byBjcmVhdGUgZW50cnkgZm9yIG9uZSBob3N0CisgKgorICogUmV0dXJucyB0aGUgY291bnQgb2YgaG9zdHMgdGhhdCB3ZXJlIGZvdW5kIGluIHRoZSBkaXJlY3RvcnkuCisgKi8KK3Vuc2lnbmVkIGludAorbnNtX2xvYWRfbm90aWZ5X2xpc3QobnNtX3BvcHVsYXRlX3QgZnVuYykKK3sKKwlyZXR1cm4gbnNtX2xvYWRfZGlyKE5TTV9OT1RJRllfRElSLCBmdW5jKTsKK30KKworc3RhdGljIHZvaWQKK25zbV9kZWxldGVfaG9zdChjb25zdCBjaGFyICpkaXJlY3RvcnksIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQljb25zdCBjaGFyICptb25fbmFtZSwgY29uc3QgY2hhciAqbXlfbmFtZSkKK3sKKwljaGFyIGxpbmVbTElORUxFTiArIDEgKyBTTV9NQVhTVFJMRU4gKyAyXTsKKwljaGFyICpvdXRidWYgPSBOVUxMOworCXN0cnVjdCBzdGF0IHN0YjsKKwljaGFyICpwYXRoLCAqbmV4dDsKKwlzaXplX3QgcmVtYWluaW5nOworCUZJTEUgKmY7CisKKwlwYXRoID0gbnNtX21ha2VfcmVjb3JkX3BhdGhuYW1lKGRpcmVjdG9yeSwgaG9zdG5hbWUpOworCWlmIChwYXRoID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiQmFkIGZpbGVuYW1lLCBub3QgZGVsZXRpbmciKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdGF0KHBhdGgsICZzdGIpID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBkZWxldGU6ICIKKwkJCSJjb3VsZCBub3Qgc3RhdCBvcmlnaW5hbCBmaWxlICVzOiAlbSIsIHBhdGgpOworCQlnb3RvIG91dDsKKwl9CisJcmVtYWluaW5nID0gKHNpemVfdClzdGIuc3Rfc2l6ZSArIDE7CisKKwlvdXRidWYgPSBtYWxsb2MocmVtYWluaW5nKTsKKwlpZiAob3V0YnVmID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZTogbm8gbWVtb3J5Iik7CisJCWdvdG8gb3V0OworCX0KKworCWYgPSBmb3BlbihwYXRoLCAiciIpOworCWlmIChmID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZTogIgorCQkJImNvdWxkIG5vdCBvcGVuIG9yaWdpbmFsIGZpbGUgJXM6ICVtIiwgcGF0aCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2FsayB0aGUgcmVjb3JkcyBpbiB0aGUgZmlsZSwgYW5kIGNvcHkgdGhlIG5vbi1tYXRjaGluZworCSAqIG9uZXMgdG8gb3VyIG91dHB1dCBidWZmZXIuCisJICovCisJbmV4dCA9IG91dGJ1ZjsKKwl3aGlsZSAoZmdldHMobGluZSwgKGludClzaXplb2YobGluZSksIGYpICE9IE5VTEwpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwkJc3RydWN0IG1vbiBtOworCQlzaXplX3QgbGVuOworCisJCWlmICghbnNtX3BhcnNlX2xpbmUobGluZSwgJnNpbiwgJm0pKSB7CisJCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gZGVsZXRlOiAiCisJCQkJImNvdWxkIG5vdCBwYXJzZSBvcmlnaW5hbCBmaWxlICVzIiwgcGF0aCk7CisJCQkodm9pZClmY2xvc2UoZik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChzdHJjbXAobW9uX25hbWUsIG0ubW9uX2lkLm1vbl9uYW1lKSA9PSAwICYmCisJCQkgc3RyY21wKG15X25hbWUsIG0ubW9uX2lkLm15X2lkLm15X25hbWUpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBuc21fcGFyc2VfbGluZSBkZXN0cm95cyB0aGUgY29udGVudHMgb2YgbGluZVtdLCBzbworCQkgKiByZWNvbnN0cnVjdCB0aGUgY29weSBpbiBvdXIgb3V0cHV0IGJ1ZmZlci4gKi8KKwkJbGVuID0gbnNtX2NyZWF0ZV9tb25pdG9yX3JlY29yZChuZXh0LCByZW1haW5pbmcsCisJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikoY2hhciAqKSZzaW4sICZtKTsKKwkJaWYgKGxlbiA9PSAwKSB7CisJCQl4bG9nKExfRVJST1IsICJGYWlsZWQgdG8gZGVsZXRlOiAiCisJCQkJImNvdWxkIG5vdCBjb25zdHJ1Y3Qgb3V0cHV0IHJlY29yZCIpOworCQkJKHZvaWQpZmNsb3NlKGYpOworCQkJZ290byBvdXQ7CisJCX0KKwkJbmV4dCArPSBsZW47CisJCXJlbWFpbmluZyAtPSBsZW47CisJfQorCisJKHZvaWQpZmNsb3NlKGYpOworCisJLyoKKwkgKiBJZiBub3RoaW5nIHdhcyBjb3BpZWQgd2hlbiB3ZSdyZSBkb25lLCB0aGVuIHVubGluayB0aGUgZmlsZS4KKwkgKiBPdGhlcndpc2UsIGF0b21pY2FsbHkgdXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KKwkgKi8KKwlpZiAobmV4dCAhPSBvdXRidWYpIHsKKwkJaWYgKCFuc21fYXRvbWljX3dyaXRlKHBhdGgsIG91dGJ1Ziwgc3RybGVuKG91dGJ1ZikpKQorCQkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZTogIgorCQkJCSJjb3VsZCBub3Qgd3JpdGUgbmV3IGZpbGUgJXM6ICVtIiwgcGF0aCk7CisJfSBlbHNlIHsKKwkJaWYgKHVubGluayhwYXRoKSA9PSAtMSkKKwkJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBkZWxldGU6ICIKKwkJCQkiY291bGQgbm90IHVubGluayBmaWxlICVzOiAlbSIsIHBhdGgpOworCX0KKworb3V0OgorCWZyZWUob3V0YnVmKTsKKwlmcmVlKHBhdGgpOworfQorCisvKioKKyAqIG5zbV9kZWxldGVfbW9uaXRvcmVkX2hvc3QgLSBkZWxldGUgb24tZGlzayByZWNvcmQgZm9yIG1vbml0b3JlZCBob3N0CisgKiBAaG9zdG5hbWU6ICdcMCctdGVybWluYXRlZCBDIHN0cmluZyBjb250YWluaW5nIGhvc3RuYW1lIG9mIHJlY29yZCB0byBkZWxldGUKKyAqIEBtb25fbmFtZTogJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgbW9ubmFtZSBvZiByZWNvcmQgdG8gZGVsZXRlCisgKiBAbXlfbmFtZTogJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgbXluYW1lIG9mIHJlY29yZCB0byBkZWxldGUKKyAqCisgKi8KK3ZvaWQKK25zbV9kZWxldGVfbW9uaXRvcmVkX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKm1vbl9uYW1lLAorCQljb25zdCBjaGFyICpteV9uYW1lKQoreworCW5zbV9kZWxldGVfaG9zdChOU01fTU9OSVRPUl9ESVIsIGhvc3RuYW1lLCBtb25fbmFtZSwgbXlfbmFtZSk7Cit9CisKKy8qKgorICogbnNtX2RlbGV0ZV9ub3RpZmllZF9ob3N0IC0gZGVsZXRlIG9uLWRpc2sgaG9zdCByZWNvcmQgYWZ0ZXIgbm90aWZpY2F0aW9uCisgKiBAaG9zdG5hbWU6ICdcMCctdGVybWluYXRlZCBDIHN0cmluZyBjb250YWluaW5nIGhvc3RuYW1lIG9mIHJlY29yZCB0byBkZWxldGUKKyAqIEBtb25fbmFtZTogJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgbW9ubmFtZSBvZiByZWNvcmQgdG8gZGVsZXRlCisgKiBAbXlfbmFtZTogJ1wwJy10ZXJtaW5hdGVkIEMgc3RyaW5nIGNvbnRhaW5pbmcgbXluYW1lIG9mIHJlY29yZCB0byBkZWxldGUKKyAqCisgKi8KK3ZvaWQKK25zbV9kZWxldGVfbm90aWZpZWRfaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3QgY2hhciAqbW9uX25hbWUsCisJCWNvbnN0IGNoYXIgKm15X25hbWUpCit7CisJbnNtX2RlbGV0ZV9ob3N0KE5TTV9OT1RJRllfRElSLCBob3N0bmFtZSwgbW9uX25hbWUsIG15X25hbWUpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbnNtL3JwYy5jIGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbnNtL3JwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNWY0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvc3VwcG9ydC9uc20vcnBjLmMKQEAgLTAsMCArMSw1MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIG5mcy11dGlscy4KKyAqCisgKiBuZnMtdXRpbHMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIG5mcy11dGlscyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggbmZzLXV0aWxzLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKy8qCisgKiBOU00gZm9yIExpbnV4LgorICoKKyAqIEluc3RlYWQgb2YgdXNpbmcgT05DIG9yIFRJIFJQQyBsaWJyYXJ5IGNhbGxzLCBzdGF0ZCBjb25zdHJ1Y3RzCisgKiBSUEMgY2FsbHMgZGlyZWN0bHkgaW4gc29ja2V0IGJ1ZmZlcnMuICBUaGlzIGFsbG93cyBhIHNpbmdsZQorICogc29ja2V0IHRvIGJlIGNvbmN1cnJlbnRseSBzaGFyZWQgYW1vbmcgc2V2ZXJhbCBkaWZmZXJlbnQgUlBDCisgKiBwcm9ncmFtcyBhbmQgdmVyc2lvbnMgdXNpbmcgYSBzaW1wbGUgUlBDIHJlcXVlc3QgZGlzcGF0Y2hlci4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRldGFpbHMgb2YgUlBDIGhlYWRlciBhbmQgY2FsbAorICogY29uc3RydWN0aW9uIGFuZCByZXBseSBwYXJzaW5nLCBhbmQgYSBtZXRob2QgZm9yIGNyZWF0aW5nIGEKKyAqIHNvY2tldCBmb3IgdXNlIHdpdGggdGhlc2UgZnVuY3Rpb25zLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYJLyogSEFWRV9DT05GSUdfSCAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9wcm90Lmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfcm10Lmg+CisKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisjaW5jbHVkZSA8bmV0Y29uZmlnLmg+CisjaW5jbHVkZSA8cnBjL3JwY2JfcHJvdC5oPgorI2VuZGlmCS8qIEhBVkVfTElCVElSUEMgKi8KKworI2luY2x1ZGUgInhsb2cuaCIKKyNpbmNsdWRlICJuZnNycGMuaCIKKyNpbmNsdWRlICJuc20uaCIKKyNpbmNsdWRlICJzbV9pbnRlci5oIgorCisvKgorICogUmV0dXJucyBhIGZyZXNoIFhJRCBhcHByb3ByaWF0ZSBmb3IgUlBDIG92ZXIgVURQIC0tIG5ldmVyIHplcm8uCisgKi8KK3N0YXRpYyB1aW50MzJfdAorbnNtX25leHRfeGlkKHZvaWQpCit7CisJc3RhdGljIHVpbnQzMl90IG5zbV94aWQgPSAwOworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWlmIChuc21feGlkID09IDApIHsKKwkJKHZvaWQpZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworCQluc21feGlkID0gKHVpbnQzMl90KWdldHBpZCgpIF4KKwkJCQkodWludDMyX3Qpbm93LnR2X3NlYyBeICh1aW50MzJfdClub3cudHZfdXNlYzsKKwl9CisKKwlyZXR1cm4gbnNtX3hpZCsrOworfQorCisvKgorICogU2VsZWN0IGEgZnJlc2ggWElEIGFuZCBjb25zdHJ1Y3QgYW4gUlBDIGhlYWRlciBpbiBAbWVzZy4KKyAqIEFsd2F5cyB1c2UgQVVUSF9OVUxMIGNyZWRlbnRpYWxzIGFuZCB2ZXJpZmllcnMuCisgKgorICogUmV0dXJucyB0aGUgbmV3IFhJRC4KKyAqLworc3RhdGljIHVpbnQzMl90Cituc21faW5pdF9ycGNfaGVhZGVyKGNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLCBjb25zdCBycGN2ZXJzX3QgdmVyc2lvbiwKKwkJCWNvbnN0IHJwY3Byb2NfdCBwcm9jZWR1cmUsIHN0cnVjdCBycGNfbXNnICptZXNnKQoreworCXN0cnVjdCBjYWxsX2JvZHkgKmNiID0gJm1lc2ctPnJtX2NhbGw7CisJdWludDMyX3QgeGlkID0gbnNtX25leHRfeGlkKCk7CisKKwltZW1zZXQobWVzZywgMCwgc2l6ZW9mKCptZXNnKSk7CisKKwltZXNnLT5ybV94aWQgPSAodW5zaWduZWQgbG9uZyl4aWQ7CisJbWVzZy0+cm1fZGlyZWN0aW9uID0gQ0FMTDsKKworCWNiLT5jYl9ycGN2ZXJzID0gUlBDX01TR19WRVJTSU9OOworCWNiLT5jYl9wcm9nID0gcHJvZ3JhbTsKKwljYi0+Y2JfdmVycyA9IHZlcnNpb247CisJY2ItPmNiX3Byb2MgPSBwcm9jZWR1cmU7CisKKwljYi0+Y2JfY3JlZC5vYV9mbGF2b3IgPSBBVVRIX05VTEw7CisJY2ItPmNiX2NyZWQub2FfYmFzZSA9IChjYWRkcl90KSBOVUxMOworCWNiLT5jYl9jcmVkLm9hX2xlbmd0aCA9IDA7CisJY2ItPmNiX3ZlcmYub2FfZmxhdm9yID0gQVVUSF9OVUxMOworCWNiLT5jYl92ZXJmLm9hX2Jhc2UgPSAoY2FkZHJfdCkgTlVMTDsKKwljYi0+Y2JfdmVyZi5vYV9sZW5ndGggPSAwOworCisJcmV0dXJuIHhpZDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG5ldHdvcmsgc2VuZCBidWZmZXIgYW5kIFhEUiBtZW1vcnkgZm9yIGVuY29kaW5nLgorICovCitzdGF0aWMgdm9pZAorbnNtX2luaXRfeGRybWVtKGNoYXIgKm1zZ2J1ZiwgY29uc3QgdW5zaWduZWQgaW50IG1zZ2J1ZmxlbiwKKwkJWERSICp4ZHJwKQoreworCW1lbXNldChtc2didWYsIDAsIChzaXplX3QpbXNnYnVmbGVuKTsKKwltZW1zZXQoeGRycCwgMCwgc2l6ZW9mKCp4ZHJwKSk7CisJeGRybWVtX2NyZWF0ZSh4ZHJwLCBtc2didWYsIG1zZ2J1ZmxlbiwgWERSX0VOQ09ERSk7Cit9CisKKy8qCisgKiBTZW5kIGEgY29tcGxldGVkIFJQQyBjYWxsIG9uIGEgc29ja2V0LgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIGJ5dGVzIHdlcmUgc2VudCBzdWNjZXNzZnVsbHk7IG90aGVyd2lzZQorICogZmFsc2UgaWYgYW55IGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgX0Jvb2wKK25zbV9ycGNfc2VuZHRvKGNvbnN0IGludCBzb2NrLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCWNvbnN0IHNvY2tsZW5fdCBzYWxlbiwgWERSICp4ZHJzLCB2b2lkICpidWYpCit7CisJY29uc3Qgc2l6ZV90IGJ1ZmxlbiA9IChzaXplX3QpeGRyX2dldHBvcyh4ZHJzKTsKKwlzc2l6ZV90IGVycjsKKworCWVyciA9IHNlbmR0byhzb2NrLCBidWYsIGJ1ZmxlbiwgMCwgc2FwLCBzYWxlbik7CisJaWYgKChlcnIgPCAwKSB8fCAoKHNpemVfdCllcnIgIT0gYnVmbGVuKSkgeworCQl4bG9nKExfRVJST1IsICIlczogc2VuZHRvIGZhaWxlZDogJW0iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogbnNtX3htaXRfZ2V0cG9ydCAtIHBvc3QgYSBQTUFQX0dFVFBPUlQgY2FsbCBvbiBhIHNvY2tldCBkZXNjcmlwdG9yCisgKiBAc29jazogZGF0YWdyYW0gc29ja2V0IGRlc2NyaXB0b3IKKyAqIEBzaW46IHBvaW50ZXIgdG8gQUZfSU5FVCBzb2NrZXQgYWRkcmVzcyBvZiBzZXJ2ZXIKKyAqIEBwcm9ncmFtOiBSUEMgcHJvZ3JhbSBudW1iZXIgdG8gcXVlcnkKKyAqIEB2ZXJzaW9uOiBSUEMgdmVyc2lvbiBudW1iZXIgdG8gcXVlcnkKKyAqCisgKiBTZW5kIGEgUE1BUF9HRVRQT1JUIGNhbGwgdG8gdGhlIHBvcnRtYXAgZGFlbW9uIGF0IEBzaW4gdXNpbmcKKyAqIHNvY2tldCBkZXNjcmlwdG9yIEBzb2NrLiAgVGhpcyByZXF1ZXN0IHF1ZXJpZXMgdGhlIFJQQyBwcm9ncmFtCisgKiBbcHJvZ3JhbSwgdmVyc2lvbiwgSVBQUk9UT19VRFBdLgorICoKKyAqIE5COiBQTUFQX0dFVFBPUlQgd29ya3Mgb25seSBmb3IgSVB2NCBob3N0cy4gIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqICAgICB3b3JrcyBvbmx5IG92ZXIgVURQLCBhbmQgcXVlcmllcyBvbmx5IFVEUCByZWdpc3RyYXRpb25zLgorICoKKyAqIFJldHVybnMgdGhlIFhJRCBvZiB0aGUgY2FsbCwgb3IgemVybyBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLwordWludDMyX3QKK25zbV94bWl0X2dldHBvcnQoY29uc3QgaW50IHNvY2ssIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLAorCQkJY29uc3QgdW5zaWduZWQgbG9uZyBwcm9ncmFtLAorCQkJY29uc3QgdW5zaWduZWQgbG9uZyB2ZXJzaW9uKQoreworCWNoYXIgbXNnYnVmW05TTV9NQVhNU0dTSVpFXTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzdHJ1Y3QgcnBjX21zZyBtZXNnOworCV9Cb29sIHNlbnQgPSBmYWxzZTsKKwlzdHJ1Y3QgcG1hcCBwYXJtcyA9IHsKKwkJLnBtX3Byb2cJPSBwcm9ncmFtLAorCQkucG1fdmVycwk9IHZlcnNpb24sCisJCS5wbV9wcm90CT0gKHVuc2lnbmVkIGxvbmcpSVBQUk9UT19VRFAsCisJfTsKKwl1aW50MzJfdCB4aWQ7CisJWERSIHhkcjsKKworCXhsb2coRF9DQUxMLCAiU2VuZGluZyBQTUFQX0dFVFBPUlQgZm9yICV1LCAldSwgdWRwIiwgcHJvZ3JhbSwgdmVyc2lvbik7CisKKwluc21faW5pdF94ZHJtZW0obXNnYnVmLCBOU01fTUFYTVNHU0laRSwgJnhkcik7CisJeGlkID0gbnNtX2luaXRfcnBjX2hlYWRlcihQTUFQUFJPRywgUE1BUFZFUlMsCisJCQkJCShycGNwcm9jX3QpUE1BUFBST0NfR0VUUE9SVCwgJm1lc2cpOworCisJYWRkciA9ICpzaW47CisJYWRkci5zaW5fcG9ydCA9IGh0b25zKFBNQVBQT1JUKTsKKworCWlmICh4ZHJfY2FsbG1zZygmeGRyLCAmbWVzZykgPT0gVFJVRSAmJgorCSAgICB4ZHJfcG1hcCgmeGRyLCAmcGFybXMpID09IFRSVUUpCisJCXNlbnQgPSBuc21fcnBjX3NlbmR0byhzb2NrLCAoc3RydWN0IHNvY2thZGRyICopKGNoYXIgKikmYWRkciwKKwkJCQkJKHNvY2tsZW5fdClzaXplb2YoYWRkciksICZ4ZHIsIG1zZ2J1Zik7CisJZWxzZQorCQl4bG9nKExfRVJST1IsICIlczogY2FuJ3QgZW5jb2RlIFBNQVBfR0VUUE9SVCBjYWxsIiwgX19mdW5jX18pOworCisJeGRyX2Rlc3Ryb3koJnhkcik7CisKKwlpZiAoc2VudCA9PSBmYWxzZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHhpZDsKK30KKworLyoqCisgKiBuc21feG1pdF9nZXRhZGRyIC0gcG9zdCBhbiBSUENCX0dFVEFERFIgY2FsbCBvbiBhIHNvY2tldCBkZXNjcmlwdG9yCisgKiBAc29jazogZGF0YWdyYW0gc29ja2V0IGRlc2NyaXB0b3IKKyAqIEBzaW46IHBvaW50ZXIgdG8gQUZfSU5FVDYgc29ja2V0IGFkZHJlc3Mgb2Ygc2VydmVyCisgKiBAcHJvZ3JhbTogUlBDIHByb2dyYW0gbnVtYmVyIHRvIHF1ZXJ5CisgKiBAdmVyc2lvbjogUlBDIHZlcnNpb24gbnVtYmVyIHRvIHF1ZXJ5CisgKgorICogU2VuZCBhbiBSUENCX0dFVEFERFIgY2FsbCB0byB0aGUgcnBjYmluZCBkYWVtb24gYXQgQHNhcCB1c2luZworICogc29ja2V0IGRlc2NyaXB0b3IgQHNvY2suICBUaGlzIHJlcXVlc3QgcXVlcmllcyB0aGUgUlBDIHByb2dyYW0KKyAqIFtwcm9ncmFtLCB2ZXJzaW9uLCAidWRwNiJdLgorICoKKyAqIE5COiBSUENCX0dFVEFERFIgd29ya3MgZm9yIGJvdGggSVB2NCBhbmQgSVB2NiBob3N0cy4gIFRoaXMKKyAqICAgICBpbXBsZW1lbnRhdGlvbiB3b3JrcyBvbmx5IG92ZXIgVURQIGFuZCBBRl9JTkVUNiwgYW5kIHF1ZXJpZXMKKyAqICAgICBvbmx5ICJ1ZHA2IiByZWdpc3RyYXRpb25zLgorICoKKyAqIFJldHVybnMgdGhlIFhJRCBvZiB0aGUgY2FsbCwgb3IgemVybyBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworI2lmZGVmIEhBVkVfTElCVElSUEMKK3VpbnQzMl90Cituc21feG1pdF9nZXRhZGRyKGNvbnN0IGludCBzb2NrLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42LAorCQkJY29uc3QgcnBjcHJvZ190IHByb2dyYW0sIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uKQoreworCWNoYXIgbXNnYnVmW05TTV9NQVhNU0dTSVpFXTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IGFkZHI7CisJc3RydWN0IHJwY19tc2cgbWVzZzsKKwlfQm9vbCBzZW50ID0gZmFsc2U7CisJc3RydWN0IHJwY2IgcGFybXMgPSB7CisJCS5yX3Byb2cJCT0gcHJvZ3JhbSwKKwkJLnJfdmVycwkJPSB2ZXJzaW9uLAorCQkucl9uZXRpZAk9ICJ1ZHA2IiwKKwkJLnJfb3duZXIJPSAiIiwKKwl9OworCXVpbnQzMl90IHhpZDsKKwlYRFIgeGRyOworCisJeGxvZyhEX0NBTEwsICJTZW5kaW5nIFJQQ0JfR0VUQUREUiBmb3IgJXUsICV1LCB1ZHA2IiwgcHJvZ3JhbSwgdmVyc2lvbik7CisKKwluc21faW5pdF94ZHJtZW0obXNnYnVmLCBOU01fTUFYTVNHU0laRSwgJnhkcik7CisJeGlkID0gbnNtX2luaXRfcnBjX2hlYWRlcihSUENCUFJPRywgUlBDQlZFUlMsCisJCQkJCShycGNwcm9jX3QpUlBDQlBST0NfR0VUQUREUiwgJm1lc2cpOworCisJYWRkciA9ICpzaW42OworCWFkZHIuc2luNl9wb3J0ID0gaHRvbnMoUE1BUFBPUlQpOworCXBhcm1zLnJfYWRkciA9IG5mc19zb2NrYWRkcjJ1bml2ZXJzYWwoKHN0cnVjdCBzb2NrYWRkciAqKShjaGFyICopJmFkZHIpOworCWlmIChwYXJtcy5yX2FkZHIgPT0gTlVMTCkgeworCQl4bG9nKExfRVJST1IsICIlczogY2FuJ3QgZW5jb2RlIHNvY2tldCBhZGRyZXNzIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoeGRyX2NhbGxtc2coJnhkciwgJm1lc2cpID09IFRSVUUgJiYKKwkgICAgeGRyX3JwY2IoJnhkciwgJnBhcm1zKSA9PSBUUlVFKQorCQlzZW50ID0gbnNtX3JwY19zZW5kdG8oc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKShjaGFyICopJmFkZHIsCisJCQkJCShzb2NrbGVuX3Qpc2l6ZW9mKGFkZHIpLCAmeGRyLCBtc2didWYpOworCWVsc2UKKwkJeGxvZyhMX0VSUk9SLCAiJXM6IGNhbid0IGVuY29kZSBSUENCX0dFVEFERFIgY2FsbCIsIF9fZnVuY19fKTsKKworCXhkcl9kZXN0cm95KCZ4ZHIpOworCWZyZWUocGFybXMucl9hZGRyKTsKKworCWlmIChzZW50ID09IGZhbHNlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4geGlkOworfQorI2Vsc2UJLyogIUhBVkVfTElCVElSUEMgKi8KK3VpbnQzMl90Cituc21feG1pdF9nZXRhZGRyKGNvbnN0IGludCBzb2NrIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJCWNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJY29uc3QgcnBjdmVyc190IHZlcnNpb24gX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogIUhBVkVfTElCVElSUEMgKi8KKworLyoqCisgKiBuc21feG1pdF9ycGNiaW5kIC0gcG9zdCBhbiBycGNiaW5kIHJlcXVlc3QKKyAqIEBzb2NrOiBkYXRhZ3JhbSBzb2NrZXQgZGVzY3JpcHRvcgorICogQHNhcDogcG9pbnRlciB0byBzb2NrZXQgYWRkcmVzcyBvZiBzZXJ2ZXIKKyAqIEBwcm9ncmFtOiBSUEMgcHJvZ3JhbSBudW1iZXIgdG8gcXVlcnkKKyAqIEB2ZXJzaW9uOiBSUEMgdmVyc2lvbiBudW1iZXIgdG8gcXVlcnkKKyAqCisgKiBTZW5kIGFuIHJwY2JpbmQgcXVlcnkgdG8gdGhlIHJwY2JpbmQgZGFlbW9uIGF0IEBzYXAgdXNpbmcKKyAqIHNvY2tldCBkZXNjcmlwdG9yIEBzb2NrLgorICoKKyAqIE5COiBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzIG9ubHkgb3ZlciBVRFAsIGJ1dCBjYW4gcXVlcnkgSVB2NCBvciBJUHY2CisgKiAgICAgaG9zdHMuICBJdCBxdWVyaWVzIG9ubHkgVURQIHJlZ2lzdHJhdGlvbnMuCisgKgorICogUmV0dXJucyB0aGUgWElEIG9mIHRoZSBjYWxsLCBvciB6ZXJvIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCit1aW50MzJfdAorbnNtX3htaXRfcnBjYmluZChjb25zdCBpbnQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQljb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwgY29uc3QgcnBjdmVyc190IHZlcnNpb24pCit7CisJc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIG5zbV94bWl0X2dldHBvcnQoc29jaywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhcCwKKwkJCQkJCXByb2dyYW0sIHZlcnNpb24pOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBuc21feG1pdF9nZXRhZGRyKHNvY2ssIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FwLAorCQkJCQkJcHJvZ3JhbSwgdmVyc2lvbik7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIG5zbV94bWl0X25vdGlmeSAtIHBvc3QgYW4gTlNNUFJPQ19OT1RJRlkgY2FsbCBvbiBhIHNvY2tldCBkZXNjcmlwdG9yCisgKiBAc29jazogZGF0YWdyYW0gc29ja2V0IGRlc2NyaXB0b3IKKyAqIEBzYXA6IHBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3Mgb2YgcGVlciB0byBub3RpZnkgKHBvcnQgYWxyZWFkeSBmaWxsZWQgaW4pCisgKiBAc2FsZW46IGxlbmd0aCBvZiBzb2NrZXQgYWRkcmVzcworICogQHByb2dyYW06IFJQQyBwcm9ncmFtIG51bWJlciB0byB1c2UKKyAqIEBtb25fbmFtZTogbW9uX25hbWUgb2YgbG9jYWwgcGVlciAoaWUgdGhlIHJlYm9vdGluZyBzeXN0ZW0pCisgKiBAc3RhdGU6IHN0YXRlIG9mIGxvY2FsIHBlZXIKKyAqCisgKiBTZW5kIGFuIE5TTVBST0NfTk9USUZZIGNhbGwgdG8gdGhlIHBlZXIgYXQgQHNhcCB1c2luZyBzb2NrZXQgZGVzY3JpcHRvciBAc29jay4KKyAqIFRoaXMgcmVxdWVzdCBub3RpZmllcyB0aGUgcGVlciB0aGF0IHdlIGhhdmUgcmVib290ZWQuCisgKgorICogTkI6IFRoaXMgaW1wbGVtZW50YXRpb24gd29ya3Mgb25seSBvdmVyIFVEUCwgYnV0IHN1cHBvcnRzIGJvdGggQUZfSU5FVAorICogICAgIGFuZCBBRl9JTkVUNi4KKyAqCisgKiBSZXR1cm5zIHRoZSBYSUQgb2YgdGhlIGNhbGwsIG9yIHplcm8gaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3VpbnQzMl90Cituc21feG1pdF9ub3RpZnkoY29uc3QgaW50IHNvY2ssIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJY29uc3Qgc29ja2xlbl90IHNhbGVuLCBjb25zdCBycGNwcm9nX3QgcHJvZ3JhbSwKKwkJCWNvbnN0IGNoYXIgKm1vbl9uYW1lLCBjb25zdCBpbnQgc3RhdGUpCit7CisJY2hhciBtc2didWZbTlNNX01BWE1TR1NJWkVdOworCXN0cnVjdCBzdGF0X2NoZ2Ugc3RhdGVfY2hhbmdlOworCXN0cnVjdCBycGNfbXNnIG1lc2c7CisJX0Jvb2wgc2VudCA9IGZhbHNlOworCXVpbnQzMl90IHhpZDsKKwlYRFIgeGRyOworCisJc3RhdGVfY2hhbmdlLm1vbl9uYW1lID0gc3RyZHVwKG1vbl9uYW1lKTsKKwlpZiAoc3RhdGVfY2hhbmdlLm1vbl9uYW1lID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiJXM6IG5vIG1lbW9yeSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCXN0YXRlX2NoYW5nZS5zdGF0ZSA9IHN0YXRlOworCisJeGxvZyhEX0NBTEwsICJTZW5kaW5nIFNNX05PVElGWSBmb3IgJXMiLCBtb25fbmFtZSk7CisKKwluc21faW5pdF94ZHJtZW0obXNnYnVmLCBOU01fTUFYTVNHU0laRSwgJnhkcik7CisJeGlkID0gbnNtX2luaXRfcnBjX2hlYWRlcihwcm9ncmFtLCBTTV9WRVJTLCBTTV9OT1RJRlksICZtZXNnKTsKKworCWlmICh4ZHJfY2FsbG1zZygmeGRyLCAmbWVzZykgPT0gVFJVRSAmJgorCSAgICB4ZHJfc3RhdF9jaGdlKCZ4ZHIsICZzdGF0ZV9jaGFuZ2UpID09IFRSVUUpCisJCXNlbnQgPSBuc21fcnBjX3NlbmR0byhzb2NrLCBzYXAsIHNhbGVuLCAmeGRyLCBtc2didWYpOworCWVsc2UKKwkJeGxvZyhMX0VSUk9SLCAiJXM6IGNhbid0IGVuY29kZSBOU01QUk9DX05PVElGWSBjYWxsIiwKKwkJCQlfX2Z1bmNfXyk7CisKKwl4ZHJfZGVzdHJveSgmeGRyKTsKKwlmcmVlKHN0YXRlX2NoYW5nZS5tb25fbmFtZSk7CisKKwlpZiAoc2VudCA9PSBmYWxzZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHhpZDsKK30KKworLyoqCisgKiBuc21feG1pdF9ubG1jYWxsIC0gcG9zdCBhbiB1bm5hbWVkIGNhbGwgdG8gbG9jYWwgTkxNIG9uIGEgc29ja2V0IGRlc2NyaXB0b3IKKyAqIEBzb2NrOiBkYXRhZ3JhbSBzb2NrZXQgZGVzY3JpcHRvcgorICogQHNhcDogYWRkcmVzcy9wb3J0IG9mIE5MTSBzZXJ2aWNlIHRvIGNvbnRhY3QKKyAqIEBzYWxlbjogc2l6ZSBvZiBAc2FwCisgKiBAbTogY2FsbGJhY2sgZGF0YSBkZWZpbmluZyBSUEMgY2FsbCB0byBtYWtlCisgKiBAc3RhdGU6IHN0YXRlIG9mIHJlYm9vdGluZyBob3N0CisgKgorICogU2VuZCBhbiB1bm5hbWVkIGNhbGwgKHByZXZpb3VzbHkgcmVxdWVzdGVkIHZpYSBOU01QUk9DX01PTikgdG8gdGhlCisgKiBzcGVjaWZpZWQgbG9jYWwgVURQLWJhc2VkIFJQQyBzZXJ2aWNlIHVzaW5nIHNvY2tldCBkZXNjcmlwdG9yIEBzb2NrLgorICoKKyAqIE5COiBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzIG9ubHkgb3ZlciBVRFAsIGJ1dCBzdXBwb3J0cyBib3RoIEFGX0lORVQKKyAqICAgICBhbmQgQUZfSU5FVDYuCisgKgorICogUmV0dXJucyB0aGUgWElEIG9mIHRoZSBjYWxsLCBvciB6ZXJvIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCit1aW50MzJfdAorbnNtX3htaXRfbmxtY2FsbChjb25zdCBpbnQgc29jaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQljb25zdCBzb2NrbGVuX3Qgc2FsZW4sIGNvbnN0IHN0cnVjdCBtb24gKm0sCisJCQljb25zdCBpbnQgc3RhdGUpCit7CisJY29uc3Qgc3RydWN0IG15X2lkICppZCA9ICZtLT5tb25faWQubXlfaWQ7CisJY2hhciBtc2didWZbTlNNX01BWE1TR1NJWkVdOworCXN0cnVjdCBzdGF0dXMgbmV3X3N0YXR1czsKKwlzdHJ1Y3QgcnBjX21zZyBtZXNnOworCV9Cb29sIHNlbnQgPSBmYWxzZTsKKwl1aW50MzJfdCB4aWQ7CisJWERSIHhkcjsKKworCXhsb2coRF9DQUxMLCAiU2VuZGluZyBOTE0gZG93bmNhbGwgZm9yICVzIiwgbS0+bW9uX2lkLm1vbl9uYW1lKTsKKworCW5zbV9pbml0X3hkcm1lbShtc2didWYsIE5TTV9NQVhNU0dTSVpFLCAmeGRyKTsKKwl4aWQgPSBuc21faW5pdF9ycGNfaGVhZGVyKChycGNwcm9nX3QpaWQtPm15X3Byb2csCisJCQkJCShycGN2ZXJzX3QpaWQtPm15X3ZlcnMsCisJCQkJCShycGNwcm9jX3QpaWQtPm15X3Byb2MsICZtZXNnKTsKKworCW5ld19zdGF0dXMubW9uX25hbWUgPSBtLT5tb25faWQubW9uX25hbWU7CisJbmV3X3N0YXR1cy5zdGF0ZSA9IHN0YXRlOworCW1lbWNweSgmbmV3X3N0YXR1cy5wcml2LCAmbS0+cHJpdiwgc2l6ZW9mKG5ld19zdGF0dXMucHJpdikpOworCisJaWYgKHhkcl9jYWxsbXNnKCZ4ZHIsICZtZXNnKSA9PSBUUlVFICYmCisJICAgIHhkcl9zdGF0dXMoJnhkciwgJm5ld19zdGF0dXMpID09IFRSVUUpCisJCXNlbnQgPSBuc21fcnBjX3NlbmR0byhzb2NrLCBzYXAsIHNhbGVuLCAmeGRyLCBtc2didWYpOworCWVsc2UKKwkJeGxvZyhMX0VSUk9SLCAiJXM6IGNhbid0IGVuY29kZSBOTE0gZG93bmNhbGwiLCBfX2Z1bmNfXyk7CisKKwl4ZHJfZGVzdHJveSgmeGRyKTsKKworCWlmIChzZW50ID09IGZhbHNlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4geGlkOworfQorCisvKioKKyAqIG5zbV9wYXJzZV9yZXBseSAtIHBhcnNlIGFuZCB2YWxpZGF0ZSB0aGUgaGVhZGVyIGluIGFuIFJQQyByZXBseQorICogQHhkcnM6IHBvaW50ZXIgdG8gWERSCisgKgorICogUmV0dXJucyB0aGUgWElEIG9mIHRoZSByZXBseSwgb3IgemVybyBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLwordWludDMyX3QKK25zbV9wYXJzZV9yZXBseShYRFIgKnhkcnMpCit7CisJc3RydWN0IHJwY19tc2cgbWVzZyA9IHsKKwkJLnJtX3JlcGx5LnJwX2FjcHQuYXJfcmVzdWx0cy5wcm9jCT0gKHhkcnByb2NfdCl4ZHJfdm9pZCwKKwl9OworCXVpbnQzMl90IHhpZDsKKworCWlmICh4ZHJfcmVwbHltc2coeGRycywgJm1lc2cpID09IEZBTFNFKSB7CisJCXhsb2coTF9FUlJPUiwgIiVzOiBjYW4ndCBkZWNvZGUgUlBDIHJlcGx5IiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJeGlkID0gKHVpbnQzMl90KW1lc2cucm1feGlkOworCisJaWYgKG1lc2cucm1fcmVwbHkucnBfc3RhdCAhPSBNU0dfQUNDRVBURUQpIHsKKwkJeGxvZyhMX0VSUk9SLCAiJXM6IFsweCV4XSBSUEMgc3RhdHVzICVkIiwKKwkJCV9fZnVuY19fLCB4aWQsIG1lc2cucm1fcmVwbHkucnBfc3RhdCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtZXNnLnJtX3JlcGx5LnJwX2FjcHQuYXJfc3RhdCAhPSBTVUNDRVNTKSB7CisJCXhsb2coTF9FUlJPUiwgIiVzOiBbMHgleF0gUlBDIGFjY2VwdCBzdGF0dXMgJWQiLAorCQkJX19mdW5jX18sIHhpZCwgbWVzZy5ybV9yZXBseS5ycF9hY3B0LmFyX3N0YXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4geGlkOworfQorCisvKioKKyAqIG5zbV9yZWN2X2dldHBvcnQgLSBwYXJzZSBQTUFQX0dFVFBPUlQgcmVwbHkKKyAqIEB4ZHJzOiBwb2ludGVyIHRvIFhEUgorICoKKyAqIFJldHVybnMgdGhlIHBvcnQgbnVtYmVyIGZyb20gdGhlIFJQQyByZXBseSwgb3IgemVybworICogaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK25zbV9yZWN2X2dldHBvcnQoWERSICp4ZHJzKQoreworCXVuc2lnbmVkIGxvbmcgcG9ydCA9IDA7CisKKwlpZiAoeGRyX3VfbG9uZyh4ZHJzLCAmcG9ydCkgPT0gRkFMU0UpCisJCXhsb2coTF9FUlJPUiwgIiVzOiBjYW4ndCBkZWNvZGUgcG1hcCByZXBseSIsCisJCQlfX2Z1bmNfXyk7CisJaWYgKHBvcnQgPiBVSU5UMTZfTUFYKSB7CisJCXhsb2coTF9FUlJPUiwgIiVzOiBiYWQgcG9ydCBudW1iZXIiLAorCQkJX19mdW5jX18pOworCQlwb3J0ID0gMDsKKwl9CisKKwl4bG9nKERfQ0FMTCwgIlJlY2VpdmVkIFBNQVBfR0VUUE9SVCByZXN1bHQ6ICVsdSIsIHBvcnQpOworCXJldHVybiBwb3J0OworfQorCisvKioKKyAqIG5zbV9yZWN2X2dldGFkZHIgLSBwYXJzZSBSUENCX0dFVEFERFIgcmVwbHkKKyAqIEB4ZHJzOiBwb2ludGVyIHRvIFhEUgorICoKKyAqIFJldHVybnMgdGhlIHBvcnQgbnVtYmVyIGZyb20gdGhlIFJQQyByZXBseSwgb3IgemVybworICogaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3VpbnQxNl90Cituc21fcmVjdl9nZXRhZGRyKFhEUiAqeGRycykKK3sKKwljaGFyICp1YWRkciA9IE5VTEw7CisJaW50IHBvcnQ7CisKKwlpZiAoeGRyX3dyYXBzdHJpbmcoeGRycywgJnVhZGRyKSA9PSBGQUxTRSkKKwkJeGxvZyhMX0VSUk9SLCAiJXM6IGNhbid0IGRlY29kZSBycGNiIHJlcGx5IiwKKwkJCV9fZnVuY19fKTsKKworCWlmICgodWFkZHIgPT0gTlVMTCkgfHwgKHVhZGRyWzBdID09ICdcMCcpKSB7CisJCXhsb2coRF9DQUxMLCAiUmVjZWl2ZWQgUlBDQl9HRVRBRERSIHJlc3VsdDogIgorCQkJCSJwcm9ncmFtIG5vdCByZWdpc3RlcmVkIik7CisJCXJldHVybiAwOworCX0KKworCXBvcnQgPSBuZnNfdW5pdmVyc2FsMnBvcnQodWFkZHIpOworCisJeGRyX2ZyZWUoKHhkcnByb2NfdCl4ZHJfd3JhcHN0cmluZywgKGNoYXIgKikmdWFkZHIpOworCisJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiBVSU5UMTZfTUFYKSB7CisJCXhsb2coTF9FUlJPUiwgIiVzOiBiYWQgcG9ydCBudW1iZXIiLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwl4bG9nKERfQ0FMTCwgIlJlY2VpdmVkIFJQQ0JfR0VUQUREUiByZXN1bHQ6ICVkIiwgcG9ydCk7CisJcmV0dXJuICh1aW50MTZfdClwb3J0OworfQorCisvKioKKyAqIG5zbV9yZWN2X3JwY2JpbmQgLSBwYXJzZSBycGNiaW5kIHJlcGx5CisgKiBAYWY6IGFkZHJlc3MgZmFtaWx5IG9mIHJlcGx5CisgKiBAeGRyczogcG9pbnRlciB0byBYRFIKKyAqCisgKiBSZXR1cm5zIHRoZSBwb3J0IG51bWJlciBmcm9tIHRoZSBSUEMgcmVwbHksIG9yIHplcm8KKyAqIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCit1aW50MTZfdAorbnNtX3JlY3ZfcnBjYmluZChjb25zdCBzYV9mYW1pbHlfdCBmYW1pbHksIFhEUiAqeGRycykKK3sKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuICh1aW50MTZfdCluc21fcmVjdl9nZXRwb3J0KHhkcnMpOworCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBuc21fcmVjdl9nZXRhZGRyKHhkcnMpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25zbS9zbV9pbnRlci54IGIvbmZzLXV0aWxzLTEuMi4yL3N1cHBvcnQvbnNtL3NtX2ludGVyLngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMGFkNwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi9zdXBwb3J0L25zbS9zbV9pbnRlci54CkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTg2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIE1vZGlmaWVkIGJ5IEplZmZyZXkgQS4gVXBob2ZmLCAxOTk1LCAxOTk3LTE5OTkuCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoLCAxOTk2LgorICogTW9kaWZpZWQgYnkgSC5KLiBMdSwgMTk5OC4KKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBTdGF0dXMgbW9uaXRvciBwcm90b2NvbCBzcGVjaWZpY2F0aW9uCisgKi8KKworI2lmZGVmIFJQQ19DTE5UCislI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKK3Byb2dyYW0gU01fUFJPRyB7IAorCXZlcnNpb24gU01fVkVSUyAgeworCQkvKiByZXNfc3RhdCA9IHN0YXRfc3VjYyBpZiBzdGF0dXMgbW9uaXRvciBhZ3JlZXMgdG8gbW9uaXRvciAqLworCQkvKiByZXNfc3RhdCA9IHN0YXRfZmFpbCBpZiBzdGF0dXMgbW9uaXRvciBjYW5ub3QgbW9uaXRvciAqLworCQkvKiBpZiByZXNfc3RhdCA9PSBzdGF0X3N1Y2MsIHN0YXRlID0gc3RhdGUgbnVtYmVyIG9mIHNpdGUgc21fbmFtZSAqLworCQlzdHJ1Y3Qgc21fc3RhdF9yZXMJCQkgU01fU1RBVChzdHJ1Y3Qgc21fbmFtZSkgPSAxOworCisJCS8qIHJlc19zdGF0ID0gc3RhdF9zdWNjIGlmIHN0YXR1cyBtb25pdG9yIGFncmVlcyB0byBtb25pdG9yICovCisJCS8qIHJlc19zdGF0ID0gc3RhdF9mYWlsIGlmIHN0YXR1cyBtb25pdG9yIGNhbm5vdCBtb25pdG9yICovCisJCS8qIHN0YXQgY29uc2lzdHMgb2Ygc3RhdGUgbnVtYmVyIG9mIGxvY2FsIHNpdGUgKi8KKwkJc3RydWN0IHNtX3N0YXRfcmVzCQkJIFNNX01PTihzdHJ1Y3QgbW9uKSA9IDI7CisKKwkJLyogc3RhdCBjb25zaXN0cyBvZiBzdGF0ZSBudW1iZXIgb2YgbG9jYWwgc2l0ZSAqLworCQlzdHJ1Y3Qgc21fc3RhdAkJCQkgU01fVU5NT04oc3RydWN0IG1vbl9pZCkgPSAzOworCisJCS8qIHN0YXQgY29uc2lzdHMgb2Ygc3RhdGUgbnVtYmVyIG9mIGxvY2FsIHNpdGUgKi8KKwkJc3RydWN0IHNtX3N0YXQJCQkJIFNNX1VOTU9OX0FMTChzdHJ1Y3QgbXlfaWQpID0gNDsKKworCQl2b2lkCQkJCQkgU01fU0lNVV9DUkFTSCh2b2lkKSA9IDU7CisKKwkJdm9pZAkJCQkJIFNNX05PVElGWShzdHJ1Y3Qgc3RhdF9jaGdlKSA9IDY7CisKKwl9ID0gMTsKK30gPSAxMDAwMjQ7CisKK2NvbnN0CVNNX01BWFNUUkxFTiA9IDEwMjQ7Citjb25zdAlTTV9QUklWX1NJWkUgPSAxNjsKKworc3RydWN0IHNtX25hbWUgeworCXN0cmluZyBtb25fbmFtZTxTTV9NQVhTVFJMRU4+OworfTsKKworc3RydWN0IG15X2lkIHsKKwlzdHJpbmcJIG15X25hbWU8U01fTUFYU1RSTEVOPjsJCS8qIG5hbWUgb2YgdGhlIHNpdGUgaW5pYXRlcyB0aGUgbW9uaXRvcmluZyByZXF1ZXN0Ki8KKwlpbnQJbXlfcHJvZzsJCQkvKiBycGMgcHJvZ3JhbSAjIG9mIHRoZSByZXF1ZXN0aW5nIHByb2Nlc3MgKi8KKwlpbnQJbXlfdmVyczsJCQkvKiBycGMgdmVyc2lvbiAjIG9mIHRoZSByZXF1ZXN0aW5nIHByb2Nlc3MgKi8KKwlpbnQJbXlfcHJvYzsJCQkvKiBycGMgcHJvY2VkdXJlICMgb2YgdGhlIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworfTsKKworc3RydWN0IG1vbl9pZCB7CisJc3RyaW5nCW1vbl9uYW1lPFNNX01BWFNUUkxFTj47CQkvKiBuYW1lIG9mIHRoZSBzaXRlIHRvIGJlIG1vbml0b3JlZCAqLworCXN0cnVjdCBteV9pZCBteV9pZDsKK307CisKKworc3RydWN0IG1vbiB7CisJc3RydWN0IG1vbl9pZCBtb25faWQ7CisJb3BhcXVlIHByaXZbU01fUFJJVl9TSVpFXTsgCQkvKiBwcml2YXRlIGluZm9ybWF0aW9uIHRvIHN0b3JlIGF0IG1vbml0b3IgZm9yIHJlcXVlc3RpbmcgcHJvY2VzcyAqLworfTsKKworc3RydWN0IHN0YXRfY2hnZSB7CisJc3RyaW5nCW1vbl9uYW1lPFNNX01BWFNUUkxFTj47CQkvKiBuYW1lIG9mIHRoZSBzaXRlIHRoYXQgaGFkIHRoZSBzdGF0ZSBjaGFuZ2UgKi8KKwlpbnQgICAgIHN0YXRlOworfTsKKworLyoKKyAqIHN0YXRlICMgb2Ygc3RhdHVzIG1vbml0b3IgbW9uaXRvbmljYWxseSBpbmNyZWFzZXMgZWFjaCB0aW1lCisgKiBzdGF0dXMgb2YgdGhlIHNpdGUgY2hhbmdlczoKKyAqIGFuIGV2ZW4gbnVtYmVyICg+PSAwKSBpbmRpY2F0ZXMgdGhlIHNpdGUgaXMgZG93biBhbmQKKyAqIGFuIG9kZCBudW1iZXIgKD4gMCkgaW5kaWNhdGVzIHRoZSBzaXRlIGlzIHVwOworICovCitzdHJ1Y3Qgc21fc3RhdCB7CisJaW50IHN0YXRlOwkJLyogc3RhdGUgIyBvZiBzdGF0dXMgbW9uaXRvciAqLworfTsKKworZW51bSByZXMgeworCXN0YXRfc3VjYyA9IDAsCQkvKiBzdGF0dXMgbW9uaXRvciBhZ3JlZXMgdG8gbW9uaXRvciAqLworCXN0YXRfZmFpbCA9IDEJCS8qIHN0YXR1cyBtb25pdG9yIGNhbm5vdCBtb25pdG9yICovCit9OworCitzdHJ1Y3Qgc21fc3RhdF9yZXMgeworCXJlcyByZXNfc3RhdDsKKwlpbnQgc3RhdGU7Cit9OworCisvKiAKKyAqIHN0cnVjdHVyZSBvZiB0aGUgc3RhdHVzIG1lc3NhZ2Ugc2VudCBiYWNrIGJ5IHRoZSBzdGF0dXMgbW9uaXRvcgorICogd2hlbiBtb25pdG9yIHNpdGUgc3RhdHVzIGNoYW5nZXMKKyAqLworc3RydWN0IHN0YXR1cyB7CisJc3RyaW5nIG1vbl9uYW1lPFNNX01BWFNUUkxFTj47CisJaW50IHN0YXRlOworCW9wYXF1ZSBwcml2W1NNX1BSSVZfU0laRV07IC8qIHN0b3JlZCBwcml2YXRlIGluZm9ybWF0aW9uICovCit9OworCislI2RlZmluZSBTTV9JTlRFUl9YCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhODE5NwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEzIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworY2hlY2tfUFJPR1JBTVMgPSBzdGF0ZGJfZHVtcAorc3RhdGRiX2R1bXBfU09VUkNFUyA9IHN0YXRkYl9kdW1wLmMKKworc3RhdGRiX2R1bXBfTERBREQgPSAuLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJCSAgICAuLi9zdXBwb3J0L25zbS9saWJuc20uYSAkKExJQkNBUCkKKworU1VCRElSUyA9IG5zbV9jbGllbnQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCitURVNUUyA9IHQwMDAxLXN0YXRkLWJhc2ljLW1vbi11bm1vbi5zaApkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGM5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3ODEgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitjaGVja19QUk9HUkFNUyA9IHN0YXRkYl9kdW1wJChFWEVFWFQpCitzdWJkaXIgPSB0ZXN0cworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX3N0YXRkYl9kdW1wX09CSkVDVFMgPSBzdGF0ZGJfZHVtcC4kKE9CSkVYVCkKK3N0YXRkYl9kdW1wX09CSkVDVFMgPSAkKGFtX3N0YXRkYl9kdW1wX09CSkVDVFMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorc3RhdGRiX2R1bXBfREVQRU5ERU5DSUVTID0gLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCS4uL3N1cHBvcnQvbnNtL2xpYm5zbS5hICQoYW1fX0RFUEVOREVOQ0lFU18xKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChzdGF0ZGJfZHVtcF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChzdGF0ZGJfZHVtcF9TT1VSQ0VTKQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAorCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCitSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAorICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCitBTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKKwkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAorCWRpc3RkaXIKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK2FtX190dHlfY29sb3JzID0gXAorcmVkPTsgZ3JuPTsgbGduPTsgYmx1PTsgc3RkPQorRElTVF9TVUJESVJTID0gJChTVUJESVJTKQorRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK2FtX19yZWxhdGl2aXplID0gXAorICBkaXIwPWBwd2RgOyBcCisgIHNlZF9maXJzdD0ncyxeXChbXi9dKlwpLy4qJCQsXDEsJzsgXAorICBzZWRfcmVzdD0ncyxeW14vXSovKiwsJzsgXAorICBzZWRfbGFzdD0ncyxeLiovXChbXi9dKlwpJCQsXDEsJzsgXAorICBzZWRfYnV0bGFzdD0ncywvKlteL10qJCQsLCc7IFwKKyAgd2hpbGUgdGVzdCAtbiAiJCRkaXIxIjsgZG8gXAorICAgIGZpcnN0PWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCisgICAgaWYgdGVzdCAiJCRmaXJzdCIgIT0gIi4iOyB0aGVuIFwKKyAgICAgIGlmIHRlc3QgIiQkZmlyc3QiID0gIi4uIjsgdGhlbiBcCisgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2xhc3QiYC8iJCRkaXIyIjsgXAorICAgICAgICBkaXIwPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9idXRsYXN0ImA7IFwKKyAgICAgIGVsc2UgXAorICAgICAgICBmaXJzdDI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICAgICAgaWYgdGVzdCAiJCRmaXJzdDIiID0gIiQkZmlyc3QiOyB0aGVuIFwKKyAgICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgZGlyMj0iLi4vJCRkaXIyIjsgXAorICAgICAgICBmaTsgXAorICAgICAgICBkaXIwPSIkJGRpcjAiLyIkJGZpcnN0IjsgXAorICAgICAgZmk7IFwKKyAgICBmaTsgXAorICAgIGRpcjE9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICBkb25lOyBcCisgIHJlbGRpcj0iJCRkaXIyIgorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorc3RhdGRiX2R1bXBfU09VUkNFUyA9IHN0YXRkYl9kdW1wLmMKK3N0YXRkYl9kdW1wX0xEQUREID0gLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCQkgICAgLi4vc3VwcG9ydC9uc20vbGlibnNtLmEgJChMSUJDQVApCisKK1NVQkRJUlMgPSBuc21fY2xpZW50CitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCitURVNUUyA9IHQwMDAxLXN0YXRkLWJhc2ljLW1vbi11bm1vbi5zaAorYWxsOiBhbGwtcmVjdXJzaXZlCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHRlc3RzL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHRlc3RzL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCitjbGVhbi1jaGVja1BST0dSQU1TOgorCUBsaXN0PSckKGNoZWNrX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorc3RhdGRiX2R1bXAkKEVYRUVYVCk6ICQoc3RhdGRiX2R1bXBfT0JKRUNUUykgJChzdGF0ZGJfZHVtcF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBzdGF0ZGJfZHVtcCQoRVhFRVhUKQorCSQoTElOSykgJChzdGF0ZGJfZHVtcF9PQkpFQ1RTKSAkKHN0YXRkYl9kdW1wX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdGF0ZGJfZHVtcC5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCisjIFRoaXMgZGlyZWN0b3J5J3Mgc3ViZGlyZWN0b3JpZXMgYXJlIG1vc3RseSBpbmRlcGVuZGVudDsgeW91IGNhbiBjZAorIyBpbnRvIHRoZW0gYW5kIHJ1biBgbWFrZScgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoaXMgTWFrZWZpbGUuCisjIFRvIGNoYW5nZSB0aGUgdmFsdWVzIG9mIGBtYWtlJyB2YXJpYWJsZXM6IGluc3RlYWQgb2YgZWRpdGluZyBNYWtlZmlsZXMsCisjICgxKSBpZiB0aGUgdmFyaWFibGUgaXMgc2V0IGluIGBjb25maWcuc3RhdHVzJywgZWRpdCBgY29uZmlnLnN0YXR1cycKKyMgICAgICh3aGljaCB3aWxsIGNhdXNlIHRoZSBNYWtlZmlsZXMgdG8gYmUgcmVnZW5lcmF0ZWQgd2hlbiB5b3UgcnVuIGBtYWtlJyk7CisjICgyKSBvdGhlcndpc2UsIHBhc3MgdGhlIGRlc2lyZWQgdmFsdWVzIG9uIHRoZSBgbWFrZScgY29tbWFuZCBsaW5lLgorJChSRUNVUlNJVkVfVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBkb3Rfc2Vlbj15ZXM7IFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZTsgXAorCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCisJICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAorCWZpOyB0ZXN0IC16ICIkJGZhaWwiCisKKyQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJY2FzZSAiJEAiIGluIFwKKwkgIGRpc3RjbGVhbi0qIHwgbWFpbnRhaW5lci1jbGVhbi0qKSBsaXN0PSckKERJU1RfU1VCRElSUyknIDs7IFwKKwkgICopIGxpc3Q9JyQoU1VCRElSUyknIDs7IFwKKwllc2FjOyBcCisJcmV2PScnOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIDo7IGVsc2UgXAorCSAgICByZXY9IiQkc3ViZGlyICQkcmV2IjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJcmV2PSIkJHJldiAuIjsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlmb3Igc3ViZGlyIGluICQkcmV2OyBkbyBcCisJICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lICYmIHRlc3QgLXogIiQkZmFpbCIKK3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCisJZG9uZQorY3RhZ3MtcmVjdXJzaXZlOgorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgdGVzdCAiJCRzdWJkaXIiID0gLiB8fCAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGN0YWdzKTsgXAorCWRvbmUKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWlmICgkKEVUQUdTKSAtLWV0YWdzLWluY2x1ZGUgLS12ZXJzaW9uKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAorCSAgaW5jbHVkZV9vcHRpb249LS1ldGFncy1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9LjsgXAorCWVsc2UgXAorCSAgaW5jbHVkZV9vcHRpb249LS1pbmNsdWRlOyBcCisJICBlbXB0eV9maXg9OyBcCisJZmk7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgISAtZiAkJHN1YmRpci9UQUdTIHx8IFwKKwkgICAgICBzZXQgIiQkQCIgIiQkaW5jbHVkZV9vcHRpb249JCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6IGN0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworY2hlY2stVEVTVFM6ICQoVEVTVFMpCisJQGZhaWxlZD0wOyBhbGw9MDsgeGZhaWw9MDsgeHBhc3M9MDsgc2tpcD0wOyBcCisJc3JjZGlyPSQoc3JjZGlyKTsgZXhwb3J0IHNyY2RpcjsgXAorCWxpc3Q9JyAkKFRFU1RTKSAnOyBcCisJJChhbV9fdHR5X2NvbG9ycyk7IFwKKwlpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGZvciB0c3QgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgLi8kJHRzdDsgdGhlbiBkaXI9Li87IFwKKwkgICAgZWxpZiB0ZXN0IC1mICQkdHN0OyB0aGVuIGRpcj07IFwKKwkgICAgZWxzZSBkaXI9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiAkKFRFU1RTX0VOVklST05NRU5UKSAkJHtkaXJ9JCR0c3Q7IHRoZW4gXAorCSAgICAgIGFsbD1gZXhwciAkJGFsbCArIDFgOyBcCisJICAgICAgY2FzZSAiICQoWEZBSUxfVEVTVFMpICIgaW4gXAorCSAgICAgICpbXCBcCV0kJHRzdFtcIFwJXSopIFwKKwkJeHBhc3M9YGV4cHIgJCR4cGFzcyArIDFgOyBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPVhQQVNTOyBcCisJICAgICAgOzsgXAorCSAgICAgICopIFwKKwkJY29sPSQkZ3JuOyByZXM9UEFTUzsgXAorCSAgICAgIDs7IFwKKwkgICAgICBlc2FjOyBcCisJICAgIGVsaWYgdGVzdCAkJD8gLW5lIDc3OyB0aGVuIFwKKwkgICAgICBhbGw9YGV4cHIgJCRhbGwgKyAxYDsgXAorCSAgICAgIGNhc2UgIiAkKFhGQUlMX1RFU1RTKSAiIGluIFwKKwkgICAgICAqW1wgXAldJCR0c3RbXCBcCV0qKSBcCisJCXhmYWlsPWBleHByICQkeGZhaWwgKyAxYDsgXAorCQljb2w9JCRsZ247IHJlcz1YRkFJTDsgXAorCSAgICAgIDs7IFwKKwkgICAgICAqKSBcCisJCWZhaWxlZD1gZXhwciAkJGZhaWxlZCArIDFgOyBcCisJCWNvbD0kJHJlZDsgcmVzPUZBSUw7IFwKKwkgICAgICA7OyBcCisJICAgICAgZXNhYzsgXAorCSAgICBlbHNlIFwKKwkgICAgICBza2lwPWBleHByICQkc2tpcCArIDFgOyBcCisJICAgICAgY29sPSQkYmx1OyByZXM9U0tJUDsgXAorCSAgICBmaTsgXAorCSAgICBlY2hvICIkJHtjb2x9JCRyZXMkJHtzdGR9OiAkJHRzdCI7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIHRlc3QgIiQkYWxsIiAtZXEgMTsgdGhlbiBcCisJICAgIHRlc3RzPSJ0ZXN0IjsgXAorCSAgICBBbGw9IiI7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0cz0idGVzdHMiOyBcCisJICAgIEFsbD0iQWxsICI7IFwKKwkgIGZpOyBcCisJICBpZiB0ZXN0ICIkJGZhaWxlZCIgLWVxIDA7IHRoZW4gXAorCSAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMDsgdGhlbiBcCisJICAgICAgYmFubmVyPSIkJEFsbCQkYWxsICQkdGVzdHMgcGFzc2VkIjsgXAorCSAgICBlbHNlIFwKKwkgICAgICBpZiB0ZXN0ICIkJHhmYWlsIiAtZXEgMTsgdGhlbiBmYWlsdXJlcz1mYWlsdXJlOyBlbHNlIGZhaWx1cmVzPWZhaWx1cmVzOyBmaTsgXAorCSAgICAgIGJhbm5lcj0iJCRBbGwkJGFsbCAkJHRlc3RzIGJlaGF2ZWQgYXMgZXhwZWN0ZWQgKCQkeGZhaWwgZXhwZWN0ZWQgJCRmYWlsdXJlcykiOyBcCisJICAgIGZpOyBcCisJICBlbHNlIFwKKwkgICAgaWYgdGVzdCAiJCR4cGFzcyIgLWVxIDA7IHRoZW4gXAorCSAgICAgIGJhbm5lcj0iJCRmYWlsZWQgb2YgJCRhbGwgJCR0ZXN0cyBmYWlsZWQiOyBcCisJICAgIGVsc2UgXAorCSAgICAgIGlmIHRlc3QgIiQkeHBhc3MiIC1lcSAxOyB0aGVuIHBhc3Nlcz1wYXNzOyBlbHNlIHBhc3Nlcz1wYXNzZXM7IGZpOyBcCisJICAgICAgYmFubmVyPSIkJGZhaWxlZCBvZiAkJGFsbCAkJHRlc3RzIGRpZCBub3QgYmVoYXZlIGFzIGV4cGVjdGVkICgkJHhwYXNzIHVuZXhwZWN0ZWQgJCRwYXNzZXMpIjsgXAorCSAgICBmaTsgXAorCSAgZmk7IFwKKwkgIGRhc2hlcz0iJCRiYW5uZXIiOyBcCisJICBza2lwcGVkPSIiOyBcCisJICBpZiB0ZXN0ICIkJHNraXAiIC1uZSAwOyB0aGVuIFwKKwkgICAgaWYgdGVzdCAiJCRza2lwIiAtZXEgMTsgdGhlbiBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0IHdhcyBub3QgcnVuKSI7IFwKKwkgICAgZWxzZSBcCisJICAgICAgc2tpcHBlZD0iKCQkc2tpcCB0ZXN0cyB3ZXJlIG5vdCBydW4pIjsgXAorCSAgICBmaTsgXAorCSAgICB0ZXN0IGBlY2hvICIkJHNraXBwZWQiIHwgd2MgLWNgIC1sZSBgZWNobyAiJCRiYW5uZXIiIHwgd2MgLWNgIHx8IFwKKwkgICAgICBkYXNoZXM9IiQkc2tpcHBlZCI7IFwKKwkgIGZpOyBcCisJICByZXBvcnQ9IiI7IFwKKwkgIGlmIHRlc3QgIiQkZmFpbGVkIiAtbmUgMCAmJiB0ZXN0IC1uICIkKFBBQ0tBR0VfQlVHUkVQT1JUKSI7IHRoZW4gXAorCSAgICByZXBvcnQ9IlBsZWFzZSByZXBvcnQgdG8gJChQQUNLQUdFX0JVR1JFUE9SVCkiOyBcCisJICAgIHRlc3QgYGVjaG8gIiQkcmVwb3J0IiB8IHdjIC1jYCAtbGUgYGVjaG8gIiQkYmFubmVyIiB8IHdjIC1jYCB8fCBcCisJICAgICAgZGFzaGVzPSIkJHJlcG9ydCI7IFwKKwkgIGZpOyBcCisJICBkYXNoZXM9YGVjaG8gIiQkZGFzaGVzIiB8IHNlZCBzLy4vPS9nYDsgXAorCSAgaWYgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyB0aGVuIFwKKwkgICAgZWNobyAiJCRncm4kJGRhc2hlcyI7IFwKKwkgIGVsc2UgXAorCSAgICBlY2hvICIkJHJlZCQkZGFzaGVzIjsgXAorCSAgZmk7IFwKKwkgIGVjaG8gIiQkYmFubmVyIjsgXAorCSAgdGVzdCAteiAiJCRza2lwcGVkIiB8fCBlY2hvICIkJHNraXBwZWQiOyBcCisJICB0ZXN0IC16ICIkJHJlcG9ydCIgfHwgZWNobyAiJCRyZXBvcnQiOyBcCisJICBlY2hvICIkJGRhc2hlcyQkc3RkIjsgXAorCSAgdGVzdCAiJCRmYWlsZWQiIC1lcSAwOyBcCisJZWxzZSA6OyBmaQorCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCisJICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKKwkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCisJCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKKwkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAorCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQoY2hlY2tfUFJPR1JBTVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stVEVTVFMKK2NoZWNrOiBjaGVjay1yZWN1cnNpdmUKK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOiBpbnN0YWxsZGlycy1yZWN1cnNpdmUKK2luc3RhbGxkaXJzLWFtOgoraW5zdGFsbDogaW5zdGFsbC1yZWN1cnNpdmUKK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCit1bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1yZWN1cnNpdmUKKworY2xlYW4tYW06IGNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1yZWN1cnNpdmUKKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1yZWN1cnNpdmUKKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1yZWN1cnNpdmUKKworcGRmLWFtOgorCitwczogcHMtcmVjdXJzaXZlCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBjaGVjay1hbSBcCisJY3RhZ3MtcmVjdXJzaXZlIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcCB0YWdzLXJlY3Vyc2l2ZQorCisuUEhPTlk6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIENUQUdTIEdUQUdTIFwKKwlhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLVRFU1RTIGNoZWNrLWFtIGNsZWFuIFwKKwljbGVhbi1jaGVja1BST0dSQU1TIGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjdGFncyBcCisJY3RhZ3MtcmVjdXJzaXZlIGRpc3RjbGVhbiBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgXAorCWh0bWwtYW0gaW5mbyBpbmZvLWFtIGluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgXAorCWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgXAorCWluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBcCisJaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIFwKKwlpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBpbnN0YWxsZGlycy1hbSBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdGFncy1yZWN1cnNpdmUgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90ZXN0cy9uc21fY2xpZW50L01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL25zbV9jbGllbnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmMGE0NQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90ZXN0cy9uc21fY2xpZW50L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitHRU5GSUxFU19DTE5UCT0gbmxtX3NtX2ludGVyX2NsbnQuYworR0VORklMRVNfU1ZDCT0gbmxtX3NtX2ludGVyX3N2Yy5jCitHRU5GSUxFU19YRFIJPSBubG1fc21faW50ZXJfeGRyLmMKK0dFTkZJTEVTX0gJPSBubG1fc21faW50ZXIuaAorCitHRU5GSUxFUwk9ICQoR0VORklMRVNfQ0xOVCkgJChHRU5GSUxFU19TVkMpICQoR0VORklMRVNfWERSKSAkKEdFTkZJTEVTX0gpCisKKworY2hlY2tfUFJPR1JBTVMJPSBuc21fY2xpZW50Cituc21fY2xpZW50X1NPVVJDRVMgPSAkKEdFTkZJTEVTKSBuc21fY2xpZW50LmMKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORklMRVMpCituc21fY2xpZW50X0xEQUREID0gLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCQkgICAuLi8uLi9zdXBwb3J0L25zbS9saWJuc20uYSAkKExJQkNBUCkKKworaWYgQ09ORklHX1JQQ0dFTgorUlBDR0VOCT0gJCh0b3BfYnVpbGRkaXIpL3Rvb2xzL3JwY2dlbi9ycGNnZW4KKyQoUlBDR0VOKToKKwltYWtlIC1DIC4uLy4uL3Rvb2xzL3JwY2dlbiBhbGwKK2Vsc2UKK1JQQ0dFTiA9IEBSUENHRU5fUEFUSEAKK2VuZGlmCisKKyQoR0VORklMRVNfQ0xOVCk6ICVfY2xudC5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtbCAtbyAkQCAkPAorCiskKEdFTkZJTEVTX1NWQyk6ICVfc3ZjLmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1tIC1vICRAICQ8CisKKyQoR0VORklMRVNfWERSKTogJV94ZHIuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWMgLW8gJEAgJDwKKworJChHRU5GSUxFU19IKTogJS5oOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtaCAtbyAkQCAkPAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCisKK0NMRUFORklMRVMgPSAkKEdFTkZJTEVTKQorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvbnNtX2NsaWVudC9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi90ZXN0cy9uc21fY2xpZW50L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Yjk5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvbnNtX2NsaWVudC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDU3MyBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK2NoZWNrX1BST0dSQU1TID0gbnNtX2NsaWVudCQoRVhFRVhUKQorc3ViZGlyID0gdGVzdHMvbnNtX2NsaWVudAorRElTVF9DT01NT04gPSBSRUFETUUgJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9fb2JqZWN0c18xID0gbmxtX3NtX2ludGVyX2NsbnQuJChPQkpFWFQpCithbV9fb2JqZWN0c18yID0gbmxtX3NtX2ludGVyX3N2Yy4kKE9CSkVYVCkKK2FtX19vYmplY3RzXzMgPSBubG1fc21faW50ZXJfeGRyLiQoT0JKRVhUKQorYW1fX29iamVjdHNfNCA9CithbV9fb2JqZWN0c181ID0gJChhbV9fb2JqZWN0c18xKSAkKGFtX19vYmplY3RzXzIpICQoYW1fX29iamVjdHNfMykgXAorCSQoYW1fX29iamVjdHNfNCkKK2FtX25zbV9jbGllbnRfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfNSkgbnNtX2NsaWVudC4kKE9CSkVYVCkKK25zbV9jbGllbnRfT0JKRUNUUyA9ICQoYW1fbnNtX2NsaWVudF9PQkpFQ1RTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK25zbV9jbGllbnRfREVQRU5ERU5DSUVTID0gLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCS4uLy4uL3N1cHBvcnQvbnNtL2xpYm5zbS5hICQoYW1fX0RFUEVOREVOQ0lFU18xKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChuc21fY2xpZW50X1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKG5zbV9jbGllbnRfU09VUkNFUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitHRU5GSUxFU19DTE5UID0gbmxtX3NtX2ludGVyX2NsbnQuYworR0VORklMRVNfU1ZDID0gbmxtX3NtX2ludGVyX3N2Yy5jCitHRU5GSUxFU19YRFIgPSBubG1fc21faW50ZXJfeGRyLmMKK0dFTkZJTEVTX0ggPSBubG1fc21faW50ZXIuaAorR0VORklMRVMgPSAkKEdFTkZJTEVTX0NMTlQpICQoR0VORklMRVNfU1ZDKSAkKEdFTkZJTEVTX1hEUikgJChHRU5GSUxFU19IKQorbnNtX2NsaWVudF9TT1VSQ0VTID0gJChHRU5GSUxFUykgbnNtX2NsaWVudC5jCitCVUlMVF9TT1VSQ0VTID0gJChHRU5GSUxFUykKK25zbV9jbGllbnRfTERBREQgPSAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJCSAgIC4uLy4uL3N1cHBvcnQvbnNtL2xpYm5zbS5hICQoTElCQ0FQKQorCitAQ09ORklHX1JQQ0dFTl9GQUxTRUBSUENHRU4gPSBAUlBDR0VOX1BBVEhACitAQ09ORklHX1JQQ0dFTl9UUlVFQFJQQ0dFTiA9ICQodG9wX2J1aWxkZGlyKS90b29scy9ycGNnZW4vcnBjZ2VuCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCitDTEVBTkZJTEVTID0gJChHRU5GSUxFUykKK2FsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB0ZXN0cy9uc21fY2xpZW50L01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHRlc3RzL25zbV9jbGllbnQvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK2NsZWFuLWNoZWNrUFJPR1JBTVM6CisJQGxpc3Q9JyQoY2hlY2tfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0Cituc21fY2xpZW50JChFWEVFWFQpOiAkKG5zbV9jbGllbnRfT0JKRUNUUykgJChuc21fY2xpZW50X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIG5zbV9jbGllbnQkKEVYRUVYVCkKKwkkKExJTkspICQobnNtX2NsaWVudF9PQkpFQ1RTKSAkKG5zbV9jbGllbnRfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL25sbV9zbV9pbnRlcl9jbG50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ubG1fc21faW50ZXJfc3ZjLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ubG1fc21faW50ZXJfeGRyLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uc21fY2xpZW50LlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQoY2hlY2tfUFJPR1JBTVMpCitjaGVjazogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczoKK2luc3RhbGw6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoQlVJTFRfU09VUkNFUykiIHx8IHJtIC1mICQoQlVJTFRfU09VUkNFUykKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGFsbCBjaGVjayBjaGVjay1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gXAorCWNsZWFuLWNoZWNrUFJPR1JBTVMgY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGN0YWdzIFwKKwlkaXN0Y2xlYW4gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworQENPTkZJR19SUENHRU5fVFJVRUAkKFJQQ0dFTik6CitAQ09ORklHX1JQQ0dFTl9UUlVFQAltYWtlIC1DIC4uLy4uL3Rvb2xzL3JwY2dlbiBhbGwKKworJChHRU5GSUxFU19DTE5UKTogJV9jbG50LmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1sIC1vICRAICQ8CisKKyQoR0VORklMRVNfU1ZDKTogJV9zdmMuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLW0gLW8gJEAgJDwKKworJChHRU5GSUxFU19YRFIpOiAlX3hkci5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtYyAtbyAkQCAkPAorCiskKEdFTkZJTEVTX0gpOiAlLmg6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1oIC1vICRAICQ8CisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90ZXN0cy9uc21fY2xpZW50L1JFQURNRSBiL25mcy11dGlscy0xLjIuMi90ZXN0cy9uc21fY2xpZW50L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTM3OWRkCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL25zbV9jbGllbnQvUkVBRE1FCkBAIC0wLDAgKzEsMTIgQEAKK1RoZSBuc21fY2xpZW50IHByb2dyYW0gaXMgaW50ZW5kZWQgZm9yIHRlc3Rpbmcgc3RhdGQuIEl0IGhhcyB0aGUgYWJpbGl0eQordG8gYWN0IGFzIGEgc3ludGhldGljIE5TTSBjbGllbnQgZm9yIHNlbmRpbmcgYXJ0aWZpY2lhbCBOU00gY2FsbHMgdG8gYW55Citob3N0IHlvdSBjaG9vc2UuCisKK0l0IGFsc28gaGFzIGFuIE5MTSBzaW11bGF0b3IgdGhhdCBpbXBsZW1lbnRzIHRoZSBjYWxsIHRoYXQgc3RhdGQgdXNlcyB0bworY29tbXVuaWNhdGUgd2l0aCBsb2NrZC4gVGhlIGRhZW1vbiBzaW11bGF0b3Igd2lsbCBzdGFydCBpdHNlbGYgdXAsCityZWdpc3RlciBhcyBhbiBOTE0gc2VydmljZSBhbmQgbGlzdGVuIGZvciAiZG93bmNhbGxzIiBmcm9tIHN0YXRkLiBXaGVuCitpdCBnZXRzIG9uZSwgaXQgd2lsbCBsb2cgYSBtZXNzYWdlLgorCitOb3RlIHRoYXQgbG9ja2Qgd2lsbCBuZWVkIHRvIGJlIGRvd24gd2hlbiB1c2luZyB0aGUgZGFlbW9uIHNpbXVsYXRvci4gSXQKK2Fsc28gZG9lcyBub3QgaW1wbGVtZW50IHRoZSBlbnRpcmUgTkxNIHByb3RvY29sIGFuZCBpcyBvbmx5IHJlYWxseQordXNlZnVsIGZvciB0ZXN0aW5nIHN0YXRkJ3MgZG93bmNhbGwuCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvbnNtX2NsaWVudC9ubG1fc21faW50ZXIueCBiL25mcy11dGlscy0xLjIuMi90ZXN0cy9uc21fY2xpZW50L25sbV9zbV9pbnRlci54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZmEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvbnNtX2NsaWVudC9ubG1fc21faW50ZXIueApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTkgSmVmZnJleSBBLiBVcGhvZmYKKyAqIE1vZGlmaWVkIGJ5IE9sYWYgS2lyY2gsIDE5OTYuCisgKiBNb2RpZmllZCBieSBILkouIEx1LCAxOTk4LgorICogTW9kaWZpZWQgYnkgSmVmZiBMYXl0b24sIDIwMTAuCisgKgorICogTkxNIHNpbWlsYXRvciBmb3IgTGludXgKKyAqLworCisjaWZkZWYgUlBDX0NMTlQKKyUjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworLyoKKyAqIHN0YXRkIHJlamVjdHMgbW9uaXRvciByZWdpc3RyYXRpb25zIGZvciBhbnkgbm9uLWxvY2tkIHNlcnZpY2VzLCBzbyBwcmV0ZW5kCisgKiB0byBiZSBsb2NrZCB3aGVuIHRlc3RpbmcuIEZ1cnRoZXJtb3JlLCB0aGUgb25seSBjYWxsIHdlIGNhcmUgYWJvdXQgZnJvbQorICogc3RhdGQgaXMgIzE2LCB3aGljaCBpcyB0aGUgZG93bmNhbGwgdG8gbm90aWZ5IHRoZSBrZXJuZWwgb2YgYSBob3N0J3Mgc3RhdHVzCisgKiBjaGFuZ2UuCisgKi8KK3Byb2dyYW0gTkxNX1NNX1BST0cgeworCS8qIHZlcnNpb24gMyBvZiB0aGUgTkxNIHByb3RvY29sICovCisJdmVyc2lvbiBOTE1fU01fVkVSUzMgeworCQl2b2lkCSBOTE1fU01fTk9USUZZKHN0cnVjdCBubG1fc21fbm90aWZ5KSA9IDE2OworCX0gPSAzOworCisJLyogdmVyc2lvbiAyIG9mIE5MTSBwcm90b2NvbCAqLworCXZlcnNpb24gTkxNX1NNX1ZFUlM0IHsKKwkJdm9pZAkgTkxNX1NNX05PVElGWShzdHJ1Y3QgbmxtX3NtX25vdGlmeSkgPSAxNjsKKwl9ID0gNDsKK30gPSAxMDAwMjE7CisKK2NvbnN0ICBTTV9NQVhTVFJMRU4gPSAxMDI0OworY29uc3QgIFNNX1BSSVZfU0laRSA9IDE2OworCisvKgorICogc3RydWN0dXJlIG9mIHRoZSBzdGF0dXMgbWVzc2FnZSBzZW50IGJhY2sgYnkgdGhlIHN0YXR1cyBtb25pdG9yCisgKiB3aGVuIG1vbml0b3Igc2l0ZSBzdGF0dXMgY2hhbmdlcworICovCitzdHJ1Y3QgbmxtX3NtX25vdGlmeSB7CisJc3RyaW5nIG1vbl9uYW1lPFNNX01BWFNUUkxFTj47CisJaW50IHN0YXRlOworCW9wYXF1ZSBwcml2W1NNX1BSSVZfU0laRV07IC8qIHN0b3JlZCBwcml2YXRlIGluZm9ybWF0aW9uICovCit9OwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL25zbV9jbGllbnQvbnNtX2NsaWVudC5jIGIvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL25zbV9jbGllbnQvbnNtX2NsaWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTE1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvbnNtX2NsaWVudC9uc21fY2xpZW50LmMKQEAgLTAsMCArMSw0NjUgQEAKKy8qCisgKiBuc21fY2xpZW50LmMgLS0gc3ludGhldGljIGNsaWVudCBhbmQgbG9ja2Qgc2ltdWxhdG9yIGZvciB0ZXN0aW5nIHN0YXRkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwICBSZWQgSGF0LCBKZWZmIExheXRvbiA8amxheXRvbkByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiBWZXJ5IGxvb3NlbHkgYmFzZWQgb24gInNpbXVsYXRvci5jIiBpbiB0aGUgc3RhdGQgZGlyZWN0b3J5LiBPcmlnaW5hbAorICogY29weXJpZ2h0IGZvciB0aGF0IHByb2dyYW0gZm9sbG93czoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMTk5OSBKZWZmcmV5IEEuIFVwaG9mZgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgorI2luY2x1ZGUgPHJwY21pc2MuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJuZnNsaWIuaCIKKyNpbmNsdWRlICJuZnNycGMuaCIKKyNpbmNsdWRlICJuc20uaCIKKyNpbmNsdWRlICJzbV9pbnRlci5oIgorI2luY2x1ZGUgIm5sbV9zbV9pbnRlci5oIgorI2luY2x1ZGUgInNvY2thZGRyLmgiCisjaW5jbHVkZSAieGNvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBkYWVtb25fc2ltdWxhdG9yKHZvaWQpOworc3RhdGljIHZvaWQgc2ltX2tpbGxlcihpbnQgc2lnKTsKK3N0YXRpYyBpbnQgbnNtX2NsaWVudF9jcmFzaChjaGFyICopOworc3RhdGljIGludCBuc21fY2xpZW50X21vbihjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCwgaW50KTsKK3N0YXRpYyBpbnQgbnNtX2NsaWVudF9zdGF0KGNoYXIgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgbnNtX2NsaWVudF9ub3RpZnkoY2hhciAqLCBjaGFyICosIGNoYXIgKik7CitzdGF0aWMgaW50IG5zbV9jbGllbnRfdW5tb24oY2hhciAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpOworc3RhdGljIGludCBuc21fY2xpZW50X3VubW9uX2FsbChjaGFyICosIGNoYXIgKiwgaW50LCBpbnQpOworCitleHRlcm4gdm9pZCBubG1fc21fcHJvZ180KHN0cnVjdCBzdmNfcmVxICpycXN0cCwgcmVnaXN0ZXIgU1ZDWFBSVCAqdHJhbnNwKTsKK2V4dGVybiB2b2lkIHN2Y19leGl0KHZvaWQpOworCisvKgorICogZGVmYXVsdCB0byAxNSByZXRyYW5zbWl0IGludGVydmFsLCB3aGljaCBzZWVtcyB0byBiZSB0aGUgZGVmYXVsdCBmb3IKKyAqIFVEUCBjbGllbnRzIHcvIGxlZ2FjeSBnbGliYyBSUEMKKyAqLworc3RhdGljIHN0cnVjdCB0aW1ldmFsIHJldHJhbnNfaW50ZXJ2YWwgPQoreworCS50dl9zZWMgPSAxNSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQoreworCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwl7ICJob3N0IiwgMCwgMCwgJ0gnIH0sCisJeyAibmFtZSIsIDEsIDAsICduJyB9LAorCXsgInByb2dyYW0iLCAxLCAwLCAnUCcgfSwKKwl7ICJ2ZXJzaW9uIiwgMSwgMCwgJ3YnIH0sCisJeyBOVUxMLCAwLCAwLCAwIH0sCit9OworCitzdGF0aWMgaW50Cit1c2FnZShjaGFyICpwcm9ncmFtKQoreworCXByaW50ZigiVXNhZ2U6XG4iKTsKKwlwcmludGYoIiVzIFtvcHRpb25zXSA8Y29tbWFuZD4gW2FyZ10uLi5cbiIsIHByb2dyYW0pOworCXByaW50Zigid2hlcmUgY29tbWFuZCBpcyBvbmUgb2YgdGhlc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3M6XG4iKTsKKwlwcmludGYoImNyYXNoXHRcdFx0XHR0ZWxsIGhvc3QgdG8gc2ltdWxhdGUgY3Jhc2hcbiIpOworCXByaW50ZigiZGFlbW9uXHRcdFx0XHRcdHN0YXJ0IHVwIGxvY2tkIGRhZW1vbiBzaW11bGF0b3JcbiIpOworCXByaW50Zigibm90aWZ5IDxtb25fbmFtZT4gPHN0YXRlPlx0c2VuZCBhIHJlYm9vdCBub3RpZmljYXRpb24gdG8gaG9zdFxuIik7CisJcHJpbnRmKCJzdGF0IDxtb25fbmFtZT5cdFx0XHRnZXQgc3RhdHVzIG9mIDxtb25fbmFtZT4gb24gaG9zdFxuIik7CisJcHJpbnRmKCJ1bm1vbl9hbGxcdFx0XHR0ZWxsIGhvc3QgdG8gdW5tb24gZXZlcnl0aGluZ1xuIik7CisJcHJpbnRmKCJ1bm1vbiA8bW9uX25hbWU+XHRcdFx0dGVsbCBob3N0IHRvIHVubW9uIDxtb25fbmFtZT5cbiIpOworCXByaW50ZigibW9uIDxtb25fbmFtZT4gPGNvb2tpZT5cdFx0dGVsbCBob3N0IHRvIG1vbml0b3IgPG1vbl9uYW1lPiB3aXRoIHByaXZhdGUgPGNvb2tpZT5cbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitoZXgyYmluKGNoYXIgKmRzdCwgc2l6ZV90IGRzdGxlbiwgY2hhciAqc3JjKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlmb3IgKGkgPSAwOyAqc3JjICYmIGkgPCBkc3RsZW47IGkrKykgeworCQlpZiAoc3NjYW5mKHNyYywgIiUyeCIsICZ0bXApICE9IDEpCisJCQlyZXR1cm4gMDsKKwkJZHN0W2ldID0gdG1wOworCQlzcmMrKzsKKwkJaWYgKCEqc3JjKQorCQkJYnJlYWs7CisJCXNyYysrOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorYmluMmhleChjaGFyICpkc3QsIGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzcmNsZW47IGkrKykKKwkJZHN0ICs9IHNwcmludGYoZHN0LCAiJTAyeCIsIDB4ZmYgJiBzcmNbaV0pOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBhcmcsIGVyciA9IDA7CisJaW50IHJlbWFpbmluZ19hcmdzOworCWNoYXIgbXlfbmFtZVtOSV9NQVhIT1NUXSwgaG9zdFtOSV9NQVhIT1NUXTsKKwljaGFyIGNvb2tpZVtTTV9QUklWX1NJWkVdOworCWludCBteV9wcm9nID0gTkxNX1NNX1BST0c7CisJaW50IG15X3ZlcnMgPSBOTE1fU01fVkVSUzQ7CisKKwlteV9uYW1lWzBdID0gJ1wwJzsKKwlob3N0WzBdID0gJ1wwJzsKKworCXdoaWxlICgoYXJnID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhIbjpQOnY6IiwgbG9uZ29wdHMsCisJCQkJICBOVUxMKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAoYXJnKSB7CisJCWNhc2UgJ0gnOgorCQkJc3RybmNweShob3N0LCBvcHRhcmcsIHNpemVvZihob3N0KSk7CisJCWNhc2UgJ24nOgorCQkJc3RybmNweShteV9uYW1lLCBvcHRhcmcsIHNpemVvZihteV9uYW1lKSk7CisJCWNhc2UgJ1AnOgorCQkJbXlfcHJvZyA9IGF0b2kob3B0YXJnKTsKKwkJY2FzZSAndic6CisJCQlteV92ZXJzID0gYXRvaShvcHRhcmcpOworCQl9CisJfQorCisJcmVtYWluaW5nX2FyZ3MgPSBhcmdjIC0gb3B0aW5kOworCWlmIChyZW1haW5pbmdfYXJncyA8PSAwKQorCQl1c2FnZShhcmd2WzBdKTsKKworCWlmICghbXlfbmFtZVswXSkKKwkJZ2V0aG9zdG5hbWUobXlfbmFtZSwgc2l6ZW9mKG15X25hbWUpKTsKKwlpZiAoIWhvc3RbMF0pCisJCXN0cm5jcHkoaG9zdCwgIjEyNy4wLjAuMSIsIHNpemVvZihob3N0KSk7CisKKwlpZiAoIXN0cmNhc2VjbXAoYXJndltvcHRpbmRdLCAiZGFlbW9uIikpIHsKKwkJZGFlbW9uX3NpbXVsYXRvcigpOworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndltvcHRpbmRdLCAiY3Jhc2giKSkgeworCQllcnIgPSBuc21fY2xpZW50X2NyYXNoKGhvc3QpOworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndltvcHRpbmRdLCAic3RhdCIpKSB7CisJCWlmIChyZW1haW5pbmdfYXJncyA8IDIpCisJCQl1c2FnZShhcmd2WzBdKTsKKwkJZXJyID0gbnNtX2NsaWVudF9zdGF0KGhvc3QsIGFyZ3Zbb3B0aW5kICsgMl0pOworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndltvcHRpbmRdLCAidW5tb25fYWxsIikpIHsKKwkJZXJyID0gbnNtX2NsaWVudF91bm1vbl9hbGwoaG9zdCwgbXlfbmFtZSwgbXlfcHJvZywgbXlfdmVycyk7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmd2W29wdGluZF0sICJ1bm1vbiIpKSB7CisJCWlmIChyZW1haW5pbmdfYXJncyA8IDIpCisJCQl1c2FnZShhcmd2WzBdKTsKKwkJZXJyID0gbnNtX2NsaWVudF91bm1vbihob3N0LCBhcmd2W29wdGluZCArIDFdLCBteV9uYW1lLCBteV9wcm9nLAorCQkJCQlteV92ZXJzKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ3Zbb3B0aW5kXSwgIm5vdGlmeSIpKSB7CisJCWlmIChyZW1haW5pbmdfYXJncyA8IDIpCisJCQl1c2FnZShhcmd2WzBdKTsKKwkJZXJyID0gbnNtX2NsaWVudF9ub3RpZnkoaG9zdCwgYXJndltvcHRpbmQgKyAxXSwKKwkJCQkJYXJndltvcHRpbmQgKyAyXSk7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmd2W29wdGluZF0sICJtb24iKSkgeworCQlpZiAocmVtYWluaW5nX2FyZ3MgPCAyKQorCQkJdXNhZ2UoYXJndlswXSk7CisKKwkJbWVtc2V0KGNvb2tpZSwgJ1wwJywgU01fUFJJVl9TSVpFKTsKKwkJaWYgKCFoZXgyYmluKGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSksIGFyZ3Zbb3B0aW5kICsgMl0pKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlNZUzolZFxuIiwgRUlOVkFMKTsKKwkJCXByaW50ZigiVW5hYmxlIHRvIGNvbnZlcnQgaGV4IGNvb2tpZSAlcyB0byBiaW5hcnkuXG4iLAorCQkJCWFyZ3Zbb3B0aW5kICsgMl0pOworCQkJcmV0dXJuIDE7CisJCX0KKworCQllcnIgPSBuc21fY2xpZW50X21vbihob3N0LCBhcmd2W29wdGluZCArIDFdLCBjb29raWUsIG15X25hbWUsCisJCQkJCW15X3Byb2csIG15X3ZlcnMpOworCX0gZWxzZSB7CisJCWVyciA9IHVzYWdlKGFyZ3ZbMF0pOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBDTElFTlQgKgorbnNtX2NsaWVudF9nZXRfcnBjY2xpZW50KGNvbnN0IGNoYXIgKm5vZGUpCit7CisJdW5zaWduZWQgc2hvcnQJCXBvcnQ7CisJc3RydWN0IGFkZHJpbmZvCQkqYWk7CisJc3RydWN0IGFkZHJpbmZvCQloaW50cyA9IHsgLmFpX2ZsYWdzCT0gQUlfQUREUkNPTkZJRyB9OworCWludAkJCWVycjsKKwlDTElFTlQJCQkqY2xpZW50ID0gTlVMTDsKKworI2lmbmRlZiBJUFY2X0VOQUJMRUQKKwloaW50cy5haV9mYW1pbHkJPSBBRl9JTkVUOworI2VuZGlmIC8qIElQVjZfRU5BQkxFRCAqLworCisJLyogRklYTUU6IGFsbG93IHN1cHBvcnQgZm9yIHByb3ZpZGluZyBwb3J0PyAqLworCWVyciA9IGdldGFkZHJpbmZvKG5vZGUsIE5VTEwsICZoaW50cywgJmFpKTsKKwlpZiAoZXJyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRUFJOiVkXG4iLCBlcnIpOworCQlpZiAoZXJyID09IEVBSV9TWVNURU0pCisJCQlmcHJpbnRmKHN0ZGVyciwgIlNZUzolZFxuIiwgZXJybm8pOworCQlwcmludGYoIlVuYWJsZSB0byB0cmFuc2xhdGUgaG9zdCB0byBhZGRyZXNzOiAlc1xuIiwKKwkJCWVyciA9PSBFQUlfU1lTVEVNID8gc3RyZXJyb3IoZXJybm8pIDoKKwkJCWdhaV9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIGNsaWVudDsKKwl9CisKKwkvKiBGSVhNRTogYWxsb3cgZm9yIFRDUCB0b28/ICovCisJcG9ydCA9IG5mc19nZXRwb3J0KGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgU01fUFJPRywKKwkJCSAgIFNNX1ZFUlMsIElQUFJPVE9fVURQKTsKKwlpZiAoIXBvcnQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJSUEM6JWRcbiIsIHJwY19jcmVhdGVlcnIuY2Zfc3RhdCk7CisJCXByaW50ZigiVW5hYmxlIHRvIGRldGVybWluZSBwb3J0IGZvciBzZXJ2aWNlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbmZzX3NldF9wb3J0KGFpLT5haV9hZGRyLCBwb3J0KTsKKworCWNsaWVudCA9IG5mc19nZXRfcnBjY2xpZW50KGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwgSVBQUk9UT19VRFAsCisJCQkJICAgU01fUFJPRywgU01fVkVSUywgJnJldHJhbnNfaW50ZXJ2YWwpOworCWlmICghY2xpZW50KSB7CisJCWZwcmludGYoc3RkZXJyLCAiUlBDOiVkXG4iLCBycGNfY3JlYXRlZXJyLmNmX3N0YXQpOworCQlwcmludGYoIlJQQyBjbGllbnQgY3JlYXRpb24gZmFpbGVkXG4iKTsKKwl9CitvdXQ6CisJZnJlZWFkZHJpbmZvKGFpKTsKKwlyZXR1cm4gY2xpZW50OworfQorCitzdGF0aWMgaW50Cituc21fY2xpZW50X21vbihjaGFyICpjYWxsaW5nLCBjaGFyICptb25pdG9yaW5nLCBjaGFyICpjb29raWUsIGNoYXIgKm15X25hbWUsCisJCWludCBteV9wcm9nLCBpbnQgbXlfdmVycykKK3sKKwlDTElFTlQgKmNsaWVudDsKKwlzbV9zdGF0X3JlcyAqcmVzdWx0OworCW1vbiBtb247CisJaW50IGVyciA9IDA7CisKKwlwcmludGYoIkNhbGxpbmcgJXMgKGFzICVzKSB0byBtb25pdG9yICVzXG4iLCBjYWxsaW5nLCBteV9uYW1lLAorCQltb25pdG9yaW5nKTsKKworCWlmICgoY2xpZW50ID0gbnNtX2NsaWVudF9nZXRfcnBjY2xpZW50KGNhbGxpbmcpKSA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCW1lbWNweShtb24ucHJpdiwgY29va2llLCBTTV9QUklWX1NJWkUpOworCW1vbi5tb25faWQubXlfaWQubXlfbmFtZSA9IG15X25hbWU7CisJbW9uLm1vbl9pZC5teV9pZC5teV9wcm9nID0gbXlfcHJvZzsKKwltb24ubW9uX2lkLm15X2lkLm15X3ZlcnMgPSBteV92ZXJzOworCW1vbi5tb25faWQubXlfaWQubXlfcHJvYyA9IE5MTV9TTV9OT1RJRlk7CisJbW9uLm1vbl9pZC5tb25fbmFtZSA9IG1vbml0b3Jpbmc7CisKKwlpZiAoIShyZXN1bHQgPSBzbV9tb25fMSgmbW9uLCBjbGllbnQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlJQQzolZFxuIiwgcnBjX2NyZWF0ZWVyci5jZl9zdGF0KTsKKwkJcHJpbnRmKCIlc1xuIiwgY2xudF9zcGVycm9yKGNsaWVudCwgInNtX21vbl8xIikpOworCQllcnIgPSAxOworCQlnb3RvIG1vbl9vdXQ7CisJfQorCisJcHJpbnRmKCJTTV9NT04gcmVxdWVzdCAlcywgc3RhdGU6ICVkXG4iLAorCQlyZXN1bHQtPnJlc19zdGF0ID09IHN0YXRfc3VjYyA/ICJzdWNjZXNzZnVsIiA6ICJmYWlsZWQiLAorCQlyZXN1bHQtPnN0YXRlKTsKKworCWlmIChyZXN1bHQtPnJlc19zdGF0ICE9IHN0YXRfc3VjYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlJQQzolZFxuIiwgcnBjX2NyZWF0ZWVyci5jZl9zdGF0KTsKKwkJZXJyID0gMTsKKwl9CisKK21vbl9vdXQ6CisJY2xudF9kZXN0cm95KGNsaWVudCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorbnNtX2NsaWVudF91bm1vbihjaGFyICpjYWxsaW5nLCBjaGFyICp1bm1vbml0b3JpbmcsIGNoYXIgKm15X25hbWUsIGludCBteV9wcm9nLAorCQlpbnQgbXlfdmVycykKK3sKKwlDTElFTlQgKmNsaWVudDsKKwlzbV9zdGF0ICpyZXN1bHQ7CisJbW9uX2lkIG1vbl9pZDsKKwlpbnQgZXJyID0gMDsKKworCXByaW50ZigiQ2FsbGluZyAlcyAoYXMgJXMpIHRvIHVubW9uaXRvciAlc1xuIiwgY2FsbGluZywgbXlfbmFtZSwKKwkJdW5tb25pdG9yaW5nKTsKKworCWlmICgoY2xpZW50ID0gbnNtX2NsaWVudF9nZXRfcnBjY2xpZW50KGNhbGxpbmcpKSA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCW1vbl9pZC5teV9pZC5teV9uYW1lID0gbXlfbmFtZTsKKwltb25faWQubXlfaWQubXlfcHJvZyA9IG15X3Byb2c7CisJbW9uX2lkLm15X2lkLm15X3ZlcnMgPSBteV92ZXJzOworCW1vbl9pZC5teV9pZC5teV9wcm9jID0gTkxNX1NNX05PVElGWTsKKwltb25faWQubW9uX25hbWUgPSB1bm1vbml0b3Jpbmc7CisKKwlpZiAoIShyZXN1bHQgPSBzbV91bm1vbl8xKCZtb25faWQsIGNsaWVudCkpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUlBDOiVkXG4iLCBycGNfY3JlYXRlZXJyLmNmX3N0YXQpOworCQlwcmludGYoIiVzXG4iLCBjbG50X3NwZXJyb3IoY2xpZW50LCAic21fdW5tb25fMSIpKTsKKwkJZXJyID0gMTsKKwkJZ290byB1bm1vbl9vdXQ7CisJfQorCisJcHJpbnRmKCJTTV9VTk1PTiBzdGF0ZTogJWRcbiIsIHJlc3VsdC0+c3RhdGUpOworCit1bm1vbl9vdXQ6CisJY2xudF9kZXN0cm95KGNsaWVudCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorbnNtX2NsaWVudF91bm1vbl9hbGwoY2hhciAqY2FsbGluZywgY2hhciAqbXlfbmFtZSwgaW50IG15X3Byb2csIGludCBteV92ZXJzKQoreworCUNMSUVOVCAqY2xpZW50OworCXNtX3N0YXQgKnJlc3VsdDsKKwlteV9pZCBteV9pZDsKKwlpbnQgZXJyID0gMDsKKworCXByaW50ZigiQ2FsbGluZyAlcyAoYXMgJXMpIHRvIHVubW9uaXRvciBhbGwgaG9zdHNcbiIsIGNhbGxpbmcsIG15X25hbWUpOworCisJaWYgKChjbGllbnQgPSBuc21fY2xpZW50X2dldF9ycGNjbGllbnQoY2FsbGluZykpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJSUEMgY2xpZW50IGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAxOworCX0KKworCW15X2lkLm15X25hbWUgPSBteV9uYW1lOworCW15X2lkLm15X3Byb2cgPSBteV9wcm9nOworCW15X2lkLm15X3ZlcnMgPSBteV92ZXJzOworCW15X2lkLm15X3Byb2MgPSBOTE1fU01fTk9USUZZOworCisJaWYgKCEocmVzdWx0ID0gc21fdW5tb25fYWxsXzEoJm15X2lkLCBjbGllbnQpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlJQQzolZFxuIiwgcnBjX2NyZWF0ZWVyci5jZl9zdGF0KTsKKwkJcHJpbnRmKCIlc1xuIiwgY2xudF9zcGVycm9yKGNsaWVudCwgInNtX3VubW9uX2FsbF8xIikpOworCQllcnIgPSAxOworCQlnb3RvIHVubW9uX2FsbF9vdXQ7CisJfQorCisJcHJpbnRmKCJTTV9VTk1PTl9BTEwgc3RhdGU6ICVkXG4iLCByZXN1bHQtPnN0YXRlKTsKKwordW5tb25fYWxsX291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50Cituc21fY2xpZW50X2NyYXNoKGNoYXIgKmhvc3QpCit7CisJQ0xJRU5UICpjbGllbnQ7CisKKwlpZiAoKGNsaWVudCA9IG5zbV9jbGllbnRfZ2V0X3JwY2NsaWVudChob3N0KSkgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXNtX3NpbXVfY3Jhc2hfMShOVUxMLCBjbGllbnQpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiUlBDOiVkXG4iLCBycGNfY3JlYXRlZXJyLmNmX3N0YXQpOworCQlwcmludGYoIiVzXG4iLCBjbG50X3NwZXJyb3IoY2xpZW50LCAic21fc2ltdV9jcmFzaF8xIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbnNtX2NsaWVudF9zdGF0KGNoYXIgKmNhbGxpbmcsIGNoYXIgKm1vbml0b3JpbmcpCit7CisJQ0xJRU5UICpjbGllbnQ7CisJc21fbmFtZSBjaGVja2luZzsKKwlzbV9zdGF0X3JlcyAqcmVzdWx0OworCisJaWYgKChjbGllbnQgPSBuc21fY2xpZW50X2dldF9ycGNjbGllbnQoY2FsbGluZykpID09IE5VTEwpCisJCXJldHVybiAxOworCisJY2hlY2tpbmcubW9uX25hbWUgPSBtb25pdG9yaW5nOworCisJaWYgKCEocmVzdWx0ID0gc21fc3RhdF8xKCZjaGVja2luZywgY2xpZW50KSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJSUEM6JWRcbiIsIHJwY19jcmVhdGVlcnIuY2Zfc3RhdCk7CisJCXByaW50ZigiJXNcbiIsIGNsbnRfc3BlcnJvcihjbGllbnQsICJzbV9zdGF0XzEiKSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChyZXN1bHQtPnJlc19zdGF0ICE9IHN0YXRfc3VjYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIlJQQzolZFxuIiwgcnBjX2NyZWF0ZWVyci5jZl9zdGF0KTsKKwkJcHJpbnRmKCJzdGF0X2ZhaWwgZnJvbSAlcyBmb3IgJXMsIHN0YXRlOiAlZFxuIiwgY2FsbGluZywKKwkJCW1vbml0b3JpbmcsIHJlc3VsdC0+c3RhdGUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlwcmludGYoInN0YXRfc3VjYyBmcm9tICVzIGZvciAlcywgc3RhdGU6ICVkXG4iLCBjYWxsaW5nLAorCQltb25pdG9yaW5nLCByZXN1bHQtPnN0YXRlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cituc21fY2xpZW50X25vdGlmeShjaGFyICpjYWxsaW5nLCBjaGFyICptb25fbmFtZSwgY2hhciAqc3RhdGVzdHIpCit7CisJQ0xJRU5UICpjbGllbnQ7CisKKwlzdGF0X2NoZ2Ugc3RhdF9jaGdlID0geyAubW9uX25hbWUJPSBtb25fbmFtZSB9OworCisJc3RhdF9jaGdlLnN0YXRlID0gYXRvaShzdGF0ZXN0cik7CisKKwlpZiAoKGNsaWVudCA9IG5zbV9jbGllbnRfZ2V0X3JwY2NsaWVudChjYWxsaW5nKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXNtX25vdGlmeV8xKCZzdGF0X2NoZ2UsIGNsaWVudCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJSUEM6JWRcbiIsIHJwY19jcmVhdGVlcnIuY2Zfc3RhdCk7CisJCXByaW50ZigiJXNcbiIsIGNsbnRfc3BlcnJvcihjbGllbnQsICJzbV9ub3RpZnlfMSIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpbV9raWxsZXIoaW50IHNpZykKK3sKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisJKHZvaWQpIHJwY2JfdW5zZXQoTkxNX1NNX1BST0csIE5MTV9TTV9WRVJTNCwgTlVMTCk7CisjZWxzZQorCSh2b2lkKSBwbWFwX3Vuc2V0KE5MTV9TTV9QUk9HLCBOTE1fU01fVkVSUzQpOworI2VuZGlmCisJZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQgZGFlbW9uX3NpbXVsYXRvcih2b2lkKQoreworCXNpZ25hbChTSUdIVVAsIHNpbV9raWxsZXIpOworCXNpZ25hbChTSUdJTlQsIHNpbV9raWxsZXIpOworCXNpZ25hbChTSUdURVJNLCBzaW1fa2lsbGVyKTsKKwkvKiBGSVhNRTogYWxsb3cgZm9yIGRpZmZlcmVudCB2ZXJzaW9ucz8gKi8KKwluZnNfc3ZjX2NyZWF0ZSgibmxtc2ltIiwgTkxNX1NNX1BST0csIE5MTV9TTV9WRVJTNCwgbmxtX3NtX3Byb2dfNCwgMCk7CisJc3ZjX3J1bigpOworfQorCit2b2lkICpubG1fc21fbm90aWZ5XzRfc3ZjKHN0cnVjdCBubG1fc21fbm90aWZ5ICphcmdwLCBzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHApCit7CisJc3RhdGljIGNoYXIgKnJlc3VsdDsKKwljaGFyCSAgICBwcml2W1NNX1BSSVZfU0laRSAqIDIgKyAxXTsKKworCWJpbjJoZXgocHJpdiwgYXJncC0+cHJpdiwgU01fUFJJVl9TSVpFKTsKKworCXByaW50Zigic3RhdGU9JWQ6bW9uX25hbWU9JXM6cHJpdmF0ZT0lc1xuIiwgYXJncC0+c3RhdGUsCisJCWFyZ3AtPm1vbl9uYW1lLCBwcml2KTsKKwlyZXR1cm4gKHZvaWQgKikgJnJlc3VsdDsKK30KKwordm9pZCAqbmxtX3NtX25vdGlmeV8zX3N2YyhzdHJ1Y3QgbmxtX3NtX25vdGlmeSAqYXJncCwgc3RydWN0IHN2Y19yZXEgKnJxc3RwKQoreworCXJldHVybiBubG1fc21fbm90aWZ5XzRfc3ZjKGFyZ3AsIHJxc3RwKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90ZXN0cy9zdGF0ZGJfZHVtcC5jIGIvbmZzLXV0aWxzLTEuMi4yL3Rlc3RzL3N0YXRkYl9kdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkNjNmMgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90ZXN0cy9zdGF0ZGJfZHVtcC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBzdGF0ZGJfZHVtcC5jIC0tIGR1bXAgY29udGVudHMgb2Ygc3RhdGQncyBtb25pdG9yIERCCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwICBSZWQgSGF0LCBKZWZmIExheXRvbiA8amxheXRvbkByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJuc20uaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisKK3N0YXRpYyBjaGFyIGNvb2tpZWJ1ZlsoU01fUFJJVl9TSVpFICogMikgKyAxXTsKK3N0YXRpYyBjaGFyIGFkZHJidWZbSU5FVDZfQUREUlNUUkxFTiArIDFdOworCitzdGF0aWMgdW5zaWduZWQgaW50CitkdW1wX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsIGNvbnN0IHN0cnVjdCBtb24gKm0sCisJICBjb25zdCB0aW1lX3QgdGltZXN0YW1wKQoreworCWludCByZXQ7CisJY29uc3QgY2hhciAqYWRkcjsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCisJcmV0ID0gbnNtX3ByaXZfdG9faGV4KG0tPnByaXYsIGNvb2tpZWJ1Ziwgc2l6ZW9mKGNvb2tpZWJ1ZikpOworCWlmICghcmV0KSB7CisJCXhsb2coTF9FUlJPUiwgIlVuYWJsZSB0byBjb252ZXJ0IGNvb2tpZSB0byBoZXggc3RyaW5nLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJc3dpdGNoIChzYS0+c2FfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopKGNoYXIgKilzYTsKKwkJYWRkciA9IGluZXRfbnRvcChzYS0+c2FfZmFtaWx5LCAmc2luLT5zaW5fYWRkci5zX2FkZHIsIGFkZHJidWYsCisJCQkJIChzb2NrbGVuX3Qpc2l6ZW9mKGFkZHJidWYpKTsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGNoYXIgKilzYTsKKwkJYWRkciA9IGluZXRfbnRvcChzYS0+c2FfZmFtaWx5LCAmc2luNi0+c2luNl9hZGRyLCBhZGRyYnVmLAorCQkJCSAoc29ja2xlbl90KXNpemVvZihhZGRyYnVmKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXhsb2coTF9FUlJPUiwgIlVucmVjb2duaXplZCBhZGRyZXNzIGZhbWlseTogJWh1XG4iLAorCQkJc2EtPnNhX2ZhbWlseSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhZGRyID09IE5VTEwpIHsKKwkJeGxvZyhMX0VSUk9SLCAiVW5hYmxlIHRvIGNvbnZlcnQgc29ja2FkZHIgdG8gc3RyaW5nOiAlc1xuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENhbGxlcnMgb2YgdGhpcyBwcm9ncmFtIHNob3VsZCBhc3N1bWUgdGhhdCBpbiB0aGUgZnV0dXJlLCBleHRyYQorCSAqIGZpZWxkcyBtYXkgYmUgYWRkZWQgdG8gdGhlIG91dHB1dC4gQW55b25lIGFkZGluZyBleHRyYSBmaWVsZHMgdG8KKwkgKiB0aGUgb3V0cHV0IHNob3VsZCBhZGQgdGhlbSB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorCSAqLworCXByaW50ZigiJXMgJXMgJXMgJXMgJXMgJWQgJWQgJWRcbiIsCisJCQlob3N0bmFtZSwgYWRkciwgY29va2llYnVmLAorCQkJbS0+bW9uX2lkLm1vbl9uYW1lLAorCQkJbS0+bW9uX2lkLm15X2lkLm15X25hbWUsCisJCQltLT5tb25faWQubXlfaWQubXlfcHJvZywKKwkJCW0tPm1vbl9pZC5teV9pZC5teV92ZXJzLAorCQkJbS0+bW9uX2lkLm15X2lkLm15X3Byb2MpOyAKKworCXJldHVybiAxOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXhsb2dfc3lzbG9nKDApOworCXhsb2dfc3RkZXJyKDEpOworCXhsb2dfb3Blbihhcmd2WzBdKTsKKwkKKwluc21fbG9hZF9tb25pdG9yX2xpc3QoZHVtcF9ob3N0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90ZXN0cy90MDAwMS1zdGF0ZC1iYXNpYy1tb24tdW5tb24uc2ggYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvdDAwMDEtc3RhdGQtYmFzaWMtbW9uLXVubW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMTI3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvdDAwMDEtc3RhdGQtYmFzaWMtbW9uLXVubW9uLnNoCkBAIC0wLDAgKzEsNTggQEAKKyMhL2Jpbi9iYXNoCisjCisjIHN0YXRkX2Jhc2ljX21vbl91bm1vbiAtLSB0ZXN0IGJhc2ljIG1vbi91bm1vbiBmdW5jdGlvbmFsaXR5IHdpdGggc3RhdGQKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEwICBSZWQgSGF0LCBKZWZmIExheXRvbiA8amxheXRvbkByZWRoYXQuY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisjIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIyA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCisjCisKKy4gLi90ZXN0LWxpYi5zaAorCisjIFRoaXMgdGVzdCBuZWVkcyByb290IHByaXZpbGVnZXMKK2NoZWNrX3Jvb3QKKworc3RhcnRfc3RhdGQKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWVjaG8gIkZBSUw6IHByb2JsZW0gc3RhcnRpbmcgc3RhdGQiCisJZXhpdCAxCitmaQorCitDT09LSUU9YGVjaG8gJCQgfCBtZDVzdW0gfCBjdXQgLWQnICcgLWYxYAorTU9OX05BTUU9YGhvc3RuYW1lYAorCituc21fY2xpZW50IG1vbiAkTU9OX05BTUUgJENPT0tJRQoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisJZWNobyAiRkFJTDogbW9uIGZhaWxlZCIKKwlraWxsX3N0YXRkCisJZXhpdCAxCitmaQorCitzdGF0ZGJfZHVtcCB8IGdyZXAgJE1PTl9OQU1FIHwgZ3JlcCAtcSAkQ09PS0lFCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwllY2hvICJGQUlMOiBtb25pdG9yIERCIGRvZXNuJ3Qgc2VlbSB0byBjb250YWluIGVudHJ5IgorCWtpbGxfc3RhdGQKKwlleGl0IDEKK2ZpCisKK25zbV9jbGllbnQgdW5tb24gJE1PTl9OQU1FCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKwllY2hvICJGQUlMOiB1bm1vbiBmYWlsZWQiCisJa2lsbF9zdGF0ZAorCWV4aXQgMQorZmkKKwora2lsbF9zdGF0ZAorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvdGVzdC1saWIuc2ggYi9uZnMtdXRpbHMtMS4yLjIvdGVzdHMvdGVzdC1saWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0NzI2NAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90ZXN0cy90ZXN0LWxpYi5zaApAQCAtMCwwICsxLDYwIEBACisjIS9iaW4vYmFzaAorIworIyB0ZXN0LWxpYi5zaCAtLSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyBmb3IgbmZzLXV0aWxzIHRlc3RzCisjCisjIENvcHlyaWdodCAoQykgMjAxMCAgUmVkIEhhdCwgSmVmZiBMYXl0b24gPGpsYXl0b25AcmVkaGF0LmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorIyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorIworCisjIG1ha2Ugc3VyZSAkc3JjZGlyIGlzIHNldCBhbmQgc2FuaXR5IGNoZWNrIGl0CitzcmNkaXI9JHtzcmNkaXItLn0KK2lmIFsgISAtZCAke3NyY2Rpcn0gXTsgdGhlbgorCWVjaG8gIioqKkVSUk9SKioqOiBiYWQgaW5zdGFsbGF0aW9uIC0tIFwkc3JjZGlyPSR7c3JjZGlyfSIKKwlleGl0IDEKK2ZpCisKK2V4cG9ydCBQQVRIPSRQQVRIOiR7c3JjZGlyfToke3NyY2Rpcn0vbnNtX2NsaWVudAorCisjIFNvbWUgdGVzdHMgcmVxdWlyZSByb290IHByaXZpbGVnZXMuIENoZWNrIGZvciB0aGVtIGFuZCBza2lwIHRoZSB0ZXN0IChleGl0IDc3KQorIyBpZiB0aGUgY2FsbGVyIGRvZXNuJ3QgaGF2ZSB0aGVtLgorY2hlY2tfcm9vdCgpIHsKKwlpZiBbICRFVUlEIC1uZSAwIF07IHRoZW4KKwkJZWNobyAiKioqIFNraXBwaW5nIHRoaXMgdGVzdCBhcyBpdCByZXF1aXJlcyByb290IHByaXZzICoqKiIKKwkJZXhpdCA3NworCWZpCit9CisKKyMgaXMgbG9ja2QgcmVnaXN0ZXJlZCBhcyBhIHNlcnZpY2U/Citsb2NrZF9yZWdpc3RlcmVkKCkgeworCXJwY2luZm8gLXAgfCBncmVwIC1xIG5sb2NrbWdyCisJcmV0dXJuICQ/Cit9CisKKyMgc3RhcnQgdXAgc3RhdGQKK3N0YXJ0X3N0YXRkKCkgeworCXJwY2luZm8gLXUgMTI3LjAuMC4xIHN0YXR1cyAxICY+IC9kZXYvbnVsbAorCWlmIFsgJD8gLWVxIDAgXTsgdGhlbgorCQllY2hvICIqKipFUlJPUioqKjogc3RhdGQgaXMgYWxyZWFkeSBydW5uaW5nIGFuZCBzaG91bGQgIgorCQllY2hvICIgICAgICAgICAgICAgYmUgZG93biB3aGVuIHN0YXJ0aW5nIHRoaXMgdGVzdCIKKwkJcmV0dXJuIDEKKwlmaQorCSRzcmNkaXIvLi4vdXRpbHMvc3RhdGQvc3RhdGQgLS1uby1ub3RpZnkKK30KKworIyBzaHV0IGRvd24gc3RhdGQKK2tpbGxfc3RhdGQoKSB7CisJa2lsbCBgY2F0IC92YXIvcnVuL3JwYy5zdGF0ZC5waWRgCit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxNTM0NgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExIEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworT1BURElSUyA9CisKK2lmIENPTkZJR19SUENHRU4KK09QVERJUlMgKz0gcnBjZ2VuCitlbmRpZgorCitTVUJESVJTID0gbG9ja3Rlc3QgcnBjZGVidWcgbmxtdGVzdCAkKE9QVERJUlMpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi90b29scy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFiNzdiCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjE1IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorQENPTkZJR19SUENHRU5fVFJVRUBhbV9fYXBwZW5kXzEgPSBycGNnZW4KK3N1YmRpciA9IHRvb2xzCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorU09VUkNFUyA9CitESVNUX1NPVVJDRVMgPQorUkVDVVJTSVZFX1RBUkdFVFMgPSBhbGwtcmVjdXJzaXZlIGNoZWNrLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKKwlodG1sLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWR2aS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1odG1sLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKKwlpbnN0YWxsLXBkZi1yZWN1cnNpdmUgaW5zdGFsbC1wcy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgXAorCWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIHBkZi1yZWN1cnNpdmUgXAorCXBzLXJlY3Vyc2l2ZSB1bmluc3RhbGwtcmVjdXJzaXZlCitSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyA9IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUJXAorICBkaXN0Y2xlYW4tcmVjdXJzaXZlIG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCitBTV9SRUNVUlNJVkVfVEFSR0VUUyA9ICQoUkVDVVJTSVZFX1RBUkdFVFM6LXJlY3Vyc2l2ZT0pIFwKKwkkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTOi1yZWN1cnNpdmU9KSB0YWdzIFRBR1MgY3RhZ3MgQ1RBR1MgXAorCWRpc3RkaXIKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RfU1VCRElSUyA9IGxvY2t0ZXN0IHJwY2RlYnVnIG5sbXRlc3QgcnBjZ2VuCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorYW1fX3JlbGF0aXZpemUgPSBcCisgIGRpcjA9YHB3ZGA7IFwKKyAgc2VkX2ZpcnN0PSdzLF5cKFteL10qXCkvLiokJCxcMSwnOyBcCisgIHNlZF9yZXN0PSdzLF5bXi9dKi8qLCwnOyBcCisgIHNlZF9sYXN0PSdzLF4uKi9cKFteL10qXCkkJCxcMSwnOyBcCisgIHNlZF9idXRsYXN0PSdzLC8qW14vXSokJCwsJzsgXAorICB3aGlsZSB0ZXN0IC1uICIkJGRpcjEiOyBkbyBcCisgICAgZmlyc3Q9YGVjaG8gIiQkZGlyMSIgfCBzZWQgLWUgIiQkc2VkX2ZpcnN0ImA7IFwKKyAgICBpZiB0ZXN0ICIkJGZpcnN0IiAhPSAiLiI7IHRoZW4gXAorICAgICAgaWYgdGVzdCAiJCRmaXJzdCIgPSAiLi4iOyB0aGVuIFwKKyAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfbGFzdCJgLyIkJGRpcjIiOyBcCisgICAgICAgIGRpcjA9YGVjaG8gIiQkZGlyMCIgfCBzZWQgLWUgIiQkc2VkX2J1dGxhc3QiYDsgXAorICAgICAgZWxzZSBcCisgICAgICAgIGZpcnN0Mj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgICAgICBpZiB0ZXN0ICIkJGZpcnN0MiIgPSAiJCRmaXJzdCI7IHRoZW4gXAorICAgICAgICAgIGRpcjI9YGVjaG8gIiQkZGlyMiIgfCBzZWQgLWUgIiQkc2VkX3Jlc3QiYDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICBkaXIyPSIuLi8kJGRpcjIiOyBcCisgICAgICAgIGZpOyBcCisgICAgICAgIGRpcjA9IiQkZGlyMCIvIiQkZmlyc3QiOyBcCisgICAgICBmaTsgXAorICAgIGZpOyBcCisgICAgZGlyMT1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgIGRvbmU7IFwKKyAgcmVsZGlyPSIkJGRpcjIiCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACitPUFRESVJTID0gJChhbV9fYXBwZW5kXzEpCitTVUJESVJTID0gbG9ja3Rlc3QgcnBjZGVidWcgbmxtdGVzdCAkKE9QVERJUlMpCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1yZWN1cnNpdmUKKworLlNVRkZJWEVTOgorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCisKKyMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCisjIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KKyMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKKyMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJworIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKKyMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCiskKFJFQ1VSU0lWRV9UQVJHRVRTKToKKwlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGRvdF9zZWVuPXllczsgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAorCSAgZWxzZSBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCisJICBmaTsgXAorCSAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAorCSAgfHwgZXZhbCAkJGZhaWxjb207IFwKKwlkb25lOyBcCisJaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKKwkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCisJZmk7IHRlc3QgLXogIiQkZmFpbCIKKworJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUyk6CisJQGZhaWw9IGZhaWxjb209J2V4aXQgMSc7IFwKKwlmb3IgZiBpbiB4ICQkTUFLRUZMQUdTOyBkbyBcCisJICBjYXNlICQkZiBpbiBcCisJICAgICo9KiB8IC0tWyFrXSopOzsgXAorCSAgICAqayopIGZhaWxjb209J2ZhaWw9eWVzJzs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZG90X3NlZW49bm87IFwKKwljYXNlICIkQCIgaW4gXAorCSAgZGlzdGNsZWFuLSogfCBtYWludGFpbmVyLWNsZWFuLSopIGxpc3Q9JyQoRElTVF9TVUJESVJTKScgOzsgXAorCSAgKikgbGlzdD0nJChTVUJESVJTKScgOzsgXAorCWVzYWM7IFwKKwlyZXY9Jyc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gOjsgZWxzZSBcCisJICAgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlyZXY9IiQkcmV2IC4iOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKKwkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgordGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdGFncyk7IFwKKwlkb25lCitjdGFncy1yZWN1cnNpdmU6CisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8ICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY3RhZ3MpOyBcCisJZG9uZQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiB0YWdzLXJlY3Vyc2l2ZSAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJaWYgKCQoRVRBR1MpIC0tZXRhZ3MtaW5jbHVkZSAtLXZlcnNpb24pID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJICBpbmNsdWRlX29wdGlvbj0tLWV0YWdzLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD0uOyBcCisJZWxzZSBcCisJICBpbmNsdWRlX29wdGlvbj0tLWluY2x1ZGU7IFwKKwkgIGVtcHR5X2ZpeD07IFwKKwlmaTsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAhIC1mICQkc3ViZGlyL1RBR1MgfHwgXAorCSAgICAgIHNldCAiJCRAIiAiJCRpbmNsdWRlX29wdGlvbj0kJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogY3RhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKKwlAbGlzdD0nJChESVNUX1NVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCisJICAgIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRzdWJkaXIiIFwKKwkgICAgfHwgJChNS0RJUl9QKSAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJChkaXN0ZGlyKS8kJHN1YmRpciI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X2Rpc3RkaXI9JCRyZWxkaXI7IFwKKwkgICAgZGlyMT0kJHN1YmRpcjsgZGlyMj0iJCh0b3BfZGlzdGRpcikiOyBcCisJICAgICQoYW1fX3JlbGF0aXZpemUpOyBcCisJICAgIG5ld190b3BfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBlY2hvICIgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkJG5ld190b3BfZGlzdGRpciIgZGlzdGRpcj0iJCRuZXdfZGlzdGRpciIgXFwiOyBcCisJICAgIGVjaG8gIiAgICAgYW1fX3JlbW92ZV9kaXN0ZGlyPTogYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogYW1fX3NraXBfbW9kZV9maXg9OiBkaXN0ZGlyKSI7IFwKKwkgICAgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiBcCisJICAgICAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgXAorCSAgICAgICAgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBcCisJICAgICAgICBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcCisJCWFtX19yZW1vdmVfZGlzdGRpcj06IFwKKwkJYW1fX3NraXBfbGVuZ3RoX2NoZWNrPTogXAorCQlhbV9fc2tpcF9tb2RlX2ZpeD06IFwKKwkgICAgICAgIGRpc3RkaXIpIFwKKwkgICAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQorYWxsLWFtOiBNYWtlZmlsZQoraW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQoraW5zdGFsbGRpcnMtYW06CitpbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1yZWN1cnNpdmUKKworZHZpLWFtOgorCitodG1sOiBodG1sLXJlY3Vyc2l2ZQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLXJlY3Vyc2l2ZQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1yZWN1cnNpdmUKKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbToKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtcmVjdXJzaXZlCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1yZWN1cnNpdmUKKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtcmVjdXJzaXZlCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLXJlY3Vyc2l2ZQorCitwZGYtYW06CisKK3BzOiBwcy1yZWN1cnNpdmUKKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6ICQoUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMpICQoUkVDVVJTSVZFX1RBUkdFVFMpIGN0YWdzLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwIHRhZ3MtcmVjdXJzaXZlCisKKy5QSE9OWTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgQ1RBR1MgR1RBR1MgXAorCWFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIFwKKwljdGFncyBjdGFncy1yZWN1cnNpdmUgZGlzdGNsZWFuIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBcCisJaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBcCisJaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBcCisJaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIFwKKwlpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gXAorCWluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIGluc3RhbGxkaXJzLWFtIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB0YWdzLXJlY3Vyc2l2ZSBcCisJdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9sb2NrdGVzdC9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi90b29scy9sb2NrdGVzdC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTU2ODE1Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL2xvY2t0ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTIgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitDQz0kKENDX0ZPUl9CVUlMRCkKK0xJQlRPT0wgPSBATElCVE9PTEAgLS10YWc9Q0MKKworbm9pbnN0X1BST0dSQU1TID0gdGVzdGxrCit0ZXN0bGtfU09VUkNFUyA9IHRlc3Rsay5jCit0ZXN0bGtfQ0ZMQUdTPSQoQ0ZMQUdTX0ZPUl9CVUlMRCkKK3Rlc3Rsa19DUFBGTEFHUz0kKENQUEZMQUdTX0ZPUl9CVUlMRCkKK3Rlc3Rsa19MREZMQUdTPSQoTERGTEFHU19GT1JfQlVJTEQpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9sb2NrdGVzdC9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi90b29scy9sb2NrdGVzdC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWZhMDQyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL2xvY2t0ZXN0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNTQ3IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitub2luc3RfUFJPR1JBTVMgPSB0ZXN0bGskKEVYRUVYVCkKK3N1YmRpciA9IHRvb2xzL2xvY2t0ZXN0CitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKK2FtX3Rlc3Rsa19PQkpFQ1RTID0gdGVzdGxrLXRlc3Rsay4kKE9CSkVYVCkKK3Rlc3Rsa19PQkpFQ1RTID0gJChhbV90ZXN0bGtfT0JKRUNUUykKK3Rlc3Rsa19MREFERCA9ICQoTERBREQpCit0ZXN0bGtfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKHRlc3Rsa19DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJCh0ZXN0bGtfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJCh0ZXN0bGtfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQodGVzdGxrX1NPVVJDRVMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9ICQoQ0NfRk9SX0JVSUxEKQorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAgLS10YWc9Q0MKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACit0ZXN0bGtfU09VUkNFUyA9IHRlc3Rsay5jCit0ZXN0bGtfQ0ZMQUdTID0gJChDRkxBR1NfRk9SX0JVSUxEKQordGVzdGxrX0NQUEZMQUdTID0gJChDUFBGTEFHU19GT1JfQlVJTEQpCit0ZXN0bGtfTERGTEFHUyA9ICQoTERGTEFHU19GT1JfQlVJTEQpCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB0b29scy9sb2NrdGVzdC9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSB0b29scy9sb2NrdGVzdC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworY2xlYW4tbm9pbnN0UFJPR1JBTVM6CisJQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAordGVzdGxrJChFWEVFWFQpOiAkKHRlc3Rsa19PQkpFQ1RTKSAkKHRlc3Rsa19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiB0ZXN0bGskKEVYRUVYVCkKKwkkKHRlc3Rsa19MSU5LKSAkKHRlc3Rsa19PQkpFQ1RTKSAkKHRlc3Rsa19MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvdGVzdGxrLXRlc3Rsay5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCit0ZXN0bGstdGVzdGxrLm86IHRlc3Rsay5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0bGtfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdGxrX0NGTEFHUykgJChDRkxBR1MpIC1NVCB0ZXN0bGstdGVzdGxrLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3Rlc3Rsay10ZXN0bGsuVHBvIC1jIC1vIHRlc3Rsay10ZXN0bGsubyBgdGVzdCAtZiAndGVzdGxrLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHRlc3Rsay5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Rlc3Rsay10ZXN0bGsuVHBvICQoREVQRElSKS90ZXN0bGstdGVzdGxrLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd0ZXN0bGsuYycgb2JqZWN0PSd0ZXN0bGstdGVzdGxrLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3Rsa19DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0bGtfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdGVzdGxrLXRlc3Rsay5vIGB0ZXN0IC1mICd0ZXN0bGsuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdGVzdGxrLmMKKwordGVzdGxrLXRlc3Rsay5vYmo6IHRlc3Rsay5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJCh0ZXN0bGtfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQodGVzdGxrX0NGTEFHUykgJChDRkxBR1MpIC1NVCB0ZXN0bGstdGVzdGxrLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvdGVzdGxrLXRlc3Rsay5UcG8gLWMgLW8gdGVzdGxrLXRlc3Rsay5vYmogYGlmIHRlc3QgLWYgJ3Rlc3Rsay5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3Rsay5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0bGsuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS90ZXN0bGstdGVzdGxrLlRwbyAkKERFUERJUikvdGVzdGxrLXRlc3Rsay5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndGVzdGxrLmMnIG9iamVjdD0ndGVzdGxrLXRlc3Rsay5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHRlc3Rsa19DUFBGTEFHUykgJChDUFBGTEFHUykgJCh0ZXN0bGtfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gdGVzdGxrLXRlc3Rsay5vYmogYGlmIHRlc3QgLWYgJ3Rlc3Rsay5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3Rlc3Rsay5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS90ZXN0bGsuYyc7IGZpYAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKQoraW5zdGFsbGRpcnM6CitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbToKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBjdGFncyBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBcCisJaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgXAorCWluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIFwKKwlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0KKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbG9ja3Rlc3QvdGVzdGxrLmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbG9ja3Rlc3QvdGVzdGxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlZDc2NQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9sb2NrdGVzdC90ZXN0bGsuYwpAQCAtMCwwICsxLDEwNyBAQAorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBsaW51eAorI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisjaW5jbHVkZSA8ZmNudGwuaD4KKworc3RhdGljIHZvaWQJdXNhZ2UoaW50IGV4dmFsKTsKK3N0YXRpYyB2b2lkCWZhdGFsKGNoYXIgKik7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbG9uZwlzdGFydCA9IDAsIGxlbiA9IDA7CisJc3RydWN0IGZsb2NrCWZsOworCWludAkJYywgZmQsIGNtZCwgdHlwOworCWNoYXIJCSpmbmFtZTsKKworCXR5cCA9IEZfUkRMQ0s7CisJY21kID0gRl9TRVRMSzsKKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYmhydHciKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdoJzoKKwkJCXVzYWdlKDApOworCQljYXNlICdyJzoKKwkJCWNtZCA9IEZfU0VUTEs7CisJCQl0eXAgPSBGX1JETENLOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJY21kID0gRl9TRVRMSzsKKwkJCXR5cCA9IEZfV1JMQ0s7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQljbWQgPSBGX1NFVExLVzsKKwkJCXR5cCA9IEZfV1JMQ0s7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQljbWQgPSBGX0dFVExLOworCQkJYnJlYWs7CisJCWNhc2UgJz8nOgorCQkJdXNhZ2UoMSk7CisJCX0KKwl9CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmdjIDw9IDAgfHwgYXJnYyA+IDMpCisJCXVzYWdlKDEpOworCisJZm5hbWUgPSBhcmd2WzBdOworCS8qIHByaW50ZigiVFBcbiIpOyAqLworCWlmIChhcmdjID4gMSkKKwkJc3RhcnQgPSBhdG9pKGFyZ3ZbMV0pOworCS8qIHByaW50ZigiVFBcbiIpOyAqLworCWlmIChhcmdjID4gMikKKwkJbGVuICAgPSBhdG9pKGFyZ3ZbMl0pOworCS8qIHByaW50ZigiVFBcbiIpOyAqLworCisJaWYgKChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiwgMDY0NCkpIDwgMCkKKwkJZmF0YWwoZm5hbWUpOworCisJLyogcHJpbnRmKCJUUDFcbiIpOyAqLworCWZsLmxfdHlwZSA9IHR5cDsKKwlmbC5sX3doZW5jZSA9IDA7CisJZmwubF9zdGFydCA9IHN0YXJ0OworCWZsLmxfbGVuID0gbGVuOworCisJaWYgKGZjbnRsKGZkLCBjbWQsICZmbCkgPCAwKQorCQlmYXRhbCgiZmNudGwiKTsKKwlwcmludGYoImZjbnRsOiBva1xuIik7CisJCisJLyogcHJpbnRmKCJUUDJcbiIpOyAqLworCWlmIChjbWQgPT0gRl9HRVRMSykgeworCQlpZiAoZmwubF90eXBlID09IEZfVU5MQ0spIHsKKwkJCXByaW50ZigiJXM6IG5vIGNvbmZsaWN0aW5nIGxvY2tcbiIsIGZuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXM6IGNvbmZsaWN0aW5nIGxvY2sgYnkgJWQgb24gKCVsbGQ7JWxsZClcbiIsCisJCQkJZm5hbWUsIGZsLmxfcGlkLCBmbC5sX3N0YXJ0LCBmbC5sX2xlbik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogcHJpbnRmKCJUUDNcbiIpOyAqLworCXBhdXNlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShpbnQgZXh2YWwpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogdGVzdGxrIGZpbGVuYW1lIFtzdGFydCBbbGVuXV1cbiIpOworCWV4aXQoZXh2YWwpOworfQorCitzdGF0aWMgdm9pZAorZmF0YWwoY2hhciAqbXNnKQoreworCXBlcnJvcihtc2cpOworCWV4aXQoMik7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbW91bnRzdGF0cy9tb3VudHN0YXRzLnB5IGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL21vdW50c3RhdHMvbW91bnRzdGF0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDc1YzllCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL21vdW50c3RhdHMvbW91bnRzdGF0cy5weQpAQCAtMCwwICsxLDYwNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBweXRob24tbW9kZSAtKi0KKyIiIlBhcnNlIC9wcm9jL3NlbGYvbW91bnRzdGF0cyBhbmQgZGlzcGxheSBpdCBpbiBodW1hbiByZWFkYWJsZSBmb3JtCisiIiIKKworX19jb3B5cmlnaHRfXyA9ICIiIgorQ29weXJpZ2h0IChDKSAyMDA1LCBDaHVjayBMZXZlciA8Y2VsQG5ldGFwcC5jb20+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyIiIgorCitpbXBvcnQgc3lzLCBvcywgdGltZQorCitNb3VudHN0YXRzX3ZlcnNpb24gPSAnMC4yJworCitkZWYgZGlmZmVyZW5jZSh4LCB5KToKKyAgICAiIiJVc2VkIGZvciBhIG1hcCgpIGZ1bmN0aW9uCisgICAgIiIiCisgICAgcmV0dXJuIHggLSB5CisKK2NsYXNzIERldmljZURhdGE6CisgICAgIiIiRGV2aWNlRGF0YSBvYmplY3RzIHByb3ZpZGUgbWV0aG9kcyBmb3IgcGFyc2luZyBhbmQgZGlzcGxheWluZworICAgIGRhdGEgZm9yIGEgc2luZ2xlIG1vdW50IGdyYWJiZWQgZnJvbSAvcHJvYy9zZWxmL21vdW50c3RhdHMKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX19uZnNfZGF0YSA9IGRpY3QoKQorICAgICAgICBzZWxmLl9fcnBjX2RhdGEgPSBkaWN0KCkKKyAgICAgICAgc2VsZi5fX3JwY19kYXRhWydvcHMnXSA9IFtdCisKKyAgICBkZWYgX19wYXJzZV9uZnNfbGluZShzZWxmLCB3b3Jkcyk6CisgICAgICAgIGlmIHdvcmRzWzBdID09ICdkZXZpY2UnOgorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydleHBvcnQnXSA9IHdvcmRzWzFdCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ21vdW50cG9pbnQnXSA9IHdvcmRzWzRdCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ2ZzdHlwZSddID0gd29yZHNbN10KKyAgICAgICAgICAgIGlmIHdvcmRzWzddLmZpbmQoJ25mcycpICE9IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnc3RhdHZlcnMnXSA9IHdvcmRzWzhdCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ2FnZTonOgorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydhZ2UnXSA9IGxvbmcod29yZHNbMV0pCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ29wdHM6JzoKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnbW91bnRvcHRpb25zJ10gPSAnJy5qb2luKHdvcmRzWzE6XSkuc3BsaXQoJywnKQorICAgICAgICBlbGlmIHdvcmRzWzBdID09ICdjYXBzOic6CisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3NlcnZlcmNhcGFiaWxpdGllcyddID0gJycuam9pbih3b3Jkc1sxOl0pLnNwbGl0KCcsJykKKyAgICAgICAgZWxpZiB3b3Jkc1swXSA9PSAnbmZzdjQ6JzoKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnbmZzdjRmbGFncyddID0gJycuam9pbih3b3Jkc1sxOl0pLnNwbGl0KCcsJykKKyAgICAgICAgZWxpZiB3b3Jkc1swXSA9PSAnc2VjOic6CisgICAgICAgICAgICBrZXlzID0gJycuam9pbih3b3Jkc1sxOl0pLnNwbGl0KCcsJykKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnZmxhdm9yJ10gPSBpbnQoa2V5c1swXS5zcGxpdCgnPScpWzFdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydwc2V1ZG9mbGF2b3InXSA9IDAKKyAgICAgICAgICAgIGlmIHNlbGYuX19uZnNfZGF0YVsnZmxhdm9yJ10gPT0gNjoKKyAgICAgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3BzZXVkb2ZsYXZvciddID0gaW50KGtleXNbMV0uc3BsaXQoJz0nKVsxXSkKKyAgICAgICAgZWxpZiB3b3Jkc1swXSA9PSAnZXZlbnRzOic6CisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ2lub2RlcmV2YWxpZGF0ZXMnXSA9IGludCh3b3Jkc1sxXSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnZGVudHJ5cmV2YWxpZGF0ZXMnXSA9IGludCh3b3Jkc1syXSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnZGF0YWludmFsaWRhdGVzJ10gPSBpbnQod29yZHNbM10pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ2F0dHJpbnZhbGlkYXRlcyddID0gaW50KHdvcmRzWzRdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydzeW5jaW5vZGVzJ10gPSBpbnQod29yZHNbNV0pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3Zmc29wZW4nXSA9IGludCh3b3Jkc1s2XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsndmZzbG9va3VwJ10gPSBpbnQod29yZHNbN10pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3Zmc3Blcm1pc3Npb24nXSA9IGludCh3b3Jkc1s4XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsndmZzcmVhZHBhZ2UnXSA9IGludCh3b3Jkc1s5XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsndmZzcmVhZHBhZ2VzJ10gPSBpbnQod29yZHNbMTBdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWyd2ZnN3cml0ZXBhZ2UnXSA9IGludCh3b3Jkc1sxMV0pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3Zmc3dyaXRlcGFnZXMnXSA9IGludCh3b3Jkc1sxMl0pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3Zmc3JlYWRkaXInXSA9IGludCh3b3Jkc1sxM10pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3Zmc2ZsdXNoJ10gPSBpbnQod29yZHNbMTRdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWyd2ZnNmc3luYyddID0gaW50KHdvcmRzWzE1XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsndmZzbG9jayddID0gaW50KHdvcmRzWzE2XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsndmZzcmVsZWFzZSddID0gaW50KHdvcmRzWzE3XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnc2V0YXR0cnRydW5jJ10gPSBpbnQod29yZHNbMThdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydleHRlbmR3cml0ZSddID0gaW50KHdvcmRzWzE5XSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnc2lsbHlyZW5hbWVzJ10gPSBpbnQod29yZHNbMjBdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydzaG9ydHJlYWRzJ10gPSBpbnQod29yZHNbMjFdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydzaG9ydHdyaXRlcyddID0gaW50KHdvcmRzWzIyXSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnZGVsYXknXSA9IGludCh3b3Jkc1syM10pCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ2J5dGVzOic6CisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ25vcm1hbHJlYWRieXRlcyddID0gbG9uZyh3b3Jkc1sxXSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnbm9ybWFsd3JpdGVieXRlcyddID0gbG9uZyh3b3Jkc1syXSkKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnZGlyZWN0cmVhZGJ5dGVzJ10gPSBsb25nKHdvcmRzWzNdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydkaXJlY3R3cml0ZWJ5dGVzJ10gPSBsb25nKHdvcmRzWzRdKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydzZXJ2ZXJyZWFkYnl0ZXMnXSA9IGxvbmcod29yZHNbNV0pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3NlcnZlcndyaXRlYnl0ZXMnXSA9IGxvbmcod29yZHNbNl0pCisKKyAgICBkZWYgX19wYXJzZV9ycGNfbGluZShzZWxmLCB3b3Jkcyk6CisgICAgICAgIGlmIHdvcmRzWzBdID09ICdSUEMnOgorICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydzdGF0c3ZlcnMnXSA9IGZsb2F0KHdvcmRzWzNdKQorICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydwcm9ncmFtdmVyc2lvbiddID0gd29yZHNbNV0KKyAgICAgICAgZWxpZiB3b3Jkc1swXSA9PSAneHBydDonOgorICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydwcm90b2NvbCddID0gd29yZHNbMV0KKyAgICAgICAgICAgIGlmIHdvcmRzWzFdID09ICd1ZHAnOgorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncG9ydCddID0gaW50KHdvcmRzWzJdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnYmluZF9jb3VudCddID0gaW50KHdvcmRzWzNdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncnBjc2VuZHMnXSA9IGludCh3b3Jkc1s0XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3JwY3JlY2VpdmVzJ10gPSBpbnQod29yZHNbNV0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiYWR4aWRzJ10gPSBpbnQod29yZHNbNl0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydpbmZsaWdodHNlbmRzJ10gPSBsb25nKHdvcmRzWzddKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnYmFja2xvZ3V0aWwnXSA9IGxvbmcod29yZHNbOF0pCisgICAgICAgICAgICBlbGlmIHdvcmRzWzFdID09ICd0Y3AnOgorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncG9ydCddID0gd29yZHNbMl0KKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JpbmRfY291bnQnXSA9IGludCh3b3Jkc1szXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2Nvbm5lY3RfY291bnQnXSA9IGludCh3b3Jkc1s0XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2Nvbm5lY3RfdGltZSddID0gaW50KHdvcmRzWzVdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnaWRsZV90aW1lJ10gPSBpbnQod29yZHNbNl0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydycGNzZW5kcyddID0gaW50KHdvcmRzWzddKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncnBjcmVjZWl2ZXMnXSA9IGludCh3b3Jkc1s4XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JhZHhpZHMnXSA9IGludCh3b3Jkc1s5XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2luZmxpZ2h0c2VuZHMnXSA9IGxvbmcod29yZHNbMTBdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnYmFja2xvZ3V0aWwnXSA9IGludCh3b3Jkc1sxMV0pCisgICAgICAgICAgICBlbGlmIHdvcmRzWzFdID09ICdyZG1hJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3BvcnQnXSA9IHdvcmRzWzJdCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiaW5kX2NvdW50J10gPSBpbnQod29yZHNbM10pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydjb25uZWN0X2NvdW50J10gPSBpbnQod29yZHNbNF0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydjb25uZWN0X3RpbWUnXSA9IGludCh3b3Jkc1s1XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2lkbGVfdGltZSddID0gaW50KHdvcmRzWzZdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncnBjc2VuZHMnXSA9IGludCh3b3Jkc1s3XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3JwY3JlY2VpdmVzJ10gPSBpbnQod29yZHNbOF0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiYWR4aWRzJ10gPSBpbnQod29yZHNbOV0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiYWNrbG9ndXRpbCddID0gaW50KHdvcmRzWzEwXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3JlYWRfY2h1bmtzJ10gPSBpbnQod29yZHNbMTFdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnd3JpdGVfY2h1bmtzJ10gPSBpbnQod29yZHNbMTJdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncmVwbHlfY2h1bmtzJ10gPSBpbnQod29yZHNbMTNdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsndG90YWxfcmRtYV9yZXEnXSA9IGludCh3b3Jkc1sxNF0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWyd0b3RhbF9yZG1hX3JlcCddID0gaW50KHdvcmRzWzE1XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3B1bGx1cCddID0gaW50KHdvcmRzWzE2XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2ZpeHVwJ10gPSBpbnQod29yZHNbMTddKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnaGFyZHdheSddID0gaW50KHdvcmRzWzE4XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2ZhaWxlZF9tYXJzaGFsJ10gPSBpbnQod29yZHNbMTldKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnYmFkX3JlcGx5J10gPSBpbnQod29yZHNbMjBdKQorICAgICAgICBlbGlmIHdvcmRzWzBdID09ICdwZXItb3AnOgorICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydwZXItb3AnXSA9IHdvcmRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcCA9IHdvcmRzWzBdWzotMV0KKyAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnb3BzJ10gKz0gW29wXQorICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhW29wXSA9IFtsb25nKHdvcmQpIGZvciB3b3JkIGluIHdvcmRzWzE6XV0KKworICAgIGRlZiBwYXJzZV9zdGF0cyhzZWxmLCBsaW5lcyk6CisgICAgICAgICIiIlR1cm4gYSBsaXN0IG9mIGxpbmVzIGZyb20gYSBtb3VudCBzdGF0IGZpbGUgaW50byBhIAorICAgICAgICBkaWN0aW9uYXJ5IGZ1bGwgb2Ygc3RhdHMsIGtleWVkIGJ5IG5hbWUKKyAgICAgICAgIiIiCisgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQorICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA9PSAwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAobm90IGZvdW5kIGFuZCB3b3Jkc1swXSAhPSAnUlBDJyk6CisgICAgICAgICAgICAgICAgc2VsZi5fX3BhcnNlX25mc19saW5lKHdvcmRzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5fX3BhcnNlX3JwY19saW5lKHdvcmRzKQorCisgICAgZGVmIGlzX25mc19tb3VudHBvaW50KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGlzIGlzIGFuIE5GUyBvciBORlN2NCBtb3VudHBvaW50LAorICAgICAgICBvdGhlcndpc2UgcmV0dXJuIEZhbHNlCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9fbmZzX2RhdGFbJ2ZzdHlwZSddID09ICduZnMnOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxpZiBzZWxmLl9fbmZzX2RhdGFbJ2ZzdHlwZSddID09ICduZnM0JzoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGRpc3BsYXlfbmZzX29wdGlvbnMoc2VsZik6CisgICAgICAgICIiIlByZXR0eS1wcmludCB0aGUgTkZTIG9wdGlvbnMKKyAgICAgICAgIiIiCisgICAgICAgIHByaW50ICdTdGF0cyBmb3IgJXMgbW91bnRlZCBvbiAlczonICUgXAorICAgICAgICAgICAgKHNlbGYuX19uZnNfZGF0YVsnZXhwb3J0J10sIHNlbGYuX19uZnNfZGF0YVsnbW91bnRwb2ludCddKQorCisgICAgICAgIHByaW50ICcgIE5GUyBtb3VudCBvcHRpb25zOiAlcycgJSAnLCcuam9pbihzZWxmLl9fbmZzX2RhdGFbJ21vdW50b3B0aW9ucyddKQorICAgICAgICBwcmludCAnICBORlMgc2VydmVyIGNhcGFiaWxpdGllczogJXMnICUgJywnLmpvaW4oc2VsZi5fX25mc19kYXRhWydzZXJ2ZXJjYXBhYmlsaXRpZXMnXSkKKyAgICAgICAgaWYgc2VsZi5fX25mc19kYXRhLmhhc19rZXkoJ25mc3Y0ZmxhZ3MnKToKKyAgICAgICAgICAgIHByaW50ICcgIE5GU3Y0IGNhcGFiaWxpdHkgZmxhZ3M6ICVzJyAlICcsJy5qb2luKHNlbGYuX19uZnNfZGF0YVsnbmZzdjRmbGFncyddKQorICAgICAgICBpZiBzZWxmLl9fbmZzX2RhdGEuaGFzX2tleSgncHNldWRvZmxhdm9yJyk6CisgICAgICAgICAgICBwcmludCAnICBORlMgc2VjdXJpdHkgZmxhdm9yOiAlZCAgcHNldWRvZmxhdm9yOiAlZCcgJSBcCisgICAgICAgICAgICAgICAgKHNlbGYuX19uZnNfZGF0YVsnZmxhdm9yJ10sIHNlbGYuX19uZnNfZGF0YVsncHNldWRvZmxhdm9yJ10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnICBORlMgc2VjdXJpdHkgZmxhdm9yOiAlZCcgJSBzZWxmLl9fbmZzX2RhdGFbJ2ZsYXZvciddCisKKyAgICBkZWYgZGlzcGxheV9uZnNfZXZlbnRzKHNlbGYpOgorICAgICAgICAiIiJQcmV0dHktcHJpbnQgdGhlIE5GUyBldmVudCBjb3VudGVycworICAgICAgICAiIiIKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJ0NhY2hlIGV2ZW50czonCisgICAgICAgIHByaW50ICcgIGRhdGEgY2FjaGUgaW52YWxpZGF0ZWQgJWQgdGltZXMnICUgc2VsZi5fX25mc19kYXRhWydkYXRhaW52YWxpZGF0ZXMnXQorICAgICAgICBwcmludCAnICBhdHRyaWJ1dGUgY2FjaGUgaW52YWxpZGF0ZWQgJWQgdGltZXMnICUgc2VsZi5fX25mc19kYXRhWydhdHRyaW52YWxpZGF0ZXMnXQorICAgICAgICBwcmludCAnICBpbm9kZXMgc3luY2VkICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsnc3luY2lub2RlcyddCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICdWRlMgY2FsbHM6JworICAgICAgICBwcmludCAnICBWRlMgcmVxdWVzdGVkICVkIGlub2RlIHJldmFsaWRhdGlvbnMnICUgc2VsZi5fX25mc19kYXRhWydpbm9kZXJldmFsaWRhdGVzJ10KKyAgICAgICAgcHJpbnQgJyAgVkZTIHJlcXVlc3RlZCAlZCBkZW50cnkgcmV2YWxpZGF0aW9ucycgJSBzZWxmLl9fbmZzX2RhdGFbJ2RlbnRyeXJldmFsaWRhdGVzJ10KKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJyAgVkZTIGNhbGxlZCBuZnNfcmVhZGRpcigpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzcmVhZGRpciddCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX2xvb2t1cCgpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzbG9va3VwJ10KKyAgICAgICAgcHJpbnQgJyAgVkZTIGNhbGxlZCBuZnNfcGVybWlzc2lvbigpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzcGVybWlzc2lvbiddCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX2ZpbGVfb3BlbigpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzb3BlbiddCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX2ZpbGVfZmx1c2goKSAlZCB0aW1lcycgJSBzZWxmLl9fbmZzX2RhdGFbJ3Zmc2ZsdXNoJ10KKyAgICAgICAgcHJpbnQgJyAgVkZTIGNhbGxlZCBuZnNfbG9jaygpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzbG9jayddCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX2ZzeW5jKCkgJWQgdGltZXMnICUgc2VsZi5fX25mc19kYXRhWyd2ZnNmc3luYyddCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX2ZpbGVfcmVsZWFzZSgpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzcmVsZWFzZSddCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICdWTSBjYWxsczonCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX3JlYWRwYWdlKCkgJWQgdGltZXMnICUgc2VsZi5fX25mc19kYXRhWyd2ZnNyZWFkcGFnZSddCisgICAgICAgIHByaW50ICcgIFZGUyBjYWxsZWQgbmZzX3JlYWRwYWdlcygpICVkIHRpbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsndmZzcmVhZHBhZ2VzJ10KKyAgICAgICAgcHJpbnQgJyAgVkZTIGNhbGxlZCBuZnNfd3JpdGVwYWdlKCkgJWQgdGltZXMnICUgc2VsZi5fX25mc19kYXRhWyd2ZnN3cml0ZXBhZ2UnXQorICAgICAgICBwcmludCAnICBWRlMgY2FsbGVkIG5mc193cml0ZXBhZ2VzKCkgJWQgdGltZXMnICUgc2VsZi5fX25mc19kYXRhWyd2ZnN3cml0ZXBhZ2VzJ10KKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJ0dlbmVyaWMgTkZTIGNvdW50ZXJzOicKKyAgICAgICAgcHJpbnQgJyAgRmlsZSBzaXplIGNoYW5naW5nIG9wZXJhdGlvbnM6JworICAgICAgICBwcmludCAnICAgIHRydW5jYXRpbmcgU0VUQVRUUnM6ICVkICBleHRlbmRpbmcgV1JJVEVzOiAlZCcgJSBcCisgICAgICAgICAgICAoc2VsZi5fX25mc19kYXRhWydzZXRhdHRydHJ1bmMnXSwgc2VsZi5fX25mc19kYXRhWydleHRlbmR3cml0ZSddKQorICAgICAgICBwcmludCAnICAlZCBzaWxseSByZW5hbWVzJyAlIHNlbGYuX19uZnNfZGF0YVsnc2lsbHlyZW5hbWVzJ10KKyAgICAgICAgcHJpbnQgJyAgc2hvcnQgcmVhZHM6ICVkICBzaG9ydCB3cml0ZXM6ICVkJyAlIFwKKyAgICAgICAgICAgIChzZWxmLl9fbmZzX2RhdGFbJ3Nob3J0cmVhZHMnXSwgc2VsZi5fX25mc19kYXRhWydzaG9ydHdyaXRlcyddKQorICAgICAgICBwcmludCAnICBORlNFUlJfREVMQVlzIGZyb20gc2VydmVyOiAlZCcgJSBzZWxmLl9fbmZzX2RhdGFbJ2RlbGF5J10KKworICAgIGRlZiBkaXNwbGF5X25mc19ieXRlcyhzZWxmKToKKyAgICAgICAgIiIiUHJldHR5LXByaW50IHRoZSBORlMgZXZlbnQgY291bnRlcnMKKyAgICAgICAgIiIiCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICdORlMgYnl0ZSBjb3VudHM6JworICAgICAgICBwcmludCAnICBhcHBsaWNhdGlvbnMgcmVhZCAlZCBieXRlcyB2aWEgcmVhZCgyKScgJSBzZWxmLl9fbmZzX2RhdGFbJ25vcm1hbHJlYWRieXRlcyddCisgICAgICAgIHByaW50ICcgIGFwcGxpY2F0aW9ucyB3cm90ZSAlZCBieXRlcyB2aWEgd3JpdGUoMiknICUgc2VsZi5fX25mc19kYXRhWydub3JtYWx3cml0ZWJ5dGVzJ10KKyAgICAgICAgcHJpbnQgJyAgYXBwbGljYXRpb25zIHJlYWQgJWQgYnl0ZXMgdmlhIE9fRElSRUNUIHJlYWQoMiknICUgc2VsZi5fX25mc19kYXRhWydkaXJlY3RyZWFkYnl0ZXMnXQorICAgICAgICBwcmludCAnICBhcHBsaWNhdGlvbnMgd3JvdGUgJWQgYnl0ZXMgdmlhIE9fRElSRUNUIHdyaXRlKDIpJyAlIHNlbGYuX19uZnNfZGF0YVsnZGlyZWN0d3JpdGVieXRlcyddCisgICAgICAgIHByaW50ICcgIGNsaWVudCByZWFkICVkIGJ5dGVzIHZpYSBORlMgUkVBRCcgJSBzZWxmLl9fbmZzX2RhdGFbJ3NlcnZlcnJlYWRieXRlcyddCisgICAgICAgIHByaW50ICcgIGNsaWVudCB3cm90ZSAlZCBieXRlcyB2aWEgTkZTIFdSSVRFJyAlIHNlbGYuX19uZnNfZGF0YVsnc2VydmVyd3JpdGVieXRlcyddCisKKyAgICBkZWYgZGlzcGxheV9ycGNfZ2VuZXJpY19zdGF0cyhzZWxmKToKKyAgICAgICAgIiIiUHJldHR5LXByaW50IHRoZSBnZW5lcmljIFJQQyBzdGF0cworICAgICAgICAiIiIKKyAgICAgICAgc2VuZHMgPSBzZWxmLl9fcnBjX2RhdGFbJ3JwY3NlbmRzJ10KKworICAgICAgICBwcmludAorICAgICAgICBwcmludCAnUlBDIHN0YXRpc3RpY3M6JworCisgICAgICAgIHByaW50ICcgICVkIFJQQyByZXF1ZXN0cyBzZW50LCAlZCBSUEMgcmVwbGllcyByZWNlaXZlZCAoJWQgWElEcyBub3QgZm91bmQpJyAlIFwKKyAgICAgICAgICAgIChzZW5kcywgc2VsZi5fX3JwY19kYXRhWydycGNyZWNlaXZlcyddLCBzZWxmLl9fcnBjX2RhdGFbJ2JhZHhpZHMnXSkKKyAgICAgICAgaWYgc2VuZHMgIT0gMDoKKyAgICAgICAgICAgIHByaW50ICcgIGF2ZXJhZ2UgYmFja2xvZyBxdWV1ZSBsZW5ndGg6ICVkJyAlIFwKKyAgICAgICAgICAgICAgICAoZmxvYXQoc2VsZi5fX3JwY19kYXRhWydiYWNrbG9ndXRpbCddKSAvIHNlbmRzKQorCisgICAgZGVmIGRpc3BsYXlfcnBjX29wX3N0YXRzKHNlbGYpOgorICAgICAgICAiIiJQcmV0dHktcHJpbnQgdGhlIHBlci1vcCBzdGF0cworICAgICAgICAiIiIKKyAgICAgICAgc2VuZHMgPSBzZWxmLl9fcnBjX2RhdGFbJ3JwY3NlbmRzJ10KKworICAgICAgICAjIFhYWDogdGhlc2Ugc2hvdWxkIGJlIHNvcnRlZCBieSAnY291bnQnCisgICAgICAgIHByaW50CisgICAgICAgIGZvciBvcCBpbiBzZWxmLl9fcnBjX2RhdGFbJ29wcyddOgorICAgICAgICAgICAgc3RhdHMgPSBzZWxmLl9fcnBjX2RhdGFbb3BdCisgICAgICAgICAgICBjb3VudCA9IHN0YXRzWzBdCisgICAgICAgICAgICByZXRyYW5zID0gc3RhdHNbMV0gLSBjb3VudAorICAgICAgICAgICAgaWYgY291bnQgIT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCAnJXM6JyAlIG9wCisgICAgICAgICAgICAgICAgcHJpbnQgJ1x0JWQgb3BzICglZCUlKScgJSBcCisgICAgICAgICAgICAgICAgICAgIChjb3VudCwgKChjb3VudCAqIDEwMCkgLyBzZW5kcykpLAorICAgICAgICAgICAgICAgIHByaW50ICdcdCVkIHJldHJhbnMgKCVkJSUpJyAlIChyZXRyYW5zLCAoKHJldHJhbnMgKiAxMDApIC8gY291bnQpKSwKKyAgICAgICAgICAgICAgICBwcmludCAnXHQlZCBtYWpvciB0aW1lb3V0cycgJSBzdGF0c1syXQorICAgICAgICAgICAgICAgIHByaW50ICdcdGF2ZyBieXRlcyBzZW50IHBlciBvcDogJWRcdGF2ZyBieXRlcyByZWNlaXZlZCBwZXIgb3A6ICVkJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgKHN0YXRzWzNdIC8gY291bnQsIHN0YXRzWzRdIC8gY291bnQpCisgICAgICAgICAgICAgICAgcHJpbnQgJ1x0YmFja2xvZyB3YWl0OiAlZicgJSAoZmxvYXQoc3RhdHNbNV0pIC8gY291bnQpLAorICAgICAgICAgICAgICAgIHByaW50ICdcdFJUVDogJWYnICUgKGZsb2F0KHN0YXRzWzZdKSAvIGNvdW50KSwKKyAgICAgICAgICAgICAgICBwcmludCAnXHR0b3RhbCBleGVjdXRlIHRpbWU6ICVmIChtaWxsaXNlY29uZHMpJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KHN0YXRzWzddKSAvIGNvdW50KQorCisgICAgZGVmIGNvbXBhcmVfaW9zdGF0cyhzZWxmLCBvbGRfc3RhdHMpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc2V0cyBvZiBzdGF0cworICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gRGV2aWNlRGF0YSgpCisKKyAgICAgICAgIyBjb3B5IHNlbGYgaW50byByZXN1bHQKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX25mc19kYXRhLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgcmVzdWx0Ll9fbmZzX2RhdGFba2V5XSA9IHZhbHVlCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19ycGNfZGF0YS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHJlc3VsdC5fX3JwY19kYXRhW2tleV0gPSB2YWx1ZQorCisgICAgICAgICMgY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBvZiBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QKKyAgICAgICAgIyBub3RlIHRoZSBjb3B5IGxvb3AgYWJvdmUgZG9lcyBub3QgY29weSB0aGUgbGlzdHMsIGp1c3QKKyAgICAgICAgIyB0aGUgcmVmZXJlbmNlIHRvIHRoZW0uICBzbyB3ZSBidWlsZCBuZXcgbGlzdHMgaGVyZQorICAgICAgICAjIGZvciB0aGUgcmVzdWx0IG9iamVjdC4KKyAgICAgICAgZm9yIG9wIGluIHJlc3VsdC5fX3JwY19kYXRhWydvcHMnXToKKyAgICAgICAgICAgIHJlc3VsdC5fX3JwY19kYXRhW29wXSA9IG1hcChkaWZmZXJlbmNlLCBzZWxmLl9fcnBjX2RhdGFbb3BdLCBvbGRfc3RhdHMuX19ycGNfZGF0YVtvcF0pCisKKyAgICAgICAgIyB1cGRhdGUgdGhlIHJlbWFpbmluZyBrZXlzIHdlIGNhcmUgYWJvdXQKKyAgICAgICAgcmVzdWx0Ll9fcnBjX2RhdGFbJ3JwY3NlbmRzJ10gLT0gb2xkX3N0YXRzLl9fcnBjX2RhdGFbJ3JwY3NlbmRzJ10KKyAgICAgICAgcmVzdWx0Ll9fcnBjX2RhdGFbJ2JhY2tsb2d1dGlsJ10gLT0gb2xkX3N0YXRzLl9fcnBjX2RhdGFbJ2JhY2tsb2d1dGlsJ10KKyAgICAgICAgcmVzdWx0Ll9fbmZzX2RhdGFbJ3NlcnZlcnJlYWRieXRlcyddIC09IG9sZF9zdGF0cy5fX25mc19kYXRhWydzZXJ2ZXJyZWFkYnl0ZXMnXQorICAgICAgICByZXN1bHQuX19uZnNfZGF0YVsnc2VydmVyd3JpdGVieXRlcyddIC09IG9sZF9zdGF0cy5fX25mc19kYXRhWydzZXJ2ZXJ3cml0ZWJ5dGVzJ10KKworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZGlzcGxheV9pb3N0YXRzKHNlbGYsIHNhbXBsZV90aW1lKToKKyAgICAgICAgIiIiRGlzcGxheSBORlMgYW5kIFJQQyBzdGF0cyBpbiBhbiBpb3N0YXQtbGlrZSB3YXkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbmRzID0gZmxvYXQoc2VsZi5fX3JwY19kYXRhWydycGNzZW5kcyddKQorICAgICAgICBpZiBzYW1wbGVfdGltZSA9PSAwOgorICAgICAgICAgICAgc2FtcGxlX3RpbWUgPSBmbG9hdChzZWxmLl9fbmZzX2RhdGFbJ2FnZSddKQorCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICclcyBtb3VudGVkIG9uICVzOicgJSBcCisgICAgICAgICAgICAoc2VsZi5fX25mc19kYXRhWydleHBvcnQnXSwgc2VsZi5fX25mc19kYXRhWydtb3VudHBvaW50J10pCisKKyAgICAgICAgcHJpbnQgJ1x0b3Avc1x0cnBjIGJrbG9nJworICAgICAgICBwcmludCAnXHQlLjJmJyAlIChzZW5kcyAvIHNhbXBsZV90aW1lKSwgCisgICAgICAgIGlmIHNlbmRzICE9IDA6CisgICAgICAgICAgICBwcmludCAnXHQlLjJmJyAlIFwKKyAgICAgICAgICAgICAgICAoKGZsb2F0KHNlbGYuX19ycGNfZGF0YVsnYmFja2xvZ3V0aWwnXSkgLyBzZW5kcykgLyBzYW1wbGVfdGltZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdcdDAuMDAnCisKKyAgICAgICAgIyByZWFkczogIG9wcy9zLCBrQi9zLCBhdmcgcnR0LCBhbmQgYXZnIGV4ZQorICAgICAgICAjIFhYWDogaW5jbHVkZSBhdmcgeGZlciBzaXplIGFuZCByZXRyYW5zbWl0cz8KKyAgICAgICAgcmVhZF9ycGNfc3RhdHMgPSBzZWxmLl9fcnBjX2RhdGFbJ1JFQUQnXQorICAgICAgICBvcHMgPSBmbG9hdChyZWFkX3JwY19zdGF0c1swXSkKKyAgICAgICAga2lsb2J5dGVzID0gZmxvYXQoc2VsZi5fX25mc19kYXRhWydzZXJ2ZXJyZWFkYnl0ZXMnXSkgLyAxMDI0CisgICAgICAgIHJ0dCA9IGZsb2F0KHJlYWRfcnBjX3N0YXRzWzZdKQorICAgICAgICBleGUgPSBmbG9hdChyZWFkX3JwY19zdGF0c1s3XSkKKworICAgICAgICBwcmludCAnXHRyZWFkczpcdG9wcy9zXHRcdGtCL3NcdFx0YXZnIFJUVCAobXMpXHRhdmcgZXhlIChtcyknCisgICAgICAgIHByaW50ICdcdFx0JS4yZicgJSAob3BzIC8gc2FtcGxlX3RpbWUpLAorICAgICAgICBwcmludCAnXHRcdCUuMmYnICUgKGtpbG9ieXRlcyAvIHNhbXBsZV90aW1lKSwKKyAgICAgICAgaWYgb3BzICE9IDA6CisgICAgICAgICAgICBwcmludCAnXHRcdCUuMmYnICUgKHJ0dCAvIG9wcyksCisgICAgICAgICAgICBwcmludCAnXHRcdCUuMmYnICUgKGV4ZSAvIG9wcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdcdFx0MC4wMCcsCisgICAgICAgICAgICBwcmludCAnXHRcdDAuMDAnCisKKyAgICAgICAgIyB3cml0ZXM6ICBvcHMvcywga0IvcywgYXZnIHJ0dCwgYW5kIGF2ZyBleGUKKyAgICAgICAgIyBYWFg6IGluY2x1ZGUgYXZnIHhmZXIgc2l6ZSBhbmQgcmV0cmFuc21pdHM/CisgICAgICAgIHdyaXRlX3JwY19zdGF0cyA9IHNlbGYuX19ycGNfZGF0YVsnV1JJVEUnXQorICAgICAgICBvcHMgPSBmbG9hdCh3cml0ZV9ycGNfc3RhdHNbMF0pCisgICAgICAgIGtpbG9ieXRlcyA9IGZsb2F0KHNlbGYuX19uZnNfZGF0YVsnc2VydmVyd3JpdGVieXRlcyddKSAvIDEwMjQKKyAgICAgICAgcnR0ID0gZmxvYXQod3JpdGVfcnBjX3N0YXRzWzZdKQorICAgICAgICBleGUgPSBmbG9hdCh3cml0ZV9ycGNfc3RhdHNbN10pCisKKyAgICAgICAgcHJpbnQgJ1x0d3JpdGVzOlx0b3BzL3NcdFx0a0Ivc1x0XHRhdmcgUlRUIChtcylcdGF2ZyBleGUgKG1zKScKKyAgICAgICAgcHJpbnQgJ1x0XHQlLjJmJyAlIChvcHMgLyBzYW1wbGVfdGltZSksCisgICAgICAgIHByaW50ICdcdFx0JS4yZicgJSAoa2lsb2J5dGVzIC8gc2FtcGxlX3RpbWUpLAorICAgICAgICBpZiBvcHMgIT0gMDoKKyAgICAgICAgICAgIHByaW50ICdcdFx0JS4yZicgJSAocnR0IC8gb3BzKSwKKyAgICAgICAgICAgIHByaW50ICdcdFx0JS4yZicgJSAoZXhlIC8gb3BzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJ1x0XHQwLjAwJywKKyAgICAgICAgICAgIHByaW50ICdcdFx0MC4wMCcKKworZGVmIHBhcnNlX3N0YXRzX2ZpbGUoZmlsZW5hbWUpOgorICAgICIiInBvcCB0aGUgY29udGVudHMgb2YgYSBtb3VudHN0YXRzIGZpbGUgaW50byBhIGRpY3Rpb25hcnksCisgICAga2V5ZWQgYnkgbW91bnQgcG9pbnQuICBlYWNoIHZhbHVlIG9iamVjdCBpcyBhIGxpc3Qgb2YgdGhlCisgICAgbGluZXMgaW4gdGhlIG1vdW50c3RhdHMgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb3VudAorICAgIHBvaW50IG5hbWVkIGluIHRoZSBrZXkuCisgICAgIiIiCisgICAgbXNfZGljdCA9IGRpY3QoKQorICAgIGtleSA9ICcnCisKKyAgICBmID0gZmlsZShmaWxlbmFtZSkKKyAgICBmb3IgbGluZSBpbiBmLnJlYWRsaW5lcygpOgorICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBsZW4od29yZHMpID09IDA6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiB3b3Jkc1swXSA9PSAnZGV2aWNlJzoKKyAgICAgICAgICAgIGtleSA9IHdvcmRzWzRdCisgICAgICAgICAgICBuZXcgPSBbIGxpbmUuc3RyaXAoKSBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXcgKz0gWyBsaW5lLnN0cmlwKCkgXQorICAgICAgICBtc19kaWN0W2tleV0gPSBuZXcKKyAgICBmLmNsb3NlCisKKyAgICByZXR1cm4gbXNfZGljdAorCitkZWYgcHJpbnRfbW91bnRzdGF0c19oZWxwKG5hbWUpOgorICAgIHByaW50ICd1c2FnZTogJXMgWyBvcHRpb25zIF0gPG1vdW50IHBvaW50PicgJSBuYW1lCisgICAgcHJpbnQKKyAgICBwcmludCAnIFZlcnNpb24gJXMnICUgTW91bnRzdGF0c192ZXJzaW9uCisgICAgcHJpbnQKKyAgICBwcmludCAnIERpc3BsYXkgTkZTIGNsaWVudCBwZXItbW91bnQgc3RhdGlzdGljcy4nCisgICAgcHJpbnQKKyAgICBwcmludCAnICAtLXZlcnNpb24gICAgZGlzcGxheSB0aGUgdmVyc2lvbiBvZiB0aGlzIGNvbW1hbmQnCisgICAgcHJpbnQgJyAgLS1uZnMgICAgICAgIGRpc3BsYXkgb25seSB0aGUgTkZTIHN0YXRpc3RpY3MnCisgICAgcHJpbnQgJyAgLS1ycGMgICAgICAgIGRpc3BsYXkgb25seSB0aGUgUlBDIHN0YXRpc3RpY3MnCisgICAgcHJpbnQgJyAgLS1zdGFydCAgICAgIHNhbXBsZSBhbmQgc2F2ZSBzdGF0aXN0aWNzJworICAgIHByaW50ICcgIC0tZW5kICAgICAgICByZXNhbXBsZSBzdGF0aXN0aWNzIGFuZCBjb21wYXJlIHRoZW0gd2l0aCBzYXZlZCcKKyAgICBwcmludAorCitkZWYgbW91bnRzdGF0c19jb21tYW5kKCk6CisgICAgIiIiTW91bnRzdGF0cyBjb21tYW5kCisgICAgIiIiCisgICAgbW91bnRwb2ludHMgPSBbXQorICAgIG5mc19vbmx5ID0gRmFsc2UKKyAgICBycGNfb25seSA9IEZhbHNlCisKKyAgICBmb3IgYXJnIGluIHN5cy5hcmd2OgorICAgICAgICBpZiBhcmcgaW4gWyctaCcsICctLWhlbHAnLCAnaGVscCcsICd1c2FnZSddOgorICAgICAgICAgICAgcHJpbnRfbW91bnRzdGF0c19oZWxwKHByb2cpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBhcmcgaW4gWyctdicsICctLXZlcnNpb24nLCAndmVyc2lvbiddOgorICAgICAgICAgICAgcHJpbnQgJyVzIHZlcnNpb24gJXMnICUgKHN5cy5hcmd2WzBdLCBNb3VudHN0YXRzX3ZlcnNpb24pCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgICAgIGlmIGFyZyBpbiBbJy1uJywgJy0tbmZzJ106CisgICAgICAgICAgICBuZnNfb25seSA9IFRydWUKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgYXJnIGluIFsnLXInLCAnLS1ycGMnXToKKyAgICAgICAgICAgIHJwY19vbmx5ID0gVHJ1ZQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBhcmcgaW4gWyctcycsICctLXN0YXJ0J106CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICdTYW1wbGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkJworCisgICAgICAgIGlmIGFyZyBpbiBbJy1lJywgJy0tZW5kJ106CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICdTYW1wbGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkJworCisgICAgICAgIGlmIGFyZyA9PSBzeXMuYXJndlswXToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgbW91bnRwb2ludHMgKz0gW2FyZ10KKworICAgIGlmIG1vdW50cG9pbnRzID09IFtdOgorICAgICAgICBwcmludF9tb3VudHN0YXRzX2hlbHAocHJvZykKKyAgICAgICAgcmV0dXJuCisKKyAgICBpZiBycGNfb25seSA9PSBUcnVlIGFuZCBuZnNfb25seSA9PSBUcnVlOgorICAgICAgICBwcmludF9tb3VudHN0YXRzX2hlbHAocHJvZykKKyAgICAgICAgcmV0dXJuCisKKyAgICBtb3VudHN0YXRzID0gcGFyc2Vfc3RhdHNfZmlsZSgnL3Byb2Mvc2VsZi9tb3VudHN0YXRzJykKKworICAgIGZvciBtcCBpbiBtb3VudHBvaW50czoKKyAgICAgICAgaWYgbXAgbm90IGluIG1vdW50c3RhdHM6CisgICAgICAgICAgICBwcmludCAnU3RhdGlzdGljcyBmb3IgbW91bnQgcG9pbnQgJXMgbm90IGZvdW5kJyAlIG1wCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHN0YXRzID0gRGV2aWNlRGF0YSgpCisgICAgICAgIHN0YXRzLnBhcnNlX3N0YXRzKG1vdW50c3RhdHNbbXBdKQorCisgICAgICAgIGlmIG5vdCBzdGF0cy5pc19uZnNfbW91bnRwb2ludCgpOgorICAgICAgICAgICAgcHJpbnQgJ01vdW50IHBvaW50ICVzIGV4aXN0cyBidXQgaXMgbm90IGFuIE5GUyBtb3VudCcgJSBtcAorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBuZnNfb25seToKKyAgICAgICAgICAgc3RhdHMuZGlzcGxheV9uZnNfb3B0aW9ucygpCisgICAgICAgICAgIHN0YXRzLmRpc3BsYXlfbmZzX2V2ZW50cygpCisgICAgICAgICAgIHN0YXRzLmRpc3BsYXlfbmZzX2J5dGVzKCkKKyAgICAgICAgZWxpZiBycGNfb25seToKKyAgICAgICAgICAgc3RhdHMuZGlzcGxheV9ycGNfZ2VuZXJpY19zdGF0cygpCisgICAgICAgICAgIHN0YXRzLmRpc3BsYXlfcnBjX29wX3N0YXRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgc3RhdHMuZGlzcGxheV9uZnNfb3B0aW9ucygpCisgICAgICAgICAgIHN0YXRzLmRpc3BsYXlfbmZzX2J5dGVzKCkKKyAgICAgICAgICAgc3RhdHMuZGlzcGxheV9ycGNfZ2VuZXJpY19zdGF0cygpCisgICAgICAgICAgIHN0YXRzLmRpc3BsYXlfcnBjX29wX3N0YXRzKCkKKworZGVmIHByaW50X25mc3N0YXRfaGVscChuYW1lKToKKyAgICBwcmludCAndXNhZ2U6ICVzIFsgb3B0aW9ucyBdJyAlIG5hbWUKKyAgICBwcmludAorICAgIHByaW50ICcgVmVyc2lvbiAlcycgJSBNb3VudHN0YXRzX3ZlcnNpb24KKyAgICBwcmludAorICAgIHByaW50ICcgbmZzc3RhdC1saWtlIHByb2dyYW0gdGhhdCB1c2VzIE5GUyBjbGllbnQgcGVyLW1vdW50IHN0YXRpc3RpY3MuJworICAgIHByaW50CisKK2RlZiBuZnNzdGF0X2NvbW1hbmQoKToKKyAgICBwcmludF9uZnNzdGF0X2hlbHAocHJvZykKKworZGVmIHByaW50X2lvc3RhdF9oZWxwKG5hbWUpOgorICAgIHByaW50ICd1c2FnZTogJXMgWyA8aW50ZXJ2YWw+IFsgPGNvdW50PiBdIF0gWyA8bW91bnQgcG9pbnQ+IF0gJyAlIG5hbWUKKyAgICBwcmludAorICAgIHByaW50ICcgVmVyc2lvbiAlcycgJSBNb3VudHN0YXRzX3ZlcnNpb24KKyAgICBwcmludAorICAgIHByaW50ICcgaW9zdGF0LWxpa2UgcHJvZ3JhbSB0byBkaXNwbGF5IE5GUyBjbGllbnQgcGVyLW1vdW50IHN0YXRpc3RpY3MuJworICAgIHByaW50CisgICAgcHJpbnQgJyBUaGUgPGludGVydmFsPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4nCisgICAgcHJpbnQgJyBlYWNoIHJlcG9ydC4gIFRoZSBmaXJzdCByZXBvcnQgY29udGFpbnMgc3RhdGlzdGljcyBmb3IgdGhlIHRpbWUgc2luY2UgZWFjaCcKKyAgICBwcmludCAnIGZpbGUgc3lzdGVtIHdhcyBtb3VudGVkLiAgRWFjaCBzdWJzZXF1ZW50IHJlcG9ydCBjb250YWlucyBzdGF0aXN0aWNzJworICAgIHByaW50ICcgY29sbGVjdGVkIGR1cmluZyB0aGUgaW50ZXJ2YWwgc2luY2UgdGhlIHByZXZpb3VzIHJlcG9ydC4nCisgICAgcHJpbnQKKyAgICBwcmludCAnIElmIHRoZSA8Y291bnQ+IHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBvZiA8Y291bnQ+IGRldGVybWluZXMgdGhlJworICAgIHByaW50ICcgbnVtYmVyIG9mIHJlcG9ydHMgZ2VuZXJhdGVkIGF0IDxpbnRlcnZhbD4gc2Vjb25kcyBhcGFydC4gIElmIHRoZSBpbnRlcnZhbCcKKyAgICBwcmludCAnIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgd2l0aG91dCB0aGUgPGNvdW50PiBwYXJhbWV0ZXIsIHRoZSBjb21tYW5kIGdlbmVyYXRlcycKKyAgICBwcmludCAnIHJlcG9ydHMgY29udGludW91c2x5LicKKyAgICBwcmludAorICAgIHByaW50ICcgSWYgb25lIG9yIG1vcmUgPG1vdW50IHBvaW50PiBuYW1lcyBhcmUgc3BlY2lmaWVkLCBzdGF0aXN0aWNzIGZvciBvbmx5IHRoZXNlJworICAgIHByaW50ICcgbW91bnQgcG9pbnRzIHdpbGwgYmUgZGlzcGxheWVkLiAgT3RoZXJ3aXNlLCBhbGwgTkZTIG1vdW50IHBvaW50cyBvbiB0aGUnCisgICAgcHJpbnQgJyBjbGllbnQgYXJlIGxpc3RlZC4nCisgICAgcHJpbnQKKworZGVmIHByaW50X2lvc3RhdF9zdW1tYXJ5KG9sZCwgbmV3LCBkZXZpY2VzLCB0aW1lKToKKyAgICBmb3IgZGV2aWNlIGluIGRldmljZXM6CisgICAgICAgIHN0YXRzID0gRGV2aWNlRGF0YSgpCisgICAgICAgIHN0YXRzLnBhcnNlX3N0YXRzKG5ld1tkZXZpY2VdKQorICAgICAgICBpZiBub3Qgb2xkOgorICAgICAgICAgICAgc3RhdHMuZGlzcGxheV9pb3N0YXRzKHRpbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvbGRfc3RhdHMgPSBEZXZpY2VEYXRhKCkKKyAgICAgICAgICAgIG9sZF9zdGF0cy5wYXJzZV9zdGF0cyhvbGRbZGV2aWNlXSkKKyAgICAgICAgICAgIGRpZmZfc3RhdHMgPSBzdGF0cy5jb21wYXJlX2lvc3RhdHMob2xkX3N0YXRzKQorICAgICAgICAgICAgZGlmZl9zdGF0cy5kaXNwbGF5X2lvc3RhdHModGltZSkKKworZGVmIGlvc3RhdF9jb21tYW5kKCk6CisgICAgIiIiaW9zdGF0LWxpa2UgY29tbWFuZCBmb3IgTkZTIG1vdW50IHBvaW50cworICAgICIiIgorICAgIG1vdW50c3RhdHMgPSBwYXJzZV9zdGF0c19maWxlKCcvcHJvYy9zZWxmL21vdW50c3RhdHMnKQorICAgIGRldmljZXMgPSBbXQorICAgIGludGVydmFsX3NlZW4gPSBGYWxzZQorICAgIGNvdW50X3NlZW4gPSBGYWxzZQorCisgICAgZm9yIGFyZyBpbiBzeXMuYXJndjoKKyAgICAgICAgaWYgYXJnIGluIFsnLWgnLCAnLS1oZWxwJywgJ2hlbHAnLCAndXNhZ2UnXToKKyAgICAgICAgICAgIHByaW50X2lvc3RhdF9oZWxwKHByb2cpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBhcmcgaW4gWyctdicsICctLXZlcnNpb24nLCAndmVyc2lvbiddOgorICAgICAgICAgICAgcHJpbnQgJyVzIHZlcnNpb24gJXMnICUgKHN5cy5hcmd2WzBdLCBNb3VudHN0YXRzX3ZlcnNpb24pCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBhcmcgPT0gc3lzLmFyZ3ZbMF06CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIGFyZyBpbiBtb3VudHN0YXRzOgorICAgICAgICAgICAgZGV2aWNlcyArPSBbYXJnXQorICAgICAgICBlbGlmIG5vdCBpbnRlcnZhbF9zZWVuOgorICAgICAgICAgICAgaW50ZXJ2YWwgPSBpbnQoYXJnKQorICAgICAgICAgICAgaWYgaW50ZXJ2YWwgPiAwOgorICAgICAgICAgICAgICAgIGludGVydmFsX3NlZW4gPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICdJbGxlZ2FsIDxpbnRlcnZhbD4gdmFsdWUnCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgbm90IGNvdW50X3NlZW46CisgICAgICAgICAgICBjb3VudCA9IGludChhcmcpCisgICAgICAgICAgICBpZiBjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgY291bnRfc2VlbiA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0lsbGVnYWwgPGNvdW50PiB2YWx1ZScKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICMgbWFrZSBjZXJ0YWluIGRldmljZXMgY29udGFpbnMgb25seSBORlMgbW91bnQgcG9pbnRzCisgICAgaWYgbGVuKGRldmljZXMpID4gMDoKKyAgICAgICAgY2hlY2sgPSBbXQorICAgICAgICBmb3IgZGV2aWNlIGluIGRldmljZXM6CisgICAgICAgICAgICBzdGF0cyA9IERldmljZURhdGEoKQorICAgICAgICAgICAgc3RhdHMucGFyc2Vfc3RhdHMobW91bnRzdGF0c1tkZXZpY2VdKQorICAgICAgICAgICAgaWYgc3RhdHMuaXNfbmZzX21vdW50cG9pbnQoKToKKyAgICAgICAgICAgICAgICBjaGVjayArPSBbZGV2aWNlXQorICAgICAgICBkZXZpY2VzID0gY2hlY2sKKyAgICBlbHNlOgorICAgICAgICBmb3IgZGV2aWNlLCBkZXNjciBpbiBtb3VudHN0YXRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc3RhdHMgPSBEZXZpY2VEYXRhKCkKKyAgICAgICAgICAgIHN0YXRzLnBhcnNlX3N0YXRzKGRlc2NyKQorICAgICAgICAgICAgaWYgc3RhdHMuaXNfbmZzX21vdW50cG9pbnQoKToKKyAgICAgICAgICAgICAgICBkZXZpY2VzICs9IFtkZXZpY2VdCisgICAgaWYgbGVuKGRldmljZXMpID09IDA6CisgICAgICAgIHByaW50ICdObyBORlMgbW91bnQgcG9pbnRzIHdlcmUgZm91bmQnCisgICAgICAgIHJldHVybgorCisgICAgb2xkX21vdW50c3RhdHMgPSBOb25lCisgICAgc2FtcGxlX3RpbWUgPSAwCisKKyAgICBpZiBub3QgaW50ZXJ2YWxfc2VlbjoKKyAgICAgICAgcHJpbnRfaW9zdGF0X3N1bW1hcnkob2xkX21vdW50c3RhdHMsIG1vdW50c3RhdHMsIGRldmljZXMsIHNhbXBsZV90aW1lKQorICAgICAgICByZXR1cm4KKworICAgIGlmIGNvdW50X3NlZW46CisgICAgICAgIHdoaWxlIGNvdW50ICE9IDA6CisgICAgICAgICAgICBwcmludF9pb3N0YXRfc3VtbWFyeShvbGRfbW91bnRzdGF0cywgbW91bnRzdGF0cywgZGV2aWNlcywgc2FtcGxlX3RpbWUpCisgICAgICAgICAgICBvbGRfbW91bnRzdGF0cyA9IG1vdW50c3RhdHMKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCisgICAgICAgICAgICBzYW1wbGVfdGltZSA9IGludGVydmFsCisgICAgICAgICAgICBtb3VudHN0YXRzID0gcGFyc2Vfc3RhdHNfZmlsZSgnL3Byb2Mvc2VsZi9tb3VudHN0YXRzJykKKyAgICAgICAgICAgIGNvdW50IC09IDEKKyAgICBlbHNlOiAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHByaW50X2lvc3RhdF9zdW1tYXJ5KG9sZF9tb3VudHN0YXRzLCBtb3VudHN0YXRzLCBkZXZpY2VzLCBzYW1wbGVfdGltZSkKKyAgICAgICAgICAgIG9sZF9tb3VudHN0YXRzID0gbW91bnRzdGF0cworICAgICAgICAgICAgdGltZS5zbGVlcChpbnRlcnZhbCkKKyAgICAgICAgICAgIHNhbXBsZV90aW1lID0gaW50ZXJ2YWwKKyAgICAgICAgICAgIG1vdW50c3RhdHMgPSBwYXJzZV9zdGF0c19maWxlKCcvcHJvYy9zZWxmL21vdW50c3RhdHMnKQorCisjCisjIE1haW4KKyMKK3Byb2cgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorCit0cnk6CisgICAgaWYgcHJvZyA9PSAnbW91bnRzdGF0cyc6CisgICAgICAgIG1vdW50c3RhdHNfY29tbWFuZCgpCisgICAgZWxpZiBwcm9nID09ICdtcy1uZnNzdGF0JzoKKyAgICAgICAgbmZzc3RhdF9jb21tYW5kKCkKKyAgICBlbGlmIHByb2cgPT0gJ21zLWlvc3RhdCc6CisgICAgICAgIGlvc3RhdF9jb21tYW5kKCkKK2V4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICBwcmludCAnQ2F1Z2h0IF5DLi4uIGV4aXRpbmcnCisgICAgc3lzLmV4aXQoMSkKKworc3lzLmV4aXQoMCkKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9uZnMtaW9zdGF0L25mcy1pb3N0YXQucHkgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmZzLWlvc3RhdC9uZnMtaW9zdGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGIxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmZzLWlvc3RhdC9uZnMtaW9zdGF0LnB5CkBAIC0wLDAgKzEsNjMzIEBACisjIS91c3IvYmluL3B5dGhvbgorIyAtKi0gcHl0aG9uLW1vZGUgLSotCisiIiJFbXVsYXRlIGlvc3RhdCBmb3IgTkZTIG1vdW50IHBvaW50cyB1c2luZyAvcHJvYy9zZWxmL21vdW50c3RhdHMKKyIiIgorCitfX2NvcHlyaWdodF9fID0gIiIiCitDb3B5cmlnaHQgKEMpIDIwMDUsIENodWNrIExldmVyIDxjZWxAbmV0YXBwLmNvbT4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCitwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorIiIiCisKK2ltcG9ydCBzeXMsIG9zLCB0aW1lCitmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIsIE9wdGlvbkdyb3VwCisKK0lvc3RhdHNfdmVyc2lvbiA9ICcwLjInCisKK2RlZiBkaWZmZXJlbmNlKHgsIHkpOgorICAgICIiIlVzZWQgZm9yIGEgbWFwKCkgZnVuY3Rpb24KKyAgICAiIiIKKyAgICByZXR1cm4geCAtIHkKKworTmZzRXZlbnRDb3VudGVycyA9IFsKKyAgICAnaW5vZGVyZXZhbGlkYXRlcycsCisgICAgJ2RlbnRyeXJldmFsaWRhdGVzJywKKyAgICAnZGF0YWludmFsaWRhdGVzJywKKyAgICAnYXR0cmludmFsaWRhdGVzJywKKyAgICAndmZzb3BlbicsCisgICAgJ3Zmc2xvb2t1cCcsCisgICAgJ3Zmc3Blcm1pc3Npb24nLAorICAgICd2ZnN1cGRhdGVwYWdlJywKKyAgICAndmZzcmVhZHBhZ2UnLAorICAgICd2ZnNyZWFkcGFnZXMnLAorICAgICd2ZnN3cml0ZXBhZ2UnLAorICAgICd2ZnN3cml0ZXBhZ2VzJywKKyAgICAndmZzcmVhZGRpcicsCisgICAgJ3Zmc3NldGF0dHInLAorICAgICd2ZnNmbHVzaCcsCisgICAgJ3Zmc2ZzeW5jJywKKyAgICAndmZzbG9jaycsCisgICAgJ3Zmc3JlbGVhc2UnLAorICAgICdjb25nZXN0aW9ud2FpdCcsCisgICAgJ3NldGF0dHJ0cnVuYycsCisgICAgJ2V4dGVuZHdyaXRlJywKKyAgICAnc2lsbHlyZW5hbWVzJywKKyAgICAnc2hvcnRyZWFkcycsCisgICAgJ3Nob3J0d3JpdGVzJywKKyAgICAnZGVsYXknCitdCisKK05mc0J5dGVDb3VudGVycyA9IFsKKyAgICAnbm9ybWFscmVhZGJ5dGVzJywKKyAgICAnbm9ybWFsd3JpdGVieXRlcycsCisgICAgJ2RpcmVjdHJlYWRieXRlcycsCisgICAgJ2RpcmVjdHdyaXRlYnl0ZXMnLAorICAgICdzZXJ2ZXJyZWFkYnl0ZXMnLAorICAgICdzZXJ2ZXJ3cml0ZWJ5dGVzJywKKyAgICAncmVhZHBhZ2VzJywKKyAgICAnd3JpdGVwYWdlcycKK10KKworY2xhc3MgRGV2aWNlRGF0YToKKyAgICAiIiJEZXZpY2VEYXRhIG9iamVjdHMgcHJvdmlkZSBtZXRob2RzIGZvciBwYXJzaW5nIGFuZCBkaXNwbGF5aW5nCisgICAgZGF0YSBmb3IgYSBzaW5nbGUgbW91bnQgZ3JhYmJlZCBmcm9tIC9wcm9jL3NlbGYvbW91bnRzdGF0cworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fX25mc19kYXRhID0gZGljdCgpCisgICAgICAgIHNlbGYuX19ycGNfZGF0YSA9IGRpY3QoKQorICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ29wcyddID0gW10KKworICAgIGRlZiBfX3BhcnNlX25mc19saW5lKHNlbGYsIHdvcmRzKToKKyAgICAgICAgaWYgd29yZHNbMF0gPT0gJ2RldmljZSc6CisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ2V4cG9ydCddID0gd29yZHNbMV0KKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnbW91bnRwb2ludCddID0gd29yZHNbNF0KKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnZnN0eXBlJ10gPSB3b3Jkc1s3XQorICAgICAgICAgICAgaWYgd29yZHNbN10gPT0gJ25mcyc6CisgICAgICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydzdGF0dmVycyddID0gd29yZHNbOF0KKyAgICAgICAgZWxpZiB3b3Jkc1swXSA9PSAnYWdlOic6CisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ2FnZSddID0gbG9uZyh3b3Jkc1sxXSkKKyAgICAgICAgZWxpZiB3b3Jkc1swXSA9PSAnb3B0czonOgorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydtb3VudG9wdGlvbnMnXSA9ICcnLmpvaW4od29yZHNbMTpdKS5zcGxpdCgnLCcpCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ2NhcHM6JzoKKyAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsnc2VydmVyY2FwYWJpbGl0aWVzJ10gPSAnJy5qb2luKHdvcmRzWzE6XSkuc3BsaXQoJywnKQorICAgICAgICBlbGlmIHdvcmRzWzBdID09ICduZnN2NDonOgorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWyduZnN2NGZsYWdzJ10gPSAnJy5qb2luKHdvcmRzWzE6XSkuc3BsaXQoJywnKQorICAgICAgICBlbGlmIHdvcmRzWzBdID09ICdzZWM6JzoKKyAgICAgICAgICAgIGtleXMgPSAnJy5qb2luKHdvcmRzWzE6XSkuc3BsaXQoJywnKQorICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhWydmbGF2b3InXSA9IGludChrZXlzWzBdLnNwbGl0KCc9JylbMV0pCisgICAgICAgICAgICBzZWxmLl9fbmZzX2RhdGFbJ3BzZXVkb2ZsYXZvciddID0gMAorICAgICAgICAgICAgaWYgc2VsZi5fX25mc19kYXRhWydmbGF2b3InXSA9PSA2OgorICAgICAgICAgICAgICAgIHNlbGYuX19uZnNfZGF0YVsncHNldWRvZmxhdm9yJ10gPSBpbnQoa2V5c1sxXS5zcGxpdCgnPScpWzFdKQorICAgICAgICBlbGlmIHdvcmRzWzBdID09ICdldmVudHM6JzoKKyAgICAgICAgICAgIGkgPSAxCisgICAgICAgICAgICBmb3Iga2V5IGluIE5mc0V2ZW50Q291bnRlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhW2tleV0gPSBpbnQod29yZHNbaV0pCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ2J5dGVzOic6CisgICAgICAgICAgICBpID0gMQorICAgICAgICAgICAgZm9yIGtleSBpbiBOZnNCeXRlQ291bnRlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5fX25mc19kYXRhW2tleV0gPSBsb25nKHdvcmRzW2ldKQorICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgZGVmIF9fcGFyc2VfcnBjX2xpbmUoc2VsZiwgd29yZHMpOgorICAgICAgICBpZiB3b3Jkc1swXSA9PSAnUlBDJzoKKyAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnc3RhdHN2ZXJzJ10gPSBmbG9hdCh3b3Jkc1szXSkKKyAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncHJvZ3JhbXZlcnNpb24nXSA9IHdvcmRzWzVdCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ3hwcnQ6JzoKKyAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncHJvdG9jb2wnXSA9IHdvcmRzWzFdCisgICAgICAgICAgICBpZiB3b3Jkc1sxXSA9PSAndWRwJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3BvcnQnXSA9IGludCh3b3Jkc1syXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JpbmRfY291bnQnXSA9IGludCh3b3Jkc1szXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3JwY3NlbmRzJ10gPSBpbnQod29yZHNbNF0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydycGNyZWNlaXZlcyddID0gaW50KHdvcmRzWzVdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnYmFkeGlkcyddID0gaW50KHdvcmRzWzZdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnaW5mbGlnaHRzZW5kcyddID0gbG9uZyh3b3Jkc1s3XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JhY2tsb2d1dGlsJ10gPSBsb25nKHdvcmRzWzhdKQorICAgICAgICAgICAgZWxpZiB3b3Jkc1sxXSA9PSAndGNwJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3BvcnQnXSA9IHdvcmRzWzJdCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiaW5kX2NvdW50J10gPSBpbnQod29yZHNbM10pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydjb25uZWN0X2NvdW50J10gPSBpbnQod29yZHNbNF0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydjb25uZWN0X3RpbWUnXSA9IGludCh3b3Jkc1s1XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2lkbGVfdGltZSddID0gaW50KHdvcmRzWzZdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncnBjc2VuZHMnXSA9IGludCh3b3Jkc1s3XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3JwY3JlY2VpdmVzJ10gPSBpbnQod29yZHNbOF0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiYWR4aWRzJ10gPSBpbnQod29yZHNbOV0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydpbmZsaWdodHNlbmRzJ10gPSBsb25nKHdvcmRzWzEwXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JhY2tsb2d1dGlsJ10gPSBsb25nKHdvcmRzWzExXSkKKyAgICAgICAgICAgIGVsaWYgd29yZHNbMV0gPT0gJ3JkbWEnOgorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncG9ydCddID0gd29yZHNbMl0KKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JpbmRfY291bnQnXSA9IGludCh3b3Jkc1szXSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2Nvbm5lY3RfY291bnQnXSA9IGludCh3b3Jkc1s0XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2Nvbm5lY3RfdGltZSddID0gaW50KHdvcmRzWzVdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnaWRsZV90aW1lJ10gPSBpbnQod29yZHNbNl0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydycGNzZW5kcyddID0gaW50KHdvcmRzWzddKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncnBjcmVjZWl2ZXMnXSA9IGludCh3b3Jkc1s4XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JhZHhpZHMnXSA9IGludCh3b3Jkc1s5XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ2JhY2tsb2d1dGlsJ10gPSBpbnQod29yZHNbMTBdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncmVhZF9jaHVua3MnXSA9IGludCh3b3Jkc1sxMV0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWyd3cml0ZV9jaHVua3MnXSA9IGludCh3b3Jkc1sxMl0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydyZXBseV9jaHVua3MnXSA9IGludCh3b3Jkc1sxM10pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWyd0b3RhbF9yZG1hX3JlcSddID0gaW50KHdvcmRzWzE0XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3RvdGFsX3JkbWFfcmVwJ10gPSBpbnQod29yZHNbMTVdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsncHVsbHVwJ10gPSBpbnQod29yZHNbMTZdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnZml4dXAnXSA9IGludCh3b3Jkc1sxN10pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydoYXJkd2F5J10gPSBpbnQod29yZHNbMThdKQorICAgICAgICAgICAgICAgIHNlbGYuX19ycGNfZGF0YVsnZmFpbGVkX21hcnNoYWwnXSA9IGludCh3b3Jkc1sxOV0pCisgICAgICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydiYWRfcmVwbHknXSA9IGludCh3b3Jkc1syMF0pCisgICAgICAgIGVsaWYgd29yZHNbMF0gPT0gJ3Blci1vcCc6CisgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbJ3Blci1vcCddID0gd29yZHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wID0gd29yZHNbMF1bOi0xXQorICAgICAgICAgICAgc2VsZi5fX3JwY19kYXRhWydvcHMnXSArPSBbb3BdCisgICAgICAgICAgICBzZWxmLl9fcnBjX2RhdGFbb3BdID0gW2xvbmcod29yZCkgZm9yIHdvcmQgaW4gd29yZHNbMTpdXQorCisgICAgZGVmIHBhcnNlX3N0YXRzKHNlbGYsIGxpbmVzKToKKyAgICAgICAgIiIiVHVybiBhIGxpc3Qgb2YgbGluZXMgZnJvbSBhIG1vdW50IHN0YXQgZmlsZSBpbnRvIGEgCisgICAgICAgIGRpY3Rpb25hcnkgZnVsbCBvZiBzdGF0cywga2V5ZWQgYnkgbmFtZQorICAgICAgICAiIiIKKyAgICAgICAgZm91bmQgPSBGYWxzZQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICBpZiBsZW4od29yZHMpID09IDA6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIChub3QgZm91bmQgYW5kIHdvcmRzWzBdICE9ICdSUEMnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fcGFyc2VfbmZzX2xpbmUod29yZHMpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLl9fcGFyc2VfcnBjX2xpbmUod29yZHMpCisKKyAgICBkZWYgaXNfbmZzX21vdW50cG9pbnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoaXMgaXMgYW4gTkZTIG9yIE5GU3Y0IG1vdW50cG9pbnQsCisgICAgICAgIG90aGVyd2lzZSByZXR1cm4gRmFsc2UKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX19uZnNfZGF0YVsnZnN0eXBlJ10gPT0gJ25mcyc6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbGlmIHNlbGYuX19uZnNfZGF0YVsnZnN0eXBlJ10gPT0gJ25mczQnOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgY29tcGFyZV9pb3N0YXRzKHNlbGYsIG9sZF9zdGF0cyk6CisgICAgICAgICIiIlJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzZXRzIG9mIHN0YXRzCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBEZXZpY2VEYXRhKCkKKworICAgICAgICAjIGNvcHkgc2VsZiBpbnRvIHJlc3VsdAorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fbmZzX2RhdGEuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICByZXN1bHQuX19uZnNfZGF0YVtrZXldID0gdmFsdWUKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX3JwY19kYXRhLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgcmVzdWx0Ll9fcnBjX2RhdGFba2V5XSA9IHZhbHVlCisKKyAgICAgICAgIyBjb21wdXRlIHRoZSBkaWZmZXJlbmNlIG9mIGVhY2ggaXRlbSBpbiB0aGUgbGlzdAorICAgICAgICAjIG5vdGUgdGhlIGNvcHkgbG9vcCBhYm92ZSBkb2VzIG5vdCBjb3B5IHRoZSBsaXN0cywganVzdAorICAgICAgICAjIHRoZSByZWZlcmVuY2UgdG8gdGhlbS4gIHNvIHdlIGJ1aWxkIG5ldyBsaXN0cyBoZXJlCisgICAgICAgICMgZm9yIHRoZSByZXN1bHQgb2JqZWN0LgorICAgICAgICBmb3Igb3AgaW4gcmVzdWx0Ll9fcnBjX2RhdGFbJ29wcyddOgorICAgICAgICAgICAgcmVzdWx0Ll9fcnBjX2RhdGFbb3BdID0gbWFwKGRpZmZlcmVuY2UsIHNlbGYuX19ycGNfZGF0YVtvcF0sIG9sZF9zdGF0cy5fX3JwY19kYXRhW29wXSkKKworICAgICAgICAjIHVwZGF0ZSB0aGUgcmVtYWluaW5nIGtleXMgd2UgY2FyZSBhYm91dAorICAgICAgICByZXN1bHQuX19ycGNfZGF0YVsncnBjc2VuZHMnXSAtPSBvbGRfc3RhdHMuX19ycGNfZGF0YVsncnBjc2VuZHMnXQorICAgICAgICByZXN1bHQuX19ycGNfZGF0YVsnYmFja2xvZ3V0aWwnXSAtPSBvbGRfc3RhdHMuX19ycGNfZGF0YVsnYmFja2xvZ3V0aWwnXQorCisgICAgICAgIGZvciBrZXkgaW4gTmZzRXZlbnRDb3VudGVyczoKKyAgICAgICAgICAgIHJlc3VsdC5fX25mc19kYXRhW2tleV0gLT0gb2xkX3N0YXRzLl9fbmZzX2RhdGFba2V5XQorICAgICAgICBmb3Iga2V5IGluIE5mc0J5dGVDb3VudGVyczoKKyAgICAgICAgICAgIHJlc3VsdC5fX25mc19kYXRhW2tleV0gLT0gb2xkX3N0YXRzLl9fbmZzX2RhdGFba2V5XQorCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX3ByaW50X2RhdGFfY2FjaGVfc3RhdHMoc2VsZik6CisgICAgICAgICIiIlByaW50IHRoZSBkYXRhIGNhY2hlIGhpdCByYXRlCisgICAgICAgICIiIgorICAgICAgICBuZnNfc3RhdHMgPSBzZWxmLl9fbmZzX2RhdGEKKyAgICAgICAgYXBwX2J5dGVzX3JlYWQgPSBmbG9hdChuZnNfc3RhdHNbJ25vcm1hbHJlYWRieXRlcyddKQorICAgICAgICBpZiBhcHBfYnl0ZXNfcmVhZCAhPSAwOgorICAgICAgICAgICAgY2xpZW50X2J5dGVzX3JlYWQgPSBmbG9hdChuZnNfc3RhdHNbJ3NlcnZlcnJlYWRieXRlcyddIC0gbmZzX3N0YXRzWydkaXJlY3RyZWFkYnl0ZXMnXSkKKyAgICAgICAgICAgIHJhdGlvID0gKChhcHBfYnl0ZXNfcmVhZCAtIGNsaWVudF9ieXRlc19yZWFkKSAqIDEwMCkgLyBhcHBfYnl0ZXNfcmVhZAorCisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgJ2FwcCBieXRlczogJWYgIGNsaWVudCBieXRlcyAlZicgJSAoYXBwX2J5dGVzX3JlYWQsIGNsaWVudF9ieXRlc19yZWFkKQorICAgICAgICAgICAgcHJpbnQgJ0RhdGEgY2FjaGUgaGl0IHJhdGlvOiAlNC4yZiUlJyAlIHJhdGlvCisKKyAgICBkZWYgX19wcmludF9hdHRyX2NhY2hlX3N0YXRzKHNlbGYsIHNhbXBsZV90aW1lKToKKyAgICAgICAgIiIiUHJpbnQgYXR0cmlidXRlIGNhY2hlIGVmZmljaWVuY3kgc3RhdHMKKyAgICAgICAgIiIiCisgICAgICAgIG5mc19zdGF0cyA9IHNlbGYuX19uZnNfZGF0YQorICAgICAgICBnZXRhdHRyX3N0YXRzID0gc2VsZi5fX3JwY19kYXRhWydHRVRBVFRSJ10KKworICAgICAgICBpZiBuZnNfc3RhdHNbJ2lub2RlcmV2YWxpZGF0ZXMnXSAhPSAwOgorICAgICAgICAgICAgZ2V0YXR0cl9vcHMgPSBmbG9hdChnZXRhdHRyX3N0YXRzWzFdKQorICAgICAgICAgICAgb3BlbnMgPSBmbG9hdChuZnNfc3RhdHNbJ3Zmc29wZW4nXSkKKyAgICAgICAgICAgIHJldmFsaWRhdGVzID0gZmxvYXQobmZzX3N0YXRzWydpbm9kZXJldmFsaWRhdGVzJ10pIC0gb3BlbnMKKyAgICAgICAgICAgIGlmIHJldmFsaWRhdGVzICE9IDA6CisgICAgICAgICAgICAgICAgcmF0aW8gPSAoKHJldmFsaWRhdGVzIC0gZ2V0YXR0cl9vcHMpICogMTAwKSAvIHJldmFsaWRhdGVzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhdGlvID0gMC4wCisKKyAgICAgICAgICAgIGRhdGFfaW52YWxpZGF0ZXMgPSBmbG9hdChuZnNfc3RhdHNbJ2RhdGFpbnZhbGlkYXRlcyddKQorICAgICAgICAgICAgYXR0cl9pbnZhbGlkYXRlcyA9IGZsb2F0KG5mc19zdGF0c1snYXR0cmludmFsaWRhdGVzJ10pCisKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAnJWQgaW5vZGUgcmV2YWxpZGF0aW9ucywgaGl0dGluZyBpbiBjYWNoZSAlNC4yZiUlIG9mIHRoZSB0aW1lJyAlIFwKKyAgICAgICAgICAgICAgICAocmV2YWxpZGF0ZXMsIHJhdGlvKQorICAgICAgICAgICAgcHJpbnQgJyVkIG9wZW4gb3BlcmF0aW9ucyAobWFuZGF0b3J5IEdFVEFUVFIgcmVxdWVzdHMpJyAlIG9wZW5zCisgICAgICAgICAgICBpZiBnZXRhdHRyX29wcyAhPSAwOgorICAgICAgICAgICAgICAgIHByaW50ICclNC4yZiUlIG9mIEdFVEFUVFJzIHJlc3VsdGVkIGluIGRhdGEgY2FjaGUgaW52YWxpZGF0aW9ucycgJSBcCisgICAgICAgICAgICAgICAgICAgKChkYXRhX2ludmFsaWRhdGVzICogMTAwKSAvIGdldGF0dHJfb3BzKQorCisgICAgZGVmIF9fcHJpbnRfZGlyX2NhY2hlX3N0YXRzKHNlbGYsIHNhbXBsZV90aW1lKToKKyAgICAgICAgIiIiUHJpbnQgZGlyZWN0b3J5IHN0YXRzCisgICAgICAgICIiIgorICAgICAgICBuZnNfc3RhdHMgPSBzZWxmLl9fbmZzX2RhdGEKKyAgICAgICAgbG9va3VwX29wcyA9IHNlbGYuX19ycGNfZGF0YVsnTE9PS1VQJ11bMF0KKyAgICAgICAgcmVhZGRpcl9vcHMgPSBzZWxmLl9fcnBjX2RhdGFbJ1JFQURESVInXVswXQorICAgICAgICBpZiBzZWxmLl9fcnBjX2RhdGEuaGFzX2tleSgnUkVBRERJUlBMVVMnKToKKyAgICAgICAgICAgIHJlYWRkaXJfb3BzICs9IHNlbGYuX19ycGNfZGF0YVsnUkVBRERJUlBMVVMnXVswXQorCisgICAgICAgIGRlbnRyeV9yZXZhbHMgPSBuZnNfc3RhdHNbJ2RlbnRyeXJldmFsaWRhdGVzJ10KKyAgICAgICAgb3BlbnMgPSBuZnNfc3RhdHNbJ3Zmc29wZW4nXQorICAgICAgICBsb29rdXBzID0gbmZzX3N0YXRzWyd2ZnNsb29rdXAnXQorICAgICAgICBnZXRkZW50cyA9IG5mc19zdGF0c1sndmZzcmVhZGRpciddCisKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJyVkIG9wZW4gb3BlcmF0aW9ucyAocGF0aG5hbWUgbG9va3VwcyknICUgb3BlbnMKKyAgICAgICAgcHJpbnQgJyVkIGRlbnRyeSByZXZhbGlkYXRlcyBhbmQgJWQgdmZzIGxvb2t1cCByZXF1ZXN0cycgJSBcCisgICAgICAgICAgICAoZGVudHJ5X3JldmFscywgbG9va3VwcyksCisgICAgICAgIHByaW50ICdyZXN1bHRlZCBpbiAlZCBMT09LVVBzIG9uIHRoZSB3aXJlJyAlIGxvb2t1cF9vcHMKKyAgICAgICAgcHJpbnQgJyVkIHZmcyBnZXRkZW50cyBjYWxscyByZXN1bHRlZCBpbiAlZCBSRUFERElScyBvbiB0aGUgd2lyZScgJSBcCisgICAgICAgICAgICAoZ2V0ZGVudHMsIHJlYWRkaXJfb3BzKQorCisgICAgZGVmIF9fcHJpbnRfcGFnZV9zdGF0cyhzZWxmLCBzYW1wbGVfdGltZSk6CisgICAgICAgICIiIlByaW50IHBhZ2UgY2FjaGUgc3RhdHMKKyAgICAgICAgIiIiCisgICAgICAgIG5mc19zdGF0cyA9IHNlbGYuX19uZnNfZGF0YQorCisgICAgICAgIHZmc3JlYWRwYWdlID0gbmZzX3N0YXRzWyd2ZnNyZWFkcGFnZSddCisgICAgICAgIHZmc3JlYWRwYWdlcyA9IG5mc19zdGF0c1sndmZzcmVhZHBhZ2VzJ10KKyAgICAgICAgcGFnZXNfcmVhZCA9IG5mc19zdGF0c1sncmVhZHBhZ2VzJ10KKyAgICAgICAgdmZzd3JpdGVwYWdlID0gbmZzX3N0YXRzWyd2ZnN3cml0ZXBhZ2UnXQorICAgICAgICB2ZnN3cml0ZXBhZ2VzID0gbmZzX3N0YXRzWyd2ZnN3cml0ZXBhZ2VzJ10KKyAgICAgICAgcGFnZXNfd3JpdHRlbiA9IG5mc19zdGF0c1snd3JpdGVwYWdlcyddCisKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJyVkIG5mc19yZWFkcGFnZSgpIGNhbGxzIHJlYWQgJWQgcGFnZXMnICUgXAorICAgICAgICAgICAgKHZmc3JlYWRwYWdlLCB2ZnNyZWFkcGFnZSkKKyAgICAgICAgcHJpbnQgJyVkIG5mc19yZWFkcGFnZXMoKSBjYWxscyByZWFkICVkIHBhZ2VzJyAlIFwKKyAgICAgICAgICAgICh2ZnNyZWFkcGFnZXMsIHBhZ2VzX3JlYWQgLSB2ZnNyZWFkcGFnZSksCisgICAgICAgIGlmIHZmc3JlYWRwYWdlcyAhPSAwOgorICAgICAgICAgICAgcHJpbnQgJyglLjFmIHBhZ2VzIHBlciBjYWxsKScgJSBcCisgICAgICAgICAgICAgICAgKGZsb2F0KHBhZ2VzX3JlYWQgLSB2ZnNyZWFkcGFnZSkgLyB2ZnNyZWFkcGFnZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludAorCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICclZCBuZnNfdXBkYXRlcGFnZSgpIGNhbGxzJyAlIG5mc19zdGF0c1sndmZzdXBkYXRlcGFnZSddCisgICAgICAgIHByaW50ICclZCBuZnNfd3JpdGVwYWdlKCkgY2FsbHMgd3JvdGUgJWQgcGFnZXMnICUgXAorICAgICAgICAgICAgKHZmc3dyaXRlcGFnZSwgdmZzd3JpdGVwYWdlKQorICAgICAgICBwcmludCAnJWQgbmZzX3dyaXRlcGFnZXMoKSBjYWxscyB3cm90ZSAlZCBwYWdlcycgJSBcCisgICAgICAgICAgICAodmZzd3JpdGVwYWdlcywgcGFnZXNfd3JpdHRlbiAtIHZmc3dyaXRlcGFnZSksCisgICAgICAgIGlmICh2ZnN3cml0ZXBhZ2VzKSAhPSAwOgorICAgICAgICAgICAgcHJpbnQgJyglLjFmIHBhZ2VzIHBlciBjYWxsKScgJSBcCisgICAgICAgICAgICAgICAgKGZsb2F0KHBhZ2VzX3dyaXR0ZW4gLSB2ZnN3cml0ZXBhZ2UpIC8gdmZzd3JpdGVwYWdlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50CisKKyAgICAgICAgY29uZ2VzdGlvbndhaXRzID0gbmZzX3N0YXRzWydjb25nZXN0aW9ud2FpdCddCisgICAgICAgIGlmIGNvbmdlc3Rpb253YWl0cyAhPSAwOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICclZCBjb25nZXN0aW9uIHdhaXRzJyAlIGNvbmdlc3Rpb253YWl0cworCisgICAgZGVmIF9fcHJpbnRfcnBjX29wX3N0YXRzKHNlbGYsIG9wLCBzYW1wbGVfdGltZSk6CisgICAgICAgICIiIlByaW50IGdlbmVyaWMgc3RhdHMgZm9yIG9uZSBSUEMgb3AKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9fcnBjX2RhdGEuaGFzX2tleShvcCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBycGNfc3RhdHMgPSBzZWxmLl9fcnBjX2RhdGFbb3BdCisgICAgICAgIG9wcyA9IGZsb2F0KHJwY19zdGF0c1swXSkKKyAgICAgICAgcmV0cmFucyA9IGZsb2F0KHJwY19zdGF0c1sxXSAtIHJwY19zdGF0c1swXSkKKyAgICAgICAga2lsb2J5dGVzID0gZmxvYXQocnBjX3N0YXRzWzNdICsgcnBjX3N0YXRzWzRdKSAvIDEwMjQKKyAgICAgICAgcnR0ID0gZmxvYXQocnBjX3N0YXRzWzZdKQorICAgICAgICBleGUgPSBmbG9hdChycGNfc3RhdHNbN10pCisKKyAgICAgICAgIyBwcmV2ZW50IGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMKKyAgICAgICAgaWYgb3BzICE9IDA6CisgICAgICAgICAgICBrYl9wZXJfb3AgPSBraWxvYnl0ZXMgLyBvcHMKKyAgICAgICAgICAgIHJldHJhbnNfcGVyY2VudCA9IChyZXRyYW5zICogMTAwKSAvIG9wcworICAgICAgICAgICAgcnR0X3Blcl9vcCA9IHJ0dCAvIG9wcworICAgICAgICAgICAgZXhlX3Blcl9vcCA9IGV4ZSAvIG9wcworICAgICAgICBlbHNlOgorICAgICAgICAgICAga2JfcGVyX29wID0gMC4wCisgICAgICAgICAgICByZXRyYW5zX3BlcmNlbnQgPSAwLjAKKyAgICAgICAgICAgIHJ0dF9wZXJfb3AgPSAwLjAKKyAgICAgICAgICAgIGV4ZV9wZXJfb3AgPSAwLjAKKworICAgICAgICBvcCArPSAnOicKKyAgICAgICAgcHJpbnQgJyVzJyAlIG9wLmxvd2VyKCkubGp1c3QoMTUpLAorICAgICAgICBwcmludCAnICBvcHMvc1x0XHQgICBrQi9zXHRcdCAga0Ivb3BcdFx0cmV0cmFuc1x0XHRhdmcgUlRUIChtcylcdGF2ZyBleGUgKG1zKScKKworICAgICAgICBwcmludCAnXHRcdCU3LjNmJyAlIChvcHMgLyBzYW1wbGVfdGltZSksCisgICAgICAgIHByaW50ICdcdCU3LjNmJyAlIChraWxvYnl0ZXMgLyBzYW1wbGVfdGltZSksCisgICAgICAgIHByaW50ICdcdCU3LjNmJyAlIGtiX3Blcl9vcCwKKyAgICAgICAgcHJpbnQgJyAlN2QgKCUzLjFmJSUpJyAlIChyZXRyYW5zLCByZXRyYW5zX3BlcmNlbnQpLAorICAgICAgICBwcmludCAnXHQlNy4zZicgJSBydHRfcGVyX29wLAorICAgICAgICBwcmludCAnXHQlNy4zZicgJSBleGVfcGVyX29wCisKKyAgICBkZWYgb3BzKHNlbGYsIHNhbXBsZV90aW1lKToKKyAgICAgICAgc2VuZHMgPSBmbG9hdChzZWxmLl9fcnBjX2RhdGFbJ3JwY3NlbmRzJ10pCisgICAgICAgIGlmIHNhbXBsZV90aW1lID09IDA6CisgICAgICAgICAgICBzYW1wbGVfdGltZSA9IGZsb2F0KHNlbGYuX19uZnNfZGF0YVsnYWdlJ10pCisgICAgICAgIHJldHVybiAoc2VuZHMgLyBzYW1wbGVfdGltZSkKKworICAgIGRlZiBkaXNwbGF5X2lvc3RhdHMoc2VsZiwgc2FtcGxlX3RpbWUsIHdoaWNoKToKKyAgICAgICAgIiIiRGlzcGxheSBORlMgYW5kIFJQQyBzdGF0cyBpbiBhbiBpb3N0YXQtbGlrZSB3YXkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbmRzID0gZmxvYXQoc2VsZi5fX3JwY19kYXRhWydycGNzZW5kcyddKQorICAgICAgICBpZiBzYW1wbGVfdGltZSA9PSAwOgorICAgICAgICAgICAgc2FtcGxlX3RpbWUgPSBmbG9hdChzZWxmLl9fbmZzX2RhdGFbJ2FnZSddKQorICAgICAgICBpZiBzZW5kcyAhPSAwOgorICAgICAgICAgICAgYmFja2xvZyA9IChmbG9hdChzZWxmLl9fcnBjX2RhdGFbJ2JhY2tsb2d1dGlsJ10pIC8gc2VuZHMpIC8gc2FtcGxlX3RpbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhY2tsb2cgPSAwLjAKKworICAgICAgICBwcmludAorICAgICAgICBwcmludCAnJXMgbW91bnRlZCBvbiAlczonICUgXAorICAgICAgICAgICAgKHNlbGYuX19uZnNfZGF0YVsnZXhwb3J0J10sIHNlbGYuX19uZnNfZGF0YVsnbW91bnRwb2ludCddKQorICAgICAgICBwcmludAorCisgICAgICAgIHByaW50ICcgICBvcC9zXHRcdHJwYyBia2xvZycKKyAgICAgICAgcHJpbnQgJyU3LjJmJyAlIChzZW5kcyAvIHNhbXBsZV90aW1lKSwgCisgICAgICAgIHByaW50ICdcdCU3LjJmJyAlIGJhY2tsb2cKKworICAgICAgICBpZiB3aGljaCA9PSAwOgorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnUkVBRCcsIHNhbXBsZV90aW1lKQorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnV1JJVEUnLCBzYW1wbGVfdGltZSkKKyAgICAgICAgZWxpZiB3aGljaCA9PSAxOgorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnR0VUQVRUUicsIHNhbXBsZV90aW1lKQorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnQUNDRVNTJywgc2FtcGxlX3RpbWUpCisgICAgICAgICAgICBzZWxmLl9fcHJpbnRfYXR0cl9jYWNoZV9zdGF0cyhzYW1wbGVfdGltZSkKKyAgICAgICAgZWxpZiB3aGljaCA9PSAyOgorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnTE9PS1VQJywgc2FtcGxlX3RpbWUpCisgICAgICAgICAgICBzZWxmLl9fcHJpbnRfcnBjX29wX3N0YXRzKCdSRUFERElSJywgc2FtcGxlX3RpbWUpCisgICAgICAgICAgICBpZiBzZWxmLl9fcnBjX2RhdGEuaGFzX2tleSgnUkVBRERJUlBMVVMnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fcHJpbnRfcnBjX29wX3N0YXRzKCdSRUFERElSUExVUycsIHNhbXBsZV90aW1lKQorICAgICAgICAgICAgc2VsZi5fX3ByaW50X2Rpcl9jYWNoZV9zdGF0cyhzYW1wbGVfdGltZSkKKyAgICAgICAgZWxpZiB3aGljaCA9PSAzOgorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnUkVBRCcsIHNhbXBsZV90aW1lKQorICAgICAgICAgICAgc2VsZi5fX3ByaW50X3JwY19vcF9zdGF0cygnV1JJVEUnLCBzYW1wbGVfdGltZSkKKyAgICAgICAgICAgIHNlbGYuX19wcmludF9wYWdlX3N0YXRzKHNhbXBsZV90aW1lKQorCisjCisjIEZ1bmN0aW9ucworIworCitkZWYgcGFyc2Vfc3RhdHNfZmlsZShmaWxlbmFtZSk6CisgICAgIiIicG9wIHRoZSBjb250ZW50cyBvZiBhIG1vdW50c3RhdHMgZmlsZSBpbnRvIGEgZGljdGlvbmFyeSwKKyAgICBrZXllZCBieSBtb3VudCBwb2ludC4gIGVhY2ggdmFsdWUgb2JqZWN0IGlzIGEgbGlzdCBvZiB0aGUKKyAgICBsaW5lcyBpbiB0aGUgbW91bnRzdGF0cyBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vdW50CisgICAgcG9pbnQgbmFtZWQgaW4gdGhlIGtleS4KKyAgICAiIiIKKyAgICBtc19kaWN0ID0gZGljdCgpCisgICAga2V5ID0gJycKKworICAgIGYgPSBmaWxlKGZpbGVuYW1lKQorICAgIGZvciBsaW5lIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIGlmIGxlbih3b3JkcykgPT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHdvcmRzWzBdID09ICdkZXZpY2UnOgorICAgICAgICAgICAga2V5ID0gd29yZHNbNF0KKyAgICAgICAgICAgIG5ldyA9IFsgbGluZS5zdHJpcCgpIF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ldyArPSBbIGxpbmUuc3RyaXAoKSBdCisgICAgICAgIG1zX2RpY3Rba2V5XSA9IG5ldworICAgIGYuY2xvc2UKKworICAgIHJldHVybiBtc19kaWN0CisKK2RlZiBwcmludF9pb3N0YXRfc3VtbWFyeShvbGQsIG5ldywgZGV2aWNlcywgdGltZSwgb3B0aW9ucyk6CisgICAgc3RhdHMgPSB7fQorICAgIGRpZmZfc3RhdHMgPSB7fQorCisgICAgaWYgb2xkOgorICAgICAgICAjIFRyaW0gZGV2aWNlIGxpc3QgdG8gb25seSBpbmNsdWRlIGludGVyc2VjdGlvbiBvZiBvbGQgYW5kIG5ldyBkYXRhLAorICAgICAgICAjIHRoaXMgYWRkcmVzc2VzIHVtb3VudHMgZHVlIHRvIGF1dG9mcyBtb3VudHBvaW50cworICAgICAgICBkZXZpY2VsaXN0ID0gZmlsdGVyKGxhbWJkYSB4OnggaW4gZGV2aWNlcyxvbGQpCisgICAgZWxzZToKKyAgICAgICAgZGV2aWNlbGlzdCA9IGRldmljZXMKKworICAgIGZvciBkZXZpY2UgaW4gZGV2aWNlbGlzdDoKKyAgICAgICAgc3RhdHNbZGV2aWNlXSA9IERldmljZURhdGEoKQorICAgICAgICBzdGF0c1tkZXZpY2VdLnBhcnNlX3N0YXRzKG5ld1tkZXZpY2VdKQorICAgICAgICBpZiBvbGQ6CisgICAgICAgICAgICBvbGRfc3RhdHMgPSBEZXZpY2VEYXRhKCkKKyAgICAgICAgICAgIG9sZF9zdGF0cy5wYXJzZV9zdGF0cyhvbGRbZGV2aWNlXSkKKyAgICAgICAgICAgIGRpZmZfc3RhdHNbZGV2aWNlXSA9IHN0YXRzW2RldmljZV0uY29tcGFyZV9pb3N0YXRzKG9sZF9zdGF0cykKKworICAgIGlmIG9wdGlvbnMuc29ydDoKKyAgICAgICAgaWYgb2xkOgorICAgICAgICAgICAgIyBXZSBub3cgaGF2ZSBjb21wYXJlZCBkYXRhIGFuZCBjYW4gcHJpbnQgYSBjb21wYXJpc29uCisgICAgICAgICAgICAjIG9yZGVyZWQgYnkgbW91bnRwb2ludCBvcHMgcGVyIHNlY29uZAorICAgICAgICAgICAgZGV2aWNlbGlzdC5zb3J0KGtleT1sYW1iZGEgeDogZGlmZl9zdGF0c1t4XS5vcHModGltZSksIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRmlyc3QgaXRlcmF0aW9uLCBqdXN0IHNvcnQgYnkgbmV3bHkgcGFyc2VkIG9wcy9zCisgICAgICAgICAgICBkZXZpY2VsaXN0LnNvcnQoa2V5PWxhbWJkYSB4OiBzdGF0c1t4XS5vcHModGltZSksIHJldmVyc2U9VHJ1ZSkKKworICAgIGNvdW50ID0gMQorICAgIGZvciBkZXZpY2UgaW4gZGV2aWNlbGlzdDoKKyAgICAgICAgaWYgb2xkOgorICAgICAgICAgICAgZGlmZl9zdGF0c1tkZXZpY2VdLmRpc3BsYXlfaW9zdGF0cyh0aW1lLCBvcHRpb25zLndoaWNoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdHNbZGV2aWNlXS5kaXNwbGF5X2lvc3RhdHModGltZSwgb3B0aW9ucy53aGljaCkKKworICAgICAgICBjb3VudCArPSAxCisgICAgICAgIGlmIChjb3VudCA+IG9wdGlvbnMubGlzdCk6CisgICAgICAgICAgICByZXR1cm4KKworCitkZWYgbGlzdF9uZnNfbW91bnRzKGdpdmVubGlzdCwgbW91bnRzdGF0cyk6CisgICAgIiIicmV0dXJuIGEgbGlzdCBvZiBORlMgbW91bnRzIGdpdmVuIGEgbGlzdCB0byB2YWxpZGF0ZSBvcgorICAgICAgIHJldHVybiBhIGZ1bGwgbGlzdCBpZiB0aGUgZ2l2ZW4gbGlzdCBpcyBlbXB0eSAtCisgICAgICAgbWF5IHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIG5vbmUgZm91bmQKKyAgICAiIiIKKyAgICBsaXN0ID0gW10KKyAgICBpZiBsZW4oZ2l2ZW5saXN0KSA+IDA6CisgICAgICAgIGZvciBkZXZpY2UgaW4gZ2l2ZW5saXN0OgorICAgICAgICAgICAgc3RhdHMgPSBEZXZpY2VEYXRhKCkKKyAgICAgICAgICAgIHN0YXRzLnBhcnNlX3N0YXRzKG1vdW50c3RhdHNbZGV2aWNlXSkKKyAgICAgICAgICAgIGlmIHN0YXRzLmlzX25mc19tb3VudHBvaW50KCk6CisgICAgICAgICAgICAgICAgbGlzdCArPSBbZGV2aWNlXQorICAgIGVsc2U6CisgICAgICAgIGZvciBkZXZpY2UsIGRlc2NyIGluIG1vdW50c3RhdHMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzdGF0cyA9IERldmljZURhdGEoKQorICAgICAgICAgICAgc3RhdHMucGFyc2Vfc3RhdHMoZGVzY3IpCisgICAgICAgICAgICBpZiBzdGF0cy5pc19uZnNfbW91bnRwb2ludCgpOgorICAgICAgICAgICAgICAgIGxpc3QgKz0gW2RldmljZV0KKyAgICByZXR1cm4gbGlzdAorCitkZWYgaW9zdGF0X2NvbW1hbmQobmFtZSk6CisgICAgIiIiaW9zdGF0LWxpa2UgY29tbWFuZCBmb3IgTkZTIG1vdW50IHBvaW50cworICAgICIiIgorICAgIG1vdW50c3RhdHMgPSBwYXJzZV9zdGF0c19maWxlKCcvcHJvYy9zZWxmL21vdW50c3RhdHMnKQorICAgIGRldmljZXMgPSBbXQorICAgIG9yaWdkZXZpY2VzID0gW10KKyAgICBpbnRlcnZhbF9zZWVuID0gRmFsc2UKKyAgICBjb3VudF9zZWVuID0gRmFsc2UKKworICAgIG15ZGVzY3JpcHRpb249ICIiIgorU2FtcGxlIGlvc3RhdC1saWtlIHByb2dyYW0gdG8gZGlzcGxheSBORlMgY2xpZW50IHBlci1tb3VudCcKK3N0YXRpc3RpY3MuICBUaGUgPGludGVydmFsPiBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzCitiZXR3ZWVuIGVhY2ggcmVwb3J0LiAgVGhlIGZpcnN0IHJlcG9ydCBjb250YWlucyBzdGF0aXN0aWNzIGZvciB0aGUgdGltZSBzaW5jZQorZWFjaCBmaWxlIHN5c3RlbSB3YXMgbW91bnRlZC4gIEVhY2ggc3Vic2VxdWVudCByZXBvcnQgY29udGFpbnMgc3RhdGlzdGljcworY29sbGVjdGVkIGR1cmluZyB0aGUgaW50ZXJ2YWwgc2luY2UgdGhlIHByZXZpb3VzIHJlcG9ydC4gIElmIHRoZSA8Y291bnQ+CitwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgdmFsdWUgb2YgPGNvdW50PiBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcmVwb3J0cworZ2VuZXJhdGVkIGF0IDxpbnRlcnZhbD4gc2Vjb25kcyBhcGFydC4gIElmIHRoZSBpbnRlcnZhbCBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkCit3aXRob3V0IHRoZSA8Y291bnQ+IHBhcmFtZXRlciwgdGhlIGNvbW1hbmQgZ2VuZXJhdGVzIHJlcG9ydHMgY29udGludW91c2x5LgorSWYgb25lIG9yIG1vcmUgPG1vdW50IHBvaW50PiBuYW1lcyBhcmUgc3BlY2lmaWVkLCBzdGF0aXN0aWNzIGZvciBvbmx5IHRoZXNlCittb3VudCBwb2ludHMgd2lsbCBiZSBkaXNwbGF5ZWQuICBPdGhlcndpc2UsIGFsbCBORlMgbW91bnQgcG9pbnRzIG9uIHRoZQorY2xpZW50IGFyZSBsaXN0ZWQuCisiIiIKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoCisgICAgICAgIHVzYWdlPSJ1c2FnZTogJXByb2cgWyA8aW50ZXJ2YWw+IFsgPGNvdW50PiBdIF0gWyA8b3B0aW9ucz4gXSBbIDxtb3VudCBwb2ludD4gXSIsCisgICAgICAgIGRlc2NyaXB0aW9uPW15ZGVzY3JpcHRpb24sCisgICAgICAgIHZlcnNpb249J3ZlcnNpb24gJXMnICUgSW9zdGF0c192ZXJzaW9uKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMod2hpY2g9MCwgc29ydD1GYWxzZSwgbGlzdD1zeXMubWF4aW50KQorCisgICAgc3RhdGdyb3VwID0gT3B0aW9uR3JvdXAocGFyc2VyLCAiU3RhdGlzdGljcyBPcHRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmlsZSBJL08gaXMgZGlzcGxheWVkIHVubGVzcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyBzcGVjaWZpZWQ6JykKKyAgICBzdGF0Z3JvdXAuYWRkX29wdGlvbignLWEnLCAnLS1hdHRyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ3aGljaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Q9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5cyBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gdGhlIGF0dHJpYnV0ZSBjYWNoZScpCisgICAgc3RhdGdyb3VwLmFkZF9vcHRpb24oJy1kJywgJy0tZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ3aGljaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5cyBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gZGlyZWN0b3J5IG9wZXJhdGlvbnMnKQorICAgIHN0YXRncm91cC5hZGRfb3B0aW9uKCctcCcsICctLXBhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9IndoaWNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdD0zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2Rpc3BsYXlzIHN0YXRpc3RpY3MgcmVsYXRlZCB0byB0aGUgcGFnZSBjYWNoZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoc3RhdGdyb3VwKQorICAgIGRpc3BsYXlncm91cCA9IE9wdGlvbkdyb3VwKHBhcnNlciwgIkRpc3BsYXkgT3B0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09wdGlvbnMgYWZmZWN0aW5nIGRpc3BsYXkgZm9ybWF0OicpCisgICAgZGlzcGxheWdyb3VwLmFkZF9vcHRpb24oJy1zJywgJy0tc29ydCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJzb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJTb3J0IE5GUyBtb3VudCBwb2ludHMgYnkgb3BzL3NlY29uZCIpCisgICAgZGlzcGxheWdyb3VwLmFkZF9vcHRpb24oJy1sJywnLS1saXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9Imxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9ubHkgcHJpbnQgc3RhdHMgZm9yIGZpcnN0IExJU1QgbW91bnQgcG9pbnRzIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbl9ncm91cChkaXNwbGF5Z3JvdXApCisKKyAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndikKKworICAgIGZvciBhcmcgaW4gYXJnczoKKworICAgICAgICBpZiBhcmcgPT0gc3lzLmFyZ3ZbMF06CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIGFyZyBpbiBtb3VudHN0YXRzOgorICAgICAgICAgICAgb3JpZ2RldmljZXMgKz0gW2FyZ10KKyAgICAgICAgZWxpZiBub3QgaW50ZXJ2YWxfc2VlbjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IGludChhcmcpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0lsbGVnYWwgPGludGVydmFsPiB2YWx1ZSAlcycgJSBhcmcKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGludGVydmFsID4gMDoKKyAgICAgICAgICAgICAgICBpbnRlcnZhbF9zZWVuID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnSWxsZWdhbCA8aW50ZXJ2YWw+IHZhbHVlICVzJyAlIGFyZworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIG5vdCBjb3VudF9zZWVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvdW50ID0gaW50KGFyZykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCAnSWxlZ2FsIDxjb3VudD4gdmFsdWUgJXMnICUgYXJnCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgY291bnRfc2VlbiA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0lsbGVnYWwgPGNvdW50PiB2YWx1ZSAlcycgJSBhcmcKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICMgbWFrZSBjZXJ0YWluIGRldmljZXMgY29udGFpbnMgb25seSBORlMgbW91bnQgcG9pbnRzCisgICAgZGV2aWNlcyA9IGxpc3RfbmZzX21vdW50cyhvcmlnZGV2aWNlcywgbW91bnRzdGF0cykKKyAgICBpZiBsZW4oZGV2aWNlcykgPT0gMDoKKyAgICAgICAgcHJpbnQgJ05vIE5GUyBtb3VudCBwb2ludHMgd2VyZSBmb3VuZCcKKyAgICAgICAgcmV0dXJuCisKKworICAgIG9sZF9tb3VudHN0YXRzID0gTm9uZQorICAgIHNhbXBsZV90aW1lID0gMC4wCisKKyAgICBpZiBub3QgaW50ZXJ2YWxfc2VlbjoKKyAgICAgICAgcHJpbnRfaW9zdGF0X3N1bW1hcnkob2xkX21vdW50c3RhdHMsIG1vdW50c3RhdHMsIGRldmljZXMsIHNhbXBsZV90aW1lLCBvcHRpb25zKQorICAgICAgICByZXR1cm4KKworICAgIGlmIGNvdW50X3NlZW46CisgICAgICAgIHdoaWxlIGNvdW50ICE9IDA6CisgICAgICAgICAgICBwcmludF9pb3N0YXRfc3VtbWFyeShvbGRfbW91bnRzdGF0cywgbW91bnRzdGF0cywgZGV2aWNlcywgc2FtcGxlX3RpbWUsIG9wdGlvbnMpCisgICAgICAgICAgICBvbGRfbW91bnRzdGF0cyA9IG1vdW50c3RhdHMKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCisgICAgICAgICAgICBzYW1wbGVfdGltZSA9IGludGVydmFsCisgICAgICAgICAgICBtb3VudHN0YXRzID0gcGFyc2Vfc3RhdHNfZmlsZSgnL3Byb2Mvc2VsZi9tb3VudHN0YXRzJykKKyAgICAgICAgICAgICMgYXV0b21vdW50IG1vdW50cG9pbnRzIGFkZCBhbmQgZHJvcCwgaWYgYXV0b21vdW50IGlzIGludm9sdmVkCisgICAgICAgICAgICAjIHdlIG5lZWQgdG8gcmVjaGVjayB0aGUgZGV2aWNlcyBsaXN0IHdoZW4gcmVwYXJzaW5nCisgICAgICAgICAgICBkZXZpY2VzID0gbGlzdF9uZnNfbW91bnRzKG9yaWdkZXZpY2VzLG1vdW50c3RhdHMpCisgICAgICAgICAgICBpZiBsZW4oZGV2aWNlcykgPT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCAnTm8gTkZTIG1vdW50IHBvaW50cyB3ZXJlIGZvdW5kJworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgY291bnQgLT0gMQorICAgIGVsc2U6IAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgcHJpbnRfaW9zdGF0X3N1bW1hcnkob2xkX21vdW50c3RhdHMsIG1vdW50c3RhdHMsIGRldmljZXMsIHNhbXBsZV90aW1lLCBvcHRpb25zKQorICAgICAgICAgICAgb2xkX21vdW50c3RhdHMgPSBtb3VudHN0YXRzCisgICAgICAgICAgICB0aW1lLnNsZWVwKGludGVydmFsKQorICAgICAgICAgICAgc2FtcGxlX3RpbWUgPSBpbnRlcnZhbAorICAgICAgICAgICAgbW91bnRzdGF0cyA9IHBhcnNlX3N0YXRzX2ZpbGUoJy9wcm9jL3NlbGYvbW91bnRzdGF0cycpCisgICAgICAgICAgICAjIGF1dG9tb3VudCBtb3VudHBvaW50cyBhZGQgYW5kIGRyb3AsIGlmIGF1dG9tb3VudCBpcyBpbnZvbHZlZAorICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHJlY2hlY2sgdGhlIGRldmljZXMgbGlzdCB3aGVuIHJlcGFyc2luZworICAgICAgICAgICAgZGV2aWNlcyA9IGxpc3RfbmZzX21vdW50cyhvcmlnZGV2aWNlcyxtb3VudHN0YXRzKQorICAgICAgICAgICAgaWYgbGVuKGRldmljZXMpID09IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgJ05vIE5GUyBtb3VudCBwb2ludHMgd2VyZSBmb3VuZCcKKyAgICAgICAgICAgICAgICByZXR1cm4KKworIworIyBNYWluCisjCitwcm9nID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKwordHJ5OgorICAgIGlvc3RhdF9jb21tYW5kKHByb2cpCitleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgcHJpbnQgJ0NhdWdodCBeQy4uLiBleGl0aW5nJworICAgIHN5cy5leGl0KDEpCisKK3N5cy5leGl0KDApCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmxtdGVzdC9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi90b29scy9ubG10ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjlmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmxtdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDcgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRSBcCisJaG9zdC5oIFwKKwlubG1fcHJvdC54IFwKKwlubG10ZXN0LmMKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9ubG10ZXN0L01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL25sbXRlc3QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkMGExMwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ubG10ZXN0L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNDE0IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc3ViZGlyID0gdG9vbHMvbmxtdGVzdAorRElTVF9DT01NT04gPSBSRUFETUUgJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CitTT1VSQ0VTID0KK0RJU1RfU09VUkNFUyA9CitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorRVhUUkFfRElTVCA9IFwKKwlSRUFETUUgXAorCWhvc3QuaCBcCisJbmxtX3Byb3QueCBcCisJbmxtdGVzdC5jCisKK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHRvb2xzL25sbXRlc3QvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvbmxtdGVzdC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK3RhZ3M6IFRBR1MKK1RBR1M6CisKK2N0YWdzOiBDVEFHUworQ1RBR1M6CisKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06CisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLXN0cmlwCisKKy5QSE9OWTogYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbiBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBkaXN0ZGlyIGR2aSBcCisJZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gaW5zdGFsbCBpbnN0YWxsLWFtIFwKKwlpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIGluc3RhbGwtZHZpLWFtIFwKKwlpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gXAorCWluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gaW5zdGFsbC1wZGYgXAorCWluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXN0cmlwIFwKKwlpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gdW5pbnN0YWxsIHVuaW5zdGFsbC1hbQorCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9ubG10ZXN0L1JFQURNRSBiL25mcy11dGlscy0xLjIuMi90b29scy9ubG10ZXN0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRjYjQzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL25sbXRlc3QvUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorCitUaGlzIGlzIGEgc2ltcGxlIHRvb2wgdG8gdGVzdCB5b3VyIGxvY2tkIHNlcnZlci4gVGhpcyBpcyBhIHZlcnkKK3ByaW1pdGl2ZSBwcm9ncmFtLiBUbyB1c2UgaXQgb24geW91ciBzeXN0ZW0sIHlvdSBoYXZlIHRvIGVkaXQKK2hvc3QuaCBhbmQgYWRqdXN0IHRoZSBpbm9kZSBhbmQgZGV2aWNlIG51bWJlcnMgaW4gbmx0ZXN0LmMgdG8KK3N1aXQgeW91ciBuZnMgc2VydmVyLgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL25sbXRlc3QvaG9zdC5oIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL25sbXRlc3QvaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZjMwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmxtdGVzdC9ob3N0LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIGhvc3QuaAorICoKKyAqIERlZmF1bHRzIGZvciBubG10ZXN0CisgKi8KKworI2lmbmRlZiBOTE1URVNUX0hPU1RfSAorI2RlZmluZSBOTE1URVNUX0hPU1RfSAorCisvKgorICogVGhlIGhvc3Qgb24gd2hpY2ggbG9ja2QgcnVucworICovCisjZGVmaW5lIE5MTVRFU1RfSE9TVAkJImNydXRjaCIKKworLyoKKyAqIE5GUyBtb3VudCBwb2ludAorICovCisjZGVmaW5lIE5MTVRFU1RfRElSCQkiLi4vLi4vbW91bnQvIgorCisvKgorICogVGhlIGRlZmF1bHQgZmlsZSBuYW1lIGFuZCBpdHMgaW5vZGUgdmVyc2lvbiBudW1iZXIuCisgKiBUaGVyZSdzIG5vIHdheSB0aGUgdGVzdCBwcm9ncmFtIGNhbiBmaW5kIG91dCB0aGUgdmVyc2lvbiBudW1iZXIsCisgKiBzbyB5b3UgaGF2ZSB0byBhZGQgaXQgaGVyZS4KKyAqLworI2RlZmluZSBOTE1URVNUX0ZJTEUJCU5MTVRFU1RfRElSICJDT1BZSU5HIgorI2RlZmluZSBOTE1URVNUX1ZFUlNJT04JCTEKKworI2VuZGlmIC8qIE5MTVRFU1RfSE9TVF9IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmxtdGVzdC9ubG1fcHJvdC54IGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL25sbXRlc3QvbmxtX3Byb3QueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI1OTEyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL25sbXRlc3QvbmxtX3Byb3QueApAQCAtMCwwICsxLDE4MyBAQAorLyogQCgjKW5sbV9wcm90LngJMi4xIDg4LzA4LzAxIDQuMCBSUENTUkMgKi8KKy8qIEAoIylubG1fcHJvdC54IDEuOCA4Ny8wOS8yMSBDb3B5ciAxOTg3IFN1biBNaWNybyAqLworCisvKgorICogTmV0d29yayBsb2NrIG1hbmFnZXIgcHJvdG9jb2wgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTg2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqCisgKiBwcm90b2NvbCB1c2VkIGJldHdlZW4gbG9jYWwgbG9jayBtYW5hZ2VyIGFuZCByZW1vdGUgbG9jayBtYW5hZ2VyCisgKi8KKworI2lmZGVmIFJQQ19DTE5UCislI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpZmRlZiBSUENfSERSCislI2RlZmluZSBMTV9NQVhTVFJMRU4JMTAyNAorJSNkZWZpbmUgTUFYTkFNRUxFTglMTV9NQVhTVFJMRU4rMQorI2VuZGlmCisKKy8qCisgKiBzdGF0dXMgb2YgYSBjYWxsIHRvIHRoZSBsb2NrIG1hbmFnZXIKKyAqLworZW51bSBubG1fc3RhdHMgeworCW5sbV9ncmFudGVkID0gMCwKKwlubG1fZGVuaWVkID0gMSwKKwlubG1fZGVuaWVkX25vbG9ja3MgPSAyLAorCW5sbV9ibG9ja2VkID0gMywKKwlubG1fZGVuaWVkX2dyYWNlX3BlcmlvZCA9IDQKK307CisKK3N0cnVjdCBubG1faG9sZGVyIHsKKwlib29sIGV4Y2x1c2l2ZTsKKwlpbnQgc3ZpZDsKKwluZXRvYmogb2g7CisJdW5zaWduZWQgbF9vZmZzZXQ7CisJdW5zaWduZWQgbF9sZW47Cit9OworCit1bmlvbiBubG1fdGVzdHJwbHkgc3dpdGNoIChubG1fc3RhdHMgc3RhdCkgeworCWNhc2UgbmxtX2RlbmllZDoKKwkJc3RydWN0IG5sbV9ob2xkZXIgaG9sZGVyOworCWRlZmF1bHQ6CisJCXZvaWQ7Cit9OworCitzdHJ1Y3QgbmxtX3N0YXQgeworCW5sbV9zdGF0cyBzdGF0OworfTsKKworc3RydWN0IG5sbV9yZXMgeworCW5ldG9iaiBjb29raWU7CisJbmxtX3N0YXQgc3RhdDsKK307CisKK3N0cnVjdCBubG1fdGVzdHJlcyB7CisJbmV0b2JqIGNvb2tpZTsKKwlubG1fdGVzdHJwbHkgc3RhdDsKK307CisKK3N0cnVjdCBubG1fbG9jayB7CisJc3RyaW5nIGNhbGxlcl9uYW1lPExNX01BWFNUUkxFTj47CisJbmV0b2JqIGZoOwkJLyogaWRlbnRpZnkgYSBmaWxlICovCisJbmV0b2JqIG9oOwkJLyogaWRlbnRpZnkgb3duZXIgb2YgYSBsb2NrICovCisJaW50IHN2aWQ7CQkvKiBnZW5lcmF0ZWQgZnJvbSBwaWQgZm9yIHN2aWQgKi8KKwl1bnNpZ25lZCBsX29mZnNldDsKKwl1bnNpZ25lZCBsX2xlbjsKK307CisKK3N0cnVjdCBubG1fbG9ja2FyZ3MgeworCW5ldG9iaiBjb29raWU7CisJYm9vbCBibG9jazsKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7CisJYm9vbCByZWNsYWltOwkJLyogdXNlZCBmb3IgcmVjb3ZlcmluZyBsb2NrcyAqLworCWludCBzdGF0ZTsJCS8qIHNwZWNpZnkgbG9jYWwgc3RhdHVzIG1vbml0b3Igc3RhdGUgKi8KK307CisKK3N0cnVjdCBubG1fY2FuY2FyZ3MgeworCW5ldG9iaiBjb29raWU7CQkKKwlib29sIGJsb2NrOworCWJvb2wgZXhjbHVzaXZlOworCXN0cnVjdCBubG1fbG9jayBhbG9jazsKK307CisKK3N0cnVjdCBubG1fdGVzdGFyZ3MgeworCW5ldG9iaiBjb29raWU7CQkKKwlib29sIGV4Y2x1c2l2ZTsKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OworCitzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MgeworCW5ldG9iaiBjb29raWU7CQkKKwlzdHJ1Y3QgbmxtX2xvY2sgYWxvY2s7Cit9OworCisKKyNpZmRlZiBSUENfSERSCislLyoKKyUgKiBUaGUgZm9sbG93aW5nIGVudW1zIGFyZSBhY3R1YWxseSBiaXQgZW5jb2RlZCBmb3IgZWZmaWNpZW50CislICogYm9vbGVhbiBhbGdlYnJhLi4uLiBET04nVCBjaGFuZ2UgdGhlbS4uLi4uCislICovCisjZW5kaWYKK2VudW0JZnNoX21vZGUgeworCWZzbV9ETiAgPSAwLAkvKiBkZW55IG5vbmUgKi8KKwlmc21fRFIgID0gMSwJLyogZGVueSByZWFkICovCisJZnNtX0RXICA9IDIsCS8qIGRlbnkgd3JpdGUgKi8KKwlmc21fRFJXID0gMwkvKiBkZW55IHJlYWQvd3JpdGUgKi8KK307CisKK2VudW0JZnNoX2FjY2VzcyB7CisJZnNhX05PTkUgPSAwLAkvKiBmb3IgY29tcGxldGVuZXNzICovCisJZnNhX1IgICAgPSAxLAkvKiByZWFkIG9ubHkgKi8KKwlmc2FfVyAgICA9IDIsCS8qIHdyaXRlIG9ubHkgKi8KKwlmc2FfUlcgICA9IDMJLyogcmVhZC93cml0ZSAqLworfTsKKworc3RydWN0CW5sbV9zaGFyZSB7CisJc3RyaW5nIGNhbGxlcl9uYW1lPExNX01BWFNUUkxFTj47CisJbmV0b2JqCWZoOworCW5ldG9iaglvaDsKKwlmc2hfbW9kZQltb2RlOworCWZzaF9hY2Nlc3MJYWNjZXNzOworfTsKKworc3RydWN0CW5sbV9zaGFyZWFyZ3MgeworCW5ldG9iagljb29raWU7CisJbmxtX3NoYXJlCXNoYXJlOworCWJvb2wJcmVjbGFpbTsKK307CisKK3N0cnVjdAlubG1fc2hhcmVyZXMgeworCW5ldG9iagljb29raWU7CisJbmxtX3N0YXRzCXN0YXQ7CisJaW50CXNlcXVlbmNlOworfTsKKworc3RydWN0CW5sbV9ub3RpZnkgeworCXN0cmluZyBuYW1lPE1BWE5BTUVMRU4+OworCWxvbmcgc3RhdGU7Cit9OworCisvKgorICogT3Zlci10aGUtd2lyZSBwcm90b2NvbCB1c2VkIGJldHdlZW4gdGhlIG5ldHdvcmsgbG9jayBtYW5hZ2VycworICovCisKK3Byb2dyYW0gTkxNX1BST0cgeworCXZlcnNpb24gTkxNX1ZFUlMgeworCisJCW5sbV90ZXN0cmVzCU5MTV9URVNUKHN0cnVjdCBubG1fdGVzdGFyZ3MpID0JMTsKKworCQlubG1fcmVzCQlOTE1fTE9DSyhzdHJ1Y3QgbmxtX2xvY2thcmdzKSA9CTI7CisKKwkJbmxtX3JlcwkJTkxNX0NBTkNFTChzdHJ1Y3QgbmxtX2NhbmNhcmdzKSA9IDM7CisJCW5sbV9yZXMJCU5MTV9VTkxPQ0soc3RydWN0IG5sbV91bmxvY2thcmdzKSA9CTQ7CisKKwkJLyoKKwkJICogcmVtb3RlIGxvY2sgbWFuYWdlciBjYWxsLWJhY2sgdG8gZ3JhbnQgbG9jaworCQkgKi8KKwkJbmxtX3JlcwkJTkxNX0dSQU5URUQoc3RydWN0IG5sbV90ZXN0YXJncyk9IDU7CisJCS8qCisJCSAqIG1lc3NhZ2UgcGFzc2luZyBzdHlsZSBvZiByZXF1ZXN0aW5nIGxvY2sKKwkJICovCisJCXZvaWQJCU5MTV9URVNUX01TRyhzdHJ1Y3QgbmxtX3Rlc3RhcmdzKSA9IDY7CisJCXZvaWQJCU5MTV9MT0NLX01TRyhzdHJ1Y3QgbmxtX2xvY2thcmdzKSA9IDc7CisJCXZvaWQJCU5MTV9DQU5DRUxfTVNHKHN0cnVjdCBubG1fY2FuY2FyZ3MpID04OworCQl2b2lkCQlOTE1fVU5MT0NLX01TRyhzdHJ1Y3QgbmxtX3VubG9ja2FyZ3MpID0gOTsKKwkJdm9pZAkJTkxNX0dSQU5URURfTVNHKHN0cnVjdCBubG1fdGVzdGFyZ3MpID0gMTA7CisJCXZvaWQJCU5MTV9URVNUX1JFUyhubG1fdGVzdHJlcykgPSAxMTsKKwkJdm9pZAkJTkxNX0xPQ0tfUkVTKG5sbV9yZXMpID0gMTI7CisJCXZvaWQJCU5MTV9DQU5DRUxfUkVTKG5sbV9yZXMpID0gMTM7CisJCXZvaWQJCU5MTV9VTkxPQ0tfUkVTKG5sbV9yZXMpID0gMTQ7CisJCXZvaWQJCU5MTV9HUkFOVEVEX1JFUyhubG1fcmVzKSA9IDE1OworCX0gPSAxOworCisJdmVyc2lvbiBOTE1fVkVSU1ggeworCQlubG1fc2hhcmVyZXMJTkxNX1NIQVJFKG5sbV9zaGFyZWFyZ3MpID0gMjA7CisJCW5sbV9zaGFyZXJlcwlOTE1fVU5TSEFSRShubG1fc2hhcmVhcmdzKSA9IDIxOworCQlubG1fcmVzCQlOTE1fTk1fTE9DSyhubG1fbG9ja2FyZ3MpID0gMjI7CisJCXZvaWQJCU5MTV9GUkVFX0FMTChubG1fbm90aWZ5KSA9IDIzOworCX0gPSAzOworCit9ID0gMTAwMDIxOworCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmxtdGVzdC9ubG10ZXN0LmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvbmxtdGVzdC9ubG10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhY2M0NwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ubG10ZXN0L25sbXRlc3QuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIG5sbXRlc3QKKyAqCisgKiBTaW1wbGUgdG9vbCBmb3IgTkxNIHRlc3RpbmcuIFlvdSB3aWxsIGhhdmUgdG8gYWRqdXN0IHRoZSB2YWx1ZXMgaW4KKyAqIGhvc3QuaCB0byB5b3VyIHRlc3Qgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bmZzL25mcy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgIm5sbV9wcm90LmgiCisjaW5jbHVkZSAiaG9zdC5oIgorCitzdGF0aWMgY2hhcgkJbXlob3N0bmFtZVsyNTZdOworc3RhdGljIGludAkJaG9zdG5hbWVsZW47CisKK3N0YXRpYyB2b2lkCQltYWtlbG9jayhzdHJ1Y3QgbmxtX2xvY2sgKiwgdV9pbnQzMl90LCBvZmZfdCwgb2ZmX3QpOworc3RhdGljIHZvaWQJCW1ha2Vvd25lcihzdHJ1Y3QgbmV0b2JqICosIHVfaW50MzJfdCk7CitzdGF0aWMgdm9pZAkJbWFrZWZpbGVoKHN0cnVjdCBuZXRvYmogKik7CitzdGF0aWMgY2hhciAqCQlubG1fc3RhdF9uYW1lKGludCBzdGF0dXMpOworc3RhdGljIGNoYXIgKgkJaG9sZGVyc3RyKHN0cnVjdCBuZXRvYmogKm9oKTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlDTElFTlQJCSpjbGllbnQ7CisJbmxtX3Rlc3RhcmdzCXRlc3RhcmdzOworCW5sbV9sb2NrYXJncwlsb2NrYXJnczsKKwlubG1fdW5sb2NrYXJncwl1bmxvY2thcmdzOworCW5sbV9sb2NrCWFsb2NrOworCW5sbV90ZXN0cmVzCSp0ZXN0cmVzOworCW5sbV9yZXMJCSpsb2NrcmVzOworCWNoYXIJCSpmaWxlbmFtZSA9IE5MTVRFU1RfRklMRTsKKwljaGFyCQkqc3ZjaG9zdCA9IE5MTVRFU1RfSE9TVDsKKwl1bnNpZ25lZCBsb25nCW9mZnNldCA9IDAsIGxlbmd0aCA9IDA7CisJaW50CQlleGNsdXNpdmUgPSAwOworCWludAkJYmxvY2tpbmcgPSAwOworCWludAkJdW5sb2NrID0gMDsKKwl1X2ludDMyX3QJCWNvb2tpZSA9IDQzMjE7CisJdV9pbnQzMl90CQlteXBpZCA9IDEyMzQ7CisJaW50CQljOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJiZjpoOmw6bzpwOnV4IikpICE9IEVPRikgeworCQlzd2l0Y2goYykgeworCQljYXNlICdiJzoKKwkJCWJsb2NraW5nID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWZpbGVuYW1lID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJc3ZjaG9zdCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWxlbmd0aCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCW9mZnNldCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCW15cGlkID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJdW5sb2NrID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCWV4Y2x1c2l2ZSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAibmxtdGVzdDogYmFkIG9wdGlvbiAlY1xuIiwgYyk7CisJCQlleGl0ICgyKTsKKwkJfQorCX0KKworCWNsaWVudCA9IGNsbnRfY3JlYXRlKHN2Y2hvc3QsIE5MTV9QUk9HLCBOTE1fVkVSUywgInVkcCIpOworCWlmIChjbGllbnQgPT0gTlVMTCkgeworCQljbG50X3BjcmVhdGVlcnJvcigibG9jYWxob3N0Iik7CisJCWV4aXQoMSk7CisJfQorCisJLyogR2V0IGxvY2FsIGhvc3QgbmFtZSAqLworCWlmIChnZXRob3N0bmFtZShteWhvc3RuYW1lLCBzaXplb2YobXlob3N0bmFtZSkpIDwgMCkKKwkJc3RyY3B5KG15aG9zdG5hbWUsICJ1bmtub3duIik7CisJaG9zdG5hbWVsZW4gPSBzdHJsZW4obXlob3N0bmFtZSk7CisKKwltYWtlbG9jaygmYWxvY2ssIG15cGlkLCBvZmZzZXQsIGxlbmd0aCk7CisKKwl0ZXN0YXJncy5jb29raWUubl9ieXRlcyA9ICh2b2lkKikmY29va2llOworCXRlc3RhcmdzLmNvb2tpZS5uX2xlbiAgID0gNDsKKwl0ZXN0YXJncy5leGNsdXNpdmUgICAgICA9IGV4Y2x1c2l2ZTsKKwl0ZXN0YXJncy5hbG9jayAgICAgICAgICA9IGFsb2NrOworCisJaWYgKCh0ZXN0cmVzID0gbmxtX3Rlc3RfMSgmdGVzdGFyZ3MsIGNsaWVudCkpID09IE5VTEwpIHsKKwkJY2xudF9wZXJyb3IoY2xpZW50LCAibmxtX3Rlc3QgY2FsbCBmYWlsZWQ6Iik7CisJCWV4aXQgKDEpOworCX0KKwlwcmludGYgKCJubG1fdGVzdCByZXBseTpcbiIKKwkJIlx0Y29va2llOiAgICAgICVkXG4iCisJCSJcdHN0YXR1czogICAgICAlc1xuIiwKKwkJCSooaW50KikodGVzdHJlcy0+Y29va2llLm5fYnl0ZXMpLAorCQkJbmxtX3N0YXRfbmFtZSh0ZXN0cmVzLT5zdGF0LnN0YXQpCisJCSk7CisKKwlpZiAodGVzdHJlcy0+c3RhdC5zdGF0ID09IG5sbV9kZW5pZWQpIHsKKwkJbmxtX2hvbGRlciAqaG9sZGVyID0gJih0ZXN0cmVzLT5zdGF0Lm5sbV90ZXN0cnBseV91LmhvbGRlcik7CisJCXByaW50ZiAoIlx0Y29uZmxpY3RpbmcgbG9jazpcbiIKKwkJCSJcdCBvaDogICAgICAgICAlc1xuIgorCQkJIlx0IHBpZDogICAgICAgICVkXG4iCisJCQkiXHQgb2Zmc2V0OiAgICAgJWRcbiIKKwkJCSJcdCBsZW5ndGg6ICAgICAlZFxuIgorCQkJIlx0IGV4Y2x1c2l2ZTogICVkXG4iLAorCQkJaG9sZGVyc3RyKCZob2xkZXItPm9oKSwKKwkJCWhvbGRlci0+c3ZpZCwKKwkJCWhvbGRlci0+bF9vZmZzZXQsCisJCQlob2xkZXItPmxfbGVuLAorCQkJaG9sZGVyLT5leGNsdXNpdmUpOworCX0KKworCWlmICh0ZXN0cmVzLT5zdGF0LnN0YXQgIT0gbmxtX2dyYW50ZWQgJiYgIXVubG9jayAmJiAhYmxvY2tpbmcpCisJCXJldHVybiAxOworCisJaWYgKHVubG9jaykgeworCQl1bmxvY2thcmdzLmNvb2tpZS5uX2J5dGVzID0gKHZvaWQqKSZjb29raWU7CisJCXVubG9ja2FyZ3MuY29va2llLm5fbGVuICAgPSBzaXplb2YoY29va2llKTsKKwkJdW5sb2NrYXJncy5hbG9jayAgICAgICAgICA9IGFsb2NrOworCisJCWlmICgobG9ja3JlcyA9IG5sbV91bmxvY2tfMSgmdW5sb2NrYXJncywgY2xpZW50KSkgPT0gTlVMTCkgeworCQkJY2xudF9wZXJyb3IoY2xpZW50LCAibmxtX3VubG9jayBjYWxsIGZhaWxlZDoiKTsKKwkJCWV4aXQgKDEpOworCQl9CisJCXByaW50ZiAoIm5sbV91bmxvY2sgcmVwbHk6XG4iCisJCQkiXHRjb29raWU6ICAgICAgJWRcbiIKKwkJCSJcdHN0YXR1czogICAgICAlc1xuIiwKKwkJCQkqKGludCopKGxvY2tyZXMtPmNvb2tpZS5uX2J5dGVzKSwKKwkJCQlubG1fc3RhdF9uYW1lKGxvY2tyZXMtPnN0YXQuc3RhdCkKKwkJCSk7CisJfSBlbHNlIHsKKwkJbG9ja2FyZ3MuY29va2llLm5fYnl0ZXMgPSAodm9pZCopJmNvb2tpZTsKKwkJbG9ja2FyZ3MuY29va2llLm5fbGVuICAgPSBzaXplb2YoY29va2llKTsKKwkJbG9ja2FyZ3MuZXhjbHVzaXZlICAgICAgPSBleGNsdXNpdmU7CisJCWxvY2thcmdzLmFsb2NrICAgICAgICAgID0gYWxvY2s7CisJCWxvY2thcmdzLnJlY2xhaW0gICAgICAgID0gMDsKKwkJbG9ja2FyZ3Muc3RhdGUgICAgICAgICAgPSAwOworCisJCWlmICgobG9ja3JlcyA9IG5sbV9sb2NrXzEoJmxvY2thcmdzLCBjbGllbnQpKSA9PSBOVUxMKSB7CisJCQljbG50X3BlcnJvcihjbGllbnQsICJubG1fbG9jayBjYWxsIGZhaWxlZDoiKTsKKwkJCWV4aXQgKDEpOworCQl9CisJCXByaW50ZiAoIm5sbV9sb2NrIHJlcGx5OlxuIgorCQkJIlx0Y29va2llOiAgICAgICVkXG4iCisJCQkiXHRzdGF0dXM6ICAgICAgJXNcbiIsCisJCQkJKihpbnQqKShsb2NrcmVzLT5jb29raWUubl9ieXRlcyksCisJCQkJbmxtX3N0YXRfbmFtZShsb2NrcmVzLT5zdGF0LnN0YXQpCisJCQkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqCitubG1fc3RhdF9uYW1lKGludCBzdGF0dXMpCit7CisJc3RhdGljIGNoYXIJYnVmWzEyXTsKKworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBubG1fZ3JhbnRlZDoKKwkJcmV0dXJuICJubG1fZ3JhbnRlZCI7CisJY2FzZSBubG1fZGVuaWVkOgorCQlyZXR1cm4gIm5sbV9kZW5pZWQiOworCWNhc2UgbmxtX2RlbmllZF9ub2xvY2tzOgorCQlyZXR1cm4gIm5sbV9kZW5pZWRfbm9sb2NrcyI7CisJY2FzZSBubG1fYmxvY2tlZDoKKwkJcmV0dXJuICJubG1fYmxvY2tlZCI7CisJY2FzZSBubG1fZGVuaWVkX2dyYWNlX3BlcmlvZDoKKwkJcmV0dXJuICJubG1fZGVuaWVkX2dyYWNlX3BlcmlvZCI7CisJfQorCXNwcmludGYoYnVmLCAiJWQiLCBzdGF0dXMpOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyICoKK2hvbGRlcnN0cihzdHJ1Y3QgbmV0b2JqICpvaCkKK3sKKwlzdGF0aWMgY2hhcglidWZmZXJbNDA5Nl07CisJdW5zaWduZWQgY2hhcgljLCAqc3A7CisJaW50CQlpOworCisJZm9yIChpID0gMCwgc3AgPSBidWZmZXI7IGkgPCBvaC0+bl9sZW47IGkrKykgeworCQljID0gKHVuc2lnbmVkIGNoYXIpIG9oLT5uX2J5dGVzW2ldOworCQlpZiAoYyA8IDB4MjAgfHwgYyA+IDB4N2YpCisJCQlzcCArPSBzcHJpbnRmKHNwLCAiXFwlMDNvIiwgYyk7CisJCWVsc2UKKwkJCSpzcCsrID0gYzsKKwl9CisJKnNwKysgPSAnXDAnOworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQKK21ha2Vsb2NrKHN0cnVjdCBubG1fbG9jayAqYWxvY2ssIHVfaW50MzJfdCBteXBpZCwgb2ZmX3Qgb2Zmc2V0LCBvZmZfdCBsZW5ndGgpCit7CisJbWFrZW93bmVyKCZhbG9jay0+b2gsIG15cGlkKTsJLyogQ3JlYXRlIG93bmVyIGhhbmRsZSAqLworCW1ha2VmaWxlaCgmYWxvY2stPmZoKTsJCS8qIENyZWF0ZSBmaWxlIGhhbmRsZSAqLworCisJYWxvY2stPmNhbGxlcl9uYW1lID0gbXlob3N0bmFtZTsKKwlhbG9jay0+c3ZpZCAgICAgICAgPSBteXBpZDsKKwlhbG9jay0+bF9vZmZzZXQgICAgPSBvZmZzZXQ7CisJYWxvY2stPmxfbGVuICAgICAgID0gbGVuZ3RoOworfQorCitzdGF0aWMgdm9pZAorbWFrZW93bmVyKHN0cnVjdCBuZXRvYmogKm9oLCB1X2ludDMyX3QgbXlwaWQpCit7CisJc3RhdGljIGNoYXIJb2hkYXRhWzEwMjRdOworCisJb2gtPm5fYnl0ZXMgPSBvaGRhdGE7CisJb2gtPm5fbGVuICAgPSBob3N0bmFtZWxlbiArIDEgKyA0OworCisJc3RyY3B5KG9oZGF0YSwgbXlob3N0bmFtZSk7CisJbWVtY3B5KG9oZGF0YSArIGhvc3RuYW1lbGVuICsgMSwgJm15cGlkLCA0KTsKK30KKworc3RhdGljIHZvaWQKK21ha2VmaWxlaChzdHJ1Y3QgbmV0b2JqICpmaCkKK3sKKwlzdGF0aWMgc3RydWN0IGtuZnNfZmgJZjsKKwlzdHJ1Y3Qgc3RhdAkJc3RiOworI2Vycm9yIHRoaXMgbmVlZHMgdXBkYXRpbmcgaWYgaXQgaXMgc3RpbGwgd2FudGVkCisJbWVtc2V0KCZmLCAwLCBzaXplb2YoZikpOworI2lmIDAKKwlpZiAoc3RhdChOTE1URVNUX0RJUiwgJnN0YikgPCAwKSB7CisJCXBlcnJvcigiY291bGRuJ3Qgc3RhdCBtb3VudCBwb2ludCAiIE5MTVRFU1RfRElSKTsKKwkJZXhpdCgxKTsKKwl9CisJZi5maF94ZGV2ID0gc3RiLnN0X2RldjsKKwlmLmZoX3hpbm8gPSBzdGIuc3RfaW5vOworCisJaWYgKHN0YXQoTkxNVEVTVF9ESVIsICZzdGIpIDwgMCkgeworCQlwZXJyb3IoImNvdWxkbid0IHN0YXQgbW91bnQgcG9pbnQgIiBOTE1URVNUX0RJUik7CisJCWV4aXQoMSk7CisJfQorCWYuZmhfZGV2ID0gc3RiLnN0X2RldjsKKwlmLmZoX2lubyA9IHN0Yi5zdF9pbm87CisKKwlmLmZoX3ZlcnNpb24gPSBOTE1URVNUX1ZFUlNJT047CisjZWxzZQorCWYuZmhfeGRldiA9IDB4ODAxOworCWYuZmhfeGlubyA9IDM3NTk2OworCWYuZmhfZGV2ICA9IDB4ODAxOworCWYuZmhfaW5vICA9IDM3NzMyOworI2VuZGlmCisKKwlmaC0+bl9sZW4gICA9IDMyOworCWZoLT5uX2J5dGVzID0gKHZvaWQgKikgJmY7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliNzBjOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNkZWJ1Zy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworQ0M9JChDQ19GT1JfQlVJTEQpCitMSUJUT09MID0gQExJQlRPT0xAIC0tdGFnPUNDCisKK21hbjhfTUFOUyA9IHJwY2RlYnVnLm1hbgorRVhUUkFfRElTVCA9ICQobWFuOF9NQU5TKQorCitzYmluX1BST0dSQU1TID0gcnBjZGVidWcKK3JwY2RlYnVnX1NPVVJDRVMgPSBycGNkZWJ1Zy5jCitycGNkZWJ1Z19DRkxBR1M9JChDRkxBR1NfRk9SX0JVSUxEKQorcnBjZGVidWdfQ1BQRkxBR1M9JChDUFBGTEFHU19GT1JfQlVJTEQpIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKK3JwY2RlYnVnX0xERkxBR1M9JChMREZMQUdTX0ZPUl9CVUlMRCkKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2RlYnVnL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2RlYnVnL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NWE4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw2NjIgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3NiaW5fUFJPR1JBTVMgPSBycGNkZWJ1ZyQoRVhFRVhUKQorc3ViZGlyID0gdG9vbHMvcnBjZGVidWcKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSIKK1BST0dSQU1TID0gJChzYmluX1BST0dSQU1TKQorYW1fcnBjZGVidWdfT0JKRUNUUyA9IHJwY2RlYnVnLXJwY2RlYnVnLiQoT0JKRVhUKQorcnBjZGVidWdfT0JKRUNUUyA9ICQoYW1fcnBjZGVidWdfT0JKRUNUUykKK3JwY2RlYnVnX0xEQUREID0gJChMREFERCkKK3JwY2RlYnVnX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChycGNkZWJ1Z19DRkxBR1MpICQoQ0ZMQUdTKSBcCisJJChycGNkZWJ1Z19MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKHJwY2RlYnVnX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKHJwY2RlYnVnX1NPVVJDRVMpCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKG1hbjhfTUFOUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gJChDQ19GT1JfQlVJTEQpCitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQCAtLXRhZz1DQworTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK21hbjhfTUFOUyA9IHJwY2RlYnVnLm1hbgorRVhUUkFfRElTVCA9ICQobWFuOF9NQU5TKQorcnBjZGVidWdfU09VUkNFUyA9IHJwY2RlYnVnLmMKK3JwY2RlYnVnX0NGTEFHUyA9ICQoQ0ZMQUdTX0ZPUl9CVUlMRCkKK3JwY2RlYnVnX0NQUEZMQUdTID0gJChDUFBGTEFHU19GT1JfQlVJTEQpIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKK3JwY2RlYnVnX0xERkxBR1MgPSAkKExERkxBR1NfRk9SX0JVSUxEKQorTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvcnBjZGVidWcvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvcnBjZGVidWcvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitpbnN0YWxsLXNiaW5QUk9HUkFNUzogJChzYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoc2JpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHNiaW5kaXIpIgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChzYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKKwl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIHx8IHRlc3QgLWYgJCRwMTsgXAorCSAgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIC1lICdzfC4qfC58JyBcCisJICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCisJc2VkICdOO047TjtzLFxuLCAsZycgfCBcCisJJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKHNiaW5kaXIpJCRkaXInIjsgXAorCSAgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAiJChERVNURElSKSQoc2JpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgfSBcCisJOyBkb25lCisKK3VuaW5zdGFsbC1zYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKKwkgIHNlZCAtZSAnaDtzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pJyBcCisJICAgICAgLWUgJ3MvJCQvJChFWEVFWFQpLycgYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKHNiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoc2JpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKKworY2xlYW4tc2JpblBST0dSQU1TOgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CitycGNkZWJ1ZyQoRVhFRVhUKTogJChycGNkZWJ1Z19PQkpFQ1RTKSAkKHJwY2RlYnVnX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHJwY2RlYnVnJChFWEVFWFQpCisJJChycGNkZWJ1Z19MSU5LKSAkKHJwY2RlYnVnX09CSkVDVFMpICQocnBjZGVidWdfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY2RlYnVnLXJwY2RlYnVnLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK3JwY2RlYnVnLXJwY2RlYnVnLm86IHJwY2RlYnVnLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHJwY2RlYnVnX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2RlYnVnX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNkZWJ1Zy1ycGNkZWJ1Zy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNkZWJ1Zy1ycGNkZWJ1Zy5UcG8gLWMgLW8gcnBjZGVidWctcnBjZGVidWcubyBgdGVzdCAtZiAncnBjZGVidWcuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjZGVidWcuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNkZWJ1Zy1ycGNkZWJ1Zy5UcG8gJChERVBESVIpL3JwY2RlYnVnLXJwY2RlYnVnLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNkZWJ1Zy5jJyBvYmplY3Q9J3JwY2RlYnVnLXJwY2RlYnVnLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHJwY2RlYnVnX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2RlYnVnX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJwY2RlYnVnLXJwY2RlYnVnLm8gYHRlc3QgLWYgJ3JwY2RlYnVnLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY2RlYnVnLmMKKworcnBjZGVidWctcnBjZGVidWcub2JqOiBycGNkZWJ1Zy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChycGNkZWJ1Z19DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNkZWJ1Z19DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcnBjZGVidWctcnBjZGVidWcub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNkZWJ1Zy1ycGNkZWJ1Zy5UcG8gLWMgLW8gcnBjZGVidWctcnBjZGVidWcub2JqIGBpZiB0ZXN0IC1mICdycGNkZWJ1Zy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY2RlYnVnLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY2RlYnVnLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZGVidWctcnBjZGVidWcuVHBvICQoREVQRElSKS9ycGNkZWJ1Zy1ycGNkZWJ1Zy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjZGVidWcuYycgb2JqZWN0PSdycGNkZWJ1Zy1ycGNkZWJ1Zy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHJwY2RlYnVnX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2RlYnVnX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJwY2RlYnVnLXJwY2RlYnVnLm9iaiBgaWYgdGVzdCAtZiAncnBjZGVidWcuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNkZWJ1Zy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNkZWJ1Zy5jJzsgZmlgCisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLW1hbjg6ICQobWFuOF9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuOGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjhkaXIpIgorCUBsaXN0PSckKG1hbjhfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjhkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuOGRpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuOGRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuODoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG1hbjhfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjhkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuOGRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjhkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBsaXN0PSckKE1BTlMpJzsgaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICAgIGlmIHRlc3QgLWYgIiQkZCQkcCI7IHRoZW4gZWNobyAiJCRkJCRwIjsgZWxzZSA6OyBmaTsgZG9uZWA7IFwKKwkgIGlmIHRlc3QgLW4gIiQkbGlzdCIgJiYgXAorCSAgICBncmVwICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCA+L2Rldi9udWxsOyB0aGVuIFwKKwkgICAgZWNobyAiZXJyb3I6IGZvdW5kIG1hbiBwYWdlcyBjb250YWluaW5nIHRoZSBcYG1pc3NpbmcgaGVscDJtYW4nIHJlcGxhY2VtZW50IHRleHQ6IiA+JjI7IFwKKwkgICAgZ3JlcCAtbCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgfCBzZWQgJ3MvXi8gICAgICAgICAvJyA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHRvIGZpeCB0aGVtLCBpbnN0YWxsIGhlbHAybWFuLCByZW1vdmUgYW5kIHJlZ2VuZXJhdGUgdGhlIG1hbiBwYWdlczsiID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdHlwaWNhbGx5IFxgbWFrZSBtYWludGFpbmVyLWNsZWFuJyB3aWxsIHJlbW92ZSB0aGVtIiA+JjI7IFwKKwkgICAgZXhpdCAxOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZWxzZSA6OyBmaQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgXAorCW1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1zYmluUFJPR1JBTVMKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjgKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtc2JpblBST0dSQU1TCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLW1hbjggaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBcCisJaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXNiaW5QUk9HUkFNUyBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbjggXAorCXVuaW5zdGFsbC1zYmluUFJPR1JBTVMKKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvcnBjZGVidWcuYyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNkZWJ1Zy9ycGNkZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWE0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvcnBjZGVidWcuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIEdldCBvciBzZXQgUlBDIGRlYnVnIGZsYWdzLgorICoKKyAqIEkgd291bGQgaGF2ZSBsb3ZlZCB0byB3cml0ZSB0aGlzIHdpdGhvdXQgcmVjb3Vyc2UgdG8gdGhlIHN5c2N0bAorICogaW50ZXJmYWNlLCBidXQgdGhlIG9ubHkgcGxhdXNpYmxlIGFwcHJvYWNoIChyZWFkaW5nIGFuZCB3cml0aW5nCisgKiAvZGV2L2ttZW0gYXQgdGhlIG9mZnNldHMgaW5kaWNhdGVkIGJ5IHRoZSBfZGVidWcgc3ltYm9scyBmcm9tCisgKiAvcHJvYy9rc3ltcykgZGlkbid0IHdvcmssIGJlY2F1c2UgL2Rldi9rbWVtIGRvZXNuJ3QgdHJhbnNsYXRlIHZpcnR1YWwKKyAqIGFkZHJlc3NlcyBvbiB3cml0ZS4gVW5mb3J0dW5hdGVseSwgbW9kdWxlcyBhcmUgc3R1ZmZlZCBpbnRvIG1lbW9yeQorICogYWxsb2NhdGVkIHZpYSB2bWFsbG9jLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKiAgICAgICAgICAgKEMpIDIwMDQgPGZyZWRlcmljLmpvbGx5QGJ1bGwuZXh0Lm5ldD4KKyAqCisgKiAwNi8xNS8yMDA0OiB1cGRhdGVkIGZvciBORlN2NAorICoKKyAqLworCisvKiAjaW5jbHVkZSAiY29uZmlnLmgiICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKy8qIFJQQyBkZWJ1ZyBmbGFncworICAgI2luY2x1ZGUgPHN1bnJwYy9kZWJ1Zy5oPiAqLworLyogTkZTIGRlYnVnIGZsYWdzCisgICAjaW5jbHVkZSA8bmZzX2ZzLmg+ICovCisvKiBORlNEIGFuZCBOTE0gZGVidWcgZmxhZ3MKKyAgICNpbmNsdWRlIDxuZnNkL2RlYnVnLmg+ICovCisjaW5jbHVkZSA8bmZzL2RlYnVnLmg+CisKK3N0YXRpYyBpbnQJCXZlcmJvc2UgPSAwOworc3RhdGljIGNoYXIqICAgICAgICAgICAgY2RlbmFtZTsKKworc3RhdGljIHVuc2lnbmVkIGludAlmaW5kX2ZsYWcoY2hhciAqKm1vZHVsZSwgY2hhciAqbmFtZSk7CitzdGF0aWMgdW5zaWduZWQgaW50CWdldF9mbGFncyhjaGFyICopOworc3RhdGljIHVuc2lnbmVkIGludAlzZXRfZmxhZ3MoY2hhciAqLCB1bnNpZ25lZCBpbnQgdmFsdWUpOworc3RhdGljIHZvaWQJCXByaW50X2ZsYWdzKEZJTEUgKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCk7CitzdGF0aWMgY2hhciAqCQlzdHJ0b2xvd2VyKGNoYXIgKnN0cik7CitzdGF0aWMgdm9pZAkJdXNhZ2UoaW50IGV4Y29kZSwgY2hhciAqbW9kdWxlKTsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQJCW9wdF9zID0gMCwKKwkJCW9wdF9jID0gMDsKKwl1bnNpZ25lZCBpbnQJZmxhZ3MgPSAwLCBvZmxhZ3M7CisJY2hhciAqCQltb2R1bGUgPSBOVUxMOworCWludAkJYzsKKworCWNkZW5hbWUgPSBtYWxsb2Moc3RybGVuKGJhc2VuYW1lKGFyZ3ZbMF0pKSk7CisJaWYgKGNkZW5hbWUgPT0gTlVMTCkgeworCSAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgaW4gbWFsbG9jXG4iKTsKKwkgIGV4aXQoMSk7CisgICAgICAgIH0KKwlzdHJjcHkoY2RlbmFtZSwgYmFzZW5hbWUoYXJndlswXSkpOworCisJaWYgKCFzdHJjbXAoY2RlbmFtZSwgIm5mc2RlYnVnIikpIHsKKwkgIG1vZHVsZSA9ICJuZnMiOworCX0KKwllbHNlIGlmICghc3RyY21wKGNkZW5hbWUsICJuZnNkZGVidWciKSkgeworCSAgbW9kdWxlID0gIm5mc2QiOworCX0KKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiY2htOnN2IikpICE9IEVPRikgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnYyc6CisJCQlvcHRfYyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQl1c2FnZSgwLCBtb2R1bGUpOworCQljYXNlICdtJzoKKwkJCW1vZHVsZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCW9wdF9zID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmJvc2UrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gb3B0aW9uIC0lY1xuIiwgY2RlbmFtZSwgb3B0b3B0KTsKKwkJCXVzYWdlKDEsIG1vZHVsZSk7CisJCX0KKwl9CisKKwlpZiAob3B0X2MgKyBvcHRfcyA+IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIHVzZSBhdCBtb3N0IG9uZSBvZiAtYyBhbmQgLXNcbiIpOworCQl1c2FnZSgxLCBtb2R1bGUpOworCX0KKworCWlmICghbW9kdWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vIG1vZHVsZSBuYW1lIHNwZWNpZmllZC5cbiIsIGNkZW5hbWUpOworCQl1c2FnZSgxLCBtb2R1bGUpOworCX0KKworCWlmIChzdHJjbXAobW9kdWxlLCAibmZzZCIpICYmCisJICAgIHN0cmNtcChtb2R1bGUsICJuZnMiKSAmJgorCSAgICBzdHJjbXAobW9kdWxlLCAibmxtIikgJiYKKwkgICAgc3RyY21wKG1vZHVsZSwgInJwYyIpKSB7CisJICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmtub3duIG1vZHVsZTogJXNcbiIsIGNkZW5hbWUsIG1vZHVsZSk7CisJCXVzYWdlKDEsIG1vZHVsZSk7CisJfQorCisJaWYgKGFyZ2MgPT0gb3B0aW5kKSB7CisJCWZsYWdzID0gfih1bnNpZ25lZCBpbnQpIDA7CisJfSBlbHNlIHsKKwkJZm9yICg7IG9wdGluZCA8IGFyZ2M7IG9wdGluZCsrKQorCQkJZmxhZ3MgfD0gZmluZF9mbGFnKCZtb2R1bGUsIGFyZ3Zbb3B0aW5kXSk7CisJCWlmIChmbGFncyAmJiAhb3B0X2MpCisJCQlvcHRfcyA9IDE7CisJfQorCisJb2ZsYWdzID0gZ2V0X2ZsYWdzKG1vZHVsZSk7CisKKwlpZiAob3B0X2MpIHsKKwkJb2ZsYWdzID0gc2V0X2ZsYWdzKG1vZHVsZSwgb2ZsYWdzICYgfmZsYWdzKTsKKwl9IGVsc2UgaWYgKG9wdF9zKSB7CisJCW9mbGFncyA9IHNldF9mbGFncyhtb2R1bGUsIG9mbGFncyB8IGZsYWdzKTsKKwl9CisJcHJpbnRfZmxhZ3Moc3Rkb3V0LCBtb2R1bGUsIG9mbGFncywgMCk7CisJaWYgKHZlcmJvc2UpIHsKKwkgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXG5Nb2R1bGUgICAgIFZhbGlkIGZsYWdzXG4iKTsKKwkgICAgICAgIHByaW50X2ZsYWdzKHN0ZG91dCwgbW9kdWxlLCB+KHVuc2lnbmVkIGludCkgMCwgMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRkxBRyhtbmFtZSwgZm5hbWUpCVwKKyAgICAgIHsgI21uYW1lLCAjZm5hbWUsIG1uYW1lIyNEQkdfIyNmbmFtZSB9CisKK3N0YXRpYyBzdHJ1Y3QgZmxhZ21hcCB7CisJY2hhciAqCQltb2R1bGU7CisJY2hhciAqCQluYW1lOworCXVuc2lnbmVkIGludAl2YWx1ZTsKK30JCQlmbGFnbWFwW10gPSB7CisJLyogcnBjICovCisJRkxBRyhSUEMsCVhQUlQpLAorCUZMQUcoUlBDLAlDQUxMKSwKKwlGTEFHKFJQQywJREVCVUcpLAorCUZMQUcoUlBDLAlORlMpLAorCUZMQUcoUlBDLAlBVVRIKSwKKwlGTEFHKFJQQywJQklORCksCisJRkxBRyhSUEMsCVNDSEVEKSwKKwlGTEFHKFJQQywJVFJBTlMpLAorCUZMQUcoUlBDLAlTVkNTT0NLKSwKKwlGTEFHKFJQQywJU1ZDRFNQKSwKKwlGTEFHKFJQQywJTUlTQyksCisJRkxBRyhSUEMsCUNBQ0hFKSwKKwlGTEFHKFJQQywJQUxMKSwKKworCS8qIG5mcyAqLworCUZMQUcoTkZTLAlWRlMpLAorCUZMQUcoTkZTLAlESVJDQUNIRSksCisJRkxBRyhORlMsCUxPT0tVUENBQ0hFKSwKKwlGTEFHKE5GUywJUEFHRUNBQ0hFKSwKKwlGTEFHKE5GUywJUFJPQyksCisJRkxBRyhORlMsICAgICAgIFhEUiksCisJRkxBRyhORlMsICAgICAgIEZJTEUpLAorCUZMQUcoTkZTLCAgICAgICBST09UKSwKKwlGTEFHKE5GUywgICAgICAgQ0FMTEJBQ0spLAorCUZMQUcoTkZTLCAgICAgICBDTElFTlQpLAorCUZMQUcoTkZTLCAgICAgICBNT1VOVCksCisJRkxBRyhORlMsCUFMTCksCisKKwkvKiBuZnNkICovCisJRkxBRyhORlNELAlTT0NLKSwKKwlGTEFHKE5GU0QsCUZIKSwKKwlGTEFHKE5GU0QsCUVYUE9SVCksCisJRkxBRyhORlNELAlTVkMpLAorCUZMQUcoTkZTRCwJUFJPQyksCisJRkxBRyhORlNELAlGSUxFT1ApLAorCUZMQUcoTkZTRCwJQVVUSCksCisJRkxBRyhORlNELAlSRVBDQUNIRSksCisJRkxBRyhORlNELAlYRFIpLAorCUZMQUcoTkZTRCwJTE9DS0QpLAorCUZMQUcoTkZTRCwJQUxMKSwKKworCS8qIGxvY2tkICovCisJRkxBRyhOTE0sCVNWQyksCisJRkxBRyhOTE0sCUNMSUVOVCksCisJRkxBRyhOTE0sCUNMTlRMT0NLKSwKKwlGTEFHKE5MTSwJU1ZDTE9DSyksCisJRkxBRyhOTE0sCU1PTklUT1IpLAorCUZMQUcoTkxNLAlDTE5UU1VCUyksCisJRkxBRyhOTE0sCVNWQ1NVQlMpLAorCUZMQUcoTkxNLCAgICAgICBIT1NUQ0FDSEUpLAorCUZMQUcoTkxNLCAgICAgICBYRFIpLAorCUZMQUcoTkxNLAlBTEwpLAorCisgICAgICB7IE5VTEwsCQlOVUxMLAkJMCB9Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50CitmaW5kX2ZsYWcoY2hhciAqKm1vZHVsZSwgY2hhciAqbmFtZSkKK3sKKwljaGFyCQkqbW9kID0gKm1vZHVsZTsKKwl1bnNpZ25lZCBpbnQJdmFsdWUgPSAwOworCWludAkJaTsKKworCWZvciAoaSA9IDA7IGZsYWdtYXBbaV0ubW9kdWxlOyBpKyspIHsKKwkJaWYgKChtb2QgJiYgc3RyY2FzZWNtcChtb2QsIGZsYWdtYXBbaV0ubW9kdWxlKSkKKwkJIHx8IHN0cmNhc2VjbXAobmFtZSwgZmxhZ21hcFtpXS5uYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodmFsdWUpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSIlczogYW1iaWd1b3VzIHN5bWJvbCBuYW1lICVzLlxuIgorCQkJCSJUaGlzIG5hbWUgaXMgdXNlZCBieSBtb3JlIHRoYW4gb25lIG1vZHVsZSwgIgorCQkJCSJwbGVhc2Ugc3BlY2lmeSB0aGUgbW9kdWxlIG5hbWUgdXNpbmdcbiIKKwkJCQkidGhlIC1tIG9wdGlvbi5cbiIsCisJCQkJY2RlbmFtZSwgbmFtZSk7CisJCQlleGl0KDEpOworCQl9CisJCXZhbHVlID0gZmxhZ21hcFtpXS52YWx1ZTsKKwkJaWYgKCptb2R1bGUpCisJCQlyZXR1cm4gdmFsdWU7CisJCW1vZCA9IGZsYWdtYXBbaV0ubW9kdWxlOworCX0KKworCWlmICghdmFsdWUpIHsKKwkJaWYgKCptb2R1bGUpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiJXM6IHVua25vd24gbW9kdWxlIG9yIGZsYWcgJXMvJXNcbiIsCisJCQkJY2RlbmFtZSwgKm1vZHVsZSwgbmFtZSk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSIlczogdW5rbm93biBmbGFnICVzXG4iLAorCQkJCWNkZW5hbWUsIG5hbWUpOworCQlleGl0KDEpOworCX0KKworCSptb2R1bGUgPSBtb2Q7CisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitnZXRfZmxhZ3MoY2hhciAqbW9kdWxlKQoreworCWNoYXIJYnVmZmVyWzI1Nl0sIGZpbGVuYW1lWzI1Nl07CisJaW50CXN5c2ZkLCBsZW47CisKKwlzbnByaW50ZihmaWxlbmFtZSwgMjU2LCAiL3Byb2Mvc3lzL3N1bnJwYy8lc19kZWJ1ZyIsIG1vZHVsZSk7CisKKwlpZiAoKHN5c2ZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpKSA8IDApIHsKKwkJcGVycm9yKGZpbGVuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChsZW4gPSByZWFkKHN5c2ZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKSkgPCAwKSB7CisJCXBlcnJvcigicmVhZCIpOworCQlleGl0KDEpOworCX0KKwljbG9zZShzeXNmZCk7CisJYnVmZmVyW2xlbiAtIDFdID0gJ1wwJzsKKworCXJldHVybiBzdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NldF9mbGFncyhjaGFyICptb2R1bGUsIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwljaGFyCWJ1ZmZlcls2NF0sIGZpbGVuYW1lWzI1Nl07CisJaW50CXN5c2ZkLCBsZW4sIHJldDsKKworCXNucHJpbnRmKGZpbGVuYW1lLCAyNTYsICIvcHJvYy9zeXMvc3VucnBjLyVzX2RlYnVnIiwgbW9kdWxlKTsKKworCWxlbiA9IHNwcmludGYoYnVmZmVyLCAiJWQiLCB2YWx1ZSk7CisJaWYgKChzeXNmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZKSkgPCAwKSB7CisJCXBlcnJvcihmaWxlbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocmV0ID0gd3JpdGUoc3lzZmQsIGJ1ZmZlciwgbGVuKSkgPCAwKSB7CisJCXBlcnJvcigid3JpdGUiKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHJldCA8IGxlbikgeworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBzaG9ydCB3cml0ZSBpbiBzZXRfZmxhZ3MhXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJY2xvc2Uoc3lzZmQpOworCXJldHVybiB2YWx1ZTsKK30KKworCitzdGF0aWMgY2hhciAqCitzdHJ0b2xvd2VyKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgY2hhcgl0ZW1wWzY0XTsKKwljaGFyCQkqc3A7CisKKwlzdHJjcHkodGVtcCwgc3RyKTsKKwlmb3IgKHNwID0gdGVtcDsgKnNwOyBzcCsrKQorCQkqc3AgPSB0b2xvd2VyKCpzcCk7CisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9mbGFncyhGSUxFICpvZnAsIGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzLCBpbnQgc2hvd19hbGwpCit7CisJY2hhcgkJKmxhc3Rtb2QgPSBOVUxMOworCXVuc2lnbmVkIGludAlzaG93biA9IDA7CisJaW50CQlpOworCisJaWYgKG1vZHVsZSkgeworCQlmcHJpbnRmKG9mcCwgIiUtMTBzIiwgc3RydG9sb3dlcihtb2R1bGUpKTsKKwkJaWYgKCFmbGFncykgeworCQkJZnByaW50ZihvZnAsICI8bm8gZmxhZ3Mgc2V0PlxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwLCBzaG93biA9IDA7IGZsYWdtYXBbaV0ubW9kdWxlOyBpKyspIHsKKwkJaWYgKG1vZHVsZSkgeworCQkJaWYgKHN0cmNhc2VjbXAoZmxhZ21hcFtpXS5tb2R1bGUsIG1vZHVsZSkpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoIWxhc3Rtb2QgfHwgc3RyY21wKGxhc3Rtb2QsIGZsYWdtYXBbaV0ubW9kdWxlKSkgeworCQkJaWYgKGxhc3Rtb2QpIHsKKwkJCQlmcHJpbnRmKG9mcCwgIlxuIik7CisJCQkJc2hvd24gPSAwOworCQkJfQorCQkJZnByaW50ZihvZnAsICIlLTEwcyIsIHN0cnRvbG93ZXIoZmxhZ21hcFtpXS5tb2R1bGUpKTsKKwkJCWxhc3Rtb2QgPSBmbGFnbWFwW2ldLm1vZHVsZTsKKwkJfQorCQlpZiAoIShmbGFncyAmIGZsYWdtYXBbaV0udmFsdWUpCisJCSB8fCAoIXNob3dfYWxsICYmIChzaG93biAmIGZsYWdtYXBbaV0udmFsdWUpKQorCQkgfHwgKG1vZHVsZSAmJiAhc3RyY2FzZWNtcChmbGFnbWFwW2ldLm5hbWUsICJhbGwiKSkpCisJCQljb250aW51ZTsKKwkJZnByaW50ZihvZnAsICIgJXMiLCBzdHJ0b2xvd2VyKGZsYWdtYXBbaV0ubmFtZSkpOworCQlzaG93biB8PSBmbGFnbWFwW2ldLnZhbHVlOworCX0KKwlmcHJpbnRmKG9mcCwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShpbnQgZXhjb2RlLCBjaGFyICptb2R1bGUpCit7CisgICAgICAgIGlmIChtb2R1bGUpCisJICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLXZdIFstaF0gWy1zIGZsYWdzLi4ufC1jIGZsYWdzLi4uXVxuIiwgY2RlbmFtZSk7CisJZWxzZQorCSAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgWy12XSBbLWhdIFstbSBtb2R1bGVdIFstcyBmbGFncy4uLnwtYyBmbGFncy4uLl1cbiIsIGNkZW5hbWUpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgIHNldCBvciBjYW5jZWwgZGVidWcgZmxhZ3MuXG4iKTsKKwlpZiAodmVyYm9zZSkgeworCSAgZnByaW50ZihzdGRlcnIsICJcbk1vZHVsZSAgICAgVmFsaWQgZmxhZ3NcbiIpOworCSAgcHJpbnRfZmxhZ3Moc3RkZXJyLCBtb2R1bGUsIH4odW5zaWduZWQgaW50KSAwLCAxKTsKKwl9IGVsc2UgeworCSAgaWYgKG1vZHVsZSkKKwkgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgKHVzZSAlcyAtdmggdG8gZ2V0IGEgbGlzdCBvZiB2YWxpZCBmbGFncylcbiIsIGNkZW5hbWUpOworCSAgZWxzZQorCSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAodXNlICVzIC12aCB0byBnZXQgYSBsaXN0IG9mIG1vZHVsZXMgYW5kIHZhbGlkIGZsYWdzKVxuIiwgY2RlbmFtZSk7CisJfQorCWV4aXQgKGV4Y29kZSk7Cit9CisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9ycGNkZWJ1Zy9ycGNkZWJ1Zy5tYW4gYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvcnBjZGVidWcubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NTU5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZGVidWcvcnBjZGVidWcubWFuCkBAIC0wLDAgKzEsODggQEAKKy5cIgorLlwiIHJwY2RlYnVnKDgpCisuXCIgCisuXCIgQnkgR3JlZyBCYW5rcyA8Z25iQG1lbGJvdXJuZS5zZ2kuY29tPgorLlwiIENvcHlyaWdodCAoYykgMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisuXCIgRGVyaXZlZCBmcm9tIG5mc3N0YXQubWFuIHdoaWNoIGJvcmUgdGhlIG1lc3NhZ2U6CisuXCIgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgT2xhZiBLaXJjaCA8b2tpckBzdXNlLmRlPgorLlRIIHJwY2RlYnVnIDggIjUgSnVsIDIwMDYiCisuU0ggTkFNRQorcnBjZGVidWcgXC0gc2V0IGFuZCBjbGVhciBORlMgYW5kIFJQQyBrZXJuZWwgZGVidWcgZmxhZ3MKKy5TSCBTWU5PUFNJUworXGZCcnBjZGVidWdcZlAgXGZCXC12aFxmUAorLmJyCitcZkJycGNkZWJ1Z1xmUCBcZkJcLW1cZlAgXGZJbW9kdWxlXGZQCisuYnIKK1xmQnJwY2RlYnVnXGZQIFxmQlwtbVxmUCBcZkltb2R1bGVcZlAgXGZCXC1zXGZQIFxmSWZsYWdzXGZQLi4uCisuYnIKK1xmQnJwY2RlYnVnXGZQIFxmQlwtbVxmUCBcZkltb2R1bGVcZlAgXGZCXC1jXGZQIFxmSWZsYWdzXGZQLi4uCisuYnIKKy5TSCBERVNDUklQVElPTgorVGhlIFxmQnJwY2RlYnVnXGZQIGNvbW1hbmQgYWxsb3dzIGFuIGFkbWluaXN0cmF0b3IgdG8gc2V0IGFuZCBjbGVhcgordGhlIExpbnV4IGtlcm5lbCdzIE5GUyBjbGllbnQgYW5kIHNlcnZlciBkZWJ1ZyBmbGFncy4gIFNldHRpbmcgdGhlc2UKK2ZsYWdzIGNhdXNlcyB0aGUga2VybmVsIHRvIGVtaXQgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cgaW4gcmVzcG9uc2UKK3RvIE5GUyBhY3Rpdml0eTsgdGhpcyBpcyB0eXBpY2FsbHkgdXNlZnVsIHdoZW4gZGVidWdnaW5nIE5GUyBwcm9ibGVtcy4KKy5QUAorVGhlIGZpcnN0IGZvcm0gaW4gdGhlIHN5bm9wc2lzIGNhbiBiZSB1c2VkIHRvIGxpc3QgYWxsIGF2YWlsYWJsZQorZGVidWcgZmxhZ3MuICBUaGUgc2Vjb25kIGZvcm0gc2hvd3MgdGhlIGN1cnJlbnRseSBzZXQgZGVidWcgZmxhZ3MKK2ZvciB0aGUgZ2l2ZW4gbW9kdWxlLiAgVGhlIHRoaXJkIGZvcm0gc2V0cyBvbmUgb3IgbW9yZSBmbGFncywgYW5kCit0aGUgZm91cnRoIGZvcm0gY2xlYXJzIG9uZSBvciBtb3JlIGZsYWdzLgorLlBQCitUaGUgdmFsdWUgXGZCYWxsXGZQIG1heSBiZSB1c2VkIHRvIHNldCBvciBjbGVhciBhbGwgdGhlIGZsYWdzIGZvcgordGhlIGdpdmVuIG1vZHVsZS4KKy5TSCBPUFRJT05TCisuXCIgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KKy5UUAorLkIgXC1jCitDbGVhciB0aGUgZ2l2ZW4gZGVidWcgZmxhZ3MuCisuXCIgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KKy5UUAorLkIgXC1oCitQcmludCBhIGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4gIFdoZW4gY29tYmluZWQgd2l0aCB0aGUgXGZCXC12XGZQCitvcHRpb24sIGFsc28gcHJpbnRzIHRoZSBhdmFpbGFibGUgZGVidWcgZmxhZ3MuCisuXCIgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KKy5UUAorLkJJIFwtbSAiIG1vZHVsZSIKK1NwZWNpZnkgd2hpY2ggbW9kdWxlJ3MgZmxhZ3MgdG8gc2V0IG9yIGNsZWFyLiAgQXZhaWxhYmxlCittb2R1bGVzIGFyZToKKy5SUworLlRQCisuQlIgbmZzZAorVGhlIE5GUyBzZXJ2ZXIuCisuVFAKKy5CUiBuZnMKK1RoZSBORlMgY2xpZW50LgorLlRQCisuQlIgbmxtCitUaGUgTmV0d29yayBMb2NrIE1hbmFnZXIsIGluIGVpdGhlciBhbiBORlMgY2xpZW50IG9yIHNlcnZlci4KKy5UUAorLkJSIHJwYworVGhlIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBtb2R1bGUsIGluIGVpdGhlciBhbiBORlMgY2xpZW50IG9yIHNlcnZlci4KKy5SRQorLlwiIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCisuVFAKKy5CIFwtcworU2V0IHRoZSBnaXZlbiBkZWJ1ZyBmbGFncy4KKy5cIiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorLlRQCisuQiBcLXYKK0luY3JlYXNlIHRoZSB2ZXJib3NpdHkgb2YgXGZCcnBjZGVidWdcZlAncyBvdXRwdXQuCisuXCIgLT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS0KKy5TSCBGSUxFUworLlRQCisuQiAvcHJvYy9zeXMvc3VucnBjL3tycGMsbmZzLG5mc2QsbmxtfV9kZWJ1ZworcHJvY2ZzXC1iYXNlZCBpbnRlcmZhY2UgdG8ga2VybmVsIGRlYnVnIGZsYWdzLgorLlwiIC09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tCisuU0ggU0VFIEFMU08KKy5CUiBycGMubmZzZCAoOCksCisuQlIgbmZzICg1KSwKKy5CUiBzeXNsb2dkICg4KS4KKy5cIiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorLlNIIEJVR1MKK0J1Z3MgY2FuIGJlIGZvdW5kIG9yIHJlcG9ydGVkIGF0CisuQlIgaHR0cDovL25mcy5zZi5uZXQvIC4KKy5cIiAtPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LQorLlNIIEFVVEhPUgorUHJvZ3JhbSBieSBPbGFmIEtpcmNoIDxva2lyQHN1c2UuZGU+IGFuZAorPGZyZWRlcmljLmpvbGx5QGJ1bGwuZXh0Lm5ldD4uCitNYW5wYWdlIGJ5IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4uCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWEyYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE4IEBACisjIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIHByb2R1Y2UgTWFrZWZpbGUuaW4KKworQ0M9JChDQ19GT1JfQlVJTEQpCitMSUJUT09MID0gQExJQlRPT0xAIC0tdGFnPUNDCisKK25vaW5zdF9QUk9HUkFNUyA9IHJwY2dlbgorcnBjZ2VuX1NPVVJDRVMgPSBycGNfY2xudG91dC5jIHJwY19jb3V0LmMgcnBjX2hvdXQuYyBycGNfbWFpbi5jIFwKKwkgICAgICAgCSBycGNfcGFyc2UuYyBycGNfc2Nhbi5jIHJwY19zdmNvdXQuYyBycGNfdGJsb3V0LmMgXAorCQkgcnBjX3V0aWwuYyBycGNfc2FtcGxlLmMgcnBjX291dHB1dC5oIHJwY19wYXJzZS5oIFwKKwkJIHJwY19zY2FuLmggcnBjX3V0aWwuaAorCitycGNnZW5fQ0ZMQUdTPSQoQ0ZMQUdTX0ZPUl9CVUlMRCkKK3JwY2dlbl9DUFBMQUdTPSQoQ1BQRkxBR1NfRk9SX0JVSUxEKQorcnBjZ2VuX0xERkxBR1M9JChMREZMQUdTX0ZPUl9CVUlMRCkKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCitFWFRSQV9ESVNUID0gcnBjZ2VuLm5ldy4xCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmU1N2EyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDY5MiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorbm9pbnN0X1BST0dSQU1TID0gcnBjZ2VuJChFWEVFWFQpCitzdWJkaXIgPSB0b29scy9ycGNnZW4KK0RJU1RfQ09NTU9OID0gUkVBRE1FICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorUFJPR1JBTVMgPSAkKG5vaW5zdF9QUk9HUkFNUykKK2FtX3JwY2dlbl9PQkpFQ1RTID0gcnBjZ2VuLXJwY19jbG50b3V0LiQoT0JKRVhUKSBcCisJcnBjZ2VuLXJwY19jb3V0LiQoT0JKRVhUKSBycGNnZW4tcnBjX2hvdXQuJChPQkpFWFQpIFwKKwlycGNnZW4tcnBjX21haW4uJChPQkpFWFQpIHJwY2dlbi1ycGNfcGFyc2UuJChPQkpFWFQpIFwKKwlycGNnZW4tcnBjX3NjYW4uJChPQkpFWFQpIHJwY2dlbi1ycGNfc3Zjb3V0LiQoT0JKRVhUKSBcCisJcnBjZ2VuLXJwY190YmxvdXQuJChPQkpFWFQpIHJwY2dlbi1ycGNfdXRpbC4kKE9CSkVYVCkgXAorCXJwY2dlbi1ycGNfc2FtcGxlLiQoT0JKRVhUKQorcnBjZ2VuX09CSkVDVFMgPSAkKGFtX3JwY2dlbl9PQkpFQ1RTKQorcnBjZ2VuX0xEQUREID0gJChMREFERCkKK3JwY2dlbl9MSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKHJwY2dlbl9MREZMQUdTKSAkKExERkxBR1MpIC1vICRACitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKHJwY2dlbl9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChycGNnZW5fU09VUkNFUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gJChDQ19GT1JfQlVJTEQpCitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQCAtLXRhZz1DQworTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK3JwY2dlbl9TT1VSQ0VTID0gcnBjX2NsbnRvdXQuYyBycGNfY291dC5jIHJwY19ob3V0LmMgcnBjX21haW4uYyBcCisJICAgICAgIAkgcnBjX3BhcnNlLmMgcnBjX3NjYW4uYyBycGNfc3Zjb3V0LmMgcnBjX3RibG91dC5jIFwKKwkJIHJwY191dGlsLmMgcnBjX3NhbXBsZS5jIHJwY19vdXRwdXQuaCBycGNfcGFyc2UuaCBcCisJCSBycGNfc2Nhbi5oIHJwY191dGlsLmgKKworcnBjZ2VuX0NGTEFHUyA9ICQoQ0ZMQUdTX0ZPUl9CVUlMRCkKK3JwY2dlbl9DUFBMQUdTID0gJChDUFBGTEFHU19GT1JfQlVJTEQpCitycGNnZW5fTERGTEFHUyA9ICQoTERGTEFHU19GT1JfQlVJTEQpCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCitFWFRSQV9ESVNUID0gcnBjZ2VuLm5ldy4xCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB0b29scy9ycGNnZW4vTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdG9vbHMvcnBjZ2VuL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgorCitjbGVhbi1ub2luc3RQUk9HUkFNUzoKKwlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CitycGNnZW4kKEVYRUVYVCk6ICQocnBjZ2VuX09CSkVDVFMpICQocnBjZ2VuX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHJwY2dlbiQoRVhFRVhUKQorCSQocnBjZ2VuX0xJTkspICQocnBjZ2VuX09CSkVDVFMpICQocnBjZ2VuX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ycGNnZW4tcnBjX2NsbnRvdXQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY2dlbi1ycGNfY291dC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcnBjZ2VuLXJwY19ob3V0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ycGNnZW4tcnBjX21haW4uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY2dlbi1ycGNfcGFyc2UuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY2dlbi1ycGNfc2FtcGxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ycGNnZW4tcnBjX3NjYW4uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3JwY2dlbi1ycGNfc3Zjb3V0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ycGNnZW4tcnBjX3RibG91dC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcnBjZ2VuLXJwY191dGlsLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK3JwY2dlbi1ycGNfY2xudG91dC5vOiBycGNfY2xudG91dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfY2xudG91dC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNnZW4tcnBjX2NsbnRvdXQuVHBvIC1jIC1vIHJwY2dlbi1ycGNfY2xudG91dC5vIGB0ZXN0IC1mICdycGNfY2xudG91dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfY2xudG91dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfY2xudG91dC5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfY2xudG91dC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX2NsbnRvdXQuYycgb2JqZWN0PSdycGNnZW4tcnBjX2NsbnRvdXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJwY2dlbi1ycGNfY2xudG91dC5vIGB0ZXN0IC1mICdycGNfY2xudG91dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfY2xudG91dC5jCisKK3JwY2dlbi1ycGNfY2xudG91dC5vYmo6IHJwY19jbG50b3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcnBjZ2VuLXJwY19jbG50b3V0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcnBjZ2VuLXJwY19jbG50b3V0LlRwbyAtYyAtbyBycGNnZW4tcnBjX2NsbnRvdXQub2JqIGBpZiB0ZXN0IC1mICdycGNfY2xudG91dC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY19jbG50b3V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY19jbG50b3V0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZ2VuLXJwY19jbG50b3V0LlRwbyAkKERFUERJUikvcnBjZ2VuLXJwY19jbG50b3V0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfY2xudG91dC5jJyBvYmplY3Q9J3JwY2dlbi1ycGNfY2xudG91dC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX2NsbnRvdXQub2JqIGBpZiB0ZXN0IC1mICdycGNfY2xudG91dC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY19jbG50b3V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY19jbG50b3V0LmMnOyBmaWAKKworcnBjZ2VuLXJwY19jb3V0Lm86IHJwY19jb3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcnBjZ2VuLXJwY19jb3V0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfY291dC5UcG8gLWMgLW8gcnBjZ2VuLXJwY19jb3V0Lm8gYHRlc3QgLWYgJ3JwY19jb3V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY19jb3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZ2VuLXJwY19jb3V0LlRwbyAkKERFUERJUikvcnBjZ2VuLXJwY19jb3V0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfY291dC5jJyBvYmplY3Q9J3JwY2dlbi1ycGNfY291dC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY19jb3V0Lm8gYHRlc3QgLWYgJ3JwY19jb3V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY19jb3V0LmMKKworcnBjZ2VuLXJwY19jb3V0Lm9iajogcnBjX2NvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX2NvdXQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNnZW4tcnBjX2NvdXQuVHBvIC1jIC1vIHJwY2dlbi1ycGNfY291dC5vYmogYGlmIHRlc3QgLWYgJ3JwY19jb3V0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncnBjX2NvdXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnBjX2NvdXQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX2NvdXQuVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX2NvdXQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JwY19jb3V0LmMnIG9iamVjdD0ncnBjZ2VuLXJwY19jb3V0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJwY2dlbi1ycGNfY291dC5vYmogYGlmIHRlc3QgLWYgJ3JwY19jb3V0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncnBjX2NvdXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnBjX2NvdXQuYyc7IGZpYAorCitycGNnZW4tcnBjX2hvdXQubzogcnBjX2hvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX2hvdXQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcnBjZ2VuLXJwY19ob3V0LlRwbyAtYyAtbyBycGNnZW4tcnBjX2hvdXQubyBgdGVzdCAtZiAncnBjX2hvdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX2hvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX2hvdXQuVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX2hvdXQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JwY19ob3V0LmMnIG9iamVjdD0ncnBjZ2VuLXJwY19ob3V0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX2hvdXQubyBgdGVzdCAtZiAncnBjX2hvdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX2hvdXQuYworCitycGNnZW4tcnBjX2hvdXQub2JqOiBycGNfaG91dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfaG91dC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfaG91dC5UcG8gLWMgLW8gcnBjZ2VuLXJwY19ob3V0Lm9iaiBgaWYgdGVzdCAtZiAncnBjX2hvdXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfaG91dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfaG91dC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfaG91dC5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfaG91dC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX2hvdXQuYycgb2JqZWN0PSdycGNnZW4tcnBjX2hvdXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY19ob3V0Lm9iaiBgaWYgdGVzdCAtZiAncnBjX2hvdXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfaG91dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfaG91dC5jJzsgZmlgCisKK3JwY2dlbi1ycGNfbWFpbi5vOiBycGNfbWFpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfbWFpbi5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNnZW4tcnBjX21haW4uVHBvIC1jIC1vIHJwY2dlbi1ycGNfbWFpbi5vIGB0ZXN0IC1mICdycGNfbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfbWFpbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfbWFpbi5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfbWFpbi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX21haW4uYycgb2JqZWN0PSdycGNnZW4tcnBjX21haW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJwY2dlbi1ycGNfbWFpbi5vIGB0ZXN0IC1mICdycGNfbWFpbi5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfbWFpbi5jCisKK3JwY2dlbi1ycGNfbWFpbi5vYmo6IHJwY19tYWluLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcnBjZ2VuLXJwY19tYWluLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcnBjZ2VuLXJwY19tYWluLlRwbyAtYyAtbyBycGNnZW4tcnBjX21haW4ub2JqIGBpZiB0ZXN0IC1mICdycGNfbWFpbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY19tYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY19tYWluLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZ2VuLXJwY19tYWluLlRwbyAkKERFUERJUikvcnBjZ2VuLXJwY19tYWluLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfbWFpbi5jJyBvYmplY3Q9J3JwY2dlbi1ycGNfbWFpbi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX21haW4ub2JqIGBpZiB0ZXN0IC1mICdycGNfbWFpbi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY19tYWluLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY19tYWluLmMnOyBmaWAKKworcnBjZ2VuLXJwY19wYXJzZS5vOiBycGNfcGFyc2UuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3BhcnNlLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfcGFyc2UuVHBvIC1jIC1vIHJwY2dlbi1ycGNfcGFyc2UubyBgdGVzdCAtZiAncnBjX3BhcnNlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY19wYXJzZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfcGFyc2UuVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX3BhcnNlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfcGFyc2UuYycgb2JqZWN0PSdycGNnZW4tcnBjX3BhcnNlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX3BhcnNlLm8gYHRlc3QgLWYgJ3JwY19wYXJzZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfcGFyc2UuYworCitycGNnZW4tcnBjX3BhcnNlLm9iajogcnBjX3BhcnNlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgcnBjZ2VuLXJwY19wYXJzZS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfcGFyc2UuVHBvIC1jIC1vIHJwY2dlbi1ycGNfcGFyc2Uub2JqIGBpZiB0ZXN0IC1mICdycGNfcGFyc2UuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfcGFyc2UuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnBjX3BhcnNlLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZ2VuLXJwY19wYXJzZS5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfcGFyc2UuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JwY19wYXJzZS5jJyBvYmplY3Q9J3JwY2dlbi1ycGNfcGFyc2Uub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY19wYXJzZS5vYmogYGlmIHRlc3QgLWYgJ3JwY19wYXJzZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY19wYXJzZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfcGFyc2UuYyc7IGZpYAorCitycGNnZW4tcnBjX3NjYW4ubzogcnBjX3NjYW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3NjYW4ubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcnBjZ2VuLXJwY19zY2FuLlRwbyAtYyAtbyBycGNnZW4tcnBjX3NjYW4ubyBgdGVzdCAtZiAncnBjX3NjYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX3NjYW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX3NjYW4uVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX3NjYW4uUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JwY19zY2FuLmMnIG9iamVjdD0ncnBjZ2VuLXJwY19zY2FuLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX3NjYW4ubyBgdGVzdCAtZiAncnBjX3NjYW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX3NjYW4uYworCitycGNnZW4tcnBjX3NjYW4ub2JqOiBycGNfc2Nhbi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfc2Nhbi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfc2Nhbi5UcG8gLWMgLW8gcnBjZ2VuLXJwY19zY2FuLm9iaiBgaWYgdGVzdCAtZiAncnBjX3NjYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfc2Nhbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfc2Nhbi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfc2Nhbi5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfc2Nhbi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX3NjYW4uYycgb2JqZWN0PSdycGNnZW4tcnBjX3NjYW4ub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY19zY2FuLm9iaiBgaWYgdGVzdCAtZiAncnBjX3NjYW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfc2Nhbi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfc2Nhbi5jJzsgZmlgCisKK3JwY2dlbi1ycGNfc3Zjb3V0Lm86IHJwY19zdmNvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3N2Y291dC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNnZW4tcnBjX3N2Y291dC5UcG8gLWMgLW8gcnBjZ2VuLXJwY19zdmNvdXQubyBgdGVzdCAtZiAncnBjX3N2Y291dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfc3Zjb3V0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZ2VuLXJwY19zdmNvdXQuVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX3N2Y291dC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX3N2Y291dC5jJyBvYmplY3Q9J3JwY2dlbi1ycGNfc3Zjb3V0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX3N2Y291dC5vIGB0ZXN0IC1mICdycGNfc3Zjb3V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY19zdmNvdXQuYworCitycGNnZW4tcnBjX3N2Y291dC5vYmo6IHJwY19zdmNvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3N2Y291dC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfc3Zjb3V0LlRwbyAtYyAtbyBycGNnZW4tcnBjX3N2Y291dC5vYmogYGlmIHRlc3QgLWYgJ3JwY19zdmNvdXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfc3Zjb3V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY19zdmNvdXQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX3N2Y291dC5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfc3Zjb3V0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfc3Zjb3V0LmMnIG9iamVjdD0ncnBjZ2VuLXJwY19zdmNvdXQub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY19zdmNvdXQub2JqIGBpZiB0ZXN0IC1mICdycGNfc3Zjb3V0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncnBjX3N2Y291dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfc3Zjb3V0LmMnOyBmaWAKKworcnBjZ2VuLXJwY190YmxvdXQubzogcnBjX3RibG91dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfdGJsb3V0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfdGJsb3V0LlRwbyAtYyAtbyBycGNnZW4tcnBjX3RibG91dC5vIGB0ZXN0IC1mICdycGNfdGJsb3V0LmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY190YmxvdXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX3RibG91dC5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfdGJsb3V0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfdGJsb3V0LmMnIG9iamVjdD0ncnBjZ2VuLXJwY190YmxvdXQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHJwY2dlbi1ycGNfdGJsb3V0Lm8gYHRlc3QgLWYgJ3JwY190YmxvdXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX3RibG91dC5jCisKK3JwY2dlbi1ycGNfdGJsb3V0Lm9iajogcnBjX3RibG91dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfdGJsb3V0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvcnBjZ2VuLXJwY190YmxvdXQuVHBvIC1jIC1vIHJwY2dlbi1ycGNfdGJsb3V0Lm9iaiBgaWYgdGVzdCAtZiAncnBjX3RibG91dC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3JwY190YmxvdXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvcnBjX3RibG91dC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfdGJsb3V0LlRwbyAkKERFUERJUikvcnBjZ2VuLXJwY190YmxvdXQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JwY190YmxvdXQuYycgb2JqZWN0PSdycGNnZW4tcnBjX3RibG91dC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX3RibG91dC5vYmogYGlmIHRlc3QgLWYgJ3JwY190YmxvdXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfdGJsb3V0LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY190YmxvdXQuYyc7IGZpYAorCitycGNnZW4tcnBjX3V0aWwubzogcnBjX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3V0aWwubyAtTUQgLU1QIC1NRiAkKERFUERJUikvcnBjZ2VuLXJwY191dGlsLlRwbyAtYyAtbyBycGNnZW4tcnBjX3V0aWwubyBgdGVzdCAtZiAncnBjX3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX3V0aWwuVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JwY191dGlsLmMnIG9iamVjdD0ncnBjZ2VuLXJwY191dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX3V0aWwubyBgdGVzdCAtZiAncnBjX3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcnBjX3V0aWwuYworCitycGNnZW4tcnBjX3V0aWwub2JqOiBycGNfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHJwY2dlbi1ycGNfdXRpbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfdXRpbC5UcG8gLWMgLW8gcnBjZ2VuLXJwY191dGlsLm9iaiBgaWYgdGVzdCAtZiAncnBjX3V0aWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfdXRpbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfdXRpbC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3JwY2dlbi1ycGNfdXRpbC5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX3V0aWwuYycgb2JqZWN0PSdycGNnZW4tcnBjX3V0aWwub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY191dGlsLm9iaiBgaWYgdGVzdCAtZiAncnBjX3V0aWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfdXRpbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfdXRpbC5jJzsgZmlgCisKK3JwY2dlbi1ycGNfc2FtcGxlLm86IHJwY19zYW1wbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3NhbXBsZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9ycGNnZW4tcnBjX3NhbXBsZS5UcG8gLWMgLW8gcnBjZ2VuLXJwY19zYW1wbGUubyBgdGVzdCAtZiAncnBjX3NhbXBsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BycGNfc2FtcGxlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvcnBjZ2VuLXJwY19zYW1wbGUuVHBvICQoREVQRElSKS9ycGNnZW4tcnBjX3NhbXBsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncnBjX3NhbXBsZS5jJyBvYmplY3Q9J3JwY2dlbi1ycGNfc2FtcGxlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHJwY2dlbl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBycGNnZW4tcnBjX3NhbXBsZS5vIGB0ZXN0IC1mICdycGNfc2FtcGxlLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHJwY19zYW1wbGUuYworCitycGNnZW4tcnBjX3NhbXBsZS5vYmo6IHJwY19zYW1wbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQocnBjZ2VuX0NGTEFHUykgJChDRkxBR1MpIC1NVCBycGNnZW4tcnBjX3NhbXBsZS5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3JwY2dlbi1ycGNfc2FtcGxlLlRwbyAtYyAtbyBycGNnZW4tcnBjX3NhbXBsZS5vYmogYGlmIHRlc3QgLWYgJ3JwY19zYW1wbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdycGNfc2FtcGxlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3JwY19zYW1wbGUuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9ycGNnZW4tcnBjX3NhbXBsZS5UcG8gJChERVBESVIpL3JwY2dlbi1ycGNfc2FtcGxlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdycGNfc2FtcGxlLmMnIG9iamVjdD0ncnBjZ2VuLXJwY19zYW1wbGUub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChycGNnZW5fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gcnBjZ2VuLXJwY19zYW1wbGUub2JqIGBpZiB0ZXN0IC1mICdycGNfc2FtcGxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAncnBjX3NhbXBsZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ycGNfc2FtcGxlLmMnOyBmaWAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykKK2luc3RhbGxkaXJzOgoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1ub2luc3RQUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06CisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tbm9pbnN0UFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgaW5zdGFsbC1wcy1hbSBcCisJaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIFwKKwltYWludGFpbmVyLWNsZWFuIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBcCisJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgXAorCXBkZiBwZGYtYW0gcHMgcHMtYW0gdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9SRUFETUUgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZiYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9SRUFETUUKQEAgLTAsMCArMSw4IEBACisKKyBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlIGZvciBycGNnZW4ubmV3IGZyb20gU3VuIFRJUlBDCisgc291cmNlIGRpc3RyaWJ1dGlvbi4gSSBjbGVhbmVkIGl0IHVwIGEgbGl0dGxlIHNvIHRoYXQgaXQgd2lsbAorIGNvbXBpbGUgd2l0aCBnY2MgKHdpdGhvdXQgdXNpbmcgLXRyYWRpdGlvbmFsKSwgYW5kIG1vZGlmaWVkIHRoZQorIG91dHB1dCB0byBhdm9pZCB0aG9zZSBzaWxseSB3YXJuaW5ncyB5b3UgdXN1YWxseSBnZXQgd2hlbiBjb21waWxpbmcKKyBhbiBycGNnZW4tZ2VuZXJhdGVkIEMgZmlsZS4KKworIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPiA4IE9jdCAxOTk2CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19jbG50b3V0LmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19jbG50b3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmNDM4MgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX2NsbnRvdXQuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylycGNfY2xudG91dC5jIDEuMTEgODkvMDIvMjIgKEMpIDE5ODcgU01JIjsKKyNlbmRpZgorCisvKgorICogcnBjX2NsbnRvdXQuYywgQ2xpZW50LXN0dWIgb3V0cHV0dGVyIGZvciB0aGUgUlBDIHByb3RvY29sIGNvbXBpbGVyCisgKiBDb3B5cmlnaHQgKEMpIDE5ODcsIFN1biBNaWNyb3N5dHNlbXMsIEluYy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cnBjL3R5cGVzLmg+CisjaW5jbHVkZSAicnBjX3BhcnNlLmgiCisjaW5jbHVkZSAicnBjX3V0aWwuaCIKKyNpbmNsdWRlICJycGNfb3V0cHV0LmgiCisKKy8qIGV4dGVybiBwZGVjbGFyYXRpb24oKTsgKi8KKy8qIHZvaWQgcHJpbnRhcmdsaXN0KCk7ICovCisKKyNkZWZpbmUgREVGQVVMVF9USU1FT1VUIDI1CS8qIGluIHNlY29uZHMgKi8KK3N0YXRpYyBjaGFyIFJFU1VMVFtdID0gImNsbnRfcmVzIjsKKworc3RhdGljIHZvaWQJd3JpdGVfcHJvZ3JhbShkZWZpbml0aW9uICpkZWYpOworc3RhdGljIHZvaWQJcHJpbnRib2R5KHByb2NfbGlzdCAqcHJvYyk7CisKKwordm9pZAord3JpdGVfc3R1YnModm9pZCkKK3sKKwlsaXN0ICpsOworCWRlZmluaXRpb24gKmRlZjsKKworCWZfcHJpbnQoZm91dCwgCisJCSJcbi8qIERlZmF1bHQgdGltZW91dCBjYW4gYmUgY2hhbmdlZCB1c2luZyBjbG50X2NvbnRyb2woKSAqL1xuIik7CisJZl9wcmludChmb3V0LCAic3RhdGljIHN0cnVjdCB0aW1ldmFsIFRJTUVPVVQgPSB7ICVkLCAwIH07XG4iLAorCQlERUZBVUxUX1RJTUVPVVQpOworCWZvciAobCA9IGRlZmluZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJZGVmID0gKGRlZmluaXRpb24gKikgbC0+dmFsOworCQlpZiAoZGVmLT5kZWZfa2luZCA9PSBERUZfUFJPR1JBTSkgeworCQkJd3JpdGVfcHJvZ3JhbShkZWYpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVfcHJvZ3JhbShkZWZpbml0aW9uICpkZWYpCit7CisJdmVyc2lvbl9saXN0ICAgKnZwOworCXByb2NfbGlzdCAgICAgICpwcm9jOworCisJZm9yICh2cCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2cCAhPSBOVUxMOyB2cCA9IHZwLT5uZXh0KSB7CisJCWZvciAocHJvYyA9IHZwLT5wcm9jczsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LCAiXG4iKTsKKwkJCXB0eXBlKHByb2MtPnJlc19wcmVmaXgsIHByb2MtPnJlc190eXBlLCAxKTsKKwkJCWZfcHJpbnQoZm91dCwgIipcbiIpOworCQkJcHZuYW1lKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCXByaW50YXJnbGlzdChwcm9jLCAiY2xudCIsICJDTElFTlQgKiIpOworCQkJZl9wcmludChmb3V0LCAie1xuIik7CisJCQlwcmludGJvZHkocHJvYyk7CisJCQlmX3ByaW50KGZvdXQsICJ9XG4iKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFdyaXRlcyBvdXQgZGVjbGFyYXRpb25zIG9mIHByb2NlZHVyZSdzIGFyZ3VtZW50IGxpc3QuCisgKiBJbiBlaXRoZXIgQU5TSSBDIHN0eWxlLCBpbiBvbmUgb2Ygb2xkIHJwY2dlbiBzdHlsZSAocGFzcyBieSByZWZlcmVuY2UpLAorICogb3IgbmV3IHJwY2dlbiBzdHlsZSAobXVsdGlwbGUgYXJndW1lbnRzLCBwYXNzIGJ5IHZhbHVlKTsKKyAqLworCisvKiBzYW1wbGUgYWRkYXJnbmFtZSA9ICJjbG50Ijsgc2FtcGxlIGFkZGFyZ3R5cGUgPSAiQ0xJRU5UICogIiAqLworCit2b2lkCitwcmludGFyZ2xpc3QocHJvY19saXN0ICpwcm9jLCBjaGFyICphZGRhcmduYW1lLCBjaGFyICphZGRhcmd0eXBlKQoreworCisJZGVjbF9saXN0ICAgICAgKmw7CisKKwlpZiAoIW5ld3N0eWxlKSB7CS8qIG9sZCBzdHlsZTogYWx3YXlzIHBhc3MgYXJnIGJ5IHJlZmVyZW5jZSAqLworCQlpZiAoQ2ZsYWcpIHsJLyogQysrIHN0eWxlIGhlYWRpbmcgKi8KKwkJCWZfcHJpbnQoZm91dCwgIigiKTsKKwkJCXB0eXBlKHByb2MtPmFyZ3MuZGVjbHMtPmRlY2wucHJlZml4LCBwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnR5cGUsIDEpOworCQkJZl9wcmludChmb3V0LCAiKmFyZ3AsICVzJXMpXG4iLCBhZGRhcmd0eXBlLCBhZGRhcmduYW1lKTsKKwkJfSBlbHNlIHsKKwkJCWZfcHJpbnQoZm91dCwgIihhcmdwLCAlcylcbiIsIGFkZGFyZ25hbWUpOworCQkJZl9wcmludChmb3V0LCAiXHQiKTsKKwkJCXB0eXBlKHByb2MtPmFyZ3MuZGVjbHMtPmRlY2wucHJlZml4LCBwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnR5cGUsIDEpOworCQkJZl9wcmludChmb3V0LCAiKmFyZ3A7XG4iKTsKKwkJfQorCX0gZWxzZSBpZiAoc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKSB7CisJCS8qIG5ld3N0eWxlLCAwIGFyZ3VtZW50ICovCisJCWlmIChDZmxhZykKKwkJCWZfcHJpbnQoZm91dCwgIiglcyVzKVxuIiwgYWRkYXJndHlwZSwgYWRkYXJnbmFtZSk7CisJCWVsc2UKKwkJCWZfcHJpbnQoZm91dCwgIiglcylcbiIsIGFkZGFyZ25hbWUpOworCX0gZWxzZSB7CisJCS8qIG5ldyBzdHlsZSwgMSBvciBtdWx0aXBsZSBhcmd1bWVudHMgKi8KKwkJaWYgKCFDZmxhZykgeworCQkJZl9wcmludChmb3V0LCAiKCIpOworCQkJZm9yIChsID0gcHJvYy0+YXJncy5kZWNsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKKwkJCQlmX3ByaW50KGZvdXQsICIlcywgIiwgbC0+ZGVjbC5uYW1lKTsKKwkJCWZfcHJpbnQoZm91dCwgIiVzKVxuIiwgYWRkYXJnbmFtZSk7CisJCQlmb3IgKGwgPSBwcm9jLT5hcmdzLmRlY2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCQkJcGRlY2xhcmF0aW9uKHByb2MtPmFyZ3MuYXJnbmFtZSwgJmwtPmRlY2wsIDEsICI7XG4iKTsKKwkJCX0KKwkJfSBlbHNlIHsJLyogQysrIHN0eWxlIGhlYWRlciAqLworCQkJZl9wcmludChmb3V0LCAiKCIpOworCQkJZm9yIChsID0gcHJvYy0+YXJncy5kZWNsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworCQkJCXBkZWNsYXJhdGlvbihwcm9jLT5hcmdzLmFyZ25hbWUsICZsLT5kZWNsLCAwLCAiLCAiKTsKKwkJCX0KKwkJCWZfcHJpbnQoZm91dCwgIiAlcyVzKVxuIiwgYWRkYXJndHlwZSwgYWRkYXJnbmFtZSk7CisJCX0KKwl9CisKKwlpZiAoIUNmbGFnKQorCQlmX3ByaW50KGZvdXQsICJcdCVzJXM7XG4iLCBhZGRhcmd0eXBlLCBhZGRhcmduYW1lKTsKK30KKworCisKK3N0YXRpYyBjaGFyICoKK2FtcHIoY2hhciAqdHlwZSkKK3sKKwlpZiAoaXN2ZWN0b3JkZWYodHlwZSwgUkVMX0FMSUFTKSkgeworCQlyZXR1cm4gKCIiKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKCImIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRib2R5KHByb2NfbGlzdCAqcHJvYykKK3sKKwlkZWNsX2xpc3QgICAgICAqbDsKKwlib29sX3QgICAgICAgICAgYXJnczIgPSAocHJvYy0+YXJnX251bSA+IDEpOworCisJLyogRm9yIG5ldyBzdHlsZSB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cywgbmVlZCBhIHN0cnVjdHVyZSBpbiB3aGljaAorICAgICAgICAgKiB0byBzdHVmZiB0aGUgYXJndW1lbnRzLiAqLworCWlmIChuZXdzdHlsZSAmJiBhcmdzMikgeworCQlmX3ByaW50KGZvdXQsICJcdCVzIiwgcHJvYy0+YXJncy5hcmduYW1lKTsKKwkJZl9wcmludChmb3V0LCAiIGFyZztcbiIpOworCX0KKwlmX3ByaW50KGZvdXQsICJcdHN0YXRpYyAiKTsKKwlpZiAoc3RyZXEocHJvYy0+cmVzX3R5cGUsICJ2b2lkIikpIHsKKwkJZl9wcmludChmb3V0LCAiY2hhciAiKTsKKwl9IGVsc2UgeworCQlwdHlwZShwcm9jLT5yZXNfcHJlZml4LCBwcm9jLT5yZXNfdHlwZSwgMCk7CisJfQorCWZfcHJpbnQoZm91dCwgIiVzO1xuIiwgUkVTVUxUKTsKKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0bWVtc2V0KChjaGFyICopJXMlcywgMCwgc2l6ZW9mKCVzKSk7XG4iLAorCQlhbXByKHByb2MtPnJlc190eXBlKSwgUkVTVUxULCBSRVNVTFQpOworCWlmIChuZXdzdHlsZSAmJiAhYXJnczIgJiYgKHN0cmVxKHByb2MtPmFyZ3MuZGVjbHMtPmRlY2wudHlwZSwgInZvaWQiKSkpIHsKKwkJLyogbmV3c3R5bGUsIDAgYXJndW1lbnRzICovCisJCWZfcHJpbnQoZm91dCwKKwkJCSJcdGlmIChjbG50X2NhbGwoY2xudCwgJXMsICh4ZHJwcm9jX3QpIHhkcl92b2lkLCAoY2FkZHJfdCkgTlVMTCwgIgorCQkJIih4ZHJwcm9jX3QpIHhkcl8lcywgKGNhZGRyX3QpICVzJXMsIFRJTUVPVVQpICE9IFJQQ19TVUNDRVNTKSB7XG4iLAorCQkJcHJvYy0+cHJvY19uYW1lLAorCQkJc3RyaW5nZml4KHByb2MtPnJlc190eXBlKSwgYW1wcihwcm9jLT5yZXNfdHlwZSksIFJFU1VMVCk7CisKKwl9IGVsc2UgaWYgKG5ld3N0eWxlICYmIGFyZ3MyKSB7CisJCS8qIG5ld3N0eWxlLCBtdWx0aXBsZSBhcmd1bWVudHM6ICBzdHVmZiBhcmd1bWVudHMgaW50byBzdHJ1Y3R1cmUgKi8KKwkJZm9yIChsID0gcHJvYy0+YXJncy5kZWNsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LCAiXHRhcmcuJXMgPSAlcztcbiIsCisJCQkJbC0+ZGVjbC5uYW1lLCBsLT5kZWNsLm5hbWUpOworCQl9CisJCWZfcHJpbnQoZm91dCwKKwkJCSJcdGlmIChjbG50X2NhbGwoY2xudCwgJXMsICh4ZHJwcm9jX3QpIHhkcl8lcywgKGNhZGRyX3QpICZhcmcsICIKKwkJCSIoeGRycHJvY190KSB4ZHJfJXMsIChjYWRkcl90KSAlcyVzLCBUSU1FT1VUKSAhPSBSUENfU1VDQ0VTUykge1xuIiwKKwkJCXByb2MtPnByb2NfbmFtZSwgcHJvYy0+YXJncy5hcmduYW1lLAorCQkJc3RyaW5nZml4KHByb2MtPnJlc190eXBlKSwgYW1wcihwcm9jLT5yZXNfdHlwZSksIFJFU1VMVCk7CisJfSBlbHNlIHsJCS8qIHNpbmdsZSBhcmd1bWVudCwgbmV3IG9yIG9sZCBzdHlsZSAqLworCQlmX3ByaW50KGZvdXQsCisJCQkiXHRpZiAoY2xudF9jYWxsKGNsbnQsICVzLCAoeGRycHJvY190KSB4ZHJfJXMsICIKKwkJCSIoY2FkZHJfdCkgJXMlcywgKHhkcnByb2NfdCkgeGRyXyVzLCAoY2FkZHJfdCkgJXMlcywgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpIHtcbiIsCisJCQlwcm9jLT5wcm9jX25hbWUsCisJCQlzdHJpbmdmaXgocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlKSwKKwkJCShuZXdzdHlsZSA/ICImIiA6ICIiKSwKKwkJCShuZXdzdHlsZSA/IHByb2MtPmFyZ3MuZGVjbHMtPmRlY2wubmFtZSA6ICJhcmdwIiksCisJCQlzdHJpbmdmaXgocHJvYy0+cmVzX3R5cGUpLCBhbXByKHByb2MtPnJlc190eXBlKSwgUkVTVUxUKTsKKwl9CisJZl9wcmludChmb3V0LCAiXHRcdHJldHVybiAoTlVMTCk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdH1cbiIpOworCWlmIChzdHJlcShwcm9jLT5yZXNfdHlwZSwgInZvaWQiKSkgeworCQlmX3ByaW50KGZvdXQsICJcdHJldHVybiAoKHZvaWQgKiklcyVzKTtcbiIsCisJCQlhbXByKHByb2MtPnJlc190eXBlKSwgUkVTVUxUKTsKKwl9IGVsc2UgeworCQlmX3ByaW50KGZvdXQsICJcdHJldHVybiAoJXMlcyk7XG4iLCBhbXByKHByb2MtPnJlc190eXBlKSwgUkVTVUxUKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19jb3V0LmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19jb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxMjE0ZgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX2NvdXQuYwpAQCAtMCwwICsxLDcwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylycGNfY291dC5jIDEuMTMgODkvMDIvMjIgKEMpIDE5ODcgU01JIjsKKyNlbmRpZgorCisvKgorICogcnBjX2NvdXQuYywgWERSIHJvdXRpbmUgb3V0cHV0dGVyIGZvciB0aGUgUlBDIHByb3RvY29sIGNvbXBpbGVyIAorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInJwY19wYXJzZS5oIgorI2luY2x1ZGUgInJwY191dGlsLmgiCisKK3N0YXRpYyBpbnQJZmluZHR5cGUoZGVmaW5pdGlvbiAqZGVmLCBjaGFyICp0eXBlKTsKK3N0YXRpYyBpbnQJdW5kZWZpbmVkKGNoYXIgKnR5cGUpOworc3RhdGljIHZvaWQJcHJpbnRfZ2VuZXJpY19oZWFkZXIoY2hhciAqcHJvY25hbWUsIGludCBwb2ludGVycCk7CitzdGF0aWMgdm9pZAlwcmludF9oZWFkZXIoZGVmaW5pdGlvbiAqZGVmKTsKK3N0YXRpYyB2b2lkCXByaW50X3Byb2dfaGVhZGVyKHByb2NfbGlzdCAqcGxpc3QpOworc3RhdGljIHZvaWQJcHJpbnRfdHJhaWxlcih2b2lkKTsKK3N0YXRpYyB2b2lkCXByaW50X2lmb3BlbihpbnQgaW5kZW50LCBjaGFyICpuYW1lKTsKK3N0YXRpYyB2b2lkCXByaW50X2lmYXJnKGNoYXIgKmFyZyk7CitzdGF0aWMgdm9pZAlwcmludF9pZnNpemVvZihjaGFyICpwcmVmaXgsIGNoYXIgKnR5cGUpOworc3RhdGljIHZvaWQJcHJpbnRfaWZjbG9zZShpbnQgaW5kZW50KTsKK3N0YXRpYyB2b2lkCXByaW50X2lmc3RhdChpbnQgaW5kZW50LCBjaGFyICpwcmVmaXgsIGNoYXIgKnR5cGUsIHJlbGF0aW9uIHJlbCwKKwkJCWNoYXIgKmFtYXgsIGNoYXIgKm9iam5hbWUsIGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQJZW1pdF9lbnVtKGRlZmluaXRpb24gKmRlZik7CitzdGF0aWMgdm9pZAllbWl0X3Byb2dyYW0oZGVmaW5pdGlvbiAqZGVmKTsKK3N0YXRpYyB2b2lkCWVtaXRfdW5pb24oZGVmaW5pdGlvbiAqZGVmKTsKK3N0YXRpYyB2b2lkCWVtaXRfc3RydWN0KGRlZmluaXRpb24gKmRlZik7CitzdGF0aWMgdm9pZAllbWl0X3R5cGVkZWYoZGVmaW5pdGlvbiAqZGVmKTsKK3N0YXRpYyB2b2lkCXByaW50X3N0YXQoaW50IGluZGVudCwgZGVjbGFyYXRpb24gKmRlYyk7CitzdGF0aWMgdm9pZAllbWl0X2lubGluZShkZWNsYXJhdGlvbiAqZGVjbCwgaW50IGZsYWcpOworc3RhdGljIHZvaWQJZW1pdF9zaW5nbGVfaW5fbGluZShkZWNsYXJhdGlvbiAqZGVjbCwgaW50IGZsYWcsIHJlbGF0aW9uIHJlbCk7CitzdGF0aWMgY2hhciAqCXVwY2FzZShjaGFyICpzdHIpOworCisvKgorICogRW1pdCB0aGUgQy1yb3V0aW5lIGZvciB0aGUgZ2l2ZW4gZGVmaW5pdGlvbiAKKyAqLwordm9pZAorZW1pdChkZWZpbml0aW9uICpkZWYpCit7CisJaWYgKGRlZi0+ZGVmX2tpbmQgPT0gREVGX0NPTlNUKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGRlZi0+ZGVmX2tpbmQgPT0gREVGX1BST0dSQU0pIHsKKwkJZW1pdF9wcm9ncmFtKGRlZik7CisJCXJldHVybjsKKwl9CisJaWYgKGRlZi0+ZGVmX2tpbmQgPT0gREVGX1RZUEVERUYpIHsKKwkJLyogbm93IHdlIG5lZWQgdG8gaGFuZGxlIGRlY2xhcmF0aW9ucyBsaWtlCisJCSAqIHN0cnVjdCB0eXBlZGVmIGZvbyBmb287CisJCSAqIHNpbmNlIHdlIGRvbnQgd2FudCB0aGlzIHRvIGJlIGV4cGFuZGVkIGludG8gMiBjYWxscworCQkgKiB0byB4ZHJfZm9vICovCisKKwkJaWYgKHN0cmNtcChkZWYtPmRlZi50eS5vbGRfdHlwZSwgZGVmLT5kZWZfbmFtZSkgPT0gMCkKKwkJCXJldHVybjsKKwl9OworCisJcHJpbnRfaGVhZGVyKGRlZik7CisJc3dpdGNoIChkZWYtPmRlZl9raW5kKSB7CisJY2FzZSBERUZfVU5JT046CisJCWVtaXRfdW5pb24oZGVmKTsKKwkJYnJlYWs7CisJY2FzZSBERUZfRU5VTToKKwkJZW1pdF9lbnVtKGRlZik7CisJCWJyZWFrOworCWNhc2UgREVGX1NUUlVDVDoKKwkJZW1pdF9zdHJ1Y3QoZGVmKTsKKwkJYnJlYWs7CisJY2FzZSBERUZfVFlQRURFRjoKKwkJZW1pdF90eXBlZGVmKGRlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlwcmludF90cmFpbGVyKCk7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmR0eXBlKGRlZmluaXRpb24gKmRlZiwgY2hhciAqdHlwZSkKK3sKKworCWlmIChkZWYtPmRlZl9raW5kID09IERFRl9QUk9HUkFNIHx8IGRlZi0+ZGVmX2tpbmQgPT0gREVGX0NPTlNUKSB7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChzdHJlcShkZWYtPmRlZl9uYW1lLCB0eXBlKSk7CisJfQorfQorCitzdGF0aWMgaW50Cit1bmRlZmluZWQoY2hhciAqdHlwZSkKK3sKKwlkZWZpbml0aW9uICAgICAqZGVmOworCisJZGVmID0gKGRlZmluaXRpb24gKikgRklORFZBTChkZWZpbmVkLCB0eXBlLCBmaW5kdHlwZSk7CisKKwlyZXR1cm4gKGRlZiA9PSBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfZ2VuZXJpY19oZWFkZXIoY2hhciAqcHJvY25hbWUsIGludCBwb2ludGVycCkKK3sKKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWZfcHJpbnQoZm91dCwgImJvb2xfdFxuIik7CisJaWYgKENmbGFnKSB7CisJCWZfcHJpbnQoZm91dCwgInhkcl8lcygiLCBwcm9jbmFtZSk7CisJCWZfcHJpbnQoZm91dCwgIlhEUiAqeGRycywgIik7CisJCWZfcHJpbnQoZm91dCwgIiVzICIsIHByb2NuYW1lKTsKKwkJaWYgKHBvaW50ZXJwKQorCQkJZl9wcmludChmb3V0LCAiKiIpOworCQlmX3ByaW50KGZvdXQsICJvYmpwKVxue1xuXG4iKTsKKwl9IGVsc2UgeworCQlmX3ByaW50KGZvdXQsICJ4ZHJfJXMoeGRycywgb2JqcClcbiIsIHByb2NuYW1lKTsKKwkJZl9wcmludChmb3V0LCAiXHRYRFIgKnhkcnM7XG4iKTsKKwkJZl9wcmludChmb3V0LCAiXHQlcyAiLCBwcm9jbmFtZSk7CisJCWlmIChwb2ludGVycCkKKwkJCWZfcHJpbnQoZm91dCwgIioiKTsKKwkJZl9wcmludChmb3V0LCAib2JqcDtcbntcblxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaGVhZGVyKGRlZmluaXRpb24gKmRlZikKK3sKKwlwcmludF9nZW5lcmljX2hlYWRlcihkZWYtPmRlZl9uYW1lLAorCQlkZWYtPmRlZl9raW5kICE9IERFRl9UWVBFREVGIHx8CisJCSFpc3ZlY3RvcmRlZihkZWYtPmRlZi50eS5vbGRfdHlwZSwgZGVmLT5kZWYudHkucmVsKSk7CisKKwkvKiBOb3cgYWRkIElubGluZSBzdXBwb3J0ICovCisKKworCWlmIChJbmxpbmUgPT0gMCkKKwkJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcHJvZ19oZWFkZXIocHJvY19saXN0ICpwbGlzdCkKK3sKKwlwcmludF9nZW5lcmljX2hlYWRlcihwbGlzdC0+YXJncy5hcmduYW1lLCAxKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3RyYWlsZXIodm9pZCkKK3sKKwlmX3ByaW50KGZvdXQsICJcdHJldHVybiAoVFJVRSk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJ9XG4iKTsKK30KKworCitzdGF0aWMgdm9pZAorcHJpbnRfaWZvcGVuKGludCBpbmRlbnQsIGNoYXIgKm5hbWUpCit7CisJdGFiaWZ5KGZvdXQsIGluZGVudCk7CisJZl9wcmludChmb3V0LCAiIGlmICgheGRyXyVzKHhkcnMiLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lmYXJnKGNoYXIgKmFyZykKK3sKKwlmX3ByaW50KGZvdXQsICIsICVzIiwgYXJnKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2lmc2l6ZW9mKGNoYXIgKnByZWZpeCwgY2hhciAqdHlwZSkKK3sKKwlpZiAoc3RyZXEodHlwZSwgImJvb2wiKSkgeworCQlmX3ByaW50KGZvdXQsICIsIHNpemVvZihib29sX3QpLCAoeGRycHJvY190KXhkcl9ib29sIik7CisJfSBlbHNlIHsKKwkJZl9wcmludChmb3V0LCAiLCBzaXplb2YoIik7CisJCWlmICh1bmRlZmluZWQodHlwZSkgJiYgcHJlZml4KSB7CisJCQlmX3ByaW50KGZvdXQsICIlcyAiLCBwcmVmaXgpOworCQl9CisJCWZfcHJpbnQoZm91dCwgIiVzKSwgKHhkcnByb2NfdCl4ZHJfJXMiLCB0eXBlLCB0eXBlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9pZmNsb3NlKGludCBpbmRlbnQpCit7CisJZl9wcmludChmb3V0LCAiKSkge1xuIik7CisJdGFiaWZ5KGZvdXQsIGluZGVudCk7CisJZl9wcmludChmb3V0LCAiXHQgcmV0dXJuIChGQUxTRSk7XG4iKTsKKwl0YWJpZnkoZm91dCwgaW5kZW50KTsKKwlmX3ByaW50KGZvdXQsICIgfVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9pZnN0YXQoaW50IGluZGVudCwgY2hhciAqcHJlZml4LCBjaGFyICp0eXBlLCByZWxhdGlvbiByZWwsCisJCQljaGFyICphbWF4LCBjaGFyICpvYmpuYW1lLCBjaGFyICpuYW1lKQoreworCWNoYXIgKmFsdCA9IE5VTEw7CisKKwlzd2l0Y2ggKHJlbCkgeworCWNhc2UgUkVMX1BPSU5URVI6CisJCXByaW50X2lmb3BlbihpbmRlbnQsICJwb2ludGVyIik7CisJCXByaW50X2lmYXJnKCIoY2hhciAqKikiKTsKKwkJZl9wcmludChmb3V0LCAiJXMiLCBvYmpuYW1lKTsKKwkJcHJpbnRfaWZzaXplb2YocHJlZml4LCB0eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBSRUxfVkVDVE9SOgorCQlpZiAoc3RyZXEodHlwZSwgInN0cmluZyIpKSB7CisJCQlhbHQgPSAic3RyaW5nIjsKKwkJfSBlbHNlIGlmIChzdHJlcSh0eXBlLCAib3BhcXVlIikpIHsKKwkJCWFsdCA9ICJvcGFxdWUiOworCQl9CisJCWlmIChhbHQpIHsKKwkJCXByaW50X2lmb3BlbihpbmRlbnQsIGFsdCk7CisJCQlwcmludF9pZmFyZyhvYmpuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50X2lmb3BlbihpbmRlbnQsICJ2ZWN0b3IiKTsKKwkJCXByaW50X2lmYXJnKCIoY2hhciAqKSIpOworCQkJZl9wcmludChmb3V0LCAiJXMiLCBvYmpuYW1lKTsKKwkJfQorCQlwcmludF9pZmFyZyhhbWF4KTsKKwkJaWYgKCFhbHQpIHsKKwkJCXByaW50X2lmc2l6ZW9mKHByZWZpeCwgdHlwZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSRUxfQVJSQVk6CisJCWlmIChzdHJlcSh0eXBlLCAic3RyaW5nIikpIHsKKwkJCWFsdCA9ICJzdHJpbmciOworCQl9IGVsc2UgaWYgKHN0cmVxKHR5cGUsICJvcGFxdWUiKSkgeworCQkJYWx0ID0gImJ5dGVzIjsKKwkJfQorCQlpZiAoc3RyZXEodHlwZSwgInN0cmluZyIpKSB7CisJCQlwcmludF9pZm9wZW4oaW5kZW50LCBhbHQpOworCQkJcHJpbnRfaWZhcmcob2JqbmFtZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYWx0KSB7CisJCQkJcHJpbnRfaWZvcGVuKGluZGVudCwgYWx0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRfaWZvcGVuKGluZGVudCwgImFycmF5Iik7CisJCQl9CisJCQkvKiBUaGUgKHZvaWQqKSBhdm9pZHMgYSBnY2MtNC4xIHdhcm5pbmcgKi8KKwkJCXByaW50X2lmYXJnKCIoY2hhciAqKikodm9pZCopIik7CisJCQlpZiAoKm9iam5hbWUgPT0gJyYnKSB7CisJCQkJZl9wcmludChmb3V0LCAiJXMuJXNfdmFsLCAodV9pbnQgKiklcy4lc19sZW4iLAorCQkJCQlvYmpuYW1lLCBuYW1lLCBvYmpuYW1lLCBuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJZl9wcmludChmb3V0LCAiJiVzLT4lc192YWwsICh1X2ludCAqKSYlcy0+JXNfbGVuIiwKKwkJCQkJb2JqbmFtZSwgbmFtZSwgb2JqbmFtZSwgbmFtZSk7CisJCQl9CisJCX0KKwkJcHJpbnRfaWZhcmcoYW1heCk7CisJCWlmICghYWx0KSB7CisJCQlwcmludF9pZnNpemVvZihwcmVmaXgsIHR5cGUpOworCQl9CisJCWJyZWFrOworCWNhc2UgUkVMX0FMSUFTOgorCQlwcmludF9pZm9wZW4oaW5kZW50LCB0eXBlKTsKKwkJcHJpbnRfaWZhcmcob2JqbmFtZSk7CisJCWJyZWFrOworCX0KKwlwcmludF9pZmNsb3NlKGluZGVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X2VudW0oZGVmaW5pdGlvbiAqZGVmKQoreworCXByaW50X2lmb3BlbigxLCAiZW51bSIpOworCXByaW50X2lmYXJnKCIoZW51bV90ICopb2JqcCIpOworCXByaW50X2lmY2xvc2UoMSk7Cit9CisKK3N0YXRpYyB2b2lkCitlbWl0X3Byb2dyYW0oZGVmaW5pdGlvbiAqZGVmKQoreworCWRlY2xfbGlzdCAgICAgICpkbDsKKwl2ZXJzaW9uX2xpc3QgICAqdmxpc3Q7CisJcHJvY19saXN0ICAgICAgKnBsaXN0OworCisJZm9yICh2bGlzdCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2bGlzdCAhPSBOVUxMOyB2bGlzdCA9IHZsaXN0LT5uZXh0KQorCQlmb3IgKHBsaXN0ID0gdmxpc3QtPnByb2NzOyBwbGlzdCAhPSBOVUxMOyBwbGlzdCA9IHBsaXN0LT5uZXh0KSB7CisJCQlpZiAoIW5ld3N0eWxlIHx8IHBsaXN0LT5hcmdfbnVtIDwgMikKKwkJCQljb250aW51ZTsvKiBvbGQgc3R5bGUsIG9yIHNpbmdsZSBhcmd1bWVudCAqLworCQkJcHJpbnRfcHJvZ19oZWFkZXIocGxpc3QpOworCQkJZm9yIChkbCA9IHBsaXN0LT5hcmdzLmRlY2xzOyBkbCAhPSBOVUxMOyBkbCA9IGRsLT5uZXh0KQorCQkJCXByaW50X3N0YXQoMSwgJmRsLT5kZWNsKTsKKwkJCXByaW50X3RyYWlsZXIoKTsKKwkJfQorfQorCisKK3N0YXRpYyB2b2lkCitlbWl0X3VuaW9uKGRlZmluaXRpb24gKmRlZikKK3sKKyAgZGVjbGFyYXRpb24gKmRmbHQ7CisgIGNhc2VfbGlzdCAqY2w7CisgIGRlY2xhcmF0aW9uICpjczsKKyAgY2hhciAqb2JqZWN0OworICBjaGFyICp2ZWNmb3JtYXQgPSAib2JqcC0+JXNfdS4lcyI7CisgIGNoYXIgKmZvcm1hdCA9ICImb2JqcC0+JXNfdS4lcyI7CisKKyAgcHJpbnRfc3RhdCgxLCZkZWYtPmRlZi51bi5lbnVtX2RlY2wpOworICBmX3ByaW50KGZvdXQsICJcdHN3aXRjaCAob2JqcC0+JXMpIHtcbiIsIGRlZi0+ZGVmLnVuLmVudW1fZGVjbC5uYW1lKTsKKyAgZm9yIChjbCA9IGRlZi0+ZGVmLnVuLmNhc2VzOyBjbCAhPSBOVUxMOyBjbCA9IGNsLT5uZXh0KSB7CisKKyAgICBmX3ByaW50KGZvdXQsICJcdGNhc2UgJXM6XG4iLCBjbC0+Y2FzZV9uYW1lKTsKKyAgICBpZihjbC0+Y29udGZsYWcgPT0gMSkJLyogYSBjb250aW51ZWQgY2FzZSBzdGF0ZW1lbnQgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIGNzID0gJmNsLT5jYXNlX2RlY2w7CisgICAgaWYgKCFzdHJlcShjcy0+dHlwZSwgInZvaWQiKSkgeworICAgICAgb2JqZWN0ID0gYWxsb2Moc3RybGVuKGRlZi0+ZGVmX25hbWUpICsgc3RybGVuKGZvcm1hdCkgKworCQkgICAgIHN0cmxlbihjcy0+bmFtZSkgKyAxKTsKKyAgICAgIGlmIChpc3ZlY3RvcmRlZiAoY3MtPnR5cGUsIGNzLT5yZWwpKSB7CisJc19wcmludChvYmplY3QsIHZlY2Zvcm1hdCwgZGVmLT5kZWZfbmFtZSwgCisJCWNzLT5uYW1lKTsKKyAgICAgIH0gZWxzZSB7CisJc19wcmludChvYmplY3QsIGZvcm1hdCwgZGVmLT5kZWZfbmFtZSwgCisJCWNzLT5uYW1lKTsKKyAgICAgIH0KKyAgICAgIHByaW50X2lmc3RhdCgyLCBjcy0+cHJlZml4LCBjcy0+dHlwZSwgY3MtPnJlbCwgY3MtPmFycmF5X21heCwKKwkJICAgb2JqZWN0LCBjcy0+bmFtZSk7CisgICAgICBmcmVlKG9iamVjdCk7CisgICAgfQorICAgIGZfcHJpbnQoZm91dCwgIlx0XHRicmVhaztcbiIpOworICB9CisgIGRmbHQgPSBkZWYtPmRlZi51bi5kZWZhdWx0X2RlY2w7CisgIGlmIChkZmx0ICE9IE5VTEwpIHsKKyAgICBpZiAoIXN0cmVxKGRmbHQtPnR5cGUsICJ2b2lkIikpIHsKKyAgICAgIGZfcHJpbnQoZm91dCwgIlx0ZGVmYXVsdDpcbiIpOworICAgICAgb2JqZWN0ID0gYWxsb2Moc3RybGVuKGRlZi0+ZGVmX25hbWUpICsgc3RybGVuKGZvcm1hdCkgKworCQkgICAgIHN0cmxlbihkZmx0LT5uYW1lKSArIDEpOworICAgICAgaWYgKGlzdmVjdG9yZGVmIChkZmx0LT50eXBlLCBkZmx0LT5yZWwpKSB7CisJc19wcmludChvYmplY3QsIHZlY2Zvcm1hdCwgZGVmLT5kZWZfbmFtZSwgCisJCWRmbHQtPm5hbWUpOworICAgICAgfSBlbHNlIHsKKwlzX3ByaW50KG9iamVjdCwgZm9ybWF0LCBkZWYtPmRlZl9uYW1lLCAKKwkJZGZsdC0+bmFtZSk7CisgICAgICB9CisKKyAgICAgIHByaW50X2lmc3RhdCgyLCBkZmx0LT5wcmVmaXgsIGRmbHQtPnR5cGUsIGRmbHQtPnJlbCwKKwkJICAgZGZsdC0+YXJyYXlfbWF4LCBvYmplY3QsIGRmbHQtPm5hbWUpOworICAgICAgZnJlZShvYmplY3QpOworICAgICAgZl9wcmludChmb3V0LCAiXHRcdGJyZWFrO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEF2b2lkIGdjYyB3YXJuaW5ncyBhYm91dCBgdmFsdWUgbm90IGhhbmRsZWQgaW4gc3dpdGNoJyAqLworICAgICAgZl9wcmludChmb3V0LCAiXHRkZWZhdWx0OlxuIik7CisgICAgICBmX3ByaW50KGZvdXQsICJcdFx0YnJlYWs7XG4iKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZl9wcmludChmb3V0LCAiXHRkZWZhdWx0OlxuIik7CisgICAgZl9wcmludChmb3V0LCAiXHRcdHJldHVybiAoRkFMU0UpO1xuIik7CisgIH0KKworICBmX3ByaW50KGZvdXQsICJcdH1cbiIpOworfQorCitzdGF0aWMgdm9pZAorZW1pdF9zdHJ1Y3QoZGVmaW5pdGlvbiAqZGVmKQoreworCWRlY2xfbGlzdCAgICAgICpkbDsKKwlpbnQgICAgICAgICAgICAgaSwgaiwgc2l6ZSwgZmxhZzsKKwlkZWNsX2xpc3QgICAgICAqY3VyID0gTlVMTCwgKnBzYXY7CisJYmFzX3R5cGUgICAgICAgKnB0cjsKKwljaGFyICAgICAgICAgICAqc2l6ZXN0ciwgKnBsdXM7CisJY2hhciAgICAgICAgICAgIHB0ZW1wWzI1Nl07CisJaW50ICAgICAgICAgICAgIGNhbl9pbmxpbmU7CisJY29uc3QgY2hhcgkqYnVmX2RlY2xhcmF0aW9uOworCisKKwlpZiAoSW5saW5lID09IDApIHsKKwkJZm9yIChkbCA9IGRlZi0+ZGVmLnN0LmRlY2xzOyBkbCAhPSBOVUxMOyBkbCA9IGRsLT5uZXh0KQorCQkJcHJpbnRfc3RhdCgxLCAmZGwtPmRlY2wpOworCX0gZWxzZSB7CisJCXNpemUgPSAwOworCQljYW5faW5saW5lID0gMDsKKwkJZm9yIChkbCA9IGRlZi0+ZGVmLnN0LmRlY2xzOyBkbCAhPSBOVUxMOyBkbCA9IGRsLT5uZXh0KQorCQkJaWYgKChkbC0+ZGVjbC5wcmVmaXggPT0gTlVMTCkgJiYgKChwdHIgPSBmaW5kX3R5cGUoZGwtPmRlY2wudHlwZSkpICE9IE5VTEwpICYmICgoZGwtPmRlY2wucmVsID09IFJFTF9BTElBUykgfHwgKGRsLT5kZWNsLnJlbCA9PSBSRUxfVkVDVE9SKSkpIHsKKworCQkJCWlmIChkbC0+ZGVjbC5yZWwgPT0gUkVMX0FMSUFTKQorCQkJCQlzaXplICs9IHB0ci0+bGVuZ3RoOworCQkJCWVsc2UgeworCQkJCQljYW5faW5saW5lID0gMTsKKwkJCQkJYnJlYWs7CS8qIGNhbiBiZSBpbmxpbmVkICovCisJCQkJfTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHNpemUgPj0gSW5saW5lKSB7CisJCQkJCWNhbl9pbmxpbmUgPSAxOworCQkJCQlicmVhazsJLyogY2FuIGJlIGlubGluZWQgKi8KKwkJCQl9CisJCQkJc2l6ZSA9IDA7CisJCQl9CisJCWlmIChzaXplID4gSW5saW5lKQorCQkJY2FuX2lubGluZSA9IDE7CisKKwkJaWYgKGNhbl9pbmxpbmUgPT0gMCkgewkvKiBjYW4gbm90IGlubGluZSwgZHJvcCBiYWNrIHRvIG9sZCBtb2RlICovCisJCQlmb3IgKGRsID0gZGVmLT5kZWYuc3QuZGVjbHM7IGRsICE9IE5VTEw7IGRsID0gZGwtPm5leHQpCisJCQkJcHJpbnRfc3RhdCgxLCAmZGwtPmRlY2wpOworCQkJcmV0dXJuOworCQl9OworCisKKworCisJCWZsYWcgPSBQVVQ7CisJCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKworCQkJaWYgKGZsYWcgPT0gUFVUKQorCQkJCWZfcHJpbnQoZm91dCwgIlxuXHQgaWYgKHhkcnMtPnhfb3AgPT0gWERSX0VOQ09ERSkge1xuIik7CisJCQllbHNlCisJCQkJZl9wcmludChmb3V0LCAiXG4gXHQgcmV0dXJuIChUUlVFKTtcblx0fSBlbHNlIGlmICh4ZHJzLT54X29wID09IFhEUl9ERUNPREUpIHtcbiIpOworCisKKwkJCWkgPSAwOworCQkJc2l6ZSA9IDA7CisJCQlzaXplc3RyID0gTlVMTDsKKwkJCWJ1Zl9kZWNsYXJhdGlvbiA9ICJpbnQzMl90ICoiOworCQkJZm9yIChkbCA9IGRlZi0+ZGVmLnN0LmRlY2xzOyBkbCAhPSBOVUxMOyBkbCA9IGRsLT5uZXh0KSB7CS8qIHh4eCAqLworCisJCQkJLyogbm93IHdhbGsgZG93biB0aGUgbGlzdCBhbmQgY2hlY2sgZm9yIGJhc2ljIHR5cGVzICovCisJCQkJaWYgKChkbC0+ZGVjbC5wcmVmaXggPT0gTlVMTCkgJiYgKChwdHIgPSBmaW5kX3R5cGUoZGwtPmRlY2wudHlwZSkpICE9IE5VTEwpICYmICgoZGwtPmRlY2wucmVsID09IFJFTF9BTElBUykgfHwgKGRsLT5kZWNsLnJlbCA9PSBSRUxfVkVDVE9SKSkpIHsKKwkJCQkJaWYgKGkgPT0gMCkKKwkJCQkJCWN1ciA9IGRsOworCQkJCQlpKys7CisKKwkJCQkJaWYgKGRsLT5kZWNsLnJlbCA9PSBSRUxfQUxJQVMpCisJCQkJCQlzaXplICs9IHB0ci0+bGVuZ3RoOworCQkJCQllbHNlIHsKKwkJCQkJCS8qIHRoaXMgaXMgcmVxdWlyZWQgdG8gaGFuZGxlIGFycmF5cyAqLworCisJCQkJCQlpZiAoc2l6ZXN0ciA9PSBOVUxMKQorCQkJCQkJCXBsdXMgPSAiICI7CisJCQkJCQllbHNlCisJCQkJCQkJcGx1cyA9ICIrIjsKKworCQkJCQkJaWYgKHB0ci0+bGVuZ3RoICE9IDEpCisJCQkJCQkJc19wcmludChwdGVtcCwgIiAlcyAlcyAqICVkIiwgcGx1cywgZGwtPmRlY2wuYXJyYXlfbWF4LCBwdHItPmxlbmd0aCk7CisJCQkJCQllbHNlCisJCQkJCQkJc19wcmludChwdGVtcCwgIiAlcyAlcyAiLCBwbHVzLCBkbC0+ZGVjbC5hcnJheV9tYXgpOworCisJCQkJCQkvKm5vdyBjb25jYXRlbmF0ZSB0byBzaXplc3RyICEhISEgKi8KKwkJCQkJCWlmIChzaXplc3RyID09IE5VTEwpCisJCQkJCQkJc2l6ZXN0ciA9IHN0cmR1cChwdGVtcCk7CisJCQkJCQllbHNlIHsKKwkJCQkJCQlzaXplc3RyID0gcmVhbGxvYyhzaXplc3RyLCBzdHJsZW4oc2l6ZXN0cikgKyBzdHJsZW4ocHRlbXApICsgMSk7CisJCQkJCQkJaWYgKHNpemVzdHIgPT0gTlVMTCkgeworCisJCQkJCQkJCWZfcHJpbnQoc3RkZXJyLCAiRmF0YWwgZXJyb3IgOiBubyBtZW1vcnkgXG4iKTsKKwkJCQkJCQkJY3Jhc2goKTsKKwkJCQkJCQl9OworCQkJCQkJCXNpemVzdHIgPSBzdHJjYXQoc2l6ZXN0ciwgcHRlbXApOwkvKmJ1aWxkIHVwIGxlbmd0aCBvZiBhcnJheSAqLworCisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChpID4gMCkKKwkJCQkJICAgIHsKKwkJCQkJCWlmIChzaXplc3RyID09IE5VTEwgJiYgc2l6ZSA8IElubGluZSkgeworCQkJCQkJCS8qIGRvbid0IGV4cGFuZCBpbnRvIGlubGluZSBjb2RlIGlmIHNpemUgPCBpbmxpbmUgKi8KKwkJCQkJCQl3aGlsZSAoY3VyICE9IGRsKSB7CisJCQkJCQkJCXByaW50X3N0YXQoMSwgJmN1ci0+ZGVjbCk7CisJCQkJCQkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCisKKworCQkJCQkJCS8qIHdlcmUgYWxyZWFkeSBsb29raW5nIGF0IGEgeGRyX2lubGluZWFibGUgc3RydWN0dXJlICovCisJCQkJCQkJaWYgKHNpemVzdHIgPT0gTlVMTCkKKwkJCQkJCQkJZl9wcmludChmb3V0LCAiXHQgJXNidWYgPSBYRFJfSU5MSU5FKHhkcnMsJWQgKiBCWVRFU19QRVJfWERSX1VOSVQpOyIsCisJCQkJCQkJCQlidWZfZGVjbGFyYXRpb24sIHNpemUpOworCQkJCQkJCWVsc2UgaWYgKHNpemUgPT0gMCkKKwkJCQkJCQkJZl9wcmludChmb3V0LAorCQkJCQkJCQkJIlx0ICVzYnVmID0gWERSX0lOTElORSh4ZHJzLCVzICogQllURVNfUEVSX1hEUl9VTklUKTsiLAorCQkJCQkJCQkJYnVmX2RlY2xhcmF0aW9uLCBzaXplc3RyKTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCWZfcHJpbnQoZm91dCwKKwkJCQkJCQkJCSJcdCAlc2J1ZiA9IFhEUl9JTkxJTkUoeGRycywoJWQgKyAlcykqIEJZVEVTX1BFUl9YRFJfVU5JVCk7IiwKKwkJCQkJCQkJCWJ1Zl9kZWNsYXJhdGlvbiwgc2l6ZSwgc2l6ZXN0cik7CisJCQkJCQkJYnVmX2RlY2xhcmF0aW9uID0gIiI7CisKKwkJCQkJCQlmX3ByaW50KGZvdXQsICJcblx0ICAgaWYgKGJ1ZiA9PSBOVUxMKSB7XG4iKTsKKworCQkJCQkJCXBzYXYgPSBjdXI7CisJCQkJCQkJd2hpbGUgKGN1ciAhPSBkbCkgeworCQkJCQkJCQlwcmludF9zdGF0KDIsICZjdXItPmRlY2wpOworCQkJCQkJCQljdXIgPSBjdXItPm5leHQ7CisJCQkJCQkJfQorCisJCQkJCQkJZl9wcmludChmb3V0LCAiXG5cdCAgfVxuXHQgIGVsc2Uge1xuIik7CisKKwkJCQkJCQljdXIgPSBwc2F2OworCQkJCQkJCXdoaWxlIChjdXIgIT0gZGwpIHsKKwkJCQkJCQkJZW1pdF9pbmxpbmUoJmN1ci0+ZGVjbCwgZmxhZyk7CisJCQkJCQkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJCQkJCQl9CisKKwkJCQkJCQlmX3ByaW50KGZvdXQsICJcdCAgfVxuIik7CisJCQkJCQl9CisJCQkJCSAgICB9CisJCQkJCXNpemUgPSAwOworCQkJCQlpID0gMDsKKwkJCQkJc2l6ZXN0ciA9IE5VTEw7CisJCQkJCXByaW50X3N0YXQoMSwgJmRsLT5kZWNsKTsKKwkJCQl9CisKKwkJCX0KKwkJCWlmIChpID4gMCkKKwkJCSAgICB7CisJCQkJaWYgKHNpemVzdHIgPT0gTlVMTCAmJiBzaXplIDwgSW5saW5lKSB7CisJCQkJCS8qIGRvbid0IGV4cGFuZCBpbnRvIGlubGluZSBjb2RlIGlmIHNpemUgPCBpbmxpbmUgKi8KKwkJCQkJd2hpbGUgKGN1ciAhPSBkbCkgeworCQkJCQkJcHJpbnRfc3RhdCgxLCAmY3VyLT5kZWNsKTsKKwkJCQkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisKKwkJCQkJLyogd2VyZSBhbHJlYWR5IGxvb2tpbmcgYXQgYSB4ZHJfaW5saW5lYWJsZSBzdHJ1Y3R1cmUgKi8KKwkJCQkJaWYgKHNpemVzdHIgPT0gTlVMTCkKKwkJCQkJCWZfcHJpbnQoZm91dCwgIlx0XHQlc2J1ZiA9IFhEUl9JTkxJTkUoeGRycywlZCAqIEJZVEVTX1BFUl9YRFJfVU5JVCk7IiwKKwkJCQkJCQlidWZfZGVjbGFyYXRpb24sIHNpemUpOworCQkJCQllbHNlIGlmIChzaXplID09IDApCisJCQkJCQlmX3ByaW50KGZvdXQsCisJCQkJCQkJIlx0XHQlc2J1ZiA9IFhEUl9JTkxJTkUoeGRycywlcyAqIEJZVEVTX1BFUl9YRFJfVU5JVCk7IiwKKwkJCQkJCQlidWZfZGVjbGFyYXRpb24sIHNpemVzdHIpOworCQkJCQllbHNlCisJCQkJCQlmX3ByaW50KGZvdXQsCisJCQkJCQkJIlx0XHQlc2J1ZiA9IFhEUl9JTkxJTkUoeGRycywoJWQgKyAlcykqIEJZVEVTX1BFUl9YRFJfVU5JVCk7IiwKKwkJCQkJCQlidWZfZGVjbGFyYXRpb24sIHNpemUsIHNpemVzdHIpOworCQkJCQlidWZfZGVjbGFyYXRpb24gPSAiIjsKKworCQkJCQlmX3ByaW50KGZvdXQsICJcblx0XHRpZiAoYnVmID09IE5VTEwpIHtcbiIpOworCisJCQkJCXBzYXYgPSBjdXI7CisJCQkJCXdoaWxlIChjdXIgIT0gTlVMTCkgeworCQkJCQkJcHJpbnRfc3RhdCgyLCAmY3VyLT5kZWNsKTsKKwkJCQkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJCQkJfQorCQkJCQlmX3ByaW50KGZvdXQsICJcblx0ICB9XG5cdCAgZWxzZSB7XG4iKTsKKworCQkJCQljdXIgPSBwc2F2OworCQkJCQl3aGlsZSAoY3VyICE9IGRsKSB7CisJCQkJCQllbWl0X2lubGluZSgmY3VyLT5kZWNsLCBmbGFnKTsKKwkJCQkJCWN1ciA9IGN1ci0+bmV4dDsKKwkJCQkJfQorCisJCQkJCWZfcHJpbnQoZm91dCwgIlx0ICB9XG4iKTsKKworCQkJCX0KKwkJCSAgICB9CisJCQlmbGFnID0gR0VUOworCQl9CisJCWZfcHJpbnQoZm91dCwgIlx0IHJldHVybihUUlVFKTtcblx0fVxuXG4iKTsKKworCQkvKiBub3cgdGFrZSBjYXJlIG9mIFhEUl9GUkVFIGNhc2UgKi8KKworCQlmb3IgKGRsID0gZGVmLT5kZWYuc3QuZGVjbHM7IGRsICE9IE5VTEw7IGRsID0gZGwtPm5leHQpCisJCQlwcmludF9zdGF0KDEsICZkbC0+ZGVjbCk7CisJfQorfQorIAorCisKKworc3RhdGljIHZvaWQKK2VtaXRfdHlwZWRlZihkZWZpbml0aW9uICpkZWYpCit7CisJY2hhciAqcHJlZml4ID0gZGVmLT5kZWYudHkub2xkX3ByZWZpeDsKKwljaGFyICp0eXBlID0gZGVmLT5kZWYudHkub2xkX3R5cGU7CisJY2hhciAqYW1heCA9IGRlZi0+ZGVmLnR5LmFycmF5X21heDsKKwlyZWxhdGlvbiByZWwgPSBkZWYtPmRlZi50eS5yZWw7CisKKworCSAgcHJpbnRfaWZzdGF0KDEsIHByZWZpeCwgdHlwZSwgcmVsLCBhbWF4LCAib2JqcCIsIGRlZi0+ZGVmX25hbWUpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfc3RhdChpbnQgaW5kZW50LCBkZWNsYXJhdGlvbiAqZGVjKQoreworCWNoYXIgKnByZWZpeCA9IGRlYy0+cHJlZml4OworCWNoYXIgKnR5cGUgPSBkZWMtPnR5cGU7CisJY2hhciAqYW1heCA9IGRlYy0+YXJyYXlfbWF4OworCXJlbGF0aW9uIHJlbCA9IGRlYy0+cmVsOworCWNoYXIgbmFtZVsyNTZdOworCisJaWYgKGlzdmVjdG9yZGVmKHR5cGUsIHJlbCkpIHsKKwkJc19wcmludChuYW1lLCAib2JqcC0+JXMiLCBkZWMtPm5hbWUpOworCX0gZWxzZSB7CisJCXNfcHJpbnQobmFtZSwgIiZvYmpwLT4lcyIsIGRlYy0+bmFtZSk7CisJfQorCXByaW50X2lmc3RhdChpbmRlbnQsIHByZWZpeCwgdHlwZSwgcmVsLCBhbWF4LCBuYW1lLCBkZWMtPm5hbWUpOworfQorCisKK3N0YXRpYyB2b2lkCitlbWl0X2lubGluZShkZWNsYXJhdGlvbiAqZGVjbCwgaW50IGZsYWcpCit7CisKKwkvKmNoZWNrIHdoZXRoZXIgYW4gYXJyYXkgb3Igbm90ICovCisKKwlzd2l0Y2ggKGRlY2wtPnJlbCkgeworCWNhc2UgUkVMX0FMSUFTOgorCQllbWl0X3NpbmdsZV9pbl9saW5lKGRlY2wsIGZsYWcsIFJFTF9BTElBUyk7CisJCWJyZWFrOworCWNhc2UgUkVMX1ZFQ1RPUjoKKwkJZl9wcmludChmb3V0LCAiXHRcdHsgcmVnaXN0ZXIgJXMgKmdlbnA7IFxuIiwgZGVjbC0+dHlwZSk7CisJCWZfcHJpbnQoZm91dCwgIlx0XHQgIGludCBpO1xuIik7CisJCWZfcHJpbnQoZm91dCwgIlx0XHQgIGZvciAoIGkgPSAwLGdlbnA9b2JqcC0+JXM7XG4gXHRcdFx0aSA8ICVzOyBpKyspe1xuXHRcdCIsCisJCQlkZWNsLT5uYW1lLCBkZWNsLT5hcnJheV9tYXgpOworCQllbWl0X3NpbmdsZV9pbl9saW5lKGRlY2wsIGZsYWcsIFJFTF9WRUNUT1IpOworCQlmX3ByaW50KGZvdXQsICJcdFx0ICAgfVxuXHRcdCB9O1xuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2VtaXRfc2luZ2xlX2luX2xpbmUoZGVjbGFyYXRpb24gKmRlY2wsIGludCBmbGFnLCByZWxhdGlvbiByZWwpCit7CisJY2hhciAqdXBwX2Nhc2U7CisJaW50IGZyZWVkPTA7CisKKwlpZihmbGFnID09IFBVVCkKKwkJZl9wcmludChmb3V0LCJcdFx0ICh2b2lkKSBJWERSX1BVVF8iKTsKKwllbHNlICAgIAorCQlpZihyZWw9PSBSRUxfQUxJQVMpCisJCQlmX3ByaW50KGZvdXQsIlx0XHQgb2JqcC0+JXMgPSBJWERSX0dFVF8iLGRlY2wtPm5hbWUpOworCQllbHNlCisJCQlmX3ByaW50KGZvdXQsIlx0XHQgKmdlbnArKyA9IElYRFJfR0VUXyIpOworCisJdXBwX2Nhc2U9dXBjYXNlKGRlY2wtPnR5cGUpOworCisJLyogaGFjayAgLSBYWCAqLworCWlmKHN0cmNtcCh1cHBfY2FzZSwiSU5UIikgPT0gMCkKKwl7CisJCWZyZWUodXBwX2Nhc2UpOworCQlmcmVlZD0xOworCQl1cHBfY2FzZT0iSU5UMzIiOworCX0KKworCWlmKHN0cmNtcCh1cHBfY2FzZSwiVV9JTlQiKSA9PSAwKQorCXsKKwkJZnJlZSh1cHBfY2FzZSk7CisJCWZyZWVkPTE7CisJCXVwcF9jYXNlPSJVX0lOVDMyIjsKKwl9CisKKworCWlmKGZsYWcgPT0gUFVUKSAKKwkJaWYocmVsPT0gUkVMX0FMSUFTKQorCQkJZl9wcmludChmb3V0LCIlcyhidWYsb2JqcC0+JXMpO1xuIix1cHBfY2FzZSxkZWNsLT5uYW1lKTsKKwkJZWxzZQorCQkJZl9wcmludChmb3V0LCIlcyhidWYsKmdlbnArKyk7XG4iLHVwcF9jYXNlKTsKKworCWVsc2UKKwkJZl9wcmludChmb3V0LCIlcyhidWYpO1xuIix1cHBfY2FzZSk7CisJaWYoIWZyZWVkKQorCQlmcmVlKHVwcF9jYXNlKTsKKworfQorCisKK3N0YXRpYyBjaGFyICoKK3VwY2FzZShjaGFyICpzdHIpCit7CisJY2hhciAgICAgICAgICAgKnB0ciwgKmhwdHI7CisKKworCXB0ciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oc3RyKSsxKTsKKwlpZiAocHRyID09IChjaGFyICopIE5VTEwpIHsKKwkJZl9wcmludChzdGRlcnIsICJtYWxsb2MgZmFpbGVkIFxuIik7CisJCWV4aXQoMSk7CisJfTsKKworCWhwdHIgPSBwdHI7CisJd2hpbGUgKCpzdHIgIT0gJ1wwJykKKwkJKnB0cisrID0gdG91cHBlcigqc3RyKyspOworCisJKnB0ciA9ICdcMCc7CisJcmV0dXJuIChocHRyKTsKKworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfaG91dC5jIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfaG91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWNiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19ob3V0LmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiAwCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpcnBjX2hvdXQuYyAxLjEyIDg5LzAyLzIyIChDKSAxOTg3IFNNSSI7CisjZW5kaWYKKworLyoKKyAqIHJwY19ob3V0LmMsIEhlYWRlciBmaWxlIG91dHB1dHRlciBmb3IgdGhlIFJQQyBwcm90b2NvbCBjb21waWxlciAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJycGNfcGFyc2UuaCIKKyNpbmNsdWRlICJycGNfdXRpbC5oIgorI2luY2x1ZGUgInJwY19vdXRwdXQuaCIKKworCitzdGF0aWMgaW50CXVuZGVmaW5lZDIoY2hhciAqdHlwZSwgY2hhciAqc3RvcCk7CitzdGF0aWMgdm9pZAlweGRyZnVuY2RlY2woY2hhciAqbmFtZSwgaW50IHBvaW50ZXJwKTsKK3N0YXRpYyB2b2lkCXBjb25zdGRlZihkZWZpbml0aW9uICpkZWYpOworc3RhdGljIHZvaWQJcGFyZ2RlZihkZWZpbml0aW9uICpkZWYpOworc3RhdGljIHZvaWQJcHN0cnVjdGRlZihkZWZpbml0aW9uICpkZWYpOworc3RhdGljIHZvaWQJcHVuaW9uZGVmKGRlZmluaXRpb24gKmRlZik7CitzdGF0aWMgdm9pZAlwZGVmaW5lKGNoYXIgKm5hbWUsIGNoYXIgKm51bSk7CitzdGF0aWMgdm9pZAlwdWxkZWZpbmUoY2hhciAqbmFtZSwgY2hhciAqbnVtKTsKK3N0YXRpYyBpbnQJZGVmaW5lX3ByaW50ZWQocHJvY19saXN0ICpzdG9wLCB2ZXJzaW9uX2xpc3QgKnN0YXJ0KTsKK3N0YXRpYyB2b2lkCXBwcm9ncmFtZGVmKGRlZmluaXRpb24gKmRlZik7CitzdGF0aWMgdm9pZAlwcHJvY2RlZihwcm9jX2xpc3QgKnByb2MsIHZlcnNpb25fbGlzdCAqdnAsCisJCQkJY2hhciAqYWRkYXJndHlwZSwgaW50IHNlcnZlcl9wLCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZAlwYXJnbGlzdChwcm9jX2xpc3QgKnByb2MsIGNoYXIgKmFkZGFyZ3R5cGUpOworc3RhdGljIHZvaWQJcGVudW1kZWYoZGVmaW5pdGlvbiAqZGVmKTsKK3N0YXRpYyB2b2lkCXB0eXBlZGVmKGRlZmluaXRpb24gKmRlZik7CisKKy8qCisgKiBQcmludCB0aGUgQy12ZXJzaW9uIG9mIGFuIHhkciBkZWZpbml0aW9uIAorICovCit2b2lkCitwcmludF9kYXRhZGVmKGRlZmluaXRpb24gKmRlZikKK3sKKworCWlmIChkZWYtPmRlZl9raW5kID09IERFRl9QUk9HUkFNICkgIC8qIGhhbmRsZSBkYXRhIG9ubHkgKi8KKwkgICAgICAgIHJldHVybjsKKworCWlmIChkZWYtPmRlZl9raW5kICE9IERFRl9DT05TVCkgeworCQlmX3ByaW50KGZvdXQsICJcbiIpOworCX0KKwlzd2l0Y2ggKGRlZi0+ZGVmX2tpbmQpIHsKKwljYXNlIERFRl9TVFJVQ1Q6CisJCXBzdHJ1Y3RkZWYoZGVmKTsKKwkJYnJlYWs7CisJY2FzZSBERUZfVU5JT046CisJCXB1bmlvbmRlZihkZWYpOworCQlicmVhazsKKwljYXNlIERFRl9FTlVNOgorCQlwZW51bWRlZihkZWYpOworCQlicmVhazsKKwljYXNlIERFRl9UWVBFREVGOgorCQlwdHlwZWRlZihkZWYpOworCQlicmVhazsKKwljYXNlIERFRl9QUk9HUkFNOgorCQlwcHJvZ3JhbWRlZihkZWYpOworCQlicmVhazsKKwljYXNlIERFRl9DT05TVDoKKwkJcGNvbnN0ZGVmKGRlZik7CisJCWJyZWFrOworCX0KKwlpZiAoZGVmLT5kZWZfa2luZCAhPSBERUZfUFJPR1JBTSAmJiBkZWYtPmRlZl9raW5kICE9IERFRl9DT05TVCkgeworCSAgcHhkcmZ1bmNkZWNsKCBkZWYtPmRlZl9uYW1lLAorCQkgICAgICAgZGVmLT5kZWZfa2luZCAhPSBERUZfVFlQRURFRiB8fAorCQkgICAgICAgIWlzdmVjdG9yZGVmKGRlZi0+ZGVmLnR5Lm9sZF90eXBlLCBkZWYtPmRlZi50eS5yZWwpKTsKKworCX0KK30KKworCit2b2lkCitwcmludF9mdW5jZGVmKGRlZmluaXRpb24gKmRlZikKK3sKKwlzd2l0Y2ggKGRlZi0+ZGVmX2tpbmQpIHsKKwljYXNlIERFRl9QUk9HUkFNOgorCQlmX3ByaW50KGZvdXQsICJcbiIpOworCQlwcHJvZ3JhbWRlZihkZWYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitweGRyZnVuY2RlY2woY2hhciAqbmFtZSwgaW50IHBvaW50ZXJwKQoreworCWZfcHJpbnQoZm91dCwKKwkiI2lmZGVmIF9fY3BsdXNwbHVzIFxuIgorCSJleHRlcm4gXCJDXCIgYm9vbF90IHhkcl8lcyhYRFIgKiwgJXMlcyk7XG4iCisJIiNlbGlmIF9fU1REQ19fIFxuIgorCSJleHRlcm4gIGJvb2xfdCB4ZHJfJXMoWERSICosICVzJXMpO1xuIgorCSIjZWxzZSAvKiBPbGQgU3R5bGUgQyAqLyBcbiIKKwkiYm9vbF90IHhkcl8lcygpO1xuIgorCSIjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gXG5cbiIsCisJbmFtZSwgbmFtZSwgcG9pbnRlcnAgPyAiKiIgOiAiIiwKKwluYW1lLCBuYW1lLCBwb2ludGVycCA/ICIqIiA6ICIiLAorCW5hbWUpOworfQorCisKK3N0YXRpYyB2b2lkCitwY29uc3RkZWYoZGVmaW5pdGlvbiAqZGVmKQoreworCXBkZWZpbmUoZGVmLT5kZWZfbmFtZSwgZGVmLT5kZWYuY28pOworfQorCisvKiBwcmludCBvdXQgdGhlIGRlZmluaXRpb25zIGZvciB0aGUgYXJndW1lbnRzIG9mIGZ1bmN0aW9ucyBpbiB0aGUgCisgICBoZWFkZXIgZmlsZSAKKyovCitzdGF0aWMgIHZvaWQKK3BhcmdkZWYoZGVmaW5pdGlvbiAqZGVmKQoreworCWRlY2xfbGlzdCAqbDsKKwl2ZXJzaW9uX2xpc3QgKnZlcnM7CisJY2hhciAqbmFtZTsKKwlwcm9jX2xpc3QgKnBsaXN0OworCisJCisJZm9yICh2ZXJzID0gZGVmLT5kZWYucHIudmVyc2lvbnM7IHZlcnMgIT0gTlVMTDsgdmVycyA9IHZlcnMtPm5leHQpIHsKKwkJCWZvcihwbGlzdCA9IHZlcnMtPnByb2NzOyBwbGlzdCAhPSBOVUxMOyAKKwkJCSAgICBwbGlzdCA9IHBsaXN0LT5uZXh0KSB7CisJCQkJCisJCQkJaWYgKCFuZXdzdHlsZSB8fCBwbGlzdC0+YXJnX251bSA8IDIpIHsKKwkJCQkJY29udGludWU7IC8qIG9sZCBzdHlsZSBvciBzaW5nbGUgYXJncyAqLworCQkJCX0KKwkJCQluYW1lID0gcGxpc3QtPmFyZ3MuYXJnbmFtZTsKKwkJCQlmX3ByaW50KGZvdXQsICJzdHJ1Y3QgJXMge1xuIiwgbmFtZSk7CisJCQkJZm9yIChsID0gcGxpc3QtPmFyZ3MuZGVjbHM7IAorCQkJCSAgICAgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworCQkJCQlwZGVjbGFyYXRpb24obmFtZSwgJmwtPmRlY2wsIDEsICI7XG4iICk7CisJCQkJfQorCQkJCWZfcHJpbnQoZm91dCwgIn07XG4iKTsKKwkJCQlmX3ByaW50KGZvdXQsICJ0eXBlZGVmIHN0cnVjdCAlcyAlcztcbiIsIG5hbWUsIG5hbWUpOworCQkJCXB4ZHJmdW5jZGVjbChuYW1lLCAwKTsKKwkJCQlmX3ByaW50KCBmb3V0LCAiXG4iICk7CisJCQl9CisJCX0KKworfQorCisKK3N0YXRpYyB2b2lkCitwc3RydWN0ZGVmKGRlZmluaXRpb24gKmRlZikKK3sKKwlkZWNsX2xpc3QgKmw7CisJY2hhciAqbmFtZSA9IGRlZi0+ZGVmX25hbWU7CisKKwlmX3ByaW50KGZvdXQsICJzdHJ1Y3QgJXMge1xuIiwgbmFtZSk7CisJZm9yIChsID0gZGVmLT5kZWYuc3QuZGVjbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJcGRlY2xhcmF0aW9uKG5hbWUsICZsLT5kZWNsLCAxLCAiO1xuIik7CisJfQorCWZfcHJpbnQoZm91dCwgIn07XG4iKTsKKwlmX3ByaW50KGZvdXQsICJ0eXBlZGVmIHN0cnVjdCAlcyAlcztcbiIsIG5hbWUsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZAorcHVuaW9uZGVmKGRlZmluaXRpb24gKmRlZikKK3sKKwljYXNlX2xpc3QgICAgICAqbDsKKwljaGFyICAgICAgICAgICAqbmFtZSA9IGRlZi0+ZGVmX25hbWU7CisJZGVjbGFyYXRpb24gICAgKmRlY2w7CisKKwlmX3ByaW50KGZvdXQsICJzdHJ1Y3QgJXMge1xuIiwgbmFtZSk7CisJZGVjbCA9ICZkZWYtPmRlZi51bi5lbnVtX2RlY2w7CisJaWYgKHN0cmVxKGRlY2wtPnR5cGUsICJib29sIikpIHsKKwkJZl9wcmludChmb3V0LCAiXHRib29sX3QgJXM7XG4iLCBkZWNsLT5uYW1lKTsKKwl9IGVsc2UgeworCQlmX3ByaW50KGZvdXQsICJcdCVzICVzO1xuIiwgZGVjbC0+dHlwZSwgZGVjbC0+bmFtZSk7CisJfQorCWZfcHJpbnQoZm91dCwgIlx0dW5pb24ge1xuIik7CisJZm9yIChsID0gZGVmLT5kZWYudW4uY2FzZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJaWYgKGwtPmNvbnRmbGFnID09IDApCisJCQlwZGVjbGFyYXRpb24obmFtZSwgJmwtPmNhc2VfZGVjbCwgMiwgIjtcbiIpOworCX0KKwlkZWNsID0gZGVmLT5kZWYudW4uZGVmYXVsdF9kZWNsOworCWlmIChkZWNsICYmICFzdHJlcShkZWNsLT50eXBlLCAidm9pZCIpKSB7CisJCXBkZWNsYXJhdGlvbihuYW1lLCBkZWNsLCAyLCAiO1xuIik7CisJfQorCWZfcHJpbnQoZm91dCwgIlx0fSAlc191O1xuIiwgbmFtZSk7CisJZl9wcmludChmb3V0LCAifTtcbiIpOworCWZfcHJpbnQoZm91dCwgInR5cGVkZWYgc3RydWN0ICVzICVzO1xuIiwgbmFtZSwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwZGVmaW5lKGNoYXIgKm5hbWUsIGNoYXIgKm51bSkKK3sKKwlmX3ByaW50KGZvdXQsICIjZGVmaW5lICVzICVzXG4iLCBuYW1lLCBudW0pOworfQorCitzdGF0aWMgdm9pZAorcHVsZGVmaW5lKGNoYXIgKm5hbWUsIGNoYXIgKm51bSkKK3sKKwlmX3ByaW50KGZvdXQsICIjZGVmaW5lICVzICgodV9pbnQzMl90KSVzKVxuIiwgbmFtZSwgbnVtKTsKK30KKworc3RhdGljIGludAorZGVmaW5lX3ByaW50ZWQocHJvY19saXN0ICpzdG9wLCB2ZXJzaW9uX2xpc3QgKnN0YXJ0KQoreworCXZlcnNpb25fbGlzdCAqdmVyczsKKwlwcm9jX2xpc3QgKnByb2M7CisKKwlmb3IgKHZlcnMgPSBzdGFydDsgdmVycyAhPSBOVUxMOyB2ZXJzID0gdmVycy0+bmV4dCkgeworCQlmb3IgKHByb2MgPSB2ZXJzLT5wcm9jczsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQkJaWYgKHByb2MgPT0gc3RvcCkgeworCQkJCXJldHVybiAoMCk7CisJCQl9IGVsc2UgaWYgKHN0cmVxKHByb2MtPnByb2NfbmFtZSwgc3RvcC0+cHJvY19uYW1lKSkgeworCQkJCXJldHVybiAoMSk7CisJCQl9CisJCX0KKwl9CisJYWJvcnQoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkCitwcHJvZ3JhbWRlZihkZWZpbml0aW9uICpkZWYpCit7CisJdmVyc2lvbl9saXN0ICAgKnZlcnM7CisJcHJvY19saXN0ICAgICAgKnByb2M7CisJaW50ICAgICAgICAgICAgIGk7CisJY2hhciAgICAgICAgICAgKmV4dDsKKworCXBhcmdkZWYoZGVmKTsKKworCXB1bGRlZmluZShkZWYtPmRlZl9uYW1lLCBkZWYtPmRlZi5wci5wcm9nX251bSk7CisJZm9yICh2ZXJzID0gZGVmLT5kZWYucHIudmVyc2lvbnM7IHZlcnMgIT0gTlVMTDsgdmVycyA9IHZlcnMtPm5leHQpIHsKKwkJaWYgKHRibGZsYWcpIHsKKwkJCWZfcHJpbnQoZm91dCwgImV4dGVybiBzdHJ1Y3QgcnBjZ2VuX3RhYmxlICVzXyVzX3RhYmxlW107XG4iLAorCQkJCWxvY2FzZShkZWYtPmRlZl9uYW1lKSwgdmVycy0+dmVyc19udW0pOworCQkJZl9wcmludChmb3V0LCAiZXh0ZXJuICVzXyVzX25wcm9jO1xuIiwKKwkJCQlsb2Nhc2UoZGVmLT5kZWZfbmFtZSksIHZlcnMtPnZlcnNfbnVtKTsKKwkJfQorCQlwdWxkZWZpbmUodmVycy0+dmVyc19uYW1lLCB2ZXJzLT52ZXJzX251bSk7CisKKwkJLyoKKwkJICogUHJpbnQgb3V0IDMgZGVmaW5pdGlvbnMsIG9uZSBmb3IgQU5TSS1DLCBhbm90aGVyIGZvciBDKyssCisJCSAqIGEgdGhpcmQgZm9yIG9sZCBzdHlsZSBDCisJCSAqLworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWlmIChpID09IDApIHsKKwkJCQlmX3ByaW50KGZvdXQsICJcbiNpZmRlZiBfX2NwbHVzcGx1c1xuIik7CisJCQkJZXh0ID0gImV4dGVybiBcIkNcIiAiOworCQkJfSBlbHNlIGlmIChpID09IDEpIHsKKwkJCQlmX3ByaW50KGZvdXQsICJcbiNlbGlmIF9fU1REQ19fXG4iKTsKKwkJCQlleHQgPSAiZXh0ZXJuICAiOworCQkJfSBlbHNlIHsKKwkJCQlmX3ByaW50KGZvdXQsICJcbiNlbHNlIC8qIE9sZCBTdHlsZSBDICovIFxuIik7CisJCQkJZXh0ID0gImV4dGVybiAgIjsKKwkJCX0KKworCisJCQlmb3IgKHByb2MgPSB2ZXJzLT5wcm9jczsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQkJCWlmICghZGVmaW5lX3ByaW50ZWQocHJvYywgZGVmLT5kZWYucHIudmVyc2lvbnMpKSB7CisJCQkJCXB1bGRlZmluZShwcm9jLT5wcm9jX25hbWUsIHByb2MtPnByb2NfbnVtKTsKKwkJCQl9CisJCQkJZl9wcmludChmb3V0LCAiJXMiLCBleHQpOworCQkJCXBwcm9jZGVmKHByb2MsIHZlcnMsICJDTElFTlQgKiIsIDAsIGkpOworCQkJCWZfcHJpbnQoZm91dCwgIiVzIiwgZXh0KTsKKwkJCQlwcHJvY2RlZihwcm9jLCB2ZXJzLCAic3RydWN0IHN2Y19yZXEgKiIsIDEsIGkpOworCisJCQl9CisKKwkJfQorCQlmX3ByaW50KGZvdXQsICIjZW5kaWYgLyogT2xkIFN0eWxlIEMgKi8gXG4iKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcHJvY2RlZihwcm9jX2xpc3QgKnByb2MsIHZlcnNpb25fbGlzdCAqdnAsIGNoYXIgKmFkZGFyZ3R5cGUsCisJCQkJaW50IHNlcnZlcl9wLCBpbnQgbW9kZSkKK3sKKwlwdHlwZShwcm9jLT5yZXNfcHJlZml4LCBwcm9jLT5yZXNfdHlwZSwgMSk7CisJZl9wcmludChmb3V0LCAiKiAiKTsKKwlpZiAoc2VydmVyX3ApCisJCXB2bmFtZV9zdmMocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCWVsc2UKKwkJcHZuYW1lKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKworCS8qCisJICogbW9kZSAgMCA9PSBjcGx1c3BsdXMsIG1vZGUgIDEgPSBBTlNJLUMsIG1vZGUgMiA9IG9sZCBzdHlsZSBDCisJICovCisJaWYgKG1vZGUgPT0gMCB8fCBtb2RlID09IDEpCisJCXBhcmdsaXN0KHByb2MsIGFkZGFyZ3R5cGUpOworCWVsc2UKKwkJZl9wcmludChmb3V0LCAiKCk7XG4iKTsKK30KKworCisKKy8qIHByaW50IG91dCBhcmd1bWVudCBsaXN0IG9mIHByb2NlZHVyZSAqLworc3RhdGljIHZvaWQKK3BhcmdsaXN0KHByb2NfbGlzdCAqcHJvYywgY2hhciAqYWRkYXJndHlwZSkKK3sKKwlkZWNsX2xpc3QgICAgICAqZGw7CisKKwlmX3ByaW50KGZvdXQsICIoIik7CisKKwlpZiAocHJvYy0+YXJnX251bSA8IDIgJiYgbmV3c3R5bGUgJiYKKwkJc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKSB7CisJCS8qIDAgYXJndW1lbnQgaW4gbmV3IHN0eWxlOiAgZG8gbm90aGluZyAqLworCX0gZWxzZSB7CisJCWZvciAoZGwgPSBwcm9jLT5hcmdzLmRlY2xzOyBkbCAhPSBOVUxMOyBkbCA9IGRsLT5uZXh0KSB7CisJCQlwdHlwZShkbC0+ZGVjbC5wcmVmaXgsIGRsLT5kZWNsLnR5cGUsIDEpOworCQkJaWYgKCFuZXdzdHlsZSkKKwkJCQlmX3ByaW50KGZvdXQsICIqIik7CS8qIG9sZCBzdHlsZSBwYXNzZXMgYnkgcmVmZXJlbmNlICovCisKKwkJCWZfcHJpbnQoZm91dCwgIiwgIik7CisJCX0KKwl9CisKKwlmX3ByaW50KGZvdXQsICIlcyk7XG4iLCBhZGRhcmd0eXBlKTsKK30KKworc3RhdGljIHZvaWQKK3BlbnVtZGVmKGRlZmluaXRpb24gKmRlZikKK3sKKwljaGFyICpuYW1lID0gZGVmLT5kZWZfbmFtZTsKKwllbnVtdmFsX2xpc3QgKmw7CisJY2hhciAqbGFzdCA9IE5VTEw7CisJaW50IGNvdW50ID0gMDsKKworCWZfcHJpbnQoZm91dCwgImVudW0gJXMge1xuIiwgbmFtZSk7CisJZm9yIChsID0gZGVmLT5kZWYuZW4udmFsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworCQlmX3ByaW50KGZvdXQsICJcdCVzIiwgbC0+bmFtZSk7CisJCWlmIChsLT5hc3NpZ25tZW50KSB7CisJCQlmX3ByaW50KGZvdXQsICIgPSAlcyIsIGwtPmFzc2lnbm1lbnQpOworCQkJbGFzdCA9IGwtPmFzc2lnbm1lbnQ7CisJCQljb3VudCA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAobGFzdCA9PSBOVUxMKSB7CisJCQkJZl9wcmludChmb3V0LCAiID0gJWQiLCBjb3VudCsrKTsKKwkJCX0gZWxzZSB7CisJCQkJZl9wcmludChmb3V0LCAiID0gJXMgKyAlZCIsIGxhc3QsIGNvdW50KyspOworCQkJfQorCQl9CisJCWZfcHJpbnQoZm91dCwgIixcbiIpOworCX0KKwlmX3ByaW50KGZvdXQsICJ9O1xuIik7CisJZl9wcmludChmb3V0LCAidHlwZWRlZiBlbnVtICVzICVzO1xuIiwgbmFtZSwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkCitwdHlwZWRlZihkZWZpbml0aW9uICpkZWYpCit7CisJY2hhciAqbmFtZSA9IGRlZi0+ZGVmX25hbWU7CisJY2hhciAqb2xkID0gZGVmLT5kZWYudHkub2xkX3R5cGU7CisJY2hhciBwcmVmaXhbOF07CS8qIGVub3VnaCB0byBjb250YWluICJzdHJ1Y3QgIiwgaW5jbHVkaW5nIE5VTCAqLworCXJlbGF0aW9uIHJlbCA9IGRlZi0+ZGVmLnR5LnJlbDsKKworCisJaWYgKCFzdHJlcShuYW1lLCBvbGQpKSB7CisJCWlmIChzdHJlcShvbGQsICJzdHJpbmciKSkgeworCQkJb2xkID0gImNoYXIiOworCQkJcmVsID0gUkVMX1BPSU5URVI7CisJCX0gZWxzZSBpZiAoc3RyZXEob2xkLCAib3BhcXVlIikpIHsKKwkJCW9sZCA9ICJjaGFyIjsKKwkJfSBlbHNlIGlmIChzdHJlcShvbGQsICJib29sIikpIHsKKwkJCW9sZCA9ICJib29sX3QiOworCQl9CisJCWlmICh1bmRlZmluZWQyKG9sZCwgbmFtZSkgJiYgZGVmLT5kZWYudHkub2xkX3ByZWZpeCkgeworCQkJc19wcmludChwcmVmaXgsICIlcyAiLCBkZWYtPmRlZi50eS5vbGRfcHJlZml4KTsKKwkJfSBlbHNlIHsKKwkJCXByZWZpeFswXSA9IDA7CisJCX0KKwkJZl9wcmludChmb3V0LCAidHlwZWRlZiAiKTsKKwkJc3dpdGNoIChyZWwpIHsKKwkJY2FzZSBSRUxfQVJSQVk6CisJCQlmX3ByaW50KGZvdXQsICJzdHJ1Y3Qge1xuIik7CisJCQlmX3ByaW50KGZvdXQsICJcdHVfaW50ICVzX2xlbjtcbiIsIG5hbWUpOworCQkJZl9wcmludChmb3V0LCAiXHQlcyVzIColc192YWw7XG4iLCBwcmVmaXgsIG9sZCwgbmFtZSk7CisJCQlmX3ByaW50KGZvdXQsICJ9ICVzIiwgbmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBSRUxfUE9JTlRFUjoKKwkJCWZfcHJpbnQoZm91dCwgIiVzJXMgKiVzIiwgcHJlZml4LCBvbGQsIG5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgUkVMX1ZFQ1RPUjoKKwkJCWZfcHJpbnQoZm91dCwgIiVzJXMgJXNbJXNdIiwgcHJlZml4LCBvbGQsIG5hbWUsCisJCQkJZGVmLT5kZWYudHkuYXJyYXlfbWF4KTsKKwkJCWJyZWFrOworCQljYXNlIFJFTF9BTElBUzoKKwkJCWZfcHJpbnQoZm91dCwgIiVzJXMgJXMiLCBwcmVmaXgsIG9sZCwgbmFtZSk7CisJCQlicmVhazsKKwkJfQorCQlmX3ByaW50KGZvdXQsICI7XG4iKTsKKwl9Cit9CisKK3ZvaWQKK3BkZWNsYXJhdGlvbihjaGFyICpuYW1lLCBkZWNsYXJhdGlvbiAqZGVjLCBpbnQgdGFiLCBjaGFyICpzZXBhcmF0b3IpCit7CisJY2hhciBidWZbOF07CS8qIGVub3VnaCB0byBob2xkICJzdHJ1Y3QgIiwgaW5jbHVkZSBOVUwgKi8KKwljaGFyICpwcmVmaXg7CisJY2hhciAqdHlwZTsKKworCWlmIChzdHJlcShkZWMtPnR5cGUsICJ2b2lkIikpIHsKKwkJcmV0dXJuOworCX0KKwl0YWJpZnkoZm91dCwgdGFiKTsKKwlpZiAoc3RyZXEoZGVjLT50eXBlLCBuYW1lKSAmJiAhZGVjLT5wcmVmaXgpIHsKKwkJZl9wcmludChmb3V0LCAic3RydWN0ICIpOworCX0KKwlpZiAoc3RyZXEoZGVjLT50eXBlLCAic3RyaW5nIikpIHsKKwkJZl9wcmludChmb3V0LCAiY2hhciAqJXMiLCBkZWMtPm5hbWUpOworCX0gZWxzZSB7CisJCXByZWZpeCA9ICIiOworCQlpZiAoc3RyZXEoZGVjLT50eXBlLCAiYm9vbCIpKSB7CisJCQl0eXBlID0gImJvb2xfdCI7CisJCX0gZWxzZSBpZiAoc3RyZXEoZGVjLT50eXBlLCAib3BhcXVlIikpIHsKKwkJCXR5cGUgPSAiY2hhciI7CisJCX0gZWxzZSB7CisJCQlpZiAoZGVjLT5wcmVmaXgpIHsKKwkJCQlzX3ByaW50KGJ1ZiwgIiVzICIsIGRlYy0+cHJlZml4KTsKKwkJCQlwcmVmaXggPSBidWY7CisJCQl9CisJCQl0eXBlID0gZGVjLT50eXBlOworCQl9CisJCXN3aXRjaCAoZGVjLT5yZWwpIHsKKwkJY2FzZSBSRUxfQUxJQVM6CisJCQlmX3ByaW50KGZvdXQsICIlcyVzICVzIiwgcHJlZml4LCB0eXBlLCBkZWMtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgUkVMX1ZFQ1RPUjoKKwkJCWZfcHJpbnQoZm91dCwgIiVzJXMgJXNbJXNdIiwgcHJlZml4LCB0eXBlLCBkZWMtPm5hbWUsCisJCQkJZGVjLT5hcnJheV9tYXgpOworCQkJYnJlYWs7CisJCWNhc2UgUkVMX1BPSU5URVI6CisJCQlmX3ByaW50KGZvdXQsICIlcyVzIColcyIsIHByZWZpeCwgdHlwZSwgZGVjLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFJFTF9BUlJBWToKKwkJCWZfcHJpbnQoZm91dCwgInN0cnVjdCB7XG4iKTsKKwkJCXRhYmlmeShmb3V0LCB0YWIpOworCQkJZl9wcmludChmb3V0LCAiXHR1X2ludCAlc19sZW47XG4iLCBkZWMtPm5hbWUpOworCQkJdGFiaWZ5KGZvdXQsIHRhYik7CisJCQlmX3ByaW50KGZvdXQsICJcdCVzJXMgKiVzX3ZhbDtcbiIsIHByZWZpeCwgdHlwZSwgZGVjLT5uYW1lKTsKKwkJCXRhYmlmeShmb3V0LCB0YWIpOworCQkJZl9wcmludChmb3V0LCAifSAlcyIsIGRlYy0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlmX3ByaW50KGZvdXQsIHNlcGFyYXRvciApOworfQorCitzdGF0aWMgaW50Cit1bmRlZmluZWQyKGNoYXIgKnR5cGUsIGNoYXIgKnN0b3ApCit7CisJbGlzdCAqbDsKKwlkZWZpbml0aW9uICpkZWY7CisKKwlmb3IgKGwgPSBkZWZpbmVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCWRlZiA9IChkZWZpbml0aW9uICopIGwtPnZhbDsKKwkJaWYgKGRlZi0+ZGVmX2tpbmQgIT0gREVGX1BST0dSQU0pIHsKKwkJCWlmIChzdHJlcShkZWYtPmRlZl9uYW1lLCBzdG9wKSkgeworCQkJCXJldHVybiAoMSk7CisJCQl9IGVsc2UgaWYgKHN0cmVxKGRlZi0+ZGVmX25hbWUsIHR5cGUpKSB7CisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gKDEpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfbWFpbi5jIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YWE2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19tYWluLmMKQEAgLTAsMCArMSwxMDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWYgMAorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXJwY19tYWluLmMgMS4zMCA4OS8wMy8zMCAoQykgMTk4NyBTTUkiOworI2VuZGlmCisKKy8qCisgKiBycGNfbWFpbi5jLCBUb3AgbGV2ZWwgb2YgdGhlIFJQQyBwcm90b2NvbCBjb21waWxlci4gCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJycGNfcGFyc2UuaCIKKyNpbmNsdWRlICJycGNfdXRpbC5oIgorI2luY2x1ZGUgInJwY19zY2FuLmgiCisKK3N0cnVjdCBjb21tYW5kbGluZSB7CisJaW50IGNmbGFnOwkJLyogeGRyIEMgcm91dGluZXMgKi8KKwlpbnQgaGZsYWc7CQkvKiBoZWFkZXIgZmlsZSAqLworCWludCBsZmxhZzsJCS8qIGNsaWVudCBzaWRlIHN0dWJzICovCisJaW50IG1mbGFnOwkJLyogc2VydmVyIHNpZGUgc3R1YnMgKi8KKwlpbnQgbmZsYWc7CQkvKiBuZXRpZCBmbGFnICovCisJaW50IHNmbGFnOwkJLyogc2VydmVyIHN0dWJzIGZvciB0aGUgZ2l2ZW4gdHJhbnNwb3J0ICovCisJaW50IHRmbGFnOwkJLyogZGlzcGF0Y2ggVGFibGUgZmlsZSAqLworCWludCBTc2ZsYWc7CQkvKiBwcm9kdWNlIHNlcnZlciBzYW1wbGUgY29kZSAqLworCWludCBTY2ZsYWc7CQkvKiBwcm9kdWNlIGNsaWVudCBzYW1wbGUgY29kZSAqLworCWNoYXIgKmluZmlsZTsJCS8qIGlucHV0IG1vZHVsZSBuYW1lICovCisJY2hhciAqb3V0ZmlsZTsJCS8qIG91dHB1dCBtb2R1bGUgbmFtZSAqLworfTsKKworc3RhdGljIGNoYXIgKglleHRlbmRmaWxlKGNoYXIgKmZpbGUsIGNoYXIgKmV4dCk7CitzdGF0aWMgdm9pZAlvcGVuX291dHB1dChjaGFyICppbmZpbGUsIGNoYXIgKm91dGZpbGUpOworc3RhdGljIHZvaWQJYWRkX3dhcm5pbmcodm9pZCk7CitzdGF0aWMgdm9pZAljbGVhcl9hcmdzKHZvaWQpOworc3RhdGljIHZvaWQJb3Blbl9pbnB1dChjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSk7CitzdGF0aWMgaW50CWNoZWNrX25ldHR5cGUoY2hhciAqbmFtZSwgY2hhciAqKmxpc3RfdG9fY2hlY2spOworc3RhdGljIHZvaWQJY19vdXRwdXQoY2hhciAqaW5maWxlLCBjaGFyICpkZWZpbmUsIGludCBleHRlbmQsIGNoYXIgKm91dGZpbGUpOworc3RhdGljIHZvaWQJY19pbml0aWFsaXplKHZvaWQpOworc3RhdGljIGNoYXIgKglnZW5lcmF0ZV9ndWFyZChjaGFyICpwYXRobmFtZSk7CitzdGF0aWMgdm9pZAloX291dHB1dChjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwgY2hhciAqb3V0ZmlsZSk7CitzdGF0aWMgdm9pZAlzX291dHB1dChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNoYXIgKmluZmlsZSwKKwkJCWNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwgY2hhciAqb3V0ZmlsZSwKKwkJCWludCBub21haW4sIGludCBuZXRmbGFnKTsKK3N0YXRpYyB2b2lkCWxfb3V0cHV0KGNoYXIgKmluZmlsZSwgY2hhciAqZGVmaW5lLCBpbnQgZXh0ZW5kLCBjaGFyICpvdXRmaWxlKTsKK3N0YXRpYyB2b2lkCXRfb3V0cHV0KGNoYXIgKmluZmlsZSwgY2hhciAqZGVmaW5lLCBpbnQgZXh0ZW5kLCBjaGFyICpvdXRmaWxlKTsKK3N0YXRpYyB2b2lkCXN2Y19vdXRwdXQoY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqKTsKK3N0YXRpYyB2b2lkCWNsbnRfb3V0cHV0KGNoYXIgKiwgY2hhciAqLCBpbnQsIGNoYXIgKik7CitzdGF0aWMgaW50CWRvX3JlZ2lzdGVycyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworc3RhdGljIHZvaWQJYWRkYXJnKGNoYXIgKmNwKTsKK3N0YXRpYyB2b2lkCXB1dGFyZyhpbnQgd2hlcmUsIGNoYXIgKmNwKTsKK3N0YXRpYyB2b2lkCWNoZWNrZmlsZXMoY2hhciAqaW5maWxlLCBjaGFyICpvdXRmaWxlKTsKK3N0YXRpYyBpbnQJcGFyc2VhcmdzKGludCBhcmdjLCBjaGFyICoqYXJndiwgc3RydWN0IGNvbW1hbmRsaW5lICpjbWQpOworc3RhdGljIHZvaWQJdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZAlvcHRpb25zX3VzYWdlKHZvaWQpOworCisvKgorZXh0ZXJuIHZvaWQgIHdyaXRlX3NhbXBsZV9zdmMoKTsKK2ludCB3cml0ZV9zYW1wbGVfY2xudCgpOwordm9pZCB3cml0ZV9zYW1wbGVfY2xudF9tYWluKCk7CisKK3N0YXRpYyBzdmNfb3V0cHV0KCk7CisgKi8KKworI2RlZmluZSBFWFRFTkQJMQkJLyogYWxpYXMgZm9yIFRSVUUgKi8KKyNkZWZpbmUgRE9OVF9FWFRFTkQJMAkJLyogYWxpYXMgZm9yIEZBTFNFICovCisKKyNkZWZpbmUgU1ZSNF9DUFAgIi91c3IvY2NzL2xpYi9jcHAiCisjZGVmaW5lIFNVTk9TX0NQUCAiL2xpYi9jcHAiCitzdGF0aWMgaW50IGNwcERlZmluZWQgPSAwOyAgICAgICAgICAvKiBleHBsaWNpdCBwYXRoIGZvciBDIHByZXByb2Nlc3NvciAqLworCisKK3N0YXRpYyBjaGFyICpjbWRuYW1lOworCitzdGF0aWMgY2hhciAqc3ZjY2xvc2V0aW1lID0gIjEyMCI7CitzdGF0aWMgY2hhciAqQ1BQID0gU1ZSNF9DUFA7CitzdGF0aWMgY2hhciBDUFBGTEFHU1tdID0gIi1DIjsKK3N0YXRpYyBjaGFyIHBhdGhidWZbTUFYUEFUSExFTiArIDFdOworc3RhdGljIGNoYXIgKmFsbHZbXSA9IHsKKwkicnBjZ2VuIiwgIi1zIiwgInVkcCIsICItcyIsICJ0Y3AiLAorfTsKK3N0YXRpYyBpbnQgYWxsYyA9IHNpemVvZihhbGx2KS9zaXplb2YoYWxsdlswXSk7CitzdGF0aWMgY2hhciAqYWxsbnZbXSA9IHsKKwkicnBjZ2VuIiwgIi1zIiwgIm5ldHBhdGgiLAorfTsKK3N0YXRpYyBpbnQgYWxsbmMgPSBzaXplb2YoYWxsbnYpL3NpemVvZihhbGxudlswXSk7CisKKy8qCisgKiBtYWNoaW5hdGlvbnMgZm9yIGhhbmRsaW5nIGV4cGFuZGluZyBhcmd1bWVudCBsaXN0CisgKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBhZGRhcmcoKTsJCS8qIGFkZCBhbm90aGVyIGFyZ3VtZW50IHRvIHRoZSBsaXN0ICovCitzdGF0aWMgdm9pZCBwdXRhcmcoKTsJCS8qIHB1dCBhcmd1bWVudCBhdCBzcGVjaWZpZWQgbG9jYXRpb24gICovCitzdGF0aWMgdm9pZCBjbGVhcl9hcmdzKCk7CS8qIGNsZWFyIGFyZ3VtZW50IGxpc3QgKi8KK3N0YXRpYyB2b2lkIGNoZWNrZmlsZXMoKTsJLyogY2hlY2sgaWYgb3V0IGZpbGUgYWxyZWFkeSBleGlzdHMgKi8KKyNlbmRpZgorCisKKworI2RlZmluZSBBUkdMSVNUTEVOCTIwCisjZGVmaW5lIEZJWEVEQVJHUyAgICAgICAgIDIKKworc3RhdGljIGNoYXIgKmFyZ2xpc3RbQVJHTElTVExFTl07CitzdGF0aWMgaW50IGFyZ2NvdW50ID0gRklYRURBUkdTOworCisKK2ludCBub25mYXRhbGVycm9yczsJLyogZXJyb3JzICovCitpbnQgaW5ldGRmbGFnLyogPSAxKi87CS8qIFN1cHBvcnQgZm9yIGluZXRkICovIC8qIGlzIG5vdyB0aGUgZGVmYXVsdCAqLworaW50IHBtZmxhZzsJCS8qIFN1cHBvcnQgZm9yIHBvcnQgbW9uaXRvcnMgKi8KK2ludCBsb2dmbGFnOwkJLyogVXNlIHN5c2xvZyBpbnN0ZWFkIG9mIGZwcmludGYgZm9yIGVycm9ycyAqLworaW50IHRibGZsYWc7CQkvKiBTdXBwb3J0IGZvciBkaXNwYXRjaCB0YWJsZSBmaWxlICovCisKKy8qIGxlbmd0aCBhdCB3aGljaCB0byBzdGFydCBkb2luZyBhbiBpbmxpbmUgKi8KKyNkZWZpbmUgSU5MSU5FIDMKKworaW50IElubGluZSA9IElOTElORTsJLyogbGVuZ3RoIGF0IHdoaWNoIHRvIHN0YXJ0IGRvaW5nIGFuIGlubGluZS4gMyA9IGRlZmF1bHQKKwkJCSAqIGlmIDAsIG5vIHhkcl9pbmxpbmUgY29kZSAqLworCitpbnQgaW5kZWZpbml0ZXdhaXQ7CS8qIElmIHN0YXJ0ZWQgYnkgcG9ydCBtb25pdG9ycywgaGFuZyB0aWxsIGl0IHdhbnRzICovCitpbnQgZXhpdG5vdzsJCS8qIElmIHN0YXJ0ZWQgYnkgcG9ydCBtb25pdG9ycywgZXhpdCBhZnRlciB0aGUgY2FsbCAqLworaW50IHRpbWVyZmxhZzsJCS8qIFRSVUUgaWYgIWluZGVmaW5pdGUgJiYgIWV4aXRub3cgKi8KK2ludCBuZXdzdHlsZTsgICAgICAgICAgIC8qIG5ld3N0eWxlIG9mIHBhc3NpbmcgYXJndW1lbnRzIChieSB2YWx1ZSkgKi8KK2ludCBDZmxhZyA9IDAgOyAgICAgICAgIC8qIEFOU0kgQyBzeW50YXggKi8KK3N0YXRpYyBpbnQgYWxsZmlsZXM7ICAgIC8qIGdlbmVyYXRlIGFsbCBmaWxlcyAqLworI2lmZGVmIGxpbnV4CitpbnQgdGlycGNmbGFnID0gMDsJLyogbm8gdGlycGMgYnkgZGVmYXVsdCAqLworI2Vsc2UKK2ludCB0aXJwY2ZsYWcgPSAxOyAgICAgIC8qIGdlbmVyYXRpbmcgY29kZSBmb3IgdGlycGMsIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZgorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBjb21tYW5kbGluZSBjbWQ7CisKKwkodm9pZCkgbWVtc2V0KChjaGFyICopICZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgY29tbWFuZGxpbmUpKTsKKwljbGVhcl9hcmdzKCk7CisJaWYgKCFwYXJzZWFyZ3MoYXJnYywgYXJndiwgJmNtZCkpCisJCXVzYWdlKCk7CisKKwlpZiAoY21kLmNmbGFnIHx8IGNtZC5oZmxhZyB8fCBjbWQubGZsYWcgfHwgY21kLnRmbGFnIHx8IGNtZC5zZmxhZyB8fAorCQljbWQubWZsYWcgfHwgY21kLm5mbGFnIHx8IGNtZC5Tc2ZsYWcgfHwgY21kLlNjZmxhZykgeworCQljaGVja2ZpbGVzKGNtZC5pbmZpbGUsIGNtZC5vdXRmaWxlKTsKKwl9IGVsc2UKKwkJY2hlY2tmaWxlcyhjbWQuaW5maWxlLCBOVUxMKTsKKworCWlmIChjbWQuY2ZsYWcpIHsKKwkJY19vdXRwdXQoY21kLmluZmlsZSwgIi1EUlBDX1hEUiIsIERPTlRfRVhURU5ELCBjbWQub3V0ZmlsZSk7CisJfSBlbHNlIGlmIChjbWQuaGZsYWcpIHsKKwkJaF9vdXRwdXQoY21kLmluZmlsZSwgIi1EUlBDX0hEUiIsIERPTlRfRVhURU5ELCBjbWQub3V0ZmlsZSk7CisJfSBlbHNlIGlmIChjbWQubGZsYWcpIHsKKwkJbF9vdXRwdXQoY21kLmluZmlsZSwgIi1EUlBDX0NMTlQiLCBET05UX0VYVEVORCwgY21kLm91dGZpbGUpOworCX0gZWxzZSBpZiAoY21kLnNmbGFnIHx8IGNtZC5tZmxhZyB8fCAoY21kLm5mbGFnKSkgeworCQlzX291dHB1dChhcmdjLCBhcmd2LCBjbWQuaW5maWxlLCAiLURSUENfU1ZDIiwgRE9OVF9FWFRFTkQsCisJCQljbWQub3V0ZmlsZSwgY21kLm1mbGFnLCBjbWQubmZsYWcpOworCX0gZWxzZSBpZiAoY21kLnRmbGFnKSB7CisJCXRfb3V0cHV0KGNtZC5pbmZpbGUsICItRFJQQ19UQkwiLCBET05UX0VYVEVORCwgY21kLm91dGZpbGUpOworCX0gZWxzZSBpZiAoY21kLlNzZmxhZykgeworCQlzdmNfb3V0cHV0KGNtZC5pbmZpbGUsICItRFJQQ19TRVJWRVIiLCBET05UX0VYVEVORCwgY21kLm91dGZpbGUpOworCX0gZWxzZSBpZiAoY21kLlNjZmxhZykgeworCQljbG50X291dHB1dChjbWQuaW5maWxlLCAiLURSUENfQ0xJRU5UIiwgRE9OVF9FWFRFTkQsIGNtZC5vdXRmaWxlKTsKKwl9IGVsc2UgeworCQkvKiB0aGUgcmVzY2FucyBhcmUgcmVxdWlyZWQsIHNpbmNlIGNwcCBtYXkgZWZmZWN0IGlucHV0ICovCisJCWNfb3V0cHV0KGNtZC5pbmZpbGUsICItRFJQQ19YRFIiLCBFWFRFTkQsICJfeGRyLmMiKTsKKwkJcmVpbml0aWFsaXplKCk7CisJCWhfb3V0cHV0KGNtZC5pbmZpbGUsICItRFJQQ19IRFIiLCBFWFRFTkQsICIuaCIpOworCQlyZWluaXRpYWxpemUoKTsKKwkJbF9vdXRwdXQoY21kLmluZmlsZSwgIi1EUlBDX0NMTlQiLCBFWFRFTkQsICJfY2xudC5jIik7CisJCXJlaW5pdGlhbGl6ZSgpOworCQlpZiAoaW5ldGRmbGFnIHx8ICF0aXJwY2ZsYWcpCisJCQlzX291dHB1dChhbGxjLCBhbGx2LCBjbWQuaW5maWxlLCAiLURSUENfU1ZDIiwgRVhURU5ELAorCQkJCSJfc3ZjLmMiLCBjbWQubWZsYWcsIGNtZC5uZmxhZyk7CisJCWVsc2UKKwkJCXNfb3V0cHV0KGFsbG5jLCBhbGxudiwgY21kLmluZmlsZSwgIi1EUlBDX1NWQyIsCisJCQkJRVhURU5ELCAiX3N2Yy5jIiwgY21kLm1mbGFnLCBjbWQubmZsYWcpOworCQlpZiAodGJsZmxhZykgeworCQkJcmVpbml0aWFsaXplKCk7CisJCQl0X291dHB1dChjbWQuaW5maWxlLCAiLURSUENfVEJMIiwgRVhURU5ELCAiX3RibC5pIik7CisJCX0KKwkJaWYgKGFsbGZpbGVzKSB7CisJCQlyZWluaXRpYWxpemUoKTsKKwkJCXN2Y19vdXRwdXQoY21kLmluZmlsZSwgIi1EUlBDX1NFUlZFUiIsIEVYVEVORCwgIl9zZXJ2ZXIuYyIpOworCQl9CisJCWlmIChhbGxmaWxlcykgeworCQkJcmVpbml0aWFsaXplKCk7CisJCQljbG50X291dHB1dChjbWQuaW5maWxlLCAiLURSUENfQ0xJRU5UIiwgRVhURU5ELCAiX2NsaWVudC5jIik7CisJCX0KKwl9CisJZXhpdChub25mYXRhbGVycm9ycyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogYWRkIGV4dGVuc2lvbiB0byBmaWxlbmFtZSAKKyAqLworc3RhdGljIGNoYXIgKgorZXh0ZW5kZmlsZShjaGFyICpmaWxlLCBjaGFyICpleHQpCit7CisJY2hhciAqcmVzOworCWNoYXIgKnA7CisKKwlyZXMgPSBhbGxvYyhzdHJsZW4oZmlsZSkgKyBzdHJsZW4oZXh0KSArIDEpOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlhYm9ydCgpOworCX0KKwlwID0gc3RycmNocihmaWxlLCAnLicpOworCWlmIChwID09IE5VTEwpIHsKKwkJcCA9IGZpbGUgKyBzdHJsZW4oZmlsZSk7CisJfQorCSh2b2lkKSBzdHJjcHkocmVzLCBmaWxlKTsKKwkodm9pZCkgc3RyY3B5KHJlcyArIChwIC0gZmlsZSksIGV4dCk7CisJcmV0dXJuIChyZXMpOworfQorCisvKgorICogT3BlbiBvdXRwdXQgZmlsZSB3aXRoIGdpdmVuIGV4dGVuc2lvbiAKKyAqLworc3RhdGljIHZvaWQKK29wZW5fb3V0cHV0KGNoYXIgKmluZmlsZSwgY2hhciAqb3V0ZmlsZSkKK3sKKworCWlmIChvdXRmaWxlID09IE5VTEwpIHsKKwkJZm91dCA9IHN0ZG91dDsKKwkJcmV0dXJuOworCX0KKworCWlmIChpbmZpbGUgIT0gTlVMTCAmJiBzdHJlcShvdXRmaWxlLCBpbmZpbGUpKSB7CisJCWZfcHJpbnQoc3RkZXJyLCAiJXM6IG91dHB1dCB3b3VsZCBvdmVyd3JpdGUgJXNcbiIsIGNtZG5hbWUsCisJCQlpbmZpbGUpOworCQljcmFzaCgpOworCX0KKwlmb3V0ID0gZm9wZW4ob3V0ZmlsZSwgInciKTsKKwlpZiAoZm91dCA9PSBOVUxMKSB7CisJCWZfcHJpbnQoc3RkZXJyLCAiJXM6IHVuYWJsZSB0byBvcGVuICIsIGNtZG5hbWUpOworCQlwZXJyb3Iob3V0ZmlsZSk7CisJCWNyYXNoKCk7CisJfQorCXJlY29yZF9vcGVuKG91dGZpbGUpOworCit9CisKK3N0YXRpYyB2b2lkCithZGRfd2FybmluZyh2b2lkKQoreworCWZfcHJpbnQoZm91dCwgIi8qXG4iKTsKKwlmX3ByaW50KGZvdXQsICIgKiBQbGVhc2UgZG8gbm90IGVkaXQgdGhpcyBmaWxlLlxuIik7CisJZl9wcmludChmb3V0LCAiICogSXQgd2FzIGdlbmVyYXRlZCB1c2luZyBycGNnZW4uXG4iKTsKKwlmX3ByaW50KGZvdXQsICIgKi9cblxuIik7Cit9CisKKy8qIGNsZWFyIGxpc3Qgb2YgYXJndW1lbnRzICovCitzdGF0aWMgdm9pZAorY2xlYXJfYXJncyh2b2lkKQoreworICBpbnQgaTsKKyAgZm9yKCBpPUZJWEVEQVJHUzsgaTxBUkdMSVNUTEVOOyBpKysgKQorICAgIGFyZ2xpc3RbaV0gPSBOVUxMOworICBhcmdjb3VudCA9IEZJWEVEQVJHUzsKK30KKworLyoKKyAqIE9wZW4gaW5wdXQgZmlsZSB3aXRoIGdpdmVuIGRlZmluZSBmb3IgQy1wcmVwcm9jZXNzb3IgCisgKi8KK3N0YXRpYyB2b2lkCitvcGVuX2lucHV0KGNoYXIgKmluZmlsZSwgY2hhciAqZGVmaW5lKQoreworCWludCBwZFsyXTsKKworCWluZmlsZW5hbWUgPSAoaW5maWxlID09IE5VTEwpID8gIjxzdGRpbj4iIDogaW5maWxlOworCSh2b2lkKSBwaXBlKHBkKTsKKwlzd2l0Y2ggKGZvcmsoKSkgeworCWNhc2UgMDoKKwkJcHV0YXJnKDAsICJjcHAiKTsKKwkJcHV0YXJnKDEsIENQUEZMQUdTKTsKKwkJYWRkYXJnKGRlZmluZSk7CisJCWFkZGFyZyhpbmZpbGUpOworCQlhZGRhcmcoKGNoYXIgKilOVUxMKTsKKwkJKHZvaWQpIGNsb3NlKDEpOworCQkodm9pZCkgZHVwMihwZFsxXSwgMSk7CisJCSh2b2lkKSBjbG9zZShwZFswXSk7CisJCWlmIChjcHBEZWZpbmVkKQorCQkJZXhlY3YoQ1BQLCBhcmdsaXN0KTsKKwkJZWxzZSB7CisJCQlleGVjdnAoImNwcCIsIGFyZ2xpc3QpOworCQkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCQlleGVjdnAoU1ZSNF9DUFAsIGFyZ2xpc3QpOworCQkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCQlleGVjdnAoU1VOT1NfQ1BQLCBhcmdsaXN0KTsKKwkJfQorCQlwZXJyb3IoImV4ZWN2Iik7CisJCWV4aXQoMSk7CisJY2FzZSAtMToKKwkJcGVycm9yKCJmb3JrIik7CisJCWV4aXQoMSk7CisJfQorCSh2b2lkKSBjbG9zZShwZFsxXSk7CisJZmluID0gZmRvcGVuKHBkWzBdLCAiciIpOworCWlmIChmaW4gPT0gTlVMTCkgeworCQlmX3ByaW50KHN0ZGVyciwgIiVzOiAiLCBjbWRuYW1lKTsKKwkJcGVycm9yKGluZmlsZW5hbWUpOworCQljcmFzaCgpOworCX0KK30KKworLyogdmFsaWQgdGlycGMgbmV0dHlwZXMgKi8KK3N0YXRpYyBjaGFyKgl2YWxpZF90aV9uZXR0eXBlc1tdID0KK3sKKwkibmV0cGF0aCIsCisJInZpc2libGUiLAorCSJjaXJjdWl0X3YiLAorCSJkYXRhZ3JhbV92IiwKKwkiY2lyY3VpdF9uIiwKKwkiZGF0YWdyYW1fbiIsCisJInVkcCIsCisJInRjcCIsCisJInJhdyIsCisJTlVMTAorfTsKKworLyogdmFsaWQgaW5ldGQgbmV0dHlwZXMgKi8KK3N0YXRpYyBjaGFyKiB2YWxpZF9pX25ldHR5cGVzW10gPQoreworCSJ1ZHAiLAorCSJ0Y3AiLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQKK2NoZWNrX25ldHR5cGUoY2hhciAqbmFtZSwgY2hhciAqKmxpc3RfdG9fY2hlY2spCit7CisgIGludCBpOworICBmb3IoIGkgPSAwOyBsaXN0X3RvX2NoZWNrW2ldICE9IE5VTEw7IGkrKyApIHsKKwkgIGlmKCBzdHJjbXAoIG5hbWUsIGxpc3RfdG9fY2hlY2tbaV0gKSA9PSAwICkgeworCSAgICByZXR1cm4gMTsKKwkgIH0KKyAgfQorICBmX3ByaW50KCBzdGRlcnIsICJpbGxlZ2FsIG5ldHR5cGUgOlwnJXNcJ1xuIiwgbmFtZSApOworICByZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBpbGUgaW50byBhbiBYRFIgcm91dGluZSBvdXRwdXQgZmlsZQorICovCisKK3N0YXRpYyB2b2lkCitjX291dHB1dChjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwgY2hhciAqb3V0ZmlsZSkKK3sKKwlkZWZpbml0aW9uICpkZWY7CisJY2hhciAqaW5jbHVkZTsKKwljaGFyICpvdXRmaWxlbmFtZTsKKwlsb25nIHRlbGw7CisKKwljX2luaXRpYWxpemUoKTsKKwlvcGVuX2lucHV0KGluZmlsZSwgZGVmaW5lKTsJCisJb3V0ZmlsZW5hbWUgPSBleHRlbmQgPyBleHRlbmRmaWxlKGluZmlsZSwgb3V0ZmlsZSkgOiBvdXRmaWxlOworCW9wZW5fb3V0cHV0KGluZmlsZSwgb3V0ZmlsZW5hbWUpOworCWFkZF93YXJuaW5nKCk7CisJaWYgKGluZmlsZSAmJiAoaW5jbHVkZSA9IGV4dGVuZGZpbGUoaW5maWxlLCAiLmgiKSkpIHsKKwkJZl9wcmludChmb3V0LCAiI2luY2x1ZGUgXCIlc1wiXG4iLCBpbmNsdWRlKTsKKwkJZnJlZShpbmNsdWRlKTsKKwkJLyogLmggZmlsZSBhbHJlYWR5IGNvbnRhaW5zIHJwYy9ycGMuaCAqLworCX0gZWxzZQorCSAgZl9wcmludChmb3V0LCAiI2luY2x1ZGUgPHJwYy9ycGMuaD5cbiIpOworCXRlbGwgPSBmdGVsbChmb3V0KTsKKwl3aGlsZSAoKGRlZiA9IGdldF9kZWZpbml0aW9uKCkpICE9IE5VTEwpIHsKKwkJZW1pdChkZWYpOworCX0KKwlpZiAoZXh0ZW5kICYmIHRlbGwgPT0gZnRlbGwoZm91dCkpIHsKKwkJKHZvaWQpIHVubGluayhvdXRmaWxlbmFtZSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitjX2luaXRpYWxpemUodm9pZCkKK3sKKworICAvKiBhZGQgYWxsIHRoZSBzdGFydGluZyBiYXNpYyB0eXBlcyAqLworCisgIGFkZF90eXBlKDEsImludCIpOworICBhZGRfdHlwZSgxLCJpbnQzMl90Iik7CisgIGFkZF90eXBlKDEsInNob3J0Iik7CisgIGFkZF90eXBlKDEsImJvb2wiKTsKKworICBhZGRfdHlwZSgxLCJ1X2ludCIpOworICBhZGRfdHlwZSgxLCJ1X2ludDMyX3QiKTsKKyAgYWRkX3R5cGUoMSwidV9zaG9ydCIpOworCit9CisKK2NoYXIgcnBjZ2VuX3RhYmxlX2RjbFtdID0gInN0cnVjdCBycGNnZW5fdGFibGUge1xuXAorCWNoYXIJKigqcHJvYykoKTtcblwKKwl4ZHJwcm9jX3QJeGRyX2FyZztcblwKKwl1bnNpZ25lZAlsZW5fYXJnO1xuXAorCXhkcnByb2NfdAl4ZHJfcmVzO1xuXAorCXVuc2lnbmVkCWxlbl9yZXM7XG5cCit9O1xuIjsKKworCitzdGF0aWMgY2hhciAqCitnZW5lcmF0ZV9ndWFyZChjaGFyICpwYXRobmFtZSkKK3sKKyAgICAgICAgY2hhciogZmlsZW5hbWUsICpndWFyZCwgKnRtcDsKKworCWZpbGVuYW1lID0gc3RycmNocihwYXRobmFtZSwgJy8nICk7ICAvKiBmaW5kIGxhc3QgY29tcG9uZW50ICovCisJZmlsZW5hbWUgPSAoKGZpbGVuYW1lID09IDApID8gcGF0aG5hbWUgOiBmaWxlbmFtZSsxKTsKKwlndWFyZCA9IHN0cmR1cChmaWxlbmFtZSk7CisJLyogY29udmVydCB0byB1cHBlciBjYXNlICovCisJdG1wID0gZ3VhcmQ7CisJd2hpbGUgKCp0bXApIHsKKwkJaWYgKGlzbG93ZXIoKnRtcCkpCisJCQkqdG1wID0gdG91cHBlcigqdG1wKTsKKwkJdG1wKys7CisJfQorCQkKKwlndWFyZCA9IGV4dGVuZGZpbGUoZ3VhcmQsICJfSF9SUENHRU4iKTsKKwlyZXR1cm4oIGd1YXJkICk7Cit9CisKKy8qCisgKiBDb21waWxlIGludG8gYW4gWERSIGhlYWRlciBmaWxlCisgKi8KK3N0YXRpYyB2b2lkCitoX291dHB1dChjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwgY2hhciAqb3V0ZmlsZSkKK3sKKwlkZWZpbml0aW9uICpkZWY7CisJY2hhciAqb3V0ZmlsZW5hbWU7CisJbG9uZyB0ZWxsOworCWNoYXIgKmd1YXJkOworCWxpc3QgKmw7CisKKwlvcGVuX2lucHV0KGluZmlsZSwgZGVmaW5lKTsKKwlvdXRmaWxlbmFtZSA9ICBleHRlbmQgPyBleHRlbmRmaWxlKGluZmlsZSwgb3V0ZmlsZSkgOiBvdXRmaWxlOworCW9wZW5fb3V0cHV0KGluZmlsZSwgb3V0ZmlsZW5hbWUpOworCWFkZF93YXJuaW5nKCk7CisJZ3VhcmQgPSBnZW5lcmF0ZV9ndWFyZCggIG91dGZpbGVuYW1lID8gb3V0ZmlsZW5hbWU6IGluZmlsZSApOworCisJZl9wcmludChmb3V0LCIjaWZuZGVmIF8lc1xuI2RlZmluZSBfJXNcblxuIiwgZ3VhcmQsCisJCWd1YXJkKTsKKworCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxycGMvcnBjLmg+XG5cbiIpOworCisJZl9wcmludChmb3V0LCAiI2lmbmRlZiBJWERSX0dFVF9JTlQzMlxuIik7CisJZl9wcmludChmb3V0LCAiI2RlZmluZSBJWERSX0dFVF9JTlQzMihidWYpIElYRFJfR0VUX0xPTkcoKGJ1ZikpXG4iKTsKKwlmX3ByaW50KGZvdXQsICIjZW5kaWZcbiIpOworCWZfcHJpbnQoZm91dCwgIiNpZm5kZWYgSVhEUl9QVVRfSU5UMzJcbiIpOworCWZfcHJpbnQoZm91dCwgIiNkZWZpbmUgSVhEUl9QVVRfSU5UMzIoYnVmLCB2KSBJWERSX1BVVF9MT05HKChidWYpLCAodikpXG4iKTsKKwlmX3ByaW50KGZvdXQsICIjZW5kaWZcbiIpOworCWZfcHJpbnQoZm91dCwgIiNpZm5kZWYgSVhEUl9HRVRfVV9JTlQzMlxuIik7CisJZl9wcmludChmb3V0LCAiI2RlZmluZSBJWERSX0dFVF9VX0lOVDMyKGJ1ZikgSVhEUl9HRVRfVV9MT05HKChidWYpKVxuIik7CisJZl9wcmludChmb3V0LCAiI2VuZGlmXG4iKTsKKwlmX3ByaW50KGZvdXQsICIjaWZuZGVmIElYRFJfUFVUX1VfSU5UMzJcbiIpOworCWZfcHJpbnQoZm91dCwgIiNkZWZpbmUgSVhEUl9QVVRfVV9JTlQzMihidWYsIHYpIElYRFJfUFVUX1VfTE9ORygoYnVmKSwgKHYpKVxuIik7CisJZl9wcmludChmb3V0LCAiI2VuZGlmXG4iKTsKKworCXRlbGwgPSBmdGVsbChmb3V0KTsKKwkvKiBwcmludCBkYXRhIGRlZmluaXRpb25zICovCisJd2hpbGUgKChkZWYgPSBnZXRfZGVmaW5pdGlvbigpKSAhPSBOVUxMKSB7CisJCXByaW50X2RhdGFkZWYoZGVmKTsKKwl9CisKKwkvKiBwcmludCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuICAKKwkgICBEbyB0aGlzIGFmdGVyIGRhdGEgZGVmaW5pdGlvbnMgYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIHVzZWQgYXMKKwkgICBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyAqLworCWZvciAobCA9IGRlZmluZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJcHJpbnRfZnVuY2RlZihsLT52YWwpOworCX0KKwlpZiAoZXh0ZW5kICYmIHRlbGwgPT0gZnRlbGwoZm91dCkpIHsKKwkJKHZvaWQpIHVubGluayhvdXRmaWxlbmFtZSk7CisJfSBlbHNlIGlmICh0YmxmbGFnKSB7CisJCWZfcHJpbnQoZm91dCwgcnBjZ2VuX3RhYmxlX2RjbCk7CisJfQorCWZfcHJpbnQoZm91dCwgIlxuI2VuZGlmIC8qICFfJXMgKi9cbiIsIGd1YXJkKTsKK30KKworLyoKKyAqIENvbXBpbGUgaW50byBhbiBSUEMgc2VydmljZQorICovCitzdGF0aWMgdm9pZAorc19vdXRwdXQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwKKwkJCWNoYXIgKm91dGZpbGUsIGludCBub21haW4sIGludCBuZXRmbGFnKQoreworCWNoYXIgKmluY2x1ZGU7CisJZGVmaW5pdGlvbiAqZGVmOworCWludCBmb3VuZHByb2dyYW0gPSAwOworCWNoYXIgKm91dGZpbGVuYW1lOworCisJb3Blbl9pbnB1dChpbmZpbGUsIGRlZmluZSk7CisJb3V0ZmlsZW5hbWUgPSBleHRlbmQgPyBleHRlbmRmaWxlKGluZmlsZSwgb3V0ZmlsZSkgOiBvdXRmaWxlOworCW9wZW5fb3V0cHV0KGluZmlsZSwgb3V0ZmlsZW5hbWUpOworCWFkZF93YXJuaW5nKCk7CisJaWYgKGluZmlsZSAmJiAoaW5jbHVkZSA9IGV4dGVuZGZpbGUoaW5maWxlLCAiLmgiKSkpIHsKKwkJZl9wcmludChmb3V0LCAiI2luY2x1ZGUgXCIlc1wiXG4iLCBpbmNsdWRlKTsKKwkJZnJlZShpbmNsdWRlKTsKKwl9IGVsc2UKKwkgIGZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxycGMvcnBjLmg+XG4iKTsKKworCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxzdGRpby5oPlxuIik7CisJZl9wcmludChmb3V0LCAiI2luY2x1ZGUgPHN0ZGxpYi5oPi8qIGdldGVudiwgZXhpdCAqL1xuIik7IAorCWlmIChDZmxhZykgeworCQlmX3ByaW50IChmb3V0LCAiI2luY2x1ZGUgPHJwYy9wbWFwX2NsbnQuaD4gLyogZm9yIHBtYXBfdW5zZXQgKi9cbiIpOworCQlmX3ByaW50IChmb3V0LCAiI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBzdHJjbXAgKi8gXG4iKTsgCisJfQorCWlmIChzdHJjbXAoc3ZjY2xvc2V0aW1lLCAiLTEiKSA9PSAwKQorCQlpbmRlZmluaXRld2FpdCA9IDE7CisJZWxzZSBpZiAoc3RyY21wKHN2Y2Nsb3NldGltZSwgIjAiKSA9PSAwKQorCQlleGl0bm93ID0gMTsKKwllbHNlIGlmIChpbmV0ZGZsYWcgfHwgcG1mbGFnKSB7CisJCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxzaWduYWwuaD5cbiIpOworCSAgdGltZXJmbGFnID0gMTsKKwl9CisKKyNpZm5kZWYgbGludXgKKwlpZiggIXRpcnBjZmxhZyAmJiBpbmV0ZGZsYWcgKQorCSAgZl9wcmludChmb3V0LCAiI2luY2x1ZGUgPHN5cy90dHljb20uaD4vKiBUSU9DTk9UVFkgKi9cbiIpOworI2Vsc2UKKwlpZiggIXRpcnBjZmxhZyApCisJICBmX3ByaW50KGZvdXQsICIjaW5jbHVkZSA8c3lzL2lvY3RsLmg+LyogVElPQ05PVFRZICovXG4iKTsKKyNlbmRpZgorCWlmKCBDZmxhZyAmJiAoaW5ldGRmbGFnIHx8IHBtZmxhZyApICkgeworCSAgZl9wcmludChmb3V0LCAiI2lmZGVmIF9fY3BsdXNwbHVzXG4iKTsKKwkgIGZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxzeXNlbnQuaD4gLyogZ2V0ZHRhYmxlc2l6ZSwgb3BlbiAqL1xuIik7IAorCSAgZl9wcmludChmb3V0LCAiI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovXG4iKTsKKwkgIAorCSAgaWYoIHRpcnBjZmxhZyApCisJICAgIGZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDx1bmlzdGQuaD4gLyogc2V0c2lkICovXG4iKTsKKwl9CisJaWYoIHRpcnBjZmxhZyApCisJICBmX3ByaW50KGZvdXQsICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XG4iKTsKKworCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxtZW1vcnkuaD5cbiIpOworI2lmbmRlZiBsaW51eAorCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxzdHJvcHRzLmg+XG4iKTsKKyNlbmRpZgorCWlmIChpbmV0ZGZsYWcgfHwgIXRpcnBjZmxhZyApIHsKKwkJZl9wcmludChmb3V0LCAiI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5cbiIpOworCQlmX3ByaW50KGZvdXQsICIjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPlxuIik7CisJfSAKKworCWlmICggKG5ldGZsYWcgfHwgcG1mbGFnKSAmJiB0aXJwY2ZsYWcgKSB7CisJCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxuZXRjb25maWcuaD5cbiIpOworCX0KKwlpZiAoLyp0aW1lcmZsYWcgJiYqLyB0aXJwY2ZsYWcpCisJCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gLyogcmxpbWl0ICovXG4iKTsKKwlpZiAobG9nZmxhZyB8fCBpbmV0ZGZsYWcgfHwgcG1mbGFnKSB7CisjaWZkZWYgbGludXgKKwkJZl9wcmludChmb3V0LCAiI2luY2x1ZGUgPHN5c2xvZy5oPlxuIik7CisjZWxzZQorCQlmX3ByaW50KGZvdXQsICIjaWZkZWYgU1lTTE9HXG4iKTsKKwkJZl9wcmludChmb3V0LCAiI2luY2x1ZGUgPHN5c2xvZy5oPlxuIik7CisJCWZfcHJpbnQoZm91dCwgIiNlbHNlXG4iKTsKKwkJZl9wcmludChmb3V0LCAiI2RlZmluZSBMT0dfRVJSIDFcbiIpOworCQlmX3ByaW50KGZvdXQsICIjZGVmaW5lIG9wZW5sb2coYSwgYiwgYylcbiIpOworCQlmX3ByaW50KGZvdXQsICIjZW5kaWZcbiIpOworI2VuZGlmCisJfQorCisJLyogZm9yIEFOU0ktQyAqLworCWZfcHJpbnQoZm91dCwgIlxuI2lmZGVmIF9fU1REQ19fXG4jZGVmaW5lIFNJR19QRiB2b2lkKCopKGludClcbiNlbmRpZlxuIik7CisKKwlmX3ByaW50KGZvdXQsICJcbiNpZmRlZiBERUJVR1xuI2RlZmluZSBSUENfU1ZDX0ZHXG4jZW5kaWZcbiIpOworCWlmICh0aW1lcmZsYWcpCisJCWZfcHJpbnQoZm91dCwgIlxuI2RlZmluZSBfUlBDU1ZDX0NMT1NFRE9XTiAlc1xuIiwgc3ZjY2xvc2V0aW1lKTsKKwl3aGlsZSAoKGRlZiA9IGdldF9kZWZpbml0aW9uKCkpICE9IE5VTEwpIHsKKwkJZm91bmRwcm9ncmFtIHw9IChkZWYtPmRlZl9raW5kID09IERFRl9QUk9HUkFNKTsKKwl9CisJaWYgKGV4dGVuZCAmJiAhZm91bmRwcm9ncmFtKSB7CisJCSh2b2lkKSB1bmxpbmsob3V0ZmlsZW5hbWUpOworCQlyZXR1cm47CisJfQorCXdyaXRlX21vc3QoaW5maWxlLCBuZXRmbGFnLCBub21haW4pOworCWlmICghbm9tYWluKSB7CisJCWlmKCAhZG9fcmVnaXN0ZXJzKGFyZ2MsIGFyZ3YpICkgeworCQkgIGlmIChvdXRmaWxlbmFtZSkKKwkJICAgICh2b2lkKSB1bmxpbmsob3V0ZmlsZW5hbWUpOworCQkgIHVzYWdlKCk7CisJCX0KKwkJd3JpdGVfcmVzdCgpOworCX0KK30KKworLyoKKyAqIGdlbmVyYXRlIGNsaWVudCBzaWRlIHN0dWJzCisgKi8KK3N0YXRpYyB2b2lkCitsX291dHB1dChjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwgY2hhciAqb3V0ZmlsZSkKK3sKKwljaGFyICppbmNsdWRlOworCWRlZmluaXRpb24gKmRlZjsKKwlpbnQgZm91bmRwcm9ncmFtID0gMDsKKwljaGFyICpvdXRmaWxlbmFtZTsKKworCW9wZW5faW5wdXQoaW5maWxlLCBkZWZpbmUpOworCW91dGZpbGVuYW1lID0gZXh0ZW5kID8gZXh0ZW5kZmlsZShpbmZpbGUsIG91dGZpbGUpIDogb3V0ZmlsZTsKKwlvcGVuX291dHB1dChpbmZpbGUsIG91dGZpbGVuYW1lKTsKKwlhZGRfd2FybmluZygpOworCWlmIChDZmxhZykKKwkgIGZfcHJpbnQgKGZvdXQsICIjaW5jbHVkZSA8bWVtb3J5Lmg+IC8qIGZvciBtZW1zZXQgKi9cbiIpOworCWlmIChpbmZpbGUgJiYgKGluY2x1ZGUgPSBleHRlbmRmaWxlKGluZmlsZSwgIi5oIikpKSB7CisJCWZfcHJpbnQoZm91dCwgIiNpbmNsdWRlIFwiJXNcIlxuIiwgaW5jbHVkZSk7CisJCWZyZWUoaW5jbHVkZSk7CisJfSBlbHNlCisJICBmX3ByaW50KGZvdXQsICIjaW5jbHVkZSA8cnBjL3JwYy5oPlxuIik7CisJd2hpbGUgKChkZWYgPSBnZXRfZGVmaW5pdGlvbigpKSAhPSBOVUxMKSB7CisJCWZvdW5kcHJvZ3JhbSB8PSAoZGVmLT5kZWZfa2luZCA9PSBERUZfUFJPR1JBTSk7CisJfQorCWlmIChleHRlbmQgJiYgIWZvdW5kcHJvZ3JhbSkgeworCQkodm9pZCkgdW5saW5rKG91dGZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKwl3cml0ZV9zdHVicygpOworfQorCisvKgorICogZ2VuZXJhdGUgdGhlIGRpc3BhdGNoIHRhYmxlCisgKi8KK3N0YXRpYyB2b2lkCit0X291dHB1dChjaGFyICppbmZpbGUsIGNoYXIgKmRlZmluZSwgaW50IGV4dGVuZCwgY2hhciAqb3V0ZmlsZSkKK3sKKwlkZWZpbml0aW9uICpkZWY7CisJaW50IGZvdW5kcHJvZ3JhbSA9IDA7CisJY2hhciAqb3V0ZmlsZW5hbWU7CisKKwlvcGVuX2lucHV0KGluZmlsZSwgZGVmaW5lKTsKKwlvdXRmaWxlbmFtZSA9IGV4dGVuZCA/IGV4dGVuZGZpbGUoaW5maWxlLCBvdXRmaWxlKSA6IG91dGZpbGU7CisJb3Blbl9vdXRwdXQoaW5maWxlLCBvdXRmaWxlbmFtZSk7CisJYWRkX3dhcm5pbmcoKTsKKwl3aGlsZSAoKGRlZiA9IGdldF9kZWZpbml0aW9uKCkpICE9IE5VTEwpIHsKKwkJZm91bmRwcm9ncmFtIHw9IChkZWYtPmRlZl9raW5kID09IERFRl9QUk9HUkFNKTsKKwl9CisJaWYgKGV4dGVuZCAmJiAhZm91bmRwcm9ncmFtKSB7CisJCSh2b2lkKSB1bmxpbmsob3V0ZmlsZW5hbWUpOworCQlyZXR1cm47CisJfQorCXdyaXRlX3RhYmxlcygpOworfQorCisvKiBzYW1wbGUgcm91dGluZSBmb3IgdGhlIHNlcnZlciB0ZW1wbGF0ZSAqLworc3RhdGljICB2b2lkCitzdmNfb3V0cHV0KGNoYXIgKmluZmlsZSwgY2hhciAqZGVmaW5lLCBpbnQgZXh0ZW5kLCBjaGFyICpvdXRmaWxlKQoreworICBkZWZpbml0aW9uICpkZWY7CisgIGNoYXIgKmluY2x1ZGU7CisgIGNoYXIgKm91dGZpbGVuYW1lOworICBsb25nIHRlbGw7CisgIAorICBvcGVuX2lucHV0KGluZmlsZSwgZGVmaW5lKTsJCisgIG91dGZpbGVuYW1lID0gZXh0ZW5kID8gZXh0ZW5kZmlsZShpbmZpbGUsIG91dGZpbGUpIDogb3V0ZmlsZTsKKyAgY2hlY2tmaWxlcyhpbmZpbGUsb3V0ZmlsZW5hbWUpOyAvKmNoZWNrIGlmIG91dGZpbGUgYWxyZWFkeSBleGlzdHMuCisJCQkJICBpZiBzbywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdCovCisgIG9wZW5fb3V0cHV0KGluZmlsZSwgb3V0ZmlsZW5hbWUpOworICBhZGRfc2FtcGxlX21zZygpOworCisgIGlmIChpbmZpbGUgJiYgKGluY2x1ZGUgPSBleHRlbmRmaWxlKGluZmlsZSwgIi5oIikpKSB7CisgICAgZl9wcmludChmb3V0LCAiI2luY2x1ZGUgXCIlc1wiXG4iLCBpbmNsdWRlKTsKKyAgICBmcmVlKGluY2x1ZGUpOworICB9IGVsc2UKKyAgICBmX3ByaW50KGZvdXQsICIjaW5jbHVkZSA8cnBjL3JwYy5oPlxuIik7CisKKyAgdGVsbCA9IGZ0ZWxsKGZvdXQpOworICB3aGlsZSAoKGRlZiA9IGdldF9kZWZpbml0aW9uKCkpICE9IE5VTEwpIHsKKwkgIHdyaXRlX3NhbXBsZV9zdmMoZGVmKTsKKyAgfQorICBpZiAoZXh0ZW5kICYmIHRlbGwgPT0gZnRlbGwoZm91dCkpIHsKKwkgICh2b2lkKSB1bmxpbmsob3V0ZmlsZW5hbWUpOworICB9Cit9CisKKworLyogc2FtcGxlIG1haW4gcm91dGluZSBmb3IgY2xpZW50ICovCitzdGF0aWMgIHZvaWQKK2NsbnRfb3V0cHV0KGNoYXIgKmluZmlsZSwgY2hhciAqZGVmaW5lLCBpbnQgZXh0ZW5kLCBjaGFyICpvdXRmaWxlKQoreworCWRlZmluaXRpb24gICAgICpkZWY7CisJY2hhciAgICAgICAgICAgKmluY2x1ZGU7CisJY2hhciAgICAgICAgICAgKm91dGZpbGVuYW1lOworCWxvbmcgICAgICAgICAgICB0ZWxsOworCWludCAgICAgICAgICAgICBoYXNfcHJvZ3JhbSA9IDA7CisKKwlvcGVuX2lucHV0KGluZmlsZSwgZGVmaW5lKTsKKwlvdXRmaWxlbmFtZSA9IGV4dGVuZCA/IGV4dGVuZGZpbGUoaW5maWxlLCBvdXRmaWxlKSA6IG91dGZpbGU7CisJY2hlY2tmaWxlcyhpbmZpbGUsIG91dGZpbGVuYW1lKTsJLypjaGVjayBpZiBvdXRmaWxlIGFscmVhZHkgZXhpc3RzLgorCQkJCSAgaWYgc28sIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQqLworCisJb3Blbl9vdXRwdXQoaW5maWxlLCBvdXRmaWxlbmFtZSk7CisJYWRkX3NhbXBsZV9tc2coKTsKKwlpZiAoaW5maWxlICYmIChpbmNsdWRlID0gZXh0ZW5kZmlsZShpbmZpbGUsICIuaCIpKSkgeworCQlmX3ByaW50KGZvdXQsICIjaW5jbHVkZSBcIiVzXCJcbiIsIGluY2x1ZGUpOworCQlmcmVlKGluY2x1ZGUpOworCX0gZWxzZQorCQlmX3ByaW50KGZvdXQsICIjaW5jbHVkZSA8cnBjL3JwYy5oPlxuIik7CisJdGVsbCA9IGZ0ZWxsKGZvdXQpOworCXdoaWxlICgoZGVmID0gZ2V0X2RlZmluaXRpb24oKSkgIT0gTlVMTCkgeworCQloYXNfcHJvZ3JhbSArPSB3cml0ZV9zYW1wbGVfY2xudChkZWYpOworCX0KKworCWlmIChoYXNfcHJvZ3JhbSkKKwkJd3JpdGVfc2FtcGxlX2NsbnRfbWFpbigpOworCisJaWYgKGV4dGVuZCAmJiB0ZWxsID09IGZ0ZWxsKGZvdXQpKSB7CisJCSh2b2lkKSB1bmxpbmsob3V0ZmlsZW5hbWUpOworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gcmVnaXN0cmF0aW9ucyBmb3Igc2VydmljZSBvdXRwdXQgCisgKiBSZXR1cm4gMCBpZiBmYWlsZWQ7IDEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50Citkb19yZWdpc3RlcnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCAgICAgICAgICAgICBpOworCisJaWYgKGluZXRkZmxhZyB8fCAhdGlycGNmbGFnKSB7CisJCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJCWlmIChzdHJlcShhcmd2W2ldLCAiLXMiKSkgeworCQkJCWlmICghY2hlY2tfbmV0dHlwZShhcmd2W2kgKyAxXSwgdmFsaWRfaV9uZXR0eXBlcykpCisJCQkJCXJldHVybiAwOworCQkJCXdyaXRlX2luZXRkX3JlZ2lzdGVyKGFyZ3ZbaSArIDFdKTsKKwkJCQlpKys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCQkJaWYgKHN0cmVxKGFyZ3ZbaV0sICItcyIpKSB7CisJCQkJaWYgKCFjaGVja19uZXR0eXBlKGFyZ3ZbaSArIDFdLCB2YWxpZF90aV9uZXR0eXBlcykpCisJCQkJCXJldHVybiAwOworCQkJCXdyaXRlX25ldHR5cGVfcmVnaXN0ZXIoYXJndltpICsgMV0pOworCQkJCWkrKzsKKwkJCX0gZWxzZSBpZiAoc3RyZXEoYXJndltpXSwgIi1uIikpIHsKKwkJCQl3cml0ZV9uZXRpZF9yZWdpc3Rlcihhcmd2W2kgKyAxXSk7CisJCQkJaSsrOworCQkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEFkZCBhbm90aGVyIGFyZ3VtZW50IHRvIHRoZSBhcmcgbGlzdAorICovCitzdGF0aWMgdm9pZAorYWRkYXJnKGNoYXIgKmNwKQoreworCWlmIChhcmdjb3VudCA+PSBBUkdMSVNUTEVOKSB7CisJCWZfcHJpbnQoc3RkZXJyLCAicnBjZ2VuOiB0b28gbWFueSBkZWZpbmVzXG4iKTsKKwkJY3Jhc2goKTsKKwkJLypOT1RSRUFDSEVEKi8KKwl9CisJYXJnbGlzdFthcmdjb3VudCsrXSA9IGNwOworCit9CisKK3N0YXRpYyB2b2lkCitwdXRhcmcoaW50IHdoZXJlLCBjaGFyICpjcCkKK3sKKwlpZiAod2hlcmUgPj0gQVJHTElTVExFTikgeworCQlmX3ByaW50KHN0ZGVyciwgInJwY2dlbjogYXJnbGlzdCBjb2RpbmcgZXJyb3JcbiIpOworCQljcmFzaCgpOworCQkvKk5PVFJFQUNIRUQqLworCX0KKwlhcmdsaXN0W3doZXJlXSA9IGNwOworCQorfQorCisvKgorICogaWYgaW5wdXQgZmlsZSBpcyBzdGRpbiBhbmQgYW4gb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gY29tcGxhaW4KKyAqIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLiBPdGhlcndpc2UgdGhlIGZpbGUgbWF5IGdldCBvdmVyd3JpdHRlbgorICogSWYgaW5wdXQgZmlsZSBkb2VzIG5vdCBleGlzdCwgZXhpdCB3aXRoIGFuIGVycm9yIAorICovCisKK3N0YXRpYyB2b2lkCitjaGVja2ZpbGVzKGNoYXIgKmluZmlsZSwgY2hhciAqb3V0ZmlsZSkgCit7CisKKyAgc3RydWN0IHN0YXQgYnVmOworCisgIGlmKGluZmlsZSkJCQkvKiBpbmZpbGUgISA9IE5VTEwgKi8KKyAgICBpZihzdGF0KGluZmlsZSwmYnVmKSA8IDApCisgICAgICB7CisJcGVycm9yKGluZmlsZSk7CisJY3Jhc2goKTsKKyAgICAgIH07CisgIGlmIChvdXRmaWxlKSB7CisgICAgaWYgKHN0YXQob3V0ZmlsZSwgJmJ1ZikgPCAwKSAKKyAgICAgIHJldHVybjsJCQkvKiBmaWxlIGRvZXMgbm90IGV4aXN0ICovCisgICAgZWxzZSB7CisgICAgICBmX3ByaW50KHN0ZGVyciwgCisJICAgICAgImZpbGUgJyVzJyBhbHJlYWR5IGV4aXN0cyBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuXG4iLCBvdXRmaWxlKTsKKyAgICAgIGNyYXNoKCk7CisgICAgfQorICB9Cit9CisKKy8qCisgKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIAorICovCitzdGF0aWMgaW50CitwYXJzZWFyZ3MoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3QgY29tbWFuZGxpbmUgKmNtZCkKK3sKKwlpbnQgaTsKKwlpbnQgajsKKwljaGFyIGM7CisJY2hhciBmbGFnWygxIDw8IDggKiBzaXplb2YoY2hhcikpXTsKKwlpbnQgbmZsYWdzOworCisJY21kbmFtZSA9IGFyZ3ZbMF07CisJY21kLT5pbmZpbGUgPSBjbWQtPm91dGZpbGUgPSBOVUxMOworCWlmIChhcmdjIDwgMikgeworCQlyZXR1cm4gKDApOworCX0KKwlhbGxmaWxlcyA9IDA7CisJZmxhZ1snYyddID0gMDsKKwlmbGFnWydoJ10gPSAwOworCWZsYWdbJ2wnXSA9IDA7CisJZmxhZ1snbSddID0gMDsKKwlmbGFnWydvJ10gPSAwOworCWZsYWdbJ3MnXSA9IDA7CisJZmxhZ1snbiddID0gMDsKKwlmbGFnWyd0J10gPSAwOworCWZsYWdbJ1MnXSA9IDA7CisJZmxhZ1snQyddID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmIChhcmd2W2ldWzBdICE9ICctJykgeworCQkJaWYgKGNtZC0+aW5maWxlKSB7CisJCQkgICAgICAgIGZfcHJpbnQoIHN0ZGVyciwgIkNhbm5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgaW5wdXQgZmlsZSFcbiIpOworCisJCQkJcmV0dXJuICgwKTsKKwkJCX0KKwkJCWNtZC0+aW5maWxlID0gYXJndltpXTsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaiA9IDE7IGFyZ3ZbaV1bal0gIT0gMDsgaisrKSB7CisJCQkJYyA9IGFyZ3ZbaV1bal07CisJCQkJc3dpdGNoIChjKSB7CisJCQkJY2FzZSAnYSc6CisJCQkJCWFsbGZpbGVzID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnYyc6CisJCQkJY2FzZSAnaCc6CisJCQkJY2FzZSAnbCc6CisJCQkJY2FzZSAnbSc6CisJCQkJY2FzZSAndCc6CisJCQkJCWlmIChmbGFnWyhpbnQpIGNdKSB7CisJCQkJCQlyZXR1cm4gKDApOworCQkJCQl9CisJCQkJCWZsYWdbKGludCkgY10gPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdTJzogIAorCQkJCQkvKiBzYW1wbGUgZmxhZzogU3Mgb3IgU2MuCisJCQkJCSAgIFNzIG1lYW5zIHNldCBmbGFnWydTJ107CisJCQkJCSAgIFNjIG1lYW5zIHNldCBmbGFnWydDJ107ICovCisJCQkJCWMgPSBhcmd2W2ldWysral07ICAvKiBnZXQgbmV4dCBjaGFyICovCisJCQkJCWlmKCBjID09ICdzJyApCisJCQkJCSAgYyA9ICdTJzsKKwkJCQkJZWxzZSBpZiggYyA9PSAnYycgKQorCQkJCQkgIGMgPSAnQyc7CisJCQkJCWVsc2UKKwkJCQkJICByZXR1cm4oIDAgKTsKKworCQkJCQlpZiAoZmxhZ1soaW50KSBjXSkgeworCQkJCQkJcmV0dXJuICgwKTsKKwkJCQkJfQorCQkJCQlmbGFnWyhpbnQpIGNdID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnQyc6ICAvKiBBTlNJIEMgc3ludGF4ICovCisJCQkJCUNmbGFnID0gMTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlICdiJzogIC8qIHR1cm4gVElSUEMgZmxhZyBvZmYgZm9yCisJCQkJCSAgICBnZW5lcmF0aW5nIGJhY2t3YXJkIGNvbXBhdGlibGUKKwkJCQkJICAgICovCisJCQkJCXRpcnBjZmxhZyA9IDA7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAnSSc6CisJCQkJCWluZXRkZmxhZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ04nOgorCQkJCQluZXdzdHlsZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0wnOgorCQkJCQlsb2dmbGFnID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnSyc6CisJCQkJCWlmICgrK2kgPT0gYXJnYykgeworCQkJCQkJcmV0dXJuICgwKTsKKwkJCQkJfQorCQkJCQlzdmNjbG9zZXRpbWUgPSBhcmd2W2ldOworCQkJCQlnb3RvIG5leHRhcmc7CisJCQkJY2FzZSAnVCc6CisJCQkJCXRibGZsYWcgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlICdpJyA6CisJCQkJICAJaWYgKCsraSA9PSBhcmdjKSB7CisJCQkJCQlyZXR1cm4gKDApOworCQkJCQl9CisJCQkJCUlubGluZSA9IGF0b2koYXJndltpXSk7CisJCQkJCWdvdG8gbmV4dGFyZzsKKwkJCQljYXNlICduJzoKKwkJCQljYXNlICdvJzoKKwkJCQljYXNlICdzJzoKKwkJCQkJaWYgKGFyZ3ZbaV1baiAtIDFdICE9ICctJyB8fCAKKwkJCQkJICAgIGFyZ3ZbaV1baiArIDFdICE9IDApIHsKKwkJCQkJCXJldHVybiAoMCk7CisJCQkJCX0KKwkJCQkJZmxhZ1soaW50KSBjXSA9IDE7CisJCQkJCWlmICgrK2kgPT0gYXJnYykgeworCQkJCQkJcmV0dXJuICgwKTsKKwkJCQkJfQorCQkJCQlpZiAoYyA9PSAncycpIHsKKwkJCQkJCWlmICghc3RyZXEoYXJndltpXSwgInVkcCIpICYmCisJCQkJCQkgICAgIXN0cmVxKGFyZ3ZbaV0sICJ0Y3AiKSkgeworCQkJCQkJCXJldHVybiAoMCk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoYyA9PSAnbycpIHsKKwkJCQkJCWlmIChjbWQtPm91dGZpbGUpIHsKKwkJCQkJCQlyZXR1cm4gKDApOworCQkJCQkJfQorCQkJCQkJY21kLT5vdXRmaWxlID0gYXJndltpXTsKKwkJCQkJfQorCQkJCQlnb3RvIG5leHRhcmc7CisJCQkJY2FzZSAnRCc6CisJCQkJCWlmIChhcmd2W2ldW2ogLSAxXSAhPSAnLScpIHsKKwkJCQkJCXJldHVybiAoMCk7CisJCQkJCX0KKwkJCQkJKHZvaWQpIGFkZGFyZyhhcmd2W2ldKTsKKwkJCQkJZ290byBuZXh0YXJnOworCQkJCWNhc2UgJ1knOgorCQkJCQlpZiAoKytpID09IGFyZ2MpIHsKKwkJCQkJCXJldHVybiAoMCk7CisJCQkJCX0KKwkJCQkJKHZvaWQpIHN0cmNweShwYXRoYnVmLCBhcmd2W2ldKTsKKwkJCQkJKHZvaWQpIHN0cmNhdChwYXRoYnVmLCAiL2NwcCIpOworCQkJCQlDUFAgPSBwYXRoYnVmOworCQkJCQljcHBEZWZpbmVkID0gMTsKKwkJCQkJZ290byBuZXh0YXJnOworCisKKworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJfQorCW5leHRhcmc6CisJCQk7CisJCX0KKwl9CisKKwljbWQtPmNmbGFnID0gZmxhZ1snYyddOworCWNtZC0+aGZsYWcgPSBmbGFnWydoJ107CisJY21kLT5sZmxhZyA9IGZsYWdbJ2wnXTsKKwljbWQtPm1mbGFnID0gZmxhZ1snbSddOworCWNtZC0+bmZsYWcgPSBmbGFnWyduJ107CisJY21kLT5zZmxhZyA9IGZsYWdbJ3MnXTsKKwljbWQtPnRmbGFnID0gZmxhZ1sndCddOworCWNtZC0+U3NmbGFnID0gZmxhZ1snUyddOworCWNtZC0+U2NmbGFnID0gZmxhZ1snQyddOworCisJaWYoIHRpcnBjZmxhZyApIHsKKwkgIHBtZmxhZyA9IGluZXRkZmxhZyA/IDAgOiAxOwkgIC8qIHBtZmxhZyBvciBpbmV0ZGZsYWcgaXMgYWx3YXlzIFRSVUUgKi8KKwkgIGlmKCAoaW5ldGRmbGFnICYmIGNtZC0+bmZsYWcpKSB7IC8qIG5ldGlkIG5vdCBhbGxvd2VkIHdpdGggaW5ldGRmbGFnICovCisJICAgIGZfcHJpbnQoc3RkZXJyLCAiQ2Fubm90IHVzZSBuZXRpZCBmbGFnIHdpdGggaW5ldGQgZmxhZyFcbiIpOworCSAgICByZXR1cm4gKDApOworCSAgfQorCX0gZWxzZSB7ICAvKiA0LjEgbW9kZSAqLworCSAgcG1mbGFnID0gMDsgICAgICAgICAgICAgICAvKiBzZXQgcG1mbGFnIG9ubHkgaW4gdGlycGNtb2RlICovCisJICBpbmV0ZGZsYWcgPSAxOyAgICAgICAgICAgIC8qIGluZXRkZmxhZyBpcyBUUlVFIGJ5IGRlZmF1bHQgKi8KKwkgIGlmKCBjbWQtPm5mbGFnICkgeyAgICAgICAgICAvKiBuZXRpZCBuZWVkcyBUSVJQQyAqLworCSAgICBmX3ByaW50KCBzdGRlcnIsICJDYW5ub3QgdXNlIG5ldGlkIGZsYWcgd2l0aG91dCBUSVJQQyFcbiIpOworCSAgICByZXR1cm4oIDAgKTsKKwkgIH0KKwl9CisKKwlpZiggbmV3c3R5bGUgJiYgKCB0YmxmbGFnIHx8IGNtZC0+dGZsYWcpICkgeworCSAgZl9wcmludCggc3RkZXJyLCAiQ2Fubm90IHVzZSB0YWJsZSBmbGFncyB3aXRoIG5ld3N0eWxlIVxuIik7CisJICByZXR1cm4oIDAgKTsKKwl9CisKKwkvKiBjaGVjayBubyBjb25mbGljdHMgd2l0aCBmaWxlIGdlbmVyYXRpb24gZmxhZ3MgKi8KKwluZmxhZ3MgPSBjbWQtPmNmbGFnICsgY21kLT5oZmxhZyArIGNtZC0+bGZsYWcgKyBjbWQtPm1mbGFnICsKKwkJY21kLT5zZmxhZyArIGNtZC0+bmZsYWcgKyBjbWQtPnRmbGFnICsgY21kLT5Tc2ZsYWcgKyBjbWQtPlNjZmxhZzsKKworCWlmIChuZmxhZ3MgPT0gMCkgeworCQlpZiAoY21kLT5vdXRmaWxlICE9IE5VTEwgfHwgY21kLT5pbmZpbGUgPT0gTlVMTCkgeworCQkJcmV0dXJuICgwKTsKKwkJfQorCX0gZWxzZSBpZiAobmZsYWdzID4gMSkgeworCSAgICAgICAgZl9wcmludCggc3RkZXJyLCAiQ2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBmaWxlIGdlbmVyYXRpb24gZmxhZyFcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwlmX3ByaW50KHN0ZGVyciwgInVzYWdlOiAgJXMgaW5maWxlXG4iLCBjbWRuYW1lKTsKKwlmX3ByaW50KHN0ZGVyciwgIlx0JXMgWy1hXVstYl1bLUNdWy1EbmFtZVs9dmFsdWVdXSAtaSBzaXplICBbLUkgWy1LIHNlY29uZHNdXSBbLUxdWy1OXVstVF0gaW5maWxlXG4iLAorCQkJY21kbmFtZSk7CisJZl9wcmludChzdGRlcnIsICJcdCVzIFstYyB8IC1oIHwgLWwgfCAtbSB8IC10IHwgLVNjIHwgLVNzXSBbLW8gb3V0ZmlsZV0gW2luZmlsZV1cbiIsCisJCQljbWRuYW1lKTsKKwlmX3ByaW50KHN0ZGVyciwgIlx0JXMgWy1zIG5ldHR5cGVdKiBbLW8gb3V0ZmlsZV0gW2luZmlsZV1cbiIsIGNtZG5hbWUpOworCWZfcHJpbnQoc3RkZXJyLCAiXHQlcyBbLW4gbmV0aWRdKiBbLW8gb3V0ZmlsZV0gW2luZmlsZV1cbiIsIGNtZG5hbWUpOworCW9wdGlvbnNfdXNhZ2UoKTsKKwlleGl0KDEpOworfQorCitzdGF0aWMgdm9pZAorb3B0aW9uc191c2FnZSh2b2lkKQoreworCWZfcHJpbnQoc3RkZXJyLCAib3B0aW9uczpcbiIpOworCWZfcHJpbnQoc3RkZXJyLCAiLWFcdFx0Z2VuZXJhdGUgYWxsIGZpbGVzLCBpbmNsdWRpbmcgc2FtcGxlc1xuIik7CisJZl9wcmludChzdGRlcnIsICItYlx0XHRiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUgKGdlbmVyYXRlcyBjb2RlIGZvciBTdW5PUyA0LjEpXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1jXHRcdGdlbmVyYXRlIFhEUiByb3V0aW5lc1xuIik7CisJZl9wcmludChzdGRlcnIsICItQ1x0XHRBTlNJIEMgbW9kZVxuIik7CisJZl9wcmludChzdGRlcnIsICItRG5hbWVbPXZhbHVlXVx0ZGVmaW5lIGEgc3ltYm9sIChzYW1lIGFzICNkZWZpbmUpXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1oXHRcdGdlbmVyYXRlIGhlYWRlciBmaWxlXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1pIHNpemVcdFx0c2l6ZSBhdCB3aGljaCB0byBzdGFydCBnZW5lcmF0aW5nIGlubGluZSBjb2RlXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1JXHRcdGdlbmVyYXRlIGNvZGUgZm9yIGluZXRkIHN1cHBvcnQgaW4gc2VydmVyIChmb3IgU3VuT1MgNC4xKVxuIik7CisJZl9wcmludChzdGRlcnIsICItSyBzZWNvbmRzXHRzZXJ2ZXIgZXhpdHMgYWZ0ZXIgSyBzZWNvbmRzIG9mIGluYWN0aXZpdHlcbiIpOworCWZfcHJpbnQoc3RkZXJyLCAiLWxcdFx0Z2VuZXJhdGUgY2xpZW50IHNpZGUgc3R1YnNcbiIpOworCWZfcHJpbnQoc3RkZXJyLCAiLUxcdFx0c2VydmVyIGVycm9ycyB3aWxsIGJlIHByaW50ZWQgdG8gc3lzbG9nXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1tXHRcdGdlbmVyYXRlIHNlcnZlciBzaWRlIHN0dWJzXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1uIG5ldGlkXHRnZW5lcmF0ZSBzZXJ2ZXIgY29kZSB0aGF0IHN1cHBvcnRzIG5hbWVkIG5ldGlkXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1OXHRcdHN1cHBvcnRzIG11bHRpcGxlIGFyZ3VtZW50cyBhbmQgY2FsbC1ieS12YWx1ZVxuIik7CisJZl9wcmludChzdGRlcnIsICItbyBvdXRmaWxlXHRuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZVxuIik7CisJZl9wcmludChzdGRlcnIsICItcyBuZXR0eXBlXHRnZW5lcmF0ZSBzZXJ2ZXIgY29kZSB0aGF0IHN1cHBvcnRzIG5hbWVkIG5ldHR5cGVcbiIpOworCWZfcHJpbnQoc3RkZXJyLCAiLVNjXHRcdGdlbmVyYXRlIHNhbXBsZSBjbGllbnQgY29kZSB0aGF0IHVzZXMgcmVtb3RlIHByb2NlZHVyZXNcbiIpOworCWZfcHJpbnQoc3RkZXJyLCAiLVNzXHRcdGdlbmVyYXRlIHNhbXBsZSBzZXJ2ZXIgY29kZSB0aGF0IGRlZmluZXMgcmVtb3RlIHByb2NlZHVyZXNcbiIpOworCWZfcHJpbnQoc3RkZXJyLCAiLXRcdFx0Z2VuZXJhdGUgUlBDIGRpc3BhdGNoIHRhYmxlXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1UXHRcdGdlbmVyYXRlIGNvZGUgdG8gc3VwcG9ydCBSUEMgZGlzcGF0Y2ggdGFibGVzXG4iKTsKKwlmX3ByaW50KHN0ZGVyciwgIi1ZIHBhdGhcdFx0ZGlyZWN0b3J5IG5hbWUgdG8gZmluZCBDIHByZXByb2Nlc3NvciAoY3BwKVxuIik7CisKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfb3V0cHV0LmggYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19vdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjI1YTYwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfb3V0cHV0LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIHJwY19vdXRwdXQuaAorICoKKyAqIERlY2xhcmF0aW9ucyBmb3Igb3V0cHV0IGZ1bmN0aW9ucworICoKKyAqLworCisjaWZuZGVmIFJQQ0dFTl9ORVdfT1VUUFVUX0gKKyNkZWZpbmUgUlBDR0VOX05FV19PVVRQVVRfSAorCit2b2lkCXdyaXRlX21zZ19vdXQodm9pZCk7CitpbnQJbnVsbHByb2MocHJvY19saXN0ICopOwordm9pZAlwcmludGFyZ2xpc3QocHJvY19saXN0ICosIGNoYXIgKiwgY2hhciAqKTsKK3ZvaWQJcGRlY2xhcmF0aW9uKGNoYXIgKiwgZGVjbGFyYXRpb24gKiwgaW50LCBjaGFyICopOworCisjZW5kaWYgLyogUlBDR0VOX05FV19PVVRQVVRfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfcGFyc2UuYyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzYTU1MwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3BhcnNlLmMKQEAgLTAsMCArMSw2MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiAwCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpcnBjX3BhcnNlLmMgMS44IDg5LzAyLzIyIChDKSAxOTg3IFNNSSI7CisjZW5kaWYKKworLyoKKyAqIHJwY19wYXJzZS5jLCBQYXJzZXIgZm9yIHRoZSBSUEMgcHJvdG9jb2wgY29tcGlsZXIgCisgKiBDb3B5cmlnaHQgKEMpIDE5ODcgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJycGMvdHlwZXMuaCIKKyNpbmNsdWRlICJycGNfc2Nhbi5oIgorI2luY2x1ZGUgInJwY19wYXJzZS5oIgorI2luY2x1ZGUgInJwY191dGlsLmgiCisKKyNkZWZpbmUgQVJHTkFNRSAiYXJnIgorCisvKgorZXh0ZXJuIGNoYXIgKm1ha2VfYXJnbmFtZSgpOworZXh0ZXJuIGNoYXIgKnN0cmR1cCgpOworICovCisKK3N0YXRpYyB2b2lkCWlzZGVmaW5lZChkZWZpbml0aW9uICpkZWZwKTsKK3N0YXRpYyB2b2lkCWRlZl9zdHJ1Y3QoZGVmaW5pdGlvbiAqZGVmcCk7CitzdGF0aWMgdm9pZAlkZWZfcHJvZ3JhbShkZWZpbml0aW9uICpkZWZwKTsKK3N0YXRpYyB2b2lkCWRlZl9lbnVtKGRlZmluaXRpb24gKmRlZnApOworc3RhdGljIHZvaWQJZGVmX2NvbnN0KGRlZmluaXRpb24gKmRlZnApOworc3RhdGljIHZvaWQJZGVmX3VuaW9uKGRlZmluaXRpb24gKmRlZnApOworc3RhdGljIHZvaWQJY2hlY2tfdHlwZV9uYW1lKGNoYXIgKm5hbWUsIGludCBuZXdfdHlwZSk7CitzdGF0aWMgdm9pZAlkZWZfdHlwZWRlZihkZWZpbml0aW9uICpkZWZwKTsKK3N0YXRpYyB2b2lkCWdldF9kZWNsYXJhdGlvbihkZWNsYXJhdGlvbiAqZGVjLCBkZWZraW5kIGRraW5kKTsKK3N0YXRpYyB2b2lkCWdldF9wcm9nX2RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uICpkZWMsIGRlZmtpbmQgZGtpbmQsIGludCBudW0pOworc3RhdGljIHZvaWQJZ2V0X3R5cGUoY2hhciAqKnByZWZpeHAsIGNoYXIgKip0eXBlcCwgZGVma2luZCBka2luZCk7CitzdGF0aWMgdm9pZAl1bnNpZ25lZF9kZWMoY2hhciAqKnR5cGVwKTsKKworLyoKKyAqIHJldHVybiB0aGUgbmV4dCBkZWZpbml0aW9uIHlvdSBzZWUKKyAqLworZGVmaW5pdGlvbiAqCitnZXRfZGVmaW5pdGlvbih2b2lkKQoreworCWRlZmluaXRpb24gKmRlZnA7CisJdG9rZW4gdG9rOworCisJZGVmcCA9IEFMTE9DKGRlZmluaXRpb24pOworCWdldF90b2tlbigmdG9rKTsKKwlzd2l0Y2ggKHRvay5raW5kKSB7CisJY2FzZSBUT0tfU1RSVUNUOgorCQlkZWZfc3RydWN0KGRlZnApOworCQlicmVhazsKKwljYXNlIFRPS19VTklPTjoKKwkJZGVmX3VuaW9uKGRlZnApOworCQlicmVhazsKKwljYXNlIFRPS19UWVBFREVGOgorCQlkZWZfdHlwZWRlZihkZWZwKTsKKwkJYnJlYWs7CisJY2FzZSBUT0tfRU5VTToKKwkJZGVmX2VudW0oZGVmcCk7CisJCWJyZWFrOworCWNhc2UgVE9LX1BST0dSQU06CisJCWRlZl9wcm9ncmFtKGRlZnApOworCQlicmVhazsKKwljYXNlIFRPS19DT05TVDoKKwkJZGVmX2NvbnN0KGRlZnApOworCQlicmVhazsKKwljYXNlIFRPS19FT0Y6CisJCWZyZWUoZGVmcCk7CisJCXJldHVybiAoTlVMTCk7CisJZGVmYXVsdDoKKwkJZXJyb3IoImRlZmluaXRpb24ga2V5d29yZCBleHBlY3RlZCIpOworCX0KKwlzY2FuKFRPS19TRU1JQ09MT04sICZ0b2spOworCWlzZGVmaW5lZChkZWZwKTsKKwlyZXR1cm4gKGRlZnApOworfQorCitzdGF0aWMgdm9pZAoraXNkZWZpbmVkKGRlZmluaXRpb24gKmRlZnApCit7CisJU1RPUkVWQUwoJmRlZmluZWQsIGRlZnApOworfQorCitzdGF0aWMgdm9pZAorZGVmX3N0cnVjdChkZWZpbml0aW9uICpkZWZwKQoreworCXRva2VuIHRvazsKKwlkZWNsYXJhdGlvbiBkZWM7CisJZGVjbF9saXN0ICpkZWNsczsKKwlkZWNsX2xpc3QgKip0YWlscDsKKworCWRlZnAtPmRlZl9raW5kID0gREVGX1NUUlVDVDsKKworCXNjYW4oVE9LX0lERU5ULCAmdG9rKTsKKwlkZWZwLT5kZWZfbmFtZSA9IHRvay5zdHI7CisJc2NhbihUT0tfTEJSQUNFLCAmdG9rKTsKKwl0YWlscCA9ICZkZWZwLT5kZWYuc3QuZGVjbHM7CisJZG8geworCQlnZXRfZGVjbGFyYXRpb24oJmRlYywgREVGX1NUUlVDVCk7CisJCWRlY2xzID0gQUxMT0MoZGVjbF9saXN0KTsKKwkJZGVjbHMtPmRlY2wgPSBkZWM7CisJCSp0YWlscCA9IGRlY2xzOworCQl0YWlscCA9ICZkZWNscy0+bmV4dDsKKwkJc2NhbihUT0tfU0VNSUNPTE9OLCAmdG9rKTsKKwkJcGVlaygmdG9rKTsKKwl9IHdoaWxlICh0b2sua2luZCAhPSBUT0tfUkJSQUNFKTsKKwlnZXRfdG9rZW4oJnRvayk7CisJKnRhaWxwID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2RlZl9wcm9ncmFtKGRlZmluaXRpb24gKmRlZnApCit7CisJdG9rZW4gdG9rOworCWRlY2xhcmF0aW9uIGRlYzsKKwlkZWNsX2xpc3QgKmRlY2xzOworCWRlY2xfbGlzdCAqKnRhaWxwOworCXZlcnNpb25fbGlzdCAqdmxpc3Q7CisJdmVyc2lvbl9saXN0ICoqdnRhaWxwOworCXByb2NfbGlzdCAqcGxpc3Q7CisJcHJvY19saXN0ICoqcHRhaWxwOworCWludCBudW1fYXJnczsKKwlib29sX3QgaXN2b2lkID0gRkFMU0U7IC8qIHdoZXRoZXIgZmlyc3QgYXJndW1lbnQgaXMgdm9pZCAqLworCWRlZnAtPmRlZl9raW5kID0gREVGX1BST0dSQU07CisJc2NhbihUT0tfSURFTlQsICZ0b2spOworCWRlZnAtPmRlZl9uYW1lID0gdG9rLnN0cjsKKwlzY2FuKFRPS19MQlJBQ0UsICZ0b2spOworCXZ0YWlscCA9ICZkZWZwLT5kZWYucHIudmVyc2lvbnM7CisJdGFpbHAgPSAmZGVmcC0+ZGVmLnN0LmRlY2xzOworCXNjYW4oVE9LX1ZFUlNJT04sICZ0b2spOworCWRvIHsKKwkJc2NhbihUT0tfSURFTlQsICZ0b2spOworCQl2bGlzdCA9IEFMTE9DKHZlcnNpb25fbGlzdCk7CisJCXZsaXN0LT52ZXJzX25hbWUgPSB0b2suc3RyOworCQlzY2FuKFRPS19MQlJBQ0UsICZ0b2spOworCQlwdGFpbHAgPSAmdmxpc3QtPnByb2NzOworCQlkbyB7CisJCQkvKiBnZXQgcmVzdWx0IHR5cGUgKi8KKwkJCXBsaXN0ID0gQUxMT0MocHJvY19saXN0KTsKKwkJCWdldF90eXBlKCZwbGlzdC0+cmVzX3ByZWZpeCwgJnBsaXN0LT5yZXNfdHlwZSwgCisJCQkJIERFRl9QUk9HUkFNKTsKKwkJCWlmIChzdHJlcShwbGlzdC0+cmVzX3R5cGUsICJvcGFxdWUiKSkgeworCQkJCWVycm9yKCJpbGxlZ2FsIHJlc3VsdCB0eXBlIik7CisJCQl9CisJCQlzY2FuKFRPS19JREVOVCwgJnRvayk7CisJCQlwbGlzdC0+cHJvY19uYW1lID0gdG9rLnN0cjsKKwkJCXNjYW4oVE9LX0xQQVJFTiwgJnRvayk7CisJCQkvKiBnZXQgYXJncyAtIGZpcnN0IG9uZSovCisJCQludW1fYXJncyA9IDE7CisJCQlpc3ZvaWQgPSBGQUxTRTsKKwkJCS8qIHR5cGUgb2YgREVGX1BST0dSQU0gaW4gdGhlIGZpcnN0IAorCQkJICogZ2V0X3Byb2dfZGVjbGFyYXRpb24gYW5kIERFRl9TVFVSQ1QgaW4gdGhlIG5leHQKKwkJCSAqIGFsbG93cyB2b2lkIGFzIGFyZ3VtZW50IGlmIGl0IGlzIHRoZSBvbmx5IGFyZ3VtZW50CisJCQkgKi8KKwkJCWdldF9wcm9nX2RlY2xhcmF0aW9uKCZkZWMsIERFRl9QUk9HUkFNLCBudW1fYXJncyk7CisJCQlpZiAoc3RyZXEoZGVjLnR5cGUsICJ2b2lkIikpCisJCQkgIGlzdm9pZCA9IFRSVUU7CisJCQlkZWNscyA9IEFMTE9DKGRlY2xfbGlzdCk7CisJCQlwbGlzdC0+YXJncy5kZWNscyA9IGRlY2xzOworCQkJZGVjbHMtPmRlY2wgPSBkZWM7CisJCQl0YWlscCA9ICZkZWNscy0+bmV4dDsKKwkJCS8qIGdldCBhcmdzICovCisJCQl3aGlsZShwZWVrc2NhbihUT0tfQ09NTUEsICZ0b2spKSB7CisJCQkgIG51bV9hcmdzKys7CisJCQkgIGdldF9wcm9nX2RlY2xhcmF0aW9uKCZkZWMsIERFRl9TVFJVQ1QsIAorCQkJCQkgICAgICAgbnVtX2FyZ3MpOworCQkJICBkZWNscyA9IEFMTE9DKGRlY2xfbGlzdCk7CisJCQkgIGRlY2xzLT5kZWNsID0gZGVjOworCQkJICAqdGFpbHAgPSBkZWNsczsKKwkJCSAgaWYgKHN0cmVxKGRlYy50eXBlLCAidm9pZCIpKQorCQkJICAgIGlzdm9pZCA9IFRSVUU7CisJCQkgIHRhaWxwID0gJmRlY2xzLT5uZXh0OworCQkJfQorCQkJLyogbXVsdGlwbGUgYXJndW1lbnRzIGFyZSBvbmx5IGFsbG93ZWQgaW4gbmV3c3R5bGUgKi8KKwkJCWlmKCAhbmV3c3R5bGUgJiYgbnVtX2FyZ3MgPiAxICkgeworCQkJICBlcnJvcigib25seSBvbmUgYXJndW1lbnQgaXMgYWxsb3dlZCIgKTsKKwkJCX0KKwkJCWlmIChpc3ZvaWQgJiYgbnVtX2FyZ3MgPiAxKSB7IAorCQkJICBlcnJvcigiaWxsZWdhbCB1c2Ugb2Ygdm9pZCBpbiBwcm9ncmFtIGRlZmluaXRpb24iKTsKKwkJCX0KKwkJCSp0YWlscCA9IE5VTEw7CisJCQlzY2FuKFRPS19SUEFSRU4sICZ0b2spOworCQkJc2NhbihUT0tfRVFVQUwsICZ0b2spOworCQkJc2Nhbl9udW0oJnRvayk7CisJCQlzY2FuKFRPS19TRU1JQ09MT04sICZ0b2spOworCQkJcGxpc3QtPnByb2NfbnVtID0gdG9rLnN0cjsKKwkJCXBsaXN0LT5hcmdfbnVtID0gbnVtX2FyZ3M7CisJCQkqcHRhaWxwID0gcGxpc3Q7CisJCQlwdGFpbHAgPSAmcGxpc3QtPm5leHQ7CisJCQlwZWVrKCZ0b2spOworCQl9IHdoaWxlICh0b2sua2luZCAhPSBUT0tfUkJSQUNFKTsKKwkJKnB0YWlscCA9IE5VTEw7CisJCSp2dGFpbHAgPSB2bGlzdDsKKwkJdnRhaWxwID0gJnZsaXN0LT5uZXh0OworCQlzY2FuKFRPS19SQlJBQ0UsICZ0b2spOworCQlzY2FuKFRPS19FUVVBTCwgJnRvayk7CisJCXNjYW5fbnVtKCZ0b2spOworCQl2bGlzdC0+dmVyc19udW0gPSB0b2suc3RyOworCQkvKiBtYWtlIHRoZSBhcmd1bWVudCBzdHJ1Y3R1cmUgbmFtZSBmb3IgZWFjaCBhcmcqLworCQlmb3IocGxpc3QgPSB2bGlzdC0+cHJvY3M7IHBsaXN0ICE9IE5VTEw7IAorCQkgICAgcGxpc3QgPSBwbGlzdC0+bmV4dCkgeworCQkJcGxpc3QtPmFyZ3MuYXJnbmFtZSA9IG1ha2VfYXJnbmFtZShwbGlzdC0+cHJvY19uYW1lLAorCQkJCQkJCSAgIHZsaXN0LT52ZXJzX251bSk7IAorCQkJLyogZnJlZSB0aGUgbWVtb3J5ID8/Ki8KKwkJfQorCQlzY2FuKFRPS19TRU1JQ09MT04sICZ0b2spOworCQlzY2FuMihUT0tfVkVSU0lPTiwgVE9LX1JCUkFDRSwgJnRvayk7CisJfSB3aGlsZSAodG9rLmtpbmQgPT0gVE9LX1ZFUlNJT04pOworCXNjYW4oVE9LX0VRVUFMLCAmdG9rKTsKKwlzY2FuX251bSgmdG9rKTsKKwlkZWZwLT5kZWYucHIucHJvZ19udW0gPSB0b2suc3RyOworCSp2dGFpbHAgPSBOVUxMOworfQorCisKK3N0YXRpYyB2b2lkCitkZWZfZW51bShkZWZpbml0aW9uICpkZWZwKQoreworCXRva2VuIHRvazsKKwllbnVtdmFsX2xpc3QgKmVsaXN0OworCWVudW12YWxfbGlzdCAqKnRhaWxwOworCisJZGVmcC0+ZGVmX2tpbmQgPSBERUZfRU5VTTsKKwlzY2FuKFRPS19JREVOVCwgJnRvayk7CisJZGVmcC0+ZGVmX25hbWUgPSB0b2suc3RyOworCXNjYW4oVE9LX0xCUkFDRSwgJnRvayk7CisJdGFpbHAgPSAmZGVmcC0+ZGVmLmVuLnZhbHM7CisJZG8geworCQlzY2FuKFRPS19JREVOVCwgJnRvayk7CisJCWVsaXN0ID0gQUxMT0MoZW51bXZhbF9saXN0KTsKKwkJZWxpc3QtPm5hbWUgPSB0b2suc3RyOworCQllbGlzdC0+YXNzaWdubWVudCA9IE5VTEw7CisJCXNjYW4zKFRPS19DT01NQSwgVE9LX1JCUkFDRSwgVE9LX0VRVUFMLCAmdG9rKTsKKwkJaWYgKHRvay5raW5kID09IFRPS19FUVVBTCkgeworCQkJc2Nhbl9udW0oJnRvayk7CisJCQllbGlzdC0+YXNzaWdubWVudCA9IHRvay5zdHI7CisJCQlzY2FuMihUT0tfQ09NTUEsIFRPS19SQlJBQ0UsICZ0b2spOworCQl9CisJCSp0YWlscCA9IGVsaXN0OworCQl0YWlscCA9ICZlbGlzdC0+bmV4dDsKKwl9IHdoaWxlICh0b2sua2luZCAhPSBUT0tfUkJSQUNFKTsKKwkqdGFpbHAgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZGVmX2NvbnN0KGRlZmluaXRpb24gKmRlZnApCit7CisJdG9rZW4gdG9rOworCisJZGVmcC0+ZGVmX2tpbmQgPSBERUZfQ09OU1Q7CisJc2NhbihUT0tfSURFTlQsICZ0b2spOworCWRlZnAtPmRlZl9uYW1lID0gdG9rLnN0cjsKKwlzY2FuKFRPS19FUVVBTCwgJnRvayk7CisJc2NhbjIoVE9LX0lERU5ULCBUT0tfU1RSQ09OU1QsICZ0b2spOworCWRlZnAtPmRlZi5jbyA9IHRvay5zdHI7Cit9CisKK3N0YXRpYyB2b2lkCitkZWZfdW5pb24oZGVmaW5pdGlvbiAqZGVmcCkKK3sKKyAgdG9rZW4gdG9rOworICBkZWNsYXJhdGlvbiBkZWM7CisgIGNhc2VfbGlzdCAqY2FzZXM7CisgIGNhc2VfbGlzdCAqKnRhaWxwOworCisgIGRlZnAtPmRlZl9raW5kID0gREVGX1VOSU9OOworICBzY2FuKFRPS19JREVOVCwgJnRvayk7CisgIGRlZnAtPmRlZl9uYW1lID0gdG9rLnN0cjsKKyAgc2NhbihUT0tfU1dJVENILCAmdG9rKTsKKyAgc2NhbihUT0tfTFBBUkVOLCAmdG9rKTsKKyAgZ2V0X2RlY2xhcmF0aW9uKCZkZWMsIERFRl9VTklPTik7CisgIGRlZnAtPmRlZi51bi5lbnVtX2RlY2wgPSBkZWM7CisgIHRhaWxwID0gJmRlZnAtPmRlZi51bi5jYXNlczsKKyAgc2NhbihUT0tfUlBBUkVOLCAmdG9rKTsKKyAgc2NhbihUT0tfTEJSQUNFLCAmdG9rKTsKKyAgc2NhbihUT0tfQ0FTRSwgJnRvayk7CisgIHdoaWxlICh0b2sua2luZCA9PSBUT0tfQ0FTRSkgeworICAgIHNjYW4yKFRPS19JREVOVCwgVE9LX0NIQVJDT05TVCwgJnRvayk7CisgICAgY2FzZXMgPSBBTExPQyhjYXNlX2xpc3QpOworICAgIGNhc2VzLT5jYXNlX25hbWUgPSB0b2suc3RyOworICAgIHNjYW4oVE9LX0NPTE9OLCAmdG9rKTsKKyAgICAvKiBub3cgcGVlayBhdCBuZXh0IHRva2VuICovCisgICAgaWYocGVla3NjYW4oVE9LX0NBU0UsJnRvaykpCisgICAgICB7CisKKwlkbyAKKwkgIHsKKwkgICAgc2NhbjIoVE9LX0lERU5ULCBUT0tfQ0hBUkNPTlNULCAmdG9rKTsKKwkgICAgY2FzZXMtPmNvbnRmbGFnPTE7CS8qIGNvbnRpbnVlZCBjYXNlIHN0YXRlbWVudCAqLworCSAgICAqdGFpbHAgPSBjYXNlczsKKwkgICAgdGFpbHAgPSAmY2FzZXMtPm5leHQ7CisJICAgIGNhc2VzID0gQUxMT0MoY2FzZV9saXN0KTsKKwkgICAgY2FzZXMtPmNhc2VfbmFtZSA9IHRvay5zdHI7CisJICAgIHNjYW4oVE9LX0NPTE9OLCAmdG9rKTsKKyAgICAgIAorCSAgfXdoaWxlKHBlZWtzY2FuKFRPS19DQVNFLCZ0b2spKTsKKyAgICAgIH0KKworICAgIGdldF9kZWNsYXJhdGlvbigmZGVjLCBERUZfVU5JT04pOworICAgIGNhc2VzLT5jYXNlX2RlY2wgPSBkZWM7CisgICAgY2FzZXMtPmNvbnRmbGFnPTA7CQkvKiBubyBjb250aW51ZWQgY2FzZSBzdGF0ZW1lbnQgKi8KKyAgICAqdGFpbHAgPSBjYXNlczsKKyAgICB0YWlscCA9ICZjYXNlcy0+bmV4dDsKKyAgICBzY2FuKFRPS19TRU1JQ09MT04sICZ0b2spOworCisgICAgc2NhbjMoVE9LX0NBU0UsIFRPS19ERUZBVUxULCBUT0tfUkJSQUNFLCAmdG9rKTsKKyAgfQorICAqdGFpbHAgPSBOVUxMOworICBpZiAodG9rLmtpbmQgPT0gVE9LX0RFRkFVTFQpIHsKKyAgICBzY2FuKFRPS19DT0xPTiwgJnRvayk7CisgICAgZ2V0X2RlY2xhcmF0aW9uKCZkZWMsIERFRl9VTklPTik7CisgICAgZGVmcC0+ZGVmLnVuLmRlZmF1bHRfZGVjbCA9IEFMTE9DKGRlY2xhcmF0aW9uKTsKKyAgICAqZGVmcC0+ZGVmLnVuLmRlZmF1bHRfZGVjbCA9IGRlYzsKKyAgICBzY2FuKFRPS19TRU1JQ09MT04sICZ0b2spOworICAgIHNjYW4oVE9LX1JCUkFDRSwgJnRvayk7CisgIH0gZWxzZSB7CisgICAgZGVmcC0+ZGVmLnVuLmRlZmF1bHRfZGVjbCA9IE5VTEw7CisgIH0KK30KKworc3RhdGljIGNoYXIqIHJlc2VydmVkX3dvcmRzW10gPQoreworICAiYXJyYXkiLAorICAiYnl0ZXMiLAorICAiZGVzdHJveSIsCisgICJmcmVlIiwKKyAgImdldHBvcyIsCisgICJpbmxpbmUiLAorICAicG9pbnRlciIsCisgICJyZWZlcmVuY2UiLAorICAic2V0cG9zIiwKKyAgInNpemVvZiIsCisgICJ1bmlvbiIsCisgICJ2ZWN0b3IiLAorICBOVUxMCisgIH07CisKK3N0YXRpYyBjaGFyKiByZXNlcnZlZF90eXBlc1tdID0KK3sKKyAgIm9wYXF1ZSIsCisgICJzdHJpbmciLAorICBOVUxMCisgIH07CisKKy8qIGNoZWNrIHRoYXQgdGhlIGdpdmVuIG5hbWUgaXMgbm90IG9uZSB0aGF0IHdvdWxkIGV2ZW50dWFsbHkgcmVzdWx0IGluCisgICB4ZHIgcm91dGluZXMgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIGludGVybmFsIFhEUiByb3V0aW5lcy4gKi8KK3N0YXRpYyB2b2lkCitjaGVja190eXBlX25hbWUoY2hhciAqbmFtZSwgaW50IG5ld190eXBlKQoreworICBpbnQgaTsKKyAgY2hhciB0bXBbMTAwXTsKKworICBmb3IoIGkgPSAwOyByZXNlcnZlZF93b3Jkc1tpXSAhPSBOVUxMOyBpKysgKSB7CisgICAgaWYoIHN0cmNtcCggbmFtZSwgcmVzZXJ2ZWRfd29yZHNbaV0gKSA9PSAwICkgeworICAgICAgc3ByaW50Zih0bXAsIAorCSAgICAgICJpbGxlZ2FsIChyZXNlcnZlZCkgbmFtZSA6XCclc1wnIGluIHR5cGUgZGVmaW5pdGlvbiIsIG5hbWUgKTsKKyAgICAgIGVycm9yKHRtcCk7CisgICAgfQorICB9CisgIGlmKCBuZXdfdHlwZSApIHsKKyAgICBmb3IoIGkgPSAwOyByZXNlcnZlZF90eXBlc1tpXSAhPSBOVUxMOyBpKysgKSB7CisgICAgICBpZiggc3RyY21wKCBuYW1lLCByZXNlcnZlZF90eXBlc1tpXSApID09IDAgKSB7CisJc3ByaW50Zih0bXAsIAorCQkiaWxsZWdhbCAocmVzZXJ2ZWQpIG5hbWUgOlwnJXNcJyBpbiB0eXBlIGRlZmluaXRpb24iLCBuYW1lICk7CisJZXJyb3IodG1wKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQKK2RlZl90eXBlZGVmKGRlZmluaXRpb24gKmRlZnApCit7CisJZGVjbGFyYXRpb24gZGVjOworCisJZGVmcC0+ZGVmX2tpbmQgPSBERUZfVFlQRURFRjsKKwlnZXRfZGVjbGFyYXRpb24oJmRlYywgREVGX1RZUEVERUYpOworCWRlZnAtPmRlZl9uYW1lID0gZGVjLm5hbWU7CisJY2hlY2tfdHlwZV9uYW1lKCBkZWMubmFtZSwgMSApOworCWRlZnAtPmRlZi50eS5vbGRfcHJlZml4ID0gZGVjLnByZWZpeDsKKwlkZWZwLT5kZWYudHkub2xkX3R5cGUgPSBkZWMudHlwZTsKKwlkZWZwLT5kZWYudHkucmVsID0gZGVjLnJlbDsKKwlkZWZwLT5kZWYudHkuYXJyYXlfbWF4ID0gZGVjLmFycmF5X21heDsKK30KKworc3RhdGljIHZvaWQKK2dldF9kZWNsYXJhdGlvbihkZWNsYXJhdGlvbiAqZGVjLCBkZWZraW5kIGRraW5kKQoreworCXRva2VuIHRvazsKKworCWdldF90eXBlKCZkZWMtPnByZWZpeCwgJmRlYy0+dHlwZSwgZGtpbmQpOworCWRlYy0+cmVsID0gUkVMX0FMSUFTOworCWlmIChzdHJlcShkZWMtPnR5cGUsICJ2b2lkIikpIHsKKwkJcmV0dXJuOworCX0KKworCWNoZWNrX3R5cGVfbmFtZSggZGVjLT50eXBlLCAwICk7CisKKwlzY2FuMihUT0tfU1RBUiwgVE9LX0lERU5ULCAmdG9rKTsKKwlpZiAodG9rLmtpbmQgPT0gVE9LX1NUQVIpIHsKKwkJZGVjLT5yZWwgPSBSRUxfUE9JTlRFUjsKKwkJc2NhbihUT0tfSURFTlQsICZ0b2spOworCX0KKwlkZWMtPm5hbWUgPSB0b2suc3RyOworCWlmIChwZWVrc2NhbihUT0tfTEJSQUNLRVQsICZ0b2spKSB7CisJCWlmIChkZWMtPnJlbCA9PSBSRUxfUE9JTlRFUikgeworCQkJZXJyb3IoIm5vIGFycmF5LW9mLXBvaW50ZXIgZGVjbGFyYXRpb25zIC0tIHVzZSB0eXBlZGVmIik7CisJCX0KKwkJZGVjLT5yZWwgPSBSRUxfVkVDVE9SOworCQlzY2FuX251bSgmdG9rKTsKKwkJZGVjLT5hcnJheV9tYXggPSB0b2suc3RyOworCQlzY2FuKFRPS19SQlJBQ0tFVCwgJnRvayk7CisJfSBlbHNlIGlmIChwZWVrc2NhbihUT0tfTEFOR0xFLCAmdG9rKSkgeworCQlpZiAoZGVjLT5yZWwgPT0gUkVMX1BPSU5URVIpIHsKKwkJCWVycm9yKCJubyBhcnJheS1vZi1wb2ludGVyIGRlY2xhcmF0aW9ucyAtLSB1c2UgdHlwZWRlZiIpOworCQl9CisJCWRlYy0+cmVsID0gUkVMX0FSUkFZOworCQlpZiAocGVla3NjYW4oVE9LX1JBTkdMRSwgJnRvaykpIHsKKwkJCWRlYy0+YXJyYXlfbWF4ID0gIn4wIjsJLyogdW5zcGVjaWZpZWQgc2l6ZSwgdXNlIG1heCAqLworCQl9IGVsc2UgeworCQkJc2Nhbl9udW0oJnRvayk7CisJCQlkZWMtPmFycmF5X21heCA9IHRvay5zdHI7CisJCQlzY2FuKFRPS19SQU5HTEUsICZ0b2spOworCQl9CisJfQorCWlmIChzdHJlcShkZWMtPnR5cGUsICJvcGFxdWUiKSkgeworCQlpZiAoZGVjLT5yZWwgIT0gUkVMX0FSUkFZICYmIGRlYy0+cmVsICE9IFJFTF9WRUNUT1IpIHsKKwkJCWVycm9yKCJhcnJheSBkZWNsYXJhdGlvbiBleHBlY3RlZCIpOworCQl9CisJfSBlbHNlIGlmIChzdHJlcShkZWMtPnR5cGUsICJzdHJpbmciKSkgeworCQlpZiAoZGVjLT5yZWwgIT0gUkVMX0FSUkFZKSB7CisJCQllcnJvcigidmFyaWFibGUtbGVuZ3RoIGFycmF5IGRlY2xhcmF0aW9uIGV4cGVjdGVkIik7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2dldF9wcm9nX2RlY2xhcmF0aW9uKGRlY2xhcmF0aW9uICpkZWMsIGRlZmtpbmQgZGtpbmQsIGludCBudW0pCit7CisJdG9rZW4gdG9rOworCWNoYXIgbmFtZVsxMF07IC8qIGFyZ3VtZW50IG5hbWUgKi8KKworCWlmIChka2luZCA9PSBERUZfUFJPR1JBTSkgeyAKKwkgIHBlZWsoJnRvayk7CisJICBpZiAodG9rLmtpbmQgPT0gVE9LX1JQQVJFTikgeyAvKiBubyBhcmd1bWVudHMgKi8KKwkgICAgCWRlYy0+cmVsID0gUkVMX0FMSUFTOworCQlkZWMtPnR5cGUgPSAidm9pZCI7CisJCWRlYy0+cHJlZml4ID0gTlVMTDsKKwkJZGVjLT5uYW1lID0gTlVMTDsKKwkJcmV0dXJuOworCSAgICAgIH0KKwl9CisJZ2V0X3R5cGUoJmRlYy0+cHJlZml4LCAmZGVjLT50eXBlLCBka2luZCk7CisJZGVjLT5yZWwgPSBSRUxfQUxJQVM7CisJaWYgKHBlZWtzY2FuKFRPS19JREVOVCwgJnRvaykpICAvKiBvcHRpb25hbCBuYW1lIG9mIGFyZ3VtZW50ICovCisJCXN0cmNweShuYW1lLCB0b2suc3RyKTsKKwllbHNlIAorCQlzcHJpbnRmKG5hbWUsICIlcyVkIiwgQVJHTkFNRSwgbnVtKTsgLyogZGVmYXVsdCBuYW1lIG9mIGFyZ3VtZW50ICovCisKKwlkZWMtPm5hbWUgPSAoY2hhciAqKSBzdHJkdXAobmFtZSk7IAorCQorCWlmIChzdHJlcShkZWMtPnR5cGUsICJ2b2lkIikpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJlcShkZWMtPnR5cGUsICJvcGFxdWUiKSkgeworCQllcnJvcigib3BhcXVlIC0tIGlsbGVnYWwgYXJndW1lbnQgdHlwZSIpOworCX0KKwlpZiAocGVla3NjYW4oVE9LX1NUQVIsICZ0b2spKSB7IAorCSAgaWYgKHN0cmVxKGRlYy0+dHlwZSwgInN0cmluZyIpKSB7CisJICAgIGVycm9yKCJwb2ludGVyIHRvIHN0cmluZyBub3QgYWxsb3dlZCBpbiBwcm9ncmFtIGFyZ3VtZW50c1xuIik7CisJICB9CisJCWRlYy0+cmVsID0gUkVMX1BPSU5URVI7CisJCWlmIChwZWVrc2NhbihUT0tfSURFTlQsICZ0b2spKSAgLyogb3B0aW9uYWwgbmFtZSBvZiBhcmd1bWVudCAqLworCQkgIGRlYy0+bmFtZSA9IHN0cmR1cCh0b2suc3RyKTsKKyAgICAgIH0KKwkgIGlmIChwZWVrc2NhbihUT0tfTEFOR0xFLCAmdG9rKSkgeworCSAgICBpZiAoIXN0cmVxKGRlYy0+dHlwZSwgInN0cmluZyIpKSB7CisJICAgICAgZXJyb3IoImFycmF5cyBjYW5ub3QgYmUgZGVjbGFyZWQgYXMgYXJndW1lbnRzIHRvIHByb2NlZHVyZXMgLS0gdXNlIHR5cGVkZWYiKTsKKwkgICAgfQorCQlkZWMtPnJlbCA9IFJFTF9BUlJBWTsKKwkJaWYgKHBlZWtzY2FuKFRPS19SQU5HTEUsICZ0b2spKSB7CisJCQlkZWMtPmFycmF5X21heCA9ICJ+MCI7LyogdW5zcGVjaWZpZWQgc2l6ZSwgdXNlIG1heCAqLworCQl9IGVsc2UgeworCQkJc2Nhbl9udW0oJnRvayk7CisJCQlkZWMtPmFycmF5X21heCA9IHRvay5zdHI7CisJCQlzY2FuKFRPS19SQU5HTEUsICZ0b2spOworCQl9CisJfQorCWlmIChzdHJlcShkZWMtPnR5cGUsICJzdHJpbmciKSkgeworCQlpZiAoZGVjLT5yZWwgIT0gUkVMX0FSUkFZKSB7ICAvKiAueCBzcGVjaWZpZXMganVzdCBzdHJpbmcgYXMKKwkJCQkJICAgICAgICogdHlwZSBvZiBhcmd1bWVudCAKKwkJCQkJICAgICAgICogLSBtYWtlIGl0IHN0cmluZzw+CisJCQkJCSAgICAgICAqLworCQkJZGVjLT5yZWwgPSBSRUxfQVJSQVk7CisJCQlkZWMtPmFycmF5X21heCA9ICJ+MCI7LyogdW5zcGVjaWZpZWQgc2l6ZSwgdXNlIG1heCAqLworCQl9CisJfQorfQorCisKKworc3RhdGljIHZvaWQKK2dldF90eXBlKGNoYXIgKipwcmVmaXhwLCBjaGFyICoqdHlwZXAsIGRlZmtpbmQgZGtpbmQpCit7CisJdG9rZW4gdG9rOworCisJKnByZWZpeHAgPSBOVUxMOworCWdldF90b2tlbigmdG9rKTsKKwlzd2l0Y2ggKHRvay5raW5kKSB7CisJY2FzZSBUT0tfSURFTlQ6CisJCSp0eXBlcCA9IHRvay5zdHI7CisJCWJyZWFrOworCWNhc2UgVE9LX1NUUlVDVDoKKwljYXNlIFRPS19FTlVNOgorCWNhc2UgVE9LX1VOSU9OOgorCQkqcHJlZml4cCA9IHRvay5zdHI7CisJCXNjYW4oVE9LX0lERU5ULCAmdG9rKTsKKwkJKnR5cGVwID0gdG9rLnN0cjsKKwkJYnJlYWs7CisJY2FzZSBUT0tfVU5TSUdORUQ6CisJCXVuc2lnbmVkX2RlYyh0eXBlcCk7CisJCWJyZWFrOworCWNhc2UgVE9LX1NIT1JUOgorCQkqdHlwZXAgPSAic2hvcnQiOworCQkodm9pZCkgcGVla3NjYW4oVE9LX0lOVCwgJnRvayk7CisJCWJyZWFrOworCWNhc2UgVE9LX0lOVDMyOgorCQkqdHlwZXAgPSAiaW50MzJfdCI7CisJCSh2b2lkKSBwZWVrc2NhbihUT0tfSU5ULCAmdG9rKTsKKwkJYnJlYWs7CisJY2FzZSBUT0tfVk9JRDoKKwkJaWYgKGRraW5kICE9IERFRl9VTklPTiAmJiBka2luZCAhPSBERUZfUFJPR1JBTSkgeworCQkJZXJyb3IoInZvaWRzIGFsbG93ZWQgb25seSBpbnNpZGUgdW5pb24gYW5kIHByb2dyYW0gZGVmaW5pdGlvbnMgd2l0aCBvbmUgYXJndW1lbnQiKTsKKwkJfQorCQkqdHlwZXAgPSB0b2suc3RyOworCQlicmVhazsKKwljYXNlIFRPS19TVFJJTkc6CisJY2FzZSBUT0tfT1BBUVVFOgorCWNhc2UgVE9LX0NIQVI6CisJY2FzZSBUT0tfSU5UOgorCWNhc2UgVE9LX0ZMT0FUOgorCWNhc2UgVE9LX0RPVUJMRToKKwljYXNlIFRPS19CT09MOgorCQkqdHlwZXAgPSB0b2suc3RyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvcigiZXhwZWN0ZWQgdHlwZSBzcGVjaWZpZXIiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit1bnNpZ25lZF9kZWMoY2hhciAqKnR5cGVwKQoreworCXRva2VuIHRvazsKKworCXBlZWsoJnRvayk7CisJc3dpdGNoICh0b2sua2luZCkgeworCWNhc2UgVE9LX0NIQVI6CisJCWdldF90b2tlbigmdG9rKTsKKwkJKnR5cGVwID0gInVfY2hhciI7CisJCWJyZWFrOworCWNhc2UgVE9LX1NIT1JUOgorCQlnZXRfdG9rZW4oJnRvayk7CisJCSp0eXBlcCA9ICJ1X3Nob3J0IjsKKwkJKHZvaWQpIHBlZWtzY2FuKFRPS19JTlQsICZ0b2spOworCQlicmVhazsKKwljYXNlIFRPS19JTlQzMjoKKwkJZ2V0X3Rva2VuKCZ0b2spOworCQkqdHlwZXAgPSAidV9pbnQzMl8iOworCQkodm9pZCkgcGVla3NjYW4oVE9LX0lOVCwgJnRvayk7CisJCWJyZWFrOworCWNhc2UgVE9LX0lOVDoKKwkJZ2V0X3Rva2VuKCZ0b2spOworCQkqdHlwZXAgPSAidV9pbnQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqdHlwZXAgPSAidV9pbnQiOworCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19wYXJzZS5oIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZhZTEwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfcGFyc2UuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogICAgICBAKCMpcnBjX3BhcnNlLmggIDEuMyAgOTAvMDgvMjkgIChDKSAxOTg3IFNNSSAgICovCisKKy8qCisgKiBycGNfcGFyc2UuaCwgRGVmaW5pdGlvbnMgZm9yIHRoZSBSUENMIHBhcnNlciAKKyAqLworCitlbnVtIGRlZmtpbmQgeworCURFRl9DT05TVCwKKwlERUZfU1RSVUNULAorCURFRl9VTklPTiwKKwlERUZfRU5VTSwKKwlERUZfVFlQRURFRiwKKwlERUZfUFJPR1JBTQorfTsKK3R5cGVkZWYgZW51bSBkZWZraW5kIGRlZmtpbmQ7CisKK3R5cGVkZWYgY2hhciAqY29uc3RfZGVmOworCitlbnVtIHJlbGF0aW9uIHsKKwlSRUxfVkVDVE9SLAkvKiBmaXhlZCBsZW5ndGggYXJyYXkgKi8KKwlSRUxfQVJSQVksCS8qIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLworCVJFTF9QT0lOVEVSLAkvKiBwb2ludGVyICovCisJUkVMX0FMSUFTLAkvKiBzaW1wbGUgKi8KK307Cit0eXBlZGVmIGVudW0gcmVsYXRpb24gcmVsYXRpb247CisKK3N0cnVjdCB0eXBlZGVmX2RlZiB7CisJY2hhciAqb2xkX3ByZWZpeDsKKwljaGFyICpvbGRfdHlwZTsKKwlyZWxhdGlvbiByZWw7CisJY2hhciAqYXJyYXlfbWF4OworfTsKK3R5cGVkZWYgc3RydWN0IHR5cGVkZWZfZGVmIHR5cGVkZWZfZGVmOworCitzdHJ1Y3QgZW51bXZhbF9saXN0IHsKKwljaGFyICpuYW1lOworCWNoYXIgKmFzc2lnbm1lbnQ7CisJc3RydWN0IGVudW12YWxfbGlzdCAqbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBlbnVtdmFsX2xpc3QgZW51bXZhbF9saXN0OworCitzdHJ1Y3QgZW51bV9kZWYgeworCWVudW12YWxfbGlzdCAqdmFsczsKK307Cit0eXBlZGVmIHN0cnVjdCBlbnVtX2RlZiBlbnVtX2RlZjsKKworc3RydWN0IGRlY2xhcmF0aW9uIHsKKwljaGFyICpwcmVmaXg7CisJY2hhciAqdHlwZTsKKwljaGFyICpuYW1lOworCXJlbGF0aW9uIHJlbDsKKwljaGFyICphcnJheV9tYXg7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZGVjbGFyYXRpb24gZGVjbGFyYXRpb247CisKK3N0cnVjdCBkZWNsX2xpc3QgeworCWRlY2xhcmF0aW9uIGRlY2w7CisJc3RydWN0IGRlY2xfbGlzdCAqbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBkZWNsX2xpc3QgZGVjbF9saXN0OworCitzdHJ1Y3Qgc3RydWN0X2RlZiB7CisJZGVjbF9saXN0ICpkZWNsczsKK307Cit0eXBlZGVmIHN0cnVjdCBzdHJ1Y3RfZGVmIHN0cnVjdF9kZWY7CisKK3N0cnVjdCBjYXNlX2xpc3QgeworCWNoYXIgKmNhc2VfbmFtZTsKKwlpbnQgY29udGZsYWc7CisJZGVjbGFyYXRpb24gY2FzZV9kZWNsOworCXN0cnVjdCBjYXNlX2xpc3QgKm5leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY2FzZV9saXN0IGNhc2VfbGlzdDsKKworc3RydWN0IHVuaW9uX2RlZiB7CisJZGVjbGFyYXRpb24gZW51bV9kZWNsOworCWNhc2VfbGlzdCAqY2FzZXM7CisJZGVjbGFyYXRpb24gKmRlZmF1bHRfZGVjbDsKK307Cit0eXBlZGVmIHN0cnVjdCB1bmlvbl9kZWYgdW5pb25fZGVmOworCitzdHJ1Y3QgYXJnX2xpc3QgeworCWNoYXIgKmFyZ25hbWU7IC8qIG5hbWUgb2Ygc3RydWN0IGZvciBhcmcqLworCWRlY2xfbGlzdCAqZGVjbHM7Cit9OworCQordHlwZWRlZiBzdHJ1Y3QgYXJnX2xpc3QgYXJnX2xpc3Q7CisKK3N0cnVjdCBwcm9jX2xpc3QgeworCWNoYXIgKnByb2NfbmFtZTsKKwljaGFyICpwcm9jX251bTsKKwlhcmdfbGlzdCBhcmdzOworCWludCBhcmdfbnVtOworCWNoYXIgKnJlc190eXBlOworCWNoYXIgKnJlc19wcmVmaXg7CisJc3RydWN0IHByb2NfbGlzdCAqbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBwcm9jX2xpc3QgcHJvY19saXN0OworCitzdHJ1Y3QgdmVyc2lvbl9saXN0IHsKKwljaGFyICp2ZXJzX25hbWU7CisJY2hhciAqdmVyc19udW07CisJcHJvY19saXN0ICpwcm9jczsKKwlzdHJ1Y3QgdmVyc2lvbl9saXN0ICpuZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IHZlcnNpb25fbGlzdCB2ZXJzaW9uX2xpc3Q7CisKK3N0cnVjdCBwcm9ncmFtX2RlZiB7CisJY2hhciAqcHJvZ19udW07CisJdmVyc2lvbl9saXN0ICp2ZXJzaW9uczsKK307Cit0eXBlZGVmIHN0cnVjdCBwcm9ncmFtX2RlZiBwcm9ncmFtX2RlZjsKKworc3RydWN0IGRlZmluaXRpb24geworCWNoYXIgKmRlZl9uYW1lOworCWRlZmtpbmQgZGVmX2tpbmQ7CisJdW5pb24geworCQljb25zdF9kZWYgY287CisJCXN0cnVjdF9kZWYgc3Q7CisJCXVuaW9uX2RlZiB1bjsKKwkJZW51bV9kZWYgZW47CisJCXR5cGVkZWZfZGVmIHR5OworCQlwcm9ncmFtX2RlZiBwcjsKKwl9IGRlZjsKK307Cit0eXBlZGVmIHN0cnVjdCBkZWZpbml0aW9uIGRlZmluaXRpb247CisKK2RlZmluaXRpb24gKmdldF9kZWZpbml0aW9uKCk7CisKKworc3RydWN0IGJhc190eXBlCit7CisgIGNoYXIgKm5hbWU7CisgIGludCBsZW5ndGg7CisgIHN0cnVjdCBiYXNfdHlwZSAqbmV4dDsKK307CisKK3R5cGVkZWYgc3RydWN0IGJhc190eXBlIGJhc190eXBlOwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfc2FtcGxlLmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19zYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVjODFiCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfc2FtcGxlLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKyAqICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiAwCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpcnBjX3NhbXBsZS5jICAxLjEgIDkwLzA4LzMwICAoQykgMTk4NyBTTUkiOworCisjZW5kaWYKKworLyoKKyAqIHJwY19zYW1wbGUuYywgU2FtcGxlIGNsaWVudC1zZXJ2ZXIgY29kZSBvdXRwdXR0ZXIgZm9yIHRoZSBSUEMgcHJvdG9jb2wgY29tcGlsZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJycGNfcGFyc2UuaCIKKyNpbmNsdWRlICJycGNfdXRpbC5oIgorCisKK3N0YXRpYyBjaGFyIFJRU1RQW10gPSAicnFzdHAiOworCitzdGF0aWMgdm9pZAl3cml0ZV9zYW1wbGVfY2xpZW50KGNoYXIgKnByb2dyYW1fbmFtZSwgdmVyc2lvbl9saXN0ICp2cCk7CitzdGF0aWMgdm9pZAl3cml0ZV9zYW1wbGVfc2VydmVyKGRlZmluaXRpb24gKiBkZWYpOworc3RhdGljIHZvaWQJcmV0dXJuX3R5cGUocHJvY19saXN0ICpwbGlzdCk7CisKK3ZvaWQKK3dyaXRlX3NhbXBsZV9zdmMoZGVmaW5pdGlvbiAqZGVmKQoreworCWlmIChkZWYtPmRlZl9raW5kICE9IERFRl9QUk9HUkFNKQorCQlyZXR1cm47CisJd3JpdGVfc2FtcGxlX3NlcnZlcihkZWYpOworfQorCisKK2ludAord3JpdGVfc2FtcGxlX2NsbnQoZGVmaW5pdGlvbiAqZGVmKQoreworCXZlcnNpb25fbGlzdCAgICp2cDsKKwlpbnQgICAgICAgICAgICAgY291bnQgPSAwOworCisJaWYgKGRlZi0+ZGVmX2tpbmQgIT0gREVGX1BST0dSQU0pCisJCXJldHVybiAoMCk7CisJLyogZ2VuZXJhdGUgc2FtcGxlIGNvZGUgZm9yIGVhY2ggdmVyc2lvbiAqLworCWZvciAodnAgPSBkZWYtPmRlZi5wci52ZXJzaW9uczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dCkgeworCQl3cml0ZV9zYW1wbGVfY2xpZW50KGRlZi0+ZGVmX25hbWUsIHZwKTsKKwkJKytjb3VudDsKKwl9CisJcmV0dXJuIChjb3VudCk7Cit9CisKKworc3RhdGljIHZvaWQKK3dyaXRlX3NhbXBsZV9jbGllbnQoY2hhciAqcHJvZ3JhbV9uYW1lLCB2ZXJzaW9uX2xpc3QgKnZwKQoreworCXByb2NfbGlzdCAgICAgICpwcm9jOworCWludCAgICAgICAgICAgICBpOworCWRlY2xfbGlzdCAgICAgICpsOworCisJZl9wcmludChmb3V0LCAiXG5cbnZvaWRcbiIpOworCXB2bmFtZShwcm9ncmFtX25hbWUsIHZwLT52ZXJzX251bSk7CisJaWYgKENmbGFnKQorCQlmX3ByaW50KGZvdXQsICIoIGNoYXIqIGhvc3QgKVxue1xuIik7CisJZWxzZQorCQlmX3ByaW50KGZvdXQsICIoaG9zdClcbmNoYXIgKmhvc3Q7XG57XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdENMSUVOVCAqY2xudDtcbiIpOworCisJaSA9IDA7CisJZm9yIChwcm9jID0gdnAtPnByb2NzOyBwcm9jICE9IE5VTEw7IHByb2MgPSBwcm9jLT5uZXh0KSB7CisJCWZfcHJpbnQoZm91dCwgIlx0Iik7CisJCXB0eXBlKHByb2MtPnJlc19wcmVmaXgsIHByb2MtPnJlc190eXBlLCAxKTsKKwkJZl9wcmludChmb3V0LCAiICpyZXN1bHRfJWQ7XG4iLCArK2kpOworCQkvKiBwcmludCBvdXQgZGVjbGFyYXRpb25zIGZvciBhcmd1bWVudHMgKi8KKwkJaWYgKHByb2MtPmFyZ19udW0gPCAyICYmICFuZXdzdHlsZSkgeworCQkJZl9wcmludChmb3V0LCAiXHQiKTsKKwkJCWlmICghc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKQorCQkJCXB0eXBlKHByb2MtPmFyZ3MuZGVjbHMtPmRlY2wucHJlZml4LCBwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnR5cGUsIDEpOworCQkJZWxzZQorCQkJCWZfcHJpbnQoZm91dCwgImNoYXIqICIpOwkvKiBjYW5ub3QgaGF2ZSAidm9pZCIgdHlwZSAqLworCQkJZl9wcmludChmb3V0LCAiICIpOworCQkJcHZuYW1lKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCWZfcHJpbnQoZm91dCwgIl9hcmc7XG4iKTsKKwkJfSBlbHNlIGlmICghc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKSB7CisJCQlmb3IgKGwgPSBwcm9jLT5hcmdzLmRlY2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCQkJZl9wcmludChmb3V0LCAiXHQiKTsKKwkJCQlwdHlwZShsLT5kZWNsLnByZWZpeCwgbC0+ZGVjbC50eXBlLCAxKTsKKwkJCQlmX3ByaW50KGZvdXQsICIgIik7CisJCQkJcHZuYW1lKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCQlmX3ByaW50KGZvdXQsICJfJXM7XG4iLCBsLT5kZWNsLm5hbWUpOworCQkJCS8qCSAgcGRlY2xhcmF0aW9uKHByb2MtPmFyZ3MuYXJnbmFtZSwgJmwtPmRlY2wsIDEsICI7XG4iICk7Ki8KKwkJCX0KKwkJfQorCX0KKworCS8qIGdlbmVyYXRlIGNyZWF0aW9uIG9mIGNsaWVudCBoYW5kbGUgKi8KKwlmX3ByaW50KGZvdXQsICJcdGNsbnQgPSBjbG50X2NyZWF0ZShob3N0LCAlcywgJXMsIFwiJXNcIik7XG4iLAorCQlwcm9ncmFtX25hbWUsIHZwLT52ZXJzX25hbWUsIHRpcnBjZmxhZyA/ICJuZXRwYXRoIiA6ICJ1ZHAiKTsKKwlmX3ByaW50KGZvdXQsICJcdGlmIChjbG50ID09IE5VTEwpIHtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRjbG50X3BjcmVhdGVlcnJvcihob3N0KTtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRleGl0KDEpO1xuXHR9XG4iKTsKKworCS8qIGdlbmVyYXRlIGNhbGxzIHRvIHByb2NlZHVyZXMgKi8KKwlpID0gMDsKKwlmb3IgKHByb2MgPSB2cC0+cHJvY3M7IHByb2MgIT0gTlVMTDsgcHJvYyA9IHByb2MtPm5leHQpIHsKKwkJZl9wcmludChmb3V0LCAiXHRyZXN1bHRfJWQgPSAiLCArK2kpOworCQlwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQlpZiAocHJvYy0+YXJnX251bSA8IDIgJiYgIW5ld3N0eWxlKSB7CisJCQlmX3ByaW50KGZvdXQsICIoIik7CisJCQlpZiAoc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKQkvKiBjYXN0IHRvIHZvaWQqICovCisJCQkJZl9wcmludChmb3V0LCAiKHZvaWQqKSIpOworCQkJZl9wcmludChmb3V0LCAiJiIpOworCQkJcHZuYW1lKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCWZfcHJpbnQoZm91dCwgIl9hcmcsIGNsbnQpO1xuIik7CisJCX0gZWxzZSBpZiAoc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKSB7CisJCQlmX3ByaW50KGZvdXQsICIoY2xudCk7XG4iKTsKKwkJfSBlbHNlIHsKKwkJCWZfcHJpbnQoZm91dCwgIigiKTsKKwkJCWZvciAobCA9IHByb2MtPmFyZ3MuZGVjbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJCQlwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJCWZfcHJpbnQoZm91dCwgIl8lcywgIiwgbC0+ZGVjbC5uYW1lKTsKKwkJCX0KKwkJCWZfcHJpbnQoZm91dCwgImNsbnQpO1xuIik7CisJCX0KKwkJZl9wcmludChmb3V0LCAiXHRpZiAocmVzdWx0XyVkID09IE5VTEwpIHtcbiIsIGkpOworCQlmX3ByaW50KGZvdXQsICJcdFx0Y2xudF9wZXJyb3IoY2xudCwgXCJjYWxsIGZhaWxlZDpcIik7XG4iKTsKKwkJZl9wcmludChmb3V0LCAiXHR9XG4iKTsKKwl9CisKKwlmX3ByaW50KGZvdXQsICJcdGNsbnRfZGVzdHJveSggY2xudCApO1xuIik7CisJZl9wcmludChmb3V0LCAifVxuIik7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9zYW1wbGVfc2VydmVyKGRlZmluaXRpb24gKiBkZWYpCit7CisJdmVyc2lvbl9saXN0ICAgKnZwOworCXByb2NfbGlzdCAgICAgICpwcm9jOworCisJZm9yICh2cCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2cCAhPSBOVUxMOyB2cCA9IHZwLT5uZXh0KSB7CisJCWZvciAocHJvYyA9IHZwLT5wcm9jczsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LCAiXG4iKTsKKwkJCS8qCQkJaWYoIENmbGFnICkKKwkJCSAgZl9wcmludCggZm91dCwgImV4dGVybiBcIkNcIntcbiIpOworKi8KKwkJCXJldHVybl90eXBlKHByb2MpOworCQkJZl9wcmludChmb3V0LCAiKiBcbiIpOworCQkJaWYgKENmbGFnKQorCQkJCXB2bmFtZV9zdmMocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJZWxzZQorCQkJCXB2bmFtZShwcm9jLT5wcm9jX25hbWUsIHZwLT52ZXJzX251bSk7CisJCQlwcmludGFyZ2xpc3QocHJvYywgUlFTVFAsICJzdHJ1Y3Qgc3ZjX3JlcSAqIik7CisKKwkJCWZfcHJpbnQoZm91dCwgIntcbiIpOworCQkJZl9wcmludChmb3V0LCAiXG5cdHN0YXRpYyAiKTsKKwkJCWlmICghc3RyZXEocHJvYy0+cmVzX3R5cGUsICJ2b2lkIikpCisJCQkJcmV0dXJuX3R5cGUocHJvYyk7CisJCQllbHNlCisJCQkJZl9wcmludChmb3V0LCAiY2hhcioiKTsJLyogY2Fubm90IGhhdmUgdm9pZCB0eXBlICovCisJCQkvKiBmX3ByaW50KGZvdXQsICIgcmVzdWx0O1xuIiwgcHJvYy0+cmVzX3R5cGUpOyAqLworCQkJZl9wcmludChmb3V0LCAiIHJlc3VsdDtcbiIpOworCQkJZl9wcmludChmb3V0LAorCQkJCSJcblx0Lypcblx0ICogaW5zZXJ0IHNlcnZlciBjb2RlIGhlcmVcblx0ICovXG5cbiIpOworCQkJaWYgKCFzdHJlcShwcm9jLT5yZXNfdHlwZSwgInZvaWQiKSkKKwkJCQlmX3ByaW50KGZvdXQsICJcdHJldHVybigmcmVzdWx0KTtcbn1cbiIpOworCQkJZWxzZQkvKiBjYXN0IGJhY2sgdG8gdm9pZCAqICovCisJCQkJZl9wcmludChmb3V0LCAiXHRyZXR1cm4oKHZvaWQqKSAmcmVzdWx0KTtcbn1cbiIpOworCQkJLyoJCQlpZiggQ2ZsYWcpCisJCQkgIGZfcHJpbnQoIGZvdXQsICJ9O1xuIik7CisqLworCisJCX0KKwl9Cit9CisKKworCitzdGF0aWMgdm9pZAorcmV0dXJuX3R5cGUocHJvY19saXN0ICpwbGlzdCkKK3sKKwlwdHlwZSggcGxpc3QtPnJlc19wcmVmaXgsIHBsaXN0LT5yZXNfdHlwZSwgMSApOworfQorCit2b2lkCithZGRfc2FtcGxlX21zZyh2b2lkKQoreworCWZfcHJpbnQoZm91dCwgIi8qXG4iKTsKKwlmX3ByaW50KGZvdXQsICIgKiBUaGlzIGlzIHNhbXBsZSBjb2RlIGdlbmVyYXRlZCBieSBycGNnZW4uXG4iKTsKKwlmX3ByaW50KGZvdXQsICIgKiBUaGVzZSBhcmUgb25seSB0ZW1wbGF0ZXMgYW5kIHlvdSBjYW4gdXNlIHRoZW1cbiIpOworCWZfcHJpbnQoZm91dCwgIiAqIGFzIGEgZ3VpZGVsaW5lIGZvciBkZXZlbG9waW5nIHlvdXIgb3duIGZ1bmN0aW9ucy5cbiIpOworCWZfcHJpbnQoZm91dCwgIiAqL1xuXG4iKTsKK30KKwordm9pZAord3JpdGVfc2FtcGxlX2NsbnRfbWFpbih2b2lkKQoreworICBsaXN0ICpsOworICBkZWZpbml0aW9uICpkZWY7CisgIHZlcnNpb25fbGlzdCAqdnA7CisKKyAgZl9wcmludChmb3V0LCAiXG5cbiIgKTsKKyAgaWYoIENmbGFnICkKKyAgICBmX3ByaW50KGZvdXQsIm1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKVxue1xuIiApOworICBlbHNlCisgICAgZl9wcmludChmb3V0LCAibWFpbihhcmdjLCBhcmd2KVxuaW50IGFyZ2M7XG5jaGFyICphcmd2W107XG57XG4iICk7CisKKyAgZl9wcmludChmb3V0LCAiXHRjaGFyICpob3N0OyIpOworICBmX3ByaW50KGZvdXQsICJcblxuXHRpZihhcmdjIDwgMikgeyIpOworICBmX3ByaW50KGZvdXQsICJcblx0XHRwcmludGYoXCJ1c2FnZTogJSVzIHNlcnZlcl9ob3N0XFxuXCIsIGFyZ3ZbMF0pO1xuIiApOworICBmX3ByaW50KGZvdXQsICJcdFx0ZXhpdCgxKTtcblx0fSIpOworICBmX3ByaW50KGZvdXQsICJcblx0aG9zdCA9IGFyZ3ZbMV07XG4iKTsKKworICBmb3IgKGwgPSBkZWZpbmVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCWRlZiA9IGwtPnZhbDsKKwkJaWYgKGRlZi0+ZGVmX2tpbmQgIT0gREVGX1BST0dSQU0pIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAodnAgPSBkZWYtPmRlZi5wci52ZXJzaW9uczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dCkgeworCQkgICAgICAgIGZfcHJpbnQoIGZvdXQsICJcdCIgKTsKKwkJCXB2bmFtZShkZWYtPmRlZl9uYW1lLCB2cC0+dmVyc19udW0pOworCQkJZl9wcmludCggZm91dCwgIiggaG9zdCApO1xuIiApOworCQkgICAgICB9CisJCX0KKyAgZl9wcmludChmb3V0LCAifVxuIik7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19zY2FuLmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY19zY2FuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4ZmE5ZgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3NjYW4uYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylycGNfc2Nhbi5jIDEuMTEgODkvMDIvMjIgKEMpIDE5ODcgU01JIjsKKyNlbmRpZgorCisvKgorICogcnBjX3NjYW4uYywgU2Nhbm5lciBmb3IgdGhlIFJQQyBwcm90b2NvbCBjb21waWxlciAKKyAqIENvcHlyaWdodCAoQykgMTk4NywgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJycGNfc2Nhbi5oIgorI2luY2x1ZGUgInJwY19wYXJzZS5oIgorI2luY2x1ZGUgInJwY191dGlsLmgiCisKK3N0YXRpYyB2b2lkCXVuZ2V0X3Rva2VuKHRva2VuICp0b2twKTsKK3N0YXRpYyB2b2lkCWZpbmRzdHJjb25zdChjaGFyICoqc3RyLCBjaGFyICoqdmFsKTsKK3N0YXRpYyB2b2lkCWZpbmRjaHJjb25zdChjaGFyICoqc3RyLCBjaGFyICoqdmFsKTsKK3N0YXRpYyB2b2lkCWZpbmRjb25zdChjaGFyICoqc3RyLCBjaGFyICoqdmFsKTsKK3N0YXRpYyB2b2lkCWZpbmRraW5kKGNoYXIgKiptYXJrLCB0b2tlbiAqdG9rcCk7CitzdGF0aWMgaW50CWNwcGxpbmUoY2hhciAqbGluZSk7CitzdGF0aWMgaW50CWRpcmVjdGl2ZShjaGFyICpsaW5lKTsKK3N0YXRpYyB2b2lkCXByaW50ZGlyZWN0aXZlKGNoYXIgKmxpbmUpOworc3RhdGljIHZvaWQJZG9jcHBsaW5lKGNoYXIgKmxpbmUsIGludCAqbGluZW5vLCBjaGFyICoqZm5hbWUpOworCisjZGVmaW5lIHN0YXJ0Y29tbWVudCh3aGVyZSkgKHdoZXJlWzBdID09ICcvJyAmJiB3aGVyZVsxXSA9PSAnKicpCisjZGVmaW5lIGVuZGNvbW1lbnQod2hlcmUpICh3aGVyZVstMV0gPT0gJyonICYmIHdoZXJlWzBdID09ICcvJykKKworc3RhdGljIGludCBwdXNoZWQgPSAwOwkvKiBpcyBhIHRva2VuIHB1c2hlZCAqLworc3RhdGljIHRva2VuIGxhc3R0b2s7CS8qIGxhc3QgdG9rZW4sIGlmIHB1c2hlZCAqLworCisvKgorICogc2NhbiBleHBlY3RpbmcgMSBnaXZlbiB0b2tlbiAKKyAqLwordm9pZAorc2Nhbih0b2tfa2luZCBleHBlY3QsIHRva2VuICp0b2twKQoreworCWdldF90b2tlbih0b2twKTsKKwlpZiAodG9rcC0+a2luZCAhPSBleHBlY3QpIHsKKwkJZXhwZWN0ZWQxKGV4cGVjdCk7CisJfQorfQorCisvKgorICogc2NhbiBleHBlY3RpbmcgYW55IG9mIHRoZSAyIGdpdmVuIHRva2VucyAKKyAqLwordm9pZAorc2NhbjIodG9rX2tpbmQgZXhwZWN0MSwgdG9rX2tpbmQgZXhwZWN0MiwgdG9rZW4gKnRva3ApCit7CisJZ2V0X3Rva2VuKHRva3ApOworCWlmICh0b2twLT5raW5kICE9IGV4cGVjdDEgJiYgdG9rcC0+a2luZCAhPSBleHBlY3QyKSB7CisJCWV4cGVjdGVkMihleHBlY3QxLCBleHBlY3QyKTsKKwl9Cit9CisKKy8qCisgKiBzY2FuIGV4cGVjdGluZyBhbnkgb2YgdGhlIDMgZ2l2ZW4gdG9rZW4gCisgKi8KK3ZvaWQKK3NjYW4zKHRva19raW5kIGV4cGVjdDEsIHRva19raW5kIGV4cGVjdDIsIHRva19raW5kIGV4cGVjdDMsIHRva2VuICp0b2twKQoreworCWdldF90b2tlbih0b2twKTsKKwlpZiAodG9rcC0+a2luZCAhPSBleHBlY3QxICYmIHRva3AtPmtpbmQgIT0gZXhwZWN0MgorCSAgICAmJiB0b2twLT5raW5kICE9IGV4cGVjdDMpIHsKKwkJZXhwZWN0ZWQzKGV4cGVjdDEsIGV4cGVjdDIsIGV4cGVjdDMpOworCX0KK30KKworLyoKKyAqIHNjYW4gZXhwZWN0aW5nIGEgY29uc3RhbnQsIHBvc3NpYmx5IHN5bWJvbGljIAorICovCit2b2lkCitzY2FuX251bSh0b2tlbiAqdG9rcCkKK3sKKwlnZXRfdG9rZW4odG9rcCk7CisJc3dpdGNoICh0b2twLT5raW5kKSB7CisJY2FzZSBUT0tfSURFTlQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yKCJjb25zdGFudCBvciBpZGVudGlmaWVyIGV4cGVjdGVkIik7CisJfQorfQorCisvKgorICogUGVlayBhdCB0aGUgbmV4dCB0b2tlbiAKKyAqLwordm9pZAorcGVlayh0b2tlbiAqdG9rcCkKK3sKKwlnZXRfdG9rZW4odG9rcCk7CisJdW5nZXRfdG9rZW4odG9rcCk7Cit9CisKKy8qCisgKiBQZWVrIGF0IHRoZSBuZXh0IHRva2VuIGFuZCBzY2FuIGl0IGlmIGl0IG1hdGNoZXMgd2hhdCB5b3UgZXhwZWN0IAorICovCitpbnQKK3BlZWtzY2FuKHRva19raW5kIGV4cGVjdCwgdG9rZW4gKnRva3ApCit7CisJcGVlayh0b2twKTsKKwlpZiAodG9rcC0+a2luZCA9PSBleHBlY3QpIHsKKwkJZ2V0X3Rva2VuKHRva3ApOworCQlyZXR1cm4gKDEpOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgorICogR2V0IHRoZSBuZXh0IHRva2VuLCBwcmludGluZyBvdXQgYW55IGRpcmVjdGl2ZSB0aGF0IGFyZSBlbmNvdW50ZXJlZC4gCisgKi8KK3ZvaWQKK2dldF90b2tlbih0b2tlbiAqdG9rcCkKK3sKKwlpbnQgY29tbWVudGluZzsKKworCWlmIChwdXNoZWQpIHsKKwkJcHVzaGVkID0gMDsKKwkJKnRva3AgPSBsYXN0dG9rOworCQlyZXR1cm47CisJfQorCWNvbW1lbnRpbmcgPSAwOworCWZvciAoOzspIHsKKwkJaWYgKCp3aGVyZSA9PSAwKSB7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCFmZ2V0cyhjdXJsaW5lLCBNQVhMSU5FU0laRSwgZmluKSkgeworCQkJCQl0b2twLT5raW5kID0gVE9LX0VPRjsKKwkJCQkJKndoZXJlID0gMDsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlsaW5lbnVtKys7CisJCQkJaWYgKGNvbW1lbnRpbmcpIHsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChjcHBsaW5lKGN1cmxpbmUpKSB7CisJCQkJCWRvY3BwbGluZShjdXJsaW5lLCAmbGluZW51bSwgCisJCQkJCQkgICZpbmZpbGVuYW1lKTsKKwkJCQl9IGVsc2UgaWYgKGRpcmVjdGl2ZShjdXJsaW5lKSkgeworCQkJCQlwcmludGRpcmVjdGl2ZShjdXJsaW5lKTsKKwkJCQl9IGVsc2UgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl3aGVyZSA9IGN1cmxpbmU7CisJCX0gZWxzZSBpZiAoaXNzcGFjZSgqd2hlcmUpKSB7CisJCQl3aGlsZSAoaXNzcGFjZSgqd2hlcmUpKSB7CisJCQkJd2hlcmUrKzsJLyogZWF0ICovCisJCQl9CisJCX0gZWxzZSBpZiAoY29tbWVudGluZykgeworCQkJZm9yICh3aGVyZSsrOyAqd2hlcmU7IHdoZXJlKyspIHsKKwkJCQlpZiAoZW5kY29tbWVudCh3aGVyZSkpIHsKKwkJCQkJd2hlcmUrKzsKKwkJCQkJY29tbWVudGluZy0tOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc3RhcnRjb21tZW50KHdoZXJlKSkgeworCQkJd2hlcmUgKz0gMjsKKwkJCWNvbW1lbnRpbmcrKzsKKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiAnd2hlcmUnIGlzIG5vdCB3aGl0ZXNwYWNlLCBjb21tZW50IG9yIGRpcmVjdGl2ZSBNdXN0IGJlIGEgdG9rZW4hIAorCSAqLworCXN3aXRjaCAoKndoZXJlKSB7CisJY2FzZSAnOic6CisJCXRva3AtPmtpbmQgPSBUT0tfQ09MT047CisJCXdoZXJlKys7CisJCWJyZWFrOworCWNhc2UgJzsnOgorCQl0b2twLT5raW5kID0gVE9LX1NFTUlDT0xPTjsKKwkJd2hlcmUrKzsKKwkJYnJlYWs7CisJY2FzZSAnLCc6CisJCXRva3AtPmtpbmQgPSBUT0tfQ09NTUE7CisJCXdoZXJlKys7CisJCWJyZWFrOworCWNhc2UgJz0nOgorCQl0b2twLT5raW5kID0gVE9LX0VRVUFMOworCQl3aGVyZSsrOworCQlicmVhazsKKwljYXNlICcqJzoKKwkJdG9rcC0+a2luZCA9IFRPS19TVEFSOworCQl3aGVyZSsrOworCQlicmVhazsKKwljYXNlICdbJzoKKwkJdG9rcC0+a2luZCA9IFRPS19MQlJBQ0tFVDsKKwkJd2hlcmUrKzsKKwkJYnJlYWs7CisJY2FzZSAnXSc6CisJCXRva3AtPmtpbmQgPSBUT0tfUkJSQUNLRVQ7CisJCXdoZXJlKys7CisJCWJyZWFrOworCWNhc2UgJ3snOgorCQl0b2twLT5raW5kID0gVE9LX0xCUkFDRTsKKwkJd2hlcmUrKzsKKwkJYnJlYWs7CisJY2FzZSAnfSc6CisJCXRva3AtPmtpbmQgPSBUT0tfUkJSQUNFOworCQl3aGVyZSsrOworCQlicmVhazsKKwljYXNlICcoJzoKKwkJdG9rcC0+a2luZCA9IFRPS19MUEFSRU47CisJCXdoZXJlKys7CisJCWJyZWFrOworCWNhc2UgJyknOgorCQl0b2twLT5raW5kID0gVE9LX1JQQVJFTjsKKwkJd2hlcmUrKzsKKwkJYnJlYWs7CisJY2FzZSAnPCc6CisJCXRva3AtPmtpbmQgPSBUT0tfTEFOR0xFOworCQl3aGVyZSsrOworCQlicmVhazsKKwljYXNlICc+JzoKKwkJdG9rcC0+a2luZCA9IFRPS19SQU5HTEU7CisJCXdoZXJlKys7CisJCWJyZWFrOworCisJY2FzZSAnIic6CisJCXRva3AtPmtpbmQgPSBUT0tfU1RSQ09OU1Q7CisJCWZpbmRzdHJjb25zdCgmd2hlcmUsICZ0b2twLT5zdHIpOworCQlicmVhazsKKwljYXNlICdcJyc6CisJCXRva3AtPmtpbmQgPSBUT0tfQ0hBUkNPTlNUOworCQlmaW5kY2hyY29uc3QoJndoZXJlLCAmdG9rcC0+c3RyKTsKKwkJYnJlYWs7CisKKwljYXNlICctJzoKKwljYXNlICcwJzoKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwljYXNlICc3JzoKKwljYXNlICc4JzoKKwljYXNlICc5JzoKKwkJdG9rcC0+a2luZCA9IFRPS19JREVOVDsKKwkJZmluZGNvbnN0KCZ3aGVyZSwgJnRva3AtPnN0cik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKCEoaXNhbHBoYSgqd2hlcmUpIHx8ICp3aGVyZSA9PSAnXycpKSB7CisJCQljaGFyIGJ1ZlsxMDBdOworCQkJY2hhciAqcDsKKworCQkJc19wcmludChidWYsICJpbGxlZ2FsIGNoYXJhY3RlciBpbiBmaWxlOiAiKTsKKwkJCXAgPSBidWYgKyBzdHJsZW4oYnVmKTsKKwkJCWlmIChpc3ByaW50KCp3aGVyZSkpIHsKKwkJCQlzX3ByaW50KHAsICIlYyIsICp3aGVyZSk7CisJCQl9IGVsc2UgeworCQkJCXNfcHJpbnQocCwgIiVkIiwgKndoZXJlKTsKKwkJCX0KKwkJCWVycm9yKGJ1Zik7CisJCX0KKwkJZmluZGtpbmQoJndoZXJlLCB0b2twKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAordW5nZXRfdG9rZW4odG9rZW4gKnRva3ApCit7CisJbGFzdHRvayA9ICp0b2twOworCXB1c2hlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kc3RyY29uc3QoY2hhciAqKnN0ciwgY2hhciAqKnZhbCkKK3sKKwljaGFyICpwOworCWludCBzaXplOworCisJcCA9ICpzdHI7CisJZG8geworCQkqcCsrOworCX0gd2hpbGUgKCpwICYmICpwICE9ICciJyk7CisJaWYgKCpwID09IDApIHsKKwkJZXJyb3IoInVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnQiKTsKKwl9CisJcCsrOworCXNpemUgPSBwIC0gKnN0cjsKKwkqdmFsID0gYWxsb2Moc2l6ZSArIDEpOworCSh2b2lkKSBzdHJuY3B5KCp2YWwsICpzdHIsIHNpemUpOworCSgqdmFsKVtzaXplXSA9IDA7CisJKnN0ciA9IHA7Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kY2hyY29uc3QoY2hhciAqKnN0ciwgY2hhciAqKnZhbCkKK3sKKwljaGFyICpwOworCWludCBzaXplOworCisJcCA9ICpzdHI7CisJZG8geworCQkqcCsrOworCX0gd2hpbGUgKCpwICYmICpwICE9ICdcJycpOworCWlmICgqcCA9PSAwKSB7CisJCWVycm9yKCJ1bnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50Iik7CisJfQorCXArKzsKKwlzaXplID0gcCAtICpzdHI7CisJaWYgKHNpemUgIT0gMykgeworCQllcnJvcigiZW1wdHkgY2hhciBzdHJpbmciKTsKKwl9CisJKnZhbCA9IGFsbG9jKHNpemUgKyAxKTsKKwkodm9pZCkgc3RybmNweSgqdmFsLCAqc3RyLCBzaXplKTsKKwkoKnZhbClbc2l6ZV0gPSAwOworCSpzdHIgPSBwOworfQorCitzdGF0aWMgdm9pZAorZmluZGNvbnN0KGNoYXIgKipzdHIsIGNoYXIgKip2YWwpCit7CisJY2hhciAqcDsKKwlpbnQgc2l6ZTsKKworCXAgPSAqc3RyOworCWlmICgqcCA9PSAnMCcgJiYgKihwICsgMSkgPT0gJ3gnKSB7CisJCXArKzsKKwkJZG8geworCQkJcCsrOworCQl9IHdoaWxlIChpc3hkaWdpdCgqcCkpOworCX0gZWxzZSB7CisJCWRvIHsKKwkJCXArKzsKKwkJfSB3aGlsZSAoaXNkaWdpdCgqcCkpOworCX0KKwlzaXplID0gcCAtICpzdHI7CisJKnZhbCA9IGFsbG9jKHNpemUgKyAxKTsKKwkodm9pZCkgc3RybmNweSgqdmFsLCAqc3RyLCBzaXplKTsKKwkoKnZhbClbc2l6ZV0gPSAwOworCSpzdHIgPSBwOworfQorCitzdGF0aWMgdG9rZW4gc3ltYm9sc1tdID0geworCQkJICB7VE9LX0NPTlNULCAiY29uc3QifSwKKwkJCSAge1RPS19VTklPTiwgInVuaW9uIn0sCisJCQkgIHtUT0tfU1dJVENILCAic3dpdGNoIn0sCisJCQkgIHtUT0tfQ0FTRSwgImNhc2UifSwKKwkJCSAge1RPS19ERUZBVUxULCAiZGVmYXVsdCJ9LAorCQkJICB7VE9LX1NUUlVDVCwgInN0cnVjdCJ9LAorCQkJICB7VE9LX1RZUEVERUYsICJ0eXBlZGVmIn0sCisJCQkgIHtUT0tfRU5VTSwgImVudW0ifSwKKwkJCSAge1RPS19PUEFRVUUsICJvcGFxdWUifSwKKwkJCSAge1RPS19CT09MLCAiYm9vbCJ9LAorCQkJICB7VE9LX1ZPSUQsICJ2b2lkIn0sCisJCQkgIHtUT0tfQ0hBUiwgImNoYXIifSwKKwkJCSAge1RPS19JTlQsICJpbnQifSwKKwkJCSAge1RPS19VTlNJR05FRCwgInVuc2lnbmVkIn0sCisJCQkgIHtUT0tfU0hPUlQsICJzaG9ydCJ9LAorCQkJICB7VE9LX0lOVDMyLCAiaW50MzIifSwKKwkJCSAge1RPS19GTE9BVCwgImZsb2F0In0sCisJCQkgIHtUT0tfRE9VQkxFLCAiZG91YmxlIn0sCisJCQkgIHtUT0tfU1RSSU5HLCAic3RyaW5nIn0sCisJCQkgIHtUT0tfUFJPR1JBTSwgInByb2dyYW0ifSwKKwkJCSAge1RPS19WRVJTSU9OLCAidmVyc2lvbiJ9LAorCQkJICB7VE9LX0VPRiwgIj8/Pz8/PyJ9LAorfTsKKworc3RhdGljIHZvaWQKK2ZpbmRraW5kKGNoYXIgKiptYXJrLCB0b2tlbiAqdG9rcCkKK3sKKwlpbnQgbGVuOworCXRva2VuICpzOworCWNoYXIgKnN0cjsKKworCXN0ciA9ICptYXJrOworCWZvciAocyA9IHN5bWJvbHM7IHMtPmtpbmQgIT0gVE9LX0VPRjsgcysrKSB7CisJCWxlbiA9IHN0cmxlbihzLT5zdHIpOworCQlpZiAoc3RybmNtcChzdHIsIHMtPnN0ciwgbGVuKSA9PSAwKSB7CisJCQlpZiAoIWlzYWxudW0oc3RyW2xlbl0pICYmIHN0cltsZW5dICE9ICdfJykgeworCQkJCXRva3AtPmtpbmQgPSBzLT5raW5kOworCQkJCXRva3AtPnN0ciA9IHMtPnN0cjsKKwkJCQkqbWFyayA9IHN0ciArIGxlbjsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJdG9rcC0+a2luZCA9IFRPS19JREVOVDsKKwlmb3IgKGxlbiA9IDA7IGlzYWxudW0oc3RyW2xlbl0pIHx8IHN0cltsZW5dID09ICdfJzsgbGVuKyspOworCXRva3AtPnN0ciA9IGFsbG9jKGxlbiArIDEpOworCSh2b2lkKSBzdHJuY3B5KHRva3AtPnN0ciwgc3RyLCBsZW4pOworCXRva3AtPnN0cltsZW5dID0gMDsKKwkqbWFyayA9IHN0ciArIGxlbjsKK30KKworc3RhdGljIGludAorY3BwbGluZShjaGFyICpsaW5lKQoreworCXJldHVybiAobGluZSA9PSBjdXJsaW5lICYmICpsaW5lID09ICcjJyk7Cit9CisKK3N0YXRpYyBpbnQKK2RpcmVjdGl2ZShjaGFyICpsaW5lKQoreworCXJldHVybiAobGluZSA9PSBjdXJsaW5lICYmICpsaW5lID09ICclJyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludGRpcmVjdGl2ZShjaGFyICpsaW5lKQoreworCWZfcHJpbnQoZm91dCwgIiVzIiwgbGluZSArIDEpOworfQorCitzdGF0aWMgdm9pZAorZG9jcHBsaW5lKGNoYXIgKmxpbmUsIGludCAqbGluZW5vLCBjaGFyICoqZm5hbWUpCit7CisJY2hhciAqZmlsZTsKKwlpbnQgbnVtOworCWNoYXIgKnA7CisKKwlsaW5lKys7CisJd2hpbGUgKGlzc3BhY2UoKmxpbmUpKSB7CisJCWxpbmUrKzsKKwl9CisJbnVtID0gYXRvaShsaW5lKTsKKwl3aGlsZSAoaXNkaWdpdCgqbGluZSkpIHsKKwkJbGluZSsrOworCX0KKwl3aGlsZSAoaXNzcGFjZSgqbGluZSkpIHsKKwkJbGluZSsrOworCX0KKwlpZiAoKmxpbmUgIT0gJyInKSB7CisJCWVycm9yKCJwcmVwcm9jZXNzb3IgZXJyb3IiKTsKKwl9CisJbGluZSsrOworCXAgPSBmaWxlID0gYWxsb2Moc3RybGVuKGxpbmUpICsgMSk7CisJd2hpbGUgKCpsaW5lICYmICpsaW5lICE9ICciJykgeworCQkqcCsrID0gKmxpbmUrKzsKKwl9CisJaWYgKCpsaW5lID09IDApIHsKKwkJZXJyb3IoInByZXByb2Nlc3NvciBlcnJvciIpOworCX0KKwkqcCA9IDA7CisJaWYgKCpmaWxlID09IDApIHsKKwkJKmZuYW1lID0gTlVMTDsKKwkJZnJlZShmaWxlKTsKKwl9IGVsc2UgeworCQkqZm5hbWUgPSBmaWxlOworCX0KKwkqbGluZW5vID0gbnVtIC0gMTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3NjYW4uaCBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3NjYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmY2ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfc2Nhbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAgICAgIEAoIylycGNfc2Nhbi5oICAxLjMgIDkwLzA4LzI5ICAoQykgMTk4NyBTTUkgICAqLworCisvKgorICogcnBjX3NjYW4uaCwgRGVmaW5pdGlvbnMgZm9yIHRoZSBSUENMIHNjYW5uZXIgCisgKi8KKworLyoKKyAqIGtpbmRzIG9mIHRva2VucyAKKyAqLworZW51bSB0b2tfa2luZCB7CisJVE9LX0lERU5ULAorCVRPS19DSEFSQ09OU1QsCisJVE9LX1NUUkNPTlNULAorCVRPS19MUEFSRU4sCisJVE9LX1JQQVJFTiwKKwlUT0tfTEJSQUNFLAorCVRPS19SQlJBQ0UsCisJVE9LX0xCUkFDS0VULAorCVRPS19SQlJBQ0tFVCwKKwlUT0tfTEFOR0xFLAorCVRPS19SQU5HTEUsCisJVE9LX1NUQVIsCisJVE9LX0NPTU1BLAorCVRPS19FUVVBTCwKKwlUT0tfQ09MT04sCisJVE9LX1NFTUlDT0xPTiwKKwlUT0tfQ09OU1QsCisJVE9LX1NUUlVDVCwKKwlUT0tfVU5JT04sCisJVE9LX1NXSVRDSCwKKwlUT0tfQ0FTRSwKKwlUT0tfREVGQVVMVCwKKwlUT0tfRU5VTSwKKwlUT0tfVFlQRURFRiwKKwlUT0tfSU5ULAorCVRPS19TSE9SVCwKKwlUT0tfSU5UMzIsCisJVE9LX1VOU0lHTkVELAorCVRPS19GTE9BVCwKKwlUT0tfRE9VQkxFLAorCVRPS19PUEFRVUUsCisJVE9LX0NIQVIsCisJVE9LX1NUUklORywKKwlUT0tfQk9PTCwKKwlUT0tfVk9JRCwKKwlUT0tfUFJPR1JBTSwKKwlUT0tfVkVSU0lPTiwKKwlUT0tfRU9GCit9OwordHlwZWRlZiBlbnVtIHRva19raW5kIHRva19raW5kOworCisvKgorICogYSB0b2tlbiAKKyAqLworc3RydWN0IHRva2VuIHsKKwl0b2tfa2luZCBraW5kOworCWNoYXIgKnN0cjsKK307Cit0eXBlZGVmIHN0cnVjdCB0b2tlbiB0b2tlbjsKKworCisvKgorICogcm91dGluZSBpbnRlcmZhY2UgCisgKi8KK3ZvaWQgICAgICAgICAgICBzY2FuKCk7Cit2b2lkICAgICAgICAgICAgc2NhbjIoKTsKK3ZvaWQgICAgICAgICAgICBzY2FuMygpOwordm9pZCAgICAgICAgICAgIHNjYW5fbnVtKCk7Cit2b2lkICAgICAgICAgICAgcGVlaygpOworaW50ICAgICAgICAgICAgIHBlZWtzY2FuKCk7Cit2b2lkICAgICAgICAgICAgZ2V0X3Rva2VuKCk7Cit2b2lkICAgICAgICAgICAgZXhwZWN0ZWQxKHRva19raW5kKTsKK3ZvaWQgICAgICAgICAgICBleHBlY3RlZDIodG9rX2tpbmQsIHRva19raW5kKTsKK3ZvaWQgICAgICAgICAgICBleHBlY3RlZDModG9rX2tpbmQsIHRva19raW5kLCB0b2tfa2luZCk7CisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3N2Y291dC5jIGIvbmZzLXV0aWxzLTEuMi4yL3Rvb2xzL3JwY2dlbi9ycGNfc3Zjb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0YTUyOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3N2Y291dC5jCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWYgMAorIHN0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylycGNfc3Zjb3V0LmMgMS4yOSA4OS8wMy8zMCAoQykgMTk4NyBTTUkiOworI2VuZGlmCisKKy8qCisgKiBycGNfc3Zjb3V0LmMsIFNlcnZlci1za2VsZXRvbiBvdXRwdXR0ZXIgZm9yIHRoZSBSUEMgcHJvdG9jb2wgY29tcGlsZXIKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicnBjX3BhcnNlLmgiCisjaW5jbHVkZSAicnBjX3V0aWwuaCIKKyNpbmNsdWRlICJycGNfb3V0cHV0LmgiCisKK3N0YXRpYyB2b2lkCXdyaXRlX3JlYWxfcHJvZ3JhbShkZWZpbml0aW9uICpkZWYpOworc3RhdGljIHZvaWQJd3JpdGVfcHJvZ3JhbShkZWZpbml0aW9uICpkZWYsIGNoYXIgKnN0b3JhZ2UpOworc3RhdGljIHZvaWQJcHJpbnRlcnIoY2hhciAqZXJyLCBjaGFyICp0cmFuc3ApOworc3RhdGljIHZvaWQJcHJpbnRpZihjaGFyICpwcm9jLCBjaGFyICp0cmFuc3AsIGNoYXIgKnByZWZpeCwgY2hhciAqYXJnKTsKK3N0YXRpYyB2b2lkCXdyaXRlX2luZXRtb3N0KGNoYXIgKmluZmlsZSk7CitzdGF0aWMgdm9pZAlwcmludF9yZXR1cm4oY2hhciAqc3BhY2UpOworc3RhdGljIHZvaWQJcHJpbnRfcG1hcHVuc2V0KGNoYXIgKnNwYWNlKTsKK3N0YXRpYyB2b2lkCXByaW50X2Vycl9tZXNzYWdlKGNoYXIgKnNwYWNlKTsKK3N0YXRpYyB2b2lkCXdyaXRlX3RpbWVvdXRfZnVuYyh2b2lkKTsKK3N0YXRpYyB2b2lkCXdyaXRlX3BtX21vc3QoY2hhciAqaW5maWxlLCBpbnQgbmV0ZmxhZyk7CitzdGF0aWMgdm9pZAl3cml0ZV9ycGNfc3ZjX2ZnKGNoYXIgKmluZmlsZSwgY2hhciAqc3ApOworc3RhdGljIHZvaWQJb3Blbl9sb2dfZmlsZShjaGFyICppbmZpbGUsIGNoYXIgKnNwKTsKKworc3RhdGljIGNoYXIgUlFTVFBbXSA9ICJycXN0cCI7CitzdGF0aWMgY2hhciBUUkFOU1BbXSA9ICJ0cmFuc3AiOworc3RhdGljIGNoYXIgQVJHW10gPSAiYXJndW1lbnQiOworc3RhdGljIGNoYXIgUkVTVUxUW10gPSAicmVzdWx0IjsKK3N0YXRpYyBjaGFyIFJPVVRJTkVbXSA9ICJsb2NhbCI7CisKK2NoYXIgX2VycmJ1ZlsyNTZdOwkvKiBGb3IgYWxsIG1lc3NhZ2VzICovCisKK3N0YXRpYyB2b2lkCitwX3hkcmZ1bmMoY2hhciAqcm5hbWUsIGNoYXIgKnR5cGVuYW1lKQoreworCWlmIChDZmxhZykKKwkJZl9wcmludChmb3V0LCAiXHRcdHhkcl8lcyA9ICh4ZHJwcm9jX3QpIHhkcl8lcztcbiIsIHJuYW1lLAorCQkJc3RyaW5nZml4KHR5cGVuYW1lKSk7CisJZWxzZQorCQlmX3ByaW50KGZvdXQsICJcdFx0eGRyXyVzID0geGRyXyVzO1xuIiwgcm5hbWUsIHN0cmluZ2ZpeCh0eXBlbmFtZSkpOworfQorCit2b2lkCitpbnRlcm5hbF9wcm9jdHlwZShwcm9jX2xpc3QgKnBsaXN0KQoreworCWZfcHJpbnQoZm91dCwgInN0YXRpYyAiKTsKKwlwdHlwZSggcGxpc3QtPnJlc19wcmVmaXgsIHBsaXN0LT5yZXNfdHlwZSwgMSApOworCWZfcHJpbnQoIGZvdXQsICIqIiApOworfQorCisKKy8qCisgKiB3cml0ZSBtb3N0IG9mIHRoZSBzZXJ2aWNlLCB0aGF0IGlzLCBldmVyeXRoaW5nIGJ1dCB0aGUgcmVnaXN0cmF0aW9ucy4gCisgKi8KK3ZvaWQKK3dyaXRlX21vc3QoY2hhciAqaW5maWxlLCBpbnQgbmV0ZmxhZywgaW50IG5vbWFpbikKK3sKKwlpZiAoaW5ldGRmbGFnIHx8IHBtZmxhZykgeworCSAgICAgICAgY2hhciogdmFyX3R5cGU7CisJCXZhcl90eXBlID0gKG5vbWFpbj8gImV4dGVybiIgOiAic3RhdGljIik7CisJCWZfcHJpbnQoZm91dCwgIiVzIGludCBfcnBjcG1zdGFydDsiLCB2YXJfdHlwZSApOworCQlmX3ByaW50KGZvdXQsICJcdFx0LyogU3RhcnRlZCBieSBhIHBvcnQgbW9uaXRvciA/ICovXG4iKTsgCisJCWZfcHJpbnQoZm91dCwgIiVzIGludCBfcnBjZmR0eXBlOyIsIHZhcl90eXBlICk7CisJCWZfcHJpbnQoZm91dCwgIlx0XHQvKiBXaGV0aGVyIFN0cmVhbSBvciBEYXRhZ3JhbSA/ICovXG4iKTsKKwkJaWYgKHRpbWVyZmxhZykgeworCQkJZl9wcmludChmb3V0LCAiJXMgaW50IF9ycGNzdmNkaXJ0eTsiLCB2YXJfdHlwZSApOworCQkJZl9wcmludChmb3V0LCAiXHQvKiBTdGlsbCBzZXJ2aW5nID8gKi9cbiIpOworCQl9CisJCXdyaXRlX3N2Y19hdXgoIG5vbWFpbiApOworCX0KKwkvKiB3cml0ZSBvdXQgZGlzcGF0Y2hlciBhbmQgc3R1YnMgKi8KKwl3cml0ZV9wcm9ncmFtcyggbm9tYWluPyAoY2hhciAqKU5VTEwgOiAic3RhdGljIiApOworCisgICAgICAgIGlmKCBub21haW4gKSAKKwkgIHJldHVybjsKKworCWZfcHJpbnQoZm91dCwgIlxubWFpbigpXG4iKTsKKwlmX3ByaW50KGZvdXQsICJ7XG4iKTsKKwlpZiAoaW5ldGRmbGFnKSB7CisJCXdyaXRlX2luZXRtb3N0KGluZmlsZSk7IC8qIEluY2x1ZGVzIGNhbGwgdG8gd3JpdGVfcnBjX3N2Y19mZygpICovCisJfSBlbHNlIHsKKwkgIGlmKCB0aXJwY2ZsYWcgKSB7CisJCWlmIChuZXRmbGFnKSB7CisJCQlmX3ByaW50KGZvdXQsICJcdHJlZ2lzdGVyIFNWQ1hQUlQgKiVzO1xuIiwgVFJBTlNQKTsKKwkJCWZfcHJpbnQoZm91dCwgIlx0c3RydWN0IG5ldGNvbmZpZyAqbmNvbmYgPSBOVUxMO1xuIik7CisJCX0KKwkJZl9wcmludChmb3V0LCAiXHRwaWRfdCBwaWQ7XG4iKTsKKwkJZl9wcmludChmb3V0LCAiXHRpbnQgaTtcbiIpOworCQlmX3ByaW50KGZvdXQsICJcdGNoYXIgbW5hbWVbRk1OQU1FU1ogKyAxXTtcblxuIik7CisJCXdyaXRlX3BtX21vc3QoaW5maWxlLCBuZXRmbGFnKTsKKwkJZl9wcmludChmb3V0LCAiXHRlbHNlIHtcbiIpOworCQl3cml0ZV9ycGNfc3ZjX2ZnKGluZmlsZSwgIlx0XHQiKTsKKwkJZl9wcmludChmb3V0LCAiXHR9XG4iKTsKKwkgICAgICB9IGVsc2UgeworCQlmX3ByaW50KGZvdXQsICJcdHJlZ2lzdGVyIFNWQ1hQUlQgKiVzO1xuIiwgVFJBTlNQKTsKKwkJZl9wcmludChmb3V0LCAiXG4iKTsKKwkJcHJpbnRfcG1hcHVuc2V0KCJcdCIpOworCSAgICAgIH0KKwl9CisKKwlpZiAobG9nZmxhZyAmJiAhaW5ldGRmbGFnKSB7CisJCW9wZW5fbG9nX2ZpbGUoaW5maWxlLCAiXHQiKTsKKwl9Cit9CisKKy8qCisgKiB3cml0ZSBhIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGdpdmVuIHRyYW5zcG9ydCAKKyAqLwordm9pZAord3JpdGVfbmV0aWRfcmVnaXN0ZXIoY2hhciAqdHJhbnNwKQoreworCWxpc3QgKmw7CisJZGVmaW5pdGlvbiAqZGVmOworCXZlcnNpb25fbGlzdCAqdnA7CisJY2hhciAqc3A7CisJY2hhciB0bXBidWZbMzJdOworCisJc3AgPSAiIjsKKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWZfcHJpbnQoZm91dCwgIiVzXHRuY29uZiA9IGdldG5ldGNvbmZpZ2VudChcIiVzXCIpO1xuIiwgc3AsIHRyYW5zcCk7CisJZl9wcmludChmb3V0LCAiJXNcdGlmIChuY29uZiA9PSBOVUxMKSB7XG4iLCBzcCk7CisJKHZvaWQpIHNwcmludGYoX2VycmJ1ZiwgImNhbm5vdCBmaW5kICVzIG5ldGlkLiIsIHRyYW5zcCk7CisJc3ByaW50Zih0bXBidWYsICIlc1x0XHQiLCBzcCk7CisJcHJpbnRfZXJyX21lc3NhZ2UodG1wYnVmKTsKKwlmX3ByaW50KGZvdXQsICIlc1x0XHRleGl0KDEpO1xuIiwgc3ApOworCWZfcHJpbnQoZm91dCwgIiVzXHR9XG4iLCBzcCk7CisJZl9wcmludChmb3V0LCAiJXNcdCVzID0gc3ZjX3RsaV9jcmVhdGUoUlBDX0FOWUZELCBuY29uZiwgMCwgMCwgMCk7XG4iLAorCQkJc3AsIFRSQU5TUCk7CisJZl9wcmludChmb3V0LCAiJXNcdGlmICglcyA9PSBOVUxMKSB7XG4iLCBzcCwgVFJBTlNQKTsKKwkodm9pZCkgc3ByaW50ZihfZXJyYnVmLCAiY2Fubm90IGNyZWF0ZSAlcyBzZXJ2aWNlLiIsIHRyYW5zcCk7CisJcHJpbnRfZXJyX21lc3NhZ2UodG1wYnVmKTsKKwlmX3ByaW50KGZvdXQsICIlc1x0XHRleGl0KDEpO1xuIiwgc3ApOworCWZfcHJpbnQoZm91dCwgIiVzXHR9XG4iLCBzcCk7CisKKwlmb3IgKGwgPSBkZWZpbmVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCWRlZiA9IChkZWZpbml0aW9uICopIGwtPnZhbDsKKwkJaWYgKGRlZi0+ZGVmX2tpbmQgIT0gREVGX1BST0dSQU0pIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAodnAgPSBkZWYtPmRlZi5wci52ZXJzaW9uczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LAorCQkJCSIlc1x0KHZvaWQpIHJwY2JfdW5zZXQoJXMsICVzLCBuY29uZik7XG4iLAorCQkJCXNwLCBkZWYtPmRlZl9uYW1lLCB2cC0+dmVyc19uYW1lKTsKKwkJCWZfcHJpbnQoZm91dCwKKwkJCQkiJXNcdGlmICghc3ZjX3JlZyglcywgJXMsICVzLCAiLAorCQkJCXNwLCBUUkFOU1AsIGRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX25hbWUpOworCQkJcHZuYW1lKGRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX251bSk7CisJCQlmX3ByaW50KGZvdXQsICIsIG5jb25mKSkge1xuIik7CisJCQkodm9pZCkgc3ByaW50ZihfZXJyYnVmLCAidW5hYmxlIHRvIHJlZ2lzdGVyICglcywgJXMsICVzKS4iLAorCQkJCQlkZWYtPmRlZl9uYW1lLCB2cC0+dmVyc19uYW1lLCB0cmFuc3ApOworCQkJcHJpbnRfZXJyX21lc3NhZ2UodG1wYnVmKTsKKwkJCWZfcHJpbnQoZm91dCwgIiVzXHRcdGV4aXQoMSk7XG4iLCBzcCk7CisJCQlmX3ByaW50KGZvdXQsICIlc1x0fVxuIiwgc3ApOworCQl9CisJfQorCWZfcHJpbnQoZm91dCwgIiVzXHRmcmVlbmV0Y29uZmlnZW50KG5jb25mKTtcbiIsIHNwKTsKK30KKworLyoKKyAqIHdyaXRlIGEgcmVnaXN0cmF0aW9uIGZvciB0aGUgZ2l2ZW4gdHJhbnNwb3J0IGZvciBUTEkKKyAqLwordm9pZAord3JpdGVfbmV0dHlwZV9yZWdpc3RlcihjaGFyICp0cmFuc3ApCit7CisJbGlzdCAqbDsKKwlkZWZpbml0aW9uICpkZWY7CisJdmVyc2lvbl9saXN0ICp2cDsKKworCWZvciAobCA9IGRlZmluZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJZGVmID0gKGRlZmluaXRpb24gKikgbC0+dmFsOworCQlpZiAoZGVmLT5kZWZfa2luZCAhPSBERUZfUFJPR1JBTSkgeworCQkJY29udGludWU7CisJCX0KKwkJZm9yICh2cCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2cCAhPSBOVUxMOyB2cCA9IHZwLT5uZXh0KSB7CisJCQlmX3ByaW50KGZvdXQsICJcdGlmICghc3ZjX2NyZWF0ZSgiKTsKKwkJCXB2bmFtZShkZWYtPmRlZl9uYW1lLCB2cC0+dmVyc19udW0pOworCQkJZl9wcmludChmb3V0LCAiLCAlcywgJXMsIFwiJXNcIikpIHtcbiAiLAorCQkJCWRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX25hbWUsIHRyYW5zcCk7CisJCQkodm9pZCkgc3ByaW50ZihfZXJyYnVmLAorCQkJCSJ1bmFibGUgdG8gY3JlYXRlICglcywgJXMpIGZvciAlcy4iLAorCQkJCQlkZWYtPmRlZl9uYW1lLCB2cC0+dmVyc19uYW1lLCB0cmFuc3ApOworCQkJcHJpbnRfZXJyX21lc3NhZ2UoIlx0XHQiKTsKKwkJCWZfcHJpbnQoZm91dCwgIlx0XHRleGl0KDEpO1xuIik7CisJCQlmX3ByaW50KGZvdXQsICJcdH1cbiIpOworCQl9CisJfQorfQorCisvKgorICogd3JpdGUgdGhlIHJlc3Qgb2YgdGhlIHNlcnZpY2UgCisgKi8KK3ZvaWQKK3dyaXRlX3Jlc3Qodm9pZCkKK3sKKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWlmIChpbmV0ZGZsYWcpIHsKKwkJZl9wcmludChmb3V0LCAiXHRpZiAoJXMgPT0gKFNWQ1hQUlQgKilOVUxMKSB7XG4iLCBUUkFOU1ApOworCQkodm9pZCkgc3ByaW50ZihfZXJyYnVmLCAiY291bGQgbm90IGNyZWF0ZSBhIGhhbmRsZSIpOworCQlwcmludF9lcnJfbWVzc2FnZSgiXHRcdCIpOworCQlmX3ByaW50KGZvdXQsICJcdFx0ZXhpdCgxKTtcbiIpOworCQlmX3ByaW50KGZvdXQsICJcdH1cbiIpOworCQlpZiAodGltZXJmbGFnKSB7CisJCQlmX3ByaW50KGZvdXQsICJcdGlmIChfcnBjcG1zdGFydCkge1xuIik7CisJCQlmX3ByaW50KGZvdXQsIAorCQkJCSJcdFx0KHZvaWQpIHNpZ25hbChTSUdBTFJNLCAlcyBjbG9zZWRvd24pO1xuIiwKKwkJCQlDZmxhZz8gIihTSUdfUEYpIiA6ICIodm9pZCgqKSgpKSIgKTsKKwkJCWZfcHJpbnQoZm91dCwgIlx0XHQodm9pZCkgYWxhcm0oX1JQQ1NWQ19DTE9TRURPV04pO1xuIik7CisJCQlmX3ByaW50KGZvdXQsICJcdH1cbiIpOworCQl9CisJfQorCWZfcHJpbnQoZm91dCwgIlx0c3ZjX3J1bigpO1xuIik7CisJKHZvaWQpIHNwcmludGYoX2VycmJ1ZiwgInN2Y19ydW4gcmV0dXJuZWQiKTsKKwlwcmludF9lcnJfbWVzc2FnZSgiXHQiKTsKKwlmX3ByaW50KGZvdXQsICJcdGV4aXQoMSk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdC8qIE5PVFJFQUNIRUQgKi9cbiIpOworCWZfcHJpbnQoZm91dCwgIn1cbiIpOworfQorCit2b2lkCit3cml0ZV9wcm9ncmFtcyhjaGFyICpzdG9yYWdlKQoreworCWxpc3QgKmw7CisJZGVmaW5pdGlvbiAqZGVmOworCisJLyogd3JpdGUgb3V0IHN0dWJzIGZvciBwcm9jZWR1cmUgIGRlZmluaXRpb25zICovCisJZm9yIChsID0gZGVmaW5lZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgeworCQlkZWYgPSAoZGVmaW5pdGlvbiAqKSBsLT52YWw7CisJCWlmIChkZWYtPmRlZl9raW5kID09IERFRl9QUk9HUkFNKSB7CisJCQl3cml0ZV9yZWFsX3Byb2dyYW0oZGVmKTsKKwkJfQorCX0KKworCS8qIHdyaXRlIG91dCBkaXNwYXRjaGVyIGZvciBlYWNoIHByb2dyYW0gKi8KKwlmb3IgKGwgPSBkZWZpbmVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCWRlZiA9IChkZWZpbml0aW9uICopIGwtPnZhbDsKKwkJaWYgKGRlZi0+ZGVmX2tpbmQgPT0gREVGX1BST0dSQU0pIHsKKwkJCXdyaXRlX3Byb2dyYW0oZGVmLCBzdG9yYWdlKTsKKwkJfQorCX0KKworCit9CisKKy8qIHdyaXRlIG91dCBkZWZpbml0aW9uIG9mIGludGVybmFsIGZ1bmN0aW9uIChlLmcuIF9wcmludG1zZ18xKC4uLikpCisgICB3aGljaCBjYWxscyBzZXJ2ZXIncyBkZWZpbnRpb24gb2YgYWN0dWFsIGZ1bmN0aW9uIChlLmcuIHByaW50bXNnXzEoLi4uKSkuCisgICBVbnBhY2tzIHNpbmdsZSB1c2VyIGFyZ3VtZW50IG9mIHByaW50bXNnXzEgdG8gY2FsbC1ieS12YWx1ZSBmb3JtYXQKKyAgIGV4cGVjdGVkIGJ5IHByaW50bXNnXzEuICovCitzdGF0aWMgdm9pZAord3JpdGVfcmVhbF9wcm9ncmFtKGRlZmluaXRpb24gKmRlZikKK3sKKwl2ZXJzaW9uX2xpc3QgKnZwOworCXByb2NfbGlzdCAqcHJvYzsKKwlkZWNsX2xpc3QgKmw7CisKKwlpZiggIW5ld3N0eWxlICkgcmV0dXJuOyAgLyogbm90IG5lZWRlZCBmb3Igb2xkIHN0eWxlICovCisJZm9yICh2cCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2cCAhPSBOVUxMOyB2cCA9IHZwLT5uZXh0KSB7CisJCWZvciAocHJvYyA9IHZwLT5wcm9jczsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LCAiXG4iKTsKKwkJCWludGVybmFsX3Byb2N0eXBlKHByb2MpOworCQkJZl9wcmludChmb3V0LCAiXG5fIik7CisJCQlwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJaWYoIENmbGFnICkgeworCQkJICBmX3ByaW50KGZvdXQsICIoIiApOworCQkJICAvKiBhcmcgbmFtZSAqLworCQkJICBpZiAocHJvYy0+YXJnX251bSA+IDEpCisJCQkgICAgZl9wcmludChmb3V0LCBwcm9jLT5hcmdzLmFyZ25hbWUpOworCQkJICBlbHNlCisJCQkgICAgcHR5cGUocHJvYy0+YXJncy5kZWNscy0+ZGVjbC5wcmVmaXgsIAorCQkJCSAgcHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAwKTsKKwkJCSAgZl9wcmludChmb3V0LCAiICphcmdwLCBzdHJ1Y3Qgc3ZjX3JlcSAqJXMpXG4iLCAKKwkJCQkgIFJRU1RQKTsKKwkJCX0gZWxzZSB7CisJCQkgIGZfcHJpbnQoZm91dCwgIihhcmdwLCAlcylcbiIsIFJRU1RQICk7CisJCQkgIC8qIGFyZyBuYW1lICovCisJCQkgIGlmIChwcm9jLT5hcmdfbnVtID4gMSkKKwkJCSAgICBmX3ByaW50KGZvdXQsICJcdCVzICphcmdwO1xuIiwgcHJvYy0+YXJncy5hcmduYW1lKTsKKwkJCSAgZWxzZSB7CisJCQkgICAgZl9wcmludChmb3V0LCAiXHQiKTsKKwkJCSAgICBwdHlwZShwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnByZWZpeCwgCisJCQkJICBwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnR5cGUsIDApOworCQkJICAgIGZfcHJpbnQoZm91dCwgIiAqYXJncDtcbiIpOworCQkJICB9CisJCQkgIGZfcHJpbnQoZm91dCwgIglzdHJ1Y3Qgc3ZjX3JlcSAqJXM7XG4iLCBSUVNUUCk7CisJCQl9CisKKwkJCWZfcHJpbnQoZm91dCwgIntcbiIpOworCQkJZl9wcmludChmb3V0LCAiXHRyZXR1cm4oIik7CisJCQlpZiggQ2ZsYWcgKQorCQkJICBwdm5hbWVfc3ZjKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCWVsc2UKKwkJCSAgcHZuYW1lKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCWZfcHJpbnQoZm91dCwgIigiKTsKKwkJCWlmIChwcm9jLT5hcmdfbnVtIDwgMikgeyAvKiBzaW5nbGUgYXJndW1lbnQgKi8KKwkJCSAgaWYgKCFzdHJlcSggcHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAidm9pZCIpKQorCQkJICAgIGZfcHJpbnQoZm91dCwgIiphcmdwLCAiKTsgIC8qIG5vbi12b2lkICovCisJCQl9IGVsc2UgeworCQkJICBmb3IgKGwgPSBwcm9jLT5hcmdzLmRlY2xzOyAgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkgCisJCQkgICAgZl9wcmludChmb3V0LCAiYXJncC0+JXMsICIsIGwtPmRlY2wubmFtZSk7CisJCQl9CisJCQlmX3ByaW50KGZvdXQsICIlcykpO1xufVxuIiwgUlFTVFApOworCQl9IAkJCisJfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVfcHJvZ3JhbShkZWZpbml0aW9uICpkZWYsIGNoYXIgKnN0b3JhZ2UpCit7CisJdmVyc2lvbl9saXN0ICp2cDsKKwlwcm9jX2xpc3QgKnByb2M7CisJaW50IGZpbGxlZDsKKworCWZvciAodnAgPSBkZWYtPmRlZi5wci52ZXJzaW9uczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dCkgeworCQlmX3ByaW50KGZvdXQsICJcbiIpOworCQlpZiAoc3RvcmFnZSAhPSBOVUxMKSB7CisJCQlmX3ByaW50KGZvdXQsICIlcyAiLCBzdG9yYWdlKTsKKwkJfQorCQlmX3ByaW50KGZvdXQsICJ2b2lkXG4iKTsKKwkJcHZuYW1lKGRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX251bSk7CisKKwkJaWYgKENmbGFnKSB7CisJCSAgIGZfcHJpbnQoZm91dCwgIihzdHJ1Y3Qgc3ZjX3JlcSAqJXMsICIsIFJRU1RQKTsKKwkJICAgZl9wcmludChmb3V0LCAicmVnaXN0ZXIgU1ZDWFBSVCAqJXMpXG4iLCBUUkFOU1ApOworCQl9IGVsc2UgeworCQkgICBmX3ByaW50KGZvdXQsICIoJXMsICVzKVxuIiwgUlFTVFAsIFRSQU5TUCk7CisJCSAgIGZfcHJpbnQoZm91dCwgIglzdHJ1Y3Qgc3ZjX3JlcSAqJXM7XG4iLCBSUVNUUCk7CisJCSAgIGZfcHJpbnQoZm91dCwgIglyZWdpc3RlciBTVkNYUFJUIColcztcbiIsIFRSQU5TUCk7CisJCX0KKworCQlmX3ByaW50KGZvdXQsICJ7XG4iKTsKKworCQlmaWxsZWQgPSAwOworCQlmX3ByaW50KGZvdXQsICJcdHVuaW9uIHtcbiIpOworCQlmb3IgKHByb2MgPSB2cC0+cHJvY3M7IHByb2MgIT0gTlVMTDsgcHJvYyA9IHByb2MtPm5leHQpIHsKKwkJCWlmIChwcm9jLT5hcmdfbnVtIDwgMikgeyAvKiBzaW5nbGUgYXJndW1lbnQgKi8KKwkJCQlpZiAoc3RyZXEocHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAKKwkJCQkJICAidm9pZCIpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlmaWxsZWQgPSAxOworCQkJCWZfcHJpbnQoZm91dCwgIlx0XHQiKTsKKwkJCQlwdHlwZShwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnByZWZpeCwgCisJCQkJICAgICAgcHJvYy0+YXJncy5kZWNscy0+ZGVjbC50eXBlLCAwKTsKKwkJCQlwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJCWZfcHJpbnQoZm91dCwgIl9hcmc7XG4iKTsKKworCQkJfQorCQkJZWxzZSB7CisJCQkJZmlsbGVkID0gMTsKKwkJCQlmX3ByaW50KGZvdXQsICJcdFx0JXMiLCBwcm9jLT5hcmdzLmFyZ25hbWUpOworCQkJCWZfcHJpbnQoZm91dCwgIiAiKTsKKwkJCQlwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJCWZfcHJpbnQoZm91dCwgIl9hcmc7XG4iKTsKKwkJCX0KKwkJfQorCQlpZiAoIWZpbGxlZCkgeworCQkJZl9wcmludChmb3V0LCAiXHRcdGludCBmaWxsO1xuIik7CisJCX0KKwkJZl9wcmludChmb3V0LCAiXHR9ICVzO1xuIiwgQVJHKTsKKwkJZl9wcmludChmb3V0LCAiXHRjaGFyIColcztcbiIsIFJFU1VMVCk7CisKKwkJaWYgKENmbGFnKSB7CisJCSAgICBmX3ByaW50KGZvdXQsICJcdHhkcnByb2NfdCB4ZHJfJXMsIHhkcl8lcztcbiIsIEFSRywgUkVTVUxUKTsKKwkJICAgIGZfcHJpbnQoZm91dCwKKwkJCSAgICAiXHRjaGFyICooKiVzKShjaGFyICosIHN0cnVjdCBzdmNfcmVxICopO1xuIiwKKwkJCSAgICBST1VUSU5FKTsKKwkJfSBlbHNlIHsKKwkJICAgIGZfcHJpbnQoZm91dCwgIlx0Ym9vbF90ICgqeGRyXyVzKSgpLCAoKnhkcl8lcykoKTtcbiIsIEFSRywgUkVTVUxUKTsKKwkJICAgIGZfcHJpbnQoZm91dCwgIlx0Y2hhciAqKColcykoKTtcbiIsIFJPVVRJTkUpOworCQl9CisKKwkJZl9wcmludChmb3V0LCAiXG4iKTsKKworCQlpZiAodGltZXJmbGFnKQorCQkJZl9wcmludChmb3V0LCAiXHRfcnBjc3ZjZGlydHkgPSAxO1xuIik7CisJCWZfcHJpbnQoZm91dCwgIlx0c3dpdGNoICglcy0+cnFfcHJvYykge1xuIiwgUlFTVFApOworCQlpZiAoIW51bGxwcm9jKHZwLT5wcm9jcykpIHsKKwkJCWZfcHJpbnQoZm91dCwgIlx0Y2FzZSBOVUxMUFJPQzpcbiIpOworCQkJZl9wcmludChmb3V0LAorCQkJIlx0XHQodm9pZCkgc3ZjX3NlbmRyZXBseSglcywgKHhkcnByb2NfdCkgeGRyX3ZvaWQsIChjaGFyICopTlVMTCk7XG4iLAorCQkJCQlUUkFOU1ApOworCQkJcHJpbnRfcmV0dXJuKCJcdFx0Iik7CisJCQlmX3ByaW50KGZvdXQsICJcbiIpOworCQl9CisJCWZvciAocHJvYyA9IHZwLT5wcm9jczsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LCAiXHRjYXNlICVzOlxuIiwgcHJvYy0+cHJvY19uYW1lKTsKKwkJCWlmIChwcm9jLT5hcmdfbnVtIDwgMikgeyAvKiBzaW5nbGUgYXJndW1lbnQgKi8KKwkJCSAgcF94ZHJmdW5jKCBBUkcsIHByb2MtPmFyZ3MuZGVjbHMtPmRlY2wudHlwZSk7CisJCQl9IGVsc2UgeworCQkJICBwX3hkcmZ1bmMoIEFSRywgcHJvYy0+YXJncy5hcmduYW1lKTsKKwkJCX0KKwkJCXBfeGRyZnVuYyggUkVTVUxULCBwcm9jLT5yZXNfdHlwZSk7CisJCQlpZiggQ2ZsYWcgKQorCQkJICAgIGZfcHJpbnQoZm91dCwKKwkJCQkgICAgIlx0XHQlcyA9IChjaGFyICooKikoY2hhciAqLCBzdHJ1Y3Qgc3ZjX3JlcSAqKSkgIiwKKwkJCQkgICAgUk9VVElORSk7CisJCQllbHNlCisJCQkgICAgZl9wcmludChmb3V0LCAiXHRcdCVzID0gKGNoYXIgKigqKSgpKSAiLCBST1VUSU5FKTsKKworCQkJaWYgKG5ld3N0eWxlKSB7IC8qIG5ldyBzdHlsZTogY2FsbHMgaW50ZXJuYWwgcm91dGluZSAqLworCQkJCWZfcHJpbnQoZm91dCwiXyIpOworCQkJfQorCQkJLyogTm90IHN1cmUgYWJvdXQgdGhlIGZvbGxvd2luZy4uLgorCQkJICogcnBjX2hvdXQgYWx3YXlzIGdlbmVyYXRlcyBmb29iYXJfMV9zdmMgZm9yCisJCQkgKiB0aGUgc2VydmljZSBwcm9jZWR1cmUsIHNvIHdoeSBzaG91bGQgd2UgdXNlCisJCQkgKiBmb29iYXJfMSBoZXJlPyEgLS1va2lyICovCisjaWYgMAorCQkJaWYoIENmbGFnICYmICFuZXdzdHlsZSApCisJCQkgIHB2bmFtZV9zdmMocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJZWxzZQorCQkJICBwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworI2Vsc2UKKwkJCXB2bmFtZV9zdmMocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworI2VuZGlmCisJCQlmX3ByaW50KGZvdXQsICI7XG4iKTsKKwkJCWZfcHJpbnQoZm91dCwgIlx0XHRicmVhaztcblxuIik7CisJCX0KKwkJZl9wcmludChmb3V0LCAiXHRkZWZhdWx0OlxuIik7CisJCXByaW50ZXJyKCJub3Byb2MiLCBUUkFOU1ApOworCQlwcmludF9yZXR1cm4oIlx0XHQiKTsKKwkJZl9wcmludChmb3V0LCAiXHR9XG4iKTsKKworCQlmX3ByaW50KGZvdXQsICJcdCh2b2lkKSBtZW1zZXQoKGNoYXIgKikmJXMsIDAsIHNpemVvZiAoJXMpKTtcbiIsIEFSRywgQVJHKTsKKwkJaWYgKENmbGFnKQorCQkgICAgcHJpbnRpZigiZ2V0YXJncyIsIFRSQU5TUCwgIihjYWRkcl90KSAmIiwgQVJHKTsKKwkJZWxzZQorCQkgICAgcHJpbnRpZigiZ2V0YXJncyIsIFRSQU5TUCwgIiYiLCBBUkcpOworCQlwcmludGVycigiZGVjb2RlIiwgVFJBTlNQKTsKKwkJcHJpbnRfcmV0dXJuKCJcdFx0Iik7CisJCWZfcHJpbnQoZm91dCwgIlx0fVxuIik7CisKKwkJaWYgKENmbGFnKQorCQkgICAgZl9wcmludChmb3V0LCAiXHQlcyA9ICgqJXMpKChjaGFyICopJiVzLCAlcyk7XG4iLAorCQkJICAgIFJFU1VMVCwgUk9VVElORSwgQVJHLCBSUVNUUCk7CisJCWVsc2UKKwkJICAgIGZfcHJpbnQoZm91dCwgIlx0JXMgPSAoKiVzKSgmJXMsICVzKTtcbiIsCisJCQkgICAgUkVTVUxULCBST1VUSU5FLCBBUkcsIFJRU1RQKTsKKwkJZl9wcmludChmb3V0LCAKKwkJCSJcdGlmICglcyAhPSBOVUxMICYmICFzdmNfc2VuZHJlcGx5KCVzLCAiCisJCQkiKHhkcnByb2NfdCkgeGRyXyVzLCAlcykpIHtcbiIsCisJCQlSRVNVTFQsIFRSQU5TUCwgUkVTVUxULCBSRVNVTFQpOworCQlwcmludGVycigic3lzdGVtZXJyIiwgVFJBTlNQKTsKKwkJZl9wcmludChmb3V0LCAiXHR9XG4iKTsKKworCQlpZiAoQ2ZsYWcpCisJCSAgICBwcmludGlmKCJmcmVlYXJncyIsIFRSQU5TUCwgIihjYWRkcl90KSAmIiwgQVJHKTsKKwkJZWxzZQorCQkgICAgcHJpbnRpZigiZnJlZWFyZ3MiLCBUUkFOU1AsICImIiwgQVJHKTsKKwkJKHZvaWQpIHNwcmludGYoX2VycmJ1ZiwgInVuYWJsZSB0byBmcmVlIGFyZ3VtZW50cyIpOworCQlwcmludF9lcnJfbWVzc2FnZSgiXHRcdCIpOworCQlmX3ByaW50KGZvdXQsICJcdFx0ZXhpdCgxKTtcbiIpOworCQlmX3ByaW50KGZvdXQsICJcdH1cbiIpOworCQlwcmludF9yZXR1cm4oIlx0Iik7CisJCWZfcHJpbnQoZm91dCwgIn1cbiIpOworCX0KK30KKworc3RhdGljIHZvaWQKK3ByaW50ZXJyKGNoYXIgKmVyciwgY2hhciAqdHJhbnNwKQoreworCWZfcHJpbnQoZm91dCwgIlx0XHRzdmNlcnJfJXMoJXMpO1xuIiwgZXJyLCB0cmFuc3ApOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRpZihjaGFyICpwcm9jLCBjaGFyICp0cmFuc3AsIGNoYXIgKnByZWZpeCwgY2hhciAqYXJnKQoreworCWZfcHJpbnQoZm91dCwgIlx0aWYgKCFzdmNfJXMoJXMsICh4ZHJwcm9jX3QpIHhkcl8lcywgKGNhZGRyX3QpICVzJXMpKSB7XG4iLAorCQlwcm9jLCB0cmFuc3AsIGFyZywgcHJlZml4LCBhcmcpOworfQorCitpbnQKK251bGxwcm9jKHByb2NfbGlzdCAqcHJvYykKK3sKKwlmb3IgKDsgcHJvYyAhPSBOVUxMOyBwcm9jID0gcHJvYy0+bmV4dCkgeworCQlpZiAoc3RyZXEocHJvYy0+cHJvY19udW0sICIwIikpIHsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3dyaXRlX2luZXRtb3N0KGNoYXIgKmluZmlsZSkKK3sKKwlmX3ByaW50KGZvdXQsICJcdHJlZ2lzdGVyIFNWQ1hQUlQgKiVzO1xuIiwgVFJBTlNQKTsKKwlmX3ByaW50KGZvdXQsICJcdGludCBzb2NrO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRpbnQgcHJvdG87XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0aW50IGFzaXplID0gc2l6ZW9mIChzYWRkcik7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWZfcHJpbnQoZm91dCwgCisJIlx0aWYgKGdldHNvY2tuYW1lKDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2FkZHIsICZhc2l6ZSkgPT0gMCkge1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdGludCBzc2l6ZSA9IHNpemVvZiAoaW50KTtcblxuIik7CisJZl9wcmludChmb3V0LCAiXHRcdGlmIChzYWRkci5zaW5fZmFtaWx5ICE9IEFGX0lORVQpXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRleGl0KDEpO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdGlmIChnZXRzb2Nrb3B0KDAsIFNPTF9TT0NLRVQsIFNPX1RZUEUsXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRcdChjaGFyICopJl9ycGNmZHR5cGUsICZzc2l6ZSkgPT0gLTEpXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRleGl0KDEpO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdHNvY2sgPSAwO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdF9ycGNwbXN0YXJ0ID0gMTtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRwcm90byA9IDA7XG4iKTsKKwlvcGVuX2xvZ19maWxlKGluZmlsZSwgIlx0XHQiKTsKKwlmX3ByaW50KGZvdXQsICJcdH0gZWxzZSB7XG4iKTsKKwl3cml0ZV9ycGNfc3ZjX2ZnKGluZmlsZSwgIlx0XHQiKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0c29jayA9IFJQQ19BTllTT0NLO1xuIik7CisJcHJpbnRfcG1hcHVuc2V0KCJcdFx0Iik7CisJZl9wcmludChmb3V0LCAiXHR9XG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3JldHVybihjaGFyICpzcGFjZSkKK3sKKwlpZiAoZXhpdG5vdykKKwkJZl9wcmludChmb3V0LCAiJXNleGl0KDApO1xuIiwgc3BhY2UpOworCWVsc2UgeworCQlpZiAodGltZXJmbGFnKQorCQkJZl9wcmludChmb3V0LCAiJXNfcnBjc3ZjZGlydHkgPSAwO1xuIiwgc3BhY2UpOworCQlmX3ByaW50KGZvdXQsICIlc3JldHVybjtcbiIsIHNwYWNlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9wbWFwdW5zZXQoY2hhciAqc3BhY2UpCit7CisJbGlzdCAqbDsKKwlkZWZpbml0aW9uICpkZWY7CisJdmVyc2lvbl9saXN0ICp2cDsKKworCWZvciAobCA9IGRlZmluZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJZGVmID0gKGRlZmluaXRpb24gKikgbC0+dmFsOworCQlpZiAoZGVmLT5kZWZfa2luZCA9PSBERUZfUFJPR1JBTSkgeworCQkJZm9yICh2cCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2cCAhPSBOVUxMOworCQkJCQl2cCA9IHZwLT5uZXh0KSB7CisJCQkJZl9wcmludChmb3V0LCAiJXModm9pZCkgcG1hcF91bnNldCglcywgJXMpO1xuIiwKKwkJCQkJc3BhY2UsIGRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX25hbWUpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfZXJyX21lc3NhZ2UoY2hhciAqc3BhY2UpCit7CisJaWYgKGxvZ2ZsYWcpCisJCWZfcHJpbnQoZm91dCwgIiVzc3lzbG9nKExPR19FUlIsIFwiJXNcIik7XG4iLCBzcGFjZSwgX2VycmJ1Zik7CisJZWxzZSBpZiAoaW5ldGRmbGFnIHx8IHBtZmxhZykKKwkJZl9wcmludChmb3V0LCAiJXNfbXNnb3V0KFwiJXNcIik7XG4iLCBzcGFjZSwgX2VycmJ1Zik7CisJZWxzZQorCQlmX3ByaW50KGZvdXQsICIlc2ZwcmludGYoc3RkZXJyLCBcIiVzXCIpO1xuIiwgc3BhY2UsIF9lcnJidWYpOworfQorCisvKgorICogV3JpdGUgdGhlIHNlcnZlciBhdXhpbGlhcnkgZnVuY3Rpb24gKCBfbXNnb3V0LCB0aW1lb3V0KQorICovCit2b2lkCit3cml0ZV9zdmNfYXV4KGludCBub21haW4pCit7CisJaWYgKCFsb2dmbGFnKQorCQl3cml0ZV9tc2dfb3V0KCk7CisJaWYoICFub21haW4gKQorCSAgd3JpdGVfdGltZW91dF9mdW5jKCk7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgX21zZ291dCBmdW5jdGlvbgorICovCit2b2lkCit3cml0ZV9tc2dfb3V0KHZvaWQpCit7CisJZl9wcmludChmb3V0LCAiXG4iKTsKKwlmX3ByaW50KGZvdXQsICJzdGF0aWNcbiIpOworCWlmKCAhQ2ZsYWcgKSB7CisJICBmX3ByaW50KGZvdXQsICJ2b2lkIF9tc2dvdXQobXNnKVxuIik7CisJICBmX3ByaW50KGZvdXQsICJcdGNoYXIgKm1zZztcbiIpOworCX0gZWxzZSB7CisJICBmX3ByaW50KGZvdXQsICJ2b2lkIF9tc2dvdXQoY2hhciogbXNnKVxuIik7CisJfQorCWZfcHJpbnQoZm91dCwgIntcbiIpOworCWZfcHJpbnQoZm91dCwgIiNpZmRlZiBSUENfU1ZDX0ZHXG4iKTsKKwlpZiAoaW5ldGRmbGFnIHx8IHBtZmxhZykKKwkJZl9wcmludChmb3V0LCAiXHRpZiAoX3JwY3Btc3RhcnQpXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0c3lzbG9nKExPR19FUlIsIFwiJSVzXCIsIG1zZyk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdGVsc2VcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHQodm9pZCkgZnByaW50ZihzdGRlcnIsIFwiJSVzXFxuXCIsIG1zZyk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICIjZWxzZVxuIik7CisJZl9wcmludChmb3V0LCAiXHRzeXNsb2coTE9HX0VSUiwgXCIlJXNcIiwgbXNnKTtcbiIpOworCWZfcHJpbnQoZm91dCwgIiNlbmRpZlxuIik7CisJZl9wcmludChmb3V0LCAifVxuIik7Cit9CisKKy8qCisgKiBXcml0ZSB0aGUgdGltZW91dCBmdW5jdGlvbgorICovCitzdGF0aWMgdm9pZAord3JpdGVfdGltZW91dF9mdW5jKHZvaWQpCit7CisJaWYgKCF0aW1lcmZsYWcpCisJCXJldHVybjsKKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWZfcHJpbnQoZm91dCwgInN0YXRpYyB2b2lkXG4iKTsKKwlmX3ByaW50KGZvdXQsICJjbG9zZWRvd24oKVxuIik7CisJZl9wcmludChmb3V0LCAie1xuIik7CisJZl9wcmludChmb3V0LCAiXHRpZiAoX3JwY3N2Y2RpcnR5ID09IDApIHtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRzdGF0aWMgaW50IHNpemU7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0aW50IGksIG9wZW5mZDtcbiIpOworCWlmICh0aXJwY2ZsYWcgJiYgcG1mbGFnKSB7CisJCWZfcHJpbnQoZm91dCwgIlx0XHRzdHJ1Y3QgdF9pbmZvIHRpbmZvO1xuXG4iKTsKKwkJZl9wcmludChmb3V0LCAiXHRcdGlmICghdF9nZXRpbmZvKDAsICZ0aW5mbykgJiYgKHRpbmZvLnNlcnZ0eXBlID09IFRfQ0xUUykpXG4iKTsKKwl9IGVsc2UgeworCQlmX3ByaW50KGZvdXQsICJcblx0XHRpZiAoX3JwY2ZkdHlwZSA9PSBTT0NLX0RHUkFNKVxuIik7CisJfQorCWZfcHJpbnQoZm91dCwgIlx0XHRcdGV4aXQoMCk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0aWYgKHNpemUgPT0gMCkge1xuIik7CisJaWYoIHRpcnBjZmxhZyApIHsKKwkgIGZfcHJpbnQoZm91dCwgIlx0XHRcdHN0cnVjdCBybGltaXQgcmw7XG5cbiIpOworCSAgZl9wcmludChmb3V0LCAiXHRcdFx0cmwucmxpbV9tYXggPSAwO1xuIik7CisJICBmX3ByaW50KGZvdXQsICJcdFx0XHRnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsKTtcbiIpOworCSAgZl9wcmludChmb3V0LCAiXHRcdFx0aWYgKChzaXplID0gcmwucmxpbV9tYXgpID09IDApXG4iKTsKKwkgIGZfcHJpbnQoZm91dCwgIlx0XHRcdFx0cmV0dXJuO1xuIik7CisJfSBlbHNlIHsKKwkgIGZfcHJpbnQoZm91dCwgIlx0XHRcdHNpemUgPSBnZXRkdGFibGVzaXplKCk7XG4iKTsKKwl9CisJZl9wcmludChmb3V0LCAiXHRcdH1cbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRmb3IgKGkgPSAwLCBvcGVuZmQgPSAwOyBpIDwgc2l6ZSAmJiBvcGVuZmQgPCAyOyBpKyspXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRpZiAoRkRfSVNTRVQoaSwgJnN2Y19mZHNldCkpXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRcdG9wZW5mZCsrO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdGlmIChvcGVuZmQgPD0gMSlcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRcdGV4aXQoMCk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdH1cbiIpOworCWZfcHJpbnQoZm91dCwgIlx0KHZvaWQpIGFsYXJtKF9SUENTVkNfQ0xPU0VET1dOKTtcbiIpOworCWZfcHJpbnQoZm91dCwgIn1cbiIpOworfQorCisvKgorICogV3JpdGUgdGhlIG1vc3Qgb2YgcG9ydCBtb25pdG9yIHN1cHBvcnQKKyAqLworc3RhdGljIHZvaWQKK3dyaXRlX3BtX21vc3QoY2hhciAqaW5maWxlLCBpbnQgbmV0ZmxhZykKK3sKKwlsaXN0ICpsOworCWRlZmluaXRpb24gKmRlZjsKKwl2ZXJzaW9uX2xpc3QgKnZwOworCisJZl9wcmludChmb3V0LCAiXHRpZiAoIWlvY3RsKDAsIElfTE9PSywgbW5hbWUpICYmXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0KCFzdHJjbXAobW5hbWUsIFwic29ja21vZFwiKSB8fCIpOworCWZfcHJpbnQoZm91dCwgIiAhc3RyY21wKG1uYW1lLCBcInRpbW9kXCIpKSkge1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdGNoYXIgKm5ldGlkO1xuIik7CisJaWYgKCFuZXRmbGFnKSB7CS8qIE5vdCBpbmNsdWRlZCBieSAtbiBvcHRpb24gKi8KKwkJZl9wcmludChmb3V0LCAiXHRcdHN0cnVjdCBuZXRjb25maWcgKm5jb25mID0gTlVMTDtcbiIpOworCQlmX3ByaW50KGZvdXQsICJcdFx0U1ZDWFBSVCAqJXM7XG4iLCBUUkFOU1ApOworCX0KKwlpZiggdGltZXJmbGFnICkKKwkgIGZfcHJpbnQoZm91dCwgIlx0XHRpbnQgcG1jbG9zZTtcbiIpOworLyogbm90IG5lY2Vzc2FyeSwgZGVmaW5lZCBpbiAvdXNyL2luY2x1ZGUvc3RkbGliICovCisvKglmX3ByaW50KGZvdXQsICJcdFx0ZXh0ZXJuIGNoYXIgKmdldGVudigpO1xuIik7Ki8KKwlmX3ByaW50KGZvdXQsICJcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRfcnBjcG1zdGFydCA9IDE7XG4iKTsKKwlpZiAobG9nZmxhZykKKwkJb3Blbl9sb2dfZmlsZShpbmZpbGUsICJcdFx0Iik7CisJZl9wcmludChmb3V0LCAiXHRcdGlmICgobmV0aWQgPSBnZXRlbnYoXCJOTFNQUk9WSURFUlwiKSkgPT0gTlVMTCkge1xuIik7CisJc3ByaW50ZihfZXJyYnVmLCAiY2Fubm90IGdldCB0cmFuc3BvcnQgbmFtZSIpOworCXByaW50X2Vycl9tZXNzYWdlKCJcdFx0XHQiKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0fSBlbHNlIGlmICgobmNvbmYgPSBnZXRuZXRjb25maWdlbnQobmV0aWQpKSA9PSBOVUxMKSB7XG4iKTsKKwlzcHJpbnRmKF9lcnJidWYsICJjYW5ub3QgZ2V0IHRyYW5zcG9ydCBpbmZvIik7CisJcHJpbnRfZXJyX21lc3NhZ2UoIlx0XHRcdCIpOworCWZfcHJpbnQoZm91dCwgIlx0XHR9XG4iKTsKKwkvKgorCSAqIEEga2x1ZGd5IHN1cHBvcnQgZm9yIGluZXRkIHNlcnZpY2VzLiBJbmV0ZCBvbmx5IHdvcmtzIHdpdGgKKwkgKiBzb2NrbW9kLCBhbmQgUlBDIHdvcmtzIG9ubHkgd2l0aCB0aW1vZCwgaGVuY2UgYWxsIHRoaXMganVnZ2xlcnkKKwkgKi8KKwlmX3ByaW50KGZvdXQsICJcdFx0aWYgKHN0cmNtcChtbmFtZSwgXCJzb2NrbW9kXCIpID09IDApIHtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRcdGlmIChpb2N0bCgwLCBJX1BPUCwgMCkgfHwgaW9jdGwoMCwgSV9QVVNILCBcInRpbW9kXCIpKSB7XG4iKTsKKwlzcHJpbnRmKF9lcnJidWYsICJjb3VsZCBub3QgZ2V0IHRoZSByaWdodCBtb2R1bGUiKTsKKwlwcmludF9lcnJfbWVzc2FnZSgiXHRcdFx0XHQiKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRcdGV4aXQoMSk7XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHR9XG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0fVxuIik7CisJaWYoIHRpbWVyZmxhZyApCisJICBmX3ByaW50KGZvdXQsICJcdFx0cG1jbG9zZSA9ICh0X2dldHN0YXRlKDApICE9IFRfREFUQVhGRVIpO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdGlmICgoJXMgPSBzdmNfdGxpX2NyZWF0ZSgwLCBuY29uZiwgTlVMTCwgMCwgMCkpID09IE5VTEwpIHtcbiIsCisJCQlUUkFOU1ApOworCXNwcmludGYoX2VycmJ1ZiwgImNhbm5vdCBjcmVhdGUgc2VydmVyIGhhbmRsZSIpOworCXByaW50X2Vycl9tZXNzYWdlKCJcdFx0XHQiKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRleGl0KDEpO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdH1cbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRpZiAobmNvbmYpXG4iKTsKKwlmX3ByaW50KGZvdXQsICJcdFx0XHRmcmVlbmV0Y29uZmlnZW50KG5jb25mKTtcbiIpOworCWZvciAobCA9IGRlZmluZWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpIHsKKwkJZGVmID0gKGRlZmluaXRpb24gKikgbC0+dmFsOworCQlpZiAoZGVmLT5kZWZfa2luZCAhPSBERUZfUFJPR1JBTSkgeworCQkJY29udGludWU7CisJCX0KKwkJZm9yICh2cCA9IGRlZi0+ZGVmLnByLnZlcnNpb25zOyB2cCAhPSBOVUxMOyB2cCA9IHZwLT5uZXh0KSB7CisJCQlmX3ByaW50KGZvdXQsCisJCQkJIlx0XHRpZiAoIXN2Y19yZWcoJXMsICVzLCAlcywgIiwKKwkJCQlUUkFOU1AsIGRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX25hbWUpOworCQkJcHZuYW1lKGRlZi0+ZGVmX25hbWUsIHZwLT52ZXJzX251bSk7CisJCQlmX3ByaW50KGZvdXQsICIsIDApKSB7XG4iKTsKKwkJCSh2b2lkKSBzcHJpbnRmKF9lcnJidWYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgKCVzLCAlcykuIiwKKwkJCQkJZGVmLT5kZWZfbmFtZSwgdnAtPnZlcnNfbmFtZSk7CisJCQlwcmludF9lcnJfbWVzc2FnZSgiXHRcdFx0Iik7CisJCQlmX3ByaW50KGZvdXQsICJcdFx0XHRleGl0KDEpO1xuIik7CisJCQlmX3ByaW50KGZvdXQsICJcdFx0fVxuIik7CisJCX0KKwl9CisJaWYgKHRpbWVyZmxhZykgeworCQlmX3ByaW50KGZvdXQsICJcdFx0aWYgKHBtY2xvc2UpIHtcbiIpOworCQlmX3ByaW50KGZvdXQsICJcdFx0XHQodm9pZCkgc2lnbmFsKFNJR0FMUk0sICVzIGNsb3NlZG93bik7XG4iLAorCQkJCUNmbGFnPyAiKFNJR19QRikiIDogIih2b2lkKCopKCkpIiApOworCQlmX3ByaW50KGZvdXQsICJcdFx0XHQodm9pZCkgYWxhcm0oX1JQQ1NWQ19DTE9TRURPV04pO1xuIik7CisJCWZfcHJpbnQoZm91dCwgIlx0XHR9XG4iKTsKKwl9CisJZl9wcmludChmb3V0LCAiXHRcdHN2Y19ydW4oKTtcbiIpOworCWZfcHJpbnQoZm91dCwgIlx0XHRleGl0KDEpO1xuIik7CisJZl9wcmludChmb3V0LCAiXHRcdC8qIE5PVFJFQUNIRUQgKi9cbiIpOworCWZfcHJpbnQoZm91dCwgIlx0fVxuIik7Cit9CisKKy8qCisgKiBTdXBwb3J0IGZvciBiYWNrZ3JvdW5kaW5nIHRoZSBzZXJ2ZXIgaWYgc2VsZiBzdGFydGVkLgorICovCitzdGF0aWMgdm9pZAord3JpdGVfcnBjX3N2Y19mZyhjaGFyICppbmZpbGUsIGNoYXIgKnNwKQoreworCWZfcHJpbnQoZm91dCwgIiNpZm5kZWYgUlBDX1NWQ19GR1xuIik7CisJZl9wcmludChmb3V0LCAiJXNpbnQgc2l6ZTtcbiIsIHNwKTsKKwlpZiggdGlycGNmbGFnICkKKwkgICAgICAgIGZfcHJpbnQoZm91dCwgIiVzc3RydWN0IHJsaW1pdCBybDtcbiIsIHNwKTsKKwlpZiAoaW5ldGRmbGFnKQorCQlmX3ByaW50KGZvdXQsICIlc2ludCBwaWQsIGk7XG5cbiIsIHNwKTsKKwlmX3ByaW50KGZvdXQsICIlc3BpZCA9IGZvcmsoKTtcbiIsIHNwKTsKKwlmX3ByaW50KGZvdXQsICIlc2lmIChwaWQgPCAwKSB7XG4iLCBzcCk7CisJZl9wcmludChmb3V0LCAiJXNcdHBlcnJvcihcImNhbm5vdCBmb3JrXCIpO1xuIiwgc3ApOworCWZfcHJpbnQoZm91dCwgIiVzXHRleGl0KDEpO1xuIiwgc3ApOworCWZfcHJpbnQoZm91dCwgIiVzfVxuIiwgc3ApOworCWZfcHJpbnQoZm91dCwgIiVzaWYgKHBpZClcbiIsIHNwKTsKKwlmX3ByaW50KGZvdXQsICIlc1x0ZXhpdCgwKTtcbiIsIHNwKTsKKwkvKiBnZXQgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlpZiggdGlycGNmbGFnICkgeworCSAgZl9wcmludChmb3V0LCAiJXNybC5ybGltX21heCA9IDA7XG4iLCBzcCk7CisJICBmX3ByaW50KGZvdXQsICIlc2dldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmcmwpO1xuIiwgc3ApOworCSAgZl9wcmludChmb3V0LCAiJXNpZiAoKHNpemUgPSBybC5ybGltX21heCkgPT0gMClcbiIsIHNwKTsKKwkgIGZfcHJpbnQoZm91dCwgIiVzXHRleGl0KDEpO1xuIiwgc3ApOworCX0gZWxzZSB7CisJICBmX3ByaW50KGZvdXQsICIlc3NpemUgPSBnZXRkdGFibGVzaXplKCk7XG4iLCBzcCk7CisJfQorCisJZl9wcmludChmb3V0LCAiJXNmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKVxuIiwgc3ApOworCWZfcHJpbnQoZm91dCwgIiVzXHQodm9pZCkgY2xvc2UoaSk7XG4iLCBzcCk7CisJLyogUmVkaXJlY3Qgc3RkZXJyIGFuZCBzdGRvdXQgdG8gY29uc29sZSAqLworCWZfcHJpbnQoZm91dCwgIiVzaSA9IG9wZW4oXCIvZGV2L2NvbnNvbGVcIiwgMik7XG4iLCBzcCk7CisJZl9wcmludChmb3V0LCAiJXModm9pZCkgZHVwMihpLCAxKTtcbiIsIHNwKTsKKwlmX3ByaW50KGZvdXQsICIlcyh2b2lkKSBkdXAyKGksIDIpO1xuIiwgc3ApOworCS8qIFRoaXMgcmVtb3ZlcyBjb250cm9sIG9mIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCAqLworCWlmKCB0aXJwY2ZsYWcgKQorCSAgZl9wcmludChmb3V0LCAiJXNzZXRzaWQoKTtcbiIsIHNwKTsKKwllbHNlIHsKKwkgIGZfcHJpbnQoZm91dCwgIiVzaSA9IG9wZW4oXCIvZGV2L3R0eVwiLCAyKTtcbiIsIHNwKTsKKwkgIGZfcHJpbnQoZm91dCwgIiVzaWYgKGkgPj0gMCkge1xuIiwgc3ApOworCSAgZl9wcmludChmb3V0LCAiJXNcdCh2b2lkKSBpb2N0bChpLCBUSU9DTk9UVFksIChjaGFyICopTlVMTCk7XG4iLCBzcCk7OworCSAgZl9wcmludChmb3V0LCAiJXNcdCh2b2lkKSBjbG9zZShpKTtcbiIsIHNwKTsKKwkgIGZfcHJpbnQoZm91dCwgIiVzfVxuIiwgc3ApOworCX0KKwlpZiAoIWxvZ2ZsYWcpCisJCW9wZW5fbG9nX2ZpbGUoaW5maWxlLCBzcCk7CisJZl9wcmludChmb3V0LCAiI2VuZGlmXG4iKTsKKwlpZiAobG9nZmxhZykKKwkJb3Blbl9sb2dfZmlsZShpbmZpbGUsIHNwKTsKK30KKworc3RhdGljIHZvaWQKK29wZW5fbG9nX2ZpbGUoY2hhciAqaW5maWxlLCBjaGFyICpzcCkKK3sKKwljaGFyICpzOworCisJcyA9IHN0cnJjaHIoaW5maWxlLCAnLicpOworCWlmIChzKSAKKwkJKnMgPSAnXDAnOworCWZfcHJpbnQoZm91dCwiJXNvcGVubG9nKFwiJXNcIiwgTE9HX1BJRCwgTE9HX0RBRU1PTik7XG4iLCBzcCwgaW5maWxlKTsKKwlpZiAocykKKwkJKnMgPSAnLic7Cit9CisKKworCisKKy8qCisgKiB3cml0ZSBhIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGdpdmVuIHRyYW5zcG9ydCBmb3IgSW5ldGQKKyAqLwordm9pZAord3JpdGVfaW5ldGRfcmVnaXN0ZXIoY2hhciAqdHJhbnNwKQoreworCWxpc3QgKmw7CisJZGVmaW5pdGlvbiAqZGVmOworCXZlcnNpb25fbGlzdCAqdnA7CisJY2hhciAqc3A7CisJaW50IGlzdWRwOworCWNoYXIgdG1wYnVmWzMyXTsKKworCWlmIChpbmV0ZGZsYWcpCisJCXNwID0gIlx0IjsKKwllbHNlCisJCXNwID0gIiI7CisJaWYgKHN0cmVxKHRyYW5zcCwgInVkcCIpKQorCQlpc3VkcCA9IDE7CisJZWxzZQorCQlpc3VkcCA9IDA7CisJZl9wcmludChmb3V0LCAiXG4iKTsKKwlpZiAoaW5ldGRmbGFnKSB7CisJCWZfcHJpbnQoZm91dCwgIlx0aWYgKChfcnBjZmR0eXBlID09IDApIHx8IChfcnBjZmR0eXBlID09ICVzKSkge1xuIiwKKwkJCQlpc3VkcCA/ICJTT0NLX0RHUkFNIiA6ICJTT0NLX1NUUkVBTSIpOworCX0KKwlmX3ByaW50KGZvdXQsICIlc1x0JXMgPSBzdmMlc19jcmVhdGUoJXMiLAorCQlzcCwgVFJBTlNQLCB0cmFuc3AsIGluZXRkZmxhZz8gInNvY2siOiAiUlBDX0FOWVNPQ0siKTsKKwlpZiAoIWlzdWRwKQorCQlmX3ByaW50KGZvdXQsICIsIDAsIDAiKTsKKwlmX3ByaW50KGZvdXQsICIpO1xuIik7CisJZl9wcmludChmb3V0LCAiJXNcdGlmICglcyA9PSBOVUxMKSB7XG4iLCBzcCwgVFJBTlNQKTsKKwkodm9pZCkgc3ByaW50ZihfZXJyYnVmLCAiY2Fubm90IGNyZWF0ZSAlcyBzZXJ2aWNlLiIsIHRyYW5zcCk7CisJKHZvaWQpIHNwcmludGYodG1wYnVmLCAiJXNcdFx0Iiwgc3ApOworCXByaW50X2Vycl9tZXNzYWdlKHRtcGJ1Zik7CisJZl9wcmludChmb3V0LCAiJXNcdFx0ZXhpdCgxKTtcbiIsIHNwKTsKKwlmX3ByaW50KGZvdXQsICIlc1x0fVxuIiwgc3ApOworCisJaWYgKGluZXRkZmxhZykgeworCQlmX3ByaW50KGZvdXQsICIlc1x0aWYgKCFfcnBjcG1zdGFydClcblx0Iiwgc3ApOworCQlmX3ByaW50KGZvdXQsICIlc1x0cHJvdG8gPSBJUFBST1RPXyVzO1xuIiwKKwkJCQlzcCwgaXN1ZHAgPyAiVURQIjogIlRDUCIpOworCX0KKwlmb3IgKGwgPSBkZWZpbmVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCWRlZiA9IChkZWZpbml0aW9uICopIGwtPnZhbDsKKwkJaWYgKGRlZi0+ZGVmX2tpbmQgIT0gREVGX1BST0dSQU0pIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZvciAodnAgPSBkZWYtPmRlZi5wci52ZXJzaW9uczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dCkgeworCQkJZl9wcmludChmb3V0LCAiJXNcdGlmICghc3ZjX3JlZ2lzdGVyKCVzLCAlcywgJXMsICIsCisJCQkJc3AsIFRSQU5TUCwgZGVmLT5kZWZfbmFtZSwgdnAtPnZlcnNfbmFtZSk7CisJCQlwdm5hbWUoZGVmLT5kZWZfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCWlmIChpbmV0ZGZsYWcpCisJCQkJZl9wcmludChmb3V0LCAiLCBwcm90bykpIHtcbiIpOworCQkJZWxzZSAKKwkJCQlmX3ByaW50KGZvdXQsICIsIElQUFJPVE9fJXMpKSB7XG4iLAorCQkJCQlpc3VkcCA/ICJVRFAiOiAiVENQIik7CisJCQkodm9pZCkgc3ByaW50ZihfZXJyYnVmLCAidW5hYmxlIHRvIHJlZ2lzdGVyICglcywgJXMsICVzKS4iLAorCQkJCQlkZWYtPmRlZl9uYW1lLCB2cC0+dmVyc19uYW1lLCB0cmFuc3ApOworCQkJcHJpbnRfZXJyX21lc3NhZ2UodG1wYnVmKTsKKwkJCWZfcHJpbnQoZm91dCwgIiVzXHRcdGV4aXQoMSk7XG4iLCBzcCk7CisJCQlmX3ByaW50KGZvdXQsICIlc1x0fVxuIiwgc3ApOworCQl9CisJfQorCWlmIChpbmV0ZGZsYWcpCisJCWZfcHJpbnQoZm91dCwgIlx0fVxuIik7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY190YmxvdXQuYyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3RibG91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDAyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY190YmxvdXQuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylycGNfdGJsb3V0LmMgMS40IDg5LzAyLzIyIChDKSAxOTg4IFNNSSI7CisjZW5kaWYKKworLyoKKyAqIHJwY190YmxvdXQuYywgRGlzcGF0Y2ggdGFibGUgb3V0cHV0dGVyIGZvciB0aGUgUlBDIHByb3RvY29sIGNvbXBpbGVyCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInJwY19wYXJzZS5oIgorI2luY2x1ZGUgInJwY191dGlsLmgiCisjaW5jbHVkZSAicnBjX291dHB1dC5oIgorCitzdGF0aWMgdm9pZAl3cml0ZV90YWJsZShkZWZpbml0aW9uICpkZWYpOworc3RhdGljIHZvaWQJcHJpbnRpdChjaGFyICpwcmVmaXgsIGNoYXIgKnR5cGUpOworCisjZGVmaW5lIFRBQlNJWkUJCTgKKyNkZWZpbmUgVEFCQ09VTlQJNQorI2RlZmluZSBUQUJTVE9QCQkoVEFCU0laRSpUQUJDT1VOVCkKKworc3RhdGljIGNoYXIgdGFic3RyW1RBQkNPVU5UKzFdID0gIlx0XHRcdFx0XHQiOworCitzdGF0aWMgY2hhciB0YmxfaGRyW10gPSAic3RydWN0IHJwY2dlbl90YWJsZSAlc190YWJsZVtdID0ge1xuIjsKK3N0YXRpYyBjaGFyIHRibF9lbmRbXSA9ICJ9O1xuIjsKKworc3RhdGljIGNoYXIgbnVsbF9lbnRyeVtdID0gIlxuXHQoY2hhciAqKCopKCkpMCxcblwKKyBcdCh4ZHJwcm9jX3QpIHhkcl92b2lkLFx0XHRcdDAsXG5cCisgXHQoeGRycHJvY190KSB4ZHJfdm9pZCxcdFx0XHQwLFxuIjsKKworCitzdGF0aWMgY2hhciB0YmxfbnByb2NbXSA9ICJpbnQgJXNfbnByb2MgPVxuXHRzaXplb2YoJXNfdGFibGUpL3NpemVvZiglc190YWJsZVswXSk7XG5cbiI7CisKK3ZvaWQKK3dyaXRlX3RhYmxlcyh2b2lkKQoreworCWxpc3QgKmw7CisJZGVmaW5pdGlvbiAqZGVmOworCisJZl9wcmludChmb3V0LCAiXG4iKTsKKwlmb3IgKGwgPSBkZWZpbmVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KSB7CisJCWRlZiA9IChkZWZpbml0aW9uICopIGwtPnZhbDsKKwkJaWYgKGRlZi0+ZGVmX2tpbmQgPT0gREVGX1BST0dSQU0pIHsKKwkJCXdyaXRlX3RhYmxlKGRlZik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV90YWJsZShkZWZpbml0aW9uICpkZWYpCit7CisJdmVyc2lvbl9saXN0ICp2cDsKKwlwcm9jX2xpc3QgKnByb2M7CisJaW50IGN1cnJlbnQ7CisJaW50IGV4cGVjdGVkOworCWNoYXIgcHJvZ3ZlcnNbMTAwXTsKKwlpbnQgd2FybmluZzsKKworCWZvciAodnAgPSBkZWYtPmRlZi5wci52ZXJzaW9uczsgdnAgIT0gTlVMTDsgdnAgPSB2cC0+bmV4dCkgeworCQl3YXJuaW5nID0gMDsKKwkJc19wcmludChwcm9ndmVycywgIiVzXyVzIiwKKwkJICAgIGxvY2FzZShkZWYtPmRlZl9uYW1lKSwgdnAtPnZlcnNfbnVtKTsKKwkJLyogcHJpbnQgdGhlIHRhYmxlIGhlYWRlciAqLworCQlmX3ByaW50KGZvdXQsIHRibF9oZHIsIHByb2d2ZXJzKTsKKworCQlpZiAobnVsbHByb2ModnAtPnByb2NzKSkgeworCQkJZXhwZWN0ZWQgPSAwOworCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgPSAxOworCQkJZl9wcmludChmb3V0LCBudWxsX2VudHJ5KTsKKwkJfQorCQlmb3IgKHByb2MgPSB2cC0+cHJvY3M7IHByb2MgIT0gTlVMTDsgcHJvYyA9IHByb2MtPm5leHQpIHsKKwkJCWN1cnJlbnQgPSBhdG9pKHByb2MtPnByb2NfbnVtKTsKKwkJCWlmIChjdXJyZW50ICE9IGV4cGVjdGVkKyspIHsKKwkJCQlmX3ByaW50KGZvdXQsCisJCQkiXG4vKlxuICogV0FSTklORzogdGFibGUgb3V0IG9mIG9yZGVyXG4gKi9cbiIpOworCQkJCWlmICh3YXJuaW5nID09IDApIHsKKwkJCQkJZl9wcmludChzdGRlcnIsCisJCQkJICAgICJXQVJOSU5HICVzIHRhYmxlIGlzIG91dCBvZiBvcmRlclxuIiwKKwkJCQkJICAgIHByb2d2ZXJzKTsKKwkJCQkJd2FybmluZyA9IDE7CisJCQkJCW5vbmZhdGFsZXJyb3JzID0gMTsKKwkJCQl9CisJCQkJZXhwZWN0ZWQgPSBjdXJyZW50ICsgMTsKKwkJCX0KKwkJCWZfcHJpbnQoZm91dCwgIlxuXHQoY2hhciAqKCopKCkpUlBDR0VOX0FDVElPTigiKTsKKworCQkJLyogcm91dGluZSB0byBpbnZva2UgKi8KKwkJCWlmKCBDZmxhZyAmJiAhbmV3c3R5bGUgKQorCQkJICBwdm5hbWVfc3ZjKHByb2MtPnByb2NfbmFtZSwgdnAtPnZlcnNfbnVtKTsKKwkJCWVsc2UgeworCQkJICBpZiggbmV3c3R5bGUgKQorCQkJICAgIGZfcHJpbnQoIGZvdXQsICJfIik7ICAgLyogY2FsbHMgaW50ZXJuYWwgZnVuYyAqLworCQkJICBwdm5hbWUocHJvYy0+cHJvY19uYW1lLCB2cC0+dmVyc19udW0pOworCQkJfQorCQkJZl9wcmludChmb3V0LCAiKSxcbiIpOworCisJCQkvKiBhcmd1bWVudCBpbmZvICovCisJCQlpZiggcHJvYy0+YXJnX251bSA+IDEgKQorCQkJICBwcmludGl0KChjaGFyKikgTlVMTCwgcHJvYy0+YXJncy5hcmduYW1lICk7CisJCQllbHNlICAKKwkJCSAgLyogZG8gd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgc3BlY2lhbCBmb3IgbmV3c3R5bGUgKi8KKwkJCSAgcHJpbnRpdCggcHJvYy0+YXJncy5kZWNscy0+ZGVjbC5wcmVmaXgsCisJCQkJICBwcm9jLT5hcmdzLmRlY2xzLT5kZWNsLnR5cGUgKTsKKwkJCS8qIHJlc3VsdCBpbmZvICovCisJCQlwcmludGl0KHByb2MtPnJlc19wcmVmaXgsIHByb2MtPnJlc190eXBlKTsKKwkJfQorCisJCS8qIHByaW50IHRoZSB0YWJsZSB0cmFpbGVyICovCisJCWZfcHJpbnQoZm91dCwgdGJsX2VuZCk7CisJCWZfcHJpbnQoZm91dCwgdGJsX25wcm9jLCBwcm9ndmVycywgcHJvZ3ZlcnMsIHByb2d2ZXJzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludGl0KGNoYXIgKnByZWZpeCwgY2hhciAqdHlwZSkKK3sKKwlpbnQgbGVuOworCWludCB0YWJzOworCisKKyAJbGVuID0gZnByaW50Zihmb3V0LCAiXHR4ZHJfJXMsIiwgc3RyaW5nZml4KHR5cGUpKTsKKwkvKiBhY2NvdW50IGZvciBsZWFkaW5nIHRhYiBleHBhbnNpb24gKi8KKwlsZW4gKz0gVEFCU0laRSAtIDE7CisJLyogcm91bmQgdXAgdG8gdGFicyByZXF1aXJlZCAqLworCXRhYnMgPSAoVEFCU1RPUCAtIGxlbiArIFRBQlNJWkUgLSAxKS9UQUJTSVpFOworCWZfcHJpbnQoZm91dCwgIiVzIiwgJnRhYnN0cltUQUJDT1VOVC10YWJzXSk7CisKKwlpZiAoc3RyZXEodHlwZSwgInZvaWQiKSkgeworCQlmX3ByaW50KGZvdXQsICIwIik7CisJfSBlbHNlIHsKKwkJZl9wcmludChmb3V0LCAic2l6ZW9mICggIik7CisJCS8qIFhYWDogc2hvdWxkICJmb2xsb3ciIGJlIDEgPz8/ICovCisJCXB0eXBlKHByZWZpeCwgdHlwZSwgMCk7CisJCWZfcHJpbnQoZm91dCwgIikiKTsKKwl9CisJZl9wcmludChmb3V0LCAiLFxuIik7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY191dGlsLmMgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY191dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3YmU1NwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3V0aWwuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylycGNfdXRpbC5jIDEuMTEgODkvMDIvMjIgKEMpIDE5ODcgU01JIjsKKyNlbmRpZgorCisvKgorICogcnBjX3V0aWwuYywgVXRpbGl0eSByb3V0aW5lcyBmb3IgdGhlIFJQQyBwcm90b2NvbCBjb21waWxlciAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJycGNfc2Nhbi5oIgorI2luY2x1ZGUgInJwY19wYXJzZS5oIgorI2luY2x1ZGUgInJwY191dGlsLmgiCisKK3N0YXRpYyB2b2lkCXByaW50d2hlcmUodm9pZCk7CisKKworI2RlZmluZSBBUkdFWFQgImFyZ3VtZW50IgorCitjaGFyIGN1cmxpbmVbTUFYTElORVNJWkVdOwkvKiBjdXJyZW50IHJlYWQgbGluZSAqLworY2hhciAqd2hlcmUgPSBjdXJsaW5lOwkJLyogY3VycmVudCBwb2ludCBpbiBsaW5lICovCitpbnQgbGluZW51bSA9IDA7CQkvKiBjdXJyZW50IGxpbmUgbnVtYmVyICovCisKK2NoYXIgKmluZmlsZW5hbWU7CQkvKiBpbnB1dCBmaWxlbmFtZSAqLworCisjZGVmaW5lIE5GSUxFUyA3CitjaGFyICpvdXRmaWxlc1tORklMRVNdOwkJLyogb3V0cHV0IGZpbGUgbmFtZXMgKi8KK2ludCBuZmlsZXM7CisKK0ZJTEUgKmZvdXQ7CQkJLyogZmlsZSBwb2ludGVyIG9mIGN1cnJlbnQgb3V0cHV0ICovCitGSUxFICpmaW47CQkJLyogZmlsZSBwb2ludGVyIG9mIGN1cnJlbnQgaW5wdXQgKi8KKworbGlzdCAqZGVmaW5lZDsJCQkvKiBsaXN0IG9mIGRlZmluZWQgdGhpbmdzICovCisKKy8qCisgKiBSZWluaXRpYWxpemUgdGhlIHdvcmxkIAorICovCit2b2lkCityZWluaXRpYWxpemUodm9pZCkKK3sKKwltZW1zZXQoY3VybGluZSwgMCwgTUFYTElORVNJWkUpOworCXdoZXJlID0gY3VybGluZTsKKwlsaW5lbnVtID0gMDsKKwlkZWZpbmVkID0gTlVMTDsKK30KKworLyoKKyAqIHN0cmluZyBlcXVhbGl0eSAKKyAqLworaW50CitzdHJlcShjaGFyICphLCBjaGFyICpiKQoreworCXJldHVybiAoc3RyY21wKGEsIGIpID09IDApOworfQorCisvKgorICogZmluZCBhIHZhbHVlIGluIGEgbGlzdCAKKyAqLworZGVmaW5pdGlvbiAqCitmaW5kdmFsKGxpc3QgKmxzdCwgY2hhciAqdmFsLCBpbnQgKCpjbXApKGRlZmluaXRpb24gKiwgY2hhciAqKSkKK3sKKyAgICAgICAgIAorCWZvciAoOyBsc3QgIT0gTlVMTDsgbHN0ID0gbHN0LT5uZXh0KSB7CisJCWlmICgoKmNtcCkgKGxzdC0+dmFsLCB2YWwpKSB7CisJCQlyZXR1cm4gKGxzdC0+dmFsKTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisvKgorICogc3RvcmUgYSB2YWx1ZSBpbiBhIGxpc3QgCisgKi8KK3ZvaWQKK3N0b3JldmFsKGxzdHAsIHZhbCkKKwlsaXN0ICoqbHN0cDsKKwlkZWZpbml0aW9uICp2YWw7Cit7CisJbGlzdCAqKmw7CisJbGlzdCAqbHN0OworCisJCisJZm9yIChsID0gbHN0cDsgKmwgIT0gTlVMTDsgbCA9IChsaXN0ICoqKSAmICgqbCktPm5leHQpOworCWxzdCA9IEFMTE9DKGxpc3QpOworCWxzdC0+dmFsID0gdmFsOworCWxzdC0+bmV4dCA9IE5VTEw7CisJKmwgPSBsc3Q7Cit9CisKK3N0YXRpYyBpbnQKK2ZpbmRpdChkZWZpbml0aW9uICpkZWYsIGNoYXIgKnR5cGUpCit7CisJcmV0dXJuIChzdHJlcShkZWYtPmRlZl9uYW1lLCB0eXBlKSk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2ZpeGl0KGNoYXIgKnR5cGUsIGNoYXIgKm9yaWcpCit7CisJZGVmaW5pdGlvbiAqZGVmOworCisJZGVmID0gKGRlZmluaXRpb24gKikgRklORFZBTChkZWZpbmVkLCB0eXBlLCBmaW5kaXQpOworCWlmIChkZWYgPT0gTlVMTCB8fCBkZWYtPmRlZl9raW5kICE9IERFRl9UWVBFREVGKSB7CisJCXJldHVybiAob3JpZyk7CisJfQorCXN3aXRjaCAoZGVmLT5kZWYudHkucmVsKSB7CisJY2FzZSBSRUxfVkVDVE9SOgorCQlyZXR1cm4gKGRlZi0+ZGVmLnR5Lm9sZF90eXBlKTsKKwljYXNlIFJFTF9BTElBUzoKKwkJcmV0dXJuIChmaXhpdChkZWYtPmRlZi50eS5vbGRfdHlwZSwgb3JpZykpOworCWRlZmF1bHQ6CisJCXJldHVybiAob3JpZyk7CisJfQorfQorCitjaGFyICoKK2ZpeHR5cGUoY2hhciAqdHlwZSkKK3sKKwlyZXR1cm4gKGZpeGl0KHR5cGUsIHR5cGUpKTsKK30KKworY2hhciAqCitzdHJpbmdmaXgoY2hhciAqdHlwZSkKK3sKKwlpZiAoc3RyZXEodHlwZSwgInN0cmluZyIpKSB7CisJCXJldHVybiAoIndyYXBzdHJpbmciKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gKHR5cGUpOworCX0KK30KKwordm9pZAorcHR5cGUoY2hhciAqcHJlZml4LCBjaGFyICp0eXBlLCBpbnQgZm9sbG93KQoreworCWlmIChwcmVmaXggIT0gTlVMTCkgeworCQlpZiAoc3RyZXEocHJlZml4LCAiZW51bSIpKSB7CisJCQlmX3ByaW50KGZvdXQsICJlbnVtICIpOworCQl9IGVsc2UgeworCQkJZl9wcmludChmb3V0LCAic3RydWN0ICIpOworCQl9CisJfQorCWlmIChzdHJlcSh0eXBlLCAiYm9vbCIpKSB7CisJCWZfcHJpbnQoZm91dCwgImJvb2xfdCAiKTsKKwl9IGVsc2UgaWYgKHN0cmVxKHR5cGUsICJzdHJpbmciKSkgeworCQlmX3ByaW50KGZvdXQsICJjaGFyICoiKTsKKwl9IGVsc2UgeworCQlmX3ByaW50KGZvdXQsICIlcyAiLCBmb2xsb3cgPyBmaXh0eXBlKHR5cGUpIDogdHlwZSk7CisJfQorfQorCitzdGF0aWMgaW50Cit0eXBlZGVmZWQoZGVmaW5pdGlvbiAqZGVmLCBjaGFyICp0eXBlKQoreworCWlmIChkZWYtPmRlZl9raW5kICE9IERFRl9UWVBFREVGIHx8IGRlZi0+ZGVmLnR5Lm9sZF9wcmVmaXggIT0gTlVMTCkgeworCQlyZXR1cm4gKDApOworCX0gZWxzZSB7CisJCXJldHVybiAoc3RyZXEoZGVmLT5kZWZfbmFtZSwgdHlwZSkpOworCX0KK30KKworaW50Citpc3ZlY3RvcmRlZihjaGFyICp0eXBlLCByZWxhdGlvbiByZWwpCit7CisJZGVmaW5pdGlvbiAqZGVmOworCisJZm9yICg7OykgeworCQlzd2l0Y2ggKHJlbCkgeworCQljYXNlIFJFTF9WRUNUT1I6CisJCQlyZXR1cm4gKCFzdHJlcSh0eXBlLCAic3RyaW5nIikpOworCQljYXNlIFJFTF9BUlJBWToKKwkJCXJldHVybiAoMCk7CisJCWNhc2UgUkVMX1BPSU5URVI6CisJCQlyZXR1cm4gKDApOworCQljYXNlIFJFTF9BTElBUzoKKwkJCWRlZiA9IChkZWZpbml0aW9uICopIEZJTkRWQUwoZGVmaW5lZCwgdHlwZSwgdHlwZWRlZmVkKTsKKwkJCWlmIChkZWYgPT0gTlVMTCkgeworCQkJCXJldHVybiAoMCk7CisJCQl9CisJCQl0eXBlID0gZGVmLT5kZWYudHkub2xkX3R5cGU7CisJCQlyZWwgPSBkZWYtPmRlZi50eS5yZWw7CisJCX0KKwl9Cit9CisKK2NoYXIgKgorbG9jYXNlKGNoYXIgKnN0cikKK3sKKwljaGFyIGM7CisJc3RhdGljIGNoYXIgYnVmWzEwMF07CisJY2hhciAqcCA9IGJ1ZjsKKworCXdoaWxlICgoYyA9ICpzdHIrKykgIT0gJ1wwJykgeworCQkqcCsrID0gKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSA/IChjIC0gJ0EnICsgJ2EnKSA6IGM7CisJfQorCSpwID0gMDsKKwlyZXR1cm4gKGJ1Zik7Cit9CisKK3ZvaWQKK3B2bmFtZV9zdmMoY2hhciAqcG5hbWUsIGNoYXIgKnZudW0pCit7CisJZl9wcmludChmb3V0LCAiJXNfJXNfc3ZjIiwgbG9jYXNlKHBuYW1lKSwgdm51bSk7Cit9CisKK3ZvaWQKK3B2bmFtZShjaGFyICpwbmFtZSwgY2hhciAqdm51bSkKK3sKKwlmX3ByaW50KGZvdXQsICIlc18lcyIsIGxvY2FzZShwbmFtZSksIHZudW0pOworfQorCisvKgorICogcHJpbnQgYSB1c2VmdWwgKD8pIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGVuIGRpZSAKKyAqLwordm9pZAorZXJyb3IoY2hhciAqbXNnKQoreworCXByaW50d2hlcmUoKTsKKwlmX3ByaW50KHN0ZGVyciwgIiVzLCBsaW5lICVkOiAiLCBpbmZpbGVuYW1lLCBsaW5lbnVtKTsKKwlmX3ByaW50KHN0ZGVyciwgIiVzXG4iLCBtc2cpOworCWNyYXNoKCk7Cit9CisKKy8qCisgKiBTb21ldGhpbmcgd2VudCB3cm9uZywgdW5saW5rIGFueSBmaWxlcyB0aGF0IHdlIG1heSBoYXZlIGNyZWF0ZWQgYW5kIHRoZW4KKyAqIGRpZS4gCisgKi8KK3ZvaWQKK2NyYXNoKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmZpbGVzOyBpKyspIHsKKwkJKHZvaWQpIHVubGluayhvdXRmaWxlc1tpXSk7CisJfQorCWV4aXQoMSk7Cit9CisKK3ZvaWQKK3JlY29yZF9vcGVuKGNoYXIgKmZpbGUpCit7CisJaWYgKG5maWxlcyA8IE5GSUxFUykgeworCQlvdXRmaWxlc1tuZmlsZXMrK10gPSBmaWxlOworCX0gZWxzZSB7CisJCWZfcHJpbnQoc3RkZXJyLCAidG9vIG1hbnkgZmlsZXMhXG4iKTsKKwkJY3Jhc2goKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyIGV4cGVjdGJ1ZlsxMDBdOworc3RhdGljIGNoYXIgKnRva3Rvc3RyKCk7CisKKy8qCisgKiBlcnJvciwgdG9rZW4gZW5jb3VudGVyZWQgd2FzIG5vdCB0aGUgZXhwZWN0ZWQgb25lIAorICovCit2b2lkCitleHBlY3RlZDEoZXhwMSkKKwl0b2tfa2luZCBleHAxOworeworCXNfcHJpbnQoZXhwZWN0YnVmLCAiZXhwZWN0ZWQgJyVzJyIsCisJCXRva3Rvc3RyKGV4cDEpKTsKKwllcnJvcihleHBlY3RidWYpOworfQorCisvKgorICogZXJyb3IsIHRva2VuIGVuY291bnRlcmVkIHdhcyBub3Qgb25lIG9mIHR3byBleHBlY3RlZCBvbmVzIAorICovCit2b2lkCitleHBlY3RlZDIoZXhwMSwgZXhwMikKKwl0b2tfa2luZCBleHAxLCBleHAyOworeworCXNfcHJpbnQoZXhwZWN0YnVmLCAiZXhwZWN0ZWQgJyVzJyBvciAnJXMnIiwKKwkJdG9rdG9zdHIoZXhwMSksCisJCXRva3Rvc3RyKGV4cDIpKTsKKwllcnJvcihleHBlY3RidWYpOworfQorCisvKgorICogZXJyb3IsIHRva2VuIGVuY291bnRlcmVkIHdhcyBub3Qgb25lIG9mIDMgZXhwZWN0ZWQgb25lcyAKKyAqLwordm9pZAorZXhwZWN0ZWQzKGV4cDEsIGV4cDIsIGV4cDMpCisJdG9rX2tpbmQgZXhwMSwgZXhwMiwgZXhwMzsKK3sKKwlzX3ByaW50KGV4cGVjdGJ1ZiwgImV4cGVjdGVkICclcycsICclcycgb3IgJyVzJyIsCisJCXRva3Rvc3RyKGV4cDEpLAorCQl0b2t0b3N0cihleHAyKSwKKwkJdG9rdG9zdHIoZXhwMykpOworCWVycm9yKGV4cGVjdGJ1Zik7Cit9CisKK3ZvaWQKK3RhYmlmeShmLCB0YWIpCisJRklMRSAqZjsKKwlpbnQgdGFiOworeworCXdoaWxlICh0YWItLSkgeworCQkodm9pZCkgZnB1dGMoJ1x0JywgZik7CisJfQorfQorCisKK3N0YXRpYyB0b2tlbiB0b2tzdHJpbmdzW10gPSB7CisJCQkgICAgIHtUT0tfSURFTlQsICJpZGVudGlmaWVyIn0sCisJCQkgICAgIHtUT0tfQ09OU1QsICJjb25zdCJ9LAorCQkJICAgICB7VE9LX1JQQVJFTiwgIikifSwKKwkJCSAgICAge1RPS19MUEFSRU4sICIoIn0sCisJCQkgICAgIHtUT0tfUkJSQUNFLCAifSJ9LAorCQkJICAgICB7VE9LX0xCUkFDRSwgInsifSwKKwkJCSAgICAge1RPS19MQlJBQ0tFVCwgIlsifSwKKwkJCSAgICAge1RPS19SQlJBQ0tFVCwgIl0ifSwKKwkJCSAgICAge1RPS19TVEFSLCAiKiJ9LAorCQkJICAgICB7VE9LX0NPTU1BLCAiLCJ9LAorCQkJICAgICB7VE9LX0VRVUFMLCAiPSJ9LAorCQkJICAgICB7VE9LX0NPTE9OLCAiOiJ9LAorCQkJICAgICB7VE9LX1NFTUlDT0xPTiwgIjsifSwKKwkJCSAgICAge1RPS19VTklPTiwgInVuaW9uIn0sCisJCQkgICAgIHtUT0tfU1RSVUNULCAic3RydWN0In0sCisJCQkgICAgIHtUT0tfU1dJVENILCAic3dpdGNoIn0sCisJCQkgICAgIHtUT0tfQ0FTRSwgImNhc2UifSwKKwkJCSAgICAge1RPS19ERUZBVUxULCAiZGVmYXVsdCJ9LAorCQkJICAgICB7VE9LX0VOVU0sICJlbnVtIn0sCisJCQkgICAgIHtUT0tfVFlQRURFRiwgInR5cGVkZWYifSwKKwkJCSAgICAge1RPS19JTlQsICJpbnQifSwKKwkJCSAgICAge1RPS19TSE9SVCwgInNob3J0In0sCisJCQkgICAgIHtUT0tfSU5UMzIsICJpbnQzMiJ9LAorCQkJICAgICB7VE9LX1VOU0lHTkVELCAidW5zaWduZWQifSwKKwkJCSAgICAge1RPS19ET1VCTEUsICJkb3VibGUifSwKKwkJCSAgICAge1RPS19GTE9BVCwgImZsb2F0In0sCisJCQkgICAgIHtUT0tfQ0hBUiwgImNoYXIifSwKKwkJCSAgICAge1RPS19TVFJJTkcsICJzdHJpbmcifSwKKwkJCSAgICAge1RPS19PUEFRVUUsICJvcGFxdWUifSwKKwkJCSAgICAge1RPS19CT09MLCAiYm9vbCJ9LAorCQkJICAgICB7VE9LX1ZPSUQsICJ2b2lkIn0sCisJCQkgICAgIHtUT0tfUFJPR1JBTSwgInByb2dyYW0ifSwKKwkJCSAgICAge1RPS19WRVJTSU9OLCAidmVyc2lvbiJ9LAorCQkJICAgICB7VE9LX0VPRiwgIj8/Pz8/PyJ9Cit9OworCitzdGF0aWMgY2hhciAqCit0b2t0b3N0cihraW5kKQorCXRva19raW5kIGtpbmQ7Cit7CisJdG9rZW4gKnNwOworCisJZm9yIChzcCA9IHRva3N0cmluZ3M7IHNwLT5raW5kICE9IFRPS19FT0YgJiYgc3AtPmtpbmQgIT0ga2luZDsgc3ArKyk7CisJcmV0dXJuIChzcC0+c3RyKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50YnVmKHZvaWQpCit7CisJY2hhciBjOworCWludCBpOworCWludCBjbnQ7CisKKyMJZGVmaW5lIFRBQlNJWkUgNAorCisJZm9yIChpID0gMDsgKGMgPSBjdXJsaW5lW2ldKSAhPSAnXDAnOyBpKyspIHsKKwkJaWYgKGMgPT0gJ1x0JykgeworCQkJY250ID0gOCAtIChpICUgVEFCU0laRSk7CisJCQljID0gJyAnOworCQl9IGVsc2UgeworCQkJY250ID0gMTsKKwkJfQorCQl3aGlsZSAoY250LS0pIHsKKwkJCSh2b2lkKSBmcHV0YyhjLCBzdGRlcnIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnR3aGVyZSh2b2lkKQoreworCWludCBpOworCWNoYXIgYzsKKwlpbnQgY250OworCisJcHJpbnRidWYoKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2hlcmUgLSBjdXJsaW5lOyBpKyspIHsKKwkJYyA9IGN1cmxpbmVbaV07CisJCWlmIChjID09ICdcdCcpIHsKKwkJCWNudCA9IDggLSAoaSAlIFRBQlNJWkUpOworCQl9IGVsc2UgeworCQkJY250ID0gMTsKKwkJfQorCQl3aGlsZSAoY250LS0pIHsKKwkJCSh2b2lkKSBmcHV0YygnXicsIHN0ZGVycik7CisJCX0KKwl9CisJKHZvaWQpIGZwdXRjKCdcbicsIHN0ZGVycik7Cit9CisKK2NoYXIgKiAKK21ha2VfYXJnbmFtZShjaGFyICpwbmFtZSwgY2hhciAqdm5hbWUpIAoreworCWNoYXIgKm5hbWU7CisJCisJbmFtZSA9IG1hbGxvYyhzdHJsZW4ocG5hbWUpICsgc3RybGVuKHZuYW1lKSArIHN0cmxlbihBUkdFWFQpICsgMyk7CisJaWYgKCFuYW1lKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIGluIG1hbGxvYyIpOworCQlleGl0KDEpOworCX0KKwlzcHJpbnRmKG5hbWUsICIlc18lc18lcyIsIGxvY2FzZShwbmFtZSksIHZuYW1lLCBBUkdFWFQpOworCXJldHVybihuYW1lKTsKK30KKworYmFzX3R5cGUgKnR5cF9saXN0X2g7CitiYXNfdHlwZSAqdHlwX2xpc3RfdDsKKwordm9pZAorYWRkX3R5cGUoaW50IGxlbiwgY2hhciAqdHlwZSkKK3sKKwliYXNfdHlwZSAgICAgICAqcHRyOworCisKKwlpZiAoKHB0ciA9IChiYXNfdHlwZSAqKSBtYWxsb2Moc2l6ZW9mKGJhc190eXBlKSkpID09IChiYXNfdHlwZSAqKSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkIGluIG1hbGxvYyIpOworCQlleGl0KDEpOworCX0KKwlwdHItPm5hbWUgPSB0eXBlOworCXB0ci0+bGVuZ3RoID0gbGVuOworCXB0ci0+bmV4dCA9IE5VTEw7CisJaWYgKHR5cF9saXN0X3QgPT0gTlVMTCkgeworCisJCXR5cF9saXN0X3QgPSBwdHI7CisJCXR5cF9saXN0X2ggPSBwdHI7CisJfSBlbHNlIHsKKworCQl0eXBfbGlzdF90LT5uZXh0ID0gcHRyOworCQl0eXBfbGlzdF90ID0gcHRyOworCX0KK30KKworCitiYXNfdHlwZSAqCitmaW5kX3R5cGUoY2hhciAqdHlwZSkKK3sKKwliYXNfdHlwZSAgICAgICAqcHRyOworCisJcHRyID0gdHlwX2xpc3RfaDsKKworCisJd2hpbGUgKHB0ciAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAocHRyLT5uYW1lLCB0eXBlKSA9PSAwKQorCQkJcmV0dXJuIChwdHIpOworCQllbHNlCisJCQlwdHIgPSBwdHItPm5leHQ7CisJfTsKKwlyZXR1cm4gKE5VTEwpOworfQorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY191dGlsLmggYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY191dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExMTViZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjX3V0aWwuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogICAgICBAKCMpcnBjX3V0aWwuaCAgMS41ICA5MC8wOC8yOSAgKEMpIDE5ODcgU01JICAgKi8KKworLyoKKyAqIHJwY191dGlsLmgsIFVzZWZ1bCBkZWZpbml0aW9ucyBmb3IgdGhlIFJQQyBwcm90b2NvbCBjb21waWxlciAKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgYWxsb2Moc2l6ZSkJCW1hbGxvYygodW5zaWduZWQpKHNpemUpKQorI2RlZmluZSBBTExPQyhvYmplY3QpICAgKG9iamVjdCAqKSBtYWxsb2Moc2l6ZW9mKG9iamVjdCkpCisKKyNkZWZpbmUgc19wcmludAkodm9pZCkgc3ByaW50ZgorI2RlZmluZSBmX3ByaW50ICh2b2lkKSBmcHJpbnRmCisKK3N0cnVjdCBsaXN0IHsKKwlkZWZpbml0aW9uICp2YWw7CisJc3RydWN0IGxpc3QgKm5leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbGlzdCBsaXN0OworCisjZGVmaW5lIFBVVCAxCisjZGVmaW5lIEdFVCAyCisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzIAorICovCisjZGVmaW5lIE1BWExJTkVTSVpFIDEwMjQKK2V4dGVybiBjaGFyIGN1cmxpbmVbTUFYTElORVNJWkVdOworZXh0ZXJuIGNoYXIgKndoZXJlOworZXh0ZXJuIGludCBsaW5lbnVtOworCitleHRlcm4gY2hhciAqaW5maWxlbmFtZTsKK2V4dGVybiBGSUxFICpmb3V0OworZXh0ZXJuIEZJTEUgKmZpbjsKKworZXh0ZXJuIGxpc3QgKmRlZmluZWQ7CisKKworZXh0ZXJuIGJhc190eXBlICp0eXBfbGlzdF9oOworZXh0ZXJuIGJhc190eXBlICp0eXBfbGlzdF90OworCisvKgorICogQWxsIHRoZSBvcHRpb24gZmxhZ3MKKyAqLworZXh0ZXJuIGludCBpbmV0ZGZsYWc7CitleHRlcm4gaW50IHBtZmxhZzsgICAKK2V4dGVybiBpbnQgdGJsZmxhZzsKK2V4dGVybiBpbnQgbG9nZmxhZzsKK2V4dGVybiBpbnQgbmV3c3R5bGU7CitleHRlcm4gaW50IENmbGFnOwkvKiBDKysgZmxhZyAqLworZXh0ZXJuIGludCB0aXJwY2ZsYWc7CS8qIGZsYWcgZm9yIGdlbmVyYXRpbmcgdGlycGMgY29kZSAqLworZXh0ZXJuIGludCBJbmxpbmU7CS8qIGlmIHRoaXMgaXMgMCwgdGhlbiBkbyBub3QgZ2VuZXJhdGUgaW5saW5lIGNvZGUgKi8KKworLyoKKyAqIE90aGVyIGZsYWdzIHJlbGF0ZWQgd2l0aCBpbmV0ZCBqdW1wc3RhcnQuCisgKi8KK2V4dGVybiBpbnQgaW5kZWZpbml0ZXdhaXQ7CitleHRlcm4gaW50IGV4aXRub3c7CitleHRlcm4gaW50IHRpbWVyZmxhZzsKKworZXh0ZXJuIGludCBub25mYXRhbGVycm9yczsKKworLyoKKyAqIHJwY191dGlsIHJvdXRpbmVzIAorICovCit2b2lkIHN0b3JldmFsKCk7CisKKyNkZWZpbmUgU1RPUkVWQUwobGlzdCxpdGVtKQlcCisJc3RvcmV2YWwobGlzdCxpdGVtKQorCitkZWZpbml0aW9uICpmaW5kdmFsKCk7CisKKyNkZWZpbmUgRklORFZBTChsaXN0LGl0ZW0sZmluZGVyKSBcCisJZmluZHZhbChsaXN0LCBpdGVtLCBmaW5kZXIpCisKKworLyoKKyAqIHJwY19jb3V0IHJvdXRpbmVzCisgKi8KK3ZvaWQgICAgICAgICAgICBjcHJpbnQodm9pZCk7Cit2b2lkICAgICAgICAgICAgZW1pdChkZWZpbml0aW9uICopOworCisvKgorICogcnBjX2hvdXQgcm91dGluZXMKKyAqLwordm9pZCAgICAgICAgICAgIHByaW50X2RhdGFkZWYoZGVmaW5pdGlvbiAqKTsKK3ZvaWQgICAgICAgICAgICBwcmludF9mdW5jZGVmKGRlZmluaXRpb24gKik7CisKKy8qCisgKiBycGNfc3Zjb3V0IHJvdXRpbmVzCisgKi8KK3ZvaWQgICAgICAgICAgICB3cml0ZV9tb3N0KGNoYXIgKiwgaW50LCBpbnQpOwordm9pZCAgICAgICAgICAgIHdyaXRlX3JlZ2lzdGVyKHZvaWQpOwordm9pZAkJd3JpdGVfbmV0aWRfcmVnaXN0ZXIoY2hhciAqKTsKK3ZvaWQJCXdyaXRlX25ldHR5cGVfcmVnaXN0ZXIoY2hhciAqKTsKK3ZvaWQJCXdyaXRlX2luZXRkX3JlZ2lzdGVyKGNoYXIgKik7Cit2b2lkICAgICAgICAgICAgd3JpdGVfcmVzdCh2b2lkKTsKK3ZvaWQgICAgICAgICAgICB3cml0ZV9wcm9ncmFtcyhjaGFyICopOwordm9pZCAgICAgICAgICAgIHdyaXRlX3N2Y19hdXgoaW50KTsKKworLyoKKyAqIHJwY19jbG50b3V0IHJvdXRpbmVzCisgKi8KK3ZvaWQgICAgICAgICAgICB3cml0ZV9zdHVicyh2b2lkKTsKK3ZvaWQJCXByaW50YXJnbGlzdChwcm9jX2xpc3QgKiwgY2hhciAqLCBjaGFyICopOworCisvKgorICogcnBjX3RibG91dCByb3V0aW5lcworICovCit2b2lkICAgICAgICAgICAgd3JpdGVfdGFibGVzKHZvaWQpOworCisvKgorICogcnBjX3V0aWwKKyAqLwordm9pZCAgICAgICAgICAgIHB2bmFtZV9zdmMoY2hhciAqLCBjaGFyICopOwordm9pZCAgICAgICAgICAgIHB2bmFtZShjaGFyICosIGNoYXIgKik7Cit2b2lkICAgICAgICAgICAgcHR5cGUoY2hhciAqLCBjaGFyICosIGludCk7CitjaGFyICoJCW1ha2VfYXJnbmFtZShjaGFyICosIGNoYXIgKik7Cit2b2lkCQlhZGRfdHlwZShpbnQsIGNoYXIgKik7Cit2b2lkCQlyZWluaXRpYWxpemUodm9pZCk7Cit2b2lkCQljcmFzaCh2b2lkKTsKK3ZvaWQJCWVycm9yKGNoYXIgKik7CitjaGFyICAgICAgICAgICAqZml4dHlwZShjaGFyICopOworY2hhciAgICAgICAgICAgKnN0cmluZ2ZpeChjaGFyICopOworY2hhciAgICAgICAgICAgKmxvY2FzZShjaGFyICopOworaW50ICAgICAgICAgICAgIGlzdmVjdG9yZGVmKGNoYXIgKiwgcmVsYXRpb24pOworaW50ICAgICAgICAgICAgIHN0cmVxKGNoYXIgKiwgY2hhciAqKTsKK3ZvaWQgICAgICAgICAgICB0YWJpZnkoRklMRSAqLCBpbnQpOwordm9pZCAgICAgICAgICAgIHJlY29yZF9vcGVuKGNoYXIgKik7CitiYXNfdHlwZSAgICAgICAqZmluZF90eXBlKGNoYXIgKnR5cGUpOworCisvKgorICogcnBjX3NhbXBsZQorICovCit2b2lkCQl3cml0ZV9zYW1wbGVfc3ZjKGRlZmluaXRpb24gKik7CitpbnQJCXdyaXRlX3NhbXBsZV9jbG50KGRlZmluaXRpb24gKik7Cit2b2lkCQl3cml0ZV9zYW1wbGVfY2xudF9tYWluKHZvaWQpOwordm9pZAkJYWRkX3NhbXBsZV9tc2codm9pZCk7CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY2dlbi5uZXcuMSBiL25mcy11dGlscy0xLjIuMi90b29scy9ycGNnZW4vcnBjZ2VuLm5ldy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDg5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdG9vbHMvcnBjZ2VuL3JwY2dlbi5uZXcuMQpAQCAtMCwwICsxLDQyMiBAQAorLlwiIEAoIylycGNnZW4ubmV3LjEJMS4xIDkwLzExLzA5IFRJUlBDIDEuMDsgZnJvbSA0MC4xMCBvZiAxMC8xMC84OQorLlwiIENvcHlyaWdodCAoYykgMTk4OCwxOTkwIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkLgorLm5yIFgKKy5pZiBcblg9MCAuZHMgeH0gcnBjZ2VuIDEgIiIgIlwmIgorLmlmIFxuWD0xIC5kcyB4fSBycGNnZW4gMSAiIgorLmlmIFxuWD0yIC5kcyB4fSBycGNnZW4gMSAiIiAiXCYiCisuaWYgXG5YPTMgLmRzIHh9IHJwY2dlbiAiIiAiIiAiXCYiCisuVEggXCooeH0KKy5TSCBOQU1FCitcZjRycGNnZW5cZjEgXC0gYW4gUlBDIHByb3RvY29sIGNvbXBpbGVyCisuU0ggU1lOT1BTSVMKKy5mdCA0CisubmYKK3JwY2dlbiBcZjJpbmZpbGVcZjQKKy5maQorLmZ0IDEKKy5icgorLmZ0IDQKKy5uZgorcnBjZ2VuIFtcLURcZjJuYW1lXGY0Wz1cZjJ2YWx1ZVxmNF1dIFtcLVRdIFtcLUsgXGYyc2Vjc1xmUF0gXGYyaW5maWxlXGY0CisuZmkKKy5mdCAxCisuYnIKKy5mdCA0CisubmYKK3JwY2dlbiBcLWN8XC1ofFwtbHxcLW18XC10IFtcLW8gXGYyb3V0ZmlsZVxmNCBdIFxmMmluZmlsZVxmNAorLmZpCisuZnQgMQorLmJyCisuZnQgNAorLm5mCitycGNnZW4gXC1zIFxmMm5ldHR5cGVcZjQgW1wtbyBcZjJvdXRmaWxlXGY0XSBcZjJpbmZpbGVcZjQKKy5maQorLmZ0IDEKKy5icgorLmZ0IDQKKy5uZgorcnBjZ2VuIFwtbiBcZjJuZXRpZFxmNCBbXC1vIFxmMm91dGZpbGVcZjRdIFxmMmluZmlsZVxmNAorLmZ0IDEKKy5TSCBERVNDUklQVElPTgorLlAKK1xmNHJwY2dlblxmMQoraXMgYSB0b29sIHRoYXQgZ2VuZXJhdGVzIEMgY29kZSB0byBpbXBsZW1lbnQgYW4gUlBDIHByb3RvY29sLgorVGhlIGlucHV0IHRvCitcZjRycGNnZW5cZjEKK2lzIGEgbGFuZ3VhZ2Ugc2ltaWxhciB0byBDIGtub3duIGFzCitSUEMgTGFuZ3VhZ2UgKFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBMYW5ndWFnZSkuCisuUAorXGY0cnBjZ2VuXGYxCitpcyBub3JtYWxseSB1c2VkIGFzIGluIHRoZSBmaXJzdCBzeW5vcHNpcyB3aGVyZSAKK2l0IHRha2VzIGFuIGlucHV0IGZpbGUgYW5kIGdlbmVyYXRlcyB1cCB0byBmb3VyIG91dHB1dCBmaWxlcy4KK0lmIHRoZQorXGYyaW5maWxlXGYxCitpcyBuYW1lZAorXGY0cHJvdG8ueFxmMSwKK3RoZW4KK1xmNHJwY2dlblxmMQord2lsbCBnZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGluCitcZjRwcm90by5oXGYxLAorWERSIHJvdXRpbmVzIGluCitcZjRwcm90b194ZHIuY1xmMSwKK3NlcnZlci1zaWRlIHN0dWJzIGluCitcZjRwcm90b19zdmMuY1xmMSwKK2FuZCBjbGllbnQtc2lkZSBzdHVicyBpbgorXGY0cHJvdG9fY2xudC5jXGYxLgorV2l0aCB0aGUKK1xmNFwtVFxmMQorb3B0aW9uLAoraXQgd2lsbCBhbHNvIGdlbmVyYXRlIHRoZSBSUEMgZGlzcGF0Y2ggdGFibGUgaW4KK1xmNHByb3RvX3RibC5pXGYxLgorV2l0aCB0aGUKK1xmNFwtU2NcZjEKK29wdGlvbiwKK2l0IHdpbGwgYWxzbyBnZW5lcmF0ZSAgc2FtcGxlIGNvZGUgd2hpY2ggd291bGQgaWxsdXN0cmF0ZSBob3cgdG8gdXNlIHRoZQorcmVtb3RlIHByb2NlZHVyZXMgb24gdGhlIGNsaWVudCBzaWRlLiBUaGlzIGNvZGUgd291bGQgYmUgY3JlYXRlZCBpbiAKK1xmNHByb3RvX2NsaWVudC5jXGYxLgorV2l0aCB0aGUKK1xmNFwtU3NcZjEKK29wdGlvbiwKK2l0IHdpbGwgYWxzbyBnZW5lcmF0ZSBhIHNhbXBsZSBzZXJ2ZXIgY29kZSB3aGljaCB3b3VsZCBpbGx1c3RyYXRlIGhvdyB0byB3cml0ZQordGhlIHJlbW90ZSBwcm9jZWR1cmVzLiBUaGlzIGNvZGUgd291bGQgYmUgY3JlYXRlZCBpbiAKK1xmNHByb3RvX3NlcnZlci5jXGYxLgorLlAKK1RoZSBzZXJ2ZXIgY3JlYXRlZCBjYW4gYmUgc3RhcnRlZCBib3RoIGJ5IHRoZSBwb3J0IG1vbml0b3JzCisoZm9yIGV4YW1wbGUsIFxmNGluZXRkXGYxIG9yIFxmNGxpc3RlblxmMSkKK29yIGJ5IGl0c2VsZi4KK1doZW4gaXQgaXMgc3RhcnRlZCBieSBhIHBvcnQgbW9uaXRvciwKK2l0IGNyZWF0ZXMgc2VydmVycyBvbmx5IGZvciB0aGUgdHJhbnNwb3J0IGZvciB3aGljaCAKK3RoZSBmaWxlIGRlc2NyaXB0b3IgXGY0MFxmUCB3YXMgcGFzc2VkLgorVGhlIG5hbWUgb2YgdGhlIHRyYW5zcG9ydCBtdXN0IGJlIHNwZWNpZmllZAorYnkgc2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQorXGY0UE1fVFJBTlNQT1JUXGYxLgorV2hlbiB0aGUgc2VydmVyIGdlbmVyYXRlZCBieQorXGY0cnBjZ2VuXGYxCitpcyBleGVjdXRlZCwKK2l0IGNyZWF0ZXMgc2VydmVyIGhhbmRsZXMgZm9yIGFsbCB0aGUgdHJhbnNwb3J0cworc3BlY2lmaWVkIGluCitcZjRORVRQQVRIXGYxCitlbnZpcm9ubWVudCB2YXJpYWJsZSwKK29yIGlmIGl0IGlzIHVuc2V0LAoraXQgY3JlYXRlcyBzZXJ2ZXIgaGFuZGxlcyBmb3IgYWxsIHRoZSB2aXNpYmxlIHRyYW5zcG9ydHMgZnJvbQorXGY0L2V0Yy9uZXRjb25maWdcZjEKK2ZpbGUuCitOb3RlOgordGhlIHRyYW5zcG9ydHMgYXJlIGNob3NlbiBhdCBydW4gdGltZSBhbmQgbm90IGF0IGNvbXBpbGUgdGltZS4KK1doZW4gdGhlIHNlcnZlciBpcyBzZWxmLXN0YXJ0ZWQsCitpdCBiYWNrZ3JvdW5kcyBpdHNlbGYgYnkgZGVmYXVsdC4KK0Egc3BlY2lhbCBkZWZpbmUgc3ltYm9sCitcZjRSUENfU1ZDX0ZHXGYxCitjYW4gYmUgdXNlZCB0byBydW4gdGhlIHNlcnZlciBwcm9jZXNzIGluIGZvcmVncm91bmQuCisuUAorVGhlIHNlY29uZCBzeW5vcHNpcyBwcm92aWRlcyBzcGVjaWFsIGZlYXR1cmVzIHdoaWNoIGFsbG93Citmb3IgdGhlIGNyZWF0aW9uIG9mIG1vcmUgc29waGlzdGljYXRlZCBSUEMgc2VydmVycy4KK1RoZXNlIGZlYXR1cmVzIGluY2x1ZGUgc3VwcG9ydCBmb3IgdXNlciBwcm92aWRlZAorXGY0I2RlZmluZXNcZjEKK2FuZCBSUEMgZGlzcGF0Y2ggdGFibGVzLgorVGhlIGVudHJpZXMgaW4gdGhlIFJQQyBkaXNwYXRjaCB0YWJsZSBjb250YWluOgorLlJTCisuUEQgMAorLlRQIDMKK1woYnUKK3BvaW50ZXJzIHRvIHRoZSBzZXJ2aWNlIHJvdXRpbmUgY29ycmVzcG9uZGluZyB0byB0aGF0IHByb2NlZHVyZSwKKy5UUAorXChidQorYSBwb2ludGVyIHRvIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cworLlRQCitcKGJ1Cit0aGUgc2l6ZSBvZiB0aGVzZSByb3V0aW5lcworLlBECisuUkUKK0Egc2VydmVyIGNhbiB1c2UgdGhlIGRpc3BhdGNoIHRhYmxlIHRvIGNoZWNrIGF1dGhvcml6YXRpb24gCithbmQgdGhlbiB0byBleGVjdXRlIHRoZSBzZXJ2aWNlIHJvdXRpbmU7IAorYSBjbGllbnQgbGlicmFyeSBtYXkgdXNlIGl0IHRvIGRlYWwgd2l0aCB0aGUgZGV0YWlscyBvZiBzdG9yYWdlCittYW5hZ2VtZW50IGFuZCBYRFIgZGF0YSBjb252ZXJzaW9uLgorLlAKK1RoZSBvdGhlciB0aHJlZSBzeW5vcHNlcyBzaG93biBhYm92ZSBhcmUgdXNlZCB3aGVuIAorb25lIGRvZXMgbm90IHdhbnQgdG8gZ2VuZXJhdGUgYWxsIHRoZSBvdXRwdXQgZmlsZXMsCitidXQgb25seSBhIHBhcnRpY3VsYXIgb25lLgorU29tZSBleGFtcGxlcyBvZiB0aGVpciB1c2FnZSBpcyBkZXNjcmliZWQgaW4gdGhlCitFWEFNUExFCitzZWN0aW9uIGJlbG93LgorV2hlbiAKK1xmNHJwY2dlblxmMQoraXMgZXhlY3V0ZWQgd2l0aCB0aGUKK1xmNFwtc1xmMQorb3B0aW9uLAoraXQgY3JlYXRlcyBzZXJ2ZXJzIGZvciB0aGF0IHBhcnRpY3VsYXIgY2xhc3Mgb2YgdHJhbnNwb3J0cy4KK1doZW4KK2V4ZWN1dGVkIHdpdGggdGhlCitcZjRcLW5cZjEKK29wdGlvbiwKK2l0IGNyZWF0ZXMgYSBzZXJ2ZXIgZm9yIHRoZSB0cmFuc3BvcnQgc3BlY2lmaWVkIGJ5CitcZjJuZXRpZFxmMS4KK0lmCitcZjJpbmZpbGVcZjEKK2lzIG5vdCBzcGVjaWZpZWQsCitcZjRycGNnZW5cZjEKK2FjY2VwdHMgdGhlIHN0YW5kYXJkIGlucHV0LgorLlAKK1RoZSBDIHByZXByb2Nlc3NvciwKK1xmNGNjIFwtRVxmMQorW3NlZSBcZjRjY1xmUCgxKV0sCitpcyBydW4gb24gdGhlIGlucHV0IGZpbGUgYmVmb3JlIGl0IGlzIGFjdHVhbGx5IGludGVycHJldGVkIGJ5CitcZjRycGNnZW5cZjEuCitGb3IgZWFjaCB0eXBlIG9mIG91dHB1dCBmaWxlLAorXGY0cnBjZ2VuXGYxCitkZWZpbmVzIGEgc3BlY2lhbCBwcmVwcm9jZXNzb3Igc3ltYm9sIGZvciB1c2UgYnkgdGhlCitcZjRycGNnZW5cZjEKK3Byb2dyYW1tZXI6CisuUAorLlBEIDAKKy5UUCAxMgorXGY0UlBDX0hEUlxmMQorZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBpbnRvIGhlYWRlciBmaWxlcworLlRQCitcZjRSUENfWERSXGYxCitkZWZpbmVkIHdoZW4gY29tcGlsaW5nIGludG8gWERSIHJvdXRpbmVzCisuVFAKK1xmNFJQQ19TVkNcZjEKK2RlZmluZWQgd2hlbiBjb21waWxpbmcgaW50byBzZXJ2ZXItc2lkZSBzdHVicworLlRQCitcZjRSUENfQ0xOVFxmMQorZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBpbnRvIGNsaWVudC1zaWRlIHN0dWJzCisuVFAKK1xmNFJQQ19UQkxcZjEKK2RlZmluZWQgd2hlbiBjb21waWxpbmcgaW50byBSUEMgZGlzcGF0Y2ggdGFibGVzCisuUEQKKy5QCitBbnkgbGluZSBiZWdpbm5pbmcgd2l0aAorYFxmNCVcZjEnCitpcyBwYXNzZWQgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IGZpbGUsCit1bmludGVycHJldGVkIGJ5CitcZjRycGNnZW5cZjEuCisuUAorRm9yIGV2ZXJ5IGRhdGEgdHlwZSByZWZlcnJlZCB0byBpbgorXGYyaW5maWxlXGYxLAorXGY0cnBjZ2VuXGYxCithc3N1bWVzIHRoYXQgdGhlcmUgZXhpc3RzIGEKK3JvdXRpbmUgd2l0aCB0aGUgc3RyaW5nCitcZjR4ZHJfXGYxCitwcmVwZW5kZWQgdG8gdGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZS4KK0lmIHRoaXMgcm91dGluZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgUlBDL1hEUgorbGlicmFyeSwgaXQgbXVzdCBiZSBwcm92aWRlZC4KK1Byb3ZpZGluZyBhbiB1bmRlZmluZWQgZGF0YSB0eXBlCithbGxvd3MgY3VzdG9taXphdGlvbiBvZiBYRFIgcm91dGluZXMuCisuYnIKKy5uZSAxMAorLlAKK1RoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorLlRQCitcZjRcLWFcZjEKK0dlbmVyYXRlIGFsbCB0aGUgZmlsZXMgaW5jbHVkaW5nIHNhbXBsZSBjb2RlIGZvciBjbGllbnQgYW5kIHNlcnZlciBzaWRlLgorLlRQCitcZjRcLWJcZjEKK1RoaXMgZ2VuZXJhdGVzIGNvZGUgZm9yIHRoZSBTdW5PUzQuMSBzdHlsZSBvZiBycGMuIEl0IGlzIG9ubHkKK2ZvciBiYWNrd2FyZCBjb21wYXRpYmlsdHkuIEJ5IGRlZmF1bHQgcnBjZ2VuIGdlbmVyYXRlcyBjb2RlIGZvcgorVHJhbnNwb3J0IEluZGVwZW5kZW50IFJQQyB0aGF0IGlzIGluIFN2cjQgc3lzdGVtcy4KKy5UUAorXGY0XC1jXGYxCitDb21waWxlIGludG8gWERSIHJvdXRpbmVzLgorLlRQCitcZjRcLUNcZjEKK0dlbmVyYXRlIGNvZGUgaW4gQU5TSSBDLiBUaGlzIG9wdGlvbiBhbHNvIGdlbmVyYXRlcyBjb2RlIHRoYXQgY291bGQgYmUKK2NvbXBpbGVkIHdpdGggdGhlIEMrKyBjb21waWxlci4KKy5UUAorXGY0XC1EXGYybmFtZVxmNFs9XGYydmFsdWVcZjRdXGYxCitEZWZpbmUgYSBzeW1ib2wKK1xmMm5hbWVcZjEuCitFcXVpdmFsZW50IHRvIHRoZQorXGY0I2RlZmluZVxmMQorZGlyZWN0aXZlIGluIHRoZSBzb3VyY2UuCitJZiBubworXGYydmFsdWVcZjEKK2lzIGdpdmVuLAorXGYydmFsdWVcZjEKK2lzIGRlZmluZWQgYXMgXGY0MVxmMS4KK1RoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuCisuVFAKK1xmNFwtaFxmMQorQ29tcGlsZSBpbnRvCitcZjRDXGYxCitkYXRhLWRlZmluaXRpb25zIChhIGhlYWRlciBmaWxlKS4KK1xmNFwtVFxmMQorb3B0aW9uIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHRvIHByb2R1Y2UgYSAKK2hlYWRlciBmaWxlIHdoaWNoIHN1cHBvcnRzIFJQQyBkaXNwYXRjaCB0YWJsZXMuCisuVFAKK1xmNC1LXGYyIHNlY3NcZjEKK0J5IGRlZmF1bHQsIHNlcnZpY2VzIGNyZWF0ZWQgdXNpbmcgXGY0cnBjZ2VuXGZQIHdhaXQgXGY0MTIwXGZQIHNlY29uZHMKK2FmdGVyIHNlcnZpY2luZyBhIHJlcXVlc3QgYmVmb3JlIGV4aXRpbmcuCitUaGF0IGludGVydmFsIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIHRoZSBcZjQtS1xmUCBmbGFnLgorVG8gY3JlYXRlIGEgc2VydmVyIHRoYXQgZXhpdHMgaW1tZWRpYXRlbHkgdXBvbiBzZXJ2aWNpbmcgYSByZXF1ZXN0LAorXGY0LUtcIDBcZlAgY2FuIGJlIHVzZWQuCitUbyBjcmVhdGUgYSBzZXJ2ZXIgdGhhdCBuZXZlciBleGl0cywgdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzCitcZjQtS1wgLTFcZlAuCisuSVAKK1doZW4gbW9uaXRvcmluZyBmb3IgYSBzZXJ2ZXIsCitzb21lIHBvcnRtb25pdG9ycywgbGlrZQorXGY0bGlzdGVuXGZQKDFNKSwKKy5JIGFsd2F5cworc3Bhd24gYSBuZXcgcHJvY2VzcyBpbiByZXNwb25zZSB0byBhIHNlcnZpY2UgcmVxdWVzdC4KK0lmIGl0IGlzIGtub3duIHRoYXQgYSBzZXJ2ZXIgd2lsbCBiZSB1c2VkIHdpdGggc3VjaCBhIG1vbml0b3IsIHRoZQorc2VydmVyIHNob3VsZCBleGl0IGltbWVkaWF0ZWx5IG9uIGNvbXBsZXRpb24uCitGb3Igc3VjaCBzZXJ2ZXJzLCBcZjRycGNnZW5cZlAgc2hvdWxkIGJlIHVzZWQgd2l0aCBcZjQtS1wgLTFcZlAuCisuVFAKK1xmNFwtbFxmMQorQ29tcGlsZSBpbnRvIGNsaWVudC1zaWRlIHN0dWJzLgorLlRQCitcZjRcLW1cZjEKK0NvbXBpbGUgaW50byBzZXJ2ZXItc2lkZSBzdHVicywKK2J1dCBkbyBub3QgZ2VuZXJhdGUgYSBcKGxxbWFpblwocnEgcm91dGluZS4KK1RoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgZG9pbmcgY2FsbGJhY2stcm91dGluZXMgCithbmQgZm9yIHVzZXJzIHdobyBuZWVkIHRvIHdyaXRlIHRoZWlyIG93biAKK1wobHFtYWluXChycSByb3V0aW5lIHRvIGRvIGluaXRpYWxpemF0aW9uLgorLlRQCitcZjRcLW4gXGYybmV0aWRcZjEKK0NvbXBpbGUgaW50byBzZXJ2ZXItc2lkZSBzdHVicyBmb3IgdGhlIHRyYW5zcG9ydAorc3BlY2lmaWVkIGJ5CitcZjJuZXRpZFxmMS4KK1RoZXJlIHNob3VsZCBiZSBhbiBlbnRyeSBmb3IKK1xmMm5ldGlkXGYxCitpbiB0aGUKK25ldGNvbmZpZyBkYXRhYmFzZS4KK1RoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UsCitzbyBhcyB0byBjb21waWxlIGEgc2VydmVyIHRoYXQgc2VydmVzIG11bHRpcGxlIHRyYW5zcG9ydHMuCisuVFAKK1xmNFwtTlxmMQorVXNlIHRoZSBuZXdzdHlsZSBvZiBycGNnZW4uIFRoaXMgYWxsb3dzIHByb2NlZHVyZXMgdG8gaGF2ZSBtdWx0aXBsZSBhcmd1bWVudHMuIAorSXQgYWxzbyB1c2VzIHRoZSBzdHlsZSBvZiBwYXJhbWV0ZXIgcGFzc2luZyB0aGF0IGNsb3NlbHkgcmVzZW1ibGVzIEMuIFNvLCB3aGVuIAorcGFzc2luZyBhbiBhcmd1bWVudCB0byBhIHJlbW90ZSBwcm9jZWR1cmUgeW91IGRvIG5vdCBoYXZlIHRvIHBhc3MgYSBwb2ludGVyIHRvCit0aGUgYXJndW1lbnQgYnV0IHRoZSBhcmd1bWVudCBpdHNlbGYuIFRoaXMgYmVoYXZpb3VyIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvbGRzdHlsZQorb2YgcnBjZ2VuIGdlbmVyYXRlZCBjb2RlLiBUaGUgbmV3c3R5bGUgaXMgbm90IHRoZSBkZWZhdWx0IGNhc2UgYmVjYXVzZSBvZiAKK2JhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisuVFAKK1xmNFwtbyBcZjJvdXRmaWxlXGYxCitTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4KK0lmIG5vbmUgaXMgc3BlY2lmaWVkLAorc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQKKyhcZjRcLWNcZjEsCitcZjRcLWhcZjEsCitcZjRcLWxcZjEsCitcZjRcLW1cZjEsCitcZjRcLW5cZjEsCitcZjRcLXNcZjEsCitcZjRcLXNcU2MsCitcZjRcLXNcU3MKK2FuZAorXGY0XC10XGYxCittb2RlcyBvbmx5KS4KKy5UUAorXGY0XC1zIFxmMm5ldHR5cGVcZjEKK0NvbXBpbGUgaW50byBzZXJ2ZXItc2lkZSBzdHVicyBmb3IgYWxsIHRoZSAKK3RyYW5zcG9ydHMgYmVsb25naW5nIHRvIHRoZSBjbGFzcworXGYybmV0dHlwZVxmMS4KK1RoZSBzdXBwb3J0ZWQgY2xhc3NlcyBhcmUKK1xmNG5ldHBhdGhcZjEsCitcZjR2aXNpYmxlXGYxLAorXGY0Y2lyY3VpdF9uXGYxLAorXGY0Y2lyY3VpdF92XGYxLAorXGY0ZGF0YWdyYW1fblxmMSwKK1xmNGRhdGFncmFtX3ZcZjEsCitcZjR0Y3BcZjEsCithbmQKK1xmNHVkcFxmMQorW3NlZSBcZjRycGNcZlAoM04pCitmb3IgdGhlIG1lYW5pbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBjbGFzc2VzXS4KK1RoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuCitOb3RlOgordGhlIHRyYW5zcG9ydHMgYXJlIGNob3NlbiBhdCBydW4gdGltZSBhbmQgbm90IGF0IGNvbXBpbGUgdGltZS4KKy5UUAorXGY0XC1TY1xmMQorR2VuZXJhdGUgc2FtcGxlIGNvZGUgdG8gc2hvdyB0aGUgdXNlIG9mIHJlbW90ZSBwcm9jZWR1cmUgYW5kIGhvdyB0byBiaW5kCit0byB0aGUgc2VydmVyIGJlZm9yZSBjYWxsaW5nIHRoZSBjbGllbnQgc2lkZSBzdHVicyBnZW5lcmF0ZWQgYnkgcnBjZ2VuLgorLlRQCitcZjRcLVNzXGYxCitHZW5lcmF0ZSBza2VsZXRvbiBjb2RlIGZvciB0aGUgcmVtb3RlIHByb2NlZHVyZXMgb24gdGhlIHNlcnZlciBzaWRlLiBZb3Ugd291bGQgbmVlZAordG8gZmlsbCBpbiB0aGUgYWN0dWFsIGNvZGUgZm9yIHRoZSByZW1vdGUgcHJvY2VkdXJlcy4KKy5UUAorXGY0XC10XGYxCitDb21waWxlIGludG8gUlBDIGRpc3BhdGNoIHRhYmxlLgorLlRQCitcZjRcLVRcZjEKK0dlbmVyYXRlIHRoZSBjb2RlIHRvIHN1cHBvcnQgUlBDIGRpc3BhdGNoIHRhYmxlcy4KKy5QCitUaGUgb3B0aW9ucyAKK1xmNFwtY1xmMSwKK1xmNFwtaFxmMSwKK1xmNFwtbFxmMSwKK1xmNFwtbVxmMSwKK1xmNFwtc1xmMQorYW5kCitcZjRcLXRcZjEKK2FyZSB1c2VkIGV4Y2x1c2l2ZWx5IHRvIGdlbmVyYXRlIGEgcGFydGljdWxhciB0eXBlIG9mIGZpbGUsCit3aGlsZSB0aGUgb3B0aW9ucworXGY0XC1EXGYxCithbmQKK1xmNFwtVFxmMQorYXJlIGdsb2JhbCBhbmQgY2FuIGJlIHVzZWQgd2l0aCB0aGUgb3RoZXIgb3B0aW9ucy4KKy5icgorLm5lIDUKKy5TSCBOT1RFUworVGhlIFJQQyBMYW5ndWFnZSBkb2VzIG5vdCBzdXBwb3J0IG5lc3Rpbmcgb2Ygc3RydWN0dXJlcy4KK0FzIGEgd29yay1hcm91bmQsCitzdHJ1Y3R1cmVzIGNhbiBiZSBkZWNsYXJlZCBhdCB0aGUgdG9wLWxldmVsLAorYW5kIHRoZWlyIG5hbWUgdXNlZCBpbnNpZGUgb3RoZXIgc3RydWN0dXJlcyBpbiAKK29yZGVyIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LgorLlAKK05hbWUgY2xhc2hlcyBjYW4gb2NjdXIgd2hlbiB1c2luZyBwcm9ncmFtIGRlZmluaXRpb25zLAorc2luY2UgdGhlIGFwcGFyZW50IHNjb3BpbmcgZG9lcyBub3QgcmVhbGx5IGFwcGx5LgorTW9zdCBvZiB0aGVzZSBjYW4gYmUgYXZvaWRlZCBieSBnaXZpbmcgCit1bmlxdWUgbmFtZXMgZm9yIHByb2dyYW1zLAordmVyc2lvbnMsCitwcm9jZWR1cmVzIGFuZCB0eXBlcy4KKy5QCitUaGUgc2VydmVyIGNvZGUgZ2VuZXJhdGVkIHdpdGgKK1xmNFwtblxmMQorb3B0aW9uIHJlZmVycyB0byB0aGUgdHJhbnNwb3J0IGluZGljYXRlZCBieQorXGYybmV0aWRcZjEKK2FuZCBoZW5jZSBpcyB2ZXJ5IHNpdGUgc3BlY2lmaWMuCisuU0ggRVhBTVBMRQorVGhlIGZvbGxvd2luZyBleGFtcGxlOgorLklQCisuZnQgNAorJCBycGNnZW4gXC1UIHByb3QueAorLmZ0IDEKKy5QCitnZW5lcmF0ZXMgdGhlIGZpdmUgZmlsZXM6CitcZjRwcm90LmhcZjEsCitcZjRwcm90X2NsbnQuY1xmMSwKK1xmNHByb3Rfc3ZjLmNcZjEsCitcZjRwcm90X3hkci5jXGYxCithbmQKK1xmNHByb3RfdGJsLmlcZjEuCisuUAorVGhlIGZvbGxvd2luZyBleGFtcGxlIHNlbmRzIHRoZSBDIGRhdGEtZGVmaW5pdGlvbnMgKGhlYWRlciBmaWxlKQordG8gdGhlIHN0YW5kYXJkIG91dHB1dC4KKy5JUAorLmZ0IDQKKyQgcnBjZ2VuIFwtaCBwcm90LngKKy5mdCAxCisuUAorVG8gc2VuZCB0aGUgdGVzdCB2ZXJzaW9uIG9mIHRoZQorXGY0LURURVNUXGYxLAorc2VydmVyIHNpZGUgc3R1YnMgZm9yIAorYWxsIHRoZSB0cmFuc3BvcnQgYmVsb25naW5nIHRvIHRoZSBjbGFzcworXGY0ZGF0YWdyYW1fblxmMQordG8gc3RhbmRhcmQgb3V0cHV0LCB1c2U6CisuSVAKKy5mdCA0CiskIHJwY2dlbiBcLXMgZGF0YWdyYW1fbiBcLURURVNUIHByb3QueAorLmZ0IDEKKy5QCitUbyBjcmVhdGUgdGhlIHNlcnZlciBzaWRlIHN0dWJzIGZvciB0aGUgdHJhbnNwb3J0IGluZGljYXRlZAorYnkKK1xmMm5ldGlkXGYxCitcZjR0Y3BcZjEsCit1c2U6CisuSVAKKy5mdCA0CiskIHJwY2dlbiBcLW4gdGNwIFwtbyBwcm90X3N2Yy5jIHByb3QueAorLmZ0IDEKKy5TSCAiU0VFIEFMU08iCitcZjRjY1xmUCgxKS4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi91dGlscy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjY1MTgzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjYgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCitPUFRESVJTID0KKworaWYgQ09ORklHX05GU1Y0CitPUFRESVJTICs9IGlkbWFwZAorZW5kaWYKKworaWYgQ09ORklHX0dTUworT1BURElSUyArPSBnc3NkCitlbmRpZgorCitpZiBDT05GSUdfTU9VTlQKK09QVERJUlMgKz0gbW91bnQKK2VuZGlmCisKK1NVQkRJUlMgPSBcCisJZXhwb3J0ZnMgXAorCW1vdW50ZCBcCisJbmZzZCBcCisJbmZzc3RhdCBcCisJc2hvd21vdW50IFwKKwlzdGF0ZCBcCisJJChPUFRESVJTKQorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkODdkMgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDYyNiBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK0BDT05GSUdfTkZTVjRfVFJVRUBhbV9fYXBwZW5kXzEgPSBpZG1hcGQKK0BDT05GSUdfR1NTX1RSVUVAYW1fX2FwcGVuZF8yID0gZ3NzZAorQENPTkZJR19NT1VOVF9UUlVFQGFtX19hcHBlbmRfMyA9IG1vdW50CitzdWJkaXIgPSB1dGlscworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK1NPVVJDRVMgPQorRElTVF9TT1VSQ0VTID0KK1JFQ1VSU0lWRV9UQVJHRVRTID0gYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCisJaHRtbC1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1kdmktcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAorCWluc3RhbGwtaHRtbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCisJaW5zdGFsbC1wZGYtcmVjdXJzaXZlIGluc3RhbGwtcHMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIFwKKwlpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluc3RhbGxkaXJzLXJlY3Vyc2l2ZSBwZGYtcmVjdXJzaXZlIFwKKwlwcy1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZQorUkVDVVJTSVZFX0NMRUFOX1RBUkdFVFMgPSBtb3N0bHljbGVhbi1yZWN1cnNpdmUgY2xlYW4tcmVjdXJzaXZlCVwKKyAgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorQU1fUkVDVVJTSVZFX1RBUkdFVFMgPSAkKFJFQ1VSU0lWRV9UQVJHRVRTOi1yZWN1cnNpdmU9KSBcCisJJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUzotcmVjdXJzaXZlPSkgdGFncyBUQUdTIGN0YWdzIENUQUdTIFwKKwlkaXN0ZGlyCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNUX1NVQkRJUlMgPSBleHBvcnRmcyBtb3VudGQgbmZzZCBuZnNzdGF0IHNob3dtb3VudCBzdGF0ZCBpZG1hcGQgXAorCWdzc2QgbW91bnQKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCithbV9fcmVsYXRpdml6ZSA9IFwKKyAgZGlyMD1gcHdkYDsgXAorICBzZWRfZmlyc3Q9J3MsXlwoW14vXSpcKS8uKiQkLFwxLCc7IFwKKyAgc2VkX3Jlc3Q9J3MsXlteL10qLyosLCc7IFwKKyAgc2VkX2xhc3Q9J3MsXi4qL1woW14vXSpcKSQkLFwxLCc7IFwKKyAgc2VkX2J1dGxhc3Q9J3MsLypbXi9dKiQkLCwnOyBcCisgIHdoaWxlIHRlc3QgLW4gIiQkZGlyMSI7IGRvIFwKKyAgICBmaXJzdD1gZWNobyAiJCRkaXIxIiB8IHNlZCAtZSAiJCRzZWRfZmlyc3QiYDsgXAorICAgIGlmIHRlc3QgIiQkZmlyc3QiICE9ICIuIjsgdGhlbiBcCisgICAgICBpZiB0ZXN0ICIkJGZpcnN0IiA9ICIuLiI7IHRoZW4gXAorICAgICAgICBkaXIyPWBlY2hvICIkJGRpcjAiIHwgc2VkIC1lICIkJHNlZF9sYXN0ImAvIiQkZGlyMiI7IFwKKyAgICAgICAgZGlyMD1gZWNobyAiJCRkaXIwIiB8IHNlZCAtZSAiJCRzZWRfYnV0bGFzdCJgOyBcCisgICAgICBlbHNlIFwKKyAgICAgICAgZmlyc3QyPWBlY2hvICIkJGRpcjIiIHwgc2VkIC1lICIkJHNlZF9maXJzdCJgOyBcCisgICAgICAgIGlmIHRlc3QgIiQkZmlyc3QyIiA9ICIkJGZpcnN0IjsgdGhlbiBcCisgICAgICAgICAgZGlyMj1gZWNobyAiJCRkaXIyIiB8IHNlZCAtZSAiJCRzZWRfcmVzdCJgOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgIGRpcjI9Ii4uLyQkZGlyMiI7IFwKKyAgICAgICAgZmk7IFwKKyAgICAgICAgZGlyMD0iJCRkaXIwIi8iJCRmaXJzdCI7IFwKKyAgICAgIGZpOyBcCisgICAgZmk7IFwKKyAgICBkaXIxPWBlY2hvICIkJGRpcjEiIHwgc2VkIC1lICIkJHNlZF9yZXN0ImA7IFwKKyAgZG9uZTsgXAorICByZWxkaXI9IiQkZGlyMiIKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FDTE9DQUxfQU1GTEFHUyA9IEBBQ0xPQ0FMX0FNRkxBR1NACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBTV9DRkxBR1MgPSBAQU1fQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSBAQU1fQ1BQRkxBR1NACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK09QVERJUlMgPSAkKGFtX19hcHBlbmRfMSkgJChhbV9fYXBwZW5kXzIpICQoYW1fX2FwcGVuZF8zKQorU1VCRElSUyA9IFwKKwlleHBvcnRmcyBcCisJbW91bnRkIFwKKwluZnNkIFwKKwluZnNzdGF0IFwKKwlzaG93bW91bnQgXAorCXN0YXRkIFwKKwkkKE9QVERJUlMpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KK2FsbDogYWxsLXJlY3Vyc2l2ZQorCisuU1VGRklYRVM6CiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB1dGlscy9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSB1dGlscy9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKKworIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKKyMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgorIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAorIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCisjICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOworIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KKyQoUkVDVVJTSVZFX1RBUkdFVFMpOgorCUBmYWlsPSBmYWlsY29tPSdleGl0IDEnOyBcCisJZm9yIGYgaW4geCAkJE1BS0VGTEFHUzsgZG8gXAorCSAgY2FzZSAkJGYgaW4gXAorCSAgICAqPSogfCAtLVsha10qKTs7IFwKKwkgICAgKmsqKSBmYWlsY29tPSdmYWlsPXllcyc7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWRvdF9zZWVuPW5vOyBcCisJdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAorCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgZG90X3NlZW49eWVzOyBcCisJICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCisJICBlbHNlIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKKwkgIGZpOyBcCisJICAoJChhbV9fY2QpICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCisJICB8fCBldmFsICQkZmFpbGNvbTsgXAorCWRvbmU7IFwKKwlpZiB0ZXN0ICIkJGRvdF9zZWVuIiA9ICJubyI7IHRoZW4gXAorCSAgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgIiQkdGFyZ2V0LWFtIiB8fCBleGl0IDE7IFwKKwlmaTsgdGVzdCAteiAiJCRmYWlsIgorCiskKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKToKKwlAZmFpbD0gZmFpbGNvbT0nZXhpdCAxJzsgXAorCWZvciBmIGluIHggJCRNQUtFRkxBR1M7IGRvIFwKKwkgIGNhc2UgJCRmIGluIFwKKwkgICAgKj0qIHwgLS1bIWtdKik7OyBcCisJICAgICprKikgZmFpbGNvbT0nZmFpbD15ZXMnOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwlkb3Rfc2Vlbj1ubzsgXAorCWNhc2UgIiRAIiBpbiBcCisJICBkaXN0Y2xlYW4tKiB8IG1haW50YWluZXItY2xlYW4tKikgbGlzdD0nJChESVNUX1NVQkRJUlMpJyA7OyBcCisJICAqKSBsaXN0PSckKFNVQkRJUlMpJyA7OyBcCisJZXNhYzsgXAorCXJldj0nJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCXJldj0iJCRyZXYgLiI7IFwKKwl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCisJZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAorCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKKwkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKKwkgIGVsc2UgXAorCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAorCSAgZmk7IFwKKwkgICgkKGFtX19jZCkgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKKwkgIHx8IGV2YWwgJCRmYWlsY29tOyBcCisJZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCit0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAorCWRvbmUKK2N0YWdzLXJlY3Vyc2l2ZToKKwlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKKwkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKCQoYW1fX2NkKSAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjdGFncyk7IFwKKwlkb25lCisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlpZiAoJChFVEFHUykgLS1ldGFncy1pbmNsdWRlIC0tdmVyc2lvbikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0tZXRhZ3MtaW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PS47IFwKKwllbHNlIFwKKwkgIGluY2x1ZGVfb3B0aW9uPS0taW5jbHVkZTsgXAorCSAgZW1wdHlfZml4PTsgXAorCWZpOyBcCisJbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICB0ZXN0ICEgLWYgJCRzdWJkaXIvVEFHUyB8fCBcCisJICAgICAgc2V0ICIkJEAiICIkJGluY2x1ZGVfb3B0aW9uPSQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiBjdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorCUBsaXN0PSckKERJU1RfU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKKwkgICAgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJHN1YmRpciIgXAorCSAgICB8fCAkKE1LRElSX1ApICIkKGRpc3RkaXIpLyQkc3ViZGlyIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCisJQGxpc3Q9JyQoRElTVF9TVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKGRpc3RkaXIpLyQkc3ViZGlyIjsgXAorCSAgICAkKGFtX19yZWxhdGl2aXplKTsgXAorCSAgICBuZXdfZGlzdGRpcj0kJHJlbGRpcjsgXAorCSAgICBkaXIxPSQkc3ViZGlyOyBkaXIyPSIkKHRvcF9kaXN0ZGlyKSI7IFwKKwkgICAgJChhbV9fcmVsYXRpdml6ZSk7IFwKKwkgICAgbmV3X3RvcF9kaXN0ZGlyPSQkcmVsZGlyOyBcCisJICAgIGVjaG8gIiAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQkbmV3X3RvcF9kaXN0ZGlyIiBkaXN0ZGlyPSIkJG5ld19kaXN0ZGlyIiBcXCI7IFwKKwkgICAgZWNobyAiICAgICBhbV9fcmVtb3ZlX2Rpc3RkaXI9OiBhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBhbV9fc2tpcF9tb2RlX2ZpeD06IGRpc3RkaXIpIjsgXAorCSAgICAoJChhbV9fY2QpICQkc3ViZGlyICYmIFwKKwkgICAgICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCisJICAgICAgICB0b3BfZGlzdGRpcj0iJCRuZXdfdG9wX2Rpc3RkaXIiIFwKKwkgICAgICAgIGRpc3RkaXI9IiQkbmV3X2Rpc3RkaXIiIFwKKwkJYW1fX3JlbW92ZV9kaXN0ZGlyPTogXAorCQlhbV9fc2tpcF9sZW5ndGhfY2hlY2s9OiBcCisJCWFtX19za2lwX21vZGVfZml4PTogXAorCSAgICAgICAgZGlzdGRpcikgXAorCSAgICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stcmVjdXJzaXZlCithbGwtYW06IE1ha2VmaWxlCitpbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCitpbnN0YWxsZGlycy1hbToKK2luc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZQordW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tcmVjdXJzaXZlCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLXJlY3Vyc2l2ZQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtcmVjdXJzaXZlCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tcmVjdXJzaXZlCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbToKKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLXJlY3Vyc2l2ZQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOgorCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1yZWN1cnNpdmUKKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjoKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLXJlY3Vyc2l2ZQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1yZWN1cnNpdmUKKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtcmVjdXJzaXZlCisKK3BkZi1hbToKKworcHM6IHBzLXJlY3Vyc2l2ZQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOgorCisuTUFLRTogJChSRUNVUlNJVkVfQ0xFQU5fVEFSR0VUUykgJChSRUNVUlNJVkVfVEFSR0VUUykgY3RhZ3MtcmVjdXJzaXZlIFwKKwlpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAgdGFncy1yZWN1cnNpdmUKKworLlBIT05ZOiAkKFJFQ1VSU0lWRV9DTEVBTl9UQVJHRVRTKSAkKFJFQ1VSU0lWRV9UQVJHRVRTKSBDVEFHUyBHVEFHUyBcCisJYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgXAorCWN0YWdzIGN0YWdzLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4gZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIFwKKwlodG1sLWFtIGluZm8gaW5mby1hbSBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIFwKKwlpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIFwKKwlpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gXAorCWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBcCisJaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgaW5zdGFsbGRpcnMtYW0gbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHRhZ3MtcmVjdXJzaXZlIFwKKwl1bmluc3RhbGwgdW5pbnN0YWxsLWFtCisKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2V4cG9ydGZzL01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2V4cG9ydGZzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjI2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK21hbjVfTUFOUwk9IGV4cG9ydHMubWFuCittYW43X01BTlMJPSBuZnNkLm1hbgorbWFuOF9NQU5TCT0gZXhwb3J0ZnMubWFuCisKK0VYVFJBX0RJU1QJPSAkKG1hbjVfTUFOUykgJChtYW43X01BTlMpICQobWFuOF9NQU5TKQorc2Jpbl9QUk9HUkFNUwk9IGV4cG9ydGZzCitleHBvcnRmc19TT1VSQ0VTID0gZXhwb3J0ZnMuYworZXhwb3J0ZnNfTERBREQgPSAuLi8uLi9zdXBwb3J0L2V4cG9ydC9saWJleHBvcnQuYSBcCisJICAgICAgIAkgLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCQkgLi4vLi4vc3VwcG9ydC9taXNjL2xpYm1pc2MuYSBcCisJCSAkKExJQldSQVApICQoTElCTlNMKQorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3MzRkYgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9leHBvcnRmcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDcyNCBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc2Jpbl9QUk9HUkFNUyA9IGV4cG9ydGZzJChFWEVFWFQpCitzdWJkaXIgPSB1dGlscy9leHBvcnRmcworRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjVkaXIpIiBcCisJIiQoREVTVERJUikkKG1hbjdkaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiCitQUk9HUkFNUyA9ICQoc2Jpbl9QUk9HUkFNUykKK2FtX2V4cG9ydGZzX09CSkVDVFMgPSBleHBvcnRmcy4kKE9CSkVYVCkKK2V4cG9ydGZzX09CSkVDVFMgPSAkKGFtX2V4cG9ydGZzX09CSkVDVFMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorZXhwb3J0ZnNfREVQRU5ERU5DSUVTID0gLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEgXAorCS4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChleHBvcnRmc19TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChleHBvcnRmc19TT1VSQ0VTKQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworbWFuNWRpciA9ICQobWFuZGlyKS9tYW41CittYW43ZGlyID0gJChtYW5kaXIpL21hbjcKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorTlJPRkYgPSBucm9mZgorTUFOUyA9ICQobWFuNV9NQU5TKSAkKG1hbjdfTUFOUykgJChtYW44X01BTlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbWFuNV9NQU5TID0gZXhwb3J0cy5tYW4KK21hbjdfTUFOUyA9IG5mc2QubWFuCittYW44X01BTlMgPSBleHBvcnRmcy5tYW4KK0VYVFJBX0RJU1QgPSAkKG1hbjVfTUFOUykgJChtYW43X01BTlMpICQobWFuOF9NQU5TKQorZXhwb3J0ZnNfU09VUkNFUyA9IGV4cG9ydGZzLmMKK2V4cG9ydGZzX0xEQUREID0gLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEgXAorCSAgICAgICAJIC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKwkJIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEgXAorCQkgJChMSUJXUkFQKSAkKExJQk5TTCkKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitpbnN0YWxsLXNiaW5QUk9HUkFNUzogJChzYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoc2JpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHNiaW5kaXIpIgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChzYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKKwl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIHx8IHRlc3QgLWYgJCRwMTsgXAorCSAgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIC1lICdzfC4qfC58JyBcCisJICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCisJc2VkICdOO047TjtzLFxuLCAsZycgfCBcCisJJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKHNiaW5kaXIpJCRkaXInIjsgXAorCSAgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAiJChERVNURElSKSQoc2JpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgfSBcCisJOyBkb25lCisKK3VuaW5zdGFsbC1zYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKKwkgIHNlZCAtZSAnaDtzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pJyBcCisJICAgICAgLWUgJ3MvJCQvJChFWEVFWFQpLycgYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKHNiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoc2JpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKKworY2xlYW4tc2JpblBST0dSQU1TOgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CitleHBvcnRmcyQoRVhFRVhUKTogJChleHBvcnRmc19PQkpFQ1RTKSAkKGV4cG9ydGZzX0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIGV4cG9ydGZzJChFWEVFWFQpCisJJChMSU5LKSAkKGV4cG9ydGZzX09CSkVDVFMpICQoZXhwb3J0ZnNfTERBREQpICQoTElCUykKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2V4cG9ydGZzLlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLW1hbjU6ICQobWFuNV9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuNWRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjVkaXIpIgorCUBsaXN0PSckKG1hbjVfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjVkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteNV1bMC05YS16XSokJCw1LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW41ZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjVkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuNWRpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuNWRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuNToKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG1hbjVfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjVkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW141XVswLTlhLXpdKiQkLDUsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuNWRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjVkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CitpbnN0YWxsLW1hbjc6ICQobWFuN19NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuN2RpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjdkaXIpIgorCUBsaXN0PSckKG1hbjdfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjdkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteN11bMC05YS16XSokJCw3LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW43ZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjdkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuN2RpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuN2RpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuNzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG1hbjdfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjdkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW143XVswLTlhLXpdKiQkLDcsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuN2RpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjdkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CitpbnN0YWxsLW1hbjg6ICQobWFuOF9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuOGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjhkaXIpIgorCUBsaXN0PSckKG1hbjhfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjhkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuOGRpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuOGRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuODoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG1hbjhfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjhkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuOGRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjhkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBsaXN0PSckKE1BTlMpJzsgaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICAgIGlmIHRlc3QgLWYgIiQkZCQkcCI7IHRoZW4gZWNobyAiJCRkJCRwIjsgZWxzZSA6OyBmaTsgZG9uZWA7IFwKKwkgIGlmIHRlc3QgLW4gIiQkbGlzdCIgJiYgXAorCSAgICBncmVwICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCA+L2Rldi9udWxsOyB0aGVuIFwKKwkgICAgZWNobyAiZXJyb3I6IGZvdW5kIG1hbiBwYWdlcyBjb250YWluaW5nIHRoZSBcYG1pc3NpbmcgaGVscDJtYW4nIHJlcGxhY2VtZW50IHRleHQ6IiA+JjI7IFwKKwkgICAgZ3JlcCAtbCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgfCBzZWQgJ3MvXi8gICAgICAgICAvJyA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHRvIGZpeCB0aGVtLCBpbnN0YWxsIGhlbHAybWFuLCByZW1vdmUgYW5kIHJlZ2VuZXJhdGUgdGhlIG1hbiBwYWdlczsiID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdHlwaWNhbGx5IFxgbWFrZSBtYWludGFpbmVyLWNsZWFuJyB3aWxsIHJlbW92ZSB0aGVtIiA+JjI7IFwKKwkgICAgZXhpdCAxOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZWxzZSA6OyBmaQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQobWFuNWRpcikiICIkKERFU1RESVIpJChtYW43ZGlyKSIgIiQoREVTVERJUikkKG1hbjhkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtc2JpblBST0dSQU1TCisKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLW1hbjogaW5zdGFsbC1tYW41IGluc3RhbGwtbWFuNyBpbnN0YWxsLW1hbjgKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtc2JpblBST0dSQU1TCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW41IHVuaW5zdGFsbC1tYW43IHVuaW5zdGFsbC1tYW44CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLW1hbjUgaW5zdGFsbC1tYW43IGluc3RhbGwtbWFuOCBpbnN0YWxsLXBkZiBcCisJaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBpbnN0YWxsLXBzLWFtIGluc3RhbGwtc2JpblBST0dSQU1TIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLW1hbiBcCisJdW5pbnN0YWxsLW1hbjUgdW5pbnN0YWxsLW1hbjcgdW5pbnN0YWxsLW1hbjggXAorCXVuaW5zdGFsbC1zYmluUFJPR1JBTVMKKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9leHBvcnRmcy9leHBvcnRmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWU1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZXhwb3J0ZnMvZXhwb3J0ZnMuYwpAQCAtMCwwICsxLDU0NCBAQAorLyoKKyAqIHV0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLmMKKyAqCisgKiBFeHBvcnQgZmlsZSBzeXN0ZW1zIHRvIGtuZnNkCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICoKKyAqIEV4dGVuc2l2ZSBjaGFuZ2VzLCAxOTk5LCBOZWlsIEJyb3duIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibmZzbGliLmgiCisjaW5jbHVkZSAiZXhwb3J0ZnMuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCitzdGF0aWMgdm9pZAlleHBvcnRfYWxsKGludCB2ZXJib3NlKTsKK3N0YXRpYyB2b2lkCWV4cG9ydGZzKGNoYXIgKmFyZywgY2hhciAqb3B0aW9ucywgaW50IHZlcmJvc2UpOworc3RhdGljIHZvaWQJdW5leHBvcnRmcyhjaGFyICphcmcsIGludCB2ZXJib3NlKTsKK3N0YXRpYyB2b2lkCWV4cG9ydHNfdXBkYXRlKGludCB2ZXJib3NlKTsKK3N0YXRpYyB2b2lkCWR1bXAoaW50IHZlcmJvc2UpOworc3RhdGljIHZvaWQJZXJyb3IobmZzX2V4cG9ydCAqZXhwLCBpbnQgZXJyKTsKK3N0YXRpYyB2b2lkCXVzYWdlKHZvaWQpOworc3RhdGljIHZvaWQJdmFsaWRhdGVfZXhwb3J0KG5mc19leHBvcnQgKmV4cCk7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhcgkqb3B0aW9ucyA9IE5VTEw7CisJaW50CWZfZXhwb3J0ID0gMTsKKwlpbnQJZl9hbGwgPSAwOworCWludAlmX3ZlcmJvc2UgPSAwOworCWludAlmX3JlZXhwb3J0ID0gMDsKKwlpbnQJZl9pZ25vcmUgPSAwOworCWludAlpLCBjOworCWludAluZXdfY2FjaGUgPSAwOworCWludAlmb3JjZV9mbHVzaCA9IDA7CisKKwl4bG9nX29wZW4oImV4cG9ydGZzIik7CisKKwlleHBvcnRfZXJybm8gPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJhaW86cnV2ZiIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoKGMpIHsKKwkJY2FzZSAnYSc6CisJCQlmX2FsbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlmX2lnbm9yZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlvcHRpb25zID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJZl9yZWV4cG9ydCA9IDE7CisJCQlmX2FsbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlmX2V4cG9ydCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlmX3ZlcmJvc2UgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZm9yY2VfZmx1c2ggPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAob3B0aW5kICE9IGFyZ2MgJiYgZl9hbGwpIHsKKwkJZnByaW50ZihzdGRlcnIsImV4cG9ydGZzOiBleHRyYSBhcmd1bWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQgd2l0aCAtYSBvciAtci5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGZfaWdub3JlICYmIChmX2FsbCB8fCAhIGZfZXhwb3J0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwiZXhwb3J0ZnM6IC1pIG5vdCBtZWFuaW5nZnVsIHdpdGggLWEsIC1yIG9yIC11LlxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAoZl9yZWV4cG9ydCAmJiAhIGZfZXhwb3J0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXhwb3J0ZnM6IC1yIGFuZCAtdSBhcmUgaW5jb21wYXRpYmxlLlxuIik7CisJCXJldHVybiAxOworCX0KKwluZXdfY2FjaGUgPSBjaGVja19uZXdfY2FjaGUoKTsKKwlpZiAob3B0aW5kID09IGFyZ2MgJiYgISBmX2FsbCkgeworCQlpZiAoZm9yY2VfZmx1c2gpIHsKKwkJCWlmIChuZXdfY2FjaGUpCisJCQkJY2FjaGVfZmx1c2goMSk7CisJCQllbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImV4cG9ydGZzOiAtZjogb25seSBhdmFpbGFibGUgd2l0aCBuZXcgY2FjaGUgY29udHJvbHM6IG1vdW50IC9wcm9jL2ZzL25mc2QgZmlyc3RcbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXh0YWJfZXhwb3J0X3JlYWQoKTsKKwkJCWR1bXAoZl92ZXJib3NlKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChmX2V4cG9ydCAmJiAhIGZfaWdub3JlKQorCQlleHBvcnRfcmVhZChfUEFUSF9FWFBPUlRTKTsKKwlpZiAoZl9leHBvcnQpIHsKKwkJaWYgKGZfYWxsKQorCQkJZXhwb3J0X2FsbChmX3ZlcmJvc2UpOworCQllbHNlCisJCQlmb3IgKGkgPSBvcHRpbmQ7IGkgPCBhcmdjIDsgaSsrKQorCQkJCWV4cG9ydGZzKGFyZ3ZbaV0sIG9wdGlvbnMsIGZfdmVyYm9zZSk7CisJfQorCS8qIElmIHdlIGFyZSB1bmV4cG9ydGluZyBldmVyeXRoaW5nLCB0aGVuCisJICogZG9uJ3QgY2FyZSBhYm91dCB3aGF0IHNob3VsZCBiZSBleHBvcnRlZCwgYXMgdGhhdAorCSAqIG1heSByZXF1aXJlIEROUyBsb29rdXBzLi4KKwkgKi8KKwlpZiAoISAoICFmX2V4cG9ydCAmJiBmX2FsbCkpIHsKKwkJLyogbm90ZTogeHRhYl8qX3JlYWQgZG9lcyBub3QgdXBkYXRlIGVudHJpZXMgaWYgdGhleSBhbHJlYWR5IGV4aXN0LAorCQkgKiBzbyB0aGlzIHdpbGwgbm90IGxvc2UgbmV3IG9wdGlvbnMKKwkJICovCisJCWlmICghZl9yZWV4cG9ydCkKKwkJCXh0YWJfZXhwb3J0X3JlYWQoKTsKKwkJaWYgKCFmX2V4cG9ydCkKKwkJCWZvciAoaSA9IG9wdGluZCA7IGkgPCBhcmdjIDsgaSsrKQorCQkJCXVuZXhwb3J0ZnMoYXJndltpXSwgZl92ZXJib3NlKTsKKwkJaWYgKCFuZXdfY2FjaGUpCisJCQlybXRhYl9yZWFkKCk7CisJfQorCWlmICghbmV3X2NhY2hlKSB7CisJCXh0YWJfbW91bnRfcmVhZCgpOworCQlleHBvcnRzX3VwZGF0ZShmX3ZlcmJvc2UpOworCX0KKwl4dGFiX2V4cG9ydF93cml0ZSgpOworCWlmIChuZXdfY2FjaGUpCisJCWNhY2hlX2ZsdXNoKGZvcmNlX2ZsdXNoKTsKKwlpZiAoIW5ld19jYWNoZSkKKwkJeHRhYl9tb3VudF93cml0ZSgpOworCisJcmV0dXJuIGV4cG9ydF9lcnJubzsKK30KKworc3RhdGljIHZvaWQKK2V4cG9ydHNfdXBkYXRlX29uZShuZnNfZXhwb3J0ICpleHAsIGludCB2ZXJib3NlKQoreworCQkvKiBjaGVjayBtb3VudHBvaW50IG9wdGlvbiAqLworCWlmIChleHAtPm1fbWF5ZXhwb3J0ICYmCisJICAgIGV4cC0+bV9leHBvcnQuZV9tb3VudHBvaW50ICYmCisJICAgICFpc19tb3VudHBvaW50KGV4cC0+bV9leHBvcnQuZV9tb3VudHBvaW50WzBdPworCQkJICAgZXhwLT5tX2V4cG9ydC5lX21vdW50cG9pbnQ6CisJCQkgICBleHAtPm1fZXhwb3J0LmVfcGF0aCkpIHsKKwkJcHJpbnRmKCIlcyBub3QgZXhwb3J0ZWQgYXMgJXMgbm90IGEgbW91bnRwb2ludC5cbiIsCisJCSAgICAgICBleHAtPm1fZXhwb3J0LmVfcGF0aCwgZXhwLT5tX2V4cG9ydC5lX21vdW50cG9pbnQpOworCQlleHAtPm1fbWF5ZXhwb3J0ID0gMDsKKwl9CisJaWYgKGV4cC0+bV9tYXlleHBvcnQgJiYgKChleHAtPm1fZXhwb3J0ZWQ8MSkgfHwgZXhwLT5tX2NoYW5nZWQpKSB7CisJCWlmICh2ZXJib3NlKQorCQkJcHJpbnRmKCIlc2V4cG9ydGluZyAlczolcyB0byBrZXJuZWxcbiIsCisJCQkgICAgICAgZXhwLT5tX2V4cG9ydGVkID8icmUiOiIiLAorCQkJICAgICAgIGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUsCisJCQkgICAgICAgZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCQlpZiAoIWV4cG9ydF9leHBvcnQoZXhwKSkKKwkJCWVycm9yKGV4cCwgZXJybm8pOworCX0KKwlpZiAoZXhwLT5tX2V4cG9ydGVkICYmICEgZXhwLT5tX21heWV4cG9ydCkgeworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigidW5leHBvcnRpbmcgJXM6JXMgZnJvbSBrZXJuZWxcbiIsCisJCQkgICAgICAgZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZSwKKwkJCSAgICAgICBleHAtPm1fZXhwb3J0LmVfcGF0aCk7CisJCWlmICghZXhwb3J0X3VuZXhwb3J0KGV4cCkpCisJCQllcnJvcihleHAsIGVycm5vKTsKKwl9Cit9CisKKworLyogd2Ugc3luY2hyb25pc2UgaW50ZW50aW9uIHdpdGggcmVhbGl0eS4KKyAqIGVudHJpZXMgd2l0aCBtX21heWV4cG9ydCBnZXQgZXhwb3J0ZWQKKyAqIGVudHJpZXMgd2l0aCBtX2V4cG9ydGVkIGJ1dCBub3QgbV9tYXlleHBvcnQgZ2V0IHVuZXhwb3J0ZWQKKyAqIGxvb2tpbmcgYXQgbV9jbGllbnQtPm1fdHlwZSA9PSBNQ0xfRlFETiBhbmQgbV9jbGllbnQtPm1fdHlwZSA9PSBNQ0xfR1NTIG9ubHkKKyAqLworc3RhdGljIHZvaWQKK2V4cG9ydHNfdXBkYXRlKGludCB2ZXJib3NlKQoreworCW5mc19leHBvcnQgCSpleHA7CisKKwlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbTUNMX0ZRRE5dLnBfaGVhZDsgZXhwOyBleHA9ZXhwLT5tX25leHQpIHsKKwkJZXhwb3J0c191cGRhdGVfb25lKGV4cCwgdmVyYm9zZSk7CisJfQorCWZvciAoZXhwID0gZXhwb3J0bGlzdFtNQ0xfR1NTXS5wX2hlYWQ7IGV4cDsgZXhwPWV4cC0+bV9uZXh0KSB7CisJCWV4cG9ydHNfdXBkYXRlX29uZShleHAsIHZlcmJvc2UpOworCX0KK30KKwkJCQorLyoKKyAqIGV4cG9ydF9hbGwgZmluZHMgYWxsIGVudHJpZXMgYW5kCisgKiAgICBtYXJrcyB0aGVtIHh0YWJlbnQgYW5kIG1heWV4cG9ydCBzbyB0aGF0IHRoZXkgZ2V0IGV4cG9ydGVkCisgKi8KK3N0YXRpYyB2b2lkCitleHBvcnRfYWxsKGludCB2ZXJib3NlKQoreworCW5mc19leHBvcnQJKmV4cDsKKwlpbnQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUNMX01BWFRZUEVTOyBpKyspIHsKKwkJZm9yIChleHAgPSBleHBvcnRsaXN0W2ldLnBfaGVhZDsgZXhwOyBleHAgPSBleHAtPm1fbmV4dCkgeworCQkJaWYgKHZlcmJvc2UpCisJCQkJcHJpbnRmKCJleHBvcnRpbmcgJXM6JXNcbiIsCisJCQkJICAgICAgIGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUsIAorCQkJCSAgICAgICBleHAtPm1fZXhwb3J0LmVfcGF0aCk7CisJCQlleHAtPm1feHRhYmVudCA9IDE7CisJCQlleHAtPm1fbWF5ZXhwb3J0ID0gMTsKKwkJCWV4cC0+bV9jaGFuZ2VkID0gMTsKKwkJCWV4cC0+bV93YXJuZWQgPSAwOworCQkJdmFsaWRhdGVfZXhwb3J0KGV4cCk7CisJCX0KKwl9Cit9CisKKworc3RhdGljIHZvaWQKK2V4cG9ydGZzKGNoYXIgKmFyZywgY2hhciAqb3B0aW9ucywgaW50IHZlcmJvc2UpCit7CisJc3RydWN0IGV4cG9ydGVudCAqZWVwOworCW5mc19leHBvcnQJKmV4cDsKKwlzdHJ1Y3QgaG9zdGVudAkqaHAgPSBOVUxMOworCWNoYXIJCSpwYXRoOworCWNoYXIJCSpobmFtZSA9IGFyZzsKKwlpbnQJCWh0eXBlOworCisJaWYgKChwYXRoID0gc3RyY2hyKGFyZywgJzonKSkgIT0gTlVMTCkKKwkJKnBhdGgrKyA9ICdcMCc7CisKKwlpZiAoIXBhdGggfHwgKnBhdGggIT0gJy8nKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBleHBvcnRpbmcgb3B0aW9uOiAlc1xuIiwgYXJnKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoaHR5cGUgPSBjbGllbnRfZ2V0dHlwZShobmFtZSkpID09IE1DTF9GUUROICYmCisJICAgIChocCA9IGdldGhvc3RieW5hbWUoaG5hbWUpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBob3N0ZW50ICpocDIgPSBob3N0ZW50X2R1cCAoaHApOworCQlocCA9IGdldGhvc3RieWFkZHIoaHAyLT5oX2FkZHIsIGhwMi0+aF9sZW5ndGgsCisJCQkJICAgaHAyLT5oX2FkZHJ0eXBlKTsKKwkJaWYgKGhwKSB7CisJCQlmcmVlKGhwMik7CisJCQlocCA9IGhvc3RlbnRfZHVwKGhwKTsKKwkJfSBlbHNlCisJCQlocCA9IGhwMjsKKwkJZXhwID0gZXhwb3J0X2ZpbmQoaHAsIHBhdGgpOworCQlobmFtZSA9IGhwLT5oX25hbWU7CisJfSBlbHNlIHsKKwkJZXhwID0gZXhwb3J0X2xvb2t1cChobmFtZSwgcGF0aCwgMCk7CisJfQorCisJaWYgKCFleHApIHsKKwkJaWYgKCEoZWVwID0gbWtleHBvcnRlbnQoaG5hbWUsIHBhdGgsIG9wdGlvbnMpKSB8fAorCQkgICAgIShleHAgPSBleHBvcnRfY3JlYXRlKGVlcCwgMCkpKSB7CisJCQlpZiAoaHApIGZyZWUgKGhwKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoIXVwZGF0ZWV4cG9ydGVudCgmZXhwLT5tX2V4cG9ydCwgb3B0aW9ucykpIHsKKwkJaWYgKGhwKSBmcmVlIChocCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKCJleHBvcnRpbmcgJXM6JXNcbiIsIGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUsIAorCQkJZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCWV4cC0+bV94dGFiZW50ID0gMTsKKwlleHAtPm1fbWF5ZXhwb3J0ID0gMTsKKwlleHAtPm1fY2hhbmdlZCA9IDE7CisJZXhwLT5tX3dhcm5lZCA9IDA7CisJdmFsaWRhdGVfZXhwb3J0KGV4cCk7CisJaWYgKGhwKSBmcmVlIChocCk7Cit9CisKK3N0YXRpYyB2b2lkCit1bmV4cG9ydGZzKGNoYXIgKmFyZywgaW50IHZlcmJvc2UpCit7CisJbmZzX2V4cG9ydAkqZXhwOworCXN0cnVjdCBob3N0ZW50CSpocCA9IE5VTEw7CisJY2hhcgkJKnBhdGg7CisJY2hhcgkJKmhuYW1lID0gYXJnOworCWludAkJaHR5cGU7CisKKwlpZiAoKHBhdGggPSBzdHJjaHIoYXJnLCAnOicpKSAhPSBOVUxMKQorCQkqcGF0aCsrID0gJ1wwJzsKKworCWlmICghcGF0aCB8fCAqcGF0aCAhPSAnLycpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHVuZXhwb3J0aW5nIG9wdGlvbjogJXNcbiIsCisJCQlhcmcpOworCQlyZXR1cm47CisJfQorCisJaWYgKChodHlwZSA9IGNsaWVudF9nZXR0eXBlKGhuYW1lKSkgPT0gTUNMX0ZRRE4pIHsKKwkJaWYgKChocCA9IGdldGhvc3RieW5hbWUoaG5hbWUpKSAhPSAwKSB7CisJCQlocCA9IGhvc3RlbnRfZHVwIChocCk7CisJCQlobmFtZSA9IChjaGFyICopIGhwLT5oX25hbWU7CisJCX0KKwl9CisKKwlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaHR5cGVdLnBfaGVhZDsgZXhwOyBleHAgPSBleHAtPm1fbmV4dCkgeworCQlpZiAocGF0aCAmJiBzdHJjbXAocGF0aCwgZXhwLT5tX2V4cG9ydC5lX3BhdGgpKQorCQkJY29udGludWU7CisJCWlmIChodHlwZSAhPSBleHAtPm1fY2xpZW50LT5tX3R5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKGh0eXBlID09IE1DTF9GUUROCisJCSAgICAmJiAhbWF0Y2hob3N0bmFtZShleHAtPm1fZXhwb3J0LmVfaG9zdG5hbWUsCisJCQkJCSAgaG5hbWUpKQorCQkJY29udGludWU7CisJCWlmIChodHlwZSAhPSBNQ0xfRlFETgorCQkgICAgJiYgc3RyY2FzZWNtcChleHAtPm1fZXhwb3J0LmVfaG9zdG5hbWUsIGhuYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodmVyYm9zZSkgeworI2lmIDAKKwkJCWlmIChleHAtPm1fZXhwb3J0ZWQpIHsKKwkJCQlwcmludGYoInVuZXhwb3J0aW5nICVzOiVzIGZyb20ga2VybmVsXG4iLAorCQkJCSAgICAgICBleHAtPm1fY2xpZW50LT5tX2hvc3RuYW1lLAorCQkJCSAgICAgICBleHAtPm1fZXhwb3J0LmVfcGF0aCk7CisJCQl9CisJCQllbHNlCisjZW5kaWYKKwkJCQlwcmludGYoInVuZXhwb3J0aW5nICVzOiVzXG4iLAorCQkJCQlleHAtPm1fY2xpZW50LT5tX2hvc3RuYW1lLCAKKwkJCQkJZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCQl9CisjaWYgMAorCQlpZiAoZXhwLT5tX2V4cG9ydGVkICYmICFleHBvcnRfdW5leHBvcnQoZXhwKSkKKwkJCWVycm9yKGV4cCwgZXJybm8pOworI2VuZGlmCisJCWV4cC0+bV94dGFiZW50ID0gMDsKKwkJZXhwLT5tX21heWV4cG9ydCA9IDA7CisJfQorCisJaWYgKGhwKSBmcmVlIChocCk7Cit9CisKK3N0YXRpYyBpbnQgY2FuX3Rlc3Qodm9pZCkKK3sKKwlpbnQgZmQ7CisJaW50IG47CisJY2hhciAqc2V0dXAgPSAibmZzZCAwLjAuMC4wIDIxNDc0ODM2NDcgLXRlc3QtY2xpZW50LVxuIjsKKwlmZCA9IG9wZW4oIi9wcm9jL25ldC9ycGMvYXV0aC51bml4LmlwL2NoYW5uZWwiLCBPX1dST05MWSk7CisJaWYgKCBmZCA8IDApIHJldHVybiAwOworCW4gPSB3cml0ZShmZCwgc2V0dXAsIHN0cmxlbihzZXR1cCkpOworCWNsb3NlKGZkKTsKKwlpZiAobiA8IDApCisJCXJldHVybiAwOworCWZkID0gb3BlbigiL3Byb2MvbmV0L3JwYy9uZnNkLmV4cG9ydC9jaGFubmVsIiwgT19XUk9OTFkpOworCWlmICggZmQgPCAwKSByZXR1cm4gMDsKKwljbG9zZShmZCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9leHBvcnQoY2hhciAqcGF0aCwgaW50IHdpdGhfZnNpZCkKK3sKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgZmQsIG47CisKKwlzcHJpbnRmKGJ1ZiwgIi10ZXN0LWNsaWVudC0gJXMgMyAlZCAtMSAtMSAwXG4iLAorCQlwYXRoLAorCQl3aXRoX2ZzaWQgPyBORlNFWFBfRlNJRCA6IDApOworCWZkID0gb3BlbigiL3Byb2MvbmV0L3JwYy9uZnNkLmV4cG9ydC9jaGFubmVsIiwgT19XUk9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAwOworCW4gPSB3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSk7CisJY2xvc2UoZmQpOworCWlmIChuIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit2YWxpZGF0ZV9leHBvcnQobmZzX2V4cG9ydCAqZXhwKQoreworCS8qIENoZWNrIHRoYXQgdGhlIGdpdmVuIGV4cG9ydCBwb2ludCBpcyBwb3RlbnRpYWxseSBleHBvcnRhYmxlLgorCSAqIFdlIGp1c3QgZ2l2ZSB3YXJuaW5ncyBoZXJlLCBkb24ndCBjYXVzZSBhbnl0aGluZyB0byBmYWlsLgorCSAqIElmIGEgcGF0aCBkb2Vzbid0IGV4aXN0LCBvciBpcyBub3QgYSBkaXIgb3IgZmlsZSwgZ2l2ZSBhbiB3YXJuaW5nCisJICogb3RoZXJ3aXNlIHRyaWFsLWV4cG9ydCB0byAnLXRlc3QtY2xpZW50LScgYW5kIGNoZWNrIGZvciBmYWlsdXJlLgorCSAqLworCXN0cnVjdCBzdGF0IHN0YjsKKwljaGFyICpwYXRoID0gZXhwLT5tX2V4cG9ydC5lX3BhdGg7CisJc3RydWN0IHN0YXRmczY0IHN0ZjsKKwlpbnQgZnNfaGFzX2ZzaWQgPSAwOworCisJaWYgKHN0YXQocGF0aCwgJnN0YikgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXhwb3J0ZnM6IFdhcm5pbmc6ICVzIGRvZXMgbm90IGV4aXN0XG4iLAorCQkJcGF0aCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFTX0lTRElSKHN0Yi5zdF9tb2RlKSAmJiAhU19JU1JFRyhzdGIuc3RfbW9kZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJleHBvcnRmczogV2FybmluZzogJXMgaXMgbmVpdGhlciAiCisJCQkiYSBkaXJlY3Rvcnkgbm9yIGEgZmlsZS5cbiIKKwkJCSIgICAgIHJlbW90ZSBhY2Nlc3Mgd2lsbCBmYWlsXG4iLCBwYXRoKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWNhbl90ZXN0KCkpCisJCXJldHVybjsKKworCWlmICghc3RhdGZzNjQocGF0aCwgJnN0ZikgJiYKKwkgICAgKHN0Zi5mX2ZzaWQuX192YWxbMF0gfHwgc3RmLmZfZnNpZC5fX3ZhbFsxXSkpCisJCWZzX2hhc19mc2lkID0gMTsKKworCWlmICgoZXhwLT5tX2V4cG9ydC5lX2ZsYWdzICYgTkZTRVhQX0ZTSUQpIHx8IGV4cC0+bV9leHBvcnQuZV91dWlkIHx8CisJICAgIGZzX2hhc19mc2lkKSB7CisJCWlmICggIXRlc3RfZXhwb3J0KHBhdGgsIDEpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImV4cG9ydGZzOiBXYXJuaW5nOiAlcyBkb2VzIG5vdCAiCisJCQkJInN1cHBvcnQgTkZTIGV4cG9ydC5cbiIsCisJCQkJcGF0aCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgaWYgKCAhIHRlc3RfZXhwb3J0KHBhdGgsIDApKSB7CisJCWlmICh0ZXN0X2V4cG9ydChwYXRoLCAxKSkKKwkJCWZwcmludGYoc3RkZXJyLCAiZXhwb3J0ZnM6IFdhcm5pbmc6ICVzIHJlcXVpcmVzIGZzaWQ9ICIKKwkJCQkiZm9yIE5GUyBleHBvcnRcbiIsIHBhdGgpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgImV4cG9ydGZzOiBXYXJuaW5nOiAlcyBkb2VzIG5vdCAiCisJCQkJInN1cHBvcnQgTkZTIGV4cG9ydC5cbiIsCisJCQkJcGF0aCk7CisJCXJldHVybjsKKworCX0KK30KKworCitzdGF0aWMgY2hhcgorZHVtcG9wdChjaGFyIGMsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QJYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlwcmludGYoIiVjIiwgYyk7CisJdnByaW50ZihmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiAnLCc7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wKGludCB2ZXJib3NlKQoreworCW5mc19leHBvcnQJKmV4cDsKKwlzdHJ1Y3QgZXhwb3J0ZW50ICplcDsKKwlpbnQJCWh0eXBlOworCWNoYXIJCSpobmFtZSwgYzsKKworCWZvciAoaHR5cGUgPSAwOyBodHlwZSA8IE1DTF9NQVhUWVBFUzsgaHR5cGUrKykgeworCQlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaHR5cGVdLnBfaGVhZDsgZXhwOyBleHAgPSBleHAtPm1fbmV4dCkgeworCQkJZXAgPSAmZXhwLT5tX2V4cG9ydDsKKwkJCWlmICghZXhwLT5tX3h0YWJlbnQpCisJCQkgICAgY29udGludWU7IC8qIG5laWxiICovCisJCQlpZiAoaHR5cGUgPT0gTUNMX0FOT05ZTU9VUykKKwkJCQlobmFtZSA9ICI8d29ybGQ+IjsKKwkJCWVsc2UKKwkJCQlobmFtZSA9IGVwLT5lX2hvc3RuYW1lOworCQkJaWYgKHN0cmxlbihlcC0+ZV9wYXRoKSA+IDE0KQorCQkJCXByaW50ZigiJS0xNHNcblx0XHQlcyIsIGVwLT5lX3BhdGgsIGhuYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtMTRzXHQlcyIsIGVwLT5lX3BhdGgsIGhuYW1lKTsKKwkJCWlmICghdmVyYm9zZSkgeworCQkJCXByaW50ZigiXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWMgPSAnKCc7CisJCQlpZiAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfUkVBRE9OTFkpCisJCQkJYyA9IGR1bXBvcHQoYywgInJvIik7CisJCQllbHNlCisJCQkJYyA9IGR1bXBvcHQoYywgInJ3Iik7CisJCQlpZiAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfQVNZTkMpCisJCQkJYyA9IGR1bXBvcHQoYywgImFzeW5jIik7CisJCQlpZiAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfR0FUSEVSRURfV1JJVEVTKQorCQkJCWMgPSBkdW1wb3B0KGMsICJ3ZGVsYXkiKTsKKwkJCWlmIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9OT0hJREUpCisJCQkJYyA9IGR1bXBvcHQoYywgIm5vaGlkZSIpOworCQkJaWYgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX0NST1NTTU9VTlQpCisJCQkJYyA9IGR1bXBvcHQoYywgImNyb3NzbW50Iik7CisJCQlpZiAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfSU5TRUNVUkVfUE9SVCkKKwkJCQljID0gZHVtcG9wdChjLCAiaW5zZWN1cmUiKTsKKwkJCWlmIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9ST09UU1FVQVNIKQorCQkJCWMgPSBkdW1wb3B0KGMsICJyb290X3NxdWFzaCIpOworCQkJZWxzZQorCQkJCWMgPSBkdW1wb3B0KGMsICJub19yb290X3NxdWFzaCIpOworCQkJaWYgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX0FMTFNRVUFTSCkKKwkJCQljID0gZHVtcG9wdChjLCAiYWxsX3NxdWFzaCIpOworCQkJaWYgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX05PU1VCVFJFRUNIRUNLKQorCQkJCWMgPSBkdW1wb3B0KGMsICJub19zdWJ0cmVlX2NoZWNrIik7CisJCQlpZiAoZXAtPmVfZmxhZ3MgJiBORlNFWFBfTk9BVVRITkxNKQorCQkJCWMgPSBkdW1wb3B0KGMsICJpbnNlY3VyZV9sb2NrcyIpOworCQkJaWYgKGVwLT5lX2ZsYWdzICYgTkZTRVhQX05PQUNMKQorCQkJCWMgPSBkdW1wb3B0KGMsICJub19hY2wiKTsKKwkJCWlmIChlcC0+ZV9mbGFncyAmIE5GU0VYUF9GU0lEKQorCQkJCWMgPSBkdW1wb3B0KGMsICJmc2lkPSVkIiwgZXAtPmVfZnNpZCk7CisJCQlpZiAoZXAtPmVfdXVpZCkKKwkJCQljID0gZHVtcG9wdChjLCAiZnNpZD0lcyIsIGVwLT5lX3V1aWQpOworCQkJaWYgKGVwLT5lX21vdW50cG9pbnQpCisJCQkJYyA9IGR1bXBvcHQoYywgIm1vdW50cG9pbnQlcyVzIiwgCisJCQkJCSAgICBlcC0+ZV9tb3VudHBvaW50WzBdPyI9IjoiIiwgCisJCQkJCSAgICBlcC0+ZV9tb3VudHBvaW50KTsKKwkJCWlmIChlcC0+ZV9hbm9udWlkICE9IDY1NTM0KQorCQkJCWMgPSBkdW1wb3B0KGMsICJhbm9udWlkPSVkIiwgZXAtPmVfYW5vbnVpZCk7CisJCQlpZiAoZXAtPmVfYW5vbmdpZCAhPSA2NTUzNCkKKwkJCQljID0gZHVtcG9wdChjLCAiYW5vbmdpZD0lZCIsIGVwLT5lX2Fub25naWQpOworCQkJc3dpdGNoKGVwLT5lX2ZzbG9jbWV0aG9kKSB7CisJCQljYXNlIEZTTE9DX05PTkU6CisJCQkJYnJlYWs7CisJCQljYXNlIEZTTE9DX1JFRkVSOgorCQkJCWMgPSBkdW1wb3B0KGMsICJyZWZlcj0lcyIsIGVwLT5lX2ZzbG9jZGF0YSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZTTE9DX1JFUExJQ0E6CisJCQkJYyA9IGR1bXBvcHQoYywgInJlcGxpY2FzPSVzIiwgZXAtPmVfZnNsb2NkYXRhKTsKKwkJCQlicmVhazsKKyNpZmRlZiBERUJVRworCQkJY2FzZSBGU0xPQ19TVFVCOgorCQkJCWMgPSBkdW1wb3B0KGMsICJmc2xvYz1zdHViIik7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCX0KKwkJCXNlY2luZm9fc2hvdyhzdGRvdXQsIGVwKTsKKwkJCXByaW50ZigiJWNcbiIsIChjICE9ICcoJyk/ICcpJyA6ICcgJyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlcnJvcihuZnNfZXhwb3J0ICpleHAsIGludCBlcnIpCit7CisJZnByaW50ZihzdGRlcnIsICIlczolczogJXNcbiIsIGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUsIAorCQlleHAtPm1fZXhwb3J0LmVfcGF0aCwgc3RyZXJyb3IoZXJyKSk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IGV4cG9ydGZzIFstYXJ1dl0gW2hvc3Q6L3BhdGhdXG4iKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2V4cG9ydGZzL2V4cG9ydGZzLm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9leHBvcnRmcy9leHBvcnRmcy5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdiMjMwYQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9leHBvcnRmcy9leHBvcnRmcy5tYW4KQEAgLTAsMCArMSwyNDYgQEAKKy5cIgorLlwiIGV4cG9ydGZzKDgpCisuXCIgCisuXCIgQ29weXJpZ2h0IChDKSAxOTk1IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorLlwiIE1vZGlmaWNhdGlvbnMgMTk5OS0yMDAzIE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4KKy5USCBleHBvcnRmcyA4ICIxOCBKdWx5IDIwMDMiCisuU0ggTkFNRQorZXhwb3J0ZnMgXC0gbWFpbnRhaW4gbGlzdCBvZiBORlMgZXhwb3J0ZWQgZmlsZSBzeXN0ZW1zCisuU0ggU1lOT1BTSVMKKy5CSSAiL3Vzci9zYmluL2V4cG9ydGZzIFstYXZpXSBbLW8gIiAib3B0aW9ucywuLiIgIl0gWyIgImNsaWVudDovcGF0aCIgIiAuLl0KKy5icgorLkJJICIvdXNyL3NiaW4vZXhwb3J0ZnMgLXIgWy12XSIKKy5icgorLkJJICIvdXNyL3NiaW4vZXhwb3J0ZnMgWy1hdl0gLXUgWyIgImNsaWVudDovcGF0aCIgIiAuLl0KKy5icgorLkJJICIvdXNyL3NiaW4vZXhwb3J0ZnMgWy12XQorLmJyCisuQkkgIi91c3Ivc2Jpbi9leHBvcnRmcyAtZiIKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIGV4cG9ydGZzCitjb21tYW5kIGlzIHVzZWQgdG8gbWFpbnRhaW4gdGhlIGN1cnJlbnQgdGFibGUgb2YgZXhwb3J0ZWQgZmlsZSBzeXN0ZW1zIGZvcgorTkZTLiBUaGlzIGxpc3QgaXMga2VwdCBpbiBhIHNlcGFyYXRlIGZpbGUgbmFtZWQKKy5CUiAvdmFyL2xpYi9uZnMvZXRhYgord2hpY2ggaXMgcmVhZCBieQorLkIgbW91bnRkCit3aGVuIGEgcmVtb3RlIGhvc3QgcmVxdWVzdHMgYWNjZXNzIHRvIG1vdW50IGEgZmlsZSB0cmVlLCBhbmQgcGFydHMgb2YKK3RoZSBsaXN0IHdoaWNoIGFyZSBhY3RpdmUgYXJlIGtlcHQgaW4gdGhlIGtlcm5lbCdzIGV4cG9ydCB0YWJsZS4KKy5QCitOb3JtYWxseSB0aGlzIAorLkIgZXRhYgorZmlsZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBsaXN0IG9mIGFsbCBmaWxlIHN5c3RlbXMgbmFtZWQgaW4KKy5CIC9ldGMvZXhwb3J0cyAKK2J5IGludm9raW5nCisuQlIgImV4cG9ydGZzIC1hIiAuCisuUAorSG93ZXZlciwgYWRtaW5pc3RyYXRvcnMgY2FuIGNob29zZSB0byBhZGQgYW5kIGRlbGV0ZSBpbmRpdmlkdWFsIGZpbGUgc3lzdGVtcword2l0aG91dCBtb2RpZnlpbmcKKy5CIC9ldGMvZXhwb3J0cwordXNpbmcKKy5CUiBleHBvcnRmcyAuCisuUAorLkIgZXhwb3J0ZnMKK2FuZCBpdCdzIHBhcnRuZXIgcHJvZ3JhbQorLkIgbW91bnRkCit3b3JrIGluIG9uZSBvZiB0d28gbW9kZXMsIGEgbGVnYWN5IG1vZGUgd2hpY2ggYXBwbGllcyB0byAyLjQgYW5kCitlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBhIG5ldyBtb2RlIHdoaWNoIGFwcGxpZXMgdG8KKzIuNiBhbmQgbGF0ZXIgdmVyc2lvbnMgcHJvdmlkaW5nIHRoZQorLkIgbmZzZAordmlydHVhbCBmaWxlc3lzdGVtIGhhcyBiZWVuIG1vdW50ZWQgYXQKKy5CIC9wcm9jL2ZzL25mc2QKK29yCisuQlIgL3Byb2MvZnMvbmZzIC4KK0lmIHRoaXMgZmlsZXN5c3RlbSBpcyBub3QgbW91bnRlZCBpbiAyLjYsIHRoZSBsZWdhY3kgbW9kZSBpcyB1c2VkLgorLlAKK0luIHRoZSBuZXcgbW9kZSwKKy5CIGV4cG9ydGZzCitkb2VzIG5vdCBnaXZlIGFueSBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsIGJ1dCBvbmx5IHByb3ZpZGVzIGl0IHRvCisuQiBtb3VudGQKK3Rocm91Z2ggdGhlCisuQiAvdmFyL2xpYi9uZnMvZXRhYgorZmlsZS4KKy5CIG1vdW50ZAord2lsbCBsaXN0ZW4gdG8gcmVxdWVzdHMgZnJvbSB0aGUga2VybmVsIGFuZCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24KK2FzIG5lZWRlZC4KKy5QCitJbiB0aGUgbGVnYWN5IG1vZGUsCithbnkgZXhwb3J0IHJlcXVlc3RzIHdoaWNoIGlkZW50aWZ5IGEgc3BlY2lmaWMgaG9zdCAocmF0aGVyIHRoYW4gYQorc3VibmV0IG9yIG5ldGdyb3VwIGV0YykgYXJlIGVudGVyZWQgZGlyZWN0bHkgaW50byB0aGUga2VybmVsJ3MgZXhwb3J0Cit0YWJsZSBhcyB3ZWxsIGFzIGJlaW5nIHdyaXR0ZW4gdG8KKy5CUiAvdmFyL2xpYi9uZnMvZXRhYiAuCitGdXJ0aGVyLCBhbnkgbW91bnQgcG9pbnRzIGxpc3RlZCBpbgorLkIgL3Zhci9saWIvbmZzL3JtdGFiCit3aGljaCBtYXRjaCBhIG5vbiBob3N0LXNwZWNpZmljIGV4cG9ydCByZXF1ZXN0IHdpbGwgY2F1c2UgYW4KK2FwcHJvcHJpYXRlIGV4cG9ydCBlbnRyeSBmb3IgdGhlIGhvc3QgZ2l2ZW4gaW4KKy5CIHJtdGFiCit0byBiZSBlbnRlcmVkCitpbnRvIHRoZSBrZXJuZWwncyBleHBvcnQgdGFibGUuCisuU0ggT1BUSU9OUworLlRQIAorLkIgLWEKK0V4cG9ydCBvciB1bmV4cG9ydCBhbGwgZGlyZWN0b3JpZXMuCisuVFAKKy5CSSAiLW8gIiBvcHRpb25zLC4uLgorU3BlY2lmeSBhIGxpc3Qgb2YgZXhwb3J0IG9wdGlvbnMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIGluCisuQlIgZXhwb3J0cyg1KSAuCisuVFAKKy5CIC1pCitJZ25vcmUgdGhlCisuQiAvZXRjL2V4cG9ydHMKK2ZpbGUsIHNvIHRoYXQgb25seSBkZWZhdWx0IG9wdGlvbnMgYW5kIG9wdGlvbnMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKK2xpbmUgYXJlIHVzZWQuCisuVFAKKy5CIC1yCitSZWV4cG9ydCBhbGwgZGlyZWN0b3JpZXMuIEl0IHN5bmNocm9uaXplcyAvdmFyL2xpYi9uZnMvZXRhYgord2l0aCAvZXRjL2V4cG9ydHMuIEl0IHJlbW92ZXMgZW50cmllcyBpbiAvdmFyL2xpYi9uZnMvZXRhYgord2hpY2ggYXJlIGRlbGV0ZWQgZnJvbSAvZXRjL2V4cG9ydHMsIGFuZCByZW1vdmUgYW55IGVudHJpZXMgZnJvbSB0aGUKK2tlcm5lbCBleHBvcnQgdGFibGUgd2hpY2ggYXJlIG5vIGxvbmdlciB2YWxpZC4KKy5UUAorLkIgLXUKK1VuZXhwb3J0IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzLgorLlRQCisuQiAtZgorSW4gJ25ldycgbW9kZSwgZmx1c2ggZXZlcnl0aGluZyBvdXQgb2YgdGhlIGtlcm5lbHMgZXhwb3J0IHRhYmxlLiBBbnkKK2NsaWVudHMgdGhhdCBhcmUgYWN0aXZlIHdpbGwgZ2V0IG5ldyBlbnRyaWVzIGFkZGVkIGJ5CisuQiBtb3VudGQKK3doZW4gdGhleSBtYWtlIHRoZWlyIG5leHQgcmVxdWVzdC4KKy5UUAorLkIgLXYKK0JlIHZlcmJvc2UuIFdoZW4gZXhwb3J0aW5nIG9yIHVuZXhwb3J0aW5nLCBzaG93IHdoYXQncyBnb2luZyBvbi4gV2hlbgorZGlzcGxheWluZyB0aGUgY3VycmVudCBleHBvcnQgbGlzdCwgYWxzbyBkaXNwbGF5IHRoZSBsaXN0IG9mIGV4cG9ydAorb3B0aW9ucy4KKy5TSCBESVNDVVNTSU9OCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXhwb3J0aW5nIERpcmVjdG9yaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisuU1MgRXhwb3J0aW5nIERpcmVjdG9yaWVzCitUaGUgZmlyc3Qgc3lub3BzaXMgc2hvd3MgaG93IHRvIGludm9rZSB0aGUgY29tbWFuZCB3aGVuIGFkZGluZyBuZXcKK2VudHJpZXMgdG8gdGhlIGV4cG9ydCB0YWJsZS4gIFdoZW4gdXNpbmcgCisuQlIgImV4cG9ydGZzIC1hIiAsCithbGwgZGlyZWN0b3JpZXMgaW4KKy5CIGV4cG9ydHMoNSkKK2FyZSBhZGRlZCB0bworLkIgZXRhYgorYW5kIHRoZSByZXN1bHRpbmcgbGlzdCBpcyBwdXNoZWQgaW50byB0aGUga2VybmVsLgorLlAKK1RoZQorLkkgaG9zdDovcGF0aAorYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgdG8gZXhwb3J0IGFsb25nIHdpdGggdGhlIGhvc3Qgb3IgaG9zdHMgdG8KK2V4cG9ydCBpdCB0by4gQWxsIGZvcm1hdHMgZGVzY3JpYmVkIGluCisuQiBleHBvcnRzKDUpCithcmUgc3VwcG9ydGVkOyB0byBleHBvcnQgYSBkaXJlY3RvcnkgdG8gdGhlIHdvcmxkLCBzaW1wbHkgc3BlY2lmeQorLklSIDovcGF0aCAuCisuUAorVGhlIGV4cG9ydCBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaG9zdC9kaXJlY3RvcnkgcGFpciBkZXJpdmUgZnJvbQorc2V2ZXJhbCBzb3VyY2VzLiAgVGhlcmUgaXMgYSBzZXQgb2YgZGVmYXVsdCBvcHRpb25zIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5CitlbnRyaWVzIGluCisuQiAvZXRjL2V4cG9ydHMKKyh1bmxlc3MgdGhlCisuQiAtaQorb3B0aW9uIGlzIGdpdmVuKS4KK0luIGFkZGl0aW9uLCB0aGUgYWRtaW5pc3RyYXRvciBtYXkgb3ZlcnJpZGUgYW55IG9wdGlvbnMgZnJvbSB0aGVzZSBzb3VyY2VzCit1c2luZyB0aGUKKy5CIC1vCithcmd1bWVudCB3aGljaCB0YWtlcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9wdGlvbnMgaW4gdGhlIHNhbWUgZmFzaGlvbgorYXMgb25lIHdvdWxkIHNwZWNpZnkgdGhlbSBpbgorLkJSIGV4cG9ydHMoNSkgLgorVGh1cywKKy5CIGV4cG9ydGZzCitjYW4gYWxzbyBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZXhwb3J0IG9wdGlvbnMgb2YgYW4gYWxyZWFkeSBleHBvcnRlZAorZGlyZWN0b3J5LgorLlAKK01vZGlmaWNhdGlvbnMgb2YgdGhlIGtlcm5lbCBleHBvcnQgdGFibGUgdXNlZCBieQorLkIgbmZzZCg4KQordGFrZSBwbGFjZSBpbW1lZGlhdGVseSBhZnRlciBwYXJzaW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHVwZGF0aW5nIHRoZQorLkIgZXRhYgorZmlsZS4KKy5QCitUaGUgZGVmYXVsdCBleHBvcnQgb3B0aW9ucyBhcmUKKy5CUiBzeW5jLHJvLHJvb3Rfc3F1YXNoLHdkZWxheSAuCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0gVW5leHBvcnRpbmcgRGlyZWN0b3JpZXMgLS0tLS0tLS0tLS0tLS0tLS0tCisuU1MgVW5leHBvcnRpbmcgRGlyZWN0b3JpZXMKK1RoZSB0aGlyZCBzeW5vcHNpcyBzaG93cyBob3cgdG8gdW5leHBvcnRlZCBhIGN1cnJlbnRseSBleHBvcnRlZCBkaXJlY3RvcnkuCitXaGVuIHVzaW5nCisuQlIgImV4cG9ydGZzIC11YSIgLAorYWxsIGVudHJpZXMgbGlzdGVkIGluCisuQiBldGFiCithcmUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgZXhwb3J0IHRhYmxlcywgYW5kIHRoZSBmaWxlIGlzIGNsZWFyZWQuIFRoaXMKK2VmZmVjdGl2ZWx5IHNodXRzIGRvd24gYWxsIE5GUyBhY3Rpdml0eS4KKy5QCitUbyByZW1vdmUgYW4gZXhwb3J0IHRvIGEgaG9zdCwgc3BlY2lmeSBhCisuSSBob3N0Oi9wYXRoCitwYWlyLiBUaGlzIGRlbGV0ZXMgdGhlIHNwZWNpZmllZCBlbnRyeSBmcm9tCisuQiBldGFiCithbmQgcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBrZXJuZWwgZW50cnkgKGlmIGFueSkuCitUbyByZW1vdmUgb25lIG9yIG1vcmUgZXhwb3J0cyB0byBzZXZlcmFsIGhvc3RzLCB1c2UKKy5CUiAiZXhwb3J0ZnMgLXVhIiAuCisuUAorLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tIER1bXBpbmcgdGhlIEV4cG9ydCBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLQorLlNTIER1bXBpbmcgdGhlIEV4cG9ydCBUYWJsZSAKK0ludm9raW5nCisuQiBleHBvcnRmcword2l0aG91dCBmdXJ0aGVyIG9wdGlvbnMgc2hvd3MgdGhlIGN1cnJlbnQgbGlzdCBvZiBleHBvcnRlZCBmaWxlIHN5c3RlbXMuCitXaGVuIGdpdmluZyB0aGUKKy5CIC12CitvcHRpb24sIHRoZSBsaXN0IG9mIGZsYWdzIHBlcnRhaW5pbmcgdG8gZWFjaCBleHBvcnQgYXJlIHNob3duIGluIGFkZGl0aW9uLgorLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYQU1QTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIIEVYQU1QTEVTCitUaGUgZm9sbG93aW5nIGFkZHMgYWxsIGRpcmVjdG9yaWVzIGxpc3RlZCBpbgorLkIgL2V0Yy9leHBvcnRzCit0bworLkIgL3Zhci9saWIvbmZzL2V0YWIKK2FuZCBwdXNoZXMgdGhlIHJlc3VsdGluZyBleHBvcnQgZW50cmllcyBpbnRvIHRoZSBrZXJuZWw6CisuUAorLm5mCisuQiAiIyBleHBvcnRmcyAtYQorLmZpCisuUAorVG8gZXhwb3J0IHRoZQorLkIgL3Vzci90bXAKK2RpcmVjdG9yeSB0byBob3N0IAorLkJSIGRqYW5nbyAsCithbGxvd2luZyBhc3luY2hyb25vdXMgd3JpdGVzLCBvbmUgd291bGQgZG8gdGhpczoKKy5QCisubmYKKy5CICIjIGV4cG9ydGZzIC1vIGFzeW5jIGRqYW5nbzovdXNyL3RtcAorLmZpCisuUAorVG8gdW5leHBvcnQgdGhlCisuQiAvdXNyL3RtcAorZGlyZWN0b3J5OgorLlAKKy5uZgorLkIgIiMgZXhwb3J0ZnMgLXUgZGphbmdvOi91c3IvdG1wCisuZmkKKy5QCitUbyB1bmV4cG9ydCBhbGwgdGhlIGRpcmVjdG9yaWVzIGxpc3RlZCBpbgorLkIgL2V0Yy9leHBvcnRzOgorLlAKKy5uZgorLkIgIiMgZXhwb3J0ZnMgLWF1CisuZmkKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBERVBFTkRFTkNJRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5TSCBERVBFTkRFTkNJRVMKK0V4cG9ydGluZyB0byBJUCBuZXR3b3JrcywgRE5TIGFuZCBOSVMgZG9tYWlucyBkb2VzIG5vdCBlbmFibGUgY2xpZW50cworZnJvbSB0aGVzZSBncm91cHMgdG8gYWNjZXNzIE5GUyBpbW1lZGlhdGVseTsgcmF0aGVyLCB0aGVzZSBzb3J0cyBvZgorZXhwb3J0cyBhcmUgaGludHMgdG8KKy5CIG1vdW50ZCg4KQordG8gZ3JhbnQgYW55IG1vdW50IHJlcXVlc3RzIGZyb20gdGhlc2UgY2xpZW50cy4KK1RoaXMgaXMgdXN1YWxseSBub3QgYSBiaWcgcHJvYmxlbSwgYmVjYXVzZSBhbnkgZXhpc3RpbmcgbW91bnRzIGFyZSBwcmVzZXJ2ZWQKK2luCisuQiBybXRhYgorYWNyb3NzIHJlYm9vdHMuCisuUAorV2hlbiB1bmV4cG9ydGluZyBhIG5ldHdvcmsgb3IgZG9tYWluIGVudHJ5LCBhbnkgY3VycmVudCBleHBvcnRzIHRvIG1lbWJlcnMKK29mIHRoaXMgZ3JvdXAgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlIHJlbWFpbmluZyB2YWxpZCBleHBvcnRzIGFuZAoraWYgdGhleSB0aGVtc2VsdmVzIGFyZSBubyBsb25nZXIgdmFsaWQgdGhleSB3aWxsIGJlIHJlbW92ZWQuCisuUAorLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFNFRSBBTFNPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuU0ggU0VFIEFMU08KKy5CUiBleHBvcnRzKDUpICIsICIgbW91bnRkKDgpCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVVUSE9SIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5TSCBBVVRIT1JTCitPbGFmIEtpcmNoLCA8b2tpckBtb25hZC5zd2IuZGU+CisuYnIKK05laWwgQnJvd24sIDxuZWlsYkBjc2UudW5zdy5lZHUuYXU+CisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9leHBvcnRmcy9leHBvcnRzLm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9leHBvcnRmcy9leHBvcnRzLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI4Y2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2V4cG9ydGZzL2V4cG9ydHMubWFuCkBAIC0wLDAgKzEsNTA1IEBACisuVEggRVhQT1JUUyA1ICI0IE1hcmNoIDIwMDUiICJMaW51eCIgIkxpbnV4IEZpbGUgRm9ybWF0cyBNYW51YWwiCisuU0ggTkFNRQorZXhwb3J0cyBcLSBORlMgZmlsZSBzeXN0ZW1zIGJlaW5nIGV4cG9ydGVkIChmb3IgS2VybmVsIGJhc2VkIE5GUykKKy5TSCBTWU5PUFNJUworLkIgL2V0Yy9leHBvcnRzCisuU0ggREVTQ1JJUFRJT04KK1RoZSBmaWxlCisuSSAvZXRjL2V4cG9ydHMKK3NlcnZlcyBhcyB0aGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBmb3IgZmlsZSBzeXN0ZW1zIHdoaWNoIG1heSBiZQorZXhwb3J0ZWQgdG8gTkZTIGNsaWVudHMuICBJdCBpcyB1c2VkIGJ5CisuSVIgZXhwb3J0ZnMgKDgpCit0byBnaXZlIGluZm9ybWF0aW9uIHRvCisuSVIgbW91bnRkICg4KQorYW5kIHRvIHRoZSBrZXJuZWwgYmFzZWQgTkZTIGZpbGUgc2VydmVyIGRhZW1vbgorLklSIG5mc2QgKDgpLgorLlBQCitUaGUgZmlsZSBmb3JtYXQgaXMgc2ltaWxhciB0byB0aGUgU3VuT1MKKy5JIGV4cG9ydHMKK2ZpbGUuIEVhY2ggbGluZSBjb250YWlucyBhbiBleHBvcnQgcG9pbnQgYW5kIGEgd2hpdGVzcGFjZS1zZXBhcmF0ZWQgbGlzdAorb2YgY2xpZW50cyBhbGxvd2VkIHRvIG1vdW50IHRoZSBmaWxlIHN5c3RlbSBhdCB0aGF0IHBvaW50LiBFYWNoIGxpc3RlZAorY2xpZW50IG1heSBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZAorbGlzdCBvZiBleHBvcnQgb3B0aW9ucyBmb3IgdGhhdCBjbGllbnQuIE5vIHdoaXRlc3BhY2UgaXMgcGVybWl0dGVkCitiZXR3ZWVuIGEgY2xpZW50IGFuZCBpdHMgb3B0aW9uIGxpc3QuCisuUFAKK0Fsc28sIGVhY2ggbGluZSBtYXkgaGF2ZSBvbmUgb3IgbW9yZSBzcGVjaWZpY2F0aW9ucyBmb3IgZGVmYXVsdCBvcHRpb25zCithZnRlciB0aGUgcGF0aCBuYW1lLCBpbiB0aGUgZm9ybSBvZiBhIGRhc2ggKCJcLSIpIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbgorbGlzdC4gVGhlIG9wdGlvbiBsaXN0IGlzIHVzZWQgZm9yIGFsbCBzdWJzZXF1ZW50IGV4cG9ydHMgb24gdGhhdCBsaW5lCitvbmx5LgorLlBQCitCbGFuayBsaW5lcyBhcmUgaWdub3JlZC4gIEEgcG91bmQgc2lnbiAoIiMiKSBpbnRyb2R1Y2VzIGEgY29tbWVudCB0byB0aGUKK2VuZCBvZiB0aGUgbGluZS4gRW50cmllcyBtYXkgYmUgY29udGludWVkIGFjcm9zcyBuZXdsaW5lcyB1c2luZyBhCitiYWNrc2xhc2guIElmIGFuIGV4cG9ydCBuYW1lIGNvbnRhaW5zIHNwYWNlcyBpdCBzaG91bGQgYmUgcXVvdGVkIHVzaW5nCitkb3VibGUgcXVvdGVzLiBZb3UgY2FuIGFsc28gc3BlY2lmeSBzcGFjZXMgb3Igb3RoZXIgdW51c3VhbCBjaGFyYWN0ZXIgaW4KK3RoZSBleHBvcnQgbmFtZSB1c2luZyBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSB0aGUgY2hhcmFjdGVyIGNvZGUgYXMgdGhyZWUKK29jdGFsIGRpZ2l0cy4KKy5QUAorVG8gYXBwbHkgY2hhbmdlcyB0byB0aGlzIGZpbGUsIHJ1biBleHBvcnRmcyBcLXJhIG9yIHJlc3RhcnQgdGhlIE5GUyBzZXJ2ZXIuCisuUFAKKy5TUyBNYWNoaW5lIE5hbWUgRm9ybWF0cworTkZTIGNsaWVudHMgbWF5IGJlIHNwZWNpZmllZCBpbiBhIG51bWJlciBvZiB3YXlzOgorLklQICJzaW5nbGUgaG9zdAorVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gZm9ybWF0LiBZb3UgbWF5IHNwZWNpZnkgYSBob3N0IGVpdGhlciBieSBhbgorYWJicmV2aWF0ZWQgbmFtZSByZWNvZ25pemVkIGJlIHRoZSByZXNvbHZlciwgdGhlIGZ1bGx5IHF1YWxpZmllZCBkb21haW4KK25hbWUsIG9yIGFuIElQIGFkZHJlc3MuCisuSVAgIm5ldGdyb3VwcworTklTIG5ldGdyb3VwcyBtYXkgYmUgZ2l2ZW4gYXMKKy5JUiBAZ3JvdXAgLgorT25seSB0aGUgaG9zdCBwYXJ0IG9mIGVhY2gKK25ldGdyb3VwIG1lbWJlcnMgaXMgY29uc2lkZXIgaW4gY2hlY2tpbmcgZm9yIG1lbWJlcnNoaXAuICBFbXB0eSBob3N0CitwYXJ0cyBvciB0aG9zZSBjb250YWluaW5nIGEgc2luZ2xlIGRhc2ggKFwtKSBhcmUgaWdub3JlZC4KKy5JUCAid2lsZGNhcmRzCitNYWNoaW5lIG5hbWVzIG1heSBjb250YWluIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXJzIFxmSSpcZlIgYW5kIFxmST9cZlIuCitUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdGhlIFxmSWV4cG9ydHNcZlIgZmlsZSBtb3JlIGNvbXBhY3Q7IGZvciBpbnN0YW5jZSwKK1xmSSouY3MuZm9vLmVkdVxmUiBtYXRjaGVzIGFsbCBob3N0cyBpbiB0aGUgZG9tYWluCitcZkljcy5mb28uZWR1XGZSLiAgQXMgdGhlc2UgY2hhcmFjdGVycyBhbHNvIG1hdGNoIHRoZSBkb3RzIGluIGEgZG9tYWluCituYW1lLCB0aGUgZ2l2ZW4gcGF0dGVybiB3aWxsIGFsc28gbWF0Y2ggYWxsIGhvc3RzIHdpdGhpbiBhbnkgc3ViZG9tYWluCitvZiBcZkljcy5mb28uZWR1XGZSLgorLklQICJJUCBuZXR3b3JrcworWW91IGNhbiBhbHNvIGV4cG9ydCBkaXJlY3RvcmllcyB0byBhbGwgaG9zdHMgb24gYW4gSVAgKHN1Yi0pIG5ldHdvcmsKK3NpbXVsdGFuZW91c2x5LiBUaGlzIGlzIGRvbmUgYnkgc3BlY2lmeWluZyBhbiBJUCBhZGRyZXNzIGFuZCBuZXRtYXNrIHBhaXIKK2FzCisuSVIgYWRkcmVzcy9uZXRtYXNrCit3aGVyZSB0aGUgbmV0bWFzayBjYW4gYmUgc3BlY2lmaWVkIGluIGRvdHRlZC1kZWNpbWFsIGZvcm1hdCwgb3IgYXMgYQorY29udGlndW91cyBtYXNrIGxlbmd0aCAoZm9yIGV4YW1wbGUsIGVpdGhlciBgLzI1NS4yNTUuMjUyLjAnIG9yIGAvMjInIGFwcGVuZGVkCit0byB0aGUgbmV0d29yayBiYXNlIGFkZHJlc3MgcmVzdWx0IGluIGlkZW50aWNhbCBzdWJuZXR3b3JrcyB3aXRoIDEwIGJpdHMgb2YKK2hvc3QpLiBXaWxkY2FyZCBjaGFyYWN0ZXJzIGdlbmVyYWxseSBkbyBub3Qgd29yayBvbiBJUCBhZGRyZXNzZXMsIHRob3VnaCB0aGV5CittYXkgd29yayBieSBhY2NpZGVudCB3aGVuIHJldmVyc2UgRE5TIGxvb2t1cHMgZmFpbC4KKycnJy5UUAorJycnLkIgPXB1YmxpYworJycnVGhpcyBpcyBhIHNwZWNpYWwgYGBob3N0bmFtZScnIHRoYXQgaWRlbnRpZmllcyB0aGUgZ2l2ZW4gZGlyZWN0b3J5IG5hbWUKKycnJ2FzIHRoZSBwdWJsaWMgcm9vdCBkaXJlY3RvcnkgKHNlZSB0aGUgc2VjdGlvbiBvbiBXZWJORlMgaW4KKycnJy5CUiBuZnNkICg4KQorJycnZm9yIGEgZGlzY3Vzc2lvbiBvZiBXZWJORlMgYW5kIHRoZSBwdWJsaWMgcm9vdCBoYW5kbGUpLiBXaGVuIHVzaW5nIHRoaXMKKycnJ2NvbnZlbnRpb24sCisnJycuQiA9cHVibGljCisnJydtdXN0IGJlIHRoZSBvbmx5IGVudHJ5IG9uIHRoaXMgbGluZSwgYW5kIG11c3QgaGF2ZSBubyBleHBvcnQgb3B0aW9ucworJycnYXNzb2NpYXRlZCB3aXRoIGl0LiBOb3RlIHRoYXQgdGhpcyBkb2VzCisnJycuSSBub3QKKycnJ2FjdHVhbGx5IGV4cG9ydCB0aGUgbmFtZWQgZGlyZWN0b3J5OyB5b3Ugc3RpbGwgaGF2ZSB0byBzZXQgdGhlIGV4cG9ydHMKKycnJ29wdGlvbnMgaW4gYSBzZXBhcmF0ZSBlbnRyeS4KKycnJy5QUAorJycnVGhlIHB1YmxpYyByb290IHBhdGggY2FuIGFsc28gYmUgc3BlY2lmaWVkIGJ5IGludm9raW5nCisnJycuSSBuZnNkCisnJyd3aXRoIHRoZQorJycnLkIgXC1cLXB1YmxpY1wtcm9vdAorJycnb3B0aW9uLiBNdWx0aXBsZSBzcGVjaWZpY2F0aW9ucyBvZiBhIHB1YmxpYyByb290IHdpbGwgYmUgaWdub3JlZC4KKy5QUAorLlNTIFJQQ1NFQ19HU1Mgc2VjdXJpdHkKK1lvdSBtYXkgdXNlIHRoZSBzcGVjaWFsIHN0cmluZ3MgImdzcy9rcmI1IiwgImdzcy9rcmI1aSIsIG9yICJnc3Mva3JiNXAiCit0byByZXN0cmljdCBhY2Nlc3MgdG8gY2xpZW50cyB1c2luZyBycGNzZWNfZ3NzIHNlY3VyaXR5LiAgSG93ZXZlciwgdGhpcworc3ludGF4IGlzIGRlcHJlY2F0ZWQ7IG9uIGxpbnV4IGtlcm5lbHMgc2luY2UgMi42LjIzLCB5b3Ugc2hvdWxkIGluc3RlYWQKK3VzZSB0aGUgInNlYz0iIGV4cG9ydCBvcHRpb246CisuVFAKKy5JUiBzZWM9CitUaGUgc2VjPSBvcHRpb24sIGZvbGxvd2VkIGJ5IGEgY29sb24tZGVsaW1pdGVkIGxpc3Qgb2Ygc2VjdXJpdHkgZmxhdm9ycywKK3Jlc3RyaWN0cyB0aGUgZXhwb3J0IHRvIGNsaWVudHMgdXNpbmcgdGhvc2UgZmxhdm9ycy4gIEF2YWlsYWJsZSBzZWN1cml0eQorZmxhdm9ycyBpbmNsdWRlIHN5cyAodGhlIGRlZmF1bHQtLW5vIGNyeXB0b2dyYXBoaWMgc2VjdXJpdHkpLCBrcmI1CisoYXV0aGVudGljYXRpb24gb25seSksIGtyYjVpIChpbnRlZ3JpdHkgcHJvdGVjdGlvbiksIGFuZCBrcmI1cCAocHJpdmFjeQorcHJvdGVjdGlvbikuICBGb3IgdGhlIHB1cnBvc2VzIG9mIHNlY3VyaXR5IGZsYXZvciBuZWdvdGlhdGlvbiwgb3JkZXIKK2NvdW50czogcHJlZmVycmVkIGZsYXZvcnMgc2hvdWxkIGJlIGxpc3RlZCBmaXJzdC4gIFRoZSBvcmRlciBvZiB0aGUgc2VjPQorb3B0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgb3RoZXIgb3B0aW9ucyBkb2VzIG5vdCBtYXR0ZXIsIHVubGVzcyB5b3UKK3dhbnQgc29tZSBvcHRpb25zIHRvIGJlIGVuZm9yY2VkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBmbGF2b3IuCitJbiB0aGF0IGNhc2UgeW91IG1heSBpbmNsdWRlIG11bHRpcGxlIHNlYz0gb3B0aW9ucywgYW5kIGZvbGxvd2luZyBvcHRpb25zCit3aWxsIGJlIGVuZm9yY2VkIG9ubHkgZm9yIGFjY2VzcyB1c2luZyBmbGF2b3JzIGxpc3RlZCBpbiB0aGUgaW1tZWRpYXRlbHkKK3ByZWNlZGluZyBzZWM9IG9wdGlvbi4gIFRoZSBvbmx5IG9wdGlvbnMgdGhhdCBhcmUgcGVybWl0dGVkIHRvIHZhcnkgaW4KK3RoaXMgd2F5IGFyZSBybywgcncsIG5vX3Jvb3Rfc3F1YXNoLCByb290X3NxdWFzaCwgYW5kIGFsbF9zcXVhc2guCisuUFAKKy5TUyBHZW5lcmFsIE9wdGlvbnMKKy5JUiBleHBvcnRmcwordW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBleHBvcnQgb3B0aW9uczoKKy5UUAorLklSIHNlY3VyZSAiXCpkCitUaGlzIG9wdGlvbiByZXF1aXJlcyB0aGF0IHJlcXVlc3RzIG9yaWdpbmF0ZSBvbiBhbiBJbnRlcm5ldCBwb3J0IGxlc3MKK3RoYW4gSVBQT1JUX1JFU0VSVkVEICgxMDI0KS4gVGhpcyBvcHRpb24gaXMgb24gYnkgZGVmYXVsdC4gVG8gdHVybiBpdAorb2ZmLCBzcGVjaWZ5CisuSVIgaW5zZWN1cmUgLgorLlRQCisuSVIgcncKK0FsbG93IGJvdGggcmVhZCBhbmQgd3JpdGUgcmVxdWVzdHMgb24gdGhpcyBORlMgdm9sdW1lLiBUaGUKK2RlZmF1bHQgaXMgdG8gZGlzYWxsb3cgYW55IHJlcXVlc3Qgd2hpY2ggY2hhbmdlcyB0aGUgZmlsZXN5c3RlbS4KK1RoaXMgY2FuIGFsc28gYmUgbWFkZSBleHBsaWNpdCBieSB1c2luZwordGhlCisuSVIgcm8gIiBvcHRpb24uCisuVFAKKy5JUiBhc3luYworVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBORlMgc2VydmVyIHRvIHZpb2xhdGUgdGhlIE5GUyBwcm90b2NvbCBhbmQKK3JlcGx5IHRvIHJlcXVlc3RzIGJlZm9yZSBhbnkgY2hhbmdlcyBtYWRlIGJ5IHRoYXQgcmVxdWVzdCBoYXZlIGJlZW4KK2NvbW1pdHRlZCB0byBzdGFibGUgc3RvcmFnZSAoZS5nLiBkaXNjIGRyaXZlKS4KKworVXNpbmcgdGhpcyBvcHRpb24gdXN1YWxseSBpbXByb3ZlcyBwZXJmb3JtYW5jZSwgYnV0IGF0IHRoZSBjb3N0IHRoYXQKK2FuIHVuY2xlYW4gc2VydmVyIHJlc3RhcnQgKGkuZS4gYSBjcmFzaCkgY2FuIGNhdXNlIGRhdGEgdG8gYmUgbG9zdCBvcgorY29ycnVwdGVkLgorCisuVFAKKy5JUiBzeW5jCitSZXBseSB0byByZXF1ZXN0cyBvbmx5IGFmdGVyIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBjb21taXR0ZWQgdG8gc3RhYmxlCitzdG9yYWdlIChzZWUKKy5JUiBhc3luYworYWJvdmUpLgorCitJbiByZWxlYXNlcyBvZiBuZnMtdXRpbHMgdXAgdG8gYW5kIGluY2x1ZGluZyAxLjAuMCwgdGhpcyBvcHRpb24gd2FzIHRoZQorZGVmYXVsdC4gIEluIGFsbCByZWxlYXNlcyBhZnRlciAxLjAuMCwKKy5JIHN5bmMKK2lzIHRoZSBkZWZhdWx0LCBhbmQKKy5JIGFzeW5jCittdXN0IGJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGlmIG5lZWRlZC4KK1RvIGhlbHAgbWFrZSBzeXN0ZW0gYWRtaW5pc3RyYXRvcnMgYXdhcmUgb2YgdGhpcyBjaGFuZ2UsICdleHBvcnRmcycKK3dpbGwgaXNzdWUgYSB3YXJuaW5nIGlmIG5laXRoZXIKKy5JIHN5bmMKK25vcgorLkkgYXN5bmMKK2lzIHNwZWNpZmllZC4KKy5UUAorLklSIG5vX3dkZWxheQorVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZgorLkkgYXN5bmMKK2lzIGFsc28gc2V0LiAgVGhlIE5GUyBzZXJ2ZXIgd2lsbCBub3JtYWxseSBkZWxheSBjb21taXR0aW5nIGEgd3JpdGUgcmVxdWVzdAordG8gZGlzYyBzbGlnaHRseSBpZiBpdCBzdXNwZWN0cyB0aGF0IGFub3RoZXIgcmVsYXRlZCB3cml0ZSByZXF1ZXN0IG1heSBiZSBpbgorcHJvZ3Jlc3Mgb3IgbWF5IGFycml2ZSBzb29uLiAgVGhpcyBhbGxvd3MgbXVsdGlwbGUgd3JpdGUgcmVxdWVzdHMgdG8KK2JlIGNvbW1pdHRlZCB0byBkaXNjIHdpdGggdGhlIG9uZSBvcGVyYXRpb24gd2hpY2ggY2FuIGltcHJvdmUKK3BlcmZvcm1hbmNlLiAgSWYgYW4gTkZTIHNlcnZlciByZWNlaXZlZCBtYWlubHkgc21hbGwgdW5yZWxhdGVkCityZXF1ZXN0cywgdGhpcyBiZWhhdmlvdXIgY291bGQgYWN0dWFsbHkgcmVkdWNlIHBlcmZvcm1hbmNlLCBzbworLklSIG5vX3dkZWxheQoraXMgYXZhaWxhYmxlIHRvIHR1cm4gaXQgb2ZmLgorVGhlIGRlZmF1bHQgY2FuIGJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHdpdGggdGhlCisuSVIgd2RlbGF5ICIgb3B0aW9uLgorLlRQCisuSVIgbm9oaWRlCitUaGlzIG9wdGlvbiBpcyBiYXNlZCBvbiB0aGUgb3B0aW9uIG9mIHRoZSBzYW1lIG5hbWUgcHJvdmlkZWQgaW4gSVJJWAorTkZTLiAgTm9ybWFsbHksIGlmIGEgc2VydmVyIGV4cG9ydHMgdHdvIGZpbGVzeXN0ZW1zIG9uZSBvZiB3aGljaCBpcworbW91bnRlZCBvbiB0aGUgb3RoZXIsIHRoZW4gdGhlIGNsaWVudCB3aWxsIGhhdmUgdG8gbW91bnQgYm90aAorZmlsZXN5c3RlbXMgZXhwbGljaXRseSB0byBnZXQgYWNjZXNzIHRvIHRoZW0uICBJZiBpdCBqdXN0IG1vdW50cyB0aGUKK3BhcmVudCwgaXQgd2lsbCBzZWUgYW4gZW1wdHkgZGlyZWN0b3J5IGF0IHRoZSBwbGFjZSB3aGVyZSB0aGUgb3RoZXIKK2ZpbGVzeXN0ZW0gaXMgbW91bnRlZC4gIFRoYXQgZmlsZXN5c3RlbSBpcyAiaGlkZGVuIi4KKworU2V0dGluZyB0aGUKKy5JIG5vaGlkZQorb3B0aW9uIG9uIGEgZmlsZXN5c3RlbSBjYXVzZXMgaXQgbm90IHRvIGJlIGhpZGRlbiwgYW5kIGFuCithcHByb3ByaWF0ZWx5IGF1dGhvcmlzZWQgY2xpZW50IHdpbGwgYmUgYWJsZSB0byBtb3ZlIGZyb20gdGhlIHBhcmVudCB0bwordGhhdCBmaWxlc3lzdGVtIHdpdGhvdXQgbm90aWNpbmcgdGhlIGNoYW5nZS4KKworSG93ZXZlciwgc29tZSBORlMgY2xpZW50cyBkbyBub3QgY29wZSB3ZWxsIHdpdGggdGhpcyBzaXR1YXRpb24gYXMsIGZvcgoraW5zdGFuY2UsIGl0IGlzIHRoZW4gcG9zc2libGUgZm9yIHR3byBmaWxlcyBpbiB0aGUgb25lIGFwcGFyZW50CitmaWxlc3lzdGVtIHRvIGhhdmUgdGhlIHNhbWUgaW5vZGUgbnVtYmVyLgorCitUaGUKKy5JIG5vaGlkZQorb3B0aW9uIGlzIGN1cnJlbnRseSBvbmx5IGVmZmVjdGl2ZSBvbgorLkkgInNpbmdsZSBob3N0CitleHBvcnRzLiAgSXQgZG9lcyBub3Qgd29yayByZWxpYWJseSB3aXRoIG5ldGdyb3VwLCBzdWJuZXQsIG9yIHdpbGRjYXJkCitleHBvcnRzLiAKKworVGhpcyBvcHRpb24gY2FuIGJlIHZlcnkgdXNlZnVsIGluIHNvbWUgc2l0dWF0aW9ucywgYnV0IGl0IHNob3VsZCBiZQordXNlZCB3aXRoIGR1ZSBjYXJlLCBhbmQgb25seSBhZnRlciBjb25maXJtaW5nIHRoYXQgdGhlIGNsaWVudCBzeXN0ZW0KK2NvcGVzIHdpdGggdGhlIHNpdHVhdGlvbiBlZmZlY3RpdmVseS4KKworVGhlIG9wdGlvbiBjYW4gYmUgZXhwbGljaXRseSBkaXNhYmxlZCB3aXRoCisuSVIgaGlkZSAuCisuVFAKKy5JUiBjcm9zc21udAorVGhpcyBvcHRpb24gaXMgc2ltaWxhciB0bworLkkgbm9oaWRlCitidXQgaXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIGNsaWVudHMgdG8gbW92ZSBmcm9tIHRoZSBmaWxlc3lzdGVtIG1hcmtlZAord2l0aCBjcm9zc21udCB0byBleHBvcnRlZCBmaWxlc3lzdGVtcyBtb3VudGVkIG9uIGl0LiAgVGh1cyB3aGVuIGEgY2hpbGQKK2ZpbGVzeXN0ZW0gIkIiIGlzIG1vdW50ZWQgb24gYSBwYXJlbnQgIkEiLCBzZXR0aW5nIGNyb3NzbW50IG9uICJBIiBoYXMKK3RoZSBzYW1lIGVmZmVjdCBhcyBzZXR0aW5nICJub2hpZGUiIG9uIEIuCisuVFAKKy5JUiBub19zdWJ0cmVlX2NoZWNrCitUaGlzIG9wdGlvbiBkaXNhYmxlcyBzdWJ0cmVlIGNoZWNraW5nLCB3aGljaCBoYXMgbWlsZCBzZWN1cml0eQoraW1wbGljYXRpb25zLCBidXQgY2FuIGltcHJvdmUgcmVsaWFiaWxpdHkgaW4gc29tZSBjaXJjdW1zdGFuY2VzLgorCitJZiBhIHN1YmRpcmVjdG9yeSBvZiBhIGZpbGVzeXN0ZW0gaXMgZXhwb3J0ZWQsIGJ1dCB0aGUgd2hvbGUKK2ZpbGVzeXN0ZW0gaXNuJ3QgdGhlbiB3aGVuZXZlciBhIE5GUyByZXF1ZXN0IGFycml2ZXMsIHRoZSBzZXJ2ZXIgbXVzdAorY2hlY2sgbm90IG9ubHkgdGhhdCB0aGUgYWNjZXNzZWQgZmlsZSBpcyBpbiB0aGUgYXBwcm9wcmlhdGUgZmlsZXN5c3RlbQorKHdoaWNoIGlzIGVhc3kpIGJ1dCBhbHNvIHRoYXQgaXQgaXMgaW4gdGhlIGV4cG9ydGVkIHRyZWUgKHdoaWNoIGlzCitoYXJkZXIpLiBUaGlzIGNoZWNrIGlzIGNhbGxlZCB0aGUKKy5JUiBzdWJ0cmVlX2NoZWNrIC4KKworSW4gb3JkZXIgdG8gcGVyZm9ybSB0aGlzIGNoZWNrLCB0aGUgc2VydmVyIG11c3QgaW5jbHVkZSBzb21lCitpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgaW4gdGhlICJmaWxlaGFuZGxlIiB0aGF0IGlzCitnaXZlbiB0byB0aGUgY2xpZW50LiAgVGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCBhY2Nlc3NpbmcgZmlsZXMgdGhhdAorYXJlIHJlbmFtZWQgd2hpbGUgYSBjbGllbnQgaGFzIHRoZW0gb3BlbiAodGhvdWdoIGluIG1hbnkgc2ltcGxlIGNhc2VzCitpdCB3aWxsIHN0aWxsIHdvcmspLgorCitzdWJ0cmVlIGNoZWNraW5nIGlzIGFsc28gdXNlZCB0byBtYWtlIHN1cmUgdGhhdCBmaWxlcyBpbnNpZGUKK2RpcmVjdG9yaWVzIHRvIHdoaWNoIG9ubHkgcm9vdCBoYXMgYWNjZXNzIGNhbiBvbmx5IGJlIGFjY2Vzc2VkIGlmIHRoZQorZmlsZXN5c3RlbSBpcyBleHBvcnRlZCB3aXRoCisuSSBub19yb290X3NxdWFzaAorKHNlZSBiZWxvdyksIGV2ZW4gaWYgdGhlIGZpbGUgaXRzZWxmIGFsbG93cyBtb3JlIGdlbmVyYWwgYWNjZXNzLgorCitBcyBhIGdlbmVyYWwgZ3VpZGUsIGEgaG9tZSBkaXJlY3RvcnkgZmlsZXN5c3RlbSwgd2hpY2ggaXMgbm9ybWFsbHkKK2V4cG9ydGVkIGF0IHRoZSByb290IGFuZCBtYXkgc2VlIGxvdHMgb2YgZmlsZSByZW5hbWVzLCBzaG91bGQgYmUKK2V4cG9ydGVkIHdpdGggc3VidHJlZSBjaGVja2luZyBkaXNhYmxlZC4gIEEgZmlsZXN5c3RlbSB3aGljaCBpcyBtb3N0bHkKK3JlYWRvbmx5LCBhbmQgYXQgbGVhc3QgZG9lc24ndCBzZWUgbWFueSBmaWxlIHJlbmFtZXMgKGUuZy4gL3VzciBvcgorL3ZhcikgYW5kIGZvciB3aGljaCBzdWJkaXJlY3RvcmllcyBtYXkgYmUgZXhwb3J0ZWQsIHNob3VsZCBwcm9iYWJseSBiZQorZXhwb3J0ZWQgd2l0aCBzdWJ0cmVlIGNoZWNrcyBlbmFibGVkLgorCitUaGUgZGVmYXVsdCBvZiBoYXZpbmcgc3VidHJlZSBjaGVja3MgZW5hYmxlZCwgY2FuIGJlIGV4cGxpY2l0bHkKK3JlcXVlc3RlZCB3aXRoCisuSVIgc3VidHJlZV9jaGVjayAuCisKK0Zyb20gcmVsZWFzZSAxLjEuMCBvZiBuZnMtdXRpbHMgb253YXJkcywgdGhlIGRlZmF1bHQgd2lsbCBiZQorLkkgbm9fc3VidHJlZV9jaGVjaworYXMgc3VidHJlZV9jaGVja2luZyB0ZW5kcyB0byBjYXVzZSBtb3JlIHByb2JsZW1zIHRoYW4gaXQgaXMgd29ydGguCitJZiB5b3UgZ2VudWluZWx5IHJlcXVpcmUgc3VidHJlZSBjaGVja2luZywgeW91IHNob3VsZCBleHBsaWNpdGx5IHB1dAordGhhdCBvcHRpb24gaW4gdGhlCisuQiBleHBvcnRzCitmaWxlLiAgSWYgeW91IHB1dCBuZWl0aGVyIG9wdGlvbiwKKy5JIGV4cG9ydGZzCit3aWxsIHdhcm4geW91IHRoYXQgdGhlIGNoYW5nZSBpcyBwZW5kaW5nLgorCisuVFAKKy5JUiBpbnNlY3VyZV9sb2NrcworLlRQCisuSVIgbm9fYXV0aF9ubG0KK1RoaXMgb3B0aW9uICh0aGUgdHdvIG5hbWVzIGFyZSBzeW5vbnltb3VzKSB0ZWxscyB0aGUgTkZTIHNlcnZlciBub3QgdG8gcmVxdWlyZSBhdXRoZW50aWNhdGlvbiBvZgorbG9ja2luZyByZXF1ZXN0cyAoaS5lLiByZXF1ZXN0cyB3aGljaCB1c2UgdGhlIE5MTSBwcm90b2NvbCkuICBOb3JtYWxseQordGhlIE5GUyBzZXJ2ZXIgd2lsbCByZXF1aXJlIGEgbG9jayByZXF1ZXN0IHRvIGhvbGQgYSBjcmVkZW50aWFsIGZvciBhCit1c2VyIHdobyBoYXMgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUuICBXaXRoIHRoaXMgZmxhZyBubyBhY2Nlc3MgY2hlY2tzCit3aWxsIGJlIHBlcmZvcm1lZC4KKworRWFybHkgTkZTIGNsaWVudCBpbXBsZW1lbnRhdGlvbnMgZGlkIG5vdCBzZW5kIGNyZWRlbnRpYWxzIHdpdGggbG9jaworcmVxdWVzdHMsIGFuZCBtYW55IGN1cnJlbnQgTkZTIGNsaWVudHMgc3RpbGwgZXhpc3Qgd2hpY2ggYXJlIGJhc2VkIG9uCit0aGUgb2xkIGltcGxlbWVudGF0aW9ucy4gIFVzZSB0aGlzIGZsYWcgaWYgeW91IGZpbmQgdGhhdCB5b3UgY2FuIG9ubHkKK2xvY2sgZmlsZXMgd2hpY2ggYXJlIHdvcmxkIHJlYWRhYmxlLgorCitUaGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgcmVxdWlyaW5nIGF1dGhlbnRpY2F0aW9uIGZvciBOTE0gcmVxdWVzdHMgY2FuCitiZSBleHBsaWNpdGx5IHJlcXVlc3RlZCB3aXRoIGVpdGhlciBvZiB0aGUgc3lub255bW91cworLklSIGF1dGhfbmxtICwKK29yCisuSVIgc2VjdXJlX2xvY2tzIC4KKy5UUAorLklSIG5vX2FjbAorT24gc29tZSBzcGVjaWFsbHkgcGF0Y2hlZCBrZXJuZWxzLCBhbmQgd2hlbiBleHBvcnRpbmcgZmlsZXN5c3RlbXMgdGhhdAorc3VwcG9ydCBBQ0xzLCB0aGlzIG9wdGlvbiB0ZWxscyBuZnNkIG5vdCB0byByZXZlYWwgQUNMcyB0byBjbGllbnRzLCBzbwordGhleSB3aWxsIHNlZSBvbmx5IGEgc3Vic2V0IG9mIGFjdHVhbCBwZXJtaXNzaW9ucyBvbiB0aGUgZ2l2ZW4gZmlsZQorc3lzdGVtLiAgVGhpcyBvcHRpb24gaXMgc2FmZSBmb3IgZmlsZXN5c3RlbXMgdXNlZCBieSBORlN2MiBjbGllbnRzIGFuZAorb2xkIE5GU3YzIGNsaWVudHMgdGhhdCBwZXJmb3JtIGFjY2VzcyBkZWNpc2lvbnMgbG9jYWxseS4gIEN1cnJlbnQKK05GU3YzIGNsaWVudHMgdXNlIHRoZSBBQ0NFU1MgUlBDIHRvIHBlcmZvcm0gYWxsIGFjY2VzcyBkZWNpc2lvbnMgb24KK3RoZSBzZXJ2ZXIuICBOb3RlIHRoYXQgdGhlCisuSSBub19hY2wKK29wdGlvbiBvbmx5IGhhcyBlZmZlY3Qgb24ga2VybmVscyBzcGVjaWFsbHkgcGF0Y2hlZCB0byBzdXBwb3J0IGl0LCBhbmQKK3doZW4gZXhwb3J0aW5nIGZpbGVzeXN0ZW1zIHdpdGggQUNMIHN1cHBvcnQuICBUaGUgZGVmYXVsdCBpcyB0byBleHBvcnQKK3dpdGggQUNMIHN1cHBvcnQgKGkuZS4gYnkgZGVmYXVsdCwKKy5JIG5vX2FjbAoraXMgb2ZmKS4KKworJycnLlRQCisnJycuSSBub2FjY2VzcworJycnVGhpcyBtYWtlcyBldmVyeXRoaW5nIGJlbG93IHRoZSBkaXJlY3RvcnkgaW5hY2Nlc3NpYmxlIGZvciB0aGUgbmFtZWQKKycnJ2NsaWVudC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gZXhwb3J0IGEgZGlyZWN0b3J5IGhpZXJhcmNoeSB0bworJycnYSBjbGllbnQsIGJ1dCBleGNsdWRlIGNlcnRhaW4gc3ViZGlyZWN0b3JpZXMuIFRoZSBjbGllbnQncyB2aWV3IG9mIGEKKycnJ2RpcmVjdG9yeSBmbGFnZ2VkIHdpdGggbm9hY2Nlc3MgaXMgdmVyeSBsaW1pdGVkOyBpdCBpcyBhbGxvd2VkIHRvIHJlYWQKKycnJ2l0cyBhdHRyaWJ1dGVzLCBhbmQgbG9va3VwIGAuJyBhbmQgYC4uJy4gVGhlc2UgYXJlIGFsc28gdGhlIG9ubHkgZW50cmllcworJycncmV0dXJuZWQgYnkgYSByZWFkZGlyLgorJycnLlRQCisnJycuSVIgbGlua19yZWxhdGl2ZQorJycnQ29udmVydCBhYnNvbHV0ZSBzeW1ib2xpYyBsaW5rcyAod2hlcmUgdGhlIGxpbmsgY29udGVudHMgc3RhcnQgd2l0aCBhCisnJydzbGFzaCkgaW50byByZWxhdGl2ZSBsaW5rcyBieSBwcmVwZW5kaW5nIHRoZSBuZWNlc3NhcnkgbnVtYmVyIG9mIC4uLydzCisnJyd0byBnZXQgZnJvbSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpbmsgdG8gdGhlIHJvb3Qgb24gdGhlCisnJydzZXJ2ZXIuICBUaGlzIGhhcyBzdWJ0bGUsIHBlcmhhcHMgcXVlc3Rpb25hYmxlLCBzZW1hbnRpY3Mgd2hlbiB0aGUgZmlsZQorJycnaGllcmFyY2h5IGlzIG5vdCBtb3VudGVkIGF0IGl0cyByb290LgorJycnLlRQCisnJycuSVIgbGlua19hYnNvbHV0ZQorJycnTGVhdmUgYWxsIHN5bWJvbGljIGxpbmsgYXMgdGhleSBhcmUuIFRoaXMgaXMgdGhlIGRlZmF1bHQgb3BlcmF0aW9uLgorCisuVFAKKy5JUiBtb3VudHBvaW50PSBwYXRoCisuVFAKKy5JIG1wCitUaGlzIG9wdGlvbiBtYWtlcyBpdCBwb3NzaWJsZSB0byBvbmx5IGV4cG9ydCBhIGRpcmVjdG9yeSBpZiBpdCBoYXMKK3N1Y2Nlc3NmdWxseSBiZWVuIG1vdW50ZWQuCitJZiBubyBwYXRoIGlzIGdpdmVuIChlLmcuCisuSVIgbW91bnRwb2ludCAiIG9yICIgbXAgKQordGhlbiB0aGUgZXhwb3J0IHBvaW50IG11c3QgYWxzbyBiZSBhIG1vdW50IHBvaW50LiAgSWYgaXQgaXNuJ3QgdGhlbgordGhlIGV4cG9ydCBwb2ludCBpcyBub3QgZXhwb3J0ZWQuICBUaGlzIGFsbG93cyB5b3UgdG8gYmUgc3VyZSB0aGF0IHRoZQorZGlyZWN0b3J5IHVuZGVybmVhdGggYSBtb3VudHBvaW50IHdpbGwgbmV2ZXIgYmUgZXhwb3J0ZWQgYnkgYWNjaWRlbnQKK2lmLCBmb3IgZXhhbXBsZSwgdGhlIGZpbGVzeXN0ZW0gZmFpbGVkIHRvIG1vdW50IGR1ZSB0byBhIGRpc2MgZXJyb3IuCisKK0lmIGEgcGF0aCBpcyBnaXZlbiAoZS5nLgorLklSIG1vdW50cG9pbnQ9ICIvcGF0aCBvciAiIG1wPSAvcGF0aCkKK3RoZW4gdGhlIG5vbWluYXRlZCBwYXRoIG11c3QgYmUgYSBtb3VudHBvaW50IGZvciB0aGUgZXhwb3J0cG9pbnQgdG8gYmUKK2V4cG9ydGVkLgorCisuVFAKKy5JUiBmc2lkPSBudW18cm9vdHx1dWlkCitORlMgbmVlZHMgdG8gYmUgYWJsZSB0byBpZGVudGlmeSBlYWNoIGZpbGVzeXN0ZW0gdGhhdCBpdCBleHBvcnRzLgorTm9ybWFsbHkgaXQgd2lsbCB1c2UgYSBVVUlEIGZvciB0aGUgZmlsZXN5c3RlbSAoaWYgdGhlIGZpbGVzeXN0ZW0gaGFzCitzdWNoIGEgdGhpbmcpIG9yIHRoZSBkZXZpY2UgbnVtYmVyIG9mIHRoZSBkZXZpY2UgaG9sZGluZyB0aGUKK2ZpbGVzeXN0ZW0gKGlmIHRoZSBmaWxlc3lzdGVtIGlzIHN0b3JlZCBvbiB0aGUgZGV2aWNlKS4KKworQXMgbm90IGFsbCBmaWxlc3lzdGVtcyBhcmUgc3RvcmVkIG9uIGRldmljZXMsIGFuZCBub3QgYWxsIGZpbGVzeXN0ZW1zCitoYXZlIFVVSURzLCBpdCBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgdGVsbCBORlMgaG93IHRvCitpZGVudGlmeSBhIGZpbGVzeXN0ZW0uICBUaGlzIGlzIGRvbmUgd2l0aCB0aGUKKy5JIGZzaWQ9CitvcHRpb24uCisKK0ZvciBORlN2NCwgdGhlcmUgaXMgYSBkaXN0aW5ndWlzaGVkIGZpbGVzeXN0ZW0gd2hpY2ggaXMgdGhlIHJvb3Qgb2YKK2FsbCBleHBvcnRlZCBmaWxlc3lzdGVtLiAgVGhpcyBpcyBzcGVjaWZpZWQgd2l0aAorLkkgZnNpZD1yb290CitvcgorLkkgZnNpZD0wCitib3RoIG9mIHdoaWNoIG1lYW4gZXhhY3RseSB0aGUgc2FtZSB0aGluZy4KKworT3RoZXIgZmlsZXN5c3RlbXMgY2FuIGJlIGlkZW50aWZpZWQgd2l0aCBhIHNtYWxsIGludGVnZXIsIG9yIGEgVVVJRAord2hpY2ggc2hvdWxkIGNvbnRhaW4gMzIgaGV4IGRpZ2l0cyBhbmQgYXJiaXRyYXJ5IHB1bmN0dWF0aW9uLgorCitMaW51eCBrZXJuZWxzIHZlcnNpb24gMi42LjIwIGFuZCBlYXJsaWVyIGRvIG5vdCB1bmRlcnN0YW5kIHRoZSBVVUlECitzZXR0aW5nIHNvIGEgc21hbGwgaW50ZWdlciBtdXN0IGJlIHVzZWQgaWYgYW4gZnNpZCBvcHRpb24gbmVlZHMgdG8gYmUKK3NldCBmb3Igc3VjaCBrZXJuZWxzLiAgU2V0dGluZyBib3RoIGEgc21hbGwgbnVtYmVyIGFuZCBhIFVVSUQgaXMKK3N1cHBvcnRlZCBzbyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGNhbiBiZSBtYWRlIHRvIHdvcmsgb24gb2xkIGFuZCBuZXcKK2tlcm5lbHMgYWxpa2UuCisKKy5UUAorLklSIHJlZmVyPSBwYXRoQGhvc3RbK2hvc3RdWzpwYXRoQGhvc3RbK2hvc3RdXQorQSBjbGllbnQgcmVmZXJlbmNpbmcgdGhlIGV4cG9ydCBwb2ludCB3aWxsIGJlIGRpcmVjdGVkIHRvIGNob29zZSBmcm9tCit0aGUgZ2l2ZW4gbGlzdCBhbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbiBmb3IgdGhlIGZpbGVzeXN0ZW0uCisoTm90ZSB0aGF0IHRoZSBzZXJ2ZXIgbXVzdCBoYXZlIGEgbW91bnRwb2ludCBoZXJlLCB0aG91Z2ggYSBkaWZmZXJlbnQKK2ZpbGVzeXN0ZW0gaXMgbm90IHJlcXVpcmVkOyBzbywgZm9yIGV4YW1wbGUsCisuSVIgIm1vdW50IC0tYmluZCIgIiAvcGF0aCAvcGF0aCIKK2lzIHN1ZmZpY2llbnQuKQorLlRQCisuSVIgcmVwbGljYXM9IHBhdGhAaG9zdFsraG9zdF1bOnBhdGhAaG9zdFsraG9zdF1dCitJZiB0aGUgY2xpZW50IGFza3MgZm9yIGFsdGVybmF0aXZlIGxvY2F0aW9ucyBmb3IgdGhlIGV4cG9ydCBwb2ludCwgaXQKK3dpbGwgYmUgZ2l2ZW4gdGhpcyBsaXN0IG9mIGFsdGVybmF0aXZlcy4gKE5vdGUgdGhhdCBhY3R1YWwgcmVwbGljYXRpb24KK29mIHRoZSBmaWxlc3lzdGVtIG11c3QgYmUgaGFuZGxlZCBlbHNld2hlcmUuKQorCisuVFAKKy5JUiByZWZlcj0gcGF0aEBob3N0Wytob3N0XVs6cGF0aEBob3N0Wytob3N0XV0KK0EgY2xpZW50IHJlZmVyZW5jaW5nIHRoZSBleHBvcnQgcG9pbnQgd2lsbCBiZSBkaXJlY3RlZCB0byBjaG9vc2UgZnJvbQordGhlIGdpdmVuIGxpc3QgYW4gYWx0ZXJuYXRpdmUgbG9jYXRpb24gZm9yIHRoZSBmaWxlc3lzdGVtLgorKE5vdGUgdGhhdCB0aGUgc2VydmVyIG11c3QgaGF2ZSBhIG1vdW50cG9pbnQgaGVyZSwgdGhvdWdoIGEgZGlmZmVyZW50CitmaWxlc3lzdGVtIGlzIG5vdCByZXF1aXJlZDsgc28sIGZvciBleGFtcGxlLAorLklSICJtb3VudCAtLWJpbmQiICIgL3BhdGggL3BhdGgiCitpcyBzdWZmaWNpZW50LikKKy5UUAorLklSIHJlcGxpY2FzPSBwYXRoQGhvc3RbK2hvc3RdWzpwYXRoQGhvc3RbK2hvc3RdXQorSWYgdGhlIGNsaWVudCBhc2tzIGZvciBhbHRlcm5hdGl2ZSBsb2NhdGlvbnMgZm9yIHRoZSBleHBvcnQgcG9pbnQsIGl0Cit3aWxsIGJlIGdpdmVuIHRoaXMgbGlzdCBvZiBhbHRlcm5hdGl2ZXMuIChOb3RlIHRoYXQgYWN0dWFsIHJlcGxpY2F0aW9uCitvZiB0aGUgZmlsZXN5c3RlbSBtdXN0IGJlIGhhbmRsZWQgZWxzZXdoZXJlLikKKworLlNTIFVzZXIgSUQgTWFwcGluZworLlBQCisuSSBuZnNkCitiYXNlcyBpdHMgYWNjZXNzIGNvbnRyb2wgdG8gZmlsZXMgb24gdGhlIHNlcnZlciBtYWNoaW5lIG9uIHRoZSB1aWQgYW5kCitnaWQgcHJvdmlkZWQgaW4gZWFjaCBORlMgUlBDIHJlcXVlc3QuIFRoZSBub3JtYWwgYmVoYXZpb3IgYSB1c2VyIHdvdWxkCitleHBlY3QgaXMgdGhhdCBzaGUgY2FuIGFjY2VzcyBoZXIgZmlsZXMgb24gdGhlIHNlcnZlciBqdXN0IGFzIHNoZSB3b3VsZAorb24gYSBub3JtYWwgZmlsZSBzeXN0ZW0uIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgc2FtZSB1aWRzIGFuZCBnaWRzIGFyZQordXNlZCBvbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIG1hY2hpbmUuIFRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLCBub3IKK2lzIGl0IGFsd2F5cyBkZXNpcmFibGUuCisuUFAKK1Zlcnkgb2Z0ZW4sIGl0IGlzIG5vdCBkZXNpcmFibGUgdGhhdCB0aGUgcm9vdCB1c2VyIG9uIGEgY2xpZW50IG1hY2hpbmUKK2lzIGFsc28gdHJlYXRlZCBhcyByb290IHdoZW4gYWNjZXNzaW5nIGZpbGVzIG9uIHRoZSBORlMgc2VydmVyLiBUbyB0aGlzCitlbmQsIHVpZCAwIGlzIG5vcm1hbGx5IG1hcHBlZCB0byBhIGRpZmZlcmVudCBpZDogdGhlIHNvLWNhbGxlZAorYW5vbnltb3VzIG9yCisuSSBub2JvZHkKK3VpZC4gVGhpcyBtb2RlIG9mIG9wZXJhdGlvbiAoY2FsbGVkIGByb290IHNxdWFzaGluZycpIGlzIHRoZSBkZWZhdWx0LAorYW5kIGNhbiBiZSB0dXJuZWQgb2ZmIHdpdGgKKy5JUiBub19yb290X3NxdWFzaCAuCisuUFAKK0J5IGRlZmF1bHQsCisnJycuSSBuZnNkCisnJyd0cmllcyB0byBvYnRhaW4gdGhlIGFub255bW91cyB1aWQgYW5kIGdpZCBieSBsb29raW5nIHVwIHVzZXIKKycnJy5JIG5vYm9keQorJycnaW4gdGhlIHBhc3N3b3JkIGZpbGUgYXQgc3RhcnR1cCB0aW1lLiBJZiBpdCBpc24ndCBmb3VuZCwgYSB1aWQgYW5kIGdpZAorLkkgZXhwb3J0ZnMKK2Nob29zZXMgYSB1aWQgYW5kIGdpZAorb2YgNjU1MzQgZm9yIHNxdWFzaGVkIGFjY2Vzcy4gVGhlc2UgdmFsdWVzIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkKK3RoZQorLklSIGFub251aWQgIiBhbmQgIiBhbm9uZ2lkCitvcHRpb25zLgorJycnLlBQCisnJydJbiBhZGRpdGlvbiB0byB0aGlzLCAKKycnJy5JIG5mc2QKKycnJ2xldHMgeW91IHNwZWNpZnkgYXJiaXRyYXJ5IHVpZHMgYW5kIGdpZHMgdGhhdCBzaG91bGQgYmUgbWFwcGVkIHRvIHVzZXIKKycnJ25vYm9keSBhcyB3ZWxsLgorRmluYWxseSwgeW91IGNhbiBtYXAgYWxsIHVzZXIgcmVxdWVzdHMgdG8gdGhlCithbm9ueW1vdXMgdWlkIGJ5IHNwZWNpZnlpbmcgdGhlCisuSVIgYWxsX3NxdWFzaCAiIG9wdGlvbi4KKy5QUAorSGVyZSdzIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1hcHBpbmcgb3B0aW9uczoKKy5UUAorLklSIHJvb3Rfc3F1YXNoCitNYXAgcmVxdWVzdHMgZnJvbSB1aWQvZ2lkIDAgdG8gdGhlIGFub255bW91cyB1aWQvZ2lkLiBOb3RlIHRoYXQgdGhpcyBkb2VzCitub3QgYXBwbHkgdG8gYW55IG90aGVyIHVpZHMgb3IgZ2lkcyB0aGF0IG1pZ2h0IGJlIGVxdWFsbHkgc2Vuc2l0aXZlLCBzdWNoIGFzCit1c2VyCisuSVIgYmluIAorb3IgZ3JvdXAKKy5JUiBzdGFmZiAuCisuVFAKKy5JUiBub19yb290X3NxdWFzaAorVHVybiBvZmYgcm9vdCBzcXVhc2hpbmcuIFRoaXMgb3B0aW9uIGlzIG1haW5seSB1c2VmdWwgZm9yIGRpc2tsZXNzIGNsaWVudHMuCisuVFAKKy5JUiBhbGxfc3F1YXNoCitNYXAgYWxsIHVpZHMgYW5kIGdpZHMgdG8gdGhlIGFub255bW91cyB1c2VyLiBVc2VmdWwgZm9yIE5GUy1leHBvcnRlZAorcHVibGljIEZUUCBkaXJlY3RvcmllcywgbmV3cyBzcG9vbCBkaXJlY3RvcmllcywgZXRjLiBUaGUgb3Bwb3NpdGUgb3B0aW9uCitpcyAKKy5JUiBub19hbGxfc3F1YXNoICwKK3doaWNoIGlzIHRoZSBkZWZhdWx0IHNldHRpbmcuCisuVFAKKy5JUiBhbm9udWlkICIgYW5kICIgYW5vbmdpZAorVGhlc2Ugb3B0aW9ucyBleHBsaWNpdGx5IHNldCB0aGUgdWlkIGFuZCBnaWQgb2YgdGhlIGFub255bW91cyBhY2NvdW50LgorVGhpcyBvcHRpb24gaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgUEMvTkZTIGNsaWVudHMsIHdoZXJlIHlvdSBtaWdodCB3YW50CithbGwgcmVxdWVzdHMgYXBwZWFyIHRvIGJlIGZyb20gb25lIHVzZXIuIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZQorZXhwb3J0IGVudHJ5IGZvcgorLkIgL2hvbWUvam9lCitpbiB0aGUgZXhhbXBsZSBzZWN0aW9uIGJlbG93LCB3aGljaCBtYXBzIGFsbCByZXF1ZXN0cyB0byB1aWQgMTUwICh3aGljaAoraXMgc3VwcG9zZWRseSB0aGF0IG9mIHVzZXIgam9lKS4KKy5JUAorLlNIIEVYQU1QTEUKKy5QUAorLm5mCisudGEgKzNpCisjIHNhbXBsZSAvZXRjL2V4cG9ydHMgZmlsZQorLyAgICAgICAgICAgICAgIG1hc3RlcihydykgdHJ1c3R5KHJ3LG5vX3Jvb3Rfc3F1YXNoKQorL3Byb2plY3RzICAgICAgIHByb2oqLmxvY2FsLmRvbWFpbihydykKKy91c3IgICAgICAgICAgICAqLmxvY2FsLmRvbWFpbihybykgQHRydXN0ZWQocncpCisvaG9tZS9qb2UgICAgICAgcGMwMDEocncsYWxsX3NxdWFzaCxhbm9udWlkPTE1MCxhbm9uZ2lkPTEwMCkKKy9wdWIgICAgICAgICAgICAqKHJvLGluc2VjdXJlLGFsbF9zcXVhc2gpCisvc3J2L3d3dyAgICAgICAgXC1zeW5jLHJ3IHNlcnZlciBAdHJ1c3RlZCBAZXh0ZXJuYWwocm8pCisnJycvcHViL3ByaXZhdGUgICAgKG5vYWNjZXNzKQorLmZpCisuUFAKK1RoZSBmaXJzdCBsaW5lIGV4cG9ydHMgdGhlIGVudGlyZSBmaWxlc3lzdGVtIHRvIG1hY2hpbmVzIG1hc3RlciBhbmQgdHJ1c3R5LgorSW4gYWRkaXRpb24gdG8gd3JpdGUgYWNjZXNzLCBhbGwgdWlkIHNxdWFzaGluZyBpcyB0dXJuZWQgb2ZmIGZvciBob3N0Cit0cnVzdHkuIFRoZSBzZWNvbmQgYW5kIHRoaXJkIGVudHJ5IHNob3cgZXhhbXBsZXMgZm9yIHdpbGRjYXJkIGhvc3RuYW1lcworYW5kIG5ldGdyb3VwcyAodGhpcyBpcyB0aGUgZW50cnkgYEB0cnVzdGVkJykuIFRoZSBmb3VydGggbGluZSBzaG93cyB0aGUKK2VudHJ5IGZvciB0aGUgUEMvTkZTIGNsaWVudCBkaXNjdXNzZWQgYWJvdmUuIExpbmUgNSBleHBvcnRzIHRoZQorcHVibGljIEZUUCBkaXJlY3RvcnkgdG8gZXZlcnkgaG9zdCBpbiB0aGUgd29ybGQsIGV4ZWN1dGluZyBhbGwgcmVxdWVzdHMKK3VuZGVyIHRoZSBub2JvZHkgYWNjb3VudC4gVGhlCisuSSBpbnNlY3VyZSAKK29wdGlvbiBpbiB0aGlzIGVudHJ5IGFsc28gYWxsb3dzIGNsaWVudHMgd2l0aCBORlMgaW1wbGVtZW50YXRpb25zIHRoYXQKK2Rvbid0IHVzZSBhIHJlc2VydmVkIHBvcnQgZm9yIE5GUy4KK1RoZSBzaXh0aCBsaW5lIGV4cG9ydHMgYSBkaXJlY3RvcnkgcmVhZC13cml0ZSB0byB0aGUgbWFjaGluZSAnc2VydmVyJworYXMgd2VsbCBhcyB0aGUgYEB0cnVzdGVkJyBuZXRncm91cCwgYW5kIHJlYWQtb25seSB0byBuZXRncm91cCBgQGV4dGVybmFsJywKK2FsbCB0aHJlZSBtb3VudHMgd2l0aCB0aGUgYHN5bmMnIG9wdGlvbiBlbmFibGVkLgorJycnIFRoZSBsYXN0IGxpbmUgZGVuaWVzIGFsbCBORlMgY2xpZW50cworJycnYWNjZXNzIHRvIHRoZSBwcml2YXRlIGRpcmVjdG9yeS4KKycnJy5TSCBDQVZFQVRTCisnJydVbmxpa2Ugb3RoZXIgTkZTIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMsIHRoaXMKKycnJy5JIG5mc2QKKycnJ2FsbG93cyB5b3UgdG8gZXhwb3J0IGJvdGggYSBkaXJlY3RvcnkgYW5kIGEgc3ViZGlyZWN0b3J5IHRoZXJlb2YgdG8KKycnJ3RoZSBzYW1lIGhvc3QsIGZvciBpbnN0YW5jZSAKKycnJy5JUiAvdXNyICIgYW5kICIgL3Vzci9YMTFSNiAuCisnJydJbiB0aGlzIGNhc2UsIHRoZSBtb3VudCBvcHRpb25zIG9mIHRoZSBtb3N0IHNwZWNpZmljIGVudHJ5IGFwcGx5LiBGb3IKKycnJ2luc3RhbmNlLCB3aGVuIGEgdXNlciBvbiB0aGUgY2xpZW50IGhvc3QgYWNjZXNzZXMgYSBmaWxlIGluIAorJycnLklSIC91c3IvWDExUjYgLAorJycndGhlIG1vdW50IG9wdGlvbnMgZ2l2ZW4gaW4gdGhlIAorJycnLkkgL3Vzci9YMTFSNiAKKycnJ2VudHJ5IGFwcGx5LiBUaGlzIGlzIGFsc28gdHJ1ZSB3aGVuIHRoZSBsYXR0ZXIgaXMgYSB3aWxkY2FyZCBvciBuZXRncm91cAorJycnZW50cnkuCisuU0ggRklMRVMKKy9ldGMvZXhwb3J0cworLlNIIFNFRSBBTFNPCisuQlIgZXhwb3J0ZnMgKDgpLAorLkJSIG5ldGdyb3VwICg1KSwKKy5CUiBtb3VudGQgKDgpLAorLkJSIG5mc2QgKDgpLAorLkJSIHNob3dtb3VudCAoOCkuCisnJycuU0ggRElBR05PU1RJQ1MKKycnJ0FuIGVycm9yIHBhcnNpbmcgdGhlIGZpbGUgaXMgcmVwb3J0ZWQgdXNpbmcgc3lzbG9nZCg4KSBhcyBsZXZlbCBOT1RJQ0UgZnJvbQorJycnYSBEQUVNT04gd2hlbmV2ZXIgbmZzZCg4KSBvciBtb3VudGQoOCkgaXMgc3RhcnRlZCB1cC4gIEFueSB1bmtub3duCisnJydob3N0IGlzIHJlcG9ydGVkIGF0IHRoYXQgdGltZSwgYnV0IG9mdGVuIG5vdCBhbGwgaG9zdHMgYXJlIG5vdCB5ZXQga25vd24KKycnJ3RvIG5hbWVkKDgpIGF0IGJvb3QgdGltZSwgdGh1cyBhcyBob3N0cyBhcmUgZm91bmQgdGhleSBhcmUgcmVwb3J0ZWQKKycnJ3dpdGggdGhlIHNhbWUgc3lzbG9nZCg4KSBwYXJhbWV0ZXJzLgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2V4cG9ydGZzL25mc2QubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2V4cG9ydGZzL25mc2QubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNjVhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZXhwb3J0ZnMvbmZzZC5tYW4KQEAgLTAsMCArMSwyMDYgQEAKKy5cIgorLlwiIG5mc2QoNykgLSBUaGUgbmZzZCBmaWxlc3lzdGVtCisuXCIKKy5cIiBDb3B5cmlnaHQgKEMpIDIwMDMgTmVpbCBCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorLlwiIExpY2Vuc2VkIGZvciBwdWJsaWMgdXNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRlNGCisuXCIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIuCisuVEggbmZzZCA3ICIzIEp1bHkgMjAwMyIKKy5TSCBOQU1FCituZnNkIFwtIHNwZWNpYWwgZmlsZXN5c3RlbSBmb3IgY29udHJvbGxpbmcgTGludXggTkZTIHNlcnZlcgorLlNIIFNZTlBPU0lTCisuQiAibW91bnQgLXQgbmZzZCBuZnNkIC9wcm9jL2ZzL25mc2QiCisuU0ggREVTQ1JJUFRJT04KK1RoZQorLkIgbmZzZAorZmlsZXN5dGVtIGlzIGEgc3BlY2lhbCBmaWxlc3lzdGVtIHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgTGludXgKK05GUyBzZXJ2ZXIuICBUaGUgZmlsZXN5c3RlbSBjb25zaXN0cyBvZiBhIHNpbmdsZSBkaXJlY3Rvcnkgd2hpY2gKK2NvbnRhaW5zIGEgbnVtYmVyIG9mIGZpbGVzLiAgVGhlc2UgZmlsZXMgYXJlIGFjdHVhbGx5IGdhdGV3YXlzIGludG8KK3RoZSBORlMgc2VydmVyLiAgV3JpdGluZyB0byB0aGVtIGNhbiBhZmZlY3QgdGhlIHNlcnZlci4gIFJlYWRpbmcgZnJvbQordGhlbSBjYW4gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VydmVyLgorLlAKK1RoaXMgZmlsZSBzeXN0ZW0gaXMgb25seSBhdmFpbGFibGUgaW4gTGludXggMi42IGFuZCBsYXRlciBzZXJpZXMKK2tlcm5lbHMgKGFuZCBpbiB0aGUgbGF0ZXIgcGFydHMgb2YgdGhlIDIuNSBkZXZlbG9wbWVudCBzZXJpZXMgbGVhZGluZwordXAgdG8gMi42KS4gIFRoaXMgbWFuIHBhZ2UgZG9lcyBub3QgYXBwbHkgdG8gMi40IGFuZCBlYXJsaWVyLgorLlAKK0FzIHdlbGwgYXMgdGhpcyBmaWxlc3lzdGVtLCB0aGVyZSBhcmUgYSBjb2xsZWN0aW9uIG9mIGZpbGVzIGluIHRoZQorLkIgcHJvY2ZzCitmaWxlc3lzdGVtIChub3JtYWxseSBtb3VudGVkIGF0CisuQlIgL3Byb2MgKQord2hpY2ggYXJlIHVzZWQgdG8gY29udHJvbCB0aGUgTkZTIHNlcnZlci4KK1RoaXMgbWFudWFsIHBhZ2UgZGVzY3JpYmVzIGFsbCBvZiB0aGVzZSBmaWxlcy4KKy5QCitUaGUKKy5JIGV4cG9ydGZzCithbmQKKy5JIG1vdW50ZAorcHJvZ3JhbXMgKHBhcnQgb2YgdGhlIG5mcy11dGlscyBwYWNrYWdlKSBleHBlY3QgdG8gZmluZCB0aGlzCitmaWxlc3lzdGVtIG1vdW50ZWQgYXQKKy5CIC9wcm9jL2ZzL25mc2QKK29yCisuQlIgL3Byb2MvZnMvbmZzIC4KK0lmIGl0IGlzIG5vdCBtb3VudGVkLCB0aGV5IHdpbGwgZmFsbC1iYWNrIG9uIDIuNCBzdHlsZSBmdW5jdGlvbmFsaXR5LgorVGhpcyBpbnZvbHZlcyBhY2Nlc3NpbmcgdGhlIE5GUyBzZXJ2ZXIgdmlhIGEgc3lzdGVtY2FsbC4gIFRoaXMKK3N5c3RlbWNhbGwgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlIDIuNiBrZXJuZWwgc2VyaWVzLgorLlNIIERFVEFJTFMKK1RoZSB0aHJlZSBmaWxlcyBpbiB0aGUKKy5CIG5mc2QKK2ZpbGVzeXN0ZW0gYXJlOgorLlRQCisuQiBleHBvcnRzCitUaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIGZpbGVzeXN0ZW1zIHRoYXQgYXJlIGN1cnJlbnRseSBleHBvcnRlZAorYW5kIGNsaWVudHMgdGhhdCBlYWNoIGZpbGVzeXN0ZW0gaXMgZXhwb3J0ZWQgdG8sIHRvZ2V0aGVyIHdpdGggYSBsaXN0CitvZiBleHBvcnQgb3B0aW9ucyBmb3IgdGhhdCBjbGllbnQvZmlsZXN5c3RlbSBwYWlyLiAgVGhpcyBpcyBzaW1pbGFyCit0byB0aGUKKy5CIC9wcm9jL2ZzL25mcy9leHBvcnRzCitmaWxlIGluIDIuNC4KK09uZSBkaWZmZXJlbmNlIGlzIHRoYXQgYSBjbGllbnQgZG9lc24ndCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGp1c3QKK29uZSBob3N0LiAgSXQgY2FuIHJlc3BvbmQgdG8gYSBsYXJnZSBjb2xsZWN0aW9uIG9mIGhvc3RzIHRoYXQgYXJlCitiZWluZyB0cmVhdGVkIGlkZW50aWNhbGx5LgorCitFYWNoIGxpbmUgb2YgdGhlIGZpbGUgY29udGFpbnMgYSBwYXRoIG5hbWUsIGEgY2xpZW50IG5hbWUsIGFuZCBhCitudW1iZXIgb2Ygb3B0aW9ucyBpbiBwYXJlbnRoZXNlcy4gIEFueSBzcGFjZSwgdGFiLCBuZXdsaW5lIG9yCitiYWNrLXNsYXNoIGNoYXJhY3RlciBpbiB0aGUgcGF0aCBuYW1lIG9yIGNsaWVudCBuYW1lIHdpbGwgYmUgcmVwbGFjZWQKK2J5IGEgYmFja3NsYXNoIGZvbGxvd2VkIGJ5IHRoZSBvY3RhbCBBU0NJSSBjb2RlIGZvciB0aGF0IGNoYXJhY3Rlci4KKworLlRQCisuQiB0aHJlYWRzCitUaGlzIGZpbGUgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mCisuQiBuZnNkCit0aHJlYWQgY3VycmVudGx5IHJ1bm5pbmcuICBSZWFkaW5nIGl0IHdpbGwgc2hvdyB0aGUgbnVtYmVyIG9mCit0aHJlYWRzLiAgV3JpdGluZyBhbiBBU0NJSSBkZWNpbWFsIG51bWJlciB3aWxsIGNhdXNlIHRoZSBudW1iZXIgb2YKK3RocmVhZHMgdG8gYmUgY2hhbmdlZCAoaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBhcyBuZWNlc3NhcnkpIHRvIGFjaGlldmUKK3RoYXQgbnVtYmVyLgorCisuVFAKKy5CIGZpbGVoYW5kbGUKK1RoaXMgaXMgYSBzb21ld2hhdCB1bnVzdWFsIGZpbGUgIGluIHRoYXQgd2hhdCBpcyByZWFkIGZyb20gaXQgZGVwZW5kcworb24gd2hhdCB3YXMganVzdCB3cml0dGVuIHRvIGl0LiAgSXQgcHJvdmlkZXMgYSB0cmFuc2FjdGlvbmFsIGludGVyZmFjZQord2hlcmUgYSBwcm9ncmFtIGNhbiBvcGVuIHRoZSBmaWxlLCB3cml0ZSBhIHJlcXVlc3QsIGFuZCByZWFkIGEKK3Jlc3BvbnNlLiAgSWYgdHdvIHNlcGFyYXRlIHByb2dyYW1zIG9wZW4sIHdyaXRlLCBhbmQgcmVhZCBhdCB0aGUgc2FtZQordGltZSwgdGhlaXIgcmVxdWVzdHMgd2lsbCBub3QgYmUgbWl4ZWQgdXAuCisKK1RoZSByZXF1ZXN0IHdyaXR0ZW4gdG8KKy5CIGZpbGVoYW5kbGUKK3Nob3VsZCBiZSBhIGNsaWVudCBuYW1lLCBhIHBhdGggbmFtZSwgYW5kIGEgbnVtYmVyIG9mIGJ5dGVzLiAgVGhpcworc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSwgd2l0aCB3aGl0ZS1zcGFjZSBzZXBhcmF0aW5nIHRoZQorZmllbGRzLCBhbmQgb2N0YWwgcXVvdGluZyBvZiBzcGVjaWFsIGNoYXJhY3RlcnMuCisKK09uIHdyaXRpbmcgdGhpcywgdGhlIHByb2dyYW0gd2lsbCBiZSBhYmxlIHRvIHJlYWQgYmFjayBhIGZpbGVoYW5kbGUKK2ZvciB0aGF0IHBhdGggYXMgZXhwb3J0ZWQgdG8gdGhlIGdpdmVuIGNsaWVudC4gIFRoZSBmaWxlaGFuZGxlcyBsZW5ndGgKK3dpbGwgYmUgYXQgbW9zdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGdpdmVuLgorCitUaGUgZmlsZWhhbmRsZSB3aWxsIGJlIHJlcHJlc2VudGVkIGluIGhleCB3aXRoIGEgbGVhZGluZyAnXGV4Jy4KKy5QUAorVGhlIGRpcmVjdG9yeQorLkIgL3Byb2MvbmV0L3JwYworaW4gdGhlCisuQiBwcm9jZnMKK2ZpbGVzeXN0ZW0gY29udGFpbnMgYSBudW1iZXIgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorVGhlIGZpbGVzIGNvbnRhaW4gc3RhdGlzdGljcyB0aGF0IGNhbiBiZSBkaXNwbGF5IHVzaW5nIHRoZQorLkkgbmZzc3RhdAorcHJvZ3JhbS4KK1RoZSBkaXJlY3RvcmllcyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHZhcmlvdXMgY2FjaGVzIHRoYXQgdGhlIE5GUworc2VydmVyIG1haW50YWlucyB0byBrZWVwIHRyYWNrIG9mIGFjY2VzcyBwZXJtaXNzaW9ucyB0aGF0IGRpZmZlcmVudAorY2xpZW50cyBoYXZlIGZvciBkaWZmZXJlbnQgZmlsZXN5c3RlbXMuCitUaGUgY2FjaGVzIGFyZToKKworLlRQCisuQiBhdXRoLmRvbWFpbgorVGhpcyBjYWNoZSBtYXBzIHRoZSBuYW1lIG9mIGEgY2xpZW50IChvciBkb21haW4pIHRvIGFuIGludGVybmFsIGRhdGEKK3N0cnVjdHVyZS4gIFRoZSBvbmx5IGFjY2VzcyB0aGF0IGlzIHBvc3NpYmxlIGlzIHRvIGZsdXNoIHRoZSBjYWNoZS4KKworLlRQCisuQiBhdXRoLnVuaXguaXAKK1RoaXMgY2FjaGUgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gSVAgYWRkcmVzcyB0byB0aGUgbmFtZSBvZiB0aGUKK2F1dGhlbnRpY2F0aW9uIGRvbWFpbiB0aGF0IHRoZSBpcGFkZHJlc3Mgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcGFydCBvZi4KKworLlRQCisuQiBuZnNkLmV4cG9ydAorVGhpcyBjYWNoZSBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBkaXJlY3RvcnkgYW5kIGRvbWFpbiB0byBleHBvcnQKK29wdGlvbnMuCisKKy5UUAorLkIgbmZzZC5maAorVGhpcyBjYWNoZSBjb250YWlucyBhIG1hcHBpbmcgZnJvbSBkb21haW4gYW5kIGEgZmlsZXN5c3RlbSBpZGVudGlmaWVyCit0byBhIGRpcmVjdG9yeS4gICBUaGUgZmlsZXN5c3RlbSBpZGVudGlmaWVyIGlzIHN0b3JlZCBpbiB0aGUKK2ZpbGVoYW5kbGVzIGFuZCBjb25zaXN0cyBvZiBhIG51bWJlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGlkZW50aWZpZXIKK2FuZCBhIG51bWJlciBvZiBoZXggYnl0ZXMgaW5kaWNhdGluZyB0aGUgY29udGVudCBvZiB0aGUgaWRlbnRpZmllci4KKworLlBQCitFYWNoIGRpcmVjdG9yeSByZXByZXNlbnRpbmcgYSBjYWNoZSBjYW4gaG9sZCBmcm9tIDEgdG8gMyBmaWxlcy4gIFRoZXkKK2FyZToKKy5UUAorLkIgZmx1c2gKK1doZW4gYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBlcG9jaCAoMSBKYW4gMTk3MCkgaXMgd3JpdHRlbiB0byB0aGlzCitmaWxlLCBhbGwgZW50cmllcyBpbiB0aGUgY2FjaGUgdGhhdCB3ZXJlIGxhc3QgdXBkYXRlZCBiZWZvcmUgdGhhdCBmaWxlCitiZWNvbWUgaW52YWxpZGF0ZWQgYW5kIHdpbGwgYmUgZmx1c2hlZCBvdXQuICBXcml0aW5nIDEgd2lsbCBmbHVzaAorZXZlcnl0aGluZy4gIFRoaXMgaXMgdGhlIG9ubHkgZmlsZSB0aGF0IHdpbGwgYWx3YXlzIGJlIHByZXNlbnQuCisKKy5UUAorLkIgY29udGVudAorVGhpcyBmaWxlLCBpZiBwcmVzZW50LCBjb250YWlucyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgZXZlciBlbnRyeQoraW4gdGhlIGNhY2hlLCBvbmUgcGVyIGxpbmUuICBJZiBhbiBlbnRyeSBpcyBzdGlsbCBpbiB0aGUgY2FjaGUKKyhiZWNhdXNlIGl0IGlzIGFjdGl2ZWx5IGJlaW5nIHVzZWQpIGJ1dCBoYXMgZXhwaXJlZCBvciBpcyBvdGhlcndpc2UKK2ludmFsaWQsIGl0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgY29tbWVudCAod2l0aCBhIGxlYWRpbmcgaGFzaAorY2hhcmFjdGVyKS4KKworLlRQCisuQiBjaGFubmVsCitUaGlzIGZpbGUsIGlmIHByZXNlbnQsIGFjdHMgYSBjaGFubmVsIGZvciByZXF1ZXN0IGZyb20gdGhlIGtlcm5lbC1iYXNlZAorbmZzIHNlcnZlciB0byBiZSBwYXNzZWQgdG8gYSB1c2VyLXNwYWNlIHByb2dyYW0gZm9yIGhhbmRsaW5nLgorCitXaGVuIHRoZSBrZXJuZWwgbmVlZHMgc29tZSBpbmZvcm1hdGlvbiB3aGljaCBpc24ndCBpbiB0aGUgY2FjaGUsIGl0CittYWtlcyBhIGxpbmUgYXBwZWFyIGluIHRoZQorLkIgY2hhbm5lbAorZmlsZSBnaXZpbmcgdGhlIGtleSBmb3IgdGhlIGluZm9ybWF0aW9uLiAgQSB1c2VyLXNwYWNlIHByb2dyYW0gc2hvdWxkCityZWFkIHRoaXMsIGZpbmQgdGhlIGFuc3dlciwgYW5kIHdyaXRlIGEgbGluZSBjb250YWluaW5nIHRoZSBrZXksIGFuCitleHBpcnkgdGltZSwgYW5kIHRoZSBjb250ZW50LgorRm9yIGV4YW1wbGUgdGhlIGtlcm5lbCBtaWdodCBtYWtlCisudGkgKzUKK25mc2QgMTI3LjAuMC4xCisuYnIKK2FwcGVhciBpbiB0aGUKKy5CIGF1dGgudW5peC5pcC9jb250ZW50CitmaWxlLiAgVGhlIHVzZXItc3BhY2UgcHJvZ3JhbSBtaWdodCB0aGVuIHdyaXRlCisudGkgKzUKK25mc2QgMTI3LjAuMC4xIDEwNTcyMDY5NTMgbG9jYWxob3N0CisuYnIKK3RvIGluZGljYXRlIHRoYXQgMTI3LjAuMC4xIHNob3VsZCBtYXAgdG8gbG9jYWxob3N0LCBhdGxlYXN0IGZvciBub3cuCisKK0lmIHRoZSBwcm9ncmFtIHVzZXMgc2VsZWN0KDIpIG9yIHBvbGwoMikgdG8gZGlzY292ZXIgaWYgaXQgY2FuIHJlYWQKK2Zyb20gdGhlCisuQiBjaGFubmVsCit0aGVuIGl0IHdpbGwgbmV2ZXIgc2VlIGFuZCBlbmQtb2YtZmlsZSBidXQgd2hlbiBhbGwgcmVxdWVzdHMgaGF2ZSBiZWVuCithbnN3ZXJlZCwgaXQgd2lsbCBibG9jayB1bnRpbCBhbm90aGVyIHJlcXVlc3QgYXBwZWFycy4KKworLlBQCitJbiB0aGUKKy5CIC9wcm9jCitmaWxlc3lzdGVtIHRoZXJlIGFyZSA0IGZpbGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlZCBleHRyYSB0cmFjaW5nCitvZiBuZnNkIGFuZCByZWxhdGVkIGNvZGUuICBUaGV5IGFyZToKKy5pbiArNQorLkIgL3Byb2Mvc3lzL3N1bnJwYy9uZnNfZGVidWcKKy5icgorLkIgL3Byb2Mvc3lzL3N1bnJwYy9uZnNkX2RlYnVnCisuYnIKKy5CIC9wcm9jL3N5cy9zdW5ycGMvbmxtX2RlYnVnCisuYnIKKy5CIC9wcm9jL3N5cy9zdW5ycGMvcnBjX2RlYnVnCisuYnIKKy5pbiAtNQorVGhleSBjb250cm9sIHRyYWNpbmcgZm9yIHRoZSBORlMgY2xpZW50LCB0aGUgTkZTIHNlcnZlciwgdGhlIE5ldHdvcmsKK0xvY2sgTWFuYWdlciAobG9ja2QpIGFuZCB0aGUgdW5kZXJseWluZyBSUEMgbGF5ZXIgcmVzcGVjdGl2ZWx5LgorRGVjaW1hbCBudW1iZXJzIGNhbiBiZSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byB0aGVzZSBmaWxlcy4gIEVhY2gKK251bWJlciByZXByZXNlbnRzIGEgYml0LXBhdHRlcm4gd2hlcmUgYml0cyB0aGF0IGFyZSBzZXQgY2F1c2UgY2VydGFpbgorY2xhc3NlcyBvZiB0cmFjaW5nIHRvIGJlIGVuYWJsZWQuICBDb25zdWx0IHRoZSBrZXJuZWwgaGVhZGVyIGZpbGVzIHRvCitmaW5kIG91dCB3aGF0IG51bWJlciBjb3JyZXNwb25kIHRvIHdoYXQgdHJhY2luZy4KKworLlNIIFNFRSBBTFNPCisuQlIgcnBjLm5mc2QgKDgpLAorLkJSIGV4cG9ydHMgKDUpLAorLkJSIG5mc3N0YXQgKDgpLAorLkJSIG1vdW50ZCAoOCkKKy5CUiBleHBvcnRmcyAoOCkuCisKKy5TSCBBVVRIT1IKK05laWxCcm93bgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWEyYmQwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTMgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCittYW44X01BTlMJPSBnc3NkLm1hbiBzdmNnc3NkLm1hbgorCitSUENQUkVGSVgJPSBycGMuCitLUFJFRklYCQk9IEBrcHJlZml4QAorc2Jpbl9QUkVGSVhFRAk9IGdzc2Qgc3ZjZ3NzZAorc2Jpbl9QUk9HUkFNUwk9ICQoc2Jpbl9QUkVGSVhFRCkgZ3NzX2NsbnRfc2VuZF9lcnIKK3NiaW5fU0NSSVBUUwk9IGdzc19kZXN0cm95X2NyZWRzCisKK0VYVFJBX0RJU1QgPSBcCisJZ3NzX2Rlc3Ryb3lfY3JlZHMgXAorCSQobWFuOF9NQU5TKQorCitDT01NT05fU1JDUyA9IFwKKwljb250ZXh0LmMgXAorCWNvbnRleHRfbWl0LmMgXAorCWNvbnRleHRfaGVpbWRhbC5jIFwKKwljb250ZXh0X2x1Y2lkLmMgXAorCWNvbnRleHRfc3BrbTMuYyBcCisJZ3NzX3V0aWwuYyBcCisJZ3NzX29pZHMuYyBcCisJZXJyX3V0aWwuYyBcCisJXAorCWNvbnRleHQuaCBcCisJZXJyX3V0aWwuaCBcCisJZ3NzX29pZHMuaCBcCisJZ3NzX3V0aWwuaAorCitnc3NkX1NPVVJDRVMgPSBcCisJJChDT01NT05fU1JDUykgXAorCWdzc2QuYyBcCisJZ3NzZF9tYWluX2xvb3AuYyBcCisJZ3NzZF9wcm9jLmMgXAorCWtyYjVfdXRpbC5jIFwKKwlcCisJZ3NzZC5oIFwKKwlrcmI1X3V0aWwuaCBcCisJd3JpdGVfYnl0ZXMuaAorCitnc3NkX0xEQUREID0JLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCQkkKFJQQ1NFQ0dTU19MSUJTKSAkKEdTU0dMVUVfTElCUykgJChLUkJMSUJTKQorZ3NzZF9MREZMQUdTID0gJChLUkJMREZMQUdTKQorCitnc3NkX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgXAorCSAgICAgICQoUlBDU0VDR1NTX0NGTEFHUykgJChHU1NHTFVFX0NGTEFHUykgJChLUkJDRkxBR1MpCisKK3N2Y2dzc2RfU09VUkNFUyA9IFwKKwkkKENPTU1PTl9TUkNTKSBcCisJc3ZjZ3NzZC5jIFwKKwlzdmNnc3NkX21haW5fbG9vcC5jIFwKKwlzdmNnc3NkX21lY2gyZmlsZS5jIFwKKwlzdmNnc3NkX3Byb2MuYyBcCisJXAorCXN2Y2dzc2QuaAorCitzdmNnc3NkX0xEQUREID0gXAorCS4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKwkkKFJQQ1NFQ0dTU19MSUJTKSAkKEdTU0dMVUVfTElCUykgLWxuZnNpZG1hcCBcCisJJChLUkJMSUJTKQorCitzdmNnc3NkX0xERkxBR1MgPSAkKEtSQkxERkxBR1MpCisKK3N2Y2dzc2RfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSBcCisJCSAkKFJQQ1NFQ0dTU19DRkxBR1MpICQoR1NTR0xVRV9DRkxBR1MpICQoS1JCQ0ZMQUdTKQorCitnc3NfY2xudF9zZW5kX2Vycl9TT1VSQ0VTID0gZ3NzX2NsbnRfc2VuZF9lcnIuYworCitnc3NfY2xudF9zZW5kX2Vycl9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkJICQoUlBDU0VDR1NTX0NGTEFHUykgJChHU1NHTFVFX0NGTEFHUykgJChLUkJDRkxBR1MpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2YgaGF2aW5nCisjIGRhZW1vbnMgcmVuYW1lZCBkdXJpbmcgdGhlIGluc3RhbGwgdG8gaW5jbHVkZSBSUENQUkVGSVgKKyMgYW5kIHRoZSBLUFJFRklYCisjIFRoaXMgY291bGQgYWxsIGJlIGRvbmUgbXVjaCBlYXNpZXIgd2l0aCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCisjICggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMvXi8kKFJQQ1BSRUZJWCkkKEtQUkVGSVgpLyApCisjIGJ1dCB0aGF0IGFsc28gcmVuYW1lcyB0aGUgbWFuIHBhZ2VzLCB3aGljaCB0aGUgY3VycmVudAorIyBwcmFjdGljZSBkb2VzIG5vdCBkby4KK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJFRklYRUQpOyBkbyBcCisJICAgIG12IC1mICQkcCQoRVhFRVhUKSAkKFJQQ1BSRUZJWCkkKEtQUkVGSVgpJCRwJChFWEVFWFQpIDtcCisJICBkb25lKQordW5pbnN0YWxsLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgIGZvciBwIGluICQoc2Jpbl9QUkVGSVhFRCk7IGRvIFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJChLUFJFRklYKSQkcCQoRVhFRVhUKSA7XAorCSAgZG9uZSkKKworCisjIFhYWCBUaGlzIG1ha2VzIHNvbWUgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCBhdXRvbWFrZSBkb2VzLgorIyBYWFggQnV0IHRoZXJlIGlzIG5vIGluc3RhbGwtbWFuLWhvb2sgb3IgaW5zdGFsbC1tYW4tbG9jYWwuCitpbnN0YWxsLW1hbjogaW5zdGFsbC1tYW44IGluc3RhbGwtbWFuLWxpbmtzCit1bmluc3RhbGwtbWFuOiB1bmluc3RhbGwtbWFuOCB1bmluc3RhbGwtbWFuLWxpbmtzCisKK2luc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgICAgJChMTl9TKSAkJGluc3QgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgZG9uZSkKKwordW5pbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9NYWtlZmlsZS5pbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTlkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDExOTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc2Jpbl9QUk9HUkFNUyA9ICQoYW1fX0VYRUVYVF8xKSBnc3NfY2xudF9zZW5kX2VyciQoRVhFRVhUKQorc3ViZGlyID0gdXRpbHMvZ3NzZAorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX19FWEVFWFRfMSA9IGdzc2QkKEVYRUVYVCkgc3ZjZ3NzZCQoRVhFRVhUKQorYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQoc2JpbmRpcikiIFwKKwkiJChERVNURElSKSQobWFuOGRpcikiCitQUk9HUkFNUyA9ICQoc2Jpbl9QUk9HUkFNUykKK2FtX2dzc19jbG50X3NlbmRfZXJyX09CSkVDVFMgPSAgXAorCWdzc19jbG50X3NlbmRfZXJyLWdzc19jbG50X3NlbmRfZXJyLiQoT0JKRVhUKQorZ3NzX2NsbnRfc2VuZF9lcnJfT0JKRUNUUyA9ICQoYW1fZ3NzX2NsbnRfc2VuZF9lcnJfT0JKRUNUUykKK2dzc19jbG50X3NlbmRfZXJyX0xEQUREID0gJChMREFERCkKK2dzc19jbG50X3NlbmRfZXJyX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSBcCisJJChMSUJUT09MRkxBR1MpIC0tbW9kZT1saW5rICQoQ0NMRCkgXAorCSQoZ3NzX2NsbnRfc2VuZF9lcnJfQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSAkKExERkxBR1MpIFwKKwktbyAkQAorYW1fX29iamVjdHNfMSA9IGdzc2QtY29udGV4dC4kKE9CSkVYVCkgZ3NzZC1jb250ZXh0X21pdC4kKE9CSkVYVCkgXAorCWdzc2QtY29udGV4dF9oZWltZGFsLiQoT0JKRVhUKSBnc3NkLWNvbnRleHRfbHVjaWQuJChPQkpFWFQpIFwKKwlnc3NkLWNvbnRleHRfc3BrbTMuJChPQkpFWFQpIGdzc2QtZ3NzX3V0aWwuJChPQkpFWFQpIFwKKwlnc3NkLWdzc19vaWRzLiQoT0JKRVhUKSBnc3NkLWVycl91dGlsLiQoT0JKRVhUKQorYW1fZ3NzZF9PQkpFQ1RTID0gJChhbV9fb2JqZWN0c18xKSBnc3NkLWdzc2QuJChPQkpFWFQpIFwKKwlnc3NkLWdzc2RfbWFpbl9sb29wLiQoT0JKRVhUKSBnc3NkLWdzc2RfcHJvYy4kKE9CSkVYVCkgXAorCWdzc2Qta3JiNV91dGlsLiQoT0JKRVhUKQorZ3NzZF9PQkpFQ1RTID0gJChhbV9nc3NkX09CSkVDVFMpCithbV9fREVQRU5ERU5DSUVTXzEgPQorZ3NzZF9ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkKK2dzc2RfTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgJChnc3NkX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACithbV9fb2JqZWN0c18yID0gc3ZjZ3NzZC1jb250ZXh0LiQoT0JKRVhUKSBcCisJc3ZjZ3NzZC1jb250ZXh0X21pdC4kKE9CSkVYVCkgXAorCXN2Y2dzc2QtY29udGV4dF9oZWltZGFsLiQoT0JKRVhUKSBcCisJc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLiQoT0JKRVhUKSBcCisJc3ZjZ3NzZC1jb250ZXh0X3Nwa20zLiQoT0JKRVhUKSBzdmNnc3NkLWdzc191dGlsLiQoT0JKRVhUKSBcCisJc3ZjZ3NzZC1nc3Nfb2lkcy4kKE9CSkVYVCkgc3ZjZ3NzZC1lcnJfdXRpbC4kKE9CSkVYVCkKK2FtX3N2Y2dzc2RfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfMikgc3ZjZ3NzZC1zdmNnc3NkLiQoT0JKRVhUKSBcCisJc3ZjZ3NzZC1zdmNnc3NkX21haW5fbG9vcC4kKE9CSkVYVCkgXAorCXN2Y2dzc2Qtc3ZjZ3NzZF9tZWNoMmZpbGUuJChPQkpFWFQpIFwKKwlzdmNnc3NkLXN2Y2dzc2RfcHJvYy4kKE9CSkVYVCkKK3N2Y2dzc2RfT0JKRUNUUyA9ICQoYW1fc3ZjZ3NzZF9PQkpFQ1RTKQorc3ZjZ3NzZF9ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpCitzdmNnc3NkX0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIFwKKwkkKHN2Y2dzc2RfTERGTEFHUykgJChMREZMQUdTKSAtbyAkQAorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworU0NSSVBUUyA9ICQoc2Jpbl9TQ1JJUFRTKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChnc3NfY2xudF9zZW5kX2Vycl9TT1VSQ0VTKSAkKGdzc2RfU09VUkNFUykgXAorCSQoc3ZjZ3NzZF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChnc3NfY2xudF9zZW5kX2Vycl9TT1VSQ0VTKSAkKGdzc2RfU09VUkNFUykgXAorCSQoc3ZjZ3NzZF9TT1VSQ0VTKQorbWFuOGRpciA9ICQobWFuZGlyKS9tYW44CitOUk9GRiA9IG5yb2ZmCitNQU5TID0gJChtYW44X01BTlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbWFuOF9NQU5TID0gZ3NzZC5tYW4gc3ZjZ3NzZC5tYW4KK1JQQ1BSRUZJWCA9IHJwYy4KK0tQUkVGSVggPSBAa3ByZWZpeEAKK3NiaW5fUFJFRklYRUQgPSBnc3NkIHN2Y2dzc2QKK3NiaW5fU0NSSVBUUyA9IGdzc19kZXN0cm95X2NyZWRzCitFWFRSQV9ESVNUID0gXAorCWdzc19kZXN0cm95X2NyZWRzIFwKKwkkKG1hbjhfTUFOUykKKworQ09NTU9OX1NSQ1MgPSBcCisJY29udGV4dC5jIFwKKwljb250ZXh0X21pdC5jIFwKKwljb250ZXh0X2hlaW1kYWwuYyBcCisJY29udGV4dF9sdWNpZC5jIFwKKwljb250ZXh0X3Nwa20zLmMgXAorCWdzc191dGlsLmMgXAorCWdzc19vaWRzLmMgXAorCWVycl91dGlsLmMgXAorCVwKKwljb250ZXh0LmggXAorCWVycl91dGlsLmggXAorCWdzc19vaWRzLmggXAorCWdzc191dGlsLmgKKworZ3NzZF9TT1VSQ0VTID0gXAorCSQoQ09NTU9OX1NSQ1MpIFwKKwlnc3NkLmMgXAorCWdzc2RfbWFpbl9sb29wLmMgXAorCWdzc2RfcHJvYy5jIFwKKwlrcmI1X3V0aWwuYyBcCisJXAorCWdzc2QuaCBcCisJa3JiNV91dGlsLmggXAorCXdyaXRlX2J5dGVzLmgKKworZ3NzZF9MREFERCA9IC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKwkJJChSUENTRUNHU1NfTElCUykgJChHU1NHTFVFX0xJQlMpICQoS1JCTElCUykKKworZ3NzZF9MREZMQUdTID0gJChLUkJMREZMQUdTKQorZ3NzZF9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkgICAgICAkKFJQQ1NFQ0dTU19DRkxBR1MpICQoR1NTR0xVRV9DRkxBR1MpICQoS1JCQ0ZMQUdTKQorCitzdmNnc3NkX1NPVVJDRVMgPSBcCisJJChDT01NT05fU1JDUykgXAorCXN2Y2dzc2QuYyBcCisJc3ZjZ3NzZF9tYWluX2xvb3AuYyBcCisJc3ZjZ3NzZF9tZWNoMmZpbGUuYyBcCisJc3ZjZ3NzZF9wcm9jLmMgXAorCVwKKwlzdmNnc3NkLmgKKworc3ZjZ3NzZF9MREFERCA9IFwKKwkuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJJChSUENTRUNHU1NfTElCUykgJChHU1NHTFVFX0xJQlMpIC1sbmZzaWRtYXAgXAorCSQoS1JCTElCUykKKworc3ZjZ3NzZF9MREZMQUdTID0gJChLUkJMREZMQUdTKQorc3ZjZ3NzZF9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkJICQoUlBDU0VDR1NTX0NGTEFHUykgJChHU1NHTFVFX0NGTEFHUykgJChLUkJDRkxBR1MpCisKK2dzc19jbG50X3NlbmRfZXJyX1NPVVJDRVMgPSBnc3NfY2xudF9zZW5kX2Vyci5jCitnc3NfY2xudF9zZW5kX2Vycl9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIFwKKwkJICQoUlBDU0VDR1NTX0NGTEFHUykgJChHU1NHTFVFX0NGTEFHUykgJChLUkJDRkxBR1MpCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHV0aWxzL2dzc2QvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvZ3NzZC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKK2luc3RhbGwtc2JpblBST0dSQU1TOiAkKHNiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChzYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoc2JpbmRpcikiCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisJc2VkICdzLyQoRVhFRVhUKSQkLy8nIHwgXAorCXdoaWxlIHJlYWQgcCBwMTsgZG8gaWYgdGVzdCAtZiAkJHAgfHwgdGVzdCAtZiAkJHAxOyBcCisJICB0aGVuIGVjaG8gIiQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO247aCcgLWUgJ3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJyB8IFwKKwlzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxIH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsICQkMyAiLyIgJCQ0LCAkJDE7IH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKKwkgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAnJChERVNURElSKSQoc2JpbmRpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChzYmluZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAorCSAgICB9IFwKKwk7IGRvbmUKKwordW5pbnN0YWxsLXNiaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChzYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAorCSAgc2VkIC1lICdoO3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSknIFwKKwkgICAgICAtZSAncy8kJC8kKEVYRUVYVCkvJyBgOyBcCisJdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoc2JpbmRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChzYmluZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1zYmluUFJPR1JBTVM6CisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKK2dzc19jbG50X3NlbmRfZXJyJChFWEVFWFQpOiAkKGdzc19jbG50X3NlbmRfZXJyX09CSkVDVFMpICQoZ3NzX2NsbnRfc2VuZF9lcnJfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgZ3NzX2NsbnRfc2VuZF9lcnIkKEVYRUVYVCkKKwkkKGdzc19jbG50X3NlbmRfZXJyX0xJTkspICQoZ3NzX2NsbnRfc2VuZF9lcnJfT0JKRUNUUykgJChnc3NfY2xudF9zZW5kX2Vycl9MREFERCkgJChMSUJTKQorZ3NzZCQoRVhFRVhUKTogJChnc3NkX09CSkVDVFMpICQoZ3NzZF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBnc3NkJChFWEVFWFQpCisJJChnc3NkX0xJTkspICQoZ3NzZF9PQkpFQ1RTKSAkKGdzc2RfTERBREQpICQoTElCUykKK3N2Y2dzc2QkKEVYRUVYVCk6ICQoc3ZjZ3NzZF9PQkpFQ1RTKSAkKHN2Y2dzc2RfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgc3ZjZ3NzZCQoRVhFRVhUKQorCSQoc3ZjZ3NzZF9MSU5LKSAkKHN2Y2dzc2RfT0JKRUNUUykgJChzdmNnc3NkX0xEQUREKSAkKExJQlMpCitpbnN0YWxsLXNiaW5TQ1JJUFRTOiAkKHNiaW5fU0NSSVBUUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHNiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChzYmluZGlyKSIKKwlAbGlzdD0nJChzYmluX1NDUklQVFMpJzsgdGVzdCAtbiAiJChzYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgIGlmIHRlc3QgLWYgIiQkcCI7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO24nIFwKKwkgICAgLWUgJ2g7c3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7JCh0cmFuc2Zvcm0pJyB8IHNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDE7IH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgeyBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgICBpZiAoKytuW2RdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgeyBcCisJCXByaW50ICJmIiwgZCwgZmlsZXNbZF07IG5bZF0gPSAwOyBmaWxlc1tkXSA9ICIiIH0gfSBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsIGQgIi8iICQkNCwgJCQxIH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgICAgZWNobyAiICQoSU5TVEFMTF9TQ1JJUFQpICQkZmlsZXMgJyQoREVTVERJUikkKHNiaW5kaXIpJCRkaXInIjsgXAorCSAgICAgICAkKElOU1RBTExfU0NSSVBUKSAkJGZpbGVzICIkKERFU1RESVIpJChzYmluZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAorCSAgICAgfSBcCisJOyBkb25lCisKK3VuaW5zdGFsbC1zYmluU0NSSVBUUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHNiaW5fU0NSSVBUUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAorCSAgICAgICBzZWQgLWUgJ3MsLiovLCw7JCh0cmFuc2Zvcm0pJ2A7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChzYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHNiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nc3NfY2xudF9zZW5kX2Vyci1nc3NfY2xudF9zZW5kX2Vyci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ3NzZC1jb250ZXh0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nc3NkLWNvbnRleHRfaGVpbWRhbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nc3NkLWNvbnRleHRfbWl0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9nc3NkLWNvbnRleHRfc3BrbTMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dzc2QtZXJyX3V0aWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dzc2QtZ3NzX29pZHMuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dzc2QtZ3NzX3V0aWwuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dzc2QtZ3NzZC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ3NzZC1nc3NkX21haW5fbG9vcC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZ3NzZC1nc3NkX3Byb2MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2dzc2Qta3JiNV91dGlsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNnc3NkLWNvbnRleHQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNnc3NkLWNvbnRleHRfbHVjaWQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9taXQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3ZjZ3NzZC1lcnJfdXRpbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3ZjZ3NzZC1nc3Nfb2lkcy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3ZjZ3NzZC1nc3NfdXRpbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfcHJvYy5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCitnc3NfY2xudF9zZW5kX2Vyci1nc3NfY2xudF9zZW5kX2Vyci5vOiBnc3NfY2xudF9zZW5kX2Vyci5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NfY2xudF9zZW5kX2Vycl9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzX2NsbnRfc2VuZF9lcnItZ3NzX2NsbnRfc2VuZF9lcnIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzX2NsbnRfc2VuZF9lcnItZ3NzX2NsbnRfc2VuZF9lcnIuVHBvIC1jIC1vIGdzc19jbG50X3NlbmRfZXJyLWdzc19jbG50X3NlbmRfZXJyLm8gYHRlc3QgLWYgJ2dzc19jbG50X3NlbmRfZXJyLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc19jbG50X3NlbmRfZXJyLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzX2NsbnRfc2VuZF9lcnItZ3NzX2NsbnRfc2VuZF9lcnIuVHBvICQoREVQRElSKS9nc3NfY2xudF9zZW5kX2Vyci1nc3NfY2xudF9zZW5kX2Vyci5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ3NzX2NsbnRfc2VuZF9lcnIuYycgb2JqZWN0PSdnc3NfY2xudF9zZW5kX2Vyci1nc3NfY2xudF9zZW5kX2Vyci5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NfY2xudF9zZW5kX2Vycl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NfY2xudF9zZW5kX2Vyci1nc3NfY2xudF9zZW5kX2Vyci5vIGB0ZXN0IC1mICdnc3NfY2xudF9zZW5kX2Vyci5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnc3NfY2xudF9zZW5kX2Vyci5jCisKK2dzc19jbG50X3NlbmRfZXJyLWdzc19jbG50X3NlbmRfZXJyLm9iajogZ3NzX2NsbnRfc2VuZF9lcnIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzX2NsbnRfc2VuZF9lcnJfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc19jbG50X3NlbmRfZXJyLWdzc19jbG50X3NlbmRfZXJyLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzX2NsbnRfc2VuZF9lcnItZ3NzX2NsbnRfc2VuZF9lcnIuVHBvIC1jIC1vIGdzc19jbG50X3NlbmRfZXJyLWdzc19jbG50X3NlbmRfZXJyLm9iaiBgaWYgdGVzdCAtZiAnZ3NzX2NsbnRfc2VuZF9lcnIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3NfY2xudF9zZW5kX2Vyci5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nc3NfY2xudF9zZW5kX2Vyci5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc19jbG50X3NlbmRfZXJyLWdzc19jbG50X3NlbmRfZXJyLlRwbyAkKERFUERJUikvZ3NzX2NsbnRfc2VuZF9lcnItZ3NzX2NsbnRfc2VuZF9lcnIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc19jbG50X3NlbmRfZXJyLmMnIG9iamVjdD0nZ3NzX2NsbnRfc2VuZF9lcnItZ3NzX2NsbnRfc2VuZF9lcnIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NfY2xudF9zZW5kX2Vycl9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NfY2xudF9zZW5kX2Vyci1nc3NfY2xudF9zZW5kX2Vyci5vYmogYGlmIHRlc3QgLWYgJ2dzc19jbG50X3NlbmRfZXJyLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3NzX2NsbnRfc2VuZF9lcnIuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3NzX2NsbnRfc2VuZF9lcnIuYyc7IGZpYAorCitnc3NkLWNvbnRleHQubzogY29udGV4dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWNvbnRleHQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1jb250ZXh0LlRwbyAtYyAtbyBnc3NkLWNvbnRleHQubyBgdGVzdCAtZiAnY29udGV4dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb250ZXh0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1jb250ZXh0LlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0LmMnIG9iamVjdD0nZ3NzZC1jb250ZXh0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1jb250ZXh0Lm8gYHRlc3QgLWYgJ2NvbnRleHQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dC5jCisKK2dzc2QtY29udGV4dC5vYmo6IGNvbnRleHQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzZC1jb250ZXh0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1jb250ZXh0LlRwbyAtYyAtbyBnc3NkLWNvbnRleHQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1jb250ZXh0LlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0LmMnIG9iamVjdD0nZ3NzZC1jb250ZXh0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWNvbnRleHQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0LmMnOyBmaWAKKworZ3NzZC1jb250ZXh0X21pdC5vOiBjb250ZXh0X21pdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWNvbnRleHRfbWl0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2dzc2QtY29udGV4dF9taXQuVHBvIC1jIC1vIGdzc2QtY29udGV4dF9taXQubyBgdGVzdCAtZiAnY29udGV4dF9taXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dF9taXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nc3NkLWNvbnRleHRfbWl0LlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0X21pdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9taXQuYycgb2JqZWN0PSdnc3NkLWNvbnRleHRfbWl0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1jb250ZXh0X21pdC5vIGB0ZXN0IC1mICdjb250ZXh0X21pdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb250ZXh0X21pdC5jCisKK2dzc2QtY29udGV4dF9taXQub2JqOiBjb250ZXh0X21pdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWNvbnRleHRfbWl0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1jb250ZXh0X21pdC5UcG8gLWMgLW8gZ3NzZC1jb250ZXh0X21pdC5vYmogYGlmIHRlc3QgLWYgJ2NvbnRleHRfbWl0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9taXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udGV4dF9taXQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nc3NkLWNvbnRleHRfbWl0LlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0X21pdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9taXQuYycgb2JqZWN0PSdnc3NkLWNvbnRleHRfbWl0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWNvbnRleHRfbWl0Lm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9taXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb250ZXh0X21pdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X21pdC5jJzsgZmlgCisKK2dzc2QtY29udGV4dF9oZWltZGFsLm86IGNvbnRleHRfaGVpbWRhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWNvbnRleHRfaGVpbWRhbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWNvbnRleHRfaGVpbWRhbC5UcG8gLWMgLW8gZ3NzZC1jb250ZXh0X2hlaW1kYWwubyBgdGVzdCAtZiAnY29udGV4dF9oZWltZGFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnRleHRfaGVpbWRhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtY29udGV4dF9oZWltZGFsLlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0X2hlaW1kYWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbnRleHRfaGVpbWRhbC5jJyBvYmplY3Q9J2dzc2QtY29udGV4dF9oZWltZGFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1jb250ZXh0X2hlaW1kYWwubyBgdGVzdCAtZiAnY29udGV4dF9oZWltZGFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnRleHRfaGVpbWRhbC5jCisKK2dzc2QtY29udGV4dF9oZWltZGFsLm9iajogY29udGV4dF9oZWltZGFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtY29udGV4dF9oZWltZGFsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1jb250ZXh0X2hlaW1kYWwuVHBvIC1jIC1vIGdzc2QtY29udGV4dF9oZWltZGFsLm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9oZWltZGFsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9oZWltZGFsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbnRleHRfaGVpbWRhbC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtY29udGV4dF9oZWltZGFsLlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0X2hlaW1kYWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbnRleHRfaGVpbWRhbC5jJyBvYmplY3Q9J2dzc2QtY29udGV4dF9oZWltZGFsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWNvbnRleHRfaGVpbWRhbC5vYmogYGlmIHRlc3QgLWYgJ2NvbnRleHRfaGVpbWRhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnRleHRfaGVpbWRhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X2hlaW1kYWwuYyc7IGZpYAorCitnc3NkLWNvbnRleHRfbHVjaWQubzogY29udGV4dF9sdWNpZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWNvbnRleHRfbHVjaWQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAtYyAtbyBnc3NkLWNvbnRleHRfbHVjaWQubyBgdGVzdCAtZiAnY29udGV4dF9sdWNpZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb250ZXh0X2x1Y2lkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0X2x1Y2lkLmMnIG9iamVjdD0nZ3NzZC1jb250ZXh0X2x1Y2lkLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1jb250ZXh0X2x1Y2lkLm8gYHRlc3QgLWYgJ2NvbnRleHRfbHVjaWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dF9sdWNpZC5jCisKK2dzc2QtY29udGV4dF9sdWNpZC5vYmo6IGNvbnRleHRfbHVjaWQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzZC1jb250ZXh0X2x1Y2lkLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAtYyAtbyBnc3NkLWNvbnRleHRfbHVjaWQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0X2x1Y2lkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9sdWNpZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X2x1Y2lkLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAkKERFUERJUikvZ3NzZC1jb250ZXh0X2x1Y2lkLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0X2x1Y2lkLmMnIG9iamVjdD0nZ3NzZC1jb250ZXh0X2x1Y2lkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWNvbnRleHRfbHVjaWQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0X2x1Y2lkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9sdWNpZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X2x1Y2lkLmMnOyBmaWAKKworZ3NzZC1jb250ZXh0X3Nwa20zLm86IGNvbnRleHRfc3BrbTMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzZC1jb250ZXh0X3Nwa20zLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2dzc2QtY29udGV4dF9zcGttMy5UcG8gLWMgLW8gZ3NzZC1jb250ZXh0X3Nwa20zLm8gYHRlc3QgLWYgJ2NvbnRleHRfc3BrbTMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dF9zcGttMy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtY29udGV4dF9zcGttMy5UcG8gJChERVBESVIpL2dzc2QtY29udGV4dF9zcGttMy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9zcGttMy5jJyBvYmplY3Q9J2dzc2QtY29udGV4dF9zcGttMy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGdzc2QtY29udGV4dF9zcGttMy5vIGB0ZXN0IC1mICdjb250ZXh0X3Nwa20zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnRleHRfc3BrbTMuYworCitnc3NkLWNvbnRleHRfc3BrbTMub2JqOiBjb250ZXh0X3Nwa20zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtY29udGV4dF9zcGttMy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2dzc2QtY29udGV4dF9zcGttMy5UcG8gLWMgLW8gZ3NzZC1jb250ZXh0X3Nwa20zLm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9zcGttMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnRleHRfc3BrbTMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udGV4dF9zcGttMy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtY29udGV4dF9zcGttMy5UcG8gJChERVBESVIpL2dzc2QtY29udGV4dF9zcGttMy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9zcGttMy5jJyBvYmplY3Q9J2dzc2QtY29udGV4dF9zcGttMy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1jb250ZXh0X3Nwa20zLm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9zcGttMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnRleHRfc3BrbTMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udGV4dF9zcGttMy5jJzsgZmlgCisKK2dzc2QtZ3NzX3V0aWwubzogZ3NzX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzZC1nc3NfdXRpbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWdzc191dGlsLlRwbyAtYyAtbyBnc3NkLWdzc191dGlsLm8gYHRlc3QgLWYgJ2dzc191dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc191dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1nc3NfdXRpbC5UcG8gJChERVBESVIpL2dzc2QtZ3NzX3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc191dGlsLmMnIG9iamVjdD0nZ3NzZC1nc3NfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGdzc2QtZ3NzX3V0aWwubyBgdGVzdCAtZiAnZ3NzX3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3NzX3V0aWwuYworCitnc3NkLWdzc191dGlsLm9iajogZ3NzX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzZC1nc3NfdXRpbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL2dzc2QtZ3NzX3V0aWwuVHBvIC1jIC1vIGdzc2QtZ3NzX3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnc3NfdXRpbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dzc191dGlsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc191dGlsLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1nc3NfdXRpbC5UcG8gJChERVBESVIpL2dzc2QtZ3NzX3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc191dGlsLmMnIG9iamVjdD0nZ3NzZC1nc3NfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1nc3NfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dzc191dGlsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3NzX3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3NzX3V0aWwuYyc7IGZpYAorCitnc3NkLWdzc19vaWRzLm86IGdzc19vaWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtZ3NzX29pZHMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1nc3Nfb2lkcy5UcG8gLWMgLW8gZ3NzZC1nc3Nfb2lkcy5vIGB0ZXN0IC1mICdnc3Nfb2lkcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnc3Nfb2lkcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtZ3NzX29pZHMuVHBvICQoREVQRElSKS9nc3NkLWdzc19vaWRzLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdnc3Nfb2lkcy5jJyBvYmplY3Q9J2dzc2QtZ3NzX29pZHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWdzc19vaWRzLm8gYHRlc3QgLWYgJ2dzc19vaWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc19vaWRzLmMKKworZ3NzZC1nc3Nfb2lkcy5vYmo6IGdzc19vaWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtZ3NzX29pZHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWdzc19vaWRzLlRwbyAtYyAtbyBnc3NkLWdzc19vaWRzLm9iaiBgaWYgdGVzdCAtZiAnZ3NzX29pZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3Nfb2lkcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nc3Nfb2lkcy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtZ3NzX29pZHMuVHBvICQoREVQRElSKS9nc3NkLWdzc19vaWRzLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdnc3Nfb2lkcy5jJyBvYmplY3Q9J2dzc2QtZ3NzX29pZHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGdzc2QtZ3NzX29pZHMub2JqIGBpZiB0ZXN0IC1mICdnc3Nfb2lkcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dzc19vaWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc19vaWRzLmMnOyBmaWAKKworZ3NzZC1lcnJfdXRpbC5vOiBlcnJfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWVycl91dGlsLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2dzc2QtZXJyX3V0aWwuVHBvIC1jIC1vIGdzc2QtZXJyX3V0aWwubyBgdGVzdCAtZiAnZXJyX3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXJyX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nc3NkLWVycl91dGlsLlRwbyAkKERFUERJUikvZ3NzZC1lcnJfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXJyX3V0aWwuYycgb2JqZWN0PSdnc3NkLWVycl91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1lcnJfdXRpbC5vIGB0ZXN0IC1mICdlcnJfdXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlcnJfdXRpbC5jCisKK2dzc2QtZXJyX3V0aWwub2JqOiBlcnJfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWVycl91dGlsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1lcnJfdXRpbC5UcG8gLWMgLW8gZ3NzZC1lcnJfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2Vycl91dGlsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXJyX3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZXJyX3V0aWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nc3NkLWVycl91dGlsLlRwbyAkKERFUERJUikvZ3NzZC1lcnJfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXJyX3V0aWwuYycgb2JqZWN0PSdnc3NkLWVycl91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWVycl91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZXJyX3V0aWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcnJfdXRpbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcnJfdXRpbC5jJzsgZmlgCisKK2dzc2QtZ3NzZC5vOiBnc3NkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtZ3NzZC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWdzc2QuVHBvIC1jIC1vIGdzc2QtZ3NzZC5vIGB0ZXN0IC1mICdnc3NkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc2QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nc3NkLWdzc2QuVHBvICQoREVQRElSKS9nc3NkLWdzc2QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc2QuYycgb2JqZWN0PSdnc3NkLWdzc2QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWdzc2QubyBgdGVzdCAtZiAnZ3NzZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnc3NkLmMKKworZ3NzZC1nc3NkLm9iajogZ3NzZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWdzc2Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWdzc2QuVHBvIC1jIC1vIGdzc2QtZ3NzZC5vYmogYGlmIHRlc3QgLWYgJ2dzc2QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3NkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc2QuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9nc3NkLWdzc2QuVHBvICQoREVQRElSKS9nc3NkLWdzc2QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc2QuYycgb2JqZWN0PSdnc3NkLWdzc2Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGdzc2QtZ3NzZC5vYmogYGlmIHRlc3QgLWYgJ2dzc2QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3NkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc2QuYyc7IGZpYAorCitnc3NkLWdzc2RfbWFpbl9sb29wLm86IGdzc2RfbWFpbl9sb29wLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtZ3NzZF9tYWluX2xvb3AubyAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1nc3NkX21haW5fbG9vcC5UcG8gLWMgLW8gZ3NzZC1nc3NkX21haW5fbG9vcC5vIGB0ZXN0IC1mICdnc3NkX21haW5fbG9vcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnc3NkX21haW5fbG9vcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtZ3NzZF9tYWluX2xvb3AuVHBvICQoREVQRElSKS9nc3NkLWdzc2RfbWFpbl9sb29wLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdnc3NkX21haW5fbG9vcC5jJyBvYmplY3Q9J2dzc2QtZ3NzZF9tYWluX2xvb3AubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWdzc2RfbWFpbl9sb29wLm8gYHRlc3QgLWYgJ2dzc2RfbWFpbl9sb29wLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc2RfbWFpbl9sb29wLmMKKworZ3NzZC1nc3NkX21haW5fbG9vcC5vYmo6IGdzc2RfbWFpbl9sb29wLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtZ3NzZF9tYWluX2xvb3Aub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWdzc2RfbWFpbl9sb29wLlRwbyAtYyAtbyBnc3NkLWdzc2RfbWFpbl9sb29wLm9iaiBgaWYgdGVzdCAtZiAnZ3NzZF9tYWluX2xvb3AuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3NkX21haW5fbG9vcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nc3NkX21haW5fbG9vcC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2QtZ3NzZF9tYWluX2xvb3AuVHBvICQoREVQRElSKS9nc3NkLWdzc2RfbWFpbl9sb29wLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdnc3NkX21haW5fbG9vcC5jJyBvYmplY3Q9J2dzc2QtZ3NzZF9tYWluX2xvb3Aub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGdzc2QtZ3NzZF9tYWluX2xvb3Aub2JqIGBpZiB0ZXN0IC1mICdnc3NkX21haW5fbG9vcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dzc2RfbWFpbl9sb29wLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc2RfbWFpbl9sb29wLmMnOyBmaWAKKworZ3NzZC1nc3NkX3Byb2MubzogZ3NzZF9wcm9jLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2QtZ3NzZF9wcm9jLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL2dzc2QtZ3NzZF9wcm9jLlRwbyAtYyAtbyBnc3NkLWdzc2RfcHJvYy5vIGB0ZXN0IC1mICdnc3NkX3Byb2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3NzZF9wcm9jLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1nc3NkX3Byb2MuVHBvICQoREVQRElSKS9nc3NkLWdzc2RfcHJvYy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ3NzZF9wcm9jLmMnIG9iamVjdD0nZ3NzZC1nc3NkX3Byb2MubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWdzc2RfcHJvYy5vIGB0ZXN0IC1mICdnc3NkX3Byb2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3NzZF9wcm9jLmMKKworZ3NzZC1nc3NkX3Byb2Mub2JqOiBnc3NkX3Byb2MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgZ3NzZC1nc3NkX3Byb2Mub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWdzc2RfcHJvYy5UcG8gLWMgLW8gZ3NzZC1nc3NkX3Byb2Mub2JqIGBpZiB0ZXN0IC1mICdnc3NkX3Byb2MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3NkX3Byb2MuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3NzZF9wcm9jLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvZ3NzZC1nc3NkX3Byb2MuVHBvICQoREVQRElSKS9nc3NkLWdzc2RfcHJvYy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZ3NzZF9wcm9jLmMnIG9iamVjdD0nZ3NzZC1nc3NkX3Byb2Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIGdzc2QtZ3NzZF9wcm9jLm9iaiBgaWYgdGVzdCAtZiAnZ3NzZF9wcm9jLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3NzZF9wcm9jLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc2RfcHJvYy5jJzsgZmlgCisKK2dzc2Qta3JiNV91dGlsLm86IGtyYjVfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBnc3NkLWtyYjVfdXRpbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9nc3NkLWtyYjVfdXRpbC5UcG8gLWMgLW8gZ3NzZC1rcmI1X3V0aWwubyBgdGVzdCAtZiAna3JiNV91dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGtyYjVfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2Qta3JiNV91dGlsLlRwbyAkKERFUERJUikvZ3NzZC1rcmI1X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2tyYjVfdXRpbC5jJyBvYmplY3Q9J2dzc2Qta3JiNV91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gZ3NzZC1rcmI1X3V0aWwubyBgdGVzdCAtZiAna3JiNV91dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGtyYjVfdXRpbC5jCisKK2dzc2Qta3JiNV91dGlsLm9iajoga3JiNV91dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKGdzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIGdzc2Qta3JiNV91dGlsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvZ3NzZC1rcmI1X3V0aWwuVHBvIC1jIC1vIGdzc2Qta3JiNV91dGlsLm9iaiBgaWYgdGVzdCAtZiAna3JiNV91dGlsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAna3JiNV91dGlsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2tyYjVfdXRpbC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL2dzc2Qta3JiNV91dGlsLlRwbyAkKERFUERJUikvZ3NzZC1rcmI1X3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2tyYjVfdXRpbC5jJyBvYmplY3Q9J2dzc2Qta3JiNV91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBnc3NkLWtyYjVfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2tyYjVfdXRpbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2tyYjVfdXRpbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9rcmI1X3V0aWwuYyc7IGZpYAorCitzdmNnc3NkLWNvbnRleHQubzogY29udGV4dC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWNvbnRleHQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0LlRwbyAtYyAtbyBzdmNnc3NkLWNvbnRleHQubyBgdGVzdCAtZiAnY29udGV4dC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb250ZXh0LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0LlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0LmMnIG9iamVjdD0nc3ZjZ3NzZC1jb250ZXh0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1jb250ZXh0Lm8gYHRlc3QgLWYgJ2NvbnRleHQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dC5jCisKK3N2Y2dzc2QtY29udGV4dC5vYmo6IGNvbnRleHQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3ZjZ3NzZC1jb250ZXh0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0LlRwbyAtYyAtbyBzdmNnc3NkLWNvbnRleHQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0LmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0LlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0LmMnIG9iamVjdD0nc3ZjZ3NzZC1jb250ZXh0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLWNvbnRleHQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0LmMnOyBmaWAKKworc3ZjZ3NzZC1jb250ZXh0X21pdC5vOiBjb250ZXh0X21pdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWNvbnRleHRfbWl0Lm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9taXQuVHBvIC1jIC1vIHN2Y2dzc2QtY29udGV4dF9taXQubyBgdGVzdCAtZiAnY29udGV4dF9taXQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dF9taXQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLWNvbnRleHRfbWl0LlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X21pdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9taXQuYycgb2JqZWN0PSdzdmNnc3NkLWNvbnRleHRfbWl0Lm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X21pdC5vIGB0ZXN0IC1mICdjb250ZXh0X21pdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb250ZXh0X21pdC5jCisKK3N2Y2dzc2QtY29udGV4dF9taXQub2JqOiBjb250ZXh0X21pdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWNvbnRleHRfbWl0Lm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X21pdC5UcG8gLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X21pdC5vYmogYGlmIHRlc3QgLWYgJ2NvbnRleHRfbWl0LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9taXQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udGV4dF9taXQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLWNvbnRleHRfbWl0LlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X21pdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9taXQuYycgb2JqZWN0PSdzdmNnc3NkLWNvbnRleHRfbWl0Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLWNvbnRleHRfbWl0Lm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9taXQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdjb250ZXh0X21pdC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X21pdC5jJzsgZmlgCisKK3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLm86IGNvbnRleHRfaGVpbWRhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWNvbnRleHRfaGVpbWRhbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLWNvbnRleHRfaGVpbWRhbC5UcG8gLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X2hlaW1kYWwubyBgdGVzdCAtZiAnY29udGV4dF9oZWltZGFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnRleHRfaGVpbWRhbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2hlaW1kYWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbnRleHRfaGVpbWRhbC5jJyBvYmplY3Q9J3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X2hlaW1kYWwubyBgdGVzdCAtZiAnY29udGV4dF9oZWltZGFsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnRleHRfaGVpbWRhbC5jCisKK3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLm9iajogY29udGV4dF9oZWltZGFsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2QtY29udGV4dF9oZWltZGFsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2hlaW1kYWwuVHBvIC1jIC1vIHN2Y2dzc2QtY29udGV4dF9oZWltZGFsLm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9oZWltZGFsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9oZWltZGFsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NvbnRleHRfaGVpbWRhbC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2hlaW1kYWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2NvbnRleHRfaGVpbWRhbC5jJyBvYmplY3Q9J3N2Y2dzc2QtY29udGV4dF9oZWltZGFsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLWNvbnRleHRfaGVpbWRhbC5vYmogYGlmIHRlc3QgLWYgJ2NvbnRleHRfaGVpbWRhbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnRleHRfaGVpbWRhbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X2hlaW1kYWwuYyc7IGZpYAorCitzdmNnc3NkLWNvbnRleHRfbHVjaWQubzogY29udGV4dF9sdWNpZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWNvbnRleHRfbHVjaWQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAtYyAtbyBzdmNnc3NkLWNvbnRleHRfbHVjaWQubyBgdGVzdCAtZiAnY29udGV4dF9sdWNpZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bjb250ZXh0X2x1Y2lkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0X2x1Y2lkLmMnIG9iamVjdD0nc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLm8gYHRlc3QgLWYgJ2NvbnRleHRfbHVjaWQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dF9sdWNpZC5jCisKK3N2Y2dzc2QtY29udGV4dF9sdWNpZC5vYmo6IGNvbnRleHRfbHVjaWQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAtYyAtbyBzdmNnc3NkLWNvbnRleHRfbHVjaWQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0X2x1Y2lkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9sdWNpZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X2x1Y2lkLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjb250ZXh0X2x1Y2lkLmMnIG9iamVjdD0nc3ZjZ3NzZC1jb250ZXh0X2x1Y2lkLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLWNvbnRleHRfbHVjaWQub2JqIGBpZiB0ZXN0IC1mICdjb250ZXh0X2x1Y2lkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnY29udGV4dF9sdWNpZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9jb250ZXh0X2x1Y2lkLmMnOyBmaWAKKworc3ZjZ3NzZC1jb250ZXh0X3Nwa20zLm86IGNvbnRleHRfc3BrbTMuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3ZjZ3NzZC1jb250ZXh0X3Nwa20zLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5UcG8gLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X3Nwa20zLm8gYHRlc3QgLWYgJ2NvbnRleHRfc3BrbTMuYycgfHwgZWNobyAnJChzcmNkaXIpLydgY29udGV4dF9zcGttMy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5UcG8gJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9zcGttMy5jJyBvYmplY3Q9J3N2Y2dzc2QtY29udGV4dF9zcGttMy5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN2Y2dzc2QtY29udGV4dF9zcGttMy5vIGB0ZXN0IC1mICdjb250ZXh0X3Nwa20zLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGNvbnRleHRfc3BrbTMuYworCitzdmNnc3NkLWNvbnRleHRfc3BrbTMub2JqOiBjb250ZXh0X3Nwa20zLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2QtY29udGV4dF9zcGttMy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5UcG8gLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X3Nwa20zLm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9zcGttMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnRleHRfc3BrbTMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udGV4dF9zcGttMy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5UcG8gJChERVBESVIpL3N2Y2dzc2QtY29udGV4dF9zcGttMy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY29udGV4dF9zcGttMy5jJyBvYmplY3Q9J3N2Y2dzc2QtY29udGV4dF9zcGttMy5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1jb250ZXh0X3Nwa20zLm9iaiBgaWYgdGVzdCAtZiAnY29udGV4dF9zcGttMy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NvbnRleHRfc3BrbTMuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvY29udGV4dF9zcGttMy5jJzsgZmlgCisKK3N2Y2dzc2QtZ3NzX3V0aWwubzogZ3NzX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3ZjZ3NzZC1nc3NfdXRpbC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLWdzc191dGlsLlRwbyAtYyAtbyBzdmNnc3NkLWdzc191dGlsLm8gYHRlc3QgLWYgJ2dzc191dGlsLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc191dGlsLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3ZjZ3NzZC1nc3NfdXRpbC5UcG8gJChERVBESVIpL3N2Y2dzc2QtZ3NzX3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc191dGlsLmMnIG9iamVjdD0nc3ZjZ3NzZC1nc3NfdXRpbC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN2Y2dzc2QtZ3NzX3V0aWwubyBgdGVzdCAtZiAnZ3NzX3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZ3NzX3V0aWwuYworCitzdmNnc3NkLWdzc191dGlsLm9iajogZ3NzX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc3ZjZ3NzZC1nc3NfdXRpbC5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL3N2Y2dzc2QtZ3NzX3V0aWwuVHBvIC1jIC1vIHN2Y2dzc2QtZ3NzX3V0aWwub2JqIGBpZiB0ZXN0IC1mICdnc3NfdXRpbC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dzc191dGlsLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc191dGlsLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvc3ZjZ3NzZC1nc3NfdXRpbC5UcG8gJChERVBESVIpL3N2Y2dzc2QtZ3NzX3V0aWwuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2dzc191dGlsLmMnIG9iamVjdD0nc3ZjZ3NzZC1nc3NfdXRpbC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1nc3NfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2dzc191dGlsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZ3NzX3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZ3NzX3V0aWwuYyc7IGZpYAorCitzdmNnc3NkLWdzc19vaWRzLm86IGdzc19vaWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2QtZ3NzX29pZHMubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1nc3Nfb2lkcy5UcG8gLWMgLW8gc3ZjZ3NzZC1nc3Nfb2lkcy5vIGB0ZXN0IC1mICdnc3Nfb2lkcy5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Bnc3Nfb2lkcy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2QtZ3NzX29pZHMuVHBvICQoREVQRElSKS9zdmNnc3NkLWdzc19vaWRzLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdnc3Nfb2lkcy5jJyBvYmplY3Q9J3N2Y2dzc2QtZ3NzX29pZHMubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLWdzc19vaWRzLm8gYHRlc3QgLWYgJ2dzc19vaWRzLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGdzc19vaWRzLmMKKworc3ZjZ3NzZC1nc3Nfb2lkcy5vYmo6IGdzc19vaWRzLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2QtZ3NzX29pZHMub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLWdzc19vaWRzLlRwbyAtYyAtbyBzdmNnc3NkLWdzc19vaWRzLm9iaiBgaWYgdGVzdCAtZiAnZ3NzX29pZHMuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdnc3Nfb2lkcy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9nc3Nfb2lkcy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2QtZ3NzX29pZHMuVHBvICQoREVQRElSKS9zdmNnc3NkLWdzc19vaWRzLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdnc3Nfb2lkcy5jJyBvYmplY3Q9J3N2Y2dzc2QtZ3NzX29pZHMub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN2Y2dzc2QtZ3NzX29pZHMub2JqIGBpZiB0ZXN0IC1mICdnc3Nfb2lkcy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2dzc19vaWRzLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2dzc19vaWRzLmMnOyBmaWAKKworc3ZjZ3NzZC1lcnJfdXRpbC5vOiBlcnJfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWVycl91dGlsLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N2Y2dzc2QtZXJyX3V0aWwuVHBvIC1jIC1vIHN2Y2dzc2QtZXJyX3V0aWwubyBgdGVzdCAtZiAnZXJyX3V0aWwuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZXJyX3V0aWwuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLWVycl91dGlsLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1lcnJfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXJyX3V0aWwuYycgb2JqZWN0PSdzdmNnc3NkLWVycl91dGlsLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1lcnJfdXRpbC5vIGB0ZXN0IC1mICdlcnJfdXRpbC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BlcnJfdXRpbC5jCisKK3N2Y2dzc2QtZXJyX3V0aWwub2JqOiBlcnJfdXRpbC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLWVycl91dGlsLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1lcnJfdXRpbC5UcG8gLWMgLW8gc3ZjZ3NzZC1lcnJfdXRpbC5vYmogYGlmIHRlc3QgLWYgJ2Vycl91dGlsLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnZXJyX3V0aWwuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvZXJyX3V0aWwuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLWVycl91dGlsLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1lcnJfdXRpbC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZXJyX3V0aWwuYycgb2JqZWN0PSdzdmNnc3NkLWVycl91dGlsLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLWVycl91dGlsLm9iaiBgaWYgdGVzdCAtZiAnZXJyX3V0aWwuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdlcnJfdXRpbC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9lcnJfdXRpbC5jJzsgZmlgCisKK3N2Y2dzc2Qtc3ZjZ3NzZC5vOiBzdmNnc3NkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2Qtc3ZjZ3NzZC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2QuVHBvIC1jIC1vIHN2Y2dzc2Qtc3ZjZ3NzZC5vIGB0ZXN0IC1mICdzdmNnc3NkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN2Y2dzc2QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2QuVHBvICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N2Y2dzc2QuYycgb2JqZWN0PSdzdmNnc3NkLXN2Y2dzc2QubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLXN2Y2dzc2QubyBgdGVzdCAtZiAnc3ZjZ3NzZC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdmNnc3NkLmMKKworc3ZjZ3NzZC1zdmNnc3NkLm9iajogc3ZjZ3NzZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLXN2Y2dzc2Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2QuVHBvIC1jIC1vIHN2Y2dzc2Qtc3ZjZ3NzZC5vYmogYGlmIHRlc3QgLWYgJ3N2Y2dzc2QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdmNnc3NkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N2Y2dzc2QuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2QuVHBvICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2QuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N2Y2dzc2QuYycgb2JqZWN0PSdzdmNnc3NkLXN2Y2dzc2Qub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN2Y2dzc2Qtc3ZjZ3NzZC5vYmogYGlmIHRlc3QgLWYgJ3N2Y2dzc2QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdmNnc3NkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N2Y2dzc2QuYyc7IGZpYAorCitzdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLm86IHN2Y2dzc2RfbWFpbl9sb29wLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3AubyAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX21haW5fbG9vcC5UcG8gLWMgLW8gc3ZjZ3NzZC1zdmNnc3NkX21haW5fbG9vcC5vIGB0ZXN0IC1mICdzdmNnc3NkX21haW5fbG9vcC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdmNnc3NkX21haW5fbG9vcC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3AuVHBvICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdmNnc3NkX21haW5fbG9vcC5jJyBvYmplY3Q9J3N2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3AubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLm8gYHRlc3QgLWYgJ3N2Y2dzc2RfbWFpbl9sb29wLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN2Y2dzc2RfbWFpbl9sb29wLmMKKworc3ZjZ3NzZC1zdmNnc3NkX21haW5fbG9vcC5vYmo6IHN2Y2dzc2RfbWFpbl9sb29wLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3Aub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLlRwbyAtYyAtbyBzdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLm9iaiBgaWYgdGVzdCAtZiAnc3ZjZ3NzZF9tYWluX2xvb3AuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdmNnc3NkX21haW5fbG9vcC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdmNnc3NkX21haW5fbG9vcC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3AuVHBvICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWFpbl9sb29wLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdmNnc3NkX21haW5fbG9vcC5jJyBvYmplY3Q9J3N2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3Aub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHN2Y2dzc2Qtc3ZjZ3NzZF9tYWluX2xvb3Aub2JqIGBpZiB0ZXN0IC1mICdzdmNnc3NkX21haW5fbG9vcC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N2Y2dzc2RfbWFpbl9sb29wLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N2Y2dzc2RfbWFpbl9sb29wLmMnOyBmaWAKKworc3ZjZ3NzZC1zdmNnc3NkX21lY2gyZmlsZS5vOiBzdmNnc3NkX21lY2gyZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL3N2Y2dzc2Qtc3ZjZ3NzZF9tZWNoMmZpbGUuVHBvIC1jIC1vIHN2Y2dzc2Qtc3ZjZ3NzZF9tZWNoMmZpbGUubyBgdGVzdCAtZiAnc3ZjZ3NzZF9tZWNoMmZpbGUuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3ZjZ3NzZF9tZWNoMmZpbGUuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX21lY2gyZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3ZjZ3NzZF9tZWNoMmZpbGUuYycgb2JqZWN0PSdzdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1zdmNnc3NkX21lY2gyZmlsZS5vIGB0ZXN0IC1mICdzdmNnc3NkX21lY2gyZmlsZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzdmNnc3NkX21lY2gyZmlsZS5jCisKK3N2Y2dzc2Qtc3ZjZ3NzZF9tZWNoMmZpbGUub2JqOiBzdmNnc3NkX21lY2gyZmlsZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX21lY2gyZmlsZS5UcG8gLWMgLW8gc3ZjZ3NzZC1zdmNnc3NkX21lY2gyZmlsZS5vYmogYGlmIHRlc3QgLWYgJ3N2Y2dzc2RfbWVjaDJmaWxlLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3ZjZ3NzZF9tZWNoMmZpbGUuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3ZjZ3NzZF9tZWNoMmZpbGUuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX21lY2gyZmlsZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc3ZjZ3NzZF9tZWNoMmZpbGUuYycgb2JqZWN0PSdzdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLXN2Y2dzc2RfbWVjaDJmaWxlLm9iaiBgaWYgdGVzdCAtZiAnc3ZjZ3NzZF9tZWNoMmZpbGUuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdmNnc3NkX21lY2gyZmlsZS5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdmNnc3NkX21lY2gyZmlsZS5jJzsgZmlgCisKK3N2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLm86IHN2Y2dzc2RfcHJvYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChzdmNnc3NkX0NGTEFHUykgJChDRkxBR1MpIC1NVCBzdmNnc3NkLXN2Y2dzc2RfcHJvYy5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zdmNnc3NkLXN2Y2dzc2RfcHJvYy5UcG8gLWMgLW8gc3ZjZ3NzZC1zdmNnc3NkX3Byb2MubyBgdGVzdCAtZiAnc3ZjZ3NzZF9wcm9jLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN2Y2dzc2RfcHJvYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX3Byb2MuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N2Y2dzc2RfcHJvYy5jJyBvYmplY3Q9J3N2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc3ZjZ3NzZC1zdmNnc3NkX3Byb2MubyBgdGVzdCAtZiAnc3ZjZ3NzZF9wcm9jLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN2Y2dzc2RfcHJvYy5jCisKK3N2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLm9iajogc3ZjZ3NzZF9wcm9jLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKHN2Y2dzc2RfQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHN2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX3Byb2MuVHBvIC1jIC1vIHN2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLm9iaiBgaWYgdGVzdCAtZiAnc3ZjZ3NzZF9wcm9jLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc3ZjZ3NzZF9wcm9jLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N2Y2dzc2RfcHJvYy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3N2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLlRwbyAkKERFUERJUikvc3ZjZ3NzZC1zdmNnc3NkX3Byb2MuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N2Y2dzc2RfcHJvYy5jJyBvYmplY3Q9J3N2Y2dzc2Qtc3ZjZ3NzZF9wcm9jLm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoc3ZjZ3NzZF9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBzdmNnc3NkLXN2Y2dzc2RfcHJvYy5vYmogYGlmIHRlc3QgLWYgJ3N2Y2dzc2RfcHJvYy5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N2Y2dzc2RfcHJvYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9zdmNnc3NkX3Byb2MuYyc7IGZpYAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworaW5zdGFsbC1tYW44OiAkKG1hbjhfTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjhkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW44ZGlyKSIKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKKwlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKKwlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0JyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjhkaXIpJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjhkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAorCWRvbmU7IH0KKwordW5pbnN0YWxsLW1hbjg6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAorCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjhkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwkgIGNkICIkKERFU1RESVIpJChtYW44ZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVsc2UgOjsgZmk7IGRvbmVgOyBcCisJICBpZiB0ZXN0IC1uICIkJGxpc3QiICYmIFwKKwkgICAgZ3JlcCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgIGVjaG8gImVycm9yOiBmb3VuZCBtYW4gcGFnZXMgY29udGFpbmluZyB0aGUgXGBtaXNzaW5nIGhlbHAybWFuJyByZXBsYWNlbWVudCB0ZXh0OiIgPiYyOyBcCisJICAgIGdyZXAgLWwgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0IHwgc2VkICdzL14vICAgICAgICAgLycgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0byBmaXggdGhlbSwgaW5zdGFsbCBoZWxwMm1hbiwgcmVtb3ZlIGFuZCByZWdlbmVyYXRlIHRoZSBtYW4gcGFnZXM7IiA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHR5cGljYWxseSBcYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCisJICAgIGV4aXQgMTsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWVsc2UgOjsgZmkKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKFNDUklQVFMpICQoTUFOUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXNiaW5QUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLXNiaW5QUk9HUkFNUyBpbnN0YWxsLXNiaW5TQ1JJUFRTCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWhvb2sKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuIHVuaW5zdGFsbC1zYmluUFJPR1JBTVMgXAorCXVuaW5zdGFsbC1zYmluU0NSSVBUUworCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1ob29rCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1zdHJpcCB1bmluc3RhbGwtYW0KKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMtaG9vayBcCisJaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjggaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBcCisJaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXNiaW5QUk9HUkFNUyBpbnN0YWxsLXNiaW5TQ1JJUFRTIFwKKwlpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgXAorCW1haW50YWluZXItY2xlYW4gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIFwKKwltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCisJcGRmIHBkZi1hbSBwcyBwcy1hbSB0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWhvb2sgXAorCXVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbjggdW5pbnN0YWxsLXNiaW5QUk9HUkFNUyBcCisJdW5pbnN0YWxsLXNiaW5TQ1JJUFRTCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2YgaGF2aW5nCisjIGRhZW1vbnMgcmVuYW1lZCBkdXJpbmcgdGhlIGluc3RhbGwgdG8gaW5jbHVkZSBSUENQUkVGSVgKKyMgYW5kIHRoZSBLUFJFRklYCisjIFRoaXMgY291bGQgYWxsIGJlIGRvbmUgbXVjaCBlYXNpZXIgd2l0aCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCisjICggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMvXi8kKFJQQ1BSRUZJWCkkKEtQUkVGSVgpLyApCisjIGJ1dCB0aGF0IGFsc28gcmVuYW1lcyB0aGUgbWFuIHBhZ2VzLCB3aGljaCB0aGUgY3VycmVudAorIyBwcmFjdGljZSBkb2VzIG5vdCBkby4KK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJFRklYRUQpOyBkbyBcCisJICAgIG12IC1mICQkcCQoRVhFRVhUKSAkKFJQQ1BSRUZJWCkkKEtQUkVGSVgpJCRwJChFWEVFWFQpIDtcCisJICBkb25lKQordW5pbnN0YWxsLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgIGZvciBwIGluICQoc2Jpbl9QUkVGSVhFRCk7IGRvIFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJChLUFJFRklYKSQkcCQoRVhFRVhUKSA7XAorCSAgZG9uZSkKKworIyBYWFggVGhpcyBtYWtlcyBzb21lIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgYXV0b21ha2UgZG9lcy4KKyMgWFhYIEJ1dCB0aGVyZSBpcyBubyBpbnN0YWxsLW1hbi1ob29rIG9yIGluc3RhbGwtbWFuLWxvY2FsLgoraW5zdGFsbC1tYW46IGluc3RhbGwtbWFuOCBpbnN0YWxsLW1hbi1saW5rcwordW5pbnN0YWxsLW1hbjogdW5pbnN0YWxsLW1hbjggdW5pbnN0YWxsLW1hbi1saW5rcworCitpbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICAgICQoTE5fUykgJCRpbnN0ICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKK3VuaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgZG9uZSkKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTBiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9jb250ZXh0LmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAgQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYJLyogSEFWRV9DT05GSUdfSCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwYy9hdXRoX2dzcy5oPgorI2luY2x1ZGUgImdzc191dGlsLmgiCisjaW5jbHVkZSAiZ3NzX29pZHMuaCIKKyNpbmNsdWRlICJlcnJfdXRpbC5oIgorI2luY2x1ZGUgImNvbnRleHQuaCIKKworaW50CitzZXJpYWxpemVfY29udGV4dF9mb3Jfa2VybmVsKGdzc19jdHhfaWRfdCBjdHgsCisJCQkgICAgIGdzc19idWZmZXJfZGVzYyAqYnVmLAorCQkJICAgICBnc3NfT0lEIG1lY2gsCisJCQkgICAgIGludDMyX3QgKmVuZHRpbWUpCit7CisJaWYgKGdfT0lEX2VxdWFsKCZrcmI1b2lkLCBtZWNoKSkKKwkJcmV0dXJuIHNlcmlhbGl6ZV9rcmI1X2N0eChjdHgsIGJ1ZiwgZW5kdGltZSk7CisjaWZkZWYgSEFWRV9TUEtNM19ICisJZWxzZSBpZiAoZ19PSURfZXF1YWwoJnNwa20zb2lkLCBtZWNoKSkKKwkJcmV0dXJuIHNlcmlhbGl6ZV9zcGttM19jdHgoY3R4LCBidWYsIGVuZHRpbWUpOworI2VuZGlmCisJZWxzZSB7CisJCXByaW50ZXJyKDAsICJFUlJPUjogYXR0ZW1wdGluZyB0byBzZXJpYWxpemUgY29udGV4dCB3aXRoICIKKwkJCQkidW5rbm93bi91bnN1cHBvcnRlZCBtZWNoYW5pc20gb2lkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHQuaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQ3ZjljCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgIENvcHlyaWdodCAoYykgMjAwNCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisjaWZuZGVmIF9DT05URVhUX0hfCisjZGVmaW5lIF9DT05URVhUX0hfCisKKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKy8qIEhvcGVmdWxseSBiaWcgZW5vdWdoIHRvIGhvbGQgYW55IHNlcmlhbGl6ZWQgY29udGV4dCAqLworI2RlZmluZSBNQVhfQ1RYX0xFTiA0MDk2CisKKworaW50IHNlcmlhbGl6ZV9jb250ZXh0X2Zvcl9rZXJuZWwoZ3NzX2N0eF9pZF90IGN0eCwgZ3NzX2J1ZmZlcl9kZXNjICpidWYsCisJCQkJIGdzc19PSUQgbWVjaCwgaW50MzJfdCAqZW5kdGltZSk7CitpbnQgc2VyaWFsaXplX3Nwa20zX2N0eChnc3NfY3R4X2lkX3QgY3R4LCBnc3NfYnVmZmVyX2Rlc2MgKmJ1ZiwKKwkJCWludDMyX3QgKmVuZHRpbWUpOworaW50IHNlcmlhbGl6ZV9rcmI1X2N0eChnc3NfY3R4X2lkX3QgY3R4LCBnc3NfYnVmZmVyX2Rlc2MgKmJ1ZiwKKwkJICAgICAgIGludDMyX3QgKmVuZHRpbWUpOworCisjZW5kaWYgLyogX0NPTlRFWFRfSF8gKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfaGVpbWRhbC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dF9oZWltZGFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzYjhmZAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfaGVpbWRhbC5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2lmbmRlZiBIQVZFX0xVQ0lEX0NPTlRFWFRfU1VQUE9SVAorI2lmZGVmIEhBVkVfSEVJTURBTAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGtyYjUuaD4KKyNpbmNsdWRlIDxnc3NhcGkuaD4JLyogTXVzdCB1c2UgdGhlIGhlaW1kYWwgY29weSEgKi8KKyNpZmRlZiBIQVZFX0NPTV9FUlJfSAorI2luY2x1ZGUgPGNvbV9lcnIuaD4KKyNlbmRpZgorI2luY2x1ZGUgImVycl91dGlsLmgiCisjaW5jbHVkZSAiZ3NzX29pZHMuaCIKKyNpbmNsdWRlICJ3cml0ZV9ieXRlcy5oIgorCitpbnQgd3JpdGVfaGVpbWRhbF9rZXlibG9jayhjaGFyICoqcCwgY2hhciAqZW5kLCBrcmI1X2tleWJsb2NrICprZXkpCit7CisJZ3NzX2J1ZmZlcl9kZXNjIHRtcDsKKwlpbnQgY29kZSA9IC0xOworCisJaWYgKFdSSVRFX0JZVEVTKHAsIGVuZCwga2V5LT5rZXl0eXBlKSkgZ290byBvdXRfZXJyOworCXRtcC5sZW5ndGggPSBrZXktPmtleXZhbHVlLmxlbmd0aDsKKwl0bXAudmFsdWUgPSBrZXktPmtleXZhbHVlLmRhdGE7CisJaWYgKHdyaXRlX2J1ZmZlcihwLCBlbmQsICZ0bXApKSBnb3RvIG91dF9lcnI7CisJY29kZSA9IDA7CisgICAgb3V0X2VycjoKKwlyZXR1cm4oY29kZSk7Cit9CisKK2ludCB3cml0ZV9oZWltZGFsX2VuY19rZXkoY2hhciAqKnAsIGNoYXIgKmVuZCwgZ3NzX2N0eF9pZF90IGN0eCkKK3sKKwlrcmI1X2tleWJsb2NrIGVuY19rZXksICprZXk7CisJa3JiNV9jb250ZXh0IGNvbnRleHQ7CisJa3JiNV9lcnJvcl9jb2RlIHJldDsKKwlpbnQgaTsKKwljaGFyICpza2QsICpka2QsICprNWVyciA9IE5VTEw7CisJaW50IGNvZGUgPSAtMTsKKworCWlmICgocmV0ID0ga3JiNV9pbml0X2NvbnRleHQoJmNvbnRleHQpKSkgeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhOVUxMLCByZXQpOworCQlwcmludGVycigwLCAiRVJST1I6IGluaXRpYWxpemluZyBrcmI1X2NvbnRleHQ6ICVzXG4iLCBrNWVycik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoKHJldCA9IGtyYjVfYXV0aF9jb25fZ2V0bG9jYWxzdWJrZXkoY29udGV4dCwKKwkJCQkJCWN0eC0+YXV0aF9jb250ZXh0LCAma2V5KSkpeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCByZXQpOworCQlwcmludGVycigwLCAiRVJST1I6IGdldHRpbmcgYXV0aF9jb250ZXh0IGtleTogJXNcbiIsIGs1ZXJyKTsKKwkJZ290byBvdXRfZXJyX2ZyZWVfY29udGV4dDsKKwl9CisKKwltZW1zZXQoJmVuY19rZXksIDAsIHNpemVvZihlbmNfa2V5KSk7CisJZW5jX2tleS5rZXl0eXBlID0ga2V5LT5rZXl0eXBlOworCS8qIFhYWCBjdXJyZW50IGtlcm5lbCBjb2RlIG9ubHkgaGFuZGxlcyBkZXMtY2JjLXJhdyAgKDQpICovCisJaWYgKGVuY19rZXkua2V5dHlwZSAhPSA0KSB7CisJCXByaW50ZXJyKDEsICJXQVJOOiB3cml0ZV9oZWltZGFsX2VuY19rZXk6ICIKKwkJCSAgICAib3ZlcnJpZGluZyBoZWltZGFsIGtleXR5cGUgKCVkID0+ICVkKVxuIiwKKwkJCSBlbmNfa2V5LmtleXR5cGUsIDQpOworCQllbmNfa2V5LmtleXR5cGUgPSA0OworCX0KKwllbmNfa2V5LmtleXZhbHVlLmxlbmd0aCA9IGtleS0+a2V5dmFsdWUubGVuZ3RoOworCWlmICgoZW5jX2tleS5rZXl2YWx1ZS5kYXRhID0KKwkJCQljYWxsb2MoMSwgZW5jX2tleS5rZXl2YWx1ZS5sZW5ndGgpKSA9PSBOVUxMKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIEVOT01FTSk7CisJCXByaW50ZXJyKDAsICJFUlJPUjogYWxsb2NhdGluZyBtZW1vcnkgZm9yIGVuYyBrZXk6ICVzXG4iLAorCQkJIGs1ZXJyKTsKKwkJZ290byBvdXRfZXJyX2ZyZWVfa2V5OworCX0KKwlza2QgPSAoY2hhciAqKSBrZXktPmtleXZhbHVlLmRhdGE7CisJZGtkID0gKGNoYXIgKikgZW5jX2tleS5rZXl2YWx1ZS5kYXRhOworCWZvciAoaSA9IDA7IGkgPCBlbmNfa2V5LmtleXZhbHVlLmxlbmd0aDsgaSsrKQorCQlka2RbaV0gPSBza2RbaV0gXiAweGYwOworCWlmICh3cml0ZV9oZWltZGFsX2tleWJsb2NrKHAsIGVuZCwgJmVuY19rZXkpKSB7CisJCWdvdG8gb3V0X2Vycl9mcmVlX2VuY2tleTsKKwl9CisKKwljb2RlID0gMDsKKworICAgIG91dF9lcnJfZnJlZV9lbmNrZXk6CisJa3JiNV9mcmVlX2tleWJsb2NrX2NvbnRlbnRzKGNvbnRleHQsICZlbmNfa2V5KTsKKyAgICBvdXRfZXJyX2ZyZWVfa2V5OgorCWtyYjVfZnJlZV9rZXlibG9jayhjb250ZXh0LCBrZXkpOworICAgIG91dF9lcnJfZnJlZV9jb250ZXh0OgorCWtyYjVfZnJlZV9jb250ZXh0KGNvbnRleHQpOworICAgIG91dF9lcnI6CisJZnJlZShrNWVycik7CisJcHJpbnRlcnIoMiwgIndyaXRlX2hlaW1kYWxfZW5jX2tleTogJXNcbiIsIGNvZGUgPyAiRkFJTEVEIiA6ICJTVUNDRVNTIik7CisJcmV0dXJuKGNvZGUpOworfQorCitpbnQgd3JpdGVfaGVpbWRhbF9zZXFfa2V5KGNoYXIgKipwLCBjaGFyICplbmQsIGdzc19jdHhfaWRfdCBjdHgpCit7CisJa3JiNV9rZXlibG9jayAqa2V5OworCWtyYjVfY29udGV4dCBjb250ZXh0OworCWtyYjVfZXJyb3JfY29kZSByZXQ7CisJY2hhciAqazVlcnIgPSBOVUxMOworCWludCBjb2RlID0gLTE7CisKKwlpZiAoKHJldCA9IGtyYjVfaW5pdF9jb250ZXh0KCZjb250ZXh0KSkpIHsKKwkJazVlcnIgPSBnc3NkX2s1X2Vycl9tc2coTlVMTCwgcmV0KTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiBpbml0aWFsaXppbmcga3JiNV9jb250ZXh0OiAlc1xuIiwgazVlcnIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJaWYgKChyZXQgPSBrcmI1X2F1dGhfY29uX2dldGxvY2Fsc3Via2V5KGNvbnRleHQsCisJCQkJCQljdHgtPmF1dGhfY29udGV4dCwgJmtleSkpKXsKKwkJazVlcnIgPSBnc3NkX2s1X2Vycl9tc2coY29udGV4dCwgcmV0KTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiBnZXR0aW5nIGF1dGhfY29udGV4dCBrZXk6ICVzXG4iLCBrNWVycik7CisJCWdvdG8gb3V0X2Vycl9mcmVlX2NvbnRleHQ7CisJfQorCisJLyogWFhYIGN1cnJlbnQga2VybmVsIGNvZGUgb25seSBoYW5kbGVzIGRlcy1jYmMtcmF3ICAoNCkgKi8KKwlpZiAoa2V5LT5rZXl0eXBlICE9IDQpIHsKKwkJcHJpbnRlcnIoMSwgIldBUk46IHdyaXRlX2hlaW1kYWxfc2VxX2tleTogIgorCQkJICAgICJvdmVycmlkaW5nIGhlaW1kYWwga2V5dHlwZSAoJWQgPT4gJWQpXG4iLAorCQkJIGtleS0+a2V5dHlwZSwgNCk7CisJCWtleS0+a2V5dHlwZSA9IDQ7CisJfQorCisJaWYgKHdyaXRlX2hlaW1kYWxfa2V5YmxvY2socCwgZW5kLCBrZXkpKSB7CisJCWdvdG8gb3V0X2Vycl9mcmVlX2tleTsKKwl9CisKKwljb2RlID0gMDsKKworICAgIG91dF9lcnJfZnJlZV9rZXk6CisJa3JiNV9mcmVlX2tleWJsb2NrKGNvbnRleHQsIGtleSk7CisgICAgb3V0X2Vycl9mcmVlX2NvbnRleHQ6CisJa3JiNV9mcmVlX2NvbnRleHQoY29udGV4dCk7CisgICAgb3V0X2VycjoKKwlmcmVlKGs1ZXJyKTsKKwlwcmludGVycigyLCAid3JpdGVfaGVpbWRhbF9zZXFfa2V5OiAlc1xuIiwgY29kZSA/ICJGQUlMRUQiIDogIlNVQ0NFU1MiKTsKKwlyZXR1cm4oY29kZSk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIHRoZSBrZXJuZWwgc3RydWN0dXJlIHRoYXQgd2UgYXJlIGZpbGxpbmcgaW46CisgKgorICogc3RydWN0IGtyYjVfY3R4IHsKKyAqICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaW5pdGlhdGU7CisgKiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNlZWRfaW5pdDsKKyAqICAgICAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICAgc2VlZFsxNl07CisgKiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNpZ25hbGc7CisgKiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHNlYWxhbGc7CisgKiAgICAgICAgIHN0cnVjdCBjcnlwdG9fdGZtICAgICAgICplbmM7CisgKiAgICAgICAgIHN0cnVjdCBjcnlwdG9fdGZtICAgICAgICpzZXE7CisgKiAgICAgICAgIHMzMiAgICAgICAgICAgICAgICAgICAgIGVuZHRpbWU7CisgKiAgICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgIHNlcV9zZW5kOworICogICAgICAgICBzdHJ1Y3QgeGRyX25ldG9iaiAgICAgICBtZWNoX3VzZWQ7CisgKiB9OworICoKKyAqIEhvd2V2ZXIsIG5vdGUgdGhhdCB3ZSBkbyBub3Qgc2VuZCB0aGUgZGF0YSBmaWVsZHMgaW4gdGhlCisgKiBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgc3RydWN0dXJlLiAgVGhlIG9yZGVyIHRoZXkgYXJlCisgKiBzZW50IGRvd24gaW4gaXM6CisgKgorICoJaW5pdGlhdGUKKyAqCXNlZWRfaW5pdAorICoJc2VlZAorICoJc2lnbmFsZworICoJc2VhbGFsZworICoJZW5kdGltZQorICoJc2VxX3NlbmQKKyAqCW1lY2hfdXNlZAorICoJZW5jIGtleQorICoJc2VxIGtleQorICoKKyAqLworCitpbnQKK3NlcmlhbGl6ZV9rcmI1X2N0eChnc3NfY3R4X2lkX3QgY3R4LCBnc3NfYnVmZmVyX2Rlc2MgKmJ1ZiwgaW50MzJfdCAqZW5kdGltZSkKK3sKKworCWNoYXIgKnAsICplbmQ7CisJc3RhdGljIGludCBjb25zdGFudF9vbmUgPSAxOworCXN0YXRpYyBpbnQgY29uc3RhbnRfemVybyA9IDA7CisJdW5zaWduZWQgY2hhciBmYWtlc2VlZFsxNl07CisJdWludDMyX3QgYWxnb3JpdGhtOworCisJaWYgKCEoYnVmLT52YWx1ZSA9IGNhbGxvYygxLCBNQVhfQ1RYX0xFTikpKQorCQlnb3RvIG91dF9lcnI7CisJcCA9IGJ1Zi0+dmFsdWU7CisJZW5kID0gYnVmLT52YWx1ZSArIE1BWF9DVFhfTEVOOworCisKKwkvKiBpbml0aWF0ZTogIDEgPT4gaW5pdGlhdGluZyAwID0+IGFjY2VwdGluZyAqLworCWlmIChjdHgtPm1vcmVfZmxhZ3MgJiBMT0NBTCkgeworCQlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgY29uc3RhbnRfb25lKSkgZ290byBvdXRfZXJyOworCX0KKwllbHNlIHsKKwkJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGNvbnN0YW50X3plcm8pKSBnb3RvIG91dF9lcnI7CisJfQorCisJLyogc2VlZF9pbml0OiBub3QgdXNlZCBieSBrZXJuZWwgY29kZSAqLworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBjb25zdGFudF96ZXJvKSkgZ290byBvdXRfZXJyOworCisJLyogc2VlZDogbm90IHVzZWQgYnkga2VybmVsIGNvZGUgKi8KKwltZW1zZXQoJmZha2VzZWVkLCAwLCBzaXplb2YoZmFrZXNlZWQpKTsKKwlpZiAod3JpdGVfYnl0ZXMoJnAsIGVuZCwgJmZha2VzZWVkLCAxNikpIGdvdG8gb3V0X2VycjsKKworCS8qIHNpZ25hbGcgKi8KKwlhbGdvcml0aG0gPSAwOyAvKiBTR05fQUxHX0RFU19NQUNfTUQ1CVhYWCAqLworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBhbGdvcml0aG0pKSBnb3RvIG91dF9lcnI7CisKKwkvKiBzZWFsYWxnICovCisJYWxnb3JpdGhtID0gMDsgLyogU0VBTF9BTEdfREVTCQlYWFggKi8KKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgYWxnb3JpdGhtKSkgZ290byBvdXRfZXJyOworCisJLyogZW5kdGltZSAqLworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBjdHgtPmxpZmV0aW1lKSkgZ290byBvdXRfZXJyOworCisJaWYgKGVuZHRpbWUpCisJCSplbmR0aW1lID0gY3R4LT5saWZldGltZTsKKworCS8qIHNlcV9zZW5kICovCisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGN0eC0+YXV0aF9jb250ZXh0LT5sb2NhbF9zZXFudW1iZXIpKQorCQlnb3RvIG91dF9lcnI7CisJLyogbWVjaF91c2VkICovCisJaWYgKHdyaXRlX2J1ZmZlcigmcCwgZW5kLCAoZ3NzX2J1ZmZlcl9kZXNjKikma3JiNW9pZCkpIGdvdG8gb3V0X2VycjsKKworCS8qIGVuYzogZGVyaXZlIHRoZSBlbmNyeXB0aW9uIGtleSBhbmQgY29weSBpdCBpbnRvIGJ1ZmZlciAqLworCWlmICh3cml0ZV9oZWltZGFsX2VuY19rZXkoJnAsIGVuZCwgY3R4KSkgZ290byBvdXRfZXJyOworCisJLyogc2VxOiBnZXQgdGhlIHNlcXVlbmNlIG51bWJlciBrZXkgYW5kIGNvcHkgaXQgaW50byBidWZmZXIgKi8KKwlpZiAod3JpdGVfaGVpbWRhbF9zZXFfa2V5KCZwLCBlbmQsIGN0eCkpIGdvdG8gb3V0X2VycjsKKworCWJ1Zi0+bGVuZ3RoID0gcCAtIChjaGFyICopYnVmLT52YWx1ZTsKKwlwcmludGVycigyLCAic2VyaWFsaXplX2tyYjVfY3R4OiByZXR1cm5pbmcgYnVmZmVyICIKKwkJICAgICJ3aXRoICVkIGJ5dGVzXG4iLCBidWYtPmxlbmd0aCk7CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJcHJpbnRlcnIoMCwgIkVSUk9SOiBmYWlsZWQgZXhwb3J0aW5nIEhlaW1kYWwga3JiNSBjdHggdG8ga2VybmVsXG4iKTsKKwlpZiAoYnVmLT52YWx1ZSkgZnJlZShidWYtPnZhbHVlKTsKKwlidWYtPmxlbmd0aCA9IDA7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYJLyogSEFWRV9IRUlNREFMICovCisjZW5kaWYJLyogSEFWRV9MVUNJRF9DT05URVhUX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfbHVjaWQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfbHVjaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTY4MmFlCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dF9sdWNpZC5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ09QWVJJR0hUIChjKSAyMDA2CisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbgorICogQUxMIFJJR0hUUyBSRVNFUlZFRAorICoKKyAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzCisgKiBhbmQgcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcworICogZm9yIGFueSBwdXJwb3NlLCBzbyBsb25nIGFzIHRoZSBuYW1lIG9mIFRoZSBVbml2ZXJzaXR5IG9mCisgKiBNaWNoaWdhbiBpcyBub3QgdXNlZCBpbiBhbnkgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5CisgKiBwZXJ0YWluaW5nIHRvIHRoZSB1c2Ugb2YgZGlzdHJpYnV0aW9uIG9mIHRoaXMgc29mdHdhcmUKKyAqIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgYXV0aG9yaXphdGlvbi4gIElmIHRoZQorICogYWJvdmUgY29weXJpZ2h0IG5vdGljZSBvciBhbnkgb3RoZXIgaWRlbnRpZmljYXRpb24gb2YgdGhlCisgKiBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuIGlzIGluY2x1ZGVkIGluIGFueSBjb3B5IG9mIGFueQorICogcG9ydGlvbiBvZiB0aGlzIHNvZnR3YXJlLCB0aGVuIHRoZSBkaXNjbGFpbWVyIGJlbG93IG11c3QKKyAqIGFsc28gYmUgaW5jbHVkZWQuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBBUyBJUywgV0lUSE9VVCBSRVBSRVNFTlRBVElPTgorICogRlJPTSBUSEUgVU5JVkVSU0lUWSBPRiBNSUNISUdBTiBBUyBUTyBJVFMgRklUTkVTUyBGT1IgQU5ZCisgKiBQVVJQT1NFLCBBTkQgV0lUSE9VVCBXQVJSQU5UWSBCWSBUSEUgVU5JVkVSU0lUWSBPRgorICogTUlDSElHQU4gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORworICogV0lUSE9VVCBMSU1JVEFUSU9OIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRQorICogUkVHRU5UUyBPRiBUSEUgVU5JVkVSU0lUWSBPRiBNSUNISUdBTiBTSEFMTCBOT1QgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERBTUFHRVMsIElOQ0xVRElORyBTUEVDSUFMLCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTSBBUklTSU5HCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBJVCBIQVMgQkVFTiBPUiBJUyBIRVJFQUZURVIgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2lmZGVmIEhBVkVfTFVDSURfQ09OVEVYVF9TVVBQT1JUCisKKy8qCisgKiBOZXdlciB2ZXJzaW9ucyBvZiBNSVQgYW5kIEhlaW1kYWwgaGF2ZSBsdWNpZCBjb250ZXh0IHN1cHBvcnQuCisgKiBXZSBjYW4gdXNlIGNvbW1vbiBjb2RlIGlmIGl0IGlzIHN1cHBvcnRlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGlfa3JiNS5oPgorCisjaW5jbHVkZSAiZ3NzX3V0aWwuaCIKKyNpbmNsdWRlICJnc3Nfb2lkcy5oIgorI2luY2x1ZGUgImVycl91dGlsLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorCisjaWZuZGVmIE9NX3VpbnQ2NAordHlwZWRlZiB1aW50NjRfdCBPTV91aW50NjQ7CisjZW5kaWYKKworc3RhdGljIGludAord3JpdGVfbHVjaWRfa2V5YmxvY2soY2hhciAqKnAsIGNoYXIgKmVuZCwgZ3NzX2tyYjVfbHVjaWRfa2V5X3QgKmtleSkKK3sKKwlnc3NfYnVmZmVyX2Rlc2MgdG1wOworCisJaWYgKFdSSVRFX0JZVEVTKHAsIGVuZCwga2V5LT50eXBlKSkgcmV0dXJuIC0xOworCXRtcC5sZW5ndGggPSBrZXktPmxlbmd0aDsKKwl0bXAudmFsdWUgPSBrZXktPmRhdGE7CisJaWYgKHdyaXRlX2J1ZmZlcihwLCBlbmQsICZ0bXApKSByZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ByZXBhcmVfa3JiNV9yZmMxOTY0X2J1ZmZlcihnc3Nfa3JiNV9sdWNpZF9jb250ZXh0X3YxX3QgKmxjdHgsCisJZ3NzX2J1ZmZlcl9kZXNjICpidWYsIGludDMyX3QgKmVuZHRpbWUpCit7CisjZGVmaW5lIEZBS0VTRUVEX1NJWkUgMTYKKwljaGFyICpwLCAqZW5kOworCXN0YXRpYyBpbnQgY29uc3RhbnRfemVybyA9IDA7CisJdW5zaWduZWQgY2hhciBmYWtlc2VlZFtGQUtFU0VFRF9TSVpFXTsKKwl1aW50MzJfdCB3b3JkX3NlbmRfc2VxOworCWdzc19rcmI1X2x1Y2lkX2tleV90IGVuY19rZXk7CisJaW50IGk7CisJY2hhciAqc2tkLCAqZGtkOworCWdzc19idWZmZXJfZGVzYyBmYWtlb2lkOworCisJLyoKKwkgKiBUaGUgbmV3IEtlcmJlcm9zIGludGVyZmFjZSB0byBnZXQgdGhlIGdzcyBjb250ZXh0CisJICogZG9lcyBub3QgaW5jbHVkZSB0aGUgc2VlZCBvciBzZWVkX2luaXQgZmllbGRzCisJICogYmVjYXVzZSB3ZSBuZXZlciByZWFsbHkgdXNlIHRoZW0uICBCdXQgZm9yIG5vdywKKwkgKiBzZW5kIGRvd24gYSBmYWtlIGJ1ZmZlciBzbyB3ZSBjYW4gdXNlIHRoZSBzYW1lCisJICogaW50ZXJmYWNlIHRvIHRoZSBrZXJuZWwuCisJICovCisJbWVtc2V0KCZlbmNfa2V5LCAwLCBzaXplb2YoZW5jX2tleSkpOworCW1lbXNldCgmZmFrZW9pZCwgMCwgc2l6ZW9mKGZha2VvaWQpKTsKKwltZW1zZXQoZmFrZXNlZWQsIDAsIEZBS0VTRUVEX1NJWkUpOworCisJaWYgKCEoYnVmLT52YWx1ZSA9IGNhbGxvYygxLCBNQVhfQ1RYX0xFTikpKQorCQlnb3RvIG91dF9lcnI7CisJcCA9IGJ1Zi0+dmFsdWU7CisJZW5kID0gYnVmLT52YWx1ZSArIE1BWF9DVFhfTEVOOworCisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGxjdHgtPmluaXRpYXRlKSkgZ290byBvdXRfZXJyOworCisJLyogc2VlZF9pbml0IGFuZCBzZWVkIG5vdCB1c2VkIGJ5IGtlcm5lbCBhbnl3YXkgKi8KKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgY29uc3RhbnRfemVybykpIGdvdG8gb3V0X2VycjsKKwlpZiAod3JpdGVfYnl0ZXMoJnAsIGVuZCwgJmZha2VzZWVkLCBGQUtFU0VFRF9TSVpFKSkgZ290byBvdXRfZXJyOworCisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGxjdHgtPnJmYzE5NjRfa2Quc2lnbl9hbGcpKSBnb3RvIG91dF9lcnI7CisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGxjdHgtPnJmYzE5NjRfa2Quc2VhbF9hbGcpKSBnb3RvIG91dF9lcnI7CisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGxjdHgtPmVuZHRpbWUpKSBnb3RvIG91dF9lcnI7CisJaWYgKGVuZHRpbWUpCisJCSplbmR0aW1lID0gbGN0eC0+ZW5kdGltZTsKKwl3b3JkX3NlbmRfc2VxID0gbGN0eC0+c2VuZF9zZXE7CS8qIFhYWCBzZW5kX3NlcSBpcyA2NC1iaXQgKi8KKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgd29yZF9zZW5kX3NlcSkpIGdvdG8gb3V0X2VycjsKKwlpZiAod3JpdGVfb2lkKCZwLCBlbmQsICZrcmI1b2lkKSkgZ290byBvdXRfZXJyOworCisjaWZkZWYgSEFWRV9IRUlNREFMCisJLyoKKwkgKiBUaGUga2VybmVsIGdzcyBjb2RlIGV4cGVjdHMgZGVzLWNiYy1yYXcgZm9yIGFsbCBmbGF2b3JzIG9mIGRlcy4KKwkgKiBUaGUga2V5dHlwZSBmcm9tIE1JVCBoYXMgdGhpcyB0eXBlLCBidXQgSGVpbWRhbCBkb2VzIG5vdC4KKwkgKiBGb3JjZSB0aGUgSGVpbWRhbCBrZXl0eXBlIHRvIDQgKGRlcy1jYmMtcmF3KS4KKwkgKiBOb3RlIHRoYXQgdGhlIHJmYzE5NjQgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIERFUyBlbmN0eXBlcy4KKwkgKi8KKwlpZiAobGN0eC0+cmZjMTk2NF9rZC5jdHhfa2V5LnR5cGUgIT0gNCkgeworCQlwcmludGVycigxLCAicHJlcGFyZV9rcmI1X3JmYzE5NjRfYnVmZmVyOiAiCisJCQkgICAgIm92ZXJyaWRpbmcgaGVpbWRhbCBrZXl0eXBlICglZCA9PiAlZClcbiIsCisJCQkgICAgbGN0eC0+cmZjMTk2NF9rZC5jdHhfa2V5LnR5cGUsIDQpOworCQlsY3R4LT5yZmMxOTY0X2tkLmN0eF9rZXkudHlwZSA9IDQ7CisJfQorI2VuZGlmCisJcHJpbnRlcnIoMiwgInByZXBhcmVfa3JiNV9yZmMxOTY0X2J1ZmZlcjogc2VyaWFsaXppbmcga2V5cyB3aXRoICIKKwkJICJlbmN0eXBlICVkIGFuZCBsZW5ndGggJWRcbiIsCisJCSBsY3R4LT5yZmMxOTY0X2tkLmN0eF9rZXkudHlwZSwKKwkJIGxjdHgtPnJmYzE5NjRfa2QuY3R4X2tleS5sZW5ndGgpOworCisJLyogZGVyaXZlIHRoZSBlbmNyeXB0aW9uIGtleSBhbmQgY29weSBpdCBpbnRvIGJ1ZmZlciAqLworCWVuY19rZXkudHlwZSA9IGxjdHgtPnJmYzE5NjRfa2QuY3R4X2tleS50eXBlOworCWVuY19rZXkubGVuZ3RoID0gbGN0eC0+cmZjMTk2NF9rZC5jdHhfa2V5Lmxlbmd0aDsKKwlpZiAoKGVuY19rZXkuZGF0YSA9IGNhbGxvYygxLCBlbmNfa2V5Lmxlbmd0aCkpID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwlza2QgPSAoY2hhciAqKSBsY3R4LT5yZmMxOTY0X2tkLmN0eF9rZXkuZGF0YTsKKwlka2QgPSAoY2hhciAqKSBlbmNfa2V5LmRhdGE7CisJZm9yIChpID0gMDsgaSA8IGVuY19rZXkubGVuZ3RoOyBpKyspCisJCWRrZFtpXSA9IHNrZFtpXSBeIDB4ZjA7CisJaWYgKHdyaXRlX2x1Y2lkX2tleWJsb2NrKCZwLCBlbmQsICZlbmNfa2V5KSkgeworCQlmcmVlKGVuY19rZXkuZGF0YSk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJZnJlZShlbmNfa2V5LmRhdGEpOworCisJaWYgKHdyaXRlX2x1Y2lkX2tleWJsb2NrKCZwLCBlbmQsICZsY3R4LT5yZmMxOTY0X2tkLmN0eF9rZXkpKQorCQlnb3RvIG91dF9lcnI7CisKKwlidWYtPmxlbmd0aCA9IHAgLSAoY2hhciAqKWJ1Zi0+dmFsdWU7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXByaW50ZXJyKDAsICJFUlJPUjogZmFpbGVkIHNlcmlhbGl6aW5nIGtyYjUgY29udGV4dCBmb3Iga2VybmVsXG4iKTsKKwlpZiAoYnVmLT52YWx1ZSkgZnJlZShidWYtPnZhbHVlKTsKKwlidWYtPmxlbmd0aCA9IDA7CisJaWYgKGVuY19rZXkuZGF0YSkgZnJlZShlbmNfa2V5LmRhdGEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAorcHJlcGFyZV9rcmI1X3JmY19jZnhfYnVmZmVyKGdzc19rcmI1X2x1Y2lkX2NvbnRleHRfdjFfdCAqbGN0eCwKKwlnc3NfYnVmZmVyX2Rlc2MgKmJ1ZiwgaW50MzJfdCAqZW5kdGltZSkKK3sKKwlwcmludGVycigwLCAiRVJST1I6IHByZXBhcmVfa3JiNV9yZmNfY2Z4X2J1ZmZlcjogbm90IGltcGxlbWVudGVkXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKKworaW50CitzZXJpYWxpemVfa3JiNV9jdHgoZ3NzX2N0eF9pZF90IGN0eCwgZ3NzX2J1ZmZlcl9kZXNjICpidWYsIGludDMyX3QgKmVuZHRpbWUpCit7CisJT01fdWludDMyIG1hal9zdGF0LCBtaW5fc3RhdDsKKwl2b2lkICpyZXR1cm5fY3R4ID0gMDsKKwlPTV91aW50MzIgdmVyczsKKwlnc3Nfa3JiNV9sdWNpZF9jb250ZXh0X3YxX3QgKmxjdHggPSAwOworCWludCByZXRjb2RlID0gMDsKKworCXByaW50ZXJyKDIsICJERUJVRzogc2VyaWFsaXplX2tyYjVfY3R4OiBsdWNpZCB2ZXJzaW9uIVxuIik7CisJbWFqX3N0YXQgPSBnc3NfZXhwb3J0X2x1Y2lkX3NlY19jb250ZXh0KCZtaW5fc3RhdCwgJmN0eCwKKwkJCQkJCTEsICZyZXR1cm5fY3R4KTsKKwlpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJcGdzc2VycigiZ3NzX2V4cG9ydF9sdWNpZF9zZWNfY29udGV4dCIsCisJCQltYWpfc3RhdCwgbWluX3N0YXQsICZrcmI1b2lkKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIENoZWNrIHRoZSB2ZXJzaW9uIHJldHVybmVkLCB3ZSBvbmx5IHN1cHBvcnQgdjEgcmlnaHQgbm93ICovCisJdmVycyA9ICgoZ3NzX2tyYjVfbHVjaWRfY29udGV4dF92ZXJzaW9uX3QgKilyZXR1cm5fY3R4KS0+dmVyc2lvbjsKKwlzd2l0Y2ggKHZlcnMpIHsKKwljYXNlIDE6CisJCWxjdHggPSAoZ3NzX2tyYjVfbHVjaWRfY29udGV4dF92MV90ICopIHJldHVybl9jdHg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ZXJyKDAsICJFUlJPUjogdW5zdXBwb3J0ZWQgbHVjaWQgc2VjIGNvbnRleHQgdmVyc2lvbiAlZFxuIiwKKwkJCXZlcnMpOworCQlnb3RvIG91dF9lcnI7CisJCWJyZWFrOworCX0KKworCS8qIE5vdyBsY3R4IHBvaW50cyB0byBhIGx1Y2lkIGNvbnRleHQgdGhhdCB3ZSBjYW4gc2VuZCBkb3duIHRvIGtlcm5lbCAqLworCWlmIChsY3R4LT5wcm90b2NvbCA9PSAwKQorCQlyZXRjb2RlID0gcHJlcGFyZV9rcmI1X3JmYzE5NjRfYnVmZmVyKGxjdHgsIGJ1ZiwgZW5kdGltZSk7CisJZWxzZQorCQlyZXRjb2RlID0gcHJlcGFyZV9rcmI1X3JmY19jZnhfYnVmZmVyKGxjdHgsIGJ1ZiwgZW5kdGltZSk7CisKKwltYWpfc3RhdCA9IGdzc19mcmVlX2x1Y2lkX3NlY19jb250ZXh0KCZtaW5fc3RhdCwgY3R4LCByZXR1cm5fY3R4KTsKKwlpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJcGdzc2VycigiZ3NzX2V4cG9ydF9sdWNpZF9zZWNfY29udGV4dCIsCisJCQltYWpfc3RhdCwgbWluX3N0YXQsICZrcmI1b2lkKTsKKwkJcHJpbnRlcnIoMCwgIldBUk46IGZhaWxlZCB0byBmcmVlIGx1Y2lkIHNlYyBjb250ZXh0XG4iKTsKKwl9CisKKwlpZiAocmV0Y29kZSkgeworCQlwcmludGVycigxLCAic2VyaWFsaXplX2tyYjVfY3R4OiBwcmVwYXJlX2tyYjVfKl9idWZmZXIgIgorCQkJICJmYWlsZWQgKHJldGNvZGUgPSAlZClcbiIsIHJldGNvZGUpOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJcHJpbnRlcnIoMCwgIkVSUk9SOiBmYWlsZWQgc2VyaWFsaXppbmcga3JiNSBjb250ZXh0IGZvciBrZXJuZWxcbiIpOworCXJldHVybiAtMTsKK30KKyNlbmRpZiAvKiBIQVZFX0xVQ0lEX0NPTlRFWFRfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dF9taXQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5YTkwMwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfbWl0LmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgIENvcHlyaWdodCAoYykgMjAwNCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2lmbmRlZiBIQVZFX0xVQ0lEX0NPTlRFWFRfU1VQUE9SVAorI2lmZGVmIEhBVkVfS1JCNQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwYy9hdXRoX2dzcy5oPgorI2luY2x1ZGUgImdzc191dGlsLmgiCisjaW5jbHVkZSAiZ3NzX29pZHMuaCIKKyNpbmNsdWRlICJlcnJfdXRpbC5oIgorI2luY2x1ZGUgImNvbnRleHQuaCIKKworI2luY2x1ZGUgPGtyYjUuaD4KKworI2lmIChLUkI1X1ZFUlNJT04gPiAxMzEpCisvKiBYWFggYXJnZ2dnLCB0aGVyZSdzIGdvdHRhIGJlIGEgYmV0dGVyIHdheSB0aGFuIGp1c3QgZHVwbGljYXRpbmcgdGhpcworICogd2hvbGUgc3RydWN0LiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpcyBpbiBhICJwcml2YXRlIiBoZWFkZXIgZmlsZSwKKyAqIHNvIHRoaXMgaXMgb3VyIGJlc3QgY2hvaWNlIGF0IHRoaXMgcG9pbnQgOi0vCisgKgorICogWFhYIERvZXMgdGhpcyBtYXRjaCB0aGUgSGVpbWRhbCBkZWZpbml0aW9uPyAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2tyYjVfZ3NzX2N0eF9pZF9yZWMgeworICAgdW5zaWduZWQgaW50IGluaXRpYXRlIDogMTsgICAvKiBub256ZXJvIGlmIGluaXRpYXRpbmcsIHplcm8gaWYgYWNjZXB0aW5nICovCisgICB1bnNpZ25lZCBpbnQgZXN0YWJsaXNoZWQgOiAxOworICAgdW5zaWduZWQgaW50IGJpZ19lbmRpYW4gOiAxOworICAgdW5zaWduZWQgaW50IGhhdmVfYWNjZXB0b3Jfc3Via2V5IDogMTsKKyAgIHVuc2lnbmVkIGludCBzZWVkX2luaXQgOiAxOyAgLyogWFhYIHRlc3RlZCBidXQgbmV2ZXIgYWN0dWFsbHkgc2V0ICovCisjaWZkZWYgQ0ZYX0VYRVJDSVNFCisgICB1bnNpZ25lZCBpbnQgdGVzdGluZ191bmtub3duX3Rva2lkIDogMTsgLyogZm9yIHRlc3Rpbmcgb25seSAqLworI2VuZGlmCisgICBPTV91aW50MzIgZ3NzX2ZsYWdzOworICAgdW5zaWduZWQgY2hhciBzZWVkWzE2XTsKKyAgIGtyYjVfcHJpbmNpcGFsIGhlcmU7CisgICBrcmI1X3ByaW5jaXBhbCB0aGVyZTsKKyAgIGtyYjVfa2V5YmxvY2sgKnN1YmtleTsKKyAgIGludCBzaWduYWxnOworICAgc2l6ZV90IGNrc3VtX3NpemU7CisgICBpbnQgc2VhbGFsZzsKKyAgIGtyYjVfa2V5YmxvY2sgKmVuYzsKKyAgIGtyYjVfa2V5YmxvY2sgKnNlcTsKKyAgIGtyYjVfdGltZXN0YW1wIGVuZHRpbWU7CisgICBrcmI1X2ZsYWdzIGtyYl9mbGFnczsKKyAgIC8qIFhYWCB0aGVzZSB1c2VkIHRvIGJlIHNpZ25lZC4gIHRoZSBvbGQgc3BlYyBpcyBpbnNwZWNpZmljLCBhbmQKKyAgICAgIHRoZSBuZXcgc3BlYyBzcGVjaWZpZXMgdW5zaWduZWQuICBJIGRvbid0IGJlbGlldmUgdGhhdCB0aGUgY2hhbmdlCisgICAgICBhZmZlY3RzIHRoZSB3aXJlIGVuY29kaW5nLiAqLworICAgdWludDY0X3Qgc2VxX3NlbmQ7CQkvKiBnc3NpbnRfdWludDY0ICovCisgICB1aW50NjRfdCBzZXFfcmVjdjsJCS8qIGdzc2ludF91aW50NjQgKi8KKyAgIHZvaWQgKnNlcXN0YXRlOworICAga3JiNV9hdXRoX2NvbnRleHQgYXV0aF9jb250ZXh0OworICAgZ3NzX09JRF9kZXNjICptZWNoX3VzZWQ7CS8qIGdzc19PSURfZGVzYyAqLworICAgIC8qIFByb3RvY29sIHNwZWMgcmV2aXNpb24KKyAgICAgICAwID0+IFJGQyAxOTY0IHdpdGggM0RFUyBhbmQgUkM0IGVuaGFuY2VtZW50cworICAgICAgIDEgPT4gZHJhZnQtaWV0Zi1rcmItd2ctZ3NzYXBpLWNmeC0wMQorICAgICAgIE5vIG90aGVycyBkZWZpbmVkIHNvIGZhci4gICovCisgICBpbnQgcHJvdG87CisgICBrcmI1X2Nrc3VtdHlwZSBja3N1bXR5cGU7ICAgIC8qIGZvciAibWFpbiIgc3Via2V5ICovCisgICBrcmI1X2tleWJsb2NrICphY2NlcHRvcl9zdWJrZXk7IC8qIENGWCBvbmx5ICovCisgICBrcmI1X2Nrc3VtdHlwZSBhY2NlcHRvcl9zdWJrZXlfY2tzdW10eXBlOworI2lmZGVmIENGWF9FWEVSQ0lTRQorICAgIGdzc19idWZmZXJfZGVzYyBpbml0X3Rva2VuOworI2VuZGlmCit9IGtyYjVfZ3NzX2N0eF9pZF9yZWMsICprcmI1X2dzc19jdHhfaWRfdDsKKworI2Vsc2UJLyogS1JCNV9WRVJTSU9OID4gMTMxICovCisKK3R5cGVkZWYgc3RydWN0IF9rcmI1X2dzc19jdHhfaWRfcmVjIHsKKwlpbnQgaW5pdGlhdGU7CisJdV9pbnQzMl90IGdzc19mbGFnczsKKwlpbnQgc2VlZF9pbml0OworCXVuc2lnbmVkIGNoYXIgc2VlZFsxNl07CisJa3JiNV9wcmluY2lwYWwgaGVyZTsKKwlrcmI1X3ByaW5jaXBhbCB0aGVyZTsKKwlrcmI1X2tleWJsb2NrICpzdWJrZXk7CisJaW50IHNpZ25hbGc7CisJaW50IGNrc3VtX3NpemU7CisJaW50IHNlYWxhbGc7CisJa3JiNV9rZXlibG9jayAqZW5jOworCWtyYjVfa2V5YmxvY2sgKnNlcTsKKwlrcmI1X3RpbWVzdGFtcCBlbmR0aW1lOworCWtyYjVfZmxhZ3Mga3JiX2ZsYWdzOworCWtyYjVfdWlfNCBzZXFfc2VuZDsKKwlrcmI1X3VpXzQgc2VxX3JlY3Y7CisJdm9pZCAqc2Vxc3RhdGU7CisJaW50IGVzdGFibGlzaGVkOworCWludCBiaWdfZW5kaWFuOworCWtyYjVfYXV0aF9jb250ZXh0IGF1dGhfY29udGV4dDsKKwlnc3NfT0lEX2Rlc2MgKm1lY2hfdXNlZDsKKwlpbnQgbmN0eXBlczsKKwlrcmI1X2Nrc3VtdHlwZSAqY3R5cGVzOworfSBrcmI1X2dzc19jdHhfaWRfcmVjLCAqa3JiNV9nc3NfY3R4X2lkX3Q7CisKKyNlbmRpZiAvKiBLUkI1X1ZFUlNJT04gKi8KKworCitzdGF0aWMgaW50Cit3cml0ZV9rZXlibG9jayhjaGFyICoqcCwgY2hhciAqZW5kLCBzdHJ1Y3QgX2tyYjVfa2V5YmxvY2sgKmFyZykKK3sKKwlnc3NfYnVmZmVyX2Rlc2MgdG1wOworCisJaWYgKFdSSVRFX0JZVEVTKHAsIGVuZCwgYXJnLT5lbmN0eXBlKSkgcmV0dXJuIC0xOworCXRtcC5sZW5ndGggPSBhcmctPmxlbmd0aDsKKwl0bXAudmFsdWUgPSBhcmctPmNvbnRlbnRzOworCWlmICh3cml0ZV9idWZmZXIocCwgZW5kLCAmdG1wKSkgcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisvKgorICogV2UgcmVhbGx5IHNob3VsZG4ndCBrbm93IGFib3V0IGdsdWUtbGF5ZXIgY29udGV4dCBzdHJ1Y3R1cmUsIGJ1dAorICogd2UgbmVlZCB0byBnZXQgYXQgdGhlIHJlYWwga3JiNSBjb250ZXh0IHBvaW50ZXIuICBUaGlzIHNob3VsZCBiZQorICogcmVtb3ZlZCBhcyBzb29uIGFzIHdlIHNheSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBNSVQgS2VyYmVyb3MKKyAqIHByaW9yIHRvIDEuNCAtLSB3aGljaCBnaXZlcyB1cyAibGVnYWwiIGFjY2VzcyB0byB0aGUgY29udGV4dCBpbmZvLgorICovCit0eXBlZGVmIHN0cnVjdCBnc3NfdW5pb25fY3R4X2lkX3QgeworCWdzc19PSUQgICAgICAgICBtZWNoX3R5cGU7CisJZ3NzX2N0eF9pZF90ICAgIGludGVybmFsX2N0eF9pZDsKK30gZ3NzX3VuaW9uX2N0eF9pZF9kZXNjLCAqZ3NzX3VuaW9uX2N0eF9pZF90OworCitpbnQKK3NlcmlhbGl6ZV9rcmI1X2N0eChnc3NfY3R4X2lkX3QgY3R4LCBnc3NfYnVmZmVyX2Rlc2MgKmJ1ZiwgaW50MzJfdCAqZW5kdGltZSkKK3sKKwlrcmI1X2dzc19jdHhfaWRfdCBrY3R4ID0gKChnc3NfdW5pb25fY3R4X2lkX3QpY3R4KS0+aW50ZXJuYWxfY3R4X2lkOworCWNoYXIgKnAsICplbmQ7CisJc3RhdGljIGludCBjb25zdGFudF9vbmUgPSAxOworCXN0YXRpYyBpbnQgY29uc3RhbnRfemVybyA9IDA7CisJdWludDMyX3Qgd29yZF9zZXFfc2VuZDsKKworCWlmICghKGJ1Zi0+dmFsdWUgPSBjYWxsb2MoMSwgTUFYX0NUWF9MRU4pKSkKKwkJZ290byBvdXRfZXJyOworCXAgPSBidWYtPnZhbHVlOworCWVuZCA9IGJ1Zi0+dmFsdWUgKyBNQVhfQ1RYX0xFTjsKKworCWlmIChrY3R4LT5pbml0aWF0ZSkgeworCQlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgY29uc3RhbnRfb25lKSkgZ290byBvdXRfZXJyOworCX0KKwllbHNlIHsKKwkJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGNvbnN0YW50X3plcm8pKSBnb3RvIG91dF9lcnI7CisJfQorCWlmIChrY3R4LT5zZWVkX2luaXQpIHsKKwkJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGNvbnN0YW50X29uZSkpIGdvdG8gb3V0X2VycjsKKwl9CisJZWxzZSB7CisJCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBjb25zdGFudF96ZXJvKSkgZ290byBvdXRfZXJyOworCX0KKwlpZiAod3JpdGVfYnl0ZXMoJnAsIGVuZCwgJmtjdHgtPnNlZWQsIHNpemVvZihrY3R4LT5zZWVkKSkpCisJCWdvdG8gb3V0X2VycjsKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwga2N0eC0+c2lnbmFsZykpIGdvdG8gb3V0X2VycjsKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwga2N0eC0+c2VhbGFsZykpIGdvdG8gb3V0X2VycjsKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwga2N0eC0+ZW5kdGltZSkpIGdvdG8gb3V0X2VycjsKKwlpZiAoZW5kdGltZSkKKwkJKmVuZHRpbWUgPSBrY3R4LT5lbmR0aW1lOworCXdvcmRfc2VxX3NlbmQgPSBrY3R4LT5zZXFfc2VuZDsKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgd29yZF9zZXFfc2VuZCkpIGdvdG8gb3V0X2VycjsKKwlpZiAod3JpdGVfb2lkKCZwLCBlbmQsIGtjdHgtPm1lY2hfdXNlZCkpIGdvdG8gb3V0X2VycjsKKworCXByaW50ZXJyKDIsICJzZXJpYWxpemVfa3JiNV9jdHg6IHNlcmlhbGl6aW5nIGtleXMgd2l0aCAiCisJCSAiZW5jdHlwZSAlZCBhbmQgbGVuZ3RoICVkXG4iLAorCQkga2N0eC0+ZW5jLT5lbmN0eXBlLCBrY3R4LT5lbmMtPmxlbmd0aCk7CisKKwlpZiAod3JpdGVfa2V5YmxvY2soJnAsIGVuZCwga2N0eC0+ZW5jKSkgZ290byBvdXRfZXJyOworCWlmICh3cml0ZV9rZXlibG9jaygmcCwgZW5kLCBrY3R4LT5zZXEpKSBnb3RvIG91dF9lcnI7CisKKwlidWYtPmxlbmd0aCA9IHAgLSAoY2hhciAqKWJ1Zi0+dmFsdWU7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXByaW50ZXJyKDAsICJFUlJPUjogZmFpbGVkIHNlcmlhbGl6aW5nIGtyYjUgY29udGV4dCBmb3Iga2VybmVsXG4iKTsKKwlpZiAoYnVmLT52YWx1ZSkgZnJlZShidWYtPnZhbHVlKTsKKwlidWYtPmxlbmd0aCA9IDA7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogSEFWRV9LUkI1ICovCisjZW5kaWYgLyogSEFWRV9MVUNJRF9DT05URVhUX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfc3BrbTMuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2NvbnRleHRfc3BrbTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTI3NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvY29udGV4dF9zcGttMy5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgkvKiBIQVZFX0NPTkZJR19IICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGkuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjL2F1dGhfZ3NzLmg+CisjaW5jbHVkZSAiZ3NzX3V0aWwuaCIKKyNpbmNsdWRlICJnc3Nfb2lkcy5oIgorI2luY2x1ZGUgImVycl91dGlsLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorCisjaWZkZWYgSEFWRV9TUEtNM19ICisKKyNpbmNsdWRlIDxzcGttMy5oPgorCisvKgorICogRnVuY3Rpb246IHByZXBhcmVfc3BrbTNfY3R4X2J1ZmZlcigpCisgKgorICogUHJlcGFyZSBzcGttMyBsdWNpZCBjb250ZXh0IGZvciB0aGUga2VybmVsCisgKgorICoJYnVmLT5sZW5ndGggc2hvdWxkIGJlOgorICoKKyAqICAgICAgdmVyc2lvbiA0CisgKgljdHhfaWQgNCArIDEyCisgKglxb3AgNAorICoJbWVjaF91c2VkIDQgKyA3CisgKglyZXRfZmwgIDQKKyAqCXJlcV9mbCAgNAorICogICAgICBzaGFyZSAgIDQgKyBrZXlfbGVuCisgKiAgICAgIGNvbmZfYWxnIDQgKyBvaWRfbGVuCisgKiAgICAgIGRfY29uZl9rZXkgNCArIGtleV9sZW4KKyAqICAgICAgaW50Z19hbGcgNCArIG9pZF9sZW4KKyAqICAgICAgZF9pbnRnX2tleSA0ICsga2V5X2xlbgorICogICAgICBreWVzdGIgNCArIG9pZF9sZW4KKyAqICAgICAgb3dsIGFsZyA0ICsgb2lkX2xlbgorKi8KK3N0YXRpYyBpbnQKK3ByZXBhcmVfc3BrbTNfY3R4X2J1ZmZlcihnc3Nfc3BrbTNfbHVjaWRfY3R4X3QgKmxjdHgsIGdzc19idWZmZXJfZGVzYyAqYnVmKQoreworCWNoYXIgKnAsICplbmQ7CisJdW5zaWduZWQgaW50IGJ1Zl9zaXplID0gMDsKKworCWJ1Zl9zaXplID0gc2l6ZW9mKGxjdHgtPnZlcnNpb24pICsKKwkJbGN0eC0+Y3R4X2lkLmxlbmd0aCArIHNpemVvZihsY3R4LT5jdHhfaWQubGVuZ3RoKSArCisJCXNpemVvZihsY3R4LT5lbmR0aW1lKSArCisJCXNpemVvZihsY3R4LT5tZWNoX3VzZWQubGVuZ3RoKSArIGxjdHgtPm1lY2hfdXNlZC5sZW5ndGggKworCQlzaXplb2YobGN0eC0+cmV0X2ZsYWdzKSArCisJCXNpemVvZihsY3R4LT5jb25mX2FsZy5sZW5ndGgpICsgbGN0eC0+Y29uZl9hbGcubGVuZ3RoICsKKwkJc2l6ZW9mKGxjdHgtPmRlcml2ZWRfY29uZl9rZXkubGVuZ3RoKSArCisJCWxjdHgtPmRlcml2ZWRfY29uZl9rZXkubGVuZ3RoICsKKwkJc2l6ZW9mKGxjdHgtPmludGdfYWxnLmxlbmd0aCkgKyBsY3R4LT5pbnRnX2FsZy5sZW5ndGggKworCQlzaXplb2YobGN0eC0+ZGVyaXZlZF9pbnRlZ19rZXkubGVuZ3RoKSArCisJCWxjdHgtPmRlcml2ZWRfaW50ZWdfa2V5Lmxlbmd0aDsKKworCWlmICghKGJ1Zi0+dmFsdWUgPSBjYWxsb2MoMSwgYnVmX3NpemUpKSkKKwkJZ290byBvdXRfZXJyOworCXAgPSBidWYtPnZhbHVlOworCWVuZCA9IGJ1Zi0+dmFsdWUgKyBidWZfc2l6ZTsKKworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBsY3R4LT52ZXJzaW9uKSkKKwkJZ290byBvdXRfZXJyOworCXByaW50ZXJyKDIsICJERUJVRzogZXhwb3J0aW5nIHZlcnNpb24gPSAlZFxuIiwgbGN0eC0+dmVyc2lvbik7CisKKwlpZiAod3JpdGVfYnVmZmVyKCZwLCBlbmQsICZsY3R4LT5jdHhfaWQpKQorCQlnb3RvIG91dF9lcnI7CisJcHJpbnRlcnIoMiwgIkRFQlVHOiBleHBvcnRpbmcgY3R4X2lkKCVkKVxuIiwgbGN0eC0+Y3R4X2lkLmxlbmd0aCk7CisKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgbGN0eC0+ZW5kdGltZSkpCisJCWdvdG8gb3V0X2VycjsKKwlwcmludGVycigyLCAiREVCVUc6IGV4cG9ydGluZyBlbmR0aW1lID0gJWRcbiIsIGxjdHgtPmVuZHRpbWUpOworCisJaWYgKHdyaXRlX2J1ZmZlcigmcCwgZW5kLCAmbGN0eC0+bWVjaF91c2VkKSkKKwkJZ290byBvdXRfZXJyOworCXByaW50ZXJyKDIsICJERUJVRzogZXhwb3J0aW5nIG1lY2ggb2lkICglZClcbiIsIGxjdHgtPm1lY2hfdXNlZC5sZW5ndGgpOworCisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIGxjdHgtPnJldF9mbGFncykpCisJCWdvdG8gb3V0X2VycjsKKwlwcmludGVycigyLCAiREVCVUc6IGV4cG9ydGluZyByZXRfZmxhZ3MgPSAlZFxuIiwgbGN0eC0+cmV0X2ZsYWdzKTsKKworCWlmICh3cml0ZV9idWZmZXIoJnAsIGVuZCwgJmxjdHgtPmNvbmZfYWxnKSkKKwkJZ290byBvdXRfZXJyOworCXByaW50ZXJyKDIsICJERUJVRzogZXhwb3J0aW5nIGNvbmZfYWxnIG9pZCAoJWQpXG4iLCBsY3R4LT5jb25mX2FsZy5sZW5ndGgpOworCisJaWYgKHdyaXRlX2J1ZmZlcigmcCwgZW5kLCAmbGN0eC0+ZGVyaXZlZF9jb25mX2tleSkpCisJCWdvdG8gb3V0X2VycjsKKwlwcmludGVycigyLCAiREVCVUc6IGV4cG9ydGluZyBjb25mIGtleSAoJWQpXG4iLCBsY3R4LT5kZXJpdmVkX2NvbmZfa2V5Lmxlbmd0aCk7CisKKwlpZiAod3JpdGVfYnVmZmVyKCZwLCBlbmQsICZsY3R4LT5pbnRnX2FsZykpCisJCWdvdG8gb3V0X2VycjsKKwlwcmludGVycigyLCAiREVCVUc6IGV4cG9ydGluZyBpbnRnX2FsZyBvaWQgKCVkKVxuIiwgbGN0eC0+aW50Z19hbGcubGVuZ3RoKTsKKworCWlmICh3cml0ZV9idWZmZXIoJnAsIGVuZCwgJmxjdHgtPmRlcml2ZWRfaW50ZWdfa2V5KSkKKwkJZ290byBvdXRfZXJyOworCXByaW50ZXJyKDIsICJERUJVRzogZXhwb3J0aW5nIGludGcga2V5ICglZClcbiIsIGxjdHgtPmRlcml2ZWRfaW50ZWdfa2V5Lmxlbmd0aCk7CisKKwlidWYtPmxlbmd0aCA9IHAgLSAoY2hhciAqKWJ1Zi0+dmFsdWU7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXByaW50ZXJyKDAsICJFUlJPUjogZmFpbGVkIHNlcmlhbGl6aW5nIHNwa20zIGNvbnRleHQgZm9yIGtlcm5lbFxuIik7CisJaWYgKGJ1Zi0+dmFsdWUpIGZyZWUoYnVmLT52YWx1ZSk7CisJYnVmLT5sZW5ndGggPSAwOworCisJcmV0dXJuIC0xOworfQorCisvKiBBTkRST1M6IG5lZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyBvZiB0aGUgc3BrbTNfZ3NzX2N0eF9pZF9kZXNjX3QKKyAqIGFyZSBuZWVkZWQgaW4gdGhlIGtlcm5lbCBmb3IgZ2V0X21pYywgdmFsaWRhdGUsIHdyYXAsIHVud3JhcCwgYW5kIGRlc3Ryb3kKKyAqIGFuZCBvbmx5IGV4cG9ydCB0aG9zZSBmaWVsZHMgdG8gdGhlIGtlcm5lbC4KKyAqLworaW50CitzZXJpYWxpemVfc3BrbTNfY3R4KGdzc19jdHhfaWRfdCBjdHgsIGdzc19idWZmZXJfZGVzYyAqYnVmLCBpbnQzMl90ICplbmR0aW1lKQoreworCU9NX3VpbnQzMiB2ZXJzLCByZXQsIG1hal9zdGF0LCBtaW5fc3RhdDsKKwl2b2lkICpyZXRfY3R4ID0gMDsKKwlnc3Nfc3BrbTNfbHVjaWRfY3R4X3QgICAgICpsY3R4OworCisJcHJpbnRlcnIoMSwgInNlcmlhbGl6ZV9zcGttM19jdHggY2FsbGVkXG4iKTsKKworCXByaW50ZXJyKDIsICJERUJVRzogc2VyaWFsaXplX3Nwa20zX2N0eDogbHVjaWQgdmVyc2lvbiFcbiIpOworCW1hal9zdGF0ID0gZ3NzX2V4cG9ydF9sdWNpZF9zZWNfY29udGV4dCgmbWluX3N0YXQsICZjdHgsIDEsICZyZXRfY3R4KTsKKwlpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpCisJCWdvdG8gb3V0X2VycjsKKworCWxjdHggPSAoZ3NzX3Nwa20zX2x1Y2lkX2N0eF90ICopcmV0X2N0eDsKKworCXZlcnMgPSBsY3R4LT52ZXJzaW9uOworCWlmICh2ZXJzICE9IDEpIHsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiB1bnN1cHBvcnRlZCBzcGttMyBjb250ZXh0IHZlcnNpb24gJWRcbiIsCisJCQl2ZXJzKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlyZXQgPSBwcmVwYXJlX3Nwa20zX2N0eF9idWZmZXIobGN0eCwgYnVmKTsKKworCWlmIChlbmR0aW1lKQorCQkqZW5kdGltZSA9IGxjdHgtPmVuZHRpbWU7CisKKwltYWpfc3RhdCA9IGdzc19mcmVlX2x1Y2lkX3NlY19jb250ZXh0KCZtaW5fc3RhdCwgY3R4LCByZXRfY3R4KTsKKworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkKKwkJcHJpbnRlcnIoMCwgIldBUk46IGZhaWxlZCB0byBmcmVlIGx1Y2lkIHNlYyBjb250ZXh0XG4iKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9lcnI7CisJcHJpbnRlcnIoMiwgIkRFQlVHOiBzZXJpYWxpemVfc3BrbTNfY3R4OiBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlwcmludGVycigyLCAiREVCVUc6IHNlcmlhbGl6ZV9zcGttM19jdHg6IGZhaWxlZFxuIik7CisJcmV0dXJuIC0xOworfQorI2VuZGlmIC8qIEhBVkVfU1BLTTNfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZXJyX3V0aWwuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2Vycl91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwOWVkYQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2Vycl91dGlsLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAgQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYJLyogSEFWRV9DT05GSUdfSCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ4bG9nLmgiCisKK3N0YXRpYyBpbnQgdmVyYm9zaXR5ID0gMDsKK3N0YXRpYyBpbnQgZmcgPSAwOworCit2b2lkIGluaXRlcnIoY2hhciAqcHJvZ25hbWUsIGludCBzZXRfdmVyYm9zaXR5LCBpbnQgc2V0X2ZnKQoreworCXZlcmJvc2l0eSA9IHNldF92ZXJib3NpdHk7CisJZmcgPSBzZXRfZmc7CisJaWYgKCFmZykKKwkJeGxvZ19vcGVuKHByb2duYW1lKTsKK30KKworCit2b2lkIHByaW50ZXJyKGludCBwcmlvcml0eSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJLyogRG9uJ3QgYm90aGVyIGZvcm1hdHRpbmcgYSBtZXNzYWdlIHdlJ3JlIG5ldmVyIGdvaW5nIHRvIHByaW50ISAqLworCWlmIChwcmlvcml0eSA+IHZlcmJvc2l0eSkKKwkJcmV0dXJuOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlpZiAoZmcpCisJCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKwllbHNlCisJCXhsb2dfYmFja2VuZChMX0VSUk9SLCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KKworaW50IGdldF92ZXJib3NpdHkodm9pZCkKK3sKKwlyZXR1cm4gdmVyYm9zaXR5OworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZXJyX3V0aWwuaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2Vycl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkZjMyZAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2Vycl91dGlsLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAgQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZm5kZWYgX0VSUl9VVElMX0hfCisjZGVmaW5lIF9FUlJfVVRJTF9IXworCit2b2lkIGluaXRlcnIoY2hhciAqcHJvZ25hbWUsIGludCB2ZXJib3NpdHksIGludCBmZyk7Cit2b2lkIHByaW50ZXJyKGludCBwcmlvcml0eSwgY2hhciAqZm9ybWF0LCAuLi4pOworaW50IGdldF92ZXJib3NpdHkodm9pZCk7CisKKyNlbmRpZiAvKiBfRVJSX1VUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc19jbG50X3NlbmRfZXJyLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NfY2xudF9zZW5kX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDBhMDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NfY2xudF9zZW5kX2Vyci5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgQ29weXJpZ2h0IChjKSAyMDA0IEJydWNlIEZpZWxkcyA8YmZpZWxkc0B1bWljaC5lZHU+CisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgkvKiBIQVZFX0NPTkZJR19IICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJnc3NkLmgiCisjaW5jbHVkZSAid3JpdGVfYnl0ZXMuaCIKKworY2hhciBwaXBlZnNkaXJbUEFUSF9NQVhdID0gR1NTRF9QSVBFRlNfRElSOworCitzdGF0aWMgdm9pZAordXNhZ2UoY2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgY2xudGRpciB1c2VyIFt1c2VyIC4uLl1cbiIsIHByb2duYW1lKTsKKwlleGl0KDEpOworfQorCitzdGF0aWMgaW50Citkb19lcnJvcl9kb3duY2FsbChpbnQgazVfZmQsIHVpZF90IHVpZCwgaW50IGVycikKK3sKKwljaGFyICAgIGJ1ZlsxMDI0XTsKKwljaGFyICAgICpwID0gYnVmLCAqZW5kID0gYnVmICsgMTAyNDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDA7CisJaW50ICAgICB6ZXJvID0gMDsKKworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCB1aWQpKSByZXR1cm4gLTE7CisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIHRpbWVvdXQpKSByZXR1cm4gLTE7CisJLyogdXNlIHNlcV93aW4gPSAwIHRvIGluZGljYXRlIGFuIGVycm9yOiAqLworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCB6ZXJvKSkgcmV0dXJuIC0xOworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBlcnIpKSByZXR1cm4gLTE7CisKKwlpZiAod3JpdGUoazVfZmQsIGJ1ZiwgcCAtIGJ1ZikgPCBwIC0gYnVmKSByZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBmZDsKKwlpbnQgaTsKKwl1aWRfdCB1aWQ7CisJY2hhciAqZW5kcHRyOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJaWYgKGFyZ2MgPCAzKQorCQl1c2FnZShhcmd2WzBdKTsKKwlmZCA9IG9wZW4oYXJndlsxXSwgT19XUk9OTFkpOworCWlmIChmZCA9PSAtMSkKKwkJZXJyKDEsICJ1bmFibGUgdG8gb3BlbiAlcyIsIGFyZ3ZbMV0pOworCisJZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgeworCQl1aWQgPSBzdHJ0b2woYXJndltpXSwgJmVuZHB0ciwgMTApOworCQlpZiAoKmVuZHB0ciAhPSAnXDAnKSB7CisJCQlwdyA9IGdldHB3bmFtKGFyZ3ZbaV0pOworCQkJaWYgKCFwdykKKwkJCQllcnIoMSwgInVua25vd24gdXNlciAlcyIsIGFyZ3ZbaV0pOworCQkJdWlkID0gcHctPnB3X3VpZDsKKwkJfQorCQlpZiAoZG9fZXJyb3JfZG93bmNhbGwoZmQsIHVpZCwgLTEpKQorCQkJZXJyKDEsICJmYWlsZWQgdG8gZGVzdHJveSBjcmVkIGZvciB1c2VyICVzIiwgYXJndltpXSk7CisJfQorCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NfZGVzdHJveV9jcmVkcyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc19kZXN0cm95X2NyZWRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTc4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NfZGVzdHJveV9jcmVkcwpAQCAtMCwwICsxLDExIEBACisjIS9iaW4vYmFzaAorCitwYXRoPWBtb3VudHxncmVwIHJwY19waXBlZnN8YXdrICd7IHByaW50ICQzO2V4aXQgfSdgCisKK2lmIFsgLXogIiRwYXRoIiBdOyB0aGVuCisJZWNobyAidW5hYmxlIHRvIGZpbmQgcnBjX3BpcGVmczsgaXMgaXQgbW91bnRlZD8iCisJZXhpdCAxCitmaTsKKworZmluZCAiJHBhdGgiIC1uYW1lICdrcmI1JyAtZXhlYyBnc3NfY2xudF9zZW5kX2VyciAne30nICQqICc7JworCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3Nfb2lkcy5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzX29pZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTljNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzX29pZHMuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgkvKiBIQVZFX0NPTkZJR19IICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisKKy8qIGZyb20ga2VyYmVyb3Mgc291cmNlLCBnc3NhcGlfa3JiNS5jICovCitnc3NfT0lEX2Rlc2Mga3JiNW9pZCA9CisgICB7OSwgIlwwNTJcMjA2XDExMFwyMDZcMzY3XDAyMlwwMDFcMDAyXDAwMiJ9OworCitnc3NfT0lEX2Rlc2Mgc3BrbTNvaWQgPQorICAgezcsICJcMDUzXDAwNlwwMDFcMDA1XDAwNVwwMDFcMDAzIn07CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3Nfb2lkcy5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzX29pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBhMzUyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzX29pZHMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmbmRlZiBfR1NTX09JRFNfSF8KKyNkZWZpbmUgX0dTU19PSURTX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZXh0ZXJuIGdzc19PSURfZGVzYyBrcmI1b2lkOworZXh0ZXJuIGdzc19PSURfZGVzYyBzcGttM29pZDsKKworI2lmbmRlZiBnX09JRF9lcXVhbAorI2RlZmluZSBnX09JRF9lcXVhbChvMSxvMikgXAorICAgICgoKG8xKS0+bGVuZ3RoID09IChvMiktPmxlbmd0aCkgJiYgXAorICAgICAobWVtY21wKChvMSktPmVsZW1lbnRzLChvMiktPmVsZW1lbnRzLCh1bnNpZ25lZCBpbnQpIChvMSktPmxlbmd0aCkgPT0gMCkpCisjZW5kaWYKKworI2VuZGlmIC8qIF9HU1NfT0lEU19IXyAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzX3V0aWwuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc191dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhY2ViMwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc191dGlsLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiAgQWRhcHRlZCBpbiBwYXJ0IGZyb20gTUlUIEtlcmJlcm9zIDUtMS4yLjEgc2xhdmUva3Byb3AuYyBhbmQgZnJvbQorICogIGh0dHA6Ly9kb2NzLnN1bi5jb20vP3A9L2RvYy84MTYtMTMzMS82bTdvbzlzbXMmYT12aWV3CisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0B1bWljaC5lZHU+CisgKiAgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHVtaWNoLmVkdT4KKyAqICBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisgKi8KKworLyoKKyAqIHNsYXZlL2twcm9wLmMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MCwxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBFeHBvcnQgb2YgdGhpcyBzb2Z0d2FyZSBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EgbWF5CisgKiAgIHJlcXVpcmUgYSBzcGVjaWZpYyBsaWNlbnNlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudC4KKyAqICAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGNvbnRlbXBsYXRpbmcKKyAqICAgZXhwb3J0IHRvIG9idGFpbiBzdWNoIGEgbGljZW5zZSBiZWZvcmUgZXhwb3J0aW5nLgorICoKKyAqIFdJVEhJTiBUSEFUIENPTlNUUkFJTlQsIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kCisgKiB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcKKyAqIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorICogcGVybWlzc2lvbi4gIEZ1cnRoZXJtb3JlIGlmIHlvdSBtb2RpZnkgdGhpcyBzb2Z0d2FyZSB5b3UgbXVzdCBsYWJlbAorICogeW91ciBzb2Z0d2FyZSBhcyBtb2RpZmllZCBzb2Z0d2FyZSBhbmQgbm90IGRpc3RyaWJ1dGUgaXQgaW4gc3VjaCBhCisgKiBmYXNoaW9uIHRoYXQgaXQgbWlnaHQgYmUgY29uZnVzZWQgd2l0aCB0aGUgb3JpZ2luYWwgTS5JLlQuIHNvZnR3YXJlLgorICogTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKKyAqIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAxOTk0IGJ5IE9wZW5WaXNpb24gVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgT3BlblZpc2lvbiBub3QgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBPcGVuVmlzaW9uIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogT1BFTlZJU0lPTiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIE9QRU5WSVNJT04gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyAqIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorICogT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGkuaD4KKyNpZiBkZWZpbmVkKEhBVkVfS1JCNSkgJiYgIWRlZmluZWQoR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UpCisjaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaV9nZW5lcmljLmg+CisjZGVmaW5lIEdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIGdzc19udF9zZXJ2aWNlX25hbWUKKyNlbmRpZgorI2luY2x1ZGUgImdzc191dGlsLmgiCisjaW5jbHVkZSAiZXJyX3V0aWwuaCIKKyNpbmNsdWRlICJnc3NkLmgiCisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9DT01fRVJSX0gKKyNpbmNsdWRlIDxjb21fZXJyLmg+CisjZW5kaWYKKworLyogR2xvYmFsIGdzc2RfY3JlZGVudGlhbHMgaGFuZGxlICovCitnc3NfY3JlZF9pZF90IGdzc2RfY3JlZHM7CisKK2dzc19PSUQgZ19tZWNoT2lkID0gR1NTX0NfTlVMTF9PSUQ7OworCisjaWYgMAorc3RhdGljIHZvaWQKK2Rpc3BsYXlfc3RhdHVzXzEoY2hhciAqbSwgdV9pbnQzMl90IGNvZGUsIGludCB0eXBlLCBjb25zdCBnc3NfT0lEIG1lY2gpCit7CisJdV9pbnQzMl90IG1hal9zdGF0LCBtaW5fc3RhdDsKKwlnc3NfYnVmZmVyX2Rlc2MgbXNnID0gR1NTX0NfRU1QVFlfQlVGRkVSOworCXVfaW50MzJfdCBtc2dfY3R4ID0gMDsKKwljaGFyICp0eXBlc3RyOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHU1NfQ19HU1NfQ09ERToKKwkJdHlwZXN0ciA9ICJHU1MiOworCQlicmVhazsKKwljYXNlIEdTU19DX01FQ0hfQ09ERToKKwkJdHlwZXN0ciA9ICJtZWNoYW5pc20iOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwlmb3IgKDs7KSB7CisJCW1hal9zdGF0ID0gZ3NzX2Rpc3BsYXlfc3RhdHVzKCZtaW5fc3RhdCwgY29kZSwKKwkJICAgIHR5cGUsIG1lY2gsICZtc2dfY3R4LCAmbXNnKTsKKwkJaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFKSB7CisJCQlwcmludGVycigwLCAiRVJST1I6IGluIGNhbGwgdG8gIgorCQkJCSJnc3NfZGlzcGxheV9zdGF0dXMgY2FsbGVkIGZyb20gJXNcbiIsIG0pOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcmludGVycigwLCAiRVJST1I6IEdTUy1BUEk6ICglcykgZXJyb3IgaW4gJXMoKTogJXNcbiIsCisJCQkgICAgdHlwZXN0ciwgbSwgKGNoYXIgKiltc2cudmFsdWUpOworCQl9CisKKwkJaWYgKG1zZy5sZW5ndGggIT0gMCkKKwkJCSh2b2lkKSBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbl9zdGF0LCAmbXNnKTsKKworCQlpZiAobXNnX2N0eCA9PSAwKQorCQkJYnJlYWs7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkaXNwbGF5X3N0YXR1c18yKGNoYXIgKm0sIHVfaW50MzJfdCBtYWpvciwgdV9pbnQzMl90IG1pbm9yLCBjb25zdCBnc3NfT0lEIG1lY2gpCit7CisJdV9pbnQzMl90IG1hal9zdGF0MSwgbWluX3N0YXQxOworCXVfaW50MzJfdCBtYWpfc3RhdDIsIG1pbl9zdGF0MjsKKwlnc3NfYnVmZmVyX2Rlc2MgbWFqX2dzc19idWYgPSBHU1NfQ19FTVBUWV9CVUZGRVI7CisJZ3NzX2J1ZmZlcl9kZXNjIG1pbl9nc3NfYnVmID0gR1NTX0NfRU1QVFlfQlVGRkVSOworCWNoYXIgbWFqX2J1ZlszMF0sIG1pbl9idWZbMzBdOworCWNoYXIgKm1haiwgKm1pbjsKKwl1X2ludDMyX3QgbXNnX2N0eCA9IDA7CisJaW50IG1zZ192ZXJib3NpdHkgPSAwOworCisJLyogR2V0IG1ham9yIHN0YXR1cyBtZXNzYWdlICovCisJbWFqX3N0YXQxID0gZ3NzX2Rpc3BsYXlfc3RhdHVzKCZtaW5fc3RhdDEsIG1ham9yLAorCQlHU1NfQ19HU1NfQ09ERSwgbWVjaCwgJm1zZ19jdHgsICZtYWpfZ3NzX2J1Zik7CisKKwlpZiAobWFqX3N0YXQxICE9IEdTU19TX0NPTVBMRVRFKSB7CisJCXNucHJpbnRmKG1hal9idWYsIHNpemVvZihtYWpfYnVmKSwgIigweCUwOHgpIiwgbWFqb3IpOworCQltYWogPSAmbWFqX2J1ZlswXTsKKwl9IGVsc2UgeworCQltYWogPSBtYWpfZ3NzX2J1Zi52YWx1ZTsKKwl9CisKKwkvKiBHZXQgbWlub3Igc3RhdHVzIG1lc3NhZ2UgKi8KKwltYWpfc3RhdDIgPSBnc3NfZGlzcGxheV9zdGF0dXMoJm1pbl9zdGF0MiwgbWlub3IsCisJCUdTU19DX01FQ0hfQ09ERSwgbWVjaCwgJm1zZ19jdHgsICZtaW5fZ3NzX2J1Zik7CisKKwlpZiAobWFqX3N0YXQyICE9IEdTU19TX0NPTVBMRVRFKSB7CisJCXNucHJpbnRmKG1pbl9idWYsIHNpemVvZihtaW5fYnVmKSwgIigweCUwOHgpIiwgbWlub3IpOworCQltaW4gPSAmbWluX2J1ZlswXTsKKwl9IGVsc2UgeworCQltaW4gPSBtaW5fZ3NzX2J1Zi52YWx1ZTsKKwl9CisKKwlpZiAobWFqb3IgPT0gR1NTX1NfQ1JFREVOVElBTFNfRVhQSVJFRCkKKwkJbXNnX3ZlcmJvc2l0eSA9IDE7CisJcHJpbnRlcnIobXNnX3ZlcmJvc2l0eSwgIkVSUk9SOiBHU1MtQVBJOiBlcnJvciBpbiAlcygpOiAlcyAtICVzXG4iLAorCQkgbSwgbWFqLCBtaW4pOworCisJaWYgKG1hal9nc3NfYnVmLmxlbmd0aCAhPSAwKQorCQkodm9pZCkgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdDEsICZtYWpfZ3NzX2J1Zik7CisJaWYgKG1pbl9nc3NfYnVmLmxlbmd0aCAhPSAwKQorCQkodm9pZCkgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdDIsICZtaW5fZ3NzX2J1Zik7Cit9CisKK3ZvaWQKK3Bnc3NlcnIoY2hhciAqbXNnLCB1X2ludDMyX3QgbWFqX3N0YXQsIHVfaW50MzJfdCBtaW5fc3RhdCwgY29uc3QgZ3NzX09JRCBtZWNoKQoreworCWRpc3BsYXlfc3RhdHVzXzIobXNnLCBtYWpfc3RhdCwgbWluX3N0YXQsIG1lY2gpOworfQorCitpbnQKK2dzc2RfYWNxdWlyZV9jcmVkKGNoYXIgKnNlcnZlcl9uYW1lKQoreworCWdzc19idWZmZXJfZGVzYyBuYW1lOworCWdzc19uYW1lX3QgdGFyZ2V0X25hbWU7CisJdV9pbnQzMl90IG1hal9zdGF0LCBtaW5fc3RhdDsKKwl1X2ludDMyX3QgaWdub3JlX21hal9zdGF0LCBpZ25vcmVfbWluX3N0YXQ7CisJZ3NzX2J1ZmZlcl9kZXNjIHBidWY7CisKKwluYW1lLnZhbHVlID0gKHZvaWQgKilzZXJ2ZXJfbmFtZTsKKwluYW1lLmxlbmd0aCA9IHN0cmxlbihzZXJ2ZXJfbmFtZSk7CisKKwltYWpfc3RhdCA9IGdzc19pbXBvcnRfbmFtZSgmbWluX3N0YXQsICZuYW1lLAorCQkJKGNvbnN0IGdzc19PSUQpIEdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFLAorCQkJJnRhcmdldF9uYW1lKTsKKworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkgeworCQlwZ3NzZXJyKCJnc3NfaW1wb3J0X25hbWUiLCBtYWpfc3RhdCwgbWluX3N0YXQsIGdfbWVjaE9pZCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKworCW1hal9zdGF0ID0gZ3NzX2FjcXVpcmVfY3JlZCgmbWluX3N0YXQsIHRhcmdldF9uYW1lLCAwLAorCQkJR1NTX0NfTlVMTF9PSURfU0VULCBHU1NfQ19BQ0NFUFQsCisJCQkmZ3NzZF9jcmVkcywgTlVMTCwgTlVMTCk7CisKKwlpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJcGdzc2VycigiZ3NzX2FjcXVpcmVfY3JlZCIsIG1hal9zdGF0LCBtaW5fc3RhdCwgZ19tZWNoT2lkKTsKKwkJaWdub3JlX21hal9zdGF0ID0gZ3NzX2Rpc3BsYXlfbmFtZSgmaWdub3JlX21pbl9zdGF0LAorCQkJCXRhcmdldF9uYW1lLCAmcGJ1ZiwgTlVMTCk7CisJCWlmIChpZ25vcmVfbWFqX3N0YXQgPT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJCXByaW50ZXJyKDEsICJVbmFibGUgdG8gb2J0YWluIGNyZWRlbnRpYWxzIGZvciAnJS4qcydcbiIsCisJCQkJIHBidWYubGVuZ3RoLCBwYnVmLnZhbHVlKTsKKwkJCWlnbm9yZV9tYWpfc3RhdCA9IGdzc19yZWxlYXNlX2J1ZmZlcigmaWdub3JlX21pbl9zdGF0LAorCQkJCQkJCSAgICAgJnBidWYpOworCQl9CisJfQorCisJaWdub3JlX21hal9zdGF0ID0gZ3NzX3JlbGVhc2VfbmFtZSgmaWdub3JlX21pbl9zdGF0LCAmdGFyZ2V0X25hbWUpOworCisJcmV0dXJuIChtYWpfc3RhdCA9PSBHU1NfU19DT01QTEVURSk7Cit9CisKK2ludCBnc3NkX2NoZWNrX21lY2hzKHZvaWQpCit7CisJdV9pbnQzMl90IG1hal9zdGF0LCBtaW5fc3RhdDsKKwlnc3NfT0lEX3NldCBzdXBwb3J0ZWRfbWVjaHMgPSBHU1NfQ19OT19PSURfU0VUOworCWludCByZXR2YWwgPSAtMTsKKworCW1hal9zdGF0ID0gZ3NzX2luZGljYXRlX21lY2hzKCZtaW5fc3RhdCwgJnN1cHBvcnRlZF9tZWNocyk7CisJaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFKSB7CisJCXByaW50ZXJyKDAsICJVbmFibGUgdG8gb2J0YWluIGxpc3Qgb2Ygc3VwcG9ydGVkIG1lY2hhbmlzbXMuICIKKwkJCSAiQ2hlY2sgdGhhdCBnc3MgbGlicmFyeSBpcyBwcm9wZXJseSBjb25maWd1cmVkLlxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoc3VwcG9ydGVkX21lY2hzID09IEdTU19DX05PX09JRF9TRVQgfHwKKwkgICAgc3VwcG9ydGVkX21lY2hzLT5jb3VudCA9PSAwKSB7CisJCXByaW50ZXJyKDAsICJVbmFibGUgdG8gb2J0YWluIGxpc3Qgb2Ygc3VwcG9ydGVkIG1lY2hhbmlzbXMuICIKKwkJCSAiQ2hlY2sgdGhhdCBnc3MgbGlicmFyeSBpcyBwcm9wZXJseSBjb25maWd1cmVkLlxuIik7CisJCWdvdG8gb3V0OworCX0KKwltYWpfc3RhdCA9IGdzc19yZWxlYXNlX29pZF9zZXQoJm1pbl9zdGF0LCAmc3VwcG9ydGVkX21lY2hzKTsKKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc191dGlsLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZThjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NfdXRpbC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgIENvcHlyaWdodCAoYykgMjAwNCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisjaWZuZGVmIF9HU1NfVVRJTF9IXworI2RlZmluZSBfR1NTX1VUSUxfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlICJ3cml0ZV9ieXRlcy5oIgorCitleHRlcm4gZ3NzX2NyZWRfaWRfdAlnc3NkX2NyZWRzOworCitpbnQgZ3NzZF9hY3F1aXJlX2NyZWQoY2hhciAqc2VydmVyX25hbWUpOwordm9pZCBwZ3NzZXJyKGNoYXIgKm1zZywgdV9pbnQzMl90IG1hal9zdGF0LCB1X2ludDMyX3QgbWluX3N0YXQsCisJY29uc3QgZ3NzX09JRCBtZWNoKTsKK2ludCBnc3NkX2NoZWNrX21lY2hzKHZvaWQpOworCisjZW5kaWYgLyogX0dTU19VVElMX0hfICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NkLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzN2E1ZgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc2QuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAgZ3NzZC5jCisKKyAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIENvcHlyaWdodCAoYykgMjAwMCBEdWcgU29uZyA8ZHVnc29uZ0BVTUlDSC5FRFU+LgorICBDb3B5cmlnaHQgKGMpIDIwMDIgQW5keSBBZGFtc29uIDxhbmRyb3NAVU1JQ0guRURVPi4KKyAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQFVNSUNILkVEVT4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQsIGFsbCB3cm9uZ3MgcmV2ZXJzZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImdzc2QuaCIKKyNpbmNsdWRlICJlcnJfdXRpbC5oIgorI2luY2x1ZGUgImdzc191dGlsLmgiCisjaW5jbHVkZSAia3JiNV91dGlsLmgiCisKK2NoYXIgcGlwZWZzX2RpcltQQVRIX01BWF0gPSBHU1NEX1BJUEVGU19ESVI7CitjaGFyIGtleXRhYmZpbGVbUEFUSF9NQVhdID0gR1NTRF9ERUZBVUxUX0tFWVRBQl9GSUxFOworY2hhciBjY2FjaGVkaXJbUEFUSF9NQVhdID0gR1NTRF9ERUZBVUxUX0NSRURfRElSOworY2hhciAqY2NhY2hlc2VhcmNoW0dTU0RfTUFYX0NDQUNIRV9TRUFSQ0ggKyAxXTsKK2ludCAgdXNlX21lbWNhY2hlID0gMDsKK2ludCAgcm9vdF91c2VzX21hY2hpbmVfY3JlZHMgPSAxOwordW5zaWduZWQgaW50ICBjb250ZXh0X3RpbWVvdXQgPSAwOworY2hhciAqcHJlZmVycmVkX3JlYWxtID0gTlVMTDsKKwordm9pZAorc2lnX2RpZShpbnQgc2lnbmFsKQoreworCS8qIGRlc3Ryb3kga3JiNSBtYWNoaW5lIGNyZWRzICovCisJaWYgKHJvb3RfdXNlc19tYWNoaW5lX2NyZWRzKQorCQlnc3NkX2Rlc3Ryb3lfa3JiNV9tYWNoaW5lX2NyZWRzKCk7CisJcHJpbnRlcnIoMSwgImV4aXRpbmcgb24gc2lnbmFsICVkXG4iLCBzaWduYWwpOworCWV4aXQoMSk7Cit9CisKK3ZvaWQKK3NpZ19odXAoaW50IHNpZ25hbCkKK3sKKwkvKiBkb24ndCBleGl0IG9uIFNJR0hVUCAqLworCXByaW50ZXJyKDEsICJSZWNlaXZlZCBTSUdIVVAuLi4gSWdub3JpbmcuXG4iKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShjaGFyICpwcm9nbmFtZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWZdIFstTV0gWy1uXSBbLXZdIFstcl0gWy1wIHBpcGVmc2Rpcl0gWy1rIGtleXRhYl0gWy1kIGNjYWNoZWRpcl0gWy10IHRpbWVvdXRdIFstUiBwcmVmZXJyZWQgcmVhbG1dXG4iLAorCQlwcm9nbmFtZSk7CisJZXhpdCgxKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGZnID0gMDsKKwlpbnQgdmVyYm9zaXR5ID0gMDsKKwlpbnQgcnBjX3ZlcmJvc2l0eSA9IDA7CisJaW50IG9wdDsKKwlpbnQgaTsKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWNoYXIgKnByb2duYW1lOworCisJbWVtc2V0KGNjYWNoZXNlYXJjaCwgMCwgc2l6ZW9mKGNjYWNoZXNlYXJjaCkpOworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJmdnJtbk1wOms6ZDp0OlI6IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCQljYXNlICdmJzoKKwkJCQlmZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQkvKiBBY2NlcHQgYnV0IGlnbm9yZSB0aGlzLiBOb3cgdGhlIGRlZmF1bHQuICovCisJCQkJYnJlYWs7CisJCQljYXNlICdNJzoKKwkJCQl1c2VfbWVtY2FjaGUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJcm9vdF91c2VzX21hY2hpbmVfY3JlZHMgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAndic6CisJCQkJdmVyYm9zaXR5Kys7CisJCQkJYnJlYWs7CisJCQljYXNlICdyJzoKKwkJCQlycGNfdmVyYm9zaXR5Kys7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlzdHJuY3B5KHBpcGVmc19kaXIsIG9wdGFyZywgc2l6ZW9mKHBpcGVmc19kaXIpKTsKKwkJCQlpZiAocGlwZWZzX2RpcltzaXplb2YocGlwZWZzX2RpciktMV0gIT0gJ1wwJykKKwkJCQkJZXJyeCgxLCAicGlwZWZzIHBhdGggbmFtZSB0b28gbG9uZyIpOworCQkJCWJyZWFrOworCQkJY2FzZSAnayc6CisJCQkJc3RybmNweShrZXl0YWJmaWxlLCBvcHRhcmcsIHNpemVvZihrZXl0YWJmaWxlKSk7CisJCQkJaWYgKGtleXRhYmZpbGVbc2l6ZW9mKGtleXRhYmZpbGUpLTFdICE9ICdcMCcpCisJCQkJCWVycngoMSwgImtleXRhYiBwYXRoIG5hbWUgdG9vIGxvbmciKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnOgorCQkJCXN0cm5jcHkoY2NhY2hlZGlyLCBvcHRhcmcsIHNpemVvZihjY2FjaGVkaXIpKTsKKwkJCQlpZiAoY2NhY2hlZGlyW3NpemVvZihjY2FjaGVkaXIpLTFdICE9ICdcMCcpCisJCQkJCWVycngoMSwgImNjYWNoZWRpciBwYXRoIG5hbWUgdG9vIGxvbmciKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWNvbnRleHRfdGltZW91dCA9IGF0b2kob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1InOgorCQkJCXByZWZlcnJlZF9yZWFsbSA9IHN0cmR1cChvcHRhcmcpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWkgPSAwOworCWNjYWNoZXNlYXJjaFtpKytdID0gc3RydG9rKGNjYWNoZWRpciwgIjoiKTsKKwlkbyB7CisJCWNjYWNoZXNlYXJjaFtpKytdID0gc3RydG9rKE5VTEwsICI6Iik7CisJfSB3aGlsZSAoY2NhY2hlc2VhcmNoW2ktMV0gIT0gTlVMTCAmJiBpIDwgR1NTRF9NQVhfQ0NBQ0hFX1NFQVJDSCk7CisKKwlpZiAocHJlZmVycmVkX3JlYWxtID09IE5VTEwpCisJCWdzc2RfazVfZ2V0X2RlZmF1bHRfcmVhbG0oJnByZWZlcnJlZF9yZWFsbSk7CisKKwlpZiAoKHByb2duYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpKSkKKwkJcHJvZ25hbWUrKzsKKwllbHNlCisJCXByb2duYW1lID0gYXJndlswXTsKKworCWluaXRlcnIocHJvZ25hbWUsIHZlcmJvc2l0eSwgZmcpOworI2lmZGVmIEhBVkVfQVVUSEdTU19TRVRfREVCVUdfTEVWRUwKKwlpZiAodmVyYm9zaXR5ICYmIHJwY192ZXJib3NpdHkgPT0gMCkKKwkJcnBjX3ZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKKwlhdXRoZ3NzX3NldF9kZWJ1Z19sZXZlbChycGNfdmVyYm9zaXR5KTsKKyNlbHNlCisgICAgICAgIGlmIChycGNfdmVyYm9zaXR5ID4gMCkKKwkJcHJpbnRlcnIoMCwgIldhcm5pbmc6IHJwY3NlY19nc3MgbGlicmFyeSBkb2VzIG5vdCAiCisJCQkgICAgInN1cHBvcnQgc2V0dGluZyBkZWJ1ZyBsZXZlbFxuIik7CisjZW5kaWYKKworCWlmIChnc3NkX2NoZWNrX21lY2hzKCkgIT0gMCkKKwkJZXJyeCgxLCAiUHJvYmxlbSB3aXRoIGdzc2FwaSBsaWJyYXJ5Iik7CisKKwlpZiAoIWZnICYmIGRhZW1vbigwLCAwKSA8IDApCisJCWVycngoMSwgImZvcmsiKTsKKworCXNpZ25hbChTSUdJTlQsIHNpZ19kaWUpOworCXNpZ25hbChTSUdURVJNLCBzaWdfZGllKTsKKwlzaWduYWwoU0lHSFVQLCBzaWdfaHVwKTsKKworCWdzc2RfcnVuKCk7CisJcHJpbnRlcnIoMCwgImdzc2RfcnVuIHJldHVybmVkIVxuIik7CisJYWJvcnQoKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc2QuaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVjMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzZC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmbmRlZiBfUlBDX0dTU0RfSF8KKyNkZWZpbmUgX1JQQ19HU1NEX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisKKyNkZWZpbmUgTUFYX0ZJTEVfTkFNRUxFTgkzMgorI2RlZmluZSBGRF9BTExPQ19CTE9DSwkJMjU2CisjaWZuZGVmIEdTU0RfUElQRUZTX0RJUgorI2RlZmluZSBHU1NEX1BJUEVGU19ESVIJCSIvdmFyL2xpYi9uZnMvcnBjX3BpcGVmcyIKKyNlbmRpZgorI2RlZmluZSBJTkZPCQkJImluZm8iCisjZGVmaW5lIEtSQjUJCQkia3JiNSIKKyNkZWZpbmUgRE5PVElGWV9TSUdOQUwJCShTSUdSVE1JTiArIDMpCisKKyNkZWZpbmUgR1NTRF9ERUZBVUxUX0NSRURfRElSCQkJIi90bXAiCisjZGVmaW5lIEdTU0RfREVGQVVMVF9DUkVEX1BSRUZJWAkJImtyYjVjY18iCisjZGVmaW5lIEdTU0RfREVGQVVMVF9NQUNISU5FX0NSRURfU1VGRklYCSJtYWNoaW5lIgorI2RlZmluZSBHU1NEX0RFRkFVTFRfS0VZVEFCX0ZJTEUJCSIvZXRjL2tyYjUua2V5dGFiIgorI2RlZmluZSBHU1NEX1NFUlZJQ0VfTkFNRQkJCSJuZnMiCisjZGVmaW5lIEdTU0RfU0VSVklDRV9OQU1FX0xFTgkJCTMKKyNkZWZpbmUgR1NTRF9NQVhfQ0NBQ0hFX1NFQVJDSAkJCTE2CisKKy8qCisgKiBUaGUgZ3NzIG1lY2hhbmlzbXMgdGhhdCB3ZSBjYW4gaGFuZGxlCisgKi8KK2VudW0ge0FVVEhUWVBFX0tSQjUsIEFVVEhUWVBFX1NQS00zLCBBVVRIVFlQRV9MSVBLRVl9OworCisKKworZXh0ZXJuIGNoYXIJCQlwaXBlZnNfZGlyW1BBVEhfTUFYXTsKK2V4dGVybiBjaGFyCQkJa2V5dGFiZmlsZVtQQVRIX01BWF07CitleHRlcm4gY2hhcgkJCSpjY2FjaGVzZWFyY2hbXTsKK2V4dGVybiBpbnQJCQl1c2VfbWVtY2FjaGU7CitleHRlcm4gaW50CQkJcm9vdF91c2VzX21hY2hpbmVfY3JlZHM7CitleHRlcm4gdW5zaWduZWQgaW50IAkJY29udGV4dF90aW1lb3V0OworZXh0ZXJuIGNoYXIJCQkqcHJlZmVycmVkX3JlYWxtOworCitUQUlMUV9IRUFEKGNsbnRfbGlzdF9oZWFkLCBjbG50X2luZm8pIGNsbnRfbGlzdDsKKworc3RydWN0IGNsbnRfaW5mbyB7CisJVEFJTFFfRU5UUlkoY2xudF9pbmZvKQlsaXN0OworCWNoYXIJCQkqZGlybmFtZTsKKwlpbnQJCQlkaXJfZmQ7CisJY2hhcgkJCSpzZXJ2aWNlbmFtZTsKKwljaGFyCQkJKnNlcnZlcm5hbWU7CisJaW50CQkJcHJvZzsKKwlpbnQJCQl2ZXJzOworCWNoYXIJCQkqcHJvdG9jb2w7CisJaW50CQkJa3JiNV9mZDsKKwlpbnQJCQlrcmI1X3BvbGxfaW5kZXg7CisJaW50CQkJc3BrbTNfZmQ7CisJaW50CQkJc3BrbTNfcG9sbF9pbmRleDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBnc3NkX2ZkOworCWludCAgICAgICAgICAgICAgICAgICAgIGdzc2RfcG9sbF9pbmRleDsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworfTsKKworVEFJTFFfSEVBRCh0b3BkaXJzX2xpc3RfaGVhZCwgdG9wZGlyc19pbmZvKSB0b3BkaXJzX2xpc3Q7CisKK3N0cnVjdCB0b3BkaXJzX2luZm8geworCVRBSUxRX0VOVFJZKHRvcGRpcnNfaW5mbykgICBsaXN0OworCWNoYXIJCQkqZGlybmFtZTsKKwlpbnQJCQlmZDsKK307CisKK3ZvaWQgaW5pdF9jbGllbnRfbGlzdCh2b2lkKTsKK2ludCB1cGRhdGVfY2xpZW50X2xpc3Qodm9pZCk7Cit2b2lkIGhhbmRsZV9rcmI1X3VwY2FsbChzdHJ1Y3QgY2xudF9pbmZvICpjbHApOwordm9pZCBoYW5kbGVfc3BrbTNfdXBjYWxsKHN0cnVjdCBjbG50X2luZm8gKmNscCk7Cit2b2lkIGhhbmRsZV9nc3NkX3VwY2FsbChzdHJ1Y3QgY2xudF9pbmZvICpjbHApOworaW50IGdzc2RfYWNxdWlyZV9jcmVkKGNoYXIgKnNlcnZlcl9uYW1lKTsKK3ZvaWQgZ3NzZF9ydW4odm9pZCk7CisKKworI2VuZGlmIC8qIF9SUENfR1NTRF9IXyAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzZC5tYW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NkLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTIzY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzZC5tYW4KQEAgLTAsMCArMSwxMTQgQEAKKy5cIgorLlwiIHJwYy5nc3NkKDgpCisuXCIKKy5cIiBDb3B5cmlnaHQgKEMpIDIwMDMgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHVtaWNoLmVkdT4KKy5USCBycGMuZ3NzZCA4ICIxNCBNYXIgMjAwNyIKKy5TSCBOQU1FCitycGMuZ3NzZCBcLSBycGNzZWNfZ3NzIGRhZW1vbgorLlNIIFNZTk9QU0lTCisuQiAicnBjLmdzc2QgWy1mXSBbLW5dIFstayBrZXl0YWJdIFstcCBwaXBlZnNkaXJdIFstdl0gWy1yXSBbLWQgY2NhY2hlZGlyXSIKKy5TSCBERVNDUklQVElPTgorVGhlIHJwY3NlY19nc3MgcHJvdG9jb2wgZ2l2ZXMgYSBtZWFucyBvZiB1c2luZyB0aGUgZ3NzLWFwaSBnZW5lcmljIHNlY3VyaXR5CithcGkgdG8gcHJvdmlkZSBzZWN1cml0eSBmb3IgcHJvdG9jb2xzIHVzaW5nIHJwYyAoaW4gcGFydGljdWxhciwgbmZzKS4gIEJlZm9yZQorZXhjaGFuZ2luZyBhbnkgcnBjIHJlcXVlc3RzIHVzaW5nIHJwY3NlY19nc3MsIHRoZSBycGMgY2xpZW50IG11c3QgZmlyc3QKK2VzdGFibGlzaCBhIHNlY3VyaXR5IGNvbnRleHQuICBUaGUgbGludXgga2VybmVsJ3MgaW1wbGVtZW50YXRpb24gb2YgcnBjc2VjX2dzcworZGVwZW5kcyBvbiB0aGUgdXNlcnNwYWNlIGRhZW1vbgorLkIgcnBjLmdzc2QKK3RvIGVzdGFibGlzaCBzZWN1cml0eSBjb250ZXh0cy4gIFRoZQorLkIgcnBjLmdzc2QKK2RhZW1vbiB1c2VzIGZpbGVzIGluIHRoZSBycGNfcGlwZWZzIGZpbGVzeXN0ZW0gdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUga2VybmVsLgorCisuU0ggT1BUSU9OUworLlRQCisuQiAtZgorUnVucworLkIgcnBjLmdzc2QKK2luIHRoZSBmb3JlZ3JvdW5kIGFuZCBzZW5kcyBvdXRwdXQgdG8gc3RkZXJyIChhcyBvcHBvc2VkIHRvIHN5c2xvZ2QpCisuVFAKKy5CIC1uCitCeSBkZWZhdWx0LAorLkIgcnBjLmdzc2QKK3RyZWF0cyBhY2Nlc3NlcyBieSB0aGUgdXNlciB3aXRoIFVJRCAwIHNwZWNpYWxseSwgYW5kIHVzZXMKKyJtYWNoaW5lIGNyZWRlbnRpYWxzIiBmb3IgYWxsIGFjY2Vzc2VzIGJ5IHRoYXQgdXNlciB3aGljaAorcmVxdWlyZSBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbi4KK1dpdGggdGhlIFwtbiBvcHRpb24sICJtYWNoaW5lIGNyZWRlbnRpYWxzIiB3aWxsIG5vdCBiZSB1c2VkCitmb3IgYWNjZXNzZXMgYnkgVUlEIDAuICBJbnN0ZWFkLCBjcmVkZW50aWFscyBtdXN0IGJlIG9idGFpbmVkCittYW51YWxseSBsaWtlIGFsbCBvdGhlciB1c2Vycy4gIFVzZSBvZiB0aGlzIG9wdGlvbiBtZWFucyB0aGF0Cisicm9vdCIgbXVzdCBtYW51YWxseSBvYnRhaW4gS2VyYmVyb3MgY3JlZGVudGlhbHMgYmVmb3JlCithdHRlbXB0aW5nIHRvIG1vdW50IGFuIG5mcyBmaWxlc3lzdGVtIHJlcXVpcmluZyBLZXJiZXJvcworYXV0aGVudGljYXRpb24uCisuVFAKKy5CIC1rIGtleXRhYgorVGVsbHMKKy5CIHJwYy5nc3NkCit0byB1c2UgdGhlIGtleXMgZm91bmQgaW4KKy5JIGtleXRhYgordG8gb2J0YWluICJtYWNoaW5lIGNyZWRlbnRpYWxzIi4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzICIvZXRjL2tyYjUua2V5dGFiIi4KKy5JUAorUHJldmlvdXMgdmVyc2lvbnMgb2YKKy5CIHJwYy5nc3NkCit1c2VkIG9ubHkgIm5mcy8qIiBrZXlzIGZvdW5kIHdpdGhpbiB0aGUga2V5dGFiLgorVG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgaW1wbGVtZW50YXRpb25zLCB3ZSBub3cgbG9vayBmb3IKK3NwZWNpZmljIGtleXRhYiBlbnRyaWVzLiAgVGhlIHNlYXJjaCBvcmRlciBmb3Iga2V5dGFicyB0byBiZSB1c2VkCitmb3IgIm1hY2hpbmUgY3JlZGVudGlhbHMiIGlzIG5vdzoKKy5icgorICByb290Lzxob3N0bmFtZT5APFJFQUxNPgorLmJyCisgIG5mcy88aG9zdG5hbWU+QDxSRUFMTT4KKy5icgorICBob3N0Lzxob3N0bmFtZT5APFJFQUxNPgorLmJyCisgIHJvb3QvPGFueW5hbWU+QDxSRUFMTT4KKy5icgorICBuZnMvPGFueW5hbWU+QDxSRUFMTT4KKy5icgorICBob3N0LzxhbnluYW1lPkA8UkVBTE0+CisuVFAKKy5CIC1wIHBhdGgKK1RlbGxzCisuQiBycGMuZ3NzZAord2hlcmUgdG8gbG9vayBmb3IgdGhlIHJwY19waXBlZnMgZmlsZXN5c3RlbS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCisiL3Zhci9saWIvbmZzL3JwY19waXBlZnMiLgorLlRQCisuQiAtZCBkaXJlY3RvcnkKK1RlbGxzCisuQiBycGMuZ3NzZAord2hlcmUgdG8gbG9vayBmb3IgS2VyYmVyb3MgY3JlZGVudGlhbCBmaWxlcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIvdG1wIi4KK1RoaXMgY2FuIGFsc28gYmUgYSBjb2xvbiBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZAorZm9yIEtlcmJlcm9zIGNyZWRlbnRpYWwgZmlsZXMuICBOb3RlIHRoYXQgaWYgbWFjaGluZSBjcmVkZW50aWFscyBhcmUgYmVpbmcKK3N0b3JlZCBpbiBmaWxlcywgdGhlbiB0aGUgZmlyc3QgZGlyZWN0b3J5IG9uIHRoaXMgbGlzdCBpcyB3aGVyZSB0aGUKK21hY2hpbmUgY3JlZGVudGlhbHMgYXJlIHN0b3JlZC4KKy5UUAorLkIgLXYKK0luY3JlYXNlcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQgKGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMpLgorLlRQCisuQiAtcgorSWYgdGhlIHJwY3NlY19nc3MgbGlicmFyeSBzdXBwb3J0cyBzZXR0aW5nIGRlYnVnIGxldmVsLAoraW5jcmVhc2VzIHRoZSB2ZXJib3NpdHkgb2YgdGhlIG91dHB1dCAoY2FuIGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcykuCisuVFAKKy5CIC1SIHJlYWxtCitLZXJiZXJvcyB0aWNrZXRzIGZyb20gdGhpcworLkkgcmVhbG0KK3dpbGwgYmUgcHJlZmVycmVkIHdoZW4gc2Nhbm5pbmcgYXZhaWxhYmxlIGNyZWRlbnRpYWxzIGNhY2hlIGZpbGVzIHRvIGJlCit1c2VkIHRvIGNyZWF0ZSBhIGNvbnRleHQuICBCeSBkZWZhdWx0LCB0aGUgZGVmYXVsdCByZWFsbSwgYXMgY29uZmlndXJlZAoraW4gdGhlIEtlcmJlcm9zIGNvbmZpZ3VyYXRpb24gZmlsZSwgaXMgcHJlZmVycmVkLgorLlRQCisuQiAtdCB0aW1lb3V0CitUaW1lb3V0LCBpbiBzZWNvbmRzLCBmb3Iga2VybmVsIGdzcyBjb250ZXh0cy4gVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBmb3JjZSAKK25ldyBrZXJuZWwgY29udGV4dHMgdG8gYmUgbmVnb3RpYXRlZCBhZnRlcgorLkkgdGltZW91dAorc2Vjb25kcywgd2hpY2ggYWxsb3dzIGNoYW5naW5nIEtlcmJlcm9zIHRpY2tldHMgYW5kIGlkZW50aXRpZXMgZnJlcXVlbnRseS4KK1RoZSBkZWZhdWx0IGlzIG5vIGV4cGxpY2l0IHRpbWVvdXQsIHdoaWNoIG1lYW5zIHRoZSBrZXJuZWwgY29udGV4dCB3aWxsIGxpdmUKK3RoZSBsaWZldGltZSBvZiB0aGUgS2VyYmVyb3Mgc2VydmljZSB0aWNrZXQgdXNlZCBpbiBpdHMgY3JlYXRpb24uCisuU0ggU0VFIEFMU08KKy5CUiBycGMuc3ZjZ3NzZCg4KQorLlNIIEFVVEhPUlMKKy5icgorRHVnIFNvbmcgPGR1Z3NvbmdAdW1pY2guZWR1PgorLmJyCitBbmR5IEFkYW1zb24gPGFuZHJvc0B1bWljaC5lZHU+CisuYnIKK01hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQHVtaWNoLmVkdT4KKy5icgorSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHVtaWNoLmVkdT4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2dzc2RfbWFpbl9sb29wLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NkX21haW5fbG9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTY4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NkX21haW5fbG9vcC5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgkvKiBIQVZFX0NPTkZJR19IICovCisKKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpbmNsdWRlICJnc3NkLmgiCisjaW5jbHVkZSAiZXJyX3V0aWwuaCIKKworZXh0ZXJuIHN0cnVjdCBwb2xsZmQgKnBvbGxhcnJheTsKK2V4dGVybiBpbnQgcG9sbHNpemU7CisKKyNkZWZpbmUgUE9MTF9NSUxMSVNFQ1MJNTAwCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZGlyX2NoYW5nZWQgPSAxOworCitzdGF0aWMgdm9pZCBkaXJfbm90aWZ5X2hhbmRsZXIoaW50IHNpZywgc2lnaW5mb190ICpzaSwgdm9pZCAqZGF0YSkKK3sKKwlkaXJfY2hhbmdlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkCitzY2FuX3BvbGxfcmVzdWx0cyhpbnQgcmV0KQoreworCWludAkJCWk7CisJc3RydWN0IGNsbnRfaW5mbwkqY2xwOworCisJZm9yIChjbHAgPSBjbG50X2xpc3QudHFoX2ZpcnN0OyBjbHAgIT0gTlVMTDsgY2xwID0gY2xwLT5saXN0LnRxZV9uZXh0KQorCXsKKwkJaSA9IGNscC0+Z3NzZF9wb2xsX2luZGV4OworCQlpZiAoaSA+PSAwICYmIHBvbGxhcnJheVtpXS5yZXZlbnRzKSB7CisJCQlpZiAocG9sbGFycmF5W2ldLnJldmVudHMgJiBQT0xMSFVQKQorCQkJCWRpcl9jaGFuZ2VkID0gMTsKKwkJCWlmIChwb2xsYXJyYXlbaV0ucmV2ZW50cyAmIFBPTExJTikKKwkJCQloYW5kbGVfZ3NzZF91cGNhbGwoY2xwKTsKKwkJCXBvbGxhcnJheVtjbHAtPmdzc2RfcG9sbF9pbmRleF0ucmV2ZW50cyA9IDA7CisJCQlyZXQtLTsKKwkJCWlmICghcmV0KQorCQkJCWJyZWFrOworCQl9CisJCWkgPSBjbHAtPmtyYjVfcG9sbF9pbmRleDsKKwkJaWYgKGkgPj0gMCAmJiBwb2xsYXJyYXlbaV0ucmV2ZW50cykgeworCQkJaWYgKHBvbGxhcnJheVtpXS5yZXZlbnRzICYgUE9MTEhVUCkKKwkJCQlkaXJfY2hhbmdlZCA9IDE7CisJCQlpZiAocG9sbGFycmF5W2ldLnJldmVudHMgJiBQT0xMSU4pCisJCQkJaGFuZGxlX2tyYjVfdXBjYWxsKGNscCk7CisJCQlwb2xsYXJyYXlbY2xwLT5rcmI1X3BvbGxfaW5kZXhdLnJldmVudHMgPSAwOworCQkJcmV0LS07CisJCQlpZiAoIXJldCkKKwkJCQlicmVhazsKKwkJfQorCQlpID0gY2xwLT5zcGttM19wb2xsX2luZGV4OworCQlpZiAoaSA+PSAwICYmIHBvbGxhcnJheVtpXS5yZXZlbnRzKSB7CisJCQlpZiAocG9sbGFycmF5W2ldLnJldmVudHMgJiBQT0xMSFVQKQorCQkJCWRpcl9jaGFuZ2VkID0gMTsKKwkJCWlmIChwb2xsYXJyYXlbaV0ucmV2ZW50cyAmIFBPTExJTikKKwkJCQloYW5kbGVfc3BrbTNfdXBjYWxsKGNscCk7CisJCQlwb2xsYXJyYXlbY2xwLT5zcGttM19wb2xsX2luZGV4XS5yZXZlbnRzID0gMDsKKwkJCXJldC0tOworCQkJaWYgKCFyZXQpCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9OworCitzdGF0aWMgaW50Cit0b3BkaXJzX2FkZF9lbnRyeShzdHJ1Y3QgZGlyZW50ICpkZW50KQoreworCXN0cnVjdCB0b3BkaXJzX2luZm8gKnRkaTsKKworCXRkaSA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IHRvcGRpcnNfaW5mbyksIDEpOworCWlmICh0ZGkgPT0gTlVMTCkgeworCQlwcmludGVycigwLCAiRVJST1I6IENvdWxkbid0IGFsbG9jYXRlIHN0cnVjdCB0b3BkaXJzX2luZm9cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXRkaS0+ZGlybmFtZSA9IG1hbGxvYyhQQVRIX01BWCk7CisJaWYgKHRkaS0+ZGlybmFtZSA9PSBOVUxMKSB7CisJCXByaW50ZXJyKDAsICJFUlJPUjogQ291bGRuJ3QgYWxsb2NhdGUgZGlyZWN0b3J5IG5hbWVcbiIpOworCQlmcmVlKHRkaSk7CisJCXJldHVybiAtMTsKKwl9CisJc25wcmludGYodGRpLT5kaXJuYW1lLCBQQVRIX01BWCwgIiVzLyVzIiwgcGlwZWZzX2RpciwgZGVudC0+ZF9uYW1lKTsKKwl0ZGktPmZkID0gb3Blbih0ZGktPmRpcm5hbWUsIE9fUkRPTkxZKTsKKwlpZiAodGRpLT5mZCAhPSAtMSkgeworCQlmY250bCh0ZGktPmZkLCBGX1NFVFNJRywgRE5PVElGWV9TSUdOQUwpOworCQlmY250bCh0ZGktPmZkLCBGX05PVElGWSwKKwkJICAgICAgRE5fQ1JFQVRFfEROX0RFTEVURXxETl9NT0RJRll8RE5fTVVMVElTSE9UKTsKKwl9CisKKwlUQUlMUV9JTlNFUlRfSEVBRCgmdG9wZGlyc19saXN0LCB0ZGksIGxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordG9wZGlyc19mcmVlX2xpc3Qodm9pZCkKK3sKKwlzdHJ1Y3QgdG9wZGlyc19pbmZvICp0ZGk7CisKKwlUQUlMUV9GT1JFQUNIKHRkaSwgJnRvcGRpcnNfbGlzdCwgbGlzdCkgeworCQlmcmVlKHRkaS0+ZGlybmFtZSk7CisJCWlmICh0ZGktPmZkICE9IC0xKQorCQkJY2xvc2UodGRpLT5mZCk7CisJCVRBSUxRX1JFTU9WRSgmdG9wZGlyc19saXN0LCB0ZGksIGxpc3QpOworCQlmcmVlKHRkaSk7CisJfQorfQorCitzdGF0aWMgaW50Cit0b3BkaXJzX2luaXRfbGlzdCh2b2lkKQoreworCURJUgkJKnBpcGVkaXI7CisJc3RydWN0IGRpcmVudAkqZGVudDsKKwlpbnQJCXJldDsKKworCVRBSUxRX0lOSVQoJnRvcGRpcnNfbGlzdCk7CisKKwlwaXBlZGlyID0gb3BlbmRpcihwaXBlZnNfZGlyKTsKKwlpZiAocGlwZWRpciA9PSBOVUxMKSB7CisJCXByaW50ZXJyKDAsICJFUlJPUjogY291bGQgbm90IG9wZW4gcnBjX3BpcGVmcyBkaXJlY3RvcnkgJyVzJzogIgorCQkJICIlc1xuIiwgcGlwZWZzX2Rpciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGRlbnQgPSByZWFkZGlyKHBpcGVkaXIpOyBkZW50ICE9IE5VTEw7IGRlbnQgPSByZWFkZGlyKHBpcGVkaXIpKSB7CisJCWlmIChkZW50LT5kX3R5cGUgIT0gRFRfRElSIHx8CisJCSAgICBzdHJjbXAoZGVudC0+ZF9uYW1lLCAiLiIpID09IDAgIHx8CisJCSAgICBzdHJjbXAoZGVudC0+ZF9uYW1lLCAiLi4iKSA9PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXQgPSB0b3BkaXJzX2FkZF9lbnRyeShkZW50KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisJY2xvc2VkaXIocGlwZWRpcik7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXRvcGRpcnNfZnJlZV9saXN0KCk7CisJcmV0dXJuIC0xOworfQorCit2b2lkCitnc3NkX3J1bigpCit7CisJaW50CQkJcmV0OworCXN0cnVjdCBzaWdhY3Rpb24JZG5fYWN0OworCXNpZ3NldF90CQlzZXQ7CisKKwkvKiBUYWtlbiBmcm9tIGxpbnV4L0RvY3VtZW50YXRpb24vZG5vdGlmeS50eHQ6ICovCisJZG5fYWN0LnNhX3NpZ2FjdGlvbiA9IGRpcl9ub3RpZnlfaGFuZGxlcjsKKwlzaWdlbXB0eXNldCgmZG5fYWN0LnNhX21hc2spOworCWRuX2FjdC5zYV9mbGFncyA9IFNBX1NJR0lORk87CisJc2lnYWN0aW9uKEROT1RJRllfU0lHTkFMLCAmZG5fYWN0LCBOVUxMKTsKKworCS8qIGp1c3QgaW4gY2FzZSB0aGUgc2lnbmFsIGlzIGJsb2NrZWQuLi4gKi8KKwlzaWdlbXB0eXNldCgmc2V0KTsKKwlzaWdhZGRzZXQoJnNldCwgRE5PVElGWV9TSUdOQUwpOworCXNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmc2V0LCBOVUxMKTsKKworCWlmICh0b3BkaXJzX2luaXRfbGlzdCgpICE9IDApCisJCXJldHVybjsKKworCWluaXRfY2xpZW50X2xpc3QoKTsKKworCXByaW50ZXJyKDEsICJiZWdpbm5pbmcgcG9sbFxuIik7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGRpcl9jaGFuZ2VkKSB7CisJCQlkaXJfY2hhbmdlZCA9IDA7CisJCQlpZiAodXBkYXRlX2NsaWVudF9saXN0KCkpIHsKKwkJCQkvKiBFcnJvciBtc2cgaXMgYWxyZWFkeSBwcmludGVkICovCisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCQkvKiByYWNlIGNvbmRpdGlvbiBoZXJlOiBkaXJfY2hhbmdlZCBjb3VsZCBiZSBzZXQgYmVmb3JlIHdlCisJCSAqIGVudGVyIHRoZSBwb2xsLCBhbmQgd2UnZCBuZXZlciBub3RpY2UgaWYgaXQgd2VyZW4ndCBmb3IgdGhlCisJCSAqIHRpbWVvdXQuICovCisJCXJldCA9IHBvbGwocG9sbGFycmF5LCBwb2xsc2l6ZSwgUE9MTF9NSUxMSVNFQ1MpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCXByaW50ZXJyKDAsCisJCQkJCSAiV0FSTklORzogZXJyb3IgcmV0dXJuIGZyb20gcG9sbFxuIik7CisJCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJCS8qIHRpbWVvdXQgKi8KKwkJfSBlbHNlIHsgLyogcmV0ID4gMCAqLworCQkJc2Nhbl9wb2xsX3Jlc3VsdHMocmV0KTsKKwkJfQorCX0KKwl0b3BkaXJzX2ZyZWVfbGlzdCgpOworCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzZF9wcm9jLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9nc3NkX3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTRmYjExCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2QvZ3NzZF9wcm9jLmMKQEAgLTAsMCArMSwxMjI5IEBACisvKgorICBnc3NkX3Byb2MuYworCisgIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIENvcHlyaWdodCAoYykgMjAwMCBEdWcgU29uZyA8ZHVnc29uZ0BVTUlDSC5FRFU+LgorICBDb3B5cmlnaHQgKGMpIDIwMDEgQW5keSBBZGFtc29uIDxhbmRyb3NAVU1JQ0guRURVPi4KKyAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQFVNSUNILkVEVT4uCisgIENvcHlyaWdodCAoYykgMjAwMiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAVU1JQ0guRURVPgorICBDb3B5cmlnaHQgKGMpIDIwMDQgS2V2aW4gQ29mZm1hbiA8a3djQHVtaWNoLmVkdT4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZCwgYWxsIHdyb25ncyByZXZlcnNlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYJLyogSEFWRV9DT05GSUdfSCAqLworCisjaWZuZGVmIF9HTlVfU09VUkNFCisjZGVmaW5lIF9HTlVfU09VUkNFCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvZnN1aWQuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgImdzc2QuaCIKKyNpbmNsdWRlICJlcnJfdXRpbC5oIgorI2luY2x1ZGUgImdzc191dGlsLmgiCisjaW5jbHVkZSAia3JiNV91dGlsLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgIm5mc3JwYy5oIgorI2luY2x1ZGUgIm5mc2xpYi5oIgorCisvKgorICogcG9sbGFycmF5OgorICogICAgICBhcnJheSBvZiBzdHJ1Y3QgcG9sbGZkIHN1aXRhYmxlIHRvIHBhc3MgdG8gcG9sbC4gaW5pdGlhbGl6ZWQgdG8KKyAqICAgICAgemVybyAtIGEgemVybyBzdHJ1Y3QgaXMgaWdub3JlZCBieSBwb2xsKCkgYmVjYXVzZSB0aGUgZXZlbnRzIG1hc2sgaXMgMC4KKyAqCisgKiBjbG50X2xpc3Q6CisgKiAgICAgIGxpbmtlZCBsaXN0IG9mIHN0cnVjdCBjbG50X2luZm8gd2hpY2ggYXNzb2NpYXRlcyBhIGNsbnRYWFggZGlyZWN0b3J5CisgKgl3aXRoIGFuIGluZGV4IGludG8gcG9sbGFycmF5W10sIGFuZCBvdGhlciBiYXNpYyBkYXRhIGFib3V0IHRoYXQgY2xpZW50LgorICoKKyAqIERpcmVjdG9yeSBzdHJ1Y3R1cmU6IGNyZWF0ZWQgYnkgdGhlIGtlcm5lbAorICogICAgICB7cnBjX3BpcGVmc30ve2Rpcn0vY2xudFhYICAgICAgICAgOiBvbmUgcGVyIHJwY19jbG50IHN0cnVjdCBpbiB0aGUga2VybmVsCisgKiAgICAgIHtycGNfcGlwZWZzfS97ZGlyfS9jbG50WFgva3JiNSAgICA6IHJlYWQgdWlkIGZvciB3aGljaCBrZXJuZWwgd2FudHMKKyAqCQkJCQkgICAgYSBjb250ZXh0LCB3cml0ZSB0aGUgcmVzdWx0aW5nIGNvbnRleHQKKyAqICAgICAge3JwY19waXBlZnN9L3tkaXJ9L2NsbnRYWC9pbmZvICAgIDogc3RvcmVzIGluZm8gc3VjaCBhcyBzZXJ2ZXIgbmFtZQorICogICAgICB7cnBjX3BpcGVmc30ve2Rpcn0vY2xudFhYL2dzc2QgICAgOiBwaXBlIGZvciBhbGwgZ3NzIG1lY2hhbmlzbXMgdXNpbmcKKyAqCQkJCQkgICAgYSB0ZXh0LWJhc2VkIHN0cmluZyBvZiBwYXJhbWV0ZXJzCisgKgorICogQWxnb3JpdGhtOgorICogICAgICBQb2xsIGFsbCB7cnBjX3BpcGVmc30ve2Rpcn0vY2xudFhYL1lZWVkgZmlsZXMuICBXaGVuIGRhdGEgaXMgcmVhZHksCisgKiAgICAgIHJlYWQgYW5kIHByb2Nlc3M7IHBlcmZvcm1zIHJwY3NlY19nc3MgY29udGV4dCBpbml0aWFsaXphdGlvbiBwcm90b2NvbCB0bworICogICAgICBnZXQgYSBjcmVkIGZvciB0aGF0IHVzZXIuICBXcml0ZXMgcmVzdWx0IHRvIGNvcnJlc3BvbmRpbmcga3JiNSBmaWxlCisgKiAgICAgIGluIGEgZm9ybSB0aGUga2VybmVsIGNvZGUgd2lsbCB1bmRlcnN0YW5kLgorICogICAgICBJbiBhZGRpdGlvbiwgd2UgbWFrZSBzdXJlIHdlIGFyZSBub3RpZmllZCB3aGVuZXZlciBhbnl0aGluZyBpcworICogICAgICBjcmVhdGVkIG9yIGRlc3Ryb3llZCBpbiB7cnBjX3BpcGVmc30gb3IgaW4gYW55IG9mIHRoZSBjbG50WFggZGlyZWN0b3JpZXMsCisgKiAgICAgIGFuZCByZXNjYW4gdGhlIHdob2xlIHtycGNfcGlwZWZzfSB3aGVuIHRoaXMgaGFwcGVucy4KKyAqLworCitzdHJ1Y3QgcG9sbGZkICogcG9sbGFycmF5OworCitpbnQgcG9sbHNpemU7ICAvKiB0aGUgc2l6ZSBvZiBwb2xsYXJheSAoaW4gcG9sbGZkJ3MpICovCisKKy8qCisgKiBjb252ZXJ0IGEgcHJlc2VudGF0aW9uIGFkZHJlc3Mgc3RyaW5nIHRvIGEgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3QuIFJldHVybnMKKyAqIHRydWUgb24gc3VjY2VzcyBvciBmYWxzZSBvbiBmYWlsdXJlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkbyBub3QgcG9wdWxhdGUgdGhlIHNpbjZfc2NvcGVfaWQgZmllbGQgaGVyZSBmb3IgSVB2NiBhZGRycy4KKyAqIGdzc2QgbmVjZWNlc3NhcmlseSByZWxpZXMgb24gaG9zdG5hbWUgcmVzb2x1dGlvbiBhbmQgRE5TIEFBQUEgcmVjb3JkcworICogZG8gbm90IGdlbmVyYWxseSBjb250YWluIHNjb3BlLWlkJ3MuIFRoaXMgbWVhbnMgdGhhdCBHU1NBUEkgYXV0aCByZWFsbHkKKyAqIGNhbid0IHdvcmsgd2l0aCBJUHY2IGxpbmstbG9jYWwgYWRkcmVzc2VzLgorICoKKyAqIFdlICpjb3VsZCogY29uc2lkZXIgY2hhbmdpbmcgdGhpcyBpZiB3ZSBkaWQgc29tZXRoaW5nIGxpa2UgYWRvcHQgdGhlCisgKiBNaWNyb3NvZnQgInN0YW5kYXJkIiBvZiB1c2luZyB0aGUgaXB2Ni1saXRlcmFsLm5ldCBkb21haW5uYW1lLCBidXQgaXQncworICogbm90IHJlYWxseSBmZWFzaWJsZSBhdCBwcmVzZW50LgorICovCitzdGF0aWMgaW50CithZGRyc3RyX3RvX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EsIGNvbnN0IGNoYXIgKm5vZGUsIGNvbnN0IGNoYXIgKnBvcnQpCit7CisJaW50IHJjOworCXN0cnVjdCBhZGRyaW5mbyAqcmVzOworCXN0cnVjdCBhZGRyaW5mbyBoaW50cyA9IHsgLmFpX2ZsYWdzID0gQUlfTlVNRVJJQ0hPU1QgfCBBSV9OVU1FUklDU0VSViB9OworCisjaWZuZGVmIElQVjZfU1VQUE9SVEVECisJaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyNlbmRpZiAvKiBJUFY2X1NVUFBPUlRFRCAqLworCisJcmMgPSBnZXRhZGRyaW5mbyhub2RlLCBwb3J0LCAmaGludHMsICZyZXMpOworCWlmIChyYykgeworCQlwcmludGVycigwLCAiRVJST1I6IHVuYWJsZSB0byBjb252ZXJ0ICVzfCVzIHRvIHNvY2thZGRyOiAlc1xuIiwKKwkJCSBub2RlLCBwb3J0LCByYyA9PSBFQUlfU1lTVEVNID8gc3RyZXJyb3IoZXJybm8pIDoKKwkJCQkJCWdhaV9zdHJlcnJvcihyYykpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBJUFY2X1NVUFBPUlRFRAorCS8qCisJICogZ2V0bmFtZWluZm8gaWdub3JlcyB0aGUgc2NvcGVpZC4gSWYgdGhlIGFkZHJlc3MgdHVybnMgb3V0IHRvIGhhdmUKKwkgKiBhIG5vbi16ZXJvIHNjb3BlaWQsIHdlIGNhbid0IHVzZSBpdCAtLSB0aGUgcmVzb2x2ZWQgaG9zdCBtaWdodCBiZQorCSAqIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbnRlbmRlZC4KKwkgKi8KKwlpZiAocmVzLT5haV9hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopcmVzLT5haV9hZGRyOworCQlpZiAoc2luNi0+c2luNl9zY29wZV9pZCkgeworCQkJcHJpbnRlcnIoMCwgIkVSUk9SOiBhZGRyZXNzICVzIGhhcyBub24temVybyAiCisJCQkJICAgICJzaW42X3Njb3BlX2lkIVxuIiwgbm9kZSk7CisJCQlmcmVlYWRkcmluZm8ocmVzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmIC8qIElQVjZfU1VQUE9SVEVEICovCisKKwltZW1jcHkoc2EsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKTsKKwlmcmVlYWRkcmluZm8ocmVzKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBzb2NrYWRkciB0byBhIGhvc3RuYW1lCisgKi8KK3N0YXRpYyBjaGFyICoKK3NvY2thZGRyX3RvX2hvc3RuYW1lKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EsIGNvbnN0IGNoYXIgKmFkZHIpCit7CisJc29ja2xlbl90CQlhZGRybGVuOworCWludAkJCWVycjsKKwljaGFyIAkJCSpob3N0bmFtZTsKKwljaGFyCQkJaGJ1ZltOSV9NQVhIT1NUXTsKKworCXN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQlicmVhazsKKyNpZmRlZiBJUFY2X1NVUFBPUlRFRAorCWNhc2UgQUZfSU5FVDY6CisJCWFkZHJsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCWJyZWFrOworI2VuZGlmIC8qIElQVjZfU1VQUE9SVEVEICovCisJZGVmYXVsdDoKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiB1bnJlY29nbml6ZWQgYWRkciBmYW1pbHkgJWRcbiIsCisJCQkgc2EtPnNhX2ZhbWlseSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWVyciA9IGdldG5hbWVpbmZvKHNhLCBhZGRybGVuLCBoYnVmLCBzaXplb2YoaGJ1ZiksIE5VTEwsIDAsCisJCQkgIE5JX05BTUVSRVFEKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ZXJyKDAsICJFUlJPUjogdW5hYmxlIHRvIHJlc29sdmUgJXMgdG8gaG9zdG5hbWU6ICVzXG4iLAorCQkJIGFkZHIsIGVyciA9PSBFQUlfU1lTVEVNID8gc3RyZXJyb3IoZXJyKSA6CisJCQkJCQkgICBnYWlfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWhvc3RuYW1lID0gc3RyZHVwKGhidWYpOworCisJcmV0dXJuIGhvc3RuYW1lOworfQorCisvKiBYWFggYnVmZmVyIHByb2JsZW1zOiAqLworc3RhdGljIGludAorcmVhZF9zZXJ2aWNlX2luZm8oY2hhciAqaW5mb19maWxlX25hbWUsIGNoYXIgKipzZXJ2aWNlbmFtZSwgY2hhciAqKnNlcnZlcm5hbWUsCisJCSAgaW50ICpwcm9nLCBpbnQgKnZlcnMsIGNoYXIgKipwcm90b2NvbCwKKwkJICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpIHsKKyNkZWZpbmUgSU5GT0JVRkxFTiAyNTYKKwljaGFyCQlidWZbSU5GT0JVRkxFTiArIDFdOworCXN0YXRpYyBjaGFyCWR1bW15WzEyOF07CisJaW50CQluYnl0ZXM7CisJc3RhdGljIGNoYXIJc2VydmljZVsxMjhdOworCXN0YXRpYyBjaGFyCWFkZHJlc3NbMTI4XTsKKwljaGFyCQlwcm9ncmFtWzE2XTsKKwljaGFyCQl2ZXJzaW9uWzE2XTsKKwljaGFyCQlwcm90b25hbWVbMTZdOworCWNoYXIJCXBvcnRbMTI4XTsKKwljaGFyCQkqcDsKKwlpbnQJCWZkID0gLTE7CisJaW50CQludW1maWVsZHM7CisKKwkqc2VydmljZW5hbWUgPSAqc2VydmVybmFtZSA9ICpwcm90b2NvbCA9IE5VTEw7CisKKwlpZiAoKGZkID0gb3BlbihpbmZvX2ZpbGVfbmFtZSwgT19SRE9OTFkpKSA9PSAtMSkgeworCQlwcmludGVycigwLCAiRVJST1I6IGNhbid0IG9wZW4gJXM6ICVzXG4iLCBpbmZvX2ZpbGVfbmFtZSwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGZhaWw7CisJfQorCWlmICgobmJ5dGVzID0gcmVhZChmZCwgYnVmLCBJTkZPQlVGTEVOKSkgPT0gLTEpCisJCWdvdG8gZmFpbDsKKwljbG9zZShmZCk7CisJYnVmW25ieXRlc10gPSAnXDAnOworCisJbnVtZmllbGRzID0gc3NjYW5mKGJ1ZiwiUlBDIHNlcnZlcjogJTEyN3NcbiIKKwkJICAgInNlcnZpY2U6ICUxMjdzICUxNXMgdmVyc2lvbiAlMTVzXG4iCisJCSAgICJhZGRyZXNzOiAlMTI3c1xuIgorCQkgICAicHJvdG9jb2w6ICUxNXNcbiIsCisJCSAgIGR1bW15LAorCQkgICBzZXJ2aWNlLCBwcm9ncmFtLCB2ZXJzaW9uLAorCQkgICBhZGRyZXNzLAorCQkgICBwcm90b25hbWUpOworCisJaWYgKG51bWZpZWxkcyA9PSA1KSB7CisJCXN0cmNweShwcm90b25hbWUsICJ0Y3AiKTsKKwl9IGVsc2UgaWYgKG51bWZpZWxkcyAhPSA2KSB7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlwb3J0WzBdID0gJ1wwJzsKKwlpZiAoKHAgPSBzdHJzdHIoYnVmLCAicG9ydCIpKSAhPSBOVUxMKQorCQlzc2NhbmYocCwgInBvcnQ6ICUxMjdzXG4iLCBwb3J0KTsKKworCS8qIGNoZWNrIHNlcnZpY2UsIHByb2dyYW0sIGFuZCB2ZXJzaW9uICovCisJaWYgKG1lbWNtcChzZXJ2aWNlLCAibmZzIiwgMykgIT0gMCkKKwkJcmV0dXJuIC0xOworCSpwcm9nID0gYXRvaShwcm9ncmFtICsgMSk7IC8qIHNraXAgb3BlbiBwYXJlbiAqLworCSp2ZXJzID0gYXRvaSh2ZXJzaW9uKTsKKworCWlmIChzdHJsZW4oc2VydmljZSkgPT0gMyApIHsKKwkJaWYgKCgqcHJvZyAhPSAxMDAwMDMpIHx8ICgoKnZlcnMgIT0gMikgJiYgKCp2ZXJzICE9IDMpICYmCisJCSAgICAoKnZlcnMgIT0gNCkpKQorCQkJZ290byBmYWlsOworCX0gZWxzZSBpZiAobWVtY21wKHNlcnZpY2UsICJuZnM0X2NiIiwgNykgPT0gMCkgeworCQlpZiAoKnZlcnMgIT0gMSkKKwkJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIWFkZHJzdHJfdG9fc29ja2FkZHIoYWRkciwgYWRkcmVzcywgcG9ydCkpCisJCWdvdG8gZmFpbDsKKworCSpzZXJ2ZXJuYW1lID0gc29ja2FkZHJfdG9faG9zdG5hbWUoYWRkciwgYWRkcmVzcyk7CisJaWYgKCpzZXJ2ZXJuYW1lID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCW5ieXRlcyA9IHNucHJpbnRmKGJ1ZiwgSU5GT0JVRkxFTiwgIiVzQCVzIiwgc2VydmljZSwgKnNlcnZlcm5hbWUpOworCWlmIChuYnl0ZXMgPiBJTkZPQlVGTEVOKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoISgqc2VydmljZW5hbWUgPSBjYWxsb2Moc3RybGVuKGJ1ZikgKyAxLCAxKSkpCisJCWdvdG8gZmFpbDsKKwltZW1jcHkoKnNlcnZpY2VuYW1lLCBidWYsIHN0cmxlbihidWYpKTsKKworCWlmICghKCpwcm90b2NvbCA9IHN0cmR1cChwcm90b25hbWUpKSkKKwkJZ290byBmYWlsOworCXJldHVybiAwOworZmFpbDoKKwlwcmludGVycigwLCAiRVJST1I6IGZhaWxlZCB0byByZWFkIHNlcnZpY2UgaW5mb1xuIik7CisJaWYgKGZkICE9IC0xKSBjbG9zZShmZCk7CisJZnJlZSgqc2VydmVybmFtZSk7CisJZnJlZSgqc2VydmljZW5hbWUpOworCWZyZWUoKnByb3RvY29sKTsKKwkqc2VydmljZW5hbWUgPSAqc2VydmVybmFtZSA9ICpwcm90b2NvbCA9IE5VTEw7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9jbGllbnQoc3RydWN0IGNsbnRfaW5mbyAqY2xwKQoreworCWlmIChjbHAtPmtyYjVfcG9sbF9pbmRleCAhPSAtMSkKKwkJbWVtc2V0KCZwb2xsYXJyYXlbY2xwLT5rcmI1X3BvbGxfaW5kZXhdLCAwLAorCQkJCQlzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCWlmIChjbHAtPnNwa20zX3BvbGxfaW5kZXggIT0gLTEpCisJCW1lbXNldCgmcG9sbGFycmF5W2NscC0+c3BrbTNfcG9sbF9pbmRleF0sIDAsCisJCQkJCXNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJaWYgKGNscC0+Z3NzZF9wb2xsX2luZGV4ICE9IC0xKQorCQltZW1zZXQoJnBvbGxhcnJheVtjbHAtPmdzc2RfcG9sbF9pbmRleF0sIDAsCisJCQkJCXNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJaWYgKGNscC0+ZGlyX2ZkICE9IC0xKSBjbG9zZShjbHAtPmRpcl9mZCk7CisJaWYgKGNscC0+a3JiNV9mZCAhPSAtMSkgY2xvc2UoY2xwLT5rcmI1X2ZkKTsKKwlpZiAoY2xwLT5zcGttM19mZCAhPSAtMSkgY2xvc2UoY2xwLT5zcGttM19mZCk7CisJaWYgKGNscC0+Z3NzZF9mZCAhPSAtMSkgY2xvc2UoY2xwLT5nc3NkX2ZkKTsKKwlmcmVlKGNscC0+ZGlybmFtZSk7CisJZnJlZShjbHAtPnNlcnZpY2VuYW1lKTsKKwlmcmVlKGNscC0+c2VydmVybmFtZSk7CisJZnJlZShjbHAtPnByb3RvY29sKTsKKwlmcmVlKGNscCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xudF9pbmZvICoKK2luc2VydF9uZXdfY2xudCh2b2lkKQoreworCXN0cnVjdCBjbG50X2luZm8JKmNscCA9IE5VTEw7CisKKwlpZiAoIShjbHAgPSAoc3RydWN0IGNsbnRfaW5mbyAqKWNhbGxvYygxLHNpemVvZihzdHJ1Y3QgY2xudF9pbmZvKSkpKSB7CisJCXByaW50ZXJyKDAsICJFUlJPUjogY2FuJ3QgbWFsbG9jIGNsbnRfaW5mbzogJXNcbiIsCisJCQkgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXQ7CisJfQorCWNscC0+a3JiNV9wb2xsX2luZGV4ID0gLTE7CisJY2xwLT5zcGttM19wb2xsX2luZGV4ID0gLTE7CisJY2xwLT5nc3NkX3BvbGxfaW5kZXggPSAtMTsKKwljbHAtPmtyYjVfZmQgPSAtMTsKKwljbHAtPnNwa20zX2ZkID0gLTE7CisJY2xwLT5nc3NkX2ZkID0gLTE7CisJY2xwLT5kaXJfZmQgPSAtMTsKKworCVRBSUxRX0lOU0VSVF9IRUFEKCZjbG50X2xpc3QsIGNscCwgbGlzdCk7CitvdXQ6CisJcmV0dXJuIGNscDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19jbG50X2Rpcl9maWxlcyhzdHJ1Y3QgY2xudF9pbmZvICogY2xwKQoreworCWNoYXIJbmFtZVtQQVRIX01BWF07CisJY2hhcglnbmFtZVtQQVRIX01BWF07CisJY2hhcglpbmZvX2ZpbGVfbmFtZVtQQVRIX01BWF07CisKKwlpZiAoY2xwLT5nc3NkX2ZkID09IC0xKSB7CisJCXNucHJpbnRmKGduYW1lLCBzaXplb2YoZ25hbWUpLCAiJXMvZ3NzZCIsIGNscC0+ZGlybmFtZSk7CisJCWNscC0+Z3NzZF9mZCA9IG9wZW4oZ25hbWUsIE9fUkRXUik7CisJfQorCWlmIChjbHAtPmdzc2RfZmQgPT0gLTEpIHsKKwkJaWYgKGNscC0+a3JiNV9mZCA9PSAtMSkgeworCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMva3JiNSIsIGNscC0+ZGlybmFtZSk7CisJCQljbHAtPmtyYjVfZmQgPSBvcGVuKG5hbWUsIE9fUkRXUik7CisJCX0KKwkJaWYgKGNscC0+c3BrbTNfZmQgPT0gLTEpIHsKKwkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzL3Nwa20zIiwgY2xwLT5kaXJuYW1lKTsKKwkJCWNscC0+c3BrbTNfZmQgPSBvcGVuKG5hbWUsIE9fUkRXUik7CisJCX0KKworCQkvKiBJZiB3ZSBvcGVuZWQgYSBnc3Mtc3BlY2lmaWMgcGlwZSwgbGV0J3MgdHJ5IG9wZW5pbmcKKwkJICogdGhlIG5ldyB1cGNhbGwgcGlwZSBhZ2Fpbi4gSWYgd2Ugc3VjY2VlZCwgY2xvc2UKKwkJICogZ3NzLXNwZWNpZmljIHBpcGUocykuCisJCSAqLworCQlpZiAoY2xwLT5rcmI1X2ZkICE9IC0xIHx8IGNscC0+c3BrbTNfZmQgIT0gLTEpIHsKKwkJCWNscC0+Z3NzZF9mZCA9IG9wZW4oZ25hbWUsIE9fUkRXUik7CisJCQlpZiAoY2xwLT5nc3NkX2ZkICE9IC0xKSB7CisJCQkJaWYgKGNscC0+a3JiNV9mZCAhPSAtMSkKKwkJCQkJY2xvc2UoY2xwLT5rcmI1X2ZkKTsKKwkJCQljbHAtPmtyYjVfZmQgPSAtMTsKKwkJCQlpZiAoY2xwLT5zcGttM19mZCAhPSAtMSkKKwkJCQkJY2xvc2UoY2xwLT5zcGttM19mZCk7CisJCQkJY2xwLT5zcGttM19mZCA9IC0xOworCQkJfQorCQl9CisJfQorCisJaWYgKChjbHAtPmtyYjVfZmQgPT0gLTEpICYmIChjbHAtPnNwa20zX2ZkID09IC0xKSAmJgorCQkJKGNscC0+Z3NzZF9mZCA9PSAtMSkpCisJCXJldHVybiAtMTsKKwlzbnByaW50ZihpbmZvX2ZpbGVfbmFtZSwgc2l6ZW9mKGluZm9fZmlsZV9uYW1lKSwgIiVzL2luZm8iLAorCQkJY2xwLT5kaXJuYW1lKTsKKwlpZiAoKGNscC0+c2VydmljZW5hbWUgPT0gTlVMTCkgJiYKKwkgICAgIHJlYWRfc2VydmljZV9pbmZvKGluZm9fZmlsZV9uYW1lLCAmY2xwLT5zZXJ2aWNlbmFtZSwKKwkJCQkmY2xwLT5zZXJ2ZXJuYW1lLCAmY2xwLT5wcm9nLCAmY2xwLT52ZXJzLAorCQkJCSZjbHAtPnByb3RvY29sLCAoc3RydWN0IHNvY2thZGRyICopICZjbHAtPmFkZHIpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9wb2xsX2luZGV4KGludCAqaW5kKQoreworCWludCBpOworCisJKmluZCA9IC0xOworCWZvciAoaT0wOyBpPEZEX0FMTE9DX0JMT0NLOyBpKyspIHsKKwkJaWYgKHBvbGxhcnJheVtpXS5ldmVudHMgPT0gMCkgeworCQkJKmluZCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoKmluZCA9PSAtMSkgeworCQlwcmludGVycigwLCAiRVJST1I6IE5vIHBvbGxhcnJheSBzbG90cyBvcGVuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitpbnNlcnRfY2xudF9wb2xsKHN0cnVjdCBjbG50X2luZm8gKmNscCkKK3sKKwlpZiAoKGNscC0+Z3NzZF9mZCAhPSAtMSkgJiYgKGNscC0+Z3NzZF9wb2xsX2luZGV4ID09IC0xKSkgeworCQlpZiAoZ2V0X3BvbGxfaW5kZXgoJmNscC0+Z3NzZF9wb2xsX2luZGV4KSkgeworCQkJcHJpbnRlcnIoMCwgIkVSUk9SOiBUb28gbWFueSBnc3NkIGNsaWVudHNcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXBvbGxhcnJheVtjbHAtPmdzc2RfcG9sbF9pbmRleF0uZmQgPSBjbHAtPmdzc2RfZmQ7CisJCXBvbGxhcnJheVtjbHAtPmdzc2RfcG9sbF9pbmRleF0uZXZlbnRzIHw9IFBPTExJTjsKKwl9CisKKwlpZiAoKGNscC0+a3JiNV9mZCAhPSAtMSkgJiYgKGNscC0+a3JiNV9wb2xsX2luZGV4ID09IC0xKSkgeworCQlpZiAoZ2V0X3BvbGxfaW5kZXgoJmNscC0+a3JiNV9wb2xsX2luZGV4KSkgeworCQkJcHJpbnRlcnIoMCwgIkVSUk9SOiBUb28gbWFueSBrcmI1IGNsaWVudHNcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXBvbGxhcnJheVtjbHAtPmtyYjVfcG9sbF9pbmRleF0uZmQgPSBjbHAtPmtyYjVfZmQ7CisJCXBvbGxhcnJheVtjbHAtPmtyYjVfcG9sbF9pbmRleF0uZXZlbnRzIHw9IFBPTExJTjsKKwl9CisKKwlpZiAoKGNscC0+c3BrbTNfZmQgIT0gLTEpICYmIChjbHAtPnNwa20zX3BvbGxfaW5kZXggPT0gLTEpKSB7CisJCWlmIChnZXRfcG9sbF9pbmRleCgmY2xwLT5zcGttM19wb2xsX2luZGV4KSkgeworCQkJcHJpbnRlcnIoMCwgIkVSUk9SOiBUb28gbWFueSBzcGttMyBjbGllbnRzXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlwb2xsYXJyYXlbY2xwLT5zcGttM19wb2xsX2luZGV4XS5mZCA9IGNscC0+c3BrbTNfZmQ7CisJCXBvbGxhcnJheVtjbHAtPnNwa20zX3BvbGxfaW5kZXhdLmV2ZW50cyB8PSBQT0xMSU47CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX2NsbnRfZGlyKGNoYXIgKmRpciwgY2hhciAqcGRpcikKK3sKKwlzdHJ1Y3QgY2xudF9pbmZvICoJY2xwOworCisJaWYgKCEoY2xwID0gaW5zZXJ0X25ld19jbG50KCkpKQorCQlnb3RvIGZhaWxfZGVzdHJveV9jbGllbnQ7CisKKwkvKiBBbiBleHRyYSBmb3IgdGhlICcvJywgYW5kIGFuIGV4dHJhIGZvciB0aGUgbnVsbCAqLworCWlmICghKGNscC0+ZGlybmFtZSA9IGNhbGxvYyhzdHJsZW4oZGlyKSArIHN0cmxlbihwZGlyKSArIDIsIDEpKSkgeworCQlnb3RvIGZhaWxfZGVzdHJveV9jbGllbnQ7CisJfQorCXNwcmludGYoY2xwLT5kaXJuYW1lLCAiJXMvJXMiLCBwZGlyLCBkaXIpOworCWlmICgoY2xwLT5kaXJfZmQgPSBvcGVuKGNscC0+ZGlybmFtZSwgT19SRE9OTFkpKSA9PSAtMSkgeworCQlwcmludGVycigwLCAiRVJST1I6IGNhbid0IG9wZW4gJXM6ICVzXG4iLAorCQkJIGNscC0+ZGlybmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsX2Rlc3Ryb3lfY2xpZW50OworCX0KKwlmY250bChjbHAtPmRpcl9mZCwgRl9TRVRTSUcsIEROT1RJRllfU0lHTkFMKTsKKwlmY250bChjbHAtPmRpcl9mZCwgRl9OT1RJRlksIEROX0NSRUFURSB8IEROX0RFTEVURSB8IEROX01VTFRJU0hPVCk7CisKKwlpZiAocHJvY2Vzc19jbG50X2Rpcl9maWxlcyhjbHApKQorCQlnb3RvIGZhaWxfa2VlcF9jbGllbnQ7CisKKwlpZiAoaW5zZXJ0X2NsbnRfcG9sbChjbHApKQorCQlnb3RvIGZhaWxfZGVzdHJveV9jbGllbnQ7CisKKwlyZXR1cm47CisKK2ZhaWxfZGVzdHJveV9jbGllbnQ6CisJaWYgKGNscCkgeworCQlUQUlMUV9SRU1PVkUoJmNsbnRfbGlzdCwgY2xwLCBsaXN0KTsKKwkJZGVzdHJveV9jbGllbnQoY2xwKTsKKwl9CitmYWlsX2tlZXBfY2xpZW50OgorCS8qIFdlIGNvdWxkbid0IGZpbmQgc29tZSBzdWJkaXJlY3RvcmllcywgYnV0IHdlIGtlZXAgdGhlIGNsaWVudAorCSAqIGFyb3VuZCBpbiBjYXNlIHdlIGdldCBhIG5vdGlmaWNhdGlvbiBvbiB0aGUgZGlyZWN0b3J5IHdoZW4gdGhlCisJICogc3ViZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQuICovCisJcmV0dXJuOworfQorCit2b2lkCitpbml0X2NsaWVudF9saXN0KHZvaWQpCit7CisJVEFJTFFfSU5JVCgmY2xudF9saXN0KTsKKwkvKiBFdmVudHVhbGx5IHBsYW4gdG8gZ3Jvdy9zaHJpbmsgcG9sbCBhcnJheTogKi8KKwlwb2xsc2l6ZSA9IEZEX0FMTE9DX0JMT0NLOworCXBvbGxhcnJheSA9IGNhbGxvYyhwb2xsc2l6ZSwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKK30KKworLyoKKyAqIFRoaXMgaXMgcnVuIGFmdGVyIGEgRE5PVElGWSBzaWduYWwsIGFuZCBzaG91bGQgY2xlYXIgdXAgYW55CisgKiBkaXJlY3RvcmllcyB0aGF0IGFyZSBubyBsb25nZXIgYXJvdW5kLCBhbmQgcmUtc2NhbiBhbnkgZXhpc3RpbmcKKyAqIGRpcmVjdG9yaWVzLCBzaW5jZSB0aGUgRE5PVElGWSBjb3VsZCBoYXZlIGJlZW4gaW4gdGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfb2xkX2NsaWVudHMoc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0LCBpbnQgc2l6ZSwgY2hhciAqcGRpcikKK3sKKwlzdHJ1Y3QgY2xudF9pbmZvICpjbHA7CisJdm9pZCAqc2F2ZXByZXY7CisJaW50IGksIHN0aWxsaGVyZTsKKwljaGFyIGZuYW1lW1BBVEhfTUFYXTsKKworCWZvciAoY2xwID0gY2xudF9saXN0LnRxaF9maXJzdDsgY2xwICE9IE5VTEw7IGNscCA9IGNscC0+bGlzdC50cWVfbmV4dCkgeworCQkvKiBvbmx5IGNvbXBhcmUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIGxpc3QgdGhhdCBhcmUgZnJvbSB0aGUKKwkJICogc2FtZSBwaXBlZnMgcGFyZW50IGRpcmVjdG9yeSBhcyAicGRpciIKKwkJICovCisJCWlmIChzdHJuY21wKGNscC0+ZGlybmFtZSwgcGRpciwgc3RybGVuKHBkaXIpKSAhPSAwKSBjb250aW51ZTsKKworCQlzdGlsbGhlcmUgPSAwOworCQlmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgeworCQkJc25wcmludGYoZm5hbWUsIHNpemVvZihmbmFtZSksICIlcy8lcyIsCisJCQkJIHBkaXIsIG5hbWVsaXN0W2ldLT5kX25hbWUpOworCQkJaWYgKHN0cmNtcChjbHAtPmRpcm5hbWUsIGZuYW1lKSA9PSAwKSB7CisJCQkJc3RpbGxoZXJlID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN0aWxsaGVyZSkgeworCQkJcHJpbnRlcnIoMiwgImRlc3Ryb3lpbmcgY2xpZW50ICVzXG4iLCBjbHAtPmRpcm5hbWUpOworCQkJc2F2ZXByZXYgPSBjbHAtPmxpc3QudHFlX3ByZXY7CisJCQlUQUlMUV9SRU1PVkUoJmNsbnRfbGlzdCwgY2xwLCBsaXN0KTsKKwkJCWRlc3Ryb3lfY2xpZW50KGNscCk7CisJCQljbHAgPSBzYXZlcHJldjsKKwkJfQorCX0KKwlmb3IgKGNscCA9IGNsbnRfbGlzdC50cWhfZmlyc3Q7IGNscCAhPSBOVUxMOyBjbHAgPSBjbHAtPmxpc3QudHFlX25leHQpIHsKKwkJaWYgKCFwcm9jZXNzX2NsbnRfZGlyX2ZpbGVzKGNscCkpCisJCQlpbnNlcnRfY2xudF9wb2xsKGNscCk7CisJfQorfQorCisvKiBTZWFyY2ggZm9yIGEgY2xpZW50IGJ5IGRpcmVjdG9yeSBuYW1lLCByZXR1cm4gMSBpZiBmb3VuZCwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfY2xpZW50KGNoYXIgKmRpcm5hbWUsIGNoYXIgKnBkaXIpCit7CisJc3RydWN0IGNsbnRfaW5mbwkqY2xwOworCWNoYXIgZm5hbWVbUEFUSF9NQVhdOworCisJZm9yIChjbHAgPSBjbG50X2xpc3QudHFoX2ZpcnN0OyBjbHAgIT0gTlVMTDsgY2xwID0gY2xwLT5saXN0LnRxZV9uZXh0KSB7CisJCXNucHJpbnRmKGZuYW1lLCBzaXplb2YoZm5hbWUpLCAiJXMvJXMiLCBwZGlyLCBkaXJuYW1lKTsKKwkJaWYgKHN0cmNtcChjbHAtPmRpcm5hbWUsIGZuYW1lKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX3BpcGVkaXIoY2hhciAqcGlwZV9uYW1lKQoreworCXN0cnVjdCBkaXJlbnQgKipuYW1lbGlzdDsKKwlpbnQgaSwgajsKKworCWlmIChjaGRpcihwaXBlX25hbWUpIDwgMCkgeworCQlwcmludGVycigwLCAiRVJST1I6IGNhbid0IGNoZGlyIHRvICVzOiAlc1xuIiwKKwkJCSBwaXBlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlqID0gc2NhbmRpcihwaXBlX25hbWUsICZuYW1lbGlzdCwgTlVMTCwgYWxwaGFzb3J0KTsKKwlpZiAoaiA8IDApIHsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiBjYW4ndCBzY2FuZGlyICVzOiAlc1xuIiwKKwkJCSBwaXBlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl1cGRhdGVfb2xkX2NsaWVudHMobmFtZWxpc3QsIGosIHBpcGVfbmFtZSk7CisJZm9yIChpPTA7IGkgPCBqOyBpKyspIHsKKwkJaWYgKGkgPCBGRF9BTExPQ19CTE9DSworCQkJCSYmICFzdHJuY21wKG5hbWVsaXN0W2ldLT5kX25hbWUsICJjbG50IiwgNCkKKwkJCQkmJiAhZmluZF9jbGllbnQobmFtZWxpc3RbaV0tPmRfbmFtZSwgcGlwZV9uYW1lKSkKKwkJCXByb2Nlc3NfY2xudF9kaXIobmFtZWxpc3RbaV0tPmRfbmFtZSwgcGlwZV9uYW1lKTsKKwkJZnJlZShuYW1lbGlzdFtpXSk7CisJfQorCisJZnJlZShuYW1lbGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVXNlZCB0byByZWFkIChhbmQgcmUtcmVhZCkgbGlzdCBvZiBjbGllbnRzLCBzZXQgdXAgcG9sbCBhcnJheS4gKi8KK2ludAordXBkYXRlX2NsaWVudF9saXN0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IC0xOworCXN0cnVjdCB0b3BkaXJzX2luZm8gKnRkaTsKKworCVRBSUxRX0ZPUkVBQ0godGRpLCAmdG9wZGlyc19saXN0LCBsaXN0KSB7CisJCXJldHZhbCA9IHByb2Nlc3NfcGlwZWRpcih0ZGktPmRpcm5hbWUpOworCQlpZiAocmV0dmFsKQorCQkJcHJpbnRlcnIoMSwgIldBUk5JTkc6IGVycm9yIHByb2Nlc3NpbmcgJXNcbiIsCisJCQkJIHRkaS0+ZGlybmFtZSk7CisKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorZG9fZG93bmNhbGwoaW50IGs1X2ZkLCB1aWRfdCB1aWQsIHN0cnVjdCBhdXRoZ3NzX3ByaXZhdGVfZGF0YSAqcGQsCisJICAgIGdzc19idWZmZXJfZGVzYyAqY29udGV4dF90b2tlbikKK3sKKwljaGFyICAgICpidWYgPSBOVUxMLCAqcCA9IE5VTEwsICplbmQgPSBOVUxMOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gY29udGV4dF90aW1lb3V0OworCXVuc2lnbmVkIGludCBidWZfc2l6ZSA9IDA7CisKKwlwcmludGVycigxLCAiZG9pbmcgZG93bmNhbGxcbiIpOworCWJ1Zl9zaXplID0gc2l6ZW9mKHVpZCkgKyBzaXplb2YodGltZW91dCkgKyBzaXplb2YocGQtPnBkX3NlcV93aW4pICsKKwkJc2l6ZW9mKHBkLT5wZF9jdHhfaG5kbC5sZW5ndGgpICsgcGQtPnBkX2N0eF9obmRsLmxlbmd0aCArCisJCXNpemVvZihjb250ZXh0X3Rva2VuLT5sZW5ndGgpICsgY29udGV4dF90b2tlbi0+bGVuZ3RoOworCXAgPSBidWYgPSBtYWxsb2MoYnVmX3NpemUpOworCWVuZCA9IGJ1ZiArIGJ1Zl9zaXplOworCisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIHVpZCkpIGdvdG8gb3V0X2VycjsKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgdGltZW91dCkpIGdvdG8gb3V0X2VycjsKKwlpZiAoV1JJVEVfQllURVMoJnAsIGVuZCwgcGQtPnBkX3NlcV93aW4pKSBnb3RvIG91dF9lcnI7CisJaWYgKHdyaXRlX2J1ZmZlcigmcCwgZW5kLCAmcGQtPnBkX2N0eF9obmRsKSkgZ290byBvdXRfZXJyOworCWlmICh3cml0ZV9idWZmZXIoJnAsIGVuZCwgY29udGV4dF90b2tlbikpIGdvdG8gb3V0X2VycjsKKworCWlmICh3cml0ZShrNV9mZCwgYnVmLCBwIC0gYnVmKSA8IHAgLSBidWYpIGdvdG8gb3V0X2VycjsKKwlpZiAoYnVmKSBmcmVlKGJ1Zik7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWlmIChidWYpIGZyZWUoYnVmKTsKKwlwcmludGVycigxLCAiRmFpbGVkIHRvIHdyaXRlIGRvd25jYWxsIVxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Citkb19lcnJvcl9kb3duY2FsbChpbnQgazVfZmQsIHVpZF90IHVpZCwgaW50IGVycikKK3sKKwljaGFyCWJ1ZlsxMDI0XTsKKwljaGFyCSpwID0gYnVmLCAqZW5kID0gYnVmICsgMTAyNDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDA7CisJaW50CXplcm8gPSAwOworCisJcHJpbnRlcnIoMSwgImRvaW5nIGVycm9yIGRvd25jYWxsXG4iKTsKKworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCB1aWQpKSBnb3RvIG91dF9lcnI7CisJaWYgKFdSSVRFX0JZVEVTKCZwLCBlbmQsIHRpbWVvdXQpKSBnb3RvIG91dF9lcnI7CisJLyogdXNlIHNlcV93aW4gPSAwIHRvIGluZGljYXRlIGFuIGVycm9yOiAqLworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCB6ZXJvKSkgZ290byBvdXRfZXJyOworCWlmIChXUklURV9CWVRFUygmcCwgZW5kLCBlcnIpKSBnb3RvIG91dF9lcnI7CisKKwlpZiAod3JpdGUoazVfZmQsIGJ1ZiwgcCAtIGJ1ZikgPCBwIC0gYnVmKSBnb3RvIG91dF9lcnI7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXByaW50ZXJyKDEsICJGYWlsZWQgdG8gd3JpdGUgZXJyb3IgZG93bmNhbGwhXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBJZiB0aGUgcG9ydCBpc24ndCBhbHJlYWR5IHNldCwgZG8gYW4gcnBjYmluZCBxdWVyeSB0byB0aGUgcmVtb3RlIHNlcnZlcgorICogdXNpbmcgdGhlIHByb2dyYW0gYW5kIHZlcnNpb24gYW5kIGdldCB0aGUgcG9ydC4gCisgKgorICogTmV3ZXIga2VybmVscyBzZW5kIHRoZSB2YWx1ZSBvZiB0aGUgcG9ydD0gbW91bnQgb3B0aW9uIGluIHRoZSAiaW5mbyIKKyAqIGZpbGUgZm9yIHRoZSB1cGNhbGwgb3IgJzAnIGZvciBORlN2Mi8zLiBGb3IgTkZTdjQgaXQgc2VuZHMgdGhlIHZhbHVlCisgKiBvZiB0aGUgcG9ydD0gb3B0aW9uIG9yICcyMDQ5Jy4gVGhlIHBvcnQgZmllbGQgaW4gYSBuZXcgc29ja2FkZHIgc2hvdWxkCisgKiByZWZsZWN0IHRoZSB2YWx1ZSB0aGF0IHdhcyBzZW50IGJ5IHRoZSBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbnQKK3BvcHVsYXRlX3BvcnQoc3RydWN0IHNvY2thZGRyICpzYSwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCSAgICAgIGNvbnN0IHJwY3Byb2dfdCBwcm9ncmFtLCBjb25zdCBycGN2ZXJzX3QgdmVyc2lvbiwKKwkgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4JKnM0ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYTsKKyNpZmRlZiBJUFY2X1NVUFBPUlRFRAorCXN0cnVjdCBzb2NrYWRkcl9pbjYJKnM2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgc2E7CisjZW5kaWYgLyogSVBWNl9TVVBQT1JURUQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcG9ydDsKKworCS8qCisJICogTmV3ZXIga2VybmVscyBzZW5kIHRoZSBwb3J0IGluIHRoZSB1cGNhbGwuIElmIHdlIGFscmVhZHkgaGF2ZQorCSAqIHRoZSBwb3J0LCB0aGVyZSdzIG5vIG5lZWQgdG8gbG9vayBpdCB1cC4KKwkgKi8KKwlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWlmIChzNC0+c2luX3BvcnQgIT0gMCkgeworCQkJcHJpbnRlcnIoMiwgIkRFQlVHOiBwb3J0IGFscmVhZHkgc2V0IHRvICVkXG4iLAorCQkJCSBudG9ocyhzNC0+c2luX3BvcnQpKTsKKwkJCXJldHVybiAxOworCQl9CisJCWJyZWFrOworI2lmZGVmIElQVjZfU1VQUE9SVEVECisJY2FzZSBBRl9JTkVUNjoKKwkJaWYgKHM2LT5zaW42X3BvcnQgIT0gMCkgeworCQkJcHJpbnRlcnIoMiwgIkRFQlVHOiBwb3J0IGFscmVhZHkgc2V0IHRvICVkXG4iLAorCQkJCSBudG9ocyhzNi0+c2luNl9wb3J0KSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiBJUFY2X1NVUFBPUlRFRCAqLworCWRlZmF1bHQ6CisJCXByaW50ZXJyKDAsICJFUlJPUjogdW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkgJWRcbiIsCisJCQkgICAgc2EtPnNhX2ZhbWlseSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTmV3ZXIga2VybmVscyB0aGF0IHNlbmQgdGhlIHBvcnQgaW4gdGhlIHVwY2FsbCBzZXQgdGhlIHZhbHVlIHRvCisJICogMjA0OSBmb3IgTkZTdjQgbW91bnRzIHdoZW4gb25lIGlzbid0IHNwZWNpZmllZC4gVGhlIGNoZWNrIGJlbG93IGlzCisJICogb25seSBmb3Iga2VybmVscyB0aGF0IGRvbid0IHNlbmQgdGhlIHBvcnQgaW4gdGhlIHVwY2FsbC4gRm9yIHRob3NlCisJICogd2UgZWl0aGVyIGhhdmUgdG8gZG8gYW4gcnBjYmluZCBxdWVyeSBvciBzZXQgaXQgdG8gdGhlIHN0YW5kYXJkCisJICogcG9ydC4gRG9pbmcgYSBxdWVyeSBjb3VsZCBiZSBwcm9ibGVtYXRpYyAoZmlyZXdhbGxzLCBldGMpLCBzbyB0YWtlCisJICogdGhlIGxhdHRlciBhcHByb2FjaC4KKwkgKi8KKwlpZiAocHJvZ3JhbSA9PSAxMDAwMDMgJiYgdmVyc2lvbiA9PSA0KSB7CisJCXBvcnQgPSAyMDQ5OworCQlnb3RvIHNldF9wb3J0OworCX0KKworCXBvcnQgPSBuZnNfZ2V0cG9ydChzYSwgc2FsZW4sIHByb2dyYW0sIHZlcnNpb24sIHByb3RvY29sKTsKKwlpZiAoIXBvcnQpIHsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiB1bmFibGUgdG8gb2J0YWluIHBvcnQgZm9yIHByb2cgJWxkICIKKwkJCSAgICAidmVycyAlbGRcbiIsIHByb2dyYW0sIHZlcnNpb24pOworCQlyZXR1cm4gMDsKKwl9CisKK3NldF9wb3J0OgorCXByaW50ZXJyKDIsICJERUJVRzogc2V0dGluZyBwb3J0IHRvICVodSBmb3IgcHJvZyAlbHUgdmVycyAlbHVcbiIsIHBvcnQsCisJCSBwcm9ncmFtLCB2ZXJzaW9uKTsKKworCXN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJczQtPnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJCWJyZWFrOworI2lmZGVmIElQVjZfU1VQUE9SVEVECisJY2FzZSBBRl9JTkVUNjoKKwkJczYtPnNpbjZfcG9ydCA9IGh0b25zKHBvcnQpOworCQlicmVhazsKKyNlbmRpZiAvKiBJUFY2X1NVUFBPUlRFRCAqLworCX0KKworCXJldHVybiAxOworfQorCisvKgorICogQ3JlYXRlIGFuIFJQQyBjb25uZWN0aW9uIGFuZCBlc3RhYmxpc2ggYW4gYXV0aGVudGljYXRlZAorICogZ3NzIGNvbnRleHQgd2l0aCBhIHNlcnZlci4KKyAqLworaW50IGNyZWF0ZV9hdXRoX3JwY19jbGllbnQoc3RydWN0IGNsbnRfaW5mbyAqY2xwLAorCQkJICAgQ0xJRU5UICoqY2xudF9yZXR1cm4sCisJCQkgICBBVVRIICoqYXV0aF9yZXR1cm4sCisJCQkgICB1aWRfdCB1aWQsCisJCQkgICBpbnQgYXV0aHR5cGUpCit7CisJQ0xJRU5UCQkJKnJwY19jbG50ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2dzc19zZWMJc2VjOworCUFVVEgJCQkqYXV0aCA9IE5VTEw7CisJdWlkX3QJCQlzYXZlX3VpZCA9IC0xOworCWludAkJCXJldHZhbCA9IC0xOworCU9NX3VpbnQzMgkJbWluX3N0YXQ7CisJY2hhcgkJCXJwY19lcnJtc2dbMTAyNF07CisJaW50CQkJcHJvdG9jb2w7CisJc3RydWN0IHRpbWV2YWwJCXRpbWVvdXQgPSB7NSwgMH07CisJc3RydWN0IHNvY2thZGRyCQkqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNscC0+YWRkcjsKKwlzb2NrbGVuX3QJCXNhbGVuOworCisJLyogQ3JlYXRlIHRoZSBjb250ZXh0IGFzIHRoZSB1c2VyIChub3QgYXMgcm9vdCkgKi8KKwlzYXZlX3VpZCA9IGdldGV1aWQoKTsKKwlpZiAoc2V0ZnN1aWQodWlkKSAhPSAwKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBGYWlsZWQgdG8gc2V0ZnN1aWQgZm9yICIKKwkJCSAgICAidXNlciB3aXRoIHVpZCAlZFxuIiwgdWlkKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisJcHJpbnRlcnIoMiwgImNyZWF0aW5nIGNvbnRleHQgdXNpbmcgZnN1aWQgJWQgKHNhdmVfdWlkICVkKVxuIiwKKwkJCXVpZCwgc2F2ZV91aWQpOworCisJc2VjLnFvcCA9IEdTU19DX1FPUF9ERUZBVUxUOworCXNlYy5zdmMgPSBSUENTRUNfR1NTX1NWQ19OT05FOworCXNlYy5jcmVkID0gR1NTX0NfTk9fQ1JFREVOVElBTDsKKwlzZWMucmVxX2ZsYWdzID0gMDsKKwlpZiAoYXV0aHR5cGUgPT0gQVVUSFRZUEVfS1JCNSkgeworCQlzZWMubWVjaCA9IChnc3NfT0lEKSZrcmI1b2lkOworCQlzZWMucmVxX2ZsYWdzID0gR1NTX0NfTVVUVUFMX0ZMQUc7CisJfQorCWVsc2UgaWYgKGF1dGh0eXBlID09IEFVVEhUWVBFX1NQS00zKSB7CisJCXNlYy5tZWNoID0gKGdzc19PSUQpJnNwa20zb2lkOworCQkvKiBYWFggc2VjLnJlcV9mbGFncyA9IEdTU19DX0FOT05fRkxBRzsKKwkJICogTmVlZCBhIHdheSB0byBzd2l0Y2guLi4uCisJCSAqLworCQlzZWMucmVxX2ZsYWdzID0gR1NTX0NfTVVUVUFMX0ZMQUc7CisJfQorCWVsc2UgeworCQlwcmludGVycigwLCAiRVJST1I6IEludmFsaWQgYXV0aGVudGljYXRpb24gdHlwZSAoJWQpICIKKwkJCSJpbiBjcmVhdGVfYXV0aF9ycGNfY2xpZW50XG4iLCBhdXRodHlwZSk7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisKKwlpZiAoYXV0aHR5cGUgPT0gQVVUSFRZUEVfS1JCNSkgeworI2lmZGVmIEhBVkVfU0VUX0FMTE9XQUJMRV9FTkNUWVBFUworCQkvKgorCQkgKiBEbyB0aGlzIGJlZm9yZSBjcmVhdGluZyBycGMgY29ubmVjdGlvbiBzaW5jZSB3ZSB3b24ndCBuZWVkCisJCSAqIHJwYyBjb25uZWN0aW9uIGlmIGl0IGZhaWxzIQorCQkgKi8KKwkJaWYgKGxpbWl0X2tyYjVfZW5jdHlwZXMoJnNlYywgdWlkKSkgeworCQkJcHJpbnRlcnIoMSwgIldBUk5JTkc6IEZhaWxlZCB3aGlsZSBsaW1pdGluZyBrcmI1ICIKKwkJCQkgICAgImVuY3J5cHRpb24gdHlwZXMgZm9yIHVzZXIgd2l0aCB1aWQgJWRcbiIsCisJCQkJIHVpZCk7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisjZW5kaWYKKwl9CisKKwkvKiBjcmVhdGUgYW4gcnBjIGNvbm5lY3Rpb24gdG8gdGhlIG5mcyBzZXJ2ZXIgKi8KKworCXByaW50ZXJyKDIsICJjcmVhdGluZyAlcyBjbGllbnQgZm9yIHNlcnZlciAlc1xuIiwgY2xwLT5wcm90b2NvbCwKKwkJCWNscC0+c2VydmVybmFtZSk7CisKKwlpZiAoKHN0cmNtcChjbHAtPnByb3RvY29sLCAidGNwIikpID09IDApIHsKKwkJcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKwl9IGVsc2UgaWYgKChzdHJjbXAoY2xwLT5wcm90b2NvbCwgInVkcCIpKSA9PSAwKSB7CisJCXByb3RvY29sID0gSVBQUk9UT19VRFA7CisJfSBlbHNlIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IHVucmVjb2duaXplZCBwcm90b2NvbCwgJyVzJywgcmVxdWVzdGVkICIKKwkJCSAiZm9yIGNvbm5lY3Rpb24gdG8gc2VydmVyICVzIGZvciB1c2VyIHdpdGggdWlkICVkXG4iLAorCQkJIGNscC0+cHJvdG9jb2wsIGNscC0+c2VydmVybmFtZSwgdWlkKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlzd2l0Y2ggKGFkZHItPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJYnJlYWs7CisjaWZkZWYgSVBWNl9TVVBQT1JURUQKKwljYXNlIEFGX0lORVQ2OgorCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJYnJlYWs7CisjZW5kaWYgLyogSVBWNl9TVVBQT1JURUQgKi8KKwlkZWZhdWx0OgorCQlwcmludGVycigxLCAiRVJST1I6IFVua25vd24gYWRkcmVzcyBmYW1pbHkgJWRcbiIsCisJCQkgYWRkci0+c2FfZmFtaWx5KTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlpZiAoIXBvcHVsYXRlX3BvcnQoYWRkciwgc2FsZW4sIGNscC0+cHJvZywgY2xwLT52ZXJzLCBwcm90b2NvbCkpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlycGNfY2xudCA9IG5mc19nZXRfcnBjY2xpZW50KGFkZHIsIHNhbGVuLCBwcm90b2NvbCwgY2xwLT5wcm9nLAorCQkJCSAgICAgY2xwLT52ZXJzLCAmdGltZW91dCk7CisJaWYgKCFycGNfY2xudCkgeworCQlzbnByaW50ZihycGNfZXJybXNnLCBzaXplb2YocnBjX2Vycm1zZyksCisJCQkgIldBUk5JTkc6IGNhbid0IGNyZWF0ZSAlcyBycGNfY2xudCB0byBzZXJ2ZXIgJXMgZm9yICIKKwkJCSAidXNlciB3aXRoIHVpZCAlZCIsCisJCQkgcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgPyAidGNwIiA6ICJ1ZHAiLAorCQkJIGNscC0+c2VydmVybmFtZSwgdWlkKTsKKwkJcHJpbnRlcnIoMCwgIiVzXG4iLAorCQkJIGNsbnRfc3BjcmVhdGVlcnJvcihycGNfZXJybXNnKSk7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJcHJpbnRlcnIoMiwgImNyZWF0aW5nIGNvbnRleHQgd2l0aCBzZXJ2ZXIgJXNcbiIsIGNscC0+c2VydmljZW5hbWUpOworCWF1dGggPSBhdXRoZ3NzX2NyZWF0ZV9kZWZhdWx0KHJwY19jbG50LCBjbHAtPnNlcnZpY2VuYW1lLCAmc2VjKTsKKwlpZiAoIWF1dGgpIHsKKwkJLyogT3VyIGNhbGxlciBzaG91bGQgcHJpbnQgYXBwcm9wcmlhdGUgbWVzc2FnZSAqLworCQlwcmludGVycigyLCAiV0FSTklORzogRmFpbGVkIHRvIGNyZWF0ZSAlcyBjb250ZXh0IGZvciAiCisJCQkgICAgInVzZXIgd2l0aCB1aWQgJWQgZm9yIHNlcnZlciAlc1xuIiwKKwkJCShhdXRodHlwZSA9PSBBVVRIVFlQRV9LUkI1ID8gImtyYjUiOiJzcGttMyIpLAorCQkJIHVpZCwgY2xwLT5zZXJ2ZXJuYW1lKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwkvKiBTdWNjZXNzICEhISAqLworCXJwY19jbG50LT5jbF9hdXRoID0gYXV0aDsKKwkqY2xudF9yZXR1cm4gPSBycGNfY2xudDsKKwkqYXV0aF9yZXR1cm4gPSBhdXRoOworCXJldHZhbCA9IDA7CisKKyAgb3V0OgorCWlmIChzZWMuY3JlZCAhPSBHU1NfQ19OT19DUkVERU5USUFMKQorCQlnc3NfcmVsZWFzZV9jcmVkKCZtaW5fc3RhdCwgJnNlYy5jcmVkKTsKKwkvKiBSZXN0b3JlIGV1aWQgdG8gb3JpZ2luYWwgdmFsdWUgKi8KKwlpZiAoKHNhdmVfdWlkICE9IC0xKSAmJiAoc2V0ZnN1aWQoc2F2ZV91aWQpICE9IHVpZCkpIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IEZhaWxlZCB0byByZXN0b3JlIGZzdWlkIgorCQkJICAgICIgdG8gdWlkICVkIGZyb20gJWRcbiIsIHNhdmVfdWlkLCB1aWQpOworCX0KKwlyZXR1cm4gcmV0dmFsOworCisgIG91dF9mYWlsOgorCS8qIE9ubHkgZGVzdHJveSBoZXJlIGlmIGZhaWx1cmUuICBPdGhlcndpc2UsIGNhbGxlciBpcyByZXNwb25zaWJsZSAqLworCWlmIChycGNfY2xudCkgY2xudF9kZXN0cm95KHJwY19jbG50KTsKKworCWdvdG8gb3V0OworfQorCisvKgorICogdGhpcyBjb2RlIHVzZXMgdGhlIHVzZXJsYW5kIHJwY3NlYyBnc3MgbGlicmFyeSB0byBjcmVhdGUgYSBrcmI1CisgKiBjb250ZXh0IG9uIGJlaGFsZiBvZiB0aGUga2VybmVsCisgKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2tyYjVfdXBjYWxsKHN0cnVjdCBjbG50X2luZm8gKmNscCwgdWlkX3QgdWlkLCBpbnQgZmQsIGNoYXIgKnRndG5hbWUsCisJCSAgICBjaGFyICpzZXJ2aWNlKQoreworCUNMSUVOVAkJCSpycGNfY2xudCA9IE5VTEw7CisJQVVUSAkJCSphdXRoID0gTlVMTDsKKwlzdHJ1Y3QgYXV0aGdzc19wcml2YXRlX2RhdGEgcGQ7CisJZ3NzX2J1ZmZlcl9kZXNjCQl0b2tlbjsKKwljaGFyCQkJKipjcmVkbGlzdCA9IE5VTEw7CisJY2hhcgkJCSoqY2NuYW1lOworCWNoYXIJCQkqKmRpcm5hbWU7CisJaW50CQkJY3JlYXRlX3Jlc3AgPSAtMTsKKwlpbnQJCQllcnIsIGRvd25jYWxsX2VyciA9IC1FQUNDRVM7CisKKwlwcmludGVycigxLCAiaGFuZGxpbmcga3JiNSB1cGNhbGwgKCVzKVxuIiwgY2xwLT5kaXJuYW1lKTsKKworCWlmICh0Z3RuYW1lKSB7CisJCWlmIChjbHAtPnNlcnZpY2VuYW1lKSB7CisJCQlmcmVlKGNscC0+c2VydmljZW5hbWUpOworCQkJY2xwLT5zZXJ2aWNlbmFtZSA9IHN0cmR1cCh0Z3RuYW1lKTsKKwkJfQorCX0KKwl0b2tlbi5sZW5ndGggPSAwOworCXRva2VuLnZhbHVlID0gTlVMTDsKKwltZW1zZXQoJnBkLCAwLCBzaXplb2Yoc3RydWN0IGF1dGhnc3NfcHJpdmF0ZV9kYXRhKSk7CisKKwkvKgorCSAqIElmICJzZXJ2aWNlIiBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGtlcm5lbCBpcyBpbmRpY2F0aW5nIHRoYXQKKwkgKiB3ZSBtdXN0IHVzZSBtYWNoaW5lIGNyZWRlbnRpYWxzIGZvciB0aGlzIHJlcXVlc3QuICAoUmVnYXJkbGVzcworCSAqIG9mIHRoZSB1aWQgdmFsdWUgb3IgdGhlIHNldHRpbmcgb2Ygcm9vdF91c2VzX21hY2hpbmVfY3JlZHMuKQorCSAqIElmIHRoZSBzZXJ2aWNlIHZhbHVlIGlzICIqIiwgdGhlbiBhbnkgc2VydmljZSBuYW1lIGNhbiBiZSB1c2VkLgorCSAqIE90aGVyd2lzZSwgaXQgc3BlY2lmaWVzIHRoZSBzZXJ2aWNlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZC4KKwkgKiAoRm9yIG5vdywgdGhlIHZhbHVlcyBvZiBzZXJ2aWNlIHdpbGwgb25seSBiZSAiKiIgb3IgIm5mcyIuKQorCSAqCisJICogUmVzdHJpY3RpbmcgZ3NzZCB0byB1c2UgIm5mcyIgc2VydmljZSBuYW1lIGlzIG5lZWRlZCBmb3Igd2hlbgorCSAqIHRoZSBORlMgc2VydmVyIGlzIGRvaW5nIGEgY2FsbGJhY2sgdG8gdGhlIE5GUyBjbGllbnQuICBJbiB0aGlzCisJICogY2FzZSwgdGhlIE5GUyBzZXJ2ZXIgaGFzIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgYXMgIm5mcyIgLS0KKwkgKiBldmVuIGlmIHRoZXJlIGFyZSBvdGhlciBzZXJ2aWNlIGtleXMgc3VjaCBhcyAiaG9zdCIgb3IgInJvb3QiCisJICogaW4gdGhlIGtleXRhYi4KKwkgKgorCSAqIEFub3RoZXIgY2FzZSB3aGVuIHRoZSBrZXJuZWwgbWF5IHNwZWNpZnkgdGhlIHNlcnZpY2UgYXR0cmlidXRlCisJICogaXMgd2hlbiBnc3NkIGlzIGJlaW5nIGFza2VkIHRvIGNyZWF0ZSB0aGUgY29udGV4dCBmb3IgYQorCSAqIFNFVENMSUVOVF9JRCBvcGVyYXRpb24uICBJbiB0aGlzIGNhc2UsIG1hY2hpbmUgY3JlZGVudGlhbHMKKwkgKiBtdXN0IGJlIHVzZWQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbi4gIEhvd2V2ZXIsIHRoZSBzZXJ2aWNlIG5hbWUKKwkgKiB1c2VkIGZvciB0aGlzIGNhc2UgaXMgbm90IGltcG9ydGFudC4KKwkgKgorCSAqLworCXByaW50ZXJyKDIsICIlczogc2VydmljZSBpcyAnJXMnXG4iLCBfX2Z1bmNfXywKKwkJIHNlcnZpY2UgPyBzZXJ2aWNlIDogIjxudWxsPiIpOworCWlmICh1aWQgIT0gMCB8fCAodWlkID09IDAgJiYgcm9vdF91c2VzX21hY2hpbmVfY3JlZHMgPT0gMCAmJgorCQkJCXNlcnZpY2UgPT0gTlVMTCkpIHsKKwkJLyogVGVsbCBrcmI1IGdzcyB3aGljaCBjcmVkZW50aWFscyBjYWNoZSB0byB1c2UgKi8KKwkJZm9yIChkaXJuYW1lID0gY2NhY2hlc2VhcmNoOyAqZGlybmFtZSAhPSBOVUxMOyBkaXJuYW1lKyspIHsKKwkJCWVyciA9IGdzc2Rfc2V0dXBfa3JiNV91c2VyX2dzc19jY2FjaGUodWlkLCBjbHAtPnNlcnZlcm5hbWUsICpkaXJuYW1lKTsKKwkJCWlmIChlcnIgPT0gLUVLRVlFWFBJUkVEKQorCQkJCWRvd25jYWxsX2VyciA9IC1FS0VZRVhQSVJFRDsKKwkJCWVsc2UgaWYgKCFlcnIpCisJCQkJY3JlYXRlX3Jlc3AgPSBjcmVhdGVfYXV0aF9ycGNfY2xpZW50KGNscCwgJnJwY19jbG50LCAmYXV0aCwgdWlkLAorCQkJCQkJCSAgICAgQVVUSFRZUEVfS1JCNSk7CisJCQlpZiAoY3JlYXRlX3Jlc3AgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoY3JlYXRlX3Jlc3AgIT0gMCkgeworCQlpZiAodWlkID09IDAgJiYgKHJvb3RfdXNlc19tYWNoaW5lX2NyZWRzID09IDEgfHwKKwkJCQlzZXJ2aWNlICE9IE5VTEwpKSB7CisJCQlpbnQgbm9jYWNoZSA9IDA7CisJCQlpbnQgc3VjY2VzcyA9IDA7CisJCQlkbyB7CisJCQkJZ3NzZF9yZWZyZXNoX2tyYjVfbWFjaGluZV9jcmVkZW50aWFsKGNscC0+c2VydmVybmFtZSwKKwkJCQkJCQkJICAgICBOVUxMLCBzZXJ2aWNlKTsKKwkJCQkvKgorCQkJCSAqIEdldCBhIGxpc3Qgb2YgY3JlZGVudGlhbCBjYWNoZSBuYW1lcyBhbmQgdHJ5IGVhY2gKKwkJCQkgKiBvZiB0aGVtIHVudGlsIG9uZSB3b3JrcyBvciB3ZSd2ZSB0cmllZCB0aGVtIGFsbAorCQkJCSAqLworCQkJCWlmIChnc3NkX2dldF9rcmI1X21hY2hpbmVfY3JlZF9saXN0KCZjcmVkbGlzdCkpIHsKKwkJCQkJcHJpbnRlcnIoMCwgIkVSUk9SOiBObyBjcmVkZW50aWFscyBmb3VuZCAiCisJCQkJCQkgImZvciBjb25uZWN0aW9uIHRvIHNlcnZlciAlc1xuIiwKKwkJCQkJCSBjbHAtPnNlcnZlcm5hbWUpOworCQkJCQkJZ290byBvdXRfcmV0dXJuX2Vycm9yOworCQkJCX0KKwkJCQlmb3IgKGNjbmFtZSA9IGNyZWRsaXN0OyBjY25hbWUgJiYgKmNjbmFtZTsgY2NuYW1lKyspIHsKKwkJCQkJZ3NzZF9zZXR1cF9rcmI1X21hY2hpbmVfZ3NzX2NjYWNoZSgqY2NuYW1lKTsKKwkJCQkJaWYgKChjcmVhdGVfYXV0aF9ycGNfY2xpZW50KGNscCwgJnJwY19jbG50LAorCQkJCQkJCQkgICAgJmF1dGgsIHVpZCwKKwkJCQkJCQkJICAgIEFVVEhUWVBFX0tSQjUpKSA9PSAwKSB7CisJCQkJCQkvKiBTdWNjZXNzISAqLworCQkJCQkJc3VjY2VzcysrOworCQkJCQkJYnJlYWs7CisJCQkJCX0gCisJCQkJCXByaW50ZXJyKDIsICJXQVJOSU5HOiBGYWlsZWQgdG8gY3JlYXRlIG1hY2hpbmUga3JiNSBjb250ZXh0ICIKKwkJCQkJCSAid2l0aCBjcmVkZW50aWFscyBjYWNoZSAlcyBmb3Igc2VydmVyICVzXG4iLAorCQkJCQkJICpjY25hbWUsIGNscC0+c2VydmVybmFtZSk7CisJCQkJfQorCQkJCWdzc2RfZnJlZV9rcmI1X21hY2hpbmVfY3JlZF9saXN0KGNyZWRsaXN0KTsJCQkKKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJaWYobm9jYWNoZSA9PSAwKSB7CisJCQkJCQlub2NhY2hlKys7CisJCQkJCQlwcmludGVycigyLCAiV0FSTklORzogTWFjaGluZSBjYWNoZSBpcyBwcmVtYXR1cmVseSBleHBpcmVkIG9yIGNvcnJ1cHRlZCAiCisJCQkJCQkgICAgICAgICAgICAidHJ5aW5nIHRvIHJlY3JlYXRlIGNhY2hlIGZvciBzZXJ2ZXIgJXNcbiIsIGNscC0+c2VydmVybmFtZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGVycigxLCAiV0FSTklORzogRmFpbGVkIHRvIGNyZWF0ZSBtYWNoaW5lIGtyYjUgY29udGV4dCAiCisJCQkJCQkgIndpdGggYW55IGNyZWRlbnRpYWxzIGNhY2hlIGZvciBzZXJ2ZXIgJXNcbiIsCisJCQkJCQkgY2xwLT5zZXJ2ZXJuYW1lKTsKKwkJCQkJCWdvdG8gb3V0X3JldHVybl9lcnJvcjsKKwkJCQkJfQorCQkJCX0KKwkJCX0gd2hpbGUoIXN1Y2Nlc3MpOworCQl9IGVsc2UgeworCQkJcHJpbnRlcnIoMSwgIldBUk5JTkc6IEZhaWxlZCB0byBjcmVhdGUga3JiNSBjb250ZXh0ICIKKwkJCQkgImZvciB1c2VyIHdpdGggdWlkICVkIGZvciBzZXJ2ZXIgJXNcbiIsCisJCQkJIHVpZCwgY2xwLT5zZXJ2ZXJuYW1lKTsKKwkJCWdvdG8gb3V0X3JldHVybl9lcnJvcjsKKwkJfQorCX0KKworCWlmICghYXV0aGdzc19nZXRfcHJpdmF0ZV9kYXRhKGF1dGgsICZwZCkpIHsKKwkJcHJpbnRlcnIoMSwgIldBUk5JTkc6IEZhaWxlZCB0byBvYnRhaW4gYXV0aGVudGljYXRpb24gIgorCQkJICAgICJkYXRhIGZvciB1c2VyIHdpdGggdWlkICVkIGZvciBzZXJ2ZXIgJXNcbiIsCisJCQkgdWlkLCBjbHAtPnNlcnZlcm5hbWUpOworCQlnb3RvIG91dF9yZXR1cm5fZXJyb3I7CisJfQorCisJaWYgKHNlcmlhbGl6ZV9jb250ZXh0X2Zvcl9rZXJuZWwocGQucGRfY3R4LCAmdG9rZW4sICZrcmI1b2lkLCBOVUxMKSkgeworCQlwcmludGVycigwLCAiV0FSTklORzogRmFpbGVkIHRvIHNlcmlhbGl6ZSBrcmI1IGNvbnRleHQgZm9yICIKKwkJCSAgICAidXNlciB3aXRoIHVpZCAlZCBmb3Igc2VydmVyICVzXG4iLAorCQkJIHVpZCwgY2xwLT5zZXJ2ZXJuYW1lKTsKKwkJZ290byBvdXRfcmV0dXJuX2Vycm9yOworCX0KKworCWRvX2Rvd25jYWxsKGZkLCB1aWQsICZwZCwgJnRva2VuKTsKKworb3V0OgorCWlmICh0b2tlbi52YWx1ZSkKKwkJZnJlZSh0b2tlbi52YWx1ZSk7CisjaWZuZGVmIEhBVkVfTElCVElSUEMKKwlpZiAocGQucGRfY3R4X2huZGwubGVuZ3RoICE9IDApCisJCWF1dGhnc3NfZnJlZV9wcml2YXRlX2RhdGEoJnBkKTsKKyNlbmRpZgorCWlmIChhdXRoKQorCQlBVVRIX0RFU1RST1koYXV0aCk7CisJaWYgKHJwY19jbG50KQorCQljbG50X2Rlc3Ryb3kocnBjX2NsbnQpOworCXJldHVybjsKKworb3V0X3JldHVybl9lcnJvcjoKKwlkb19lcnJvcl9kb3duY2FsbChmZCwgdWlkLCBkb3duY2FsbF9lcnIpOworCWdvdG8gb3V0OworfQorCisvKgorICogdGhpcyBjb2RlIHVzZXMgdGhlIHVzZXJsYW5kIHJwY3NlYyBnc3MgbGlicmFyeSB0byBjcmVhdGUgYW4gc3BrbTMKKyAqIGNvbnRleHQgb24gYmVoYWxmIG9mIHRoZSBrZXJuZWwKKyAqLworc3RhdGljIHZvaWQKK3Byb2Nlc3Nfc3BrbTNfdXBjYWxsKHN0cnVjdCBjbG50X2luZm8gKmNscCwgdWlkX3QgdWlkLCBpbnQgZmQpCit7CisJQ0xJRU5UCQkJKnJwY19jbG50ID0gTlVMTDsKKwlBVVRICQkJKmF1dGggPSBOVUxMOworCXN0cnVjdCBhdXRoZ3NzX3ByaXZhdGVfZGF0YSBwZDsKKwlnc3NfYnVmZmVyX2Rlc2MJCXRva2VuOworCisJcHJpbnRlcnIoMiwgImhhbmRsaW5nIHNwa20zIHVwY2FsbCAoJXMpXG4iLCBjbHAtPmRpcm5hbWUpOworCisJdG9rZW4ubGVuZ3RoID0gMDsKKwl0b2tlbi52YWx1ZSA9IE5VTEw7CisKKwlpZiAoY3JlYXRlX2F1dGhfcnBjX2NsaWVudChjbHAsICZycGNfY2xudCwgJmF1dGgsIHVpZCwgQVVUSFRZUEVfU1BLTTMpKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBGYWlsZWQgdG8gY3JlYXRlIHNwa20zIGNvbnRleHQgZm9yICIKKwkJCSAgICAidXNlciB3aXRoIHVpZCAlZFxuIiwgdWlkKTsKKwkJZ290byBvdXRfcmV0dXJuX2Vycm9yOworCX0KKworCWlmICghYXV0aGdzc19nZXRfcHJpdmF0ZV9kYXRhKGF1dGgsICZwZCkpIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IEZhaWxlZCB0byBvYnRhaW4gYXV0aGVudGljYXRpb24gIgorCQkJICAgICJkYXRhIGZvciB1c2VyIHdpdGggdWlkICVkIGZvciBzZXJ2ZXIgJXNcbiIsCisJCQkgdWlkLCBjbHAtPnNlcnZlcm5hbWUpOworCQlnb3RvIG91dF9yZXR1cm5fZXJyb3I7CisJfQorCisJaWYgKHNlcmlhbGl6ZV9jb250ZXh0X2Zvcl9rZXJuZWwocGQucGRfY3R4LCAmdG9rZW4sICZzcGttM29pZCwgTlVMTCkpIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IEZhaWxlZCB0byBzZXJpYWxpemUgc3BrbTMgY29udGV4dCBmb3IgIgorCQkJICAgICJ1c2VyIHdpdGggdWlkICVkIGZvciBzZXJ2ZXJcbiIsCisJCQkgdWlkLCBjbHAtPnNlcnZlcm5hbWUpOworCQlnb3RvIG91dF9yZXR1cm5fZXJyb3I7CisJfQorCisJZG9fZG93bmNhbGwoZmQsIHVpZCwgJnBkLCAmdG9rZW4pOworCitvdXQ6CisJaWYgKHRva2VuLnZhbHVlKQorCQlmcmVlKHRva2VuLnZhbHVlKTsKKwlpZiAoYXV0aCkKKwkJQVVUSF9ERVNUUk9ZKGF1dGgpOworCWlmIChycGNfY2xudCkKKwkJY2xudF9kZXN0cm95KHJwY19jbG50KTsKKwlyZXR1cm47CisKK291dF9yZXR1cm5fZXJyb3I6CisJZG9fZXJyb3JfZG93bmNhbGwoZmQsIHVpZCwgLTEpOworCWdvdG8gb3V0OworfQorCit2b2lkCitoYW5kbGVfa3JiNV91cGNhbGwoc3RydWN0IGNsbnRfaW5mbyAqY2xwKQoreworCXVpZF90CQkJdWlkOworCisJaWYgKHJlYWQoY2xwLT5rcmI1X2ZkLCAmdWlkLCBzaXplb2YodWlkKSkgPCBzaXplb2YodWlkKSkgeworCQlwcmludGVycigwLCAiV0FSTklORzogZmFpbGVkIHJlYWRpbmcgdWlkIGZyb20ga3JiNSAiCisJCQkgICAgInVwY2FsbCBwaXBlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCXJldHVybiBwcm9jZXNzX2tyYjVfdXBjYWxsKGNscCwgdWlkLCBjbHAtPmtyYjVfZmQsIE5VTEwsIE5VTEwpOworfQorCit2b2lkCitoYW5kbGVfc3BrbTNfdXBjYWxsKHN0cnVjdCBjbG50X2luZm8gKmNscCkKK3sKKwl1aWRfdAkJCXVpZDsKKworCWlmIChyZWFkKGNscC0+c3BrbTNfZmQsICZ1aWQsIHNpemVvZih1aWQpKSA8IHNpemVvZih1aWQpKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBmYWlsZWQgcmVhZGluZyB1aWQgZnJvbSBzcGttMyAiCisJCQkgInVwY2FsbCBwaXBlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCXJldHVybiBwcm9jZXNzX3Nwa20zX3VwY2FsbChjbHAsIHVpZCwgY2xwLT5zcGttM19mZCk7Cit9CisKK3ZvaWQKK2hhbmRsZV9nc3NkX3VwY2FsbChzdHJ1Y3QgY2xudF9pbmZvICpjbHApCit7CisJdWlkX3QJCQl1aWQ7CisJY2hhcgkJCSpsYnVmID0gTlVMTDsKKwlpbnQJCQlsYnVmbGVuID0gMDsKKwljaGFyCQkJKnA7CisJY2hhcgkJCSptZWNoID0gTlVMTDsKKwljaGFyCQkJKnRhcmdldCA9IE5VTEw7CisJY2hhcgkJCSpzZXJ2aWNlID0gTlVMTDsKKworCXByaW50ZXJyKDEsICJoYW5kbGluZyBnc3NkIHVwY2FsbCAoJXMpXG4iLCBjbHAtPmRpcm5hbWUpOworCisJaWYgKHJlYWRsaW5lKGNscC0+Z3NzZF9mZCwgJmxidWYsICZsYnVmbGVuKSAhPSAxKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBoYW5kbGVfZ3NzZF91cGNhbGw6ICIKKwkJCSAgICAiZmFpbGVkIHJlYWRpbmcgcmVxdWVzdFxuIik7CisJCXJldHVybjsKKwl9CisJcHJpbnRlcnIoMiwgIiVzOiAnJXMnXG4iLCBfX2Z1bmNfXywgbGJ1Zik7CisKKwkvKiBmaW5kIHRoZSBtZWNoYW5pc20gbmFtZSAqLworCWlmICgocCA9IHN0cnN0cihsYnVmLCAibWVjaD0iKSkgIT0gTlVMTCkgeworCQltZWNoID0gbWFsbG9jKGxidWZsZW4pOworCQlpZiAoIW1lY2gpCisJCQlnb3RvIG91dDsKKwkJaWYgKHNzY2FuZihwLCAibWVjaD0lcyIsIG1lY2gpICE9IDEpIHsKKwkJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBoYW5kbGVfZ3NzZF91cGNhbGw6ICIKKwkJCQkgICAgImZhaWxlZCB0byBwYXJzZSBnc3MgbWVjaGFuaXNtIG5hbWUgIgorCQkJCSAgICAiaW4gdXBjYWxsIHN0cmluZyAnJXMnXG4iLCBsYnVmKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IGhhbmRsZV9nc3NkX3VwY2FsbDogIgorCQkJICAgICJmYWlsZWQgdG8gZmluZCBnc3MgbWVjaGFuaXNtIG5hbWUgIgorCQkJICAgICJpbiB1cGNhbGwgc3RyaW5nICclcydcbiIsIGxidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiByZWFkIHVpZCAqLworCWlmICgocCA9IHN0cnN0cihsYnVmLCAidWlkPSIpKSAhPSBOVUxMKSB7CisJCWlmIChzc2NhbmYocCwgInVpZD0lZCIsICZ1aWQpICE9IDEpIHsKKwkJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBoYW5kbGVfZ3NzZF91cGNhbGw6ICIKKwkJCQkgICAgImZhaWxlZCB0byBwYXJzZSB1aWQgIgorCQkJCSAgICAiaW4gdXBjYWxsIHN0cmluZyAnJXMnXG4iLCBsYnVmKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IGhhbmRsZV9nc3NkX3VwY2FsbDogIgorCQkJICAgICJmYWlsZWQgdG8gZmluZCB1aWQgIgorCQkJICAgICJpbiB1cGNhbGwgc3RyaW5nICclcydcbiIsIGxidWYpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiByZWFkIHRhcmdldCBuYW1lICovCisJaWYgKChwID0gc3Ryc3RyKGxidWYsICJ0YXJnZXQ9IikpICE9IE5VTEwpIHsKKwkJdGFyZ2V0ID0gbWFsbG9jKGxidWZsZW4pOworCQlpZiAoIXRhcmdldCkKKwkJCWdvdG8gb3V0OworCQlpZiAoc3NjYW5mKHAsICJ0YXJnZXQ9JXMiLCB0YXJnZXQpICE9IDEpIHsKKwkJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBoYW5kbGVfZ3NzZF91cGNhbGw6ICIKKwkJCQkgICAgImZhaWxlZCB0byBwYXJzZSB0YXJnZXQgbmFtZSAiCisJCQkJICAgICJpbiB1cGNhbGwgc3RyaW5nICclcydcbiIsIGxidWYpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlYWQgdGhlIHNlcnZpY2UgbmFtZQorCSAqCisJICogVGhlIHByZXNlbmNlIG9mIGF0dHJpYnV0ZSAic2VydmljZT0iIGluZGljYXRlcyB0aGF0IG1hY2hpbmUKKwkgKiBjcmVkZW50aWFscyBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LiAgSWYgdGhlIHZhbHVlCisJICogaXMgIioiLCB0aGVuIGFueSBtYWNoaW5lIGNyZWRlbnRpYWxzIGF2YWlsYWJsZSBjYW4gYmUgdXNlZC4KKwkgKiBJZiB0aGUgdmFsdWUgaXMgYW55dGhpbmcgZWxzZSwgdGhlbiBtYWNoaW5lIGNyZWRlbnRpYWxzIGZvcgorCSAqIHRoZSBzcGVjaWZpZWQgc2VydmljZSBuYW1lIChhbHdheXMgIm5mcyIgZm9yIG5vdykgc2hvdWxkIGJlCisJICogdXNlZC4KKwkgKi8KKwlpZiAoKHAgPSBzdHJzdHIobGJ1ZiwgInNlcnZpY2U9IikpICE9IE5VTEwpIHsKKwkJc2VydmljZSA9IG1hbGxvYyhsYnVmbGVuKTsKKwkJaWYgKCFzZXJ2aWNlKQorCQkJZ290byBvdXQ7CisJCWlmIChzc2NhbmYocCwgInNlcnZpY2U9JXMiLCBzZXJ2aWNlKSAhPSAxKSB7CisJCQlwcmludGVycigwLCAiV0FSTklORzogaGFuZGxlX2dzc2RfdXBjYWxsOiAiCisJCQkJICAgICJmYWlsZWQgdG8gcGFyc2Ugc2VydmljZSB0eXBlICIKKwkJCQkgICAgImluIHVwY2FsbCBzdHJpbmcgJyVzJ1xuIiwgbGJ1Zik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChzdHJjbXAobWVjaCwgImtyYjUiKSA9PSAwKQorCQlwcm9jZXNzX2tyYjVfdXBjYWxsKGNscCwgdWlkLCBjbHAtPmdzc2RfZmQsIHRhcmdldCwgc2VydmljZSk7CisJZWxzZSBpZiAoc3RyY21wKG1lY2gsICJzcGttMyIpID09IDApCisJCXByb2Nlc3Nfc3BrbTNfdXBjYWxsKGNscCwgdWlkLCBjbHAtPmdzc2RfZmQpOworCWVsc2UKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IGhhbmRsZV9nc3NkX3VwY2FsbDogIgorCQkJICAgICJyZWNlaXZlZCB1bmtub3duIGdzcyBtZWNoICclcydcbiIsIG1lY2gpOworCitvdXQ6CisJZnJlZShsYnVmKTsKKwlmcmVlKG1lY2gpOworCWZyZWUodGFyZ2V0KTsKKwlmcmVlKHNlcnZpY2UpOworCXJldHVybjsJCit9CisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2tyYjVfdXRpbC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qva3JiNV91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NWY1NwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2tyYjVfdXRpbC5jCkBAIC0wLDAgKzEsMTMwNiBAQAorLyoKKyAqICBBZGFwdGVkIGluIHBhcnQgZnJvbSBNSVQgS2VyYmVyb3MgNS0xLjIuMSBzbGF2ZS9rcHJvcC5jIGFuZCBmcm9tCisgKiAgaHR0cDovL2RvY3Muc3VuLmNvbS8/cD0vZG9jLzgxNi0xMzMxLzZtN29vOXNtcyZhPXZpZXcKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQW5keSBBZGFtc29uIDxhbmRyb3NAdW1pY2guZWR1PgorICogIEouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0B1bWljaC5lZHU+CisgKiAgTWFyaXVzIEFhbW9kdCBFcmlrc2VuIDxtYXJpdXNAdW1pY2guZWR1PgorICogIEtldmluIENvZmZtYW4gPGt3Y0B1bWljaC5lZHU+CisgKi8KKworLyoKKyAqIHNsYXZlL2twcm9wLmMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MCwxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBFeHBvcnQgb2YgdGhpcyBzb2Z0d2FyZSBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EgbWF5CisgKiAgIHJlcXVpcmUgYSBzcGVjaWZpYyBsaWNlbnNlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudC4KKyAqICAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGNvbnRlbXBsYXRpbmcKKyAqICAgZXhwb3J0IHRvIG9idGFpbiBzdWNoIGEgbGljZW5zZSBiZWZvcmUgZXhwb3J0aW5nLgorICoKKyAqIFdJVEhJTiBUSEFUIENPTlNUUkFJTlQsIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAorICogZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kCisgKiB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcKKyAqIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorICogcGVybWlzc2lvbi4gIEZ1cnRoZXJtb3JlIGlmIHlvdSBtb2RpZnkgdGhpcyBzb2Z0d2FyZSB5b3UgbXVzdCBsYWJlbAorICogeW91ciBzb2Z0d2FyZSBhcyBtb2RpZmllZCBzb2Z0d2FyZSBhbmQgbm90IGRpc3RyaWJ1dGUgaXQgaW4gc3VjaCBhCisgKiBmYXNoaW9uIHRoYXQgaXQgbWlnaHQgYmUgY29uZnVzZWQgd2l0aCB0aGUgb3JpZ2luYWwgTS5JLlQuIHNvZnR3YXJlLgorICogTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKKyAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MKKyAqIG9yIGltcGxpZWQgd2FycmFudHkuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAxOTk0IGJ5IE9wZW5WaXNpb24gVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZQorICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzIGFuZAorICogdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAqIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgT3BlblZpc2lvbiBub3QgYmUgdXNlZAorICogaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBPcGVuVmlzaW9uIG1ha2VzIG5vCisgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogT1BFTlZJU0lPTiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxMIE9QRU5WSVNJT04gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKKyAqIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgorICogT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworLyoKKyAga3JiNV91dGlsLmMKKworICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisjaWZkZWYgVVNFX1BSSVZBVEVfS1JCNV9GVU5DVElPTlMKKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpX2tyYjUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGtyYjUuaD4KKyNpbmNsdWRlIDxycGMvYXV0aF9nc3MuaD4KKworI2luY2x1ZGUgImdzc2QuaCIKKyNpbmNsdWRlICJlcnJfdXRpbC5oIgorI2luY2x1ZGUgImdzc191dGlsLmgiCisjaW5jbHVkZSAia3JiNV91dGlsLmgiCisKKy8qIEdsb2JhbCBsaXN0IG9mIHByaW5jaXBhbHMvY2FjaGUgZmlsZSBuYW1lcyBmb3IgbWFjaGluZSBjcmVkZW50aWFscyAqLworc3RydWN0IGdzc2RfazVfa3RfcHJpbmMgKmdzc2RfazVfa3RfcHJpbmNfbGlzdCA9IE5VTEw7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyo9PT0gIEludGVybmFsIHJvdXRpbmVzID09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBzZWxlY3Rfa3JiNV9jY2FjaGUoY29uc3Qgc3RydWN0IGRpcmVudCAqZCk7CitzdGF0aWMgaW50IGdzc2RfZmluZF9leGlzdGluZ19rcmI1X2NjYWNoZSh1aWRfdCB1aWQsIGNoYXIgKmRpcm5hbWUsCisJCXN0cnVjdCBkaXJlbnQgKipkKTsKK3N0YXRpYyBpbnQgZ3NzZF9nZXRfc2luZ2xlX2tyYjVfY3JlZChrcmI1X2NvbnRleHQgY29udGV4dCwKKwkJa3JiNV9rZXl0YWIga3QsIHN0cnVjdCBnc3NkX2s1X2t0X3ByaW5jICpwbGUsIGludCBub2NhY2hlKTsKK3N0YXRpYyBpbnQgcXVlcnlfa3JiNV9jY2FjaGUoY29uc3QgY2hhciogY3JlZF9jYWNoZSwgY2hhciAqKnJldF9wcmluY25hbWUsCisJCWNoYXIgKipyZXRfcmVhbG0pOworCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHNjYW5kaXIgZnVuY3Rpb24gdG8gd2VlZCBvdXQgcG90ZW50aWFsIGtyYjUKKyAqIGNyZWRlbnRpYWxzIGNhY2hlIGZpbGVzCisgKgorICogUmV0dXJuczoKKyAqCTAgPT4gZG9uJ3Qgc2VsZWN0IHRoaXMgb25lCisgKgkxID0+IHNlbGVjdCB0aGlzIG9uZQorICovCitzdGF0aWMgaW50CitzZWxlY3Rfa3JiNV9jY2FjaGUoY29uc3Qgc3RydWN0IGRpcmVudCAqZCkKK3sKKwkvKgorCSAqIE5vdGU6IFdlIHVzZWQgdG8gY2hlY2sgZC0+ZF90eXBlIGZvciBEVF9SRUcgaGVyZSwKKwkgKiBidXQgYXBwYXJlbmx0eSByZWlzZXI0IGFsd2F5cyBoYXMgRFRfVU5LTk9XTi4KKwkgKiBDaGVjayBmb3IgSVNfUkVHIGFmdGVyIHN0YXQoKSBjYWxsIGluc3RlYWQuCisJICovCisJaWYgKHN0cnN0cihkLT5kX25hbWUsIEdTU0RfREVGQVVMVF9DUkVEX1BSRUZJWCkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb29rIGluIGRpcmVjdG9yeSAiZGlybmFtZSIgZm9yIGZpbGVzIHRoYXQgbG9vayBsaWtlIHRoZXkKKyAqIGFyZSBLZXJiZXJvcyBDcmVkZW50aWFsIENhY2hlIGZpbGVzIGZvciBhIGdpdmVuIFVJRC4gIFJldHVybgorICogbm9uLXplcm8gYW5kIHRoZSBkaXJlbnQgcG9pbnRlciBmb3IgdGhlIGVudHJ5IG1vc3QgbGlrZWx5IHRvIGJlCisgKiB3aGF0IHdlIHdhbnQuIE90aGVyd2lzZSwgcmV0dXJuIHplcm8gYW5kIG5vIGRpcmVudCBwb2ludGVyLgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgZGlyZW50IGlmIG9uZSBpcyByZXR1cm5lZC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgYSB2YWxpZC1sb29raW5nIGVudHJ5IHdhcyBmb3VuZCBhbmQgYSBub24temVybyBlcnJvcgorICogY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK2dzc2RfZmluZF9leGlzdGluZ19rcmI1X2NjYWNoZSh1aWRfdCB1aWQsIGNoYXIgKmRpcm5hbWUsIHN0cnVjdCBkaXJlbnQgKipkKQoreworCXN0cnVjdCBkaXJlbnQgKipuYW1lbGlzdDsKKwlpbnQgbjsKKwlpbnQgaTsKKwlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBkaXJlbnQgKmJlc3RfbWF0Y2hfZGlyID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBiZXN0X21hdGNoX3N0YXQsIHRtcF9zdGF0OworCWNoYXIgYnVmWzEwMzBdOworCWNoYXIgKnByaW5jbmFtZSA9IE5VTEw7CisJY2hhciAqcmVhbG0gPSBOVUxMOworCWludCBzY29yZSwgYmVzdF9tYXRjaF9zY29yZSA9IDAsIGVyciA9IC1FQUNDRVM7CisKKwltZW1zZXQoJmJlc3RfbWF0Y2hfc3RhdCwgMCwgc2l6ZW9mKGJlc3RfbWF0Y2hfc3RhdCkpOworCSpkID0gTlVMTDsKKwluID0gc2NhbmRpcihkaXJuYW1lLCAmbmFtZWxpc3QsIHNlbGVjdF9rcmI1X2NjYWNoZSwgMCk7CisJaWYgKG4gPCAwKSB7CisJCXByaW50ZXJyKDEsICJFcnJvciBkb2luZyBzY2FuZGlyIG9uIGRpcmVjdG9yeSAnJXMnOiAlc1xuIiwKKwkJCWRpcm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWVsc2UgaWYgKG4gPiAwKSB7CisJCWNoYXIgc3RhdG5hbWVbMTAyNF07CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCXNucHJpbnRmKHN0YXRuYW1lLCBzaXplb2Yoc3RhdG5hbWUpLAorCQkJCSAiJXMvJXMiLCBkaXJuYW1lLCBuYW1lbGlzdFtpXS0+ZF9uYW1lKTsKKwkJCXByaW50ZXJyKDMsICJDQyBmaWxlICclcycgYmVpbmcgY29uc2lkZXJlZCwgIgorCQkJCSAid2l0aCBwcmVmZXJyZWQgcmVhbG0gJyVzJ1xuIiwKKwkJCQkgc3RhdG5hbWUsIHByZWZlcnJlZF9yZWFsbSA/CisJCQkJCXByZWZlcnJlZF9yZWFsbSA6ICI8bm9uZSBzZWxlY3RlZD4iKTsKKwkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGSUxFOiVzLyVzIiwgZGlybmFtZSwgCisJCQkJCW5hbWVsaXN0W2ldLT5kX25hbWUpOworCQkJaWYgKGxzdGF0KHN0YXRuYW1lLCAmdG1wX3N0YXQpKSB7CisJCQkJcHJpbnRlcnIoMCwgIkVycm9yIGRvaW5nIHN0YXQgb24gZmlsZSAnJXMnXG4iLAorCQkJCQkgc3RhdG5hbWUpOworCQkJCWZyZWUobmFtZWxpc3RbaV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogT25seSBwaWNrIGNhY2hlcyBvd25lZCBieSB0aGUgdXNlciAodWlkKSAqLworCQkJaWYgKHRtcF9zdGF0LnN0X3VpZCAhPSB1aWQpIHsKKwkJCQlwcmludGVycigzLCAiQ0MgZmlsZSAnJXMnIG93bmVkIGJ5ICV1LCBub3QgJXVcbiIsCisJCQkJCSBzdGF0bmFtZSwgdG1wX3N0YXQuc3RfdWlkLCB1aWQpOworCQkJCWZyZWUobmFtZWxpc3RbaV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFTX0lTUkVHKHRtcF9zdGF0LnN0X21vZGUpKSB7CisJCQkJcHJpbnRlcnIoMywgIkNDIGZpbGUgJyVzJyBpcyBub3QgYSByZWd1bGFyIGZpbGVcbiIsCisJCQkJCSBzdGF0bmFtZSk7CisJCQkJZnJlZShuYW1lbGlzdFtpXSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXF1ZXJ5X2tyYjVfY2NhY2hlKGJ1ZiwgJnByaW5jbmFtZSwgJnJlYWxtKSkgeworCQkJCXByaW50ZXJyKDMsICJDQyBmaWxlICclcycgaXMgZXhwaXJlZCBvciBjb3JydXB0XG4iLAorCQkJCQkgc3RhdG5hbWUpOworCQkJCWZyZWUobmFtZWxpc3RbaV0pOworCQkJCWVyciA9IC1FS0VZRVhQSVJFRDsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc2NvcmUgPSAwOworCQkJaWYgKHByZWZlcnJlZF9yZWFsbSAmJgorCQkJCQlzdHJjbXAocmVhbG0sIHByZWZlcnJlZF9yZWFsbSkgPT0gMCkgCisJCQkJc2NvcmUrKzsKKworCQkJcHJpbnRlcnIoMywgIkNDIGZpbGUgJyVzJyglc0AlcykgcGFzc2VkIGFsbCBjaGVja3MgYW5kIgorCQkJCSAgICAiIGhhcyBtdGltZSBvZiAldVxuIiwKKwkJCQkgc3RhdG5hbWUsIHByaW5jbmFtZSwgcmVhbG0sIAorCQkJCSB0bXBfc3RhdC5zdF9tdGltZSk7CisJCQkvKgorCQkJICogaWYgbW9yZSB0aGFuIG9uZSBtYXRjaCBpcyBmb3VuZCwgcmV0dXJuIHRoZSBtb3N0CisJCQkgKiByZWNlbnQgKHRoZSBvbmUgd2l0aCB0aGUgbGF0ZXN0IG10aW1lKSwgYW5kCisJCQkgKiBkb24ndCBmcmVlIHRoZSBkaXJlbnQKKwkJCSAqLworCQkJaWYgKCFmb3VuZCkgeworCQkJCWJlc3RfbWF0Y2hfZGlyID0gbmFtZWxpc3RbaV07CisJCQkJYmVzdF9tYXRjaF9zdGF0ID0gdG1wX3N0YXQ7CisJCQkJYmVzdF9tYXRjaF9zY29yZSA9IHNjb3JlOworCQkJCWZvdW5kKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKgorCQkJCSAqIElmIGN1cnJlbnQgc2NvcmUgaXMgaGlnaGVyIHRoYW4gYmVzdCBtYXRjaCAKKwkJCQkgKiBzY29yZSwgd2UgdXNlIHRoZSBjdXJyZW50IG1hdGNoLiBPdGhlcndpc2UsCisJCQkJICogaWYgdGhlIGN1cnJlbnQgbWF0Y2ggaGFzIGFuIG10aW1lIGxhdGVyCisJCQkJICogdGhhbiB0aGUgb25lIHdlIGFyZSBsb29raW5nIGF0LCB0aGVuIHVzZQorCQkJCSAqIHRoZSBjdXJyZW50IG1hdGNoLiAgT3RoZXJ3aXNlLCB3ZSBzdGlsbAorCQkJCSAqIGhhdmUgdGhlIGJlc3QgbWF0Y2guCisJCQkJICovCisJCQkJaWYgKGJlc3RfbWF0Y2hfc2NvcmUgPCBzY29yZSB8fAorCQkJCSAgICAoYmVzdF9tYXRjaF9zY29yZSA9PSBzY29yZSAmJiAKKwkJCQkgICAgICAgdG1wX3N0YXQuc3RfbXRpbWUgPgorCQkJCQkgICAgYmVzdF9tYXRjaF9zdGF0LnN0X210aW1lKSkgeworCQkJCQlmcmVlKGJlc3RfbWF0Y2hfZGlyKTsKKwkJCQkJYmVzdF9tYXRjaF9kaXIgPSBuYW1lbGlzdFtpXTsKKwkJCQkJYmVzdF9tYXRjaF9zdGF0ID0gdG1wX3N0YXQ7CisJCQkJCWJlc3RfbWF0Y2hfc2NvcmUgPSBzY29yZTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWZyZWUobmFtZWxpc3RbaV0pOworCQkJCX0KKwkJCQlwcmludGVycigzLCAiQ0MgZmlsZSAnJXMvJXMnIGlzIG91ciAiCisJCQkJCSAgICAiY3VycmVudCBiZXN0IG1hdGNoICIKKwkJCQkJICAgICJ3aXRoIG10aW1lIG9mICV1XG4iLAorCQkJCQkgZGlybmFtZSwgYmVzdF9tYXRjaF9kaXItPmRfbmFtZSwKKwkJCQkJIGJlc3RfbWF0Y2hfc3RhdC5zdF9tdGltZSk7CisJCQl9CisJCQlmcmVlKHByaW5jbmFtZSk7CisJCQlmcmVlKHJlYWxtKTsKKwkJfQorCQlmcmVlKG5hbWVsaXN0KTsKKwl9CisJaWYgKGZvdW5kKSB7CisJCSpkID0gYmVzdF9tYXRjaF9kaXI7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKworI2lmZGVmIEhBVkVfU0VUX0FMTE9XQUJMRV9FTkNUWVBFUworLyoKKyAqIHRoaXMgcm91dGluZSBvYnRhaW5zIGEgY3JlZGVudGlhbHMgaGFuZGxlIHZpYSBnc3NfYWNxdWlyZV9jcmVkKCkKKyAqIHRoZW4gY2FsbHMgZ3NzX2tyYjVfc2V0X2FsbG93YWJsZV9lbmN0eXBlcygpIHRvIGxpbWl0IHRoZSBlbmNyeXB0aW9uCisgKiB0eXBlcyBuZWdvdGlhdGVkLgorICoKKyAqIFhYWCBTaG91bGQgY2FsbCBzb21lIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgZW5jdHlwZXMgc3VwcG9ydGVkCisgKiBieSB0aGUga2VybmVsLiAoT25seSBuZWVkIHRvIGRvIHRoYXQgb25jZSEpCisgKgorICogUmV0dXJuczoKKyAqCTAgPT4gYWxsIHdlbnQgd2VsbAorICogICAgIC0xID0+IHRoZXJlIHdhcyBhbiBlcnJvcgorICovCisKK2ludAorbGltaXRfa3JiNV9lbmN0eXBlcyhzdHJ1Y3QgcnBjX2dzc19zZWMgKnNlYywgdWlkX3QgdWlkKQoreworCXVfaW50IG1hal9zdGF0LCBtaW5fc3RhdDsKKwlnc3NfY3JlZF9pZF90IGNyZWRoOworCWdzc19PSURfc2V0X2Rlc2MgIGRlc2lyZWRfbWVjaHM7CisJa3JiNV9lbmN0eXBlIGVuY3R5cGVzW10gPSB7IEVOQ1RZUEVfREVTX0NCQ19DUkMsCisJCQkJICAgIEVOQ1RZUEVfREVTX0NCQ19NRDUsCisJCQkJICAgIEVOQ1RZUEVfREVTX0NCQ19NRDQgfTsKKwlpbnQgbnVtX2VuY3R5cGVzID0gc2l6ZW9mKGVuY3R5cGVzKSAvIHNpemVvZihlbmN0eXBlc1swXSk7CisKKwkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgZ2V0dGluZyBhIGtyYjUgY3JlZCAqLworCWRlc2lyZWRfbWVjaHMuY291bnQgPSAxOworCWRlc2lyZWRfbWVjaHMuZWxlbWVudHMgPSAma3JiNW9pZDsKKworCW1hal9zdGF0ID0gZ3NzX2FjcXVpcmVfY3JlZCgmbWluX3N0YXQsIE5VTEwsIDAsCisJCQkJICAgICZkZXNpcmVkX21lY2hzLCBHU1NfQ19JTklUSUFURSwKKwkJCQkgICAgJmNyZWRoLCBOVUxMLCBOVUxMKTsKKworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkgeworCQlpZiAoZ2V0X3ZlcmJvc2l0eSgpID4gMCkKKwkJCXBnc3NlcnIoImdzc19hY3F1aXJlX2NyZWQiLAorCQkJCW1hal9zdGF0LCBtaW5fc3RhdCwgJmtyYjVvaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWFqX3N0YXQgPSBnc3Nfc2V0X2FsbG93YWJsZV9lbmN0eXBlcygmbWluX3N0YXQsIGNyZWRoLCAma3JiNW9pZCwKKwkJCQkJICAgICBudW1fZW5jdHlwZXMsICZlbmN0eXBlcyk7CisJaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFKSB7CisJCXBnc3NlcnIoImdzc19zZXRfYWxsb3dhYmxlX2VuY3R5cGVzIiwKKwkJCW1hal9zdGF0LCBtaW5fc3RhdCwgJmtyYjVvaWQpOworCQlnc3NfcmVsZWFzZV9jcmVkKCZtaW5fc3RhdCwgJmNyZWRoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWMtPmNyZWQgPSBjcmVkaDsKKworCXJldHVybiAwOworfQorI2VuZGlmCS8qIEhBVkVfU0VUX0FMTE9XQUJMRV9FTkNUWVBFUyAqLworCisvKgorICogT2J0YWluIGNyZWRlbnRpYWxzIHZpYSBhIGtleSBpbiB0aGUga2V5dGFiIGdpdmVuCisgKiBhIGtleXRhYiBoYW5kbGUgYW5kIGEgZ3NzZF9rNV9rdF9wcmluYyBzdHJ1Y3R1cmUuCisgKiBDaGVja3MgdG8gc2VlIGlmIGN1cnJlbnQgY3JlZGVudGlhbHMgYXJlIGV4cGlyZWQsCisgKiBpZiBub3QsIHVzZXMgdGhlIGtleXRhYiB0byBvYnRhaW4gbmV3IGNyZWRlbnRpYWxzLgorICoKKyAqIFJldHVybnM6CisgKgkwID0+IHN1Y2Nlc3MgKG9yIGNyZWRlbnRpYWxzIGhhdmUgbm90IGV4cGlyZWQpCisgKglub256ZXJvID0+IGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK2dzc2RfZ2V0X3NpbmdsZV9rcmI1X2NyZWQoa3JiNV9jb250ZXh0IGNvbnRleHQsCisJCQkgIGtyYjVfa2V5dGFiIGt0LAorCQkJICBzdHJ1Y3QgZ3NzZF9rNV9rdF9wcmluYyAqcGxlLAorCQkJICBpbnQgbm9jYWNoZSkKK3sKKyNpZiBIQVZFX0tSQjVfR0VUX0lOSVRfQ1JFRFNfT1BUX1NFVF9BRERSRVNTTEVTUworCWtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0ICppbml0X29wdHMgPSBOVUxMOworI2Vsc2UKKwlrcmI1X2dldF9pbml0X2NyZWRzX29wdCBvcHRpb25zOworI2VuZGlmCisJa3JiNV9nZXRfaW5pdF9jcmVkc19vcHQgKm9wdHM7CisJa3JiNV9jcmVkcyBteV9jcmVkczsKKwlrcmI1X2NjYWNoZSBjY2FjaGUgPSBOVUxMOworCWNoYXIga3RfbmFtZVtCVUZTSVpdOworCWNoYXIgY2NfbmFtZVtCVUZTSVpdOworCWludCBjb2RlOworCXRpbWVfdCBub3cgPSB0aW1lKDApOworCWNoYXIgKmNhY2hlX3R5cGU7CisJY2hhciAqcG5hbWUgPSBOVUxMOworCWNoYXIgKms1ZXJyID0gTlVMTDsKKworCW1lbXNldCgmbXlfY3JlZHMsIDAsIHNpemVvZihteV9jcmVkcykpOworCisJaWYgKHBsZS0+Y2NuYW1lICYmIHBsZS0+ZW5kdGltZSA+IG5vdyAmJiAhbm9jYWNoZSkgeworCQlwcmludGVycigyLCAiSU5GTzogQ3JlZGVudGlhbHMgaW4gQ0MgJyVzJyBhcmUgZ29vZCB1bnRpbCAlZFxuIiwKKwkJCSBwbGUtPmNjbmFtZSwgcGxlLT5lbmR0aW1lKTsKKwkJY29kZSA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoY29kZSA9IGtyYjVfa3RfZ2V0X25hbWUoY29udGV4dCwga3QsIGt0X25hbWUsIEJVRlNJWikpKSB7CisJCXByaW50ZXJyKDAsICJFUlJPUjogVW5hYmxlIHRvIGdldCBrZXl0YWIgbmFtZSBpbiAiCisJCQkgICAgImdzc2RfZ2V0X3NpbmdsZV9rcmI1X2NyZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGtyYjVfdW5wYXJzZV9uYW1lKGNvbnRleHQsIHBsZS0+cHJpbmMsICZwbmFtZSkpKQorCQlwbmFtZSA9IE5VTEw7CisKKyNpZiBIQVZFX0tSQjVfR0VUX0lOSVRfQ1JFRFNfT1BUX1NFVF9BRERSRVNTTEVTUworCWNvZGUgPSBrcmI1X2dldF9pbml0X2NyZWRzX29wdF9hbGxvYyhjb250ZXh0LCAmaW5pdF9vcHRzKTsKKwlpZiAoY29kZSkgeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCBjb2RlKTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiAlcyBhbGxvY2F0aW5nIGdpYyBvcHRpb25zXG4iLCBrNWVycik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoa3JiNV9nZXRfaW5pdF9jcmVkc19vcHRfc2V0X2FkZHJlc3NsZXNzKGNvbnRleHQsIGluaXRfb3B0cywgMSkpCisJCXByaW50ZXJyKDEsICJXQVJOSU5HOiBVbmFibGUgdG8gc2V0IG9wdGlvbiBmb3IgYWRkcmVzc2xlc3MgIgorCQkJICJ0aWNrZXRzLiAgTWF5IGhhdmUgcHJvYmxlbXMgYmVoaW5kIGEgTkFULlxuIik7CisjaWZkZWYgVEVTVF9TSE9SVF9MSUZFVElNRQorCS8qIHNldCBhIHNob3J0IGxpZmV0aW1lIChmb3IgZGVidWdnaW5nIG9ubHkhKSAqLworCXByaW50ZXJyKDAsICJXQVJOSU5HOiBVc2luZyAoZGVidWcpIHNob3J0IG1hY2hpbmUgY3JlZCBsaWZldGltZSFcbiIpOworCWtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0X3NldF90a3RfbGlmZShpbml0X29wdHMsIDUqNjApOworI2VuZGlmCisJb3B0cyA9IGluaXRfb3B0czsKKworI2Vsc2UJLyogSEFWRV9LUkI1X0dFVF9JTklUX0NSRURTX09QVF9TRVRfQUREUkVTU0xFU1MgKi8KKworCWtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0X2luaXQoJm9wdGlvbnMpOworCWtyYjVfZ2V0X2luaXRfY3JlZHNfb3B0X3NldF9hZGRyZXNzX2xpc3QoJm9wdGlvbnMsIE5VTEwpOworI2lmZGVmIFRFU1RfU0hPUlRfTElGRVRJTUUKKwkvKiBzZXQgYSBzaG9ydCBsaWZldGltZSAoZm9yIGRlYnVnZ2luZyBvbmx5ISkgKi8KKwlwcmludGVycigwLCAiV0FSTklORzogVXNpbmcgKGRlYnVnKSBzaG9ydCBtYWNoaW5lIGNyZWQgbGlmZXRpbWUhXG4iKTsKKwlrcmI1X2dldF9pbml0X2NyZWRzX29wdF9zZXRfdGt0X2xpZmUoJm9wdGlvbnMsIDUqNjApOworI2VuZGlmCisJb3B0cyA9ICZvcHRpb25zOworI2VuZGlmCisKKwlpZiAoKGNvZGUgPSBrcmI1X2dldF9pbml0X2NyZWRzX2tleXRhYihjb250ZXh0LCAmbXlfY3JlZHMsIHBsZS0+cHJpbmMsCisJCQkJCSAgICAgICBrdCwgMCwgTlVMTCwgb3B0cykpKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIGNvZGUpOworCQlwcmludGVycigxLCAiV0FSTklORzogJXMgd2hpbGUgZ2V0dGluZyBpbml0aWFsIHRpY2tldCBmb3IgIgorCQkJICJwcmluY2lwYWwgJyVzJyB1c2luZyBrZXl0YWIgJyVzJ1xuIiwgazVlcnIsCisJCQkgcG5hbWUgPyBwbmFtZSA6ICI8dW5wYXJzYWJsZT4iLCBrdF9uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGNhY2hlIGZpbGUgd2hpY2ggd2UncmUgZ29pbmcgdG8gYmUgdXNpbmcKKwkgKi8KKworCWlmICh1c2VfbWVtY2FjaGUpCisJICAgIGNhY2hlX3R5cGUgPSAiTUVNT1JZIjsKKwllbHNlCisJICAgIGNhY2hlX3R5cGUgPSAiRklMRSI7CisJc25wcmludGYoY2NfbmFtZSwgc2l6ZW9mKGNjX25hbWUpLCAiJXM6JXMvJXMlc18lcyIsCisJCWNhY2hlX3R5cGUsCisJCWNjYWNoZXNlYXJjaFswXSwgR1NTRF9ERUZBVUxUX0NSRURfUFJFRklYLAorCQlHU1NEX0RFRkFVTFRfTUFDSElORV9DUkVEX1NVRkZJWCwgcGxlLT5yZWFsbSk7CisJcGxlLT5lbmR0aW1lID0gbXlfY3JlZHMudGltZXMuZW5kdGltZTsKKwlpZiAocGxlLT5jY25hbWUgIT0gTlVMTCkKKwkJZnJlZShwbGUtPmNjbmFtZSk7CisJcGxlLT5jY25hbWUgPSBzdHJkdXAoY2NfbmFtZSk7CisJaWYgKHBsZS0+Y2NuYW1lID09IE5VTEwpIHsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiBubyBzdG9yYWdlIHRvIGR1cGxpY2F0ZSBjcmVkZW50aWFscyAiCisJCQkgICAgImNhY2hlIG5hbWUgJyVzJ1xuIiwgY2NfbmFtZSk7CisJCWNvZGUgPSBFTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlpZiAoKGNvZGUgPSBrcmI1X2NjX3Jlc29sdmUoY29udGV4dCwgY2NfbmFtZSwgJmNjYWNoZSkpKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIGNvZGUpOworCQlwcmludGVycigwLCAiRVJST1I6ICVzIHdoaWxlIG9wZW5pbmcgY3JlZGVudGlhbCBjYWNoZSAnJXMnXG4iLAorCQkJIGs1ZXJyLCBjY19uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgoY29kZSA9IGtyYjVfY2NfaW5pdGlhbGl6ZShjb250ZXh0LCBjY2FjaGUsIHBsZS0+cHJpbmMpKSkgeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCBjb2RlKTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiAlcyB3aGlsZSBpbml0aWFsaXppbmcgY3JlZGVudGlhbCAiCisJCQkgImNhY2hlICclcydcbiIsIGs1ZXJyLCBjY19uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICgoY29kZSA9IGtyYjVfY2Nfc3RvcmVfY3JlZChjb250ZXh0LCBjY2FjaGUsICZteV9jcmVkcykpKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIGNvZGUpOworCQlwcmludGVycigwLCAiRVJST1I6ICVzIHdoaWxlIHN0b3JpbmcgY3JlZGVudGlhbHMgaW4gJyVzJ1xuIiwKKwkJCSBrNWVyciwgY2NfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWNvZGUgPSAwOworCXByaW50ZXJyKDIsICJTdWNjZXNzZnVsbHkgb2J0YWluZWQgbWFjaGluZSBjcmVkZW50aWFscyBmb3IgIgorCQkgInByaW5jaXBhbCAnJXMnIHN0b3JlZCBpbiBjY2FjaGUgJyVzJ1xuIiwgcG5hbWUsIGNjX25hbWUpOworICBvdXQ6CisjaWYgSEFWRV9LUkI1X0dFVF9JTklUX0NSRURTX09QVF9TRVRfQUREUkVTU0xFU1MKKwlpZiAoaW5pdF9vcHRzKQorCQlrcmI1X2dldF9pbml0X2NyZWRzX29wdF9mcmVlKGNvbnRleHQsIGluaXRfb3B0cyk7CisjZW5kaWYKKwlpZiAocG5hbWUpCisJCWs1X2ZyZWVfdW5wYXJzZWRfbmFtZShjb250ZXh0LCBwbmFtZSk7CisJaWYgKGNjYWNoZSkKKwkJa3JiNV9jY19jbG9zZShjb250ZXh0LCBjY2FjaGUpOworCWtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGNvbnRleHQsICZteV9jcmVkcyk7CisJZnJlZShrNWVycik7CisJcmV0dXJuIChjb2RlKTsKK30KKworLyoKKyAqIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBLZXJiZXJvcywgd2UgZWl0aGVyIG5lZWQgdG8gdXNlCisgKiBhIHByaXZhdGUgZnVuY3Rpb24sIG9yIHNpbXBseSBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICovCitzdGF0aWMgdm9pZAorZ3NzZF9zZXRfa3JiNV9jY2FjaGVfbmFtZShjaGFyICpjY25hbWUpCit7CisjaWZkZWYgVVNFX0dTU19LUkI1X0NDQUNIRV9OQU1FCisJdV9pbnQJbWFqX3N0YXQsIG1pbl9zdGF0OworCisJcHJpbnRlcnIoMiwgInVzaW5nIGdzc19rcmI1X2NjYWNoZV9uYW1lIHRvIHNlbGVjdCBrcmI1IGNjYWNoZSAlc1xuIiwKKwkJIGNjbmFtZSk7CisJbWFqX3N0YXQgPSBnc3Nfa3JiNV9jY2FjaGVfbmFtZSgmbWluX3N0YXQsIGNjbmFtZSwgTlVMTCk7CisJaWYgKG1hal9zdGF0ICE9IEdTU19TX0NPTVBMRVRFKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBnc3Nfa3JiNV9jY2FjaGVfbmFtZSB3aXRoICIKKwkJCSJuYW1lICclcycgZmFpbGVkICglcylcbiIsCisJCQljY25hbWUsIGVycm9yX21lc3NhZ2UobWluX3N0YXQpKTsKKwl9CisjZWxzZQorCS8qCisJICogU2V0IHRoZSBLUkI1Q0NOQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlbGwgdGhlIGtyYjUgY29kZQorCSAqIHdoaWNoIGNyZWRlbnRpYWxzIGNhY2hlIHRvIHVzZS4gIChJbnN0ZWFkIG9mIHVzaW5nIHRoZSBwcml2YXRlCisJICogZnVuY3Rpb24gYWJvdmUgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIGdlbmVyaWMgZ3NzYXBpCisJICogZXF1aXZhbGVudC4pCisJICovCisJcHJpbnRlcnIoMiwgInVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNlbGVjdCBrcmI1IGNjYWNoZSAlc1xuIiwKKwkJIGNjbmFtZSk7CisJc2V0ZW52KCJLUkI1Q0NOQU1FIiwgY2NuYW1lLCAxKTsKKyNlbmRpZgorfQorCisvKgorICogR2l2ZW4gYSBwcmluY2lwYWwsIGZpbmQgYSBtYXRjaGluZyBwbGUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ3NzZF9rNV9rdF9wcmluYyAqCitmaW5kX3BsZV9ieV9wcmluYyhrcmI1X2NvbnRleHQgY29udGV4dCwga3JiNV9wcmluY2lwYWwgcHJpbmMpCit7CisJc3RydWN0IGdzc2RfazVfa3RfcHJpbmMgKnBsZTsKKworCWZvciAocGxlID0gZ3NzZF9rNV9rdF9wcmluY19saXN0OyBwbGUgIT0gTlVMTDsgcGxlID0gcGxlLT5uZXh0KSB7CisJCWlmIChrcmI1X3ByaW5jaXBhbF9jb21wYXJlKGNvbnRleHQsIHBsZS0+cHJpbmMsIHByaW5jKSkKKwkJCXJldHVybiBwbGU7CisJfQorCS8qIG5vIG1hdGNoIGZvdW5kICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDcmVhdGUsIGluaXRpYWxpemUsIGFuZCBhZGQgYSBuZXcgcGxlIHN0cnVjdHVyZSB0byB0aGUgZ2xvYmFsIGxpc3QKKyAqLworc3RhdGljIHN0cnVjdCBnc3NkX2s1X2t0X3ByaW5jICoKK25ld19wbGUoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfcHJpbmNpcGFsIHByaW5jKQoreworCXN0cnVjdCBnc3NkX2s1X2t0X3ByaW5jICpwbGUgPSBOVUxMLCAqcDsKKwlrcmI1X2Vycm9yX2NvZGUgY29kZTsKKwljaGFyICpkZWZhdWx0X3JlYWxtOworCWludCBpc19kZWZhdWx0X3JlYWxtID0gMDsKKworCXBsZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGdzc2RfazVfa3RfcHJpbmMpKTsKKwlpZiAocGxlID09IE5VTEwpCisJCWdvdG8gb3V0ZXJyOworCW1lbXNldChwbGUsIDAsIHNpemVvZigqcGxlKSk7CisKKyNpZmRlZiBIQVZFX0tSQjUKKwlwbGUtPnJlYWxtID0gc3RybmR1cChwcmluYy0+cmVhbG0uZGF0YSwKKwkJCSAgICAgcHJpbmMtPnJlYWxtLmxlbmd0aCk7CisjZWxzZQorCXBsZS0+cmVhbG0gPSBzdHJkdXAocHJpbmMtPnJlYWxtKTsKKyNlbmRpZgorCWlmIChwbGUtPnJlYWxtID09IE5VTEwpCisJCWdvdG8gb3V0ZXJyOworCWNvZGUgPSBrcmI1X2NvcHlfcHJpbmNpcGFsKGNvbnRleHQsIHByaW5jLCAmcGxlLT5wcmluYyk7CisJaWYgKGNvZGUpCisJCWdvdG8gb3V0ZXJyOworCisJLyoKKwkgKiBBZGQgbmV3IGVudHJ5IG9udG8gdGhlIGxpc3QgKGlmIHRoaXMgaXMgdGhlIGRlZmF1bHQKKwkgKiByZWFsbSwgYWx3YXlzIGFkZCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QpCisJICovCisKKwljb2RlID0ga3JiNV9nZXRfZGVmYXVsdF9yZWFsbShjb250ZXh0LCAmZGVmYXVsdF9yZWFsbSk7CisJaWYgKGNvZGUgPT0gMCkgeworCQlpZiAoc3RyY21wKHBsZS0+cmVhbG0sIGRlZmF1bHRfcmVhbG0pID09IDApCisJCQlpc19kZWZhdWx0X3JlYWxtID0gMTsKKwkJazVfZnJlZV9kZWZhdWx0X3JlYWxtKGNvbnRleHQsIGRlZmF1bHRfcmVhbG0pOworCX0KKworCWlmIChpc19kZWZhdWx0X3JlYWxtKSB7CisJCXBsZS0+bmV4dCA9IGdzc2RfazVfa3RfcHJpbmNfbGlzdDsKKwkJZ3NzZF9rNV9rdF9wcmluY19saXN0ID0gcGxlOworCX0gZWxzZSB7CisJCXAgPSBnc3NkX2s1X2t0X3ByaW5jX2xpc3Q7CisJCXdoaWxlIChwICE9IE5VTEwgJiYgcC0+bmV4dCAhPSBOVUxMKQorCQkJcCA9IHAtPm5leHQ7CisJCWlmIChwID09IE5VTEwpCisJCQlnc3NkX2s1X2t0X3ByaW5jX2xpc3QgPSBwbGU7CisJCWVsc2UKKwkJCXAtPm5leHQgPSBwbGU7CisJfQorCisJcmV0dXJuIHBsZTsKK291dGVycjoKKwlpZiAocGxlKSB7CisJCWlmIChwbGUtPnJlYWxtKQorCQkJZnJlZShwbGUtPnJlYWxtKTsKKwkJZnJlZShwbGUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEdpdmVuIGEgcHJpbmNpcGFsLCBmaW5kIGFuIGV4aXN0aW5nIHBsZSBzdHJ1Y3R1cmUsIG9yIGNyZWF0ZSBvbmUKKyAqLworc3RhdGljIHN0cnVjdCBnc3NkX2s1X2t0X3ByaW5jICoKK2dldF9wbGVfYnlfcHJpbmMoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfcHJpbmNpcGFsIHByaW5jKQoreworCXN0cnVjdCBnc3NkX2s1X2t0X3ByaW5jICpwbGU7CisKKwkvKiBOZWVkIHRvIHNlcmlhbGl6ZSBsaXN0IGlmIHdlIGV2ZXIgYmVjb21lIG11bHRpLXRocmVhZGVkISAqLworCisJcGxlID0gZmluZF9wbGVfYnlfcHJpbmMoY29udGV4dCwgcHJpbmMpOworCWlmIChwbGUgPT0gTlVMTCkgeworCQlwbGUgPSBuZXdfcGxlKGNvbnRleHQsIHByaW5jKTsKKwl9CisKKwlyZXR1cm4gcGxlOworfQorCisvKgorICogR2l2ZW4gYSAocG9zc2libHkgdW5xdWFsaWZpZWQpIGhvc3RuYW1lLAorICogcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgKGxvd2VyLWNhc2UhKSBob3N0bmFtZQorICovCitzdGF0aWMgaW50CitnZXRfZnVsbF9ob3N0bmFtZShjb25zdCBjaGFyICppbmhvc3QsIGNoYXIgKm91dGhvc3QsIGludCBvdXRob3N0bGVuKQoreworCXN0cnVjdCBhZGRyaW5mbyAqYWRkcnMgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKKwlpbnQgcmV0dmFsOworCWNoYXIgKmM7CisKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCWhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKwloaW50cy5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsKKworCS8qIEdldCBmdWxsIHRhcmdldCBob3N0bmFtZSAqLworCXJldHZhbCA9IGdldGFkZHJpbmZvKGluaG9zdCwgTlVMTCwgJmhpbnRzLCAmYWRkcnMpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRlcnIoMSwgIiVzIHdoaWxlIGdldHRpbmcgZnVsbCBob3N0bmFtZSBmb3IgJyVzJ1xuIiwKKwkJCSBnYWlfc3RyZXJyb3IocmV0dmFsKSwgaW5ob3N0KTsKKwkJZ290byBvdXQ7CisJfQorCXN0cm5jcHkob3V0aG9zdCwgYWRkcnMtPmFpX2Nhbm9ubmFtZSwgb3V0aG9zdGxlbik7CisJZnJlZWFkZHJpbmZvKGFkZHJzKTsKKwlmb3IgKGMgPSBvdXRob3N0OyAqYyAhPSAnXDAnOyBjKyspCisJICAgICpjID0gdG9sb3dlcigqYyk7CisKKwlwcmludGVycigzLCAiRnVsbCBob3N0bmFtZSBmb3IgJyVzJyBpcyAnJXMnXG4iLCBpbmhvc3QsIG91dGhvc3QpOworCXJldHZhbCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogCisgKiBJZiBwcmluY2lwYWwgbWF0Y2hlcyB0aGUgZ2l2ZW4gcmVhbG0gYW5kIHNlcnZpY2UgbmFtZSwKKyAqIGFuZCBoYXMgKmFueSogaW5zdGFuY2UgKGhvc3RuYW1lKSwgcmV0dXJuIDEuCisgKiBPdGhlcndpc2UgcmV0dXJuIDAsIGluZGljYXRpbmcgbm8gbWF0Y2guCisgKi8KK3N0YXRpYyBpbnQKK3JlYWxtX2FuZF9zZXJ2aWNlX21hdGNoKGtyYjVfY29udGV4dCBjb250ZXh0LCBrcmI1X3ByaW5jaXBhbCBwLAorCQkJY29uc3QgY2hhciAqcmVhbG0sIGNvbnN0IGNoYXIgKnNlcnZpY2UpCit7CisjaWZkZWYgSEFWRV9LUkI1CisJLyogTXVzdCBoYXZlIHR3byBjb21wb25lbnRzICovCisJaWYgKHAtPmxlbmd0aCAhPSAyKQorCQlyZXR1cm4gMDsKKwlpZiAoKHN0cmxlbihyZWFsbSkgPT0gcC0+cmVhbG0ubGVuZ3RoKQorCSAgICAmJiAoc3RybmNtcChyZWFsbSwgcC0+cmVhbG0uZGF0YSwgcC0+cmVhbG0ubGVuZ3RoKSA9PSAwKQorCSAgICAmJiAoc3RybGVuKHNlcnZpY2UpID09IHAtPmRhdGFbMF0ubGVuZ3RoKQorCSAgICAmJiAoc3RybmNtcChzZXJ2aWNlLCBwLT5kYXRhWzBdLmRhdGEsIHAtPmRhdGFbMF0ubGVuZ3RoKSA9PSAwKSkKKwkJcmV0dXJuIDE7CisjZWxzZQorCWNvbnN0IGNoYXIgKm5hbWUsICppbnN0OworCisJaWYgKHAtPm5hbWUubmFtZV9zdHJpbmcubGVuICE9IDIpCisJCXJldHVybiAwOworCW5hbWUgPSBrcmI1X3ByaW5jaXBhbF9nZXRfY29tcF9zdHJpbmcoY29udGV4dCwgcCwgMCk7CisJaW5zdCA9IGtyYjVfcHJpbmNpcGFsX2dldF9jb21wX3N0cmluZyhjb250ZXh0LCBwLCAxKTsKKwlpZiAobmFtZSA9PSBOVUxMIHx8IGluc3QgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKChzdHJjbXAocmVhbG0sIHAtPnJlYWxtKSA9PSAwKQorCSAgICAmJiAoc3RyY21wKHNlcnZpY2UsIG5hbWUpID09IDApKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogU2VhcmNoIHRoZSBnaXZlbiBrZXl0YWIgZmlsZSBsb29raW5nIGZvciBhbiBlbnRyeSB3aXRoIHRoZSBnaXZlbgorICogc2VydmljZSBuYW1lIGFuZCByZWFsbSwgaWdub3JpbmcgaG9zdG5hbWUgKGluc3RhbmNlKS4KKyAqCisgKiBSZXR1cm5zOgorICoJMCA9PiBObyBlcnJvcgorICoJbm9uLXplcm8gPT4gQW4gZXJyb3Igb2NjdXJyZWQKKyAqCisgKiBJZiBhIGtleXRhYiBlbnRyeSBpcyBmb3VuZCwgImZvdW5kIiBpcyBzZXQgdG8gb25lLCBhbmQgdGhlIGtleXRhYgorICogZW50cnkgaXMgcmV0dXJuZWQgaW4gImt0ZSIuICBPdGhlcndpc2UsICJmb3VuZCIgaXMgemVybywgYW5kIHRoZQorICogdmFsdWUgb2YgImt0ZSIgaXMgdW5wcmVkaWN0YWJsZS4KKyAqLworc3RhdGljIGludAorZ3NzZF9zZWFyY2hfa3JiNV9rZXl0YWIoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfa2V5dGFiIGt0LAorCQkJY29uc3QgY2hhciAqcmVhbG0sIGNvbnN0IGNoYXIgKnNlcnZpY2UsCisJCQlpbnQgKmZvdW5kLCBrcmI1X2tleXRhYl9lbnRyeSAqa3RlKQoreworCWtyYjVfa3RfY3Vyc29yIGN1cnNvcjsKKwlrcmI1X2Vycm9yX2NvZGUgY29kZTsKKwlzdHJ1Y3QgZ3NzZF9rNV9rdF9wcmluYyAqcGxlOworCWludCByZXR2YWwgPSAtMTsKKwljaGFyIGt0X25hbWVbQlVGU0laXTsKKwljaGFyICpwbmFtZTsKKwljaGFyICprNWVyciA9IE5VTEw7CisKKwlpZiAoZm91bmQgPT0gTlVMTCkgeworCQlyZXR2YWwgPSBFSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwkqZm91bmQgPSAwOworCisJLyoKKwkgKiBMb29rIHRocm91Z2ggZWFjaCBlbnRyeSBpbiB0aGUga2V5dGFiIGZpbGUgYW5kIGRldGVybWluZQorCSAqIGlmIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIGl0IGFzIG1hY2hpbmUgY3JlZGVudGlhbHMuICBJZiBzbywKKwkgKiBzYXZlIGluZm8gaW4gdGhlIGdsb2JhbCBwcmluY2lwYWwgbGlzdCAoZ3NzZF9rNV9rdF9wcmluY19saXN0KS4KKwkgKi8KKwlpZiAoKGNvZGUgPSBrcmI1X2t0X2dldF9uYW1lKGNvbnRleHQsIGt0LCBrdF9uYW1lLCBCVUZTSVopKSkgeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCBjb2RlKTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiAlcyBhdHRlbXB0aW5nIHRvIGdldCBrZXl0YWIgbmFtZVxuIiwgazVlcnIpOworCQlyZXR2YWwgPSBjb2RlOworCQlnb3RvIG91dDsKKwl9CisJaWYgKChjb2RlID0ga3JiNV9rdF9zdGFydF9zZXFfZ2V0KGNvbnRleHQsIGt0LCAmY3Vyc29yKSkpIHsKKwkJazVlcnIgPSBnc3NkX2s1X2Vycl9tc2coY29udGV4dCwgY29kZSk7CisJCXByaW50ZXJyKDAsICJFUlJPUjogJXMgd2hpbGUgYmVnaW5uaW5nIGtleXRhYiBzY2FuICIKKwkJCSAgICAiZm9yIGtleXRhYiAnJXMnXG4iLCBrNWVyciwga3RfbmFtZSk7CisJCXJldHZhbCA9IGNvZGU7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlICgoY29kZSA9IGtyYjVfa3RfbmV4dF9lbnRyeShjb250ZXh0LCBrdCwga3RlLCAmY3Vyc29yKSkgPT0gMCkgeworCQlpZiAoKGNvZGUgPSBrcmI1X3VucGFyc2VfbmFtZShjb250ZXh0LCBrdGUtPnByaW5jaXBhbCwKKwkJCQkJICAgICAgJnBuYW1lKSkpIHsKKwkJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIGNvZGUpOworCQkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IFNraXBwaW5nIGtleXRhYiBlbnRyeSBiZWNhdXNlICIKKwkJCQkgIndlIGZhaWxlZCB0byB1bnBhcnNlIHByaW5jaXBhbCBuYW1lOiAlc1xuIiwKKwkJCQkgazVlcnIpOworCQkJazVfZnJlZV9rdF9lbnRyeShjb250ZXh0LCBrdGUpOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRlcnIoNCwgIlByb2Nlc3Npbmcga2V5dGFiIGVudHJ5IGZvciBwcmluY2lwYWwgJyVzJ1xuIiwKKwkJCSBwbmFtZSk7CisJCS8qIFVzZSB0aGUgZmlyc3QgbWF0Y2hpbmcga2V5dGFiIGVudHJ5IGZvdW5kICovCisJICAgICAgICBpZiAoKHJlYWxtX2FuZF9zZXJ2aWNlX21hdGNoKGNvbnRleHQsIGt0ZS0+cHJpbmNpcGFsLCByZWFsbSwKKwkJCQkJICAgICBzZXJ2aWNlKSkpIHsKKwkJCXByaW50ZXJyKDQsICJXZSBXSUxMIHVzZSB0aGlzIGVudHJ5ICglcylcbiIsIHBuYW1lKTsKKwkJCXBsZSA9IGdldF9wbGVfYnlfcHJpbmMoY29udGV4dCwga3RlLT5wcmluY2lwYWwpOworCQkJLyoKKwkJCSAqIFJldHVybiwgZG9uJ3QgZnJlZSwga2V5dGFiIGVudHJ5IGlmCisJCQkgKiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwhCisJCQkgKi8KKwkJCWlmIChwbGUgPT0gTlVMTCkgeworCQkJCXJldHZhbCA9IEVOT01FTTsKKwkJCQlrNV9mcmVlX2t0X2VudHJ5KGNvbnRleHQsIGt0ZSk7CisJCQl9IGVsc2UgeworCQkJCXJldHZhbCA9IDA7CisJCQkJKmZvdW5kID0gMTsKKwkJCX0KKwkJCWs1X2ZyZWVfdW5wYXJzZWRfbmFtZShjb250ZXh0LCBwbmFtZSk7CisJCQlicmVhazsKKwkJfQorCQllbHNlIHsKKwkJCXByaW50ZXJyKDQsICJXZSB3aWxsIE5PVCB1c2UgdGhpcyBlbnRyeSAoJXMpXG4iLAorCQkJCXBuYW1lKTsKKwkJfQorCQlrNV9mcmVlX3VucGFyc2VkX25hbWUoY29udGV4dCwgcG5hbWUpOworCQlrNV9mcmVlX2t0X2VudHJ5KGNvbnRleHQsIGt0ZSk7CisJfQorCisJaWYgKChjb2RlID0ga3JiNV9rdF9lbmRfc2VxX2dldChjb250ZXh0LCBrdCwgJmN1cnNvcikpKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIGNvZGUpOworCQlwcmludGVycigwLCAiV0FSTklORzogJXMgd2hpbGUgZW5kaW5nIGtleXRhYiBzY2FuIGZvciAiCisJCQkgICAgImtleXRhYiAnJXMnXG4iLCBrNWVyciwga3RfbmFtZSk7CisJfQorCisJcmV0dmFsID0gMDsKKyAgb3V0OgorCWZyZWUoazVlcnIpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBGaW5kIGEga2V5dGFiIGVudHJ5IHRvIHVzZSBmb3IgYSBnaXZlbiB0YXJnZXQgaG9zdG5hbWUuCisgKiBUcmllcyB0byBmaW5kIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGtleXRhYiB0byB1c2UgZ2l2ZW4gdGhlCisgKiBuYW1lIG9mIHRoZSBob3N0IHdlIGFyZSB0cnlpbmcgdG8gY29ubmVjdCB3aXRoLgorICovCitzdGF0aWMgaW50CitmaW5kX2tleXRhYl9lbnRyeShrcmI1X2NvbnRleHQgY29udGV4dCwga3JiNV9rZXl0YWIga3QsIGNvbnN0IGNoYXIgKmhvc3RuYW1lLAorCQkgIGtyYjVfa2V5dGFiX2VudHJ5ICprdGUsIGNvbnN0IGNoYXIgKipzdmNuYW1lcykKK3sKKwlrcmI1X2Vycm9yX2NvZGUgY29kZTsKKwljaGFyICoqcmVhbG1uYW1lcyA9IE5VTEw7CisJY2hhciBteWhvc3RuYW1lW05JX01BWEhPU1RdLCB0YXJnZXRob3N0bmFtZVtOSV9NQVhIT1NUXTsKKwlpbnQgaSwgaiwgcmV0dmFsOworCWNoYXIgKmRlZmF1bHRfcmVhbG0gPSBOVUxMOworCWNoYXIgKnJlYWxtOworCWNoYXIgKms1ZXJyID0gTlVMTDsKKwlpbnQgdHJpZWRfYWxsID0gMCwgdHJpZWRfZGVmYXVsdCA9IDA7CisJa3JiNV9wcmluY2lwYWwgcHJpbmM7CisKKworCS8qIEdldCBmdWxsIHRhcmdldCBob3N0bmFtZSAqLworCXJldHZhbCA9IGdldF9mdWxsX2hvc3RuYW1lKGhvc3RuYW1lLCB0YXJnZXRob3N0bmFtZSwKKwkJCQkgICBzaXplb2YodGFyZ2V0aG9zdG5hbWUpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCS8qIEdldCBmdWxsIGxvY2FsIGhvc3RuYW1lICovCisJcmV0dmFsID0gZ2V0aG9zdG5hbWUobXlob3N0bmFtZSwgc2l6ZW9mKG15aG9zdG5hbWUpKTsKKwlpZiAocmV0dmFsKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIHJldHZhbCk7CisJCXByaW50ZXJyKDEsICIlcyB3aGlsZSBnZXR0aW5nIGxvY2FsIGhvc3RuYW1lXG4iLCBrNWVycik7CisJCWdvdG8gb3V0OworCX0KKwlyZXR2YWwgPSBnZXRfZnVsbF9ob3N0bmFtZShteWhvc3RuYW1lLCBteWhvc3RuYW1lLCBzaXplb2YobXlob3N0bmFtZSkpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJY29kZSA9IGtyYjVfZ2V0X2RlZmF1bHRfcmVhbG0oY29udGV4dCwgJmRlZmF1bHRfcmVhbG0pOworCWlmIChjb2RlKSB7CisJCXJldHZhbCA9IGNvZGU7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKGNvbnRleHQsIGNvZGUpOworCQlwcmludGVycigxLCAiJXMgd2hpbGUgZ2V0dGluZyBkZWZhdWx0IHJlYWxtIG5hbWVcbiIsIGs1ZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIHJlYWxtIG5hbWUocykgZm9yIHRoZSB0YXJnZXQgaG9zdG5hbWUuCisJICogSW4gcmVhbGl0eSwgdGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgb25seSByZXR1cm5zIGEKKwkgKiBzaW5nbGUgcmVhbG0sIGJ1dCB3ZSBjb2RlIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdAorCSAqIHNvbWVkYXkgaXQgbWF5IGFjdHVhbGx5IHJldHVybiBhIGxpc3QuCisJICovCisJY29kZSA9IGtyYjVfZ2V0X2hvc3RfcmVhbG0oY29udGV4dCwgdGFyZ2V0aG9zdG5hbWUsICZyZWFsbW5hbWVzKTsKKwlpZiAoY29kZSkgeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCBjb2RlKTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiAlcyB3aGlsZSBnZXR0aW5nIHJlYWxtKHMpIGZvciBob3N0ICclcydcbiIsCisJCQkgazVlcnIsIHRhcmdldGhvc3RuYW1lKTsKKwkJcmV0dmFsID0gY29kZTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBUcnkgdGhlICJhcHByb3ByaWF0ZSIgcmVhbG0gZmlyc3QsIGFuZCBpZiBub3RoaW5nIGZvdW5kIGZvciB0aGF0CisJICogcmVhbG0sIHRyeSB0aGUgZGVmYXVsdCByZWFsbSAoaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiB0cmllZCkuCisJICovCisJaSA9IDA7CisJcmVhbG0gPSByZWFsbW5hbWVzW2ldOworCXdoaWxlICgxKSB7CisJCWlmIChyZWFsbSA9PSBOVUxMKSB7CisJCQl0cmllZF9hbGwgPSAxOworCQkJaWYgKCF0cmllZF9kZWZhdWx0KQorCQkJCXJlYWxtID0gZGVmYXVsdF9yZWFsbTsKKwkJfQorCQlpZiAodHJpZWRfYWxsICYmIHRyaWVkX2RlZmF1bHQpCisJCQlicmVhazsKKwkJaWYgKHN0cmNtcChyZWFsbSwgZGVmYXVsdF9yZWFsbSkgPT0gMCkKKwkJCXRyaWVkX2RlZmF1bHQgPSAxOworCQlmb3IgKGogPSAwOyBzdmNuYW1lc1tqXSAhPSBOVUxMOyBqKyspIHsKKwkJCWNvZGUgPSBrcmI1X2J1aWxkX3ByaW5jaXBhbF9leHQoY29udGV4dCwgJnByaW5jLAorCQkJCQkJCXN0cmxlbihyZWFsbSksCisJCQkJCQkJcmVhbG0sCisJCQkJCQkJc3RybGVuKHN2Y25hbWVzW2pdKSwKKwkJCQkJCQlzdmNuYW1lc1tqXSwKKwkJCQkJCQlzdHJsZW4obXlob3N0bmFtZSksCisJCQkJCQkJbXlob3N0bmFtZSwKKwkJCQkJCQlOVUxMKTsKKwkJCWlmIChjb2RlKSB7CisJCQkJazVlcnIgPSBnc3NkX2s1X2Vycl9tc2coY29udGV4dCwgY29kZSk7CisJCQkJcHJpbnRlcnIoMSwgIiVzIHdoaWxlIGJ1aWxkaW5nIHByaW5jaXBhbCBmb3IgIgorCQkJCQkgIiclcy8lc0AlcydcbiIsIGs1ZXJyLCBzdmNuYW1lc1tqXSwKKwkJCQkJIG15aG9zdG5hbWUsIHJlYWxtKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWNvZGUgPSBrcmI1X2t0X2dldF9lbnRyeShjb250ZXh0LCBrdCwgcHJpbmMsIDAsIDAsIGt0ZSk7CisJCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGNvbnRleHQsIHByaW5jKTsKKwkJCWlmIChjb2RlKSB7CisJCQkJazVlcnIgPSBnc3NkX2s1X2Vycl9tc2coY29udGV4dCwgY29kZSk7CisJCQkJcHJpbnRlcnIoMywgIiVzIHdoaWxlIGdldHRpbmcga2V5dGFiIGVudHJ5IGZvciAiCisJCQkJCSAiJyVzLyVzQCVzJ1xuIiwgazVlcnIsIHN2Y25hbWVzW2pdLAorCQkJCQkgbXlob3N0bmFtZSwgcmVhbG0pOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGVycigzLCAiU3VjY2VzcyBnZXR0aW5nIGtleXRhYiBlbnRyeSBmb3IgIgorCQkJCQkgIiclcy8lc0AlcydcbiIsCisJCQkJCSBzdmNuYW1lc1tqXSwgbXlob3N0bmFtZSwgcmVhbG0pOworCQkJCXJldHZhbCA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlyZXR2YWwgPSBjb2RlOworCQl9CisJCS8qCisJCSAqIE5vdGhpbmcgZm91bmQgd2l0aCBvdXIgaG9zdG5hbWUgaW5zdGFuY2UsIG5vdyBsb29rIGZvcgorCQkgKiBuYW1lcyB3aXRoIGFueSBpbnN0YW5jZSAodGhleSBtdXN0IGhhdmUgYW4gaW5zdGFuY2UpCisJCSAqLworCQlmb3IgKGogPSAwOyBzdmNuYW1lc1tqXSAhPSBOVUxMOyBqKyspIHsKKwkJCWludCBmb3VuZCA9IDA7CisJCQljb2RlID0gZ3NzZF9zZWFyY2hfa3JiNV9rZXl0YWIoY29udGV4dCwga3QsIHJlYWxtLAorCQkJCQkJICAgICAgIHN2Y25hbWVzW2pdLCAmZm91bmQsIGt0ZSk7CisJCQlpZiAoIWNvZGUgJiYgZm91bmQpIHsKKwkJCQlwcmludGVycigzLCAiU3VjY2VzcyBnZXR0aW5nIGtleXRhYiBlbnRyeSBmb3IgIgorCQkJCQkgIiVzLypAJXNcbiIsIHN2Y25hbWVzW2pdLCByZWFsbSk7CisJCQkJcmV0dmFsID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlpZiAoIXRyaWVkX2FsbCkgeworCQkJaSsrOworCQkJcmVhbG0gPSByZWFsbW5hbWVzW2ldOworCQl9CisJfQorb3V0OgorCWlmIChkZWZhdWx0X3JlYWxtKQorCQlrNV9mcmVlX2RlZmF1bHRfcmVhbG0oY29udGV4dCwgZGVmYXVsdF9yZWFsbSk7CisJaWYgKHJlYWxtbmFtZXMpCisJCWtyYjVfZnJlZV9ob3N0X3JlYWxtKGNvbnRleHQsIHJlYWxtbmFtZXMpOworCWZyZWUoazVlcnIpOworCXJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgZGF0YV9pc19lcXVhbChrcmI1X2RhdGEgZDEsIGtyYjVfZGF0YSBkMikKK3sKKwlyZXR1cm4gKGQxLmxlbmd0aCA9PSBkMi5sZW5ndGgKKwkJJiYgbWVtY21wKGQxLmRhdGEsIGQyLmRhdGEsIGQxLmxlbmd0aCkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX2Zvcl90Z3Qoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfY2NhY2hlIGNjYWNoZSwKKwkgICAgICBrcmI1X3ByaW5jaXBhbCBwcmluY2lwYWwpCit7CisJa3JiNV9lcnJvcl9jb2RlIHJldDsKKwlrcmI1X2NyZWRzIGNyZWRzOworCWtyYjVfY2NfY3Vyc29yIGN1cjsKKwlpbnQgZm91bmQgPSAwOworCisJcmV0ID0ga3JiNV9jY19zdGFydF9zZXFfZ2V0KGNvbnRleHQsIGNjYWNoZSwgJmN1cik7CisJaWYgKHJldCkgCisJCXJldHVybiAwOworCisJd2hpbGUgKCFmb3VuZCAmJgorCQkocmV0ID0ga3JiNV9jY19uZXh0X2NyZWQoY29udGV4dCwgY2NhY2hlLCAmY3VyLCAmY3JlZHMpKSA9PSAwKSB7CisJCWlmIChjcmVkcy5zZXJ2ZXItPmxlbmd0aCA9PSAyICYmCisJCQkJZGF0YV9pc19lcXVhbChjcmVkcy5zZXJ2ZXItPnJlYWxtLAorCQkJCQkgICAgICBwcmluY2lwYWwtPnJlYWxtKSAmJgorCQkJCWNyZWRzLnNlcnZlci0+ZGF0YVswXS5sZW5ndGggPT0gNiAmJgorCQkJCW1lbWNtcChjcmVkcy5zZXJ2ZXItPmRhdGFbMF0uZGF0YSwKKwkJCQkJCSJrcmJ0Z3QiLCA2KSA9PSAwICYmCisJCQkJZGF0YV9pc19lcXVhbChjcmVkcy5zZXJ2ZXItPmRhdGFbMV0sCisJCQkJCSAgICAgIHByaW5jaXBhbC0+cmVhbG0pICYmCisJCQkJY3JlZHMudGltZXMuZW5kdGltZSA+IHRpbWUoTlVMTCkpCisJCQlmb3VuZCA9IDE7CisJCWtyYjVfZnJlZV9jcmVkX2NvbnRlbnRzKGNvbnRleHQsICZjcmVkcyk7CisJfQorCWtyYjVfY2NfZW5kX3NlcV9nZXQoY29udGV4dCwgY2NhY2hlLCAmY3VyKTsKKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludAorcXVlcnlfa3JiNV9jY2FjaGUoY29uc3QgY2hhciogY3JlZF9jYWNoZSwgY2hhciAqKnJldF9wcmluY25hbWUsCisJCSAgY2hhciAqKnJldF9yZWFsbSkKK3sKKwlrcmI1X2Vycm9yX2NvZGUgcmV0OworCWtyYjVfY29udGV4dCBjb250ZXh0OworCWtyYjVfY2NhY2hlIGNjYWNoZTsKKwlrcmI1X3ByaW5jaXBhbCBwcmluY2lwYWw7CisJaW50IGZvdW5kID0gMDsKKwljaGFyICpzdHIgPSBOVUxMOworCWNoYXIgKnByaW5jc3RyaW5nOworCisJcmV0ID0ga3JiNV9pbml0X2NvbnRleHQoJmNvbnRleHQpOworCWlmIChyZXQpIAorCQlyZXR1cm4gMDsKKworCWlmKCFjcmVkX2NhY2hlIHx8IGtyYjVfY2NfcmVzb2x2ZShjb250ZXh0LCBjcmVkX2NhY2hlLCAmY2NhY2hlKSkKKwkJZ290byBlcnJfY2FjaGU7CisKKwlpZiAoa3JiNV9jY19zZXRfZmxhZ3MoY29udGV4dCwgY2NhY2hlLCAwKSkKKwkJZ290byBlcnJfcHJpbmM7CisKKwlyZXQgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoY29udGV4dCwgY2NhY2hlLCAmcHJpbmNpcGFsKTsKKwlpZiAocmV0KSAKKwkJZ290byBlcnJfcHJpbmM7CisKKwlmb3VuZCA9IGNoZWNrX2Zvcl90Z3QoY29udGV4dCwgY2NhY2hlLCBwcmluY2lwYWwpOworCWlmIChmb3VuZCkgeworCQlyZXQgPSBrcmI1X3VucGFyc2VfbmFtZShjb250ZXh0LCBwcmluY2lwYWwsICZwcmluY3N0cmluZyk7CisJCWlmIChyZXQgPT0gMCkgeworCQkgICAgaWYgKChzdHIgPSBzdHJjaHIocHJpbmNzdHJpbmcsICdAJykpICE9IE5VTEwpIHsKKwkJCSAgICAqc3RyID0gJ1wwJzsKKwkJCSAgICAqcmV0X3ByaW5jbmFtZSA9IHN0cmR1cChwcmluY3N0cmluZyk7CisJCQkgICAgKnJldF9yZWFsbSA9IHN0cmR1cChzdHIrMSk7CisJCSAgICB9CisJCSAgICBrNV9mcmVlX3VucGFyc2VkX25hbWUoY29udGV4dCwgcHJpbmNzdHJpbmcpOworCQl9IGVsc2UgeworCQkJZm91bmQgPSAwOworCQl9CisJfQorCWtyYjVfZnJlZV9wcmluY2lwYWwoY29udGV4dCwgcHJpbmNpcGFsKTsKK2Vycl9wcmluYzoKKwlrcmI1X2NjX3NldF9mbGFncyhjb250ZXh0LCBjY2FjaGUsICBLUkI1X1RDX09QRU5DTE9TRSk7CisJa3JiNV9jY19jbG9zZShjb250ZXh0LCBjY2FjaGUpOworZXJyX2NhY2hlOgorCWtyYjVfZnJlZV9jb250ZXh0KGNvbnRleHQpOworCXJldHVybiBmb3VuZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PSAgRXh0ZXJuYWwgcm91dGluZXMgPT09Ki8KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQXR0ZW1wdCB0byBmaW5kIHRoZSBiZXN0IG1hdGNoIGZvciBhIGNyZWRlbnRpYWxzIGNhY2hlIGZpbGUKKyAqIGdpdmVuIG9ubHkgYSBVSUQuICBXZSByZWFsbHkgbmVlZCBtb3JlIGluZm9ybWF0aW9uLCBidXQgd2UKKyAqIGRvIHRoZSBiZXN0IHdlIGNhbi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgYSBjY2FjaGUgd2FzIGZvdW5kLCBhbmQgYSBub24temVybyBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50Citnc3NkX3NldHVwX2tyYjVfdXNlcl9nc3NfY2NhY2hlKHVpZF90IHVpZCwgY2hhciAqc2VydmVybmFtZSwgY2hhciAqZGlybmFtZSkKK3sKKwljaGFyCQkJYnVmW01BWF9ORVRPQkpfU1pdOworCXN0cnVjdCBkaXJlbnQJCSpkOworCWludAkJCWVycjsKKworCXByaW50ZXJyKDIsICJnZXR0aW5nIGNyZWRlbnRpYWxzIGZvciBjbGllbnQgd2l0aCB1aWQgJXUgZm9yICIKKwkJICAgICJzZXJ2ZXIgJXNcbiIsIHVpZCwgc2VydmVybmFtZSk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWVyciA9IGdzc2RfZmluZF9leGlzdGluZ19rcmI1X2NjYWNoZSh1aWQsIGRpcm5hbWUsICZkKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZJTEU6JXMvJXMiLCBkaXJuYW1lLCBkLT5kX25hbWUpOworCWZyZWUoZCk7CisKKwlwcmludGVycigyLCAidXNpbmcgJXMgYXMgY3JlZGVudGlhbHMgY2FjaGUgZm9yIGNsaWVudCB3aXRoICIKKwkJICAgICJ1aWQgJXUgZm9yIHNlcnZlciAlc1xuIiwgYnVmLCB1aWQsIHNlcnZlcm5hbWUpOworCWdzc2Rfc2V0X2tyYjVfY2NhY2hlX25hbWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogTGV0IHRoZSBnc3MgY29kZSBrbm93IHdoZXJlIHRvIGZpbmQgdGhlIG1hY2hpbmUgY3JlZGVudGlhbHMgY2NhY2hlLgorICoKKyAqIFJldHVybnM6CisgKgl2b2lkCisgKi8KK3ZvaWQKK2dzc2Rfc2V0dXBfa3JiNV9tYWNoaW5lX2dzc19jY2FjaGUoY2hhciAqY2NuYW1lKQoreworCXByaW50ZXJyKDIsICJ1c2luZyAlcyBhcyBjcmVkZW50aWFscyBjYWNoZSBmb3IgbWFjaGluZSBjcmVkc1xuIiwKKwkJIGNjbmFtZSk7CisJZ3NzZF9zZXRfa3JiNV9jY2FjaGVfbmFtZShjY25hbWUpOworfQorCisvKgorICogUmV0dXJuIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG5hbWVzIG9mIGNyZWRlbnRpYWwgY2FjaGUgZmlsZXMKKyAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRyeSB0byBjcmVhdGUgZ3NzIGNvbnRleHRzIHdpdGggYSBzZXJ2ZXIuCisgKgorICogUmV0dXJuczoKKyAqCTAgPT4gbGlzdCBpcyBhdHRhY2hlZAorICoJbm9uemVybyA9PiBlcnJvcgorICovCitpbnQKK2dzc2RfZ2V0X2tyYjVfbWFjaGluZV9jcmVkX2xpc3QoY2hhciAqKipsaXN0KQoreworCWNoYXIgKipsOworCWludCBsaXN0aW5jID0gMTA7CisJaW50IGxpc3RzaXplID0gbGlzdGluYzsKKwlpbnQgaSA9IDA7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZ3NzZF9rNV9rdF9wcmluYyAqcGxlOworCisJLyogQXNzdW1lIGZhaWx1cmUgKi8KKwlyZXR2YWwgPSAtMTsKKwkqbGlzdCA9IChjaGFyICoqKSBOVUxMOworCisJaWYgKChsID0gKGNoYXIgKiopIG1hbGxvYyhsaXN0c2l6ZSAqIHNpemVvZihjaGFyICopKSkgPT0gTlVMTCkgeworCQlyZXR2YWwgPSBFTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCS8qIE5lZWQgdG8gc2VyaWFsaXplIGxpc3QgaWYgd2UgZXZlciBiZWNvbWUgbXVsdGktdGhyZWFkZWQhICovCisKKwlmb3IgKHBsZSA9IGdzc2RfazVfa3RfcHJpbmNfbGlzdDsgcGxlOyBwbGUgPSBwbGUtPm5leHQpIHsKKwkJaWYgKHBsZS0+Y2NuYW1lKSB7CisJCQkvKiBNYWtlIHN1cmUgY3JlZCBpcyB1cC10by1kYXRlIGJlZm9yZSByZXR1cm5pbmcgaXQgKi8KKwkJCXJldHZhbCA9IGdzc2RfcmVmcmVzaF9rcmI1X21hY2hpbmVfY3JlZGVudGlhbChOVUxMLCBwbGUsCisJCQkJTlVMTCk7CisJCQlpZiAocmV0dmFsKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGkgKyAxID4gbGlzdHNpemUpIHsKKwkJCQlsaXN0c2l6ZSArPSBsaXN0aW5jOworCQkJCWwgPSAoY2hhciAqKikKKwkJCQkJcmVhbGxvYyhsLCBsaXN0c2l6ZSAqIHNpemVvZihjaGFyICopKTsKKwkJCQlpZiAobCA9PSBOVUxMKSB7CisJCQkJCXJldHZhbCA9IEVOT01FTTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQkJaWYgKChsW2krK10gPSBzdHJkdXAocGxlLT5jY25hbWUpKSA9PSBOVUxMKSB7CisJCQkJcmV0dmFsID0gRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCWlmIChpID4gMCkgeworCQlsW2ldID0gTlVMTDsKKwkJKmxpc3QgPSBsOworCQlyZXR2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisgIG91dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRnJlZXMgdGhlIGxpc3Qgb2YgbmFtZXMgcmV0dXJuZWQgaW4gZ2V0X2tyYjVfbWFjaGluZV9jcmVkX2xpc3QoKQorICovCit2b2lkCitnc3NkX2ZyZWVfa3JiNV9tYWNoaW5lX2NyZWRfbGlzdChjaGFyICoqbGlzdCkKK3sKKwljaGFyICoqbjsKKworCWlmIChsaXN0ID09IE5VTEwpCisJCXJldHVybjsKKwlmb3IgKG4gPSBsaXN0OyBuICYmICpuOyBuKyspIHsKKwkJZnJlZSgqbik7CisJfQorCWZyZWUobGlzdCk7Cit9CisKKy8qCisgKiBDYWxsZWQgdXBvbiBleGl0LiAgRGVzdHJveXMgbWFjaGluZSBjcmVkZW50aWFscy4KKyAqLwordm9pZAorZ3NzZF9kZXN0cm95X2tyYjVfbWFjaGluZV9jcmVkcyh2b2lkKQoreworCWtyYjVfY29udGV4dCBjb250ZXh0OworCWtyYjVfZXJyb3JfY29kZSBjb2RlID0gMDsKKwlrcmI1X2NjYWNoZSBjY2FjaGU7CisJc3RydWN0IGdzc2RfazVfa3RfcHJpbmMgKnBsZTsKKwljaGFyICprNWVyciA9IE5VTEw7CisKKwljb2RlID0ga3JiNV9pbml0X2NvbnRleHQoJmNvbnRleHQpOworCWlmIChjb2RlKSB7CisJCWs1ZXJyID0gZ3NzZF9rNV9lcnJfbXNnKE5VTEwsIGNvZGUpOworCQlwcmludGVycigwLCAiRVJST1I6ICVzIHdoaWxlIGluaXRpYWxpemluZyBrcmI1XG4iLCBrNWVycik7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAocGxlID0gZ3NzZF9rNV9rdF9wcmluY19saXN0OyBwbGU7IHBsZSA9IHBsZS0+bmV4dCkgeworCQlpZiAoIXBsZS0+Y2NuYW1lKQorCQkJY29udGludWU7CisJCWlmICgoY29kZSA9IGtyYjVfY2NfcmVzb2x2ZShjb250ZXh0LCBwbGUtPmNjbmFtZSwgJmNjYWNoZSkpKSB7CisJCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCBjb2RlKTsKKwkJCXByaW50ZXJyKDAsICJXQVJOSU5HOiAlcyB3aGlsZSByZXNvbHZpbmcgY3JlZGVudGlhbCAiCisJCQkJICAgICJjYWNoZSAnJXMnIGZvciBkZXN0cnVjdGlvblxuIiwgazVlcnIsCisJCQkJICAgIHBsZS0+Y2NuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKChjb2RlID0ga3JiNV9jY19kZXN0cm95KGNvbnRleHQsIGNjYWNoZSkpKSB7CisJCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhjb250ZXh0LCBjb2RlKTsKKwkJCXByaW50ZXJyKDAsICJXQVJOSU5HOiAlcyB3aGlsZSBkZXN0cm95aW5nIGNyZWRlbnRpYWwgIgorCQkJCSAgICAiY2FjaGUgJyVzJ1xuIiwgazVlcnIsIHBsZS0+Y2NuYW1lKTsKKwkJfQorCX0KKyAgb3V0OgorCWZyZWUoazVlcnIpOworCWtyYjVfZnJlZV9jb250ZXh0KGNvbnRleHQpOworfQorCisvKgorICogT2J0YWluIChvciByZWZyZXNoIGlmIG5lY2Vzc2FyeSkgS2VyYmVyb3MgbWFjaGluZSBjcmVkZW50aWFscworICovCitpbnQKK2dzc2RfcmVmcmVzaF9rcmI1X21hY2hpbmVfY3JlZGVudGlhbChjaGFyICpob3N0bmFtZSwKKwkJCQkgICAgIHN0cnVjdCBnc3NkX2s1X2t0X3ByaW5jICpwbGUsIAorCQkJCQkgY2hhciAqc2VydmljZSkKK3sKKwlrcmI1X2Vycm9yX2NvZGUgY29kZSA9IDA7CisJa3JiNV9jb250ZXh0IGNvbnRleHQ7CisJa3JiNV9rZXl0YWIga3QgPSBOVUxMOzsKKwlpbnQgcmV0dmFsID0gMDsKKwljaGFyICprNWVyciA9IE5VTEw7CisJY29uc3QgY2hhciAqc3ZjbmFtZXNbNF0gPSB7ICJyb290IiwgIm5mcyIsICJob3N0IiwgTlVMTCB9OworCisJLyoKKwkgKiBJZiBhIHNwZWNpZmljIHNlcnZpY2UgbmFtZSB3YXMgc3BlY2lmaWVkLCB1c2UgaXQuCisJICogT3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgbGlzdC4KKwkgKi8KKwlpZiAoc2VydmljZSAhPSBOVUxMICYmIHN0cmNtcChzZXJ2aWNlLCAiKiIpICE9IDApIHsKKwkJc3ZjbmFtZXNbMF0gPSBzZXJ2aWNlOworCQlzdmNuYW1lc1sxXSA9IE5VTEw7CisJfQorCWlmIChob3N0bmFtZSA9PSBOVUxMICYmIHBsZSA9PSBOVUxMKQorCQlyZXR1cm4gRUlOVkFMOworCisJY29kZSA9IGtyYjVfaW5pdF9jb250ZXh0KCZjb250ZXh0KTsKKwlpZiAoY29kZSkgeworCQlrNWVyciA9IGdzc2RfazVfZXJyX21zZyhOVUxMLCBjb2RlKTsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiAlczogJXMgd2hpbGUgaW5pdGlhbGl6aW5nIGtyYjUgY29udGV4dFxuIiwKKwkJCSBfX2Z1bmNfXywgazVlcnIpOworCQlyZXR2YWwgPSBjb2RlOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGNvZGUgPSBrcmI1X2t0X3Jlc29sdmUoY29udGV4dCwga2V5dGFiZmlsZSwgJmt0KSkpIHsKKwkJazVlcnIgPSBnc3NkX2s1X2Vycl9tc2coY29udGV4dCwgY29kZSk7CisJCXByaW50ZXJyKDAsICJFUlJPUjogJXM6ICVzIHdoaWxlIHJlc29sdmluZyBrZXl0YWIgJyVzJ1xuIiwKKwkJCSBfX2Z1bmNfXywgazVlcnIsIGtleXRhYmZpbGUpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocGxlID09IE5VTEwpIHsKKwkJa3JiNV9rZXl0YWJfZW50cnkga3RlOworCisJCWNvZGUgPSBmaW5kX2tleXRhYl9lbnRyeShjb250ZXh0LCBrdCwgaG9zdG5hbWUsICZrdGUsIHN2Y25hbWVzKTsKKwkJaWYgKGNvZGUpIHsKKwkJCXByaW50ZXJyKDAsICJFUlJPUjogJXM6IG5vIHVzYWJsZSBrZXl0YWIgZW50cnkgZm91bmQgIgorCQkJCSAiaW4ga2V5dGFiICVzIGZvciBjb25uZWN0aW9uIHdpdGggaG9zdCAlc1xuIiwKKwkJCQkgX19GVU5DVElPTl9fLCBrZXl0YWJmaWxlLCBob3N0bmFtZSk7CisJCQlyZXR2YWwgPSBjb2RlOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwbGUgPSBnZXRfcGxlX2J5X3ByaW5jKGNvbnRleHQsIGt0ZS5wcmluY2lwYWwpOworCQlrNV9mcmVlX2t0X2VudHJ5KGNvbnRleHQsICZrdGUpOworCQlpZiAocGxlID09IE5VTEwpIHsKKwkJCWNoYXIgKnBuYW1lOworCQkJaWYgKChrcmI1X3VucGFyc2VfbmFtZShjb250ZXh0LCBrdGUucHJpbmNpcGFsLCAmcG5hbWUpKSkgeworCQkJCXBuYW1lID0gTlVMTDsKKwkJCX0KKwkJCXByaW50ZXJyKDAsICJFUlJPUjogJXM6IENvdWxkIG5vdCBsb2NhdGUgb3IgY3JlYXRlICIKKwkJCQkgInBsZSBzdHJ1Y3QgZm9yIHByaW5jaXBhbCAlcyBmb3IgY29ubmVjdGlvbiAiCisJCQkJICJ3aXRoIGhvc3QgJXNcbiIsCisJCQkJIF9fRlVOQ1RJT05fXywgcG5hbWUgPyBwbmFtZSA6ICI8dW5wYXJzYWJsZT4iLAorCQkJCSBob3N0bmFtZSk7CisJCQlpZiAocG5hbWUpIGs1X2ZyZWVfdW5wYXJzZWRfbmFtZShjb250ZXh0LCBwbmFtZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlyZXR2YWwgPSBnc3NkX2dldF9zaW5nbGVfa3JiNV9jcmVkKGNvbnRleHQsIGt0LCBwbGUsIDApOworb3V0OgorCWlmIChrdCkKKwkJa3JiNV9rdF9jbG9zZShjb250ZXh0LCBrdCk7CisJa3JiNV9mcmVlX2NvbnRleHQoY29udGV4dCk7CisJZnJlZShrNWVycik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIEEgY29tbW9uIHJvdXRpbmUgZm9yIGdldHRpbmcgdGhlIEtlcmJlcm9zIGVycm9yIG1lc3NhZ2UKKyAqLworY2hhciAqCitnc3NkX2s1X2Vycl9tc2coa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfZXJyb3JfY29kZSBjb2RlKQoreworCWNvbnN0IGNoYXIgKm9yaWdtc2c7CisJY2hhciAqbXNnID0gTlVMTDsKKworI2lmIEhBVkVfS1JCNV9HRVRfRVJST1JfTUVTU0FHRQorCWlmIChjb250ZXh0ICE9IE5VTEwpIHsKKwkJb3JpZ21zZyA9IGtyYjVfZ2V0X2Vycm9yX21lc3NhZ2UoY29udGV4dCwgY29kZSk7CisJCW1zZyA9IHN0cmR1cChvcmlnbXNnKTsKKwkJa3JiNV9mcmVlX2Vycm9yX21lc3NhZ2UoY29udGV4dCwgb3JpZ21zZyk7CisJfQorI2VuZGlmCisJaWYgKG1zZyAhPSBOVUxMKQorCQlyZXR1cm4gbXNnOworI2lmIEhBVkVfS1JCNQorCXJldHVybiBzdHJkdXAoZXJyb3JfbWVzc2FnZShjb2RlKSk7CisjZWxzZQorCWlmIChjb250ZXh0ICE9IE5VTEwpCisJCXJldHVybiBzdHJkdXAoa3JiNV9nZXRfZXJyX3RleHQoY29udGV4dCwgY29kZSkpOworCWVsc2UKKwkJcmV0dXJuIHN0cmR1cChlcnJvcl9tZXNzYWdlKGNvZGUpKTsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIGRlZmF1bHQgS2VyYmVyb3MgcmVhbG0KKyAqLwordm9pZAorZ3NzZF9rNV9nZXRfZGVmYXVsdF9yZWFsbShjaGFyICoqZGVmX3JlYWxtKQoreworCWtyYjVfY29udGV4dCBjb250ZXh0OworCisJaWYgKGtyYjVfaW5pdF9jb250ZXh0KCZjb250ZXh0KSkKKwkJcmV0dXJuOworCisJa3JiNV9nZXRfZGVmYXVsdF9yZWFsbShjb250ZXh0LCBkZWZfcmVhbG0pOworCisJa3JiNV9mcmVlX2NvbnRleHQoY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9rcmI1X3V0aWwuaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL2tyYjVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDJjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9rcmI1X3V0aWwuaApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIEtSQjVfVVRJTF9ICisjZGVmaW5lIEtSQjVfVVRJTF9ICisKKyNpbmNsdWRlIDxrcmI1Lmg+CisKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisjaW5jbHVkZSA8cnBjL2F1dGhfZ3NzLmg+CisjZWxzZQorI2luY2x1ZGUgImdzc19vaWRzLmgiCisjZW5kaWYKKworLyoKKyAqIExpc3Qgb2YgcHJpbmNpcGFscyBmcm9tIG91ciBrZXl0YWIgdGhhdCB3ZQorICogd2lsbCB0cnkgdG8gdXNlIHRvIG9idGFpbiBjcmVkZW50aWFscworICogKGtub3duIGFzIGEgcHJpbmNpcGFsIGxpc3QgZW50cnkgKHBsZSkpCisgKi8KK3N0cnVjdCBnc3NkX2s1X2t0X3ByaW5jIHsKKwlzdHJ1Y3QgZ3NzZF9rNV9rdF9wcmluYyAqbmV4dDsKKwlrcmI1X3ByaW5jaXBhbCBwcmluYzsKKwljaGFyICpjY25hbWU7CisJY2hhciAqcmVhbG07CisJa3JiNV90aW1lc3RhbXAgZW5kdGltZTsKK307CisKKworaW50IGdzc2Rfc2V0dXBfa3JiNV91c2VyX2dzc19jY2FjaGUodWlkX3QgdWlkLCBjaGFyICpzZXJ2ZXJuYW1lLAorCQkJCSAgICAgY2hhciAqZGlybmFtZSk7CitpbnQgIGdzc2RfZ2V0X2tyYjVfbWFjaGluZV9jcmVkX2xpc3QoY2hhciAqKipsaXN0KTsKK3ZvaWQgZ3NzZF9mcmVlX2tyYjVfbWFjaGluZV9jcmVkX2xpc3QoY2hhciAqKmxpc3QpOwordm9pZCBnc3NkX3NldHVwX2tyYjVfbWFjaGluZV9nc3NfY2NhY2hlKGNoYXIgKnNlcnZlcm5hbWUpOwordm9pZCBnc3NkX2Rlc3Ryb3lfa3JiNV9tYWNoaW5lX2NyZWRzKHZvaWQpOworaW50ICBnc3NkX3JlZnJlc2hfa3JiNV9tYWNoaW5lX2NyZWRlbnRpYWwoY2hhciAqaG9zdG5hbWUsCisJCQkJCSAgc3RydWN0IGdzc2RfazVfa3RfcHJpbmMgKnBsZSwgCisJCQkJCSAgY2hhciAqc2VydmljZSk7CitjaGFyICpnc3NkX2s1X2Vycl9tc2coa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfZXJyb3JfY29kZSBjb2RlKTsKK3ZvaWQgZ3NzZF9rNV9nZXRfZGVmYXVsdF9yZWFsbShjaGFyICoqZGVmX3JlYWxtKTsKKworI2lmZGVmIEhBVkVfU0VUX0FMTE9XQUJMRV9FTkNUWVBFUworaW50IGxpbWl0X2tyYjVfZW5jdHlwZXMoc3RydWN0IHJwY19nc3Nfc2VjICpzZWMsIHVpZF90IHVpZCk7CisjZW5kaWYKKworLyoKKyAqIEhpZGUgYXdheSBzb21lIG9mIHRoZSBNSVQgdnMuIEhlaW1kYWwgZGlmZmVyZW5jZXMKKyAqIGhlcmUgd2l0aCBtYWNyb3MuLi4KKyAqLworCisjaWZkZWYgSEFWRV9LUkI1CisjZGVmaW5lIGs1X2ZyZWVfdW5wYXJzZWRfbmFtZShjdHgsIG5hbWUpCWtyYjVfZnJlZV91bnBhcnNlZF9uYW1lKChjdHgpLCAobmFtZSkpCisjZGVmaW5lIGs1X2ZyZWVfZGVmYXVsdF9yZWFsbShjdHgsIHJlYWxtKQlrcmI1X2ZyZWVfZGVmYXVsdF9yZWFsbSgoY3R4KSwgKHJlYWxtKSkKKyNkZWZpbmUgazVfZnJlZV9rdF9lbnRyeShjdHgsIGt0ZSkJCWtyYjVfZnJlZV9rZXl0YWJfZW50cnlfY29udGVudHMoKGN0eCksKGt0ZSkpCisjZWxzZQkvKiBIZWltZGFsICovCisjZGVmaW5lIGs1X2ZyZWVfdW5wYXJzZWRfbmFtZShjdHgsIG5hbWUpCWZyZWUobmFtZSkKKyNkZWZpbmUgazVfZnJlZV9kZWZhdWx0X3JlYWxtKGN0eCwgcmVhbG0pCWZyZWUocmVhbG0pCisjZGVmaW5lIGs1X2ZyZWVfa3RfZW50cnkoY3R4LCBrdGUpCQlrcmI1X2t0X2ZyZWVfZW50cnkoKGN0eCksKGt0ZSkpCisjdW5kZWYgVVNFX0dTU19LUkI1X0NDQUNIRV9OQU1FCisjZGVmaW5lIFVTRV9HU1NfS1JCNV9DQ0FDSEVfTkFNRSAxCisjZW5kaWYKKworI2VuZGlmIC8qIEtSQjVfVVRJTF9IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9zdmNnc3NkLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9zdmNnc3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YjZhNgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2QuYwpAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAgZ3NzZC5jCisKKyAgQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIENvcHlyaWdodCAoYykgMjAwMCBEdWcgU29uZyA8ZHVnc29uZ0BVTUlDSC5FRFU+LgorICBDb3B5cmlnaHQgKGMpIDIwMDIgQW5keSBBZGFtc29uIDxhbmRyb3NAVU1JQ0guRURVPi4KKyAgQ29weXJpZ2h0IChjKSAyMDAyIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQFVNSUNILkVEVT4uCisgIENvcHlyaWdodCAoYykgMjAwMiBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAVU1JQ0guRURVPi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZCwgYWxsIHdyb25ncyByZXZlcnNlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYJLyogSEFWRV9DT05GSUdfSCAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxuZnNpZG1hcC5oPgorI2luY2x1ZGUgIm5mc2xpYi5oIgorI2luY2x1ZGUgInN2Y2dzc2QuaCIKKyNpbmNsdWRlICJnc3NfdXRpbC5oIgorI2luY2x1ZGUgImVycl91dGlsLmgiCisKKy8qCisgKiBteWRhZW1vbiBjcmVhdGVzIGEgcGlwZSBiZXR3ZWVuIHRoZSBwYXJ0ZW50IGFuZCBjaGlsZAorICogcHJvY2Vzcy4gVGhlIHBhcmVudCBwcm9jZXNzIHdpbGwgd2FpdCB1bnRpbCB0aGUKKyAqIGNoaWxkIGRpZXMgb3Igd3JpdGVzIGEgJzEnIG9uIHRoZSBwaXBlIHNpZ25hbGluZworICogdGhhdCBpdCBzdGFydGVkIHN1Y2Nlc3NmdWxseS4KKyAqLworaW50IHBpcGVmZHNbMl0gPSB7IC0xLCAtMX07CisKK3N0YXRpYyB2b2lkCitteWRhZW1vbihpbnQgbm9jaGRpciwgaW50IG5vY2xvc2UpCit7CisJaW50IHBpZCwgc3RhdHVzLCB0ZW1wZmQ7CisKKwlpZiAocGlwZShwaXBlZmRzKSA8IDApIHsKKwkJcHJpbnRlcnIoMSwgIm15ZGFlbW9uOiBwaXBlKCkgZmFpbGVkOiBlcnJubyAlZCAoJXMpXG4iLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCWlmICgocGlkID0gZm9yayAoKSkgPCAwKSB7CisJCXByaW50ZXJyKDEsICJteWRhZW1vbjogZm9yaygpIGZhaWxlZDogZXJybm8gJWQgKCVzKVxuIiwKKwkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCWlmIChwaWQgIT0gMCkgeworCQkvKgorCQkgKiBQYXJlbnQuIFdhaXQgZm9yIHN0YXR1cyBmcm9tIGNoaWxkLgorCQkgKi8KKwkJY2xvc2UocGlwZWZkc1sxXSk7CisJCWlmIChyZWFkKHBpcGVmZHNbMF0sICZzdGF0dXMsIDEpICE9IDEpCisJCQlleGl0KDEpOworCQlleGl0ICgwKTsKKwl9CisJLyogQ2hpbGQuCSovCisJY2xvc2UocGlwZWZkc1swXSk7CisJc2V0c2lkICgpOworCWlmIChub2NoZGlyID09IDApIHsKKwkJaWYgKGNoZGlyICgiLyIpID09IC0xKSB7CisJCQlwcmludGVycigxLCAibXlkYWVtb246IGNoZGlyKCkgZmFpbGVkOiBlcnJubyAlZCAoJXMpXG4iLAorCQkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCXdoaWxlIChwaXBlZmRzWzFdIDw9IDIpIHsKKwkJcGlwZWZkc1sxXSA9IGR1cChwaXBlZmRzWzFdKTsKKwkJaWYgKHBpcGVmZHNbMV0gPCAwKSB7CisJCQlwcmludGVycigxLCAibXlkYWVtb246IGR1cCgpIGZhaWxlZDogZXJybm8gJWQgKCVzKVxuIiwKKwkJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAobm9jbG9zZSA9PSAwKSB7CisJCXRlbXBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJCWlmICh0ZW1wZmQgPj0gMCkgeworCQkJZHVwMih0ZW1wZmQsIDApOworCQkJZHVwMih0ZW1wZmQsIDEpOworCQkJZHVwMih0ZW1wZmQsIDIpOworCQkJY2xvc2UodGVtcGZkKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZXJyKDEsICJteWRhZW1vbjogY2FuJ3Qgb3BlbiAvZGV2L251bGw6IGVycm5vICVkICIKKwkJCQkgICAgIiglcylcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2VfcGFyZW50KHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCWlmIChwaXBlZmRzWzFdID4gMCkgeworCQlpZiAod3JpdGUocGlwZWZkc1sxXSwgJnN0YXR1cywgMSkgIT0gMSkgeworCQkJcHJpbnRlcnIoMSwgCisJCQkJIldBUk46IHdyaXRpbmcgdG8gcGFyZW50IHBpcGUgZmFpbGVkOiBlcnJubyAlZCAoJXMpXG4iLAorCQkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWNsb3NlKHBpcGVmZHNbMV0pOworCQlwaXBlZmRzWzFdID0gLTE7CisJfQorfQorCit2b2lkCitzaWdfZGllKGludCBzaWduYWwpCit7CisJLyogZGVzdHJveSBrcmI1IG1hY2hpbmUgY3JlZHMgKi8KKwlwcmludGVycigxLCAiZXhpdGluZyBvbiBzaWduYWwgJWRcbiIsIHNpZ25hbCk7CisJZXhpdCgxKTsKK30KKwordm9pZAorc2lnX2h1cChpbnQgc2lnbmFsKQoreworCS8qIGRvbid0IGV4aXQgb24gU0lHSFVQICovCisJcHJpbnRlcnIoMSwgIlJlY2VpdmVkIFNJR0hVUC4uLiBJZ25vcmluZy5cbiIpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKGNoYXIgKnByb2duYW1lKQoreworCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFstbl0gWy1mXSBbLXZdIFstcl0gWy1pXVxuIiwKKwkJcHJvZ25hbWUpOworCWV4aXQoMSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBnZXRfY3JlZHMgPSAxOworCWludCBmZyA9IDA7CisJaW50IHZlcmJvc2l0eSA9IDA7CisJaW50IHJwY192ZXJib3NpdHkgPSAwOworCWludCBpZG1hcF92ZXJib3NpdHkgPSAwOworCWludCBvcHQ7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwljaGFyICpwcm9nbmFtZTsKKworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJmaXZybnA6IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCQljYXNlICdmJzoKKwkJCQlmZyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdpJzoKKwkJCQlpZG1hcF92ZXJib3NpdHkrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWdldF9jcmVkcyA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlICd2JzoKKwkJCQl2ZXJib3NpdHkrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJCXJwY192ZXJib3NpdHkrKzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKHByb2duYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpKSkKKwkJcHJvZ25hbWUrKzsKKwllbHNlCisJCXByb2duYW1lID0gYXJndlswXTsKKworCWluaXRlcnIocHJvZ25hbWUsIHZlcmJvc2l0eSwgZmcpOworI2lmZGVmIEhBVkVfQVVUSEdTU19TRVRfREVCVUdfTEVWRUwKKwlpZiAodmVyYm9zaXR5ICYmIHJwY192ZXJib3NpdHkgPT0gMCkKKwkJcnBjX3ZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKKwlhdXRoZ3NzX3NldF9kZWJ1Z19sZXZlbChycGNfdmVyYm9zaXR5KTsKKyNlbHNlCisJaWYgKHJwY192ZXJib3NpdHkgPiAwKQorCQlwcmludGVycigwLCAiV2FybmluZzogcnBjc2VjX2dzcyBsaWJyYXJ5IGRvZXMgbm90ICIKKwkJCSAgICAic3VwcG9ydCBzZXR0aW5nIGRlYnVnIGxldmVsXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfTkZTNF9TRVRfREVCVUcKKwkJaWYgKHZlcmJvc2l0eSAmJiBpZG1hcF92ZXJib3NpdHkgPT0gMCkKKwkJCWlkbWFwX3ZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKKyAgICAgICAgbmZzNF9zZXRfZGVidWcoaWRtYXBfdmVyYm9zaXR5LCBOVUxMKTsKKyNlbHNlCisJaWYgKGlkbWFwX3ZlcmJvc2l0eSA+IDApCisJCXByaW50ZXJyKDAsICJXYXJuaW5nOiB5b3VyIG5mc2lkbWFwIGxpYnJhcnkgZG9lcyBub3QgIgorCQkJICAgICJzdXBwb3J0IHNldHRpbmcgZGVidWcgbGV2ZWxcbiIpOworI2VuZGlmCisKKwlpZiAoZ3NzZF9jaGVja19tZWNocygpICE9IDApIHsKKwkJcHJpbnRlcnIoMCwgIkVSUk9SOiBQcm9ibGVtIHdpdGggZ3NzYXBpIGxpYnJhcnlcbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghZmcpCisJCW15ZGFlbW9uKDAsIDApOworCisJc2lnbmFsKFNJR0lOVCwgc2lnX2RpZSk7CisJc2lnbmFsKFNJR1RFUk0sIHNpZ19kaWUpOworCXNpZ25hbChTSUdIVVAsIHNpZ19odXApOworCisJaWYgKGdldF9jcmVkcyAmJiAhZ3NzZF9hY3F1aXJlX2NyZWQoR1NTRF9TRVJWSUNFX05BTUUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlcnIoMCwgInVuYWJsZSB0byBvYnRhaW4gcm9vdCAobWFjaGluZSkgY3JlZGVudGlhbHNcbiIpOworICAgICAgICAgICAgICAgIHByaW50ZXJyKDAsICJkbyB5b3UgaGF2ZSBhIGtleXRhYiBlbnRyeSBmb3IgIgorCQkJICAgICJuZnMvPHlvdXIuaG9zdD5APFlPVVIuUkVBTE0+IGluICIKKwkJCSAgICAiL2V0Yy9rcmI1LmtleXRhYj9cbiIpOworCQlleGl0KDEpOworCX0KKworCWlmICghZmcpCisJCXJlbGVhc2VfcGFyZW50KCk7CisKKwlnc3NkX3J1bigpOworCXByaW50ZXJyKDAsICJnc3NkX3J1biByZXR1cm5lZCFcbiIpOworCWFib3J0KCk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9zdmNnc3NkLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9zdmNnc3NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyZTJlOAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2QuaApAQCAtMCwwICsxLDQzIEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmbmRlZiBfUlBDX1NWQ0dTU0RfSF8KKyNkZWZpbmUgX1JQQ19TVkNHU1NEX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNpbmNsdWRlIDxnc3NhcGkvZ3NzYXBpLmg+CisKK3ZvaWQgaGFuZGxlX251bGxyZXEoRklMRSAqZik7Cit2b2lkIGdzc2RfcnVuKHZvaWQpOworCisjZGVmaW5lIEdTU0RfU0VSVklDRV9OQU1FCSJuZnMiCisKKyNlbmRpZiAvKiBfUlBDX1NWQ0dTU0RfSF8gKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2QubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvc3ZjZ3NzZC5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwMTVlMQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2QubWFuCkBAIC0wLDAgKzEsNDkgQEAKKy5cIgorLlwiIHJwYy5zdmNnc3NkKDgpCisuXCIKKy5cIiBDb3B5cmlnaHQgKEMpIDIwMDMgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHVtaWNoLmVkdT4KKy5USCBycGMuc3ZjZ3NzZCA4ICIxMiBKYW4gMjAwNyIKKy5TSCBOQU1FCitycGMuc3ZjZ3NzZCBcLSBzZXJ2ZXItc2lkZSBycGNzZWNfZ3NzIGRhZW1vbgorLlNIIFNZTk9QU0lTCisuQiAicnBjLnN2Y2dzc2QgWy12XSBbLXJdIFstaV0gWy1mXSBbLXAgcGlwZWZzZGlyXSIKKy5TSCBERVNDUklQVElPTgorVGhlIHJwY3NlY19nc3MgcHJvdG9jb2wgZ2l2ZXMgYSBtZWFucyBvZiB1c2luZyB0aGUgZ3NzLWFwaSBnZW5lcmljIHNlY3VyaXR5CithcGkgdG8gcHJvdmlkZSBzZWN1cml0eSBmb3IgcHJvdG9jb2xzIHVzaW5nIHJwYyAoaW4gcGFydGljdWxhciwgbmZzKS4gIEJlZm9yZQorZXhjaGFuZ2luZyBhbnkgcnBjIHJlcXVlc3RzIHVzaW5nIHJwY3NlY19nc3MsIHRoZSBycGMgY2xpZW50IG11c3QgZmlyc3QKK2VzdGFibGlzaCBhIHNlY3VyaXR5IGNvbnRleHQgd2l0aCB0aGUgcnBjIHNlcnZlci4gIFRoZSBsaW51eCBrZXJuZWwncworaW1wbGVtZW50YXRpb24gb2YgcnBjc2VjX2dzcyBkZXBlbmRzIG9uIHRoZSB1c2Vyc3BhY2UgZGFlbW9uCisuQiBycGMuc3ZjZ3NzZAordG8gaGFuZGxlIGNvbnRleHQgZXN0YWJsaXNobWVudCBvbiB0aGUgcnBjIHNlcnZlci4gIFRoZQorZGFlbW9uIHVzZXMgZmlsZXMgaW4gdGhlIHByb2MgZmlsZXN5c3RlbSB0byBjb21tdW5pY2F0ZSB3aXRoCit0aGUga2VybmVsLgorCisuU0ggT1BUSU9OUworLlRQCisuQiAtZgorUnVucworLkIgcnBjLnN2Y2dzc2QKK2luIHRoZSBmb3JlZ3JvdW5kIGFuZCBzZW5kcyBvdXRwdXQgdG8gc3RkZXJyIChhcyBvcHBvc2VkIHRvIHN5c2xvZ2QpCisuVFAKKy5CIC12CitJbmNyZWFzZXMgdGhlIHZlcmJvc2l0eSBvZiB0aGUgb3V0cHV0IChjYW4gYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzKS4KKy5UUAorLkIgLXIKK0lmIHRoZSBycGNzZWNfZ3NzIGxpYnJhcnkgc3VwcG9ydHMgc2V0dGluZyBkZWJ1ZyBsZXZlbCwKK2luY3JlYXNlcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQgKGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMpLgorLlRQCisuQiAtaQorSWYgdGhlIG5mc2lkbWFwIGxpYnJhcnkgc3VwcG9ydHMgc2V0dGluZyBkZWJ1ZyBsZXZlbCwKK2luY3JlYXNlcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQgKGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMpLgorCisuU0ggU0VFIEFMU08KKy5CUiBycGMuZ3NzZCg4KSwKKy5TSCBBVVRIT1JTCisuYnIKK0R1ZyBTb25nIDxkdWdzb25nQHVtaWNoLmVkdT4KKy5icgorQW5keSBBZGFtc29uIDxhbmRyb3NAdW1pY2guZWR1PgorLmJyCitNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisuYnIKK0ouIEJydWNlIEZpZWxkcyA8YmZpZWxkc0B1bWljaC5lZHU+CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC9zdmNnc3NkX21haW5fbG9vcC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvc3ZjZ3NzZF9tYWluX2xvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjQxMTFjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvc3ZjZ3NzZF9tYWluX2xvb3AuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgkvKiBIQVZFX0NPTkZJR19IICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAic3ZjZ3NzZC5oIgorI2luY2x1ZGUgImVycl91dGlsLmgiCisKK3ZvaWQKK2dzc2RfcnVuKCkKK3sKKwlpbnQJCQlyZXQ7CisJRklMRQkJCSpmOworCXN0cnVjdCBwb2xsZmQJCXBvbGxmZDsKKworI2RlZmluZSBOVUxMUlBDX0ZJTEUgIi9wcm9jL25ldC9ycGMvYXV0aC5ycGNzZWMuaW5pdC9jaGFubmVsIgorCisJZiA9IGZvcGVuKE5VTExSUENfRklMRSwgInJ3Iik7CisKKwlpZiAoIWYpIHsKKwkJcHJpbnRlcnIoMCwgImZhaWxlZCB0byBvcGVuICVzOiAlc1xuIiwKKwkJCSBOVUxMUlBDX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCXBvbGxmZC5mZCA9IGZpbGVubyhmKTsKKwlwb2xsZmQuZXZlbnRzID0gUE9MTElOOworCXdoaWxlICgxKSB7CisJCWludCBzYXZlX2VycjsKKworCQlwb2xsZmQucmV2ZW50cyA9IDA7CisJCXByaW50ZXJyKDEsICJlbnRlcmluZyBwb2xsXG4iKTsKKwkJcmV0ID0gcG9sbCgmcG9sbGZkLCAxLCAtMSk7CisJCXNhdmVfZXJyID0gZXJybm87CisJCXByaW50ZXJyKDEsICJsZWF2aW5nIHBvbGxcbiIpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKHNhdmVfZXJyICE9IEVJTlRSKQorCQkJCXByaW50ZXJyKDAsICJlcnJvciByZXR1cm4gZnJvbSBwb2xsOiAlc1xuIiwKKwkJCQkJIHN0cmVycm9yKHNhdmVfZXJyKSk7CisJCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJCS8qIHRpbWVvdXQ7IHNob3VsZG4ndCBoYXBwZW4uICovCisJCX0gZWxzZSB7CisJCQlpZiAocmV0ICE9IDEpIHsKKwkJCQlwcmludGVycigwLCAiYnVnOiB1bmV4cGVjdGVkIHBvbGwgcmV0dXJuICVkXG4iLAorCQkJCQkJcmV0KTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJaWYgKHBvbGxmZC5yZXZlbnRzICYgUE9MTElOKQorCQkJCWhhbmRsZV9udWxscmVxKGYpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvc3ZjZ3NzZF9tZWNoMmZpbGUuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2RfbWVjaDJmaWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkZThkMAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2RfbWVjaDJmaWxlLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAgbGludXhfZG93bmNhbGwuYworCisgIENvcHlyaWdodCAoYykgMjAwMCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBDb3B5cmlnaHQgKGMpIDIwMDQgQW5keSBBZGFtc29uIDxhbmRyb3NAVU1JQ0guRURVPi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZCwgYWxsIHdyb25ncyByZXZlcnNlZC4KKworICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgIGFyZSBtZXQ6CisKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYJLyogSEFWRV9DT05GSUdfSCAqLworCisjaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNkZWZpbmUgZ19PSURfZXF1YWwobzEsbzIpIFwKKyAgICgoKG8xKS0+bGVuZ3RoID09IChvMiktPmxlbmd0aCkgJiYgXAorICAgIChtZW1jbXAoKG8xKS0+ZWxlbWVudHMsKG8yKS0+ZWxlbWVudHMsKGludCkgKG8xKS0+bGVuZ3RoKSA9PSAwKSkKKworc3RydWN0IG1lY2gyZmlsZSB7CisJZ3NzX09JRF9kZXNjIG1lY2g7CisJY2hhciAgICAgICAgIGZpbGVuYW1lWzhdOworfTsKKworc3RydWN0IG1lY2gyZmlsZSBtMmZbXSA9IHsKKwl7ezksICJcMDUyXDIwNlwxMTBcMjA2XDM2N1wwMjJcMDAxXDAwMlwwMDIifSwgImtyYjUifSwKKwl7ezcsICJcMDUzXDAwNlwwMDFcMDA1XDAwNVwwMDFcMDAzIn0sICJzcGttMyJ9LAorCXt7NywgIlwwNTNcMDA2XDAwMVwwMDVcMDA1XDAwMVwwMDkifSwgImxpcGtleSJ9LAorCXt7MCwwfSwiIn0sCit9OworCisvKgorICogRmluZCB0aGUgTGludXggc3ZjZ3NzZCBkb3duY2FsbCBmaWxlIG5hbWUgZ2l2ZW4gdGhlIG1lY2hhbmlzbQorICovCitjaGFyICoKK21lY2gyZmlsZShnc3NfT0lEIG1lY2gpCit7CisJc3RydWN0IG1lY2gyZmlsZSAqbTJmcCA9IG0yZjsKKworCXdoaWxlKG0yZnAtPm1lY2gubGVuZ3RoICE9IDApIHsKKwkJaWYgKGdfT0lEX2VxdWFsKG1lY2gsJm0yZnAtPm1lY2gpKQorCQkJcmV0dXJuKG0yZnAtPmZpbGVuYW1lKTsKKwkJbTJmcCsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2RfcHJvYy5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvc3ZjZ3NzZF9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiZmJlZgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9nc3NkL3N2Y2dzc2RfcHJvYy5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICBzdmNfaW5fZ3NzZF9wcm9jLmMKKworICBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgQ29weXJpZ2h0IChjKSAyMDAyIEJydWNlIEZpZWxkcyA8YmZpZWxkc0BVTUlDSC5FRFU+CisKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorCisgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCS8qIEhBVkVfQ09ORklHX0ggKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZnNpZG1hcC5oPgorI2luY2x1ZGUgPG5mc2xpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgInN2Y2dzc2QuaCIKKyNpbmNsdWRlICJnc3NfdXRpbC5oIgorI2luY2x1ZGUgImVycl91dGlsLmgiCisjaW5jbHVkZSAiY29udGV4dC5oIgorI2luY2x1ZGUgImdzc19vaWRzLmgiCisKK2V4dGVybiBjaGFyICogbWVjaDJmaWxlKGdzc19PSUQgbWVjaCk7CisjZGVmaW5lIFNWQ0dTU0RfQ09OVEVYVF9DSEFOTkVMICIvcHJvYy9uZXQvcnBjL2F1dGgucnBjc2VjLmNvbnRleHQvY2hhbm5lbCIKKyNkZWZpbmUgU1ZDR1NTRF9JTklUX0NIQU5ORUwgICAgIi9wcm9jL25ldC9ycGMvYXV0aC5ycGNzZWMuaW5pdC9jaGFubmVsIgorCisjZGVmaW5lIFRPS0VOX0JVRl9TSVpFCQk4MTkyCisKK3N0cnVjdCBzdmNfY3JlZCB7CisJdWlkX3QJY3JfdWlkOworCWdpZF90CWNyX2dpZDsKKwlpbnQJY3Jfbmdyb3VwczsKKwlnaWRfdAljcl9ncm91cHNbTkdST1VQU107Cit9OworCitzdGF0aWMgaW50Citkb19zdmNfZG93bmNhbGwoZ3NzX2J1ZmZlcl9kZXNjICpvdXRfaGFuZGxlLCBzdHJ1Y3Qgc3ZjX2NyZWQgKmNyZWQsCisJCWdzc19PSUQgbWVjaCwgZ3NzX2J1ZmZlcl9kZXNjICpjb250ZXh0X3Rva2VuLAorCQlpbnQzMl90IGVuZHRpbWUsIGNoYXIgKmNsaWVudF9uYW1lKQoreworCUZJTEUgKmY7CisJaW50IGk7CisJY2hhciAqZm5hbWUgPSBOVUxMOworCWludCBlcnI7CisKKwlwcmludGVycigxLCAiZG9pbmcgZG93bmNhbGxcbiIpOworCWlmICgoZm5hbWUgPSBtZWNoMmZpbGUobWVjaCkpID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwlmID0gZm9wZW4oU1ZDR1NTRF9DT05URVhUX0NIQU5ORUwsICJ3Iik7CisJaWYgKGYgPT0gTlVMTCkgeworCQlwcmludGVycigwLCAiV0FSTklORzogdW5hYmxlIHRvIG9wZW4gZG93bmNhbGwgY2hhbm5lbCAiCisJCQkgICAgICIlczogJXNcbiIsCisJCQkgICAgIFNWQ0dTU0RfQ09OVEVYVF9DSEFOTkVMLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dF9lcnI7CisJfQorCXF3b3JkX3ByaW50aGV4KGYsIG91dF9oYW5kbGUtPnZhbHVlLCBvdXRfaGFuZGxlLT5sZW5ndGgpOworCS8qIFhYWCBhcmUgdHlwZXMgT0sgZm9yIHRoZSByZXN0IG9mIHRoaXM/ICovCisJLyogRm9yIGNvbnRleHQgY2FjaGUsIHVzZSB0aGUgYWN0dWFsIGNvbnRleHQgZW5kdGltZSAqLworCXF3b3JkX3ByaW50aW50KGYsIGVuZHRpbWUpOworCXF3b3JkX3ByaW50aW50KGYsIGNyZWQtPmNyX3VpZCk7CisJcXdvcmRfcHJpbnRpbnQoZiwgY3JlZC0+Y3JfZ2lkKTsKKwlxd29yZF9wcmludGludChmLCBjcmVkLT5jcl9uZ3JvdXBzKTsKKwlwcmludGVycigyLCAibWVjaDogJXMsIGhuZGwgbGVuOiAlZCwgY3R4IGxlbiAlZCwgdGltZW91dDogJWQgKCVkIGZyb20gbm93KSwgIgorCQkgImNsbnQ6ICVzLCB1aWQ6ICVkLCBnaWQ6ICVkLCBudW0gYXV4IGdycHM6ICVkOlxuIiwKKwkJIGZuYW1lLCBvdXRfaGFuZGxlLT5sZW5ndGgsIGNvbnRleHRfdG9rZW4tPmxlbmd0aCwKKwkJIGVuZHRpbWUsIGVuZHRpbWUgLSB0aW1lKDApLAorCQkgY2xpZW50X25hbWUgPyBjbGllbnRfbmFtZSA6ICI8bnVsbD4iLAorCQkgY3JlZC0+Y3JfdWlkLCBjcmVkLT5jcl9naWQsIGNyZWQtPmNyX25ncm91cHMpOworCWZvciAoaT0wOyBpIDwgY3JlZC0+Y3Jfbmdyb3VwczsgaSsrKSB7CisJCXF3b3JkX3ByaW50aW50KGYsIGNyZWQtPmNyX2dyb3Vwc1tpXSk7CisJCXByaW50ZXJyKDIsICIgICglNGQpICVkXG4iLCBpKzEsIGNyZWQtPmNyX2dyb3Vwc1tpXSk7CisJfQorCXF3b3JkX3ByaW50KGYsIGZuYW1lKTsKKwlxd29yZF9wcmludGhleChmLCBjb250ZXh0X3Rva2VuLT52YWx1ZSwgY29udGV4dF90b2tlbi0+bGVuZ3RoKTsKKwlpZiAoY2xpZW50X25hbWUpCisJCXF3b3JkX3ByaW50KGYsIGNsaWVudF9uYW1lKTsKKwllcnIgPSBxd29yZF9lb2woZik7CisJaWYgKGVycikgeworCQlwcmludGVycigxLCAiV0FSTklORzogZXJyb3Igd3JpdGluZyB0byBkb3duY2FsbCBjaGFubmVsICIKKwkJCSAiJXM6ICVzXG4iLCBTVkNHU1NEX0NPTlRFWFRfQ0hBTk5FTCwgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJZmNsb3NlKGYpOworCXJldHVybiBlcnI7CitvdXRfZXJyOgorCXByaW50ZXJyKDEsICJXQVJOSU5HOiBkb3duY2FsbCBmYWlsZWRcbiIpOworCXJldHVybiAtMTsKK30KKworc3RydWN0IGdzc192ZXJpZmllciB7CisJdV9pbnQzMl90CWZsYXY7CisJZ3NzX2J1ZmZlcl9kZXNjCWJvZHk7Cit9OworCisjZGVmaW5lIFJQQ1NFQ19HU1NfU0VRX1dJTgk1CisKK3N0YXRpYyBpbnQKK3NlbmRfcmVzcG9uc2UoRklMRSAqZiwgZ3NzX2J1ZmZlcl9kZXNjICppbl9oYW5kbGUsIGdzc19idWZmZXJfZGVzYyAqaW5fdG9rZW4sCisJICAgICAgdV9pbnQzMl90IG1hal9zdGF0LCB1X2ludDMyX3QgbWluX3N0YXQsCisJICAgICAgZ3NzX2J1ZmZlcl9kZXNjICpvdXRfaGFuZGxlLCBnc3NfYnVmZmVyX2Rlc2MgKm91dF90b2tlbikKK3sKKwljaGFyIGJ1ZlsyICogVE9LRU5fQlVGX1NJWkVdOworCWNoYXIgKmJwID0gYnVmOworCWludCBibGVuID0gc2l6ZW9mKGJ1Zik7CisJLyogWFhYQVJHOiAqLworCWludCBnOworCisJcHJpbnRlcnIoMSwgInNlbmRpbmcgbnVsbCByZXBseVxuIik7CisKKwlxd29yZF9hZGRoZXgoJmJwLCAmYmxlbiwgaW5faGFuZGxlLT52YWx1ZSwgaW5faGFuZGxlLT5sZW5ndGgpOworCXF3b3JkX2FkZGhleCgmYnAsICZibGVuLCBpbl90b2tlbi0+dmFsdWUsIGluX3Rva2VuLT5sZW5ndGgpOworCS8qIEZvciBpbml0IGNhY2hlLCBvbmx5IG5lZWRlZCBmb3IgYSBzaG9ydCB0aW1lICovCisJcXdvcmRfYWRkaW50KCZicCwgJmJsZW4sIHRpbWUoMCkgKyA2MCk7CisJcXdvcmRfYWRkdWludCgmYnAsICZibGVuLCBtYWpfc3RhdCk7CisJcXdvcmRfYWRkdWludCgmYnAsICZibGVuLCBtaW5fc3RhdCk7CisJcXdvcmRfYWRkaGV4KCZicCwgJmJsZW4sIG91dF9oYW5kbGUtPnZhbHVlLCBvdXRfaGFuZGxlLT5sZW5ndGgpOworCXF3b3JkX2FkZGhleCgmYnAsICZibGVuLCBvdXRfdG9rZW4tPnZhbHVlLCBvdXRfdG9rZW4tPmxlbmd0aCk7CisJcXdvcmRfYWRkZW9sKCZicCwgJmJsZW4pOworCWlmIChibGVuIDw9IDApIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IHNlbmRfcmVzcHNvbnNlOiBtZXNzYWdlIHRvbyBsb25nXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlnID0gb3BlbihTVkNHU1NEX0lOSVRfQ0hBTk5FTCwgT19XUk9OTFkpOworCWlmIChnID09IC0xKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBvcGVuICVzIGZhaWxlZDogJXNcbiIsCisJCQkJU1ZDR1NTRF9JTklUX0NIQU5ORUwsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJKmJwID0gJ1wwJzsKKwlwcmludGVycigzLCAid3JpdGluZyBtZXNzYWdlOiAlcyIsIGJ1Zik7CisJaWYgKHdyaXRlKGcsIGJ1ZiwgYnAgLSBidWYpID09IC0xKSB7CisJCXByaW50ZXJyKDAsICJXQVJOSU5HOiBmYWlsZWQgdG8gd3JpdGUgbWVzc2FnZVxuIik7CisJCWNsb3NlKGcpOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKGcpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIHJwY19hdXRoX29rCQkJMAorI2RlZmluZSBycGNfYXV0aGVycl9iYWRjcmVkCQkxCisjZGVmaW5lIHJwY19hdXRoZXJyX3JlamVjdGVkY3JlZAkyCisjZGVmaW5lIHJwY19hdXRoZXJyX2JhZHZlcmYJCTMKKyNkZWZpbmUgcnBjX2F1dGhlcnJfcmVqZWN0ZWR2ZXJmCTQKKyNkZWZpbmUgcnBjX2F1dGhlcnJfdG9vd2VhawkJNQorI2RlZmluZSBycGNzZWNfZ3NzZXJyX2NyZWRwcm9ibGVtCTEzCisjZGVmaW5lIHJwY3NlY19nc3NlcnJfY3R4cHJvYmxlbQkxNAorCitzdGF0aWMgdm9pZAorYWRkX3N1cHBsZW1lbnRhcnlfZ3JvdXBzKGNoYXIgKnNlY25hbWUsIGNoYXIgKm5hbWUsIHN0cnVjdCBzdmNfY3JlZCAqY3JlZCkKK3sKKwlpbnQgcmV0OworCXN0YXRpYyBnaWRfdCAqZ3JvdXBzID0gTlVMTDsKKworCWNyZWQtPmNyX25ncm91cHMgPSBOR1JPVVBTOworCXJldCA9IG5mczRfZ3NzX3ByaW5jX3RvX2dyb3VwbGlzdChzZWNuYW1lLCBuYW1lLAorCQkJY3JlZC0+Y3JfZ3JvdXBzLCAmY3JlZC0+Y3Jfbmdyb3Vwcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZ3JvdXBzID0gcmVhbGxvYyhncm91cHMsIGNyZWQtPmNyX25ncm91cHMqc2l6ZW9mKGdpZF90KSk7CisJCXJldCA9IG5mczRfZ3NzX3ByaW5jX3RvX2dyb3VwbGlzdChzZWNuYW1lLCBuYW1lLAorCQkJCWdyb3VwcywgJmNyZWQtPmNyX25ncm91cHMpOworCQlpZiAocmV0IDwgMCkKKwkJCWNyZWQtPmNyX25ncm91cHMgPSAwOworCQllbHNlIHsKKwkJCWlmIChjcmVkLT5jcl9uZ3JvdXBzID4gTkdST1VQUykKKwkJCQljcmVkLT5jcl9uZ3JvdXBzID0gTkdST1VQUzsKKwkJCW1lbWNweShjcmVkLT5jcl9ncm91cHMsIGdyb3VwcywKKwkJCQkJY3JlZC0+Y3Jfbmdyb3VwcypzaXplb2YoZ2lkX3QpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorZ2V0X2lkcyhnc3NfbmFtZV90IGNsaWVudF9uYW1lLCBnc3NfT0lEIG1lY2gsIHN0cnVjdCBzdmNfY3JlZCAqY3JlZCkKK3sKKwl1X2ludDMyX3QJbWFqX3N0YXQsIG1pbl9zdGF0OworCWdzc19idWZmZXJfZGVzYwluYW1lOworCWNoYXIJCSpzbmFtZTsKKwlpbnQJCXJlcyA9IC0xOworCXVpZF90CQl1aWQsIGdpZDsKKwlnc3NfT0lECQluYW1lX3R5cGUgPSBHU1NfQ19OT19PSUQ7CisJY2hhcgkJKnNlY25hbWU7CisKKwltYWpfc3RhdCA9IGdzc19kaXNwbGF5X25hbWUoJm1pbl9zdGF0LCBjbGllbnRfbmFtZSwgJm5hbWUsICZuYW1lX3R5cGUpOworCWlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkgeworCQlwZ3NzZXJyKCJnZXRfaWRzOiBnc3NfZGlzcGxheV9uYW1lIiwKKwkJCW1hal9zdGF0LCBtaW5fc3RhdCwgbWVjaCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAobmFtZS5sZW5ndGggPj0gMHhmZmZmIHx8IC8qIGJlIGNlcnRhaW4gbmFtZS5sZW5ndGgrMSBkb2Vzbid0IG92ZXJmbG93ICovCisJICAgICEoc25hbWUgPSBjYWxsb2MobmFtZS5sZW5ndGggKyAxLCAxKSkpIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IGdldF9pZHM6IGVycm9yIGFsbG9jYXRpbmcgJWQgYnl0ZXMgIgorCQkJImZvciBzbmFtZVxuIiwgbmFtZS5sZW5ndGggKyAxKTsKKwkJZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdCwgJm5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJbWVtY3B5KHNuYW1lLCBuYW1lLnZhbHVlLCBuYW1lLmxlbmd0aCk7CisJcHJpbnRlcnIoMSwgInNuYW1lID0gJXNcbiIsIHNuYW1lKTsKKwlnc3NfcmVsZWFzZV9idWZmZXIoJm1pbl9zdGF0LCAmbmFtZSk7CisKKwlyZXMgPSAtRUlOVkFMOworCWlmICgoc2VjbmFtZSA9IG1lY2gyZmlsZShtZWNoKSkgPT0gTlVMTCkgeworCQlwcmludGVycigwLCAiV0FSTklORzogZ2V0X2lkczogZXJyb3IgbWFwcGluZyBtZWNoIHRvICIKKwkJCSJmaWxlIGZvciBuYW1lICclcydcbiIsIHNuYW1lKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJbmZzNF9pbml0X25hbWVfbWFwcGluZyhOVUxMKTsgLyogWFhYOiBzaG91bGQgb25seSBkbyB0aGlzIG9uY2UgKi8KKwlyZXMgPSBuZnM0X2dzc19wcmluY190b19pZHMoc2VjbmFtZSwgc25hbWUsICZ1aWQsICZnaWQpOworCWlmIChyZXMgPCAwKSB7CisJCS8qCisJCSAqIC1FTk9FTlQgbWVhbnMgdGhlcmUgd2FzIG5vIG1hcHBpbmcsIGFueSBvdGhlciBlcnJvcgorCQkgKiB2YWx1ZSBtZWFucyB0aGVyZSB3YXMgYW4gZXJyb3IgdHJ5aW5nIHRvIGRvIHRoZQorCQkgKiBtYXBwaW5nLgorCQkgKiBJZiB0aGVyZSB3YXMgbm8gbWFwcGluZywgd2Ugc2VuZCBkb3duIHRoZSB2YWx1ZSAtMQorCQkgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhbm9udWlkL2Fub25naWQgZm9yIHRoZSBleHBvcnQKKwkJICogc2hvdWxkIGJlIHVzZWQuCisJCSAqLworCQlpZiAocmVzID09IC1FTk9FTlQpIHsKKwkJCWNyZWQtPmNyX3VpZCA9IC0xOworCQkJY3JlZC0+Y3JfZ2lkID0gLTE7CisJCQljcmVkLT5jcl9uZ3JvdXBzID0gMDsKKwkJCXJlcyA9IDA7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXByaW50ZXJyKDEsICJXQVJOSU5HOiBnZXRfaWRzOiBmYWlsZWQgdG8gbWFwIG5hbWUgJyVzJyAiCisJCQkidG8gdWlkL2dpZDogJXNcbiIsIHNuYW1lLCBzdHJlcnJvcigtcmVzKSk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWNyZWQtPmNyX3VpZCA9IHVpZDsKKwljcmVkLT5jcl9naWQgPSBnaWQ7CisJYWRkX3N1cHBsZW1lbnRhcnlfZ3JvdXBzKHNlY25hbWUsIHNuYW1lLCBjcmVkKTsKKwlyZXMgPSAwOworb3V0X2ZyZWU6CisJZnJlZShzbmFtZSk7CitvdXQ6CisJcmV0dXJuIHJlczsKK30KKworI2lmZGVmIERFQlVHCit2b2lkCitwcmludF9oZXhsKGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCB1bnNpZ25lZCBjaGFyICpjcCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgaSwgaiwgam07CisJdW5zaWduZWQgY2hhciBjOworCisJcHJpbnRmKCIlcyAobGVuZ3RoICVkKVxuIiwgZGVzY3JpcHRpb24sIGxlbmd0aCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDB4MTApIHsKKwkJcHJpbnRmKCIgICUwNHg6ICIsICh1X2ludClpKTsKKwkJam0gPSBsZW5ndGggLSBpOworCQlqbSA9IGptID4gMTYgPyAxNiA6IGptOworCisJCWZvciAoaiA9IDA7IGogPCBqbTsgaisrKSB7CisJCQlpZiAoKGogJSAyKSA9PSAxKQorCQkJCXByaW50ZigiJTAyeCAiLCAodV9pbnQpY3BbaStqXSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlMDJ4IiwgKHVfaW50KWNwW2kral0pOworCQl9CisJCWZvciAoOyBqIDwgMTY7IGorKykgeworCQkJaWYgKChqICUgMikgPT0gMSkKKwkJCQlwcmludGYoIiAgICIpOworCQkJZWxzZQorCQkJCXByaW50ZigiICAiKTsKKwkJfQorCQlwcmludGYoIiAiKTsKKworCQlmb3IgKGogPSAwOyBqIDwgam07IGorKykgeworCQkJYyA9IGNwW2kral07CisJCQljID0gaXNwcmludChjKSA/IGMgOiAnLic7CisJCQlwcmludGYoIiVjIiwgYyk7CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitnZXRfa3JiNV9ob3N0YmFzZWRfbmFtZSAoZ3NzX2J1ZmZlcl9kZXNjICpuYW1lLCBjaGFyICoqaG9zdGJhc2VkX25hbWUpCit7CisJY2hhciAqcCwgKnNuYW1lID0gTlVMTDsKKwlpZiAoc3RyY2hyKG5hbWUtPnZhbHVlLCAnQCcpICYmIHN0cmNocihuYW1lLT52YWx1ZSwgJy8nKSkgeworCQlpZiAoKHNuYW1lID0gY2FsbG9jKG5hbWUtPmxlbmd0aCwgMSkpID09IE5VTEwpIHsKKwkJCXByaW50ZXJyKDAsICJFUlJPUjogZ2V0X2tyYjVfaG9zdGJhc2VkX25hbWUgZmFpbGVkICIKKwkJCQkgInRvIGFsbG9jYXRlICVkIGJ5dGVzXG4iLCBuYW1lLT5sZW5ndGgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qIHJlYWQgaW4gbmFtZSBhbmQgaW5zdGFuY2UgYW5kIHJlcGxhY2UgJy8nIHdpdGggJ0AnICovCisJCXNzY2FuZihuYW1lLT52YWx1ZSwgIiVbXkBdIiwgc25hbWUpOworCQlwID0gc3RycmNocihzbmFtZSwgJy8nKTsKKwkJaWYgKHAgPT0gTlVMTCkgeyAgICAvKiBUaGUgJ0AnIHByZWNlZWRlZCB0aGUgJy8nICovCisJCQlmcmVlKHNuYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqcCA9ICdAJzsKKwl9CisJKmhvc3RiYXNlZF9uYW1lID0gc25hbWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9ob3N0YmFzZWRfY2xpZW50X25hbWUoZ3NzX25hbWVfdCBjbGllbnRfbmFtZSwgZ3NzX09JRCBtZWNoLAorCQkJICBjaGFyICoqaG9zdGJhc2VkX25hbWUpCit7CisJdV9pbnQzMl90CW1hal9zdGF0LCBtaW5fc3RhdDsKKwlnc3NfYnVmZmVyX2Rlc2MJbmFtZTsKKwlnc3NfT0lECQluYW1lX3R5cGUgPSBHU1NfQ19OT19PSUQ7CisJY2hhcgkJKmNuYW1lOworCWludAkJcmVzID0gLTE7CisKKwkqaG9zdGJhc2VkX25hbWUgPSBOVUxMOwkgICAgLyogcHJlc2V0IGluIGNhc2Ugd2UgZmFpbCAqLworCisJLyogR2V0IHRoZSBjbGllbnQncyBnc3MgYXV0aGVudGljYXRlZCBuYW1lICovCisJbWFqX3N0YXQgPSBnc3NfZGlzcGxheV9uYW1lKCZtaW5fc3RhdCwgY2xpZW50X25hbWUsICZuYW1lLCAmbmFtZV90eXBlKTsKKwlpZiAobWFqX3N0YXQgIT0gR1NTX1NfQ09NUExFVEUpIHsKKwkJcGdzc2VycigiZ2V0X2hvc3RiYXNlZF9jbGllbnRfbmFtZTogZ3NzX2Rpc3BsYXlfbmFtZSIsCisJCQltYWpfc3RhdCwgbWluX3N0YXQsIG1lY2gpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChuYW1lLmxlbmd0aCA+PSAweGZmZmYpIHsJICAgIC8qIGRvbid0IG92ZXJmbG93ICovCisJCXByaW50ZXJyKDAsICJFUlJPUjogZ2V0X2hvc3RiYXNlZF9jbGllbnRfbmFtZTogIgorCQkJICJyZWNlaXZlZCBnc3NfbmFtZSBpcyB0b28gbG9uZyAoJWQgYnl0ZXMpXG4iLAorCQkJIG5hbWUubGVuZ3RoKTsKKwkJZ290byBvdXRfcmVsX2J1ZjsKKwl9CisKKwkvKiBGb3IgS2VyYmVyb3MsIHRyYW5zZm9ybSB0aGUgTlRfS1JCNV9QUklOQ0lQQUwgbmFtZSB0bworCSAqIGFuIE5UX0hPU1RCQVNFRF9TRVJWSUNFIG5hbWUgKi8KKwlpZiAoZ19PSURfZXF1YWwoJmtyYjVvaWQsIG1lY2gpKSB7CisJCWlmIChnZXRfa3JiNV9ob3N0YmFzZWRfbmFtZSgmbmFtZSwgJmNuYW1lKSA9PSAwKQorCQkJKmhvc3RiYXNlZF9uYW1lID0gY25hbWU7CisJfQorCisJLyogTm8gc3VwcG9ydCBmb3IgU1BLTTMsIGp1c3QgcHJpbnQgYSB3YXJuaW5nIChmb3Igbm93KSAqLworCWlmIChnX09JRF9lcXVhbCgmc3BrbTNvaWQsIG1lY2gpKSB7CisJCXByaW50ZXJyKDEsICJXQVJOSU5HOiBnZXRfaG9zdGJhc2VkX2NsaWVudF9uYW1lOiAiCisJCQkgIm5vIGhvc3RiYXNlZF9uYW1lIHN1cHBvcnQgZm9yIFNQS00zXG4iKTsKKwl9CisKKwlyZXMgPSAwOworb3V0X3JlbF9idWY6CisJZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW5fc3RhdCwgJm5hbWUpOworb3V0X2VycjoKKwlyZXR1cm4gcmVzOworfQorCit2b2lkCitoYW5kbGVfbnVsbHJlcShGSUxFICpmKSB7CisJLyogWFhYIGluaXRpYWxpemUgdG8gYSByYW5kb20gaW50ZWdlciB0byByZWR1Y2UgY2hhbmNlcyBvZiB1bm5lY2Vzc2FyeQorCSAqIGludmFsaWRhdGlvbiBvZiBleGlzdGluZyBjdHgncyBvbiByZXN0YXJ0aW5nIHN2Y2dzc2QuICovCisJc3RhdGljIHVfaW50MzJfdAloYW5kbGVfc2VxID0gMDsKKwljaGFyCQkJaW5fdG9rX2J1ZltUT0tFTl9CVUZfU0laRV07CisJY2hhcgkJCWluX2hhbmRsZV9idWZbMTVdOworCWNoYXIJCQlvdXRfaGFuZGxlX2J1ZlsxNV07CisJZ3NzX2J1ZmZlcl9kZXNjCQlpbl90b2sgPSB7LnZhbHVlID0gaW5fdG9rX2J1Zn0sCisJCQkJb3V0X3RvayA9IHsudmFsdWUgPSBOVUxMfSwKKwkJCQlpbl9oYW5kbGUgPSB7LnZhbHVlID0gaW5faGFuZGxlX2J1Zn0sCisJCQkJb3V0X2hhbmRsZSA9IHsudmFsdWUgPSBvdXRfaGFuZGxlX2J1Zn0sCisJCQkJY3R4X3Rva2VuID0gey52YWx1ZSA9IE5VTEx9LAorCQkJCWlnbm9yZV9vdXRfdG9rID0gey52YWx1ZSA9IE5VTEx9LAorCS8qIFhYWCBpc24ndCB0aGVyZSBhIGRlZmluZSBmb3IgdGhpcz86ICovCisJCQkJbnVsbF90b2tlbiA9IHsudmFsdWUgPSBOVUxMfTsKKwl1X2ludDMyX3QJCXJldF9mbGFnczsKKwlnc3NfY3R4X2lkX3QJCWN0eCA9IEdTU19DX05PX0NPTlRFWFQ7CisJZ3NzX25hbWVfdAkJY2xpZW50X25hbWUgPSBOVUxMOworCWdzc19PSUQJCQltZWNoID0gR1NTX0NfTk9fT0lEOworCXVfaW50MzJfdAkJbWFqX3N0YXQgPSBHU1NfU19GQUlMVVJFLCBtaW5fc3RhdCA9IDA7CisJdV9pbnQzMl90CQlpZ25vcmVfbWluX3N0YXQ7CisJc3RydWN0IHN2Y19jcmVkCQljcmVkOworCXN0YXRpYyBjaGFyCQkqbGJ1ZiA9IE5VTEw7CisJc3RhdGljIGludAkJbGJ1ZmxlbiA9IDA7CisJc3RhdGljIGNoYXIJCSpjcDsKKwlpbnQzMl90CQkJY3R4X2VuZHRpbWU7CisJY2hhcgkJCSpob3N0YmFzZWRfbmFtZSA9IE5VTEw7CisKKwlwcmludGVycigxLCAiaGFuZGxpbmcgbnVsbCByZXF1ZXN0XG4iKTsKKworCWlmIChyZWFkbGluZShmaWxlbm8oZiksICZsYnVmLCAmbGJ1ZmxlbikgIT0gMSkgeworCQlwcmludGVycigwLCAiV0FSTklORzogaGFuZGxlX251bGxyZXE6ICIKKwkJCSAgICAiZmFpbGVkIHJlYWRpbmcgcmVxdWVzdFxuIik7CisJCXJldHVybjsKKwl9CisKKwljcCA9IGxidWY7CisKKwlpbl9oYW5kbGUubGVuZ3RoID0gKHNpemVfdCkgcXdvcmRfZ2V0KCZjcCwgaW5faGFuZGxlLnZhbHVlLAorCQkJCQkgICAgICBzaXplb2YoaW5faGFuZGxlX2J1ZikpOworI2lmZGVmIERFQlVHCisJcHJpbnRfaGV4bCgiaW5faGFuZGxlIiwgaW5faGFuZGxlLnZhbHVlLCBpbl9oYW5kbGUubGVuZ3RoKTsKKyNlbmRpZgorCisJaW5fdG9rLmxlbmd0aCA9IChzaXplX3QpIHF3b3JkX2dldCgmY3AsIGluX3Rvay52YWx1ZSwKKwkJCQkJICAgc2l6ZW9mKGluX3Rva19idWYpKTsKKyNpZmRlZiBERUJVRworCXByaW50X2hleGwoImluX3RvayIsIGluX3Rvay52YWx1ZSwgaW5fdG9rLmxlbmd0aCk7CisjZW5kaWYKKworCWlmIChpbl90b2subGVuZ3RoIDwgMCkgeworCQlwcmludGVycigwLCAiV0FSTklORzogaGFuZGxlX251bGxyZXE6ICIKKwkJCSAgICAiZmFpbGVkIHBhcnNpbmcgcmVxdWVzdFxuIik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoaW5faGFuZGxlLmxlbmd0aCAhPSAwKSB7IC8qIENPTlRJTlVFX0lOSVQgY2FzZSAqLworCQlpZiAoaW5faGFuZGxlLmxlbmd0aCAhPSBzaXplb2YoY3R4KSkgeworCQkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IGhhbmRsZV9udWxscmVxOiAiCisJCQkJICAgICJpbnB1dCBoYW5kbGUgaGFzIHVuZXhwZWN0ZWQgbGVuZ3RoICVkXG4iLAorCQkJCSAgICBpbl9oYW5kbGUubGVuZ3RoKTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCQkvKiBpbl9oYW5kbGUgaXMgdGhlIGNvbnRleHQgaWQgc3RvcmVkIGluIHRoZSBvdXRfaGFuZGxlCisJCSAqIGZvciB0aGUgR1NTX1NfQ09OVElOVUVfTkVFREVEIGNhc2UgYmVsb3cuICAqLworCQltZW1jcHkoJmN0eCwgaW5faGFuZGxlLnZhbHVlLCBpbl9oYW5kbGUubGVuZ3RoKTsKKwl9CisKKwltYWpfc3RhdCA9IGdzc19hY2NlcHRfc2VjX2NvbnRleHQoJm1pbl9zdGF0LCAmY3R4LCBnc3NkX2NyZWRzLAorCQkJJmluX3RvaywgR1NTX0NfTk9fQ0hBTk5FTF9CSU5ESU5HUywgJmNsaWVudF9uYW1lLAorCQkJJm1lY2gsICZvdXRfdG9rLCAmcmV0X2ZsYWdzLCBOVUxMLCBOVUxMKTsKKworCWlmIChtYWpfc3RhdCA9PSBHU1NfU19DT05USU5VRV9ORUVERUQpIHsKKwkJcHJpbnRlcnIoMSwgImdzc19hY2NlcHRfc2VjX2NvbnRleHQgR1NTX1NfQ09OVElOVUVfTkVFREVEXG4iKTsKKworCQkvKiBTYXZlIHRoZSBjb250ZXh0IGhhbmRsZSBmb3IgZnV0dXJlIGNhbGxzICovCisJCW91dF9oYW5kbGUubGVuZ3RoID0gc2l6ZW9mKGN0eCk7CisJCW1lbWNweShvdXRfaGFuZGxlLnZhbHVlLCAmY3R4LCBzaXplb2YoY3R4KSk7CisJCWdvdG8gY29udGludWVfbmVlZGVkOworCX0KKwllbHNlIGlmIChtYWpfc3RhdCAhPSBHU1NfU19DT01QTEVURSkgeworCQlwcmludGVycigxLCAiV0FSTklORzogZ3NzX2FjY2VwdF9zZWNfY29udGV4dCBmYWlsZWRcbiIpOworCQlwZ3NzZXJyKCJoYW5kbGVfbnVsbHJlcTogZ3NzX2FjY2VwdF9zZWNfY29udGV4dCIsCisJCQltYWpfc3RhdCwgbWluX3N0YXQsIG1lY2gpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChnZXRfaWRzKGNsaWVudF9uYW1lLCBtZWNoLCAmY3JlZCkpIHsKKwkJLyogZ2V0X2lkcygpIHByaW50cyBlcnJvciBtc2cgKi8KKwkJbWFqX3N0YXQgPSBHU1NfU19CQURfTkFNRTsgLyogWFhYID8gKi8KKwkJZ290byBvdXRfZXJyOworCX0KKwlpZiAoZ2V0X2hvc3RiYXNlZF9jbGllbnRfbmFtZShjbGllbnRfbmFtZSwgbWVjaCwgJmhvc3RiYXNlZF9uYW1lKSkgeworCQkvKiBnZXRfaG9zdGJhc2VkX2NsaWVudF9uYW1lKCkgcHJpbnRzIGVycm9yIG1zZyAqLworCQltYWpfc3RhdCA9IEdTU19TX0JBRF9OQU1FOyAvKiBYWFggPyAqLworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogQ29udGV4dCBjb21wbGV0ZS4gUGFzcyBoYW5kbGVfc2VxIGluIG91dF9oYW5kbGUgdG8gdXNlCisJICogZm9yIGNvbnRleHQgbG9va3VwIGluIHRoZSBrZXJuZWwuICovCisJaGFuZGxlX3NlcSsrOworCW91dF9oYW5kbGUubGVuZ3RoID0gc2l6ZW9mKGhhbmRsZV9zZXEpOworCW1lbWNweShvdXRfaGFuZGxlLnZhbHVlLCAmaGFuZGxlX3NlcSwgc2l6ZW9mKGhhbmRsZV9zZXEpKTsKKworCS8qIGtlcm5lbCBuZWVkcyBjdHggdG8gY2FsY3VsYXRlIHZlcmlmaWVyIG9uIG51bGwgcmVzcG9uc2UsIHNvCisJICogbXVzdCBnaXZlIGl0IGNvbnRleHQgYmVmb3JlIGRvaW5nIG51bGwgY2FsbDogKi8KKwlpZiAoc2VyaWFsaXplX2NvbnRleHRfZm9yX2tlcm5lbChjdHgsICZjdHhfdG9rZW4sIG1lY2gsICZjdHhfZW5kdGltZSkpIHsKKwkJcHJpbnRlcnIoMCwgIldBUk5JTkc6IGhhbmRsZV9udWxscmVxOiAiCisJCQkgICAgInNlcmlhbGl6ZV9jb250ZXh0X2Zvcl9rZXJuZWwgZmFpbGVkXG4iKTsKKwkJbWFqX3N0YXQgPSBHU1NfU19GQUlMVVJFOworCQlnb3RvIG91dF9lcnI7CisJfQorCS8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBnc3MgY29udGV4dCAqLworCWdzc19kZWxldGVfc2VjX2NvbnRleHQoJmlnbm9yZV9taW5fc3RhdCwgJmN0eCwgJmlnbm9yZV9vdXRfdG9rKTsKKworCWRvX3N2Y19kb3duY2FsbCgmb3V0X2hhbmRsZSwgJmNyZWQsIG1lY2gsICZjdHhfdG9rZW4sIGN0eF9lbmR0aW1lLAorCQkJaG9zdGJhc2VkX25hbWUpOworY29udGludWVfbmVlZGVkOgorCXNlbmRfcmVzcG9uc2UoZiwgJmluX2hhbmRsZSwgJmluX3RvaywgbWFqX3N0YXQsIG1pbl9zdGF0LAorCQkJJm91dF9oYW5kbGUsICZvdXRfdG9rKTsKK291dDoKKwlpZiAoY3R4X3Rva2VuLnZhbHVlICE9IE5VTEwpCisJCWZyZWUoY3R4X3Rva2VuLnZhbHVlKTsKKwlpZiAob3V0X3Rvay52YWx1ZSAhPSBOVUxMKQorCQlnc3NfcmVsZWFzZV9idWZmZXIoJmlnbm9yZV9taW5fc3RhdCwgJm91dF90b2spOworCWlmIChjbGllbnRfbmFtZSkKKwkJZ3NzX3JlbGVhc2VfbmFtZSgmaWdub3JlX21pbl9zdGF0LCAmY2xpZW50X25hbWUpOworCWZyZWUoaG9zdGJhc2VkX25hbWUpOworCXByaW50ZXJyKDEsICJmaW5pc2hlZCBoYW5kbGluZyBudWxsIHJlcXVlc3RcbiIpOworCXJldHVybjsKKworb3V0X2VycjoKKwlpZiAoY3R4ICE9IEdTU19DX05PX0NPTlRFWFQpCisJCWdzc19kZWxldGVfc2VjX2NvbnRleHQoJmlnbm9yZV9taW5fc3RhdCwgJmN0eCwgJmlnbm9yZV9vdXRfdG9rKTsKKwlzZW5kX3Jlc3BvbnNlKGYsICZpbl9oYW5kbGUsICZpbl90b2ssIG1hal9zdGF0LCBtaW5fc3RhdCwKKwkJCSZudWxsX3Rva2VuLCAmbnVsbF90b2tlbik7CisJZ290byBvdXQ7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvZ3NzZC93cml0ZV9ieXRlcy5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvd3JpdGVfYnl0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM3MmNjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2dzc2Qvd3JpdGVfYnl0ZXMuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAgQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgYXJlIG1ldDoKKworICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZm5kZWYgX1dSSVRFX0JZVEVTX0hfCisjZGVmaW5lIF9XUklURV9CWVRFU19IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgkJLyogZm9yIG50b2hsICovCisKK2lubGluZSBzdGF0aWMgaW50Cit3cml0ZV9ieXRlcyhjaGFyICoqcHRyLCBjb25zdCBjaGFyICplbmQsIGNvbnN0IHZvaWQgKmFyZywgaW50IGFyZ19sZW4pCit7CisJY2hhciAqcCA9ICpwdHIsICphcmdfZW5kOworCisJYXJnX2VuZCA9IHAgKyBhcmdfbGVuOworCWlmIChhcmdfZW5kID4gZW5kIHx8IGFyZ19lbmQgPCBwKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHAsIGFyZywgYXJnX2xlbik7CisJKnB0ciA9IGFyZ19lbmQ7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgV1JJVEVfQllURVMocCwgZW5kLCBhcmcpIHdyaXRlX2J5dGVzKHAsIGVuZCwgJmFyZywgc2l6ZW9mKGFyZykpCisKK2lubGluZSBzdGF0aWMgaW50Cit3cml0ZV9idWZmZXIoY2hhciAqKnAsIGNoYXIgKmVuZCwgZ3NzX2J1ZmZlcl9kZXNjICphcmcpCit7CisJaW50IGxlbiA9IChpbnQpYXJnLT5sZW5ndGg7CQkvKiBtYWtlIGFuIGludCBvdXQgb2Ygc2l6ZV90ICovCisJaWYgKFdSSVRFX0JZVEVTKHAsIGVuZCwgbGVuKSkKKwkJcmV0dXJuIC0xOworCWlmICgqcCArIGxlbiA+IGVuZCkKKwkJcmV0dXJuIC0xOworCW1lbWNweSgqcCwgYXJnLT52YWx1ZSwgbGVuKTsKKwkqcCArPSBsZW47CisJcmV0dXJuIDA7Cit9CisKK2lubGluZSBzdGF0aWMgaW50Cit3cml0ZV9vaWQoY2hhciAqKnAsIGNoYXIgKmVuZCwgZ3NzX09JRF9kZXNjICphcmcpCit7CisJaW50IGxlbiA9IChpbnQpYXJnLT5sZW5ndGg7CQkvKiBtYWtlIGFuIGludCBvdXQgb2Ygc2l6ZV90ICovCisJaWYgKFdSSVRFX0JZVEVTKHAsIGVuZCwgbGVuKSkKKwkJcmV0dXJuIC0xOworCWlmICgqcCArIGFyZy0+bGVuZ3RoID4gZW5kKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KCpwLCBhcmctPmVsZW1lbnRzLCBsZW4pOworCSpwICs9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2dldF9ieXRlcyhjaGFyICoqcHRyLCBjb25zdCBjaGFyICplbmQsIHZvaWQgKnJlcywgaW50IGxlbikKK3sKKwljaGFyICpwLCAqcTsKKwlwID0gKnB0cjsKKwlxID0gcCArIGxlbjsKKwlpZiAocSA+IGVuZCB8fCBxIDwgcCkKKwkJcmV0dXJuIC0xOworCW1lbWNweShyZXMsIHAsIGxlbik7CisJKnB0ciA9IHE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitnZXRfYnVmZmVyKGNoYXIgKipwdHIsIGNvbnN0IGNoYXIgKmVuZCwgZ3NzX2J1ZmZlcl9kZXNjICpyZXMpCit7CisJY2hhciAqcCwgKnE7CisJcCA9ICpwdHI7CisJaW50IGxlbjsKKwlpZiAoZ2V0X2J5dGVzKCZwLCBlbmQsICZsZW4sIHNpemVvZihsZW4pKSkKKwkJcmV0dXJuIC0xOworCXJlcy0+bGVuZ3RoID0gbGVuOwkJLyogcHJvbW90ZSB0byBzaXplX3QgaWYgbmVjZXNzYXJ5ICovCisJcSA9IHAgKyByZXMtPmxlbmd0aDsKKwlpZiAocSA+IGVuZCB8fCBxIDwgcCkKKwkJcmV0dXJuIC0xOworCWlmICghKHJlcy0+dmFsdWUgPSBtYWxsb2MocmVzLT5sZW5ndGgpKSkKKwkJcmV0dXJuIC0xOworCW1lbWNweShyZXMtPnZhbHVlLCBwLCByZXMtPmxlbmd0aCk7CisJKnB0ciA9IHE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit4ZHJfZ2V0X3UzMih1X2ludDMyX3QgKipwdHIsIGNvbnN0IHVfaW50MzJfdCAqZW5kLCB1X2ludDMyX3QgKnJlcykKK3sKKwlpZiAoZ2V0X2J5dGVzKChjaGFyICoqKXB0ciwgKGNoYXIgKillbmQsIHJlcywgc2l6ZW9mKHJlcykpKQorCQlyZXR1cm4gLTE7CisJKnJlcyA9IG50b2hsKCpyZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoreGRyX2dldF9idWZmZXIodV9pbnQzMl90ICoqcHRyLCBjb25zdCB1X2ludDMyX3QgKmVuZCwgZ3NzX2J1ZmZlcl9kZXNjICpyZXMpCit7CisJdV9pbnQzMl90ICpwLCAqcTsKKwl1X2ludDMyX3QgbGVuOworCXAgPSAqcHRyOworCWlmICh4ZHJfZ2V0X3UzMigmcCwgZW5kLCAmbGVuKSkKKwkJcmV0dXJuIC0xOworCXJlcy0+bGVuZ3RoID0gbGVuOworCXEgPSBwICsgKChyZXMtPmxlbmd0aCArIDMpID4+IDIpOworCWlmIChxID4gZW5kIHx8IHEgPCBwKQorCQlyZXR1cm4gLTE7CisJaWYgKCEocmVzLT52YWx1ZSA9IG1hbGxvYyhyZXMtPmxlbmd0aCkpKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHJlcy0+dmFsdWUsIHAsIHJlcy0+bGVuZ3RoKTsKKwkqcHRyID0gcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3hkcl93cml0ZV91MzIodV9pbnQzMl90ICoqcHRyLCBjb25zdCB1X2ludDMyX3QgKmVuZCwgdV9pbnQzMl90IGFyZykKK3sKKwl1X2ludDMyX3QgdG1wOworCisJdG1wID0gaHRvbmwoYXJnKTsKKwlyZXR1cm4gV1JJVEVfQllURVMoKGNoYXIgKiopcHRyLCAoY2hhciAqKWVuZCwgdG1wKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3hkcl93cml0ZV9idWZmZXIodV9pbnQzMl90ICoqcHRyLCBjb25zdCB1X2ludDMyX3QgKmVuZCwgZ3NzX2J1ZmZlcl9kZXNjICphcmcpCit7CisJaW50IGxlbiA9IGFyZy0+bGVuZ3RoOworCWlmICh4ZHJfd3JpdGVfdTMyKHB0ciwgZW5kLCBsZW4pKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHdyaXRlX2J5dGVzKChjaGFyICoqKXB0ciwgKGNoYXIgKillbmQsIGFyZy0+dmFsdWUsCisJCQkgICAoYXJnLT5sZW5ndGggKyAzKSAmIH4zKTsKK30KKworI2VuZGlmIC8qIF9XUklURV9CWVRFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9NYWtlZmlsZS5hbSBiL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxODA0OAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NiBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK21hbjhfTUFOUwk9IGlkbWFwZC5tYW4KKworUlBDUFJFRklYCT0gcnBjLgorS1BSRUZJWAkJPSBAa3ByZWZpeEAKK3NiaW5fUFJPR1JBTVMJPSBpZG1hcGQKKworRVhUUkFfRElTVCA9IFwKKwkkKG1hbjhfTUFOUykgXAorCWlkbWFwZC5jb25mCisKK2lkbWFwZF9TT1VSQ0VTID0gXAorCWF0b21pY2lvLmMgXAorCWlkbWFwZC5jIFwKKwlzdHJsY2F0LmMgXAorCXN0cmxjcHkuYyBcCisJXAorCWNmZy5oIFwKKwluZnNfaWRtYXAuaCBcCisJcXVldWUuaAorCitpZG1hcGRfTERBREQgPSAtbGV2ZW50IC1sbmZzaWRtYXAgLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgZm9sbG93aW5nIGFsbG93cyB0aGUgY3VycmVudCBwcmFjdGljZSBvZiBoYXZpbmcKKyMgZGFlbW9ucyByZW5hbWVkIGR1cmluZyB0aGUgaW5zdGFsbCB0byBpbmNsdWRlIFJQQ1BSRUZJWAorIyBhbmQgdGhlIEtQUkVGSVgKKyMgVGhpcyBjb3VsZCBhbGwgYmUgZG9uZSBtdWNoIGVhc2llciB3aXRoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKKyMgKCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gcy9eLyQoUlBDUFJFRklYKSQoS1BSRUZJWCkvICkKKyMgYnV0IHRoYXQgYWxzbyByZW5hbWVzIHRoZSBtYW4gcGFnZXMsIHdoaWNoIHRoZSBjdXJyZW50CisjIHByYWN0aWNlIGRvZXMgbm90IGRvLgoraW5zdGFsbC1leGVjLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgIGZvciBwIGluICQoc2Jpbl9QUk9HUkFNUyk7IGRvIFwKKwkgICAgbXYgLWYgJCRwJChFWEVFWFQpICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCit1bmluc3RhbGwtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgZm9yIHAgaW4gJChzYmluX1BST0dSQU1TKTsgZG8gXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkKEtQUkVGSVgpJCRwJChFWEVFWFQpIDtcCisJICBkb25lKQorCisKKyMgWFhYIFRoaXMgbWFrZXMgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGF1dG9tYWtlIGRvZXMuCisjIFhYWCBCdXQgdGhlcmUgaXMgbm8gaW5zdGFsbC1tYW4taG9vayBvciBpbnN0YWxsLW1hbi1sb2NhbC4KK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjggaW5zdGFsbC1tYW4tbGlua3MKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44IHVuaW5zdGFsbC1tYW4tbGlua3MKKworaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgICAkKExOX1MpICQkaW5zdCAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCit1bmluc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmZmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjk4IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzYmluX1BST0dSQU1TID0gaWRtYXBkJChFWEVFWFQpCitzdWJkaXIgPSB1dGlscy9pZG1hcGQKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSIKK1BST0dSQU1TID0gJChzYmluX1BST0dSQU1TKQorYW1faWRtYXBkX09CSkVDVFMgPSBhdG9taWNpby4kKE9CSkVYVCkgaWRtYXBkLiQoT0JKRVhUKSBcCisJc3RybGNhdC4kKE9CSkVYVCkgc3RybGNweS4kKE9CSkVYVCkKK2lkbWFwZF9PQkpFQ1RTID0gJChhbV9pZG1hcGRfT0JKRUNUUykKK2lkbWFwZF9ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChpZG1hcGRfU09VUkNFUykKK0RJU1RfU09VUkNFUyA9ICQoaWRtYXBkX1NPVVJDRVMpCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKG1hbjhfTUFOUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACittYW44X01BTlMgPSBpZG1hcGQubWFuCitSUENQUkVGSVggPSBycGMuCitLUFJFRklYID0gQGtwcmVmaXhACitFWFRSQV9ESVNUID0gXAorCSQobWFuOF9NQU5TKSBcCisJaWRtYXBkLmNvbmYKKworaWRtYXBkX1NPVVJDRVMgPSBcCisJYXRvbWljaW8uYyBcCisJaWRtYXBkLmMgXAorCXN0cmxjYXQuYyBcCisJc3RybGNweS5jIFwKKwlcCisJY2ZnLmggXAorCW5mc19pZG1hcC5oIFwKKwlxdWV1ZS5oCisKK2lkbWFwZF9MREFERCA9IC1sZXZlbnQgLWxuZnNpZG1hcCAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYQorTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvaWRtYXBkL01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHV0aWxzL2lkbWFwZC9NYWtlZmlsZQorLlBSRUNJT1VTOiBNYWtlZmlsZQorTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCUBjYXNlICckPycgaW4gXAorCSAgKmNvbmZpZy5zdGF0dXMqKSBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaDs7IFwKKwkgICopIFwKKwkgICAgZWNobyAnIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKSc7IFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpOzsgXAorCWVzYWM7CisKKyQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZSAkKENPTkZJR19TVEFUVVNfREVQRU5ERU5DSUVTKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorCiskKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19jb25maWd1cmVfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fYWNsb2NhbF9tNF9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChhbV9fYWNsb2NhbF9tNF9kZXBzKToKK2luc3RhbGwtc2JpblBST0dSQU1TOiAkKHNiaW5fUFJPR1JBTVMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChzYmluZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQoc2JpbmRpcikiCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisJc2VkICdzLyQoRVhFRVhUKSQkLy8nIHwgXAorCXdoaWxlIHJlYWQgcCBwMTsgZG8gaWYgdGVzdCAtZiAkJHAgfHwgdGVzdCAtZiAkJHAxOyBcCisJICB0aGVuIGVjaG8gIiQkcCI7IGVjaG8gIiQkcCI7IGVsc2UgOjsgZmk7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAncDtzLC4qLywsO247aCcgLWUgJ3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSk7cy8kJC8kKEVYRUVYVCkvJyB8IFwKKwlzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxIH0gXAorCSAgeyBkPSQkMzsgaWYgKGRpcnNbZF0gIT0gMSkgeyBwcmludCAiZCIsIGQ7IGRpcnNbZF0gPSAxIH0gXAorCSAgICBpZiAoJCQyID09ICQkNCkgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgIGVsc2UgeyBwcmludCAiZiIsICQkMyAiLyIgJCQ0LCAkJDE7IH0gfSBcCisJICBFTkQgeyBmb3IgKGQgaW4gZmlsZXMpIHByaW50ICJmIiwgZCwgZmlsZXNbZF0gfScgfCBcCisJd2hpbGUgcmVhZCB0eXBlIGRpciBmaWxlczsgZG8gXAorCSAgICBpZiB0ZXN0ICIkJGRpciIgPSAuOyB0aGVuIGRpcj07IGVsc2UgZGlyPS8kJGRpcjsgZmk7IFwKKwkgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAnJChERVNURElSKSQoc2JpbmRpcikkJGRpciciOyBcCisJICAgICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICIkKERFU1RESVIpJChzYmluZGlyKSQkZGlyIiB8fCBleGl0ICQkPzsgXAorCSAgICB9IFwKKwk7IGRvbmUKKwordW5pbnN0YWxsLXNiaW5QUk9HUkFNUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChzYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmaWxlcz1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgXAorCSAgc2VkIC1lICdoO3MsXi4qLywsO3MvJChFWEVFWFQpJCQvLzskKHRyYW5zZm9ybSknIFwKKwkgICAgICAtZSAncy8kJC8kKEVYRUVYVCkvJyBgOyBcCisJdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgKCBjZCAnJChERVNURElSKSQoc2JpbmRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCWNkICIkKERFU1RESVIpJChzYmluZGlyKSIgJiYgcm0gLWYgJCRmaWxlcworCitjbGVhbi1zYmluUFJPR1JBTVM6CisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0IHx8IGV4aXQgJCQ/OyBcCisJdGVzdCAtbiAiJChFWEVFWFQpIiB8fCBleGl0IDA7IFwKKwlsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgJ3MvJChFWEVFWFQpJCQvLydgOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QKK2lkbWFwZCQoRVhFRVhUKTogJChpZG1hcGRfT0JKRUNUUykgJChpZG1hcGRfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgaWRtYXBkJChFWEVFWFQpCisJJChMSU5LKSAkKGlkbWFwZF9PQkpFQ1RTKSAkKGlkbWFwZF9MREFERCkgJChMSUJTKQorCittb3N0bHljbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLiQoT0JKRVhUKQorCitkaXN0Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi50YWIuYworCitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvYXRvbWljaW8uUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2lkbWFwZC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3RybGNhdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3RybGNweS5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworaW5zdGFsbC1tYW44OiAkKG1hbjhfTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjhkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW44ZGlyKSIKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKKwlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKKwlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0JyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjhkaXIpJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjhkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAorCWRvbmU7IH0KKwordW5pbnN0YWxsLW1hbjg6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAorCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjhkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwkgIGNkICIkKERFU1RESVIpJChtYW44ZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVsc2UgOjsgZmk7IGRvbmVgOyBcCisJICBpZiB0ZXN0IC1uICIkJGxpc3QiICYmIFwKKwkgICAgZ3JlcCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgIGVjaG8gImVycm9yOiBmb3VuZCBtYW4gcGFnZXMgY29udGFpbmluZyB0aGUgXGBtaXNzaW5nIGhlbHAybWFuJyByZXBsYWNlbWVudCB0ZXh0OiIgPiYyOyBcCisJICAgIGdyZXAgLWwgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0IHwgc2VkICdzL14vICAgICAgICAgLycgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0byBmaXggdGhlbSwgaW5zdGFsbCBoZWxwMm1hbiwgcmVtb3ZlIGFuZCByZWdlbmVyYXRlIHRoZSBtYW4gcGFnZXM7IiA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHR5cGljYWxseSBcYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCisJICAgIGV4aXQgMTsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWVsc2UgOjsgZmkKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjhkaXIpIjsgZG8gXAorCSAgdGVzdCAteiAiJCRkaXIiIHx8ICQoTUtESVJfUCkgIiQkZGlyIjsgXAorCWRvbmUKK2luc3RhbGw6IGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCitkaXN0Y2xlYW4tZ2VuZXJpYzoKKwktdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9GSUxFUykKKwktdGVzdCAuID0gIiQoc3JjZGlyKSIgfHwgdGVzdCAteiAiJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpIiB8fCBybSAtZiAkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykKKworbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljOgorCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZSIKKwlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCisJLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQorY2xlYW46IGNsZWFuLWFtCisKK2NsZWFuLWFtOiBjbGVhbi1nZW5lcmljIGNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIFwKKwltb3N0bHljbGVhbi1hbQorCitkaXN0Y2xlYW46IGRpc3RjbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK2Rpc3RjbGVhbi1hbTogY2xlYW4tYW0gZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgXAorCWRpc3RjbGVhbi10YWdzCisKK2R2aTogZHZpLWFtCisKK2R2aS1hbToKKworaHRtbDogaHRtbC1hbQorCitodG1sLWFtOgorCitpbmZvOiBpbmZvLWFtCisKK2luZm8tYW06CisKK2luc3RhbGwtZGF0YS1hbTogaW5zdGFsbC1tYW4KKworaW5zdGFsbC1kdmk6IGluc3RhbGwtZHZpLWFtCisKK2luc3RhbGwtZHZpLWFtOgorCitpbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtc2JpblBST0dSQU1TCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWhvb2sKK2luc3RhbGwtaHRtbDogaW5zdGFsbC1odG1sLWFtCisKK2luc3RhbGwtaHRtbC1hbToKKworaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tYW0KKworaW5zdGFsbC1pbmZvLWFtOgorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuIHVuaW5zdGFsbC1zYmluUFJPR1JBTVMKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtaG9vaworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtc3RyaXAgdW5pbnN0YWxsLWFtCisKKy5QSE9OWTogQ1RBR1MgR1RBR1MgYWxsIGFsbC1hbSBjaGVjayBjaGVjay1hbSBjbGVhbiBjbGVhbi1nZW5lcmljIFwKKwljbGVhbi1saWJ0b29sIGNsZWFuLXNiaW5QUk9HUkFNUyBjdGFncyBkaXN0Y2xlYW4gXAorCWRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIGRpc3RjbGVhbi1saWJ0b29sIFwKKwlkaXN0Y2xlYW4tdGFncyBkaXN0ZGlyIGR2aSBkdmktYW0gaHRtbCBodG1sLWFtIGluZm8gaW5mby1hbSBcCisJaW5zdGFsbCBpbnN0YWxsLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kdmkgXAorCWluc3RhbGwtZHZpLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjLWhvb2sgXAorCWluc3RhbGwtaHRtbCBpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBcCisJaW5zdGFsbC1tYW4gaW5zdGFsbC1tYW44IGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgXAorCWluc3RhbGwtcHMtYW0gaW5zdGFsbC1zYmluUFJPR1JBTVMgaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaG9vayB1bmluc3RhbGwtbWFuIFwKKwl1bmluc3RhbGwtbWFuOCB1bmluc3RhbGwtc2JpblBST0dSQU1TCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2YgaGF2aW5nCisjIGRhZW1vbnMgcmVuYW1lZCBkdXJpbmcgdGhlIGluc3RhbGwgdG8gaW5jbHVkZSBSUENQUkVGSVgKKyMgYW5kIHRoZSBLUFJFRklYCisjIFRoaXMgY291bGQgYWxsIGJlIGRvbmUgbXVjaCBlYXNpZXIgd2l0aCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCisjICggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMvXi8kKFJQQ1BSRUZJWCkkKEtQUkVGSVgpLyApCisjIGJ1dCB0aGF0IGFsc28gcmVuYW1lcyB0aGUgbWFuIHBhZ2VzLCB3aGljaCB0aGUgY3VycmVudAorIyBwcmFjdGljZSBkb2VzIG5vdCBkby4KK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJPR1JBTVMpOyBkbyBcCisJICAgIG12IC1mICQkcCQoRVhFRVhUKSAkKFJQQ1BSRUZJWCkkKEtQUkVGSVgpJCRwJChFWEVFWFQpIDtcCisJICBkb25lKQordW5pbnN0YWxsLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgIGZvciBwIGluICQoc2Jpbl9QUk9HUkFNUyk7IGRvIFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJChLUFJFRklYKSQkcCQoRVhFRVhUKSA7XAorCSAgZG9uZSkKKworIyBYWFggVGhpcyBtYWtlcyBzb21lIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgYXV0b21ha2UgZG9lcy4KKyMgWFhYIEJ1dCB0aGVyZSBpcyBubyBpbnN0YWxsLW1hbi1ob29rIG9yIGluc3RhbGwtbWFuLWxvY2FsLgoraW5zdGFsbC1tYW46IGluc3RhbGwtbWFuOCBpbnN0YWxsLW1hbi1saW5rcwordW5pbnN0YWxsLW1hbjogdW5pbnN0YWxsLW1hbjggdW5pbnN0YWxsLW1hbi1saW5rcworCitpbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICAgICQoTE5fUykgJCRpbnN0ICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKK3VuaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgZG9uZSkKKworIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KKyMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgorLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9hdG9taWNpby5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9hdG9taWNpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZTcxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL2F0b21pY2lvLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0Btb25rZXkub3JnPgorICogQ29weXJpZ2h0IChjKSAxOTk1LDE5OTkgVGhlbyBkZSBSYWFkdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCisKKy8qCisgKiBlbnN1cmUgYWxsIG9mIGRhdGEgb24gc29ja2V0IGNvbWVzIHRocm91Z2guIGY9PXJlYWQgfHwgZj09d3JpdGUKKyAqLworc3NpemVfdAorYXRvbWljaW8oCisJc3NpemVfdCAoKmYpIChpbnQsIHZvaWQqLCBzaXplX3QpLAorCWludCBmZCwKKwl2b2lkICpfcywKKwlzaXplX3QgbikKK3sKKwljaGFyICpzID0gX3M7CisJc3NpemVfdCByZXMsIHBvcyA9IDA7CisKKwl3aGlsZSAobiA+IHBvcykgeworCQlyZXMgPSAoZikgKGZkLCBzICsgcG9zLCBuIC0gcG9zKTsKKwkJc3dpdGNoIChyZXMpIHsKKwkJY2FzZSAtMToKKwkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pCisJCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCWlmIChwb3MgIT0gMCkKKwkJCQlyZXR1cm4gKHBvcyk7CisJCQlyZXR1cm4gKHJlcyk7CisJCWRlZmF1bHQ6CisJCQlwb3MgKz0gcmVzOworCQl9CisJfQorCXJldHVybiAocG9zKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvaWRtYXBkLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL2lkbWFwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2FiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL2lkbWFwZC5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyoKKyAqICBpZG1hcGQuYworICoKKyAqICBVc2VybGFuZCBkYWVtb24gZm9yIGlkbWFwLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgTWFyaXVzIEFhbW9kdCBFcmlrc2VuIDxtYXJpdXNAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAibmZzX2lkbWFwLmgiCisKKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGV2ZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8Z3JwLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxuZnNpZG1hcC5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmIC8qIEhBVkVfQ09ORklHX0ggKi8KKworI2luY2x1ZGUgInhsb2cuaCIKKyNpbmNsdWRlICJjb25mZmlsZS5oIgorI2luY2x1ZGUgInF1ZXVlLmgiCisjaW5jbHVkZSAibmZzbGliLmgiCisKKyNpZm5kZWYgUElQRUZTX0RJUgorI2RlZmluZSBQSVBFRlNfRElSICAiL3Zhci9saWIvbmZzL3JwY19waXBlZnMvIgorI2VuZGlmCisKKyNpZm5kZWYgTkZTRF9ESVIKKyNkZWZpbmUgTkZTRF9ESVIgICIvcHJvYy9uZXQvcnBjIgorI2VuZGlmCisKKyNpZm5kZWYgQ0xJRU5UX0NBQ0hFX1RJTUVPVVRfRklMRQorI2RlZmluZSBDTElFTlRfQ0FDSEVfVElNRU9VVF9GSUxFICIvcHJvYy9zeXMvZnMvbmZzL2lkbWFwX2NhY2hlX3RpbWVvdXQiCisjZW5kaWYKKworI2lmbmRlZiBORlM0Tk9CT0RZX1VTRVIKKyNkZWZpbmUgTkZTNE5PQk9EWV9VU0VSICJub2JvZHkiCisjZW5kaWYKKworI2lmbmRlZiBORlM0Tk9CT0RZX0dST1VQCisjZGVmaW5lIE5GUzROT0JPRFlfR1JPVVAgIm5vYm9keSIKKyNlbmRpZgorCisvKiBGcm9tIE5pZWxzICovCisjZGVmaW5lIENPTkZfU0FWRSh3LCBmKSBkbyB7CQkJXAorCWNoYXIgKnAgPSBmOwkJCQlcCisJaWYgKHAgIT0gTlVMTCkJCQkJXAorCQkodykgPSBwOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSUNfSUROQU1FIDAKKyNkZWZpbmUgSUNfSUROQU1FX0NIQU4gIE5GU0RfRElSICIvbmZzNC5pZHRvbmFtZS9jaGFubmVsIgorI2RlZmluZSBJQ19JRE5BTUVfRkxVU0ggTkZTRF9ESVIgIi9uZnM0LmlkdG9uYW1lL2ZsdXNoIgorCisjZGVmaW5lIElDX05BTUVJRCAxCisjZGVmaW5lIElDX05BTUVJRF9DSEFOICBORlNEX0RJUiAiL25mczQubmFtZXRvaWQvY2hhbm5lbCIKKyNkZWZpbmUgSUNfTkFNRUlEX0ZMVVNIIE5GU0RfRElSICIvbmZzNC5uYW1ldG9pZC9mbHVzaCIKKworc3RydWN0IGlkbWFwX2NsaWVudCB7CisJc2hvcnQgICAgICAgICAgICAgICAgICAgICAgaWNfd2hpY2g7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgaWNfY2xpZFszMF07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAqaWNfaWQ7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgaWNfcGF0aFtQQVRIX01BWF07CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgaWNfZmQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgaWNfZGlyZmQ7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgaWNfc2Nhbm5lZDsKKwlzdHJ1Y3QgZXZlbnQgICAgICAgICAgICAgICBpY19ldmVudDsKKwlUQUlMUV9FTlRSWShpZG1hcF9jbGllbnQpICBpY19uZXh0OworfTsKK3N0YXRpYyBzdHJ1Y3QgaWRtYXBfY2xpZW50IG5mc2RfaWNbMl0gPSB7Cit7SUNfSUROQU1FLCAiU2VydmVyIiwgIiIsIElDX0lETkFNRV9DSEFOLCAtMSwgLTEsIDB9LAore0lDX05BTUVJRCwgIlNlcnZlciIsICIiLCBJQ19OQU1FSURfQ0hBTiwgLTEsIC0xLCAwfSwKK307CisKK1RBSUxRX0hFQUQoaWRtYXBfY2xpZW50cSwgaWRtYXBfY2xpZW50KTsKKworc3RhdGljIHZvaWQgZGlyc2NhbmNiKGludCwgc2hvcnQsIHZvaWQgKik7CitzdGF0aWMgdm9pZCBjbG50c2NhbmNiKGludCwgc2hvcnQsIHZvaWQgKik7CitzdGF0aWMgdm9pZCBzdnJyZW9wZW4oaW50LCBzaG9ydCwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgIG5mc29wZW4oc3RydWN0IGlkbWFwX2NsaWVudCAqKTsKK3N0YXRpYyB2b2lkIG5mc2NiKGludCwgc2hvcnQsIHZvaWQgKik7CitzdGF0aWMgdm9pZCBuZnNkY2IoaW50LCBzaG9ydCwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgIHZhbGlkYXRlYXNjaWkoY2hhciAqLCB1X2ludDMyX3QpOworc3RhdGljIGludCAgYWRkZmllbGQoY2hhciAqKiwgc3NpemVfdCAqLCBjaGFyICopOworc3RhdGljIGludCAgZ2V0ZmllbGQoY2hhciAqKiwgY2hhciAqLCBzaXplX3QpOworCitzdGF0aWMgdm9pZCBpbWNvbnYoc3RydWN0IGlkbWFwX2NsaWVudCAqLCBzdHJ1Y3QgaWRtYXBfbXNnICopOworc3RhdGljIHZvaWQgaWR0b25hbWVyZXMoc3RydWN0IGlkbWFwX21zZyAqKTsKK3N0YXRpYyB2b2lkIG5hbWV0b2lkcmVzKHN0cnVjdCBpZG1hcF9tc2cgKik7CisKK3N0YXRpYyBpbnQgbmZzZG9wZW4odm9pZCk7CitzdGF0aWMgaW50IG5mc2RvcGVub25lKHN0cnVjdCBpZG1hcF9jbGllbnQgKik7CitzdGF0aWMgdm9pZCBuZnNkcmVvcGVuX29uZShzdHJ1Y3QgaWRtYXBfY2xpZW50ICopOworc3RhdGljIHZvaWQgbmZzZHJlb3Blbih2b2lkKTsKKworc2l6ZV90ICBzdHJsY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworc2l6ZV90ICBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworc3NpemVfdCBhdG9taWNpbyhzc2l6ZV90ICgqZikgKGludCwgdm9pZCosIHNpemVfdCksCisJCSBpbnQsIHZvaWQgKiwgc2l6ZV90KTsKK3ZvaWQgICAgbXlkYWVtb24oaW50LCBpbnQpOwordm9pZCAgICByZWxlYXNlX3BhcmVudCh2b2lkKTsKKworc3RhdGljIGludCB2ZXJib3NlID0gMDsKKyNkZWZpbmUgREVGQVVMVF9JRE1BUF9DQUNIRV9FWFBJUlkgNjAwIC8qIHNlY29uZHMgKi8KK3N0YXRpYyBpbnQgY2FjaGVfZW50cnlfZXhwaXJhdGlvbiA9IDA7CitzdGF0aWMgY2hhciBwaXBlZnNkaXJbUEFUSF9NQVhdOworc3RhdGljIGNoYXIgKm5vYm9keXVzZXIsICpub2JvZHlncm91cDsKK3N0YXRpYyB1aWRfdCBub2JvZHl1aWQ7CitzdGF0aWMgZ2lkX3Qgbm9ib2R5Z2lkOworCisvKiBVc2VkIGJ5IGNvbmZmaWxlLmMgaW4gbGlibmZzLmEgKi8KK2NoYXIgKmNvbmZfcGF0aDsKKworc3RhdGljIGludAorZmx1c2hfbmZzZF9jYWNoZShjaGFyICpwYXRoLCB0aW1lX3Qgbm93KQoreworCWludCBmZDsKKwljaGFyIHN0aW1lWzIwXTsKKworCXNwcmludGYoc3RpbWUsICIlbGRcbiIsIG5vdyk7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKHdyaXRlKGZkLCBzdGltZSwgc3RybGVuKHN0aW1lKSkgIT0gc3RybGVuKHN0aW1lKSkgeworCQllcnJ4KDEsICJGbHVzaGluZyBuZnNkIGNhY2hlIGZhaWxlZDogZXJybm8gJWQgKCVzKSIsCisJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJY2xvc2UoZmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbHVzaF9uZnNkX2lkbWFwX2NhY2hlKHZvaWQpCit7CisJdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisJaW50IHJldDsKKworCXJldCA9IGZsdXNoX25mc2RfY2FjaGUoSUNfSUROQU1FX0ZMVVNILCBub3cpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gZmx1c2hfbmZzZF9jYWNoZShJQ19OQU1FSURfRkxVU0gsIG5vdyk7CisJcmV0dXJuIHJldDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQgPSAwLCBvcHQsIGZnID0gMCwgbmZzZHJldCA9IC0xOworCXN0cnVjdCBpZG1hcF9jbGllbnRxIGljcTsKKwlzdHJ1Y3QgZXZlbnQgcm9vdGRpcmV2LCBjbG50ZGlyZXYsIHN2cmRpcmV2OworCXN0cnVjdCBldmVudCBpbml0aWFsaXplOworCXN0cnVjdCBwYXNzd2QgKnB3OworCXN0cnVjdCBncm91cCAqZ3I7CisJc3RydWN0IHN0YXQgc2I7CisJY2hhciAqeHBpcGVmc2RpciA9IE5VTEw7CisJaW50IHNlcnZlcnN0YXJ0ID0gMSwgY2xpZW50c3RhcnQgPSAxOworCWludCByZXQ7CisJY2hhciAqcHJvZ25hbWU7CisKKwljb25mX3BhdGggPSBfUEFUSF9JRE1BUERDT05GOworCW5vYm9keXVzZXIgPSBORlM0Tk9CT0RZX1VTRVI7CisJbm9ib2R5Z3JvdXAgPSBORlM0Tk9CT0RZX0dST1VQOworCXN0cmxjcHkocGlwZWZzZGlyLCBQSVBFRlNfRElSLCBzaXplb2YocGlwZWZzZGlyKSk7CisKKwlpZiAoKHByb2duYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpKSkKKwkJcHJvZ25hbWUrKzsKKwllbHNlCisJCXByb2duYW1lID0gYXJndlswXTsKKwl4bG9nX29wZW4ocHJvZ25hbWUpOworCisjZGVmaW5lIEdFVE9QVFNUUiAidmZkOnA6VTpHOmM6Q1MiCisJb3B0ZXJyPTA7IC8qIFR1cm4gb2ZmIGVycm9yIG1lc3NhZ2VzICovCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgR0VUT1BUU1RSKSkgIT0gLTEpIHsKKwkJaWYgKG9wdCA9PSAnYycpCisJCQljb25mX3BhdGggPSBvcHRhcmc7CisJCWlmIChvcHQgPT0gJz8nKSB7CisJCQlpZiAoc3RyY2hyKEdFVE9QVFNUUiwgb3B0b3B0KSkKKwkJCQllcnJ4KDEsICInLSVjJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQuIiwgb3B0b3B0KTsKKwkJCWVsc2UKKwkJCQllcnJ4KDEsICInLSVjJyBpcyBhbiBpbnZhbGlkIGFyZ3VtZW50LiIsIG9wdG9wdCk7CisJCX0KKwl9CisJb3B0aW5kID0gMTsKKworCWlmIChzdGF0KGNvbmZfcGF0aCwgJnNiKSA9PSAtMSAmJiAoZXJybm8gPT0gRU5PRU5UIHx8IGVycm5vID09IEVBQ0NFUykpIHsKKwkJd2FybigiU2tpcHBpbmcgY29uZmlndXJhdGlvbiBmaWxlIFwiJXNcIiIsIGNvbmZfcGF0aCk7CisJCWNvbmZfcGF0aCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJY29uZl9pbml0KCk7CisJCXZlcmJvc2UgPSBjb25mX2dldF9udW0oIkdlbmVyYWwiLCAiVmVyYm9zaXR5IiwgMCk7CisJCWNhY2hlX2VudHJ5X2V4cGlyYXRpb24gPSBjb25mX2dldF9udW0oIkdlbmVyYWwiLAorCQkJCSJDYWNoZS1FeHBpcmF0aW9uIiwgREVGQVVMVF9JRE1BUF9DQUNIRV9FWFBJUlkpOworCQlDT05GX1NBVkUoeHBpcGVmc2RpciwgY29uZl9nZXRfc3RyKCJHZW5lcmFsIiwgIlBpcGVmcy1EaXJlY3RvcnkiKSk7CisJCWlmICh4cGlwZWZzZGlyICE9IE5VTEwpCisJCQlzdHJsY3B5KHBpcGVmc2RpciwgeHBpcGVmc2Rpciwgc2l6ZW9mKHBpcGVmc2RpcikpOworCQlDT05GX1NBVkUobm9ib2R5dXNlciwgY29uZl9nZXRfc3RyKCJNYXBwaW5nIiwgIk5vYm9keS1Vc2VyIikpOworCQlDT05GX1NBVkUobm9ib2R5Z3JvdXAsIGNvbmZfZ2V0X3N0cigiTWFwcGluZyIsICJOb2JvZHktR3JvdXAiKSk7CisJfQorCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgR0VUT1BUU1RSKSkgIT0gLTEpCisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSsrOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZmcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJc3RybGNweShwaXBlZnNkaXIsIG9wdGFyZywgc2l6ZW9mKHBpcGVmc2RpcikpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQljYXNlICdVJzoKKwkJY2FzZSAnRyc6CisJCQllcnJ4KDEsICJ0aGUgLWQsIC1VLCBhbmQgLUcgb3B0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZDsiCisJCQkJIiBwbGVhc2UgdXNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaW5zdGVhZC4iKTsKKwkJY2FzZSAnQyc6CisJCQlzZXJ2ZXJzdGFydCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQljbGllbnRzdGFydCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoIXNlcnZlcnN0YXJ0ICYmICFjbGllbnRzdGFydCkKKwkJZXJyeCgxLCAiaXQgaXMgaWxsZWdhbCB0byBzcGVjaWZ5IGJvdGggLUMgYW5kIC1TIik7CisKKwlzdHJuY2F0KHBpcGVmc2RpciwgIi9uZnMiLCBzaXplb2YocGlwZWZzZGlyKSk7CisKKwlpZiAoKHB3ID0gZ2V0cHduYW0obm9ib2R5dXNlcikpID09IE5VTEwpCisJCWVycngoMSwgIkNvdWxkIG5vdCBmaW5kIHVzZXIgXCIlc1wiIiwgbm9ib2R5dXNlcik7CisJbm9ib2R5dWlkID0gcHctPnB3X3VpZDsKKworCWlmICgoZ3IgPSBnZXRncm5hbShub2JvZHlncm91cCkpID09IE5VTEwpCisJCWVycngoMSwgIkNvdWxkIG5vdCBmaW5kIGdyb3VwIFwiJXNcIiIsIG5vYm9keWdyb3VwKTsKKwlub2JvZHlnaWQgPSBnci0+Z3JfZ2lkOworCisjaWZkZWYgSEFWRV9ORlM0X1NFVF9ERUJVRworCW5mczRfc2V0X2RlYnVnKHZlcmJvc2UsIHhsb2dfd2Fybik7CisjZW5kaWYKKwlpZiAoY29uZl9wYXRoID09IE5VTEwpCisJCWNvbmZfcGF0aCA9IF9QQVRIX0lETUFQRENPTkY7CisJaWYgKG5mczRfaW5pdF9uYW1lX21hcHBpbmcoY29uZl9wYXRoKSkKKwkJZXJyeCgxLCAiVW5hYmxlIHRvIGNyZWF0ZSBuYW1lIHRvIHVzZXIgaWQgbWFwcGluZ3MuIik7CisKKwlpZiAoIWZnKQorCQlteWRhZW1vbigwLCAwKTsKKworCWV2ZW50X2luaXQoKTsKKworCWlmICh2ZXJib3NlID4gMCkKKwkJeGxvZ193YXJuKCJFeHBpcmF0aW9uIHRpbWUgaXMgJWQgc2Vjb25kcy4iLAorCQkJICAgICBjYWNoZV9lbnRyeV9leHBpcmF0aW9uKTsKKwlpZiAoc2VydmVyc3RhcnQpIHsKKwkJbmZzZHJldCA9IG5mc2RvcGVuKCk7CisJCWlmIChuZnNkcmV0ID09IDApIHsKKwkJCXJldCA9IGZsdXNoX25mc2RfaWRtYXBfY2FjaGUoKTsKKwkJCWlmIChyZXQpCisJCQkJeGxvZ19lcnIoIm1haW46IEZhaWxlZCB0byBmbHVzaCBuZnNkIGlkbWFwIGNhY2hlXG46ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KKworCWlmIChjbGllbnRzdGFydCkgeworCQlzdHJ1Y3QgdGltZXZhbCBub3cgPSB7CisJCQkudHZfc2VjID0gMCwKKwkJCS50dl91c2VjID0gMCwKKwkJfTsKKworCQlpZiAoY2FjaGVfZW50cnlfZXhwaXJhdGlvbiAhPSBERUZBVUxUX0lETUFQX0NBQ0hFX0VYUElSWSkgeworCQkJaW50IHRpbWVvdXRfZmQsIGxlbjsKKwkJCWNoYXIgdGltZW91dF9idWZbMTJdOworCQkJaWYgKCh0aW1lb3V0X2ZkID0gb3BlbihDTElFTlRfQ0FDSEVfVElNRU9VVF9GSUxFLAorCQkJCQkgICAgICAgT19SRFdSKSkgPT0gLTEpIHsKKwkJCQl4bG9nX3dhcm4oIlVuYWJsZSB0byBvcGVuICclcycgdG8gc2V0ICIKKwkJCQkJICAgICAiY2xpZW50IGNhY2hlIGV4cGlyYXRpb24gdGltZSAiCisJCQkJCSAgICAgInRvICVkIHNlY29uZHNcbiIsCisJCQkJCSAgICAgQ0xJRU5UX0NBQ0hFX1RJTUVPVVRfRklMRSwKKwkJCQkJICAgICBjYWNoZV9lbnRyeV9leHBpcmF0aW9uKTsKKwkJCX0gZWxzZSB7CisJCQkJbGVuID0gc25wcmludGYodGltZW91dF9idWYsIHNpemVvZih0aW1lb3V0X2J1ZiksCisJCQkJCSAgICAgICAiJWQiLCBjYWNoZV9lbnRyeV9leHBpcmF0aW9uKTsKKwkJCQlpZiAoKHdyaXRlKHRpbWVvdXRfZmQsIHRpbWVvdXRfYnVmLCBsZW4pKSAhPSBsZW4pCisJCQkJCXhsb2dfd2FybigiRXJyb3Igd3JpdGluZyAnJXMnIHRvICIKKwkJCQkJCSAgICAgIiclcycgdG8gc2V0IGNsaWVudCAiCisJCQkJCQkgICAgICJjYWNoZSBleHBpcmF0aW9uIHRpbWVcbiIsCisJCQkJCQkgICAgIHRpbWVvdXRfYnVmLAorCQkJCQkJICAgICBDTElFTlRfQ0FDSEVfVElNRU9VVF9GSUxFKTsKKwkJCQljbG9zZSh0aW1lb3V0X2ZkKTsKKwkJCX0KKwkJfQorCisJCWlmICgoZmQgPSBvcGVuKHBpcGVmc2RpciwgT19SRE9OTFkpKSA9PSAtMSkKKwkJCXhsb2dfZXJyKCJtYWluOiBvcGVuKCVzKTogJXMiLCBwaXBlZnNkaXIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKGZjbnRsKGZkLCBGX1NFVFNJRywgU0lHVVNSMSkgPT0gLTEpCisJCQl4bG9nX2VycigibWFpbjogZmNudGwoJXMpOiAlcyIsIHBpcGVmc2Rpciwgc3RyZXJyb3IoZXJybm8pKTsKKworCQlpZiAoZmNudGwoZmQsIEZfTk9USUZZLAorCQkJRE5fQ1JFQVRFIHwgRE5fREVMRVRFIHwgRE5fTU9ESUZZIHwgRE5fTVVMVElTSE9UKSA9PSAtMSkgeworCQkJeGxvZ19lcnIoIm1haW46IGZjbnRsKCVzKTogJXMiLCBwaXBlZnNkaXIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlpZiAoZXJybm8gPT0gRUlOVkFMKQorCQkJCXhsb2dfZXJyKCJtYWluOiBQb3NzaWJseSBubyBEbm90aWZ5IHN1cHBvcnQgaW4ga2VybmVsLiIpOworCQl9CisJCVRBSUxRX0lOSVQoJmljcSk7CisKKwkJLyogVGhlc2UgZXZlbnRzIGFyZSBwZXJzaXN0ZW50ICovCisJCXNpZ25hbF9zZXQoJnJvb3RkaXJldiwgU0lHVVNSMSwgZGlyc2NhbmNiLCAmaWNxKTsKKwkJc2lnbmFsX2FkZCgmcm9vdGRpcmV2LCBOVUxMKTsKKwkJc2lnbmFsX3NldCgmY2xudGRpcmV2LCBTSUdVU1IyLCBjbG50c2NhbmNiLCAmaWNxKTsKKwkJc2lnbmFsX2FkZCgmY2xudGRpcmV2LCBOVUxMKTsKKwkJc2lnbmFsX3NldCgmc3ZyZGlyZXYsIFNJR0hVUCwgc3ZycmVvcGVuLCBOVUxMKTsKKwkJc2lnbmFsX2FkZCgmc3ZyZGlyZXYsIE5VTEwpOworCisJCS8qIEZldGNoIGN1cnJlbnQgc3RhdGUgKi8KKwkJLyogKERlbGF5IHRpbGwgc3RhcnQgb2YgZXZlbnRfZGlzcGF0Y2ggdG8gYXZvaWQgcG9zc2libHkgbG9zaW5nCisJCSAqIGEgU0lHVVNSMSBiZXR3ZWVuIGhlcmUgYW5kIHRoZSBjYWxsIHRvIGV2ZW50X2Rpc3BhdGNoKCkuKSAqLworCQlldnRpbWVyX3NldCgmaW5pdGlhbGl6ZSwgZGlyc2NhbmNiLCAmaWNxKTsKKwkJZXZ0aW1lcl9hZGQoJmluaXRpYWxpemUsICZub3cpOworCX0KKworCWlmIChuZnNkcmV0ICE9IDAgJiYgZmQgPT0gMCkKKwkJeGxvZ19lcnIoIm1haW46IE5laXRoZXIgTkZTIGNsaWVudCBub3IgTkZTZCBmb3VuZCIpOworCisJcmVsZWFzZV9wYXJlbnQoKTsKKworCWlmIChldmVudF9kaXNwYXRjaCgpIDwgMCkKKwkJeGxvZ19lcnIoIm1haW46IGV2ZW50X2Rpc3BhdGNoIHJldHVybnMgZXJybm8gJWQgKCVzKSIsCisJCQkgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorZGlyc2NhbmNiKGludCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQgKmRhdGEpCit7CisJaW50IG5lbnQsIGk7CisJc3RydWN0IGRpcmVudCAqKmVudHM7CisJc3RydWN0IGlkbWFwX2NsaWVudCAqaWMsICpuZXh0aWM7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgaWRtYXBfY2xpZW50cSAqaWNxID0gZGF0YTsKKworCW5lbnQgPSBzY2FuZGlyKHBpcGVmc2RpciwgJmVudHMsIE5VTEwsIGFscGhhc29ydCk7CisJaWYgKG5lbnQgPT0gLTEpIHsKKwkJeGxvZ193YXJuKCJkaXJzY2FuY2I6IHNjYW5kaXIoJXMpOiAlcyIsIHBpcGVmc2Rpciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7ICBpIDwgbmVudDsgaSsrKSB7CisJCWlmIChlbnRzW2ldLT5kX3JlY2xlbiA+IDQgJiYKKwkJICAgIHN0cm5jbXAoZW50c1tpXS0+ZF9uYW1lLCAiY2xudCIsIDQpID09IDApIHsKKwkJCVRBSUxRX0ZPUkVBQ0goaWMsIGljcSwgaWNfbmV4dCkKKwkJCSAgICBpZiAoc3RyY21wKGVudHNbaV0tPmRfbmFtZSArIDQsIGljLT5pY19jbGlkKSA9PSAwKQorCQkJCSAgICBicmVhazsKKwkJCWlmIChpYyAhPSBOVUxMKQorCQkJCWdvdG8gbmV4dDsKKworCQkJaWYgKChpYyA9IGNhbGxvYygxLCBzaXplb2YoKmljKSkpID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlzdHJsY3B5KGljLT5pY19jbGlkLCBlbnRzW2ldLT5kX25hbWUgKyA0LAorCQkJICAgIHNpemVvZihpYy0+aWNfY2xpZCkpOworCQkJcGF0aFswXSA9ICdcMCc7CisJCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lcyIsCisJCQkgICAgcGlwZWZzZGlyLCBlbnRzW2ldLT5kX25hbWUpOworCisJCQlpZiAoKGljLT5pY19kaXJmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFksIDApKSA9PSAtMSkgeworCQkJCXhsb2dfd2FybigiZGlyc2NhbmNiOiBvcGVuKCVzKTogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQkJCWZyZWUoaWMpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlzdHJsY2F0KHBhdGgsICIvaWRtYXAiLCBzaXplb2YocGF0aCkpOworCQkJc3RybGNweShpYy0+aWNfcGF0aCwgcGF0aCwgc2l6ZW9mKGljLT5pY19wYXRoKSk7CisKKwkJCWlmICh2ZXJib3NlID4gMCkKKwkJCQl4bG9nX3dhcm4oIk5ldyBjbGllbnQ6ICVzIiwgaWMtPmljX2NsaWQpOworCisJCQlpZiAobmZzb3BlbihpYykgPT0gLTEpIHsKKwkJCQljbG9zZShpYy0+aWNfZGlyZmQpOworCQkJCWZyZWUoaWMpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpYy0+aWNfaWQgPSAiQ2xpZW50IjsKKworCQkJVEFJTFFfSU5TRVJUX1RBSUwoaWNxLCBpYywgaWNfbmV4dCk7CisKKwkJbmV4dDoKKwkJCWljLT5pY19zY2FubmVkID0gMTsKKwkJfQorCX0KKworCWljID0gVEFJTFFfRklSU1QoaWNxKTsKKwl3aGlsZShpYyAhPSBOVUxMKSB7CisJCW5leHRpYz1UQUlMUV9ORVhUKGljLCBpY19uZXh0KTsKKwkJaWYgKCFpYy0+aWNfc2Nhbm5lZCkgeworCQkJZXZlbnRfZGVsKCZpYy0+aWNfZXZlbnQpOworCQkJY2xvc2UoaWMtPmljX2ZkKTsKKwkJCWNsb3NlKGljLT5pY19kaXJmZCk7CisJCQlUQUlMUV9SRU1PVkUoaWNxLCBpYywgaWNfbmV4dCk7CisJCQlpZiAodmVyYm9zZSA+IDApIHsKKwkJCQl4bG9nX3dhcm4oIlN0YWxlIGNsaWVudDogJXMiLCBpYy0+aWNfY2xpZCk7CisJCQkJeGxvZ193YXJuKCJcdC0+IGNsb3NlZCAlcyIsIGljLT5pY19wYXRoKTsKKwkJCX0KKwkJCWZyZWUoaWMpOworCQl9IGVsc2UKKwkJCWljLT5pY19zY2FubmVkID0gMDsKKwkJaWMgPSBuZXh0aWM7CisJfQorCitvdXQ6CisJZm9yIChpID0gMDsgIGkgPCBuZW50OyBpKyspCisJCWZyZWUoZW50c1tpXSk7CisJZnJlZShlbnRzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitzdnJyZW9wZW4oaW50IGZkLCBzaG9ydCB3aGljaCwgdm9pZCAqZGF0YSkKK3sKKwluZnNkcmVvcGVuKCk7Cit9CisKK3N0YXRpYyB2b2lkCitjbG50c2NhbmNiKGludCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlkbWFwX2NsaWVudHEgKmljcSA9IGRhdGE7CisJc3RydWN0IGlkbWFwX2NsaWVudCAqaWM7CisKKwlUQUlMUV9GT1JFQUNIKGljLCBpY3EsIGljX25leHQpCisJCWlmIChpYy0+aWNfZmQgPT0gLTEgJiYgbmZzb3BlbihpYykgPT0gLTEpIHsKKwkJCWNsb3NlKGljLT5pY19kaXJmZCk7CisJCQlUQUlMUV9SRU1PVkUoaWNxLCBpYywgaWNfbmV4dCk7CisJCQlmcmVlKGljKTsKKwkJfQorfQorCitzdGF0aWMgdm9pZAorbmZzZGNiKGludCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlkbWFwX2NsaWVudCAqaWMgPSBkYXRhOworCXN0cnVjdCBpZG1hcF9tc2cgaW07CisJdV9jaGFyIGJ1ZltJRE1BUF9NQVhNU0dTWiArIDFdOworCXNpemVfdCBsZW47CisJc3NpemVfdCBic2l6OworCWNoYXIgKmJwLCB0eXBlYnVmW0lETUFQX01BWE1TR1NaXSwKKwkJYnVmMVtJRE1BUF9NQVhNU0dTWl0sIGF1dGhidWZbSURNQVBfTUFYTVNHU1pdLCAqcDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmICh3aGljaCAhPSBFVl9SRUFEKQorCQlnb3RvIG91dDsKKworCWlmICgobGVuID0gcmVhZChpYy0+aWNfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA8PSAwKSB7CisJCXhsb2dfd2FybigibmZzZGNiOiByZWFkKCVzKSBmYWlsZWQ6IGVycm5vICVkICglcykiLAorCQkJICAgICBpYy0+aWNfcGF0aCwgbGVuP2Vycm5vOjAsIAorCQkJICAgICBsZW4/c3RyZXJyb3IoZXJybm8pOiJFbmQgb2YgRmlsZSIpOworCQluZnNkcmVvcGVuX29uZShpYyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZXQgcmlkIG9mIG5ld2xpbmUgYW5kIHRlcm1pbmF0ZSBidWZmZXIqLworCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CisJYnAgPSAoY2hhciAqKWJ1ZjsKKworCW1lbXNldCgmaW0sIDAsIHNpemVvZihpbSkpOworCisJLyogQXV0aGVudGljYXRpb24gbmFtZSAtLSBpZ25vcmVkIGZvciBub3cqLworCWlmIChnZXRmaWVsZCgmYnAsIGF1dGhidWYsIHNpemVvZihhdXRoYnVmKSkgPT0gLTEpIHsKKwkJeGxvZ193YXJuKCJuZnNkY2I6IGJhZCBhdXRoZW50aWNhdGlvbiBuYW1lIGluIHVwY2FsbFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZ2V0ZmllbGQoJmJwLCB0eXBlYnVmLCBzaXplb2YodHlwZWJ1ZikpID09IC0xKSB7CisJCXhsb2dfd2FybigibmZzZGNiOiBiYWQgdHlwZSBpbiB1cGNhbGxcbiIpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHZlcmJvc2UgPiAwKQorCQl4bG9nX3dhcm4oIm5mc2RjYjogYXV0aGJ1Zj0lcyBhdXRodHlwZT0lcyIsCisJCQkgICAgIGF1dGhidWYsIHR5cGVidWYpOworCisJaW0uaW1fdHlwZSA9IHN0cmNtcCh0eXBlYnVmLCAidXNlciIpID09IDAgPworCQlJRE1BUF9UWVBFX1VTRVIgOiBJRE1BUF9UWVBFX0dST1VQOworCisJc3dpdGNoIChpYy0+aWNfd2hpY2gpIHsKKwljYXNlIElDX05BTUVJRDoKKwkJaW0uaW1fY29udiA9IElETUFQX0NPTlZfTkFNRVRPSUQ7CisJCWlmIChnZXRmaWVsZCgmYnAsIGltLmltX25hbWUsIHNpemVvZihpbS5pbV9uYW1lKSkgPT0gLTEpIHsKKwkJCXhsb2dfd2FybigibmZzZGNiOiBiYWQgbmFtZSBpbiB1cGNhbGxcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJQ19JRE5BTUU6CisJCWltLmltX2NvbnYgPSBJRE1BUF9DT05WX0lEVE9OQU1FOworCQlpZiAoZ2V0ZmllbGQoJmJwLCBidWYxLCBzaXplb2YoYnVmMSkpID09IC0xKSB7CisJCQl4bG9nX3dhcm4oIm5mc2RjYjogYmFkIGlkIGluIHVwY2FsbFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0bXAgPSBzdHJ0b3VsKGJ1ZjEsIChjaGFyICoqKU5VTEwsIDEwKTsKKwkJaW0uaW1faWQgPSAodV9pbnQzMl90KXRtcDsKKwkJaWYgKCh0bXAgPT0gVUxPTkdfTUFYICYmIGVycm5vID09IEVSQU5HRSkKKwkJCQl8fCAodW5zaWduZWQgbG9uZylpbS5pbV9pZCAhPSB0bXApIHsKKwkJCXhsb2dfd2FybigibmZzZGNiOiBpZCAnJXMnIHRvbyBiaWchXG4iLCBidWYxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXhsb2dfd2FybigibmZzZGNiOiBVbmtub3duIHdoaWNoIHR5cGUgJWQiLCBpYy0+aWNfd2hpY2gpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbWNvbnYoaWMsICZpbSk7CisKKwlidWZbMF0gPSAnXDAnOworCWJwID0gKGNoYXIgKilidWY7CisJYnNpeiA9IHNpemVvZihidWYpOworCisJLyogQXV0aGVudGljYXRpb24gbmFtZSAqLworCWFkZGZpZWxkKCZicCwgJmJzaXosIGF1dGhidWYpOworCisJc3dpdGNoIChpYy0+aWNfd2hpY2gpIHsKKwljYXNlIElDX05BTUVJRDoKKwkJLyogVHlwZSAqLworCQlwID0gaW0uaW1fdHlwZSA9PSBJRE1BUF9UWVBFX1VTRVIgPyAidXNlciIgOiAiZ3JvdXAiOworCQlhZGRmaWVsZCgmYnAsICZic2l6LCBwKTsKKwkJLyogTmFtZSAqLworCQlhZGRmaWVsZCgmYnAsICZic2l6LCBpbS5pbV9uYW1lKTsKKwkJLyogZXhwaXJ5ICovCisJCXNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKSwgIiVsdSIsCisJCQkgdGltZShOVUxMKSArIGNhY2hlX2VudHJ5X2V4cGlyYXRpb24pOworCQlhZGRmaWVsZCgmYnAsICZic2l6LCBidWYxKTsKKwkJLyogTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gd3JpdGUgdGhlIGlkIGlmIHRoZSBtYXBwaW5nCisJCSAqIGZhaWxlZDsgaW5zdGVhZCwgYnkgbGVhdmluZyBpdCBvZmYsIHdlIHdyaXRlIGEgbmVnYXRpdmUKKwkJICogY2FjaGUgZW50cnkgd2hpY2ggd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IgcmV0dXJuZWQgdG8KKwkJICogdGhlIGNsaWVudC4gIFdlIGRvbid0IHdhbnQgYSBjaG93biBvciBzZXRhY2wgcmVmZXJyaW5nCisJCSAqIHRvIGFuIHVua25vd24gdXNlciB0byByZXN1bHQgaW4gZ2l2aW5nIHBlcm1pc3Npb25zIHRvCisJCSAqICJub2JvZHkiISAqLworCQlpZiAoaW0uaW1fc3RhdHVzID09IElETUFQX1NUQVRVU19TVUNDRVNTKSB7CisJCQkvKiBJRCAqLworCQkJc25wcmludGYoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAiJXUiLCBpbS5pbV9pZCk7CisJCQlhZGRmaWVsZCgmYnAsICZic2l6LCBidWYxKTsKKworCQl9CisJCS8vaWYgKGJzaXogPT0gc2l6ZW9mKGJ1ZikpIC8qIFhYWCAqLworCisJCWJwWy0xXSA9ICdcbic7CisKKwkJYnJlYWs7CisJY2FzZSBJQ19JRE5BTUU6CisJCS8qIFR5cGUgKi8KKwkJcCA9IGltLmltX3R5cGUgPT0gSURNQVBfVFlQRV9VU0VSID8gInVzZXIiIDogImdyb3VwIjsKKwkJYWRkZmllbGQoJmJwLCAmYnNpeiwgcCk7CisJCS8qIElEICovCisJCXNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKSwgIiV1IiwgaW0uaW1faWQpOworCQlhZGRmaWVsZCgmYnAsICZic2l6LCBidWYxKTsKKwkJLyogZXhwaXJ5ICovCisJCXNucHJpbnRmKGJ1ZjEsIHNpemVvZihidWYxKSwgIiVsdSIsCisJCQkgdGltZShOVUxMKSArIGNhY2hlX2VudHJ5X2V4cGlyYXRpb24pOworCQlhZGRmaWVsZCgmYnAsICZic2l6LCBidWYxKTsKKwkJLyogTm90ZSB3ZSdyZSBpZ25vcmluZyB0aGUgc3RhdHVzIGZpZWxkIGluIHRoaXMgY2FzZTsgd2UnbGwKKwkJICoganVzdCBtYXAgdG8gbm9ib2R5IGluc3RlYWQuICovCisJCS8qIE5hbWUgKi8KKwkJYWRkZmllbGQoJmJwLCAmYnNpeiwgaW0uaW1fbmFtZSk7CisKKwkJYnBbLTFdID0gJ1xuJzsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQl4bG9nX3dhcm4oIm5mc2RjYjogVW5rbm93biB3aGljaCB0eXBlICVkIiwgaWMtPmljX3doaWNoKTsKKwkJZ290byBvdXQ7CisJfQorCisJYnNpeiA9IHNpemVvZihidWYpIC0gYnNpejsKKworCWlmIChhdG9taWNpbygodm9pZCopd3JpdGUsIGljLT5pY19mZCwgYnVmLCBic2l6KSAhPSBic2l6KQorCQl4bG9nX3dhcm4oIm5mc2RjYjogd3JpdGUoJXMpIGZhaWxlZDogZXJybm8gJWQgKCVzKSIsCisJCQkgICAgIGljLT5pY19wYXRoLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKworb3V0OgorCWV2ZW50X2FkZCgmaWMtPmljX2V2ZW50LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK2ltY29udihzdHJ1Y3QgaWRtYXBfY2xpZW50ICppYywgc3RydWN0IGlkbWFwX21zZyAqaW0pCit7CisJc3dpdGNoIChpbS0+aW1fY29udikgeworCWNhc2UgSURNQVBfQ09OVl9JRFRPTkFNRToKKwkJaWR0b25hbWVyZXMoaW0pOworCQlpZiAodmVyYm9zZSA+IDEpCisJCQl4bG9nX3dhcm4oIiVzICVzOiAoJXMpIGlkIFwiJWRcIiAtPiBuYW1lIFwiJXNcIiIsCisJCQkgICAgaWMtPmljX2lkLCBpYy0+aWNfY2xpZCwKKwkJCSAgICBpbS0+aW1fdHlwZSA9PSBJRE1BUF9UWVBFX1VTRVIgPyAidXNlciIgOiAiZ3JvdXAiLAorCQkJICAgIGltLT5pbV9pZCwgaW0tPmltX25hbWUpOworCQlicmVhazsKKwljYXNlIElETUFQX0NPTlZfTkFNRVRPSUQ6CisJCWlmICh2YWxpZGF0ZWFzY2lpKGltLT5pbV9uYW1lLCBzaXplb2YoaW0tPmltX25hbWUpKSA9PSAtMSkgeworCQkJaW0tPmltX3N0YXR1cyB8PSBJRE1BUF9TVEFUVVNfSU5WQUxJRE1TRzsKKwkJCXJldHVybjsKKwkJfQorCQluYW1ldG9pZHJlcyhpbSk7CisJCWlmICh2ZXJib3NlID4gMSkKKwkJCXhsb2dfd2FybigiJXMgJXM6ICglcykgbmFtZSBcIiVzXCIgLT4gaWQgXCIlZFwiIiwKKwkJCSAgICBpYy0+aWNfaWQsIGljLT5pY19jbGlkLAorCQkJICAgIGltLT5pbV90eXBlID09IElETUFQX1RZUEVfVVNFUiA/ICJ1c2VyIiA6ICJncm91cCIsCisJCQkgICAgaW0tPmltX25hbWUsIGltLT5pbV9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXhsb2dfd2FybigiaW1jb252OiBJbnZhbGlkIGNvbnZlcnNpb24gdHlwZSAoJWQpIGluIG1lc3NhZ2UiLAorCQkJICAgICBpbS0+aW1fY29udik7CisJCWltLT5pbV9zdGF0dXMgfD0gSURNQVBfU1RBVFVTX0lOVkFMSURNU0c7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK25mc2NiKGludCBmZCwgc2hvcnQgd2hpY2gsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlkbWFwX2NsaWVudCAqaWMgPSBkYXRhOworCXN0cnVjdCBpZG1hcF9tc2cgaW07CisKKwlpZiAod2hpY2ggIT0gRVZfUkVBRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoYXRvbWljaW8ocmVhZCwgaWMtPmljX2ZkLCAmaW0sIHNpemVvZihpbSkpICE9IHNpemVvZihpbSkpIHsKKwkJaWYgKHZlcmJvc2UgPiAwKQorCQkJeGxvZ193YXJuKCJuZnNjYjogcmVhZCglcyk6ICVzIiwgaWMtPmljX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChlcnJubyA9PSBFUElQRSkKKwkJCXJldHVybjsKKwkJZ290byBvdXQ7CisJfQorCisJaW1jb252KGljLCAmaW0pOworCisJLyogWFhYOiBJIGRvbid0IGxpa2UgaWdub3JpbmcgdGhpcyBlcnJvciBpbiB0aGUgaWQtPm5hbWUgY2FzZSwKKwkgKiBidXQgd2UndmUgbmV2ZXIgcmV0dXJuZWQgaXQsIGFuZCBJIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgY2xpZW50CisJICogY2FuIGhhbmRsZSBpdCBncmFjZWZ1bGx5IGJlZm9yZSBzdGFydGluZyB0byByZXR1cm4gaXQgbm93LiAqLworCisJaWYgKGltLmltX3N0YXR1cyA9PSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTCkKKwkJaW0uaW1fc3RhdHVzID0gSURNQVBfU1RBVFVTX1NVQ0NFU1M7CisKKwlpZiAoYXRvbWljaW8oKHZvaWQqKXdyaXRlLCBpYy0+aWNfZmQsICZpbSwgc2l6ZW9mKGltKSkgIT0gc2l6ZW9mKGltKSkKKwkJeGxvZ193YXJuKCJuZnNjYjogd3JpdGUoJXMpOiAlcyIsIGljLT5pY19wYXRoLCBzdHJlcnJvcihlcnJubykpOworb3V0OgorCWV2ZW50X2FkZCgmaWMtPmljX2V2ZW50LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQKK25mc2RyZW9wZW5fb25lKHN0cnVjdCBpZG1hcF9jbGllbnQgKmljKQoreworCWludCBmZDsKKworCWlmICh2ZXJib3NlID4gMCkKKwkJeGxvZ193YXJuKCJSZU9wZW5pbmcgJXMiLCBpYy0+aWNfcGF0aCk7CisKKwlpZiAoKGZkID0gb3BlbihpYy0+aWNfcGF0aCwgT19SRFdSLCAwKSkgIT0gLTEpIHsKKwkJaWYgKChpYy0+aWNfZXZlbnQuZXZfZmxhZ3MgJiBFVkxJU1RfSU5JVCkpCisJCQlldmVudF9kZWwoJmljLT5pY19ldmVudCk7CisJCWlmIChpYy0+aWNfZmQgIT0gLTEpCisJCQljbG9zZShpYy0+aWNfZmQpOworCisJCWljLT5pY19ldmVudC5ldl9mZCA9IGljLT5pY19mZCA9IGZkOworCQlldmVudF9zZXQoJmljLT5pY19ldmVudCwgaWMtPmljX2ZkLCBFVl9SRUFELCBuZnNkY2IsIGljKTsKKwkJZXZlbnRfYWRkKCZpYy0+aWNfZXZlbnQsIE5VTEwpOworCX0gZWxzZSB7CisJCXhsb2dfd2FybigibmZzZHJlb3BlbjogT3BlbmluZyAnJXMnIGZhaWxlZDogZXJybm8gJWQgKCVzKSIsCisJCQlpYy0+aWNfcGF0aCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmZzZHJlb3BlbigpCit7CisJbmZzZHJlb3Blbl9vbmUoJm5mc2RfaWNbSUNfTkFNRUlEXSk7CisJbmZzZHJlb3Blbl9vbmUoJm5mc2RfaWNbSUNfSUROQU1FXSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CituZnNkb3Blbih2b2lkKQoreworCXJldHVybiAoKG5mc2RvcGVub25lKCZuZnNkX2ljW0lDX05BTUVJRF0pID09IDAgJiYKKwkJICAgIG5mc2RvcGVub25lKCZuZnNkX2ljW0lDX0lETkFNRV0pID09IDApID8gMCA6IC0xKTsKK30KKworc3RhdGljIGludAorbmZzZG9wZW5vbmUoc3RydWN0IGlkbWFwX2NsaWVudCAqaWMpCit7CisJaWYgKChpYy0+aWNfZmQgPSBvcGVuKGljLT5pY19wYXRoLCBPX1JEV1IsIDApKSA9PSAtMSkgeworCQlpZiAodmVyYm9zZSA+IDApCisJCQl4bG9nX3dhcm4oIm5mc2RvcGVub25lOiBPcGVuaW5nICVzIGZhaWxlZDogIgorCQkJCSJlcnJubyAlZCAoJXMpIiwKKwkJCQlpYy0+aWNfcGF0aCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCWV2ZW50X3NldCgmaWMtPmljX2V2ZW50LCBpYy0+aWNfZmQsIEVWX1JFQUQsIG5mc2RjYiwgaWMpOworCWV2ZW50X2FkZCgmaWMtPmljX2V2ZW50LCBOVUxMKTsKKworCWlmICh2ZXJib3NlID4gMCkKKwkJeGxvZ193YXJuKCJPcGVuZWQgJXMiLCBpYy0+aWNfcGF0aCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CituZnNvcGVuKHN0cnVjdCBpZG1hcF9jbGllbnQgKmljKQoreworCWlmICgoaWMtPmljX2ZkID0gb3BlbihpYy0+aWNfcGF0aCwgT19SRFdSLCAwKSkgPT0gLTEpIHsKKwkJc3dpdGNoIChlcnJubykgeworCQljYXNlIEVOT0VOVDoKKwkJCWZjbnRsKGljLT5pY19kaXJmZCwgRl9TRVRTSUcsIFNJR1VTUjIpOworCQkJZmNudGwoaWMtPmljX2RpcmZkLCBGX05PVElGWSwKKwkJCSAgICBETl9DUkVBVEUgfCBETl9ERUxFVEUgfCBETl9NVUxUSVNIT1QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl4bG9nX3dhcm4oIm5mc29wZW46IG9wZW4oJXMpOiAlcyIsIGljLT5pY19wYXRoLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9IGVsc2UgeworCQlldmVudF9zZXQoJmljLT5pY19ldmVudCwgaWMtPmljX2ZkLCBFVl9SRUFELCBuZnNjYiwgaWMpOworCQlldmVudF9hZGQoJmljLT5pY19ldmVudCwgTlVMTCk7CisJCWZjbnRsKGljLT5pY19kaXJmZCwgRl9TRVRTSUcsIDApOworCQlmY250bChpYy0+aWNfZGlyZmQsIEZfTk9USUZZLCAwKTsKKwkJaWYgKHZlcmJvc2UgPiAwKQorCQkJeGxvZ193YXJuKCJPcGVuZWQgJXMiLCBpYy0+aWNfcGF0aCk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK2lkdG9uYW1lcmVzKHN0cnVjdCBpZG1hcF9tc2cgKmltKQoreworCWNoYXIgZG9tYWluW05GUzRfTUFYX0RPTUFJTl9MRU5dOworCWludCByZXQgPSAwOworCisJcmV0ID0gbmZzNF9nZXRfZGVmYXVsdF9kb21haW4oTlVMTCwgZG9tYWluLCBzaXplb2YoZG9tYWluKSk7CisJc3dpdGNoIChpbS0+aW1fdHlwZSkgeworCWNhc2UgSURNQVBfVFlQRV9VU0VSOgorCQlyZXQgPSBuZnM0X3VpZF90b19uYW1lKGltLT5pbV9pZCwgZG9tYWluLCBpbS0+aW1fbmFtZSwKKwkJCQlzaXplb2YoaW0tPmltX25hbWUpKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHN0cmxlbihub2JvZHl1c2VyKSA8IHNpemVvZihpbS0+aW1fbmFtZSkpCisJCQkJc3RyY3B5KGltLT5pbV9uYW1lLCBub2JvZHl1c2VyKTsKKwkJCWVsc2UKKwkJCQlzdHJjcHkoaW0tPmltX25hbWUsIE5GUzROT0JPRFlfVVNFUik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRE1BUF9UWVBFX0dST1VQOgorCQlyZXQgPSBuZnM0X2dpZF90b19uYW1lKGltLT5pbV9pZCwgZG9tYWluLCBpbS0+aW1fbmFtZSwKKwkJCQlzaXplb2YoaW0tPmltX25hbWUpKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHN0cmxlbihub2JvZHlncm91cCkgPCBzaXplb2YoaW0tPmltX25hbWUpKQorCQkJCXN0cmNweShpbS0+aW1fbmFtZSwgbm9ib2R5Z3JvdXApOworCQkJZWxzZQorCQkJCXN0cmNweShpbS0+aW1fbmFtZSwgTkZTNE5PQk9EWV9HUk9VUCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmIChyZXQpCisJCWltLT5pbV9zdGF0dXMgPSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTDsKKwllbHNlCisJCWltLT5pbV9zdGF0dXMgPSBJRE1BUF9TVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQKK25hbWV0b2lkcmVzKHN0cnVjdCBpZG1hcF9tc2cgKmltKQoreworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJaW50IHJldCA9IDA7CisKKwkvKiBYWFg6IG1vdmUgbm9ib2R5IHN0dWZmIHRvIGxpYnJhcnkgY2FsbHMKKwkgKiAobmZzNF9nZXRfbm9ib2R5X3VzZXIoZG9tYWluKSwgbmZzNF9nZXRfbm9ib2R5X2dyb3VwKGRvbWFpbikpICovCisKKwlpbS0+aW1fc3RhdHVzID0gSURNQVBfU1RBVFVTX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKGltLT5pbV90eXBlKSB7CisJY2FzZSBJRE1BUF9UWVBFX1VTRVI6CisJCXJldCA9IG5mczRfbmFtZV90b191aWQoaW0tPmltX25hbWUsICZ1aWQpOworCQlpbS0+aW1faWQgPSAodV9pbnQzMl90KSB1aWQ7CisJCWlmIChyZXQpIHsKKwkJCWltLT5pbV9zdGF0dXMgPSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTDsKKwkJCWltLT5pbV9pZCA9IG5vYm9keXVpZDsKKwkJfQorCQlyZXR1cm47CisJY2FzZSBJRE1BUF9UWVBFX0dST1VQOgorCQlyZXQgPSBuZnM0X25hbWVfdG9fZ2lkKGltLT5pbV9uYW1lLCAmZ2lkKTsKKwkJaW0tPmltX2lkID0gKHVfaW50MzJfdCkgZ2lkOworCQlpZiAocmV0KSB7CisJCQlpbS0+aW1fc3RhdHVzID0gSURNQVBfU1RBVFVTX0xPT0tVUEZBSUw7CisJCQlpbS0+aW1faWQgPSBub2JvZHlnaWQ7CisJCX0KKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludAordmFsaWRhdGVhc2NpaShjaGFyICpzdHJpbmcsIHVfaW50MzJfdCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKHN0cmluZ1tpXSA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0cmluZ1tpXSAmIDB4ODApCisJCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlpZiAoKGkgPj0gbGVuKSB8fCBzdHJpbmdbaV0gIT0gJ1wwJykKKwkJcmV0dXJuICgtMSk7CisKKwlyZXR1cm4gKGkgKyAxKTsKK30KKworc3RhdGljIGludAorYWRkZmllbGQoY2hhciAqKmJwcCwgc3NpemVfdCAqYnNpenAsIGNoYXIgKmZsZCkKK3sKKwljaGFyIGNoLCAqYnAgPSAqYnBwOworCXNzaXplX3QgYnNpeiA9ICpic2l6cDsKKworCXdoaWxlICgoY2ggPSAqZmxkKyspICE9ICdcMCcgJiYgYnNpeiA+IDApIHsKKwkJc3dpdGNoKGNoKSB7CisJCWNhc2UgJyAnOgorCQljYXNlICdcdCc6CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXFwnOgorCQkJaWYgKGJzaXogPj0gNCkgeworCQkJCWJwICs9IHNucHJpbnRmKGJwLCBic2l6LCAiXFwlMDNvIiwgY2gpOworCQkJCWJzaXogLT0gNDsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKmJwKysgPSBjaDsKKwkJCWJzaXotLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJzaXogPCAxIHx8IGNoICE9ICdcMCcpCisJCXJldHVybiAoLTEpOworCisJKmJwKysgPSAnICc7CisJYnNpei0tOworCisJKmJwcCA9IGJwOworCSpic2l6cCA9IGJzaXo7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitnZXRmaWVsZChjaGFyICoqYnBwLCBjaGFyICpmbGQsIHNpemVfdCBmbGRzeikKK3sKKwljaGFyICpicDsKKwl1X2ludCB2YWwsIG47CisKKwl3aGlsZSAoKGJwID0gc3Ryc2VwKGJwcCwgIiAiKSkgIT0gTlVMTCAmJiBicFswXSA9PSAnXDAnKQorCQk7CisKKwlpZiAoYnAgPT0gTlVMTCB8fCBicFswXSA9PSAnXDAnIHx8IGJwWzBdID09ICdcbicpCisJCXJldHVybiAoLTEpOworCisJd2hpbGUgKCpicCAhPSAnXDAnICYmIGZsZHN6ID4gMSkgeworCQlpZiAoKmJwID09ICdcXCcpIHsKKwkJCWlmICgobiA9IHNzY2FuZihicCwgIlxcJTAzbyIsICZ2YWwpKSAhPSAxKQorCQkJCXJldHVybiAoLTEpOworCQkJaWYgKHZhbCA+IChjaGFyKS0xKQorCQkJCXJldHVybiAoLTEpOworCQkJKmZsZCsrID0gKGNoYXIpdmFsOworCQkJYnAgKz0gNDsKKwkJfSBlbHNlIHsKKwkJCSpmbGQrKyA9ICpicDsKKwkJCWJwKys7CisJCX0KKwkJZmxkc3otLTsKKwl9CisKKwlpZiAoKmJwICE9ICdcMCcpCisJCXJldHVybiAoLTEpOworCSpmbGQgPSAnXDAnOworCisJcmV0dXJuICgwKTsKK30KKy8qCisgKiBteWRhZW1vbiBjcmVhdGVzIGEgcGlwZSBiZXR3ZWVuIHRoZSBwYXJ0ZW50IGFuZCBjaGlsZAorICogcHJvY2Vzcy4gVGhlIHBhcmVudCBwcm9jZXNzIHdpbGwgd2FpdCB1bnRpbCB0aGUKKyAqIGNoaWxkIGRpZXMgb3Igd3JpdGVzIGEgJzEnIG9uIHRoZSBwaXBlIHNpZ25hbGluZworICogdGhhdCBpdCBzdGFydGVkIHN1Y2Nlc3NmdWxseS4KKyAqLworaW50IHBpcGVmZHNbMl0gPSB7IC0xLCAtMX07CisKK3ZvaWQKK215ZGFlbW9uKGludCBub2NoZGlyLCBpbnQgbm9jbG9zZSkKK3sKKwlpbnQgcGlkLCBzdGF0dXMsIHRlbXBmZDsKKworCWlmIChwaXBlKHBpcGVmZHMpIDwgMCkKKwkJZXJyKDEsICJteWRhZW1vbjogcGlwZSgpIGZhaWxlZDogZXJybm8gJWQiLCBlcnJubyk7CisKKwlpZiAoKHBpZCA9IGZvcmsgKCkpIDwgMCkKKwkJZXJyKDEsICJteWRhZW1vbjogZm9yaygpIGZhaWxlZDogZXJybm8gJWQiLCBlcnJubyk7CisKKwlpZiAocGlkICE9IDApIHsKKwkJLyoKKwkJICogUGFyZW50LiBXYWl0IGZvciBzdGF0dXMgZnJvbSBjaGlsZC4KKwkJICovCisJCWNsb3NlKHBpcGVmZHNbMV0pOworCQlpZiAocmVhZChwaXBlZmRzWzBdLCAmc3RhdHVzLCAxKSAhPSAxKQorCQkJZXhpdCgxKTsKKwkJZXhpdCAoMCk7CisJfQorCS8qIENoaWxkLgkqLworCWNsb3NlKHBpcGVmZHNbMF0pOworCXNldHNpZCAoKTsKKwlpZiAobm9jaGRpciA9PSAwKSB7CisJCWlmIChjaGRpciAoIi8iKSA9PSAtMSkKKwkJCWVycigxLCAibXlkYWVtb246IGNoZGlyKCkgZmFpbGVkOiBlcnJubyAlZCIsIGVycm5vKTsKKwl9CisKKwl3aGlsZSAocGlwZWZkc1sxXSA8PSAyKSB7CisJCXBpcGVmZHNbMV0gPSBkdXAocGlwZWZkc1sxXSk7CisJCWlmIChwaXBlZmRzWzFdIDwgMCkKKwkJCWVycigxLCAibXlkYWVtb246IGR1cCgpIGZhaWxlZDogZXJybm8gJWQiLCBlcnJubyk7CisJfQorCisJaWYgKG5vY2xvc2UgPT0gMCkgeworCQl0ZW1wZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOworCQlpZiAodGVtcGZkIDwgMCkKKwkJCXRlbXBmZCA9IG9wZW4oIi8iLCBPX1JET05MWSk7CisJCWlmICh0ZW1wZmQgPj0gMCkgeworCQkJZHVwMih0ZW1wZmQsIDApOworCQkJZHVwMih0ZW1wZmQsIDEpOworCQkJZHVwMih0ZW1wZmQsIDIpOworCQkJY2xvc2UodGVtcGZkKTsKKwkJfSBlbHNlIHsKKwkJCWVycigxLCAibXlkYWVtb246IGNhbid0IG9wZW4gL2Rldi9udWxsOiBlcnJubyAlZCIsCisJCQkgICAgICAgZXJybm8pOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCXJldHVybjsKK30KK3ZvaWQKK3JlbGVhc2VfcGFyZW50KHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCWlmIChwaXBlZmRzWzFdID4gMCkgeworCQlpZiAod3JpdGUocGlwZWZkc1sxXSwgJnN0YXR1cywgMSkgIT0gMSkgeworCQkJZXJyKDEsICJXcml0aW5nIHRvIHBhcmVudCBwaXBlIGZhaWxlZDogZXJybm8gJWQgKCVzKVxuIiwKKwkJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQljbG9zZShwaXBlZmRzWzFdKTsKKwkJcGlwZWZkc1sxXSA9IC0xOworCX0KK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvaWRtYXBkLm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvaWRtYXBkLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVhOWYyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9pZG1hcGQubWFuCkBAIC0wLDAgKzEsOTQgQEAKKy5cIgkkT3BlbkJTRDogbWRvYy50ZW1wbGF0ZSx2IDEuNiAyMDAxLzAyLzAzIDA4OjIyOjQ0IG5pa2xhcyBFeHAgJAorLlwiCisuXCIgVGhlIGZvbGxvd2luZyByZXF1ZXN0cyBhcmUgcmVxdWlyZWQgZm9yIGFsbCBtYW4gcGFnZXMuCisuRGQgRmVicnVhcnkgMywgMjAwMworLkR0IFJQQy5JRE1BUEQgOAorLk9zCisuU2ggTkFNRQorLk5tIHJwYy5pZG1hcGQKKy5OZCBORlN2NCBJRCA8LT4gTmFtZSBNYXBwZXIKKy5TaCBTWU5PUFNJUworLlwiIEZvciBhIHByb2dyYW06ICBwcm9ncmFtIFstYWJjXSBmaWxlIC4uLgorLk5tIHJwYy5pZG1hcGQKKy5PcCBGbCB2CisuT3AgRmwgZgorLk9wIEZsIGQgQXIgZG9tYWluCisuT3AgRmwgcCBBciBwYXRoCisuT3AgRmwgVSBBciB1c2VybmFtZQorLk9wIEZsIEcgQXIgZ3JvdXBuYW1lCisuT3AgRmwgYyBBciBwYXRoCisuU2ggREVTQ1JJUFRJT04KKy5ObQoraXMgdGhlIE5GU3Y0IElEIDwtPiBuYW1lIG1hcHBpbmcgZGFlbW9uLiAgSXQgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0bwordGhlIE5GU3Y0IGtlcm5lbCBjbGllbnQgYW5kIHNlcnZlciwgdG8gd2hpY2ggaXQgY29tbXVuaWNhdGVzIHZpYQordXBjYWxscywgYnkgdHJhbnNsYXRpbmcgdXNlciBhbmQgZ3JvdXAgSURzIHRvIG5hbWVzLCBhbmQgdmljZSB2ZXJzYS4KKy5QcAorVGhlIG9wdGlvbnMgYXJlIGFzIGZvbGxvd3M6CisuQmwgLXRhZyAtd2lkdGggRHNfaW1hZ2VkaXIKKy5JdCBGbCB2CitJbmNyZWFzZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCAoY2FuIGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcykuCisuSXQgRmwgZgorUnVucworLk5tCitpbiB0aGUgZm9yZWdyb3VuZCBhbmQgcHJpbnRzIGFsbCBvdXRwdXQgdG8gdGhlIHRlcm1pbmFsLgorLkl0IEZsIGQgQXIgZG9tYWluCitTZXQgZG9tYWluIHRvCisuQXIgZG9tYWluIC4KK1RoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IE5GU3Y0IGFuZCBpcyB0eXBpY2FsbHkgYXNzaWduZWQgYnkgdGhlCitzeXN0ZW0gYWRtaW5pc3RyYXRvci4gIEJ5IGRlZmF1bHQsCisuQXIgZG9tYWluCitpcyBzZXQgdG8gYmUgdGhlIEZRRE4gb2YgdGhlIGhvc3QsIG1pbnVzIHRoZSBob3N0bmFtZS4KKy5JdCBGbCBwIEFyIHBhdGgKK1NwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFJQQyBwaXBlZnMgdG8gYmUKKy5BciBwYXRoIC4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIFwmIi92YXIvbGliL25mcy9ycGNfcGlwZWZzXCYiLgorLkl0IEZsIFUgQXIgdXNlcm5hbWUKK1NwZWNpZmllcyB0aGUgTkZTdjQgbm9ib2R5IHVzZXIgdG8gYmUKKy5BciB1c2VybmFtZSAuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcJiJub2JvZHlcJiIuCisuSXQgRmwgRyBBciBncm91cG5hbWUKK1NwZWNpZmllcyB0aGUgTkZTdjQgbm9ib2R5IGdyb3VwIHRvIGJlCisuQXIgZ3JvdXBuYW1lIC4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIFwmIm5vYm9keVwmIi4KKy5JdCBGbCBjIEFyIHBhdGgKK1VzZSBjb25maWd1cmF0aW9uIGZpbGUKKy5BciBwYXRoIC4KKy5JdCBGbCBDCitDbGllbnQtb25seTogcGVyZm9ybSBubyBpZG1hcHBpbmcgZm9yIGFueSBORlMgc2VydmVyLCBldmVuIGlmIG9uZSBpcyBkZXRlY3RlZC4KKy5JdCBGbCBTCitTZXJ2ZXItb25seTogcGVyZm9ybSBubyBpZG1hcHBpbmcgZm9yIGFueSBORlMgY2xpZW50LCBldmVuIGlmIG9uZSBpcyBkZXRlY3RlZC4KKy5FbAorLlNoIEVYQU1QTEVTCisuQ20gcnBjLmlkbWFwZCAtZCBcJiJjaXRpLnVtaWNoLmVkdVwmIiAtZiAtdnZ2CisuUHAKK1J1bnMKKy5ObQord2l0aCB0aGUgZG9tYWluIFwmImNpdGkudW1pY2guZWR1XCYiIGluIHRoZSBmb3JlZ3JvdW5kLCBwcmludGluZyBhbGwKK21lc3NhZ2VzIHRvIGNvbnNvbGUsIGFuZCB3aXRoIGEgdmVyYm9zaXR5IGxldmVsIG9mIDMuCisuXCIgVGhpcyBuZXh0IHJlcXVlc3QgaXMgZm9yIHNlY3Rpb25zIDIgYW5kIDMgZnVuY3Rpb24gcmV0dXJuIHZhbHVlcyBvbmx5LgorLlwiIC5TaCBSRVRVUk4gVkFMVUVTCisuXCIgVGhlIG5leHQgcmVxdWVzdCBpcyBmb3Igc2VjdGlvbnMgMiBhbmQgMyBlcnJvciBhbmQgc2lnbmFsIGhhbmRsaW5nIG9ubHkuCisuXCIgLlNoIEVSUk9SUworLlwiIFRoaXMgbmV4dCByZXF1ZXN0IGlzIGZvciBzZWN0aW9uIDQgb25seS4KKy5cIiAuU2ggRElBR05PU1RJQ1MKKy5cIiBUaGlzIG5leHQgcmVxdWVzdCBpcyBmb3Igc2VjdGlvbnMgMSwgNiwgNyAmIDggb25seS4KKy5cIiAuU2ggRU5WSVJPTk1FTlQKKy5TaCBGSUxFUworLlBhIC9ldGMvaWRtYXBkLmNvbmYKKy5TaCBTRUUgQUxTTworLlhyIGlkbWFwZC5jb25mIDUKKy5cIi5TaCBTRUUgQUxTTworLlwiLlhyIG55bG9uLmNvbmYgNAorLlwiIC5TaCBDT01QQVRJQklMSVRZCisuXCIuU2ggU1RBTkRBUkRTCisuXCIuU2ggQUNLTk9XTEVER0VNRU5UUworLlNoIEFVVEhPUlMKK1RoZQorLk5tCitzb2Z0d2FyZSBoYXMgYmVlbiBkZXZlbG9wZWQgYnkgTWFyaXVzIEFhbW9kdCBFcmlrc2VuCisuQXEgbWFyaXVzQGNpdGkudW1pY2guZWR1IC4KKy5cIiAuU2ggSElTVE9SWQorLlwiLlNoIEJVR1MKKy5cIlBsZWFzZSByZXBvcnQgYW55IGJ1Z3MgdG8gTWFyaXVzIEFhbW9kdCBFcmlrc2VuCisuXCIuQXEgbWFyaXVzQG1vbmtleS5vcmcgLgorLlwiIC5TaCBDQVZFQVRTCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL25mc19pZG1hcC5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9uZnNfaWRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJjZWQzCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9uZnNfaWRtYXAuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogaW5jbHVkZS9saW51eC9uZnNfaWRtYXAuaAorICoKKyAqICBVSUQgYW5kIEdJRCB0byBuYW1lIG1hcHBpbmcgZm9yIGNsaWVudHMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBNYXJpdXMgQWFtb2R0IEVyaWtzZW4gPG1hcml1c0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBORlNfSURNQVBfSAorI2RlZmluZSBORlNfSURNQVBfSAorCisvKiBYWFggZnJvbSBiaXRzL3V0bXAuaCAgKi8KKyNkZWZpbmUgSURNQVBfTkFNRVNaICAxMjgKKworI2RlZmluZSBJRE1BUF9UWVBFX1VTRVIgIDAKKyNkZWZpbmUgSURNQVBfVFlQRV9HUk9VUCAxCisKKyNkZWZpbmUgSURNQVBfQ09OVl9JRFRPTkFNRSAwCisjZGVmaW5lIElETUFQX0NPTlZfTkFNRVRPSUQgMQorCisjZGVmaW5lIElETUFQX1NUQVRVU19JTlZBTElETVNHIDB4MDEKKyNkZWZpbmUgSURNQVBfU1RBVFVTX0FHQUlOICAgICAgMHgwMgorI2RlZmluZSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTCAweDA0CisjZGVmaW5lIElETUFQX1NUQVRVU19TVUNDRVNTICAgIDB4MDgKKworI2RlZmluZSBJRE1BUF9NQVhNU0dTWiAgIDI1NgorCitzdHJ1Y3QgaWRtYXBfbXNnIHsKKwl1X2ludDhfdCAgaW1fdHlwZTsKKwl1X2ludDhfdCAgaW1fY29udjsKKwljaGFyICAgICAgaW1fbmFtZVtJRE1BUF9OQU1FU1pdOworCXVfaW50MzJfdCBpbV9pZDsKKwl1X2ludDhfdCAgaW1fc3RhdHVzOworfTsKKworI2VuZGlmIC8qIE5GU19JRE1BUF9IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL3F1ZXVlLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyM2ZlNwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvcXVldWUuaApAQCAtMCwwICsxLDQ5OSBAQAorLyoJJE9wZW5CU0Q6IHF1ZXVlLmgsdiAxLjIyIDIwMDEvMDYvMjMgMDQ6Mzk6MzUgYW5nZWxvcyBFeHAgJAkqLworLyoJJE5ldEJTRDogcXVldWUuaCx2IDEuMTEgMTk5Ni8wNS8xNiAwNToxNzoxNCBteWNyb2Z0IEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcXVldWUuaAk4LjUgKEJlcmtlbGV5KSA4LzIwLzk0CisgKi8KKworI2lmbmRlZglfU1lTX1FVRVVFX0hfCisjZGVmaW5lCV9TWVNfUVVFVUVfSF8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGZpdmUgdHlwZXMgb2YgZGF0YSBzdHJ1Y3R1cmVzOiBzaW5nbHktbGlua2VkIGxpc3RzLAorICogbGlzdHMsIHNpbXBsZSBxdWV1ZXMsIHRhaWwgcXVldWVzLCBhbmQgY2lyY3VsYXIgcXVldWVzLgorICoKKyAqCisgKiBBIHNpbmdseS1saW5rZWQgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyLiBUaGUgZWxlbWVudHMKKyAqIGFyZSBzaW5nbHkgbGlua2VkIGZvciBtaW5pbXVtIHNwYWNlIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbiBvdmVyaGVhZCBhdAorICogdGhlIGV4cGVuc2Ugb2YgTyhuKSByZW1vdmFsIGZvciBhcmJpdHJhcnkgZWxlbWVudHMuIE5ldyBlbGVtZW50cyBjYW4gYmUKKyAqIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKiBFbGVtZW50cyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3Qgc2hvdWxkIHVzZSB0aGUgZXhwbGljaXQKKyAqIG1hY3JvIGZvciB0aGlzIHB1cnBvc2UgZm9yIG9wdGltdW0gZWZmaWNpZW5jeS4gQSBzaW5nbHktbGlua2VkIGxpc3QgbWF5CisgKiBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uICBTaW5nbHktbGlua2VkIGxpc3RzIGFyZSBpZGVhbAorICogZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxhcmdlIGRhdGFzZXRzIGFuZCBmZXcgb3Igbm8gcmVtb3ZhbHMgb3IgZm9yCisgKiBpbXBsZW1lbnRpbmcgYSBMSUZPIHF1ZXVlLgorICoKKyAqIEEgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyIChvciBhbiBhcnJheSBvZiBmb3J3YXJkCisgKiBwb2ludGVycyBmb3IgYSBoYXNoIHRhYmxlIGhlYWRlcikuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5IGxpbmtlZAorICogc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlCisgKiBvciBhZnRlciBhbiBleGlzdGluZyBlbGVtZW50IG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBBIGxpc3QKKyAqIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKgorICogQSBzaW1wbGUgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIHNpbmdseQorICogbGlua2VkIHRvIHNhdmUgc3BhY2UsIHNvIGVsZW1lbnRzIGNhbiBvbmx5IGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAqIGhlYWQgb2YgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yIGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGxpc3QuIEEgc2ltcGxlIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKgorICogQSB0YWlsIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IKKyAqIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mCisgKiB0aGUgbGlzdC4gQSB0YWlsIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbi4KKyAqCisgKiBBIGNpcmNsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdG8gdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgZG91Ymx5CisgKiBsaW5rZWQgc28gdGhhdCBhbiBhcmJpdHJhcnkgZWxlbWVudCBjYW4gYmUgcmVtb3ZlZCB3aXRob3V0IGEgbmVlZCB0bworICogdHJhdmVyc2UgdGhlIGxpc3QuIE5ldyBlbGVtZW50cyBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QgYmVmb3JlIG9yIGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAqIEEgY2lyY2xlIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbiwgYnV0IGhhcyBhIG1vcmUKKyAqIGNvbXBsZXggZW5kIG9mIGxpc3QgZGV0ZWN0aW9uLgorICoKKyAqIEZvciBkZXRhaWxzIG9uIHRoZSB1c2Ugb2YgdGhlc2UgbWFjcm9zLCBzZWUgdGhlIHF1ZXVlKDMpIG1hbnVhbCBwYWdlLgorICovCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgU0xJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lCVNMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwgfQorCisjZGVmaW5lIFNMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTTElTVF9GSVJTVChoZWFkKQkoKGhlYWQpLT5zbGhfZmlyc3QpCisjZGVmaW5lCVNMSVNUX0VORChoZWFkKQkJTlVMTAorI2RlZmluZQlTTElTVF9FTVBUWShoZWFkKQkoU0xJU1RfRklSU1QoaGVhZCkgPT0gU0xJU1RfRU5EKGhlYWQpKQorI2RlZmluZQlTTElTVF9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuc2xlX25leHQpCisKKyNkZWZpbmUJU0xJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQkJXAorCWZvcigodmFyKSA9IFNMSVNUX0ZJUlNUKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSAhPSBTTElTVF9FTkQoaGVhZCk7CQkJCQlcCisJICAgICh2YXIpID0gU0xJU1RfTkVYVCh2YXIsIGZpZWxkKSkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUJU0xJU1RfSU5JVChoZWFkKSB7CQkJCQkJXAorCVNMSVNUX0ZJUlNUKGhlYWQpID0gU0xJU1RfRU5EKGhlYWQpOwkJCQlcCit9CisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0FGVEVSKHNsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0OwkJXAorCShzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoaGVhZCktPnNsaF9maXJzdDsJCQlcCisJKGhlYWQpLT5zbGhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGhlYWQpLT5zbGhfZmlyc3QtPmZpZWxkLnNsZV9uZXh0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTTElTVF9SRU1PVkUoaGVhZCwgZWxtLCB0eXBlLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKGhlYWQpLT5zbGhfZmlyc3QgPT0gKGVsbSkpIHsJCQkJXAorCQlTTElTVF9SRU1PVkVfSEVBRCgoaGVhZCksIGZpZWxkKTsJCQlcCisJfQkJCQkJCQkJXAorCWVsc2UgewkJCQkJCQkJXAorCQlzdHJ1Y3QgdHlwZSAqY3VyZWxtID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQlcCisJCXdoaWxlKCBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0ICE9IChlbG0pICkJCVwKKwkJCWN1cmVsbSA9IGN1cmVsbS0+ZmllbGQuc2xlX25leHQ7CQlcCisJCWN1cmVsbS0+ZmllbGQuc2xlX25leHQgPQkJCQlcCisJCSAgICBjdXJlbG0tPmZpZWxkLnNsZV9uZXh0LT5maWVsZC5zbGVfbmV4dDsJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBMSVNUX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorfQorCisjZGVmaW5lIExJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUgTElTVF9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKmxlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKmxlX3ByZXY7CS8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovCVwKK30KKworLyoKKyAqIExpc3QgYWNjZXNzIG1ldGhvZHMKKyAqLworI2RlZmluZQlMSVNUX0ZJUlNUKGhlYWQpCQkoKGhlYWQpLT5saF9maXJzdCkKKyNkZWZpbmUJTElTVF9FTkQoaGVhZCkJCQlOVUxMCisjZGVmaW5lCUxJU1RfRU1QVFkoaGVhZCkJCShMSVNUX0ZJUlNUKGhlYWQpID09IExJU1RfRU5EKGhlYWQpKQorI2RlZmluZQlMSVNUX05FWFQoZWxtLCBmaWVsZCkJCSgoZWxtKS0+ZmllbGQubGVfbmV4dCkKKworI2RlZmluZSBMSVNUX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IoKHZhcikgPSBMSVNUX0ZJUlNUKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSE9IExJU1RfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IExJU1RfTkVYVCh2YXIsIGZpZWxkKSkKKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCUxJU1RfSU5JVChoZWFkKSBkbyB7CQkJCQkJXAorCUxJU1RfRklSU1QoaGVhZCkgPSBMSVNUX0VORChoZWFkKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMSVNUX0lOU0VSVF9BRlRFUihsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmxlX25leHQpICE9IE5VTEwpCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0LT5maWVsZC5sZV9wcmV2ID0JCVwKKwkJICAgICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dCA9IChlbG0pOwkJCQlcCisJKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlMSVNUX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQubGVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQubGVfcHJldjsJCVwKKwkoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChsaXN0ZWxtKTsJCQkJXAorCSoobGlzdGVsbSktPmZpZWxkLmxlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTElTVF9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGhlYWQpLT5saF9maXJzdCkgIT0gTlVMTCkJCVwKKwkJKGhlYWQpLT5saF9maXJzdC0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDtcCisJKGhlYWQpLT5saF9maXJzdCA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihoZWFkKS0+bGhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMSVNUX1JFTU9WRShlbG0sIGZpZWxkKSBkbyB7CQkJCQlcCisJaWYgKChlbG0pLT5maWVsZC5sZV9uZXh0ICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5sZV9wcmV2OwkJCQlcCisJKihlbG0pLT5maWVsZC5sZV9wcmV2ID0gKGVsbSktPmZpZWxkLmxlX25leHQ7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMSVNUX1JFUExBQ0UoZWxtLCBlbG0yLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtMiktPmZpZWxkLmxlX25leHQgPSAoZWxtKS0+ZmllbGQubGVfbmV4dCkgIT0gTlVMTCkJXAorCQkoZWxtMiktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPQkJCVwKKwkJICAgICYoZWxtMiktPmZpZWxkLmxlX25leHQ7CQkJCVwKKwkoZWxtMiktPmZpZWxkLmxlX3ByZXYgPSAoZWxtKS0+ZmllbGQubGVfcHJldjsJCQlcCisJKihlbG0yKS0+ZmllbGQubGVfcHJldiA9IChlbG0yKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBTSU1QTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FoX2ZpcnN0OwkvKiBmaXJzdCBlbGVtZW50ICovCQkJXAorCXN0cnVjdCB0eXBlICoqc3FoX2xhc3Q7CS8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8JCVwKK30KKworI2RlZmluZSBTSU1QTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJCVwKKwl7IE5VTEwsICYoaGVhZCkuc3FoX2ZpcnN0IH0KKworI2RlZmluZSBTSU1QTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0ZJUlNUKGhlYWQpCSAgICAoKGhlYWQpLT5zcWhfZmlyc3QpCisjZGVmaW5lCVNJTVBMRVFfRU5EKGhlYWQpCSAgICBOVUxMCisjZGVmaW5lCVNJTVBMRVFfRU1QVFkoaGVhZCkJICAgIChTSU1QTEVRX0ZJUlNUKGhlYWQpID09IFNJTVBMRVFfRU5EKGhlYWQpKQorI2RlZmluZQlTSU1QTEVRX05FWFQoZWxtLCBmaWVsZCkgICAgKChlbG0pLT5maWVsZC5zcWVfbmV4dCkKKworI2RlZmluZSBTSU1QTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvcigodmFyKSA9IFNJTVBMRVFfRklSU1QoaGVhZCk7CQkJCVwKKwkgICAgKHZhcikgIT0gU0lNUExFUV9FTkQoaGVhZCk7CQkJCQlcCisJICAgICh2YXIpID0gU0lNUExFUV9ORVhUKHZhciwgZmllbGQpKQorCisvKgorICogU2ltcGxlIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlTSU1QTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1QTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoaGVhZCktPnNxaF9maXJzdCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1QTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkqKGhlYWQpLT5zcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU0lNUExFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCWlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTClcCisJCShoZWFkKS0+c3FoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnNxZV9uZXh0OwkJXAorCShsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTSU1QTEVRX1JFTU9WRV9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoaGVhZCktPnNxaF9maXJzdCA9IChlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUYWlsIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFRBSUxRX0hFQUQobmFtZSwgdHlwZSkJCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUgVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lIFRBSUxRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqdHFlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxZV9wcmV2OwkvKiBhZGRyZXNzIG9mIHByZXZpb3VzIG5leHQgZWxlbWVudCAqLwlcCit9CisKKy8qCisgKiB0YWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzCisgKi8KKyNkZWZpbmUJVEFJTFFfRklSU1QoaGVhZCkJCSgoaGVhZCktPnRxaF9maXJzdCkKKyNkZWZpbmUJVEFJTFFfRU5EKGhlYWQpCQkJTlVMTAorI2RlZmluZQlUQUlMUV9ORVhUKGVsbSwgZmllbGQpCQkoKGVsbSktPmZpZWxkLnRxZV9uZXh0KQorI2RlZmluZSBUQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKQkJCQkJXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorLyogWFhYICovCisjZGVmaW5lIFRBSUxRX1BSRVYoZWxtLCBoZWFkbmFtZSwgZmllbGQpCQkJCVwKKwkoKigoKHN0cnVjdCBoZWFkbmFtZSAqKSgoZWxtKS0+ZmllbGQudHFlX3ByZXYpKS0+dHFoX2xhc3QpKQorI2RlZmluZQlUQUlMUV9FTVBUWShoZWFkKQkJCQkJCVwKKwkoVEFJTFFfRklSU1QoaGVhZCkgPT0gVEFJTFFfRU5EKGhlYWQpKQorCisjZGVmaW5lIFRBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJCVwKKwlmb3IoKHZhcikgPSBUQUlMUV9GSVJTVChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgIT0gVEFJTFFfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IFRBSUxRX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUgVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgZmllbGQsIGhlYWRuYW1lKQkJXAorCWZvcigodmFyKSA9IFRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpOwkJCQlcCisJICAgICh2YXIpICE9IFRBSUxRX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBUQUlMUV9QUkVWKHZhciwgaGVhZG5hbWUsIGZpZWxkKSkKKworLyoKKyAqIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lCVRBSUxRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9JTlNFUlRfSEVBRChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGhlYWQpLT50cWhfZmlyc3QpICE9IE5VTEwpCVwKKwkJKGhlYWQpLT50cWhfZmlyc3QtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRBSUxRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoaGVhZCktPnRxaF9sYXN0OwkJCVwKKwkqKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pOwkJCQkJXAorCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpXAorCQkoZWxtKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCQkJCVwKKwkJKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9CQkJXAorCQkgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJXAorCSooZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUQUlMUV9SRVBMQUNFKGhlYWQsIGVsbSwgZWxtMiwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtMiktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKQlcCisJCShlbG0yKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0JCVwKKwkJICAgICYoZWxtMiktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0yKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGVsbTIpLT5maWVsZC50cWVfcHJldiA9IChlbG0pLT5maWVsZC50cWVfcHJldjsJCQlcCisJKihlbG0yKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtMik7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBDaXJjdWxhciBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBDSVJDTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2ZpcnN0OwkJLyogZmlyc3QgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWhfbGFzdDsJCS8qIGxhc3QgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lIENJUkNMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKQkJCQkJXAorCXsgQ0lSQ0xFUV9FTkQoJmhlYWQpLCBDSVJDTEVRX0VORCgmaGVhZCkgfQorCisjZGVmaW5lIENJUkNMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpjcWVfbmV4dDsJCS8qIG5leHQgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWVfcHJldjsJCS8qIHByZXZpb3VzIGVsZW1lbnQgKi8JCVwKK30KKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGFjY2VzcyBtZXRob2RzCisgKi8KKyNkZWZpbmUJQ0lSQ0xFUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+Y3FoX2ZpcnN0KQorI2RlZmluZQlDSVJDTEVRX0xBU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9sYXN0KQorI2RlZmluZQlDSVJDTEVRX0VORChoZWFkKQkJKCh2b2lkICopKGhlYWQpKQorI2RlZmluZQlDSVJDTEVRX05FWFQoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfbmV4dCkKKyNkZWZpbmUJQ0lSQ0xFUV9QUkVWKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX3ByZXYpCisjZGVmaW5lCUNJUkNMRVFfRU1QVFkoaGVhZCkJCQkJCQlcCisJKENJUkNMRVFfRklSU1QoaGVhZCkgPT0gQ0lSQ0xFUV9FTkQoaGVhZCkpCisKKyNkZWZpbmUgQ0lSQ0xFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IoKHZhcikgPSBDSVJDTEVRX0ZJUlNUKGhlYWQpOwkJCQlcCisJICAgICh2YXIpICE9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IENJUkNMRVFfTkVYVCh2YXIsIGZpZWxkKSkKKworI2RlZmluZSBDSVJDTEVRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGZpZWxkKQkJCVwKKwlmb3IoKHZhcikgPSBDSVJDTEVRX0xBU1QoaGVhZCk7CQkJCQlcCisJICAgICh2YXIpICE9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IENJUkNMRVFfUFJFVih2YXIsIGZpZWxkKSkKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZQlDSVJDTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9IENJUkNMRVFfRU5EKGhlYWQpOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENJUkNMRVFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0OwkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChsaXN0ZWxtKTsJCQkJXAorCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9sYXN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQtPmZpZWxkLmNxZV9wcmV2ID0gKGVsbSk7CVwKKwkobGlzdGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAobGlzdGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2OwkJXAorCWlmICgobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwlcCisJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENJUkNMRVFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX25leHQgPSAoaGVhZCktPmNxaF9maXJzdDsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gQ0lSQ0xFUV9FTkQoaGVhZCk7CQkJXAorCWlmICgoaGVhZCktPmNxaF9sYXN0ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSVJDTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gQ0lSQ0xFUV9FTkQoaGVhZCk7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChoZWFkKS0+Y3FoX2xhc3Q7CQkJXAorCWlmICgoaGVhZCktPmNxaF9maXJzdCA9PSBDSVJDTEVRX0VORChoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QtPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZQlDSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09IENJUkNMRVFfRU5EKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfcHJldjsJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gQ0lSQ0xFUV9FTkQoaGVhZCkpCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSVJDTEVRX1JFUExBQ0UoaGVhZCwgZWxtLCBlbG0yLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0yKS0+ZmllbGQuY3FlX25leHQgPSAoZWxtKS0+ZmllbGQuY3FlX25leHQpID09CQlcCisJICAgIENJUkNMRVFfRU5EKGhlYWQpKQkJCQkJCVwKKwkJKGhlYWQpLmNxaF9sYXN0ID0gKGVsbTIpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtMiktPmZpZWxkLmNxZV9uZXh0LT5maWVsZC5jcWVfcHJldiA9IChlbG0yKTsJXAorCWlmICgoKGVsbTIpLT5maWVsZC5jcWVfcHJldiA9IChlbG0pLT5maWVsZC5jcWVfcHJldikgPT0JCVwKKwkgICAgQ0lSQ0xFUV9FTkQoaGVhZCkpCQkJCQkJXAorCQkoaGVhZCkuY3FoX2ZpcnN0ID0gKGVsbTIpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoZWxtMiktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0yKTsJXAorfSB3aGlsZSAoMCkKKworI2VuZGlmCS8qICFfU1lTX1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL3N0cmxjYXQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9pZG1hcGQvc3RybGNhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWRkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL3N0cmxjYXQuYwpAQCAtMCwwICsxLDc2IEBACisvKgkkT3BlbkJTRDogc3RybGNhdC5jLHYgMS44IDIwMDEvMDUvMTMgMTU6NDA6MTUgZGVyYWFkdCBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorICogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgKnJjc2lkID0gIiRPcGVuQlNEOiBzdHJsY2F0LmMsdiAxLjggMjAwMS8wNS8xMyAxNTo0MDoxNSBkZXJhYWR0IEV4cCAkIjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZiAvKiBIQVZFX0NPTkZJR19IICovCisKKy8qCisgKiBBcHBlbmRzIHNyYyB0byBzdHJpbmcgZHN0IG9mIHNpemUgc2l6ICh1bmxpa2Ugc3RybmNhdCwgc2l6IGlzIHRoZQorICogZnVsbCBzaXplIG9mIGRzdCwgbm90IHNwYWNlIGxlZnQpLiAgQXQgbW9zdCBzaXotMSBjaGFyYWN0ZXJzCisgKiB3aWxsIGJlIGNvcGllZC4gIEFsd2F5cyBOVUwgdGVybWluYXRlcyAodW5sZXNzIHNpeiA8PSBzdHJsZW4oZHN0KSkuCisgKiBSZXR1cm5zIHN0cmxlbihzcmMpICsgTUlOKHNpeiwgc3RybGVuKGluaXRpYWwgZHN0KSkuCisgKiBJZiByZXR2YWwgPj0gc2l6LCB0cnVuY2F0aW9uIG9jY3VycmVkLgorICovCitzaXplX3QKK3N0cmxjYXQoY2hhciAqZHN0LAorCWNvbnN0IGNoYXIgKnNyYywKKwlzaXplX3Qgc2l6KQoreworCXJlZ2lzdGVyIGNoYXIgKmQgPSBkc3Q7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHNyYzsKKwlyZWdpc3RlciBzaXplX3QgbiA9IHNpejsKKwlzaXplX3QgZGxlbjsKKworCS8qIEZpbmQgdGhlIGVuZCBvZiBkc3QgYW5kIGFkanVzdCBieXRlcyBsZWZ0IGJ1dCBkb24ndCBnbyBwYXN0IGVuZCAqLworCXdoaWxlIChuLS0gIT0gMCAmJiAqZCAhPSAnXDAnKQorCQlkKys7CisJZGxlbiA9IGQgLSBkc3Q7CisJbiA9IHNpeiAtIGRsZW47CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4oZGxlbiArIHN0cmxlbihzKSk7CisJd2hpbGUgKCpzICE9ICdcMCcpIHsKKwkJaWYgKG4gIT0gMSkgeworCQkJKmQrKyA9ICpzOworCQkJbi0tOworCQl9CisJCXMrKzsKKwl9CisJKmQgPSAnXDAnOworCisJcmV0dXJuKGRsZW4gKyAocyAtIHNyYykpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9zdHJsY3B5LmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvaWRtYXBkL3N0cmxjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY1M2VlCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL2lkbWFwZC9zdHJsY3B5LmMKQEAgLTAsMCArMSw3MiBAQAorLyoJJE9wZW5CU0Q6IHN0cmxjcHkuYyx2IDEuNSAyMDAxLzA1LzEzIDE1OjQwOjE2IGRlcmFhZHQgRXhwICQJKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OCBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKK3N0YXRpYyBjaGFyICpyY3NpZCA9ICIkT3BlbkJTRDogc3RybGNweS5jLHYgMS41IDIwMDEvMDUvMTMgMTU6NDA6MTYgZGVyYWFkdCBFeHAgJCI7CisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYgLyogSEFWRV9DT05GSUdfSCAqLworCisvKgorICogQ29weSBzcmMgdG8gc3RyaW5nIGRzdCBvZiBzaXplIHNpei4gIEF0IG1vc3Qgc2l6LTEgY2hhcmFjdGVycworICogd2lsbCBiZSBjb3BpZWQuICBBbHdheXMgTlVMIHRlcm1pbmF0ZXMgKHVubGVzcyBzaXogPT0gMCkuCisgKiBSZXR1cm5zIHN0cmxlbihzcmMpOyBpZiByZXR2YWwgPj0gc2l6LCB0cnVuY2F0aW9uIG9jY3VycmVkLgorICovCitzaXplX3QKK3N0cmxjcHkoY2hhciAqZHN0LAorCWNvbnN0IGNoYXIgKnNyYywKKwlzaXplX3Qgc2l6KQoreworCXJlZ2lzdGVyIGNoYXIgKmQgPSBkc3Q7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHNyYzsKKwlyZWdpc3RlciBzaXplX3QgbiA9IHNpejsKKworCS8qIENvcHkgYXMgbWFueSBieXRlcyBhcyB3aWxsIGZpdCAqLworCWlmIChuICE9IDAgJiYgLS1uICE9IDApIHsKKwkJZG8geworCQkJaWYgKCgqZCsrID0gKnMrKykgPT0gMCkKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoLS1uICE9IDApOworCX0KKworCS8qIE5vdCBlbm91Z2ggcm9vbSBpbiBkc3QsIGFkZCBOVUwgYW5kIHRyYXZlcnNlIHJlc3Qgb2Ygc3JjICovCisJaWYgKG4gPT0gMCkgeworCQlpZiAoc2l6ICE9IDApCisJCQkqZCA9ICdcMCc7CQkvKiBOVUwtdGVybWluYXRlIGRzdCAqLworCQl3aGlsZSAoKnMrKykKKwkJCTsKKwl9CisKKwlyZXR1cm4ocyAtIHNyYyAtIDEpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTM4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NiBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKKyMgVGhlc2UgYmluYXJpZXMgZ28gaW4gL3NiaW4gKG5vdCAvdXNyL3NiaW4pLCBhbmQgdGhhdCBjYW5ub3QgYmUKKyMgb3ZlcnJpZGVuIGF0IGNvbmZpZyB0aW1lLgorc2JpbmRpciA9IC9zYmluCisKK21hbjhfTUFOUwk9IG1vdW50Lm5mcy5tYW4gdW1vdW50Lm5mcy5tYW4KK21hbjVfTUFOUwk9IG5mcy5tYW4KKworc2Jpbl9QUk9HUkFNUwk9IG1vdW50Lm5mcworRVhUUkFfRElTVCA9IG5mc21vdW50LnggJChtYW44X01BTlMpICQobWFuNV9NQU5TKQorbW91bnRfbmZzX1NPVVJDRVMgPSBtb3VudC5jIGVycm9yLmMgbmV0d29yay5jIGZzdGFiLmMgdG9rZW4uYyBcCisJCSAgICBwYXJzZV9vcHQuYyBwYXJzZV9kZXYuYyBcCisJCSAgICBuZnNtb3VudC5jIG5mczRtb3VudC5jIHN0cm9wdHMuY1wKKwkJICAgIG5mc3Vtb3VudC5jIFwKKwkJICAgIG1vdW50X2NvbnN0YW50cy5oIGVycm9yLmggbmV0d29yay5oIGZzdGFiLmggdG9rZW4uaCBcCisJCSAgICBwYXJzZV9vcHQuaCBwYXJzZV9kZXYuaCBcCisJCSAgICBuZnM0X21vdW50LmggbmZzX21vdW50NC5oIHN0cm9wdHMuaCB2ZXJzaW9uLmggXAorCQkJbW91bnRfY29uZmlnLmgKKworaWYgTU9VTlRfQ09ORklHCittb3VudF9uZnNfU09VUkNFUyArPSBjb25maWdmaWxlLmMKK21hbjVfTUFOUyArPSBuZnNtb3VudC5jb25mLm1hbgorRVhUUkFfRElTVCArPSBuZnNtb3VudC5jb25mCitlbmRpZgorCittb3VudF9uZnNfTERBREQgPSAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJCSAgLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCitpbnN0YWxsLWV4ZWMtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgbG4gLXNmIG1vdW50Lm5mcyBtb3VudC5uZnM0ICYmIFwKKwkgIGxuIC1zZiBtb3VudC5uZnMgdW1vdW50Lm5mcyAmJiBcCisJICBsbiAtc2YgbW91bnQubmZzIHVtb3VudC5uZnM0ICYmIFwKKwkgIGNobW9kIDQ1MTEgbW91bnQubmZzICkKK3VuaW5zdGFsbC1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICAgIHJtIC1mIG1vdW50Lm5mczQgdW1vdW50Lm5mcyB1bW91bnQubmZzNCkKKworCitpbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkJGluc3QgOyBcCisJICBkb25lKQorCShjZCAkKERFU1RESVIpJChtYW41ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjVfTUFOUykgJChkaXN0X21hbjVfTUFOUykgJChub2Rpc3RfbWFuNV9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC81LydgOyBcCisJICAgIHJtIC1mICQkaW5zdCA7IFwKKwkgIGRvbmUpCisKK3VuaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJCRpbnN0IDsgXAorCSAgZG9uZSkKKwkoY2QgJChERVNURElSKSQobWFuNWRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW41X01BTlMpICQoZGlzdF9tYW41X01BTlMpICQobm9kaXN0X21hbjVfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvNS8nYDsgXAorCSAgICBybSAtZiAkJGluc3QgOyBcCisJICBkb25lKQorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlMzIzMgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDc1MSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc2Jpbl9QUk9HUkFNUyA9IG1vdW50Lm5mcyQoRVhFRVhUKQorQE1PVU5UX0NPTkZJR19UUlVFQGFtX19hcHBlbmRfMSA9IGNvbmZpZ2ZpbGUuYworQE1PVU5UX0NPTkZJR19UUlVFQGFtX19hcHBlbmRfMiA9IG5mc21vdW50LmNvbmYubWFuCitATU9VTlRfQ09ORklHX1RSVUVAYW1fX2FwcGVuZF8zID0gbmZzbW91bnQuY29uZgorc3ViZGlyID0gdXRpbHMvbW91bnQKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW41ZGlyKSIgXAorCSIkKERFU1RESVIpJChtYW44ZGlyKSIKK1BST0dSQU1TID0gJChzYmluX1BST0dSQU1TKQorYW1fX21vdW50X25mc19TT1VSQ0VTX0RJU1QgPSBtb3VudC5jIGVycm9yLmMgbmV0d29yay5jIGZzdGFiLmMgdG9rZW4uYyBcCisJcGFyc2Vfb3B0LmMgcGFyc2VfZGV2LmMgbmZzbW91bnQuYyBuZnM0bW91bnQuYyBzdHJvcHRzLmMgXAorCW5mc3Vtb3VudC5jIG1vdW50X2NvbnN0YW50cy5oIGVycm9yLmggbmV0d29yay5oIGZzdGFiLmggXAorCXRva2VuLmggcGFyc2Vfb3B0LmggcGFyc2VfZGV2LmggbmZzNF9tb3VudC5oIG5mc19tb3VudDQuaCBcCisJc3Ryb3B0cy5oIHZlcnNpb24uaCBtb3VudF9jb25maWcuaCBjb25maWdmaWxlLmMKK0BNT1VOVF9DT05GSUdfVFJVRUBhbV9fb2JqZWN0c18xID0gY29uZmlnZmlsZS4kKE9CSkVYVCkKK2FtX21vdW50X25mc19PQkpFQ1RTID0gbW91bnQuJChPQkpFWFQpIGVycm9yLiQoT0JKRVhUKSBcCisJbmV0d29yay4kKE9CSkVYVCkgZnN0YWIuJChPQkpFWFQpIHRva2VuLiQoT0JKRVhUKSBcCisJcGFyc2Vfb3B0LiQoT0JKRVhUKSBwYXJzZV9kZXYuJChPQkpFWFQpIG5mc21vdW50LiQoT0JKRVhUKSBcCisJbmZzNG1vdW50LiQoT0JKRVhUKSBzdHJvcHRzLiQoT0JKRVhUKSBuZnN1bW91bnQuJChPQkpFWFQpIFwKKwkkKGFtX19vYmplY3RzXzEpCittb3VudF9uZnNfT0JKRUNUUyA9ICQoYW1fbW91bnRfbmZzX09CSkVDVFMpCittb3VudF9uZnNfREVQRU5ERU5DSUVTID0gLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCS4uLy4uL3N1cHBvcnQvZXhwb3J0L2xpYmV4cG9ydC5hCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobW91bnRfbmZzX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKGFtX19tb3VudF9uZnNfU09VUkNFU19ESVNUKQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworbWFuNWRpciA9ICQobWFuZGlyKS9tYW41CittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKG1hbjVfTUFOUykgJChtYW44X01BTlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKKworIyBUaGVzZSBiaW5hcmllcyBnbyBpbiAvc2JpbiAobm90IC91c3Ivc2JpbiksIGFuZCB0aGF0IGNhbm5vdCBiZQorIyBvdmVycmlkZW4gYXQgY29uZmlnIHRpbWUuCitzYmluZGlyID0gL3NiaW4KK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbWFuOF9NQU5TID0gbW91bnQubmZzLm1hbiB1bW91bnQubmZzLm1hbgorbWFuNV9NQU5TID0gbmZzLm1hbiAkKGFtX19hcHBlbmRfMikKK0VYVFJBX0RJU1QgPSBuZnNtb3VudC54ICQobWFuOF9NQU5TKSAkKG1hbjVfTUFOUykgJChhbV9fYXBwZW5kXzMpCittb3VudF9uZnNfU09VUkNFUyA9IG1vdW50LmMgZXJyb3IuYyBuZXR3b3JrLmMgZnN0YWIuYyB0b2tlbi5jIFwKKwlwYXJzZV9vcHQuYyBwYXJzZV9kZXYuYyBuZnNtb3VudC5jIG5mczRtb3VudC5jIHN0cm9wdHMuYyBcCisJbmZzdW1vdW50LmMgbW91bnRfY29uc3RhbnRzLmggZXJyb3IuaCBuZXR3b3JrLmggZnN0YWIuaCBcCisJdG9rZW4uaCBwYXJzZV9vcHQuaCBwYXJzZV9kZXYuaCBuZnM0X21vdW50LmggbmZzX21vdW50NC5oIFwKKwlzdHJvcHRzLmggdmVyc2lvbi5oIG1vdW50X2NvbmZpZy5oICQoYW1fX2FwcGVuZF8xKQorbW91bnRfbmZzX0xEQUREID0gLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCQkgIC4uLy4uL3N1cHBvcnQvZXhwb3J0L2xpYmV4cG9ydC5hCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KK2FsbDogYWxsLWFtCisKKy5TVUZGSVhFUzoKKy5TVUZGSVhFUzogLmMgLmxvIC5vIC5vYmoKKyQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCUBmb3IgZGVwIGluICQ/OyBkbyBcCisJICBjYXNlICckKGFtX19jb25maWd1cmVfZGVwcyknIGluIFwKKwkgICAgKiQkZGVwKikgXAorCSAgICAgICggY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoICkgXAorCSAgICAgICAgJiYgeyBpZiB0ZXN0IC1mICRAOyB0aGVuIGV4aXQgMDsgZWxzZSBicmVhazsgZmk7IH07IFwKKwkgICAgICBleGl0IDE7OyBcCisJICBlc2FjOyBcCisJZG9uZTsgXAorCWVjaG8gJyBjZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tZ251IHV0aWxzL21vdW50L01ha2VmaWxlJzsgXAorCSQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpICYmIFwKKwkgICQoQVVUT01BS0UpIC0tZ251IHV0aWxzL21vdW50L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgoraW5zdGFsbC1zYmluUFJPR1JBTVM6ICQoc2Jpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHNiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChzYmluZGlyKSIKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKwlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCisJd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKKwkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAorCWRvbmUgfCBcCisJc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAorCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCisJICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCisJICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKKwkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKKwl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChzYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKHNiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtc2JpblBST0dSQU1TOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChzYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHNiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK2NsZWFuLXNiaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorbW91bnQubmZzJChFWEVFWFQpOiAkKG1vdW50X25mc19PQkpFQ1RTKSAkKG1vdW50X25mc19ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBtb3VudC5uZnMkKEVYRUVYVCkKKwkkKExJTkspICQobW91bnRfbmZzX09CSkVDVFMpICQobW91bnRfbmZzX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9jb25maWdmaWxlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9lcnJvci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvZnN0YWIuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21vdW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZXR3b3JrLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZnM0bW91bnQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL25mc21vdW50LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZnN1bW91bnQuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL3BhcnNlX2Rldi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcGFyc2Vfb3B0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdHJvcHRzLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS90b2tlbi5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworaW5zdGFsbC1tYW41OiAkKG1hbjVfTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjVkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW41ZGlyKSIKKwlAbGlzdD0nJChtYW41X01BTlMpJzsgdGVzdCAtbiAiJChtYW41ZGlyKSIgfHwgZXhpdCAwOyBcCisJeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjVdWzAtOWEtel0qJCQsNSw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKKwlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKKwlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuNWRpcikvJCRpbnN0JyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW41ZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjVkaXIpJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjVkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAorCWRvbmU7IH0KKwordW5pbnN0YWxsLW1hbjU6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW41X01BTlMpJzsgdGVzdCAtbiAiJChtYW41ZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteNV1bMC05YS16XSokJCw1LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAorCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjVkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwkgIGNkICIkKERFU1RESVIpJChtYW41ZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQoraW5zdGFsbC1tYW44OiAkKG1hbjhfTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjhkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW44ZGlyKSIKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKKwlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKKwlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0JyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjhkaXIpJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjhkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAorCWRvbmU7IH0KKwordW5pbnN0YWxsLW1hbjg6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAorCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjhkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwkgIGNkICIkKERFU1RESVIpJChtYW44ZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVsc2UgOjsgZmk7IGRvbmVgOyBcCisJICBpZiB0ZXN0IC1uICIkJGxpc3QiICYmIFwKKwkgICAgZ3JlcCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgIGVjaG8gImVycm9yOiBmb3VuZCBtYW4gcGFnZXMgY29udGFpbmluZyB0aGUgXGBtaXNzaW5nIGhlbHAybWFuJyByZXBsYWNlbWVudCB0ZXh0OiIgPiYyOyBcCisJICAgIGdyZXAgLWwgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0IHwgc2VkICdzL14vICAgICAgICAgLycgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0byBmaXggdGhlbSwgaW5zdGFsbCBoZWxwMm1hbiwgcmVtb3ZlIGFuZCByZWdlbmVyYXRlIHRoZSBtYW4gcGFnZXM7IiA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHR5cGljYWxseSBcYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCisJICAgIGV4aXQgMTsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWVsc2UgOjsgZmkKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiBjaGVjay1hbQorYWxsLWFtOiBNYWtlZmlsZSAkKFBST0dSQU1TKSAkKE1BTlMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjVkaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgXAorCW1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1zYmluUFJPR1JBTVMKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtaG9vaworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjUgaW5zdGFsbC1tYW44CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1ob29rCit1bmluc3RhbGwtbWFuOiB1bmluc3RhbGwtbWFuNSB1bmluc3RhbGwtbWFuOAorCisuTUFLRTogaW5zdGFsbC1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1zdHJpcCB1bmluc3RhbGwtYW0KKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMtaG9vayBcCisJaW5zdGFsbC1odG1sIGluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIFwKKwlpbnN0YWxsLW1hbiBpbnN0YWxsLW1hbjUgaW5zdGFsbC1tYW44IGluc3RhbGwtcGRmIFwKKwlpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIGluc3RhbGwtcHMtYW0gaW5zdGFsbC1zYmluUFJPR1JBTVMgXAorCWluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBcCisJbWFpbnRhaW5lci1jbGVhbiBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gXAorCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIFwKKwlwZGYgcGRmLWFtIHBzIHBzLWFtIHRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtaG9vayBcCisJdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuNSB1bmluc3RhbGwtbWFuOCBcCisJdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCisKK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBsbiAtc2YgbW91bnQubmZzIG1vdW50Lm5mczQgJiYgXAorCSAgbG4gLXNmIG1vdW50Lm5mcyB1bW91bnQubmZzICYmIFwKKwkgIGxuIC1zZiBtb3VudC5uZnMgdW1vdW50Lm5mczQgJiYgXAorCSAgY2htb2QgNDUxMSBtb3VudC5uZnMgKQordW5pbnN0YWxsLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgICAgcm0gLWYgbW91bnQubmZzNCB1bW91bnQubmZzIHVtb3VudC5uZnM0KQorCitpbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkJGluc3QgOyBcCisJICBkb25lKQorCShjZCAkKERFU1RESVIpJChtYW41ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjVfTUFOUykgJChkaXN0X21hbjVfTUFOUykgJChub2Rpc3RfbWFuNV9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC81LydgOyBcCisJICAgIHJtIC1mICQkaW5zdCA7IFwKKwkgIGRvbmUpCisKK3VuaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJCRpbnN0IDsgXAorCSAgZG9uZSkKKwkoY2QgJChERVNURElSKSQobWFuNWRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW41X01BTlMpICQoZGlzdF9tYW41X01BTlMpICQobm9kaXN0X21hbjVfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvNS8nYDsgXAorCSAgICBybSAtZiAkJGluc3QgOyBcCisJICBkb25lKQorCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvY29uZmlnZmlsZS5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2NvbmZpZ2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ZmMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2NvbmZpZ2ZpbGUuYwpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIGNvbmZpZ2ZpbGUuYyAtLSBtb3VudCBjb25maWd1cmF0aW9uIGZpbGUgbWFuaXB1bGF0aW9uIAorICogQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYyA8bmZzQHJlZGhhdC5jb20+CisgKgorICogLSBSb3V0aW5lcyB1c2UgdG8gY3JlYXRlIG1vdW50IG9wdGlvbnMgZnJvbSB0aGUgbW91bnQKKyAqICAgY29uZmlndXJhdGlvbiBmaWxlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJ4bG9nLmgiCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJwYXJzZV9vcHQuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAiY29uZmZpbGUuaCIKKworI2RlZmluZSBLQllURVMoeCkgICAgICgoeCkgKiAoMTAyNCkpCisjZGVmaW5lIE1FR0FCWVRFUyh4KSAgKCh4KSAqICgxMDQ4NTc2KSkKKyNkZWZpbmUgR0lHQUJZVEVTKHgpICAoKHgpICogKDEwNzM3NDE4MjQpKQorCisjaWZuZGVmIE5GU01PVU5UX0dMT0JBTF9PUFRTCisjZGVmaW5lIE5GU01PVU5UX0dMT0JBTF9PUFRTICJORlNNb3VudF9HbG9iYWxfT3B0aW9ucyIKKyNlbmRpZgorCisjaWZuZGVmIE5GU01PVU5UX01PVU5UUE9JTlQKKyNkZWZpbmUgTkZTTU9VTlRfTU9VTlRQT0lOVCAiTW91bnRQb2ludCIKKyNlbmRpZgorCisjaWZuZGVmIE5GU01PVU5UX1NFUlZFUgorI2RlZmluZSBORlNNT1VOVF9TRVJWRVIgIlNlcnZlciIKKyNlbmRpZgorCisjaWZuZGVmIE1PVU5UT1BUU19DT05GRklMRQorI2RlZmluZSBNT1VOVE9QVFNfQ09ORkZJTEUgIi9ldGMvbmZzbW91bnQuY29uZiIKKyNlbmRpZgorY2hhciAqY29uZl9wYXRoID0gTU9VTlRPUFRTX0NPTkZGSUxFOworZW51bSB7CisJTU5UX05PQVJHPTAsCisJTU5UX0lOVEFSRywKKwlNTlRfU1RSQVJHLAorCU1OVF9TUEVDLAorCU1OVF9VTlNFVAorfTsKK3N0cnVjdCBtbnRfYWxpYXMgeworCWNoYXIgKmFsaWFzOworCWNoYXIgKm9wdDsKKwlpbnQgIGFyZ3R5cGU7Cit9IG1udF9hbGlhc190YWJbXSA9IHsKKwl7ImJhY2tncm91bmQiLCAiYmciLCBNTlRfTk9BUkd9LAorCXsiZm9yZWdyb3VuZCIsICJmZyIsIE1OVF9OT0FSR30sCisJeyJzbG9wcHkiLCAic2xvcHB5IiwgTU5UX05PQVJHfSwKK307CitpbnQgbW50X2FsaWFzX3N6ID0gKHNpemVvZihtbnRfYWxpYXNfdGFiKS9zaXplb2YobW50X2FsaWFzX3RhYlswXSkpOworCisvKgorICogU2VlIGlmIHRoZSBvcHRpb24gaXMgYW4gYWxpYXMsIGlmIHNvIHJldHVybiB0aGUgCisgKiByZWFsIG1vdW50IG9wdGlvbiBhbG9uZyB3aXRoIHRoZSBhcmd1bWVudCB0eXBlLgorICovCitpbmxpbmUgc3RhdGljIAorY2hhciAqbW91bnRvcHRzX2FsaWFzKGNoYXIgKm9wdCwgaW50ICphcmd0eXBlKQoreworCWludCBpOworCisJKmFyZ3R5cGUgPSBNTlRfVU5TRVQ7CisJZm9yIChpPTA7IGkgPCBtbnRfYWxpYXNfc3o7IGkrKykgeworCQlpZiAoc3RyY2FzZWNtcChvcHQsIG1udF9hbGlhc190YWJbaV0uYWxpYXMpICE9IDApCisJCQljb250aW51ZTsKKwkJKmFyZ3R5cGUgPSBtbnRfYWxpYXNfdGFiW2ldLmFyZ3R5cGU7CisJCXJldHVybiBtbnRfYWxpYXNfdGFiW2ldLm9wdDsKKwl9CisJLyogTWFrZSBvcHRpb24gbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZSAqLworCXVwcGVyMmxvd2VyKG9wdCk7CisKKwlyZXR1cm4gb3B0OworfQorLyoKKyAqIENvbnZlcnQgbnVtZXJpYyBzdHJpbmdzIHRoYXQgZW5kIHdpdGggJ2snLCAnbScgb3IgJ2cnCisgKiBpbnRvIG51bWVyaWMgc3RyaW5ncyB3aXRoIHRoZSByZWFsIHZhbHVlLiAKKyAqIE1lYW5pbmcgJzhrJyBiZWNvbWVzICc4MDk0Jy4KKyAqLworY2hhciAqbW91bnRvcHRzX2NvbnZlcnQoY2hhciAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGZhY3RvciwgbnVtOworCXN0YXRpYyBjaGFyIGJ1Zls2NF07CisJY2hhciAqY2g7CisKKwljaCA9ICZ2YWx1ZVtzdHJsZW4odmFsdWUpLTFdOworCXN3aXRjaCAodG9sb3dlcigqY2gpKSB7CisJY2FzZSAnayc6CisJCWZhY3RvciA9IEtCWVRFUygxKTsKKwkJYnJlYWs7CisJY2FzZSAnbSc6CisJCWZhY3RvciA9IE1FR0FCWVRFUygxKTsKKwkJYnJlYWs7CisJY2FzZSAnZyc6CisJCWZhY3RvciA9IEdJR0FCWVRFUygxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHZhbHVlOworCX0KKwkqY2ggPSAnXDAnOworCWlmIChzdHJuY21wKHZhbHVlLCAiMHgiLCAyKSA9PSAwKSB7CisJCW51bSA9IHN0cnRvbCh2YWx1ZSwgKGNoYXIgKiopTlVMTCwgMTYpOworCX0gZWxzZSBpZiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAxKSA9PSAwKSB7CisJCW51bSA9IHN0cnRvbCh2YWx1ZSwgKGNoYXIgKiopTlVMTCwgOCk7CisJfSBlbHNlIHsKKwkJbnVtID0gc3RydG9sKHZhbHVlLCAoY2hhciAqKilOVUxMLCAxMCk7CisJfQorCW51bSAqPSBmYWN0b3I7CisJc25wcmludGYoYnVmLCA2NCwgIiVsbGQiLCBudW0pOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RydWN0IGVudHJ5IHsKKwlTTElTVF9FTlRSWShlbnRyeSkgZW50cmllczsKKwljaGFyICpvcHQ7Cit9Oworc3RhdGljIFNMSVNUX0hFQUQoc2hlYWQsIGVudHJ5KSBoZWFkID0gU0xJU1RfSEVBRF9JTklUSUFMSVpFUihoZWFkKTsKK3N0YXRpYyBpbnQgbGlzdF9zaXplOworCisvKgorICogQWRkIG9wdGlvbiB0byB0aGUgbGluayBsaXN0CisgKi8KK2lubGluZSBzdGF0aWMgdm9pZCAKK2FkZF9lbnRyeShjaGFyICpvcHQpCit7CisJc3RydWN0IGVudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW50cnkpKTsKKwlpZiAoZW50cnkgPT0gTlVMTCkgeworCQl4bG9nX3dhcm4oIlVuYWJsZSBjYWxsb2MgbWVtb3J5IGZvciBtb3VudCBjb25maWdzIik7IAorCQlyZXR1cm47CisJfQorCWVudHJ5LT5vcHQgPSBzdHJkdXAob3B0KTsKKwlpZiAoZW50cnktPm9wdCA9PSBOVUxMKSB7CisJCXhsb2dfd2FybigiVW5hYmxlIGNhbGxvYyBtZW1vcnkgZm9yIG1vdW50IG9wdHMiKTsgCisJCWZyZWUoZW50cnkpOworCQlyZXR1cm47CisJfQorCVNMSVNUX0lOU0VSVF9IRUFEKCZoZWFkLCBlbnRyeSwgZW50cmllcyk7Cit9CisvKgorICogU2VlIGlmIHRoZSBnaXZlbiBlbnRyeSBleGlzdHMgaWYgdGhlIGxpbmsgbGlzdCwKKyAqIGlmIHNvIHJldHVybiB0aGF0IGVudHJ5CisgKi8KK2lubGluZSBzdGF0aWMgCitjaGFyICpsb29rdXBfZW50cnkoY2hhciAqb3B0KQoreworCXN0cnVjdCBlbnRyeSAqZW50cnk7CisKKwlTTElTVF9GT1JFQUNIKGVudHJ5LCAmaGVhZCwgZW50cmllcykgeworCQlpZiAoc3RyY2FzZWNtcChlbnRyeS0+b3B0LCBvcHQpID09IDApCisJCQlyZXR1cm4gb3B0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKy8qCisgKiBGcmVlIGFsbCBlbnRyaWVzIG9uIHRoZSBsaW5rIGxpc3QKKyAqLworaW5saW5lIHN0YXRpYyAKK3ZvaWQgZnJlZV9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJd2hpbGUgKCFTTElTVF9FTVBUWSgmaGVhZCkpIHsKKwkJZW50cnkgPSBTTElTVF9GSVJTVCgmaGVhZCk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZoZWFkLCBlbnRyaWVzKTsKKwkJZnJlZShlbnRyeS0+b3B0KTsKKwkJZnJlZShlbnRyeSk7CisJfQorfQorc3RhdGljIGNoYXIgKnZlcnNpb25zW10gPSB7InYyIiwgInYzIiwgInY0IiwgInZlcnMiLCAibmZzdmVycyIsIE5VTEx9OworaW50IGlubGluZSBjaGVja192ZXJzKGNoYXIgKm1vcHQsIGNoYXIgKmZpZWxkKQoreworCWludCBpLCBmb3VuZD0wOworCisJLyoKKwkgKiBGaXJzdCBjaGVjayB0byBzZWUgaWYgdGhlIGNvbmZpZyBzZXR0aW5nIGlzIG9uZSAKKwkgKiBvZiB0aGUgbWFueSB2ZXJzaW9uIHNldHRpbmdzCisJICovCisJZm9yIChpPTA7IHZlcnNpb25zW2ldOyBpKyspIHsgCisJCWlmIChzdHJjYXNlc3RyKGZpZWxkLCB2ZXJzaW9uc1tpXSkgIT0gTlVMTCkgeworCQkJZm91bmQrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghZm91bmQpCisJCXJldHVybiAwOworCS8qCisJICogSXQgYXBwZWFycyB0aGUgdmVyc2lvbiBpcyBiZWluZyBzZXQsIG5vdyBzZWUKKwkgKiBpZiB0aGUgdmVyc2lvbiBhcHBlYXJzIG9uIHRoZSBjb21tYW5kIAorCSAqLworCWZvciAoaT0wOyB2ZXJzaW9uc1tpXTsgaSsrKSAgeworCQlpZiAoc3RyY2FzZXN0cihtb3B0LCB2ZXJzaW9uc1tpXSkgIT0gTlVMTCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIGNvbmZpZ19kZWZhdWx0X3ZlcnM7Cit1bnNpZ25lZCBsb25nIGNvbmZpZ19kZWZhdWx0X3Byb3RvOworZXh0ZXJuIHNhX2ZhbWlseV90IGNvbmZpZ19kZWZhdWx0X2ZhbWlseTsKKworLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIGRlZmF1bHQgdmFsdWUgaXMgYmVpbmcgc2V0LgorICogSWYgc28sIHNldCB0aGUgYXBwcm9wcmlhdGUgZ2xvYmFsIHZhbHVlIHdoaWNoIHdpbGwgCisgKiBiZSB1c2VkIGFzIHRoZSBpbml0aWFsIHZhbHVlIGluIHRoZSBzZXJ2ZXIgbmVnYXRpb24uCisgKi8KK2ludCBpbmxpbmUgZGVmYXVsdF92YWx1ZShjaGFyICptb3B0KQoreworCXN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zID0gTlVMTDsKKwlpbnQgZGZ0bGVuID0gc3RybGVuKCJkZWZhdWx0Iik7CisJY2hhciAqZmllbGQ7CisKKwlpZiAoc3RybmNhc2VjbXAobW9wdCwgImRlZmF1bHQiLCBkZnRsZW4pICE9IDApCisJCXJldHVybiAwOworCisJZmllbGQgPSBtb3B0ICsgZGZ0bGVuOworCWlmIChzdHJuY2FzZWNtcChmaWVsZCwgInByb3RvIiwgc3RybGVuKCJwcm90byIpKSA9PSAwKSB7CisJCWlmICgob3B0aW9ucyA9IHBvX3NwbGl0KGZpZWxkKSkgIT0gTlVMTCkgeworCQkJaWYgKCFuZnNfbmZzX3Byb3RvY29sKG9wdGlvbnMsICZjb25maWdfZGVmYXVsdF9wcm90bykpIHsKKwkJCQl4bG9nX3dhcm4oIlVuYWJsZSB0byBzZXQgZGVmYXVsdCBwcm90b2NvbCA6ICVzIiwgCisJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlpZiAoIW5mc19uZnNfcHJvdG9fZmFtaWx5KG9wdGlvbnMsICZjb25maWdfZGVmYXVsdF9mYW1pbHkpKSB7CisJCQkJeGxvZ193YXJuKCJVbmFibGUgdG8gc2V0IGRlZmF1bHQgZmFtaWx5IDogJXMiLCAKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXhsb2dfd2FybigiVW5hYmxlIHRvIGFsbG9jIG1lbW9yeSBmb3IgZGVmYXVsdCBwcm90b2NvbCIpOworCQl9CisJfSBlbHNlIGlmIChzdHJuY2FzZWNtcChmaWVsZCwgInZlcnMiLCBzdHJsZW4oInZlcnMiKSkgPT0gMCkgeworCQlpZiAoKG9wdGlvbnMgPSBwb19zcGxpdChmaWVsZCkpICE9IE5VTEwpIHsKKwkJCWlmICghbmZzX25mc192ZXJzaW9uKG9wdGlvbnMsICZjb25maWdfZGVmYXVsdF92ZXJzKSkgeworCQkJCXhsb2dfd2FybigiVW5hYmxlIHRvIHNldCBkZWZhdWx0IHZlcnNpb246ICVzIiwgCisJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQkJCisJCQl9CisJCX0gZWxzZSB7CisJCQl4bG9nX3dhcm4oIlVuYWJsZSB0byBhbGxvYyBtZW1vcnkgZm9yIGRlZmF1bHQgdmVyc2lvbiIpOworCQl9CisJfSBlbHNlIAorCQl4bG9nX3dhcm4oIkludmFsaWQgZGVmYXVsdCBzZXR0aW5nOiAnJXMnIiwgbW9wdCk7CisKKwlpZiAob3B0aW9ucykKKwkJcG9fZGVzdHJveShvcHRpb25zKTsKKworCXJldHVybiAxOworfQorLyoKKyAqIFBhcnNlIHRoZSBnaXZlbiBzZWN0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIAorICogZmlsZSB0byBpZiB0aGVyZSBhcmUgYW55IG1vdW50IG9wdGlvbnMgc2V0LgorICogSWYgc28sIGFkZGVkIHRoZW0gdG8gbGluayBsaXN0LgorICovCitzdGF0aWMgdm9pZCAKK2NvbmZfcGFyc2VfbW50b3B0cyhjaGFyICpzZWN0aW9uLCBjaGFyICphcmcsIGNoYXIgKm9wdHMpCit7CisJc3RydWN0IGNvbmZfbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgY29uZl9saXN0X25vZGUgKm5vZGU7CisJY2hhciBidWZbQlVGU0laXSwgKnZhbHVlLCAqZmllbGQ7CisJY2hhciAqbnZhbHVlLCAqcHRyOworCWludCBhcmd0eXBlOworCisJbGlzdCA9IGNvbmZfZ2V0X3RhZ19saXN0KHNlY3Rpb24pOworCVRBSUxRX0ZPUkVBQ0gobm9kZSwgJmxpc3QtPmZpZWxkcywgbGluaykgeworCQkvKgorCQkgKiBEbyBub3Qgb3ZlcndyaXRlIG9wdGlvbnMgaWYgYWxyZWFkeSBleGlzdHMgCisJCSAqLworCQlzbnByaW50ZihidWYsIEJVRlNJWiwgIiVzPSIsIG5vZGUtPmZpZWxkKTsKKwkJaWYgKG9wdHMgJiYgc3RyY2FzZXN0cihvcHRzLCBidWYpICE9IE5VTEwpCisJCQljb250aW51ZTsKKwkJLyogCisJCSAqIFByb3RvY29sIHZlcmlvbnMgY2FuIGJlIHNldCBpbiBhIG51bWJlciBvZiB3YXlzCisJCSAqLworCQlpZiAob3B0cyAmJiBjaGVja192ZXJzKG9wdHMsIG5vZGUtPmZpZWxkKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsb29rdXBfZW50cnkobm9kZS0+ZmllbGQpICE9IE5VTEwpCisJCQljb250aW51ZTsKKwkJYnVmWzBdID0gJ1wwJzsKKwkJdmFsdWUgPSBjb25mX2dldF9zZWN0aW9uKHNlY3Rpb24sIGFyZywgbm9kZS0+ZmllbGQpOworCQlpZiAodmFsdWUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlmaWVsZCA9IG1vdW50b3B0c19hbGlhcyhub2RlLT5maWVsZCwgJmFyZ3R5cGUpOworCQlpZiAoc3RyY2FzZWNtcCh2YWx1ZSwgImZhbHNlIikgPT0gMCkgeworCQkJaWYgKGFyZ3R5cGUgIT0gTU5UX05PQVJHKQorCQkJCXNucHJpbnRmKGJ1ZiwgQlVGU0laLCAibm8lcyIsIGZpZWxkKTsKKwkJfSBlbHNlIGlmIChzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpID09IDApIHsKKwkJCXNucHJpbnRmKGJ1ZiwgQlVGU0laLCAiJXMiLCBmaWVsZCk7CisJCX0gZWxzZSB7CisJCQludmFsdWUgPSBzdHJkdXAodmFsdWUpOworCQkJcHRyID0gbW91bnRvcHRzX2NvbnZlcnQobnZhbHVlKTsKKwkJCXNucHJpbnRmKGJ1ZiwgQlVGU0laLCAiJXM9JXMiLCBmaWVsZCwgcHRyKTsKKwkJCWZyZWUobnZhbHVlKTsKKwkJfQorCQlpZiAoYnVmWzBdID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJLyogCisJCSAqIEtlZXAgYSBydW5uaW5nIHRhbGx5IG9mIHRoZSBsaXN0IHNpemUgYWRkaW5nIAorCQkgKiBvbmUgZm9yIHRoZSAnLCcgdGhhdCB3aWxsIGJlIGFwcGVuZWQgbGF0ZXIKKwkJICovCisJCWxpc3Rfc2l6ZSArPSBzdHJsZW4oYnVmKSArIDE7CisJCWFkZF9lbnRyeShidWYpOworCX0KKwljb25mX2ZyZWVfbGlzdChsaXN0KTsKK30KKworLyoKKyAqIENvbmNhdGVuYXRlIG9wdGlvbnMgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggdGhlIAorICogZ2l2ZW4gb3B0aW9ucyBieSBidWlsZGluZyBhIGxpbmsgbGlzdCBvZiBvcHRpb25zIGZyb20gdGhlCisgKiBkaWZmZXJlbnQgc2VjdGlvbnMgaW4gdGhlIGNvbmYgZmlsZS4gT3B0aW9ucyB0aGF0IGV4aXN0cyAKKyAqIGluIHRoZSBlaXRoZXIgdGhlIGdpdmVuIG9wdGlvbnMgb3IgbGluayBsaXN0IGFyZSBub3QgCisgKiBvdmVyd3JpdHRlbiBzbyBpdCBtYXR0ZXIgd2hpY2ggd2hlbiBlYWNoIHNlY3Rpb24gaXMKKyAqIHBhcnNlZC4gCisgKi8KK2NoYXIgKmNvbmZfZ2V0X21udG9wdHMoY2hhciAqc3BlYywgY2hhciAqbW91bnRfcG9pbnQsIAorCWNoYXIgKm1vdW50X29wdHMpCit7CisJc3RydWN0IGVudHJ5ICplbnRyeTsKKwljaGFyICpwdHIsICpzZXJ2ZXIsICpjb25maWdfb3B0czsKKwlpbnQgb3B0bGVuID0gMDsKKworCVNMSVNUX0lOSVQoJmhlYWQpOworCWxpc3Rfc2l6ZSA9IDA7CisJLyoKKwkgKiBGaXJzdCBzZWUgaWYgdGhlcmUgYXJlIGFueSBtb3VudCBvcHRpb25zIHJlbGF0aXZlIAorCSAqIHRvIHRoZSBtb3VudCBwb2ludC4KKwkgKi8KKwljb25mX3BhcnNlX21udG9wdHMoTkZTTU9VTlRfTU9VTlRQT0lOVCwgbW91bnRfcG9pbnQsIG1vdW50X29wdHMpOworCisJLyogCisJICogTmV4dCwgc2VlIGlmIHRoZXJlIGFyZSBhbnkgbW91bnQgb3B0aW9ucyByZWxhdGl2ZQorCSAqIHRvIHRoZSBzZXJ2ZXIKKwkgKi8KKwlzZXJ2ZXIgPSBzdHJkdXAoc3BlYyk7CisJaWYgKHNlcnZlciA9PSBOVUxMKSB7CisJCXhsb2dfd2FybigiY29uZl9nZXRfbW91bnRvcHM6IFVuYWJsZSBjYWxsb2MgbWVtb3J5IGZvciBzZXJ2ZXIiKTsgCisJCWZyZWVfYWxsKCk7CisJCXJldHVybiBtb3VudF9vcHRzOworCX0KKwlpZiAoKHB0ciA9IHN0cmNocihzZXJ2ZXIsICc6JykpICE9IE5VTEwpCisJCSpwdHI9J1wwJzsKKwljb25mX3BhcnNlX21udG9wdHMoTkZTTU9VTlRfU0VSVkVSLCBzZXJ2ZXIsIG1vdW50X29wdHMpOworCWZyZWUoc2VydmVyKTsKKworCS8qCisJICogRmluYWxseSBwcm9jZXNzIGFsbCB0aGUgZ2xvYmFsIG1vdW50IG9wdGlvbnMuIAorCSAqLworCWNvbmZfcGFyc2VfbW50b3B0cyhORlNNT1VOVF9HTE9CQUxfT1BUUywgTlVMTCwgbW91bnRfb3B0cyk7CisKKwkvKgorCSAqIElmIG5vIG1vdW50IG9wdGlvbnMgd2VyZSBmb3VuZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisJICoganVzdCByZXR1cm4gd2hhdCB3YXMgcGFzc2VkIGluIC4KKwkgKi8KKwlpZiAoU0xJU1RfRU1QVFkoJmhlYWQpKQorCQlyZXR1cm4gbW91bnRfb3B0czsKKworCS8qCisJICogRm91bmQgb3B0aW9ucyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiBTbworCSAqIGNvbmNhdGVuYXRlIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2l0aCB0aGUgCisJICogb3B0aW9ucyB0aGF0IHdlcmUgcGFzc2VkIGluCisJICovCisJaWYgKG1vdW50X29wdHMpCisJCW9wdGxlbiA9IHN0cmxlbihtb3VudF9vcHRzKTsKKworCS8qIGxpc3Rfc2l6ZSArIG9wdGxlbiArICcsJyArICdcMCcgKi8KKwljb25maWdfb3B0cyA9IGNhbGxvYygxLCAobGlzdF9zaXplK29wdGxlbisyKSk7CisJaWYgKHNlcnZlciA9PSBOVUxMKSB7CisJCXhsb2dfd2FybigiY29uZl9nZXRfbW91bnRvcHM6IFVuYWJsZSBjYWxsb2MgbWVtb3J5IGZvciBjb25maWdfb3B0cyIpOyAKKwkJZnJlZV9hbGwoKTsKKwkJcmV0dXJuIG1vdW50X29wdHM7CisJfQorCisJaWYgKG1vdW50X29wdHMpIHsKKwkJc3RyY3B5KGNvbmZpZ19vcHRzLCBtb3VudF9vcHRzKTsKKwkJc3RyY2F0KGNvbmZpZ19vcHRzLCAiLCIpOworCX0KKwlTTElTVF9GT1JFQUNIKGVudHJ5LCAmaGVhZCwgZW50cmllcykgeworCQlpZiAoZGVmYXVsdF92YWx1ZShlbnRyeS0+b3B0KSkKKwkJCWNvbnRpbnVlOworCQlzdHJjYXQoY29uZmlnX29wdHMsIGVudHJ5LT5vcHQpOworCQlzdHJjYXQoY29uZmlnX29wdHMsICIsIik7CisJfQorCWlmICgocHRyID0gc3RycmNocihjb25maWdfb3B0cywgJywnKSkgIT0gTlVMTCkKKwkJKnB0ciA9ICdcMCc7CisKKwlmcmVlX2FsbCgpOworCWlmIChtb3VudF9vcHRzKQorCQlmcmVlKG1vdW50X29wdHMpOworCisJcmV0dXJuIGNvbmZpZ19vcHRzOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2Vycm9yLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjY0YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2Vycm9yLmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBlcnJvci5jIC0tIENvbW1vbiBlcnJvciBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBDaHVjayBMZXZlciA8Y2h1Y2subGV2ZXJAb3JhY2xlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKgorICogVG8gRG86CisgKiAgKyBQcm9wZXIgc3VwcG9ydCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisKKyNpbmNsdWRlICJ4Y29tbW9uLmgiCisjaW5jbHVkZSAibmxzLmgiCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorCisjaWZkZWYgSEFWRV9SUENTVkNfTkZTX1BST1RfSAorI2luY2x1ZGUgPHJwY3N2Yy9uZnNfcHJvdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNkZWZpbmUgbmZzc3RhdCBuZnNfc3RhdAorI2VuZGlmCisKK2V4dGVybiBjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIGNoYXIgZXJyYnVmW0JVRlNJWl07CitzdGF0aWMgY2hhciAqZXJyZW9iID0gJmVycmJ1ZltCVUZTSVpdOworCisvKiBDb252ZXJ0IFJQQyBlcnJvcnMgaW50byBzdHJpbmdzICovCitzdGF0aWMgaW50IHJwY19zdHJlcnJvcihpbnQgc3BvcykKK3sKKwlpbnQgY2Zfc3RhdCA9IHJwY19jcmVhdGVlcnIuY2Zfc3RhdDsKKwlpbnQgcG9zID0gMCwgY2ZfZXJybm8gPSBycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vOworCWNoYXIgKnB0ciwgKmVzdHIgPSBjbG50X3NwZXJybm8oY2Zfc3RhdCk7CisJY2hhciAqdG1wOworCisJaWYgKGVzdHIpIHsKKwkJaWYgKChwdHIgPSBpbmRleChlc3RyLCAnOicpKSkKKwkJCWVzdHIgPSArK3B0cjsKKworCQl0bXAgPSAmZXJyYnVmW3Nwb3NdOworCQlpZiAoY2Zfc3RhdCA9PSBSUENfU1lTVEVNRVJST1IpCisJCQlwb3MgPSBzbnByaW50Zih0bXAsIChlcnJlb2IgLSB0bXApLAorCQkJCQlfKCJTeXN0ZW0gRXJyb3I6ICVzIiksCisJCQkJCQlzdHJlcnJvcihjZl9lcnJubykpOworCQllbHNlIHsKKwkJCWlmIChjZl9lcnJubykgCisJCQkJcG9zID0gc25wcmludGYodG1wLCAoZXJyZW9iIC0gdG1wKSwKKwkJCQkJXygiUlBDIEVycm9yOiVzOyBlcnJubyA9ICVzIiksIAorCQkJCQllc3RyLCBzdHJlcnJvcihjZl9lcnJubykpOworCQkJZWxzZQorCQkJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJCQlfKCJSUEMgRXJyb3I6JXMiKSwgZXN0cik7CisJCX0KKwl9CisJcmV0dXJuIHBvczsKK30KKworLyoqCisgKiBycGNfbW91bnRfZXJyb3JzIC0gbG9nIGFuIFJQQyBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyBhIHVzZXItc3BhY2UgbW91bnQKKyAqIEBzZXJ2ZXI6IEMgc3RyaW5nIGNvbnRhaW5pbmcgbmFtZSBvZiBzZXJ2ZXIgd2UgYXJlIGF0dGVtcHRpbmcgdG8gbW91bnQKKyAqIEB3aWxsX3JldHJ5OiBvbmUgaW5kaWNhdGVzIG1vdW50IHdpbGwgcmV0cnkgYXQgc29tZSBsYXRlciBwb2ludAorICogQGJnOiBvbmUgaW5kaWNhdGVzIHRoaXMgaXMgYSBiYWNrZ3JvdW5kIG1vdW50CisgKgorICogRXh0cmFjdHMgdGhlIGVycm9yIGNvZGUgZnJvbSB0aGUgdXNlci1zcGFjZSBSUEMgbGlicmFyeSwgYW5kIHJlcG9ydHMgaXQKKyAqIG9uIHN0ZGVyciAoZmcgbW91bnQpIG9yIGluIHRoZSBzeXN0ZW0gbG9nIChiZyBtb3VudCkuCisgKi8KK3ZvaWQgcnBjX21vdW50X2Vycm9ycyhjaGFyICpzZXJ2ZXIsIGludCB3aWxsX3JldHJ5LCBpbnQgYmcpCit7CisJaW50IHBvcyA9IDA7CisJY2hhciAqdG1wOworCXN0YXRpYyBpbnQgb25seW9uY2UgPSAwOworCisJdG1wID0gJmVycmJ1Zltwb3NdOworCWlmIChiZykKKwkJcG9zID0gc25wcmludGYodG1wLCAoZXJyZW9iIC0gdG1wKSwKKwkJCQlfKCJtb3VudCB0byBORlMgc2VydmVyICclcycgZmFpbGVkOiAiKSwKKwkJCQkJc2VydmVyKTsKKwllbHNlCisJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJXygiJXM6IG1vdW50IHRvIE5GUyBzZXJ2ZXIgJyVzJyBmYWlsZWQ6ICIpLAorCQkJCQlwcm9nbmFtZSwgc2VydmVyKTsKKworCXRtcCA9ICZlcnJidWZbcG9zXTsKKwlpZiAocnBjX2NyZWF0ZWVyci5jZl9zdGF0ID09IFJQQ19USU1FRE9VVCkgeworCQlpZiAod2lsbF9yZXRyeSkKKwkJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJCV8oInRpbWVkIG91dCwgcmV0cnlpbmciKSk7CisJCWVsc2UKKwkJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJCV8oInRpbWVkIG91dCwgZ2l2aW5nIHVwIikpOworCX0gZWxzZSB7CisJCXBvcyArPSBycGNfc3RyZXJyb3IocG9zKTsKKwkJdG1wID0gJmVycmJ1Zltwb3NdOworCQlpZiAoYmcpIHsKKwkJCWlmICh3aWxsX3JldHJ5KQorCQkJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJCQlfKCIsIHJldHJ5aW5nIikpOworCQkJZWxzZQorCQkJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJCQlfKCIsIGdpdmluZyB1cCIpKTsKKwkJfQorCX0KKworCWlmIChiZykgeworCQlpZiAob25seW9uY2UrKyA8IDEpCisJCQlvcGVubG9nKCJtb3VudCIsIExPR19DT05TfExPR19QSUQsIExPR19BVVRIKTsKKwkJc3lzbG9nKExPR19FUlIsICIlcyIsIGVycmJ1Zik7CisJfSBlbHNlCisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGVycmJ1Zik7Cit9CisKKy8qKgorICogc3lzX21vdW50X2Vycm9ycyAtIGxvZyBhbiBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyBhIG1vdW50IHN5c3RlbSBjYWxsCisgKiBAc2VydmVyOiBDIHN0cmluZyBjb250YWluaW5nIG5hbWUgb2Ygc2VydmVyIHdlIGFyZSBhdHRlbXB0aW5nIHRvIG1vdW50CisgKiBAZXJyb3I6IGVycm5vIHZhbHVlIHRvIHJlcG9ydAorICogQHdpbGxfcmV0cnk6IG9uZSBpbmRpY2F0ZXMgbW91bnQgd2lsbCByZXRyeSBhdCBzb21lIGxhdGVyIHBvaW50CisgKiBAYmc6IG9uZSBpbmRpY2F0ZXMgdGhpcyBpcyBhIGJhY2tncm91bmQgbW91bnQKKyAqCisgKiBQYXNzZWQgYW4gZXJybm8gdmFsdWUgZ2VuZXJhdGVkIGJ5IGEgbW91bnQgc3lzdGVtIGNhbGwsIGFuZCByZXBvcnRzIGl0CisgKiBvbiBzdGRlcnIgKGZnIG1vdW50KSBvciBpbiB0aGUgc3lzdGVtIGxvZyAoYmcgbW91bnQpLgorICovCit2b2lkIHN5c19tb3VudF9lcnJvcnMoY2hhciAqc2VydmVyLCBpbnQgZXJyb3IsIGludCB3aWxsX3JldHJ5LCBpbnQgYmcpCit7CisJaW50IHBvcyA9IDA7CisJY2hhciAqdG1wOworCXN0YXRpYyBpbnQgb25seW9uY2UgPSAwOworCisJdG1wID0gJmVycmJ1Zltwb3NdOworCWlmIChiZykKKwkJcG9zID0gc25wcmludGYodG1wLCAoZXJyZW9iIC0gdG1wKSwKKwkJCQlfKCJtb3VudCB0byBORlMgc2VydmVyICclcycgZmFpbGVkOiAiKSwKKwkJCQkJc2VydmVyKTsKKwllbHNlCisJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJXygiJXM6IG1vdW50IHRvIE5GUyBzZXJ2ZXIgJyVzJyBmYWlsZWQ6ICIpLAorCQkJCQlwcm9nbmFtZSwgc2VydmVyKTsKKworCXRtcCA9ICZlcnJidWZbcG9zXTsKKwlpZiAoZXJyb3IgPT0gRVRJTUVET1VUKSB7CisJCWlmICh3aWxsX3JldHJ5KQorCQkJcG9zID0gc25wcmludGYodG1wLCAoZXJyZW9iIC0gdG1wKSwKKwkJCQkJXygidGltZWQgb3V0LCByZXRyeWluZyIpKTsKKwkJZWxzZQorCQkJcG9zID0gc25wcmludGYodG1wLCAoZXJyZW9iIC0gdG1wKSwKKwkJCQkJXygidGltZWQgb3V0LCBnaXZpbmcgdXAiKSk7CisJfSBlbHNlIHsKKwkJaWYgKGJnKSB7CisJCQlpZiAod2lsbF9yZXRyeSkKKwkJCQlwb3MgPSBzbnByaW50Zih0bXAsIChlcnJlb2IgLSB0bXApLAorCQkJCQkJXygiJXMsIHJldHJ5aW5nIiksCisJCQkJCQlzdHJlcnJvcihlcnJvcikpOworCQkJZWxzZQorCQkJCXBvcyA9IHNucHJpbnRmKHRtcCwgKGVycmVvYiAtIHRtcCksCisJCQkJCQlfKCIlcywgZ2l2aW5nIHVwIiksCisJCQkJCQlzdHJlcnJvcihlcnJvcikpOworCQl9CisJfQorCisJaWYgKGJnKSB7CisJCWlmIChvbmx5b25jZSsrIDwgMSkKKwkJCW9wZW5sb2coIm1vdW50IiwgTE9HX0NPTlN8TE9HX1BJRCwgTE9HX0FVVEgpOworCQlzeXNsb2coTE9HX0VSUiwgIiVzIiwgZXJyYnVmKTsKKwl9IGVsc2UKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZXJyYnVmKTsKK30KKworLyoqCisgKiBtb3VudF9lcnJvciAtIHJlcG9ydCBhIGZvcmVncm91bmQgbW91bnQgZXJyb3IKKyAqIEBzcGVjOiBDIHN0cmluZyBjb250YWluaW5nIHRoZSBkZXZpY2UgbmFtZSBiZWluZyBtb3VudGVkCisgKiBAbW91bnRfcG9pbnQ6IEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGhuYW1lIG9mIHRoZSBsb2NhbCBtb3VudGVkIG9uIGRpcgorICogQGVycm9yOiBlcnJubyB2YWx1ZSB0byByZXBvcnQKKyAqCisgKi8KK3ZvaWQgbW91bnRfZXJyb3IoY29uc3QgY2hhciAqc3BlYywgY29uc3QgY2hhciAqbW91bnRfcG9pbnQsIGludCBlcnJvcikKK3sKKwlzd2l0Y2goZXJyb3IpIHsKKwljYXNlIEVBQ0NFUzoKKwkJbmZzX2Vycm9yKF8oIiVzOiBhY2Nlc3MgZGVuaWVkIGJ5IHNlcnZlciB3aGlsZSBtb3VudGluZyAlcyIpLAorCQkJCXByb2duYW1lLCBzcGVjKTsKKwkJYnJlYWs7CisJY2FzZSBFSU5WQUw6CisJCW5mc19lcnJvcihfKCIlczogYW4gaW5jb3JyZWN0IG1vdW50IG9wdGlvbiB3YXMgc3BlY2lmaWVkIiksIHByb2duYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFT1BOT1RTVVBQOgorCQluZnNfZXJyb3IoXygiJXM6IHJlcXVlc3RlZCBORlMgdmVyc2lvbiBvciB0cmFuc3BvcnQiCisJCQkJIiBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkIiksCisJCQkJcHJvZ25hbWUpOworCQlicmVhazsKKwljYXNlIEVOT1RESVI6CisJCW5mc19lcnJvcihfKCIlczogbW91bnQgcG9pbnQgJXMgaXMgbm90IGEgZGlyZWN0b3J5IiksCisJCQkJcHJvZ25hbWUsIG1vdW50X3BvaW50KTsKKwkJYnJlYWs7CisJY2FzZSBFQlVTWToKKwkJbmZzX2Vycm9yKF8oIiVzOiAlcyBpcyBidXN5IG9yIGFscmVhZHkgbW91bnRlZCIpLAorCQkJcHJvZ25hbWUsIG1vdW50X3BvaW50KTsKKwkJYnJlYWs7CisJY2FzZSBFTk9FTlQ6CisJCWlmIChzcGVjKQorCQkJbmZzX2Vycm9yKF8oIiVzOiBtb3VudGluZyAlcyBmYWlsZWQsICIKKwkJCQkicmVhc29uIGdpdmVuIGJ5IHNlcnZlcjpcbiAgJXMiKSwKKwkJCQlwcm9nbmFtZSwgc3BlYywgc3RyZXJyb3IoZXJyb3IpKTsKKwkJZWxzZQorCQkJbmZzX2Vycm9yKF8oIiVzOiBtb3VudCBwb2ludCAlcyBkb2VzIG5vdCBleGlzdCIpLAorCQkJCXByb2duYW1lLCBtb3VudF9wb2ludCk7CisJCWJyZWFrOworCWNhc2UgRVNQSVBFOgorCQlycGNfbW91bnRfZXJyb3JzKChjaGFyICopc3BlYywgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgRUlPOgorCQluZnNfZXJyb3IoXygiJXM6IG1vdW50IHN5c3RlbSBjYWxsIGZhaWxlZCIpLCBwcm9nbmFtZSk7CisJCWJyZWFrOworCWNhc2UgRUZBVUxUOgorCQluZnNfZXJyb3IoXygiJXM6IGVuY291bnRlcmVkIHVuZXhwZWN0ZWQgZXJyb3IgY29uZGl0aW9uLiIpLAorCQkJCXByb2duYW1lKTsKKwkJbmZzX2Vycm9yKF8oIiVzOiBwbGVhc2UgcmVwb3J0IHRoZSBlcnJvciB0byIgUEFDS0FHRV9CVUdSRVBPUlQpLAorCQkJCXByb2duYW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbmZzX2Vycm9yKF8oIiVzOiAlcyIpLAorCQkJcHJvZ25hbWUsIHN0cmVycm9yKGVycm9yKSk7CisJfQorfQorCisvKgorICogdW1vdW50X2Vycm9yIC0gcmVwb3J0IGEgZmFpbGVkIHVtb3VudCByZXF1ZXN0CisgKiBAZXJyOiBlcnJubyB2YWx1ZSB0byByZXBvcnQKKyAqIEBkZXY6IEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGhuYW1lIG9mIHRoZSBsb2NhbCBtb3VudGVkIG9uIGRpcgorICoKKyAqLwordm9pZCB1bW91bnRfZXJyb3IoaW50IGVyciwgY29uc3QgY2hhciAqZGV2KQoreworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBFTlhJTzoKKwkJbmZzX2Vycm9yKF8oIiVzOiAlczogaW52YWxpZCBibG9jayBkZXZpY2UiKSwKKwkJCXByb2duYW1lLCBkZXYpOworCQlicmVhazsKKwljYXNlIEVJTlZBTDoKKwkJbmZzX2Vycm9yKF8oIiVzOiAlczogbm90IG1vdW50ZWQiKSwKKwkJCXByb2duYW1lLCBkZXYpOworCQlicmVhazsKKwljYXNlIEVJTzoKKwkJbmZzX2Vycm9yKF8oIiVzOiAlczogY2FuJ3Qgd3JpdGUgc3VwZXJibG9jayIpLAorCQkJcHJvZ25hbWUsIGRldik7CisJCWJyZWFrOworCWNhc2UgRUJVU1k6CisJCW5mc19lcnJvcihfKCIlczogJXM6IGRldmljZSBpcyBidXN5IiksCisJCQlwcm9nbmFtZSwgZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBFTk9FTlQ6CisJCW5mc19lcnJvcihfKCIlczogJXM6IG5vdCBmb3VuZCIpLAorCQkJcHJvZ25hbWUsIGRldik7CisJCWJyZWFrOworCWNhc2UgRVBFUk06CisJCW5mc19lcnJvcihfKCIlczogJXM6IG11c3QgYmUgc3VwZXJ1c2VyIHRvIHVtb3VudCIpLAorCQkJcHJvZ25hbWUsIGRldik7CisJCWJyZWFrOworCWNhc2UgRUFDQ0VTOgorCQluZnNfZXJyb3IoXygiJXM6ICVzOiBibG9jayBkZXZpY2VzIG5vdCBwZXJtaXR0ZWQgb24gZnMiKSwKKwkJCXByb2duYW1lLCBkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZnNfZXJyb3IoXygiJXM6ICVzOiAlcyIpLAorCQkJcHJvZ25hbWUsIGRldiwgc3RyZXJyb3IoZXJyKSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFdlIG5lZWQgdG8gdHJhbnNsYXRlIGJldHdlZW4gbmZzIHN0YXR1cyByZXR1cm4gdmFsdWVzIGFuZAorICogdGhlIGxvY2FsIGVycm5vIHZhbHVlcyB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lLgorICoKKyAqIEFuZHJlYXMgU2Nod2FiIDxzY2h3YWJATFM1LmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjogY2hhbmdlIGVycm5vOgorICogImFmdGVyICNpbmNsdWRlIDxlcnJuby5oPiB0aGUgc3ltYm9sIGVycm5vIGlzIHJlc2VydmVkIGZvciBhbnkgdXNlLAorICogIGl0IGNhbm5vdCBldmVuIGJlIHVzZWQgYXMgYSBzdHJ1Y3QgdGFnIG9yIGZpZWxkIG5hbWUiLgorICovCisKKyNpZm5kZWYgRURRVU9UCisjZGVmaW5lIEVEUVVPVAlFTk9TUEMKKyNlbmRpZgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkJCShzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkgCisKK3N0YXRpYyBzdHJ1Y3QgeworCWVudW0gbmZzc3RhdCBzdGF0OworCWludCBlcnJudW07Cit9IG5mc19lcnJ0YmxbXSA9IHsKKwl7IE5GU19PSywJCTAJCX0sCisJeyBORlNFUlJfUEVSTSwJCUVQRVJNCQl9LAorCXsgTkZTRVJSX05PRU5ULAkJRU5PRU5UCQl9LAorCXsgTkZTRVJSX0lPLAkJRUlPCQl9LAorCXsgTkZTRVJSX05YSU8sCQlFTlhJTwkJfSwKKwl7IE5GU0VSUl9BQ0NFUywJCUVBQ0NFUwkJfSwKKwl7IE5GU0VSUl9FWElTVCwJCUVFWElTVAkJfSwKKwl7IE5GU0VSUl9OT0RFViwJCUVOT0RFVgkJfSwKKwl7IE5GU0VSUl9OT1RESVIsCUVOT1RESVIJCX0sCisJeyBORlNFUlJfSVNESVIsCQlFSVNESVIJCX0sCisjaWZkZWYgTkZTRVJSX0lOVkFMCisJeyBORlNFUlJfSU5WQUwsCQlFSU5WQUwJCX0sCS8qIHRoYXQgU3VuIGZvcmdvdCAqLworI2VuZGlmCisJeyBORlNFUlJfRkJJRywJCUVGQklHCQl9LAorCXsgTkZTRVJSX05PU1BDLAkJRU5PU1BDCQl9LAorCXsgTkZTRVJSX1JPRlMsCQlFUk9GUwkJfSwKKwl7IE5GU0VSUl9OQU1FVE9PTE9ORywJRU5BTUVUT09MT05HCX0sCisJeyBORlNFUlJfTk9URU1QVFksCUVOT1RFTVBUWQl9LAorCXsgTkZTRVJSX0RRVU9ULAkJRURRVU9UCQl9LAorCXsgTkZTRVJSX1NUQUxFLAkJRVNUQUxFCQl9LAorI2lmZGVmIEVXRkxVU0gKKwl7IE5GU0VSUl9XRkxVU0gsCUVXRkxVU0gJCX0sCisjZW5kaWYKKwkvKiBUaHJvdyBpbiBzb21lIE5GU3YzIHZhbHVlcyBmb3IgZXZlbiBtb3JlIGZ1biAoSFAgcmV0dXJucyB0aGVzZSkgKi8KKwl7IDcxLAkJCUVSRU1PVEUJCX0sCit9OworCitjaGFyICpuZnNfc3RyZXJyb3IodW5zaWduZWQgaW50IHN0YXQpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuZnNfZXJydGJsKTsgaSsrKSB7CisJCWlmIChuZnNfZXJydGJsW2ldLnN0YXQgPT0gc3RhdCkKKwkJCXJldHVybiBzdHJlcnJvcihuZnNfZXJydGJsW2ldLmVycm51bSk7CisJfQorCXNwcmludGYoYnVmLCBfKCJ1bmtub3duIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlOiAldSIpLCBzdGF0KTsKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2Vycm9yLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmIyOGNmCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2Vycm9yLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGVycm9yLmg6ICBDb21tb24gZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQ2h1Y2sgTGV2ZXIgPGNodWNrLmxldmVyQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9ORlNfVVRJTFNfTU9VTlRfRVJST1JfSAorI2RlZmluZSBfTkZTX1VUSUxTX01PVU5UX0VSUk9SX0gKKworY2hhciAqbmZzX3N0cmVycm9yKHVuc2lnbmVkIGludCk7CisKK3ZvaWQgbW91bnRfZXJyb3IoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7Cit2b2lkIHJwY19tb3VudF9lcnJvcnMoY2hhciAqLCBpbnQsIGludCk7Cit2b2lkIHN5c19tb3VudF9lcnJvcnMoY2hhciAqLCBpbnQsIGludCwgaW50KTsKKwordm9pZCB1bW91bnRfZXJyb3IoaW50LCBjb25zdCBjaGFyICopOworCisjZW5kaWYJLyogX05GU19VVElMU19NT1VOVF9FUlJPUl9IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvZnN0YWIuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9mc3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzVkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvZnN0YWIuYwpAQCAtMCwwICsxLDU2NyBAQAorLyogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CisgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKiBTdW4gTWFyIDIxIDE5OTkgLSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqIC0gZml4ZWQgc3RyZXJyKGVycm5vKSBpbiBnZXR0ZXh0IGNhbGxzCisgKgorICogMjAwNi0wNi0wOCBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorICogLSBNb3ZlZCBjb2RlIHRvIG5mcy11dGlscy9zdXBwb3J0L25mcyBmcm9tIHV0aWwtbGludXgvbW91bnQuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisKKyNpbmNsdWRlICJmc3RhYi5oIgorI2luY2x1ZGUgInhjb21tb24uaCIKKyNpbmNsdWRlICJuZnNfbW50ZW50LmgiCisjaW5jbHVkZSAibmZzX3BhdGhzLmgiCisjaW5jbHVkZSAibmxzLmgiCisKKyNkZWZpbmUgTE9DS19USU1FT1VUCTEwCisjZGVmaW5lIHN0cmVxKHMsIHQpCShzdHJjbXAgKChzKSwgKHQpKSA9PSAwKQorI2RlZmluZSBQUk9DX01PVU5UUwkJIi9wcm9jL21vdW50cyIKKworZXh0ZXJuIGNoYXIgKnByb2duYW1lOworZXh0ZXJuIGludCB2ZXJib3NlOworCisvKiBJbmZvcm1hdGlvbiBhYm91dCBtdGFiLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBoYXZlX210YWJfaW5mbyA9IDA7CitzdGF0aWMgaW50IHZhcl9tdGFiX2RvZXNfbm90X2V4aXN0ID0gMDsKK3N0YXRpYyBpbnQgdmFyX210YWJfaXNfYV9zeW1saW5rID0gMDsKKworc3RhdGljIHZvaWQKK2dldF9tdGFiX2luZm8odm9pZCkgeworCXN0cnVjdCBzdGF0IG10YWJfc3RhdDsKKworCWlmICghaGF2ZV9tdGFiX2luZm8pIHsKKwkJaWYgKGxzdGF0KE1PVU5URUQsICZtdGFiX3N0YXQpKQorCQkJdmFyX210YWJfZG9lc19ub3RfZXhpc3QgPSAxOworCQllbHNlIGlmIChTX0lTTE5LKG10YWJfc3RhdC5zdF9tb2RlKSkKKwkJCXZhcl9tdGFiX2lzX2Ffc3ltbGluayA9IDE7CisJCWhhdmVfbXRhYl9pbmZvID0gMTsKKwl9Cit9CisKK3ZvaWQKK3Jlc2V0X210YWJfaW5mbyh2b2lkKSB7CisgICAgICAgIGhhdmVfbXRhYl9pbmZvID0gMDsKK30KKworaW50CittdGFiX2RvZXNfbm90X2V4aXN0KHZvaWQpIHsKKwlnZXRfbXRhYl9pbmZvKCk7CisJcmV0dXJuIHZhcl9tdGFiX2RvZXNfbm90X2V4aXN0OworfQorCitzdGF0aWMgaW50CittdGFiX2lzX2Ffc3ltbGluayh2b2lkKSB7CisgICAgICAgIGdldF9tdGFiX2luZm8oKTsKKyAgICAgICAgcmV0dXJuIHZhcl9tdGFiX2lzX2Ffc3ltbGluazsKK30KKworaW50CittdGFiX2lzX3dyaXRhYmxlKCkgeworCWludCBmZDsKKworCS8qIFNob3VsZCB3ZSB3cml0ZSB0byAvZXRjL210YWIgdXBvbiBhbiB1cGRhdGU/CisJICAgUHJvYmFibHkgbm90IGlmIGl0IGlzIGEgc3ltbGluayB0byAvcHJvYy9tb3VudHMsIHNpbmNlIHRoYXQKKwkgICB3b3VsZCBjcmVhdGUgYSBmaWxlIC9wcm9jL21vdW50cyBpbiBjYXNlIHRoZSBwcm9jIGZpbGVzeXN0ZW0KKwkgICBpcyBub3QgbW91bnRlZC4gKi8KKwlpZiAobXRhYl9pc19hX3N5bWxpbmsoKSkKKwkJcmV0dXJuIDA7CisKKwlmZCA9IG9wZW4oTU9VTlRFRCwgT19SRFdSIHwgT19DUkVBVCwgMDY0NCk7CisJaWYgKGZkID49IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIENvbnRlbnRzIG9mIG10YWIgYW5kIGZzdGFiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBtbnRlbnRjaG4gbW91bnR0YWJsZTsKK3N0YXRpYyBpbnQgZ290X210YWIgPSAwOworc3RydWN0IG1udGVudGNobiBmc3RhYjsKK3N0YXRpYyBpbnQgZ290X2ZzdGFiID0gMDsKKworc3RhdGljIHZvaWQgcmVhZF9tb3VudHRhYmxlKHZvaWQpOworc3RhdGljIHZvaWQgcmVhZF9mc3RhYih2b2lkKTsKKworc3RhdGljIHN0cnVjdCBtbnRlbnRjaG4gKgorbXRhYl9oZWFkKHZvaWQpCit7CisJaWYgKCFnb3RfbXRhYikKKwkJcmVhZF9tb3VudHRhYmxlKCk7CisJcmV0dXJuICZtb3VudHRhYmxlOworfQorCitzdGF0aWMgc3RydWN0IG1udGVudGNobiAqCitmc3RhYl9oZWFkKHZvaWQpCit7CisJaWYgKCFnb3RfZnN0YWIpCisJCXJlYWRfZnN0YWIoKTsKKwlyZXR1cm4gJmZzdGFiOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK215X2ZyZWUoY29uc3Qgdm9pZCAqcykgeworCWlmIChzKQorCQlmcmVlKCh2b2lkICopIHMpOworfQorCitzdGF0aWMgdm9pZAorZGlzY2FyZF9tbnRlbnRjaG4oc3RydWN0IG1udGVudGNobiAqbWMwKSB7CisJc3RydWN0IG1udGVudGNobiAqbWMsICptYzE7CisKKwlmb3IgKG1jID0gbWMwLT5ueHQ7IG1jICYmIG1jICE9IG1jMDsgbWMgPSBtYzEpIHsKKwkJbWMxID0gbWMtPm54dDsKKwkJbXlfZnJlZShtYy0+bS5tbnRfZnNuYW1lKTsKKwkJbXlfZnJlZShtYy0+bS5tbnRfZGlyKTsKKwkJbXlfZnJlZShtYy0+bS5tbnRfdHlwZSk7CisJCW15X2ZyZWUobWMtPm0ubW50X29wdHMpOworCQlmcmVlKG1jKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3JlYWRfbW50ZW50Y2huKG1udEZJTEUgKm1mcCwgY29uc3QgY2hhciAqZm5hbSwgc3RydWN0IG1udGVudGNobiAqbWMwKSB7CisJc3RydWN0IG1udGVudGNobiAqbWMgPSBtYzA7CisJc3RydWN0IG1udGVudCAqbW50OworCisJd2hpbGUgKChtbnQgPSBuZnNfZ2V0bW50ZW50KG1mcCkpICE9IE5VTEwpIHsKKwkJaWYgKCFzdHJlcShtbnQtPm1udF90eXBlLCBNTlRUWVBFX0lHTk9SRSkpIHsKKwkJCW1jLT5ueHQgPSAoc3RydWN0IG1udGVudGNobiAqKSB4bWFsbG9jKHNpemVvZigqbWMpKTsKKwkJCW1jLT5ueHQtPnByZXYgPSBtYzsKKwkJCW1jID0gbWMtPm54dDsKKwkJCW1jLT5tID0gKm1udDsKKwkJCW1jLT5ueHQgPSBtYzA7CisJCX0KKwl9CisJbWMwLT5wcmV2ID0gbWM7CisJaWYgKGZlcnJvcihtZnAtPm1udGVudF9mcCkpIHsKKwkJaW50IGVycnN2ID0gZXJybm87CisJCW5mc19lcnJvcihfKCJ3YXJuaW5nOiBlcnJvciByZWFkaW5nICVzOiAlcyIpLAorCQkgICAgICBmbmFtLCBzdHJlcnJvciAoZXJyc3YpKTsKKwkJbWMwLT5ueHQgPSBtYzAtPnByZXYgPSBOVUxMOworCX0KKwluZnNfZW5kbW50ZW50KG1mcCk7Cit9CisKKy8qCisgKiBSZWFkIC9ldGMvbXRhYi4gIElmIHRoYXQgZmFpbHMsIHRyeSAvcHJvYy9tb3VudHMuCisgKiBUaGlzIHByb2R1Y2VzIGEgbGlua2VkIGxpc3QuIFRoZSBsaXN0IGhlYWQgbW91bnR0YWJsZSBpcyBhIGR1bW15LgorICogUmV0dXJuIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIHZvaWQKK3JlYWRfbW91bnR0YWJsZSgpIHsKKyAgICAgICAgbW50RklMRSAqbWZwOworICAgICAgICBjb25zdCBjaGFyICpmbmFtOworICAgICAgICBzdHJ1Y3QgbW50ZW50Y2huICptYyA9ICZtb3VudHRhYmxlOworCisgICAgICAgIGdvdF9tdGFiID0gMTsKKyAgICAgICAgbWMtPm54dCA9IG1jLT5wcmV2ID0gTlVMTDsKKworICAgICAgICBmbmFtID0gTU9VTlRFRDsKKyAgICAgICAgbWZwID0gbmZzX3NldG1udGVudCAoZm5hbSwgInIiKTsKKyAgICAgICAgaWYgKG1mcCA9PSBOVUxMIHx8IG1mcC0+bW50ZW50X2ZwID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyc3YgPSBlcnJubzsKKyAgICAgICAgICAgICAgICBmbmFtID0gUFJPQ19NT1VOVFM7CisgICAgICAgICAgICAgICAgbWZwID0gbmZzX3NldG1udGVudCAoZm5hbSwgInIiKTsKKyAgICAgICAgICAgICAgICBpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tbnRlbnRfZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmZzX2Vycm9yKF8oIndhcm5pbmc6IGNhbid0IG9wZW4gJXM6ICVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT1VOVEVELCBzdHJlcnJvciAoZXJyc3YpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoXygiJXM6IGNvdWxkIG5vdCBvcGVuICVzOyB1c2luZyAlcyBpbnN0ZWFkXG4iKSwKKwkJCQlwcm9nbmFtZSwgTU9VTlRFRCwgUFJPQ19NT1VOVFMpOworICAgICAgICB9CisgICAgICAgIHJlYWRfbW50ZW50Y2huKG1mcCwgZm5hbSwgbWMpOworfQorCitzdGF0aWMgdm9pZAorcmVhZF9mc3RhYigpCit7CisJbW50RklMRSAqbWZwID0gTlVMTDsKKwljb25zdCBjaGFyICpmbmFtOworCXN0cnVjdCBtbnRlbnRjaG4gKm1jID0gJmZzdGFiOworCisJZ290X2ZzdGFiID0gMTsKKwltYy0+bnh0ID0gbWMtPnByZXYgPSBOVUxMOworCisJZm5hbSA9IF9QQVRIX0ZTVEFCOworCW1mcCA9IG5mc19zZXRtbnRlbnQgKGZuYW0sICJyIik7CisJaWYgKG1mcCA9PSBOVUxMIHx8IG1mcC0+bW50ZW50X2ZwID09IE5VTEwpIHsKKwkJaW50IGVycnN2ID0gZXJybm87CisJCW5mc19lcnJvcihfKCJ3YXJuaW5nOiBjYW4ndCBvcGVuICVzOiAlcyIpLAorCQkJICBfUEFUSF9GU1RBQiwgc3RyZXJyb3IgKGVycnN2KSk7CisJCXJldHVybjsKKwl9CisJcmVhZF9tbnRlbnRjaG4obWZwLCBmbmFtLCBtYyk7Cit9CisKKy8qCisgKiBHaXZlbiB0aGUgZGlyZWN0b3J5IG5hbWUgTkFNRSwgYW5kIHRoZSBwbGFjZSBNQ1BSRVYgd2UgZm91bmQgaXQgbGFzdCB0aW1lLAorICogdHJ5IHRvIGZpbmQgbW9yZSBvY2N1cnJlbmNlcy4KKyAqLyAKK3N0cnVjdCBtbnRlbnRjaG4gKgorZ2V0bW50ZGlyYmFja3dhcmQgKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtbnRlbnRjaG4gKm1jcHJldikgeworCXN0cnVjdCBtbnRlbnRjaG4gKm1jLCAqbWMwOworCisJbWMwID0gbXRhYl9oZWFkKCk7CisJaWYgKCFtY3ByZXYpCisJCW1jcHJldiA9IG1jMDsKKwlmb3IgKG1jID0gbWNwcmV2LT5wcmV2OyBtYyAmJiBtYyAhPSBtYzA7IG1jID0gbWMtPnByZXYpCisJCWlmIChzdHJlcShtYy0+bS5tbnRfZGlyLCBuYW1lKSkKKwkJCXJldHVybiBtYzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBkZXZpY2UgbmFtZSBOQU1FLCBhbmQgdGhlIHBsYWNlIE1DUFJFViB3ZSBmb3VuZCBpdCBsYXN0IHRpbWUsCisgKiB0cnkgdG8gZmluZCBtb3JlIG9jY3VycmVuY2VzLgorICovIAorc3RydWN0IG1udGVudGNobiAqCitnZXRtbnRkZXZiYWNrd2FyZCAoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG1udGVudGNobiAqbWNwcmV2KSB7CisJc3RydWN0IG1udGVudGNobiAqbWMsICptYzA7CisKKwltYzAgPSBtdGFiX2hlYWQoKTsKKwlpZiAoIW1jcHJldikKKwkJbWNwcmV2ID0gbWMwOworCWZvciAobWMgPSBtY3ByZXYtPnByZXY7IG1jICYmIG1jICE9IG1jMDsgbWMgPSBtYy0+cHJldikKKwkJaWYgKHN0cmVxKG1jLT5tLm1udF9mc25hbWUsIG5hbWUpKQorCQkJcmV0dXJuIG1jOworCXJldHVybiBOVUxMOworfQorCisvKiBGaW5kIHRoZSBkaXIgRklMRSBpbiBmc3RhYi4gICovCitzdHJ1Y3QgbW50ZW50Y2huICoKK2dldGZzZmlsZSAoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgbW50ZW50Y2huICptYywgKm1jMDsKKworCW1jMCA9IGZzdGFiX2hlYWQoKTsKKwlmb3IgKG1jID0gbWMwLT5ueHQ7IG1jICYmIG1jICE9IG1jMDsgbWMgPSBtYy0+bnh0KQorCQlpZiAoc3RyZXEobWMtPm0ubW50X2RpciwgZmlsZSkpCisJCQlyZXR1cm4gbWM7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZpbmQgdGhlIGRldmljZSBTUEVDIGluIGZzdGFiLiAgKi8KK3N0cnVjdCBtbnRlbnRjaG4gKgorZ2V0ZnNzcGVjIChjb25zdCBjaGFyICpzcGVjKQoreworCXN0cnVjdCBtbnRlbnRjaG4gKm1jLCAqbWMwOworCisJbWMwID0gZnN0YWJfaGVhZCgpOworCWZvciAobWMgPSBtYzAtPm54dDsgbWMgJiYgbWMgIT0gbWMwOyBtYyA9IG1jLT5ueHQpCisJCWlmIChzdHJlcShtYy0+bS5tbnRfZnNuYW1lLCBzcGVjKSkKKwkJCXJldHVybiBtYzsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVXBkYXRpbmcgbXRhYiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogRmxhZyBmb3IgYWxyZWFkeSBleGlzdGluZyBsb2NrIGZpbGUuICovCitzdGF0aWMgaW50IHdlX2NyZWF0ZWRfbG9ja2ZpbGUgPSAwOworc3RhdGljIGludCBsb2NrZmlsZV9mZCA9IC0xOworCisvKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgc2lnbmFscyBoYXZlIGJlZW4gc2V0IHVwLiAqLworc3RhdGljIGludCBzaWduYWxzX2hhdmVfYmVlbl9zZXR1cCA9IDA7CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBsb2NrIGlzIHJlbGVhc2VkIGlmIHdlIGFyZSBpbnRlcnJ1cHRlZC4gICovCitleHRlcm4gY2hhciAqc3Ryc2lnbmFsKGludCBzaWcpOwkvKiBub3QgYWx3YXlzIGluIDxzdHJpbmcuaD4gKi8KKworc3RhdGljIHZvaWQKK2hhbmRsZXIgKGludCBzaWcpIHsKKyAgICAgZGllKEVYX1VTRVIsICIlcyIsIHN0cnNpZ25hbChzaWcpKTsKK30KKworc3RhdGljIHZvaWQKK3NldGxrd190aW1lb3V0IChfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBpbnQgc2lnKSB7CisgICAgIC8qIG5vdGhpbmcsIGZjbnRsIHdpbGwgZmFpbCBhbnl3YXkgKi8KK30KKworLyogUmVtb3ZlIGxvY2sgZmlsZS4gICovCit2b2lkCit1bmxvY2tfbXRhYiAodm9pZCkgeworCWlmICh3ZV9jcmVhdGVkX2xvY2tmaWxlKSB7CisJCWNsb3NlKGxvY2tmaWxlX2ZkKTsKKwkJbG9ja2ZpbGVfZmQgPSAtMTsKKwkJdW5saW5rIChNT1VOVEVEX0xPQ0spOworCQl3ZV9jcmVhdGVkX2xvY2tmaWxlID0gMDsKKwl9Cit9CisKKy8qIENyZWF0ZSB0aGUgbG9jayBmaWxlLgorICAgVGhlIGxvY2sgZmlsZSB3aWxsIGJlIHJlbW92ZWQgaWYgd2UgY2F0Y2ggYSBzaWduYWwgb3Igd2hlbiB3ZSBleGl0LiAqLworLyogVGhlIG9sZCBjb2RlIGhlcmUgdXNlZCBmbG9jayBvbiBhIGxvY2sgZmlsZSAvZXRjL210YWJ+IGFuZCBkZWxldGVkCisgICB0aGlzIGxvY2sgZmlsZSBhZnRlcndhcmRzLiBIb3dldmVyLCBhcyByZ29vY2ggcmVtYXJrcywgdGhhdCBoYXMgYQorICAgcmFjZTogYSBzZWNvbmQgbW91bnQgbWF5IGJlIHdhaXRpbmcgb24gdGhlIGxvY2sgYW5kIHByb2NlZWQgYXMKKyAgIHNvb24gYXMgdGhlIGxvY2sgZmlsZSBpcyBkZWxldGVkIGJ5IHRoZSBmaXJzdCBtb3VudCwgYW5kIGltbWVkaWF0ZWx5CisgICBhZnRlcndhcmRzIGEgdGhpcmQgbW91bnQgY29tZXMsIGNyZWF0ZXMgYSBuZXcgL2V0Yy9tdGFifiwgYXBwbGllcworICAgZmxvY2sgdG8gdGhhdCwgYW5kIGFsc28gcHJvY2VlZHMsIHNvIHRoYXQgdGhlIHNlY29uZCBhbmQgdGhpcmQgbW91bnQKKyAgIG5vdyBib3RoIGFyZSBzY3JpYmJsaW5nIGluIC9ldGMvbXRhYi4KKyAgIFRoZSBuZXcgY29kZSB1c2VzIGEgbGluaygpIGluc3RlYWQgb2YgYSBjcmVhdCgpLCB3aGVyZSB3ZSBwcm9jZWVkCisgICBvbmx5IGlmIGl0IHdhcyB1cyB0aGF0IGNyZWF0ZWQgdGhlIGxvY2ssIGFuZCBoZW5jZSB3ZSBhbHdheXMgaGF2ZQorICAgdG8gZGVsZXRlIHRoZSBsb2NrIGFmdGVyd2FyZHMuIE5vdyB0aGUgdXNlIG9mIGZsb2NrKCkgaXMgaW4gcHJpbmNpcGxlCisgICBzdXBlcmZsdW91cywgYnV0IGF2b2lkcyBhbiBhcmJpdHJhcnkgc2xlZXAoKS4gKi8KKworLyogV2hlcmUgZG9lcyB0aGUgbGluayBwb2ludCB0bz8gT2J2aW91cyBjaG9pY2VzIGFyZSBtdGFiIGFuZCBtdGFifn4uCisgICBISkx1IHBvaW50cyBvdXQgdGhhdCB0aGUgbGF0dGVyIGxlYWRzIHRvIHJhY2VzLiBSaWdodCBub3cgd2UgdXNlCisgICBtdGFifi48cGlkPiBpbnN0ZWFkLiBVc2UgMjAgYXMgdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgJWQuICovCisjZGVmaW5lIE1PVU5UTE9DS19MSU5LVEFSR0VUCQlNT1VOVEVEX0xPQ0sgIiVkIgorI2RlZmluZSBNT1VOVExPQ0tfTElOS1RBUkdFVF9MVEgJKHNpemVvZihNT1VOVEVEX0xPQ0spKzIwKQorCit2b2lkCitsb2NrX210YWIgKHZvaWQpIHsKKwlpbnQgdHJpZXMgPSAxMDAwMDAsIGk7CisJY2hhciBsaW5rdGFyZ2V0ZmlsZVtNT1VOVExPQ0tfTElOS1RBUkdFVF9MVEhdOworCisJYXRfZGllID0gdW5sb2NrX210YWI7CisKKwlpZiAoIXNpZ25hbHNfaGF2ZV9iZWVuX3NldHVwKSB7CisJCWludCBzaWcgPSAwOworCQlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCisJCXNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCQlzYS5zYV9mbGFncyA9IDA7CisJCXNpZ2ZpbGxzZXQgKCZzYS5zYV9tYXNrKTsKKyAgCisJCXdoaWxlIChzaWdpc21lbWJlciAoJnNhLnNhX21hc2ssICsrc2lnKSAhPSAtMQorCQkgICAgICAgJiYgc2lnICE9IFNJR0NITEQpIHsKKwkJCWlmIChzaWcgPT0gU0lHQUxSTSkKKwkJCQlzYS5zYV9oYW5kbGVyID0gc2V0bGt3X3RpbWVvdXQ7CisJCQllbHNlCisJCQkJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJCQlzaWdhY3Rpb24gKHNpZywgJnNhLCAoc3RydWN0IHNpZ2FjdGlvbiAqKSAwKTsKKwkJfQorCQlzaWduYWxzX2hhdmVfYmVlbl9zZXR1cCA9IDE7CisJfQorCisJc3ByaW50ZihsaW5rdGFyZ2V0ZmlsZSwgTU9VTlRMT0NLX0xJTktUQVJHRVQsIGdldHBpZCAoKSk7CisKKwlpID0gb3BlbiAobGlua3RhcmdldGZpbGUsIE9fV1JPTkxZfE9fQ1JFQVQsIDApOworCWlmIChpIDwgMCkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJLyogbGlua3RhcmdldGZpbGUgZG9lcyBub3QgZXhpc3QgKGFzIGEgZmlsZSkKKwkJICAgYW5kIHdlIGNhbm5vdCBjcmVhdGUgaXQuIFJlYWQtb25seSBmaWxlc3lzdGVtPworCQkgICBUb28gbWFueSBmaWxlcyBvcGVuIGluIHRoZSBzeXN0ZW0/CisJCSAgIEZpbGVzeXN0ZW0gZnVsbD8gKi8KKwkJZGllIChFWF9GSUxFSU8sIF8oImNhbid0IGNyZWF0ZSBsb2NrIGZpbGUgJXM6ICVzICIKKwkJCQkJCSAgIih1c2UgLW4gZmxhZyB0byBvdmVycmlkZSkiKSwKKwkJCSBsaW5rdGFyZ2V0ZmlsZSwgc3RyZXJyb3IgKGVycnN2KSk7CisJfQorCWNsb3NlKGkpOworCQorCS8qIFJlcGVhdCB1bnRpbCBpdCB3YXMgdXMgd2hvIG1hZGUgdGhlIGxpbmsgKi8KKwl3aGlsZSAoIXdlX2NyZWF0ZWRfbG9ja2ZpbGUpIHsKKwkJc3RydWN0IGZsb2NrIGZsb2NrOworCQlpbnQgZXJyc3YsIGo7CisKKwkJaiA9IGxpbmsobGlua3RhcmdldGZpbGUsIE1PVU5URURfTE9DSyk7CisJCWVycnN2ID0gZXJybm87CisKKwkJaWYgKGogPT0gMCkKKwkJCXdlX2NyZWF0ZWRfbG9ja2ZpbGUgPSAxOworCisJCWlmIChqIDwgMCAmJiBlcnJzdiAhPSBFRVhJU1QpIHsKKwkJCSh2b2lkKSB1bmxpbmsobGlua3RhcmdldGZpbGUpOworCQkJZGllIChFWF9GSUxFSU8sIF8oImNhbid0IGxpbmsgbG9jayBmaWxlICVzOiAlcyAiCisJCQkgICAgICIodXNlIC1uIGZsYWcgdG8gb3ZlcnJpZGUpIiksCisJCQkgICAgIE1PVU5URURfTE9DSywgc3RyZXJyb3IgKGVycnN2KSk7CisJCX0KKworCQlsb2NrZmlsZV9mZCA9IG9wZW4gKE1PVU5URURfTE9DSywgT19XUk9OTFkpOworCisJCWlmIChsb2NrZmlsZV9mZCA8IDApIHsKKwkJCWludCBlcnJzdiA9IGVycm5vOworCQkJLyogU3RyYW5nZS4uLiBNYXliZSB0aGUgZmlsZSB3YXMganVzdCBkZWxldGVkPyAqLworCQkJaWYgKGVycm5vID09IEVOT0VOVCAmJiB0cmllcy0tID4gMCkgeworCQkJCWlmICh0cmllcyAlIDIwMCA9PSAwKQorCQkJCQl1c2xlZXAoMzApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKHZvaWQpIHVubGluayhsaW5rdGFyZ2V0ZmlsZSk7CisJCQlkaWUgKEVYX0ZJTEVJTywgXygiY2FuJ3Qgb3BlbiBsb2NrIGZpbGUgJXM6ICVzICIKKwkJCSAgICAgIih1c2UgLW4gZmxhZyB0byBvdmVycmlkZSkiKSwKKwkJCSAgICAgTU9VTlRFRF9MT0NLLCBzdHJlcnJvciAoZXJyc3YpKTsKKwkJfQorCisJCWZsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisJCWZsb2NrLmxfd2hlbmNlID0gU0VFS19TRVQ7CisJCWZsb2NrLmxfc3RhcnQgPSAwOworCQlmbG9jay5sX2xlbiA9IDA7CisKKwkJaWYgKGogPT0gMCkgeworCQkJLyogV2UgbWFkZSB0aGUgbGluay4gTm93IGNsYWltIHRoZSBsb2NrLiAqLworCQkJaWYgKGZjbnRsIChsb2NrZmlsZV9mZCwgRl9TRVRMSywgJmZsb2NrKSA9PSAtMSkgeworCQkJCWlmICh2ZXJib3NlKSB7CisJCQkJICAgIGludCBlcnJzdiA9IGVycm5vOworCQkJCSAgICBuZnNfZXJyb3IoXygiJXM6IENhbid0IGxvY2sgbG9jayBmaWxlICIKKwkJCQkJCSIlczogJXMiKSwgcHJvZ25hbWUsCisJCQkJCSAgIAlNT1VOVEVEX0xPQ0ssCisJCQkJCQlzdHJlcnJvciAoZXJyc3YpKTsKKwkJCQl9CisJCQkJLyogcHJvY2VlZCBhbnl3YXkgKi8KKwkJCX0KKwkJCSh2b2lkKSB1bmxpbmsobGlua3RhcmdldGZpbGUpOworCQl9IGVsc2UgeworCQkJc3RhdGljIGludCB0cmllcyA9IDA7CisKKwkJCS8qIFNvbWVvbmUgZWxzZSBtYWRlIHRoZSBsaW5rLiBXYWl0LiAqLworCQkJYWxhcm0oTE9DS19USU1FT1VUKTsKKwkJCWlmIChmY250bCAobG9ja2ZpbGVfZmQsIEZfU0VUTEtXLCAmZmxvY2spID09IC0xKSB7CisJCQkJaW50IGVycnN2ID0gZXJybm87CisJCQkJKHZvaWQpIHVubGluayhsaW5rdGFyZ2V0ZmlsZSk7CisJCQkJZGllIChFWF9GSUxFSU8sIF8oImNhbid0IGxvY2sgbG9jayBmaWxlICVzOiAlcyIpLAorCQkJCSAgICAgTU9VTlRFRF9MT0NLLCAoZXJybm8gPT0gRUlOVFIpID8KKwkJCQkgICAgIF8oInRpbWVkIG91dCIpIDogc3RyZXJyb3IgKGVycnN2KSk7CisJCQl9CisJCQlhbGFybSgwKTsKKwkJCS8qIExpbWl0IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyAtIG1heWJlIHRoZXJlCisJCQkgICBzdGlsbCBpcyBzb21lIG9sZCAvZXRjL210YWJ+ICovCisJCQkrK3RyaWVzOworCQkJaWYgKHRyaWVzICUgMjAwID09IDApCisJCQkgICB1c2xlZXAoMzApOworCQkJaWYgKHRyaWVzID4gMTAwMDAwKSB7CisJCQkJKHZvaWQpIHVubGluayhsaW5rdGFyZ2V0ZmlsZSk7CisJCQkJY2xvc2UobG9ja2ZpbGVfZmQpOworCQkJCWRpZSAoRVhfRklMRUlPLCBfKCJDYW5ub3QgY3JlYXRlIGxpbmsgJXNcbiIKKwkJCQkJCSAgIlBlcmhhcHMgdGhlcmUgaXMgYSBzdGFsZSBsb2NrIGZpbGU/XG4iKSwKKwkJCQkJIE1PVU5URURfTE9DSyk7CisgCQkJfQorCQkJY2xvc2UobG9ja2ZpbGVfZmQpOworCQl9CisJfQorfQorCisvKgorICogVXBkYXRlIHRoZSBtdGFiLgorICogIFVzZWQgYnkgdW1vdW50IHdpdGggbnVsbCBJTlNURUFEOiByZW1vdmUgdGhlIGxhc3QgRElSIGVudHJ5LgorICogIFVzZWQgYnkgbW91bnQgdXBvbiBhIHJlbW91bnQ6IHVwZGF0ZSBvcHRpb24gcGFydCwKKyAqICAgYW5kIGNvbXBsYWluIGlmIGEgd3JvbmcgZGV2aWNlIG9yIHR5cGUgd2FzIGdpdmVuLgorICogICBbTm90ZSB0aGF0IG9mdGVuIGEgcmVtb3VudCB3aWxsIGJlIGEgcncgcmVtb3VudCBvZiAvCisgKiAgICB3aGVyZSB0aGVyZSB3YXMgbm8gZW50cnkgYmVmb3JlLCBhbmQgd2UnbGwgaGF2ZSB0byBiZWxpZXZlCisgKiAgICB0aGUgdmFsdWVzIGdpdmVuIGluIElOU1RFQUQuXQorICovCisKK3ZvaWQKK3VwZGF0ZV9tdGFiIChjb25zdCBjaGFyICpkaXIsIHN0cnVjdCBtbnRlbnQgKmluc3RlYWQpCit7CisJbW50RklMRSAqbWZwLCAqbWZ0bXA7CisJY29uc3QgY2hhciAqZm5hbSA9IE1PVU5URUQ7CisJc3RydWN0IG1udGVudGNobiBtdGFiaGVhZDsJLyogZHVtbXkgKi8KKwlzdHJ1Y3QgbW50ZW50Y2huICptYywgKm1jMCwgKmFic2VudCA9IE5VTEw7CisKKwlpZiAobXRhYl9kb2VzX25vdF9leGlzdCgpIHx8ICFtdGFiX2lzX3dyaXRhYmxlKCkpCisJCXJldHVybjsKKworCWxvY2tfbXRhYigpOworCisJLyogaGF2aW5nIGxvY2tlZCBtdGFiLCByZWFkIGl0IGFnYWluICovCisJbWMwID0gbWMgPSAmbXRhYmhlYWQ7CisJbWMtPm54dCA9IG1jLT5wcmV2ID0gTlVMTDsKKworCW1mcCA9IG5mc19zZXRtbnRlbnQoZm5hbSwgInIiKTsKKwlpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tbnRlbnRfZnAgPT0gTlVMTCkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJbmZzX2Vycm9yIChfKCJjYW5ub3Qgb3BlbiAlcyAoJXMpIC0gbXRhYiBub3QgdXBkYXRlZCIpLAorCQkgICAgICAgZm5hbSwgc3RyZXJyb3IgKGVycnN2KSk7CisJCWdvdG8gbGVhdmU7CisJfQorCisJcmVhZF9tbnRlbnRjaG4obWZwLCBmbmFtLCBtYyk7CisKKwkvKiBmaW5kIGxhc3Qgb2NjdXJyZW5jZSBvZiBkaXIgKi8KKwlmb3IgKG1jID0gbWMwLT5wcmV2OyBtYyAmJiBtYyAhPSBtYzA7IG1jID0gbWMtPnByZXYpCisJCWlmIChzdHJlcShtYy0+bS5tbnRfZGlyLCBkaXIpKQorCQkJYnJlYWs7CisJaWYgKG1jICYmIG1jICE9IG1jMCkgeworCQlpZiAoaW5zdGVhZCA9PSBOVUxMKSB7CisJCQkvKiBBbiB1bW91bnQgLSByZW1vdmUgZW50cnkgKi8KKwkJCWlmIChtYyAmJiBtYyAhPSBtYzApIHsKKwkJCQltYy0+cHJldi0+bnh0ID0gbWMtPm54dDsKKwkJCQltYy0+bnh0LT5wcmV2ID0gbWMtPnByZXY7CisJCQkJZnJlZShtYyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBIHJlbW91bnQgKi8KKwkJCW1jLT5tLm1udF9vcHRzID0gaW5zdGVhZC0+bW50X29wdHM7CisJCX0KKwl9IGVsc2UgaWYgKGluc3RlYWQpIHsKKwkJLyogbm90IGZvdW5kLCBhZGQgYSBuZXcgZW50cnkgKi8KKwkJYWJzZW50ID0geG1hbGxvYyhzaXplb2YoKmFic2VudCkpOworCQlhYnNlbnQtPm0gPSAqaW5zdGVhZDsKKwkJYWJzZW50LT5ueHQgPSBtYzA7CisJCWFic2VudC0+cHJldiA9IG1jMC0+cHJldjsKKwkJbWMwLT5wcmV2ID0gYWJzZW50OworCQlpZiAobWMwLT5ueHQgPT0gTlVMTCkKKwkJCW1jMC0+bnh0ID0gYWJzZW50OworCX0KKworCS8qIHdyaXRlIGNoYWluIHRvIG10ZW1wICovCisJbWZ0bXAgPSBuZnNfc2V0bW50ZW50IChNT1VOVEVEX1RFTVAsICJ3Iik7CisJaWYgKG1mdG1wID09IE5VTEwgfHwgbWZ0bXAtPm1udGVudF9mcCA9PSBOVUxMKSB7CisJCWludCBlcnJzdiA9IGVycm5vOworCQluZnNfZXJyb3IgKF8oImNhbm5vdCBvcGVuICVzICglcykgLSBtdGFiIG5vdCB1cGRhdGVkIiksCisJCSAgICAgICBNT1VOVEVEX1RFTVAsIHN0cmVycm9yIChlcnJzdikpOworCQlnb3RvIGxlYXZlOworCX0KKworCWZvciAobWMgPSBtYzAtPm54dDsgbWMgJiYgbWMgIT0gbWMwOyBtYyA9IG1jLT5ueHQpIHsKKwkJaWYgKG5mc19hZGRtbnRlbnQobWZ0bXAsICYobWMtPm0pKSA9PSAxKSB7CisJCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJCWRpZSAoRVhfRklMRUlPLCBfKCJlcnJvciB3cml0aW5nICVzOiAlcyIpLAorCQkJICAgICBNT1VOVEVEX1RFTVAsIHN0cmVycm9yIChlcnJzdikpOworCQl9CisJfQorCisjaWYgMAorCS8qIHRoZSBjaGFpbiBtaWdodCBoYXZlIHN0cmluZ3MgY29waWVkIGZyb20gJ2luc3RlYWQnLAorCSAqIHNvIHdlIGNhbm5vdCBzYWZlbHkgZnJlZSBpdC4KKwkgKiBBbmQgdGhlcmUgaXMgbm8gbmVlZCBhbnl3YXkgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gZXhpdAorCSAqIHNob3J0bHkuICBTbyBqdXN0IGRvbid0IGNhbGwgZGlzY2FyZF9tbnRlbnRjaG4uLi4uCisJICovCisJZGlzY2FyZF9tbnRlbnRjaG4obWMwKTsKKyNlbmRpZgorCWlmIChmY2htb2QgKGZpbGVubyAobWZ0bXAtPm1udGVudF9mcCksCisJCSAgICBTX0lSVVNSfFNfSVdVU1J8U19JUkdSUHxTX0lST1RIKSA8IDApIHsKKwkJaW50IGVycnN2ID0gZXJybm87CisJCW5mc19lcnJvcihfKCIlczogZXJyb3IgY2hhbmdpbmcgbW9kZSBvZiAlczogJXMiKSwKKwkJCQlwcm9nbmFtZSwgTU9VTlRFRF9URU1QLCBzdHJlcnJvciAoZXJyc3YpKTsKKwl9CisJbmZzX2VuZG1udGVudCAobWZ0bXApOworCisJeyAvKgorCSAgICogSWYgbW91bnQgaXMgc2V0dWlkIGFuZCBzb21lIG5vbi1yb290IHVzZXIgbW91bnRzIHN0aCwKKwkgICAqIHRoZW4gbXRhYi50bXAgbWlnaHQgZ2V0IHRoZSBncm91cCBvZiB0aGlzIHVzZXIuIENvcHkgdWlkL2dpZAorCSAgICogZnJvbSB0aGUgcHJlc2VudCBtdGFiIGJlZm9yZSByZW5hbWluZy4KKwkgICAqLworCSAgICBzdHJ1Y3Qgc3RhdCBzYnVmOworCSAgICBpZiAoc3RhdCAoTU9VTlRFRCwgJnNidWYpID09IDApIHsKKwkJCWlmIChjaG93biAoTU9VTlRFRF9URU1QLCBzYnVmLnN0X3VpZCwgc2J1Zi5zdF9naWQpIDwgMCkgeworCQkJCW5mc19lcnJvcihfKCIlczogZXJyb3IgY2hhbmdpbmcgb3duZXIgb2YgJXM6ICVzIiksCisJCQkJCXByb2duYW1lLCBNT1VOVEVEX1RFTVAsIHN0cmVycm9yIChlcnJubykpOworCQkJfQorCQl9CisJfQorCisJLyogcmVuYW1lIG10ZW1wIHRvIG10YWIgKi8KKwlpZiAocmVuYW1lIChNT1VOVEVEX1RFTVAsIE1PVU5URUQpIDwgMCkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJbmZzX2Vycm9yKF8oIiVzOiBjYW4ndCByZW5hbWUgJXMgdG8gJXM6ICVzXG4iKSwKKwkJCQlwcm9nbmFtZSwgTU9VTlRFRF9URU1QLCBNT1VOVEVELAorCQkJCXN0cmVycm9yKGVycnN2KSk7CisJfQorCisgbGVhdmU6CisJdW5sb2NrX210YWIoKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9mc3RhYi5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L2ZzdGFiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3YzlmYwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9mc3RhYi5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX05GU19VVElMU19NT1VOVF9GU1RBQl9ICisjZGVmaW5lIF9ORlNfVVRJTFNfTU9VTlRfRlNUQUJfSAorCisjaW5jbHVkZSAibmZzX21udGVudC5oIgorCisjaWZuZGVmIF9QQVRIX0ZTVEFCCisjZGVmaW5lIF9QQVRIX0ZTVEFCICIvZXRjL2ZzdGFiIgorI2VuZGlmCisKK2ludCBtdGFiX2lzX3dyaXRhYmxlKHZvaWQpOworaW50IG10YWJfZG9lc19ub3RfZXhpc3Qodm9pZCk7Cit2b2lkIHJlc2V0X210YWJfaW5mbyh2b2lkKTsKKworc3RydWN0IG1udGVudGNobiB7CisJc3RydWN0IG1udGVudGNobiAqbnh0LCAqcHJldjsKKwlzdHJ1Y3QgbW50ZW50IG07Cit9OworCitzdHJ1Y3QgbW50ZW50Y2huICpnZXRtbnRvcHRmaWxlIChjb25zdCBjaGFyICpmaWxlKTsKK3N0cnVjdCBtbnRlbnRjaG4gKmdldG1udGRpcmJhY2t3YXJkIChjb25zdCBjaGFyICpkaXIsIHN0cnVjdCBtbnRlbnRjaG4gKm1jKTsKK3N0cnVjdCBtbnRlbnRjaG4gKmdldG1udGRldmJhY2t3YXJkIChjb25zdCBjaGFyICpkZXYsIHN0cnVjdCBtbnRlbnRjaG4gKm1jKTsKKworc3RydWN0IG1udGVudGNobiAqZ2V0ZnNmaWxlIChjb25zdCBjaGFyICpmaWxlKTsKK3N0cnVjdCBtbnRlbnRjaG4gKmdldGZzc3BlYyAoY29uc3QgY2hhciAqc3BlYyk7CisKK3ZvaWQgbG9ja19tdGFiICh2b2lkKTsKK3ZvaWQgdW5sb2NrX210YWIgKHZvaWQpOwordm9pZCB1cGRhdGVfbXRhYiAoY29uc3QgY2hhciAqc3BlY2lhbCwgc3RydWN0IG1udGVudCAqd2l0aCk7CisKKyNlbmRpZgkvKiBfTkZTX1VUSUxTX01PVU5UX0ZTVEFCX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9tb3VudC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiOTE2OQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9tb3VudC5jCkBAIC0wLDAgKzEsNjI5IEBACisvKgorICogbW91bnQuYyAtLSBMaW51eCBORlMgbW91bnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KKyAqCisgKiAtIEJhc2ljIGNvZGUgYW5kIHdyYXBwZXIgYXJvdW5kIG1vdW50IGFuZCB1bW91bnQgY29kZSBvZiBORlMuCisgKiAgIEJhc2VkIG9uIHV0aWwtbGludXgvbW91bnQvbW91bnQuYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8cHdkLmg+CisKKyNpbmNsdWRlICJmc3RhYi5oIgorI2luY2x1ZGUgInhjb21tb24uaCIKKyNpbmNsdWRlICJubHMuaCIKKyNpbmNsdWRlICJtb3VudF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJtb3VudF9jb25maWcuaCIKKyNpbmNsdWRlICJuZnNfcGF0aHMuaCIKKyNpbmNsdWRlICJuZnNfbW50ZW50LmgiCisKKyNpbmNsdWRlICJuZnNfbW91bnQuaCIKKyNpbmNsdWRlICJuZnM0X21vdW50LmgiCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgInN0cm9wdHMuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK2NoYXIgKnByb2duYW1lOworaW50IG5mc19tb3VudF9kYXRhX3ZlcnNpb247CitpbnQgbm9tdGFiOworaW50IHZlcmJvc2U7CitpbnQgc2xvcHB5OworaW50IHN0cmluZzsKKworI2RlZmluZSBGT1JFR1JPVU5ECSgwKQorI2RlZmluZSBCQUNLR1JPVU5ECSgxKQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0geworICB7ICJmYWtlIiwgMCwgMCwgJ2YnIH0sCisgIHsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKyAgeyAibm8tbXRhYiIsIDAsIDAsICduJyB9LAorICB7ICJyZWFkLW9ubHkiLCAwLCAwLCAncicgfSwKKyAgeyAicm8iLCAwLCAwLCAncicgfSwKKyAgeyAidmVyYm9zZSIsIDAsIDAsICd2JyB9LAorICB7ICJ2ZXJzaW9uIiwgMCwgMCwgJ1YnIH0sCisgIHsgInJlYWQtd3JpdGUiLCAwLCAwLCAndycgfSwKKyAgeyAicnciLCAwLCAwLCAndycgfSwKKyAgeyAib3B0aW9ucyIsIDEsIDAsICdvJyB9LAorICB7IE5VTEwsIDAsIDAsIDAgfQorfTsKKworLyoKKyAqIE1hcCBmcm9tIC1vIGFuZCBmc3RhYiBvcHRpb24gc3RyaW5ncyB0byB0aGUgZmxhZyBhcmd1bWVudCB0byBtb3VudCgyKS4KKyAqLworc3RydWN0IG9wdF9tYXAgeworCWNvbnN0IGNoYXIgKm9wdDsJLyogb3B0aW9uIG5hbWUgKi8KKwlpbnQgc2tpcDsJCS8qIHNraXAgaW4gbXRhYiBvcHRpb24gc3RyaW5nICovCisJaW50IGludjsJCS8qIHRydWUgaWYgZmxhZyB2YWx1ZSBzaG91bGQgYmUgaW52ZXJ0ZWQgKi8KKwlpbnQgbWFzazsJCS8qIGZsYWcgbWFzayB2YWx1ZSAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRfbWFwIG9wdF9tYXBbXSA9IHsKKyAgeyAiZGVmYXVsdHMiLCAwLCAwLCAwICAgICAgICAgfSwgICAgICAvKiBkZWZhdWx0IG9wdGlvbnMgKi8KKyAgeyAicm8iLCAgICAgICAxLCAwLCBNU19SRE9OTFkgfSwgICAgICAvKiByZWFkLW9ubHkgKi8KKyAgeyAicnciLCAgICAgICAxLCAxLCBNU19SRE9OTFkgfSwgICAgICAvKiByZWFkLXdyaXRlICovCisgIHsgImV4ZWMiLCAgICAgMCwgMSwgTVNfTk9FWEVDIH0sICAgICAgLyogcGVybWl0IGV4ZWN1dGlvbiBvZiBiaW5hcmllcyAqLworICB7ICJub2V4ZWMiLCAgIDAsIDAsIE1TX05PRVhFQyB9LCAgICAgIC8qIGRvbid0IGV4ZWN1dGUgYmluYXJpZXMgKi8KKyAgeyAic3VpZCIsICAgICAwLCAxLCBNU19OT1NVSUQgfSwgICAgICAvKiBob25vciBzdWlkIGV4ZWN1dGFibGVzICovCisgIHsgIm5vc3VpZCIsICAgMCwgMCwgTVNfTk9TVUlEIH0sICAgICAgLyogZG9uJ3QgaG9ub3Igc3VpZCBleGVjdXRhYmxlcyAqLworICB7ICJkZXYiLCAgICAgIDAsIDEsIE1TX05PREVWICB9LCAgICAgIC8qIGludGVycHJldCBkZXZpY2UgZmlsZXMgICovCisgIHsgIm5vZGV2IiwgICAgMCwgMCwgTVNfTk9ERVYgIH0sICAgICAgLyogZG9uJ3QgaW50ZXJwcmV0IGRldmljZXMgKi8KKyAgeyAic3luYyIsICAgICAwLCAwLCBNU19TWU5DSFJPTk9VU30sICAvKiBzeW5jaHJvbm91cyBJL08gKi8KKyAgeyAiYXN5bmMiLCAgICAwLCAxLCBNU19TWU5DSFJPTk9VU30sICAvKiBhc3luY2hyb25vdXMgSS9PICovCisgIHsgImRpcnN5bmMiLCAgMCwgMCwgTVNfRElSU1lOQ30sICAgICAgLyogc3luY2hyb25vdXMgZGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgKi8KKyAgeyAicmVtb3VudCIsICAwLCAwLCBNU19SRU1PVU5UfSwgICAgICAvKiBBbHRlciBmbGFncyBvZiBtb3VudGVkIEZTICovCisgIHsgImJpbmQiLCAgICAgMCwgMCwgTVNfQklORCAgIH0sICAgICAgLyogUmVtb3VudCBwYXJ0IG9mIHRyZWUgZWxzZXdoZXJlICovCisgIHsgInJiaW5kIiwgICAgMCwgMCwgTVNfQklORHxNU19SRUMgfSwgLyogSWRlbSwgcGx1cyBtb3VudGVkIHN1YnRyZWVzICovCisgIHsgImF1dG8iLCAgICAgMCwgMCwgTVNfRFVNTVkgfSwgICAgICAgLyogQ2FuIGJlIG1vdW50ZWQgdXNpbmcgLWEgKi8KKyAgeyAibm9hdXRvIiwgICAwLCAwLCBNU19EVU1NWSB9LCAgICAgICAvKiBDYW4gIG9ubHkgYmUgbW91bnRlZCBleHBsaWNpdGx5ICovCisgIHsgInVzZXJzIiwgICAgMSwgMCwgTVNfVVNFUlMgfSwJLyogQWxsb3cgb3JkaW5hcnkgdXNlciB0byBtb3VudCAqLworICB7ICJub3VzZXJzIiwgIDAsIDEsIE1TX0RVTU1ZICB9LCAgICAgIC8qIEZvcmJpZCBvcmRpbmFyeSB1c2VyIHRvIG1vdW50ICovCisgIHsgInVzZXIiLCAgICAgMSwgMCwgTVNfVVNFUiAgfSwJLyogQWxsb3cgb3JkaW5hcnkgdXNlciB0byBtb3VudCAqLworICB7ICJub3VzZXIiLCAgIDAsIDEsIE1TX0RVTU1ZICAgfSwgICAgIC8qIEZvcmJpZCBvcmRpbmFyeSB1c2VyIHRvIG1vdW50ICovCisgIHsgIm93bmVyIiwgICAgMCwgMCwgTVNfRFVNTVkgIH0sICAgICAgLyogTGV0IHRoZSBvd25lciBvZiB0aGUgZGV2aWNlIG1vdW50ICovCisgIHsgIm5vb3duZXIiLCAgMCwgMCwgTVNfRFVNTVkgIH0sICAgICAgLyogRGV2aWNlIG93bmVyIGhhcyBubyBzcGVjaWFsIHByaXZzICovCisgIHsgImdyb3VwIiwgICAgMCwgMCwgTVNfRFVNTVkgIH0sICAgICAgLyogTGV0IHRoZSBncm91cCBvZiB0aGUgZGV2aWNlIG1vdW50ICovCisgIHsgIm5vZ3JvdXAiLCAgMCwgMCwgTVNfRFVNTVkgIH0sICAgICAgLyogRGV2aWNlIGdyb3VwIGhhcyBubyBzcGVjaWFsIHByaXZzICovCisgIHsgIl9uZXRkZXYiLCAgMCwgMCwgTVNfRFVNTVl9LCAgICAgICAgLyogRGV2aWNlIHJlcXVpcmVzIG5ldHdvcmsgKi8KKyAgeyAiY29tbWVudCIsICAwLCAwLCBNU19EVU1NWX0sICAgICAgICAvKiBmc3RhYiBjb21tZW50IG9ubHkgKGt1ZHp1LF9uZXRkZXYpKi8KKworICAvKiBhZGQgbmV3IG9wdGlvbnMgaGVyZSAqLworI2lmZGVmIE1TX05PU1VCCisgIHsgInN1YiIsICAgICAgMCwgMSwgTVNfTk9TVUIgIH0sICAgICAgLyogYWxsb3cgc3VibW91bnRzICovCisgIHsgIm5vc3ViIiwgICAgMCwgMCwgTVNfTk9TVUIgIH0sICAgICAgLyogZG9uJ3QgYWxsb3cgc3VibW91bnRzICovCisjZW5kaWYKKyNpZmRlZiBNU19TSUxFTlQKKyAgeyAicXVpZXQiLCAgICAwLCAwLCBNU19TSUxFTlQgICAgfSwgICAvKiBiZSBxdWlldCAgKi8KKyAgeyAibG91ZCIsICAgICAwLCAxLCBNU19TSUxFTlQgICAgfSwgICAvKiBwcmludCBvdXQgbWVzc2FnZXMuICovCisjZW5kaWYKKyNpZmRlZiBNU19NQU5ETE9DSworICB7ICJtYW5kIiwgICAgIDAsIDAsIE1TX01BTkRMT0NLIH0sICAgIC8qIEFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiB0aGlzIEZTICovCisgIHsgIm5vbWFuZCIsICAgMCwgMSwgTVNfTUFORExPQ0sgfSwgICAgLyogRm9yYmlkIG1hbmRhdG9yeSBsb2NrcyBvbiB0aGlzIEZTICovCisjZW5kaWYKKyAgeyAibG9vcCIsICAgICAxLCAwLCBNU19EVU1NWSAgIH0sICAgICAgLyogdXNlIGEgbG9vcCBkZXZpY2UgKi8KKyNpZmRlZiBNU19OT0FUSU1FCisgIHsgImF0aW1lIiwgICAgMCwgMSwgTVNfTk9BVElNRSB9LCAgICAgLyogVXBkYXRlIGFjY2VzcyB0aW1lICovCisgIHsgIm5vYXRpbWUiLCAgMCwgMCwgTVNfTk9BVElNRSB9LCAgICAgLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZSAqLworI2VuZGlmCisjaWZkZWYgTVNfTk9ESVJBVElNRQorICB7ICJkaXJhdGltZSIsIDAsIDEsIE1TX05PRElSQVRJTUUgfSwgIC8qIFVwZGF0ZSBkaXIgYWNjZXNzIHRpbWVzICovCisgIHsgIm5vZGlyYXRpbWUiLCAwLCAwLCBNU19OT0RJUkFUSU1FIH0sLyogRG8gbm90IHVwZGF0ZSBkaXIgYWNjZXNzIHRpbWVzICovCisjZW5kaWYKKyNpZmRlZiBNU19SRUxBVElNRQorICB7ICJyZWxhdGltZSIsIDAsIDAsIE1TX1JFTEFUSU1FIH0sICAgLyogVXBkYXRlIGFjY2VzcyB0aW1lcyByZWxhdGl2ZSB0bworICAgICAgICAgICAgICAgICAgICAgIG10aW1lL2N0aW1lICovCisgIHsgIm5vcmVsYXRpbWUiLCAwLCAxLCBNU19SRUxBVElNRSB9LCAvKiBVcGRhdGUgYWNjZXNzIHRpbWUgd2l0aG91dCByZWdhcmQKKyAgICAgICAgICAgICAgICAgICAgICB0byBtdGltZS9jdGltZSAqLworI2VuZGlmCisgIHsgIm5vcXVvdGEiLCAwLCAwLCBNU19EVU1NWSB9LCAgICAgICAgLyogRG9uJ3QgZW5mb3JjZSBxdW90YSAqLworICB7ICJxdW90YSIsIDAsIDAsIE1TX0RVTU1ZIH0sICAgICAgICAgIC8qIEVuZm9yY2UgdXNlciBxdW90YSAqLworICB7ICJ1c3JxdW90YSIsIDAsIDAsIE1TX0RVTU1ZIH0sICAgICAgIC8qIEVuZm9yY2UgdXNlciBxdW90YSAqLworICB7ICJncnBxdW90YSIsIDAsIDAsIE1TX0RVTU1ZIH0sICAgICAgIC8qIEVuZm9yY2UgZ3JvdXAgcXVvdGEgKi8KKyAgeyBOVUxMLAkwLCAwLCAwCQl9Cit9OworCitzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGNvbnN0IGNoYXIgKm9wdGlvbnMsIGludCAqZmxhZ3MsIGNoYXIgKipleHRyYV9vcHRzKTsKKworLyoKKyAqIENob29zZSB0aGUgdmVyc2lvbiBvZiB0aGUgbmZzX21vdW50X2RhdGEgc3RydWN0dXJlIHRoYXQgaXMgYXBwcm9wcmlhdGUKKyAqIGZvciB0aGUga2VybmVsIHRoYXQgaXMgZG9pbmcgdGhlIG1vdW50LgorICoKKyAqIE5GU19NT1VOVF9WRVJTSU9OOgkJbWF4aW11bSB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGVzZSBzb3VyY2VzCisgKiBuZnNfbW91bnRfZGF0YV92ZXJzaW9uOgltYXhpbXVtIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBydW5uaW5nIGtlcm5lbAorICovCitzdGF0aWMgdm9pZCBkaXNjb3Zlcl9uZnNfbW91bnRfZGF0YV92ZXJzaW9uKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGtlcm5lbF92ZXJzaW9uID0gbGludXhfdmVyc2lvbl9jb2RlKCk7CisKKwlpZiAoa2VybmVsX3ZlcnNpb24pIHsKKwkJaWYgKGtlcm5lbF92ZXJzaW9uIDwgTUFLRV9WRVJTSU9OKDIsIDEsIDMyKSkKKwkJCW5mc19tb3VudF9kYXRhX3ZlcnNpb24gPSAxOworCQllbHNlIGlmIChrZXJuZWxfdmVyc2lvbiA8IE1BS0VfVkVSU0lPTigyLCAyLCAxOCkpCisJCQluZnNfbW91bnRfZGF0YV92ZXJzaW9uID0gMzsKKwkJZWxzZSBpZiAoa2VybmVsX3ZlcnNpb24gPCBNQUtFX1ZFUlNJT04oMiwgMywgMCkpCisJCQluZnNfbW91bnRfZGF0YV92ZXJzaW9uID0gNDsKKwkJZWxzZSBpZiAoa2VybmVsX3ZlcnNpb24gPCBNQUtFX1ZFUlNJT04oMiwgMywgOTkpKQorCQkJbmZzX21vdW50X2RhdGFfdmVyc2lvbiA9IDM7CisJCWVsc2UgaWYgKGtlcm5lbF92ZXJzaW9uIDwgTUFLRV9WRVJTSU9OKDIsIDYsIDMpKQorCQkJbmZzX21vdW50X2RhdGFfdmVyc2lvbiA9IDQ7CisJCWVsc2UKKwkJCW5mc19tb3VudF9kYXRhX3ZlcnNpb24gPSA2OworCX0KKwlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA+IE5GU19NT1VOVF9WRVJTSU9OKQorCQluZnNfbW91bnRfZGF0YV92ZXJzaW9uID0gTkZTX01PVU5UX1ZFUlNJT047CisJZWxzZQorCQlpZiAoa2VybmVsX3ZlcnNpb24gPiBNQUtFX1ZFUlNJT04oMiwgNiwgMjIpKQorCQkJc3RyaW5nKys7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X29uZShjaGFyICpzcGVjLCBjaGFyICpub2RlLCBjaGFyICp0eXBlLCBjaGFyICpvcHRzKQoreworCWlmICghdmVyYm9zZSkKKwkJcmV0dXJuOworCisJaWYgKG9wdHMpCisJCXByaW50ZihfKCIlcyBvbiAlcyB0eXBlICVzICglcylcbiIpLCBzcGVjLCBub2RlLCB0eXBlLCBvcHRzKTsKKwllbHNlCisJCXByaW50ZihfKCIlcyBvbiAlcyB0eXBlICVzXG4iKSwgc3BlYywgbm9kZSwgdHlwZSk7Cit9CisKKy8qCisgKiBCdWlsZCBhIGNhbm9uaWNhbCBtb3VudCBvcHRpb24gc3RyaW5nIGZvciAvZXRjL210YWIuCisgKi8KK3N0YXRpYyBjaGFyICpmaXhfb3B0c19zdHJpbmcoaW50IGZsYWdzLCBjb25zdCBjaGFyICpleHRyYV9vcHRzKQoreworCWNvbnN0IHN0cnVjdCBvcHRfbWFwICpvbTsKKwljaGFyICpuZXdfb3B0czsKKworCW5ld19vcHRzID0geHN0cmR1cCgoZmxhZ3MgJiBNU19SRE9OTFkpID8gInJvIiA6ICJydyIpOworCWlmIChmbGFncyAmIE1TX1VTRVIpIHsKKwkJLyogcmVjb3JkIHdobyBtb3VudGVkIHRoaXMgc28gdGhleSBjYW4gdW5tb3VudCAqLworCQlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwkJaWYocHcpCisJCQluZXdfb3B0cyA9IHhzdHJjb25jYXQzKG5ld19vcHRzLCAiLHVzZXI9IiwgcHctPnB3X25hbWUpOworCX0KKwlpZiAoZmxhZ3MgJiBNU19VU0VSUykKKwkJbmV3X29wdHMgPSB4c3RyY29uY2F0MyhuZXdfb3B0cywgIix1c2VycyIsICIiKTsKKwkKKwlmb3IgKG9tID0gb3B0X21hcDsgb20tPm9wdCAhPSBOVUxMOyBvbSsrKSB7CisJCWlmIChvbS0+c2tpcCkKKwkJCWNvbnRpbnVlOworCQlpZiAob20tPmludiB8fCAhb20tPm1hc2sgfHwgKGZsYWdzICYgb20tPm1hc2spICE9IG9tLT5tYXNrKQorCQkJY29udGludWU7CisJCW5ld19vcHRzID0geHN0cmNvbmNhdDMobmV3X29wdHMsICIsIiwgb20tPm9wdCk7CisJCWZsYWdzICY9IH5vbS0+bWFzazsKKwl9CisJaWYgKGV4dHJhX29wdHMgJiYgKmV4dHJhX29wdHMpIHsKKwkJbmV3X29wdHMgPSB4c3RyY29uY2F0MyhuZXdfb3B0cywgIiwiLCBleHRyYV9vcHRzKTsKKwl9CisJcmV0dXJuIG5ld19vcHRzOworfQorCisvKiBDcmVhdGUgbXRhYiB3aXRoIGEgcm9vdCBlbnRyeS4gICovCitzdGF0aWMgdm9pZAorY3JlYXRlX210YWIgKHZvaWQpIHsKKwlzdHJ1Y3QgbW50ZW50Y2huICpmc3RhYjsKKwlzdHJ1Y3QgbW50ZW50IG1udDsKKwlpbnQgZmxhZ3M7CisJbW50RklMRSAqbWZwOworCisJbG9ja19tdGFiKCk7CisKKwltZnAgPSBuZnNfc2V0bW50ZW50IChNT1VOVEVELCAiYSsiKTsKKwlpZiAobWZwID09IE5VTEwgfHwgbWZwLT5tbnRlbnRfZnAgPT0gTlVMTCkgeworCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJZGllIChFWF9GSUxFSU8sIF8oIm1vdW50OiBjYW4ndCBvcGVuICVzIGZvciB3cml0aW5nOiAlcyIpLAorCQkgICAgIE1PVU5URUQsIHN0cmVycm9yIChlcnJzdikpOworCX0KKworCS8qIEZpbmQgdGhlIHJvb3QgZW50cnkgYnkgbG9va2luZyBpdCB1cCBpbiBmc3RhYiAqLworCWlmICgoZnN0YWIgPSBnZXRmc2ZpbGUgKCIvIikpIHx8IChmc3RhYiA9IGdldGZzZmlsZSAoInJvb3QiKSkpIHsKKwkJY2hhciAqZXh0cmFfb3B0czsKKwkJcGFyc2Vfb3B0cyAoZnN0YWItPm0ubW50X29wdHMsICZmbGFncywgJmV4dHJhX29wdHMpOworCQltbnQubW50X2RpciA9ICIvIjsKKwkJbW50Lm1udF9mc25hbWUgPSB4c3RyZHVwKGZzdGFiLT5tLm1udF9mc25hbWUpOworCQltbnQubW50X3R5cGUgPSBmc3RhYi0+bS5tbnRfdHlwZTsKKwkJbW50Lm1udF9vcHRzID0gZml4X29wdHNfc3RyaW5nIChmbGFncywgZXh0cmFfb3B0cyk7CisJCW1udC5tbnRfZnJlcSA9IG1udC5tbnRfcGFzc25vID0gMDsKKwkJZnJlZShleHRyYV9vcHRzKTsKKworCQlpZiAobmZzX2FkZG1udGVudCAobWZwLCAmbW50KSA9PSAxKSB7CisJCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJCWRpZSAoRVhfRklMRUlPLCBfKCJtb3VudDogZXJyb3Igd3JpdGluZyAlczogJXMiKSwKKwkJCSAgICAgX1BBVEhfTU9VTlRFRCwgc3RyZXJyb3IgKGVycnN2KSk7CisJCX0KKwl9CisJaWYgKGZjaG1vZCAoZmlsZW5vIChtZnAtPm1udGVudF9mcCksIDA2NDQpIDwgMCkKKwkJaWYgKGVycm5vICE9IEVST0ZTKSB7CisJCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJCWRpZSAoRVhfRklMRUlPLAorCQkJICAgICBfKCJtb3VudDogZXJyb3IgY2hhbmdpbmcgbW9kZSBvZiAlczogJXMiKSwKKwkJCSAgICAgX1BBVEhfTU9VTlRFRCwgc3RyZXJyb3IgKGVycnN2KSk7CisJCX0KKwluZnNfZW5kbW50ZW50IChtZnApOworCisJdW5sb2NrX210YWIoKTsKKworCXJlc2V0X210YWJfaW5mbygpOworfQorCitzdGF0aWMgaW50IGFkZF9tdGFiKGNoYXIgKnNwZWMsIGNoYXIgKm1vdW50X3BvaW50LCBjaGFyICpmc3R5cGUsCisJCQlpbnQgZmxhZ3MsIGNoYXIgKm9wdHMsIGludCBmcmVxLCBpbnQgcGFzcykKK3sKKwlzdHJ1Y3QgbW50ZW50IG1lbnQ7CisJaW50IHJlc3VsdCA9IEVYX1NVQ0NFU1M7CisKKwltZW50Lm1udF9mc25hbWUgPSBzcGVjOworCW1lbnQubW50X2RpciA9IG1vdW50X3BvaW50OworCW1lbnQubW50X3R5cGUgPSBmc3R5cGU7CisJbWVudC5tbnRfb3B0cyA9IGZpeF9vcHRzX3N0cmluZyhmbGFncywgb3B0cyk7CisJbWVudC5tbnRfZnJlcSA9IGZyZXE7CisJbWVudC5tbnRfcGFzc25vID0gcGFzczsKKworCWlmICghbm9tdGFiICYmIG10YWJfZG9lc19ub3RfZXhpc3QoKSkgeworCQlpZiAodmVyYm9zZSA+IDEpCisJCQlwcmludGYoXygibW91bnQ6IG5vICVzIGZvdW5kIC0gY3JlYXRpbmcgaXQuLlxuIiksCisJCQkgICAgICAgTU9VTlRFRCk7CisJCWNyZWF0ZV9tdGFiICgpOworCX0KKworCWlmICghbm9tdGFiICYmIG10YWJfaXNfd3JpdGFibGUoKSkgeworCQlpZiAoZmxhZ3MgJiBNU19SRU1PVU5UKQorCQkJdXBkYXRlX210YWIobWVudC5tbnRfZGlyLCAmbWVudCk7CisJCWVsc2UgeworCQkJbW50RklMRSAqbXRhYjsKKwkJCQorCQkJbG9ja19tdGFiKCk7CisJCQltdGFiID0gbmZzX3NldG1udGVudChNT1VOVEVELCAiYSsiKTsKKwkJCWlmIChtdGFiID09IE5VTEwgfHwgbXRhYi0+bW50ZW50X2ZwID09IE5VTEwpIHsKKwkJCQluZnNfZXJyb3IoXygiQ2FuJ3Qgb3BlbiBtdGFiOiAlcyIpLAorCQkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXN1bHQgPSBFWF9GSUxFSU87CisJCQl9IGVsc2UgeworCQkJCWlmIChuZnNfYWRkbW50ZW50KG10YWIsICZtZW50KSA9PSAxKSB7CisJCQkJCW5mc19lcnJvcihfKCJDYW4ndCB3cml0ZSBtb3VudCBlbnRyeSB0byBtdGFiOiAlcyIpLAorCQkJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQkJCXJlc3VsdCA9IEVYX0ZJTEVJTzsKKwkJCQl9CisJCQl9CisJCQluZnNfZW5kbW50ZW50KG10YWIpOworCQkJdW5sb2NrX210YWIoKTsKKwkJfQorCX0KKworCWZyZWUobWVudC5tbnRfb3B0cyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIG1vdW50X3VzYWdlKHZvaWQpCit7CisJcHJpbnRmKF8oInVzYWdlOiAlcyByZW1vdGV0YXJnZXQgZGlyIFstcnZWd2Zuc2loXSBbLW8gbmZzb3B0aW9uc11cbiIpLAorCQlwcm9nbmFtZSk7CisJcHJpbnRmKF8oIm9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8oIlx0LXJcdFx0TW91bnQgZmlsZSBzeXN0ZW0gcmVhZG9ubHlcbiIpKTsKKwlwcmludGYoXygiXHQtdlx0XHRWZXJib3NlXG4iKSk7CisJcHJpbnRmKF8oIlx0LVZcdFx0UHJpbnQgdmVyc2lvblxuIikpOworCXByaW50ZihfKCJcdC13XHRcdE1vdW50IGZpbGUgc3lzdGVtIHJlYWQtd3JpdGVcbiIpKTsKKwlwcmludGYoXygiXHQtZlx0XHRGYWtlIG1vdW50LCBkbyBub3QgYWN0dWFsbHkgbW91bnRcbiIpKTsKKwlwcmludGYoXygiXHQtblx0XHREbyBub3QgdXBkYXRlIC9ldGMvbXRhYlxuIikpOworCXByaW50ZihfKCJcdC1zXHRcdFRvbGVyYXRlIHNsb3BweSBtb3VudCBvcHRpb25zIHJhdGhlciB0aGFuIGZhaWxcbiIpKTsKKwlwcmludGYoXygiXHQtaFx0XHRQcmludCB0aGlzIGhlbHBcbiIpKTsKKwlwcmludGYoXygiXHRuZnNvcHRpb25zXHRSZWZlciB0byBtb3VudC5uZnMoOCkgb3IgbmZzKDUpXG5cbiIpKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2Vfb3B0KGNvbnN0IGNoYXIgKm9wdCwgaW50ICptYXNrLCBjaGFyICpleHRyYV9vcHRzLCBpbnQgbGVuKQoreworCWNvbnN0IHN0cnVjdCBvcHRfbWFwICpvbTsKKworCWZvciAob20gPSBvcHRfbWFwOyBvbS0+b3B0ICE9IE5VTEw7IG9tKyspIHsKKwkJaWYgKCFzdHJjbXAgKG9wdCwgb20tPm9wdCkpIHsKKwkJCWlmIChvbS0+aW52KQorCQkJCSptYXNrICY9IH5vbS0+bWFzazsKKwkJCWVsc2UKKwkJCQkqbWFzayB8PSBvbS0+bWFzazsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWxlbiAtPSBzdHJsZW4oZXh0cmFfb3B0cyk7CisKKwlpZiAoKmV4dHJhX29wdHMgJiYgLS1sZW4gPiAwKQorCQlzdHJjYXQoZXh0cmFfb3B0cywgIiwiKTsKKworCWlmICgobGVuIC09IHN0cmxlbihvcHQpKSA+IDApCisJCXN0cmNhdChleHRyYV9vcHRzLCBvcHQpOworfQorCisvKgorICogQ29udmVydCB0aGUgcHJvdmlkZWQgbW91bnQgY29tbWFuZC1saW5lIG9wdGlvbnMgaW50byB0aGUgNHRoICYKKyAqIDV0aCBhcmd1bWVudHMgdG8gbW91bnQoMikuICBPdXRwdXQgcGFyYW1ldGVyICJAZmxhZ3MiIGdldHMgdGhlCisgKiBzdGFuZGFyZCBvcHRpb25zIChpbmRpY2F0ZWQgYnkgTVNfIGJpdHMpLCBhbmQgb3V0cHV0IHBhcmFtZXRlcgorICogIkBleHRyYV9vcHRzIiBnZXRzIGFsbCB0aGUgZmlsZXN5c3RlbS1zcGVjaWZpYyBvcHRpb25zLgorICovCitzdGF0aWMgdm9pZCBwYXJzZV9vcHRzKGNvbnN0IGNoYXIgKm9wdGlvbnMsIGludCAqZmxhZ3MsIGNoYXIgKipleHRyYV9vcHRzKQoreworCWlmIChvcHRpb25zICE9IE5VTEwpIHsKKwkJY2hhciAqb3B0cyA9IHhzdHJkdXAob3B0aW9ucyk7CisJCWNoYXIgKm9wdCwgKnA7CisJCWludCBsZW4gPSBzdHJsZW4ob3B0cykgKyAxOwkvKiBpbmNsdWRlIHJvb20gZm9yIGEgbnVsbCAqLworCQlpbnQgb3Blbl9xdW90ZSA9IDA7CisKKwkJKmV4dHJhX29wdHMgPSB4bWFsbG9jKGxlbik7CisJCSoqZXh0cmFfb3B0cyA9ICdcMCc7CisKKwkJZm9yIChwID0gb3B0cywgb3B0ID0gTlVMTDsgcCAmJiAqcDsgcCsrKSB7CisJCQlpZiAoIW9wdCkKKwkJCQlvcHQgPSBwOwkvKiBiZWdpbiBvZiB0aGUgb3B0aW9uIGl0ZW0gKi8KKwkJCWlmICgqcCA9PSAnIicpCisJCQkJb3Blbl9xdW90ZSBePSAxOyAvKiByZXZlcnNlIHRoZSBzdGF0dXMgKi8KKwkJCWlmIChvcGVuX3F1b3RlKQorCQkJCWNvbnRpbnVlOwkvKiBzdGlsbCBpbiBhIHF1b3RlZCBibG9jayAqLworCQkJaWYgKCpwID09ICcsJykKKwkJCQkqcCA9ICdcMCc7CS8qIHRlcm1pbmF0ZSB0aGUgb3B0aW9uIGl0ZW0gKi8KKworCQkJLyogZW5kIG9mIG9wdGlvbiBpdGVtIG9yIGxhc3QgaXRlbSAqLworCQkJaWYgKCpwID09ICdcMCcgfHwgKihwICsgMSkgPT0gJ1wwJykgeworCQkJCXBhcnNlX29wdChvcHQsIGZsYWdzLCAqZXh0cmFfb3B0cywgbGVuKTsKKwkJCQlvcHQgPSBOVUxMOworCQkJfQorCQl9CisJCWZyZWUob3B0cyk7CisJfQorfQorCitzdGF0aWMgaW50IGNoa19tb3VudHBvaW50KGNoYXIgKm1vdW50X3BvaW50KQoreworCXN0cnVjdCBzdGF0IHNiOworCisJaWYgKHN0YXQobW91bnRfcG9pbnQsICZzYikgPCAwKXsKKwkJbW91bnRfZXJyb3IoTlVMTCwgbW91bnRfcG9pbnQsIGVycm5vKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChTX0lTRElSKHNiLnN0X21vZGUpID09IDApeworCQltb3VudF9lcnJvcihOVUxMLCBtb3VudF9wb2ludCwgRU5PVERJUik7CisJCXJldHVybiAxOworCX0KKwlpZiAoYWNjZXNzKG1vdW50X3BvaW50LCBYX09LKSA8IDApIHsKKwkJbW91bnRfZXJyb3IoTlVMTCwgbW91bnRfcG9pbnQsIGVycm5vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X21vdW50KGNoYXIgKnNwZWMsIGNoYXIgKm1vdW50X3BvaW50LCBpbnQgZmxhZ3MsCisJCQljaGFyICpmc190eXBlLCBjaGFyICoqZXh0cmFfb3B0cywgY2hhciAqbW91bnRfb3B0cywKKwkJCWludCBmYWtlLCBpbnQgYmcpCit7CisJaW50IHJldDsKKworCWlmIChzdHJpbmcpCisJCXJldCA9IG5mc21vdW50X3N0cmluZyhzcGVjLCBtb3VudF9wb2ludCwgZnNfdHlwZSwgZmxhZ3MsCisJCQkJCWV4dHJhX29wdHMsIGZha2UsIGJnKTsKKwllbHNlIHsKKwkJaWYgKHN0cmNtcChmc190eXBlLCAibmZzNCIpID09IDApCisJCQlyZXQgPSBuZnM0bW91bnQoc3BlYywgbW91bnRfcG9pbnQsIGZsYWdzLAorCQkJCQlleHRyYV9vcHRzLCBmYWtlLCBiZyk7CisJCWVsc2UKKwkJCXJldCA9IG5mc21vdW50KHNwZWMsIG1vdW50X3BvaW50LCBmbGFncywKKwkJCQkJZXh0cmFfb3B0cywgZmFrZSwgYmcpOworCX0KKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWZha2UpCisJCXByaW50X29uZShzcGVjLCBtb3VudF9wb2ludCwgZnNfdHlwZSwgbW91bnRfb3B0cyk7CisKKwlyZXQgPSBhZGRfbXRhYihzcGVjLCBtb3VudF9wb2ludCwgZnNfdHlwZSwgZmxhZ3MsICpleHRyYV9vcHRzLAorCQkJMCwgMCAvKiB0aGVzZSBhcmUgYWx3YXlzIHplcm8gZm9yIE5GUyAqLyApOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGMsIGZsYWdzID0gMCwgbW50X2VyciA9IDEsIGZha2UgPSAwOworCWNoYXIgKnNwZWMsICptb3VudF9wb2ludCwgKmZzX3R5cGUgPSAibmZzIjsKKwljaGFyICpleHRyYV9vcHRzID0gTlVMTCwgKm1vdW50X29wdHMgPSBOVUxMOworCXVpZF90IHVpZCA9IGdldHVpZCgpOworCisJcHJvZ25hbWUgPSBiYXNlbmFtZShhcmd2WzBdKTsKKworCWRpc2NvdmVyX25mc19tb3VudF9kYXRhX3ZlcnNpb24oKTsKKworCWlmKCFzdHJuY21wKHByb2duYW1lLCAidW1vdW50Iiwgc3RybGVuKCJ1bW91bnQiKSkpCisJCWV4aXQobmZzdW1vdW50KGFyZ2MsIGFyZ3YpKTsKKworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWlmKGFyZ3ZbMV1bMV0gPT0gJ1YnKQorCQkJcHJpbnRmKCIlcyAoIlBBQ0tBR0VfU1RSSU5HIilcbiIsIHByb2duYW1lKTsKKwkJZWxzZQorCQkJbW91bnRfdXNhZ2UoKTsKKwkJZXhpdChFWF9TVUNDRVNTKTsKKwl9CisKKwlpZiAoKGFyZ2MgPCAzKSkgeworCQltb3VudF91c2FnZSgpOworCQlleGl0KEVYX1VTQUdFKTsKKwl9CisKKwlzcGVjID0gYXJndlsxXTsKKwltb3VudF9wb2ludCA9IGFyZ3ZbMl07CisKKwltb3VudF9jb25maWdfaW5pdChwcm9nbmFtZSk7CisKKwlhcmd2WzJdID0gYXJndlswXTsgLyogc28gdGhhdCBnZXRvcHQgZXJyb3IgbWVzc2FnZXMgYXJlIGNvcnJlY3QgKi8KKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjIC0gMiwgYXJndiArIDIsICJydlZ3Zm5vOmhzIiwKKwkJCQlsb25nb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdyJzoKKwkJCWZsYWdzIHw9IE1TX1JET05MWTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCSsrdmVyYm9zZTsKKwkJCWJyZWFrOworCQljYXNlICdWJzoKKwkJCXByaW50ZigiJXM6ICgiUEFDS0FHRV9TVFJJTkciKVxuIiwgcHJvZ25hbWUpOworCQkJZXhpdChFWF9TVUNDRVNTKTsKKwkJY2FzZSAndyc6CisJCQlmbGFncyAmPSB+TVNfUkRPTkxZOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJKytmYWtlOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJKytub210YWI7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6ICAgICAgICAgICAgICAvKiBzcGVjaWZ5IG1vdW50IG9wdGlvbnMgKi8KKwkJCWlmIChtb3VudF9vcHRzKQorCQkJCW1vdW50X29wdHMgPSB4c3RyY29uY2F0Myhtb3VudF9vcHRzLCAiLCIsIG9wdGFyZyk7CisJCQllbHNlCisJCQkJbW91bnRfb3B0cyA9IHhzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCSsrc2xvcHB5OworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQlkZWZhdWx0OgorCQkJbW91bnRfdXNhZ2UoKTsKKwkJCWdvdG8gb3V0X3VzYWdlOworCQl9CisJfQorCisJLyoKKwkgKiBFeHRyYSBub24tb3B0aW9uIHdvcmRzIGF0IHRoZSBlbmQgYXJlIGJvZ3VzLi4uCisJICovCisJaWYgKG9wdGluZCAhPSBhcmdjIC0gMikgeworCQltb3VudF91c2FnZSgpOworCQlnb3RvIG91dF91c2FnZTsKKwl9CisKKwlpZiAoc3RyY21wKHByb2duYW1lLCAibW91bnQubmZzNCIpID09IDApCisJCWZzX3R5cGUgPSAibmZzNCI7CisKKwkvKgorCSAqIElmIGEgbm9uLXJvb3QgdXNlciBpcyBhdHRlbXB0aW5nIHRvIG1vdW50LCBtYWtlIHN1cmUgdGhlCisJICogdXNlcidzIHJlcXVlc3RlZCBvcHRpb25zIG1hdGNoIHRoZSBvcHRpb25zIHNwZWNpZmllZCBpbgorCSAqIC9ldGMvZnN0YWI7IG90aGVyd2lzZSwgZG9uJ3QgYWxsb3cgdGhlIG1vdW50LgorCSAqLworCWlmICh1aWQgIT0gMCkgeworCQlzdHJ1Y3QgbW50ZW50Y2huICptYzsKKworCQlpZiAoKG1jID0gZ2V0ZnNmaWxlKG1vdW50X3BvaW50KSkgPT0gTlVMTCB8fAorCQkgICAgc3RyY21wKG1jLT5tLm1udF9mc25hbWUsIHNwZWMpICE9IDAgfHwKKwkJICAgIHN0cmNtcChtYy0+bS5tbnRfdHlwZSwgZnNfdHlwZSkgIT0gMCkgeworCQkJbmZzX2Vycm9yKF8oIiVzOiBwZXJtaXNzaW9uIGRlbmllZDogbm8gbWF0Y2ggZm9yICVzICIKKwkJCQkiZm91bmQgaW4gL2V0Yy9mc3RhYiIpLCBwcm9nbmFtZSwgbW91bnRfcG9pbnQpOworCQkJZ290byBvdXRfdXNhZ2U7CisJCX0KKworCQkvKgorCQkgKiAnbW91bnQnIG11bmdlcyB0aGUgb3B0aW9ucyBmcm9tIGZzdGFiIGJlZm9yZSBwYXNzaW5nIHRoZW0KKwkJICogdG8gdXMsIHNvIGl0IGlzIG5vbi10cml2aWFsIHRvIHRlc3QgdGhhdCB3ZSBoYXZlIHRoZSBjb3JyZWN0CisJCSAqIHNldCBvZiBvcHRpb25zIGFuZCB3ZSBkb24ndCB3YW50IHRvIHRydXN0IHdoYXQgdGhlIHVzZXIKKwkJICogZ2F2ZSB1cywgc28ganVzdCB0YWtlIHdoYXRldmVyIGlzIGluIC9ldGMvZnN0YWIuCisJCSAqLworCQltb3VudF9vcHRzID0gc3RyZHVwKG1jLT5tLm1udF9vcHRzKTsKKwl9CisKKwltb3VudF9wb2ludCA9IGNhbm9uaWNhbGl6ZShtb3VudF9wb2ludCk7CisJaWYgKCFtb3VudF9wb2ludCkgeworCQluZnNfZXJyb3IoXygiJXM6IG5vIG1vdW50IHBvaW50IHByb3ZpZGVkIiksIHByb2duYW1lKTsKKwkJZ290byBvdXRfdXNhZ2U7CisJfQorCWlmIChtb3VudF9wb2ludFswXSAhPSAnLycpIHsKKwkJbmZzX2Vycm9yKF8oIiVzOiB1bnJlY29nbml6ZWQgbW91bnQgcG9pbnQgJXMiKSwKKwkJCXByb2duYW1lLCBtb3VudF9wb2ludCk7CisJCW1udF9lcnIgPSBFWF9VU0FHRTsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogQ29uY2F0ZW5hdGUgbW91bnQgb3B0aW9ucyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKwkgKi8KKwltb3VudF9vcHRzID0gbW91bnRfY29uZmlnX29wdHMoc3BlYywgbW91bnRfcG9pbnQsIG1vdW50X29wdHMpOworCisJcGFyc2Vfb3B0cyhtb3VudF9vcHRzLCAmZmxhZ3MsICZleHRyYV9vcHRzKTsKKworCWlmICh1aWQgIT0gMCkgeworCQlpZiAoIShmbGFncyAmIChNU19VU0VSU3xNU19VU0VSKSkpIHsKKwkJCW5mc19lcnJvcihfKCIlczogcGVybWlzc2lvbiBkZW5pZWQiKSwgcHJvZ25hbWUpOworCQkJbW50X2VyciA9IEVYX1VTQUdFOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZ2V0ZXVpZCgpICE9IDApIHsKKwkJCW5mc19lcnJvcihfKCIlczogbm90IGluc3RhbGxlZCBzZXR1aWQgLSAiCisJCQkJICAgICJcInVzZXJcIiBORlMgbW91bnRzIG5vdCBzdXBwb3J0ZWQuIiksIHByb2duYW1lKTsKKwkJCWV4aXQoRVhfRkFJTCk7CisJCX0KKwl9CisKKwlpZiAoY2hrX21vdW50cG9pbnQobW91bnRfcG9pbnQpKSB7CisJCW1udF9lcnIgPSBFWF9VU0FHRTsKKwkJZ290byBvdXQ7CisJfQorCisJbW50X2VyciA9IHRyeV9tb3VudChzcGVjLCBtb3VudF9wb2ludCwgZmxhZ3MsIGZzX3R5cGUsICZleHRyYV9vcHRzLAorCQkJCW1vdW50X29wdHMsIGZha2UsIEZPUkVHUk9VTkQpOworCWlmIChtbnRfZXJyID09IEVYX0JHKSB7CisJCXByaW50ZihfKCIlczogYmFja2dyb3VuZGluZyBcIiVzXCJcbiIpLAorCQkJcHJvZ25hbWUsIHNwZWMpOworCQlwcmludGYoXygiJXM6IG1vdW50IG9wdGlvbnM6IFwiJXNcIlxuIiksCisJCQlwcm9nbmFtZSwgZXh0cmFfb3B0cyk7CisKKwkJZmZsdXNoKHN0ZG91dCk7CisKKwkJLyoKKwkJICogUGFyZW50IGV4aXRzIGltbWVkaWF0ZWx5IHdpdGggc3VjY2Vzcy4KKwkJICovCisJCWlmIChkYWVtb24oMCwgMCkpIHsKKwkJCW5mc19lcnJvcihfKCIlczogZmFpbGVkIHRvIHN0YXJ0ICIKKwkJCQkJImJhY2tncm91bmQgcHJvY2VzczogJXNcbiIpLAorCQkJCQkJcHJvZ25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KEVYX0ZBSUwpOworCQl9CisKKwkJbW50X2VyciA9IHRyeV9tb3VudChzcGVjLCBtb3VudF9wb2ludCwgZmxhZ3MsIGZzX3R5cGUsCisJCQkJCSZleHRyYV9vcHRzLCBtb3VudF9vcHRzLCBmYWtlLAorCQkJCQlCQUNLR1JPVU5EKTsKKwkJaWYgKHZlcmJvc2UgJiYgbW50X2VycikKKwkJCXByaW50ZihfKCIlczogZ2l2aW5nIHVwIFwiJXNcIlxuIiksCisJCQkJcHJvZ25hbWUsIHNwZWMpOworCX0KKworb3V0OgorCWZyZWUobW91bnRfb3B0cyk7CisJZnJlZShleHRyYV9vcHRzKTsKKwlmcmVlKG1vdW50X3BvaW50KTsKKwlleGl0KG1udF9lcnIpOworCitvdXRfdXNhZ2U6CisJZnJlZShtb3VudF9vcHRzKTsKKwlleGl0KEVYX1VTQUdFKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9tb3VudC5uZnMubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L21vdW50Lm5mcy5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0NTYxYgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9tb3VudC5uZnMubWFuCkBAIC0wLDAgKzEsODYgQEAKKy5cIkAoIyltb3VudC5uZnMuOCIKKy5USCBNT1VOVC5ORlMgOCAiNSBKdW4gMjAwNiIKKy5TSCBOQU1FCittb3VudC5uZnMsIG1vdW50Lm5mczQgXC0gbW91bnQgYSBOZXR3b3JrIEZpbGUgU3lzdGVtCisuU0ggU1lOT1BTSVMKKy5CSSAibW91bnQubmZzIiAiIHJlbW90ZXRhcmdldCBkaXIiICIgW1wtcnZWd2Zuc2ggXSBbXC1vICIgb3B0aW9ucyAiXQorLlNIIERFU0NSSVBUSU9OCisuQlIgbW91bnQubmZzCitpcyBhIHBhcnQgb2YgCisuQlIgbmZzICg1KQordXRpbGl0aWVzIHBhY2thZ2UsIHdoaWNoIHByb3ZpZGVzIE5GUyBjbGllbnQgZnVuY3Rpb25hbGl0eS4KKworLkJSIG1vdW50Lm5mcyAKK2lzIG1lYW50IHRvIGJlIHVzZWQgYnkgdGhlCisuQlIgbW91bnQgKDgpCitjb21tYW5kIGZvciBtb3VudGluZyBORlMgc2hhcmVzLiBUaGlzIHN1YmNvbW1hbmQsIGhvd2V2ZXIsIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBzdGFuZGFsb25lIGNvbW1hbmQgd2l0aCBsaW1pdGVkIGZ1bmN0aW9uYWxpdHkuCisKKy5CUiBtb3VudC5uZnM0IAoraXMgdXNlZCBmb3IgbW91bnRpbmcgTkZTdjQgZmlsZSBzeXN0ZW0sIHdoaWxlIAorLkJSIG1vdW50Lm5mcyAKK2lzIHVzZWQgdG8gbW91bnQgTkZTIGZpbGUgc3lzdGVtcyB2ZXJzaW9ucyAzIG9yIDIuCisuSSByZW1vdGV0YXJnZXQgCitpcyBhIHNlcnZlciBzaGFyZSB1c3VhbGx5IGluIHRoZSBmb3JtIG9mIAorLkJSIHNlcnZlcm5hbWU6L3BhdGgvdG8vc2hhcmUuCisuSSBkaXIgCitpcyB0aGUgZGlyZWN0b3J5IG9uIHdoaWNoIHRoZSBmaWxlIHN5c3RlbSBpcyB0byBiZSBtb3VudGVkLgorCisuU0ggT1BUSU9OUworLlRQCisuQkkgIlwtciIKK01vdW50IGZpbGUgc3lzdGVtIHJlYWRvbmx5LgorLlRQCisuQkkgIlwtdiIKK0JlIHZlcmJvc2UuCisuVFAKKy5CSSAiXC1WIgorUHJpbnQgdmVyc2lvbi4KKy5UUAorLkJJICJcLXciCitNb3VudCBmaWxlIHN5c3RlbSByZWFkLXdyaXRlLgorLlRQCisuQkkgIlwtZiIKK0Zha2UgbW91bnQuIERvbid0IGFjdHVhbGx5IGNhbGwgdGhlIG1vdW50IHN5c3RlbSBjYWxsLgorLlRQCisuQkkgIlwtbiIKK0RvIG5vdCB1cGRhdGUgCisuSSAvZXRjL210YWIuIAorQnkgZGVmYXVsdCwgYW4gZW50cnkgaXMgY3JlYXRlZCBpbiAKKy5JIC9ldGMvbXRhYiAKK2ZvciBldmVyeSBtb3VudGVkIGZpbGUgc3lzdGVtLiBVc2UgdGhpcyBvcHRpb24gdG8gc2tpcCBtYWtpbmcgYW4gZW50cnkuCisuVFAKKy5CSSAiXC1zIgorVG9sZXJhdGUgc2xvcHB5IG1vdW50IG9wdGlvbnMgcmF0aGVyIHRoYW4gZmFpbC4KKy5UUAorLkJJICJcLWgiCitQcmludCBoZWxwIG1lc3NhZ2UuCisuVFAKKy5CSSAibmZzb3B0aW9ucyIKK1JlZmVyIHRvIAorLkJSIG5mcyAoNSkKK29yCisuQlIgbW91bnQgKDgpIAorbWFudWFsIHBhZ2VzLgorCisuU0ggTk9URQorRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIAorLkJSIG5mcyAoNSkKK2FuZAorLkJSIG1vdW50ICg4KQorbWFudWFsIHBhZ2VzLgorCisuU0ggRklMRVMKKy5UUCAxOG4KKy5JIC9ldGMvZnN0YWIKK2ZpbGUgc3lzdGVtIHRhYmxlCisuVFAKKy5JIC9ldGMvbXRhYgordGFibGUgb2YgbW91bnRlZCBmaWxlIHN5c3RlbXMKKworLlBECisuU0ggIlNFRSBBTFNPIgorLkJSIG5mcyAoNSksCisuQlIgbW91bnQgKDgpLAorCisuU0ggIkFVVEhPUiIKK0FtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbW91bnRfY29uZmlnLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbW91bnRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyMzMwNgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9tb3VudF9jb25maWcuaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIF9MSU5VWF9NT1VOVF9fQ09ORklHX0gKKyNkZWZpbmUgX0xJTlVYX01PVU5UX0NPTkZJR19fSAorLyoKKyAqIG1vdW50X2NvbmZpZy5oIC0tIG1vdW50IGNvbmZpZ3VyYXRpb24gZmlsZSByb3V0aW5lcyAKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMgPG5mc0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworaW5saW5lIHZvaWQgbW91bnRfY29uZmlnX2luaXQoY2hhciAqKTsKKworI2lmZGVmIE1PVU5UX0NPTkZJRworI2luY2x1ZGUgImNvbmZmaWxlLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCitleHRlcm4gY2hhciAqY29uZl9nZXRfbW50b3B0cyhjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKKworaW5saW5lIHZvaWQgbW91bnRfY29uZmlnX2luaXQoY2hhciAqcHJvZ3JhbSkKK3sKKwl4bG9nX29wZW4ocHJvZ3JhbSk7CisJLyoKKwkgKiBSZWFkIHRoZSB0aGUgZGVmYXVsdCBtb3VudCBvcHRpb25zCisJICovCisJY29uZl9pbml0KCk7Cit9CitpbmxpbmUgY2hhciAqbW91bnRfY29uZmlnX29wdHMoY2hhciAqc3BlYywgCisJCWNoYXIgKm1vdW50X3BvaW50LCBjaGFyICptb3VudF9vcHRzKQoreworCXJldHVybiBjb25mX2dldF9tbnRvcHRzKHNwZWMsIG1vdW50X3BvaW50LCBtb3VudF9vcHRzKTsKK30KKyNlbHNlIC8qIE1PVU5UX0NPTkZJRyAqLworCitpbmxpbmUgdm9pZCBtb3VudF9jb25maWdfaW5pdChjaGFyICpwcm9ncmFtKSB7IH0KKworaW5saW5lIGNoYXIgKm1vdW50X2NvbmZpZ19vcHRzKGNoYXIgKnNwZWMsIAorCQljaGFyICptb3VudF9wb2ludCwgY2hhciAqbW91bnRfb3B0cykKK3sKKwlyZXR1cm4gbW91bnRfb3B0czsKK30KKyNlbmRpZiAvKiBNT1VOVF9DT05GSUcgKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L21vdW50X2NvbnN0YW50cy5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L21vdW50X2NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZmIwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbW91bnRfY29uc3RhbnRzLmgKQEAgLTAsMCArMSw2NyBAQAorI2lmbmRlZiBfTkZTX1VUSUxTX01PVU5UX0NPTlNUQU5UU19ICisjZGVmaW5lIF9ORlNfVVRJTFNfTU9VTlRfQ09OU1RBTlRTX0gKKworI2lmbmRlZiBNU19ESVJTWU5DCisjZGVmaW5lIE1TX0RJUlNZTkMJMTI4CS8qIERpcmVjdG9yeSBtb2RpZmljYXRpb25zIGFyZSBzeW5jaHJvbm91cyAqLworI2VuZGlmCisKKyNpZm5kZWYgTVNfQUNUSU9OX01BU0sKKyNkZWZpbmUJTVNfQUNUSU9OX01BU0sJMHgzODAKKy8qIFJlbW91bnQsIGJ1dCBuZXcgZmlsZXN5c3RlbSBtYXkgYmUgZGlmZmVyZW50IGZyb20gb2xkLiBBdG9taWMKKyAgIChpLmUuIHRoZXJlIGlzIG5vIGludGVydmFsIHdoZW4gbm90aGluZyBpcyBtb3VudGVkIGF0IHRoZSBtb3VudHBvaW50KS4KKyAgIElmIG5ldyBmcyBkaWZmZXJzIGZyb20gdGhlIG9sZCBvbmUgYW5kIG9sZCBpcyBidXN5IC0gLUVCVVNZLiAqLworI2RlZmluZQlNU19SRVBMQUNFCTB4MDgwCS8qIDEyOCAqLworLyogQWZ0ZXIsIEJlZm9yZTogYXMgc29vbiBhcyB3ZSBnZXQgdW5pb25zIHRoZXNlIHdpbGwgYWRkIGEgbmV3IG1lbWJlcgorICAgaW4gdGhlIGVuZCBvciBiZWdpbm5pbmcgb2YgdGhlIGNoYWluLiBGYWlsIGlmIHRoZXJlIGlzIGEgc3RhY2sKKyAgIG9uIHRoZSBtb3VudHBvaW50LiAqLworI2RlZmluZQlNU19BRlRFUgkweDEwMAkvKiAyNTYgKi8KKyNkZWZpbmUJTVNfQkVGT1JFCTB4MTgwCisvKiBPdmVyOiBpZiBub3RoaW5nIG1vdW50ZWQgb24gYSBtb3VudHBvaW50IC0gc2FtZSBhcyBpZiBub25lIG9mIHRoZXNlCitmbGFncyBoYWQgYmVlbiBzZXQ7IGlmIHdlIGhhdmUgYSB1bmlvbiB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudCAtIGZhaWw7CitpZiB3ZSBoYXZlIGEgc3RhY2sgb3IgcGxhaW4gbW91bnQgLSBtb3VudCBhdG9wIG9mIGl0LCBmb3JtaW5nIGEgc3RhY2suICovCisjZGVmaW5lCU1TX09WRVIJCTB4MjAwCS8qIDUxMiAqLworI2VuZGlmCisjaWZuZGVmIE1TX05PQVRJTUUKKyNkZWZpbmUgTVNfTk9BVElNRQkweDQwMAkvKiAxMDI0OiBEbyBub3QgdXBkYXRlIGFjY2VzcyB0aW1lcy4gKi8KKyNlbmRpZgorI2lmbmRlZiBNU19OT0RJUkFUSU1FCisjZGVmaW5lIE1TX05PRElSQVRJTUUgICAweDgwMAkvKiAyMDQ4OiBEb24ndCB1cGRhdGUgZGlyZWN0b3J5IGFjY2VzcyB0aW1lcyAqLworI2VuZGlmCisjaWZuZGVmIE1TX0JJTkQKKyNkZWZpbmUJTVNfQklORAkJMHgxMDAwCS8qIDQwOTY6IE1vdW50IGV4aXN0aW5nIHRyZWUgYWxzbyBlbHNld2hlcmUgKi8KKyNlbmRpZgorI2lmbmRlZiBNU19NT1ZFCisjZGVmaW5lIE1TX01PVkUJCTB4MjAwMAkvKiA4MTkyOiBBdG9taWNhbGx5IG1vdmUgdHJlZSAqLworI2VuZGlmCisjaWZuZGVmIE1TX1JFQworI2RlZmluZSBNU19SRUMJCTB4NDAwMAkvKiAxNjM4NDogUmVjdXJzaXZlIGxvb3BiYWNrICovCisjZW5kaWYKKyNpZm5kZWYgTVNfVkVSQk9TRQorI2RlZmluZSBNU19WRVJCT1NFCTB4ODAwMAkvKiAzMjc2OCAqLworI2VuZGlmCisjaWZuZGVmIE1TX1JFTEFUSU1FCisjZGVmaW5lIE1TX1JFTEFUSU1FIDB4MjAwMDAwIC8qIDIwMDAwMDogVXBkYXRlIGFjY2VzcyB0aW1lcyByZWxhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIG10aW1lL2N0aW1lICovCisjZW5kaWYKKy8qCisgKiBORlMgZnMtc3BlY2lmaWMgbW91bnQgb3B0aW9uIGZsYWdzCisgKgorICogTVNfRFVNTVkgaXMgYXNzaWduZWQgdG8gbW91bnQgb3B0aW9ucyB0aGF0IGFyZSBub3QgdG8gYmUKKyAqIHBhc3NlZCB0byB0aGUga2VybmVsIHZpYSB0aGUgImZsYWdzIiBhcmd1bWVudC4gIFRoZXNlIGFyZQorICogZ2VuZXJhbGx5IGlnbm9yZWQgb3IgaGFuZGxlZCBlbnRpcmVseSBpbiB1c2VyIHNwYWNlLgorICovCisjZGVmaW5lIE1TX0RVTU1ZCTB4MDAwMDAwMDAKKyNkZWZpbmUgTVNfVVNFUlMJMHg0MDAwMDAwMAorI2RlZmluZSBNU19VU0VSCQkweDgwMDAwMDAwCisKKy8qCisgKiBNYWdpYyBtb3VudCBmbGFnIG51bWJlci4gSGFkIHRvIGJlIG9yLWVkIHRvIHRoZSBmbGFnIHZhbHVlcy4KKyAqLworI2lmbmRlZiBNU19NR0NfVkFMCisjZGVmaW5lIE1TX01HQ19WQUwgMHhDMEVEMDAwMAkvKiBtYWdpYyBmbGFnIG51bWJlciB0byBpbmRpY2F0ZSAibmV3IiBmbGFncyAqLworI2VuZGlmCisjaWZuZGVmIE1TX01HQ19NU0sKKyNkZWZpbmUgTVNfTUdDX01TSyAweGZmZmYwMDAwCS8qIG1hZ2ljIGZsYWcgbnVtYmVyIG1hc2sgKi8KKyNlbmRpZgorCisjZW5kaWYJLyogX05GU19VVElMU19NT1VOVF9DT05TVEFOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25ldHdvcmsuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZXR3b3JrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjMTgzYQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZXR3b3JrLmMKQEAgLTAsMCArMSwxNTgwIEBACisvKgorICogbmV0d29yay5jIC0tIFByb3ZpZGUgY29tbW9uIG5ldHdvcmsgZnVuY3Rpb25zIGZvciBORlMgbW91bnQvdW1vdW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQ2h1Y2sgTGV2ZXIgPGNodWNrLmxldmVyQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9wcm90Lmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJ4Y29tbW9uLmgiCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJubHMuaCIKKyNpbmNsdWRlICJuZnNfbW91bnQuaCIKKyNpbmNsdWRlICJtb3VudF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJuZnNycGMuaCIKKyNpbmNsdWRlICJwYXJzZV9vcHQuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAiY29uZmZpbGUuaCIKKworI2RlZmluZSBQTUFQX1RJTUVPVVQJKDEwKQorI2RlZmluZSBDT05ORUNUX1RJTUVPVVQJKDIwKQorI2RlZmluZSBNT1VOVF9USU1FT1VUCSgzMCkKKworZXh0ZXJuIGludCBuZnNfbW91bnRfZGF0YV92ZXJzaW9uOworZXh0ZXJuIGNoYXIgKnByb2duYW1lOworZXh0ZXJuIGludCB2ZXJib3NlOworCitzdGF0aWMgY29uc3QgY2hhciAqbmZzX25zX3BnbXRibFtdID0geworCSJzdGF0dXMiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbmZzX21udF9wZ210YmxbXSA9IHsKKwkibW91bnQiLAorCSJtb3VudGQiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbmZzX25mc19wZ210YmxbXSA9IHsKKwkibmZzIiwKKwkibmZzcHJvZyIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpuZnNfdHJhbnNwb3J0X29wdHRibFtdID0geworCSJ1ZHAiLAorCSJ0Y3AiLAorCSJwcm90byIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpuZnNfdmVyc2lvbl9vcHR0YmxbXSA9IHsKKwkidjIiLAorCSJ2MyIsCisJInY0IiwKKwkidmVycyIsCisJIm5mc3ZlcnMiLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBuZnNfdG9fbW50W10gPSB7CisJMCwKKwkwLAorCTEsCisJMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG1udF90b19uZnNbXSA9IHsKKwkwLAorCTIsCisJMiwKKwkzLAorfTsKKworLyoKKyAqIE1hcCBhbiBORlMgdmVyc2lvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIE1vdW50ZCB2ZXJzaW9uCisgKi8KK3Vuc2lnbmVkIGxvbmcgbmZzdmVyc190b19tbnQoY29uc3QgdW5zaWduZWQgbG9uZyB2ZXJzKQoreworCWlmICh2ZXJzIDw9IDMpCisJCXJldHVybiBuZnNfdG9fbW50W3ZlcnNdOworCXJldHVybiAwOworfQorCisvKgorICogTWFwIGEgTW91bnRkIHZlcnNpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBORlMgdmVyc2lvbgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbnR2ZXJzX3RvX25mcyhjb25zdCB1bnNpZ25lZCBsb25nIHZlcnMpCit7CisJaWYgKHZlcnMgPD0gMykKKwkJcmV0dXJuIG1udF90b19uZnNbdmVyc107CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHJvYmVfdWRwX29ubHlbXSA9IHsKKwlJUFBST1RPX1VEUCwKKwkwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwcm9iZV91ZHBfZmlyc3RbXSA9IHsKKwlJUFBST1RPX1VEUCwKKwlJUFBST1RPX1RDUCwKKwkwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwcm9iZV90Y3BfZmlyc3RbXSA9IHsKKwlJUFBST1RPX1RDUCwKKwlJUFBST1RPX1VEUCwKKwkwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvYmVfbmZzMl9vbmx5W10gPSB7CisJMiwKKwkwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvYmVfbmZzM19maXJzdFtdID0geworCTMsCisJMiwKKwkwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvYmVfbW50MV9maXJzdFtdID0geworCTEsCisJMiwKKwkwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvYmVfbW50M19maXJzdFtdID0geworCTMsCisJMSwKKwkyLAorCTAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ICpuZnNfZGVmYXVsdF9wcm90byh2b2lkKTsKKyNpZmRlZiBNT1VOVF9DT05GSUcKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgKm5mc19kZWZhdWx0X3Byb3RvKCkKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBjb25maWdfZGVmYXVsdF9wcm90bzsKKwkvKgorCSAqIElmIHRoZSBkZWZhdWx0IHByb3RvIGhhcyBiZWVuIHNldCBhbmQgCisJICogaXRzIG5vdCBUQ1AsIHN0YXJ0IHdpdGggVURQCisJICovCisJaWYgKGNvbmZpZ19kZWZhdWx0X3Byb3RvICYmIGNvbmZpZ19kZWZhdWx0X3Byb3RvICE9IElQUFJPVE9fVENQKQorCQlyZXR1cm4gcHJvYmVfdWRwX2ZpcnN0OworCisJcmV0dXJuIHByb2JlX3RjcF9maXJzdDsgCit9CisjZWxzZQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCAqbmZzX2RlZmF1bHRfcHJvdG8oKSAKK3sKKwlyZXR1cm4gcHJvYmVfdGNwX2ZpcnN0OyAKK30KKyNlbmRpZiAvKiBNT1VOVF9DT05GSUcgKi8KKworLyoqCisgKiBuZnNfbG9va3VwIC0gcmVzb2x2ZSBob3N0bmFtZSB0byBhbiBJUHY0IG9yIElQdjYgc29ja2V0IGFkZHJlc3MKKyAqIEBob3N0bmFtZTogcG9pbnRlciB0byBDIHN0cmluZyBjb250YWluaW5nIEROUyBob3N0bmFtZSB0byByZXNvbHZlCisgKiBAZmFtaWx5OiBhZGRyZXNzIGZhbWlseSBoaW50CisgKiBAc2FwOiBwb2ludGVyIHRvIGJ1ZmZlciB0byBmaWxsIHdpdGggc29ja2V0IGFkZHJlc3MKKyAqIEBsZW46IElOOiBzaXplIG9mIGJ1ZmZlciB0byBmaWxsOyBPVVQ6IHNpemUgb2Ygc29ja2V0IGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIDEgYW5kIHBsYWNlcyBhIHNvY2tldCBhZGRyZXNzIGF0IEBzYXAgaWYgc3VjY2Vzc2Z1bDsKKyAqIG90aGVyd2lzZSB6ZXJvLgorICovCitpbnQgbmZzX2xvb2t1cChjb25zdCBjaGFyICpob3N0bmFtZSwgY29uc3Qgc2FfZmFtaWx5X3QgZmFtaWx5LAorCQlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgc29ja2xlbl90ICpzYWxlbikKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gKmdhaV9yZXN1bHRzOworCXN0cnVjdCBhZGRyaW5mbyBnYWlfaGludCA9IHsKKyNpZmRlZiBIQVZFX0RFQ0xfQUlfQUREUkNPTkZJRworCQkuYWlfZmxhZ3MJPSBBSV9BRERSQ09ORklHLAorI2VuZGlmCS8qIEhBVkVfREVDTF9BSV9BRERSQ09ORklHICovCisJCS5haV9mYW1pbHkJPSBmYW1pbHksCisJfTsKKwlzb2NrbGVuX3QgbGVuID0gKnNhbGVuOworCWludCBlcnJvciwgcmV0ID0gMDsKKworCSpzYWxlbiA9IDA7CisKKwllcnJvciA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMLCAmZ2FpX2hpbnQsICZnYWlfcmVzdWx0cyk7CisJc3dpdGNoIChlcnJvcikgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSBFQUlfU1lTVEVNOgorCQluZnNfZXJyb3IoXygiJXM6IEROUyByZXNvbHV0aW9uIGZhaWxlZCBmb3IgJXM6ICVzIiksCisJCQlwcm9nbmFtZSwgaG9zdG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJbmZzX2Vycm9yKF8oIiVzOiBETlMgcmVzb2x1dGlvbiBmYWlsZWQgZm9yICVzOiAlcyIpLAorCQkJcHJvZ25hbWUsIGhvc3RuYW1lLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzd2l0Y2ggKGdhaV9yZXN1bHRzLT5haV9hZGRyLT5zYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJY2FzZSBBRl9JTkVUNjoKKwkJaWYgKGxlbiA+PSBnYWlfcmVzdWx0cy0+YWlfYWRkcmxlbikgeworCQkJKnNhbGVuID0gZ2FpX3Jlc3VsdHMtPmFpX2FkZHJsZW47CisJCQltZW1jcHkoc2FwLCBnYWlfcmVzdWx0cy0+YWlfYWRkciwgKnNhbGVuKTsKKwkJCXJldCA9IDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogdGhpbmdzIGFyZSByZWFsbHkgYnJva2VuIGlmIHdlIGdldCBoZXJlLCBzbyB3YXJuICovCisJCW5mc19lcnJvcihfKCIlczogdW5yZWNvZ25pemVkIEROUyByZXNvbHV0aW9uIHJlc3VsdHMgZm9yICVzIiksCisJCQkJcHJvZ25hbWUsIGhvc3RuYW1lKTsKKwkJYnJlYWs7CisJfQorCisJZnJlZWFkZHJpbmZvKGdhaV9yZXN1bHRzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG5mc19nZXRob3N0YnluYW1lIC0gcmVzb2x2ZSBhIGhvc3RuYW1lIHRvIGFuIElQdjQgYWRkcmVzcworICogQGhvc3RuYW1lOiBwb2ludGVyIHRvIGEgQyBzdHJpbmcgY29udGFpbmluZyBhIEROUyBob3N0bmFtZQorICogQHNpbjogcmV0dXJucyBhbiBJUHY0IGFkZHJlc3MgCisgKgorICogUmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB6ZXJvLgorICovCitpbnQgbmZzX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXNvY2tsZW5fdCBsZW4gPSBzaXplb2YoKnNpbik7CisKKwlyZXR1cm4gbmZzX2xvb2t1cChob3N0bmFtZSwgQUZfSU5FVCwgKHN0cnVjdCBzb2NrYWRkciAqKXNpbiwgJmxlbik7Cit9CisKKy8qKgorICogbmZzX3N0cmluZ190b19zb2NrYWRkciAtIGNvbnZlcnQgc3RyaW5nIGFkZHJlc3MgdG8gc29ja2FkZHIKKyAqIEBhZGRyZXNzOglwb2ludGVyIHRvIHByZXNlbnRhdGlvbiBmb3JtYXQgYWRkcmVzcyB0byBjb252ZXJ0CisgKiBAc2FwOglwb2ludGVyIHRvIHNvY2tldCBhZGRyZXNzIGJ1ZmZlciB0byBmaWxsIGluCisgKiBAc2FsZW46CUlOOiBsZW5ndGggb2YgYWRkcmVzcyBidWZmZXIKKyAqCQlPVVQ6IGxlbmd0aCBvZiBjb252ZXJ0ZWQgc29ja2V0IGFkZHJlc3MKKyAqCisgKiBDb252ZXJ0IGEgcHJlc2VudGF0aW9uIGZvcm1hdCBhZGRyZXNzIHN0cmluZyB0byBhIHNvY2tldCBhZGRyZXNzLgorICogU2ltaWxhciB0byBuZnNfbG9va3VwKCksIGJ1dCB0aGUgRE5TIHF1ZXJ5IGlzIHNxdWVsY2hlZCwgYW5kIGl0CisgKiB3b24ndCBtYWtlIGFueSBub2lzZSBpZiB0aGUgZ2V0YWRkcmluZm8oKSBjYWxsIGZhaWxzLgorICoKKyAqIFJldHVybnMgMSBhbmQgZmlsbHMgaW4gQHNhcCBhbmQgQHNhbGVuIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSB6ZXJvLgorICoKKyAqIFNlZSBSRkMgNDAzOCBzZWN0aW9uIDUuMSBvciBSRkMgMzUxMyBzZWN0aW9uIDIuMiBmb3IgbW9yZSBkZXRhaWxzCisgKiBvbiBwcmVzZW50aW5nIElQdjYgYWRkcmVzc2VzIGFzIHRleHQgc3RyaW5ncy4KKyAqLworaW50IG5mc19zdHJpbmdfdG9fc29ja2FkZHIoY29uc3QgY2hhciAqYWRkcmVzcywgc3RydWN0IHNvY2thZGRyICpzYXAsCisJCQkgICBzb2NrbGVuX3QgKnNhbGVuKQoreworCXN0cnVjdCBhZGRyaW5mbyAqZ2FpX3Jlc3VsdHM7CisJc3RydWN0IGFkZHJpbmZvIGdhaV9oaW50ID0geworCQkuYWlfZmxhZ3MJPSBBSV9OVU1FUklDSE9TVCwKKwl9OworCXNvY2tsZW5fdCBsZW4gPSAqc2FsZW47CisJaW50IHJldCA9IDA7CisKKwkqc2FsZW4gPSAwOworCisJaWYgKGdldGFkZHJpbmZvKGFkZHJlc3MsIE5VTEwsICZnYWlfaGludCwgJmdhaV9yZXN1bHRzKSA9PSAwKSB7CisJCXN3aXRjaCAoZ2FpX3Jlc3VsdHMtPmFpX2FkZHItPnNhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCWNhc2UgQUZfSU5FVDY6CisJCQlpZiAobGVuID49IGdhaV9yZXN1bHRzLT5haV9hZGRybGVuKSB7CisJCQkJKnNhbGVuID0gZ2FpX3Jlc3VsdHMtPmFpX2FkZHJsZW47CisJCQkJbWVtY3B5KHNhcCwgZ2FpX3Jlc3VsdHMtPmFpX2FkZHIsICpzYWxlbik7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWZyZWVhZGRyaW5mbyhnYWlfcmVzdWx0cyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBuZnNfcHJlc2VudF9zb2NrYWRkciAtIGNvbnZlcnQgc29ja2FkZHIgdG8gc3RyaW5nCisgKiBAc2FwOiBwb2ludGVyIHRvIHNvY2tldCBhZGRyZXNzIHRvIGNvbnZlcnQKKyAqIEBzYWxlbjogbGVuZ3RoIG9mIHNvY2tldCBhZGRyZXNzCisgKiBAYnVmOiBwb2ludGVyIHRvIGJ1ZmZlciB0byBmaWxsIGluCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgYnVmZmVyCisgKgorICogQ29udmVydCB0aGUgcGFzc2VkLWluIHNvY2thZGRyLXN0eWxlIGFkZHJlc3MgdG8gcHJlc2VudGF0aW9uIGZvcm1hdC4KKyAqIFRoZSBwcmVzZW50YXRpb24gZm9ybWF0IGFkZHJlc3MgaXMgcGxhY2VkIGluIEBidWYgYW5kIGlzCisgKiAnXDAnLXRlcm1pbmF0ZWQuCisgKgorICogUmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSB6ZXJvLgorICoKKyAqIFNlZSBSRkMgNDAzOCBzZWN0aW9uIDUuMSBvciBSRkMgMzUxMyBzZWN0aW9uIDIuMiBmb3IgbW9yZSBkZXRhaWxzCisgKiBvbiBwcmVzZW50aW5nIElQdjYgYWRkcmVzc2VzIGFzIHRleHQgc3RyaW5ncy4KKyAqLworaW50IG5mc19wcmVzZW50X3NvY2thZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCBzb2NrbGVuX3Qgc2FsZW4sCisJCQkgY2hhciAqYnVmLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworI2lmZGVmIEhBVkVfR0VUTkFNRUlORk8KKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gZ2V0bmFtZWluZm8oc2FwLCBzYWxlbiwgYnVmLCBidWZsZW4sCisJCQkJCU5VTEwsIDAsIE5JX05VTUVSSUNIT1NUKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIDE7CisKKwluZnNfZXJyb3IoXygiJXM6IGludmFsaWQgc2VydmVyIGFkZHJlc3M6ICVzIiksIHByb2duYW1lLAorCQkJZ2FpX3N0cmVycm9yKHJlc3VsdCkpOworCXJldHVybiAwOworI2Vsc2UJLyogSEFWRV9HRVROQU1FSU5GTyAqLworCWNoYXIgKmFkZHI7CisKKwlpZiAoc2FwLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlhZGRyID0gaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopc2FwKS0+c2luX2FkZHIpOworCQlpZiAoYWRkciAmJiBzdHJsZW4oYWRkcikgPCBidWZsZW4pIHsKKwkJCXN0cmNweShidWYsIGFkZHIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwluZnNfZXJyb3IoXygiJXM6IGludmFsaWQgc2VydmVyIGFkZHJlc3MiKSwgcHJvZ25hbWUpOworCXJldHVybiAwOworI2VuZGlmCS8qIEhBVkVfR0VUTkFNRUlORk8gKi8KK30KKworLyoKKyAqIEF0dGVtcHQgdG8gY29ubmVjdCBhIHNvY2tldCwgYnV0IHRpbWUgb3V0IGFmdGVyICJ0aW1lb3V0IiBzZWNvbmRzLgorICoKKyAqIE9uIGVycm9yIHJldHVybiwgY2FsbGVyIGNsb3NlcyB0aGUgc29ja2V0LgorICovCitzdGF0aWMgaW50IGNvbm5lY3RfdG8oaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQlzb2NrbGVuX3QgYWRkcmxlbiwgaW50IHRpbWVvdXQpCit7CisJaW50IHJldCwgc2F2ZWQ7CisJZmRfc2V0IHJzZXQsIHdzZXQ7CisJc3RydWN0IHRpbWV2YWwgdHYgPSB7CisJCS50dl9zZWMgPSB0aW1lb3V0LAorCX07CisKKwlzYXZlZCA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKKwlmY250bChmZCwgRl9TRVRGTCwgc2F2ZWQgfCBPX05PTkJMT0NLKTsKKworCXJldCA9IGNvbm5lY3QoZmQsIGFkZHIsIGFkZHJsZW4pOworCWlmIChyZXQgPCAwICYmIGVycm5vICE9IEVJTlBST0dSRVNTKQorCQlyZXR1cm4gLTE7CisJaWYgKHJldCA9PSAwKQorCQlnb3RvIG91dDsKKworCUZEX1pFUk8oJnJzZXQpOworCUZEX1NFVChmZCwgJnJzZXQpOworCXdzZXQgPSByc2V0OworCXJldCA9IHNlbGVjdChmZCArIDEsICZyc2V0LCAmd3NldCwgTlVMTCwgJnR2KTsKKwlpZiAocmV0ID09IDApIHsKKwkJZXJybm8gPSBFVElNRURPVVQ7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKEZEX0lTU0VUKGZkLCAmcnNldCkgfHwgRkRfSVNTRVQoZmQsICZ3c2V0KSkgeworCQlpbnQgZXJyb3I7CisJCXNvY2tsZW5fdCBsZW4gPSBzaXplb2YoZXJyb3IpOworCQlpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnJvciwgJmxlbikgPCAwKQorCQkJcmV0dXJuIC0xOworCQlpZiAoZXJyb3IpIHsKKwkJCWVycm5vID0gZXJyb3I7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuIC0xOworCitvdXQ6CisJZmNudGwoZmQsIEZfU0VURkwsIHNhdmVkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENyZWF0ZSBhIHNvY2tldCB0aGF0IGlzIGxvY2FsbHkgYm91bmQgdG8gYSByZXNlcnZlZCBvciBub24tcmVzZXJ2ZWQgcG9ydC4KKyAqCisgKiBUaGUgY2FsbGVyIHNob3VsZCBjaGVjayBycGNfY3JlYXRlZXJyIHRvIGRldGVybWluZSB0aGUgY2F1c2Ugb2YgYW55IGVycm9yLgorICovCitzdGF0aWMgaW50IGdldF9zb2NrZXQoc3RydWN0IHNvY2thZGRyX2luICpzYWRkciwgdW5zaWduZWQgaW50IHBfcHJvdCwKKwkJCXVuc2lnbmVkIGludCB0aW1lb3V0LCBpbnQgcmVzdnAsIGludCBjb25uKQoreworCWludCBzbywgY2MsIHR5cGU7CisJc3RydWN0IHNvY2thZGRyX2luIGxhZGRyOworCXNvY2tsZW5fdCBuYW1lbGVuID0gc2l6ZW9mKGxhZGRyKTsKKworCXR5cGUgPSAocF9wcm90ID09IElQUFJPVE9fVURQID8gU09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNKTsKKwlpZiAoKHNvID0gc29ja2V0IChBRl9JTkVULCB0eXBlLCBwX3Byb3QpKSA8IDApCisJCWdvdG8gZXJyX3NvY2tldDsKKworCWxhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWxhZGRyLnNpbl9wb3J0ID0gMDsKKwlsYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKwlpZiAocmVzdnApIHsKKwkJaWYgKGJpbmRyZXN2cG9ydChzbywgJmxhZGRyKSA8IDApCisJCQlnb3RvIGVycl9iaW5kcmVzdnBvcnQ7CisJfSBlbHNlIHsKKwkJY2MgPSBiaW5kKHNvLCAoc3RydWN0IHNvY2thZGRyICopJmxhZGRyLCBuYW1lbGVuKTsKKwkJaWYgKGNjIDwgMCkKKwkJCWdvdG8gZXJyX2JpbmQ7CisJfQorCWlmICh0eXBlID09IFNPQ0tfU1RSRUFNIHx8IChjb25uICYmIHR5cGUgPT0gU09DS19ER1JBTSkpIHsKKwkJY2MgPSBjb25uZWN0X3RvKHNvLCAoc3RydWN0IHNvY2thZGRyICopc2FkZHIsIG5hbWVsZW4sCisJCQkJdGltZW91dCk7CisJCWlmIChjYyA8IDApCisJCQlnb3RvIGVycl9jb25uZWN0OworCX0KKwlyZXR1cm4gc287CisKK2Vycl9zb2NrZXQ6CisJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gUlBDX1NZU1RFTUVSUk9SOworCXJwY19jcmVhdGVlcnIuY2ZfZXJyb3IucmVfZXJybm8gPSBlcnJubzsKKwlpZiAodmVyYm9zZSkgeworCQluZnNfZXJyb3IoXygiJXM6IFVuYWJsZSB0byBjcmVhdGUgJXMgc29ja2V0OiBlcnJubyAlZCAoJXMpXG4iKSwKKwkJCXByb2duYW1lLCBwX3Byb3QgPT0gSVBQUk9UT19VRFAgPyBfKCJVRFAiKSA6IF8oIlRDUCIpLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJfQorCXJldHVybiBSUENfQU5ZU09DSzsKKworZXJyX2JpbmRyZXN2cG9ydDoKKwlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfU1lTVEVNRVJST1I7CisJcnBjX2NyZWF0ZWVyci5jZl9lcnJvci5yZV9lcnJubyA9IGVycm5vOworCWlmICh2ZXJib3NlKSB7CisJCW5mc19lcnJvcihfKCIlczogVW5hYmxlIHRvIGJpbmRyZXN2cG9ydCAlcyBzb2NrZXQ6IGVycm5vICVkIgorCQkJCSIgKCVzKVxuIiksCisJCQlwcm9nbmFtZSwgcF9wcm90ID09IElQUFJPVE9fVURQID8gXygiVURQIikgOiBfKCJUQ1AiKSwKKwkJCWVycm5vLCBzdHJlcnJvcihlcnJubykpOworCX0KKwljbG9zZShzbyk7CisJcmV0dXJuIFJQQ19BTllTT0NLOworCitlcnJfYmluZDoKKwlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBSUENfU1lTVEVNRVJST1I7CisJcnBjX2NyZWF0ZWVyci5jZl9lcnJvci5yZV9lcnJubyA9IGVycm5vOworCWlmICh2ZXJib3NlKSB7CisJCW5mc19lcnJvcihfKCIlczogVW5hYmxlIHRvIGJpbmQgdG8gJXMgc29ja2V0OiBlcnJubyAlZCAoJXMpXG4iKSwKKwkJCXByb2duYW1lLCBwX3Byb3QgPT0gSVBQUk9UT19VRFAgPyBfKCJVRFAiKSA6IF8oIlRDUCIpLAorCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWNsb3NlKHNvKTsKKwlyZXR1cm4gUlBDX0FOWVNPQ0s7CisKK2Vycl9jb25uZWN0OgorCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19TWVNURU1FUlJPUjsKKwlycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vID0gZXJybm87CisJaWYgKHZlcmJvc2UpIHsKKwkJbmZzX2Vycm9yKF8oIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byAlczolZCwgZXJybm8gJWQgKCVzKVxuIiksCisJCQlwcm9nbmFtZSwgaW5ldF9udG9hKHNhZGRyLT5zaW5fYWRkciksCisJCQludG9ocyhzYWRkci0+c2luX3BvcnQpLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisJY2xvc2Uoc28pOworCXJldHVybiBSUENfQU5ZU09DSzsKK30KKworc3RhdGljIHZvaWQgbmZzX3BwX2RlYnVnKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCBzb2NrbGVuX3Qgc2FsZW4sCisJCQkgY29uc3QgcnBjcHJvZ190IHByb2dyYW0sIGNvbnN0IHJwY3ZlcnNfdCB2ZXJzaW9uLAorCQkJIGNvbnN0IHVuc2lnbmVkIHNob3J0IHByb3RvY29sLAorCQkJIGNvbnN0IHVuc2lnbmVkIHNob3J0IHBvcnQpCit7CisJY2hhciBidWZbTklfTUFYSE9TVF07CisKKwlpZiAoIXZlcmJvc2UpCisJCXJldHVybjsKKworCWlmIChuZnNfcHJlc2VudF9zb2NrYWRkcihzYXAsIHNhbGVuLCBidWYsIHNpemVvZihidWYpKSA9PSAwKSB7CisJCWJ1ZlswXSA9ICdcMCc7CisJCXN0cmNhdChidWYsICJ1bmtub3duIGhvc3QiKTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgXygiJXM6IHRyeWluZyAlcyBwcm9nICVsdSB2ZXJzICVsdSBwcm90ICVzIHBvcnQgJWRcbiIpLAorCQkJcHJvZ25hbWUsIGJ1ZiwgKHVuc2lnbmVkIGxvbmcpcHJvZ3JhbSwKKwkJCSh1bnNpZ25lZCBsb25nKXZlcnNpb24sCisJCQkocHJvdG9jb2wgPT0gSVBQUk9UT19VRFAgPyBfKCJVRFAiKSA6IF8oIlRDUCIpKSwKKwkJCXBvcnQpOworfQorCitzdGF0aWMgdm9pZCBuZnNfcHBfZGVidWcyKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoIXZlcmJvc2UpCisJCXJldHVybjsKKworCWlmIChycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX3N0YXR1cyA9PSBSUENfQ0FOVFJFQ1YgfHwKKwkgICAgcnBjX2NyZWF0ZWVyci5jZl9lcnJvci5yZV9zdGF0dXMgPT0gUlBDX0NBTlRTRU5EKQorCQluZnNfZXJyb3IoXygiJXM6IHBvcnRtYXAgcXVlcnkgJXMlcyAtICVzIiksCisJCQkJcHJvZ25hbWUsIHN0ciwgY2xudF9zcGNyZWF0ZWVycm9yKCIiKSwKKwkJCQlzdHJlcnJvcihycGNfY3JlYXRlZXJyLmNmX2Vycm9yLnJlX2Vycm5vKSk7CisJZWxzZQorCQluZnNfZXJyb3IoXygiJXM6IHBvcnRtYXAgcXVlcnkgJXMlcyIpLAorCQkJCXByb2duYW1lLCBzdHIsIGNsbnRfc3BjcmVhdGVlcnJvcigiIikpOworfQorCisvKgorICogVXNlIHRoZSBwb3J0bWFwcGVyIHRvIGRpc2NvdmVyIHdoZXRoZXIgb3Igbm90IHRoZSBzZXJ2aWNlIHdlIHdhbnQgaXMKKyAqIGF2YWlsYWJsZS4gVGhlIGxpc3RzICd2ZXJzaW9ucycgYW5kICdwcm90b3MnIGRlZmluZSBvcmRlcmVkIHNlcXVlbmNlcworICogb2Ygc2VydmljZSB2ZXJzaW9ucyBhbmQgdWRwL3RjcCBwcm90b2NvbHMgdG8gcHJvYmUgZm9yLgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgcG9ydCBpcyB1bmFtYmlndW91cyBhbmQgcGluZ2FibGU7CisgKiBAcG1hcCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgdmVyc2lvbiwgcG9ydCwgYW5kIHRyYW5zcG9ydCBwcm90b2NvbCB1c2VkCisgKiBkdXJpbmcgdGhlIHN1Y2Nlc3NmdWwgcGluZy4gIE5vdGUgdGhhdCBpZiBhIHBvcnQgaXMgYWxyZWFkeSBzcGVjaWZpZWQKKyAqIGluIEBwbWFwIGFuZCBpdCBtYXRjaGVzIHRoZSBycGNiaW5kIHF1ZXJ5IHJlc3VsdCwgbmZzX3Byb2JlX3BvcnQoKSBkb2VzCisgKiBub3QgcGVyZm9ybSBhbiBSUEMgcGluZy4KKyAqIAorICogSWYgYW4gZXJyb3Igb2NjdXJzIG9yIHRoZSByZXF1ZXN0ZWQgc2VydmljZSBpc24ndCBhdmFpbGFibGUsIHplcm8gaXMKKyAqIHJldHVybmVkOyBycGNjcmVhdGVlcnIuY2Zfc3RhdCBpcyBzZXQgdG8gcmVmbGVjdCB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvci4KKyAqLworc3RhdGljIGludCBuZnNfcHJvYmVfcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJICBzdHJ1Y3QgcG1hcCAqcG1hcCwgY29uc3QgdW5zaWduZWQgbG9uZyAqdmVyc2lvbnMsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGludCAqcHJvdG9zKQoreworCXVuaW9uIG5mc19zb2NrYWRkciBhZGRyZXNzOworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHIgPSAmYWRkcmVzcy5zYTsKKwljb25zdCB1bnNpZ25lZCBsb25nIHByb2cgPSBwbWFwLT5wbV9wcm9nLCAqcF92ZXJzOworCWNvbnN0IHVuc2lnbmVkIGludCBwcm90ID0gKHVfaW50KXBtYXAtPnBtX3Byb3QsICpwX3Byb3Q7CisJY29uc3QgdV9zaG9ydCBwb3J0ID0gKHVfc2hvcnQpIHBtYXAtPnBtX3BvcnQ7CisJdW5zaWduZWQgbG9uZyB2ZXJzID0gcG1hcC0+cG1fdmVyczsKKwl1bnNpZ25lZCBzaG9ydCBwX3BvcnQ7CisKKwltZW1jcHkoc2FkZHIsIHNhcCwgc2FsZW4pOworCXBfcHJvdCA9IHByb3QgPyAmcHJvdCA6IHByb3RvczsKKwlwX3ZlcnMgPSB2ZXJzID8gJnZlcnMgOiB2ZXJzaW9uczsKKworCWZvciAoOzspIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoXygiJXM6IHByb2cgJWx1LCB0cnlpbmcgdmVycz0lbHUsIHByb3Q9JXVcbiIpLAorCQkJCXByb2duYW1lLCBwcm9nLCAqcF92ZXJzLCAqcF9wcm90KTsKKwkJcF9wb3J0ID0gbmZzX2dldHBvcnQoc2FkZHIsIHNhbGVuLCBwcm9nLCAqcF92ZXJzLCAqcF9wcm90KTsKKwkJaWYgKHBfcG9ydCkgeworCQkJaWYgKCFwb3J0IHx8IHBvcnQgPT0gcF9wb3J0KSB7CisJCQkJbmZzX3NldF9wb3J0KHNhZGRyLCBwX3BvcnQpOworCQkJCW5mc19wcF9kZWJ1ZyhzYWRkciwgc2FsZW4sIHByb2csICpwX3ZlcnMsCisJCQkJCQkqcF9wcm90LCBwX3BvcnQpOworCQkJCWlmIChuZnNfcnBjX3Bpbmcoc2FkZHIsIHNhbGVuLCBwcm9nLAorCQkJCQkJCSpwX3ZlcnMsICpwX3Byb3QsIE5VTEwpKQorCQkJCQlnb3RvIG91dF9vazsKKwkJCX0gZWxzZQorCQkJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19QUk9HTk9UUkVHSVNURVJFRDsKKwkJfQorCQlpZiAocnBjX2NyZWF0ZWVyci5jZl9zdGF0ICE9IFJQQ19QUk9HTk9UUkVHSVNURVJFRCAmJgorCQkgICAgcnBjX2NyZWF0ZWVyci5jZl9zdGF0ICE9IFJQQ19USU1FRE9VVCAmJgorCQkgICAgcnBjX2NyZWF0ZWVyci5jZl9zdGF0ICE9IFJQQ19DQU5UUkVDViAmJgorCQkgICAgcnBjX2NyZWF0ZWVyci5jZl9zdGF0ICE9IFJQQ19QUk9HVkVSU01JU01BVENIKQorCQkJYnJlYWs7CisKKwkJaWYgKCFwcm90KSB7CisJCQlpZiAoKisrcF9wcm90KSB7CisJCQkJbmZzX3BwX2RlYnVnMigicmV0cnlpbmciKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXBfcHJvdCA9IHByb3RvczsKKwkJfQorCQlpZiAocnBjX2NyZWF0ZWVyci5jZl9zdGF0ID09IFJQQ19USU1FRE9VVCB8fAorCQkgICAgcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID09IFJQQ19DQU5UUkVDVikKKwkJCWJyZWFrOworCisJCWlmICh2ZXJzIHx8ICEqKytwX3ZlcnMpCisJCQlicmVhazsKKwl9CisKKwluZnNfcHBfZGVidWcyKCJmYWlsZWQiKTsKKwlyZXR1cm4gMDsKKworb3V0X29rOgorCWlmICghdmVycykKKwkJcG1hcC0+cG1fdmVycyA9ICpwX3ZlcnM7CisJaWYgKCFwcm90KQorCQlwbWFwLT5wbV9wcm90ID0gKnBfcHJvdDsKKwlpZiAoIXBvcnQpCisJCXBtYXAtPnBtX3BvcnQgPSBwX3BvcnQ7CisJbmZzX2NsZWFyX3JwY19jcmVhdGVlcnIoKTsKKwlyZXR1cm4gMTsKK30KKy8qCisgKiBQcm9iZSBhIHNlcnZlcidzIE5GUyBzZXJ2aWNlIHRvIGRldGVybWluZSB3aGljaCB2ZXJzaW9ucyBhbmQKKyAqIHRyYW5zcG9ydCBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZC4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIHJlcXVlc3RlZCBzZXJ2aWNlIHBvcnQgaXMgdW5hbWJpZ3VvdXMgYW5kIHBpbmdhYmxlOworICogQHBtYXAgaXMgZmlsbGVkIGluIHdpdGggdGhlIHZlcnNpb24sIHBvcnQsIGFuZCB0cmFuc3BvcnQgcHJvdG9jb2wgdXNlZAorICogZHVyaW5nIHRoZSBzdWNjZXNzZnVsIHBpbmcuICBJZiBhbGwgdGhyZWUgYXJlIGFscmVhZHkgc3BlY2lmaWVkLCBzaW1wbHkKKyAqIHJldHVybiBzdWNjZXNzIHdpdGhvdXQgYW4gcnBjYmluZCBxdWVyeSBvciBSUEMgcGluZyAod2UgbWF5IGJlIHRyeWluZworICogdG8gbW91bnQgYW4gTkZTIHNlcnZpY2UgdGhhdCBpcyBub3QgYWR2ZXJ0aXNlZCB2aWEgcnBjYmluZCkuCisgKgorICogSWYgYW4gZXJyb3Igb2NjdXJzIG9yIHRoZSByZXF1ZXN0ZWQgc2VydmljZSBpc24ndCBhdmFpbGFibGUsIHplcm8gaXMKKyAqIHJldHVybmVkOyBycGNjcmVhdGVlcnIuY2Zfc3RhdCBpcyBzZXQgdG8gcmVmbGVjdCB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvci4KKyAqLworc3RhdGljIGludCBuZnNfcHJvYmVfbmZzcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJCXN0cnVjdCBwbWFwICpwbWFwKQoreworCWlmIChwbWFwLT5wbV92ZXJzICYmIHBtYXAtPnBtX3Byb3QgJiYgcG1hcC0+cG1fcG9ydCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA+PSA0KSB7CisJCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvYmVfcHJvdG87CisKKwkJcHJvYmVfcHJvdG8gPSBuZnNfZGVmYXVsdF9wcm90bygpOworCisJCXJldHVybiBuZnNfcHJvYmVfcG9ydChzYXAsIHNhbGVuLCBwbWFwLAorCQkJCQlwcm9iZV9uZnMzX2ZpcnN0LCBwcm9iZV9wcm90byk7CisJfSBlbHNlCisJCXJldHVybiBuZnNfcHJvYmVfcG9ydChzYXAsIHNhbGVuLCBwbWFwLAorCQkJCQlwcm9iZV9uZnMyX29ubHksIHByb2JlX3VkcF9vbmx5KTsKK30KKworLyoKKyAqIFByb2JlIGEgc2VydmVyJ3MgbW91bnRkIHNlcnZpY2UgdG8gZGV0ZXJtaW5lIHdoaWNoIHZlcnNpb25zIGFuZAorICogdHJhbnNwb3J0IHByb3RvY29scyBhcmUgc3VwcG9ydGVkLgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgcG9ydCBpcyB1bmFtYmlndW91cyBhbmQgcGluZ2FibGU7CisgKiBAcG1hcCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgdmVyc2lvbiwgcG9ydCwgYW5kIHRyYW5zcG9ydCBwcm90b2NvbCB1c2VkCisgKiBkdXJpbmcgdGhlIHN1Y2Nlc3NmdWwgcGluZy4gIElmIGFsbCB0aHJlZSBhcmUgYWxyZWFkeSBzcGVjaWZpZWQsIHNpbXBseQorICogcmV0dXJuIHN1Y2Nlc3Mgd2l0aG91dCBhbiBycGNiaW5kIHF1ZXJ5IG9yIFJQQyBwaW5nICh3ZSBtYXkgYmUgdHJ5aW5nCisgKiB0byBtb3VudCBhbiBORlMgc2VydmljZSB0aGF0IGlzIG5vdCBhZHZlcnRpc2VkIHZpYSBycGNiaW5kKS4KKyAqIAorICogSWYgYW4gZXJyb3Igb2NjdXJzIG9yIHRoZSByZXF1ZXN0ZWQgc2VydmljZSBpc24ndCBhdmFpbGFibGUsIHplcm8gaXMKKyAqIHJldHVybmVkOyBycGNjcmVhdGVlcnIuY2Zfc3RhdCBpcyBzZXQgdG8gcmVmbGVjdCB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvci4KKyAqLworc3RhdGljIGludCBuZnNfcHJvYmVfbW50cG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJCXN0cnVjdCBwbWFwICpwbWFwKQoreworCWlmIChwbWFwLT5wbV92ZXJzICYmIHBtYXAtPnBtX3Byb3QgJiYgcG1hcC0+cG1fcG9ydCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA+PSA0KQorCQlyZXR1cm4gbmZzX3Byb2JlX3BvcnQoc2FwLCBzYWxlbiwgcG1hcCwKKwkJCQkJcHJvYmVfbW50M19maXJzdCwgcHJvYmVfdWRwX2ZpcnN0KTsKKwllbHNlCisJCXJldHVybiBuZnNfcHJvYmVfcG9ydChzYXAsIHNhbGVuLCBwbWFwLAorCQkJCQlwcm9iZV9tbnQxX2ZpcnN0LCBwcm9iZV91ZHBfb25seSk7Cit9CisKKy8qCisgKiBQcm9iZSBhIHNlcnZlcidzIG1vdW50ZCBzZXJ2aWNlIHRvIGRldGVybWluZSB3aGljaCB2ZXJzaW9ucyBhbmQKKyAqIHRyYW5zcG9ydCBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZC4gIEludm9rZWQgd2hlbiB0aGUgcHJvdG9jb2wKKyAqIHZlcnNpb24gaXMgYWxyZWFkeSBrbm93biBmb3IgYm90aCB0aGUgTkZTIGFuZCBtb3VudGQgc2VydmljZS4KKyAqCisgKiBSZXR1cm5zIDEgYW5kIGZpbGxzIGluIGJvdGggQHBtYXAgc3RydWN0cyBpZiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UKKyAqIHBvcnRzIGFyZSB1bmFtYmlndW91cyBhbmQgcGluZ2FibGUuICBPdGhlcndpc2UgemVybyBpcyByZXR1cm5lZDsKKyAqIHJwY2NyZWF0ZWVyci5jZl9zdGF0IGlzIHNldCB0byByZWZsZWN0IHRoZSBuYXR1cmUgb2YgdGhlIGVycm9yLgorICovCitzdGF0aWMgaW50IG5mc19wcm9iZV92ZXJzaW9uX2ZpeGVkKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqbW50X3NhZGRyLAorCQkJY29uc3Qgc29ja2xlbl90IG1udF9zYWxlbiwKKwkJCXN0cnVjdCBwbWFwICptbnRfcG1hcCwKKwkJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqbmZzX3NhZGRyLAorCQkJY29uc3Qgc29ja2xlbl90IG5mc19zYWxlbiwKKwkJCXN0cnVjdCBwbWFwICpuZnNfcG1hcCkKK3sKKwlpZiAoIW5mc19wcm9iZV9uZnNwb3J0KG5mc19zYWRkciwgbmZzX3NhbGVuLCBuZnNfcG1hcCkpCisJCXJldHVybiAwOworCXJldHVybiBuZnNfcHJvYmVfbW50cG9ydChtbnRfc2FkZHIsIG1udF9zYWxlbiwgbW50X3BtYXApOworfQorCisvKioKKyAqIG5mc19wcm9iZV9ib3RocG9ydHMgLSBkaXNjb3ZlciB0aGUgUlBDIGVuZHBvaW50cyBvZiBtb3VudGQgYW5kIE5GUyBzZXJ2ZXIKKyAqIEBtbnRfc2FkZHI6CXBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3Mgb2YgbW91bnRkIHNlcnZlcgorICogQG1udF9zYWxlbjoJbGVuZ3RoIG9mIG1vdW50ZCBzZXJ2ZXIncyBhZGRyZXNzCisgKiBAbW50X3BtYXA6CUlOOiBwYXJ0aWFsbHkgZmlsbGVkLWluIG1vdW50ZCBSUEMgc2VydmljZSB0dXBsZTsKKyAqCQlPVVQ6IGZ1bGx5IGZpbGxlZC1pbiBtb3VudGQgUlBDIHNlcnZpY2UgdHVwbGUKKyAqIEBuZnNfc2FkZHI6CXBvaW50ZXIgdG8gc29ja2V0IGFkZHJlc3Mgb2YgTkZTIHNlcnZlcgorICogQG5mc19zYWxlbjoJbGVuZ3RoIG9mIE5GUyBzZXJ2ZXIncyBhZGRyZXNzCisgKiBAbmZzX3BtYXA6CUlOOiBwYXJ0aWFsbHkgZmlsbGVkLWluIE5GUyBSUEMgc2VydmljZSB0dXBsZTsKKyAqCQlPVVQ6IGZ1bGx5IGZpbGxlZC1pbiBORlMgUlBDIHNlcnZpY2UgdHVwbGUKKyAqCisgKiBSZXR1cm5zIDEgYW5kIGZpbGxzIGluIGJvdGggQHBtYXAgc3RydWN0cyBpZiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UKKyAqIHBvcnRzIGFyZSB1bmFtYmlndW91cyBhbmQgcGluZ2FibGUuICBPdGhlcndpc2UgemVybyBpcyByZXR1cm5lZDsKKyAqIHJwY2NyZWF0ZWVyci5jZl9zdGF0IGlzIHNldCB0byByZWZsZWN0IHRoZSBuYXR1cmUgb2YgdGhlIGVycm9yLgorICovCitpbnQgbmZzX3Byb2JlX2JvdGhwb3J0cyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKm1udF9zYWRkciwKKwkJCWNvbnN0IHNvY2tsZW5fdCBtbnRfc2FsZW4sCisJCQlzdHJ1Y3QgcG1hcCAqbW50X3BtYXAsCisJCQljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKm5mc19zYWRkciwKKwkJCWNvbnN0IHNvY2tsZW5fdCBuZnNfc2FsZW4sCisJCQlzdHJ1Y3QgcG1hcCAqbmZzX3BtYXApCit7CisJc3RydWN0IHBtYXAgc2F2ZV9uZnMsIHNhdmVfbW50OworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnByb2JlX3ZlcnM7CisKKwlpZiAobW50X3BtYXAtPnBtX3ZlcnMgJiYgIW5mc19wbWFwLT5wbV92ZXJzKQorCQluZnNfcG1hcC0+cG1fdmVycyA9IG1udHZlcnNfdG9fbmZzKG1udF9wbWFwLT5wbV92ZXJzKTsKKwllbHNlIGlmIChuZnNfcG1hcC0+cG1fdmVycyAmJiAhbW50X3BtYXAtPnBtX3ZlcnMpCisJCW1udF9wbWFwLT5wbV92ZXJzID0gbmZzdmVyc190b19tbnQobmZzX3BtYXAtPnBtX3ZlcnMpOworCisJaWYgKG5mc19wbWFwLT5wbV92ZXJzKQorCQlyZXR1cm4gbmZzX3Byb2JlX3ZlcnNpb25fZml4ZWQobW50X3NhZGRyLCBtbnRfc2FsZW4sIG1udF9wbWFwLAorCQkJCQkgICAgICAgbmZzX3NhZGRyLCBuZnNfc2FsZW4sIG5mc19wbWFwKTsKKworCW1lbWNweSgmc2F2ZV9uZnMsIG5mc19wbWFwLCBzaXplb2Yoc2F2ZV9uZnMpKTsKKwltZW1jcHkoJnNhdmVfbW50LCBtbnRfcG1hcCwgc2l6ZW9mKHNhdmVfbW50KSk7CisJcHJvYmVfdmVycyA9IChuZnNfbW91bnRfZGF0YV92ZXJzaW9uID49IDQpID8KKwkJCXByb2JlX21udDNfZmlyc3QgOiBwcm9iZV9tbnQxX2ZpcnN0OworCisJZm9yICg7ICpwcm9iZV92ZXJzOyBwcm9iZV92ZXJzKyspIHsKKwkJbmZzX3BtYXAtPnBtX3ZlcnMgPSBtbnR2ZXJzX3RvX25mcygqcHJvYmVfdmVycyk7CisJCWlmIChuZnNfcHJvYmVfbmZzcG9ydChuZnNfc2FkZHIsIG5mc19zYWxlbiwgbmZzX3BtYXApICE9IDApIHsKKwkJCW1udF9wbWFwLT5wbV92ZXJzID0gKnByb2JlX3ZlcnM7CisJCQlpZiAobmZzX3Byb2JlX21udHBvcnQobW50X3NhZGRyLCBtbnRfc2FsZW4sIG1udF9wbWFwKSAhPSAwKQorCQkJCXJldHVybiAxOworCQkJbWVtY3B5KG1udF9wbWFwLCAmc2F2ZV9tbnQsIHNpemVvZigqbW50X3BtYXApKTsKKwkJfQorCQlzd2l0Y2ggKHJwY19jcmVhdGVlcnIuY2Zfc3RhdCkgeworCQljYXNlIFJQQ19QUk9HVkVSU01JU01BVENIOgorCQljYXNlIFJQQ19QUk9HTk9UUkVHSVNURVJFRDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwkJbWVtY3B5KG5mc19wbWFwLCAmc2F2ZV9uZnMsIHNpemVvZigqbmZzX3BtYXApKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwcm9iZV9ib3RocG9ydHMgLSBkaXNjb3ZlciB0aGUgUlBDIGVuZHBvaW50cyBvZiBtb3VudGQgYW5kIE5GUyBzZXJ2ZXIKKyAqIEBtbnRfc2VydmVyOiBwb2ludGVyIHRvIGFkZHJlc3MgYW5kIHBtYXAgYXJndW1lbnQgZm9yIG1vdW50ZCByZXN1bHRzCisgKiBAbmZzX3NlcnZlcjogcG9pbnRlciB0byBhZGRyZXNzIGFuZCBwbWFwIGFyZ3VtZW50IGZvciBORlMgc2VydmVyCisgKgorICogVGhpcyBpcyB0aGUgbGVnYWN5IEFQSSB0aGF0IHRha2VzICJjbG50X2FkZHJfdCIgZm9yIGJvdGggc2VydmVycywKKyAqIGJ1dCBzdXBwb3J0cyBvbmx5IEFGX0lORVQgYWRkcmVzc2VzLgorICoKKyAqIFJldHVybnMgMSBhbmQgZmlsbHMgaW4gdGhlIHBtYXAgZmllbGQgaW4gYm90aCBjbG50X2FkZHJfdCBzdHJ1Y3RzCisgKiBpZiB0aGUgcmVxdWVzdGVkIHNlcnZpY2UgcG9ydHMgYXJlIHVuYW1iaWd1b3VzIGFuZCBwaW5nYWJsZS4KKyAqIE90aGVyd2lzZSB6ZXJvIGlzIHJldHVybmVkOyBycGNjcmVhdGVlcnIuY2Zfc3RhdCBpcyBzZXQgdG8gcmVmbGVjdAorICogdGhlIG5hdHVyZSBvZiB0aGUgZXJyb3IuCisgKi8KK2ludCBwcm9iZV9ib3RocG9ydHMoY2xudF9hZGRyX3QgKm1udF9zZXJ2ZXIsIGNsbnRfYWRkcl90ICpuZnNfc2VydmVyKQoreworCXJldHVybiBuZnNfcHJvYmVfYm90aHBvcnRzKChzdHJ1Y3Qgc29ja2FkZHIgKikmbW50X3NlcnZlci0+c2FkZHIsCisJCQkJCXNpemVvZihtbnRfc2VydmVyLT5zYWRkciksCisJCQkJCSZtbnRfc2VydmVyLT5wbWFwLAorCQkJCQkoc3RydWN0IHNvY2thZGRyICopJm5mc19zZXJ2ZXItPnNhZGRyLAorCQkJCQlzaXplb2YobmZzX3NlcnZlci0+c2FkZHIpLAorCQkJCQkmbmZzX3NlcnZlci0+cG1hcCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Byb2JlX3N0YXRkKHZvaWQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHIgPSB7CisJCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCisJCS5zaW5fYWRkci5zX2FkZHIJPSBodG9ubChJTkFERFJfTE9PUEJBQ0spLAorCX07CisJcnBjcHJvZ190IHByb2dyYW0gPSBuZnNfZ2V0cnBjYnluYW1lKE5TTVBST0csIG5mc19uc19wZ210YmwpOworCisJcmV0dXJuIG5mc19nZXRwb3J0X3BpbmcoKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksCisJCQkJcHJvZ3JhbSwgKHJwY3ZlcnNfdCkxLCBJUFBST1RPX1VEUCk7Cit9CisKKy8qKgorICogc3RhcnRfc3RhdGQgLSBhdHRlbXB0IHRvIHN0YXJ0IHJwYy5zdGF0ZAorICoKKyAqIFJldHVybnMgMSBpZiBzdGF0ZCBpcyBydW5uaW5nOyBvdGhlcndpc2UgemVyby4KKyAqLworaW50IHN0YXJ0X3N0YXRkKHZvaWQpCit7CisjaWZkZWYgU1RBUlRfU1RBVEQKKwlzdHJ1Y3Qgc3RhdCBzdGI7CisjZW5kaWYKKworCWlmIChuZnNfcHJvYmVfc3RhdGQoKSkKKwkJcmV0dXJuIDE7CisKKyNpZmRlZiBTVEFSVF9TVEFURAorCWlmIChzdGF0KFNUQVJUX1NUQVRELCAmc3RiKSA9PSAwKSB7CisJCWlmIChTX0lTUkVHKHN0Yi5zdF9tb2RlKSAmJiAoc3RiLnN0X21vZGUgJiBTX0lYVVNSKSkgeworCQkJcGlkX3QgcGlkID0gZm9yaygpOworCQkJc3dpdGNoIChwaWQpIHsKKwkJCWNhc2UgMDogLyogY2hpbGQgKi8KKwkJCQlleGVjbChTVEFSVF9TVEFURCwgU1RBUlRfU1RBVEQsIE5VTEwpOworCQkJCWV4aXQoMSk7CisJCQljYXNlIC0xOiAvKiBlcnJvciAqLworCQkJCW5mc19lcnJvcihfKCIlczogZm9yayBmYWlsZWQ6ICVzIiksCisJCQkJCQlwcm9nbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8qIHBhcmVudCAqLworCQkJCXdhaXRwaWQocGlkLCBOVUxMLDApOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKG5mc19wcm9iZV9zdGF0ZCgpKQorCQkJCXJldHVybiAxOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZnNfYWR2aXNlX3Vtb3VudCAtIGFzayB0aGUgc2VydmVyIHRvIHJlbW92ZSBhIHNoYXJlIGZyb20gaXQncyBybXRhYgorICogQHNhcDogcG9pbnRlciB0byBJUCBhZGRyZXNzIG9mIHNlcnZlciB0byBjYWxsCisgKiBAc2FsZW46IGxlbmd0aCBvZiBzZXJ2ZXIgYWRkcmVzcworICogQHBtYXA6IHBhcnRpYWxseSBmaWxsZWQtaW4gbW91bnRkIFJQQyBzZXJ2aWNlIHR1cGxlCisgKiBAYXJncDogZGlyZWN0b3J5IHBhdGggb2Ygc2hhcmUgdG8gInVubW91bnQiCisgKgorICogUmV0dXJucyBvbmUgaWYgdGhlIHVubW91bnQgY2FsbCBzdWNjZWVkZWQ7IHplcm8gaWYgdGhlIHVubW91bnQKKyAqIGZhaWxlZCBmb3IgYW55IHJlYXNvbjsgIHJwY2NyZWF0ZWVyci5jZl9zdGF0IGlzIHNldCB0byByZWZsZWN0CisgKiB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvci4KKyAqCisgKiBXZSB1c2UgYSBmYXN0IHRpbWVvdXQgc2luY2UgdGhpcyBjYWxsIGlzIGFkdmlzb3J5IG9ubHkuCisgKi8KK2ludCBuZnNfYWR2aXNlX3Vtb3VudChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgcG1hcCAqcG1hcCwgY29uc3QgZGlycGF0aCAqYXJncCkKK3sKKwl1bmlvbiBuZnNfc29ja2FkZHIgYWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhZGRyID0gJmFkZHJlc3Muc2E7CisJc3RydWN0IHBtYXAgbW50X3BtYXAgPSAqcG1hcDsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0ID0geworCQkudHZfc2VjCQk9IE1PVU5UX1RJTUVPVVQgPj4gMywKKwl9OworCUNMSUVOVCAqY2xpZW50OworCWVudW0gY2xudF9zdGF0IHJlcyA9IDA7CisKKwltZW1jcHkoc2FkZHIsIHNhcCwgc2FsZW4pOworCWlmIChuZnNfcHJvYmVfbW50cG9ydChzYWRkciwgc2FsZW4sICZtbnRfcG1hcCkgPT0gMCkgeworCQlpZiAodmVyYm9zZSkKKwkJCW5mc19lcnJvcihfKCIlczogRmFpbGVkIHRvIGRpc2NvdmVyIG1vdW50ZCBwb3J0JXMiKSwKKwkJCQlwcm9nbmFtZSwgY2xudF9zcGNyZWF0ZWVycm9yKCIiKSk7CisJCXJldHVybiAwOworCX0KKwluZnNfc2V0X3BvcnQoc2FkZHIsIG1udF9wbWFwLnBtX3BvcnQpOworCisJY2xpZW50ID0gbmZzX2dldF9wcml2X3JwY2NsaWVudChzYWRkciwgc2FsZW4sIG1udF9wbWFwLnBtX3Byb3QsCisJCQkJCW1udF9wbWFwLnBtX3Byb2csIG1udF9wbWFwLnBtX3ZlcnMsCisJCQkJCSZ0aW1lb3V0KTsKKwlpZiAoY2xpZW50ID09IE5VTEwpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQluZnNfZXJyb3IoXygiJXM6IEZhaWxlZCB0byBjcmVhdGUgUlBDIGNsaWVudCVzIiksCisJCQkJcHJvZ25hbWUsIGNsbnRfc3BjcmVhdGVlcnJvcigiIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbGllbnQtPmNsX2F1dGggPSBhdXRodW5peF9jcmVhdGVfZGVmYXVsdCgpOworCisJcmVzID0gQ0xOVF9DQUxMKGNsaWVudCwgTU9VTlRQUk9DX1VNTlQsCisJCQkoeGRycHJvY190KXhkcl9kaXJwYXRoLCAoY2FkZHJfdClhcmdwLAorCQkJKHhkcnByb2NfdCl4ZHJfdm9pZCwgTlVMTCwKKwkJCXRpbWVvdXQpOworCWlmIChyZXMgIT0gUlBDX1NVQ0NFU1MpIHsKKwkJcnBjX2NyZWF0ZWVyci5jZl9zdGF0ID0gcmVzOworCQlDTE5UX0dFVEVSUihjbGllbnQsICZycGNfY3JlYXRlZXJyLmNmX2Vycm9yKTsKKwkJaWYgKHZlcmJvc2UpCisJCQluZnNfZXJyb3IoXygiJXM6IFVNTlQgY2FsbCBmYWlsZWQ6ICVzIiksCisJCQkJcHJvZ25hbWUsIGNsbnRfc3BlcnJubyhyZXMpKTsKKworCX0KKwlhdXRoX2Rlc3Ryb3koY2xpZW50LT5jbF9hdXRoKTsKKwlDTE5UX0RFU1RST1koY2xpZW50KTsKKworCWlmIChyZXMgIT0gUlBDX1NVQ0NFU1MpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqIG5mc19jYWxsX3Vtb3VudCAtIGFzayB0aGUgc2VydmVyIHRvIHJlbW92ZSBhIHNoYXJlIGZyb20gaXQncyBybXRhYgorICogQG1udF9zZXJ2ZXI6IGFkZHJlc3Mgb2YgUlBDIE1OVCBwcm9ncmFtIHNlcnZlcgorICogQGFyZ3A6IGRpcmVjdG9yeSBwYXRoIG9mIHNoYXJlIHRvICJ1bm1vdW50IgorICoKKyAqIFJldHVybnMgb25lIGlmIHRoZSB1bm1vdW50IGNhbGwgc3VjY2VlZGVkOyB6ZXJvIGlmIHRoZSB1bm1vdW50CisgKiBmYWlsZWQgZm9yIGFueSByZWFzb24uCisgKgorICogTm90ZSB0aGF0IGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgcnBjY3JlYXRlZXJyCisgKiBpcyBzZXQuCisgKi8KK2ludCBuZnNfY2FsbF91bW91bnQoY2xudF9hZGRyX3QgKm1udF9zZXJ2ZXIsIGRpcnBhdGggKmFyZ3ApCit7CisJc3RydWN0IHNvY2thZGRyICpzYXAgPSAoc3RydWN0IHNvY2thZGRyICopJm1udF9zZXJ2ZXItPnNhZGRyOworCXNvY2tsZW5fdCBzYWxlbiA9IHNpemVvZihtbnRfc2VydmVyLT5zYWRkcik7CisJc3RydWN0IHBtYXAgKnBtYXAgPSAmbW50X3NlcnZlci0+cG1hcDsKKwlDTElFTlQgKmNsbnQ7CisJZW51bSBjbG50X3N0YXQgcmVzID0gMDsKKwlpbnQgbXNvY2s7CisKKwlpZiAoIW5mc19wcm9iZV9tbnRwb3J0KHNhcCwgc2FsZW4sIHBtYXApKQorCQlyZXR1cm4gMDsKKwljbG50ID0gbW50X29wZW5jbG50KG1udF9zZXJ2ZXIsICZtc29jayk7CisJaWYgKCFjbG50KQorCQlyZXR1cm4gMDsKKwlyZXMgPSBjbG50X2NhbGwoY2xudCwgTU9VTlRQUk9DX1VNTlQsCisJCQkoeGRycHJvY190KXhkcl9kaXJwYXRoLCAoY2FkZHJfdClhcmdwLAorCQkJKHhkcnByb2NfdCl4ZHJfdm9pZCwgTlVMTCwKKwkJCVRJTUVPVVQpOworCW1udF9jbG9zZWNsbnQoY2xudCwgbXNvY2spOworCisJaWYgKHJlcyA9PSBSUENfU1VDQ0VTUykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbW50X29wZW5jbG50IC0gZ2V0IGEgaGFuZGxlIGZvciBhIHJlbW90ZSBtb3VudGQgc2VydmljZQorICogQG1udF9zZXJ2ZXI6IGFkZHJlc3MgYW5kIHBtYXAgYXJndW1lbnRzIG9mIG1vdW50ZCBzZXJ2aWNlCisgKiBAbXNvY2s6IHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNvY2tldAorICoKKyAqIFJldHVybnMgYW4gYWN0aXZlIGhhbmRsZSBmb3IgdGhlIHJlbW90ZSdzIG1vdW50ZCBzZXJ2aWNlCisgKi8KK0NMSUVOVCAqbW50X29wZW5jbG50KGNsbnRfYWRkcl90ICptbnRfc2VydmVyLCBpbnQgKm1zb2NrKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqbW50X3NhZGRyID0gJm1udF9zZXJ2ZXItPnNhZGRyOworCXN0cnVjdCBwbWFwICptbnRfcG1hcCA9ICZtbnRfc2VydmVyLT5wbWFwOworCUNMSUVOVCAqY2xudCA9IE5VTEw7CisKKwltbnRfc2FkZHItPnNpbl9wb3J0ID0gaHRvbnMoKHVfc2hvcnQpbW50X3BtYXAtPnBtX3BvcnQpOworCSptc29jayA9IGdldF9zb2NrZXQobW50X3NhZGRyLCBtbnRfcG1hcC0+cG1fcHJvdCwgTU9VTlRfVElNRU9VVCwKKwkJCQlUUlVFLCBGQUxTRSk7CisJaWYgKCptc29jayA9PSBSUENfQU5ZU09DSykgeworCQlpZiAocnBjX2NyZWF0ZWVyci5jZl9lcnJvci5yZV9lcnJubyA9PSBFQUREUklOVVNFKQorCQkJLyoKKwkJCSAqIFByb2JhYmx5IGluLXVzZSBieSBhIFRJTUVfV0FJVCBjb25uZWN0aW9uLAorCQkJICogSXQgaXMgd29ydGggd2FpdGluZyBhIHdoaWxlIGFuZCB0cnlpbmcgYWdhaW4uCisJCQkgKi8KKwkJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19USU1FRE9VVDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3dpdGNoIChtbnRfcG1hcC0+cG1fcHJvdCkgeworCWNhc2UgSVBQUk9UT19VRFA6CisJCWNsbnQgPSBjbG50dWRwX2J1ZmNyZWF0ZShtbnRfc2FkZHIsCisJCQkJCSBtbnRfcG1hcC0+cG1fcHJvZywgbW50X3BtYXAtPnBtX3ZlcnMsCisJCQkJCSBSRVRSWV9USU1FT1VULCBtc29jaywKKwkJCQkJIE1OVF9TRU5EQlVGU0laRSwgTU5UX1JFQ1ZCVUZTSVpFKTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX1RDUDoKKwkJY2xudCA9IGNsbnR0Y3BfY3JlYXRlKG1udF9zYWRkciwKKwkJCQkgICAgICBtbnRfcG1hcC0+cG1fcHJvZywgbW50X3BtYXAtPnBtX3ZlcnMsCisJCQkJICAgICAgbXNvY2ssCisJCQkJICAgICAgTU5UX1NFTkRCVUZTSVpFLCBNTlRfUkVDVkJVRlNJWkUpOworCQlicmVhazsKKwl9CisJaWYgKGNsbnQpIHsKKwkJLyogdHJ5IHRvIG1vdW50IGhvc3RuYW1lOmRpcm5hbWUgKi8KKwkJY2xudC0+Y2xfYXV0aCA9IGF1dGh1bml4X2NyZWF0ZV9kZWZhdWx0KCk7CisJCXJldHVybiBjbG50OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBtbnRfY2xvc2VjbG50IC0gdGVybWluYXRlIGEgaGFuZGxlIGZvciBhIHJlbW90ZSBtb3VudGQgc2VydmljZQorICogQGNsbnQ6IHBvaW50ZXIgdG8gYW4gYWN0aXZlIGhhbmRsZSBmb3IgYSByZW1vdGUgbW91bnRkIHNlcnZpY2UKKyAqIEBtc29jazogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBzb2NrZXQKKyAqCisgKi8KK3ZvaWQgbW50X2Nsb3NlY2xudChDTElFTlQgKmNsbnQsIGludCBtc29jaykKK3sKKwlhdXRoX2Rlc3Ryb3koY2xudC0+Y2xfYXV0aCk7CisJY2xudF9kZXN0cm95KGNsbnQpOworCWNsb3NlKG1zb2NrKTsKK30KKworLyoqCisgKiBjbG50X3BpbmcgLSBzZW5kIGFuIFJQQyBwaW5nIHRvIHRoZSByZW1vdGUgUlBDIHNlcnZpY2UgZW5kcG9pbnQKKyAqIEBzYWRkcjogc2VydmVyJ3MgYWRkcmVzcworICogQHByb2c6IHRhcmdldCBSUEMgcHJvZ3JhbSBudW1iZXIKKyAqIEB2ZXJzOiB0YXJnZXQgUlBDIHZlcnNpb24gbnVtYmVyCisgKiBAcHJvdDogdGFyZ2V0IFJQQyBwcm90b2NvbAorICogQGNhZGRyOiBmaWxsZWQgaW4gd2l0aCBvdXIgbmV0d29yayBhZGRyZXNzCisgKgorICogU2lnaC4uLiBHRVRQT1JUIHF1ZXJpZXMgZG9uJ3QgYWN0dWFsbHkgY2hlY2sgdGhlIHZlcnNpb24gbnVtYmVyLgorICogSW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlcnZlciBhY3R1YWxseSBzdXBwb3J0cyB0aGUgc2VydmljZQorICogd2UncmUgcmVxdWVzdGluZywgd2Ugb3BlbiBhbiBSUEMgY2xpZW50LCBhbmQgZmlyZSBvZmYgYSBOVUxMCisgKiBSUEMgY2FsbC4KKyAqCisgKiBjYWRkciBpcyB0aGUgbmV0d29yayBhZGRyZXNzIHRoYXQgdGhlIHNlcnZlciB3aWxsIHVzZSB0byBjYWxsIHVzIGJhY2suCisgKiBPbiBtdWx0aS1ob21lZCBjbGllbnRzLCB0aGlzIGFkZHJlc3MgZGVwZW5kcyBvbiB3aGljaCBOSUMgd2UgdXNlIHRvCisgKiByb3V0ZSByZXF1ZXN0cyB0byB0aGUgc2VydmVyLgorICoKKyAqIFJldHVybnMgb25lIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB6ZXJvLgorICovCitpbnQgY2xudF9waW5nKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgcHJvZywKKwkJY29uc3QgdW5zaWduZWQgbG9uZyB2ZXJzLCBjb25zdCB1bnNpZ25lZCBpbnQgcHJvdCwKKwkJc3RydWN0IHNvY2thZGRyX2luICpjYWRkcikKK3sKKwlDTElFTlQgKmNsbnQgPSBOVUxMOworCWludCBzb2NrLCBzdGF0OworCXN0YXRpYyBjaGFyIGNsbnRfcmVzOworCXN0cnVjdCBzb2NrYWRkciBkaXNzb2x2ZTsKKworCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IHN0YXQgPSAwOworCXNvY2sgPSBnZXRfc29ja2V0KHNhZGRyLCBwcm90LCBDT05ORUNUX1RJTUVPVVQsIEZBTFNFLCBUUlVFKTsKKwlpZiAoc29jayA9PSBSUENfQU5ZU09DSykgeworCQlpZiAocnBjX2NyZWF0ZWVyci5jZl9lcnJvci5yZV9lcnJubyA9PSBFVElNRURPVVQpIHsKKwkJCS8qCisJCQkgKiBUQ1AgdGltZW91dC4gQnViYmxlIHVwIHRoZSBlcnJvciB0byBzZWUgCisJCQkgKiBob3cgaXQgc2hvdWxkIGJlIGhhbmRsZWQuCisJCQkgKi8KKwkJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IFJQQ19USU1FRE9VVDsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2FkZHIpIHsKKwkJLyogR2V0IHRoZSBhZGRyZXNzIG9mIG91ciBlbmQgb2YgdGhpcyBjb25uZWN0aW9uICovCisJCXNvY2tsZW5fdCBsZW4gPSBzaXplb2YoKmNhZGRyKTsKKwkJaWYgKGdldHNvY2tuYW1lKHNvY2ssIGNhZGRyLCAmbGVuKSAhPSAwKQorCQkJY2FkZHItPnNpbl9mYW1pbHkgPSAwOworCX0KKworCXN3aXRjaChwcm90KSB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkJLyogVGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgKHNvIHdlIGNvdWxkIGdldHNvY2tuYW1lIHN1Y2Nlc3NmdWxseSksCisJCSAqIGJ1dCBzb21lIHNlcnZlcnMgb24gbXVsdGktaG9tZWQgaG9zdHMgcmVwbHkgZnJvbQorCQkgKiB0aGUgd3JvbmcgYWRkcmVzcywgc28gaWYgd2Ugc3RheSBjb25uZWN0ZWQsIHdlIGxvc2UgdGhlIHJlcGx5LgorCQkgKi8KKwkJZGlzc29sdmUuc2FfZmFtaWx5ID0gQUZfVU5TUEVDOworCQljb25uZWN0KHNvY2ssICZkaXNzb2x2ZSwgc2l6ZW9mKGRpc3NvbHZlKSk7CisKKwkJY2xudCA9IGNsbnR1ZHBfYnVmY3JlYXRlKHNhZGRyLCBwcm9nLCB2ZXJzLAorCQkJCQkgUkVUUllfVElNRU9VVCwgJnNvY2ssCisJCQkJCSBSUENTTUFMTE1TR1NJWkUsIFJQQ1NNQUxMTVNHU0laRSk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWNsbnQgPSBjbG50dGNwX2NyZWF0ZShzYWRkciwgcHJvZywgdmVycywgJnNvY2ssCisJCQkJICAgICAgUlBDU01BTExNU0dTSVpFLCBSUENTTUFMTE1TR1NJWkUpOworCQlicmVhazsKKwl9CisJaWYgKCFjbG50KSB7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KCZjbG50X3JlcywgMCwgc2l6ZW9mKGNsbnRfcmVzKSk7CisJc3RhdCA9IGNsbnRfY2FsbChjbG50LCBOVUxMUFJPQywKKwkJCSAoeGRycHJvY190KXhkcl92b2lkLCAoY2FkZHJfdClOVUxMLAorCQkJICh4ZHJwcm9jX3QpeGRyX3ZvaWQsIChjYWRkcl90KSZjbG50X3JlcywKKwkJCSBUSU1FT1VUKTsKKwlpZiAoc3RhdCkgeworCQljbG50X2dldGVycihjbG50LCAmcnBjX2NyZWF0ZWVyci5jZl9lcnJvcik7CisJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IHN0YXQ7CisJfQorCWNsbnRfZGVzdHJveShjbG50KTsKKwljbG9zZShzb2NrKTsKKworCWlmIChzdGF0ID09IFJQQ19TVUNDRVNTKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogVHJ5IGEgZ2V0c29ja25hbWUoKSBvbiBhIGNvbm5lY3RlZCBkYXRhZ3JhbSBzb2NrZXQuCisgKgorICogUmV0dXJucyAxIGFuZCBmaWxscyBpbiBAYnVmIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSwgemVyby4KKyAqCisgKiBBIGNvbm5lY3RlZCBkYXRhZ3JhbSBzb2NrZXQgcHJldmVudHMgbGVhdmluZyBhIHNvY2tldCBpbiBUSU1FX1dBSVQuCisgKiBUaGlzIGNvbnNlcnZlcyB0aGUgZXBoZW1lcmFsIHBvcnQgbnVtYmVyIHNwYWNlLCBoZWxwaW5nIHJlZHVjZSBmYWlsZWQKKyAqIHNvY2tldCBiaW5kcyBkdXJpbmcgbW91bnQgc3Rvcm1zLgorICovCitzdGF0aWMgaW50IG5mc19jYV9zb2NrbmFtZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY29uc3Qgc29ja2xlbl90IHNhbGVuLAorCQkJICAgc3RydWN0IHNvY2thZGRyICpidWYsIHNvY2tsZW5fdCAqYnVmbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW4gPSB7CisJCS5zaW5fZmFtaWx5CQk9IEFGX0lORVQsCisJCS5zaW5fYWRkci5zX2FkZHIJPSBodG9ubChJTkFERFJfQU5ZKSwKKwl9OworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNiA9IHsKKwkJLnNpbjZfZmFtaWx5CQk9IEFGX0lORVQ2LAorCQkuc2luNl9hZGRyCQk9IElONkFERFJfQU5ZX0lOSVQsCisJfTsKKwlpbnQgc29jazsKKworCXNvY2sgPSBzb2NrZXQoc2FwLT5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoc29jayA8IDApCisJCXJldHVybiAwOworCisJc3dpdGNoIChzYXAtPnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKSA8IDApIHsKKwkJCWNsb3NlKHNvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW42LCBzaXplb2Yoc2luNikpIDwgMCkgeworCQkJY2xvc2Uoc29jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNvbm5lY3Qoc29jaywgc2FwLCBzYWxlbikgPCAwKSB7CisJCWNsb3NlKHNvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gIWdldHNvY2tuYW1lKHNvY2ssIGJ1ZiwgYnVmbGVuKTsKK30KKworLyoKKyAqIFRyeSB0byBnZW5lcmF0ZSBhbiBhZGRyZXNzIHRoYXQgcHJldmVudHMgdGhlIHNlcnZlciBmcm9tIGNhbGxpbmcgdXMuCisgKgorICogUmV0dXJucyAxIGFuZCBmaWxscyBpbiBAYnVmIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSwgemVyby4KKyAqLworc3RhdGljIGludCBuZnNfY2FfZ2FpKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmJ1Ziwgc29ja2xlbl90ICpidWZsZW4pCit7CisJc3RydWN0IGFkZHJpbmZvICpnYWlfcmVzdWx0czsKKwlzdHJ1Y3QgYWRkcmluZm8gZ2FpX2hpbnQgPSB7CisJCS5haV9mYW1pbHkJPSBzYXAtPnNhX2ZhbWlseSwKKwkJLmFpX2ZsYWdzCT0gQUlfUEFTU0lWRSwJLyogQU5ZQUREUiAqLworCX07CisKKwlpZiAoZ2V0YWRkcmluZm8oTlVMTCwgIiIsICZnYWlfaGludCwgJmdhaV9yZXN1bHRzKSkKKwkJcmV0dXJuIDA7CisKKwkqYnVmbGVuID0gZ2FpX3Jlc3VsdHMtPmFpX2FkZHJsZW47CisJbWVtY3B5KGJ1ZiwgZ2FpX3Jlc3VsdHMtPmFpX2FkZHIsICpidWZsZW4pOworCisJZnJlZWFkZHJpbmZvKGdhaV9yZXN1bHRzKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIG5mc19jYWxsYmFja19hZGRyZXNzIC0gYWNxdWlyZSBvdXIgbG9jYWwgbmV0d29yayBhZGRyZXNzCisgKiBAc2FwOiBwb2ludGVyIHRvIGFkZHJlc3Mgb2YgcmVtb3RlCisgKiBAc2FwX2xlbjogbGVuZ3RoIG9mIGFkZHJlc3MKKyAqIEBidWY6IHBvaW50ZXIgdG8gYnVmZmVyIHRvIGJlIGZpbGxlZCBpbiB3aXRoIGxvY2FsIG5ldHdvcmsgYWRkcmVzcworICogQGJ1ZmxlbjogSU46IGxlbmd0aCBvZiBidWZmZXIgdG8gZmlsbCBpbjsgT1VUOiBsZW5ndGggb2YgZmlsbGVkLWluIGFkZHJlc3MKKyAqCisgKiBEaXNjb3ZlciBhIG5ldHdvcmsgYWRkcmVzcyB0aGF0IGFuIE5GU3Y0IHNlcnZlciBjYW4gdXNlIHRvIGNhbGwgdXMgYmFjay4KKyAqIE9uIG11bHRpLWhvbWVkIGNsaWVudHMsIHRoaXMgYWRkcmVzcyBkZXBlbmRzIG9uIHdoaWNoIE5JQyB3ZSB1c2UgdG8KKyAqIHJvdXRlIHJlcXVlc3RzIHRvIHRoZSBzZXJ2ZXIuCisgKgorICogUmV0dXJucyAxIGFuZCBmaWxscyBpbiBAYnVmIGlmIGFuIHVuYW1iaWd1b3VzIGxvY2FsIGFkZHJlc3MgaXMKKyAqIGF2YWlsYWJsZTsgcmV0dXJucyAxIGFuZCBmaWxscyBpbiBhbiBhcHByb3ByaWF0ZSBBTllBRERSIGFkZHJlc3MKKyAqIGlmIGEgbG9jYWwgYWRkcmVzcyBpc24ndCBhdmFpbGFibGU7IG90aGVyd2lzZSwgcmV0dXJucyB6ZXJvLgorICovCitpbnQgbmZzX2NhbGxiYWNrX2FkZHJlc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCSBzdHJ1Y3Qgc29ja2FkZHIgKmJ1Ziwgc29ja2xlbl90ICpidWZsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYnVmOworCisJaWYgKG5mc19jYV9zb2NrbmFtZShzYXAsIHNhbGVuLCBidWYsIGJ1ZmxlbikgPT0gMCkKKwkJaWYgKG5mc19jYV9nYWkoc2FwLCBidWYsIGJ1ZmxlbikgPT0gMCkKKwkJCWdvdG8gb3V0X2ZhaWxlZDsKKworCS8qCisJICogVGhlIHNlcnZlciBjYW4ndCB1c2UgYW4gaW50ZXJmYWNlIElEIHRoYXQgd2FzIGdlbmVyYXRlZAorCSAqIGhlcmUgb24gdGhlIGNsaWVudCwgc28gYWx3YXlzIGNsZWFyIHNpbjZfc2NvcGVfaWQuCisJICovCisJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzaW42LT5zaW42X3Njb3BlX2lkID0gMDsKKworCXJldHVybiAxOworCitvdXRfZmFpbGVkOgorCSpidWZsZW4gPSAwOworCWlmICh2ZXJib3NlKQorCQluZnNfZXJyb3IoXygiJXM6IGZhaWxlZCB0byBjb25zdHJ1Y3QgY2FsbGJhY2sgYWRkcmVzcyIpLAorCQkJCXByb2duYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICJuZnNwcm9nIiBpcyBzdXBwb3J0ZWQgb25seSBieSB0aGUgbGVnYWN5IG1vdW50IGNvbW1hbmQuICBUaGUKKyAqIGtlcm5lbCBtb3VudCBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wdGlvbi4KKyAqCisgKiBSZXR1cm5zIFRSVUUgaWYgQHByb2dyYW0gY29udGFpbnMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24sCisgKiBvciBGQUxTRSBpZiB0aGUgb3B0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlLgorICovCitzdGF0aWMgaW50CituZnNfbmZzX3Byb2dyYW0oc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGxvbmcgKnByb2dyYW0pCit7CisJbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHBvX2dldF9udW1lcmljKG9wdGlvbnMsICJuZnNwcm9nIiwgJnRtcCkpIHsKKwljYXNlIFBPX05PVF9GT1VORDoKKwkJYnJlYWs7CisJY2FzZSBQT19GT1VORDoKKwkJaWYgKHRtcCA+IDApIHsKKwkJCSpwcm9ncmFtID0gdG1wOworCQkJcmV0dXJuIDE7CisJCX0KKwljYXNlIFBPX0JBRF9WQUxVRToKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBORlMgUlBDIHByb2dyYW0gd2Fzbid0IHNwZWNpZmllZC4gIFRoZSBSUEMgcHJvZ3JhbQorCSAqIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHZpYSBhbiBycGNiaW5kIHF1ZXJ5LgorCSAqLworCSpwcm9ncmFtID0gbmZzX2dldHJwY2J5bmFtZShORlNQUk9HLCBuZnNfbmZzX3BnbXRibCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZXR1cm5zIFRSVUUgaWYgQHZlcnNpb24gY29udGFpbnMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24sCisgKiBvciBGQUxTRSBpZiB0aGUgb3B0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlLgorICovCitpbnQKK25mc19uZnNfdmVyc2lvbihzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgbG9uZyAqdmVyc2lvbikKK3sKKwlsb25nIHRtcDsKKworCXN3aXRjaCAocG9fcmlnaHRtb3N0KG9wdGlvbnMsIG5mc192ZXJzaW9uX29wdHRibCkpIHsKKwljYXNlIDA6CS8qIHYyICovCisJCSp2ZXJzaW9uID0gMjsKKwkJcmV0dXJuIDE7CisJY2FzZSAxOiAvKiB2MyAqLworCQkqdmVyc2lvbiA9IDM7CisJCXJldHVybiAxOworCWNhc2UgMjogLyogdjQgKi8KKwkJKnZlcnNpb24gPSA0OworCQlyZXR1cm4gMTsKKwljYXNlIDM6CS8qIHZlcnMgKi8KKwkJc3dpdGNoIChwb19nZXRfbnVtZXJpYyhvcHRpb25zLCAidmVycyIsICZ0bXApKSB7CisJCWNhc2UgUE9fRk9VTkQ6CisJCQlpZiAodG1wID49IDIgJiYgdG1wIDw9IDQpIHsKKwkJCQkqdmVyc2lvbiA9IHRtcDsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQljYXNlIFBPX05PVF9GT1VORDoKKwkJCW5mc19lcnJvcihfKCIlczogb3B0aW9uIHBhcnNpbmcgZXJyb3JcbiIpLAorCQkJCQlwcm9nbmFtZSk7CisJCWNhc2UgUE9fQkFEX1ZBTFVFOgorCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIDQ6IC8qIG5mc3ZlcnMgKi8KKwkJc3dpdGNoIChwb19nZXRfbnVtZXJpYyhvcHRpb25zLCAibmZzdmVycyIsICZ0bXApKSB7CisJCWNhc2UgUE9fRk9VTkQ6CisJCQlpZiAodG1wID49IDIgJiYgdG1wIDw9IDQpIHsKKwkJCQkqdmVyc2lvbiA9IHRtcDsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCXJldHVybiAwOworCQljYXNlIFBPX05PVF9GT1VORDoKKwkJCW5mc19lcnJvcihfKCIlczogb3B0aW9uIHBhcnNpbmcgZXJyb3JcbiIpLAorCQkJCQlwcm9nbmFtZSk7CisJCWNhc2UgUE9fQkFEX1ZBTFVFOgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIE5GUyB2ZXJzaW9uIHdhc24ndCBzcGVjaWZpZWQuICBUaGUgcG1hcCB2ZXJzaW9uIHZhbHVlCisJICogd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgYW4gcnBjYmluZCBxdWVyeSBpbiB0aGlzIGNhc2UuCisJICovCisJKnZlcnNpb24gPSAwOworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyBUUlVFIGlmIEBwcm90b2NvbCBjb250YWlucyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzIG9wdGlvbiwKKyAqIG9yIEZBTFNFIGlmIHRoZSBvcHRpb24gd2FzIHNwZWNpZmllZCB3aXRoIGFuIGludmFsaWQgdmFsdWUuIE9uCisgKiBlcnJvciwgZXJybm8gaXMgc2V0LgorICovCitpbnQKK25mc19uZnNfcHJvdG9jb2woc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGxvbmcgKnByb3RvY29sKQoreworCXNhX2ZhbWlseV90IGZhbWlseTsKKwljaGFyICpvcHRpb247CisKKwlzd2l0Y2ggKHBvX3JpZ2h0bW9zdChvcHRpb25zLCBuZnNfdHJhbnNwb3J0X29wdHRibCkpIHsKKwljYXNlIDA6CS8qIHVkcCAqLworCQkqcHJvdG9jb2wgPSBJUFBST1RPX1VEUDsKKwkJcmV0dXJuIDE7CisJY2FzZSAxOiAvKiB0Y3AgKi8KKwkJKnByb3RvY29sID0gSVBQUk9UT19UQ1A7CisJCXJldHVybiAxOworCWNhc2UgMjogLyogcHJvdG8gKi8KKwkJb3B0aW9uID0gcG9fZ2V0KG9wdGlvbnMsICJwcm90byIpOworCQlpZiAob3B0aW9uICE9IE5VTEwpIHsKKwkJCWlmICghbmZzX2dldF9wcm90byhvcHRpb24sICZmYW1pbHksIHByb3RvY29sKSkgeworCQkJCWVycm5vID0gRVBST1RPTk9TVVBQT1JUOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKgorCSAqIE5GUyB0cmFuc3BvcnQgcHJvdG9jb2wgd2Fzbid0IHNwZWNpZmllZC4gIFRoZSBwbWFwCisJICogcHJvdG9jb2wgdmFsdWUgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgYW4gcnBjYmluZAorCSAqIHF1ZXJ5IGluIHRoaXMgY2FzZS4KKwkgKi8KKwkqcHJvdG9jb2wgPSAwOworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyBUUlVFIGlmIEBwb3J0IGNvbnRhaW5zIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgb3B0aW9uLAorICogb3IgRkFMU0UgaWYgdGhlIG9wdGlvbiB3YXMgc3BlY2lmaWVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZS4KKyAqLworc3RhdGljIGludAorbmZzX25mc19wb3J0KHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBsb25nICpwb3J0KQoreworCWxvbmcgdG1wOworCisJc3dpdGNoIChwb19nZXRfbnVtZXJpYyhvcHRpb25zLCAicG9ydCIsICZ0bXApKSB7CisJY2FzZSBQT19OT1RfRk9VTkQ6CisJCWJyZWFrOworCWNhc2UgUE9fRk9VTkQ6CisJCWlmICh0bXAgPj0gMSAmJiB0bXAgPD0gNjU1MzUpIHsKKwkJCSpwb3J0ID0gdG1wOworCQkJcmV0dXJuIDE7CisJCX0KKwljYXNlIFBPX0JBRF9WQUxVRToKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBORlMgc2VydmljZSBwb3J0IHdhc24ndCBzcGVjaWZpZWQuICBUaGUgcG1hcCBwb3J0IHZhbHVlCisJICogd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgYW4gcnBjYmluZCBxdWVyeSBpbiB0aGlzIGNhc2UuCisJICovCisJKnBvcnQgPSAwOworCXJldHVybiAxOworfQorCisjaWZkZWYgSVBWNl9TVVBQT1JURUQKK3NhX2ZhbWlseV90CWNvbmZpZ19kZWZhdWx0X2ZhbWlseSA9IEFGX1VOU1BFQzsKKworc3RhdGljIGludAorbmZzX3ZlcmlmeV9mYW1pbHkoc2FfZmFtaWx5X3QgZmFtaWx5KQoreworCXJldHVybiAxOworfQorI2Vsc2UgLyogSVBWNl9TVVBQT1JURUQgKi8KK3NhX2ZhbWlseV90CWNvbmZpZ19kZWZhdWx0X2ZhbWlseSA9IEFGX0lORVQ7CisKK3N0YXRpYyBpbnQKK25mc192ZXJpZnlfZmFtaWx5KHNhX2ZhbWlseV90IGZhbWlseSkKK3sKKwlpZiAoZmFtaWx5ICE9IEFGX0lORVQpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSVBWNl9TVVBQT1JURUQgKi8KKworLyoKKyAqIFJldHVybnMgVFJVRSBhbmQgZmlsbHMgaW4gQGZhbWlseSBpZiBhIHZhbGlkIE5GUyBwcm90b2NvbCBvcHRpb24KKyAqIGlzIGZvdW5kLCBvciBGQUxTRSBpZiB0aGUgb3B0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlCisgKiBvciBpZiB0aGUgcHJvdG9jb2wgZmFtaWx5IGlzbid0IHN1cHBvcnRlZC4gT24gZXJyb3IsIGVycm5vIGlzIHNldC4KKyAqLworaW50IG5mc19uZnNfcHJvdG9fZmFtaWx5KHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLAorCQkJCXNhX2ZhbWlseV90ICpmYW1pbHkpCit7CisJdW5zaWduZWQgbG9uZyBwcm90b2NvbDsKKwljaGFyICpvcHRpb247CisJc2FfZmFtaWx5X3QgdG1wX2ZhbWlseSA9IGNvbmZpZ19kZWZhdWx0X2ZhbWlseTsKKworCXN3aXRjaCAocG9fcmlnaHRtb3N0KG9wdGlvbnMsIG5mc190cmFuc3BvcnRfb3B0dGJsKSkgeworCWNhc2UgMDoJLyogdWRwICovCisJY2FzZSAxOiAvKiB0Y3AgKi8KKwkJLyogZm9yIGNvbXBhdGliaWxpdHk7IHRoZXNlIGFyZSBhbHdheXMgQUZfSU5FVCAqLworCQkqZmFtaWx5ID0gQUZfSU5FVDsKKwkJcmV0dXJuIDE7CisJY2FzZSAyOiAvKiBwcm90byAqLworCQlvcHRpb24gPSBwb19nZXQob3B0aW9ucywgInByb3RvIik7CisJCWlmIChvcHRpb24gIT0gTlVMTCAmJgorCQkgICAgIW5mc19nZXRfcHJvdG8ob3B0aW9uLCAmdG1wX2ZhbWlseSwgJnByb3RvY29sKSkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoIW5mc192ZXJpZnlfZmFtaWx5KHRtcF9mYW1pbHkpKQorCQlnb3RvIG91dF9lcnI7CisJKmZhbWlseSA9IHRtcF9mYW1pbHk7CisJcmV0dXJuIDE7CitvdXRfZXJyOgorCWVycm5vID0gRUFGTk9TVVBQT1JUOworCXJldHVybiAwOworfQorCisvKgorICogIm1vdW50cHJvZyIgaXMgc3VwcG9ydGVkIG9ubHkgYnkgdGhlIGxlZ2FjeSBtb3VudCBjb21tYW5kLiAgVGhlCisgKiBrZXJuZWwgbW91bnQgY2xpZW50IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcHRpb24uCisgKgorICogUmV0dXJucyBUUlVFIGlmIEBwcm9ncmFtIGNvbnRhaW5zIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgb3B0aW9uLAorICogb3IgRkFMU0UgaWYgdGhlIG9wdGlvbiB3YXMgc3BlY2lmaWVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZS4KKyAqLworc3RhdGljIGludAorbmZzX21vdW50X3Byb2dyYW0oc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGxvbmcgKnByb2dyYW0pCit7CisJbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHBvX2dldF9udW1lcmljKG9wdGlvbnMsICJtb3VudHByb2ciLCAmdG1wKSkgeworCWNhc2UgUE9fTk9UX0ZPVU5EOgorCQlicmVhazsKKwljYXNlIFBPX0ZPVU5EOgorCQlpZiAodG1wID4gMCkgeworCQkJKnByb2dyYW0gPSB0bXA7CisJCQlyZXR1cm4gMTsKKwkJfQorCWNhc2UgUE9fQkFEX1ZBTFVFOgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE1OVCBSUEMgcHJvZ3JhbSB3YXNuJ3Qgc3BlY2lmaWVkLiAgVGhlIFJQQyBwcm9ncmFtCisJICogY2Fubm90IGJlIGRldGVybWluZWQgdmlhIGFuIHJwY2JpbmQgcXVlcnkuCisJICovCisJKnByb2dyYW0gPSBuZnNfZ2V0cnBjYnluYW1lKE1PVU5UUFJPRywgbmZzX21udF9wZ210YmwpOworCXJldHVybiAxOworfQorCisvKgorICogUmV0dXJucyBUUlVFIGlmIEB2ZXJzaW9uIGNvbnRhaW5zIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgb3B0aW9uLAorICogb3IgRkFMU0UgaWYgdGhlIG9wdGlvbiB3YXMgc3BlY2lmaWVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZS4KKyAqLworc3RhdGljIGludAorbmZzX21vdW50X3ZlcnNpb24oc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGxvbmcgKnZlcnNpb24pCit7CisJbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHBvX2dldF9udW1lcmljKG9wdGlvbnMsICJtb3VudHZlcnMiLCAmdG1wKSkgeworCWNhc2UgUE9fTk9UX0ZPVU5EOgorCQlicmVhazsKKwljYXNlIFBPX0ZPVU5EOgorCQlpZiAodG1wID49IDEgJiYgdG1wIDw9IDQpIHsKKwkJCSp2ZXJzaW9uID0gdG1wOworCQkJcmV0dXJuIDE7CisJCX0KKwljYXNlIFBPX0JBRF9WQUxVRToKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBNTlQgdmVyc2lvbiB3YXNuJ3Qgc3BlY2lmaWVkLiAgVGhlIHBtYXAgdmVyc2lvbiB2YWx1ZQorCSAqIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyIGJ5IGFuIHJwY2JpbmQgcXVlcnkgaW4gdGhpcyBjYXNlLgorCSAqLworCSp2ZXJzaW9uID0gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgVFJVRSBpZiBAcHJvdG9jb2wgY29udGFpbnMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24sCisgKiBvciBGQUxTRSBpZiB0aGUgb3B0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlLiBPbgorICogZXJyb3IsIGVycm5vIGlzIHNldC4KKyAqLworc3RhdGljIGludAorbmZzX21vdW50X3Byb3RvY29sKHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBsb25nICpwcm90b2NvbCkKK3sKKwlzYV9mYW1pbHlfdCBmYW1pbHk7CisJY2hhciAqb3B0aW9uOworCisJb3B0aW9uID0gcG9fZ2V0KG9wdGlvbnMsICJtb3VudHByb3RvIik7CisJaWYgKG9wdGlvbiAhPSBOVUxMKSB7CisJCWlmICghbmZzX2dldF9wcm90byhvcHRpb24sICZmYW1pbHksIHByb3RvY29sKSkgeworCQkJZXJybm8gPSBFUFJPVE9OT1NVUFBPUlQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIE1OVCB0cmFuc3BvcnQgcHJvdG9jb2wgd2Fzbid0IHNwZWNpZmllZC4gIElmIHRoZSBORlMKKwkgKiB0cmFuc3BvcnQgcHJvdG9jb2wgd2FzIHNwZWNpZmllZCwgdXNlIHRoYXQ7IG90aGVyd2lzZQorCSAqIHNldCBAcHJvdG9jb2wgdG8gemVyby4gIFRoZSBwbWFwIHByb3RvY29sIHZhbHVlIHdpbGwKKwkgKiBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgYW4gcnBjYmluZCBxdWVyeSBpbiB0aGlzIGNhc2UuCisJICovCisJcmV0dXJuIG5mc19uZnNfcHJvdG9jb2wob3B0aW9ucywgcHJvdG9jb2wpOworfQorCisvKgorICogUmV0dXJucyBUUlVFIGlmIEBwb3J0IGNvbnRhaW5zIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgb3B0aW9uLAorICogb3IgRkFMU0UgaWYgdGhlIG9wdGlvbiB3YXMgc3BlY2lmaWVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZS4KKyAqLworc3RhdGljIGludAorbmZzX21vdW50X3BvcnQoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGxvbmcgKnBvcnQpCit7CisJbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHBvX2dldF9udW1lcmljKG9wdGlvbnMsICJtb3VudHBvcnQiLCAmdG1wKSkgeworCWNhc2UgUE9fTk9UX0ZPVU5EOgorCQlicmVhazsKKwljYXNlIFBPX0ZPVU5EOgorCQlpZiAodG1wID49IDEgJiYgdG1wIDw9IDY1NTM1KSB7CisJCQkqcG9ydCA9IHRtcDsKKwkJCXJldHVybiAxOworCQl9CisJY2FzZSBQT19CQURfVkFMVUU6CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTU5UIHNlcnZpY2UgcG9ydCB3YXNuJ3Qgc3BlY2lmaWVkLiAgVGhlIHBtYXAgcG9ydCB2YWx1ZQorCSAqIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyIGJ5IGFuIHJwY2JpbmQgcXVlcnkgaW4gdGhpcyBjYXNlLgorCSAqLworCSpwb3J0ID0gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgVFJVRSBhbmQgZmlsbHMgaW4gQGZhbWlseSBpZiBhIHZhbGlkIE1OVCBwcm90b2NvbCBvcHRpb24KKyAqIGlzIGZvdW5kLCBvciBGQUxTRSBpZiB0aGUgb3B0aW9uIHdhcyBzcGVjaWZpZWQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlCisgKiBvciBpZiB0aGUgcHJvdG9jb2wgZmFtaWx5IGlzbid0IHN1cHBvcnRlZC4gT24gZXJyb3IsIGVycm5vIGlzIHNldC4KKyAqLworaW50IG5mc19tb3VudF9wcm90b19mYW1pbHkoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsCisJCQkJc2FfZmFtaWx5X3QgKmZhbWlseSkKK3sKKwl1bnNpZ25lZCBsb25nIHByb3RvY29sOworCWNoYXIgKm9wdGlvbjsKKwlzYV9mYW1pbHlfdCB0bXBfZmFtaWx5ID0gY29uZmlnX2RlZmF1bHRfZmFtaWx5OworCisJb3B0aW9uID0gcG9fZ2V0KG9wdGlvbnMsICJtb3VudHByb3RvIik7CisJaWYgKG9wdGlvbiAhPSBOVUxMKSB7CisJCWlmICghbmZzX2dldF9wcm90byhvcHRpb24sICZ0bXBfZmFtaWx5LCAmcHJvdG9jb2wpKQorCQkJZ290byBvdXRfZXJyOworCQlpZiAoIW5mc192ZXJpZnlfZmFtaWx5KHRtcF9mYW1pbHkpKQorCQkJZ290byBvdXRfZXJyOworCQkqZmFtaWx5ID0gdG1wX2ZhbWlseTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBNTlQgdHJhbnNwb3J0IHByb3RvY29sIHdhc24ndCBzcGVjaWZpZWQuICBJZiB0aGUgTkZTCisJICogdHJhbnNwb3J0IHByb3RvY29sIHdhcyBzcGVjaWZpZWQsIGRlcml2ZSB0aGUgZmFtaWx5CisJICogZnJvbSB0aGF0OyBvdGhlcndpc2UsIHJldHVybiB0aGUgZGVmYXVsdCBmYW1pbHkgZm9yCisJICogTkZTLgorCSAqLworCXJldHVybiBuZnNfbmZzX3Byb3RvX2ZhbWlseShvcHRpb25zLCBmYW1pbHkpOworb3V0X2VycjoKKwllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZnNfb3B0aW9uczJwbWFwIC0gc2V0IHVwIHBtYXAgc3RydWN0cyBiYXNlZCBvbiBtb3VudCBvcHRpb25zCisgKiBAb3B0aW9uczogcG9pbnRlciB0byBtb3VudCBvcHRpb25zCisgKiBAbmZzX3BtYXA6IE9VVDogcG9pbnRlciB0byBwbWFwIGFyZ3VtZW50cyBmb3IgTkZTIHNlcnZlcgorICogQG1udF9wbWFwOiBPVVQ6IHBvaW50ZXIgdG8gcG1hcCBhcmd1bWVudHMgZm9yIG1vdW50ZCBzZXJ2ZXIKKyAqCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIHBtYXAgb3B0aW9ucyBzcGVjaWZpZWQgaW4gQG9wdGlvbnMgaGF2ZSB2YWxpZAorICogdmFsdWVzOyBvdGhlcndpc2UgRkFMU0UgaXMgcmV0dXJuZWQuCisgKi8KK2ludCBuZnNfb3B0aW9uczJwbWFwKHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLAorCQkgICAgIHN0cnVjdCBwbWFwICpuZnNfcG1hcCwgc3RydWN0IHBtYXAgKm1udF9wbWFwKQoreworCWlmICghbmZzX25mc19wcm9ncmFtKG9wdGlvbnMsICZuZnNfcG1hcC0+cG1fcHJvZykpCisJCXJldHVybiAwOworCWlmICghbmZzX25mc192ZXJzaW9uKG9wdGlvbnMsICZuZnNfcG1hcC0+cG1fdmVycykpCisJCXJldHVybiAwOworCWlmICghbmZzX25mc19wcm90b2NvbChvcHRpb25zLCAmbmZzX3BtYXAtPnBtX3Byb3QpKQorCQlyZXR1cm4gMDsKKwlpZiAoIW5mc19uZnNfcG9ydChvcHRpb25zLCAmbmZzX3BtYXAtPnBtX3BvcnQpKQorCQlyZXR1cm4gMDsKKworCWlmICghbmZzX21vdW50X3Byb2dyYW0ob3B0aW9ucywgJm1udF9wbWFwLT5wbV9wcm9nKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFuZnNfbW91bnRfdmVyc2lvbihvcHRpb25zLCAmbW50X3BtYXAtPnBtX3ZlcnMpKQorCQlyZXR1cm4gMDsKKwlpZiAoIW5mc19tb3VudF9wcm90b2NvbChvcHRpb25zLCAmbW50X3BtYXAtPnBtX3Byb3QpKQorCQlyZXR1cm4gMDsKKwlpZiAoIW5mc19tb3VudF9wb3J0KG9wdGlvbnMsICZtbnRfcG1hcC0+cG1fcG9ydCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmV0d29yay5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25ldHdvcmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTNhMTEwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25ldHdvcmsuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogbmV0d29yay5oIC0tIFByb3ZpZGUgY29tbW9uIG5ldHdvcmsgZnVuY3Rpb25zIGZvciBORlMgbW91bnQvdW1vdW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQ2h1Y2sgTGV2ZXIgPGNodWNrLmxldmVyQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9ORlNfVVRJTFNfTU9VTlRfTkVUV09SS19ICisjZGVmaW5lIF9ORlNfVVRJTFNfTU9VTlRfTkVUV09SS19ICisKKyNpbmNsdWRlIDxycGMvcG1hcF9wcm90Lmg+CisKKyNkZWZpbmUgTU5UX1NFTkRCVUZTSVpFICgyMDQ4VSkKKyNkZWZpbmUgTU5UX1JFQ1ZCVUZTSVpFICgxMDI0VSkKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgKipob3N0bmFtZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisJc3RydWN0IHBtYXAgcG1hcDsKK30gY2xudF9hZGRyX3Q7CisKKy8qIFJQQyBjYWxsIHRpbWVvdXQgdmFsdWVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRpbWV2YWwgVElNRU9VVCA9IHsgMjAsIDAgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXZhbCBSRVRSWV9USU1FT1VUID0geyAzLCAwIH07CisKK2ludCBwcm9iZV9ib3RocG9ydHMoY2xudF9hZGRyX3QgKiwgY2xudF9hZGRyX3QgKik7CitpbnQgbmZzX3Byb2JlX2JvdGhwb3J0cyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwgY29uc3Qgc29ja2xlbl90LAorCQkJc3RydWN0IHBtYXAgKiwgY29uc3Qgc3RydWN0IHNvY2thZGRyICosCisJCQljb25zdCBzb2NrbGVuX3QsIHN0cnVjdCBwbWFwICopOworaW50IG5mc19nZXRob3N0YnluYW1lKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNvY2thZGRyX2luICopOworaW50IG5mc19sb29rdXAoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IHNhX2ZhbWlseV90IGZhbWlseSwKKwkJc3RydWN0IHNvY2thZGRyICpzYXAsIHNvY2tsZW5fdCAqc2FsZW4pOworaW50IG5mc19zdHJpbmdfdG9fc29ja2FkZHIoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc29ja2xlbl90ICopOworaW50IG5mc19wcmVzZW50X3NvY2thZGRyKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLAorCQkJIGNvbnN0IHNvY2tsZW5fdCwgY2hhciAqLCBjb25zdCBzaXplX3QpOworaW50IG5mc19jYWxsYmFja19hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBjb25zdCBzb2NrbGVuX3QsCisJCXN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QgKik7CitpbnQgY2xudF9waW5nKHN0cnVjdCBzb2NrYWRkcl9pbiAqLCBjb25zdCB1bnNpZ25lZCBsb25nLAorCQljb25zdCB1bnNpZ25lZCBsb25nLCBjb25zdCB1bnNpZ25lZCBpbnQsCisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqKTsKKworc3RydWN0IG1vdW50X29wdGlvbnM7CisKK2ludCBuZnNfbmZzX3Byb3RvX2ZhbWlseShzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgc2FfZmFtaWx5X3QgKmZhbWlseSk7CitpbnQgbmZzX21vdW50X3Byb3RvX2ZhbWlseShzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgc2FfZmFtaWx5X3QgKmZhbWlseSk7CitpbnQgbmZzX25mc192ZXJzaW9uKHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLCB1bnNpZ25lZCBsb25nICp2ZXJzaW9uKTsKK2ludCAgbmZzX25mc19wcm90b2NvbChzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgbG9uZyAqcHJvdG9jb2wpOworCitpbnQgbmZzX29wdGlvbnMycG1hcChzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqLAorCQkgICAgICBzdHJ1Y3QgcG1hcCAqLCBzdHJ1Y3QgcG1hcCAqKTsKKworaW50IHN0YXJ0X3N0YXRkKHZvaWQpOworCit1bnNpZ25lZCBsb25nIG5mc3ZlcnNfdG9fbW50KGNvbnN0IHVuc2lnbmVkIGxvbmcpOworCitpbnQgbmZzX2NhbGxfdW1vdW50KGNsbnRfYWRkcl90ICosIGRpcnBhdGggKik7CitpbnQgbmZzX2FkdmlzZV91bW91bnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICosIGNvbnN0IHNvY2tsZW5fdCwKKwkJICAgICAgY29uc3Qgc3RydWN0IHBtYXAgKiwgY29uc3QgZGlycGF0aCAqKTsKK0NMSUVOVCAqbW50X29wZW5jbG50KGNsbnRfYWRkcl90ICosIGludCAqKTsKK3ZvaWQgbW50X2Nsb3NlY2xudChDTElFTlQgKiwgaW50KTsKKworI2VuZGlmCS8qIF9ORlNfVVRJTFNfTU9VTlRfTkVUV09SS19IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzLm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnMubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NGRlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzLm1hbgpAQCAtMCwwICsxLDE1NjcgQEAKKy5cIkAoIyluZnMuNSIKKy5USCBORlMgNSAiMiBOb3ZlbWJlciAyMDA3IgorLlNIIE5BTUUKK25mcyBcLSBmc3RhYiBmb3JtYXQgYW5kIG9wdGlvbnMgZm9yIHRoZQorLkIgbmZzCithbmQKKy5CIG5mczQKK2ZpbGUgc3lzdGVtcworLlNIIFNZTk9QU0lTCisuSSAvZXRjL2ZzdGFiCisuU0ggREVTQ1JJUFRJT04KK05GUyBpcyBhbiBJbnRlcm5ldCBTdGFuZGFyZCBwcm90b2NvbAorY3JlYXRlZCBieSBTdW4gTWljcm9zeXN0ZW1zIGluIDE5ODQuIE5GUyB3YXMgZGV2ZWxvcGVkCit0byBhbGxvdyBmaWxlIHNoYXJpbmcgYmV0d2VlbiBzeXN0ZW1zIHJlc2lkaW5nCitvbiBhIGxvY2FsIGFyZWEgbmV0d29yay4KK1RoZSBMaW51eCBORlMgY2xpZW50IHN1cHBvcnRzIHRocmVlIHZlcnNpb25zCitvZiB0aGUgTkZTIHByb3RvY29sOgorTkZTIHZlcnNpb24gMiBbUkZDMTA5NF0sCitORlMgdmVyc2lvbiAzIFtSRkMxODEzXSwKK2FuZCBORlMgdmVyc2lvbiA0IFtSRkMzNTMwXS4KKy5QCitUaGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQgYXR0YWNoZXMgYSBmaWxlIHN5c3RlbSB0byB0aGUgc3lzdGVtJ3MKK25hbWUgc3BhY2UgaGllcmFyY2h5IGF0IGEgZ2l2ZW4gbW91bnQgcG9pbnQuCitUaGUKKy5JIC9ldGMvZnN0YWIKK2ZpbGUgZGVzY3JpYmVzIGhvdworLkJSIG1vdW50ICg4KQorc2hvdWxkIGFzc2VtYmxlIGEgc3lzdGVtJ3MgZmlsZSBuYW1lIGhpZXJhcmNoeQorZnJvbSB2YXJpb3VzIGluZGVwZW5kZW50IGZpbGUgc3lzdGVtcworKGluY2x1ZGluZyBmaWxlIHN5c3RlbXMgZXhwb3J0ZWQgYnkgTkZTIHNlcnZlcnMpLgorRWFjaCBsaW5lIGluIHRoZQorLkkgL2V0Yy9mc3RhYgorZmlsZSBkZXNjcmliZXMgYSBzaW5nbGUgZmlsZSBzeXN0ZW0sIGl0cyBtb3VudCBwb2ludCwKK2FuZCBhIHNldCBvZiBkZWZhdWx0IG1vdW50IG9wdGlvbnMgZm9yIHRoYXQgbW91bnQgcG9pbnQuCisuUAorRm9yIE5GUyBmaWxlIHN5c3RlbSBtb3VudHMsIGEgbGluZSBpbiB0aGUKKy5JIC9ldGMvZnN0YWIKK2ZpbGUgc3BlY2lmaWVzIHRoZSBzZXJ2ZXIgbmFtZSwKK3RoZSBwYXRoIG5hbWUgb2YgdGhlIGV4cG9ydGVkIHNlcnZlciBkaXJlY3RvcnkgdG8gbW91bnQsCit0aGUgbG9jYWwgZGlyZWN0b3J5IHRoYXQgaXMgdGhlIG1vdW50IHBvaW50LAordGhlIHR5cGUgb2YgZmlsZSBzeXN0ZW0gdGhhdCBpcyBiZWluZyBtb3VudGVkLAorYW5kIGEgbGlzdCBvZiBtb3VudCBvcHRpb25zIHRoYXQgY29udHJvbAordGhlIHdheSB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkIGFuZAoraG93IHRoZSBORlMgY2xpZW50IGJlaGF2ZXMgd2hlbiBhY2Nlc3NpbmcKK2ZpbGVzIG9uIHRoaXMgbW91bnQgcG9pbnQuCitUaGUgZmlmdGggYW5kIHNpeHRoIGZpZWxkcyBvbiBlYWNoIGxpbmUgYXJlIG5vdCB1c2VkCitieSBORlMsIHRodXMgY29udmVudGlvbmFsbHkgZWFjaCBjb250YWluIHRoZSBkaWdpdCB6ZXJvLiBGb3IgZXhhbXBsZToKKy5QCisuU1AKKy5ORgorLlRBIDIuNWkgKzAuNzVpICswLjc1aSArMS4waQorCXNlcnZlcjpwYXRoCS9tb3VudHBvaW50CWZzdHlwZQlvcHRpb24sb3B0aW9uLC4uLgkwIDAKKy5GSQorLlAKK1RoZSBzZXJ2ZXIncyBob3N0bmFtZSBhbmQgZXhwb3J0IHBhdGhuYW1lCithcmUgc2VwYXJhdGVkIGJ5IGEgY29sb24sIHdoaWxlCit0aGUgbW91bnQgb3B0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4gVGhlIHJlbWFpbmluZyBmaWVsZHMKK2FyZSBzZXBhcmF0ZWQgYnkgYmxhbmtzIG9yIHRhYnMuCisuUAorVGhlIHNlcnZlcidzIGhvc3RuYW1lIGNhbiBiZSBhbiB1bnF1YWxpZmllZCBob3N0bmFtZSwKK2EgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLAorYSBkb3R0ZWQgcXVhZCBJUHY0IGFkZHJlc3MsIG9yCithbiBJUHY2IGFkZHJlc3MgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzLgorTGluay1sb2NhbCBhbmQgc2l0ZS1sb2NhbCBJUHY2IGFkZHJlc3NlcyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGFuCitpbnRlcmZhY2UgaWRlbnRpZmllci4KK1NlZQorLkJSIGlwdjYgKDcpCitmb3IgZGV0YWlscyBvbiBzcGVjaWZ5aW5nIHJhdyBJUHY2IGFkZHJlc3Nlcy4KKy5QCitUaGUKKy5JIGZzdHlwZQorZmllbGQgY29udGFpbnMgZWl0aGVyICJuZnMiIChmb3IgdmVyc2lvbiAyIG9yIHZlcnNpb24gMyBORlMgbW91bnRzKQorb3IgIm5mczQiIChmb3IgTkZTIHZlcnNpb24gNCBtb3VudHMpLgorVGhlCisuQiBuZnMKK2FuZAorLkIgbmZzNAorZmlsZSBzeXN0ZW0gdHlwZXMgc2hhcmUgc2ltaWxhciBtb3VudCBvcHRpb25zLAord2hpY2ggYXJlIGRlc2NyaWJlZCBiZWxvdy4KKy5TSCAiTU9VTlQgT1BUSU9OUyIKK1JlZmVyIHRvCisuQlIgbW91bnQgKDgpCitmb3IgYSBkZXNjcmlwdGlvbiBvZiBnZW5lcmljIG1vdW50IG9wdGlvbnMKK2F2YWlsYWJsZSBmb3IgYWxsIGZpbGUgc3lzdGVtcy4gSWYgeW91IGRvIG5vdCBuZWVkIHRvCitzcGVjaWZ5IGFueSBtb3VudCBvcHRpb25zLCB1c2UgdGhlIGdlbmVyaWMgb3B0aW9uCisuQiBkZWZhdWx0cworaW4KKy5JUiAvZXRjL2ZzdGFiIC4KKy5EVAorLlNTICJWYWxpZCBvcHRpb25zIGZvciBlaXRoZXIgdGhlIG5mcyBvciBuZnM0IGZpbGUgc3lzdGVtIHR5cGUiCitUaGVzZSBvcHRpb25zIGFyZSB2YWxpZCB0byB1c2Ugd2hlbiBtb3VudGluZyBlaXRoZXIKKy5CIG5mcworb3IKKy5CIG5mczQKK2ZpbGUgc3lzdGVtIHR5cGVzLgorVGhleSBpbXBseSB0aGUgc2FtZSBiZWhhdmlvcgorYW5kIGhhdmUgdGhlIHNhbWUgZGVmYXVsdCBmb3IgYm90aCBmaWxlIHN5c3RlbSB0eXBlcy4KKy5UUCAxLjVpCisuQlIgc29mdCAiIC8gIiBoYXJkCitEZXRlcm1pbmVzIHRoZSByZWNvdmVyeSBiZWhhdmlvciBvZiB0aGUgTkZTIGNsaWVudAorYWZ0ZXIgYW4gTkZTIHJlcXVlc3QgdGltZXMgb3V0LgorSWYgbmVpdGhlciBvcHRpb24gaXMgc3BlY2lmaWVkIChvciBpZiB0aGUKKy5CIGhhcmQKK29wdGlvbiBpcyBzcGVjaWZpZWQpLCBORlMgcmVxdWVzdHMgYXJlIHJldHJpZWQgaW5kZWZpbml0ZWx5LgorSWYgdGhlCisuQiBzb2Z0CitvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBORlMgY2xpZW50IGZhaWxzIGFuIE5GUyByZXF1ZXN0CithZnRlcgorLkIgcmV0cmFucworcmV0cmFuc21pc3Npb25zIGhhdmUgYmVlbiBzZW50LAorY2F1c2luZyB0aGUgTkZTIGNsaWVudCB0byByZXR1cm4gYW4gZXJyb3IKK3RvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLgorLklQCisuSSBOQjoKK0Egc28tY2FsbGVkICJzb2Z0IiB0aW1lb3V0IGNhbiBjYXVzZQorc2lsZW50IGRhdGEgY29ycnVwdGlvbiBpbiBjZXJ0YWluIGNhc2VzLiBBcyBzdWNoLCB1c2UgdGhlCisuQiBzb2Z0CitvcHRpb24gb25seSB3aGVuIGNsaWVudCByZXNwb25zaXZlbmVzcworaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBkYXRhIGludGVncml0eS4KK1VzaW5nIE5GUyBvdmVyIFRDUCBvciBpbmNyZWFzaW5nIHRoZSB2YWx1ZSBvZiB0aGUKKy5CIHJldHJhbnMKK29wdGlvbiBtYXkgbWl0aWdhdGUgc29tZSBvZiB0aGUgcmlza3Mgb2YgdXNpbmcgdGhlCisuQiBzb2Z0CitvcHRpb24uCisuVFAgMS41aQorLkJJIHRpbWVvPSBuCitUaGUgdGltZSAoaW4gdGVudGhzIG9mIGEgc2Vjb25kKSB0aGUgTkZTIGNsaWVudCB3YWl0cyBmb3IgYQorcmVzcG9uc2UgYmVmb3JlIGl0IHJldHJpZXMgYW4gTkZTIHJlcXVlc3QuIElmIHRoaXMKK29wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCByZXF1ZXN0cyBhcmUgcmV0cmllZCBldmVyeQorNjAgc2Vjb25kcyBmb3IgTkZTIG92ZXIgVENQLgorVGhlIE5GUyBjbGllbnQgZG9lcyBub3QgcGVyZm9ybSBhbnkga2luZCBvZiB0aW1lb3V0IGJhY2tvZmYKK2ZvciBORlMgb3ZlciBUQ1AuCisuSVAKK0hvd2V2ZXIsIGZvciBORlMgb3ZlciBVRFAsIHRoZSBjbGllbnQgdXNlcyBhbiBhZGFwdGl2ZQorYWxnb3JpdGhtIHRvIGVzdGltYXRlIGFuIGFwcHJvcHJpYXRlIHRpbWVvdXQgdmFsdWUgZm9yIGZyZXF1ZW50bHkgdXNlZAorcmVxdWVzdCB0eXBlcyAoc3VjaCBhcyBSRUFEIGFuZCBXUklURSByZXF1ZXN0cyksIGJ1dCB1c2VzIHRoZQorLkIgdGltZW8KK3NldHRpbmcgZm9yIGluZnJlcXVlbnRseSB1c2VkIHJlcXVlc3QgdHlwZXMgKHN1Y2ggYXMgRlNJTkZPIHJlcXVlc3RzKS4KK0lmIHRoZQorLkIgdGltZW8KK29wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLAoraW5mcmVxdWVudGx5IHVzZWQgcmVxdWVzdCB0eXBlcyBhcmUgcmV0cmllZCBhZnRlciAxLjEgc2Vjb25kcy4KK0FmdGVyIGVhY2ggcmV0cmFuc21pc3Npb24sIHRoZSBORlMgY2xpZW50IGRvdWJsZXMgdGhlIHRpbWVvdXQgZm9yCit0aGF0IHJlcXVlc3QsCit1cCB0byBhIG1heGltdW0gdGltZW91dCBsZW5ndGggb2YgNjAgc2Vjb25kcy4KKy5UUCAxLjVpCisuQkkgcmV0cmFucz0gbgorVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgTkZTIGNsaWVudCByZXRyaWVzIGEgcmVxdWVzdCBiZWZvcmUKK2l0IGF0dGVtcHRzIGZ1cnRoZXIgcmVjb3ZlcnkgYWN0aW9uLiBJZiB0aGUKKy5CIHJldHJhbnMKK29wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgTkZTIGNsaWVudCB0cmllcyBlYWNoIHJlcXVlc3QKK3RocmVlIHRpbWVzLgorLklQCitUaGUgTkZTIGNsaWVudCBnZW5lcmF0ZXMgYSAic2VydmVyIG5vdCByZXNwb25kaW5nIiBtZXNzYWdlCithZnRlcgorLkIgcmV0cmFucworcmV0cmllcywgdGhlbiBhdHRlbXB0cyBmdXJ0aGVyIHJlY292ZXJ5IChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKy5CIGhhcmQKK21vdW50IG9wdGlvbiBpcyBpbiBlZmZlY3QpLgorLlRQIDEuNWkKKy5CSSByc2l6ZT0gbgorVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGluIGVhY2ggbmV0d29yayBSRUFEIHJlcXVlc3QKK3RoYXQgdGhlIE5GUyBjbGllbnQgY2FuIHJlY2VpdmUgd2hlbiByZWFkaW5nIGRhdGEgZnJvbSBhIGZpbGUKK29uIGFuIE5GUyBzZXJ2ZXIuCitUaGUgYWN0dWFsIGRhdGEgcGF5bG9hZCBzaXplIG9mIGVhY2ggTkZTIFJFQUQgcmVxdWVzdCBpcyBlcXVhbCB0bworb3Igc21hbGxlciB0aGFuIHRoZQorLkIgcnNpemUKK3NldHRpbmcuIFRoZSBsYXJnZXN0IHJlYWQgcGF5bG9hZCBzdXBwb3J0ZWQgYnkgdGhlIExpbnV4IE5GUyBjbGllbnQKK2lzIDEsMDQ4LDU3NiBieXRlcyAob25lIG1lZ2FieXRlKS4KKy5JUAorVGhlCisuQiByc2l6ZQordmFsdWUgaXMgYSBwb3NpdGl2ZSBpbnRlZ3JhbCBtdWx0aXBsZSBvZiAxMDI0LgorU3BlY2lmaWVkCisuQiByc2l6ZQordmFsdWVzIGxvd2VyIHRoYW4gMTAyNCBhcmUgcmVwbGFjZWQgd2l0aCA0MDk2OyB2YWx1ZXMgbGFyZ2VyIHRoYW4KKzEwNDg1NzYgYXJlIHJlcGxhY2VkIHdpdGggMTA0ODU3Ni4gSWYgYSBzcGVjaWZpZWQgdmFsdWUgaXMgd2l0aGluIHRoZSBzdXBwb3J0ZWQKK3JhbmdlIGJ1dCBub3QgYSBtdWx0aXBsZSBvZiAxMDI0LCBpdCBpcyByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QKK211bHRpcGxlIG9mIDEwMjQuCisuSVAKK0lmIGFuCisuQiByc2l6ZQordmFsdWUgaXMgbm90IHNwZWNpZmllZCwgb3IgaWYgdGhlIHNwZWNpZmllZAorLkIgcnNpemUKK3ZhbHVlIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHRoYXQgZWl0aGVyIGNsaWVudCBvciBzZXJ2ZXIgY2FuIHN1cHBvcnQsCit0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgbmVnb3RpYXRlIHRoZSBsYXJnZXN0CisuQiByc2l6ZQordmFsdWUgdGhhdCB0aGV5IGNhbiBib3RoIHN1cHBvcnQuCisuSVAKK1RoZQorLkIgcnNpemUKK21vdW50IG9wdGlvbiBhcyBzcGVjaWZpZWQgb24gdGhlCisuQlIgbW91bnQgKDgpCitjb21tYW5kIGxpbmUgYXBwZWFycyBpbiB0aGUKKy5JIC9ldGMvbXRhYgorZmlsZS4gSG93ZXZlciwgdGhlIGVmZmVjdGl2ZQorLkIgcnNpemUKK3ZhbHVlIG5lZ290aWF0ZWQgYnkgdGhlIGNsaWVudCBhbmQgc2VydmVyIGlzIHJlcG9ydGVkIGluIHRoZQorLkkgL3Byb2MvbW91bnRzCitmaWxlLgorLlRQIDEuNWkKKy5CSSB3c2l6ZT0gbgorVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBuZXR3b3JrIFdSSVRFIHJlcXVlc3QKK3RoYXQgdGhlIE5GUyBjbGllbnQgY2FuIHNlbmQgd2hlbiB3cml0aW5nIGRhdGEgdG8gYSBmaWxlCitvbiBhbiBORlMgc2VydmVyLiBUaGUgYWN0dWFsIGRhdGEgcGF5bG9hZCBzaXplIG9mIGVhY2gKK05GUyBXUklURSByZXF1ZXN0IGlzIGVxdWFsIHRvCitvciBzbWFsbGVyIHRoYW4gdGhlCisuQiB3c2l6ZQorc2V0dGluZy4gVGhlIGxhcmdlc3Qgd3JpdGUgcGF5bG9hZCBzdXBwb3J0ZWQgYnkgdGhlIExpbnV4IE5GUyBjbGllbnQKK2lzIDEsMDQ4LDU3NiBieXRlcyAob25lIG1lZ2FieXRlKS4KKy5JUAorU2ltaWxhciB0bworLkIgcnNpemUKKywgdGhlCisuQiB3c2l6ZQordmFsdWUgaXMgYSBwb3NpdGl2ZSBpbnRlZ3JhbCBtdWx0aXBsZSBvZiAxMDI0LgorU3BlY2lmaWVkCisuQiB3c2l6ZQordmFsdWVzIGxvd2VyIHRoYW4gMTAyNCBhcmUgcmVwbGFjZWQgd2l0aCA0MDk2OyB2YWx1ZXMgbGFyZ2VyIHRoYW4KKzEwNDg1NzYgYXJlIHJlcGxhY2VkIHdpdGggMTA0ODU3Ni4gSWYgYSBzcGVjaWZpZWQgdmFsdWUgaXMgd2l0aGluIHRoZSBzdXBwb3J0ZWQKK3JhbmdlIGJ1dCBub3QgYSBtdWx0aXBsZSBvZiAxMDI0LCBpdCBpcyByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QKK211bHRpcGxlIG9mIDEwMjQuCisuSVAKK0lmIGEKKy5CIHdzaXplCit2YWx1ZSBpcyBub3Qgc3BlY2lmaWVkLCBvciBpZiB0aGUgc3BlY2lmaWVkCisuQiB3c2l6ZQordmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gdGhhdCBlaXRoZXIgY2xpZW50IG9yIHNlcnZlciBjYW4gc3VwcG9ydCwKK3RoZSBjbGllbnQgYW5kIHNlcnZlciBuZWdvdGlhdGUgdGhlIGxhcmdlc3QKKy5CIHdzaXplCit2YWx1ZSB0aGF0IHRoZXkgY2FuIGJvdGggc3VwcG9ydC4KKy5JUAorVGhlCisuQiB3c2l6ZQorbW91bnQgb3B0aW9uIGFzIHNwZWNpZmllZCBvbiB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQgbGluZSBhcHBlYXJzIGluIHRoZQorLkkgL2V0Yy9tdGFiCitmaWxlLiBIb3dldmVyLCB0aGUgZWZmZWN0aXZlCisuQiB3c2l6ZQordmFsdWUgbmVnb3RpYXRlZCBieSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaXMgcmVwb3J0ZWQgaW4gdGhlCisuSSAvcHJvYy9tb3VudHMKK2ZpbGUuCisuVFAgMS41aQorLkJSIGFjICIgLyAiIG5vYWMKK1NlbGVjdHMgd2hldGhlciB0aGUgY2xpZW50IG1heSBjYWNoZSBmaWxlIGF0dHJpYnV0ZXMuIElmIG5laXRoZXIKK29wdGlvbiBpcyBzcGVjaWZpZWQgKG9yIGlmCisuQiBhYworaXMgc3BlY2lmaWVkKSwgdGhlIGNsaWVudCBjYWNoZXMgZmlsZQorYXR0cmlidXRlcy4KKy5JUAorVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgTkZTIGNsaWVudHMgY2FjaGUgZmlsZQorYXR0cmlidXRlcy4gRXZlcnkgZmV3IHNlY29uZHMsIGFuIE5GUyBjbGllbnQgY2hlY2tzIHRoZSBzZXJ2ZXIncyB2ZXJzaW9uIG9mIGVhY2gKK2ZpbGUncyBhdHRyaWJ1dGVzIGZvciB1cGRhdGVzLiAgQ2hhbmdlcyB0aGF0IG9jY3VyIG9uIHRoZSBzZXJ2ZXIgaW4KK3Rob3NlIHNtYWxsIGludGVydmFscyByZW1haW4gdW5kZXRlY3RlZCB1bnRpbCB0aGUgY2xpZW50IGNoZWNrcyB0aGUKK3NlcnZlciBhZ2Fpbi4gVGhlCisuQiBub2FjCitvcHRpb24gcHJldmVudHMgY2xpZW50cyBmcm9tIGNhY2hpbmcgZmlsZQorYXR0cmlidXRlcyBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gbW9yZSBxdWlja2x5IGRldGVjdCBmaWxlIGNoYW5nZXMKK29uIHRoZSBzZXJ2ZXIuCisuSVAKK0luIGFkZGl0aW9uIHRvIHByZXZlbnRpbmcgdGhlIGNsaWVudCBmcm9tIGNhY2hpbmcgZmlsZSBhdHRyaWJ1dGVzLAordGhlCisuQiBub2FjCitvcHRpb24gZm9yY2VzIGFwcGxpY2F0aW9uIHdyaXRlcyB0byBiZWNvbWUgc3luY2hyb25vdXMgc28KK3RoYXQgbG9jYWwgY2hhbmdlcyB0byBhIGZpbGUgYmVjb21lIHZpc2libGUgb24gdGhlIHNlcnZlcgoraW1tZWRpYXRlbHkuICBUaGF0IHdheSwgb3RoZXIgY2xpZW50cyBjYW4gcXVpY2tseSBkZXRlY3QgcmVjZW50Cit3cml0ZXMgd2hlbiB0aGV5IGNoZWNrIHRoZSBmaWxlJ3MgYXR0cmlidXRlcy4KKy5JUAorVXNpbmcgdGhlCisuQiBub2FjCitvcHRpb24gcHJvdmlkZXMgZ3JlYXRlciBjYWNoZSBjb2hlcmVuY2UgYW1vbmcgTkZTIGNsaWVudHMKK2FjY2Vzc2luZyB0aGUgc2FtZSBmaWxlcywKK2J1dCBpdCBleHRyYWN0cyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsdHkuCitBcyBzdWNoLCBqdWRpY2lvdXMgdXNlIG9mIGZpbGUgbG9ja2luZyBpcyBlbmNvdXJhZ2VkIGluc3RlYWQuCitUaGUgREFUQSBBTkQgTUVUQURBVEEgQ09IRVJFTkNFIHNlY3Rpb24gY29udGFpbnMgYSBkZXRhaWxlZCBkaXNjdXNzaW9uCitvZiB0aGVzZSB0cmFkZS1vZmZzLgorLlRQIDEuNWkKKy5CSSBhY3JlZ21pbj0gbgorVGhlIG1pbmltdW0gdGltZSAoaW4gc2Vjb25kcykgdGhhdCB0aGUgTkZTIGNsaWVudCBjYWNoZXMKK2F0dHJpYnV0ZXMgb2YgYSByZWd1bGFyIGZpbGUgYmVmb3JlIGl0IHJlcXVlc3RzCitmcmVzaCBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gZnJvbSBhIHNlcnZlci4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBORlMgY2xpZW50IHVzZXMKK2EgMy1zZWNvbmQgbWluaW11bS4KKy5UUCAxLjVpCisuQkkgYWNyZWdtYXg9IG4KK1RoZSBtYXhpbXVtIHRpbWUgKGluIHNlY29uZHMpIHRoYXQgdGhlIE5GUyBjbGllbnQgY2FjaGVzCithdHRyaWJ1dGVzIG9mIGEgcmVndWxhciBmaWxlIGJlZm9yZSBpdCByZXF1ZXN0cworZnJlc2ggYXR0cmlidXRlIGluZm9ybWF0aW9uIGZyb20gYSBzZXJ2ZXIuCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgTkZTIGNsaWVudCB1c2VzCithIDYwLXNlY29uZCBtYXhpbXVtLgorLlRQIDEuNWkKKy5CSSBhY2Rpcm1pbj0gbgorVGhlIG1pbmltdW0gdGltZSAoaW4gc2Vjb25kcykgdGhhdCB0aGUgTkZTIGNsaWVudCBjYWNoZXMKK2F0dHJpYnV0ZXMgb2YgYSBkaXJlY3RvcnkgYmVmb3JlIGl0IHJlcXVlc3RzCitmcmVzaCBhdHRyaWJ1dGUgaW5mb3JtYXRpb24gZnJvbSBhIHNlcnZlci4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBORlMgY2xpZW50IHVzZXMKK2EgMzAtc2Vjb25kIG1pbmltdW0uCisuVFAgMS41aQorLkJJIGFjZGlybWF4PSBuCitUaGUgbWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHRoZSBORlMgY2xpZW50IGNhY2hlcworYXR0cmlidXRlcyBvZiBhIGRpcmVjdG9yeSBiZWZvcmUgaXQgcmVxdWVzdHMKK2ZyZXNoIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiBmcm9tIGEgc2VydmVyLgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIE5GUyBjbGllbnQgdXNlcworYSA2MC1zZWNvbmQgbWF4aW11bS4KKy5UUCAxLjVpCisuQkkgYWN0aW1lbz0gbgorVXNpbmcKKy5CIGFjdGltZW8KK3NldHMgYWxsIG9mCisuQlIgYWNyZWdtaW4gLAorLkJSIGFjcmVnbWF4ICwKKy5CUiBhY2Rpcm1pbiAsCithbmQKKy5CIGFjZGlybWF4Cit0byB0aGUgc2FtZSB2YWx1ZS4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBORlMgY2xpZW50IHVzZXMKK3RoZSBkZWZhdWx0cyBmb3IgZWFjaCBvZiB0aGVzZSBvcHRpb25zIGxpc3RlZCBhYm92ZS4KKy5UUCAxLjVpCisuQlIgYmcgIiAvICIgZmcKK0RldGVybWluZXMgaG93IHRoZQorLkJSIG1vdW50ICg4KQorY29tbWFuZCBiZWhhdmVzIGlmIGFuIGF0dGVtcHQgdG8gbW91bnQgYW4gZXhwb3J0IGZhaWxzLgorVGhlCisuQiBmZworb3B0aW9uIGNhdXNlcworLkJSIG1vdW50ICg4KQordG8gZXhpdCB3aXRoIGFuIGVycm9yIHN0YXR1cyBpZiBhbnkgcGFydCBvZiB0aGUgbW91bnQgcmVxdWVzdAordGltZXMgb3V0IG9yIGZhaWxzIG91dHJpZ2h0LgorVGhpcyBpcyBjYWxsZWQgYSAiZm9yZWdyb3VuZCIgbW91bnQsCithbmQgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaWYgbmVpdGhlciB0aGUKKy5CIGZnCitub3IKKy5CIGJnCittb3VudCBvcHRpb24gaXMgc3BlY2lmaWVkLgorLklQCitJZiB0aGUKKy5CIGJnCitvcHRpb24gaXMgc3BlY2lmaWVkLCBhIHRpbWVvdXQgb3IgZmFpbHVyZSBjYXVzZXMgdGhlCisuQlIgbW91bnQgKDgpCitjb21tYW5kIHRvIGZvcmsgYSBjaGlsZCB3aGljaCBjb250aW51ZXMgdG8gYXR0ZW1wdAordG8gbW91bnQgdGhlIGV4cG9ydC4KK1RoZSBwYXJlbnQgaW1tZWRpYXRlbHkgcmV0dXJucyB3aXRoIGEgemVybyBleGl0IGNvZGUuCitUaGlzIGlzIGtub3duIGFzIGEgImJhY2tncm91bmQiIG1vdW50LgorLklQCitJZiB0aGUgbG9jYWwgbW91bnQgcG9pbnQgZGlyZWN0b3J5IGlzIG1pc3NpbmcsIHRoZQorLkJSIG1vdW50ICg4KQorY29tbWFuZCBhY3RzIGFzIGlmIHRoZSBtb3VudCByZXF1ZXN0IHRpbWVkIG91dC4KK1RoaXMgcGVybWl0cyBuZXN0ZWQgTkZTIG1vdW50cyBzcGVjaWZpZWQgaW4KKy5JIC9ldGMvZnN0YWIKK3RvIHByb2NlZWQgaW4gYW55IG9yZGVyIGR1cmluZyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24sCitldmVuIGlmIHNvbWUgTkZTIHNlcnZlcnMgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlLgorQWx0ZXJuYXRpdmVseSB0aGVzZSBpc3N1ZXMgY2FuIGJlIGFkZHJlc3NlZAordXNpbmcgYW4gYXV0b21vdW50ZXIgKHJlZmVyIHRvCisuQlIgYXV0b21vdW50ICg4KQorZm9yIGRldGFpbHMpLgorLlRQIDEuNWkKKy5CSSByZXRyeT0gbgorVGhlIG51bWJlciBvZiBtaW51dGVzIHRoYXQgdGhlCisuQlIgbW91bnQgKDgpCitjb21tYW5kIHJldHJpZXMgYW4gTkZTIG1vdW50IG9wZXJhdGlvbgoraW4gdGhlIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCBiZWZvcmUgZ2l2aW5nIHVwLgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZvcmVncm91bmQgbW91bnRzCitpcyAyIG1pbnV0ZXMsIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYmFja2dyb3VuZCBtb3VudHMgaXMgMTAwMDAgbWludXRlcworKDgwIG1pbnV0ZXMgc2h5IG9mIG9uZSB3ZWVrKS4KK0lmIGEgdmFsdWUgb2YgemVybyBpcyBzcGVjaWZpZWQsIHRoZQorLkJSIG1vdW50ICg4KQorY29tbWFuZCBleGl0cyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3QgZmFpbHVyZS4KKy5UUCAxLjVpCisuQkkgc2VjPSBtb2RlCitUaGUgUlBDR1NTIHNlY3VyaXR5IGZsYXZvciB0byB1c2UgZm9yIGFjY2Vzc2luZyBmaWxlcyBvbiB0aGlzIG1vdW50IHBvaW50LgorSWYgdGhlCisuQiBzZWMKK29wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBvciBpZgorLkIgc2VjPXN5cworaXMgc3BlY2lmaWVkLCB0aGUgTkZTIGNsaWVudCB1c2VzIHRoZSBBVVRIX1NZUyBzZWN1cml0eSBmbGF2b3IKK2ZvciBhbGwgTkZTIHJlcXVlc3RzIG9uIHRoaXMgbW91bnQgcG9pbnQuCitWYWxpZCBzZWN1cml0eSBmbGF2b3JzIGFyZQorLkJSIG5vbmUgLAorLkJSIHN5cyAsCisuQlIga3JiNSAsCisuQlIga3JiNWkgLAorLkJSIGtyYjVwICwKKy5CUiBsa2V5ICwKKy5CUiBsa2V5aSAsCisuQlIgbGtleXAgLAorLkJSIHNwa20gLAorLkJSIHNwa21pICwKK2FuZAorLkJSIHNwa21wIC4KK1JlZmVyIHRvIHRoZSBTRUNVUklUWSBDT05TSURFUkFUSU9OUyBzZWN0aW9uIGZvciBkZXRhaWxzLgorLlRQIDEuNWkKKy5CUiBzaGFyZWNhY2hlICIgLyAiIG5vc2hhcmVjYWNoZQorRGV0ZXJtaW5lcyBob3cgdGhlIGNsaWVudCdzIGRhdGEgY2FjaGUgYW5kIGF0dHJpYnV0ZSBjYWNoZSBhcmUgc2hhcmVkCit3aGVuIG1vdW50aW5nIHRoZSBzYW1lIGV4cG9ydCBtb3JlIHRoYW4gb25jZSBjb25jdXJyZW50bHkuICBVc2luZyB0aGUKK3NhbWUgY2FjaGUgcmVkdWNlcyBtZW1vcnkgcmVxdWlyZW1lbnRzIG9uIHRoZSBjbGllbnQgYW5kIHByZXNlbnRzCitpZGVudGljYWwgZmlsZSBjb250ZW50cyB0byBhcHBsaWNhdGlvbnMgd2hlbiB0aGUgc2FtZSByZW1vdGUgZmlsZSBpcworYWNjZXNzZWQgdmlhIGRpZmZlcmVudCBtb3VudCBwb2ludHMuCisuSVAKK0lmIG5laXRoZXIgb3B0aW9uIGlzIHNwZWNpZmllZCwgb3IgaWYgdGhlCisuQiBzaGFyZWNhY2hlCitvcHRpb24gaXMKK3NwZWNpZmllZCwgdGhlbiBhIHNpbmdsZSBjYWNoZSBpcyB1c2VkIGZvciBhbGwgbW91bnQgcG9pbnRzIHRoYXQKK2FjY2VzcyB0aGUgc2FtZSBleHBvcnQuICBJZiB0aGUKKy5CIG5vc2hhcmVjYWNoZQorb3B0aW9uIGlzIHNwZWNpZmllZCwKK3RoZW4gdGhhdCBtb3VudCBwb2ludCBnZXRzIGEgdW5pcXVlIGNhY2hlLiAgTm90ZSB0aGF0IHdoZW4gZGF0YSBhbmQKK2F0dHJpYnV0ZSBjYWNoZXMgYXJlIHNoYXJlZCwgdGhlIG1vdW50IG9wdGlvbnMgZnJvbSB0aGUgZmlyc3QgbW91bnQKK3BvaW50IHRha2UgZWZmZWN0IGZvciBzdWJzZXF1ZW50IGNvbmN1cnJlbnQgbW91bnRzIG9mIHRoZSBzYW1lIGV4cG9ydC4KKy5JUAorQXMgb2Yga2VybmVsIDIuNi4xOCwgdGhlIGJlaGF2aW9yIHNwZWNpZmllZCBieQorLkIgbm9zaGFyZWNhY2hlCitpcyBsZWdhY3kgY2FjaGluZyBiZWhhdmlvci4gVGhpcworaXMgY29uc2lkZXJlZCBhIGRhdGEgcmlzayBzaW5jZSBtdWx0aXBsZSBjYWNoZWQgY29waWVzCitvZiB0aGUgc2FtZSBmaWxlIG9uIHRoZSBzYW1lIGNsaWVudCBjYW4gYmVjb21lIG91dCBvZiBzeW5jCitmb2xsb3dpbmcgYSBsb2NhbCB1cGRhdGUgb2Ygb25lIG9mIHRoZSBjb3BpZXMuCisuVFAgMS41aQorLkJSIHJlc3Zwb3J0ICIgLyAiIG5vcmVzdnBvcnQKK1NwZWNpZmllcyB3aGV0aGVyIHRoZSBORlMgY2xpZW50IHNob3VsZCB1c2UgYSBwcml2aWxlZ2VkIHNvdXJjZSBwb3J0Cit3aGVuIGNvbW11bmljYXRpbmcgd2l0aCBhbiBORlMgc2VydmVyIGZvciB0aGlzIG1vdW50IHBvaW50LgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgb3IgdGhlCisuQiByZXN2cG9ydAorb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIE5GUyBjbGllbnQgdXNlcyBhIHByaXZpbGVnZWQgc291cmNlIHBvcnQuCitJZiB0aGUKKy5CIG5vcmVzdnBvcnQKK29wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBORlMgY2xpZW50IHVzZXMgYSBub24tcHJpdmlsZWdlZCBzb3VyY2UgcG9ydC4KK1RoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBpbiBrZXJuZWxzIDIuNi4yOCBhbmQgbGF0ZXIuCisuSVAKK1VzaW5nIG5vbi1wcml2aWxlZ2VkIHNvdXJjZSBwb3J0cyBoZWxwcyBpbmNyZWFzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YKK05GUyBtb3VudCBwb2ludHMgYWxsb3dlZCBvbiBhIGNsaWVudCwgYnV0IE5GUyBzZXJ2ZXJzIG11c3QgYmUgY29uZmlndXJlZAordG8gYWxsb3cgY2xpZW50cyB0byBjb25uZWN0IHZpYSBub24tcHJpdmlsZWdlZCBzb3VyY2UgcG9ydHMuCisuSVAKK1JlZmVyIHRvIHRoZSBTRUNVUklUWSBDT05TSURFUkFUSU9OUyBzZWN0aW9uIGZvciBpbXBvcnRhbnQgZGV0YWlscy4KKy5UUCAxLjVpCisuQkkgbG9va3VwY2FjaGU9IG1vZGUKK1NwZWNpZmllcyBob3cgdGhlIGtlcm5lbCBtYW5hZ2VzIGl0cyBjYWNoZSBvZiBkaXJlY3RvcnkgZW50cmllcworZm9yIGEgZ2l2ZW4gbW91bnQgcG9pbnQuCisuSSBtb2RlCitjYW4gYmUgb25lIG9mCisuQlIgYWxsICwKKy5CUiBub25lICwKKy5CUiBwb3MgLAorb3IKKy5CUiBwb3NpdGl2ZSAuCitUaGlzIG9wdGlvbiBpcyBzdXBwb3J0ZWQgaW4ga2VybmVscyAyLjYuMjggYW5kIGxhdGVyLgorLklQCitUaGUgTGludXggTkZTIGNsaWVudCBjYWNoZXMgdGhlIHJlc3VsdCBvZiBhbGwgTkZTIExPT0tVUCByZXF1ZXN0cy4KK0lmIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5IGVudHJ5IGV4aXN0cyBvbiB0aGUgc2VydmVyLAordGhlIHJlc3VsdCBpcyByZWZlcnJlZCB0byBhcworLklSIHBvc2l0aXZlIC4KK0lmIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5IGVudHJ5IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBzZXJ2ZXIsCit0aGUgcmVzdWx0IGlzIHJlZmVycmVkIHRvIGFzCisuSVIgbmVnYXRpdmUgLgorLklQCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBvciBpZgorLkIgYWxsCitpcyBzcGVjaWZpZWQsIHRoZSBjbGllbnQgYXNzdW1lcyBib3RoIHR5cGVzIG9mIGRpcmVjdG9yeSBjYWNoZSBlbnRyaWVzCithcmUgdmFsaWQgdW50aWwgdGhlaXIgcGFyZW50IGRpcmVjdG9yeSdzIGNhY2hlZCBhdHRyaWJ1dGVzIGV4cGlyZS4KKy5JUAorSWYKKy5CUiBwb3MgIiBvciAiIHBvc2l0aXZlCitpcyBzcGVjaWZpZWQsIHRoZSBjbGllbnQgYXNzdW1lcyBwb3NpdGl2ZSBlbnRyaWVzIGFyZSB2YWxpZAordW50aWwgdGhlaXIgcGFyZW50IGRpcmVjdG9yeSdzIGNhY2hlZCBhdHRyaWJ1dGVzIGV4cGlyZSwgYnV0CithbHdheXMgcmV2YWxpZGF0ZXMgbmVnYXRpdmUgZW50aXJlcyBiZWZvcmUgYW4gYXBwbGljYXRpb24KK2NhbiB1c2UgdGhlbS4KKy5JUAorSWYKKy5CIG5vbmUKK2lzIHNwZWNpZmllZCwKK3RoZSBjbGllbnQgcmV2YWxpZGF0ZXMgYm90aCB0eXBlcyBvZiBkaXJlY3RvcnkgY2FjaGUgZW50cmllcworYmVmb3JlIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhlbS4KK1RoaXMgcGVybWl0cyBxdWljayBkZXRlY3Rpb24gb2YgZmlsZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgb3IgcmVtb3ZlZAorYnkgb3RoZXIgY2xpZW50cywgYnV0IGNhbiBpbXBhY3QgYXBwbGljYXRpb24gYW5kIHNlcnZlciBwZXJmb3JtYW5jZS4KKy5JUAorVGhlIERBVEEgQU5EIE1FVEFEQVRBIENPSEVSRU5DRSBzZWN0aW9uIGNvbnRhaW5zIGEKK2RldGFpbGVkIGRpc2N1c3Npb24gb2YgdGhlc2UgdHJhZGUtb2Zmcy4KKy5TUyAiVmFsaWQgb3B0aW9ucyBmb3IgdGhlIG5mcyBmaWxlIHN5c3RlbSB0eXBlIgorVXNlIHRoZXNlIG9wdGlvbnMsIGFsb25nIHdpdGggdGhlIG9wdGlvbnMgaW4gdGhlIGFib3ZlIHN1YnNlY3Rpb24sCitmb3IgbW91bnRpbmcgdGhlCisuQiBuZnMKK2ZpbGUgc3lzdGVtIHR5cGUuCisuVFAgMS41aQorLkJJIHByb3RvPSBuZXRpZAorVGhlIHRyYW5zcG9ydCBwcm90b2NvbCBuYW1lIGFuZCBwcm90b2NvbCBmYW1pbHkgdGhlIE5GUyBjbGllbnQgdXNlcwordG8gdHJhbnNtaXQgcmVxdWVzdHMgdG8gdGhlIE5GUyBzZXJ2ZXIgZm9yIHRoaXMgbW91bnQgcG9pbnQuCitJZiBhbiBORlMgc2VydmVyIGhhcyBib3RoIGFuIElQdjQgYW5kIGFuIElQdjYgYWRkcmVzcywgdXNpbmcgYSBzcGVjaWZpYworbmV0aWQgd2lsbCBmb3JjZSB0aGUgdXNlIG9mIElQdjQgb3IgSVB2NiBuZXR3b3JraW5nIHRvIGNvbW11bmljYXRlCit3aXRoIHRoYXQgc2VydmVyLgorLklQCitJZiBzdXBwb3J0IGZvciBUSS1SUEMgaXMgYnVpbHQgaW50byB0aGUKKy5CIG1vdW50Lm5mcworY29tbWFuZCwKKy5JIG5ldGlkCitpcyBhIHZhbGlkIG5ldGlkIGxpc3RlZCBpbgorLklSIC9ldGMvbmV0Y29uZmlnIC4KK090aGVyd2lzZSwKKy5JIG5ldGlkCitpcyBvbmUgb2YgInRjcCwiICJ1ZHAsIiBvciAicmRtYSwiIGFuZCBvbmx5IElQdjQgbWF5IGJlIHVzZWQuCisuSVAKK0VhY2ggdHJhbnNwb3J0IHByb3RvY29sIHVzZXMgZGlmZmVyZW50IGRlZmF1bHQKKy5CIHJldHJhbnMKK2FuZAorLkIgdGltZW8KK3NldHRpbmdzLgorUmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIHR3byBtb3VudCBvcHRpb25zIGZvciBkZXRhaWxzLgorLklQCitJbiBhZGRpdGlvbiB0byBjb250cm9sbGluZyBob3cgdGhlIE5GUyBjbGllbnQgdHJhbnNtaXRzIHJlcXVlc3RzIHRvCit0aGUgc2VydmVyLCB0aGlzIG1vdW50IG9wdGlvbiBhbHNvIGNvbnRyb2xzIGhvdyB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQgY29tbXVuaWNhdGVzIHdpdGggdGhlIHNlcnZlcidzIHJwY2JpbmQgYW5kIG1vdW50ZCBzZXJ2aWNlcy4KK1NwZWNpZnlpbmcgYSBuZXRpZCB0aGF0IHVzZXMgVENQIGZvcmNlcyBhbGwgdHJhZmZpYyBmcm9tIHRoZQorLkJSIG1vdW50ICg4KQorY29tbWFuZCBhbmQgdGhlIE5GUyBjbGllbnQgdG8gdXNlIFRDUC4KK1NwZWNpZnlpbmcgYSBuZXRpZCB0aGF0IHVzZXMgVURQIGZvcmNlcyBhbGwgdHJhZmZpYyB0eXBlcyB0byB1c2UgVURQLgorLklQCitJZiB0aGUKKy5CIHByb3RvCittb3VudCBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlCisuQlIgbW91bnQgKDgpCitjb21tYW5kIGRpc2NvdmVycyB3aGljaCBwcm90b2NvbHMgdGhlIHNlcnZlciBzdXBwb3J0cworYW5kIGNob29zZXMgYW4gYXBwcm9wcmlhdGUgdHJhbnNwb3J0IGZvciBlYWNoIHNlcnZpY2UuCitSZWZlciB0byB0aGUgVFJBTlNQT1JUIE1FVEhPRFMgc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorLlRQIDEuNWkKKy5CIHVkcAorVGhlCisuQiB1ZHAKK29wdGlvbiBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nCisuQlIgcHJvdG89dWRwLgorSXQgaXMgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KKy5UUCAxLjVpCisuQiB0Y3AKK1RoZQorLkIgdGNwCitvcHRpb24gaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZworLkJSIHByb3RvPXRjcC4KK0l0IGlzIGluY2x1ZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCisuVFAgMS41aQorLkJJIHBvcnQ9IG4KK1RoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZXJ2ZXIncyBORlMgc2VydmljZSBwb3J0LgorSWYgdGhlIHNlcnZlcidzIE5GUyBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIHNwZWNpZmllZCBwb3J0LAordGhlIG1vdW50IHJlcXVlc3QgZmFpbHMuCisuSVAKK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlmIHRoZSBzcGVjaWZpZWQgcG9ydCB2YWx1ZSBpcyAwLAordGhlbiB0aGUgTkZTIGNsaWVudCB1c2VzIHRoZSBORlMgc2VydmljZSBwb3J0IG51bWJlcgorYWR2ZXJ0aXNlZCBieSB0aGUgc2VydmVyJ3MgcnBjYmluZCBzZXJ2aWNlLgorVGhlIG1vdW50IHJlcXVlc3QgZmFpbHMgaWYgdGhlIHNlcnZlcidzIHJwY2JpbmQgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlLAordGhlIHNlcnZlcidzIE5GUyBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggaXRzIHJwY2JpbmQgc2VydmljZSwKK29yIHRoZSBzZXJ2ZXIncyBORlMgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBhZHZlcnRpc2VkIHBvcnQuCisuVFAgMS41aQorLkJJIG1vdW50cG9ydD0gbgorVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlcnZlcidzIG1vdW50ZCBwb3J0LgorSWYgdGhlIHNlcnZlcidzIG1vdW50ZCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIHNwZWNpZmllZCBwb3J0LAordGhlIG1vdW50IHJlcXVlc3QgZmFpbHMuCisuSVAKK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCitvciBpZiB0aGUgc3BlY2lmaWVkIHBvcnQgdmFsdWUgaXMgMCwgdGhlbiB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQgdXNlcyB0aGUgbW91bnRkIHNlcnZpY2UgcG9ydCBudW1iZXIKK2FkdmVydGlzZWQgYnkgdGhlIHNlcnZlcidzIHJwY2JpbmQgc2VydmljZS4KK1RoZSBtb3VudCByZXF1ZXN0IGZhaWxzIGlmIHRoZSBzZXJ2ZXIncyBycGNiaW5kIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSwKK3RoZSBzZXJ2ZXIncyBtb3VudGQgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGl0cyBycGNiaW5kIHNlcnZpY2UsCitvciB0aGUgc2VydmVyJ3MgbW91bnRkIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgYWR2ZXJ0aXNlZCBwb3J0LgorLklQCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIG1vdW50aW5nIGFuIE5GUyBzZXJ2ZXIKK3Rocm91Z2ggYSBmaXJld2FsbCB0aGF0IGJsb2NrcyB0aGUgcnBjYmluZCBwcm90b2NvbC4KKy5UUCAxLjVpCisuQkkgbW91bnRwcm90bz0gbmV0aWQKK1RoZSB0cmFuc3BvcnQgcHJvdG9jb2wgbmFtZSBhbmQgcHJvdG9jb2wgZmFtaWx5IHRoZSBORlMgY2xpZW50IHVzZXMKK3RvIHRyYW5zbWl0IHJlcXVlc3RzIHRvIHRoZSBORlMgc2VydmVyJ3MgbW91bnRkIHNlcnZpY2Ugd2hlbiBwZXJmb3JtaW5nCit0aGlzIG1vdW50IHJlcXVlc3QsIGFuZCB3aGVuIGxhdGVyIHVubW91bnRpbmcgdGhpcyBtb3VudCBwb2ludC4KKy5JUAorSWYgc3VwcG9ydCBmb3IgVEktUlBDIGlzIGJ1aWx0IGludG8gdGhlCisuQiBtb3VudC5uZnMKK2NvbW1hbmQsCisuSSBuZXRpZAoraXMgYSB2YWxpZCBuZXRpZCBsaXN0ZWQgaW4KKy5JUiAvZXRjL25ldGNvbmZpZyAuCitPdGhlcndpc2UsCisuSSBuZXRpZAoraXMgb25lIG9mICJ0Y3AiIG9yICJ1ZHAsIiBhbmQgb25seSBJUHY0IG1heSBiZSB1c2VkLgorLklQCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIG1vdW50aW5nIGFuIE5GUyBzZXJ2ZXIKK3Rocm91Z2ggYSBmaXJld2FsbCB0aGF0IGJsb2NrcyBhIHBhcnRpY3VsYXIgdHJhbnNwb3J0LgorV2hlbiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlCisuQiBwcm90bworb3B0aW9uLCBkaWZmZXJlbnQgdHJhbnNwb3J0cyBmb3IgbW91bnRkIHJlcXVlc3RzIGFuZCBORlMgcmVxdWVzdHMKK2NhbiBiZSBzcGVjaWZpZWQuCitJZiB0aGUgc2VydmVyJ3MgbW91bnRkIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSB2aWEgdGhlIHNwZWNpZmllZAordHJhbnNwb3J0LCB0aGUgbW91bnQgcmVxdWVzdCBmYWlscy4KKy5JUAorUmVmZXIgdG8gdGhlIFRSQU5TUE9SVCBNRVRIT0RTIHNlY3Rpb24gZm9yIG1vcmUgb24gaG93IHRoZQorLkIgbW91bnRwcm90bworbW91bnQgb3B0aW9uIGludGVyYWN0cyB3aXRoIHRoZQorLkIgcHJvdG8KK21vdW50IG9wdGlvbi4KKy5UUCAxLjVpCisuQkkgbW91bnRob3N0PSBuYW1lCitUaGUgaG9zdG5hbWUgb2YgdGhlIGhvc3QgcnVubmluZyBtb3VudGQuCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQgYXNzdW1lcyB0aGF0IHRoZSBtb3VudGQgc2VydmljZSBydW5zCitvbiB0aGUgc2FtZSBob3N0IGFzIHRoZSBORlMgc2VydmljZS4KKy5UUCAxLjVpCisuQkkgbW91bnR2ZXJzPSBuCitUaGUgUlBDIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gY29udGFjdCB0aGUgc2VydmVyJ3MgbW91bnRkLgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGNsaWVudCB1c2VzIGEgdmVyc2lvbiBudW1iZXIKK2FwcHJvcHJpYXRlIHRvIHRoZSByZXF1ZXN0ZWQgTkZTIHZlcnNpb24uCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiBtdWx0aXBsZSBORlMgc2VydmljZXMKK2FyZSBydW5uaW5nIG9uIHRoZSBzYW1lIHJlbW90ZSBzZXJ2ZXIgaG9zdC4KKy5UUCAxLjVpCisuQkkgbmFtbGVuPSBuCitUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBwYXRobmFtZSBjb21wb25lbnQgb24gdGhpcyBtb3VudC4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBtYXhpbXVtIGxlbmd0aCBpcyBuZWdvdGlhdGVkCit3aXRoIHRoZSBzZXJ2ZXIuIEluIG1vc3QgY2FzZXMsIHRoaXMgbWF4aW11bSBsZW5ndGggaXMgMjU1IGNoYXJhY3RlcnMuCisuSVAKK1NvbWUgZWFybHkgdmVyc2lvbnMgb2YgTkZTIGRpZCBub3Qgc3VwcG9ydCB0aGlzIG5lZ290aWF0aW9uLgorVXNpbmcgdGhpcyBvcHRpb24gZW5zdXJlcyB0aGF0CisuQlIgcGF0aGNvbmYgKDMpCityZXBvcnRzIHRoZSBwcm9wZXIgbWF4aW11bSBjb21wb25lbnQgbGVuZ3RoIHRvIGFwcGxpY2F0aW9ucworaW4gc3VjaCBjYXNlcy4KKy5UUCAxLjVpCisuQkkgbmZzdmVycz0gbgorVGhlIE5GUyBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIGNvbnRhY3QgdGhlIHNlcnZlcidzIE5GUyBzZXJ2aWNlLgorVGhlIExpbnV4IGNsaWVudCBzdXBwb3J0cyB2ZXJzaW9uIDIgYW5kIHZlcnNpb24gMyBvZiB0aGUgTkZTIHByb3RvY29sCit3aGVuIHVzaW5nIHRoZSBmaWxlIHN5c3RlbSB0eXBlCisuQlIgbmZzIC4KK0lmIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHZlcnNpb24sCit0aGUgbW91bnQgcmVxdWVzdCBmYWlscy4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjbGllbnQgYXR0ZW1wdHMgdG8gdXNlIHZlcnNpb24gMywKK2J1dCBuZWdvdGlhdGVzIHRoZSBORlMgdmVyc2lvbiB3aXRoIHRoZSBzZXJ2ZXIgaWYgdmVyc2lvbiAzIHN1cHBvcnQKK2lzIG5vdCBhdmFpbGFibGUuCisuVFAgMS41aQorLkJJIHZlcnM9IG4KK1RoaXMgb3B0aW9uIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZQorLkIgbmZzdmVycworb3B0aW9uLgorSXQgaXMgaW5jbHVkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4KKy5UUCAxLjVpCisuQlIgbG9jayAiIC8gIiBub2xvY2sKK1NlbGVjdHMgd2hldGhlciB0byB1c2UgdGhlIE5MTSBzaWRlYmFuZCBwcm90b2NvbCB0byBsb2NrIGZpbGVzIG9uIHRoZSBzZXJ2ZXIuCitJZiBuZWl0aGVyIG9wdGlvbiBpcyBzcGVjaWZpZWQgKG9yIGlmCisuQiBsb2NrCitpcyBzcGVjaWZpZWQpLCBOTE0gbG9ja2luZyBpcyB1c2VkIGZvciB0aGlzIG1vdW50IHBvaW50LgorV2hlbiB1c2luZyB0aGUKKy5CIG5vbG9jaworb3B0aW9uLCBhcHBsaWNhdGlvbnMgY2FuIGxvY2sgZmlsZXMsCitidXQgc3VjaCBsb2NrcyBwcm92aWRlIGV4Y2x1c2lvbiBvbmx5IGFnYWluc3Qgb3RoZXIgYXBwbGljYXRpb25zCitydW5uaW5nIG9uIHRoZSBzYW1lIGNsaWVudC4KK1JlbW90ZSBhcHBsaWNhdGlvbnMgYXJlIG5vdCBhZmZlY3RlZCBieSB0aGVzZSBsb2Nrcy4KKy5JUAorTkxNIGxvY2tpbmcgbXVzdCBiZSBkaXNhYmxlZCB3aXRoIHRoZQorLkIgbm9sb2NrCitvcHRpb24gd2hlbiB1c2luZyBORlMgdG8gbW91bnQKKy5JIC92YXIKK2JlY2F1c2UKKy5JIC92YXIKK2NvbnRhaW5zIGZpbGVzIHVzZWQgYnkgdGhlIE5MTSBpbXBsZW1lbnRhdGlvbiBvbiBMaW51eC4KK1VzaW5nIHRoZQorLkIgbm9sb2NrCitvcHRpb24gaXMgYWxzbyByZXF1aXJlZCB3aGVuIG1vdW50aW5nIGV4cG9ydHMgb24gTkZTIHNlcnZlcnMKK3RoYXQgZG8gbm90IHN1cHBvcnQgdGhlIE5MTSBwcm90b2NvbC4KKy5UUCAxLjVpCisuQlIgaW50ciAiIC8gIiBub2ludHIKK1NlbGVjdHMgd2hldGhlciB0byBhbGxvdyBzaWduYWxzIHRvIGludGVycnVwdCBmaWxlIG9wZXJhdGlvbnMKK29uIHRoaXMgbW91bnQgcG9pbnQuIElmIG5laXRoZXIgb3B0aW9uCitpcyBzcGVjaWZpZWQgKG9yIGlmCisuQiBub2ludHIKK2lzIHNwZWNpZmllZCksCitzaWduYWxzIGRvIG5vdCBpbnRlcnJ1cHQgTkZTIGZpbGUgb3BlcmF0aW9ucy4gSWYKKy5CIGludHIKK2lzIHNwZWNpZmllZCwgc3lzdGVtIGNhbGxzIHJldHVybiBFSU5UUiBpZiBhbiBpbi1wcm9ncmVzcyBORlMgb3BlcmF0aW9uIGlzIGludGVycnVwdGVkIGJ5CithIHNpZ25hbC4KKy5JUAorVXNpbmcgdGhlCisuQiBpbnRyCitvcHRpb24gaXMgcHJlZmVycmVkIHRvIHVzaW5nIHRoZQorLkIgc29mdAorb3B0aW9uIGJlY2F1c2UgaXQgaXMgc2lnbmlmaWNhbnRseSBsZXNzIGxpa2VseSB0byByZXN1bHQgaW4gZGF0YSBjb3JydXB0aW9uLgorLklQCitUaGUKKy5CUiBpbnRyICIgLyAiIG5vaW50cgorbW91bnQgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYWZ0ZXIga2VybmVsIDIuNi4yNS4KK09ubHkgU0lHS0lMTCBjYW4gaW50ZXJydXB0IGEgcGVuZGluZyBORlMgb3BlcmF0aW9uIG9uIHRoZXNlIGtlcm5lbHMsCithbmQgaWYgc3BlY2lmaWVkLCB0aGlzIG1vdW50IG9wdGlvbiBpcyBpZ25vcmVkIHRvIHByb3ZpZGUgYmFja3dhcmRzCitjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIga2VybmVscy4KKy5UUCAxLjVpCisuQlIgY3RvICIgLyAiIG5vY3RvCitTZWxlY3RzIHdoZXRoZXIgdG8gdXNlIGNsb3NlLXRvLW9wZW4gY2FjaGUgY29oZXJlbmNlIHNlbWFudGljcy4KK0lmIG5laXRoZXIgb3B0aW9uIGlzIHNwZWNpZmllZCAob3IgaWYKKy5CIGN0bworaXMgc3BlY2lmaWVkKSwgdGhlIGNsaWVudCB1c2VzIGNsb3NlLXRvLW9wZW4KK2NhY2hlIGNvaGVyZW5jZSBzZW1hbnRpY3MuIElmIHRoZQorLkIgbm9jdG8KK29wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBjbGllbnQgdXNlcyBhIG5vbi1zdGFuZGFyZCBoZXVyaXN0aWMgdG8gZGV0ZXJtaW5lIHdoZW4KK2ZpbGVzIG9uIHRoZSBzZXJ2ZXIgaGF2ZSBjaGFuZ2VkLgorLklQCitVc2luZyB0aGUKKy5CIG5vY3RvCitvcHRpb24gbWF5IGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yIHJlYWQtb25seSBtb3VudHMsCitidXQgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB0aGUgZGF0YSBvbiB0aGUgc2VydmVyIGNoYW5nZXMgb25seSBvY2Nhc2lvbmFsbHkuCitUaGUgREFUQSBBTkQgTUVUQURBVEEgQ09IRVJFTkNFIHNlY3Rpb24gZGlzY3Vzc2VzIHRoZSBiZWhhdmlvcgorb2YgdGhpcyBvcHRpb24gaW4gbW9yZSBkZXRhaWwuCisuVFAgMS41aQorLkJSIGFjbCAiIC8gIiBub2FjbAorU2VsZWN0cyB3aGV0aGVyIHRvIHVzZSB0aGUgTkZTQUNMIHNpZGViYW5kIHByb3RvY29sIG9uIHRoaXMgbW91bnQgcG9pbnQuCitUaGUgTkZTQUNMIHNpZGViYW5kIHByb3RvY29sIGlzIGEgcHJvcHJpZXRhcnkgcHJvdG9jb2wKK2ltcGxlbWVudGVkIGluIFNvbGFyaXMgdGhhdCBtYW5hZ2VzIEFjY2VzcyBDb250cm9sIExpc3RzLiBORlNBQ0wgd2FzIG5ldmVyCittYWRlIGEgc3RhbmRhcmQgcGFydCBvZiB0aGUgTkZTIHByb3RvY29sIHNwZWNpZmljYXRpb24uCisuSVAKK0lmIG5laXRoZXIKKy5CIGFjbAorbm9yCisuQiBub2FjbAorb3B0aW9uIGlzIHNwZWNpZmllZCwKK3RoZSBORlMgY2xpZW50IG5lZ290aWF0ZXMgd2l0aCB0aGUgc2VydmVyCit0byBzZWUgaWYgdGhlIE5GU0FDTCBwcm90b2NvbCBpcyBzdXBwb3J0ZWQsCithbmQgdXNlcyBpdCBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LgorRGlzYWJsaW5nIHRoZSBORlNBQ0wgc2lkZWJhbmQgcHJvdG9jb2wgbWF5IGJlIG5lY2Vzc2FyeQoraWYgdGhlIG5lZ290aWF0aW9uIGNhdXNlcyBwcm9ibGVtcyBvbiB0aGUgY2xpZW50IG9yIHNlcnZlci4KK1JlZmVyIHRvIHRoZSBTRUNVUklUWSBDT05TSURFUkFUSU9OUyBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMuCisuVFAgMS41aQorLkJSIHJkaXJwbHVzICIgLyAiIG5vcmRpcnBsdXMKK1NlbGVjdHMgd2hldGhlciB0byB1c2UgTkZTIHZlcnNpb24gMyBSRUFERElSUExVUyByZXF1ZXN0cy4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBORlMgY2xpZW50IHVzZXMgUkVBRERJUlBMVVMgcmVxdWVzdHMKK29uIE5GUyB2ZXJzaW9uIDMgbW91bnRzIHRvIHJlYWQgc21hbGwgZGlyZWN0b3JpZXMuCitTb21lIGFwcGxpY2F0aW9ucyBwZXJmb3JtIGJldHRlciBpZiB0aGUgY2xpZW50IHVzZXMgb25seSBSRUFERElSIHJlcXVlc3RzCitmb3IgYWxsIGRpcmVjdG9yaWVzLgorLlNTICJWYWxpZCBvcHRpb25zIGZvciB0aGUgbmZzNCBmaWxlIHN5c3RlbSB0eXBlIgorVXNlIHRoZXNlIG9wdGlvbnMsIGFsb25nIHdpdGggdGhlIG9wdGlvbnMgaW4gdGhlIGZpcnN0IHN1YnNlY3Rpb24gYWJvdmUsCitmb3IgbW91bnRpbmcgdGhlCisuQiBuZnM0CitmaWxlIHN5c3RlbSB0eXBlLgorLlRQIDEuNWkKKy5CSSBwcm90bz0gbmV0aWQKK1RoZSB0cmFuc3BvcnQgcHJvdG9jb2wgbmFtZSBhbmQgcHJvdG9jb2wgZmFtaWx5IHRoZSBORlMgY2xpZW50IHVzZXMKK3RvIHRyYW5zbWl0IHJlcXVlc3RzIHRvIHRoZSBORlMgc2VydmVyIGZvciB0aGlzIG1vdW50IHBvaW50LgorSWYgYW4gTkZTIHNlcnZlciBoYXMgYm90aCBhbiBJUHY0IGFuZCBhbiBJUHY2IGFkZHJlc3MsIHVzaW5nIGEgc3BlY2lmaWMKK25ldGlkIHdpbGwgZm9yY2UgdGhlIHVzZSBvZiBJUHY0IG9yIElQdjYgbmV0d29ya2luZyB0byBjb21tdW5pY2F0ZQord2l0aCB0aGF0IHNlcnZlci4KKy5JUAorSWYgc3VwcG9ydCBmb3IgVEktUlBDIGlzIGJ1aWx0IGludG8gdGhlCisuQiBtb3VudC5uZnMKK2NvbW1hbmQsCisuSSBuZXRpZAoraXMgYSB2YWxpZCBuZXRpZCBsaXN0ZWQgaW4KKy5JUiAvZXRjL25ldGNvbmZpZyAuCitPdGhlcndpc2UsCisuSSBuZXRpZAoraXMgb25lIG9mICJ0Y3AiIG9yICJ1ZHAsIiBhbmQgb25seSBJUHY0IG1heSBiZSB1c2VkLgorLklQCitBbGwgTkZTIHZlcnNpb24gNCBzZXJ2ZXJzIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IFRDUCwKK3NvIGlmIHRoaXMgbW91bnQgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBORlMgdmVyc2lvbiA0IGNsaWVudAordXNlcyB0aGUgVENQIHByb3RvY29sLgorUmVmZXIgdG8gdGhlIFRSQU5TUE9SVCBNRVRIT0RTIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KKy5UUCAxLjVpCisuQkkgcG9ydD0gbgorVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlcnZlcidzIE5GUyBzZXJ2aWNlIHBvcnQuCitJZiB0aGUgc2VydmVyJ3MgTkZTIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsCit0aGUgbW91bnQgcmVxdWVzdCBmYWlscy4KKy5JUAorSWYgdGhpcyBtb3VudCBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwKK3RoZSBORlMgY2xpZW50IHVzZXMgdGhlIHN0YW5kYXJkIE5GUyBwb3J0IG51bWJlciBvZiAyMDQ5Cit3aXRob3V0IGZpcnN0IGNoZWNraW5nIHRoZSBzZXJ2ZXIncyBycGNiaW5kIHNlcnZpY2UuCitUaGlzIGFsbG93cyBhbiBORlMgdmVyc2lvbiA0IGNsaWVudCB0byBjb250YWN0IGFuIE5GUyB2ZXJzaW9uIDQKK3NlcnZlciB0aHJvdWdoIGEgZmlyZXdhbGwgdGhhdCBtYXkgYmxvY2sgcnBjYmluZCByZXF1ZXN0cy4KKy5JUAorSWYgdGhlIHNwZWNpZmllZCBwb3J0IHZhbHVlIGlzIDAsCit0aGVuIHRoZSBORlMgY2xpZW50IHVzZXMgdGhlIE5GUyBzZXJ2aWNlIHBvcnQgbnVtYmVyCithZHZlcnRpc2VkIGJ5IHRoZSBzZXJ2ZXIncyBycGNiaW5kIHNlcnZpY2UuCitUaGUgbW91bnQgcmVxdWVzdCBmYWlscyBpZiB0aGUgc2VydmVyJ3MgcnBjYmluZCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUsCit0aGUgc2VydmVyJ3MgTkZTIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBpdHMgcnBjYmluZCBzZXJ2aWNlLAorb3IgdGhlIHNlcnZlcidzIE5GUyBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGFkdmVydGlzZWQgcG9ydC4KKy5UUCAxLjVpCisuQlIgaW50ciAiIC8gIiBub2ludHIKK1NlbGVjdHMgd2hldGhlciB0byBhbGxvdyBzaWduYWxzIHRvIGludGVycnVwdCBmaWxlIG9wZXJhdGlvbnMKK29uIHRoaXMgbW91bnQgcG9pbnQuIElmIG5laXRoZXIgb3B0aW9uIGlzIHNwZWNpZmllZCAob3IgaWYKKy5CIGludHIKK2lzIHNwZWNpZmllZCksIHN5c3RlbSBjYWxscyByZXR1cm4gRUlOVFIgaWYgYW4gaW4tcHJvZ3Jlc3MgTkZTIG9wZXJhdGlvbgoraXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwuICBJZgorLkIgbm9pbnRyCitpcyBzcGVjaWZpZWQsIHNpZ25hbHMgZG8gbm90CitpbnRlcnJ1cHQgTkZTIG9wZXJhdGlvbnMuCisuSVAKK1VzaW5nIHRoZQorLkIgaW50cgorb3B0aW9uIGlzIHByZWZlcnJlZCB0byB1c2luZyB0aGUKKy5CIHNvZnQKK29wdGlvbiBiZWNhdXNlIGl0IGlzIHNpZ25pZmljYW50bHkgbGVzcyBsaWtlbHkgdG8gcmVzdWx0IGluIGRhdGEgY29ycnVwdGlvbi4KKy5JUAorVGhlCisuQlIgaW50ciAiIC8gIiBub2ludHIKK21vdW50IG9wdGlvbiBpcyBkZXByZWNhdGVkIGFmdGVyIGtlcm5lbCAyLjYuMjUuCitPbmx5IFNJR0tJTEwgY2FuIGludGVycnVwdCBhIHBlbmRpbmcgTkZTIG9wZXJhdGlvbiBvbiB0aGVzZSBrZXJuZWxzLAorYW5kIGlmIHNwZWNpZmllZCwgdGhpcyBtb3VudCBvcHRpb24gaXMgaWdub3JlZCB0byBwcm92aWRlIGJhY2t3YXJkcworY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGtlcm5lbHMuCisuVFAgMS41aQorLkJSIGN0byAiIC8gIiBub2N0bworU2VsZWN0cyB3aGV0aGVyIHRvIHVzZSBjbG9zZS10by1vcGVuIGNhY2hlIGNvaGVyZW5jZSBzZW1hbnRpY3MKK2ZvciBORlMgZGlyZWN0b3JpZXMgb24gdGhpcyBtb3VudCBwb2ludC4KK0lmIG5laXRoZXIKKy5CIGN0bworbm9yCisuQiBub2N0bworaXMgc3BlY2lmaWVkLAordGhlIGRlZmF1bHQgaXMgdG8gdXNlIGNsb3NlLXRvLW9wZW4gY2FjaGUgY29oZXJlbmNlCitzZW1hbnRpY3MgZm9yIGRpcmVjdG9yaWVzLgorLklQCitGaWxlIGRhdGEgY2FjaGluZyBiZWhhdmlvciBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb24uCitUaGUgREFUQSBBTkQgTUVUQURBVEEgQ09IRVJFTkNFIHNlY3Rpb24gZGlzY3Vzc2VzCit0aGUgYmVoYXZpb3Igb2YgdGhpcyBvcHRpb24gaW4gbW9yZSBkZXRhaWwuCisuVFAgMS41aQorLkJJIGNsaWVudGFkZHI9IG4ubi5uLm4KK1NwZWNpZmllcyBhIHNpbmdsZSBJUHY0IGFkZHJlc3MgKGluIGRvdHRlZC1xdWFkIGZvcm0pLAorb3IgYSBub24tbGluay1sb2NhbCBJUHY2IGFkZHJlc3MsCit0aGF0IHRoZSBORlMgY2xpZW50IGFkdmVydGlzZXMgdG8gYWxsb3cgc2VydmVycwordG8gcGVyZm9ybSBORlMgdmVyc2lvbiA0IGNhbGxiYWNrIHJlcXVlc3RzIGFnYWluc3QKK2ZpbGVzIG9uIHRoaXMgbW91bnQgcG9pbnQuIElmICB0aGUgIHNlcnZlciBpcyB1bmFibGUgdG8KK2VzdGFibGlzaCBjYWxsYmFjayBjb25uZWN0aW9ucyB0byBjbGllbnRzLCBwZXJmb3JtYW5jZQorbWF5IGRlZ3JhZGUsIG9yIGFjY2Vzc2VzIHRvIGZpbGVzIG1heSB0ZW1wb3JhcmlseSBoYW5nLgorLklQCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQgYXR0ZW1wdHMgdG8gZGlzY292ZXIgYW4gYXBwcm9wcmlhdGUgY2FsbGJhY2sgYWRkcmVzcyBhdXRvbWF0aWNhbGx5LgorVGhlIGF1dG9tYXRpYyBkaXNjb3ZlcnkgcHJvY2VzcyBpcyBub3QgcGVyZmVjdCwgaG93ZXZlci4KK0luIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBjbGllbnQgbmV0d29yayBpbnRlcmZhY2VzLAorc3BlY2lhbCByb3V0aW5nIHBvbGljaWVzLAorb3IgYXR5cGljYWwgbmV0d29yayB0b3BvbG9naWVzLAordGhlIGV4YWN0IGFkZHJlc3MgdG8gdXNlIGZvciBjYWxsYmFja3MgbWF5IGJlIG5vbnRyaXZpYWwgdG8gZGV0ZXJtaW5lLgorLlNIIE1PVU5UIENPTkZJR1VSQVRJT04gRklMRQorSWYgdGhlIG1vdW50IGNvbW1hbmQgaXMgY29uZmlndXJlZCB0byBkbyBzbywgYWxsIG9mIHRoZSBtb3VudCBvcHRpb25zIAorZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIAorLkkgL2V0Yy9uZnNtb3VudC5jb25mIAorZmlsZS4gU2VlIAorLkJSIG5mc21vdW50LmNvbmYoNSkKK2ZvciBkZXRhaWxzLgorLlNIIEVYQU1QTEVTCitUbyBtb3VudCBhbiBleHBvcnQgdXNpbmcgTkZTIHZlcnNpb24gMiwKK3VzZSB0aGUKKy5CIG5mcworZmlsZSBzeXN0ZW0gdHlwZSBhbmQgc3BlY2lmeSB0aGUKKy5CIG5mc3ZlcnM9MgorbW91bnQgb3B0aW9uLgorVG8gbW91bnQgdXNpbmcgTkZTIHZlcnNpb24gMywKK3VzZSB0aGUKKy5CIG5mcworZmlsZSBzeXN0ZW0gdHlwZSBhbmQgc3BlY2lmeSB0aGUKKy5CIG5mc3ZlcnM9MworbW91bnQgb3B0aW9uLgorVG8gbW91bnQgdXNpbmcgTkZTIHZlcnNpb24gNCwKK3VzZSB0aGUKKy5CIG5mczQKK2ZpbGUgc3lzdGVtIHR5cGUuCitUaGUKKy5CIG5mc3ZlcnMKK21vdW50IG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUKKy5CIG5mczQKK2ZpbGUgc3lzdGVtIHR5cGUuCisuUAorVGhlIGZvbGxvd2luZyBleGFtcGxlIGZyb20gYW4KKy5JIC9ldGMvZnN0YWIKK2ZpbGUgY2F1c2VzIHRoZSBtb3VudCBjb21tYW5kIHRvIG5lZ290aWF0ZQorcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgTkZTIGJlaGF2aW9yLgorLlAKKy5ORgorLlRBIDIuNWkgKzAuN2kgKzAuN2kgKy43aQorCXNlcnZlcjovZXhwb3J0CS9tbnQJbmZzCWRlZmF1bHRzCTAgMAorLkZJCisuUAorSGVyZSBpcyBhbiBleGFtcGxlIGZyb20gYW4gL2V0Yy9mc3RhYiBmaWxlIGZvciBhbiBORlMgdmVyc2lvbiAyIG1vdW50IG92ZXIgVURQLgorLlAKKy5ORgorLlRBIDIuNWkgKzAuN2kgKzAuN2kgKy43aQorCXNlcnZlcjovZXhwb3J0CS9tbnQJbmZzCW5mc3ZlcnM9Mixwcm90bz11ZHAJMCAwCisuRkkKKy5QCitUcnkgdGhpcyBleGFtcGxlIHRvIG1vdW50IHVzaW5nIE5GUyB2ZXJzaW9uIDQgb3ZlciBUQ1AKK3dpdGggS2VyYmVyb3MgNSBtdXR1YWwgYXV0aGVudGljYXRpb24uCisuUAorLk5GCisuVEEgMi41aSArMC43aSArMC43aSArLjdpCisJc2VydmVyOi9leHBvcnQJL21udAluZnM0CXNlYz1rcmI1CTAgMAorLkZJCisuUAorVGhpcyBleGFtcGxlIGNhbiBiZSB1c2VkIHRvIG1vdW50IC91c3Igb3ZlciBORlMuCisuUAorLk5GCisuVEEgMi41aSArMC43aSArMC43aSArLjdpCisJc2VydmVyOi9leHBvcnQJL3VzcgluZnMJcm8sbm9sb2NrLG5vY3RvLGFjdGltZW89MzYwMAkwIDAKKy5GSQorLlAKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gbW91bnQgYW4gTkZTIHNlcnZlcgordXNpbmcgYSByYXcgSVB2NiBsaW5rLWxvY2FsIGFkZHJlc3MuCisuUAorLk5GCisuVEEgMi41aSArMC43aSArMC43aSArLjdpCisJW2ZlODA6OjIxNTpjNWZmOmZiM2U6ZTJiMSVldGgwXTovZXhwb3J0CS9tbnQJbmZzCWRlZmF1bHRzCTAgMAorLkZJCisuU0ggIlRSQU5TUE9SVCBNRVRIT0RTIgorTkZTIGNsaWVudHMgc2VuZCByZXF1ZXN0cyB0byBORlMgc2VydmVycyB2aWEKK1JlbW90ZSBQcm9jZWR1cmUgQ2FsbHMsIG9yCisuSVIgUlBDcyAuCitUaGUgUlBDIGNsaWVudCBkaXNjb3ZlcnMgcmVtb3RlIHNlcnZpY2UgZW5kcG9pbnRzIGF1dG9tYXRpY2FsbHksCitoYW5kbGVzIHBlci1yZXF1ZXN0IGF1dGhlbnRpY2F0aW9uLAorYWRqdXN0cyByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIGRpZmZlcmVudCBieXRlIGVuZGlhbm5lc3Mgb24gY2xpZW50IGFuZCBzZXJ2ZXIsCithbmQgcmV0cmFuc21pdHMgcmVxdWVzdHMgdGhhdCBtYXkgaGF2ZSBiZWVuIGxvc3QgYnkgdGhlIG5ldHdvcmsgb3Igc2VydmVyLgorUlBDIHJlcXVlc3RzIGFuZCByZXBsaWVzIGZsb3cgb3ZlciBhIG5ldHdvcmsgdHJhbnNwb3J0LgorLlAKK0luIG1vc3QgY2FzZXMsIHRoZQorLkJSIG1vdW50ICg4KQorY29tbWFuZCwgTkZTIGNsaWVudCwgYW5kIE5GUyBzZXJ2ZXIKK2NhbiBhdXRvbWF0aWNhbGx5IG5lZ290aWF0ZSBwcm9wZXIgdHJhbnNwb3J0CithbmQgZGF0YSB0cmFuc2ZlciBzaXplIHNldHRpbmdzIGZvciBhIG1vdW50IHBvaW50LgorSW4gc29tZSBjYXNlcywgaG93ZXZlciwgaXQgcGF5cyB0byBzcGVjaWZ5Cit0aGVzZSBzZXR0aW5ncyBleHBsaWNpdGx5IHVzaW5nIG1vdW50IG9wdGlvbnMuCisuUAorVHJhZGl0aW9uYWxseSwgTkZTIGNsaWVudHMgdXNlZCB0aGUgVURQIHRyYW5zcG9ydCBleGNsdXNpdmVseSBmb3IKK3RyYW5zbWl0dGluZyByZXF1ZXN0cyB0byBzZXJ2ZXJzLiAgVGhvdWdoIGl0cyBpbXBsZW1lbnRhdGlvbiBpcworc2ltcGxlLCBORlMgb3ZlciBVRFAgaGFzIG1hbnkgbGltaXRhdGlvbnMgdGhhdCBwcmV2ZW50IHNtb290aAorb3BlcmF0aW9uIGFuZCBnb29kIHBlcmZvcm1hbmNlIGluIHNvbWUgY29tbW9uIGRlcGxveW1lbnQKK2Vudmlyb25tZW50cy4gIEV2ZW4gYW4gaW5zaWduaWZpY2FudCBwYWNrZXQgbG9zcyByYXRlIHJlc3VsdHMgaW4gdGhlCitsb3NzIG9mIHdob2xlIE5GUyByZXF1ZXN0czsgYXMgc3VjaCwgcmV0cmFuc21pdCB0aW1lb3V0cyBhcmUgdXN1YWxseQoraW4gdGhlIHN1YnNlY29uZCByYW5nZSB0byBhbGxvdyBjbGllbnRzIHRvIHJlY292ZXIgcXVpY2tseSBmcm9tCitkcm9wcGVkIHJlcXVlc3RzLCBidXQgdGhpcyBjYW4gcmVzdWx0IGluIGV4dHJhbmVvdXMgbmV0d29yayB0cmFmZmljCithbmQgc2VydmVyIGxvYWQuCisuUAorSG93ZXZlciwgVURQIGNhbiBiZSBxdWl0ZSBlZmZlY3RpdmUgaW4gc3BlY2lhbGl6ZWQgc2V0dGluZ3Mgd2hlcmUKK3RoZSBuZXR3b3JrcyBNVFUgaXMgbGFyZ2UgcmVsYXRpdmUgdG8gTkZTcyBkYXRhIHRyYW5zZmVyIHNpemUgKHN1Y2gKK2FzIG5ldHdvcmsgZW52aXJvbm1lbnRzIHRoYXQgZW5hYmxlIGp1bWJvIEV0aGVybmV0IGZyYW1lcykuICBJbiBzdWNoCitlbnZpcm9ubWVudHMsIHRyaW1taW5nIHRoZQorLkIgcnNpemUKK2FuZAorLkIgd3NpemUKK3NldHRpbmdzIHNvIHRoYXQgZWFjaAorTkZTIHJlYWQgb3Igd3JpdGUgcmVxdWVzdCBmaXRzIGluIGp1c3QgYSBmZXcgbmV0d29yayBmcmFtZXMgKG9yIGV2ZW4KK2luICBhIHNpbmdsZSAgZnJhbWUpIGlzIGFkdmlzZWQuICBUaGlzIHJlZHVjZXMgdGhlIHByb2JhYmlsaXR5IHRoYXQKK3RoZSBsb3NzIG9mIGEgc2luZ2xlIE1UVS1zaXplZCBuZXR3b3JrIGZyYW1lIHJlc3VsdHMgaW4gdGhlIGxvc3Mgb2YKK2FuIGVudGlyZSBsYXJnZSByZWFkIG9yIHdyaXRlIHJlcXVlc3QuCisuUAorVENQIGlzIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBwcm90b2NvbCB1c2VkIGZvciBhbGwgbW9kZXJuIE5GUworaW1wbGVtZW50YXRpb25zLiAgSXQgcGVyZm9ybXMgd2VsbCBpbiBhbG1vc3QgZXZlcnkgY29uY2VpdmFibGUKK25ldHdvcmsgZW52aXJvbm1lbnQgYW5kIHByb3ZpZGVzIGV4Y2VsbGVudCBndWFyYW50ZWVzIGFnYWluc3QgZGF0YQorY29ycnVwdGlvbiBjYXVzZWQgYnkgbmV0d29yayB1bnJlbGlhYmlsaXR5LiAgVENQIGlzIG9mdGVuIGEKK3JlcXVpcmVtZW50IGZvciBtb3VudGluZyBhIHNlcnZlciB0aHJvdWdoIGEgbmV0d29yayBmaXJld2FsbC4KKy5QCitVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgbmV0d29ya3MgZHJvcCBwYWNrZXRzIG11Y2ggbW9yZQorZnJlcXVlbnRseSB0aGFuIE5GUyBzZXJ2ZXJzIGRyb3AgcmVxdWVzdHMuICBBcyBzdWNoLCBhbiBhZ2dyZXNzaXZlCityZXRyYW5zbWl0IHRpbWVvdXQgIHNldHRpbmcgZm9yIE5GUyBvdmVyIFRDUCBpcyB1bm5lY2Vzc2FyeS4gVHlwaWNhbAordGltZW91dCBzZXR0aW5ncyBmb3IgTkZTIG92ZXIgVENQIGFyZSBiZXR3ZWVuIG9uZSBhbmQgdGVuIG1pbnV0ZXMuCitBZnRlciAgdGhlIGNsaWVudCBleGhhdXN0cyBpdHMgcmV0cmFuc21pdHMgKHRoZSB2YWx1ZSBvZiB0aGUKKy5CIHJldHJhbnMKK21vdW50IG9wdGlvbiksIGl0IGFzc3VtZXMgYSBuZXR3b3JrIHBhcnRpdGlvbiBoYXMgb2NjdXJyZWQsCithbmQgYXR0ZW1wdHMgdG8gcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIgb24gYSBmcmVzaCBzb2NrZXQuIFNpbmNlCitUQ1AgaXRzZWxmIG1ha2VzIG5ldHdvcmsgZGF0YSB0cmFuc2ZlciByZWxpYWJsZSwKKy5CIHJzaXplCithbmQKKy5CIHdzaXplCitjYW4gc2FmZWx5IGJlIGFsbG93ZWQgdG8gZGVmYXVsdCB0byB0aGUgbGFyZ2VzdCB2YWx1ZXMgc3VwcG9ydGVkIGJ5Citib3RoIGNsaWVudCBhbmQgc2VydmVyLCBpbmRlcGVuZGVudCBvZiB0aGUgbmV0d29yaydzIE1UVSBzaXplLgorLlNTICJVc2luZyB0aGUgbW91bnRwcm90byBtb3VudCBvcHRpb24iCitUaGlzIHNlY3Rpb24gYXBwbGllcyBvbmx5IHRvIE5GUyB2ZXJzaW9uIDIgYW5kIHZlcnNpb24gMyBtb3VudHMKK3NpbmNlIE5GUyB2ZXJzaW9uIDQgZG9lcyBub3QgdXNlIGEgc2VwYXJhdGUgcHJvdG9jb2wgZm9yIG1vdW50CityZXF1ZXN0cy4KKy5QCitUaGUgTGludXggTkZTIGNsaWVudCBjYW4gdXNlIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBmb3IKK2NvbnRhY3RpbmcgYW4gTkZTIHNlcnZlcidzIHJwY2JpbmQgc2VydmljZSwgaXRzIG1vdW50ZCBzZXJ2aWNlLAoraXRzIE5ldHdvcmsgTG9jayBNYW5hZ2VyIChOTE0pIHNlcnZpY2UsIGFuZCBpdHMgTkZTIHNlcnZpY2UuCitUaGUgZXhhY3QgdHJhbnNwb3J0cyBlbXBsb3llZCBieSB0aGUgTGludXggTkZTIGNsaWVudCBmb3IKK2VhY2ggbW91bnQgcG9pbnQgZGVwZW5kcyBvbiB0aGUgc2V0dGluZ3Mgb2YgdGhlIHRyYW5zcG9ydAorbW91bnQgb3B0aW9ucywgd2hpY2ggaW5jbHVkZQorLkJSIHByb3RvICwKKy5CUiBtb3VudHByb3RvICwKKy5CUiB1ZHAgIiwgYW5kICIgdGNwIC4KKy5QCitUaGUgY2xpZW50IHNlbmRzIE5ldHdvcmsgU3RhdHVzIE1hbmFnZXIgKE5TTSkgbm90aWZpY2F0aW9ucwordmlhIFVEUCBubyBtYXR0ZXIgd2hhdCB0cmFuc3BvcnQgb3B0aW9ucyBhcmUgc3BlY2lmaWVkLCBidXQKK2xpc3RlbnMgZm9yIHNlcnZlciBOU00gbm90aWZpY2F0aW9ucyBvbiBib3RoIFVEUCBhbmQgVENQLgorVGhlIE5GUyBBY2Nlc3MgQ29udHJvbCBMaXN0IChORlNBQ0wpIHByb3RvY29sIHNoYXJlcyB0aGUgc2FtZQordHJhbnNwb3J0IGFzIHRoZSBtYWluIE5GUyBzZXJ2aWNlLgorLlAKK0lmIG5vIHRyYW5zcG9ydCBvcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBMaW51eCBORlMgY2xpZW50Cit1c2VzIFVEUCB0byBjb250YWN0IHRoZSBzZXJ2ZXIncyBtb3VudGQgc2VydmljZSwgYW5kIFRDUCB0bworY29udGFjdCBpdHMgTkxNIGFuZCBORlMgc2VydmljZXMgYnkgZGVmYXVsdC4KKy5QCitJZiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlc2UgdHJhbnNwb3J0cyBmb3IgdGhlc2Ugc2VydmljZXMsIHRoZQorLkJSIG1vdW50ICg4KQorY29tbWFuZCBhdHRlbXB0cyB0byBkaXNjb3ZlciB3aGF0IHRoZSBzZXJ2ZXIgc3VwcG9ydHMsIGFuZCB0aGVuIHJldHJpZXMKK3RoZSBtb3VudCByZXF1ZXN0IG9uY2UgdXNpbmcgdGhlIGRpc2NvdmVyZWQgdHJhbnNwb3J0cy4KK0lmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgYWR2ZXJ0aXNlIGFueSB0cmFuc3BvcnQgc3VwcG9ydGVkIGJ5IHRoZSBjbGllbnQKK29yIGlzIG1pc2NvbmZpZ3VyZWQsIHRoZSBtb3VudCByZXF1ZXN0IGZhaWxzLgorSWYgdGhlCisuQiBiZworb3B0aW9uIGlzIGluIGVmZmVjdCwgdGhlIG1vdW50IGNvbW1hbmQgYmFja2dyb3VuZHMgaXRzZWxmIGFuZCBjb250aW51ZXMKK3RvIGF0dGVtcHQgdGhlIHNwZWNpZmllZCBtb3VudCByZXF1ZXN0LgorLlAKK1doZW4gdGhlCisuQiBwcm90bworb3B0aW9uLCB0aGUKKy5CIHVkcAorb3B0aW9uLCBvciB0aGUKKy5CIHRjcAorb3B0aW9uIGlzIHNwZWNpZmllZCBidXQgdGhlCisuQiBtb3VudHByb3RvCitvcHRpb24gaXMgbm90LCB0aGUgc3BlY2lmaWVkIHRyYW5zcG9ydCBpcyB1c2VkIHRvIGNvbnRhY3QKK2JvdGggdGhlIHNlcnZlcidzIG1vdW50ZCBzZXJ2aWNlIGFuZCBmb3IgdGhlIE5MTSBhbmQgTkZTIHNlcnZpY2VzLgorLlAKK0lmIHRoZQorLkIgbW91bnRwcm90bworb3B0aW9uIGlzIHNwZWNpZmllZCBidXQgbm9uZSBvZiB0aGUKKy5CUiBwcm90byAiLCAiIHVkcCAiIG9yICIgdGNwCitvcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHNwZWNpZmllZCB0cmFuc3BvcnQgaXMgdXNlZCBmb3IgdGhlCitpbml0aWFsIG1vdW50ZCByZXF1ZXN0LCBidXQgdGhlIG1vdW50IGNvbW1hbmQgYXR0ZW1wdHMgdG8gZGlzY292ZXIKK3doYXQgdGhlIHNlcnZlciBzdXBwb3J0cyBmb3IgdGhlIE5GUyBwcm90b2NvbCwgcHJlZmVycmluZyBUQ1AgaWYKK2JvdGggdHJhbnNwb3J0cyBhcmUgc3VwcG9ydGVkLgorLlAKK0lmIGJvdGggdGhlCisuQlIgbW91bnRwcm90byAiIGFuZCAiIHByb3RvCisob3IKKy5CUiB1ZHAgIiBvciAiIHRjcCApCitvcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHRyYW5zcG9ydCBzcGVjaWZpZWQgYnkgdGhlCisuQiBtb3VudHByb3RvCitvcHRpb24gaXMgdXNlZCBmb3IgdGhlIGluaXRpYWwgbW91bnRkIHJlcXVlc3QsIGFuZCB0aGUgdHJhbnNwb3J0CitzcGVjaWZpZWQgYnkgdGhlCisuQiBwcm90bworb3B0aW9uIChvciB0aGUKKy5CUiB1ZHAgIiBvciAiIHRjcCAiIG9wdGlvbnMpIgoraXMgdXNlZCBmb3IgTkZTLCBubyBtYXR0ZXIgd2hhdCBvcmRlciB0aGVzZSBvcHRpb25zIGFwcGVhci4KK05vIGF1dG9tYXRpYyBzZXJ2aWNlIGRpc2NvdmVyeSBpcyBwZXJmb3JtZWQgaWYgdGhlc2Ugb3B0aW9ucyBhcmUKK3NwZWNpZmllZC4KKy5QCitJZiBhbnkgb2YgdGhlCisuQlIgcHJvdG8gIiwgIiB1ZHAgIiwgIiB0Y3AgIiwgIgorb3IKKy5CIG1vdW50cHJvdG8KK29wdGlvbnMgYXJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBtb3VudCBjb21tYW5kIGxpbmUsCit0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgcmlnaHRtb3N0IGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlc2Ugb3B0aW9ucwordGFrZXMgZWZmZWN0LgorLlNIICJEQVRBIEFORCBNRVRBREFUQSBDT0hFUkVOQ0UiCitTb21lIG1vZGVybiBjbHVzdGVyIGZpbGUgc3lzdGVtcyBwcm92aWRlCitwZXJmZWN0IGNhY2hlIGNvaGVyZW5jZSBhbW9uZyB0aGVpciBjbGllbnRzLgorUGVyZmVjdCBjYWNoZSBjb2hlcmVuY2UgYW1vbmcgZGlzcGFyYXRlIE5GUyBjbGllbnRzCitpcyBleHBlbnNpdmUgdG8gYWNoaWV2ZSwgZXNwZWNpYWxseSBvbiB3aWRlIGFyZWEgbmV0d29ya3MuCitBcyBzdWNoLCBORlMgc2V0dGxlcyBmb3Igd2Vha2VyIGNhY2hlIGNvaGVyZW5jZSB0aGF0CitzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiBtb3N0IGZpbGUgc2hhcmluZyB0eXBlcy4gTm9ybWFsbHksCitmaWxlIHNoYXJpbmcgaXMgY29tcGxldGVseSBzZXF1ZW50aWFsOgorZmlyc3QgY2xpZW50IEEgb3BlbnMgYSBmaWxlLCB3cml0ZXMgc29tZXRoaW5nIHRvIGl0LCB0aGVuIGNsb3NlcyBpdDsKK3RoZW4gY2xpZW50IEIgb3BlbnMgdGhlIHNhbWUgZmlsZSwgYW5kIHJlYWRzIHRoZSBjaGFuZ2VzLgorLkRUCisuU1MgIkNsb3NlLXRvLW9wZW4gY2FjaGUgY29uc2lzdGVuY3kiCitXaGVuIGFuIGFwcGxpY2F0aW9uIG9wZW5zIGEgZmlsZSBzdG9yZWQgb24gYW4gTkZTIHNlcnZlciwKK3RoZSBORlMgY2xpZW50IGNoZWNrcyB0aGF0IGl0IHN0aWxsIGV4aXN0cyBvbiB0aGUgc2VydmVyCithbmQgaXMgcGVybWl0dGVkIHRvIHRoZSBvcGVuZXIgYnkgc2VuZGluZyBhIEdFVEFUVFIgb3IgQUNDRVNTIHJlcXVlc3QuCitXaGVuIHRoZSBhcHBsaWNhdGlvbiBjbG9zZXMgdGhlIGZpbGUsCit0aGUgTkZTIGNsaWVudCB3cml0ZXMgYmFjayBhbnkgcGVuZGluZyBjaGFuZ2VzCit0byB0aGUgZmlsZSBzbyB0aGF0IHRoZSBuZXh0IG9wZW5lciBjYW4gdmlldyB0aGUgY2hhbmdlcy4KK1RoaXMgYWxzbyBnaXZlcyB0aGUgTkZTIGNsaWVudCBhbiBvcHBvcnR1bml0eSB0byByZXBvcnQKK2FueSBzZXJ2ZXIgd3JpdGUgZXJyb3JzIHRvIHRoZSBhcHBsaWNhdGlvbgordmlhIHRoZSByZXR1cm4gY29kZSBmcm9tCisuQlIgY2xvc2UgKDIpLgorVGhlIGJlaGF2aW9yIG9mIGNoZWNraW5nIGF0IG9wZW4gdGltZSBhbmQgZmx1c2hpbmcgYXQgY2xvc2UgdGltZQoraXMgcmVmZXJyZWQgdG8gYXMgY2xvc2UtdG8tb3BlbiBjYWNoZSBjb25zaXN0ZW5jeS4KKy5TUyAiV2VhayBjYWNoZSBjb25zaXN0ZW5jeSIKK1RoZXJlIGFyZSBzdGlsbCBvcHBvcnR1bml0aWVzIGZvciBhIGNsaWVudCdzIGRhdGEgY2FjaGUKK3RvIGNvbnRhaW4gc3RhbGUgZGF0YS4KK1RoZSBORlMgdmVyc2lvbiAzIHByb3RvY29sIGludHJvZHVjZWQgIndlYWsgY2FjaGUgY29uc2lzdGVuY3kiCisoYWxzbyBrbm93biBhcyBXQ0MpIHdoaWNoIHByb3ZpZGVzIGEgd2F5IG9mIGVmZmljaWVudGx5IGNoZWNraW5nCithIGZpbGUncyBhdHRyaWJ1dGVzIGJlZm9yZSBhbmQgYWZ0ZXIgYSBzaW5nbGUgcmVxdWVzdC4KK1RoaXMgYWxsb3dzIGEgY2xpZW50IHRvIGhlbHAgaWRlbnRpZnkgY2hhbmdlcwordGhhdCBjb3VsZCBoYXZlIGJlZW4gbWFkZSBieSBvdGhlciBjbGllbnRzLgorLlAKK1doZW4gYSBjbGllbnQgaXMgdXNpbmcgbWFueSBjb25jdXJyZW50IG9wZXJhdGlvbnMKK3RoYXQgdXBkYXRlIHRoZSBzYW1lIGZpbGUgYXQgdGhlIHNhbWUgdGltZQorKGZvciBleGFtcGxlLCBkdXJpbmcgYXN5bmNocm9ub3VzIHdyaXRlIGJlaGluZCksCitpdCBpcyBzdGlsbCBkaWZmaWN1bHQgdG8gdGVsbCB3aGV0aGVyIGl0IHdhcwordGhhdCBjbGllbnQncyB1cGRhdGVzIG9yIHNvbWUgb3RoZXIgY2xpZW50J3MgdXBkYXRlcwordGhhdCBhbHRlcmVkIHRoZSBmaWxlLgorLlNTICJBdHRyaWJ1dGUgY2FjaGluZyIKK1VzZSB0aGUKKy5CIG5vYWMKK21vdW50IG9wdGlvbiB0byBhY2hpZXZlIGF0dHJpYnV0ZSBjYWNoZSBjb2hlcmVuY2UKK2Ftb25nIG11bHRpcGxlIGNsaWVudHMuCitBbG1vc3QgZXZlcnkgZmlsZSBzeXN0ZW0gb3BlcmF0aW9uIGNoZWNrcworZmlsZSBhdHRyaWJ1dGUgaW5mb3JtYXRpb24uCitUaGUgY2xpZW50IGtlZXBzIHRoaXMgaW5mb3JtYXRpb24gY2FjaGVkCitmb3IgYSBwZXJpb2Qgb2YgdGltZSB0byByZWR1Y2UgbmV0d29yayBhbmQgc2VydmVyIGxvYWQuCitXaGVuCisuQiBub2FjCitpcyBpbiBlZmZlY3QsIGEgY2xpZW50J3MgZmlsZSBhdHRyaWJ1dGUgY2FjaGUgaXMgZGlzYWJsZWQsCitzbyBlYWNoIG9wZXJhdGlvbiB0aGF0IG5lZWRzIHRvIGNoZWNrIGEgZmlsZSdzIGF0dHJpYnV0ZXMKK2lzIGZvcmNlZCB0byBnbyBiYWNrIHRvIHRoZSBzZXJ2ZXIuCitUaGlzIHBlcm1pdHMgYSBjbGllbnQgdG8gc2VlIGNoYW5nZXMgdG8gYSBmaWxlIHZlcnkgcXVpY2tseSwKK2F0IHRoZSBjb3N0IG9mIG1hbnkgZXh0cmEgbmV0d29yayBvcGVyYXRpb25zLgorLlAKK0JlIGNhcmVmdWwgbm90IHRvIGNvbmZ1c2UgdGhlCisuQiBub2FjCitvcHRpb24gd2l0aCAibm8gZGF0YSBjYWNoaW5nLiIKK1RoZQorLkIgbm9hYworbW91bnQgb3B0aW9uIHByZXZlbnRzIHRoZSBjbGllbnQgZnJvbSBjYWNoaW5nIGZpbGUgbWV0YWRhdGEsCitidXQgdGhlcmUgYXJlIHN0aWxsIHJhY2VzIHRoYXQgbWF5IHJlc3VsdCBpbiBkYXRhIGNhY2hlIGluY29oZXJlbmNlCitiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLgorLlAKK1RoZSBORlMgcHJvdG9jb2wgaXMgbm90IGRlc2lnbmVkIHRvIHN1cHBvcnQKK3RydWUgY2x1c3RlciBmaWxlIHN5c3RlbSBjYWNoZSBjb2hlcmVuY2UKK3dpdGhvdXQgc29tZSB0eXBlIG9mIGFwcGxpY2F0aW9uIHNlcmlhbGl6YXRpb24uCitJZiBhYnNvbHV0ZSBjYWNoZSBjb2hlcmVuY2UgYW1vbmcgY2xpZW50cyBpcyByZXF1aXJlZCwKK2FwcGxpY2F0aW9ucyBzaG91bGQgdXNlIGZpbGUgbG9ja2luZy4gQWx0ZXJuYXRpdmVseSwgYXBwbGljYXRpb25zCitjYW4gYWxzbyBvcGVuIHRoZWlyIGZpbGVzIHdpdGggdGhlIE9fRElSRUNUIGZsYWcKK3RvIGRpc2FibGUgZGF0YSBjYWNoaW5nIGVudGlyZWx5LgorLlNTICJEaXJlY3RvcnkgZW50cnkgY2FjaGluZyIKK1RoZSBMaW51eCBORlMgY2xpZW50IGNhY2hlcyB0aGUgcmVzdWx0IG9mIGFsbCBORlMgTE9PS1VQIHJlcXVlc3RzLgorSWYgdGhlIHJlcXVlc3RlZCBkaXJlY3RvcnkgZW50cnkgZXhpc3RzIG9uIHRoZSBzZXJ2ZXIsCit0aGUgcmVzdWx0IGlzIHJlZmVycmVkIHRvIGFzIGEKKy5JUiBwb3NpdGl2ZSAiIGxvb2t1cCByZXN1bHQuCitJZiB0aGUgcmVxdWVzdGVkIGRpcmVjdG9yeSBlbnRyeSBkb2VzIG5vdCBleGlzdCBvbiB0aGUgc2VydmVyCisodGhhdCBpcywgdGhlIHNlcnZlciByZXR1cm5lZCBFTk9FTlQpLAordGhlIHJlc3VsdCBpcyByZWZlcnJlZCB0byBhcworLklSIG5lZ2F0aXZlICIgbG9va3VwIHJlc3VsdC4KKy5QCitUbyBkZXRlY3Qgd2hlbiBkaXJlY3RvcnkgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZAorb24gdGhlIHNlcnZlciwKK3RoZSBMaW51eCBORlMgY2xpZW50IHdhdGNoZXMgYSBkaXJlY3RvcnkncyBtdGltZS4KK0lmIHRoZSBjbGllbnQgZGV0ZWN0cyBhIGNoYW5nZSBpbiBhIGRpcmVjdG9yeSdzIG10aW1lLAordGhlIGNsaWVudCBkcm9wcyBhbGwgY2FjaGVkIExPT0tVUCByZXN1bHRzIGZvciB0aGF0IGRpcmVjdG9yeS4KK1NpbmNlIHRoZSBkaXJlY3RvcnkncyBtdGltZSBpcyBhIGNhY2hlZCBhdHRyaWJ1dGUsIGl0IG1heQordGFrZSBzb21lIHRpbWUgYmVmb3JlIGEgY2xpZW50IG5vdGljZXMgaXQgaGFzIGNoYW5nZWQuCitTZWUgdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUKKy5CUiBhY2Rpcm1pbiAiLCAiIGFjZGlybWF4ICIsIGFuZCAiIG5vYWMKK21vdW50IG9wdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKK2hvdyBsb25nIGEgZGlyZWN0b3J5J3MgbXRpbWUgaXMgY2FjaGVkLgorLlAKK0NhY2hpbmcgZGlyZWN0b3J5IGVudHJpZXMgaW1wcm92ZXMgdGhlIHBlcmZvcm1hbmNlIG9mIGFwcGxpY2F0aW9ucyB0aGF0CitkbyBub3Qgc2hhcmUgZmlsZXMgd2l0aCBhcHBsaWNhdGlvbnMgb24gb3RoZXIgY2xpZW50cy4KK1VzaW5nIGNhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCBkaXJlY3RvcmllcyBjYW4gaW50ZXJmZXJlCit3aXRoIGFwcGxpY2F0aW9ucyB0aGF0IHJ1biBjb25jdXJyZW50bHkgb24gbXVsdGlwbGUgY2xpZW50cyBhbmQKK25lZWQgdG8gZGV0ZWN0IHRoZSBjcmVhdGlvbiBvciByZW1vdmFsIG9mIGZpbGVzIHF1aWNrbHksIGhvd2V2ZXIuCitUaGUKKy5CIGxvb2t1cGNhY2hlCittb3VudCBvcHRpb24gYWxsb3dzIHNvbWUgdHVuaW5nIG9mIGRpcmVjdG9yeSBlbnRyeSBjYWNoaW5nIGJlaGF2aW9yLgorLlAKK0JlZm9yZSBrZXJuZWwgcmVsZWFzZSAyLjYuMjgsCit0aGUgTGludXggTkZTIGNsaWVudCB0cmFja2VkIG9ubHkgcG9zaXRpdmUgbG9va3VwIHJlc3VsdHMuCitUaGlzIHBlcm1pdHRlZCBhcHBsaWNhdGlvbnMgdG8gZGV0ZWN0IG5ldyBkaXJlY3RvcnkgZW50cmllcworY3JlYXRlZCBieSBvdGhlciBjbGllbnRzIHF1aWNrbHkgd2hpbGUgc3RpbGwgcHJvdmlkaW5nIHNvbWUgb2YgdGhlCitwZXJmb3JtYW5jZSBiZW5lZml0cyBvZiBjYWNoaW5nLgorSWYgYW4gYXBwbGljYXRpb24gZGVwZW5kcyBvbiB0aGUgcHJldmlvdXMgbG9va3VwIGNhY2hpbmcgYmVoYXZpb3IKK29mIHRoZSBMaW51eCBORlMgY2xpZW50LCB5b3UgY2FuIHVzZQorLkJSIGxvb2t1cGNhY2hlPXBvc2l0aXZlIC4KKy5QCitJZiB0aGUgY2xpZW50IGlnbm9yZXMgaXRzIGNhY2hlIGFuZCB2YWxpZGF0ZXMgZXZlcnkgYXBwbGljYXRpb24KK2xvb2t1cCByZXF1ZXN0IHdpdGggdGhlIHNlcnZlciwKK3RoYXQgY2xpZW50IGNhbiBpbW1lZGlhdGVseSBkZXRlY3Qgd2hlbiBhIG5ldyBkaXJlY3RvcnkKK2VudHJ5IGhhcyBiZWVuIGVpdGhlciBjcmVhdGVkIG9yIHJlbW92ZWQgYnkgYW5vdGhlciBjbGllbnQuCitZb3UgY2FuIHNwZWNpZnkgdGhpcyBiZWhhdmlvciB1c2luZworLkJSIGxvb2t1cGNhY2hlPW5vbmUgLgorVGhlIGV4dHJhIE5GUyByZXF1ZXN0cyBuZWVkZWQgaWYgdGhlIGNsaWVudCBkb2VzIG5vdAorY2FjaGUgZGlyZWN0b3J5IGVudHJpZXMgY2FuIGV4YWN0IGEgcGVyZm9ybWFuY2UgcGVuYWx0eS4KK0Rpc2FibGluZyBsb29rdXAgY2FjaGluZworc2hvdWxkIHJlc3VsdCBpbiBsZXNzIG9mIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSB0aGFuIHVzaW5nCisuQlIgbm9hYyAsCithbmQgaGFzIG5vIGVmZmVjdCBvbiBob3cgdGhlIE5GUyBjbGllbnQgY2FjaGVzIHRoZSBhdHRyaWJ1dGVzIG9mIGZpbGVzLgorLlAKKy5TUyAiVGhlIHN5bmMgbW91bnQgb3B0aW9uIgorVGhlIE5GUyBjbGllbnQgdHJlYXRzIHRoZQorLkIgc3luYworbW91bnQgb3B0aW9uIGRpZmZlcmVudGx5IHRoYW4gc29tZSBvdGhlciBmaWxlIHN5c3RlbXMKKyhyZWZlciB0bworLkJSIG1vdW50ICg4KQorZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGdlbmVyaWMKKy5CIHN5bmMKK2FuZAorLkIgYXN5bmMKK21vdW50IG9wdGlvbnMpLgorSWYgbmVpdGhlcgorLkIgc3luYworbm9yCisuQiBhc3luYworaXMgc3BlY2lmaWVkIChvciBpZiB0aGUKKy5CIGFzeW5jCitvcHRpb24gaXMgc3BlY2lmaWVkKSwKK3RoZSBORlMgY2xpZW50IGRlbGF5cyBzZW5kaW5nIGFwcGxpY2F0aW9uCit3cml0ZXMgdG8gdGhlIHNlcnZlcgordW50aWwgYW55IG9mIHRoZXNlIGV2ZW50cyBvY2N1cjoKKy5JUAorTWVtb3J5IHByZXNzdXJlIGZvcmNlcyByZWNsYW1hdGlvbiBvZiBzeXN0ZW0gbWVtb3J5IHJlc291cmNlcy4KKy5JUAorQW4gYXBwbGljYXRpb24gZmx1c2hlcyBmaWxlIGRhdGEgZXhwbGljaXRseSB3aXRoCisuQlIgc3luYyAoMiksCisuQlIgbXN5bmMgKDIpLAorb3IKKy5CUiBmc3luYyAoMykuCisuSVAKK0FuIGFwcGxpY2F0aW9uIGNsb3NlcyBhIGZpbGUgd2l0aAorLkJSIGNsb3NlICgyKS4KKy5JUAorVGhlIGZpbGUgaXMgbG9ja2VkL3VubG9ja2VkIHZpYQorLkJSIGZjbnRsICgyKS4KKy5QCitJbiBvdGhlciB3b3JkcywgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsCitkYXRhIHdyaXR0ZW4gYnkgYW4gYXBwbGljYXRpb24gbWF5IG5vdCBpbW1lZGlhdGVseSBhcHBlYXIKK29uIHRoZSBzZXJ2ZXIgdGhhdCBob3N0cyB0aGUgZmlsZS4KKy5QCitJZiB0aGUKKy5CIHN5bmMKK29wdGlvbiBpcyBzcGVjaWZpZWQgb24gYSBtb3VudCBwb2ludCwKK2FueSBzeXN0ZW0gY2FsbCB0aGF0IHdyaXRlcyBkYXRhIHRvIGZpbGVzIG9uIHRoYXQgbW91bnQgcG9pbnQKK2NhdXNlcyB0aGF0IGRhdGEgdG8gYmUgZmx1c2hlZCB0byB0aGUgc2VydmVyCitiZWZvcmUgdGhlIHN5c3RlbSBjYWxsIHJldHVybnMgY29udHJvbCB0byB1c2VyIHNwYWNlLgorVGhpcyBwcm92aWRlcyBncmVhdGVyIGRhdGEgY2FjaGUgY29oZXJlbmNlIGFtb25nIGNsaWVudHMsCitidXQgYXQgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBjb3N0LgorLlAKK0FwcGxpY2F0aW9ucyBjYW4gdXNlIHRoZSBPX1NZTkMgb3BlbiBmbGFnIHRvIGZvcmNlIGFwcGxpY2F0aW9uCit3cml0ZXMgdG8gaW5kaXZpZHVhbCBmaWxlcyB0byBnbyB0byB0aGUgc2VydmVyIGltbWVkaWF0ZWx5IHdpdGhvdXQKK3RoZSB1c2Ugb2YgdGhlCisuQiBzeW5jCittb3VudCBvcHRpb24uCisuU1MgIlVzaW5nIGZpbGUgbG9ja3Mgd2l0aCBORlMiCitUaGUgTmV0d29yayBMb2NrIE1hbmFnZXIgcHJvdG9jb2wgaXMgYSBzZXBhcmF0ZSBzaWRlYmFuZCBwcm90b2NvbAordXNlZCB0byBtYW5hZ2UgZmlsZSBsb2NrcyBpbiBORlMgdmVyc2lvbiAyIGFuZCB2ZXJzaW9uIDMuCitUbyBzdXBwb3J0IGxvY2sgcmVjb3ZlcnkgYWZ0ZXIgYSBjbGllbnQgb3Igc2VydmVyIHJlYm9vdCwKK2Egc2Vjb25kIHNpZGViYW5kIHByb3RvY29sIC0tCitrbm93biBhcyB0aGUgTmV0d29yayBTdGF0dXMgTWFuYWdlciBwcm90b2NvbCAtLQoraXMgYWxzbyByZXF1aXJlZC4KK0luIE5GUyB2ZXJzaW9uIDQsCitmaWxlIGxvY2tpbmcgaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGluIHRoZSBtYWluIE5GUyBwcm90b2NvbCwKK2FuZCB0aGUgTkxNIGFuZCBOU00gc2lkZWJhbmQgcHJvdG9jb2xzIGFyZSBub3QgdXNlZC4KKy5QCitJbiBtb3N0IGNhc2VzLCBOTE0gYW5kIE5TTSBzZXJ2aWNlcyBhcmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5LAorYW5kIG5vIGV4dHJhIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuCitDb25maWd1cmUgYWxsIE5GUyBjbGllbnRzIHdpdGggZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lcwordG8gZW5zdXJlIHRoYXQgTkZTIHNlcnZlcnMgY2FuIGZpbmQgY2xpZW50cyB0byBub3RpZnkgdGhlbSBvZiBzZXJ2ZXIgcmVib290cy4KKy5QCitOTE0gc3VwcG9ydHMgYWR2aXNvcnkgZmlsZSBsb2NrcyBvbmx5LgorVG8gbG9jayBORlMgZmlsZXMsIHVzZQorLkJSIGZjbnRsICgyKQord2l0aCB0aGUgRl9HRVRMSyBhbmQgRl9TRVRMSyBjb21tYW5kcy4KK1RoZSBORlMgY2xpZW50IGNvbnZlcnRzIGZpbGUgbG9ja3Mgb2J0YWluZWQgdmlhCisuQlIgZmxvY2sgKDIpCit0byBhZHZpc29yeSBsb2Nrcy4KKy5QCitXaGVuIG1vdW50aW5nIHNlcnZlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgTkxNIHByb3RvY29sLAorb3Igd2hlbiBtb3VudGluZyBhbiBORlMgc2VydmVyIHRocm91Z2ggYSBmaXJld2FsbAordGhhdCBibG9ja3MgdGhlIE5MTSBzZXJ2aWNlIHBvcnQsCitzcGVjaWZ5IHRoZQorLkIgbm9sb2NrCittb3VudCBvcHRpb24uIE5MTSBsb2NraW5nIG11c3QgYmUgZGlzYWJsZWQgd2l0aCB0aGUKKy5CIG5vbG9jaworb3B0aW9uIHdoZW4gdXNpbmcgTkZTIHRvIG1vdW50CisuSSAvdmFyCitiZWNhdXNlCisuSSAvdmFyCitjb250YWlucyBmaWxlcyB1c2VkIGJ5IHRoZSBOTE0gaW1wbGVtZW50YXRpb24gb24gTGludXguCisuUAorU3BlY2lmeWluZyB0aGUKKy5CIG5vbG9jaworb3B0aW9uIG1heSBhbHNvIGJlIGFkdmlzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2UKK29mIGEgcHJvcHJpZXRhcnkgYXBwbGljYXRpb24gd2hpY2ggcnVucyBvbiBhIHNpbmdsZSBjbGllbnQKK2FuZCB1c2VzIGZpbGUgbG9ja3MgZXh0ZW5zaXZlbHkuCisuU1MgIk5GUyB2ZXJzaW9uIDQgY2FjaGluZyBmZWF0dXJlcyIKK1RoZSBkYXRhIGFuZCBtZXRhZGF0YSBjYWNoaW5nIGJlaGF2aW9yIG9mIE5GUyB2ZXJzaW9uIDQKK2NsaWVudHMgaXMgc2ltaWxhciB0byB0aGF0IG9mIGVhcmxpZXIgdmVyc2lvbnMuCitIb3dldmVyLCBORlMgdmVyc2lvbiA0IGFkZHMgdHdvIGZlYXR1cmVzIHRoYXQgaW1wcm92ZQorY2FjaGUgYmVoYXZpb3I6CisuSSBjaGFuZ2UgYXR0cmlidXRlcworYW5kCisuSVIgImZpbGUgZGVsZWdhdGlvbiIgLgorLlAKK1RoZQorLkkgY2hhbmdlIGF0dHJpYnV0ZQoraXMgYSBuZXcgcGFydCBvZiBORlMgZmlsZSBhbmQgZGlyZWN0b3J5IG1ldGFkYXRhCit3aGljaCB0cmFja3MgZGF0YSBjaGFuZ2VzLgorSXQgcmVwbGFjZXMgdGhlIHVzZSBvZiBhIGZpbGUncyBtb2RpZmljYXRpb24KK2FuZCBjaGFuZ2UgdGltZSBzdGFtcHMKK2FzIGEgd2F5IGZvciBjbGllbnRzIHRvIHZhbGlkYXRlIHRoZSBjb250ZW50CitvZiB0aGVpciBjYWNoZXMuCitDaGFuZ2UgYXR0cmlidXRlcyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIHRpbWUgc3RhbXAKK3Jlc29sdXRpb24gb24gZWl0aGVyIHRoZSBzZXJ2ZXIgb3IgY2xpZW50LCBob3dldmVyLgorLlAKK0EKKy5JIGZpbGUgZGVsZWdhdGlvbgoraXMgYSBjb250cmFjdCBiZXR3ZWVuIGFuIE5GUyB2ZXJzaW9uIDQgY2xpZW50CithbmQgc2VydmVyIHRoYXQgYWxsb3dzIHRoZSBjbGllbnQgdG8gdHJlYXQgYSBmaWxlIHRlbXBvcmFyaWx5CithcyBpZiBubyBvdGhlciBjbGllbnQgaXMgYWNjZXNzaW5nIGl0LgorVGhlIHNlcnZlciBwcm9taXNlcyB0byBub3RpZnkgdGhlIGNsaWVudCAodmlhIGEgY2FsbGJhY2sgcmVxdWVzdCkgaWYgYW5vdGhlciBjbGllbnQKK2F0dGVtcHRzIHRvIGFjY2VzcyB0aGF0IGZpbGUuCitPbmNlIGEgZmlsZSBoYXMgYmVlbiBkZWxlZ2F0ZWQgdG8gYSBjbGllbnQsIHRoZSBjbGllbnQgY2FuCitjYWNoZSB0aGF0IGZpbGUncyBkYXRhIGFuZCBtZXRhZGF0YSBhZ2dyZXNzaXZlbHkgd2l0aG91dAorY29udGFjdGluZyB0aGUgc2VydmVyLgorLlAKK0ZpbGUgZGVsZWdhdGlvbnMgY29tZSBpbiB0d28gZmxhdm9yczoKKy5JIHJlYWQKK2FuZAorLklSIHdyaXRlIC4KK0EKKy5JIHJlYWQKK2RlbGVnYXRpb24gbWVhbnMgdGhhdCB0aGUgc2VydmVyIG5vdGlmaWVzIHRoZSBjbGllbnQKK2Fib3V0IGFueSBvdGhlciBjbGllbnRzIHRoYXQgd2FudCB0byB3cml0ZSB0byB0aGUgZmlsZS4KK0EKKy5JIHdyaXRlCitkZWxlZ2F0aW9uIG1lYW5zIHRoYXQgdGhlIGNsaWVudCBnZXRzIG5vdGlmaWVkIGFib3V0CitlaXRoZXIgcmVhZCBvciB3cml0ZSBhY2Nlc3NvcnMuCisuUAorU2VydmVycyBncmFudCBmaWxlIGRlbGVnYXRpb25zIHdoZW4gYSBmaWxlIGlzIG9wZW5lZCwKK2FuZCBjYW4gcmVjYWxsIGRlbGVnYXRpb25zIGF0IGFueSB0aW1lIHdoZW4gYW5vdGhlcgorY2xpZW50IHdhbnRzIGFjY2VzcyB0byB0aGUgZmlsZSB0aGF0IGNvbmZsaWN0cyB3aXRoCithbnkgZGVsZWdhdGlvbnMgYWxyZWFkeSBncmFudGVkLgorRGVsZWdhdGlvbnMgb24gZGlyZWN0b3JpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisuUAorSW4gb3JkZXIgdG8gc3VwcG9ydCBkZWxlZ2F0aW9uIGNhbGxiYWNrLCB0aGUgc2VydmVyCitjaGVja3MgdGhlIG5ldHdvcmsgcmV0dXJuIHBhdGggdG8gdGhlIGNsaWVudCBkdXJpbmcKK3RoZSBjbGllbnQncyBpbml0aWFsIGNvbnRhY3Qgd2l0aCB0aGUgc2VydmVyLgorSWYgY29udGFjdCB3aXRoIHRoZSBjbGllbnQgY2Fubm90IGJlIGVzdGFibGlzaGVkLAordGhlIHNlcnZlciBzaW1wbHkgZG9lcyBub3QgZ3JhbnQgYW55IGRlbGVnYXRpb25zIHRvCit0aGF0IGNsaWVudC4KKy5TSCAiU0VDVVJJVFkgQ09OU0lERVJBVElPTlMiCitORlMgc2VydmVycyBjb250cm9sIGFjY2VzcyB0byBmaWxlIGRhdGEsCitidXQgdGhleSBkZXBlbmQgb24gdGhlaXIgUlBDIGltcGxlbWVudGF0aW9uCit0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIG9mIE5GUyByZXF1ZXN0cy4KK1RyYWRpdGlvbmFsIE5GUyBhY2Nlc3MgY29udHJvbCBtaW1pY3MKK3RoZSBzdGFuZGFyZCBtb2RlIGJpdCBhY2Nlc3MgY29udHJvbCBwcm92aWRlZCBpbiBsb2NhbCBmaWxlIHN5c3RlbXMuCitUcmFkaXRpb25hbCBSUEMgYXV0aGVudGljYXRpb24gdXNlcyBhIG51bWJlcgordG8gcmVwcmVzZW50IGVhY2ggdXNlcgorKHVzdWFsbHkgdGhlIHVzZXIncyBvd24gdWlkKSwKK2EgbnVtYmVyIHRvIHJlcHJlc2VudCB0aGUgdXNlcidzIGdyb3VwICh0aGUgdXNlcidzIGdpZCksCithbmQgYSBzZXQgb2YgdXAgdG8gMTYgYXV4aWxpYXJ5IGdyb3VwIG51bWJlcnMKK3RvIHJlcHJlc2VudCBvdGhlciBncm91cHMgb2Ygd2hpY2ggdGhlIHVzZXIgbWF5IGJlIGEgbWVtYmVyLgorLlAKK1R5cGljYWxseSwgZmlsZSBkYXRhIGFuZCB1c2VyIElEIHZhbHVlcyBhcHBlYXIgdW5lbmNyeXB0ZWQKKyhpLmUuICJpbiB0aGUgY2xlYXIiKSBvbiB0aGUgbmV0d29yay4KK01vcmVvdmVyLCBORlMgdmVyc2lvbnMgMiBhbmQgMyB1c2UKK3NlcGFyYXRlIHNpZGViYW5kIHByb3RvY29scyBmb3IgbW91bnRpbmcsCitsb2NraW5nIGFuZCB1bmxvY2tpbmcgZmlsZXMsCithbmQgcmVwb3J0aW5nIHN5c3RlbSBzdGF0dXMgb2YgY2xpZW50cyBhbmQgc2VydmVycy4KK1RoZXNlIGF1eGlsaWFyeSBwcm90b2NvbHMgdXNlIG5vIGF1dGhlbnRpY2F0aW9uLgorLlAKK0luIGFkZGl0aW9uIHRvIGNvbWJpbmluZyB0aGVzZSBzaWRlYmFuZCBwcm90b2NvbHMgd2l0aCB0aGUgbWFpbiBORlMgcHJvdG9jb2wsCitORlMgdmVyc2lvbiA0IGludHJvZHVjZXMgbW9yZSBhZHZhbmNlZCBmb3JtcyBvZiBhY2Nlc3MgY29udHJvbCwKK2F1dGhlbnRpY2F0aW9uLCBhbmQgaW4tdHJhbnNpdCBkYXRhIHByb3RlY3Rpb24uCitUaGUgTkZTIHZlcnNpb24gNCBzcGVjaWZpY2F0aW9uIG1hbmRhdGVzIE5GU3Y0IEFDTHMsCitSUENHU1MgYXV0aGVudGljYXRpb24sIGFuZCBSUENHU1Mgc2VjdXJpdHkgZmxhdm9ycwordGhhdCBwcm92aWRlIHBlci1SUEMgaW50ZWdyaXR5IGNoZWNraW5nIGFuZCBlbmNyeXB0aW9uLgorQmVjYXVzZSBORlMgdmVyc2lvbiA0IGNvbWJpbmVzIHRoZQorZnVuY3Rpb24gb2YgdGhlIHNpZGViYW5kIHByb3RvY29scyBpbnRvIHRoZSBtYWluIE5GUyBwcm90b2NvbCwKK3RoZSBuZXcgc2VjdXJpdHkgZmVhdHVyZXMgYXBwbHkgdG8gYWxsIE5GUyB2ZXJzaW9uIDQgb3BlcmF0aW9ucworaW5jbHVkaW5nIG1vdW50aW5nLCBmaWxlIGxvY2tpbmcsIGFuZCBzbyBvbi4KK1JQQ0dTUyBhdXRoZW50aWNhdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHdpdGggTkZTIHZlcnNpb25zIDIgYW5kIDMsCitidXQgZG9lcyBub3QgcHJvdGVjdCB0aGVpciBzaWRlYmFuZCBwcm90b2NvbHMuCisuUAorVGhlCisuQiBzZWMKK21vdW50IG9wdGlvbiBzcGVjaWZpZXMgdGhlIFJQQ0dTUyBzZWN1cml0eSBtb2RlCit0aGF0IGlzIGluIGVmZmVjdCBvbiBhIGdpdmVuIE5GUyBtb3VudCBwb2ludC4KK1NwZWNpZnlpbmcKKy5CIHNlYz1rcmI1Citwcm92aWRlcyBjcnlwdG9ncmFwaGljIHByb29mIG9mIGEgdXNlcidzIGlkZW50aXR5IGluIGVhY2ggUlBDIHJlcXVlc3QuCitUaGlzIHByb3ZpZGVzIHN0cm9uZyB2ZXJpZmljYXRpb24gb2YgdGhlIGlkZW50aXR5IG9mIHVzZXJzCithY2Nlc3NpbmcgZGF0YSBvbiB0aGUgc2VydmVyLgorTm90ZSB0aGF0IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBiZXNpZGVzIGFkZGluZyB0aGlzIG1vdW50IG9wdGlvbgoraXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZW5hYmxlIEtlcmJlcm9zIHNlY3VyaXR5LgorUmVmZXIgdG8gdGhlCisuQlIgcnBjLmdzc2QgKDgpCittYW4gcGFnZSBmb3IgZGV0YWlscy4KKy5QCitUd28gYWRkaXRpb25hbCBmbGF2b3JzIG9mIEtlcmJlcm9zIHNlY3VyaXR5IGFyZSBzdXBwb3J0ZWQ6CisuQiBrcmI1aQorYW5kCisuQlIga3JiNXAgLgorVGhlCisuQiBrcmI1aQorc2VjdXJpdHkgZmxhdm9yIHByb3ZpZGVzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nIGd1YXJhbnRlZQordGhhdCB0aGUgZGF0YSBpbiBlYWNoIFJQQyByZXF1ZXN0IGhhcyBub3QgYmVlbiB0YW1wZXJlZCB3aXRoLgorVGhlCisuQiBrcmI1cAorc2VjdXJpdHkgZmxhdm9yIGVuY3J5cHRzIGV2ZXJ5IFJQQyByZXF1ZXN0Cit0byBwcmV2ZW50IGRhdGEgZXhwb3N1cmUgZHVyaW5nIG5ldHdvcmsgdHJhbnNpdDsgaG93ZXZlciwKK2V4cGVjdCBzb21lIHBlcmZvcm1hbmNlIGltcGFjdAord2hlbiB1c2luZyBpbnRlZ3JpdHkgY2hlY2tpbmcgb3IgZW5jcnlwdGlvbi4KK1NpbWlsYXIgc3VwcG9ydCBmb3Igb3RoZXIgZm9ybXMgb2YgY3J5cHRvZ3JhcGhpYyBzZWN1cml0eSAoc3VjaCBhcyBsaXBrZXkgYW5kIFNQS00zKQoraXMgYWxzbyBhdmFpbGFibGUuCisuUAorVGhlIE5GUyB2ZXJzaW9uIDQgcHJvdG9jb2wgYWxsb3dzCitjbGllbnRzIGFuZCBzZXJ2ZXJzIHRvIG5lZ290aWF0ZSBhbW9uZyBtdWx0aXBsZSBzZWN1cml0eSBmbGF2b3JzCitkdXJpbmcgbW91bnQgcHJvY2Vzc2luZy4KK0hvd2V2ZXIsIExpbnV4IGRvZXMgbm90IHlldCBpbXBsZW1lbnQgc3VjaCBuZWdvdGlhdGlvbi4KK1RoZSBMaW51eCBjbGllbnQgc3BlY2lmaWVzIGEgc2luZ2xlIHNlY3VyaXR5IGZsYXZvciBhdCBtb3VudCB0aW1lCit3aGljaCByZW1haW5zIGluIGVmZmVjdCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBtb3VudC4KK0lmIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZsYXZvciwKK3RoZSBpbml0aWFsIG1vdW50IHJlcXVlc3QgaXMgcmVqZWN0ZWQgYnkgdGhlIHNlcnZlci4KKy5TUyAiVXNpbmcgbm9uLXByaXZpbGVnZWQgc291cmNlIHBvcnRzIgorTkZTIGNsaWVudHMgdXN1YWxseSBjb21tdW5pY2F0ZSB3aXRoIE5GUyBzZXJ2ZXJzIHZpYSBuZXR3b3JrIHNvY2tldHMuCitFYWNoIGVuZCBvZiBhIHNvY2tldCBpcyBhc3NpZ25lZCBhIHBvcnQgdmFsdWUsIHdoaWNoIGlzIHNpbXBseSBhIG51bWJlcgorYmV0d2VlbiAxIGFuZCA2NTUzNSB0aGF0IGRpc3Rpbmd1aXNoZXMgc29ja2V0IGVuZHBvaW50cyBhdCB0aGUgc2FtZQorSVAgYWRkcmVzcy4KK0Egc29ja2V0IGlzIHVuaXF1ZWx5IGRlZmluZWQgYnkgYSB0dXBsZSB0aGF0IGluY2x1ZGVzIHRoZSB0cmFuc3BvcnQKK3Byb3RvY29sIChUQ1Agb3IgVURQKSBhbmQgdGhlIHBvcnQgdmFsdWVzIGFuZCBJUCBhZGRyZXNzZXMgb2YgYm90aAorZW5kcG9pbnRzLgorLlAKK1RoZSBORlMgY2xpZW50IGNhbiBjaG9vc2UgYW55IHNvdXJjZSBwb3J0IHZhbHVlIGZvciBpdHMgc29ja2V0cywKK2J1dCB1c3VhbGx5IGNob29zZXMgYQorLkkgcHJpdmlsZWdlZAorcG9ydC4KK0EgcHJpdmlsZWdlZCBwb3J0IGlzIGEgcG9ydCB2YWx1ZSBsZXNzIHRoYW4gMTAyNC4KK09ubHkgYSBwcm9jZXNzIHdpdGggcm9vdCBwcml2aWxlZ2VzIG1heSBjcmVhdGUgYSBzb2NrZXQKK3dpdGggYSBwcml2aWxlZ2VkIHNvdXJjZSBwb3J0LgorLlAKK1RoZSBleGFjdCByYW5nZSBvZiBwcml2aWxlZ2VkIHNvdXJjZSBwb3J0cyB0aGF0IGNhbiBiZSBjaG9zZW4gaXMKK3NldCBieSBhIHBhaXIgb2Ygc3lzY3RscyB0byBhdm9pZCBjaG9vc2luZyBhIHdlbGwta25vd24gcG9ydCwgc3VjaCBhcwordGhlIHBvcnQgdXNlZCBieSBzc2guCitUaGlzIG1lYW5zIHRoZSBudW1iZXIgb2Ygc291cmNlIHBvcnRzIGF2YWlsYWJsZSBmb3IgdGhlIE5GUyBjbGllbnQsCithbmQgdGhlcmVmb3JlIHRoZSBudW1iZXIgb2Ygc29ja2V0IGNvbm5lY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQKK2F0IHRoZSBzYW1lIHRpbWUsCitpcyBwcmFjdGljYWxseSBsaW1pdGVkIHRvIG9ubHkgYSBmZXcgaHVuZHJlZC4KKy5QCitBcyBkZXNjcmliZWQgYWJvdmUsIHRoZSB0cmFkaXRpb25hbCBkZWZhdWx0IE5GUyBhdXRoZW50aWNhdGlvbiBzY2hlbWUsCitrbm93biBhcyBBVVRIX1NZUywgcmVsaWVzIG9uIHNlbmRpbmcgbG9jYWwgVUlEIGFuZCBHSUQgbnVtYmVycyB0byBpZGVudGlmeQordXNlcnMgbWFraW5nIE5GUyByZXF1ZXN0cy4KK0FuIE5GUyBzZXJ2ZXIgYXNzdW1lcyB0aGF0IGlmIGEgY29ubmVjdGlvbiBjb21lcyBmcm9tIGEgcHJpdmlsZWdlZCBwb3J0LAordGhlIFVJRCBhbmQgR0lEIG51bWJlcnMgaW4gdGhlIE5GUyByZXF1ZXN0cyBvbiB0aGlzIGNvbm5lY3Rpb24gaGF2ZSBiZWVuCit2ZXJpZmllZCBieSB0aGUgY2xpZW50J3Mga2VybmVsIG9yIHNvbWUgb3RoZXIgbG9jYWwgYXV0aG9yaXR5LgorVGhpcyBpcyBhbiBlYXN5IHN5c3RlbSB0byBzcG9vZiwgYnV0IG9uIGEgdHJ1c3RlZCBwaHlzaWNhbCBuZXR3b3JrIGJldHdlZW4KK3RydXN0ZWQgaG9zdHMsIGl0IGlzIGVudGlyZWx5IGFkZXF1YXRlLgorLlAKK1JvdWdobHkgc3BlYWtpbmcsIG9uZSBzb2NrZXQgaXMgdXNlZCBmb3IgZWFjaCBORlMgbW91bnQgcG9pbnQuCitJZiBhIGNsaWVudCBjb3VsZCB1c2Ugbm9uLXByaXZpbGVnZWQgc291cmNlIHBvcnRzIGFzIHdlbGwsCit0aGUgbnVtYmVyIG9mIHNvY2tldHMgYWxsb3dlZCwKK2FuZCB0aHVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IG1vdW50IHBvaW50cywKK3dvdWxkIGJlIG11Y2ggbGFyZ2VyLgorLlAKK1VzaW5nIG5vbi1wcml2aWxlZ2VkIHNvdXJjZSBwb3J0cyBtYXkgY29tcHJvbWlzZSBzZXJ2ZXIgc2VjdXJpdHkgc29tZXdoYXQsCitzaW5jZSBhbnkgdXNlciBvbiBBVVRIX1NZUyBtb3VudCBwb2ludHMgY2FuIG5vdyBwcmV0ZW5kIHRvIGJlIGFueSBvdGhlcgord2hlbiBtYWtpbmcgTkZTIHJlcXVlc3RzLgorVGh1cyBORlMgc2VydmVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGJ5IGRlZmF1bHQuCitUaGV5IGV4cGxpY2l0bHkgYWxsb3cgaXQgdXN1YWxseSB2aWEgYW4gZXhwb3J0IG9wdGlvbi4KKy5QCitUbyByZXRhaW4gZ29vZCBzZWN1cml0eSB3aGlsZSBhbGxvd2luZyBhcyBtYW55IG1vdW50IHBvaW50cyBhcyBwb3NzaWJsZSwKK2l0IGlzIGJlc3QgdG8gYWxsb3cgbm9uLXByaXZpbGVnZWQgY2xpZW50IGNvbm5lY3Rpb25zIG9ubHkgaWYgdGhlIHNlcnZlcgorYW5kIGNsaWVudCBib3RoIHJlcXVpcmUgc3Ryb25nIGF1dGhlbnRpY2F0aW9uLCBzdWNoIGFzIEtlcmJlcm9zLgorLlNTICJNb3VudGluZyB0aHJvdWdoIGEgZmlyZXdhbGwiCitBIGZpcmV3YWxsIG1heSByZXNpZGUgYmV0d2VlbiBhbiBORlMgY2xpZW50IGFuZCBzZXJ2ZXIsCitvciB0aGUgY2xpZW50IG9yIHNlcnZlciBtYXkgYmxvY2sgc29tZSBvZiBpdHMgb3duIHBvcnRzIHZpYSBJUAorZmlsdGVyIHJ1bGVzLgorSXQgaXMgc3RpbGwgcG9zc2libGUgdG8gbW91bnQgYW4gTkZTIHNlcnZlciB0aHJvdWdoIGEgZmlyZXdhbGwsCit0aG91Z2ggc29tZSBvZiB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQncyBhdXRvbWF0aWMgc2VydmljZSBlbmRwb2ludCBkaXNjb3ZlcnkgbWVjaGFuaXNtcyBtYXkgbm90IHdvcms7IHRoaXMKK3JlcXVpcmVzIHlvdSB0byBwcm92aWRlIHNwZWNpZmljIGVuZHBvaW50IGRldGFpbHMgdmlhIE5GUyBtb3VudCBvcHRpb25zLgorLlAKK05GUyBzZXJ2ZXJzIG5vcm1hbGx5IHJ1biBhIHBvcnRtYXBwZXIgb3IgcnBjYmluZCBkYWVtb24gdG8gYWR2ZXJ0aXNlCit0aGVpciBzZXJ2aWNlIGVuZHBvaW50cyB0byBjbGllbnRzLiBDbGllbnRzIHVzZSB0aGUgcnBjYmluZCBkYWVtb24gdG8gZGV0ZXJtaW5lOgorLklQCitXaGF0IG5ldHdvcmsgcG9ydCBlYWNoIFJQQy1iYXNlZCBzZXJ2aWNlIGlzIHVzaW5nCisuSVAKK1doYXQgdHJhbnNwb3J0IHByb3RvY29scyBlYWNoIFJQQy1iYXNlZCBzZXJ2aWNlIHN1cHBvcnRzCisuUAorVGhlIHJwY2JpbmQgZGFlbW9uIHVzZXMgYSB3ZWxsLWtub3duIHBvcnQgbnVtYmVyICgxMTEpIHRvIGhlbHAgY2xpZW50cyBmaW5kIGEgc2VydmljZSBlbmRwb2ludC4KK0FsdGhvdWdoIE5GUyBvZnRlbiB1c2VzIGEgc3RhbmRhcmQgcG9ydCBudW1iZXIgKDIwNDkpLAorYXV4aWxpYXJ5IHNlcnZpY2VzIHN1Y2ggYXMgdGhlIE5MTSBzZXJ2aWNlIGNhbiBjaG9vc2UKK2FueSB1bnVzZWQgcG9ydCBudW1iZXIgYXQgcmFuZG9tLgorLlAKK0NvbW1vbiBmaXJld2FsbCBjb25maWd1cmF0aW9ucyBibG9jayB0aGUgd2VsbC1rbm93biBycGNiaW5kIHBvcnQuCitJbiB0aGUgYWJzZW5zZSBvZiBhbiBycGNiaW5kIHNlcnZpY2UsCit0aGUgc2VydmVyIGFkbWluaXN0cmF0b3IgZml4ZXMgdGhlIHBvcnQgbnVtYmVyCitvZiBORlMtcmVsYXRlZCBzZXJ2aWNlcyBzbyB0aGF0IHRoZSBmaXJld2FsbAorY2FuIGFsbG93IGFjY2VzcyB0byBzcGVjaWZpYyBORlMgc2VydmljZSBwb3J0cy4KK0NsaWVudCBhZG1pbmlzdHJhdG9ycyB0aGVuIHNwZWNpZnkgdGhlIHBvcnQgbnVtYmVyCitmb3IgdGhlIG1vdW50ZCBzZXJ2aWNlIHZpYSB0aGUKKy5CUiBtb3VudCAoOCkKK2NvbW1hbmQncworLkIgbW91bnRwb3J0CitvcHRpb24uCitJdCBtYXkgYWxzbyBiZSBuZWNlc3NhcnkgdG8gZW5mb3JjZSB0aGUgdXNlIG9mIFRDUCBvciBVRFAKK2lmIHRoZSBmaXJld2FsbCBibG9ja3Mgb25lIG9mIHRob3NlIHRyYW5zcG9ydHMuCisuU1MgIk5GUyBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKK1NvbGFyaXMgYWxsb3dzIE5GUyB2ZXJzaW9uIDMgY2xpZW50cyBkaXJlY3QgYWNjZXNzCit0byBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBzdG9yZWQgaW4gaXRzIGxvY2FsIGZpbGUgc3lzdGVtcy4KK1RoaXMgcHJvcHJpZXRhcnkgc2lkZWJhbmQgcHJvdG9jb2wsIGtub3duIGFzIE5GU0FDTCwKK3Byb3ZpZGVzIHJpY2hlciBhY2Nlc3MgY29udHJvbCB0aGFuIG1vZGUgYml0cy4KK0xpbnV4IGltcGxlbWVudHMgdGhpcyBwcm90b2NvbAorZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyBORlMgaW1wbGVtZW50YXRpb24uCitUaGUgTkZTQUNMIHByb3RvY29sIG5ldmVyIGJlY2FtZSBhIHN0YW5kYXJkIHBhcnQKK29mIHRoZSBORlMgdmVyc2lvbiAzIHNwZWNpZmljYXRpb24sIGhvd2V2ZXIuCisuUAorVGhlIE5GUyB2ZXJzaW9uIDQgc3BlY2lmaWNhdGlvbiBtYW5kYXRlcyBhIG5ldyB2ZXJzaW9uCitvZiBBY2Nlc3MgQ29udHJvbCBMaXN0cyB0aGF0IGFyZSBzZW1hbnRpY2FsbHkgcmljaGVyIHRoYW4gUE9TSVggQUNMcy4KK05GUyB2ZXJzaW9uIDQgQUNMcyBhcmUgbm90IGZ1bGx5IGNvbXBhdGlibGUgd2l0aCBQT1NJWCBBQ0xzOyBhcyBzdWNoLAorc29tZSB0cmFuc2xhdGlvbiBiZXR3ZWVuIHRoZSB0d28gaXMgcmVxdWlyZWQKK2luIGFuIGVudmlyb25tZW50IHRoYXQgbWl4ZXMgUE9TSVggQUNMcyBhbmQgTkZTIHZlcnNpb24gNC4KKy5TSCBGSUxFUworLlRQIDEuNWkKKy5JIC9ldGMvZnN0YWIKK2ZpbGUgc3lzdGVtIHRhYmxlCisuU0ggQlVHUworVGhlIGdlbmVyaWMKKy5CIHJlbW91bnQKK29wdGlvbiBpcyBub3QgZnVsbHkgc3VwcG9ydGVkLgorR2VuZXJpYyBvcHRpb25zLCBzdWNoIGFzCisuQlIgcncgIiBhbmQgIiBybworY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZQorLkIgcmVtb3VudAorb3B0aW9uLAorYnV0IE5GUy1zcGVjaWZpYyBvcHRpb25zIGFyZSBub3QgYWxsIHN1cHBvcnRlZC4KK1RoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBvciBORlMgdmVyc2lvbgorY2Fubm90IGJlIGNoYW5nZWQgYnkgYSByZW1vdW50LCBmb3IgZXhhbXBsZS4KK1BlcmZvcm1pbmcgYSByZW1vdW50IG9uIGFuIE5GUyBmaWxlIHN5c3RlbSBtb3VudGVkIHdpdGggdGhlCisuQiBub2FjCitvcHRpb24gbWF5IGhhdmUgdW5pbnRlbmRlZCBjb25zZXF1ZW5jZXMuCitUaGUKKy5CIG5vYWMKK29wdGlvbiBpcyBhIG1peHR1cmUgb2YgYSBnZW5lcmljIG9wdGlvbiwKKy5CUiBzeW5jICwKK2FuZCBhbiBORlMtc3BlY2lmaWMgb3B0aW9uCisuQlIgYWN0aW1lbz0wIC4KKy5QCitCZWZvcmUgMi40LjcsIHRoZSBMaW51eCBORlMgY2xpZW50IGRpZCBub3Qgc3VwcG9ydCBORlMgb3ZlciBUQ1AuCisuUAorQmVmb3JlIDIuNC4yMCwgdGhlIExpbnV4IE5GUyBjbGllbnQgdXNlZCBhIGhldXJpc3RpYwordG8gZGV0ZXJtaW5lIHdoZXRoZXIgY2FjaGVkIGZpbGUgZGF0YSB3YXMgc3RpbGwgdmFsaWQKK3JhdGhlciB0aGFuIHVzaW5nIHRoZSBzdGFuZGFyZCBjbG9zZS10by1vcGVuIGNhY2hlIGNvaGVyZW5jeSBtZXRob2QKK2Rlc2NyaWJlZCBhYm92ZS4KKy5QCitTdGFydGluZyB3aXRoIDIuNC4yMiwgdGhlIExpbnV4IE5GUyBjbGllbnQgZW1wbG95cworYSBWYW4gSmFjb2JzZW4tYmFzZWQgUlRUIGVzdGltYXRvciB0byBkZXRlcm1pbmUgcmV0cmFuc21pdAordGltZW91dCB2YWx1ZXMgd2hlbiB1c2luZyBORlMgb3ZlciBVRFAuCisuUAorQmVmb3JlIDIuNi4wLCB0aGUgTGludXggTkZTIGNsaWVudCBkaWQgbm90IHN1cHBvcnQgTkZTIHZlcnNpb24gNC4KKy5QCitCZWZvcmUgMi42LjgsIHRoZSBMaW51eCBORlMgY2xpZW50IHVzZWQgb25seSBzeW5jaHJvbm91cyByZWFkcyBhbmQgd3JpdGVzCit3aGVuIHRoZQorLkJSIHJzaXplICIgYW5kICIgd3NpemUKK3NldHRpbmdzIHdlcmUgc21hbGxlciB0aGFuIHRoZSBzeXN0ZW0ncyBwYWdlIHNpemUuCisuUAorVGhlIExpbnV4IE5GUyBjbGllbnQgZG9lcyBub3QgeWV0IHN1cHBvcnQKK2NlcnRhaW4gb3B0aW9uYWwgZmVhdHVyZXMgb2YgdGhlIE5GUyB2ZXJzaW9uIDQgcHJvdG9jb2wsCitzdWNoIGFzIHNlY3VyaXR5IG5lZ290aWF0aW9uLCBzZXJ2ZXIgcmVmZXJyYWxzLCBhbmQgbmFtZWQgYXR0cmlidXRlcy4KKy5TSCAiU0VFIEFMU08iCisuQlIgZnN0YWIgKDUpLAorLkJSIG1vdW50ICg4KSwKKy5CUiB1bW91bnQgKDgpLAorLkJSIG1vdW50Lm5mcyAoNSksCisuQlIgdW1vdW50Lm5mcyAoNSksCisuQlIgZXhwb3J0cyAoNSksCisuQlIgbmV0Y29uZmlnICg1KSwKKy5CUiBpcHY2ICg3KSwKKy5CUiBuZnNkICg4KSwKKy5CUiBzbS1ub3RpZnkgKDgpLAorLkJSIHJwYy5zdGF0ZCAoOCksCisuQlIgcnBjLmlkbWFwZCAoOCksCisuQlIgcnBjLmdzc2QgKDgpLAorLkJSIHJwYy5zdmNnc3NkICg4KSwKKy5CUiBrZXJiZXJvcyAoMSkKKy5zcAorUkZDIDc2OCBmb3IgdGhlIFVEUCBzcGVjaWZpY2F0aW9uLgorLmJyCitSRkMgNzkzIGZvciB0aGUgVENQIHNwZWNpZmljYXRpb24uCisuYnIKK1JGQyAxMDk0IGZvciB0aGUgTkZTIHZlcnNpb24gMiBzcGVjaWZpY2F0aW9uLgorLmJyCitSRkMgMTgxMyBmb3IgdGhlIE5GUyB2ZXJzaW9uIDMgc3BlY2lmaWNhdGlvbi4KKy5icgorUkZDIDE4MzIgZm9yIHRoZSBYRFIgc3BlY2lmaWNhdGlvbi4KKy5icgorUkZDIDE4MzMgZm9yIHRoZSBSUEMgYmluZCBzcGVjaWZpY2F0aW9uLgorLmJyCitSRkMgMjIwMyBmb3IgdGhlIFJQQ1NFQyBHU1MgQVBJIHByb3RvY29sIHNwZWNpZmljYXRpb24uCisuYnIKK1JGQyAzNTMwIGZvciB0aGUgTkZTIHZlcnNpb24gNCBzcGVjaWZpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25mczRfbW91bnQuaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnM0X21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzNzkyZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnM0X21vdW50LmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBfTElOVVhfTkZTNF9NT1VOVF9ICisjZGVmaW5lIF9MSU5VWF9ORlM0X01PVU5UX0gKKworLyoKKyAqICBsaW51eC9pbmNsdWRlL2xpbnV4L25mczRfbW91bnQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIFRyb25kIE15a2xlYnVzdAorICoKKyAqICBzdHJ1Y3R1cmUgcGFzc2VkIGZyb20gdXNlci1zcGFjZSB0byBrZXJuZWwtc3BhY2UgZHVyaW5nIGFuIG5mc3Y0IG1vdW50CisgKi8KKworLyoKKyAqIFdBUk5JTkchICBEbyBub3QgZGVsZXRlIG9yIGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlc2UgZmllbGRzLiAgSWYKKyAqIGEgbmV3IGZpZWxkIGlzIHJlcXVpcmVkIHRoZW4gYWRkIGl0IHRvIHRoZSBlbmQuICBUaGUgdmVyc2lvbiBmaWVsZAorICogdHJhY2tzIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudC4gIFRoaXMgd2lsbCBlbnN1cmUgc29tZSBtZWFzdXJlIG9mCisgKiBtb3VudC10by1rZXJuZWwgdmVyc2lvbiBjb21wYXRpYmlsaXR5LiAgU29tZSBvZiB0aGVzZSBhcmVuJ3QgdXNlZCB5ZXQKKyAqIGJ1dCBoZXJlIHRoZXkgYXJlIGFueXdheS4KKyAqLworI2RlZmluZSBORlM0X01PVU5UX1ZFUlNJT04JMQorCitzdHJ1Y3QgbmZzX3N0cmluZyB7CisJdW5zaWduZWQgaW50IGxlbjsKKwljb25zdCBjaGFyKiBkYXRhOworfTsKKworc3RydWN0IG5mczRfbW91bnRfZGF0YSB7CisJaW50IHZlcnNpb247CQkJCS8qIDEgKi8KKwlpbnQgZmxhZ3M7CQkJCS8qIDEgKi8KKwlpbnQgcnNpemU7CQkJCS8qIDEgKi8KKwlpbnQgd3NpemU7CQkJCS8qIDEgKi8KKwlpbnQgdGltZW87CQkJCS8qIDEgKi8KKwlpbnQgcmV0cmFuczsJCQkJLyogMSAqLworCWludCBhY3JlZ21pbjsJCQkJLyogMSAqLworCWludCBhY3JlZ21heDsJCQkJLyogMSAqLworCWludCBhY2Rpcm1pbjsJCQkJLyogMSAqLworCWludCBhY2Rpcm1heDsJCQkJLyogMSAqLworCisJLyogc2VlIHRoZSBkZWZpbml0aW9uIG9mICdzdHJ1Y3QgY2xpZW50YWRkcjQnIGluIFJGQzMwMTAgKi8KKwlzdHJ1Y3QgbmZzX3N0cmluZyBjbGllbnRfYWRkcjsJCS8qIDEgKi8KKworCS8qIE1vdW50IHBhdGggKi8KKwlzdHJ1Y3QgbmZzX3N0cmluZyBtbnRfcGF0aDsJCS8qIDEgKi8KKworCS8qIFNlcnZlciBkZXRhaWxzICovCisJc3RydWN0IG5mc19zdHJpbmcgaG9zdG5hbWU7CQkvKiAxICovCisJLyogU2VydmVyIElQIGFkZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgaG9zdF9hZGRybGVuOwkJLyogMSAqLworCXN0cnVjdCBzb2NrYWRkciogaG9zdF9hZGRyOwkJLyogMSAqLworCisJLyogVHJhbnNwb3J0IHByb3RvY29sIHRvIHVzZSAqLworCWludCBwcm90bzsJCQkJLyogMSAqLworCisJLyogUHNldWRvLWZsYXZvdXJzIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb24uIFNlZSBSRkMyNjIzICovCisJaW50IGF1dGhfZmxhdm91cmxlbjsJCQkvKiAxICovCisJaW50ICphdXRoX2ZsYXZvdXJzOwkJCS8qIDEgKi8KK307CisKKy8qIGJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkICovCisvKiBOb3RlOiB0aGUgZmllbGRzIHRoYXQgY29ycmVzcG9uZCB0byBleGlzdGluZyBORlN2Mi92MyBtb3VudCBvcHRpb25zCisgKiAJIHNob3VsZCBtaXJyb3IgdGhlIHZhbHVlcyBmcm9tIGluY2x1ZGUvbGludXgvbmZzX21vdW50LmgKKyAqLworCisjZGVmaW5lIE5GUzRfTU9VTlRfU09GVAkJMHgwMDAxCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9JTlRSCQkweDAwMDIJLyogMSAqLworI2RlZmluZSBORlM0X01PVU5UX05PQ1RPCTB4MDAxMAkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfTk9BQwkJMHgwMDIwCS8qIDEgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9TVFJJQ1RMT0NLCTB4MTAwMAkvKiAxICovCisjZGVmaW5lIE5GUzRfTU9VTlRfVU5TSEFSRUQJMHg4MDAwCS8qIDUgKi8KKyNkZWZpbmUgTkZTNF9NT1VOVF9GTEFHTUFTSwkweEZGRkYKKworaW50IG5mczRtb3VudChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICoqLCBpbnQsIGludCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25mczRtb3VudC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25mczRtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmZhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzNG1vdW50LmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBuZnM0bW91bnQuYyAtLSBMaW51eCBORlMgbW91bnQKKyAqIENvcHlyaWdodCAoQykgMjAwMiBUcm9uZCBNeWtsZWJ1c3QgPHRyb25kLm15a2xlYnVzdEBmeXMudWlvLm5vPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBOb3RlOiB0aGlzIGZpbGUgYmFzZWQgb24gdGhlIG9yaWdpbmFsIG5mc21vdW50LmMKKyAqCisgKiAyMDA2LTA2LTA2IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CisgKiAtIE1vdmVkIHRvIG5mcy11dGlscy91dGlscy9tb3VudCBmcm9tIHV0aWwtbGludXgvbW91bnQuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHJwYy9hdXRoLmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorCisjaWZkZWYgSEFWRV9SUENTVkNfTkZTX1BST1RfSAorI2luY2x1ZGUgPHJwY3N2Yy9uZnNfcHJvdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNkZWZpbmUgbmZzc3RhdCBuZnNfc3RhdAorI2VuZGlmCisKKyNpbmNsdWRlICJwc2V1ZG9mbGF2b3JzLmgiCisjaW5jbHVkZSAibmxzLmgiCisjaW5jbHVkZSAieGNvbW1vbi5oIgorCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJtb3VudF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJuZnM0X21vdW50LmgiCisjaW5jbHVkZSAibmZzX21vdW50LmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisKKyNpZiBkZWZpbmVkKFZBUl9MT0NLX0RJUikKKyNkZWZpbmUgREVGQVVMVF9ESVIgVkFSX0xPQ0tfRElSCisjZWxzZQorI2RlZmluZSBERUZBVUxUX0RJUiAiL3Zhci9sb2NrL3N1YnN5cyIKKyNlbmRpZgorCitleHRlcm4gY2hhciAqcHJvZ25hbWU7CitleHRlcm4gaW50IHZlcmJvc2U7CitleHRlcm4gaW50IHNsb3BweTsKKworY2hhciAqSURNQVBMQ0sgPSBERUZBVUxUX0RJUiAiL3JwY2lkbWFwZCI7CisjZGVmaW5lIGlkbWFwZF9jaGVjaygpIGRvIHsgXAorCWlmIChhY2Nlc3MoSURNQVBMQ0ssIEZfT0spKSB7IFwKKwkJcHJpbnRmKF8oIldhcm5pbmc6IHJwYy5pZG1hcGQgYXBwZWFycyBub3QgdG8gYmUgcnVubmluZy5cbiIgXAorCQkJIiAgICAgICAgIEFsbCB1aWRzIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBub2JvZHkgdWlkLlxuIikpOyBcCisJfSBcCit9IHdoaWxlKDApOworCitjaGFyICpHU1NETENLID0gREVGQVVMVF9ESVIgIi9ycGNnc3NkIjsKKyNkZWZpbmUgZ3NzZF9jaGVjaygpIGRvIHsgXAorCQlpZiAoYWNjZXNzKEdTU0RMQ0ssIEZfT0spKSB7IFwKKwkJCXByaW50ZihfKCJXYXJuaW5nOiBycGMuZ3NzZCBhcHBlYXJzIG5vdCB0byBiZSBydW5uaW5nLlxuIikpOyBcCisJCX0gXAorfSB3aGlsZSgwKTsKKworI2lmbmRlZiBORlNfUE9SVAorI2RlZmluZSBORlNfUE9SVCAyMDQ5CisjZW5kaWYKKworI2RlZmluZSBNQVhfVVNFUl9GTEFWT1VSCTE2CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2VjKGNoYXIgKnNlYywgaW50ICpwc2V1ZG9mbGF2b3VyKQoreworCWludCBpLCBudW1fZmxhdm91ciA9IDA7CisKKwlmb3IgKHNlYyA9IHN0cnRvayhzZWMsICI6Iik7IHNlYzsgc2VjID0gc3RydG9rKE5VTEwsICI6IikpIHsKKwkJaWYgKG51bV9mbGF2b3VyID49IE1BWF9VU0VSX0ZMQVZPVVIpIHsKKwkJCW5mc19lcnJvcihfKCIlczogbWF4aW11bSBudW1iZXIgb2Ygc2VjdXJpdHkgZmxhdm9ycyAiCisJCQkJICAiZXhjZWVkZWQiKSwgcHJvZ25hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGZsYXZfbWFwX3NpemU7IGkrKykgeworCQkJaWYgKHN0cmNtcChzZWMsIGZsYXZfbWFwW2ldLmZsYXZvdXIpID09IDApIHsKKwkJCQlwc2V1ZG9mbGF2b3VyW251bV9mbGF2b3VyKytdID0gZmxhdl9tYXBbaV0uZm51bTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBmbGF2X21hcF9zaXplKSB7CisJCQluZnNfZXJyb3IoXygiJXM6IHVua25vd24gc2VjdXJpdHkgdHlwZSAlc1xuIiksCisJCQkJCXByb2duYW1lLCBzZWMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKCFudW1fZmxhdm91cikKKwkJbmZzX2Vycm9yKF8oIiVzOiBubyBzZWN1cml0eSBmbGF2b3JzIHBhc3NlZCB0byBzZWM9IG9wdGlvbiIpLAorCQkJCXByb2duYW1lKTsKKwlyZXR1cm4gbnVtX2ZsYXZvdXI7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZGV2bmFtZShjaGFyICpob3N0ZGlyLCBjaGFyICoqaG9zdG5hbWUsIGNoYXIgKipkaXJuYW1lKQoreworCWNoYXIgKnM7CisKKwlpZiAoIShzID0gc3RyY2hyKGhvc3RkaXIsICc6JykpKSB7CisJCW5mc19lcnJvcihfKCIlczogZGlyZWN0b3J5IHRvIG1vdW50IG5vdCBpbiBob3N0OmRpciBmb3JtYXQiKSwKKwkJCQlwcm9nbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJKmhvc3RuYW1lID0gaG9zdGRpcjsKKwkqZGlybmFtZSA9IHMgKyAxOworCSpzID0gJ1wwJzsKKwkvKiBJZ25vcmUgYWxsIGJ1dCBmaXJzdCBob3N0bmFtZSBpbiByZXBsaWNhdGVkIG1vdW50cworCSAgIHVudGlsIHRoZXkgY2FuIGJlIGZ1bGx5IHN1cHBvcnRlZC4gKG1hY2tAc2dpLmNvbSkgKi8KKwlpZiAoKHMgPSBzdHJjaHIoaG9zdGRpciwgJywnKSkpIHsKKwkJKnMgPSAnXDAnOworCQluZnNfZXJyb3IoXygiJXM6IHdhcm5pbmc6IG11bHRpcGxlIGhvc3RuYW1lcyBub3Qgc3VwcG9ydGVkIiksCisJCQkJcHJvZ25hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWxsX2lwdjRfc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcikKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAoaW5ldF9hdG9uKGhvc3RuYW1lLCAmYWRkci0+c2luX2FkZHIpKQorCQlyZXR1cm4gMDsKKwlpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkpID09IE5VTEwpIHsKKwkJbmZzX2Vycm9yKF8oIiVzOiBjYW4ndCBnZXQgYWRkcmVzcyBmb3IgJXNcbiIpLAorCQkJCXByb2duYW1lLCBob3N0bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGhwLT5oX2xlbmd0aCA+IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKwkJbmZzX2Vycm9yKF8oIiVzOiBnb3QgYmFkIGhwLT5oX2xlbmd0aCIpLCBwcm9nbmFtZSk7CisJCWhwLT5oX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJfQorCW1lbWNweSgmYWRkci0+c2luX2FkZHIsIGhwLT5oX2FkZHIsIGhwLT5oX2xlbmd0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X215X2lwdjRhZGRyKGNoYXIgKmlwX2FkZHIsIGludCBsZW4pCit7CisJY2hhciBteW5hbWVbMTAyNF07CisJc3RydWN0IHNvY2thZGRyX2luIG15YWRkcjsKKworCWlmIChnZXRob3N0bmFtZShteW5hbWUsIHNpemVvZihteW5hbWUpKSkgeworCQluZnNfZXJyb3IoXygiJXM6IGNhbid0IGRldGVybWluZSBjbGllbnQgYWRkcmVzc1xuIiksCisJCQkJcHJvZ25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChmaWxsX2lwdjRfc29ja2FkZHIobXluYW1lLCAmbXlhZGRyKSkKKwkJcmV0dXJuIC0xOworCXNucHJpbnRmKGlwX2FkZHIsIGxlbiwgIiVzIiwgaW5ldF9udG9hKG15YWRkci5zaW5fYWRkcikpOworCWlwX2FkZHJbbGVuLTFdID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KKworaW50IG5mczRtb3VudChjb25zdCBjaGFyICpzcGVjLCBjb25zdCBjaGFyICpub2RlLCBpbnQgZmxhZ3MsCisJICAgICAgY2hhciAqKmV4dHJhX29wdHMsIGludCBmYWtlLCBpbnQgcnVubmluZ19iZykKK3sKKwlzdGF0aWMgc3RydWN0IG5mczRfbW91bnRfZGF0YSBkYXRhOworCXN0YXRpYyBjaGFyIGhvc3RkaXJbMTAyNF07CisJc3RhdGljIGNoYXIgaXBfYWRkclsxNl0gPSAiMTI3LjAuMC4xIjsKKwlzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcl9hZGRyLCBjbGllbnRfYWRkcjsKKwlzdGF0aWMgaW50IHBzZXVkb2ZsYXZvdXJbTUFYX1VTRVJfRkxBVk9VUl07CisJaW50IG51bV9mbGF2b3VyID0gMDsKKwlpbnQgaXBfYWRkcl9pbl9vcHRzID0gMDsKKworCWNoYXIgKmhvc3RuYW1lLCAqZGlybmFtZSwgKm9sZF9vcHRzOworCWNoYXIgbmV3X29wdHNbMTAyNF07CisJY2hhciAqb3B0LCAqb3B0ZXE7CisJY2hhciAqczsKKwlpbnQgdmFsOworCWludCBiZywgc29mdCwgaW50cjsKKwlpbnQgbm9jdG8sIG5vYWMsIHVuc2hhcmVkOworCWludCByZXRyeTsKKwlpbnQgcmV0dmFsID0gRVhfRkFJTDsKKwl0aW1lX3QgdGltZW91dCwgdDsKKworCWlmIChzdHJsZW4oc3BlYykgPj0gc2l6ZW9mKGhvc3RkaXIpKSB7CisJCW5mc19lcnJvcihfKCIlczogZXhjZXNzaXZlbHkgbG9uZyBob3N0OmRpciBhcmd1bWVudFxuIiksCisJCQkJcHJvZ25hbWUpOworCQlnb3RvIGZhaWw7CisJfQorCXN0cmNweShob3N0ZGlyLCBzcGVjKTsKKwlpZiAocGFyc2VfZGV2bmFtZShob3N0ZGlyLCAmaG9zdG5hbWUsICZkaXJuYW1lKSkKKwkJZ290byBmYWlsOworCisJaWYgKGZpbGxfaXB2NF9zb2NrYWRkcihob3N0bmFtZSwgJnNlcnZlcl9hZGRyKSkKKwkJZ290byBmYWlsOworCWlmIChnZXRfbXlfaXB2NGFkZHIoaXBfYWRkciwgc2l6ZW9mKGlwX2FkZHIpKSkKKwkJZ290byBmYWlsOworCisJLyogYWRkIElQIGFkZHJlc3MgdG8gbXRhYiBvcHRpb25zIGZvciB1c2Ugd2hlbiB1bm1vdW50aW5nICovCisJcyA9IGluZXRfbnRvYShzZXJ2ZXJfYWRkci5zaW5fYWRkcik7CisJb2xkX29wdHMgPSAqZXh0cmFfb3B0czsKKwlpZiAoIW9sZF9vcHRzKQorCQlvbGRfb3B0cyA9ICIiOworCWlmIChzdHJsZW4ob2xkX29wdHMpICsgc3RybGVuKHMpICsgMTAgPj0gc2l6ZW9mKG5ld19vcHRzKSkgeworCQluZnNfZXJyb3IoXygiJXM6IGV4Y2Vzc2l2ZWx5IGxvbmcgb3B0aW9uIGFyZ3VtZW50XG4iKSwKKwkJCQlwcm9nbmFtZSk7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKHJ1bm5pbmdfYmcpCisJCXN0cm5jcHkobmV3X29wdHMsIG9sZF9vcHRzLCBzaXplb2YobmV3X29wdHMpKTsKKwllbHNlCisJCXNucHJpbnRmKG5ld19vcHRzLCBzaXplb2YobmV3X29wdHMpLCAiJXMlc2FkZHI9JXMiLAorCQkJIG9sZF9vcHRzLCAqb2xkX29wdHMgPyAiLCIgOiAiIiwgcyk7CisJKmV4dHJhX29wdHMgPSB4c3RyZHVwKG5ld19vcHRzKTsKKworCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMuCisJICogcnNpemUvd3NpemUgYW5kIHRpbWVvIGFyZSBsZWZ0IDAgaW4gb3JkZXIgdG8KKwkgKiBsZXQgdGhlIGtlcm5lbCBkZWNpZGUuCisJICovCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCWRhdGEucmV0cmFucwk9IDM7CisJZGF0YS5hY3JlZ21pbgk9IDM7CisJZGF0YS5hY3JlZ21heAk9IDYwOworCWRhdGEuYWNkaXJtaW4JPSAzMDsKKwlkYXRhLmFjZGlybWF4CT0gNjA7CisJZGF0YS5wcm90bwk9IElQUFJPVE9fVENQOworCisJYmcgPSAwOworCXNvZnQgPSAwOworCWludHIgPSBORlM0X01PVU5UX0lOVFI7CisJbm9jdG8gPSAwOworCW5vYWMgPSAwOworCXVuc2hhcmVkID0gMDsKKwlyZXRyeSA9IC0xOworCisJLyoKKwkgKiBORlN2NCBzcGVjaWZpZXMgdGhhdCB0aGUgZGVmYXVsdCBwb3J0IHNob3VsZCBiZSAyMDQ5CisJICovCisJc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhORlNfUE9SVCk7CisKKwkvKiBwYXJzZSBvcHRpb25zICovCisKKwlmb3IgKG9wdCA9IHN0cnRvayhvbGRfb3B0cywgIiwiKTsgb3B0OyBvcHQgPSBzdHJ0b2soTlVMTCwgIiwiKSkgeworCQlpZiAoKG9wdGVxID0gc3RyY2hyKG9wdCwgJz0nKSkpIHsKKwkJCXZhbCA9IGF0b2kob3B0ZXEgKyAxKTsJCisJCQkqb3B0ZXEgPSAnXDAnOworCQkJaWYgKCFzdHJjbXAob3B0LCAicnNpemUiKSkKKwkJCQlkYXRhLnJzaXplID0gdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJ3c2l6ZSIpKQorCQkJCWRhdGEud3NpemUgPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInRpbWVvIikpCisJCQkJZGF0YS50aW1lbyA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAicmV0cmFucyIpKQorCQkJCWRhdGEucmV0cmFucyA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWNyZWdtaW4iKSkKKwkJCQlkYXRhLmFjcmVnbWluID0gdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3JlZ21heCIpKQorCQkJCWRhdGEuYWNyZWdtYXggPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjZGlybWluIikpCisJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWNkaXJtYXgiKSkKKwkJCQlkYXRhLmFjZGlybWF4ID0gdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY3RpbWVvIikpIHsKKwkJCQlkYXRhLmFjcmVnbWluID0gdmFsOworCQkJCWRhdGEuYWNyZWdtYXggPSB2YWw7CisJCQkJZGF0YS5hY2Rpcm1pbiA9IHZhbDsKKwkJCQlkYXRhLmFjZGlybWF4ID0gdmFsOworCQkJfQorCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZXRyeSIpKQorCQkJCXJldHJ5ID0gdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJwb3J0IikpCisJCQkJc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyh2YWwpOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJwcm90byIpKSB7CisJCQkJaWYgKCFzdHJuY21wKG9wdGVxKzEsICJ0Y3AiLCAzKSkKKwkJCQkJZGF0YS5wcm90byA9IElQUFJPVE9fVENQOworCQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdGVxKzEsICJ1ZHAiLCAzKSkKKwkJCQkJZGF0YS5wcm90byA9IElQUFJPVE9fVURQOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKF8oIldhcm5pbmc6IFVucmVjb2duaXplZCBwcm90bz0gb3B0aW9uLlxuIikpOworCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgImNsaWVudGFkZHIiKSkgeworCQkJCWlmIChzdHJsZW4ob3B0ZXErMSkgPj0gc2l6ZW9mKGlwX2FkZHIpKQorCQkJCQlwcmludGYoXygiSW52YWxpZCBjbGllbnQgYWRkcmVzcyAlcyIpLAorCQkJCQkJCQlvcHRlcSsxKTsKKwkJCQlzdHJuY3B5KGlwX2FkZHIsb3B0ZXErMSwgc2l6ZW9mKGlwX2FkZHIpKTsKKwkJCQlpcF9hZGRyW3NpemVvZihpcF9hZGRyKS0xXSA9ICdcMCc7CisJCQkJaXBfYWRkcl9pbl9vcHRzID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzZWMiKSkgeworCQkJCW51bV9mbGF2b3VyID0gcGFyc2Vfc2VjKG9wdGVxKzEsIHBzZXVkb2ZsYXZvdXIpOworCQkJCWlmICghbnVtX2ZsYXZvdXIpCisJCQkJCWdvdG8gZmFpbDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhZGRyIikgfHwgc2xvcHB5KSB7CisJCQkJLyogaWdub3JlICovOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoXygidW5rbm93biBuZnMgbW91bnQgcGFyYW1ldGVyOiAiCisJCQkJCSAiJXM9JWRcbiIpLCBvcHQsIHZhbCk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFsID0gMTsKKwkJCWlmICghc3RybmNtcChvcHQsICJubyIsIDIpKSB7CisJCQkJdmFsID0gMDsKKwkJCQlvcHQgKz0gMjsKKwkJCX0KKwkJCWlmICghc3RyY21wKG9wdCwgImJnIikpCisJCQkJYmcgPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImZnIikpCisJCQkJYmcgPSAhdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzb2Z0IikpCisJCQkJc29mdCA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiaGFyZCIpKQorCQkJCXNvZnQgPSAhdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJpbnRyIikpCisJCQkJaW50ciA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiY3RvIikpCisJCQkJbm9jdG8gPSAhdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhYyIpKQorCQkJCW5vYWMgPSAhdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzaGFyZWNhY2hlIikpCisJCQkJdW5zaGFyZWQgPSAhdmFsOworCQkJZWxzZSBpZiAoIXNsb3BweSkgeworCQkJCXByaW50ZihfKCJ1bmtub3duIG5mcyBtb3VudCBvcHRpb246ICVzJXNcbiIpLAorCQkJCQkJdmFsID8gIiIgOiAibm8iLCBvcHQpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCX0KKworCS8qIGlmIHJldHJ5IGlzIHN0aWxsIC0xLCB0aGVuIGl0IHdhc24ndCBzZXQgdmlhIGFuIG9wdGlvbiAqLworCWlmIChyZXRyeSA9PSAtMSkgeworCQlpZiAoYmcpCisJCQlyZXRyeSA9IDEwMDAwOwkvKiAxMDAwMCBtaW5zID09IH4xIHdlZWsgKi8KKwkJZWxzZQorCQkJcmV0cnkgPSAyOwkvKiAyIG1pbiBkZWZhdWx0IG9uIGZnIG1vdW50cyAqLworCX0KKworCWRhdGEuZmxhZ3MgPSAoc29mdCA/IE5GUzRfTU9VTlRfU09GVCA6IDApCisJCXwgKGludHIgPyBORlM0X01PVU5UX0lOVFIgOiAwKQorCQl8IChub2N0byA/IE5GUzRfTU9VTlRfTk9DVE8gOiAwKQorCQl8IChub2FjID8gTkZTNF9NT1VOVF9OT0FDIDogMCkKKwkJfCAodW5zaGFyZWQgPyBORlM0X01PVU5UX1VOU0hBUkVEIDogMCk7CisKKwkvKgorCSAqIEdpdmUgYSB3YXJuaW5nIGlmIHRoZSBycGMuaWRtYXBkIGRhZW1vbiBpcyBub3QgcnVubmluZworCSAqLworI2lmIDAKKwkvKiBXZSBzaG91bGRuJ3QgaGF2ZSB0aGVzZSBjaGVja3MgYXMgbm90aGluZyBpbiB0aGlzIHBhY2thZ2UKKwkgKiBjcmVhdGVzIHRoZSBmaWxlcyB0aGF0IGFyZSBjaGVja2VkCisJICovCisJaWRtYXBkX2NoZWNrKCk7CisKKwlpZiAobnVtX2ZsYXZvdXIgPT0gMCkKKwkJcHNldWRvZmxhdm91cltudW1fZmxhdm91cisrXSA9IEFVVEhfVU5JWDsKKwllbHNlIHsKKwkJLyoKKwkJICogZGl0dG8gd2l0aCBycGMuZ3NzZCBkYWVtb24KKwkJICovCisJCWdzc2RfY2hlY2soKTsKKwl9CisjZW5kaWYKKwlkYXRhLmF1dGhfZmxhdm91cmxlbiA9IG51bV9mbGF2b3VyOworCWRhdGEuYXV0aF9mbGF2b3VycyA9IHBzZXVkb2ZsYXZvdXI7CisKKwlkYXRhLmNsaWVudF9hZGRyLmRhdGEgPSBpcF9hZGRyOworCWRhdGEuY2xpZW50X2FkZHIubGVuID0gc3RybGVuKGlwX2FkZHIpOworCisJZGF0YS5tbnRfcGF0aC5kYXRhID0gZGlybmFtZTsKKwlkYXRhLm1udF9wYXRoLmxlbiA9IHN0cmxlbihkaXJuYW1lKTsKKworCWRhdGEuaG9zdG5hbWUuZGF0YSA9IGhvc3RuYW1lOworCWRhdGEuaG9zdG5hbWUubGVuID0gc3RybGVuKGhvc3RuYW1lKTsKKwlkYXRhLmhvc3RfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2VydmVyX2FkZHI7CisJZGF0YS5ob3N0X2FkZHJsZW4gPSBzaXplb2Yoc2VydmVyX2FkZHIpOworCisjaWZkZWYgTkZTX01PVU5UX0RFQlVHCisJcHJpbnRmKF8oInJzaXplID0gJWQsIHdzaXplID0gJWQsIHRpbWVvID0gJWQsIHJldHJhbnMgPSAlZFxuIiksCisJICAgICAgIGRhdGEucnNpemUsIGRhdGEud3NpemUsIGRhdGEudGltZW8sIGRhdGEucmV0cmFucyk7CisJcHJpbnRmKF8oImFjcmVnIChtaW4sIG1heCkgPSAoJWQsICVkKSwgYWNkaXIgKG1pbiwgbWF4KSA9ICglZCwgJWQpXG4iKSwKKwkgICAgICAgZGF0YS5hY3JlZ21pbiwgZGF0YS5hY3JlZ21heCwgZGF0YS5hY2Rpcm1pbiwgZGF0YS5hY2Rpcm1heCk7CisJcHJpbnRmKF8oInBvcnQgPSAlZCwgYmcgPSAlZCwgcmV0cnkgPSAlZCwgZmxhZ3MgPSAlLjh4XG4iKSwKKwkgICAgICAgbnRvaHMoc2VydmVyX2FkZHIuc2luX3BvcnQpLCBiZywgcmV0cnksIGRhdGEuZmxhZ3MpOworCXByaW50ZihfKCJzb2Z0ID0gJWQsIGludHIgPSAlZCwgbm9jdG8gPSAlZCwgbm9hYyA9ICVkLCAiCisJICAgICAgICJub3NoYXJlY2FjaGUgPSAlZFxuIiksCisJICAgICAgIChkYXRhLmZsYWdzICYgTkZTNF9NT1VOVF9TT0ZUKSAhPSAwLAorCSAgICAgICAoZGF0YS5mbGFncyAmIE5GUzRfTU9VTlRfSU5UUikgIT0gMCwKKwkgICAgICAgKGRhdGEuZmxhZ3MgJiBORlM0X01PVU5UX05PQ1RPKSAhPSAwLAorCSAgICAgICAoZGF0YS5mbGFncyAmIE5GUzRfTU9VTlRfTk9BQykgIT0gMCwKKwkgICAgICAgKGRhdGEuZmxhZ3MgJiBORlM0X01PVU5UX1VOU0hBUkVEKSAhPSAwKTsKKworCWlmIChudW1fZmxhdm91ciA+IDApIHsKKwkJaW50IHBmX2NudCwgaTsKKworCQlwcmludGYoXygic2VjID0gIikpOworCQlmb3IgKHBmX2NudCA9IDA7IHBmX2NudCA8IG51bV9mbGF2b3VyOyBwZl9jbnQrKykgeworCQkJZm9yIChpID0gMDsgaSA8IGZsYXZfbWFwX3NpemU7IGkrKykgeworCQkJCWlmIChmbGF2X21hcFtpXS5mbnVtID09IHBzZXVkb2ZsYXZvdXJbcGZfY250XSkgeworCQkJCQlwcmludGYoIiVzIiwgZmxhdl9tYXBbaV0uZmxhdm91cik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXByaW50ZigiJXMiLCAocGZfY250IDwgbnVtX2ZsYXZvdXItMSkgPyAiOiIgOiAiXG4iKTsKKwkJfQorCX0KKwlwcmludGYoXygicHJvdG8gPSAlc1xuIiksIChkYXRhLnByb3RvID09IElQUFJPVE9fVENQKSA/IF8oInRjcCIpIDogXygidWRwIikpOworI2VuZGlmCisKKwl0aW1lb3V0ID0gdGltZShOVUxMKSArIDYwICogcmV0cnk7CisJZGF0YS52ZXJzaW9uID0gTkZTNF9NT1VOVF9WRVJTSU9OOworCWZvciAoOzspIHsKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCXByaW50ZihfKCIlczogcGluZ2luZzogcHJvZyAlZCB2ZXJzICVkIHByb3QgJXMgcG9ydCAlZFxuIiksCisJCQkJcHJvZ25hbWUsIE5GU19QUk9HUkFNLCA0LAorCQkJCWRhdGEucHJvdG8gPT0gSVBQUk9UT19VRFAgPyAidWRwIiA6ICJ0Y3AiLAorCQkJCW50b2hzKHNlcnZlcl9hZGRyLnNpbl9wb3J0KSk7CisJCX0KKwkJY2xpZW50X2FkZHIuc2luX2ZhbWlseSA9IDA7CisJCWNsaWVudF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IDA7CisJCWNsbnRfcGluZygmc2VydmVyX2FkZHIsIE5GU19QUk9HUkFNLCA0LCBkYXRhLnByb3RvLCAmY2xpZW50X2FkZHIpOworCQlpZiAocnBjX2NyZWF0ZWVyci5jZl9zdGF0ID09IFJQQ19TVUNDRVNTKSB7CisJCQlpZiAoIWlwX2FkZHJfaW5fb3B0cyAmJgorCQkJICAgIGNsaWVudF9hZGRyLnNpbl9mYW1pbHkgIT0gMCAmJgorCQkJICAgIGNsaWVudF9hZGRyLnNpbl9hZGRyLnNfYWRkciAhPSAwKSB7CisJCQkJc25wcmludGYoaXBfYWRkciwgc2l6ZW9mKGlwX2FkZHIpLCAiJXMiLAorCQkJCQkgaW5ldF9udG9hKGNsaWVudF9hZGRyLnNpbl9hZGRyKSk7CisJCQkJZGF0YS5jbGllbnRfYWRkci5sZW4gPSBzdHJsZW4oaXBfYWRkcik7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmICghYmcpIHsKKwkJCXN3aXRjaChycGNfY3JlYXRlZXJyLmNmX3N0YXQpIHsKKwkJCWNhc2UgUlBDX1RJTUVET1VUOgorCQkJCWJyZWFrOworCQkJY2FzZSBSUENfU1lTVEVNRVJST1I6CisJCQkJaWYgKGVycm5vID09IEVUSU1FRE9VVCkKKwkJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJwY19tb3VudF9lcnJvcnMoaG9zdG5hbWUsIDAsIGJnKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKworCQlpZiAoYmcgJiYgIXJ1bm5pbmdfYmcpIHsKKwkJCWlmIChyZXRyeSA+IDApCisJCQkJcmV0dmFsID0gRVhfQkc7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQl0ID0gdGltZShOVUxMKTsKKwkJaWYgKHQgPj0gdGltZW91dCkgeworCQkJcnBjX21vdW50X2Vycm9ycyhob3N0bmFtZSwgMCwgYmcpOworCQkJZ290byBmYWlsOworCQl9CisJCXJwY19tb3VudF9lcnJvcnMoaG9zdG5hbWUsIDEsIGJnKTsKKwkJY29udGludWU7CisJfQorCisJaWYgKCFmYWtlKSB7CisJCWlmIChtb3VudChzcGVjLCBub2RlLCAibmZzNCIsCisJCQkJZmxhZ3MgJiB+KE1TX1VTRVJ8TVNfVVNFUlMpLCAmZGF0YSkpIHsKKwkJCW1vdW50X2Vycm9yKHNwZWMsIG5vZGUsIGVycm5vKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXJldHVybiBFWF9TVUNDRVNTOworCitmYWlsOgorCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzX21vdW50LmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzX21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlY2ZiMQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnNfbW91bnQuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogV2Ugd2FudCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgbW91bnQgb24gb2xkIGtlcm5lbHMgaW4gc3VjaCBhIHdheQorICogdGhhdCB0aGUgYmluYXJ5IHdpbGwgd29yayB3ZWxsIG9uIG1vcmUgcmVjZW50IGtlcm5lbHMuCisgKiBUaHVzLCBpZiBuZWNlc3Nhcnkgd2UgdGVhY2ggbmZzbW91bnQuYyB0aGUgc3RydWN0dXJlIG9mIG5ldyBmaWVsZHMKKyAqIHRoYXQgd2lsbCBjb21lIGxhdGVyLgorICoKKyAqIE1vcmVvdmVyLCB0aGUgbmV3IGtlcm5lbCBpbmNsdWRlcyBjb25mbGljdCB3aXRoIGdsaWJjIGluY2x1ZGVzCisgKiBzbyBpdCBpcyBlYXNpZXN0IHRvIGlnbm9yZSB0aGUga2VybmVsIGFsdG9nZXRoZXIgKGF0IGNvbXBpbGUgdGltZSkuCisgKi8KKworI2lmbmRlZiBfTkZTX1VUSUxTX01PVU5UX05GU19NT1VOVF9ICisjZGVmaW5lIF9ORlNfVVRJTFNfTU9VTlRfTkZTX01PVU5UX0gKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBORlNfTU9VTlRfVkVSU0lPTgk2CisjZGVmaW5lIE5GU19NQVhfQ09OVEVYVF9MRU4JMjU2CisKK3N0cnVjdCBuZnMyX2ZoIHsKKyAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgZGF0YVszMl07Cit9Oworc3RydWN0IG5mczNfZmggeworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICBzaXplOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICBkYXRhWzY0XTsKK307CisKK3N0cnVjdCBuZnNfbW91bnRfZGF0YSB7CisJaW50CQl2ZXJzaW9uOwkJLyogMSAqLworCWludAkJZmQ7CQkJLyogMSAqLworCXN0cnVjdCBuZnMyX2ZoCW9sZF9yb290OwkJLyogMSAqLworCWludAkJZmxhZ3M7CQkJLyogMSAqLworCWludAkJcnNpemU7CQkJLyogMSAqLworCWludAkJd3NpemU7CQkJLyogMSAqLworCWludAkJdGltZW87CQkJLyogMSAqLworCWludAkJcmV0cmFuczsJCS8qIDEgKi8KKwlpbnQJCWFjcmVnbWluOwkJLyogMSAqLworCWludAkJYWNyZWdtYXg7CQkvKiAxICovCisJaW50CQlhY2Rpcm1pbjsJCS8qIDEgKi8KKwlpbnQJCWFjZGlybWF4OwkJLyogMSAqLworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwkJLyogMSAqLworCWNoYXIJCWhvc3RuYW1lWzI1Nl07CQkvKiAxICovCisJaW50CQluYW1sZW47CQkJLyogMiAqLworCXVuc2lnbmVkIGludAlic2l6ZTsJCQkvKiAzICovCisJc3RydWN0IG5mczNfZmgJcm9vdDsJCQkvKiA0ICovCisJaW50CQlwc2V1ZG9mbGF2b3I7CQkvKiA1ICovCisJY2hhciAgICBjb250ZXh0W05GU19NQVhfQ09OVEVYVF9MRU4gKyAxXTsgLyogNiAqLworCit9OworCisvKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLworCisjZGVmaW5lIE5GU19NT1VOVF9TT0ZUCQkweDAwMDEJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfSU5UUgkJMHgwMDAyCS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1NFQ1VSRQkweDAwMDQJLyogMSAqLworI2RlZmluZSBORlNfTU9VTlRfUE9TSVgJCTB4MDAwOAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9OT0NUTwkJMHgwMDEwCS8qIDEgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PQUMJCTB4MDAyMAkvKiAxICovCisjZGVmaW5lIE5GU19NT1VOVF9UQ1AJCTB4MDA0MAkvKiAyICovCisjZGVmaW5lIE5GU19NT1VOVF9WRVIzCQkweDAwODAJLyogMyAqLworI2RlZmluZSBORlNfTU9VTlRfS0VSQkVST1MJMHgwMTAwCS8qIDMgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PTkxNCQkweDAyMDAJLyogMyAqLworI2RlZmluZSBORlNfTU9VTlRfQlJPS0VOX1NVSUQJMHgwNDAwCS8qIDQgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PQUNMICAgICAweDA4MDAgIC8qIDQgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1NFQ0ZMQVZPVVIJMHgyMDAwCS8qIDUgKi8KKyNkZWZpbmUgTkZTX01PVU5UX05PUkRJUlBMVVMJMHg0MDAwCS8qIDUgKi8KKyNkZWZpbmUgTkZTX01PVU5UX1VOU0hBUkVECTB4ODAwMAkvKiA1ICovCisKKy8qIHNlY3VyaXR5IHBzZXVkb2ZsYXZvcnMgKi8KKworI2lmbmRlZiBBVVRIX0dTU19LUkI1CisjZGVmaW5lIEFVVEhfR1NTX0tSQjUJCTM5MDAwMworI2RlZmluZSBBVVRIX0dTU19LUkI1SQkJMzkwMDA0CisjZGVmaW5lIEFVVEhfR1NTX0tSQjVQCQkzOTAwMDUKKyNkZWZpbmUgQVVUSF9HU1NfTEtFWQkJMzkwMDA2CisjZGVmaW5lIEFVVEhfR1NTX0xLRVlJCQkzOTAwMDcKKyNkZWZpbmUgQVVUSF9HU1NfTEtFWVAJCTM5MDAwOAorI2RlZmluZSBBVVRIX0dTU19TUEtNCQkzOTAwMDkKKyNkZWZpbmUgQVVUSF9HU1NfU1BLTUkJCTM5MDAxMAorI2RlZmluZSBBVVRIX0dTU19TUEtNUAkJMzkwMDExCisjZW5kaWYKKworaW50CW5mc21vdW50KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQgLCBjaGFyICoqLCBpbnQsIGludCk7CitpbnQJbmZzdW1vdW50KGludCwgY2hhciAqKik7CisKKyNlbmRpZgkvKiBfTkZTX1VUSUxTX01PVU5UX05GU19NT1VOVF9IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzbW91bnQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnNtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzM1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzbW91bnQuYwpAQCAtMCwwICsxLDg3OSBAQAorLyoKKyAqIG5mc21vdW50LmMgLS0gTGludXggTkZTIG1vdW50CisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgUmljayBTbGFka2V5IDxqcnNAd29ybGQuc3RkLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogV2VkIEZlYiAgOCAxMjo1MTo0OCAxOTk1LCBiaXJvQHlnZ2RyYXNpbC5jb20gKFJvc3MgQmlybyk6IGFsbG93IGFsbCBwb3J0CisgKiBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEZyaSwgOCBNYXIgMTk5NiAxODowMTozOSwgU3dlbiBUaHVlbW1sZXIgPHN3ZW5AdW5pLXBhZGVyYm9ybi5kZT46CisgKiBPbWl0IHRoZSBjYWxsIHRvIGNvbm5lY3QoKSBmb3IgTGludXggdmVyc2lvbiAxLjMuMTEgb3IgbGF0ZXIuCisgKgorICogV2VkIE9jdCAgMSAyMzo1NToyOCAxOTk3OiBEaWNrIFN0cmVlZmxhbmQgPGRpY2tfc3RyZWVmbGFuZEB0YXNraW5nLmNvbT4KKyAqIEltcGxlbWVudGVkIHRoZSAiYmciLCAiZmciIGFuZCAicmV0cnkiIG1vdW50IG9wdGlvbnMgZm9yIE5GUy4KKyAqCisgKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoIGFuZCBUcm9uZCBNeWtsZWJ1c3QgZm9yIG5ldyBORlMgY29kZSwKKyAqIHBsdXMgTkZTdjMgc3R1ZmYuCisgKgorICogMjAwNi0wNi0wNiBBbWl0IEd1ZCA8YWd1ZEByZWRoYXQuY29tPgorICogLSBNb3ZlZCB3aXRoIG1vZGlmY2F0aW9ucyB0byBuZnMtdXRpbHMvdXRpbHMvbW91bnQgZnJvbSB1dGlsLWxpbnV4L21vdW50LgorICovCisKKy8qCisgKiBuZnNtb3VudC5jLHYgMS4xLjEuMSAxOTkzLzExLzE4IDA4OjQwOjUxIGpycyBFeHAKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgorI2luY2x1ZGUgPHJwYy9wbWFwX2NsbnQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisjaW5jbHVkZSAieGNvbW1vbi5oIgorI2luY2x1ZGUgIm1vdW50LmgiCisjaW5jbHVkZSAibmZzX21vdW50LmgiCisjaW5jbHVkZSAibW91bnRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAibmxzLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisjaWZkZWYgSEFWRV9SUENTVkNfTkZTX1BST1RfSAorI2luY2x1ZGUgPHJwY3N2Yy9uZnNfcHJvdC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNkZWZpbmUgbmZzc3RhdCBuZnNfc3RhdAorI2VuZGlmCisKKyNpZm5kZWYgTkZTX1BPUlQKKyNkZWZpbmUgTkZTX1BPUlQgMjA0OQorI2VuZGlmCisjaWZuZGVmIE5GU19GSFNJWkUKKyNkZWZpbmUgTkZTX0ZIU0laRSAzMgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9JTkVUX0FUT04KKyNkZWZpbmUgaW5ldF9hdG9uKGEsYikgKDApCisjZW5kaWYKKwordHlwZWRlZiBkaXJwYXRoIG1udDJhcmdfdDsKK3R5cGVkZWYgZGlycGF0aCBtbnQzYXJnX3Q7Cit0eXBlZGVmIGRpcnBhdGggbW50YXJnX3Q7CisKK3R5cGVkZWYgc3RydWN0IGZoc3RhdHVzICBtbnQycmVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBtb3VudHJlczMgbW50M3Jlc190OwordHlwZWRlZiB1bmlvbiB7CisJbW50MnJlc190IG5mc3YyOworCW1udDNyZXNfdCBuZnN2MzsKK30gbW50cmVzX3Q7CisKK2V4dGVybiBpbnQgbmZzX21vdW50X2RhdGFfdmVyc2lvbjsKK2V4dGVybiBjaGFyICpwcm9nbmFtZTsKK2V4dGVybiBpbnQgdmVyYm9zZTsKK2V4dGVybiBpbnQgc2xvcHB5OworCitzdGF0aWMgaW5saW5lIGVudW0gY2xudF9zdGF0CituZnMzX21vdW50KENMSUVOVCAqY2xudCwgbW50M2FyZ190ICptbnQzYXJnLCBtbnQzcmVzX3QgKm1udDNyZXMpCit7CisJcmV0dXJuIGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0MzX01OVCwKKwkJCSAoeGRycHJvY190KSB4ZHJfZGlycGF0aCwgKGNhZGRyX3QpIG1udDNhcmcsCisJCQkgKHhkcnByb2NfdCkgeGRyX21vdW50cmVzMywgKGNhZGRyX3QpIG1udDNyZXMsCisJCQkgVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBjbG50X3N0YXQKK25mczJfbW91bnQoQ0xJRU5UICpjbG50LCBtbnQyYXJnX3QgKm1udDJhcmcsIG1udDJyZXNfdCAqbW50MnJlcykKK3sKKwlyZXR1cm4gY2xudF9jYWxsKGNsbnQsIE1PVU5UUFJPQ19NTlQsCisJCQkgKHhkcnByb2NfdCkgeGRyX2RpcnBhdGgsIChjYWRkcl90KSBtbnQyYXJnLAorCQkJICh4ZHJwcm9jX3QpIHhkcl9maHN0YXR1cywgKGNhZGRyX3QpIG1udDJyZXMsCisJCQkgVElNRU9VVCk7Cit9CisKK3N0YXRpYyBpbnQKK25mc19jYWxsX21vdW50KGNsbnRfYWRkcl90ICptbnRfc2VydmVyLCBjbG50X2FkZHJfdCAqbmZzX3NlcnZlciwKKwkgICAgICAgbW50YXJnX3QgKm1udGFyZywgbW50cmVzX3QgKm1udHJlcykKK3sKKwlDTElFTlQgKmNsbnQ7CisJZW51bSBjbG50X3N0YXQgc3RhdDsKKwlpbnQgbXNvY2s7CisKKwlpZiAoIXByb2JlX2JvdGhwb3J0cyhtbnRfc2VydmVyLCBuZnNfc2VydmVyKSkKKwkJZ290byBvdXRfYmFkOworCisJY2xudCA9IG1udF9vcGVuY2xudChtbnRfc2VydmVyLCAmbXNvY2spOworCWlmICghY2xudCkKKwkJZ290byBvdXRfYmFkOworCS8qIG1ha2UgcG9pbnRlcnMgaW4geGRyX21vdW50cmVzMyBOVUxMIHNvCisJICogdGhhdCB4ZHJfYXJyYXkgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdXMKKwkgKi8KKwltZW1zZXQobW50cmVzLCAwLCBzaXplb2YoKm1udHJlcykpOworCXN3aXRjaCAobW50X3NlcnZlci0+cG1hcC5wbV92ZXJzKSB7CisJY2FzZSAzOgorCQlzdGF0ID0gbmZzM19tb3VudChjbG50LCBtbnRhcmcsICZtbnRyZXMtPm5mc3YzKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgMToKKwkJc3RhdCA9IG5mczJfbW91bnQoY2xudCwgbW50YXJnLCAmbW50cmVzLT5uZnN2Mik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X2JhZDsKKwl9CisJaWYgKHN0YXQgIT0gUlBDX1NVQ0NFU1MpIHsKKwkJY2xudF9nZXRlcnIoY2xudCwgJnJwY19jcmVhdGVlcnIuY2ZfZXJyb3IpOworCQlycGNfY3JlYXRlZXJyLmNmX3N0YXQgPSBzdGF0OworCX0KKwltbnRfY2xvc2VjbG50KGNsbnQsIG1zb2NrKTsKKwlpZiAoc3RhdCA9PSBSUENfU1VDQ0VTUykKKwkJcmV0dXJuIDE7Cisgb3V0X2JhZDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGFyc2Vfb3B0aW9ucyhjaGFyICpvbGRfb3B0cywgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhLAorCSAgICAgIGludCAqYmcsIGludCAqcmV0cnksIGNsbnRfYWRkcl90ICptbnRfc2VydmVyLAorCSAgICAgIGNsbnRfYWRkcl90ICpuZnNfc2VydmVyLCBjaGFyICpuZXdfb3B0cywgY29uc3QgaW50IG9wdF9zaXplKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqbW50X3NhZGRyID0gJm1udF9zZXJ2ZXItPnNhZGRyOworCXN0cnVjdCBwbWFwICptbnRfcG1hcCA9ICZtbnRfc2VydmVyLT5wbWFwOworCXN0cnVjdCBwbWFwICpuZnNfcG1hcCA9ICZuZnNfc2VydmVyLT5wbWFwOworCWludCBsZW47CisJY2hhciAqb3B0LCAqb3B0ZXEsICpwLCAqb3B0X2IsICp0bXBfb3B0czsKKwljaGFyICptb3VudGhvc3QgPSBOVUxMOworCWNoYXIgY2J1ZlsxMjhdOworCWludCBvcGVuX3F1b3RlID0gMDsKKworCWRhdGEtPmZsYWdzID0gMDsKKwkqYmcgPSAwOworCisJbGVuID0gc3RybGVuKG5ld19vcHRzKTsKKwl0bXBfb3B0cyA9IHhzdHJkdXAob2xkX29wdHMpOworCWZvciAocD10bXBfb3B0cywgb3B0X2I9TlVMTDsgcCAmJiAqcDsgcCsrKSB7CisJCWlmICghb3B0X2IpCisJCQlvcHRfYiA9IHA7CQkvKiBiZWdpbiBvZiB0aGUgb3B0aW9uIGl0ZW0gKi8KKwkJaWYgKCpwID09ICciJykKKwkJCW9wZW5fcXVvdGUgXj0gMTsJLyogcmV2ZXJzZSB0aGUgc3RhdHVzICovCisJCWlmIChvcGVuX3F1b3RlKQorCQkJY29udGludWU7CQkvKiBzdGlsbCBpbiBhIHF1b3RlZCBibG9jayAqLworCQlpZiAoKnAgPT0gJywnKQorCQkJKnAgPSAnXDAnOwkJLyogdGVybWluYXRlIHRoZSBvcHRpb24gaXRlbSAqLworCQlpZiAoKnAgPT0gJ1wwJyB8fCAqKHArMSkgPT0gJ1wwJykgeworCQkJb3B0ID0gb3B0X2I7CQkvKiBvcHQgaXMgdXNlZnVsIG5vdyAqLworCQkJb3B0X2IgPSBOVUxMOworCQl9CisJCWVsc2UKKwkJCWNvbnRpbnVlOwkJLyogc3RpbGwgc29tZXdoZXJlIGluIHRoZSBvcHRpb24gaXRlbSAqLworCisJCWlmIChzdHJsZW4ob3B0KSA+PSBzaXplb2YoY2J1ZikpCisJCQlnb3RvIGJhZF9wYXJhbWV0ZXI7CisJCWlmICgob3B0ZXEgPSBzdHJjaHIob3B0LCAnPScpKSAmJiBpc2RpZ2l0KG9wdGVxWzFdKSkgeworCQkJaW50IHZhbCA9IGF0b2kob3B0ZXEgKyAxKTsJCisJCQkqb3B0ZXEgPSAnXDAnOworCQkJaWYgKCFzdHJjbXAob3B0LCAicnNpemUiKSkKKwkJCQlkYXRhLT5yc2l6ZSA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAid3NpemUiKSkKKwkJCQlkYXRhLT53c2l6ZSA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGltZW8iKSkKKwkJCQlkYXRhLT50aW1lbyA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAicmV0cmFucyIpKQorCQkJCWRhdGEtPnJldHJhbnMgPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjcmVnbWluIikpCisJCQkJZGF0YS0+YWNyZWdtaW4gPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjcmVnbWF4IikpCisJCQkJZGF0YS0+YWNyZWdtYXggPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjZGlybWluIikpCisJCQkJZGF0YS0+YWNkaXJtaW4gPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjZGlybWF4IikpCisJCQkJZGF0YS0+YWNkaXJtYXggPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjdGltZW8iKSkgeworCQkJCWRhdGEtPmFjcmVnbWluID0gdmFsOworCQkJCWRhdGEtPmFjcmVnbWF4ID0gdmFsOworCQkJCWRhdGEtPmFjZGlybWluID0gdmFsOworCQkJCWRhdGEtPmFjZGlybWF4ID0gdmFsOworCQkJfQorCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZXRyeSIpKQorCQkJCSpyZXRyeSA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAicG9ydCIpKQorCQkJCW5mc19wbWFwLT5wbV9wb3J0ID0gdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHBvcnQiKSkKKwkJCSAgICAgICAgbW50X3BtYXAtPnBtX3BvcnQgPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50cHJvZyIpKQorCQkJCW1udF9wbWFwLT5wbV9wcm9nID0gdmFsOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudHZlcnMiKSkKKwkJCQltbnRfcG1hcC0+cG1fdmVycyA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibW91bnRob3N0IikpCisJCQkJbW91bnRob3N0PXhzdHJuZHVwKG9wdGVxKzEsIHN0cmNzcG4ob3B0ZXErMSwiIFx0XG5cciwiKSk7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5mc3Byb2ciKSkKKwkJCQluZnNfcG1hcC0+cG1fcHJvZyA9IHZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibmZzdmVycyIpIHx8CisJCQkJICFzdHJjbXAob3B0LCAidmVycyIpKSB7CisJCQkJbmZzX3BtYXAtPnBtX3ZlcnMgPSB2YWw7CisJCQkJb3B0ID0gIm5mc3ZlcnMiOworI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJuYW1sZW4iKSkgeworCQkJCWlmIChuZnNfbW91bnRfZGF0YV92ZXJzaW9uID49IDIpCisJCQkJCWRhdGEtPm5hbWxlbiA9IHZhbDsKKwkJCQllbHNlIGlmIChzbG9wcHkpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UKKwkJCQkJZ290byBiYWRfcGFyYW1ldGVyOworI2VuZGlmCisJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWRkciIpKSB7CisJCQkJLyogaWdub3JlICovOworCQkJCWNvbnRpbnVlOworIAkJCX0gZWxzZSBpZiAoc2xvcHB5KQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCWdvdG8gYmFkX3BhcmFtZXRlcjsKKwkJCXNwcmludGYoY2J1ZiwgIiVzPSVzLCIsIG9wdCwgb3B0ZXErMSk7CisJCX0gZWxzZSBpZiAob3B0ZXEpIHsKKwkJCSpvcHRlcSA9ICdcMCc7CisJCQlpZiAoIXN0cmNtcChvcHQsICJwcm90byIpKSB7CisJCQkJaWYgKCFzdHJjbXAob3B0ZXErMSwgInVkcCIpKSB7CisJCQkJCW5mc19wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19VRFA7CisJCQkJCW1udF9wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19VRFA7CisjaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gMgorCQkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKKwkJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0ZXErMSwgInRjcCIpICYmCisJCQkJCSAgIG5mc19tb3VudF9kYXRhX3ZlcnNpb24gPiAyKSB7CisJCQkJCW5mc19wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19UQ1A7CisJCQkJCW1udF9wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19UQ1A7CisJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9UQ1A7CisjZW5kaWYKKwkJCQl9IGVsc2UgaWYgKHNsb3BweSkKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlnb3RvIGJhZF9wYXJhbWV0ZXI7CisjaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNQorCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgInNlYyIpKSB7CisJCQkJY2hhciAqc2VjZmxhdm9yID0gb3B0ZXErMTsKKwkJCQkvKiBzZWUgUkZDIDI2MjMgKi8KKwkJCQlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA8IDUpIHsKKwkJCQkJcHJpbnRmKF8oIldhcm5pbmc6IGlnbm9yaW5nIHNlYz0lcyBvcHRpb25cbiIpLAorCQkJCQkJCXNlY2ZsYXZvcik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoIXN0cmNtcChzZWNmbGF2b3IsICJub25lIikpCisJCQkJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IEFVVEhfTk9ORTsKKwkJCQllbHNlIGlmICghc3RyY21wKHNlY2ZsYXZvciwgInN5cyIpKQorCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX1NZUzsKKwkJCQllbHNlIGlmICghc3RyY21wKHNlY2ZsYXZvciwgImtyYjUiKSkKKwkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfS1JCNTsKKwkJCQllbHNlIGlmICghc3RyY21wKHNlY2ZsYXZvciwgImtyYjVpIikpCisJCQkJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IEFVVEhfR1NTX0tSQjVJOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAia3JiNXAiKSkKKwkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfS1JCNVA7CisJCQkJZWxzZSBpZiAoIXN0cmNtcChzZWNmbGF2b3IsICJsaXBrZXkiKSkKKwkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfTEtFWTsKKwkJCQllbHNlIGlmICghc3RyY21wKHNlY2ZsYXZvciwgImxpcGtleS1pIikpCisJCQkJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IEFVVEhfR1NTX0xLRVlJOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAibGlwa2V5LXAiKSkKKwkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfTEtFWVA7CisJCQkJZWxzZSBpZiAoIXN0cmNtcChzZWNmbGF2b3IsICJzcGttMyIpKQorCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19TUEtNOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAic3BrbTNpIikpCisJCQkJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IEFVVEhfR1NTX1NQS01JOworCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAic3BrbTNwIikpCisJCQkJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IEFVVEhfR1NTX1NQS01QOworCQkJCWVsc2UgaWYgKHNsb3BweSkKKwkJCQkJY29udGludWU7CisJCQkJZWxzZSB7CisJCQkJCXByaW50ZihfKCJXYXJuaW5nOiBVbnJlY29nbml6ZWQgc2VjdXJpdHkgZmxhdm9yICVzLlxuIiksCisJCQkJCQlzZWNmbGF2b3IpOworCQkJCQlnb3RvIGJhZF9wYXJhbWV0ZXI7CisJCQkJfQorCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9TRUNGTEFWT1VSOworI2VuZGlmCisJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAibW91bnRob3N0IikpCisJCQkgICAgICAgIG1vdW50aG9zdD14c3RybmR1cChvcHRlcSsxLAorCQkJCQkJICAgc3RyY3NwbihvcHRlcSsxLCIgXHRcblxyLCIpKTsKKwkJCSBlbHNlIGlmICghc3RyY21wKG9wdCwgImNvbnRleHQiKSkgeworCQkJCWNoYXIgKmNvbnRleHQgPSBvcHRlcSArIDE7CisJCQkJaW50IGN0eGxlbiA9IHN0cmxlbihjb250ZXh0KTsKKworCQkJCWlmIChjdHhsZW4gPiBORlNfTUFYX0NPTlRFWFRfTEVOKSB7CisJCQkJCW5mc19lcnJvcihfKCJjb250ZXh0IHBhcmFtZXRlciBleGNlZWRzIgorCQkJCQkJCSIgbGltaXQgb2YgJWQiKSwKKwkJCQkJCQlORlNfTUFYX0NPTlRFWFRfTEVOKTsKKwkJCQkJZ290byBiYWRfcGFyYW1ldGVyOworCQkJCX0KKwkJCQkvKiBUaGUgY29udGV4dCBzdHJpbmcgaXMgaW4gdGhlIGZvcm1hdCBvZgorCQkJCSAqICJzeXN0ZW1fdTpvYmplY3RfcjouLi4iLiAgV2Ugb25seSB3YW50CisJCQkJICogdGhlIGNvbnRleHQgc3RyIGJldHdlZW4gdGhlIHF1b3Rlcy4KKwkJCQkgKi8KKwkJCQlpZiAoKmNvbnRleHQgPT0gJyInKQorCQkJCQlzdHJuY3B5KGRhdGEtPmNvbnRleHQsIGNvbnRleHQrMSwKKwkJCQkJCQljdHhsZW4tMik7CisJCQkJZWxzZQorCQkJCQlzdHJuY3B5KGRhdGEtPmNvbnRleHQsIGNvbnRleHQsCisJCQkJCQkJTkZTX01BWF9DT05URVhUX0xFTik7CisgCQkJfSBlbHNlIGlmIChzbG9wcHkpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJZ290byBiYWRfcGFyYW1ldGVyOworCQkJc3ByaW50ZihjYnVmLCAiJXM9JXMsIiwgb3B0LCBvcHRlcSsxKTsKKwkJfSBlbHNlIHsKKwkJCWludCB2YWwgPSAxOworCQkJaWYgKCFzdHJuY21wKG9wdCwgIm5vIiwgMikpIHsKKwkJCQl2YWwgPSAwOworCQkJCW9wdCArPSAyOworCQkJfQorCQkJaWYgKCFzdHJjbXAob3B0LCAiYmciKSkKKwkJCQkqYmcgPSB2YWw7CisJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImZnIikpCisJCQkJKmJnID0gIXZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic29mdCIpKSB7CisJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9TT0ZUOworCQkJCWlmICh2YWwpCisJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9TT0ZUOworCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgImhhcmQiKSkgeworCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfU09GVDsKKwkJCQlpZiAoIXZhbCkKKwkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1NPRlQ7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiaW50ciIpKSB7CisJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9JTlRSOworCQkJCWlmICh2YWwpCisJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9JTlRSOworCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgInBvc2l4IikpIHsKKwkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX1BPU0lYOworCQkJCWlmICh2YWwpCisJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9QT1NJWDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJjdG8iKSkgeworCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9DVE87CisJCQkJaWYgKCF2YWwpCisJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9OT0NUTzsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhYyIpKSB7CisJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0FDOworCQkJCWlmICghdmFsKQorCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfTk9BQzsKKyNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCisJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGNwIikpIHsKKwkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKKwkJCQlpZiAodmFsKSB7CisJCQkJCWlmIChuZnNfbW91bnRfZGF0YV92ZXJzaW9uIDwgMikKKwkJCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCQkJbmZzX3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKKwkJCQkJbW50X3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKKwkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKKwkJCQl9IGVsc2UgeworCQkJCQltbnRfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVURQOworCQkJCQluZnNfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVURQOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJ1ZHAiKSkgeworCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfVENQOworCQkJCWlmICghdmFsKSB7CisJCQkJCWlmIChuZnNfbW91bnRfZGF0YV92ZXJzaW9uIDwgMikKKwkJCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCQkJbmZzX3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKKwkJCQkJbW50X3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKKwkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKKwkJCQl9IGVsc2UgeworCQkJCQluZnNfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVURQOworCQkJCQltbnRfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVURQOworCQkJCX0KKyNlbmRpZgorI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDMKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJsb2NrIikpIHsKKwkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX05PTkxNOworCQkJCWlmICghdmFsKSB7CisJCQkJCWlmIChuZnNfbW91bnRfZGF0YV92ZXJzaW9uIDwgMykKKwkJCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOworCQkJCX0KKyNlbmRpZgorI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDQKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJicm9rZW5fc3VpZCIpKSB7CisJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9CUk9LRU5fU1VJRDsKKwkJCQlpZiAodmFsKSB7CisJCQkJCWlmIChuZnNfbW91bnRfZGF0YV92ZXJzaW9uIDwgNCkKKwkJCQkJCWdvdG8gYmFkX29wdGlvbjsKKwkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX0JST0tFTl9TVUlEOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY2wiKSkgeworCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQ0w7CisJCQkJaWYgKCF2YWwpCisJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9OT0FDTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZGlycGx1cyIpKSB7CisJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT1JESVJQTFVTOworCQkJCWlmICghdmFsKQorCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfTk9SRElSUExVUzsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzaGFyZWNhY2hlIikpIHsKKwkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX1VOU0hBUkVEOworCQkJCWlmICghdmFsKQorCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfVU5TSEFSRUQ7CisjZW5kaWYKKwkJCX0gZWxzZSB7CisJCQliYWRfb3B0aW9uOgorCQkJCWlmIChzbG9wcHkpCisJCQkJCWNvbnRpbnVlOworCQkJCW5mc19lcnJvcihfKCIlczogVW5zdXBwb3J0ZWQgbmZzIG1vdW50IG9wdGlvbjoiCisJCQkJCQkiICVzJXMiKSwgcHJvZ25hbWUsCisJCQkJCQl2YWwgPyAiIiA6ICJubyIsIG9wdCk7CisJCQkJZ290byBvdXRfYmFkOworCQkJfQorCQkJc3ByaW50ZihjYnVmLCB2YWwgPyAiJXMsIiA6ICJubyVzLCIsIG9wdCk7CisJCX0KKwkJbGVuICs9IHN0cmxlbihjYnVmKTsKKwkJaWYgKGxlbiA+PSBvcHRfc2l6ZSkgeworCQkJbmZzX2Vycm9yKF8oIiVzOiBleGNlc3NpdmVseSBsb25nIG9wdGlvbiBhcmd1bWVudCIpLAorCQkJCQlwcm9nbmFtZSk7CisJCQlnb3RvIG91dF9iYWQ7CisJCX0KKwkJc3RyY2F0KG5ld19vcHRzLCBjYnVmKTsKKwl9CisJLyogU2VlIGlmIHRoZSBuZnMgaG9zdCA9IG1vdW50IGhvc3QuICovCisJaWYgKG1vdW50aG9zdCkgeworCQlpZiAoIW5mc19nZXRob3N0YnluYW1lKG1vdW50aG9zdCwgbW50X3NhZGRyKSkKKwkJCWdvdG8gb3V0X2JhZDsKKwkJKm1udF9zZXJ2ZXItPmhvc3RuYW1lID0gbW91bnRob3N0OworCX0KKwlmcmVlKHRtcF9vcHRzKTsKKwlyZXR1cm4gMTsKKyBiYWRfcGFyYW1ldGVyOgorCW5mc19lcnJvcihfKCIlczogQmFkIG5mcyBtb3VudCBwYXJhbWV0ZXI6ICVzXG4iKSwgcHJvZ25hbWUsIG9wdCk7Cisgb3V0X2JhZDoKKwlmcmVlKHRtcF9vcHRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnNtbnRfY2hlY2tfY29tcGF0KGNvbnN0IHN0cnVjdCBwbWFwICpuZnNfcG1hcCwKKwkJCQljb25zdCBzdHJ1Y3QgcG1hcCAqbW50X3BtYXApCit7CisJdW5zaWduZWQgaW50IG1heF9uZnNfdmVycyA9IChuZnNfbW91bnRfZGF0YV92ZXJzaW9uID49IDQpID8gMyA6IDI7CisJdW5zaWduZWQgaW50IG1heF9tbnRfdmVycyA9IChuZnNfbW91bnRfZGF0YV92ZXJzaW9uID49IDQpID8gMyA6IDI7CisKKwlpZiAobmZzX3BtYXAtPnBtX3ZlcnMgPT0gNCkgeworCQluZnNfZXJyb3IoXygiJXM6IFBsZWFzZSB1c2UgJy10IG5mczQnICIKKwkJCQkiaW5zdGVhZCBvZiAnLW8gdmVycz00JyIpLCBwcm9nbmFtZSk7CisJCWdvdG8gb3V0X2JhZDsKKwl9CisKKwlpZiAobmZzX3BtYXAtPnBtX3ZlcnMpIHsKKwkJaWYgKG5mc19wbWFwLT5wbV92ZXJzID4gbWF4X25mc192ZXJzIHx8IG5mc19wbWFwLT5wbV92ZXJzIDwgMikgeworCQkJbmZzX2Vycm9yKF8oIiVzOiBORlMgdmVyc2lvbiAlbGQgaXMgbm90IHN1cHBvcnRlZCIpLAorCQkJCQlwcm9nbmFtZSwgbmZzX3BtYXAtPnBtX3ZlcnMpOworCQkJZ290byBvdXRfYmFkOworCQl9CisJfQorCisJaWYgKG1udF9wbWFwLT5wbV92ZXJzID4gbWF4X21udF92ZXJzKSB7CisJCW5mc19lcnJvcihfKCIlczogTkZTIG1vdW50IHZlcnNpb24gJWxkIGlzIG5vdCBzdXBwb3J0ZWQiKSwKKwkJCQlwcm9nbmFtZSwgbW50X3BtYXAtPnBtX3ZlcnMpOworCQlnb3RvIG91dF9iYWQ7CisJfQorCisJcmV0dXJuIDE7CisKK291dF9iYWQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorbmZzbW91bnQoY29uc3QgY2hhciAqc3BlYywgY29uc3QgY2hhciAqbm9kZSwgaW50IGZsYWdzLAorCSBjaGFyICoqZXh0cmFfb3B0cywgaW50IGZha2UsIGludCBydW5uaW5nX2JnKQoreworCWNoYXIgaG9zdGRpclsxMDI0XTsKKwljaGFyICpob3N0bmFtZSwgKmRpcm5hbWUsICpvbGRfb3B0cywgKm1vdW50aG9zdCA9IE5VTEw7CisJY2hhciBuZXdfb3B0c1sxMDI0XSwgY2J1ZlsxMDI0XTsKKwlzdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIGRhdGE7CisJaW50IHZhbDsKKwlzdGF0aWMgaW50IGRvb25jZSA9IDA7CisKKwljbG50X2FkZHJfdCBtbnRfc2VydmVyID0geyAmbW91bnRob3N0LCB9OworCWNsbnRfYWRkcl90IG5mc19zZXJ2ZXIgPSB7ICZob3N0bmFtZSwgfTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKm5mc19zYWRkciA9ICZuZnNfc2VydmVyLnNhZGRyOworCXN0cnVjdCBwbWFwICAqbW50X3BtYXAgPSAmbW50X3NlcnZlci5wbWFwLAorCQkgICAgICpuZnNfcG1hcCA9ICZuZnNfc2VydmVyLnBtYXA7CisJc3RydWN0IHBtYXAgIHNhdmVfbW50LCBzYXZlX25mczsKKworCWludCBmc29jayA9IC0xOworCisJbW50cmVzX3QgbW50cmVzOworCisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwljaGFyICpzOworCWludCBiZywgcmV0cnk7CisJaW50IHJldHZhbCA9IEVYX0ZBSUw7CisJdGltZV90IHQ7CisJdGltZV90IHByZXZ0OworCXRpbWVfdCB0aW1lb3V0OworCisJaWYgKHN0cmxlbihzcGVjKSA+PSBzaXplb2YoaG9zdGRpcikpIHsKKwkJbmZzX2Vycm9yKF8oIiVzOiBleGNlc3NpdmVseSBsb25nIGhvc3Q6ZGlyIGFyZ3VtZW50IiksCisJCQkJcHJvZ25hbWUpOworCQlnb3RvIGZhaWw7CisJfQorCXN0cmNweShob3N0ZGlyLCBzcGVjKTsKKwlpZiAoKHMgPSBzdHJjaHIoaG9zdGRpciwgJzonKSkpIHsKKwkJaG9zdG5hbWUgPSBob3N0ZGlyOworCQlkaXJuYW1lID0gcyArIDE7CisJCSpzID0gJ1wwJzsKKwkJLyogSWdub3JlIGFsbCBidXQgZmlyc3QgaG9zdG5hbWUgaW4gcmVwbGljYXRlZCBtb3VudHMKKwkJICAgdW50aWwgdGhleSBjYW4gYmUgZnVsbHkgc3VwcG9ydGVkLiAobWFja0BzZ2kuY29tKSAqLworCQlpZiAoKHMgPSBzdHJjaHIoaG9zdGRpciwgJywnKSkpIHsKKwkJCSpzID0gJ1wwJzsKKwkJCW5mc19lcnJvcihfKCIlczogd2FybmluZzogIgorCQkJCSAgIm11bHRpcGxlIGhvc3RuYW1lcyBub3Qgc3VwcG9ydGVkIiksCisJCQkJCXByb2duYW1lKTsKKwkJfQorCX0gZWxzZSB7CisJCW5mc19lcnJvcihfKCIlczogZGlyZWN0b3J5IHRvIG1vdW50IG5vdCBpbiBob3N0OmRpciBmb3JtYXQiKSwKKwkJCQlwcm9nbmFtZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIW5mc19nZXRob3N0YnluYW1lKGhvc3RuYW1lLCBuZnNfc2FkZHIpKQorCQlnb3RvIGZhaWw7CisJbW91bnRob3N0ID0gaG9zdG5hbWU7CisJbWVtY3B5ICgmbW50X3NlcnZlci5zYWRkciwgbmZzX3NhZGRyLCBzaXplb2YgKG1udF9zZXJ2ZXIuc2FkZHIpKTsKKworCS8qIGFkZCBJUCBhZGRyZXNzIHRvIG10YWIgb3B0aW9ucyBmb3IgdXNlIHdoZW4gdW5tb3VudGluZyAqLworCisJcyA9IGluZXRfbnRvYShuZnNfc2FkZHItPnNpbl9hZGRyKTsKKwlvbGRfb3B0cyA9ICpleHRyYV9vcHRzOworCWlmICghb2xkX29wdHMpCisJCW9sZF9vcHRzID0gIiI7CisKKwkvKiBTZXQgZGVmYXVsdCBvcHRpb25zLgorCSAqIHJzaXplL3dzaXplIChhbmQgYnNpemUsIGZvciB2ZXIgPj0gMykgYXJlIGxlZnQgMCBpbiBvcmRlciB0bworCSAqIGxldCB0aGUga2VybmVsIGRlY2lkZS4KKwkgKiB0aW1lbyBpcyBmaWxsZWQgaW4gYWZ0ZXIgd2Uga25vdyB3aGV0aGVyIGl0J2xsIGJlIFRDUCBvciBVRFAuICovCisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCWRhdGEuYWNyZWdtaW4JPSAzOworCWRhdGEuYWNyZWdtYXgJPSA2MDsKKwlkYXRhLmFjZGlybWluCT0gMzA7CisJZGF0YS5hY2Rpcm1heAk9IDYwOworI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKKwlkYXRhLm5hbWxlbgk9IE5BTUVfTUFYOworI2VuZGlmCisKKwliZyA9IDA7CisJcmV0cnkgPSAtMTsKKworCW1lbXNldChtbnRfcG1hcCwgMCwgc2l6ZW9mKCptbnRfcG1hcCkpOworCW1udF9wbWFwLT5wbV9wcm9nID0gTU9VTlRQUk9HOworCW1lbXNldChuZnNfcG1hcCwgMCwgc2l6ZW9mKCpuZnNfcG1hcCkpOworCW5mc19wbWFwLT5wbV9wcm9nID0gTkZTX1BST0dSQU07CisKKwkvKiBwYXJzZSBvcHRpb25zICovCisJbmV3X29wdHNbMF0gPSAwOworCWlmICghcGFyc2Vfb3B0aW9ucyhvbGRfb3B0cywgJmRhdGEsICZiZywgJnJldHJ5LCAmbW50X3NlcnZlciwgJm5mc19zZXJ2ZXIsCisJCQkgICBuZXdfb3B0cywgc2l6ZW9mKG5ld19vcHRzKSkpCisJCWdvdG8gZmFpbDsKKwlpZiAoIW5mc21udF9jaGVja19jb21wYXQobmZzX3BtYXAsIG1udF9wbWFwKSkKKwkJZ290byBmYWlsOworCisJaWYgKHJldHJ5ID09IC0xKSB7CisJCWlmIChiZykKKwkJCXJldHJ5ID0gMTAwMDA7CS8qIDEwMDAwIG1pbnMgPT0gfjEgd2VlayovCisJCWVsc2UKKwkJCXJldHJ5ID0gMjsJLyogMiBtaW4gZGVmYXVsdCBvbiBmZyBtb3VudHMgKi8KKwl9CisKKyNpZmRlZiBORlNfTU9VTlRfREVCVUcKKwlwcmludGYoXygicnNpemUgPSAlZCwgd3NpemUgPSAlZCwgdGltZW8gPSAlZCwgcmV0cmFucyA9ICVkXG4iKSwKKwkgICAgICAgZGF0YS5yc2l6ZSwgZGF0YS53c2l6ZSwgZGF0YS50aW1lbywgZGF0YS5yZXRyYW5zKTsKKwlwcmludGYoXygiYWNyZWcgKG1pbiwgbWF4KSA9ICglZCwgJWQpLCBhY2RpciAobWluLCBtYXgpID0gKCVkLCAlZClcbiIpLAorCSAgICAgICBkYXRhLmFjcmVnbWluLCBkYXRhLmFjcmVnbWF4LCBkYXRhLmFjZGlybWluLCBkYXRhLmFjZGlybWF4KTsKKwlwcmludGYoXygicG9ydCA9ICVsdSwgYmcgPSAlZCwgcmV0cnkgPSAlZCwgZmxhZ3MgPSAlLjh4XG4iKSwKKwkgICAgICAgbmZzX3BtYXAtPnBtX3BvcnQsIGJnLCByZXRyeSwgZGF0YS5mbGFncyk7CisJcHJpbnRmKF8oIm1vdW50cHJvZyA9ICVsdSwgbW91bnR2ZXJzID0gJWx1LCBuZnNwcm9nID0gJWx1LCBuZnN2ZXJzID0gJWx1XG4iKSwKKwkgICAgICAgbW50X3BtYXAtPnBtX3Byb2csIG1udF9wbWFwLT5wbV92ZXJzLAorCSAgICAgICBuZnNfcG1hcC0+cG1fcHJvZywgbmZzX3BtYXAtPnBtX3ZlcnMpOworCXByaW50ZihfKCJzb2Z0ID0gJWQsIGludHIgPSAlZCwgcG9zaXggPSAlZCwgbm9jdG8gPSAlZCwgbm9hYyA9ICVkIiksCisJICAgICAgIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX1NPRlQpICE9IDAsCisJICAgICAgIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX0lOVFIpICE9IDAsCisJICAgICAgIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX1BPU0lYKSAhPSAwLAorCSAgICAgICAoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9OT0NUTykgIT0gMCwKKwkgICAgICAgKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9BQykgIT0gMCk7CisjaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gMgorCXByaW50ZihfKCIsIHRjcCA9ICVkIiksCisJICAgICAgIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgIT0gMCk7CisjZW5kaWYKKyNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSA0CisJcHJpbnRmKF8oIiwgbm9hY2wgPSAlZCIpLCAoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9OT0FDTCkgIT0gMCk7CisjZW5kaWYKKyNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSA1CisJcHJpbnRmKF8oIiwgc2VjID0gJXUiKSwgZGF0YS5wc2V1ZG9mbGF2b3IpOworCXByaW50ZihfKCIsIHJlYWRkaXJwbHVzID0gJWQiKSwgKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9SRElSUExVUykgIT0gMCk7CisjZW5kaWYKKwlwcmludGYoIlxuIik7CisjZW5kaWYKKworCWRhdGEudmVyc2lvbiA9IG5mc19tb3VudF9kYXRhX3ZlcnNpb247CisKKwlpZiAoZmxhZ3MgJiBNU19SRU1PVU5UKQorCQlnb3RvIG91dF9vazsKKworCS8qIGNyZWF0ZSBtb3VudCBkZWFtb24gY2xpZW50ICovCisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgbG9vcCBpbXBsZW1lbnRzIHRoZSBtb3VudCByZXRyaWVzLiBPbiB0aGUgZmlyc3QKKwkgKiBjYWxsLCAicnVubmluZ19iZyIgaXMgMC4gV2hlbiB0aGUgbW91bnQgdGltZXMgb3V0LCBhbmQgdGhlCisJICogImJnIiBvcHRpb24gaXMgc2V0LCB0aGUgZXhpdCBzdGF0dXMgRVhfQkcgd2lsbCBiZSByZXR1cm5lZC4KKwkgKiBGb3IgYSBiYWNrZ3JvdW5kZWQgbW91bnQsIHRoZXJlIHdpbGwgYmUgYSBzZWNvbmQgY2FsbCBieSB0aGUKKwkgKiBjaGlsZCBwcm9jZXNzIHdpdGggInJ1bm5pbmdfYmciIHNldCB0byAxLgorCSAqCisJICogVGhlIGNhc2Ugd2hlcmUgdGhlIG1vdW50IHBvaW50IGlzIG5vdCBwcmVzZW50IGFuZCB0aGUgImJnIgorCSAqIG9wdGlvbiBpcyBzZXQsIGlzIHRyZWF0ZWQgYXMgYSB0aW1lb3V0LiBUaGlzIGlzIGRvbmUgdG8KKwkgKiBzdXBwb3J0IG5lc3RlZCBtb3VudHMuCisJICoKKwkgKiBUaGUgInJldHJ5IiBjb3VudCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaXMgdGhlIG51bWJlciBvZgorCSAqIG1pbnV0ZXMgdG8gcmV0cnkgYmVmb3JlIGdpdmluZyB1cC4KKwkgKgorCSAqIE9ubHkgdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuCisJICovCisJdGltZW91dCA9IHRpbWUoTlVMTCkgKyA2MCAqIHJldHJ5OworCXByZXZ0ID0gMDsKKwl0ID0gMzA7CisJdmFsID0gMTsKKworCW1lbWNweSgmc2F2ZV9uZnMsIG5mc19wbWFwLCBzaXplb2Yoc2F2ZV9uZnMpKTsKKwltZW1jcHkoJnNhdmVfbW50LCBtbnRfcG1hcCwgc2l6ZW9mKHNhdmVfbW50KSk7CisJZm9yICg7OykgeworCQlpZiAoYmcgJiYgc3RhdChub2RlLCAmc3RhdGJ1ZikgPT0gLTEpIHsKKwkJCS8qIG5vIG1vdW50IHBvaW50IHlldCAtIHNsZWVwICovCisJCQlpZiAocnVubmluZ19iZykgeworCQkJCXNsZWVwKHZhbCk7CS8qIDEsIDIsIDQsIDgsIDE2LCAzMCwgLi4uICovCisJCQkJdmFsICo9IDI7CisJCQkJaWYgKHZhbCA+IDMwKQorCQkJCQl2YWwgPSAzMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWludCBzdGF0OworCQkJLyogYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRvbyBtYW55IENQVSBjeWNsZXMgKi8KKwkJCWlmICh0IC0gcHJldnQgPCAzMCkKKwkJCQlzbGVlcCgzMCk7CisKKwkJCXN0YXQgPSBuZnNfY2FsbF9tb3VudCgmbW50X3NlcnZlciwgJm5mc19zZXJ2ZXIsCisJCQkJCSAgICAgICZkaXJuYW1lLCAmbW50cmVzKTsKKwkJCWlmIChzdGF0KQorCQkJCWJyZWFrOworCQkJbWVtY3B5KG5mc19wbWFwLCAmc2F2ZV9uZnMsIHNpemVvZigqbmZzX3BtYXApKTsKKwkJCW1lbWNweShtbnRfcG1hcCwgJnNhdmVfbW50LCBzaXplb2YoKm1udF9wbWFwKSk7CisJCQlwcmV2dCA9IHQ7CisJCX0KKwkJaWYgKCFiZykgeworCQkJc3dpdGNoKHJwY19jcmVhdGVlcnIuY2Zfc3RhdCl7CisJCQljYXNlIFJQQ19USU1FRE9VVDoKKwkJCQlicmVhazsKKwkJCWNhc2UgUlBDX1NZU1RFTUVSUk9SOgorCQkJCWlmIChlcnJubyA9PSBFVElNRURPVVQpCisJCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlycGNfbW91bnRfZXJyb3JzKCpuZnNfc2VydmVyLmhvc3RuYW1lLCAwLCBiZyk7CisJCSAgICAgICAgZ290byBmYWlsOworCQkJfQorCQkJdCA9IHRpbWUoTlVMTCk7CisJCQlpZiAodCA+PSB0aW1lb3V0KSB7CisJCQkJcnBjX21vdW50X2Vycm9ycygqbmZzX3NlcnZlci5ob3N0bmFtZSwgMCwgYmcpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCXJwY19tb3VudF9lcnJvcnMoKm5mc19zZXJ2ZXIuaG9zdG5hbWUsIDEsIGJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcnVubmluZ19iZykgeworCQkJaWYgKHJldHJ5ID4gMCkKKwkJCQlyZXR2YWwgPSBFWF9CRzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQl0ID0gdGltZShOVUxMKTsKKwkJaWYgKHQgPj0gdGltZW91dCkgeworCQkJcnBjX21vdW50X2Vycm9ycygqbmZzX3NlcnZlci5ob3N0bmFtZSwgMCwgYmcpOworCQkJZ290byBmYWlsOworCQl9CisJCWlmIChkb29uY2UrKyA8IDEpCisJCQlycGNfbW91bnRfZXJyb3JzKCpuZnNfc2VydmVyLmhvc3RuYW1lLCAxLCBiZyk7CisJfQorCisJaWYgKG1udF9wbWFwLT5wbV92ZXJzIDw9IDIpIHsKKwkJaWYgKG1udHJlcy5uZnN2Mi5maHNfc3RhdHVzICE9IDApIHsKKwkJCW5mc19lcnJvcihfKCIlczogJXM6JXMgZmFpbGVkLCByZWFzb24gZ2l2ZW4gYnkgc2VydmVyOiAlcyIpLAorCQkJCQlwcm9nbmFtZSwgaG9zdG5hbWUsIGRpcm5hbWUsCisJCQkJCW5mc19zdHJlcnJvcihtbnRyZXMubmZzdjIuZmhzX3N0YXR1cykpOworCQkJZ290byBmYWlsOworCQl9CisJCW1lbWNweShkYXRhLnJvb3QuZGF0YSwKKwkJICAgICAgIChjaGFyICopIG1udHJlcy5uZnN2Mi5maHN0YXR1c191LmZoc19maGFuZGxlLAorCQkgICAgICAgTkZTX0ZIU0laRSk7CisjaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNAorCQlkYXRhLnJvb3Quc2l6ZSA9IE5GU19GSFNJWkU7CisJCW1lbWNweShkYXRhLm9sZF9yb290LmRhdGEsCisJCSAgICAgICAoY2hhciAqKSBtbnRyZXMubmZzdjIuZmhzdGF0dXNfdS5maHNfZmhhbmRsZSwKKwkJICAgICAgIE5GU19GSFNJWkUpOworI2VuZGlmCisJfSBlbHNlIHsKKyNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSA0CisJCW1vdW50cmVzM19vayAqbW91bnRyZXM7CisJCWZoYW5kbGUzICpmaGFuZGxlOworCQlpbnQgaSwgIG5fZmxhdm9ycywgKmZsYXZvciwgeXVtID0gMDsKKwkJaWYgKG1udHJlcy5uZnN2My5maHNfc3RhdHVzICE9IDApIHsKKwkJCW5mc19lcnJvcihfKCIlczogJXM6JXMgZmFpbGVkLCByZWFzb24gZ2l2ZW4gYnkgc2VydmVyOiAlcyIpLAorCQkJCQlwcm9nbmFtZSwgaG9zdG5hbWUsIGRpcm5hbWUsCisJCQkJCW5mc19zdHJlcnJvcihtbnRyZXMubmZzdjMuZmhzX3N0YXR1cykpOworCQkJZ290byBmYWlsOworCQl9CisjaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNQorCQltb3VudHJlcyA9ICZtbnRyZXMubmZzdjMubW91bnRyZXMzX3UubW91bnRpbmZvOworCQluX2ZsYXZvcnMgPSBtb3VudHJlcy0+YXV0aF9mbGF2b3JzLmF1dGhfZmxhdm9yc19sZW47CisJCWlmIChuX2ZsYXZvcnMgPD0gMCkKKwkJCWdvdG8gbm9hdXRoX2ZsYXZvcnM7CisKKwkJZmxhdm9yID0gbW91bnRyZXMtPmF1dGhfZmxhdm9ycy5hdXRoX2ZsYXZvcnNfdmFsOworCQlmb3IgKGkgPSAwOyBpIDwgbl9mbGF2b3JzOyArK2kpIHsKKwkJCS8qCisJCQkgKiBQZXIgUkZDMjYyMywgc2VjdGlvbiAyLjcsIHdlIHNob3VsZCBwcmVmZXIgdGhlCisJCQkgKiBmbGF2b3VyIGxpc3RlZCBmaXJzdC4KKwkJCSAqIElmIG5vIGZsYXZvdXIgcmVxdWVzdGVkLCB1c2UgdGhlIGZpcnN0IHNpbXBsZQorCQkJICogZmxhdm91ciB0aGF0IGlzIG9mZmVyZWQuCisJCQkgKi8KKwkJCWlmICghIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpICYmCisJCQkgICAgKGZsYXZvcltpXSA9PSBBVVRIX1NZUyB8fAorCQkJICAgICBmbGF2b3JbaV0gPT0gQVVUSF9OT05FKSkgeworCQkJCWRhdGEucHNldWRvZmxhdm9yID0gZmxhdm9yW2ldOworCQkJCWRhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1NFQ0ZMQVZPVVI7CisJCQl9CisJCQlpZiAoZmxhdm9yW2ldID09IGRhdGEucHNldWRvZmxhdm9yKQorCQkJCXl1bSA9IDE7CisjaWZkZWYgTkZTX01PVU5UX0RFQlVHCisJCQlwcmludGYoXygiYXV0aCBmbGF2b3IgJWQ6ICVkXG4iKSwgaSwgZmxhdm9yW2ldKTsKKyNlbmRpZgorCQl9CisJCWlmICgheXVtKSB7CisJCQluZnNfZXJyb3IoXygiJXM6ICVzOiVzIGZhaWxlZCwgc2VjdXJpdHkgZmxhdm9yICIKKwkJCQkJIm5vdCBzdXBwb3J0ZWQiKSwKKwkJCQkJcHJvZ25hbWUsIGhvc3RuYW1lLCBkaXJuYW1lKTsKKwkJCS8qIHNlcnZlciBoYXMgcmVnaXN0ZXJlZCB1cyBpbiBybXRhYiwgc2VuZCB1bW91bnQgKi8KKwkJCW5mc19jYWxsX3Vtb3VudCgmbW50X3NlcnZlciwgJmRpcm5hbWUpOworCQkJZ290byBmYWlsOworCQl9Citub2F1dGhfZmxhdm9yczoKKyNlbmRpZgorCQlmaGFuZGxlID0gJm1udHJlcy5uZnN2My5tb3VudHJlczNfdS5tb3VudGluZm8uZmhhbmRsZTsKKwkJbWVtc2V0KGRhdGEub2xkX3Jvb3QuZGF0YSwgMCwgTkZTX0ZIU0laRSk7CisJCW1lbXNldCgmZGF0YS5yb290LCAwLCBzaXplb2YoZGF0YS5yb290KSk7CisJCWRhdGEucm9vdC5zaXplID0gZmhhbmRsZS0+ZmhhbmRsZTNfbGVuOworCQltZW1jcHkoZGF0YS5yb290LmRhdGEsCisJCSAgICAgICAoY2hhciAqKSBmaGFuZGxlLT5maGFuZGxlM192YWwsCisJCSAgICAgICBmaGFuZGxlLT5maGFuZGxlM19sZW4pOworCisJCWRhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1ZFUjM7CisjZW5kaWYKKwl9CisKKwlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA9PSAxKSB7CisJCS8qIGNyZWF0ZSBuZnMgc29ja2V0IGZvciBrZXJuZWwgKi8KKwkJaWYgKG5mc19wbWFwLT5wbV9wcm90ID09IElQUFJPVE9fVENQKQorCQkJZnNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwkJZWxzZQorCQkJZnNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCQlpZiAoZnNvY2sgPCAwKSB7CisJCQlwZXJyb3IoXygibmZzIHNvY2tldCIpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAoYmluZHJlc3Zwb3J0KGZzb2NrLCAwKSA8IDApIHsKKwkJCXBlcnJvcihfKCJuZnMgYmluZHJlc3Zwb3J0IikpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisjaWZkZWYgTkZTX01PVU5UX0RFQlVHCisJcHJpbnRmKF8oInVzaW5nIHBvcnQgJWx1IGZvciBuZnMgZGVhbW9uXG4iKSwgbmZzX3BtYXAtPnBtX3BvcnQpOworI2VuZGlmCisJbmZzX3NhZGRyLT5zaW5fcG9ydCA9IGh0b25zKG5mc19wbWFwLT5wbV9wb3J0KTsKKwkvKgorCSAqIGNvbm5lY3QoKSB0aGUgc29ja2V0IGZvciBrZXJuZWxzIDEuMy4xMCBhbmQgYmVsb3cgb25seSwKKwkgKiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIG11bHRpaG9tZWQgaG9zdHMuCisJICogLS1Td2VuCisJICovCisJaWYgKGxpbnV4X3ZlcnNpb25fY29kZSgpIDw9IE1BS0VfVkVSU0lPTigxLCAzLCAxMCkgJiYgZnNvY2sgIT0gLTEKKwkgICAgJiYgY29ubmVjdChmc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBuZnNfc2FkZHIsCisJCSAgICAgICBzaXplb2YgKCpuZnNfc2FkZHIpKSA8IDApIHsKKwkJcGVycm9yKF8oIm5mcyBjb25uZWN0IikpOworCQlnb3RvIGZhaWw7CisJfQorCisjaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gMgorCWlmIChuZnNfcG1hcC0+cG1fcHJvdCA9PSBJUFBST1RPX1RDUCkKKwkJZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVENQOworCWVsc2UKKwkJZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKKyNlbmRpZgorCisJLyogcHJlcGFyZSBkYXRhIHN0cnVjdHVyZSBmb3Iga2VybmVsICovCisKKwlkYXRhLmZkID0gZnNvY2s7CisJbWVtY3B5KChjaGFyICopICZkYXRhLmFkZHIsIChjaGFyICopIG5mc19zYWRkciwgc2l6ZW9mKGRhdGEuYWRkcikpOworCXN0cm5jcHkoZGF0YS5ob3N0bmFtZSwgaG9zdG5hbWUsIHNpemVvZihkYXRhLmhvc3RuYW1lKSk7CisKKyBvdXRfb2s6CisJLyogRW5zdXJlIHdlIGhhdmUgZW5vdWdoIHBhZGRpbmcgZm9yIHRoZSBmb2xsb3dpbmcgc3RyY2F0KClzICovCisJaWYgKHN0cmxlbihuZXdfb3B0cykgKyBzdHJsZW4ocykgKyAzMCA+PSBzaXplb2YobmV3X29wdHMpKSB7CisJCW5mc19lcnJvcihfKCIlczogZXhjZXNzaXZlbHkgbG9uZyBvcHRpb24gYXJndW1lbnQiKSwKKwkJCQlwcm9nbmFtZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzbnByaW50ZihjYnVmLCBzaXplb2YoY2J1ZiktMSwgImFkZHI9JXMiLCBzKTsKKwlzdHJjYXQobmV3X29wdHMsIGNidWYpOworCisJKmV4dHJhX29wdHMgPSB4c3RyZHVwKG5ld19vcHRzKTsKKworCWlmICghZmFrZSAmJiAhKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKSB7CisJCWlmICghc3RhcnRfc3RhdGQoKSkgeworCQkJbmZzX2Vycm9yKF8oIiVzOiBycGMuc3RhdGQgaXMgbm90IHJ1bm5pbmcgYnV0IGlzICIKKwkJCQkicmVxdWlyZWQgZm9yIHJlbW90ZSBsb2NraW5nLlxuIgorCQkJCSIgICBFaXRoZXIgdXNlICctbyBub2xvY2snIHRvIGtlZXAgIgorCQkJCSJsb2NrcyBsb2NhbCwgb3Igc3RhcnQgc3RhdGQuIiksCisJCQkJCXByb2duYW1lKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWlmICghZmFrZSkgeworCQlpZiAobW91bnQoc3BlYywgbm9kZSwgIm5mcyIsCisJCQkJZmxhZ3MgJiB+KE1TX1VTRVJ8TVNfVVNFUlMpLCAmZGF0YSkpIHsKKwkJCW1vdW50X2Vycm9yKHNwZWMsIG5vZGUsIGVycm5vKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXJldHVybiBFWF9TVUNDRVNTOworCisJLyogYWJvcnQgKi8KKyBmYWlsOgorCWlmIChmc29jayAhPSAtMSkKKwkJY2xvc2UoZnNvY2spOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzbW91bnQuY29uZiBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnNtb3VudC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOGZmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzbW91bnQuY29uZgpAQCAtMCwwICsxLDEzNSBAQAorIworIyAvZXRjL25mc21vdW50LmNvbmYgLSBzZWUgbmZzbW91bnQuY29uZig1KSBmb3IgZGV0YWlscworIworIyBUaGlzIGlzIGFuIE5GUyBtb3VudCBjb25maWd1cmF0aW9uIGZpbGUuIFRoaXMgZmlsZSBjYW4gYmUgYnJva2VuCisjIHVwIGludG8gdGhyZWUgZGlmZmVyZW50IHNlY3Rpb25zOiBNb3VudCwgU2VydmVyIGFuZCBHbG9iYWwKKyMgCisjIFsgTW91bnRQb2ludCAiTW91bnRfcG9pbnQiIF0gCisjIFRoaXMgc2VjdGlvbiBkZWZpbmVzIGFsbCB0aGUgbW91bnQgb3B0aW9ucyB0aGF0CisjIHNob3VsZCBiZSB1c2VkIG9uIGEgcGFydGljdWxhciBtb3VudCBwb2ludC4gVGhlICc8TW91bnRfUG9pbnQ+JworIyBzdHJpbmcgbmVlZCB0byBiZSBhbiBleGFjdCBtYXRjaCBvZiB0aGUgcGF0aCBpbiB0aGUgbW91bnQgCisjIGNvbW1hbmQuIEV4YW1wbGU6CisjICAgICBbIE1vdW50UG9pbnQgIi9leHBvcnQvaG9tZSIgXQorIyAgICAgICBiYWNrZ3JvdW5kPVRydWUKKyMgV291bGQgY2F1c2UgYWxsIG1vdW50IHRvIC9leHBvcnQvaG9tZSB3b3VsZCBiZSBkb25lIGluCisjIHRoZSBiYWNrZ3JvdW5kCisjCisjIFsgU2VydmVyICJTZXJ2ZXJfTmFtZSIgXQorIyBUaGlzIHNlY3Rpb24gZGVmaW5lcyBhbGwgdGhlIG1vdW50IG9wdGlvbnMgdGhhdAorIyBzaG91bGQgYmUgdXNlZCBvbiBtb3VudHMgdG8gYSBwYXJ0aWN1bGFyIE5GUyBzZXJ2ZXIuIAorIyBFeGFtcGxlOgorIyAgICAgWyBTZXJ2ZXIgIm5mc3NlcnZlci5mb28uY29tIiBdCisjICAgICAgIHJzaXplPTMyaworIyAgICAgICB3c2l6ZT0zMmsKKyMgQWxsIHJlYWRzIGFuZCB3cml0ZXMgdG8gdGhlICduZnNzZXJ2ZXIuZm9vLmNvbScgc2VydmVyIAorIyB3aWxsIGJlIGRvbmUgd2l0aCAzMmsgKDMyNzY4IGJ5dGVzKSBibG9jayBzaXplcy4KKyMKK1sgTkZTTW91bnRfR2xvYmFsX09wdGlvbnMgXQorIyBUaGlzIHN0YXRpY2FsbHkgbmFtZWQgc2VjdGlvbiBkZWZpbmVzIGdsb2JhbCBtb3VudCAKKyMgb3B0aW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIG9uIGFsbCBORlMgbW91bnQuCisjCisjIFByb3RvY29sIFZlcnNpb24gWzIsMyw0XQorIyBUaGlzIGRlZmluZXMgdGhlIGRlZmF1bHQgcHJvdG9jb2wgdmVyc2lvbiB3aGljaCB3aWxsCisjIGJlIHVzZWQgdG8gc3RhcnQgdGhlIG5lZ290aWF0aW9uIHdpdGggdGhlIHNlcnZlci4KKyMgRGVmYXVsdHZlcnM9NAorIworIyBTZXR0aW5nIHRoaXMgb3B0aW9uIG1ha2VzIGl0IG1hbmRhdG9yeSB0aGUgc2VydmVyIHN1cHBvcnRzIHRoZQorIyBnaXZlbiB2ZXJzaW9uLiBUaGUgbW91bnQgd2lsbCBmYWlsIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzIAorIyBub3Qgc3VwcG9ydCBieSB0aGUgc2VydmVyLiAKKyMgTmZzdmVycz00CisjCisjIE5ldHdvcmsgUHJvdG9jb2wgW3VkcCx0Y3AscmRtYV0gKE5vdGU6IHZhbHVlcyBhcmUgY2FzZSBzZW5zaXRpdmUpCisjIFRoaXMgZGVmaW5lcyB0aGUgZGVmYXVsdCBuZXR3b3JrIHByb3RvY29sIHdoaWNoIHdpbGwKKyMgYmUgdXNlZCB0byBzdGFydCB0aGUgbmVnb3RpYXRpb24gd2l0aCB0aGUgc2VydmVyLgorIyBEZWZhdWx0cHJvdG89dGNwCisjCisjIFNldHRpbmcgdGhpcyBvcHRpb24gbWFrZXMgaXQgbWFuZGF0b3J5IHRoZSBzZXJ2ZXIgc3VwcG9ydHMgdGhlCisjIGdpdmVuIG5ldHdvcmsgcHJvdG9jb2wuIFRoZSBtb3VudCB3aWxsIGZhaWwgaWYgdGhlIGdpdmVuIG5ldHdvcmsKKyMgcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLgorIyBQcm90bz10Y3AKKyMKKyMgVGhlIG51bWJlciBvZiB0aW1lcyBhIHJlcXVlc3Qgd2lsbCBiZSByZXRpcmVkIGJlZm9yZSAKKyMgZ2VuZXJhdGluZyBhIHRpbWVvdXQgCisjIFJldHJhbnM9MgorIworIyBUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgdGhhdCB3aWxsIHJldHJ5IG1vdW50CisjIFJldHJ5PTIKKyMKKyMgVGhlIG1pbmltdW0gdGltZSAoaW4gc2Vjb25kcykgZmlsZSBhdHRyaWJ1dGVzIGFyZSBjYWNoZWQKKyMgYWNyZWdtaW49MzAKKyMKKyMgVGhlIE1heGltdW0gdGltZSAoaW4gc2Vjb25kcykgZmlsZSBhdHRyaWJ1dGVzIGFyZSBjYWNoZWQKKyMgYWNyZWdtaW49NjAKKyMKKyMgVGhlIG1pbmltdW0gdGltZSAoaW4gc2Vjb25kcykgZGlyZWN0b3J5IGF0dHJpYnV0ZXMgYXJlIGNhY2hlZAorIyBhY3JlZ21pbj0zMAorIworIyBUaGUgTWF4aW11bSB0aW1lIChpbiBzZWNvbmRzKSBkaXJlY3RvcnkgYXR0cmlidXRlcyBhcmUgY2FjaGVkCisjIGFjcmVnbWluPTYwCisjCisjIEVuYWJsZSBBY2Nlc3MgIENvbnRyb2wgIExpc3RzCisjIEFjbD1GYWxzZQorIworIyBFbmFibGUgQXR0cmlidXRlIENhY2hpbmcKKyMgQWM9VHJ1ZQorIworIyBEbyBtb3VudHMgaW4gYmFja2dyb3VuZCAoaS5lLiBhc3luY2hyb25vdXNseSkKKyMgQmFja2dyb3VuZD1GYWxzZQorIworIyBDbG9zZS1Uby1PcGVuIGNhY2hlIGNvaGVyZW5jZQorIyBDdG89VHJ1ZQorIworIyBEbyBtb3VudHMgaW4gZm9yZWdyb3VuZCAoaS5lLiBzeW5jaHJvbm91c2x5KQorIyBGb3JlZ3JvdW5kPVRydWUKKyMKKyMgSG93IHRvIGhhbmRsZSB0aW1lcyBvdXQgZnJvbSBzZXJ2ZXJzIChIYXJkIGlzIFNUUk9OR0xZIHN1Z2dlc3RlZCkKKyMgSGFyZD1UcnVlCisjIFNvZnQ9RmFsc2UKKyMKKyMgRW5hYmxlIEZpbGUgTG9ja2luZworIyBMb2NrPVRydWUKKyMKKyMgRW5hYmxlIFJFQURESVJQTFVTIG9uIE5GUyB2ZXJzaW9uIDMgbW91bnRzCisjIFJkaXJwbHVzPVRydWUKKyMKKyMgTWF4aW11bSBSZWFkIFNpemUgKGluIEJ5dGVzKQorIyBSc2l6ZT04aworIworIyBNYXhpbXVtIFdyaXRlIFNpemUgKGluIEJ5dGVzKQorIyBXc2l6ZT04aworIworIyBNYXhpbXVtIFNlcnZlciBCbG9jayBTaXplIChpbiBCeXRlcykKKyMgQnNpemU9OGsKKyMKKyMgSWdub3JlIHVua25vd24gbW91bnQgb3B0aW9ucworIyBTbG9wcHk9RmFsc2UKKyMKKyMgU2hhcmUgRGF0YSBhbmQgQXR0cmlidXRlIENhY2hlcworIyBTaGFyZWNhY2hlPVRydWUKKyMKKyMgVGhlIGFtb3VudCBvZiB0aW1lLCBpbiB0ZW50aHMgb2YgYSBzZWNvbmRzLCB0aGUgY2xpZW50CisjIHdpbGwgd2FpdCBmb3IgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYmVmb3JlIHJldHJhbnNtaXR0aW5nCisjIHRoZSByZXF1ZXN0LgorIyBUaW1lbz02MDAKKyMKKyMgU2V0cyBhbGwgYXR0cmlidXRlcyB0aW1lcyB0byB0aGUgc2FtZSB0aW1lIChpbiBzZWNvbmRzKQorIyBhY3RpbWVvPTMwCisjCisjIFNlcnZlciBNb3VudGQgcG9ydCBtb3VudHBvcnQKKyMgbW91bnRwb3J0PTQwMDEKKyMKKyMgU2VydmVyIE1vdW50ZCBQcm90b2NvbAorIyBtb3VudHByb3RvPXRjcAorIworIyBTZXJ2ZXIgTW91bnRkIFZlcnNpb24KKyMgbW91bnZlcnM9MworIworIyBTZXJ2ZXIgTW91bnRkIEhvc3QKKyMgbW91bnRob3N0PWhvc3RuYW1lCisjCisjIFNlcnZlciBQb3J0CisjIFBvcnQ9MjA0OQorIworIyBSUENHU1Mgc2VjdXJpdHkgZmxhdm9ycyAKKyMgW25vbmUsIHN5cywga3JiNSwga3JiNWksIGtyYjVwIF0KKyMgU2VjPXN5cwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25mc21vdW50LmNvbmYubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25mc21vdW50LmNvbmYubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTNmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvbmZzbW91bnQuY29uZi5tYW4KQEAgLTAsMCArMSw4NyBAQAorLlwiQCgjKW5mc21vdW50LmNvbmYuNSIKKy5USCBORlNNT1VOVC5DT05GIDUgIjkgTWFyIDIwMDgiCisuU0ggTkFNRQorbmZzbW91bnQuY29uZiAtIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgTkZTIG1vdW50cworLlNIIFNZTk9QU0lTCitDb25maWd1cmF0aW9uIGZpbGUgZm9yIE5GUyBtb3VudHMgdGhhdCBhbGxvd3Mgb3B0aW9ucwordG8gYmUgc2V0IGdsb2JhbGx5LCBwZXIgc2VydmVyIG9yIHBlciBtb3VudCBwb2ludC4KKy5TSCBERVNDUklQVElPTgorVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBtYWRlIHVwIG9mIG11bHRpcGxlIHNlY3Rpb25zIAorZm9sbG93ZWQgYnkgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHNlY3Rpb24uCitBIHNlY3Rpb24gaXMgZGVmaW5lZCBieSBhIHN0cmluZyBlbmNsb3NlZCBieSAKKy5CUiBbCithbmQgCisuQlIgXQorYnJhbmNoZXMuCitWYXJpYWJsZXMgYXJlIGFzc2lnbm1lbnQgc3RhdGVtZW50cyB0aGF0IGFzc2lnbiB2YWx1ZXMgCit0byBwYXJ0aWN1bGFyIHZhcmlhYmxlcyB1c2luZyB0aGUgIAorLkJSID0gCitvcGVyYXRvciwgYXMgaW4gCisuQlIgUHJvdG89VGNwIC4KK1NlY3Rpb25zIGFyZSBicm9rZW4gdXAgaW50byB0aHJlZSBiYXNpYyBjYXRlZ29yaWVzOgorR2xvYmFsIG9wdGlvbnMsIFNlcnZlciBvcHRpb25zIGFuZCBNb3VudCBQb2ludCBvcHRpb25zLgorLkhQCisuQiBbIE5GU01vdW50X0dsb2JhbF9PcHRpb25zIF0KKy0gVGhpcyBzdGF0aWNhbGx5IG5hbWVkIHNlY3Rpb24KK2RlZmluZXMgYWxsIG9mIHRoZSBnbG9iYWwgbW91bnQgb3B0aW9ucyB0aGF0IGNhbiBiZSAKK2FwcGxpZWQgdG8gZXZlcnkgTkZTIG1vdW50LgorLkhQCisuQiBbIFNlcnZlciBcKGxxU2VydmVyX05hbWVcKHJxIF0gCistIFRoaXMgc2VjdGlvbiBkZWZpbmVzIGFsbCB0aGUgbW91bnQgb3B0aW9ucyB0aGF0IHNob3VsZCAKK2JlIHVzZWQgb24gbW91bnRzIHRvIGEgcGFydGljdWxhciBORlMgc2VydmVyLiBUaGUgCisuSSBcKGxxU2VydmVyX05hbWVcKHJxCitzdHJpbmdzIG5lZWRzIHRvIGJlIHN1cnJvdW5kZWQgYnkgJ1wobHEnIGFuZCAKK2JlIGFuIGV4YWN0IG1hdGNoIG9mIHRoZSBzZXJ2ZXIgbmFtZSB1c2VkIGluIHRoZSAKKy5CIG1vdW50Citjb21tYW5kLiAKKy5IUAorLkIgWyBNb3VudFBvaW50IFwobHFNb3VudF9Qb2ludFwocnEgXQorLSBUaGlzIHNlY3Rpb24gZGVmaW5lcyBhbGwgdGhlIG1vdW50IG9wdGlvbnMgdGhhdCAKK3Nob3VsZCBiZSB1c2VkIG9uIGEgcGFydGljdWxhciBtb3VudCBwb2ludC4KK1RoZSAKKy5JIFwobHFNb3VudF9Qb2ludFwocnEKK3N0cmluZyBuZWVkcyB0byBiZSBzdXJyb3VuZGVkIGJ5ICdcKGxxJyBhbmQgYmUgYW4gCitleGFjdCBtYXRjaCBvZiB0aGUgbW91bnQgcG9pbnQgdXNlZCBpbiB0aGUgCisuQlIgbW91bnQgCitjb21tYW5kLgorLlNIIEVYQU1QTEVTCisuUFAKK1RoZXNlIGFyZSBzb21lIGV4YW1wbGUgbGluZXMgb2YgaG93IHNlY3Rpb25zIGFuZCB2YXJpYWJsZXMKK2FyZSBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisuUFAKK1sgTkZTTW91bnRfR2xvYmFsX09wdGlvbnMgXQorLmJyCisgICAgUHJvdG89VGNwCisuUlMKKy5IUAorVGhlIFRDUCBwcm90b2NvbCB3aWxsIGJlIHVzZWQgb24gZXZlcnkgTkZTIG1vdW50LgorLkhQCisuUkUKK1sgU2VydmVyIFwobHFuZnNzZXJ2ZXIuZm9vLmNvbVwocnEgXQorLmJyCisgICAgcnNpemU9MzJrCisuYnIKKyAgICB3c2l6ZT0zMmsKKy5IUAorLlJTCitBIDMzayAoMzI3NjggYnl0ZXMpIGJsb2NrIHNpemUgd2lsbCBiZSB1c2VkIGFzIHRoZSByZWFkIGFuZCB3cml0ZQorc2l6ZSBvbiBhbGwgbW91bnRzIHRvIHRoZSAnbmZzc2VydmVyLmZvby5jb20nIHNlcnZlci4KKy5IUAorLlJFCisuQlIgCitbIE1vdW50UG9pbnQgXChscS9leHBvcnQvaG9tZVwocnEgXQorLmJyCisgICAgQmFja2dyb3VuZD1UcnVlCisuUlMKKy5IUAorQWxsIG1vdW50cyB0byB0aGUgJy9leHBvcnQvaG9tZScgZXhwb3J0IHdpbGwgYmUgcGVyZm9ybWVkIGluCit0aGUgYmFja2dyb3VuZCAoaS5lLiBkb25lIGFzeW5jaHJvbm91c2x5KS4KKy5IUAorLlNIIEZJTEVTCisuVFAgMTBuCisuSSAvZXRjL25mc21vdW50LmNvbmYKK0RlZmF1bHQgTkZTIG1vdW50IGNvbmZpZ3VyYXRpb24gZmlsZQorLlBECisuU0ggU0VFIEFMU08KKy5CUiBuZnMgKDUpLAorLkJSIG1vdW50ICg4KSwKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnN1bW91bnQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9uZnN1bW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDc5OGEyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L25mc3Vtb3VudC5jCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogbmZzdW1vdW50LmMgLS0gTGludXggTkZTIHVtb3VudAorICogQ29weXJpZ2h0IChDKSAyMDA2IEFtaXQgR3VkIDxhZ3VkQHJlZGhhdC5jb20+CisgKgorICogLSBCYXNpYyBjb2RlIGFuZCB3cmFwcGVyIGFyb3VuZCBORlMgdW1vdW50IGNvZGUgb3JpZ2luYWxseQorICogICBpbiB1dGlsLWxpbnV4L21vdW50L25mc21vdW50LmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgInhjb21tb24uaCIKKyNpbmNsdWRlICJmc3RhYi5oIgorI2luY2x1ZGUgIm5scy5oIgorCisjaW5jbHVkZSAibW91bnRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJlcnJvci5oIgorI2luY2x1ZGUgIm5ldHdvcmsuaCIKKyNpbmNsdWRlICJwYXJzZV9vcHQuaCIKKyNpbmNsdWRlICJwYXJzZV9kZXYuaCIKKworI2lmICFkZWZpbmVkKE1OVF9GT1JDRSkKKy8qIGRhcmUgbm90IHRyeSB0byBpbmNsdWRlIDxsaW51eC9tb3VudC5oPiAtLSBsb3RzIG9mIGVycm9ycyAqLworI2RlZmluZSBNTlRfRk9SQ0UgMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChNTlRfREVUQUNIKQorI2RlZmluZSBNTlRfREVUQUNIIDIKKyNlbmRpZgorCitleHRlcm4gY2hhciAqcHJvZ25hbWU7CitleHRlcm4gaW50IG5vbXRhYjsKK2V4dGVybiBpbnQgdmVyYm9zZTsKK2ludCBmb3JjZTsKK2ludCBsYXp5OworaW50IHJlbW91bnQ7CisKKworc3RhdGljIGludCB0cnlfcmVtb3VudChjb25zdCBjaGFyICpzcGVjLCBjb25zdCBjaGFyICpub2RlKQoreworCWludCByZXM7CisKKwlyZXMgPSBtb3VudChzcGVjLCBub2RlLCBOVUxMLAorCQkgICAgTVNfTUdDX1ZBTCB8IE1TX1JFTU9VTlQgfCBNU19SRE9OTFksIE5VTEwpOworCWlmIChyZXMgPT0gMCkgeworCQlzdHJ1Y3QgbW50ZW50IHJlbW50OworCQluZnNfZXJyb3IoXygiJXM6ICVzIGJ1c3kgLSByZW1vdW50ZWQgcmVhZC1vbmx5IiksCisJCQkJcHJvZ25hbWUsIHNwZWMpOworCQlyZW1udC5tbnRfdHlwZSA9IHJlbW50Lm1udF9mc25hbWUgPSBOVUxMOworCQlyZW1udC5tbnRfZGlyID0geHN0cmR1cChub2RlKTsKKwkJcmVtbnQubW50X29wdHMgPSB4c3RyZHVwKCJybyIpOworCQlpZiAoIW5vbXRhYikKKwkJCXVwZGF0ZV9tdGFiKG5vZGUsICZyZW1udCk7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFQlVTWSkgeyAgICAvKiBobW0gLi4uICovCisJCXBlcnJvcihfKCJyZW1vdW50IikpOworCQluZnNfZXJyb3IoXygiJXM6IGNvdWxkIG5vdCByZW1vdW50ICVzIHJlYWQtb25seSIpLAorCQkJCXByb2duYW1lLCBzcGVjKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBkZWxfbXRhYihjb25zdCBjaGFyICpzcGVjLCBjb25zdCBjaGFyICpub2RlKQoreworCWludCB1bW50X2VyciwgcmVzOworCisJdW1udF9lcnIgPSAwOworCWlmIChsYXp5KSB7CisJCXJlcyA9IHVtb3VudDIgKG5vZGUsIE1OVF9ERVRBQ0gpOworCQlpZiAocmVzIDwgMCkKKwkJCXVtbnRfZXJyID0gZXJybm87CisJCWdvdG8gd3JpdGVtdGFiOworCX0KKworCWlmIChmb3JjZSkgeworCQlyZXMgPSB1bW91bnQyIChub2RlLCBNTlRfRk9SQ0UpOworCQlpZiAocmVzID09IC0xKSB7CisJCQlpbnQgZXJyc3YgPSBlcnJubzsKKwkJCXBlcnJvcihfKCJ1bW91bnQyIikpOworCQkJZXJybm8gPSBlcnJzdjsKKwkJCWlmIChlcnJubyA9PSBFTk9TWVMpIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJcHJpbnRmKF8oIm5vIHVtb3VudDIsIHRyeWluZyB1bW91bnQuLi5cbiIpKTsKKwkJCQlyZXMgPSB1bW91bnQgKG5vZGUpOworCQkJfQorCQl9CisJfSBlbHNlCisJCXJlcyA9IHVtb3VudCAobm9kZSk7CisKKwlpZiAocmVzIDwgMCkgeworCQlpZiAocmVtb3VudCAmJiBlcnJubyA9PSBFQlVTWSAmJiBzcGVjKSB7CisJCQlyZXMgPSB0cnlfcmVtb3VudChzcGVjLCBub2RlKTsKKwkJCWlmIChyZXMpCisJCQkJZ290byB3cml0ZW10YWI7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQl1bW50X2VyciA9IGVycm5vOworCX0KKworCWlmIChyZXMgPj0gMCkgeworCQkvKiBVbW91bnQgc3VjY2VlZGVkICovCisJCWlmICh2ZXJib3NlKQorCQkJcHJpbnRmKF8oIiVzIHVtb3VudGVkXG4iKSwgc3BlYyA/IHNwZWMgOiBub2RlKTsKKwl9CisKKyB3cml0ZW10YWI6CisJaWYgKCFub210YWIgJiYKKwkgICAgKHVtbnRfZXJyID09IDAgfHwgdW1udF9lcnIgPT0gRUlOVkFMIHx8IHVtbnRfZXJyID09IEVOT0VOVCkpIHsKKwkJdXBkYXRlX210YWIobm9kZSwgTlVMTCk7CisJfQorCisJaWYgKHJlcyA+PSAwKQorCQlyZXR1cm4gMDsKKworCWlmICh1bW50X2VycikKKwkJdW1vdW50X2Vycm9yKHVtbnRfZXJyLCBub2RlKTsKKwlyZXR1cm4gRVhfRklMRUlPOworfQorCisvKgorICogRGlzY292ZXIgbW91bnQgc2VydmVyJ3MgaG9zdG5hbWUvYWRkcmVzcyBieSBleGFtaW5pbmcgbW91bnQgb3B0aW9ucworICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIHRoYXQgdGhlIGNhbGxlciBtdXN0IGZyZWUsIG9uCisgKiBzdWNjZXNzOyBvdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGNoYXIgKm5mc191bW91bnRfaG9zdG5hbWUoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsCisJCQkJIGNoYXIgKmhvc3RuYW1lKQoreworCWNoYXIgKm9wdGlvbjsKKworCW9wdGlvbiA9IHBvX2dldChvcHRpb25zLCAibW91bnRhZGRyIik7CisJaWYgKG9wdGlvbikKKwkJZ290byBvdXQ7CisJb3B0aW9uID0gcG9fZ2V0KG9wdGlvbnMsICJtb3VudGhvc3QiKTsKKwlpZiAob3B0aW9uKQorCQlnb3RvIG91dDsKKwlvcHRpb24gPSBwb19nZXQob3B0aW9ucywgImFkZHIiKTsKKwlpZiAob3B0aW9uKQorCQlnb3RvIG91dDsKKworCXJldHVybiBob3N0bmFtZTsKKworb3V0OgorCWZyZWUoaG9zdG5hbWUpOworCXJldHVybiBzdHJkdXAob3B0aW9uKTsKK30KKworLyoKKyAqIFJldHVybnMgRVhfU1VDQ0VTUyBpZiBtb3VudCBvcHRpb25zIGFuZCBkZXZpY2UgbmFtZSBoYXZlIGJlZW4KKyAqIHBhcnNlZCBzdWNjZXNzZnVsbHk7IG90aGVyd2lzZSBFWF9GQUlMLgorICovCitzdGF0aWMgaW50IG5mc191bW91bnRfZG9fdW1udChzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSAgICAgIGNoYXIgKipob3N0bmFtZSwgY2hhciAqKmRpcm5hbWUpCit7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIJCXNhOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4JczQ7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYJczY7CisJfSBhZGRyZXNzOworCXN0cnVjdCBzb2NrYWRkciAqc2FwID0gJmFkZHJlc3Muc2E7CisJc29ja2xlbl90IHNhbGVuID0gc2l6ZW9mKGFkZHJlc3MpOworCXN0cnVjdCBwbWFwIG5mc19wbWFwLCBtbnRfcG1hcDsKKwlzYV9mYW1pbHlfdCBmYW1pbHk7CisKKwlpZiAoIW5mc19vcHRpb25zMnBtYXAob3B0aW9ucywgJm5mc19wbWFwLCAmbW50X3BtYXApKSB7CisJCW5mc19lcnJvcihfKCIlczogYmFkIG1vdW50IG9wdGlvbnMiKSwgcHJvZ25hbWUpOworCQlyZXR1cm4gRVhfRkFJTDsKKwl9CisKKwkvKiBTa2lwIFVNTlQgY2FsbCBmb3IgdmVycz00IG1vdW50cyAqLworCWlmIChuZnNfcG1hcC5wbV92ZXJzID09IDQpCisJCXJldHVybiBFWF9TVUNDRVNTOworCisJKmhvc3RuYW1lID0gbmZzX3Vtb3VudF9ob3N0bmFtZShvcHRpb25zLCAqaG9zdG5hbWUpOworCWlmICghKmhvc3RuYW1lKSB7CisJCW5mc19lcnJvcihfKCIlczogb3V0IG9mIG1lbW9yeSIpLCBwcm9nbmFtZSk7CisJCXJldHVybiBFWF9GQUlMOworCX0KKworCWlmICghbmZzX21vdW50X3Byb3RvX2ZhbWlseShvcHRpb25zLCAmZmFtaWx5KSkKKwkJcmV0dXJuIDA7CisJaWYgKCFuZnNfbG9va3VwKCpob3N0bmFtZSwgZmFtaWx5LCBzYXAsICZzYWxlbikpCisJCS8qIG5mc19sb29rdXAgcmVwb3J0cyBhbnkgZXJyb3JzICovCisJCXJldHVybiBFWF9GQUlMOworCisJaWYgKG5mc19hZHZpc2VfdW1vdW50KHNhcCwgc2FsZW4sICZtbnRfcG1hcCwgZGlybmFtZSkgPT0gMCkKKwkJLyogbmZzX2FkdmlzZV91bW91bnQgcmVwb3J0cyBhbnkgZXJyb3JzICovCisJCXJldHVybiBFWF9GQUlMOworCisJcmV0dXJuIEVYX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBQaWNrIHVwIGNlcnRhaW4gbW91bnQgb3B0aW9ucyB1c2VkIGR1cmluZyB0aGUgb3JpZ2luYWwgbW91bnQKKyAqIGZyb20gL2V0Yy9tdGFiLiAgVGhlIGJhc2ljcyBpbmNsdWRlIHRoZSBzZXJ2ZXIncyBJUCBhZGRyZXNzIGFuZAorICogdGhlIHNlcnZlciBwYXRobmFtZSBvZiB0aGUgc2hhcmUgdG8gdW5yZWdpc3Rlci4KKyAqCisgKiBUaGVzZSBvcHRpb25zIG1pZ2h0IGFsc28gZGVzY3JpYmUgdGhlIG1vdW50IHBvcnQsIG1vdW50IHByb3RvY29sCisgKiB2ZXJzaW9uLCBhbmQgdHJhbnNwb3J0IHByb3RvY29sIHVzZWQgdG8gcHVuY2ggdGhyb3VnaCBhIGZpcmV3YWxsLgorICogV2Ugd2lsbCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gdG8gZ2V0IHRocm91Z2ggdGhlIGZpcmV3YWxsIGFnYWluCisgKiB0byBkbyB0aGUgdW1vdW50LgorICoKKyAqIE5vdGUgdGhhdCBvcHRpb24gcGFyc2luZyBmYWlsdXJlcyB3b24ndCBuZWNlc3NhcmlseSBjYXVzZSB0aGUKKyAqIHVtb3VudCByZXF1ZXN0IHRvIGZhaWwuICBUaG9zZSB2YWx1ZXMgd2lsbCBiZSBsZWZ0IHplcm8gaW4gdGhlCisgKiBwbWFwIHR1cGxlLiAgSWYgdGhlIEdFVFBPUlQgY2FsbCBsYXRlciBmYWlscyB0byBkaXNhbWJpZ3VhdGUgdGhlbSwKKyAqIHRoZW4gd2UgZmFpbC4KKyAqLworc3RhdGljIGludCBuZnNfdW1vdW50MjMoY29uc3QgY2hhciAqZGV2bmFtZSwgY2hhciAqc3RyaW5nKQoreworCWNoYXIgKmhvc3RuYW1lLCAqZGlybmFtZTsKKwlzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9uczsKKwlpbnQgcmVzdWx0ID0gRVhfRkFJTDsKKworCWlmICghbmZzX3BhcnNlX2Rldm5hbWUoZGV2bmFtZSwgJmhvc3RuYW1lLCAmZGlybmFtZSkpCisJCXJldHVybiBFWF9VU0FHRTsKKworCW9wdGlvbnMgPSBwb19zcGxpdChzdHJpbmcpOworCWlmIChvcHRpb25zKSB7CisJCXJlc3VsdCA9IG5mc191bW91bnRfZG9fdW1udChvcHRpb25zLCAmaG9zdG5hbWUsICZkaXJuYW1lKTsKKwkJcG9fZGVzdHJveShvcHRpb25zKTsKKwl9IGVsc2UKKwkJbmZzX2Vycm9yKF8oIiVzOiBvcHRpb24gcGFyc2luZyBlcnJvciIpLCBwcm9nbmFtZSk7CisKKwlmcmVlKGhvc3RuYW1lKTsKKwlmcmVlKGRpcm5hbWUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIHVtb3VudF9sb25nb3B0c1tdID0KK3sKKyAgeyAiZm9yY2UiLCAwLCAwLCAnZicgfSwKKyAgeyAiaGVscCIsIDAsIDAsICdoJyB9LAorICB7ICJuby1tdGFiIiwgMCwgMCwgJ24nIH0sCisgIHsgInZlcmJvc2UiLCAwLCAwLCAndicgfSwKKyAgeyAicmVhZC1vbmx5IiwgMCwgMCwgJ3InIH0sCisgIHsgTlVMTCwgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgdm9pZCB1bW91bnRfdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoXygidXNhZ2U6ICVzIGRpciBbLWZ2bnJsaF1cbiIpLCBwcm9nbmFtZSk7CisJcHJpbnRmKF8oIm9wdGlvbnM6XG5cdC1mXHRcdGZvcmNlIHVubW91bnRcbiIpKTsKKwlwcmludGYoXygiXHQtdlx0dmVyYm9zZVxuIikpOworCXByaW50ZihfKCJcdC1uXHREbyBub3QgdXBkYXRlIC9ldGMvbXRhYlxuIikpOworCXByaW50ZihfKCJcdC1yXHRyZW1vdW50XG4iKSk7CisJcHJpbnRmKF8oIlx0LWxcdGxhenkgdW5tb3VudFxuIikpOworCXByaW50ZihfKCJcdC1oXHRwcmludCB0aGlzIGhlbHBcblxuIikpOworfQorCitpbnQgbmZzdW1vdW50KGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGMsIHJldDsKKwljaGFyICpzcGVjOworCXN0cnVjdCBtbnRlbnRjaG4gKm1jOworCisJaWYgKGFyZ2MgPCAyKSB7CisJCXVtb3VudF91c2FnZSgpOworCQlyZXR1cm4gRVhfVVNBR0U7CisJfQorCisJc3BlYyA9IGFyZ3ZbMV07CisKKwlhcmd2ICs9IDE7CisJYXJnYyAtPSAxOworCisJYXJndlswXSA9IGFyZ3ZbLTFdOyAvKiBTbyB0aGF0IGdldG9wdCBlcnJvciBtZXNzYWdlcyBhcmUgY29ycmVjdCAqLworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiZnZucmxoIiwKKwkJCQl1bW91bnRfbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSkgeworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdmJzoKKwkJCSsrZm9yY2U7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQkrK3ZlcmJvc2U7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQkrK25vbXRhYjsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCSsrcmVtb3VudDsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCSsrbGF6eTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJZGVmYXVsdDoKKwkJCXVtb3VudF91c2FnZSgpOworCQkJcmV0dXJuIEVYX1VTQUdFOworCQl9CisJfQorCWlmIChvcHRpbmQgIT0gYXJnYykgeworCQl1bW91bnRfdXNhZ2UoKTsKKwkJcmV0dXJuIEVYX1VTQUdFOworCX0KKwkKKwlpZiAoc3BlYyA9PSBOVUxMIHx8ICgqc3BlYyAhPSAnLycgJiYgc3RyY2hyKHNwZWMsJzonKSA9PSBOVUxMKSkgeworCQluZnNfZXJyb3IoXygiJXM6ICVzOiBub3QgZm91bmRcbiIpLCBwcm9nbmFtZSwgc3BlYyk7CisJCXJldHVybiBFWF9VU0FHRTsKKwl9CisKKwlpZiAoKnNwZWMgPT0gJy8nKQorCQltYyA9IGdldG1udGRpcmJhY2t3YXJkKHNwZWMsIE5VTEwpOworCWVsc2UKKwkJbWMgPSBnZXRtbnRkZXZiYWNrd2FyZChzcGVjLCBOVUxMKTsKKwlpZiAoIW1jICYmIHZlcmJvc2UpCisJCXByaW50ZihfKCJDb3VsZCBub3QgZmluZCAlcyBpbiBtdGFiXG4iKSwgc3BlYyk7CisKKwlpZiAobWMgJiYgc3RyY21wKG1jLT5tLm1udF90eXBlLCAibmZzIikgIT0gMCAmJgorCSAgICBzdHJjbXAobWMtPm0ubW50X3R5cGUsICJuZnM0IikgIT0gMCkgeworCQluZnNfZXJyb3IoXygiJXM6ICVzIG9uICVzIGlzIG5vdCBhbiBORlMgZmlsZXN5c3RlbSIpLAorCQkJCXByb2duYW1lLCBtYy0+bS5tbnRfZnNuYW1lLCBtYy0+bS5tbnRfZGlyKTsKKwkJcmV0dXJuIEVYX1VTQUdFOworCX0KKworCWlmIChnZXR1aWQoKSAhPSAwKSB7CisJCS8qIG9ubHkgcGVybWl0dGVkIGlmICJ1c2VyPSIgb3IgInVzZXJzIiBpcyBpbiBtb3VudCBvcHRpb25zICovCisJCWlmICghbWMpIHsKKwkJCS8qIHVtb3VudCBtaWdodCBjYWxsIHVzIHR3aWNlLiAgVGhlIHNlY29uZCB0aW1lIHRoZXJlIHdpbGwKKwkJCSAqIGJlIG5vIGVudHJ5IGluIG10YWIgYW5kIHdlIHNob3VsZCBqdXN0IGV4aXQgcXVpZXRseQorCQkJICovCisJCQlyZXR1cm4gRVhfU1VDQ0VTUzsKKworCQlvbmx5X3Jvb3Q6CisJCQluZnNfZXJyb3IoXygiJXM6IFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byB1bm1vdW50ICVzIiksCisJCQkJCXByb2duYW1lLCBzcGVjKTsKKwkJCXJldHVybiBFWF9VU0FHRTsKKwkJfQorCQlpZiAoaGFzbW50b3B0KCZtYy0+bSwgInVzZXJzIikgPT0gTlVMTCkgeworCQkJY2hhciAqb3B0ID0gaGFzbW50b3B0KCZtYy0+bSwgInVzZXIiKTsKKwkJCXN0cnVjdCBwYXNzd2QgKnB3OworCQkJY2hhciAqY29tbWE7CisJCQlzaXplX3QgbGVuOworCQkJaWYgKCFvcHQpCisJCQkJZ290byBvbmx5X3Jvb3Q7CisJCQlpZiAob3B0WzRdICE9ICc9JykKKwkJCQlnb3RvIG9ubHlfcm9vdDsKKwkJCWNvbW1hID0gc3RyY2hyKG9wdCwgJywnKTsKKwkJCWlmIChjb21tYSkKKwkJCQlsZW4gPSBjb21tYSAtIChvcHQgKyA1KTsKKwkJCWVsc2UKKwkJCQlsZW4gPSBzdHJsZW4ob3B0KzUpOworCQkJcHcgPSBnZXRwd3VpZChnZXR1aWQoKSk7CisJCQlpZiAocHcgPT0gTlVMTCB8fCBzdHJsZW4ocHctPnB3X25hbWUpICE9IGxlbgorCQkJICAgIHx8IHN0cm5jbXAocHctPnB3X25hbWUsIG9wdCs1LCBsZW4pICE9IDApCisJCQkJZ290byBvbmx5X3Jvb3Q7CisJCX0KKwl9CisKKwlyZXQgPSAwOworCWlmIChtYykgeworCQlpZiAoIWxhenkgJiYgc3RyY21wKG1jLT5tLm1udF90eXBlLCAibmZzNCIpICE9IDApCisJCQkvKiBXZSBpZ25vcmUgdGhlIGVycm9yIGZyb20gbmZzX3Vtb3VudDIzLgorCQkJICogSWYgdGhlIGFjdHVhbCB1bW91bnQgc3VjY2VlZHMgKGluIGRlbF9tdGFiKSwKKwkJCSAqIHdlIGRvbid0IHdhbnQgdG8gc2lnbmFsIGFuIGVycm9yLCBhcyB0aGF0CisJCQkgKiBjb3VsZCBjYXVzZSAvc2Jpbi9tb3VudCB0byByZXRyeSEKKwkJCSAqLworCQkJbmZzX3Vtb3VudDIzKG1jLT5tLm1udF9mc25hbWUsIG1jLT5tLm1udF9vcHRzKTsKKwkJcmV0ID0gZGVsX210YWIobWMtPm0ubW50X2ZzbmFtZSwgbWMtPm0ubW50X2RpcikgPzogcmV0OworCX0gZWxzZSBpZiAoKnNwZWMgIT0gJy8nKSB7CisJCWlmICghbGF6eSkKKwkJCXJldCA9IG5mc191bW91bnQyMyhzcGVjLCAidGNwLHYzIik7CisJfSBlbHNlCisJCXJldCA9IGRlbF9tdGFiKE5VTEwsIHNwZWMpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9wYXJzZV9kZXYuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9wYXJzZV9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGE1OGIxCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3BhcnNlX2Rldi5jCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogcGFyc2VfZGV2LmMgLS0gcGFyc2UgZGV2aWNlIG5hbWUgaW50byBob3N0bmFtZSBhbmQgZXhwb3J0IHBhdGgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInhjb21tb24uaCIKKyNpbmNsdWRlICJubHMuaCIKKyNpbmNsdWRlICJwYXJzZV9kZXYuaCIKKworI2lmbmRlZiBORlNfTUFYSE9TVE5BTUUKKyNkZWZpbmUgTkZTX01BWEhPU1ROQU1FCQkoMjU1KQorI2VuZGlmCisKKyNpZm5kZWYgTkZTX01BWFBBVEhOQU1FCisjZGVmaW5lIE5GU19NQVhQQVRITkFNRQkJKDEwMjQpCisjZW5kaWYKKworZXh0ZXJuIGNoYXIgKnByb2duYW1lOworZXh0ZXJuIGludCB2ZXJib3NlOworCitzdGF0aWMgaW50IG5mc19wZG5fbm9fZGV2bmFtZV9lcnIodm9pZCkKK3sKKwluZnNfZXJyb3IoXygiJXM6IG5vIGRldmljZSBuYW1lIHdhcyBwcm92aWRlZCIpLCBwcm9nbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Bkbl9ob3N0bmFtZV90b29fbG9uZ19lcnIodm9pZCkKK3sKKwluZnNfZXJyb3IoXygiJXM6IHNlcnZlciBob3N0bmFtZSBpcyB0b28gbG9uZyIpLCBwcm9nbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Bkbl9wYXRobmFtZV90b29fbG9uZ19lcnIodm9pZCkKK3sKKwluZnNfZXJyb3IoXygiJXM6IGV4cG9ydCBwYXRobmFtZSBpcyB0b28gbG9uZyIpLCBwcm9nbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Bkbl9iYWRfZm9ybWF0X2Vycih2b2lkKQoreworCW5mc19lcnJvcihfKCIlczogcmVtb3RlIHNoYXJlIG5vdCBpbiAnaG9zdDpkaXInIGZvcm1hdCIpLCBwcm9nbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Bkbl9ub21lbV9lcnIodm9pZCkKK3sKKwluZnNfZXJyb3IoXygiJXM6IG5vIG1lbW9yeSBhdmFpbGFibGUgdG8gcGFyc2UgZGV2bmFtZSIpLCBwcm9nbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3Bkbl9taXNzaW5nX2JyYWNlX2Vycih2b2lkKQoreworCW5mc19lcnJvcihfKCIlczogY2xvc2luZyBicmFja2V0IG1pc3NpbmcgZnJvbSBzZXJ2ZXIgYWRkcmVzcyIpLAorCQkJCXByb2duYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN0YW5kYXJkIGhvc3RuYW1lOnBhdGggZm9ybWF0CisgKi8KK3N0YXRpYyBpbnQgbmZzX3BhcnNlX3NpbXBsZV9ob3N0bmFtZShjb25zdCBjaGFyICpkZXYsCisJCQkJICAgICBjaGFyICoqaG9zdG5hbWUsIGNoYXIgKipwYXRobmFtZSkKK3sKKwlzaXplX3QgaG9zdF9sZW4sIHBhdGhfbGVuOworCWNoYXIgKmNvbG9uLCAqY29tbWE7CisKKwkvKiBNdXN0IGhhdmUgYSBjb2xvbiAqLworCWNvbG9uID0gc3RyY2hyKGRldiwgJzonKTsKKwlpZiAoY29sb24gPT0gTlVMTCkKKwkJcmV0dXJuIG5mc19wZG5fYmFkX2Zvcm1hdF9lcnIoKTsKKwkqY29sb24gPSAnXDAnOworCWhvc3RfbGVuID0gY29sb24gLSBkZXY7CisKKwlpZiAoaG9zdF9sZW4gPiBORlNfTUFYSE9TVE5BTUUpCisJCXJldHVybiBuZnNfcGRuX2hvc3RuYW1lX3Rvb19sb25nX2VycigpOworCisJLyogSWYgdGhlcmUncyBhIGNvbW1hIGJlZm9yZSB0aGUgY29sb24sIHRha2Ugb25seSB0aGUKKwkgKiBmaXJzdCBuYW1lIGluIGxpc3QgKi8KKwljb21tYSA9IHN0cmNocihkZXYsICcsJyk7CisJaWYgKGNvbW1hICE9IE5VTEwpIHsKKwkJKmNvbW1hID0gJ1wwJzsKKwkJaG9zdF9sZW4gPSBjb21tYSAtIGRldjsKKwkJbmZzX2Vycm9yKF8oIiVzOiB3YXJuaW5nOiBtdWx0aXBsZSBob3N0bmFtZXMgbm90IHN1cHBvcnRlZCIpLAorCQkJCXByb2duYW1lKTsKKwl9IGVsc2UKKworCWNvbG9uKys7CisJcGF0aF9sZW4gPSBzdHJsZW4oY29sb24pOworCWlmIChwYXRoX2xlbiA+IE5GU19NQVhQQVRITkFNRSkKKwkJcmV0dXJuIG5mc19wZG5fcGF0aG5hbWVfdG9vX2xvbmdfZXJyKCk7CisKKwlpZiAoaG9zdG5hbWUpIHsKKwkJKmhvc3RuYW1lID0gc3RybmR1cChkZXYsIGhvc3RfbGVuKTsKKwkJaWYgKCpob3N0bmFtZSA9PSBOVUxMKQorCQkJcmV0dXJuIG5mc19wZG5fbm9tZW1fZXJyKCk7CisJfQorCWlmIChwYXRobmFtZSkgeworCQkqcGF0aG5hbWUgPSBzdHJuZHVwKGNvbG9uLCBwYXRoX2xlbik7CisJCWlmICgqcGF0aG5hbWUgPT0gTlVMTCkgeworCQkJZnJlZSgqaG9zdG5hbWUpOworCQkJcmV0dXJuIG5mc19wZG5fbm9tZW1fZXJyKCk7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUbyBoYW5kbGUgcmF3IElQdjYgYWRkcmVzc2VzICh3aGljaCBjb250YWluIGNvbG9ucyksIHRoZQorICogc2VydmVyJ3MgYWRkcmVzcyBpcyBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMuICBSZXR1cm4KKyAqIHdoYXQncyBiZXR3ZWVuIHRoZSBicmFja2V0cy4KKyAqCisgKiBUaGVyZSBjb3VsZCBiZSBhbnl0aGluZyBpbiBiZXR3ZWVuIHRoZSBicmFja2V0cywgYnV0IHdlJ2xsCisgKiBsZXQgRE5TIHJlc29sdXRpb24gc29ydCBpdCBvdXQgbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3BhcnNlX3NxdWFyZV9icmFja2V0KGNvbnN0IGNoYXIgKmRldiwKKwkJCQkgICAgY2hhciAqKmhvc3RuYW1lLCBjaGFyICoqcGF0aG5hbWUpCit7CisJc2l6ZV90IGhvc3RfbGVuLCBwYXRoX2xlbjsKKwljaGFyICpjYnJhY2U7CisKKwlkZXYrKzsKKworCS8qIE11c3QgaGF2ZSBhIGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQgKi8KKwljYnJhY2UgPSBzdHJjaHIoZGV2LCAnXScpOworCWlmIChjYnJhY2UgPT0gTlVMTCkKKwkJcmV0dXJuIG5mc19wZG5fbWlzc2luZ19icmFjZV9lcnIoKTsKKwkqY2JyYWNlID0gJ1wwJzsKKwlob3N0X2xlbiA9IGNicmFjZSAtIGRldjsKKworCS8qIE11c3QgaGF2ZSBhIGNvbG9uIGp1c3QgYWZ0ZXIgdGhlIGNsb3NpbmcgYnJhY2tldCAqLworCWNicmFjZSsrOworCWlmICgqY2JyYWNlICE9ICc6JykKKwkJcmV0dXJuIG5mc19wZG5fYmFkX2Zvcm1hdF9lcnIoKTsKKworCWlmIChob3N0X2xlbiA+IE5GU19NQVhIT1NUTkFNRSkKKwkJcmV0dXJuIG5mc19wZG5faG9zdG5hbWVfdG9vX2xvbmdfZXJyKCk7CisKKwljYnJhY2UrKzsKKwlwYXRoX2xlbiA9IHN0cmxlbihjYnJhY2UpOworCWlmIChwYXRoX2xlbiA+IE5GU19NQVhQQVRITkFNRSkKKwkJcmV0dXJuIG5mc19wZG5fcGF0aG5hbWVfdG9vX2xvbmdfZXJyKCk7CisKKwlpZiAoaG9zdG5hbWUpIHsKKwkJKmhvc3RuYW1lID0gc3RybmR1cChkZXYsIGhvc3RfbGVuKTsKKwkJaWYgKCpob3N0bmFtZSA9PSBOVUxMKQorCQkJcmV0dXJuIG5mc19wZG5fbm9tZW1fZXJyKCk7CisJfQorCWlmIChwYXRobmFtZSkgeworCQkqcGF0aG5hbWUgPSBzdHJuZHVwKGNicmFjZSwgcGF0aF9sZW4pOworCQlpZiAoKnBhdGhuYW1lID09IE5VTEwpIHsKKwkJCWZyZWUoKmhvc3RuYW1lKTsKKwkJCXJldHVybiBuZnNfcGRuX25vbWVtX2VycigpOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKgorICogUkZDIDIyMjQgc2F5cyBhbiBORlMgY2xpZW50IG11c3QgZ3JvayAicHVibGljIGZpbGUgaGFuZGxlcyIgdG8KKyAqIHN1cHBvcnQgTkZTIFVSTHMuICBMaW51eCBkb2Vzbid0IGRvIHRoYXQgeWV0LiAgUHJpbnQgYSBzb21ld2hhdAorICogaGVscGZ1bCBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZSBpbnN0ZWFkIG9mIHByZXNzaW5nIGZvcndhcmQKKyAqIHdpdGggdGhlIG1vdW50IHJlcXVlc3QgYW5kIGZhaWxpbmcgd2l0aCBhIGNyeXB0aWMgZXJyb3IgbWVzc2FnZQorICogbGF0ZXIuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3BhcnNlX25mc191cmwoX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY29uc3QgY2hhciAqZGV2LAorCQkJICAgICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBjaGFyICoqaG9zdG5hbWUsCisJCQkgICAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNoYXIgKipwYXRobmFtZSkKK3sKKwluZnNfZXJyb3IoXygiJXM6IE5GUyBVUkxzIGFyZSBub3Qgc3VwcG9ydGVkIiksIHByb2duYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBuZnNfcGFyc2VfZGV2bmFtZSAtIERldGVybWluZSB0aGUgc2VydmVyJ3MgaG9zdG5hbWUgYnkgbG9va2luZyBhdCAiZGV2bmFtZSIuCisgKiBAZGV2bmFtZTogcG9pbnRlciB0byBtb3VudGVkIGRldmljZSBuYW1lIChmaXJzdCBhcmd1bWVudCBvZiBtb3VudCBjb21tYW5kKQorICogQGhvc3RuYW1lOiBPVVQ6IHBvaW50ZXIgdG8gc2VydmVyJ3MgaG9zdG5hbWUKKyAqIEBwYXRobmFtZTogT1VUOiBwb2ludGVyIHRvIGV4cG9ydCBwYXRoIG9uIHNlcnZlcgorICoKKyAqIFJldHVybnMgMSBpZiBzdWNjZXNmdWwsIG9yIHplcm8gaWYgc29tZSBlcnJvciBvY2N1cnJlZC4gIE9uIHN1Y2Nlc3MsCisgKiBAaG9zdG5hbWUgYW5kIEBwYXRobmFtZSBwb2ludCB0byBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYnVmZmVycyBjb250YWluaW5nCisgKiB0aGUgaG9zdG5hbWUgb2YgdGhlIHNlcnZlciBhbmQgdGhlIGV4cG9ydCBwYXRobmFtZSAoYm90aCAnXDAnLXRlcm1pbmF0ZWQpLgorICoKKyAqIEBob3N0bmFtZSBvciBAcGF0aG5hbWUgbWF5IGJlIE5VTEwgaWYgY2FsbGVyIGRvZXNuJ3Qgd2FudCBhIGNvcHkgb2YgdGhvc2UKKyAqIHBhcnRzIG9mIEBkZXZuYW1lLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHdvcmsgaWYgQGRldm5hbWUgaXMgYSB3aWRlLWNoYXJhY3RlciBzdHJpbmcuCisgKi8KK2ludCBuZnNfcGFyc2VfZGV2bmFtZShjb25zdCBjaGFyICpkZXZuYW1lLAorCQkgICAgICBjaGFyICoqaG9zdG5hbWUsIGNoYXIgKipwYXRobmFtZSkKK3sKKwljaGFyICpkZXY7CisJaW50IHJlc3VsdDsKKworCWlmIChkZXZuYW1lID09IE5VTEwpCisJCXJldHVybiBuZnNfcGRuX25vX2Rldm5hbWVfZXJyKCk7CisKKwkvKiBQYXJzZXIgaXMgZGVzdHJ1Y3RpdmUsIHNvIG9wZXJhdGUgb24gYSBjb3B5IG9mIHRoZSBkZXZpY2UgbmFtZS4gKi8KKwlkZXYgPSBzdHJkdXAoZGV2bmFtZSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gbmZzX3Bkbl9ub21lbV9lcnIoKTsKKwlpZiAoKmRldiA9PSAnWycpCisJCXJlc3VsdCA9IG5mc19wYXJzZV9zcXVhcmVfYnJhY2tldChkZXYsIGhvc3RuYW1lLCBwYXRobmFtZSk7CisJZWxzZSBpZiAoc3RybmNtcChkZXYsICJuZnM6Ly8iLCA2KSA9PSAwKQorCQlyZXN1bHQgPSBuZnNfcGFyc2VfbmZzX3VybChkZXYsIGhvc3RuYW1lLCBwYXRobmFtZSk7CisJZWxzZQorCQlyZXN1bHQgPSBuZnNfcGFyc2Vfc2ltcGxlX2hvc3RuYW1lKGRldiwgaG9zdG5hbWUsIHBhdGhuYW1lKTsKKworCWZyZWUoZGV2KTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3BhcnNlX2Rldi5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3BhcnNlX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMjg4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvcGFyc2VfZGV2LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIHBhcnNlX2Rldi5jIC0tIHBhcnNlIGRldmljZSBuYW1lIGludG8gaG9zdG5hbWUgYW5kIGV4cG9ydCBwYXRoCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9fTkZTX1VUSUxTX1BBUlNFX0RFVl9IRUFERVIKKyNkZWZpbmUgX19ORlNfVVRJTFNfUEFSU0VfREVWX0hFQURFUgorCitleHRlcm4gaW50CW5mc19wYXJzZV9kZXZuYW1lKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgY2hhciAqKik7CisKKyNlbmRpZgkvKiBfX05GU19VVElMU19QQVJTRV9ERVYgKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9wYXJzZV9vcHQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9wYXJzZV9vcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDkxOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3BhcnNlX29wdC5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKgorICogcGFyc2Vfb3B0LmMgLS0gbW91bnQgb3B0aW9uIHN0cmluZyBwYXJzaW5nIGhlbHBlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBDaHVjayBMZXZlciA8Y2h1Y2subGV2ZXJAb3JhY2xlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKgorICovCisKKy8qCisgKiBDb252ZXJ0aW5nIGEgQyBzdHJpbmcgY29udGFpbmluZyBtb3VudCBvcHRpb25zIHRvIGEgZGF0YSBvYmplY3QKKyAqIGFuZCBtYW5pcHVsYXRpbmcgdGhhdCBvYmplY3QgaXMgY2xlYW5lciBpbiBDIHRoYW4gbWFuaXB1bGF0aW5nCisgKiB0aGUgQyBzdHJpbmcgaXRzZWxmLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXkgUHl0aG9uIGhhbmRsZXMKKyAqIHN0cmluZyBtYW5pcHVsYXRpb24uCisgKgorICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdXNlcyBhIGxpbmtlZCBsaXN0IGFzIHRoZSBkYXRhIG9iamVjdAorICogc2luY2UgbGlzdHMgYXJlIHNpbXBsZSwgYW5kIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbW9yZQorICogdGhhbiB0ZW4gb3IgdHdlbnR5IG9wdGlvbnMgYXQgYSB0aW1lLgorICoKKyAqIEhvcGVmdWxseSB0aGUgaW50ZXJmYWNlIGlzIGFic3RyYWN0IGVub3VnaCB0aGF0IHRoZSB1bmRlcmx5aW5nCisgKiBkYXRhIHN0cnVjdHVyZSBjYW4gYmUgcmVwbGFjZWQgaWYgbmVlZGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhlIEFQSS4KKyAqLworCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAicGFyc2Vfb3B0LmgiCisjaW5jbHVkZSAidG9rZW4uaCIKKworCitzdHJ1Y3QgbW91bnRfb3B0aW9uIHsKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpuZXh0LCAqcHJldjsKKwljaGFyICprZXl3b3JkOworCWNoYXIgKnZhbHVlOworfTsKKworc3RydWN0IG1vdW50X29wdGlvbnMgeworCXN0cnVjdCBtb3VudF9vcHRpb24gKmhlYWQsICp0YWlsOworCXVuc2lnbmVkIGludCBjb3VudDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbW91bnRfb3B0aW9uICpvcHRpb25fY3JlYXRlKGNoYXIgKnN0cikKK3sKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpvcHRpb247CisJY2hhciAqb3B0ZXE7CisKKwlpZiAoIXN0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlvcHRpb24gPSBtYWxsb2Moc2l6ZW9mKCpvcHRpb24pKTsKKwlpZiAoIW9wdGlvbikKKwkJcmV0dXJuIE5VTEw7CisJCisJb3B0aW9uLT5uZXh0ID0gTlVMTDsKKwlvcHRpb24tPnByZXYgPSBOVUxMOworCisJb3B0ZXEgPSBzdHJjaHIoc3RyLCAnPScpOworCWlmIChvcHRlcSkgeworCQlvcHRpb24tPmtleXdvcmQgPSBzdHJuZHVwKHN0ciwgb3B0ZXEgLSBzdHIpOworCQlpZiAoIW9wdGlvbi0+a2V5d29yZCkKKwkJCWdvdG8gZmFpbDsKKwkJb3B0aW9uLT52YWx1ZSA9IHN0cmR1cChvcHRlcSArIDEpOworCQlpZiAoIW9wdGlvbi0+dmFsdWUpIHsKKwkJCWZyZWUob3B0aW9uLT5rZXl3b3JkKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSB7CisJCW9wdGlvbi0+a2V5d29yZCA9IHN0cmR1cChzdHIpOworCQlpZiAoIW9wdGlvbi0+a2V5d29yZCkKKwkJCWdvdG8gZmFpbDsKKwkJb3B0aW9uLT52YWx1ZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIG9wdGlvbjsKKworZmFpbDoKKwlmcmVlKG9wdGlvbik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbW91bnRfb3B0aW9uICpvcHRpb25fZHVwKGNvbnN0IHN0cnVjdCBtb3VudF9vcHRpb24gKm9wdGlvbikKK3sKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpuZXc7CisKKwluZXcgPSBtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIE5VTEw7CisJCisJbmV3LT5uZXh0ID0gTlVMTDsKKwluZXctPnByZXYgPSBOVUxMOworCisJbmV3LT5rZXl3b3JkID0gc3RyZHVwKG9wdGlvbi0+a2V5d29yZCk7CisJaWYgKCFuZXctPmtleXdvcmQpCisJCWdvdG8gZmFpbDsKKworCW5ldy0+dmFsdWUgPSBOVUxMOworCWlmIChvcHRpb24tPnZhbHVlKSB7CisJCW5ldy0+dmFsdWUgPSBzdHJkdXAob3B0aW9uLT52YWx1ZSk7CisJCWlmICghbmV3LT52YWx1ZSkgeworCQkJZnJlZShuZXctPmtleXdvcmQpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJcmV0dXJuIG5ldzsKKworZmFpbDoKKwlmcmVlKG5ldyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG9wdGlvbl9kZXN0cm95KHN0cnVjdCBtb3VudF9vcHRpb24gKm9wdGlvbikKK3sKKwlmcmVlKG9wdGlvbi0+a2V5d29yZCk7CisJZnJlZShvcHRpb24tPnZhbHVlKTsKKwlmcmVlKG9wdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIG9wdGlvbnNfaW5pdChzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlvcHRpb25zLT5oZWFkID0gb3B0aW9ucy0+dGFpbCA9IE5VTEw7CisJb3B0aW9ucy0+Y291bnQgPSAwOworfQorCitzdGF0aWMgc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnNfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnM7CisKKwlvcHRpb25zID0gbWFsbG9jKHNpemVvZigqb3B0aW9ucykpOworCWlmIChvcHRpb25zKQorCQlvcHRpb25zX2luaXQob3B0aW9ucyk7CisKKwlyZXR1cm4gb3B0aW9uczsKK30KKworc3RhdGljIGludCBvcHRpb25zX2VtcHR5KHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zKQoreworCXJldHVybiBvcHRpb25zLT5jb3VudCA9PSAwOworfQorCitzdGF0aWMgdm9pZCBvcHRpb25zX3RhaWxfaW5zZXJ0KHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLAorCQkJCXN0cnVjdCBtb3VudF9vcHRpb24gKm9wdGlvbikKK3sKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpwcmV2ID0gb3B0aW9ucy0+dGFpbDsKKworCW9wdGlvbi0+bmV4dCA9IE5VTEw7CisJb3B0aW9uLT5wcmV2ID0gcHJldjsKKworCWlmIChwcmV2KQorCQlwcmV2LT5uZXh0ID0gb3B0aW9uOworCWVsc2UKKwkJb3B0aW9ucy0+aGVhZCA9IG9wdGlvbjsKKwlvcHRpb25zLT50YWlsID0gb3B0aW9uOworCisJb3B0aW9ucy0+Y291bnQrKzsKK30KKworc3RhdGljIHZvaWQgb3B0aW9uc19kZWxldGUoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsCisJCQkgICBzdHJ1Y3QgbW91bnRfb3B0aW9uICpvcHRpb24pCit7CisJc3RydWN0IG1vdW50X29wdGlvbiAqcHJldiA9IG9wdGlvbi0+cHJldjsKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpuZXh0ID0gb3B0aW9uLT5uZXh0OworCisJaWYgKCFvcHRpb25zX2VtcHR5KG9wdGlvbnMpKSB7CisJCWlmIChwcmV2KQorCQkJcHJldi0+bmV4dCA9IG9wdGlvbi0+bmV4dDsKKwkJaWYgKG5leHQpCisJCQluZXh0LT5wcmV2ID0gb3B0aW9uLT5wcmV2OworCisJCWlmIChvcHRpb25zLT5oZWFkID09IG9wdGlvbikKKwkJCW9wdGlvbnMtPmhlYWQgPSBvcHRpb24tPm5leHQ7CisJCWlmIChvcHRpb25zLT50YWlsID09IG9wdGlvbikKKwkJCW9wdGlvbnMtPnRhaWwgPSBwcmV2OworCisJCW9wdGlvbnMtPmNvdW50LS07CisKKwkJb3B0aW9uX2Rlc3Ryb3kob3B0aW9uKTsKKwl9Cit9CisKKworLyoqCisgKiBwb19kZXN0cm95IC0gZGVhbGxvY2F0ZSBhIGdyb3VwIG9mIG1vdW50IG9wdGlvbnMKKyAqIEBvcHRpb25zOiBwb2ludGVyIHRvIG1vdW50IG9wdGlvbnMgdG8gZnJlZQorICoKKyAqLwordm9pZCBwb19kZXN0cm95KHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zKQoreworCWlmIChvcHRpb25zKSB7CisJCXdoaWxlICghb3B0aW9uc19lbXB0eShvcHRpb25zKSkKKwkJCW9wdGlvbnNfZGVsZXRlKG9wdGlvbnMsIG9wdGlvbnMtPmhlYWQpOworCQlmcmVlKG9wdGlvbnMpOworCX0KK30KKworLyoqCisgKiBwb19zcGxpdCAtIHNwbGl0IG9wdGlvbnMgc3RyaW5nIGludG8gZ3JvdXAgb2Ygb3B0aW9ucworICogQG9wdGlvbnM6IHBvaW50ZXIgdG8gQyBzdHJpbmcgY29udGFpbmluZyB6ZXJvIG9yIG1vcmUgY29tbWEtZGVsaW1pdGVkIG9wdGlvbnMKKyAqCisgKiBDb252ZXJ0IG91ciBtb3VudCBvcHRpb25zIHN0cmluZyB0byBhIGxpc3QgdG8gbWFrZSBpdCBlYXNpZXIKKyAqIHRvIGFkanVzdCB0aGUgb3B0aW9ucyBhcyB3ZSBnby4gIFRoaXMgaXMganVzdCBhbiBleGVyY2lzZSBpbgorICogbGV4aWNhbCBwYXJzaW5nIC0tIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBwYXkgYXR0ZW50aW9uIHRvIHRoZQorICogbWVhbmluZyBvZiB0aGUgb3B0aW9ucyB0aGVtc2VsdmVzLgorICoKKyAqIFJldHVybnMgYSBuZXcgZ3JvdXAgb2YgbW91bnQgb3B0aW9ucyBpZiBzdWNjZXNzZnVsOyBvdGhlcndpc2UgTlVMTAorICogaXMgcmV0dXJuZWQgaWYgc29tZSBmYWlsdXJlIG9jY3VycmVkLgorICovCitzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqcG9fc3BsaXQoY2hhciAqc3RyKQoreworCXN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zOworCXN0cnVjdCB0b2tlbml6ZXJfc3RhdGUgKnRzdGF0ZTsKKwljaGFyICpvcHQ7CisKKwlpZiAoIXN0cikKKwkJcmV0dXJuIG9wdGlvbnNfY3JlYXRlKCk7CisKKwlvcHRpb25zID0gb3B0aW9uc19jcmVhdGUoKTsKKwlpZiAob3B0aW9ucykgeworCQl0c3RhdGUgPSBpbml0X3Rva2VuaXplcihzdHIsICcsJyk7CisJCWZvciAob3B0ID0gbmV4dF90b2tlbih0c3RhdGUpOyBvcHQ7IG9wdCA9IG5leHRfdG9rZW4odHN0YXRlKSkgeworCQkJc3RydWN0IG1vdW50X29wdGlvbiAqb3B0aW9uID0gb3B0aW9uX2NyZWF0ZShvcHQpOworCQkJZnJlZShvcHQpOworCQkJaWYgKCFvcHRpb24pCisJCQkJZ290byBmYWlsOworCQkJb3B0aW9uc190YWlsX2luc2VydChvcHRpb25zLCBvcHRpb24pOworCQl9CisJCWlmICh0b2tlbml6ZXJfZXJyb3IodHN0YXRlKSkKKwkJCWdvdG8gZmFpbDsKKwkJZW5kX3Rva2VuaXplcih0c3RhdGUpOworCX0KKwlyZXR1cm4gb3B0aW9uczsKKworZmFpbDoKKwllbmRfdG9rZW5pemVyKHRzdGF0ZSk7CisJcG9fZGVzdHJveShvcHRpb25zKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBwb19kdXAgLSBkdXBsaWNhdGUgYW4gZXhpc3RpbmcgbGlzdCBvZiBvcHRpb25zCisgKiBAb3B0aW9uczogcG9pbnRlciB0byBtb3VudCBvcHRpb25zCisgKgorICovCitzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqcG9fZHVwKHN0cnVjdCBtb3VudF9vcHRpb25zICpzb3VyY2UpCit7CisJc3RydWN0IG1vdW50X29wdGlvbnMgKnRhcmdldDsKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpjdXJyZW50OworCisJaWYgKCFzb3VyY2UpCisJCXJldHVybiBOVUxMOworCisJdGFyZ2V0ID0gb3B0aW9uc19jcmVhdGUoKTsKKwlpZiAob3B0aW9uc19lbXB0eShzb3VyY2UpIHx8IHRhcmdldCA9PSBOVUxMKQorCQlyZXR1cm4gdGFyZ2V0OworCisJY3VycmVudCA9IHNvdXJjZS0+aGVhZDsKKwl3aGlsZSAodGFyZ2V0LT5jb3VudCA8IHNvdXJjZS0+Y291bnQpIHsKKwkJc3RydWN0IG1vdW50X29wdGlvbiAqb3B0aW9uOworCisJCW9wdGlvbiA9IG9wdGlvbl9kdXAoY3VycmVudCk7CisJCWlmICghb3B0aW9uKSB7CisJCQlwb19kZXN0cm95KHRhcmdldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW9wdGlvbnNfdGFpbF9pbnNlcnQodGFyZ2V0LCBvcHRpb24pOworCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gdGFyZ2V0OworfQorCisvKioKKyAqIHBvX3JlcGxhY2UgLSByZXBsYWNlIG1vdW50IG9wdGlvbnMgaW4gb25lIG1vdW50X29wdGlvbnMgb2JqZWN0IHdpdGggYW5vdGhlcgorICogQHRhcmdldDogcG9pbnRlciB0byBwcmV2aW91c2x5IGluc3RhbnRpYXRlZCBvYmplY3QgdG8gcmVwbGFjZQorICogQHNvdXJjZTogcG9pbnRlciB0byBvYmplY3QgY29udGFpbmluZyBzb3VyY2UgbW91bnQgb3B0aW9ucworICoKKyAqIFNpZGUgZWZmZWN0OiB0aGUgb2JqZWN0IHJlZmVycmVkIHRvIGJ5IHNvdXJjZSBpcyBlbXB0aWVkLgorICovCit2b2lkIHBvX3JlcGxhY2Uoc3RydWN0IG1vdW50X29wdGlvbnMgKnRhcmdldCwgc3RydWN0IG1vdW50X29wdGlvbnMgKnNvdXJjZSkKK3sKKwlpZiAodGFyZ2V0KSB7CisJCXdoaWxlICghb3B0aW9uc19lbXB0eSh0YXJnZXQpKQorCQkJb3B0aW9uc19kZWxldGUodGFyZ2V0LCB0YXJnZXQtPmhlYWQpOworCisJCWlmIChzb3VyY2UpIHsKKwkJCXRhcmdldC0+aGVhZCA9IHNvdXJjZS0+aGVhZDsKKwkJCXRhcmdldC0+dGFpbCA9IHNvdXJjZS0+dGFpbDsKKwkJCXRhcmdldC0+Y291bnQgPSBzb3VyY2UtPmNvdW50OworCisJCQlvcHRpb25zX2luaXQoc291cmNlKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBwb19qb2luIC0gcmVjb21iaW5lIGdyb3VwIG9mIG1vdW50IG9wdGlvbnMgaW50byBhIEMgc3RyaW5nCisgKiBAb3B0aW9uczogcG9pbnRlciB0byBtb3VudCBvcHRpb25zIHRvIHJlY29tYmluZQorICogQHN0cjogaGFuZGxlIG9uIHN0cmluZyB0byByZXBsYWNlIChpbnB1dCBhbmQgb3V0cHV0KQorICoKKyAqIENvbnZlcnQgb3VyIG1vdW50IG9wdGlvbnMgb2JqZWN0IGJhY2sgaW50byBhIHN0cmluZyB0aGF0IHRoZQorICogcmVzdCBvZiB0aGUgd29ybGQgY2FuIHVzZS4KKyAqCisgKiBVcG9uIHJldHVybiwgQHN0cmluZyBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhIHJlcGxhY2VtZW50CisgKiBDIHN0cmluZyBjb250YWluaW5nIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgbW91bnQgb3B0aW9ucworICogYW5kIHZhbHVlczsgb3IgdGhlIHBhc3NlZC1pbiBzdHJpbmcgaXMgZnJlZWQgYW5kIE5VTEwgaXMKKyAqIHJldHVybmVkIGlmIHNvbWUgZmFpbHVyZSBvY2N1cnJlZC4KKyAqLworcG9fcmV0dXJuX3QgcG9fam9pbihzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgY2hhciAqKnN0cikKK3sKKwlzaXplX3QgbGVuID0gMDsKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpvcHRpb247CisKKwlpZiAoIXN0ciB8fCAhb3B0aW9ucykKKwkJcmV0dXJuIFBPX0ZBSUxFRDsKKwkJCisJZnJlZSgqc3RyKTsKKwkqc3RyID0gTlVMTDsKKworCWlmIChvcHRpb25zX2VtcHR5KG9wdGlvbnMpKSB7CisJCSpzdHIgPSBzdHJkdXAoIiIpOworCQlyZXR1cm4gKnN0ciA/IFBPX1NVQ0NFRURFRCA6IFBPX0ZBSUxFRDsKKwl9CisKKwlmb3IgKG9wdGlvbiA9IG9wdGlvbnMtPmhlYWQ7IG9wdGlvbjsgb3B0aW9uID0gb3B0aW9uLT5uZXh0KSB7CisJCWxlbiArPSBzdHJsZW4ob3B0aW9uLT5rZXl3b3JkKTsKKwkJaWYgKG9wdGlvbi0+dmFsdWUpCisJCQlsZW4gKz1zdHJsZW4ob3B0aW9uLT52YWx1ZSkgKyAxOyAgLyogZXF1YWxzIHNpZ24gKi8KKwkJaWYgKG9wdGlvbi0+bmV4dCkKKwkJCWxlbisrOyAgLyogY29tbWEgKi8KKwl9CisKKwlsZW4rKzsJLyogTlVMTCBvbiB0aGUgZW5kICovCisKKwkqc3RyID0gbWFsbG9jKGxlbik7CisJaWYgKCEqc3RyKQorCQlyZXR1cm4gUE9fRkFJTEVEOworCSpzdHJbMF0gPSAnXDAnOworCisJZm9yIChvcHRpb24gPSBvcHRpb25zLT5oZWFkOyBvcHRpb247IG9wdGlvbiA9IG9wdGlvbi0+bmV4dCkgeworCQlzdHJjYXQoKnN0ciwgb3B0aW9uLT5rZXl3b3JkKTsKKwkJaWYgKG9wdGlvbi0+dmFsdWUpIHsKKwkJCXN0cmNhdCgqc3RyLCAiPSIpOworCQkJc3RyY2F0KCpzdHIsIG9wdGlvbi0+dmFsdWUpOworCQl9CisJCWlmIChvcHRpb24tPm5leHQpCisJCQlzdHJjYXQoKnN0ciwgIiwiKTsKKwl9CisKKwlyZXR1cm4gUE9fU1VDQ0VFREVEOworfQorCisvKioKKyAqIHBvX2FwcGVuZCAtIGNvbmNhdGVuYXRlIGFuIG9wdGlvbiBvbnRvIGEgZ3JvdXAgb2Ygb3B0aW9ucworICogQG9wdGlvbnM6IHBvaW50ZXIgdG8gbW91bnQgb3B0aW9ucworICogQG9wdGlvbjogcG9pbnRlciB0byBhIEMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9wdGlvbiB0byBhZGQKKyAqCisgKi8KK3BvX3JldHVybl90IHBvX2FwcGVuZChzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgY2hhciAqc3RyKQoreworCXN0cnVjdCBtb3VudF9vcHRpb24gKm9wdGlvbiA9IG9wdGlvbl9jcmVhdGUoc3RyKTsKKworCWlmIChvcHRpb24pIHsKKwkJb3B0aW9uc190YWlsX2luc2VydChvcHRpb25zLCBvcHRpb24pOworCQlyZXR1cm4gUE9fU1VDQ0VFREVEOworCX0KKwlyZXR1cm4gUE9fRkFJTEVEOworfQorCisvKioKKyAqIHBvX2NvbnRhaW5zIC0gY2hlY2sgZm9yIHByZXNlbnNlIG9mIGFuIG9wdGlvbiBpbiBhIGdyb3VwCisgKiBAb3B0aW9uczogcG9pbnRlciB0byBtb3VudCBvcHRpb25zCisgKiBAa2V5d29yZDogcG9pbnRlciB0byBhIEMgc3RyaW5nIGNvbnRhaW5pbmcgb3B0aW9uIGtleXdvcmQgZm9yIHdoaWNoIHRvIHNlYXJjaAorICoKKyAqLworcG9fZm91bmRfdCBwb19jb250YWlucyhzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgY2hhciAqa2V5d29yZCkKK3sKKwlzdHJ1Y3QgbW91bnRfb3B0aW9uICpvcHRpb247CisKKwlpZiAob3B0aW9ucyAmJiBrZXl3b3JkKSB7CisJCWZvciAob3B0aW9uID0gb3B0aW9ucy0+aGVhZDsgb3B0aW9uOyBvcHRpb24gPSBvcHRpb24tPm5leHQpCisJCQlpZiAoc3RyY21wKG9wdGlvbi0+a2V5d29yZCwga2V5d29yZCkgPT0gMCkKKwkJCQlyZXR1cm4gUE9fRk9VTkQ7CisJfQorCisJcmV0dXJuIFBPX05PVF9GT1VORDsKK30KKworLyoqCisgKiBwb19nZXQgLSByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByaWdodG1vc3QgaW5zdGFuY2Ugb2YgYW4gb3B0aW9uCisgKiBAb3B0aW9uczogcG9pbnRlciB0byBtb3VudCBvcHRpb25zCisgKiBAa2V5d29yZDogcG9pbnRlciB0byBhIEMgc3RyaW5nIGNvbnRhaW5pbmcgb3B0aW9uIGtleXdvcmQgZm9yIHdoaWNoIHRvIHNlYXJjaAorICoKKyAqIElmIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvcHRpb24gYXJlIHByZXNlbnQgaW4gYSBtb3VudCBvcHRpb24KKyAqIGxpc3QsIHRoZSByaWdodG1vc3QgaW5zdGFuY2UgaXMgYWx3YXlzIHRoZSBlZmZlY3RpdmUgb25lLgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBDIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLgorICogUmV0dXJucyBOVUxMIGlmIHRoZSBvcHRpb24gaXNuJ3QgZm91bmQsIG9yIGlmIHRoZSBvcHRpb24gZG9lc24ndAorICogaGF2ZSBhIHZhbHVlLgorICovCitjaGFyICpwb19nZXQoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIGNoYXIgKmtleXdvcmQpCit7CisJc3RydWN0IG1vdW50X29wdGlvbiAqb3B0aW9uOworCisJaWYgKG9wdGlvbnMgJiYga2V5d29yZCkgeworCQlmb3IgKG9wdGlvbiA9IG9wdGlvbnMtPnRhaWw7IG9wdGlvbjsgb3B0aW9uID0gb3B0aW9uLT5wcmV2KQorCQkJaWYgKHN0cmNtcChvcHRpb24tPmtleXdvcmQsIGtleXdvcmQpID09IDApCisJCQkJcmV0dXJuIG9wdGlvbi0+dmFsdWU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcG9fZ2V0X251bWVyaWMgLSByZXR1cm4gbnVtZXJpYyB2YWx1ZSBvZiByaWdodG1vc3QgaW5zdGFuY2Ugb2Yga2V5d29yZCBvcHRpb24KKyAqIEBvcHRpb25zOiBwb2ludGVyIHRvIG1vdW50IG9wdGlvbnMKKyAqIEBrZXl3b3JkOiBwb2ludGVyIHRvIGEgQyBzdHJpbmcgY29udGFpbmluZyBvcHRpb24ga2V5d29yZCBmb3Igd2hpY2ggdG8gc2VhcmNoCisgKiBAdmFsdWU6IE9VVDogc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUga2V5d29yZAorICoKKyAqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IGZvciBwYXJzaW5nIGtleXdvcmQgb3B0aW9ucyB0aGF0IHRha2Ugb25seSBhIG51bWVyaWMKKyAqIHZhbHVlLiAgSWYgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9wdGlvbiBhcmUgcHJlc2VudCBpbiBhIG1vdW50CisgKiBvcHRpb24gbGlzdCwgdGhlIHJpZ2h0bW9zdCBpbnN0YW5jZSBpcyBhbHdheXMgdGhlIGVmZmVjdGl2ZSBvbmUuCisgKgorICogUmV0dXJuczoKKyAqCSogUE9fRk9VTkQgaWYgdGhlIGtleXdvcmQgd2FzIGZvdW5kIGFuZCB0aGUgdmFsdWUgaXMgbnVtZXJpYzsgQHZhbHVlIGlzCisgKgkgIHNldCB0byB0aGUga2V5d29yZCdzIHZhbHVlCisgKgkqIFBPX05PVF9GT1VORCBpZiB0aGUga2V5d29yZCB3YXMgbm90IGZvdW5kCisgKgkqIFBPX0JBRF9WQUxVRSBpZiB0aGUga2V5d29yZCB3YXMgZm91bmQsIGJ1dCB0aGUgdmFsdWUgaXMgbm90IG51bWVyaWMKKyAqCisgKiBUaGVzZSBsYXN0IHR3byBhcmUgc2VwYXJhdGUgaW4gY2FzZSB0aGUgY2FsbGVyIHdhbnRzIHRvIHdhcm4gYWJvdXQgYmFkIG1vdW50CisgKiBvcHRpb25zIGluc3RlYWQgb2Ygc2lsZW50bHkgdXNpbmcgYSBkZWZhdWx0LgorICovCisjaWZkZWYgSEFWRV9TVFJUT0wKK3BvX2ZvdW5kX3QgcG9fZ2V0X251bWVyaWMoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsIGNoYXIgKmtleXdvcmQsIGxvbmcgKnZhbHVlKQoreworCWNoYXIgKm9wdGlvbiwgKmVuZHB0cjsKKwlsb25nIHRtcDsKKworCW9wdGlvbiA9IHBvX2dldChvcHRpb25zLCBrZXl3b3JkKTsKKwlpZiAob3B0aW9uID09IE5VTEwpCisJCXJldHVybiBQT19OT1RfRk9VTkQ7CisKKwllcnJubyA9IDA7CisJdG1wID0gc3RydG9sKG9wdGlvbiwgJmVuZHB0ciwgMTApOworCWlmIChlcnJubyA9PSAwICYmIGVuZHB0ciAhPSBvcHRpb24pIHsKKwkJKnZhbHVlID0gdG1wOworCQlyZXR1cm4gUE9fRk9VTkQ7CisJfQorCXJldHVybiBQT19CQURfVkFMVUU7Cit9CisjZWxzZQkvKiBIQVZFX1NUUlRPTCAqLworcG9fZm91bmRfdCBwb19nZXRfbnVtZXJpYyhzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgY2hhciAqa2V5d29yZCwgbG9uZyAqdmFsdWUpCit7CisJY2hhciAqb3B0aW9uOworCisJb3B0aW9uID0gcG9fZ2V0KG9wdGlvbnMsIGtleXdvcmQpOworCWlmIChvcHRpb24gPT0gTlVMTCkKKwkJcmV0dXJuIFBPX05PVF9GT1VORDsKKworCSp2YWx1ZSA9IGF0b2kob3B0aW9uKTsKKwlyZXR1cm4gUE9fRk9VTkQ7Cit9CisjZW5kaWYJLyogSEFWRV9TVFJUT0wgKi8KKworLyoqCisgKiBwb19yaWdodG1vc3QgLSBkZXRlcm1pbmUgdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHNldmVyYWwgb3B0aW9ucworICogQG9wdGlvbnM6IHBvaW50ZXIgdG8gbW91bnQgb3B0aW9ucworICogQGtleXM6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgQyBzdHJpbmdzIGNvbnRhaW5pbmcgb3B0aW9uIGtleXdvcmRzCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggb2Ygc2V2ZXJhbCBzaW1pbGFyCisgKiBvcHRpb25zIHdpbGwgYmUgdGhlIG9uZSB0byB0YWtlIGVmZmVjdC4KKyAqCisgKiBUaGUga2VybmVsIHBhcnNlcyB0aGUgbW91bnQgb3B0aW9uIHN0cmluZyBmcm9tIGxlZnQgdG8gcmlnaHQuCisgKiBJZiBhbiBvcHRpb24gaXMgc3BlY2lmaWVkIG1vcmUgdGhhbiBvbmNlIChmb3IgZXhhbXBsZSwgImludHIiCisgKiBhbmQgIm5vaW50ciIsIHRoZSByaWdodG1vc3Qgb3B0aW9uIGlzIHRoZSBsYXN0IHRvIGJlIHBhcnNlZCwKKyAqIGFuZCBpdCB0aGVyZWZvcmUgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHByZXZpb3VzIHNpbWlsYXIgb3B0aW9ucy4KKyAqCisgKiBUaGlzIGNhbiBhbHNvIGRpc3Rpbmd1aXNoIGFtb25nIG11bHRpcGxlIHN5bm9ueW1vdXMgb3B0aW9ucywgc3VjaAorICogYXMgInByb3RvPSwiICJ1ZHAiIGFuZCAidGNwLiIKKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRleCBpbnRvIEBrZXlzIG9mIHRoZSBvcHRpb24gdGhhdCBpcyByaWdodG1vc3QuCisgKiBJZiBub25lIG9mIHRoZSBvcHRpb25zIGxpc3RlZCBpbiBAa2V5cyBpcyBwcmVzZW50IGluIEBvcHRpb25zLCBvcgorICogaWYgQG9wdGlvbnMgaXMgTlVMTCwgcmV0dXJucyAtMS4KKyAqLworaW50IHBvX3JpZ2h0bW9zdChzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywgY29uc3QgY2hhciAqa2V5c1tdKQoreworCXN0cnVjdCBtb3VudF9vcHRpb24gKm9wdGlvbjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChvcHRpb25zKSB7CisJCWZvciAob3B0aW9uID0gb3B0aW9ucy0+dGFpbDsgb3B0aW9uOyBvcHRpb24gPSBvcHRpb24tPnByZXYpIHsKKwkJCWZvciAoaSA9IDA7IGtleXNbaV0gIT0gTlVMTDsgaSsrKQorCQkJCWlmIChzdHJjbXAob3B0aW9uLT5rZXl3b3JkLCBrZXlzW2ldKSA9PSAwKQorCQkJCQlyZXR1cm4gaTsKKwkJfQorCX0KKworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBwb19yZW1vdmVfYWxsIC0gcmVtb3ZlIGluc3RhbmNlcyBvZiBhbiBvcHRpb24gZnJvbSBhIGdyb3VwCisgKiBAb3B0aW9uczogcG9pbnRlciB0byBtb3VudCBvcHRpb25zCisgKiBAa2V5d29yZDogcG9pbnRlciB0byBhIEMgc3RyaW5nIGNvbnRhaW5pbmcgYW4gb3B0aW9uIGtleXdvcmQgdG8gcmVtb3ZlCisgKgorICogU2lkZS1lZmZlY3Q6IHRoZSBwYXNzZWQtaW4gbGlzdCBpcyB0cnVuY2F0ZWQgb24gc3VjY2Vzcy4KKyAqLworcG9fZm91bmRfdCBwb19yZW1vdmVfYWxsKHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zLCBjaGFyICprZXl3b3JkKQoreworCXN0cnVjdCBtb3VudF9vcHRpb24gKm9wdGlvbiwgKm5leHQ7CisJaW50IGZvdW5kID0gUE9fTk9UX0ZPVU5EOworCisJaWYgKG9wdGlvbnMgJiYga2V5d29yZCkgeworCQlmb3IgKG9wdGlvbiA9IG9wdGlvbnMtPmhlYWQ7IG9wdGlvbjsgb3B0aW9uID0gbmV4dCkgeworCQkJbmV4dCA9IG9wdGlvbi0+bmV4dDsKKwkJCWlmIChzdHJjbXAob3B0aW9uLT5rZXl3b3JkLCBrZXl3b3JkKSA9PSAwKSB7CisJCQkJb3B0aW9uc19kZWxldGUob3B0aW9ucywgb3B0aW9uKTsKKwkJCQlmb3VuZCA9IFBPX0ZPVU5EOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGZvdW5kOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3BhcnNlX29wdC5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3BhcnNlX29wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGI1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvcGFyc2Vfb3B0LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIHBhcnNlX29wdC5oIC0tIG1vdW50IG9wdGlvbiBzdHJpbmcgcGFyc2luZyBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQ2h1Y2sgTGV2ZXIgPGNodWNrLmxldmVyQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9ORlNfVVRJTFNfUEFSU0VfT1BUX0gKKyNkZWZpbmUgX05GU19VVElMU19QQVJTRV9PUFRfSAorCit0eXBlZGVmIGVudW0geworCVBPX0ZBSUxFRCA9IDAsCisJUE9fU1VDQ0VFREVEID0gMSwKK30gcG9fcmV0dXJuX3Q7CisKK3R5cGVkZWYgZW51bSB7CisJUE9fTk9UX0ZPVU5EID0gMCwKKwlQT19GT1VORCA9IDEsCisJUE9fQkFEX1ZBTFVFID0gMiwKK30gcG9fZm91bmRfdDsKKworc3RydWN0IG1vdW50X29wdGlvbnM7CisKK3N0cnVjdCBtb3VudF9vcHRpb25zICoJcG9fc3BsaXQoY2hhciAqKTsKK3N0cnVjdCBtb3VudF9vcHRpb25zICoJcG9fZHVwKHN0cnVjdCBtb3VudF9vcHRpb25zICopOwordm9pZAkJCXBvX3JlcGxhY2Uoc3RydWN0IG1vdW50X29wdGlvbnMgKiwKKwkJCQkgICBzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqKTsKK3BvX3JldHVybl90CQlwb19qb2luKHN0cnVjdCBtb3VudF9vcHRpb25zICosIGNoYXIgKiopOworCitwb19yZXR1cm5fdAkJcG9fYXBwZW5kKHN0cnVjdCBtb3VudF9vcHRpb25zICosIGNoYXIgKik7Citwb19mb3VuZF90CQlwb19jb250YWlucyhzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqLCBjaGFyICopOworY2hhciAqCQkJcG9fZ2V0KHN0cnVjdCBtb3VudF9vcHRpb25zICosIGNoYXIgKik7Citwb19mb3VuZF90CQlwb19nZXRfbnVtZXJpYyhzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqLAorCQkJCQljaGFyICosIGxvbmcgKik7CitpbnQJCQlwb19yaWdodG1vc3Qoc3RydWN0IG1vdW50X29wdGlvbnMgKiwKKwkJCQkJY29uc3QgY2hhciAqa2V5c1tdKTsKK3BvX2ZvdW5kX3QJCXBvX3JlbW92ZV9hbGwoc3RydWN0IG1vdW50X29wdGlvbnMgKiwgY2hhciAqKTsKK3ZvaWQJCQlwb19kZXN0cm95KHN0cnVjdCBtb3VudF9vcHRpb25zICopOworCisjZW5kaWYJLyogX05GU19VVElMU19QQVJTRV9PUFRfSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3N0cm9wdHMuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9zdHJvcHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4YzM4ZgotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC9zdHJvcHRzLmMKQEAgLTAsMCArMSw5ODIgQEAKKy8qCisgKiBzdHJvcHRzLmMgLS0gTkZTIG1vdW50IHVzaW5nIEMgc3RyaW5nIHRvIHBhc3Mgb3B0aW9ucyB0byBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBDaHVjayBMZXZlciA8Y2h1Y2subGV2ZXJAb3JhY2xlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJ4Y29tbW9uLmgiCisjaW5jbHVkZSAibW91bnQuaCIKKyNpbmNsdWRlICJubHMuaCIKKyNpbmNsdWRlICJuZnNycGMuaCIKKyNpbmNsdWRlICJtb3VudF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJzdHJvcHRzLmgiCisjaW5jbHVkZSAiZXJyb3IuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAicGFyc2Vfb3B0LmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgorI2luY2x1ZGUgInBhcnNlX2Rldi5oIgorI2luY2x1ZGUgImNvbmZmaWxlLmgiCisKKyNpZm5kZWYgSEFWRV9ERUNMX0FJX0FERFJDT05GSUcKKyNkZWZpbmUgQUlfQUREUkNPTkZJRwkwCisjZW5kaWYKKworI2lmbmRlZiBORlNfUFJPR1JBTQorI2RlZmluZSBORlNfUFJPR1JBTQkoMTAwMDAzKQorI2VuZGlmCisKKyNpZm5kZWYgTkZTX1BPUlQKKyNkZWZpbmUgTkZTX1BPUlQJKDIwNDkpCisjZW5kaWYKKworI2lmbmRlZiBORlNfTUFYSE9TVE5BTUUKKyNkZWZpbmUgTkZTX01BWEhPU1ROQU1FCQkoMjU1KQorI2VuZGlmCisKKyNpZm5kZWYgTkZTX01BWFBBVEhOQU1FCisjZGVmaW5lIE5GU19NQVhQQVRITkFNRQkJKDEwMjQpCisjZW5kaWYKKworI2lmbmRlZiBORlNfREVGX0ZHX1RJTUVPVVRfTUlOVVRFUworI2RlZmluZSBORlNfREVGX0ZHX1RJTUVPVVRfTUlOVVRFUwkoMnUpCisjZW5kaWYKKworI2lmbmRlZiBORlNfREVGX0JHX1RJTUVPVVRfTUlOVVRFUworI2RlZmluZSBORlNfREVGX0JHX1RJTUVPVVRfTUlOVVRFUwkoMTAwMDB1KQorI2VuZGlmCisKK2V4dGVybiBpbnQgbmZzX21vdW50X2RhdGFfdmVyc2lvbjsKK2V4dGVybiBjaGFyICpwcm9nbmFtZTsKK2V4dGVybiBpbnQgdmVyYm9zZTsKK2V4dGVybiBpbnQgc2xvcHB5OworCitzdHJ1Y3QgbmZzbW91bnRfaW5mbyB7CisJY29uc3QgY2hhcgkJKnNwZWMsCQkvKiBzZXJ2ZXI6L3BhdGggKi8KKwkJCQkqbm9kZSwJCS8qIG1vdW50ZWQtb24gZGlyICovCisJCQkJKnR5cGU7CQkvKiAibmZzIiBvciAibmZzNCIgKi8KKwljaGFyCQkJKmhvc3RuYW1lOwkvKiBzZXJ2ZXIncyBob3N0bmFtZSAqLworCXN0cnVjdCBhZGRyaW5mbwkJKmFkZHJlc3M7CS8qIHNlcnZlcidzIGFkZHJlc3NlcyAqLworCisJc3RydWN0IG1vdW50X29wdGlvbnMJKm9wdGlvbnM7CS8qIHBhcnNlZCBtb3VudCBvcHRpb25zICovCisJY2hhcgkJCSoqZXh0cmFfb3B0czsJLyogc3RyaW5nIGZvciAvZXRjL210YWIgKi8KKworCXVuc2lnbmVkIGxvbmcJCXZlcnNpb247CS8qIE5GUyB2ZXJzaW9uICovCisJaW50CQkJZmxhZ3MsCQkvKiBNU18gZmxhZ3MgKi8KKwkJCQlmYWtlLAkJLyogYWN0dWFsbHkgZG8gdGhlIG1vdW50PyAqLworCQkJCWNoaWxkOwkJLyogZm9ya2VkIGJnIGNoaWxkPyAqLworfTsKKworI2lmZGVmIE1PVU5UX0NPTkZJRworc3RhdGljIHZvaWQgbmZzX2RlZmF1bHRfdmVyc2lvbihzdHJ1Y3QgbmZzbW91bnRfaW5mbyAqbWkpOworCitzdGF0aWMgdm9pZCBuZnNfZGVmYXVsdF92ZXJzaW9uKHN0cnVjdCBuZnNtb3VudF9pbmZvICptaSkKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBjb25maWdfZGVmYXVsdF92ZXJzOworCS8qCisJICogVXNlIHRoZSBkZWZhdWx0IHZhbHVlIHNldCBpbiB0aGUgY29uZmlnIGZpbGUgd2hlbgorCSAqIHRoZSB2ZXJzaW9uIGhhcyBub3QgYmVlbiBleHBsaWNpdGx5IHNldC4KKwkgKi8KKwlpZiAobWktPnZlcnNpb24gPT0gMCAmJiBjb25maWdfZGVmYXVsdF92ZXJzKSB7CisJCWlmIChjb25maWdfZGVmYXVsdF92ZXJzIDwgNCkKKwkJCW1pLT52ZXJzaW9uID0gY29uZmlnX2RlZmF1bHRfdmVyczsKKwl9Cit9CisjZWxzZQoraW5saW5lIHZvaWQgbmZzX2RlZmF1bHRfdmVyc2lvbihzdHJ1Y3QgbmZzbW91bnRfaW5mbyAqbWkpIHt9CisjZW5kaWYgLyogTU9VTlRfQ09ORklHICovCisKKy8qCisgKiBPYnRhaW4gYSByZXRyeSB0aW1lb3V0IHZhbHVlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgInJldHJ5PSIgb3B0aW9uLgorICoKKyAqIFJldHVybnMgYSB0aW1lX3QgdGltZW91dCB0aW1lc3RhbXAsIGluIHNlY29uZHMuCisgKi8KK3N0YXRpYyB0aW1lX3QgbmZzX3BhcnNlX3JldHJ5X29wdGlvbihzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywKKwkJCQkgICAgIHVuc2lnbmVkIGludCB0aW1lb3V0X21pbnV0ZXMpCit7CisJbG9uZyB0bXA7CisKKwlzd2l0Y2ggKHBvX2dldF9udW1lcmljKG9wdGlvbnMsICJyZXRyeSIsICZ0bXApKSB7CisJY2FzZSBQT19OT1RfRk9VTkQ6CisJCWJyZWFrOworCWNhc2UgUE9fRk9VTkQ6CisJCWlmICh0bXAgPj0gMCkgeworCQkJdGltZW91dF9taW51dGVzID0gdG1wOworCQkJYnJlYWs7CisJCX0KKwljYXNlIFBPX0JBRF9WQUxVRToKKwkJaWYgKHZlcmJvc2UpCisJCQluZnNfZXJyb3IoXygiJXM6IGludmFsaWQgcmV0cnkgdGltZW91dCB3YXMgc3BlY2lmaWVkOyAiCisJCQkJCSJ1c2luZyBkZWZhdWx0IHRpbWVvdXQiKSwgcHJvZ25hbWUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdGltZShOVUxMKSArICh0aW1lX3QpKHRpbWVvdXRfbWludXRlcyAqIDYwKTsKK30KKworLyoKKyAqIENvbnZlcnQgdGhlIHBhc3NlZC1pbiBzb2NrYWRkci1zdHlsZSBhZGRyZXNzIHRvIHByZXNlbnRhdGlvbgorICogZm9ybWF0LCB0aGVuIGFwcGVuZCBhbiBvcHRpb24gb2YgdGhlIGZvcm0gImtleXdvcmQ9YWRkcmVzcyIuCisgKgorICogUmV0dXJucyAxIGlmIHRoZSBvcHRpb24gd2FzIGFwcGVuZGVkIHN1Y2Nlc3NmdWxseTsgb3RoZXJ3aXNlIHplcm8uCisgKi8KK3N0YXRpYyBpbnQgbmZzX2FwcGVuZF9nZW5lcmljX2FkZHJlc3Nfb3B0aW9uKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCQkgICAgIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJCQkJICAgICBjb25zdCBjaGFyICprZXl3b3JkLAorCQkJCQkgICAgIHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zKQoreworCWNoYXIgYWRkcmVzc1tOSV9NQVhIT1NUXTsKKwljaGFyIG5ld19vcHRpb25bNTEyXTsKKwlpbnQgbGVuOworCisJaWYgKCFuZnNfcHJlc2VudF9zb2NrYWRkcihzYXAsIHNhbGVuLCBhZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpKQorCQlnb3RvIG91dF9lcnI7CisKKwlsZW4gPSBzbnByaW50ZihuZXdfb3B0aW9uLCBzaXplb2YobmV3X29wdGlvbiksICIlcz0lcyIsCisJCQkJCQlrZXl3b3JkLCBhZGRyZXNzKTsKKwlpZiAobGVuIDwgMCB8fCAoc2l6ZV90KWxlbiA+PSBzaXplb2YobmV3X29wdGlvbikpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChwb19hcHBlbmQob3B0aW9ucywgbmV3X29wdGlvbikgIT0gUE9fU1VDQ0VFREVEKQorCQlnb3RvIG91dF9lcnI7CisKKwlyZXR1cm4gMTsKKworb3V0X2VycjoKKwluZnNfZXJyb3IoXygiJXM6IGZhaWxlZCB0byBjb25zdHJ1Y3QgJXMgb3B0aW9uIiksIHByb2duYW1lLCBrZXl3b3JkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFwcGVuZCB0aGUgJ2FkZHI9JyBvcHRpb24gdG8gdGhlIG9wdGlvbnMgc3RyaW5nIHRvIHBhc3MgYSByZXNvbHZlZAorICogc2VydmVyIGFkZHJlc3MgdG8gdGhlIGtlcm5lbC4gIEFmdGVyIGEgc3VjY2Vzc2Z1bCBtb3VudCwgdGhpcyBhZGRyZXNzCisgKiBpcyBhbHNvIGFkZGVkIHRvIC9ldGMvbXRhYiBmb3IgdXNlIHdoZW4gdW5tb3VudGluZy4KKyAqCisgKiBJZiAnYWRkcj0nIGlzIGFscmVhZHkgcHJlc2VudCwgd2Ugc3RyaXAgaXQgb3V0LiAgVGhpcyBwcmV2ZW50cyB1c2VycworICogZnJvbSBzZXR0aW5nIGEgYm9ndXMgJ2FkZHI9JyBvcHRpb24gdGhlbXNlbHZlcywgYW5kIGFsc28gYWxsb3dzIGJnCisgKiByZXRyaWVzIHRvIHJlY29tcHV0ZSB0aGUgc2VydmVyJ3MgYWRkcmVzcywgaW4gY2FzZSBpdCBoYXMgY2hhbmdlZC4KKyAqCisgKiBSZXR1cm5zIDEgaWYgJ2FkZHI9JyBvcHRpb24gYXBwZW5kZWQgc3VjY2Vzc2Z1bGx5OworICogb3RoZXJ3aXNlIHplcm8uCisgKi8KK3N0YXRpYyBpbnQgbmZzX2FwcGVuZF9hZGRyX29wdGlvbihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJCQkgIHNvY2tsZW5fdCBzYWxlbiwKKwkJCQkgIHN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zKQoreworCXBvX3JlbW92ZV9hbGwob3B0aW9ucywgImFkZHIiKTsKKwlyZXR1cm4gbmZzX2FwcGVuZF9nZW5lcmljX2FkZHJlc3Nfb3B0aW9uKHNhcCwgc2FsZW4sICJhZGRyIiwgb3B0aW9ucyk7Cit9CisKKy8qCisgKiBDYWxsZWQgdG8gZGlzY292ZXIgb3VyIGFkZHJlc3MgYW5kIGFwcGVuZCBhbiBhcHByb3ByaWF0ZSAnY2xpZW50YWRkcj0nCisgKiBvcHRpb24gdG8gdGhlIG9wdGlvbnMgc3RyaW5nLgorICoKKyAqIFJldHVybnMgMSBpZiAnY2xpZW50YWRkcj0nIG9wdGlvbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseSBvciBpZgorICogJ2NsaWVudGFkZHI9JyBvcHRpb24gaXMgYWxyZWFkeSBwcmVzZW50OyBvdGhlcndpc2UgemVyby4KKyAqLworc3RhdGljIGludCBuZnNfYXBwZW5kX2NsaWVudGFkZHJfb3B0aW9uKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQkJCQlzb2NrbGVuX3Qgc2FsZW4sCisJCQkJCXN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zKQoreworCXVuaW9uIG5mc19zb2NrYWRkciBhZGRyZXNzOworCXN0cnVjdCBzb2NrYWRkciAqbXlfYWRkciA9ICZhZGRyZXNzLnNhOworCXNvY2tsZW5fdCBteV9sZW4gPSBzaXplb2YoYWRkcmVzcyk7CisKKwlpZiAocG9fY29udGFpbnMob3B0aW9ucywgImNsaWVudGFkZHIiKSA9PSBQT19GT1VORCkKKwkJcmV0dXJuIDE7CisKKwluZnNfY2FsbGJhY2tfYWRkcmVzcyhzYXAsIHNhbGVuLCBteV9hZGRyLCAmbXlfbGVuKTsKKworCXJldHVybiBuZnNfYXBwZW5kX2dlbmVyaWNfYWRkcmVzc19vcHRpb24obXlfYWRkciwgbXlfbGVuLAorCQkJCQkJCSJjbGllbnRhZGRyIiwgb3B0aW9ucyk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciB0byBhcHBlbmQgYSAnbW91bnRhZGRyPScgb3B0aW9uLiAgVGhlIG9wdGlvbiBpcyBuZWVkZWQgaWY6CisgKgorICogICAxLiAibW91bnRob3N0PSIgd2FzIHNwZWNpZmllZCwgb3IKKyAqICAgMi4gVGhlIGFkZHJlc3MgZmFtaWxpZXMgZm9yIHByb3RvPSBhbmQgbW91bnRwcm90bz0gYXJlIGRpZmZlcmVudC4KKyAqLworc3RhdGljIGludCBuZnNfZml4X21vdW50aG9zdF9vcHRpb24oc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsCisJCWNvbnN0IGNoYXIgKm5mc19ob3N0bmFtZSkKK3sKKwl1bmlvbiBuZnNfc29ja2FkZHIgYWRkcmVzczsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9ICZhZGRyZXNzLnNhOworCXNvY2tsZW5fdCBzYWxlbiA9IHNpemVvZihhZGRyZXNzKTsKKwlzYV9mYW1pbHlfdCBuZnNfZmFtaWx5LCBtbnRfZmFtaWx5OworCWNoYXIgKm1vdW50aG9zdDsKKworCWlmICghbmZzX25mc19wcm90b19mYW1pbHkob3B0aW9ucywgJm5mc19mYW1pbHkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIW5mc19tb3VudF9wcm90b19mYW1pbHkob3B0aW9ucywgJm1udF9mYW1pbHkpKQorCQlyZXR1cm4gMDsKKworCW1vdW50aG9zdCA9IHBvX2dldChvcHRpb25zLCAibW91bnRob3N0Iik7CisJaWYgKG1vdW50aG9zdCA9PSBOVUxMKSB7CisJCWlmIChuZnNfZmFtaWx5ID09IG1udF9mYW1pbHkpCisJCQlyZXR1cm4gMTsKKwkJbW91bnRob3N0ID0gKGNoYXIgKiluZnNfaG9zdG5hbWU7CisJfQorCisJaWYgKCFuZnNfbG9va3VwKG1vdW50aG9zdCwgbW50X2ZhbWlseSwgc2FwLCAmc2FsZW4pKSB7CisJCW5mc19lcnJvcihfKCIlczogdW5hYmxlIHRvIGRldGVybWluZSBtb3VudCBzZXJ2ZXIncyBhZGRyZXNzIiksCisJCQkJcHJvZ25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbmZzX2FwcGVuZF9nZW5lcmljX2FkZHJlc3Nfb3B0aW9uKHNhcCwgc2FsZW4sCisJCQkJCQkJIm1vdW50YWRkciIsIG9wdGlvbnMpOworfQorCisvKgorICogUmV0dXJucyB6ZXJvIGlmIHRoZSAibG9jayIgb3B0aW9uIGlzIGluIGVmZmVjdCwgYnV0IHN0YXRkCisgKiBjYW4ndCBiZSBzdGFydGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIDEuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpuZnNfbG9ja19vcHR0YmxbXSA9IHsKKwkibm9sb2NrIiwKKwkibG9jayIsCisJTlVMTCwKK307CisKK3N0YXRpYyBpbnQgbmZzX3ZlcmlmeV9sb2NrX29wdGlvbihzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpZiAocG9fcmlnaHRtb3N0KG9wdGlvbnMsIG5mc19sb2NrX29wdHRibCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXN0YXJ0X3N0YXRkKCkpIHsKKwkJbmZzX2Vycm9yKF8oIiVzOiBycGMuc3RhdGQgaXMgbm90IHJ1bm5pbmcgYnV0IGlzICIKKwkJCSAgICAicmVxdWlyZWQgZm9yIHJlbW90ZSBsb2NraW5nLiIpLCBwcm9nbmFtZSk7CisJCW5mc19lcnJvcihfKCIlczogRWl0aGVyIHVzZSAnLW8gbm9sb2NrJyB0byBrZWVwICIKKwkJCSAgICAibG9ja3MgbG9jYWwsIG9yIHN0YXJ0IHN0YXRkLiIpLCBwcm9nbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG5mc19hcHBlbmRfc2xvcHB5X29wdGlvbihzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlpZiAoIXNsb3BweSB8fCBsaW51eF92ZXJzaW9uX2NvZGUoKSA8IE1BS0VfVkVSU0lPTigyLCA2LCAyNykpCisJCXJldHVybiAxOworCisJaWYgKHBvX2FwcGVuZChvcHRpb25zLCAic2xvcHB5IikgPT0gUE9fRkFJTEVEKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBuZnNfc2V0X3ZlcnNpb24oc3RydWN0IG5mc21vdW50X2luZm8gKm1pKQoreworCWlmICghbmZzX25mc192ZXJzaW9uKG1pLT5vcHRpb25zLCAmbWktPnZlcnNpb24pKQorCQlyZXR1cm4gMDsKKworCWlmIChzdHJuY21wKG1pLT50eXBlLCAibmZzNCIsIDQpID09IDApCisJCW1pLT52ZXJzaW9uID0gNDsKKwllbHNlIHsKKwkJY2hhciAqb3B0aW9uID0gcG9fZ2V0KG1pLT5vcHRpb25zLCAicHJvdG8iKTsKKwkJaWYgKG9wdGlvbiAmJiBzdHJjbXAob3B0aW9uLCAicmRtYSIpID09IDApCisJCQltaS0+dmVyc2lvbiA9IDM7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBzdGlsbCBkb24ndCBrbm93LCBjaGVjayBmb3IgdmVyc2lvbi1zcGVjaWZpYworCSAqIG1vdW50IG9wdGlvbnMuCisJICovCisJaWYgKG1pLT52ZXJzaW9uID09IDApIHsKKwkJaWYgKHBvX2NvbnRhaW5zKG1pLT5vcHRpb25zLCAibW91bnRob3N0IikgfHwKKwkJICAgIHBvX2NvbnRhaW5zKG1pLT5vcHRpb25zLCAibW91bnRhZGRyIikgfHwKKwkJICAgIHBvX2NvbnRhaW5zKG1pLT5vcHRpb25zLCAibW91bnR2ZXJzIikgfHwKKwkJICAgIHBvX2NvbnRhaW5zKG1pLT5vcHRpb25zLCAibW91bnRwcm90byIpKQorCQkJbWktPnZlcnNpb24gPSAzOworCX0KKworCS8qCisJICogSWYgZW5hYmxlZCwgc2VlIGlmIHRoZSBkZWZhdWx0IHZlcnNpb24gd2FzCisJICogc2V0IGluIHRoZSBjb25maWcgZmlsZQorCSAqLworCW5mc19kZWZhdWx0X3ZlcnNpb24obWkpOworCQorCXJldHVybiAxOworfQorCisvKgorICogU2V0IHVwIG1hbmRhdG9yeSBub24tdmVyc2lvbiBzcGVjaWZpYyBORlMgbW91bnQgb3B0aW9ucy4KKyAqCisgKiBSZXR1cm5zIDEgaWYgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlIHplcm8uCisgKi8KK3N0YXRpYyBpbnQgbmZzX3ZhbGlkYXRlX29wdGlvbnMoc3RydWN0IG5mc21vdW50X2luZm8gKm1pKQoreworCXN0cnVjdCBhZGRyaW5mbyBoaW50ID0geworCQkuYWlfcHJvdG9jb2wJPSAoaW50KUlQUFJPVE9fVURQLAorCQkuYWlfZmxhZ3MJPSBBSV9BRERSQ09ORklHLAorCX07CisJc2FfZmFtaWx5X3QgZmFtaWx5OworCWludCBlcnJvcjsKKworCWlmICghbmZzX3BhcnNlX2Rldm5hbWUobWktPnNwZWMsICZtaS0+aG9zdG5hbWUsIE5VTEwpKQorCQlyZXR1cm4gMDsKKworCWlmICghbmZzX25mc19wcm90b19mYW1pbHkobWktPm9wdGlvbnMsICZmYW1pbHkpKQorCQlyZXR1cm4gMDsKKworCWhpbnQuYWlfZmFtaWx5ID0gKGludClmYW1pbHk7CisJZXJyb3IgPSBnZXRhZGRyaW5mbyhtaS0+aG9zdG5hbWUsIE5VTEwsICZoaW50LCAmbWktPmFkZHJlc3MpOworCWlmIChlcnJvciAhPSAwKSB7CisJCW5mc19lcnJvcihfKCIlczogRmFpbGVkIHRvIHJlc29sdmUgc2VydmVyICVzOiAlcyIpLAorCQkJcHJvZ25hbWUsIG1pLT5ob3N0bmFtZSwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisJCW1pLT5hZGRyZXNzID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFuZnNfc2V0X3ZlcnNpb24obWkpKQorCQlyZXR1cm4gMDsKKworCWlmICghbmZzX2FwcGVuZF9zbG9wcHlfb3B0aW9uKG1pLT5vcHRpb25zKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW5mc19hcHBlbmRfYWRkcl9vcHRpb24obWktPmFkZHJlc3MtPmFpX2FkZHIsCisJCQkJCW1pLT5hZGRyZXNzLT5haV9hZGRybGVuLCBtaS0+b3B0aW9ucykpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBHZXQgTkZTL21udCBzZXJ2ZXIgYWRkcmVzc2VzIGZyb20gbW91bnQgb3B0aW9ucworICoKKyAqIFJldHVybnMgMSBhbmQgZmlsbHMgaW4gQG5mc19zYWRkciwgQG5mc19zYWxlbiwgQG1udF9zYWRkciwgYW5kIEBtbnRfc2FsZW4KKyAqIGlmIGFsbCBnb2VzIHdlbGw7IG90aGVyd2lzZSB6ZXJvLgorICovCitzdGF0aWMgaW50IG5mc19leHRyYWN0X3NlcnZlcl9hZGRyZXNzZXMoc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdGlvbnMsCisJCQkJCXN0cnVjdCBzb2NrYWRkciAqbmZzX3NhZGRyLAorCQkJCQlzb2NrbGVuX3QgKm5mc19zYWxlbiwKKwkJCQkJc3RydWN0IHNvY2thZGRyICptbnRfc2FkZHIsCisJCQkJCXNvY2tsZW5fdCAqbW50X3NhbGVuKQoreworCWNoYXIgKm9wdGlvbjsKKworCW9wdGlvbiA9IHBvX2dldChvcHRpb25zLCAiYWRkciIpOworCWlmIChvcHRpb24gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKCFuZnNfc3RyaW5nX3RvX3NvY2thZGRyKG9wdGlvbiwgbmZzX3NhZGRyLCBuZnNfc2FsZW4pKQorCQlyZXR1cm4gMDsKKworCW9wdGlvbiA9IHBvX2dldChvcHRpb25zLCAibW91bnRhZGRyIik7CisJaWYgKG9wdGlvbiA9PSBOVUxMKSB7CisJCW1lbWNweShtbnRfc2FkZHIsIG5mc19zYWRkciwgKm5mc19zYWxlbik7CisJCSptbnRfc2FsZW4gPSAqbmZzX3NhbGVuOworCX0gZWxzZSBpZiAoIW5mc19zdHJpbmdfdG9fc29ja2FkZHIob3B0aW9uLCBtbnRfc2FkZHIsIG1udF9zYWxlbikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2NvbnN0cnVjdF9uZXdfb3B0aW9ucyhzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucywKKwkJCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqbmZzX3NhZGRyLAorCQkJCSAgICAgc3RydWN0IHBtYXAgKm5mc19wbWFwLAorCQkJCSAgICAgc3RydWN0IHNvY2thZGRyICptbnRfc2FkZHIsCisJCQkJICAgICBzdHJ1Y3QgcG1hcCAqbW50X3BtYXApCit7CisJY2hhciBuZXdfb3B0aW9uWzY0XTsKKwljaGFyICpuZXRpZDsKKworCXBvX3JlbW92ZV9hbGwob3B0aW9ucywgIm5mc3Byb2ciKTsKKwlwb19yZW1vdmVfYWxsKG9wdGlvbnMsICJtb3VudHByb2ciKTsKKworCXBvX3JlbW92ZV9hbGwob3B0aW9ucywgInYyIik7CisJcG9fcmVtb3ZlX2FsbChvcHRpb25zLCAidjMiKTsKKwlwb19yZW1vdmVfYWxsKG9wdGlvbnMsICJ2ZXJzIik7CisJcG9fcmVtb3ZlX2FsbChvcHRpb25zLCAibmZzdmVycyIpOworCXNucHJpbnRmKG5ld19vcHRpb24sIHNpemVvZihuZXdfb3B0aW9uKSAtIDEsCisJCSAidmVycz0lbHUiLCBuZnNfcG1hcC0+cG1fdmVycyk7CisJaWYgKHBvX2FwcGVuZChvcHRpb25zLCBuZXdfb3B0aW9uKSA9PSBQT19GQUlMRUQpCisJCXJldHVybiAwOworCisJcG9fcmVtb3ZlX2FsbChvcHRpb25zLCAicHJvdG8iKTsKKwlwb19yZW1vdmVfYWxsKG9wdGlvbnMsICJ1ZHAiKTsKKwlwb19yZW1vdmVfYWxsKG9wdGlvbnMsICJ0Y3AiKTsKKwluZXRpZCA9IG5mc19nZXRfbmV0aWQobmZzX3NhZGRyLT5zYV9mYW1pbHksIG5mc19wbWFwLT5wbV9wcm90KTsKKwlpZiAobmV0aWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJc25wcmludGYobmV3X29wdGlvbiwgc2l6ZW9mKG5ld19vcHRpb24pIC0gMSwKKwkJCSAicHJvdG89JXMiLCBuZXRpZCk7CisJZnJlZShuZXRpZCk7CisJaWYgKHBvX2FwcGVuZChvcHRpb25zLCBuZXdfb3B0aW9uKSA9PSBQT19GQUlMRUQpCisJCXJldHVybiAwOworCisJcG9fcmVtb3ZlX2FsbChvcHRpb25zLCAicG9ydCIpOworCWlmIChuZnNfcG1hcC0+cG1fcG9ydCAhPSBORlNfUE9SVCkgeworCQlzbnByaW50ZihuZXdfb3B0aW9uLCBzaXplb2YobmV3X29wdGlvbikgLSAxLAorCQkJICJwb3J0PSVsdSIsIG5mc19wbWFwLT5wbV9wb3J0KTsKKwkJaWYgKHBvX2FwcGVuZChvcHRpb25zLCBuZXdfb3B0aW9uKSA9PSBQT19GQUlMRUQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlwb19yZW1vdmVfYWxsKG9wdGlvbnMsICJtb3VudHZlcnMiKTsKKwlzbnByaW50ZihuZXdfb3B0aW9uLCBzaXplb2YobmV3X29wdGlvbikgLSAxLAorCQkgIm1vdW50dmVycz0lbHUiLCBtbnRfcG1hcC0+cG1fdmVycyk7CisJaWYgKHBvX2FwcGVuZChvcHRpb25zLCBuZXdfb3B0aW9uKSA9PSBQT19GQUlMRUQpCisJCXJldHVybiAwOworCisJcG9fcmVtb3ZlX2FsbChvcHRpb25zLCAibW91bnRwcm90byIpOworCW5ldGlkID0gbmZzX2dldF9uZXRpZChtbnRfc2FkZHItPnNhX2ZhbWlseSwgbW50X3BtYXAtPnBtX3Byb3QpOworCWlmIChuZXRpZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlzbnByaW50ZihuZXdfb3B0aW9uLCBzaXplb2YobmV3X29wdGlvbikgLSAxLAorCQkJICJtb3VudHByb3RvPSVzIiwgbmV0aWQpOworCWZyZWUobmV0aWQpOworCWlmIChwb19hcHBlbmQob3B0aW9ucywgbmV3X29wdGlvbikgPT0gUE9fRkFJTEVEKQorCQlyZXR1cm4gMDsKKworCXBvX3JlbW92ZV9hbGwob3B0aW9ucywgIm1vdW50cG9ydCIpOworCXNucHJpbnRmKG5ld19vcHRpb24sIHNpemVvZihuZXdfb3B0aW9uKSAtIDEsCisJCSAibW91bnRwb3J0PSVsdSIsIG1udF9wbWFwLT5wbV9wb3J0KTsKKwlpZiAocG9fYXBwZW5kKG9wdGlvbnMsIG5ld19vcHRpb24pID09IFBPX0ZBSUxFRCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlY29uc3RydWN0IHRoZSBtb3VudCBvcHRpb24gc3RyaW5nIGJhc2VkIG9uIGEgcG9ydG1hcHBlciBwcm9iZQorICogb2YgdGhlIHNlcnZlci4gIFJldHVybnMgb25lIGlmIHRoZSBzZXJ2ZXIncyBwb3J0bWFwcGVyIHJldHVybmVkCisgKiBzb21ldGhpbmcgd2UgY2FuIHVzZSwgb3RoZXJ3aXNlIHplcm8uCisgKgorICogVG8gaGFuZGxlIHZlcnNpb24gYW5kIHRyYW5zcG9ydCBwcm90b2NvbCBmYWxsYmFjayBwcm9wZXJseSwgd2UKKyAqIG5lZWQgdG8gcGFyc2Ugc29tZSBvZiB0aGUgbW91bnQgb3B0aW9ucyBpbiBvcmRlciB0byBzZXQgdXAgYQorICogcG9ydG1hcCBwcm9iZS4gIE1vdW50IG9wdGlvbnMgdGhhdCBuZnNfcmV3cml0ZV9wbWFwX21vdW50X29wdGlvbnMoKQorICogZG9lc24ndCByZWNvZ25pemUgYXJlIGxlZnQgYWxvbmUuCisgKgorICogUmV0dXJucyBUUlVFIGlmIHJld3JpdGluZyB3YXMgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlCisgKiBGQUxTRSBpcyByZXR1cm5lZCBpZiBzb21lIGZhaWx1cmUgb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQKK25mc19yZXdyaXRlX3BtYXBfbW91bnRfb3B0aW9ucyhzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwl1bmlvbiBuZnNfc29ja2FkZHIgbmZzX2FkZHJlc3M7CisJc3RydWN0IHNvY2thZGRyICpuZnNfc2FkZHIgPSAmbmZzX2FkZHJlc3Muc2E7CisJc29ja2xlbl90IG5mc19zYWxlbiA9IHNpemVvZihuZnNfYWRkcmVzcyk7CisJc3RydWN0IHBtYXAgbmZzX3BtYXA7CisJdW5pb24gbmZzX3NvY2thZGRyIG1udF9hZGRyZXNzOworCXN0cnVjdCBzb2NrYWRkciAqbW50X3NhZGRyID0gJm1udF9hZGRyZXNzLnNhOworCXNvY2tsZW5fdCBtbnRfc2FsZW4gPSBzaXplb2YobW50X2FkZHJlc3MpOworCXN0cnVjdCBwbWFwIG1udF9wbWFwOworCWNoYXIgKm9wdGlvbjsKKworCS8qCisJICogU2tpcCBvcHRpb24gbmVnb3RpYXRpb24gZm9yIHByb3RvPXJkbWEgbW91bnRzLgorCSAqLworCW9wdGlvbiA9IHBvX2dldChvcHRpb25zLCAicHJvdG8iKTsKKwlpZiAob3B0aW9uICYmIHN0cmNtcChvcHRpb24sICJyZG1hIikgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEV4dHJhY3QganVzdCB0aGUgb3B0aW9ucyBuZWVkZWQgdG8gY29udGFjdCBzZXJ2ZXIuCisJICogQmFpbCBub3cgaWYgYW55IG9mIHRoZXNlIGhhdmUgYmFkIHZhbHVlcy4KKwkgKi8KKwlpZiAoIW5mc19leHRyYWN0X3NlcnZlcl9hZGRyZXNzZXMob3B0aW9ucywgbmZzX3NhZGRyLCAmbmZzX3NhbGVuLAorCQkJCQkJbW50X3NhZGRyLCAmbW50X3NhbGVuKSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghbmZzX29wdGlvbnMycG1hcChvcHRpb25zLCAmbmZzX3BtYXAsICZtbnRfcG1hcCkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVGhlIGtlcm5lbCBORlMgY2xpZW50IGRvZXNuJ3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgUlBDCisJICogcHJvZ3JhbSBudW1iZXIgZm9yIHRoZXNlIHNlcnZpY2VzLCBzbyBmb3JjZSB0aGUgdmFsdWUgb2YKKwkgKiB0aGVzZSBmaWVsZHMgYmVmb3JlIHByb2JpbmcgdGhlIHNlcnZlcidzIHBvcnRzLgorCSAqLworCW5mc19wbWFwLnBtX3Byb2cgPSBORlNfUFJPR1JBTTsKKwltbnRfcG1hcC5wbV9wcm9nID0gTU9VTlRQUk9HOworCisJLyoKKwkgKiBJZiB0aGUgc2VydmVyJ3MgcnBjYmluZCBzZXJ2aWNlIGlzbid0IGF2YWlsYWJsZSwgd2UgY2FuJ3QKKwkgKiBuZWdvdGlhdGUuICBCYWlsIG5vdyBpZiB3ZSBjYW4ndCBjb250YWN0IGl0LgorCSAqLworCWlmICghbmZzX3Byb2JlX2JvdGhwb3J0cyhtbnRfc2FkZHIsIG1udF9zYWxlbiwgJm1udF9wbWFwLAorCQkJCSBuZnNfc2FkZHIsIG5mc19zYWxlbiwgJm5mc19wbWFwKSkgeworCQllcnJubyA9IEVTUElQRTsKKwkJaWYgKHJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9PSBSUENfUFJPR05PVFJFR0lTVEVSRUQpCisJCQllcnJubyA9IEVPUE5PVFNVUFA7CisJCWVsc2UgaWYgKHJwY19jcmVhdGVlcnIuY2ZfZXJyb3IucmVfZXJybm8gIT0gMCkKKwkJCWVycm5vID0gcnBjX2NyZWF0ZWVyci5jZl9lcnJvci5yZV9lcnJubzsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFuZnNfY29uc3RydWN0X25ld19vcHRpb25zKG9wdGlvbnMsIG5mc19zYWRkciwgJm5mc19wbWFwLAorCQkJCQltbnRfc2FkZHIsICZtbnRfcG1hcCkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAwOworCX0KKworb3V0OgorCWVycm5vID0gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIERvIHRoZSBtb3VudCgyKSBzeXN0ZW0gY2FsbC4KKyAqCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIEZBTFNFLgorICogImVycm5vIiBpcyBzZXQgdG8gcmVmbGVjdCB0aGUgaW5kaXZpZHVhbCBlcnJvci4KKyAqLworc3RhdGljIGludCBuZnNfc3lzX21vdW50KHN0cnVjdCBuZnNtb3VudF9pbmZvICptaSwgc3RydWN0IG1vdW50X29wdGlvbnMgKm9wdHMpCit7CisJY2hhciAqb3B0aW9ucyA9IE5VTEw7CisJaW50IHJlc3VsdDsKKworCWlmIChwb19qb2luKG9wdHMsICZvcHRpb25zKSA9PSBQT19GQUlMRUQpIHsKKwkJZXJybm8gPSBFSU87CisJCXJldHVybiAwOworCX0KKworCWlmIChtaS0+ZmFrZSkKKwkJcmV0dXJuIDE7CisKKwlyZXN1bHQgPSBtb3VudChtaS0+c3BlYywgbWktPm5vZGUsIG1pLT50eXBlLAorCQkJbWktPmZsYWdzICYgfihNU19VU0VSfE1TX1VTRVJTKSwgb3B0aW9ucyk7CisJaWYgKHZlcmJvc2UgJiYgcmVzdWx0KSB7CisJCWludCBzYXZlID0gZXJybm87CisJCW5mc19lcnJvcihfKCIlczogbW91bnQoMik6ICVzIiksIHByb2duYW1lLCBzdHJlcnJvcihzYXZlKSk7CisJCWVycm5vID0gc2F2ZTsKKwl9CisJcmV0dXJuICFyZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2RvX21vdW50X3YzdjIoc3RydWN0IG5mc21vdW50X2luZm8gKm1pLAorCQlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgc29ja2xlbl90IHNhbGVuKQoreworCXN0cnVjdCBtb3VudF9vcHRpb25zICpvcHRpb25zID0gcG9fZHVwKG1pLT5vcHRpb25zKTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmICghb3B0aW9ucykgeworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAoIW5mc19hcHBlbmRfYWRkcl9vcHRpb24oc2FwLCBzYWxlbiwgb3B0aW9ucykpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJaWYgKCFuZnNfZml4X21vdW50aG9zdF9vcHRpb24ob3B0aW9ucywgbWktPmhvc3RuYW1lKSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisJaWYgKCFtaS0+ZmFrZSAmJiAhbmZzX3ZlcmlmeV9sb2NrX29wdGlvbihvcHRpb25zKSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwkvKgorCSAqIE9wdGlvbnMgd2UgbmVnb3RpYXRlIGJlbG93IG1heSBiZSBzdGFsZSBieSB0aGUgdGltZSB0aGlzCisJICogZmlsZSBzeXN0ZW0gaXMgdW5tb3VudGVkLiAgSW4gb3JkZXIgdG8gZm9yY2UgdW1vdW50Lm5mcworCSAqIHRvIHJlbmVnb3RpYXRlIHdpdGggdGhlIHNlcnZlciwgb25seSB3cml0ZSB0aGUgdXNlci0KKwkgKiBzcGVjaWZpZWQgb3B0aW9ucywgYW5kIG5vdCBuZWdvdGlhdGVkIG9wdGlvbnMsIHRvIC9ldGMvbXRhYi4KKwkgKi8KKwlpZiAocG9fam9pbihvcHRpb25zLCBtaS0+ZXh0cmFfb3B0cykgPT0gUE9fRkFJTEVEKSB7CisJCWVycm5vID0gRU5PTUVNOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCWlmICh2ZXJib3NlKQorCQlwcmludGYoXygiJXM6IHRyeWluZyB0ZXh0LWJhc2VkIG9wdGlvbnMgJyVzJ1xuIiksCisJCQlwcm9nbmFtZSwgKm1pLT5leHRyYV9vcHRzKTsKKworCWlmICghbmZzX3Jld3JpdGVfcG1hcF9tb3VudF9vcHRpb25zKG9wdGlvbnMpKQorCQlnb3RvIG91dF9mYWlsOworCisJcmVzdWx0ID0gbmZzX3N5c19tb3VudChtaSwgb3B0aW9ucyk7CisKK291dF9mYWlsOgorCXBvX2Rlc3Ryb3kob3B0aW9ucyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEF0dGVtcHQgYSAiLXQgbmZzIHZlcnM9MiIgb3IgIi10IG5mcyB2ZXJzPTMiIG1vdW50LgorICoKKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgRkFMU0UuCisgKiAiZXJybm8iIGlzIHNldCB0byByZWZsZWN0IHRoZSBpbmRpdmlkdWFsIGVycm9yLgorICovCitzdGF0aWMgaW50IG5mc190cnlfbW91bnRfdjN2MihzdHJ1Y3QgbmZzbW91bnRfaW5mbyAqbWkpCit7CisJc3RydWN0IGFkZHJpbmZvICphaTsKKwlpbnQgcmV0OworCisJZm9yIChhaSA9IG1pLT5hZGRyZXNzOyBhaSAhPSBOVUxMOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCXJldCA9IG5mc19kb19tb3VudF92M3YyKG1pLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCisJCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFQ09OTlJFRlVTRUQ6CisJCWNhc2UgRU9QTk9UU1VQUDoKKwkJY2FzZSBFSE9TVFVOUkVBQ0g6CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2RvX21vdW50X3Y0KHN0cnVjdCBuZnNtb3VudF9pbmZvICptaSwKKwkJc3RydWN0IHNvY2thZGRyICpzYXAsIHNvY2tsZW5fdCBzYWxlbikKK3sKKwlzdHJ1Y3QgbW91bnRfb3B0aW9ucyAqb3B0aW9ucyA9IHBvX2R1cChtaS0+b3B0aW9ucyk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoIW9wdGlvbnMpIHsKKwkJZXJybm8gPSBFTk9NRU07CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJaWYgKG1pLT52ZXJzaW9uID09IDApIHsKKwkJaWYgKHBvX2NvbnRhaW5zKG9wdGlvbnMsICJtb3VudGhvc3QiKSB8fAorCQkJcG9fY29udGFpbnMob3B0aW9ucywgIm1vdW50YWRkciIpIHx8CisJCQlwb19jb250YWlucyhvcHRpb25zLCAibW91bnR2ZXJzIikgfHwKKwkJCXBvX2NvbnRhaW5zKG9wdGlvbnMsICJtb3VudHByb3RvIikpIHsKKwkJLyoKKwkJICogU2luY2UgdGhlc2UgbW91bnRkIG9wdGlvbnMgYXJlIHNldCBhc3N1bWUgdmVyc2lvbiAzCisJCSAqIGlzIHdhbnRlZCBzbyBlcnJvciBvdXQgd2l0aCBFUFJPVE9OT1NVUFBPUlQgc28gdGhlCisJCSAqIHByb3RvY29sIG5lZ2F0aW9uIHN0YXJ0cyB3aXRoIHYzLgorCQkgKi8KKwkJCWVycm5vID0gRVBST1RPTk9TVVBQT1JUOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCQlpZiAocG9fYXBwZW5kKG9wdGlvbnMsICJ2ZXJzPTQiKSA9PSBQT19GQUlMRUQpIHsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCX0KKworCWlmICghbmZzX2FwcGVuZF9hZGRyX29wdGlvbihzYXAsIHNhbGVuLCBvcHRpb25zKSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlpZiAoIW5mc19hcHBlbmRfY2xpZW50YWRkcl9vcHRpb24oc2FwLCBzYWxlbiwgb3B0aW9ucykpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgb3B0aW9uIHN0cmluZyB0byBiZSByZWNvcmRlZCBpbiAvZXRjL210YWIuCisJICovCisJaWYgKHBvX2pvaW4ob3B0aW9ucywgbWktPmV4dHJhX29wdHMpID09IFBPX0ZBSUxFRCkgeworCQllcnJubyA9IEVOT01FTTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKF8oIiVzOiB0cnlpbmcgdGV4dC1iYXNlZCBvcHRpb25zICclcydcbiIpLAorCQkJcHJvZ25hbWUsICptaS0+ZXh0cmFfb3B0cyk7CisKKwlyZXN1bHQgPSBuZnNfc3lzX21vdW50KG1pLCBvcHRpb25zKTsKKworb3V0X2ZhaWw6CisJcG9fZGVzdHJveShvcHRpb25zKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQXR0ZW1wdCBhICItdCBuZnMgLW8gdmVycz00IiBvciAiLXQgbmZzNCIgbW91bnQuCisgKgorICogUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBGQUxTRS4KKyAqICJlcnJubyIgaXMgc2V0IHRvIHJlZmxlY3QgdGhlIGluZGl2aWR1YWwgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3RyeV9tb3VudF92NChzdHJ1Y3QgbmZzbW91bnRfaW5mbyAqbWkpCit7CisJc3RydWN0IGFkZHJpbmZvICphaTsKKwlpbnQgcmV0OworCisJZm9yIChhaSA9IG1pLT5hZGRyZXNzOyBhaSAhPSBOVUxMOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCXJldCA9IG5mc19kb19tb3VudF92NChtaSwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJcmV0dXJuIHJldDsKKworCQlzd2l0Y2ggKGVycm5vKSB7CisJCWNhc2UgRUNPTk5SRUZVU0VEOgorCQljYXNlIEVIT1NUVU5SRUFDSDoKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgaXMgYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHRoZSBmZy9iZyBsb29wLgorICoKKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgRkFMU0UuCisgKiAiZXJybm8iIGlzIHNldCB0byByZWZsZWN0IHRoZSBpbmRpdmlkdWFsIGVycm9yLgorICovCitzdGF0aWMgaW50IG5mc190cnlfbW91bnQoc3RydWN0IG5mc21vdW50X2luZm8gKm1pKQoreworCWludCByZXN1bHQgPSAwOworCisJc3dpdGNoIChtaS0+dmVyc2lvbikgeworCWNhc2UgMDoKKwkJaWYgKGxpbnV4X3ZlcnNpb25fY29kZSgpID4gTUFLRV9WRVJTSU9OKDIsIDYsIDMxKSkgeworCQkJZXJybm8gPSAwOworCQkJcmVzdWx0ID0gbmZzX3RyeV9tb3VudF92NChtaSk7CisJCQlpZiAoZXJybm8gIT0gRVBST1RPTk9TVVBQT1JUKSB7CisJCQkJLyogCisJCQkJICogVG8gZGVhbCB3aXRoIGxlZ2FjeSBMaW51eCBzZXJ2ZXJzIHRoYXQgZG9uJ3QKKwkJCQkgKiBhdXRvbWF0aWNhbGx5IGV4cG9ydCBhIHBzZXVkbyByb290LCByZXRyeQorCQkJCSAqIEVOT0VOVCBlcnJvcnMgdXNpbmcgdmVyc2lvbiAzLiBBbmQgZm9yCisJCQkJICogTGludXggc2VydmVycyBwcmlvciB0byAyLjYuMjUsIHJldHJ5IEVQRVJNCisJCQkJICovCisJCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFUEVSTSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwljYXNlIDI6CisJY2FzZSAzOgorCQlyZXN1bHQgPSBuZnNfdHJ5X21vdW50X3YzdjIobWkpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXJlc3VsdCA9IG5mc190cnlfbW91bnRfdjQobWkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJubyA9IEVJTzsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRGlzdGluZ3Vpc2ggYmV0d2VlbiBwZXJtYW5lbnQgYW5kIHRlbXBvcmFyeSBlcnJvcnMuCisgKgorICogQmFzaWNhbGx5LCB3ZSByZXRyeSBpZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHNlcnZlciBoYXMKKyAqIGZhaWxlZCBzbyBmYXIsIGJ1dCBmYWlsIGltbWVkaWF0ZWx5IGlmIHRoZXJlIGlzIGEgbG9jYWwKKyAqIGVycm9yIChsaWtlIGEgYmFkIG1vdW50IG9wdGlvbikuCisgKgorICogRVNUQUxFIGlzIGFsc28gYSB0ZW1wb3JhcnkgZXJyb3IgYmVjYXVzZSBzb21lIHNlcnZlcnMKKyAqIHJldHVybiBFU1RBTEUgd2hlbiBhIHNoYXJlIGlzIHRlbXBvcmFyaWx5IG9mZmxpbmUuCisgKgorICogUmV0dXJucyAxIGlmIHdlIHNob3VsZCBmYWlsIGltbWVkaWF0ZWx5LCBvciAwIGlmIHdlCisgKiBzaG91bGQgcmV0cnkuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2lzX3Blcm1hbmVudF9lcnJvcihpbnQgZXJyb3IpCit7CisJc3dpdGNoIChlcnJvcikgeworCWNhc2UgRVNUQUxFOgorCWNhc2UgRVRJTUVET1VUOgorCWNhc2UgRUNPTk5SRUZVU0VEOgorCQlyZXR1cm4gMDsJLyogdGVtcG9yYXJ5ICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CS8qIHBlcm1hbmVudCAqLworCX0KK30KKworLyoKKyAqIEhhbmRsZSAiZm9yZWdyb3VuZCIgTkZTIG1vdW50cy4KKyAqCisgKiBSZXRyeSB0aGUgbW91bnQgcmVxdWVzdCBmb3IgYXMgbG9uZyBhcyB0aGUgJ3JldHJ5PScgb3B0aW9uIHNheXMuCisgKgorICogUmV0dXJucyBhIHZhbGlkIG1vdW50IGNvbW1hbmQgZXhpdCBjb2RlLgorICovCitzdGF0aWMgaW50IG5mc21vdW50X2ZnKHN0cnVjdCBuZnNtb3VudF9pbmZvICptaSkKK3sKKwl1bnNpZ25lZCBpbnQgc2VjcyA9IDE7CisJdGltZV90IHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gbmZzX3BhcnNlX3JldHJ5X29wdGlvbihtaS0+b3B0aW9ucywKKwkJCQkJIE5GU19ERUZfRkdfVElNRU9VVF9NSU5VVEVTKTsKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRmKF8oIiVzOiB0aW1lb3V0IHNldCBmb3IgJXMiKSwKKwkJCXByb2duYW1lLCBjdGltZSgmdGltZW91dCkpOworCisJZm9yICg7OykgeworCQlpZiAobmZzX3RyeV9tb3VudChtaSkpCisJCQlyZXR1cm4gRVhfU1VDQ0VTUzsKKworCQlpZiAobmZzX2lzX3Blcm1hbmVudF9lcnJvcihlcnJubykpCisJCQlicmVhazsKKworCQlpZiAodGltZShOVUxMKSA+IHRpbWVvdXQpIHsKKwkJCWVycm5vID0gRVRJTUVET1VUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZXJybm8gIT0gRVRJTUVET1VUKSB7CisJCQlpZiAoc2xlZXAoc2VjcykpCisJCQkJYnJlYWs7CisJCQlzZWNzIDw8PSAxOworCQkJaWYgKHNlY3MgPiAxMCkKKwkJCQlzZWNzID0gMTA7CisJCX0KKwl9OworCisJbW91bnRfZXJyb3IobWktPnNwZWMsIG1pLT5ub2RlLCBlcnJubyk7CisJcmV0dXJuIEVYX0ZBSUw7Cit9CisKKy8qCisgKiBIYW5kbGUgImJhY2tncm91bmQiIE5GUyBtb3VudCBbZmlyc3QgdHJ5XQorICoKKyAqIFJldHVybnMgYSB2YWxpZCBtb3VudCBjb21tYW5kIGV4aXQgY29kZS4KKyAqCisgKiBFWF9CRyBzaG91bGQgY2F1c2UgdGhlIGNhbGxlciB0byBmb3JrIGFuZCBpbnZva2UgbmZzbW91bnRfY2hpbGQuCisgKi8KK3N0YXRpYyBpbnQgbmZzbW91bnRfcGFyZW50KHN0cnVjdCBuZnNtb3VudF9pbmZvICptaSkKK3sKKwlpZiAobmZzX3RyeV9tb3VudChtaSkpCisJCXJldHVybiBFWF9TVUNDRVNTOworCisJaWYgKG5mc19pc19wZXJtYW5lbnRfZXJyb3IoZXJybm8pKSB7CisJCW1vdW50X2Vycm9yKG1pLT5zcGVjLCBtaS0+bm9kZSwgZXJybm8pOworCQlyZXR1cm4gRVhfRkFJTDsKKwl9CisKKwlzeXNfbW91bnRfZXJyb3JzKG1pLT5ob3N0bmFtZSwgZXJybm8sIDEsIDEpOworCXJldHVybiBFWF9CRzsKK30KKworLyoKKyAqIEhhbmRsZSAiYmFja2dyb3VuZCIgTkZTIG1vdW50IFtyZXRyeSBkYWVtb25dCisgKgorICogUmV0dXJucyBhIHZhbGlkIG1vdW50IGNvbW1hbmQgZXhpdCBjb2RlOiBFWF9TVUNDRVNTIGlmIHN1Y2Nlc3NmdWwsCisgKiBFWF9GQUlMIGlmIGEgZmFpbHVyZSBvY2N1cnJlZC4gIFRoZXJlJ3Mgbm90aGluZyB0byBjYXRjaCB0aGUKKyAqIGVycm9yIHJldHVybiwgdGhvdWdoLCBzbyB3ZSB1c2Ugc3lzX21vdW50X2Vycm9ycyB0byBsb2cgdGhlCisgKiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IG5mc21vdW50X2NoaWxkKHN0cnVjdCBuZnNtb3VudF9pbmZvICptaSkKK3sKKwl1bnNpZ25lZCBpbnQgc2VjcyA9IDE7CisJdGltZV90IHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gbmZzX3BhcnNlX3JldHJ5X29wdGlvbihtaS0+b3B0aW9ucywKKwkJCQkJIE5GU19ERUZfQkdfVElNRU9VVF9NSU5VVEVTKTsKKworCWZvciAoOzspIHsKKwkJaWYgKHNsZWVwKHNlY3MpKQorCQkJYnJlYWs7CisJCXNlY3MgPDw9IDE7CisJCWlmIChzZWNzID4gMTIwKQorCQkJc2VjcyA9IDEyMDsKKworCQlpZiAobmZzX3RyeV9tb3VudChtaSkpCisJCQlyZXR1cm4gRVhfU1VDQ0VTUzsKKworCQlpZiAobmZzX2lzX3Blcm1hbmVudF9lcnJvcihlcnJubykpCisJCQlicmVhazsKKworCQlpZiAodGltZShOVUxMKSA+IHRpbWVvdXQpCisJCQlicmVhazsKKworCQlzeXNfbW91bnRfZXJyb3JzKG1pLT5ob3N0bmFtZSwgZXJybm8sIDEsIDEpOworCX07CisKKwlzeXNfbW91bnRfZXJyb3JzKG1pLT5ob3N0bmFtZSwgZXJybm8sIDEsIDApOworCXJldHVybiBFWF9GQUlMOworfQorCisvKgorICogSGFuZGxlICJiYWNrZ3JvdW5kIiBORlMgbW91bnQKKyAqCisgKiBSZXR1cm5zIGEgdmFsaWQgbW91bnQgY29tbWFuZCBleGl0IGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgbmZzbW91bnRfYmcoc3RydWN0IG5mc21vdW50X2luZm8gKm1pKQoreworCWlmICghbWktPmNoaWxkKQorCQlyZXR1cm4gbmZzbW91bnRfcGFyZW50KG1pKTsKKwllbHNlCisJCXJldHVybiBuZnNtb3VudF9jaGlsZChtaSk7Cit9CisKKy8qCisgKiBQcm9jZXNzIG1vdW50IG9wdGlvbnMgYW5kIHRyeSBhIG1vdW50IHN5c3RlbSBjYWxsLgorICoKKyAqIFJldHVybnMgYSB2YWxpZCBtb3VudCBjb21tYW5kIGV4aXQgY29kZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKm5mc19iYWNrZ3JvdW5kX29wdHRibFtdID0geworCSJiZyIsCisJImZnIiwKKwlOVUxMLAorfTsKKworc3RhdGljIGludCBuZnNtb3VudF9zdGFydChzdHJ1Y3QgbmZzbW91bnRfaW5mbyAqbWkpCit7CisJaWYgKCFuZnNfdmFsaWRhdGVfb3B0aW9ucyhtaSkpCisJCXJldHVybiBFWF9GQUlMOworCisJaWYgKHBvX3JpZ2h0bW9zdChtaS0+b3B0aW9ucywgbmZzX2JhY2tncm91bmRfb3B0dGJsKSA9PSAwKQorCQlyZXR1cm4gbmZzbW91bnRfYmcobWkpOworCWVsc2UKKwkJcmV0dXJuIG5mc21vdW50X2ZnKG1pKTsKK30KKworLyoqCisgKiBuZnNtb3VudF9zdHJpbmcgLSBNb3VudCBhbiBORlMgZmlsZSBzeXN0ZW0gdXNpbmcgQyBzdHJpbmcgb3B0aW9ucworICogQHNwZWM6IEMgc3RyaW5nIHNwZWNpZnlpbmcgcmVtb3RlIHNoYXJlIHRvIG1vdW50ICgiaG9zdG5hbWU6cGF0aCIpCisgKiBAbm9kZTogQyBzdHJpbmcgcGF0aG5hbWUgb2YgbG9jYWwgbW91bnRlZC1vbiBkaXJlY3RvcnkKKyAqIEB0eXBlOiBDIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgZmlsZSBzeXN0ZW0gdHlwZSAoIm5mcyIgb3IgIm5mczQiKQorICogQGZsYWdzOiBNU18gc3R5bGUgbW91bnQgZmxhZ3MKKyAqIEBleHRyYV9vcHRzOglwb2ludGVyIHRvIEMgc3RyaW5nIGNvbnRhaW5pbmcgZnMtc3BlY2lmaWMgbW91bnQgb3B0aW9ucworICoJCShpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50KQorICogQGZha2U6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGNhcnJ5IG91dCB0aGUgd2hvbGUgb3BlcmF0aW9uCisgKiBAY2hpbGQ6IG9uZSBpZiB0aGlzIGlzIGEgbW91bnQgZGFlbW9uIChiZykKKyAqLworaW50IG5mc21vdW50X3N0cmluZyhjb25zdCBjaGFyICpzcGVjLCBjb25zdCBjaGFyICpub2RlLCBjb25zdCBjaGFyICp0eXBlLAorCQkgICAgaW50IGZsYWdzLCBjaGFyICoqZXh0cmFfb3B0cywgaW50IGZha2UsIGludCBjaGlsZCkKK3sKKwlzdHJ1Y3QgbmZzbW91bnRfaW5mbyBtaSA9IHsKKwkJLnNwZWMJCT0gc3BlYywKKwkJLm5vZGUJCT0gbm9kZSwKKwkJLmFkZHJlc3MJPSBOVUxMLAorCQkudHlwZQkJPSB0eXBlLAorCQkuZXh0cmFfb3B0cwk9IGV4dHJhX29wdHMsCisJCS5mbGFncwkJPSBmbGFncywKKwkJLmZha2UJCT0gZmFrZSwKKwkJLmNoaWxkCQk9IGNoaWxkLAorCX07CisJaW50IHJldHZhbCA9IEVYX0ZBSUw7CisKKwltaS5vcHRpb25zID0gcG9fc3BsaXQoKmV4dHJhX29wdHMpOworCWlmIChtaS5vcHRpb25zKSB7CisJCXJldHZhbCA9IG5mc21vdW50X3N0YXJ0KCZtaSk7CisJCXBvX2Rlc3Ryb3kobWkub3B0aW9ucyk7CisJfSBlbHNlCisJCW5mc19lcnJvcihfKCIlczogaW50ZXJuYWwgb3B0aW9uIHBhcnNpbmcgZXJyb3IiKSwgcHJvZ25hbWUpOworCisJZnJlZWFkZHJpbmZvKG1pLmFkZHJlc3MpOworCWZyZWUobWkuaG9zdG5hbWUpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvc3Ryb3B0cy5oIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3N0cm9wdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZkODg4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3N0cm9wdHMuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogc3Ryb3B0cy5oIC0tIFByb3ZpZGUgY29tbW9uIG5ldHdvcmsgZnVuY3Rpb25zIGZvciBORlMgbW91bnQvdW1vdW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQ2h1Y2sgTGV2ZXIgPGNodWNrLmxldmVyQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9ORlNfVVRJTFNfTU9VTlRfU1RST1BUU19ICisjZGVmaW5lIF9ORlNfVVRJTFNfTU9VTlRfU1RST1BUU19ICisKK2ludCBuZnNtb3VudF9zdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAorCQkJY2hhciAqKiwgaW50LCBpbnQpOworCisjZW5kaWYJLyogX05GU19VVElMU19NT1VOVF9TVFJPUFRTX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC90b2tlbi5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3Rva2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmOTYwNAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC90b2tlbi5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogdG9rZW4uYyAtLSB0b2tlbml6ZSBzdHJpbmdzLCBhIGxhIHN0cnRvaygzKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IENodWNrIExldmVyIDxjaHVjay5sZXZlckBvcmFjbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqCisgKi8KKworLyoKKyAqIFdlJ3ZlIGNvbnN0cnVjdGVkIGEgc2ltcGxlIHN0cmluZyB0b2tlbml6ZXIgdGhhdCBpcyBiZXR0ZXIgdGhhbgorICogc3RydG9rKDMpIGluIHNldmVyYWwgd2F5czoKKyAqCisgKiAxLiAgSXQgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCBvbmdvaW5nIHRva2VuaXphdGlvbnMgdXNpbmcgc3RydG9rKDMpLgorICogMi4gIEl0J3MgcmUtZW50cmFudCBzbyB3ZSBjYW4gbmVzdCB0b2tlbml6YXRpb25zLCBpZiBuZWVkZWQuCisgKiAzLiAgSXQgY2FuIGhhbmRsZSBkb3VibGUtcXVvdGVkIGRlbGltaXRlcnMgKG5lZWRlZCBmb3IgJ2NvbnRleHQ9InNkLGZzbGoiJykuCisgKiA0LiAgSXQgZG9lc24ndCBhbHRlciB0aGUgc3RyaW5nIHdlJ3JlIHRva2VuaXppbmcsIHNvIGl0IGNhbiB3b3JrCisgKiAgICAgb24gd3JpdGUtcHJvdGVjdGVkIHN0cmluZ3MgYXMgd2VsbCBhcyB3cml0YWJsZSBzdHJpbmdzLgorICovCisKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAidG9rZW4uaCIKKworCitzdHJ1Y3QgdG9rZW5pemVyX3N0YXRlIHsKKwljaGFyICpwb3M7CisJY2hhciBkZWxpbWl0ZXI7CisJaW50IGVycm9yOworfTsKKworc3RhdGljIHZvaWQgZmluZF9uZXh0X25vbmRlbGltaXRlcihzdHJ1Y3QgdG9rZW5pemVyX3N0YXRlICp0c3RhdGUpCit7CisJd2hpbGUgKCp0c3RhdGUtPnBvcyAhPSAnXDAnICYmICp0c3RhdGUtPnBvcyA9PSB0c3RhdGUtPmRlbGltaXRlcikKKwkJdHN0YXRlLT5wb3MrKzsKK30KKworc3RhdGljIHNpemVfdCBmaW5kX25leHRfZGVsaW1pdGVyKHN0cnVjdCB0b2tlbml6ZXJfc3RhdGUgKnRzdGF0ZSkKK3sKKwlzaXplX3QgbGVuID0gMDsKKwlpbnQgcXVvdGVfc2VlbiA9IDA7CisKKwl3aGlsZSAoKnRzdGF0ZS0+cG9zICE9ICdcMCcpIHsKKwkJaWYgKCp0c3RhdGUtPnBvcyA9PSAnIicpCisJCQlxdW90ZV9zZWVuIF49IDE7CisKKwkJaWYgKCFxdW90ZV9zZWVuICYmICp0c3RhdGUtPnBvcyA9PSB0c3RhdGUtPmRlbGltaXRlcikKKwkJCWJyZWFrOworCisJCWxlbisrOworCQl0c3RhdGUtPnBvcysrOworCX0KKworCS8qIGRpZCB0aGUgc3RyaW5nIHRlcm1pbmF0ZSBiZWZvcmUgdGhlIGNsb3NlIHF1b3RlPyAqLworCWlmIChxdW90ZV9zZWVuKSB7CisJCXRzdGF0ZS0+ZXJyb3IgPSBFSU5WQUw7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogbmV4dF90b2tlbiAtIGZpbmQgdGhlIG5leHQgdG9rZW4gaW4gYSBzdHJpbmcgYW5kIHJldHVybiBpdAorICogQHRzdGF0ZTogcG9pbnRlciB0byB0b2tlbml6ZXIgY29udGV4dCBvYmplY3QKKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN0cmluZy4KKyAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBhcmUgbm8gbW9yZSB0b2tlbnMgaW4gdGhlIHN0cmluZywKKyAqIG9yIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAqCisgKiBTaWRlIGVmZmVjdDogdHN0YXRlIGlzIHVwZGF0ZWQKKyAqLworY2hhciAqbmV4dF90b2tlbihzdHJ1Y3QgdG9rZW5pemVyX3N0YXRlICp0c3RhdGUpCit7CisJY2hhciAqdG9rZW47CisJc2l6ZV90IGxlbjsKKworCWlmICghdHN0YXRlIHx8ICF0c3RhdGUtPnBvcyB8fCB0c3RhdGUtPmVycm9yKQorCQlyZXR1cm4gTlVMTDsKKworCWZpbmRfbmV4dF9ub25kZWxpbWl0ZXIodHN0YXRlKTsKKwlpZiAoKnRzdGF0ZS0+cG9zID09ICdcMCcpCisJCWdvdG8gZmFpbDsKKwl0b2tlbiA9IHRzdGF0ZS0+cG9zOworCisJbGVuID0gZmluZF9uZXh0X2RlbGltaXRlcih0c3RhdGUpOworCWlmIChsZW4pIHsKKwkJdG9rZW4gPSBzdHJuZHVwKHRva2VuLCBsZW4pOworCQlpZiAodG9rZW4pCisJCQlyZXR1cm4gdG9rZW47CisJCXRzdGF0ZS0+ZXJyb3IgPSBFTk9NRU07CisJfQorCitmYWlsOgorCXRzdGF0ZS0+cG9zID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsJCQkvKiBubyB0b2tlbnMgZm91bmQgaW4gdGhpcyBzdHJpbmcgKi8KK30KKworLyoqCisgKiBpbml0X3Rva2VuaXplciAtIHJldHVybiBhbiBpbml0aWFsaXplZCB0b2tlbml6ZXIgY29udGV4dCBvYmplY3QKKyAqIEBzdHJpbmc6IHBvaW50ZXIgdG8gQyBzdHJpbmcKKyAqIEBkZWxpbWl0ZXI6IHNpbmdsZSBjaGFyYWN0ZXIgdGhhdCBkZWxpbWl0cyB0b2tlbnMgaW4gQHN0cmluZworICoKKyAqIFJldHVybnMgYW4gaW5pdGlhbGl6ZWQgdG9rZW5pemVyIGNvbnRleHQgb2JqZWN0CisgKi8KK3N0cnVjdCB0b2tlbml6ZXJfc3RhdGUgKmluaXRfdG9rZW5pemVyKGNoYXIgKnN0cmluZywgY2hhciBkZWxpbWl0ZXIpCit7CisJc3RydWN0IHRva2VuaXplcl9zdGF0ZSAqdHN0YXRlOworCisJdHN0YXRlID0gbWFsbG9jKHNpemVvZigqdHN0YXRlKSk7CisJaWYgKHRzdGF0ZSkgeworCQl0c3RhdGUtPnBvcyA9IHN0cmluZzsKKwkJdHN0YXRlLT5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7CisJCXRzdGF0ZS0+ZXJyb3IgPSAwOworCX0KKwlyZXR1cm4gdHN0YXRlOworfQorCisvKioKKyAqIHRva2VuaXplcl9lcnJvciAtIGRpZ3MgZXJyb3IgdmFsdWUgb3V0IG9mIHRva2VuaXplciBjb250ZXh0CisgKiBAdHN0YXRlOiBwb2ludGVyIHRvIHRva2VuaXplciBjb250ZXh0IG9iamVjdAorICoKKyAqLworaW50IHRva2VuaXplcl9lcnJvcihzdHJ1Y3QgdG9rZW5pemVyX3N0YXRlICp0c3RhdGUpCit7CisJcmV0dXJuIHRzdGF0ZSA/IHRzdGF0ZS0+ZXJyb3IgOiAwOworfQorCisvKioKKyAqIGVuZF90b2tlbml6ZXIgLSBmcmVlIGEgdG9rZW5pemVyIGNvbnRleHQgb2JqZWN0CisgKiBAdHN0YXRlOiBwb2ludGVyIHRvIHRva2VuaXplciBjb250ZXh0IG9iamVjdAorICoKKyAqLwordm9pZCBlbmRfdG9rZW5pemVyKHN0cnVjdCB0b2tlbml6ZXJfc3RhdGUgKnRzdGF0ZSkKK3sKKwlmcmVlKHRzdGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvdG9rZW4uaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC90b2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjc1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvdG9rZW4uaApAQCAtMCwwICsxLDM0IEBACisvKgorICogdG9rZW4uaCAtLSB0b2tlbml6ZSBzdHJpbmdzLCBhIGxhIHN0cnRvaygzKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IENodWNrIExldmVyIDxjaHVjay5sZXZlckBvcmFjbGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTkZTX1VUSUxTX01PVU5UX1RPS0VOX0gKKyNkZWZpbmUgX05GU19VVElMU19NT1VOVF9UT0tFTl9ICisKK3N0cnVjdCB0b2tlbml6ZXJfc3RhdGU7CisKK2NoYXIgKm5leHRfdG9rZW4oc3RydWN0IHRva2VuaXplcl9zdGF0ZSAqKTsKK3N0cnVjdCB0b2tlbml6ZXJfc3RhdGUgKmluaXRfdG9rZW5pemVyKGNoYXIgKiwgY2hhcik7CitpbnQgdG9rZW5pemVyX2Vycm9yKHN0cnVjdCB0b2tlbml6ZXJfc3RhdGUgKik7Cit2b2lkIGVuZF90b2tlbml6ZXIoc3RydWN0IHRva2VuaXplcl9zdGF0ZSAqKTsKKworI2VuZGlmCS8qIF9ORlNfVVRJTFNfTU9VTlRfVE9LRU5fSCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3Vtb3VudC5uZnMubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50L3Vtb3VudC5uZnMubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YWRkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvdW1vdW50Lm5mcy5tYW4KQEAgLTAsMCArMSw3MCBAQAorLlwiQCgjKXVtb3VudC5uZnMuOCIKKy5USCBVTU9VTlQuTkZTIDggIjYgSnVuIDIwMDYiCisuU0ggTkFNRQordW1vdW50Lm5mcywgdW1vdW50Lm5mczQgXC0gdW5tb3VudCBhIE5ldHdvcmsgRmlsZSBTeXN0ZW0KKy5TSCBTWU5PUFNJUworLkJJICJ1bW91bnQubmZzIiAiIGRpciIgIiBbXC1mdm5ybGggXSIKKy5TSCBERVNDUklQVElPTgorLkJSIHVtb3VudC5uZnMKK2FuZAorLkJSIHVtb3VudC5uZnM0CithcmUgYSBwYXJ0IG9mIAorLkJSIG5mcyAoNSkKK3V0aWxpdGllcyBwYWNrYWdlLCB3aGljaCBwcm92aWRlcyBORlMgY2xpZW50IGZ1bmN0aW9uYWxpdHkuCisKKy5CUiB1bW91bnQubmZzNCAKK2FuZAorLkJSIHVtb3VudC5uZnMKK2FyZSBtZWFudCB0byBiZSB1c2VkIGJ5IHRoZQorLkJSIHVtb3VudCAoOCkKK2NvbW1hbmQgZm9yIHVubW91bnRpbmcgTkZTIHNoYXJlcy4gVGhpcyBzdWJjb21tYW5kLCBob3dldmVyLCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgc3RhbmRhbG9uZSBjb21tYW5kIHdpdGggbGltaXRlZCBmdW5jdGlvbmFsaXR5LgorCisuSSBkaXIgCitpcyB0aGUgZGlyZWN0b3J5IG9uIHdoaWNoIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkLgorCisuU0ggT1BUSU9OUworLlRQCisuQkkgIlwtZiIKK0ZvcmNlIHVubW91bnQgdGhlIGZpbGUgc3lzdGVtIGluIGNhc2Ugb2YgdW5yZWFjaGFibGUgTkZTIHN5c3RlbS4KKy5UUAorLkJJICJcLXYiCitCZSB2ZXJib3NlLgorLlRQCisuQkkgIlwtbiIKK0RvIG5vdCB1cGRhdGUgCisuSSAvZXRjL210YWIuIAorQnkgZGVmYXVsdCwgYW4gZW50cnkgaXMgY3JlYXRlZCBpbiAKKy5JIC9ldGMvbXRhYiAKK2ZvciBldmVyeSBtb3VudGVkIGZpbGUgc3lzdGVtLiBVc2UgdGhpcyBvcHRpb24gdG8gc2tpcCBkZWxldGluZyBhbiBlbnRyeS4KKy5UUAorLkJJICJcLXIiCitJbiBjYXNlIHVubW91bnRpbmcgZmFpbHMsIHRyeSB0byBtb3VudCByZWFkLW9ubHkuCisuVFAKKy5CSSAiXC1sIgorTGF6eSB1bm1vdW50LiBEZXRhY2ggdGhlIGZpbGUgc3lzdGVtIGZyb20gdGhlIGZpbGUgc3lzdGVtIGhpZXJhcmNoeSBub3csIGFuZCBjbGVhbnVwIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBmaWxlIHN5c3RlbSBhcyBzb29uIGFzIGl0IGlzIG5vdCBidXN5IGFueW1vcmUuCisuVFAKKy5CSSAiXC1oIgorUHJpbnQgaGVscCBtZXNzYWdlLgorCisuU0ggTk9URQorRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIAorLkJSIG5mcyAoNSkKK2FuZAorLkJSIHVtb3VudCAoOCkKK21hbnVhbCBwYWdlcy4KKworLlNIIEZJTEVTCisuVFAgMThuCisuSSAvZXRjL2ZzdGFiCitmaWxlIHN5c3RlbSB0YWJsZQorLlRQCisuSSAvZXRjL210YWIKK3RhYmxlIG9mIG1vdW50ZWQgZmlsZSBzeXN0ZW1zCisKKy5QRAorLlNIICJTRUUgQUxTTyIKKy5CUiBuZnMgKDUpLAorLkJSIHVtb3VudCAoOCksCisKKy5TSCAiQVVUSE9SIgorQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudC92ZXJzaW9uLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTUyYTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnQvdmVyc2lvbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiB2ZXJzaW9uLmggLS0gZ2V0IHJ1bm5pbmcga2VybmVsIHZlcnNpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX05GU19VVElMU19NT1VOVF9WRVJTSU9OX0gKKyNkZWZpbmUgX05GU19VVElMU19NT1VOVF9WRVJTSU9OX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgTUFLRV9WRVJTSU9OKHVuc2lnbmVkIGludCBwLCB1bnNpZ25lZCBpbnQgcSwKKwkJCQkJdW5zaWduZWQgaW50IHIpCit7CisJcmV0dXJuICg2NTUzNiAqIHApICsgKDI1NiAqIHEpICsgcjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbGludXhfdmVyc2lvbl9jb2RlKHZvaWQpCit7CisJc3RydWN0IHV0c25hbWUgbXlfdXRzbmFtZTsKKwl1bnNpZ25lZCBpbnQgcCwgcSwgcjsKKworCWlmICh1bmFtZSgmbXlfdXRzbmFtZSkpCisJCXJldHVybiAwOworCisJcCA9IGF0b2koc3RydG9rKG15X3V0c25hbWUucmVsZWFzZSwgIi4iKSk7CisJcSA9IGF0b2koc3RydG9rKE5VTEwsICIuIikpOworCXIgPSBhdG9pKHN0cnRvayhOVUxMLCAiLiIpKTsKKwlyZXR1cm4gTUFLRV9WRVJTSU9OKHAsIHEsIHIpOworfQorCisjZW5kaWYJLyogX05GU19VVElMU19NT1VOVF9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTgxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjEgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCittYW44X01BTlMJPSBtb3VudGQubWFuCitFWFRSQV9ESVNUCT0gJChtYW44X01BTlMpCisKK1JQQ1BSRUZJWAk9IHJwYy4KK0tQUkVGSVgJCT0gQGtwcmVmaXhACitzYmluX1BST0dSQU1TCT0gbW91bnRkCisKK21vdW50ZF9TT1VSQ0VTID0gbW91bnRkLmMgbW91bnRfZGlzcGF0Y2guYyBhdXRoLmMgcm10YWIuYyBjYWNoZS5jIFwKKwkJIHN2Y19ydW4uYyBmc2xvYy5jIHY0cm9vdC5jIG1vdW50ZC5oCittb3VudGRfTERBREQgPSAuLi8uLi9zdXBwb3J0L2V4cG9ydC9saWJleHBvcnQuYSBcCisJICAgICAgIC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKwkgICAgICAgLi4vLi4vc3VwcG9ydC9taXNjL2xpYm1pc2MuYSBcCisJICAgICAgICQoTElCQlNEKSAkKExJQldSQVApICQoTElCTlNMKSAkKExJQkJMS0lEKQorbW91bnRkX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCQkgIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSBcCisJCSAgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvZXhwb3J0CisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2YgaGF2aW5nCisjIGRhZW1vbnMgcmVuYW1lZCBkdXJpbmcgdGhlIGluc3RhbGwgdG8gaW5jbHVkZSBSUENQUkVGSVgKKyMgYW5kIHRoZSBLUFJFRklYCisjIFRoaXMgY291bGQgYWxsIGJlIGRvbmUgbXVjaCBlYXNpZXIgd2l0aCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCisjICggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMvXi8kKFJQQ1BSRUZJWCkkKEtQUkVGSVgpLyApCisjIGJ1dCB0aGF0IGFsc28gcmVuYW1lcyB0aGUgbWFuIHBhZ2VzLCB3aGljaCB0aGUgY3VycmVudAorIyBwcmFjdGljZSBkb2VzIG5vdCBkby4KK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJPR1JBTVMpOyBkbyBcCisJICAgIG12IC1mICQkcCQoRVhFRVhUKSAkKFJQQ1BSRUZJWCkkKEtQUkVGSVgpJCRwJChFWEVFWFQpIDtcCisJICBkb25lKQordW5pbnN0YWxsLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgIGZvciBwIGluICQoc2Jpbl9QUk9HUkFNUyk7IGRvIFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJChLUFJFRklYKSQkcCQoRVhFRVhUKSA7XAorCSAgZG9uZSkKKworCisjIFhYWCBUaGlzIG1ha2VzIHNvbWUgYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCBhdXRvbWFrZSBkb2VzLgorIyBYWFggQnV0IHRoZXJlIGlzIG5vIGluc3RhbGwtbWFuLWhvb2sgb3IgaW5zdGFsbC1tYW4tbG9jYWwuCitpbnN0YWxsLW1hbjogaW5zdGFsbC1tYW44IGluc3RhbGwtbWFuLWxpbmtzCit1bmluc3RhbGwtbWFuOiB1bmluc3RhbGwtbWFuOCB1bmluc3RhbGwtbWFuLWxpbmtzCisKK2luc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgICAgJChMTl9TKSAkJGluc3QgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgZG9uZSkKKwordW5pbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjczM2RmCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDgxOSBAQAorIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYnkgYXV0b21ha2UgMS4xMS4xIGZyb20gTWFrZWZpbGUuYW0uCisjIEBjb25maWd1cmVfaW5wdXRACisKKyMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLAorIyAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisjIEluYy4KKyMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCisjIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKKyMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQorIyBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0BTRVRfTUFLRUAKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc2Jpbl9QUk9HUkFNUyA9IG1vdW50ZCQoRVhFRVhUKQorc3ViZGlyID0gdXRpbHMvbW91bnRkCitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiCitQUk9HUkFNUyA9ICQoc2Jpbl9QUk9HUkFNUykKK2FtX21vdW50ZF9PQkpFQ1RTID0gbW91bnRkLW1vdW50ZC4kKE9CSkVYVCkgXAorCW1vdW50ZC1tb3VudF9kaXNwYXRjaC4kKE9CSkVYVCkgbW91bnRkLWF1dGguJChPQkpFWFQpIFwKKwltb3VudGQtcm10YWIuJChPQkpFWFQpIG1vdW50ZC1jYWNoZS4kKE9CSkVYVCkgXAorCW1vdW50ZC1zdmNfcnVuLiQoT0JKRVhUKSBtb3VudGQtZnNsb2MuJChPQkpFWFQpIFwKKwltb3VudGQtdjRyb290LiQoT0JKRVhUKQorbW91bnRkX09CSkVDVFMgPSAkKGFtX21vdW50ZF9PQkpFQ1RTKQorYW1fX0RFUEVOREVOQ0lFU18xID0KK21vdW50ZF9ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L2V4cG9ydC9saWJleHBvcnQuYSBcCisJLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgLi4vLi4vc3VwcG9ydC9taXNjL2xpYm1pc2MuYSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKQorREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKK2RlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKK2FtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCithbV9fbXYgPSBtdiAtZgorQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSBcCisJJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorTFRDT01QSUxFID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgXAorCSQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0NDTEQgPSAkKENDKQorTElOSyA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoQU1fTERGTEFHUykgXAorCSQoTERGTEFHUykgLW8gJEAKK1NPVVJDRVMgPSAkKG1vdW50ZF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChtb3VudGRfU09VUkNFUykKK2FtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOworYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKKyAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorICAgICopIGY9JCRwOzsgXAorICBlc2FjOworYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOworYW1fX2luc3RhbGxfbWF4ID0gNDAKK2FtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCisgIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKK2FtX19ub2Jhc2Vfc3RyaXAgPSBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgorYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAorICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCisgICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAorICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAorICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKK2FtX19iYXNlX2xpc3QgPSBcCisgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCisgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorTlJPRkYgPSBucm9mZgorTUFOUyA9ICQobWFuOF9NQU5TKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FDTE9DQUxfQU1GTEFHUyA9IEBBQ0xPQ0FMX0FNRkxBR1NACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBTV9DRkxBR1MgPSBAQU1fQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSBAQU1fQ1BQRkxBR1NACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK21hbjhfTUFOUyA9IG1vdW50ZC5tYW4KK0VYVFJBX0RJU1QgPSAkKG1hbjhfTUFOUykKK1JQQ1BSRUZJWCA9IHJwYy4KK0tQUkVGSVggPSBAa3ByZWZpeEAKK21vdW50ZF9TT1VSQ0VTID0gbW91bnRkLmMgbW91bnRfZGlzcGF0Y2guYyBhdXRoLmMgcm10YWIuYyBjYWNoZS5jIFwKKwkJIHN2Y19ydW4uYyBmc2xvYy5jIHY0cm9vdC5jIG1vdW50ZC5oCisKK21vdW50ZF9MREFERCA9IC4uLy4uL3N1cHBvcnQvZXhwb3J0L2xpYmV4cG9ydC5hIFwKKwkgICAgICAgLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCSAgICAgICAuLi8uLi9zdXBwb3J0L21pc2MvbGlibWlzYy5hIFwKKwkgICAgICAgJChMSUJCU0QpICQoTElCV1JBUCkgJChMSUJOU0wpICQoTElCQkxLSUQpCisKK21vdW50ZF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpIFwKKwkJICAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgXAorCQkgIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2V4cG9ydAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB1dGlscy9tb3VudGQvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvbW91bnRkL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgoraW5zdGFsbC1zYmluUFJPR1JBTVM6ICQoc2Jpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHNiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChzYmluZGlyKSIKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKwlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCisJd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKKwkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAorCWRvbmUgfCBcCisJc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAorCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCisJICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCisJICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKKwkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKKwl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChzYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKHNiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtc2JpblBST0dSQU1TOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChzYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHNiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK2NsZWFuLXNiaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorbW91bnRkJChFWEVFWFQpOiAkKG1vdW50ZF9PQkpFQ1RTKSAkKG1vdW50ZF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBtb3VudGQkKEVYRUVYVCkKKwkkKExJTkspICQobW91bnRkX09CSkVDVFMpICQobW91bnRkX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tb3VudGQtYXV0aC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbW91bnRkLWNhY2hlLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tb3VudGQtZnNsb2MuUG9AYW1fX3F1b3RlQAorQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL21vdW50ZC1tb3VudF9kaXNwYXRjaC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbW91bnRkLW1vdW50ZC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbW91bnRkLXJtdGFiLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9tb3VudGQtc3ZjX3J1bi5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbW91bnRkLXY0cm9vdC5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3VudGQtbW91bnRkLm86IG1vdW50ZC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1tb3VudGQubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLW1vdW50ZC5UcG8gLWMgLW8gbW91bnRkLW1vdW50ZC5vIGB0ZXN0IC1mICdtb3VudGQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgbW91bnRkLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbW91bnRkLW1vdW50ZC5UcG8gJChERVBESVIpL21vdW50ZC1tb3VudGQuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J21vdW50ZC5jJyBvYmplY3Q9J21vdW50ZC1tb3VudGQubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1vdW50ZC1tb3VudGQubyBgdGVzdCAtZiAnbW91bnRkLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYG1vdW50ZC5jCisKK21vdW50ZC1tb3VudGQub2JqOiBtb3VudGQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtb3VudGQtbW91bnRkLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLW1vdW50ZC5UcG8gLWMgLW8gbW91bnRkLW1vdW50ZC5vYmogYGlmIHRlc3QgLWYgJ21vdW50ZC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21vdW50ZC5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9tb3VudGQuYyc7IGZpYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tb3VudGQtbW91bnRkLlRwbyAkKERFUERJUikvbW91bnRkLW1vdW50ZC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbW91bnRkLmMnIG9iamVjdD0nbW91bnRkLW1vdW50ZC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtbW91bnRkLm9iaiBgaWYgdGVzdCAtZiAnbW91bnRkLmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnbW91bnRkLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vdW50ZC5jJzsgZmlgCisKK21vdW50ZC1tb3VudF9kaXNwYXRjaC5vOiBtb3VudF9kaXNwYXRjaC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1tb3VudF9kaXNwYXRjaC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9tb3VudGQtbW91bnRfZGlzcGF0Y2guVHBvIC1jIC1vIG1vdW50ZC1tb3VudF9kaXNwYXRjaC5vIGB0ZXN0IC1mICdtb3VudF9kaXNwYXRjaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb3VudF9kaXNwYXRjaC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC1tb3VudF9kaXNwYXRjaC5UcG8gJChERVBESVIpL21vdW50ZC1tb3VudF9kaXNwYXRjaC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nbW91bnRfZGlzcGF0Y2guYycgb2JqZWN0PSdtb3VudGQtbW91bnRfZGlzcGF0Y2gubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1vdW50ZC1tb3VudF9kaXNwYXRjaC5vIGB0ZXN0IC1mICdtb3VudF9kaXNwYXRjaC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2Btb3VudF9kaXNwYXRjaC5jCisKK21vdW50ZC1tb3VudF9kaXNwYXRjaC5vYmo6IG1vdW50X2Rpc3BhdGNoLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbW91bnRkLW1vdW50X2Rpc3BhdGNoLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLW1vdW50X2Rpc3BhdGNoLlRwbyAtYyAtbyBtb3VudGQtbW91bnRfZGlzcGF0Y2gub2JqIGBpZiB0ZXN0IC1mICdtb3VudF9kaXNwYXRjaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21vdW50X2Rpc3BhdGNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vdW50X2Rpc3BhdGNoLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbW91bnRkLW1vdW50X2Rpc3BhdGNoLlRwbyAkKERFUERJUikvbW91bnRkLW1vdW50X2Rpc3BhdGNoLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdtb3VudF9kaXNwYXRjaC5jJyBvYmplY3Q9J21vdW50ZC1tb3VudF9kaXNwYXRjaC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtbW91bnRfZGlzcGF0Y2gub2JqIGBpZiB0ZXN0IC1mICdtb3VudF9kaXNwYXRjaC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ21vdW50X2Rpc3BhdGNoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL21vdW50X2Rpc3BhdGNoLmMnOyBmaWAKKworbW91bnRkLWF1dGgubzogYXV0aC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1hdXRoLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21vdW50ZC1hdXRoLlRwbyAtYyAtbyBtb3VudGQtYXV0aC5vIGB0ZXN0IC1mICdhdXRoLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYGF1dGguYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tb3VudGQtYXV0aC5UcG8gJChERVBESVIpL21vdW50ZC1hdXRoLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdhdXRoLmMnIG9iamVjdD0nbW91bnRkLWF1dGgubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1vdW50ZC1hdXRoLm8gYHRlc3QgLWYgJ2F1dGguYycgfHwgZWNobyAnJChzcmNkaXIpLydgYXV0aC5jCisKK21vdW50ZC1hdXRoLm9iajogYXV0aC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1hdXRoLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLWF1dGguVHBvIC1jIC1vIG1vdW50ZC1hdXRoLm9iaiBgaWYgdGVzdCAtZiAnYXV0aC5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2F1dGguYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvYXV0aC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC1hdXRoLlRwbyAkKERFUERJUikvbW91bnRkLWF1dGguUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2F1dGguYycgb2JqZWN0PSdtb3VudGQtYXV0aC5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtYXV0aC5vYmogYGlmIHRlc3QgLWYgJ2F1dGguYyc7IHRoZW4gJChDWUdQQVRIX1cpICdhdXRoLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2F1dGguYyc7IGZpYAorCittb3VudGQtcm10YWIubzogcm10YWIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtb3VudGQtcm10YWIubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLXJtdGFiLlRwbyAtYyAtbyBtb3VudGQtcm10YWIubyBgdGVzdCAtZiAncm10YWIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcm10YWIuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tb3VudGQtcm10YWIuVHBvICQoREVQRElSKS9tb3VudGQtcm10YWIuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3JtdGFiLmMnIG9iamVjdD0nbW91bnRkLXJtdGFiLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtcm10YWIubyBgdGVzdCAtZiAncm10YWIuYycgfHwgZWNobyAnJChzcmNkaXIpLydgcm10YWIuYworCittb3VudGQtcm10YWIub2JqOiBybXRhYi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1ybXRhYi5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21vdW50ZC1ybXRhYi5UcG8gLWMgLW8gbW91bnRkLXJtdGFiLm9iaiBgaWYgdGVzdCAtZiAncm10YWIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdybXRhYi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ybXRhYi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC1ybXRhYi5UcG8gJChERVBESVIpL21vdW50ZC1ybXRhYi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ncm10YWIuYycgb2JqZWN0PSdtb3VudGQtcm10YWIub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbW91bnRkLXJtdGFiLm9iaiBgaWYgdGVzdCAtZiAncm10YWIuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdybXRhYi5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9ybXRhYi5jJzsgZmlgCisKK21vdW50ZC1jYWNoZS5vOiBjYWNoZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1jYWNoZS5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9tb3VudGQtY2FjaGUuVHBvIC1jIC1vIG1vdW50ZC1jYWNoZS5vIGB0ZXN0IC1mICdjYWNoZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjYWNoZS5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC1jYWNoZS5UcG8gJChERVBESVIpL21vdW50ZC1jYWNoZS5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nY2FjaGUuYycgb2JqZWN0PSdtb3VudGQtY2FjaGUubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1vdW50ZC1jYWNoZS5vIGB0ZXN0IC1mICdjYWNoZS5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BjYWNoZS5jCisKK21vdW50ZC1jYWNoZS5vYmo6IGNhY2hlLmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbW91bnRkLWNhY2hlLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLWNhY2hlLlRwbyAtYyAtbyBtb3VudGQtY2FjaGUub2JqIGBpZiB0ZXN0IC1mICdjYWNoZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NhY2hlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NhY2hlLmMnOyBmaWAKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvbW91bnRkLWNhY2hlLlRwbyAkKERFUERJUikvbW91bnRkLWNhY2hlLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdjYWNoZS5jJyBvYmplY3Q9J21vdW50ZC1jYWNoZS5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtY2FjaGUub2JqIGBpZiB0ZXN0IC1mICdjYWNoZS5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ2NhY2hlLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL2NhY2hlLmMnOyBmaWAKKworbW91bnRkLXN2Y19ydW4ubzogc3ZjX3J1bi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1zdmNfcnVuLm8gLU1EIC1NUCAtTUYgJChERVBESVIpL21vdW50ZC1zdmNfcnVuLlRwbyAtYyAtbyBtb3VudGQtc3ZjX3J1bi5vIGB0ZXN0IC1mICdzdmNfcnVuLmMnIHx8IGVjaG8gJyQoc3JjZGlyKS8nYHN2Y19ydW4uYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tb3VudGQtc3ZjX3J1bi5UcG8gJChERVBESVIpL21vdW50ZC1zdmNfcnVuLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzdmNfcnVuLmMnIG9iamVjdD0nbW91bnRkLXN2Y19ydW4ubycgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1vdW50ZC1zdmNfcnVuLm8gYHRlc3QgLWYgJ3N2Y19ydW4uYycgfHwgZWNobyAnJChzcmNkaXIpLydgc3ZjX3J1bi5jCisKK21vdW50ZC1zdmNfcnVuLm9iajogc3ZjX3J1bi5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1zdmNfcnVuLm9iaiAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLXN2Y19ydW4uVHBvIC1jIC1vIG1vdW50ZC1zdmNfcnVuLm9iaiBgaWYgdGVzdCAtZiAnc3ZjX3J1bi5jJzsgdGhlbiAkKENZR1BBVEhfVykgJ3N2Y19ydW4uYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc3ZjX3J1bi5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC1zdmNfcnVuLlRwbyAkKERFUERJUikvbW91bnRkLXN2Y19ydW4uUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J3N2Y19ydW4uYycgb2JqZWN0PSdtb3VudGQtc3ZjX3J1bi5vYmonIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtc3ZjX3J1bi5vYmogYGlmIHRlc3QgLWYgJ3N2Y19ydW4uYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzdmNfcnVuLmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3N2Y19ydW4uYyc7IGZpYAorCittb3VudGQtZnNsb2MubzogZnNsb2MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1NVCBtb3VudGQtZnNsb2MubyAtTUQgLU1QIC1NRiAkKERFUERJUikvbW91bnRkLWZzbG9jLlRwbyAtYyAtbyBtb3VudGQtZnNsb2MubyBgdGVzdCAtZiAnZnNsb2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnNsb2MuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tb3VudGQtZnNsb2MuVHBvICQoREVQRElSKS9tb3VudGQtZnNsb2MuUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9J2ZzbG9jLmMnIG9iamVjdD0nbW91bnRkLWZzbG9jLm8nIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtYyAtbyBtb3VudGQtZnNsb2MubyBgdGVzdCAtZiAnZnNsb2MuYycgfHwgZWNobyAnJChzcmNkaXIpLydgZnNsb2MuYworCittb3VudGQtZnNsb2Mub2JqOiBmc2xvYy5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC1mc2xvYy5vYmogLU1EIC1NUCAtTUYgJChERVBESVIpL21vdW50ZC1mc2xvYy5UcG8gLWMgLW8gbW91bnRkLWZzbG9jLm9iaiBgaWYgdGVzdCAtZiAnZnNsb2MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc2xvYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc2xvYy5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC1mc2xvYy5UcG8gJChERVBESVIpL21vdW50ZC1mc2xvYy5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nZnNsb2MuYycgb2JqZWN0PSdtb3VudGQtZnNsb2Mub2JqJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbW91bnRkLWZzbG9jLm9iaiBgaWYgdGVzdCAtZiAnZnNsb2MuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdmc2xvYy5jJzsgZWxzZSAkKENZR1BBVEhfVykgJyQoc3JjZGlyKS9mc2xvYy5jJzsgZmlgCisKK21vdW50ZC12NHJvb3QubzogdjRyb290LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKG1vdW50ZF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgbW91bnRkLXY0cm9vdC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9tb3VudGQtdjRyb290LlRwbyAtYyAtbyBtb3VudGQtdjRyb290Lm8gYHRlc3QgLWYgJ3Y0cm9vdC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2B2NHJvb3QuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9tb3VudGQtdjRyb290LlRwbyAkKERFUERJUikvbW91bnRkLXY0cm9vdC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0ndjRyb290LmMnIG9iamVjdD0nbW91bnRkLXY0cm9vdC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gbW91bnRkLXY0cm9vdC5vIGB0ZXN0IC1mICd2NHJvb3QuYycgfHwgZWNobyAnJChzcmNkaXIpLydgdjRyb290LmMKKworbW91bnRkLXY0cm9vdC5vYmo6IHY0cm9vdC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChtb3VudGRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIG1vdW50ZC12NHJvb3Qub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9tb3VudGQtdjRyb290LlRwbyAtYyAtbyBtb3VudGQtdjRyb290Lm9iaiBgaWYgdGVzdCAtZiAndjRyb290LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAndjRyb290LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Y0cm9vdC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL21vdW50ZC12NHJvb3QuVHBvICQoREVQRElSKS9tb3VudGQtdjRyb290LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSd2NHJvb3QuYycgb2JqZWN0PSdtb3VudGQtdjRyb290Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQobW91bnRkX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIG1vdW50ZC12NHJvb3Qub2JqIGBpZiB0ZXN0IC1mICd2NHJvb3QuYyc7IHRoZW4gJChDWUdQQVRIX1cpICd2NHJvb3QuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2RpcikvdjRyb290LmMnOyBmaWAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtbWFuODogJChtYW44X01BTlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtYW44ZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuOGRpcikiCisJQGxpc3Q9JyQobWFuOF9NQU5TKSc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCXsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHdoaWxlIHJlYWQgcDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ247cywuKi8sLDtwO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCcgfCBcCisJc2VkICdOO047cyxcbiwgLGcnIHwgeyBcCisJbGlzdD07IHdoaWxlIHJlYWQgZmlsZSBiYXNlIGluc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkYmFzZSIgPSAiJCRpbnN0IjsgdGhlbiBsaXN0PSIkJGxpc3QgJCRmaWxlIjsgZWxzZSBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZmlsZScgJyQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0IiB8fCBleGl0ICQkPzsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtYW44ZGlyKSciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtYW44ZGlyKSIgfHwgZXhpdCAkJD87IH07IFwKKwlkb25lOyB9CisKK3VuaW5zdGFsbC1tYW44OgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobWFuOF9NQU5TKSc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWB7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCBzZWQgLWUgJ3MsLiovLCw7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJ2A7IFwKKwl0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgIGVjaG8gIiAoIGNkICckKERFU1RESVIpJChtYW44ZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJICBjZCAiJChERVNURElSKSQobWFuOGRpcikiICYmIHJtIC1mICQkZmlsZXM7IH0KKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGxpc3Q9JyQoTUFOUyknOyBpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlbHNlIDo7IGZpOyBkb25lYDsgXAorCSAgaWYgdGVzdCAtbiAiJCRsaXN0IiAmJiBcCisJICAgIGdyZXAgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0ID4vZGV2L251bGw7IHRoZW4gXAorCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIFxgbWlzc2luZyBoZWxwMm1hbicgcmVwbGFjZW1lbnQgdGV4dDoiID4mMjsgXAorCSAgICBncmVwIC1sICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCB8IHNlZCAncy9eLyAgICAgICAgIC8nID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdG8gZml4IHRoZW0sIGluc3RhbGwgaGVscDJtYW4sIHJlbW92ZSBhbmQgcmVnZW5lcmF0ZSB0aGUgbWFuIHBhZ2VzOyIgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0eXBpY2FsbHkgXGBtYWtlIG1haW50YWluZXItY2xlYW4nIHdpbGwgcmVtb3ZlIHRoZW0iID4mMjsgXAorCSAgICBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwllbHNlIDo7IGZpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXNiaW5QUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLXNiaW5QUk9HUkFNUworCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1ob29rCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtc2JpblBST0dSQU1TCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLWhvb2sKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLXN0cmlwIHVuaW5zdGFsbC1hbQorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYy1ob29rIFwKKwlpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAorCWluc3RhbGwtbWFuIGluc3RhbGwtbWFuOCBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIFwKKwlpbnN0YWxsLXBzLWFtIGluc3RhbGwtc2JpblBST0dSQU1TIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWhvb2sgdW5pbnN0YWxsLW1hbiBcCisJdW5pbnN0YWxsLW1hbjggdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBmb2xsb3dpbmcgYWxsb3dzIHRoZSBjdXJyZW50IHByYWN0aWNlIG9mIGhhdmluZworIyBkYWVtb25zIHJlbmFtZWQgZHVyaW5nIHRoZSBpbnN0YWxsIHRvIGluY2x1ZGUgUlBDUFJFRklYCisjIGFuZCB0aGUgS1BSRUZJWAorIyBUaGlzIGNvdWxkIGFsbCBiZSBkb25lIG11Y2ggZWFzaWVyIHdpdGggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorIyAoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBzL14vJChSUENQUkVGSVgpJChLUFJFRklYKS8gKQorIyBidXQgdGhhdCBhbHNvIHJlbmFtZXMgdGhlIG1hbiBwYWdlcywgd2hpY2ggdGhlIGN1cnJlbnQKKyMgcHJhY3RpY2UgZG9lcyBub3QgZG8uCitpbnN0YWxsLWV4ZWMtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgZm9yIHAgaW4gJChzYmluX1BST0dSQU1TKTsgZG8gXAorCSAgICBtdiAtZiAkJHAkKEVYRUVYVCkgJChSUENQUkVGSVgpJChLUFJFRklYKSQkcCQoRVhFRVhUKSA7XAorCSAgZG9uZSkKK3VuaW5zdGFsbC1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJPR1JBTVMpOyBkbyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCisKKyMgWFhYIFRoaXMgbWFrZXMgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGF1dG9tYWtlIGRvZXMuCisjIFhYWCBCdXQgdGhlcmUgaXMgbm8gaW5zdGFsbC1tYW4taG9vayBvciBpbnN0YWxsLW1hbi1sb2NhbC4KK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjggaW5zdGFsbC1tYW4tbGlua3MKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44IHVuaW5zdGFsbC1tYW4tbGlua3MKKworaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgICAkKExOX1MpICQkaW5zdCAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCit1bmluc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvYXV0aC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYmE3MAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvYXV0aC5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogdXRpbHMvbW91bnRkL2F1dGguYworICoKKyAqIEF1dGhlbnRpY2F0aW9uIHByb2NlZHVyZXMgZm9yIG1vdW50ZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibmZzbGliLmgiCisjaW5jbHVkZSAiZXhwb3J0ZnMuaCIKKyNpbmNsdWRlICJtb3VudGQuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAidjRyb290LmgiCisKK2VudW0gYXV0aF9lcnJvcgoreworICBiYWRfcGF0aCwKKyAgdW5rbm93bl9ob3N0LAorICBub19lbnRyeSwKKyAgbm90X2V4cG9ydGVkLAorICBpbGxlZ2FsX3BvcnQsCisgIHN1Y2Nlc3MKK307CisKK3N0YXRpYyB2b2lkCQlhdXRoX2ZpeHBhdGgoY2hhciAqcGF0aCk7CitzdGF0aWMgY2hhcgkqZXhwb3J0X2ZpbGUgPSBOVUxMOworc3RhdGljIG5mc19leHBvcnQgbXlfZXhwOworc3RhdGljIG5mc19jbGllbnQgbXlfY2xpZW50OworCitleHRlcm4gaW50IG5ld19jYWNoZTsKK2V4dGVybiBpbnQgdXNlX2lwYWRkcjsKKwordm9pZAorYXV0aF9pbml0KGNoYXIgKmV4cG9ydHMpCit7CisKKwlleHBvcnRfZmlsZSA9IGV4cG9ydHM7CisJYXV0aF9yZWxvYWQoKTsKKwl4dGFiX21vdW50X3dyaXRlKCk7Cit9CisKKy8qCisgKiBBIGNsaWVudCBjYW4gbWF0Y2ggbWFueSBkaWZmZXJlbnQgbmV0Z3JvdXBzIGFuZCBpdCdzIHRvdWdoIHRvIGtub3cKKyAqIGJlZm9yZWhhbmQgd2hldGhlciBpdCB3aWxsLiBJZiB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyBvZiBuZXRncm91cAorICogbV9ob3N0bmFtZXMgaXMgPjUxMiBieXRlcywgdGhlbiBlbmFibGUgdGhlICJ1c2VfaXBhZGRyIiBtb2RlLiBUaGlzCisgKiBtYWtlcyBtb3VudGQgY2hhbmdlIGhvdyBpdCBtYXRjaGVzIGEgY2xpZW50IGlwIGFkZHJlc3Mgd2hlbiBhIG1vdW50CisgKiByZXF1ZXN0IGNvbWVzIGluLiBJdCdzIG1vcmUgZWZmaWNpZW50IGF0IGhhbmRsaW5nIG5ldGdyb3VwcyBhdCB0aGUKKyAqIGV4cGVuc2Ugb2YgbGFyZ2VyIGtlcm5lbCBjYWNoZXMuCisgKi8KK3N0YXRpYyB2b2lkCitjaGVja191c2VpcGFkZHIodm9pZCkKK3sKKwluZnNfY2xpZW50ICpjbHA7CisJaW50IG9sZF91c2VfaXBhZGRyID0gdXNlX2lwYWRkcjsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKworCS8qIGFkZCBsZW5ndGggb2YgbV9ob3N0bmFtZSArIDEgZm9yIHRoZSBjb21tYSAqLworCWZvciAoY2xwID0gY2xpZW50bGlzdFtNQ0xfTkVUR1JPVVBdOyBjbHA7IGNscCA9IGNscC0+bV9uZXh0KQorCQlsZW4gKz0gKHN0cmxlbihjbHAtPm1faG9zdG5hbWUpICsgMSk7CisKKwlpZiAobGVuID4gKE5GU0NMTlRfSURNQVggLyAyKSkKKwkJdXNlX2lwYWRkciA9IDE7CisJZWxzZQorCQl1c2VfaXBhZGRyID0gMDsKKworCWlmICh1c2VfaXBhZGRyICE9IG9sZF91c2VfaXBhZGRyKQorCQljYWNoZV9mbHVzaCgxKTsKK30KKwordW5zaWduZWQgaW50CithdXRoX3JlbG9hZCgpCit7CisJc3RydWN0IHN0YXQJCXN0YjsKKwlzdGF0aWMgaW5vX3QJCWxhc3RfaW5vZGU7CisJc3RhdGljIGludAkJbGFzdF9mZDsKKwlzdGF0aWMgdW5zaWduZWQgaW50CWNvdW50ZXI7CisJaW50CQkJZmQ7CisKKwlpZiAoKGZkID0gb3BlbihfUEFUSF9FVEFCLCBPX1JET05MWSkpIDwgMCkgeworCQl4bG9nKExfRkFUQUwsICJjb3VsZG4ndCBvcGVuICVzIiwgX1BBVEhfRVRBQik7CisJfSBlbHNlIGlmIChmc3RhdChmZCwgJnN0YikgPCAwKSB7CisJCXhsb2coTF9GQVRBTCwgImNvdWxkbid0IHN0YXQgJXMiLCBfUEFUSF9FVEFCKTsKKwl9IGVsc2UgaWYgKHN0Yi5zdF9pbm8gPT0gbGFzdF9pbm9kZSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiBjb3VudGVyOworCX0gZWxzZSB7CisJCWNsb3NlKGxhc3RfZmQpOworCQlsYXN0X2ZkID0gZmQ7CisJCWxhc3RfaW5vZGUgPSBzdGIuc3RfaW5vOworCX0KKworCWV4cG9ydF9mcmVlYWxsKCk7CisJbWVtc2V0KCZteV9jbGllbnQsIDAsIHNpemVvZihteV9jbGllbnQpKTsKKwl4dGFiX2V4cG9ydF9yZWFkKCk7CisJY2hlY2tfdXNlaXBhZGRyKCk7CisJdjRyb290X3NldCgpOworCisJKytjb3VudGVyOworCisJcmV0dXJuIGNvdW50ZXI7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfY2xpZW50X2hvc3RuYW1lKHN0cnVjdCBzb2NrYWRkcl9pbiAqY2FsbGVyLCBzdHJ1Y3QgaG9zdGVudCAqaHAsIGVudW0gYXV0aF9lcnJvciAqZXJyb3IpCit7CisJY2hhciAqbjsKKworCWlmICh1c2VfaXBhZGRyKQorCQlyZXR1cm4gc3RyZHVwKGluZXRfbnRvYShjYWxsZXItPnNpbl9hZGRyKSk7CisJbiA9IGNsaWVudF9jb21wb3NlKGhwKTsKKwkqZXJyb3IgPSB1bmtub3duX2hvc3Q7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKm4pCisJCXJldHVybiBuOworCWZyZWUobik7CisJcmV0dXJuIHN0cmR1cCgiREVGQVVMVCIpOworfQorCisvKiByZXR1cm4gc3RhdGljIG5mc19leHBvcnQgd2l0aCBkZXRhaWxzIGZpbGxlZCBpbiAqLworc3RhdGljIG5mc19leHBvcnQgKgorYXV0aF9hdXRoZW50aWNhdGVfbmV3Y2FjaGUoY2hhciAqd2hhdCwgc3RydWN0IHNvY2thZGRyX2luICpjYWxsZXIsCisJCQkgICBjaGFyICpwYXRoLCBzdHJ1Y3QgaG9zdGVudCAqaHAsCisJCQkgICBlbnVtIGF1dGhfZXJyb3IgKmVycm9yKQoreworCW5mc19leHBvcnQgKmV4cDsKKwlpbnQgaTsKKworCWZyZWUobXlfY2xpZW50Lm1faG9zdG5hbWUpOworCisJbXlfY2xpZW50Lm1faG9zdG5hbWUgPSBnZXRfY2xpZW50X2hvc3RuYW1lKGNhbGxlciwgaHAsIGVycm9yKTsKKwlpZiAobXlfY2xpZW50Lm1faG9zdG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlteV9jbGllbnQubV9uYWRkciA9IDE7CisJbXlfY2xpZW50Lm1fYWRkcmxpc3RbMF0gPSBjYWxsZXItPnNpbl9hZGRyOworCW15X2V4cC5tX2NsaWVudCA9ICZteV9jbGllbnQ7CisKKwlleHAgPSBOVUxMOworCWZvciAoaSA9IDA7ICFleHAgJiYgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKQorCQlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaV0ucF9oZWFkOyBleHA7IGV4cCA9IGV4cC0+bV9uZXh0KSB7CisJCQlpZiAoc3RyY21wKHBhdGgsIGV4cC0+bV9leHBvcnQuZV9wYXRoKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghdXNlX2lwYWRkciAmJiAhY2xpZW50X21lbWJlcihteV9jbGllbnQubV9ob3N0bmFtZSwgZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZSkpCisJCQkJY29udGludWU7CisJCQlpZiAodXNlX2lwYWRkciAmJiAhY2xpZW50X2NoZWNrKGV4cC0+bV9jbGllbnQsIGhwKSkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQl9CisJKmVycm9yID0gbm90X2V4cG9ydGVkOworCWlmICghZXhwKQorCQlyZXR1cm4gTlVMTDsKKworCW15X2V4cC5tX2V4cG9ydCA9IGV4cC0+bV9leHBvcnQ7CisJZXhwID0gJm15X2V4cDsKKwlyZXR1cm4gZXhwOworfQorCitzdGF0aWMgbmZzX2V4cG9ydCAqCithdXRoX2F1dGhlbnRpY2F0ZV9pbnRlcm5hbChjaGFyICp3aGF0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmNhbGxlciwKKwkJCSAgIGNoYXIgKnBhdGgsIHN0cnVjdCBob3N0ZW50ICpocCwKKwkJCSAgIGVudW0gYXV0aF9lcnJvciAqZXJyb3IpCit7CisJbmZzX2V4cG9ydCAqZXhwOworCisJaWYgKG5ld19jYWNoZSkgeworCQlleHAgPSBhdXRoX2F1dGhlbnRpY2F0ZV9uZXdjYWNoZSh3aGF0LCBjYWxsZXIsIHBhdGgsIGhwLCBlcnJvcik7CisJCWlmICghZXhwKQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKCEoZXhwID0gZXhwb3J0X2ZpbmQoaHAsIHBhdGgpKSkgeworCQkJKmVycm9yID0gbm9fZW50cnk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlpZiAoZXhwLT5tX2V4cG9ydC5lX2ZsYWdzICYgTkZTRVhQX1Y0Uk9PVCkgeworCQkqZXJyb3IgPSBub19lbnRyeTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghKGV4cC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9JTlNFQ1VSRV9QT1JUKSAmJgorCQkgICAgIG50b2hzKGNhbGxlci0+c2luX3BvcnQpID49IElQUE9SVF9SRVNFUlZFRCkgeworCQkqZXJyb3IgPSBpbGxlZ2FsX3BvcnQ7CisJCXJldHVybiBOVUxMOworCX0KKwkqZXJyb3IgPSBzdWNjZXNzOworCisJcmV0dXJuIGV4cDsKK30KKworbmZzX2V4cG9ydCAqCithdXRoX2F1dGhlbnRpY2F0ZShjaGFyICp3aGF0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmNhbGxlciwgY2hhciAqcGF0aCkKK3sKKwluZnNfZXhwb3J0CSpleHAgPSBOVUxMOworCWNoYXIJCWVwYXRoW01BWFBBVEhMRU4rMV07CisJY2hhcgkJKnAgPSBOVUxMOworCXN0cnVjdCBob3N0ZW50CSpocCA9IE5VTEw7CisJc3RydWN0IGluX2FkZHIJYWRkciA9IGNhbGxlci0+c2luX2FkZHI7CisJZW51bSBhdXRoX2Vycm9yCWVycm9yID0gYmFkX3BhdGg7CisKKwlpZiAocGF0aCBbMF0gIT0gJy8nKSB7CisJCXhsb2coTF9XQVJOSU5HLCAiYmFkIHBhdGggaW4gJXMgcmVxdWVzdCBmcm9tICVzOiBcIiVzXCIiLAorCQkgICAgIHdoYXQsIGluZXRfbnRvYShhZGRyKSwgcGF0aCk7CisJCXJldHVybiBleHA7CisJfQorCisJc3RybmNweShlcGF0aCwgcGF0aCwgc2l6ZW9mIChlcGF0aCkgLSAxKTsKKwllcGF0aFtzaXplb2YgKGVwYXRoKSAtIDFdID0gJ1wwJzsKKwlhdXRoX2ZpeHBhdGgoZXBhdGgpOyAvKiBzdHJpcCBkdXBsaWNhdGUgJy8nIGV0YyAqLworCisJaHAgPSBjbGllbnRfcmVzb2x2ZShjYWxsZXItPnNpbl9hZGRyKTsKKwlpZiAoIWhwKQorCQlyZXR1cm4gZXhwOworCisJLyogVHJ5IHRoZSBsb25nZXN0IG1hdGNoaW5nIGV4cG9ydGVkIHBhdGhuYW1lLiAqLworCXdoaWxlICgxKSB7CisJCWV4cCA9IGF1dGhfYXV0aGVudGljYXRlX2ludGVybmFsKHdoYXQsIGNhbGxlciwgZXBhdGgsCisJCQkJCQkgaHAsICZlcnJvcik7CisJCWlmIChleHAgfHwgKGVycm9yICE9IG5vdF9leHBvcnRlZCAmJiBlcnJvciAhPSBub19lbnRyeSkpCisJCQlicmVhazsKKwkJLyogV2UgaGF2ZSB0byB0cmVhdCB0aGUgcm9vdCwgIi8iLCBzcGVjaWFsbHkuICovCisJCWlmIChwID09ICZlcGF0aFsxXSkgYnJlYWs7CisJCXAgPSBzdHJyY2hyKGVwYXRoLCAnLycpOworCQlpZiAocCA9PSBlcGF0aCkgcCsrOworCQkqcCA9ICdcMCc7CisJfQorCisJc3dpdGNoIChlcnJvcikgeworCWNhc2UgYmFkX3BhdGg6CisJCXhsb2coTF9XQVJOSU5HLCAiYmFkIHBhdGggaW4gJXMgcmVxdWVzdCBmcm9tICVzOiBcIiVzXCIiLAorCQkgICAgIHdoYXQsIGluZXRfbnRvYShhZGRyKSwgcGF0aCk7CisJCWJyZWFrOworCisJY2FzZSB1bmtub3duX2hvc3Q6CisJCXhsb2coTF9XQVJOSU5HLCAicmVmdXNlZCAlcyByZXF1ZXN0IGZyb20gJXMgZm9yICVzICglcyk6IHVubWF0Y2hlZCBob3N0IiwKKwkJICAgICB3aGF0LCBpbmV0X250b2EoYWRkciksIHBhdGgsIGVwYXRoKTsKKwkJYnJlYWs7CisKKwljYXNlIG5vX2VudHJ5OgorCQl4bG9nKExfV0FSTklORywgInJlZnVzZWQgJXMgcmVxdWVzdCBmcm9tICVzIGZvciAlcyAoJXMpOiBubyBleHBvcnQgZW50cnkiLAorCQkgICAgIHdoYXQsIGhwLT5oX25hbWUsIHBhdGgsIGVwYXRoKTsKKwkJYnJlYWs7CisKKwljYXNlIG5vdF9leHBvcnRlZDoKKwkJeGxvZyhMX1dBUk5JTkcsICJyZWZ1c2VkICVzIHJlcXVlc3QgZnJvbSAlcyBmb3IgJXMgKCVzKTogbm90IGV4cG9ydGVkIiwKKwkJICAgICB3aGF0LCBocC0+aF9uYW1lLCBwYXRoLCBlcGF0aCk7CisJCWJyZWFrOworCisJY2FzZSBpbGxlZ2FsX3BvcnQ6CisJCXhsb2coTF9XQVJOSU5HLCAicmVmdXNlZCAlcyByZXF1ZXN0IGZyb20gJXMgZm9yICVzICglcyk6IGlsbGVnYWwgcG9ydCAlZCIsCisJCSAgICAgd2hhdCwgaHAtPmhfbmFtZSwgcGF0aCwgZXBhdGgsIG50b2hzKGNhbGxlci0+c2luX3BvcnQpKTsKKwkJYnJlYWs7CisKKwljYXNlIHN1Y2Nlc3M6CisJCXhsb2coTF9OT1RJQ0UsICJhdXRoZW50aWNhdGVkICVzIHJlcXVlc3QgZnJvbSAlczolZCBmb3IgJXMgKCVzKSIsCisJCSAgICAgd2hhdCwgaHAtPmhfbmFtZSwgbnRvaHMoY2FsbGVyLT5zaW5fcG9ydCksIHBhdGgsIGVwYXRoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJeGxvZyhMX05PVElDRSwgIiVzIHJlcXVlc3QgZnJvbSAlczolZCBmb3IgJXMgKCVzKSBnYXZlICVkIiwKKwkJICAgICB3aGF0LCBocC0+aF9uYW1lLCBudG9ocyhjYWxsZXItPnNpbl9wb3J0KSwgcGF0aCwgZXBhdGgsIGVycm9yKTsKKwl9CisKKwlpZiAoaHApCisJCWZyZWUgKGhwKTsKKworCXJldHVybiBleHA7Cit9CisKK3N0YXRpYyB2b2lkCithdXRoX2ZpeHBhdGgoY2hhciAqcGF0aCkKK3sKKwljaGFyCSpzcCwgKmNwOworCisJZm9yIChzcCA9IGNwID0gcGF0aDsgKnNwOyBzcCsrKSB7CisJCWlmICgqc3AgIT0gJy8nIHx8IHNwWzFdICE9ICcvJykKKwkJCSpjcCsrID0gKnNwOworCX0KKwl3aGlsZSAoY3AgPiBwYXRoKzEgJiYgY3BbLTFdID09ICcvJykKKwkJY3AtLTsKKwkqY3AgPSAnXDAnOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9jYWNoZS5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2M2UxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL2NhY2hlLmMKQEAgLTAsMCArMSw5MjAgQEAKKworLyoKKyAqIEhhbmRsZSBjb21tdW5pY2F0aW9uIHdpdGgga25mc2QgaW50ZXJuYWwgY2FjaGUKKyAqCisgKiBXZSBvcGVuIC9wcm9jL25ldC9ycGMve2F1dGgudW5peC5pcCxuZnNkLmV4cG9ydCxuZnNkLmZofS9jaGFubmVsCisgKiBhbmQgbGlzdGVuIGZvciByZXF1ZXN0cyAodXNpbmcgbXlfc3ZjX3J1bikKKyAqIAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJuZnNsaWIuaCIKKyNpbmNsdWRlICJleHBvcnRmcy5oIgorI2luY2x1ZGUgIm1vdW50ZC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJmc2xvYy5oIgorI2luY2x1ZGUgInBzZXVkb2ZsYXZvcnMuaCIKKworI2lmZGVmIFVTRV9CTEtJRAorI2luY2x1ZGUgImJsa2lkL2Jsa2lkLmgiCisjZW5kaWYKKworCitlbnVtIG5mc2RfZnNpZCB7CisJRlNJRF9ERVYgPSAwLAorCUZTSURfTlVNLAorCUZTSURfTUFKT1JfTUlOT1IsCisJRlNJRF9FTkNPREVfREVWLAorCUZTSURfVVVJRDRfSU5VTSwKKwlGU0lEX1VVSUQ4LAorCUZTSURfVVVJRDE2LAorCUZTSURfVVVJRDE2X0lOVU0sCit9OworCisvKgorICogU3VwcG9ydCByb3V0aW5lcyBmb3IgdGV4dC1iYXNlZCB1cGNhbGxzLgorICogRmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2VzLgorICogRmllbGRzIGFyZSBlaXRoZXIgbWFuZ2xlZCB0byBxdW90ZSBzcGFjZSB0YWIgbmV3bGluZSBzbG9zaCB3aXRoIHNsb3NoCisgKiBvciBhIGhleGlmaWVkIHdpdGggYSBsZWFkaW5nIFx4CisgKiBSZWNvcmQgaXMgdGVybWluYXRlZCB3aXRoIG5ld2xpbmUuCisgKgorICovCitpbnQgY2FjaGVfZXhwb3J0X2VudChjaGFyICpkb21haW4sIHN0cnVjdCBleHBvcnRlbnQgKmV4cCwgY2hhciAqcCk7CisKKworY2hhciAqbGJ1ZiAgPSBOVUxMOworaW50IGxidWZsZW4gPSAwOworZXh0ZXJuIGludCB1c2VfaXBhZGRyOworCit2b2lkIGF1dGhfdW5peF9pcChGSUxFICpmKQoreworCS8qIHJlcXVlc3RzIGFyZQorCSAqICBjbGFzcyBJUC1BRERSCisJICogSWdub3JlIGlmIGNsYXNzICE9ICJuZnNkIgorCSAqIE90aGVyd2lzZSBmaW5kIGRvbWFpbm5hbWUgYW5kIHdyaXRlIGJhY2s6CisJICoKKwkgKiAgIm5mc2QiIElQLUFERFIgZXhwaXJ5IGRvbWFpbm5hbWUKKwkgKi8KKwljaGFyICpjcDsKKwljaGFyIGNsYXNzWzIwXTsKKwljaGFyIGlwYWRkclsyMF07CisJY2hhciAqY2xpZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCXN0cnVjdCBob3N0ZW50ICpoZSA9IE5VTEw7CisJaWYgKHJlYWRsaW5lKGZpbGVubyhmKSwgJmxidWYsICZsYnVmbGVuKSAhPSAxKQorCQlyZXR1cm47CisKKwl4bG9nKERfQ0FMTCwgImF1dGhfdW5peF9pcDogaW5idWYgJyVzJyIsIGxidWYpOworCisJY3AgPSBsYnVmOworCisJaWYgKHF3b3JkX2dldCgmY3AsIGNsYXNzLCAyMCkgPD0gMCB8fAorCSAgICBzdHJjbXAoY2xhc3MsICJuZnNkIikgIT0gMCkKKwkJcmV0dXJuOworCisJaWYgKHF3b3JkX2dldCgmY3AsIGlwYWRkciwgMjApIDw9IDApCisJCXJldHVybjsKKworCWlmIChpbmV0X2F0b24oaXBhZGRyLCAmYWRkcik9PTApCisJCXJldHVybjsKKworCWF1dGhfcmVsb2FkKCk7CisKKwkvKiBhZGRyIGlzIGEgdmFsaWQsIGludGVyZXN0aW5nIGFkZHJlc3MsIGZpbmQgdGhlIGRvbWFpbiBuYW1lLi4uICovCisJaWYgKCF1c2VfaXBhZGRyKSB7CisJCWhlID0gY2xpZW50X3Jlc29sdmUoYWRkcik7CisJCWNsaWVudCA9IGNsaWVudF9jb21wb3NlKGhlKTsKKwl9CisJCisJcXdvcmRfcHJpbnQoZiwgIm5mc2QiKTsKKwlxd29yZF9wcmludChmLCBpcGFkZHIpOworCXF3b3JkX3ByaW50aW50KGYsIHRpbWUoMCkrMzAqNjApOworCWlmICh1c2VfaXBhZGRyKQorCQlxd29yZF9wcmludChmLCBpcGFkZHIpOworCWVsc2UgaWYgKGNsaWVudCkKKwkJcXdvcmRfcHJpbnQoZiwgKmNsaWVudD9jbGllbnQ6IkRFRkFVTFQiKTsKKwlxd29yZF9lb2woZik7CisJeGxvZyhEX0NBTEwsICJhdXRoX3VuaXhfaXA6IGNsaWVudCAlcCAnJXMnIiwgY2xpZW50LCBjbGllbnQ/Y2xpZW50OiAiREVGQVVMVCIpOworCisJaWYgKGNsaWVudCkgZnJlZShjbGllbnQpOworCWZyZWUoaGUpOworfQorCit2b2lkIGF1dGhfdW5peF9naWQoRklMRSAqZikKK3sKKwkvKiBSZXF1ZXN0IGFyZQorCSAqICB1aWQKKwkgKiByZXBseSBpcworCSAqICB1aWQgZXhwaXJ5IGNvdW50IGxpc3Qgb2YgZ3JvdXAgaWRzCisJICovCisJaW50IHVpZDsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwlnaWRfdCBnbGlzdFsxMDBdLCAqZ3JvdXBzID0gZ2xpc3Q7CisJaW50IG5ncm91cHMgPSAxMDA7CisJaW50IHJ2LCBpOworCWNoYXIgKmNwOworCisJaWYgKHJlYWRsaW5lKGZpbGVubyhmKSwgJmxidWYsICZsYnVmbGVuKSAhPSAxKQorCQlyZXR1cm47CisKKwljcCA9IGxidWY7CisJaWYgKHF3b3JkX2dldF9pbnQoJmNwLCAmdWlkKSAhPSAwKQorCQlyZXR1cm47CisKKwlwdyA9IGdldHB3dWlkKHVpZCk7CisJaWYgKCFwdykKKwkJcnYgPSAtMTsKKwllbHNlIHsKKwkJcnYgPSBnZXRncm91cGxpc3QocHctPnB3X25hbWUsIHB3LT5wd19naWQsIGdyb3VwcywgJm5ncm91cHMpOworCQlpZiAocnYgPT0gLTEgJiYgbmdyb3VwcyA+PSAxMDApIHsKKwkJCWdyb3VwcyA9IG1hbGxvYyhzaXplb2YoZ2lkX3QpKm5ncm91cHMpOworCQkJaWYgKCFncm91cHMpCisJCQkJcnYgPSAtMTsKKwkJCWVsc2UKKwkJCQlydiA9IGdldGdyb3VwbGlzdChwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCwKKwkJCQkJCSAgZ3JvdXBzLCAmbmdyb3Vwcyk7CisJCX0KKwl9CisJcXdvcmRfcHJpbnRpbnQoZiwgdWlkKTsKKwlxd29yZF9wcmludGludChmLCB0aW1lKDApKzMwKjYwKTsKKwlpZiAocnYgPj0gMCkgeworCQlxd29yZF9wcmludGludChmLCBuZ3JvdXBzKTsKKwkJZm9yIChpPTA7IGk8bmdyb3VwczsgaSsrKQorCQkJcXdvcmRfcHJpbnRpbnQoZiwgZ3JvdXBzW2ldKTsKKwl9IGVsc2UKKwkJcXdvcmRfcHJpbnRpbnQoZiwgMCk7CisJcXdvcmRfZW9sKGYpOworCisJaWYgKGdyb3VwcyAhPSBnbGlzdCkKKwkJZnJlZShncm91cHMpOworfQorCisjaWYgVVNFX0JMS0lECitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3V1aWRfYmxrZGV2KGNoYXIgKnBhdGgpCit7CisJc3RhdGljIGJsa2lkX2NhY2hlIGNhY2hlID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBzdGI7CisJY2hhciAqZGV2bmFtZTsKKwlibGtpZF90YWdfaXRlcmF0ZSBpdGVyOworCWJsa2lkX2RldiBkZXY7CisJY29uc3QgY2hhciAqdHlwZTsKKwljb25zdCBjaGFyICp2YWwgPSBOVUxMOworCisJaWYgKGNhY2hlID09IE5VTEwpCisJCWJsa2lkX2dldF9jYWNoZSgmY2FjaGUsIE5VTEwpOworCisJaWYgKHN0YXQocGF0aCwgJnN0YikgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2bmFtZSA9IGJsa2lkX2Rldm5vX3RvX2Rldm5hbWUoc3RiLnN0X2Rldik7CisJaWYgKCFkZXZuYW1lKQorCQlyZXR1cm4gTlVMTDsKKwlkZXYgPSBibGtpZF9nZXRfZGV2KGNhY2hlLCBkZXZuYW1lLCBCTEtJRF9ERVZfTk9STUFMKTsKKwlmcmVlKGRldm5hbWUpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKwlpdGVyID0gYmxraWRfdGFnX2l0ZXJhdGVfYmVnaW4oZGV2KTsKKwlpZiAoIWl0ZXIpCisJCXJldHVybiBOVUxMOworCXdoaWxlIChibGtpZF90YWdfbmV4dChpdGVyLCAmdHlwZSwgJnZhbCkgPT0gMCkKKwkJaWYgKHN0cmNtcCh0eXBlLCAiVVVJRCIpID09IDApCisJCQlicmVhazsKKwlibGtpZF90YWdfaXRlcmF0ZV9lbmQoaXRlcik7CisJcmV0dXJuIHZhbDsKK30KKyNlbHNlCisjZGVmaW5lIGdldF91dWlkX2Jsa2RldihwYXRoKSAoTlVMTCkKKyNlbmRpZgorCitpbnQgZ2V0X3V1aWQoY2hhciAqcGF0aCwgY2hhciAqdXVpZCwgaW50IHV1aWRsZW4sIGNoYXIgKnUpCit7CisJLyogZXh0cmFjdCBoZXggZGlnaXRzIGZyb20gdXVpZHN0ciBhbmQgY29tcG9zZSBhIHV1aWQKKwkgKiBvZiB0aGUgZ2l2ZW4gbGVuZ3RoIChtYXggMTYpLCB4b3JpbmcgYnl0ZXMgdG8gbWFrZQorCSAqIGEgc21hbGxlciB1dWlkLiAgVGhlbiBjb21wYXJlIHdpdGggdXVpZAorCSAqLworCWludCBpID0gMDsKKwljb25zdCBjaGFyICp2YWwgPSBOVUxMOworCWNoYXIgZnNpZF92YWxbMTddOworCisJaWYgKHBhdGgpIHsKKwkJdmFsID0gZ2V0X3V1aWRfYmxrZGV2KHBhdGgpOworCQlpZiAoIXZhbCkgeworCQkJc3RydWN0IHN0YXRmczY0IHN0OworCisJCQlpZiAoc3RhdGZzNjQocGF0aCwgJnN0KSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICghc3QuZl9mc2lkLl9fdmFsWzBdICYmICFzdC5mX2ZzaWQuX192YWxbMV0pCisJCQkJcmV0dXJuIDA7CisJCQlzbnByaW50Zihmc2lkX3ZhbCwgMTcsICIlMDh4JTA4eCIsCisJCQkJIHN0LmZfZnNpZC5fX3ZhbFswXSwgc3QuZl9mc2lkLl9fdmFsWzFdKTsKKwkJCXZhbCA9IGZzaWRfdmFsOworCQl9CisJfSBlbHNlIHsKKwkJdmFsID0gdXVpZDsKKwl9CisJCisJbWVtc2V0KHUsIDAsIHV1aWRsZW4pOworCWZvciAoIDsgKnZhbCA7IHZhbCsrKSB7CisJCWNoYXIgYyA9ICp2YWw7CisJCWlmICghaXN4ZGlnaXQoYykpCisJCQljb250aW51ZTsKKwkJaWYgKGlzYWxwaGEoYykpIHsKKwkJCWlmIChpc3VwcGVyKGMpKQorCQkJCWMgPSBjIC0gJ0EnICsgMTA7CisJCQllbHNlCisJCQkJYyA9IGMgLSAnYScgKyAxMDsKKwkJfSBlbHNlCisJCQljID0gYyAtICcwJyArIDA7CisJCWlmICgoaSYxKSA9PSAwKQorCQkJYyA8PD0gNDsKKwkJdVtpLzJdIF49IGM7CisJCWkrKzsKKwkJaWYgKGkgPT0gdXVpZGxlbioyKQorCQkJaSA9IDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBJdGVyYXRlIHRocm91Z2ggL2V0Yy9tdGFiLCBmaW5kaW5nIG1vdW50cG9pbnRzCisgKiBhdCBvciBiZWxvdyBhIGdpdmVuIHBhdGgKKyAqLworc3RhdGljIGNoYXIgKm5leHRfbW50KHZvaWQgKip2LCBjaGFyICpwKQoreworCUZJTEUgKmY7CisJc3RydWN0IG1udGVudCAqbWU7CisJaW50IGwgPSBzdHJsZW4ocCk7CisJaWYgKCp2ID09IE5VTEwpIHsKKwkJZiA9IHNldG1udGVudCgiL2V0Yy9tdGFiIiwgInIiKTsKKwkJKnYgPSBmOworCX0gZWxzZQorCQlmID0gKnY7CisJd2hpbGUgKChtZSA9IGdldG1udGVudChmKSkgIT0gTlVMTCAmJgorCSAgICAgICAoc3RybmNtcChtZS0+bW50X2RpciwgcCwgbCkgIT0gMCB8fAorCQltZS0+bW50X2RpcltsXSAhPSAnLycpKQorCQk7CisJaWYgKG1lID09IE5VTEwpIHsKKwkJZW5kbW50ZW50KGYpOworCQkqdiA9IE5VTEw7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbWUtPm1udF9kaXI7Cit9CisKK3ZvaWQgbmZzZF9maChGSUxFICpmKQoreworCS8qIHJlcXVlc3QgYXJlOgorCSAqICBkb21haW4gZnNpZHR5cGUgZnNpZAorCSAqIGludGVycHJldCBmc2lkLCBmaW5kIGV4cG9ydCBwb2ludCBhbmQgb3B0aW9ucywgYW5kIHdyaXRlOgorCSAqICBkb21haW4gZnNpZHR5cGUgZnNpZCBleHBpcnkgcGF0aAorCSAqLworCWNoYXIgKmNwOworCWNoYXIgKmRvbTsKKwlpbnQgZnNpZHR5cGU7CisJaW50IGZzaWRsZW47CisJdW5zaWduZWQgaW50IGRldiwgbWFqb3I9MCwgbWlub3I9MDsKKwl1bnNpZ25lZCBpbnQgaW5vZGU9MDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW5vZGU2NDsKKwl1bnNpZ25lZCBpbnQgZnNpZG51bT0wOworCWNoYXIgZnNpZFszMl07CisJc3RydWN0IGV4cG9ydGVudCAqZm91bmQgPSBOVUxMOworCXN0cnVjdCBob3N0ZW50ICpoZSA9IE5VTEw7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKwljaGFyICpmb3VuZF9wYXRoID0gTlVMTDsKKwluZnNfZXhwb3J0ICpleHA7CisJaW50IGk7CisJaW50IGRldl9taXNzaW5nID0gMDsKKwlpbnQgdXVpZGxlbiA9IDA7CisJY2hhciAqZmh1dWlkID0gTlVMTDsKKworCWlmIChyZWFkbGluZShmaWxlbm8oZiksICZsYnVmLCAmbGJ1ZmxlbikgIT0gMSkKKwkJcmV0dXJuOworCisJeGxvZyhEX0NBTEwsICJuZnNkX2ZoOiBpbmJ1ZiAnJXMnIiwgbGJ1Zik7CisKKwljcCA9IGxidWY7CisJCisJZG9tID0gbWFsbG9jKHN0cmxlbihjcCkpOworCWlmIChkb20gPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChxd29yZF9nZXQoJmNwLCBkb20sIHN0cmxlbihjcCkpIDw9IDApCisJCWdvdG8gb3V0OworCWlmIChxd29yZF9nZXRfaW50KCZjcCwgJmZzaWR0eXBlKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoZnNpZHR5cGUgPCAwIHx8IGZzaWR0eXBlID4gNykKKwkJZ290byBvdXQ7IC8qIHVua25vd24gdHlwZSAqLworCWlmICgoZnNpZGxlbiA9IHF3b3JkX2dldCgmY3AsIGZzaWQsIDMyKSkgPD0gMCkKKwkJZ290byBvdXQ7CisJc3dpdGNoKGZzaWR0eXBlKSB7CisJY2FzZSBGU0lEX0RFVjogLyogNCBieXRlczogMiBtYWpvciwgMiBtaW5vciwgNCBpbm9kZSAqLworCQlpZiAoZnNpZGxlbiAhPSA4KQorCQkJZ290byBvdXQ7CisJCW1lbWNweSgmZGV2LCBmc2lkLCA0KTsKKwkJbWVtY3B5KCZpbm9kZSwgZnNpZCs0LCA0KTsKKwkJbWFqb3IgPSBudG9obChkZXYpPj4xNjsKKwkJbWlub3IgPSBudG9obChkZXYpICYgMHhGRkZGOworCQlicmVhazsKKworCWNhc2UgRlNJRF9OVU06IC8qIDQgYnl0ZXMgLSBmc2lkICovCisJCWlmIChmc2lkbGVuICE9IDQpCisJCQlnb3RvIG91dDsKKwkJbWVtY3B5KCZmc2lkbnVtLCBmc2lkLCA0KTsKKwkJYnJlYWs7CisKKwljYXNlIEZTSURfTUFKT1JfTUlOT1I6IC8qIDEyIGJ5dGVzOiA0IG1ham9yLCA0IG1pbm9yLCA0IGlub2RlIAorCQkgKiBUaGlzIGZvcm1hdCBpcyBuZXZlciBhY3R1YWxseSB1c2VkIGJ1dCB3YXMKKwkJICogYW4gaGlzdG9yaWNhbCBhY2NpZGVudAorCQkgKi8KKwkJaWYgKGZzaWRsZW4gIT0gMTIpCisJCQlnb3RvIG91dDsKKwkJbWVtY3B5KCZkZXYsIGZzaWQsIDQpOyBtYWpvciA9IG50b2hsKGRldik7CisJCW1lbWNweSgmZGV2LCBmc2lkKzQsIDQpOyBtaW5vciA9IG50b2hsKGRldik7CisJCW1lbWNweSgmaW5vZGUsIGZzaWQrOCwgNCk7CisJCWJyZWFrOworCisJY2FzZSBGU0lEX0VOQ09ERV9ERVY6IC8qIDggYnl0ZXM6IDQgYnl0ZSBwYWNrZWQgZGV2aWNlIG51bWJlciwgNCBpbm9kZSAqLworCQkvKiBUaGlzIGlzICpob3N0KiBlbmRpYW4sIG5vdCBuZXQtYnl0ZS1vcmRlciwgYmVjYXVzZQorCQkgKiBuby1vbmUgb3V0c2lkZSB0aGlzIGhvc3QgaGFzIGFueSBidXNpbmVzcyBpbnRlcnByZXRpbmcgaXQKKwkJICovCisJCWlmIChmc2lkbGVuICE9IDgpCisJCQlnb3RvIG91dDsKKwkJbWVtY3B5KCZkZXYsIGZzaWQsIDQpOworCQltZW1jcHkoJmlub2RlLCBmc2lkKzQsIDQpOworCQltYWpvciA9IChkZXYgJiAweGZmZjAwKSA+PiA4OworCQltaW5vciA9IChkZXYgJiAweGZmKSB8ICgoZGV2ID4+IDEyKSAmIDB4ZmZmMDApOworCQlicmVhazsKKworCWNhc2UgRlNJRF9VVUlENF9JTlVNOiAvKiA0IGJ5dGUgaW5vZGUgbnVtYmVyIGFuZCA0IGJ5dGUgdXVpZCAqLworCQlpZiAoZnNpZGxlbiAhPSA4KQorCQkJZ290byBvdXQ7CisJCW1lbWNweSgmaW5vZGUsIGZzaWQsIDQpOworCQl1dWlkbGVuID0gNDsKKwkJZmh1dWlkID0gZnNpZCs0OworCQlicmVhazsKKwljYXNlIEZTSURfVVVJRDg6IC8qIDggYnl0ZSB1dWlkICovCisJCWlmIChmc2lkbGVuICE9IDgpCisJCQlnb3RvIG91dDsKKwkJdXVpZGxlbiA9IDg7CisJCWZodXVpZCA9IGZzaWQ7CisJCWJyZWFrOworCWNhc2UgRlNJRF9VVUlEMTY6IC8qIDE2IGJ5dGUgdXVpZCAqLworCQlpZiAoZnNpZGxlbiAhPSAxNikKKwkJCWdvdG8gb3V0OworCQl1dWlkbGVuID0gMTY7CisJCWZodXVpZCA9IGZzaWQ7CisJCWJyZWFrOworCWNhc2UgRlNJRF9VVUlEMTZfSU5VTTogLyogOCBieXRlIGlub2RlIG51bWJlciBhbmQgMTYgYnl0ZSB1dWlkICovCisJCWlmIChmc2lkbGVuICE9IDI0KQorCQkJZ290byBvdXQ7CisJCW1lbWNweSgmaW5vZGU2NCwgZnNpZCwgOCk7CisJCWlub2RlID0gaW5vZGU2NDsKKwkJdXVpZGxlbiA9IDE2OworCQlmaHV1aWQgPSBmc2lkKzg7CisJCWJyZWFrOworCX0KKworCWF1dGhfcmVsb2FkKCk7CisKKwkvKiBOb3cgZGV0ZXJtaW5lIGV4cG9ydCBwb2ludCBmb3IgdGhpcyBmc2lkL2RvbWFpbiAqLworCWZvciAoaT0wIDsgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKSB7CisJCW5mc19leHBvcnQgKm5leHRfZXhwOworCQlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaV0ucF9oZWFkOyBleHA7IGV4cCA9IG5leHRfZXhwKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdGI7CisJCQljaGFyIHVbMTZdOworCQkJY2hhciAqcGF0aDsKKworCQkJaWYgKGV4cC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9DUk9TU01PVU5UKSB7CisJCQkJc3RhdGljIG5mc19leHBvcnQgKnByZXYgPSBOVUxMOworCQkJCXN0YXRpYyB2b2lkICptbnQgPSBOVUxMOworCQkJCQorCQkJCWlmIChwcmV2ID09IGV4cCkgeworCQkJCQkvKiB0cnkgYSBzdWJtb3VudCAqLworCQkJCQlwYXRoID0gbmV4dF9tbnQoJm1udCwgZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCQkJCQlpZiAoIXBhdGgpIHsKKwkJCQkJCW5leHRfZXhwID0gZXhwLT5tX25leHQ7CisJCQkJCQlwcmV2ID0gTlVMTDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCW5leHRfZXhwID0gZXhwOworCQkJCX0gZWxzZSB7CisJCQkJCXByZXYgPSBleHA7CisJCQkJCW1udCA9IE5VTEw7CisJCQkJCXBhdGggPSBleHAtPm1fZXhwb3J0LmVfcGF0aDsKKwkJCQkJbmV4dF9leHAgPSBleHA7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwYXRoID0gZXhwLT5tX2V4cG9ydC5lX3BhdGg7CisJCQkJbmV4dF9leHAgPSBleHAtPm1fbmV4dDsKKwkJCX0KKworCQkJaWYgKCF1c2VfaXBhZGRyICYmICFjbGllbnRfbWVtYmVyKGRvbSwgZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZSkpCisJCQkJY29udGludWU7CisJCQlpZiAoZXhwLT5tX2V4cG9ydC5lX21vdW50cG9pbnQgJiYKKwkJCSAgICAhaXNfbW91bnRwb2ludChleHAtPm1fZXhwb3J0LmVfbW91bnRwb2ludFswXT8KKwkJCQkJICAgZXhwLT5tX2V4cG9ydC5lX21vdW50cG9pbnQ6CisJCQkJCSAgIGV4cC0+bV9leHBvcnQuZV9wYXRoKSkKKwkJCQlkZXZfbWlzc2luZyArKzsKKwkJCWlmIChzdGF0KHBhdGgsICZzdGIpICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoIVNfSVNESVIoc3RiLnN0X21vZGUpICYmICFTX0lTUkVHKHN0Yi5zdF9tb2RlKSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3dpdGNoKGZzaWR0eXBlKXsKKwkJCWNhc2UgRlNJRF9ERVY6CisJCQljYXNlIEZTSURfTUFKT1JfTUlOT1I6CisJCQljYXNlIEZTSURfRU5DT0RFX0RFVjoKKwkJCQlpZiAoc3RiLnN0X2lubyAhPSBpbm9kZSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKG1ham9yICE9IG1ham9yKHN0Yi5zdF9kZXYpIHx8CisJCQkJICAgIG1pbm9yICE9IG1pbm9yKHN0Yi5zdF9kZXYpKQorCQkJCQljb250aW51ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRlNJRF9OVU06CisJCQkJaWYgKCgoZXhwLT5tX2V4cG9ydC5lX2ZsYWdzICYgTkZTRVhQX0ZTSUQpID09IDAgfHwKKwkJCQkgICAgIGV4cC0+bV9leHBvcnQuZV9mc2lkICE9IGZzaWRudW0pKQorCQkJCQljb250aW51ZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRlNJRF9VVUlENF9JTlVNOgorCQkJY2FzZSBGU0lEX1VVSUQxNl9JTlVNOgorCQkJCWlmIChzdGIuc3RfaW5vICE9IGlub2RlKQorCQkJCQljb250aW51ZTsKKwkJCQlnb3RvIGNoZWNrX3V1aWQ7CisJCQljYXNlIEZTSURfVVVJRDg6CisJCQljYXNlIEZTSURfVVVJRDE2OgorCQkJCWlmICghaXNfbW91bnRwb2ludChwYXRoKSkKKwkJCQkJY29udGludWU7CisJCQljaGVja191dWlkOgorCQkJCWlmIChleHAtPm1fZXhwb3J0LmVfdXVpZCkKKwkJCQkJZ2V0X3V1aWQoTlVMTCwgZXhwLT5tX2V4cG9ydC5lX3V1aWQsCisJCQkJCQkgdXVpZGxlbiwgdSk7CisJCQkJZWxzZSBpZiAoZ2V0X3V1aWQocGF0aCwgTlVMTCwgdXVpZGxlbiwgdSkgPT0gMCkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAobWVtY21wKHUsIGZodXVpZCwgdXVpZGxlbikgIT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAodXNlX2lwYWRkcikgeworCQkJCWlmIChoZSA9PSBOVUxMKSB7CisJCQkJCWlmICghaW5ldF9hdG9uKGRvbSwgJmFkZHIpKQorCQkJCQkJZ290byBvdXQ7CisJCQkJCWhlID0gY2xpZW50X3Jlc29sdmUoYWRkcik7CisJCQkJfQorCQkJCWlmICghY2xpZW50X2NoZWNrKGV4cC0+bV9jbGllbnQsIGhlKSkKKwkJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBJdCdzIGEgbWF0Y2ggISEgKi8KKwkJCWlmICghZm91bmQpIHsKKwkJCQlmb3VuZCA9ICZleHAtPm1fZXhwb3J0OworCQkJCWZvdW5kX3BhdGggPSBzdHJkdXAocGF0aCk7CisJCQkJaWYgKGZvdW5kX3BhdGggPT0gTlVMTCkKKwkJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKHN0cmNtcChmb3VuZC0+ZV9wYXRoLCBleHAtPm1fZXhwb3J0LmVfcGF0aCkhPSAwKQorCQkJeworCQkJCXhsb2coTF9XQVJOSU5HLCAiJXMgYW5kICVzIGhhdmUgc2FtZSBmaWxlaGFuZGxlIGZvciAlcywgdXNpbmcgZmlyc3QiLAorCQkJCSAgICAgZm91bmRfcGF0aCwgcGF0aCwgZG9tKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoZm91bmQgJiYgCisJICAgIGZvdW5kLT5lX21vdW50cG9pbnQgJiYKKwkgICAgIWlzX21vdW50cG9pbnQoZm91bmQtPmVfbW91bnRwb2ludFswXT8KKwkJCSAgIGZvdW5kLT5lX21vdW50cG9pbnQ6CisJCQkgICBmb3VuZC0+ZV9wYXRoKSkgeworCQkvKiBDYW5ub3QgZXhwb3J0IHRoaXMgeWV0IAorCQkgKiBzaG91bGQgbG9nIGEgd2FybmluZywgYnV0IG5lZWQgdG8gcmF0ZSBsaW1pdAorCQkgICB4bG9nKExfV0FSTklORywgIiVzIG5vdCBleHBvcnRlZCBhcyAlZCBub3QgYSBtb3VudHBvaW50IiwKKwkJICAgZm91bmQtPmVfcGF0aCwgZm91bmQtPmVfbW91bnRwb2ludCk7CisJCSAqLworCQkvKiBGSVhNRSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSByZS12aXNpdCB0aGlzIGxhdGVyICovCisJCWdvdG8gb3V0OworCX0KKwlpZiAoIWZvdW5kICYmIGRldl9taXNzaW5nKSB7CisJCS8qIFRoZSBtaXNzaW5nIGRldiBjb3VsZCBiZSB3aGF0IHdlIHdhbnQsIHNvIGp1c3QgYmUKKwkJICogcXVpdGUgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHN0YWxlIHlldAorCQkgKi8KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGZvdW5kKQorCQlpZiAoY2FjaGVfZXhwb3J0X2VudChkb20sIGZvdW5kLCBmb3VuZF9wYXRoKSA8IDApCisJCQlmb3VuZCA9IDA7CisKKwlxd29yZF9wcmludChmLCBkb20pOworCXF3b3JkX3ByaW50aW50KGYsIGZzaWR0eXBlKTsKKwlxd29yZF9wcmludGhleChmLCBmc2lkLCBmc2lkbGVuKTsKKwkvKiBUaGUgZnNpZCAtPiBwYXRoIGxvb2t1cCBjYW4gYmUgcXVpdGUgZXhwZW5zaXZlIGFzIGl0CisJICogcG90ZW50aWFsbHkgc3RhdHMgYW5kIHJlYWRzIGxvdHMgb2YgZGV2aWNlcywgYW5kIHNvbWUgb2YgdGhvc2UKKwkgKiBtaWdodCBoYXZlIHNwdW4tZG93bi4gIFRoZSBBbnN3ZXIgaXMgbm90IGxpa2VseSB0bworCSAqIGNoYW5nZSB1bmRlcm5lYXRoIHVzLCBhbmQgYW4gJ2V4cG9ydGZzIC1mJyBjYW4gYWx3YXlzCisJICogcmVtb3ZlIHRoaXMgZnJvbSB0aGUga2VybmVsLCBzbyB1c2UgYSByZWFsbHkgbG9nCisJICogdGltZW91dC4gIE1heWJlIHRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSBvbiB0aGUgY29tbWFuZAorCSAqIGxpbmUuCisJICovCisJcXdvcmRfcHJpbnRpbnQoZiwgMHg3ZmZmZmZmZik7CisJaWYgKGZvdW5kKQorCQlxd29yZF9wcmludChmLCBmb3VuZF9wYXRoKTsKKwlxd29yZF9lb2woZik7Cisgb3V0OgorCWlmIChmb3VuZF9wYXRoKQorCQlmcmVlKGZvdW5kX3BhdGgpOworCWlmIChoZSkKKwkJZnJlZShoZSk7CisJZnJlZShkb20pOworCXhsb2coRF9DQUxMLCAibmZzZF9maDogZm91bmQgJXAgcGF0aCAlcyIsIGZvdW5kLCBmb3VuZCA/IGZvdW5kLT5lX3BhdGggOiBOVUxMKTsKKwlyZXR1cm47CQkKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZnNsb2MoRklMRSAqZiwgc3RydWN0IGV4cG9ydGVudCAqZXAsIGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHNlcnZlcnMgKnNlcnZlcnM7CisKKwlpZiAoZXAtPmVfZnNsb2NtZXRob2QgPT0gRlNMT0NfTk9ORSkKKwkJcmV0dXJuOworCisJc2VydmVycyA9IHJlcGxpY2FzX2xvb2t1cChlcC0+ZV9mc2xvY21ldGhvZCwgZXAtPmVfZnNsb2NkYXRhLCBwYXRoKTsKKwlpZiAoIXNlcnZlcnMpCisJCXJldHVybjsKKwlxd29yZF9wcmludChmLCAiZnNsb2MiKTsKKwlxd29yZF9wcmludGludChmLCBzZXJ2ZXJzLT5oX251bSk7CisJaWYgKHNlcnZlcnMtPmhfbnVtID49IDApIHsKKwkJaW50IGk7CisJCWZvciAoaT0wOyBpPHNlcnZlcnMtPmhfbnVtOyBpKyspIHsKKwkJCXF3b3JkX3ByaW50KGYsIHNlcnZlcnMtPmhfbXBbaV0tPmhfaG9zdCk7CisJCQlxd29yZF9wcmludChmLCBzZXJ2ZXJzLT5oX21wW2ldLT5oX3BhdGgpOworCQl9CisJfQorCXF3b3JkX3ByaW50aW50KGYsIHNlcnZlcnMtPmhfcmVmZXJyYWwpOworCXJlbGVhc2VfcmVwbGljYXMoc2VydmVycyk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3NlY2luZm8oRklMRSAqZiwgc3RydWN0IGV4cG9ydGVudCAqZXAsIGludCBmbGFnX21hc2spCit7CisJc3RydWN0IHNlY19lbnRyeSAqcDsKKworCWZvciAocCA9IGVwLT5lX3NlY2luZm87IHAtPmZsYXY7IHArKykKKwkJOyAvKiBEbyBub3RoaW5nICovCisJaWYgKHAgPT0gZXAtPmVfc2VjaW5mbykgeworCQkvKiBUaGVyZSB3YXMgbm8gc2VjPSBvcHRpb24gKi8KKwkJcmV0dXJuOworCX0KKwlxd29yZF9wcmludChmLCAic2VjaW5mbyIpOworCXF3b3JkX3ByaW50aW50KGYsIHAgLSBlcC0+ZV9zZWNpbmZvKTsKKwlmb3IgKHAgPSBlcC0+ZV9zZWNpbmZvOyBwLT5mbGF2OyBwKyspIHsKKwkJcXdvcmRfcHJpbnRpbnQoZiwgcC0+Zmxhdi0+Zm51bSk7CisJCXF3b3JkX3ByaW50aW50KGYsIHAtPmZsYWdzICYgZmxhZ19tYXNrKTsKKwl9CisKK30KKworc3RhdGljIGludCBkdW1wX3RvX2NhY2hlKEZJTEUgKmYsIGNoYXIgKmRvbWFpbiwgY2hhciAqcGF0aCwgc3RydWN0IGV4cG9ydGVudCAqZXhwKQoreworCXF3b3JkX3ByaW50KGYsIGRvbWFpbik7CisJcXdvcmRfcHJpbnQoZiwgcGF0aCk7CisJcXdvcmRfcHJpbnRpbnQoZiwgdGltZSgwKSszMCo2MCk7CisJaWYgKGV4cCkgeworCQlpbnQgZGlmZmVyZW50X2ZzID0gc3RyY21wKHBhdGgsIGV4cC0+ZV9wYXRoKSAhPSAwOworCQlpbnQgZmxhZ19tYXNrID0gZGlmZmVyZW50X2ZzID8gfk5GU0VYUF9GU0lEIDogfjA7CisKKwkJcXdvcmRfcHJpbnRpbnQoZiwgZXhwLT5lX2ZsYWdzICYgZmxhZ19tYXNrKTsKKwkJcXdvcmRfcHJpbnRpbnQoZiwgZXhwLT5lX2Fub251aWQpOworCQlxd29yZF9wcmludGludChmLCBleHAtPmVfYW5vbmdpZCk7CisJCXF3b3JkX3ByaW50aW50KGYsIGV4cC0+ZV9mc2lkKTsKKwkJd3JpdGVfZnNsb2MoZiwgZXhwLCBwYXRoKTsKKwkJd3JpdGVfc2VjaW5mbyhmLCBleHAsIGZsYWdfbWFzayk7CisgCQlpZiAoZXhwLT5lX3V1aWQgPT0gTlVMTCB8fCBkaWZmZXJlbnRfZnMpIHsKKyAJCQljaGFyIHVbMTZdOworIAkJCWlmIChnZXRfdXVpZChwYXRoLCBOVUxMLCAxNiwgdSkpIHsKKyAJCQkJcXdvcmRfcHJpbnQoZiwgInV1aWQiKTsKKyAJCQkJcXdvcmRfcHJpbnRoZXgoZiwgdSwgMTYpOworIAkJCX0KKyAJCX0gZWxzZSB7CisgCQkJY2hhciB1WzE2XTsKKyAJCQlnZXRfdXVpZChOVUxMLCBleHAtPmVfdXVpZCwgMTYsIHUpOworIAkJCXF3b3JkX3ByaW50KGYsICJ1dWlkIik7CisgCQkJcXdvcmRfcHJpbnRoZXgoZiwgdSwgMTYpOworIAkJfQorCX0KKwlyZXR1cm4gcXdvcmRfZW9sKGYpOworfQorCitzdGF0aWMgaW50IGlzX3N1YmRpcmVjdG9yeShjaGFyICpzdWJwYXRoLCBjaGFyICpwYXRoKQoreworCWludCBsID0gc3RybGVuKHBhdGgpOworCisJcmV0dXJuIHN0cmNtcChzdWJwYXRoLCBwYXRoKSA9PSAwCisJCXx8IChzdHJuY21wKHN1YnBhdGgsIHBhdGgsIGwpID09IDAgJiYgcGF0aFtsXSA9PSAnLycpOworfQorCitzdGF0aWMgaW50IHBhdGhfbWF0Y2hlcyhuZnNfZXhwb3J0ICpleHAsIGNoYXIgKnBhdGgpCit7CisJaWYgKGV4cC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9DUk9TU01PVU5UKQorCQlyZXR1cm4gaXNfc3ViZGlyZWN0b3J5KHBhdGgsIGV4cC0+bV9leHBvcnQuZV9wYXRoKTsKKwlyZXR1cm4gc3RyY21wKHBhdGgsIGV4cC0+bV9leHBvcnQuZV9wYXRoKSA9PSAwOworfQorCitzdGF0aWMgaW50IGNsaWVudF9tYXRjaGVzKG5mc19leHBvcnQgKmV4cCwgY2hhciAqZG9tLCBzdHJ1Y3QgaG9zdGVudCAqaGUpCit7CisJaWYgKHVzZV9pcGFkZHIpCisJCXJldHVybiBjbGllbnRfY2hlY2soZXhwLT5tX2NsaWVudCwgaGUpOworCXJldHVybiBjbGllbnRfbWVtYmVyKGRvbSwgZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgZXhwb3J0X21hdGNoZXMobmZzX2V4cG9ydCAqZXhwLCBjaGFyICpkb20sIGNoYXIgKnBhdGgsIHN0cnVjdCBob3N0ZW50ICpoZSkKK3sKKwlyZXR1cm4gcGF0aF9tYXRjaGVzKGV4cCwgcGF0aCkgJiYgY2xpZW50X21hdGNoZXMoZXhwLCBkb20sIGhlKTsKK30KKworc3RhdGljIG5mc19leHBvcnQgKmxvb2t1cF9leHBvcnQoY2hhciAqZG9tLCBjaGFyICpwYXRoLCBzdHJ1Y3QgaG9zdGVudCAqaGUpCit7CisJbmZzX2V4cG9ydCAqZXhwOworCW5mc19leHBvcnQgKmZvdW5kID0gTlVMTDsKKwlpbnQgZm91bmRfdHlwZSA9IDA7CisJaW50IGk7CisKKwlmb3IgKGk9MCA7IGkgPCBNQ0xfTUFYVFlQRVM7IGkrKykgeworCQlmb3IgKGV4cCA9IGV4cG9ydGxpc3RbaV0ucF9oZWFkOyBleHA7IGV4cCA9IGV4cC0+bV9uZXh0KSB7CisJCQlpZiAoIWV4cG9ydF9tYXRjaGVzKGV4cCwgZG9tLCBwYXRoLCBoZSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWZvdW5kKSB7CisJCQkJZm91bmQgPSBleHA7CisJCQkJZm91bmRfdHlwZSA9IGk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEFsd2F5cyBwcmVmZXIgbm9uLVY0Uk9PVCBtb3VudHMgKi8KKwkJCWlmIChmb3VuZC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9WNFJPT1QpCisJCQkJY29udGludWU7CisKKwkJCS8qIElmIG9uZSBpcyBhIENST1NTTU9VTlQsIHRoZW4gcHJlZmVyIHRoZSBsb25nZXN0IHBhdGggKi8KKwkJCWlmICgoKGZvdW5kLT5tX2V4cG9ydC5lX2ZsYWdzICYgTkZTRVhQX0NST1NTTU9VTlQpIHx8CisJCQkgICAgIChleHAtPm1fZXhwb3J0LmVfZmxhZ3MgJiBORlNFWFBfQ1JPU1NNT1VOVCkpICYmCisJCQkgICAgc3RybGVuKGZvdW5kLT5tX2V4cG9ydC5lX3BhdGgpICE9CisJCQkgICAgc3RybGVuKGV4cC0+bV9leHBvcnQuZV9wYXRoKSkgeworCisJCQkJaWYgKHN0cmxlbihleHAtPm1fZXhwb3J0LmVfcGF0aCkgPgorCQkJCSAgICBzdHJsZW4oZm91bmQtPm1fZXhwb3J0LmVfcGF0aCkpIHsKKwkJCQkJZm91bmQgPSBleHA7CisJCQkJCWZvdW5kX3R5cGUgPSBpOworCQkJCX0KKwkJCQljb250aW51ZTsKKworCQkJfSBlbHNlIGlmIChmb3VuZF90eXBlID09IGkgJiYgZm91bmQtPm1fd2FybmVkID09IDApIHsKKwkJCQl4bG9nKExfV0FSTklORywgIiVzIGV4cG9ydGVkIHRvIGJvdGggJXMgYW5kICVzLCAiCisJCQkJICAgICAiYXJiaXRyYXJpbHkgY2hvb3Npbmcgb3B0aW9ucyBmcm9tIGZpcnN0IiwKKwkJCQkgICAgIHBhdGgsIGZvdW5kLT5tX2NsaWVudC0+bV9ob3N0bmFtZSwgZXhwLT5tX2NsaWVudC0+bV9ob3N0bmFtZSwKKwkJCQkgICAgIGRvbSk7CisJCQkJZm91bmQtPm1fd2FybmVkID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKK3ZvaWQgbmZzZF9leHBvcnQoRklMRSAqZikKK3sKKwkvKiByZXF1ZXN0cyBhcmU6CisJICogIGRvbWFpbiBwYXRoCisJICogZGV0ZXJtaW5lIGV4cG9ydCBvcHRpb25zIGFuZCByZXR1cm46CisJICogIGRvbWFpbiBwYXRoIGV4cGlyeSBmbGFncyBhbm9udWlkIGFub25naWQgZnNpZAorCSAqLworCisJY2hhciAqY3A7CisJY2hhciAqZG9tLCAqcGF0aDsKKwluZnNfZXhwb3J0ICpmb3VuZCA9IE5VTEw7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKwlzdHJ1Y3QgaG9zdGVudCAqaGUgPSBOVUxMOworCisKKwlpZiAocmVhZGxpbmUoZmlsZW5vKGYpLCAmbGJ1ZiwgJmxidWZsZW4pICE9IDEpCisJCXJldHVybjsKKworCXhsb2coRF9DQUxMLCAibmZzZF9leHBvcnQ6IGluYnVmICclcyciLCBsYnVmKTsKKworCWNwID0gbGJ1ZjsKKwlkb20gPSBtYWxsb2Moc3RybGVuKGNwKSk7CisJcGF0aCA9IG1hbGxvYyhzdHJsZW4oY3ApKTsKKworCWlmICghZG9tIHx8ICFwYXRoKQorCQlnb3RvIG91dDsKKworCWlmIChxd29yZF9nZXQoJmNwLCBkb20sIHN0cmxlbihsYnVmKSkgPD0gMCkKKwkJZ290byBvdXQ7CisJaWYgKHF3b3JkX2dldCgmY3AsIHBhdGgsIHN0cmxlbihsYnVmKSkgPD0gMCkKKwkJZ290byBvdXQ7CisKKwlhdXRoX3JlbG9hZCgpOworCisJaWYgKHVzZV9pcGFkZHIpIHsKKwkJaWYgKCFpbmV0X2F0b24oZG9tLCAmYWRkcikpCisJCQlnb3RvIG91dDsKKwkJaGUgPSBjbGllbnRfcmVzb2x2ZShhZGRyKTsKKwl9CisKKwlmb3VuZCA9IGxvb2t1cF9leHBvcnQoZG9tLCBwYXRoLCBoZSk7CisKKwlpZiAoZm91bmQpIHsKKwkJaWYgKGR1bXBfdG9fY2FjaGUoZiwgZG9tLCBwYXRoLCAmZm91bmQtPm1fZXhwb3J0KSA8IDApIHsKKwkJCXhsb2coTF9XQVJOSU5HLAorCQkJICAgICAiQ2Fubm90IGV4cG9ydCAlcywgcG9zc2libHkgdW5zdXBwb3J0ZWQgZmlsZXN5c3RlbSIKKwkJCSAgICAgIiBvciBmc2lkPSByZXF1aXJlZCIsIHBhdGgpOworCQkJZHVtcF90b19jYWNoZShmLCBkb20sIHBhdGgsIE5VTEwpOworCQl9CisJfSBlbHNlIHsKKwkJZHVtcF90b19jYWNoZShmLCBkb20sIHBhdGgsIE5VTEwpOworCX0KKyBvdXQ6CisJeGxvZyhEX0NBTEwsICJuZnNkX2V4cG9ydDogZm91bmQgJXAgcGF0aCAlcyIsIGZvdW5kLCBwYXRoID8gcGF0aCA6IE5VTEwpOworCWlmIChkb20pIGZyZWUoZG9tKTsKKwlpZiAocGF0aCkgZnJlZShwYXRoKTsKKwlpZiAoaGUpIGZyZWUoaGUpOworfQorCisKK3N0cnVjdCB7CisJY2hhciAqY2FjaGVfbmFtZTsKKwl2b2lkICgqY2FjaGVfaGFuZGxlKShGSUxFICpmKTsKKwlGSUxFICpmOworfSBjYWNoZWxpc3RbXSA9IHsKKwl7ICJhdXRoLnVuaXguaXAiLCBhdXRoX3VuaXhfaXB9LAorCXsgImF1dGgudW5peC5naWQiLCBhdXRoX3VuaXhfZ2lkfSwKKwl7ICJuZnNkLmV4cG9ydCIsIG5mc2RfZXhwb3J0fSwKKwl7ICJuZnNkLmZoIiwgbmZzZF9maH0sCisJeyBOVUxMLCBOVUxMIH0KK307CisKK2V4dGVybiBpbnQgbWFuYWdlX2dpZHM7Cit2b2lkIGNhY2hlX29wZW4odm9pZCkgCit7CisJaW50IGk7CisJZm9yIChpPTA7IGNhY2hlbGlzdFtpXS5jYWNoZV9uYW1lOyBpKysgKSB7CisJCWNoYXIgcGF0aFsxMDBdOworCQlpZiAoIW1hbmFnZV9naWRzICYmIGNhY2hlbGlzdFtpXS5jYWNoZV9oYW5kbGUgPT0gYXV0aF91bml4X2dpZCkKKwkJCWNvbnRpbnVlOworCQlzcHJpbnRmKHBhdGgsICIvcHJvYy9uZXQvcnBjLyVzL2NoYW5uZWwiLCBjYWNoZWxpc3RbaV0uY2FjaGVfbmFtZSk7CisJCWNhY2hlbGlzdFtpXS5mID0gZm9wZW4ocGF0aCwgInIrIik7CisJfQorfQorCit2b2lkIGNhY2hlX3NldF9mZHMoZmRfc2V0ICpmZHNldCkKK3sKKwlpbnQgaTsKKwlmb3IgKGk9MDsgY2FjaGVsaXN0W2ldLmNhY2hlX25hbWU7IGkrKykgeworCQlpZiAoY2FjaGVsaXN0W2ldLmYpCisJCQlGRF9TRVQoZmlsZW5vKGNhY2hlbGlzdFtpXS5mKSwgZmRzZXQpOworCX0KK30KKworaW50IGNhY2hlX3Byb2Nlc3NfcmVxKGZkX3NldCAqcmVhZGZkcykgCit7CisJaW50IGk7CisJaW50IGNudCA9IDA7CisJZm9yIChpPTA7IGNhY2hlbGlzdFtpXS5jYWNoZV9uYW1lOyBpKyspIHsKKwkJaWYgKGNhY2hlbGlzdFtpXS5mICE9IE5VTEwgJiYKKwkJICAgIEZEX0lTU0VUKGZpbGVubyhjYWNoZWxpc3RbaV0uZiksIHJlYWRmZHMpKSB7CisJCQljbnQrKzsKKwkJCWNhY2hlbGlzdFtpXS5jYWNoZV9oYW5kbGUoY2FjaGVsaXN0W2ldLmYpOworCQkJRkRfQ0xSKGZpbGVubyhjYWNoZWxpc3RbaV0uZiksIHJlYWRmZHMpOworCQl9CisJfQorCXJldHVybiBjbnQ7Cit9CisKKworLyoKKyAqIEdpdmUgSVAtPmRvbWFpbiBhbmQgZG9tYWluK3BhdGgtPm9wdGlvbnMgdG8ga2VybmVsCisgKiAlIGVjaG8gbmZzZCAkSVAgICRbbm93KzMwKjYwXSAkZG9tYWluID4gL3Byb2MvbmV0L3JwYy9hdXRoLnVuaXguaXAvY2hhbm5lbAorICogJSBlY2hvICRkb21haW4gJHBhdGggJFtub3crMzAqNjBdICRvcHRpb25zICRhbm9udWlkICRhbm9uZ2lkICRmc2lkID4gL3Byb2MvbmV0L3JwYy9uZnNkLmV4cG9ydC9jaGFubmVsCisgKi8KKworaW50IGNhY2hlX2V4cG9ydF9lbnQoY2hhciAqZG9tYWluLCBzdHJ1Y3QgZXhwb3J0ZW50ICpleHAsIGNoYXIgKnBhdGgpCit7CisJaW50IGVycjsKKwlGSUxFICpmID0gZm9wZW4oIi9wcm9jL25ldC9ycGMvbmZzZC5leHBvcnQvY2hhbm5lbCIsICJ3Iik7CisJaWYgKCFmKQorCQlyZXR1cm4gLTE7CisKKwllcnIgPSBkdW1wX3RvX2NhY2hlKGYsIGRvbWFpbiwgZXhwLT5lX3BhdGgsIGV4cCk7CisJaWYgKGVycikgeworCQl4bG9nKExfV0FSTklORywKKwkJICAgICAiQ2Fubm90IGV4cG9ydCAlcywgcG9zc2libHkgdW5zdXBwb3J0ZWQgZmlsZXN5c3RlbSBvciIKKwkJICAgICAiIGZzaWQ9IHJlcXVpcmVkIiwgZXhwLT5lX3BhdGgpOworCX0KKworCXdoaWxlIChlcnIgPT0gMCAmJiAoZXhwLT5lX2ZsYWdzICYgTkZTRVhQX0NST1NTTU9VTlQpICYmIHBhdGgpIHsKKwkJLyogcmVhbGx5IGFuICdpZicsIGJ1dCB3ZSBjYW4gYnJlYWsgb3V0IG9mCisJCSAqIGEgJ3doaWxlJyBtb3JlIGVhc2lseSAqLworCQkvKiBMb29rIGFsb25nICdwYXRoJyBmb3Igb3RoZXIgZmlsZXN5c3RlbXMKKwkJICogYW5kIGV4cG9ydCB0aGVtIHdpdGggdGhlIHNhbWUgb3B0aW9ucworCQkgKi8KKwkJc3RydWN0IHN0YXQgc3RiOworCQlpbnQgbCA9IHN0cmxlbihleHAtPmVfcGF0aCk7CisJCWludCBkZXY7CisKKwkJaWYgKHN0cmxlbihwYXRoKSA8PSBsIHx8IHBhdGhbbF0gIT0gJy8nIHx8CisJCSAgICBzdHJuY21wKGV4cC0+ZV9wYXRoLCBwYXRoLCBsKSAhPSAwKQorCQkJYnJlYWs7CisJCWlmIChzdGF0KGV4cC0+ZV9wYXRoLCAmc3RiKSAhPSAwKQorCQkJYnJlYWs7CisJCWRldiA9IHN0Yi5zdF9kZXY7CisJCXdoaWxlKHBhdGhbbF0gPT0gJy8nKSB7CisJCQljaGFyIGM7CisJCQkvKiBlcnJvcnMgZm9yIHN1Ym1vdW50IHNob3VsZCBmYWlsIHdob2xlIGZpbGVzeXN0ZW0gKi8KKwkJCWludCBlcnIyOworCisJCQlsKys7CisJCQl3aGlsZSAocGF0aFtsXSAhPSAnLycgJiYgcGF0aFtsXSkKKwkJCQlsKys7CisJCQljID0gcGF0aFtsXTsKKwkJCXBhdGhbbF0gPSAwOworCQkJZXJyMiA9IGxzdGF0KHBhdGgsICZzdGIpOworCQkJcGF0aFtsXSA9IGM7CisJCQlpZiAoZXJyMiA8IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc3RiLnN0X2RldiA9PSBkZXYpCisJCQkJY29udGludWU7CisJCQlkZXYgPSBzdGIuc3RfZGV2OworCQkJcGF0aFtsXSA9IDA7CisJCQlkdW1wX3RvX2NhY2hlKGYsIGRvbWFpbiwgcGF0aCwgZXhwKTsKKwkJCXBhdGhbbF0gPSBjOworCQl9CisJCWJyZWFrOworCX0KKworCWZjbG9zZShmKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY2FjaGVfZXhwb3J0KG5mc19leHBvcnQgKmV4cCwgY2hhciAqcGF0aCkKK3sKKwlpbnQgZXJyOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4oIi9wcm9jL25ldC9ycGMvYXV0aC51bml4LmlwL2NoYW5uZWwiLCAidyIpOworCWlmICghZikKKwkJcmV0dXJuIC0xOworCisJcXdvcmRfcHJpbnQoZiwgIm5mc2QiKTsKKwlxd29yZF9wcmludChmLCBpbmV0X250b2EoZXhwLT5tX2NsaWVudC0+bV9hZGRybGlzdFswXSkpOworCXF3b3JkX3ByaW50aW50KGYsIHRpbWUoMCkrMzAqNjApOworCXF3b3JkX3ByaW50KGYsIGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUpOworCWVyciA9IHF3b3JkX2VvbChmKTsKKwkKKwlmY2xvc2UoZik7CisKKwllcnIgPSBjYWNoZV9leHBvcnRfZW50KGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUsICZleHAtPm1fZXhwb3J0LCBwYXRoKQorCQl8fCBlcnI7CisJcmV0dXJuIGVycjsKK30KKworLyogR2V0IGEgZmlsZWhhbmRsZS4KKyAqIHsgCisgKiAgIGVjaG8gJGRvbWFpbiAkcGF0aCAkbGVuZ3RoIAorICogICByZWFkIGZpbGVoYW5kbGUgPCYwCisgKiB9IDw+IC9wcm9jL2ZzL25mc2QvZmlsZWhhbmRsZQorICovCitzdHJ1Y3QgbmZzX2ZoX2xlbiAqCitjYWNoZV9nZXRfZmlsZWhhbmRsZShuZnNfZXhwb3J0ICpleHAsIGludCBsZW4sIGNoYXIgKnApCit7CisJRklMRSAqZiA9IGZvcGVuKCIvcHJvYy9mcy9uZnNkL2ZpbGVoYW5kbGUiLCAicisiKTsKKwljaGFyIGJ1ZlsyMDBdOworCWNoYXIgKmJwID0gYnVmOworCWludCBmYWlsZWQ7CisJc3RhdGljIHN0cnVjdCBuZnNfZmhfbGVuIGZoOworCisJaWYgKCFmKQorCQlmID0gZm9wZW4oIi9wcm9jL2ZzL25mcy9maWxlaGFuZGxlIiwgInIrIik7CisJaWYgKCFmKQorCQlyZXR1cm4gTlVMTDsKKworCXF3b3JkX3ByaW50KGYsIGV4cC0+bV9jbGllbnQtPm1faG9zdG5hbWUpOworCXF3b3JkX3ByaW50KGYsIHApOworCXF3b3JkX3ByaW50aW50KGYsIGxlbik7CQorCWZhaWxlZCA9IHF3b3JkX2VvbChmKTsKKwkKKwlpZiAoIWZhaWxlZCkKKwkJZmFpbGVkID0gKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpID09IE5VTEwpOworCWZjbG9zZShmKTsKKwlpZiAoZmFpbGVkKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZmguZmhfaGFuZGxlLCAwLCBzaXplb2YoZmguZmhfaGFuZGxlKSk7CisJZmguZmhfc2l6ZSA9IHF3b3JkX2dldCgmYnAsIChjaGFyICopZmguZmhfaGFuZGxlLCBORlMzX0ZIU0laRSk7CisJcmV0dXJuICZmaDsKK30KKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9mc2xvYy5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9mc2xvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMDk0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL2ZzbG9jLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDT1BZUklHSFQgKGMpIDIwMDYKKyAqIFRIRSBSRUdFTlRTIE9GIFRIRSBVTklWRVJTSVRZIE9GIE1JQ0hJR0FOCisgKiBBTEwgUklHSFRTIFJFU0VSVkVECisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3MKKyAqIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzCisgKiBmb3IgYW55IHB1cnBvc2UsIHNvIGxvbmcgYXMgdGhlIG5hbWUgb2YgVGhlIFVuaXZlcnNpdHkgb2YKKyAqIE1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyAqIHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvZiBkaXN0cmlidXRpb24gb2YgdGhpcyBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgSWYgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55CisgKiBwb3J0aW9uIG9mIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdAorICogYWxzbyBiZSBpbmNsdWRlZC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEFTIElTLCBXSVRIT1VUIFJFUFJFU0VOVEFUSU9OCisgKiBGUk9NIFRIRSBVTklWRVJTSVRZIE9GIE1JQ0hJR0FOIEFTIFRPIElUUyBGSVRORVNTIEZPUiBBTlkKKyAqIFBVUlBPU0UsIEFORCBXSVRIT1VUIFdBUlJBTlRZIEJZIFRIRSBVTklWRVJTSVRZIE9GCisgKiBNSUNISUdBTiBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HCisgKiBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFCisgKiBSRUdFTlRTIE9GIFRIRSBVTklWRVJTSVRZIE9GIE1JQ0hJR0FOIFNIQUxMIE5PVCBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgREFNQUdFUywgSU5DTFVESU5HIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNIEFSSVNJTkcKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUsIEVWRU4KKyAqIElGIElUIEhBUyBCRUVOIE9SIElTIEhFUkVBRlRFUiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0VTLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworI2luY2x1ZGUgImZzbG9jLmgiCisjaW5jbHVkZSAiZXhwb3J0ZnMuaCIKKworLyogRGVidWdnaW5nIHRvb2w6IHByaW50cyBvdXQgQHNlcnZlcnMgaW5mbyB0byBzeXNsb2cgKi8KK3N0YXRpYyB2b2lkIHJlcGxpY2FzX3ByaW50KHN0cnVjdCBzZXJ2ZXJzICpzcCkKK3sKKwlpbnQgaTsKKwlpZiAoIXNwKSB7CisJCXhsb2coTF9OT1RJQ0UsICJOVUxMIHJlcGxpY2FzIHBvaW50ZXJcbiIpOworCQlyZXR1cm47CisJfQorCXhsb2coTF9OT1RJQ0UsICJyZXBsaWNhcyBsaXN0c2l6ZT0laVxuIiwgc3AtPmhfbnVtKTsKKwlmb3IgKGk9MDsgaTxzcC0+aF9udW07IGkrKykgeworCQl4bG9nKExfTk9USUNFLCAiICAgICVzOiVzXG4iLAorCQkgICAgICAgc3AtPmhfbXBbaV0tPmhfaG9zdCwgc3AtPmhfbXBbaV0tPmhfcGF0aCk7CisJfQorfQorCisjaWZkZWYgREVCVUcKKy8qIENhbGxlZCBieSBzZXR0aW5nICdNZXRob2QgPSBzdHViJyBpbiBjb25maWcgZmlsZS4gIEp1c3QgcmV0dXJucworICogc29tZSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgZ2liYmVyaXNoIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICovCitzdGF0aWMgc3RydWN0IHNlcnZlcnMgKm1ldGhvZF9zdHViKGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3Qgc2VydmVycyAqc3A7CisJc3RydWN0IG1vdW50X3BvaW50ICptcDsKKworCXhsb2coTF9OT1RJQ0UsICJjYWxsZWQgbWV0aG9kX3N0dWJcbiIpOworCXNwID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VydmVycykpOworCWlmICghc3ApCisJCXJldHVybiBOVUxMOworCW1wID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgbW91bnRfcG9pbnQpKTsKKwlpZiAoIW1wKSB7CisJCWZyZWUoc3ApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3AtPmhfbnVtID0gMTsKKwlzcC0+aF9tcFswXSA9IG1wOworCW1wLT5oX2hvc3QgPSBzdHJkdXAoInN0dWJfc2VydmVyIik7CisJbXAtPmhfcGF0aCA9IHN0cmR1cCgiL215L3Rlc3QvcGF0aCIpOworCXNwLT5oX3JlZmVycmFsID0gMTsKKwlyZXR1cm4gc3A7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworLyogU2NhbiBAbGlzdCwgd2hpY2ggaXMgYSBOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2Ygc3RyaW5ncyBvZiB0aGUKKyAqIGZvcm0gcGF0aEBob3N0Wytob3N0XSwgYW5kIHJldHVybiBjb3JyZXNwb25kaW5nIHNlcnZlcnMgc3RydWN0dXJlLgorICovCitzdGF0aWMgc3RydWN0IHNlcnZlcnMgKnBhcnNlX2xpc3QoY2hhciAqKmxpc3QpCit7CisJaW50IGk7CisJc3RydWN0IHNlcnZlcnMgKnJlczsKKwlzdHJ1Y3QgbW91bnRfcG9pbnQgKm1wOworCWNoYXIgKmNwOworCisJcmVzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VydmVycykpOworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXMtPmhfbnVtID0gMDsKKworCS8qIHBhcnNlIGVhY2ggb2YgdGhlIGFuc3dlcnMgaW4gc3VjZXNzaW9uLiAqLworCWZvciAoaT0wOyBsaXN0W2ldICYmIGk8RlNMT0NfTUFYX0xJU1Q7IGkrKykgeworCQltcCA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1vdW50X3BvaW50KSk7CisJCWlmICghbXApIHsKKwkJCXJlbGVhc2VfcmVwbGljYXMocmVzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWNwID0gc3RyY2hyKGxpc3RbaV0sICdAJyk7CisJCWlmICgoIWNwKSB8fCBsaXN0W2ldWzBdICE9ICcvJykgeworCQkJeGxvZyhMX1dBUk5JTkcsICJpbnZhbGlkIGVudHJ5ICclcyciLCBsaXN0W2ldKTsKKwkJCWNvbnRpbnVlOyAvKiBYWFggTmVlZCBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgKi8KKwkJfQorCQlyZXMtPmhfbXBbaV0gPSBtcDsKKwkJcmVzLT5oX251bSsrOworCQltcC0+aF9wYXRoID0gc3RybmR1cChsaXN0W2ldLCBjcCAtIGxpc3RbaV0pOworCQljcCsrOworCQltcC0+aF9ob3N0ID0gc3RyZHVwKGNwKTsKKwkJLyogaG9zdHMgYXJlICcrJyBzZXBhcmF0ZWQsIGtlcm5lbCBleHBlY3RzICc6JyBzZXBhcmF0ZWQgKi8KKwkJd2hpbGUgKCAoY3AgPSBzdHJjaHIobXAtPmhfaG9zdCwgJysnKSkgKQorCQkgICAgICAgKmNwID0gJzonOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBAZGF0YSBpcyBhIHN0cmluZyBvZiBmb3JtIHBhdGhAaG9zdFsraG9zdF1bOnBhdGhAaG9zdFsraG9zdF1dCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VydmVycyAqbWV0aG9kX2xpc3QoY2hhciAqZGF0YSkKK3sKKwljaGFyICpjb3B5LCAqcHRyPWRhdGE7CisJY2hhciAqKmxpc3Q7CisJaW50IGksIGxpc3RzaXplOworCXN0cnVjdCBzZXJ2ZXJzICpydj1OVUxMOworCisJeGxvZyhMX05PVElDRSwgIm1ldGhvZF9saXN0KCVzKVxuIiwgZGF0YSk7CisJZm9yIChwdHItLSwgbGlzdHNpemU9MTsgcHRyOyBwdHI9aW5kZXgocHRyLCAnOicpLCBsaXN0c2l6ZSsrKQorCQlwdHIrKzsKKwlsaXN0ID0gbWFsbG9jKGxpc3RzaXplICogc2l6ZW9mKGNoYXIgKikpOworCWNvcHkgPSBzdHJkdXAoZGF0YSk7CisJaWYgKGNvcHkpCisJCXhsb2coTF9OT1RJQ0UsICJjb252ZXJ0ZWQgdG8gJXNcbiIsIGNvcHkpOworCWlmIChsaXN0ICYmIGNvcHkpIHsKKwkJcHRyID0gY29weTsKKwkJZm9yIChpPTA7IGk8bGlzdHNpemU7IGkrKykgeworCQkJbGlzdFtpXSA9IHN0cnNlcCgmcHRyLCAiOiIpOworCQl9CisJCXJ2ID0gcGFyc2VfbGlzdChsaXN0KTsKKwl9CisJZnJlZShjb3B5KTsKKwlmcmVlKGxpc3QpOworCXJlcGxpY2FzX3ByaW50KHJ2KTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIFJldHVybnMgYXBwcm9wcmlhdGVseSBmaWxsZWQgc3RydWN0IHNlcnZlcnMsIG9yIE5VTEwgaWYgaGFkIGEgcHJvYmxlbSAqLworc3RydWN0IHNlcnZlcnMgKnJlcGxpY2FzX2xvb2t1cChpbnQgbWV0aG9kLCBjaGFyICpkYXRhLCBjaGFyICprZXkpCit7CisJc3RydWN0IHNlcnZlcnMgKnNwPU5VTEw7CisJc3dpdGNoKG1ldGhvZCkgeworCWNhc2UgRlNMT0NfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBGU0xPQ19SRUZFUjoKKwkJc3AgPSBtZXRob2RfbGlzdChkYXRhKTsKKwkJaWYgKHNwKQorCQkJc3AtPmhfcmVmZXJyYWwgPSAxOworCQlicmVhazsKKwljYXNlIEZTTE9DX1JFUExJQ0E6CisJCXNwID0gbWV0aG9kX2xpc3QoZGF0YSk7CisJCWlmIChzcCkKKwkJCXNwLT5oX3JlZmVycmFsID0gMDsKKwkJYnJlYWs7CisjaWZkZWYgREVCVUcKKwljYXNlIEZTTE9DX1NUVUI6CisJCXNwID0gbWV0aG9kX3N0dWIoZGF0YSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJeGxvZyhMX1dBUk5JTkcsICJVbmtub3duIG1ldGhvZCA9ICVpIiwgbWV0aG9kKTsKKwl9CisJcmVwbGljYXNfcHJpbnQoc3ApOworCXJldHVybiBzcDsKK30KKwordm9pZCByZWxlYXNlX3JlcGxpY2FzKHN0cnVjdCBzZXJ2ZXJzICpzZXJ2ZXIpCit7CisJaW50IGk7CisKKwlpZiAoIXNlcnZlcikgcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXItPmhfbnVtOyBpKyspIHsKKwkJZnJlZShzZXJ2ZXItPmhfbXBbaV0tPmhfaG9zdCk7CisJCWZyZWUoc2VydmVyLT5oX21wW2ldLT5oX3BhdGgpOworCQlmcmVlKHNlcnZlci0+aF9tcFtpXSk7CisJfQorCWZyZWUoc2VydmVyKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvZnNsb2MuaCBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvZnNsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk2ZDFjCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9mc2xvYy5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDT1BZUklHSFQgKGMpIDIwMDYKKyAqIFRIRSBSRUdFTlRTIE9GIFRIRSBVTklWRVJTSVRZIE9GIE1JQ0hJR0FOCisgKiBBTEwgUklHSFRTIFJFU0VSVkVECisgKgorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3MKKyAqIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzCisgKiBmb3IgYW55IHB1cnBvc2UsIHNvIGxvbmcgYXMgdGhlIG5hbWUgb2YgVGhlIFVuaXZlcnNpdHkgb2YKKyAqIE1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluIGFueSBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyAqIHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvZiBkaXN0cmlidXRpb24gb2YgdGhpcyBzb2Z0d2FyZQorICogd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgSWYgdGhlCisgKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKKyAqIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55CisgKiBwb3J0aW9uIG9mIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdAorICogYWxzbyBiZSBpbmNsdWRlZC4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEFTIElTLCBXSVRIT1VUIFJFUFJFU0VOVEFUSU9OCisgKiBGUk9NIFRIRSBVTklWRVJTSVRZIE9GIE1JQ0hJR0FOIEFTIFRPIElUUyBGSVRORVNTIEZPUiBBTlkKKyAqIFBVUlBPU0UsIEFORCBXSVRIT1VUIFdBUlJBTlRZIEJZIFRIRSBVTklWRVJTSVRZIE9GCisgKiBNSUNISUdBTiBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HCisgKiBXSVRIT1VUIExJTUlUQVRJT04gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gVEhFCisgKiBSRUdFTlRTIE9GIFRIRSBVTklWRVJTSVRZIE9GIE1JQ0hJR0FOIFNIQUxMIE5PVCBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgREFNQUdFUywgSU5DTFVESU5HIFNQRUNJQUwsIElORElSRUNULCBJTkNJREVOVEFMLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNIEFSSVNJTkcKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUsIEVWRU4KKyAqIElGIElUIEhBUyBCRUVOIE9SIElTIEhFUkVBRlRFUiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0VTLgorICovCisKKyNpZm5kZWYgRlNMT0NfSAorI2RlZmluZSBGU0xPQ19ICisKKyNkZWZpbmUgRlNMT0NfTUFYX0xJU1QgNDAKKworc3RydWN0IG1vdW50X3BvaW50IHsKKwljaGFyICpoX2hvc3Q7CisJY2hhciAqaF9wYXRoOworfTsKKworc3RydWN0IHNlcnZlcnMgeworCWludCBoX251bTsKKwlzdHJ1Y3QgbW91bnRfcG9pbnQgKmhfbXBbRlNMT0NfTUFYX0xJU1RdOworCWludCBoX3JlZmVycmFsOwkJLyogMD1yZXBsaWNhLCAxPXJlZmVycmFsICovCit9OworCitzdHJ1Y3Qgc2VydmVycyAqcmVwbGljYXNfbG9va3VwKGludCBtZXRob2QsIGNoYXIgKmRhdGEsIGNoYXIgKmtleSk7Cit2b2lkIHJlbGVhc2VfcmVwbGljYXMoc3RydWN0IHNlcnZlcnMgKnNlcnZlcik7CisKKyNlbmRpZiAvKiBGU0xPQ19IICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL21vdW50X2Rpc3BhdGNoLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL21vdW50X2Rpc3BhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2OTgxZAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvbW91bnRfZGlzcGF0Y2guYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogbW91bnRfZGlzcGF0Y2gJVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkaXNwYXRjaCB0YWJsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9UQ1BfV1JBUFBFUgorI2luY2x1ZGUgInRjcHdyYXBwZXIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAibW91bnRkLmgiCisjaW5jbHVkZSAicnBjbWlzYy5oIgorCisvKgorICogUHJvY2VkdXJlcyBmb3IgTU5UdjEKKyAqLworc3RhdGljIHN0cnVjdCBycGNfZGVudHJ5IG1udF8xX2R0YWJsZVtdID0geworCWR0YWJsZV9lbnQobW91bnRfbnVsbCwxLHZvaWQsdm9pZCksCQkvKiBOVUxMICovCisJZHRhYmxlX2VudChtb3VudF9tbnQsMSxkaXJwYXRoLGZoc3RhdHVzKSwJLyogTU5UICovCisJZHRhYmxlX2VudChtb3VudF9kdW1wLDEsdm9pZCxtb3VudGxpc3QpLAkvKiBEVU1QICovCisJZHRhYmxlX2VudChtb3VudF91bW50LDEsZGlycGF0aCx2b2lkKSwJCS8qIFVNTlQgKi8KKwlkdGFibGVfZW50KG1vdW50X3VtbnRhbGwsMSx2b2lkLHZvaWQpLAkJLyogVU1OVEFMTCAqLworCWR0YWJsZV9lbnQobW91bnRfZXhwb3J0LDEsdm9pZCxleHBvcnRzKSwJLyogRVhQT1JUICovCisJZHRhYmxlX2VudChtb3VudF9leHBvcnRhbGwsMSx2b2lkLGV4cG9ydHMpLAkvKiBFWFBPUlRBTEwgKi8KK307CisKKy8qCisgKiBQcm9jZWR1cmVzIGZvciBNTlR2MgorICovCitzdGF0aWMgc3RydWN0IHJwY19kZW50cnkgbW50XzJfZHRhYmxlW10gPSB7CisJZHRhYmxlX2VudChtb3VudF9udWxsLDEsdm9pZCx2b2lkKSwJCS8qIE5VTEwgKi8KKwlkdGFibGVfZW50KG1vdW50X21udCwxLGRpcnBhdGgsZmhzdGF0dXMpLAkvKiBNTlQgKi8KKwlkdGFibGVfZW50KG1vdW50X2R1bXAsMSx2b2lkLG1vdW50bGlzdCksCS8qIERVTVAgKi8KKwlkdGFibGVfZW50KG1vdW50X3VtbnQsMSxkaXJwYXRoLHZvaWQpLAkJLyogVU1OVCAqLworCWR0YWJsZV9lbnQobW91bnRfdW1udGFsbCwxLHZvaWQsdm9pZCksCQkvKiBVTU5UQUxMICovCisJZHRhYmxlX2VudChtb3VudF9leHBvcnQsMSx2b2lkLGV4cG9ydHMpLAkvKiBFWFBPUlQgKi8KKwlkdGFibGVfZW50KG1vdW50X2V4cG9ydGFsbCwxLHZvaWQsZXhwb3J0cyksCS8qIEVYUE9SVEFMTCAqLworCWR0YWJsZV9lbnQobW91bnRfcGF0aGNvbmYsMixkaXJwYXRoLHBwYXRoY25mKSwJLyogUEFUSENPTkYgKi8KK307CisKKy8qCisgKiBQcm9jZWR1cmVzIGZvciBNTlR2MworICovCitzdGF0aWMgc3RydWN0IHJwY19kZW50cnkgbW50XzNfZHRhYmxlW10gPSB7CisJZHRhYmxlX2VudChtb3VudF9udWxsLDEsdm9pZCx2b2lkKSwJCS8qIE5VTEwgKi8KKwlkdGFibGVfZW50KG1vdW50X21udCwzLGRpcnBhdGgsbW91bnRyZXMzKSwJLyogTU5UICovCisJZHRhYmxlX2VudChtb3VudF9kdW1wLDEsdm9pZCxtb3VudGxpc3QpLAkvKiBEVU1QICovCisJZHRhYmxlX2VudChtb3VudF91bW50LDEsZGlycGF0aCx2b2lkKSwJCS8qIFVNTlQgKi8KKwlkdGFibGVfZW50KG1vdW50X3VtbnRhbGwsMSx2b2lkLHZvaWQpLAkJLyogVU1OVEFMTCAqLworCWR0YWJsZV9lbnQobW91bnRfZXhwb3J0LDEsdm9pZCxleHBvcnRzKSwJLyogRVhQT1JUICovCit9OworCisjZGVmaW5lIG51bWJlcl9vZih4KQkoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworc3RhdGljIHN0cnVjdCBycGNfZHRhYmxlCWR0YWJsZVtdID0geworCXsgbW50XzFfZHRhYmxlLAkJbnVtYmVyX29mKG1udF8xX2R0YWJsZSkgfSwKKwl7IG1udF8yX2R0YWJsZSwJCW51bWJlcl9vZihtbnRfMl9kdGFibGUpIH0sCisJeyBtbnRfM19kdGFibGUsCQludW1iZXJfb2YobW50XzNfZHRhYmxlKSB9LAorfTsKKworLyoKKyAqIFRoZSBtYWluIGRpc3BhdGNoIHJvdXRpbmUuCisgKi8KK3ZvaWQKK21vdW50X2Rpc3BhdGNoKHN0cnVjdCBzdmNfcmVxICpycXN0cCwgU1ZDWFBSVCAqdHJhbnNwKQoreworCXVuaW9uIG1vdW50ZF9hcmd1bWVudHMgCWFyZ3VtZW50OworCXVuaW9uIG1vdW50ZF9yZXN1bHRzCXJlc3VsdDsKKworI2lmZGVmIEhBVkVfVENQX1dSQVBQRVIKKwkvKiByZW1vdGUgaG9zdCBhdXRob3JpemF0aW9uIGNoZWNrICovCisJaWYgKCFjaGVja19kZWZhdWx0KCJtb3VudGQiLCBuZnNfZ2V0cnBjY2FsbGVyKHRyYW5zcCksIE1PVU5UUFJPRykpIHsKKwkJc3ZjZXJyX2F1dGggKHRyYW5zcCwgQVVUSF9GQUlMRUQpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlycGNfZGlzcGF0Y2gocnFzdHAsIHRyYW5zcCwgZHRhYmxlLCBudW1iZXJfb2YoZHRhYmxlKSwKKwkJCSZhcmd1bWVudCwgJnJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL21vdW50ZC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9tb3VudGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGExZjJkCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9tb3VudGQuYwpAQCAtMCwwICsxLDgzMCBAQAorLyoKKyAqIHV0aWxzL21vdW50ZC9tb3VudGQuYworICoKKyAqIEF1dGhlbnRpY2F0ZSBtb3VudCByZXF1ZXN0cyBhbmQgcmV0cmlldmUgZmlsZSBoYW5kbGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAibW91bnRkLmgiCisjaW5jbHVkZSAicnBjbWlzYy5oIgorI2luY2x1ZGUgInBzZXVkb2ZsYXZvcnMuaCIKKworZXh0ZXJuIHZvaWQJY2FjaGVfb3Blbih2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgbmZzX2ZoX2xlbiAqY2FjaGVfZ2V0X2ZpbGVoYW5kbGUobmZzX2V4cG9ydCAqZXhwLCBpbnQgbGVuLCBjaGFyICpwKTsKK2V4dGVybiBpbnQgY2FjaGVfZXhwb3J0KG5mc19leHBvcnQgKmV4cCwgY2hhciAqcGF0aCk7CisKK2V4dGVybiB2b2lkIG15X3N2Y19ydW4odm9pZCk7CisKK3N0YXRpYyB2b2lkCQl1c2FnZShjb25zdCBjaGFyICosIGludCBleGl0Y29kZSk7CitzdGF0aWMgZXhwb3J0cwkJZ2V0X2V4cG9ydGxpc3Qodm9pZCk7CitzdGF0aWMgc3RydWN0IG5mc19maF9sZW4gKmdldF9yb290Zmgoc3RydWN0IHN2Y19yZXEgKiwgZGlycGF0aCAqLCBuZnNfZXhwb3J0ICoqLCBtb3VudHN0YXQzICosIGludCB2Myk7CisKK2ludCByZXZlcnNlX3Jlc29sdmUgPSAwOworaW50IG5ld19jYWNoZSA9IDA7CitpbnQgbWFuYWdlX2dpZHM7CitpbnQgdXNlX2lwYWRkciA9IC0xOworCisvKiBQUkM6IGEgaGlnaC1hdmFpbGFiaWxpdHkgY2FsbG91dCBwcm9ncmFtIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCAtSAorICogV2hlbiB0aGlzIGlzIGRvbmUsIHRoZSBwcm9ncmFtIHdpbGwgcmVjZWl2ZSBjYWxsb3V0cyB3aGVuZXZlciBjbGllbnRzCisgKiBzZW5kIG1vdW50IG9yIHVubW91bnQgcmVxdWVzdHMgLS0gdGhlIGNhbGxvdXQgaXMgbm90IG5lZWRlZCBmb3IgMi42IGtlcm5lbCAqLworY2hhciAqaGFfY2FsbG91dF9wcm9nID0gTlVMTDsKKworLyogTnVtYmVyIG9mIG1vdW50ZCB0aHJlYWRzIHRvIHN0YXJ0LiAgIERlZmF1bHQgaXMgMSBhbmQKKyAqIHRoYXQncyBwcm9iYWJseSBlbm91Z2ggdW5sZXNzIHlvdSBuZWVkIGh1bmRyZWRzIG9mCisgKiBjbGllbnRzIHRvIGJlIGFibGUgdG8gbW91bnQgYXQgb25jZS4gICovCitzdGF0aWMgaW50IG51bV90aHJlYWRzID0gMTsKKy8qIEFyYml0cmFyeSBsaW1pdCBvbiBudW1iZXIgb2YgdGhyZWFkcyAqLworI2RlZmluZSBNQVhfVEhSRUFEUyA2NAorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KK3sKKwl7ICJmb3JlZ3JvdW5kIiwgMCwgMCwgJ0YnIH0sCisJeyAiZGVzY3JpcHRvcnMiLCAxLCAwLCAnbycgfSwKKwl7ICJkZWJ1ZyIsIDEsIDAsICdkJyB9LAorCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwl7ICJleHBvcnRzLWZpbGUiLCAxLCAwLCAnZicgfSwKKwl7ICJuZnMtdmVyc2lvbiIsIDEsIDAsICdWJyB9LAorCXsgIm5vLW5mcy12ZXJzaW9uIiwgMSwgMCwgJ04nIH0sCisJeyAidmVyc2lvbiIsIDAsIDAsICd2JyB9LAorCXsgInBvcnQiLCAxLCAwLCAncCcgfSwKKwl7ICJuby10Y3AiLCAwLCAwLCAnbicgfSwKKwl7ICJoYS1jYWxsb3V0IiwgMSwgMCwgJ0gnIH0sCisJeyAic3RhdGUtZGlyZWN0b3J5LXBhdGgiLCAxLCAwLCAncycgfSwKKwl7ICJudW0tdGhyZWFkcyIsIDEsIDAsICd0JyB9LAorCXsgInJldmVyc2UtbG9va3VwIiwgMCwgMCwgJ3InIH0sCisJeyAibWFuYWdlLWdpZHMiLCAwLCAwLCAnZycgfSwKKwl7IE5VTEwsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIGludCBuZnNfdmVyc2lvbiA9IC0xOworCitzdGF0aWMgdm9pZAordW5yZWdpc3Rlcl9zZXJ2aWNlcyAodm9pZCkKK3sKKwlpZiAobmZzX3ZlcnNpb24gJiAweDEpCisJCXBtYXBfdW5zZXQgKE1PVU5UUFJPRywgTU9VTlRWRVJTKTsKKwlpZiAobmZzX3ZlcnNpb24gJiAoMHgxIDw8IDEpKQorCQlwbWFwX3Vuc2V0IChNT1VOVFBST0csIE1PVU5UVkVSU19QT1NJWCk7CisJaWYgKG5mc192ZXJzaW9uICYgKDB4MSA8PCAyKSkKKwkJcG1hcF91bnNldCAoTU9VTlRQUk9HLCBNT1VOVFZFUlNfTkZTVjMpOworfQorCitzdGF0aWMgdm9pZAorY2xlYW51cF9sb2NrZmlsZXMgKHZvaWQpCit7CisJdW5saW5rKF9QQVRIX1hUQUJMQ0spOworCXVubGluayhfUEFUSF9FVEFCTENLKTsKKwl1bmxpbmsoX1BBVEhfUk1UQUJMQ0spOworfQorCisvKiBXYWl0IGZvciBhbGwgd29ya2VyIGNoaWxkIHByb2Nlc3NlcyB0byBleGl0IGFuZCByZWFwIHRoZW0gKi8KK3N0YXRpYyB2b2lkCit3YWl0X2Zvcl93b3JrZXJzICh2b2lkKQoreworCWludCBzdGF0dXM7CisJcGlkX3QgcGlkOworCisJZm9yICg7OykgeworCisJCXBpZCA9IHdhaXRwaWQoMCwgJnN0YXR1cywgMCk7CisKKwkJaWYgKHBpZCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQ0hJTEQpCisJCQkJcmV0dXJuOyAvKiBubyBtb3JlIGNoaWxkcmVuICovCisJCQl4bG9nKExfRkFUQUwsICJtb3VudGQ6IGNhbid0IHdhaXQ6ICVzXG4iLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQl9CisKKwkJLyogTm90ZTogYmVjYXVzZSB3ZSBTSUdfSUdOJ2QgU0lHQ0hMRCBlYXJsaWVyLCB0aGlzCisJCSAqIGRvZXMgbm90IGhhcHBlbiBvbiAyLjYga2VybmVscywgYW5kIHdhaXRwaWQoKSBibG9ja3MKKwkJICogdW50aWwgYWxsIHRoZSBjaGlsZHJlbiBhcmUgZGVhZCB0aGVuIHJldHVybnMgd2l0aAorCQkgKiAtRUNISUxELiAgQnV0LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIG9uIHRoZQorCQkgKiBkZWF0aCBvZiBpbmRpdmlkdWFsIHdvcmtlcnMsIHNvIHdlIGRvbid0IGNhcmUuICovCisJCXhsb2coTF9OT1RJQ0UsICJtb3VudGQ6IHJlYXBlZCBjaGlsZCAlZCwgc3RhdHVzICVkXG4iLAorCQkJCShpbnQpcGlkLCBzdGF0dXMpOworCX0KK30KKworLyogRm9yayBudW1fdGhyZWFkcyB3b3JrZXIgY2hpbGRyZW4gYW5kIHdhaXQgZm9yIHRoZW0gKi8KK3N0YXRpYyB2b2lkCitmb3JrX3dvcmtlcnModm9pZCkKK3sKKwlpbnQgaTsKKwlwaWRfdCBwaWQ7CisKKwl4bG9nKExfTk9USUNFLCAibW91bnRkOiBzdGFydGluZyAlZCB0aHJlYWRzXG4iLCBudW1fdGhyZWFkcyk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG51bV90aHJlYWRzIDsgaSsrKSB7CisJCXBpZCA9IGZvcmsoKTsKKwkJaWYgKHBpZCA8IDApIHsKKwkJCXhsb2coTF9GQVRBTCwgIm1vdW50ZDogY2Fubm90IGZvcms6ICVzXG4iLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmIChwaWQgPT0gMCkgeworCQkJLyogd29ya2VyIGNoaWxkICovCisKKwkJCS8qIFJlLWVuYWJsZSB0aGUgZGVmYXVsdCBhY3Rpb24gb24gU0lHVEVSTSBldCBhbAorCQkJICogc28gdGhhdCB3b3JrZXJzIGRpZSBuYXR1cmFsbHkgd2hlbiBzZW50IHRoZW0uCisJCQkgKiBPbmx5IHRoZSBwYXJlbnQgdW5yZWdpc3RlcnMgd2l0aCBwbWFwIGFuZAorCQkJICogaGVuY2UgbmVlZHMgdG8gZG8gc3BlY2lhbCBTSUdURVJNIGhhbmRsaW5nLiAqLworCQkJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwkJCXNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCQkJc2Euc2FfZmxhZ3MgPSAwOworCQkJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCQkJc2lnYWN0aW9uKFNJR0hVUCwgJnNhLCBOVUxMKTsKKwkJCXNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCk7CisJCQlzaWdhY3Rpb24oU0lHVEVSTSwgJnNhLCBOVUxMKTsKKworCQkJLyogZmFsbCBpbnRvIG15X3N2Y19ydW4gaW4gY2FsbGVyICovCisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBpbiBwYXJlbnQgKi8KKwl3YWl0X2Zvcl93b3JrZXJzKCk7CisJdW5yZWdpc3Rlcl9zZXJ2aWNlcygpOworCWNsZWFudXBfbG9ja2ZpbGVzKCk7CisJeGxvZyhMX05PVElDRSwgIm1vdW50ZDogbm8gbW9yZSB3b3JrZXJzLCBleGl0aW5nXG4iKTsKKwlleGl0KDApOworfQorCisvKgorICogU2lnbmFsIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIAora2lsbGVyIChpbnQgc2lnKQoreworCXVucmVnaXN0ZXJfc2VydmljZXMoKTsKKwlpZiAobnVtX3RocmVhZHMgPiAxKSB7CisJCS8qIHBsYXkgS3Jvbm9zIGFuZCBlYXQgb3VyIGNoaWxkcmVuICovCisJCWtpbGwoMCwgU0lHVEVSTSk7CisJCXdhaXRfZm9yX3dvcmtlcnMoKTsKKwl9CisJY2xlYW51cF9sb2NrZmlsZXMoKTsKKwl4bG9nIChMX0ZBVEFMLCAiQ2F1Z2h0IHNpZ25hbCAlZCwgdW4tcmVnaXN0ZXJpbmcgYW5kIGV4aXRpbmcuIiwgc2lnKTsKK30KKworc3RhdGljIHZvaWQKK3NpZ19odXAgKGludCBzaWcpCit7CisJLyogZG9uJ3QgZXhpdCBvbiBTSUdIVVAgKi8KKwl4bG9nIChMX05PVElDRSwgIlJlY2VpdmVkIFNJR0hVUC4uLiBJZ25vcmluZy5cbiIsIHNpZyk7CisJcmV0dXJuOworfQorCitib29sX3QKK21vdW50X251bGxfMV9zdmMoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQoreworCXJldHVybiAxOworfQorCitib29sX3QKK21vdW50X21udF8xX3N2YyhzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIGRpcnBhdGggKnBhdGgsIGZoc3RhdHVzICpyZXMpCit7CisJc3RydWN0IG5mc19maF9sZW4gKmZoOworCisJeGxvZyhEX0NBTEwsICJNTlQxKCVzKSBjYWxsZWQiLCAqcGF0aCk7CisJZmggPSBnZXRfcm9vdGZoKHJxc3RwLCBwYXRoLCBOVUxMLCAmcmVzLT5maHNfc3RhdHVzLCAwKTsKKwlpZiAoZmgpCisJCW1lbWNweSgmcmVzLT5maHN0YXR1c191LmZoc19maGFuZGxlLCBmaC0+ZmhfaGFuZGxlLCAzMik7CisJcmV0dXJuIDE7Cit9CisKK2Jvb2xfdAorbW91bnRfZHVtcF8xX3N2YyhzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHZvaWQgKmFyZ3AsIG1vdW50bGlzdCAqcmVzKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IG5mc19nZXRycGNjYWxsZXJfaW4ocnFzdHAtPnJxX3hwcnQpOworCisJeGxvZyhEX0NBTEwsICJkdW1wIHJlcXVlc3QgZnJvbSAlcy4iLCBpbmV0X250b2EoYWRkci0+c2luX2FkZHIpKTsKKwkqcmVzID0gbW91bnRsaXN0X2xpc3QoKTsKKworCXJldHVybiAxOworfQorCitib29sX3QKK21vdW50X3VtbnRfMV9zdmMoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCBkaXJwYXRoICphcmdwLCB2b2lkICpyZXNwKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gbmZzX2dldHJwY2NhbGxlcl9pbihycXN0cC0+cnFfeHBydCk7CisJbmZzX2V4cG9ydAkqZXhwOworCWNoYXIJCSpwID0gKmFyZ3A7CisJY2hhcgkJcnBhdGhbTUFYUEFUSExFTisxXTsKKworCWlmICgqcCA9PSAnXDAnKQorCQlwID0gIi8iOworCisJaWYgKHJlYWxwYXRoKHAsIHJwYXRoKSAhPSBOVUxMKSB7CisJCXJwYXRoW3NpemVvZiAocnBhdGgpIC0gMV0gPSAnXDAnOworCQlwID0gcnBhdGg7CisJfQorCisJaWYgKCEoZXhwID0gYXV0aF9hdXRoZW50aWNhdGUoInVubW91bnQiLCBzaW4sIHApKSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwltb3VudGxpc3RfZGVsKGluZXRfbnRvYShzaW4tPnNpbl9hZGRyKSwgcCk7CisJcmV0dXJuIDE7Cit9CisKK2Jvb2xfdAorbW91bnRfdW1udGFsbF8xX3N2YyhzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCit7CisJLyogUmVsb2FkIC9ldGMveHRhYiBpZiBuZWNlc3NhcnkgKi8KKwlhdXRoX3JlbG9hZCgpOworCisJbW91bnRsaXN0X2RlbF9hbGwobmZzX2dldHJwY2NhbGxlcl9pbihycXN0cC0+cnFfeHBydCkpOworCXJldHVybiAxOworfQorCitib29sX3QKK21vdW50X2V4cG9ydF8xX3N2YyhzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHZvaWQgKmFyZ3AsIGV4cG9ydHMgKnJlc3ApCit7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyID0gbmZzX2dldHJwY2NhbGxlcl9pbihycXN0cC0+cnFfeHBydCk7CisKKwl4bG9nKERfQ0FMTCwgImV4cG9ydCByZXF1ZXN0IGZyb20gJXMuIiwgaW5ldF9udG9hKGFkZHItPnNpbl9hZGRyKSk7CisJKnJlc3AgPSBnZXRfZXhwb3J0bGlzdCgpOworCQkKKwlyZXR1cm4gMTsKK30KKworYm9vbF90Cittb3VudF9leHBvcnRhbGxfMV9zdmMoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCB2b2lkICphcmdwLCBleHBvcnRzICpyZXNwKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkciA9IG5mc19nZXRycGNjYWxsZXJfaW4ocnFzdHAtPnJxX3hwcnQpOworCisJeGxvZyhEX0NBTEwsICJleHBvcnRhbGwgcmVxdWVzdCBmcm9tICVzLiIsIGluZXRfbnRvYShhZGRyLT5zaW5fYWRkcikpOworCSpyZXNwID0gZ2V0X2V4cG9ydGxpc3QoKTsKKworCXJldHVybiAxOworfQorCisvKgorICogTU5UdjIgcGF0aGNvbmYgcHJvY2VkdXJlCisgKgorICogVGhlIHByb3RvY29sIGRvZXNuJ3QgaW5jbHVkZSBhIHN0YXR1cyBmaWVsZCwgc28gU3VuIGFwcGFyZW50bHkgY29uc2lkZXJzCisgKiBpdCBnb29kIHByYWN0aWNlIHRvIGxldCBhbnlvbmUgc25vb3Agb24geW91ciBzeXN0ZW0sIGV2ZW4gaWYgaXQncworICogcHJldHR5IGhhcm1sZXNzIGRhdGEgc3VjaCBhcyBwYXRoY29uZi4gV2UgZG9uJ3QuCisgKgorICogQmVzaWRlcywgbWFueSBvZiB0aGUgcGF0aGNvbmYgdmFsdWVzIGRvbid0IG1ha2UgbXVjaCBzZW5zZSBvbiBORlMgdm9sdW1lcy4KKyAqIEZJRk9zIGFuZCB0dHkgZGV2aWNlIGZpbGVzIHJlcHJlc2VudCBkZXZpY2VzIG9uIHRoZSAqY2xpZW50Kiwgc28gdGhlcmUncworICogbm8gcG9pbnQgaW4gZ2V0dGluZyB0aGUgc2VydmVyJ3MgYnVmZmVyIHNpemVzIGV0Yy4KKyAqLworYm9vbF90Cittb3VudF9wYXRoY29uZl8yX3N2YyhzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIGRpcnBhdGggKnBhdGgsIHBwYXRoY25mICpyZXMpCit7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSBuZnNfZ2V0cnBjY2FsbGVyX2luKHJxc3RwLT5ycV94cHJ0KTsKKwlzdHJ1Y3Qgc3RhdAlzdGI7CisJbmZzX2V4cG9ydAkqZXhwOworCWNoYXIJCXJwYXRoW01BWFBBVEhMRU4rMV07CisJY2hhcgkJKnAgPSAqcGF0aDsKKworCW1lbXNldChyZXMsIDAsIHNpemVvZigqcmVzKSk7CisKKwlpZiAoKnAgPT0gJ1wwJykKKwkJcCA9ICIvIjsKKworCS8qIFJlbG9hZCAvZXRjL3h0YWIgaWYgbmVjZXNzYXJ5ICovCisJYXV0aF9yZWxvYWQoKTsKKworCS8qIFJlc29sdmUgc3ltbGlua3MgKi8KKwlpZiAocmVhbHBhdGgocCwgcnBhdGgpICE9IE5VTEwpIHsKKwkJcnBhdGhbc2l6ZW9mIChycGF0aCkgLSAxXSA9ICdcMCc7CisJCXAgPSBycGF0aDsKKwl9CisKKwkvKiBOb3cgYXV0aGVudGljYXRlIHRoZSBpbnRydWRlci4uLiAqLworCWV4cCA9IGF1dGhfYXV0aGVudGljYXRlKCJwYXRoY29uZiIsIHNpbiwgcCk7CisJaWYgKCFleHApIHsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChzdGF0KHAsICZzdGIpIDwgMCkgeworCQl4bG9nKExfV0FSTklORywgImNhbid0IHN0YXQgZXhwb3J0ZWQgZGlyICVzOiAlcyIsCisJCQkJcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmVzLT5wY19saW5rX21heCAgPSBwYXRoY29uZihwLCBfUENfTElOS19NQVgpOworCXJlcy0+cGNfbWF4X2Nhbm9uID0gcGF0aGNvbmYocCwgX1BDX01BWF9DQU5PTik7CisJcmVzLT5wY19tYXhfaW5wdXQgPSBwYXRoY29uZihwLCBfUENfTUFYX0lOUFVUKTsKKwlyZXMtPnBjX25hbWVfbWF4ICA9IHBhdGhjb25mKHAsIF9QQ19OQU1FX01BWCk7CisJcmVzLT5wY19wYXRoX21heCAgPSBwYXRoY29uZihwLCBfUENfUEFUSF9NQVgpOworCXJlcy0+cGNfcGlwZV9idWYgID0gcGF0aGNvbmYocCwgX1BDX1BJUEVfQlVGKTsKKwlyZXMtPnBjX3ZkaXNhYmxlICA9IHBhdGhjb25mKHAsIF9QQ19WRElTQUJMRSk7CisKKwkvKiBDYW4ndCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBwY19tYXNrICovCisJcmVzLT5wY19tYXNrWzBdICAgPSAwOworCXJlcy0+cGNfbWFza1sxXSAgID0gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogV2Ugc2hvdWxkIGFkdmVydGlzZSB0aGUgcHJlZmVycmVkIGZsYXZvdXJzIGZpcnN0LiAoU2VlIFJGQyAyNjIzCisgKiBzZWN0aW9uIDIuNy4pICBXZSBsZWF2ZSB0aGF0IHRvIHRoZSBhZG1pbmlzdHJhdG9yLCBieSBhZHZlcnRpc2luZworICogZmxhdm91cnMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBsaXN0ZWQgaW4gL2V0Yy9leHBvcnRzLiAgQVVUSF9OVUxMIGlzCisgKiBkcm9wcGVkIGZyb20gdGhlIGxpc3QgdG8gYXZvaWQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZSB3aXRoCisgKiBvbGRlciBMaW51eCBjbGllbnRzLCB3aG8gaW5zcGVjdCB0aGUgbGlzdCBpbiByZXZlcnNlZCBvcmRlci4KKyAqCisgKiBYWFg6IEl0IG1pZ2h0IGJlIG1vcmUgaGVscGZ1bCB0byByZWFycmFuZ2UgdGhlc2Ugc28gdGhhdCBmbGF2b3JzCisgKiBnaXZpbmcgbW9yZSBhY2Nlc3MgKGFzIGRldGVybWluZWQgZnJvbSByZWFkb25seSBhbmQgaWQtc3F1YXNoaW5nCisgKiBvcHRpb25zKSBjb21lIGZpcnN0LiAgKElmIHdlIGRlY2lkZSB0byBkbyB0aGF0IHdlIHNob3VsZCBwcm9iYWJseSBkbworICogdGhhdCB3aGVuIHJlYWRpbmcgdGhlIGV4cG9ydHMgcmF0aGVyIHRoYW4gaGVyZS4pCisgKi8KK3N0YXRpYyB2b2lkIHNldF9hdXRoZmxhdm9ycyhzdHJ1Y3QgbW91bnRyZXMzX29rICpvaywgbmZzX2V4cG9ydCAqZXhwKQoreworCXN0cnVjdCBzZWNfZW50cnkgKnM7CisJc3RhdGljIGludCBmbGF2b3JzW1NFQ0ZMQVZPUl9DT1VOVF07CisJaW50IGkgPSAwOworCisJZm9yIChzID0gZXhwLT5tX2V4cG9ydC5lX3NlY2luZm87IHMtPmZsYXY7IHMrKykgeworCQlpZiAocy0+Zmxhdi0+Zm51bSA9PSBBVVRIX05VTEwpCisJCQljb250aW51ZTsKKwkJZmxhdm9yc1tpXSA9IHMtPmZsYXYtPmZudW07CisJCWkrKzsKKwl9CisJaWYgKGkgPT0gMCkgeworCQkvKiBkZWZhdWx0IHdoZW4gdGhlcmUgaXMgbm8gc2VjPSBvcHRpb246ICovCisJCWkgPSAxOworCQlmbGF2b3JzWzBdID0gQVVUSF9VTklYOworCX0KKwlvay0+YXV0aF9mbGF2b3JzLmF1dGhfZmxhdm9yc192YWwgPSBmbGF2b3JzOworCW9rLT5hdXRoX2ZsYXZvcnMuYXV0aF9mbGF2b3JzX2xlbiA9IGk7Cit9CisKKy8qCisgKiBORlN2MyBNT1VOVCBwcm9jZWR1cmUKKyAqLworYm9vbF90Cittb3VudF9tbnRfM19zdmMoc3RydWN0IHN2Y19yZXEgKnJxc3RwLCBkaXJwYXRoICpwYXRoLCBtb3VudHJlczMgKnJlcykKK3sKKwlzdHJ1Y3QgbW91bnRyZXMzX29rICpvayA9ICZyZXMtPm1vdW50cmVzM191Lm1vdW50aW5mbzsKKwluZnNfZXhwb3J0ICpleHA7CisJc3RydWN0IG5mc19maF9sZW4gKmZoOworCisJeGxvZyhEX0NBTEwsICJNTlQzKCVzKSBjYWxsZWQiLCAqcGF0aCk7CisJZmggPSBnZXRfcm9vdGZoKHJxc3RwLCBwYXRoLCAmZXhwLCAmcmVzLT5maHNfc3RhdHVzLCAxKTsKKwlpZiAoIWZoKQorCQlyZXR1cm4gMTsKKworCW9rLT5maGFuZGxlLmZoYW5kbGUzX2xlbiA9IGZoLT5maF9zaXplOworCW9rLT5maGFuZGxlLmZoYW5kbGUzX3ZhbCA9IChjaGFyICopZmgtPmZoX2hhbmRsZTsKKwlzZXRfYXV0aGZsYXZvcnMob2ssIGV4cCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX2ZoX2xlbiAqCitnZXRfcm9vdGZoKHN0cnVjdCBzdmNfcmVxICpycXN0cCwgZGlycGF0aCAqcGF0aCwgbmZzX2V4cG9ydCAqKmV4cHJldCwKKwkJbW91bnRzdGF0MyAqZXJyb3IsIGludCB2MykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IG5mc19nZXRycGNjYWxsZXJfaW4ocnFzdHAtPnJxX3hwcnQpOworCXN0cnVjdCBzdGF0CXN0YiwgZXN0YjsKKwluZnNfZXhwb3J0CSpleHA7CisJc3RydWN0IG5mc19maF9sZW4gKmZoOworCWNoYXIJCXJwYXRoW01BWFBBVEhMRU4rMV07CisJY2hhcgkJKnAgPSAqcGF0aDsKKworCWlmICgqcCA9PSAnXDAnKQorCQlwID0gIi8iOworCisJLyogUmVsb2FkIC92YXIvbGliL25mcy9ldGFiIGlmIG5lY2Vzc2FyeSAqLworCWF1dGhfcmVsb2FkKCk7CisKKwkvKiBSZXNvbHZlIHN5bWxpbmtzICovCisJaWYgKHJlYWxwYXRoKHAsIHJwYXRoKSAhPSBOVUxMKSB7CisJCXJwYXRoW3NpemVvZiAocnBhdGgpIC0gMV0gPSAnXDAnOworCQlwID0gcnBhdGg7CisJfQorCisJLyogTm93IGF1dGhlbnRpY2F0ZSB0aGUgaW50cnVkZXIuLi4gKi8KKwlleHAgPSBhdXRoX2F1dGhlbnRpY2F0ZSgibW91bnQiLCBzaW4sIHApOworCWlmICghZXhwKSB7CisJCSplcnJvciA9IE5GU0VSUl9BQ0NFUzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChzdGF0KHAsICZzdGIpIDwgMCkgeworCQl4bG9nKExfV0FSTklORywgImNhbid0IHN0YXQgZXhwb3J0ZWQgZGlyICVzOiAlcyIsCisJCQkJcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCSplcnJvciA9IE5GU0VSUl9OT0VOVDsKKwkJZWxzZQorCQkJKmVycm9yID0gTkZTRVJSX0FDQ0VTOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFTX0lTRElSKHN0Yi5zdF9tb2RlKSAmJiAhU19JU1JFRyhzdGIuc3RfbW9kZSkpIHsKKwkJeGxvZyhMX1dBUk5JTkcsICIlcyBpcyBub3QgYSBkaXJlY3Rvcnkgb3IgcmVndWxhciBmaWxlIiwgcCk7CisJCSplcnJvciA9IE5GU0VSUl9OT1RESVI7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3RhdChleHAtPm1fZXhwb3J0LmVfcGF0aCwgJmVzdGIpIDwgMCkgeworCQl4bG9nKExfV0FSTklORywgImNhbid0IHN0YXQgZXhwb3J0IHBvaW50ICVzOiAlcyIsCisJCSAgICAgcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJKmVycm9yID0gTkZTRVJSX05PRU5UOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGVzdGIuc3RfZGV2ICE9IHN0Yi5zdF9kZXYKKwkJICAgJiYgKCFuZXdfY2FjaGUKKwkJCSAgIHx8ICEoZXhwLT5tX2V4cG9ydC5lX2ZsYWdzICYgTkZTRVhQX0NST1NTTU9VTlQpKSkgeworCQl4bG9nKExfV0FSTklORywgInJlcXVlc3QgdG8gZXhwb3J0IGRpcmVjdG9yeSAlcyBiZWxvdyBuZWFyZXN0IGZpbGVzeXN0ZW0gJXMiLAorCQkgICAgIHAsIGV4cC0+bV9leHBvcnQuZV9wYXRoKTsKKwkJKmVycm9yID0gTkZTRVJSX0FDQ0VTOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGV4cC0+bV9leHBvcnQuZV9tb3VudHBvaW50ICYmCisJCSAgICFpc19tb3VudHBvaW50KGV4cC0+bV9leHBvcnQuZV9tb3VudHBvaW50WzBdPworCQkJCSAgZXhwLT5tX2V4cG9ydC5lX21vdW50cG9pbnQ6CisJCQkJICBleHAtPm1fZXhwb3J0LmVfcGF0aCkpIHsKKwkJeGxvZyhMX1dBUk5JTkcsICJyZXF1ZXN0IHRvIGV4cG9ydCBhbiB1bm1vdW50ZWQgZmlsZXN5c3RlbTogJXMiLAorCQkgICAgIHApOworCQkqZXJyb3IgPSBORlNFUlJfTk9FTlQ7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChuZXdfY2FjaGUpIHsKKwkJLyogVGhpcyB3aWxsIGJlIGEgc3RhdGljIHByaXZhdGUgbmZzX2V4cG9ydCB3aXRoIGp1c3Qgb25lCisJCSAqIGFkZHJlc3MuICBXZSBmZWVkIGl0IHRvIGtlcm5lbCB0aGVuIGV4dHJhY3QgdGhlIGZpbGVoYW5kbGUsCisJCSAqIAorCQkgKi8KKworCQlpZiAoY2FjaGVfZXhwb3J0KGV4cCwgcCkpIHsKKwkJCSplcnJvciA9IE5GU0VSUl9BQ0NFUzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWZoID0gY2FjaGVfZ2V0X2ZpbGVoYW5kbGUoZXhwLCB2Mz82NDozMiwgcCk7CisJCWlmIChmaCA9PSBOVUxMKSB7CisJCQkqZXJyb3IgPSBORlNFUlJfQUNDRVM7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWludCBkaWRfZXhwb3J0ID0gMDsKKwlyZXRyeToKKwkJaWYgKGV4cC0+bV9leHBvcnRlZDwxKSB7CisJCQlleHBvcnRfZXhwb3J0KGV4cCk7CisJCQlkaWRfZXhwb3J0ID0gMTsKKwkJfQorCQlpZiAoIWV4cC0+bV94dGFiZW50KQorCQkJeHRhYl9hcHBlbmQoZXhwKTsKKworCQlpZiAodjMpCisJCQlmaCA9IGdldGZoX3NpemUgKChzdHJ1Y3Qgc29ja2FkZHIgKikgc2luLCBwLCA2NCk7CisJCWlmICghdjMgfHwgKGZoID09IE5VTEwgJiYgZXJybm8gPT0gRUlOVkFMKSkgeworCQkJLyogV2UgZmlyc3QgdHJ5IHRoZSBuZXcgbmZzIHN5c2NhbGwuICovCisJCQlmaCA9IGdldGZoICgoc3RydWN0IHNvY2thZGRyICopIHNpbiwgcCk7CisJCQlpZiAoZmggPT0gTlVMTCAmJiBlcnJubyA9PSBFSU5WQUwpCisJCQkJLyogTGV0J3MgdHJ5IHRoZSBvbGQgb25lLiAqLworCQkJCWZoID0gZ2V0Zmhfb2xkICgoc3RydWN0IHNvY2thZGRyICopIHNpbiwKKwkJCQkJCXN0Yi5zdF9kZXYsIHN0Yi5zdF9pbm8pOworCQl9CisJCWlmIChmaCA9PSBOVUxMICYmICFkaWRfZXhwb3J0KSB7CisJCQlleHAtPm1fZXhwb3J0ZWQgPSAwOworCQkJZ290byByZXRyeTsKKwkJfQorCisJCWlmIChmaCA9PSBOVUxMKSB7CisJCQl4bG9nKExfV0FSTklORywgImdldGZoIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJKmVycm9yID0gTkZTRVJSX0FDQ0VTOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJKmVycm9yID0gTkZTX09LOworCW1vdW50bGlzdF9hZGQoaW5ldF9udG9hKHNpbi0+c2luX2FkZHIpLCBwKTsKKwlpZiAoZXhwcmV0KQorCQkqZXhwcmV0ID0gZXhwOworCXJldHVybiBmaDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2FsbF9jbGllbnRzKGV4cG9ydG5vZGUgKmUpCit7CisJc3RydWN0IGdyb3Vwbm9kZSAqZywgKm5nOworCisJZm9yIChnID0gZS0+ZXhfZ3JvdXBzOyBnOyBnID0gbmcpIHsKKwkJbmcgPSBnLT5ncl9uZXh0OworCQl4ZnJlZShnLT5ncl9uYW1lKTsKKwkJeGZyZWUoZyk7CisJfQorCWUtPmV4X2dyb3VwcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZXhwb3J0bGlzdChleHBvcnRzICplbGlzdCkKK3sKKwlzdHJ1Y3QgZXhwb3J0bm9kZSAqZSwgKm5lOworCisJZm9yIChlID0gKmVsaXN0OyBlICE9IE5VTEw7IGUgPSBuZSkgeworCQluZSA9IGUtPmV4X25leHQ7CisJCXJlbW92ZV9hbGxfY2xpZW50cyhlKTsKKwkJeGZyZWUoZS0+ZXhfZGlyKTsKKwkJeGZyZWUoZSk7CisJfQorCSplbGlzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBydW5lX2NsaWVudHMobmZzX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgZXhwb3J0bm9kZSAqZSkKK3sKKwlzdHJ1Y3QgaG9zdGVudCAJKmhwOworCXN0cnVjdCBncm91cG5vZGUgKmMsICoqY3A7CisKKwljcCA9ICZlLT5leF9ncm91cHM7CisJd2hpbGUgKChjID0gKmNwKSAhPSBOVUxMKSB7CisJCWlmIChjbGllbnRfZ2V0dHlwZShjLT5ncl9uYW1lKSA9PSBNQ0xfRlFETgorCQkJCSYmIChocCA9IGdldGhvc3RieW5hbWUoYy0+Z3JfbmFtZSkpKSB7CisJCQlocCA9IGhvc3RlbnRfZHVwKGhwKTsKKwkJCWlmIChjbGllbnRfY2hlY2soZXhwLT5tX2NsaWVudCwgaHApKSB7CisJCQkJKmNwID0gYy0+Z3JfbmV4dDsKKwkJCQl4ZnJlZShjLT5ncl9uYW1lKTsKKwkJCQl4ZnJlZShjKTsKKwkJCQl4ZnJlZSAoaHApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJeGZyZWUgKGhwKTsKKwkJfQorCQljcCA9ICYoYy0+Z3JfbmV4dCk7CisJfQorfQorCitzdGF0aWMgZXhwb3J0bm9kZSAqbG9va3VwX29yX2NyZWF0ZV9lbGlzdF9lbnRyeShleHBvcnRzICplbGlzdCwgbmZzX2V4cG9ydCAqZXhwKQoreworCWV4cG9ydG5vZGUgKmU7CisKKwlmb3IgKGUgPSAqZWxpc3Q7IGUgIT0gTlVMTDsgZSA9IGUtPmV4X25leHQpIHsKKwkJaWYgKCFzdHJjbXAoZXhwLT5tX2V4cG9ydC5lX3BhdGgsIGUtPmV4X2RpcikpCisJCQlyZXR1cm4gZTsKKwl9CisJZSA9IHhtYWxsb2Moc2l6ZW9mKCplKSk7CisJZS0+ZXhfbmV4dCA9ICplbGlzdDsKKwllLT5leF9ncm91cHMgPSBOVUxMOworCWUtPmV4X2RpciA9IHhzdHJkdXAoZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCSplbGlzdCA9IGU7CisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9ncm91cChzdHJ1Y3QgZXhwb3J0bm9kZSAqZSwgY2hhciAqbmV3bmFtZSkKK3sKKwlzdHJ1Y3QgZ3JvdXBub2RlICpnOworCisJZm9yIChnID0gZS0+ZXhfZ3JvdXBzOyBnOyBnID0gZy0+Z3JfbmV4dCkKKwkJaWYgKHN0cmNtcChnLT5ncl9uYW1lLCBuZXduYW1lKSkKKwkJCXJldHVybjsKKworCWcgPSB4bWFsbG9jKHNpemVvZigqZykpOworCWctPmdyX25hbWUgPSB4c3RyZHVwKG5ld25hbWUpOworCWctPmdyX25leHQgPSBlLT5leF9ncm91cHM7CisJZS0+ZXhfZ3JvdXBzID0gZzsKK30KKworc3RhdGljIGV4cG9ydHMKK2dldF9leHBvcnRsaXN0KHZvaWQpCit7CisJc3RhdGljIGV4cG9ydHMJCWVsaXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZXhwb3J0bm9kZQkqZTsKKwluZnNfZXhwb3J0CQkqZXhwOworCWludAkJCWk7CisJc3RhdGljIHVuc2lnbmVkIGludAllY291bnRlcjsKKwl1bnNpZ25lZCBpbnQJCWFjb3VudGVyOworCisJYWNvdW50ZXIgPSBhdXRoX3JlbG9hZCgpOworCWlmIChlbGlzdCAmJiBhY291bnRlciA9PSBlY291bnRlcikKKwkJcmV0dXJuIGVsaXN0OworCisJZWNvdW50ZXIgPSBhY291bnRlcjsKKworCWZyZWVfZXhwb3J0bGlzdCgmZWxpc3QpOworCisJZm9yIChpID0gMDsgaSA8IE1DTF9NQVhUWVBFUzsgaSsrKSB7CisJCWZvciAoZXhwID0gZXhwb3J0bGlzdFtpXS5wX2hlYWQ7IGV4cDsgZXhwID0gZXhwLT5tX25leHQpIHsKKwkJCSAvKiBEb24ndCBzaG93IHBzZXVkbyBleHBvcnRzICovCisJCQlpZiAoZXhwLT5tX2V4cG9ydC5lX2ZsYWdzICYgTkZTRVhQX1Y0Uk9PVCkKKwkJCQljb250aW51ZTsKKwkJCWUgPSBsb29rdXBfb3JfY3JlYXRlX2VsaXN0X2VudHJ5KCZlbGlzdCwgZXhwKTsKKworCQkJLyogZXhwb3J0cyB0byAiKiIgYWJzb3JiIGFueSBvdGhlcnMgKi8KKwkJCWlmIChpID09IE1DTF9BTk9OWU1PVVMgJiYgZS0+ZXhfZ3JvdXBzKSB7CisJCQkJcmVtb3ZlX2FsbF9jbGllbnRzKGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogbm9uLUZRRE4ncyBhYnNvcmIgRlFETidzIHRoZXkgY29udGFpbjogKi8KKwkJCWlmIChpICE9IE1DTF9GUUROICYmIGUtPmV4X2dyb3VwcykKKwkJCQlwcnVuZV9jbGllbnRzKGV4cCwgZSk7CisKKwkJCWlmIChleHAtPm1fZXhwb3J0LmVfaG9zdG5hbWVbMF0gIT0gJ1wwJykKKwkJCQlpbnNlcnRfZ3JvdXAoZSwgZXhwLT5tX2V4cG9ydC5lX2hvc3RuYW1lKTsKKwkJfQorCX0KKworCXJldHVybiBlbGlzdDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyCSpleHBvcnRfZmlsZSA9IF9QQVRIX0VYUE9SVFM7CisJY2hhciAgICAqc3RhdGVfZGlyID0gTkZTX1NUQVRFRElSOworCWludAlmb3JlZ3JvdW5kID0gMDsKKwlpbnQJcG9ydCA9IDA7CisJaW50CWRlc2NyaXB0b3JzID0gMDsKKwlpbnQJYzsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCXN0cnVjdCBybGltaXQgcmxpbTsKKworCS8qIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgYXJndW1lbnRzLiAqLworCW9wdGVyciA9IDA7CisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIm86bkZkOmY6cDpQOmhIOk46Vjp2cnM6dDpnIiwgbG9uZ29wdHMsIE5VTEwpKSAhPSBFT0YpCisJCXN3aXRjaCAoYykgeworCQljYXNlICdnJzoKKwkJCW1hbmFnZV9naWRzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCWRlc2NyaXB0b3JzID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGRlc2NyaXB0b3JzIDw9IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgZGVzY3JpcHRvcnM6ICVzXG4iLAorCQkJCQlhcmd2IFswXSwgb3B0YXJnKTsKKwkJCQl1c2FnZShhcmd2IFswXSwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnRic6CisJCQlmb3JlZ3JvdW5kID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXhsb2dfc2NvbmZpZyhvcHRhcmcsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZXhwb3J0X2ZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnSCc6IC8qIFBSQzogc3BlY2lmeSBhIGhpZ2gtYXZhaWxhYmlsaXR5IGNhbGxvdXQgcHJvZ3JhbSAqLworCQkJaGFfY2FsbG91dF9wcm9nID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQkJdXNhZ2UoYXJndiBbMF0sIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgkvKiBYWFggZm9yIG5mcy1zZXJ2ZXIgY29tcGF0aWJpbGl0eSAqLworCQljYXNlICdwJzoKKwkJCXBvcnQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAocG9ydCA8PSAwIHx8IHBvcnQgPiA2NTUzNSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBwb3J0IG51bWJlcjogJXNcbiIsCisJCQkJCWFyZ3YgWzBdLCBvcHRhcmcpOworCQkJCXVzYWdlKGFyZ3YgWzBdLCAxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdOJzoKKwkJCW5mc192ZXJzaW9uICY9IH4oMSA8PCAoYXRvaSAob3B0YXJnKSAtIDEpKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCV9ycGNmZHR5cGUgPSBTT0NLX0RHUkFNOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJcmV2ZXJzZV9yZXNvbHZlID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlmICgoc3RhdGVfZGlyID0geHN0cmR1cChvcHRhcmcpKSA9PSBOVUxMKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogeHN0cmR1cCglcykgZmFpbGVkIVxuIiwKKwkJCQkJYXJndlswXSwgb3B0YXJnKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJbnVtX3RocmVhZHMgPSBhdG9pIChvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1YnOgorCQkJbmZzX3ZlcnNpb24gfD0gMSA8PCAoYXRvaSAob3B0YXJnKSAtIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJcHJpbnRmKCJrbW91bnRkICVzXG4iLCBWRVJTSU9OKTsKKwkJCWV4aXQoMCk7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGFyZ3YgWzBdLCAxKTsKKwkJfQorCisJLyogTm8gbW9yZSBhcmd1bWVudHMgYWxsb3dlZC4gKi8KKwlpZiAob3B0aW5kICE9IGFyZ2MgfHwgIShuZnNfdmVyc2lvbiAmIDB4NykpCisJCXVzYWdlKGFyZ3YgWzBdLCAxKTsKKworCWlmIChjaGRpcihzdGF0ZV9kaXIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNoZGlyKCVzKSBmYWlsZWQ6ICVzXG4iLAorCQkJYXJndiBbMF0sIHN0YXRlX2Rpciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoZ2V0cmxpbWl0IChSTElNSVRfTk9GSUxFLCAmcmxpbSkgIT0gMCkKKwkJZnByaW50ZihzdGRlcnIsICIlczogZ2V0cmxpbWl0IChSTElNSVRfTk9GSUxFKSBmYWlsZWQ6ICVzXG4iLAorCQkJCWFyZ3YgWzBdLCBzdHJlcnJvcihlcnJubykpOworCWVsc2UgeworCQkvKiBnbGliYyBzdW5ycGMgY29kZSBkaWVzIGlmIGdldGR0YWJsZXNpemUgPiBGRF9TRVRTSVpFICovCisJCWlmICgoZGVzY3JpcHRvcnMgPT0gMCAmJiBybGltLnJsaW1fY3VyID4gRkRfU0VUU0laRSkgfHwKKwkJICAgIGRlc2NyaXB0b3JzID4gRkRfU0VUU0laRSkKKwkJCWRlc2NyaXB0b3JzID0gRkRfU0VUU0laRTsKKwkJaWYgKGRlc2NyaXB0b3JzKSB7CisJCQlybGltLnJsaW1fY3VyID0gZGVzY3JpcHRvcnM7CisJCQlpZiAoc2V0cmxpbWl0IChSTElNSVRfTk9GSUxFLCAmcmxpbSkgIT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSkgZmFpbGVkOiAlc1xuIiwKKwkJCQkJYXJndiBbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBJbml0aWFsaXplIGxvZ2dpbmcuICovCisJaWYgKCFmb3JlZ3JvdW5kKSB4bG9nX3N0ZGVycigwKTsKKwl4bG9nX29wZW4oIm1vdW50ZCIpOworCisJc2Euc2FfaGFuZGxlciA9IFNJR19JR047CisJc2Euc2FfZmxhZ3MgPSAwOworCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKwlzaWdhY3Rpb24oU0lHSFVQLCAmc2EsIE5VTEwpOworCXNpZ2FjdGlvbihTSUdJTlQsICZzYSwgTlVMTCk7CisJc2lnYWN0aW9uKFNJR1RFUk0sICZzYSwgTlVMTCk7CisJc2lnYWN0aW9uKFNJR1BJUEUsICZzYSwgTlVMTCk7CisJLyogV0FSTklORzogdGhlIGZvbGxvd2luZyB3b3JrcyBvbiBMaW51eCBhbmQgU3lzViwgYnV0IG5vdCBCU0QhICovCisJc2lnYWN0aW9uKFNJR0NITEQsICZzYSwgTlVMTCk7CisKKwkvKiBEYWVtb25zIHNob3VsZCBjbG9zZSBhbGwgZXh0cmEgZmlsZWhhbmRsZXMgLi4uICpiZWZvcmUqIFJQQyBpbml0LiAqLworCWlmICghZm9yZWdyb3VuZCkKKwkJY2xvc2VhbGwoMyk7CisKKwluZXdfY2FjaGUgPSBjaGVja19uZXdfY2FjaGUoKTsKKwlpZiAobmV3X2NhY2hlKQorCQljYWNoZV9vcGVuKCk7CisKKwlpZiAobmZzX3ZlcnNpb24gJiAweDEpCisJCXJwY19pbml0KCJtb3VudGQiLCBNT1VOVFBST0csIE1PVU5UVkVSUywKKwkJCSBtb3VudF9kaXNwYXRjaCwgcG9ydCk7CisJaWYgKG5mc192ZXJzaW9uICYgKDB4MSA8PCAxKSkKKwkJcnBjX2luaXQoIm1vdW50ZCIsIE1PVU5UUFJPRywgTU9VTlRWRVJTX1BPU0lYLAorCQkJIG1vdW50X2Rpc3BhdGNoLCBwb3J0KTsKKwlpZiAobmZzX3ZlcnNpb24gJiAoMHgxIDw8IDIpKQorCQlycGNfaW5pdCgibW91bnRkIiwgTU9VTlRQUk9HLCBNT1VOVFZFUlNfTkZTVjMsCisJCQkgbW91bnRfZGlzcGF0Y2gsIHBvcnQpOworCisJc2Euc2FfaGFuZGxlciA9IGtpbGxlcjsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmc2EsIE5VTEwpOworCXNpZ2FjdGlvbihTSUdURVJNLCAmc2EsIE5VTEwpOworCXNhLnNhX2hhbmRsZXIgPSBzaWdfaHVwOworCXNpZ2FjdGlvbihTSUdIVVAsICZzYSwgTlVMTCk7CisKKwlhdXRoX2luaXQoZXhwb3J0X2ZpbGUpOworCisJaWYgKCFmb3JlZ3JvdW5kKSB7CisJCS8qIFdlIGZpcnN0IGZvcmsgb2ZmIGEgY2hpbGQuICovCisJCWlmICgoYyA9IGZvcmsoKSkgPiAwKQorCQkJZXhpdCgwKTsKKwkJaWYgKGMgPCAwKSB7CisJCQl4bG9nKExfRkFUQUwsICJtb3VudGQ6IGNhbm5vdCBmb3JrOiAlc1xuIiwKKwkJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJLyogTm93IHdlIHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgZm9yZWdyb3VuZC4KKwkJICAgUmVkaXJlY3Qgc3RkaW4vc3Rkb3V0L3N0ZGVyciBmaXJzdC4gKi8KKwkJeworCQkJaW50IGZkID0gb3BlbigiL2Rldi9udWxsIiwgT19SRFdSKTsKKwkJCSh2b2lkKSBkdXAyKGZkLCAwKTsKKwkJCSh2b2lkKSBkdXAyKGZkLCAxKTsKKwkJCSh2b2lkKSBkdXAyKGZkLCAyKTsKKwkJCWlmIChmZCA+IDIpICh2b2lkKSBjbG9zZShmZCk7CisJCX0KKwkJc2V0c2lkKCk7CisJfQorCisJLyogc2lsZW50bHkgYm91bmRzIGNoZWNrIG51bV90aHJlYWRzICovCisJaWYgKGZvcmVncm91bmQpCisJCW51bV90aHJlYWRzID0gMTsKKwllbHNlIGlmIChudW1fdGhyZWFkcyA8IDEpCisJCW51bV90aHJlYWRzID0gMTsKKwllbHNlIGlmIChudW1fdGhyZWFkcyA+IE1BWF9USFJFQURTKQorCQludW1fdGhyZWFkcyA9IE1BWF9USFJFQURTOworCisJaWYgKG51bV90aHJlYWRzID4gMSkKKwkJZm9ya193b3JrZXJzKCk7CisKKwlteV9zdmNfcnVuKCk7CisKKwl4bG9nKExfRVJST1IsICJBY2shIEdhY2shIHN2Y19ydW4gcmV0dXJuZWQhXG4iKTsKKwlleGl0KDEpOworfQorCitzdGF0aWMgdm9pZAordXNhZ2UoY29uc3QgY2hhciAqcHJvZywgaW50IG4pCit7CisJZnByaW50ZihzdGRlcnIsCisiVXNhZ2U6ICVzIFstRnwtLWZvcmVncm91bmRdIFstaHwtLWhlbHBdIFstdnwtLXZlcnNpb25dIFstZCBraW5kfC0tZGVidWcga2luZF1cbiIKKyIJWy1vIG51bXwtLWRlc2NyaXB0b3JzIG51bV0gWy1mIGV4cG9ydHMtZmlsZXwtLWV4cG9ydHMtZmlsZT1maWxlXVxuIgorIglbLXB8LS1wb3J0IHBvcnRdIFstViB2ZXJzaW9ufC0tbmZzLXZlcnNpb24gdmVyc2lvbl1cbiIKKyIJWy1OIHZlcnNpb258LS1uby1uZnMtdmVyc2lvbiB2ZXJzaW9uXSBbLW58LS1uby10Y3BdXG4iCisiCVstSCBoYS1jYWxsb3V0LXByb2ddIFstc3wtLXN0YXRlLWRpcmVjdG9yeS1wYXRoIHBhdGhdXG4iCisiCVstZ3wtLW1hbmFnZS1naWRzXSBbLXQgbnVtfC0tbnVtLXRocmVhZHM9bnVtXVxuIiwgcHJvZyk7CisJZXhpdChuKTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvbW91bnRkLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL21vdW50ZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmFjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL21vdW50ZC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiB1dGlscy9tb3VudGQvbW91bnRkLmgKKyAqCisgKiBEZWNsYXJhdGlvbnMgZm9yIG1vdW50ZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZm5kZWYgTU9VTlREX0gKKyNkZWZpbmUgTU9VTlREX0gKKworI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvc3ZjLmg+CisjaW5jbHVkZSAibmZzbGliLmgiCisjaW5jbHVkZSAiZXhwb3J0ZnMuaCIKKyNpbmNsdWRlICJtb3VudC5oIgorCit1bmlvbiBtb3VudGRfYXJndW1lbnRzIHsKKwlkaXJwYXRoCQkJZGlycGF0aDsKK307CisKK3VuaW9uIG1vdW50ZF9yZXN1bHRzIHsKKwlmaHN0YXR1cwkJZnN0YXR1czsKKwltb3VudGxpc3QJCW1vdW50bGlzdDsKKwlleHBvcnRzCQkJZXhwb3J0czsKK307CisKKy8qCisgKiBHbG9iYWwgRnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworYm9vbF90CQltb3VudF9udWxsXzFfc3ZjKHN0cnVjdCBzdmNfcmVxICosIHZvaWQgKiwgdm9pZCAqKTsKK2Jvb2xfdAkJbW91bnRfbW50XzFfc3ZjKHN0cnVjdCBzdmNfcmVxICosIGRpcnBhdGggKiwgZmhzdGF0dXMgKik7Citib29sX3QJCW1vdW50X2R1bXBfMV9zdmMoc3RydWN0IHN2Y19yZXEgKiwgdm9pZCAqLCBtb3VudGxpc3QgKik7Citib29sX3QJCW1vdW50X3VtbnRfMV9zdmMoc3RydWN0IHN2Y19yZXEgKiwgZGlycGF0aCAqLCB2b2lkICopOworYm9vbF90CQltb3VudF91bW50YWxsXzFfc3ZjKHN0cnVjdCBzdmNfcmVxICosIHZvaWQgKiwgdm9pZCAqKTsKK2Jvb2xfdAkJbW91bnRfZXhwb3J0XzFfc3ZjKHN0cnVjdCBzdmNfcmVxICosIHZvaWQgKiwgZXhwb3J0cyAqKTsKK2Jvb2xfdAkJbW91bnRfZXhwb3J0YWxsXzFfc3ZjKHN0cnVjdCBzdmNfcmVxICosIHZvaWQgKiwgZXhwb3J0cyAqKTsKK2Jvb2xfdAkJbW91bnRfcGF0aGNvbmZfMl9zdmMoc3RydWN0IHN2Y19yZXEgKiwgZGlycGF0aCAqLCBwcGF0aGNuZiAqKTsKK2Jvb2xfdAkJbW91bnRfbW50XzNfc3ZjKHN0cnVjdCBzdmNfcmVxICosIGRpcnBhdGggKiwgbW91bnRyZXMzICopOworCit2b2lkCQltb3VudF9kaXNwYXRjaChzdHJ1Y3Qgc3ZjX3JlcSAqLCBTVkNYUFJUICopOwordm9pZAkJYXV0aF9pbml0KGNoYXIgKmV4cG9ydF9maWxlKTsKK3Vuc2lnbmVkIGludAlhdXRoX3JlbG9hZCh2b2lkKTsKK25mc19leHBvcnQgKglhdXRoX2F1dGhlbnRpY2F0ZShjaGFyICp3aGF0LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwKKwkJCQkJY2hhciAqcGF0aCk7Cit2b2lkCQlhdXRoX2V4cG9ydChuZnNfZXhwb3J0ICpleHApOworCit2b2lkCQltb3VudGxpc3RfYWRkKGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnBhdGgpOwordm9pZAkJbW91bnRsaXN0X2RlbChjaGFyICpob3N0LCBjb25zdCBjaGFyICpwYXRoKTsKK3ZvaWQJCW1vdW50bGlzdF9kZWxfYWxsKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKTsKK21vdW50bGlzdAltb3VudGxpc3RfbGlzdCh2b2lkKTsKKworCisjZW5kaWYgLyogTU9VTlREX0ggKi8KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvbW91bnRkLm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvbW91bnRkLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmEwNmUwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9tb3VudGQubWFuCkBAIC0wLDAgKzEsMjAyIEBACisuXCIKKy5cIiBtb3VudGQoOCkKKy5cIgorLlwiIENvcHlyaWdodCAoQykgMTk5OSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKy5cIiBNb2RpZmllZCBieSBQYXVsIENsZW1lbnRzLCAyMDA0LgorLlRIIHJwYy5tb3VudGQgOCAiMzEgQXVnIDIwMDQiCisuU0ggTkFNRQorcnBjLm1vdW50ZCBcLSBORlMgbW91bnQgZGFlbW9uCisuU0ggU1lOT1BTSVMKKy5CSSAiL3Vzci9zYmluL3JwYy5tb3VudGQgWyIgb3B0aW9ucyAiXSIKKy5TSCBERVNDUklQVElPTgorVGhlCisuQiBycGMubW91bnRkCitwcm9ncmFtIGltcGxlbWVudHMgdGhlIE5GUyBtb3VudCBwcm90b2NvbC4gV2hlbiByZWNlaXZpbmcgYSBNT1VOVAorcmVxdWVzdCBmcm9tIGFuIE5GUyBjbGllbnQsIGl0IGNoZWNrcyB0aGUgcmVxdWVzdCBhZ2FpbnN0IHRoZSBsaXN0IG9mCitjdXJyZW50bHkgZXhwb3J0ZWQgZmlsZSBzeXN0ZW1zLiBJZiB0aGUgY2xpZW50IGlzIHBlcm1pdHRlZCB0byBtb3VudAordGhlIGZpbGUgc3lzdGVtLAorLkIgcnBjLm1vdW50ZAorb2J0YWlucyBhIGZpbGUgaGFuZGxlIGZvciByZXF1ZXN0ZWQgZGlyZWN0b3J5IGFuZCByZXR1cm5zIGl0IHRvCit0aGUgY2xpZW50LgorLlNTIEV4cG9ydGluZyBORlMgRmlsZSBTeXN0ZW1zCitNYWtpbmcgZmlsZSBzeXN0ZW1zIGF2YWlsYWJsZSB0byBORlMgY2xpZW50cyBpcyBjYWxsZWQKKy5JUiBleHBvcnRpbmcgLgorLlAKK1VzdWFsbHksIGEgZmlsZSBzeXN0ZW0gYW5kIHRoZSBob3N0cyBpdCBzaG91bGQgYmUgbWFkZSBhdmFpbGFibGUgdG8KK2FyZSBsaXN0ZWQgaW4gdGhlCisuQiAvZXRjL2V4cG9ydHMKK2ZpbGUsIGFuZCBpbnZva2luZworLkIgZXhwb3J0ZnMgLWEKK3doZW5ldmVyIHRoZSBzeXN0ZW0gaXMgYm9vdGVkLiBUaGUKKy5CUiBleHBvcnRmcyAoOCkKK2NvbW1hbmQgbWFrZXMgZXhwb3J0IGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBib3RoIHRoZSBrZXJuZWwgTkZTCitzZXJ2ZXIgbW9kdWxlIGFuZCB0aGUKKy5CIHJwYy5tb3VudGQKK2RhZW1vbi4KKy5QCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGV4cG9ydCBpbmRpdmlkdWFsIGRpcmVjdG9yaWVzIHRlbXBvcmFyaWx5IAordXNpbmcKKy5CUiBleHBvcnRmcyAncworLklCIGhvc3QgOiAvZGlyZWN0b3J5CitzeW50YXguCisuU1MgVGhlIHJtdGFiIEZpbGUKK0ZvciBldmVyeSBtb3VudCByZXF1ZXN0IHJlY2VpdmVkIGZyb20gYW4gTkZTIGNsaWVudCwKKy5CIHJwYy5tb3VudGQKK2FkZHMgYW4gZW50cnkgdG8gdGhlCisuQiAvdmFyL2xpYi9uZnMvcm10YWIKK2ZpbGUuIFdoZW4gcmVjZWl2aW5nIGFuIHVubW91bnQgcmVxdWVzdCwgdGhhdCBlbnRyeSBpcyByZW1vdmVkLgorLlAKK0hvd2V2ZXIsIHRoaXMgZmlsZSBpcyBtb3N0bHkgb3JuYW1lbnRhbC4gT25lLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZQordG8gdXNlIHRoZSBmaWxlIGhhbmRsZSBldmVuIGFmdGVyIGNhbGxpbmcKKy5CIHJwYy5tb3VudGQgJ3MKK1VNT1VOVCBwcm9jZWR1cmUuIEFuZCB0d28sIGlmIGEgY2xpZW50IHJlYm9vdHMgd2l0aG91dCBub3RpZnlpbmcKKy5CIHJwYy5tb3VudGQgLAorYSBzdGFsZSBlbnRyeSB3aWxsIHJlbWFpbiBpbgorLkJSIHJtdGFiIC4KKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtZCBraW5kICIgb3IgIiBcLVwtZGVidWcga2luZAorVHVybiBvbiBkZWJ1Z2dpbmcuIFZhbGlkIGtpbmRzIGFyZTogYWxsLCBhdXRoLCBjYWxsLCBnZW5lcmFsIGFuZCBwYXJzZS4KKy5UUAorLkIgXC1GICIgb3IgIiBcLVwtZm9yZWdyb3VuZAorUnVuIGluIGZvcmVncm91bmQgKGRvIG5vdCBkYWVtb25pemUpCisuVFAKKy5CIFwtZiAiIG9yICIgXC1cLWV4cG9ydHMtZmlsZQorVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSBleHBvcnRzIGZpbGUsIGxpc3RpbmcgdGhlIGNsaWVudHMgdGhhdCB0aGlzCitzZXJ2ZXIgaXMgcHJlcGFyZWQgdG8gc2VydmUgYW5kIHBhcmFtZXRlcnMgdG8gYXBwbHkgdG8gZWFjaAorc3VjaCBtb3VudCAoc2VlCisuQlIgZXhwb3J0cyAoNSkpLgorQnkgZGVmYXVsdCwgZXhwb3J0IGluZm9ybWF0aW9uIGlzIHJlYWQgZnJvbQorLklSIC9ldGMvZXhwb3J0cyAuCisuVFAKKy5CIFwtaCAiIG9yICIgXC1cLWhlbHAKK0Rpc3BsYXkgdXNhZ2UgbWVzc2FnZS4KKy5UUAorLkIgXC1vIG51bSAiIG9yICIgXC1cLWRlc2NyaXB0b3JzIG51bQorU2V0IHRoZSBsaW1pdCBvZiB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyB0byBudW0uIFRoZQorZGVmYXVsdCBpcyB0byBsZWF2ZSB0aGUgbGltaXQgdW5jaGFuZ2VkLgorLlRQCisuQiBcLU4gIiBvciAiIFwtXC1uby1uZnMtdmVyc2lvbgorVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCB0aGF0CisuQiBycGMubW91bnRkCitkbyBub3Qgb2ZmZXIgY2VydGFpbiB2ZXJzaW9ucyBvZiBORlMuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YKKy5CIHJwYy5tb3VudGQKK2NhbiBzdXBwb3J0IGJvdGggTkZTIHZlcnNpb24gMiBhbmQgdGhlIG5ld2VyIHZlcnNpb24gMy4gSWYgdGhlCitORlMga2VybmVsIG1vZHVsZSB3YXMgY29tcGlsZWQgd2l0aG91dCBzdXBwb3J0IGZvciBORlN2MywKKy5CIHJwYy5tb3VudGQKK211c3QgYmUgaW52b2tlZCB3aXRoIHRoZSBvcHRpb24KKy5CICJcLVwtbm8tbmZzLXZlcnNpb24gMyIgLgorLlRQCisuQiBcLW4gIiBvciAiIFwtXC1uby10Y3AKK0Rvbid0IGFkdmVydGlzZSBUQ1AgZm9yIG1vdW50LgorLlRQCisuQiBcLVAKK0lnbm9yZWQgKGNvbXBhdGliaWxpdHkgd2l0aCB1bmZzZD8/KS4KKy5UUAorLkIgXC1wICIgb3IgIiBcLVwtcG9ydCBudW0KK0ZvcmNlCisuQiBycGMubW91bnRkCit0byBiaW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBudW0sIGluc3RlYWQgb2YgdXNpbmcgdGhlIHJhbmRvbSBwb3J0CitudW1iZXIgYXNzaWduZWQgYnkgdGhlIHBvcnRtYXBwZXIuCisuVFAKKy5CIFwtSCAiIG9yICIgXC1cLWhhLWNhbGxvdXQgcHJvZworU3BlY2lmeSBhIGhpZ2ggYXZhaWxhYmlsaXR5IGNhbGxvdXQgcHJvZ3JhbSwgd2hpY2ggd2lsbCByZWNlaXZlIGNhbGxvdXRzCitmb3IgYWxsIGNsaWVudCBtb3VudCBhbmQgdW5tb3VudCByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgCisuQiBycGMubW91bnRkCit0byBiZSB1c2VkIGluIGEgSGlnaCBBdmFpbGFiaWxpdHkgTkZTIChIQS1ORlMpIGVudmlyb25tZW50LiBUaGlzIGNhbGxvdXQgaXMgbm90CituZWVkZWQgKGFuZCBzaG91bGQgbm90IGJlIHVzZWQpIHdpdGggMi42IGFuZCBsYXRlciBrZXJuZWxzIChpbnN0ZWFkLAorbW91bnQgdGhlIG5mc2QgZmlsZXN5c3RlbSBvbgorLkIgL3Byb2MvZnMvbmZzZAorKS4KK1RoZSBwcm9ncmFtIHdpbGwgYmUgY2FsbGVkIHdpdGggNCBhcmd1bWVudHMuCitUaGUgZmlyc3Qgd2lsbCBiZQorLkIgbW91bnQKK29yCisuQiB1bm1vdW50CitkZXBlbmRpbmcgb24gdGhlIHJlYXNvbiBmb3IgdGhlIGNhbGxvdXQuCitUaGUgc2Vjb25kIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlIGNsaWVudCBwZXJmb3JtaW5nIHRoZSBtb3VudC4KK1RoZSB0aGlyZCB3aWxsIGJlIHRoZSBwYXRoIHRoYXQgdGhlIGNsaWVudCBpcyBtb3VudGluZy4KK1RoZSBsYXN0IGlzIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBtb3VudHMgdGhhdCB3ZSBiZWxpZXZlIHRoZSBjbGllbnQKK2hhcyBvZiB0aGF0IHBhdGguCisuVFAKKy5CSSAiXC1zLCIgIiIgIiBcLVwtc3RhdGVcLWRpcmVjdG9yeVwtcGF0aCAiICBkaXJlY3RvcnkKK3NwZWNpZnkgYSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gcGxhY2Ugc3RhdGQgc3RhdGUgaW5mb3JtYXRpb24uCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkIHRoZSBkZWZhdWx0IG9mCisuQlIgL3Zhci9saWIvbmZzCitpcyB1c2VkLgorLlRQCisuQkkgIlwtciwiICIiICIgXC1cLXJldmVyc2VcLWxvb2t1cCIKK21vdW50ZCB0cmFja3MgSVAgYWRkcmVzc2VzIGluIHRoZSBybXRhYiwgYW5kIHdoZW4gYSBEVU1QIHJlcXVlc3QgaXMgbWFkZSAoYnkKK3NvbWVvbmUgcnVubmluZyBzaG93bW91bnQgLWEsIGZvciBpbnN0YW5jZSksIGl0IHJldHVybnMgSVAgYWRkcmVzc2VzIGluc3RlYWQKK29mIGhvc3RuYW1lcyBieSBkZWZhdWx0LiBUaGlzIG9wdGlvbiBjYXVzZXMgbW91bnRkIHRvIGRvIGEgcmV2ZXJzZQorbG9va3VwIG9uIGVhY2ggSVAgYWRkcmVzcyBhbmQgcmV0dXJuIHRoYXQgaG9zdG5hbWUgaW5zdGVhZC4gRW5hYmxpbmcgdGhpcyBjYW4KK2hhdmUgYSBzdWJzdGFudGlhbCBuZWdhdGl2ZSBlZmZlY3Qgb24gcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgorLlRQCisuQlIgIlwtdCBOIiAiIG9yICIgIlwtXC1udW1cLXRocmVhZHM9TiIKK1RoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIHRoYXQgcnBjLm1vdW50ZAorc3Bhd25zLiAgVGhlIGRlZmF1bHQgaXMgMSB0aHJlYWQsIHdoaWNoIGlzIHByb2JhYmx5IGVub3VnaC4gIE1vcmUKK3RocmVhZHMgYXJlIHVzdWFsbHkgb25seSBuZWVkZWQgZm9yIE5GUyBzZXJ2ZXJzIHdoaWNoIG5lZWQgdG8gaGFuZGxlCittb3VudCBzdG9ybXMgb2YgaHVuZHJlZHMgb2YgTkZTIG1vdW50cyBpbiBhIGZldyBzZWNvbmRzLCBvciB3aGVuCit5b3VyIEROUyBzZXJ2ZXIgaXMgc2xvdyBvciB1bnJlbGlhYmxlLgorLlRQCisuQiBcLVYgIiBvciAiIFwtXC1uZnMtdmVyc2lvbgorVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCB0aGF0CisuQiBycGMubW91bnRkCitvZmZlciBjZXJ0YWluIHZlcnNpb25zIG9mIE5GUy4gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZgorLkIgcnBjLm1vdW50ZAorY2FuIHN1cHBvcnQgYm90aCBORlMgdmVyc2lvbiAyIGFuZCB0aGUgbmV3ZXIgdmVyc2lvbiAzLgorLlRQCisuQiBcLXYgIiBvciAiIFwtXC12ZXJzaW9uCitQcmludCB0aGUgdmVyc2lvbiBvZgorLkIgcnBjLm1vdW50ZAorYW5kIGV4aXQuCisuVFAKKy5CIFwtZyAiIG9yICIgXC1cLW1hbmFnZS1naWRzCitBY2NlcHQgcmVxdWVzdHMgZnJvbSB0aGUga2VybmVsIHRvIG1hcCB1c2VyIGlkIG51bWJlcnMgaW50byAgbGlzdHMgb2YKK2dyb3VwIGlkIG51bWJlcnMgZm9yIHVzZSBpbiBhY2Nlc3MgY29udHJvbC4gIEFuIE5GUyByZXF1ZXN0IHdpbGwKK25vcm1hbGx5IChleGNlcHQgd2hlbiB1c2luZyBLZXJiZXJvcyBvciBvdGhlciBjcnlwdG9ncmFwaGljCithdXRoZW50aWNhdGlvbikgY29udGFpbnMgYSB1c2VyLWlkIGFuZCBhIGxpc3Qgb2YgZ3JvdXAtaWRzLiAgRHVlIHRvIGEKK2xpbWl0YXRpb24gaW4gdGhlIE5GUyBwcm90b2NvbCwgYXQgbW9zdCAxNiBncm91cHMgaWRzIGNhbiBiZSBsaXN0ZWQuCitJZiB5b3UgdXNlIHRoZQorLkIgXC1nCitmbGFnLCB0aGVuIHRoZSBsaXN0IG9mIGdyb3VwIGlkcyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgd2lsbCBiZQorcmVwbGFjZWQgYnkgYSBsaXN0IG9mIGdyb3VwIGlkcyBkZXRlcm1pbmVkIGJ5IGFuIGFwcHJvcHJpYXRlIGxvb2t1cCBvbgordGhlIHNlcnZlci4gTm90ZSB0aGF0IHRoZSAncHJpbWFyeScgZ3JvdXAgaWQgaXMgbm90IGFmZmVjdGVkIHNvIGEKKy5JIG5ld2dyb3VwCitjb21tYW5kIG9uIHRoZSBjbGllbnQgd2lsbCBzdGlsbCBiZSBlZmZlY3RpdmUuICBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzCithIExpbnV4IEtlcm5lbCB3aXRoIHZlcnNpb24gYXQgbGVhc3QgMi42LjIxLgorCisuU0ggVENQX1dSQVBQRVJTIFNVUFBPUlQKK1RoaXMKKy5CIHJwYy5tb3VudGQKK3ZlcnNpb24gaXMgcHJvdGVjdGVkIGJ5IHRoZQorLkIgdGNwX3dyYXBwZXIKK2xpYnJhcnkuIFlvdSBoYXZlIHRvIGdpdmUgdGhlIGNsaWVudHMgYWNjZXNzIHRvCisuQiBycGMubW91bnRkCitpZiB0aGV5IHNob3VsZCBiZSBhbGxvd2VkIHRvIHVzZSBpdC4gVG8gYWxsb3cgY29ubmVjdHMgZnJvbSBjbGllbnRzIG9mCit0aGUgLmJhci5jb20gZG9tYWluIHlvdSBjb3VsZCB1c2UgdGhlIGZvbGxvd2luZyBsaW5lIGluIC9ldGMvaG9zdHMuYWxsb3c6CisKK21vdW50ZDogLmJhci5jb20KKworWW91IGhhdmUgdG8gdXNlIHRoZSBkYWVtb24gbmFtZSAKKy5CIG1vdW50ZAorZm9yIHRoZSBkYWVtb24gbmFtZSAoZXZlbiBpZiB0aGUgYmluYXJ5IGhhcyBhIGRpZmZlcmVudCBuYW1lKS4KKy5CIE5vdGU6Citob3N0bmFtZXMgdXNlZCBpbiBlaXRoZXIgYWNjZXNzIGZpbGUgd2lsbCBiZSBpZ25vcmVkIHdoZW4KK3RoZXkgY2FuIG5vdCBiZSByZXNvbHZlZCBpbnRvIElQIGFkZHJlc3Nlcy4KKworRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZQorLkJSIHRjcGQgKDgpCithbmQKKy5CUiBob3N0c19hY2Nlc3MgKDUpCittYW51YWwgcGFnZXMuCisuU0ggU0VFIEFMU08KKy5CUiBycGMubmZzZCAoOCksCisuQlIgZXhwb3J0ZnMgKDgpLAorLkJSIGV4cG9ydHMgKDUpLAorLkJSIHJwYy5ycXVvdGFkICg4KS4KKy5TSCBGSUxFUworLkJSIC9ldGMvZXhwb3J0cyAsCisuQlIgL3Zhci9saWIvbmZzL3h0YWIgLgorLlNIIEFVVEhPUgorT2xhZiBLaXJjaCwgSC4gSi4gTHUsIEcuIEFsbGFuIE1vcnJpcyBJSUksIGFuZCBhIGhvc3Qgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9ybXRhYi5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9ybXRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjIyZWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL3JtdGFiLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiB1dGlscy9tb3VudGQvcm10YWIuYworICoKKyAqIE1hbmFnZSB0aGUgcm10YWIgZmlsZSBmb3IgbW91bnRkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiZXhwb3J0ZnMuaCIKKyNpbmNsdWRlICJ4aW8uaCIKKyNpbmNsdWRlICJtb3VudGQuaCIKKyNpbmNsdWRlICJoYS1jYWxsb3V0LmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4gLyogUEFUSF9NQVggKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorCitleHRlcm4gaW50IHJldmVyc2VfcmVzb2x2ZTsKKworLyogSWYgbmV3IHBhdGggaXMgYSBsaW5rIGRvIG5vdCBkZXN0cm95IGl0IGJ1dCBwbGFjZSB0aGUKKyAqIGZpbGUgd2hlcmUgdGhlIGxpbmsgcG9pbnRzLgorICovCisKK3N0YXRpYyBpbnQgCitzbGlua19zYWZlX3JlbmFtZShjb25zdCBjaGFyICogb2xkcGF0aCwgY29uc3QgY2hhciAqIG5ld3BhdGgpCit7CisJaW50IHI7CisJc3RydWN0IHN0YXQgczsKKwljaGFyIHNsaW5rX3BhdGhbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKnJlYWxfbmV3cGF0aCA9IG5ld3BhdGg7CisKKwlpZiAoKGxzdGF0KG5ld3BhdGgsICZzKSA9PSAwKSAmJiBTX0lTTE5LKHMuc3RfbW9kZSkpIHsKKwkJLyogTmV3IHBhdGggaXMgYSBzeW1ib2xpYyBsaW5rLCBkbyBub3QgZGVzdHJveSBidXQgZm9sbG93ICovCisJCWlmICgociA9IHJlYWRsaW5rKG5ld3BhdGgsIHNsaW5rX3BhdGgsIFBBVEhfTUFYIC0gMSkpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlzbGlua19wYXRoW3JdID0gJ1wwJzsKKwkJcmVhbF9uZXdwYXRoID0gc2xpbmtfcGF0aDsKKwl9CisKKwlyZXR1cm4gcmVuYW1lKG9sZHBhdGgsIHJlYWxfbmV3cGF0aCk7Cit9CisKK3ZvaWQKK21vdW50bGlzdF9hZGQoY2hhciAqaG9zdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgcm10YWJlbnQJeGU7CisJc3RydWN0IHJtdGFiZW50CSpyZXA7CisJaW50CQlsb2NraWQ7CisJbG9uZwkJcG9zOworCisJaWYgKChsb2NraWQgPSB4ZmxvY2soX1BBVEhfUk1UQUJMQ0ssICJhIikpIDwgMCkKKwkJcmV0dXJuOworCXNldHJtdGFiZW50KCJyKyIpOworCXdoaWxlICgocmVwID0gZ2V0cm10YWJlbnQoMSwgJnBvcykpICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcCAocmVwLT5yX2NsaWVudCwKKwkJCSAgICBob3N0KSA9PSAwCisJCSAgICAmJiBzdHJjbXAocmVwLT5yX3BhdGgsIHBhdGgpID09IDApIHsKKwkJCXJlcC0+cl9jb3VudCsrOworCQkJLyogUFJDOiBkbyB0aGUgSEEgY2FsbG91dDogKi8KKwkJCWhhX2NhbGxvdXQoIm1vdW50IiwgcmVwLT5yX2NsaWVudCwgcmVwLT5yX3BhdGgsIHJlcC0+cl9jb3VudCk7CisJCQlwdXRybXRhYmVudChyZXAsICZwb3MpOworCQkJZW5kcm10YWJlbnQoKTsKKwkJCXhmdW5sb2NrKGxvY2tpZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZW5kcm10YWJlbnQoKTsKKwlzdHJuY3B5KHhlLnJfY2xpZW50LCBob3N0LAorCQlzaXplb2YgKHhlLnJfY2xpZW50KSAtIDEpOworCXhlLnJfY2xpZW50IFtzaXplb2YgKHhlLnJfY2xpZW50KSAtIDFdID0gJ1wwJzsKKwlzdHJuY3B5KHhlLnJfcGF0aCwgcGF0aCwgc2l6ZW9mICh4ZS5yX3BhdGgpIC0gMSk7CisJeGUucl9wYXRoIFtzaXplb2YgKHhlLnJfcGF0aCkgLSAxXSA9ICdcMCc7CisJeGUucl9jb3VudCA9IDE7CisJaWYgKHNldHJtdGFiZW50KCJhIikpIHsKKwkJLyogUFJDOiBkbyB0aGUgSEEgY2FsbG91dDogKi8KKwkJaGFfY2FsbG91dCgibW91bnQiLCB4ZS5yX2NsaWVudCwgeGUucl9wYXRoLCB4ZS5yX2NvdW50KTsKKwkJcHV0cm10YWJlbnQoJnhlLCBOVUxMKTsKKwkJZW5kcm10YWJlbnQoKTsKKwl9CisJeGZ1bmxvY2sobG9ja2lkKTsKK30KKwordm9pZAorbW91bnRsaXN0X2RlbChjaGFyICpobmFtZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgcm10YWJlbnQJKnJlcDsKKwlGSUxFCQkqZnA7CisJaW50CQlsb2NraWQ7CisJaW50CQltYXRjaDsKKworCWlmICgobG9ja2lkID0geGZsb2NrKF9QQVRIX1JNVEFCTENLLCAidyIpKSA8IDApCisJCXJldHVybjsKKwlpZiAoIXNldHJtdGFiZW50KCJyIikpIHsKKwkJeGZ1bmxvY2sobG9ja2lkKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIShmcCA9IGZzZXRybXRhYmVudChfUEFUSF9STVRBQlRNUCwgInciKSkpIHsKKwkJZW5kcm10YWJlbnQoKTsKKwkJeGZ1bmxvY2sobG9ja2lkKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoKHJlcCA9IGdldHJtdGFiZW50KDEsIE5VTEwpKSAhPSBOVUxMKSB7CisJCW1hdGNoID0gIXN0cmNtcCAocmVwLT5yX2NsaWVudCwgaG5hbWUpCisJCQkmJiAhc3RyY21wKHJlcC0+cl9wYXRoLCBwYXRoKTsKKwkJaWYgKG1hdGNoKSB7CisJCQlyZXAtPnJfY291bnQtLTsKKwkJCS8qIFBSQzogZG8gdGhlIEhBIGNhbGxvdXQ6ICovCisJCQloYV9jYWxsb3V0KCJ1bm1vdW50IiwgcmVwLT5yX2NsaWVudCwgcmVwLT5yX3BhdGgsIHJlcC0+cl9jb3VudCk7CisJCX0KKwkJaWYgKCFtYXRjaCB8fCByZXAtPnJfY291bnQpCisJCQlmcHV0cm10YWJlbnQoZnAsIHJlcCwgTlVMTCk7CisJfQorCWlmIChzbGlua19zYWZlX3JlbmFtZShfUEFUSF9STVRBQlRNUCwgX1BBVEhfUk1UQUIpIDwgMCkgeworCQl4bG9nKExfRVJST1IsICJjb3VsZG4ndCByZW5hbWUgJXMgdG8gJXMiLAorCQkJCV9QQVRIX1JNVEFCVE1QLCBfUEFUSF9STVRBQik7CisJfQorCWVuZHJtdGFiZW50KCk7CS8qIGNsb3NlICYgdW5saW5rICovCisJZmVuZHJtdGFiZW50KGZwKTsKKwl4ZnVubG9jayhsb2NraWQpOworfQorCit2b2lkCittb3VudGxpc3RfZGVsX2FsbChzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbikKK3sKKwlzdHJ1Y3QgaW5fYWRkcglhZGRyID0gc2luLT5zaW5fYWRkcjsKKwlzdHJ1Y3QgaG9zdGVudAkqaHA7CisJc3RydWN0IHJtdGFiZW50CSpyZXA7CisJbmZzX2V4cG9ydAkqZXhwOworCUZJTEUJCSpmcDsKKwlpbnQJCWxvY2tpZDsKKworCWlmICgobG9ja2lkID0geGZsb2NrKF9QQVRIX1JNVEFCTENLLCAidyIpKSA8IDApCisJCXJldHVybjsKKwlpZiAoIShocCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLCBBRl9JTkVUKSkpIHsKKwkJeGxvZyhMX0VSUk9SLCAiY2FuJ3QgZ2V0IGhvc3RuYW1lIG9mICVzIiwgaW5ldF9udG9hKGFkZHIpKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlocCA9IGhvc3RlbnRfZHVwIChocCk7CisKKwlpZiAoIXNldHJtdGFiZW50KCJyIikpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoIShmcCA9IGZzZXRybXRhYmVudChfUEFUSF9STVRBQlRNUCwgInciKSkpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJd2hpbGUgKChyZXAgPSBnZXRybXRhYmVudCgxLCBOVUxMKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKHJlcC0+cl9jbGllbnQsIGhwLT5oX25hbWUpID09IDAgJiYKKwkJICAgIChleHAgPSBhdXRoX2F1dGhlbnRpY2F0ZSgidW1vdW50YWxsIiwgc2luLCByZXAtPnJfcGF0aCkpKQorCQkJY29udGludWU7CisJCWZwdXRybXRhYmVudChmcCwgcmVwLCBOVUxMKTsKKwl9CisJaWYgKHNsaW5rX3NhZmVfcmVuYW1lKF9QQVRIX1JNVEFCVE1QLCBfUEFUSF9STVRBQikgPCAwKSB7CisJCXhsb2coTF9FUlJPUiwgImNvdWxkbid0IHJlbmFtZSAlcyB0byAlcyIsCisJCQkJX1BBVEhfUk1UQUJUTVAsIF9QQVRIX1JNVEFCKTsKKwl9CisJZmVuZHJtdGFiZW50KGZwKTsKK291dF9jbG9zZToKKwllbmRybXRhYmVudCgpOwkvKiBjbG9zZSAmIHVubGluayAqLworb3V0X2ZyZWU6CisJZnJlZSAoaHApOworb3V0X3VubG9jazoKKwl4ZnVubG9jayhsb2NraWQpOworfQorCittb3VudGxpc3QKK21vdW50bGlzdF9saXN0KHZvaWQpCit7CisJc3RhdGljIG1vdW50bGlzdAltbGlzdCA9IE5VTEw7CisJc3RhdGljIHRpbWVfdAkJbGFzdF9tdGltZSA9IDA7CisJbW91bnRsaXN0CQltOworCXN0cnVjdCBybXRhYmVudAkJKnJlcDsKKwlzdHJ1Y3Qgc3RhdAkJc3RiOworCWludAkJCWxvY2tpZDsKKwlzdHJ1Y3QgaW5fYWRkcgkJYWRkcjsKKwlzdHJ1Y3QgaG9zdGVudAkJKmhlOworCisJaWYgKChsb2NraWQgPSB4ZmxvY2soX1BBVEhfUk1UQUJMQ0ssICJyIikpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHN0YXQoX1BBVEhfUk1UQUIsICZzdGIpIDwgMCkgeworCQl4bG9nKExfRVJST1IsICJjYW4ndCBzdGF0ICVzOiAlcyIsCisJCQkJX1BBVEhfUk1UQUIsIHN0cmVycm9yKGVycm5vKSk7CisJCXhmdW5sb2NrKGxvY2tpZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3RiLnN0X210aW1lICE9IGxhc3RfbXRpbWUpIHsKKwkJd2hpbGUgKG1saXN0KSB7CisJCQltbGlzdCA9IChtID0gbWxpc3QpLT5tbF9uZXh0OworCQkJeGZyZWUobS0+bWxfaG9zdG5hbWUpOworCQkJeGZyZWUobS0+bWxfZGlyZWN0b3J5KTsKKwkJCXhmcmVlKG0pOworCQl9CisJCWxhc3RfbXRpbWUgPSBzdGIuc3RfbXRpbWU7CisKKwkJc2V0cm10YWJlbnQoInIiKTsKKwkJd2hpbGUgKChyZXAgPSBnZXRybXRhYmVudCgxLCBOVUxMKSkgIT0gTlVMTCkgeworCQkJbSA9IChtb3VudGxpc3QpIHhtYWxsb2Moc2l6ZW9mKCptKSk7CisKKwkJCWlmIChyZXZlcnNlX3Jlc29sdmUgJiYKKwkJCSAgIGluZXRfYXRvbigoY29uc3QgY2hhciAqKSByZXAtPnJfY2xpZW50LCAmYWRkcikgJiYKKwkJCSAgIChoZSA9IGdldGhvc3RieWFkZHIoJmFkZHIsIHNpemVvZihhZGRyKSwgQUZfSU5FVCkpKQorCQkJCW0tPm1sX2hvc3RuYW1lID0geHN0cmR1cChoZS0+aF9uYW1lKTsKKwkJCWVsc2UKKwkJCQltLT5tbF9ob3N0bmFtZSA9IHhzdHJkdXAocmVwLT5yX2NsaWVudCk7CisKKyAJCQltLT5tbF9kaXJlY3RvcnkgPSB4c3RyZHVwKHJlcC0+cl9wYXRoKTsKKwkJCW0tPm1sX25leHQgPSBtbGlzdDsKKwkJCW1saXN0ID0gbTsKKwkJfQorCQllbmRybXRhYmVudCgpOworCX0KKwl4ZnVubG9jayhsb2NraWQpOworCisJcmV0dXJuIG1saXN0OworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9zdmNfcnVuLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbW91bnRkL3N2Y19ydW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM4YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC9zdmNfcnVuLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQmFzZWQgb24gc3ZjX3J1bi5jIGZyb20gc3RhdGQgd2hpY2ggY2xhaW1lZDoKKyAqIE1vZGlmaWVkIGJ5IEplZmZyZXkgQS4gVXBob2ZmLCAxOTk1LCAxOTk3LTE5OTkuCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoLCAxOTk2LgorICoKKyAqLworCisvKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogCisgKiBBbGxvdyBzdmNfcnVuIHRvIGxpc3RlbiB0byBvdGhlciBmaWxlIGRlc2NyaXB0b3JzIGFzIHdlbGwKKyAqLworCisvKiAKKyAqIFRoaXMgaXMgdGhlIFJQQyBzZXJ2ZXIgc2lkZSBpZGxlIGxvb3AuCisgKiBXYWl0IGZvciBpbnB1dCwgY2FsbCBzZXJ2ZXIgcHJvZ3JhbS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxycGMvcnBjLmg+CisjaW5jbHVkZSAieGxvZy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgSEFWRV9MSUJUSVJQQworI2luY2x1ZGUgPHJwYy9ycGNfY29tLmg+CisjZW5kaWYKKwordm9pZCBjYWNoZV9zZXRfZmRzKGZkX3NldCAqZmRzZXQpOworaW50IGNhY2hlX3Byb2Nlc3NfcmVxKGZkX3NldCAqcmVhZGZkcyk7CisKKyNpZiBMT05HX01BWCAhPSBJTlRfTUFYCQorLyogYnVnIGluIGdsaWJjIDIuMy42IGFuZCBlYXJsaWVyLCB3ZSBuZWVkCisgKiBvdXIgb3duIHN2Y19nZXRyZXFzZXQKKyAqLworc3RhdGljIHZvaWQKK215X3N2Y19nZXRyZXFzZXQgKGZkX3NldCAqcmVhZGZkcykKK3sKKwlmZF9tYXNrIG1hc2s7CisJZmRfbWFzayAqbWFza3A7CisJaW50IHNldHNpemU7CisJaW50IHNvY2s7CisJaW50IGJpdDsKKworCXNldHNpemUgPSBfcnBjX2R0YWJsZXNpemUgKCk7CisJaWYgKHNldHNpemUgPiBGRF9TRVRTSVpFKQorCQlzZXRzaXplID0gRkRfU0VUU0laRTsKKwltYXNrcCA9IHJlYWRmZHMtPmZkc19iaXRzOworCWZvciAoc29jayA9IDA7IHNvY2sgPCBzZXRzaXplOyBzb2NrICs9IE5GREJJVFMpCisJCWZvciAobWFzayA9ICptYXNrcCsrOworCQkgICAgIChiaXQgPSBmZnNsIChtYXNrKSk7CisJCSAgICAgbWFzayBePSAoMUwgPDwgKGJpdCAtIDEpKSkKKwkJCXN2Y19nZXRyZXFfY29tbW9uIChzb2NrICsgYml0IC0gMSk7Cit9CisjZGVmaW5lIHN2Y19nZXRyZXFzZXQgbXlfc3ZjX2dldHJlcXNldAorCisjZW5kaWYKKworLyoKKyAqIFRoZSBoZWFydCBvZiB0aGUgc2VydmVyLiAgQSBjcmliIGZyb20gbGliYyBmb3IgdGhlIG1vc3QgcGFydC4uLgorICovCit2b2lkCitteV9zdmNfcnVuKHZvaWQpCit7CisJZmRfc2V0CXJlYWRmZHM7CisJaW50CXNlbHJldDsKKworCWZvciAoOzspIHsKKworCQlyZWFkZmRzID0gc3ZjX2Zkc2V0OworCQljYWNoZV9zZXRfZmRzKCZyZWFkZmRzKTsKKworCQlzZWxyZXQgPSBzZWxlY3QoRkRfU0VUU0laRSwgJnJlYWRmZHMsCisJCQkJKHZvaWQgKikgMCwgKHZvaWQgKikgMCwgKHN0cnVjdCB0aW1ldmFsICopIDApOworCisKKwkJc3dpdGNoIChzZWxyZXQpIHsKKwkJY2FzZSAtMToKKwkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQ09OTlJFRlVTRUQKKwkJCSB8fCBlcnJubyA9PSBFTkVUVU5SRUFDSCB8fCBlcnJubyA9PSBFSE9TVFVOUkVBQ0gpCisJCQkJY29udGludWU7CisJCQl4bG9nKExfRVJST1IsICJteV9zdmNfcnVuKCkgLSBzZWxlY3Q6ICVtIik7CisJCQlyZXR1cm47CisKKwkJZGVmYXVsdDoKKwkJCXNlbHJldCAtPSBjYWNoZV9wcm9jZXNzX3JlcSgmcmVhZGZkcyk7CisJCQlpZiAoc2VscmV0KQorCQkJCXN2Y19nZXRyZXFzZXQoJnJlYWRmZHMpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL21vdW50ZC92NHJvb3QuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvdjRyb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkNmFmMwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9tb3VudGQvdjRyb290LmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCA8bmZzQHJlZGhhdC5jb20+CisgKgorICogc3VwcG9ydC9leHBvcnQvdjRyb290LmMKKyAqCisgKiBSb3V0aW5lcyB1c2VkIHRvIHN1cHBvcnQgTkZTdjQgcHNldWRvIHJvb3RzCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInhsb2cuaCIKKyNpbmNsdWRlICJleHBvcnRmcy5oIgorI2luY2x1ZGUgIm5mc2xpYi5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJ2NHJvb3QuaCIKKworaW50IHY0cm9vdF9uZWVkZWQ7CisKK3N0YXRpYyBuZnNfZXhwb3J0IHBzZXVkb19yb290ID0geworCS5tX25leHQgPSBOVUxMLAorCS5tX2NsaWVudCA9IE5VTEwsCisJLm1fZXhwb3J0ID0geworCQkuZV9ob3N0bmFtZSA9ICIqIiwKKwkJLmVfcGF0aCA9ICIvIiwKKwkJLmVfZmxhZ3MgPSBORlNFWFBfUkVBRE9OTFkgfCBORlNFWFBfUk9PVFNRVUFTSAorCQkJCXwgTkZTRVhQX05PU1VCVFJFRUNIRUNLIHwgTkZTRVhQX0ZTSUQKKwkJCQl8IE5GU0VYUF9WNFJPT1QsCisJCS5lX2Fub251aWQgPSA2NTUzNCwKKwkJLmVfYW5vbmdpZCA9IDY1NTM0LAorCQkuZV9zcXVpZHMgPSBOVUxMLAorCQkuZV9uc3F1aWRzID0gMCwKKwkJLmVfc3FnaWRzID0gTlVMTCwKKwkJLmVfbnNxZ2lkcyA9IDAsCisJCS5lX2ZzaWQgPSAwLAorCQkuZV9tb3VudHBvaW50ID0gTlVMTCwKKwl9LAorCS5tX2V4cG9ydGVkID0gMCwKKwkubV94dGFiZW50ID0gMSwKKwkubV9tYXlleHBvcnQgPSAxLAorCS5tX2NoYW5nZWQgPSAwLAorCS5tX3dhcm5lZCA9IDAsCit9OworCit2b2lkIHNldF9wc2V1ZG9mc19zZWN1cml0eShzdHJ1Y3QgZXhwb3J0ZW50ICpwc2V1ZG8sIHN0cnVjdCBleHBvcnRlbnQgKnNvdXJjZSkKK3sKKwlzdHJ1Y3Qgc2VjX2VudHJ5ICpzZTsKKwlpbnQgaTsKKworCWlmIChzb3VyY2UtPmVfZmxhZ3MgJiBORlNFWFBfSU5TRUNVUkVfUE9SVCkKKwkJcHNldWRvLT5lX2ZsYWdzIHw9IE5GU0VYUF9JTlNFQ1VSRV9QT1JUOworCWZvciAoc2UgPSBzb3VyY2UtPmVfc2VjaW5mbzsgc2UtPmZsYXY7IHNlKyspIHsKKwkJc3RydWN0IHNlY19lbnRyeSAqbmV3OworCisJCWkgPSBzZWNpbmZvX2FkZGZsYXZvcihzZS0+ZmxhdiwgcHNldWRvKTsKKwkJbmV3ID0gJnBzZXVkby0+ZV9zZWNpbmZvW2ldOworCisJCWlmIChzZS0+ZmxhZ3MgJiBORlNFWFBfSU5TRUNVUkVfUE9SVCkKKwkJCW5ldy0+ZmxhZ3MgfD0gTkZTRVhQX0lOU0VDVVJFX1BPUlQ7CisJfQorfQorCisvKgorICogQ3JlYXRlIGEgcHNldWRvIGV4cG9ydAorICovCitzdGF0aWMgc3RydWN0IGV4cG9ydGVudCAqCit2NHJvb3RfY3JlYXRlKGNoYXIgKnBhdGgsIG5mc19leHBvcnQgKmV4cG9ydCkKK3sKKwluZnNfZXhwb3J0ICpleHA7CisJc3RydWN0IGV4cG9ydGVudCBlZXA7CisJc3RydWN0IGV4cG9ydGVudCAqY3VyZXhwID0gJmV4cG9ydC0+bV9leHBvcnQ7CisKKwlkdXBleHBvcnRlbnQoJmVlcCwgJnBzZXVkb19yb290Lm1fZXhwb3J0KTsKKwllZXAuZV9ob3N0bmFtZSA9IHN0cmR1cChjdXJleHAtPmVfaG9zdG5hbWUpOworCXN0cm5jcHkoZWVwLmVfcGF0aCwgcGF0aCwgc2l6ZW9mKGVlcC5lX3BhdGgpKTsKKwlpZiAoc3RyY21wKHBhdGgsICIvIikgIT0gMCkKKwkJZWVwLmVfZmxhZ3MgJj0gfk5GU0VYUF9GU0lEOworCXNldF9wc2V1ZG9mc19zZWN1cml0eSgmZWVwLCBjdXJleHApOworCWV4cCA9IGV4cG9ydF9jcmVhdGUoJmVlcCwgMCk7CisJaWYgKGV4cCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwl4bG9nKERfQ0FMTCwgInY0cm9vdF9jcmVhdGU6IHBhdGggJyVzJyIsIGV4cC0+bV9leHBvcnQuZV9wYXRoKTsKKwlyZXR1cm4gJmV4cC0+bV9leHBvcnQ7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhlIGtlcm5lbCBoYXMgcHNldWRvIHJvb3Qgc3VwcG9ydC4KKyAqLworc3RhdGljIGludAordjRyb290X3N1cHBvcnQodm9pZCkKK3sKKwlzdHJ1Y3QgZXhwb3J0X2ZlYXR1cmVzICplZjsKKwlzdGF0aWMgaW50IHdhcm5lZCA9IDA7CisKKwllZiA9IGdldF9leHBvcnRfZmVhdHVyZXMoKTsKKworCWlmIChlZi0+ZmxhZ3MgJiBORlNFWFBfVjRST09UKQorCQlyZXR1cm4gMTsKKwlpZiAoIXdhcm5lZCkgeworCQl4bG9nKExfV0FSTklORywgIktlcm5lbCBkb2VzIG5vdCBoYXZlIHBzZXVkbyByb290IHN1cHBvcnQuIik7CisJCXhsb2coTF9XQVJOSU5HLCAiTkZTIHY0IG1vdW50cyB3aWxsIGJlIGRpc2FibGVkIHVubGVzcyBmc2lkPTAiKTsKKwkJeGxvZyhMX1dBUk5JTkcsICJpcyBzcGVjZmllZCBpbiAvZXRjL2V4cG9ydHMgZmlsZS4iKTsKKwkJd2FybmVkKys7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcHNldWRvZnNfdXBkYXRlKGNoYXIgKmhvc3RuYW1lLCBjaGFyICpwYXRoLCBuZnNfZXhwb3J0ICpzb3VyY2UpCit7CisJbmZzX2V4cG9ydCAqZXhwOworCisJZXhwID0gZXhwb3J0X2xvb2t1cChob3N0bmFtZSwgcGF0aCwgMCk7CisJaWYgKGV4cCAmJiAhKGV4cC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9WNFJPT1QpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWV4cCkgeworCQlpZiAodjRyb290X2NyZWF0ZShwYXRoLCBzb3VyY2UpID09IE5VTEwpIHsKKwkJCXhsb2coTF9XQVJOSU5HLCAidjRyb290X3NldDogVW5hYmxlIHRvIGNyZWF0ZSAiCisJCQkJCSJwc2V1ZG8gZXhwb3J0IGZvciAnJXMnIiwgcGF0aCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJLyogVXBkYXRlIGFuIGV4aXN0aW5nIFY0Uk9PVCBleHBvcnQ6ICovCisJc2V0X3BzZXVkb2ZzX3NlY3VyaXR5KCZleHAtPm1fZXhwb3J0LCAmc291cmNlLT5tX2V4cG9ydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRyb290X2FkZF9wYXJlbnRzKG5mc19leHBvcnQgKmV4cCkKK3sKKwljaGFyICpob3N0bmFtZSA9IGV4cC0+bV9leHBvcnQuZV9ob3N0bmFtZTsKKwljaGFyICpwYXRoOworCWNoYXIgKnB0cjsKKworCXBhdGggPSBzdHJkdXAoZXhwLT5tX2V4cG9ydC5lX3BhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChwdHIgPSBwYXRoICsgMTsgcHRyOyBwdHIgPSBzdHJjaHIocHRyLCAnLycpKSB7CisJCWludCByZXQ7CisJCWNoYXIgc2F2ZWQ7CisKKwkJc2F2ZWQgPSAqcHRyOworCQkqcHRyID0gJ1wwJzsKKwkJcmV0ID0gcHNldWRvZnNfdXBkYXRlKGhvc3RuYW1lLCBwYXRoLCBleHApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJKnB0ciA9IHNhdmVkOworCQlwdHIrKzsKKwl9CisJZnJlZShwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENyZWF0ZSBwc2V1ZG8gZXhwb3J0cyBieSBydW5uaW5nIHRocm91Z2ggdGhlIHJlYWwgZXhwb3J0CisgKiBsb29raW5nIGF0IHRoZSBjb21wb25lbnRzIG9mIHRoZSBwYXRoIHRoYXQgbWFrZSB1cCB0aGUgZXhwb3J0LgorICogVGhvc2UgcGF0aCBjb21wb25lbnRzLCBpZiBub3QgZXhwb3J0ZWQsIHdpbGwgYmVjb21lIHBzZXVkbworICogZXhwb3J0cyBhbGxvd2luZyB0aGVtIHRvIGJlIGZvdW5kIHdoZW4gdGhlIGtlcm5lbCBkb2VzIGFuIHVwY2FsbAorICogbG9va2luZyBmb3IgY29tcG9uZW50cyBvZiB0aGUgdjQgbW91bnQuCisgKi8KK3ZvaWQKK3Y0cm9vdF9zZXQoKQoreworCW5mc19leHBvcnQJKmV4cDsKKwlpbnQJaSwgcmV0OworCisJaWYgKCF2NHJvb3RfbmVlZGVkKQorCQlyZXR1cm47CisJaWYgKCF2NHJvb3Rfc3VwcG9ydCgpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTUNMX01BWFRZUEVTOyBpKyspIHsKKwkJZm9yIChleHAgPSBleHBvcnRsaXN0W2ldLnBfaGVhZDsgZXhwOyBleHAgPSBleHAtPm1fbmV4dCkgeworCQkJaWYgKGV4cC0+bV9leHBvcnQuZV9mbGFncyAmIE5GU0VYUF9WNFJPT1QpCisJCQkJLyoKKwkJCQkgKiBXZSBqdXN0IGFkZGVkIHRoaXMgb25lLCBzbyBpdHMKKwkJCQkgKiBwYXJlbnRzIGFyZSBhbHJlYWR5IGRlYWx0IHdpdGghCisJCQkJICovCisJCQkJY29udGludWU7CisKKwkJCXJldCA9IHY0cm9vdF9hZGRfcGFyZW50cyhleHApOworCQkJLyogWFhYOiBlcnJvciBoYW5kbGluZyEgKi8KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNkL01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjNmZiMAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNkL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTQgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCittYW44X01BTlMJPSBuZnNkLm1hbgorRVhUUkFfRElTVAk9ICQobWFuOF9NQU5TKQorCitSUENQUkVGSVgJPSBycGMuCitLUFJFRklYCQk9IEBrcHJlZml4QAorc2Jpbl9QUk9HUkFNUwk9IG5mc2QKKworbmZzZF9TT1VSQ0VTID0gbmZzZC5jIG5mc3N2Yy5jCituZnNkX0xEQUREID0gLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgZm9sbG93aW5nIGFsbG93cyB0aGUgY3VycmVudCBwcmFjdGljZSBvZiBoYXZpbmcKKyMgZGFlbW9ucyByZW5hbWVkIGR1cmluZyB0aGUgaW5zdGFsbCB0byBpbmNsdWRlIFJQQ1BSRUZJWAorIyBhbmQgdGhlIEtQUkVGSVgKKyMgVGhpcyBjb3VsZCBhbGwgYmUgZG9uZSBtdWNoIGVhc2llciB3aXRoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUKKyMgKCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gcy9eLyQoUlBDUFJFRklYKSQoS1BSRUZJWCkvICkKKyMgYnV0IHRoYXQgYWxzbyByZW5hbWVzIHRoZSBtYW4gcGFnZXMsIHdoaWNoIHRoZSBjdXJyZW50CisjIHByYWN0aWNlIGRvZXMgbm90IGRvLgoraW5zdGFsbC1leGVjLWhvb2s6CisJKGNkICQoREVTVERJUikkKHNiaW5kaXIpICYmIFwKKwkgIGZvciBwIGluICQoc2Jpbl9QUk9HUkFNUyk7IGRvIFwKKwkgICAgbXYgLWYgJCRwJChFWEVFWFQpICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCit1bmluc3RhbGwtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgZm9yIHAgaW4gJChzYmluX1BST0dSQU1TKTsgZG8gXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkKEtQUkVGSVgpJCRwJChFWEVFWFQpIDtcCisJICBkb25lKQorCisKKyMgWFhYIFRoaXMgbWFrZXMgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGF1dG9tYWtlIGRvZXMuCisjIFhYWCBCdXQgdGhlcmUgaXMgbm8gaW5zdGFsbC1tYW4taG9vayBvciBpbnN0YWxsLW1hbi1sb2NhbC4KK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjggaW5zdGFsbC1tYW4tbGlua3MKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44IHVuaW5zdGFsbC1tYW4tbGlua3MKKworaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgICAkKExOX1MpICQkaW5zdCAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCit1bmluc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNkL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlZmU0MwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNkL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjgzIEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzYmluX1BST0dSQU1TID0gbmZzZCQoRVhFRVhUKQorc3ViZGlyID0gdXRpbHMvbmZzZAorRElTVF9DT01NT04gPSAkKHNyY2RpcikvTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmluCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKG1hbjhkaXIpIgorUFJPR1JBTVMgPSAkKHNiaW5fUFJPR1JBTVMpCithbV9uZnNkX09CSkVDVFMgPSBuZnNkLiQoT0JKRVhUKSBuZnNzdmMuJChPQkpFWFQpCituZnNkX09CSkVDVFMgPSAkKGFtX25mc2RfT0JKRUNUUykKK25mc2RfREVQRU5ERU5DSUVTID0gLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChuZnNkX1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKG5mc2RfU09VUkNFUykKK2FtX192cGF0aF9hZGpfc2V0dXAgPSBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAnc3wufC58ZydgOworYW1fX3ZwYXRoX2FkaiA9IGNhc2UgJCRwIGluIFwKKyAgICAkKHNyY2RpcikvKikgZj1gZWNobyAiJCRwIiB8IHNlZCAic3xeJCRzcmNkaXJzdHJpcC98fCJgOzsgXAorICAgICopIGY9JCRwOzsgXAorICBlc2FjOworYW1fX3N0cmlwX2RpciA9IGY9YGVjaG8gJCRwIHwgc2VkIC1lICdzfF4uKi98fCdgOworYW1fX2luc3RhbGxfbWF4ID0gNDAKK2FtX19ub2Jhc2Vfc3RyaXBfc2V0dXAgPSBcCisgIHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCp8XS9cXFxcJi9nJ2AKK2FtX19ub2Jhc2Vfc3RyaXAgPSBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAtZSAic3wkJHNyY2RpcnN0cmlwL3x8IgorYW1fX25vYmFzZV9saXN0ID0gJChhbV9fbm9iYXNlX3N0cmlwX3NldHVwKTsgXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorICBzZWQgInN8ICQkc3JjZGlyc3RyaXAvfCB8OyInIC8gLipcLy8hcy8gLiovIC4vOyBzLFwoIC4qXCkvW14vXSokJCxcMSwnIHwgXAorICAkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiIH0geyBmaWxlc1skJDJdID0gZmlsZXNbJCQyXSAiICIgJCQxOyBcCisgICAgaWYgKCsrblskJDJdID09ICQoYW1fX2luc3RhbGxfbWF4KSkgXAorICAgICAgeyBwcmludCAkJDIsIGZpbGVzWyQkMl07IG5bJCQyXSA9IDA7IGZpbGVzWyQkMl0gPSAiIiB9IH0gXAorICAgIEVORCB7IGZvciAoZGlyIGluIGZpbGVzKSBwcmludCBkaXIsIGZpbGVzW2Rpcl0gfScKK2FtX19iYXNlX2xpc3QgPSBcCisgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCisgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycKK21hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAorTlJPRkYgPSBucm9mZgorTUFOUyA9ICQobWFuOF9NQU5TKQorRVRBR1MgPSBldGFncworQ1RBR1MgPSBjdGFncworRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChESVNUX1NPVVJDRVMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKK0FDTE9DQUwgPSBAQUNMT0NBTEAKK0FDTE9DQUxfQU1GTEFHUyA9IEBBQ0xPQ0FMX0FNRkxBR1NACitBTExPQ0EgPSBAQUxMT0NBQAorQU1UQVIgPSBAQU1UQVJACitBTV9DRkxBR1MgPSBAQU1fQ0ZMQUdTQAorQU1fQ1BQRkxBR1MgPSBAQU1fQ1BQRkxBR1NACitBUiA9IEBBUkAKK0FVVE9DT05GID0gQEFVVE9DT05GQAorQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAorQVVUT01BS0UgPSBAQVVUT01BS0VACitBV0sgPSBAQVdLQAorQ0MgPSBAQ0NACitDQ0RFUE1PREUgPSBAQ0NERVBNT0RFQAorQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKK0NGTEFHUyA9IEBDRkxBR1NACitDRkxBR1NfRk9SX0JVSUxEID0gQENGTEFHU19GT1JfQlVJTERACitDUFAgPSBAQ1BQQAorQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACitDUFBGTEFHU19GT1JfQlVJTEQgPSBAQ1BQRkxBR1NfRk9SX0JVSUxEQAorQ1hYID0gQENYWEAKK0NYWENQUCA9IEBDWFhDUFBACitDWFhERVBNT0RFID0gQENYWERFUE1PREVACitDWFhGTEFHUyA9IEBDWFhGTEFHU0AKK0NYWEZMQUdTX0ZPUl9CVUlMRCA9IEBDWFhGTEFHU19GT1JfQlVJTERACitDWUdQQVRIX1cgPSBAQ1lHUEFUSF9XQAorREVGUyA9IEBERUZTQAorREVQRElSID0gQERFUERJUkAKK0RTWU1VVElMID0gQERTWU1VVElMQAorRFVNUEJJTiA9IEBEVU1QQklOQAorRUNIT19DID0gQEVDSE9fQ0AKK0VDSE9fTiA9IEBFQ0hPX05ACitFQ0hPX1QgPSBARUNIT19UQAorRUdSRVAgPSBARUdSRVBACitFWEVFWFQgPSBARVhFRVhUQAorRkdSRVAgPSBARkdSRVBACitHUkVQID0gQEdSRVBACitHU1NEID0gQEdTU0RACitHU1NHTFVFX0NGTEFHUyA9IEBHU1NHTFVFX0NGTEFHU0AKK0dTU0dMVUVfTElCUyA9IEBHU1NHTFVFX0xJQlNACitIQVZFX0xJQldSQVAgPSBASEFWRV9MSUJXUkFQQAorSEFWRV9UQ1BfV1JBUFBFUiA9IEBIQVZFX1RDUF9XUkFQUEVSQAorSURNQVBEID0gQElETUFQREAKK0lOU1RBTEwgPSBASU5TVEFMTEAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitJTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACitJTlNUQUxMX1NUUklQX1BST0dSQU0gPSBASU5TVEFMTF9TVFJJUF9QUk9HUkFNQAorSzVWRVJTID0gQEs1VkVSU0AKK0tSQkNGTEFHUyA9IEBLUkJDRkxBR1NACitLUkJESVIgPSBAS1JCRElSQAorS1JCTERGTEFHUyA9IEBLUkJMREZMQUdTQAorS1JCTElCUyA9IEBLUkJMSUJTQAorTEQgPSBATERACitMREZMQUdTID0gQExERkxBR1NACitMREZMQUdTX0ZPUl9CVUlMRCA9IEBMREZMQUdTX0ZPUl9CVUlMREAKK0xJQkJMS0lEID0gQExJQkJMS0lEQAorTElCQlNEID0gQExJQkJTREAKK0xJQkNBUCA9IEBMSUJDQVBACitMSUJDUllQVCA9IEBMSUJDUllQVEAKK0xJQk5TTCA9IEBMSUJOU0xACitMSUJPQkpTID0gQExJQk9CSlNACitMSUJTID0gQExJQlNACitMSUJTT0NLRVQgPSBATElCU09DS0VUQAorTElCVE9PTCA9IEBMSUJUT09MQAorTElCV1JBUCA9IEBMSUJXUkFQQAorTElQTyA9IEBMSVBPQAorTE5fUyA9IEBMTl9TQAorTFRMSUJPQkpTID0gQExUTElCT0JKU0AKK01BSU5UID0gQE1BSU5UQAorTUFLRUlORk8gPSBATUFLRUlORk9ACitNS0RJUl9QID0gQE1LRElSX1BACitOTSA9IEBOTUAKK05NRURJVCA9IEBOTUVESVRACitPQkpEVU1QID0gQE9CSkRVTVBACitPQkpFWFQgPSBAT0JKRVhUQAorT1RPT0wgPSBAT1RPT0xACitPVE9PTDY0ID0gQE9UT09MNjRACitQQUNLQUdFID0gQFBBQ0tBR0VACitQQUNLQUdFX0JVR1JFUE9SVCA9IEBQQUNLQUdFX0JVR1JFUE9SVEAKK1BBQ0tBR0VfTkFNRSA9IEBQQUNLQUdFX05BTUVACitQQUNLQUdFX1NUUklORyA9IEBQQUNLQUdFX1NUUklOR0AKK1BBQ0tBR0VfVEFSTkFNRSA9IEBQQUNLQUdFX1RBUk5BTUVACitQQUNLQUdFX1ZFUlNJT04gPSBAUEFDS0FHRV9WRVJTSU9OQAorUEFUSF9TRVBBUkFUT1IgPSBAUEFUSF9TRVBBUkFUT1JACitQS0dfQ09ORklHID0gQFBLR19DT05GSUdACitSQU5MSUIgPSBAUkFOTElCQAorUkVMRUFTRSA9IEBSRUxFQVNFQAorUlBDR0VOX1BBVEggPSBAUlBDR0VOX1BBVEhACitSUENTRUNHU1NfQ0ZMQUdTID0gQFJQQ1NFQ0dTU19DRkxBR1NACitSUENTRUNHU1NfTElCUyA9IEBSUENTRUNHU1NfTElCU0AKK1NFRCA9IEBTRURACitTRVRfTUFLRSA9IEBTRVRfTUFLRUAKK1NIRUxMID0gQFNIRUxMQAorU1RSSVAgPSBAU1RSSVBACitTVkNHU1NEID0gQFNWQ0dTU0RACitWRVJTSU9OID0gQFZFUlNJT05ACithYnNfYnVpbGRkaXIgPSBAYWJzX2J1aWxkZGlyQAorYWJzX3NyY2RpciA9IEBhYnNfc3JjZGlyQAorYWJzX3RvcF9idWlsZGRpciA9IEBhYnNfdG9wX2J1aWxkZGlyQAorYWJzX3RvcF9zcmNkaXIgPSBAYWJzX3RvcF9zcmNkaXJACithY19jdF9DQyA9IEBhY19jdF9DQ0AKK2FjX2N0X0NYWCA9IEBhY19jdF9DWFhACithY19jdF9EVU1QQklOID0gQGFjX2N0X0RVTVBCSU5ACithbV9faW5jbHVkZSA9IEBhbV9faW5jbHVkZUAKK2FtX19sZWFkaW5nX2RvdCA9IEBhbV9fbGVhZGluZ19kb3RACithbV9fcXVvdGUgPSBAYW1fX3F1b3RlQAorYW1fX3RhciA9IEBhbV9fdGFyQAorYW1fX3VudGFyID0gQGFtX191bnRhckAKK2JpbmRpciA9IEBiaW5kaXJACitidWlsZCA9IEBidWlsZEAKK2J1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAorYnVpbGRfY3B1ID0gQGJ1aWxkX2NwdUAKK2J1aWxkX29zID0gQGJ1aWxkX29zQAorYnVpbGRfdmVuZG9yID0gQGJ1aWxkX3ZlbmRvckAKK2J1aWxkZGlyID0gQGJ1aWxkZGlyQAorZGF0YWRpciA9IEBkYXRhZGlyQAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACitkb2NkaXIgPSBAZG9jZGlyQAorZHZpZGlyID0gQGR2aWRpckAKK2VuYWJsZV9nc3MgPSBAZW5hYmxlX2dzc0AKK2VuYWJsZV9pcHY2ID0gQGVuYWJsZV9pcHY2QAorZW5hYmxlX21vdW50Y29uZmlnID0gQGVuYWJsZV9tb3VudGNvbmZpZ0AKK2VuYWJsZV9uZnN2MyA9IEBlbmFibGVfbmZzdjNACitlbmFibGVfbmZzdjQgPSBAZW5hYmxlX25mc3Y0QAorZW5hYmxlX25mc3Y0MSA9IEBlbmFibGVfbmZzdjQxQAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitob3N0ID0gQGhvc3RACitob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACitob3N0X2NwdSA9IEBob3N0X2NwdUAKK2hvc3Rfb3MgPSBAaG9zdF9vc0AKK2hvc3RfdmVuZG9yID0gQGhvc3RfdmVuZG9yQAoraHRtbGRpciA9IEBodG1sZGlyQAoraW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAoraW5mb2RpciA9IEBpbmZvZGlyQAoraW5zdGFsbF9zaCA9IEBpbnN0YWxsX3NoQAora3ByZWZpeCA9IEBrcHJlZml4QAorbGliZGlyID0gQGxpYmRpckAKK2xpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKK2xvY2FsZWRpciA9IEBsb2NhbGVkaXJACitsb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACitsdF9FQ0hPID0gQGx0X0VDSE9ACittYW5kaXIgPSBAbWFuZGlyQAorbWtkaXJfcCA9IEBta2Rpcl9wQAorbW91bnRmaWxlID0gQG1vdW50ZmlsZUAKK29sZGluY2x1ZGVkaXIgPSBAb2xkaW5jbHVkZWRpckAKK3BkZmRpciA9IEBwZGZkaXJACitwcmVmaXggPSBAcHJlZml4QAorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAorcHNkaXIgPSBAcHNkaXJACitzYmluZGlyID0gQHNiaW5kaXJACitzaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKK3NyY2RpciA9IEBzcmNkaXJACitzdGFydHN0YXRkID0gQHN0YXJ0c3RhdGRACitzdGF0ZHVzZXIgPSBAc3RhdGR1c2VyQAorc3RhdGVkaXIgPSBAc3RhdGVkaXJACitzeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACit0YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAordG9wX2J1aWxkX3ByZWZpeCA9IEB0b3BfYnVpbGRfcHJlZml4QAordG9wX2J1aWxkZGlyID0gQHRvcF9idWlsZGRpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKK21hbjhfTUFOUyA9IG5mc2QubWFuCitFWFRSQV9ESVNUID0gJChtYW44X01BTlMpCitSUENQUkVGSVggPSBycGMuCitLUFJFRklYID0gQGtwcmVmaXhACituZnNkX1NPVVJDRVMgPSBuZnNkLmMgbmZzc3ZjLmMKK25mc2RfTERBREQgPSAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYQorTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvbmZzZC9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSB1dGlscy9uZnNkL01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgoraW5zdGFsbC1zYmluUFJPR1JBTVM6ICQoc2Jpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHNiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChzYmluZGlyKSIKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKwlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCisJd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKKwkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAorCWRvbmUgfCBcCisJc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAorCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCisJICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCisJICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKKwkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKKwl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChzYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKHNiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtc2JpblBST0dSQU1TOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChzYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHNiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK2NsZWFuLXNiaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorbmZzZCQoRVhFRVhUKTogJChuZnNkX09CSkVDVFMpICQobmZzZF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBuZnNkJChFWEVFWFQpCisJJChMSU5LKSAkKG5mc2RfT0JKRUNUUykgJChuZnNkX0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZnNkLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZnNzdmMuUG9AYW1fX3F1b3RlQAorCisuYy5vOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyAkPAorCisuYy5vYmo6CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAIGAkKENZR1BBVEhfVykgJyQ8J2AKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgYCQoQ1lHUEFUSF9XKSAnJDwnYAorCisuYy5sbzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoTFRDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCAkPAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBsbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9eWVzIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKExUQ09NUElMRSkgLWMgLW8gJEAgJDwKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtbWFuODogJChtYW44X01BTlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtYW44ZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuOGRpcikiCisJQGxpc3Q9JyQobWFuOF9NQU5TKSc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCXsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHdoaWxlIHJlYWQgcDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ247cywuKi8sLDtwO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCcgfCBcCisJc2VkICdOO047cyxcbiwgLGcnIHwgeyBcCisJbGlzdD07IHdoaWxlIHJlYWQgZmlsZSBiYXNlIGluc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkYmFzZSIgPSAiJCRpbnN0IjsgdGhlbiBsaXN0PSIkJGxpc3QgJCRmaWxlIjsgZWxzZSBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZmlsZScgJyQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0IiB8fCBleGl0ICQkPzsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtYW44ZGlyKSciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtYW44ZGlyKSIgfHwgZXhpdCAkJD87IH07IFwKKwlkb25lOyB9CisKK3VuaW5zdGFsbC1tYW44OgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobWFuOF9NQU5TKSc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWB7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCBzZWQgLWUgJ3MsLiovLCw7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJ2A7IFwKKwl0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgIGVjaG8gIiAoIGNkICckKERFU1RESVIpJChtYW44ZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJICBjZCAiJChERVNURElSKSQobWFuOGRpcikiICYmIHJtIC1mICQkZmlsZXM7IH0KKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGxpc3Q9JyQoTUFOUyknOyBpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlbHNlIDo7IGZpOyBkb25lYDsgXAorCSAgaWYgdGVzdCAtbiAiJCRsaXN0IiAmJiBcCisJICAgIGdyZXAgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0ID4vZGV2L251bGw7IHRoZW4gXAorCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIFxgbWlzc2luZyBoZWxwMm1hbicgcmVwbGFjZW1lbnQgdGV4dDoiID4mMjsgXAorCSAgICBncmVwIC1sICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCB8IHNlZCAncy9eLyAgICAgICAgIC8nID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdG8gZml4IHRoZW0sIGluc3RhbGwgaGVscDJtYW4sIHJlbW92ZSBhbmQgcmVnZW5lcmF0ZSB0aGUgbWFuIHBhZ2VzOyIgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0eXBpY2FsbHkgXGBtYWtlIG1haW50YWluZXItY2xlYW4nIHdpbGwgcmVtb3ZlIHRoZW0iID4mMjsgXAorCSAgICBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwllbHNlIDo7IGZpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXNiaW5QUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLXNiaW5QUk9HUkFNUworCUAkKE5PUk1BTF9JTlNUQUxMKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1ob29rCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtc2JpblBST0dSQU1TCisJQCQoTk9STUFMX0lOU1RBTEwpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLWhvb2sKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLXN0cmlwIHVuaW5zdGFsbC1hbQorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYy1ob29rIFwKKwlpbnN0YWxsLWh0bWwgaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gXAorCWluc3RhbGwtbWFuIGluc3RhbGwtbWFuOCBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIFwKKwlpbnN0YWxsLXBzLWFtIGluc3RhbGwtc2JpblBST0dSQU1TIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLWhvb2sgdW5pbnN0YWxsLW1hbiBcCisJdW5pbnN0YWxsLW1hbjggdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZSBmb2xsb3dpbmcgYWxsb3dzIHRoZSBjdXJyZW50IHByYWN0aWNlIG9mIGhhdmluZworIyBkYWVtb25zIHJlbmFtZWQgZHVyaW5nIHRoZSBpbnN0YWxsIHRvIGluY2x1ZGUgUlBDUFJFRklYCisjIGFuZCB0aGUgS1BSRUZJWAorIyBUaGlzIGNvdWxkIGFsbCBiZSBkb25lIG11Y2ggZWFzaWVyIHdpdGggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorIyAoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBzL14vJChSUENQUkVGSVgpJChLUFJFRklYKS8gKQorIyBidXQgdGhhdCBhbHNvIHJlbmFtZXMgdGhlIG1hbiBwYWdlcywgd2hpY2ggdGhlIGN1cnJlbnQKKyMgcHJhY3RpY2UgZG9lcyBub3QgZG8uCitpbnN0YWxsLWV4ZWMtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgZm9yIHAgaW4gJChzYmluX1BST0dSQU1TKTsgZG8gXAorCSAgICBtdiAtZiAkJHAkKEVYRUVYVCkgJChSUENQUkVGSVgpJChLUFJFRklYKSQkcCQoRVhFRVhUKSA7XAorCSAgZG9uZSkKK3VuaW5zdGFsbC1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJPR1JBTVMpOyBkbyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCisKKyMgWFhYIFRoaXMgbWFrZXMgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGF1dG9tYWtlIGRvZXMuCisjIFhYWCBCdXQgdGhlcmUgaXMgbm8gaW5zdGFsbC1tYW4taG9vayBvciBpbnN0YWxsLW1hbi1sb2NhbC4KK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjggaW5zdGFsbC1tYW4tbGlua3MKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44IHVuaW5zdGFsbC1tYW4tbGlua3MKKworaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgICAkKExOX1MpICQkaW5zdCAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCit1bmluc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNkL25mc2QuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNkL25mc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2RhMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzZC5jCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogbmZzZAorICoKKyAqIFRoaXMgaXMgdGhlIHVzZXIgbGV2ZWwgcGFydCBvZiBuZnNkLiBUaGlzIGlzIHZlcnkgcHJpbWl0aXZlLCBiZWNhdXNlCisgKiBhbGwgdGhlIHdvcmsgaXMgbm93IGRvbmUgaW4gdGhlIGtlcm5lbCBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgIm5mc2xpYi5oIgorI2luY2x1ZGUgIm5mc3N2Yy5oIgorI2luY2x1ZGUgInhsb2cuaCIKKworLyoKKyAqIElQdjYgc3VwcG9ydCBmb3IgbmZzZCB3YXMgZmluaXNoZWQgYmVmb3JlIHNvbWUgb2YgdGhlIG90aGVyIGRhZW1vbnMgKG1vdW50ZAorICogYW5kIHN0YXRkIGluIHBhcnRpY3VsYXIpLiBUaGF0IGNvdWxkIGJlIGEgcHJvYmxlbSBpbiB0aGUgZnV0dXJlIGlmIHNvbWVvbmUKKyAqIHdlcmUgdG8gYm9vdCBhIGtlcm5lbCB0aGF0IHN1cHBvcnRzIElQdjYgc2VydmluZyB3aXRoICBhbiBvbGRlciBuZnMtdXRpbHMuIEZvcgorICogbm93LCBoYXJkY29kZSB0aGUgSVB2NiBzd2l0Y2ggaW50byB0aGUgb2ZmIHBvc2l0aW9uIHVudGlsIHRoZSBvdGhlciBkYWVtb25zCisgKiBhcmUgZnVuY3Rpb25hbC4KKyAqLworI3VuZGVmIElQVjZfU1VQUE9SVEVECisKK3N0YXRpYyB2b2lkCXVzYWdlKGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQoreworCXsgImhvc3QiLCAxLCAwLCAnSCcgfSwKKwl7ICJoZWxwIiwgMCwgMCwgJ2gnIH0sCisJeyAibm8tbmZzLXZlcnNpb24iLCAxLCAwLCAnTicgfSwKKwl7ICJuby10Y3AiLCAwLCAwLCAnVCcgfSwKKwl7ICJuby11ZHAiLCAwLCAwLCAnVScgfSwKKwl7ICJwb3J0IiwgMSwgMCwgJ1AnIH0sCisJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCXsgImRlYnVnIiwgMCwgMCwgJ2QnIH0sCisJeyAic3lzbG9nIiwgMCwgMCwgJ3MnIH0sCisJeyBOVUxMLCAwLCAwLCAwIH0KK307CisKKy8qIGdpdmVuIGEgZmFtaWx5IGFuZCBjdGxiaXRzLCBkaXNhYmxlIGFueSB0aGF0IGFyZW4ndCBsaXN0ZWQgaW4gbmV0Y29uZmlnICovCisjaWZkZWYgSEFWRV9MSUJUSVJQQworc3RhdGljIHZvaWQKK25mc2RfZW5hYmxlX3Byb3Rvcyh1bnNpZ25lZCBpbnQgKnByb3RvNCwgdW5zaWduZWQgaW50ICpwcm90bzYpCit7CisJc3RydWN0IG5ldGNvbmZpZyAqbmNvbmY7CisJdW5zaWduZWQgaW50ICpmYW1wcm90bzsKKwl2b2lkICpoYW5kbGU7CisKKwl4bG9nKERfR0VORVJBTCwgIkNoZWNraW5nIG5ldGNvbmZpZyBmb3IgdmlzaWJsZSBwcm90b2NvbHMuIik7CisKKwloYW5kbGUgPSBzZXRuZXRjb25maWcoKTsKKwl3aGlsZSgobmNvbmYgPSBnZXRuZXRjb25maWcoaGFuZGxlKSkpIHsKKwkJaWYgKCEobmNvbmYtPm5jX2ZsYWcgJiBOQ19WSVNJQkxFKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3RyY21wKG5jb25mLT5uY19wcm90b2ZtbHksIE5DX0lORVQpKQorCQkJZmFtcHJvdG8gPSBwcm90bzQ7CisJCWVsc2UgaWYgKCFzdHJjbXAobmNvbmYtPm5jX3Byb3RvZm1seSwgTkNfSU5FVDYpKQorCQkJZmFtcHJvdG8gPSBwcm90bzY7CisJCWVsc2UKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3RyY21wKG5jb25mLT5uY19wcm90bywgTkNfVENQKSkKKwkJCU5GU0NUTF9UQ1BTRVQoKmZhbXByb3RvKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChuY29uZi0+bmNfcHJvdG8sIE5DX1VEUCkpCisJCQlORlNDVExfVURQU0VUKCpmYW1wcm90byk7CisKKwkJeGxvZyhEX0dFTkVSQUwsICJFbmFibGluZyAlcyAlcy4iLCBuY29uZi0+bmNfcHJvdG9mbWx5LAorCQkJbmNvbmYtPm5jX3Byb3RvKTsKKwl9CisJZW5kbmV0Y29uZmlnKGhhbmRsZSk7CisJcmV0dXJuOworfQorI2Vsc2UgLyogSEFWRV9MSUJUSVJQQyAqLworc3RhdGljIHZvaWQKK25mc2RfZW5hYmxlX3Byb3Rvcyh1bnNpZ25lZCBpbnQgKnByb3RvNCwgdW5zaWduZWQgaW50ICpwcm90bzYpCit7CisJLyogRW5hYmxlIGFsbCBJUHY0IHByb3RvY29scyBpZiBubyBUSVJQQyBzdXBwb3J0ICovCisJKnByb3RvNCA9IE5GU0NUTF9BTExCSVRTOworCSpwcm90bzYgPSAwOworfQorI2VuZGlmIC8qIEhBVkVfTElCVElSUEMgKi8KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQJY291bnQgPSAxLCBjLCBlcnJvciA9IDAsIHBvcnRudW0gPSAwLCBmZCwgZm91bmRfb25lOworCWNoYXIgKnAsICpwcm9nbmFtZSwgKnBvcnQ7CisJY2hhciAqaGFkZHIgPSBOVUxMOworCWludAlzb2NrZXRfdXAgPSAwOworCWludCBtaW5vcnZlcnM0ID0gTkZTRF9NQVhNSU5PUlZFUlM0OwkvKiBuZnN2NCBtaW5vciB2ZXJzaW9uICovCisJdW5zaWduZWQgaW50IHZlcnNiaXRzID0gTkZTQ1RMX0FMTEJJVFM7CisJdW5zaWduZWQgaW50IHByb3RvYml0cyA9IE5GU0NUTF9BTExCSVRTOworCXVuc2lnbmVkIGludCBwcm90bzQgPSAwOworCXVuc2lnbmVkIGludCBwcm90bzYgPSAwOworCisJcHJvZ25hbWUgPSBzdHJkdXAoYmFzZW5hbWUoYXJndlswXSkpOworCWlmICghcHJvZ25hbWUpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIsIGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCXBvcnQgPSBzdHJkdXAoIm5mcyIpOworCWlmICghcG9ydCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5LlxuIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKworCXhsb2dfc3lzbG9nKDApOworCXhsb2dfc3RkZXJyKDEpOworCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImRIOmhOOnA6UDpzVFUiLCBsb25nb3B0cywgTlVMTCkpICE9IEVPRikgeworCQlzd2l0Y2goYykgeworCQljYXNlICdkJzoKKwkJCXhsb2dfY29uZmlnKERfQUxMLCAxKTsKKwkJCWJyZWFrOworCQljYXNlICdIJzoKKwkJCS8qCisJCQkgKiBmb3Igbm93LCB0aGlzIG9ubHkgaGFuZGxlcyBvbmUgLUggb3B0aW9uLiBVc2UgdGhlCisJCQkgKiBsYXN0IG9uZSBzcGVjaWZpZWQuCisJCQkgKi8KKwkJCWZyZWUoaGFkZHIpOworCQkJaGFkZHIgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWlmICghaGFkZHIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgIgorCQkJCQkibWVtb3J5LlxuIiwgcHJvZ25hbWUpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CS8qIFhYWCBmb3IgbmZzLXNlcnZlciBjb21wYXRpYmlsaXR5ICovCisJCWNhc2UgJ3AnOgorCQkJLyogb25seSB0aGUgbGFzdCAtcCBvcHRpb24gaGFzIGFueSBlZmZlY3QgKi8KKwkJCXBvcnRudW0gPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAocG9ydG51bSA8PSAwIHx8IHBvcnRudW0gPiA2NTUzNSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBwb3J0IG51bWJlcjogJXNcbiIsCisJCQkJCXByb2duYW1lLCBvcHRhcmcpOworCQkJCXVzYWdlKHByb2duYW1lKTsKKwkJCX0KKwkJCWZyZWUocG9ydCk7CisJCQlwb3J0ID0gc3RyZHVwKG9wdGFyZyk7CisJCQlpZiAoIXBvcnQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmFibGUgdG8gYWxsb2NhdGUgIgorCQkJCQkJIm1lbW9yeS5cbiIsIHByb2duYW1lKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ04nOgorCQkJc3dpdGNoKChjID0gc3RydG9sKG9wdGFyZywgJnAsIDApKSkgeworCQkJY2FzZSA0OgorCQkJCWlmICgqcCA9PSAnLicpIHsKKwkJCQkJbWlub3J2ZXJzNCA9IC1hdG9pKHAgKyAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJY2FzZSAzOgorCQkJY2FzZSAyOgorCQkJCU5GU0NUTF9WRVJVTlNFVCh2ZXJzYml0cywgYyk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IFVuc3VwcG9ydGVkIHZlcnNpb25cbiIsIG9wdGFyZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXhsb2dfc3lzbG9nKDEpOworCQkJeGxvZ19zdGRlcnIoMCk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlORlNDVExfVENQVU5TRVQocHJvdG9iaXRzKTsKKwkJCWJyZWFrOworCQljYXNlICdVJzoKKwkJCU5GU0NUTF9VRFBVTlNFVChwcm90b2JpdHMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYXJndW1lbnQ6ICclYydcbiIsIGMpOworCQljYXNlICdoJzoKKwkJCXVzYWdlKHByb2duYW1lKTsKKwkJfQorCX0KKworCWlmIChvcHRpbmQgPCBhcmdjKSB7CisJCWlmICgoY291bnQgPSBhdG9pKGFyZ3Zbb3B0aW5kXSkpIDwgMCkgeworCQkJLyogaW5zYW5lICMgb2Ygc2VydmVycyAqLworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIiVzOiBpbnZhbGlkIHNlcnZlciBjb3VudCAoJWQpLCB1c2luZyAxXG4iLAorCQkJCWFyZ3ZbMF0sIGNvdW50KTsKKwkJCWNvdW50ID0gMTsKKwkJfSBlbHNlIGlmIChjb3VudCA9PSAwKSB7CisJCQkvKgorCQkJICogZG9uJ3QgYm90aGVyIHNldHRpbmcgYW55dGhpbmcgZWxzZSBpZiB0aGUgdGhyZWFkcworCQkJICogYXJlIGNvbWluZyBkb3duIGFueXdheS4KKwkJCSAqLworCQkJc29ja2V0X3VwID0gMTsKKwkJCWdvdG8gc2V0X3RocmVhZHM7CisJCX0KKwl9CisKKwl4bG9nX29wZW4ocHJvZ25hbWUpOworCisJbmZzZF9lbmFibGVfcHJvdG9zKCZwcm90bzQsICZwcm90bzYpOworCisJaWYgKCFORlNDVExfVENQSVNTRVQocHJvdG9iaXRzKSkgeworCQlORlNDVExfVENQVU5TRVQocHJvdG80KTsKKwkJTkZTQ1RMX1RDUFVOU0VUKHByb3RvNik7CisJfQorCisJaWYgKCFORlNDVExfVURQSVNTRVQocHJvdG9iaXRzKSkgeworCQlORlNDVExfVURQVU5TRVQocHJvdG80KTsKKwkJTkZTQ1RMX1VEUFVOU0VUKHByb3RvNik7CisJfQorCisJLyogbWFrZSBzdXJlIHRoYXQgYXQgbGVhc3Qgb25lIHZlcnNpb24gaXMgZW5hYmxlZCAqLworCWZvdW5kX29uZSA9IDA7CisJZm9yIChjID0gTkZTRF9NSU5WRVJTOyBjIDw9IE5GU0RfTUFYVkVSUzsgYysrKSB7CisJCWlmIChORlNDVExfVkVSSVNTRVQodmVyc2JpdHMsIGMpKQorCQkJZm91bmRfb25lID0gMTsKKwl9CisJaWYgKCFmb3VuZF9vbmUpIHsKKwkJeGxvZyhMX0VSUk9SLCAibm8gdmVyc2lvbiBzcGVjaWZpZWQiKTsKKwkJZXhpdCgxKTsKKwl9CQkJCisKKwlpZiAoTkZTQ1RMX1ZFUklTU0VUKHZlcnNiaXRzLCA0KSAmJgorCSAgICAhTkZTQ1RMX1RDUElTU0VUKHByb3RvNCkgJiYKKwkgICAgIU5GU0NUTF9UQ1BJU1NFVChwcm90bzYpKSB7CisJCXhsb2coTF9FUlJPUiwgInZlcnNpb24gNCByZXF1aXJlcyB0aGUgVENQIHByb3RvY29sIik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKGNoZGlyKE5GU19TVEFURURJUikpIHsKKwkJeGxvZyhMX0VSUk9SLCAiY2hkaXIoJXMpIGZhaWxlZDogJW0iLCBORlNfU1RBVEVESVIpOworCQlleGl0KDEpOworCX0KKworCS8qIGNhbiBvbmx5IGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcyBpZiBuZnNkIGlzIGFscmVhZHkgdXAgKi8KKwlpZiAobmZzc3ZjX2ludXNlKCkpIHsKKwkJc29ja2V0X3VwID0gMTsKKwkJZ290byBzZXRfdGhyZWFkczsKKwl9CisKKwkvKgorCSAqIG11c3Qgc2V0IHZlcnNpb25zIGJlZm9yZSB0aGUgZmQncyBzbyB0aGF0IHRoZSByaWdodCB2ZXJzaW9ucyBnZXQKKwkgKiByZWdpc3RlcmVkIHdpdGggcnBjYmluZC4gTm90ZSB0aGF0IG9uIG9sZGVyIGtlcm5lbHMgdy9vIHRoZSByaWdodAorCSAqIGludGVyZmFjZXMsIHRoZXNlIGFyZSBhIG5vLW9wLgorCSAqLworCW5mc3N2Y19zZXR2ZXJzKHZlcnNiaXRzLCBtaW5vcnZlcnM0KTsKKyAKKwllcnJvciA9IG5mc3N2Y19zZXRfc29ja2V0cyhBRl9JTkVULCBwcm90bzQsIGhhZGRyLCBwb3J0KTsKKwlpZiAoIWVycm9yKQorCQlzb2NrZXRfdXAgPSAxOworCisjaWZkZWYgSVBWNl9TVVBQT1JURUQKKwllcnJvciA9IG5mc3N2Y19zZXRfc29ja2V0cyhBRl9JTkVUNiwgcHJvdG82LCBoYWRkciwgcG9ydCk7CisJaWYgKCFlcnJvcikKKwkJc29ja2V0X3VwID0gMTsKKyNlbmRpZiAvKiBJUFY2X1NVUFBPUlRFRCAqLworCitzZXRfdGhyZWFkczoKKwkvKiBkb24ndCBzdGFydCBhbnkgdGhyZWFkcyBpZiB1bmFibGUgdG8gaGFuZCBvZmYgYW55IHNvY2tldHMgKi8KKwlpZiAoIXNvY2tldF91cCkgeworCQl4bG9nKExfRVJST1IsICJ1bmFibGUgdG8gc2V0IGFueSBzb2NrZXRzIGZvciBuZnNkIik7CisJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IDA7CisKKwkvKgorCSAqIEtMVURHRSBBTEVSVDoKKwkgKiBTb21lIGtlcm5lbHMgbGV0IG5mc2Qga2VybmVsIHRocmVhZHMgaW5oZXJpdCBvcGVuIGZpbGVzCisJICogZnJvbSB0aGUgcHJvZ3JhbSB0aGF0IHNwYXducyB0aGVtIChpLmUuIHVzKS4gIFNvIGNsb3NlCisJICogZXZlcnl0aGluZyBiZWZvcmUgc3Bhd25pbmcga2VybmVsIHRocmVhZHMuICAtLUNoaXAKKwkgKi8KKwlmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJaWYgKGZkID09IC0xKQorCQl4bG9nKExfRVJST1IsICJVbmFibGUgdG8gb3BlbiAvZGV2L251bGw6ICVtIik7CisJZWxzZSB7CisJCS8qIHN3aXRjaCB4bG9nIG91dHB1dCB0byBzeXNsb2cgc2luY2Ugc3RkZXJyIGlzIGJlaW5nIGNsb3NlZCAqLworCQl4bG9nX3N5c2xvZygxKTsKKwkJeGxvZ19zdGRlcnIoMCk7CisJCSh2b2lkKSBkdXAyKGZkLCAwKTsKKwkJKHZvaWQpIGR1cDIoZmQsIDEpOworCQkodm9pZCkgZHVwMihmZCwgMik7CisJfQorCWNsb3NlYWxsKDMpOworCisJaWYgKChlcnJvciA9IG5mc3N2Y190aHJlYWRzKHBvcnRudW0sIGNvdW50KSkgPCAwKQorCQl4bG9nKExfRVJST1IsICJlcnJvciBzdGFydGluZyB0aHJlYWRzOiBlcnJubyAlZCAoJW0pIiwgZXJybm8pOworb3V0OgorCWZyZWUocG9ydCk7CisJZnJlZShoYWRkcik7CisJZnJlZShwcm9nbmFtZSk7CisJcmV0dXJuIChlcnJvciAhPSAwKTsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKGNvbnN0IGNoYXIgKnByb2cpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTpcbiIKKwkJIiVzIFstZHwtLWRlYnVnXSBbLUggaG9zdG5hbWVdIFstcHwtUHwtLXBvcnQgcG9ydF0gWy1OfC0tbm8tbmZzLXZlcnNpb24gdmVyc2lvbiBdIFstc3wtLXN5c2xvZ10gWy1UfC0tbm8tdGNwXSBbLVV8LS1uby11ZHBdIG5yc2VydnNcbiIsIAorCQlwcm9nKTsKKwlleGl0KDIpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzZC5tYW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbmZzZC9uZnNkLm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODk4OGQyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzZC5tYW4KQEAgLTAsMCArMSwxMDUgQEAKKy5cIgorLlwiIG5mc2QoOCkKKy5cIgorLlwiIENvcHlyaWdodCAoQykgMTk5OSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKy5USCBycGMubmZzZCA4ICI3IEF1ZyAyMDA2IgorLlNIIE5BTUUKK3JwYy5uZnNkIFwtIE5GUyBzZXJ2ZXIgcHJvY2VzcworLlNIIFNZTk9QU0lTCisuQkkgIi91c3Ivc2Jpbi9ycGMubmZzZCBbIiBvcHRpb25zICJdIiAiICJucHJvYworLlNIIERFU0NSSVBUSU9OCitUaGUKKy5CIHJwYy5uZnNkCitwcm9ncmFtIGltcGxlbWVudHMgdGhlIHVzZXIgbGV2ZWwgcGFydCBvZiB0aGUgTkZTIHNlcnZpY2UuIFRoZQorbWFpbiBmdW5jdGlvbmFsaXR5IGlzIGhhbmRsZWQgYnkgdGhlCisuQiBuZnNkCitrZXJuZWwgbW9kdWxlLiBUaGUgdXNlciBzcGFjZSBwcm9ncmFtIG1lcmVseSBzcGVjaWZpZXMgd2hhdCBzb3J0IG9mIHNvY2tldHMKK3RoZSBrZXJuZWwgc2VydmljZSBzaG91bGQgbGlzdGVuIG9uLCB3aGF0IE5GUyB2ZXJzaW9ucyBpdCBzaG91bGQgc3VwcG9ydCwgYW5kCitob3cgbWFueSBrZXJuZWwgdGhyZWFkcyBpdCBzaG91bGQgdXNlLgorLlAKK1RoZQorLkIgcnBjLm1vdW50ZAorc2VydmVyIHByb3ZpZGVzIGFuIGFuY2lsbGFyeSBzZXJ2aWNlIG5lZWRlZCB0byBzYXRpc2Z5IG1vdW50IHJlcXVlc3RzCitieSBORlMgY2xpZW50cy4KKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtZCAiIG9yICIgXC1cLWRlYnVnCitlbmFibGUgbG9nZ2luZyBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMKKy5UUAorLkIgXC1IICIgb3IgIiBcLVwtaG9zdCAgaG9zdG5hbWUKK3NwZWNpZnkgYSBwYXJ0aWN1bGFyIGhvc3RuYW1lIChvciBhZGRyZXNzKSB0aGF0IE5GUyByZXF1ZXN0cyB3aWxsCitiZSBhY2NlcHRlZCBvbi4gQnkgZGVmYXVsdCwKKy5CIHJwYy5uZnNkCit3aWxsIGFjY2VwdCBORlMgcmVxdWVzdHMgb24gYWxsIGtub3duIG5ldHdvcmsgYWRkcmVzc2VzLgorTm90ZSB0aGF0CisuQiBsb2NrZAorKHdoaWNoIHBlcmZvcm1zIGZpbGUgbG9ja2luZyBzZXJ2aWNlcyBmb3IgTkZTKSBtYXkgc3RpbGwgYWNjZXB0CityZXF1ZXN0IG9uIGFsbCBrbm93biBuZXR3b3JrIGFkZHJlc3Nlcy4gIFRoaXMgbWF5IGNoYW5nZSBpbiBmdXR1cmUKK3JlbGVhc2VzIG9mIHRoZSBMaW51eCBLZXJuZWwuCisuVFAKKy5CIFwtcCAiIG9yICIgXC1cLXBvcnQgIHBvcnQKK3NwZWNpZnkgYSBkaWZlcmVudCBwb3J0IHRvIGxpc3RlbiBvbiBmb3IgTkZTIHJlcXVlc3RzLiBCeSBkZWZhdWx0LAorLkIgcnBjLm5mc2QKK3dpbGwgbGlzdGVuIG9uIHBvcnQgMjA0OS4KKy5UUAorLkIgXC1OICIgb3IgIiBcLVwtbm8tbmZzLXZlcnNpb24gdmVycworVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCB0aGF0IAorLkIgcnBjLm5mc2QKK2RvZXMgbm90IG9mZmVyIGNlcnRhaW4gdmVyc2lvbnMgb2YgTkZTLiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mCisuQiBycGMubmZzZAorY2FuIHN1cHBvcnQgYm90aCBORlMgdmVyc2lvbiAyLDMgYW5kIHRoZSBuZXdlciB2ZXJzaW9uIDQuCisuVFAKKy5CIFwtcyAiIG9yICIgXC1cLXN5c2xvZworQnkgZGVmYXVsdCwKKy5CIHJwYy5uZnNkCitsb2dzIGVycm9yIG1lc3NhZ2VzIChhbmQgZGVidWcgbWVzc2FnZXMsIGlmIGVuYWJsZWQpIHRvIHN0ZGVyci4gVGhpcyBvcHRpb24gbWFrZXMgCisuQiBycGMubmZzZAorbG9nIHRoZXNlIG1lc3NhZ2VzIHRvIHN5c2xvZyBpbnN0ZWFkLiBOb3RlIHRoYXQgZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZworb3B0aW9uIHByb2Nlc3Npbmcgd2lsbCBzdGlsbCBiZSBsb2dnZWQgdG8gc3RkZXJyIHJlZ2FyZGxlc3Mgb2YgdGhpcyBvcHRpb24uCisuVFAKKy5CIFwtVCAiIG9yICIgXC1cLW5vLXRjcAorRGlzYWJsZSAKKy5CIHJwYy5uZnNkIAorZnJvbSBhY2NlcHRpbmcgVENQIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cy4KKy5UUAorLkIgXC1VICIgb3IgIiBcLVwtbm8tdWRwCitEaXNhYmxlCisuQiBycGMubmZzZAorZnJvbSBhY2NlcHRpbmcgVURQIGNvbm5lY3Rpb25zIGZyb20gY2xpZW50cy4KKy5UUAorLkkgbnByb2MKK3NwZWNpZnkgdGhlIG51bWJlciBvZiBORlMgc2VydmVyIHRocmVhZHMuIEJ5IGRlZmF1bHQsIGp1c3Qgb25lCit0aHJlYWQgaXMgc3RhcnRlZC4gSG93ZXZlciwgZm9yIG9wdGltdW0gcGVyZm9ybWFuY2Ugc2V2ZXJhbCB0aHJlYWRzCitzaG91bGQgYmUgdXNlZC4gVGhlIGFjdHVhbCBmaWd1cmUgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGFuZCB0aGUgd29yaworbG9hZCBjcmVhdGVkIGJ5IHRoZSBORlMgY2xpZW50cywgYnV0IGEgdXNlZnVsIHN0YXJ0aW5nIHBvaW50IGlzCis4IHRocmVhZHMuIEVmZmVjdHMgb2YgbW9kaWZ5aW5nIHRoYXQgbnVtYmVyIGNhbiBiZSBjaGVja2VkIHVzaW5nCit0aGUKKy5CUiBuZnNzdGF0ICg4KQorcHJvZ3JhbS4KKy5QCitOb3RlIHRoYXQgaWYgdGhlIE5GUyBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCB0aGVuIHRoZSBvcHRpb25zIGZvcgorc3BlY2lmeWluZyBob3N0LCBwb3J0LCBhbmQgcHJvdG9jb2wgd2lsbCBiZSBpZ25vcmVkLiAgVGhlIG51bWJlciBvZgorcHJvY2Vzc2VzIGdpdmVuIHdpbGwgYmUgdGhlIG9ubHkgb3B0aW9uIGNvbnNpZGVyZWQsIGFuZCB0aGUgbnVtYmVyIG9mCithY3RpdmUKKy5CIG5mc2QKK3Byb2Nlc3NlcyB3aWxsIGJlIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgdG8gbWF0Y2ggdGhpcyBudW1iZXIuCitJbiBwYXJ0aWN1bGFyCisuQiBycGMubmZzZCAwCit3aWxsIHN0b3AgYWxsIHRocmVhZHMgYW5kIHRodXMgY2xvc2UgYW55IG9wZW4gY29ubmVjdGlvbnMuCisKKy5TSCBOT1RFUworSWYgdGhlIHByb2dyYW0gaXMgYnVpbHQgd2l0aCBUSS1SUEMgc3VwcG9ydCwgaXQgd2lsbCBlbmFibGUgYW55IHByb3RvY29sIGFuZAorYWRkcmVzcyBmYW1pbHkgY29tYmluYXRpb25zIHRoYXQgYXJlIG1hcmtlZCB2aXNpYmxlIGluIHRoZQorLkIgbmV0Y29uZmlnCitkYXRhYmFzZS4KKworLlNIIFNFRSBBTFNPCisuQlIgcnBjLm1vdW50ZCAoOCksCisuQlIgZXhwb3J0cyAoNSksCisuQlIgZXhwb3J0ZnMgKDgpLAorLkJSIHJwYy5ycXVvdGFkICg4KSwKKy5CUiBuZnNzdGF0ICg4KSwKKy5CUiBuZXRjb25maWcoNSkuCisuU0ggQVVUSE9SCitPbGFmIEtpcmNoLCBCaWxsIEhhd2VzLCBILiBKLiBMdSwgRy4gQWxsYW4gTW9ycmlzIElJSSwKK2FuZCBhIGhvc3Qgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzc3ZjLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbmZzZC9uZnNzdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIzMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzc3ZjLmMKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiB1dGlscy9uZnNkL25mc3N2Yy5jCisgKgorICogUnVuIGFuIE5GUyBkYWVtb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJuZnNsaWIuaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisKKy8qCisgKiBJUHY2IHN1cHBvcnQgZm9yIG5mc2Qgd2FzIGZpbmlzaGVkIGJlZm9yZSBzb21lIG9mIHRoZSBvdGhlciBkYWVtb25zIChtb3VudGQKKyAqIGFuZCBzdGF0ZCBpbiBwYXJ0aWN1bGFyKS4gVGhhdCBjb3VsZCBiZSBhIHByb2JsZW0gaW4gdGhlIGZ1dHVyZSBpZiBzb21lb25lCisgKiB3ZXJlIHRvIGJvb3QgYSBrZXJuZWwgdGhhdCBzdXBwb3J0cyBJUHY2IHNlcnZpbmcgd2l0aCBhbiBvbGRlciBuZnMtdXRpbHMuIEZvcgorICogbm93LCBoYXJkY29kZSB0aGUgSVB2NiBzd2l0Y2ggaW50byB0aGUgb2ZmIHBvc2l0aW9uIHVudGlsIHRoZSBvdGhlciBkYWVtb25zCisgKiBhcmUgZnVuY3Rpb25hbC4KKyAqLworI3VuZGVmIElQVjZfU1VQUE9SVEVECisKKyNkZWZpbmUgTkZTRF9QT1JUU19GSUxFICAgICAiL3Byb2MvZnMvbmZzZC9wb3J0bGlzdCIKKyNkZWZpbmUgTkZTRF9WRVJTX0ZJTEUgICAgIi9wcm9jL2ZzL25mc2QvdmVyc2lvbnMiCisjZGVmaW5lIE5GU0RfVEhSRUFEX0ZJTEUgICIvcHJvYy9mcy9uZnNkL3RocmVhZHMiCisKKy8qCisgKiBkZWNsYXJpbmcgYSBjb21tb24gc3RhdGljIHNjcmF0Y2ggYnVmZmVyIGhlcmUga2VlcHMgdXMgZnJvbSBoYXZpbmcgdG8KKyAqIGNvbnRpbnVhbGx5IHRocmFzaCB0aGUgc3RhY2suIFRoZSB2YWx1ZSBvZiAxMjggYnl0ZXMgaGVyZSBpcyByZWFsbHkganVzdCBhCisgKiBTV0FHIGFuZCBjYW4gYmUgaW5jcmVhc2VkIGlmIG5lY2Vzc2FyeS4gSXQgb3VnaHQgdG8gYmUgZW5vdWdoIGZvciB0aGUKKyAqIHJvdXRpbmVzIGJlbG93IGhvd2V2ZXIuCisgKi8KK2NoYXIgYnVmWzEyOF07CisKKy8qCisgKiBBcmUgdGhlcmUgYWxyZWFkeSBzb2NrZXRzIGNvbmZpZ3VyZWQ/IElmIG5vdCwgdGhlbiBpdCBpcyBzYWZlIHRvIHRyeSB0bworICogb3BlbiBzb21lIGFuZCBwYXNzIHRoZW0gdGhyb3VnaC4KKyAqCisgKiBOb3RlOiBJZiB0aGUgdXNlciBleHBsaWNpdGx5IGFza2VkIGZvciAndWRwJywgdGhlbiB3ZSBzaG91bGQgcHJvYmFibHkgY2hlY2sKKyAqIGlmIHRoYXQgaXMgb3BlbiwgYW5kIHNob3VsZCBvcGVuIGl0IGlmIG5vdC4gSG93ZXZlciB3ZSBkb24ndCB5ZXQuIEFsbAorICogc29ja2V0cyBoYXZlIHRvIGJlIG9wZW5lZCB3aGVuIHRoZSBmaXJzdCBkYWVtb24gaXMgc3RhcnRlZC4KKyAqLworaW50CituZnNzdmNfaW51c2Uodm9pZCkKK3sKKwlpbnQgZmQsIG47CisKKwlmZCA9IG9wZW4oTkZTRF9QT1JUU19GSUxFLCBPX1JET05MWSk7CisKKwkvKiBwcm9ibGVtIG9wZW5pbmcgZmlsZSwgYXNzdW1lIHRoYXQgbm90aGluZyBpcyBjb25maWd1cmVkICovCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDA7CisKKwluID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJY2xvc2UoZmQpOworCisJeGxvZyhEX0dFTkVSQUwsICJrbmZzZCBpcyBjdXJyZW50bHkgJXMiLCAobiA+IDApID8gInVwIiA6ICJkb3duIik7CisKKwlyZXR1cm4gKG4gPiAwKTsKK30KKworc3RhdGljIGludAorbmZzc3ZjX3NldGZkcyhjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzLCBjb25zdCBjaGFyICpub2RlLCBjb25zdCBjaGFyICpwb3J0KQoreworCWludCBmZCwgb24gPSAxLCBmYWMgPSBMX0VSUk9SOworCWludCBzb2NrZmQgPSAtMSwgcmMgPSAwOworCXN0cnVjdCBhZGRyaW5mbyAqYWRkcmhlYWQgPSBOVUxMLCAqYWRkcjsKKwljaGFyICpwcm90bywgKmZhbWlseTsKKworCS8qCisJICogaWYgZmlsZSBjYW4ndCBiZSBvcGVuZWQsIHRoZW4gYXNzdW1lIHRoYXQgaXQncyBub3QgYXZhaWxhYmxlIGFuZAorCSAqIHRoYXQgdGhlIGNhbGxlciBzaG91bGQganVzdCBmYWxsIGJhY2sgdG8gdGhlIG9sZCBuZnNjdGwgaW50ZXJmYWNlCisgCSAqLworCWZkID0gb3BlbihORlNEX1BPUlRTX0ZJTEUsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaChoaW50cy0+YWlfZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlmYW1pbHkgPSAiaW5ldCI7CisJCWJyZWFrOworI2lmZGVmIElQVjZfU1VQUE9SVEVECisJY2FzZSBBRl9JTkVUNjoKKwkJZmFtaWx5ID0gImluZXQ2IjsKKwkJYnJlYWs7CisjZW5kaWYgLyogSVBWNl9TVVBQT1JURUQgKi8KKwlkZWZhdWx0OgorCQl4bG9nKExfRVJST1IsICJVbmtub3duIGFkZHJlc3MgZmFtaWx5IHNwZWNpZmllZDogJWRcbiIsCisJCQkJaGludHMtPmFpX2ZhbWlseSk7CisJCXJjID0gRUFGTk9TVVBQT1JUOworCQlnb3RvIGVycm9yOworCX0KKworCXJjID0gZ2V0YWRkcmluZm8obm9kZSwgcG9ydCwgaGludHMsICZhZGRyaGVhZCk7CisJaWYgKHJjID09IEVBSV9OT05BTUUgJiYgIXN0cmNtcChwb3J0LCAibmZzIikpIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgTkZTX1BPUlQpOworCQlyYyA9IGdldGFkZHJpbmZvKG5vZGUsIGJ1ZiwgaGludHMsICZhZGRyaGVhZCk7CisJfQorCisJaWYgKHJjICE9IDApIHsKKwkJeGxvZyhMX0VSUk9SLCAidW5hYmxlIHRvIHJlc29sdmUgJXM6JXMgdG8gJXMgYWRkcmVzczogIgorCQkJCSIlcyIsIG5vZGUgPyBub2RlIDogIkFOWUFERFIiLCBwb3J0LCBmYW1pbHksCisJCQkJcmMgPT0gRUFJX1NZU1RFTSA/IHN0cmVycm9yKGVycm5vKSA6CisJCQkJCWdhaV9zdHJlcnJvcihyYykpOworCQlnb3RvIGVycm9yOworCX0KKworCWFkZHIgPSBhZGRyaGVhZDsKKwl3aGlsZShhZGRyKSB7CisJCS8qIHNraXAgbm9uLVRDUCAvIG5vbi1VRFAgc29ja2V0cyAqLworCQlzd2l0Y2goYWRkci0+YWlfcHJvdG9jb2wpIHsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCXByb3RvID0gIlVEUCI7CisJCQlicmVhazsKKwkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCXByb3RvID0gIlRDUCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWFkZHIgPSBhZGRyLT5haV9uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQl4bG9nKERfR0VORVJBTCwgIkNyZWF0aW5nICVzICVzIHNvY2tldC4iLCBmYW1pbHksIHByb3RvKTsKKworCQkvKiBvcGVuIHNvY2tldCBhbmQgcHJlcGFyZSB0byBoYW5kIGl0IG9mZiB0byBrZXJuZWwgKi8KKwkJc29ja2ZkID0gc29ja2V0KGFkZHItPmFpX2ZhbWlseSwgYWRkci0+YWlfc29ja3R5cGUsCisJCQkJYWRkci0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29ja2ZkIDwgMCkgeworCQkJeGxvZyhMX0VSUk9SLCAidW5hYmxlIHRvIGNyZWF0ZSAlcyAlcyBzb2NrZXQ6ICIKKwkJCQkiZXJybm8gJWQgKCVtKSIsIGZhbWlseSwgcHJvdG8sIGVycm5vKTsKKwkJCXJjID0gZXJybm87CisJCQlnb3RvIGVycm9yOworCQl9CisjaWZkZWYgSVBWNl9TVVBQT1JURUQKKwkJaWYgKGFkZHItPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJgorCQkgICAgc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksICZvbiwgc2l6ZW9mKG9uKSkpIHsKKwkJCXhsb2coTF9FUlJPUiwgInVuYWJsZSB0byBzZXQgSVBWNl9WNk9OTFk6ICIKKwkJCQkiZXJybm8gJWQgKCVtKVxuIiwgZXJybm8pOworCQkJcmMgPSBlcnJubzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKyNlbmRpZiAvKiBJUFY2X1NVUFBPUlRFRCAqLworCQlpZiAoYWRkci0+YWlfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgJiYKKwkJICAgIHNldHNvY2tvcHQoc29ja2ZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSkpIHsKKwkJCXhsb2coTF9FUlJPUiwgInVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSIG9uICVzICIKKwkJCQkic29ja2V0OiBlcnJubyAlZCAoJW0pIiwgZmFtaWx5LCBlcnJubyk7CisJCQlyYyA9IGVycm5vOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoYmluZChzb2NrZmQsIGFkZHItPmFpX2FkZHIsIGFkZHItPmFpX2FkZHJsZW4pKSB7CisJCQl4bG9nKExfRVJST1IsICJ1bmFibGUgdG8gYmluZCAlcyAlcyBzb2NrZXQ6ICIKKwkJCQkiZXJybm8gJWQgKCVtKSIsIGZhbWlseSwgcHJvdG8sIGVycm5vKTsKKwkJCXJjID0gZXJybm87CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChhZGRyLT5haV9wcm90b2NvbCA9PSBJUFBST1RPX1RDUCAmJiBsaXN0ZW4oc29ja2ZkLCA2NCkpIHsKKwkJCXhsb2coTF9FUlJPUiwgInVuYWJsZSB0byBjcmVhdGUgbGlzdGVuaW5nIHNvY2tldDogIgorCQkJCSJlcnJubyAlZCAoJW0pIiwgZXJybm8pOworCQkJcmMgPSBlcnJubzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAoZmQgPCAwKQorCQkJZmQgPSBvcGVuKE5GU0RfUE9SVFNfRklMRSwgT19XUk9OTFkpOworCisJCWlmIChmZCA8IDApIHsKKwkJCXhsb2coTF9FUlJPUiwgImNvdWxkbid0IG9wZW4gcG9ydHMgZmlsZTogZXJybm8gIgorCQkJCSAgICAgICIlZCAoJW0pIiwgZXJybm8pOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZFxuIiwgc29ja2ZkKTsgCisJCWlmICh3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSkgIT0gc3RybGVuKGJ1ZikpIHsKKwkJCS8qCisJCQkgKiB0aGlzIGVycm9yIG1heSBiZSBjb21tb24gb24gb2xkZXIga2VybmVscyB0aGF0IGRvbid0CisJCQkgKiBzdXBwb3J0IElQdjYsIHNvIHR1cm4gaW50byBhIGRlYnVnIG1lc3NhZ2UuCisJCQkgKi8KKwkJCWlmIChlcnJubyA9PSBFQUZOT1NVUFBPUlQpCisJCQkJZmFjID0gRF9BTEw7CisJCQl4bG9nKGZhYywgIndyaXRpbmcgZmQgdG8ga2VybmVsIGZhaWxlZDogZXJybm8gJWQgKCVtKSIsCisJCQkJICBlcnJubyk7CisJCQlyYyA9IGVycm5vOworCQkJZ290byBlcnJvcjsKKwkJfQorCQljbG9zZShmZCk7CisJCWNsb3NlKHNvY2tmZCk7CisJCXNvY2tmZCA9IGZkID0gLTE7CisJCWFkZHIgPSBhZGRyLT5haV9uZXh0OworCX0KK2Vycm9yOgorCWlmIChmZCA+PSAwKQorCQljbG9zZShmZCk7CisJaWYgKHNvY2tmZCA+PSAwKQorCQljbG9zZShzb2NrZmQpOworCWlmIChhZGRyaGVhZCkKKwkJZnJlZWFkZHJpbmZvKGFkZHJoZWFkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorbmZzc3ZjX3NldF9zb2NrZXRzKGNvbnN0IGludCBmYW1pbHksIGNvbnN0IHVuc2lnbmVkIGludCBwcm90b2JpdHMsCisJCSAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnBvcnQpCit7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geyAuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIH07CisKKwloaW50cy5haV9mYW1pbHkgPSBmYW1pbHk7CisKKwlpZiAoIU5GU0NUTF9BTllQUk9UTyhwcm90b2JpdHMpKQorCQlyZXR1cm4gRVBST1RPVFlQRTsKKwllbHNlIGlmICghTkZTQ1RMX1VEUElTU0VUKHByb3RvYml0cykpCisJCWhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisJZWxzZSBpZiAoIU5GU0NUTF9UQ1BJU1NFVChwcm90b2JpdHMpKQorCQloaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworCisJcmV0dXJuIG5mc3N2Y19zZXRmZHMoJmhpbnRzLCBob3N0LCBwb3J0KTsKK30KKwordm9pZAorbmZzc3ZjX3NldHZlcnModW5zaWduZWQgaW50IGN0bGJpdHMsIGludCBtaW5vcnZlcnM0KQoreworCWludCBmZCwgbiwgb2ZmOworCWNoYXIgKnB0cjsKKworCXB0ciA9IGJ1ZjsKKwlvZmYgPSAwOworCWZkID0gb3BlbihORlNEX1ZFUlNfRklMRSwgT19XUk9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybjsKKworCW4gPSBtaW5vcnZlcnM0ID49IDAgPyBtaW5vcnZlcnM0IDogLW1pbm9ydmVyczQ7CisJaWYgKG4gPj0gTkZTRF9NSU5NSU5PUlZFUlM0ICYmIG4gPD0gTkZTRF9NQVhNSU5PUlZFUlM0KQorCQkgICAgb2ZmICs9IHNucHJpbnRmKHB0citvZmYsIHNpemVvZihidWYpIC0gb2ZmLCAiJWM0LiVkICIsCisJCQkJICAgIG1pbm9ydmVyczQgPiAwID8gJysnIDogJy0nLAorCQkJCSAgICBuKTsKKwlmb3IgKG4gPSBORlNEX01JTlZFUlM7IG4gPD0gTkZTRF9NQVhWRVJTOyBuKyspIHsKKwkJaWYgKE5GU0NUTF9WRVJJU1NFVChjdGxiaXRzLCBuKSkKKwkJICAgIG9mZiArPSBzbnByaW50ZihwdHIrb2ZmLCBzaXplb2YoYnVmKSAtIG9mZiwgIislZCAiLCBuKTsKKwkJZWxzZQorCQkgICAgb2ZmICs9IHNucHJpbnRmKHB0citvZmYsIHNpemVvZihidWYpIC0gb2ZmLCAiLSVkICIsIG4pOworCX0KKwl4bG9nKERfR0VORVJBTCwgIldyaXRpbmcgdmVyc2lvbiBzdHJpbmcgdG8ga2VybmVsOiAlcyIsIGJ1Zik7CisJc25wcmludGYocHRyK29mZiwgc2l6ZW9mKGJ1ZikgLSBvZmYsICJcbiIpOworCWlmICh3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSkgIT0gc3RybGVuKGJ1ZikpCisJCXhsb2coTF9FUlJPUiwgIlNldHRpbmcgdmVyc2lvbiBmYWlsZWQ6IGVycm5vICVkICglbSkiLCBlcnJubyk7CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm47Cit9CisKK2ludAorbmZzc3ZjX3RocmVhZHModW5zaWduZWQgc2hvcnQgcG9ydCwgY29uc3QgaW50IG5yc2VydnMpCit7CisJc3RydWN0IG5mc2N0bF9hcmcJYXJnOworCXN0cnVjdCBzZXJ2ZW50ICplbnQ7CisJc3NpemVfdCBuOworCWludCBmZDsKKworCWZkID0gb3BlbihORlNEX1RIUkVBRF9GSUxFLCBPX1dST05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZmQgPSBvcGVuKCIvcHJvYy9mcy9uZnMvdGhyZWFkcyIsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQkvKiAyLjUrIGtlcm5lbCB3aXRoIG5mc2QgZmlsZXN5c3RlbSBtb3VudGVkLgorCQkgKiBKdXN0IHdyaXRlIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4KKwkJICovCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZFxuIiwgbnJzZXJ2cyk7CisJCW4gPSB3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKG4gIT0gc3RybGVuKGJ1ZikpCisJCQlyZXR1cm4gLTE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCWlmICghcG9ydCkgeworCQllbnQgPSBnZXRzZXJ2YnluYW1lKCJuZnMiLCAidWRwIik7CisJCWlmIChlbnQgIT0gTlVMTCkKKwkJCXBvcnQgPSBudG9ocyhlbnQtPnNfcG9ydCk7CisJCWVsc2UKKwkJCXBvcnQgPSBORlNfUE9SVDsKKwl9CisKKwlhcmcuY2FfdmVyc2lvbiA9IE5GU0NUTF9WRVJTSU9OOworCWFyZy5jYV9zdmMuc3ZjX250aHJlYWRzID0gbnJzZXJ2czsKKwlhcmcuY2Ffc3ZjLnN2Y19wb3J0ID0gcG9ydDsKKwlyZXR1cm4gbmZzY3RsKE5GU0NUTF9TVkMsICZhcmcsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzc3ZjLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbmZzZC9uZnNzdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzY5YmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc2QvbmZzc3ZjLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqICAgdXRpbHMvbmZzZC9uZnNzdmMuaCAtLSBuZnMgc2VydmljZSBjb250cm9sIHJvdXRpbmVzIGZvciBycGMubmZzZAorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYyA8bmZzQHJlZGhhdC5jb20+LgorICogICBDb3B5cmlnaHQgKEMpIDIwMDkgSmVmZiBMYXl0b24gPGpsYXl0b25AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworaW50CW5mc3N2Y19pbnVzZSh2b2lkKTsKK2ludAluZnNzdmNfc2V0X3NvY2tldHMoY29uc3QgaW50IGZhbWlseSwgY29uc3QgdW5zaWduZWQgaW50IHByb3RvYml0cywKKwkJCSAgIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKnBvcnQpOwordm9pZAluZnNzdmNfc2V0dmVycyh1bnNpZ25lZCBpbnQgY3RsYml0cywgaW50IG1pbm9ydmVyczQpOworaW50CW5mc3N2Y190aHJlYWRzKHVuc2lnbmVkIHNob3J0IHBvcnQsIGludCBucnNlcnZzKTsKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNzdGF0L01ha2VmaWxlLmFtIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc3N0YXQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjYjEwOAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNzdGF0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTIgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCittYW44X01BTlMJPSBuZnNzdGF0Lm1hbgorRVhUUkFfRElTVAk9ICQobWFuOF9NQU5TKQorCitzYmluX1BST0dSQU1TCT0gbmZzc3RhdAorbmZzc3RhdF9TT1VSQ0VTID0gbmZzc3RhdC5jCituZnNzdGF0X0xEQUREID0gLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEgXAorCSAgICAgIAkuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJCS4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc3N0YXQvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbmZzc3RhdC9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE0N2JiCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc3N0YXQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw2NDcgQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKK1ZQQVRIID0gQHNyY2RpckAKK3BrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAorcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACitwa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACitwa2dsaWJleGVjZGlyID0gJChsaWJleGVjZGlyKS9AUEFDS0FHRUAKK2FtX19jZCA9IENEUEFUSD0iJCR7WlNIX1ZFUlNJT04rLn0kKFBBVEhfU0VQQVJBVE9SKSIgJiYgY2QKK2luc3RhbGxfc2hfREFUQSA9ICQoaW5zdGFsbF9zaCkgLWMgLW0gNjQ0CitpbnN0YWxsX3NoX1BST0dSQU0gPSAkKGluc3RhbGxfc2gpIC1jCitpbnN0YWxsX3NoX1NDUklQVCA9ICQoaW5zdGFsbF9zaCkgLWMKK0lOU1RBTExfSEVBREVSID0gJChJTlNUQUxMX0RBVEEpCit0cmFuc2Zvcm0gPSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpCitOT1JNQUxfSU5TVEFMTCA9IDoKK1BSRV9JTlNUQUxMID0gOgorUE9TVF9JTlNUQUxMID0gOgorTk9STUFMX1VOSU5TVEFMTCA9IDoKK1BSRV9VTklOU1RBTEwgPSA6CitQT1NUX1VOSU5TVEFMTCA9IDoKK2J1aWxkX3RyaXBsZXQgPSBAYnVpbGRACitob3N0X3RyaXBsZXQgPSBAaG9zdEAKK3NiaW5fUFJPR1JBTVMgPSBuZnNzdGF0JChFWEVFWFQpCitzdWJkaXIgPSB1dGlscy9uZnNzdGF0CitESVNUX0NPTU1PTiA9ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuaW4KK0FDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKK2FtX19hY2xvY2FsX200X2RlcHMgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwvYnNkc2lnbmFscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2lwdjYubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9rZXJiZXJvczUubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJibGtpZC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmNhcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmV2ZW50Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlibmZzaWRtYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJycGNzZWNnc3MubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJ0aXJwYy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL25mcy11dGlscy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3JwY3NlY192ZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvdGNwLXdyYXBwZXJzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5hYworYW1fX2NvbmZpZ3VyZV9kZXBzID0gJChhbV9fYWNsb2NhbF9tNF9kZXBzKSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpIFwKKwkkKEFDTE9DQUxfTTQpCitta2luc3RhbGxkaXJzID0gJChpbnN0YWxsX3NoKSAtZAorQ09ORklHX0hFQURFUiA9ICQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUvY29uZmlnLmgKK0NPTkZJR19DTEVBTl9GSUxFUyA9CitDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMgPQorYW1fX2luc3RhbGxkaXJzID0gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiCitQUk9HUkFNUyA9ICQoc2Jpbl9QUk9HUkFNUykKK2FtX25mc3N0YXRfT0JKRUNUUyA9IG5mc3N0YXQuJChPQkpFWFQpCituZnNzdGF0X09CSkVDVFMgPSAkKGFtX25mc3N0YXRfT0JKRUNUUykKK25mc3N0YXRfREVQRU5ERU5DSUVTID0gLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEgXAorCS4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQobmZzc3RhdF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChuZnNzdGF0X1NPVVJDRVMpCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCittYW44ZGlyID0gJChtYW5kaXIpL21hbjgKK05ST0ZGID0gbnJvZmYKK01BTlMgPSAkKG1hbjhfTUFOUykKK0VUQUdTID0gZXRhZ3MKK0NUQUdTID0gY3RhZ3MKK0RJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoRElTVF9TT1VSQ0VTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCitBQ0xPQ0FMID0gQEFDTE9DQUxACitBQ0xPQ0FMX0FNRkxBR1MgPSBAQUNMT0NBTF9BTUZMQUdTQAorQUxMT0NBID0gQEFMTE9DQUAKK0FNVEFSID0gQEFNVEFSQAorQU1fQ0ZMQUdTID0gQEFNX0NGTEFHU0AKK0FNX0NQUEZMQUdTID0gQEFNX0NQUEZMQUdTQAorQVIgPSBAQVJACitBVVRPQ09ORiA9IEBBVVRPQ09ORkAKK0FVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKK0FVVE9NQUtFID0gQEFVVE9NQUtFQAorQVdLID0gQEFXS0AKK0NDID0gQENDQAorQ0NERVBNT0RFID0gQENDREVQTU9ERUAKK0NDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACitDRkxBR1MgPSBAQ0ZMQUdTQAorQ0ZMQUdTX0ZPUl9CVUlMRCA9IEBDRkxBR1NfRk9SX0JVSUxEQAorQ1BQID0gQENQUEAKK0NQUEZMQUdTID0gQENQUEZMQUdTQAorQ1BQRkxBR1NfRk9SX0JVSUxEID0gQENQUEZMQUdTX0ZPUl9CVUlMREAKK0NYWCA9IEBDWFhACitDWFhDUFAgPSBAQ1hYQ1BQQAorQ1hYREVQTU9ERSA9IEBDWFhERVBNT0RFQAorQ1hYRkxBR1MgPSBAQ1hYRkxBR1NACitDWFhGTEFHU19GT1JfQlVJTEQgPSBAQ1hYRkxBR1NfRk9SX0JVSUxEQAorQ1lHUEFUSF9XID0gQENZR1BBVEhfV0AKK0RFRlMgPSBAREVGU0AKK0RFUERJUiA9IEBERVBESVJACitEU1lNVVRJTCA9IEBEU1lNVVRJTEAKK0RVTVBCSU4gPSBARFVNUEJJTkAKK0VDSE9fQyA9IEBFQ0hPX0NACitFQ0hPX04gPSBARUNIT19OQAorRUNIT19UID0gQEVDSE9fVEAKK0VHUkVQID0gQEVHUkVQQAorRVhFRVhUID0gQEVYRUVYVEAKK0ZHUkVQID0gQEZHUkVQQAorR1JFUCA9IEBHUkVQQAorR1NTRCA9IEBHU1NEQAorR1NTR0xVRV9DRkxBR1MgPSBAR1NTR0xVRV9DRkxBR1NACitHU1NHTFVFX0xJQlMgPSBAR1NTR0xVRV9MSUJTQAorSEFWRV9MSUJXUkFQID0gQEhBVkVfTElCV1JBUEAKK0hBVkVfVENQX1dSQVBQRVIgPSBASEFWRV9UQ1BfV1JBUFBFUkAKK0lETUFQRCA9IEBJRE1BUERACitJTlNUQUxMID0gQElOU1RBTExACitJTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAorSU5TVEFMTF9TVFJJUF9QUk9HUkFNID0gQElOU1RBTExfU1RSSVBfUFJPR1JBTUAKK0s1VkVSUyA9IEBLNVZFUlNACitLUkJDRkxBR1MgPSBAS1JCQ0ZMQUdTQAorS1JCRElSID0gQEtSQkRJUkAKK0tSQkxERkxBR1MgPSBAS1JCTERGTEFHU0AKK0tSQkxJQlMgPSBAS1JCTElCU0AKK0xEID0gQExEQAorTERGTEFHUyA9IEBMREZMQUdTQAorTERGTEFHU19GT1JfQlVJTEQgPSBATERGTEFHU19GT1JfQlVJTERACitMSUJCTEtJRCA9IEBMSUJCTEtJREAKK0xJQkJTRCA9IEBMSUJCU0RACitMSUJDQVAgPSBATElCQ0FQQAorTElCQ1JZUFQgPSBATElCQ1JZUFRACitMSUJOU0wgPSBATElCTlNMQAorTElCT0JKUyA9IEBMSUJPQkpTQAorTElCUyA9IEBMSUJTQAorTElCU09DS0VUID0gQExJQlNPQ0tFVEAKK0xJQlRPT0wgPSBATElCVE9PTEAKK0xJQldSQVAgPSBATElCV1JBUEAKK0xJUE8gPSBATElQT0AKK0xOX1MgPSBATE5fU0AKK0xUTElCT0JKUyA9IEBMVExJQk9CSlNACitNQUlOVCA9IEBNQUlOVEAKK01BS0VJTkZPID0gQE1BS0VJTkZPQAorTUtESVJfUCA9IEBNS0RJUl9QQAorTk0gPSBATk1ACitOTUVESVQgPSBATk1FRElUQAorT0JKRFVNUCA9IEBPQkpEVU1QQAorT0JKRVhUID0gQE9CSkVYVEAKK09UT09MID0gQE9UT09MQAorT1RPT0w2NCA9IEBPVE9PTDY0QAorUEFDS0FHRSA9IEBQQUNLQUdFQAorUEFDS0FHRV9CVUdSRVBPUlQgPSBAUEFDS0FHRV9CVUdSRVBPUlRACitQQUNLQUdFX05BTUUgPSBAUEFDS0FHRV9OQU1FQAorUEFDS0FHRV9TVFJJTkcgPSBAUEFDS0FHRV9TVFJJTkdACitQQUNLQUdFX1RBUk5BTUUgPSBAUEFDS0FHRV9UQVJOQU1FQAorUEFDS0FHRV9WRVJTSU9OID0gQFBBQ0tBR0VfVkVSU0lPTkAKK1BBVEhfU0VQQVJBVE9SID0gQFBBVEhfU0VQQVJBVE9SQAorUEtHX0NPTkZJRyA9IEBQS0dfQ09ORklHQAorUkFOTElCID0gQFJBTkxJQkAKK1JFTEVBU0UgPSBAUkVMRUFTRUAKK1JQQ0dFTl9QQVRIID0gQFJQQ0dFTl9QQVRIQAorUlBDU0VDR1NTX0NGTEFHUyA9IEBSUENTRUNHU1NfQ0ZMQUdTQAorUlBDU0VDR1NTX0xJQlMgPSBAUlBDU0VDR1NTX0xJQlNACitTRUQgPSBAU0VEQAorU0VUX01BS0UgPSBAU0VUX01BS0VACitTSEVMTCA9IEBTSEVMTEAKK1NUUklQID0gQFNUUklQQAorU1ZDR1NTRCA9IEBTVkNHU1NEQAorVkVSU0lPTiA9IEBWRVJTSU9OQAorYWJzX2J1aWxkZGlyID0gQGFic19idWlsZGRpckAKK2Fic19zcmNkaXIgPSBAYWJzX3NyY2RpckAKK2Fic190b3BfYnVpbGRkaXIgPSBAYWJzX3RvcF9idWlsZGRpckAKK2Fic190b3Bfc3JjZGlyID0gQGFic190b3Bfc3JjZGlyQAorYWNfY3RfQ0MgPSBAYWNfY3RfQ0NACithY19jdF9DWFggPSBAYWNfY3RfQ1hYQAorYWNfY3RfRFVNUEJJTiA9IEBhY19jdF9EVU1QQklOQAorYW1fX2luY2x1ZGUgPSBAYW1fX2luY2x1ZGVACithbV9fbGVhZGluZ19kb3QgPSBAYW1fX2xlYWRpbmdfZG90QAorYW1fX3F1b3RlID0gQGFtX19xdW90ZUAKK2FtX190YXIgPSBAYW1fX3RhckAKK2FtX191bnRhciA9IEBhbV9fdW50YXJACitiaW5kaXIgPSBAYmluZGlyQAorYnVpbGQgPSBAYnVpbGRACitidWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKK2J1aWxkX2NwdSA9IEBidWlsZF9jcHVACitidWlsZF9vcyA9IEBidWlsZF9vc0AKK2J1aWxkX3ZlbmRvciA9IEBidWlsZF92ZW5kb3JACitidWlsZGRpciA9IEBidWlsZGRpckAKK2RhdGFkaXIgPSBAZGF0YWRpckAKK2RhdGFyb290ZGlyID0gQGRhdGFyb290ZGlyQAorZG9jZGlyID0gQGRvY2RpckAKK2R2aWRpciA9IEBkdmlkaXJACitlbmFibGVfZ3NzID0gQGVuYWJsZV9nc3NACitlbmFibGVfaXB2NiA9IEBlbmFibGVfaXB2NkAKK2VuYWJsZV9tb3VudGNvbmZpZyA9IEBlbmFibGVfbW91bnRjb25maWdACitlbmFibGVfbmZzdjMgPSBAZW5hYmxlX25mc3YzQAorZW5hYmxlX25mc3Y0ID0gQGVuYWJsZV9uZnN2NEAKK2VuYWJsZV9uZnN2NDEgPSBAZW5hYmxlX25mc3Y0MUAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAoraG9zdCA9IEBob3N0QAoraG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAoraG9zdF9jcHUgPSBAaG9zdF9jcHVACitob3N0X29zID0gQGhvc3Rfb3NACitob3N0X3ZlbmRvciA9IEBob3N0X3ZlbmRvckAKK2h0bWxkaXIgPSBAaHRtbGRpckAKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKK2luZm9kaXIgPSBAaW5mb2RpckAKK2luc3RhbGxfc2ggPSBAaW5zdGFsbF9zaEAKK2twcmVmaXggPSBAa3ByZWZpeEAKK2xpYmRpciA9IEBsaWJkaXJACitsaWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACitsb2NhbGVkaXIgPSBAbG9jYWxlZGlyQAorbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAorbHRfRUNITyA9IEBsdF9FQ0hPQAorbWFuZGlyID0gQG1hbmRpckAKK21rZGlyX3AgPSBAbWtkaXJfcEAKK21vdW50ZmlsZSA9IEBtb3VudGZpbGVACitvbGRpbmNsdWRlZGlyID0gQG9sZGluY2x1ZGVkaXJACitwZGZkaXIgPSBAcGRmZGlyQAorcHJlZml4ID0gQHByZWZpeEAKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUgPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKK3BzZGlyID0gQHBzZGlyQAorc2JpbmRpciA9IEBzYmluZGlyQAorc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACitzcmNkaXIgPSBAc3JjZGlyQAorc3RhcnRzdGF0ZCA9IEBzdGFydHN0YXRkQAorc3RhdGR1c2VyID0gQHN0YXRkdXNlckAKK3N0YXRlZGlyID0gQHN0YXRlZGlyQAorc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAordGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKK3RvcF9idWlsZF9wcmVmaXggPSBAdG9wX2J1aWxkX3ByZWZpeEAKK3RvcF9idWlsZGRpciA9IEB0b3BfYnVpbGRkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACittYW44X01BTlMgPSBuZnNzdGF0Lm1hbgorRVhUUkFfRElTVCA9ICQobWFuOF9NQU5TKQorbmZzc3RhdF9TT1VSQ0VTID0gbmZzc3RhdC5jCituZnNzdGF0X0xEQUREID0gLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEgXAorCSAgICAgIAkuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJCS4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorYWxsOiBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvbmZzc3RhdC9NYWtlZmlsZSc7IFwKKwkkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSAmJiBcCisJICAkKEFVVE9NQUtFKSAtLWdudSB1dGlscy9uZnNzdGF0L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgoraW5zdGFsbC1zYmluUFJPR1JBTVM6ICQoc2Jpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHNiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChzYmluZGlyKSIKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKwlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCisJd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKKwkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAorCWRvbmUgfCBcCisJc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAorCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCisJICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCisJICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKKwkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKKwl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChzYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKHNiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtc2JpblBST0dSQU1TOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChzYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHNiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK2NsZWFuLXNiaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorbmZzc3RhdCQoRVhFRVhUKTogJChuZnNzdGF0X09CSkVDVFMpICQobmZzc3RhdF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBuZnNzdGF0JChFWEVFWFQpCisJJChMSU5LKSAkKG5mc3N0YXRfT0JKRUNUUykgJChuZnNzdGF0X0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9uZnNzdGF0LlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK21vc3RseWNsZWFuLWxpYnRvb2w6CisJLXJtIC1mICoubG8KKworY2xlYW4tbGlidG9vbDoKKwktcm0gLXJmIC5saWJzIF9saWJzCitpbnN0YWxsLW1hbjg6ICQobWFuOF9NQU5TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQobWFuOGRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKG1hbjhkaXIpIgorCUBsaXN0PSckKG1hbjhfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjhkaXIpIiB8fCBleGl0IDA7IFwKKwl7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCB3aGlsZSByZWFkIHA7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgZWNobyAiJCRkJCRwIjsgZWNobyAiJCRwIjsgXAorCWRvbmUgfCBcCisJc2VkIC1lICduO3MsLiovLCw7cDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnIHwgXAorCXNlZCAnTjtOO3MsXG4sICxnJyB8IHsgXAorCWxpc3Q9OyB3aGlsZSByZWFkIGZpbGUgYmFzZSBpbnN0OyBkbyBcCisJICBpZiB0ZXN0ICIkJGJhc2UiID0gIiQkaW5zdCI7IHRoZW4gbGlzdD0iJCRsaXN0ICQkZmlsZSI7IGVsc2UgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICckJGZpbGUnICckKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QnIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgIiQkZmlsZSIgIiQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCIgfHwgZXhpdCAkJD87IFwKKwkgIGZpOyBcCisJZG9uZTsgXAorCWZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZSB8ICQoYW1fX2Jhc2VfbGlzdCkgfCBcCisJd2hpbGUgcmVhZCBmaWxlczsgZG8gXAorCSAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAnJChERVNURElSKSQobWFuOGRpciknIjsgXAorCSAgICAkKElOU1RBTExfREFUQSkgJCRmaWxlcyAiJChERVNURElSKSQobWFuOGRpcikiIHx8IGV4aXQgJCQ/OyB9OyBcCisJZG9uZTsgfQorCit1bmluc3RhbGwtbWFuODoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKG1hbjhfTUFOUyknOyB0ZXN0IC1uICIkKG1hbjhkaXIpIiB8fCBleGl0IDA7IFwKKwlmaWxlcz1geyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgc2VkIC1lICdzLC4qLywsO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCdgOyBcCisJdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICBlY2hvICIgKCBjZCAnJChERVNURElSKSQobWFuOGRpciknICYmIHJtIC1mIiAkJGZpbGVzICIpIjsgXAorCSAgY2QgIiQoREVTVERJUikkKG1hbjhkaXIpIiAmJiBybSAtZiAkJGZpbGVzOyB9CisKK0lEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKSAkKFRBR1NfRklMRVMpCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJbWtpZCAtZklEICQkdW5pcXVlCit0YWdzOiBUQUdTCisKK1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJc2V0IHg7IFwKKwloZXJlPWBwd2RgOyBcCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXNoaWZ0OyBcCisJaWYgdGVzdCAteiAiJChFVEFHU19BUkdTKSQkKiQkdW5pcXVlIjsgdGhlbiA6OyBlbHNlIFwKKwkgIHRlc3QgLW4gIiQkdW5pcXVlIiB8fCB1bmlxdWU9JCRlbXB0eV9maXg7IFwKKwkgIGlmIHRlc3QgJCQjIC1ndCAwOyB0aGVuIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICIkJEAiICQkdW5pcXVlOyBcCisJICBlbHNlIFwKKwkgICAgJChFVEFHUykgJChFVEFHU0ZMQUdTKSAkKEFNX0VUQUdTRkxBR1MpICQoRVRBR1NfQVJHUykgXAorCSAgICAgICQkdW5pcXVlOyBcCisJICBmaTsgXAorCWZpCitjdGFnczogQ1RBR1MKK0NUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwl0ZXN0IC16ICIkKENUQUdTX0FSR1MpJCR1bmlxdWUiIFwKKwkgIHx8ICQoQ1RBR1MpICQoQ1RBR1NGTEFHUykgJChBTV9DVEFHU0ZMQUdTKSAkKENUQUdTX0FSR1MpIFwKKwkgICAgICQkdW5pcXVlCisKK0dUQUdTOgorCWhlcmU9YCQoYW1fX2NkKSAkKHRvcF9idWlsZGRpcikgJiYgcHdkYCBcCisJICAmJiAkKGFtX19jZCkgJCh0b3Bfc3JjZGlyKSBcCisJICAmJiBndGFncyAtaSAkKEdUQUdTX0FSR1MpICIkJGhlcmUiCisKK2Rpc3RjbGVhbi10YWdzOgorCS1ybSAtZiBUQUdTIElEIEdUQUdTIEdSVEFHUyBHU1lNUyBHUEFUSCB0YWdzCisKK2Rpc3RkaXI6ICQoRElTVEZJTEVTKQorCUBsaXN0PSckKE1BTlMpJzsgaWYgdGVzdCAtbiAiJCRsaXN0IjsgdGhlbiBcCisJICBsaXN0PWBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICAgIGlmIHRlc3QgLWYgIiQkZCQkcCI7IHRoZW4gZWNobyAiJCRkJCRwIjsgZWxzZSA6OyBmaTsgZG9uZWA7IFwKKwkgIGlmIHRlc3QgLW4gIiQkbGlzdCIgJiYgXAorCSAgICBncmVwICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCA+L2Rldi9udWxsOyB0aGVuIFwKKwkgICAgZWNobyAiZXJyb3I6IGZvdW5kIG1hbiBwYWdlcyBjb250YWluaW5nIHRoZSBcYG1pc3NpbmcgaGVscDJtYW4nIHJlcGxhY2VtZW50IHRleHQ6IiA+JjI7IFwKKwkgICAgZ3JlcCAtbCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgfCBzZWQgJ3MvXi8gICAgICAgICAvJyA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHRvIGZpeCB0aGVtLCBpbnN0YWxsIGhlbHAybWFuLCByZW1vdmUgYW5kIHJlZ2VuZXJhdGUgdGhlIG1hbiBwYWdlczsiID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdHlwaWNhbGx5IFxgbWFrZSBtYWludGFpbmVyLWNsZWFuJyB3aWxsIHJlbW92ZSB0aGVtIiA+JjI7IFwKKwkgICAgZXhpdCAxOyBcCisJICBlbHNlIDo7IGZpOyBcCisJZWxzZSA6OyBmaQorCUBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwl0b3BzcmNkaXJzdHJpcD1gZWNobyAiJCh0b3Bfc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJbGlzdD0nJChESVNURklMRVMpJzsgXAorCSAgZGlzdF9maWxlcz1gZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IFwKKwkgIHNlZCAtZSAic3xeJCRzcmNkaXJzdHJpcC98fDt0IiBcCisJICAgICAgLWUgInN8XiQkdG9wc3JjZGlyc3RyaXAvfCQodG9wX2J1aWxkZGlyKS98O3QiYDsgXAorCWNhc2UgJCRkaXN0X2ZpbGVzIGluIFwKKwkgICovKikgJChNS0RJUl9QKSBgZWNobyAiJCRkaXN0X2ZpbGVzIiB8IFwKKwkJCSAgIHNlZCAnL1wvLyFkO3N8XnwkKGRpc3RkaXIpL3w7cywvW14vXSokJCwsJyB8IFwKKwkJCSAgIHNvcnQgLXVgIDs7IFwKKwllc2FjOyBcCisJZm9yIGZpbGUgaW4gJCRkaXN0X2ZpbGVzOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkZmlsZSB8fCB0ZXN0IC1kICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCisJICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAorCSAgICBkaXI9YGVjaG8gIi8kJGZpbGUiIHwgc2VkIC1lICdzLC9bXi9dKiQkLCwnYDsgXAorCSAgICBpZiB0ZXN0IC1kICIkKGRpc3RkaXIpLyQkZmlsZSI7IHRoZW4gXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBpZiB0ZXN0IC1kICQoc3JjZGlyKS8kJGZpbGUgJiYgdGVzdCAkJGQgIT0gJChzcmNkaXIpOyB0aGVuIFwKKwkgICAgICBjcCAtZnBSICQoc3JjZGlyKS8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGNwIC1mcFIgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgIGVsc2UgXAorCSAgICB0ZXN0IC1mICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICIkKGRpc3RkaXIpLyQkZmlsZSIgXAorCSAgICB8fCBleGl0IDE7IFwKKwkgIGZpOyBcCisJZG9uZQorY2hlY2stYW06IGFsbC1hbQorY2hlY2s6IGNoZWNrLWFtCithbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykKK2luc3RhbGxkaXJzOgorCWZvciBkaXIgaW4gIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogaW5zdGFsbC1hbQoraW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KK2luc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLWFtCit1bmluc3RhbGw6IHVuaW5zdGFsbC1hbQorCitpbnN0YWxsLWFtOiBhbGwtYW0KKwlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQorCitpbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQoraW5zdGFsbC1zdHJpcDoKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBJTlNUQUxMX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgXAorCSAgaW5zdGFsbF9zaF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIElOU1RBTExfU1RSSVBfRkxBRz0tcyBcCisJICBgdGVzdCAteiAnJChTVFJJUCknIHx8IFwKKwkgICAgZWNobyAiSU5TVEFMTF9QUk9HUkFNX0VOVj1TVFJJUFBST0c9JyQoU1RSSVApJyJgIGluc3RhbGwKK21vc3RseWNsZWFuLWdlbmVyaWM6CisKK2NsZWFuLWdlbmVyaWM6CisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCitjbGVhbjogY2xlYW4tYW0KKworY2xlYW4tYW06IGNsZWFuLWdlbmVyaWMgY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgXAorCW1vc3RseWNsZWFuLWFtCisKK2Rpc3RjbGVhbjogZGlzdGNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorZGlzdGNsZWFuLWFtOiBjbGVhbi1hbSBkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBcCisJZGlzdGNsZWFuLXRhZ3MKKworZHZpOiBkdmktYW0KKworZHZpLWFtOgorCitodG1sOiBodG1sLWFtCisKK2h0bWwtYW06CisKK2luZm86IGluZm8tYW0KKworaW5mby1hbToKKworaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLWR2aTogaW5zdGFsbC1kdmktYW0KKworaW5zdGFsbC1kdmktYW06CisKK2luc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1zYmluUFJPR1JBTVMKKworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjgKKworaW5zdGFsbC1wZGY6IGluc3RhbGwtcGRmLWFtCisKK2luc3RhbGwtcGRmLWFtOgorCitpbnN0YWxsLXBzOiBpbnN0YWxsLXBzLWFtCisKK2luc3RhbGwtcHMtYW06CisKK2luc3RhbGxjaGVjay1hbToKKworbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQorCS1ybSAtcmYgLi8kKERFUERJUikKKwktcm0gLWYgTWFrZWZpbGUKK21haW50YWluZXItY2xlYW4tYW06IGRpc3RjbGVhbi1hbSBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMKKworbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLWFtCisKK21vc3RseWNsZWFuLWFtOiBtb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWdlbmVyaWMgXAorCW1vc3RseWNsZWFuLWxpYnRvb2wKKworcGRmOiBwZGYtYW0KKworcGRmLWFtOgorCitwczogcHMtYW0KKworcHMtYW06CisKK3VuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtc2JpblBST0dSQU1TCisKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44CisKKy5NQUtFOiBpbnN0YWxsLWFtIGluc3RhbGwtc3RyaXAKKworLlBIT05ZOiBDVEFHUyBHVEFHUyBhbGwgYWxsLWFtIGNoZWNrIGNoZWNrLWFtIGNsZWFuIGNsZWFuLWdlbmVyaWMgXAorCWNsZWFuLWxpYnRvb2wgY2xlYW4tc2JpblBST0dSQU1TIGN0YWdzIGRpc3RjbGVhbiBcCisJZGlzdGNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWxpYnRvb2wgXAorCWRpc3RjbGVhbi10YWdzIGRpc3RkaXIgZHZpIGR2aS1hbSBodG1sIGh0bWwtYW0gaW5mbyBpbmZvLWFtIFwKKwlpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWR2aSBcCisJaW5zdGFsbC1kdmktYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWh0bWwgXAorCWluc3RhbGwtaHRtbC1hbSBpbnN0YWxsLWluZm8gaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtbWFuIFwKKwlpbnN0YWxsLW1hbjggaW5zdGFsbC1wZGYgaW5zdGFsbC1wZGYtYW0gaW5zdGFsbC1wcyBcCisJaW5zdGFsbC1wcy1hbSBpbnN0YWxsLXNiaW5QUk9HUkFNUyBpbnN0YWxsLXN0cmlwIGluc3RhbGxjaGVjayBcCisJaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxkaXJzIG1haW50YWluZXItY2xlYW4gXAorCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbiBtb3N0bHljbGVhbi1jb21waWxlIFwKKwltb3N0bHljbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWxpYnRvb2wgcGRmIHBkZi1hbSBwcyBwcy1hbSBcCisJdGFncyB1bmluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbC1tYW4gdW5pbnN0YWxsLW1hbjggXAorCXVuaW5zdGFsbC1zYmluUFJPR1JBTVMKKworCisjIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgorIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCisuTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbmZzc3RhdC9uZnNzdGF0LmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvbmZzc3RhdC9uZnNzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkNzdjOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNzdGF0L25mc3N0YXQuYwpAQCAtMCwwICsxLDExMzIgQEAKKy8qCisgKiBuZnNzdGF0LmMJCU91dHB1dCBORlMgc3RhdGlzdGljcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE9sYWYgS2lyY2ggPG9raXJAc3VzZS5kZT4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNkZWZpbmUgTkZTU1JWU1RBVAkiL3Byb2MvbmV0L3JwYy9uZnNkIgorI2RlZmluZSBORlNDTFRTVEFUCSIvcHJvYy9uZXQvcnBjL25mcyIKKworI2RlZmluZSBNT1VOVFNGSUxFCSIvcHJvYy9tb3VudHMiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNkZWZpbmUgTUFYTlJWQUxTCTMyCisKK2VudW0geworCVNSVlBST0MyX1NaID0gMTgsCisJQ0xUUFJPQzJfU1ogPSAxOCwKKwlTUlZQUk9DM19TWiA9IDIyLAorCUNMVFBST0MzX1NaID0gMjIsCisJU1JWUFJPQzRfU1ogPSAyLAorCUNMVFBST0M0X1NaID0gNDgsCisJU1JWUFJPQzRPUFNfU1ogPSA1OSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3J2cHJvYzJpbmZvW1NSVlBST0MyX1NaKzJdLAorCQkJc3J2cHJvYzJpbmZvX29sZFtTUlZQUk9DMl9TWisyXTsJLyogTkZTdjIgY2FsbCBjb3VudHMgKFswXSA9PSAxOCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJY2x0cHJvYzJpbmZvW0NMVFBST0MyX1NaKzJdLAorCQkJY2x0cHJvYzJpbmZvX29sZFtDTFRQUk9DMl9TWisyXTsJLyogTkZTdjIgY2FsbCBjb3VudHMgKFswXSA9PSAxOCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3J2cHJvYzNpbmZvW1NSVlBST0MzX1NaKzJdLAorCQkJc3J2cHJvYzNpbmZvX29sZFtTUlZQUk9DM19TWisyXTsJLyogTkZTdjMgY2FsbCBjb3VudHMgKFswXSA9PSAyMikgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJY2x0cHJvYzNpbmZvW0NMVFBST0MzX1NaKzJdLAorCQkJY2x0cHJvYzNpbmZvX29sZFtDTFRQUk9DM19TWisyXTsJLyogTkZTdjMgY2FsbCBjb3VudHMgKFswXSA9PSAyMikgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3J2cHJvYzRpbmZvW1NSVlBST0M0X1NaKzJdLAorCQkJc3J2cHJvYzRpbmZvX29sZFtTUlZQUk9DNF9TWisyXTsJLyogTkZTdjQgY2FsbCBjb3VudHMgKFswXSA9PSAyKSAqLworc3RhdGljIHVuc2lnbmVkIGludAljbHRwcm9jNGluZm9bQ0xUUFJPQzRfU1orMl0sCisJCQljbHRwcm9jNGluZm9fb2xkW0NMVFBST0M0X1NaKzJdOwkvKiBORlN2NCBjYWxsIGNvdW50cyAoWzBdID09IDQ4KSAqLworc3RhdGljIHVuc2lnbmVkIGludAlzcnZwcm9jNG9wc2luZm9bU1JWUFJPQzRPUFNfU1orMl0sCisJCQlzcnZwcm9jNG9wc2luZm9fb2xkW1NSVlBST0M0T1BTX1NaKzJdOwkvKiBORlN2NCBjYWxsIGNvdW50cyAoWzBdID09IDU5KSAqLworc3RhdGljIHVuc2lnbmVkIGludAlzcnZuZXRpbmZvWzVdLCBzcnZuZXRpbmZvX29sZFs1XTsJLyogMCAgIyBvZiByZWNlaXZlZCBwYWNrZXRzCisJCQkJCQkJCSAqIDEgIFVEUCBwYWNrZXRzCisJCQkJCQkJCSAqIDIgIFRDUCBwYWNrZXRzCisJCQkJCQkJCSAqIDMgIFRDUCBjb25uZWN0aW9ucworCQkJCQkJCQkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJY2x0bmV0aW5mb1s1XSwgY2x0bmV0aW5mb19vbGRbNV07CS8qIDAgICMgb2YgcmVjZWl2ZWQgcGFja2V0cworCQkJCQkJCQkgKiAxICBVRFAgcGFja2V0cworCQkJCQkJCQkgKiAyICBUQ1AgcGFja2V0cworCQkJCQkJCQkgKiAzICBUQ1AgY29ubmVjdGlvbnMKKwkJCQkJCQkJICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJc3J2cnBjaW5mb1s2XSwgc3J2cnBjaW5mb19vbGRbNl07CS8qIDAgIHRvdGFsICMgb2YgUlBDIGNhbGxzCisJCQkJCQkJCSAqIDEgIHRvdGFsICMgb2YgYmFkIGNhbGxzCisJCQkJCQkJCSAqIDIgIGJhZCBmb3JtYXQKKwkJCQkJCQkJICogMyAgYXV0aGVudGljYXRpb24gZmFpbGVkCisJCQkJCQkJCSAqIDQgIHVua25vd24gY2xpZW50CisJCQkJCQkJCSAqLworc3RhdGljIHVuc2lnbmVkIGludAljbHRycGNpbmZvWzRdLCBjbHRycGNpbmZvX29sZFs0XTsJLyogMCAgdG90YWwgIyBvZiBSUEMgY2FsbHMKKwkJCQkJCQkJICogMSAgcmV0cmFuc21pdHRlZCBjYWxscworCQkJCQkJCQkgKiAyICBjcmVkIHJlZnJlc2hzCisJCQkJCQkJCSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CXNydnJjaW5mb1s5XSwgc3J2cmNpbmZvX29sZFs5XTsJCS8qIDAgIHJlcGNhY2hlIGhpdHMKKwkJCQkJCQkJICogMSAgcmVwY2FjaGUgaGl0cworCQkJCQkJCQkgKiAyICB1bmNhY2hlZCByZXFzCisJCQkJCQkJCSAqIChmb3IgcHJlLTIuNCBrZXJuZWxzOikKKwkJCQkJCQkJICogMyAgRkggbG9va3VwcworCQkJCQkJCQkgKiA0ICAnYW5vbicgRkhzCisJCQkJCQkJCSAqIDUgIG5vbmNhY2hlZCBub24tZGlyZWN0b3JpZXMKKwkJCQkJCQkJICogNiAgbm9uY2FjaGVkIGRpcmVjdG9yaWVzCisJCQkJCQkJCSAqIDcgIHN0YWxlCisJCQkJCQkJCSAqLworCitzdGF0aWMgdW5zaWduZWQgaW50CXNydmZoaW5mb1s3XSwgc3J2ZmhpbmZvX29sZFs3XTsJCS8qIChmb3Iga2VybmVscyA+PSAyLjQuMCkKKwkJCQkJCQkJICogMCAgc3RhbGUKKwkJCQkJCQkJICogMSAgRkggbG9va3VwcworCQkJCQkJCQkgKiAyICAnYW5vbicgRkhzCisJCQkJCQkJCSAqIDMgIG5vbmNhY2hlZCBkaXJlY3RvcmllcworCQkJCQkJCQkgKiA0ICBub25jYWNoZWQgbm9uLWRpcmVjdG9yaWVzCisJCQkJCQkJCSAqIGxlYXZlIGhvbGUgdG8gcmVsb2NhdGUgc3RhbGUgZm9yIG9yZGVyCisJCQkJCQkJCSAqICAgIGNvbXBhdGFiaWxpdHkuCisJCQkJCQkJCSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCW5mc3YybmFtZVtTUlZQUk9DMl9TWl0gPSB7CisJIm51bGwiLCAiZ2V0YXR0ciIsICJzZXRhdHRyIiwgInJvb3QiLCAgICJsb29rdXAiLCAgInJlYWRsaW5rIiwKKwkicmVhZCIsICJ3cmNhY2hlIiwgIndyaXRlIiwgICAiY3JlYXRlIiwgInJlbW92ZSIsICAicmVuYW1lIiwKKwkibGluayIsICJzeW1saW5rIiwgIm1rZGlyIiwgICAicm1kaXIiLCAgInJlYWRkaXIiLCAiZnNzdGF0IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKgluZnN2M25hbWVbU1JWUFJPQzNfU1pdID0geworCSJudWxsIiwgICAiZ2V0YXR0ciIsICJzZXRhdHRyIiwgICJsb29rdXAiLCAiYWNjZXNzIiwgICJyZWFkbGluayIsCisJInJlYWQiLCAgICJ3cml0ZSIsICAgImNyZWF0ZSIsICAgIm1rZGlyIiwgICJzeW1saW5rIiwgIm1rbm9kIiwKKwkicmVtb3ZlIiwgInJtZGlyIiwgICAicmVuYW1lIiwgICAibGluayIsICAgInJlYWRkaXIiLCAicmVhZGRpcnBsdXMiLAorCSJmc3N0YXQiLCAiZnNpbmZvIiwgICJwYXRoY29uZiIsICJjb21taXQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCW5mc3NydnByb2M0bmFtZVtTUlZQUk9DNF9TWl0gPSB7CisJIm51bGwiLAorCSJjb21wb3VuZCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCW5mc2NsdHByb2M0bmFtZVtDTFRQUk9DNF9TWl0gPSB7CisJIm51bGwiLCAgICAgICJyZWFkIiwgICAgICAid3JpdGUiLCAgICJjb21taXQiLCAgICAgICJvcGVuIiwgICAgICAgICJvcGVuX2NvbmYiLAorCSJvcGVuX25vYXQiLCAib3Blbl9kZ3JkIiwgImNsb3NlIiwgICAic2V0YXR0ciIsICAgICAiZnNpbmZvIiwgICAgICAicmVuZXciLAorCSJzZXRjbG50aWQiLCAiY29uZmlybSIsICAgImxvY2siLAorCSJsb2NrdCIsICAgICAibG9ja3UiLCAgICAgImFjY2VzcyIsICAiZ2V0YXR0ciIsICAgICAibG9va3VwIiwgICAgICAibG9va3VwX3Jvb3QiLAorCSJyZW1vdmUiLCAgICAicmVuYW1lIiwgICAgImxpbmsiLCAgICAic3ltbGluayIsICAgICAiY3JlYXRlIiwgICAgICAicGF0aGNvbmYiLAorCSJzdGF0ZnMiLCAgICAicmVhZGxpbmsiLCAgInJlYWRkaXIiLCAic2VydmVyX2NhcHMiLCAiZGVsZWdyZXR1cm4iLCAiZ2V0YWNsIiwKKwkic2V0YWNsIiwgICAgImZzX2xvY2F0aW9ucyIsCisJLyogbmZzdjQuMSBjbGllbnQgb3BzICovCisJImV4Y2hhbmdlX2lkIiwKKwkiY3JlYXRlX3NlcyIsCisJImRlc3Ryb3lfc2VzIiwKKwkic2VxdWVuY2UiLAorCSJnZXRfbGVhc2VfdCIsCisJInJlY2xhaW1fY29tcCIsCisJImxheW91dGdldCIsCisJImxheW91dGNvbW1pdCIsCisJImxheW91dHJldHVybiIsCisJImdldGRldmxpc3QiLAorCSJnZXRkZXZpbmZvIiwKKwkvKiBuZnN2NC4xIHBuZnMgY2xpZW50IG9wcyB0byBkYXRhIHNlcnZlciBvbmx5ICovCisJImRzX3dyaXRlIiwKKwkiZHNfY29tbWl0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogICAgIG5mc3NydnByb2M0b3BuYW1lW1NSVlBST0M0T1BTX1NaXSA9IHsKKyAgICAgICAgIm9wMC11bnVzZWQiLCAgICJvcDEtdW51c2VkIiwgIm9wMi1mdXR1cmUiLCAgImFjY2VzcyIsICAgICAiY2xvc2UiLCAgICAgICAiY29tbWl0IiwKKyAgICAgICAgImNyZWF0ZSIsICAgICAgICJkZWxlZ3B1cmdlIiwgImRlbGVncmV0dXJuIiwgImdldGF0dHIiLCAgICAiZ2V0ZmgiLCAgICAgICAibGluayIsCisgICAgICAgICJsb2NrIiwgICAgICAgICAibG9ja3QiLCAgICAgICJsb2NrdSIsICAgICAgICJsb29rdXAiLCAgICAgImxvb2t1cF9yb290IiwgIm52ZXJpZnkiLAorICAgICAgICAib3BlbiIsICAgICAgICAgIm9wZW5hdHRyIiwgICAib3Blbl9jb25mIiwgICAib3Blbl9kZ3JkIiwgICJwdXRmaCIsICAgICAgICJwdXRwdWJmaCIsCisgICAgICAgICJwdXRyb290ZmgiLCAgICAicmVhZCIsICAgICAgICJyZWFkZGlyIiwgICAgICJyZWFkbGluayIsICAgInJlbW92ZSIsICAgICAgInJlbmFtZSIsCisgICAgICAgICJyZW5ldyIsICAgICAgICAicmVzdG9yZWZoIiwgICJzYXZlZmgiLCAgICAgICJzZWNpbmZvIiwgICAgInNldGF0dHIiLCAgICAgInNldGNsdGlkIiwKKyAgICAgICAgInNldGNsdGlkY29uZiIsICJ2ZXJpZnkiLCAgICAgIndyaXRlIiwgICAgICAgInJlbGxvY2tvd25lciIsCisJLyogbmZzdjQuMSBzZXJ2ZXIgb3BzICovCisJImJjX2N0bCIsCisJImJpbmRfY29ubiIsCisJImV4Y2hhbmdlX2lkIiwKKwkiY3JlYXRlX3NlcyIsCisJImRlc3Ryb3lfc2VzIiwKKwkiZnJlZV9zdGF0ZWlkIiwKKwkiZ2V0ZGlyZGVsZWciLAorCSJnZXRkZXZpbmZvIiwKKwkiZ2V0ZGV2bGlzdCIsCisJImxheW91dGNvbW1pdCIsCisJImxheW91dGdldCIsCisJImxheW91dHJldHVybiIsCisJInNlY2luZm9ub25hbSIsCisJInNlcXVlbmNlIiwKKwkic2V0X3NzdiIsCisJInRlc3Rfc3RhdGVpZCIsCisJIndhbnRfZGVsZWciLAorCSJkZXN0cm95X2NsaWQiLAorCSJyZWNsYWltX2NvbXAiLAorfTsKKworI2RlZmluZSBMQUJFTF9zcnZuZXQJCSJTZXJ2ZXIgcGFja2V0IHN0YXRzOlxuIgorI2RlZmluZSBMQUJFTF9zcnZycGMJCSJTZXJ2ZXIgcnBjIHN0YXRzOlxuIgorI2RlZmluZSBMQUJFTF9zcnZyYwkJIlNlcnZlciByZXBseSBjYWNoZTpcbiIKKyNkZWZpbmUgTEFCRUxfc3J2ZmgJCSJTZXJ2ZXIgZmlsZSBoYW5kbGUgY2FjaGU6XG4iCisjZGVmaW5lIExBQkVMX3NydnByb2MyCQkiU2VydmVyIG5mcyB2MjpcbiIKKyNkZWZpbmUgTEFCRUxfc3J2cHJvYzMJCSJTZXJ2ZXIgbmZzIHYzOlxuIgorI2RlZmluZSBMQUJFTF9zcnZwcm9jNAkJIlNlcnZlciBuZnMgdjQ6XG4iCisjZGVmaW5lIExBQkVMX3NydnByb2M0b3BzCSJTZXJ2ZXIgbmZzIHY0IG9wZXJhdGlvbnM6XG4iCisjZGVmaW5lIExBQkVMX2NsdG5ldAkJIkNsaWVudCBwYWNrZXQgc3RhdHM6XG4iCisjZGVmaW5lIExBQkVMX2NsdHJwYwkJIkNsaWVudCBycGMgc3RhdHM6XG4iCisjZGVmaW5lIExBQkVMX2NsdHByb2MyCQkiQ2xpZW50IG5mcyB2MjpcbiIKKyNkZWZpbmUgTEFCRUxfY2x0cHJvYzMJCSJDbGllbnQgbmZzIHYzOlxuIgorI2RlZmluZSBMQUJFTF9jbHRwcm9jNAkJIkNsaWVudCBuZnMgdjQ6XG4iCisKK3R5cGVkZWYgc3RydWN0IHN0YXRpbmZvIHsKKwljaGFyCQkqdGFnOworCWNoYXIJCSpsYWJlbDsKKwlpbnQJCW5ydmFsczsKKwl1bnNpZ25lZCBpbnQgKgl2YWxwdHI7Cit9IHN0YXRpbmZvOworCisvKgorICogV2Ugbm93IGJ1aWxkIHRoZSBhcnJheXMgb2Ygc3RhdGluZm9zIHVzaW5nIG1hY3Jvcywgd2hpY2ggd2lsbCBtYWtlIGl0IGVhc2llcgorICogdG8gYWRkIG5ldyB2YXJpYWJsZXMgZm9yIC0tc2xlZXAuICBlLmcuLCBTUlYobmV0KSBleHBhbmRzIGludG8gdGhlIHN0cnVjdAorICogc3RhdGluZm86ICB7ICJuZXQiLCAiU2VydmVyIHBhY2tldCBzdGF0czpcbiIsIDUsIHNydm5ldGluZm8gfQorICovCisjZGVmaW5lIEFSUkFZU0laRSh4KQkJc2l6ZW9mKHgpL3NpemVvZigqeCkKKyNkZWZpbmUgU1RBVElORk8oaywgdCwgcy4uLikJeyAjdCwgTEFCRUxfIyNrIyN0LCBBUlJBWVNJWkUoayMjdCMjaW5mbyMjcyksIGsjI3QjI2luZm8jI3MgfQorI2RlZmluZSBTUlYodCwgcy4uLikJCVNUQVRJTkZPKHNydiwgdCwgcykKKyNkZWZpbmUgQ0xUKHQsIHMuLi4pCQlTVEFUSU5GTyhjbHQsIHQsIHMpCisjZGVmaW5lIERFQ0xBUkVfU1JWKG4sIHMuLi4pCXN0YXRpYyBzdGF0aW5mbyBuIyNzW10gPSB7IFwKKwkJCQkJU1JWKG5ldCxzKSwgXAorCQkJCQlTUlYocnBjLHMpLCBcCisJCQkJCVNSVihyYyxzKSwgXAorCQkJCQlTUlYoZmgscyksIFwKKwkJCQkJU1JWKHByb2MyLHMpLCBcCisJCQkJCVNSVihwcm9jMyxzKSxcCisJCQkJCVNSVihwcm9jNCxzKSwgXAorCQkJCQlTUlYocHJvYzRvcHMscyksXAorCQkJCQl7IE5VTEwsIE5VTEwsIDAsIE5VTEwgfVwKKwkJCQl9CisjZGVmaW5lIERFQ0xBUkVfQ0xUKG4sIHMuLi4pICAJc3RhdGljIHN0YXRpbmZvIG4jI3NbXSA9IHsgXAorCQkJCQlDTFQobmV0LHMpLCBcCisJCQkJCUNMVChycGMscyksIFwKKwkJCQkJQ0xUKHByb2MyLHMpLFwKKwkJCQkJQ0xUKHByb2MzLHMpLCBcCisJCQkJCUNMVChwcm9jNCxzKSxcCisJCQkJCXsgTlVMTCwgTlVMTCwgMCwgTlVMTCB9XAorCQkJCX0KK0RFQ0xBUkVfU1JWKHNydmluZm8pOworREVDTEFSRV9TUlYoc3J2aW5mbywgX29sZCk7CitERUNMQVJFX0NMVChjbHRpbmZvKTsKK0RFQ0xBUkVfQ0xUKGNsdGluZm8sIF9vbGQpOworCitzdGF0aWMgdm9pZAkJcHJpbnRfYWxsX3N0YXRzKGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQJCXByaW50X3NlcnZlcl9zdGF0cyhpbnQsIGludCk7CitzdGF0aWMgdm9pZAkJcHJpbnRfY2xpZW50X3N0YXRzKGludCwgaW50KTsKK3N0YXRpYyB2b2lkCQlwcmludF9zdGF0c19saXN0KGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQJCXByaW50X251bWJlcnMoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQgKiwKKwkJCQkJdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkCQlwcmludF9jYWxsc3RhdHMoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLAorCQkJCQl1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkCQlwcmludF9jYWxsc3RhdHNfbGlzdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCisJCQkJCXVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludAkJcGFyc2VfcmF3X3N0YXRmaWxlKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXRpbmZvICopOworc3RhdGljIGludCAJCXBhcnNlX3ByZXR0eV9zdGF0ZmlsZShjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0aW5mbyAqKTsKKworc3RhdGljIHN0YXRpbmZvCQkqZ2V0X3N0YXRfaW5mbyhjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0aW5mbyAqKTsKKworc3RhdGljIGludAkJbW91bnRzKGNvbnN0IGNoYXIgKik7CisKK3N0YXRpYyB2b2lkCQlnZXRfc3RhdHMoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdGluZm8gKiwgaW50ICosIGludCwKKwkJCQkJaW50KTsKK3N0YXRpYyBpbnQJCWhhc19zdGF0cyhjb25zdCB1bnNpZ25lZCBpbnQgKik7CitzdGF0aWMgaW50CQloYXNfcnBjc3RhdHMoY29uc3QgdW5zaWduZWQgaW50ICosIGludCk7CitzdGF0aWMgdm9pZCAJCWRpZmZfc3RhdHMoc3RydWN0IHN0YXRpbmZvICosIHN0cnVjdCBzdGF0aW5mbyAqLCBpbnQpOworc3RhdGljIHZvaWQgCQl1bnBhdXNlKGludCk7CitzdGF0aWMgdm9pZCAJCXVwZGF0ZV9vbGRfY291bnRlcnMoc3RydWN0IHN0YXRpbmZvICosIHN0cnVjdCBzdGF0aW5mbyAqKTsKKworc3RhdGljIHRpbWVfdAkJc3RhcnR0aW1lOworCisjZGVmaW5lIFBSTlRfQ0FMTFMJMHgwMDAxCisjZGVmaW5lIFBSTlRfUlBDCTB4MDAwMgorI2RlZmluZSBQUk5UX05FVAkweDAwMDQKKyNkZWZpbmUgUFJOVF9GSAkJMHgwMDA4CisjZGVmaW5lIFBSTlRfUkMJCTB4MDAxMAorI2RlZmluZSBQUk5UX0FVVE8JMHgxMDAwCisjZGVmaW5lIFBSTlRfVjIJCTB4MjAwMAorI2RlZmluZSBQUk5UX1YzCQkweDQwMDAKKyNkZWZpbmUgUFJOVF9WNAkJMHg4MDAwCisjZGVmaW5lIFBSTlRfQUxMCTB4MGZmZgorCitpbnQgdmVyc2lvbnNbXSA9IHsKKwlQUk5UX1YyLAorCVBSTlRfVjMsCisJUFJOVF9WNAorfTsKKwordm9pZCB1c2FnZShjaGFyICpuYW1lKQoreworCXByaW50ZigiVXNhZ2U6ICVzIFtPUFRJT05dLi4uXG5cCitcblwKKyAgLW0sIC0tbW91bnRzCQlTaG93IHN0YXRpc3RpY3Mgb24gbW91bnRlZCBORlMgZmlsZXN5c3RlbXNcblwKKyAgLWMsIC0tY2xpZW50CQlTaG93IE5GUyBjbGllbnQgc3RhdGlzdGljc1xuXAorICAtcywgLS1zZXJ2ZXIJCVNob3cgTkZTIHNlcnZlciBzdGF0aXN0aWNzXG5cCisgIC0yCQkJU2hvdyBORlMgdmVyc2lvbiAyIHN0YXRpc3RpY3NcblwKKyAgLTMJCQlTaG93IE5GUyB2ZXJzaW9uIDMgc3RhdGlzdGljc1xuXAorICAtNAkJCVNob3cgTkZTIHZlcnNpb24gNCBzdGF0aXN0aWNzXG5cCisgIC1vIFtmYWNpbGl0eV0JCVNob3cgc3RhdGlzdGljcyBvbiBwYXJ0aWN1bGFyIGZhY2lsaXRpZXMuXG5cCisgICAgIG5mcwkJTkZTIHByb3RvY29sIGluZm9ybWF0aW9uXG5cCisgICAgIHJwYwkJR2VuZXJhbCBSUEMgaW5mb3JtYXRpb25cblwKKyAgICAgbmV0CQlOZXR3b3JrIGxheWVyIHN0YXRpc3RpY3NcblwKKyAgICAgZmgJCQlVc2FnZSBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyJ3MgZmlsZSBoYW5kbGUgY2FjaGVcblwKKyAgICAgcmMJCQlVc2FnZSBpbmZvcm1hdGlvbiBvbiB0aGUgc2VydmVyJ3MgcmVxdWVzdCByZXBseSBjYWNoZVxuXAorICAgICBhbGwJCVNlbGVjdCBhbGwgb2YgdGhlIGFib3ZlXG5cCisgIC12LCAtLXZlcmJvc2UsIC0tYWxsCVNhbWUgYXMgJy1vIGFsbCdcblwKKyAgLXIsIC0tcnBjCQlTaG93IFJQQyBzdGF0aXN0aWNzXG5cCisgIC1uLCAtLW5mcwkJU2hvdyBORlMgc3RhdGlzdGljc1xuXAorICAtWlsjXSwgLS1zbGVlcFs9I10JQ29sbGVjdHMgc3RhdHMgdW50aWwgaW50ZXJydXB0ZWQuXG5cCisJCQkgICAgQ3VtdWxhdGl2ZSBzdGF0cyBhcmUgdGhlbiBwcmludGVkXG5cCisgICAgICAgICAgCQkgICAgSWYgIyBpcyBwcm92aWRlZCwgc3RhdHMgd2lsbCBiZSBvdXRwdXQgZXZlcnlcblwKKwkJCSAgICAjIHNlY29uZHMuXG5cCisgIC1TLCAtLXNpbmNlIGZpbGUJU2hvd3MgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgc3RhdHMgYW5kIHRob3NlIGluICdmaWxlJ1xuXAorICAtbCwgLS1saXN0CQlQcmludHMgc3RhdHMgaW4gbGlzdCBmb3JtYXRcblwKKyAgLS12ZXJzaW9uCQlTaG93IHByb2dyYW0gdmVyc2lvblxuXAorICAtLWhlbHAJCVdoYXQgeW91IGp1c3QgZGlkXG5cCitcbiIsIG5hbWUpOworCWV4aXQoMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQoreworCXsgImFjbCIsIDAsIDAsICdhJyB9LAorCXsgImFsbCIsIDAsIDAsICd2JyB9LAorCXsgImF1dG8iLCAwLCAwLCAnXDMnIH0sCisJeyAiY2xpZW50IiwgMCwgMCwgJ2MnIH0sCisJeyAibW91bnRlZCIsIDAsIDAsICdtJyB9LAorCXsgIm5mcyIsIDAsIDAsICduJyB9LAorCXsgInJwYyIsIDAsIDAsICdyJyB9LAorCXsgInNlcnZlciIsIDAsIDAsICdzJyB9LAorCXsgInZlcmJvc2UiLCAwLCAwLCAndicgfSwKKwl7ICJ6ZXJvIiwgMCwgMCwgJ3onIH0sCisJeyAiaGVscCIsIDAsIDAsICdcMScgfSwKKwl7ICJ2ZXJzaW9uIiwgMCwgMCwgJ1wyJyB9LAorCXsgInNsZWVwIiwgMiwgMCwgJ1onIH0sCisJeyAic2luY2UiLCAxLCAwLCAnUycgfSwKKwl7ICJsaXN0IiwgMCwgMCwgJ2wnIH0sCisJeyBOVUxMLCAwLCAwLCAwIH0KK307CitpbnQgb3B0X3NsZWVwOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludAkJb3B0X2FsbCA9IDAsCisJCQlvcHRfc3J2ID0gMCwKKwkJCW9wdF9jbHQgPSAwLAorCQkJb3B0X3BydCA9IDAsCisJCQlzbGVlcF90aW1lID0gMCwKKwkJCW9wdF9saXN0ID0wLAorCQkJb3B0X3NpbmNlID0gMDsKKwlpbnQJCWM7CisJY2hhciAgICAgICAgICAgKnByb2duYW1lLAorCQkgICAgICAgKnNlcnZlcmZpbGUgPSBORlNTUlZTVEFULAorCQkgICAgICAgKmNsaWVudGZpbGUgPSBORlNDTFRTVEFUOworCisJc3RydWN0IHN0YXRpbmZvICpzZXJ2ZXJpbmZvID0gc3J2aW5mbywKKwkJCSpzZXJ2ZXJpbmZvX3RtcCA9IHNydmluZm9fb2xkLAorCQkJKmNsaWVudGluZm8gPSBjbHRpbmZvLAorCQkJKmNsaWVudGluZm9fdG1wID0gY2x0aW5mb19vbGQ7CisKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCA9IHsKKwkJLnNhX2hhbmRsZXIgPSB1bnBhdXNlLAorCQkuc2FfZmxhZ3MgPSBTQV9PTkVTSE9ULAorCX07CisKKwlpZiAoKHByb2duYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpKSkKKwkJcHJvZ25hbWUrKzsKKwllbHNlCisJCXByb2duYW1lID0gYXJndlswXTsKKworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICIyMzRhY21ubzpaOjpTOnZyc2x6XDFcMiIsIGxvbmdvcHRzLCBOVUxMKSkgIT0gRU9GKSB7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdhJzoKKwkJCWZwcmludGYoc3RkZXJyLCAibmZzc3RhdDogbmZzIGFjbHMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLlxuIik7CisJCQlyZXR1cm4gLTE7CisJCWNhc2UgJ2MnOgorCQkJb3B0X2NsdCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlvcHRfcHJ0IHw9IFBSTlRfQ0FMTFM7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlpZiAoIXN0cmNtcChvcHRhcmcsICJuZnMiKSkKKwkJCQlvcHRfcHJ0IHw9IFBSTlRfQ0FMTFM7CisJCQllbHNlIGlmICghc3RyY21wKG9wdGFyZywgInJwYyIpKQorCQkJCW9wdF9wcnQgfD0gUFJOVF9SUEM7CisJCQllbHNlIGlmICghc3RyY21wKG9wdGFyZywgIm5ldCIpKQorCQkJCW9wdF9wcnQgfD0gUFJOVF9ORVQ7CisJCQllbHNlIGlmICghc3RyY21wKG9wdGFyZywgInJjIikpCisJCQkJb3B0X3BydCB8PSBQUk5UX1JDOworCQkJZWxzZSBpZiAoIXN0cmNtcChvcHRhcmcsICJmaCIpKQorCQkJCW9wdF9wcnQgfD0gUFJOVF9GSDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiYWxsIikpCisJCQkJb3B0X3BydCB8PSBQUk5UX0NBTExTIHwgUFJOVF9SUEMgfCBQUk5UX05FVCB8IFBSTlRfUkMgfCBQUk5UX0ZIOworCQkJZWxzZSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJuZnNzdGF0OiB1bmtub3duIGNhdGVnb3J5OiAiCisJCQkJCQkiJXNcbiIsIG9wdGFyZyk7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnWic6CisJCQlvcHRfc2xlZXAgPSAxOworCQkJaWYgKG9wdGFyZykgeworCQkJCXNsZWVwX3RpbWUgPSBhdG9pKG9wdGFyZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisJCQlvcHRfc2luY2UgPSAxOworCQkJc2VydmVyZmlsZSA9IG9wdGFyZzsKKwkJCWNsaWVudGZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnMic6CisJCWNhc2UgJzMnOgorCQljYXNlICc0JzoKKwkJCW9wdF9wcnQgfD0gdmVyc2lvbnNbYyAtICcyJ107CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlvcHRfYWxsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdcMyc6CisJCQlvcHRfcHJ0IHw9IFBSTlRfQVVUTzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCW9wdF9wcnQgfD0gUFJOVF9SUEM7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlvcHRfc3J2ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCW9wdF9saXN0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd6JzoKKwkJCWZwcmludGYoc3RkZXJyLCAibmZzc3RhdDogemVyb2luZyBvZiBuZnMgc3RhdGlzdGljcyAiCisJCQkJCSJub3QgeWV0IHN1cHBvcnRlZFxuIik7CisJCQlyZXR1cm4gMjsKKwkJY2FzZSAnbSc6CisJCQlyZXR1cm4gbW91bnRzKE1PVU5UU0ZJTEUpOworCQljYXNlICdcMSc6CisJCQl1c2FnZShwcm9nbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnXDInOgorCQkJZnByaW50ZihzdGRvdXQsICJuZnNzdGF0OiAiIFZFUlNJT04gIlxuIik7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiVHJ5IGAlcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiwgcHJvZ25hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKG9wdF9hbGwpIHsKKwkJb3B0X3NydiA9IG9wdF9jbHQgPSAxOworCQlvcHRfcHJ0IHw9IFBSTlRfQUxMOworCX0KKwlpZiAoIShvcHRfc3J2ICsgb3B0X2NsdCkpCisJCW9wdF9zcnYgPSBvcHRfY2x0ID0gMTsKKwlpZiAoIShvcHRfcHJ0ICYgMHhmZmYpKSB7CisJCW9wdF9wcnQgfD0gUFJOVF9DQUxMUyArIFBSTlRfUlBDOworCX0KKwlpZiAoIShvcHRfcHJ0ICYgMHhlMDAwKSkgeworCQlvcHRfcHJ0IHw9IFBSTlRfQVVUTzsKKwl9CisJaWYgKChvcHRfcHJ0ICYgKFBSTlRfRkh8UFJOVF9SQykpICYmICFvcHRfc3J2KSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIllvdSByZXF1ZXN0ZWQgZmlsZSBoYW5kbGUgb3IgcmVxdWVzdCBjYWNoZSAiCisJCQkic3RhdGlzdGljcyB3aGlsZSB1c2luZyB0aGUgLWMgb3B0aW9uLlxuIgorCQkJIlRoaXMgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIG9ubHkgZm9yIHRoZSBORlMgIgorCQkJInNlcnZlci5cbiIpOworCX0KKworCWlmIChvcHRfc2luY2UgfHwgb3B0X3NsZWVwKSB7CisJCXNlcnZlcmluZm8gPSBzcnZpbmZvX29sZDsKKwkJc2VydmVyaW5mb190bXAgPSBzcnZpbmZvOworCQljbGllbnRpbmZvID0gY2x0aW5mb19vbGQ7CisJCWNsaWVudGluZm9fdG1wID0gY2x0aW5mbzsKKwl9CisKKwlpZiAob3B0X3NydikKKwkJZ2V0X3N0YXRzKHNlcnZlcmZpbGUsIHNlcnZlcmluZm8sICZvcHRfc3J2LCBvcHRfY2x0LCAxKTsKKwlpZiAob3B0X2NsdCkKKwkJZ2V0X3N0YXRzKGNsaWVudGZpbGUsIGNsaWVudGluZm8sICZvcHRfY2x0LCBvcHRfc3J2LCAwKTsKKworCWlmIChvcHRfc2xlZXAgJiYgIXNsZWVwX3RpbWUpIHsKKwkJc3RhcnR0aW1lID0gdGltZShOVUxMKTsKKwkJcHJpbnRmKCJDb2xsZWN0aW5nIHN0YXRpc3RpY3M7IHByZXNzIENUUkwtQyB0byB2aWV3IHJlc3VsdHMgZnJvbSBpbnRlcnZhbCAoaS5lLiwgZnJvbSBwYXVzZSB0byBDVFJMLUMpLlxuIik7CisJCWlmIChzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCBOVUxMKSAhPSAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBjb3VsZG4ndCByZWdpc3RlciBmb3Igc2lnbmFsIGFuZCBwYXVzZS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGF1c2UoKTsKKwl9CisKKwlpZiAob3B0X3NpbmNlIHx8IG9wdF9zbGVlcCkgeworCQlpZiAob3B0X3NydikgeworCQkJZ2V0X3N0YXRzKE5GU1NSVlNUQVQsIHNlcnZlcmluZm9fdG1wLCAmb3B0X3Nydiwgb3B0X2NsdCwgMSk7CisJCQlkaWZmX3N0YXRzKHNlcnZlcmluZm9fdG1wLCBzZXJ2ZXJpbmZvLCAxKTsKKwkJfQorCQlpZiAob3B0X2NsdCkgeworCQkJZ2V0X3N0YXRzKE5GU0NMVFNUQVQsIGNsaWVudGluZm9fdG1wLCAmb3B0X2NsdCwgb3B0X3NydiwgMCk7CisJCQlkaWZmX3N0YXRzKGNsaWVudGluZm9fdG1wLCBjbGllbnRpbmZvLCAwKTsKKwkJfQorCX0KKwlpZihzbGVlcF90aW1lKSB7CisJCXdoaWxlKDEpIHsKKwkJCWlmIChvcHRfc3J2KSB7CisJCQkJZ2V0X3N0YXRzKE5GU1NSVlNUQVQsIHNlcnZlcmluZm9fdG1wICwgJm9wdF9zcnYsIG9wdF9jbHQsIDEpOworCQkJCWRpZmZfc3RhdHMoc2VydmVyaW5mb190bXAsIHNlcnZlcmluZm8sIDEpOworCQkJfQorCQkJaWYgKG9wdF9jbHQpIHsKKwkJCQlnZXRfc3RhdHMoTkZTQ0xUU1RBVCwgY2xpZW50aW5mb190bXAsICZvcHRfY2x0LCBvcHRfc3J2LCAwKTsKKwkJCQlkaWZmX3N0YXRzKGNsaWVudGluZm9fdG1wLCBjbGllbnRpbmZvLCAwKTsKKwkJCX0KKwkJCWlmIChvcHRfbGlzdCkgeworCQkJCXByaW50X3N0YXRzX2xpc3Qob3B0X3Nydiwgb3B0X2NsdCwgb3B0X3BydCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50X2FsbF9zdGF0cyhvcHRfc3J2LCBvcHRfY2x0LCBvcHRfcHJ0KTsKKwkJCX0KKwkJCWZmbHVzaChzdGRvdXQpOworCisJCQlpZiAob3B0X3NydikKKwkJCQl1cGRhdGVfb2xkX2NvdW50ZXJzKHNlcnZlcmluZm9fdG1wLCBzZXJ2ZXJpbmZvKTsKKwkJCWlmIChvcHRfY2x0KQorCQkJCXVwZGF0ZV9vbGRfY291bnRlcnMoY2xpZW50aW5mb190bXAsIGNsaWVudGluZm8pOworCisJCQlzbGVlcChzbGVlcF90aW1lKTsKKwkJfQkKKwl9IGVsc2UgeworCQlpZiAob3B0X2xpc3QpIHsKKwkJCXByaW50X3N0YXRzX2xpc3Qob3B0X3Nydiwgb3B0X2NsdCwgb3B0X3BydCk7CisJCX0gZWxzZSB7CisJCQlwcmludF9hbGxfc3RhdHMob3B0X3Nydiwgb3B0X2NsdCwgb3B0X3BydCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2FsbF9zdGF0cyAoaW50IG9wdF9zcnYsIGludCBvcHRfY2x0LCBpbnQgb3B0X3BydCkKK3sKKwlwcmludF9zZXJ2ZXJfc3RhdHMob3B0X3Nydiwgb3B0X3BydCk7CisJcHJpbnRfY2xpZW50X3N0YXRzKG9wdF9jbHQsIG9wdF9wcnQpOworfQorCitzdGF0aWMgdm9pZCAKK3ByaW50X3NlcnZlcl9zdGF0cyhpbnQgb3B0X3NydiwgaW50IG9wdF9wcnQpIAoreworCWlmICghb3B0X3NydikKKwkJcmV0dXJuOworCisJaWYgKG9wdF9wcnQgJiBQUk5UX05FVCkgeworCQlpZiAob3B0X3NsZWVwICYmICFoYXNfcnBjc3RhdHMoc3J2bmV0aW5mbywgNCkpIHsKKwkJfSBlbHNlIHsKKwkJCXByaW50X251bWJlcnMoIExBQkVMX3Nydm5ldAorCQkJCSJwYWNrZXRzICAgIHVkcCAgICAgICAgdGNwICAgICAgICB0Y3Bjb25uXG4iLAorCQkJc3J2bmV0aW5mbywgNCk7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9CisJaWYgKG9wdF9wcnQgJiBQUk5UX1JQQykgeworCQlpZiAob3B0X3NsZWVwICYmICFoYXNfcnBjc3RhdHMoc3J2cnBjaW5mbywgNSkpIHsKKwkJCTsKKwkJfSBlbHNlIHsKKwkJCXByaW50X251bWJlcnMoTEFCRUxfc3J2cnBjCisJCQkJImNhbGxzICAgICAgYmFkY2FsbHMgICBiYWRhdXRoICAgIGJhZGNsbnQgICAgeGRyY2FsbFxuIiwKKwkJCQlzcnZycGNpbmZvLCA1KTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCX0KKwlpZiAob3B0X3BydCAmIFBSTlRfUkMpIHsKKwkJaWYgKG9wdF9zbGVlcCAmJiAhaGFzX3JwY3N0YXRzKHNydnJjaW5mbywgMykpIHsKKwkJCTsKKwkJfSBlbHNlIHsKKwkJCXByaW50X251bWJlcnMoTEFCRUxfc3J2cmMKKwkJCQkiaGl0cyAgICAgICBtaXNzZXMgICAgIG5vY2FjaGVcbiIsCisJCQkJc3J2cmNpbmZvLCAzKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCX0KKworCS8qCisJICogMi4yIHB1dHMgYWxsIGZoLXJlbGF0ZWQgaW5mbyBhZnRlciB0aGUgJ3JjJyBoZWFkZXIKKwkgKiAyLjQgcHV0cyBhbGwgZmgtcmVsYXRlZCBpbmZvIGFmdGVyIHRoZSAnZmgnIGhlYWRlciwgYnV0IHJlbG9jYXRlcworCSAqICAgICAnc3RhbGUnIHRvIHRoZSBzdGFydCBhbmQgc3dhcHMgZGlyIGFuZCBub25kaXIgOi0oICAKKwkgKiAgICAgV2UgcHJlc2V2ZSB0aGUgMi4yIG9yZGVyCisJICovCisJaWYgKG9wdF9wcnQgJiBQUk5UX0ZIKSB7CisJCWlmIChnZXRfc3RhdF9pbmZvKCJmaCIsIHNydmluZm8pKSB7CS8qID49IDIuNCAqLworCQkJaW50IHQgPSBzcnZmaGluZm9bM107CisJCQlzcnZmaGluZm9bM109c3J2ZmhpbmZvWzRdOworCQkJc3J2ZmhpbmZvWzRdPXQ7CisJCQkKKwkJCXNydmZoaW5mb1s1XT1zcnZmaGluZm9bMF07IC8qIHJlbG9jYXRlICdzdGFsZScgKi8KKwkJCQorCQkJcHJpbnRfbnVtYmVycygKKwkJCQlMQUJFTF9zcnZmaAorCQkJCSJsb29rdXAgICAgIGFub24gICAgICAgbmNhY2hlZGlyICBuY2FjaGVkaXIgIHN0YWxlXG4iLAorCQkJCXNydmZoaW5mbyArIDEsIDUpOworCQl9IGVsc2UJCQkJCS8qIDwgMi40ICovCisJCQlwcmludF9udW1iZXJzKAorCQkJCUxBQkVMX3NydmZoCisJCQkJImxvb2t1cCAgICAgYW5vbiAgICAgICBuY2FjaGVkaXIgIG5jYWNoZWRpciAgc3RhbGVcbiIsCisJCQkJc3J2cmNpbmZvICsgMywgNSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisJaWYgKG9wdF9wcnQgJiBQUk5UX0NBTExTKSB7CisJCWlmICgob3B0X3BydCAmIFBSTlRfVjIpIHx8IAorCQkJCSgob3B0X3BydCAmIFBSTlRfQVVUTykgJiYgaGFzX3N0YXRzKHNydnByb2MyaW5mbykpKSB7CisJCQlpZiAob3B0X3NsZWVwICYmICFoYXNfc3RhdHMoc3J2cHJvYzJpbmZvKSkgeworCQkJCTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRfY2FsbHN0YXRzKExBQkVMX3NydnByb2MyLAorCQkJCQluZnN2Mm5hbWUsIHNydnByb2MyaW5mbyArIDEsIAorCQkJCQlzaXplb2YobmZzdjJuYW1lKS9zaXplb2YoY2hhciAqKSk7CisJCQl9CisJCX0KKwkJaWYgKChvcHRfcHJ0ICYgUFJOVF9WMykgfHwgCisJCQkJKChvcHRfcHJ0ICYgUFJOVF9BVVRPKSAmJiBoYXNfc3RhdHMoc3J2cHJvYzNpbmZvKSkpIHsKKwkJCWlmIChvcHRfc2xlZXAgJiYgIWhhc19zdGF0cyhzcnZwcm9jM2luZm8pKSB7CisJCQkJOworCQkJfSBlbHNlIHsKKwkJCQlwcmludF9jYWxsc3RhdHMoTEFCRUxfc3J2cHJvYzMsCisJCQkJCW5mc3YzbmFtZSwgc3J2cHJvYzNpbmZvICsgMSwgCisJCQkJCXNpemVvZihuZnN2M25hbWUpL3NpemVvZihjaGFyICopKTsKKwkJCX0KKwkJfQorCQlpZiAoKG9wdF9wcnQgJiBQUk5UX1Y0KSB8fCAKKwkJCQkoKG9wdF9wcnQgJiBQUk5UX0FVVE8pICYmIGhhc19zdGF0cyhzcnZwcm9jNGluZm8pKSkgeworCQkJaWYgKG9wdF9zbGVlcCAmJiAhaGFzX3N0YXRzKHNydnByb2M0aW5mbykpIHsKKwkJCQk7CisJCQl9IGVsc2UgeworCQkJCXByaW50X2NhbGxzdGF0cyggTEFCRUxfc3J2cHJvYzQsCisJCQkJCW5mc3NydnByb2M0bmFtZSwgc3J2cHJvYzRpbmZvICsgMSwgCisJCQkJCXNpemVvZihuZnNzcnZwcm9jNG5hbWUpL3NpemVvZihjaGFyICopKTsKKwkJCQlwcmludF9jYWxsc3RhdHMoTEFCRUxfc3J2cHJvYzRvcHMsCisJCQkJCW5mc3NydnByb2M0b3BuYW1lLCBzcnZwcm9jNG9wc2luZm8gKyAxLCAKKwkJCQkJc2l6ZW9mKG5mc3NydnByb2M0b3BuYW1lKS9zaXplb2YoY2hhciAqKSk7CisJCQl9CisJCX0KKwl9Cit9CitzdGF0aWMgdm9pZAorcHJpbnRfY2xpZW50X3N0YXRzKGludCBvcHRfY2x0LCBpbnQgb3B0X3BydCkgCit7CisJaWYgKCFvcHRfY2x0KQorCQlyZXR1cm47CisKKwlpZiAob3B0X3BydCAmIFBSTlRfTkVUKSB7CisJCWlmIChvcHRfc2xlZXAgJiYgIWhhc19ycGNzdGF0cyhjbHRuZXRpbmZvLCA0KSkgeworCQkJOworCQl9IGVsc2UgeyAKKwkJCXByaW50X251bWJlcnMoTEFCRUxfY2x0bmV0CisJCQkJInBhY2tldHMgICAgdWRwICAgICAgICB0Y3AgICAgICAgIHRjcGNvbm5cbiIsCisJCQkJY2x0bmV0aW5mbywgNCk7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwl9CisJaWYgKG9wdF9wcnQgJiBQUk5UX1JQQykgeworCQlpZiAob3B0X3NsZWVwICYmICFoYXNfcnBjc3RhdHMoY2x0cnBjaW5mbywgMykpIHsKKwkJCTsKKwkJfSBlbHNlIHsKKwkJCXByaW50X251bWJlcnMoTEFCRUxfY2x0cnBjCisJCQkJImNhbGxzICAgICAgcmV0cmFucyAgICBhdXRocmVmcnNoXG4iLAorCQkJCWNsdHJwY2luZm8sIDMpOworCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfQorCWlmIChvcHRfcHJ0ICYgUFJOVF9DQUxMUykgeworCQlpZiAoKG9wdF9wcnQgJiBQUk5UX1YyKSB8fCAKKwkJCQkoKG9wdF9wcnQgJiBQUk5UX0FVVE8pICYmIGhhc19zdGF0cyhjbHRwcm9jMmluZm8pKSkgeworCQkJaWYgKG9wdF9zbGVlcCAmJiAhaGFzX3N0YXRzKGNsdHByb2MyaW5mbykpIHsKKwkJCQk7CisJCQl9IGVsc2UgeworCQkJCXByaW50X2NhbGxzdGF0cyhMQUJFTF9jbHRwcm9jMiwKKwkJCQkJbmZzdjJuYW1lLCBjbHRwcm9jMmluZm8gKyAxLCAgCisJCQkJCXNpemVvZihuZnN2Mm5hbWUpL3NpemVvZihjaGFyICopKTsKKwkJCX0KKwkJfQorCQlpZiAoKG9wdF9wcnQgJiBQUk5UX1YzKSB8fCAKKwkJCQkoKG9wdF9wcnQgJiBQUk5UX0FVVE8pICYmIGhhc19zdGF0cyhjbHRwcm9jM2luZm8pKSkgeworCQkJaWYgKG9wdF9zbGVlcCAmJiAhaGFzX3N0YXRzKGNsdHByb2MzaW5mbykpIHsKKwkJCQk7CisJCQl9IGVsc2UgeworCQkJCXByaW50X2NhbGxzdGF0cyhMQUJFTF9jbHRwcm9jMywKKwkJCQkJbmZzdjNuYW1lLCBjbHRwcm9jM2luZm8gKyAxLCAKKwkJCQkJc2l6ZW9mKG5mc3YzbmFtZSkvc2l6ZW9mKGNoYXIgKikpOworCQkJfQorCQl9CisJCWlmICgob3B0X3BydCAmIFBSTlRfVjQpIHx8IAorCQkJCSgob3B0X3BydCAmIFBSTlRfQVVUTykgJiYgaGFzX3N0YXRzKGNsdHByb2M0aW5mbykpKSB7CisJCQlpZiAob3B0X3NsZWVwICYmICFoYXNfc3RhdHMoY2x0cHJvYzRpbmZvKSkgeworCQkJCTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRfY2FsbHN0YXRzKExBQkVMX2NsdHByb2M0LAorCQkJCQluZnNjbHRwcm9jNG5hbWUsIGNsdHByb2M0aW5mbyArIDEsICAKKwkJCQkJc2l6ZW9mKG5mc2NsdHByb2M0bmFtZSkvc2l6ZW9mKGNoYXIgKikpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfY2xudF9saXN0KGludCBvcHRfcHJ0KSAKK3sKKwlpZiAob3B0X3BydCAmIFBSTlRfQ0FMTFMpIHsKKwkJaWYgKChvcHRfcHJ0ICYgUFJOVF9WMikgfHwgCisJCQkJKChvcHRfcHJ0ICYgUFJOVF9BVVRPKSAmJiBoYXNfc3RhdHMoY2x0cHJvYzJpbmZvKSkpIHsKKwkJCWlmIChvcHRfc2xlZXAgJiYgIWhhc19zdGF0cyhjbHRwcm9jMmluZm8pKSB7CisJCQkJOworCQkJfSBlbHNlIHsKKwkJCQlwcmludF9jYWxsc3RhdHNfbGlzdCgibmZzIHYyIGNsaWVudCIsCisJCQkJCW5mc3YybmFtZSwgY2x0cHJvYzJpbmZvICsgMSwgIAorCQkJCQlzaXplb2YobmZzdjJuYW1lKS9zaXplb2YoY2hhciAqKSk7CisJCQl9CisJCX0KKwkJaWYgKChvcHRfcHJ0ICYgUFJOVF9WMykgfHwgCisJCQkJKChvcHRfcHJ0ICYgUFJOVF9BVVRPKSAmJiBoYXNfc3RhdHMoY2x0cHJvYzNpbmZvKSkpIHsKKwkJCWlmIChvcHRfc2xlZXAgJiYgIWhhc19zdGF0cyhjbHRwcm9jM2luZm8pKSB7CisJCQkJOworCQkJfSBlbHNlIHsgCisJCQkJcHJpbnRfY2FsbHN0YXRzX2xpc3QoIm5mcyB2MyBjbGllbnQiLAorCQkJCQluZnN2M25hbWUsIGNsdHByb2MzaW5mbyArIDEsIAorCQkJCQlzaXplb2YobmZzdjNuYW1lKS9zaXplb2YoY2hhciAqKSk7CisJCQl9CisJCX0KKwkJaWYgKChvcHRfcHJ0ICYgUFJOVF9WNCkgfHwgCisJCQkJKChvcHRfcHJ0ICYgUFJOVF9BVVRPKSAmJiBoYXNfc3RhdHMoY2x0cHJvYzRpbmZvKSkpIHsKKwkJCWlmIChvcHRfc2xlZXAgJiYgIWhhc19zdGF0cyhjbHRwcm9jNGluZm8pKSB7CisJCQkJOworCQkJfSBlbHNlIHsKKwkJCQlwcmludF9jYWxsc3RhdHNfbGlzdCgibmZzIHY0IG9wcyIsCisJCQkJCW5mc3NydnByb2M0b3BuYW1lLCBzcnZwcm9jNG9wc2luZm8gKyAxLCAKKwkJCQkJc2l6ZW9mKG5mc3NydnByb2M0b3BuYW1lKS9zaXplb2YoY2hhciAqKSk7CisJCQkJcHJpbnRfY2FsbHN0YXRzX2xpc3QoIm5mcyB2NCBjbGllbnQiLAorCQkJCQluZnNjbHRwcm9jNG5hbWUsIGNsdHByb2M0aW5mbyArIDEsICAKKwkJCQkJc2l6ZW9mKG5mc2NsdHByb2M0bmFtZSkvc2l6ZW9mKGNoYXIgKikpOworCQkJfQorCQl9CisJfQorfQorc3RhdGljIHZvaWQKK3ByaW50X3NlcnZfbGlzdChpbnQgb3B0X3BydCkgCit7CisJaWYgKG9wdF9wcnQgJiBQUk5UX0NBTExTKSB7CisJCWlmICgob3B0X3BydCAmIFBSTlRfVjIpIHx8IAorCQkJCSgob3B0X3BydCAmIFBSTlRfQVVUTykgJiYgaGFzX3N0YXRzKHNydnByb2MyaW5mbykpKSB7CisJCQlpZiAob3B0X3NsZWVwICYmICFoYXNfc3RhdHMoc3J2cHJvYzJpbmZvKSkgeworCQkJCTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRfY2FsbHN0YXRzX2xpc3QoIm5mcyB2MiBzZXJ2ZXIiLAorCQkJCQluZnN2Mm5hbWUsIHNydnByb2MyaW5mbyArIDEsIAorCQkJCQlzaXplb2YobmZzdjJuYW1lKS9zaXplb2YoY2hhciAqKSk7CisJCQl9CisJCX0KKwkJaWYgKChvcHRfcHJ0ICYgUFJOVF9WMykgfHwgCisJCQkJKChvcHRfcHJ0ICYgUFJOVF9BVVRPKSAmJiBoYXNfc3RhdHMoc3J2cHJvYzNpbmZvKSkpIHsKKwkJCWlmIChvcHRfc2xlZXAgJiYgIWhhc19zdGF0cyhzcnZwcm9jM2luZm8pKSB7CisJCQkJOworCQkJfSBlbHNlIHsKKwkJCQlwcmludF9jYWxsc3RhdHNfbGlzdCgibmZzIHYzIHNlcnZlciIsCisJCQkJCW5mc3YzbmFtZSwgc3J2cHJvYzNpbmZvICsgMSwgCisJCQkJCXNpemVvZihuZnN2M25hbWUpL3NpemVvZihjaGFyICopKTsKKwkJCX0KKwkJfQorCQlpZiAoKG9wdF9wcnQgJiBQUk5UX1Y0KSB8fCAKKwkJCQkoKG9wdF9wcnQgJiBQUk5UX0FVVE8pICYmIGhhc19zdGF0cyhzcnZwcm9jNG9wc2luZm8pKSkgeworCQkJaWYgKG9wdF9zbGVlcCAmJiAhaGFzX3N0YXRzKHNydnByb2M0aW5mbykpIHsKKwkJCQk7CisJCQl9IGVsc2UgeworCQkJCXByaW50X2NhbGxzdGF0c19saXN0KCJuZnMgdjQgb3BzIiwKKwkJCQkJbmZzc3J2cHJvYzRvcG5hbWUsIHNydnByb2M0b3BzaW5mbyArIDEsIAorCQkJCQlzaXplb2YobmZzc3J2cHJvYzRvcG5hbWUpL3NpemVvZihjaGFyICopKTsKKwkJCX0KKwkJfQorCX0KK30KK3N0YXRpYyB2b2lkCitwcmludF9zdGF0c19saXN0KGludCBvcHRfc3J2LCBpbnQgb3B0X2NsdCwgaW50IG9wdF9wcnQpIAoreworCWlmIChvcHRfc3J2KQorCQlwcmludF9zZXJ2X2xpc3Qob3B0X3BydCk7CisKKwlpZiAob3B0X2NsdCkKKwkJcHJpbnRfY2xudF9saXN0KG9wdF9wcnQpOworfQorCitzdGF0aWMgc3RhdGluZm8gKgorZ2V0X3N0YXRfaW5mbyhjb25zdCBjaGFyICpzcCwgc3RydWN0IHN0YXRpbmZvICpzdGF0cCkKK3sKKwlzdHJ1Y3Qgc3RhdGluZm8gKmlwOworCisJZm9yIChpcCA9IHN0YXRwOyBpcC0+dGFnOyBpcCsrKSB7CisJCWlmICghc3RyY21wKHNwLCBpcC0+dGFnKSkKKwkJCXJldHVybiBpcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X251bWJlcnMoY29uc3QgY2hhciAqaGRyLCB1bnNpZ25lZCBpbnQgKmluZm8sIHVuc2lnbmVkIGludCBucikKK3sKKwl1bnNpZ25lZCBpbnQJaTsKKworCWZwdXRzKGhkciwgc3Rkb3V0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKKwkJcHJpbnRmKCIlcyUtOHUiLCBpPyAiICAgIiA6ICIiLCBpbmZvW2ldKTsKKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9jYWxsc3RhdHMoY29uc3QgY2hhciAqaGRyLCBjb25zdCBjaGFyICoqbmFtZXMsCisJCQkJIHVuc2lnbmVkIGludCAqaW5mbywgdW5zaWduZWQgaW50IG5yKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZwl0b3RhbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcJcGN0OworCWludAkJaSwgajsKKworCWZwdXRzKGhkciwgc3Rkb3V0KTsKKwlmb3IgKGkgPSAwLCB0b3RhbCA9IDA7IGkgPCBucjsgaSsrKQorCQl0b3RhbCArPSBpbmZvW2ldOworCWlmICghdG90YWwpCisJCXRvdGFsID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkgKz0gNikgeworCQlmb3IgKGogPSAwOyBqIDwgNiAmJiBpICsgaiA8IG5yOyBqKyspCisJCQlwcmludGYoIiUtMTNzIiwgbmFtZXNbaStqXSk7CisJCXByaW50ZigiXG4iKTsKKwkJZm9yIChqID0gMDsgaiA8IDYgJiYgaSArIGogPCBucjsgaisrKSB7CisJCQlwY3QgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5mb1tpK2pdKjEwMCkvdG90YWw7CisJCQlwcmludGYoIiUtOHUlM2xsdSUlICIsIGluZm9baStqXSwgcGN0KTsKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2NhbGxzdGF0c19saXN0KGNvbnN0IGNoYXIgKmhkciwgY29uc3QgY2hhciAqKm5hbWVzLAorCQkgCXVuc2lnbmVkIGludCAqY2FsbGluZm8sIHVuc2lnbmVkIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcJY2FsbHRvdGFsOworCWludAkJCWk7CisKKwlmb3IgKGkgPSAwLCBjYWxsdG90YWwgPSAwOyBpIDwgbnI7IGkrKykgeworCQljYWxsdG90YWwgKz0gY2FsbGluZm9baV07CisJfQorCWlmICghY2FsbHRvdGFsKQorCQlyZXR1cm47CisJcHJpbnRmKCIlMTNzICUxM3MgJThsbHUgXG4iLCBoZHIsICJ0b3RhbDoiLCBjYWxsdG90YWwpOworCXByaW50ZigiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIC0tLS0tLS0tXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJaWYgKGNhbGxpbmZvW2ldKQorCQkJCXByaW50ZigiJTEzcyAlMTJzOiAlOHUgXG4iLCBoZHIsIG5hbWVzW2ldLCBjYWxsaW5mb1tpXSk7CisJfQorCXByaW50ZigiXG4iKTsKKwkJCit9CisKKworLyogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50CitwYXJzZV9yYXdfc3RhdGZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHN0YXRpbmZvICpzdGF0cCkKK3sKKwljaGFyCWJ1ZmZlcls0MDk2XSwgKm5leHQ7CisJRklMRQkqZnA7CisKKwkvKiBCZWluZyB1bmFibGUgdG8gcmVhZCBlLmcuIHRoZSBuZnNkIHN0YXRzIGZpbGUgc2hvdWxkbid0CisJICogYmUgYSBmYXRhbCBlcnJvciAtLSBpdCB1c3VhbGx5IG1lYW5zIHRoZSBtb2R1bGUgaXNuJ3QgbG9hZGVkLgorCSAqLworCWlmICgoZnAgPSBmb3BlbihuYW1lLCAiciIpKSA9PSBOVUxMKSB7CisJCS8vIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogJXM6ICVtXG4iLCBuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZwKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0aW5mbwkqaXA7CisJCWNoYXIJCSpzcCwgKmxpbmUgPSBidWZmZXI7CisJCXVuc2lnbmVkIGludCAgICBpLCBjbnQ7CisJCXVuc2lnbmVkIGludAl0b3RhbCA9IDA7CisKKwkJaWYgKChuZXh0ID0gc3RyY2hyKGxpbmUsICdcbicpKSAhPSBOVUxMKQorCQkJKm5leHQrKyA9ICdcMCc7CisJCWlmICghKHNwID0gc3RydG9rKGxpbmUsICIgXHQiKSkpCisJCQljb250aW51ZTsKKworCQlpcCA9IGdldF9zdGF0X2luZm8oc3AsIHN0YXRwKTsKKwkJaWYgKCFpcCkKKwkJCWNvbnRpbnVlOworCisJCWNudCA9IGlwLT5ucnZhbHM7CisKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCQlpZiAoIShzcCA9IHN0cnRvayhOVUxMLCAiIFx0IikpKQorCQkJCWJyZWFrOworCQkJaXAtPnZhbHB0cltpXSA9ICh1bnNpZ25lZCBpbnQpIHN0cnRvdWwoc3AsIE5VTEwsIDApOworCQkJdG90YWwgKz0gaXAtPnZhbHB0cltpXTsKKwkJfQorCQlpcC0+dmFscHRyW2NudCAtIDFdID0gdG90YWw7CisJfQorCisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKK30KKworLyogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDEgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50CitwYXJzZV9wcmV0dHlfc3RhdGZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBzdGF0aW5mbyAqaW5mbykKK3sKKwlpbnQgbnVtdmFscywgY3VyaW5kZXgsIG51bWNvbnN1bWVkLCBuLCBlcnIgPSAxOworCXVuc2lnbmVkIGludCBzdW07CisJY2hhciBidWZbNDA5Nl0sICpidWZwLCAqZm10LCBpc19wcm9jOworCUZJTEUgKmZwID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdGluZm8gKmlwOworCisJaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKQorCQkvL2VycigyLCAiVW5hYmxlIHRvIG9wZW4gc3RhdGZpbGUgJyVzJy5cbiIsIGZpbGVuYW1lKTsKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApICE9IE5VTEwpIHsKKwkJZm9yIChpcCA9IGluZm87IGlwLT50YWc7IGlwKyspIHsKKwkJCWlmIChzdHJjbXAoYnVmLCBpcC0+bGFiZWwpKQorCQkJCWNvbnRpbnVlOworCisJCQlzdW0gPSAwOworCQkJbnVtdmFscyA9IGlwLT5ucnZhbHMgLSAxOworCQkJaXNfcHJvYyA9IHN0cm5jbXAoInByb2MiLCBpcC0+dGFnLCA0KSA/IDAgOiAxOworCQkJaWYgKGlzX3Byb2MpIHsKKwkJCQlmbXQgPSAiICV1ICUqdSUlICVuIjsKKwkJCQljdXJpbmRleCA9IDE7CisJCQkJaXAtPnZhbHB0clswXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWZtdCA9ICIgJXUgJW4iOworCQkJCWN1cmluZGV4ID0gMDsKKwkJCX0KK21vcmVfc3RhdHM6CisJCQkvKiBnZXQgKGFuZCBza2lwKSBoZWFkZXIgKi8KKwkJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgPT0gTlVMTCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvY2F0ZSBoZWFkZXIgYWZ0ZXIgIgorCQkJCQkJImxhYmVsIGZvciAnJXMnIGluICVzLlxuIiwKKwkJCQkJCWlwLT50YWcsIGZpbGVuYW1lKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIG5vIGhlYWRlciAtLSBkb25lIHdpdGggdGhpcyAidGFnIiAqLworCQkJaWYgKCpidWYgPT0gJ1xuJykgeworCQkJCWlwLT52YWxwdHJbbnVtdmFsc10gPSBzdW07CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBnZXQgc3RhdHMgKi8KKwkJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkgPT0gTlVMTCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvY2F0ZSBzdGF0cyBhZnRlciAiCisJCQkJCQkiaGVhZGVyIGZvciAnJXMnIGluICVzLlxuIiwKKwkJCQkJCWlwLT50YWcsIGZpbGVuYW1lKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJ1ZnAgPSBidWY7CisJCQlmb3IgKDsgY3VyaW5kZXggPCBudW12YWxzOyBjdXJpbmRleCsrKSB7CisJCQkJbiA9IHNzY2FuZihidWZwLCBmbXQsICZpcC0+dmFscHRyW2N1cmluZGV4XSwKKwkJCQkJCSZudW1jb25zdW1lZCk7CisJCQkJaWYgKG4gIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGlzX3Byb2MpIHsKKwkJCQkJaXAtPnZhbHB0clswXSsrOworCQkJCQlzdW0rKzsKKwkJCQl9CisJCQkJc3VtICs9IGlwLT52YWxwdHJbY3VyaW5kZXhdOworCQkJCWJ1ZnAgKz0gbnVtY29uc3VtZWQ7CisJCQl9CisJCQlnb3RvIG1vcmVfc3RhdHM7CisJCX0KKwl9CisJZXJyID0gMDsKK291dDoKKwlpZiAoZnApCisJCWZjbG9zZShmcCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorbW91bnRzKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhcglidWZmZXJbNDA5Nl0sICpuZXh0OworCUZJTEUJKmZwOworCisJLyogQmVpbmcgdW5hYmxlIHRvIHJlYWQgZS5nLiB0aGUgbmZzZCBzdGF0cyBmaWxlIHNob3VsZG4ndAorCSAqIGJlIGEgZmF0YWwgZXJyb3IgLS0gaXQgdXN1YWxseSBtZWFucyB0aGUgbW9kdWxlIGlzbid0IGxvYWRlZC4KKwkgKi8KKwlpZiAoKGZwID0gZm9wZW4obmFtZSwgInIiKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6ICVzOiAlbVxuIiwgbmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChmZ2V0cyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBmcCkgIT0gTlVMTCkgeworCQljaGFyCSAgICAgICpsaW5lID0gYnVmZmVyOworCQljaGFyICAgICAgICAgICpkZXZpY2UsICptb3VudCwgKnR5cGUsICpmbGFnczsKKworCQlpZiAoKG5leHQgPSBzdHJjaHIobGluZSwgJ1xuJykpICE9IE5VTEwpCisJCQkqbmV4dCA9ICdcMCc7CisKKwkJaWYgKCEoZGV2aWNlID0gc3RydG9rKGxpbmUsICIgXHQiKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoIShtb3VudCA9IHN0cnRvayhOVUxMLCAiIFx0IikpKQorCQkJY29udGludWU7CisKKwkJaWYgKCEodHlwZSA9IHN0cnRvayhOVUxMLCAiIFx0IikpKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcCh0eXBlLCAibmZzIikgJiYgc3RyY21wKHR5cGUsIm5mczQiKSkgeworCQkgICAgY29udGludWU7CisJCX0KKworCQlpZiAoIShmbGFncyA9IHN0cnRvayhOVUxMLCAiIFx0IikpKQorCQkJY29udGludWU7CisKKwkJcHJpbnRmKCIlcyBmcm9tICVzXG4iLCBtb3VudCwgZGV2aWNlKTsKKwkJcHJpbnRmKCIgRmxhZ3M6XHQlc1xuIiwgZmxhZ3MpOworCQlwcmludGYoIlxuIik7CisKKwkJY29udGludWU7CisJfQorCisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK2dldF9zdGF0cyhjb25zdCBjaGFyICpmaWxlLCBzdHJ1Y3Qgc3RhdGluZm8gKmluZm8sIGludCAqb3B0LCBpbnQgb3RoZXJfb3B0LAorCQlpbnQgaXNfc3J2KQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmWzEwXTsKKwlpbnQgZXJyID0gMTsKKwljaGFyICpsYWJlbCA9IGlzX3NydiA/ICJTZXJ2ZXIiIDogIkNsaWVudCI7CisKKwkvKiB0cnkgdG8gZ3Vlc3Mgd2hhdCB0eXBlIG9mIHN0YXQgZmlsZSB3ZSdyZSBkZWFsaW5nIHdpdGggKi8KKwlpZiAoKGZwID0gZm9wZW4oZmlsZSwgInIiKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKGZnZXRzKGJ1ZiwgMTAsIGZwKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoIXN0cm5jbXAoYnVmLCAibmV0ICIsIDQpKSB7CisJCS8qIGxvb2tzIGxpa2UgcmF3IGNsaWVudCBzdGF0cyAqLworCQlpZiAoaXNfc3J2KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IG5vIHNlcnZlciBpbmZvIHByZXNlbnQgaW4gIgorCQkJCQkicmF3IGNsaWVudCBzdGF0cyBmaWxlLlxuIik7CisJCQkqb3B0ID0gMDsKKwkJfSBlbHNlCisJCQllcnIgPSBwYXJzZV9yYXdfc3RhdGZpbGUoZmlsZSwgaW5mbyk7CisJfSBlbHNlIGlmICghc3RybmNtcChidWYsICJyYyAiLCAzKSkgeworCQkvKiBsb29rcyBsaWtlIHJhdyBzZXJ2ZXIgc3RhdHMgKi8KKwkJaWYgKCFpc19zcnYpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogbm8gY2xpZW50IGluZm8gcHJlc2VudCBpbiAiCisJCQkJCSJyYXcgc2VydmVyIHN0YXRzIGZpbGUuXG4iKTsKKwkJCSpvcHQgPSAwOworCQl9IGVsc2UKKwkJCWVyciA9IHBhcnNlX3Jhd19zdGF0ZmlsZShmaWxlLCBpbmZvKTsKKwl9IGVsc2UKKwkJLyogbG9va3MgbGlrZSBwcmV0dHkgY2xpZW50IGFuZCBzZXJ2ZXIgc3RhdHMgKi8KKwkJZXJyID0gcGFyc2VfcHJldHR5X3N0YXRmaWxlKGZpbGUsIGluZm8pOworb3V0OgorCWlmIChmcCkKKwkJZmNsb3NlKGZwKTsKKwlpZiAoZXJyKSB7CisJCWlmICghb3RoZXJfb3B0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBObyAlcyBTdGF0cyAoJXM6ICVtKS4gXG4iLAorCQkJCQlsYWJlbCwgZmlsZSk7CisJCQlleGl0KDIpOworCQl9CisJCSpvcHQgPSAwOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgZm9yIHByb2MyLzMvNC10eXBlIHN0YXRzLCB3aGVyZSwgaW4gdGhlIC9wcm9jIGZpbGVzLCB0aGUgZmlyc3QgZW50cnkncyB2YWx1ZQorICogZGVub3RlcyB0aGUgbnVtYmVyIG9mIHN1YnNlcXVlbnQgZW50cmllcy4gIHN0YXRpbmZvIHZhbHVlIGFycmF5cyBjb250YWluIGFuIGFkZGl0aW9uYWwKKyAqIGZpZWxkIGF0IHRoZSBlbmQgd2hpY2ggY29udGFpbnMgdGhlIHN1bSBvZiBhbGwgcHJldmlvdXMgZWxlbWVudHMgaW4gdGhlIGFycmF5IC0tIHNvLAorICogdGhlcmUgYXJlIHN0YXRzIGlmIHRoZSBzdW0ncyBncmVhdGVyIHRoYW4gdGhlIGVudHJ5LWNvdW50LgorICovCitzdGF0aWMgaW50CitoYXNfc3RhdHMoY29uc3QgdW5zaWduZWQgaW50ICppbmZvKQoreworCXJldHVybiAoaW5mb1swXSAmJiBpbmZvW2luZm9bMF0gKyAxXSA+IGluZm9bMF0pOworfQorc3RhdGljIGludAoraGFzX3JwY3N0YXRzKGNvbnN0IHVuc2lnbmVkIGludCAqaW5mbywgaW50IHNpemUpCit7CisJaW50IGksIGNudDsKKworCWZvciAoaT0wLCBjbnQ9MDsgaSA8IHNpemU7IGkrKykKKwkJY250ICs9IGluZm9baV07CisJcmV0dXJuIGNudDsKK30KKworLyoKKyAqIHRha2UgdGhlIGRpZmZlcmVuY2Ugb2YgZWFjaCBpbmRpdmlkdWFsIHN0YXQgdmFsdWUgaW4gJ25ldycgYW5kICdvbGQnCisgKiBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgYmFjayBpbnRvICduZXcnCisgKi8KK3N0YXRpYyB2b2lkCitkaWZmX3N0YXRzKHN0cnVjdCBzdGF0aW5mbyAqbmV3LCBzdHJ1Y3Qgc3RhdGluZm8gKm9sZCwgaW50IGlzX3NydikKK3sKKwlpbnQgaSwgaiwgbm9kaWZmX2ZpcnN0X2luZGV4LCBzaG91bGRfZGlmZjsKKworCS8qCisJICogRGlmZmVyZW50IHN0YXQgdHlwZXMgaGF2ZSBkaWZmZXJlbnQgZm9ybWF0cyBpbiB0aGUgL3Byb2MKKwkgKiBmaWxlczogZm9yIHRoZSBwcm9jMi8zLzQtdHlwZSBzdGF0cywgdGhlIGZpcnN0IGVudHJ5IGhhcworCSAqIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3Vic2VxdWVudCBlbnRyaWVzOyBvbmUgZG9lcyBub3Qgd2FudAorCSAqIHRvIGRpZmYgdGhhdCBmaXJzdCBlbnRyeS4gIFRoZSBvdGhlciBzdGF0IHR5cGVzIGFyZW4ndCBsaWtlCisJICogdGhpcy4gIFNvLCB3ZSBkaWZmIGEgZ2l2ZW4gZW50cnkgaWYgaXQncyBub3Qgb2Ygb25lIG9mIHRoZQorCSAqIHByb2NYIHR5cGVzICgiaSIgPCAyIGZvciBjbHQsIDwgNCBmb3Igc3J2KSwgb3IgaWYgaXQncyBub3QKKwkgKiB0aGUgZmlyc3QgZW50cnkgKCJqIiA+IDApLgorCSAqLworCW5vZGlmZl9maXJzdF9pbmRleCA9IDIgKyAoMiAqIGlzX3Nydik7CisKKwlmb3IgKGkgPSAwOyBvbGRbaV0udGFnOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG5ld1tpXS5ucnZhbHM7IGorKykgeworCQkJc2hvdWxkX2RpZmYgPSAoaSA8IG5vZGlmZl9maXJzdF9pbmRleCB8fCBqID4gMCk7CisJCQlpZiAoc2hvdWxkX2RpZmYpCisJCQkJbmV3W2ldLnZhbHB0cltqXSAtPSBvbGRbaV0udmFscHRyW2pdOworCQl9CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgdGhlICJ0b3RhbHMiIGVudHJ5IChsYXN0IHZhbHVlIGluCisJCSAqIGVhY2ggc3RhdCBhcnJheSkgZm9yIHRoZSBwcm9jWC10eXBlIHN0YXRzIGhhcyB0aGUKKwkJICogIm51bWVudHJpZXMiIGVudHJ5J3MgKGZpcnN0IHZhbHVlIGluIHByb2NYLXR5cGUKKwkJICogc3RhdCBhcnJheXMpIGNvbnN0YW50IHZhbHVlIGFkZGVkLWJhY2sgYWZ0ZXIgdGhlCisJCSAqIGRpZmYgLS0gaS5lLiwgaXQgc2hvdWxkIGFsd2F5cyBiZSBpbmNsdWRlZCBpbiB0aGUKKwkJICogdG90YWwuCisJCSAqLworCQlpZiAoIXN0cm5jbXAoInByb2MiLCBuZXdbaV0udGFnLCA0KSAmJiBvbGRbaV0udmFscHRyWzBdKQorCQkJbmV3W2ldLnZhbHB0cltuZXdbaV0ubnJ2YWxzIC0gMV0gKz0gbmV3W2ldLnZhbHB0clswXTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit1bnBhdXNlKGludCBzaWcpCit7CisJZG91YmxlIHRpbWVfZGlmZjsKKwlpbnQgbWludXRlcywgc2Vjb25kczsKKwl0aW1lX3QgZW5kdGltZTsKKworCWVuZHRpbWUgPSB0aW1lKE5VTEwpOworCXRpbWVfZGlmZiA9IGRpZmZ0aW1lKGVuZHRpbWUsIHN0YXJ0dGltZSk7CisJbWludXRlcyA9IHRpbWVfZGlmZiAvIDYwOworCXNlY29uZHMgPSAoaW50KXRpbWVfZGlmZiAlIDYwOworCXByaW50ZigiU2lnbmFsIHJlY2VpdmVkOyBkaXNwbGF5aW5nIChvbmx5KSBzdGF0aXN0aWNzIGdhdGhlcmVkIG92ZXIgdGhlIGxhc3QgJWQgbWludXRlcywgJWQgc2Vjb25kczpcblxuIiwgbWludXRlcywgc2Vjb25kcyk7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfb2xkX2NvdW50ZXJzKHN0cnVjdCBzdGF0aW5mbyAqbmV3LCBzdHJ1Y3Qgc3RhdGluZm8gKm9sZCkKK3sKKwlpbnQgeiwgaTsKKwlmb3IgKHogPSAwOyBvbGRbel0udGFnOyB6KyspIAorCQlmb3IgKGkgPSAwOyBpIDw9IG9sZFt6XS5ucnZhbHM7IGkrKykgCisJCQlvbGRbel0udmFscHRyW2ldICs9IG5ld1t6XS52YWxwdHJbaV07CisKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNzdGF0L25mc3N0YXQubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL25mc3N0YXQvbmZzc3RhdC5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMTVhOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9uZnNzdGF0L25mc3N0YXQubWFuCkBAIC0wLDAgKzEsMTYzIEBACisuXCIKKy5cIiBuZnNzdGF0KDgpCisuXCIgCisuXCIgQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgT2xhZiBLaXJjaCA8b2tpckBzdXNlLmRlPgorLlRIIG5mc3N0YXQgOCAiNyBBdWcgMjAwNyIKKy5TSCBOQU1FCituZnNzdGF0IFwtIGxpc3QgTkZTIHN0YXRpc3RpY3MKKy5TSCBTWU5PUFNJUworLkIgbmZzc3RhdAorW1xmSU9QVElPTlxmUl0uLi4KKy5TSCBERVNDUklQVElPTgorVGhlCisuQiBuZnNzdGF0CitkaXNwbGF5cyBzdGF0aXN0aWNzIGtlcHQgYWJvdXQgTkZTIGNsaWVudCBhbmQgc2VydmVyIGFjdGl2aXR5LgorLlNIIE9QVElPTlMKKy5UUAorLkIgXC1zLCBcLVwtc2VydmVyCitQcmludCBvbmx5IHNlcnZlci1zaWRlIHN0YXRpc3RpY3MuIFRoZSBkZWZhdWx0IGlzIHRvIHByaW50IGJvdGggc2VydmVyIGFuZAorY2xpZW50IHN0YXRpc3RpY3MuCisuVFAKKy5CIFwtYywgXC1cLWNsaWVudAorUHJpbnQgb25seSBjbGllbnQtc2lkZSBzdGF0aXN0aWNzLgorLlRQCisuQiBcLW4sIFwtXC1uZnMKK1ByaW50IG9ubHkgTkZTIHN0YXRpc3RpY3MuIFRoZSBkZWZhdWx0IGlzIHRvIHByaW50IGJvdGggTkZTIGFuZCBSUEMKK2luZm9ybWF0aW9uLgorLlRQCisuQiBcLTIKK1ByaW50IG9ubHkgTkZTIHYyIHN0YXRpc3RpY3MuIFRoZSBkZWZhdWx0IGlzIHRvIG9ubHkgcHJpbnQgaW5mb3JtYXRpb24KK2Fib3V0IHRoZSB2ZXJzaW9ucyBvZiBcZkJORlNcZlIgdGhhdCBoYXZlIG5vbi16ZXJvIGNvdW50cy4KKy5UUAorLkIgXC0zCitQcmludCBvbmx5IE5GUyB2MyBzdGF0aXN0aWNzLiAKKy5UUAorLkIgXC00CitQcmludCBvbmx5IE5GUyB2NCBzdGF0aXN0aWNzLiAKKy5UUAorLkIgXC1tLCBcLVwtbW91bnRzCitQcmludCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG9mIHRoZSBtb3VudGVkIFxmQk5GU1xmUiBmaWxlIHN5c3RlbXMuCisKK0lmIHRoaXMgb3B0aW9uIGlzIHVzZWQsIGFsbCBvdGhlciBvcHRpb25zIGFyZSBpZ25vcmVkLgorLlRQCisuQiBcLXIsIFwtXC1ycGMKK1ByaW50IG9ubHkgUlBDIHN0YXRpc3RpY3MuCisuVFAKKy5CSSBcLW8gIiBmYWNpbGl0eQorRGlzcGxheSBzdGF0aXN0aWNzIGZvciB0aGUgc3BlY2lmaWVkIGZhY2lsaXR5LCB3aGljaCBtdXN0IGJlIG9uZSBvZjoKKy5SUworLlRQCisuQiBuZnMKK05GUyBwcm90b2NvbCBpbmZvcm1hdGlvbiwgc3BsaXQgdXAgYnkgUlBDIGNhbGwuCisuVFAKKy5CIHJwYworR2VuZXJhbCBSUEMgaW5mb3JtYXRpb24uCisuVFAKKy5CIG5ldAorTmV0d29yayBsYXllciBzdGF0aXN0aWNzLCBzdWNoIGFzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cywgbnVtYmVyCitvZiBUQ1AgY29ubmVjdGlvbnMsIGV0Yy4KKy5UUAorLkIgZmgKK1VzYWdlIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIncyBmaWxlIGhhbmRsZSBjYWNoZSwgaW5jbHVkaW5nIHRoZQordG90YWwgbnVtYmVyIG9mIGxvb2t1cHMsIGFuZCB0aGUgbnVtYmVyIG9mIGhpdHMgYW5kIG1pc3Nlcy4KKy5UUAorLkIgcmMKK1VzYWdlIGluZm9ybWF0aW9uIG9uIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHJlcGx5IGNhY2hlLCBpbmNsdWRpbmcgdGhlCit0b3RhbCBudW1iZXIgb2YgbG9va3VwcywgYW5kIHRoZSBudW1iZXIgb2YgaGl0cyBhbmQgbWlzc2VzLgorLlRQCisuQiBhbGwKK0Rpc3BsYXkgYWxsIG9mIHRoZSBhYm92ZSBmYWNpbGl0aWVzLgorLlJFCisuVFAKKy5CIFwtdiwgXC1cLXZlcmJvc2UKK1RoaXMgaXMgZXF1aXZhbGVudCB0byBcZkJcLW8gYWxsXGZSLgorLlRQCisuQiBcLWwsIFwtXC1saXN0CitQcmludCBpbmZvcm1hdGlvbiBpbiBsaXN0IGZvcm0uCisuVFAKKy5CSSAiXC1TLCBcLVwtc2luY2UgIiBmaWxlCitJbnN0ZWFkIG9mIHByaW50aW5nIGN1cnJlbnQgc3RhdGlzdGljcywgCisuQiBuZnNzdGF0CitpbXBvcnRzIHN0YXRpc3RpY3MgZnJvbQorLkkgZmlsZQorYW5kIGRpc3BsYXlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhvc2UgYW5kIHRoZSBjdXJyZW50IHN0YXRpc3RpY3MuCitWYWxpZCBpbnB1dAorLklSIGZpbGUgInMgbWF5IGJlIGluIHRoZSBmb3JtIG9mICIKKy5CIC9wcm9jL25ldC9ycGMvbmZzCisocmF3IGNsaWVudCBzdGF0cyksCisuQiAvcHJvYy9uZXQvcnBjL25mc2QKKyhyYXcgc2VydmVyIHN0YXRzKSwgb3Igc2F2ZWQgb3V0cHV0IGZyb20KKy5CIG5mc3N0YXQKK2l0c2VsZiAoY2xpZW50IGFuZC9vciBzZXJ2ZXIgc3RhdHMpLiAgIEFueSBzdGF0aXN0aWNzIG1pc3NpbmcgZnJvbSBhIHNhdmVkCisuQiBuZnNzdGF0CitvdXRwdXQgCisuSSBmaWxlCithcmUgdHJlYXRlZCBhcyB6ZXJvZXMuCisuVFAKKy5CIFwtWltpbnRlcnZhbF0sIFwtXC1zbGVlcD1baW50ZXJ2YWxdCitJbnN0ZWFkIG9mIHByaW50aW5nIGN1cnJlbnQgc3RhdGlzdGljcyBhbmQgaW1tZWRpYXRlbHkgZXhpdGluZywKKy5CIG5mc3N0YXQKK3Rha2VzIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgc3RhdGlzdGljcyBhbmQgcGF1c2VzIHVudGlsIGl0IHJlY2VpdmVzCisuQiBTSUdJTlQKKyh0eXBpY2FsbHkgZnJvbQorLkJSIEN0cmwtQyApLAorYXQgd2hpY2ggcG9pbnQgaXQgdGFrZXMgYW5vdGhlciBzbmFwc2hvdCBhbmQgZGlzcGxheXMgdGhlIGRpZmZlcmVuY2UKK2JldHdlZW4gdGhlIHR3by4KK0lmIFxmSWludGVydmFsXGZSIGlzIHNwZWNpZmllZCwgCisuQiBuZnNzdGF0Cit3aWxsIHByaW50IHRoZSBudW1iZXIgb2YgXGZCTkZTXGZSIGNhbGxzIG1hZGUgc2luY2UgdGhlIHByZXZpb3VzIHJlcG9ydC4KK1N0YXRzIHdpbGwgYmUgcHJpbnRlZCByZXBlYXRlZGx5IGV2ZXJ5IFxmSWludGVydmFsXGZSIHNlY29uZHMuCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVYQU1QTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5TSCBFWEFNUExFUworLlRQCisuQiBuZnNzdGF0IFwtbyBhbGwgXC0yMzQKK1Nob3cgYWxsIGluZm9ybWF0aW9uIGFib3V0IGFsbCB2ZXJzaW9ucyBvZiBcZkJORlNcZlIuCisuVFAKKy5CIG5mc3N0YXQgXC1cLXZlcmJvc2UgXC0yMzQKK1NhbWUgYXMgYWJvdmUuCisuVFAKKy5CIG5mc3N0YXQgXC1vIGFsbAorU2hvdyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIHZlcnNpb25zIG9mIFxmQk5GU1xmUi4KKy5UUAorLkIgbmZzc3RhdCBcLVwtbmZzIFwtXC1zZXJ2ZXIgXC0zCitTaG93IHN0YXRpc3RpY3MgZm9yIFxmQk5GU1xmUiB2ZXJzaW9uIDMgc2VydmVyLgorLlRQCisuQiBuZnNzdGF0IFwtbQorU2hvdyBpbmZvcm1hdGlvbiBhYm91dCBtb3VudGVkIFxmQk5GU1xmUiBmaWxlc3lzdGVtcy4KKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRElTUExBWSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIIERJU1BMQVkKK1RoZSBcZkJGbGFnc1xmUiBvdXRwdXQgZnJvbSB0aGUgXGZCXC1tXGZSIG9wdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUKK2ZsYWdzIGdpdmUgdG8gdGhlIFxmQm1vdW50XGZSIGNvbW1hbmQuCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZJTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5TSCBGSUxFUworLlRQCisuQiAvcHJvYy9uZXQvcnBjL25mc2QKKy5CUiBwcm9jZnMgLWJhc2VkCitpbnRlcmZhY2UgdG8ga2VybmVsIE5GUyBzZXJ2ZXIgc3RhdGlzdGljcy4KKy5UUAorLkIgL3Byb2MvbmV0L3JwYy9uZnMKKy5CUiBwcm9jZnMgLWJhc2VkCitpbnRlcmZhY2UgdG8ga2VybmVsIE5GUyBjbGllbnQgc3RhdGlzdGljcy4KKy5UUAorLkIgL3Byb2MvbW91bnRzCisuQlIgcHJvY2ZzIC1iYXNlZAoraW50ZXJmYWNlIHRvIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW1zLgorLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFNFRSBBTFNPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuU0ggU0VFIEFMU08KKy5CUiBycGMubmZzZCAoOCkuCisuQlIgbmZzICg1KS4KKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJVR1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIIEJVR1MKK1RoZSBkZWZhdWx0IG91dHB1dCBoYXMgYmVlbiBjaGFuZ2VkLiAgVG8gZ2V0IHRoZSBvbGQgZGVmYXVsdCBvdXRwdXQgeW91IG11c3QgcnVuIFxmQm5mc3N0YXQgXC1cLWF1dG8gXC0yXGZSLgorLlAKK1RoZSBmdW5jdGlvbiBvZiB0aGUgXGZCXC12XGZSIGFuZCBcZkJcLWFcZlIgb3B0aW9ucyBoYXZlIGNoYW5nZWQuIFRoZSBcZkJcLWFcZlIgb3B0aW9uCitpcyBub3cgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIFRoZSBcZkJcLXZcZlIgZG9lcyB3aGF0IHRoZSBcZkJcLWFcZlIgb3B0aW9uIHVzZWQgdG8gZG8sCithbmQgdGhlIG5ldyBcZkJcLVsyMzRdXGZSIG9wdGlvbnMgcmVwbGFjZSB0aGUgXGZCXC12XGZSIG9wdGlvbi4KKy5QCitUaGUgXGZCRGlzcGxheVxmUiBzZWN0aW9uIHNob3VsZCBiZSBtb3JlIGNvbXBsZXRlLgorLlAKK0Z1cnRoZXIgYnVncyBjYW4gYmUgZm91bmQgb3IgcmVwb3J0ZWQgYXQgCisuQlIgaHR0cDovL25mcy5zZi5uZXQvIC4KKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBBVVRIT1IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIIEFVVEhPUgorT2xhZiBLaXJjaCwgPG9raXJAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zaG93bW91bnQvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2IyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTQgQEAKKyMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgorCittYW44X01BTlMJPSBzaG93bW91bnQubWFuCitFWFRSQV9ESVNUCT0gJChtYW44X01BTlMpCisKK3NiaW5fUFJPR1JBTVMJPSBzaG93bW91bnQKK3Nob3dtb3VudF9TT1VSQ0VTID0gc2hvd21vdW50LmMKK3Nob3dtb3VudF9MREFERCA9IC4uLy4uL3N1cHBvcnQvZXhwb3J0L2xpYmV4cG9ydC5hIFwKKwkJICAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJICAJICAuLi8uLi9zdXBwb3J0L21pc2MvbGlibWlzYy5hCitzaG93bW91bnRfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAgIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvZXhwb3J0CisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zaG93bW91bnQvTWFrZWZpbGUuaW4gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTQ3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L01ha2VmaWxlLmluCkBAIC0wLDAgKzEsNjY0IEBACisjIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBieSBhdXRvbWFrZSAxLjExLjEgZnJvbSBNYWtlZmlsZS5hbS4KKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsCisjIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyMgSW5jLgorIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKKyMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAorIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCisjIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKworQFNFVF9NQUtFQAorCitWUEFUSCA9IEBzcmNkaXJACitwa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKK3BrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAorcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAorcGtnbGliZXhlY2RpciA9ICQobGliZXhlY2RpcikvQFBBQ0tBR0VACithbV9fY2QgPSBDRFBBVEg9IiQke1pTSF9WRVJTSU9OKy59JChQQVRIX1NFUEFSQVRPUikiICYmIGNkCitpbnN0YWxsX3NoX0RBVEEgPSAkKGluc3RhbGxfc2gpIC1jIC1tIDY0NAoraW5zdGFsbF9zaF9QUk9HUkFNID0gJChpbnN0YWxsX3NoKSAtYworaW5zdGFsbF9zaF9TQ1JJUFQgPSAkKGluc3RhbGxfc2gpIC1jCitJTlNUQUxMX0hFQURFUiA9ICQoSU5TVEFMTF9EQVRBKQordHJhbnNmb3JtID0gJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKQorTk9STUFMX0lOU1RBTEwgPSA6CitQUkVfSU5TVEFMTCA9IDoKK1BPU1RfSU5TVEFMTCA9IDoKK05PUk1BTF9VTklOU1RBTEwgPSA6CitQUkVfVU5JTlNUQUxMID0gOgorUE9TVF9VTklOU1RBTEwgPSA6CitidWlsZF90cmlwbGV0ID0gQGJ1aWxkQAoraG9zdF90cmlwbGV0ID0gQGhvc3RACitzYmluX1BST0dSQU1TID0gc2hvd21vdW50JChFWEVFWFQpCitzdWJkaXIgPSB1dGlscy9zaG93bW91bnQKK0RJU1RfQ09NTU9OID0gJChzcmNkaXIpL01ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5pbgorQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAorYW1fX2FjbG9jYWxfbTRfZGVwcyA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC9ic2RzaWduYWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvaXB2Ni5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2tlcmJlcm9zNS5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYmJsa2lkLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliY2FwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliZXZlbnQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJuZnNpZG1hcC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnJwY3NlY2dzcy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYnRpcnBjLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbmZzLXV0aWxzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvcnBjc2VjX3ZlcnMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC90Y3Atd3JhcHBlcnMubTQgXAorCSQodG9wX3NyY2RpcikvY29uZmlndXJlLmFjCithbV9fY29uZmlndXJlX2RlcHMgPSAkKGFtX19hY2xvY2FsX200X2RlcHMpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykgXAorCSQoQUNMT0NBTF9NNCkKK21raW5zdGFsbGRpcnMgPSAkKGluc3RhbGxfc2gpIC1kCitDT05GSUdfSEVBREVSID0gJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZS9jb25maWcuaAorQ09ORklHX0NMRUFOX0ZJTEVTID0KK0NPTkZJR19DTEVBTl9WUEFUSF9GSUxFUyA9CithbV9faW5zdGFsbGRpcnMgPSAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSIKK1BST0dSQU1TID0gJChzYmluX1BST0dSQU1TKQorYW1fc2hvd21vdW50X09CSkVDVFMgPSBzaG93bW91bnQtc2hvd21vdW50LiQoT0JKRVhUKQorc2hvd21vdW50X09CSkVDVFMgPSAkKGFtX3Nob3dtb3VudF9PQkpFQ1RTKQorc2hvd21vdW50X0RFUEVOREVOQ0lFUyA9IC4uLy4uL3N1cHBvcnQvZXhwb3J0L2xpYmV4cG9ydC5hIFwKKwkuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSAuLi8uLi9zdXBwb3J0L21pc2MvbGlibWlzYy5hCitERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKK2FtX19tdiA9IG12IC1mCitDT01QSUxFID0gJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpIFwKKwkkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitMVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSBcCisJJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQorQ0NMRCA9ICQoQ0MpCitMSU5LID0gJChMSUJUT09MKSAtLXRhZz1DQyAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIFwKKwktLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChBTV9MREZMQUdTKSBcCisJJChMREZMQUdTKSAtbyAkQAorU09VUkNFUyA9ICQoc2hvd21vdW50X1NPVVJDRVMpCitESVNUX1NPVVJDRVMgPSAkKHNob3dtb3VudF9TT1VSQ0VTKQorYW1fX3ZwYXRoX2Fkal9zZXR1cCA9IHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzfC58LnxnJ2A7CithbV9fdnBhdGhfYWRqID0gY2FzZSAkJHAgaW4gXAorICAgICQoc3JjZGlyKS8qKSBmPWBlY2hvICIkJHAiIHwgc2VkICJzfF4kJHNyY2RpcnN0cmlwL3x8ImA7OyBcCisgICAgKikgZj0kJHA7OyBcCisgIGVzYWM7CithbV9fc3RyaXBfZGlyID0gZj1gZWNobyAkJHAgfCBzZWQgLWUgJ3N8Xi4qL3x8J2A7CithbV9faW5zdGFsbF9tYXggPSA0MAorYW1fX25vYmFzZV9zdHJpcF9zZXR1cCA9IFwKKyAgc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKnxdL1xcXFwmL2cnYAorYW1fX25vYmFzZV9zdHJpcCA9IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkIC1lICJzfCQkc3JjZGlyc3RyaXAvfHwiCithbV9fbm9iYXNlX2xpc3QgPSAkKGFtX19ub2Jhc2Vfc3RyaXBfc2V0dXApOyBcCisgIGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwICQkcCI7IGRvbmUgfCBcCisgIHNlZCAic3wgJCRzcmNkaXJzdHJpcC98IHw7IicgLyAuKlwvLyFzLyAuKi8gLi87IHMsXCggLipcKS9bXi9dKiQkLFwxLCcgfCBcCisgICQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiIgfSB7IGZpbGVzWyQkMl0gPSBmaWxlc1skJDJdICIgIiAkJDE7IFwKKyAgICBpZiAoKytuWyQkMl0gPT0gJChhbV9faW5zdGFsbF9tYXgpKSBcCisgICAgICB7IHByaW50ICQkMiwgZmlsZXNbJCQyXTsgblskJDJdID0gMDsgZmlsZXNbJCQyXSA9ICIiIH0gfSBcCisgICAgRU5EIHsgZm9yIChkaXIgaW4gZmlsZXMpIHByaW50IGRpciwgZmlsZXNbZGlyXSB9JworYW1fX2Jhc2VfbGlzdCA9IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJyB8IFwKKyAgc2VkICckJCFOOyQkIU47JCQhTjskJCFOO3MvXG4vIC9nJworbWFuOGRpciA9ICQobWFuZGlyKS9tYW44CitOUk9GRiA9IG5yb2ZmCitNQU5TID0gJChtYW44X01BTlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbWFuOF9NQU5TID0gc2hvd21vdW50Lm1hbgorRVhUUkFfRElTVCA9ICQobWFuOF9NQU5TKQorc2hvd21vdW50X1NPVVJDRVMgPSBzaG93bW91bnQuYworc2hvd21vdW50X0xEQUREID0gLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEgXAorCQkgIC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKwkgIAkgIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEKKworc2hvd21vdW50X0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgXAorCQkgICAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2V4cG9ydAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCithbGw6IGFsbC1hbQorCisuU1VGRklYRVM6CisuU1VGRklYRVM6IC5jIC5sbyAubyAub2JqCiskKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChzcmNkaXIpL01ha2VmaWxlLmFtICAkKGFtX19jb25maWd1cmVfZGVwcykKKwlAZm9yIGRlcCBpbiAkPzsgZG8gXAorCSAgY2FzZSAnJChhbV9fY29uZmlndXJlX2RlcHMpJyBpbiBcCisJICAgICokJGRlcCopIFwKKwkgICAgICAoIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaCApIFwKKwkgICAgICAgICYmIHsgaWYgdGVzdCAtZiAkQDsgdGhlbiBleGl0IDA7IGVsc2UgYnJlYWs7IGZpOyB9OyBcCisJICAgICAgZXhpdCAxOzsgXAorCSAgZXNhYzsgXAorCWRvbmU7IFwKKwllY2hvICcgY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWdudSB1dGlscy9zaG93bW91bnQvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvc2hvd21vdW50L01ha2VmaWxlCisuUFJFQ0lPVVM6IE1ha2VmaWxlCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJQGNhc2UgJyQ/JyBpbiBcCisJICAqY29uZmlnLnN0YXR1cyopIFwKKwkgICAgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoOzsgXAorCSAgKikgXAorCSAgICBlY2hvICcgY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAkKHN1YmRpcikvJEAgJChhbV9fZGVwZmlsZXNfbWF5YmUpJzsgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSk7OyBcCisJZXNhYzsKKworJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXM6ICQodG9wX3NyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCisKKyQodG9wX3NyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2NvbmZpZ3VyZV9kZXBzKQorCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbS0tcmVmcmVzaAorJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCAkKGFtX19hY2xvY2FsX200X2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKGFtX19hY2xvY2FsX200X2RlcHMpOgoraW5zdGFsbC1zYmluUFJPR1JBTVM6ICQoc2Jpbl9QUk9HUkFNUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKHNiaW5kaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChzYmluZGlyKSIKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKwlzZWQgJ3MvJChFWEVFWFQpJCQvLycgfCBcCisJd2hpbGUgcmVhZCBwIHAxOyBkbyBpZiB0ZXN0IC1mICQkcCB8fCB0ZXN0IC1mICQkcDE7IFwKKwkgIHRoZW4gZWNobyAiJCRwIjsgZWNobyAiJCRwIjsgZWxzZSA6OyBmaTsgXAorCWRvbmUgfCBcCisJc2VkIC1lICdwO3MsLiovLCw7bjtoJyAtZSAnc3wuKnwufCcgXAorCSAgICAtZSAncDt4O3MsLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKTtzLyQkLyQoRVhFRVhUKS8nIHwgXAorCXNlZCAnTjtOO047cyxcbiwgLGcnIHwgXAorCSQoQVdLKSAnQkVHSU4geyBmaWxlc1siLiJdID0gIiI7IGRpcnNbIi4iXSA9IDEgfSBcCisJICB7IGQ9JCQzOyBpZiAoZGlyc1tkXSAhPSAxKSB7IHByaW50ICJkIiwgZDsgZGlyc1tkXSA9IDEgfSBcCisJICAgIGlmICgkJDIgPT0gJCQ0KSBmaWxlc1tkXSA9IGZpbGVzW2RdICIgIiAkJDE7IFwKKwkgICAgZWxzZSB7IHByaW50ICJmIiwgJCQzICIvIiAkJDQsICQkMTsgfSB9IFwKKwkgIEVORCB7IGZvciAoZCBpbiBmaWxlcykgcHJpbnQgImYiLCBkLCBmaWxlc1tkXSB9JyB8IFwKKwl3aGlsZSByZWFkIHR5cGUgZGlyIGZpbGVzOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9QUk9HUkFNX0VOVikgJChMSUJUT09MKSAkKEFNX0xJQlRPT0xGTEFHUykgJChMSUJUT09MRkxBR1MpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJGZpbGVzICckKERFU1RESVIpJChzYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgIiQoREVTVERJUikkKHNiaW5kaXIpJCRkaXIiIHx8IGV4aXQgJCQ/OyBcCisJICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtc2JpblBST0dSQU1TOgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQoc2Jpbl9QUk9HUkFNUyknOyB0ZXN0IC1uICIkKHNiaW5kaXIpIiB8fCBsaXN0PTsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICBzZWQgLWUgJ2g7cyxeLiovLCw7cy8kKEVYRUVYVCkkJC8vOyQodHJhbnNmb3JtKScgXAorCSAgICAgIC1lICdzLyQkLyQoRVhFRVhUKS8nIGA7IFwKKwl0ZXN0IC1uICIkJGxpc3QiIHx8IGV4aXQgMDsgXAorCWVjaG8gIiAoIGNkICckKERFU1RESVIpJChzYmluZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJY2QgIiQoREVTVERJUikkKHNiaW5kaXIpIiAmJiBybSAtZiAkJGZpbGVzCisKK2NsZWFuLXNiaW5QUk9HUkFNUzoKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiIHJtIC1mIiAkJGxpc3Q7IFwKKwlybSAtZiAkJGxpc3QgfHwgZXhpdCAkJD87IFwKKwl0ZXN0IC1uICIkKEVYRUVYVCkiIHx8IGV4aXQgMDsgXAorCWxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IHNlZCAncy8kKEVYRUVYVCkkJC8vJ2A7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdAorc2hvd21vdW50JChFWEVFWFQpOiAkKHNob3dtb3VudF9PQkpFQ1RTKSAkKHNob3dtb3VudF9ERVBFTkRFTkNJRVMpIAorCUBybSAtZiBzaG93bW91bnQkKEVYRUVYVCkKKwkkKExJTkspICQoc2hvd21vdW50X09CSkVDVFMpICQoc2hvd21vdW50X0xEQUREKSAkKExJQlMpCisKK21vc3RseWNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICouJChPQkpFWFQpCisKK2Rpc3RjbGVhbi1jb21waWxlOgorCS1ybSAtZiAqLnRhYi5jCisKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zaG93bW91bnQtc2hvd21vdW50LlBvQGFtX19xdW90ZUAKKworLmMubzoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nJDwnIG9iamVjdD0nJEAnIGxpYnRvb2w9bm8gQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoQ09NUElMRSkgLWMgJDwKKworLmMub2JqOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChDT01QSUxFKSAtTVQgJEAgLU1EIC1NUCAtTUYgJChERVBESVIpLyQqLlRwbyAtYyAtbyAkQCBgJChDWUdQQVRIX1cpICckPCdgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jIGAkKENZR1BBVEhfVykgJyQ8J2AKKworLmMubG86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKExUQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgJDwKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoYW1fX212KSAkKERFUERJUikvJCouVHBvICQoREVQRElSKS8kKi5QbG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPXllcyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChMVENPTVBJTEUpIC1jIC1vICRAICQ8CisKK3Nob3dtb3VudC1zaG93bW91bnQubzogc2hvd21vdW50LmMKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ0MpICQoREVGUykgJChERUZBVUxUX0lOQ0xVREVTKSAkKElOQ0xVREVTKSAkKHNob3dtb3VudF9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAtTVQgc2hvd21vdW50LXNob3dtb3VudC5vIC1NRCAtTVAgLU1GICQoREVQRElSKS9zaG93bW91bnQtc2hvd21vdW50LlRwbyAtYyAtbyBzaG93bW91bnQtc2hvd21vdW50Lm8gYHRlc3QgLWYgJ3Nob3dtb3VudC5jJyB8fCBlY2hvICckKHNyY2RpcikvJ2BzaG93bW91bnQuYworQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS9zaG93bW91bnQtc2hvd21vdW50LlRwbyAkKERFUERJUikvc2hvd21vdW50LXNob3dtb3VudC5QbworQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACXNvdXJjZT0nc2hvd21vdW50LmMnIG9iamVjdD0nc2hvd21vdW50LXNob3dtb3VudC5vJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzaG93bW91bnRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLWMgLW8gc2hvd21vdW50LXNob3dtb3VudC5vIGB0ZXN0IC1mICdzaG93bW91bnQuYycgfHwgZWNobyAnJChzcmNkaXIpLydgc2hvd21vdW50LmMKKworc2hvd21vdW50LXNob3dtb3VudC5vYmo6IHNob3dtb3VudC5jCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChzaG93bW91bnRfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgLU1UIHNob3dtb3VudC1zaG93bW91bnQub2JqIC1NRCAtTVAgLU1GICQoREVQRElSKS9zaG93bW91bnQtc2hvd21vdW50LlRwbyAtYyAtbyBzaG93bW91bnQtc2hvd21vdW50Lm9iaiBgaWYgdGVzdCAtZiAnc2hvd21vdW50LmMnOyB0aGVuICQoQ1lHUEFUSF9XKSAnc2hvd21vdW50LmMnOyBlbHNlICQoQ1lHUEFUSF9XKSAnJChzcmNkaXIpL3Nob3dtb3VudC5jJzsgZmlgCitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpL3Nob3dtb3VudC1zaG93bW91bnQuVHBvICQoREVQRElSKS9zaG93bW91bnQtc2hvd21vdW50LlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSdzaG93bW91bnQuYycgb2JqZWN0PSdzaG93bW91bnQtc2hvd21vdW50Lm9iaicgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpICQoc2hvd21vdW50X0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpIC1jIC1vIHNob3dtb3VudC1zaG93bW91bnQub2JqIGBpZiB0ZXN0IC1mICdzaG93bW91bnQuYyc7IHRoZW4gJChDWUdQQVRIX1cpICdzaG93bW91bnQuYyc7IGVsc2UgJChDWUdQQVRIX1cpICckKHNyY2Rpcikvc2hvd21vdW50LmMnOyBmaWAKKworbW9zdGx5Y2xlYW4tbGlidG9vbDoKKwktcm0gLWYgKi5sbworCitjbGVhbi1saWJ0b29sOgorCS1ybSAtcmYgLmxpYnMgX2xpYnMKK2luc3RhbGwtbWFuODogJChtYW44X01BTlMpCisJQCQoTk9STUFMX0lOU1RBTEwpCisJdGVzdCAteiAiJChtYW44ZGlyKSIgfHwgJChNS0RJUl9QKSAiJChERVNURElSKSQobWFuOGRpcikiCisJQGxpc3Q9JyQobWFuOF9NQU5TKSc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCXsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHdoaWxlIHJlYWQgcDsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gZD07IGVsc2UgZD0iJChzcmNkaXIpLyI7IGZpOyBcCisJICBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ247cywuKi8sLDtwO2g7cywuKlwuLCw7cyxeW144XVswLTlhLXpdKiQkLDgsO3gnIFwKKwkgICAgICAtZSAncyxcLlswLTlhLXpdKiQkLCw7JCh0cmFuc2Zvcm0pO0c7cyxcbiwuLCcgfCBcCisJc2VkICdOO047cyxcbiwgLGcnIHwgeyBcCisJbGlzdD07IHdoaWxlIHJlYWQgZmlsZSBiYXNlIGluc3Q7IGRvIFwKKwkgIGlmIHRlc3QgIiQkYmFzZSIgPSAiJCRpbnN0IjsgdGhlbiBsaXN0PSIkJGxpc3QgJCRmaWxlIjsgZWxzZSBcCisJICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJyQkZmlsZScgJyQoREVTVERJUikkKG1hbjhkaXIpLyQkaW5zdCciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAiJCRmaWxlIiAiJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0IiB8fCBleGl0ICQkPzsgXAorCSAgZmk7IFwKKwlkb25lOyBcCisJZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lIHwgJChhbV9fYmFzZV9saXN0KSB8IFwKKwl3aGlsZSByZWFkIGZpbGVzOyBkbyBcCisJICB0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICckKERFU1RESVIpJChtYW44ZGlyKSciOyBcCisJICAgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGVzICIkKERFU1RESVIpJChtYW44ZGlyKSIgfHwgZXhpdCAkJD87IH07IFwKKwlkb25lOyB9CisKK3VuaW5zdGFsbC1tYW44OgorCUAkKE5PUk1BTF9VTklOU1RBTEwpCisJQGxpc3Q9JyQobWFuOF9NQU5TKSc7IHRlc3QgLW4gIiQobWFuOGRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWB7IGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAiJCRpIjsgZG9uZTsgXAorCX0gfCBzZWQgLWUgJ3MsLiovLCw7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJ2A7IFwKKwl0ZXN0IC16ICIkJGZpbGVzIiB8fCB7IFwKKwkgIGVjaG8gIiAoIGNkICckKERFU1RESVIpJChtYW44ZGlyKScgJiYgcm0gLWYiICQkZmlsZXMgIikiOyBcCisJICBjZCAiJChERVNURElSKSQobWFuOGRpcikiICYmIHJtIC1mICQkZmlsZXM7IH0KKworSUQ6ICQoSEVBREVSUykgJChTT1VSQ0VTKSAkKExJU1ApICQoVEFHU19GSUxFUykKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlta2lkIC1mSUQgJCR1bmlxdWUKK3RhZ3M6IFRBR1MKKworVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlzZXQgeDsgXAorCWhlcmU9YHB3ZGA7IFwKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJc2hpZnQ7IFwKKwlpZiB0ZXN0IC16ICIkKEVUQUdTX0FSR1MpJCQqJCR1bmlxdWUiOyB0aGVuIDo7IGVsc2UgXAorCSAgdGVzdCAtbiAiJCR1bmlxdWUiIHx8IHVuaXF1ZT0kJGVtcHR5X2ZpeDsgXAorCSAgaWYgdGVzdCAkJCMgLWd0IDA7IHRoZW4gXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgIiQkQCIgJCR1bmlxdWU7IFwKKwkgIGVsc2UgXAorCSAgICAkKEVUQUdTKSAkKEVUQUdTRkxBR1MpICQoQU1fRVRBR1NGTEFHUykgJChFVEFHU19BUkdTKSBcCisJICAgICAgJCR1bmlxdWU7IFwKKwkgIGZpOyBcCisJZmkKK2N0YWdzOiBDVEFHUworQ1RBR1M6ICAkKEhFQURFUlMpICQoU09VUkNFUykgICQoVEFHU19ERVBFTkRFTkNJRVMpIFwKKwkJJChUQUdTX0ZJTEVTKSAkKExJU1ApCisJbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpICAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCXRlc3QgLXogIiQoQ1RBR1NfQVJHUykkJHVuaXF1ZSIgXAorCSAgfHwgJChDVEFHUykgJChDVEFHU0ZMQUdTKSAkKEFNX0NUQUdTRkxBR1MpICQoQ1RBR1NfQVJHUykgXAorCSAgICAgJCR1bmlxdWUKKworR1RBR1M6CisJaGVyZT1gJChhbV9fY2QpICQodG9wX2J1aWxkZGlyKSAmJiBwd2RgIFwKKwkgICYmICQoYW1fX2NkKSAkKHRvcF9zcmNkaXIpIFwKKwkgICYmIGd0YWdzIC1pICQoR1RBR1NfQVJHUykgIiQkaGVyZSIKKworZGlzdGNsZWFuLXRhZ3M6CisJLXJtIC1mIFRBR1MgSUQgR1RBR1MgR1JUQUdTIEdTWU1TIEdQQVRIIHRhZ3MKKworZGlzdGRpcjogJChESVNURklMRVMpCisJQGxpc3Q9JyQoTUFOUyknOyBpZiB0ZXN0IC1uICIkJGxpc3QiOyB0aGVuIFwKKwkgIGxpc3Q9YGZvciBwIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgICAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlbHNlIDo7IGZpOyBkb25lYDsgXAorCSAgaWYgdGVzdCAtbiAiJCRsaXN0IiAmJiBcCisJICAgIGdyZXAgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0ID4vZGV2L251bGw7IHRoZW4gXAorCSAgICBlY2hvICJlcnJvcjogZm91bmQgbWFuIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIFxgbWlzc2luZyBoZWxwMm1hbicgcmVwbGFjZW1lbnQgdGV4dDoiID4mMjsgXAorCSAgICBncmVwIC1sICdhYiBoZWxwMm1hbiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGlzIHBhZ2UnICQkbGlzdCB8IHNlZCAncy9eLyAgICAgICAgIC8nID4mMjsgXAorCSAgICBlY2hvICIgICAgICAgdG8gZml4IHRoZW0sIGluc3RhbGwgaGVscDJtYW4sIHJlbW92ZSBhbmQgcmVnZW5lcmF0ZSB0aGUgbWFuIHBhZ2VzOyIgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0eXBpY2FsbHkgXGBtYWtlIG1haW50YWluZXItY2xlYW4nIHdpbGwgcmVtb3ZlIHRoZW0iID4mMjsgXAorCSAgICBleGl0IDE7IFwKKwkgIGVsc2UgOjsgZmk7IFwKKwllbHNlIDo7IGZpCisJQHNyY2RpcnN0cmlwPWBlY2hvICIkKHNyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCXRvcHNyY2RpcnN0cmlwPWBlY2hvICIkKHRvcF9zcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqXS9cXFxcJi9nJ2A7IFwKKwlsaXN0PSckKERJU1RGSUxFUyknOyBcCisJICBkaXN0X2ZpbGVzPWBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgXAorCSAgc2VkIC1lICJzfF4kJHNyY2RpcnN0cmlwL3x8O3QiIFwKKwkgICAgICAtZSAic3xeJCR0b3BzcmNkaXJzdHJpcC98JCh0b3BfYnVpbGRkaXIpL3w7dCJgOyBcCisJY2FzZSAkJGRpc3RfZmlsZXMgaW4gXAorCSAgKi8qKSAkKE1LRElSX1ApIGBlY2hvICIkJGRpc3RfZmlsZXMiIHwgXAorCQkJICAgc2VkICcvXC8vIWQ7c3xefCQoZGlzdGRpcikvfDtzLC9bXi9dKiQkLCwnIHwgXAorCQkJICAgc29ydCAtdWAgOzsgXAorCWVzYWM7IFwKKwlmb3IgZmlsZSBpbiAkJGRpc3RfZmlsZXM7IGRvIFwKKwkgIGlmIHRlc3QgLWYgJCRmaWxlIHx8IHRlc3QgLWQgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKKwkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCisJICAgIGRpcj1gZWNobyAiLyQkZmlsZSIgfCBzZWQgLWUgJ3MsL1teL10qJCQsLCdgOyBcCisJICAgIGlmIHRlc3QgLWQgIiQoZGlzdGRpcikvJCRmaWxlIjsgdGhlbiBcCisJICAgICAgZmluZCAiJChkaXN0ZGlyKS8kJGZpbGUiIC10eXBlIGQgISAtcGVybSAtNzAwIC1leGVjIGNobW9kIHUrcnd4IHt9IFw7OyBcCisJICAgIGZpOyBcCisJICAgIGlmIHRlc3QgLWQgJChzcmNkaXIpLyQkZmlsZSAmJiB0ZXN0ICQkZCAhPSAkKHNyY2Rpcik7IHRoZW4gXAorCSAgICAgIGNwIC1mcFIgJChzcmNkaXIpLyQkZmlsZSAiJChkaXN0ZGlyKSQkZGlyIiB8fCBleGl0IDE7IFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgY3AgLWZwUiAkJGQvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgZWxzZSBcCisJICAgIHRlc3QgLWYgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgIiQoZGlzdGRpcikvJCRmaWxlIiBcCisJICAgIHx8IGV4aXQgMTsgXAorCSAgZmk7IFwKKwlkb25lCitjaGVjay1hbTogYWxsLWFtCitjaGVjazogY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKQoraW5zdGFsbGRpcnM6CisJZm9yIGRpciBpbiAiJChERVNURElSKSQoc2JpbmRpcikiICIkKERFU1RESVIpJChtYW44ZGlyKSI7IGRvIFwKKwkgIHRlc3QgLXogIiQkZGlyIiB8fCAkKE1LRElSX1ApICIkJGRpciI7IFwKKwlkb25lCitpbnN0YWxsOiBpbnN0YWxsLWFtCitpbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQoraW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KK3VuaW5zdGFsbDogdW5pbnN0YWxsLWFtCisKK2luc3RhbGwtYW06IGFsbC1hbQorCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCisKK2luc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLWFtCitpbnN0YWxsLXN0cmlwOgorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIElOU1RBTExfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBcCisJICBpbnN0YWxsX3NoX1BST0dSQU09IiQoSU5TVEFMTF9TVFJJUF9QUk9HUkFNKSIgSU5TVEFMTF9TVFJJUF9GTEFHPS1zIFwKKwkgIGB0ZXN0IC16ICckKFNUUklQKScgfHwgXAorCSAgICBlY2hvICJJTlNUQUxMX1BST0dSQU1fRU5WPVNUUklQUFJPRz0nJChTVFJJUCknImAgaW5zdGFsbAorbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKKworY2xlYW4tZ2VuZXJpYzoKKworZGlzdGNsZWFuLWdlbmVyaWM6CisJLXRlc3QgLXogIiQoQ09ORklHX0NMRUFOX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fRklMRVMpCisJLXRlc3QgLiA9ICIkKHNyY2RpcikiIHx8IHRlc3QgLXogIiQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKSIgfHwgcm0gLWYgJChDT05GSUdfQ0xFQU5fVlBBVEhfRklMRVMpCisKK21haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKKwlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2UiCisJQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXNiaW5QUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLXNiaW5QUk9HUkFNUworCitpbnN0YWxsLWh0bWw6IGluc3RhbGwtaHRtbC1hbQorCitpbnN0YWxsLWh0bWwtYW06CisKK2luc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCisKK2luc3RhbGwtaW5mby1hbToKKworaW5zdGFsbC1tYW46IGluc3RhbGwtbWFuOAorCitpbnN0YWxsLXBkZjogaW5zdGFsbC1wZGYtYW0KKworaW5zdGFsbC1wZGYtYW06CisKK2luc3RhbGwtcHM6IGluc3RhbGwtcHMtYW0KKworaW5zdGFsbC1wcy1hbToKKworaW5zdGFsbGNoZWNrLWFtOgorCittYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCisJLXJtIC1yZiAuLyQoREVQRElSKQorCS1ybSAtZiBNYWtlZmlsZQorbWFpbnRhaW5lci1jbGVhbi1hbTogZGlzdGNsZWFuLWFtIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYworCittb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KKworbW9zdGx5Y2xlYW4tYW06IG1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCisJbW9zdGx5Y2xlYW4tbGlidG9vbAorCitwZGY6IHBkZi1hbQorCitwZGYtYW06CisKK3BzOiBwcy1hbQorCitwcy1hbToKKwordW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuIHVuaW5zdGFsbC1zYmluUFJPR1JBTVMKKwordW5pbnN0YWxsLW1hbjogdW5pbnN0YWxsLW1hbjgKKworLk1BS0U6IGluc3RhbGwtYW0gaW5zdGFsbC1zdHJpcAorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZHZpIFwKKwlpbnN0YWxsLWR2aS1hbSBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtaHRtbCBcCisJaW5zdGFsbC1odG1sLWFtIGluc3RhbGwtaW5mbyBpbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1tYW4gXAorCWluc3RhbGwtbWFuOCBpbnN0YWxsLXBkZiBpbnN0YWxsLXBkZi1hbSBpbnN0YWxsLXBzIFwKKwlpbnN0YWxsLXBzLWFtIGluc3RhbGwtc2JpblBST0dSQU1TIGluc3RhbGwtc3RyaXAgaW5zdGFsbGNoZWNrIFwKKwlpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGRpcnMgbWFpbnRhaW5lci1jbGVhbiBcCisJbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuIG1vc3RseWNsZWFuLWNvbXBpbGUgXAorCW1vc3RseWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tbGlidG9vbCBwZGYgcGRmLWFtIHBzIHBzLWFtIFwKKwl0YWdzIHVuaW5zdGFsbCB1bmluc3RhbGwtYW0gdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuOCBcCisJdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zaG93bW91bnQvc2hvd21vdW50LmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L3Nob3dtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjcwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L3Nob3dtb3VudC5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogc2hvd21vdW50LmMgLS0gc2hvdyBtb3VudCBpbmZvcm1hdGlvbiBmb3IgYW4gTkZTIHNlcnZlcgorICogQ29weXJpZ2h0IChDKSAxOTkzIFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwYy9wbWFwX3Byb3QuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxtb3VudC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAibmZzcnBjLmgiCisKKyNkZWZpbmUgVElNRU9VVF9VRFAJMworI2RlZmluZSBUT1RBTF9USU1FT1VUCTIwCisKK3N0YXRpYyBjaGFyICoJdmVyc2lvbiA9ICJzaG93bW91bnQgZm9yICIgVkVSU0lPTjsKK3N0YXRpYyBjaGFyICoJcHJvZ3JhbV9uYW1lOworc3RhdGljIGludAloZWFkZXJzID0gMTsKK3N0YXRpYyBpbnQJaGZsYWcgPSAwOworc3RhdGljIGludAlhZmxhZyA9IDA7CitzdGF0aWMgaW50CWRmbGFnID0gMDsKK3N0YXRpYyBpbnQJZWZsYWcgPSAwOworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KK3sKKwl7ICJhbGwiLCAwLCAwLCAnYScgfSwKKwl7ICJkaXJlY3RvcmllcyIsIDAsIDAsICdkJyB9LAorCXsgImV4cG9ydHMiLCAwLCAwLCAnZScgfSwKKwl7ICJuby1oZWFkZXJzIiwgMCwgJmhlYWRlcnMsIDAgfSwKKwl7ICJ2ZXJzaW9uIiwgMCwgMCwgJ3YnIH0sCisJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCXsgTlVMTCwgMCwgMCwgMCB9Cit9OworCisjZGVmaW5lIE1BWEhPU1RMRU4gMjU2CisKK3N0YXRpYyBpbnQgZHVtcF9jbXAoY29uc3Qgdm9pZCAqcHYsIGNvbnN0IHZvaWQgKnF2KQoreworCWNvbnN0IGNoYXIgKipwID0gKGNvbnN0IGNoYXIgKiopcHY7CisJY29uc3QgY2hhciAqKnEgPSAoY29uc3QgY2hhciAqKilxdjsKKwlyZXR1cm4gc3RyY21wKCpwLCAqcSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKEZJTEUgKmZwLCBpbnQgbikKK3sKKwlmcHJpbnRmKGZwLCAiVXNhZ2U6ICVzIFstYWRlaHZdXG4iLCBwcm9ncmFtX25hbWUpOworCWZwcmludGYoZnAsICIgICAgICAgWy0tYWxsXSBbLS1kaXJlY3Rvcmllc10gWy0tZXhwb3J0c11cbiIpOworCWZwcmludGYoZnAsICIgICAgICAgWy0tbm8taGVhZGVyc10gWy0taGVscF0gWy0tdmVyc2lvbl0gW2hvc3RdXG4iKTsKKwlleGl0KG4pOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbW91bnRfcGdtX3RibFtdID0geworCSJzaG93bW91bnQiLAorCSJtb3VudCIsCisJIm1vdW50ZCIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBycGN2ZXJzX3QgbW91bnRfdmVyc190YmxbXSA9IHsKKwlNT1VOVFZFUlNfTkZTVjMsCisJTU9VTlRWRVJTX1BPU0lYLAorCU1PVU5UVkVSUywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1heF92ZXJzX3RibHN6ID0gCisJKHNpemVvZihtb3VudF92ZXJzX3RibCkvc2l6ZW9mKG1vdW50X3ZlcnNfdGJsWzBdKSk7CisKKy8qCisgKiBHZW5lcmF0ZSBhbiBSUEMgY2xpZW50IGhhbmRsZSBjb25uZWN0ZWQgdG8gdGhlIG1vdW50ZCBzZXJ2aWNlCisgKiBhdCBAaG9zdG5hbWUsIG9yIGRpZSB0cnlpbmcuCisgKgorICogU3VwcG9ydHMgYm90aCBBRl9JTkVUIGFuZCBBRl9JTkVUNiBzZXJ2ZXIgYWRkcmVzc2VzLgorICovCitzdGF0aWMgQ0xJRU5UICpuZnNfZ2V0X21vdW50X2NsaWVudChjb25zdCBjaGFyICpob3N0bmFtZSwgcnBjdmVyc190IHZlcnMpCit7CisJcnBjcHJvZ190IHByb2dyYW0gPSBuZnNfZ2V0cnBjYnluYW1lKE1PVU5UUFJPRywgbW91bnRfcGdtX3RibCk7CisJQ0xJRU5UICpjbGllbnQ7CisKKwljbGllbnQgPSBjbG50X2NyZWF0ZShob3N0bmFtZSwgcHJvZ3JhbSwgdmVycywgInRjcCIpOworCWlmIChjbGllbnQpCisJCXJldHVybiBjbGllbnQ7CisJY2xpZW50ID0gY2xudF9jcmVhdGUoaG9zdG5hbWUsIHByb2dyYW0sIHZlcnMsICJ1ZHAiKTsKKwlpZiAoY2xpZW50KQorCQlyZXR1cm4gY2xpZW50OworCisJY2xudF9wY3JlYXRlZXJyb3IoImNsbnRfY3JlYXRlIik7CisJZXhpdCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgaG9zdG5hbWVfYnVmW01BWEhPU1RMRU5dOworCWNoYXIgKmhvc3RuYW1lOworCWVudW0gY2xudF9zdGF0IGNsbnRfc3RhdDsKKwlzdHJ1Y3QgdGltZXZhbCB0b3RhbF90aW1lb3V0OworCWludCBjOworCUNMSUVOVCAqbWNsaWVudDsKKwlncm91cHMgZ3JvdXBsaXN0OworCWV4cG9ydHMgZXhwb3J0bGlzdCwgZXhsOworCW1vdW50bGlzdCBkdW1wbGlzdDsKKwltb3VudGxpc3QgbGlzdDsKKwlpbnQgaTsKKwlpbnQgbjsKKwlpbnQgbWF4bGVuOworCWludCB1bnNpZ25lZCB2ZXJzPTA7CisJY2hhciAqKmR1bXB2OworCisJcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiYWRlaHYiLCBsb25nb3B0cywgTlVMTCkpICE9IEVPRikgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnYSc6CisJCQlhZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlkZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQllZmxhZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQl1c2FnZShzdGRvdXQsIDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJcHJpbnRmKCIlc1xuIiwgdmVyc2lvbik7CisJCQlleGl0KDApOworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQl1c2FnZShzdGRlcnIsIDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlzd2l0Y2ggKGFmbGFnICsgZGZsYWcgKyBlZmxhZykgeworCWNhc2UgMDoKKwkJaGZsYWcgPSAxOworCQlicmVhazsKKwljYXNlIDE6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIG9mIC1hLCAtZCBvciAtZSBpcyBhbGxvd2VkXG4iLAorCQkJcHJvZ3JhbV9uYW1lKTsKKwkJZXhpdCgxKTsKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAwOgorCQlpZiAoZ2V0aG9zdG5hbWUoaG9zdG5hbWVfYnVmLCBNQVhIT1NUTEVOKSA8IDApIHsKKwkJCXBlcnJvcigiZ2V0dGluZyBob3N0bmFtZSIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlob3N0bmFtZSA9IGhvc3RuYW1lX2J1ZjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlob3N0bmFtZSA9IGFyZ3ZbMF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGhvc3RuYW1lIGlzIGFsbG93ZWRcbiIsCisJCQlwcm9ncmFtX25hbWUpOworCQlleGl0KDEpOworCQlicmVhazsKKwl9CisKKwltY2xpZW50ID0gbmZzX2dldF9tb3VudF9jbGllbnQoaG9zdG5hbWUsIG1vdW50X3ZlcnNfdGJsW3ZlcnNdKTsKKwltY2xpZW50LT5jbF9hdXRoID0gYXV0aHVuaXhfY3JlYXRlX2RlZmF1bHQoKTsKKwl0b3RhbF90aW1lb3V0LnR2X3NlYyA9IFRPVEFMX1RJTUVPVVQ7CisJdG90YWxfdGltZW91dC50dl91c2VjID0gMDsKKworYWdhaW46CisJaWYgKGVmbGFnKSB7CisJCW1lbXNldCgmZXhwb3J0bGlzdCwgJ1wwJywgc2l6ZW9mKGV4cG9ydGxpc3QpKTsKKworCQljbG50X3N0YXQgPSBjbG50X2NhbGwobWNsaWVudCwgTU9VTlRQUk9DX0VYUE9SVCwKKwkJCSh4ZHJwcm9jX3QpIHhkcl92b2lkLCBOVUxMLAorCQkJKHhkcnByb2NfdCkgeGRyX2V4cG9ydHMsIChjYWRkcl90KSAmZXhwb3J0bGlzdCwKKwkJCXRvdGFsX3RpbWVvdXQpOworCQlpZiAoY2xudF9zdGF0ID09IFJQQ19QUk9HVkVSU01JU01BVENIKSB7CisJCQlpZiAoKyt2ZXJzIDwgIG1heF92ZXJzX3RibHN6KSB7CisJCQkJKHZvaWQpQ0xOVF9DT05UUk9MKG1jbGllbnQsIENMU0VUX1ZFUlMsIAorCQkJCQkodm9pZCAqKSZtb3VudF92ZXJzX3RibFt2ZXJzXSk7CisJCQkJZ290byBhZ2FpbjsKKwkJCQl9CisJCX0KKwkJaWYgKGNsbnRfc3RhdCAhPSBSUENfU1VDQ0VTUykgeworCQkJY2xudF9wZXJyb3IobWNsaWVudCwgInJwYyBtb3VudCBleHBvcnQiKTsKKwkJCWNsbnRfZGVzdHJveShtY2xpZW50KTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKGhlYWRlcnMpCisJCQlwcmludGYoIkV4cG9ydCBsaXN0IGZvciAlczpcbiIsIGhvc3RuYW1lKTsKKwkJbWF4bGVuID0gMDsKKwkJZm9yIChleGwgPSBleHBvcnRsaXN0OyBleGw7IGV4bCA9IGV4bC0+ZXhfbmV4dCkgeworCQkJaWYgKChuID0gc3RybGVuKGV4bC0+ZXhfZGlyKSkgPiBtYXhsZW4pCisJCQkJbWF4bGVuID0gbjsKKwkJfQorCQl3aGlsZSAoZXhwb3J0bGlzdCkgeworCQkJcHJpbnRmKCIlLSpzICIsIG1heGxlbiwgZXhwb3J0bGlzdC0+ZXhfZGlyKTsKKwkJCWdyb3VwbGlzdCA9IGV4cG9ydGxpc3QtPmV4X2dyb3VwczsKKwkJCWlmIChncm91cGxpc3QpCisJCQkJd2hpbGUgKGdyb3VwbGlzdCkgeworCQkJCQlwcmludGYoIiVzJXMiLCBncm91cGxpc3QtPmdyX25hbWUsCisJCQkJCQlncm91cGxpc3QtPmdyX25leHQgPyAiLCIgOiAiIik7CisJCQkJCWdyb3VwbGlzdCA9IGdyb3VwbGlzdC0+Z3JfbmV4dDsKKwkJCQl9CisJCQllbHNlCisJCQkJcHJpbnRmKCIoZXZlcnlvbmUpIik7CisJCQlwcmludGYoIlxuIik7CisJCQlleHBvcnRsaXN0ID0gZXhwb3J0bGlzdC0+ZXhfbmV4dDsKKwkJfQorCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CisJCWV4aXQoMCk7CisJfQorCisJbWVtc2V0KCZkdW1wbGlzdCwgJ1wwJywgc2l6ZW9mKGR1bXBsaXN0KSk7CisJY2xudF9zdGF0ID0gY2xudF9jYWxsKG1jbGllbnQsIE1PVU5UUFJPQ19EVU1QLAorCQkoeGRycHJvY190KSB4ZHJfdm9pZCwgTlVMTCwKKwkJKHhkcnByb2NfdCkgeGRyX21vdW50bGlzdCwgKGNhZGRyX3QpICZkdW1wbGlzdCwKKwkJdG90YWxfdGltZW91dCk7CisJaWYgKGNsbnRfc3RhdCA9PSBSUENfUFJPR1ZFUlNNSVNNQVRDSCkgeworCQlpZiAoKyt2ZXJzIDwgIG1heF92ZXJzX3RibHN6KSB7CisJCQkodm9pZClDTE5UX0NPTlRST0wobWNsaWVudCwgQ0xTRVRfVkVSUywgCisJCQkJKHZvaWQgKikmbW91bnRfdmVyc190YmxbdmVyc10pOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKwlpZiAoY2xudF9zdGF0ICE9IFJQQ19TVUNDRVNTKSB7CisJCWNsbnRfcGVycm9yKG1jbGllbnQsICJycGMgbW91bnQgZHVtcCIpOworCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CisJCWV4aXQoMSk7CisJfQorCWNsbnRfZGVzdHJveShtY2xpZW50KTsKKworCW4gPSAwOworCWZvciAobGlzdCA9IGR1bXBsaXN0OyBsaXN0OyBsaXN0ID0gbGlzdC0+bWxfbmV4dCkKKwkJbisrOworCWR1bXB2ID0gKGNoYXIgKiopIGNhbGxvYyhuLCBzaXplb2YgKGNoYXIgKikpOworCWlmIChuICYmICFkdW1wdikgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBvdXQgb2YgbWVtb3J5XG4iLCBwcm9ncmFtX25hbWUpOworCQlleGl0KDEpOworCX0KKwlpID0gMDsKKworCWlmIChoZmxhZykgeworCQlpZiAoaGVhZGVycykKKwkJCXByaW50ZigiSG9zdHMgb24gJXM6XG4iLCBob3N0bmFtZSk7CisJCXdoaWxlIChkdW1wbGlzdCkgeworCQkJZHVtcHZbaSsrXSA9IGR1bXBsaXN0LT5tbF9ob3N0bmFtZTsKKwkJCWR1bXBsaXN0ID0gZHVtcGxpc3QtPm1sX25leHQ7CisJCX0KKwl9CisJZWxzZSBpZiAoYWZsYWcpIHsKKwkJaWYgKGhlYWRlcnMpCisJCQlwcmludGYoIkFsbCBtb3VudCBwb2ludHMgb24gJXM6XG4iLCBob3N0bmFtZSk7CisJCXdoaWxlIChkdW1wbGlzdCkgeworCQkJY2hhciAqdDsKKworCQkJdD1tYWxsb2Moc3RybGVuKGR1bXBsaXN0LT5tbF9ob3N0bmFtZSkrc3RybGVuKGR1bXBsaXN0LT5tbF9kaXJlY3RvcnkpKzIpOworCQkJaWYgKCF0KQorCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IG91dCBvZiBtZW1vcnlcbiIsIHByb2dyYW1fbmFtZSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCXNwcmludGYodCwgIiVzOiVzIiwgZHVtcGxpc3QtPm1sX2hvc3RuYW1lLCBkdW1wbGlzdC0+bWxfZGlyZWN0b3J5KTsKKwkJCWR1bXB2W2krK10gPSB0OworCQkJZHVtcGxpc3QgPSBkdW1wbGlzdC0+bWxfbmV4dDsKKwkJfQorCX0KKwllbHNlIGlmIChkZmxhZykgeworCQlpZiAoaGVhZGVycykKKwkJCXByaW50ZigiRGlyZWN0b3JpZXMgb24gJXM6XG4iLCBob3N0bmFtZSk7CisJCXdoaWxlIChkdW1wbGlzdCkgeworCQkJZHVtcHZbaSsrXSA9IGR1bXBsaXN0LT5tbF9kaXJlY3Rvcnk7CisJCQlkdW1wbGlzdCA9IGR1bXBsaXN0LT5tbF9uZXh0OworCQl9CisJfQorCisJcXNvcnQoZHVtcHYsIG4sIHNpemVvZiAoY2hhciAqKSwgZHVtcF9jbXApOworCQorCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaWYgKGkgPT0gMCB8fCBzdHJjbXAoZHVtcHZbaV0sIGR1bXB2W2kgLSAxXSkgIT0gMCkKKwkJCXByaW50ZigiJXNcbiIsIGR1bXB2W2ldKTsKKwl9CisJZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3Nob3dtb3VudC9zaG93bW91bnQubWFuIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3Nob3dtb3VudC9zaG93bW91bnQubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjUxMGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc2hvd21vdW50L3Nob3dtb3VudC5tYW4KQEAgLTAsMCArMSw2MCBAQAorLlwiIENvcHlyaWdodCAxOTkzIFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CisuXCIgTWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorLlRIIFNIT1dNT1VOVCA4ICI2IE9jdG9iZXIgMTk5MyIKKy5TSCBOQU1FCitzaG93bW91bnQgXC0gc2hvdyBtb3VudCBpbmZvcm1hdGlvbiBmb3IgYW4gTkZTIHNlcnZlcgorLlNIIFNZTk9QU0lTCisuQiBzaG93bW91bnQKKy5CICJbXCBcLWFkZWh2XCBdIgorLkIgIltcIFwtXC1hbGxcIF0iCisuQiAiW1wgXC1cLWRpcmVjdG9yaWVzXCBdIgorLkIgIltcIFwtXC1leHBvcnRzXCBdIgorLkIgIltcIFwtXC1oZWxwXCBdIgorLkIgIltcIFwtXC12ZXJzaW9uXCBdIgorLkIgIltcIGhvc3RcIF0iCisuU0ggREVTQ1JJUFRJT04KKy5CIHNob3dtb3VudAorcXVlcmllcyB0aGUgbW91bnQgZGFlbW9uIG9uIGEgcmVtb3RlIGhvc3QgZm9yIGluZm9ybWF0aW9uIGFib3V0Cit0aGUgc3RhdGUgb2YgdGhlIE5GUyBzZXJ2ZXIgb24gdGhhdCBtYWNoaW5lLiAgV2l0aCBubyBvcHRpb25zCisuQiBzaG93bW91bnQKK2xpc3RzIHRoZSBzZXQgb2YgY2xpZW50cyB3aG8gYXJlIG1vdW50aW5nIGZyb20gdGhhdCBob3N0LgorVGhlIG91dHB1dCBmcm9tCisuQiBzaG93bW91bnQKK2lzIGRlc2lnbmVkIHRvCithcHBlYXIgYXMgdGhvdWdoIGl0IHdlcmUgcHJvY2Vzc2VkIHRocm91Z2ggYGBzb3J0IFwtdScnLgorLlNIIE9QVElPTlMKKy5UUAorLkJSIFwtYSAiIG9yICIgXC1cLWFsbAorTGlzdCBib3RoIHRoZSBjbGllbnQgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBhbmQgbW91bnRlZCBkaXJlY3RvcnkgaW4KK2hvc3Q6ZGlyIGZvcm1hdC4gVGhpcyBpbmZvIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCByZWxpYWJsZS4gU2VlIHRoZSBub3Rlcworb24gcm10YWIgaW4gCisuQlIgcnBjLm1vdW50ZCAoOCkuCisuVFAKKy5CUiBcLWQgIiBvciAiIFwtXC1kaXJlY3RvcmllcworTGlzdCBvbmx5IHRoZSBkaXJlY3RvcmllcyBtb3VudGVkIGJ5IHNvbWUgY2xpZW50LgorLlRQCisuQlIgXC1lICIgb3IgIiBcLVwtZXhwb3J0cworU2hvdyB0aGUgTkZTIHNlcnZlcidzIGV4cG9ydCBsaXN0LgorLlRQCisuQlIgXC1oICIgb3IgIiBcLVwtaGVscAorUHJvdmlkZSBhIHNob3J0IGhlbHAgc3VtbWFyeS4KKy5UUAorLkJSIFwtdiAiIG9yICIgXC1cLXZlcnNpb24KK1JlcG9ydCB0aGUgY3VycmVudCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcHJvZ3JhbS4KKy5UUAorLkIgXC1cLW5vXC1oZWFkZXJzCitTdXBwcmVzcyB0aGUgZGVzY3JpcHRpdmUgaGVhZGluZ3MgZnJvbSB0aGUgb3V0cHV0LgorLlNIICJTRUUgQUxTTyIKKy5CUiBycGMubW91bnRkICg4KSwKKy5CUiBycGMubmZzZCAoOCkKKy5TSCBCVUdTCitUaGUgY29tcGxldGVuZXNzIGFuZCBhY2N1cmFjeSBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdAorLkIgc2hvd21vdW50CitkaXNwbGF5cyB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSBORlMgc2VydmVyJ3MgaW1wbGVtZW50YXRpb24uCisuUAorQmVjYXVzZQorLkIgc2hvd21vdW50Citzb3J0cyBhbmQgdW5pcXMgdGhlIG91dHB1dCwgaXQgaXMgaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgZnJvbQordGhlIG91dHB1dCB3aGV0aGVyIGEgY2xpZW50IGlzIG1vdW50aW5nIHRoZSBzYW1lIGRpcmVjdG9yeSBtb3JlIHRoYW4gb25jZS4KKy5TSCBBVVRIT1IKK1JpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvQ09QWUlORyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNTQ5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvQ09QWUlORwpAQCAtMCwwICsxLDM0MCBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgICAgICAgICAgICAgICAgICAgIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvQ09QWVJJR0hUIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL0NPUFlSSUdIVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ZmNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL0NPUFlSSUdIVApAQCAtMCwwICsxLDI1IEBACitycGMuc3RhdGQgLS0gTmV0d29yayBTdGF0dXMgTW9uaXRvciAoTlNNKSBwcm90b2NvbCBkYWVtb24gZm9yIExpbnV4LgorQ29weXJpZ2h0IChDKSAxOTk1LTE5OTksIDIwMDIsIDIwMDUgSmVmZnJleSBBLiBVcGhvZmYKKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzc2FjaHVzZXR0cyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworSmVmZnJleSBBLiBVcGhvZmYKK09yaW9uIE11bHRpc3lzdGVtcywgSW5jLgorMzA5MCBPYWttZWFkIFZpbGxhZ2UgRHJpdmUKK1NhbnRhIENsYXJhLCBDQSA5NTA1MQorVVNBCisKK1Bob25lOiAgICAgKzEtNDA4LTg0NC04NDgxCitJbnRlcm5ldDogIGp1cGhvZmZAdXNlcnMuc291cmNlZm9yZ2UubmV0CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvTWFrZWZpbGUuYW0gYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5Nzk3YwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDEwMSBAQAorIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBwcm9kdWNlIE1ha2VmaWxlLmluCisKK21hbjhfTUFOUyA9IHN0YXRkLm1hbiBzbS1ub3RpZnkubWFuCisKK1JQQ1BSRUZJWAk9IHJwYy4KK0tQUkVGSVgJCT0gQGtwcmVmaXhACitzYmluX1BST0dSQU1TCT0gc3RhdGQgc20tbm90aWZ5CitkaXN0X3NiaW5fU0NSSVBUUwk9IHN0YXJ0LXN0YXRkCitzdGF0ZF9TT1VSQ0VTID0gY2FsbGJhY2suYyBub3RsaXN0LmMgbWlzYy5jIG1vbml0b3IuYyBob3N0bmFtZS5jIFwKKwkgICAgICAgIHNpbXUuYyBzdGF0LmMgc3RhdGQuYyBzdmNfcnVuLmMgcm10Y2FsbC5jIFwKKwkgICAgICAgIG5vdGxpc3QuaCBzdGF0ZC5oIHN5c3RlbS5oIHZlcnNpb24uaAorc21fbm90aWZ5X1NPVVJDRVMgPSBzbS1ub3RpZnkuYworCitCVUlMVF9TT1VSQ0VTID0gJChHRU5GSUxFUykKK3N0YXRkX0xEQUREID0gLi4vLi4vc3VwcG9ydC9uc20vbGlibnNtLmEgXAorCSAgICAgIC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKwkgICAgICAuLi8uLi9zdXBwb3J0L21pc2MvbGlibWlzYy5hIFwKKwkgICAgICAkKExJQldSQVApICQoTElCTlNMKSAkKExJQkNBUCkKK3NtX25vdGlmeV9MREFERCA9IC4uLy4uL3N1cHBvcnQvbnNtL2xpYm5zbS5hIFwKKwkJICAuLi8uLi9zdXBwb3J0L25mcy9saWJuZnMuYSBcCisJCSAgJChMSUJOU0wpICQoTElCQ0FQKQorCitFWFRSQV9ESVNUID0gc2ltX3NtX2ludGVyLnggJChtYW44X01BTlMpIENPUFlSSUdIVCBzaW11bGF0ZS5jCisKK2lmIENPTkZJR19SUENHRU4KK1JQQ0dFTgk9ICQodG9wX2J1aWxkZGlyKS90b29scy9ycGNnZW4vcnBjZ2VuCiskKFJQQ0dFTik6CisJbWFrZSAtQyAuLi8uLi90b29scy9ycGNnZW4gYWxsCitlbHNlCitSUENHRU4gPSBAUlBDR0VOX1BBVEhACitlbmRpZgorCiskKEdFTkZJTEVTX0NMTlQpOiAlX2NsbnQuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWwgLW8gJEAgJDwKKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKwlybSAtZiAkQAorCW12IC1mICRALk4gJEAKKworJChHRU5GSUxFU19TVkMpOiAlX3N2Yy5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtbSAtbyAkQCAkPAorCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorCXJtIC1mICRACisJbXYgLWYgJEAuTiAkQAorCiskKEdFTkZJTEVTX1hEUik6ICVfeGRyLmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1jIC1vICRAICQ8CisJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisJcm0gLWYgJEAKKwltdiAtZiAkQC5OICRACisKKyQoR0VORklMRVNfSCk6ICUuaDogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWggLW8gJEAgJDwKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorCitDTEVBTkZJTEVTID0gJChHRU5GSUxFUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2YgaGF2aW5nCisjIGRhZW1vbnMgcmVuYW1lZCBkdXJpbmcgdGhlIGluc3RhbGwgdG8gaW5jbHVkZSBSUENQUkVGSVgKKyMgYW5kIHRoZSBLUFJFRklYCisjIFRoaXMgY291bGQgYWxsIGJlIGRvbmUgbXVjaCBlYXNpZXIgd2l0aCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCisjICggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMvXi8kKFJQQ1BSRUZJWCkkKEtQUkVGSVgpLyApCisjIGJ1dCB0aGF0IGFsc28gcmVuYW1lcyB0aGUgbWFuIHBhZ2VzLCB3aGljaCB0aGUgY3VycmVudAorIyBwcmFjdGljZSBkb2VzIG5vdCBkby4KK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJPR1JBTVMpOyBkbyBcCisJICAgIFsgJCRwID0gc20tbm90aWZ5IF0gfHwgbXYgLWYgJCRwJChFWEVFWFQpICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCit1bmluc3RhbGwtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgZm9yIHAgaW4gJChzYmluX1BST0dSQU1TKTsgZG8gXAorCSAgICBbICQkcCA9IHNtLW5vdGlmeSBdIHx8IHJtIC1mICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCisKKworIyBYWFggVGhpcyBtYWtlcyBzb21lIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgYXV0b21ha2UgZG9lcy4KKyMgWFhYIEJ1dCB0aGVyZSBpcyBubyBpbnN0YWxsLW1hbi1ob29rIG9yIGluc3RhbGwtbWFuLWxvY2FsLgoraW5zdGFsbC1tYW46IGluc3RhbGwtbWFuOCBpbnN0YWxsLW1hbi1saW5rcwordW5pbnN0YWxsLW1hbjogdW5pbnN0YWxsLW1hbjggdW5pbnN0YWxsLW1hbi1saW5rcworCitpbnN0YWxsLW1hbi1saW5rczoKKwkoY2QgJChERVNURElSKSQobWFuOGRpcikgJiYgXAorCSAgZm9yIG0gaW4gJChtYW44X01BTlMpICQoZGlzdF9tYW44X01BTlMpICQobm9kaXN0X21hbjhfTUFOUyk7IGRvIFwKKwkgICAgaW5zdD1gZWNobyAkJG0gfCBzZWQgLWUgJ3MvbWFuJCQvOC8nYDsgXAorCSAgICBybSAtZiAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICAgICQoTE5fUykgJCRpbnN0ICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKK3VuaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgZG9uZSkKKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL01ha2VmaWxlLmluIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWEwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3OTggQEAKKyMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGJ5IGF1dG9tYWtlIDEuMTEuMSBmcm9tIE1ha2VmaWxlLmFtLgorIyBAY29uZmlndXJlX2lucHV0QAorCisjIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiwKKyMgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorIyBJbmMuCisjIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAorIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0CisjIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKKyMgUEFSVElDVUxBUiBQVVJQT1NFLgorCitAU0VUX01BS0VACisKKworVlBBVEggPSBAc3JjZGlyQAorcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACitwa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKK3BrZ2xpYmV4ZWNkaXIgPSAkKGxpYmV4ZWNkaXIpL0BQQUNLQUdFQAorYW1fX2NkID0gQ0RQQVRIPSIkJHtaU0hfVkVSU0lPTisufSQoUEFUSF9TRVBBUkFUT1IpIiAmJiBjZAoraW5zdGFsbF9zaF9EQVRBID0gJChpbnN0YWxsX3NoKSAtYyAtbSA2NDQKK2luc3RhbGxfc2hfUFJPR1JBTSA9ICQoaW5zdGFsbF9zaCkgLWMKK2luc3RhbGxfc2hfU0NSSVBUID0gJChpbnN0YWxsX3NoKSAtYworSU5TVEFMTF9IRUFERVIgPSAkKElOU1RBTExfREFUQSkKK3RyYW5zZm9ybSA9ICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKK05PUk1BTF9JTlNUQUxMID0gOgorUFJFX0lOU1RBTEwgPSA6CitQT1NUX0lOU1RBTEwgPSA6CitOT1JNQUxfVU5JTlNUQUxMID0gOgorUFJFX1VOSU5TVEFMTCA9IDoKK1BPU1RfVU5JTlNUQUxMID0gOgorYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKK2hvc3RfdHJpcGxldCA9IEBob3N0QAorc2Jpbl9QUk9HUkFNUyA9IHN0YXRkJChFWEVFWFQpIHNtLW5vdGlmeSQoRVhFRVhUKQorc3ViZGlyID0gdXRpbHMvc3RhdGQKK0RJU1RfQ09NTU9OID0gJChkaXN0X3NiaW5fU0NSSVBUUykgJChzcmNkaXIpL01ha2VmaWxlLmFtIFwKKwkkKHNyY2RpcikvTWFrZWZpbGUuaW4gQ09QWUlORyBUT0RPCitBQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00CithbV9fYWNsb2NhbF9tNF9kZXBzID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2JzZHNpZ25hbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9pcHY2Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwva2VyYmVyb3M1Lm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGliYmxraWQubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJjYXAubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9saWJldmVudC5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL2xpYm5mc2lkbWFwLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlicnBjc2VjZ3NzLm00IFwKKwkkKHRvcF9zcmNkaXIpL2FjbG9jYWwvbGlidGlycGMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9uZnMtdXRpbHMubTQgXAorCSQodG9wX3NyY2RpcikvYWNsb2NhbC9ycGNzZWNfdmVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9hY2xvY2FsL3RjcC13cmFwcGVycy5tNCBcCisJJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuYWMKK2FtX19jb25maWd1cmVfZGVwcyA9ICQoYW1fX2FjbG9jYWxfbTRfZGVwcykgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKSBcCisJJChBQ0xPQ0FMX000KQorbWtpbnN0YWxsZGlycyA9ICQoaW5zdGFsbF9zaCkgLWQKK0NPTkZJR19IRUFERVIgPSAkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlL2NvbmZpZy5oCitDT05GSUdfQ0xFQU5fRklMRVMgPQorQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTID0KK2FtX19pbnN0YWxsZGlycyA9ICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKHNiaW5kaXIpIiBcCisJIiQoREVTVERJUikkKG1hbjhkaXIpIgorUFJPR1JBTVMgPSAkKHNiaW5fUFJPR1JBTVMpCithbV9zbV9ub3RpZnlfT0JKRUNUUyA9IHNtLW5vdGlmeS4kKE9CSkVYVCkKK3NtX25vdGlmeV9PQkpFQ1RTID0gJChhbV9zbV9ub3RpZnlfT0JKRUNUUykKK2FtX19ERVBFTkRFTkNJRVNfMSA9CitzbV9ub3RpZnlfREVQRU5ERU5DSUVTID0gLi4vLi4vc3VwcG9ydC9uc20vbGlibnNtLmEgXAorCS4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpCithbV9zdGF0ZF9PQkpFQ1RTID0gY2FsbGJhY2suJChPQkpFWFQpIG5vdGxpc3QuJChPQkpFWFQpIG1pc2MuJChPQkpFWFQpIFwKKwltb25pdG9yLiQoT0JKRVhUKSBob3N0bmFtZS4kKE9CSkVYVCkgc2ltdS4kKE9CSkVYVCkgXAorCXN0YXQuJChPQkpFWFQpIHN0YXRkLiQoT0JKRVhUKSBzdmNfcnVuLiQoT0JKRVhUKSBcCisJcm10Y2FsbC4kKE9CSkVYVCkKK3N0YXRkX09CSkVDVFMgPSAkKGFtX3N0YXRkX09CSkVDVFMpCitzdGF0ZF9ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L25zbS9saWJuc20uYSBcCisJLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgLi4vLi4vc3VwcG9ydC9taXNjL2xpYm1pc2MuYSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpICQoYW1fX0RFUEVOREVOQ0lFU18xKSBcCisJJChhbV9fREVQRU5ERU5DSUVTXzEpCithbV9fdnBhdGhfYWRqX3NldHVwID0gc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3N8LnwufGcnYDsKK2FtX192cGF0aF9hZGogPSBjYXNlICQkcCBpbiBcCisgICAgJChzcmNkaXIpLyopIGY9YGVjaG8gIiQkcCIgfCBzZWQgInN8XiQkc3JjZGlyc3RyaXAvfHwiYDs7IFwKKyAgICAqKSBmPSQkcDs7IFwKKyAgZXNhYzsKK2FtX19zdHJpcF9kaXIgPSBmPWBlY2hvICQkcCB8IHNlZCAtZSAnc3xeLiovfHwnYDsKK2FtX19pbnN0YWxsX21heCA9IDQwCithbV9fbm9iYXNlX3N0cmlwX3NldHVwID0gXAorICBzcmNkaXJzdHJpcD1gZWNobyAiJChzcmNkaXIpIiB8IHNlZCAncy9bXS5bXiQkXFwqfF0vXFxcXCYvZydgCithbV9fbm9iYXNlX3N0cmlwID0gXAorICBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBzZWQgLWUgInN8JCRzcmNkaXJzdHJpcC98fCIKK2FtX19ub2Jhc2VfbGlzdCA9ICQoYW1fX25vYmFzZV9zdHJpcF9zZXR1cCk7IFwKKyAgZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAgJCRwIjsgZG9uZSB8IFwKKyAgc2VkICJzfCAkJHNyY2RpcnN0cmlwL3wgfDsiJyAvIC4qXC8vIXMvIC4qLyAuLzsgcyxcKCAuKlwpL1teL10qJCQsXDEsJyB8IFwKKyAgJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIiB9IHsgZmlsZXNbJCQyXSA9IGZpbGVzWyQkMl0gIiAiICQkMTsgXAorICAgIGlmICgrK25bJCQyXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIFwKKyAgICAgIHsgcHJpbnQgJCQyLCBmaWxlc1skJDJdOyBuWyQkMl0gPSAwOyBmaWxlc1skJDJdID0gIiIgfSB9IFwKKyAgICBFTkQgeyBmb3IgKGRpciBpbiBmaWxlcykgcHJpbnQgZGlyLCBmaWxlc1tkaXJdIH0nCithbV9fYmFzZV9saXN0ID0gXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnIHwgXAorICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCitTQ1JJUFRTID0gJChkaXN0X3NiaW5fU0NSSVBUUykKK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3VwcG9ydC9pbmNsdWRlCitkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCithbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworYW1fX212ID0gbXYgLWYKK0NPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoREVGQVVMVF9JTkNMVURFUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgXAorCSQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKK0xUQ09NUElMRSA9ICQoTElCVE9PTCkgLS10YWc9Q0MgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSBcCisJLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKERFRkFVTFRfSU5DTFVERVMpICQoSU5DTFVERVMpIFwKKwkkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCitDQ0xEID0gJChDQykKK0xJTksgPSAkKExJQlRPT0wpIC0tdGFnPUNDICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgXAorCS0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKEFNX0xERkxBR1MpIFwKKwkkKExERkxBR1MpIC1vICRACitTT1VSQ0VTID0gJChzbV9ub3RpZnlfU09VUkNFUykgJChzdGF0ZF9TT1VSQ0VTKQorRElTVF9TT1VSQ0VTID0gJChzbV9ub3RpZnlfU09VUkNFUykgJChzdGF0ZF9TT1VSQ0VTKQorbWFuOGRpciA9ICQobWFuZGlyKS9tYW44CitOUk9GRiA9IG5yb2ZmCitNQU5TID0gJChtYW44X01BTlMpCitFVEFHUyA9IGV0YWdzCitDVEFHUyA9IGN0YWdzCitESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKERJU1RfU09VUkNFUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQorQUNMT0NBTCA9IEBBQ0xPQ0FMQAorQUNMT0NBTF9BTUZMQUdTID0gQEFDTE9DQUxfQU1GTEFHU0AKK0FMTE9DQSA9IEBBTExPQ0FACitBTVRBUiA9IEBBTVRBUkAKK0FNX0NGTEFHUyA9IEBBTV9DRkxBR1NACitBTV9DUFBGTEFHUyA9IEBBTV9DUFBGTEFHU0AKK0FSID0gQEFSQAorQVVUT0NPTkYgPSBAQVVUT0NPTkZACitBVVRPSEVBREVSID0gQEFVVE9IRUFERVJACitBVVRPTUFLRSA9IEBBVVRPTUFLRUAKK0FXSyA9IEBBV0tACitDQyA9IEBDQ0AKK0NDREVQTU9ERSA9IEBDQ0RFUE1PREVACitDQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAorQ0ZMQUdTID0gQENGTEFHU0AKK0NGTEFHU19GT1JfQlVJTEQgPSBAQ0ZMQUdTX0ZPUl9CVUlMREAKK0NQUCA9IEBDUFBACitDUFBGTEFHUyA9IEBDUFBGTEFHU0AKK0NQUEZMQUdTX0ZPUl9CVUlMRCA9IEBDUFBGTEFHU19GT1JfQlVJTERACitDWFggPSBAQ1hYQAorQ1hYQ1BQID0gQENYWENQUEAKK0NYWERFUE1PREUgPSBAQ1hYREVQTU9ERUAKK0NYWEZMQUdTID0gQENYWEZMQUdTQAorQ1hYRkxBR1NfRk9SX0JVSUxEID0gQENYWEZMQUdTX0ZPUl9CVUlMREAKK0NZR1BBVEhfVyA9IEBDWUdQQVRIX1dACitERUZTID0gQERFRlNACitERVBESVIgPSBAREVQRElSQAorRFNZTVVUSUwgPSBARFNZTVVUSUxACitEVU1QQklOID0gQERVTVBCSU5ACitFQ0hPX0MgPSBARUNIT19DQAorRUNIT19OID0gQEVDSE9fTkAKK0VDSE9fVCA9IEBFQ0hPX1RACitFR1JFUCA9IEBFR1JFUEAKK0VYRUVYVCA9IEBFWEVFWFRACitGR1JFUCA9IEBGR1JFUEAKK0dSRVAgPSBAR1JFUEAKK0dTU0QgPSBAR1NTREAKK0dTU0dMVUVfQ0ZMQUdTID0gQEdTU0dMVUVfQ0ZMQUdTQAorR1NTR0xVRV9MSUJTID0gQEdTU0dMVUVfTElCU0AKK0hBVkVfTElCV1JBUCA9IEBIQVZFX0xJQldSQVBACitIQVZFX1RDUF9XUkFQUEVSID0gQEhBVkVfVENQX1dSQVBQRVJACitJRE1BUEQgPSBASURNQVBEQAorSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKK0lOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1ACitJTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKK0lOU1RBTExfU1RSSVBfUFJPR1JBTSA9IEBJTlNUQUxMX1NUUklQX1BST0dSQU1ACitLNVZFUlMgPSBASzVWRVJTQAorS1JCQ0ZMQUdTID0gQEtSQkNGTEFHU0AKK0tSQkRJUiA9IEBLUkJESVJACitLUkJMREZMQUdTID0gQEtSQkxERkxBR1NACitLUkJMSUJTID0gQEtSQkxJQlNACitMRCA9IEBMREAKK0xERkxBR1MgPSBATERGTEFHU0AKK0xERkxBR1NfRk9SX0JVSUxEID0gQExERkxBR1NfRk9SX0JVSUxEQAorTElCQkxLSUQgPSBATElCQkxLSURACitMSUJCU0QgPSBATElCQlNEQAorTElCQ0FQID0gQExJQkNBUEAKK0xJQkNSWVBUID0gQExJQkNSWVBUQAorTElCTlNMID0gQExJQk5TTEAKK0xJQk9CSlMgPSBATElCT0JKU0AKK0xJQlMgPSBATElCU0AKK0xJQlNPQ0tFVCA9IEBMSUJTT0NLRVRACitMSUJUT09MID0gQExJQlRPT0xACitMSUJXUkFQID0gQExJQldSQVBACitMSVBPID0gQExJUE9ACitMTl9TID0gQExOX1NACitMVExJQk9CSlMgPSBATFRMSUJPQkpTQAorTUFJTlQgPSBATUFJTlRACitNQUtFSU5GTyA9IEBNQUtFSU5GT0AKK01LRElSX1AgPSBATUtESVJfUEAKK05NID0gQE5NQAorTk1FRElUID0gQE5NRURJVEAKK09CSkRVTVAgPSBAT0JKRFVNUEAKK09CSkVYVCA9IEBPQkpFWFRACitPVE9PTCA9IEBPVE9PTEAKK09UT09MNjQgPSBAT1RPT0w2NEAKK1BBQ0tBR0UgPSBAUEFDS0FHRUAKK1BBQ0tBR0VfQlVHUkVQT1JUID0gQFBBQ0tBR0VfQlVHUkVQT1JUQAorUEFDS0FHRV9OQU1FID0gQFBBQ0tBR0VfTkFNRUAKK1BBQ0tBR0VfU1RSSU5HID0gQFBBQ0tBR0VfU1RSSU5HQAorUEFDS0FHRV9UQVJOQU1FID0gQFBBQ0tBR0VfVEFSTkFNRUAKK1BBQ0tBR0VfVkVSU0lPTiA9IEBQQUNLQUdFX1ZFUlNJT05ACitQQVRIX1NFUEFSQVRPUiA9IEBQQVRIX1NFUEFSQVRPUkAKK1BLR19DT05GSUcgPSBAUEtHX0NPTkZJR0AKK1JBTkxJQiA9IEBSQU5MSUJACitSRUxFQVNFID0gQFJFTEVBU0VACitSUENHRU5fUEFUSCA9IEBSUENHRU5fUEFUSEAKK1JQQ1NFQ0dTU19DRkxBR1MgPSBAUlBDU0VDR1NTX0NGTEFHU0AKK1JQQ1NFQ0dTU19MSUJTID0gQFJQQ1NFQ0dTU19MSUJTQAorU0VEID0gQFNFREAKK1NFVF9NQUtFID0gQFNFVF9NQUtFQAorU0hFTEwgPSBAU0hFTExACitTVFJJUCA9IEBTVFJJUEAKK1NWQ0dTU0QgPSBAU1ZDR1NTREAKK1ZFUlNJT04gPSBAVkVSU0lPTkAKK2Fic19idWlsZGRpciA9IEBhYnNfYnVpbGRkaXJACithYnNfc3JjZGlyID0gQGFic19zcmNkaXJACithYnNfdG9wX2J1aWxkZGlyID0gQGFic190b3BfYnVpbGRkaXJACithYnNfdG9wX3NyY2RpciA9IEBhYnNfdG9wX3NyY2RpckAKK2FjX2N0X0NDID0gQGFjX2N0X0NDQAorYWNfY3RfQ1hYID0gQGFjX2N0X0NYWEAKK2FjX2N0X0RVTVBCSU4gPSBAYWNfY3RfRFVNUEJJTkAKK2FtX19pbmNsdWRlID0gQGFtX19pbmNsdWRlQAorYW1fX2xlYWRpbmdfZG90ID0gQGFtX19sZWFkaW5nX2RvdEAKK2FtX19xdW90ZSA9IEBhbV9fcXVvdGVACithbV9fdGFyID0gQGFtX190YXJACithbV9fdW50YXIgPSBAYW1fX3VudGFyQAorYmluZGlyID0gQGJpbmRpckAKK2J1aWxkID0gQGJ1aWxkQAorYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACitidWlsZF9jcHUgPSBAYnVpbGRfY3B1QAorYnVpbGRfb3MgPSBAYnVpbGRfb3NACitidWlsZF92ZW5kb3IgPSBAYnVpbGRfdmVuZG9yQAorYnVpbGRkaXIgPSBAYnVpbGRkaXJACitkYXRhZGlyID0gQGRhdGFkaXJACitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK2RvY2RpciA9IEBkb2NkaXJACitkdmlkaXIgPSBAZHZpZGlyQAorZW5hYmxlX2dzcyA9IEBlbmFibGVfZ3NzQAorZW5hYmxlX2lwdjYgPSBAZW5hYmxlX2lwdjZACitlbmFibGVfbW91bnRjb25maWcgPSBAZW5hYmxlX21vdW50Y29uZmlnQAorZW5hYmxlX25mc3YzID0gQGVuYWJsZV9uZnN2M0AKK2VuYWJsZV9uZnN2NCA9IEBlbmFibGVfbmZzdjRACitlbmFibGVfbmZzdjQxID0gQGVuYWJsZV9uZnN2NDFACitleGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKK2hvc3QgPSBAaG9zdEAKK2hvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKK2hvc3RfY3B1ID0gQGhvc3RfY3B1QAoraG9zdF9vcyA9IEBob3N0X29zQAoraG9zdF92ZW5kb3IgPSBAaG9zdF92ZW5kb3JACitodG1sZGlyID0gQGh0bWxkaXJACitpbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACitpbmZvZGlyID0gQGluZm9kaXJACitpbnN0YWxsX3NoID0gQGluc3RhbGxfc2hACitrcHJlZml4ID0gQGtwcmVmaXhACitsaWJkaXIgPSBAbGliZGlyQAorbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAorbG9jYWxlZGlyID0gQGxvY2FsZWRpckAKK2xvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKK2x0X0VDSE8gPSBAbHRfRUNIT0AKK21hbmRpciA9IEBtYW5kaXJACitta2Rpcl9wID0gQG1rZGlyX3BACittb3VudGZpbGUgPSBAbW91bnRmaWxlQAorb2xkaW5jbHVkZWRpciA9IEBvbGRpbmNsdWRlZGlyQAorcGRmZGlyID0gQHBkZmRpckAKK3ByZWZpeCA9IEBwcmVmaXhACitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACitwc2RpciA9IEBwc2RpckAKK3NiaW5kaXIgPSBAc2JpbmRpckAKK3NoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAorc3JjZGlyID0gQHNyY2RpckAKK3N0YXJ0c3RhdGQgPSBAc3RhcnRzdGF0ZEAKK3N0YXRkdXNlciA9IEBzdGF0ZHVzZXJACitzdGF0ZWRpciA9IEBzdGF0ZWRpckAKK3N5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKK3RhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACit0b3BfYnVpbGRfcHJlZml4ID0gQHRvcF9idWlsZF9wcmVmaXhACit0b3BfYnVpbGRkaXIgPSBAdG9wX2J1aWxkZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorbWFuOF9NQU5TID0gc3RhdGQubWFuIHNtLW5vdGlmeS5tYW4KK1JQQ1BSRUZJWCA9IHJwYy4KK0tQUkVGSVggPSBAa3ByZWZpeEAKK2Rpc3Rfc2Jpbl9TQ1JJUFRTID0gc3RhcnQtc3RhdGQKK3N0YXRkX1NPVVJDRVMgPSBjYWxsYmFjay5jIG5vdGxpc3QuYyBtaXNjLmMgbW9uaXRvci5jIGhvc3RuYW1lLmMgXAorCSAgICAgICAgc2ltdS5jIHN0YXQuYyBzdGF0ZC5jIHN2Y19ydW4uYyBybXRjYWxsLmMgXAorCSAgICAgICAgbm90bGlzdC5oIHN0YXRkLmggc3lzdGVtLmggdmVyc2lvbi5oCisKK3NtX25vdGlmeV9TT1VSQ0VTID0gc20tbm90aWZ5LmMKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkZJTEVTKQorc3RhdGRfTERBREQgPSAuLi8uLi9zdXBwb3J0L25zbS9saWJuc20uYSBcCisJICAgICAgLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCSAgICAgIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEgXAorCSAgICAgICQoTElCV1JBUCkgJChMSUJOU0wpICQoTElCQ0FQKQorCitzbV9ub3RpZnlfTERBREQgPSAuLi8uLi9zdXBwb3J0L25zbS9saWJuc20uYSBcCisJCSAgLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgXAorCQkgICQoTElCTlNMKSAkKExJQkNBUCkKKworRVhUUkFfRElTVCA9IHNpbV9zbV9pbnRlci54ICQobWFuOF9NQU5TKSBDT1BZUklHSFQgc2ltdWxhdGUuYworQENPTkZJR19SUENHRU5fRkFMU0VAUlBDR0VOID0gQFJQQ0dFTl9QQVRIQAorQENPTkZJR19SUENHRU5fVFJVRUBSUENHRU4gPSAkKHRvcF9idWlsZGRpcikvdG9vbHMvcnBjZ2VuL3JwY2dlbgorTUFJTlRBSU5FUkNMRUFORklMRVMgPSBNYWtlZmlsZS5pbgorQ0xFQU5GSUxFUyA9ICQoR0VORklMRVMpCithbGw6ICQoQlVJTFRfU09VUkNFUykKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtYW0KKworLlNVRkZJWEVTOgorLlNVRkZJWEVTOiAuYyAubG8gLm8gLm9iagorJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoc3JjZGlyKS9NYWtlZmlsZS5hbSAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJQGZvciBkZXAgaW4gJD87IGRvIFwKKwkgIGNhc2UgJyQoYW1fX2NvbmZpZ3VyZV9kZXBzKScgaW4gXAorCSAgICAqJCRkZXAqKSBcCisJICAgICAgKCBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2ggKSBcCisJICAgICAgICAmJiB7IGlmIHRlc3QgLWYgJEA7IHRoZW4gZXhpdCAwOyBlbHNlIGJyZWFrOyBmaTsgfTsgXAorCSAgICAgIGV4aXQgMTs7IFwKKwkgIGVzYWM7IFwKKwlkb25lOyBcCisJZWNobyAnIGNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvc3RhdGQvTWFrZWZpbGUnOyBcCisJJChhbV9fY2QpICQodG9wX3NyY2RpcikgJiYgXAorCSAgJChBVVRPTUFLRSkgLS1nbnUgdXRpbHMvc3RhdGQvTWFrZWZpbGUKKy5QUkVDSU9VUzogTWFrZWZpbGUKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwlAY2FzZSAnJD8nIGluIFwKKwkgICpjb25maWcuc3RhdHVzKikgXAorCSAgICBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2g7OyBcCisJICAqKSBcCisJICAgIGVjaG8gJyBjZCAkKHRvcF9idWlsZGRpcikgJiYgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzICQoc3ViZGlyKS8kQCAkKGFtX19kZXBmaWxlc19tYXliZSknOyBcCisJICAgIGNkICQodG9wX2J1aWxkZGlyKSAmJiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgJChzdWJkaXIpLyRAICQoYW1fX2RlcGZpbGVzX21heWJlKTs7IFwKKwllc2FjOworCiskKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKworJCh0b3Bfc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgJChhbV9fY29uZmlndXJlX2RlcHMpCisJY2QgJCh0b3BfYnVpbGRkaXIpICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFtLS1yZWZyZXNoCiskKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAICQoYW1fX2FjbG9jYWxfbTRfZGVwcykKKwljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYW0tLXJlZnJlc2gKKyQoYW1fX2FjbG9jYWxfbTRfZGVwcyk6CitpbnN0YWxsLXNiaW5QUk9HUkFNUzogJChzYmluX1BST0dSQU1TKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoc2JpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHNiaW5kaXIpIgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJChzYmluZGlyKSIgfHwgbGlzdD07IFwKKwlmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCAkJHAiOyBkb25lIHwgXAorCXNlZCAncy8kKEVYRUVYVCkkJC8vJyB8IFwKKwl3aGlsZSByZWFkIHAgcDE7IGRvIGlmIHRlc3QgLWYgJCRwIHx8IHRlc3QgLWYgJCRwMTsgXAorCSAgdGhlbiBlY2hvICIkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuO2gnIC1lICdzfC4qfC58JyBcCisJICAgIC1lICdwO3g7cywuKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pO3MvJCQvJChFWEVFWFQpLycgfCBcCisJc2VkICdOO047TjtzLFxuLCAsZycgfCBcCisJJChBV0spICdCRUdJTiB7IGZpbGVzWyIuIl0gPSAiIjsgZGlyc1siLiJdID0gMSB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIGZpbGVzW2RdID0gZmlsZXNbZF0gIiAiICQkMTsgXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCAkJDMgIi8iICQkNCwgJCQxOyB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgaWYgdGVzdCAiJCRkaXIiID0gLjsgdGhlbiBkaXI9OyBlbHNlIGRpcj0vJCRkaXI7IGZpOyBcCisJICAgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX1BST0dSQU1fRU5WKSAkKExJQlRPT0wpICQoQU1fTElCVE9PTEZMQUdTKSAkKExJQlRPT0xGTEFHUykgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkZmlsZXMgJyQoREVTVERJUikkKHNiaW5kaXIpJCRkaXInIjsgXAorCSAgICAkKElOU1RBTExfUFJPR1JBTV9FTlYpICQoTElCVE9PTCkgJChBTV9MSUJUT09MRkxBR1MpICQoTElCVE9PTEZMQUdTKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRmaWxlcyAiJChERVNURElSKSQoc2JpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgfSBcCisJOyBkb25lCisKK3VuaW5zdGFsbC1zYmluUFJPR1JBTVM6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChzYmluX1BST0dSQU1TKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZmlsZXM9YGZvciBwIGluICQkbGlzdDsgZG8gZWNobyAiJCRwIjsgZG9uZSB8IFwKKwkgIHNlZCAtZSAnaDtzLF4uKi8sLDtzLyQoRVhFRVhUKSQkLy87JCh0cmFuc2Zvcm0pJyBcCisJICAgICAgLWUgJ3MvJCQvJChFWEVFWFQpLycgYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKHNiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoc2JpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKKworY2xlYW4tc2JpblBST0dSQU1TOgorCUBsaXN0PSckKHNiaW5fUFJPR1JBTVMpJzsgdGVzdCAtbiAiJCRsaXN0IiB8fCBleGl0IDA7IFwKKwllY2hvICIgcm0gLWYiICQkbGlzdDsgXAorCXJtIC1mICQkbGlzdCB8fCBleGl0ICQkPzsgXAorCXRlc3QgLW4gIiQoRVhFRVhUKSIgfHwgZXhpdCAwOyBcCisJbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBlY2hvICIkJHAiOyBkb25lIHwgc2VkICdzLyQoRVhFRVhUKSQkLy8nYDsgXAorCWVjaG8gIiBybSAtZiIgJCRsaXN0OyBcCisJcm0gLWYgJCRsaXN0CitzbS1ub3RpZnkkKEVYRUVYVCk6ICQoc21fbm90aWZ5X09CSkVDVFMpICQoc21fbm90aWZ5X0RFUEVOREVOQ0lFUykgCisJQHJtIC1mIHNtLW5vdGlmeSQoRVhFRVhUKQorCSQoTElOSykgJChzbV9ub3RpZnlfT0JKRUNUUykgJChzbV9ub3RpZnlfTERBREQpICQoTElCUykKK3N0YXRkJChFWEVFWFQpOiAkKHN0YXRkX09CSkVDVFMpICQoc3RhdGRfREVQRU5ERU5DSUVTKSAKKwlAcm0gLWYgc3RhdGQkKEVYRUVYVCkKKwkkKExJTkspICQoc3RhdGRfT0JKRUNUUykgJChzdGF0ZF9MREFERCkgJChMSUJTKQoraW5zdGFsbC1kaXN0X3NiaW5TQ1JJUFRTOiAkKGRpc3Rfc2Jpbl9TQ1JJUFRTKQorCUAkKE5PUk1BTF9JTlNUQUxMKQorCXRlc3QgLXogIiQoc2JpbmRpcikiIHx8ICQoTUtESVJfUCkgIiQoREVTVERJUikkKHNiaW5kaXIpIgorCUBsaXN0PSckKGRpc3Rfc2Jpbl9TQ1JJUFRTKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGxpc3Q9OyBcCisJZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICBpZiB0ZXN0IC1mICIkJHAiOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgaWYgdGVzdCAtZiAiJCRkJCRwIjsgdGhlbiBlY2hvICIkJGQkJHAiOyBlY2hvICIkJHAiOyBlbHNlIDo7IGZpOyBcCisJZG9uZSB8IFwKKwlzZWQgLWUgJ3A7cywuKi8sLDtuJyBcCisJICAgIC1lICdoO3N8Lip8LnwnIFwKKwkgICAgLWUgJ3A7eDtzLC4qLywsOyQodHJhbnNmb3JtKScgfCBzZWQgJ047TjtOO3MsXG4sICxnJyB8IFwKKwkkKEFXSykgJ0JFR0lOIHsgZmlsZXNbIi4iXSA9ICIiOyBkaXJzWyIuIl0gPSAxOyB9IFwKKwkgIHsgZD0kJDM7IGlmIChkaXJzW2RdICE9IDEpIHsgcHJpbnQgImQiLCBkOyBkaXJzW2RdID0gMSB9IFwKKwkgICAgaWYgKCQkMiA9PSAkJDQpIHsgZmlsZXNbZF0gPSBmaWxlc1tkXSAiICIgJCQxOyBcCisJICAgICAgaWYgKCsrbltkXSA9PSAkKGFtX19pbnN0YWxsX21heCkpIHsgXAorCQlwcmludCAiZiIsIGQsIGZpbGVzW2RdOyBuW2RdID0gMDsgZmlsZXNbZF0gPSAiIiB9IH0gXAorCSAgICBlbHNlIHsgcHJpbnQgImYiLCBkICIvIiAkJDQsICQkMSB9IH0gXAorCSAgRU5EIHsgZm9yIChkIGluIGZpbGVzKSBwcmludCAiZiIsIGQsIGZpbGVzW2RdIH0nIHwgXAorCXdoaWxlIHJlYWQgdHlwZSBkaXIgZmlsZXM7IGRvIFwKKwkgICAgIGlmIHRlc3QgIiQkZGlyIiA9IC47IHRoZW4gZGlyPTsgZWxzZSBkaXI9LyQkZGlyOyBmaTsgXAorCSAgICAgdGVzdCAteiAiJCRmaWxlcyIgfHwgeyBcCisJICAgICAgIGVjaG8gIiAkKElOU1RBTExfU0NSSVBUKSAkJGZpbGVzICckKERFU1RESVIpJChzYmluZGlyKSQkZGlyJyI7IFwKKwkgICAgICAgJChJTlNUQUxMX1NDUklQVCkgJCRmaWxlcyAiJChERVNURElSKSQoc2JpbmRpcikkJGRpciIgfHwgZXhpdCAkJD87IFwKKwkgICAgIH0gXAorCTsgZG9uZQorCit1bmluc3RhbGwtZGlzdF9zYmluU0NSSVBUUzoKKwlAJChOT1JNQUxfVU5JTlNUQUxMKQorCUBsaXN0PSckKGRpc3Rfc2Jpbl9TQ1JJUFRTKSc7IHRlc3QgLW4gIiQoc2JpbmRpcikiIHx8IGV4aXQgMDsgXAorCWZpbGVzPWBmb3IgcCBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkcCI7IGRvbmUgfCBcCisJICAgICAgIHNlZCAtZSAncywuKi8sLDskKHRyYW5zZm9ybSknYDsgXAorCXRlc3QgLW4gIiQkbGlzdCIgfHwgZXhpdCAwOyBcCisJZWNobyAiICggY2QgJyQoREVTVERJUikkKHNiaW5kaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwljZCAiJChERVNURElSKSQoc2JpbmRpcikiICYmIHJtIC1mICQkZmlsZXMKKworbW9zdGx5Y2xlYW4tY29tcGlsZToKKwktcm0gLWYgKi4kKE9CSkVYVCkKKworZGlzdGNsZWFuLWNvbXBpbGU6CisJLXJtIC1mICoudGFiLmMKKworQEFNREVQX1RSVUVAQGFtX19pbmNsdWRlQCBAYW1fX3F1b3RlQC4vJChERVBESVIpL2NhbGxiYWNrLlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9ob3N0bmFtZS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbWlzYy5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbW9uaXRvci5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvbm90bGlzdC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvcm10Y2FsbC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc2ltdS5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc20tbm90aWZ5LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdGF0LlBvQGFtX19xdW90ZUAKK0BBTURFUF9UUlVFQEBhbV9faW5jbHVkZUAgQGFtX19xdW90ZUAuLyQoREVQRElSKS9zdGF0ZC5Qb0BhbV9fcXVvdGVACitAQU1ERVBfVFJVRUBAYW1fX2luY2x1ZGVAIEBhbV9fcXVvdGVALi8kKERFUERJUikvc3ZjX3J1bi5Qb0BhbV9fcXVvdGVACisKKy5jLm86CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUG8KK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlzb3VyY2U9JyQ8JyBvYmplY3Q9JyRAJyBsaWJ0b29sPW5vIEBBTURFUEJBQ0tTTEFTSEAKK0BBTURFUF9UUlVFQEBhbV9fZmFzdGRlcENDX0ZBTFNFQAlERVBESVI9JChERVBESVIpICQoQ0NERVBNT0RFKSAkKGRlcGNvbXApIEBBTURFUEJBQ0tTTEFTSEAKK0BhbV9fZmFzdGRlcENDX0ZBTFNFQAkkKENPTVBJTEUpIC1jICQ8CisKKy5jLm9iajoKK0BhbV9fZmFzdGRlcENDX1RSVUVACSQoQ09NUElMRSkgLU1UICRAIC1NRCAtTVAgLU1GICQoREVQRElSKS8kKi5UcG8gLWMgLW8gJEAgYCQoQ1lHUEFUSF9XKSAnJDwnYAorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChhbV9fbXYpICQoREVQRElSKS8kKi5UcG8gJChERVBESVIpLyQqLlBvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD1ubyBAQU1ERVBCQUNLU0xBU0hACitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJREVQRElSPSQoREVQRElSKSAkKENDREVQTU9ERSkgJChkZXBjb21wKSBAQU1ERVBCQUNLU0xBU0hACitAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJJChDT01QSUxFKSAtYyBgJChDWUdQQVRIX1cpICckPCdgCisKKy5jLmxvOgorQGFtX19mYXN0ZGVwQ0NfVFJVRUAJJChMVENPTVBJTEUpIC1NVCAkQCAtTUQgLU1QIC1NRiAkKERFUERJUikvJCouVHBvIC1jIC1vICRAICQ8CitAYW1fX2Zhc3RkZXBDQ19UUlVFQAkkKGFtX19tdikgJChERVBESVIpLyQqLlRwbyAkKERFUERJUikvJCouUGxvCitAQU1ERVBfVFJVRUBAYW1fX2Zhc3RkZXBDQ19GQUxTRUAJc291cmNlPSckPCcgb2JqZWN0PSckQCcgbGlidG9vbD15ZXMgQEFNREVQQkFDS1NMQVNIQAorQEFNREVQX1RSVUVAQGFtX19mYXN0ZGVwQ0NfRkFMU0VACURFUERJUj0kKERFUERJUikgJChDQ0RFUE1PREUpICQoZGVwY29tcCkgQEFNREVQQkFDS1NMQVNIQAorQGFtX19mYXN0ZGVwQ0NfRkFMU0VACSQoTFRDT01QSUxFKSAtYyAtbyAkQCAkPAorCittb3N0bHljbGVhbi1saWJ0b29sOgorCS1ybSAtZiAqLmxvCisKK2NsZWFuLWxpYnRvb2w6CisJLXJtIC1yZiAubGlicyBfbGlicworaW5zdGFsbC1tYW44OiAkKG1hbjhfTUFOUykKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwl0ZXN0IC16ICIkKG1hbjhkaXIpIiB8fCAkKE1LRElSX1ApICIkKERFU1RESVIpJChtYW44ZGlyKSIKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJeyBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmU7IFwKKwl9IHwgd2hpbGUgcmVhZCBwOyBkbyBcCisJICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBkPTsgZWxzZSBkPSIkKHNyY2RpcikvIjsgZmk7IFwKKwkgIGVjaG8gIiQkZCQkcCI7IGVjaG8gIiQkcCI7IFwKKwlkb25lIHwgXAorCXNlZCAtZSAnbjtzLC4qLywsO3A7aDtzLC4qXC4sLDtzLF5bXjhdWzAtOWEtel0qJCQsOCw7eCcgXAorCSAgICAgIC1lICdzLFwuWzAtOWEtel0qJCQsLDskKHRyYW5zZm9ybSk7RztzLFxuLC4sJyB8IFwKKwlzZWQgJ047TjtzLFxuLCAsZycgfCB7IFwKKwlsaXN0PTsgd2hpbGUgcmVhZCBmaWxlIGJhc2UgaW5zdDsgZG8gXAorCSAgaWYgdGVzdCAiJCRiYXNlIiA9ICIkJGluc3QiOyB0aGVuIGxpc3Q9IiQkbGlzdCAkJGZpbGUiOyBlbHNlIFwKKwkgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAnJCRmaWxlJyAnJChERVNURElSKSQobWFuOGRpcikvJCRpbnN0JyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICIkJGZpbGUiICIkKERFU1RESVIpJChtYW44ZGlyKS8kJGluc3QiIHx8IGV4aXQgJCQ/OyBcCisJICBmaTsgXAorCWRvbmU7IFwKKwlmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gIiQkaSI7IGRvbmUgfCAkKGFtX19iYXNlX2xpc3QpIHwgXAorCXdoaWxlIHJlYWQgZmlsZXM7IGRvIFwKKwkgIHRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgJyQoREVTVERJUikkKG1hbjhkaXIpJyI7IFwKKwkgICAgJChJTlNUQUxMX0RBVEEpICQkZmlsZXMgIiQoREVTVERJUikkKG1hbjhkaXIpIiB8fCBleGl0ICQkPzsgfTsgXAorCWRvbmU7IH0KKwordW5pbnN0YWxsLW1hbjg6CisJQCQoTk9STUFMX1VOSU5TVEFMTCkKKwlAbGlzdD0nJChtYW44X01BTlMpJzsgdGVzdCAtbiAiJChtYW44ZGlyKSIgfHwgZXhpdCAwOyBcCisJZmlsZXM9YHsgZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICIkJGkiOyBkb25lOyBcCisJfSB8IHNlZCAtZSAncywuKi8sLDtoO3MsLipcLiwsO3MsXlteOF1bMC05YS16XSokJCw4LDt4JyBcCisJICAgICAgLWUgJ3MsXC5bMC05YS16XSokJCwsOyQodHJhbnNmb3JtKTtHO3MsXG4sLiwnYDsgXAorCXRlc3QgLXogIiQkZmlsZXMiIHx8IHsgXAorCSAgZWNobyAiICggY2QgJyQoREVTVERJUikkKG1hbjhkaXIpJyAmJiBybSAtZiIgJCRmaWxlcyAiKSI7IFwKKwkgIGNkICIkKERFU1RESVIpJChtYW44ZGlyKSIgJiYgcm0gLWYgJCRmaWxlczsgfQorCitJRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkgJChUQUdTX0ZJTEVTKQorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAkKExJU1ApICQoVEFHU19GSUxFUyknOyBcCisJdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKKwkgICAgaWYgdGVzdCAtZiAiJCRpIjsgdGhlbiBlY2hvICQkaTsgZWxzZSBlY2hvICQoc3JjZGlyKS8kJGk7IGZpOyBcCisJICBkb25lIHwgXAorCSAgJChBV0spICd7IGZpbGVzWyQkMF0gPSAxOyBub25lbXB0eSA9IDE7IH0gXAorCSAgICAgIEVORCB7IGlmIChub25lbXB0eSkgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH07IH0nYDsgXAorCW1raWQgLWZJRCAkJHVuaXF1ZQordGFnczogVEFHUworCitUQUdTOiAgJChIRUFERVJTKSAkKFNPVVJDRVMpICAkKFRBR1NfREVQRU5ERU5DSUVTKSBcCisJCSQoVEFHU19GSUxFUykgJChMSVNQKQorCXNldCB4OyBcCisJaGVyZT1gcHdkYDsgXAorCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSAgJChMSVNQKSAkKFRBR1NfRklMRVMpJzsgXAorCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgIiQkaSI7IHRoZW4gZWNobyAkJGk7IGVsc2UgZWNobyAkKHNyY2RpcikvJCRpOyBmaTsgXAorCSAgZG9uZSB8IFwKKwkgICQoQVdLKSAneyBmaWxlc1skJDBdID0gMTsgbm9uZW1wdHkgPSAxOyB9IFwKKwkgICAgICBFTkQgeyBpZiAobm9uZW1wdHkpIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9OyB9J2A7IFwKKwlzaGlmdDsgXAorCWlmIHRlc3QgLXogIiQoRVRBR1NfQVJHUykkJCokJHVuaXF1ZSI7IHRoZW4gOjsgZWxzZSBcCisJICB0ZXN0IC1uICIkJHVuaXF1ZSIgfHwgdW5pcXVlPSQkZW1wdHlfZml4OyBcCisJICBpZiB0ZXN0ICQkIyAtZ3QgMDsgdGhlbiBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAiJCRAIiAkJHVuaXF1ZTsgXAorCSAgZWxzZSBcCisJICAgICQoRVRBR1MpICQoRVRBR1NGTEFHUykgJChBTV9FVEFHU0ZMQUdTKSAkKEVUQUdTX0FSR1MpIFwKKwkgICAgICAkJHVuaXF1ZTsgXAorCSAgZmk7IFwKKwlmaQorY3RhZ3M6IENUQUdTCitDVEFHUzogICQoSEVBREVSUykgJChTT1VSQ0VTKSAgJChUQUdTX0RFUEVOREVOQ0lFUykgXAorCQkkKFRBR1NfRklMRVMpICQoTElTUCkKKwlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUykgICQoTElTUCkgJChUQUdTX0ZJTEVTKSc7IFwKKwl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gXAorCSAgICBpZiB0ZXN0IC1mICIkJGkiOyB0aGVuIGVjaG8gJCRpOyBlbHNlIGVjaG8gJChzcmNkaXIpLyQkaTsgZmk7IFwKKwkgIGRvbmUgfCBcCisJICAkKEFXSykgJ3sgZmlsZXNbJCQwXSA9IDE7IG5vbmVtcHR5ID0gMTsgfSBcCisJICAgICAgRU5EIHsgaWYgKG5vbmVtcHR5KSB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfTsgfSdgOyBcCisJdGVzdCAteiAiJChDVEFHU19BUkdTKSQkdW5pcXVlIiBcCisJICB8fCAkKENUQUdTKSAkKENUQUdTRkxBR1MpICQoQU1fQ1RBR1NGTEFHUykgJChDVEFHU19BUkdTKSBcCisJICAgICAkJHVuaXF1ZQorCitHVEFHUzoKKwloZXJlPWAkKGFtX19jZCkgJCh0b3BfYnVpbGRkaXIpICYmIHB3ZGAgXAorCSAgJiYgJChhbV9fY2QpICQodG9wX3NyY2RpcikgXAorCSAgJiYgZ3RhZ3MgLWkgJChHVEFHU19BUkdTKSAiJCRoZXJlIgorCitkaXN0Y2xlYW4tdGFnczoKKwktcm0gLWYgVEFHUyBJRCBHVEFHUyBHUlRBR1MgR1NZTVMgR1BBVEggdGFncworCitkaXN0ZGlyOiAkKERJU1RGSUxFUykKKwlAbGlzdD0nJChNQU5TKSc7IGlmIHRlc3QgLW4gIiQkbGlzdCI7IHRoZW4gXAorCSAgbGlzdD1gZm9yIHAgaW4gJCRsaXN0OyBkbyBcCisJICAgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIGQ9OyBlbHNlIGQ9IiQoc3JjZGlyKS8iOyBmaTsgXAorCSAgICBpZiB0ZXN0IC1mICIkJGQkJHAiOyB0aGVuIGVjaG8gIiQkZCQkcCI7IGVsc2UgOjsgZmk7IGRvbmVgOyBcCisJICBpZiB0ZXN0IC1uICIkJGxpc3QiICYmIFwKKwkgICAgZ3JlcCAnYWIgaGVscDJtYW4gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhpcyBwYWdlJyAkJGxpc3QgPi9kZXYvbnVsbDsgdGhlbiBcCisJICAgIGVjaG8gImVycm9yOiBmb3VuZCBtYW4gcGFnZXMgY29udGFpbmluZyB0aGUgXGBtaXNzaW5nIGhlbHAybWFuJyByZXBsYWNlbWVudCB0ZXh0OiIgPiYyOyBcCisJICAgIGdyZXAgLWwgJ2FiIGhlbHAybWFuIGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoaXMgcGFnZScgJCRsaXN0IHwgc2VkICdzL14vICAgICAgICAgLycgPiYyOyBcCisJICAgIGVjaG8gIiAgICAgICB0byBmaXggdGhlbSwgaW5zdGFsbCBoZWxwMm1hbiwgcmVtb3ZlIGFuZCByZWdlbmVyYXRlIHRoZSBtYW4gcGFnZXM7IiA+JjI7IFwKKwkgICAgZWNobyAiICAgICAgIHR5cGljYWxseSBcYG1ha2UgbWFpbnRhaW5lci1jbGVhbicgd2lsbCByZW1vdmUgdGhlbSIgPiYyOyBcCisJICAgIGV4aXQgMTsgXAorCSAgZWxzZSA6OyBmaTsgXAorCWVsc2UgOjsgZmkKKwlAc3JjZGlyc3RyaXA9YGVjaG8gIiQoc3JjZGlyKSIgfCBzZWQgJ3MvW10uW14kJFxcKl0vXFxcXCYvZydgOyBcCisJdG9wc3JjZGlyc3RyaXA9YGVjaG8gIiQodG9wX3NyY2RpcikiIHwgc2VkICdzL1tdLlteJCRcXCpdL1xcXFwmL2cnYDsgXAorCWxpc3Q9JyQoRElTVEZJTEVTKSc7IFwKKwkgIGRpc3RfZmlsZXM9YGZvciBmaWxlIGluICQkbGlzdDsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBcCisJICBzZWQgLWUgInN8XiQkc3JjZGlyc3RyaXAvfHw7dCIgXAorCSAgICAgIC1lICJzfF4kJHRvcHNyY2RpcnN0cmlwL3wkKHRvcF9idWlsZGRpcikvfDt0ImA7IFwKKwljYXNlICQkZGlzdF9maWxlcyBpbiBcCisJICAqLyopICQoTUtESVJfUCkgYGVjaG8gIiQkZGlzdF9maWxlcyIgfCBcCisJCQkgICBzZWQgJy9cLy8hZDtzfF58JChkaXN0ZGlyKS98O3MsL1teL10qJCQsLCcgfCBcCisJCQkgICBzb3J0IC11YCA7OyBcCisJZXNhYzsgXAorCWZvciBmaWxlIGluICQkZGlzdF9maWxlczsgZG8gXAorCSAgaWYgdGVzdCAtZiAkJGZpbGUgfHwgdGVzdCAtZCAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAorCSAgaWYgdGVzdCAtZCAkJGQvJCRmaWxlOyB0aGVuIFwKKwkgICAgZGlyPWBlY2hvICIvJCRmaWxlIiB8IHNlZCAtZSAncywvW14vXSokJCwsJ2A7IFwKKwkgICAgaWYgdGVzdCAtZCAiJChkaXN0ZGlyKS8kJGZpbGUiOyB0aGVuIFwKKwkgICAgICBmaW5kICIkKGRpc3RkaXIpLyQkZmlsZSIgLXR5cGUgZCAhIC1wZXJtIC03MDAgLWV4ZWMgY2htb2QgdStyd3gge30gXDs7IFwKKwkgICAgZmk7IFwKKwkgICAgaWYgdGVzdCAtZCAkKHNyY2RpcikvJCRmaWxlICYmIHRlc3QgJCRkICE9ICQoc3JjZGlyKTsgdGhlbiBcCisJICAgICAgY3AgLWZwUiAkKHNyY2RpcikvJCRmaWxlICIkKGRpc3RkaXIpJCRkaXIiIHx8IGV4aXQgMTsgXAorCSAgICAgIGZpbmQgIiQoZGlzdGRpcikvJCRmaWxlIiAtdHlwZSBkICEgLXBlcm0gLTcwMCAtZXhlYyBjaG1vZCB1K3J3eCB7fSBcOzsgXAorCSAgICBmaTsgXAorCSAgICBjcCAtZnBSICQkZC8kJGZpbGUgIiQoZGlzdGRpcikkJGRpciIgfHwgZXhpdCAxOyBcCisJICBlbHNlIFwKKwkgICAgdGVzdCAtZiAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAiJChkaXN0ZGlyKS8kJGZpbGUiIFwKKwkgICAgfHwgZXhpdCAxOyBcCisJICBmaTsgXAorCWRvbmUKK2NoZWNrLWFtOiBhbGwtYW0KK2NoZWNrOiAkKEJVSUxUX1NPVVJDRVMpCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stYW0KK2FsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChTQ1JJUFRTKSAkKE1BTlMpCitpbnN0YWxsZGlyczoKKwlmb3IgZGlyIGluICIkKERFU1RESVIpJChzYmluZGlyKSIgIiQoREVTVERJUikkKHNiaW5kaXIpIiAiJChERVNURElSKSQobWFuOGRpcikiOyBkbyBcCisJICB0ZXN0IC16ICIkJGRpciIgfHwgJChNS0RJUl9QKSAiJCRkaXIiOyBcCisJZG9uZQoraW5zdGFsbDogJChCVUlMVF9TT1VSQ0VTKQorCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtYW0KK2luc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLWFtCitpbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQordW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KKworaW5zdGFsbC1hbTogYWxsLWFtCisJQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KKworaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KK2luc3RhbGwtc3RyaXA6CisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgSU5TVEFMTF9QUk9HUkFNPSIkKElOU1RBTExfU1RSSVBfUFJPR1JBTSkiIFwKKwkgIGluc3RhbGxfc2hfUFJPR1JBTT0iJChJTlNUQUxMX1NUUklQX1BST0dSQU0pIiBJTlNUQUxMX1NUUklQX0ZMQUc9LXMgXAorCSAgYHRlc3QgLXogJyQoU1RSSVApJyB8fCBcCisJICAgIGVjaG8gIklOU1RBTExfUFJPR1JBTV9FTlY9U1RSSVBQUk9HPSckKFNUUklQKSciYCBpbnN0YWxsCittb3N0bHljbGVhbi1nZW5lcmljOgorCitjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCisKK2Rpc3RjbGVhbi1nZW5lcmljOgorCS10ZXN0IC16ICIkKENPTkZJR19DTEVBTl9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX0ZJTEVTKQorCS10ZXN0IC4gPSAiJChzcmNkaXIpIiB8fCB0ZXN0IC16ICIkKENPTkZJR19DTEVBTl9WUEFUSF9GSUxFUykiIHx8IHJtIC1mICQoQ09ORklHX0NMRUFOX1ZQQVRIX0ZJTEVTKQorCittYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6CisJQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlIgorCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKKwktdGVzdCAteiAiJChCVUlMVF9TT1VSQ0VTKSIgfHwgcm0gLWYgJChCVUlMVF9TT1VSQ0VTKQorCS10ZXN0IC16ICIkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykKK2NsZWFuOiBjbGVhbi1hbQorCitjbGVhbi1hbTogY2xlYW4tZ2VuZXJpYyBjbGVhbi1saWJ0b29sIGNsZWFuLXNiaW5QUk9HUkFNUyBcCisJbW9zdGx5Y2xlYW4tYW0KKworZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCitkaXN0Y2xlYW4tYW06IGNsZWFuLWFtIGRpc3RjbGVhbi1jb21waWxlIGRpc3RjbGVhbi1nZW5lcmljIFwKKwlkaXN0Y2xlYW4tdGFncworCitkdmk6IGR2aS1hbQorCitkdmktYW06CisKK2h0bWw6IGh0bWwtYW0KKworaHRtbC1hbToKKworaW5mbzogaW5mby1hbQorCitpbmZvLWFtOgorCitpbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuCisKK2luc3RhbGwtZHZpOiBpbnN0YWxsLWR2aS1hbQorCitpbnN0YWxsLWR2aS1hbToKKworaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWRpc3Rfc2JpblNDUklQVFMgaW5zdGFsbC1zYmluUFJPR1JBTVMKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtaG9vaworaW5zdGFsbC1odG1sOiBpbnN0YWxsLWh0bWwtYW0KKworaW5zdGFsbC1odG1sLWFtOgorCitpbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQorCitpbnN0YWxsLWluZm8tYW06CisKK2luc3RhbGwtcGRmOiBpbnN0YWxsLXBkZi1hbQorCitpbnN0YWxsLXBkZi1hbToKKworaW5zdGFsbC1wczogaW5zdGFsbC1wcy1hbQorCitpbnN0YWxsLXBzLWFtOgorCitpbnN0YWxsY2hlY2stYW06CisKK21haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tYW0KKwktcm0gLXJmIC4vJChERVBESVIpCisJLXJtIC1mIE1ha2VmaWxlCittYWludGFpbmVyLWNsZWFuLWFtOiBkaXN0Y2xlYW4tYW0gbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljCisKK21vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQorCittb3N0bHljbGVhbi1hbTogbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1nZW5lcmljIFwKKwltb3N0bHljbGVhbi1saWJ0b29sCisKK3BkZjogcGRmLWFtCisKK3BkZi1hbToKKworcHM6IHBzLWFtCisKK3BzLWFtOgorCit1bmluc3RhbGwtYW06IHVuaW5zdGFsbC1kaXN0X3NiaW5TQ1JJUFRTIHVuaW5zdGFsbC1tYW4gXAorCXVuaW5zdGFsbC1zYmluUFJPR1JBTVMKKwlAJChOT1JNQUxfSU5TVEFMTCkKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB1bmluc3RhbGwtaG9vaworLk1BS0U6IGFsbCBjaGVjayBpbnN0YWxsIGluc3RhbGwtYW0gaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtc3RyaXAgXAorCXVuaW5zdGFsbC1hbQorCisuUEhPTlk6IENUQUdTIEdUQUdTIGFsbCBhbGwtYW0gY2hlY2sgY2hlY2stYW0gY2xlYW4gY2xlYW4tZ2VuZXJpYyBcCisJY2xlYW4tbGlidG9vbCBjbGVhbi1zYmluUFJPR1JBTVMgY3RhZ3MgZGlzdGNsZWFuIFwKKwlkaXN0Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tbGlidG9vbCBcCisJZGlzdGNsZWFuLXRhZ3MgZGlzdGRpciBkdmkgZHZpLWFtIGh0bWwgaHRtbC1hbSBpbmZvIGluZm8tYW0gXAorCWluc3RhbGwgaW5zdGFsbC1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1kYXRhLWFtIFwKKwlpbnN0YWxsLWRpc3Rfc2JpblNDUklQVFMgaW5zdGFsbC1kdmkgaW5zdGFsbC1kdmktYW0gXAorCWluc3RhbGwtZXhlYyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjLWhvb2sgaW5zdGFsbC1odG1sIFwKKwlpbnN0YWxsLWh0bWwtYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtaW5mby1hbSBpbnN0YWxsLW1hbiBcCisJaW5zdGFsbC1tYW44IGluc3RhbGwtcGRmIGluc3RhbGwtcGRmLWFtIGluc3RhbGwtcHMgXAorCWluc3RhbGwtcHMtYW0gaW5zdGFsbC1zYmluUFJPR1JBTVMgaW5zdGFsbC1zdHJpcCBpbnN0YWxsY2hlY2sgXAorCWluc3RhbGxjaGVjay1hbSBpbnN0YWxsZGlycyBtYWludGFpbmVyLWNsZWFuIFwKKwltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4gbW9zdGx5Y2xlYW4tY29tcGlsZSBcCisJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1saWJ0b29sIHBkZiBwZGYtYW0gcHMgcHMtYW0gXAorCXRhZ3MgdW5pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwtZGlzdF9zYmluU0NSSVBUUyBcCisJdW5pbnN0YWxsLWhvb2sgdW5pbnN0YWxsLW1hbiB1bmluc3RhbGwtbWFuOCBcCisJdW5pbnN0YWxsLXNiaW5QUk9HUkFNUworCitAQ09ORklHX1JQQ0dFTl9UUlVFQCQoUlBDR0VOKToKK0BDT05GSUdfUlBDR0VOX1RSVUVACW1ha2UgLUMgLi4vLi4vdG9vbHMvcnBjZ2VuIGFsbAorCiskKEdFTkZJTEVTX0NMTlQpOiAlX2NsbnQuYzogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWwgLW8gJEAgJDwKKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKwlybSAtZiAkQAorCW12IC1mICRALk4gJEAKKworJChHRU5GSUxFU19TVkMpOiAlX3N2Yy5jOiAlLnggJChSUENHRU4pCisJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorCSQoUlBDR0VOKSAtbSAtbyAkQCAkPAorCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorCXJtIC1mICRACisJbXYgLWYgJEAuTiAkQAorCiskKEdFTkZJTEVTX1hEUik6ICVfeGRyLmM6ICUueCAkKFJQQ0dFTikKKwl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisJJChSUENHRU4pIC1jIC1vICRAICQ8CisJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisJcm0gLWYgJEAKKwltdiAtZiAkQC5OICRACisKKyQoR0VORklMRVNfSCk6ICUuaDogJS54ICQoUlBDR0VOKQorCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKwkkKFJQQ0dFTikgLWggLW8gJEAgJDwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZvbGxvd2luZyBhbGxvd3MgdGhlIGN1cnJlbnQgcHJhY3RpY2Ugb2YgaGF2aW5nCisjIGRhZW1vbnMgcmVuYW1lZCBkdXJpbmcgdGhlIGluc3RhbGwgdG8gaW5jbHVkZSBSUENQUkVGSVgKKyMgYW5kIHRoZSBLUFJFRklYCisjIFRoaXMgY291bGQgYWxsIGJlIGRvbmUgbXVjaCBlYXNpZXIgd2l0aCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCisjICggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA9IHMvXi8kKFJQQ1BSRUZJWCkkKEtQUkVGSVgpLyApCisjIGJ1dCB0aGF0IGFsc28gcmVuYW1lcyB0aGUgbWFuIHBhZ2VzLCB3aGljaCB0aGUgY3VycmVudAorIyBwcmFjdGljZSBkb2VzIG5vdCBkby4KK2luc3RhbGwtZXhlYy1ob29rOgorCShjZCAkKERFU1RESVIpJChzYmluZGlyKSAmJiBcCisJICBmb3IgcCBpbiAkKHNiaW5fUFJPR1JBTVMpOyBkbyBcCisJICAgIFsgJCRwID0gc20tbm90aWZ5IF0gfHwgbXYgLWYgJCRwJChFWEVFWFQpICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCit1bmluc3RhbGwtaG9vazoKKwkoY2QgJChERVNURElSKSQoc2JpbmRpcikgJiYgXAorCSAgZm9yIHAgaW4gJChzYmluX1BST0dSQU1TKTsgZG8gXAorCSAgICBbICQkcCA9IHNtLW5vdGlmeSBdIHx8IHJtIC1mICQoUlBDUFJFRklYKSQoS1BSRUZJWCkkJHAkKEVYRUVYVCkgO1wKKwkgIGRvbmUpCisKKyMgWFhYIFRoaXMgbWFrZXMgc29tZSBhc3N1bXB0aW9ucyBhYm91dCB3aGF0IGF1dG9tYWtlIGRvZXMuCisjIFhYWCBCdXQgdGhlcmUgaXMgbm8gaW5zdGFsbC1tYW4taG9vayBvciBpbnN0YWxsLW1hbi1sb2NhbC4KK2luc3RhbGwtbWFuOiBpbnN0YWxsLW1hbjggaW5zdGFsbC1tYW4tbGlua3MKK3VuaW5zdGFsbC1tYW46IHVuaW5zdGFsbC1tYW44IHVuaW5zdGFsbC1tYW4tbGlua3MKKworaW5zdGFsbC1tYW4tbGlua3M6CisJKGNkICQoREVTVERJUikkKG1hbjhkaXIpICYmIFwKKwkgIGZvciBtIGluICQobWFuOF9NQU5TKSAkKGRpc3RfbWFuOF9NQU5TKSAkKG5vZGlzdF9tYW44X01BTlMpOyBkbyBcCisJICAgIGluc3Q9YGVjaG8gJCRtIHwgc2VkIC1lICdzL21hbiQkLzgvJ2A7IFwKKwkgICAgcm0gLWYgJChSUENQUkVGSVgpJCRpbnN0IDsgXAorCSAgICAkKExOX1MpICQkaW5zdCAkKFJQQ1BSRUZJWCkkJGluc3QgOyBcCisJICBkb25lKQorCit1bmluc3RhbGwtbWFuLWxpbmtzOgorCShjZCAkKERFU1RESVIpJChtYW44ZGlyKSAmJiBcCisJICBmb3IgbSBpbiAkKG1hbjhfTUFOUykgJChkaXN0X21hbjhfTUFOUykgJChub2Rpc3RfbWFuOF9NQU5TKTsgZG8gXAorCSAgICBpbnN0PWBlY2hvICQkbSB8IHNlZCAtZSAncy9tYW4kJC84LydgOyBcCisJICAgIHJtIC1mICQoUlBDUFJFRklYKSQkaW5zdCA7IFwKKwkgIGRvbmUpCisKKyMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCisjIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KKy5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9UT0RPIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlMDUwYQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9UT0RPCkBAIC0wLDAgKzEsMTMgQEAKK1NvbWUgdGhpbmdzIHN0aWxsIGxlZnQgdG8gZG8gKG5vdCBhIGNvbXByZWhlbnNpdmUgbGlzdCk6CisKKyogR28gdGhyb3VnaCBPbGFmJ3MgZXh0ZW5zaXZlIGNoYW5nZXMgKGVzcGVjaWFsbHkgdGhlIGxpc3QgYW5kIGNhbGxiYWNrCisgIGhhbmRsaW5nLCB3aGljaCBpcyB0aGUgbWVhdCBvZiB0aGUgc2VydmVyKSBhbmQgdW5kZXJzdGFuZCBldmVyeXRoaW5nCisgIHRoYXQgaGUncyBkb25lLgorCisqIENvbnRpbnVlIGNoZWNraW5nIGZvciBzZWN1cml0eSBob2xlcy4KKworKiBIYW5kbGUgbXVsdGlwbGUgU01fTU9OIHJlcXVlc3RzIHRoYXQgYXJlIGlkZW50aWNhbCBzYXZlIGZvciB0aGUgInByaXYiCisgIGluZm9ybWF0aW9uLiAgSG93IHNob3VsZCBJIGRvIHRoaXM/ICBObyBzcGVjJ3MuLi4oaXQncyBub3QgcmVhbGx5CisgIHN1cHBvc2VkIHRvIGhhcHBlbikuICBbRGlkIE9sYWYgYWxyZWFkeSBhZGRyZXNzIHRoaXM/XQorCisqIEJFVFRFUiBDT0RFIENPTU1FTlRTIQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL2NhbGxiYWNrLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvY2FsbGJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNjMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL2NhbGxiYWNrLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTctMTk5OSBKZWZmcmV5IEEuIFVwaG9mZgorICogTW9kaWZpZWQgYnkgT2xhZiBLaXJjaCwgT2N0LiAxOTk2LgorICogTW9kaWZpZWQgYnkgTG9uIEhvaGJlcmdlciwgT2N0LiAyMDAwLgorICoKKyAqIE5TTSBmb3IgTGludXguCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgInJwY21pc2MuaCIKKyNpbmNsdWRlICJzdGF0ZC5oIgorI2luY2x1ZGUgIm5vdGxpc3QuaCIKKworLyogQ2FsbGJhY2sgbm90aWZ5IGxpc3QuICovCisvKiBub3RpZnlfbGlzdCAqY2JubCA9IE5VTEw7IC4uLiBuZXZlciB1c2VkICovCisKKworLyoKKyAqIFNlcnZpY2VzIFNNX05PVElGWSByZXF1ZXN0cy4KKyAqCisgKiBXaGVuIE5MTSB1c2VzIGFuIFNNX01PTiByZXF1ZXN0IHRvIHRlbGwgc3RhdGQgdG8gbW9uaXRvciBhIHJlbW90ZSwKKyAqIHRoZSByZXF1ZXN0IGNvbnRhaW5zIGEgIm1vbl9uYW1lIiBhcmd1bWVudC4gIFRoaXMgaXMgdXN1YWxseSB0aGUKKyAqICJjYWxsZXJfbmFtZSIgYXJndW1lbnQgb2YgYW4gTkxNUFJPQ19MT0NLIHJlcXVlc3QuICBPbiBMaW51eCwgdGhlCisgKiBOTE0gY2FuIHNlbmQgc3RhdGQgdGhlIHJlbW90ZSdzIElQIGFkZHJlc3MgaW5zdGVhZCBvZiBpdHMKKyAqIGNhbGxlcl9uYW1lLiAgVGhlIE5TTSBwcm90b2NvbCBkb2VzIG5vdCBhbGxvdyBib3RoIHRoZSByZW1vdGUncworICogY2FsbGVyX25hbWUgYW5kIGl0J3MgSVAgYWRkcmVzcyB0byBiZSBzZW50IGluIHRoZSBzYW1lIFNNX01PTgorICogcmVxdWVzdC4KKyAqCisgKiBUaGUgcmVtb3RlJ3MgY2FsbGVyX25hbWUgaXMgdXNlZnVsIGJlY2F1c2UgaXQgbWFrZXMgaXQgc2ltcGxlCisgKiB0byBpZGVudGlmeSByZWJvb3RpbmcgcmVtb3RlcyBieSBtYXRjaGluZyB0aGUgIm1vbl9uYW1lIiBhcmd1bWVudAorICogdGhleSBzZW50IHZpYSBhbiBTTV9OT1RJRlkgcmVxdWVzdC4KKyAqCisgKiBUaGUgY2FsbGVyX25hbWUgc3RyaW5nIG1heSBub3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUsCisgKiBvciBldmVuIHJlZ2lzdGVyZWQgaW4gdGhlIEROUyBkYXRhYmFzZSwgaG93ZXZlci4gIEhhdmluZyB0aGUKKyAqIHJlbW90ZSdzIElQIGFkZHJlc3MgaXMgdXNlZnVsIGJlY2F1c2UgdGhlbiB0aGVyZSBpcyBubyBhbWJpZ3VpdHkKKyAqIGFib3V0IHdoZXJlIHRvIHNlbmQgYW4gU01fTk9USUZZIGFmdGVyIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cy4KKyAqCisgKiBXaXRob3V0IHRoZSBhY3R1YWwgY2FsbGVyX25hbWUsIGhvd2V2ZXIsIHN0YXRkIG11c3QgdXNlIGFuCisgKiBoZXVyaXN0aWMgdG8gbWF0Y2ggYW4gaW5jb21pbmcgU01fTk9USUZZIHJlcXVlc3QgdG8gb25lIG9mIHRoZQorICogaG9zdHMgaXQgaXMgY3VycmVudGx5IG1vbml0b3JpbmcuICBUaGUgaW5jb21pbmcgbW9uX25hbWUgaW4gYW4KKyAqIFNNX05PVElGWSBhZGRyZXNzIGlzIGNvbnZlcnRlZCB0byBhIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIHVzaW5nCisgKiBETlMuICBFYWNoIG1vbl9uYW1lIG9uIHN0YXRkJ3MgbW9uaXRvciBsaXN0IGlzIGFsc28gY29udmVydGVkIHRvCisgKiBhbiBhZGRyZXNzIGxpc3QsIGFuZCB0aGUgdHdvIGxpc3RzIGFyZSBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSBpcworICogYSBtYXRjaGluZyBhZGRyZXNzLgorICoKKyAqIFRoZXJlIGFyZSBzb21lIHJpc2tzIHRvIHRoaXMgc3RyYXRlZ3k6CisgKgorICogICAxLiAgVGhlIGV4dGVybmFsIEROUyBkYXRhYmFzZSBpcyBub3QgcmVsaWFibGUuICBJdCBjYW4gY2hhbmdlCisgKiAgICAgICBvdmVyIHRpbWUsIG9yIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIG1hcHBpbmdzIGNvdWxkIGJlCisgKiAgICAgICBpbmNvbnNpc3RlbnQuCisgKgorICogICAyLiAgSWYgc3RhdGQncyBtb25pdG9yIGxpc3QgYmVjb21lcyBzdWJzdGFudGlhbCwgZmluZGluZyBhIG1hdGNoCisgKiAgICAgICBjYW4gZ2VuZXJhdGUgYSBub3QgaW5jb25zZXF1ZW50aWFsIGFtb3VudCBvZiBETlMgdHJhZmZpYy4KKyAqCisgKiAgIDMuICBzdGF0ZCBpcyBhIHNpbmdsZS10aHJlYWRlZCBzZXJ2aWNlLiAgV2hlbiBETlMgYmVjb21lcyBzbG93IG9yCisgKiAgICAgICB1bnJlc3BvbnNpdmUsIHN0YXRkIGFsc28gYmVjb21lcyBzbG93IG9yIHVucmVzcG9uc2l2ZS4KKyAqCisgKiAgIDQuICBJZiB0aGUgcmVtb3RlIGRvZXMgbm90IGhhdmUgYSBETlMgZW50cnkgYXQgYWxsIChvciBpZiB0aGUKKyAqICAgICAgIHJlbW90ZSBjYW4gcmVzb2x2ZSBpdHNlbGYsIGJ1dCB0aGUgbG9jYWwgaG9zdCBjYW4ndCByZXNvbHZlCisgKiAgICAgICB0aGUgcmVtb3RlJ3MgaG9zdG5hbWUpLCB0aGUgcmVtb3RlIGNhbm5vdCBiZSBtb25pdG9yZWQsIGFuZAorICogICAgICAgdGhlcmVmb3JlIE5MTSBsb2NraW5nIGNhbm5vdCBiZSBwcm92aWRlZCBmb3IgdGhhdCBob3N0LgorICoKKyAqICAgNS4gIExvY2FsIEROUyByZXNvbHV0aW9uIGNhbiBwcm9kdWNlIGRpZmZlcmVudCByZXN1bHRzIGZvciB0aGUKKyAqICAgICAgIG1vbl9uYW1lIHRoYW4gdGhlIHJlc3VsdHMgdGhlIHJlbW90ZSBtaWdodCBzZWUgZm9yIHRoZSBzYW1lCisgKiAgICAgICBxdWVyeSwgZXNwZWNpYWxseSBpZiB0aGUgcmVtb3RlIGRpZCBub3Qgc2VuZCBhIGNhbGxlcl9uYW1lCisgKiAgICAgICBvciBtb25fbmFtZSB0aGF0IGlzIGEgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lLgorICoKKyAqICAgICAgIE5vdGUgdGhhdCBhIGNhbGxlcl9uYW1lIGlzIHBhc3NlZCBmcm9tIE5GUyBjbGllbnQgdG8gc2VydmVyLAorICogICAgICAgYnV0IHRoZSBjbGllbnQgbmV2ZXIga25vd3Mgd2hhdCBtb25fbmFtZSB0aGUgc2VydmVyIG1pZ2h0IHVzZQorICogICAgICAgdG8gbm90aWZ5IGl0IG9mIGEgcmVib290LiAgT24gTGludXgsIHRoZSBjbGllbnQgZXh0cmFjdHMgdGhlCisgKiAgICAgICBzZXJ2ZXIncyBuYW1lIGZyb20gdGhlIGRldm5hbWUgaXQgd2FzIHBhc3NlZCBieSB0aGUgbW91bnQKKyAqICAgICAgIGNvbW1hbmQuICBUaGlzIGlzIG9mdGVuIG5vdCBhIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZS4KKyAqLwordm9pZCAqCitzbV9ub3RpZnlfMV9zdmMoc3RydWN0IHN0YXRfY2hnZSAqYXJncCwgc3RydWN0IHN2Y19yZXEgKnJxc3RwKQoreworCW5vdGlmeV9saXN0ICAgICpscCwgKmNhbGw7CisJc3RhdGljIGNoYXIgICAgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyICpzYXAgPSBuZnNfZ2V0cnBjY2FsbGVyKHJxc3RwLT5ycV94cHJ0KTsKKwljaGFyCQlpcF9hZGRyW0lORVQ2X0FERFJTVFJMRU5dOworCisJeGxvZyhEX0NBTEwsICJSZWNlaXZlZCBTTV9OT1RJRlkgZnJvbSAlcywgc3RhdGU6ICVkIiwKKwkJCQlhcmdwLT5tb25fbmFtZSwgYXJncC0+c3RhdGUpOworCisJLyogcXVpY2sgY2hlY2sgLSBkb24ndCBib3RoZXIgaWYgd2UncmUgbm90IG1vbml0b3JpbmcgYW55b25lICovCisJaWYgKHJ0bmwgPT0gTlVMTCkgeworCQl4bG9nX3dhcm4oIlNNX05PVElGWSBmcm9tICVzIHdoaWxlIG5vdCBtb25pdG9yaW5nIGFueSBob3N0cyIsCisJCQkJYXJncC0+bW9uX25hbWUpOworCQlyZXR1cm4gKCh2b2lkICopICZyZXN1bHQpOworCX0KKworCWlmICghc3RhdGRfcHJlc2VudF9hZGRyZXNzKHNhcCwgaXBfYWRkciwgc2l6ZW9mKGlwX2FkZHIpKSkgeworCQl4bG9nX3dhcm4oIlVucmVjb2duaXplZCBzZW5kZXIgYWRkcmVzcyIpOworCQlyZXR1cm4gKCh2b2lkICopICZyZXN1bHQpOworCX0KKworCS8qIG9raXIgY2hhbmdlOiBzdGF0ZCBkb2Vzbid0IHJlbW92ZSB0aGUgcmVtb3RlIGhvc3QgZnJvbSBpdHMKKwkgKiBpbnRlcm5hbCBtb25pdG9yIGxpc3Qgd2hlbiByZWNlaXZpbmcgYW4gU01fTk9USUZZIGNhbGwgZnJvbQorCSAqIGl0LiBMb2NrZCB3aWxsIHdhbnQgdG8gY29udGludWUgbW9uaXRvcmluZyB0aGUgcmVtb3RlIGhvc3QKKwkgKiB1bnRpbCBpdCBpc3N1ZXMgYW4gU01fVU5NT04gY2FsbC4KKwkgKi8KKwlmb3IgKGxwID0gcnRubCA7IGxwIDsgbHAgPSBscC0+bmV4dCkKKwkJaWYgKE5MX1NUQVRFKGxwKSAhPSBhcmdwLT5zdGF0ZSAmJgorCQkgICAgKHN0YXRkX21hdGNoaG9zdG5hbWUoYXJncC0+bW9uX25hbWUsIGxwLT5kbnNfbmFtZSkgfHwKKwkJICAgICBzdGF0ZF9tYXRjaGhvc3RuYW1lKGlwX2FkZHIsIGxwLT5kbnNfbmFtZSkpKSB7CisJCQlOTF9TVEFURShscCkgPSBhcmdwLT5zdGF0ZTsKKwkJCWNhbGwgPSBubGlzdF9jbG9uZShscCk7CisJCQlubGlzdF9pbnNlcnQoJm5vdGlmeSwgY2FsbCk7CisJCX0KKworCisJcmV0dXJuICgodm9pZCAqKSAmcmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9ob3N0bmFtZS5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL2hvc3RuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3MDRjYwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9ob3N0bmFtZS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogQ29weXJpZ2h0IDIwMDkgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBuZnMtdXRpbHMuCisgKgorICogbmZzLXV0aWxzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBuZnMtdXRpbHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIG5mcy11dGlscy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKgorICogTlNNIGZvciBMaW51eC4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJzb2NrYWRkci5oIgorI2luY2x1ZGUgInN0YXRkLmgiCisjaW5jbHVkZSAieGxvZy5oIgorCisjaWZuZGVmIEhBVkVfREVDTF9BSV9BRERSQ09ORklHCisjZGVmaW5lIEFJX0FERFJDT05GSUcJMAorI2VuZGlmCisKKy8qKgorICogc3RhdGRfcHJlc2VudF9hZGRyZXNzIC0gY29udmVydCBzb2NrYWRkciB0byBwcmVzZW50YXRpb24gYWRkcmVzcworICogQHNhcDogcG9pbnRlciB0byBzb2NrZXQgYWRkcmVzcyB0byBjb252ZXJ0CisgKiBAYnVmOiBwb2ludGVyIHRvIGJ1ZmZlciB0byBmaWxsIGluCisgKiBAYnVmbGVuOiBsZW5ndGggb2YgYnVmZmVyCisgKgorICogQ29udmVydCB0aGUgcGFzc2VkLWluIHNvY2thZGRyLXN0eWxlIGFkZHJlc3MgdG8gcHJlc2VudGF0aW9uIGZvcm1hdC4KKyAqIFRoZSBwcmVzZW50YXRpb24gZm9ybWF0IGFkZHJlc3MgaXMgcGxhY2VkIGluIEBidWYgYW5kIGlzCisgKiAnXDAnLXRlcm1pbmF0ZWQuCisgKgorICogUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWw7IG90aGVyd2lzZSBmYWxzZS4KKyAqCisgKiBnZXRuYW1laW5mbygzKSBpcyBwcmVmZXJyZWQsIHNpbmNlIGl0IGNhbiBwYXJzZSBJUHY2IHNjb3BlIElEcy4KKyAqIEFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHN0YXRkX3ByZXNlbnRfYWRkcmVzcygpIGlzIGF2YWlsYWJsZSB0bworICogaGFuZGxlIG9sZGVyIGdsaWJjcyB0aGF0IGRvIG5vdCBoYXZlIGdldG5hbWVpbmZvKDMpLgorICovCisjaWZkZWYgSEFWRV9HRVROQU1FSU5GTworX0Jvb2wKK3N0YXRkX3ByZXNlbnRfYWRkcmVzcyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgY2hhciAqYnVmLCBjb25zdCBzaXplX3QgYnVmbGVuKQoreworCXNvY2tsZW5fdCBzYWxlbjsKKwlpbnQgZXJyb3I7CisKKwlzYWxlbiA9IG5mc19zb2NrYWRkcl9sZW5ndGgoc2FwKTsKKwlpZiAoc2FsZW4gPT0gMCkgeworCQl4bG9nKERfR0VORVJBTCwgIiVzOiB1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZXJyb3IgPSBnZXRuYW1laW5mbyhzYXAsIHNhbGVuLCBidWYsIChzb2NrbGVuX3QpYnVmbGVuLAorCQkJCQkJTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpOworCWlmIChlcnJvciAhPSAwKSB7CisJCXhsb2coRF9HRU5FUkFMLCAiJXM6IGdldG5hbWVpbmZvKDMpOiAlcyIsCisJCQkJX19mdW5jX18sIGdhaV9zdHJlcnJvcihlcnJvcikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorI2Vsc2UJLyogIUhBVkVfR0VUTkFNRUlORk8gKi8KK19Cb29sCitzdGF0ZF9wcmVzZW50X2FkZHJlc3MoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsIGNoYXIgKmJ1ZiwgY29uc3Qgc2l6ZV90IGJ1ZmxlbikKK3sKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYXA7CisKKwlpZiAoc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJeGxvZyhEX0dFTkVSQUwsICIlczogdW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkiLCBfX2Z1bmNfXyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKiBlbnN1cmUgJ1wwJyB0ZXJtaW5hdGlvbiAqLworCW1lbXNldChidWYsIDAsIGJ1Zmxlbik7CisKKwlpZiAoaW5ldF9udG9wKEFGX0lORVQsIChjaGFyICopJnNpbi0+c2luX2FkZHIsCisJCQkJCWJ1ZiwgKHNvY2tsZW5fdClidWZsZW4pID09IE5VTEwpIHsKKwkJeGxvZyhEX0dFTkVSQUwsICIlczogaW5ldF9udG9wKDMpOiAlbSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgkvKiAhSEFWRV9HRVROQU1FSU5GTyAqLworCisvKgorICogTG9vayB1cCB0aGUgaG9zdG5hbWU7IHJlcG9ydCBleGNlcHRpb25hbCBlcnJvcnMuICBDYWxsZXIgbXVzdAorICogY2FsbCBmcmVlYWRkcmluZm8oMykgaWYgYSB2YWxpZCBhZGRyaW5mbyBpcyByZXR1cm5lZC4KKyAqLworX19hdHRyaWJ1dGVfbWFsbG9jX18KK3N0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKgorZ2V0X2FkZHJpbmZvKGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnQpCit7CisJc3RydWN0IGFkZHJpbmZvICphaSA9IE5VTEw7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgaGludCwgJmFpKTsKKwlzd2l0Y2ggKGVycm9yKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gYWk7CisJY2FzZSBFQUlfTk9OQU1FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQl4bG9nKERfR0VORVJBTCwgIiVzOiBmYWlsZWQgdG8gcmVzb2x2ZSBob3N0ICVzOiAlcyIsCisJCQkJX19mdW5jX18sIGhvc3RuYW1lLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2lmZGVmIEhBVkVfR0VUTkFNRUlORk8KK3N0YXRpYyBfQm9vbAorZ2V0X25hbWVpbmZvKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjb25zdCBzb2NrbGVuX3Qgc2FsZW4sCisJCS8qQG91dEAqLyBjaGFyICpidWYsIGNvbnN0IHNvY2tsZW5fdCBidWZsZW4pCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBnZXRuYW1laW5mbyhzYXAsIHNhbGVuLCBidWYsIGJ1ZmxlbiwgTlVMTCwgMCwgTklfTkFNRVJFUUQpOworCWlmIChlcnJvciAhPSAwKSB7CisJCXhsb2coRF9HRU5FUkFMLCAiJXM6IGZhaWxlZCB0byByZXNvbHZlIGFkZHJlc3M6ICVzIiwKKwkJCQlfX2Z1bmNfXywgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbHNlCS8qICFIQVZFX0dFVE5BTUVJTkZPICovCitzdGF0aWMgX0Jvb2wKK2dldF9uYW1laW5mbyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIGNvbnN0IHNvY2tsZW5fdCBzYWxlbiwKKwkJLypAb3V0QCovIGNoYXIgKmJ1Ziwgc29ja2xlbl90IGJ1ZmxlbikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoY2hhciAqKXNhcDsKKwlzdHJ1Y3QgaG9zdGVudCAqaHA7CisKKwlpZiAoc2luLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJeGxvZyhEX0dFTkVSQUwsICIlczogdW5rbm93biBhZGRyZXNzIGZhbWlseTogJWQiLAorCQkJCXNpbi0+c2luX2ZhbWlseSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlocCA9IGdldGhvc3RieWFkZHIoKGNvbnN0IGNoYXIgKikmKHNpbi0+c2luX2FkZHIuc19hZGRyKSwKKwkJCQlzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBBRl9JTkVUKTsKKwlpZiAoaHAgPT0gTlVMTCkgeworCQl4bG9nKERfR0VORVJBTCwgIiVzOiBmYWlsZWQgdG8gcmVzb2x2ZSBhZGRyZXNzOiAlbSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN0cm5jcHkoYnVmLCBocC0+aF9uYW1lLCAoc2l6ZV90KWJ1Zmxlbik7CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYJLyogIUhBVkVfR0VUTkFNRUlORk8gKi8KKworLyoqCisgKiBzdGF0ZF9jYW5vbmljYWxfbmFtZSAtIGNob29zZSBmaWxlIG5hbWUgZm9yIG1vbml0b3IgcmVjb3JkIGZpbGVzCisgKiBAaG9zdG5hbWU6IEMgc3RyaW5nIGNvbnRhaW5pbmcgaG9zdG5hbWUgb3IgcHJlc2VudGF0aW9uIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIGEgJ1wwJy10ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIGEgZnVsbHkgcXVhbGlmaWVkCisgKiBjYW5vbmljYWwgaG9zdG5hbWUsIG9yIE5VTEwgaWYgQGhvc3RuYW1lIGRvZXMgbm90IGhhdmUgYSByZXZlcnNlCisgKiBtYXBwaW5nLiAgQ2FsbGVyIG11c3QgZnJlZSB0aGUgcmVzdWx0IHdpdGggZnJlZSgzKS4KKyAqCisgKiBJbmNvbWluZyBob3N0bmFtZXMgYXJlIGxvb2tlZCB1cCB0byBkZXRlcm1pbmUgdGhlIGNhbm9uaWNhbCBob3N0bmFtZSwKKyAqIGFuZCBpbmNvbWluZyBwcmVzZW50YXRpb24gYWRkcmVzc2VzIGFyZSBjb252ZXJ0ZWQgdG8gY2Fub25pY2FsCisgKiBob3N0bmFtZXMuCisgKgorICogV2Ugd29uJ3QgbW9uaXRvciBwZWVycyB0aGF0IGRvbid0IGhhdmUgYSByZXZlcnNlIG1hcC4gIFRoZSBjYW5vbmljYWwKKyAqIG5hbWUgZ2l2ZXMgdXMgYSBrZXkgZm9yIG91ciBtb25pdG9yIGxpc3QuCisgKi8KK19fYXR0cmlidXRlX21hbGxvY19fCitjaGFyICoKK3N0YXRkX2Nhbm9uaWNhbF9uYW1lKGNvbnN0IGNoYXIgKmhvc3RuYW1lKQoreworCXN0cnVjdCBhZGRyaW5mbyBoaW50ID0geworI2lmZGVmIElQVjZfU1VQUE9SVEVECisJCS5haV9mYW1pbHkJPSBBRl9VTlNQRUMsCisjZWxzZQkvKiAhSVBWNl9TVVBQT1JURUQgKi8KKwkJLmFpX2ZhbWlseQk9IEFGX0lORVQsCisjZW5kaWYJLyogIUlQVjZfU1VQUE9SVEVEICovCisJCS5haV9mbGFncwk9IEFJX05VTUVSSUNIT1NULAorCQkuYWlfcHJvdG9jb2wJPSAoaW50KUlQUFJPVE9fVURQLAorCX07CisJY2hhciBidWZbTklfTUFYSE9TVF07CisJc3RydWN0IGFkZHJpbmZvICphaTsKKworCWFpID0gZ2V0X2FkZHJpbmZvKGhvc3RuYW1lLCAmaGludCk7CisJaWYgKGFpICE9IE5VTEwpIHsKKwkJLyogQGhvc3RuYW1lIHdhcyBhIHByZXNlbnRhdGlvbiBhZGRyZXNzICovCisJCV9Cb29sIHJlc3VsdDsKKwkJcmVzdWx0ID0gZ2V0X25hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKKwkJCQkJYnVmLCAoc29ja2xlbl90KXNpemVvZihidWYpKTsKKwkJZnJlZWFkZHJpbmZvKGFpKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIHN0cmR1cChidWYpOworCX0KKworCS8qIEBob3N0bmFtZSB3YXMgYSBob3N0bmFtZSAqLworCWhpbnQuYWlfZmxhZ3MgPSBBSV9DQU5PTk5BTUU7CisJYWkgPSBnZXRfYWRkcmluZm8oaG9zdG5hbWUsICZoaW50KTsKKwlpZiAoYWkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc3RyY3B5KGJ1ZiwgYWktPmFpX2Nhbm9ubmFtZSk7CisJZnJlZWFkZHJpbmZvKGFpKTsKKworCXJldHVybiBzdHJkdXAoYnVmKTsKK30KKworLyoqCisgKiBzdGF0ZF9tYXRjaGhvc3RuYW1lIC0gY2hlY2sgaWYgdHdvIGhvc3RuYW1lcyBhcmUgZXF1aXZhbGVudAorICogQGhvc3RuYW1lMTogQyBzdHJpbmcgY29udGFpbmluZyBob3N0bmFtZQorICogQGhvc3RuYW1lMjogQyBzdHJpbmcgY29udGFpbmluZyBob3N0bmFtZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaG9zdG5hbWVzIGFyZSB0aGUgc2FtZSwgdGhlIGhvc3RuYW1lcyByZXNvbHZlCisgKiB0byB0aGUgc2FtZSBjYW5vbmljYWwgbmFtZSwgb3IgdGhlIGhvc3RuYW1lcyByZXNvbHZlIHRvIGF0IGxlYXN0CisgKiBvbmUgYWRkcmVzcyB0aGF0IGlzIHRoZSBzYW1lLiAgRmFsc2UgaXMgcmV0dXJuZWQgaWYgdGhlIGhvc3RuYW1lcworICogZG8gbm90IG1hdGNoIGluIGFueSBvZiB0aGVzZSB3YXlzLCBpZiBlaXRoZXIgaG9zdG5hbWUgY29udGFpbnMKKyAqIHdpbGRjYXJkIGNoYXJhY3RlcnMsIGlmIGVpdGhlciBob3N0bmFtZSBpcyBhIG5ldGdyb3VwIG5hbWUsIG9yCisgKiBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK19Cb29sCitzdGF0ZF9tYXRjaGhvc3RuYW1lKGNvbnN0IGNoYXIgKmhvc3RuYW1lMSwgY29uc3QgY2hhciAqaG9zdG5hbWUyKQoreworCXN0cnVjdCBhZGRyaW5mbyAqYWkxLCAqYWkyLCAqcmVzdWx0czEgPSBOVUxMLCAqcmVzdWx0czIgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyBoaW50ID0geworCQkuYWlfZmFtaWx5CT0gQUZfVU5TUEVDLAorCQkuYWlfZmxhZ3MJPSBBSV9DQU5PTk5BTUUsCisJCS5haV9wcm90b2NvbAk9IChpbnQpSVBQUk9UT19VRFAsCisJfTsKKwlfQm9vbCByZXN1bHQgPSBmYWxzZTsKKworCWlmIChzdHJjYXNlY21wKGhvc3RuYW1lMSwgaG9zdG5hbWUyKSA9PSAwKSB7CisJCXJlc3VsdCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCXJlc3VsdHMxID0gZ2V0X2FkZHJpbmZvKGhvc3RuYW1lMSwgJmhpbnQpOworCWlmIChyZXN1bHRzMSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlyZXN1bHRzMiA9IGdldF9hZGRyaW5mbyhob3N0bmFtZTIsICZoaW50KTsKKwlpZiAocmVzdWx0czIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZiAoc3RyY2FzZWNtcChyZXN1bHRzMS0+YWlfY2Fub25uYW1lLCByZXN1bHRzMi0+YWlfY2Fub25uYW1lKSA9PSAwKSB7CisJCXJlc3VsdCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoYWkxID0gcmVzdWx0czE7IGFpMSAhPSBOVUxMOyBhaTEgPSBhaTEtPmFpX25leHQpCisJCWZvciAoYWkyID0gcmVzdWx0czI7IGFpMiAhPSBOVUxMOyBhaTIgPSBhaTItPmFpX25leHQpCisJCQlpZiAobmZzX2NvbXBhcmVfc29ja2FkZHIoYWkxLT5haV9hZGRyLCBhaTItPmFpX2FkZHIpKSB7CisJCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKworb3V0OgorCWZyZWVhZGRyaW5mbyhyZXN1bHRzMik7CisJZnJlZWFkZHJpbmZvKHJlc3VsdHMxKTsKKworCXhsb2coRF9DQUxMLCAiJXM6IGhvc3RuYW1lcyAlcyIsIF9fZnVuY19fLAorCQkJKHJlc3VsdCA/ICJtYXRjaGVkIiA6ICJkaWQgbm90IG1hdGNoIikpOworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbWlzYy5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmEwODZmCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL21pc2MuYwpAQCAtMCwwICsxLDUxIEBACisvKiAKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IEplZmZyZXkgQS4gVXBob2ZmCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoLCAxOTk2LgorICogTW9kaWZpZWQgYnkgSC5KLiBMdSwgMTk5OC4KKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAic3RhdGQuaCIKKyNpbmNsdWRlICJub3RsaXN0LmgiCisKKy8qCisgKiBFcnJvci1jaGVja2luZyBtYWxsb2MoKSB3cmFwcGVyLgorICovCit2b2lkICoKK3htYWxsb2MgKHNpemVfdCBzaXplKQoreworICB2b2lkICpwdHI7CisKKyAgaWYgKHNpemUgPT0gMCkKKyAgICByZXR1cm4gKCh2b2lkICopTlVMTCk7CisKKyAgaWYgKCEocHRyID0gbWFsbG9jIChzaXplKSkpCisgICAgeGxvZ19lcnIgKCJtYWxsb2MgZmFpbGVkIik7CisKKyAgcmV0dXJuIChwdHIpOworfQorCisKKy8qIAorICogRXJyb3ItY2hlY2tpbmcgc3RyZHVwKCkgd3JhcHBlci4KKyAqLworY2hhciAqCit4c3RyZHVwIChjb25zdCBjaGFyICpzdHJpbmcpCit7CisgIGNoYXIgKnJlc3VsdDsKKworICAvKiBXaWxsIG9ubHkgZmFpbCBpZiB1bmRlcmx5aW5nIG1hbGxvYygpIGZhaWxzIChFTk9NRU0pLiAqLworICBpZiAoIShyZXN1bHQgPSBzdHJkdXAgKHN0cmluZykpKQorICAgIHhsb2dfZXJyICgic3RyZHVwIGZhaWxlZCIpOworCisgIHJldHVybiAocmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9tb25pdG9yLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWRmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbW9uaXRvci5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTkgSmVmZnJleSBBLiBVcGhvZmYKKyAqIE1ham9yIHJld3JpdGUgYnkgT2xhZiBLaXJjaCwgRGVjLiAxOTk2LgorICogTW9kaWZpZWQgYnkgSC5KLiBMdSwgMTk5OC4KKyAqIFRpZ2h0ZXIgYWNjZXNzIGNvbnRyb2wsIE9sYWYgS2lyY2ggSnVuZSAxOTk5LgorICoKKyAqIE5TTSBmb3IgTGludXguCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2luY2x1ZGUgInNvY2thZGRyLmgiCisjaW5jbHVkZSAicnBjbWlzYy5oIgorI2luY2x1ZGUgIm5zbS5oIgorI2luY2x1ZGUgInN0YXRkLmgiCisjaW5jbHVkZSAibm90bGlzdC5oIgorI2luY2x1ZGUgImhhLWNhbGxvdXQuaCIKKworbm90aWZ5X2xpc3QgKgkJcnRubCA9IE5VTEw7CS8qIFJ1bi10aW1lIG5vdGlmeSBsaXN0LiAqLworCisvKgorICogUmVqZWN0IHJlcXVlc3RzIGZyb20gbm9uLWxvb3BiYWNrIGFkZHJlc3NlcyBpbiBvcmRlcgorICogdG8gcHJldmVudCBhdHRhY2sgZGVzY3JpYmVkIGluIENFUlQgQ0EtOTkuMDUuCisgKgorICogQWx0aG91Z2ggdGhlIGtlcm5lbCBjb250YWN0cyB0aGUgc3RhdGQgc2VydmljZSB2aWEgb25seSBJUHY0CisgKiB0cmFuc3BvcnRzLCB0aGUgc3RhdGQgc2VydmljZSBjYW4gcmVjZWl2ZSBvdGhlciByZXF1ZXN0cywgc3VjaAorICogYXMgU01fTk9USUZZLCBmcm9tIHJlbW90ZSBwZWVycyB2aWEgSVB2Ni4KKyAqLworc3RhdGljIF9Cb29sCitjYWxsZXJfaXNfbG9jYWxob3N0KHN0cnVjdCBzdmNfcmVxICpycXN0cCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhcCA9IG5mc19nZXRycGNjYWxsZXIocnFzdHAtPnJxX3hwcnQpOworCWNoYXIgYnVmW0lORVQ2X0FERFJTVFJMRU5dOworCisJaWYgKCFuZnNfaXNfdjRfbG9vcGJhY2soc2FwKSkKKwkJZ290byBvdXRfbm9ubG9jYWw7CisJcmV0dXJuIHRydWU7CisKK291dF9ub25sb2NhbDoKKwlpZiAoIXN0YXRkX3ByZXNlbnRfYWRkcmVzcyhzYXAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQlidWZbMF0gPSAnXDAnOworCXhsb2dfd2FybigiU01fTU9OL1NNX1VOTU9OIGNhbGwgZnJvbSBub24tbG9jYWwgaG9zdCAlcyIsIGJ1Zik7CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogU2VydmljZXMgU01fTU9OIHJlcXVlc3RzLgorICovCitzdHJ1Y3Qgc21fc3RhdF9yZXMgKgorc21fbW9uXzFfc3ZjKHN0cnVjdCBtb24gKmFyZ3AsIHN0cnVjdCBzdmNfcmVxICpycXN0cCkKK3sKKwlzdGF0aWMgc21fc3RhdF9yZXMgcmVzdWx0OworCWNoYXIJCSptb25fbmFtZSA9IGFyZ3AtPm1vbl9pZC5tb25fbmFtZSwKKwkJCSpteV9uYW1lICA9IGFyZ3AtPm1vbl9pZC5teV9pZC5teV9uYW1lOworCXN0cnVjdCBteV9pZAkqaWQgPSAmYXJncC0+bW9uX2lkLm15X2lkOworCWNoYXIJCSpjcDsKKwlub3RpZnlfbGlzdAkqY2xudDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gbXlfYWRkciA9IHsKKwkJLnNpbl9mYW1pbHkJCT0gQUZfSU5FVCwKKwkJLnNpbl9hZGRyLnNfYWRkcgk9IGh0b25sKElOQUREUl9MT09QQkFDSyksCisJfTsKKwljaGFyICpkbnNuYW1lID0gTlVMTDsKKworCXhsb2coRF9DQUxMLCAiUmVjZWl2ZWQgU01fTU9OIGZvciAlcyBmcm9tICVzIiwgbW9uX25hbWUsIG15X25hbWUpOworCisJLyogQXNzdW1lIHRoYXQgd2UnbGwgZmFpbC4gKi8KKwlyZXN1bHQucmVzX3N0YXQgPSBTVEFUX0ZBSUw7CisJcmVzdWx0LnN0YXRlID0gLTE7CS8qIFN0YXRlIGlzIHVuZGVmaW5lZCBmb3IgU1RBVF9GQUlMLiAqLworCisJLyogMS4JUmVqZWN0IGFueSByZW1vdGUgY2FsbGVycy4KKwkgKglJZ25vcmUgdGhlIG15X25hbWUgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIsIGFuZAorCSAqCXVzZSAiMTI3LjAuMC4xIiBpbnN0ZWFkLgorCSAqLworCWlmICghY2FsbGVyX2lzX2xvY2FsaG9zdChycXN0cCkpCisJCWdvdG8gZmFpbHVyZTsKKworCS8qIDIuCVJlamVjdCBhbnkgcmVnaXN0cmF0aW9ucyBmb3Igbm9uLWxvY2tkIHNlcnZpY2VzLgorCSAqCisJICoJVGhpcyBpcyBzcGVjaWZpYyB0byB0aGUgbGludXgga2VybmVsIGxvY2tkLCB3aGljaAorCSAqCW1ha2VzIHRoZSBjYWxsYmFjayBwcm9jZWR1cmUgcGFydCBvZiB0aGUgbG9ja2QgaW50ZXJmYWNlLgorCSAqCUl0IGlzIGFsc28gcHJvbmUgdG8gYnJlYWsgd2hlbiBsb2NrZCBjaGFuZ2VzIGl0cyBjYWxsYmFjaworCSAqCXByb2NlZHVyZSBudW1iZXIgLS0gd2hpY2gsIGluIGZhY3QsIGhhcyBub3cgaGFwcGVuZWQgb25jZS4KKwkgKglUaGVyZSBtdXN0IGJlIGEgYmV0dGVyIHdheS4uLi4gICBYWFggRklYTUUKKwkgKi8KKwlpZiAoaWQtPm15X3Byb2cgIT0gMTAwMDIxIHx8CisJICAgIChpZC0+bXlfcHJvYyAhPSAxNiAmJiBpZC0+bXlfcHJvYyAhPSAyNCkpCisJeworCQl4bG9nX3dhcm4oIkF0dGVtcHQgdG8gcmVnaXN0ZXIgY2FsbGJhY2sgdG8gJWQvJWQiLAorCQkJaWQtPm15X3Byb2csIGlkLT5teV9wcm9jKTsKKwkJZ290byBmYWlsdXJlOworCX0KKworCS8qCisJICogQ2hlY2sgaG9zdG5hbWVzLiAgSWYgSSBjYW4ndCBsb29rIHRoZW0gdXAsIEkgd29uJ3QgbW9uaXRvci4gIFRoaXMKKwkgKiBtaWdodCBub3QgYmUgbGVnYWwsIGJ1dCBpdCBhZGRzIGEgbGl0dGxlIGJpdCBvZiBzYWZldHkgYW5kIHNhbml0eS4KKwkgKi8KKworCS8qIG11c3QgY2hlY2sgZm9yIC8ncyBpbiBob3N0bmFtZSEgIFNlZSBDRVJUJ3MgQ0EtOTYuMDkgZm9yIGRldGFpbHMuICovCisJaWYgKHN0cmNocihtb25fbmFtZSwgJy8nKSB8fCBtb25fbmFtZVswXSA9PSAnLicpIHsKKwkJeGxvZyhMX0VSUk9SLCAiU01fTU9OIHJlcXVlc3QgZm9yIGhvc3RuYW1lIGNvbnRhaW5pbmcgJy8nICIKKwkJICAgICAib3Igc3RhcnRpbmcgJy4nOiAlcyIsIG1vbl9uYW1lKTsKKwkJeGxvZyhMX0VSUk9SLCAiUE9TU0lCTEUgU1BPT0YvQVRUQUNLIEFUVEVNUFQhIik7CisJCWdvdG8gZmFpbHVyZTsKKwl9CisKKwkvKiBteV9uYW1lIG11c3Qgbm90IGhhdmUgd2hpdGUgc3BhY2UgKi8KKwlmb3IgKGNwPW15X25hbWUgOyAqY3AgOyBjcCsrKQorCQlpZiAoKmNwID09ICcgJyB8fCAqY3AgPT0gJ1x0JyB8fCAqY3AgPT0gJ1xyJyB8fCAqY3AgPT0gJ1xuJykKKwkJCSpjcCA9ICdfJzsKKworCS8qCisJICogSG9zdG5hbWVzIGNoZWNrZWQgT0suCisJICogTm93IGNob29zZSBhIGhvc3RuYW1lIHRvIHVzZSBmb3IgbWF0Y2hpbmcuICBXZSBjYW5ub3QKKwkgKiByZWFsbHkgdHJ1c3QgbXVjaCBpbiB0aGUgaW5jb21pbmcgTk9USUZZLCBzbyB0byBtYWtlCisJICogc3VyZSB0aGF0IG11bHRpLWhvbWVkIGhvc3RzIHdvcmsgbmljZWx5LCB3ZSBnZXQgYW4KKwkgKiBGUUROIG5vdywgYW5kIHVzZSB0aGF0IGZvciBtYXRjaGluZy4KKwkgKi8KKwlkbnNuYW1lID0gc3RhdGRfY2Fub25pY2FsX25hbWUobW9uX25hbWUpOworCWlmIChkbnNuYW1lID09IE5VTEwpIHsKKwkJeGxvZyhMX1dBUk5JTkcsICJObyBjYW5vbmljYWwgaG9zdG5hbWUgZm91bmQgZm9yICVzIiwgbW9uX25hbWUpOworCQlnb3RvIGZhaWx1cmU7CisJfQorCisJLyogTm93IGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgZHVwbGljYXRlLCBhbmQgd2FybiBpZiBzby4KKwkgKiBJIHdpbGwgYWxzbyByZXR1cm4gU1RBVF9GQUlMLiAoSSAqdGhpbmsqIHRoaXMgaXMgaG93IEkgc2hvdWxkCisJICogaGFuZGxlIGl0LikKKwkgKgorCSAqIE9sYWYgcmVxdWVzdHMgdGhhdCBJIGFsbG93IGR1cGxpY2F0ZSBTTV9NT04gcmVxdWVzdHMgZm9yCisJICogaG9zdHMgZHVlIHRvIHRoZSB3YXkgaGUgaXMgY29kaW5nIGxvY2tkLiBObyBwcm9ibGVtLAorCSAqIEknbGwganVzdCBkbyBhIHF1aWNraWUgc3VjY2VzcyByZXR1cm4gYW5kIHRoaW5ncyBzaG91bGQKKwkgKiBiZSBoYXBweS4KKwkgKi8KKwljbG50ID0gcnRubDsKKworCXdoaWxlICgoY2xudCA9IG5saXN0X2dldGhvc3QoY2xudCwgbW9uX25hbWUsIDApKSkgeworCQlpZiAoc3RhdGRfbWF0Y2hob3N0bmFtZShOTF9NWV9OQU1FKGNsbnQpLCBteV9uYW1lKSAmJgorCQkgICAgTkxfTVlfUFJPQyhjbG50KSA9PSBpZC0+bXlfcHJvYyAmJgorCQkgICAgTkxfTVlfUFJPRyhjbG50KSA9PSBpZC0+bXlfcHJvZyAmJgorCQkgICAgTkxfTVlfVkVSUyhjbG50KSA9PSBpZC0+bXlfdmVycyAmJgorCQkgICAgbWVtY21wKE5MX1BSSVYoY2xudCksIGFyZ3AtPnByaXYsIFNNX1BSSVZfU0laRSkgPT0gMCkgeworCQkJLyogSGV5ISAgV2UgYWxyZWFkeSBrbm93IHlvdSBndXlzISAqLworCQkJeGxvZyhEX0dFTkVSQUwsCisJCQkJIkR1cGxpY2F0ZSBTTV9NT04gcmVxdWVzdCBmb3IgJXMgIgorCQkJCSJmcm9tIHByb2NlZHVyZSBvbiAlcyIsCisJCQkJbW9uX25hbWUsIG15X25hbWUpOworCisJCQkvKiBCdXQgd2UnbGwgbGV0IHlvdSBwYXNzIGFueXdheS4gKi8KKwkJCWZyZWUoZG5zbmFtZSk7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKwkJY2xudCA9IE5MX05FWFQoY2xudCk7CisJfQorCisJLyoKKwkgKiBXZSdyZSBjb21taXR0ZWQuLi5pZ25vcmluZyBlcnJvcnMuICBMZXQncyBob3BlIHRoYXQgYSBtYWxsb2MoKQorCSAqIGRvZXNuJ3QgZmFpbC4gIChJIHNob3VsZCBwcm9iYWJseSBmaXggdGhpcyBhc3N1bXB0aW9uLikKKwkgKi8KKwlpZiAoIShjbG50ID0gbmxpc3RfbmV3KG15X25hbWUsIG1vbl9uYW1lLCAwKSkpIHsKKwkJZnJlZShkbnNuYW1lKTsKKwkJeGxvZ193YXJuKCJvdXQgb2YgbWVtb3J5Iik7CisJCWdvdG8gZmFpbHVyZTsKKwl9CisKKwlOTF9NWV9QUk9HKGNsbnQpID0gaWQtPm15X3Byb2c7CisJTkxfTVlfVkVSUyhjbG50KSA9IGlkLT5teV92ZXJzOworCU5MX01ZX1BST0MoY2xudCkgPSBpZC0+bXlfcHJvYzsKKwltZW1jcHkoTkxfUFJJVihjbG50KSwgYXJncC0+cHJpdiwgU01fUFJJVl9TSVpFKTsKKwljbG50LT5kbnNfbmFtZSA9IGRuc25hbWU7CisKKwkvKgorCSAqIE5vdywgQ3JlYXRlIGZpbGUgb24gc3RhYmxlIHN0b3JhZ2UgZm9yIGhvc3QuCisJICovCisJaWYgKCFuc21faW5zZXJ0X21vbml0b3JlZF9ob3N0KGRuc25hbWUsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKShjaGFyICopJm15X2FkZHIsIGFyZ3ApKSB7CisJCW5saXN0X2ZyZWUoTlVMTCwgY2xudCk7CisJCWdvdG8gZmFpbHVyZTsKKwl9CisKKwkvKiBQUkM6IGRvIHRoZSBIQSBjYWxsb3V0OiAqLworCWhhX2NhbGxvdXQoImFkZC1jbGllbnQiLCBtb25fbmFtZSwgbXlfbmFtZSwgLTEpOworCW5saXN0X2luc2VydCgmcnRubCwgY2xudCk7CisJeGxvZyhEX0dFTkVSQUwsICJNT05JVE9SSU5HICVzIGZvciAlcyIsIG1vbl9uYW1lLCBteV9uYW1lKTsKKyBzdWNjZXNzOgorCXJlc3VsdC5yZXNfc3RhdCA9IFNUQVRfU1VDQzsKKwkvKiBTVU4ncyBzbV9pbnRlci54IHNheXMgdGhpcyBzaG91bGQgYmUgInN0YXRlIG51bWJlciBvZiBsb2NhbCBzaXRlIi4KKwkgKiBYL09wZW4gc2F5cyAnInN0YXRlIiB3aWxsIGJlIGNvbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSByZW1vdGUgTlNNLicKKwkgKiBocmVmPWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2Mjk3OTkvU01fTU9OLmh0bQorCSAqIExpbnV4IGxvY2tkIGN1cnJlbnRseSAoMi42LjIxIGFuZCBwcmlvcikgaWdub3JlcyB3aGF0ZXZlciBpcworCSAqIHJldHVybmVkLCBhbmQgZ2l2ZW4gdGhlIGFib3ZlIGNvbnRyYWN0aW9uLCBpdCBwcm9iYWJseSBhbHdheXMgd2lsbC4uCisJICogU28gd2UganVzdCByZXR1cm4gd2hhdCB3ZSBhbHdheXMgcmV0dXJuZWQuICBJZiBwb3NzaWJsZSwgd2UKKwkgKiBoYXZlIGFscmVhZHkgdG9sZCBsb2NrZCBhYm91dCBvdXIgc3RhdGUgbnVtYmVyIHZpYSBhIHN5c2N0bC4KKwkgKiBJZiBsb2NrZCB3YW50cyB0aGUgcmVtb3RlIHN0YXRlLCBpdCB3aWxsIG5lZWQgdG8KKwkgKiB1c2UgU01fU1RBVCAoYW5kIHByYXllcikuCisJICovCisJcmVzdWx0LnN0YXRlID0gTVlfU1RBVEU7CisJcmV0dXJuICgmcmVzdWx0KTsKKworZmFpbHVyZToKKwl4bG9nX3dhcm4oIlNUQVRfRkFJTCB0byAlcyBmb3IgU01fTU9OIG9mICVzIiwgbXlfbmFtZSwgbW9uX25hbWUpOworCXJldHVybiAoJnJlc3VsdCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2xvYWRfb25lX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsCisJCV9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKKwkJY29uc3Qgc3RydWN0IG1vbiAqbSwKKwkJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIGNvbnN0IHRpbWVfdCB0aW1lc3RhbXApCit7CisJbm90aWZ5X2xpc3QgKmNsbnQ7CisKKwljbG50ID0gbmxpc3RfbmV3KG0tPm1vbl9pZC5teV9pZC5teV9uYW1lLAorCQkJCW0tPm1vbl9pZC5tb25fbmFtZSwgMCk7CisJaWYgKGNsbnQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwljbG50LT5kbnNfbmFtZSA9IHN0cmR1cChob3N0bmFtZSk7CisJaWYgKGNsbnQtPmRuc19uYW1lID09IE5VTEwpIHsKKwkJbmxpc3RfZnJlZShOVUxMLCBjbG50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJeGxvZyhEX0dFTkVSQUwsICJBZGRpbmcgcmVjb3JkIGZvciAlcyB0byB0aGUgbW9uaXRvciBsaXN0Li4uIiwKKwkJCWhvc3RuYW1lKTsKKworCU5MX01ZX1BST0coY2xudCkgPSBtLT5tb25faWQubXlfaWQubXlfcHJvZzsKKwlOTF9NWV9WRVJTKGNsbnQpID0gbS0+bW9uX2lkLm15X2lkLm15X3ZlcnM7CisJTkxfTVlfUFJPQyhjbG50KSA9IG0tPm1vbl9pZC5teV9pZC5teV9wcm9jOworCW1lbWNweShOTF9QUklWKGNsbnQpLCBtLT5wcml2LCBTTV9QUklWX1NJWkUpOworCisJbmxpc3RfaW5zZXJ0KCZydG5sLCBjbG50KTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBsb2FkX3N0YXRlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNvdW50OworCisJY291bnQgPSBuc21fbG9hZF9tb25pdG9yX2xpc3QobG9hZF9vbmVfaG9zdCk7CisJaWYgKGNvdW50KQorCQl4bG9nKERfR0VORVJBTCwgIkxvYWRlZCAldSBwcmV2aW91c2x5IG1vbml0b3JlZCBob3N0cyIpOworfQorCisvKgorICogU2VydmljZXMgU01fVU5NT04gcmVxdWVzdHMuCisgKgorICogVGhlcmUgaXMgbm8gc3RhdGVtZW50IGluIHRoZSBYL09wZW4gc3BlYydzIGFib3V0IHJldHVybmluZyBhbiBlcnJvcgorICogZm9yIHJlcXVlc3RzIHRvIHVubW9uaXRvciBhIGhvc3QgdGhhdCB3ZSdyZSAqbm90KiBtb25pdG9yaW5nLiAgSSBqdXN0CisgKiByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBOU00gd2hlbiBJIGdldCBzdWNoIGZvb2xpc2ggcmVxdWVzdHMgZm9yIGxhY2sKKyAqIG9mIGFueSBiZXR0ZXIgaWRlYXMuICAoSSBhbHNvIGxvZyB0aGUgIm9mZmVuc2UuIikKKyAqLworc3RydWN0IHNtX3N0YXQgKgorc21fdW5tb25fMV9zdmMoc3RydWN0IG1vbl9pZCAqYXJncCwgc3RydWN0IHN2Y19yZXEgKnJxc3RwKQoreworCXN0YXRpYyBzbV9zdGF0ICByZXN1bHQ7CisJbm90aWZ5X2xpc3QJKmNsbnQ7CisJY2hhcgkJKm1vbl9uYW1lID0gYXJncC0+bW9uX25hbWUsCisJCQkqbXlfbmFtZSAgPSBhcmdwLT5teV9pZC5teV9uYW1lOworCXN0cnVjdCBteV9pZAkqaWQgPSAmYXJncC0+bXlfaWQ7CisJY2hhcgkJKmNwOworCisJeGxvZyhEX0NBTEwsICJSZWNlaXZlZCBTTV9VTk1PTiBmb3IgJXMgZnJvbSAlcyIsIG1vbl9uYW1lLCBteV9uYW1lKTsKKworCXJlc3VsdC5zdGF0ZSA9IE1ZX1NUQVRFOworCisJaWYgKCFjYWxsZXJfaXNfbG9jYWxob3N0KHJxc3RwKSkKKwkJZ290byBmYWlsdXJlOworCisJLyogbXlfbmFtZSBtdXN0IG5vdCBoYXZlIHdoaXRlIHNwYWNlICovCisJZm9yIChjcD1teV9uYW1lIDsgKmNwIDsgY3ArKykKKwkJaWYgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicpCisJCQkqY3AgPSAnXyc7CisKKworCS8qIENoZWNrIGlmIHdlJ3JlIG1vbml0b3JpbmcgYW55b25lLiAqLworCWlmIChydG5sID09IE5VTEwpIHsKKwkJeGxvZ193YXJuKCJSZWNlaXZlZCBTTV9VTk1PTiByZXF1ZXN0IGZyb20gJXMgZm9yICVzIHdoaWxlIG5vdCAiCisJCQkibW9uaXRvcmluZyBhbnkgaG9zdHMiLCBteV9uYW1lLCBhcmdwLT5tb25fbmFtZSk7CisJCXJldHVybiAoJnJlc3VsdCk7CisJfQorCWNsbnQgPSBydG5sOworCisJLyoKKwkgKiBPSywgd2UgYXJlLiAgTm93IGxvb2sgZm9yIGFwcHJvcHJpYXRlIGVudHJ5IGluIHJ1bi10aW1lIGxpc3QuCisJICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgKm9uZSogbWF0Y2ggb24gdGhpcywgc2luY2UgSSBibG9jayAiZHVwbGljYXRlIgorCSAqIFNNX01PTiBjYWxscy4gIChBY3R1YWxseSwgZHVwbGljYXRlIGNhbGxzIGFyZSBhbGxvd2VkLCBidXQgb25seSBvbmUKKwkgKiBlbnRyeSB3aW5kcyB1cCBpbiB0aGUgbGlzdCB0aGUgd2F5IEknbSBjdXJyZW50bHkgaGFuZGxpbmcgdGhlbS4pCisJICovCisJd2hpbGUgKChjbG50ID0gbmxpc3RfZ2V0aG9zdChjbG50LCBtb25fbmFtZSwgMCkpKSB7CisJCWlmIChzdGF0ZF9tYXRjaGhvc3RuYW1lKE5MX01ZX05BTUUoY2xudCksIG15X25hbWUpICYmCisJCQlOTF9NWV9QUk9DKGNsbnQpID09IGlkLT5teV9wcm9jICYmCisJCQlOTF9NWV9QUk9HKGNsbnQpID09IGlkLT5teV9wcm9nICYmCisJCQlOTF9NWV9WRVJTKGNsbnQpID09IGlkLT5teV92ZXJzKSB7CisJCQkvKiBNYXRjaCEgKi8KKwkJCXhsb2coRF9HRU5FUkFMLCAiVU5NT05JVE9SSU5HICVzIGZvciAlcyIsCisJCQkJCW1vbl9uYW1lLCBteV9uYW1lKTsKKworCQkJLyogUFJDOiBkbyB0aGUgSEEgY2FsbG91dDogKi8KKwkJCWhhX2NhbGxvdXQoImRlbC1jbGllbnQiLCBtb25fbmFtZSwgbXlfbmFtZSwgLTEpOworCisJCQluc21fZGVsZXRlX21vbml0b3JlZF9ob3N0KGNsbnQtPmRuc19uYW1lLAorCQkJCQkJCW1vbl9uYW1lLCBteV9uYW1lKTsKKwkJCW5saXN0X2ZyZWUoJnJ0bmwsIGNsbnQpOworCisJCQlyZXR1cm4gKCZyZXN1bHQpOworCQl9IGVsc2UKKwkJCWNsbnQgPSBOTF9ORVhUKGNsbnQpOworCX0KKworIGZhaWx1cmU6CisJeGxvZ193YXJuKCJSZWNlaXZlZCBlcnJvbmVvdXMgU01fVU5NT04gcmVxdWVzdCBmcm9tICVzIGZvciAlcyIsCisJCW15X25hbWUsIG1vbl9uYW1lKTsKKwlyZXR1cm4gKCZyZXN1bHQpOworfQorCisKK3N0cnVjdCBzbV9zdGF0ICoKK3NtX3VubW9uX2FsbF8xX3N2YyhzdHJ1Y3QgbXlfaWQgKmFyZ3AsIHN0cnVjdCBzdmNfcmVxICpycXN0cCkKK3sKKwlzaG9ydCBpbnQgICAgICAgY291bnQgPSAwOworCXN0YXRpYyBzbV9zdGF0ICByZXN1bHQ7CisJbm90aWZ5X2xpc3QJKmNsbnQ7CisJY2hhcgkJKm15X25hbWUgPSBhcmdwLT5teV9uYW1lOworCisJeGxvZyhEX0NBTEwsICJSZWNlaXZlZCBTTV9VTk1PTl9BTEwgZm9yICVzIiwgbXlfbmFtZSk7CisKKwlpZiAoIWNhbGxlcl9pc19sb2NhbGhvc3QocnFzdHApKQorCQlnb3RvIGZhaWx1cmU7CisKKwlyZXN1bHQuc3RhdGUgPSBNWV9TVEFURTsKKworCWlmIChydG5sID09IE5VTEwpIHsKKwkJeGxvZ193YXJuKCJSZWNlaXZlZCBTTV9VTk1PTl9BTEwgcmVxdWVzdCBmcm9tICVzICIKKwkJCSJ3aGlsZSBub3QgbW9uaXRvcmluZyBhbnkgaG9zdHMiLCBteV9uYW1lKTsKKwkJcmV0dXJuICgmcmVzdWx0KTsKKwl9CisJY2xudCA9IHJ0bmw7CisKKwl3aGlsZSAoKGNsbnQgPSBubGlzdF9nZXRob3N0KGNsbnQsIG15X25hbWUsIDEpKSkgeworCQlpZiAoTkxfTVlfUFJPQyhjbG50KSA9PSBhcmdwLT5teV9wcm9jICYmCisJCQlOTF9NWV9QUk9HKGNsbnQpID09IGFyZ3AtPm15X3Byb2cgJiYKKwkJCU5MX01ZX1ZFUlMoY2xudCkgPT0gYXJncC0+bXlfdmVycykgeworCQkJLyogV2F0Y2ggc3RhY2shICovCisJCQljaGFyICAgICAgICAgICAgbW9uX25hbWVbU01fTUFYU1RSTEVOICsgMV07CisJCQlub3RpZnlfbGlzdAkqdGVtcDsKKworCQkJeGxvZyhEX0dFTkVSQUwsCisJCQkJIlVOTU9OSVRPUklORyAoU01fVU5NT05fQUxMKSAlcyBmb3IgJXMiLAorCQkJCU5MX01PTl9OQU1FKGNsbnQpLCBOTF9NWV9OQU1FKGNsbnQpKTsKKwkJCXN0cm5jcHkobW9uX25hbWUsIE5MX01PTl9OQU1FKGNsbnQpLAorCQkJCXNpemVvZiAobW9uX25hbWUpIC0gMSk7CisJCQltb25fbmFtZVtzaXplb2YgKG1vbl9uYW1lKSAtIDFdID0gJ1wwJzsKKwkJCXRlbXAgPSBOTF9ORVhUKGNsbnQpOworCQkJLyogUFJDOiBkbyB0aGUgSEEgY2FsbG91dDogKi8KKwkJCWhhX2NhbGxvdXQoImRlbC1jbGllbnQiLCBtb25fbmFtZSwgbXlfbmFtZSwgLTEpOworCQkJbnNtX2RlbGV0ZV9tb25pdG9yZWRfaG9zdChjbG50LT5kbnNfbmFtZSwKKwkJCQkJCQltb25fbmFtZSwgbXlfbmFtZSk7CisJCQlubGlzdF9mcmVlKCZydG5sLCBjbG50KTsKKwkJCSsrY291bnQ7CisJCQljbG50ID0gdGVtcDsKKwkJfSBlbHNlCisJCQljbG50ID0gTkxfTkVYVChjbG50KTsKKwl9CisKKwlpZiAoIWNvdW50KSB7CisJCXhsb2coRF9HRU5FUkFMLCAiU01fVU5NT05fQUxMIHJlcXVlc3QgZnJvbSAlcyB3aXRoIG5vICIKKwkJCSJTTV9NT04gcmVxdWVzdHMgZnJvbSBpdCIsIG15X25hbWUpOworCX0KKworIGZhaWx1cmU6CisJcmV0dXJuICgmcmVzdWx0KTsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9ub3RsaXN0LmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbm90bGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNDFjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbm90bGlzdC5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTkgSmVmZnJleSBBLiBVcGhvZmYKKyAqIE1vZGlmaWVkIGJ5IE9sYWYgS2lyY2gsIDE5OTYuCisgKiBNb2RpZmllZCBieSBILkouIEx1LCAxOTk4LgorICogTW9kaWZpZWQgYnkgTG9uIEhvaGJlcmdlciwgT2N0LiAyMDAwLgorICogICAtIEZpeGVkIG1lbW9yeSBsZWFrcywgcnVuLW9mZi1lbmQgcHJvYmxlbXMsIGV0Yy4KKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKy8qCisgKiBTaW1wbGUgbGlzdCBtYW5hZ2VtZW50IGZvciBub3RpZnkgbGlzdAorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInN0YXRkLmgiCisjaW5jbHVkZSAibm90bGlzdC5oIgorCisKKyNpZmRlZiBERUJVRworLyogCisgKiBMSCAtIFRoZSBsaW5rZWQgbGlzdCBjb2RlIGhhZCBzb21lIGJ1Z3MuICBVc2VkIHRoaXMgdG8gaGVscCBkZWJ1ZworICogbmV3IGNvZGUuIAorICovCitzdGF0aWMgdm9pZCAKK3BsaXN0KG5vdGlmeV9saXN0ICpoZWFkLCBpbnQgZW4pCit7CisJLyogY2FzZSB3aGVyZSB3ZSByYW4gb2ZmIHRoZSBlbmQgKi8KKwlpZiAoIWhlYWQpIHJldHVybjsKKworCXByaW50ZigiRW50cnkgJWQ6ICVzXG4iLGVuLCBOTF9NT05fTkFNRShoZWFkKSk7CisJcGxpc3QoaGVhZC0+bmV4dCwgKytlbik7Cit9CisKK3N0YXRpYyB2b2lkIAorbmxpc3RfcHJpbnQobm90aWZ5X2xpc3QgKipoZWFkKQoreworCXByaW50ZigiLS0tIEJlZ2luIG5vdGlmeSBsaXN0IGR1bXAgLS0tXG4iKTsKKwlwbGlzdCgqaGVhZCwxKTsKKwlwcmludGYoIi0tLSBFbmQgbm90aWZ5IGxpc3QgZHVtcCAtLS1cbiIpOworfQorI2VuZGlmIC8qIERFQlVHICovCisKKy8qIAorICogQWxsb2NhdGUgbWVtb3J5IGFuZCBzZXQgdXAgYSBuZXcgbm90aWZ5IGxpc3QgZW50cnkuCisgKi8KK25vdGlmeV9saXN0ICogCitubGlzdF9uZXcoY2hhciAqbXlfbmFtZSwgY2hhciAqbW9uX25hbWUsIGludCBzdGF0ZSkKK3sKKwlub3RpZnlfbGlzdAkqbmV3OworCisJbmV3ID0gKG5vdGlmeV9saXN0ICopIHhtYWxsb2Moc2l6ZW9mKG5vdGlmeV9saXN0KSk7CisJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKCpuZXcpKTsKKworCU5MX1RJTUVTKG5ldykgPSBNQVhfVFJJRVM7CisJTkxfU1RBVEUobmV3KSA9IHN0YXRlOworCU5MX01ZX05BTUUobmV3KSA9IHhzdHJkdXAobXlfbmFtZSk7CisJTkxfTU9OX05BTUUobmV3KSA9IHhzdHJkdXAobW9uX25hbWUpOworCisJcmV0dXJuIG5ldzsKK30KKworLyoKKyAqIEluc2VydCAqZW50cnkgaW50byBhIG5vdGlmeSBsaXN0IGF0IHRoZSBwb2ludCBzcGVjaWZpZWQgYnkKKyAqICoqaGVhZC4gIFRoaXMgY2FuIGJlIGluIHRoZSBtaWRkbGUuICBIb3dldmVyLCB3ZSBkbyBub3QgaGFuZGxlCisgKiBsaXN0IF9hcHBlbmRfIGluIHRoaXMgZnVuY3Rpb247IHJhdGhlciwgdGhlIG9ubHkgcGxhY2Ugd2Ugc2hvdWxkCisgKiBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgY2FzZSBpcyBpbiBubGlzdF9pbnNlcnRfdGltZXIgYmVsb3cuCisgKiAtIGVudHJ5IG11c3Qgbm90IGJlIE5VTEwuCisgKi8KK3ZvaWQgCitubGlzdF9pbnNlcnQobm90aWZ5X2xpc3QgKipoZWFkLCBub3RpZnlfbGlzdCAqZW50cnkpCit7CisJaWYgKCpoZWFkKSB7CisJCS8qIAorCQkgKiBDYXNlcyB3aGVyZSB3ZSdyZSBwcmVwZW5kaW5nIGEgbm9uLWVtcHR5IGxpc3QKKwkJICogb3IgaW5zZXJ0aW5nIHBvc3NpYmx5IGluIHRoZSBtaWRkbGUgc29tZXdoZXJlIChlZywKKwkJICogbmxpc3RfaW5zZXJ0X3RpbWVyLi4uKQorCQkgKi8KKwkJZW50cnktPm5leHQgPSAoKmhlYWQpOwkJLyogRm9yd2FyZCBwb2ludGVyICovCisJCWVudHJ5LT5wcmV2ID0gKCpoZWFkKS0+cHJldjsJLyogQmFjayBwb2ludGVyICovCisJCSgqaGVhZCktPnByZXYgPSBlbnRyeTsJCS8qIGhlYWQncyBuZXcgYmFjayBwb2ludGVyICovCisJfQorCisJLyogQ29tbW9uIHRvIGFsbCBjYXNlcywgaW5jbHVkaW5nIG5ldyBsaXN0IGNyZWF0aW9uICovCisJKmhlYWQgPSBlbnRyeTsJCQkvKiBOZXcgaGVhZCAqLworCisjaWZkZWYgREVCVUcKKwlubGlzdF9wcmludChoZWFkKTsKKyNlbmRpZgorfQorCisvKiAKKyAqIChyZSlpbnNlcnQgKmVudHJ5IGludG8gbm90aWZ5X2xpc3QgKipoZWFkLiAgVGhpcyByZXF1aXJlcyB0aGF0CisgKiBOTF9XSEVOKGVudHJ5KSBoYXMgYmVlbiBzZXQgKHVzdWFsbHksIHRoaXMgaXMgdGltZSgpICsgNSBzZWNvbmRzKS4KKyAqIC0gZW50cnkgbXVzdCBub3QgYmUgTlVMTAorICoKKyAqIExIIC0gVGhpcyB1c2VkIHRvIGNhdXNlIChhKSBhIG1lbW9yeSBsZWFrIGFuZCAoYikgZHJvcHBlZCBub3RpZnktbGlzdAorICogZW50cmllcy4gIFRoZSBwb2ludGVyIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgbGlzdCwgYW5kIGNoYW5nZWQgdGhlIAorICogaGVhZC1lbmQgdG8gcG9pbnQgdG8gdGhlIG5ldywgb25lLWVudHJ5IGxpc3QuICBBbGwgb3RoZXIgZW50cmllcyBiZWNhbWUgZ2FyYmFnZS4KKyAqCisgKiBGSVhNRTogT3B0aW1pemUgdGhpcyBmdW5jdGlvbi4gKEknbGwgd29yayBvbiBpdCAtIExIKQorICovCit2b2lkIAorbmxpc3RfaW5zZXJ0X3RpbWVyKG5vdGlmeV9saXN0ICoqaGVhZCwgbm90aWZ5X2xpc3QgKmVudHJ5KQoreworCW5vdGlmeV9saXN0IAkqc3BvdCA9ICpoZWFkLAkgCS8qIEluc2VydGlvbiBsb2NhdGlvbiAqLworCQkJCQkJLyogLi4uU3RhcnQgYXQgaGVhZCAqLworCQkJKmJhY2sgPSBOVUxMOwkJLyogQmFjayBwb2ludGVyICovCisKKworCS8qIEZpbmQgZmlyc3QgZW50cnkgd2l0aCBoaWdoZXIgdGltZW91dCB2YWx1ZSBvciBlbmQgb2YgbGlzdCAqLworCXdoaWxlIChzcG90ICYmIE5MX1dIRU4oc3BvdCkgPD0gTkxfV0hFTihlbnRyeSkpIHsKKwkJLyogCisJCSAqIEtlZXAgdGhlIGJhY2sgcG9pbnRlciBpbiBjYXNlIHdlIAorCQkgKiBydW4gb2ZmIHRoZSBlbmQuLi4gIChzZWUgYmVsb3cpCisJCSAqLworCQliYWNrID0gc3BvdDsKKwkJc3BvdCA9IHNwb3QtPm5leHQ7CisJfQorCisJaWYgKHNwb3QgPT0gKCpoZWFkKSkgeworCQkvKiAKKwkJICogY2FzZSB3aGVyZSB3ZSdyZSBwcmVwZW5kaW5nIGFuIGVtcHR5IG9yIG5vbi1lbXB0eQorCQkgKiBsaXN0IG9yIGluc2VydGluZyBpbiB0aGUgbWlkZGxlIHNvbWV3aGVyZS4gIFBhc3MgCisJCSAqIHRoZSByZWFsIGhlYWQgb2YgdGhlIGxpc3QsIHNpbmNlIHdlJ2xsIGJlIGNoYW5naW5nIAorCQkgKiBkdXJpbmcgdGhlIGluc2VydC4uLiAKKwkJICovCisJCW5saXN0X2luc2VydChoZWFkLCBlbnRyeSk7CisJfSBlbHNlIHsKKwkJLyogYWxsIG90aGVyIGNhc2VzIC0gZG9uJ3QgbW92ZSB0aGUgcmVhbCBoZWFkIHBvaW50ZXIgKi8KKwkJbmxpc3RfaW5zZXJ0KCZzcG90LCBlbnRyeSk7CisKKwkJLyogCisJCSAqIElmIHNwb3QgPT0gZW50cnksIHRoZW4gc3BvdCB3YXMgTlVMTCB3aGVuIHdlIGNhbGxlZAorCQkgKiBubGlzdF9pbnNlcnQuICBUaGlzIGhhcHBlbmVkIGJlY2F1c2Ugd2UgaGFkIHJ1biBvZmYgCisJCSAqIHRoZSBlbmQgb2YgdGhlIGxpc3QuICBBcHBlbmQgZW50cnkgdG8gb3JpZ2luYWwgbGlzdC4KKwkJICovCisJCWlmIChzcG90ID09IGVudHJ5KSB7CisJCQliYWNrLT5uZXh0ID0gZW50cnk7CisJCQllbnRyeS0+cHJldiA9IGJhY2s7CisJCX0KKwl9Cit9CisKKy8qIAorICogUmVtb3ZlICplbnRyeSBmcm9tIHRoZSBsaXN0IHBvaW50ZWQgdG8gYnkgKipoZWFkLgorICogRG8gbm90IGRlc3Ryb3kgKmVudHJ5LiAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJlZm9yZQorICogYSByZS1pbnNlcnRpb24gd2l0aCBhIHRpbWVyLCBidXQgY2FuIGJlIGRvbmUgYW55d2hlcmUuCisgKiAtIGVudHJ5IG11c3Qgbm90IGJlIE5VTEwuCisgKi8KK3ZvaWQgCitubGlzdF9yZW1vdmUobm90aWZ5X2xpc3QgKipoZWFkLCBub3RpZnlfbGlzdCAqZW50cnkpCit7CisJbm90aWZ5X2xpc3QJKnByZXYgPSBlbnRyeS0+cHJldiwKKwkJCSpuZXh0ID0gZW50cnktPm5leHQ7CisKKwlpZiAobmV4dCkgeworCQluZXh0LT5wcmV2ID0gcHJldjsKKwl9CisKKwlpZiAocHJldikgeworCQkvKiBDYXNlKHMpIHdoZXJlIGVudHJ5IGlzbid0IGF0IHRoZSBmcm9udCAqLworCQlwcmV2LT5uZXh0ID0gbmV4dDsgCisJfSBlbHNlIHsKKwkJLyogY2FzZXMgd2hlcmUgZW50cnkgaXMgYXQgdGhlIGZyb250ICovCisJCSpoZWFkID0gbmV4dDsKKwl9CisKKwllbnRyeS0+bmV4dCA9IGVudHJ5LT5wcmV2ID0gTlVMTDsKKyNpZmRlZiBERUJVRworCW5saXN0X3ByaW50KGhlYWQpOworI2VuZGlmCit9CisKKy8qIAorICogQ2xvbmUgYW4gZW50cnkgaW4gdGhlIG5vdGlmeSBsaXN0IC0KKyAqIC0gZW50cnkgbXVzdCBub3QgYmUgTlVMTAorICovCitub3RpZnlfbGlzdCAqCitubGlzdF9jbG9uZShub3RpZnlfbGlzdCAqZW50cnkpCit7CisJbm90aWZ5X2xpc3QJKm5ldzsKKworCW5ldyA9IG5saXN0X25ldyhOTF9NWV9OQU1FKGVudHJ5KSwgTkxfTU9OX05BTUUoZW50cnkpLCBOTF9TVEFURShlbnRyeSkpOworCU5MX01ZX1BST0cobmV3KSA9IE5MX01ZX1BST0coZW50cnkpOworCU5MX01ZX1ZFUlMobmV3KSA9IE5MX01ZX1ZFUlMoZW50cnkpOworCU5MX01ZX1BST0MobmV3KSA9IE5MX01ZX1BST0MoZW50cnkpOworCW1lbWNweShOTF9QUklWKG5ldyksIE5MX1BSSVYoZW50cnkpLCBTTV9QUklWX1NJWkUpOworCisJcmV0dXJuIG5ldzsKK30KKworLyogCisgKiBEZXN0cm95IGFuIGVudHJ5IGluIGEgbm90aWZ5IGxpc3QgYW5kIGZyZWUgdGhlIG1lbW9yeS4KKyAqIElmICpoZWFkIGlzIE5VTEwsIGp1c3QgZnJlZSB0aGUgZW50cnkuICBUaGlzIHdvdWxkIGJlCisgKiBkb25lIG9ubHkgd2hlbiB3ZSBrbm93IGVudHJ5IGlzbid0IGluIGFueSBsaXN0LgorICogLSBlbnRyeSBtdXN0IG5vdCBiZSBOVUxMLgorICovCit2b2lkIAorbmxpc3RfZnJlZShub3RpZnlfbGlzdCAqKmhlYWQsIG5vdGlmeV9saXN0ICplbnRyeSkKK3sKKwlpZiAoaGVhZCAmJiAoKmhlYWQpKQorCQlubGlzdF9yZW1vdmUoaGVhZCwgZW50cnkpOworCWlmIChOTF9NWV9OQU1FKGVudHJ5KSkKKwkJZnJlZShOTF9NWV9OQU1FKGVudHJ5KSk7CisJaWYgKE5MX01PTl9OQU1FKGVudHJ5KSkKKwkJZnJlZShOTF9NT05fTkFNRShlbnRyeSkpOworCWZyZWUoZW50cnktPmRuc19uYW1lKTsKKwlmcmVlKGVudHJ5KTsKK30KKworLyogCisgKiBEZXN0cm95IGFuIGVudGlyZSBub3RpZnkgbGlzdCAKKyAqLwordm9pZCAKK25saXN0X2tpbGwobm90aWZ5X2xpc3QgKipoZWFkKQoreworCXdoaWxlICgqaGVhZCkKKwkJbmxpc3RfZnJlZShoZWFkLCAqaGVhZCk7Cit9CisKKy8qCisgKiBXYWxrIGEgbGlzdCBsb29raW5nIGZvciBhIG1hdGNoaW5nIG5hbWUgaW4gdGhlIE5MX01PTl9OQU1FIGZpZWxkLgorICovCitub3RpZnlfbGlzdCAqCitubGlzdF9nZXRob3N0KG5vdGlmeV9saXN0ICpsaXN0LCBjaGFyICpob3N0LCBpbnQgbXluYW1lKQoreworCW5vdGlmeV9saXN0CSpscDsKKworCWZvciAobHAgPSBsaXN0OyBscDsgbHAgPSBscC0+bmV4dCkgeworCQlpZiAoc3RhdGRfbWF0Y2hob3N0bmFtZShob3N0LAorCQkJCW15bmFtZT8gTkxfTVlfTkFNRShscCkgOiBOTF9NT05fTkFNRShscCkpKQorCQkJcmV0dXJuIGxwOworCX0KKworCXJldHVybiAobm90aWZ5X2xpc3QgKikgTlVMTDsKK30KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9ub3RsaXN0LmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbm90bGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDBkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvbm90bGlzdC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTksIDIwMDIgSmVmZnJleSBBLiBVcGhvZmYKKyAqIE1ham9yIHJld3JpdGUgYnkgT2xhZiBLaXJjaCwgRGVjLiAxOTk2LgorICoKKyAqIE5TTSBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworLyoKKyAqIFByaW1hcnkgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorICovCitzdHJ1Y3Qgbm90aWZ5X2xpc3QgeworICBtb24JCQltb247CS8qIEJpZyBob25raW4nIE5TTSBzdHJ1Y3R1cmUuICovCisgIGluX3BvcnRfdAkJcG9ydDsJLyogcG9ydCBudW1iZXIgZm9yIGNhbGxiYWNrICovCisgIHNob3J0IGludAkJdGltZXM7CS8qIENvdW50ZXIgdXNlZCBmb3IgdmFyaW91cyB0aGluZ3MuICovCisgIGludAkJCXN0YXRlOwkvKiBGb3Igc3RvcmluZyBub3RpZmllZCBzdGF0ZSBmb3IgY2FsbGJhY2tzLiAqLworICBjaGFyCQkJKmRuc19uYW1lOyAvKiB1c2VkIGZvciBtYXRjaGluZyBpbmNvbWluZworCQkJCSAgICAqIE5PVElGWSByZXF1ZXN0cyAqLworICBzdHJ1Y3Qgbm90aWZ5X2xpc3QJKm5leHQ7CS8qIExpbmtlZCBsaXN0IGZvcndhcmQgcG9pbnRlci4gKi8KKyAgc3RydWN0IG5vdGlmeV9saXN0CSpwcmV2OwkvKiBMaW5rZWQgbGlzdCBiYWNrd2FyZCBwb2ludGVyLiAqLworICB1aW50MzJfdAkJeGlkOwkvKiBYSUQgb2YgTVNfTk9USUZZIFJQQyBjYWxsICovCisgIHRpbWVfdAkJd2hlbjsJLyogbm90aWZ5OiB0aW1lb3V0IGZvciByZS14bWl0ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBub3RpZnlfbGlzdCBub3RpZnlfbGlzdDsKKworLyoKKyAqIEdsb2JhbCBWYXJpYWJsZXMKKyAqLworZXh0ZXJuIG5vdGlmeV9saXN0ICoJcnRubDsJLyogUnVuLXRpbWUgbm90aWZ5IGxpc3QgKi8KK2V4dGVybiBub3RpZnlfbGlzdCAqCW5vdGlmeTsJLyogUGVuZGluZyBSUEMgY2FsbHMgKi8KKworLyoKKyAqIExpc3QtaGFuZGxpbmcgZnVuY3Rpb25zCisgKi8KK2V4dGVybiBub3RpZnlfbGlzdCAqCW5saXN0X25ldyhjaGFyICosIGNoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkCQlubGlzdF9pbnNlcnQobm90aWZ5X2xpc3QgKiosIG5vdGlmeV9saXN0ICopOworZXh0ZXJuIHZvaWQJCW5saXN0X3JlbW92ZShub3RpZnlfbGlzdCAqKiwgbm90aWZ5X2xpc3QgKik7CitleHRlcm4gdm9pZAkJbmxpc3RfaW5zZXJ0X3RpbWVyKG5vdGlmeV9saXN0ICoqLCBub3RpZnlfbGlzdCAqKTsKK2V4dGVybiBub3RpZnlfbGlzdCAqCW5saXN0X2Nsb25lKG5vdGlmeV9saXN0ICopOworZXh0ZXJuIHZvaWQJCW5saXN0X2ZyZWUobm90aWZ5X2xpc3QgKiosIG5vdGlmeV9saXN0ICopOworZXh0ZXJuIHZvaWQJCW5saXN0X2tpbGwobm90aWZ5X2xpc3QgKiopOworZXh0ZXJuIG5vdGlmeV9saXN0ICoJbmxpc3RfZ2V0aG9zdChub3RpZnlfbGlzdCAqLCBjaGFyICosIGludCk7CisKKy8qIAorICogTGlzdC1oYW5kbGluZyBtYWNyb3MuCisgKiBUSEVTRSBJTkhFUklUIElORk9STUFUSU9OIEZST00gUFJFVklPVVNMWS1ERUZJTkVEIE1BQ1JPUy4KKyAqIChTbyBkb24ndCBjaGFuZ2UgdGhlaXIgb3JkZXIgdW5sZXNzIHlvdSBzdHVkeSB0aGVtIGZpcnN0ISkKKyAqLworI2RlZmluZSBOTF9ORVhUKEwpCSgoTCktPm5leHQpCisjZGVmaW5lIE5MX0ZJUlNUCU5MX05FWFQKKyNkZWZpbmUgTkxfUFJFVihMKQkoKEwpLT5wcmV2KQorI2RlZmluZSBOTF9EQVRBKEwpCSgoTCktPm1vbikKKyNkZWZpbmUgTkxfU1RBVEUoTCkJKChMKS0+c3RhdGUpCisjZGVmaW5lIE5MX1RJTUVTKEwpCSgoTCktPnRpbWVzKQorI2RlZmluZSBOTF9NT05fSUQoTCkJKE5MX0RBVEEoKEwpKS5tb25faWQpCisjZGVmaW5lIE5MX1BSSVYoTCkJKE5MX0RBVEEoKEwpKS5wcml2KQorI2RlZmluZSBOTF9NT05fTkFNRShMKQkoTkxfTU9OX0lEKChMKSkubW9uX25hbWUpCisjZGVmaW5lIE5MX01ZX0lEKEwpCShOTF9NT05fSUQoKEwpKS5teV9pZCkKKyNkZWZpbmUgTkxfTVlfTkFNRShMKQkoTkxfTVlfSUQoKEwpKS5teV9uYW1lKQorI2RlZmluZSBOTF9NWV9QUk9DKEwpCShOTF9NWV9JRCgoTCkpLm15X3Byb2MpCisjZGVmaW5lIE5MX01ZX1BST0coTCkJKE5MX01ZX0lEKChMKSkubXlfcHJvZykKKyNkZWZpbmUgTkxfTVlfVkVSUyhMKQkoTkxfTVlfSUQoKEwpKS5teV92ZXJzKQorI2RlZmluZSBOTF9XSEVOKEwpCSgoTCktPndoZW4pCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvcm10Y2FsbC5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3JtdGNhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTUyZmUyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3JtdGNhbGwuYwpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBPbGFmIEtpcmNoCisgKiBNb2RpZmllZCBieSBKZWZmcmV5IEEuIFVwaG9mZiwgMTk5Ny0xOTk5LgorICogTW9kaWZpZWQgYnkgSC5KLiBMdSwgMTk5OC4KKyAqIE1vZGlmaWVkIGJ5IExvbiBIb2hiZXJnZXIsIE9jdC4gMjAwMAorICogICAtIEJ1Z2ZpeCBoYW5kbGluZyBjbGllbnQgcmVzcG9uc2VzLgorICogICAtIFBhcmFub2lhIG9uIE5PVElGWV9DQUxMQkFDSyBjYXNlCisgKgorICogTlNNIGZvciBMaW51eC4KKyAqLworCisvKgorICogQWZ0ZXIgcmVib290LCBub3RpZnkgYWxsIGhvc3RzIG9uIG91ciBub3RpZnkgbGlzdC4gSW4gb3JkZXIgbm90IHRvCisgKiBoYW5nIHN0YXRkIHdpdGggZGVsaXZlcnkgdG8gZGVhZCBob3N0cywgd2UgcGVyZm9ybSBhbGwgUlBDIGNhbGxzIGluCisgKiBwYXJhbGxlbC4KKyAqCisgKiBJdCB3b3VsZCBoYXZlIGJlZW4gbmljZSB0byB1c2UgdGhlIHBvcnRtYXBwZXIncyBybXRjYWxsIGZlYXR1cmUsCisgKiBidXQgdGhhdCdzIG5vdCBwb3NzaWJsZSBmb3Igc2VjdXJpdHkgcmVhc29ucyAodGhlIHBvcnRtYXBwZXIgd291bGQKKyAqIGhhdmUgdG8gZm9yd2FyZCB0aGUgY2FsbCB3aXRoIHJvb3QgcHJpdnMgZm9yIG1vc3Qgc3RhdGQncywgd2hpY2gKKyAqIGl0IHdvbid0IGlmIGl0J3Mgd29ydGggaXRzIG1vbmV5KS4KKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8cnBjL3JwYy5oPgorI2luY2x1ZGUgPHJwYy9wbWFwX3Byb3QuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9ybXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInNtX2ludGVyLmgiCisjaW5jbHVkZSAic3RhdGQuaCIKKyNpbmNsdWRlICJub3RsaXN0LmgiCisjaW5jbHVkZSAiaGEtY2FsbG91dC5oIgorCisjaW5jbHVkZSAibnNtLmgiCisjaW5jbHVkZSAibmZzcnBjLmgiCisKKyNpZiBTSVpFT0ZfU09DS0xFTl9UIC0gMCA9PSAwCisjZGVmaW5lIHNvY2tsZW5fdCBpbnQKKyNlbmRpZgorCitzdGF0aWMgaW50CQlzb2NrZmQgPSAtMTsJLyogbm90aWZ5IHNvY2tldCAqLworCisvKgorICogSW5pdGlhbGl6ZSBzb2NrZXQgdXNlZCB0byBub3RpZnkgbG9ja2Qgb2YgcGVlciByZWJvb3RzLgorICoKKyAqIFJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgbmV3IHNvY2tldCBpZiBzdWNjZXNzZnVsOworICogb3RoZXJ3aXNlIHJldHVybnMgLTEgYW5kIGxvZ3MgYW4gZXJyb3IuCisgKgorICogTG9ja2QgcmVqZWN0cyBzdWNoIHJlcXVlc3RzIGlmIHRoZSBzb3VyY2UgcG9ydCBpcyBub3QgcHJpdmlsZWdlZC4KKyAqIHN0YXRkX2dldF9zb2NrZXQoKSBtdXN0IGJlIGludm9rZWQgd2hpbGUgc3RhdGQgc3RpbGwgaG9sZHMgcm9vdAorICogcHJpdmlsZWdlcyBpbiBvcmRlciBmb3IgdGhlIHNvY2tldCB0byBhY3F1aXJlIGEgcHJpdmlsZWdlZCBzb3VyY2UKKyAqIHBvcnQuCisgKi8KK2ludAorc3RhdGRfZ2V0X3NvY2tldCh2b2lkKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbglzaW47CisJc3RydWN0IHNlcnZlbnQgKnNlOworCWludCBsb29wY250ID0gMTAwOworCisJaWYgKHNvY2tmZCA+PSAwKQorCQlyZXR1cm4gc29ja2ZkOworCisJd2hpbGUgKGxvb3BjbnQtLSA+IDApIHsKKworCQlpZiAoc29ja2ZkID49IDApIGNsb3NlKHNvY2tmZCk7CisKKwkJaWYgKChzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApKSA8IDApIHsKKwkJCXhsb2coTF9FUlJPUiwgIiVzOiBDYW4ndCBjcmVhdGUgc29ja2V0OiAlbSIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisKKwkJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwkJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzaW4uc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCQlpZiAoYmluZHJlc3Zwb3J0KHNvY2tmZCwgJnNpbikgPCAwKSB7CisJCQl4bG9nKERfR0VORVJBTCwgIiVzOiBjYW4ndCBiaW5kIHRvIHJlc2VydmVkIHBvcnQiLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlicmVhazsKKwkJfQorCQlzZSA9IGdldHNlcnZieXBvcnQoc2luLnNpbl9wb3J0LCAidWRwIik7CisJCWlmIChzZSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCS8qIHJhdGhlciBub3QgdXNlIHRoYXQgcG9ydCwgdHJ5IGFnYWluICovCisJfQorCUZEX1NFVChzb2NrZmQsICZTVkNfRkRTRVQpOworCXJldHVybiBzb2NrZmQ7Cit9CisKK3N0YXRpYyBub3RpZnlfbGlzdCAqCityZWN2X3JwbHkodV9sb25nICpwb3J0cCkKK3sKKwljaGFyCQkJbXNnYnVmW05TTV9NQVhNU0dTSVpFXTsKKwlzc2l6ZV90CQkJbXNnbGVuOworCW5vdGlmeV9saXN0CQkqbHAgPSBOVUxMOworCVhEUgkJCXhkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4Jc2luOworCXNvY2tsZW5fdAkJYWxlbiA9IChzb2NrbGVuX3Qpc2l6ZW9mKHNpbik7CisJdWludDMyX3QJCXhpZDsKKworCW1lbXNldChtc2didWYsIDAsIHNpemVvZihtc2didWYpKTsKKwltc2dsZW4gPSByZWN2ZnJvbShzb2NrZmQsIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKShjaGFyICopJnNpbiwgJmFsZW4pOworCWlmIChtc2dsZW4gPT0gKHNzaXplX3QpLTEpIHsKKwkJeGxvZ193YXJuKCIlczogcmVjdmZyb20gZmFpbGVkOiAlbSIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KCZ4ZHIsIDAsIHNpemVvZih4ZHIpKTsKKwl4ZHJtZW1fY3JlYXRlKCZ4ZHIsIG1zZ2J1ZiwgKHVuc2lnbmVkIGludCltc2dsZW4sIFhEUl9ERUNPREUpOworCXhpZCA9IG5zbV9wYXJzZV9yZXBseSgmeGRyKTsKKwlpZiAoeGlkID09IDApCisJCWdvdG8gZG9uZTsKKwlpZiAoc2luLnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfTE9PUEJBQ0spKSB7CisJCXN0cnVjdCBpbl9hZGRyIGFkZHIgPSBzaW4uc2luX2FkZHI7CisJCWNoYXIgYnVmW0lORVRfQUREUlNUUkxFTl07CisKKwkJeGxvZ193YXJuKCIlczogVW5yZWNvZ25pemVkIHJlcGx5IGZyb20gJXMiLCBfX2Z1bmNfXywKKwkJCQlpbmV0X250b3AoQUZfSU5FVCwgJmFkZHIsIGJ1ZiwKKwkJCQkJCShzb2NrbGVuX3Qpc2l6ZW9mKGJ1ZikpKTsKKwkJZ290byBkb25lOworCX0KKworCWZvciAobHAgPSBub3RpZnk7IGxwICE9IE5VTEw7IGxwID0gbHAtPm5leHQpIHsKKwkJLyogTEggLSB0aGlzIHdhcyBhIGJ1Zy4uLiBpdCBzaG91bGQgaGF2ZSBiZWVuIGNoZWNraW5nCisJCSAqIHRoZSB4aWQgZnJvbSB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHRoZSBjbGllbnQsCisJCSAqIG5vdCB0aGUgc3RhdGljLCBpbnRlcm5hbCB4aWQgKi8KKwkJaWYgKGxwLT54aWQgIT0geGlkKQorCQkJY29udGludWU7CisJCWlmIChscC0+cG9ydCA9PSAwKQorCQkJKnBvcnRwID0gbnNtX3JlY3ZfZ2V0cG9ydCgmeGRyKTsKKwkJYnJlYWs7CisJfQorCitkb25lOgorCXhkcl9kZXN0cm95KCZ4ZHIpOworCXJldHVybiBscDsKK30KKworLyoKKyAqIE5vdGlmeSBvcGVyYXRpb24gZm9yIGEgc2luZ2xlIGxpc3QgZW50cnkKKyAqLworc3RhdGljIGludAorcHJvY2Vzc19lbnRyeShub3RpZnlfbGlzdCAqbHApCit7CisJc3RydWN0IHNvY2thZGRyX2luCXNpbjsKKworCWlmIChOTF9USU1FUyhscCkgPT0gMCkgeworCQl4bG9nKERfR0VORVJBTCwgIiVzOiBDYW5ub3Qgbm90aWZ5IGxvY2FsaG9zdCwgZ2l2aW5nIHVwIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNpbi5zaW5fcG9ydCAgID0gbHAtPnBvcnQ7CisJLyogTEggLSBtb3ZlZCBhZGRyZXNzIGludG8gc3dpdGNoICovCisKKwkvKiBfX0ZPUkNFX18gbG9vcGJhY2sgZm9yIGNhbGxiYWNrcyB0byBsb2NrZCAuLi4gKi8KKwkvKiBKdXN0IGluIGNhc2Ugd2Ugc29tZWhvdyBpZ25vcmVkIGl0IHRodXMgZmFyICovCisJc2luLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisKKwlpZiAoc2luLnNpbl9wb3J0ID09IDApCisJCWxwLT54aWQgPSBuc21feG1pdF9nZXRwb3J0KHNvY2tmZCwgJnNpbiwKKwkJCQkJKHJwY3Byb2dfdClOTF9NWV9QUk9HKGxwKSwKKwkJCQkJKHJwY3ZlcnNfdClOTF9NWV9WRVJTKGxwKSk7CisJZWxzZSB7CisJCXN0cnVjdCBtb24gbTsKKworCQltZW1jcHkobS5wcml2LCBOTF9QUklWKGxwKSwgU01fUFJJVl9TSVpFKTsKKworCQltLm1vbl9pZC5tb25fbmFtZSA9IE5MX01PTl9OQU1FKGxwKTsKKwkJbS5tb25faWQubXlfaWQubXlfbmFtZSA9IE5VTEw7CisJCW0ubW9uX2lkLm15X2lkLm15X3Byb2cgPSBOTF9NWV9QUk9HKGxwKTsKKwkJbS5tb25faWQubXlfaWQubXlfdmVycyA9IE5MX01ZX1ZFUlMobHApOworCQltLm1vbl9pZC5teV9pZC5teV9wcm9jID0gTkxfTVlfUFJPQyhscCk7CisKKwkJbHAtPnhpZCA9IG5zbV94bWl0X25sbWNhbGwoc29ja2ZkLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikoY2hhciAqKSZzaW4sCisJCQkJKHNvY2tsZW5fdClzaXplb2Yoc2luKSwgJm0sIE5MX1NUQVRFKGxwKSk7CisJfQorCWlmIChscC0+eGlkID09IDApIHsKKwkJeGxvZ193YXJuKCIlczogZmFpbGVkIHRvIG5vdGlmeSBwb3J0ICVkIiwKKwkJCQlfX2Z1bmNfXywgbnRvaHMobHAtPnBvcnQpKTsKKwl9CisJTkxfVElNRVMobHApIC09IDE7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFByb2Nlc3MgYSBkYXRhZ3JhbSByZWNlaXZlZCBvbiB0aGUgbm90aWZ5IHNvY2tldAorICovCitpbnQKK3Byb2Nlc3NfcmVwbHkoRkRfU0VUX1RZUEUgKnJmZHMpCit7CisJbm90aWZ5X2xpc3QJCSpscDsKKwl1X2xvbmcJCQlwb3J0OworCisJaWYgKHNvY2tmZCA9PSAtMSB8fCAhRkRfSVNTRVQoc29ja2ZkLCByZmRzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShscCA9IHJlY3ZfcnBseSgmcG9ydCkpKQorCQlyZXR1cm4gMTsKKworCWlmIChscC0+cG9ydCA9PSAwKSB7CisJCWlmIChwb3J0ICE9IDApIHsKKwkJCWxwLT5wb3J0ID0gaHRvbnMoKHVuc2lnbmVkIHNob3J0KSBwb3J0KTsKKwkJCXByb2Nlc3NfZW50cnkobHApOworCQkJTkxfV0hFTihscCkgPSB0aW1lKE5VTEwpICsgTk9USUZZX1RJTUVPVVQ7CisJCQlubGlzdF9yZW1vdmUoJm5vdGlmeSwgbHApOworCQkJbmxpc3RfaW5zZXJ0X3RpbWVyKCZub3RpZnksIGxwKTsKKwkJCXJldHVybiAxOworCQl9CisJCXhsb2dfd2FybigiJXM6IHNlcnZpY2UgJWQgbm90IHJlZ2lzdGVyZWQgb24gbG9jYWxob3N0IiwKKwkJCV9fZnVuY19fLCBOTF9NWV9QUk9HKGxwKSk7CisJfSBlbHNlIHsKKwkJeGxvZyhEX0dFTkVSQUwsICIlczogQ2FsbGJhY2sgdG8gJXMgKGZvciAlZCkgc3VjY2VlZGVkIiwKKwkJCV9fZnVuY19fLCBOTF9NWV9OQU1FKGxwKSwgTkxfTU9OX05BTUUobHApKTsKKwl9CisJbmxpc3RfZnJlZSgmbm90aWZ5LCBscCk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbm90aWZ5IGxpc3QsIGVpdGhlciBmb3Igbm90aWZ5aW5nIHJlbW90ZSBob3N0cyBhZnRlciByZWJvb3QKKyAqIG9yIGZvciBjYWxsaW5nIGJhY2sgKGxvY2FsKSBzdGF0ZCBjbGllbnRzIHdoZW4gdGhlIHJlbW90ZSBoYXMgbm90aWZpZWQKKyAqIHVzIG9mIGEgY3Jhc2guIAorICovCitpbnQKK3Byb2Nlc3Nfbm90aWZ5X2xpc3Qodm9pZCkKK3sKKwlub3RpZnlfbGlzdAkqZW50cnk7CisJdGltZV90CQlub3c7CisKKwl3aGlsZSAoKGVudHJ5ID0gbm90aWZ5KSAhPSBOVUxMICYmIE5MX1dIRU4oZW50cnkpIDwgdGltZSgmbm93KSkgeworCQlpZiAocHJvY2Vzc19lbnRyeShlbnRyeSkpIHsKKwkJCU5MX1dIRU4oZW50cnkpID0gdGltZShOVUxMKSArIE5PVElGWV9USU1FT1VUOworCQkJbmxpc3RfcmVtb3ZlKCZub3RpZnksIGVudHJ5KTsKKwkJCW5saXN0X2luc2VydF90aW1lcigmbm90aWZ5LCBlbnRyeSk7CisJCX0gZWxzZSB7CisJCQl4bG9nKExfRVJST1IsCisJCQkJIiVzOiBDYW4ndCBjYWxsYmFjayAlcyAoJWQsJWQpLCBnaXZpbmcgdXAiLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJTkxfTVlfTkFNRShlbnRyeSksCisJCQkJCU5MX01ZX1BST0coZW50cnkpLAorCQkJCQlOTF9NWV9WRVJTKGVudHJ5KSk7CisJCQlubGlzdF9mcmVlKCZub3RpZnksIGVudHJ5KTsKKwkJfQorCX0KKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3NpbV9zbV9pbnRlci54IGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3NpbV9zbV9pbnRlci54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDYxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc2ltX3NtX2ludGVyLngKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5Ny0xOTk5IEplZmZyZXkgQS4gVXBob2ZmCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoLCAxOTk2LgorICogTW9kaWZpZWQgYnkgSC5KLiBMdSwgMTk5OC4KKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKyNpZmRlZiBSUENfQ0xOVAorJSNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCitwcm9ncmFtIFNJTV9TTV9QUk9HIHsgCisJdmVyc2lvbiBTSU1fU01fVkVSUyAgeworCQl2b2lkCQkJIFNJTV9TTV9NT04oc3RydWN0IHN0YXR1cykgPSAxOworCX0gPSAxOworfSA9IDIwMDA0ODsKKworY29uc3QJU01fTUFYU1RSTEVOID0gMTAyNDsKK2NvbnN0CVNNX1BSSVZfU0laRSA9IDE2OworCisvKiAKKyAqIHN0cnVjdHVyZSBvZiB0aGUgc3RhdHVzIG1lc3NhZ2Ugc2VudCBiYWNrIGJ5IHRoZSBzdGF0dXMgbW9uaXRvcgorICogd2hlbiBtb25pdG9yIHNpdGUgc3RhdHVzIGNoYW5nZXMKKyAqLworJSNpZm5kZWYgU01fSU5URVJfWAorc3RydWN0IHN0YXR1cyB7CisJc3RyaW5nIG1vbl9uYW1lPFNNX01BWFNUUkxFTj47CisJaW50IHN0YXRlOworCW9wYXF1ZSBwcml2W1NNX1BSSVZfU0laRV07IC8qIHN0b3JlZCBwcml2YXRlIGluZm9ybWF0aW9uICovCit9OworJSNlbmRpZiAvKiBTTV9JTlRFUl9YICovCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc2ltdS5jIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3NpbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQwYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3NpbXUuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTkgSmVmZnJleSBBLiBVcGhvZmYKKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlICJzb2NrYWRkci5oIgorI2luY2x1ZGUgInJwY21pc2MuaCIKKyNpbmNsdWRlICJzdGF0ZC5oIgorI2luY2x1ZGUgIm5vdGxpc3QuaCIKKworZXh0ZXJuIHZvaWQgbXlfc3ZjX2V4aXQgKHZvaWQpOworCisKKy8qCisgKiBTZXJ2aWNlcyBTTV9TSU1VX0NSQVNIIHJlcXVlc3RzLgorICoKKyAqIEFsdGhvdWdoIHRoZSBrZXJuZWwgY29udGFjdHMgdGhlIHN0YXRkIHNlcnZpY2UgdmlhIG9ubHkgSVB2NAorICogdHJhbnNwb3J0cywgdGhlIHN0YXRkIHNlcnZpY2UgY2FuIHJlY2VpdmUgb3RoZXIgcmVxdWVzdHMsIHN1Y2gKKyAqIGFzIFNNX05PVElGWSwgZnJvbSByZW1vdGUgcGVlcnMgdmlhIElQdjYuCisgKi8KK3ZvaWQgKgorc21fc2ltdV9jcmFzaF8xX3N2YyAoX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIHZvaWQgKmFyZ3AsIHN0cnVjdCBzdmNfcmVxICpycXN0cCkKK3sKKyAgc3RydWN0IHNvY2thZGRyICpzYXAgPSBuZnNfZ2V0cnBjY2FsbGVyKHJxc3RwLT5ycV94cHJ0KTsKKyAgY2hhciBidWZbSU5FVDZfQUREUlNUUkxFTl07CisgIHN0YXRpYyBjaGFyICpyZXN1bHQgPSBOVUxMOworCisgIHhsb2coRF9DQUxMLCAiUmVjZWl2ZWQgU01fU0lNVV9DUkFTSCIpOworCisgIGlmICghbmZzX2lzX3Y0X2xvb3BiYWNrKHNhcCkpCisgICAgZ290byBvdXRfbm9ubG9jYWw7CisKKyAgaWYgKChpbnQpbmZzX2dldF9wb3J0KHNhcCkgPj0gSVBQT1JUX1JFU0VSVkVEKSB7CisgICAgeGxvZ193YXJuKCJTTV9TSU1VX0NSQVNIIGNhbGwgZnJvbSB1bnByaXZpbGVnZWQgcG9ydCIpOworICAgIGdvdG8gZmFpbHVyZTsKKyAgfQorCisgIG15X3N2Y19leGl0ICgpOworCisgIGlmIChydG5sKQorICAgIG5saXN0X2tpbGwgKCZydG5sKTsKKworIGZhaWx1cmU6CisgIHJldHVybiAoKHZvaWQgKikmcmVzdWx0KTsKKworIG91dF9ub25sb2NhbDoKKyAgaWYgKCFzdGF0ZF9wcmVzZW50X2FkZHJlc3Moc2FwLCBidWYsIHNpemVvZihidWYpKSkKKyAgICBidWZbMF0gPSAnXDAnOworICB4bG9nX3dhcm4oIlNNX1NJTVVfQ1JBU0ggY2FsbCBmcm9tIG5vbi1sb2NhbCBob3N0ICVzIiwgYnVmKTsKKyAgZ290byBmYWlsdXJlOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3NpbXVsYXRlLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc2ltdWxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQxNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3NpbXVsYXRlLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMTk5OSBKZWZmcmV5IEEuIFVwaG9mZgorICoKKyAqIE5TTSBmb3IgTGludXguCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lmbmRlZiBTSU1VTEFUSU9OUworIyBlcnJvciBIb3cgdGhlIGhlbGwgZGlkIHdlIGdldCBoZXJlPworI2VuZGlmCisKKy8qIElmIHdlJ3JlIHJ1bm5pbmcgdGhlIHNpbXVsYXRvciwgd2UncmUgZGVidWdnaW5nLiAgUHJldHR5IHNpbXBsZS4gKi8KKyNpZm5kZWYgREVCVUcKKyMgZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjaW5jbHVkZSA8cnBjbWlzYy5oPgorI2luY2x1ZGUgInN0YXRkLmgiCisjaW5jbHVkZSAic2ltX3NtX2ludGVyLmgiCisKK3N0YXRpYyB2b2lkIGRhZW1vbl9zaW11bGF0b3IgKHZvaWQpOworc3RhdGljIHZvaWQgc2ltX2tpbGxlciAoaW50IHNpZyk7CitzdGF0aWMgdm9pZCBzaW11bGF0ZV9jcmFzaCAoY2hhciAqKTsKK3N0YXRpYyB2b2lkIHNpbXVsYXRlX21vbiAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBjaGFyICopOworc3RhdGljIHZvaWQgc2ltdWxhdGVfc3RhdCAoY2hhciAqLCBjaGFyICopOworc3RhdGljIHZvaWQgc2ltdWxhdGVfdW5tb24gKGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKik7CitzdGF0aWMgdm9pZCBzaW11bGF0ZV91bm1vbl9hbGwgKGNoYXIgKiwgY2hhciAqLCBjaGFyICopOworCitzdGF0aWMgaW50IHNpbV9wb3J0ID0gMDsKKworZXh0ZXJuIHZvaWQgc2ltX3NtX3Byb2dfMSAoc3RydWN0IHN2Y19yZXEgKiwgcmVnaXN0ZXIgU1ZDWFBSVCk7CitleHRlcm4gdm9pZCBzdmNfZXhpdCAodm9pZCk7CisKK3ZvaWQKK3NpbXVsYXRvciAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICB4bG9nX3N0ZGVyciAoMSk7CisgIHhsb2dfc3lzbG9nICgwKTsKKyAgeGxvZ19vcGVuICgic3RhdGQgc2ltdWxhdG9yIik7CisKKyAgaWYgKGFyZ2MgPT0gMikKKyAgICBpZiAoIXN0cmNhc2VjbXAgKCphcmd2LCAiY3Jhc2giKSkKKyAgICAgIHNpbXVsYXRlX2NyYXNoICgqKCZhcmd2WzFdKSk7CisKKyAgaWYgKGFyZ2MgPT0gMykgeworICAgIGlmICghc3RyY2FzZWNtcCAoKmFyZ3YsICJzdGF0IikpCisgICAgICBzaW11bGF0ZV9zdGF0ICgqKCZhcmd2WzFdKSwgKigmYXJndlsyXSkpOworICB9CisgIGlmIChhcmdjID09IDQpIHsKKyAgICBpZiAoIXN0cmNhc2VjbXAgKCphcmd2LCAidW5tb25fYWxsIikpCisgICAgICBzaW11bGF0ZV91bm1vbl9hbGwgKCooJmFyZ3ZbMV0pLCAqKCZhcmd2WzJdKSwgKigmYXJndlszXSkpOworICB9CisgIGlmIChhcmdjID09IDUpIHsKKyAgICBpZiAoIXN0cmNhc2VjbXAgKCphcmd2LCAidW5tb24iKSkKKyAgICAgIHNpbXVsYXRlX3VubW9uICgqKCZhcmd2WzFdKSwgKigmYXJndlsyXSksICooJmFyZ3ZbM10pLCAqKCZhcmd2WzRdKSk7CisgIH0KKyAgaWYgKGFyZ2MgPT0gNikgeworICAgIGlmICghc3RyY2FzZWNtcCAoKmFyZ3YsICJtb24iKSkKKyAgICAgIHNpbXVsYXRlX21vbiAoKigmYXJndlsxXSksICooJmFyZ3ZbMl0pLCAqKCZhcmd2WzNdKSwgKigmYXJndls0XSksCisJCSAgICAqKCZhcmd2WzVdKSk7CisgIH0KKyAgeGxvZ19lcnIgKCJXVEY/ICBHaXZlIG1lIHNvbWV0aGluZyBJIGNhbiB1c2UhIik7Cit9CisKK3N0YXRpYyB2b2lkCitzaW11bGF0ZV9tb24gKGNoYXIgKmNhbGxpbmcsIGNoYXIgKm1vbml0b3JpbmcsIGNoYXIgKmFzLCBjaGFyICpwcm9nZ3ksCisJICAgICAgY2hhciAqZm9vbCkKK3sKKyAgQ0xJRU5UICpjbGllbnQ7CisgIHNtX3N0YXRfcmVzICpyZXN1bHQ7CisgIG1vbiBtb247CisKKyAgeGxvZyAoRF9HRU5FUkFMLCAiQ2FsbGluZyAlcyAoYXMgJXMpIHRvIG1vbml0b3IgJXMiLCBjYWxsaW5nLCBhcywKKwkgICBtb25pdG9yaW5nKTsKKworICBpZiAoKGNsaWVudCA9IGNsbnRfY3JlYXRlIChjYWxsaW5nLCBTTV9QUk9HLCBTTV9WRVJTLCAidWRwIikpID09IE5VTEwpCisgICAgeGxvZ19lcnIgKCIlcyIsIGNsbnRfc3BjcmVhdGVlcnJvciAoImNsbnRfY3JlYXRlIikpOworCisgIG1lbWNweSAobW9uLnByaXYsIGZvb2wsIFNNX1BSSVZfU0laRSk7CisgIG1vbi5tb25faWQubXlfaWQubXlfbmFtZSA9IHhzdHJkdXAgKGFzKTsKKyAgc2ltX3BvcnQgPSBhdG9pIChwcm9nZ3kpICogU0lNX1NNX1BST0c7CisgIG1vbi5tb25faWQubXlfaWQubXlfcHJvZyA9IHNpbV9wb3J0OyAvKiBQc2V1ZG8tZHVtbXkgKi8KKyAgbW9uLm1vbl9pZC5teV9pZC5teV92ZXJzID0gU0lNX1NNX1ZFUlM7CisgIG1vbi5tb25faWQubXlfaWQubXlfcHJvYyA9IFNJTV9TTV9NT047CisgIG1vbi5tb25faWQubW9uX25hbWUgPSBtb25pdG9yaW5nOworCisgIGlmICghKHJlc3VsdCA9IHNtX21vbl8xICgmbW9uLCBjbGllbnQpKSkKKyAgICB4bG9nX2VyciAoIiVzIiwgY2xudF9zcGVycm9yIChjbGllbnQsICJzbV9tb25fMSIpKTsKKworICBmcmVlIChtb24ubW9uX2lkLm15X2lkLm15X25hbWUpOworCisgIGlmIChyZXN1bHQtPnJlc19zdGF0ICE9IFNUQVRfU1VDQykgeworICAgIHhsb2dfZXJyICgiU01fTU9OIHJlcXVlc3QgZmFpbGVkLCBzdGF0ZTogJWQiLCByZXN1bHQtPnN0YXRlKTsKKyAgfSBlbHNlIHsKKyAgICB4bG9nIChEX0dFTkVSQUwsICJTTV9NT04gcmVzdWx0IHN1Y2Nlc3NmdWwsIHN0YXRlOiAlZFxuIiwgcmVzdWx0LT5zdGF0ZSk7CisgICAgeGxvZyAoRF9HRU5FUkFMLCAiV2FpdGluZyBmb3IgY2FsbGJhY2siKTsKKyAgICBkYWVtb25fc2ltdWxhdG9yICgpOworICAgIGV4aXQgKDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCitzaW11bGF0ZV91bm1vbiAoY2hhciAqY2FsbGluZywgY2hhciAqdW5tb25pdG9yaW5nLCBjaGFyICphcywgY2hhciAqcHJvZ2d5KQoreworICBDTElFTlQgKmNsaWVudDsKKyAgc21fc3RhdCAqcmVzdWx0OworICBtb25faWQgbW9uX2lkOworCisgIHhsb2cgKERfR0VORVJBTCwgIkNhbGxpbmcgJXMgKGFzICVzKSB0byB1bm1vbml0b3IgJXMiLCBjYWxsaW5nLCBhcywKKwkgICB1bm1vbml0b3JpbmcpOworCisgIGlmICgoY2xpZW50ID0gY2xudF9jcmVhdGUgKGNhbGxpbmcsIFNNX1BST0csIFNNX1ZFUlMsICJ1ZHAiKSkgPT0gTlVMTCkKKyAgICB4bG9nX2VyciAoIiVzIiwgY2xudF9zcGNyZWF0ZWVycm9yICgiY2xudF9jcmVhdGUiKSk7CisKKyAgbW9uX2lkLm15X2lkLm15X25hbWUgPSB4c3RyZHVwIChhcyk7CisgIG1vbl9pZC5teV9pZC5teV9wcm9nID0gYXRvaSAocHJvZ2d5KSAqIFNJTV9TTV9QUk9HOworICBtb25faWQubXlfaWQubXlfdmVycyA9IFNJTV9TTV9WRVJTOworICBtb25faWQubXlfaWQubXlfcHJvYyA9IFNJTV9TTV9NT047CisgIG1vbl9pZC5tb25fbmFtZSA9IHVubW9uaXRvcmluZzsKKworICBpZiAoIShyZXN1bHQgPSBzbV91bm1vbl8xICgmbW9uX2lkLCBjbGllbnQpKSkKKyAgICB4bG9nX2VyciAoIiVzIiwgY2xudF9zcGVycm9yIChjbGllbnQsICJzbV91bm1vbl8xIikpOworCisgIGZyZWUgKG1vbl9pZC5teV9pZC5teV9uYW1lKTsKKyAgeGxvZyAoRF9HRU5FUkFMLCAiU01fVU5NT04gcmVxdWVzdCByZXR1cm5lZCBzdGF0ZTogJWRcbiIsIHJlc3VsdC0+c3RhdGUpOworICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK3NpbXVsYXRlX3VubW9uX2FsbCAoY2hhciAqY2FsbGluZywgY2hhciAqYXMsIGNoYXIgKnByb2dneSkKK3sKKyAgQ0xJRU5UICpjbGllbnQ7CisgIHNtX3N0YXQgKnJlc3VsdDsKKyAgbXlfaWQgbXlfaWQ7CisKKyAgeGxvZyAoRF9HRU5FUkFMLCAiQ2FsbGluZyAlcyAoYXMgJXMpIHRvIHVubW9uaXRvciBhbGwgaG9zdHMiLCBjYWxsaW5nLCBhcyk7CisKKyAgaWYgKChjbGllbnQgPSBjbG50X2NyZWF0ZSAoY2FsbGluZywgU01fUFJPRywgU01fVkVSUywgInVkcCIpKSA9PSBOVUxMKQorICAgIHhsb2dfZXJyICgiJXMiLCBjbG50X3NwY3JlYXRlZXJyb3IgKCJjbG50X2NyZWF0ZSIpKTsKKworICBteV9pZC5teV9uYW1lID0geHN0cmR1cCAoYXMpOworICBteV9pZC5teV9wcm9nID0gYXRvaSAocHJvZ2d5KSAqIFNJTV9TTV9QUk9HOworICBteV9pZC5teV92ZXJzID0gU0lNX1NNX1ZFUlM7CisgIG15X2lkLm15X3Byb2MgPSBTSU1fU01fTU9OOworCisgIGlmICghKHJlc3VsdCA9IHNtX3VubW9uX2FsbF8xICgmbXlfaWQsIGNsaWVudCkpKQorICAgIHhsb2dfZXJyICgiJXMiLCBjbG50X3NwZXJyb3IgKGNsaWVudCwgInNtX3VubW9uX2FsbF8xIikpOworCisgIGZyZWUgKG15X2lkLm15X25hbWUpOworICB4bG9nIChEX0dFTkVSQUwsICJTTV9VTk1PTl9BTEwgcmVxdWVzdCByZXR1cm5lZCBzdGF0ZTogJWRcbiIsIHJlc3VsdC0+c3RhdGUpOworICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK3NpbXVsYXRlX2NyYXNoIChjaGFyICpob3N0KQoreworICBDTElFTlQgKmNsaWVudDsKKworICBpZiAoKGNsaWVudCA9IGNsbnRfY3JlYXRlIChob3N0LCBTTV9QUk9HLCBTTV9WRVJTLCAidWRwIikpID09IE5VTEwpCisgICAgeGxvZ19lcnIgKCIlcyIsIGNsbnRfc3BjcmVhdGVlcnJvciAoImNsbnRfY3JlYXRlIikpOworCisgIGlmICghc21fc2ltdV9jcmFzaF8xIChOVUxMLCBjbGllbnQpKQorICAgIHhsb2dfZXJyICgiJXMiLCBjbG50X3NwZXJyb3IgKGNsaWVudCwgInNtX3NpbXVfY3Jhc2hfMSIpKTsKKworICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK3NpbXVsYXRlX3N0YXQgKGNoYXIgKmNhbGxpbmcsIGNoYXIgKm1vbml0b3JpbmcpCit7CisgIENMSUVOVCAqY2xpZW50OworICBzbV9uYW1lIGNoZWNraW5nOworICBzbV9zdGF0X3JlcyAqcmVzdWx0OworICAKKyAgaWYgKChjbGllbnQgPSBjbG50X2NyZWF0ZSAoY2FsbGluZywgU01fUFJPRywgU01fVkVSUywgInVkcCIpKSA9PSBOVUxMKQorICAgIHhsb2dfZXJyICgiJXMiLCBjbG50X3NwY3JlYXRlZXJyb3IgKCJjbG50X2NyZWF0ZSIpKTsKKworICBjaGVja2luZy5tb25fbmFtZSA9IG1vbml0b3Jpbmc7CisKKyAgaWYgKCEocmVzdWx0ID0gc21fc3RhdF8xICgmY2hlY2tpbmcsIGNsaWVudCkpKQorICAgIHhsb2dfZXJyICgiJXMiLCBjbG50X3NwZXJyb3IgKGNsaWVudCwgInNtX3N0YXRfMSIpKTsKKworICBpZiAocmVzdWx0LT5yZXNfc3RhdCA9PSBTVEFUX1NVQ0MpCisgICAgeGxvZyAoRF9HRU5FUkFMLCAiU1RBVF9TVUNDIGZyb20gJXMgZm9yICVzLCBzdGF0ZTogJWQiLCBjYWxsaW5nLAorCSAgICAgbW9uaXRvcmluZywgcmVzdWx0LT5zdGF0ZSk7CisgIGVsc2UKKyAgICB4bG9nIChEX0dFTkVSQUwsICJTVEFUX0ZBSUwgZnJvbSAlcyBmb3IgJXMsIHN0YXRlOiAlZCIsIGNhbGxpbmcsCisJICAgICBtb25pdG9yaW5nLCByZXN1bHQtPnN0YXRlKTsKKworICBleGl0ICgwKTsKK30KKworc3RhdGljIHZvaWQKK3NpbV9raWxsZXIgKGludCBzaWcpCit7CisgIHBtYXBfdW5zZXQgKHNpbV9wb3J0LCBTSU1fU01fVkVSUyk7CisgIHhsb2dfZXJyICgiU2ltdWxhdG9yIGNhdWdodCBzaWduYWwgJWQsIHVuLXJlZ2lzdGVyaW5nIGFuZCBleGl0aW5nIiwgc2lnKTsKK30KKworc3RhdGljIHZvaWQKK2RhZW1vbl9zaW11bGF0b3IgKHZvaWQpCit7CisgIHNpZ25hbCAoU0lHSFVQLCBzaW1fa2lsbGVyKTsKKyAgc2lnbmFsIChTSUdJTlQsIHNpbV9raWxsZXIpOworICBzaWduYWwgKFNJR1RFUk0sIHNpbV9raWxsZXIpOworICBwbWFwX3Vuc2V0IChzaW1fcG9ydCwgU0lNX1NNX1ZFUlMpOworICAvKiB0aGlzIHJlZ2lzdGVycyBib3RoIFVEUCBhbmQgVENQIHNlcnZpY2VzICovCisgIHJwY19pbml0KCJzdGF0ZCIsIHNpbV9wb3J0LCBTSU1fU01fVkVSUywgc2ltX3NtX3Byb2dfMSwgMCk7CisgIHN2Y19ydW4gKCk7CisgIHBtYXBfdW5zZXQgKHNpbV9wb3J0LCBTSU1fU01fVkVSUyk7Cit9CisKK3ZvaWQgKgorc2ltX3NtX21vbl8xX3N2YyAoc3RydWN0IHN0YXR1cyAqYXJncCwgc3RydWN0IHN2Y19yZXEgKnJxc3RwKQoreworICBzdGF0aWMgY2hhciAqcmVzdWx0OworCisgIHhsb2cgKERfR0VORVJBTCwgIlJlY2lldmVkIHN0YXRlICVkIGZvciBtb25fbmFtZSAlcyAob3BhcXVlIFwiJXNcIikiLAorCSAgIGFyZ3AtPnN0YXRlLCBhcmdwLT5tb25fbmFtZSwgYXJncC0+cHJpdik7CisgIHN2Y19leGl0ICgpOworICByZXR1cm4gKCh2b2lkICopJnJlc3VsdCk7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc20tbm90aWZ5LmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc20tbm90aWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OWEzZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zbS1ub3RpZnkuYwpAQCAtMCwwICsxLDczOCBAQAorLyoKKyAqIFNlbmQgTlNNIG5vdGlmeSBjYWxscyB0byBhbGwgaG9zdHMgbGlzdGVkIGluIC92YXIvbGliL3NtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgT2xhZiBLaXJjaCA8b2tpckBzdXNlLmRlPgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVyci5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c2xvZy5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGdycC5oPgorCisjaW5jbHVkZSAic29ja2FkZHIuaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisjaW5jbHVkZSAibnNtLmgiCisjaW5jbHVkZSAibmZzcnBjLmgiCisKKyNpZm5kZWYgSEFWRV9ERUNMX0FJX0FERFJDT05GSUcKKyNkZWZpbmUgQUlfQUREUkNPTkZJRwkwCisjZW5kaWYKKworI2RlZmluZSBOU01fVElNRU9VVAkyCisjZGVmaW5lIE5TTV9NQVhfVElNRU9VVAkxMjAJLyogZG9uJ3QgbWFrZSB0aGlzIHRvbyBiaWcgKi8KKworc3RydWN0IG5zbV9ob3N0IHsKKwlzdHJ1Y3QgbnNtX2hvc3QgKgluZXh0OworCWNoYXIgKgkJCW5hbWU7CisJY2hhciAqCQkJbW9uX25hbWU7CisJY2hhciAqCQkJbXlfbmFtZTsKKwlzdHJ1Y3QgYWRkcmluZm8JCSphaTsKKwl0aW1lX3QJCQlsYXN0X3VzZWQ7CisJdGltZV90CQkJc2VuZF9uZXh0OworCXVuc2lnbmVkIGludAkJdGltZW91dDsKKwl1bnNpZ25lZCBpbnQJCXJldHJpZXM7CisJdWludDMyX3QJCXhpZDsKK307CisKK3N0YXRpYyBjaGFyCQluc21faG9zdG5hbWVbMjU2XTsKK3N0YXRpYyBpbnQJCW5zbV9zdGF0ZTsKK3N0YXRpYyBpbnQJCW5zbV9mYW1pbHkgPSBBRl9JTkVUOworc3RhdGljIGludAkJb3B0X2RlYnVnID0gMDsKK3N0YXRpYyBfQm9vbAkJb3B0X3VwZGF0ZV9zdGF0ZSA9IHRydWU7CitzdGF0aWMgdW5zaWduZWQgaW50CW9wdF9tYXhfcmV0cnkgPSAxNSAqIDYwOworc3RhdGljIGNoYXIgKgkJb3B0X3NyY2FkZHIgPSBOVUxMOworc3RhdGljIGNoYXIgKgkJb3B0X3NyY3BvcnQgPSBOVUxMOworCitzdGF0aWMgdm9pZAkJbm90aWZ5KGNvbnN0IGludCBzb2NrKTsKK3N0YXRpYyBpbnQJCW5vdGlmeV9ob3N0KGludCwgc3RydWN0IG5zbV9ob3N0ICopOworc3RhdGljIHZvaWQJCXJlY3ZfcmVwbHkoaW50KTsKK3N0YXRpYyB2b2lkCQlpbnNlcnRfaG9zdChzdHJ1Y3QgbnNtX2hvc3QgKik7CitzdGF0aWMgc3RydWN0IG5zbV9ob3N0ICpmaW5kX2hvc3QodWludDMyX3QpOworc3RhdGljIGludAkJcmVjb3JkX3BpZCh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBuc21faG9zdCAqCWhvc3RzID0gTlVMTDsKKworX19hdHRyaWJ1dGVfbWFsbG9jX18KK3N0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKgorc21uX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhZGRyaW5mbwkqYWkgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyBoaW50ID0geworCQkuYWlfZmxhZ3MJPSBBSV9BRERSQ09ORklHLAorCQkuYWlfZmFtaWx5CT0gKG5zbV9mYW1pbHkgPT0gQUZfSU5FVCA/IEFGX0lORVQ6IEFGX1VOU1BFQyksCisJCS5haV9wcm90b2NvbAk9IChpbnQpSVBQUk9UT19VRFAsCisJfTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGdldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50LCAmYWkpOworCWlmIChlcnJvciAhPSAwKSB7CisJCXhsb2coRF9HRU5FUkFMLCAiZ2V0YWRkcmluZm8oMyk6ICVzIiwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBhaTsKK30KKworX19hdHRyaWJ1dGVfbWFsbG9jX18KK3N0YXRpYyBzdHJ1Y3QgbnNtX2hvc3QgKgorc21uX2FsbG9jX2hvc3QoY29uc3QgY2hhciAqaG9zdG5hbWUsIGNvbnN0IGNoYXIgKm1vbl9uYW1lLAorCQljb25zdCBjaGFyICpteV9uYW1lLCBjb25zdCB0aW1lX3QgdGltZXN0YW1wKQoreworCXN0cnVjdCBuc21faG9zdAkqaG9zdDsKKworCWhvc3QgPSBjYWxsb2MoMSwgc2l6ZW9mKCpob3N0KSk7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9tZW07CisKKwlob3N0LT5uYW1lID0gc3RyZHVwKGhvc3RuYW1lKTsKKwlob3N0LT5tb25fbmFtZSA9IHN0cmR1cChtb25fbmFtZSk7CisJaG9zdC0+bXlfbmFtZSA9IHN0cmR1cChteV9uYW1lKTsKKwlpZiAoaG9zdC0+bmFtZSA9PSBOVUxMIHx8CisJICAgIGhvc3QtPm1vbl9uYW1lID09IE5VTEwgfHwKKwkgICAgaG9zdC0+bXlfbmFtZSA9PSBOVUxMKSB7CisJCWZyZWUoaG9zdC0+bXlfbmFtZSk7CisJCWZyZWUoaG9zdC0+bW9uX25hbWUpOworCQlmcmVlKGhvc3QtPm5hbWUpOworCQlmcmVlKGhvc3QpOworCQlnb3RvIG91dF9ub21lbTsKKwl9CisKKwlob3N0LT5sYXN0X3VzZWQgPSB0aW1lc3RhbXA7CisJaG9zdC0+dGltZW91dCA9IE5TTV9USU1FT1VUOworCWhvc3QtPnJldHJpZXMgPSAxMDA7CQkvKiBmb3JjZSBhZGRyZXNzIHJldHJ5ICovCisKKwlyZXR1cm4gaG9zdDsKKworb3V0X25vbWVtOgorCXhsb2dfd2FybigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzbW5fZm9yZ2V0X2hvc3Qoc3RydWN0IG5zbV9ob3N0ICpob3N0KQoreworCXhsb2coRF9DQUxMLCAiUmVtb3ZpbmcgJXMgKCVzLCAlcykgZnJvbSBub3RpZnkgbGlzdCIsCisJCQlob3N0LT5uYW1lLCBob3N0LT5tb25fbmFtZSwgaG9zdC0+bXlfbmFtZSk7CisKKwluc21fZGVsZXRlX25vdGlmaWVkX2hvc3QoaG9zdC0+bmFtZSwgaG9zdC0+bW9uX25hbWUsIGhvc3QtPm15X25hbWUpOworCisJZnJlZShob3N0LT5teV9uYW1lKTsKKwlmcmVlKGhvc3QtPm1vbl9uYW1lKTsKKwlmcmVlKGhvc3QtPm5hbWUpOworCWlmIChob3N0LT5haSkKKwkJZnJlZWFkZHJpbmZvKGhvc3QtPmFpKTsKKworCWZyZWUoaG9zdCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3Ntbl9nZXRfaG9zdChjb25zdCBjaGFyICpob3N0bmFtZSwKKwkJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLAorCQljb25zdCBzdHJ1Y3QgbW9uICptLCBjb25zdCB0aW1lX3QgdGltZXN0YW1wKQoreworCXN0cnVjdCBuc21faG9zdAkqaG9zdDsKKworCWhvc3QgPSBzbW5fYWxsb2NfaG9zdChob3N0bmFtZSwKKwkJbS0+bW9uX2lkLm1vbl9uYW1lLCBtLT5tb25faWQubXlfaWQubXlfbmFtZSwgdGltZXN0YW1wKTsKKwlpZiAoaG9zdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWluc2VydF9ob3N0KGhvc3QpOworCXhsb2coRF9HRU5FUkFMLCAiQWRkZWQgaG9zdCAlcyB0byBub3RpZnkgbGlzdCIsIGhvc3RuYW1lKTsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIElQVjZfU1VQUE9SVEVECitzdGF0aWMgaW50IHNtbl9zb2NrZXQodm9pZCkKK3sKKwlpbnQgc29jazsKKworCS8qCisJICogVXNlIGFuIEFGX0lORVQgc29ja2V0IGlmIElQdjYgaXMgZGlzYWJsZWQgb24gdGhlCisJICogbG9jYWwgc3lzdGVtLgorCSAqLworCXNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworCWlmIChzb2NrID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFQUZOT1NVUFBPUlQpIHsKKwkJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlBDIHNvY2tldDogJW0iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCQlpZiAoc29jayA8IDApIHsKKwkJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlBDIHNvY2tldDogJW0iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZQorCQluc21fZmFtaWx5ID0gQUZfSU5FVDY7CisKKwlpZiAoZmNudGwoc29jaywgRl9TRVRGTCwgT19OT05CTE9DSykgPT0gLTEpIHsKKwkJeGxvZyhMX0VSUk9SLCAiZmNudGwoMykgb24gUlBDIHNvY2tldCBmYWlsZWQ6ICVtIik7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCS8qCisJICogVEktUlBDIG92ZXIgSVB2NiAodWRwNi90Y3A2KSBkb2VzIG5vdCBoYW5kbGUgSVB2NC4gIEhvd2V2ZXIsCisJICogc2luY2Ugc20tbm90aWZ5IG9wZW4tY29kZXMgYWxsIG9mIGl0cyBSUEMgc3VwcG9ydCwgaXQgY2FuCisJICogdXNlIGEgc2luZ2xlIHNvY2tldCBhbmQgbGV0IHRoZSBsb2NhbCBuZXR3b3JrIHN0YWNrIHByb3ZpZGUKKwkgKiB0aGUgY29ycmVjdCBtYXBwaW5nIGJldHdlZW4gYWRkcmVzcyBmYW1pbGllcyBhdXRvbWF0aWNhbGx5LgorCSAqIFRoaXMgaXMgdGhlIHNhbWUgdGhpbmcgdGhhdCBpcyBkb25lIGluIHRoZSBrZXJuZWwuCisJICovCisJaWYgKG5zbV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJY29uc3QgaW50IHplcm8gPSAwOworCQlzb2NrbGVuX3QgemVyb2xlbiA9IChzb2NrbGVuX3Qpc2l6ZW9mKHplcm8pOworCisJCWlmIChzZXRzb2Nrb3B0KHNvY2ssIFNPTF9JUFY2LCBJUFY2X1Y2T05MWSwKKwkJCQkJKGNoYXIgKikmemVybywgemVyb2xlbikgPT0gLTEpIHsKKwkJCXhsb2coTF9FUlJPUiwgInNldHNvY2tvcHQoMykgb24gUlBDIHNvY2tldCBmYWlsZWQ6ICVtIik7CisJCQlnb3RvIG91dF9jbG9zZTsKKwkJfQorCX0KKworCXJldHVybiBzb2NrOworCitvdXRfY2xvc2U6CisJKHZvaWQpY2xvc2Uoc29jayk7CisJcmV0dXJuIC0xOworfQorI2Vsc2UJLyogIUlQVjZfU1VQUE9SVEVEICovCitzdGF0aWMgaW50IHNtbl9zb2NrZXQodm9pZCkKK3sKKwlpbnQgc29jazsKKworCXNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHNvY2sgPT0gLTEpIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBSUEMgc29ja2V0OiAlbSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZjbnRsKHNvY2ssIEZfU0VURkwsIE9fTk9OQkxPQ0spID09IC0xKSB7CisJCXhsb2coTF9FUlJPUiwgImZjbnRsKDMpIG9uIFJQQyBzb2NrZXQgZmFpbGVkOiAlbSIpOworCQkodm9pZCljbG9zZShzb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBzb2NrOworfQorI2VuZGlmCS8qICFJUFY2X1NVUFBPUlRFRCAqLworCisvKgorICogSWYgYWRtaW4gc3BlY2lmaWVkIGEgc291cmNlIGFkZHJlc3Mgb3Igc3JjcG9ydCwgdGhlbiBjb252ZXJ0IHRob3NlCisgKiB0byBhIHNvY2thZGRyIGFuZCByZXR1cm4gaXQuICAgT3RoZXJ3aXNlLCByZXR1cm4gYW4gQU5ZQUREUiBhZGRyZXNzLgorICovCitfX2F0dHJpYnV0ZV9tYWxsb2NfXworc3RhdGljIHN0cnVjdCBhZGRyaW5mbyAqCitzbW5fYmluZF9hZGRyZXNzKGNvbnN0IGNoYXIgKnNyY2FkZHIsIGNvbnN0IGNoYXIgKnNyY3BvcnQpCit7CisJc3RydWN0IGFkZHJpbmZvICphaSA9IE5VTEw7CisJc3RydWN0IGFkZHJpbmZvIGhpbnQgPSB7CisJCS5haV9mbGFncwk9IEFJX05VTUVSSUNTRVJWLAorCQkuYWlfZmFtaWx5CT0gbnNtX2ZhbWlseSwKKwkJLmFpX3Byb3RvY29sCT0gKGludClJUFBST1RPX1VEUCwKKwl9OworCWludCBlcnJvcjsKKworCWlmIChzcmNhZGRyID09IE5VTEwpCisJCWhpbnQuYWlfZmxhZ3MgfD0gQUlfUEFTU0lWRTsKKworCWlmIChzcmNwb3J0ID09IE5VTEwpCisJCWVycm9yID0gZ2V0YWRkcmluZm8oc3JjYWRkciwgIiIsICZoaW50LCAmYWkpOworCWVsc2UKKwkJZXJyb3IgPSBnZXRhZGRyaW5mbyhzcmNhZGRyLCBzcmNwb3J0LCAmaGludCwgJmFpKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQl4bG9nKExfRVJST1IsCisJCQkiSW52YWxpZCBiaW5kIGFkZHJlc3Mgb3IgcG9ydCBmb3IgUlBDIHNvY2tldDogJXMiLAorCQkJCWdhaV9zdHJlcnJvcihlcnJvcikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYWk7Cit9CisKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCitzdGF0aWMgaW50CitzbW5fYmluZHJlc3Zwb3J0KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlyZXR1cm4gYmluZHJlc3Zwb3J0X3NhKHNvY2ssIHNhcCk7Cit9CisKKyNlbHNlCS8qICFIQVZFX0xJQlRJUlBDICovCitzdGF0aWMgaW50CitzbW5fYmluZHJlc3Zwb3J0KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlpZiAoc2FwLT5zYV9mYW1pbHkgIT0gQUZfSU5FVCkgeworCQllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBiaW5kcmVzdnBvcnQoc29jaywgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShjaGFyICopc2FwKTsKK30KKyNlbmRpZgkvKiAhSEFWRV9MSUJUSVJQQyAqLworCisvKgorICogUHJlcGFyZSBhIHNvY2tldCBmb3Igc2VuZGluZyBSUEMgcmVxdWVzdHMKKyAqCisgKiBSZXR1cm5zIGEgYm91bmQgZGF0YWdyYW0gc29ja2V0IGZpbGUgZGVzY3JpcHRvciwgb3IgLTEgaWYKKyAqIGFuIGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIGludAorc21uX2NyZWF0ZV9zb2NrZXQoY29uc3QgY2hhciAqc3JjYWRkciwgY29uc3QgY2hhciAqc3JjcG9ydCkKK3sKKwlpbnQgc29jaywgcmV0cnlfY250ID0gMDsKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworCityZXRyeToKKwlzb2NrID0gc21uX3NvY2tldCgpOworCWlmIChzb2NrID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlhaSA9IHNtbl9iaW5kX2FkZHJlc3Moc3JjYWRkciwgc3JjcG9ydCk7CisJaWYgKGFpID09IE5VTEwpIHsKKwkJKHZvaWQpY2xvc2Uoc29jayk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBVc2Ugc291cmNlIHBvcnQgaWYgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQgbGluZSwKKwkgKiBvdGhlcndpc2UgdXNlIGJpbmRyZXN2cG9ydCAqLworCWlmIChzcmNwb3J0KSB7CisJCWlmIChiaW5kKHNvY2ssIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikgPT0gLTEpIHsKKwkJCXhsb2coTF9FUlJPUiwgIkZhaWxlZCB0byBiaW5kIFJQQyBzb2NrZXQ6ICVtIik7CisJCQlmcmVlYWRkcmluZm8oYWkpOworCQkJKHZvaWQpY2xvc2Uoc29jayk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2VydmVudCAqc2U7CisKKwkJaWYgKHNtbl9iaW5kcmVzdnBvcnQoc29jaywgYWktPmFpX2FkZHIpID09IC0xKSB7CisJCQl4bG9nKExfRVJST1IsCisJCQkJImJpbmRyZXN2cG9ydCBvbiBSUEMgc29ja2V0IGZhaWxlZDogJW0iKTsKKwkJCWZyZWVhZGRyaW5mbyhhaSk7CisJCQkodm9pZCljbG9zZShzb2NrKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIHRyeSB0byBhdm9pZCBrbm93biBwb3J0cyAqLworCQlzZSA9IGdldHNlcnZieXBvcnQoKGludCluZnNfZ2V0X3BvcnQoYWktPmFpX2FkZHIpLCAidWRwIik7CisJCWlmIChzZSAhPSBOVUxMICYmIHJldHJ5X2NudCA8IDEwMCkgeworCQkJcmV0cnlfY250Kys7CisJCQlmcmVlYWRkcmluZm8oYWkpOworCQkJKHZvaWQpY2xvc2Uoc29jayk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCisJZnJlZWFkZHJpbmZvKGFpKTsKKwlyZXR1cm4gc29jazsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQJYywgc29jaywgZm9yY2UgPSAwOworCWNoYXIgKglwcm9nbmFtZTsKKworCXByb2duYW1lID0gc3RycmNocihhcmd2WzBdLCAnLycpOworCWlmIChwcm9nbmFtZSAhPSBOVUxMKQorCQlwcm9nbmFtZSsrOworCWVsc2UKKwkJcHJvZ25hbWUgPSBhcmd2WzBdOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkbTpucDp2OlA6ZiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisJCQlmb3JjZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlvcHRfZGVidWcrKzsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCW9wdF9tYXhfcmV0cnkgPSBhdG9pKG9wdGFyZykgKiA2MDsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW9wdF91cGRhdGVfc3RhdGUgPSBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCW9wdF9zcmNwb3J0ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJb3B0X3NyY2FkZHIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlpZiAoIW5zbV9zZXR1cF9wYXRobmFtZXMoYXJndlswXSwgb3B0YXJnKSkKKwkJCQlleGl0KDEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWdvdG8gdXNhZ2U7CisJCX0KKwl9CisKKwlpZiAob3B0aW5kIDwgYXJnYykgewordXNhZ2U6CQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJVc2FnZTogJXMgLW5vdGlmeSBbLWRmcV0gWy1tIG1heC1yZXRyeS1taW51dGVzXSBbLXAgc3JjcG9ydF1cbiIKKwkJCSIgICAgICAgICAgICBbLVAgL3BhdGgvdG8vc3RhdGUvZGlyZWN0b3J5XSBbLXYgbXlfaG9zdF9uYW1lXVxuIiwKKwkJCXByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwl4bG9nX3N5c2xvZygxKTsKKwlpZiAob3B0X2RlYnVnKSB7CisJCXhsb2dfc3RkZXJyKDEpOworCQl4bG9nX2NvbmZpZyhEX0FMTCwgMSk7CisJfSBlbHNlCisJCXhsb2dfc3RkZXJyKDApOworCisJeGxvZ19vcGVuKHByb2duYW1lKTsKKwl4bG9nKExfTk9USUNFLCAiVmVyc2lvbiAiIFZFUlNJT04gIiBzdGFydGluZyIpOworCisJaWYgKG5zbV9pc19kZWZhdWx0X3BhcmVudGRpcigpKSB7CisJCWlmIChyZWNvcmRfcGlkKCkgPT0gMCAmJiBmb3JjZSA9PSAwICYmIG9wdF91cGRhdGVfc3RhdGUpIHsKKwkJCS8qIGFscmVhZHkgcnVuLCBkb24ndCB0cnkgYWdhaW4gKi8KKwkJCXhsb2coTF9OT1RJQ0UsICJBbHJlYWR5IG5vdGlmeWluZyBjbGllbnRzOyBFeGl0aW5nISIpOworCQkJZXhpdCgwKTsKKwkJfQorCX0KKworCWlmIChvcHRfc3JjYWRkcikgeworCQlzdHJuY3B5KG5zbV9ob3N0bmFtZSwgb3B0X3NyY2FkZHIsIHNpemVvZihuc21faG9zdG5hbWUpLTEpOworCX0gZWxzZQorCWlmIChnZXRob3N0bmFtZShuc21faG9zdG5hbWUsIHNpemVvZihuc21faG9zdG5hbWUpKSA8IDApIHsKKwkJeGxvZyhMX0VSUk9SLCAiRmFpbGVkIHRvIG9idGFpbiBuYW1lIG9mIGxvY2FsIGhvc3Q6ICVtIik7CisJCWV4aXQoMSk7CisJfQorCisJKHZvaWQpbnNtX3JldGlyZV9tb25pdG9yZWRfaG9zdHMoKTsKKwlpZiAobnNtX2xvYWRfbm90aWZ5X2xpc3Qoc21uX2dldF9ob3N0KSA9PSAwKSB7CisJCXhsb2coRF9HRU5FUkFMLCAiTm8gaG9zdHMgdG8gbm90aWZ5OyBleGl0aW5nIik7CisJCXJldHVybiAwOworCX0KKworCW5zbV9zdGF0ZSA9IG5zbV9nZXRfc3RhdGUob3B0X3VwZGF0ZV9zdGF0ZSk7CisJaWYgKG5zbV9zdGF0ZSA9PSAwKQorCQlleGl0KDEpOworCW5zbV91cGRhdGVfa2VybmVsX3N0YXRlKG5zbV9zdGF0ZSk7CisKKwlpZiAoIW9wdF9kZWJ1ZykgeworCQl4bG9nKExfTk9USUNFLCAiQmFja2dyb3VuZGluZyB0byBub3RpZnkgaG9zdHMuLi5cbiIpOworCisJCWlmIChkYWVtb24oMCwgMCkgPCAwKSB7CisJCQl4bG9nKExfRVJST1IsICJ1bmFibGUgdG8gYmFja2dyb3VuZDogJW0iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQljbG9zZSgwKTsKKwkJY2xvc2UoMSk7CisJCWNsb3NlKDIpOworCX0KKworCXNvY2sgPSBzbW5fY3JlYXRlX3NvY2tldChvcHRfc3JjYWRkciwgb3B0X3NyY3BvcnQpOworCWlmIChzb2NrID09IC0xKQorCQlleGl0KDEpOworCisJaWYgKCFuc21fZHJvcF9wcml2aWxlZ2VzKC0xKSkKKwkJZXhpdCgxKTsKKworCW5vdGlmeShzb2NrKTsKKworCWlmIChob3N0cykgeworCQlzdHJ1Y3QgbnNtX2hvc3QJKmhwOworCisJCXdoaWxlICgoaHAgPSBob3N0cykgIT0gMCkgeworCQkJaG9zdHMgPSBocC0+bmV4dDsKKwkJCXhsb2coTF9OT1RJQ0UsICJVbmFibGUgdG8gbm90aWZ5ICVzLCBnaXZpbmcgdXAiLAorCQkJCWhwLT5uYW1lKTsKKwkJfQorCQlleGl0KDEpOworCX0KKworCWV4aXQoMCk7Cit9CisKKy8qCisgKiBOb3RpZnkgaG9zdHMKKyAqLworc3RhdGljIHZvaWQKK25vdGlmeShjb25zdCBpbnQgc29jaykKK3sKKwl0aW1lX3QJZmFpbHRpbWUgPSAwOworCisJaWYgKG9wdF9tYXhfcmV0cnkpCisJCWZhaWx0aW1lID0gdGltZShOVUxMKSArIG9wdF9tYXhfcmV0cnk7CisKKwl3aGlsZSAoaG9zdHMpIHsKKwkJc3RydWN0IHBvbGxmZAlwZmQ7CisJCXRpbWVfdAkJbm93ID0gdGltZShOVUxMKTsKKwkJdW5zaWduZWQgaW50CXNlbnQgPSAwOworCQlzdHJ1Y3QgbnNtX2hvc3QJKmhwOworCQlsb25nCQl3YWl0OworCisJCWlmIChmYWlsdGltZSAmJiBub3cgPj0gZmFpbHRpbWUpCisJCQlicmVhazsKKworCQl3aGlsZSAoaG9zdHMgJiYgKCh3YWl0ID0gaG9zdHMtPnNlbmRfbmV4dCAtIG5vdykgPD0gMCkpIHsKKwkJCS8qIE5ldmVyIHNlbmQgbW9yZSB0aGFuIDEwIHBhY2tldHMgYXQgb25jZSAqLworCQkJaWYgKHNlbnQrKyA+PSAxMCkKKwkJCQlicmVhazsKKworCQkJLyogUmVtb3ZlIHF1ZXVlIGhlYWQgKi8KKwkJCWhwID0gaG9zdHM7CisJCQlob3N0cyA9IGhwLT5uZXh0OworCisJCQlpZiAobm90aWZ5X2hvc3Qoc29jaywgaHApKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBTZXQgdGhlIHRpbWVvdXQgZm9yIHRoaXMgY2FsbCwgdXNpbmcgYW4KKwkJCSAgIGV4cG9uZW50aWFsIHRpbWVvdXQgc3RyYXRlZ3kgKi8KKwkJCXdhaXQgPSBocC0+dGltZW91dDsKKwkJCWlmICgoaHAtPnRpbWVvdXQgPDw9IDEpID4gTlNNX01BWF9USU1FT1VUKQorCQkJCWhwLT50aW1lb3V0ID0gTlNNX01BWF9USU1FT1VUOworCQkJaHAtPnNlbmRfbmV4dCA9IG5vdyArIHdhaXQ7CisJCQlocC0+cmV0cmllcysrOworCisJCQlpbnNlcnRfaG9zdChocCk7CisJCX0KKwkJaWYgKGhvc3RzID09IE5VTEwpCisJCQlyZXR1cm47CisKKwkJeGxvZyhEX0dFTkVSQUwsICJIb3N0ICVzIGR1ZSBpbiAlbGQgc2Vjb25kcyIsCisJCQkJaG9zdHMtPm5hbWUsIHdhaXQpOworCisJCXBmZC5mZCA9IHNvY2s7CisJCXBmZC5ldmVudHMgPSBQT0xMSU47CisKKwkJd2FpdCAqPSAxMDAwOworCQlpZiAod2FpdCA8IDEwMCkKKwkJCXdhaXQgPSAxMDA7CisJCWlmIChwb2xsKCZwZmQsIDEsIHdhaXQpICE9IDEpCisJCQljb250aW51ZTsKKworCQlyZWN2X3JlcGx5KHNvY2spOworCX0KK30KKworLyoKKyAqIFNlbmQgbm90aWZpY2F0aW9uIHRvIGEgc2luZ2xlIGhvc3QKKyAqLworc3RhdGljIGludAorbm90aWZ5X2hvc3QoaW50IHNvY2ssIHN0cnVjdCBuc21faG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhcDsKKwlzb2NrbGVuX3Qgc2FsZW47CisKKwlpZiAoaG9zdC0+YWkgPT0gTlVMTCkgeworCQlob3N0LT5haSA9IHNtbl9sb29rdXAoaG9zdC0+bmFtZSk7CisJCWlmIChob3N0LT5haSA9PSBOVUxMKSB7CisJCQl4bG9nX3dhcm4oIkROUyByZXNvbHV0aW9uIG9mICVzIGZhaWxlZDsgIgorCQkJCSJyZXRyeWluZyBsYXRlciIsIGhvc3QtPm5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSByZXRyYW5zbWl0dGVkIDQgdGltZXMsIHJlc2V0IHRoZSBwb3J0IHRvIGZvcmNlCisJICogYSBuZXcgcG9ydG1hcCBsb29rdXAgKGluIGNhc2Ugc3RhdGQgd2FzIHJlc3RhcnRlZCkuCisJICogV2UgYWxzbyByb3RhdGUgdGhyb3VnaCBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgYXQgdGhpcworCSAqIHBvaW50LgorCSAqLworCWlmIChob3N0LT5yZXRyaWVzID49IDQpIHsKKwkJLyogZG9uJ3Qgcm90YXRlIGlmIHRoZXJlIGlzIG9ubHkgb25lIGFkZHJpbmZvICovCisJCWlmIChob3N0LT5haS0+YWlfbmV4dCAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgYWRkcmluZm8gKmZpcnN0ID0gaG9zdC0+YWk7CisJCQlzdHJ1Y3QgYWRkcmluZm8gKipuZXh0ID0gJmhvc3QtPmFpOworCisJCQkvKiByZW1vdmUgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIGxpc3QgKi8KKwkJCWhvc3QtPmFpID0gZmlyc3QtPmFpX25leHQ7CisJCQlmaXJzdC0+YWlfbmV4dCA9IE5VTEw7CisJCQkvKiBmaW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwkJCW5leHQgPSAmZmlyc3QtPmFpX25leHQ7CisJCQl3aGlsZSAoICpuZXh0ICkKKwkJCQluZXh0ID0gJiAoKm5leHQpLT5haV9uZXh0OworCQkJLyogcHV0IGZpcnN0IGVudHJ5IGF0IGVuZCAqLworCQkJKm5leHQgPSBmaXJzdDsKKwkJfQorCisJCW5mc19zZXRfcG9ydChob3N0LT5haS0+YWlfYWRkciwgMCk7CisJCWhvc3QtPnJldHJpZXMgPSAwOworCX0KKworCXNhcCA9IGhvc3QtPmFpLT5haV9hZGRyOworCXNhbGVuID0gaG9zdC0+YWktPmFpX2FkZHJsZW47CisKKwlpZiAobmZzX2dldF9wb3J0KHNhcCkgPT0gMCkKKwkJaG9zdC0+eGlkID0gbnNtX3htaXRfcnBjYmluZChzb2NrLCBzYXAsIFNNX1BST0csIFNNX1ZFUlMpOworCWVsc2UKKwkJaG9zdC0+eGlkID0gbnNtX3htaXRfbm90aWZ5KHNvY2ssIHNhcCwgc2FsZW4sCisJCQkJU01fUFJPRywgbnNtX2hvc3RuYW1lLCBuc21fc3RhdGUpOworCQorCXJldHVybiAwOworfQorCisvKgorICogRXh0cmFjdCB0aGUgcmV0dXJuZWQgcG9ydCBudW1iZXIgYW5kIHNldCB1cCB0aGUgU01fTk9USUZZIGNhbGwuCisgKi8KK3N0YXRpYyB2b2lkCityZWN2X3JwY2JpbmRfcmVwbHkoc3RydWN0IHNvY2thZGRyICpzYXAsIHN0cnVjdCBuc21faG9zdCAqaG9zdCwgWERSICp4ZHIpCit7CisJdWludDE2X3QgcG9ydCA9IG5zbV9yZWN2X3JwY2JpbmQoc2FwLT5zYV9mYW1pbHksIHhkcik7CisKKwlob3N0LT5zZW5kX25leHQgPSB0aW1lKE5VTEwpOworCWhvc3QtPnhpZCA9IDA7CisKKwlpZiAocG9ydCA9PSAwKSB7CisJCS8qIE5vIGJpbmRpbmcgZm9yIHN0YXRkLi4uICovCisJCXhsb2coRF9HRU5FUkFMLCAiTm8gc3RhdGQgb24gaG9zdCAlcyIsIGhvc3QtPm5hbWUpOworCQlob3N0LT50aW1lb3V0ID0gTlNNX01BWF9USU1FT1VUOworCQlob3N0LT5zZW5kX25leHQgKz0gTlNNX01BWF9USU1FT1VUOworCX0gZWxzZSB7CisJCW5mc19zZXRfcG9ydChzYXAsIHBvcnQpOworCQlpZiAoaG9zdC0+dGltZW91dCA+PSBOU01fTUFYX1RJTUVPVVQgLyA0KQorCQkJaG9zdC0+dGltZW91dCA9IE5TTV9NQVhfVElNRU9VVCAvIDQ7CisJfQorCisJaW5zZXJ0X2hvc3QoaG9zdCk7Cit9CisKKy8qCisgKiBTdWNjZXNzZnVsIE5PVElGWSBjYWxsLiBTZXJ2ZXIgcmV0dXJucyB2b2lkLCBzbyBub3RoaW5nCisgKiB3ZSBuZWVkIHRvIGRvIGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCityZWN2X25vdGlmeV9yZXBseShzdHJ1Y3QgbnNtX2hvc3QgKmhvc3QpCit7CisJeGxvZyhEX0dFTkVSQUwsICJIb3N0ICVzIG5vdGlmaWVkIHN1Y2Nlc3NmdWxseSIsIGhvc3QtPm5hbWUpOworCisJc21uX2ZvcmdldF9ob3N0KGhvc3QpOworfQorCisvKgorICogUmVjZWl2ZSByZXBseSBmcm9tIHJlbW90ZSBob3N0CisgKi8KK3N0YXRpYyB2b2lkCityZWN2X3JlcGx5KGludCBzb2NrKQoreworCXN0cnVjdCBuc21faG9zdAkqaHA7CisJc3RydWN0IHNvY2thZGRyICpzYXA7CisJY2hhciBtc2didWZbTlNNX01BWE1TR1NJWkVdOworCXVpbnQzMl90CXhpZDsKKwlzc2l6ZV90CQltc2dsZW47CisJWERSCQl4ZHI7CisKKwltZW1zZXQobXNnYnVmLCAwICwgc2l6ZW9mKG1zZ2J1ZikpOworCW1zZ2xlbiA9IHJlY3Yoc29jaywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgMCk7CisJaWYgKG1zZ2xlbiA8IDApCisJCXJldHVybjsKKworCXhsb2coRF9HRU5FUkFMLCAiUmVjZWl2ZWQgcGFja2V0Li4uIik7CisKKwltZW1zZXQoJnhkciwgMCwgc2l6ZW9mKHhkcikpOworCXhkcm1lbV9jcmVhdGUoJnhkciwgbXNnYnVmLCAodW5zaWduZWQgaW50KW1zZ2xlbiwgWERSX0RFQ09ERSk7CisJeGlkID0gbnNtX3BhcnNlX3JlcGx5KCZ4ZHIpOworCWlmICh4aWQgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBCZWZvcmUgd2UgbG9vayBhdCB0aGUgZGF0YSwgZmluZCB0aGUgaG9zdCBzdHJ1Y3QgZm9yCisJICAgdGhpcyByZXBseSAqLworCWlmICgoaHAgPSBmaW5kX2hvc3QoeGlkKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzYXAgPSBocC0+YWktPmFpX2FkZHI7CisJaWYgKG5mc19nZXRfcG9ydChzYXApID09IDApCisJCXJlY3ZfcnBjYmluZF9yZXBseShzYXAsIGhwLCAmeGRyKTsKKwllbHNlCisJCXJlY3Zfbm90aWZ5X3JlcGx5KGhwKTsKKworb3V0OgorCXhkcl9kZXN0cm95KCZ4ZHIpOworfQorCisvKgorICogSW5zZXJ0IGhvc3QgaW50byBzb3J0ZWQgbGlzdAorICovCitzdGF0aWMgdm9pZAoraW5zZXJ0X2hvc3Qoc3RydWN0IG5zbV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBuc21faG9zdAkqKndoZXJlLCAqcDsKKworCXdoZXJlID0gJmhvc3RzOworCXdoaWxlICgocCA9ICp3aGVyZSkgIT0gMCkgeworCQkvKiBTb3J0IGluIGFzY2VuZGluZyBvcmRlciBvZiB0aW1lb3V0ICovCisJCWlmIChob3N0LT5zZW5kX25leHQgPCBwLT5zZW5kX25leHQpCisJCQlicmVhazsKKwkJLyogSWYgd2UgaGF2ZSB0aGUgc2FtZSB0aW1lb3V0LCBwdXQgdGhlCisJCSAqIG1vc3QgcmVjZW50bHkgdXNlZCBob3N0IGZpcnN0LgorCQkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCAicmVjZW50IiBob3N0cworCQkgKiBnZXQgbm90aWZpZWQgZmlyc3QuCisJCSAqLworCQlpZiAoaG9zdC0+c2VuZF9uZXh0ID09IHAtPnNlbmRfbmV4dAorCQkgJiYgaG9zdC0+bGFzdF91c2VkID4gcC0+bGFzdF91c2VkKQorCQkJYnJlYWs7CisJCXdoZXJlID0gJnAtPm5leHQ7CisJfQorCisJaG9zdC0+bmV4dCA9ICp3aGVyZTsKKwkqd2hlcmUgPSBob3N0OworfQorCisvKgorICogRmluZCBob3N0IGdpdmVuIHRoZSBYSUQKKyAqLworc3RhdGljIHN0cnVjdCBuc21faG9zdCAqCitmaW5kX2hvc3QodWludDMyX3QgeGlkKQoreworCXN0cnVjdCBuc21faG9zdAkqKndoZXJlLCAqcDsKKworCXdoZXJlID0gJmhvc3RzOworCXdoaWxlICgocCA9ICp3aGVyZSkgIT0gMCkgeworCQlpZiAocC0+eGlkID09IHhpZCkgeworCQkJKndoZXJlID0gcC0+bmV4dDsKKwkJCXJldHVybiBwOworCQl9CisJCXdoZXJlID0gJnAtPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVjb3JkIHBpZCBpbiAvdmFyL3J1bi9zbS1ub3RpZnkucGlkCisgKiBUaGlzIGZpbGUgc2hvdWxkIHJlbWFpbiB1bnRpbCBhIHJlYm9vdCwgZXZlbiBpZiB0aGUKKyAqIHByb2dyYW0gZXhpdHMuCisgKiBJZiBmaWxlIGFscmVhZHkgZXhpc3RzLCBmYWlsLgorICovCitzdGF0aWMgaW50IHJlY29yZF9waWQodm9pZCkKK3sKKwljaGFyIHBpZFsyMF07CisJc3NpemVfdCBsZW47CisJaW50IGZkOworCisJKHZvaWQpc25wcmludGYocGlkLCBzaXplb2YocGlkKSwgIiVkXG4iLCAoaW50KWdldHBpZCgpKTsKKwlmZCA9IG9wZW4oIi92YXIvcnVuL3NtLW5vdGlmeS5waWQiLCBPX0NSRUFUfE9fRVhDTHxPX1dST05MWSwgMDYwMCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSB3cml0ZShmZCwgcGlkLCBzdHJsZW4ocGlkKSk7CisJaWYgKChsZW4gPCAwKSB8fCAoKHNpemVfdClsZW4gIT0gc3RybGVuKHBpZCkpKSB7CisJCXhsb2dfd2FybigiV3JpdGluZyB0byBwaWQgZmlsZSBmYWlsZWQ6IGVycm5vICVkICglbSkiLAorCQkJCWVycm5vKTsKKwl9CisKKwkodm9pZCljbG9zZShmZCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc20tbm90aWZ5Lm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zbS1ub3RpZnkubWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzcxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc20tbm90aWZ5Lm1hbgpAQCAtMCwwICsxLDMxNSBAQAorLlwiQCgjKXNtLW5vdGlmeS44IgorLlwiCisuXCIgQ29weXJpZ2h0IChDKSAyMDA0IE9sYWYgS2lyY2ggPG9raXJAc3VzZS5kZT4KKy5cIgorLlwiIFJld3JpdHRlbiBieSBDaHVjayBMZXZlciA8Y2h1Y2subGV2ZXJAb3JhY2xlLmNvbT4sIDIwMDkuCisuXCIgQ29weXJpZ2h0IDIwMDkgT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlRIIFNNLU5PVElGWSA4ICIxIE5vdmVtYmVyIDIwMDkKKy5TSCBOQU1FCitzbS1ub3RpZnkgXC0gc2VuZCByZWJvb3Qgbm90aWZpY2F0aW9ucyB0byBORlMgcGVlcnMKKy5TSCBTWU5PUFNJUworLkJJICIvdXNyL3NiaW4vc20tbm90aWZ5IFstZGZuXSBbLW0gIiBtaW51dGVzICJdIFstdiAiIG5hbWUgIl0gWy1wICIgbm90aWZ5LXBvcnQgIl0gWy1QICIgcGF0aCAiXQorLlNIIERFU0NSSVBUSU9OCitGaWxlIGxvY2tzIGFyZSBub3QgcGFydCBvZiBwZXJzaXN0ZW50IGZpbGUgc3lzdGVtIHN0YXRlLgorTG9jayBzdGF0ZSBpcyB0aHVzIGxvc3Qgd2hlbiBhIGhvc3QgcmVib290cy4KKy5QUAorTmV0d29yayBmaWxlIHN5c3RlbXMgbXVzdCBhbHNvIGRldGVjdCB3aGVuIGxvY2sgc3RhdGUgaXMgbG9zdAorYmVjYXVzZSBhIHJlbW90ZSBob3N0IGhhcyByZWJvb3RlZC4KK0FmdGVyIGFuIE5GUyBjbGllbnQgcmVib290cywgYW4gTkZTIHNlcnZlciBtdXN0IHJlbGVhc2UgYWxsIGZpbGUgbG9ja3MKK2hlbGQgYnkgYXBwbGljYXRpb25zIHRoYXQgd2VyZSBydW5uaW5nIG9uIHRoYXQgY2xpZW50LgorQWZ0ZXIgYSBzZXJ2ZXIgcmVib290cywgYSBjbGllbnQgbXVzdCByZW1pbmQgdGhlCitzZXJ2ZXIgb2YgZmlsZSBsb2NrcyBoZWxkIGJ5IGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoYXQgY2xpZW50LgorLlBQCitGb3IgTkZTIHZlcnNpb24gMiBhbmQgdmVyc2lvbiAzLCB0aGUKKy5JIE5ldHdvcmsgU3RhdHVzIE1vbml0b3IKK3Byb3RvY29sIChvciBOU00gZm9yIHNob3J0KQoraXMgdXNlZCB0byBub3RpZnkgTkZTIHBlZXJzIG9mIHJlYm9vdHMuCitPbiBMaW51eCwgdHdvIHNlcGFyYXRlIHVzZXItc3BhY2UgY29tcG9uZW50cyBjb25zdGl0dXRlIHRoZSBOU00gc2VydmljZToKKy5UUAorLkIgc20tbm90aWZ5CitBIGhlbHBlciBwcm9ncmFtIHRoYXQgbm90aWZpZXMgTkZTIHBlZXJzIGFmdGVyIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cworLlRQCisuQiBycGMuc3RhdGQKK0EgZGFlbW9uIHRoYXQgbGlzdGVucyBmb3IgcmVib290IG5vdGlmaWNhdGlvbnMgZnJvbSBvdGhlciBob3N0cywgYW5kCittYW5hZ2VzIHRoZSBsaXN0IG9mIGhvc3RzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGxvY2FsIHN5c3RlbSByZWJvb3RzCisuUFAKK1RoZSBsb2NhbCBORlMgbG9jayBtYW5hZ2VyIGFsZXJ0cyBpdHMgbG9jYWwKKy5CIHJwYy5zdGF0ZAorb2YgZWFjaCByZW1vdGUgcGVlciB0aGF0IHNob3VsZCBiZSBtb25pdG9yZWQuCitXaGVuIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cywgdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgbm90aWZpZXMgdGhlIE5TTSBzZXJ2aWNlIG9uIG1vbml0b3JlZCBwZWVycyBvZiB0aGUgcmVib290LgorV2hlbiBhIHJlbW90ZSByZWJvb3RzLCB0aGF0IHBlZXIgbm90aWZpZXMgdGhlIGxvY2FsCisuQlIgcnBjLnN0YXRkICwKK3doaWNoIGluIHR1cm4gcGFzc2VzIHRoZSByZWJvb3Qgbm90aWZpY2F0aW9uCitiYWNrIHRvIHRoZSBsb2NhbCBORlMgbG9jayBtYW5hZ2VyLgorLlNIIE5TTSBPUEVSQVRJT04gSU4gREVUQUlMCitUaGUgZmlyc3QgZmlsZSBsb2NraW5nIGludGVyYWN0aW9uIGJldHdlZW4gYW4gTkZTIGNsaWVudCBhbmQgc2VydmVyIGNhdXNlcwordGhlIE5GUyBsb2NrIG1hbmFnZXJzIG9uIGJvdGggcGVlcnMgdG8gY29udGFjdCB0aGVpciBsb2NhbCBOU00gc2VydmljZSB0bworc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wcG9zaXRlIHBlZXIuCitPbiBMaW51eCwgdGhlIGxvY2FsIGxvY2sgbWFuYWdlciBjb250YWN0cworLkJSIHJwYy5zdGF0ZCAuCisuUFAKKy5CIHJwYy5zdGF0ZAorcmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG1vbml0b3JlZCBORlMgcGVlciBvbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCitUaGlzIGluZm9ybWF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY29udGFjdCBhIHJlbW90ZSBwZWVyCitpbiBjYXNlIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cywKK2hvdyB0byByZWNvZ25pemUgd2hpY2ggbW9uaXRvcmVkIHBlZXIgaXMgcmVwb3J0aW5nIGEgcmVib290LAorYW5kIGhvdyB0byBub3RpZnkgdGhlIGxvY2FsIGxvY2sgbWFuYWdlciB3aGVuIGEgbW9uaXRvcmVkIHBlZXIKK2luZGljYXRlcyBpdCBoYXMgcmVib290ZWQuCisuUFAKK0FuIE5GUyBjbGllbnQgc2VuZHMgYSBob3N0bmFtZSwga25vd24gYXMgdGhlIGNsaWVudCdzCisuSVIgY2FsbGVyX25hbWUgLAoraW4gZWFjaCBmaWxlIGxvY2sgcmVxdWVzdC4KK0FuIE5GUyBzZXJ2ZXIgY2FuIHVzZSB0aGlzIGhvc3RuYW1lIHRvIHNlbmQgYXN5bmNocm9ub3VzIEdSQU5UCitjYWxscyB0byBhIGNsaWVudCwgb3IgdG8gbm90aWZ5IHRoZSBjbGllbnQgaXQgaGFzIHJlYm9vdGVkLgorLlBQCitUaGUgTGludXggTkZTIHNlcnZlciBjYW4gcHJvdmlkZSB0aGUgY2xpZW50J3MKKy5JIGNhbGxlcl9uYW1lCitvciB0aGUgY2xpZW50J3MgbmV0d29yayBhZGRyZXNzIHRvCisuQlIgcnBjLnN0YXRkIC4KK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhlIE5TTSBwcm90b2NvbCwKK3RoaXMgbmFtZSBvciBhZGRyZXNzIGlzIGtub3duIGFzIHRoZSBtb25pdG9yZWQgcGVlcidzCisuSVIgbW9uX25hbWUgLgorSW4gYWRkaXRpb24sIHRoZSBsb2NhbCBsb2NrIG1hbmFnZXIgdGVsbHMKKy5CIHJwYy5zdGF0ZAord2hhdCBpdCB0aGlua3MgaXRzIG93biBob3N0bmFtZSBpcy4KK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhlIE5TTSBwcm90b2NvbCwKK3RoaXMgaG9zdG5hbWUgaXMga25vd24gYXMKKy5JUiBteV9uYW1lIC4KKy5QUAorVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBpbnRlcmFjdGlvbiBiZXR3ZWVuIGFuIE5GUyBzZXJ2ZXIgYW5kIGEgY2xpZW50Cit0byBpbmZvcm0gdGhlIGNsaWVudCBvZiB0aGUgc2VydmVyJ3MKKy5JUiBjYWxsZXJfbmFtZSAuCitUaGVyZWZvcmUgTkZTIGNsaWVudHMgZG8gbm90IGFjdHVhbGx5IGtub3cgd2hhdAorLkkgbW9uX25hbWUKK2FuIE5GUyBzZXJ2ZXIgbWlnaHQgdXNlIGluIGFuIFNNX05PVElGWSByZXF1ZXN0LgorVGhlIExpbnV4IE5GUyBjbGllbnQgcmVjb3JkcyB0aGUgc2VydmVyJ3MgaG9zdG5hbWUgdXNlZCBvbiB0aGUgbW91bnQgY29tbWFuZAordG8gaWRlbnRpZnkgcmVib290aW5nIE5GUyBzZXJ2ZXJzLgorLlNTIFJlYm9vdCBub3RpZmljYXRpb24KK1doZW4gdGhlIGxvY2FsIHN5c3RlbSByZWJvb3RzLCB0aGUKKy5CIHNtLW5vdGlmeQorY29tbWFuZCByZWFkcyB0aGUgbGlzdCBvZiBtb25pdG9yZWQgcGVlcnMgZnJvbSBwZXJzaXN0ZW50IHN0b3JhZ2UgYW5kCitzZW5kcyBhbiBTTV9OT1RJRlkgcmVxdWVzdCB0byB0aGUgTlNNIHNlcnZpY2Ugb24gZWFjaCBsaXN0ZWQgcmVtb3RlIHBlZXIuCitJdCB1c2VzIHRoZQorLkkgbW9uX25hbWUKK3N0cmluZyBhcyB0aGUgZGVzdGluYXRpb24uCitUbyBpZGVudGlmeSB3aGljaCBob3N0IGhhcyByZWJvb3RlZCwgdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgbm9ybWFsbHkgc2VuZHMgdGhlIHJlc3VsdHMgb2YKKy5CUiBnZXRob3N0bmFtZSAoMykKK2FzIHRoZQorLkkgbXlfbmFtZQorc3RyaW5nLgorVGhlIHJlbW90ZQorLkIgcnBjLnN0YXRkCittYXRjaGVzIGluY29taW5nIFNNX05PVElGWSByZXF1ZXN0cyB1c2luZyB0aGlzIHN0cmluZywKK29yIHRoZSBjYWxsZXIncyBuZXR3b3JrIGFkZHJlc3MsCit0byBvbmUgb3IgbW9yZSBwZWVycyBvbiBpdHMgb3duIG1vbml0b3IgbGlzdC4KKy5QUAorSWYKKy5CIHJwYy5zdGF0ZAorZG9lcyBub3QgZmluZCBhIHBlZXIgb24gaXRzIG1vbml0b3IgbGlzdCB0aGF0IG1hdGNoZXMKK2FuIGluY29taW5nIFNNX05PVElGWSByZXF1ZXN0LAordGhlIG5vdGlmaWNhdGlvbiBpcyBub3QgZm9yd2FyZGVkIHRvIHRoZSBsb2NhbCBsb2NrIG1hbmFnZXIuCitJbiBhZGRpdGlvbiwgZWFjaCBwZWVyIGhhcyBpdHMgb3duCisuSVIgIk5TTSBzdGF0ZSBudW1iZXIiICwKK2EgMzItYml0IGludGVnZXIgdGhhdCBpcyBidW1wZWQgYWZ0ZXIgZWFjaCByZWJvb3QgYnkgdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQuCisuQiBycGMuc3RhdGQKK3VzZXMgdGhpcyBudW1iZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhY3R1YWwgcmVib290cworYW5kIHJlcGxheWVkIG5vdGlmaWNhdGlvbnMuCisuUFAKK1BhcnQgb2YgTkZTIGxvY2sgcmVjb3ZlcnkgaXMgcmVkaXNjb3ZlcmluZword2hpY2ggcGVlcnMgbmVlZCB0byBiZSBtb25pdG9yZWQgYWdhaW4uCitUaGUKKy5CIHNtLW5vdGlmeQorY29tbWFuZCBjbGVhcnMgdGhlIG1vbml0b3IgbGlzdCBvbiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWZ0ZXIgZWFjaCByZWJvb3QuCisuU0ggT1BUSU9OUworLlRQCisuQiAtZAorS2VlcHMKKy5CIHNtLW5vdGlmeQorYXR0YWNoZWQgdG8gaXRzIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGFuZCBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kCitzbyB0aGF0IG5vdGlmaWNhdGlvbiBwcm9ncmVzcyBtYXkgYmUgbW9uaXRvcmVkIGRpcmVjdGx5LgorLlRQCisuQiAtZgorU2VuZCBub3RpZmljYXRpb25zIGV2ZW4gaWYKKy5CIHNtLW5vdGlmeQoraGFzIGFscmVhZHkgcnVuIHNpbmNlIHRoZSBsYXN0IHN5c3RlbSByZWJvb3QuCisuVFAKKy5CSSAtbSAiIHJldHJ5LXRpbWUKK1NwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRpbWUsIGluIG1pbnV0ZXMsIHRvIGNvbnRpbnVlIHJldHJ5aW5nCitub3RpZmljYXRpb25zIHRvIHVucmVzcG9uc2l2ZSBob3N0cy4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCisuQiBzbS1ub3RpZnkKK2F0dGVtcHRzIHRvIHNlbmQgbm90aWZpY2F0aW9ucyBmb3IgMTUgbWludXRlcy4KK1NwZWNpZnlpbmcgYSB2YWx1ZSBvZiAwIGNhdXNlcworLkIgc20tbm90aWZ5Cit0byBjb250aW51ZSBzZW5kaW5nIG5vdGlmaWNhdGlvbnMgdG8gdW5yZXNwb25zaXZlIHBlZXJzCit1bnRpbCBpdCBpcyBtYW51YWxseSBraWxsZWQuCisuSVAKK05vdGlmaWNhdGlvbnMgYXJlIHJldHJpZWQgaWYgc2VuZGluZyBmYWlscywKK3RoZSByZW1vdGUgZG9lcyBub3QgcmVzcG9uZCwKK3RoZSByZW1vdGUncyBOU00gc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZCwKK29yIGlmIHRoZXJlIGlzIGEgRE5TIGZhaWx1cmUKK3doaWNoIHByZXZlbnRzIHRoZSByZW1vdGUncworLkkgbW9uX25hbWUKK2Zyb20gYmVpbmcgcmVzb2x2ZWQgdG8gYW4gYWRkcmVzcy4KKy5JUAorSG9zdHMgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIG5vdGlmaWNhdGlvbiBsaXN0IHVudGlsIGEgdmFsaWQKK3JlcGx5IGhhcyBiZWVuIHJlY2VpdmVkLgorSG93ZXZlciwgdGhlIFNNX05PVElGWSBwcm9jZWR1cmUgaGFzIGEgdm9pZCByZXN1bHQuCitUaGVyZSBpcyBubyB3YXkgZm9yCisuQiBzbS1ub3RpZnkKK3RvIHRlbGwgaWYgdGhlIHJlbW90ZSByZWNvZ25pemVkIHRoZSBzZW5kZXIgYW5kIGhhcyBzdGFydGVkCithcHByb3ByaWF0ZSBsb2NrIHJlY292ZXJ5LgorLlRQCisuQiAtbgorUHJldmVudHMKKy5CIHNtLW5vdGlmeQorZnJvbSB1cGRhdGluZyB0aGUgbG9jYWwgc3lzdGVtJ3MgTlNNIHN0YXRlIG51bWJlci4KKy5UUAorLkJJIC1wICIgcG9ydAorU3BlY2lmaWVzIHRoZSBzb3VyY2UgcG9ydCBudW1iZXIKKy5CIHNtLW5vdGlmeQorc2hvdWxkIHVzZSB3aGVuIHNlbmRpbmcgcmVib290IG5vdGlmaWNhdGlvbnMuCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhIHJhbmRvbWx5IGNob3NlbiBlcGhlbWVyYWwgcG9ydCBpcyB1c2VkLgorLklQCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byB0cmF2ZXJzZSBhIGZpcmV3YWxsIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIuCisuVFAKKy5CSSAiXC1QLCAiICIiIFwtXC1zdGF0ZVwtZGlyZWN0b3J5XC1wYXRoICIgcGF0aG5hbWUKK1NwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkKK3doZXJlIE5TTSBzdGF0ZSBpbmZvcm1hdGlvbiByZXNpZGVzLgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwKKy5CIHNtLW5vdGlmeQordXNlcworLkkgL3Zhci9saWIvbmZzCitieSBkZWZhdWx0LgorLklQCitBZnRlciBzdGFydGluZywKKy5CIHNtLW5vdGlmeQorYXR0ZW1wdHMgdG8gc2V0IGl0cyBlZmZlY3RpdmUgVUlEIGFuZCBHSUQgdG8gdGhlIG93bmVyCithbmQgZ3JvdXAgb2YgdGhpcyBkaXJlY3RvcnkuCisuVFAKKy5CSSAtdiAiIGlwYWRkciAiIHwgIiBob3N0bmFtZQorU3BlY2lmaWVzIHRoZSBuZXR3b3JrIGFkZHJlc3MgZnJvbSB3aGljaCB0byBzZW5kIHJlYm9vdCBub3RpZmljYXRpb25zLAorYW5kIHRoZQorLkkgbW9uX25hbWUKK2FyZ3VtZW50IHRvIHVzZSB3aGVuIHNlbmRpbmcgU01fTk9USUZZIHJlcXVlc3RzLgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwKKy5CIHNtLW5vdGlmeQordXNlcyBhIHdpbGRjYXJkIGFkZHJlc3MgYXMgdGhlIHRyYW5zcG9ydCBiaW5kIGFkZHJlc3MsCithbmQgdXNlcyB0aGUgcmVzdWx0cyBvZgorLkJSIGdldGhvc3RuYW1lICgzKQorYXMgdGhlCisuSSBtb25fbmFtZQorYXJndW1lbnQuCisuSVAKK1RoZQorLkkgaXBhZGRyCitmb3JtIGNhbiBiZSBleHByZXNzZWQgYXMgZWl0aGVyIGFuIElQdjQgb3IgYW4gSVB2NiBwcmVzZW50YXRpb24gYWRkcmVzcy4KKy5JUAorVGhpcyBvcHRpb24gY2FuIGJlIHVzZWZ1bCBpbiBtdWx0aS1ob21lZCBjb25maWd1cmF0aW9ucyB3aGVyZQordGhlIHJlbW90ZSByZXF1aXJlcyBub3RpZmljYXRpb24gZnJvbSBhIHNwZWNpZmljIG5ldHdvcmsgYWRkcmVzcy4KKy5TSCBTRUNVUklUWQorVGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgbXVzdCBiZSBzdGFydGVkIGFzIHJvb3QgdG8gYWNxdWlyZSBwcml2aWxlZ2VzIG5lZWRlZAordG8gYWNjZXNzIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBkYXRhYmFzZS4KK0l0IGRyb3BzIHJvb3QgcHJpdmlsZWdlcworYXMgc29vbiBhcyBpdCBzdGFydHMgdXAgdG8gcmVkdWNlIHRoZSByaXNrIG9mIGEgcHJpdmlsZWdlIGVzY2FsYXRpb24gYXR0YWNrLgorLlBQCitEdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwKK3RoZSBlZmZlY3RpdmUgdXNlciBJRCBpdCBjaG9vc2VzIGlzIHRoZSBvd25lciBvZiB0aGUgc3RhdGUgZGlyZWN0b3J5LgorVGhpcyBhbGxvd3MgaXQgdG8gY29udGludWUgdG8gYWNjZXNzIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5IGFmdGVyIGl0CitoYXMgZHJvcHBlZCBpdHMgcm9vdCBwcml2aWxlZ2VzLgorVG8gY29udHJvbCB3aGljaCB1c2VyIElECisuQiBycGMuc3RhdGQKK2Nob29zZXMsIHNpbXBseSB1c2UKKy5CUiBjaG93biAoMSkKK3RvIHNldCB0aGUgb3duZXIgb2YKK3RoZSBzdGF0ZSBkaXJlY3RvcnkuCisuU0ggQURESVRJT05BTCBOT1RFUworTG9jayByZWNvdmVyeSBhZnRlciBhIHJlYm9vdCBpcyBjcml0aWNhbCB0byBtYWludGFpbmluZyBkYXRhIGludGVncml0eQorYW5kIHByZXZlbnRpbmcgdW5uZWNlc3NhcnkgYXBwbGljYXRpb24gaGFuZ3MuCisuUFAKK1RvIGhlbHAKKy5CIHJwYy5zdGF0ZAorbWF0Y2ggU01fTk9USUZZIHJlcXVlc3RzIHRvIE5MTSByZXF1ZXN0cywgYSBudW1iZXIgb2YgYmVzdCBwcmFjdGljZXMKK3Nob3VsZCBiZSBvYnNlcnZlZCwgaW5jbHVkaW5nOgorLklQCitUaGUgVVRTIG5vZGVuYW1lIG9mIHlvdXIgc3lzdGVtcyBzaG91bGQgbWF0Y2ggdGhlIEROUyBuYW1lcyB0aGF0IE5GUworcGVlcnMgdXNlIHRvIGNvbnRhY3QgdGhlbQorLklQCitUaGUgVVRTIG5vZGVuYW1lcyBvZiB5b3VyIHN5c3RlbXMgc2hvdWxkIGFsd2F5cyBiZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWVzCisuSVAKK1RoZSBmb3J3YXJkIGFuZCByZXZlcnNlIEROUyBtYXBwaW5nIG9mIHRoZSBVVFMgbm9kZW5hbWVzIHNob3VsZCBiZQorY29uc2lzdGVudAorLklQCitUaGUgaG9zdG5hbWUgdGhlIGNsaWVudCB1c2VzIHRvIG1vdW50IHRoZSBzZXJ2ZXIgc2hvdWxkIG1hdGNoIHRoZSBzZXJ2ZXIncworLkkgbW9uX25hbWUKK2luIFNNX05PVElGWSByZXF1ZXN0cyBpdCBzZW5kcworLklQCitUaGUgdXNlIG9mIG5ldHdvcmsgYWRkcmVzc2VzIGFzIGEKKy5JIG1vbl9uYW1lCitvciBhCisuSSBteV9uYW1lCitzdHJpbmcgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbgoraW50ZXJvcGVyYXRpbmcgd2l0aCBub24tTGludXggTkZTIGltcGxlbWVudGF0aW9ucy4KKy5QUAorVW5tb3VudGluZyBhbiBORlMgZmlsZSBzeXN0ZW0gZG9lcyBub3QgbmVjZXNzYXJpbHkgc3RvcAorZWl0aGVyIHRoZSBORlMgY2xpZW50IG9yIHNlcnZlciBmcm9tIG1vbml0b3JpbmcgZWFjaCBvdGhlci4KK0JvdGggbWF5IGNvbnRpbnVlIG1vbml0b3JpbmcgZWFjaCBvdGhlciBmb3IgYSB0aW1lIGluIGNhc2Ugc3Vic2VxdWVudAorTkZTIHRyYWZmaWMgYmV0d2VlbiB0aGUgdHdvIHJlc3VsdHMgaW4gZnJlc2ggbW91bnRzIGFuZCBhZGRpdGlvbmFsCitmaWxlIGxvY2tpbmcuCisuUFAKK09uIExpbnV4LCBpZiB0aGUKKy5CIGxvY2tkCitrZXJuZWwgbW9kdWxlIGlzIHVubG9hZGVkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLAorYWxsIHJlbW90ZSBORlMgcGVlcnMgYXJlIHVubW9uaXRvcmVkLgorVGhpcyBjYW4gaGFwcGVuIG9uIGFuIE5GUyBjbGllbnQsIGZvciBleGFtcGxlLAoraWYgYW4gYXV0b21vdW50ZXIgcmVtb3ZlcyBhbGwgTkZTIG1vdW50Citwb2ludHMgZHVlIHRvIGluYWN0aXZpdHkuCisuU1MgSVB2NiBhbmQgVEktUlBDIHN1cHBvcnQKK1RJLVJQQyBpcyBhIHByZS1yZXF1aXNpdGUgZm9yIHN1cHBvcnRpbmcgTkZTIG9uIElQdjYuCitJZiBUSS1SUEMgc3VwcG9ydCBpcyBidWlsdCBpbnRvIHRoZQorLkIgc20tbm90aWZ5Citjb21tYW5kICxpdCB3aWxsIGNob29zZSBhbiBhcHByb3ByaWF0ZSBJUHY0IG9yIElQdjYgdHJhbnNwb3J0CitiYXNlZCBvbiB0aGUgbmV0d29yayBhZGRyZXNzIHJldHVybmVkIGJ5IEROUyBmb3IgZWFjaCByZW1vdGUgcGVlci4KK0l0IHNob3VsZCBiZSBmdWxseSBjb21wYXRpYmxlIHdpdGggcmVtb3RlIHN5c3RlbXMKK3RoYXQgZG8gbm90IHN1cHBvcnQgVEktUlBDIG9yIElQdjYuCisuUFAKK0N1cnJlbnRseSwgdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgc3VwcG9ydHMgc2VuZGluZyBub3RpZmljYXRpb24gb25seSB2aWEgZGF0YWdyYW0gdHJhbnNwb3J0IHByb3RvY29scy4KKy5TSCBGSUxFUworLlRQIDIuNWkKKy5JIC92YXIvbGliL25mcy9zbQorZGlyZWN0b3J5IGNvbnRhaW5pbmcgbW9uaXRvciBsaXN0CisuVFAgMi41aQorLkkgL3Zhci9saWIvbmZzL3NtLmJhaworZGlyZWN0b3J5IGNvbnRhaW5pbmcgbm90aWZ5IGxpc3QKKy5UUCAyLjVpCisuSSAvdmFyL2xpYi9uZnMvc3RhdGUKK05TTSBzdGF0ZSBudW1iZXIgZm9yIHRoaXMgaG9zdAorLlRQIDIuNWkKKy5JIC9wcm9jL3N5cy9mcy9uZnMvbnNtX2xvY2FsX3N0YXRlCitrZXJuZWwncyBjb3B5IG9mIHRoZSBOU00gc3RhdGUgbnVtYmVyCisuU0ggU0VFIEFMU08KKy5CUiBycGMuc3RhdGQgKDgpLAorLkJSIG5mcyAoNSksCisuQlIgdW5hbWUgKDIpLAorLkJSIGhvc3RuYW1lICg3KQorLlBQCitSRkMgMTA5NCAtICJORlM6IE5ldHdvcmsgRmlsZSBTeXN0ZW0gUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIKKy5icgorUkZDIDE4MTMgLSAiTkZTIFZlcnNpb24gMyBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIgorLmJyCitPcGVuR3JvdXAgUHJvdG9jb2xzIGZvciBJbnRlcndvcmtpbmc6IFhORlMsIFZlcnNpb24gM1cgLSBDaGFwdGVyIDExCisuU0ggQVVUSE9SUworT2xhZiBLaXJjaCA8b2tpckBzdXNlLmRlPgorLmJyCitDaHVjayBMZXZlciA8Y2h1Y2subGV2ZXJAb3JhY2xlLmNvbT4KZGlmZiAtLWdpdCBhL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdGFydC1zdGF0ZCBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdGFydC1zdGF0ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgwNWVlCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXJ0LXN0YXRkCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL3NoIC1wCisjIG5mc21vdW50IGNhbGxzIHRoaXMgc2NyaXB0IHdoZW4gbW91bnRpbmcgYSBmaWxlc3lzdGVtIHdpdGggbG9ja2luZworIyBlbmFibGVkLCBidXQgd2hlbiBzdGF0ZCBkb2VzIG5vdCBzZWVtIHRvIGJlIHJ1bm5pbmcgKGJhc2VkIG9uCisjIC92YXIvcnVuL3JwYy5zdGF0ZC5waWQpLgorIyBJdCBzaG91bGQgcnVuIHJ1biBzdGF0ZCB3aXRoIHdoYXRldmVyIGZsYWdzIGFyZSBhcHJvcHJpYXRlIGZvciB0aGlzCisjIHNpdGUuCitQQVRIPS9zYmluOi91c3Ivc2JpbgorZXhlYyBycGMuc3RhdGQgLS1uby1ub3RpZnkKKwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXQuYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4YjY1ZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdGF0LmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OSBKZWZmcmV5IEEuIFVwaG9mZgorICogTW9kaWZpZWQgYnkgT2xhZiBLaXJjaCwgMTk5Ni4KKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSAic3RhdGQuaCIKKworLyoKKyAqIFNlcnZpY2VzIFNNX1NUQVQgcmVxdWVzdHMuCisgKgorICogQWNjb3JkaW5nIHRoZSB0aGUgWC9PcGVuIHNwZWMncyBvbiB0aGlzIHByb2NlZHVyZTogIkltcGxlbWVudGF0aW9ucworICogc2hvdWxkIG5vdCByZWx5IG9uIHRoaXMgcHJvY2VkdXJlIGJlaW5nIG9wZXJhdGl2ZS4gIEluIG1hbnkgY3VycmVudAorICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBOU00gaXQgd2lsbCBhbHdheXMgcmV0dXJuIGEgJ1NUQVRfRkFJTCcKKyAqIHN0YXR1cy4iICBNeSBpbXBsZW1lbnRhdGlvbiBpcyBvcGVyYXRpdmU7IGl0IHJldHVybnMgJ1NUQVRfU1VDQycKKyAqIHdoZW5ldmVyIGl0IGNhbiByZXNvbHZlIHRoZSBob3N0bmFtZSB0aGF0IGl0J3MgYmVpbmcgYXNrZWQgdG8KKyAqIG1vbml0b3IsIGFuZCByZXR1cm5zICdTVEFUX0ZBSUwnIG90aGVyd2lzZS4KKyAqCisgKiBzbV9pbnRlci54IHNheXMgdGhlICdzdGF0ZScgcmV0dXJuZWQgc2hvdWxkIGJlCisgKiAgICJzdGF0ZSBudW1iZXIgb2Ygc2l0ZSBzbV9uYW1lIi4gIEl0IGlzIG5vdCBjbGVhciBob3cgdG8gZ2V0IHRoaXMuCisgKiBYL09wZW4gc2F5czoKKyAqICAgU1RBVF9TVUNDCisgKiAgICAgIFRoZSBOU00gd2lsbCBtb25pdG9yIHRoZSBnaXZlbiBob3N0LiAic21fc3RhdF9yZXMuc3RhdGUiIGNvbnRhaW5zCisgKiAgICAgIHRoZSBzdGF0ZSBvZiB0aGUgTlNNLgorICogV2hpY2ggaW1wbGllcyB0aGF0ICdzdGF0ZScgaXMgdGhlIHN0YXRlIG51bWJlciBvZiB0aGUgKmxvY2FsKiBOU00uCisgKiBocmVmPWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2Mjk3OTkvU01fU1RBVC5odG0KKyAqCisgKiBXZSByZXR1cm4gdGhlICpsb2NhbCogc3RhdGUgYXMKKyAqICAgMS8gV2UgaGF2ZSBlYXN5IGFjY2VzcyB0byBpdC4KKyAqICAgMi8gSXQgbWlnaHQgYmUgdXNlZnVsIHRvIGEgcmVtb3RlIGNsaWVudCB3aG8gbmVlZHMgaXQgYW5kIGhhcyBubworICogICAgICBvdGhlciB3YXkgdG8gZ2V0IGl0LgorICogICAzLyBUaGF0J3Mgd2hhdCB3ZSBhbHdheXMgZGlkIGluIHRoZSBwYXN0LgorICovCitzdHJ1Y3Qgc21fc3RhdF9yZXMgKgorc21fc3RhdF8xX3N2YyhzdHJ1Y3Qgc21fbmFtZSAqYXJncCwKKwkJX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpIHN0cnVjdCBzdmNfcmVxICpycXN0cCkKK3sKKyAgc3RhdGljIHNtX3N0YXRfcmVzIHJlc3VsdDsKKyAgY2hhciAqbmFtZTsKKworICB4bG9nKERfQ0FMTCwgIlJlY2VpdmVkIFNNX1NUQVQgZnJvbSAlcyIsIGFyZ3AtPm1vbl9uYW1lKTsKKworICBuYW1lID0gc3RhdGRfY2Fub25pY2FsX25hbWUoYXJncC0+bW9uX25hbWUpOworICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgcmVzdWx0LnJlc19zdGF0ID0gU1RBVF9GQUlMOworICAgIHhsb2cgKERfR0VORVJBTCwgIlNUQVRfRkFJTCBmb3IgJXMiLCBhcmdwLT5tb25fbmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LnJlc19zdGF0ID0gU1RBVF9TVUNDOworICAgIHhsb2cgKERfR0VORVJBTCwgIlNUQVRfU1VDQyBmb3IgJXMiLCBhcmdwLT5tb25fbmFtZSk7CisgICAgZnJlZShuYW1lKTsKKyAgfQorICByZXN1bHQuc3RhdGUgPSBNWV9TVEFURTsKKyAgcmV0dXJuKCZyZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXRkLmMgYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc3RhdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZkYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXRkLmMKQEAgLTAsMCArMSw0OTMgQEAKKy8qIAorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LTE5OTkgSmVmZnJleSBBLiBVcGhvZmYKKyAqIE1vZGlmaWVkIGJ5IE9sYWYgS2lyY2gsIE9jdC4gMTk5Ni4KKyAqIE1vZGlmaWVkIGJ5IEguSi4gTHUsIDE5OTguCisgKiBNb2RpZmllZCBieSBMLiBIb2hiZXJnZXIgb2YgTWlzc2lvbiBDcml0aWNhbCBMaW51eCwgMjAwMC4KKyAqCisgKiBOU00gZm9yIExpbnV4LgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPHJwYy9ycGMuaD4KKyNpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjaW5jbHVkZSA8cnBjbWlzYy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8Z3JwLmg+CisKKyNpbmNsdWRlICJzdGF0ZC5oIgorI2luY2x1ZGUgIm5mc2xpYi5oIgorI2luY2x1ZGUgIm5zbS5oIgorCisvKiBTb2NrZXQgb3BlcmF0aW9ucyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworaW50CXJ1bl9tb2RlID0gMDsJCS8qIGZvcmVncm91bmQgbG9nZ2luZyBtb2RlICovCisKKy8qIExIIC0gSSBoYWQgdGhlc2UgbG9jYWwgdG8gbWFpbiwgYnV0IGl0IHNlZW1lZCBzaWxseSB0byBoYXZlIAorICogdHdvIGNvcGllcyBvZiBlYWNoIC0gb25lIGluIG1haW4oKSwgb25lIHN0YXRpYyBpbiBsb2cuYy4uLiAKKyAqIEl0IGFsc28gZWxpbWluYXRlcyB0aGUgMjU2LWNoYXIgc3RhdGljIGluIGxvZy5jICovCitzdGF0aWMgY2hhciAqbmFtZV9wID0gTlVMTDsKKworLyogUFJDOiBhIGhpZ2gtYXZhaWxhYmlsaXR5IGNhbGxvdXQgcHJvZ3JhbSBjYW4gYmUgc3BlY2lmaWVkIHdpdGggLUgKKyAqIFdoZW4gdGhpcyBpcyBkb25lLCB0aGUgcHJvZ3JhbSB3aWxsIHJlY2VpdmUgY2FsbG91dHMgd2hlbmV2ZXIgY2xpZW50cworICogYXJlIGFkZGVkIG9yIGRlbGV0ZWQgdG8gdGhlIG5vdGlmeSBsaXN0ICovCitjaGFyICpoYV9jYWxsb3V0X3Byb2cgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0KK3sKKwl7ICJmb3JlZ3JvdW5kIiwgMCwgMCwgJ0YnIH0sCisJeyAibm8tc3lzbG9nIiwgMCwgMCwgJ2QnIH0sCisJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCXsgInZlcnNpb24iLCAwLCAwLCAndicgfSwKKwl7ICJvdXRnb2luZy1wb3J0IiwgMSwgMCwgJ28nIH0sCisJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCXsgIm5hbWUiLCAxLCAwLCAnbicgfSwKKwl7ICJzdGF0ZS1kaXJlY3RvcnktcGF0aCIsIDEsIDAsICdQJyB9LAorCXsgIm5vdGlmeS1tb2RlIiwgMCwgMCwgJ04nIH0sCisJeyAiaGEtY2FsbG91dCIsIDEsIDAsICdIJyB9LAorCXsgIm5vLW5vdGlmeSIsIDAsIDAsICdMJyB9LAorCXsgTlVMTCwgMCwgMCwgMCB9Cit9OworCitleHRlcm4gdm9pZCBzbV9wcm9nXzEgKHN0cnVjdCBzdmNfcmVxICosIHJlZ2lzdGVyIFNWQ1hQUlQgKik7CisKKyNpZmRlZiBTSU1VTEFUSU9OUworZXh0ZXJuIHZvaWQgc2ltdWxhdG9yIChpbnQsIGNoYXIgKiopOworI2VuZGlmCisKKworI2lmZGVmIEhBVkVfVENQX1dSQVBQRVIgCisjaW5jbHVkZSAidGNwd3JhcHBlci5oIgorCitzdGF0aWMgdm9pZCAKK3NtX3Byb2dfMV93cmFwcGVyIChzdHJ1Y3Qgc3ZjX3JlcSAqcnFzdHAsIHJlZ2lzdGVyIFNWQ1hQUlQgKnRyYW5zcCkKK3sKKwkvKiByZW1vdGUgaG9zdCBhdXRob3JpemF0aW9uIGNoZWNrICovCisJaWYgKCFjaGVja19kZWZhdWx0KCJzdGF0ZCIsIG5mc19nZXRycGNjYWxsZXIodHJhbnNwKSwgU01fUFJPRykpIHsKKwkJc3ZjZXJyX2F1dGggKHRyYW5zcCwgQVVUSF9GQUlMRUQpOworCQlyZXR1cm47CisJfQorCisJc21fcHJvZ18xIChycXN0cCwgdHJhbnNwKTsKK30KKworI2RlZmluZSBzbV9wcm9nXzEgc21fcHJvZ18xX3dyYXBwZXIKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc3RhdGRfdW5yZWdpc3Rlcih2b2lkKSB7CisJbmZzX3N2Y191bnJlZ2lzdGVyKFNNX1BST0csIFNNX1ZFUlMpOworfQorCisvKgorICogU2lnbmFsIGhhbmRsZXIuCisgKi8KK3N0YXRpYyB2b2lkIAora2lsbGVyIChpbnQgc2lnKQoreworCXN0YXRkX3VucmVnaXN0ZXIgKCk7CisJeGxvZ19lcnIgKCJDYXVnaHQgc2lnbmFsICVkLCB1bi1yZWdpc3RlcmluZyBhbmQgZXhpdGluZyIsIHNpZyk7Cit9CisKK3N0YXRpYyB2b2lkCitzaWd1c3IgKGludCBzaWcpCit7CisJZXh0ZXJuIHZvaWQgbXlfc3ZjX2V4aXQgKHZvaWQpOworCXhsb2coRF9HRU5FUkFMLCAiQ2F1Z2h0IHNpZ25hbCAlZCwgcmUtbm90aWZ5aW5nIChzdGF0ZSAlZCkiLCBzaWcsCisJCQkJCQkJCU1ZX1NUQVRFKTsKKwlteV9zdmNfZXhpdCgpOworfQorCisvKgorICogU3RhcnR1cCBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQgbG9nX21vZGVzKHZvaWQpCit7CisJY2hhciBidWZbMTI4XTsJCS8qIHdhdGNoIHN0YWNrIHNpemUuLi4gKi8KKworCS8qIE5vIGZsYWdzID0gbm8gbWVzc2FnZSAqLworCWlmICghcnVuX21vZGUpIHJldHVybjsKKworCW1lbXNldChidWYsMCwxMjgpOworCXNwcmludGYoYnVmLCJGbGFnczogIik7CisJaWYgKHJ1bl9tb2RlICYgTU9ERV9OT0RBRU1PTikKKwkJc3RyY2F0KGJ1ZiwiTm8tRGFlbW9uICIpOworCWlmIChydW5fbW9kZSAmIE1PREVfTE9HX1NUREVSUikKKwkJc3RyY2F0KGJ1ZiwiTG9nLVNUREVSUiAiKTsKKyNpZmRlZiBIQVZFX0xJQlRJUlBDCisJc3RyY2F0KGJ1ZiwgIlRJLVJQQyAiKTsKKyNlbmRpZgorCisJeGxvZ193YXJuKGJ1Zik7Cit9CisKKy8qCisgKiBTaW5jZSB3ZSBkbyBtb3JlIHRoYW4gc3RhbmRhcmQgc3RhdGQgc3R1ZmYsIHdlIG1pZ2h0IG5lZWQgdG8KKyAqIGhlbHAgdGhlIG9jY2FzaW9uYWwgYWRtaW4uIAorICovCitzdGF0aWMgdm9pZCAKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsInVzYWdlOiAlcyBbb3B0aW9uc11cbiIsIG5hbWVfcCk7CisJZnByaW50ZihzdGRlcnIsIiAgICAgIC1oLCAtPywgLS1oZWxwICAgICAgIFByaW50IHRoaXMgaGVscCBzY3JlZW4uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiICAgICAgLUYsIC0tZm9yZWdyb3VuZCAgICAgRm9yZWdyb3VuZCAobm8tZGFlbW9uIG1vZGUpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiICAgICAgLWQsIC0tbm8tc3lzbG9nICAgICAgVmVyYm9zZSBsb2dnaW5nIHRvIHN0ZGVyci4gIEZvcmVncm91bmQgbW9kZSBvbmx5LlxuIik7CisJZnByaW50ZihzdGRlcnIsIiAgICAgIC1wLCAtLXBvcnQgICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiICAgICAgLW8sIC0tb3V0Z29pbmctcG9ydCAgUG9ydCBmb3Igb3V0Z29pbmcgY29ubmVjdGlvbnNcbiIpOworCWZwcmludGYoc3RkZXJyLCIgICAgICAtViwgLXYsIC0tdmVyc2lvbiAgICBEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiICAgICAgLW4sIC0tbmFtZSAgICAgICAgICAgU3BlY2lmeSBhIGxvY2FsIGhvc3RuYW1lLlxuIik7CisJZnByaW50ZihzdGRlcnIsIiAgICAgIC1QICAgICAgICAgICAgICAgICAgIFN0YXRlIGRpcmVjdG9yeSBwYXRoLlxuIik7CisJZnByaW50ZihzdGRlcnIsIiAgICAgIC1OICAgICAgICAgICAgICAgICAgIFJ1biBpbiBub3RpZnkgb25seSBtb2RlLlxuIik7CisJZnByaW50ZihzdGRlcnIsIiAgICAgIC1MLCAtLW5vLW5vdGlmeSAgICAgIERvIG5vdCBwZXJmb3JtIGFueSBub3RpZmljYXRpb24uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiICAgICAgLUggICAgICAgICAgICAgICAgICAgU3BlY2lmeSBhIGhpZ2gtYXZhaWxhYmlsaXR5IGNhbGxvdXQgcHJvZ3JhbS5cbiIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGlkZmlsZSA9ICIvdmFyL3J1bi9ycGMuc3RhdGQucGlkIjsKKworaW50IHBpZGZkID0gLTE7CitzdGF0aWMgdm9pZCBjcmVhdGVfcGlkZmlsZSh2b2lkKQoreworCUZJTEUgKmZwOworCisJdW5saW5rKHBpZGZpbGUpOworCWZwID0gZm9wZW4ocGlkZmlsZSwgInciKTsKKwlpZiAoIWZwKQorCQl4bG9nX2VycigiT3BlbmluZyAlcyBmYWlsZWQ6ICVtXG4iLCBwaWRmaWxlKTsKKwlmcHJpbnRmKGZwLCAiJWRcbiIsIGdldHBpZCgpKTsKKwlwaWRmZCA9IGR1cChmaWxlbm8oZnApKTsKKwlpZiAoZmNsb3NlKGZwKSA8IDApIHsKKwkJeGxvZ193YXJuKCJGbHVzaGluZyBwaWQgZmlsZSBmYWlsZWQ6IGVycm5vICVkICglbSlcbiIsCisJCQllcnJubyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0cnVuY2F0ZV9waWRmaWxlKHZvaWQpCit7CisJaWYgKHBpZGZkID49IDApIHsKKwkJaWYgKGZ0cnVuY2F0ZShwaWRmZCwgMCkgPCAwKSB7CisJCQl4bG9nX3dhcm4oInRydW5jYXRpbmcgcGlkIGZpbGUgZmFpbGVkOiBlcnJubyAlZCAoJW0pXG4iLAorCQkJCWVycm5vKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcnVuX3NtX25vdGlmeShpbnQgb3V0cG9ydCkKK3sKKwljaGFyIG9wWzIwXTsKKwljaGFyICphdls2XTsKKwlpbnQgYWMgPSAwOworCisJYXZbYWMrK10gPSAiL3Vzci9zYmluL3NtLW5vdGlmeSI7CisJaWYgKHJ1bl9tb2RlICYgTU9ERV9OT0RBRU1PTikKKwkJYXZbYWMrK10gPSAiLWQiOworCWlmIChvdXRwb3J0KSB7CisJCXNwcmludGYob3AsICItcCVkIiwgb3V0cG9ydCk7CisJCWF2W2FjKytdID0gb3A7CisJfQorCWlmIChydW5fbW9kZSAmIFNUQVRJQ19IT1NUTkFNRSkgeworCQlhdlthYysrXSA9ICItdiI7CisJCWF2W2FjKytdID0gTVlfTkFNRTsKKwl9CisJYXZbYWNdID0gTlVMTDsKKwlleGVjdihhdlswXSwgYXYpOworCWZwcmludGYoc3RkZXJyLCAiJXM6IGZhaWxlZCB0byBydW4gJXNcbiIsIG5hbWVfcCwgYXZbMF0pOworCWV4aXQoMik7CisKK30KKy8qIAorICogRW50cnkgcm91dGluZS9tYWluIGxvb3AuCisgKi8KK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlpbnQgcGlkOworCWludCBhcmc7CisJaW50IHBvcnQgPSAwLCBvdXRfcG9ydCA9IDA7CisJc3RydWN0IHJsaW1pdCBybGltOworCisJaW50IHBpcGVmZHNbMl0gPSB7IC0xLCAtMX07CisJY2hhciBzdGF0dXM7CisKKwkvKiBEZWZhdWx0OiBkYWVtb24gbW9kZSwgbm8gb3RoZXIgb3B0aW9ucyAqLworCXJ1bl9tb2RlID0gMDsKKwl4bG9nX3N0ZGVycigwKTsKKwl4bG9nX3N5c2xvZygxKTsKKworCS8qIFNldCB0aGUgYmFzZW5hbWUgKi8KKwlpZiAoKG5hbWVfcCA9IHN0cnJjaHIoYXJndlswXSwnLycpKSAhPSBOVUxMKSB7CisJCW5hbWVfcCArKzsKKwl9IGVsc2UgeworCQluYW1lX3AgPSBhcmd2WzBdOworCX0KKworCS8qIFNldCBob3N0bmFtZSAqLworCU1ZX05BTUUgPSBOVUxMOworCisJLyogUHJvY2VzcyBjb21tYW5kIGxpbmUgc3dpdGNoZXMgKi8KKwl3aGlsZSAoKGFyZyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoP3ZWRk5IOmRuOnA6bzpQOkwiLCBsb25nb3B0cywgTlVMTCkpICE9IEVPRikgeworCQlzd2l0Y2ggKGFyZykgeworCQljYXNlICdWJzoJLyogVmVyc2lvbiAqLworCQljYXNlICd2JzoKKwkJCXByaW50ZigiJXMgdmVyc2lvbiAiIFZFUlNJT04gIlxuIixuYW1lX3ApOworCQkJZXhpdCgwKTsKKwkJY2FzZSAnRic6CS8qIEZvcmVncm91bmQvbm9kYWVtb24gbW9kZSAqLworCQkJcnVuX21vZGUgfD0gTU9ERV9OT0RBRU1PTjsKKwkJCWJyZWFrOworCQljYXNlICdOJzoKKwkJCXJ1bl9tb2RlIHw9IE1PREVfTk9USUZZX09OTFk7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6IC8qIExpc3RlbiBvbmx5ICovCisJCQlydW5fbW9kZSB8PSBNT0RFX05PX05PVElGWTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoJLyogTm8gZGFlbW9uIG9ubHkgLSBsb2cgdG8gc3RkZXJyICovCisJCQlydW5fbW9kZSB8PSBNT0RFX0xPR19TVERFUlI7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlvdXRfcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChvdXRfcG9ydCA8IDEgfHwgb3V0X3BvcnQgPiA2NTUzNSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBwb3J0IG51bWJlcjogJXNcbiIsCisJCQkJCWFyZ3ZbMF0sIG9wdGFyZyk7CisJCQkJdXNhZ2UoKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgcG9ydCBudW1iZXI6ICVzXG4iLAorCQkJCQlhcmd2WzBdLCBvcHRhcmcpOworCQkJCXVzYWdlKCk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoJLyogU3BlY2lmeSBsb2NhbCBob3N0bmFtZSAqLworCQkJcnVuX21vZGUgfD0gU1RBVElDX0hPU1ROQU1FOworCQkJTVlfTkFNRSA9IHhzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdQJzoKKwkJCWlmICghbnNtX3NldHVwX3BhdGhuYW1lcyhhcmd2WzBdLCBvcHRhcmcpKQorCQkJCWV4aXQoMSk7CisJCQlicmVhazsKKwkJY2FzZSAnSCc6IC8qIFBSQzogc3BlY2lmeSB0aGUgaGEtY2FsbG91dCBwcm9ncmFtICovCisJCQlpZiAoKGhhX2NhbGxvdXRfcHJvZyA9IHhzdHJkdXAob3B0YXJnKSkgPT0gTlVMTCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHhzdHJkdXAoJXMpIGZhaWxlZCFcbiIsCisJCQkJCWFyZ3ZbMF0sIG9wdGFyZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICc/JzoJLyogaGVlZWVlZWxsbGxsbGxwcHBwPyBoZWggKi8KKwkJY2FzZSAnaCc6CisJCQl1c2FnZSgpOworCQkJZXhpdCAoMCk7CisJCWRlZmF1bHQ6CS8qIG9oIGRlYXIgLi4uIGhlaCAqLworCQkJdXNhZ2UoKTsKKwkJCWV4aXQoLTEpOworCQl9CisJfQorCisJaWYgKHBvcnQgPT0gb3V0X3BvcnQgJiYgcG9ydCAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTGlzdGVuaW5nIGFuZCBvdXRnb2luZyBwb3J0cyBjYW5ub3QgYmUgdGhlIHNhbWUhXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKHJ1bl9tb2RlICYgTU9ERV9OT1RJRllfT05MWSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAtTiBkZXByZWNhdGVkLCBjb25zaWRlciB1c2luZyAvdXNyL3NiaW4vc20tbm90aWZ5IGRpcmVjdGx5XG4iLAorCQkJbmFtZV9wKTsKKwkJcnVuX3NtX25vdGlmeShvdXRfcG9ydCk7CisJfQorCisJaWYgKCEocnVuX21vZGUgJiBNT0RFX05PREFFTU9OKSkgeworCQlydW5fbW9kZSAmPSB+TU9ERV9MT0dfU1RERVJSOwkvKiBOZXZlciBsb2cgdG8gY29uc29sZSBpbgorCQkJCQkJICAgZGFlbW9uIG1vZGUuICovCisJfQorCisJaWYgKGdldHJsaW1pdCAoUkxJTUlUX05PRklMRSwgJnJsaW0pICE9IDApCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGdldHJsaW1pdCAoUkxJTUlUX05PRklMRSkgZmFpbGVkOiAlc1xuIiwKKwkJCQlhcmd2IFswXSwgc3RyZXJyb3IoZXJybm8pKTsKKwllbHNlIHsKKwkJLyogZ2xpYmMgc3VucnBjIGNvZGUgZGllcyBpZiBnZXRkdGFibGVzaXplID4gRkRfU0VUU0laRSAqLworCQlpZiAocmxpbS5ybGltX2N1ciA+IEZEX1NFVFNJWkUpIHsKKwkJCXJsaW0ucmxpbV9jdXIgPSBGRF9TRVRTSVpFOworCisJCQlpZiAoc2V0cmxpbWl0IChSTElNSVRfTk9GSUxFLCAmcmxpbSkgIT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHNldHJsaW1pdCAoUkxJTUlUX05PRklMRSkgZmFpbGVkOiAlc1xuIiwKKwkJCQkJYXJndiBbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCX0KKwl9CisKKyNpZmRlZiBTSU1VTEFUSU9OUworCWlmIChhcmdjID4gMSkKKwkJLyogTEggLSBJIF9yZWFsbHlfIG5lZWQgdG8gdXBkYXRlIHNpbXVsYXRvci4uLiAqLworCQlzaW11bGF0b3IgKC0tYXJnYywgKythcmd2KTsJLyogc2ltdWxhdG9yKCkgZG9lcyBleGl0KCkgKi8KKyNlbmRpZgorCQorCWlmICghKHJ1bl9tb2RlICYgTU9ERV9OT0RBRU1PTikpIHsKKwkJaW50IHRlbXBmZDsKKworCQlpZiAocGlwZShwaXBlZmRzKTwwKSB7CisJCQlwZXJyb3IoInN0YXRkOiB1bmFibGUgdG8gY3JlYXRlIHBpcGUiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKChwaWQgPSBmb3JrICgpKSA8IDApIHsKKwkJCXBlcnJvciAoInN0YXRkOiBDb3VsZCBub3QgZm9yayIpOworCQkJZXhpdCAoMSk7CisJCX0gZWxzZSBpZiAocGlkICE9IDApIHsKKwkJCS8qIFBhcmVudC4KKwkJCSAqIFdhaXQgZm9yIHN0YXR1cyBmcm9tIGNoaWxkLgorCQkJICovCisJCQljbG9zZShwaXBlZmRzWzFdKTsKKwkJCWlmIChyZWFkKHBpcGVmZHNbMF0sICZzdGF0dXMsIDEpICE9IDEpCisJCQkJZXhpdCgxKTsKKwkJCWV4aXQgKDApOworCQl9CisJCS8qIENoaWxkLgkqLworCQljbG9zZShwaXBlZmRzWzBdKTsKKwkJc2V0c2lkICgpOworCisJCXdoaWxlIChwaXBlZmRzWzFdIDw9IDIpIHsKKwkJCXBpcGVmZHNbMV0gPSBkdXAocGlwZWZkc1sxXSk7CisJCQlpZiAocGlwZWZkc1sxXTwwKSB7CisJCQkJcGVycm9yKCJzdGF0ZDogZHVwIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCQl0ZW1wZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOworCQlkdXAyKHRlbXBmZCwgMCk7CisJCWR1cDIodGVtcGZkLCAxKTsKKwkJZHVwMih0ZW1wZmQsIDIpOworCQlkdXAyKHBpcGVmZHNbMV0sIDMpOworCQlwaXBlZmRzWzFdID0gMzsKKwkJY2xvc2VhbGwoNCk7CisJfQorCisJLyogQ2hpbGQuICovCisKKwlpZiAocnVuX21vZGUgJiBNT0RFX0xPR19TVERFUlIpIHsKKwkJeGxvZ19zeXNsb2coMCk7CisJCXhsb2dfc3RkZXJyKDEpOworCQl4bG9nX2NvbmZpZyhEX0FMTCwgMSk7CisJfQorCXhsb2dfb3BlbihuYW1lX3ApOworCXhsb2coTF9OT1RJQ0UsICJWZXJzaW9uICIgVkVSU0lPTiAiIHN0YXJ0aW5nIik7CisKKwlsb2dfbW9kZXMoKTsKKworCXNpZ25hbCAoU0lHSFVQLCBraWxsZXIpOworCXNpZ25hbCAoU0lHSU5ULCBraWxsZXIpOworCXNpZ25hbCAoU0lHVEVSTSwga2lsbGVyKTsKKwkvKiBQUkM6IHRyYXAgU0lHVVNSMSB0byByZS1yZWFkIG5vdGlmeSBsaXN0IGZyb20gZGlzayAqLworCXNpZ25hbChTSUdVU1IxLCBzaWd1c3IpOworCS8qIFdBUk5JTkc6IHRoZSBmb2xsb3dpbmcgd29ya3Mgb24gTGludXggYW5kIFN5c1YsIGJ1dCBub3QgQlNEISAqLworCXNpZ25hbChTSUdDSExELCBTSUdfSUdOKTsKKwkvKgorCSAqIElnbm9yZSBTSUdQSVBFIHRvIGF2b2lkIHN0YXRkIGR5aW5nIHdoZW4gcGVlcnMgY2xvc2UgdGhlaXIKKwkgKiBUQ1AgY29ubmVjdGlvbiB3aGlsZSB3ZSdyZSB0cnlpbmcgdG8gcmVwbHkgdG8gdGhlbS4KKwkgKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwljcmVhdGVfcGlkZmlsZSgpOworCWF0ZXhpdCh0cnVuY2F0ZV9waWRmaWxlKTsKKworCWlmICghIChydW5fbW9kZSAmIE1PREVfTk9fTk9USUZZKSkKKwkJc3dpdGNoIChwaWQgPSBmb3JrKCkpIHsKKwkJY2FzZSAwOgorCQkJcnVuX3NtX25vdGlmeShvdXRfcG9ydCk7CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJd2FpdHBpZChwaWQsIE5VTEwsIDApOworCQl9CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHByaXZpbGVnZSBwb3J0IGZvciBjYWxsaW5nIGludG8gdGhlIGtlcm5lbCAqLworCWlmIChzdGF0ZF9nZXRfc29ja2V0KCkgPCAwKQorCQlleGl0KDEpOworCisJLyogSWYgc20tbm90aWZ5IGRpZG4ndCB0YWtlIGFsbCB0aGUgc3RhdGUgZmlsZXMsIGxvYWQKKwkgKiBzdGF0ZSBpbmZvcm1hdGlvbiBpbnRvIG91ciBub3RpZnktbGlzdCBzbyB3ZSBjYW4KKwkgKiBwYXNzIG9uIGFueSBTTV9OT1RJRlkgdGhhdCBhcnJpdmVzCisJICovCisJbG9hZF9zdGF0ZSgpOworCisJTVlfU1RBVEUgPSBuc21fZ2V0X3N0YXRlKDApOworCWlmIChNWV9TVEFURSA9PSAwKQorCQlleGl0KDEpOworCXhsb2coRF9HRU5FUkFMLCAiTG9jYWwgTlNNIHN0YXRlIG51bWJlcjogJWQiLCBNWV9TVEFURSk7CisJbnNtX3VwZGF0ZV9rZXJuZWxfc3RhdGUoTVlfU1RBVEUpOworCisJLyoKKwkgKiBPUkRFUgorCSAqIENsZWFyIG9sZCBsaXN0ZW5lcnMgd2hpbGUgc3RpbGwgcm9vdCwgdG8gb3ZlcnJpZGUgYW55CisJICogcGVybWlzc2lvbiBjaGVja2luZyBkb25lIGJ5IHJwY2JpbmQuCisJICovCisJc3RhdGRfdW5yZWdpc3RlcigpOworCisJLyoKKwkgKiBPUkRFUgorCSAqLworCWlmICghbnNtX2Ryb3BfcHJpdmlsZWdlcyhwaWRmZCkpCisJCWV4aXQoMSk7CisKKwkvKgorCSAqIE9SREVSCisJICogQ3JlYXRlIFJQQyBsaXN0ZW5lcnMgYWZ0ZXIgZHJvcHBpbmcgcHJpdmlsZWdlcy4gIFRoaXMgcGVybWl0cworCSAqIHN0YXRkIHRvIHVucmVnaXN0ZXIgaXRzIG93biBsaXN0ZW5lcnMgd2hlbiBpdCBleGl0cy4KKwkgKi8KKwlpZiAobmZzX3N2Y19jcmVhdGUoInN0YXRkIiwgU01fUFJPRywgU01fVkVSUywgc21fcHJvZ18xLCBwb3J0KSA9PSAwKSB7CisJCXhsb2coTF9FUlJPUiwgImZhaWxlZCB0byBjcmVhdGUgUlBDIGxpc3RlbmVycywgZXhpdGluZyIpOworCQlleGl0KDEpOworCX0KKwlhdGV4aXQoc3RhdGRfdW5yZWdpc3Rlcik7CisKKwkvKiBJZiB3ZSBnb3QgdGhpcyBmYXIsIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQsIHNvIG5vdGlmeSBwYXJlbnQgKi8KKwlpZiAocGlwZWZkc1sxXSA+IDApIHsKKwkJc3RhdHVzID0gMDsKKwkJaWYgKHdyaXRlKHBpcGVmZHNbMV0sICZzdGF0dXMsIDEpICE9IDEpIHsKKwkJCXhsb2dfd2Fybigid3JpdGluZyB0byBwYXJlbnQgcGlwZSBmYWlsZWQ6IGVycm5vICVkICglcylcbiIsCisJCQkJZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJY2xvc2UocGlwZWZkc1sxXSk7CisJCXBpcGVmZHNbMV0gPSAtMTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIEhhbmRsZSBpbmNvbWluZyByZXF1ZXN0czogIFNNX05PVElGWSBzb2NrZXQgcmVxdWVzdHMsIGFzCisJCSAqIHdlbGwgYXMgY2FsbGJhY2tzIGZyb20gbG9ja2QuCisJCSAqLworCQlteV9zdmNfcnVuKCk7CS8qIEkgcm9sbGVkIG15IG93biwgT2xhZiBtYWRlIGl0IGJldHRlci4uLiAqLworCisJCS8qIE9ubHkgZ2V0IGhlcmUgd2hlbiBzaW11bGF0aW5nIGEgY3Jhc2ggc28gd2Ugc2hvdWxkIHByb2JhYmx5CisJCSAqIHN0YXJ0IHNtLW5vdGlmeSBydW5uaW5nIGFnYWluLiAgQXMgd2UgaGF2ZSBhbHJlYWR5IGRyb3BwZWQKKwkJICogcHJpdmlsZWdlcywgdGhpcyBtaWdodCBub3Qgd29yaywgYnV0IEkgZG9uJ3QgdGhpbmsKKwkJICogcmVzcG9uZGluZyB0byBTTV9TSU1VX0NSQVNIIGlzIGFuIGltcG9ydGFudCB1c2UgY2FzZXMgdG8KKwkJICogZ2V0IHBlcmZlY3QuCisJCSAqLworCQlpZiAoISAocnVuX21vZGUgJiBNT0RFX05PX05PVElGWSkpCisJCQlzd2l0Y2ggKHBpZCA9IGZvcmsoKSkgeworCQkJY2FzZSAwOgorCQkJCXJ1bl9zbV9ub3RpZnkob3V0X3BvcnQpOworCQkJCWJyZWFrOworCQkJY2FzZSAtMToKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJd2FpdHBpZChwaWQsIE5VTEwsIDApOworCQkJfQorCisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXRkLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc3RhdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODllNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXRkLmgKQEAgLTAsMCArMSw2OCBAQAorLyogCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgMTk5OSBKZWZmcmV5IEEuIFVwaG9mZgorICogTW9kaWZpZWQgYnkgT2xhZiBLaXJjaCwgRGVjLiAxOTk2LgorICoKKyAqIE5TTSBmb3IgTGludXguCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic21faW50ZXIuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKyNpbmNsdWRlICJ4bG9nLmgiCisKKy8qCisgKiBTdGF0dXMgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgU1RBVF9GQUlMCXN0YXRfZmFpbAorI2RlZmluZSBTVEFUX1NVQ0MJc3RhdF9zdWNjCisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzLgorICovCitleHRlcm4gX0Jvb2wJc3RhdGRfbWF0Y2hob3N0bmFtZShjb25zdCBjaGFyICpob3N0bmFtZTEsIGNvbnN0IGNoYXIgKmhvc3RuYW1lMik7CitleHRlcm4gX0Jvb2wJc3RhdGRfcHJlc2VudF9hZGRyZXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwLCBjaGFyICpidWYsCisJCQkJCWNvbnN0IHNpemVfdCBidWZsZW4pOworX19hdHRyaWJ1dGVfbWFsbG9jX18KK2V4dGVybiBjaGFyICoJc3RhdGRfY2Fub25pY2FsX25hbWUoY29uc3QgY2hhciAqaG9zdG5hbWUpOworCitleHRlcm4gdm9pZAlteV9zdmNfcnVuKHZvaWQpOworZXh0ZXJuIHZvaWQJbm90aWZ5X2hvc3RzKHZvaWQpOworZXh0ZXJuIHZvaWQJc2h1ZmZsZV9kaXJzKHZvaWQpOworZXh0ZXJuIGludAlzdGF0ZF9nZXRfc29ja2V0KHZvaWQpOworZXh0ZXJuIGludAlwcm9jZXNzX25vdGlmeV9saXN0KHZvaWQpOworZXh0ZXJuIGludAlwcm9jZXNzX3JlcGx5KEZEX1NFVF9UWVBFICopOworZXh0ZXJuIGNoYXIgKgl4c3RyZHVwKGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCAqCXhtYWxsb2Moc2l6ZV90KTsKK2V4dGVybiB2b2lkCWxvYWRfc3RhdGUodm9pZCk7CisKKy8qCisgKiBIb3N0IHN0YXR1cyBzdHJ1Y3R1cmUgYW5kIG1hY3Jvcy4KKyAqLworc3RhdF9jaGdlCQlTTV9zdGF0X2NoZ2U7CisjZGVmaW5lIE1ZX05BTUUJCVNNX3N0YXRfY2hnZS5tb25fbmFtZQorI2RlZmluZSBNWV9TVEFURQlTTV9zdGF0X2NoZ2Uuc3RhdGUKKworLyoKKyAqIFNvbWUgdGltZW91dCB2YWx1ZXMuICAoVGltZW91dCB2YWx1ZXMgYXJlIGluIHdob2xlIHNlY29uZHMuKQorICovCisjZGVmaW5lIENBTExCQUNLX1RJTUVPVVQJIDMgLyogRm9yIGNsaWVudCBjYWxsLWJhY2tzLiAqLworI2RlZmluZSBOT1RJRllfVElNRU9VVAkJIDUgLyogRm9yIHN0YXR1cy1jaGFuZ2Ugbm90aWZpY2F0aW9ucy4gKi8KKyNkZWZpbmUgU0VMRUNUX1RJTUVPVVQJCTEwIC8qIE1heCBzZWxlY3QoKSB0aW1lb3V0IHdoZW4gd29yayB0byBkby4gKi8KKyNkZWZpbmUgTUFYX1RSSUVTCQkgNSAvKiBNYXggbnVtYmVyIG9mIHRyaWVzIGZvciBhbnkgaG9zdC4gKi8KKworLyoKKyAqIE1vZGVzIG9mIG9wZXJhdGlvbiAtIExvbgorICovCitleHRlcm4gaW50IHJ1bl9tb2RlOworI2RlZmluZSBNT0RFX05PREFFTU9OIDEJCS8qIE5vLWRhZW1vbi9mb3JlZ3JvdW5kIG1vZGUuICovCisjZGVmaW5lIE1PREVfTE9HX1NUREVSUiAyCS8qIGluIGZvcmVncm91bmQgbW9kZSwgbG9nIHRvIHN0ZGVyciAqLworI2RlZmluZSBNT0RFX05PVElGWV9PTkxZIDQJLyogU2VuZCBTTV9OT1RJRlkgdG8gZXZlcnlvbmUgbW9uaXRvcmVkIG9uCisJCQkJICAgYSBzaW5nbGUgaW50ZXJmYWNlL2FsaWFzICovCisvKiBMSCAtIG5vdGlmeV9vbmx5IG1vZGUgd291bGQgYmUgZm9yIG5vdGlmeWluZyBob3N0cyBvbiBhbiBJUCBhbGlhcworICogdGhhdCBqdXN0IGNhbWUgYmFjayB1cCwgZm9yIGV4LCB3aGVuIGZhaWxpbmcgb3ZlciBhIEhBIHNlcnZpY2UgdG8KKyAqIGFub3RoZXIgaG9zdC4uLi4gKi8KKyNkZWZpbmUgU1RBVElDX0hPU1ROQU1FIDgJLyogQWx3YXlzIHVzZSB0aGUgaG9zdG5hbWUgc2V0IGJ5IC1uICovCisjZGVmaW5lCU1PREVfTk9fTk9USUZZCTE2CS8qIERvbid0IG5vdGlmeSBwZWVycyBvZiBhIHJlYm9vdCAqLwpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N0YXRkLm1hbiBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdGF0ZC5tYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZjNWU5NQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdGF0ZC5tYW4KQEAgLTAsMCArMSw0MDggQEAKKy5cIkAoIylycGMuc3RhdGQuOCIKKy5cIgorLlwiIENvcHlyaWdodCAoQykgMTk5OSBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKy5cIiBNb2RpZmllZCBieSBKZWZmcmV5IEEuIFVwaG9mZiwgMTk5OSwgMjAwMiwgMjAwNS4KKy5cIiBNb2RpZmllZCBieSBMb24gSG9oYmVyZ2VyLCAyMDAwLgorLlwiIE1vZGlmaWVkIGJ5IFBhdWwgQ2xlbWVudHMsIDIwMDQuCisuXCIKKy5cIiBSZXdyaXR0ZW4gYnkgQ2h1Y2sgTGV2ZXIgPGNodWNrLmxldmVyQG9yYWNsZS5jb20+LCAyMDA5LgorLlwiIENvcHlyaWdodCAyMDA5IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5USCBSUEMuU1RBVEQgOCAiMSBOb3ZlbWJlciAyMDA5CisuU0ggTkFNRQorcnBjLnN0YXRkIFwtIE5TTSBzZXJ2aWNlIGRhZW1vbgorLlNIIFNZTk9QU0lTCisuQkkgInJwYy5zdGF0ZCBbLWRoP0ZMTnZWd10gWy1IICIgcHJvZyAiXSBbLW4gIiBteS1uYW1lICJdIFstbyAiIG91dGdvaW5nLXBvcnQgIl0gWy1wICIgbGlzdGVuZXItcG9ydCAiXSBbLVAgIiBwYXRoICIgXQorLlNIIERFU0NSSVBUSU9OCitGaWxlIGxvY2tzIGFyZSBub3QgcGFydCBvZiBwZXJzaXN0ZW50IGZpbGUgc3lzdGVtIHN0YXRlLgorTG9jayBzdGF0ZSBpcyB0aHVzIGxvc3Qgd2hlbiBhIGhvc3QgcmVib290cy4KKy5QUAorTmV0d29yayBmaWxlIHN5c3RlbXMgbXVzdCBhbHNvIGRldGVjdCB3aGVuIGxvY2sgc3RhdGUgaXMgbG9zdAorYmVjYXVzZSBhIHJlbW90ZSBob3N0IGhhcyByZWJvb3RlZC4KK0FmdGVyIGFuIE5GUyBjbGllbnQgcmVib290cywgYW4gTkZTIHNlcnZlciBtdXN0IHJlbGVhc2UgYWxsIGZpbGUgbG9ja3MKK2hlbGQgYnkgYXBwbGljYXRpb25zIHRoYXQgd2VyZSBydW5uaW5nIG9uIHRoYXQgY2xpZW50LgorQWZ0ZXIgYSBzZXJ2ZXIgcmVib290cywgYSBjbGllbnQgbXVzdCByZW1pbmQgdGhlCitzZXJ2ZXIgb2YgZmlsZSBsb2NrcyBoZWxkIGJ5IGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoYXQgY2xpZW50LgorLlBQCitGb3IgTkZTIHZlcnNpb24gMiBbUkZDMTA5NF0gYW5kIE5GUyB2ZXJzaW9uIDMgW1JGQzE4MTNdLCB0aGUKKy5JIE5ldHdvcmsgU3RhdHVzIE1vbml0b3IKK3Byb3RvY29sIChvciBOU00gZm9yIHNob3J0KQoraXMgdXNlZCB0byBub3RpZnkgTkZTIHBlZXJzIG9mIHJlYm9vdHMuCitPbiBMaW51eCwgdHdvIHNlcGFyYXRlIHVzZXItc3BhY2UgY29tcG9uZW50cyBjb25zdGl0dXRlIHRoZSBOU00gc2VydmljZToKKy5UUAorLkIgcnBjLnN0YXRkCitBIGRhZW1vbiB0aGF0IGxpc3RlbnMgZm9yIHJlYm9vdCBub3RpZmljYXRpb25zIGZyb20gb3RoZXIgaG9zdHMsIGFuZAorbWFuYWdlcyB0aGUgbGlzdCBvZiBob3N0cyB0byBiZSBub3RpZmllZCB3aGVuIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cworLlRQCisuQiBzbS1ub3RpZnkKK0EgaGVscGVyIHByb2dyYW0gdGhhdCBub3RpZmllcyBORlMgcGVlcnMgYWZ0ZXIgdGhlIGxvY2FsIHN5c3RlbSByZWJvb3RzCisuUFAKK1RoZSBsb2NhbCBORlMgbG9jayBtYW5hZ2VyIGFsZXJ0cyBpdHMgbG9jYWwKKy5CIHJwYy5zdGF0ZAorb2YgZWFjaCByZW1vdGUgcGVlciB0aGF0IHNob3VsZCBiZSBtb25pdG9yZWQuCitXaGVuIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cywgdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgbm90aWZpZXMgdGhlIE5TTSBzZXJ2aWNlIG9uIG1vbml0b3JlZCBwZWVycyBvZiB0aGUgcmVib290LgorV2hlbiBhIHJlbW90ZSByZWJvb3RzLCB0aGF0IHBlZXIgbm90aWZpZXMgdGhlIGxvY2FsCisuQlIgcnBjLnN0YXRkICwKK3doaWNoIGluIHR1cm4gcGFzc2VzIHRoZSByZWJvb3Qgbm90aWZpY2F0aW9uCitiYWNrIHRvIHRoZSBsb2NhbCBORlMgbG9jayBtYW5hZ2VyLgorLlNIIE5TTSBPUEVSQVRJT04gSU4gREVUQUlMCitUaGUgZmlyc3QgZmlsZSBsb2NraW5nIGludGVyYWN0aW9uIGJldHdlZW4gYW4gTkZTIGNsaWVudCBhbmQgc2VydmVyIGNhdXNlcwordGhlIE5GUyBsb2NrIG1hbmFnZXJzIG9uIGJvdGggcGVlcnMgdG8gY29udGFjdCB0aGVpciBsb2NhbCBOU00gc2VydmljZSB0bworc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wcG9zaXRlIHBlZXIuCitPbiBMaW51eCwgdGhlIGxvY2FsIGxvY2sgbWFuYWdlciBjb250YWN0cworLkJSIHJwYy5zdGF0ZCAuCisuUFAKKy5CIHJwYy5zdGF0ZAorcmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIG1vbml0b3JlZCBORlMgcGVlciBvbiBwZXJzaXN0ZW50IHN0b3JhZ2UuCitUaGlzIGluZm9ybWF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY29udGFjdCBhIHJlbW90ZSBwZWVyCitpbiBjYXNlIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cywKK2hvdyB0byByZWNvZ25pemUgd2hpY2ggbW9uaXRvcmVkIHBlZXIgaXMgcmVwb3J0aW5nIGEgcmVib290LAorYW5kIGhvdyB0byBub3RpZnkgdGhlIGxvY2FsIGxvY2sgbWFuYWdlciB3aGVuIGEgbW9uaXRvcmVkIHBlZXIKK2luZGljYXRlcyBpdCBoYXMgcmVib290ZWQuCisuUFAKK0FuIE5GUyBjbGllbnQgc2VuZHMgYSBob3N0bmFtZSwga25vd24gYXMgdGhlIGNsaWVudCdzCisuSVIgY2FsbGVyX25hbWUgLAoraW4gZWFjaCBmaWxlIGxvY2sgcmVxdWVzdC4KK0FuIE5GUyBzZXJ2ZXIgY2FuIHVzZSB0aGlzIGhvc3RuYW1lIHRvIHNlbmQgYXN5bmNocm9ub3VzIEdSQU5UCitjYWxscyB0byBhIGNsaWVudCwgb3IgdG8gbm90aWZ5IHRoZSBjbGllbnQgaXQgaGFzIHJlYm9vdGVkLgorLlBQCitUaGUgTGludXggTkZTIHNlcnZlciBjYW4gcHJvdmlkZSB0aGUgY2xpZW50J3MKKy5JIGNhbGxlcl9uYW1lCitvciB0aGUgY2xpZW50J3MgbmV0d29yayBhZGRyZXNzIHRvCisuQlIgcnBjLnN0YXRkIC4KK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhlIE5TTSBwcm90b2NvbCwKK3RoaXMgbmFtZSBvciBhZGRyZXNzIGlzIGtub3duIGFzIHRoZSBtb25pdG9yZWQgcGVlcidzCisuSVIgbW9uX25hbWUgLgorSW4gYWRkaXRpb24sIHRoZSBsb2NhbCBsb2NrIG1hbmFnZXIgdGVsbHMKKy5CIHJwYy5zdGF0ZAord2hhdCBpdCB0aGlua3MgaXRzIG93biBob3N0bmFtZSBpcy4KK0ZvciB0aGUgcHVycG9zZXMgb2YgdGhlIE5TTSBwcm90b2NvbCwKK3RoaXMgaG9zdG5hbWUgaXMga25vd24gYXMKKy5JUiBteV9uYW1lIC4KKy5QUAorVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBpbnRlcmFjdGlvbiBiZXR3ZWVuIGFuIE5GUyBzZXJ2ZXIgYW5kIGEgY2xpZW50Cit0byBpbmZvcm0gdGhlIGNsaWVudCBvZiB0aGUgc2VydmVyJ3MKKy5JUiBjYWxsZXJfbmFtZSAuCitUaGVyZWZvcmUgTkZTIGNsaWVudHMgZG8gbm90IGFjdHVhbGx5IGtub3cgd2hhdAorLkkgbW9uX25hbWUKK2FuIE5GUyBzZXJ2ZXIgbWlnaHQgdXNlIGluIGFuIFNNX05PVElGWSByZXF1ZXN0LgorVGhlIExpbnV4IE5GUyBjbGllbnQgdXNlcyB0aGUgc2VydmVyIGhvc3RuYW1lIGZyb20gdGhlIG1vdW50IGNvbW1hbmQKK3RvIGlkZW50aWZ5IHJlYm9vdGluZyBORlMgc2VydmVycy4KKy5TUyBSZWJvb3Qgbm90aWZpY2F0aW9uCitXaGVuIHRoZSBsb2NhbCBzeXN0ZW0gcmVib290cywgdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgcmVhZHMgdGhlIGxpc3Qgb2YgbW9uaXRvcmVkIHBlZXJzIGZyb20gcGVyc2lzdGVudCBzdG9yYWdlIGFuZAorc2VuZHMgYW4gU01fTk9USUZZIHJlcXVlc3QgdG8gdGhlIE5TTSBzZXJ2aWNlIG9uIGVhY2ggbGlzdGVkIHJlbW90ZSBwZWVyLgorSXQgdXNlcyB0aGUKKy5JIG1vbl9uYW1lCitzdHJpbmcgYXMgdGhlIGRlc3RpbmF0aW9uLgorVG8gaWRlbnRpZnkgd2hpY2ggaG9zdCBoYXMgcmVib290ZWQsIHRoZQorLkIgc20tbm90aWZ5Citjb21tYW5kIG5vcm1hbGx5IHNlbmRzIHRoZSByZXN1bHRzIG9mCisuQlIgZ2V0aG9zdG5hbWUgKDMpCithcyB0aGUKKy5JIG15X25hbWUKK3N0cmluZy4KK1RoZSByZW1vdGUKKy5CIHJwYy5zdGF0ZAorbWF0Y2hlcyBpbmNvbWluZyBTTV9OT1RJRlkgcmVxdWVzdHMgdXNpbmcgdGhpcyBzdHJpbmcsCitvciB0aGUgY2FsbGVyJ3MgbmV0d29yayBhZGRyZXNzLAordG8gb25lIG9yIG1vcmUgcGVlcnMgb24gaXRzIG93biBtb25pdG9yIGxpc3QuCisuUFAKK0lmCisuQiBycGMuc3RhdGQKK2RvZXMgbm90IGZpbmQgYSBwZWVyIG9uIGl0cyBtb25pdG9yIGxpc3QgdGhhdCBtYXRjaGVzCithbiBpbmNvbWluZyBTTV9OT1RJRlkgcmVxdWVzdCwKK3RoZSBub3RpZmljYXRpb24gaXMgbm90IGZvcndhcmRlZCB0byB0aGUgbG9jYWwgbG9jayBtYW5hZ2VyLgorSW4gYWRkaXRpb24sIGVhY2ggcGVlciBoYXMgaXRzIG93bgorLklSICJOU00gc3RhdGUgbnVtYmVyIiAsCithIDMyLWJpdCBpbnRlZ2VyIHRoYXQgaXMgYnVtcGVkIGFmdGVyIGVhY2ggcmVib290IGJ5IHRoZQorLkIgc20tbm90aWZ5Citjb21tYW5kLgorLkIgcnBjLnN0YXRkCit1c2VzIHRoaXMgbnVtYmVyIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYWN0dWFsIHJlYm9vdHMKK2FuZCByZXBsYXllZCBub3RpZmljYXRpb25zLgorLlBQCitQYXJ0IG9mIE5GUyBsb2NrIHJlY292ZXJ5IGlzIHJlZGlzY292ZXJpbmcKK3doaWNoIHBlZXJzIG5lZWQgdG8gYmUgbW9uaXRvcmVkIGFnYWluLgorVGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgY2xlYXJzIHRoZSBtb25pdG9yIGxpc3Qgb24gcGVyc2lzdGVudCBzdG9yYWdlIGFmdGVyIGVhY2ggcmVib290LgorLlNIIE9QVElPTlMKKy5UUAorLkJSIC1kICwgIiAtLW5vLXN5c2xvZworQ2F1c2VzCisuQiBycGMuc3RhdGQKK3RvIHdyaXRlIGxvZyBtZXNzYWdlcyBvbgorLkkgc3RkZXJyCitpbnN0ZWFkIG9mIHRvIHRoZSBzeXN0ZW0gbG9nLAoraWYgdGhlCisuQiAtRgorb3B0aW9uIHdhcyBhbHNvIHNwZWNpZmllZC4KKy5UUAorLkJSIC1GICwgIiAtLWZvcmVncm91bmQKK0tlZXBzCisuQiBycGMuc3RhdGQKK2F0dGFjaGVkIHRvIGl0cyBjb250cm9sbGluZyB0ZXJtaW5hbCBzbyB0aGF0IE5TTQorb3BlcmF0aW9uIGNhbiBiZSBtb25pdG9yZWQgZGlyZWN0bHkgb3IgcnVuIHVuZGVyIGEgZGVidWdnZXIuCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLAorLkIgcnBjLnN0YXRkCitiYWNrZ3JvdW5kcyBpdHNlbGYgc29vbiBhZnRlciBpdCBzdGFydHMuCisuVFAKKy5CUiAtaCAsICIgLT8iICwgIiAtLWhlbHAKK0NhdXNlcworLkIgcnBjLnN0YXRkCit0byBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uIG9uCisuSSBzdGRlcnIKK2FuZCB0aGVuIGV4aXQuCisuVFAKKy5CSSAiXC1ILCIgIiIgIiBcLVwtaGEtY2FsbG91dCAiIHByb2cKK1NwZWNpZmllcyBhIGhpZ2ggYXZhaWxhYmlsaXR5IGNhbGxvdXQgcHJvZ3JhbS4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIG5vIGNhbGxvdXRzIGFyZSBwZXJmb3JtZWQuCitTZWUgdGhlCisuQiBIaWdoLWF2YWlsYWJpbGl0eSBjYWxsb3V0cworc2VjdGlvbiBiZWxvdyBmb3IgZGV0YWlscy4KKy5UUAorLkJSIC1MICwgIiAtLW5vLW5vdGlmeQorUHJldmVudHMKKy5CIHJwYy5zdGF0ZAorZnJvbSBydW5uaW5nIHRoZQorLkIgc20tbm90aWZ5Citjb21tYW5kIHdoZW4gaXQgc3RhcnRzIHVwLAorcHJlc2VydmluZyB0aGUgZXhpc3RpbmcgTlNNIHN0YXRlIG51bWJlciBhbmQgbW9uaXRvciBsaXN0LgorLklQCitOb3RlOiB0aGUKKy5CIHNtLW5vdGlmeQorY29tbWFuZCBjb250YWlucyBhIGNoZWNrIHRvIGVuc3VyZSBpdCBydW5zIG9ubHkgb25jZSBhZnRlciBlYWNoIHN5c3RlbSByZWJvb3QuCitUaGlzIHByZXZlbnRzIHNwdXJpb3VzIHJlYm9vdCBub3RpZmljYXRpb24gaWYKKy5CIHJwYy5zdGF0ZAorcmVzdGFydHMgd2l0aG91dCB0aGUKKy5CIC1MCitvcHRpb24uCisuVFAKKy5CSSAiXC1uLCAiICIiICJcLVwtbmFtZSAiIGlwYWRkciAiIHwgIiBob3N0bmFtZQorU3BlY2lmaWVzIHRoZSBiaW5kIGFkZHJlc3MgdXNlZCBmb3IgUlBDIGxpc3RlbmVyIHNvY2tldHMuCitUaGUKKy5JIGlwYWRkcgorZm9ybSBjYW4gYmUgZXhwcmVzc2VkIGFzIGVpdGhlciBhbiBJUHY0IG9yIGFuIElQdjYgcHJlc2VudGF0aW9uIGFkZHJlc3MuCitJZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLAorLkIgcnBjLnN0YXRkCit1c2VzIGEgd2lsZGNhcmQgYWRkcmVzcyBhcyB0aGUgdHJhbnNwb3J0IGJpbmQgYWRkcmVzcy4KKy5JUAorVGhpcyBzdHJpbmcgaXMgYWxzbyBwYXNzZWQgdG8gdGhlCisuQiBzbS1ub3RpZnkKK2NvbW1hbmQgdG8gYmUgdXNlZCBhcyB0aGUgc291cmNlIGFkZHJlc3MgZnJvbSB3aGljaAordG8gc2VuZCByZWJvb3Qgbm90aWZpY2F0aW9uIHJlcXVlc3RzLgorU2VlCisuQlIgc20tbm90aWZ5ICg4KQorZm9yIGRldGFpbHMuCisuVFAKKy5CUiAtTgorQ2F1c2VzCisuQiBycGMuc3RhdGQKK3RvIHJ1biB0aGUKKy5CIHNtLW5vdGlmeQorY29tbWFuZCwgYW5kIHRoZW4gZXhpdC4KK1NpbmNlIHRoZQorLkIgc20tbm90aWZ5Citjb21tYW5kIGNhbiBhbHNvIGJlIHJ1biBkaXJlY3RseSwgdGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZC4KKy5UUAorLkJJICJcLW8sIiAiIiAiIFwtXC1vdXRnb2luZ1wtcG9ydCAiICBwb3J0CitTcGVjaWZpZXMgdGhlIHNvdXJjZSBwb3J0IG51bWJlciB0aGUKKy5CIHNtLW5vdGlmeQorY29tbWFuZCBzaG91bGQgdXNlIHdoZW4gc2VuZGluZyByZWJvb3Qgbm90aWZpY2F0aW9ucy4KK1NlZQorLkJSIHNtLW5vdGlmeSAoOCkKK2ZvciBkZXRhaWxzLgorLlRQCisuQkkgIlwtcCwiICIiICIgXC1cLXBvcnQgIiBwb3J0CitTcGVjaWZpZXMgdGhlIHBvcnQgbnVtYmVyIHVzZWQgZm9yIFJQQyBsaXN0ZW5lciBzb2NrZXRzLgorSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwKKy5CIHJwYy5zdGF0ZAorY2hvb3NlcyBhIHJhbmRvbSBlcGhlbWVyYWwgcG9ydCBmb3IgZWFjaCBsaXN0ZW5lciBzb2NrZXQuCisuSVAKK1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGZpeCB0aGUgcG9ydCB2YWx1ZSBvZiBpdHMgbGlzdGVuZXJzIHdoZW4KK1NNX05PVElGWSByZXF1ZXN0cyBtdXN0IHRyYXZlcnNlIGEgZmlyZXdhbGwgYmV0d2VlbiBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorLlRQCisuQkkgIlwtUCwgIiAiIiBcLVwtc3RhdGVcLWRpcmVjdG9yeVwtcGF0aCAiIHBhdGhuYW1lCitTcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5Cit3aGVyZSBOU00gc3RhdGUgaW5mb3JtYXRpb24gcmVzaWRlcy4KK0lmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsCisuQiBycGMuc3RhdGQKK3VzZXMKKy5JIC92YXIvbGliL25mcworYnkgZGVmYXVsdC4KKy5JUAorQWZ0ZXIgc3RhcnRpbmcsCisuQiBycGMuc3RhdGQKK2F0dGVtcHRzIHRvIHNldCBpdHMgZWZmZWN0aXZlIFVJRCBhbmQgR0lEIHRvIHRoZSBvd25lcgorYW5kIGdyb3VwIG9mIHRoaXMgZGlyZWN0b3J5LgorLlRQCisuQlIgLXYgIiwgIiAtViAiLCAiIC0tdmVyc2lvbgorQ2F1c2VzCisuQiBycGMuc3RhdGQKK3RvIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBvbgorLkkgc3RkZXJyCithbmQgdGhlbiBleGl0LgorLlNIIFNFQ1VSSVRZCitUaGUKKy5CIHJwYy5zdGF0ZAorZGFlbW9uIG11c3QgYmUgc3RhcnRlZCBhcyByb290IHRvIGFjcXVpcmUgcHJpdmlsZWdlcyBuZWVkZWQKK3RvIGNyZWF0ZSBzb2NrZXRzIHdpdGggcHJpdmlsZWdlZCBzb3VyY2UgcG9ydHMsIGFuZCB0byBhY2Nlc3MgdGhlCitzdGF0ZSBpbmZvcm1hdGlvbiBkYXRhYmFzZS4KK0JlY2F1c2UKKy5CIHJwYy5zdGF0ZAorbWFpbnRhaW5zIGEgbG9uZy1ydW5uaW5nIG5ldHdvcmsgc2VydmljZSwgaG93ZXZlciwgaXQgZHJvcHMgcm9vdCBwcml2aWxlZ2VzCithcyBzb29uIGFzIGl0IHN0YXJ0cyB1cCB0byByZWR1Y2UgdGhlIHJpc2sgb2YgYSBwcml2aWxlZ2UgZXNjYWxhdGlvbiBhdHRhY2suCisuUFAKK0R1cmluZyBub3JtYWwgb3BlcmF0aW9uLAordGhlIGVmZmVjdGl2ZSB1c2VyIElEIGl0IGNob29zZXMgaXMgdGhlIG93bmVyIG9mIHRoZSBzdGF0ZSBkaXJlY3RvcnkuCitUaGlzIGFsbG93cyBpdCB0byBjb250aW51ZSB0byBhY2Nlc3MgZmlsZXMgaW4gdGhhdCBkaXJlY3RvcnkgYWZ0ZXIgaXQKK2hhcyBkcm9wcGVkIGl0cyByb290IHByaXZpbGVnZXMuCitUbyBjb250cm9sIHdoaWNoIHVzZXIgSUQKKy5CIHJwYy5zdGF0ZAorY2hvb3Nlcywgc2ltcGx5IHVzZQorLkJSIGNob3duICgxKQordG8gc2V0IHRoZSBvd25lciBvZgordGhlIHN0YXRlIGRpcmVjdG9yeS4KKy5QUAorWW91IGNhbiBhbHNvIHByb3RlY3QgeW91cgorLkIgcnBjLnN0YXRkCitsaXN0ZW5lcnMgdXNpbmcgdGhlCisuQiB0Y3Bfd3JhcHBlcgorbGlicmFyeSBvcgorLkJSIGlwdGFibGVzICg4KS4KK1RvIHVzZSB0aGUKKy5CIHRjcF93cmFwcGVyCitsaWJyYXJ5LCBhZGQgdGhlIGhvc3RuYW1lcyBvZiBwZWVycyB0aGF0IHNob3VsZCBiZSBhbGxvd2VkIGFjY2VzcyB0bworLklSIC9ldGMvaG9zdHMuYWxsb3cgLgorVXNlIHRoZSBkYWVtb24gbmFtZQorLkIgc3RhdGQKK2V2ZW4gaWYgdGhlCisuQiBycGMuc3RhdGQKK2JpbmFyeSBoYXMgYSBkaWZmZXJlbnQgZmlsZW5hbWUuCisuUAorRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZQorLkJSIHRjcGQgKDgpCithbmQKKy5CUiBob3N0c19hY2Nlc3MgKDUpCittYW4gcGFnZXMuCisuU0ggQURESVRJT05BTCBOT1RFUworTG9jayByZWNvdmVyeSBhZnRlciBhIHJlYm9vdCBpcyBjcml0aWNhbCB0byBtYWludGFpbmluZyBkYXRhIGludGVncml0eQorYW5kIHByZXZlbnRpbmcgdW5uZWNlc3NhcnkgYXBwbGljYXRpb24gaGFuZ3MuCisuUFAKK1RvIGhlbHAKKy5CIHJwYy5zdGF0ZAorbWF0Y2ggU01fTk9USUZZIHJlcXVlc3RzIHRvIE5MTSByZXF1ZXN0cywgYSBudW1iZXIgb2YgYmVzdCBwcmFjdGljZXMKK3Nob3VsZCBiZSBvYnNlcnZlZCwgaW5jbHVkaW5nOgorLklQCitUaGUgVVRTIG5vZGVuYW1lIG9mIHlvdXIgc3lzdGVtcyBzaG91bGQgbWF0Y2ggdGhlIEROUyBuYW1lcyB0aGF0IE5GUworcGVlcnMgdXNlIHRvIGNvbnRhY3QgdGhlbQorLklQCitUaGUgVVRTIG5vZGVuYW1lcyBvZiB5b3VyIHN5c3RlbXMgc2hvdWxkIGFsd2F5cyBiZSBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWVzCisuSVAKK1RoZSBmb3J3YXJkIGFuZCByZXZlcnNlIEROUyBtYXBwaW5nIG9mIHRoZSBVVFMgbm9kZW5hbWVzIHNob3VsZCBiZQorY29uc2lzdGVudAorLklQCitUaGUgaG9zdG5hbWUgdGhlIGNsaWVudCB1c2VzIHRvIG1vdW50IHRoZSBzZXJ2ZXIgc2hvdWxkIG1hdGNoIHRoZSBzZXJ2ZXIncworLkkgbW9uX25hbWUKK2luIFNNX05PVElGWSByZXF1ZXN0cyBpdCBzZW5kcworLklQCitUaGUgdXNlIG9mIG5ldHdvcmsgYWRkcmVzc2VzIGFzIGEKKy5JIG1vbl9uYW1lCitvciBhCisuSSBteV9uYW1lCitzdHJpbmcgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbgoraW50ZXJvcGVyYXRpbmcgd2l0aCBub24tTGludXggTkZTIGltcGxlbWVudGF0aW9ucy4KKy5QUAorVW5tb3VudGluZyBhbiBORlMgZmlsZSBzeXN0ZW0gZG9lcyBub3QgbmVjZXNzYXJpbHkgc3RvcAorZWl0aGVyIHRoZSBORlMgY2xpZW50IG9yIHNlcnZlciBmcm9tIG1vbml0b3JpbmcgZWFjaCBvdGhlci4KK0JvdGggbWF5IGNvbnRpbnVlIG1vbml0b3JpbmcgZWFjaCBvdGhlciBmb3IgYSB0aW1lIGluIGNhc2Ugc3Vic2VxdWVudAorTkZTIHRyYWZmaWMgYmV0d2VlbiB0aGUgdHdvIHJlc3VsdHMgaW4gZnJlc2ggbW91bnRzIGFuZCBhZGRpdGlvbmFsCitmaWxlIGxvY2tpbmcuCisuUFAKK09uIExpbnV4LCBpZiB0aGUKKy5CIGxvY2tkCitrZXJuZWwgbW9kdWxlIGlzIHVubG9hZGVkIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uLAorYWxsIHJlbW90ZSBORlMgcGVlcnMgYXJlIHVubW9uaXRvcmVkLgorVGhpcyBjYW4gaGFwcGVuIG9uIGFuIE5GUyBjbGllbnQsIGZvciBleGFtcGxlLAoraWYgYW4gYXV0b21vdW50ZXIgcmVtb3ZlcyBhbGwgTkZTIG1vdW50Citwb2ludHMgZHVlIHRvIGluYWN0aXZpdHkuCisuU1MgSGlnaC1hdmFpbGFiaWxpdHkgY2FsbG91dHMKKy5CIHJwYy5zdGF0ZAorY2FuIGV4ZWMgYSBzcGVjaWFsIGNhbGxvdXQgcHJvZ3JhbSBkdXJpbmcgcHJvY2Vzc2luZyBvZgorc3VjY2Vzc2Z1bCBTTV9NT04sIFNNX1VOTU9OLCBhbmQgU01fVU5NT05fQUxMIHJlcXVlc3RzLgorU3VjaCBhIHByb2dyYW0gbWF5IGJlIHVzZWQgaW4gSGlnaCBBdmFpbGFiaWxpdHkgTkZTIChIQS1ORlMpCitlbnZpcm9ubWVudHMgdG8gdHJhY2sgbG9jayBzdGF0ZSB0aGF0IG1heSBuZWVkIHRvIGJlIG1pZ3JhdGVkIGFmdGVyCithIHN5c3RlbSByZWJvb3QuCisuUFAKK1RoZSBuYW1lIG9mIHRoZSBjYWxsb3V0IHByb2dyYW0gaXMgc3BlY2lmaWVkIHdpdGggdGhlCisuQiAtSAorb3B0aW9uLgorVGhlIHByb2dyYW0gaXMgcnVuIHdpdGggMyBhcmd1bWVudHM6CitUaGUgZmlyc3QgaXMgZWl0aGVyCisuQiBhZGQtY2xpZW50CitvcgorLkIgZGVsLWNsaWVudAorZGVwZW5kaW5nIG9uIHRoZSByZWFzb24gZm9yIHRoZSBjYWxsb3V0LgorVGhlIHNlY29uZCBpcyB0aGUKKy5JIG1vbl9uYW1lCitvZiB0aGUgbW9uaXRvcmVkIHBlZXIuCitUaGUgdGhpcmQgaXMgdGhlCisuSSBjYWxsZXJfbmFtZQorb2YgdGhlIHJlcXVlc3RpbmcgbG9jayBtYW5hZ2VyLgorLlNTIElQdjYgYW5kIFRJLVJQQyBzdXBwb3J0CitUSS1SUEMgaXMgYSBwcmUtcmVxdWlzaXRlIGZvciBzdXBwb3J0aW5nIE5GUyBvbiBJUHY2LgorSWYgVEktUlBDIHN1cHBvcnQgaXMgYnVpbHQgaW50bworLkJSIHJwYy5zdGF0ZCAsCitpdCBhdHRlbXB0cyB0byBzdGFydCBsaXN0ZW5lcnMgb24gbmV0d29yayB0cmFuc3BvcnRzIG1hcmtlZAorJ3Zpc2libGUnIGluCisuSVIgL2V0Yy9uZXRjb25maWcgLgorQXMgbG9uZyBhcyBhdCBsZWFzdCBvbmUgbmV0d29yayB0cmFuc3BvcnQgbGlzdGVuZXIgc3RhcnRzIHN1Y2Nlc3NmdWxseSwKKy5CIHJwYy5zdGF0ZAord2lsbCBvcGVyYXRlLgorLlNIIEZJTEVTCisuVFAgMi41aQorLkkgL3Zhci9saWIvbmZzL3NtCitkaXJlY3RvcnkgY29udGFpbmluZyBtb25pdG9yIGxpc3QKKy5UUCAyLjVpCisuSSAvdmFyL2xpYi9uZnMvc20uYmFrCitkaXJlY3RvcnkgY29udGFpbmluZyBub3RpZnkgbGlzdAorLlRQIDIuNWkKKy5JIC92YXIvbGliL25mcy9zdGF0ZQorTlNNIHN0YXRlIG51bWJlciBmb3IgdGhpcyBob3N0CisuVFAgMi41aQorLkkgL3Zhci9ydW4vcnVuLnN0YXRkLnBpZAorcGlkIGZpbGUKKy5UUCAyLjVpCisuSSAvZXRjL25ldGNvbmZpZworbmV0d29yayB0cmFuc3BvcnQgY2FwYWJpbGl0eSBkYXRhYmFzZQorLlNIIFNFRSBBTFNPCisuQlIgc20tbm90aWZ5ICg4KSwKKy5CUiBuZnMgKDUpLAorLkJSIHJwYy5uZnNkICg4KSwKKy5CUiBycGNiaW5kICg4KSwKKy5CUiB0Y3BkICg4KSwKKy5CUiBob3N0c19hY2Nlc3MgKDUpLAorLkJSIGlwdGFibGVzICg4KSwKKy5CUiBuZXRjb25maWcgKDUpCisuc3AKK1JGQyAxMDk0IC0gIk5GUzogTmV0d29yayBGaWxlIFN5c3RlbSBQcm90b2NvbCBTcGVjaWZpY2F0aW9uIgorLmJyCitSRkMgMTgxMyAtICJORlMgVmVyc2lvbiAzIFByb3RvY29sIFNwZWNpZmljYXRpb24iCisuYnIKK09wZW5Hcm91cCBQcm90b2NvbHMgZm9yIEludGVyd29ya2luZzogWE5GUywgVmVyc2lvbiAzVyAtIENoYXB0ZXIgMTEKKy5TSCBBVVRIT1JTCitKZWZmIFVwaG9mZiA8anVwaG9mZkB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisuYnIKK09sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorLmJyCitILkouIEx1IDxoamxAZ251Lm9yZz4KKy5icgorTG9uIEhvaGJlcmdlciA8aG9oYmVyZ2VyQG1pc3Npb25jcml0aWNhbGxpbnV4LmNvbT4KKy5icgorUGF1bCBDbGVtZW50cyA8cGF1bC5jbGVtZW50c0BzdGVlbGV5ZS5jb20+CisuYnIKK0NodWNrIExldmVyIDxjaHVjay5sZXZlckBvcmFjbGUuY29tPgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLTEuMi4yL3V0aWxzL3N0YXRkL3N2Y19ydW4uYyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdmNfcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4ZWNlZQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zdmNfcnVuLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5ODQgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogTW9kaWZpZWQgYnkgSmVmZnJleSBBLiBVcGhvZmYsIDE5OTUsIDE5OTctMTk5OS4KKyAqIE1vZGlmaWVkIGJ5IE9sYWYgS2lyY2gsIDE5OTYuCisgKgorICogTlNNIGZvciBMaW51eC4KKyAqLworCisvKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAqICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICogICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyogCisgKiBUaGlzIGhhcyBiZWVuIG1vZGlmaWVkIGZvciBteSBvd24gZXZpbCBwdXJwb3NlcyB0byBwcmV2ZW50IGRlYWRsb2NrcworICogd2hlbiB0d28gaG9zdHMgc3RhcnQgTlNNJ3Mgc2ltdWx0YW5lb3VzbHkgYW5kIHRyeSB0byBub3RpZnkgZWFjaAorICogb3RoZXIgKHdoaWNoIG1haW5seSBvY2N1cnMgZHVyaW5nIHRlc3RpbmcpLCBvciB0byBzdG9wIGFuZCBzbWVsbCB0aGUKKyAqIHJvc2VzIHdoZW4gSSBoYXZlIGNhbGxiYWNrcyBkdWUuCisgKiAtLUplZmYgVXBob2ZmLgorICovCisKKy8qIAorICogVGhpcyBpcyB0aGUgUlBDIHNlcnZlciBzaWRlIGlkbGUgbG9vcC4KKyAqIFdhaXQgZm9yIGlucHV0LCBjYWxsIHNlcnZlciBwcm9ncmFtLgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgInN0YXRkLmgiCisjaW5jbHVkZSAibm90bGlzdC5oIgorCitzdGF0aWMgaW50CXN2Y19zdG9wID0gMDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGdsb2JhbCBub3RpZnkgbGlzdCBvbnRvIHdoaWNoIGFsbCBTTV9OT1RJRlkgYW5kIENBTExCQUNLCisgKiByZXF1ZXN0cyBhcmUgcHV0LgorICovCitub3RpZnlfbGlzdCAqCW5vdGlmeSA9IE5VTEw7CisKKy8qCisgKiBKdW1wLW9mZiBmdW5jdGlvbi4KKyAqLwordm9pZAorbXlfc3ZjX2V4aXQodm9pZCkKK3sKKwlzdmNfc3RvcCA9IDE7Cit9CisKKworLyoKKyAqIFRoZSBoZWFydCBvZiB0aGUgc2VydmVyLiAgQSBjcmliIGZyb20gbGliYyBmb3IgdGhlIG1vc3QgcGFydC4uLgorICovCit2b2lkCitteV9zdmNfcnVuKHZvaWQpCit7CisJRkRfU0VUX1RZUEUJcmVhZGZkczsKKwlpbnQgICAgICAgICAgICAgc2VscmV0OworCXRpbWVfdAkJbm93OworCisJc3ZjX3N0b3AgPSAwOworCisJZm9yICg7OykgeworCQlpZiAoc3ZjX3N0b3ApCisJCQlyZXR1cm47CisKKwkJLyogQWgsIHRoZXJlIGFyZSBzb21lIG5vdGlmaWNhdGlvbnMgdG8gYmUgcHJvY2Vzc2VkICovCisJCXdoaWxlIChub3RpZnkgJiYgTkxfV0hFTihub3RpZnkpIDw9IHRpbWUoJm5vdykpIHsKKwkJCXByb2Nlc3Nfbm90aWZ5X2xpc3QoKTsKKwkJfQorCisJCXJlYWRmZHMgPSBTVkNfRkRTRVQ7CisJCWlmIChub3RpZnkpIHsKKwkJCXN0cnVjdCB0aW1ldmFsCXR2OworCisJCQl0di50dl9zZWMgID0gTkxfV0hFTihub3RpZnkpIC0gbm93OworCQkJdHYudHZfdXNlYyA9IDA7CisJCQl4bG9nKERfR0VORVJBTCwgIldhaXRpbmcgZm9yIHJlcGx5Li4uICh0aW1lbyAlZCkiLAorCQkJCQkJCXR2LnR2X3NlYyk7CisJCQlzZWxyZXQgPSBzZWxlY3QoRkRfU0VUU0laRSwgJnJlYWRmZHMsCisJCQkJKHZvaWQgKikgMCwgKHZvaWQgKikgMCwgJnR2KTsKKwkJfSBlbHNlIHsKKwkJCXhsb2coRF9HRU5FUkFMLCAiV2FpdGluZyBmb3IgY2xpZW50IGNvbm5lY3Rpb25zIik7CisJCQlzZWxyZXQgPSBzZWxlY3QoRkRfU0VUU0laRSwgJnJlYWRmZHMsCisJCQkJKHZvaWQgKikgMCwgKHZvaWQgKikgMCwgKHN0cnVjdCB0aW1ldmFsICopIDApOworCQl9CisKKwkJc3dpdGNoIChzZWxyZXQpIHsKKwkJY2FzZSAtMToKKwkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQ09OTlJFRlVTRUQKKwkJCSB8fCBlcnJubyA9PSBFTkVUVU5SRUFDSCB8fCBlcnJubyA9PSBFSE9TVFVOUkVBQ0gpCisJCQkJY29udGludWU7CisJCQl4bG9nKExfRVJST1IsICJteV9zdmNfcnVuKCkgLSBzZWxlY3Q6ICVtIik7CisJCQlyZXR1cm47CisKKwkJY2FzZSAwOgorCQkJLyogQSBub3RpZnkvY2FsbGJhY2sgdGltZWQgb3V0LiAqLworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCXNlbHJldCAtPSBwcm9jZXNzX3JlcGx5KCZyZWFkZmRzKTsKKwkJCWlmIChzZWxyZXQpCisJCQkJc3ZjX2dldHJlcXNldCgmcmVhZGZkcyk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc3lzdGVtLmggYi9uZnMtdXRpbHMtMS4yLjIvdXRpbHMvc3RhdGQvc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3MzljNAotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy0xLjIuMi91dGlscy9zdGF0ZC9zeXN0ZW0uaApAQCAtMCwwICsxLDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk2IE9sYWYgS2lyY2gKKyAqIE1vZGlmaWVkIGJ5IEplZmZyZXkgQS4gVXBob2ZmLCAxOTk3LCAxOTk5LgorICoKKyAqIE5TTSBmb3IgTGludXguCisgKi8KKworLyoKKyAqIFN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zCisgKi8KKworI2lmZGVmIEZEX1NFVFNJWkUKKyMgZGVmaW5lIEZEX1NFVF9UWVBFCWZkX3NldAorIyBkZWZpbmUgU1ZDX0ZEU0VUCXN2Y19mZHNldAorI2Vsc2UKKyMgZGVmaW5lIEZEX1NFVF9UWVBFCWludAorIyBkZWZpbmUgU1ZDX0ZEU0VUCXN2Y19mZHMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLnBhdGNoZXMvbmZzLXV0aWxzLTUwLmRlc2NyaXB0aW9uIGIvbmZzLXV0aWxzLnBhdGNoZXMvbmZzLXV0aWxzLTUwLmRlc2NyaXB0aW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MTZiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9uZnMtdXRpbHMucGF0Y2hlcy9uZnMtdXRpbHMtNTAuZGVzY3JpcHRpb24KQEAgLTAsMCArMSwyIEBACitUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgYnVpbGRpbmcgZnJvbSBub24tY29sb2NhdGVkIHNvdXJjZSBhbmQgCitvYmplY3QgZGlyZWN0b3JpZXMuCmRpZmYgLS1naXQgYS9uZnMtdXRpbHMucGF0Y2hlcy9uZnMtdXRpbHMtNTAucGF0Y2ggYi9uZnMtdXRpbHMucGF0Y2hlcy9uZnMtdXRpbHMtNTAucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwYzBlNQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy5wYXRjaGVzL25mcy11dGlscy01MC5wYXRjaApAQCAtMCwwICsxLDI1OSBAQAorZGlmZiAtYXJ1TiBhL3N1cHBvcnQvZXhwb3J0L01ha2VmaWxlLmFtIGIvc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUuYW0KKy0tLSBhL3N1cHBvcnQvZXhwb3J0L01ha2VmaWxlLmFtCTIwMTAtMDItMTggMDQ6MzU6MDAuMDAwMDAwMDAwIC0wODAwCisrKysgYi9zdXBwb3J0L2V4cG9ydC9NYWtlZmlsZS5hbQkyMDEwLTA5LTA4IDA4OjM3OjA3LjAwMDAwMDAwMCAtMDcwMAorQEAgLTMyLDEwICszMiwxNiBAQAorICQoR0VORklMRVNfQ0xOVCk6ICVfY2xudC5jOiAlLnggJChSUENHRU4pCisgCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKyAJJChSUENHRU4pIC1sIC1vICRAICQ8CisrCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorKwlybSAtZiAkQAorKwltdiAtZiAkQC5OICRACisgCisgJChHRU5GSUxFU19YRFIpOiAlX3hkci5jOiAlLnggJChSUENHRU4pCisgCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKyAJJChSUENHRU4pIC1jIC1vICRAICQ8CisrCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorKwlybSAtZiAkQAorKwltdiAtZiAkQC5OICRACisgCisgJChHRU5GSUxFU19IKTogJS5oOiAlLnggJChSUENHRU4pCisgCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKK2RpZmYgLWFydU4gYS9zdXBwb3J0L2V4cG9ydC9NYWtlZmlsZS5pbiBiL3N1cHBvcnQvZXhwb3J0L01ha2VmaWxlLmluCistLS0gYS9zdXBwb3J0L2V4cG9ydC9NYWtlZmlsZS5pbgkyMDEwLTAyLTE4IDA0OjM2OjQyLjAwMDAwMDAwMCAtMDgwMAorKysrIGIvc3VwcG9ydC9leHBvcnQvTWFrZWZpbGUuaW4JMjAxMC0wOS0wOCAwODozOTozNS4wMDAwMDAwMDAgLTA3MDAKK0BAIC02Niw3ICs2Niw3IEBACisgCWhvc3RuYW1lLiQoT0JKRVhUKSBuZnNjdGwuJChPQkpFWFQpIHJtdGFiLiQoT0JKRVhUKSBcCisgCXh0YWIuJChPQkpFWFQpIG1vdW50X2NsbnQuJChPQkpFWFQpIG1vdW50X3hkci4kKE9CSkVYVCkKKyBsaWJleHBvcnRfYV9PQkpFQ1RTID0gJChhbV9saWJleHBvcnRfYV9PQkpFQ1RTKQorLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZQorK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3VwcG9ydC9pbmNsdWRlCisgZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorIGFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCisgYW1fX212ID0gbXYgLWYKK0BAIC01NjEsMTAgKzU2MSwxNiBAQAorICQoR0VORklMRVNfQ0xOVCk6ICVfY2xudC5jOiAlLnggJChSUENHRU4pCisgCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKyAJJChSUENHRU4pIC1sIC1vICRAICQ8CisrCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorKwlybSAtZiAkQAorKwltdiAtZiAkQC5OICRACisgCisgJChHRU5GSUxFU19YRFIpOiAlX3hkci5jOiAlLnggJChSUENHRU4pCisgCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKKyAJJChSUENHRU4pIC1jIC1vICRAICQ8CisrCSQoU0VEKSAicywkKGFic19zcmNkaXIpLCQoYWJzX2J1aWxkZGlyKSxnIiA8ICRAID4gJEAuTgorKwlybSAtZiAkQAorKwltdiAtZiAkQC5OICRACisgCisgJChHRU5GSUxFU19IKTogJS5oOiAlLnggJChSUENHRU4pCisgCXRlc3QgLWYgJEAgJiYgcm0gLXJmICRAIHx8IHRydWUKK2RpZmYgLWFydU4gYS9zdXBwb3J0L21pc2MvTWFrZWZpbGUuaW4gYi9zdXBwb3J0L21pc2MvTWFrZWZpbGUuaW4KKy0tLSBhL3N1cHBvcnQvbWlzYy9NYWtlZmlsZS5pbgkyMDEwLTAyLTE4IDA0OjM2OjQzLjAwMDAwMDAwMCAtMDgwMAorKysrIGIvc3VwcG9ydC9taXNjL01ha2VmaWxlLmluCTIwMTAtMDktMDggMDg6NDE6MzUuMDAwMDAwMDAwIC0wNzAwCitAQCAtNjMsNyArNjMsNyBAQAorIGFtX2xpYm1pc2NfYV9PQkpFQ1RTID0gdGNwd3JhcHBlci4kKE9CSkVYVCkgZnJvbV9sb2NhbC4kKE9CSkVYVCkgXAorIAltb3VudHBvaW50LiQoT0JKRVhUKQorIGxpYm1pc2NfYV9PQkpFQ1RTID0gJChhbV9saWJtaXNjX2FfT0JKRUNUUykKKy1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUKKytERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorIGRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKKyBhbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworIGFtX19tdiA9IG12IC1mCitkaWZmIC1hcnVOIGEvc3VwcG9ydC9uZnMvTWFrZWZpbGUuaW4gYi9zdXBwb3J0L25mcy9NYWtlZmlsZS5pbgorLS0tIGEvc3VwcG9ydC9uZnMvTWFrZWZpbGUuaW4JMjAxMC0wMi0xOCAwNDozNjo0My4wMDAwMDAwMDAgLTA4MDAKKysrKyBiL3N1cHBvcnQvbmZzL01ha2VmaWxlLmluCTIwMTAtMDktMDggMDg6NDI6MTMuMDAwMDAwMDAwIC0wNzAwCitAQCAtNjgsNyArNjgsNyBAQAorIAljYWNoZWlvLiQoT0JKRVhUKSBjbG9zZWFsbC4kKE9CSkVYVCkgbmZzX21udGVudC4kKE9CSkVYVCkgXAorIAljb25mZmlsZS4kKE9CSkVYVCkgc3ZjX2NyZWF0ZS4kKE9CSkVYVCkKKyBsaWJuZnNfYV9PQkpFQ1RTID0gJChhbV9saWJuZnNfYV9PQkpFQ1RTKQorLURFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZQorK0RFRkFVTFRfSU5DTFVERVMgPSAtSS5AYW1fX2lzcmNAIC1JJCh0b3BfYnVpbGRkaXIpL3N1cHBvcnQvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3VwcG9ydC9pbmNsdWRlCisgZGVwY29tcCA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvZGVwY29tcAorIGFtX19kZXBmaWxlc19tYXliZSA9IGRlcGZpbGVzCisgYW1fX212ID0gbXYgLWYKK2RpZmYgLWFydU4gYS9zdXBwb3J0L25zbS9NYWtlZmlsZS5hbSBiL3N1cHBvcnQvbnNtL01ha2VmaWxlLmFtCistLS0gYS9zdXBwb3J0L25zbS9NYWtlZmlsZS5hbQkyMDEwLTAyLTE4IDA0OjM1OjAwLjAwMDAwMDAwMCAtMDgwMAorKysrIGIvc3VwcG9ydC9uc20vTWFrZWZpbGUuYW0JMjAxMC0wOS0wOCAwODo1MzowOS4wMDAwMDAwMDAgLTA3MDAKK0BAIC0yNSwxNCArMjUsMjMgQEAKKyAkKEdFTkZJTEVTX0NMTlQpOiAlX2NsbnQuYzogJS54ICQoUlBDR0VOKQorIAl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisgCSQoUlBDR0VOKSAtbCAtbyAkQCAkPAorKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKysJcm0gLWYgJEAKKysJbXYgLWYgJEAuTiAkQAorIAorICQoR0VORklMRVNfU1ZDKTogJV9zdmMuYzogJS54ICQoUlBDR0VOKQorIAl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisgCSQoUlBDR0VOKSAtbSAtbyAkQCAkPAorKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKysJcm0gLWYgJEAKKysJbXYgLWYgJEAuTiAkQAorIAorICQoR0VORklMRVNfWERSKTogJV94ZHIuYzogJS54ICQoUlBDR0VOKQorIAl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCisgCSQoUlBDR0VOKSAtYyAtbyAkQCAkPAorKwkkKFNFRCkgInMsJChhYnNfc3JjZGlyKSwkKGFic19idWlsZGRpciksZyIgPCAkQCA+ICRALk4KKysJcm0gLWYgJEAKKysJbXYgLWYgJEAuTiAkQAorIAorICQoR0VORklMRVNfSCk6ICUuaDogJS54ICQoUlBDR0VOKQorIAl0ZXN0IC1mICRAICYmIHJtIC1yZiAkQCB8fCB0cnVlCitkaWZmIC1hcnVOIGEvc3VwcG9ydC9uc20vTWFrZWZpbGUuaW4gYi9zdXBwb3J0L25zbS9NYWtlZmlsZS5pbgorLS0tIGEvc3VwcG9ydC9uc20vTWFrZWZpbGUuaW4JMjAxMC0wMi0xOCAwNDozNjo0My4wMDAwMDAwMDAgLTA4MDAKKysrKyBiL3N1cHBvcnQvbnNtL01ha2VmaWxlLmluCTIwMTAtMDktMDggMDg6NTU6MjguMDAwMDAwMDAwIC0wNzAwCitAQCAtNjgsNyArNjgsNyBAQAorIAkkKGFtX19vYmplY3RzXzQpCisgYW1fbGlibnNtX2FfT0JKRUNUUyA9ICQoYW1fX29iamVjdHNfNSkgZmlsZS4kKE9CSkVYVCkgcnBjLiQoT0JKRVhUKQorIGxpYm5zbV9hX09CSkVDVFMgPSAkKGFtX2xpYm5zbV9hX09CSkVDVFMpCistREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCisrREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKKyBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCisgYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKKyBhbV9fbXYgPSBtdiAtZgorQEAgLTU0OSwxNCArNTQ5LDIzIEBACisgJChHRU5GSUxFU19DTE5UKTogJV9jbG50LmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLWwgLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX1NWQyk6ICVfc3ZjLmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLW0gLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX1hEUik6ICVfeGRyLmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLWMgLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX0gpOiAlLmg6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorZGlmZiAtYXJ1TiBhL3V0aWxzL2V4cG9ydGZzL01ha2VmaWxlLmluIGIvdXRpbHMvZXhwb3J0ZnMvTWFrZWZpbGUuaW4KKy0tLSBhL3V0aWxzL2V4cG9ydGZzL01ha2VmaWxlLmluCTIwMTAtMDItMTggMDQ6MzY6NDQuMDAwMDAwMDAwIC0wODAwCisrKysgYi91dGlscy9leHBvcnRmcy9NYWtlZmlsZS5pbgkyMDEwLTA5LTA4IDA4OjU3OjIwLjAwMDAwMDAwMCAtMDcwMAorQEAgLTY2LDcgKzY2LDcgQEAKKyBleHBvcnRmc19ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L2V4cG9ydC9saWJleHBvcnQuYSBcCisgCS4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEgXAorIAkkKGFtX19ERVBFTkRFTkNJRVNfMSkgJChhbV9fREVQRU5ERU5DSUVTXzEpCistREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCisrREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKKyBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCisgYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKKyBhbV9fbXYgPSBtdiAtZgorZGlmZiAtYXJ1TiBhL3V0aWxzL21vdW50L01ha2VmaWxlLmluIGIvdXRpbHMvbW91bnQvTWFrZWZpbGUuaW4KKy0tLSBhL3V0aWxzL21vdW50L01ha2VmaWxlLmluCTIwMTAtMDItMTggMDQ6MzY6NDQuMDAwMDAwMDAwIC0wODAwCisrKysgYi91dGlscy9tb3VudC9NYWtlZmlsZS5pbgkyMDEwLTA5LTA4IDA5OjA5OjA2LjAwMDAwMDAwMCAtMDcwMAorQEAgLTc3LDcgKzc3LDcgQEAKKyBtb3VudF9uZnNfT0JKRUNUUyA9ICQoYW1fbW91bnRfbmZzX09CSkVDVFMpCisgbW91bnRfbmZzX0RFUEVOREVOQ0lFUyA9IC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIFwKKyAJLi4vLi4vc3VwcG9ydC9leHBvcnQvbGliZXhwb3J0LmEKKy1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUKKytERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorIGRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKKyBhbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworIGFtX19tdiA9IG12IC1mCitkaWZmIC1hcnVOIGEvdXRpbHMvbW91bnRkL01ha2VmaWxlLmluIGIvdXRpbHMvbW91bnRkL01ha2VmaWxlLmluCistLS0gYS91dGlscy9tb3VudGQvTWFrZWZpbGUuaW4JMjAxMC0wMi0xOCAwNDozNjo0NC4wMDAwMDAwMDAgLTA4MDAKKysrKyBiL3V0aWxzL21vdW50ZC9NYWtlZmlsZS5pbgkyMDEwLTA5LTA4IDA4OjU4OjU4LjAwMDAwMDAwMCAtMDcwMAorQEAgLTcwLDcgKzcwLDcgQEAKKyAJLi4vLi4vc3VwcG9ydC9uZnMvbGlibmZzLmEgLi4vLi4vc3VwcG9ydC9taXNjL2xpYm1pc2MuYSBcCisgCSQoYW1fX0RFUEVOREVOQ0lFU18xKSAkKGFtX19ERVBFTkRFTkNJRVNfMSkgXAorIAkkKGFtX19ERVBFTkRFTkNJRVNfMSkgJChhbV9fREVQRU5ERU5DSUVTXzEpCistREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCisrREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKKyBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCisgYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKKyBhbV9fbXYgPSBtdiAtZgorZGlmZiAtYXJ1TiBhL3V0aWxzL25mc2QvTWFrZWZpbGUuaW4gYi91dGlscy9uZnNkL01ha2VmaWxlLmluCistLS0gYS91dGlscy9uZnNkL01ha2VmaWxlLmluCTIwMTAtMDItMTggMDQ6MzY6NDQuMDAwMDAwMDAwIC0wODAwCisrKysgYi91dGlscy9uZnNkL01ha2VmaWxlLmluCTIwMTAtMDktMDggMDk6MDA6MTkuMDAwMDAwMDAwIC0wNzAwCitAQCAtNjIsNyArNjIsNyBAQAorIGFtX25mc2RfT0JKRUNUUyA9IG5mc2QuJChPQkpFWFQpIG5mc3N2Yy4kKE9CSkVYVCkKKyBuZnNkX09CSkVDVFMgPSAkKGFtX25mc2RfT0JKRUNUUykKKyBuZnNkX0RFUEVOREVOQ0lFUyA9IC4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hCistREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCisrREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKKyBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCisgYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKKyBhbV9fbXYgPSBtdiAtZgorZGlmZiAtYXJ1TiBhL3V0aWxzL3Nob3dtb3VudC9NYWtlZmlsZS5pbiBiL3V0aWxzL3Nob3dtb3VudC9NYWtlZmlsZS5pbgorLS0tIGEvdXRpbHMvc2hvd21vdW50L01ha2VmaWxlLmluCTIwMTAtMDItMTggMDQ6MzY6NDQuMDAwMDAwMDAwIC0wODAwCisrKysgYi91dGlscy9zaG93bW91bnQvTWFrZWZpbGUuaW4JMjAxMC0wOS0wOCAwOTowMzo1Ni4wMDAwMDAwMDAgLTA3MDAKK0BAIC02Myw3ICs2Myw3IEBACisgc2hvd21vdW50X09CSkVDVFMgPSAkKGFtX3Nob3dtb3VudF9PQkpFQ1RTKQorIHNob3dtb3VudF9ERVBFTkRFTkNJRVMgPSAuLi8uLi9zdXBwb3J0L2V4cG9ydC9saWJleHBvcnQuYSBcCisgCS4uLy4uL3N1cHBvcnQvbmZzL2xpYm5mcy5hIC4uLy4uL3N1cHBvcnQvbWlzYy9saWJtaXNjLmEKKy1ERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUKKytERUZBVUxUX0lOQ0xVREVTID0gLUkuQGFtX19pc3JjQCAtSSQodG9wX2J1aWxkZGlyKS9zdXBwb3J0L2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3N1cHBvcnQvaW5jbHVkZQorIGRlcGNvbXAgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpL2RlcGNvbXAKKyBhbV9fZGVwZmlsZXNfbWF5YmUgPSBkZXBmaWxlcworIGFtX19tdiA9IG12IC1mCitkaWZmIC1hcnVOIGEvdXRpbHMvc3RhdGQvTWFrZWZpbGUuYW0gYi91dGlscy9zdGF0ZC9NYWtlZmlsZS5hbQorLS0tIGEvdXRpbHMvc3RhdGQvTWFrZWZpbGUuYW0JMjAxMC0wMi0xOCAwNDozNTowMC4wMDAwMDAwMDAgLTA4MDAKKysrKyBiL3V0aWxzL3N0YXRkL01ha2VmaWxlLmFtCTIwMTAtMDktMDggMDg6MzY6MjYuMDAwMDAwMDAwIC0wNzAwCitAQCAtMzMsMTQgKzMzLDIzIEBACisgJChHRU5GSUxFU19DTE5UKTogJV9jbG50LmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLWwgLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX1NWQyk6ICVfc3ZjLmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLW0gLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX1hEUik6ICVfeGRyLmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLWMgLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX0gpOiAlLmg6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorZGlmZiAtYXJ1TiBhL3V0aWxzL3N0YXRkL01ha2VmaWxlLmluIGIvdXRpbHMvc3RhdGQvTWFrZWZpbGUuaW4KKy0tLSBhL3V0aWxzL3N0YXRkL01ha2VmaWxlLmluCTIwMTAtMDItMTggMDQ6MzY6NDQuMDAwMDAwMDAwIC0wODAwCisrKysgYi91dGlscy9zdGF0ZC9NYWtlZmlsZS5pbgkyMDEwLTA5LTA4IDA5OjA2OjUyLjAwMDAwMDAwMCAtMDcwMAorQEAgLTk5LDcgKzk5LDcgQEAKKyAgIHNlZCAnJCQhTjskJCFOOyQkIU47JCQhTjskJCFOOyQkIU47JCQhTjtzL1xuLyAvZycgfCBcCisgICBzZWQgJyQkIU47JCQhTjskJCFOOyQkIU47cy9cbi8gL2cnCisgU0NSSVBUUyA9ICQoZGlzdF9zYmluX1NDUklQVFMpCistREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlCisrREVGQVVMVF9JTkNMVURFUyA9IC1JLkBhbV9faXNyY0AgLUkkKHRvcF9idWlsZGRpcikvc3VwcG9ydC9pbmNsdWRlIC1JJCh0b3Bfc3JjZGlyKS9zdXBwb3J0L2luY2x1ZGUKKyBkZXBjb21wID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS9kZXBjb21wCisgYW1fX2RlcGZpbGVzX21heWJlID0gZGVwZmlsZXMKKyBhbV9fbXYgPSBtdiAtZgorQEAgLTczMiwxNCArNzMyLDIzIEBACisgJChHRU5GSUxFU19DTE5UKTogJV9jbG50LmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLWwgLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX1NWQyk6ICVfc3ZjLmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLW0gLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX1hEUik6ICVfeGRyLmM6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQorIAkkKFJQQ0dFTikgLWMgLW8gJEAgJDwKKysJJChTRUQpICJzLCQoYWJzX3NyY2RpciksJChhYnNfYnVpbGRkaXIpLGciIDwgJEAgPiAkQC5OCisrCXJtIC1mICRACisrCW12IC1mICRALk4gJEAKKyAKKyAkKEdFTkZJTEVTX0gpOiAlLmg6ICUueCAkKFJQQ0dFTikKKyAJdGVzdCAtZiAkQCAmJiBybSAtcmYgJEAgfHwgdHJ1ZQpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLnRhci5iejIgYi9uZnMtdXRpbHMudGFyLmJ6MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQzOTcyCi0tLSAvZGV2L251bGwKKysrIGIvbmZzLXV0aWxzLnRhci5iejIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbmZzLXV0aWxzLnVybCBiL25mcy11dGlscy51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlZmQxNwotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy51cmwKQEAgLTAsMCArMSBAQAoraHR0cDovL2Rvd25sb2FkLnNvdXJjZWZvcmdlLm5ldC9uZnMvbmZzLXV0aWxzLTEuMi4yLnRhci5iejIKZGlmZiAtLWdpdCBhL25mcy11dGlscy52ZXJzaW9uIGIvbmZzLXV0aWxzLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhYTgzOQotLS0gL2Rldi9udWxsCisrKyBiL25mcy11dGlscy52ZXJzaW9uCkBAIC0wLDAgKzEgQEAKKzEuMi4yCg==