ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGZhM2YKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTQ2IEBACitHSVQtQ0ZMQUdTCitHSVQtVkVSU0lPTi1GSUxFCitnaXQKK2dpdC1hZGQKK2dpdC1hbQorZ2l0LWFubm90YXRlCitnaXQtYXBwbHkKK2dpdC1hcHBseW1ib3gKK2dpdC1hcHBseXBhdGNoCitnaXQtYXJjaGltcG9ydAorZ2l0LWJpc2VjdAorZ2l0LWJyYW5jaAorZ2l0LWNhdC1maWxlCitnaXQtY2hlY2stcmVmLWZvcm1hdAorZ2l0LWNoZWNrb3V0CitnaXQtY2hlY2tvdXQtaW5kZXgKK2dpdC1jaGVycnkKK2dpdC1jaGVycnktcGljaworZ2l0LWNsZWFuCitnaXQtY2xvbmUKK2dpdC1jb21taXQKK2dpdC1jb21taXQtdHJlZQorZ2l0LWNvbnZlcnQtb2JqZWN0cworZ2l0LWNvdW50LW9iamVjdHMKK2dpdC1jdnNleHBvcnRjb21taXQKK2dpdC1jdnNpbXBvcnQKK2dpdC1jdnNzZXJ2ZXIKK2dpdC1kYWVtb24KK2dpdC1kaWZmCitnaXQtZGlmZi1maWxlcworZ2l0LWRpZmYtaW5kZXgKK2dpdC1kaWZmLXN0YWdlcworZ2l0LWRpZmYtdHJlZQorZ2l0LWRlc2NyaWJlCitnaXQtZmV0Y2gKK2dpdC1mZXRjaC1wYWNrCitnaXQtZmluZHRhZ3MKK2dpdC1mbXQtbWVyZ2UtbXNnCitnaXQtZm9ybWF0LXBhdGNoCitnaXQtZnNjay1vYmplY3RzCitnaXQtZ2V0LXRhci1jb21taXQtaWQKK2dpdC1ncmVwCitnaXQtaGFzaC1vYmplY3QKK2dpdC1odHRwLWZldGNoCitnaXQtaHR0cC1wdXNoCitnaXQtaW1hcC1zZW5kCitnaXQtaW5kZXgtcGFjaworZ2l0LWluaXQtZGIKK2dpdC1pbnN0YXdlYgorZ2l0LWxvY2FsLWZldGNoCitnaXQtbG9nCitnaXQtbG9zdC1mb3VuZAorZ2l0LWxzLWZpbGVzCitnaXQtbHMtcmVtb3RlCitnaXQtbHMtdHJlZQorZ2l0LW1haWxpbmZvCitnaXQtbWFpbHNwbGl0CitnaXQtbWVyZ2UKK2dpdC1tZXJnZS1iYXNlCitnaXQtbWVyZ2UtaW5kZXgKK2dpdC1tZXJnZS10cmVlCitnaXQtbWVyZ2Utb2N0b3B1cworZ2l0LW1lcmdlLW9uZS1maWxlCitnaXQtbWVyZ2Utb3VycworZ2l0LW1lcmdlLXJlY3Vyc2l2ZQorZ2l0LW1lcmdlLXJlc29sdmUKK2dpdC1tZXJnZS1zdHVwaWQKK2dpdC1ta3RhZworZ2l0LW1rdHJlZQorZ2l0LW5hbWUtcmV2CitnaXQtbXYKK2dpdC1wYWNrLXJlZHVuZGFudAorZ2l0LXBhY2stb2JqZWN0cworZ2l0LXBhcnNlLXJlbW90ZQorZ2l0LXBhdGNoLWlkCitnaXQtcGVlay1yZW1vdGUKK2dpdC1wcnVuZQorZ2l0LXBydW5lLXBhY2tlZAorZ2l0LXB1bGwKK2dpdC1wdXNoCitnaXQtcXVpbHRpbXBvcnQKK2dpdC1yZWFkLXRyZWUKK2dpdC1yZWJhc2UKK2dpdC1yZWNlaXZlLXBhY2sKK2dpdC1yZWxpbmsKK2dpdC1yZXBhY2sKK2dpdC1yZXBvLWNvbmZpZworZ2l0LXJlcXVlc3QtcHVsbAorZ2l0LXJlcmVyZQorZ2l0LXJlc2V0CitnaXQtcmVzb2x2ZQorZ2l0LXJldi1saXN0CitnaXQtcmV2LXBhcnNlCitnaXQtcmV2ZXJ0CitnaXQtcm0KK2dpdC1zZW5kLWVtYWlsCitnaXQtc2VuZC1wYWNrCitnaXQtc2gtc2V0dXAKK2dpdC1zaGVsbAorZ2l0LXNob3J0bG9nCitnaXQtc2hvdworZ2l0LXNob3ctYnJhbmNoCitnaXQtc2hvdy1pbmRleAorZ2l0LXNzaC1mZXRjaAorZ2l0LXNzaC1wdWxsCitnaXQtc3NoLXB1c2gKK2dpdC1zc2gtdXBsb2FkCitnaXQtc3RhdHVzCitnaXQtc3RyaXBzcGFjZQorZ2l0LXN2bgorZ2l0LXN2bmltcG9ydAorZ2l0LXN5bWJvbGljLXJlZgorZ2l0LXRhZworZ2l0LXRhci10cmVlCitnaXQtdW5wYWNrLWZpbGUKK2dpdC11bnBhY2stb2JqZWN0cworZ2l0LXVwZGF0ZS1pbmRleAorZ2l0LXVwZGF0ZS1yZWYKK2dpdC11cGRhdGUtc2VydmVyLWluZm8KK2dpdC11cGxvYWQtcGFjaworZ2l0LXVwbG9hZC10YXIKK2dpdC12YXIKK2dpdC12ZXJpZnktcGFjaworZ2l0LXZlcmlmeS10YWcKK2dpdC13aGF0Y2hhbmdlZAorZ2l0LXdyaXRlLXRyZWUKK2dpdC1jb3JlLSovPyoKK3Rlc3QtZGF0ZQordGVzdC1kZWx0YQordGVzdC1kdW1wLWNhY2hlLXRyZWUKK2NvbW1vbi1jbWRzLmgKKyoudGFyLmd6CisqLmRzYworKi5kZWIKK2dpdC1jb3JlLnNwZWMKKyouZXhlCisqLlthb10KKyoucHlbY29dCitjb25maWcubWFrCithdXRvbTR0ZS5jYWNoZQorY29uZmlnLmxvZworY29uZmlnLnN0YXR1cworY29uZmlnLm1hay5pbgorY29uZmlnLm1hay5hdXRvZ2VuCitjb25maWd1cmUKK2dpdC1ibGFtZQpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmODdjNAotLS0gL2Rldi9udWxsCisrKyBiL0NPUFlJTkcKQEAgLTAsMCArMSwzNjEgQEAKKworIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorIGlzIGNvbmNlcm5lZCBpcyBfdGhpc18gcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlIChpZSB2Miwgbm90CisgdjIuMiBvciB2My54IG9yIHdoYXRldmVyKSwgdW5sZXNzIGV4cGxpY2l0bHkgb3RoZXJ3aXNlIHN0YXRlZC4KKworIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorIGEgZ29vZCBpZGVhLCBJIGFsc28gYXNrIHRoYXQgcGVvcGxlIGludm9sdmVkIHdpdGggdGhlIHByb2plY3QgbWFrZQorIHRoZWlyIHByZWZlcmVuY2VzIGtub3duLiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgdHJ1c3QgbWUgdG8gbWFrZSB0aGF0CisgZGVjaXNpb24sIHlvdSBtaWdodCBub3RlIHNvIGluIHlvdXIgY29weXJpZ2h0IG1lc3NhZ2UsIGllIHNvbWV0aGluZworIGxpa2UKKworCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKwlhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cy4KKworICBtaWdodCBhdm9pZCBpc3N1ZXMuIEJ1dCB3ZSBjYW4gYWxzbyBqdXN0IGRlY2lkZSB0byBzeW5jaHJvbml6ZSBhbmQKKyAgY29udGFjdCBhbGwgY29weXJpZ2h0IGhvbGRlcnMgb24gcmVjb3JkIGlmL3doZW4gdGhlIG9jY2FzaW9uIGFyaXNlcy4KKworCQkJTGludXMgVG9ydmFsZHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQorc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCit1c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Cit0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvcgorICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKK2JlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6CisKKyAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KKworICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKKyAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKKworVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCitwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4N2M2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uLy5naXRpZ25vcmUKQEAgLTAsMCArMSw3IEBACisqLnhtbAorKi5odG1sCisqLjEKKyouNworaG93dG8taW5kZXgudHh0Citkb2MuZGVwCitSRUFETUUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWZmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEyIEBACitNQU4xX1RYVD0gXAorCSQoZmlsdGVyLW91dCAkKGFkZHN1ZmZpeCAudHh0LCAkKEFSVElDTEVTKSAkKFNQX0FSVElDTEVTKSksIFwKKwkJJCh3aWxkY2FyZCBnaXQtKi50eHQpKSBcCisJZ2l0ay50eHQKK01BTjdfVFhUPWdpdC50eHQKKworRE9DX0hUTUw9JChwYXRzdWJzdCAlLnR4dCwlLmh0bWwsJChNQU4xX1RYVCkgJChNQU43X1RYVCkpCisKK0FSVElDTEVTID0gdHV0b3JpYWwKK0FSVElDTEVTICs9IHR1dG9yaWFsLTIKK0FSVElDTEVTICs9IGNvcmUtdHV0b3JpYWwKK0FSVElDTEVTICs9IGN2cy1taWdyYXRpb24KK0FSVElDTEVTICs9IGRpZmZjb3JlCitBUlRJQ0xFUyArPSBob3d0by1pbmRleAorQVJUSUNMRVMgKz0gcmVwb3NpdG9yeS1sYXlvdXQKK0FSVElDTEVTICs9IGhvb2tzCitBUlRJQ0xFUyArPSBldmVyeWRheQorQVJUSUNMRVMgKz0gZ2l0LXRvb2xzCisjIHdpdGggdGhlaXIgb3duIGZvcm1hdHRpbmcgcnVsZXMuCitTUF9BUlRJQ0xFUyA9IGdsb3NzYXJ5IGhvd3RvL3JldmVydC1icmFuY2gtcmViYXNlCisKK0RPQ19IVE1MICs9ICQocGF0c3Vic3QgJSwlLmh0bWwsJChBUlRJQ0xFUykgJChTUF9BUlRJQ0xFUykpCisKK0RPQ19NQU4xPSQocGF0c3Vic3QgJS50eHQsJS4xLCQoTUFOMV9UWFQpKQorRE9DX01BTjc9JChwYXRzdWJzdCAlLnR4dCwlLjcsJChNQU43X1RYVCkpCisKK3ByZWZpeD89JChIT01FKQorYmluZGlyPz0kKHByZWZpeCkvYmluCittYW5kaXI/PSQocHJlZml4KS9tYW4KK21hbjFkaXI9JChtYW5kaXIpL21hbjEKK21hbjdkaXI9JChtYW5kaXIpL21hbjcKKyMgREVTVERJUj0KKworSU5TVEFMTD89aW5zdGFsbAorCisjCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5vciBidWcgaW4gYXNjaWlkb2MuCisjIFRoZSB2ZXJzaW9uIGFmdGVyIDYuMC4zIF93aWxsXyBpbmNsdWRlIHRoZSBwYXRjaCBmb3VuZCBoZXJlOgorIyAgIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9Z2l0Jm09MTExNTU4NzU3MjAyMjQzJnc9MgorIworIyBVbnRpbCB0aGF0IHZlcnNpb24gaXMgcmVsZWFzZWQgeW91IG1heSBoYXZlIHRvIGFwcGx5IHRoZSBwYXRjaAorIyB5b3Vyc2VsZiAtIHllcywgYWxsIDYgY2hhcmFjdGVycyBvZiBpdCEKKyMKKworYWxsOiBodG1sIG1hbgorCitodG1sOiAkKERPQ19IVE1MKQorCiskKERPQ19IVE1MKSAkKERPQ19NQU4xKSAkKERPQ19NQU43KTogYXNjaWlkb2MuY29uZgorCittYW46IG1hbjEgbWFuNworbWFuMTogJChET0NfTUFOMSkKK21hbjc6ICQoRE9DX01BTjcpCisKK2luc3RhbGw6IG1hbgorCSQoSU5TVEFMTCkgLWQgLW03NTUgJChERVNURElSKSQobWFuMWRpcikgJChERVNURElSKSQobWFuN2RpcikKKwkkKElOU1RBTEwpICQoRE9DX01BTjEpICQoREVTVERJUikkKG1hbjFkaXIpCisJJChJTlNUQUxMKSAkKERPQ19NQU43KSAkKERFU1RESVIpJChtYW43ZGlyKQorCisKKyMKKyMgRGV0ZXJtaW5lICJpbmNsdWRlOjoiIGZpbGUgcmVmZXJlbmNlcyBpbiBhc2NpaWRvYyBmaWxlcy4KKyMKK2RvYy5kZXAgOiAkKHdpbGRjYXJkICoudHh0KSBidWlsZC1kb2NkZXAucGVybAorCXJtIC1mICRAKyAkQAorCXBlcmwgLi9idWlsZC1kb2NkZXAucGVybCA+JEArCisJbXYgJEArICRACisKKy1pbmNsdWRlIGRvYy5kZXAKKworZ2l0Ljc6IFJFQURNRQorCitSRUFETUU6IC4uL1JFQURNRQorCWNwICQ8ICRACisKKworY2xlYW46CisJcm0gLWYgKi54bWwgKi5odG1sICouMSAqLjcgaG93dG8taW5kZXgudHh0IGhvd3RvLyouaHRtbCBkb2MuZGVwIFJFQURNRQorCislLmh0bWwgOiAlLnR4dAorCWFzY2lpZG9jIC1iIHhodG1sMTEgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mICQ8CisKKyUuMSAlLjcgOiAlLnhtbAorCXhtbHRvIC1tIGNhbGxvdXRzLnhzbCBtYW4gJDwKKworJS54bWwgOiAlLnR4dAorCWFzY2lpZG9jIC1iIGRvY2Jvb2sgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mICQ8CisKK2dpdC5odG1sOiBnaXQudHh0IFJFQURNRQorCitnbG9zc2FyeS5odG1sIDogZ2xvc3NhcnkudHh0IHNvcnRfZ2xvc3NhcnkucGwKKwljYXQgJDwgfCBcCisJcGVybCBzb3J0X2dsb3NzYXJ5LnBsIHwgXAorCWFzY2lpZG9jIC1iIHhodG1sMTEgLSA+IGdsb3NzYXJ5Lmh0bWwKKworaG93dG8taW5kZXgudHh0OiBob3d0by1pbmRleC5zaCAkKHdpbGRjYXJkIGhvd3RvLyoudHh0KQorCXJtIC1mICRAKyAkQAorCXNoIC4vaG93dG8taW5kZXguc2ggJCh3aWxkY2FyZCBob3d0by8qLnR4dCkgPiRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUsJS5odG1sLCQoQVJUSUNMRVMpKSA6ICUuaHRtbCA6ICUudHh0CisJYXNjaWlkb2MgLWIgeGh0bWwxMSAkKi50eHQKKworV0VCRE9DX0RFU1QgPSAvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcworCiskKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKHdpbGRjYXJkIGhvd3RvLyoudHh0KSk6ICUuaHRtbCA6ICUudHh0CisJcm0gLWYgJEArICRACisJc2VkIC1lICcxLC9eJCQvZCcgJD8gfCBhc2NpaWRvYyAtYiB4aHRtbDExIC0gPiRAKworCW12ICRAKyAkQAorCitpbnN0YWxsLXdlYmRvYyA6IGh0bWwKKwlzaCAuL2luc3RhbGwtd2ViZG9jLnNoICQoV0VCRE9DX0RFU1QpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDcyMmMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwpAQCAtMCwwICsxLDMwNiBAQAorSSBzdGFydGVkIHJlYWRpbmcgb3ZlciB0aGUgU3VibWl0dGluZ1BhdGNoZXMgZG9jdW1lbnQgZm9yIExpbnV4CitrZXJuZWwsIHByaW1hcmlseSBiZWNhdXNlIEkgd2FudGVkIHRvIGhhdmUgYSBkb2N1bWVudCBzaW1pbGFyIHRvCitpdCBmb3IgdGhlIGNvcmUgR0lUIHRvIG1ha2Ugc3VyZSBwZW9wbGUgdW5kZXJzdGFuZCB3aGF0IHRoZXkgYXJlCitkb2luZyB3aGVuIHRoZXkgd3JpdGUgIlNpZ25lZC1vZmYtYnkiIGxpbmUuCisKK0J1dCB0aGUgcGF0Y2ggc3VibWlzc2lvbiByZXF1aXJlbWVudHMgYXJlIGEgbG90IG1vcmUgcmVsYXhlZAoraGVyZSBvbiB0aGUgdGVjaG5pY2FsL2NvbnRlbnRzIGZyb250LCBiZWNhdXNlIHRoZSBjb3JlIEdJVCBpcwordGhvdXNhbmQgdGltZXMgc21hbGxlciA7LSkuICBTbyBoZXJlIGlzIG9ubHkgdGhlIHJlbGV2YW50IGJpdHMuCisKKworKDEpIE1ha2Ugc2VwYXJhdGUgY29tbWl0cyBmb3IgbG9naWNhbGx5IHNlcGFyYXRlIGNoYW5nZXMuCisKK1VubGVzcyB5b3VyIHBhdGNoIGlzIHJlYWxseSB0cml2aWFsLCB5b3Ugc2hvdWxkIG5vdCBiZSBzZW5kaW5nCitvdXQgYSBwYXRjaCB0aGF0IHdhcyBnZW5lcmF0ZWQgYmV0d2VlbiB5b3VyIHdvcmtpbmcgdHJlZSBhbmQKK3lvdXIgY29tbWl0IGhlYWQuICBJbnN0ZWFkLCBhbHdheXMgbWFrZSBhIGNvbW1pdCB3aXRoIGNvbXBsZXRlCitjb21taXQgbWVzc2FnZSBhbmQgZ2VuZXJhdGUgYSBzZXJpZXMgb2YgcGF0Y2hlcyBmcm9tIHlvdXIKK3JlcG9zaXRvcnkuICBJdCBpcyBhIGdvb2QgZGlzY2lwbGluZS4KKworRGVzY3JpYmUgdGhlIHRlY2huaWNhbCBkZXRhaWwgb2YgdGhlIGNoYW5nZShzKS4KKworSWYgeW91ciBkZXNjcmlwdGlvbiBzdGFydHMgdG8gZ2V0IHRvbyBsb25nLCB0aGF0J3MgYSBzaWduIHRoYXQgeW91Citwcm9iYWJseSBuZWVkIHRvIHNwbGl0IHVwIHlvdXIgY29tbWl0IHRvIGZpbmVyIGdyYWluZWQgcGllY2VzLgorCitPaCwgYW5vdGhlciB0aGluZy4gIEkgYW0gcGlja3kgYWJvdXQgd2hpdGVzcGFjZXMuICBNYWtlIHN1cmUgeW91cgorY2hhbmdlcyBkbyBub3QgdHJpZ2dlciBlcnJvcnMgd2l0aCB0aGUgc2FtcGxlIHByZS1jb21taXQgaG9vayBzaGlwcGVkCitpbiB0ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQuCisKKworKDIpIEdlbmVyYXRlIHlvdXIgcGF0Y2ggdXNpbmcgZ2l0IHRvb2xzIG91dCBvZiB5b3VyIGNvbW1pdHMuCisKK2dpdCBiYXNlZCBkaWZmIHRvb2xzIChnaXQsIENvZ2l0bywgYW5kIFN0R0lUIGluY2x1ZGVkKSBnZW5lcmF0ZQordW5pZGlmZiB3aGljaCBpcyB0aGUgcHJlZmVycmVkIGZvcm1hdC4KKworWW91IGRvIG5vdCBoYXZlIHRvIGJlIGFmcmFpZCB0byB1c2UgLU0gb3B0aW9uIHRvICJnaXQgZGlmZiIgb3IKKyJnaXQgZm9ybWF0LXBhdGNoIiwgaWYgeW91ciBwYXRjaCBpbnZvbHZlcyBmaWxlIHJlbmFtZXMuICBUaGUKK3JlY2VpdmluZyBlbmQgY2FuIGhhbmRsZSB0aGVtIGp1c3QgZmluZS4KKworUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIHBhdGNoIGRvZXMgbm90IGluY2x1ZGUgYW55IGV4dHJhIGZpbGVzCit3aGljaCBkbyBub3QgYmVsb25nIGluIGEgcGF0Y2ggc3VibWlzc2lvbi4gIE1ha2Ugc3VyZSB0byByZXZpZXcKK3lvdXIgcGF0Y2ggYWZ0ZXIgZ2VuZXJhdGluZyBpdCwgdG8gZW5zdXJlIGFjY3VyYWN5LiAgQmVmb3JlCitzZW5kaW5nIG91dCwgcGxlYXNlIG1ha2Ugc3VyZSBpdCBjbGVhbmx5IGFwcGxpZXMgdG8gdGhlICJtYXN0ZXIiCiticmFuY2ggaGVhZC4gIElmIHlvdSBhcmUgcHJlcGFyaW5nIGEgd29yayBiYXNlZCBvbiAibmV4dCIgYnJhbmNoLAordGhhdCBpcyBmaW5lLCBidXQgcGxlYXNlIG1hcmsgaXQgYXMgc3VjaC4KKworCisoMykgU2VuZGluZyB5b3VyIHBhdGNoZXMuCisKK1Blb3BsZSBvbiB0aGUgZ2l0IG1haWxpbmcgbGlzdCBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCBhbmQKK2NvbW1lbnQgb24gdGhlIGNoYW5nZXMgeW91IGFyZSBzdWJtaXR0aW5nLiAgSXQgaXMgaW1wb3J0YW50IGZvcgorYSBkZXZlbG9wZXIgdG8gYmUgYWJsZSB0byAicXVvdGUiIHlvdXIgY2hhbmdlcywgdXNpbmcgc3RhbmRhcmQKK2UtbWFpbCB0b29scywgc28gdGhhdCB0aGV5IG1heSBjb21tZW50IG9uIHNwZWNpZmljIHBvcnRpb25zIG9mCit5b3VyIGNvZGUuICBGb3IgdGhpcyByZWFzb24sIGFsbCBwYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQKKyJpbmxpbmUiLiAgV0FSTklORzogQmUgd2FyeSBvZiB5b3VyIE1VQXMgd29yZC13cmFwCitjb3JydXB0aW5nIHlvdXIgcGF0Y2guICBEbyBub3QgY3V0LW4tcGFzdGUgeW91ciBwYXRjaDsgeW91IGNhbgorbG9zZSB0YWJzIHRoYXQgd2F5IGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCisKK0l0IGlzIGEgY29tbW9uIGNvbnZlbnRpb24gdG8gcHJlZml4IHlvdXIgc3ViamVjdCBsaW5lIHdpdGgKK1tQQVRDSF0uICBUaGlzIGxldHMgcGVvcGxlIGVhc2lseSBkaXN0aW5ndWlzaCBwYXRjaGVzIGZyb20gb3RoZXIKK2UtbWFpbCBkaXNjdXNzaW9ucy4KKworImdpdCBmb3JtYXQtcGF0Y2giIGNvbW1hbmQgZm9sbG93cyB0aGUgYmVzdCBjdXJyZW50IHByYWN0aWNlIHRvCitmb3JtYXQgdGhlIGJvZHkgb2YgYW4gZS1tYWlsIG1lc3NhZ2UuICBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorcGF0Y2ggc2hvdWxkIGNvbWUgeW91ciBjb21taXQgbWVzc2FnZSwgZW5kaW5nIHdpdGggdGhlCitTaWduZWQtb2ZmLWJ5OiBsaW5lcywgYW5kIGEgbGluZSB0aGF0IGNvbnNpc3RzIG9mIHRocmVlIGRhc2hlcywKK2ZvbGxvd2VkIGJ5IHRoZSBkaWZmc3RhdCBpbmZvcm1hdGlvbiBhbmQgdGhlIHBhdGNoIGl0c2VsZi4gIElmCit5b3UgYXJlIGZvcndhcmRpbmcgYSBwYXRjaCBmcm9tIHNvbWVib2R5IGVsc2UsIG9wdGlvbmFsbHksIGF0Cit0aGUgYmVnaW5uaW5nIG9mIHRoZSBlLW1haWwgbWVzc2FnZSBqdXN0IGJlZm9yZSB0aGUgY29tbWl0CittZXNzYWdlIHN0YXJ0cywgeW91IGNhbiBwdXQgYSAiRnJvbTogIiBsaW5lIHRvIG5hbWUgdGhhdCBwZXJzb24uCisKK1lvdSBvZnRlbiB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIGV4cGxhbmF0aW9uIGFib3V0IHRoZSBwYXRjaCwKK290aGVyIHRoYW4gdGhlIGNvbW1pdCBtZXNzYWdlIGl0c2VsZi4gIFBsYWNlIHN1Y2ggImNvdmVyIGxldHRlciIKK21hdGVyaWFsIGJldHdlZW4gdGhlIHRocmVlIGRhc2ggbGluZXMgYW5kIHRoZSBkaWZmc3RhdC4KKworRG8gbm90IGF0dGFjaCB0aGUgcGF0Y2ggYXMgYSBNSU1FIGF0dGFjaG1lbnQsIGNvbXByZXNzZWQgb3Igbm90LgorRG8gbm90IGxldCB5b3VyIGUtbWFpbCBjbGllbnQgc2VuZCBxdW90ZWQtcHJpbnRhYmxlLiAgTWFueQorcG9wdWxhciBlLW1haWwgYXBwbGljYXRpb25zIHdpbGwgbm90IGFsd2F5cyB0cmFuc21pdCBhIE1JTUUKK2F0dGFjaG1lbnQgYXMgcGxhaW4gdGV4dCwgbWFraW5nIGl0IGltcG9zc2libGUgdG8gY29tbWVudCBvbgoreW91ciBjb2RlLiAgQSBNSU1FIGF0dGFjaG1lbnQgYWxzbyB0YWtlcyBhIGJpdCBtb3JlIHRpbWUgdG8KK3Byb2Nlc3MuICBUaGlzIGRvZXMgbm90IGRlY3JlYXNlIHRoZSBsaWtlbGlob29kIG9mIHlvdXIKK01JTUUtYXR0YWNoZWQgY2hhbmdlIGJlaW5nIGFjY2VwdGVkLCBidXQgaXQgbWFrZXMgaXQgbW9yZSBsaWtlbHkKK3RoYXQgaXQgd2lsbCBiZSBwb3N0cG9uZWQuCisKK0V4Y2VwdGlvbjogIElmIHlvdXIgbWFpbGVyIGlzIG1hbmdsaW5nIHBhdGNoZXMgdGhlbiBzb21lb25lIG1heSBhc2sKK3lvdSB0byByZS1zZW5kIHRoZW0gdXNpbmcgTUlNRSwgdGhhdCBpcyBPSy4KKworRG8gbm90IFBHUCBzaWduIHlvdXIgcGF0Y2gsIGF0IGxlYXN0IGZvciBub3cuICBNb3N0IGxpa2VseSwgeW91cgorbWFpbnRhaW5lciBvciBvdGhlciBwZW9wbGUgb24gdGhlIGxpc3Qgd291bGQgbm90IGhhdmUgeW91ciBQR1AKK2tleSBhbmQgd291bGQgbm90IGJvdGhlciBvYnRhaW5pbmcgaXQgYW55d2F5LiAgWW91ciBwYXRjaCBpcyBub3QKK2p1ZGdlZCBieSB3aG8geW91IGFyZTsgYSBnb29kIHBhdGNoIGZyb20gYW4gdW5rbm93biBvcmlnaW4gaGFzIGEKK2ZhciBiZXR0ZXIgY2hhbmNlIG9mIGJlaW5nIGFjY2VwdGVkIHRoYW4gYSBwYXRjaCBmcm9tIGEga25vd24sCityZXNwZWN0ZWQgb3JpZ2luIHRoYXQgaXMgZG9uZSBwb29ybHkgb3IgZG9lcyBpbmNvcnJlY3QgdGhpbmdzLgorCitJZiB5b3UgcmVhbGx5IHJlYWxseSByZWFsbHkgcmVhbGx5IHdhbnQgdG8gZG8gYSBQR1Agc2lnbmVkCitwYXRjaCwgZm9ybWF0IGl0IGFzICJtdWx0aXBhcnQvc2lnbmVkIiwgbm90IGEgdGV4dC9wbGFpbiBtZXNzYWdlCit0aGF0IHN0YXJ0cyB3aXRoICctLS0tLUJFR0lOIFBHUCBTSUdORUQgTUVTU0FHRS0tLS0tJy4gIFRoYXQgaXMKK25vdCBhIHRleHQvcGxhaW4sIGl0J3Mgc29tZXRoaW5nIGVsc2UuCisKK05vdGUgdGhhdCB5b3VyIG1haW50YWluZXIgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBldmVyeXRoaW5nCitvbiB0aGUgZ2l0IG1haWxpbmcgbGlzdC4gIElmIHlvdXIgcGF0Y2ggaXMgZm9yIGRpc2N1c3Npb24gZmlyc3QsCitzZW5kIGl0ICJUbzoiIHRoZSBtYWlsaW5nIGxpc3QsIGFuZCBvcHRpb25hbGx5ICJjYzoiIGhpbS4gIElmIGl0CitpcyB0cml2aWFsbHkgY29ycmVjdCBvciBhZnRlciB0aGUgbGlzdCByZWFjaGVkIGEgY29uc2Vuc3VzLCBzZW5kCitpdCAiVG86IiB0aGUgbWFpbnRhaW5lciBhbmQgb3B0aW9uYWxseSAiY2M6IiB0aGUgbGlzdC4KKworCisoNikgU2lnbiB5b3VyIHdvcmsKKworVG8gaW1wcm92ZSB0cmFja2luZyBvZiB3aG8gZGlkIHdoYXQsIHdlJ3ZlIGJvcnJvd2VkIHRoZQorInNpZ24tb2ZmIiBwcm9jZWR1cmUgZnJvbSB0aGUgTGludXgga2VybmVsIHByb2plY3Qgb24gcGF0Y2hlcwordGhhdCBhcmUgYmVpbmcgZW1haWxlZCBhcm91bmQuICBBbHRob3VnaCBjb3JlIEdJVCBpcyBhIGxvdAorc21hbGxlciBwcm9qZWN0IGl0IGlzIGEgZ29vZCBkaXNjaXBsaW5lIHRvIGZvbGxvdyBpdC4KKworVGhlIHNpZ24tb2ZmIGlzIGEgc2ltcGxlIGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgZXhwbGFuYXRpb24gZm9yCit0aGUgcGF0Y2gsIHdoaWNoIGNlcnRpZmllcyB0aGF0IHlvdSB3cm90ZSBpdCBvciBvdGhlcndpc2UgaGF2ZQordGhlIHJpZ2h0IHRvIHBhc3MgaXQgb24gYXMgYSBvcGVuLXNvdXJjZSBwYXRjaC4gIFRoZSBydWxlcyBhcmUKK3ByZXR0eSBzaW1wbGU6IGlmIHlvdSBjYW4gY2VydGlmeSB0aGUgYmVsb3c6CisKKyAgICAgICAgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIDEuMQorCisgICAgICAgIEJ5IG1ha2luZyBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHByb2plY3QsIEkgY2VydGlmeSB0aGF0OgorCisgICAgICAgIChhKSBUaGUgY29udHJpYnV0aW9uIHdhcyBjcmVhdGVkIGluIHdob2xlIG9yIGluIHBhcnQgYnkgbWUgYW5kIEkKKyAgICAgICAgICAgIGhhdmUgdGhlIHJpZ2h0IHRvIHN1Ym1pdCBpdCB1bmRlciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZQorICAgICAgICAgICAgaW5kaWNhdGVkIGluIHRoZSBmaWxlOyBvcgorCisgICAgICAgIChiKSBUaGUgY29udHJpYnV0aW9uIGlzIGJhc2VkIHVwb24gcHJldmlvdXMgd29yayB0aGF0LCB0byB0aGUgYmVzdAorICAgICAgICAgICAgb2YgbXkga25vd2xlZGdlLCBpcyBjb3ZlcmVkIHVuZGVyIGFuIGFwcHJvcHJpYXRlIG9wZW4gc291cmNlCisgICAgICAgICAgICBsaWNlbnNlIGFuZCBJIGhhdmUgdGhlIHJpZ2h0IHVuZGVyIHRoYXQgbGljZW5zZSB0byBzdWJtaXQgdGhhdAorICAgICAgICAgICAgd29yayB3aXRoIG1vZGlmaWNhdGlvbnMsIHdoZXRoZXIgY3JlYXRlZCBpbiB3aG9sZSBvciBpbiBwYXJ0CisgICAgICAgICAgICBieSBtZSwgdW5kZXIgdGhlIHNhbWUgb3BlbiBzb3VyY2UgbGljZW5zZSAodW5sZXNzIEkgYW0KKyAgICAgICAgICAgIHBlcm1pdHRlZCB0byBzdWJtaXQgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSksIGFzIGluZGljYXRlZAorICAgICAgICAgICAgaW4gdGhlIGZpbGU7IG9yCisKKyAgICAgICAgKGMpIFRoZSBjb250cmlidXRpb24gd2FzIHByb3ZpZGVkIGRpcmVjdGx5IHRvIG1lIGJ5IHNvbWUgb3RoZXIKKyAgICAgICAgICAgIHBlcnNvbiB3aG8gY2VydGlmaWVkIChhKSwgKGIpIG9yIChjKSBhbmQgSSBoYXZlIG5vdCBtb2RpZmllZAorICAgICAgICAgICAgaXQuCisKKwkoZCkgSSB1bmRlcnN0YW5kIGFuZCBhZ3JlZSB0aGF0IHRoaXMgcHJvamVjdCBhbmQgdGhlIGNvbnRyaWJ1dGlvbgorCSAgICBhcmUgcHVibGljIGFuZCB0aGF0IGEgcmVjb3JkIG9mIHRoZSBjb250cmlidXRpb24gKGluY2x1ZGluZyBhbGwKKwkgICAgcGVyc29uYWwgaW5mb3JtYXRpb24gSSBzdWJtaXQgd2l0aCBpdCwgaW5jbHVkaW5nIG15IHNpZ24tb2ZmKSBpcworCSAgICBtYWludGFpbmVkIGluZGVmaW5pdGVseSBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgY29uc2lzdGVudCB3aXRoCisJICAgIHRoaXMgcHJvamVjdCBvciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZShzKSBpbnZvbHZlZC4KKwordGhlbiB5b3UganVzdCBhZGQgYSBsaW5lIHNheWluZworCisJU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgorCitTb21lIHBlb3BsZSBhbHNvIHB1dCBleHRyYSB0YWdzIGF0IHRoZSBlbmQuICBUaGV5J2xsIGp1c3QgYmUgaWdub3JlZCBmb3IKK25vdywgYnV0IHlvdSBjYW4gZG8gdGhpcyB0byBtYXJrIGludGVybmFsIGNvbXBhbnkgcHJvY2VkdXJlcyBvciBqdXN0Citwb2ludCBvdXQgc29tZSBzcGVjaWFsIGRldGFpbCBhYm91dCB0aGUgc2lnbi1vZmYuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNVUEgc3BlY2lmaWMgaGludHMKKworU29tZSBvZiBwYXRjaGVzIEkgcmVjZWl2ZSBvciBwaWNrIHVwIGZyb20gdGhlIGxpc3Qgc2hhcmUgY29tbW9uCitwYXR0ZXJucyBvZiBicmVha2FnZS4gIFBsZWFzZSBtYWtlIHN1cmUgeW91ciBNVUEgaXMgc2V0IHVwCitwcm9wZXJseSBub3QgdG8gY29ycnVwdCB3aGl0ZXNwYWNlcy4gIEhlcmUgYXJlIHR3byBjb21tb24gb25lcworSSBoYXZlIHNlZW46CisKKyogRW1wdHkgY29udGV4dCBsaW5lcyB0aGF0IGRvIG5vdCBoYXZlIF9hbnlfIHdoaXRlc3BhY2UuCisKKyogTm9uIGVtcHR5IGNvbnRleHQgbGluZXMgdGhhdCBoYXZlIG9uZSBleHRyYSB3aGl0ZXNwYWNlIGF0IHRoZQorICBiZWdpbm5pbmcuCisKK09uZSB0ZXN0IHlvdSBjb3VsZCBkbyB5b3Vyc2VsZiBpZiB5b3VyIE1VQSBpcyBzZXQgdXAgY29ycmVjdGx5IGlzOgorCisqIFNlbmQgdGhlIHBhdGNoIHRvIHlvdXJzZWxmLCBleGFjdGx5IHRoZSB3YXkgeW91IHdvdWxkLCBleGNlcHQKKyAgVG86IGFuZCBDYzogbGluZXMsIHdoaWNoIHdvdWxkIG5vdCBjb250YWluIHRoZSBsaXN0IGFuZAorICBtYWludGFpbmVyIGFkZHJlc3MuCisKKyogU2F2ZSB0aGF0IHBhdGNoIHRvIGEgZmlsZSBpbiBVTklYIG1haWxib3ggZm9ybWF0LiAgQ2FsbCBpdCBzYXkKKyAgYS5wYXRjaC4KKworKiBUcnkgdG8gYXBwbHkgdG8gdGhlIHRpcCBvZiB0aGUgIm1hc3RlciIgYnJhbmNoIGZyb20gdGhlCisgIGdpdC5naXQgcHVibGljIHJlcG9zaXRvcnk6CisKKyAgICAkIGdpdCBmZXRjaCBodHRwOi8va2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0IG1hc3Rlcjp0ZXN0LWFwcGx5CisgICAgJCBnaXQgY2hlY2tvdXQgdGVzdC1hcHBseQorICAgICQgZ2l0IHJlc2V0IC0taGFyZAorICAgICQgZ2l0IGFwcGx5bWJveCBhLnBhdGNoCisKK0lmIGl0IGRvZXMgbm90IGFwcGx5IGNvcnJlY3RseSwgdGhlcmUgY2FuIGJlIHZhcmlvdXMgcmVhc29ucy4KKworKiBZb3VyIHBhdGNoIGl0c2VsZiBkb2VzIG5vdCBhcHBseSBjbGVhbmx5LiAgVGhhdCBpcyBfYmFkXyBidXQKKyAgZG9lcyBub3QgaGF2ZSBtdWNoIHRvIGRvIHdpdGggeW91ciBNVUEuICBQbGVhc2UgcmViYXNlIHRoZQorICBwYXRjaCBhcHByb3ByaWF0ZWx5LgorCisqIFlvdXIgTVVBIGNvcnJ1cHRlZCB5b3VyIHBhdGNoOyBhcHBseW1ib3ggd291bGQgY29tcGxhaW4gdGhhdAorICB0aGUgcGF0Y2ggZG9lcyBub3QgYXBwbHkuICBMb29rIGF0IC5kb3Rlc3QvIHN1YmRpcmVjdG9yeSBhbmQKKyAgc2VlIHdoYXQgJ3BhdGNoJyBmaWxlIGNvbnRhaW5zIGFuZCBjaGVjayBmb3IgdGhlIGNvbW1vbgorICBjb3JydXB0aW9uIHBhdHRlcm5zIG1lbnRpb25lZCBhYm92ZS4KKworKiBXaGlsZSB5b3UgYXJlIGF0IGl0LCBjaGVjayB3aGF0IGFyZSBpbiAnaW5mbycgYW5kCisgICdmaW5hbC1jb21taXQnIGZpbGVzIGFzIHdlbGwuICBJZiB3aGF0IGlzIGluICdmaW5hbC1jb21taXQnIGlzCisgIG5vdCBleGFjdGx5IHdoYXQgeW91IHdvdWxkIHdhbnQgdG8gc2VlIGluIHRoZSBjb21taXQgbG9nCisgIG1lc3NhZ2UsIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgeW91ciBtYWludGFpbmVyIHdvdWxkIGVuZCB1cAorICBoYW5kIGVkaXRpbmcgdGhlIGxvZyBtZXNzYWdlIHdoZW4gaGUgYXBwbGllcyB5b3VyIHBhdGNoLgorICBUaGluZ3MgbGlrZSAiSGksIHRoaXMgaXMgbXkgZmlyc3QgcGF0Y2guXG4iLCBpZiB5b3UgcmVhbGx5CisgIHdhbnQgdG8gcHV0IGluIHRoZSBwYXRjaCBlLW1haWwsIHNob3VsZCBjb21lIGFmdGVyIHRoZQorICB0aHJlZS1kYXNoIGxpbmUgdGhhdCBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGNvbW1pdCBtZXNzYWdlLgorCisKK1BpbmUKKy0tLS0KKworKEpvaGFubmVzIFNjaGluZGVsaW4pCisKK0kgZG9uJ3Qga25vdyBob3cgbWFueSBwZW9wbGUgc3RpbGwgdXNlIHBpbmUsIGJ1dCBmb3IgdGhvc2UgcG9vcgorc291bHMgaXQgbWF5IGJlIGdvb2QgdG8gbWVudGlvbiB0aGF0IHRoZSBxdWVsbC1mbG93ZWQtdGV4dCBpcworbmVlZGVkIGZvciByZWNlbnQgdmVyc2lvbnMuCisKKy4uLiB0aGUgIm5vLXN0cmlwLXdoaXRlc3BhY2UtYmVmb3JlLXNlbmQiIG9wdGlvbiwgdG9vLiBBRkFJSyBpdAord2FzIGludHJvZHVjZWQgaW4gNC42MC4KKworKExpbnVzIFRvcnZhbGRzKQorCitBbmQgNC41OCBuZWVkcyBhdCBsZWFzdCB0aGlzLgorCistLS0KK2RpZmYtdHJlZSA4MzI2ZGQ4MzUwYmU2NGFjN2ZjODA1ZjY1NjNhMWQ2MWFkMTBkMzJjIChmcm9tIGU4ODZhNjFmNzZlZGY1NDEwNTczZTkyZTM4Y2UyMjk3NGY5YzQwZjEpCitBdXRob3I6IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0BnNS5vc2RsLm9yZz4KK0RhdGU6ICAgTW9uIEF1ZyAxNSAxNzoyMzo1MSAyMDA1IC0wNzAwCisKKyAgICBGaXggcGluZSB3aGl0ZXNwYWNlLWNvcnJ1cHRpb24gYnVnCisKKyAgICBUaGVyZSdzIG5vIGV4Y3VzZSBmb3IgdW5jb25kaXRpb25hbGx5IHJlbW92aW5nIHdoaXRlc3BhY2UgZnJvbQorICAgIHRoZSBwaWNvIGJ1ZmZlcnMgb24gY2xvc2UuCisKK2RpZmYgLS1naXQgYS9waWNvL3BpY28uYyBiL3BpY28vcGljby5jCistLS0gYS9waWNvL3BpY28uYworKysrIGIvcGljby9waWNvLmMKK0BAIC0yMTksNyArMjE5LDkgQEAgUElDTyAqcG07CisgCSAgICBzd2l0Y2gocGljb19hbGxfZG9uZSl7CS8qIHByZXBhcmUgZm9yL2hhbmRsZSBmaW5hbCBldmVudHMgKi8KKyAJICAgICAgY2FzZSBDT01QX0VYSVQgOgkJLyogYWxyZWFkeSBjb25maXJtZWQgKi8KKyAJCXBhY2toZWFkZXIoKTsKKysjaWYgMAorIAkJc3RyaXB3aGl0ZXNwYWNlKCk7CisrI2VuZGlmCisgCQljIHw9IENPTVBfRVhJVDsKKyAJCWJyZWFrOworIAorCisoRGFuaWVsIEJhcmthbG93KQorCis+IEEgcGF0Y2ggdG8gU3VibWl0dGluZ1BhdGNoZXMsIE1VQSBzcGVjaWZpYyBoZWxwIHNlY3Rpb24gZm9yCis+IHVzZXJzIG9mIFBpbmUgNC42MyB3b3VsZCBiZSB2ZXJ5IG11Y2ggYXBwcmVjaWF0ZWQuCisKK0FoLCBpdCBsb29rcyBsaWtlIGEgcmVjZW50IHZlcnNpb24gY2hhbmdlZCB0aGUgZGVmYXVsdCBiZWhhdmlvciB0byBkbyB0aGUKK3JpZ2h0IHRoaW5nLCBhbmQgaW52ZXJ0ZWQgdGhlIHNlbnNlIG9mIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbi4gKEVpdGhlcgordGhhdCBvciBHZW50b28gZGlkIGl0LikgU28geW91IG5lZWQgdG8gc2V0IHRoZQorIm5vLXN0cmlwLXdoaXRlc3BhY2UtYmVmb3JlLXNlbmQiIG9wdGlvbiwgdW5sZXNzIHRoZSBvcHRpb24geW91IGhhdmUgaXMKKyJzdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kIiwgaW4gd2hpY2ggY2FzZSB5b3Ugc2hvdWxkIGF2b2lkIGNoZWNraW5nCitpdC4KKworCitUaHVuZGVyYmlyZAorLS0tLS0tLS0tLS0KKworKEEgTGFyZ2UgQW5ncnkgU0NNKQorCitIZXJlIGFyZSBzb21lIGhpbnRzIG9uIGhvdyB0byBzdWNjZXNzZnVsbHkgc3VibWl0IHBhdGNoZXMgaW5saW5lIHVzaW5nCitUaHVuZGVyYmlyZC4KKworVGhpcyByZWNpcGUgYXBwZWFycyB0byB3b3JrIHdpdGggdGhlIGN1cnJlbnQgWyoxKl0gVGh1bmRlcmJpcmQgZnJvbSBTdXNlLgorCitUaGUgZm9sbG93aW5nIFRodW5kZXJiaXJkIGV4dGVuc2lvbnMgYXJlIG5lZWRlZDoKKwlBYm91dENvbmZpZyAwLjUKKwkJaHR0cDovL2Fib3V0Y29uZmlnLm1vemRldi5vcmcvCisJRXh0ZXJuYWwgRWRpdG9yIDAuNy4yCisJCWh0dHA6Ly9nbG9icy5vcmcvYXJ0aWNsZXMucGhwP2xuZz1lbiZwZz04CisKKzEpIFByZXBhcmUgdGhlIHBhdGNoIGFzIGEgdGV4dCBmaWxlIHVzaW5nIHlvdXIgbWV0aG9kIG9mIGNob2ljZS4KKworMikgQmVmb3JlIG9wZW5pbmcgYSBjb21wb3NlIHdpbmRvdywgdXNlIEVkaXQtPkFjY291bnQgU2V0dGluZ3MgdG8KK3VuY2hlY2sgdGhlICJDb21wb3NlIG1lc3NhZ2VzIGluIEhUTUwgZm9ybWF0IiBzZXR0aW5nIGluIHRoZQorIkNvbXBvc2l0aW9uICYgQWRkcmVzc2luZyIgcGFuZWwgb2YgdGhlIGFjY291bnQgdG8gYmUgdXNlZCB0byBzZW5kIHRoZQorcGF0Y2guIFsqMipdCisKKzMpIEluIHRoZSBtYWluIFRodW5kZXJiaXJkIHdpbmRvdywgX2JlZm9yZV8geW91IG9wZW4gdGhlIGNvbXBvc2Ugd2luZG93Citmb3IgdGhlIHBhdGNoLCB1c2UgVG9vbHMtPmFib3V0OmNvbmZpZyB0byBzZXQgdGhlIGZvbGxvd2luZyB0byB0aGUKK2luZGljYXRlZCB2YWx1ZXM6CisJbWFpbG5ld3Muc2VuZF9wbGFpbnRleHRfZmxvd2VkCT0+IGZhbHNlCisJbWFpbG5ld3Mud3JhcGxlbmd0aAkJPT4gMAorCis0KSBPcGVuIGEgY29tcG9zZSB3aW5kb3cgYW5kIGNsaWNrIHRoZSBleHRlcm5hbCBlZGl0b3IgaWNvbi4KKworNSkgSW4gdGhlIGV4dGVybmFsIGVkaXRvciB3aW5kb3csIHJlYWQgaW4gdGhlIHBhdGNoIGZpbGUgYW5kIGV4aXQgdGhlCitlZGl0b3Igbm9ybWFsbHkuCisKKzYpIEJhY2sgaW4gdGhlIGNvbXBvc2Ugd2luZG93OiBBZGQgd2hhdGV2ZXIgb3RoZXIgdGV4dCB5b3Ugd2lzaCB0byB0aGUKK21lc3NhZ2UsIGNvbXBsZXRlIHRoZSBhZGRyZXNzaW5nIGFuZCBzdWJqZWN0IGZpZWxkcywgYW5kIHByZXNzIHNlbmQuCisKKzcpIE9wdGlvbmFsbHksIHVuZG8gdGhlIGFib3V0OmNvbmZpZy9hY2NvdW50IHNldHRpbmdzIGNoYW5nZXMgbWFkZSBpbgorc3RlcHMgMiAmIDMuCisKKworW0Zvb3Rub3Rlc10KKyoxKiBWZXJzaW9uIDEuMCAoMjAwNDEyMDcpIGZyb20gdGhlIE1vemlsbGFUaHVuZGVyYmlyZC0xLjAtNSBycG0gb2YgU3VzZQorOS4zIHByb2Zlc3Npb25hbCB1cGRhdGVzLgorCisqMiogSXQgbWF5IGJlIHBvc3NpYmxlIHRvIGRvIHRoaXMgd2l0aCBhYm91dDpjb25maWcgYW5kIHRoZSBmb2xsb3dpbmcKK3NldHRpbmdzIGJ1dCBJIGhhdmVuJ3QgdHJpZWQsIHlldC4KKwltYWlsLmh0bWxfY29tcG9zZQkJCT0+IGZhbHNlCisJbWFpbC5pZGVudGl0eS5kZWZhdWx0LmNvbXBvc2VfaHRtbAk9PiBmYWxzZQorCW1haWwuaWRlbnRpdHkuaWQ/LmNvbXBvc2VfaHRtbAkJPT4gZmFsc2UKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mIGIvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTZkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYKQEAgLTAsMCArMSwzOCBAQAorIyMgZ2l0bGluazogbWFjcm8KKyMKKyMgVXNhZ2U6IGdpdGxpbms6Y29tbWFuZFttYW5wYWdlLXNlY3Rpb25dCisjCisjIE5vdGUsIHswfSBpcyB0aGUgbWFucGFnZSBzZWN0aW9uLCB3aGlsZSB7dGFyZ2V0fSBpcyB0aGUgY29tbWFuZC4KKyMKKyMgU2hvdyBHSVQgbGluayBhczogPGNvbW1hbmQ+KDxzZWN0aW9uPik7IGlmIHNlY3Rpb24gaXMgZGVmaW5lZCwgZWxzZSBqdXN0IHNob3cKKyMgdGhlIGNvbW1hbmQuCisKK1thdHRyaWJ1dGVzXQorY2FyZXQ9Xgorc3RhcnRzYj0mIzkxOworZW5kc2I9JiM5MzsKKworaWZkZWY6OmJhY2tlbmQtZG9jYm9va1tdCitbZ2l0bGluay1pbmxpbmVtYWNyb10KK3swJXt0YXJnZXR9fQorezAjPGNpdGVyZWZlbnRyeT59Cit7MCM8cmVmZW50cnl0aXRsZT57dGFyZ2V0fTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPnswfTwvbWFudm9sbnVtPn0KK3swIzwvY2l0ZXJlZmVudHJ5Pn0KK2VuZGlmOjpiYWNrZW5kLWRvY2Jvb2tbXQorCitpZmRlZjo6YmFja2VuZC1kb2Nib29rW10KKyMgInVuYnJlYWsiIGRvY2Jvb2steHNsIHYxLjY4IGZvciBtYW5wYWdlcy4gdjEuNjkgd29ya3Mgd2l0aCBvciB3aXRob3V0IHRoaXMuCitbbGlzdGluZ2Jsb2NrXQorPGV4YW1wbGU+PHRpdGxlPnt0aXRsZX08L3RpdGxlPgorPGxpdGVyYWxsYXlvdXQ+Cit8Cis8L2xpdGVyYWxsYXlvdXQ+Cit7dGl0bGUjfTwvZXhhbXBsZT4KK2VuZGlmOjpiYWNrZW5kLWRvY2Jvb2tbXQorCitpZmRlZjo6YmFja2VuZC14aHRtbDExW10KK1tnaXRsaW5rLWlubGluZW1hY3JvXQorPGEgaHJlZj0ie3RhcmdldH0uaHRtbCI+e3RhcmdldH17MD8oezB9KX08L2E+CitlbmRpZjo6YmFja2VuZC14aHRtbDExW10KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2J1aWxkLWRvY2RlcC5wZXJsIGIvRG9jdW1lbnRhdGlvbi9idWlsZC1kb2NkZXAucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODkzODljCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9idWlsZC1kb2NkZXAucGVybApAQCAtMCwwICsxLDUwIEBACisjIS91c3IvYmluL3BlcmwKKworbXkgJWluY2x1ZGUgPSAoKTsKK215ICVpbmNsdWRlZCA9ICgpOworCitmb3IgbXkgJHRleHQgKDwqLnR4dD4pIHsKKyAgICBvcGVuIEksICc8JywgJHRleHQgfHwgZGllICJjYW5ub3QgcmVhZDogJHRleHQiOworICAgIHdoaWxlICg8ST4pIHsKKwlpZiAoL15pbmNsdWRlOjovKSB7CisJICAgIGNob21wOworCSAgICBzL15pbmNsdWRlOjpccyovLzsKKwkgICAgcy9cW1xdLy87CisJICAgICRpbmNsdWRleyR0ZXh0fXskX30gPSAxOworCSAgICAkaW5jbHVkZWR7JF99ID0gMTsKKwl9CisgICAgfQorICAgIGNsb3NlIEk7Cit9CisKKyMgRG8gd2UgY2FyZSBhYm91dCBjaGFpbmVkIGluY2x1ZGVzPz8/CitteSAkY2hhbmdlZCA9IDE7Cit3aGlsZSAoJGNoYW5nZWQpIHsKKyAgICAkY2hhbmdlZCA9IDA7CisgICAgd2hpbGUgKG15ICgkdGV4dCwgJGluY2x1ZGVkKSA9IGVhY2ggJWluY2x1ZGUpIHsKKwlmb3IgbXkgJGkgKGtleXMgJSRpbmNsdWRlZCkgeworCSAgICAjICR0ZXh0IGhhcyBpbmNsdWRlOjokaTsgaWYgJGkgaW5jbHVkZXMgJGoKKwkgICAgIyAkdGV4dCBpbmRpcmVjdGx5IGluY2x1ZGVzICRqLgorCSAgICBpZiAoZXhpc3RzICRpbmNsdWRleyRpfSkgeworCQlmb3IgbXkgJGogKGtleXMgJXskaW5jbHVkZXskaX19KSB7CisJCSAgICBpZiAoIWV4aXN0cyAkaW5jbHVkZXskdGV4dH17JGp9KSB7CisJCQkkaW5jbHVkZXskdGV4dH17JGp9ID0gMTsKKwkJCSRpbmNsdWRlZHskan0gPSAxOworCQkJJGNoYW5nZWQgPSAxOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCit3aGlsZSAobXkgKCR0ZXh0LCAkaW5jbHVkZWQpID0gZWFjaCAlaW5jbHVkZSkgeworICAgIGlmICghIGV4aXN0cyAkaW5jbHVkZWR7JHRleHR9ICYmCisJKG15ICRiYXNlID0gJHRleHQpID1+IHMvXC50eHQkLy8pIHsKKwlteSAoJHN1ZmZpeCkgPSAnMSc7CisJaWYgKCRiYXNlIGVxICdnaXQnKSB7CisJICAgICRzdWZmaXggPSAnNyc7ICMgeXVjay4uLgorCX0KKwlwcmludCAiJGJhc2UuaHRtbCAkYmFzZS4kc3VmZml4IDogIiwgam9pbigiICIsIGtleXMgJSRpbmNsdWRlZCksICJcbiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jYWxsb3V0cy54c2wgYi9Eb2N1bWVudGF0aW9uL2NhbGxvdXRzLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDAzNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jYWxsb3V0cy54c2wKQEAgLTAsMCArMSwxNiBAQAorPCEtLSBjYWxsb3V0LnhzbDogY29udmVydHMgYXNjaWlkb2MgY2FsbG91dHMgdG8gbWFuIHBhZ2UgZm9ybWF0IC0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY28iPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoJ1xmQignLHN1YnN0cmluZy1hZnRlcihAaWQsJy0nKSwnKVxmUicpIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNhbGxvdXRsaXN0Ij4KKwk8eHNsOnRleHQ+LnNwJiMxMDs8L3hzbDp0ZXh0PgorCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKwk8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsb3V0Ij4KKwk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KCdcZkInLHN1YnN0cmluZy1hZnRlcihAYXJlYXJlZnMsJy0nKSwnLiBcZlInKSIvPgorCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKwk8eHNsOnRleHQ+LmJyJiMxMDs8L3hzbDp0ZXh0PgorPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWcudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzIyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy50eHQKQEAgLTAsMCArMSwyNTUgQEAKK0NPTkZJR1VSQVRJT04gRklMRQorLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnaXQgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHZhcmlhYmxlcyB0aGF0IGFmZmVjdAordGhlIGdpdCBjb21tYW5kJ3MgYmVoYXZpb3IuIFRoZXkgY2FuIGJlIHVzZWQgYnkgYm90aCB0aGUgZ2l0IHBsdW1iaW5nCithbmQgdGhlIHBvcmNlbGFpbnMuIFRoZSB2YXJpYWJsZXMgYXJlIGRpdmlkZWQgaW50byBzZWN0aW9ucywgd2hlcmUKK2luIHRoZSBmdWxseSBxdWFsaWZpZWQgdmFyaWFibGUgbmFtZSB0aGUgdmFyaWFibGUgaXRzZWxmIGlzIHRoZSBsYXN0Citkb3Qtc2VwYXJhdGVkIHNlZ21lbnQgYW5kIHRoZSBzZWN0aW9uIG5hbWUgaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhlIGxhc3QKK2RvdC4gVGhlIHZhcmlhYmxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBvbmx5IGFscGhhbnVtZXJpYworY2hhcmFjdGVycyBhcmUgYWxsb3dlZC4gU29tZSB2YXJpYWJsZXMgbWF5IGFwcGVhciBtdWx0aXBsZSB0aW1lcy4KKworVGhlIHN5bnRheCBpcyBmYWlybHkgZmxleGlibGUgYW5kIHBlcm1pc3NpdmU7IHdoaXRlc3BhY2VzIGFyZSBtb3N0bHkKK2lnbm9yZWQuIFRoZSAnIycgYW5kICc7JyBjaGFyYWN0ZXJzIGJlZ2luIGNvbW1lbnRzIHRvIHRoZSBlbmQgb2YgbGluZSwKK2JsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLCBsaW5lcyBjb250YWluaW5nIHN0cmluZ3MgZW5jbG9zZWQgaW4gc3F1YXJlCiticmFja2V0cyBzdGFydCBzZWN0aW9ucyBhbmQgYWxsIHRoZSBvdGhlciBsaW5lcyBhcmUgcmVjb2duaXplZAorYXMgc2V0dGluZyB2YXJpYWJsZXMsIGluIHRoZSBmb3JtICduYW1lID0gdmFsdWUnLiBJZiB0aGVyZSBpcyBubyBlcXVhbAorc2lnbiBvbiB0aGUgbGluZSwgdGhlIGVudGlyZSBsaW5lIGlzIHRha2VuIGFzICduYW1lJyBhbmQgdGhlIHZhcmlhYmxlCitpcyByZWNvZ25pemVkIGFzIGJvb2xlYW4gInRydWUiLiBTdHJpbmcgdmFsdWVzIG1heSBiZSBlbnRpcmVseSBvciBwYXJ0aWFsbHkKK2VuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXM7IHNvbWUgdmFyaWFibGVzIG1heSByZXF1aXJlIHNwZWNpYWwgdmFsdWUgZm9ybWF0LgorCitFeGFtcGxlCit+fn5+fn5+CisKKwkjIENvcmUgdmFyaWFibGVzCisJW2NvcmVdCisJCTsgRG9uJ3QgdHJ1c3QgZmlsZSBtb2RlcworCQlmaWxlbW9kZSA9IGZhbHNlCisKKwkjIE91ciBkaWZmIGFsZ29yaXRobQorCVtkaWZmXQorCQlleHRlcm5hbCA9ICIvdXNyL2xvY2FsL2Jpbi9nbnUtZGlmZiAtdSIKKwkJcmVuYW1lcyA9IHRydWUKKworVmFyaWFibGVzCit+fn5+fn5+fn4KKworTm90ZSB0aGF0IHRoaXMgbGlzdCBpcyBub24tY29tcHJlaGVuc2l2ZSBhbmQgbm90IG5lY2Vzc2FyaWx5IGNvbXBsZXRlLgorRm9yIGNvbW1hbmQtc3BlY2lmaWMgdmFyaWFibGVzLCB5b3Ugd2lsbCBmaW5kIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgoraW4gdGhlIGFwcHJvcHJpYXRlIG1hbnVhbCBwYWdlLiBZb3Ugd2lsbCBmaW5kIGEgZGVzY3JpcHRpb24gb2Ygbm9uLWNvcmUKK3BvcmNlbGFpbiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpbiB0aGUgcmVzcGVjdGl2ZSBwb3JjZWxhaW4gZG9jdW1lbnRhdGlvbi4KKworY29yZS5maWxlTW9kZTo6CisJSWYgZmFsc2UsIHRoZSBleGVjdXRhYmxlIGJpdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBpbmRleCBhbmQKKwl0aGUgd29ya2luZyBjb3B5IGFyZSBpZ25vcmVkOyB1c2VmdWwgb24gYnJva2VuIGZpbGVzeXN0ZW1zIGxpa2UgRkFULgorCVNlZSBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0uIFRydWUgYnkgZGVmYXVsdC4KKworY29yZS5naXRQcm94eTo6CisJQSAicHJveHkgY29tbWFuZCIgdG8gZXhlY3V0ZSAoYXMgJ2NvbW1hbmQgaG9zdCBwb3J0JykgaW5zdGVhZAorCW9mIGVzdGFibGlzaGluZyBkaXJlY3QgY29ubmVjdGlvbiB0byB0aGUgcmVtb3RlIHNlcnZlciB3aGVuCisJdXNpbmcgdGhlIGdpdCBwcm90b2NvbCBmb3IgZmV0Y2hpbmcuIElmIHRoZSB2YXJpYWJsZSB2YWx1ZSBpcworCWluIHRoZSAiQ09NTUFORCBmb3IgRE9NQUlOIiBmb3JtYXQsIHRoZSBjb21tYW5kIGlzIGFwcGxpZWQgb25seQorCW9uIGhvc3RuYW1lcyBlbmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRvbWFpbiBzdHJpbmcuIFRoaXMgdmFyaWFibGUKKwltYXkgYmUgc2V0IG11bHRpcGxlIHRpbWVzIGFuZCBpcyBtYXRjaGVkIGluIHRoZSBnaXZlbiBvcmRlcjsKKwl0aGUgZmlyc3QgbWF0Y2ggd2lucy4KKysKK0NhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX1BST1hZX0NPTU1BTkQnIGVudmlyb25tZW50IHZhcmlhYmxlCisod2hpY2ggYWx3YXlzIGFwcGxpZXMgdW5pdmVyc2FsbHksIHdpdGhvdXQgdGhlIHNwZWNpYWwgImZvciIKK2hhbmRsaW5nKS4KKworY29yZS5pZ25vcmVTdGF0OjoKKwlUaGUgd29ya2luZyBjb3B5IGZpbGVzIGFyZSBhc3N1bWVkIHRvIHN0YXkgdW5jaGFuZ2VkIHVudGlsIHlvdQorCW1hcmsgdGhlbSBvdGhlcndpc2UgbWFudWFsbHkgLSBHaXQgd2lsbCBub3QgZGV0ZWN0IHRoZSBmaWxlIGNoYW5nZXMKKwlieSBsc3RhdCgpIGNhbGxzLiBUaGlzIGlzIHVzZWZ1bCBvbiBzeXN0ZW1zIHdoZXJlIHRob3NlIGFyZSB2ZXJ5CisJc2xvdywgc3VjaCBhcyBNaWNyb3NvZnQgV2luZG93cy4gIFNlZSBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0uCisJRmFsc2UgYnkgZGVmYXVsdC4KKworY29yZS5wcmVmZXJTeW1saW5rUmVmczo6CisJSW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAic3ltcmVmIiBmb3JtYXQgZm9yIEhFQUQKKwlhbmQgb3RoZXIgc3ltYm9saWMgcmVmZXJlbmNlIGZpbGVzLCB1c2Ugc3ltYm9saWMgbGlua3MuCisJVGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIHRvIHdvcmsgd2l0aCBvbGQgc2NyaXB0cyB0aGF0CisJZXhwZWN0IEhFQUQgdG8gYmUgYSBzeW1ib2xpYyBsaW5rLgorCitjb3JlLmxvZ0FsbFJlZlVwZGF0ZXM6OgorCUlmIHRydWUsIGBnaXQtdXBkYXRlLXJlZmAgd2lsbCBhcHBlbmQgYSBsaW5lIHRvCisJIiRHSVRfRElSL2xvZ3MvPHJlZj4iIGxpc3RpbmcgdGhlIG5ldyBTSEExIGFuZCB0aGUgZGF0ZS90aW1lCisJb2YgdGhlIHVwZGF0ZS4JSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZQorCWNyZWF0ZWQgYXV0b21hdGljYWxseS4JVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgdXNlZCB0bworCWRldGVybWluZSB3aGF0IGNvbW1pdCB3YXMgdGhlIHRpcCBvZiBhIGJyYW5jaCAiMiBkYXlzIGFnbyIuCisJVGhpcyB2YWx1ZSBpcyBmYWxzZSBieSBkZWZhdWx0IChubyBsb2dnaW5nKS4KKworY29yZS5yZXBvc2l0b3J5Rm9ybWF0VmVyc2lvbjo6CisJSW50ZXJuYWwgdmFyaWFibGUgaWRlbnRpZnlpbmcgdGhlIHJlcG9zaXRvcnkgZm9ybWF0IGFuZCBsYXlvdXQKKwl2ZXJzaW9uLgorCitjb3JlLnNoYXJlZFJlcG9zaXRvcnk6OgorCVdoZW4gJ2dyb3VwJyAob3IgJ3RydWUnKSwgdGhlIHJlcG9zaXRvcnkgaXMgbWFkZSBzaGFyZWFibGUgYmV0d2VlbgorCXNldmVyYWwgdXNlcnMgaW4gYSBncm91cCAobWFraW5nIHN1cmUgYWxsIHRoZSBmaWxlcyBhbmQgb2JqZWN0cyBhcmUKKwlncm91cC13cml0YWJsZSkuIFdoZW4gJ2FsbCcgKG9yICd3b3JsZCcgb3IgJ2V2ZXJ5Ym9keScpLCB0aGUKKwlyZXBvc2l0b3J5IHdpbGwgYmUgcmVhZGFibGUgYnkgYWxsIHVzZXJzLCBhZGRpdGlvbmFsbHkgdG8gYmVpbmcKKwlncm91cC1zaGFyZWFibGUuIFdoZW4gJ3VtYXNrJyAob3IgJ2ZhbHNlJyksIGdpdCB3aWxsIHVzZSBwZXJtaXNzaW9ucworCXJlcG9ydGVkIGJ5IHVtYXNrKDIpLiBTZWUgZ2l0bGluazpnaXQtaW5pdC1kYlsxXS4gRmFsc2UgYnkgZGVmYXVsdC4KKworY29yZS53YXJuQW1iaWd1b3VzUmVmczo6CisJSWYgdHJ1ZSwgZ2l0IHdpbGwgd2FybiB5b3UgaWYgdGhlIHJlZiBuYW1lIHlvdSBwYXNzZWQgaXQgaXMgYW1iaWd1b3VzCisJYW5kIG1pZ2h0IG1hdGNoIG11bHRpcGxlIHJlZnMgaW4gdGhlIC5naXQvcmVmcy8gdHJlZS4gVHJ1ZSBieSBkZWZhdWx0LgorCitjb3JlLmNvbXByZXNzaW9uOjoKKwlBbiBpbnRlZ2VyIC0xLi45LCBpbmRpY2F0aW5nIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBmb3Igb2JqZWN0cyB0aGF0CisJYXJlIG5vdCBpbiBhIHBhY2sgZmlsZS4gLTEgaXMgdGhlIHpsaWIgYW5kIGdpdCBkZWZhdWx0LiAwIG1lYW5zIG5vCisJY29tcHJlc3Npb24sIGFuZCAxLi45IGFyZSB2YXJpb3VzIHNwZWVkL3NpemUgdHJhZGVvZmZzLCA5IGJlaW5nCisJc2xvd2VzdC4KKworY29yZS5sZWdhY3loZWFkZXJzOjoKKwlBIGJvb2xlYW4gd2hpY2ggZW5hYmxlcyB0aGUgbGVnYWN5IG9iamVjdCBoZWFkZXIgZm9ybWF0IGluIGNhc2UKKwl5b3Ugd2FudCB0byBpbnRlcm9wZXJhdGUgd2l0aCBvbGQgY2xpZW50cyBhY2Nlc3NpbmcgdGhlIG9iamVjdAorCWRhdGFiYXNlIGRpcmVjdGx5ICh3aGVyZSB0aGUgImh0dHA6Ly8iIGFuZCAicnN5bmM6Ly8iIHByb3RvY29scworCWNvdW50IGFzIGRpcmVjdCBhY2Nlc3MpLgorCithbGlhcy4qOjoKKwlDb21tYW5kIGFsaWFzZXMgZm9yIHRoZSBnaXRsaW5rOmdpdFsxXSBjb21tYW5kIHdyYXBwZXIgLSBlLmcuCisJYWZ0ZXIgZGVmaW5pbmcgImFsaWFzLmxhc3QgPSBjYXQtZmlsZSBjb21taXQgSEVBRCIsIHRoZSBpbnZvY2F0aW9uCisJImdpdCBsYXN0IiBpcyBlcXVpdmFsZW50IHRvICJnaXQgY2F0LWZpbGUgY29tbWl0IEhFQUQiLiBUbyBhdm9pZAorCWNvbmZ1c2lvbiBhbmQgdHJvdWJsZXMgd2l0aCBzY3JpcHQgdXNhZ2UsIGFsaWFzZXMgdGhhdAorCWhpZGUgZXhpc3RpbmcgZ2l0IGNvbW1hbmRzIGFyZSBpZ25vcmVkLiBBcmd1bWVudHMgYXJlIHNwbGl0IGJ5CisJc3BhY2VzLCB0aGUgdXN1YWwgc2hlbGwgcXVvdGluZyBhbmQgZXNjYXBpbmcgaXMgc3VwcG9ydGVkLgorCXF1b3RlIHBhaXIgYW5kIGEgYmFja3NsYXNoIGNhbiBiZSB1c2VkIHRvIHF1b3RlIHRoZW0uCisKK2FwcGx5LndoaXRlc3BhY2U6OgorCVRlbGxzIGBnaXQtYXBwbHlgIGhvdyB0byBoYW5kbGUgd2hpdGVzcGFjZXMsIGluIHRoZSBzYW1lIHdheQorCWFzIHRoZSAnLS13aGl0ZXNwYWNlJyBvcHRpb24uIFNlZSBnaXRsaW5rOmdpdC1hcHBseVsxXS4KKworcGFnZXIuY29sb3I6OgorCUEgYm9vbGVhbiB0byBlbmFibGUvZGlzYWJsZSBjb2xvcmVkIG91dHB1dCB3aGVuIHRoZSBwYWdlciBpcyBpbgorCXVzZSAoZGVmYXVsdCBpcyB0cnVlKS4KKworZGlmZi5jb2xvcjo6CisJV2hlbiB0cnVlIChvciBgYWx3YXlzYCksIGFsd2F5cyB1c2UgY29sb3JzIGluIHBhdGNoLgorCVdoZW4gZmFsc2UgKG9yIGBuZXZlcmApLCBuZXZlci4gIFdoZW4gc2V0IHRvIGBhdXRvYCwgdXNlCisJY29sb3JzIG9ubHkgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIHRoZSB0ZXJtaW5hbC4KKworZGlmZi5jb2xvci48c2xvdD46OgorCVVzZSBjdXN0b21pemVkIGNvbG9yIGZvciBkaWZmIGNvbG9yaXphdGlvbi4gIGA8c2xvdD5gCisJc3BlY2lmaWVzIHdoaWNoIHBhcnQgb2YgdGhlIHBhdGNoIHRvIHVzZSB0aGUgc3BlY2lmaWVkCisJY29sb3IsIGFuZCBpcyBvbmUgb2YgYHBsYWluYCAoY29udGV4dCB0ZXh0KSwgYG1ldGFgCisJKG1ldGFpbmZvcm1hdGlvbiksIGBmcmFnYCAoaHVuayBoZWFkZXIpLCBgb2xkYCAocmVtb3ZlZAorCWxpbmVzKSwgb3IgYG5ld2AgKGFkZGVkIGxpbmVzKS4gIFRoZSB2YWx1ZSBmb3IgdGhlc2UKKwljb25maWd1cmF0aW9uIHZhcmlhYmxlcyBjYW4gYmUgb25lIG9mOiBgbm9ybWFsYCwgYGJvbGRgLAorCWBkaW1gLCBgdWxgLCBgYmxpbmtgLCBgcmV2ZXJzZWAsIGByZXNldGAsIGBibGFja2AsCisJYHJlZGAsIGBncmVlbmAsIGB5ZWxsb3dgLCBgYmx1ZWAsIGBtYWdlbnRhYCwgYGN5YW5gLCBvcgorCWB3aGl0ZWAuCisKK2RpZmYucmVuYW1lTGltaXQ6OgorCVRoZSBudW1iZXIgb2YgZmlsZXMgdG8gY29uc2lkZXIgd2hlbiBwZXJmb3JtaW5nIHRoZSBjb3B5L3JlbmFtZQorCWRldGVjdGlvbjsgZXF1aXZhbGVudCB0byB0aGUgZ2l0IGRpZmYgb3B0aW9uICctbCcuCisKK2RpZmYucmVuYW1lczo6CisJVGVsbHMgZ2l0IHRvIGRldGVjdCByZW5hbWVzLiAgSWYgc2V0IHRvIGFueSBib29sZWFuIHZhbHVlLCBpdAorCXdpbGwgZW5hYmxlIGJhc2ljIHJlbmFtZSBkZXRlY3Rpb24uICBJZiBzZXQgdG8gImNvcGllcyIgb3IKKwkiY29weSIsIGl0IHdpbGwgZGV0ZWN0IGNvcGllcywgYXMgd2VsbC4KKworZm9ybWF0LmhlYWRlcnM6OgorCUFkZGl0aW9uYWwgZW1haWwgaGVhZGVycyB0byBpbmNsdWRlIGluIGEgcGF0Y2ggdG8gYmUgc3VibWl0dGVkCisJYnkgbWFpbC4gIFNlZSBnaXRsaW5rOmdpdC1mb3JtYXQtcGF0Y2hbMV0uCisKK2dpdGN2cy5lbmFibGVkOjoKKwlXaGV0aGVyIHRoZSBjdnMgcHNlcnZlciBpbnRlcmZhY2UgaXMgZW5hYmxlZCBmb3IgdGhpcyByZXBvc2l0b3J5LgorCVNlZSBnaXRsaW5rOmdpdC1jdnNzZXJ2ZXJbMV0uCisKK2dpdGN2cy5sb2dmaWxlOjoKKwlQYXRoIHRvIGEgbG9nIGZpbGUgd2hlcmUgdGhlIGN2cyBwc2VydmVyIGludGVyZmFjZSB3ZWxsLi4uIGxvZ3MKKwl2YXJpb3VzIHN0dWZmLiBTZWUgZ2l0bGluazpnaXQtY3Zzc2VydmVyWzFdLgorCitodHRwLnNzbFZlcmlmeTo6CisJV2hldGhlciB0byB2ZXJpZnkgdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGZldGNoaW5nIG9yIHB1c2hpbmcKKwlvdmVyIEhUVFBTLiBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9TU0xfTk9fVkVSSUZZJyBlbnZpcm9ubWVudAorCXZhcmlhYmxlLgorCitodHRwLnNzbENlcnQ6OgorCUZpbGUgY29udGFpbmluZyB0aGUgU1NMIGNlcnRpZmljYXRlIHdoZW4gZmV0Y2hpbmcgb3IgcHVzaGluZworCW92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX1NTTF9DRVJUJyBlbnZpcm9ubWVudAorCXZhcmlhYmxlLgorCitodHRwLnNzbEtleTo6CisJRmlsZSBjb250YWluaW5nIHRoZSBTU0wgcHJpdmF0ZSBrZXkgd2hlbiBmZXRjaGluZyBvciBwdXNoaW5nCisJb3ZlciBIVFRQUy4gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlICdHSVRfU1NMX0tFWScgZW52aXJvbm1lbnQKKwl2YXJpYWJsZS4KKworaHR0cC5zc2xDQUluZm86OgorCUZpbGUgY29udGFpbmluZyB0aGUgY2VydGlmaWNhdGVzIHRvIHZlcmlmeSB0aGUgcGVlciB3aXRoIHdoZW4KKwlmZXRjaGluZyBvciBwdXNoaW5nIG92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZQorCSdHSVRfU1NMX0NBSU5GTycgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK2h0dHAuc3NsQ0FQYXRoOjoKKwlQYXRoIGNvbnRhaW5pbmcgZmlsZXMgd2l0aCB0aGUgQ0EgY2VydGlmaWNhdGVzIHRvIHZlcmlmeSB0aGUgcGVlcgorCXdpdGggd2hlbiBmZXRjaGluZyBvciBwdXNoaW5nIG92ZXIgSFRUUFMuIENhbiBiZSBvdmVycmlkZGVuCisJYnkgdGhlICdHSVRfU1NMX0NBUEFUSCcgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKK2h0dHAubWF4UmVxdWVzdHM6OgorCUhvdyBtYW55IEhUVFAgcmVxdWVzdHMgdG8gbGF1bmNoIGluIHBhcmFsbGVsLiBDYW4gYmUgb3ZlcnJpZGRlbgorCWJ5IHRoZSAnR0lUX0hUVFBfTUFYX1JFUVVFU1RTJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRGVmYXVsdCBpcyA1LgorCitodHRwLmxvd1NwZWVkTGltaXQsIGh0dHAubG93U3BlZWRUaW1lOjoKKwlJZiB0aGUgSFRUUCB0cmFuc2ZlciBzcGVlZCBpcyBsZXNzIHRoYW4gJ2h0dHAubG93U3BlZWRMaW1pdCcKKwlmb3IgbG9uZ2VyIHRoYW4gJ2h0dHAubG93U3BlZWRUaW1lJyBzZWNvbmRzLCB0aGUgdHJhbnNmZXIgaXMgYWJvcnRlZC4KKwlDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgJ0dJVF9IVFRQX0xPV19TUEVFRF9MSU1JVCcgYW5kCisJJ0dJVF9IVFRQX0xPV19TUEVFRF9USU1FJyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKK2kxOG4uY29tbWl0RW5jb2Rpbmc6OgorCUNoYXJhY3RlciBlbmNvZGluZyB0aGUgY29tbWl0IG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW47IGdpdCBpdHNlbGYKKwlkb2VzIG5vdCBjYXJlIHBlciBzZSwgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5IGUuZy4gd2hlbgorCWltcG9ydGluZyBjb21taXRzIGZyb20gZW1haWxzIG9yIGluIHRoZSBnaXRrIGdyYXBoaWNhbCBoaXN0b3J5CisJYnJvd3NlciAoYW5kIHBvc3NpYmx5IGF0IG90aGVyIHBsYWNlcyBpbiB0aGUgZnV0dXJlIG9yIGluIG90aGVyCisJcG9yY2VsYWlucykuIFNlZSBlLmcuIGdpdGxpbms6Z2l0LW1haWxpbmZvWzFdLiBEZWZhdWx0cyB0byAndXRmLTgnLgorCittZXJnZS5zdW1tYXJ5OjoKKwlXaGV0aGVyIHRvIGluY2x1ZGUgc3VtbWFyaWVzIG9mIG1lcmdlZCBjb21taXRzIGluIG5ld2x5IGNyZWF0ZWQKKwltZXJnZSBjb21taXQgbWVzc2FnZXMuIEZhbHNlIGJ5IGRlZmF1bHQuCisKK3BhY2sud2luZG93OjoKKwlUaGUgc2l6ZSBvZiB0aGUgd2luZG93IHVzZWQgYnkgZ2l0bGluazpnaXQtcGFjay1vYmplY3RzWzFdIHdoZW4gbm8KKwl3aW5kb3cgc2l6ZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiBEZWZhdWx0cyB0byAxMC4KKworcHVsbC5vY3RvcHVzOjoKKwlUaGUgZGVmYXVsdCBtZXJnZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBwdWxsaW5nIG11bHRpcGxlIGJyYW5jaGVzCisJYXQgb25jZS4KKworcHVsbC50d29oZWFkOjoKKwlUaGUgZGVmYXVsdCBtZXJnZSBzdHJhdGVneSB0byB1c2Ugd2hlbiBwdWxsaW5nIGEgc2luZ2xlIGJyYW5jaC4KKworc2hvdy5kaWZmdHJlZTo6CisJVGhlIGRlZmF1bHQgZ2l0bGluazpnaXQtZGlmZi10cmVlWzFdIGFyZ3VtZW50cyB0byBiZSB1c2VkCisJZm9yIGdpdGxpbms6Z2l0LXNob3dbMV0uCisKK3Nob3dicmFuY2guZGVmYXVsdDo6CisJVGhlIGRlZmF1bHQgc2V0IG9mIGJyYW5jaGVzIGZvciBnaXRsaW5rOmdpdC1zaG93LWJyYW5jaFsxXS4KKwlTZWUgZ2l0bGluazpnaXQtc2hvdy1icmFuY2hbMV0uCisKK3Rhci51bWFzazo6CisJQnkgZGVmYXVsdCwgZ2l0bGluazpnaXQtdGFyLXRyZWVbMV0gc2V0cyBmaWxlIGFuZCBkaXJlY3RvcmllcyBtb2RlcworCXRvIDA2NjYgb3IgMDc3Ny4gV2hpbGUgdGhpcyBpcyBib3RoIHVzZWZ1bCBhbmQgYWNjZXB0YWJsZSBmb3IgcHJvamVjdHMKKwlzdWNoIGFzIHRoZSBMaW51eCBLZXJuZWwsIGl0IG1pZ2h0IGJlIGV4Y2Vzc2l2ZSBmb3Igb3RoZXIgcHJvamVjdHMuCisJV2l0aCB0aGlzIHZhcmlhYmxlLCBpdCBiZWNvbWVzIHBvc3NpYmxlIHRvIHRlbGwKKwlnaXRsaW5rOmdpdC10YXItdHJlZVsxXSB0byBhcHBseSBhIHNwZWNpZmljIHVtYXNrIHRvIHRoZSBtb2RlcyBhYm92ZS4KKwlUaGUgc3BlY2lhbCB2YWx1ZSAidXNlciIgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIncyBjdXJyZW50IHVtYXNrIHdpbGwKKwliZSB1c2VkLiBUaGlzIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgcHJvamVjdHMsIGFzIGl0IHdpbGwgbGVhZCB0bworCXRoZSBzYW1lIHBlcm1pc3Npb25zIGFzIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdIHdvdWxkIHVzZS4gVGhlIGRlZmF1bHQKKwl2YWx1ZSByZW1haW5zIDAsIHdoaWNoIG1lYW5zIHdvcmxkIHJlYWQtd3JpdGUuCisKK3VzZXIuZW1haWw6OgorCVlvdXIgZW1haWwgYWRkcmVzcyB0byBiZSByZWNvcmRlZCBpbiBhbnkgbmV3bHkgY3JlYXRlZCBjb21taXRzLgorCUNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX0FVVEhPUl9FTUFJTCcgYW5kICdHSVRfQ09NTUlUVEVSX0VNQUlMJworCWVudmlyb25tZW50IHZhcmlhYmxlcy4gIFNlZSBnaXRsaW5rOmdpdC1jb21taXQtdHJlZVsxXS4KKwordXNlci5uYW1lOjoKKwlZb3VyIGZ1bGwgbmFtZSB0byBiZSByZWNvcmRlZCBpbiBhbnkgbmV3bHkgY3JlYXRlZCBjb21taXRzLgorCUNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAnR0lUX0FVVEhPUl9OQU1FJyBhbmQgJ0dJVF9DT01NSVRURVJfTkFNRScKKwllbnZpcm9ubWVudCB2YXJpYWJsZXMuICBTZWUgZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0uCisKK3doYXRjaGFuZ2VkLmRpZmZ0cmVlOjoKKwlUaGUgZGVmYXVsdCBnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0gYXJndW1lbnRzIHRvIGJlIHVzZWQKKwlmb3IgZ2l0bGluazpnaXQtd2hhdGNoYW5nZWRbMV0uCisKK2ltYXA6OgorCVRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpbiB0aGUgJ2ltYXAnIHNlY3Rpb24gYXJlIGRlc2NyaWJlZAorCWluIGdpdGxpbms6Z2l0LWltYXAtc2VuZFsxXS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29yZS10dXRvcmlhbC50eHQgYi9Eb2N1bWVudGF0aW9uL2NvcmUtdHV0b3JpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODU4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NvcmUtdHV0b3JpYWwudHh0CkBAIC0wLDAgKzEsMTcyMiBAQAorQSBnaXQgY29yZSB0dXRvcmlhbCBmb3IgZGV2ZWxvcGVycworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHRyeWluZyB0byBiZSBhIHNob3J0IHR1dG9yaWFsIG9uIHNldHRpbmcgdXAgYW5kIHVzaW5nIGEgZ2l0CityZXBvc2l0b3J5LCBtYWlubHkgYmVjYXVzZSBiZWluZyBoYW5kcy1vbiBhbmQgdXNpbmcgZXhwbGljaXQgZXhhbXBsZXMgaXMKK29mdGVuIHRoZSBiZXN0IHdheSBvZiBleHBsYWluaW5nIHdoYXQgaXMgZ29pbmcgb24uCisKK0luIG5vcm1hbCBsaWZlLCBtb3N0IHBlb3BsZSB3b3VsZG4ndCB1c2UgdGhlICJjb3JlIiBnaXQgcHJvZ3JhbXMKK2RpcmVjdGx5LCBidXQgcmF0aGVyIHNjcmlwdCBhcm91bmQgdGhlbSB0byBtYWtlIHRoZW0gbW9yZSBwYWxhdGFibGUuIAorVW5kZXJzdGFuZGluZyB0aGUgY29yZSBnaXQgc3R1ZmYgbWF5IGhlbHAgc29tZSBwZW9wbGUgZ2V0IHRob3NlIHNjcmlwdHMKK2RvbmUsIHRob3VnaCwgYW5kIGl0IG1heSBhbHNvIGJlIGluc3RydWN0aXZlIGluIGhlbHBpbmcgcGVvcGxlCit1bmRlcnN0YW5kIHdoYXQgaXQgaXMgdGhhdCB0aGUgaGlnaGVyLWxldmVsIGhlbHBlciBzY3JpcHRzIGFyZSBhY3R1YWxseQorZG9pbmcuIAorCitUaGUgY29yZSBnaXQgaXMgb2Z0ZW4gY2FsbGVkICJwbHVtYmluZyIsIHdpdGggdGhlIHByZXR0aWVyIHVzZXIKK2ludGVyZmFjZXMgb24gdG9wIG9mIGl0IGNhbGxlZCAicG9yY2VsYWluIi4gWW91IG1heSBub3Qgd2FudCB0byB1c2UgdGhlCitwbHVtYmluZyBkaXJlY3RseSB2ZXJ5IG9mdGVuLCBidXQgaXQgY2FuIGJlIGdvb2QgdG8ga25vdyB3aGF0IHRoZQorcGx1bWJpbmcgZG9lcyBmb3Igd2hlbiB0aGUgcG9yY2VsYWluIGlzbid0IGZsdXNoaW5nLgorCitUaGUgbWF0ZXJpYWwgcHJlc2VudGVkIGhlcmUgb2Z0ZW4gZ29lcyBkZWVwIGRlc2NyaWJpbmcgaG93IHRoaW5ncword29yayBpbnRlcm5hbGx5LiAgSWYgeW91IGFyZSBtb3N0bHkgaW50ZXJlc3RlZCBpbiB1c2luZyBnaXQgYXMgYQorU0NNLCB5b3UgY2FuIHNraXAgdGhlbSBkdXJpbmcgeW91ciBmaXJzdCBwYXNzLgorCitbTk9URV0KK0FuZCB0aG9zZSAidG9vIGRlZXAiIGRlc2NyaXB0aW9ucyBhcmUgb2Z0ZW4gbWFya2VkIGFzIE5vdGUuCisKK1tOT1RFXQorSWYgeW91IGFyZSBhbHJlYWR5IGZhbWlsaWFyIHdpdGggYW5vdGhlciB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLAorbGlrZSBDVlMsIHlvdSBtYXkgd2FudCB0byB0YWtlIGEgbG9vayBhdAorbGluazpldmVyeWRheS5odG1sW0V2ZXJ5ZGF5IEdJVCBpbiAyMCBjb21tYW5kcyBvciBzb10gZmlyc3QKK2JlZm9yZSByZWFkaW5nIHRoaXMuCisKKworQ3JlYXRpbmcgYSBnaXQgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDcmVhdGluZyBhIG5ldyBnaXQgcmVwb3NpdG9yeSBjb3VsZG4ndCBiZSBlYXNpZXI6IGFsbCBnaXQgcmVwb3NpdG9yaWVzIHN0YXJ0CitvdXQgZW1wdHksIGFuZCB0aGUgb25seSB0aGluZyB5b3UgbmVlZCB0byBkbyBpcyBmaW5kIHlvdXJzZWxmIGEKK3N1YmRpcmVjdG9yeSB0aGF0IHlvdSB3YW50IHRvIHVzZSBhcyBhIHdvcmtpbmcgdHJlZSAtIGVpdGhlciBhbiBlbXB0eQorb25lIGZvciBhIHRvdGFsbHkgbmV3IHByb2plY3QsIG9yIGFuIGV4aXN0aW5nIHdvcmtpbmcgdHJlZSB0aGF0IHlvdSB3YW50Cit0byBpbXBvcnQgaW50byBnaXQuIAorCitGb3Igb3VyIGZpcnN0IGV4YW1wbGUsIHdlJ3JlIGdvaW5nIHRvIHN0YXJ0IGEgdG90YWxseSBuZXcgcmVwb3NpdG9yeSBmcm9tCitzY3JhdGNoLCB3aXRoIG5vIHByZS1leGlzdGluZyBmaWxlcywgYW5kIHdlJ2xsIGNhbGwgaXQgYGdpdC10dXRvcmlhbGAuCitUbyBzdGFydCB1cCwgY3JlYXRlIGEgc3ViZGlyZWN0b3J5IGZvciBpdCwgY2hhbmdlIGludG8gdGhhdAorc3ViZGlyZWN0b3J5LCBhbmQgaW5pdGlhbGl6ZSB0aGUgZ2l0IGluZnJhc3RydWN0dXJlIHdpdGggYGdpdC1pbml0LWRiYDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG1rZGlyIGdpdC10dXRvcmlhbAorJCBjZCBnaXQtdHV0b3JpYWwKKyQgZ2l0LWluaXQtZGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byB3aGljaCBnaXQgd2lsbCByZXBseQorCistLS0tLS0tLS0tLS0tLS0tCitkZWZhdWx0aW5nIHRvIGxvY2FsIHN0b3JhZ2UgYXJlYQorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBpcyBqdXN0IGdpdCdzIHdheSBvZiBzYXlpbmcgdGhhdCB5b3UgaGF2ZW4ndCBiZWVuIGRvaW5nIGFueXRoaW5nCitzdHJhbmdlLCBhbmQgdGhhdCBpdCB3aWxsIGhhdmUgY3JlYXRlZCBhIGxvY2FsIGAuZ2l0YCBkaXJlY3Rvcnkgc2V0dXAgZm9yCit5b3VyIG5ldyBwcm9qZWN0LiBZb3Ugd2lsbCBub3cgaGF2ZSBhIGAuZ2l0YCBkaXJlY3RvcnksIGFuZCB5b3UgY2FuCitpbnNwZWN0IHRoYXQgd2l0aCBgbHNgLiBGb3IgeW91ciBuZXcgZW1wdHkgcHJvamVjdCwgaXQgc2hvdWxkIHNob3cgeW91Cit0aHJlZSBlbnRyaWVzLCBhbW9uZyBvdGhlciB0aGluZ3M6CisKKyAtIGEgZmlsZSBjYWxsZWQgYEhFQURgLCB0aGF0IGhhcyBgcmVmOiByZWZzL2hlYWRzL21hc3RlcmAgaW4gaXQuCisgICBUaGlzIGlzIHNpbWlsYXIgdG8gYSBzeW1ib2xpYyBsaW5rIGFuZCBwb2ludHMgYXQKKyAgIGByZWZzL2hlYWRzL21hc3RlcmAgcmVsYXRpdmUgdG8gdGhlIGBIRUFEYCBmaWxlLgorKworRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIGZhY3QgdGhhdCB0aGUgZmlsZSB0aGF0IHRoZSBgSEVBRGAgbGluayBwb2ludHMgdG8KK2RvZXNuJ3QgZXZlbiBleGlzdCB5ZXQgLS0geW91IGhhdmVuJ3QgY3JlYXRlZCB0aGUgY29tbWl0IHRoYXQgd2lsbAorc3RhcnQgeW91ciBgSEVBRGAgZGV2ZWxvcG1lbnQgYnJhbmNoIHlldC4KKworIC0gYSBzdWJkaXJlY3RvcnkgY2FsbGVkIGBvYmplY3RzYCwgd2hpY2ggd2lsbCBjb250YWluIGFsbCB0aGUKKyAgIG9iamVjdHMgb2YgeW91ciBwcm9qZWN0LiBZb3Ugc2hvdWxkIG5ldmVyIGhhdmUgYW55IHJlYWwgcmVhc29uIHRvCisgICBsb29rIGF0IHRoZSBvYmplY3RzIGRpcmVjdGx5LCBidXQgeW91IG1pZ2h0IHdhbnQgdG8ga25vdyB0aGF0IHRoZXNlCisgICBvYmplY3RzIGFyZSB3aGF0IGNvbnRhaW5zIGFsbCB0aGUgcmVhbCAnZGF0YScgaW4geW91ciByZXBvc2l0b3J5LgorCisgLSBhIHN1YmRpcmVjdG9yeSBjYWxsZWQgYHJlZnNgLCB3aGljaCBjb250YWlucyByZWZlcmVuY2VzIHRvIG9iamVjdHMuCisKK0luIHBhcnRpY3VsYXIsIHRoZSBgcmVmc2Agc3ViZGlyZWN0b3J5IHdpbGwgY29udGFpbiB0d28gb3RoZXIKK3N1YmRpcmVjdG9yaWVzLCBuYW1lZCBgaGVhZHNgIGFuZCBgdGFnc2AgcmVzcGVjdGl2ZWx5LiBUaGV5IGRvCitleGFjdGx5IHdoYXQgdGhlaXIgbmFtZXMgaW1wbHk6IHRoZXkgY29udGFpbiByZWZlcmVuY2VzIHRvIGFueSBudW1iZXIKK29mIGRpZmZlcmVudCAnaGVhZHMnIG9mIGRldmVsb3BtZW50IChha2EgJ2JyYW5jaGVzJyksIGFuZCB0byBhbnkKKyd0YWdzJyB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgdG8gbmFtZSBzcGVjaWZpYyB2ZXJzaW9ucyBpbiB5b3VyCityZXBvc2l0b3J5LgorCitPbmUgbm90ZTogdGhlIHNwZWNpYWwgYG1hc3RlcmAgaGVhZCBpcyB0aGUgZGVmYXVsdCBicmFuY2gsIHdoaWNoIGlzCit3aHkgdGhlIGAuZ2l0L0hFQURgIGZpbGUgd2FzIGNyZWF0ZWQgcG9pbnRzIHRvIGl0IGV2ZW4gaWYgaXQKK2RvZXNuJ3QgeWV0IGV4aXN0LiBCYXNpY2FsbHksIHRoZSBgSEVBRGAgbGluayBpcyBzdXBwb3NlZCB0byBhbHdheXMKK3BvaW50IHRvIHRoZSBicmFuY2ggeW91IGFyZSB3b3JraW5nIG9uIHJpZ2h0IG5vdywgYW5kIHlvdSBhbHdheXMKK3N0YXJ0IG91dCBleHBlY3RpbmcgdG8gd29yayBvbiB0aGUgYG1hc3RlcmAgYnJhbmNoLgorCitIb3dldmVyLCB0aGlzIGlzIG9ubHkgYSBjb252ZW50aW9uLCBhbmQgeW91IGNhbiBuYW1lIHlvdXIgYnJhbmNoZXMKK2FueXRoaW5nIHlvdSB3YW50LCBhbmQgZG9uJ3QgaGF2ZSB0byBldmVyIGV2ZW4gJ2hhdmUnIGEgYG1hc3RlcmAKK2JyYW5jaC4gQSBudW1iZXIgb2YgdGhlIGdpdCB0b29scyB3aWxsIGFzc3VtZSB0aGF0IGAuZ2l0L0hFQURgIGlzCit2YWxpZCwgdGhvdWdoLgorCitbTk9URV0KK0FuICdvYmplY3QnIGlzIGlkZW50aWZpZWQgYnkgaXRzIDE2MC1iaXQgU0hBMSBoYXNoLCBha2EgJ29iamVjdCBuYW1lJywKK2FuZCBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgaXMgYWx3YXlzIHRoZSA0MC1ieXRlIGhleAorcmVwcmVzZW50YXRpb24gb2YgdGhhdCBTSEExIG5hbWUuIFRoZSBmaWxlcyBpbiB0aGUgYHJlZnNgCitzdWJkaXJlY3RvcnkgYXJlIGV4cGVjdGVkIHRvIGNvbnRhaW4gdGhlc2UgaGV4IHJlZmVyZW5jZXMKKyh1c3VhbGx5IHdpdGggYSBmaW5hbCBgXCdcblwnYCBhdCB0aGUgZW5kKSwgYW5kIHlvdSBzaG91bGQgdGh1cworZXhwZWN0IHRvIHNlZSBhIG51bWJlciBvZiA0MS1ieXRlIGZpbGVzIGNvbnRhaW5pbmcgdGhlc2UKK3JlZmVyZW5jZXMgaW4gdGhlc2UgYHJlZnNgIHN1YmRpcmVjdG9yaWVzIHdoZW4geW91IGFjdHVhbGx5IHN0YXJ0Citwb3B1bGF0aW5nIHlvdXIgdHJlZS4KKworW05PVEVdCitBbiBhZHZhbmNlZCB1c2VyIG1heSB3YW50IHRvIHRha2UgYSBsb29rIGF0IHRoZQorbGluazpyZXBvc2l0b3J5LWxheW91dC5odG1sW3JlcG9zaXRvcnkgbGF5b3V0XSBkb2N1bWVudAorYWZ0ZXIgZmluaXNoaW5nIHRoaXMgdHV0b3JpYWwuCisKK1lvdSBoYXZlIG5vdyBjcmVhdGVkIHlvdXIgZmlyc3QgZ2l0IHJlcG9zaXRvcnkuIE9mIGNvdXJzZSwgc2luY2UgaXQncworZW1wdHksIHRoYXQncyBub3QgdmVyeSB1c2VmdWwsIHNvIGxldCdzIHN0YXJ0IHBvcHVsYXRpbmcgaXQgd2l0aCBkYXRhLgorCisKK1BvcHVsYXRpbmcgYSBnaXQgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlJ2xsIGtlZXAgdGhpcyBzaW1wbGUgYW5kIHN0dXBpZCwgc28gd2UnbGwgc3RhcnQgb2ZmIHdpdGggcG9wdWxhdGluZyBhCitmZXcgdHJpdmlhbCBmaWxlcyBqdXN0IHRvIGdldCBhIGZlZWwgZm9yIGl0LgorCitTdGFydCBvZmYgd2l0aCBqdXN0IGNyZWF0aW5nIGFueSByYW5kb20gZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBtYWludGFpbgoraW4geW91ciBnaXQgcmVwb3NpdG9yeS4gV2UnbGwgc3RhcnQgb2ZmIHdpdGggYSBmZXcgYmFkIGV4YW1wbGVzLCBqdXN0IHRvCitnZXQgYSBmZWVsIGZvciBob3cgdGhpcyB3b3JrczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gIkhlbGxvIFdvcmxkIiA+aGVsbG8KKyQgZWNobyAiU2lsbHkgZXhhbXBsZSIgPmV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit5b3UgaGF2ZSBub3cgY3JlYXRlZCB0d28gZmlsZXMgaW4geW91ciB3b3JraW5nIHRyZWUgKGFrYSAnd29ya2luZyBkaXJlY3RvcnknKSwKK2J1dCB0byBhY3R1YWxseSBjaGVjayBpbiB5b3VyIGhhcmQgd29yaywgeW91IHdpbGwgaGF2ZSB0byBnbyB0aHJvdWdoIHR3byBzdGVwczoKKworIC0gZmlsbCBpbiB0aGUgJ2luZGV4JyBmaWxlIChha2EgJ2NhY2hlJykgd2l0aCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgeW91cgorICAgd29ya2luZyB0cmVlIHN0YXRlLgorCisgLSBjb21taXQgdGhhdCBpbmRleCBmaWxlIGFzIGFuIG9iamVjdC4KKworVGhlIGZpcnN0IHN0ZXAgaXMgdHJpdmlhbDogd2hlbiB5b3Ugd2FudCB0byB0ZWxsIGdpdCBhYm91dCBhbnkgY2hhbmdlcwordG8geW91ciB3b3JraW5nIHRyZWUsIHlvdSB1c2UgdGhlIGBnaXQtdXBkYXRlLWluZGV4YCBwcm9ncmFtLiBUaGF0Citwcm9ncmFtIG5vcm1hbGx5IGp1c3QgdGFrZXMgYSBsaXN0IG9mIGZpbGVuYW1lcyB5b3Ugd2FudCB0byB1cGRhdGUsIGJ1dAordG8gYXZvaWQgdHJpdmlhbCBtaXN0YWtlcywgaXQgcmVmdXNlcyB0byBhZGQgbmV3IGVudHJpZXMgdG8gdGhlIGluZGV4Cisob3IgcmVtb3ZlIGV4aXN0aW5nIG9uZXMpIHVubGVzcyB5b3UgZXhwbGljaXRseSB0ZWxsIGl0IHRoYXQgeW91J3JlCithZGRpbmcgYSBuZXcgZW50cnkgd2l0aCB0aGUgYFwtLWFkZGAgZmxhZyAob3IgcmVtb3ZpbmcgYW4gZW50cnkgd2l0aCB0aGUKK2BcLS1yZW1vdmVgKSBmbGFnLgorCitTbyB0byBwb3B1bGF0ZSB0aGUgaW5kZXggd2l0aCB0aGUgdHdvIGZpbGVzIHlvdSBqdXN0IGNyZWF0ZWQsIHlvdSBjYW4gZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgaGVsbG8gZXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3UgaGF2ZSBub3cgdG9sZCBnaXQgdG8gdHJhY2sgdGhvc2UgdHdvIGZpbGVzLgorCitJbiBmYWN0LCBhcyB5b3UgZGlkIHRoYXQsIGlmIHlvdSBub3cgbG9vayBpbnRvIHlvdXIgb2JqZWN0IGRpcmVjdG9yeSwKK3lvdSdsbCBub3RpY2UgdGhhdCBnaXQgd2lsbCBoYXZlIGFkZGVkIHR3byBuZXcgb2JqZWN0cyB0byB0aGUgb2JqZWN0CitkYXRhYmFzZS4gSWYgeW91IGRpZCBleGFjdGx5IHRoZSBzdGVwcyBhYm92ZSwgeW91IHNob3VsZCBub3cgYmUgYWJsZSB0byBkbworCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgbHMgLmdpdC9vYmplY3RzLz8/LyoKKy0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHNlZSB0d28gZmlsZXM6CisKKy0tLS0tLS0tLS0tLS0tLS0KKy5naXQvb2JqZWN0cy81NS83ZGIwM2RlOTk3Yzg2YTRhMDI4ZTFlYmQzYTFjZWIyMjViZTIzOCAKKy5naXQvb2JqZWN0cy9mMi80Yzc0YTJlNTAwZjVlZTEzMzJjODZiOTQxOTlmNTJiMWQxZDk2MgorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBjb3JyZXNwb25kIHdpdGggdGhlIG9iamVjdHMgd2l0aCBuYW1lcyBvZiBgNTU3ZGIuLi5gIGFuZAorYGYyNGM3Li4uYCByZXNwZWN0aXZlbHkuCisKK0lmIHlvdSB3YW50IHRvLCB5b3UgY2FuIHVzZSBgZ2l0LWNhdC1maWxlYCB0byBsb29rIGF0IHRob3NlIG9iamVjdHMsIGJ1dAoreW91J2xsIGhhdmUgdG8gdXNlIHRoZSBvYmplY3QgbmFtZSwgbm90IHRoZSBmaWxlbmFtZSBvZiB0aGUgb2JqZWN0OgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSAtdCA1NTdkYjAzZGU5OTdjODZhNGEwMjhlMWViZDNhMWNlYjIyNWJlMjM4CistLS0tLS0tLS0tLS0tLS0tCisKK3doZXJlIHRoZSBgLXRgIHRlbGxzIGBnaXQtY2F0LWZpbGVgIHRvIHRlbGwgeW91IHdoYXQgdGhlICJ0eXBlIiBvZiB0aGUKK29iamVjdCBpcy4gZ2l0IHdpbGwgdGVsbCB5b3UgdGhhdCB5b3UgaGF2ZSBhICJibG9iIiBvYmplY3QgKGkuZS4sIGp1c3QgYQorcmVndWxhciBmaWxlKSwgYW5kIHlvdSBjYW4gc2VlIHRoZSBjb250ZW50cyB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlICJibG9iIiA1NTdkYjAzCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgcHJpbnQgb3V0ICJIZWxsbyBXb3JsZCIuIFRoZSBvYmplY3QgYDU1N2RiMDNgIGlzIG5vdGhpbmcKK21vcmUgdGhhbiB0aGUgY29udGVudHMgb2YgeW91ciBmaWxlIGBoZWxsb2AuCisKK1tOT1RFXQorRG9uJ3QgY29uZnVzZSB0aGF0IG9iamVjdCB3aXRoIHRoZSBmaWxlIGBoZWxsb2AgaXRzZWxmLiBUaGUKK29iamVjdCBpcyBsaXRlcmFsbHkganVzdCB0aG9zZSBzcGVjaWZpYyAqY29udGVudHMqIG9mIHRoZSBmaWxlLCBhbmQKK2hvd2V2ZXIgbXVjaCB5b3UgbGF0ZXIgY2hhbmdlIHRoZSBjb250ZW50cyBpbiBmaWxlIGBoZWxsb2AsIHRoZSBvYmplY3QKK3dlIGp1c3QgbG9va2VkIGF0IHdpbGwgbmV2ZXIgY2hhbmdlLiBPYmplY3RzIGFyZSBpbW11dGFibGUuCisKK1tOT1RFXQorVGhlIHNlY29uZCBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGF0IHlvdSBjYW4KK2FiYnJldmlhdGUgdGhlIG9iamVjdCBuYW1lIHRvIG9ubHkgdGhlIGZpcnN0IHNldmVyYWwKK2hleGFkZWNpbWFsIGRpZ2l0cyBpbiBtb3N0IHBsYWNlcy4KKworQW55d2F5LCBhcyB3ZSBtZW50aW9uZWQgcHJldmlvdXNseSwgeW91IG5vcm1hbGx5IG5ldmVyIGFjdHVhbGx5IHRha2UgYQorbG9vayBhdCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLCBhbmQgdHlwaW5nIGxvbmcgNDAtY2hhcmFjdGVyIGhleAorbmFtZXMgaXMgbm90IHNvbWV0aGluZyB5b3UnZCBub3JtYWxseSB3YW50IHRvIGRvLiBUaGUgYWJvdmUgZGlncmVzc2lvbgord2FzIGp1c3QgdG8gc2hvdyB0aGF0IGBnaXQtdXBkYXRlLWluZGV4YCBkaWQgc29tZXRoaW5nIG1hZ2ljYWwsIGFuZAorYWN0dWFsbHkgc2F2ZWQgYXdheSB0aGUgY29udGVudHMgb2YgeW91ciBmaWxlcyBpbnRvIHRoZSBnaXQgb2JqZWN0CitkYXRhYmFzZS4KKworVXBkYXRpbmcgdGhlIGluZGV4IGRpZCBzb21ldGhpbmcgZWxzZSB0b286IGl0IGNyZWF0ZWQgYSBgLmdpdC9pbmRleGAKK2ZpbGUuIFRoaXMgaXMgdGhlIGluZGV4IHRoYXQgZGVzY3JpYmVzIHlvdXIgY3VycmVudCB3b3JraW5nIHRyZWUsIGFuZAorc29tZXRoaW5nIHlvdSBzaG91bGQgYmUgdmVyeSBhd2FyZSBvZi4gQWdhaW4sIHlvdSBub3JtYWxseSBuZXZlciB3b3JyeQorYWJvdXQgdGhlIGluZGV4IGZpbGUgaXRzZWxmLCBidXQgeW91IHNob3VsZCBiZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0Cit5b3UgaGF2ZSBub3QgYWN0dWFsbHkgcmVhbGx5ICJjaGVja2VkIGluIiB5b3VyIGZpbGVzIGludG8gZ2l0IHNvIGZhciwKK3lvdSd2ZSBvbmx5ICp0b2xkKiBnaXQgYWJvdXQgdGhlbS4KKworSG93ZXZlciwgc2luY2UgZ2l0IGtub3dzIGFib3V0IHRoZW0sIHlvdSBjYW4gbm93IHN0YXJ0IHVzaW5nIHNvbWUgb2YgdGhlCittb3N0IGJhc2ljIGdpdCBjb21tYW5kcyB0byBtYW5pcHVsYXRlIHRoZSBmaWxlcyBvciBsb29rIGF0IHRoZWlyIHN0YXR1cy4gCisKK0luIHBhcnRpY3VsYXIsIGxldCdzIG5vdCBldmVuIGNoZWNrIGluIHRoZSB0d28gZmlsZXMgaW50byBnaXQgeWV0LCB3ZSdsbAorc3RhcnQgb2ZmIGJ5IGFkZGluZyBhbm90aGVyIGxpbmUgdG8gYGhlbGxvYCBmaXJzdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGVjaG8gIkl0J3MgYSBuZXcgZGF5IGZvciBnaXQiID4+aGVsbG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgeW91IGNhbiBub3csIHNpbmNlIHlvdSB0b2xkIGdpdCBhYm91dCB0aGUgcHJldmlvdXMgc3RhdGUgb2YgYGhlbGxvYCwgYXNrCitnaXQgd2hhdCBoYXMgY2hhbmdlZCBpbiB0aGUgdHJlZSBjb21wYXJlZCB0byB5b3VyIG9sZCBpbmRleCwgdXNpbmcgdGhlCitgZ2l0LWRpZmYtZmlsZXNgIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtZGlmZi1maWxlcworLS0tLS0tLS0tLS0tCisKK09vcHMuIFRoYXQgd2Fzbid0IHZlcnkgcmVhZGFibGUuIEl0IGp1c3Qgc3BpdCBvdXQgaXRzIG93biBpbnRlcm5hbAordmVyc2lvbiBvZiBhIGBkaWZmYCwgYnV0IHRoYXQgaW50ZXJuYWwgdmVyc2lvbiByZWFsbHkganVzdCB0ZWxscyB5b3UKK3RoYXQgaXQgaGFzIG5vdGljZWQgdGhhdCAiaGVsbG8iIGhhcyBiZWVuIG1vZGlmaWVkLCBhbmQgdGhhdCB0aGUgb2xkIG9iamVjdAorY29udGVudHMgaXQgaGFkIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBlbHNlLgorCitUbyBtYWtlIGl0IHJlYWRhYmxlLCB3ZSBjYW4gdGVsbCBnaXQtZGlmZi1maWxlcyB0byBvdXRwdXQgdGhlCitkaWZmZXJlbmNlcyBhcyBhIHBhdGNoLCB1c2luZyB0aGUgYC1wYCBmbGFnOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYtZmlsZXMgLXAKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCitpbmRleCA1NTdkYjAzLi4yNjM0MTRmIDEwMDY0NAorLS0tIGEvaGVsbG8KKysrKyBiL2hlbGxvCitAQCAtMSArMSwyIEBACisgSGVsbG8gV29ybGQKKytJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CistLS0tCisKK2kuZS4gdGhlIGRpZmYgb2YgdGhlIGNoYW5nZSB3ZSBjYXVzZWQgYnkgYWRkaW5nIGFub3RoZXIgbGluZSB0byBgaGVsbG9gLgorCitJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmLWZpbGVzYCBhbHdheXMgc2hvd3MgdXMgdGhlIGRpZmZlcmVuY2UgYmV0d2Vlbgord2hhdCBpcyByZWNvcmRlZCBpbiB0aGUgaW5kZXgsIGFuZCB3aGF0IGlzIGN1cnJlbnRseSBpbiB0aGUgd29ya2luZwordHJlZS4gVGhhdCdzIHZlcnkgdXNlZnVsLgorCitBIGNvbW1vbiBzaG9ydGhhbmQgZm9yIGBnaXQtZGlmZi1maWxlcyAtcGAgaXMgdG8ganVzdCB3cml0ZSBgZ2l0CitkaWZmYCwgd2hpY2ggd2lsbCBkbyB0aGUgc2FtZSB0aGluZy4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmCitkaWZmIC0tZ2l0IGEvaGVsbG8gYi9oZWxsbworaW5kZXggNTU3ZGIwMy4uMjYzNDE0ZiAxMDA2NDQKKy0tLSBhL2hlbGxvCisrKysgYi9oZWxsbworQEAgLTEgKzEsMiBAQAorIEhlbGxvIFdvcmxkCisrSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorLS0tLS0tLS0tLS0tCisKKworQ29tbWl0dGluZyBnaXQgc3RhdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdywgd2Ugd2FudCB0byBnbyB0byB0aGUgbmV4dCBzdGFnZSBpbiBnaXQsIHdoaWNoIGlzIHRvIHRha2UgdGhlIGZpbGVzCit0aGF0IGdpdCBrbm93cyBhYm91dCBpbiB0aGUgaW5kZXgsIGFuZCBjb21taXQgdGhlbSBhcyBhIHJlYWwgdHJlZS4gV2UgZG8KK3RoYXQgaW4gdHdvIHBoYXNlczogY3JlYXRpbmcgYSAndHJlZScgb2JqZWN0LCBhbmQgY29tbWl0dGluZyB0aGF0ICd0cmVlJworb2JqZWN0IGFzIGEgJ2NvbW1pdCcgb2JqZWN0IHRvZ2V0aGVyIHdpdGggYW4gZXhwbGFuYXRpb24gb2Ygd2hhdCB0aGUKK3RyZWUgd2FzIGFsbCBhYm91dCwgYWxvbmcgd2l0aCBpbmZvcm1hdGlvbiBvZiBob3cgd2UgY2FtZSB0byB0aGF0IHN0YXRlLgorCitDcmVhdGluZyBhIHRyZWUgb2JqZWN0IGlzIHRyaXZpYWwsIGFuZCBpcyBkb25lIHdpdGggYGdpdC13cml0ZS10cmVlYC4KK1RoZXJlIGFyZSBubyBvcHRpb25zIG9yIG90aGVyIGlucHV0OiBnaXQtd3JpdGUtdHJlZSB3aWxsIHRha2UgdGhlCitjdXJyZW50IGluZGV4IHN0YXRlLCBhbmQgd3JpdGUgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoYXQgd2hvbGUKK2luZGV4LiBJbiBvdGhlciB3b3Jkcywgd2UncmUgbm93IHR5aW5nIHRvZ2V0aGVyIGFsbCB0aGUgZGlmZmVyZW50CitmaWxlbmFtZXMgd2l0aCB0aGVpciBjb250ZW50cyAoYW5kIHRoZWlyIHBlcm1pc3Npb25zKSwgYW5kIHdlJ3JlCitjcmVhdGluZyB0aGUgZXF1aXZhbGVudCBvZiBhIGdpdCAiZGlyZWN0b3J5IiBvYmplY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtd3JpdGUtdHJlZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGlzIHdpbGwganVzdCBvdXRwdXQgdGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyB0cmVlLCBpbiB0aGlzIGNhc2UKKyhpZiB5b3UgaGF2ZSBkb25lIGV4YWN0bHkgYXMgSSd2ZSBkZXNjcmliZWQpIGl0IHNob3VsZCBiZQorCistLS0tLS0tLS0tLS0tLS0tCis4OTg4ZGExNWQwNzdkNDgyOWZjNTFkODU0NGMwOTdkZWY2NjQ0ZGJiCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGlzIGFub3RoZXIgaW5jb21wcmVoZW5zaWJsZSBvYmplY3QgbmFtZS4gQWdhaW4sIGlmIHlvdSB3YW50IHRvLAoreW91IGNhbiB1c2UgYGdpdC1jYXQtZmlsZSAtdCA4OTg4ZFwuLi5gIHRvIHNlZSB0aGF0IHRoaXMgdGltZSB0aGUgb2JqZWN0CitpcyBub3QgYSAiYmxvYiIgb2JqZWN0LCBidXQgYSAidHJlZSIgb2JqZWN0ICh5b3UgY2FuIGFsc28gdXNlCitgZ2l0LWNhdC1maWxlYCB0byBhY3R1YWxseSBvdXRwdXQgdGhlIHJhdyBvYmplY3QgY29udGVudHMsIGJ1dCB5b3UnbGwgc2VlCittYWlubHkgYSBiaW5hcnkgbWVzcywgc28gdGhhdCdzIGxlc3MgaW50ZXJlc3RpbmcpLgorCitIb3dldmVyIC0tIG5vcm1hbGx5IHlvdSdkIG5ldmVyIHVzZSBgZ2l0LXdyaXRlLXRyZWVgIG9uIGl0cyBvd24sIGJlY2F1c2UKK25vcm1hbGx5IHlvdSBhbHdheXMgY29tbWl0IGEgdHJlZSBpbnRvIGEgY29tbWl0IG9iamVjdCB1c2luZyB0aGUKK2BnaXQtY29tbWl0LXRyZWVgIGNvbW1hbmQuIEluIGZhY3QsIGl0J3MgZWFzaWVyIHRvIG5vdCBhY3R1YWxseSB1c2UKK2BnaXQtd3JpdGUtdHJlZWAgb24gaXRzIG93biBhdCBhbGwsIGJ1dCB0byBqdXN0IHBhc3MgaXRzIHJlc3VsdCBpbiBhcyBhbgorYXJndW1lbnQgdG8gYGdpdC1jb21taXQtdHJlZWAuCisKK2BnaXQtY29tbWl0LXRyZWVgIG5vcm1hbGx5IHRha2VzIHNldmVyYWwgYXJndW1lbnRzIC0tIGl0IHdhbnRzIHRvIGtub3cKK3doYXQgdGhlICdwYXJlbnQnIG9mIGEgY29tbWl0IHdhcywgYnV0IHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGNvbW1pdAorZXZlciBpbiB0aGlzIG5ldyByZXBvc2l0b3J5LCBhbmQgaXQgaGFzIG5vIHBhcmVudHMsIHdlIG9ubHkgbmVlZCB0byBwYXNzIGluCit0aGUgb2JqZWN0IG5hbWUgb2YgdGhlIHRyZWUuIEhvd2V2ZXIsIGBnaXQtY29tbWl0LXRyZWVgCithbHNvIHdhbnRzIHRvIGdldCBhIGNvbW1pdCBtZXNzYWdlCitvbiBpdHMgc3RhbmRhcmQgaW5wdXQsIGFuZCBpdCB3aWxsIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nIG9iamVjdCBuYW1lIGZvciB0aGUKK2NvbW1pdCB0byBpdHMgc3RhbmRhcmQgb3V0cHV0LgorCitBbmQgdGhpcyBpcyB3aGVyZSB3ZSBjcmVhdGUgdGhlIGAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyYCBmaWxlCit3aGljaCBpcyBwb2ludGVkIGF0IGJ5IGBIRUFEYC4gVGhpcyBmaWxlIGlzIHN1cHBvc2VkIHRvIGNvbnRhaW4KK3RoZSByZWZlcmVuY2UgdG8gdGhlIHRvcC1vZi10cmVlIG9mIHRoZSBtYXN0ZXIgYnJhbmNoLCBhbmQgc2luY2UKK3RoYXQncyBleGFjdGx5IHdoYXQgYGdpdC1jb21taXQtdHJlZWAgc3BpdHMgb3V0LCB3ZSBjYW4gZG8gdGhpcworYWxsIHdpdGggYSBzZXF1ZW5jZSBvZiBzaW1wbGUgc2hlbGwgY29tbWFuZHM6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpCiskIGNvbW1pdD0kKGVjaG8gJ0luaXRpYWwgY29tbWl0JyB8IGdpdC1jb21taXQtdHJlZSAkdHJlZSkKKyQgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkY29tbWl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBzYXk6CisKKy0tLS0tLS0tLS0tLS0tLS0KK0NvbW1pdHRpbmcgaW5pdGlhbCB0cmVlIDg5ODhkYTE1ZDA3N2Q0ODI5ZmM1MWQ4NTQ0YzA5N2RlZjY2NDRkYmIKKy0tLS0tLS0tLS0tLS0tLS0KKworanVzdCB0byB3YXJuIHlvdSBhYm91dCB0aGUgZmFjdCB0aGF0IGl0IGNyZWF0ZWQgYSB0b3RhbGx5IG5ldyBjb21taXQKK3RoYXQgaXMgbm90IHJlbGF0ZWQgdG8gYW55dGhpbmcgZWxzZS4gTm9ybWFsbHkgeW91IGRvIHRoaXMgb25seSAqb25jZSoKK2ZvciBhIHByb2plY3QgZXZlciwgYW5kIGFsbCBsYXRlciBjb21taXRzIHdpbGwgYmUgcGFyZW50ZWQgb24gdG9wIG9mIGFuCitlYXJsaWVyIGNvbW1pdCwgYW5kIHlvdSdsbCBuZXZlciBzZWUgdGhpcyAiQ29tbWl0dGluZyBpbml0aWFsIHRyZWUiCittZXNzYWdlIGV2ZXIgYWdhaW4uCisKK0FnYWluLCBub3JtYWxseSB5b3UnZCBuZXZlciBhY3R1YWxseSBkbyB0aGlzIGJ5IGhhbmQuIFRoZXJlIGlzIGEKK2hlbHBmdWwgc2NyaXB0IGNhbGxlZCBgZ2l0IGNvbW1pdGAgdGhhdCB3aWxsIGRvIGFsbCBvZiB0aGlzIGZvciB5b3UuIFNvCit5b3UgY291bGQgaGF2ZSBqdXN0IHdyaXR0ZW4gYGdpdCBjb21taXRgCitpbnN0ZWFkLCBhbmQgaXQgd291bGQgaGF2ZSBkb25lIHRoZSBhYm92ZSBtYWdpYyBzY3JpcHRpbmcgZm9yIHlvdS4KKworCitNYWtpbmcgYSBjaGFuZ2UKKy0tLS0tLS0tLS0tLS0tLQorCitSZW1lbWJlciBob3cgd2UgZGlkIHRoZSBgZ2l0LXVwZGF0ZS1pbmRleGAgb24gZmlsZSBgaGVsbG9gIGFuZCB0aGVuIHdlCitjaGFuZ2VkIGBoZWxsb2AgYWZ0ZXJ3YXJkLCBhbmQgY291bGQgY29tcGFyZSB0aGUgbmV3IHN0YXRlIG9mIGBoZWxsb2Agd2l0aCB0aGUKK3N0YXRlIHdlIHNhdmVkIGluIHRoZSBpbmRleCBmaWxlPyAKKworRnVydGhlciwgcmVtZW1iZXIgaG93IEkgc2FpZCB0aGF0IGBnaXQtd3JpdGUtdHJlZWAgd3JpdGVzIHRoZSBjb250ZW50cworb2YgdGhlICppbmRleCogZmlsZSB0byB0aGUgdHJlZSwgYW5kIHRodXMgd2hhdCB3ZSBqdXN0IGNvbW1pdHRlZCB3YXMgaW4KK2ZhY3QgdGhlICpvcmlnaW5hbCogY29udGVudHMgb2YgdGhlIGZpbGUgYGhlbGxvYCwgbm90IHRoZSBuZXcgb25lcy4gV2UgZGlkCit0aGF0IG9uIHB1cnBvc2UsIHRvIHNob3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5kZXggc3RhdGUsIGFuZCB0aGUKK3N0YXRlIGluIHRoZSB3b3JraW5nIHRyZWUsIGFuZCBob3cgdGhleSBkb24ndCBoYXZlIHRvIG1hdGNoLCBldmVuCit3aGVuIHdlIGNvbW1pdCB0aGluZ3MuCisKK0FzIGJlZm9yZSwgaWYgd2UgZG8gYGdpdC1kaWZmLWZpbGVzIC1wYCBpbiBvdXIgZ2l0LXR1dG9yaWFsIHByb2plY3QsCit3ZSdsbCBzdGlsbCBzZWUgdGhlIHNhbWUgZGlmZmVyZW5jZSB3ZSBzYXcgbGFzdCB0aW1lOiB0aGUgaW5kZXggZmlsZQoraGFzbid0IGNoYW5nZWQgYnkgdGhlIGFjdCBvZiBjb21taXR0aW5nIGFueXRoaW5nLiBIb3dldmVyLCBub3cgdGhhdCB3ZQoraGF2ZSBjb21taXR0ZWQgc29tZXRoaW5nLCB3ZSBjYW4gYWxzbyBsZWFybiB0byB1c2UgYSBuZXcgY29tbWFuZDoKK2BnaXQtZGlmZi1pbmRleGAuCisKK1VubGlrZSBgZ2l0LWRpZmYtZmlsZXNgLCB3aGljaCBzaG93ZWQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaW5kZXgKK2ZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUsIGBnaXQtZGlmZi1pbmRleGAgc2hvd3MgdGhlIGRpZmZlcmVuY2VzCitiZXR3ZWVuIGEgY29tbWl0dGVkICp0cmVlKiBhbmQgZWl0aGVyIHRoZSBpbmRleCBmaWxlIG9yIHRoZSB3b3JraW5nCit0cmVlLiBJbiBvdGhlciB3b3JkcywgYGdpdC1kaWZmLWluZGV4YCB3YW50cyBhIHRyZWUgdG8gYmUgZGlmZmVkCithZ2FpbnN0LCBhbmQgYmVmb3JlIHdlIGRpZCB0aGUgY29tbWl0LCB3ZSBjb3VsZG4ndCBkbyB0aGF0LCBiZWNhdXNlIHdlCitkaWRuJ3QgaGF2ZSBhbnl0aGluZyB0byBkaWZmIGFnYWluc3QuIAorCitCdXQgbm93IHdlIGNhbiBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmLWluZGV4IC1wIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKworKHdoZXJlIGAtcGAgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaXQgZGlkIGluIGBnaXQtZGlmZi1maWxlc2ApLCBhbmQgaXQKK3dpbGwgc2hvdyB1cyB0aGUgc2FtZSBkaWZmZXJlbmNlLCBidXQgZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLiAKK05vdyB3ZSdyZSBjb21wYXJpbmcgdGhlIHdvcmtpbmcgdHJlZSBub3QgYWdhaW5zdCB0aGUgaW5kZXggZmlsZSwKK2J1dCBhZ2FpbnN0IHRoZSB0cmVlIHdlIGp1c3Qgd3JvdGUuIEl0IGp1c3Qgc28gaGFwcGVucyB0aGF0IHRob3NlIHR3bworYXJlIG9idmlvdXNseSB0aGUgc2FtZSwgc28gd2UgZ2V0IHRoZSBzYW1lIHJlc3VsdC4KKworQWdhaW4sIGJlY2F1c2UgdGhpcyBpcyBhIGNvbW1vbiBvcGVyYXRpb24sIHlvdSBjYW4gYWxzbyBqdXN0IHNob3J0aGFuZAoraXQgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggZW5kcyB1cCBkb2luZyB0aGUgYWJvdmUgZm9yIHlvdS4KKworSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZi1pbmRleGAgbm9ybWFsbHkgY29tcGFyZXMgYSB0cmVlIGFnYWluc3QgdGhlCit3b3JraW5nIHRyZWUsIGJ1dCB3aGVuIGdpdmVuIHRoZSBgXC0tY2FjaGVkYCBmbGFnLCBpdCBpcyB0b2xkIHRvCitpbnN0ZWFkIGNvbXBhcmUgYWdhaW5zdCBqdXN0IHRoZSBpbmRleCBjYWNoZSBjb250ZW50cywgYW5kIGlnbm9yZSB0aGUKK2N1cnJlbnQgd29ya2luZyB0cmVlIHN0YXRlIGVudGlyZWx5LiBTaW5jZSB3ZSBqdXN0IHdyb3RlIHRoZSBpbmRleAorZmlsZSB0byBIRUFELCBkb2luZyBgZ2l0LWRpZmYtaW5kZXggXC0tY2FjaGVkIC1wIEhFQURgIHNob3VsZCB0aHVzIHJldHVybgorYW4gZW1wdHkgc2V0IG9mIGRpZmZlcmVuY2VzLCBhbmQgdGhhdCdzIGV4YWN0bHkgd2hhdCBpdCBkb2VzLiAKKworW05PVEVdCis9PT09PT09PT09PT09PT09CitgZ2l0LWRpZmYtaW5kZXhgIHJlYWxseSBhbHdheXMgdXNlcyB0aGUgaW5kZXggZm9yIGl0cworY29tcGFyaXNvbnMsIGFuZCBzYXlpbmcgdGhhdCBpdCBjb21wYXJlcyBhIHRyZWUgYWdhaW5zdCB0aGUgd29ya2luZwordHJlZSBpcyB0aHVzIG5vdCBzdHJpY3RseSBhY2N1cmF0ZS4gSW4gcGFydGljdWxhciwgdGhlIGxpc3Qgb2YKK2ZpbGVzIHRvIGNvbXBhcmUgKHRoZSAibWV0YS1kYXRhIikgKmFsd2F5cyogY29tZXMgZnJvbSB0aGUgaW5kZXggZmlsZSwKK3JlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYFwtLWNhY2hlZGAgZmxhZyBpcyB1c2VkIG9yIG5vdC4gVGhlIGBcLS1jYWNoZWRgCitmbGFnIHJlYWxseSBvbmx5IGRldGVybWluZXMgd2hldGhlciB0aGUgZmlsZSAqY29udGVudHMqIHRvIGJlIGNvbXBhcmVkCitjb21lIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBvciBub3QuCisKK1RoaXMgaXMgbm90IGhhcmQgdG8gdW5kZXJzdGFuZCwgYXMgc29vbiBhcyB5b3UgcmVhbGl6ZSB0aGF0IGdpdCBzaW1wbHkKK25ldmVyIGtub3dzIChvciBjYXJlcykgYWJvdXQgZmlsZXMgdGhhdCBpdCBpcyBub3QgdG9sZCBhYm91dAorZXhwbGljaXRseS4gZ2l0IHdpbGwgbmV2ZXIgZ28gKmxvb2tpbmcqIGZvciBmaWxlcyB0byBjb21wYXJlLCBpdAorZXhwZWN0cyB5b3UgdG8gdGVsbCBpdCB3aGF0IHRoZSBmaWxlcyBhcmUsIGFuZCB0aGF0J3Mgd2hhdCB0aGUgaW5kZXgKK2lzIHRoZXJlIGZvci4KKz09PT09PT09PT09PT09PT0KKworSG93ZXZlciwgb3VyIG5leHQgc3RlcCBpcyB0byBjb21taXQgdGhlICpjaGFuZ2UqIHdlIGRpZCwgYW5kIGFnYWluLCB0bwordW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24sIGtlZXAgaW4gbWluZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJ3b3JraW5nCit0cmVlIGNvbnRlbnRzIiwgImluZGV4IGZpbGUiIGFuZCAiY29tbWl0dGVkIHRyZWUiLiBXZSBoYXZlIGNoYW5nZXMKK2luIHRoZSB3b3JraW5nIHRyZWUgdGhhdCB3ZSB3YW50IHRvIGNvbW1pdCwgYW5kIHdlIGFsd2F5cyBoYXZlIHRvCit3b3JrIHRocm91Z2ggdGhlIGluZGV4IGZpbGUsIHNvIHRoZSBmaXJzdCB0aGluZyB3ZSBuZWVkIHRvIGRvIGlzIHRvCit1cGRhdGUgdGhlIGluZGV4IGNhY2hlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXVwZGF0ZS1pbmRleCBoZWxsbworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhub3RlIGhvdyB3ZSBkaWRuJ3QgbmVlZCB0aGUgYFwtLWFkZGAgZmxhZyB0aGlzIHRpbWUsIHNpbmNlIGdpdCBrbmV3CithYm91dCB0aGUgZmlsZSBhbHJlYWR5KS4KKworTm90ZSB3aGF0IGhhcHBlbnMgdG8gdGhlIGRpZmZlcmVudCBgZ2l0LWRpZmYtXCpgIHZlcnNpb25zIGhlcmUuIEFmdGVyCit3ZSd2ZSB1cGRhdGVkIGBoZWxsb2AgaW4gdGhlIGluZGV4LCBgZ2l0LWRpZmYtZmlsZXMgLXBgIG5vdyBzaG93cyBubworZGlmZmVyZW5jZXMsIGJ1dCBgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRGAgc3RpbGwgKmRvZXMqIHNob3cgdGhhdCB0aGUKK2N1cnJlbnQgc3RhdGUgaXMgZGlmZmVyZW50IGZyb20gdGhlIHN0YXRlIHdlIGNvbW1pdHRlZC4gSW4gZmFjdCwgbm93CitgZ2l0LWRpZmYtaW5kZXhgIHNob3dzIHRoZSBzYW1lIGRpZmZlcmVuY2Ugd2hldGhlciB3ZSB1c2UgdGhlIGAtLWNhY2hlZGAKK2ZsYWcgb3Igbm90LCBzaW5jZSBub3cgdGhlIGluZGV4IGlzIGNvaGVyZW50IHdpdGggdGhlIHdvcmtpbmcgdHJlZS4KKworTm93LCBzaW5jZSB3ZSd2ZSB1cGRhdGVkIGBoZWxsb2AgaW4gdGhlIGluZGV4LCB3ZSBjYW4gY29tbWl0IHRoZSBuZXcKK3ZlcnNpb24uIFdlIGNvdWxkIGRvIGl0IGJ5IHdyaXRpbmcgdGhlIHRyZWUgYnkgaGFuZCBhZ2FpbiwgYW5kCitjb21taXR0aW5nIHRoZSB0cmVlICh0aGlzIHRpbWUgd2UnZCBoYXZlIHRvIHVzZSB0aGUgYC1wIEhFQURgIGZsYWcgdG8KK3RlbGwgY29tbWl0IHRoYXQgdGhlIEhFQUQgd2FzIHRoZSAqcGFyZW50KiBvZiB0aGUgbmV3IGNvbW1pdCwgYW5kIHRoYXQKK3RoaXMgd2Fzbid0IGFuIGluaXRpYWwgY29tbWl0IGFueSBtb3JlKSwgYnV0IHlvdSd2ZSBkb25lIHRoYXQgb25jZQorYWxyZWFkeSwgc28gbGV0J3MganVzdCB1c2UgdGhlIGhlbHBmdWwgc2NyaXB0IHRoaXMgdGltZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBzdGFydHMgYW4gZWRpdG9yIGZvciB5b3UgdG8gd3JpdGUgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCB0ZWxscyB5b3UKK2EgYml0IGFib3V0IHdoYXQgeW91IGhhdmUgZG9uZS4KKworV3JpdGUgd2hhdGV2ZXIgbWVzc2FnZSB5b3Ugd2FudCwgYW5kIGFsbCB0aGUgbGluZXMgdGhhdCBzdGFydCB3aXRoICcjJword2lsbCBiZSBwcnVuZWQgb3V0LCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZSBmb3IKK3RoZSBjaGFuZ2UuIElmIHlvdSBkZWNpZGUgeW91IGRvbid0IHdhbnQgdG8gY29tbWl0IGFueXRoaW5nIGFmdGVyIGFsbCBhdAordGhpcyBwb2ludCAoeW91IGNhbiBjb250aW51ZSB0byBlZGl0IHRoaW5ncyBhbmQgdXBkYXRlIHRoZSBpbmRleCksIHlvdQorY2FuIGp1c3QgbGVhdmUgYW4gZW1wdHkgbWVzc2FnZS4gT3RoZXJ3aXNlIGBnaXQgY29tbWl0YCB3aWxsIGNvbW1pdAordGhlIGNoYW5nZSBmb3IgeW91LgorCitZb3UndmUgbm93IG1hZGUgeW91ciBmaXJzdCByZWFsIGdpdCBjb21taXQuIEFuZCBpZiB5b3UncmUgaW50ZXJlc3RlZCBpbgorbG9va2luZyBhdCB3aGF0IGBnaXQgY29tbWl0YCByZWFsbHkgZG9lcywgZmVlbCBmcmVlIHRvIGludmVzdGlnYXRlOgoraXQncyBhIGZldyB2ZXJ5IHNpbXBsZSBzaGVsbCBzY3JpcHRzIHRvIGdlbmVyYXRlIHRoZSBoZWxwZnVsICg/KSBjb21taXQKK21lc3NhZ2UgaGVhZGVycywgYW5kIGEgZmV3IG9uZS1saW5lcnMgdGhhdCBhY3R1YWxseSBkbyB0aGUKK2NvbW1pdCBpdHNlbGYgKGBnaXQtY29tbWl0YCkuCisKKworSW5zcGVjdGluZyBDaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0KKworV2hpbGUgY3JlYXRpbmcgY2hhbmdlcyBpcyB1c2VmdWwsIGl0J3MgZXZlbiBtb3JlIHVzZWZ1bCBpZiB5b3UgY2FuIHRlbGwKK2xhdGVyIHdoYXQgY2hhbmdlZC4gVGhlIG1vc3QgdXNlZnVsIGNvbW1hbmQgZm9yIHRoaXMgaXMgYW5vdGhlciBvZiB0aGUKK2BkaWZmYCBmYW1pbHksIG5hbWVseSBgZ2l0LWRpZmYtdHJlZWAuCisKK2BnaXQtZGlmZi10cmVlYCBjYW4gYmUgZ2l2ZW4gdHdvIGFyYml0cmFyeSB0cmVlcywgYW5kIGl0IHdpbGwgdGVsbCB5b3UgdGhlCitkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0uIFBlcmhhcHMgZXZlbiBtb3JlIGNvbW1vbmx5LCB0aG91Z2gsIHlvdSBjYW4KK2dpdmUgaXQganVzdCBhIHNpbmdsZSBjb21taXQgb2JqZWN0LCBhbmQgaXQgd2lsbCBmaWd1cmUgb3V0IHRoZSBwYXJlbnQKK29mIHRoYXQgY29tbWl0IGl0c2VsZiwgYW5kIHNob3cgdGhlIGRpZmZlcmVuY2UgZGlyZWN0bHkuIFRodXMsIHRvIGdldAordGhlIHNhbWUgZGlmZiB0aGF0IHdlJ3ZlIGFscmVhZHkgc2VlbiBzZXZlcmFsIHRpbWVzLCB3ZSBjYW4gbm93IGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWRpZmYtdHJlZSAtcCBIRUFECistLS0tLS0tLS0tLS0tLS0tCisKKyhhZ2FpbiwgYC1wYCBtZWFucyB0byBzaG93IHRoZSBkaWZmZXJlbmNlIGFzIGEgaHVtYW4tcmVhZGFibGUgcGF0Y2gpLAorYW5kIGl0IHdpbGwgc2hvdyB3aGF0IHRoZSBsYXN0IGNvbW1pdCAoaW4gYEhFQURgKSBhY3R1YWxseSBjaGFuZ2VkLgorCitbTk9URV0KKz09PT09PT09PT09PQorSGVyZSBpcyBhbiBBU0NJSSBhcnQgYnkgSm9uIExvZWxpZ2VyIHRoYXQgaWxsdXN0cmF0ZXMgaG93Cit2YXJpb3VzIGRpZmYtXCogY29tbWFuZHMgY29tcGFyZSB0aGluZ3MuCisKKyAgICAgICAgICAgICAgICAgICAgICBkaWZmLXRyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgViAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCBPYmplY3QgREIgfAorICAgICAgICAgICAgICAgICAgICB8ICBCYWNraW5nICB8CisgICAgICAgICAgICAgICAgICAgIHwgICBTdG9yZSAgIHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgIF4gICAgXgorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfCAgZGlmZi1pbmRleCAtLWNhY2hlZAorICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgIGRpZmYtaW5kZXggIHwgICAgVgorICAgICAgICAgICAgICAgICAgICAgIHwgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICB8ICB8ICAgSW5kZXggICB8CisgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgImNhY2hlIiAgfAorICAgICAgICAgICAgICAgICAgICAgIHwgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIF4KKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwgIGRpZmYtZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICBWICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8ICBXb3JraW5nICB8CisgICAgICAgICAgICAgICAgICAgIHwgRGlyZWN0b3J5IHwKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworPT09PT09PT09PT09CisKK01vcmUgaW50ZXJlc3RpbmdseSwgeW91IGNhbiBhbHNvIGdpdmUgYGdpdC1kaWZmLXRyZWVgIHRoZSBgLS1wcmV0dHlgIGZsYWcsCit3aGljaCB0ZWxscyBpdCB0byBhbHNvIHNob3cgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCBhdXRob3IgYW5kIGRhdGUgb2YgdGhlCitjb21taXQsIGFuZCB5b3UgY2FuIHRlbGwgaXQgdG8gc2hvdyBhIHdob2xlIHNlcmllcyBvZiBkaWZmcy4KK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdGVsbCBpdCB0byBiZSAic2lsZW50IiwgYW5kIG5vdCBzaG93IHRoZSBkaWZmcyBhdAorYWxsLCBidXQganVzdCBzaG93IHRoZSBhY3R1YWwgY29tbWl0IG1lc3NhZ2UuCisKK0luIGZhY3QsIHRvZ2V0aGVyIHdpdGggdGhlIGBnaXQtcmV2LWxpc3RgIHByb2dyYW0gKHdoaWNoIGdlbmVyYXRlcyBhCitsaXN0IG9mIHJldmlzaW9ucyksIGBnaXQtZGlmZi10cmVlYCBlbmRzIHVwIGJlaW5nIGEgdmVyaXRhYmxlIGZvdW50IG9mCitjaGFuZ2VzLiBBIHRyaXZpYWwgKGJ1dCB2ZXJ5IHVzZWZ1bCkgc2NyaXB0IGNhbGxlZCBgZ2l0LXdoYXRjaGFuZ2VkYCBpcworaW5jbHVkZWQgd2l0aCBnaXQgd2hpY2ggZG9lcyBleGFjdGx5IHRoaXMsIGFuZCBzaG93cyBhIGxvZyBvZiByZWNlbnQKK2FjdGl2aXRpZXMuCisKK1RvIHNlZSB0aGUgd2hvbGUgaGlzdG9yeSBvZiBvdXIgcGl0aWZ1bCBsaXR0bGUgZ2l0LXR1dG9yaWFsIHByb2plY3QsIHlvdQorY2FuIGRvCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCBzaG93cyBqdXN0IHRoZSBsb2cgbWVzc2FnZXMsIG9yIGlmIHdlIHdhbnQgdG8gc2VlIHRoZSBsb2cgdG9nZXRoZXIKK3dpdGggdGhlIGFzc29jaWF0ZWQgcGF0Y2hlcyB1c2UgdGhlIG1vcmUgY29tcGxleCAoYW5kIG11Y2ggbW9yZQorcG93ZXJmdWwpCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXdoYXRjaGFuZ2VkIC1wIC0tcm9vdAorLS0tLS0tLS0tLS0tLS0tLQorCithbmQgeW91IHdpbGwgc2VlIGV4YWN0bHkgd2hhdCBoYXMgY2hhbmdlZCBpbiB0aGUgcmVwb3NpdG9yeSBvdmVyIGl0cworc2hvcnQgaGlzdG9yeS4gCisKK1tOT1RFXQorVGhlIGBcLS1yb290YCBmbGFnIGlzIGEgZmxhZyB0byBgZ2l0LWRpZmYtdHJlZWAgdG8gdGVsbCBpdCB0bworc2hvdyB0aGUgaW5pdGlhbCBha2EgJ3Jvb3QnIGNvbW1pdCB0b28uIE5vcm1hbGx5IHlvdSdkIHByb2JhYmx5IG5vdAord2FudCB0byBzZWUgdGhlIGluaXRpYWwgaW1wb3J0IGRpZmYsIGJ1dCBzaW5jZSB0aGUgdHV0b3JpYWwgcHJvamVjdAord2FzIHN0YXJ0ZWQgZnJvbSBzY3JhdGNoIGFuZCBpcyBzbyBzbWFsbCwgd2UgdXNlIGl0IHRvIG1ha2UgdGhlIHJlc3VsdAorYSBiaXQgbW9yZSBpbnRlcmVzdGluZy4KKworV2l0aCB0aGF0LCB5b3Ugc2hvdWxkIG5vdyBiZSBoYXZpbmcgc29tZSBpbmtsaW5nIG9mIHdoYXQgZ2l0IGRvZXMsIGFuZAorY2FuIGV4cGxvcmUgb24geW91ciBvd24uCisKK1tOT1RFXQorTW9zdCBsaWtlbHksIHlvdSBhcmUgbm90IGRpcmVjdGx5IHVzaW5nIHRoZSBjb3JlCitnaXQgUGx1bWJpbmcgY29tbWFuZHMsIGJ1dCB1c2luZyBQb3JjZWxhaW4gbGlrZSBDb2dpdG8gb24gdG9wCitvZiBpdC4gQ29naXRvIHdvcmtzIGEgYml0IGRpZmZlcmVudGx5IGFuZCB5b3UgdXN1YWxseSBkbyBub3QKK2hhdmUgdG8gcnVuIGBnaXQtdXBkYXRlLWluZGV4YCB5b3Vyc2VsZiBmb3IgY2hhbmdlZCBmaWxlcyAoeW91CitkbyB0ZWxsIHVuZGVybHlpbmcgZ2l0IGFib3V0IGFkZGl0aW9ucyBhbmQgcmVtb3ZhbHMgdmlhCitgY2ctYWRkYCBhbmQgYGNnLXJtYCBjb21tYW5kcykuIEp1c3QgYmVmb3JlIHlvdSBtYWtlIGEgY29tbWl0Cit3aXRoIGBjZy1jb21taXRgLCBDb2dpdG8gZmlndXJlcyBvdXQgd2hpY2ggZmlsZXMgeW91IG1vZGlmaWVkLAorYW5kIHJ1bnMgYGdpdC11cGRhdGUtaW5kZXhgIG9uIHRoZW0gZm9yIHlvdS4KKworCitUYWdnaW5nIGEgdmVyc2lvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gZ2l0LCB0aGVyZSBhcmUgdHdvIGtpbmRzIG9mIHRhZ3MsIGEgImxpZ2h0IiBvbmUsIGFuZCBhbiAiYW5ub3RhdGVkIHRhZyIuCisKK0EgImxpZ2h0IiB0YWcgaXMgdGVjaG5pY2FsbHkgbm90aGluZyBtb3JlIHRoYW4gYSBicmFuY2gsIGV4Y2VwdCB3ZSBwdXQKK2l0IGluIHRoZSBgLmdpdC9yZWZzL3RhZ3MvYCBzdWJkaXJlY3RvcnkgaW5zdGVhZCBvZiBjYWxsaW5nIGl0IGEgYGhlYWRgLgorU28gdGhlIHNpbXBsZXN0IGZvcm0gb2YgdGFnIGludm9sdmVzIG5vdGhpbmcgbW9yZSB0aGFuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIG15LWZpcnN0LXRhZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGp1c3Qgd3JpdGVzIHRoZSBjdXJyZW50IGBIRUFEYCBpbnRvIHRoZSBgLmdpdC9yZWZzL3RhZ3MvbXktZmlyc3QtdGFnYAorZmlsZSwgYWZ0ZXIgd2hpY2ggcG9pbnQgeW91IGNhbiB0aGVuIHVzZSB0aGlzIHN5bWJvbGljIG5hbWUgZm9yIHRoYXQKK3BhcnRpY3VsYXIgc3RhdGUuIFlvdSBjYW4sIGZvciBleGFtcGxlLCBkbworCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIG15LWZpcnN0LXRhZworLS0tLS0tLS0tLS0tLS0tLQorCit0byBkaWZmIHlvdXIgY3VycmVudCBzdGF0ZSBhZ2FpbnN0IHRoYXQgdGFnICh3aGljaCBhdCB0aGlzIHBvaW50IHdpbGwKK29idmlvdXNseSBiZSBhbiBlbXB0eSBkaWZmLCBidXQgaWYgeW91IGNvbnRpbnVlIHRvIGRldmVsb3AgYW5kIGNvbW1pdAorc3R1ZmYsIHlvdSBjYW4gdXNlIHlvdXIgdGFnIGFzIGFuICJhbmNob3ItcG9pbnQiIHRvIHNlZSB3aGF0IGhhcyBjaGFuZ2VkCitzaW5jZSB5b3UgdGFnZ2VkIGl0LgorCitBbiAiYW5ub3RhdGVkIHRhZyIgaXMgYWN0dWFsbHkgYSByZWFsIGdpdCBvYmplY3QsIGFuZCBjb250YWlucyBub3Qgb25seSBhCitwb2ludGVyIHRvIHRoZSBzdGF0ZSB5b3Ugd2FudCB0byB0YWcsIGJ1dCBhbHNvIGEgc21hbGwgdGFnIG5hbWUgYW5kCittZXNzYWdlLCBhbG9uZyB3aXRoIG9wdGlvbmFsbHkgYSBQR1Agc2lnbmF0dXJlIHRoYXQgc2F5cyB0aGF0IHllcywKK3lvdSByZWFsbHkgZGlkCit0aGF0IHRhZy4gWW91IGNyZWF0ZSB0aGVzZSBhbm5vdGF0ZWQgdGFncyB3aXRoIGVpdGhlciB0aGUgYC1hYCBvcgorYC1zYCBmbGFnIHRvIGBnaXQgdGFnYDoKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgdGFnIC1zIDx0YWduYW1lPgorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHNpZ24gdGhlIGN1cnJlbnQgYEhFQURgIChidXQgeW91IGNhbiBhbHNvIGdpdmUgaXQgYW5vdGhlcgorYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHRoaW5nIHRvIHRhZywgaS5lLiwgeW91IGNvdWxkIGhhdmUgdGFnZ2VkIHRoZQorY3VycmVudCBgbXlicmFuY2hgIHBvaW50IGJ5IHVzaW5nIGBnaXQgdGFnIDx0YWduYW1lPiBteWJyYW5jaGApLgorCitZb3Ugbm9ybWFsbHkgb25seSBkbyBzaWduZWQgdGFncyBmb3IgbWFqb3IgcmVsZWFzZXMgb3IgdGhpbmdzCitsaWtlIHRoYXQsIHdoaWxlIHRoZSBsaWdodC13ZWlnaHQgdGFncyBhcmUgdXNlZnVsIGZvciBhbnkgbWFya2luZyB5b3UKK3dhbnQgdG8gZG8gLS0gYW55IHRpbWUgeW91IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIHJlbWVtYmVyIGEgY2VydGFpbgorcG9pbnQsIGp1c3QgY3JlYXRlIGEgcHJpdmF0ZSB0YWcgZm9yIGl0LCBhbmQgeW91IGhhdmUgYSBuaWNlIHN5bWJvbGljCituYW1lIGZvciB0aGUgc3RhdGUgYXQgdGhhdCBwb2ludC4KKworCitDb3B5aW5nIHJlcG9zaXRvcmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0IHJlcG9zaXRvcmllcyBhcmUgbm9ybWFsbHkgdG90YWxseSBzZWxmLXN1ZmZpY2llbnQgYW5kIHJlbG9jYXRhYmxlCitVbmxpa2UgQ1ZTLCBmb3IgZXhhbXBsZSwgdGhlcmUgaXMgbm8gc2VwYXJhdGUgbm90aW9uIG9mCisicmVwb3NpdG9yeSIgYW5kICJ3b3JraW5nIHRyZWUiLiBBIGdpdCByZXBvc2l0b3J5IG5vcm1hbGx5ICppcyogdGhlCit3b3JraW5nIHRyZWUsIHdpdGggdGhlIGxvY2FsIGdpdCBpbmZvcm1hdGlvbiBoaWRkZW4gaW4gdGhlIGAuZ2l0YAorc3ViZGlyZWN0b3J5LiBUaGVyZSBpcyBub3RoaW5nIGVsc2UuIFdoYXQgeW91IHNlZSBpcyB3aGF0IHlvdSBnb3QuCisKK1tOT1RFXQorWW91IGNhbiB0ZWxsIGdpdCB0byBzcGxpdCB0aGUgZ2l0IGludGVybmFsIGluZm9ybWF0aW9uIGZyb20KK3RoZSBkaXJlY3RvcnkgdGhhdCBpdCB0cmFja3MsIGJ1dCB3ZSdsbCBpZ25vcmUgdGhhdCBmb3Igbm93OiBpdCdzIG5vdAoraG93IG5vcm1hbCBwcm9qZWN0cyB3b3JrLCBhbmQgaXQncyByZWFsbHkgb25seSBtZWFudCBmb3Igc3BlY2lhbCB1c2VzLgorU28gdGhlIG1lbnRhbCBtb2RlbCBvZiAidGhlIGdpdCBpbmZvcm1hdGlvbiBpcyBhbHdheXMgdGllZCBkaXJlY3RseSB0bwordGhlIHdvcmtpbmcgdHJlZSB0aGF0IGl0IGRlc2NyaWJlcyIgbWF5IG5vdCBiZSB0ZWNobmljYWxseSAxMDAlCithY2N1cmF0ZSwgYnV0IGl0J3MgYSBnb29kIG1vZGVsIGZvciBhbGwgbm9ybWFsIHVzZS4KKworVGhpcyBoYXMgdHdvIGltcGxpY2F0aW9uczogCisKKyAtIGlmIHlvdSBncm93IGJvcmVkIHdpdGggdGhlIHR1dG9yaWFsIHJlcG9zaXRvcnkgeW91IGNyZWF0ZWQgKG9yIHlvdSd2ZQorICAgbWFkZSBhIG1pc3Rha2UgYW5kIHdhbnQgdG8gc3RhcnQgYWxsIG92ZXIpLCB5b3UgY2FuIGp1c3QgZG8gc2ltcGxlCisrCistLS0tLS0tLS0tLS0tLS0tCiskIHJtIC1yZiBnaXQtdHV0b3JpYWwKKy0tLS0tLS0tLS0tLS0tLS0KKysKK2FuZCBpdCB3aWxsIGJlIGdvbmUuIFRoZXJlJ3Mgbm8gZXh0ZXJuYWwgcmVwb3NpdG9yeSwgYW5kIHRoZXJlJ3Mgbm8KK2hpc3Rvcnkgb3V0c2lkZSB0aGUgcHJvamVjdCB5b3UgY3JlYXRlZC4KKworIC0gaWYgeW91IHdhbnQgdG8gbW92ZSBvciBkdXBsaWNhdGUgYSBnaXQgcmVwb3NpdG9yeSwgeW91IGNhbiBkbyBzby4gVGhlcmUKKyAgIGlzIGBnaXQgY2xvbmVgIGNvbW1hbmQsIGJ1dCBpZiBhbGwgeW91IHdhbnQgdG8gZG8gaXMganVzdCB0bworICAgY3JlYXRlIGEgY29weSBvZiB5b3VyIHJlcG9zaXRvcnkgKHdpdGggYWxsIHRoZSBmdWxsIGhpc3RvcnkgdGhhdAorICAgd2VudCBhbG9uZyB3aXRoIGl0KSwgeW91IGNhbiBkbyBzbyB3aXRoIGEgcmVndWxhcgorICAgYGNwIC1hIGdpdC10dXRvcmlhbCBuZXctZ2l0LXR1dG9yaWFsYC4KKysKK05vdGUgdGhhdCB3aGVuIHlvdSd2ZSBtb3ZlZCBvciBjb3BpZWQgYSBnaXQgcmVwb3NpdG9yeSwgeW91ciBnaXQgaW5kZXgKK2ZpbGUgKHdoaWNoIGNhY2hlcyB2YXJpb3VzIGluZm9ybWF0aW9uLCBub3RhYmx5IHNvbWUgb2YgdGhlICJzdGF0IgoraW5mb3JtYXRpb24gZm9yIHRoZSBmaWxlcyBpbnZvbHZlZCkgd2lsbCBsaWtlbHkgbmVlZCB0byBiZSByZWZyZXNoZWQuCitTbyBhZnRlciB5b3UgZG8gYSBgY3AgLWFgIHRvIGNyZWF0ZSBhIG5ldyBjb3B5LCB5b3UnbGwgd2FudCB0byBkbworKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tLQorKworaW4gdGhlIG5ldyByZXBvc2l0b3J5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbmRleCBmaWxlIGlzIHVwLXRvLWRhdGUuCisKK05vdGUgdGhhdCB0aGUgc2Vjb25kIHBvaW50IGlzIHRydWUgZXZlbiBhY3Jvc3MgbWFjaGluZXMuIFlvdSBjYW4KK2R1cGxpY2F0ZSBhIHJlbW90ZSBnaXQgcmVwb3NpdG9yeSB3aXRoICphbnkqIHJlZ3VsYXIgY29weSBtZWNoYW5pc20sIGJlIGl0Citgc2NwYCwgYHJzeW5jYCBvciBgd2dldGAuCisKK1doZW4gY29weWluZyBhIHJlbW90ZSByZXBvc2l0b3J5LCB5b3UnbGwgd2FudCB0byBhdCBhIG1pbmltdW0gdXBkYXRlIHRoZQoraW5kZXggY2FjaGUgd2hlbiB5b3UgZG8gdGhpcywgYW5kIGVzcGVjaWFsbHkgd2l0aCBvdGhlciBwZW9wbGVzJworcmVwb3NpdG9yaWVzIHlvdSBvZnRlbiB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbmRleCBjYWNoZSBpcyBpbiBzb21lCitrbm93biBzdGF0ZSAoeW91IGRvbid0IGtub3cgKndoYXQqIHRoZXkndmUgZG9uZSBhbmQgbm90IHlldCBjaGVja2VkIGluKSwKK3NvIHVzdWFsbHkgeW91J2xsIHByZWNlZGUgdGhlIGBnaXQtdXBkYXRlLWluZGV4YCB3aXRoIGEKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC0tcmVzZXQgSEVBRAorJCBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGZvcmNlIGEgdG90YWwgaW5kZXggcmUtYnVpbGQgZnJvbSB0aGUgdHJlZSBwb2ludGVkIHRvIGJ5IGBIRUFEYC4KK0l0IHJlc2V0cyB0aGUgaW5kZXggY29udGVudHMgdG8gYEhFQURgLCBhbmQgdGhlbiB0aGUgYGdpdC11cGRhdGUtaW5kZXhgCittYWtlcyBzdXJlIHRvIG1hdGNoIHVwIGFsbCBpbmRleCBlbnRyaWVzIHdpdGggdGhlIGNoZWNrZWQtb3V0IGZpbGVzLgorSWYgdGhlIG9yaWdpbmFsIHJlcG9zaXRvcnkgaGFkIHVuY29tbWl0dGVkIGNoYW5nZXMgaW4gaXRzCit3b3JraW5nIHRyZWUsIGBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaGAgbm90aWNlcyB0aGVtIGFuZAordGVsbHMgeW91IHRoZXkgbmVlZCB0byBiZSB1cGRhdGVkLgorCitUaGUgYWJvdmUgY2FuIGFsc28gYmUgd3JpdHRlbiBhcyBzaW1wbHkKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmVzZXQKKy0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGluIGZhY3QgYSBsb3Qgb2YgdGhlIGNvbW1vbiBnaXQgY29tbWFuZCBjb21iaW5hdGlvbnMgY2FuIGJlIHNjcmlwdGVkCit3aXRoIHRoZSBgZ2l0IHh5emAgaW50ZXJmYWNlcy4gIFlvdSBjYW4gbGVhcm4gdGhpbmdzIGJ5IGp1c3QgbG9va2luZworYXQgd2hhdCB0aGUgdmFyaW91cyBnaXQgc2NyaXB0cyBkby4gIEZvciBleGFtcGxlLCBgZ2l0IHJlc2V0YCBpcyB0aGUKK2Fib3ZlIHR3byBsaW5lcyBpbXBsZW1lbnRlZCBpbiBgZ2l0LXJlc2V0YCwgYnV0IHNvbWUgdGhpbmdzIGxpa2UKK2BnaXQgc3RhdHVzYCBhbmQgYGdpdCBjb21taXRgIGFyZSBzbGlnaHRseSBtb3JlIGNvbXBsZXggc2NyaXB0cyBhcm91bmQKK3RoZSBiYXNpYyBnaXQgY29tbWFuZHMuCisKK01hbnkgKG1vc3Q/KSBwdWJsaWMgcmVtb3RlIHJlcG9zaXRvcmllcyB3aWxsIG5vdCBjb250YWluIGFueSBvZgordGhlIGNoZWNrZWQgb3V0IGZpbGVzIG9yIGV2ZW4gYW4gaW5kZXggZmlsZSwgYW5kIHdpbGwgKm9ubHkqIGNvbnRhaW4gdGhlCithY3R1YWwgY29yZSBnaXQgZmlsZXMuIFN1Y2ggYSByZXBvc2l0b3J5IHVzdWFsbHkgZG9lc24ndCBldmVuIGhhdmUgdGhlCitgLmdpdGAgc3ViZGlyZWN0b3J5LCBidXQgaGFzIGFsbCB0aGUgZ2l0IGZpbGVzIGRpcmVjdGx5IGluIHRoZQorcmVwb3NpdG9yeS4gCisKK1RvIGNyZWF0ZSB5b3VyIG93biBsb2NhbCBsaXZlIGNvcHkgb2Ygc3VjaCBhICJyYXciIGdpdCByZXBvc2l0b3J5LCB5b3UnZAorZmlyc3QgY3JlYXRlIHlvdXIgb3duIHN1YmRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QsIGFuZCB0aGVuIGNvcHkgdGhlCityYXcgcmVwb3NpdG9yeSBjb250ZW50cyBpbnRvIHRoZSBgLmdpdGAgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSwgdG8KK2NyZWF0ZSB5b3VyIG93biBjb3B5IG9mIHRoZSBnaXQgcmVwb3NpdG9yeSwgeW91J2QgZG8gdGhlIGZvbGxvd2luZworCistLS0tLS0tLS0tLS0tLS0tCiskIG1rZGlyIG15LWdpdAorJCBjZCBteS1naXQKKyQgcnN5bmMgLXJMIHJzeW5jOi8vcnN5bmMua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyAuZ2l0CistLS0tLS0tLS0tLS0tLS0tCisKK2ZvbGxvd2VkIGJ5IAorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1yZWFkLXRyZWUgSEVBRAorLS0tLS0tLS0tLS0tLS0tLQorCit0byBwb3B1bGF0ZSB0aGUgaW5kZXguIEhvd2V2ZXIsIG5vdyB5b3UgaGF2ZSBwb3B1bGF0ZWQgdGhlIGluZGV4LCBhbmQKK3lvdSBoYXZlIGFsbCB0aGUgZ2l0IGludGVybmFsIGZpbGVzLCBidXQgeW91IHdpbGwgbm90aWNlIHRoYXQgeW91IGRvbid0CithY3R1YWxseSBoYXZlIGFueSBvZiB0aGUgd29ya2luZyB0cmVlIGZpbGVzIHRvIHdvcmsgb24uIFRvIGdldAordGhvc2UsIHlvdSdkIGNoZWNrIHRoZW0gb3V0IHdpdGgKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWEKKy0tLS0tLS0tLS0tLS0tLS0KKword2hlcmUgdGhlIGAtdWAgZmxhZyBtZWFucyB0aGF0IHlvdSB3YW50IHRoZSBjaGVja291dCB0byBrZWVwIHRoZSBpbmRleAordXAtdG8tZGF0ZSAoc28gdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byByZWZyZXNoIGl0IGFmdGVyd2FyZCksIGFuZCB0aGUKK2AtYWAgZmxhZyBtZWFucyAiY2hlY2sgb3V0IGFsbCBmaWxlcyIgKGlmIHlvdSBoYXZlIGEgc3RhbGUgY29weSBvciBhbgorb2xkZXIgdmVyc2lvbiBvZiBhIGNoZWNrZWQgb3V0IHRyZWUgeW91IG1heSBhbHNvIG5lZWQgdG8gYWRkIHRoZSBgLWZgCitmbGFnIGZpcnN0LCB0byB0ZWxsIGdpdC1jaGVja291dC1pbmRleCB0byAqZm9yY2UqIG92ZXJ3cml0aW5nIG9mIGFueSBvbGQKK2ZpbGVzKS4gCisKK0FnYWluLCB0aGlzIGNhbiBhbGwgYmUgc2ltcGxpZmllZCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIHJzeW5jOi8vcnN5bmMua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyBteS1naXQKKyQgY2QgbXktZ2l0CiskIGdpdCBjaGVja291dAorLS0tLS0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIGVuZCB1cCBkb2luZyBhbGwgb2YgdGhlIGFib3ZlIGZvciB5b3UuCisKK1lvdSBoYXZlIG5vdyBzdWNjZXNzZnVsbHkgY29waWVkIHNvbWVib2R5IGVsc2UncyAobWluZSkgcmVtb3RlCityZXBvc2l0b3J5LCBhbmQgY2hlY2tlZCBpdCBvdXQuIAorCisKK0NyZWF0aW5nIGEgbmV3IGJyYW5jaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JyYW5jaGVzIGluIGdpdCBhcmUgcmVhbGx5IG5vdGhpbmcgbW9yZSB0aGFuIHBvaW50ZXJzIGludG8gdGhlIGdpdAorb2JqZWN0IGRhdGFiYXNlIGZyb20gd2l0aGluIHRoZSBgLmdpdC9yZWZzL2Agc3ViZGlyZWN0b3J5LCBhbmQgYXMgd2UKK2FscmVhZHkgZGlzY3Vzc2VkLCB0aGUgYEhFQURgIGJyYW5jaCBpcyBub3RoaW5nIGJ1dCBhIHN5bWxpbmsgdG8gb25lIG9mCit0aGVzZSBvYmplY3QgcG9pbnRlcnMuIAorCitZb3UgY2FuIGF0IGFueSB0aW1lIGNyZWF0ZSBhIG5ldyBicmFuY2ggYnkganVzdCBwaWNraW5nIGFuIGFyYml0cmFyeQorcG9pbnQgaW4gdGhlIHByb2plY3QgaGlzdG9yeSwgYW5kIGp1c3Qgd3JpdGluZyB0aGUgU0hBMSBuYW1lIG9mIHRoYXQKK29iamVjdCBpbnRvIGEgZmlsZSB1bmRlciBgLmdpdC9yZWZzL2hlYWRzL2AuIFlvdSBjYW4gdXNlIGFueSBmaWxlbmFtZSB5b3UKK3dhbnQgKGFuZCBpbmRlZWQsIHN1YmRpcmVjdG9yaWVzKSwgYnV0IHRoZSBjb252ZW50aW9uIGlzIHRoYXQgdGhlCisibm9ybWFsIiBicmFuY2ggaXMgY2FsbGVkIGBtYXN0ZXJgLiBUaGF0J3MganVzdCBhIGNvbnZlbnRpb24sIHRob3VnaCwKK2FuZCBub3RoaW5nIGVuZm9yY2VzIGl0LiAKKworVG8gc2hvdyB0aGF0IGFzIGFuIGV4YW1wbGUsIGxldCdzIGdvIGJhY2sgdG8gdGhlIGdpdC10dXRvcmlhbCByZXBvc2l0b3J5IHdlCit1c2VkIGVhcmxpZXIsIGFuZCBjcmVhdGUgYSBicmFuY2ggaW4gaXQuIFlvdSBkbyB0aGF0IGJ5IHNpbXBseSBqdXN0CitzYXlpbmcgdGhhdCB5b3Ugd2FudCB0byBjaGVjayBvdXQgYSBuZXcgYnJhbmNoOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG15YnJhbmNoCistLS0tLS0tLS0tLS0KKword2lsbCBjcmVhdGUgYSBuZXcgYnJhbmNoIGJhc2VkIGF0IHRoZSBjdXJyZW50IGBIRUFEYCBwb3NpdGlvbiwgYW5kIHN3aXRjaAordG8gaXQuIAorCitbTk9URV0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSWYgeW91IG1ha2UgdGhlIGRlY2lzaW9uIHRvIHN0YXJ0IHlvdXIgbmV3IGJyYW5jaCBhdCBzb21lCitvdGhlciBwb2ludCBpbiB0aGUgaGlzdG9yeSB0aGFuIHRoZSBjdXJyZW50IGBIRUFEYCwgeW91IGNhbiBkbyBzbyBieQoranVzdCB0ZWxsaW5nIGBnaXQgY2hlY2tvdXRgIHdoYXQgdGhlIGJhc2Ugb2YgdGhlIGNoZWNrb3V0IHdvdWxkIGJlLgorSW4gb3RoZXIgd29yZHMsIGlmIHlvdSBoYXZlIGFuIGVhcmxpZXIgdGFnIG9yIGJyYW5jaCwgeW91J2QganVzdCBkbworCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIG15YnJhbmNoIGVhcmxpZXItY29tbWl0CistLS0tLS0tLS0tLS0KKworYW5kIGl0IHdvdWxkIGNyZWF0ZSB0aGUgbmV3IGJyYW5jaCBgbXlicmFuY2hgIGF0IHRoZSBlYXJsaWVyIGNvbW1pdCwKK2FuZCBjaGVjayBvdXQgdGhlIHN0YXRlIGF0IHRoYXQgdGltZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgY2FuIGFsd2F5cyBqdXN0IGp1bXAgYmFjayB0byB5b3VyIG9yaWdpbmFsIGBtYXN0ZXJgIGJyYW5jaCBieSBkb2luZworCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorLS0tLS0tLS0tLS0tCisKKyhvciBhbnkgb3RoZXIgYnJhbmNoLW5hbWUsIGZvciB0aGF0IG1hdHRlcikgYW5kIGlmIHlvdSBmb3JnZXQgd2hpY2gKK2JyYW5jaCB5b3UgaGFwcGVuIHRvIGJlIG9uLCBhIHNpbXBsZQorCistLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvSEVBRAorLS0tLS0tLS0tLS0tCisKK3dpbGwgdGVsbCB5b3Ugd2hlcmUgaXQncyBwb2ludGluZy4gIFRvIGdldCB0aGUgbGlzdCBvZiBicmFuY2hlcworeW91IGhhdmUsIHlvdSBjYW4gc2F5CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoCistLS0tLS0tLS0tLS0KKword2hpY2ggaXMgbm90aGluZyBtb3JlIHRoYW4gYSBzaW1wbGUgc2NyaXB0IGFyb3VuZCBgbHMgLmdpdC9yZWZzL2hlYWRzYC4KK1RoZXJlIHdpbGwgYmUgYXN0ZXJpc2sgaW4gZnJvbnQgb2YgdGhlIGJyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSBvbi4KKworU29tZXRpbWVzIHlvdSBtYXkgd2lzaCB0byBjcmVhdGUgYSBuZXcgYnJhbmNoIF93aXRob3V0XyBhY3R1YWxseQorY2hlY2tpbmcgaXQgb3V0IGFuZCBzd2l0Y2hpbmcgdG8gaXQuIElmIHNvLCBqdXN0IHVzZSB0aGUgY29tbWFuZAorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCA8YnJhbmNobmFtZT4gW3N0YXJ0aW5ncG9pbnRdCistLS0tLS0tLS0tLS0KKword2hpY2ggd2lsbCBzaW1wbHkgX2NyZWF0ZV8gdGhlIGJyYW5jaCwgYnV0IHdpbGwgbm90IGRvIGFueXRoaW5nIGZ1cnRoZXIuIAorWW91IGNhbiB0aGVuIGxhdGVyIC0tIG9uY2UgeW91IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIGFjdHVhbGx5IGRldmVsb3AKK29uIHRoYXQgYnJhbmNoIC0tIHN3aXRjaCB0byB0aGF0IGJyYW5jaCB3aXRoIGEgcmVndWxhciBgZ2l0IGNoZWNrb3V0YAord2l0aCB0aGUgYnJhbmNobmFtZSBhcyB0aGUgYXJndW1lbnQuCisKKworTWVyZ2luZyB0d28gYnJhbmNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uZSBvZiB0aGUgaWRlYXMgb2YgaGF2aW5nIGEgYnJhbmNoIGlzIHRoYXQgeW91IGRvIHNvbWUgKHBvc3NpYmx5CitleHBlcmltZW50YWwpIHdvcmsgaW4gaXQsIGFuZCBldmVudHVhbGx5IG1lcmdlIGl0IGJhY2sgdG8gdGhlIG1haW4KK2JyYW5jaC4gU28gYXNzdW1pbmcgeW91IGNyZWF0ZWQgdGhlIGFib3ZlIGBteWJyYW5jaGAgdGhhdCBzdGFydGVkIG91dAorYmVpbmcgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIGBtYXN0ZXJgIGJyYW5jaCwgbGV0J3MgbWFrZSBzdXJlIHdlJ3JlIGluCit0aGF0IGJyYW5jaCwgYW5kIGRvIHNvbWUgd29yayB0aGVyZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBteWJyYW5jaAorJCBlY2hvICJXb3JrLCB3b3JrLCB3b3JrIiA+PmhlbGxvCiskIGdpdCBjb21taXQgLW0gJ1NvbWUgd29yay4nIC1pIGhlbGxvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSGVyZSwgd2UganVzdCBhZGRlZCBhbm90aGVyIGxpbmUgdG8gYGhlbGxvYCwgYW5kIHdlIHVzZWQgYSBzaG9ydGhhbmQgZm9yCitkb2luZyBib3RoIGBnaXQtdXBkYXRlLWluZGV4IGhlbGxvYCBhbmQgYGdpdCBjb21taXRgIGJ5IGp1c3QgZ2l2aW5nIHRoZQorZmlsZW5hbWUgZGlyZWN0bHkgdG8gYGdpdCBjb21taXRgLCB3aXRoIGFuIGAtaWAgZmxhZyAoaXQgdGVsbHMKK2dpdCB0byAnaW5jbHVkZScgdGhhdCBmaWxlIGluIGFkZGl0aW9uIHRvIHdoYXQgeW91IGhhdmUgZG9uZSB0bwordGhlIGluZGV4IGZpbGUgc28gZmFyIHdoZW4gbWFraW5nIHRoZSBjb21taXQpLiAgVGhlIGAtbWAgZmxhZyBpcyB0byBnaXZlIHRoZQorY29tbWl0IGxvZyBtZXNzYWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKworTm93LCB0byBtYWtlIGl0IGEgYml0IG1vcmUgaW50ZXJlc3RpbmcsIGxldCdzIGFzc3VtZSB0aGF0IHNvbWVib2R5IGVsc2UKK2RvZXMgc29tZSB3b3JrIGluIHRoZSBvcmlnaW5hbCBicmFuY2gsIGFuZCBzaW11bGF0ZSB0aGF0IGJ5IGdvaW5nIGJhY2sKK3RvIHRoZSBtYXN0ZXIgYnJhbmNoLCBhbmQgZWRpdGluZyB0aGUgc2FtZSBmaWxlIGRpZmZlcmVudGx5IHRoZXJlOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK0hlcmUsIHRha2UgYSBtb21lbnQgdG8gbG9vayBhdCB0aGUgY29udGVudHMgb2YgYGhlbGxvYCwgYW5kIG5vdGljZSBob3cgdGhleQorZG9uJ3QgY29udGFpbiB0aGUgd29yayB3ZSBqdXN0IGRpZCBpbiBgbXlicmFuY2hgIC0tIGJlY2F1c2UgdGhhdCB3b3JrCitoYXNuJ3QgaGFwcGVuZWQgaW4gdGhlIGBtYXN0ZXJgIGJyYW5jaCBhdCBhbGwuIFRoZW4gZG8KKworLS0tLS0tLS0tLS0tCiskIGVjaG8gIlBsYXksIHBsYXksIHBsYXkiID4+aGVsbG8KKyQgZWNobyAiTG90cyBvZiBmdW4iID4+ZXhhbXBsZQorJCBnaXQgY29tbWl0IC1tICdTb21lIGZ1bi4nIC1pIGhlbGxvIGV4YW1wbGUKKy0tLS0tLS0tLS0tLQorCitzaW5jZSB0aGUgbWFzdGVyIGJyYW5jaCBpcyBvYnZpb3VzbHkgaW4gYSBtdWNoIGJldHRlciBtb29kLgorCitOb3csIHlvdSd2ZSBnb3QgdHdvIGJyYW5jaGVzLCBhbmQgeW91IGRlY2lkZSB0aGF0IHlvdSB3YW50IHRvIG1lcmdlIHRoZQord29yayBkb25lLiBCZWZvcmUgd2UgZG8gdGhhdCwgbGV0J3MgaW50cm9kdWNlIGEgY29vbCBncmFwaGljYWwgdG9vbCB0aGF0CitoZWxwcyB5b3UgdmlldyB3aGF0J3MgZ29pbmcgb246CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0ayAtLWFsbAorLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHNob3cgeW91IGdyYXBoaWNhbGx5IGJvdGggb2YgeW91ciBicmFuY2hlcyAodGhhdCdzIHdoYXQgdGhlIGBcLS1hbGxgCittZWFuczogbm9ybWFsbHkgaXQgd2lsbCBqdXN0IHNob3cgeW91IHlvdXIgY3VycmVudCBgSEVBRGApIGFuZCB0aGVpcgoraGlzdG9yaWVzLiBZb3UgY2FuIGFsc28gc2VlIGV4YWN0bHkgaG93IHRoZXkgY2FtZSB0byBiZSBmcm9tIGEgY29tbW9uCitzb3VyY2UuIAorCitBbnl3YXksIGxldCdzIGV4aXQgYGdpdGtgIChgXlFgIG9yIHRoZSBGaWxlIG1lbnUpLCBhbmQgZGVjaWRlIHRoYXQgd2Ugd2FudAordG8gbWVyZ2UgdGhlIHdvcmsgd2UgZGlkIG9uIHRoZSBgbXlicmFuY2hgIGJyYW5jaCBpbnRvIHRoZSBgbWFzdGVyYAorYnJhbmNoICh3aGljaCBpcyBjdXJyZW50bHkgb3VyIGBIRUFEYCB0b28pLiBUbyBkbyB0aGF0LCB0aGVyZSdzIGEgbmljZQorc2NyaXB0IGNhbGxlZCBgZ2l0IG1lcmdlYCwgd2hpY2ggd2FudHMgdG8ga25vdyB3aGljaCBicmFuY2hlcyB5b3Ugd2FudAordG8gcmVzb2x2ZSBhbmQgd2hhdCB0aGUgbWVyZ2UgaXMgYWxsIGFib3V0OgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlICJNZXJnZSB3b3JrIGluIG15YnJhbmNoIiBIRUFEIG15YnJhbmNoCistLS0tLS0tLS0tLS0KKword2hlcmUgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGdvaW5nIHRvIGJlIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlIGlmCit0aGUgbWVyZ2UgY2FuIGJlIHJlc29sdmVkIGF1dG9tYXRpY2FsbHkuCisKK05vdywgaW4gdGhpcyBjYXNlIHdlJ3ZlIGludGVudGlvbmFsbHkgY3JlYXRlZCBhIHNpdHVhdGlvbiB3aGVyZSB0aGUKK21lcmdlIHdpbGwgbmVlZCB0byBiZSBmaXhlZCB1cCBieSBoYW5kLCB0aG91Z2gsIHNvIGdpdCB3aWxsIGRvIGFzIG11Y2gKK29mIGl0IGFzIGl0IGNhbiBhdXRvbWF0aWNhbGx5ICh3aGljaCBpbiB0aGlzIGNhc2UgaXMganVzdCBtZXJnZSB0aGUgYGV4YW1wbGVgCitmaWxlLCB3aGljaCBoYWQgbm8gZGlmZmVyZW5jZXMgaW4gdGhlIGBteWJyYW5jaGAgYnJhbmNoKSwgYW5kIHNheToKKworLS0tLS0tLS0tLS0tLS0tLQorCVRyeWluZyByZWFsbHkgdHJpdmlhbCBpbi1pbmRleCBtZXJnZS4uLgorCWZhdGFsOiBNZXJnZSByZXF1aXJlcyBmaWxlLWxldmVsIG1lcmdpbmcKKwlOb3BlLgorCS4uLgorCUF1dG8tbWVyZ2luZyBoZWxsbyAKKwlDT05GTElDVCAoY29udGVudCk6IE1lcmdlIGNvbmZsaWN0IGluIGhlbGxvIAorCUF1dG9tYXRpYyBtZXJnZSBmYWlsZWQ7IGZpeCB1cCBieSBoYW5kCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGlzIHdheSB0b28gdmVyYm9zZSwgYnV0IGl0IGJhc2ljYWxseSB0ZWxscyB5b3UgdGhhdCBpdCBmYWlsZWQgdGhlCityZWFsbHkgdHJpdmlhbCBtZXJnZSAoIlNpbXBsZSBtZXJnZSIpIGFuZCBkaWQgYW4gIkF1dG9tYXRpYyBtZXJnZSIKK2luc3RlYWQsIGJ1dCB0aGF0IHRvbyBmYWlsZWQgZHVlIHRvIGNvbmZsaWN0cyBpbiBgaGVsbG9gLgorCitOb3QgdG8gd29ycnkuIEl0IGxlZnQgdGhlICh0cml2aWFsKSBjb25mbGljdCBpbiBgaGVsbG9gIGluIHRoZSBzYW1lIGZvcm0geW91CitzaG91bGQgYWxyZWFkeSBiZSB3ZWxsIHVzZWQgdG8gaWYgeW91J3ZlIGV2ZXIgdXNlZCBDVlMsIHNvIGxldCdzIGp1c3QKK29wZW4gYGhlbGxvYCBpbiBvdXIgZWRpdG9yICh3aGF0ZXZlciB0aGF0IG1heSBiZSksIGFuZCBmaXggaXQgdXAgc29tZWhvdy4KK0knZCBzdWdnZXN0IGp1c3QgbWFraW5nIGl0IHNvIHRoYXQgYGhlbGxvYCBjb250YWlucyBhbGwgZm91ciBsaW5lczoKKworLS0tLS0tLS0tLS0tCitIZWxsbyBXb3JsZAorSXQncyBhIG5ldyBkYXkgZm9yIGdpdAorUGxheSwgcGxheSwgcGxheQorV29yaywgd29yaywgd29yaworLS0tLS0tLS0tLS0tCisKK2FuZCBvbmNlIHlvdSdyZSBoYXBweSB3aXRoIHlvdXIgbWFudWFsIG1lcmdlLCBqdXN0IGRvIGEKKworLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWkgaGVsbG8KKy0tLS0tLS0tLS0tLQorCit3aGljaCB3aWxsIHZlcnkgbG91ZGx5IHdhcm4geW91IHRoYXQgeW91J3JlIG5vdyBjb21taXR0aW5nIGEgbWVyZ2UKKyh3aGljaCBpcyBjb3JyZWN0LCBzbyBuZXZlciBtaW5kKSwgYW5kIHlvdSBjYW4gd3JpdGUgYSBzbWFsbCBtZXJnZQorbWVzc2FnZSBhYm91dCB5b3VyIGFkdmVudHVyZXMgaW4gZ2l0LW1lcmdlLWxhbmQuCisKK0FmdGVyIHlvdSdyZSBkb25lLCBzdGFydCB1cCBgZ2l0ayBcLS1hbGxgIHRvIHNlZSBncmFwaGljYWxseSB3aGF0IHRoZQoraGlzdG9yeSBsb29rcyBsaWtlLiBOb3RpY2UgdGhhdCBgbXlicmFuY2hgIHN0aWxsIGV4aXN0cywgYW5kIHlvdSBjYW4KK3N3aXRjaCB0byBpdCwgYW5kIGNvbnRpbnVlIHRvIHdvcmsgd2l0aCBpdCBpZiB5b3Ugd2FudCB0by4gVGhlCitgbXlicmFuY2hgIGJyYW5jaCB3aWxsIG5vdCBjb250YWluIHRoZSBtZXJnZSwgYnV0IG5leHQgdGltZSB5b3UgbWVyZ2UgaXQKK2Zyb20gdGhlIGBtYXN0ZXJgIGJyYW5jaCwgZ2l0IHdpbGwga25vdyBob3cgeW91IG1lcmdlZCBpdCwgc28geW91J2xsIG5vdAoraGF2ZSB0byBkbyBfdGhhdF8gbWVyZ2UgYWdhaW4uCisKK0Fub3RoZXIgdXNlZnVsIHRvb2wsIGVzcGVjaWFsbHkgaWYgeW91IGRvIG5vdCBhbHdheXMgd29yayBpbiBYLVdpbmRvdworZW52aXJvbm1lbnQsIGlzIGBnaXQgc2hvdy1icmFuY2hgLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIC0tdG9wby1vcmRlciBtYXN0ZXIgbXlicmFuY2gKKyogW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorICEgW215YnJhbmNoXSBTb21lIHdvcmsuCistLQorLSAgW21hc3Rlcl0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorKisgW215YnJhbmNoXSBTb21lIHdvcmsuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IHR3byBsaW5lcyBpbmRpY2F0ZSB0aGF0IGl0IGlzIHNob3dpbmcgdGhlIHR3byBicmFuY2hlcworYW5kIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZnJvbSB0aGVpcgordG9wLW9mLXRoZS10cmVlIGNvbW1pdHMsIHlvdSBhcmUgY3VycmVudGx5IG9uIGBtYXN0ZXJgIGJyYW5jaAorKG5vdGljZSB0aGUgYXN0ZXJpc2sgYFwqYCBjaGFyYWN0ZXIpLCBhbmQgdGhlIGZpcnN0IGNvbHVtbiBmb3IKK3RoZSBsYXRlciBvdXRwdXQgbGluZXMgaXMgdXNlZCB0byBzaG93IGNvbW1pdHMgY29udGFpbmVkIGluIHRoZQorYG1hc3RlcmAgYnJhbmNoLCBhbmQgdGhlIHNlY29uZCBjb2x1bW4gZm9yIHRoZSBgbXlicmFuY2hgCiticmFuY2guIFRocmVlIGNvbW1pdHMgYXJlIHNob3duIGFsb25nIHdpdGggdGhlaXIgbG9nIG1lc3NhZ2VzLgorQWxsIG9mIHRoZW0gaGF2ZSBub24gYmxhbmsgY2hhcmFjdGVycyBpbiB0aGUgZmlyc3QgY29sdW1uIChgKmAKK3Nob3dzIGFuIG9yZGluYXJ5IGNvbW1pdCBvbiB0aGUgY3VycmVudCBicmFuY2gsIGAuYCBpcyBhIG1lcmdlIGNvbW1pdCksIHdoaWNoCittZWFucyB0aGV5IGFyZSBub3cgcGFydCBvZiB0aGUgYG1hc3RlcmAgYnJhbmNoLiBPbmx5IHRoZSAiU29tZQord29yayIgY29tbWl0IGhhcyB0aGUgcGx1cyBgK2AgY2hhcmFjdGVyIGluIHRoZSBzZWNvbmQgY29sdW1uLAorYmVjYXVzZSBgbXlicmFuY2hgIGhhcyBub3QgYmVlbiBtZXJnZWQgdG8gaW5jb3Jwb3JhdGUgdGhlc2UKK2NvbW1pdHMgZnJvbSB0aGUgbWFzdGVyIGJyYW5jaC4gIFRoZSBzdHJpbmcgaW5zaWRlIGJyYWNrZXRzCitiZWZvcmUgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpcyBhIHNob3J0IG5hbWUgeW91IGNhbiB1c2UgdG8KK25hbWUgdGhlIGNvbW1pdC4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCAnbWFzdGVyJyBhbmQgJ215YnJhbmNoJworYXJlIGJyYW5jaCBoZWFkcy4gICdtYXN0ZXJ+MScgaXMgdGhlIGZpcnN0IHBhcmVudCBvZiAnbWFzdGVyJworYnJhbmNoIGhlYWQuICBQbGVhc2Ugc2VlICdnaXQtcmV2LXBhcnNlJyBkb2N1bWVudGF0aW9uIGlmIHlvdQorc2VlIG1vcmUgY29tcGxleCBjYXNlcy4KKworTm93LCBsZXQncyBwcmV0ZW5kIHlvdSBhcmUgdGhlIG9uZSB3aG8gZGlkIGFsbCB0aGUgd29yayBpbgorYG15YnJhbmNoYCwgYW5kIHRoZSBmcnVpdCBvZiB5b3VyIGhhcmQgd29yayBoYXMgZmluYWxseSBiZWVuIG1lcmdlZAordG8gdGhlIGBtYXN0ZXJgIGJyYW5jaC4gTGV0J3MgZ28gYmFjayB0byBgbXlicmFuY2hgLCBhbmQgcnVuCityZXNvbHZlIHRvIGdldCB0aGUgInVwc3RyZWFtIGNoYW5nZXMiIGJhY2sgdG8geW91ciBicmFuY2guCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXlicmFuY2gKKyQgZ2l0IG1lcmdlICJNZXJnZSB1cHN0cmVhbSBjaGFuZ2VzLiIgSEVBRCBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIG91dHB1dHMgc29tZXRoaW5nIGxpa2UgdGhpcyAodGhlIGFjdHVhbCBjb21taXQgb2JqZWN0IG5hbWVzCit3b3VsZCBiZSBkaWZmZXJlbnQpCisKKy0tLS0tLS0tLS0tLS0tLS0KK1VwZGF0aW5nIGZyb20gYWUzYTJkYS4uLiB0byBhODBiNGFhLi4uLgorRmFzdCBmb3J3YXJkCisgZXhhbXBsZSB8ICAgIDEgKworIGhlbGxvICAgfCAgICAxICsKKyAyIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKy0tLS0tLS0tLS0tLS0tLS0KKworQmVjYXVzZSB5b3VyIGJyYW5jaCBkaWQgbm90IGNvbnRhaW4gYW55dGhpbmcgbW9yZSB0aGFuIHdoYXQgYXJlCithbHJlYWR5IG1lcmdlZCBpbnRvIHRoZSBgbWFzdGVyYCBicmFuY2gsIHRoZSByZXNvbHZlIG9wZXJhdGlvbiBkaWQKK25vdCBhY3R1YWxseSBkbyBhIG1lcmdlLiBJbnN0ZWFkLCBpdCBqdXN0IHVwZGF0ZWQgdGhlIHRvcCBvZgordGhlIHRyZWUgb2YgeW91ciBicmFuY2ggdG8gdGhhdCBvZiB0aGUgYG1hc3RlcmAgYnJhbmNoLiBUaGlzIGlzCitvZnRlbiBjYWxsZWQgJ2Zhc3QgZm9yd2FyZCcgbWVyZ2UuCisKK1lvdSBjYW4gcnVuIGBnaXRrIFwtLWFsbGAgYWdhaW4gdG8gc2VlIGhvdyB0aGUgY29tbWl0IGFuY2VzdHJ5Citsb29rcyBsaWtlLCBvciBydW4gYHNob3ctYnJhbmNoYCwgd2hpY2ggdGVsbHMgeW91IHRoaXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggbWFzdGVyIG15YnJhbmNoCishIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKyAqIFtteWJyYW5jaF0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0KKy0tIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK01lcmdpbmcgZXh0ZXJuYWwgd29yaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0J3MgdXN1YWxseSBtdWNoIG1vcmUgY29tbW9uIHRoYXQgeW91IG1lcmdlIHdpdGggc29tZWJvZHkgZWxzZSB0aGFuCittZXJnaW5nIHdpdGggeW91ciBvd24gYnJhbmNoZXMsIHNvIGl0J3Mgd29ydGggcG9pbnRpbmcgb3V0IHRoYXQgZ2l0CittYWtlcyB0aGF0IHZlcnkgZWFzeSB0b28sIGFuZCBpbiBmYWN0LCBpdCdzIG5vdCB0aGF0IGRpZmZlcmVudCBmcm9tCitkb2luZyBhIGBnaXQgbWVyZ2VgLiBJbiBmYWN0LCBhIHJlbW90ZSBtZXJnZSBlbmRzIHVwIGJlaW5nIG5vdGhpbmcKK21vcmUgdGhhbiAiZmV0Y2ggdGhlIHdvcmsgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IGludG8gYSB0ZW1wb3JhcnkgdGFnIgorZm9sbG93ZWQgYnkgYSBgZ2l0IG1lcmdlYC4KKworRmV0Y2hpbmcgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IGlzIGRvbmUgYnksIHVuc3VycHJpc2luZ2x5LAorYGdpdCBmZXRjaGA6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGZldGNoIDxyZW1vdGUtcmVwb3NpdG9yeT4KKy0tLS0tLS0tLS0tLS0tLS0KKworT25lIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNwb3J0cyBjYW4gYmUgdXNlZCB0byBuYW1lIHRoZQorcmVwb3NpdG9yeSB0byBkb3dubG9hZCBmcm9tOgorCitSc3luYzo6CisJYHJzeW5jOi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitSc3luYyB0cmFuc3BvcnQgaXMgdXNhYmxlIGZvciBib3RoIHVwbG9hZGluZyBhbmQgZG93bmxvYWRpbmcsCitidXQgaXMgY29tcGxldGVseSB1bmF3YXJlIG9mIHdoYXQgZ2l0IGRvZXMsIGFuZCBjYW4gcHJvZHVjZQordW5leHBlY3RlZCByZXN1bHRzIHdoZW4geW91IGRvd25sb2FkIGZyb20gdGhlIHB1YmxpYyByZXBvc2l0b3J5Cit3aGlsZSB0aGUgcmVwb3NpdG9yeSBvd25lciBpcyB1cGxvYWRpbmcgaW50byBpdCB2aWEgYHJzeW5jYAordHJhbnNwb3J0LiAgTW9zdCBub3RhYmx5LCBpdCBjb3VsZCB1cGRhdGUgdGhlIGZpbGVzIHVuZGVyCitgcmVmcy9gIHdoaWNoIGhvbGRzIHRoZSBvYmplY3QgbmFtZSBvZiB0aGUgdG9wbW9zdCBjb21taXRzCitiZWZvcmUgdXBsb2FkaW5nIHRoZSBmaWxlcyBpbiBgb2JqZWN0cy9gIC0tIHRoZSBkb3dubG9hZGVyIHdvdWxkCitvYnRhaW4gaGVhZCBjb21taXQgb2JqZWN0IG5hbWUgd2hpbGUgdGhhdCBvYmplY3QgaXRzZWxmIGlzIHN0aWxsCitub3QgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5LiAgRm9yIHRoaXMgcmVhc29uLCBpdCBpcworY29uc2lkZXJlZCBkZXByZWNhdGVkLgorCitTU0g6OgorCWByZW1vdGUubWFjaGluZTovcGF0aC90by9yZXBvLmdpdC9gIG9yCisrCitgc3NoOi8vcmVtb3RlLm1hY2hpbmUvcGF0aC90by9yZXBvLmdpdC9gCisrCitUaGlzIHRyYW5zcG9ydCBjYW4gYmUgdXNlZCBmb3IgYm90aCB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nLAorYW5kIHJlcXVpcmVzIHlvdSB0byBoYXZlIGEgbG9nLWluIHByaXZpbGVnZSBvdmVyIGBzc2hgIHRvIHRoZQorcmVtb3RlIG1hY2hpbmUuICBJdCBmaW5kcyBvdXQgdGhlIHNldCBvZiBvYmplY3RzIHRoZSBvdGhlciBzaWRlCitsYWNrcyBieSBleGNoYW5naW5nIHRoZSBoZWFkIGNvbW1pdHMgYm90aCBlbmRzIGhhdmUgYW5kCit0cmFuc2ZlcnMgKGNsb3NlIHRvKSBtaW5pbXVtIHNldCBvZiBvYmplY3RzLiAgSXQgaXMgYnkgZmFyIHRoZQorbW9zdCBlZmZpY2llbnQgd2F5IHRvIGV4Y2hhbmdlIGdpdCBvYmplY3RzIGJldHdlZW4gcmVwb3NpdG9yaWVzLgorCitMb2NhbCBkaXJlY3Rvcnk6OgorCWAvcGF0aC90by9yZXBvLmdpdC9gCisrCitUaGlzIHRyYW5zcG9ydCBpcyB0aGUgc2FtZSBhcyBTU0ggdHJhbnNwb3J0IGJ1dCB1c2VzIGBzaGAgdG8gcnVuCitib3RoIGVuZHMgb24gdGhlIGxvY2FsIG1hY2hpbmUgaW5zdGVhZCBvZiBydW5uaW5nIG90aGVyIGVuZCBvbgordGhlIHJlbW90ZSBtYWNoaW5lIHZpYSBgc3NoYC4KKworZ2l0IE5hdGl2ZTo6CisJYGdpdDovL3JlbW90ZS5tYWNoaW5lL3BhdGgvdG8vcmVwby5naXQvYAorKworVGhpcyB0cmFuc3BvcnQgd2FzIGRlc2lnbmVkIGZvciBhbm9ueW1vdXMgZG93bmxvYWRpbmcuICBMaWtlIFNTSAordHJhbnNwb3J0LCBpdCBmaW5kcyBvdXQgdGhlIHNldCBvZiBvYmplY3RzIHRoZSBkb3duc3RyZWFtIHNpZGUKK2xhY2tzIGFuZCB0cmFuc2ZlcnMgKGNsb3NlIHRvKSBtaW5pbXVtIHNldCBvZiBvYmplY3RzLgorCitIVFRQKFMpOjoKKwlgaHR0cDovL3JlbW90ZS5tYWNoaW5lL3BhdGgvdG8vcmVwby5naXQvYAorKworRG93bmxvYWRlciBmcm9tIGh0dHAgYW5kIGh0dHBzIFVSTAorZmlyc3Qgb2J0YWlucyB0aGUgdG9wbW9zdCBjb21taXQgb2JqZWN0IG5hbWUgZnJvbSB0aGUgcmVtb3RlIHNpdGUKK2J5IGxvb2tpbmcgYXQgdGhlIHNwZWNpZmllZCByZWZuYW1lIHVuZGVyIGByZXBvLmdpdC9yZWZzL2AgZGlyZWN0b3J5LAorYW5kIHRoZW4gdHJpZXMgdG8gb2J0YWluIHRoZQorY29tbWl0IG9iamVjdCBieSBkb3dubG9hZGluZyBmcm9tIGByZXBvLmdpdC9vYmplY3RzL3h4L3h4eFwuLi5gCit1c2luZyB0aGUgb2JqZWN0IG5hbWUgb2YgdGhhdCBjb21taXQgb2JqZWN0LiAgVGhlbiBpdCByZWFkcyB0aGUKK2NvbW1pdCBvYmplY3QgdG8gZmluZCBvdXQgaXRzIHBhcmVudCBjb21taXRzIGFuZCB0aGUgYXNzb2NpYXRlCit0cmVlIG9iamVjdDsgaXQgcmVwZWF0cyB0aGlzIHByb2Nlc3MgdW50aWwgaXQgZ2V0cyBhbGwgdGhlCituZWNlc3Nhcnkgb2JqZWN0cy4gIEJlY2F1c2Ugb2YgdGhpcyBiZWhhdmlvciwgdGhleSBhcmUKK3NvbWV0aW1lcyBhbHNvIGNhbGxlZCAnY29tbWl0IHdhbGtlcnMnLgorKworVGhlICdjb21taXQgd2Fsa2VycycgYXJlIHNvbWV0aW1lcyBhbHNvIGNhbGxlZCAnZHVtYgordHJhbnNwb3J0cycsIGJlY2F1c2UgdGhleSBkbyBub3QgcmVxdWlyZSBhbnkgZ2l0IGF3YXJlIHNtYXJ0CitzZXJ2ZXIgbGlrZSBnaXQgTmF0aXZlIHRyYW5zcG9ydCBkb2VzLiAgQW55IHN0b2NrIEhUVFAgc2VydmVyCit0aGF0IGRvZXMgbm90IGV2ZW4gc3VwcG9ydCBkaXJlY3RvcnkgaW5kZXggd291bGQgc3VmZmljZS4gIEJ1dAoreW91IG11c3QgcHJlcGFyZSB5b3VyIHJlcG9zaXRvcnkgd2l0aCBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AKK3RvIGhlbHAgZHVtYiB0cmFuc3BvcnQgZG93bmxvYWRlcnMuCisrCitUaGVyZSBhcmUgKGNvbmZ1c2luZ2x5IGVub3VnaCkgYGdpdC1zc2gtZmV0Y2hgIGFuZCBgZ2l0LXNzaC11cGxvYWRgCitwcm9ncmFtcywgd2hpY2ggYXJlICdjb21taXQgd2Fsa2Vycyc7IHRoZXkgb3V0bGl2ZWQgdGhlaXIKK3VzZWZ1bG5lc3Mgd2hlbiBnaXQgTmF0aXZlIGFuZCBTU0ggdHJhbnNwb3J0cyB3ZXJlIGludHJvZHVjZWQsCithbmQgbm90IHVzZWQgYnkgYGdpdCBwdWxsYCBvciBgZ2l0IHB1c2hgIHNjcmlwdHMuCisKK09uY2UgeW91IGZldGNoIGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5LCB5b3UgYHJlc29sdmVgIHRoYXQKK3dpdGggeW91ciBjdXJyZW50IGJyYW5jaC4KKworSG93ZXZlciAtLSBpdCdzIHN1Y2ggYSBjb21tb24gdGhpbmcgdG8gYGZldGNoYCBhbmQgdGhlbgoraW1tZWRpYXRlbHkgYHJlc29sdmVgLCB0aGF0IGl0J3MgY2FsbGVkIGBnaXQgcHVsbGAsIGFuZCB5b3UgY2FuCitzaW1wbHkgZG8KKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbCA8cmVtb3RlLXJlcG9zaXRvcnk+CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBvcHRpb25hbGx5IGdpdmUgYSBicmFuY2gtbmFtZSBmb3IgdGhlIHJlbW90ZSBlbmQgYXMgYSBzZWNvbmQKK2FyZ3VtZW50LgorCitbTk9URV0KK1lvdSBjb3VsZCBkbyB3aXRob3V0IHVzaW5nIGFueSBicmFuY2hlcyBhdCBhbGwsIGJ5CitrZWVwaW5nIGFzIG1hbnkgbG9jYWwgcmVwb3NpdG9yaWVzIGFzIHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUKK2JyYW5jaGVzLCBhbmQgbWVyZ2luZyBiZXR3ZWVuIHRoZW0gd2l0aCBgZ2l0IHB1bGxgLCBqdXN0IGxpa2UKK3lvdSBtZXJnZSBiZXR3ZWVuIGJyYW5jaGVzLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMKK3RoYXQgaXQgbGV0cyB5b3Uga2VlcCBzZXQgb2YgZmlsZXMgZm9yIGVhY2ggYGJyYW5jaGAgY2hlY2tlZAorb3V0IGFuZCB5b3UgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIHN3aXRjaCBiYWNrIGFuZCBmb3J0aCBpZiB5b3UKK2p1Z2dsZSBtdWx0aXBsZSBsaW5lcyBvZiBkZXZlbG9wbWVudCBzaW11bHRhbmVvdXNseS4gT2YKK2NvdXJzZSwgeW91IHdpbGwgcGF5IHRoZSBwcmljZSBvZiBtb3JlIGRpc2sgdXNhZ2UgdG8gaG9sZAorbXVsdGlwbGUgd29ya2luZyB0cmVlcywgYnV0IGRpc2sgc3BhY2UgaXMgY2hlYXAgdGhlc2UgZGF5cy4KKworW05PVEVdCitZb3UgY291bGQgZXZlbiBwdWxsIGZyb20geW91ciBvd24gcmVwb3NpdG9yeSBieQorZ2l2aW5nICcuJyBhcyA8cmVtb3RlLXJlcG9zaXRvcnk+IHBhcmFtZXRlciB0byBgZ2l0IHB1bGxgLiAgVGhpcworaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gbWVyZ2UgYSBsb2NhbCBicmFuY2ggKG9yIG1vcmUsIGlmIHlvdQorYXJlIG1ha2luZyBhbiBPY3RvcHVzKSBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4KKworSXQgaXMgbGlrZWx5IHRoYXQgeW91IHdpbGwgYmUgcHVsbGluZyBmcm9tIHRoZSBzYW1lIHJlbW90ZQorcmVwb3NpdG9yeSBmcm9tIHRpbWUgdG8gdGltZS4gQXMgYSBzaG9ydCBoYW5kLCB5b3UgY2FuIHN0b3JlCit0aGUgcmVtb3RlIHJlcG9zaXRvcnkgVVJMIGluIGEgZmlsZSB1bmRlciAuZ2l0L3JlbW90ZXMvCitkaXJlY3RvcnksIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG1rZGlyIC1wIC5naXQvcmVtb3Rlcy8KKyQgY2F0ID4uZ2l0L3JlbW90ZXMvbGludXMgPDxcRU9GCitVUkw6IGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LworRU9GCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIHVzZSB0aGUgZmlsZW5hbWUgdG8gYGdpdCBwdWxsYCBpbnN0ZWFkIG9mIHRoZSBmdWxsIFVSTC4KK1RoZSBVUkwgc3BlY2lmaWVkIGluIHN1Y2ggZmlsZSBjYW4gZXZlbiBiZSBhIHByZWZpeAorb2YgYSBmdWxsIFVSTCwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0ID4uZ2l0L3JlbW90ZXMvamdhcnppayA8PFxFT0YKK1VSTDogaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgvZ2l0L2pnYXJ6aWsvCitFT0YKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK0V4YW1wbGVzLgorCisuIGBnaXQgcHVsbCBsaW51c2AKKy4gYGdpdCBwdWxsIGxpbnVzIHRhZyB2MC45OS4xYAorLiBgZ2l0IHB1bGwgamdhcnppay9uZXRkZXYtMi42LmdpdC8gZTEwMGAKKwordGhlIGFib3ZlIGFyZSBlcXVpdmFsZW50IHRvOgorCisuIGBnaXQgcHVsbCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdC8gSEVBRGAKKy4gYGdpdCBwdWxsIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0LyB0YWcgdjAuOTkuMWAKKy4gYGdpdCBwdWxsIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvLi4uL2pnYXJ6aWsvbmV0ZGV2LTIuNi5naXQgZTEwMGAKKworCitIb3cgZG9lcyB0aGUgbWVyZ2Ugd29yaz8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBzYWlkIHRoaXMgdHV0b3JpYWwgc2hvd3Mgd2hhdCBwbHVtYmluZyBkb2VzIHRvIGhlbHAgeW91IGNvcGUKK3dpdGggdGhlIHBvcmNlbGFpbiB0aGF0IGlzbid0IGZsdXNoaW5nLCBidXQgd2Ugc28gZmFyIGRpZCBub3QKK3RhbGsgYWJvdXQgaG93IHRoZSBtZXJnZSByZWFsbHkgd29ya3MuICBJZiB5b3UgYXJlIGZvbGxvd2luZwordGhpcyB0dXRvcmlhbCB0aGUgZmlyc3QgdGltZSwgSSdkIHN1Z2dlc3QgdG8gc2tpcCB0byAiUHVibGlzaGluZworeW91ciB3b3JrIiBzZWN0aW9uIGFuZCBjb21lIGJhY2sgaGVyZSBsYXRlci4KKworT0ssIHN0aWxsIHdpdGggbWU/ICBUbyBnaXZlIHVzIGFuIGV4YW1wbGUgdG8gbG9vayBhdCwgbGV0J3MgZ28KK2JhY2sgdG8gdGhlIGVhcmxpZXIgcmVwb3NpdG9yeSB3aXRoICJoZWxsbyIgYW5kICJleGFtcGxlIiBmaWxlLAorYW5kIGJyaW5nIG91cnNlbHZlcyBiYWNrIHRvIHRoZSBwcmUtbWVyZ2Ugc3RhdGU6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTMgbWFzdGVyIG15YnJhbmNoCishIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKyAqIFtteWJyYW5jaF0gTWVyZ2Ugd29yayBpbiBteWJyYW5jaAorLS0KKy0tIFttYXN0ZXJdIE1lcmdlIHdvcmsgaW4gbXlicmFuY2gKKysqIFttYXN0ZXJeMl0gU29tZSB3b3JrLgorKyogW21hc3Rlcl5dIFNvbWUgZnVuLgorLS0tLS0tLS0tLS0tCisKK1JlbWVtYmVyLCBiZWZvcmUgcnVubmluZyBgZ2l0IG1lcmdlYCwgb3VyIGBtYXN0ZXJgIGhlYWQgd2FzIGF0CisiU29tZSBmdW4uIiBjb21taXQsIHdoaWxlIG91ciBgbXlicmFuY2hgIGhlYWQgd2FzIGF0ICJTb21lCit3b3JrLiIgY29tbWl0LgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15YnJhbmNoCiskIGdpdCByZXNldCAtLWhhcmQgbWFzdGVyXjIKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgcmVzZXQgLS1oYXJkIG1hc3Rlcl4KKy0tLS0tLS0tLS0tLQorCitBZnRlciByZXdpbmRpbmcsIHRoZSBjb21taXQgc3RydWN0dXJlIHNob3VsZCBsb29rIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaAorKiBbbWFzdGVyXSBTb21lIGZ1bi4KKyAhIFtteWJyYW5jaF0gU29tZSB3b3JrLgorLS0KKyArIFtteWJyYW5jaF0gU29tZSB3b3JrLgorKiAgW21hc3Rlcl0gU29tZSBmdW4uCisqKyBbbXlicmFuY2heXSBOZXcgZGF5LgorLS0tLS0tLS0tLS0tCisKK05vdyB3ZSBhcmUgcmVhZHkgdG8gZXhwZXJpbWVudCB3aXRoIHRoZSBtZXJnZSBieSBoYW5kLgorCitgZ2l0IG1lcmdlYCBjb21tYW5kLCB3aGVuIG1lcmdpbmcgdHdvIGJyYW5jaGVzLCB1c2VzIDMtd2F5IG1lcmdlCithbGdvcml0aG0uICBGaXJzdCwgaXQgZmluZHMgdGhlIGNvbW1vbiBhbmNlc3RvciBiZXR3ZWVuIHRoZW0uCitUaGUgY29tbWFuZCBpdCB1c2VzIGlzIGBnaXQtbWVyZ2UtYmFzZWA6CisKKy0tLS0tLS0tLS0tLQorJCBtYj0kKGdpdC1tZXJnZS1iYXNlIEhFQUQgbXlicmFuY2gpCistLS0tLS0tLS0tLS0KKworVGhlIGNvbW1hbmQgd3JpdGVzIHRoZSBjb21taXQgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1vbiBhbmNlc3RvcgordG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgc28gd2UgY2FwdHVyZWQgaXRzIG91dHB1dCB0byBhIHZhcmlhYmxlLAorYmVjYXVzZSB3ZSB3aWxsIGJlIHVzaW5nIGl0IGluIHRoZSBuZXh0IHN0ZXAuICBCVFcsIHRoZSBjb21tb24KK2FuY2VzdG9yIGNvbW1pdCBpcyB0aGUgIk5ldyBkYXkuIiBjb21taXQgaW4gdGhpcyBjYXNlLiAgWW91IGNhbgordGVsbCBpdCBieToKKworLS0tLS0tLS0tLS0tCiskIGdpdC1uYW1lLXJldiAkbWIKK215LWZpcnN0LXRhZworLS0tLS0tLS0tLS0tCisKK0FmdGVyIGZpbmRpbmcgb3V0IGEgY29tbW9uIGFuY2VzdG9yIGNvbW1pdCwgdGhlIHNlY29uZCBzdGVwIGlzCit0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkbWIgSEVBRCBteWJyYW5jaAorLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdGhlIHNhbWUgYGdpdC1yZWFkLXRyZWVgIGNvbW1hbmQgd2UgaGF2ZSBhbHJlYWR5IHNlZW4sCitidXQgaXQgdGFrZXMgdGhyZWUgdHJlZXMsIHVubGlrZSBwcmV2aW91cyBleGFtcGxlcy4gIFRoaXMgcmVhZHMKK3RoZSBjb250ZW50cyBvZiBlYWNoIHRyZWUgaW50byBkaWZmZXJlbnQgJ3N0YWdlJyBpbiB0aGUgaW5kZXgKK2ZpbGUgKHRoZSBmaXJzdCB0cmVlIGdvZXMgdG8gc3RhZ2UgMSwgdGhlIHNlY29uZCBzdGFnZSAyLAorZXRjLikuICBBZnRlciByZWFkaW5nIHRocmVlIHRyZWVzIGludG8gdGhyZWUgc3RhZ2VzLCB0aGUgcGF0aHMKK3RoYXQgYXJlIHRoZSBzYW1lIGluIGFsbCB0aHJlZSBzdGFnZXMgYXJlICdjb2xsYXBzZWQnIGludG8gc3RhZ2UKKzAuICBBbHNvIHBhdGhzIHRoYXQgYXJlIHRoZSBzYW1lIGluIHR3byBvZiB0aHJlZSBzdGFnZXMgYXJlCitjb2xsYXBzZWQgaW50byBzdGFnZSAwLCB0YWtpbmcgdGhlIFNIQTEgZnJvbSBlaXRoZXIgc3RhZ2UgMiBvcgorc3RhZ2UgMywgd2hpY2hldmVyIGlzIGRpZmZlcmVudCBmcm9tIHN0YWdlIDEgKGkuZS4gb25seSBvbmUgc2lkZQorY2hhbmdlZCBmcm9tIHRoZSBjb21tb24gYW5jZXN0b3IpLgorCitBZnRlciAnY29sbGFwc2luZycgb3BlcmF0aW9uLCBwYXRocyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gdGhyZWUKK3RyZWVzIGFyZSBsZWZ0IGluIG5vbi16ZXJvIHN0YWdlcy4gIEF0IHRoaXMgcG9pbnQsIHlvdSBjYW4KK2luc3BlY3QgdGhlIGluZGV4IGZpbGUgd2l0aCB0aGlzIGNvbW1hbmQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtbHMtZmlsZXMgLS1zdGFnZQorMTAwNjQ0IDdmOGIxNDFiNjVmZGNlZTQ3MzIxZTM5OWEyNTk4YTIzNWEwMzI0MjIgMAlleGFtcGxlCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvCisxMDA2NDQgY2M0NGM3M2ViNzgzNTY1ZGE1ODMxYjRkODIwYzk2Mjk1NDAxOWI2OSAzCWhlbGxvCistLS0tLS0tLS0tLS0KKworSW4gb3VyIGV4YW1wbGUgb2Ygb25seSB0d28gZmlsZXMsIHdlIGRpZCBub3QgaGF2ZSB1bmNoYW5nZWQKK2ZpbGVzIHNvIG9ubHkgJ2V4YW1wbGUnIHJlc3VsdGVkIGluIGNvbGxhcHNpbmcsIGJ1dCBpbiByZWFsLWxpZmUKK2xhcmdlIHByb2plY3RzLCBvbmx5IHNtYWxsIG51bWJlciBvZiBmaWxlcyBjaGFuZ2UgaW4gb25lIGNvbW1pdCwKK2FuZCB0aGlzICdjb2xsYXBzaW5nJyB0ZW5kcyB0byB0cml2aWFsbHkgbWVyZ2UgbW9zdCBvZiB0aGUgcGF0aHMKK2ZhaXJseSBxdWlja2x5LCBsZWF2aW5nIG9ubHkgYSBoYW5kZnVsIHRoZSByZWFsIGNoYW5nZXMgaW4gbm9uLXplcm8KK3N0YWdlcy4KKworVG8gbG9vayBhdCBvbmx5IG5vbi16ZXJvIHN0YWdlcywgdXNlIGBcLS11bm1lcmdlZGAgZmxhZzoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1scy1maWxlcyAtLXVubWVyZ2VkCisxMDA2NDQgMjYzNDE0ZjQyM2QwZTRkNzBkYWU4ZmU1M2ZhMzQ2MTRmZjNlMjg2MCAxCWhlbGxvCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvCisxMDA2NDQgY2M0NGM3M2ViNzgzNTY1ZGE1ODMxYjRkODIwYzk2Mjk1NDAxOWI2OSAzCWhlbGxvCistLS0tLS0tLS0tLS0KKworVGhlIG5leHQgc3RlcCBvZiBtZXJnaW5nIGlzIHRvIG1lcmdlIHRoZXNlIHRocmVlIHZlcnNpb25zIG9mIHRoZQorZmlsZSwgdXNpbmcgMy13YXkgbWVyZ2UuICBUaGlzIGlzIGRvbmUgYnkgZ2l2aW5nCitgZ2l0LW1lcmdlLW9uZS1maWxlYCBjb21tYW5kIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzIHRvCitgZ2l0LW1lcmdlLWluZGV4YCBjb21tYW5kOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0LW1lcmdlLWluZGV4IGdpdC1tZXJnZS1vbmUtZmlsZSBoZWxsbworQXV0by1tZXJnaW5nIGhlbGxvLgorbWVyZ2U6IHdhcm5pbmc6IGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UKK0VSUk9SOiBNZXJnZSBjb25mbGljdCBpbiBoZWxsby4KK2ZhdGFsOiBtZXJnZSBwcm9ncmFtIGZhaWxlZAorLS0tLS0tLS0tLS0tCisKK2BnaXQtbWVyZ2Utb25lLWZpbGVgIHNjcmlwdCBpcyBjYWxsZWQgd2l0aCBwYXJhbWV0ZXJzIHRvCitkZXNjcmliZSB0aG9zZSB0aHJlZSB2ZXJzaW9ucywgYW5kIGlzIHJlc3BvbnNpYmxlIHRvIGxlYXZlIHRoZQorbWVyZ2UgcmVzdWx0cyBpbiB0aGUgd29ya2luZyB0cmVlLgorSXQgaXMgYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIHNoZWxsIHNjcmlwdCwgYW5kCitldmVudHVhbGx5IGNhbGxzIGBtZXJnZWAgcHJvZ3JhbSBmcm9tIFJDUyBzdWl0ZSB0byBwZXJmb3JtIGEKK2ZpbGUtbGV2ZWwgMy13YXkgbWVyZ2UuICBJbiB0aGlzIGNhc2UsIGBtZXJnZWAgZGV0ZWN0cworY29uZmxpY3RzLCBhbmQgdGhlIG1lcmdlIHJlc3VsdCB3aXRoIGNvbmZsaWN0IG1hcmtzIGlzIGxlZnQgaW4KK3RoZSB3b3JraW5nIHRyZWUuLiAgVGhpcyBjYW4gYmUgc2VlbiBpZiB5b3UgcnVuIGBscy1maWxlcworLS1zdGFnZWAgYWdhaW4gYXQgdGhpcyBwb2ludDoKKworLS0tLS0tLS0tLS0tCiskIGdpdC1scy1maWxlcyAtLXN0YWdlCisxMDA2NDQgN2Y4YjE0MWI2NWZkY2VlNDczMjFlMzk5YTI1OThhMjM1YTAzMjQyMiAwCWV4YW1wbGUKKzEwMDY0NCAyNjM0MTRmNDIzZDBlNGQ3MGRhZThmZTUzZmEzNDYxNGZmM2UyODYwIDEJaGVsbG8KKzEwMDY0NCAwNmZhNmEyNDI1NmRjN2U1NjBlZmE1Njg3ZmE4NGI1MWYwMjYzYzNhIDIJaGVsbG8KKzEwMDY0NCBjYzQ0YzczZWI3ODM1NjVkYTU4MzFiNGQ4MjBjOTYyOTU0MDE5YjY5IDMJaGVsbG8KKy0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHRoZSBzdGF0ZSBvZiB0aGUgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgZmlsZSBhZnRlcgorYGdpdCBtZXJnZWAgcmV0dXJucyBjb250cm9sIGJhY2sgdG8geW91LCBsZWF2aW5nIHRoZSBjb25mbGljdGluZworbWVyZ2UgZm9yIHlvdSB0byByZXNvbHZlLiAgTm90aWNlIHRoYXQgdGhlIHBhdGggYGhlbGxvYCBpcyBzdGlsbAordW5tZXJnZWQsIGFuZCB3aGF0IHlvdSBzZWUgd2l0aCBgZ2l0IGRpZmZgIGF0IHRoaXMgcG9pbnQgaXMKK2RpZmZlcmVuY2VzIHNpbmNlIHN0YWdlIDIgKGkuZS4geW91ciB2ZXJzaW9uKS4KKworCitQdWJsaXNoaW5nIHlvdXIgd29yaworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU28gd2UgY2FuIHVzZSBzb21lYm9keSBlbHNlJ3Mgd29yayBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnk7IGJ1dAoraG93IGNhbiAqeW91KiBwcmVwYXJlIGEgcmVwb3NpdG9yeSB0byBsZXQgb3RoZXIgcGVvcGxlIHB1bGwgZnJvbQoraXQ/CisKK1lvdXIgZG8geW91ciByZWFsIHdvcmsgaW4geW91ciB3b3JraW5nIHRyZWUgdGhhdCBoYXMgeW91cgorcHJpbWFyeSByZXBvc2l0b3J5IGhhbmdpbmcgdW5kZXIgaXQgYXMgaXRzIGAuZ2l0YCBzdWJkaXJlY3RvcnkuCitZb3UgKmNvdWxkKiBtYWtlIHRoYXQgcmVwb3NpdG9yeSBhY2Nlc3NpYmxlIHJlbW90ZWx5IGFuZCBhc2sKK3Blb3BsZSB0byBwdWxsIGZyb20gaXQsIGJ1dCBpbiBwcmFjdGljZSB0aGF0IGlzIG5vdCB0aGUgd2F5Cit0aGluZ3MgYXJlIHVzdWFsbHkgZG9uZS4gQSByZWNvbW1lbmRlZCB3YXkgaXMgdG8gaGF2ZSBhIHB1YmxpYworcmVwb3NpdG9yeSwgbWFrZSBpdCByZWFjaGFibGUgYnkgb3RoZXIgcGVvcGxlLCBhbmQgd2hlbiB0aGUKK2NoYW5nZXMgeW91IG1hZGUgaW4geW91ciBwcmltYXJ5IHdvcmtpbmcgdHJlZSBhcmUgaW4gZ29vZCBzaGFwZSwKK3VwZGF0ZSB0aGUgcHVibGljIHJlcG9zaXRvcnkgZnJvbSBpdC4gVGhpcyBpcyBvZnRlbiBjYWxsZWQKKydwdXNoaW5nJy4KKworW05PVEVdCitUaGlzIHB1YmxpYyByZXBvc2l0b3J5IGNvdWxkIGZ1cnRoZXIgYmUgbWlycm9yZWQsIGFuZCB0aGF0IGlzCitob3cgZ2l0IHJlcG9zaXRvcmllcyBhdCBga2VybmVsLm9yZ2AgYXJlIG1hbmFnZWQuCisKK1B1Ymxpc2hpbmcgdGhlIGNoYW5nZXMgZnJvbSB5b3VyIGxvY2FsIChwcml2YXRlKSByZXBvc2l0b3J5IHRvCit5b3VyIHJlbW90ZSAocHVibGljKSByZXBvc2l0b3J5IHJlcXVpcmVzIGEgd3JpdGUgcHJpdmlsZWdlIG9uCit0aGUgcmVtb3RlIG1hY2hpbmUuIFlvdSBuZWVkIHRvIGhhdmUgYW4gU1NIIGFjY291bnQgdGhlcmUgdG8KK3J1biBhIHNpbmdsZSBjb21tYW5kLCBgZ2l0LXJlY2VpdmUtcGFja2AuCisKK0ZpcnN0LCB5b3UgbmVlZCB0byBjcmVhdGUgYW4gZW1wdHkgcmVwb3NpdG9yeSBvbiB0aGUgcmVtb3RlCittYWNoaW5lIHRoYXQgd2lsbCBob3VzZSB5b3VyIHB1YmxpYyByZXBvc2l0b3J5LiBUaGlzIGVtcHR5CityZXBvc2l0b3J5IHdpbGwgYmUgcG9wdWxhdGVkIGFuZCBiZSBrZXB0IHVwLXRvLWRhdGUgYnkgcHVzaGluZworaW50byBpdCBsYXRlci4gT2J2aW91c2x5LCB0aGlzIHJlcG9zaXRvcnkgY3JlYXRpb24gbmVlZHMgdG8gYmUKK2RvbmUgb25seSBvbmNlLgorCitbTk9URV0KK2BnaXQgcHVzaGAgdXNlcyBhIHBhaXIgb2YgcHJvZ3JhbXMsCitgZ2l0LXNlbmQtcGFja2Agb24geW91ciBsb2NhbCBtYWNoaW5lLCBhbmQgYGdpdC1yZWNlaXZlLXBhY2tgCitvbiB0aGUgcmVtb3RlIG1hY2hpbmUuIFRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHR3byBvdmVyCit0aGUgbmV0d29yayBpbnRlcm5hbGx5IHVzZXMgYW4gU1NIIGNvbm5lY3Rpb24uCisKK1lvdXIgcHJpdmF0ZSByZXBvc2l0b3J5J3MgZ2l0IGRpcmVjdG9yeSBpcyB1c3VhbGx5IGAuZ2l0YCwgYnV0Cit5b3VyIHB1YmxpYyByZXBvc2l0b3J5IGlzIG9mdGVuIG5hbWVkIGFmdGVyIHRoZSBwcm9qZWN0IG5hbWUsCitpLmUuIGA8cHJvamVjdD4uZ2l0YC4gTGV0J3MgY3JlYXRlIHN1Y2ggYSBwdWJsaWMgcmVwb3NpdG9yeSBmb3IKK3Byb2plY3QgYG15LWdpdGAuIEFmdGVyIGxvZ2dpbmcgaW50byB0aGUgcmVtb3RlIG1hY2hpbmUsIGNyZWF0ZQorYW4gZW1wdHkgZGlyZWN0b3J5OgorCistLS0tLS0tLS0tLS0KKyQgbWtkaXIgbXktZ2l0LmdpdAorLS0tLS0tLS0tLS0tCisKK1RoZW4sIG1ha2UgdGhhdCBkaXJlY3RvcnkgaW50byBhIGdpdCByZXBvc2l0b3J5IGJ5IHJ1bm5pbmcKK2BnaXQgaW5pdC1kYmAsIGJ1dCB0aGlzIHRpbWUsIHNpbmNlIGl0cyBuYW1lIGlzIG5vdCB0aGUgdXN1YWwKK2AuZ2l0YCwgd2UgZG8gdGhpbmdzIHNsaWdodGx5IGRpZmZlcmVudGx5OgorCistLS0tLS0tLS0tLS0KKyQgR0lUX0RJUj1teS1naXQuZ2l0IGdpdC1pbml0LWRiCistLS0tLS0tLS0tLS0KKworTWFrZSBzdXJlIHRoaXMgZGlyZWN0b3J5IGlzIGF2YWlsYWJsZSBmb3Igb3RoZXJzIHlvdSB3YW50IHlvdXIKK2NoYW5nZXMgdG8gYmUgcHVsbGVkIGJ5IHZpYSB0aGUgdHJhbnNwb3J0IG9mIHlvdXIgY2hvaWNlLiBBbHNvCit5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgYGdpdC1yZWNlaXZlLXBhY2tgCitwcm9ncmFtIG9uIHRoZSBgJFBBVEhgLgorCitbTk9URV0KK01hbnkgaW5zdGFsbGF0aW9ucyBvZiBzc2hkIGRvIG5vdCBpbnZva2UgeW91ciBzaGVsbCBhcyB0aGUgbG9naW4KK3NoZWxsIHdoZW4geW91IGRpcmVjdGx5IHJ1biBwcm9ncmFtczsgd2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgaWYKK3lvdXIgbG9naW4gc2hlbGwgaXMgYGJhc2hgLCBvbmx5IGAuYmFzaHJjYCBpcyByZWFkIGFuZCBub3QKK2AuYmFzaF9wcm9maWxlYC4gQXMgYSB3b3JrYXJvdW5kLCBtYWtlIHN1cmUgYC5iYXNocmNgIHNldHMgdXAKK2AkUEFUSGAgc28gdGhhdCB5b3UgY2FuIHJ1biBgZ2l0LXJlY2VpdmUtcGFja2AgcHJvZ3JhbS4KKworW05PVEVdCitJZiB5b3UgcGxhbiB0byBwdWJsaXNoIHRoaXMgcmVwb3NpdG9yeSB0byBiZSBhY2Nlc3NlZCBvdmVyIGh0dHAsCit5b3Ugc2hvdWxkIGRvIGBjaG1vZCAreCBteS1naXQuZ2l0L2hvb2tzL3Bvc3QtdXBkYXRlYCBhdCB0aGlzCitwb2ludC4gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IGV2ZXJ5IHRpbWUgeW91IHB1c2ggaW50byB0aGlzCityZXBvc2l0b3J5LCBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AgaXMgcnVuLgorCitZb3VyICJwdWJsaWMgcmVwb3NpdG9yeSIgaXMgbm93IHJlYWR5IHRvIGFjY2VwdCB5b3VyIGNoYW5nZXMuCitDb21lIGJhY2sgdG8gdGhlIG1hY2hpbmUgeW91IGhhdmUgeW91ciBwcml2YXRlIHJlcG9zaXRvcnkuIEZyb20KK3RoZXJlLCBydW4gdGhpcyBjb21tYW5kOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggPHB1YmxpYy1ob3N0PjovcGF0aC90by9teS1naXQuZ2l0IG1hc3RlcgorLS0tLS0tLS0tLS0tCisKK1RoaXMgc3luY2hyb25pemVzIHlvdXIgcHVibGljIHJlcG9zaXRvcnkgdG8gbWF0Y2ggdGhlIG5hbWVkCiticmFuY2ggaGVhZCAoaS5lLiBgbWFzdGVyYCBpbiB0aGlzIGNhc2UpIGFuZCBvYmplY3RzIHJlYWNoYWJsZQorZnJvbSB0aGVtIGluIHlvdXIgY3VycmVudCByZXBvc2l0b3J5LgorCitBcyBhIHJlYWwgZXhhbXBsZSwgdGhpcyBpcyBob3cgSSB1cGRhdGUgbXkgcHVibGljIGdpdAorcmVwb3NpdG9yeS4gS2VybmVsLm9yZyBtaXJyb3IgbmV0d29yayB0YWtlcyBjYXJlIG9mIHRoZQorcHJvcGFnYXRpb24gdG8gb3RoZXIgcHVibGljbHkgdmlzaWJsZSBtYWNoaW5lczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBwdXNoIG1hc3Rlci5rZXJuZWwub3JnOi9wdWIvc2NtL2dpdC9naXQuZ2l0LyAKKy0tLS0tLS0tLS0tLQorCisKK1BhY2tpbmcgeW91ciByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYXJsaWVyLCB3ZSBzYXcgdGhhdCBvbmUgZmlsZSB1bmRlciBgLmdpdC9vYmplY3RzLz8/L2AgZGlyZWN0b3J5CitpcyBzdG9yZWQgZm9yIGVhY2ggZ2l0IG9iamVjdCB5b3UgY3JlYXRlLiBUaGlzIHJlcHJlc2VudGF0aW9uCitpcyBlZmZpY2llbnQgdG8gY3JlYXRlIGF0b21pY2FsbHkgYW5kIHNhZmVseSwgYnV0Citub3Qgc28gY29udmVuaWVudCB0byB0cmFuc3BvcnQgb3ZlciB0aGUgbmV0d29yay4gU2luY2UgZ2l0IG9iamVjdHMgYXJlCitpbW11dGFibGUgb25jZSB0aGV5IGFyZSBjcmVhdGVkLCB0aGVyZSBpcyBhIHdheSB0byBvcHRpbWl6ZSB0aGUKK3N0b3JhZ2UgYnkgInBhY2tpbmcgdGhlbSB0b2dldGhlciIuIFRoZSBjb21tYW5kCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVwYWNrCistLS0tLS0tLS0tLS0KKword2lsbCBkbyBpdCBmb3IgeW91LiBJZiB5b3UgZm9sbG93ZWQgdGhlIHR1dG9yaWFsIGV4YW1wbGVzLCB5b3UKK3dvdWxkIGhhdmUgYWNjdW11bGF0ZWQgYWJvdXQgMTcgb2JqZWN0cyBpbiBgLmdpdC9vYmplY3RzLz8/L2AKK2RpcmVjdG9yaWVzIGJ5IG5vdy4gYGdpdCByZXBhY2tgIHRlbGxzIHlvdSBob3cgbWFueSBvYmplY3RzIGl0CitwYWNrZWQsIGFuZCBzdG9yZXMgdGhlIHBhY2tlZCBmaWxlIGluIGAuZ2l0L29iamVjdHMvcGFja2AKK2RpcmVjdG9yeS4KKworW05PVEVdCitZb3Ugd2lsbCBzZWUgdHdvIGZpbGVzLCBgcGFjay1cKi5wYWNrYCBhbmQgYHBhY2stXCouaWR4YCwKK2luIGAuZ2l0L29iamVjdHMvcGFja2AgZGlyZWN0b3J5LiBUaGV5IGFyZSBjbG9zZWx5IHJlbGF0ZWQgdG8KK2VhY2ggb3RoZXIsIGFuZCBpZiB5b3UgZXZlciBjb3B5IHRoZW0gYnkgaGFuZCB0byBhIGRpZmZlcmVudAorcmVwb3NpdG9yeSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB5b3Ugc2hvdWxkIG1ha2Ugc3VyZSB5b3UgY29weQordGhlbSB0b2dldGhlci4gVGhlIGZvcm1lciBob2xkcyBhbGwgdGhlIGRhdGEgZnJvbSB0aGUgb2JqZWN0cworaW4gdGhlIHBhY2ssIGFuZCB0aGUgbGF0dGVyIGhvbGRzIHRoZSBpbmRleCBmb3IgcmFuZG9tCithY2Nlc3MuCisKK0lmIHlvdSBhcmUgcGFyYW5vaWQsIHJ1bm5pbmcgYGdpdC12ZXJpZnktcGFja2AgY29tbWFuZCB3b3VsZAorZGV0ZWN0IGlmIHlvdSBoYXZlIGEgY29ycnVwdCBwYWNrLCBidXQgZG8gbm90IHdvcnJ5IHRvbyBtdWNoLgorT3VyIHByb2dyYW1zIGFyZSBhbHdheXMgcGVyZmVjdCA7LSkuCisKK09uY2UgeW91IGhhdmUgcGFja2VkIG9iamVjdHMsIHlvdSBkbyBub3QgbmVlZCB0byBsZWF2ZSB0aGUKK3VucGFja2VkIG9iamVjdHMgdGhhdCBhcmUgY29udGFpbmVkIGluIHRoZSBwYWNrIGZpbGUgYW55bW9yZS4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBwcnVuZS1wYWNrZWQKKy0tLS0tLS0tLS0tLQorCit3b3VsZCByZW1vdmUgdGhlbSBmb3IgeW91LgorCitZb3UgY2FuIHRyeSBydW5uaW5nIGBmaW5kIC5naXQvb2JqZWN0cyAtdHlwZSBmYCBiZWZvcmUgYW5kIGFmdGVyCit5b3UgcnVuIGBnaXQgcHJ1bmUtcGFja2VkYCBpZiB5b3UgYXJlIGN1cmlvdXMuICBBbHNvIGBnaXQKK2NvdW50LW9iamVjdHNgIHdvdWxkIHRlbGwgeW91IGhvdyBtYW55IHVucGFja2VkIG9iamVjdHMgYXJlIGluCit5b3VyIHJlcG9zaXRvcnkgYW5kIGhvdyBtdWNoIHNwYWNlIHRoZXkgYXJlIGNvbnN1bWluZy4KKworW05PVEVdCitgZ2l0IHB1bGxgIGlzIHNsaWdodGx5IGN1bWJlcnNvbWUgZm9yIEhUVFAgdHJhbnNwb3J0LCBhcyBhCitwYWNrZWQgcmVwb3NpdG9yeSBtYXkgY29udGFpbiByZWxhdGl2ZWx5IGZldyBvYmplY3RzIGluIGEKK3JlbGF0aXZlbHkgbGFyZ2UgcGFjay4gSWYgeW91IGV4cGVjdCBtYW55IEhUVFAgcHVsbHMgZnJvbSB5b3VyCitwdWJsaWMgcmVwb3NpdG9yeSB5b3UgbWlnaHQgd2FudCB0byByZXBhY2sgJiBwcnVuZSBvZnRlbiwgb3IKK25ldmVyLgorCitJZiB5b3UgcnVuIGBnaXQgcmVwYWNrYCBhZ2FpbiBhdCB0aGlzIHBvaW50LCBpdCB3aWxsIHNheQorIk5vdGhpbmcgdG8gcGFjayIuIE9uY2UgeW91IGNvbnRpbnVlIHlvdXIgZGV2ZWxvcG1lbnQgYW5kCithY2N1bXVsYXRlIHRoZSBjaGFuZ2VzLCBydW5uaW5nIGBnaXQgcmVwYWNrYCBhZ2FpbiB3aWxsIGNyZWF0ZSBhCituZXcgcGFjaywgdGhhdCBjb250YWlucyBvYmplY3RzIGNyZWF0ZWQgc2luY2UgeW91IHBhY2tlZCB5b3VyCityZXBvc2l0b3J5IHRoZSBsYXN0IHRpbWUuIFdlIHJlY29tbWVuZCB0aGF0IHlvdSBwYWNrIHlvdXIgcHJvamVjdAorc29vbiBhZnRlciB0aGUgaW5pdGlhbCBpbXBvcnQgKHVubGVzcyB5b3UgYXJlIHN0YXJ0aW5nIHlvdXIKK3Byb2plY3QgZnJvbSBzY3JhdGNoKSwgYW5kIHRoZW4gcnVuIGBnaXQgcmVwYWNrYCBldmVyeSBvbmNlIGluIGEKK3doaWxlLCBkZXBlbmRpbmcgb24gaG93IGFjdGl2ZSB5b3VyIHByb2plY3QgaXMuCisKK1doZW4gYSByZXBvc2l0b3J5IGlzIHN5bmNocm9uaXplZCB2aWEgYGdpdCBwdXNoYCBhbmQgYGdpdCBwdWxsYAorb2JqZWN0cyBwYWNrZWQgaW4gdGhlIHNvdXJjZSByZXBvc2l0b3J5IGFyZSB1c3VhbGx5IHN0b3JlZAordW5wYWNrZWQgaW4gdGhlIGRlc3RpbmF0aW9uLCB1bmxlc3MgcnN5bmMgdHJhbnNwb3J0IGlzIHVzZWQuCitXaGlsZSB0aGlzIGFsbG93cyB5b3UgdG8gdXNlIGRpZmZlcmVudCBwYWNraW5nIHN0cmF0ZWdpZXMgb24KK2JvdGggZW5kcywgaXQgYWxzbyBtZWFucyB5b3UgbWF5IG5lZWQgdG8gcmVwYWNrIGJvdGgKK3JlcG9zaXRvcmllcyBldmVyeSBvbmNlIGluIGEgd2hpbGUuCisKKworV29ya2luZyB3aXRoIE90aGVycworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRob3VnaCBnaXQgaXMgYSB0cnVseSBkaXN0cmlidXRlZCBzeXN0ZW0sIGl0IGlzIG9mdGVuCitjb252ZW5pZW50IHRvIG9yZ2FuaXplIHlvdXIgcHJvamVjdCB3aXRoIGFuIGluZm9ybWFsIGhpZXJhcmNoeQorb2YgZGV2ZWxvcGVycy4gTGludXgga2VybmVsIGRldmVsb3BtZW50IGlzIHJ1biB0aGlzIHdheS4gVGhlcmUKK2lzIGEgbmljZSBpbGx1c3RyYXRpb24gKHBhZ2UgMTcsICJNZXJnZXMgdG8gTWFpbmxpbmUiKSBpbiBSYW5keQorRHVubGFwJ3MgcHJlc2VudGF0aW9uIChgaHR0cDovL3Rpbnl1cmwuY29tL2EyamRnYCkuCisKK0l0IHNob3VsZCBiZSBzdHJlc3NlZCB0aGF0IHRoaXMgaGllcmFyY2h5IGlzIHB1cmVseSAqaW5mb3JtYWwqLgorVGhlcmUgaXMgbm90aGluZyBmdW5kYW1lbnRhbCBpbiBnaXQgdGhhdCBlbmZvcmNlcyB0aGUgImNoYWluIG9mCitwYXRjaCBmbG93IiB0aGlzIGhpZXJhcmNoeSBpbXBsaWVzLiBZb3UgZG8gbm90IGhhdmUgdG8gcHVsbAorZnJvbSBvbmx5IG9uZSByZW1vdGUgcmVwb3NpdG9yeS4KKworQSByZWNvbW1lbmRlZCB3b3JrZmxvdyBmb3IgYSAicHJvamVjdCBsZWFkIiBnb2VzIGxpa2UgdGhpczoKKworMS4gUHJlcGFyZSB5b3VyIHByaW1hcnkgcmVwb3NpdG9yeSBvbiB5b3VyIGxvY2FsIG1hY2hpbmUuIFlvdXIKKyAgIHdvcmsgaXMgZG9uZSB0aGVyZS4KKworMi4gUHJlcGFyZSBhIHB1YmxpYyByZXBvc2l0b3J5IGFjY2Vzc2libGUgdG8gb3RoZXJzLgorKworSWYgb3RoZXIgcGVvcGxlIGFyZSBwdWxsaW5nIGZyb20geW91ciByZXBvc2l0b3J5IG92ZXIgZHVtYgordHJhbnNwb3J0IHByb3RvY29scyAoSFRUUCksIHlvdSBuZWVkIHRvIGtlZXAgdGhpcyByZXBvc2l0b3J5CisnZHVtYiB0cmFuc3BvcnQgZnJpZW5kbHknLiAgQWZ0ZXIgYGdpdCBpbml0LWRiYCwKK2AkR0lUX0RJUi9ob29rcy9wb3N0LXVwZGF0ZWAgY29waWVkIGZyb20gdGhlIHN0YW5kYXJkIHRlbXBsYXRlcword291bGQgY29udGFpbiBhIGNhbGwgdG8gYGdpdC11cGRhdGUtc2VydmVyLWluZm9gIGJ1dCB0aGUKK2Bwb3N0LXVwZGF0ZWAgaG9vayBpdHNlbGYgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAtLSBlbmFibGUgaXQKK3dpdGggYGNobW9kICt4IHBvc3QtdXBkYXRlYC4gIFRoaXMgbWFrZXMgc3VyZSBgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mb2AKK2tlZXBzIHRoZSBuZWNlc3NhcnkgZmlsZXMgdXAtdG8tZGF0ZS4KKworMy4gUHVzaCBpbnRvIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBmcm9tIHlvdXIgcHJpbWFyeQorICAgcmVwb3NpdG9yeS4KKworNC4gYGdpdCByZXBhY2tgIHRoZSBwdWJsaWMgcmVwb3NpdG9yeS4gVGhpcyBlc3RhYmxpc2hlcyBhIGJpZworICAgcGFjayB0aGF0IGNvbnRhaW5zIHRoZSBpbml0aWFsIHNldCBvZiBvYmplY3RzIGFzIHRoZQorICAgYmFzZWxpbmUsIGFuZCBwb3NzaWJseSBgZ2l0IHBydW5lYCBpZiB0aGUgdHJhbnNwb3J0CisgICB1c2VkIGZvciBwdWxsaW5nIGZyb20geW91ciByZXBvc2l0b3J5IHN1cHBvcnRzIHBhY2tlZAorICAgcmVwb3NpdG9yaWVzLgorCis1LiBLZWVwIHdvcmtpbmcgaW4geW91ciBwcmltYXJ5IHJlcG9zaXRvcnkuIFlvdXIgY2hhbmdlcworICAgaW5jbHVkZSBtb2RpZmljYXRpb25zIG9mIHlvdXIgb3duLCBwYXRjaGVzIHlvdSByZWNlaXZlIHZpYQorICAgZS1tYWlscywgYW5kIG1lcmdlcyByZXN1bHRpbmcgZnJvbSBwdWxsaW5nIHRoZSAicHVibGljIgorICAgcmVwb3NpdG9yaWVzIG9mIHlvdXIgInN1YnN5c3RlbSBtYWludGFpbmVycyIuCisrCitZb3UgY2FuIHJlcGFjayB0aGlzIHByaXZhdGUgcmVwb3NpdG9yeSB3aGVuZXZlciB5b3UgZmVlbCBsaWtlLgorCis2LiBQdXNoIHlvdXIgY2hhbmdlcyB0byB0aGUgcHVibGljIHJlcG9zaXRvcnksIGFuZCBhbm5vdW5jZSBpdAorICAgdG8gdGhlIHB1YmxpYy4KKworNy4gRXZlcnkgb25jZSBpbiBhIHdoaWxlLCAiZ2l0IHJlcGFjayIgdGhlIHB1YmxpYyByZXBvc2l0b3J5LgorICAgR28gYmFjayB0byBzdGVwIDUuIGFuZCBjb250aW51ZSB3b3JraW5nLgorCisKK0EgcmVjb21tZW5kZWQgd29yayBjeWNsZSBmb3IgYSAic3Vic3lzdGVtIG1haW50YWluZXIiIHdobyB3b3Jrcworb24gdGhhdCBwcm9qZWN0IGFuZCBoYXMgYW4gb3duICJwdWJsaWMgcmVwb3NpdG9yeSIgZ29lcyBsaWtlIHRoaXM6CisKKzEuIFByZXBhcmUgeW91ciB3b3JrIHJlcG9zaXRvcnksIGJ5IGBnaXQgY2xvbmVgIHRoZSBwdWJsaWMKKyAgIHJlcG9zaXRvcnkgb2YgdGhlICJwcm9qZWN0IGxlYWQiLiBUaGUgVVJMIHVzZWQgZm9yIHRoZQorICAgaW5pdGlhbCBjbG9uaW5nIGlzIHN0b3JlZCBpbiBgLmdpdC9yZW1vdGVzL29yaWdpbmAuCisKKzIuIFByZXBhcmUgYSBwdWJsaWMgcmVwb3NpdG9yeSBhY2Nlc3NpYmxlIHRvIG90aGVycywganVzdCBsaWtlCisgICB0aGUgInByb2plY3QgbGVhZCIgcGVyc29uIGRvZXMuCisKKzMuIENvcHkgb3ZlciB0aGUgcGFja2VkIGZpbGVzIGZyb20gInByb2plY3QgbGVhZCIgcHVibGljCisgICByZXBvc2l0b3J5IHRvIHlvdXIgcHVibGljIHJlcG9zaXRvcnksIHVubGVzcyB0aGUgInByb2plY3QKKyAgIGxlYWQiIHJlcG9zaXRvcnkgbGl2ZXMgb24gdGhlIHNhbWUgbWFjaGluZSBhcyB5b3Vycy4gIEluIHRoZQorICAgbGF0dGVyIGNhc2UsIHlvdSBjYW4gdXNlIGBvYmplY3RzL2luZm8vYWx0ZXJuYXRlc2AgZmlsZSB0bworICAgcG9pbnQgYXQgdGhlIHJlcG9zaXRvcnkgeW91IGFyZSBib3Jyb3dpbmcgZnJvbS4KKworNC4gUHVzaCBpbnRvIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBmcm9tIHlvdXIgcHJpbWFyeQorICAgcmVwb3NpdG9yeS4gUnVuIGBnaXQgcmVwYWNrYCwgYW5kIHBvc3NpYmx5IGBnaXQgcHJ1bmVgIGlmIHRoZQorICAgdHJhbnNwb3J0IHVzZWQgZm9yIHB1bGxpbmcgZnJvbSB5b3VyIHJlcG9zaXRvcnkgc3VwcG9ydHMKKyAgIHBhY2tlZCByZXBvc2l0b3JpZXMuCisKKzUuIEtlZXAgd29ya2luZyBpbiB5b3VyIHByaW1hcnkgcmVwb3NpdG9yeS4gWW91ciBjaGFuZ2VzCisgICBpbmNsdWRlIG1vZGlmaWNhdGlvbnMgb2YgeW91ciBvd24sIHBhdGNoZXMgeW91IHJlY2VpdmUgdmlhCisgICBlLW1haWxzLCBhbmQgbWVyZ2VzIHJlc3VsdGluZyBmcm9tIHB1bGxpbmcgdGhlICJwdWJsaWMiCisgICByZXBvc2l0b3JpZXMgb2YgeW91ciAicHJvamVjdCBsZWFkIiBhbmQgcG9zc2libHkgeW91cgorICAgInN1Yi1zdWJzeXN0ZW0gbWFpbnRhaW5lcnMiLgorKworWW91IGNhbiByZXBhY2sgdGhpcyBwcml2YXRlIHJlcG9zaXRvcnkgd2hlbmV2ZXIgeW91IGZlZWwKK2xpa2UuCisKKzYuIFB1c2ggeW91ciBjaGFuZ2VzIHRvIHlvdXIgcHVibGljIHJlcG9zaXRvcnksIGFuZCBhc2sgeW91cgorICAgInByb2plY3QgbGVhZCIgYW5kIHBvc3NpYmx5IHlvdXIgInN1Yi1zdWJzeXN0ZW0KKyAgIG1haW50YWluZXJzIiB0byBwdWxsIGZyb20gaXQuCisKKzcuIEV2ZXJ5IG9uY2UgaW4gYSB3aGlsZSwgYGdpdCByZXBhY2tgIHRoZSBwdWJsaWMgcmVwb3NpdG9yeS4KKyAgIEdvIGJhY2sgdG8gc3RlcCA1LiBhbmQgY29udGludWUgd29ya2luZy4KKworCitBIHJlY29tbWVuZGVkIHdvcmsgY3ljbGUgZm9yIGFuICJpbmRpdmlkdWFsIGRldmVsb3BlciIgd2hvIGRvZXMKK25vdCBoYXZlIGEgInB1YmxpYyIgcmVwb3NpdG9yeSBpcyBzb21ld2hhdCBkaWZmZXJlbnQuIEl0IGdvZXMKK2xpa2UgdGhpczoKKworMS4gUHJlcGFyZSB5b3VyIHdvcmsgcmVwb3NpdG9yeSwgYnkgYGdpdCBjbG9uZWAgdGhlIHB1YmxpYworICAgcmVwb3NpdG9yeSBvZiB0aGUgInByb2plY3QgbGVhZCIgKG9yIGEgInN1YnN5c3RlbQorICAgbWFpbnRhaW5lciIsIGlmIHlvdSB3b3JrIG9uIGEgc3Vic3lzdGVtKS4gVGhlIFVSTCB1c2VkIGZvcgorICAgdGhlIGluaXRpYWwgY2xvbmluZyBpcyBzdG9yZWQgaW4gYC5naXQvcmVtb3Rlcy9vcmlnaW5gLgorCisyLiBEbyB5b3VyIHdvcmsgaW4geW91ciByZXBvc2l0b3J5IG9uICdtYXN0ZXInIGJyYW5jaC4KKworMy4gUnVuIGBnaXQgZmV0Y2ggb3JpZ2luYCBmcm9tIHRoZSBwdWJsaWMgcmVwb3NpdG9yeSBvZiB5b3VyCisgICB1cHN0cmVhbSBldmVyeSBvbmNlIGluIGEgd2hpbGUuIFRoaXMgZG9lcyBvbmx5IHRoZSBmaXJzdAorICAgaGFsZiBvZiBgZ2l0IHB1bGxgIGJ1dCBkb2VzIG5vdCBtZXJnZS4gVGhlIGhlYWQgb2YgdGhlCisgICBwdWJsaWMgcmVwb3NpdG9yeSBpcyBzdG9yZWQgaW4gYC5naXQvcmVmcy9oZWFkcy9vcmlnaW5gLgorCis0LiBVc2UgYGdpdCBjaGVycnkgb3JpZ2luYCB0byBzZWUgd2hpY2ggb25lcyBvZiB5b3VyIHBhdGNoZXMKKyAgIHdlcmUgYWNjZXB0ZWQsIGFuZC9vciB1c2UgYGdpdCByZWJhc2Ugb3JpZ2luYCB0byBwb3J0IHlvdXIKKyAgIHVubWVyZ2VkIGNoYW5nZXMgZm9yd2FyZCB0byB0aGUgdXBkYXRlZCB1cHN0cmVhbS4KKworNS4gVXNlIGBnaXQgZm9ybWF0LXBhdGNoIG9yaWdpbmAgdG8gcHJlcGFyZSBwYXRjaGVzIGZvciBlLW1haWwKKyAgIHN1Ym1pc3Npb24gdG8geW91ciB1cHN0cmVhbSBhbmQgc2VuZCBpdCBvdXQuIEdvIGJhY2sgdG8KKyAgIHN0ZXAgMi4gYW5kIGNvbnRpbnVlLgorCisKK1dvcmtpbmcgd2l0aCBPdGhlcnMsIFNoYXJlZCBSZXBvc2l0b3J5IFN0eWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYXJlIGNvbWluZyBmcm9tIENWUyBiYWNrZ3JvdW5kLCB0aGUgc3R5bGUgb2YgY29vcGVyYXRpb24KK3N1Z2dlc3RlZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiBtYXkgYmUgbmV3IHRvIHlvdS4gWW91IGRvIG5vdAoraGF2ZSB0byB3b3JyeS4gZ2l0IHN1cHBvcnRzICJzaGFyZWQgcHVibGljIHJlcG9zaXRvcnkiIHN0eWxlIG9mCitjb29wZXJhdGlvbiB5b3UgYXJlIHByb2JhYmx5IG1vcmUgZmFtaWxpYXIgd2l0aCBhcyB3ZWxsLgorCitTZWUgbGluazpjdnMtbWlncmF0aW9uLnR4dFtnaXQgZm9yIENWUyB1c2Vyc10gZm9yIHRoZSBkZXRhaWxzLgorCitCdW5kbGluZyB5b3VyIHdvcmsgdG9nZXRoZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBsaWtlbHkgdGhhdCB5b3Ugd2lsbCBiZSB3b3JraW5nIG9uIG1vcmUgdGhhbiBvbmUgdGhpbmcgYXQKK2EgdGltZS4gIEl0IGlzIGVhc3kgdG8gbWFuYWdlIHRob3NlIG1vcmUtb3ItbGVzcyBpbmRlcGVuZGVudCB0YXNrcwordXNpbmcgYnJhbmNoZXMgd2l0aCBnaXQuCisKK1dlIGhhdmUgYWxyZWFkeSBzZWVuIGhvdyBicmFuY2hlcyB3b3JrIHByZXZpb3VzbHksCit3aXRoICJmdW4gYW5kIHdvcmsiIGV4YW1wbGUgdXNpbmcgdHdvIGJyYW5jaGVzLiAgVGhlIGlkZWEgaXMgdGhlCitzYW1lIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gdHdvIGJyYW5jaGVzLiAgTGV0J3Mgc2F5IHlvdSBzdGFydGVkCitvdXQgZnJvbSAibWFzdGVyIiBoZWFkLCBhbmQgaGF2ZSBzb21lIG5ldyBjb2RlIGluIHRoZSAibWFzdGVyIgorYnJhbmNoLCBhbmQgdHdvIGluZGVwZW5kZW50IGZpeGVzIGluIHRoZSAiY29tbWl0LWZpeCIgYW5kCisiZGlmZi1maXgiIGJyYW5jaGVzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoCishIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAhIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgICogW21hc3Rlcl0gUmVsZWFzZSBjYW5kaWRhdGUgIzEKKy0tLQorICsgIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgKyAgW2RpZmYtZml4fjFdIEJldHRlciBjb21tb24gc3Vic3RyaW5nIGFsZ29yaXRobS4KKysgICBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgICogW21hc3Rlcl0gUmVsZWFzZSBjYW5kaWRhdGUgIzEKKysrKiBbZGlmZi1maXh+Ml0gUHJldHR5LXByaW50IG1lc3NhZ2VzLgorLS0tLS0tLS0tLS0tCisKK0JvdGggZml4ZXMgYXJlIHRlc3RlZCB3ZWxsLCBhbmQgYXQgdGhpcyBwb2ludCwgeW91IHdhbnQgdG8gbWVyZ2UKK2luIGJvdGggb2YgdGhlbS4gIFlvdSBjb3VsZCBtZXJnZSBpbiAnZGlmZi1maXgnIGZpcnN0IGFuZCB0aGVuCisnY29tbWl0LWZpeCcgbmV4dCwgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IG1lcmdlICdNZXJnZSBmaXggaW4gZGlmZi1maXgnIG1hc3RlciBkaWZmLWZpeAorJCBnaXQgbWVyZ2UgJ01lcmdlIGZpeCBpbiBjb21taXQtZml4JyBtYXN0ZXIgY29tbWl0LWZpeAorLS0tLS0tLS0tLS0tCisKK1doaWNoIHdvdWxkIHJlc3VsdCBpbjoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaAorISBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgISBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICAqIFttYXN0ZXJdIE1lcmdlIGZpeCBpbiBjb21taXQtZml4CistLS0KKyAgLSBbbWFzdGVyXSBNZXJnZSBmaXggaW4gY29tbWl0LWZpeAorKyAqIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyAgLSBbbWFzdGVyfjFdIE1lcmdlIGZpeCBpbiBkaWZmLWZpeAorICsqIFtkaWZmLWZpeF0gRml4IHJlbmFtZSBkZXRlY3Rpb24uCisgKyogW2RpZmYtZml4fjFdIEJldHRlciBjb21tb24gc3Vic3RyaW5nIGFsZ29yaXRobS4KKyAgKiBbbWFzdGVyfjJdIFJlbGVhc2UgY2FuZGlkYXRlICMxCisrKyogW21hc3Rlcn4zXSBQcmV0dHktcHJpbnQgbWVzc2FnZXMuCistLS0tLS0tLS0tLS0KKworSG93ZXZlciwgdGhlcmUgaXMgbm8gcGFydGljdWxhciByZWFzb24gdG8gbWVyZ2UgaW4gb25lIGJyYW5jaAorZmlyc3QgYW5kIHRoZSBvdGhlciBuZXh0LCB3aGVuIHdoYXQgeW91IGhhdmUgYXJlIGEgc2V0IG9mIHRydWx5CitpbmRlcGVuZGVudCBjaGFuZ2VzIChpZiB0aGUgb3JkZXIgbWF0dGVyZWQsIHRoZW4gdGhleSBhcmUgbm90CitpbmRlcGVuZGVudCBieSBkZWZpbml0aW9uKS4gIFlvdSBjb3VsZCBpbnN0ZWFkIG1lcmdlIHRob3NlIHR3bworYnJhbmNoZXMgaW50byB0aGUgY3VycmVudCBicmFuY2ggYXQgb25jZS4gIEZpcnN0IGxldCdzIHVuZG8gd2hhdAord2UganVzdCBkaWQgYW5kIHN0YXJ0IG92ZXIuICBXZSB3b3VsZCB3YW50IHRvIGdldCB0aGUgbWFzdGVyCiticmFuY2ggYmVmb3JlIHRoZXNlIHR3byBtZXJnZXMgYnkgcmVzZXR0aW5nIGl0IHRvICdtYXN0ZXJ+Mic6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVzZXQgLS1oYXJkIG1hc3Rlcn4yCistLS0tLS0tLS0tLS0KKworWW91IGNhbiBtYWtlIHN1cmUgJ2dpdCBzaG93LWJyYW5jaCcgbWF0Y2hlcyB0aGUgc3RhdGUgYmVmb3JlCit0aG9zZSB0d28gJ2dpdCBtZXJnZScgeW91IGp1c3QgZGlkLiAgVGhlbiwgaW5zdGVhZCBvZiBydW5uaW5nCit0d28gJ2dpdCBtZXJnZScgY29tbWFuZHMgaW4gYSByb3csIHlvdSB3b3VsZCBwdWxsIHRoZXNlIHR3bworYnJhbmNoIGhlYWRzICh0aGlzIGlzIGtub3duIGFzICdtYWtpbmcgYW4gT2N0b3B1cycpOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgLiBjb21taXQtZml4IGRpZmYtZml4CiskIGdpdCBzaG93LWJyYW5jaAorISBbY29tbWl0LWZpeF0gRml4IGNvbW1pdCBtZXNzYWdlIG5vcm1hbGl6YXRpb24uCisgISBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICAqIFttYXN0ZXJdIE9jdG9wdXMgbWVyZ2Ugb2YgYnJhbmNoZXMgJ2RpZmYtZml4JyBhbmQgJ2NvbW1pdC1maXgnCistLS0KKyAgLSBbbWFzdGVyXSBPY3RvcHVzIG1lcmdlIG9mIGJyYW5jaGVzICdkaWZmLWZpeCcgYW5kICdjb21taXQtZml4JworKyAqIFtjb21taXQtZml4XSBGaXggY29tbWl0IG1lc3NhZ2Ugbm9ybWFsaXphdGlvbi4KKyArKiBbZGlmZi1maXhdIEZpeCByZW5hbWUgZGV0ZWN0aW9uLgorICsqIFtkaWZmLWZpeH4xXSBCZXR0ZXIgY29tbW9uIHN1YnN0cmluZyBhbGdvcml0aG0uCisgICogW21hc3Rlcn4xXSBSZWxlYXNlIGNhbmRpZGF0ZSAjMQorKysqIFttYXN0ZXJ+Ml0gUHJldHR5LXByaW50IG1lc3NhZ2VzLgorLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBkbyBPY3RvcHVzIGJlY2F1c2UgeW91IGNhbi4gIEFuIG9jdG9wdXMKK2lzIGEgdmFsaWQgdGhpbmcgdG8gZG8gYW5kIG9mdGVuIG1ha2VzIGl0IGVhc2llciB0byB2aWV3IHRoZQorY29tbWl0IGhpc3RvcnkgaWYgeW91IGFyZSBwdWxsaW5nIG1vcmUgdGhhbiB0d28gaW5kZXBlbmRlbnQKK2NoYW5nZXMgYXQgdGhlIHNhbWUgdGltZS4gIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIG1lcmdlIGNvbmZsaWN0cword2l0aCBhbnkgb2YgdGhlIGJyYW5jaGVzIHlvdSBhcmUgbWVyZ2luZyBpbiBhbmQgbmVlZCB0byBoYW5kCityZXNvbHZlLCB0aGF0IGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgZGV2ZWxvcG1lbnQgaGFwcGVuZWQgaW4KK3Rob3NlIGJyYW5jaGVzIHdlcmUgbm90IGluZGVwZW5kZW50IGFmdGVyIGFsbCwgYW5kIHlvdSBzaG91bGQKK21lcmdlIHR3byBhdCBhIHRpbWUsIGRvY3VtZW50aW5nIGhvdyB5b3UgcmVzb2x2ZWQgdGhlIGNvbmZsaWN0cywKK2FuZCB0aGUgcmVhc29uIHdoeSB5b3UgcHJlZmVycmVkIGNoYW5nZXMgbWFkZSBpbiBvbmUgc2lkZSBvdmVyCit0aGUgb3RoZXIuICBPdGhlcndpc2UgaXQgd291bGQgbWFrZSB0aGUgcHJvamVjdCBoaXN0b3J5IGhhcmRlcgordG8gZm9sbG93LCBub3QgZWFzaWVyLgorCitbIHRvIGJlIGNvbnRpbnVlZC4uIGN2c2ltcG9ydHMgXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jdnMtbWlncmF0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vY3ZzLW1pZ3JhdGlvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiMGJkMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY3ZzLW1pZ3JhdGlvbi50eHQKQEAgLTAsMCArMSwzMDQgQEAKK2dpdCBmb3IgQ1ZTIHVzZXJzCis9PT09PT09PT09PT09PT09PQorCitTbyB5b3UncmUgYSBDVlMgdXNlci4gVGhhdCdzIE9LLCBpdCdzIGEgdHJlYXRhYmxlIGNvbmRpdGlvbi4gIFRoZSBqb2Igb2YKK3RoaXMgZG9jdW1lbnQgaXMgdG8gcHV0IHlvdSBvbiB0aGUgcm9hZCB0byByZWNvdmVyeSwgYnkgaGVscGluZyB5b3UKK2NvbnZlcnQgYW4gZXhpc3RpbmcgY3ZzIHJlcG9zaXRvcnkgdG8gZ2l0LCBhbmQgYnkgc2hvd2luZyB5b3UgaG93IHRvIHVzZSBhCitnaXQgcmVwb3NpdG9yeSBpbiBhIGN2cy1saWtlIGZhc2hpb24uCisKK1NvbWUgYmFzaWMgZmFtaWxpYXJpdHkgd2l0aCBnaXQgaXMgcmVxdWlyZWQuICBUaGlzCitsaW5rOnR1dG9yaWFsLmh0bWxbdHV0b3JpYWwgaW50cm9kdWN0aW9uIHRvIGdpdF0gc2hvdWxkIGJlIHN1ZmZpY2llbnQuCisKK0ZpcnN0LCBub3RlIHNvbWUgd2F5cyB0aGF0IGdpdCBkaWZmZXJzIGZyb20gQ1ZTOgorCisgICogQ29tbWl0cyBhcmUgYXRvbWljIGFuZCBwcm9qZWN0LXdpZGUsIG5vdCBwZXItZmlsZSBhcyBpbiBDVlMuCisKKyAgKiBPZmZsaW5lIHdvcmsgaXMgc3VwcG9ydGVkOiB5b3UgY2FuIG1ha2UgbXVsdGlwbGUgY29tbWl0cyBsb2NhbGx5LAorICAgIHRoZW4gc3VibWl0IHRoZW0gd2hlbiB5b3UncmUgcmVhZHkuCisKKyAgKiBCcmFuY2hpbmcgaXMgZmFzdCBhbmQgZWFzeS4KKworICAqIEV2ZXJ5IHdvcmtpbmcgdHJlZSBjb250YWlucyBhIHJlcG9zaXRvcnkgd2l0aCBhIGZ1bGwgY29weSBvZiB0aGUKKyAgICBwcm9qZWN0IGhpc3RvcnksIGFuZCBubyByZXBvc2l0b3J5IGlzIGluaGVyZW50bHkgbW9yZSBpbXBvcnRhbnQgdGhhbgorICAgIGFueSBvdGhlci4gIEhvd2V2ZXIsIHlvdSBjYW4gZW11bGF0ZSB0aGUgQ1ZTIG1vZGVsIGJ5IGRlc2lnbmF0aW5nIGEKKyAgICBzaW5nbGUgc2hhcmVkIHJlcG9zaXRvcnkgd2hpY2ggcGVvcGxlIGNhbiBzeW5jaHJvbml6ZSB3aXRoOyBzZWUgYmVsb3cKKyAgICBmb3IgZGV0YWlscy4KKworSW1wb3J0aW5nIGEgQ1ZTIGFyY2hpdmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpcnN0LCBpbnN0YWxsIHZlcnNpb24gMi4xIG9yIGhpZ2hlciBvZiBjdnNwcyBmcm9tCitsaW5rOmh0dHA6Ly93d3cuY29iaXRlLmNvbS9jdnNwcy9baHR0cDovL3d3dy5jb2JpdGUuY29tL2N2c3BzL10gYW5kIG1ha2UKK3N1cmUgaXQgaXMgaW4geW91ciBwYXRoLiAgVGhlIG1hZ2ljIGNvbW1hbmQgbGluZSBpcyB0aGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGN2c2ltcG9ydCAtdiAtZCA8Y3Zzcm9vdD4gLUMgPGRlc3RpbmF0aW9uPiA8bW9kdWxlPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHB1dHMgYSBnaXQgYXJjaGl2ZSBvZiB0aGUgbmFtZWQgQ1ZTIG1vZHVsZSBpbiB0aGUgZGlyZWN0b3J5Cis8ZGVzdGluYXRpb24+LCB3aGljaCB3aWxsIGJlIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LiAgVGhlIC12IG9wdGlvbiBtYWtlcwordGhlIGNvbnZlcnNpb24gc2NyaXB0IHZlcnkgY2hhdHR5LgorCitUaGUgaW1wb3J0IGNoZWNrcyBvdXQgZnJvbSBDVlMgZXZlcnkgcmV2aXNpb24gb2YgZXZlcnkgZmlsZS4gIFJlcG9ydGVkbHkKK2N2c2ltcG9ydCBjYW4gYXZlcmFnZSBzb21lIHR3ZW50eSByZXZpc2lvbnMgcGVyIHNlY29uZCwgc28gZm9yIGEKK21lZGl1bS1zaXplZCBwcm9qZWN0IHRoaXMgc2hvdWxkIG5vdCB0YWtlIG1vcmUgdGhhbiBhIGNvdXBsZSBvZiBtaW51dGVzLgorTGFyZ2VyIHByb2plY3RzIG9yIHJlbW90ZSByZXBvc2l0b3JpZXMgbWF5IHRha2UgbG9uZ2VyLgorCitUaGUgbWFpbiB0cnVuayBpcyBzdG9yZWQgaW4gdGhlIGdpdCBicmFuY2ggbmFtZWQgYG9yaWdpbmAsIGFuZCBhZGRpdGlvbmFsCitDVlMgYnJhbmNoZXMgYXJlIHN0b3JlZCBpbiBnaXQgYnJhbmNoZXMgd2l0aCB0aGUgc2FtZSBuYW1lcy4gIFRoZSBtb3N0CityZWNlbnQgdmVyc2lvbiBvZiB0aGUgbWFpbiB0cnVuayBpcyBhbHNvIGxlZnQgY2hlY2tlZCBvdXQgb24gdGhlIGBtYXN0ZXJgCiticmFuY2gsIHNvIHlvdSBjYW4gc3RhcnQgYWRkaW5nIHlvdXIgb3duIGNoYW5nZXMgcmlnaHQgYXdheS4KKworVGhlIGltcG9ydCBpcyBpbmNyZW1lbnRhbCwgc28gaWYgeW91IGNhbGwgaXQgYWdhaW4gbmV4dCBtb250aCBpdCB3aWxsCitmZXRjaCBhbnkgQ1ZTIHVwZGF0ZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiB0aGUgbWVhbnRpbWUuICBGb3IgdGhpcyB0bword29yaywgeW91IG11c3Qgbm90IG1vZGlmeSB0aGUgaW1wb3J0ZWQgYnJhbmNoZXM7IGluc3RlYWQsIGNyZWF0ZSBuZXcKK2JyYW5jaGVzIGZvciB5b3VyIG93biBjaGFuZ2VzLCBhbmQgbWVyZ2UgaW4gdGhlIGltcG9ydGVkIGJyYW5jaGVzIGFzCituZWNlc3NhcnkuCisKK0RldmVsb3BtZW50IE1vZGVscworLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NWUyB1c2VycyBhcmUgYWNjdXN0b21lZCB0byBnaXZpbmcgYSBncm91cCBvZiBkZXZlbG9wZXJzIGNvbW1pdCBhY2Nlc3MgdG8KK2EgY29tbW9uIHJlcG9zaXRvcnkuICBJbiB0aGUgbmV4dCBzZWN0aW9uIHdlJ2xsIGV4cGxhaW4gaG93IHRvIGRvIHRoaXMKK3dpdGggZ2l0LiAgSG93ZXZlciwgdGhlIGRpc3RyaWJ1dGVkIG5hdHVyZSBvZiBnaXQgYWxsb3dzIG90aGVyIGRldmVsb3BtZW50Cittb2RlbHMsIGFuZCB5b3UgbWF5IHdhbnQgdG8gZmlyc3QgY29uc2lkZXIgd2hldGhlciBvbmUgb2YgdGhlbSBtaWdodCBiZSBhCitiZXR0ZXIgZml0IGZvciB5b3VyIHByb2plY3QuCisKK0ZvciBleGFtcGxlLCB5b3UgY2FuIGNob29zZSBhIHNpbmdsZSBwZXJzb24gdG8gbWFpbnRhaW4gdGhlIHByb2plY3QncworcHJpbWFyeSBwdWJsaWMgcmVwb3NpdG9yeS4gIE90aGVyIGRldmVsb3BlcnMgdGhlbiBjbG9uZSB0aGlzIHJlcG9zaXRvcnkKK2FuZCBlYWNoIHdvcmsgaW4gdGhlaXIgb3duIGNsb25lLiAgV2hlbiB0aGV5IGhhdmUgYSBzZXJpZXMgb2YgY2hhbmdlcyB0aGF0Cit0aGV5J3JlIGhhcHB5IHdpdGgsIHRoZXkgYXNrIHRoZSBtYWludGFpbmVyIHRvIHB1bGwgZnJvbSB0aGUgYnJhbmNoCitjb250YWluaW5nIHRoZSBjaGFuZ2VzLiAgVGhlIG1haW50YWluZXIgcmV2aWV3cyB0aGVpciBjaGFuZ2VzIGFuZCBwdWxscwordGhlbSBpbnRvIHRoZSBwcmltYXJ5IHJlcG9zaXRvcnksIHdoaWNoIG90aGVyIGRldmVsb3BlcnMgcHVsbCBmcm9tIGFzCituZWNlc3NhcnkgdG8gc3RheSBjb29yZGluYXRlZC4gIFRoZSBMaW51eCBrZXJuZWwgYW5kIG90aGVyIHByb2plY3RzIHVzZQordmFyaWFudHMgb2YgdGhpcyBtb2RlbC4KKworV2l0aCBhIHNtYWxsIGdyb3VwLCBkZXZlbG9wZXJzIG1heSBqdXN0IHB1bGwgY2hhbmdlcyBmcm9tIGVhY2ggb3RoZXIncworcmVwb3NpdG9yaWVzIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGEgY2VudHJhbCBtYWludGFpbmVyLgorCitFbXVsYXRpbmcgdGhlIENWUyBEZXZlbG9wbWVudCBNb2RlbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3RhcnQgd2l0aCBhbiBvcmRpbmFyeSBnaXQgd29ya2luZyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJvamVjdCwgYW5kCityZW1vdmUgdGhlIGNoZWNrZWQtb3V0IGZpbGVzLCBrZWVwaW5nIGp1c3QgdGhlIGJhcmUgLmdpdCBkaXJlY3Rvcnk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBtdiBwcm9qZWN0Ly5naXQgL3B1Yi9yZXBvLmdpdAorJCBybSAtciBwcm9qZWN0LworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05leHQsIGdpdmUgZXZlcnkgdGVhbSBtZW1iZXIgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhpcyByZXBvc2l0b3J5LiAgT25lCitlYXN5IHdheSB0byBkbyB0aGlzIGlzIHRvIGdpdmUgYWxsIHRoZSB0ZWFtIG1lbWJlcnMgc3NoIGFjY2VzcyB0byB0aGUKK21hY2hpbmUgd2hlcmUgdGhlIHJlcG9zaXRvcnkgaXMgaG9zdGVkLiAgSWYgeW91IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGVtIGEKK2Z1bGwgc2hlbGwgb24gdGhlIG1hY2hpbmUsIHRoZXJlIGlzIGEgcmVzdHJpY3RlZCBzaGVsbCB3aGljaCBvbmx5IGFsbG93cwordXNlcnMgdG8gZG8gZ2l0IHB1c2hlcyBhbmQgcHVsbHM7IHNlZSBnaXRsaW5rOmdpdC1zaGVsbFsxXS4KKworUHV0IGFsbCB0aGUgY29tbWl0dGVycyBpbiB0aGUgc2FtZSBncm91cCwgYW5kIG1ha2UgdGhlIHJlcG9zaXRvcnkKK3dyaXRhYmxlIGJ5IHRoYXQgZ3JvdXA6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjaGdycCAtUiAkZ3JvdXAgcmVwby5naXQKKyQgZmluZCByZXBvLmdpdCAtbWluZGVwdGggMSAtdHlwZSBkIHx4YXJncyBjaG1vZCB1Zytyd3gsZytzCiskIEdJVF9ESVI9cmVwby5naXQgZ2l0IHJlcG8tY29uZmlnIGNvcmUuc2hhcmVkcmVwb3NpdG9yeSB0cnVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWFrZSBzdXJlIGNvbW1pdHRlcnMgaGF2ZSBhIHVtYXNrIG9mIGF0IG1vc3QgMDI3LCBzbyB0aGF0IHRoZSBkaXJlY3RvcmllcwordGhleSBjcmVhdGUgYXJlIHdyaXRhYmxlIGFuZCBzZWFyY2hhYmxlIGJ5IG90aGVyIGdyb3VwIG1lbWJlcnMuCisKK1N1cHBvc2UgdGhpcyByZXBvc2l0b3J5IGlzIG5vdyBzZXQgdXAgaW4gL3B1Yi9yZXBvLmdpdCBvbiB0aGUgaG9zdAorZm9vLmNvbS4gIFRoZW4gYXMgYW4gaW5kaXZpZHVhbCBjb21taXR0ZXIgeW91IGNhbiBjbG9uZSB0aGUgc2hhcmVkCityZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGZvby5jb206L3B1Yi9yZXBvLmdpdC8gbXktcHJvamVjdAorJCBjZCBteS1wcm9qZWN0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGhhY2sgYXdheS4gIFRoZSBlcXVpdmFsZW50IG9mIGBjdnMgdXBkYXRlYCBpcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2hpY2ggbWVyZ2VzIGluIGFueSB3b3JrIHRoYXQgb3RoZXJzIG1pZ2h0IGhhdmUgZG9uZSBzaW5jZSB0aGUgY2xvbmUKK29wZXJhdGlvbi4KKworW05PVEVdCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIGZpcnN0IGBnaXQgY2xvbmVgIHBsYWNlcyB0aGUgZm9sbG93aW5nIGluIHRoZQorYG15LXByb2plY3QvLmdpdC9yZW1vdGVzL29yaWdpbmAgZmlsZSwgYW5kIHRoYXQncyB3aHkgdGhlIHByZXZpb3VzIHN0ZXAKK2FuZCB0aGUgbmV4dCBzdGVwIGJvdGggd29yay4KKy0tLS0tLS0tLS0tLQorVVJMOiBmb28uY29tOi9wdWIvcHJvamVjdC5naXQvIG15LXByb2plY3QKK1B1bGw6IG1hc3RlcjpvcmlnaW4KKy0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiB1cGRhdGUgdGhlIHNoYXJlZCByZXBvc2l0b3J5IHdpdGggeW91ciBjaGFuZ2VzIHVzaW5nOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggb3JpZ2luIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHNvbWVvbmUgZWxzZSBoYXMgdXBkYXRlZCB0aGUgcmVwb3NpdG9yeSBtb3JlIHJlY2VudGx5LCBgZ2l0IHB1c2hgLCBsaWtlCitgY3ZzIGNvbW1pdGAsIHdpbGwgY29tcGxhaW4sIGluIHdoaWNoIGNhc2UgeW91IG11c3QgcHVsbCBhbnkgY2hhbmdlcworYmVmb3JlIGF0dGVtcHRpbmcgdGhlIHB1c2ggYWdhaW4uCisKK0luIHRoZSBgZ2l0IHB1c2hgIGNvbW1hbmQgYWJvdmUgd2Ugc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGJyYW5jaAordG8gdXBkYXRlIChgbWFzdGVyYCkuICBJZiB3ZSBsZWF2ZSB0aGF0IG91dCwgYGdpdCBwdXNoYCB0cmllcyB0byB1cGRhdGUKK2FueSBicmFuY2hlcyBpbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYSBicmFuY2gKK2luIHRoZSBsb2NhbCByZXBvc2l0b3J5LiAgU28gdGhlIGxhc3QgYHB1c2hgIGNhbiBiZSBkb25lIHdpdGggZWl0aGVyIG9mOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1c2ggb3JpZ2luCiskIGdpdCBwdXNoIHJlcG8uc2hhcmVkLnh6Oi9wdWIvc2NtL3Byb2plY3QuZ2l0LworLS0tLS0tLS0tLS0tCisKK2FzIGxvbmcgYXMgdGhlIHNoYXJlZCByZXBvc2l0b3J5IGRvZXMgbm90IGhhdmUgYW55IGJyYW5jaGVzCitvdGhlciB0aGFuIGBtYXN0ZXJgLgorCitbTk9URV0KKz09PT09PT09PT09PQorQmVjYXVzZSBvZiB0aGlzIGJlaGF2aW9yLCBpZiB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgYW5kIHRoZSBkZXZlbG9wZXIncworcmVwb3NpdG9yeSBib3RoIGhhdmUgYnJhbmNoZXMgbmFtZWQgYG9yaWdpbmAsIHRoZW4gYSBwdXNoIGxpa2UgdGhlIGFib3ZlCithdHRlbXB0cyB0byB1cGRhdGUgdGhlIGBvcmlnaW5gIGJyYW5jaCBpbiB0aGUgc2hhcmVkIHJlcG9zaXRvcnkgZnJvbSB0aGUKK2RldmVsb3BlcidzIGBvcmlnaW5gIGJyYW5jaC4gIFRoZSByZXN1bHRzIG1heSBiZSB1bmV4cGVjdGVkLCBzbyBpdCdzCit1c3VhbGx5IGJlc3QgdG8gcmVtb3ZlIGFueSBicmFuY2ggbmFtZWQgYG9yaWdpbmAgZnJvbSB0aGUgc2hhcmVkCityZXBvc2l0b3J5LgorPT09PT09PT09PT09CisKK0FkdmFuY2VkIFNoYXJlZCBSZXBvc2l0b3J5IE1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworR2l0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBzY3JpcHRzIGNhbGxlZCAiaG9va3MiIHRvIGJlIHJ1biBhdCBjZXJ0YWluCitwb2ludHMuICBZb3UgY2FuIHVzZSB0aGVzZSwgZm9yIGV4YW1wbGUsIHRvIHNlbmQgYWxsIGNvbW1pdHMgdG8gdGhlIHNoYXJlZAorcmVwb3NpdG9yeSB0byBhIG1haWxpbmcgbGlzdC4gIFNlZSBsaW5rOmhvb2tzLnR4dFtIb29rcyB1c2VkIGJ5IGdpdF0uCisKK1lvdSBjYW4gZW5mb3JjZSBmaW5lciBncmFpbmVkIHBlcm1pc3Npb25zIHVzaW5nIHVwZGF0ZSBob29rcy4gIFNlZQorbGluazpob3d0by91cGRhdGUtaG9vay1leGFtcGxlLnR4dFtDb250cm9sbGluZyBhY2Nlc3MgdG8gYnJhbmNoZXMgdXNpbmcKK3VwZGF0ZSBob29rc10uCisKK0NWUyBhbm5vdGF0ZQorLS0tLS0tLS0tLS0tCisKK1NvLCBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcsIGFuZCB5b3UgZG9uJ3Qga25vdyB3aG9tIHRvIGJsYW1lLCBhbmQKK3lvdSdyZSBhbiBleC1DVlMgdXNlciBhbmQgdXNlZCB0byBkbyAiY3ZzIGFubm90YXRlIiB0byBzZWUgd2hvIGNhdXNlZAordGhlIGJyZWFrYWdlLiBZb3UncmUgbG9va2luZyBmb3IgdGhlICJnaXQgYW5ub3RhdGUiLCBhbmQgaXQncyBqdXN0CitjbGFpbWluZyBub3QgdG8gZmluZCBzdWNoIGEgc2NyaXB0LiBZb3UncmUgYW5ub3llZC4KKworWWVzLCB0aGF0J3MgcmlnaHQuICBDb3JlIGdpdCBkb2Vzbid0IGRvICJhbm5vdGF0ZSIsIGFsdGhvdWdoIGl0J3MKK3RlY2huaWNhbGx5IHBvc3NpYmxlLCBhbmQgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBzcGVjaWFsaXplZCBzY3JpcHRzIG91dAordGhlcmUgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgZXF1aXZhbGVudCBpbmZvcm1hdGlvbiAoc2VlIHRoZSBnaXQKK21haWxpbmcgbGlzdCBhcmNoaXZlcyBmb3IgZGV0YWlscykuIAorCitnaXQgaGFzIGEgY291cGxlIG9mIGFsdGVybmF0aXZlcywgdGhvdWdoLCB0aGF0IHlvdSBtYXkgZmluZCBzdWZmaWNpZW50CitvciBldmVuIHN1cGVyaW9yIGRlcGVuZGluZyBvbiB5b3VyIHVzZS4gIE9uZSBpcyBjYWxsZWQgImdpdC13aGF0Y2hhbmdlZCIKKyhmb3Igb2J2aW91cyByZWFzb25zKSBhbmQgdGhlIG90aGVyIG9uZSBpcyBjYWxsZWQgInBpY2theGUiICgiYSB0b29sIGZvcgordGhlIHNvZnR3YXJlIGFyY2hhZW9sb2dpc3QiKS4gCisKK1RoZSAiZ2l0LXdoYXRjaGFuZ2VkIiBzY3JpcHQgaXMgYSB0cnVseSB0cml2aWFsIHNjcmlwdCB0aGF0IGNhbiBnaXZlIHlvdQorYSBnb29kIG92ZXJ2aWV3IG9mIHdoYXQgaGFzIGNoYW5nZWQgaW4gYSBmaWxlIG9yIGEgZGlyZWN0b3J5IChvciBhbgorYXJiaXRyYXJ5IGxpc3Qgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMpLiAgVGhlICJwaWNrYXhlIiBzdXBwb3J0IGlzIGFuCithZGRpdGlvbmFsIGxheWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gZnVydGhlciBzcGVjaWZ5IGV4YWN0bHkgd2hhdCB5b3UncmUKK2xvb2tpbmcgZm9yLCBpZiB5b3UgYWxyZWFkeSBrbm93IHRoZSBzcGVjaWZpYyBhcmVhIHRoYXQgY2hhbmdlZC4KKworTGV0J3Mgc3RlcCBiYWNrIGEgYml0IGFuZCB0aGluayBhYm91dCB0aGUgcmVhc29uIHdoeSB5b3Ugd291bGQKK3dhbnQgdG8gZG8gImN2cyBhbm5vdGF0ZSBhLWZpbGUuYyIgdG8gYmVnaW4gd2l0aC4KKworWW91IHdvdWxkIHVzZSAiY3ZzIGFubm90YXRlIiBvbiBhIGZpbGUgd2hlbiB5b3UgaGF2ZSB0cm91YmxlCit3aXRoIGEgZnVuY3Rpb24gKG9yIGV2ZW4gYSBzaW5nbGUgImlmIiBzdGF0ZW1lbnQgaW4gYSBmdW5jdGlvbikKK3RoYXQgaGFwcGVucyB0byBiZSBkZWZpbmVkIGluIHRoZSBmaWxlLCB3aGljaCBkb2VzIG5vdCBkbyB3aGF0Cit5b3Ugd2FudCBpdCB0byBkby4gIEFuZCB5b3Ugd291bGQgd2FudCB0byBmaW5kIG91dCB3aHkgaXQgd2FzCit3cml0dGVuIHRoYXQgd2F5LCBiZWNhdXNlIHlvdSBhcmUgYWJvdXQgdG8gbW9kaWZ5IGl0IHRvIHN1aXQKK3lvdXIgbmVlZHMsIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHlvdSBkbyBub3Qgd2FudCB0byBicmVhayBpdHMKK2N1cnJlbnQgY2FsbGVycy4gIEZvciB0aGF0LCB5b3UgYXJlIHRyeWluZyB0byBmaW5kIG91dCB3aHkgdGhlCitvcmlnaW5hbCBhdXRob3IgZGlkIHRoaW5ncyB0aGF0IHdheSBpbiB0aGUgb3JpZ2luYWwgY29udGV4dC4KKworTWFueSB0aW1lcywgaXQgbWF5IGJlIGVub3VnaCB0byBzZWUgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZXMgb2YKK2NvbW1pdHMgdGhhdCB0b3VjaCB0aGUgZmlsZSBpbiBxdWVzdGlvbiwgcG9zc2libHkgYWxvbmcgd2l0aCB0aGUKK3BhdGNoZXMgdGhlbXNlbHZlcywgbGlrZSB0aGlzOgorCisJJCBnaXQtd2hhdGNoYW5nZWQgLXAgYS1maWxlLmMKKworVGhpcyB3aWxsIHNob3cgbG9nIG1lc3NhZ2VzIGFuZCBwYXRjaGVzIGZvciBlYWNoIGNvbW1pdCB0aGF0Cit0b3VjaGVzIGEtZmlsZS4KKworVGhpcywgaG93ZXZlciwgbWF5IG5vdCBiZSB2ZXJ5IHVzZWZ1bCB3aGVuIHRoaXMgZmlsZSBoYXMgbWFueQorbW9kaWZpY2F0aW9ucyB0aGF0IGFyZSBub3QgcmVsYXRlZCB0byB0aGUgcGllY2Ugb2YgY29kZSB5b3UgYXJlCitpbnRlcmVzdGVkIGluLiAgWW91IHdvdWxkIHNlZSBtYW55IGxvZyBtZXNzYWdlcyBhbmQgcGF0Y2hlcyB0aGF0CitkbyBub3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoIHRoZSBwaWVjZSBvZiBjb2RlIHlvdSBhcmUKK2ludGVyZXN0ZWQgaW4uICBBcyBhbiBleGFtcGxlLCBhc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoaXMgcGllY2UKK29mIGNvZGUgdGhhdCB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaW4gdGhlIEhFQUQgdmVyc2lvbjoKKworCWlmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9CisKK3lvdSB3b3VsZCB1c2UgZ2l0LXJldi1saXN0IGFuZCBnaXQtZGlmZi10cmVlIGxpa2UgdGhpczoKKworCSQgZ2l0LXJldi1saXN0IEhFQUQgfAorCSAgZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIC12IC1wIC1TJ2lmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9JworCitXZSBoYXZlIGFscmVhZHkgdGFsa2VkIGFib3V0IHRoZSAiXC0tc3RkaW4iIGZvcm0gb2YgZ2l0LWRpZmYtdHJlZQorY29tbWFuZCB0aGF0IHJlYWRzIHRoZSBsaXN0IG9mIGNvbW1pdHMgYW5kIGNvbXBhcmVzIGVhY2ggY29tbWl0Cit3aXRoIGl0cyBwYXJlbnRzIChvdGhlcndpc2UgeW91IHNob3VsZCBnbyBiYWNrIGFuZCByZWFkIHRoZSB0dXRvcmlhbCkuCitUaGUgZ2l0LXdoYXRjaGFuZ2VkIGNvbW1hbmQgaW50ZXJuYWxseSBydW5zCit0aGUgZXF1aXZhbGVudCBvZiB0aGUgYWJvdmUgY29tbWFuZCwgYW5kIGNhbiBiZSB1c2VkIGxpa2UgdGhpczoKKworCSQgZ2l0LXdoYXRjaGFuZ2VkIC1wIC1TJ2lmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9JworCitXaGVuIHRoZSAtUyBvcHRpb24gaXMgdXNlZCwgZ2l0LWRpZmYtdHJlZSBjb21tYW5kIG91dHB1dHMKK2RpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNvbW1pdHMgb25seSBpZiBvbmUgdHJlZSBoYXMgdGhlCitzcGVjaWZpZWQgc3RyaW5nIGluIGEgZmlsZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBpbiB0aGUKK290aGVyIHRyZWUgZG9lcyBub3QuICBUaGUgYWJvdmUgZXhhbXBsZSBsb29rcyBmb3IgYSBjb21taXQgdGhhdAoraGFzIHRoZSAiaWYiIHN0YXRlbWVudCBpbiBpdCBpbiBhIGZpbGUsIGJ1dCBpdHMgcGFyZW50IGNvbW1pdAorZG9lcyBub3QgaGF2ZSBpdCBpbiB0aGUgc2FtZSBzaGFwZSBpbiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIChvcgordGhlIG90aGVyIHdheSBhcm91bmQsIHdoZXJlIHRoZSBwYXJlbnQgaGFzIGl0IGFuZCB0aGUgY29tbWl0Citkb2VzIG5vdCksIGFuZCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVtIGFyZSBzaG93biwgYWxvbmcKK3dpdGggdGhlIGNvbW1pdCBtZXNzYWdlICh0aGFua3MgdG8gdGhlIC12IGZsYWcpLiAgSXQgZG9lcyBub3QKK3Nob3cgYW55dGhpbmcgZm9yIGNvbW1pdHMgdGhhdCBkbyBub3QgdG91Y2ggdGhpcyAiaWYiIHN0YXRlbWVudC4KKworQWxzbywgaW4gdGhlIG9yaWdpbmFsIGNvbnRleHQsIHRoZSBzYW1lIHN0YXRlbWVudCBtaWdodCBoYXZlCithcHBlYXJlZCBhdCBmaXJzdCBpbiBhIGRpZmZlcmVudCBmaWxlIGFuZCBsYXRlciB0aGUgZmlsZSB3YXMKK3JlbmFtZWQgdG8gImEtZmlsZS5jIi4gIENWUyBhbm5vdGF0ZSB3b3VsZCBub3QgaGVscCB5b3UgdG8gZ28KK2JhY2sgYWNyb3NzIHN1Y2ggYSByZW5hbWUsIGJ1dCBnaXQgd291bGQgc3RpbGwgaGVscCB5b3UgaW4gc3VjaAorYSBzaXR1YXRpb24uICBGb3IgdGhhdCwgeW91IGNhbiBnaXZlIHRoZSAtQyBmbGFnIHRvCitnaXQtZGlmZi10cmVlLCBsaWtlIHRoaXM6CisKKwkkIGdpdC13aGF0Y2hhbmdlZCAtcCAtQyAtUydpZiAoZnJvdHopIHsKKwkJbml0Zm9sKCk7CisJfScKKworV2hlbiB0aGUgLUMgZmxhZyBpcyB1c2VkLCBmaWxlIHJlbmFtZXMgYW5kIGNvcGllcyBhcmUgZm9sbG93ZWQuCitTbyBpZiB0aGUgImlmIiBzdGF0ZW1lbnQgaW4gcXVlc3Rpb24gaGFwcGVucyB0byBiZSBpbiAiYS1maWxlLmMiCitpbiB0aGUgY3VycmVudCBIRUFEIGNvbW1pdCwgZXZlbiBpZiB0aGUgZmlsZSB3YXMgb3JpZ2luYWxseQorY2FsbGVkICJvLWZpbGUuYyIgYW5kIHRoZW4gcmVuYW1lZCBpbiBhbiBlYXJsaWVyIGNvbW1pdCwgb3IgaWYKK3RoZSBmaWxlIHdhcyBjcmVhdGVkIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgIm8tZmlsZS5jIiBpbiBhbgorZWFybGllciBjb21taXQsIHlvdSB3aWxsIG5vdCBsb3NlIHRyYWNrLiAgSWYgdGhlICJpZiIgc3RhdGVtZW50CitkaWQgbm90IGNoYW5nZSBhY3Jvc3Mgc3VjaCBhIHJlbmFtZSBvciBjb3B5LCB0aGVuIHRoZSBjb21taXQgdGhhdAorZG9lcyByZW5hbWUgb3IgY29weSB3b3VsZCBub3Qgc2hvdyBpbiB0aGUgb3V0cHV0LCBhbmQgaWYgdGhlCisiaWYiIHN0YXRlbWVudCB3YXMgbW9kaWZpZWQgd2hpbGUgdGhlIGZpbGUgd2FzIHN0aWxsIGNhbGxlZAorIm8tZmlsZS5jIiwgaXQgd291bGQgZmluZCB0aGUgY29tbWl0IHRoYXQgY2hhbmdlZCB0aGUgc3RhdGVtZW50Cit3aGVuIGl0IHdhcyBpbiAiby1maWxlLmMiLgorCitOT1RFOiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mICJnaXQtZGlmZi10cmVlIC1DIiBpcyBub3QgZWFnZXIKKyAgZW5vdWdoIHRvIGZpbmQgY29waWVzLCBhbmQgaXQgd2lsbCBtaXNzIHRoZSBmYWN0IHRoYXQgYS1maWxlLmMKKyAgd2FzIGNyZWF0ZWQgYnkgY29weWluZyBvLWZpbGUuYyB1bmxlc3Mgby1maWxlLmMgd2FzIHNvbWVob3cKKyAgY2hhbmdlZCBpbiB0aGUgc2FtZSBjb21taXQuCisKK1lvdSBjYW4gdXNlIHRoZSAtLXBpY2theGUtYWxsIGZsYWcgaW4gYWRkaXRpb24gdG8gdGhlIC1TIGZsYWcuCitUaGlzIGNhdXNlcyB0aGUgZGlmZmVyZW5jZXMgZnJvbSBhbGwgdGhlIGZpbGVzIGNvbnRhaW5lZCBpbgordGhvc2UgdHdvIGNvbW1pdHMsIG5vdCBqdXN0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBmaWxlcwordGhhdCBjb250YWluIHRoaXMgY2hhbmdlZCAiaWYiIHN0YXRlbWVudDoKKworCSQgZ2l0LXdoYXRjaGFuZ2VkIC1wIC1DIC1TJ2lmIChmcm90eikgeworCQluaXRmb2woKTsKKwl9JyAtLXBpY2theGUtYWxsCisKK05PVEU6IFRoaXMgb3B0aW9uIGlzIGNhbGxlZCAiLS1waWNrYXhlLWFsbCIgYmVjYXVzZSAtUworICBvcHRpb24gaXMgaW50ZXJuYWxseSBjYWxsZWQgInBpY2theGUiLCBhIHRvb2wgZm9yIHNvZnR3YXJlCisgIGFyY2hhZW9sb2dpc3RzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTdkOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kaWZmLWZvcm1hdC50eHQKQEAgLTAsMCArMSwxOTcgQEAKK1RoZSBvdXRwdXQgZm9ybWF0IGZyb20gImdpdC1kaWZmLWluZGV4IiwgImdpdC1kaWZmLXRyZWUiIGFuZAorImdpdC1kaWZmLWZpbGVzIiBhcmUgdmVyeSBzaW1pbGFyLgorCitUaGVzZSBjb21tYW5kcyBhbGwgY29tcGFyZSB0d28gc2V0cyBvZiB0aGluZ3M7IHdoYXQgaXMgCitjb21wYXJlZCBkaWZmZXJzOgorCitnaXQtZGlmZi1pbmRleCA8dHJlZS1pc2g+OjoKKyAgICAgICAgY29tcGFyZXMgdGhlIDx0cmVlLWlzaD4gYW5kIHRoZSBmaWxlcyBvbiB0aGUgZmlsZXN5c3RlbS4KKworZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgPHRyZWUtaXNoPjo6CisgICAgICAgIGNvbXBhcmVzIHRoZSA8dHJlZS1pc2g+IGFuZCB0aGUgaW5kZXguCisKK2dpdC1kaWZmLXRyZWUgWy1yXSA8dHJlZS1pc2gtMT4gPHRyZWUtaXNoLTI+IFs8cGF0dGVybj4uLi5dOjoKKyAgICAgICAgY29tcGFyZXMgdGhlIHRyZWVzIG5hbWVkIGJ5IHRoZSB0d28gYXJndW1lbnRzLgorCitnaXQtZGlmZi1maWxlcyBbPHBhdHRlcm4+Li4uXTo6CisgICAgICAgIGNvbXBhcmVzIHRoZSBpbmRleCBhbmQgdGhlIGZpbGVzIG9uIHRoZSBmaWxlc3lzdGVtLgorCisKK0FuIG91dHB1dCBsaW5lIGlzIGZvcm1hdHRlZCB0aGlzIHdheToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbi1wbGFjZSBlZGl0ICA6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBmaWxlMAorY29weS1lZGl0ICAgICAgOjEwMDY0NCAxMDA2NDQgYWJjZDEyMy4uLiAxMjM0NTY3Li4uIEM2OCBmaWxlMSBmaWxlMgorcmVuYW1lLWVkaXQgICAgOjEwMDY0NCAxMDA2NDQgYWJjZDEyMy4uLiAxMjM0NTY3Li4uIFI4NiBmaWxlMSBmaWxlMworY3JlYXRlICAgICAgICAgOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAxMjM0NTY3Li4uIEEgZmlsZTQKK2RlbGV0ZSAgICAgICAgIDoxMDA2NDQgMDAwMDAwIDEyMzQ1NjcuLi4gMDAwMDAwMC4uLiBEIGZpbGU1Cit1bm1lcmdlZCAgICAgICA6MDAwMDAwIDAwMDAwMCAwMDAwMDAwLi4uIDAwMDAwMDAuLi4gVSBmaWxlNgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoYXQgaXMsIGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0OgorCisuIGEgY29sb24uCisuIG1vZGUgZm9yICJzcmMiOyAwMDAwMDAgaWYgY3JlYXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIG1vZGUgZm9yICJkc3QiOyAwMDAwMDAgaWYgZGVsZXRpb24gb3IgdW5tZXJnZWQuCisuIGEgc3BhY2UuCisuIHNoYTEgZm9yICJzcmMiOyAwXHs0MFx9IGlmIGNyZWF0aW9uIG9yIHVubWVyZ2VkLgorLiBhIHNwYWNlLgorLiBzaGExIGZvciAiZHN0IjsgMFx7NDBcfSBpZiBjcmVhdGlvbiwgdW5tZXJnZWQgb3IgImxvb2sgYXQgd29yayB0cmVlIi4KKy4gYSBzcGFjZS4KKy4gc3RhdHVzLCBmb2xsb3dlZCBieSBvcHRpb25hbCAic2NvcmUiIG51bWJlci4KKy4gYSB0YWIgb3IgYSBOVUwgd2hlbiAnLXonIG9wdGlvbiBpcyB1c2VkLgorLiBwYXRoIGZvciAic3JjIgorLiBhIHRhYiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQ7IG9ubHkgZXhpc3RzIGZvciBDIG9yIFIuCisuIHBhdGggZm9yICJkc3QiOyBvbmx5IGV4aXN0cyBmb3IgQyBvciBSLgorLiBhbiBMRiBvciBhIE5VTCB3aGVuICcteicgb3B0aW9uIGlzIHVzZWQsIHRvIHRlcm1pbmF0ZSB0aGUgcmVjb3JkLgorCis8c2hhMT4gaXMgc2hvd24gYXMgYWxsIDAncyBpZiBhIGZpbGUgaXMgbmV3IG9uIHRoZSBmaWxlc3lzdGVtCithbmQgaXQgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgaW5kZXguCisKK0V4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgNWJlNGE0Li4uLi4uIDAwMDAwMC4uLi4uLiBNIGZpbGUuYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwKK3Jlc3BlY3RpdmVseS4KKworCitHZW5lcmF0aW5nIHBhdGNoZXMgd2l0aCAtcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hlbiAiZ2l0LWRpZmYtaW5kZXgiLCAiZ2l0LWRpZmYtdHJlZSIsIG9yICJnaXQtZGlmZi1maWxlcyIgYXJlIHJ1bgord2l0aCBhICctcCcgb3B0aW9uLCB0aGV5IGRvIG5vdCBwcm9kdWNlIHRoZSBvdXRwdXQgZGVzY3JpYmVkIGFib3ZlOworaW5zdGVhZCB0aGV5IHByb2R1Y2UgYSBwYXRjaCBmaWxlLgorCitUaGUgcGF0Y2ggZ2VuZXJhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBhdCB0d28gbGV2ZWxzLgorCisxLiBXaGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIG5vdCBzZXQsCisgICB0aGVzZSBjb21tYW5kcyBpbnRlcm5hbGx5IGludm9rZSAiZGlmZiIgbGlrZSB0aGlzOgorCisgICAgICBkaWZmIC1MIGEvPHBhdGg+IC1MIGIvPHBhdGg+IC1wdSA8b2xkPiA8bmV3PgorKworRm9yIGFkZGVkIGZpbGVzLCBgL2Rldi9udWxsYCBpcyB1c2VkIGZvciA8b2xkPi4gIEZvciByZW1vdmVkCitmaWxlcywgYC9kZXYvbnVsbGAgaXMgdXNlZCBmb3IgPG5ldz4KKysKK1RoZSAiZGlmZiIgZm9ybWF0dGluZyBvcHRpb25zIGNhbiBiZSBjdXN0b21pemVkIHZpYSB0aGUKK2Vudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRElGRl9PUFRTJy4gIEZvciBleGFtcGxlLCBpZiB5b3UKK3ByZWZlciBjb250ZXh0IGRpZmY6CisKKyAgICAgIEdJVF9ESUZGX09QVFM9LWMgZ2l0LWRpZmYtaW5kZXggLXAgSEVBRAorCisKKzIuIFdoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdHSVRfRVhURVJOQUxfRElGRicgaXMgc2V0LCB0aGUKKyAgIHByb2dyYW0gbmFtZWQgYnkgaXQgaXMgY2FsbGVkLCBpbnN0ZWFkIG9mIHRoZSBkaWZmIGludm9jYXRpb24KKyAgIGRlc2NyaWJlZCBhYm92ZS4KKysKK0ZvciBhIHBhdGggdGhhdCBpcyBhZGRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQsCisnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIGNhbGxlZCB3aXRoIDcgcGFyYW1ldGVyczoKKworICAgICBwYXRoIG9sZC1maWxlIG9sZC1oZXggb2xkLW1vZGUgbmV3LWZpbGUgbmV3LWhleCBuZXctbW9kZQorKword2hlcmU6CisKKyAgICAgPG9sZHxuZXc+LWZpbGU6OiBhcmUgZmlsZXMgR0lUX0VYVEVSTkFMX0RJRkYgY2FuIHVzZSB0byByZWFkIHRoZQorCQkgICAgICBjb250ZW50cyBvZiA8b2xkfG5ldz4sCisgICAgIDxvbGR8bmV3Pi1oZXg6OiBhcmUgdGhlIDQwLWhleGRpZ2l0IFNIQTEgaGFzaGVzLAorICAgICA8b2xkfG5ldz4tbW9kZTo6IGFyZSB0aGUgb2N0YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpbGUgbW9kZXMuCisKKysgCitUaGUgZmlsZSBwYXJhbWV0ZXJzIGNhbiBwb2ludCBhdCB0aGUgdXNlcidzIHdvcmtpbmcgZmlsZQorKGUuZy4gYG5ldy1maWxlYCBpbiAiZ2l0LWRpZmYtZmlsZXMiKSwgYC9kZXYvbnVsbGAgKGUuZy4gYG9sZC1maWxlYAord2hlbiBhIG5ldyBmaWxlIGlzIGFkZGVkKSwgb3IgYSB0ZW1wb3JhcnkgZmlsZSAoZS5nLiBgb2xkLWZpbGVgIGluIHRoZQoraW5kZXgpLiAgJ0dJVF9FWFRFUk5BTF9ESUZGJyBzaG91bGQgbm90IHdvcnJ5IGFib3V0IHVubGlua2luZyB0aGUKK3RlbXBvcmFyeSBmaWxlIC0tLSBpdCBpcyByZW1vdmVkIHdoZW4gJ0dJVF9FWFRFUk5BTF9ESUZGJyBleGl0cy4KKworRm9yIGEgcGF0aCB0aGF0IGlzIHVubWVyZ2VkLCAnR0lUX0VYVEVSTkFMX0RJRkYnIGlzIGNhbGxlZCB3aXRoIDEKK3BhcmFtZXRlciwgPHBhdGg+LgorCisKK2dpdCBzcGVjaWZpYyBleHRlbnNpb24gdG8gZGlmZiBmb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdCAtcCBvcHRpb24gcHJvZHVjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlCit0cmFkaXRpb25hbCBkaWZmIGZvcm1hdC4KKworMS4gICBJdCBpcyBwcmVjZWRlZCB3aXRoIGEgImdpdCBkaWZmIiBoZWFkZXIsIHRoYXQgbG9va3MgbGlrZQorICAgICB0aGlzOgorCisgICAgIGRpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUyCisrCitUaGUgYGEvYCBhbmQgYGIvYCBmaWxlbmFtZXMgYXJlIHRoZSBzYW1lIHVubGVzcyByZW5hbWUvY29weSBpcworaW52b2x2ZWQuICBFc3BlY2lhbGx5LCBldmVuIGZvciBhIGNyZWF0aW9uIG9yIGEgZGVsZXRpb24sCitgL2Rldi9udWxsYCBpcyBfbm90XyB1c2VkIGluIHBsYWNlIG9mIGBhL2Agb3IgYGIvYCBmaWxlbmFtZXMuCisrCitXaGVuIHJlbmFtZS9jb3B5IGlzIGludm9sdmVkLCBgZmlsZTFgIGFuZCBgZmlsZTJgIHNob3cgdGhlCituYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBvZiB0aGUgcmVuYW1lL2NvcHkgYW5kIHRoZSBuYW1lIG9mCit0aGUgZmlsZSB0aGF0IHJlbmFtZS9jb3B5IHByb2R1Y2VzLCByZXNwZWN0aXZlbHkuCisKKzIuICAgSXQgaXMgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZXh0ZW5kZWQgaGVhZGVyIGxpbmVzOgorCisgICAgICAgb2xkIG1vZGUgPG1vZGU+CisgICAgICAgbmV3IG1vZGUgPG1vZGU+CisgICAgICAgZGVsZXRlZCBmaWxlIG1vZGUgPG1vZGU+CisgICAgICAgbmV3IGZpbGUgbW9kZSA8bW9kZT4KKyAgICAgICBjb3B5IGZyb20gPHBhdGg+CisgICAgICAgY29weSB0byA8cGF0aD4KKyAgICAgICByZW5hbWUgZnJvbSA8cGF0aD4KKyAgICAgICByZW5hbWUgdG8gPHBhdGg+CisgICAgICAgc2ltaWxhcml0eSBpbmRleCA8bnVtYmVyPgorICAgICAgIGRpc3NpbWlsYXJpdHkgaW5kZXggPG51bWJlcj4KKyAgICAgICBpbmRleCA8aGFzaD4uLjxoYXNoPiA8bW9kZT4KKworMy4gIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycyBpbiBwYXRobmFtZXMgYXJlCisgICAgcmVwcmVzZW50ZWQgYXMgYFx0YCwgYFxuYCwgYW5kIGBcXGAsIHJlc3BlY3RpdmVseS4KKworCitjb21iaW5lZCBkaWZmIGZvcm1hdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0LWRpZmYtdHJlZSBhbmQgZ2l0LWRpZmYtZmlsZXMgY2FuIHRha2UgJy1jJyBvciAnLS1jYycgb3B0aW9uCit0byBwcm9kdWNlICdjb21iaW5lZCBkaWZmJywgd2hpY2ggbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KK2RpZmYgLS1jb21iaW5lZCBkZXNjcmliZS5jCitAQEAgKzk4LDcgQEBACisgICByZXR1cm4gKGFfZGF0ZSA+IGJfZGF0ZSkgPyAtMSA6IChhX2RhdGUgPT0gYl9kYXRlKSA/IDAgOiAxOworICB9CisKKy0gc3RhdGljIHZvaWQgZGVzY3JpYmUoY2hhciAqYXJnKQorIC1zdGF0aWMgdm9pZCBkZXNjcmliZShzdHJ1Y3QgY29tbWl0ICpjbWl0LCBpbnQgbGFzdF9vbmUpCisrK3N0YXRpYyB2b2lkIGRlc2NyaWJlKGNoYXIgKmFyZywgaW50IGxhc3Rfb25lKQorICB7CisgKyAgICAgdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKyArICAgICBzdHJ1Y3QgY29tbWl0ICpjbWl0OworLS0tLS0tLS0tLS0tCisKK1VubGlrZSB0aGUgdHJhZGl0aW9uYWwgJ3VuaWZpZWQnIGRpZmYgZm9ybWF0LCB3aGljaCBzaG93cyB0d28KK2ZpbGVzIEEgYW5kIEIgd2l0aCBhIHNpbmdsZSBjb2x1bW4gdGhhdCBoYXMgYC1gIChtaW51cyAtLQorYXBwZWFycyBpbiBBIGJ1dCByZW1vdmVkIGluIEIpLCBgK2AgKHBsdXMgLS0gbWlzc2luZyBpbiBBIGJ1dAorYWRkZWQgdG8gQiksIG9yIGAgYCAoc3BhY2UgLS0gdW5jaGFuZ2VkKSBwcmVmaXgsIHRoaXMgZm9ybWF0Citjb21wYXJlcyB0d28gb3IgbW9yZSBmaWxlcyBmaWxlMSwgZmlsZTIsLi4uIHdpdGggb25lIGZpbGUgWCwgYW5kCitzaG93cyBob3cgWCBkaWZmZXJzIGZyb20gZWFjaCBvZiBmaWxlTi4gIE9uZSBjb2x1bW4gZm9yIGVhY2ggb2YKK2ZpbGVOIGlzIHByZXBlbmRlZCB0byB0aGUgb3V0cHV0IGxpbmUgdG8gbm90ZSBob3cgWCdzIGxpbmUgaXMKK2RpZmZlcmVudCBmcm9tIGl0LgorCitBIGAtYCBjaGFyYWN0ZXIgaW4gdGhlIGNvbHVtbiBOIG1lYW5zIHRoYXQgdGhlIGxpbmUgYXBwZWFycyBpbgorZmlsZU4gYnV0IGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgbGFzdCBmaWxlLiAgQSBgK2AgY2hhcmFjdGVyCitpbiB0aGUgY29sdW1uIE4gbWVhbnMgdGhhdCB0aGUgbGluZSBhcHBlYXJzIGluIHRoZSBsYXN0IGZpbGUsCithbmQgZmlsZU4gZG9lcyBub3QgaGF2ZSB0aGF0IGxpbmUuCisKK0luIHRoZSBhYm92ZSBleGFtcGxlIG91dHB1dCwgdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSB3YXMgY2hhbmdlZAorZnJvbSBib3RoIGZpbGVzIChoZW5jZSB0d28gYC1gIHJlbW92YWxzIGZyb20gYm90aCBmaWxlMSBhbmQKK2ZpbGUyLCBwbHVzIGArK2AgdG8gbWVhbiBvbmUgbGluZSB0aGF0IHdhcyBhZGRlZCBkb2VzIG5vdCBhcHBlYXIKK2luIGVpdGhlciBmaWxlMSBub3IgZmlsZTIpLiAgQWxzbyB0d28gb3RoZXIgbGluZXMgYXJlIHRoZSBzYW1lCitmcm9tIGZpbGUxIGJ1dCBkbyBub3QgYXBwZWFyIGluIGZpbGUyIChoZW5jZSBwcmVmaXhlZCB3aXRoIGAgK2ApLgorCitXaGVuIHNob3duIGJ5IGBnaXQgZGlmZi10cmVlIC1jYCwgaXQgY29tcGFyZXMgdGhlIHBhcmVudHMgb2YgYQorbWVyZ2UgY29tbWl0IHdpdGggdGhlIG1lcmdlIHJlc3VsdCAoaS5lLiBmaWxlMS4uZmlsZU4gYXJlIHRoZQorcGFyZW50cykuICBXaGVuIHNob3duIGJ5IGBnaXQgZGlmZi1maWxlcyAtY2AsIGl0IGNvbXBhcmVzIHRoZQordHdvIHVucmVzb2x2ZWQgbWVyZ2UgcGFyZW50cyB3aXRoIHRoZSB3b3JraW5nIHRyZWUgZmlsZQorKGkuZS4gZmlsZTEgaXMgc3RhZ2UgMiBha2EgIm91ciB2ZXJzaW9uIiwgZmlsZTIgaXMgc3RhZ2UgMyBha2EKKyJ0aGVpciB2ZXJzaW9uIikuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGlmZi1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vZGlmZi1vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2JhOWE0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kaWZmLW9wdGlvbnMudHh0CkBAIC0wLDAgKzEsMTIyIEBACistcDo6CisJR2VuZXJhdGUgcGF0Y2ggKHNlZSBzZWN0aW9uIG9uIGdlbmVyYXRpbmcgcGF0Y2hlcykKKworLXU6OgorCVN5bm9ueW0gZm9yICItcCIuCisKKy0tcmF3OjoKKwlHZW5lcmF0ZSB0aGUgcmF3IGZvcm1hdC4KKworLS1wYXRjaC13aXRoLXJhdzo6CisJU3lub255bSBmb3IgIi1wIC0tcmF3Ii4KKworLS1zdGF0OjoKKwlHZW5lcmF0ZSBhIGRpZmZzdGF0LgorCistLXN1bW1hcnk6OgorCU91dHB1dCBhIGNvbmRlbnNlZCBzdW1tYXJ5IG9mIGV4dGVuZGVkIGhlYWRlciBpbmZvcm1hdGlvbgorCXN1Y2ggYXMgY3JlYXRpb25zLCByZW5hbWVzIGFuZCBtb2RlIGNoYW5nZXMuCisKKy0tcGF0Y2gtd2l0aC1zdGF0OjoKKwlTeW5vbnltIGZvciAiLXAgLS1zdGF0Ii4KKworLXo6OgorCVwwIGxpbmUgdGVybWluYXRpb24gb24gb3V0cHV0CisKKy0tbmFtZS1vbmx5OjoKKwlTaG93IG9ubHkgbmFtZXMgb2YgY2hhbmdlZCBmaWxlcy4KKworLS1uYW1lLXN0YXR1czo6CisJU2hvdyBvbmx5IG5hbWVzIGFuZCBzdGF0dXMgb2YgY2hhbmdlZCBmaWxlcy4KKworLS1jb2xvcjo6CisJU2hvdyBjb2xvcmVkIGRpZmYuCisKKy0tbm8tY29sb3I6OgorCVR1cm4gb2ZmIGNvbG9yZWQgZGlmZiwgZXZlbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKwlnaXZlcyB0aGUgZGVmYXVsdCB0byBjb2xvciBvdXRwdXQuCisKKy0tbm8tcmVuYW1lczo6CisJVHVybiBvZmYgcmVuYW1lIGRldGVjdGlvbiwgZXZlbiB3aGVuIHRoZSBjb25maWd1cmF0aW9uCisJZmlsZSBnaXZlcyB0aGUgZGVmYXVsdCB0byBkbyBzby4KKworLS1mdWxsLWluZGV4OjoKKwlJbnN0ZWFkIG9mIHRoZSBmaXJzdCBoYW5kZnVsIGNoYXJhY3RlcnMsIHNob3cgZnVsbAorCW9iamVjdCBuYW1lIG9mIHByZS0gYW5kIHBvc3QtaW1hZ2UgYmxvYiBvbiB0aGUgImluZGV4IgorCWxpbmUgd2hlbiBnZW5lcmF0aW5nIGEgcGF0Y2ggZm9ybWF0IG91dHB1dC4KKworLS1iaW5hcnk6OgorCUluIGFkZGl0aW9uIHRvIC0tZnVsbC1pbmRleCwgb3V0cHV0ICJiaW5hcnkgZGlmZiIgdGhhdAorCWNhbiBiZSBhcHBsaWVkIHdpdGggImdpdCBhcHBseSIuCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwluYW1lIGluIGRpZmYtcmF3IGZvcm1hdCBvdXRwdXQgYW5kIGRpZmYtdHJlZSBoZWFkZXIKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4gIFRoaXMgaXMKKwlpbmRlcGVuZGVudCBvZiAtLWZ1bGwtaW5kZXggb3B0aW9uIGFib3ZlLCB3aGljaCBjb250cm9scworCXRoZSBkaWZmLXBhdGNoIG91dHB1dCBmb3JtYXQuICBOb24gZGVmYXVsdCBudW1iZXIgb2YKKwlkaWdpdHMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIC0tYWJicmV2PTxuPi4KKworLUI6OgorCUJyZWFrIGNvbXBsZXRlIHJld3JpdGUgY2hhbmdlcyBpbnRvIHBhaXJzIG9mIGRlbGV0ZSBhbmQgY3JlYXRlLgorCistTTo6CisJRGV0ZWN0IHJlbmFtZXMuCisKKy1DOjoKKwlEZXRlY3QgY29waWVzIGFzIHdlbGwgYXMgcmVuYW1lcy4KKworLS1kaWZmLWZpbHRlcj1bQUNETVJUVVhCKl06OgorCVNlbGVjdCBvbmx5IGZpbGVzIHRoYXQgYXJlIEFkZGVkIChgQWApLCBDb3BpZWQgKGBDYCksCisJRGVsZXRlZCAoYERgKSwgTW9kaWZpZWQgKGBNYCksIFJlbmFtZWQgKGBSYCksIGhhdmUgdGhlaXIKKwl0eXBlIChtb2RlKSBjaGFuZ2VkIChgVGApLCBhcmUgVW5tZXJnZWQgKGBVYCksIGFyZQorCVVua25vd24gKGBYYCksIG9yIGhhdmUgaGFkIHRoZWlyIHBhaXJpbmcgQnJva2VuIChgQmApLgorCUFueSBjb21iaW5hdGlvbiBvZiB0aGUgZmlsdGVyIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQuCisJV2hlbiBgKmAgKEFsbC1vci1ub25lKSBpcyBhZGRlZCB0byB0aGUgY29tYmluYXRpb24sIGFsbAorCXBhdGhzIGFyZSBzZWxlY3RlZCBpZiB0aGVyZSBpcyBhbnkgZmlsZSB0aGF0IG1hdGNoZXMKKwlvdGhlciBjcml0ZXJpYSBpbiB0aGUgY29tcGFyaXNvbjsgaWYgdGhlcmUgaXMgbm8gZmlsZQorCXRoYXQgbWF0Y2hlcyBvdGhlciBjcml0ZXJpYSwgbm90aGluZyBpcyBzZWxlY3RlZC4KKworLS1maW5kLWNvcGllcy1oYXJkZXI6OgorCUZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBieSBkZWZhdWx0LCAtQyBvcHRpb24gZmluZHMgY29waWVzIG9ubHkgCisJaWYgdGhlIG9yaWdpbmFsIGZpbGUgb2YgdGhlIGNvcHkgd2FzIG1vZGlmaWVkIGluIHRoZSBzYW1lIAorCWNoYW5nZXNldC4gIFRoaXMgZmxhZyBtYWtlcyB0aGUgY29tbWFuZAorCWluc3BlY3QgdW5tb2RpZmllZCBmaWxlcyBhcyBjYW5kaWRhdGVzIGZvciB0aGUgc291cmNlIG9mCisJY29weS4gIFRoaXMgaXMgYSB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gZm9yIGxhcmdlCisJcHJvamVjdHMsIHNvIHVzZSBpdCB3aXRoIGNhdXRpb24uCisKKy1sPG51bT46OgorCS1NIGFuZCAtQyBvcHRpb25zIHJlcXVpcmUgTyhuXjIpIHByb2Nlc3NpbmcgdGltZSB3aGVyZSBuCisJaXMgdGhlIG51bWJlciBvZiBwb3RlbnRpYWwgcmVuYW1lL2NvcHkgdGFyZ2V0cy4gIFRoaXMKKwlvcHRpb24gcHJldmVudHMgcmVuYW1lL2NvcHkgZGV0ZWN0aW9uIGZyb20gcnVubmluZyBpZgorCXRoZSBudW1iZXIgb2YgcmVuYW1lL2NvcHkgdGFyZ2V0cyBleGNlZWRzIHRoZSBzcGVjaWZpZWQKKwludW1iZXIuCisKKy1TPHN0cmluZz46OgorCUxvb2sgZm9yIGRpZmZlcmVuY2VzIHRoYXQgY29udGFpbiB0aGUgY2hhbmdlIGluIDxzdHJpbmc+LgorCistLXBpY2theGUtYWxsOjoKKwlXaGVuIC1TIGZpbmRzIGEgY2hhbmdlLCBzaG93IGFsbCB0aGUgY2hhbmdlcyBpbiB0aGF0CisJY2hhbmdlc2V0LCBub3QganVzdCB0aGUgZmlsZXMgdGhhdCBjb250YWluIHRoZSBjaGFuZ2UKKwlpbiA8c3RyaW5nPi4KKworLS1waWNrYXhlLXJlZ2V4OjoKKwlNYWtlIHRoZSA8c3RyaW5nPiBub3QgYSBwbGFpbiBzdHJpbmcgYnV0IGFuIGV4dGVuZGVkIFBPU0lYCisJcmVnZXggdG8gbWF0Y2guCisKKy1PPG9yZGVyZmlsZT46OgorCU91dHB1dCB0aGUgcGF0Y2ggaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBpbiB0aGUKKwk8b3JkZXJmaWxlPiwgd2hpY2ggaGFzIG9uZSBzaGVsbCBnbG9iIHBhdHRlcm4gcGVyIGxpbmUuCisKKy1SOjoKKwlTd2FwIHR3byBpbnB1dHM7IHRoYXQgaXMsIHNob3cgZGlmZmVyZW5jZXMgZnJvbSBpbmRleCBvcgorCW9uLWRpc2sgZmlsZSB0byB0cmVlIGNvbnRlbnRzLgorCistLXRleHQ6OgorCVRyZWF0IGFsbCBmaWxlcyBhcyB0ZXh0LgorCistYTo6CisJU2hvcnRoYW5kIGZvciAiLS10ZXh0Ii4KKworRm9yIG1vcmUgZGV0YWlsZWQgZXhwbGFuYXRpb24gb24gdGhlc2UgY29tbW9uIG9wdGlvbnMsIHNlZSBhbHNvCitsaW5rOmRpZmZjb3JlLmh0bWxbZGlmZmNvcmUgZG9jdW1lbnRhdGlvbl0uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RpZmZjb3JlLnR4dCBiL0RvY3VtZW50YXRpb24vZGlmZmNvcmUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNGU1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RpZmZjb3JlLnR4dApAQCAtMCwwICsxLDI3NSBAQAorVHdlYWtpbmcgZGlmZiBvdXRwdXQKKz09PT09PT09PT09PT09PT09PT09CitKdW5lIDIwMDUKKworCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitUaGUgZGlmZiBjb21tYW5kcyBnaXQtZGlmZi1pbmRleCwgZ2l0LWRpZmYtZmlsZXMsIGdpdC1kaWZmLXRyZWUsIGFuZAorZ2l0LWRpZmYtc3RhZ2VzIGNhbiBiZSB0b2xkIHRvIG1hbmlwdWxhdGUgZGlmZmVyZW5jZXMgdGhleSBmaW5kIGluCit1bmNvbnZlbnRpb25hbCB3YXlzIGJlZm9yZSBzaG93aW5nIGRpZmYoMSkgb3V0cHV0LiAgVGhlIG1hbmlwdWxhdGlvbgoraXMgY29sbGVjdGl2ZWx5IGNhbGxlZCAiZGlmZmNvcmUgdHJhbnNmb3JtYXRpb24iLiAgVGhpcyBzaG9ydCBub3RlCitkZXNjcmliZXMgd2hhdCB0aGV5IGFyZSBhbmQgaG93IHRvIHVzZSB0aGVtIHRvIHByb2R1Y2UgZGlmZiBvdXRwdXRzCit0aGF0IGFyZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGFuIHRoZSBjb252ZW50aW9uYWwga2luZC4KKworCitUaGUgY2hhaW4gb2Ygb3BlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnaXQtZGlmZi0qIGZhbWlseSB3b3JrcyBieSBmaXJzdCBjb21wYXJpbmcgdHdvIHNldHMgb2YKK2ZpbGVzOgorCisgLSBnaXQtZGlmZi1pbmRleCBjb21wYXJlcyBjb250ZW50cyBvZiBhICJ0cmVlIiBvYmplY3QgYW5kIHRoZQorICAgd29ya2luZyBkaXJlY3RvcnkgKHdoZW4gJ1wtLWNhY2hlZCcgZmxhZyBpcyBub3QgdXNlZCkgb3IgYQorICAgInRyZWUiIG9iamVjdCBhbmQgdGhlIGluZGV4IGZpbGUgKHdoZW4gJ1wtLWNhY2hlZCcgZmxhZyBpcworICAgdXNlZCk7CisKKyAtIGdpdC1kaWZmLWZpbGVzIGNvbXBhcmVzIGNvbnRlbnRzIG9mIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUKKyAgIHdvcmtpbmcgZGlyZWN0b3J5OworCisgLSBnaXQtZGlmZi10cmVlIGNvbXBhcmVzIGNvbnRlbnRzIG9mIHR3byAidHJlZSIgb2JqZWN0czsKKworIC0gZ2l0LWRpZmYtc3RhZ2VzIGNvbXBhcmVzIGNvbnRlbnRzIG9mIGJsb2JzIGF0IHR3byBzdGFnZXMgaW4gYW4KKyAgIHVubWVyZ2VkIGluZGV4IGZpbGUuCisKK0luIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlIGNvbW1hbmRzIHRoZW1zZWx2ZXMgY29tcGFyZQorY29ycmVzcG9uZGluZyBwYXRocyBpbiB0aGUgdHdvIHNldHMgb2YgZmlsZXMuICBUaGUgcmVzdWx0IG9mCitjb21wYXJpc29uIGlzIHBhc3NlZCBmcm9tIHRoZXNlIGNvbW1hbmRzIHRvIHdoYXQgaXMgaW50ZXJuYWxseQorY2FsbGVkICJkaWZmY29yZSIsIGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gd2hhdCBpcyBvdXRwdXQgd2hlbgordGhlIC1wIG9wdGlvbiBpcyBub3QgdXNlZC4gIEUuZy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbi1wbGFjZSBlZGl0ICA6MTAwNjQ0IDEwMDY0NCBiY2QxMjM0Li4uIDAxMjM0NTYuLi4gTSBmaWxlMAorY3JlYXRlICAgICAgICAgOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAxMjM0NTY3Li4uIEEgZmlsZTQKK2RlbGV0ZSAgICAgICAgIDoxMDA2NDQgMDAwMDAwIDEyMzQ1NjcuLi4gMDAwMDAwMC4uLiBEIGZpbGU1Cit1bm1lcmdlZCAgICAgICA6MDAwMDAwIDAwMDAwMCAwMDAwMDAwLi4uIDAwMDAwMDAuLi4gVSBmaWxlNgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkaWZmY29yZSBtZWNoYW5pc20gaXMgZmVkIGEgbGlzdCBvZiBzdWNoIGNvbXBhcmlzb24gcmVzdWx0cworKGVhY2ggb2Ygd2hpY2ggaXMgY2FsbGVkICJmaWxlcGFpciIsIGFsdGhvdWdoIGF0IHRoaXMgcG9pbnQgZWFjaAorb2YgdGhlbSB0YWxrcyBhYm91dCBhIHNpbmdsZSBmaWxlKSwgYW5kIHRyYW5zZm9ybXMgc3VjaCBhIGxpc3QKK2ludG8gYW5vdGhlciBsaXN0LiAgVGhlcmUgYXJlIGN1cnJlbnRseSA2IHN1Y2ggdHJhbnNmb3JtYXRpb25zOgorCistIGRpZmZjb3JlLXBhdGhzcGVjCistIGRpZmZjb3JlLWJyZWFrCistIGRpZmZjb3JlLXJlbmFtZQorLSBkaWZmY29yZS1tZXJnZS1icm9rZW4KKy0gZGlmZmNvcmUtcGlja2F4ZQorLSBkaWZmY29yZS1vcmRlcgorCitUaGVzZSBhcmUgYXBwbGllZCBpbiBzZXF1ZW5jZS4gIFRoZSBzZXQgb2YgZmlsZXBhaXJzIGdpdC1kaWZmLVwqCitjb21tYW5kcyBmaW5kIGFyZSB1c2VkIGFzIHRoZSBpbnB1dCB0byBkaWZmY29yZS1wYXRoc3BlYywgYW5kCit0aGUgb3V0cHV0IGZyb20gZGlmZmNvcmUtcGF0aHNwZWMgaXMgdXNlZCBhcyB0aGUgaW5wdXQgdG8gdGhlCituZXh0IHRyYW5zZm9ybWF0aW9uLiAgVGhlIGZpbmFsIHJlc3VsdCBpcyB0aGVuIHBhc3NlZCB0byB0aGUKK291dHB1dCByb3V0aW5lIGFuZCBnZW5lcmF0ZXMgZWl0aGVyIGRpZmYtcmF3IGZvcm1hdCAoc2VlIE91dHB1dAorZm9ybWF0IHNlY3Rpb25zIG9mIHRoZSBtYW51YWwgZm9yIGdpdC1kaWZmLVwqIGNvbW1hbmRzKSBvcgorZGlmZi1wYXRjaCBmb3JtYXQuCisKKworZGlmZmNvcmUtcGF0aHNwZWM6IEZvciBJZ25vcmluZyBGaWxlcyBPdXRzaWRlIE91ciBDb25zaWRlcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IHRyYW5zZm9ybWF0aW9uIGluIHRoZSBjaGFpbiBpcyBkaWZmY29yZS1wYXRoc3BlYywgYW5kCitpcyBjb250cm9sbGVkIGJ5IGdpdmluZyB0aGUgcGF0aG5hbWUgcGFyYW1ldGVycyB0byB0aGUKK2dpdC1kaWZmLSogY29tbWFuZHMgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoZSBwYXRoc3BlYyBpcyB1c2VkCit0byBsaW1pdCB0aGUgd29ybGQgZGlmZiBvcGVyYXRlcyBpbi4gIEl0IHJlbW92ZXMgdGhlIGZpbGVwYWlycworb3V0c2lkZSB0aGUgc3BlY2lmaWVkIHNldCBvZiBwYXRobmFtZXMuICBFLmcuIElmIHRoZSBpbnB1dCBzZXQgCitvZiBmaWxlcGFpcnMgaW5jbHVkZWQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOjEwMDY0NCAxMDA2NDQgYmNkMTIzNC4uLiAwMTIzNDU2Li4uIE0ganVua2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitidXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiB3YXMgImdpdC1kaWZmLWZpbGVzIG15ZmlsZSIsIHRoZW4gdGhlCitqdW5rZmlsZSBlbnRyeSB3b3VsZCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3QgYmVjYXVzZSBvbmx5ICJteWZpbGUiCitpcyB1bmRlciBjb25zaWRlcmF0aW9uLgorCitJbXBsZW1lbnRhdGlvbiBub3RlLiAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGdpdC1kaWZmLXRyZWUKK3VzZXMgdGhlIHBhdGhuYW1lIHBhcmFtZXRlcnMgb24gdGhlIGNvbW1hbmQgbGluZSB0byBjdWxsIHNldCBvZgorZmlsZXBhaXJzIGl0IGZlZWRzIHRoZSBkaWZmY29yZSBtZWNoYW5pc20gaXRzZWxmLCBhbmQgZG9lcyBub3QKK3VzZSBkaWZmY29yZS1wYXRoc3BlYywgYnV0IHRoZSBlbmQgcmVzdWx0IGlzIHRoZSBzYW1lLgorCisKK2RpZmZjb3JlLWJyZWFrOiBGb3IgU3BsaXR0aW5nIFVwICJDb21wbGV0ZSBSZXdyaXRlcyIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNlY29uZCB0cmFuc2Zvcm1hdGlvbiBpbiB0aGUgY2hhaW4gaXMgZGlmZmNvcmUtYnJlYWssIGFuZCBpcworY29udHJvbGxlZCBieSB0aGUgLUIgb3B0aW9uIHRvIHRoZSBnaXQtZGlmZi0qIGNvbW1hbmRzLiAgVGhpcyBpcwordXNlZCB0byBkZXRlY3QgYSBmaWxlcGFpciB0aGF0IHJlcHJlc2VudHMgImNvbXBsZXRlIHJld3JpdGUiIGFuZAorYnJlYWsgc3VjaCBmaWxlcGFpciBpbnRvIHR3byBmaWxlcGFpcnMgdGhhdCByZXByZXNlbnQgZGVsZXRlIGFuZAorY3JlYXRlLiAgRS5nLiAgSWYgdGhlIGlucHV0IGNvbnRhaW5lZCB0aGlzIGZpbGVwYWlyOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMTAwNjQ0IGJjZDEyMzQuLi4gMDEyMzQ1Ni4uLiBNIGZpbGUwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYW5kIGlmIGl0IGRldGVjdHMgdGhhdCB0aGUgZmlsZSAiZmlsZTAiIGlzIGNvbXBsZXRlbHkgcmV3cml0dGVuLAoraXQgY2hhbmdlcyBpdCB0bzoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDAwMDAwMCBiY2QxMjM0Li4uIDAwMDAwMDAuLi4gRCBmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMTIzNDU2Li4uIEEgZmlsZTAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3IgdGhlIHB1cnBvc2Ugb2YgYnJlYWtpbmcgYSBmaWxlcGFpciwgZGlmZmNvcmUtYnJlYWsgZXhhbWluZXMKK3RoZSBleHRlbnQgb2YgY2hhbmdlcyBiZXR3ZWVuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZXMgYmVmb3JlCithbmQgYWZ0ZXIgbW9kaWZpY2F0aW9uIChpLmUuIHRoZSBjb250ZW50cyB0aGF0IGhhdmUgImJjZDEyMzQuLi4iCithbmQgIjAxMjM0NTYuLi4iIGFzIHRoZWlyIFNIQTEgY29udGVudCBJRCwgaW4gdGhlIGFib3ZlCitleGFtcGxlKS4gIFRoZSBhbW91bnQgb2YgZGVsZXRpb24gb2Ygb3JpZ2luYWwgY29udGVudHMgYW5kCitpbnNlcnRpb24gb2YgbmV3IG1hdGVyaWFsIGFyZSBhZGRlZCB0b2dldGhlciwgYW5kIGlmIGl0IGV4Y2VlZHMKK3RoZSAiYnJlYWsgc2NvcmUiLCB0aGUgZmlsZXBhaXIgaXMgYnJva2VuIGludG8gdHdvLiAgVGhlIGJyZWFrCitzY29yZSBkZWZhdWx0cyB0byA1MCUgb2YgdGhlIHNpemUgb2YgdGhlIHNtYWxsZXIgb2YgdGhlIG9yaWdpbmFsCithbmQgdGhlIHJlc3VsdCAoaS5lLiBpZiB0aGUgZWRpdCBzaHJpbmtzIHRoZSBmaWxlLCB0aGUgc2l6ZSBvZgordGhlIHJlc3VsdCBpcyB1c2VkOyBpZiB0aGUgZWRpdCBsZW5ndGhlbnMgdGhlIGZpbGUsIHRoZSBzaXplIG9mCit0aGUgb3JpZ2luYWwgaXMgdXNlZCksIGFuZCBjYW4gYmUgY3VzdG9taXplZCBieSBnaXZpbmcgYSBudW1iZXIKK2FmdGVyICItQiIgb3B0aW9uIChlLmcuICItQjc1IiB0byB0ZWxsIGl0IHRvIHVzZSA3NSUpLgorCisKK2RpZmZjb3JlLXJlbmFtZTogRm9yIERldGVjdGlvbiBSZW5hbWVzIGFuZCBDb3BpZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkIHRvIGRldGVjdCByZW5hbWVzIGFuZCBjb3BpZXMsIGFuZCBpcworY29udHJvbGxlZCBieSB0aGUgLU0gb3B0aW9uICh0byBkZXRlY3QgcmVuYW1lcykgYW5kIHRoZSAtQyBvcHRpb24KKyh0byBkZXRlY3QgY29waWVzIGFzIHdlbGwpIHRvIHRoZSBnaXQtZGlmZi0qIGNvbW1hbmRzLiAgSWYgdGhlCitpbnB1dCBjb250YWluZWQgdGhlc2UgZmlsZXBhaXJzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMDAwMDAwIDAxMjM0NTYuLi4gMDAwMDAwMC4uLiBEIGZpbGVYCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDAxMjM0NTYuLi4gQSBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGUgY29udGVudHMgb2YgdGhlIGRlbGV0ZWQgZmlsZSBmaWxlWCBpcyBzaW1pbGFyIGVub3VnaCB0bwordGhlIGNvbnRlbnRzIG9mIHRoZSBjcmVhdGVkIGZpbGUgZmlsZTAsIHRoZW4gcmVuYW1lIGRldGVjdGlvbgorbWVyZ2VzIHRoZXNlIGZpbGVwYWlycyBhbmQgY3JlYXRlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis6MTAwNjQ0IDEwMDY0NCAwMTIzNDU2Li4uIDAxMjM0NTYuLi4gUjEwMCBmaWxlWCBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gdGhlICItQyIgb3B0aW9uIGlzIHVzZWQsIHRoZSBvcmlnaW5hbCBjb250ZW50cyBvZiBtb2RpZmllZCBmaWxlcywKK2FuZCBkZWxldGVkIGZpbGVzIChhbmQgYWxzbyB1bm1vZGlmaWVkIGZpbGVzLCBpZiB0aGUKKyJcLS1maW5kLWNvcGllcy1oYXJkZXIiIG9wdGlvbiBpcyB1c2VkKSBhcmUgY29uc2lkZXJlZCBhcyBjYW5kaWRhdGVzCitvZiB0aGUgc291cmNlIGZpbGVzIGluIHJlbmFtZS9jb3B5IG9wZXJhdGlvbi4gIElmIHRoZSBpbnB1dCB3ZXJlIGxpa2UKK3RoZXNlIGZpbGVwYWlycywgdGhhdCB0YWxrIGFib3V0IGEgbW9kaWZpZWQgZmlsZSBmaWxlWSBhbmQgYSBuZXdseQorY3JlYXRlZCBmaWxlIGZpbGUwOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMTAwNjQ0IDAxMjM0NTYuLi4gMTIzNDU2Ny4uLiBNIGZpbGVZCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIGJjZDM0NTYuLi4gQSBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RoZSBvcmlnaW5hbCBjb250ZW50cyBvZiBmaWxlWSBhbmQgdGhlIHJlc3VsdGluZyBjb250ZW50cyBvZgorZmlsZTAgYXJlIGNvbXBhcmVkLCBhbmQgaWYgdGhleSBhcmUgc2ltaWxhciBlbm91Z2gsIHRoZXkgYXJlCitjaGFuZ2VkIHRvOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzoxMDA2NDQgMTAwNjQ0IDAxMjM0NTYuLi4gMTIzNDU2Ny4uLiBNIGZpbGVZCis6MTAwNjQ0IDEwMDY0NCAwMTIzNDU2Li4uIGJjZDM0NTYuLi4gQzEwMCBmaWxlWSBmaWxlMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIGJvdGggcmVuYW1lIGFuZCBjb3B5IGRldGVjdGlvbiwgdGhlIHNhbWUgImV4dGVudCBvZiBjaGFuZ2VzIgorYWxnb3JpdGhtIHVzZWQgaW4gZGlmZmNvcmUtYnJlYWsgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdHdvCitmaWxlcyBhcmUgInNpbWlsYXIgZW5vdWdoIiwgYW5kIGNhbiBiZSBjdXN0b21pemVkIHRvIHVzZQorYSBzaW1pbGFyaXR5IHNjb3JlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IG9mIDUwJSBieSBnaXZpbmcgYQorbnVtYmVyIGFmdGVyIHRoZSAiLU0iIG9yICItQyIgb3B0aW9uIChlLmcuICItTTgiIHRvIHRlbGwgaXQgdG8gdXNlCis4LzEwID0gODAlKS4KKworTm90ZS4gIFdoZW4gdGhlICItQyIgb3B0aW9uIGlzIHVzZWQgd2l0aCBgXC0tZmluZC1jb3BpZXMtaGFyZGVyYAorb3B0aW9uLCBnaXQtZGlmZi1cKiBjb21tYW5kcyBmZWVkIHVubW9kaWZpZWQgZmlsZXBhaXJzIHRvCitkaWZmY29yZSBtZWNoYW5pc20gYXMgd2VsbCBhcyBtb2RpZmllZCBvbmVzLiAgVGhpcyBsZXRzIHRoZSBjb3B5CitkZXRlY3RvciBjb25zaWRlciB1bm1vZGlmaWVkIGZpbGVzIGFzIGNvcHkgc291cmNlIGNhbmRpZGF0ZXMgYXQKK3RoZSBleHBlbnNlIG9mIG1ha2luZyBpdCBzbG93ZXIuICBXaXRob3V0IGBcLS1maW5kLWNvcGllcy1oYXJkZXJgLAorZ2l0LWRpZmYtXCogY29tbWFuZHMgY2FuIGRldGVjdCBjb3BpZXMgb25seSBpZiB0aGUgZmlsZSB0aGF0IHdhcworY29waWVkIGhhcHBlbmVkIHRvIGhhdmUgYmVlbiBtb2RpZmllZCBpbiB0aGUgc2FtZSBjaGFuZ2VzZXQuCisKKworZGlmZmNvcmUtbWVyZ2UtYnJva2VuOiBGb3IgUHV0dGluZyAiQ29tcGxldGUgUmV3cml0ZXMiIEJhY2sgVG9nZXRoZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgdHJhbnNmb3JtYXRpb24gaXMgdXNlZCB0byBtZXJnZSBmaWxlcGFpcnMgYnJva2VuIGJ5CitkaWZmY29yZS1icmVhaywgYW5kIG5vdCB0cmFuc2Zvcm1lZCBpbnRvIHJlbmFtZS9jb3B5IGJ5CitkaWZmY29yZS1yZW5hbWUsIGJhY2sgaW50byBhIHNpbmdsZSBtb2RpZmljYXRpb24uICBUaGlzIGFsd2F5cworcnVucyB3aGVuIGRpZmZjb3JlLWJyZWFrIGlzIHVzZWQuCisKK0ZvciB0aGUgcHVycG9zZSBvZiBtZXJnaW5nIGJyb2tlbiBmaWxlcGFpcnMgYmFjaywgaXQgdXNlcyBhCitkaWZmZXJlbnQgImV4dGVudCBvZiBjaGFuZ2VzIiBjb21wdXRhdGlvbiBmcm9tIHRoZSBvbmVzIHVzZWQgYnkKK2RpZmZjb3JlLWJyZWFrIGFuZCBkaWZmY29yZS1yZW5hbWUuICBJdCBjb3VudHMgb25seSB0aGUgZGVsZXRpb24KK2Zyb20gdGhlIG9yaWdpbmFsLCBhbmQgZG9lcyBub3QgY291bnQgaW5zZXJ0aW9uLiAgSWYgeW91IHJlbW92ZWQKK29ubHkgMTAgbGluZXMgZnJvbSBhIDEwMC1saW5lIGRvY3VtZW50LCBldmVuIGlmIHlvdSBhZGRlZCA5MTAKK25ldyBsaW5lcyB0byBtYWtlIGEgbmV3IDEwMDAtbGluZSBkb2N1bWVudCwgeW91IGRpZCBub3QgZG8gYQorY29tcGxldGUgcmV3cml0ZS4gIGRpZmZjb3JlLWJyZWFrIGJyZWFrcyBzdWNoIGEgY2FzZSBpbiBvcmRlciB0bworaGVscCBkaWZmY29yZS1yZW5hbWUgdG8gY29uc2lkZXIgc3VjaCBmaWxlcGFpcnMgYXMgY2FuZGlkYXRlIG9mCityZW5hbWUvY29weSBkZXRlY3Rpb24sIGJ1dCBpZiBmaWxlcGFpcnMgYnJva2VuIHRoYXQgd2F5IHdlcmUgbm90CittYXRjaGVkIHdpdGggb3RoZXIgZmlsZXBhaXJzIHRvIGNyZWF0ZSByZW5hbWUvY29weSwgdGhlbiB0aGlzCit0cmFuc2Zvcm1hdGlvbiBtZXJnZXMgdGhlbSBiYWNrIGludG8gdGhlIG9yaWdpbmFsCisibW9kaWZpY2F0aW9uIi4KKworVGhlICJleHRlbnQgb2YgY2hhbmdlcyIgcGFyYW1ldGVyIGNhbiBiZSB0d2Vha2VkIGZyb20gdGhlCitkZWZhdWx0IDgwJSAodGhhdCBpcywgdW5sZXNzIG1vcmUgdGhhbiA4MCUgb2YgdGhlIG9yaWdpbmFsCittYXRlcmlhbCBpcyBkZWxldGVkLCB0aGUgYnJva2VuIHBhaXJzIGFyZSBtZXJnZWQgYmFjayBpbnRvIGEKK3NpbmdsZSBtb2RpZmljYXRpb24pIGJ5IGdpdmluZyBhIHNlY29uZCBudW1iZXIgdG8gLUIgb3B0aW9uLAorbGlrZSB0aGVzZToKKworKiAtQjUwLzYwIChnaXZlIDUwJSAiYnJlYWsgc2NvcmUiIHRvIGRpZmZjb3JlLWJyZWFrLCB1c2UgNjAlCisgIGZvciBkaWZmY29yZS1tZXJnZS1icm9rZW4pLgorCisqIC1CLzYwICh0aGUgc2FtZSBhcyBhYm92ZSwgc2luY2UgZGlmZmNvcmUtYnJlYWsgZGVmYXVsdHMgdG8gNTAlKS4KKworTm90ZSB0aGF0IGVhcmxpZXIgaW1wbGVtZW50YXRpb24gbGVmdCBhIGJyb2tlbiBwYWlyIGFzIGEgc2VwYXJhdGUKK2NyZWF0aW9uIGFuZCBkZWxldGlvbiBwYXRjaGVzLiAgVGhpcyB3YXMgYW4gdW5uZWNlc3NhcnkgaGFjayBhbmQKK3RoZSBsYXRlc3QgaW1wbGVtZW50YXRpb24gYWx3YXlzIG1lcmdlcyBhbGwgdGhlIGJyb2tlbiBwYWlycworYmFjayBpbnRvIG1vZGlmaWNhdGlvbnMsIGJ1dCB0aGUgcmVzdWx0aW5nIHBhdGNoIG91dHB1dCBpcworZm9ybWF0dGVkIGRpZmZlcmVudGx5IGZvciBlYXNpZXIgcmV2aWV3IGluIGNhc2Ugb2Ygc3VjaAorYSBjb21wbGV0ZSByZXdyaXRlIGJ5IHNob3dpbmcgdGhlIGVudGlyZSBjb250ZW50cyBvZiBvbGQgdmVyc2lvbgorcHJlZml4ZWQgd2l0aCAnLScsIGZvbGxvd2VkIGJ5IHRoZSBlbnRpcmUgY29udGVudHMgb2YgbmV3Cit2ZXJzaW9uIHByZWZpeGVkIHdpdGggJysnLgorCisKK2RpZmZjb3JlLXBpY2theGU6IEZvciBEZXRlY3RpbmcgQWRkaXRpb24vRGVsZXRpb24gb2YgU3BlY2lmaWVkIFN0cmluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgdHJhbnNmb3JtYXRpb24gaXMgdXNlZCB0byBmaW5kIGZpbGVwYWlycyB0aGF0IHJlcHJlc2VudAorY2hhbmdlcyB0aGF0IHRvdWNoIGEgc3BlY2lmaWVkIHN0cmluZywgYW5kIGlzIGNvbnRyb2xsZWQgYnkgdGhlCistUyBvcHRpb24gYW5kIHRoZSBgXC0tcGlja2F4ZS1hbGxgIG9wdGlvbiB0byB0aGUgZ2l0LWRpZmYtKgorY29tbWFuZHMuCisKK1doZW4gZGlmZmNvcmUtcGlja2F4ZSBpcyBpbiB1c2UsIGl0IGNoZWNrcyBpZiB0aGVyZSBhcmUKK2ZpbGVwYWlycyB3aG9zZSAib3JpZ2luYWwiIHNpZGUgaGFzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZAord2hvc2UgInJlc3VsdCIgc2lkZSBkb2VzIG5vdC4gIFN1Y2ggYSBmaWxlcGFpciByZXByZXNlbnRzICJ0aGUKK3N0cmluZyBhcHBlYXJlZCBpbiB0aGlzIGNoYW5nZXNldCIuICBJdCBhbHNvIGNoZWNrcyBmb3IgdGhlCitvcHBvc2l0ZSBjYXNlIHRoYXQgbG9zZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcuCisKK1doZW4gYFwtLXBpY2theGUtYWxsYCBpcyBub3QgaW4gZWZmZWN0LCBkaWZmY29yZS1waWNrYXhlIGxlYXZlcworb25seSBzdWNoIGZpbGVwYWlycyB0aGF0IHRvdWNoIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGluIGl0cworb3V0cHV0LiAgV2hlbiBgXC0tcGlja2F4ZS1hbGxgIGlzIHVzZWQsIGRpZmZjb3JlLXBpY2theGUgbGVhdmVzIGFsbAorZmlsZXBhaXJzIGludGFjdCBpZiB0aGVyZSBpcyBzdWNoIGEgZmlsZXBhaXIsIG9yIG1ha2VzIHRoZQorb3V0cHV0IGVtcHR5IG90aGVyd2lzZS4gIFRoZSBsYXR0ZXIgYmVoYXZpb3VyIGlzIGRlc2lnbmVkIHRvCittYWtlIHJldmlld2luZyBvZiB0aGUgY2hhbmdlcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgd2hvbGUKK2NoYW5nZXNldCBlYXNpZXIuCisKKworZGlmZmNvcmUtb3JkZXI6IEZvciBTb3J0aW5nIHRoZSBPdXRwdXQgQmFzZWQgb24gRmlsZW5hbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB1c2VkIHRvIHJlb3JkZXIgdGhlIGZpbGVwYWlycyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncworKG9yIHByb2plY3QncykgdGFzdGUsIGFuZCBpcyBjb250cm9sbGVkIGJ5IHRoZSAtTyBvcHRpb24gdG8gdGhlCitnaXQtZGlmZi0qIGNvbW1hbmRzLgorCitUaGlzIHRha2VzIGEgdGV4dCBmaWxlIGVhY2ggb2Ygd2hvc2UgbGluZXMgaXMgYSBzaGVsbCBnbG9iCitwYXR0ZXJuLiAgRmlsZXBhaXJzIHRoYXQgbWF0Y2ggYSBnbG9iIHBhdHRlcm4gb24gYW4gZWFybGllciBsaW5lCitpbiB0aGUgZmlsZSBhcmUgb3V0cHV0IGJlZm9yZSBvbmVzIHRoYXQgbWF0Y2ggYSBsYXRlciBsaW5lLCBhbmQKK2ZpbGVwYWlycyB0aGF0IGRvIG5vdCBtYXRjaCBhbnkgZ2xvYiBwYXR0ZXJuIGFyZSBvdXRwdXQgbGFzdC4KKworQXMgYW4gZXhhbXBsZSwgYSB0eXBpY2FsIG9yZGVyZmlsZSBmb3IgdGhlIGNvcmUgZ2l0IHByb2JhYmx5Cit3b3VsZCBsb29rIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRUFETUUKK01ha2VmaWxlCitEb2N1bWVudGF0aW9uCisqLmgKKyouYwordAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXZlcnlkYXkudHh0IGIvRG9jdW1lbnRhdGlvbi9ldmVyeWRheS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzNWMxOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZXZlcnlkYXkudHh0CkBAIC0wLDAgKzEsNDY4IEBACitFdmVyeWRheSBHSVQgV2l0aCAyMCBDb21tYW5kcyBPciBTbworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworR0lUIHN1aXRlIGhhcyBvdmVyIDEwMCBjb21tYW5kcywgYW5kIHRoZSBtYW51YWwgcGFnZSBmb3IgZWFjaCBvZgordGhlbSBkaXNjdXNzZXMgd2hhdCB0aGUgY29tbWFuZCBkb2VzIGFuZCBob3cgaXQgaXMgdXNlZCBpbgorZGV0YWlsLCBidXQgdW50aWwgeW91IGtub3cgd2hhdCBjb21tYW5kIHNob3VsZCBiZSB1c2VkIGluIG9yZGVyCit0byBhY2hpZXZlIHdoYXQgeW91IHdhbnQgdG8gZG8sIHlvdSBjYW5ub3QgdGVsbCB3aGljaCBtYW51YWwKK3BhZ2UgdG8gbG9vayBhdCwgYW5kIGlmIHlvdSBrbm93IHRoYXQgYWxyZWFkeSB5b3UgZG8gbm90IG5lZWQKK3RoZSBtYW51YWwuCisKK0RvZXMgdGhhdCBtZWFuIHlvdSBuZWVkIHRvIGtub3cgYWxsIG9mIHRoZW0gYmVmb3JlIHlvdSBjYW4gdXNlCitnaXQ/ICBOb3QgYXQgYWxsLiAgRGVwZW5kaW5nIG9uIHRoZSByb2xlIHlvdSBwbGF5LCB0aGUgc2V0IG9mCitjb21tYW5kcyB5b3UgbmVlZCB0byBrbm93IGlzIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IGluIGFueSBjYXNlCit3aGF0IHlvdSBuZWVkIHRvIGxlYXJuIGlzIGZhciBzbWFsbGVyIHRoYW4gdGhlIGZ1bGwgc2V0IG9mCitjb21tYW5kcyB0byBjYXJyeSBvdXQgeW91ciBkYXktdG8tZGF5IHdvcmsuICBUaGlzIGRvY3VtZW50IGlzIHRvCitzZXJ2ZSBhcyBhIGNoZWF0LXNoZWV0IGFuZCBhIHNldCBvZiBwb2ludGVycyBmb3IgcGVvcGxlIHBsYXlpbmcKK3ZhcmlvdXMgcm9sZXMuCisKKzw8QmFzaWMgUmVwb3NpdG9yeT4+IGNvbW1hbmRzIGFyZSBuZWVkZWQgYnkgcGVvcGxlIHdobyBoYXMgYQorcmVwb3NpdG9yeSAtLS0gdGhhdCBpcyBldmVyeWJvZHksIGJlY2F1c2UgZXZlcnkgd29ya2luZyB0cmVlIG9mCitnaXQgaXMgYSByZXBvc2l0b3J5LgorCitJbiBhZGRpdGlvbiwgPDxJbmRpdmlkdWFsIERldmVsb3BlciAoU3RhbmRhbG9uZSk+PiBjb21tYW5kcyBhcmUKK2Vzc2VudGlhbCBmb3IgYW55Ym9keSB3aG8gbWFrZXMgYSBjb21taXQsIGV2ZW4gZm9yIHNvbWVib2R5IHdobword29ya3MgYWxvbmUuCisKK0lmIHlvdSB3b3JrIHdpdGggb3RoZXIgcGVvcGxlLCB5b3Ugd2lsbCBuZWVkIGNvbW1hbmRzIGxpc3RlZCBpbgorPDxJbmRpdmlkdWFsIERldmVsb3BlciAoUGFydGljaXBhbnQpPj4gc2VjdGlvbiBhcyB3ZWxsLgorCitQZW9wbGUgd2hvIHBsYXkgPDxJbnRlZ3JhdG9yPj4gcm9sZSBuZWVkIHRvIGxlYXJuIHNvbWUgbW9yZQorY29tbWFuZHMgaW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLgorCis8PFJlcG9zaXRvcnkgQWRtaW5pc3RyYXRpb24+PiBjb21tYW5kcyBhcmUgZm9yIHN5c3RlbQorYWRtaW5pc3RyYXRvcnMgd2hvIGFyZSByZXNwb25zaWJsZSB0byBjYXJlIGFuZCBmZWVkIGdpdAorcmVwb3NpdG9yaWVzIHRvIHN1cHBvcnQgZGV2ZWxvcGVycy4KKworCitCYXNpYyBSZXBvc2l0b3J5W1tCYXNpYyBSZXBvc2l0b3J5XV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFdmVyeWJvZHkgdXNlcyB0aGVzZSBjb21tYW5kcyB0byBmZWVkIGFuZCBjYXJlIGdpdCByZXBvc2l0b3JpZXMuCisKKyAgKiBnaXRsaW5rOmdpdC1pbml0LWRiWzFdIG9yIGdpdGxpbms6Z2l0LWNsb25lWzFdIHRvIGNyZWF0ZSBhCisgICAgbmV3IHJlcG9zaXRvcnkuCisKKyAgKiBnaXRsaW5rOmdpdC1mc2NrLW9iamVjdHNbMV0gdG8gdmFsaWRhdGUgdGhlIHJlcG9zaXRvcnkuCisKKyAgKiBnaXRsaW5rOmdpdC1wcnVuZVsxXSB0byBnYXJiYWdlIGNvbGxlY3QgY3J1ZnQgaW4gdGhlCisgICAgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LXJlcGFja1sxXSB0byBwYWNrIGxvb3NlIG9iamVjdHMgZm9yIGVmZmljaWVuY3kuCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitDaGVjayBoZWFsdGggYW5kIHJlbW92ZSBjcnVmdC46OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBmc2NrLW9iamVjdHMgPDE+CiskIGdpdCBwcnVuZQorJCBnaXQgY291bnQtb2JqZWN0cyA8Mj4KKyQgZ2l0IHJlcGFjayA8Mz4KKyQgZ2l0IHBydW5lIDw0PgorLS0tLS0tLS0tLS0tCisrCis8MT4gcnVubmluZyB3aXRob3V0ICItLWZ1bGwiIGlzIHVzdWFsbHkgY2hlYXAgYW5kIGFzc3VyZXMgdGhlCityZXBvc2l0b3J5IGhlYWx0aCByZWFzb25hYmx5IHdlbGwuCis8Mj4gY2hlY2sgaG93IG1hbnkgbG9vc2Ugb2JqZWN0cyB0aGVyZSBhcmUgYW5kIGhvdyBtdWNoCitkaXNrIHNwYWNlIGlzIHdhc3RlZCBieSBub3QgcmVwYWNraW5nLgorPDM+IHdpdGhvdXQgIi1hIiByZXBhY2tzIGluY3JlbWVudGFsbHkuICByZXBhY2tpbmcgZXZlcnkgNC01TUIKK29mIGxvb3NlIG9iamVjdHMgYWNjdW11bGF0aW9uIG1heSBiZSBhIGdvb2QgcnVsZSBvZiB0aHVtYi4KKzw0PiBhZnRlciByZXBhY2ssIHBydW5lIHJlbW92ZXMgdGhlIGR1cGxpY2F0ZSBsb29zZSBvYmplY3RzLgorCitSZXBhY2sgYSBzbWFsbCBwcm9qZWN0IGludG8gc2luZ2xlIHBhY2suOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgcmVwYWNrIC1hIC1kIDwxPgorJCBnaXQgcHJ1bmUKKy0tLS0tLS0tLS0tLQorKworPDE+IHBhY2sgYWxsIHRoZSBvYmplY3RzIHJlYWNoYWJsZSBmcm9tIHRoZSByZWZzIGludG8gb25lIHBhY2sKK2FuZCByZW1vdmUgdW5uZWVkZWQgb3RoZXIgcGFja3MKKworCitJbmRpdmlkdWFsIERldmVsb3BlciAoU3RhbmRhbG9uZSlbW0luZGl2aWR1YWwgRGV2ZWxvcGVyIChTdGFuZGFsb25lKV1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Egc3RhbmRhbG9uZSBpbmRpdmlkdWFsIGRldmVsb3BlciBkb2VzIG5vdCBleGNoYW5nZSBwYXRjaGVzIHdpdGgKK290aGVyIHBlb3BsZSwgYW5kIHdvcmtzIGFsb25lIGluIGEgc2luZ2xlIHJlcG9zaXRvcnksIHVzaW5nIHRoZQorZm9sbG93aW5nIGNvbW1hbmRzLgorCisgICogZ2l0bGluazpnaXQtc2hvdy1icmFuY2hbMV0gdG8gc2VlIHdoZXJlIHlvdSBhcmUuCisKKyAgKiBnaXRsaW5rOmdpdC1sb2dbMV0gdG8gc2VlIHdoYXQgaGFwcGVuZWQuCisKKyAgKiBnaXRsaW5rOmdpdC13aGF0Y2hhbmdlZFsxXSB0byBmaW5kIG91dCB3aGVyZSB0aGluZ3MgaGF2ZQorICAgIGNvbWUgZnJvbS4KKworICAqIGdpdGxpbms6Z2l0LWNoZWNrb3V0WzFdIGFuZCBnaXRsaW5rOmdpdC1icmFuY2hbMV0gdG8gc3dpdGNoCisgICAgYnJhbmNoZXMuCisKKyAgKiBnaXRsaW5rOmdpdC1hZGRbMV0gYW5kIGdpdGxpbms6Z2l0LXVwZGF0ZS1pbmRleFsxXSB0byBtYW5hZ2UKKyAgICB0aGUgaW5kZXggZmlsZS4KKworICAqIGdpdGxpbms6Z2l0LWRpZmZbMV0gYW5kIGdpdGxpbms6Z2l0LXN0YXR1c1sxXSB0byBzZWUgd2hhdAorICAgIHlvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBkb2luZy4KKworICAqIGdpdGxpbms6Z2l0LWNvbW1pdFsxXSB0byBhZHZhbmNlIHRoZSBjdXJyZW50IGJyYW5jaC4KKworICAqIGdpdGxpbms6Z2l0LXJlc2V0WzFdIGFuZCBnaXRsaW5rOmdpdC1jaGVja291dFsxXSAod2l0aAorICAgIHBhdGhuYW1lIHBhcmFtZXRlcnMpIHRvIHVuZG8gY2hhbmdlcy4KKworICAqIGdpdGxpbms6Z2l0LXB1bGxbMV0gd2l0aCAiLiIgYXMgdGhlIHJlbW90ZSB0byBtZXJnZSBiZXR3ZWVuCisgICAgbG9jYWwgYnJhbmNoZXMuCisKKyAgKiBnaXRsaW5rOmdpdC1yZWJhc2VbMV0gdG8gbWFpbnRhaW4gdG9waWMgYnJhbmNoZXMuCisKKyAgKiBnaXRsaW5rOmdpdC10YWdbMV0gdG8gbWFyayBrbm93biBwb2ludC4KKworRXhhbXBsZXMKK35+fn5+fn5+CisKK0V4dHJhY3QgYSB0YXJiYWxsIGFuZCBjcmVhdGUgYSB3b3JraW5nIHRyZWUgYW5kIGEgbmV3IHJlcG9zaXRvcnkgdG8ga2VlcCB0cmFjayBvZiBpdC46OgorKworLS0tLS0tLS0tLS0tCiskIHRhciB6eGYgZnJvdHoudGFyLmd6CiskIGNkIGZyb3R6CiskIGdpdC1pbml0LWRiCiskIGdpdCBhZGQgLiA8MT4KKyQgZ2l0IGNvbW1pdCAtbSAnaW1wb3J0IG9mIGZyb3R6IHNvdXJjZSB0cmVlLicKKyQgZ2l0IHRhZyB2Mi40MyA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGFkZCBldmVyeXRoaW5nIHVuZGVyIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKzwyPiBtYWtlIGEgbGlnaHR3ZWlnaHQsIHVuYW5ub3RhdGVkIHRhZy4KKworQ3JlYXRlIGEgdG9waWMgYnJhbmNoIGFuZCBkZXZlbG9wLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1iIGFsc2EtYXVkaW8gPDE+CiskIGVkaXQvY29tcGlsZS90ZXN0CiskIGdpdCBjaGVja291dCAtLSBjdXJzZXMvdXhfYXVkaW9fb3NzLmMgPDI+CiskIGdpdCBhZGQgY3Vyc2VzL3V4X2F1ZGlvX2Fsc2EuYyA8Mz4KKyQgZWRpdC9jb21waWxlL3Rlc3QKKyQgZ2l0IGRpZmYgPDQ+CiskIGdpdCBjb21taXQgLWEgLXMgPDU+CiskIGVkaXQvY29tcGlsZS90ZXN0CiskIGdpdCByZXNldCAtLXNvZnQgSEVBRF4gPDY+CiskIGVkaXQvY29tcGlsZS90ZXN0CiskIGdpdCBkaWZmIE9SSUdfSEVBRCA8Nz4KKyQgZ2l0IGNvbW1pdCAtYSAtYyBPUklHX0hFQUQgPDg+CiskIGdpdCBjaGVja291dCBtYXN0ZXIgPDk+CiskIGdpdCBwdWxsIC4gYWxzYS1hdWRpbyA8MTA+CiskIGdpdCBsb2cgLS1zaW5jZT0nMyBkYXlzIGFnbycgPDExPgorJCBnaXQgbG9nIHYyLjQzLi4gY3Vyc2VzLyA8MTI+CistLS0tLS0tLS0tLS0KKysKKzwxPiBjcmVhdGUgYSBuZXcgdG9waWMgYnJhbmNoLgorPDI+IHJldmVydCB5b3VyIGJvdGNoZWQgY2hhbmdlcyBpbiAiY3Vyc2VzL3V4X2F1ZGlvX29zcy5jIi4KKzwzPiB5b3UgbmVlZCB0byB0ZWxsIGdpdCBpZiB5b3UgYWRkZWQgYSBuZXcgZmlsZTsgcmVtb3ZhbCBhbmQKK21vZGlmaWNhdGlvbiB3aWxsIGJlIGNhdWdodCBpZiB5b3UgZG8gImNvbW1pdCAtYSIgbGF0ZXIuCis8ND4gdG8gc2VlIHdoYXQgY2hhbmdlcyB5b3UgYXJlIGNvbW1pdHRpbmcuCis8NT4gY29tbWl0IGV2ZXJ5dGhpbmcgYXMgeW91IGhhdmUgdGVzdGVkLCB3aXRoIHlvdXIgc2lnbi1vZmYuCis8Nj4gdGFrZSB0aGUgbGFzdCBjb21taXQgYmFjaywga2VlcGluZyB3aGF0IGlzIGluIHRoZSB3b3JraW5nIHRyZWUuCis8Nz4gbG9vayBhdCB0aGUgY2hhbmdlcyBzaW5jZSB0aGUgcHJlbWF0dXJlIGNvbW1pdCB3ZSB0b29rIGJhY2suCis8OD4gcmVkbyB0aGUgY29tbWl0IHVuZG9uZSBpbiB0aGUgcHJldmlvdXMgc3RlcCwgdXNpbmcgdGhlIG1lc3NhZ2UKK3lvdSBvcmlnaW5hbGx5IHdyb3RlLgorPDk+IHN3aXRjaCB0byB0aGUgbWFzdGVyIGJyYW5jaC4KKzwxMD4gbWVyZ2UgYSB0b3BpYyBicmFuY2ggaW50byB5b3VyIG1hc3RlciBicmFuY2gKKzwxMT4gcmV2aWV3IGNvbW1pdCBsb2dzOyBvdGhlciBmb3JtcyB0byBsaW1pdCBvdXRwdXQgY2FuIGJlCitjb21iaW5lZCBhbmQgaW5jbHVkZSAtLW1heC1jb3VudD0xMCAoc2hvdyAxMCBjb21taXRzKSwgLS11bnRpbD0nMjAwNS0xMi0xMCcuCis8MTI+IHZpZXcgb25seSB0aGUgY2hhbmdlcyB0aGF0IHRvdWNoIHdoYXQncyBpbiBjdXJzZXMvCitkaXJlY3RvcnksIHNpbmNlIHYyLjQzIHRhZy4KKworCitJbmRpdmlkdWFsIERldmVsb3BlciAoUGFydGljaXBhbnQpW1tJbmRpdmlkdWFsIERldmVsb3BlciAoUGFydGljaXBhbnQpXV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGRldmVsb3BlciB3b3JraW5nIGFzIGEgcGFydGljaXBhbnQgaW4gYSBncm91cCBwcm9qZWN0IG5lZWRzIHRvCitsZWFybiBob3cgdG8gY29tbXVuaWNhdGUgd2l0aCBvdGhlcnMsIGFuZCB1c2VzIHRoZXNlIGNvbW1hbmRzIGluCithZGRpdGlvbiB0byB0aGUgb25lcyBuZWVkZWQgYnkgYSBzdGFuZGFsb25lIGRldmVsb3Blci4KKworICAqIGdpdGxpbms6Z2l0LWNsb25lWzFdIGZyb20gdGhlIHVwc3RyZWFtIHRvIHByaW1lIHlvdXIgbG9jYWwKKyAgICByZXBvc2l0b3J5LgorCisgICogZ2l0bGluazpnaXQtcHVsbFsxXSBhbmQgZ2l0bGluazpnaXQtZmV0Y2hbMV0gZnJvbSAib3JpZ2luIgorICAgIHRvIGtlZXAgdXAtdG8tZGF0ZSB3aXRoIHRoZSB1cHN0cmVhbS4KKworICAqIGdpdGxpbms6Z2l0LXB1c2hbMV0gdG8gc2hhcmVkIHJlcG9zaXRvcnksIGlmIHlvdSBhZG9wdCBDVlMKKyAgICBzdHlsZSBzaGFyZWQgcmVwb3NpdG9yeSB3b3JrZmxvdy4KKworICAqIGdpdGxpbms6Z2l0LWZvcm1hdC1wYXRjaFsxXSB0byBwcmVwYXJlIGUtbWFpbCBzdWJtaXNzaW9uLCBpZgorICAgIHlvdSBhZG9wdCBMaW51eCBrZXJuZWwtc3R5bGUgcHVibGljIGZvcnVtIHdvcmtmbG93LgorCitFeGFtcGxlcworfn5+fn5+fn4KKworQ2xvbmUgdGhlIHVwc3RyZWFtIGFuZCB3b3JrIG9uIGl0LiAgRmVlZCBjaGFuZ2VzIHRvIHVwc3RyZWFtLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vLi4uL3RvcnZhbGRzL2xpbnV4LTIuNiBteTIuNgorJCBjZCBteTIuNgorJCBlZGl0L2NvbXBpbGUvdGVzdDsgZ2l0IGNvbW1pdCAtYSAtcyA8MT4KKyQgZ2l0IGZvcm1hdC1wYXRjaCBvcmlnaW4gPDI+CiskIGdpdCBwdWxsIDwzPgorJCBnaXQgd2hhdGNoYW5nZWQgLXAgT1JJR19IRUFELi4gYXJjaC9pMzg2IGluY2x1ZGUvYXNtLWkzODYgPDQ+CiskIGdpdCBwdWxsIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi8uLi4vamdhcnppay9saWJhdGEtZGV2LmdpdCBBTEwgPDU+CiskIGdpdCByZXNldCAtLWhhcmQgT1JJR19IRUFEIDw2PgorJCBnaXQgcHJ1bmUgPDc+CiskIGdpdCBmZXRjaCAtLXRhZ3MgPDg+CistLS0tLS0tLS0tLS0KKysKKzwxPiByZXBlYXQgYXMgbmVlZGVkLgorPDI+IGV4dHJhY3QgcGF0Y2hlcyBmcm9tIHlvdXIgYnJhbmNoIGZvciBlLW1haWwgc3VibWlzc2lvbi4KKzwzPiAicHVsbCIgZmV0Y2hlcyBmcm9tICJvcmlnaW4iIGJ5IGRlZmF1bHQgYW5kIG1lcmdlcyBpbnRvIHRoZQorY3VycmVudCBicmFuY2guCis8ND4gaW1tZWRpYXRlbHkgYWZ0ZXIgcHVsbGluZywgbG9vayBhdCB0aGUgY2hhbmdlcyBkb25lIHVwc3RyZWFtCitzaW5jZSBsYXN0IHRpbWUgd2UgY2hlY2tlZCwgb25seSBpbiB0aGUKK2FyZWEgd2UgYXJlIGludGVyZXN0ZWQgaW4uCis8NT4gZmV0Y2ggZnJvbSBhIHNwZWNpZmljIGJyYW5jaCBmcm9tIGEgc3BlY2lmaWMgcmVwb3NpdG9yeSBhbmQgbWVyZ2UuCis8Nj4gcmV2ZXJ0IHRoZSBwdWxsLgorPDc+IGdhcmJhZ2UgY29sbGVjdCBsZWZ0b3ZlciBvYmplY3RzIGZyb20gcmV2ZXJ0ZWQgcHVsbC4KKzw4PiBmcm9tIHRpbWUgdG8gdGltZSwgb2J0YWluIG9mZmljaWFsIHRhZ3MgZnJvbSB0aGUgIm9yaWdpbiIKK2FuZCBzdG9yZSB0aGVtIHVuZGVyIC5naXQvcmVmcy90YWdzLy4KKworCitQdXNoIGludG8gYW5vdGhlciByZXBvc2l0b3J5Ljo6CisrCistLS0tLS0tLS0tLS0KK3NhdGVsbGl0ZSQgZ2l0IGNsb25lIG1vdGhlcnNoaXA6ZnJvdHovLmdpdCBmcm90eiA8MT4KK3NhdGVsbGl0ZSQgY2QgZnJvdHoKK3NhdGVsbGl0ZSQgY2F0IC5naXQvcmVtb3Rlcy9vcmlnaW4gPDI+CitVUkw6IG1vdGhlcnNoaXA6ZnJvdHovLmdpdAorUHVsbDogbWFzdGVyOm9yaWdpbgorc2F0ZWxsaXRlJCBlY2hvICdQdXNoOiBtYXN0ZXI6c2F0ZWxsaXRlJyA+Pi5naXQvcmVtb3Rlcy9vcmlnaW4gPDM+CitzYXRlbGxpdGUkIGVkaXQvY29tcGlsZS90ZXN0L2NvbW1pdAorc2F0ZWxsaXRlJCBnaXQgcHVzaCBvcmlnaW4gPDQ+CisKK21vdGhlcnNoaXAkIGNkIGZyb3R6Cittb3RoZXJzaGlwJCBnaXQgY2hlY2tvdXQgbWFzdGVyCittb3RoZXJzaGlwJCBnaXQgcHVsbCAuIHNhdGVsbGl0ZSA8NT4KKy0tLS0tLS0tLS0tLQorKworPDE+IG1vdGhlcnNoaXAgbWFjaGluZSBoYXMgYSBmcm90eiByZXBvc2l0b3J5IHVuZGVyIHlvdXIgaG9tZQorZGlyZWN0b3J5OyBjbG9uZSBmcm9tIGl0IHRvIHN0YXJ0IGEgcmVwb3NpdG9yeSBvbiB0aGUgc2F0ZWxsaXRlCittYWNoaW5lLgorPDI+IGNsb25lIGNyZWF0ZXMgdGhpcyBmaWxlIGJ5IGRlZmF1bHQuICBJdCBhcnJhbmdlcyAiZ2l0IHB1bGwiCit0byBmZXRjaCBhbmQgc3RvcmUgdGhlIG1hc3RlciBicmFuY2ggaGVhZCBvZiBtb3RoZXJzaGlwIG1hY2hpbmUKK3RvIGxvY2FsICJvcmlnaW4iIGJyYW5jaC4KKzwzPiBhcnJhbmdlICJnaXQgcHVzaCIgdG8gcHVzaCBsb2NhbCAibWFzdGVyIiBicmFuY2ggdG8KKyJzYXRlbGxpdGUiIGJyYW5jaCBvZiB0aGUgbW90aGVyc2hpcCBtYWNoaW5lLgorPDQ+IHB1c2ggd2lsbCBzdGFzaCBvdXIgd29yayBhd2F5IG9uICJzYXRlbGxpdGUiIGJyYW5jaCBvbiB0aGUKK21vdGhlcnNoaXAgbWFjaGluZS4gIFlvdSBjb3VsZCB1c2UgdGhpcyBhcyBhIGJhY2stdXAgbWV0aG9kLgorPDU+IG9uIG1vdGhlcnNoaXAgbWFjaGluZSwgbWVyZ2UgdGhlIHdvcmsgZG9uZSBvbiB0aGUgc2F0ZWxsaXRlCittYWNoaW5lIGludG8gdGhlIG1hc3RlciBicmFuY2guCisKK0JyYW5jaCBvZmYgb2YgYSBzcGVjaWZpYyB0YWcuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgcHJpdmF0ZTIuNi4xNCB2Mi42LjE0IDwxPgorJCBlZGl0L2NvbXBpbGUvdGVzdDsgZ2l0IGNvbW1pdCAtYQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCBmb3JtYXQtcGF0Y2ggLWsgLW0gLS1zdGRvdXQgdjIuNi4xNC4ucHJpdmF0ZTIuNi4xNCB8CisgIGdpdCBhbSAtMyAtayA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IGNyZWF0ZSBhIHByaXZhdGUgYnJhbmNoIGJhc2VkIG9uIGEgd2VsbCBrbm93biAoYnV0IHNvbWV3aGF0IGJlaGluZCkKK3RhZy4KKzwyPiBmb3J3YXJkIHBvcnQgYWxsIGNoYW5nZXMgaW4gcHJpdmF0ZTIuNi4xNCBicmFuY2ggdG8gbWFzdGVyIGJyYW5jaAord2l0aG91dCBhIGZvcm1hbCAibWVyZ2luZyIuCisKKworSW50ZWdyYXRvcltbSW50ZWdyYXRvcl1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBmYWlybHkgY2VudHJhbCBwZXJzb24gYWN0aW5nIGFzIHRoZSBpbnRlZ3JhdG9yIGluIGEgZ3JvdXAKK3Byb2plY3QgcmVjZWl2ZXMgY2hhbmdlcyBtYWRlIGJ5IG90aGVycywgcmV2aWV3cyBhbmQgaW50ZWdyYXRlcwordGhlbSBhbmQgcHVibGlzaGVzIHRoZSByZXN1bHQgZm9yIG90aGVycyB0byB1c2UsIHVzaW5nIHRoZXNlCitjb21tYW5kcyBpbiBhZGRpdGlvbiB0byB0aGUgb25lcyBuZWVkZWQgYnkgcGFydGljaXBhbnRzLgorCisgICogZ2l0bGluazpnaXQtYW1bMV0gdG8gYXBwbHkgcGF0Y2hlcyBlLW1haWxlZCBpbiBmcm9tIHlvdXIKKyAgICBjb250cmlidXRvcnMuCisKKyAgKiBnaXRsaW5rOmdpdC1wdWxsWzFdIHRvIG1lcmdlIGZyb20geW91ciB0cnVzdGVkIGxpZXV0ZW5hbnRzLgorCisgICogZ2l0bGluazpnaXQtZm9ybWF0LXBhdGNoWzFdIHRvIHByZXBhcmUgYW5kIHNlbmQgc3VnZ2VzdGVkCisgICAgYWx0ZXJuYXRpdmUgdG8gY29udHJpYnV0b3JzLgorCisgICogZ2l0bGluazpnaXQtcmV2ZXJ0WzFdIHRvIHVuZG8gYm90Y2hlZCBjb21taXRzLgorCisgICogZ2l0bGluazpnaXQtcHVzaFsxXSB0byBwdWJsaXNoIHRoZSBibGVlZGluZyBlZGdlLgorCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitNeSB0eXBpY2FsIEdJVCBkYXkuOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgc3RhdHVzIDwxPgorJCBnaXQgc2hvdy1icmFuY2ggPDI+CiskIG1haWx4IDwzPgorJiBzIDIgMyA0IDUgLi8rdG8tYXBwbHkKKyYgcyA3IDggLi8raG9sZC1saW51cworJiBxCiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZ2l0IGFtIC0zIC1pIC1zIC11IC4vK3RvLWFwcGx5IDw0PgorJCBjb21waWxlL3Rlc3QKKyQgZ2l0IGNoZWNrb3V0IC1iIGhvbGQvbGludXMgJiYgZ2l0IGFtIC0zIC1pIC1zIC11IC4vK2hvbGQtbGludXMgPDU+CiskIGdpdCBjaGVja291dCB0b3BpYy9vbmUgJiYgZ2l0IHJlYmFzZSBtYXN0ZXIgPDY+CiskIGdpdCBjaGVja291dCBwdSAmJiBnaXQgcmVzZXQgLS1oYXJkIG1hc3RlciA8Nz4KKyQgZ2l0IHB1bGwgLiB0b3BpYy9vbmUgdG9waWMvdHdvICYmIGdpdCBwdWxsIC4gaG9sZC9saW51cyA8OD4KKyQgZ2l0IGNoZWNrb3V0IG1haW50CiskIGdpdCBjaGVycnktcGljayBtYXN0ZXJ+NCA8OT4KKyQgY29tcGlsZS90ZXN0CiskIGdpdCB0YWcgLXMgLW0gJ0dJVCAwLjk5Ljl4JyB2MC45OS45eCA8MTA+CiskIGdpdCBmZXRjaCBrbyAmJiBnaXQgc2hvdy1icmFuY2ggbWFzdGVyIG1haW50ICd0YWdzL2tvLSonIDwxMT4KKyQgZ2l0IHB1c2gga28gPDEyPgorJCBnaXQgcHVzaCBrbyB2MC45OS45eCA8MTM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBzZWUgd2hhdCBJIHdhcyBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nLCBpZiBhbnkuCis8Mj4gc2VlIHdoYXQgdG9waWMgYnJhbmNoZXMgSSBoYXZlIGFuZCB0aGluayBhYm91dCBob3cgcmVhZHkKK3RoZXkgYXJlLgorPDM+IHJlYWQgbWFpbHMsIHNhdmUgb25lcyB0aGF0IGFyZSBhcHBsaWNhYmxlLCBhbmQgc2F2ZSBvdGhlcnMKK3RoYXQgYXJlIG5vdCBxdWl0ZSByZWFkeS4KKzw0PiBhcHBseSB0aGVtLCBpbnRlcmFjdGl2ZWx5LCB3aXRoIG15IHNpZ24tb2Zmcy4KKzw1PiBjcmVhdGUgdG9waWMgYnJhbmNoIGFzIG5lZWRlZCBhbmQgYXBwbHksIGFnYWluIHdpdGggbXkKK3NpZ24tb2Zmcy4gCis8Nj4gcmViYXNlIGludGVybmFsIHRvcGljIGJyYW5jaCB0aGF0IGhhcyBub3QgYmVlbiBtZXJnZWQgdG8gdGhlCittYXN0ZXIsIG5vciBleHBvc2VkIGFzIGEgcGFydCBvZiBhIHN0YWJsZSBicmFuY2guCis8Nz4gcmVzdGFydCAicHUiIGV2ZXJ5IHRpbWUgZnJvbSB0aGUgbWFzdGVyLgorPDg+IGFuZCBidW5kbGUgdG9waWMgYnJhbmNoZXMgc3RpbGwgY29va2luZy4KKzw5PiBiYWNrcG9ydCBhIGNyaXRpY2FsIGZpeC4KKzwxMD4gY3JlYXRlIGEgc2lnbmVkIHRhZy4KKzwxMT4gbWFrZSBzdXJlIEkgZGlkIG5vdCBhY2NpZGVudGFsbHkgcmV3aW5kIG1hc3RlciBiZXlvbmQgd2hhdCBJCithbHJlYWR5IHB1c2hlZCBvdXQuICAia28iIHNob3J0aGFuZCBwb2ludHMgYXQgdGhlIHJlcG9zaXRvcnkgSSBoYXZlCithdCBrZXJuZWwub3JnLCBhbmQgbG9va3MgbGlrZSB0aGlzOgorKworLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L3JlbW90ZXMva28KK1VSTDoga2VybmVsLm9yZzovcHViL3NjbS9naXQvZ2l0LmdpdAorUHVsbDogbWFzdGVyOnJlZnMvdGFncy9rby1tYXN0ZXIKK1B1bGw6IG1haW50OnJlZnMvdGFncy9rby1tYWludAorUHVzaDogbWFzdGVyCitQdXNoOiArcHUKK1B1c2g6IG1haW50CistLS0tLS0tLS0tLS0KKysKK0luIHRoZSBvdXRwdXQgZnJvbSAiZ2l0IHNob3ctYnJhbmNoIiwgIm1hc3RlciIgc2hvdWxkIGhhdmUKK2V2ZXJ5dGhpbmcgImtvLW1hc3RlciIgaGFzLgorCis8MTI+IHB1c2ggb3V0IHRoZSBibGVlZGluZyBlZGdlLgorPDEzPiBwdXNoIHRoZSB0YWcgb3V0LCB0b28uCisKKworUmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbltbUmVwb3NpdG9yeSBBZG1pbmlzdHJhdGlvbl1dCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSByZXBvc2l0b3J5IGFkbWluaXN0cmF0b3IgdXNlcyB0aGUgZm9sbG93aW5nIHRvb2xzIHRvIHNldCB1cAorYW5kIG1haW50YWluIGFjY2VzcyB0byB0aGUgcmVwb3NpdG9yeSBieSBkZXZlbG9wZXJzLgorCisgICogZ2l0bGluazpnaXQtZGFlbW9uWzFdIHRvIGFsbG93IGFub255bW91cyBkb3dubG9hZCBmcm9tCisgICAgcmVwb3NpdG9yeS4KKworICAqIGdpdGxpbms6Z2l0LXNoZWxsWzFdIGNhbiBiZSB1c2VkIGFzIGEgJ3Jlc3RyaWN0ZWQgbG9naW4gc2hlbGwnCisgICAgZm9yIHNoYXJlZCBjZW50cmFsIHJlcG9zaXRvcnkgdXNlcnMuCisKK2xpbms6aG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHRbdXBkYXRlIGhvb2sgaG93dG9dIGhhcyBhIGdvb2QKK2V4YW1wbGUgb2YgbWFuYWdpbmcgYSBzaGFyZWQgY2VudHJhbCByZXBvc2l0b3J5LgorCisKK0V4YW1wbGVzCit+fn5+fn5+fgorUnVuIGdpdC1kYWVtb24gdG8gc2VydmUgL3B1Yi9zY20gZnJvbSBpbmV0ZC46OgorKworLS0tLS0tLS0tLS0tCiskIGdyZXAgZ2l0IC9ldGMvaW5ldGQuY29uZgorZ2l0CXN0cmVhbQl0Y3AJbm93YWl0CW5vYm9keSBcCisgIC91c3IvYmluL2dpdC1kYWVtb24gZ2l0LWRhZW1vbiAtLWluZXRkIC0tc3lzbG9nIC0tZXhwb3J0LWFsbCAvcHViL3NjbQorLS0tLS0tLS0tLS0tCisrCitUaGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gbGluZSBzaG91bGQgYmUgb24gb25lIGxpbmUuCisKK1J1biBnaXQtZGFlbW9uIHRvIHNlcnZlIC9wdWIvc2NtIGZyb20geGluZXRkLjo6CisrCistLS0tLS0tLS0tLS0KKyQgY2F0IC9ldGMveGluZXRkLmQvZ2l0LWRhZW1vbgorIyBkZWZhdWx0OiBvZmYKKyMgZGVzY3JpcHRpb246IFRoZSBnaXQgc2VydmVyIG9mZmVycyBhY2Nlc3MgdG8gZ2l0IHJlcG9zaXRvcmllcworc2VydmljZSBnaXQKK3sKKyAgICAgICAgZGlzYWJsZSA9IG5vCisgICAgICAgIHR5cGUgICAgICAgICAgICA9IFVOTElTVEVECisgICAgICAgIHBvcnQgICAgICAgICAgICA9IDk0MTgKKyAgICAgICAgc29ja2V0X3R5cGUgICAgID0gc3RyZWFtCisgICAgICAgIHdhaXQgICAgICAgICAgICA9IG5vCisgICAgICAgIHVzZXIgICAgICAgICAgICA9IG5vYm9keQorICAgICAgICBzZXJ2ZXIgICAgICAgICAgPSAvdXNyL2Jpbi9naXQtZGFlbW9uCisgICAgICAgIHNlcnZlcl9hcmdzICAgICA9IC0taW5ldGQgLS1zeXNsb2cgLS1leHBvcnQtYWxsIC0tYmFzZS1wYXRoPS9wdWIvc2NtCisgICAgICAgIGxvZ19vbl9mYWlsdXJlICArPSBVU0VSSUQKK30KKy0tLS0tLS0tLS0tLQorKworQ2hlY2sgeW91ciB4aW5ldGQoOCkgZG9jdW1lbnRhdGlvbiBhbmQgc2V0dXAsIHRoaXMgaXMgZnJvbSBhIEZlZG9yYSBzeXN0ZW0uCitPdGhlcnMgbWlnaHQgYmUgZGlmZmVyZW50LgorCitHaXZlIHB1c2gvcHVsbCBvbmx5IGFjY2VzcyB0byBkZXZlbG9wZXJzLjo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCBnaXQgL2V0Yy9wYXNzd2QgPDE+CithbGljZTp4OjEwMDA6MTAwMDo6L2hvbWUvYWxpY2U6L3Vzci9iaW4vZ2l0LXNoZWxsCitib2I6eDoxMDAxOjEwMDE6Oi9ob21lL2JvYjovdXNyL2Jpbi9naXQtc2hlbGwKK2NpbmR5Ong6MTAwMjoxMDAyOjovaG9tZS9jaW5keTovdXNyL2Jpbi9naXQtc2hlbGwKK2RhdmlkOng6MTAwMzoxMDAzOjovaG9tZS9kYXZpZDovdXNyL2Jpbi9naXQtc2hlbGwKKyQgZ3JlcCBnaXQgL2V0Yy9zaGVsbHMgPDI+CisvdXNyL2Jpbi9naXQtc2hlbGwKKy0tLS0tLS0tLS0tLQorKworPDE+IGxvZy1pbiBzaGVsbCBpcyBzZXQgdG8gL3Vzci9iaW4vZ2l0LXNoZWxsLCB3aGljaCBkb2VzIG5vdAorYWxsb3cgYW55dGhpbmcgYnV0ICJnaXQgcHVzaCIgYW5kICJnaXQgcHVsbCIuICBUaGUgdXNlcnMgc2hvdWxkCitnZXQgYW4gc3NoIGFjY2VzcyB0byB0aGUgbWFjaGluZS4KKzwyPiBpbiBtYW55IGRpc3RyaWJ1dGlvbnMgL2V0Yy9zaGVsbHMgbmVlZHMgdG8gbGlzdCB3aGF0IGlzIHVzZWQKK2FzIHRoZSBsb2dpbiBzaGVsbC4KKworQ1ZTLXN0eWxlIHNoYXJlZCByZXBvc2l0b3J5Ljo6CisrCistLS0tLS0tLS0tLS0KKyQgZ3JlcCBnaXQgL2V0Yy9ncm91cCA8MT4KK2dpdDp4Ojk0MTg6YWxpY2UsYm9iLGNpbmR5LGRhdmlkCiskIGNkIC9ob21lL2Rldm8uZ2l0CiskIGxzIC1sIDwyPgorICBscnd4cnd4cnd4ICAgMSBkYXZpZCBnaXQgICAgMTcgRGVjICA0IDIyOjQwIEhFQUQgLT4gcmVmcy9oZWFkcy9tYXN0ZXIKKyAgZHJ3eHJ3c3IteCAgIDIgZGF2aWQgZ2l0ICA0MDk2IERlYyAgNCAyMjo0MCBicmFuY2hlcworICAtcnctcnctci0tICAgMSBkYXZpZCBnaXQgICAgODQgRGVjICA0IDIyOjQwIGNvbmZpZworICAtcnctcnctci0tICAgMSBkYXZpZCBnaXQgICAgNTggRGVjICA0IDIyOjQwIGRlc2NyaXB0aW9uCisgIGRyd3hyd3NyLXggICAyIGRhdmlkIGdpdCAgNDA5NiBEZWMgIDQgMjI6NDAgaG9va3MKKyAgLXJ3LXJ3LXItLSAgIDEgZGF2aWQgZ2l0IDM3NTA0IERlYyAgNCAyMjo0MCBpbmRleAorICBkcnd4cndzci14ICAgMiBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIGluZm8KKyAgZHJ3eHJ3c3IteCAgIDQgZGF2aWQgZ2l0ICA0MDk2IERlYyAgNCAyMjo0MCBvYmplY3RzCisgIGRyd3hyd3NyLXggICA0IGRhdmlkIGdpdCAgNDA5NiBOb3YgIDcgMTQ6NTggcmVmcworICBkcnd4cndzci14ICAgMiBkYXZpZCBnaXQgIDQwOTYgRGVjICA0IDIyOjQwIHJlbW90ZXMKKyQgbHMgLWwgaG9va3MvdXBkYXRlIDwzPgorICAtci14ci14ci14ICAgMSBkYXZpZCBnaXQgIDM1MzYgRGVjICA0IDIyOjQwIHVwZGF0ZQorJCBjYXQgaW5mby9hbGxvd2VkLXVzZXJzIDw0PgorcmVmcy9oZWFkcy9tYXN0ZXIJYWxpY2VcfGNpbmR5CityZWZzL2hlYWRzL2RvYy11cGRhdGUJYm9iCityZWZzL3RhZ3MvdlswLTldKglkYXZpZAorLS0tLS0tLS0tLS0tCisrCis8MT4gcGxhY2UgdGhlIGRldmVsb3BlcnMgaW50byB0aGUgc2FtZSBnaXQgZ3JvdXAuCis8Mj4gYW5kIG1ha2UgdGhlIHNoYXJlZCByZXBvc2l0b3J5IHdyaXRhYmxlIGJ5IHRoZSBncm91cC4KKzwzPiB1c2UgdXBkYXRlLWhvb2sgZXhhbXBsZSBieSBDYXJsIGZyb20gRG9jdW1lbnRhdGlvbi9ob3d0by8KK2ZvciBicmFuY2ggcG9saWN5IGNvbnRyb2wuCis8ND4gYWxpY2UgYW5kIGNpbmR5IGNhbiBwdXNoIGludG8gbWFzdGVyLCBvbmx5IGJvYiBjYW4gcHVzaCBpbnRvIGRvYy11cGRhdGUuCitkYXZpZCBpcyB0aGUgcmVsZWFzZSBtYW5hZ2VyIGFuZCBpcyB0aGUgb25seSBwZXJzb24gd2hvIGNhbgorY3JlYXRlIGFuZCBwdXNoIHZlcnNpb24gdGFncy4KKworSFRUUCBzZXJ2ZXIgdG8gc3VwcG9ydCBkdW1iIHByb3RvY29sIHRyYW5zZmVyLjo6CisrCistLS0tLS0tLS0tLS0KK2RldiQgZ2l0IHVwZGF0ZS1zZXJ2ZXItaW5mbyA8MT4KK2RldiQgZnRwIHVzZXJAaXNwLmV4YW1wbGUuY29tIDwyPgorZnRwPiBjcCAtciAuZ2l0IC9ob21lL3VzZXIvbXlwcm9qZWN0LmdpdAorLS0tLS0tLS0tLS0tCisrCis8MT4gbWFrZSBzdXJlIHlvdXIgaW5mby9yZWZzIGFuZCBvYmplY3RzL2luZm8vcGFja3MgYXJlIHVwLXRvLWRhdGUKKzwyPiB1cGxvYWQgdG8gcHVibGljIEhUVFAgc2VydmVyIGhvc3RlZCBieSB5b3VyIElTUC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmV0Y2gtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZldGNoLW9wdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjM0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ZldGNoLW9wdGlvbnMudHh0CkBAIC0wLDAgKzEsNDEgQEAKKy1hLCBcLS1hcHBlbmQ6OgorCUFwcGVuZCByZWYgbmFtZXMgYW5kIG9iamVjdCBuYW1lcyBvZiBmZXRjaGVkIHJlZnMgdG8gdGhlCisJZXhpc3RpbmcgY29udGVudHMgb2YgYC5naXQvRkVUQ0hfSEVBRGAuICBXaXRob3V0IHRoaXMKKwlvcHRpb24gb2xkIGRhdGEgaW4gYC5naXQvRkVUQ0hfSEVBRGAgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKworXC0tdXBsb2FkLXBhY2sgPHVwbG9hZC1wYWNrPjo6CisgICAgICAgIFdoZW4gZ2l2ZW4sIGFuZCB0aGUgcmVwb3NpdG9yeSB0byBmZXRjaCBmcm9tIGlzIGhhbmRsZWQKKyAgICAgICAgYnkgJ2dpdC1mZXRjaC1wYWNrJywgJy0tZXhlYz08dXBsb2FkLXBhY2s+JyBpcyBwYXNzZWQgdG8KKyAgICAgICAgdGhlIGNvbW1hbmQgdG8gc3BlY2lmeSBub24tZGVmYXVsdCBwYXRoIGZvciB0aGUgY29tbWFuZAorICAgICAgICBydW4gb24gdGhlIG90aGVyIGVuZC4KKworLWYsIFwtLWZvcmNlOjoKKwlXaGVuIGBnaXQtZmV0Y2hgIGlzIHVzZWQgd2l0aCBgPHJicmFuY2g+OjxsYnJhbmNoPmAKKwlyZWZzcGVjLCBpdCByZWZ1c2VzIHRvIHVwZGF0ZSB0aGUgbG9jYWwgYnJhbmNoCisJYDxsYnJhbmNoPmAgdW5sZXNzIHRoZSByZW1vdGUgYnJhbmNoIGA8cmJyYW5jaD5gIGl0CisJZmV0Y2hlcyBpcyBhIGRlc2NlbmRhbnQgb2YgYDxsYnJhbmNoPmAuICBUaGlzIG9wdGlvbgorCW92ZXJyaWRlcyB0aGF0IGNoZWNrLgorCitcLS1uby10YWdzOjoKKwlCeSBkZWZhdWx0LCBgZ2l0LWZldGNoYCBmZXRjaGVzIHRhZ3MgdGhhdCBwb2ludCBhdAorCW9iamVjdHMgdGhhdCBhcmUgZG93bmxvYWRlZCBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeQorCWFuZCBzdG9yZXMgdGhlbSBsb2NhbGx5LiAgVGhpcyBvcHRpb24gZGlzYWJsZXMgdGhpcworCWF1dG9tYXRpYyB0YWcgZm9sbG93aW5nLgorCistdCwgXC0tdGFnczo6CisJTW9zdCBvZiB0aGUgdGFncyBhcmUgZmV0Y2hlZCBhdXRvbWF0aWNhbGx5IGFzIGJyYW5jaAorCWhlYWRzIGFyZSBkb3dubG9hZGVkLCBidXQgdGFncyB0aGF0IGRvIG5vdCBwb2ludCBhdAorCW9iamVjdHMgcmVhY2hhYmxlIGZyb20gdGhlIGJyYW5jaCBoZWFkcyB0aGF0IGFyZSBiZWluZworCXRyYWNrZWQgd2lsbCBub3QgYmUgZmV0Y2hlZCBieSB0aGlzIG1lY2hhbmlzbS4gIFRoaXMKKwlmbGFnIGxldHMgYWxsIHRhZ3MgYW5kIHRoZWlyIGFzc29jaWF0ZWQgb2JqZWN0cyBiZQorCWRvd25sb2FkZWQuCisKKy1rLCBcLS1rZWVwOjoKKwlLZWVwIGRvd25sb2FkZWQgcGFjay4KKworLXUsIFwtLXVwZGF0ZS1oZWFkLW9rOjoKKwlCeSBkZWZhdWx0IGBnaXQtZmV0Y2hgIHJlZnVzZXMgdG8gdXBkYXRlIHRoZSBoZWFkIHdoaWNoCisJY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgYnJhbmNoLiAgVGhpcyBmbGFnIGRpc2FibGVzIHRoZQorCWNoZWNrLiAgTm90ZSB0aGF0IGZldGNoaW5nIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoIHdpbGwgbm90CisJdXBkYXRlIHRoZSBpbmRleCBhbmQgd29ya2luZyBkaXJlY3RvcnksIHNvIHVzZSBpdCB3aXRoIGNhcmUuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFkZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hZGQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDJlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hZGQudHh0CkBAIC0wLDAgKzEsODYgQEAKK2dpdC1hZGQoMSkKKz09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFkZCAtIEFkZCBmaWxlcyB0byB0aGUgaW5kZXggZmlsZQorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtYWRkJyBbLW5dIFstdl0gWy0tXSA8ZmlsZT4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIHNpbXBsZSB3cmFwcGVyIGZvciBnaXQtdXBkYXRlLWluZGV4IHRvIGFkZCBmaWxlcyB0byB0aGUgaW5kZXgsCitmb3IgcGVvcGxlIHVzZWQgdG8gZG8gImN2cyBhZGQiLgorCitJdCBvbmx5IGFkZHMgbm9uLWlnbm9yZWQgZmlsZXMsIHRvIGFkZCBpZ25vcmVkIGZpbGVzIHVzZQorImdpdCB1cGRhdGUtaW5kZXggLS1hZGQiLgorCitPUFRJT05TCistLS0tLS0tCis8ZmlsZT4uLi46OgorCUZpbGVzIHRvIGFkZCB0byB0aGUgaW5kZXggKHNlZSBnaXRsaW5rOmdpdC1scy1maWxlc1sxXSkuCisKKy1uOjoKKyAgICAgICAgRG9uJ3QgYWN0dWFsbHkgYWRkIHRoZSBmaWxlKHMpLCBqdXN0IHNob3cgaWYgdGhleSBleGlzdC4KKworLXY6OgorICAgICAgICBCZSB2ZXJib3NlLgorCitcLS06OgorCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZyb20KKwl0aGUgbGlzdCBvZiBmaWxlcywgKHVzZWZ1bCB3aGVuIGZpbGVuYW1lcyBtaWdodCBiZSBtaXN0YWtlbgorCWZvciBjb21tYW5kLWxpbmUgb3B0aW9ucykuCisKKworRElTQ1VTU0lPTgorLS0tLS0tLS0tLQorCitUaGUgbGlzdCBvZiA8ZmlsZT4gZ2l2ZW4gdG8gdGhlIGNvbW1hbmQgaXMgZmVkIHRvIGBnaXQtbHMtZmlsZXNgCitjb21tYW5kIHRvIGxpc3QgZmlsZXMgdGhhdCBhcmUgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGluZGV4IGFuZAorYXJlIG5vdCBpZ25vcmVkL2V4Y2x1ZGVkIGJ5IGAkR0lUX0RJUi9pbmZvL2V4Y2x1ZGVgIGZpbGUgb3IKK2AuZ2l0aWdub3JlYCBmaWxlIGluIGVhY2ggZGlyZWN0b3J5LiAgVGhpcyBtZWFucyB0d28gdGhpbmdzOgorCisuIFlvdSBjYW4gcHV0IHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZAorICB0aGUgY29tbWFuZCB3aWxsIGFkZCBhbGwgZmlsZXMgaW4gaXQgYW5kIGl0cyBzdWJkaXJlY3RvcmllczsKKworLiBHaXZpbmcgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgaXMgYWxyZWFkeSBpbiBpbmRleCBkb2VzIG5vdAorICBydW4gYGdpdC11cGRhdGUtaW5kZXhgIG9uIHRoYXQgcGF0aC4KKworCitFWEFNUExFUworLS0tLS0tLS0KK2dpdC1hZGQgRG9jdW1lbnRhdGlvbi9cXCoudHh0OjoKKworCUFkZHMgYWxsIGBcKi50eHRgIGZpbGVzIHRoYXQgYXJlIG5vdCBpbiB0aGUgaW5kZXggdW5kZXIKKwlgRG9jdW1lbnRhdGlvbmAgZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMuCisrCitOb3RlIHRoYXQgdGhlIGFzdGVyaXNrIGBcKmAgaXMgcXVvdGVkIGZyb20gdGhlIHNoZWxsIGluIHRoaXMKK2V4YW1wbGU7IHRoaXMgbGV0cyB0aGUgY29tbWFuZCB0byBpbmNsdWRlIHRoZSBmaWxlcyBmcm9tCitzdWJkaXJlY3RvcmllcyBvZiBgRG9jdW1lbnRhdGlvbi9gIGRpcmVjdG9yeS4KKworZ2l0LWFkZCBnaXQtKi5zaDo6CisKKwlBZGRzIGFsbCBnaXQtKi5zaCBzY3JpcHRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgaW5kZXguCisJQmVjYXVzZSB0aGlzIGV4YW1wbGUgbGV0cyBzaGVsbCBleHBhbmQgdGhlIGFzdGVyaXNrCisJKGkuZS4geW91IGFyZSBsaXN0aW5nIHRoZSBmaWxlcyBleHBsaWNpdGx5KSwgaXQgZG9lcyBub3QKKwlhZGQgYHN1YmRpci9naXQtZm9vLnNoYCB0byB0aGUgaW5kZXguCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtcm1bMV0KK2dpdGxpbms6Z2l0LWxzLWZpbGVzWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1hbS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1hbS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwNDU3ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFtLnR4dApAQCAtMCwwICsxLDEwMiBAQAorZ2l0LWFtKDEpCis9PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFtIC0gQXBwbHkgYSBzZXJpZXMgb2YgcGF0Y2hlcyBpbiBhIG1haWxib3gKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtYW0nIFstLXNpZ25vZmZdIFstLWRvdGVzdD08ZGlyPl0gWy0tdXRmOF0gWy0tYmluYXJ5XSBbLS0zd2F5XQorICAgICAgICAgWy0taW50ZXJhY3RpdmVdIFstLXdoaXRlc3BhY2U9PG9wdGlvbj5dIDxtYm94Pi4uLgorJ2dpdC1hbScgWy0tc2tpcCB8IC0tcmVzb2x2ZWRdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU3BsaXRzIG1haWwgbWVzc2FnZXMgaW4gYSBtYWlsYm94IGludG8gY29tbWl0IGxvZyBtZXNzYWdlLAorYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiBhbmQgcGF0Y2hlcywgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUKK2N1cnJlbnQgYnJhbmNoLgorCitPUFRJT05TCistLS0tLS0tCistLXNpZ25vZmY6OgorCUFkZCBgU2lnbmVkLW9mZi1ieTpgIGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLCB1c2luZworCXRoZSBjb21taXR0ZXIgaWRlbnRpdHkgb2YgeW91cnNlbGYuCisKKy0tZG90ZXN0PTxkaXI+OjoKKwlJbnN0ZWFkIG9mIGAuZG90ZXN0YCBkaXJlY3RvcnksIHVzZSA8ZGlyPiBhcyBhIHdvcmtpbmcKKwlhcmVhIHRvIHN0b3JlIGV4dHJhY3RlZCBwYXRjaGVzLgorCistLXV0ZjgsIC0ta2VlcDo6CisJUGFzcyBgLXVgIGFuZCBgLWtgIGZsYWdzIHRvIGBnaXQtbWFpbGluZm9gIChzZWUKKwlnaXRsaW5rOmdpdC1tYWlsaW5mb1sxXSkuCisKKy0tYmluYXJ5OjoKKwlQYXNzIGAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudGAgZmxhZyB0byBgZ2l0LWFwcGx5YAorCShzZWUgZ2l0bGluazpnaXQtYXBwbHlbMV0pLgorCistLTN3YXk6OgorCVdoZW4gdGhlIHBhdGNoIGRvZXMgbm90IGFwcGx5IGNsZWFubHksIGZhbGwgYmFjayBvbgorCTMtd2F5IG1lcmdlLCBpZiB0aGUgcGF0Y2ggcmVjb3JkcyB0aGUgaWRlbnRpdHkgb2YgYmxvYnMKKwlpdCBpcyBzdXBwb3NlZCB0byBhcHBseSB0bywgYW5kIHdlIGhhdmUgdGhvc2UgYmxvYnMKKwlsb2NhbGx5LgorCistLXNraXA6OgorCVNraXAgdGhlIGN1cnJlbnQgcGF0Y2guICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCisJcmVzdGFydGluZyBhbiBhYm9ydGVkIHBhdGNoLgorCistLXdoaXRlc3BhY2U9PG9wdGlvbj46OgorCVRoaXMgZmxhZyBpcyBwYXNzZWQgdG8gdGhlIGBnaXQtYXBwbHlgIHByb2dyYW0gdGhhdCBhcHBsaWVzCisJdGhlIHBhdGNoLgorCistLWludGVyYWN0aXZlOjoKKwlSdW4gaW50ZXJhY3RpdmVseSwganVzdCBsaWtlIGdpdC1hcHBseW1ib3guCisKKy0tcmVzb2x2ZWQ6OgorCUFmdGVyIGEgcGF0Y2ggZmFpbHVyZSAoZS5nLiBhdHRlbXB0aW5nIHRvIGFwcGx5CisJY29uZmxpY3RpbmcgcGF0Y2gpLCB0aGUgdXNlciBoYXMgYXBwbGllZCBpdCBieSBoYW5kIGFuZAorCXRoZSBpbmRleCBmaWxlIHN0b3JlcyB0aGUgcmVzdWx0IG9mIHRoZSBhcHBsaWNhdGlvbi4KKwlNYWtlIGEgY29tbWl0IHVzaW5nIHRoZSBhdXRob3JzaGlwIGFuZCBjb21taXQgbG9nCisJZXh0cmFjdGVkIGZyb20gdGhlIGUtbWFpbCBtZXNzYWdlIGFuZCB0aGUgY3VycmVudCBpbmRleAorCWZpbGUsIGFuZCBjb250aW51ZS4KKworRElTQ1VTU0lPTgorLS0tLS0tLS0tLQorCitXaGVuIGluaXRpYWxseSBpbnZva2luZyBpdCwgeW91IGdpdmUgaXQgbmFtZXMgb2YgdGhlIG1haWxib3hlcwordG8gY3J1bmNoLiAgVXBvbiBzZWVpbmcgdGhlIGZpcnN0IHBhdGNoIHRoYXQgZG9lcyBub3QgYXBwbHksIGl0CithYm9ydHMgaW4gdGhlIG1pZGRsZSwganVzdCBsaWtlICdnaXQtYXBwbHltYm94JyBkb2VzLiAgWW91IGNhbgorcmVjb3ZlciBmcm9tIHRoaXMgaW4gb25lIG9mIHR3byB3YXlzOgorCisuIHNraXAgdGhlIGN1cnJlbnQgb25lIGJ5IHJlLXJ1bm5pbmcgdGhlIGNvbW1hbmQgd2l0aCAnLS1za2lwJworICBvcHRpb24uCisKKy4gaGFuZCByZXNvbHZlIHRoZSBjb25mbGljdCBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnksIGFuZCB1cGRhdGUKKyAgdGhlIGluZGV4IGZpbGUgdG8gYnJpbmcgaXQgaW4gYSBzdGF0ZSB0aGF0IHRoZSBwYXRjaCBzaG91bGQKKyAgaGF2ZSBwcm9kdWNlZC4gIFRoZW4gcnVuIHRoZSBjb21tYW5kIHdpdGggJy0tcmVzb2x2ZWQnIG9wdGlvbi4KKworVGhlIGNvbW1hbmQgcmVmdXNlcyB0byBwcm9jZXNzIG5ldyBtYWlsYm94ZXMgd2hpbGUgYC5kb3Rlc3RgCitkaXJlY3RvcnkgZXhpc3RzLCBzbyBpZiB5b3UgZGVjaWRlIHRvIHN0YXJ0IG92ZXIgZnJvbSBzY3JhdGNoLAorcnVuIGBybSAtZiAuZG90ZXN0YCBiZWZvcmUgcnVubmluZyB0aGUgY29tbWFuZCB3aXRoIG1haWxib3gKK25hbWVzLgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtYXBwbHltYm94WzFdLCBnaXRsaW5rOmdpdC1hcHBseXBhdGNoWzFdLCBnaXRsaW5rOmdpdC1hcHBseVsxXS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFBldHIgQmF1ZGlzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFubm90YXRlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWFubm90YXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmFmNzMxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYW5ub3RhdGUudHh0CkBAIC0wLDAgKzEsNDQgQEAKK2dpdC1hbm5vdGF0ZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hbm5vdGF0ZSAtIEFubm90YXRlIGZpbGUgbGluZXMgd2l0aCBjb21taXQgaW5mbworCitTWU5PUFNJUworLS0tLS0tLS0KK2dpdC1hbm5vdGF0ZSBbb3B0aW9uc10gZmlsZSBbcmV2aXNpb25dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQW5ub3RhdGVzIGVhY2ggbGluZSBpbiB0aGUgZ2l2ZW4gZmlsZSB3aXRoIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbW1pdAord2hpY2ggaW50cm9kdWNlZCB0aGUgbGluZS4gT3B0aW9uYWxseSBhbm5vdGF0ZSBmcm9tIGEgZ2l2ZW4gcmV2aXNpb24uCisKK09QVElPTlMKKy0tLS0tLS0KKy1sLCAtLWxvbmc6OgorCVNob3cgbG9uZyByZXYgKERlZmF1bHRzIG9mZikuCisKKy10LCAtLXRpbWU6OgorCVNob3cgcmF3IHRpbWVzdGFtcCAoRGVmYXVsdHMgb2ZmKS4KKworLXIsIC0tcmVuYW1lOjoKKwlGb2xsb3cgcmVuYW1lcyAoRGVmYXVsdHMgb24pLgorCistUywgLS1yZXYtZmlsZSA8cmV2cy1maWxlPjo6CisJVXNlIHJldnMgZnJvbSByZXZzLWZpbGUgaW5zdGVhZCBvZiBjYWxsaW5nIGdpdC1yZXYtbGlzdC4KKworLWgsIC0taGVscDo6CisJU2hvdyBoZWxwIG1lc3NhZ2UuCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtYmxhbWVbMV0KKworQVVUSE9SCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHkudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjc0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseS50eHQKQEAgLTAsMCArMSwxNDcgQEAKK2dpdC1hcHBseSgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1hcHBseSAtIEFwcGx5IHBhdGNoIG9uIGEgZ2l0IGluZGV4IGZpbGUgYW5kIGEgd29yayB0cmVlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWFwcGx5JyBbLS1zdGF0XSBbLS1udW1zdGF0XSBbLS1zdW1tYXJ5XSBbLS1jaGVja10gWy0taW5kZXhdIFstLWFwcGx5XQorCSAgWy0tbm8tYWRkXSBbLS1pbmRleC1pbmZvXSBbLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnRdIFstel0gWy1wTlVNXQorCSAgWy1DTlVNXSBbLS13aGl0ZXNwYWNlPTxub3dhcm58d2FybnxlcnJvcnxlcnJvci1hbGx8c3RyaXA+XQorCSAgWzxwYXRjaD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZHMgc3VwcGxpZWQgZGlmZiBvdXRwdXQgYW5kIGFwcGxpZXMgaXQgb24gYSBnaXQgaW5kZXggZmlsZQorYW5kIGEgd29yayB0cmVlLgorCitPUFRJT05TCistLS0tLS0tCis8cGF0Y2g+Li4uOjoKKwlUaGUgZmlsZXMgdG8gcmVhZCBwYXRjaCBmcm9tLiAgJy0nIGNhbiBiZSB1c2VkIHRvIHJlYWQKKwlmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1zdGF0OjoKKwlJbnN0ZWFkIG9mIGFwcGx5aW5nIHRoZSBwYXRjaCwgb3V0cHV0IGRpZmZzdGF0IGZvciB0aGUKKwlpbnB1dC4gIFR1cm5zIG9mZiAiYXBwbHkiLgorCistLW51bXN0YXQ6OgorCVNpbWlsYXIgdG8gXC0tc3RhdCwgYnV0IHNob3dzIG51bWJlciBvZiBhZGRlZCBhbmQKKwlkZWxldGVkIGxpbmVzIGluIGRlY2ltYWwgbm90YXRpb24gYW5kIHBhdGhuYW1lIHdpdGhvdXQKKwlhYmJyZXZpYXRpb24sIHRvIG1ha2UgaXQgbW9yZSBtYWNoaW5lIGZyaWVuZGx5LiAgVHVybnMKKwlvZmYgImFwcGx5Ii4KKworLS1zdW1tYXJ5OjoKKwlJbnN0ZWFkIG9mIGFwcGx5aW5nIHRoZSBwYXRjaCwgb3V0cHV0IGEgY29uZGVuc2VkCisJc3VtbWFyeSBvZiBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIGdpdCBkaWZmIGV4dGVuZGVkCisJaGVhZGVycywgc3VjaCBhcyBjcmVhdGlvbnMsIHJlbmFtZXMgYW5kIG1vZGUgY2hhbmdlcy4KKwlUdXJucyBvZmYgImFwcGx5Ii4KKworLS1jaGVjazo6CisJSW5zdGVhZCBvZiBhcHBseWluZyB0aGUgcGF0Y2gsIHNlZSBpZiB0aGUgcGF0Y2ggaXMKKwlhcHBsaWNhYmxlIHRvIHRoZSBjdXJyZW50IHdvcmsgdHJlZSBhbmQvb3IgdGhlIGluZGV4CisJZmlsZSBhbmQgZGV0ZWN0cyBlcnJvcnMuICBUdXJucyBvZmYgImFwcGx5Ii4KKworLS1pbmRleDo6CisJV2hlbiAtLWNoZWNrIGlzIGluIGVmZmVjdCwgb3Igd2hlbiBhcHBseWluZyB0aGUgcGF0Y2gKKwkod2hpY2ggaXMgdGhlIGRlZmF1bHQgd2hlbiBub25lIG9mIHRoZSBvcHRpb25zIHRoYXQKKwlkaXNhYmxlcyBpdCBpcyBpbiBlZmZlY3QpLCBtYWtlIHN1cmUgdGhlIHBhdGNoIGlzCisJYXBwbGljYWJsZSB0byB3aGF0IHRoZSBjdXJyZW50IGluZGV4IGZpbGUgcmVjb3Jkcy4gIElmCisJdGhlIGZpbGUgdG8gYmUgcGF0Y2hlZCBpbiB0aGUgd29yayB0cmVlIGlzIG5vdAorCXVwLXRvLWRhdGUsIGl0IGlzIGZsYWdnZWQgYXMgYW4gZXJyb3IuICBUaGlzIGZsYWcgYWxzbworCWNhdXNlcyB0aGUgaW5kZXggZmlsZSB0byBiZSB1cGRhdGVkLgorCistLWluZGV4LWluZm86OgorCU5ld2VyIGdpdC1kaWZmIG91dHB1dCBoYXMgZW1iZWRkZWQgJ2luZGV4IGluZm9ybWF0aW9uJworCWZvciBlYWNoIGJsb2IgdG8gaGVscCBpZGVudGlmeSB0aGUgb3JpZ2luYWwgdmVyc2lvbiB0aGF0CisJdGhlIHBhdGNoIGFwcGxpZXMgdG8uICBXaGVuIHRoaXMgZmxhZyBpcyBnaXZlbiwgYW5kIGlmCisJdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIGJsb2IgaXMgYXZhaWxhYmxlIGxvY2FsbHksCisJb3V0cHV0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGVtIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKy16OjoKKwlXaGVuIHNob3dpbmcgdGhlIGluZGV4IGluZm9ybWF0aW9uLCBkbyBub3QgbXVuZ2UgcGF0aHMsCisJYnV0IHVzZSBOVUwgdGVybWluYXRlZCBtYWNoaW5lIHJlYWRhYmxlIGZvcm1hdC4gIFdpdGhvdXQKKwl0aGlzIGZsYWcsIHRoZSBwYXRobmFtZXMgb3V0cHV0IHdpbGwgaGF2ZSBUQUIsIExGLCBhbmQKKwliYWNrc2xhc2ggY2hhcmFjdGVycyByZXBsYWNlZCB3aXRoIGBcdGAsIGBcbmAsIGFuZCBgXFxgLAorCXJlc3BlY3RpdmVseS4KKworLXA8bj46OgorCVJlbW92ZSA8bj4gbGVhZGluZyBzbGFzaGVzIGZyb20gdHJhZGl0aW9uYWwgZGlmZiBwYXRocy4gVGhlCisJZGVmYXVsdCBpcyAxLgorCistQzxuPjo6CisJRW5zdXJlIGF0IGxlYXN0IDxuPiBsaW5lcyBvZiBzdXJyb3VuZGluZyBjb250ZXh0IG1hdGNoIGJlZm9yZQorCWFuZCBhZnRlciBlYWNoIGNoYW5nZS4gIFdoZW4gZmV3ZXIgbGluZXMgb2Ygc3Vycm91bmRpbmcKKwljb250ZXh0IGV4aXN0IHRoZXkgYWxsIG11c3QgbWF0Y2guICBCeSBkZWZhdWx0IG5vIGNvbnRleHQgaXMKKwlldmVyIGlnbm9yZWQuCisKKy0tYXBwbHk6OgorCUlmIHlvdSB1c2UgYW55IG9mIHRoZSBvcHRpb25zIG1hcmtlZCBgYFR1cm5zIG9mZgorCSJhcHBseSInJyBhYm92ZSwgZ2l0LWFwcGx5IHJlYWRzIGFuZCBvdXRwdXRzIHRoZQorCWluZm9ybWF0aW9uIHlvdSBhc2tlZCB3aXRob3V0IGFjdHVhbGx5IGFwcGx5aW5nIHRoZQorCXBhdGNoLiAgR2l2ZSB0aGlzIGZsYWcgYWZ0ZXIgdGhvc2UgZmxhZ3MgdG8gYWxzbyBhcHBseQorCXRoZSBwYXRjaC4KKworLS1uby1hZGQ6OgorCVdoZW4gYXBwbHlpbmcgYSBwYXRjaCwgaWdub3JlIGFkZGl0aW9ucyBtYWRlIGJ5IHRoZQorCXBhdGNoLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IGNvbW1vbiBwYXJ0IGJldHdlZW4KKwl0d28gZmlsZXMgYnkgZmlyc3QgcnVubmluZyBgZGlmZmAgb24gdGhlbSBhbmQgYXBwbHlpbmcKKwl0aGUgcmVzdWx0IHdpdGggdGhpcyBvcHRpb24sIHdoaWNoIHdvdWxkIGFwcGx5IHRoZQorCWRlbGV0aW9uIHBhcnQgYnV0IG5vdCBhZGRpdGlvbiBwYXJ0LgorCistLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudDo6CisJV2hlbiBhcHBseWluZyBhIHBhdGNoLCB3aGljaCBpcyBhIGdpdC1lbmhhbmNlZCBwYXRjaAorCXRoYXQgd2FzIHByZXBhcmVkIHRvIHJlY29yZCB0aGUgcHJlLSBhbmQgcG9zdC1pbWFnZSBvYmplY3QKKwluYW1lIGluIGZ1bGwsIGFuZCB0aGUgcGF0aCBiZWluZyBwYXRjaGVkIGV4YWN0bHkgbWF0Y2hlcworCXRoZSBvYmplY3QgdGhlIHBhdGNoIGFwcGxpZXMgdG8gKGkuZS4gImluZGV4IiBsaW5lJ3MKKwlwcmUtaW1hZ2Ugb2JqZWN0IG5hbWUgaXMgd2hhdCBpcyBpbiB0aGUgd29ya2luZyB0cmVlKSwKKwlhbmQgdGhlIHBvc3QtaW1hZ2Ugb2JqZWN0IGlzIGF2YWlsYWJsZSBpbiB0aGUgb2JqZWN0CisJZGF0YWJhc2UsIHVzZSB0aGUgcG9zdC1pbWFnZSBvYmplY3QgYXMgdGhlIHBhdGNoCisJcmVzdWx0LiAgVGhpcyBhbGxvd3MgYmluYXJ5IGZpbGVzIHRvIGJlIHBhdGNoZWQgaW4gYQorCXZlcnkgbGltaXRlZCB3YXkuCisKKy0td2hpdGVzcGFjZT08b3B0aW9uPjo6CisJV2hlbiBhcHBseWluZyBhIHBhdGNoLCBkZXRlY3QgYSBuZXcgb3IgbW9kaWZpZWQgbGluZQorCXRoYXQgZW5kcyB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2VzICh0aGlzIGluY2x1ZGVzIGEKKwlsaW5lIHRoYXQgc29sZWx5IGNvbnNpc3RzIG9mIHdoaXRlc3BhY2VzKS4gIEJ5IGRlZmF1bHQsCisJdGhlIGNvbW1hbmQgb3V0cHV0cyB3YXJuaW5nIG1lc3NhZ2VzIGFuZCBhcHBsaWVzIHRoZQorCXBhdGNoLgorCVdoZW4gYGdpdC1hcHBseWAgaXMgdXNlZCBmb3Igc3RhdGlzdGljcyBhbmQgbm90IGFwcGx5aW5nIGEKKwlwYXRjaCwgaXQgZGVmYXVsdHMgdG8gYG5vd2FybmAuCisJWW91IGNhbiB1c2UgZGlmZmVyZW50IGA8b3B0aW9uPmAgdG8gY29udHJvbCB0aGlzCisJYmVoYXZpb3I6CisrCisqIGBub3dhcm5gIHR1cm5zIG9mZiB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSB3YXJuaW5nLgorKiBgd2FybmAgb3V0cHV0cyB3YXJuaW5ncyBmb3IgYSBmZXcgc3VjaCBlcnJvcnMsIGJ1dCBhcHBsaWVzIHRoZQorICBwYXRjaCAoZGVmYXVsdCkuCisqIGBlcnJvcmAgb3V0cHV0cyB3YXJuaW5ncyBmb3IgYSBmZXcgc3VjaCBlcnJvcnMsIGFuZCByZWZ1c2VzCisgIHRvIGFwcGx5IHRoZSBwYXRjaC4KKyogYGVycm9yLWFsbGAgaXMgc2ltaWxhciB0byBgZXJyb3JgIGJ1dCBzaG93cyBhbGwgZXJyb3JzLgorKiBgc3RyaXBgIG91dHB1dHMgd2FybmluZ3MgZm9yIGEgZmV3IHN1Y2ggZXJyb3JzLCBzdHJpcHMgb3V0IHRoZQorICB0cmFpbGluZyB3aGl0ZXNwYWNlcyBhbmQgYXBwbGllcyB0aGUgcGF0Y2guCisKKworQ29uZmlndXJhdGlvbgorLS0tLS0tLS0tLS0tLQorCithcHBseS53aGl0ZXNwYWNlOjoKKwlXaGVuIG5vIGAtLXdoaXRlc3BhY2VgIGZsYWcgaXMgZ2l2ZW4gZnJvbSB0aGUgY29tbWFuZAorCWxpbmUsIHRoaXMgY29uZmlndXJhdGlvbiBpdGVtIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYXBwbHltYm94LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5bWJveC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0YzZhNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5bWJveC50eHQKQEAgLTAsMCArMSw5MiBAQAorZ2l0LWFwcGx5bWJveCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYXBwbHltYm94IC0gQXBwbHkgYSBzZXJpZXMgb2YgcGF0Y2hlcyBpbiBhIG1haWxib3gKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtYXBwbHltYm94JyBbLXVdIFsta10gWy1xXSBbLW1dICggLWMgLmRvdGVzdC88bnVtPiB8IDxtYm94PiApIFsgPHNpZ25vZmY+IF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTcGxpdHMgbWFpbCBtZXNzYWdlcyBpbiBhIG1haWxib3ggaW50byBjb21taXQgbG9nIG1lc3NhZ2UsCithdXRob3JzaGlwIGluZm9ybWF0aW9uIGFuZCBwYXRjaGVzLCBhbmQgYXBwbGllcyB0aGVtIHRvIHRoZQorY3VycmVudCBicmFuY2guCisKKworT1BUSU9OUworLS0tLS0tLQorLXE6OgorCUFwcGx5IHBhdGNoZXMgaW50ZXJhY3RpdmVseS4gIFRoZSB1c2VyIHdpbGwgYmUgZ2l2ZW4KKwlvcHBvcnR1bml0eSB0byBlZGl0IHRoZSBsb2cgbWVzc2FnZSBhbmQgdGhlIHBhdGNoIGJlZm9yZQorCWF0dGVtcHRpbmcgdG8gYXBwbHkgaXQuCisKKy1rOjoKKwlVc3VhbGx5IHRoZSBwcm9ncmFtICdjbGVhbnMgdXAnIHRoZSBTdWJqZWN0OiBoZWFkZXIgbGluZQorCXRvIGV4dHJhY3QgdGhlIHRpdGxlIGxpbmUgZm9yIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UsCisJYW1vbmcgd2hpY2ggKDEpIHJlbW92ZSAnUmU6JyBvciAncmU6JywgKDIpIGxlYWRpbmcKKwl3aGl0ZXNwYWNlcywgKDMpICdbJyB1cCB0byAnXScsIHR5cGljYWxseSAnW1BBVENIXScsIGFuZAorCXRoZW4gcHJlcGVuZHMgIltQQVRDSF0gIi4gIFRoaXMgZmxhZyBmb3JiaWRzIHRoaXMKKwltdW5naW5nLCBhbmQgaXMgbW9zdCB1c2VmdWwgd2hlbiB1c2VkIHRvIHJlYWQgYmFjayAnZ2l0CisJZm9ybWF0LXBhdGNoIC0tbWJveCcgb3V0cHV0LgorCistbTo6CisJUGF0Y2hlcyBhcmUgYXBwbGllZCB3aXRoIGBnaXQtYXBwbHlgIGNvbW1hbmQsIGFuZCB1bmxlc3MKKwlpdCBjbGVhbmx5IGFwcGxpZXMgd2l0aG91dCBmdXp6LCB0aGUgcHJvY2Vzc2luZyBmYWlscy4KKwlXaXRoIHRoaXMgZmxhZywgaWYgYSB0cmVlIHRoYXQgdGhlIHBhdGNoIGFwcGxpZXMgY2xlYW5seQorCWlzIGZvdW5kIGluIGEgcmVwb3NpdG9yeSwgdGhlIHBhdGNoIGlzIGFwcGxpZWQgdG8gdGhlCisJdHJlZSBhbmQgdGhlbiBhIDMtd2F5IG1lcmdlIGJldHdlZW4gdGhlIHJlc3VsdGluZyB0cmVlCisJYW5kIHRoZSBjdXJyZW50IHRyZWUuCisKKy11OjoKKwlCeSBkZWZhdWx0LCB0aGUgY29tbWl0IGxvZyBtZXNzYWdlLCBhdXRob3IgbmFtZSBhbmQKKwlhdXRob3IgZW1haWwgYXJlIHRha2VuIGZyb20gdGhlIGUtbWFpbCB3aXRob3V0IGFueQorCWNoYXJzZXQgY29udmVyc2lvbiwgYWZ0ZXIgbWluaW1hbGx5IGRlY29kaW5nIE1JTUUKKwl0cmFuc2ZlciBlbmNvZGluZy4gIFRoaXMgZmxhZyBjYXVzZXMgdGhlIHJlc3VsdGluZworCWNvbW1pdCB0byBiZSBlbmNvZGVkIGluIHV0Zi04IGJ5IHRyYW5zbGl0ZXJhdGluZyB0aGVtLgorCU5vdGUgdGhhdCB0aGUgcGF0Y2ggaXMgYWx3YXlzIHVzZWQgYXMgaXMgd2l0aG91dCBjaGFyc2V0CisJY29udmVyc2lvbiwgZXZlbiB3aXRoIHRoaXMgZmxhZy4KKworLWMgLmRvdGVzdC88bnVtPjo6CisJV2hlbiB0aGUgcGF0Y2ggY29udGFpbmVkIGluIGFuIGUtbWFpbCBkb2VzIG5vdCBjbGVhbmx5CisJYXBwbHksIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gVGhlCisJcGF0Y2ggYW5kIGV4dHJhY3RlZCBtZXNzYWdlIGFyZSBmb3VuZCBpbiAuZG90ZXN0LywgYW5kCisJeW91IGNvdWxkIHJlLXJ1biAnZ2l0IGFwcGx5bWJveCcgd2l0aCAnLWMgLmRvdGVzdC88bnVtPicKKwlmbGFnIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3MgYWZ0ZXIgaW5zcGVjdGluZyBhbmQgZml4aW5nCisJdGhlbS4KKworPG1ib3g+OjoKKwlUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlLW1haWwgbWVzc2FnZXMKKwl3aXRoIHBhdGNoZXMuICBUaGlzIGZpbGUgc2hvdWxkIGJlIGluIHRoZSBVTklYIG1haWxib3gKKwlmb3JtYXQuICBTZWUgJ1N1Ym1pdHRpbmdQYXRjaGVzJyBkb2N1bWVudCB0byBsZWFybiBhYm91dAorCXRoZSBmb3JtYXR0aW5nIGNvbnZlbnRpb24gZm9yIGUtbWFpbCBzdWJtaXNzaW9uLgorCis8c2lnbm9mZj46OgorCVRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgeW91ciAiU2lnbmVkLW9mZi1ieSIKKwlsaW5lLiAgU2VlICdTdWJtaXR0aW5nUGF0Y2hlcycgZG9jdW1lbnQgdG8gbGVhcm4gd2hhdAorCSJTaWduZWQtb2ZmLWJ5IiBsaW5lIG1lYW5zLiAgWW91IGNhbiBhbHNvIGp1c3Qgc2F5CisJJ3llcycsICd0cnVlJywgJ21lJywgb3IgJ3BsZWFzZScgdG8gdXNlIGFuIGF1dG9tYXRpY2FsbHkKKwlnZW5lcmF0ZWQgIlNpZ25lZC1vZmYtYnkiIGxpbmUgYmFzZWQgb24geW91ciBjb21taXR0ZXIKKwlpZGVudGl0eS4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWFtWzFdLCBnaXRsaW5rOmdpdC1hcHBseXBhdGNoWzFdLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseXBhdGNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWFwcGx5cGF0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWZmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1hcHBseXBhdGNoLnR4dApAQCAtMCwwICsxLDUwIEBACitnaXQtYXBwbHlwYXRjaCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFwcGx5cGF0Y2ggLSBBcHBseSBvbmUgcGF0Y2ggZXh0cmFjdGVkIGZyb20gYW4gZS1tYWlsCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWFwcGx5cGF0Y2gnIDxtc2c+IDxwYXRjaD4gPGluZm8+IFs8c2lnbm9mZj5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhyZWUgZmlsZXMgPG1zZz4sIDxwYXRjaD4sIGFuZCA8aW5mbz4gcHJlcGFyZWQgZnJvbSBhbgorZS1tYWlsIG1lc3NhZ2UgYnkgJ2dpdC1tYWlsaW5mbycsIGFuZCBjcmVhdGVzIGEgY29tbWl0LiAgSXQgaXMKK3VzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBjb21tYW5kIGRpcmVjdGx5LgorCitUaGlzIGNvbW1hbmQgY2FuIHJ1biBgYXBwbHlwYXRjaC1tc2dgLCBgcHJlLWFwcGx5cGF0Y2hgLCBhbmQKK2Bwb3N0LWFwcGx5cGF0Y2hgIGhvb2tzLiAgU2VlIGxpbms6aG9va3MuaHRtbFtob29rc10gZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxtc2c+OjoKKwlDb21taXQgbG9nIG1lc3NhZ2UgKHNhbnMgdGhlIGZpcnN0IGxpbmUsIHdoaWNoIGNvbWVzCisJZnJvbSBlLW1haWwgU3ViamVjdCBzdG9yZWQgaW4gPGluZm8+KS4KKworPHBhdGNoPjo6CisJVGhlIHBhdGNoIHRvIGFwcGx5LgorCis8aW5mbz46OgorCUF1dGhvciBhbmQgc3ViamVjdCBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSBlLW1haWwsCisJdXNlZCBvbiAiYXV0aG9yIiBsaW5lIGFuZCBhcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUKKwljb21taXQgbG9nIG1lc3NhZ2UuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWFyY2hpbXBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYXJjaGltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExMzE4NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWFyY2hpbXBvcnQudHh0CkBAIC0wLDAgKzEsMTA2IEBACitnaXQtYXJjaGltcG9ydCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWFyY2hpbXBvcnQgLSBJbXBvcnQgYW4gQXJjaCByZXBvc2l0b3J5IGludG8gZ2l0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWFyY2hpbXBvcnQnIFstaF0gWy12XSBbLW9dIFstYV0gWy1mXSBbLVRdIFstRCBkZXB0aF0gWy10IHRlbXBkaXJdCisgICAgICAgICAgICAgICA8YXJjaGl2ZS9icmFuY2g+IFsgPGFyY2hpdmUvYnJhbmNoPiBdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW1wb3J0cyBhIHByb2plY3QgZnJvbSBvbmUgb3IgbW9yZSBBcmNoIHJlcG9zaXRvcmllcy4gSXQgd2lsbCBmb2xsb3cgYnJhbmNoZXMKK2FuZCByZXBvc2l0b3JpZXMgd2l0aGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgYnkgdGhlIDxhcmNoaXZlL2JyYW5jaD4KK3BhcmFtZXRlcnMgc3VwcGxpZWQuIElmIGl0IGNhbm5vdCBmaW5kIHRoZSByZW1vdGUgYnJhbmNoIGEgbWVyZ2UgY29tZXMgZnJvbQoraXQgd2lsbCBqdXN0IGltcG9ydCBpdCBhcyBhIHJlZ3VsYXIgY29tbWl0LiBJZiBpdCBjYW4gZmluZCBpdCwgaXQgd2lsbCBtYXJrIGl0IAorYXMgYSBtZXJnZSB3aGVuZXZlciBwb3NzaWJsZSAoc2VlIGRpc2N1c3Npb24gYmVsb3cpLiAKKworVGhlIHNjcmlwdCBleHBlY3RzIHlvdSB0byBwcm92aWRlIHRoZSBrZXkgcm9vdHMgd2hlcmUgaXQgY2FuIHN0YXJ0IHRoZSBpbXBvcnQgCitmcm9tIGFuICdpbml0aWFsIGltcG9ydCcgb3IgJ3RhZycgdHlwZSBvZiBBcmNoIGNvbW1pdC4gSXQgd2lsbCBmb2xsb3cgYW5kIAoraW1wb3J0IG5ldyBicmFuY2hlcyB3aXRoaW4gdGhlIHByb3ZpZGVkIHJvb3RzLiAKKworSXQgZXhwZWN0cyB0byBiZSBkZWFsaW5nIHdpdGggb25lIHByb2plY3Qgb25seS4gSWYgaXQgc2VlcyAKK2JyYW5jaGVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgcm9vdHMsIGl0IHdpbGwgcmVmdXNlIHRvIHJ1bi4gSW4gdGhhdCBjYXNlLCAKK2VkaXQgeW91ciA8YXJjaGl2ZS9icmFuY2g+IHBhcmFtZXRlcnMgdG8gZGVmaW5lIGNsZWFybHkgdGhlIHNjb3BlIG9mIHRoZSAKK2ltcG9ydC4gCisKK2BnaXQtYXJjaGltcG9ydGAgdXNlcyBgdGxhYCBleHRlbnNpdmVseSBpbiB0aGUgYmFja2dyb3VuZCB0byBhY2Nlc3MgdGhlIAorQXJjaCByZXBvc2l0b3J5LgorTWFrZSBzdXJlIHlvdSBoYXZlIGEgcmVjZW50IHZlcnNpb24gb2YgYHRsYWAgYXZhaWxhYmxlIGluIHRoZSBwYXRoLiBgdGxhYCBtdXN0Citrbm93IGFib3V0IHRoZSByZXBvc2l0b3JpZXMgeW91IHBhc3MgdG8gYGdpdC1hcmNoaW1wb3J0YC4gCisKK0ZvciB0aGUgaW5pdGlhbCBpbXBvcnQgYGdpdC1hcmNoaW1wb3J0YCBleHBlY3RzIHRvIGZpbmQgaXRzZWxmIGluIGFuIGVtcHR5IAorZGlyZWN0b3J5LiBUbyBmb2xsb3cgdGhlIGRldmVsb3BtZW50IG9mIGEgcHJvamVjdCB0aGF0IHVzZXMgQXJjaCwgcmVydW4gCitgZ2l0LWFyY2hpbXBvcnRgIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycyBhcyB0aGUgaW5pdGlhbCBpbXBvcnQgdG8gcGVyZm9ybSAKK2luY3JlbWVudGFsIGltcG9ydHMuCisKK01FUkdFUworLS0tLS0tCitQYXRjaCBtZXJnZSBkYXRhIGZyb20gQXJjaCBpcyB1c2VkIHRvIG1hcmsgbWVyZ2VzIGluIGdpdCBhcyB3ZWxsLiBnaXQgCitkb2VzIG5vdCBjYXJlIG11Y2ggYWJvdXQgdHJhY2tpbmcgcGF0Y2hlcywgYW5kIG9ubHkgY29uc2lkZXJzIGEgbWVyZ2Ugd2hlbiBhCiticmFuY2ggaW5jb3Jwb3JhdGVzIGFsbCB0aGUgY29tbWl0cyBzaW5jZSB0aGUgcG9pbnQgdGhleSBmb3JrZWQuIFRoZSBlbmQgcmVzdWx0CitpcyB0aGF0IGdpdCB3aWxsIGhhdmUgYSBnb29kIGlkZWEgb2YgaG93IGZhciBicmFuY2hlcyBoYXZlIGRpdmVyZ2VkLiBTbyB0aGUgCitpbXBvcnQgcHJvY2VzcyBkb2VzIGxvc2Ugc29tZSBwYXRjaC10cmFkaW5nIG1ldGFkYXRhLgorCitGb3J0dW5hdGVseSwgd2hlbiB5b3UgdHJ5IGFuZCBtZXJnZSBicmFuY2hlcyBpbXBvcnRlZCBmcm9tIEFyY2gsIAorZ2l0IHdpbGwgZmluZCBhIGdvb2QgbWVyZ2UgYmFzZSwgYW5kIGl0IGhhcyBhIGdvb2QgY2hhbmNlIG9mIGlkZW50aWZ5aW5nIAorcGF0Y2hlcyB0aGF0IGhhdmUgYmVlbiB0cmFkZWQgb3V0LW9mLXNlcXVlbmNlIGJldHdlZW4gdGhlIGJyYW5jaGVzLiAKKworT1BUSU9OUworLS0tLS0tLQorCistaDo6CisJRGlzcGxheSB1c2FnZS4KKworLXY6OgorCVZlcmJvc2Ugb3V0cHV0LiAKKworLVQ6OgorCU1hbnkgdGFncy4gV2lsbCBjcmVhdGUgYSB0YWcgZm9yIGV2ZXJ5IGNvbW1pdCwgcmVmbGVjdGluZyB0aGUgY29tbWl0IAorCW5hbWUgaW4gdGhlIEFyY2ggcmVwb3NpdG9yeS4KKworLWY6OgorCVVzZSB0aGUgZmFzdCBwYXRjaHNldCBpbXBvcnQgc3RyYXRlZ3kuICBUaGlzIGNhbiBiZSBzaWduaWZpY2FudGx5CisJZmFzdGVyIGZvciBsYXJnZSB0cmVlcywgYnV0IGNhbm5vdCBoYW5kbGUgZGlyZWN0b3J5IHJlbmFtZXMgb3IKKwlwZXJtaXNzaW9ucyBjaGFuZ2VzLiAgVGhlIGRlZmF1bHQgc3RyYXRlZ3kgaXMgc2xvdyBhbmQgc2FmZS4KKworLW86OgorCVVzZSB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkLXN0eWxlIGJyYW5jaCBuYW1lcyB1c2VkIGJ5CisJZWFybGllciB2ZXJzaW9ucyBvZiBnaXQtYXJjaGltcG9ydC4gIE9sZC1zdHlsZSBicmFuY2ggbmFtZXMKKwl3ZXJlIGNhdGVnb3J5LS1icmFuY2gsIHdoZXJlYXMgbmV3LXN0eWxlIGJyYW5jaCBuYW1lcyBhcmUKKwlhcmNoaXZlLGNhdGVnb3J5LS1icmFuY2gtLXZlcnNpb24uCisKKy1EIDxkZXB0aD46OgorCUZvbGxvdyBtZXJnZSBhbmNlc3RyeSBhbmQgYXR0ZW1wdCB0byBpbXBvcnQgdHJlZXMgdGhhdCBoYXZlIGJlZW4KKwltZXJnZWQgZnJvbS4gIFNwZWNpZnkgYSBkZXB0aCBncmVhdGVyIHRoYW4gMSBpZiBwYXRjaCBsb2dzIGhhdmUgYmVlbgorCXBydW5lZC4KKworLWE6OgorCUF0dGVtcHQgdG8gYXV0by1yZWdpc3RlciBhcmNoaXZlcyBhdCBodHRwOi8vbWlycm9ycy5zb3VyY2Vjb250cm9sLm5ldAorCVRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aXRoIHRoZSAtRCBvcHRpb24uCisKKy10IDx0bXBkaXI+OjoKKwlPdmVycmlkZSB0aGUgZGVmYXVsdCB0ZW1wZGlyLgorCisKKzxhcmNoaXZlL2JyYW5jaD46OgorCUFyY2hpdmUvYnJhbmNoIGlkZW50aWZpZXIgaW4gYSBmb3JtYXQgdGhhdCBgdGxhIGxvZ2AgdW5kZXJzdGFuZHMuIAorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLCBNYXJ0aW4gTGFuZ2hvZmYgYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1iaXNlY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYmlzZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzRiNDk2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtYmlzZWN0LnR4dApAQCAtMCwwICsxLDEzNiBAQAorZ2l0LWJpc2VjdCgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtYmlzZWN0IC0gRmluZCB0aGUgY2hhbmdlIHRoYXQgaW50cm9kdWNlZCBhIGJ1ZworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdCBiaXNlY3QnIDxzdWJjb21tYW5kPiA8b3B0aW9ucz4gCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhlIGNvbW1hbmQgdGFrZXMgdmFyaW91cyBzdWJjb21tYW5kcywgYW5kIGRpZmZlcmVudCBvcHRpb25zCitkZXBlbmRpbmcgb24gdGhlIHN1YmNvbW1hbmQ6CisKKyBnaXQgYmlzZWN0IHN0YXJ0IFs8cGF0aHM+Li4uXQorIGdpdCBiaXNlY3QgYmFkIDxyZXY+CisgZ2l0IGJpc2VjdCBnb29kIDxyZXY+CisgZ2l0IGJpc2VjdCByZXNldCBbPGJyYW5jaD5dCisgZ2l0IGJpc2VjdCB2aXN1YWxpemUKKyBnaXQgYmlzZWN0IHJlcGxheSA8bG9nZmlsZT4KKyBnaXQgYmlzZWN0IGxvZworCitUaGlzIGNvbW1hbmQgdXNlcyAnZ2l0LXJldi1saXN0IC0tYmlzZWN0JyBvcHRpb24gdG8gaGVscCBkcml2ZQordGhlIGJpbmFyeSBzZWFyY2ggcHJvY2VzcyB0byBmaW5kIHdoaWNoIGNoYW5nZSBpbnRyb2R1Y2VkIGEgYnVnLAorZ2l2ZW4gYW4gb2xkICJnb29kIiBjb21taXQgb2JqZWN0IG5hbWUgYW5kIGEgbGF0ZXIgImJhZCIgY29tbWl0CitvYmplY3QgbmFtZS4KKworVGhlIHdheSB5b3UgdXNlIGl0IGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydAorJCBnaXQgYmlzZWN0IGJhZAkJCSMgQ3VycmVudCB2ZXJzaW9uIGlzIGJhZAorJCBnaXQgYmlzZWN0IGdvb2QgdjIuNi4xMy1yYzIJCSMgdjIuNi4xMy1yYzIgd2FzIHRoZSBsYXN0IHZlcnNpb24KKwkJCQkJIyB0ZXN0ZWQgdGhhdCB3YXMgZ29vZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4geW91IGdpdmUgYXQgbGVhc3Qgb25lIGJhZCBhbmQgb25lIGdvb2QgdmVyc2lvbnMsIGl0IHdpbGwKK2Jpc2VjdCB0aGUgcmV2aXNpb24gdHJlZSBhbmQgc2F5IHNvbWV0aGluZyBsaWtlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Jpc2VjdGluZzogNjc1IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCBjaGVjayBvdXQgdGhlIHN0YXRlIGluIHRoZSBtaWRkbGUuIE5vdywgY29tcGlsZSB0aGF0IGtlcm5lbCwgYW5kIGJvb3QKK2l0LiBOb3csIGxldCdzIHNheSB0aGF0IHRoaXMgYm9vdGVkIGtlcm5lbCB3b3JrcyBmaW5lLCB0aGVuIGp1c3QgZG8KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgZ29vZAkJCSMgdGhpcyBvbmUgaXMgZ29vZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgbm93IHNheQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Jpc2VjdGluZzogMzM3IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3UgY29udGludWUgYWxvbmcsIGNvbXBpbGluZyB0aGF0IG9uZSwgdGVzdGluZyBpdCwgYW5kIGRlcGVuZGluZyBvbgord2hldGhlciBpdCBpcyBnb29kIG9yIGJhZCwgeW91IHNheSAiZ2l0IGJpc2VjdCBnb29kIiBvciAiZ2l0IGJpc2VjdCBiYWQiLAorYW5kIGFzayBmb3IgdGhlIG5leHQgYmlzZWN0aW9uLgorCitVbnRpbCB5b3UgaGF2ZSBubyBtb3JlIGxlZnQsIGFuZCB5b3UnbGwgaGF2ZSBiZWVuIGxlZnQgd2l0aCB0aGUgZmlyc3QgYmFkCitrZXJuZWwgcmV2IGluICJyZWZzL2Jpc2VjdC9iYWQiLgorCitPaCwgYW5kIHRoZW4gYWZ0ZXIgeW91IHdhbnQgdG8gcmVzZXQgdG8gdGhlIG9yaWdpbmFsIGhlYWQsIGRvIGEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcmVzZXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byBnZXQgYmFjayB0byB0aGUgbWFzdGVyIGJyYW5jaCwgaW5zdGVhZCBvZiBiZWluZyBpbiBvbmUgb2YgdGhlIGJpc2VjdGlvbgorYnJhbmNoZXMgKCJnaXQgYmlzZWN0IHN0YXJ0IiB3aWxsIGRvIHRoYXQgZm9yIHlvdSB0b28sIGFjdHVhbGx5OiBpdCB3aWxsCityZXNldCB0aGUgYmlzZWN0aW9uIHN0YXRlLCBhbmQgYmVmb3JlIGl0IGRvZXMgdGhhdCBpdCBjaGVja3MgdGhhdCB5b3UncmUKK25vdCB1c2luZyBzb21lIG9sZCBiaXNlY3Rpb24gYnJhbmNoKS4KKworRHVyaW5nIHRoZSBiaXNlY3Rpb24gcHJvY2VzcywgeW91IGNhbiBzYXkKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgdmlzdWFsaXplCistLS0tLS0tLS0tLS0KKwordG8gc2VlIHRoZSBjdXJyZW50bHkgcmVtYWluaW5nIHN1c3BlY3RzIGluIGBnaXRrYC4KKworVGhlIGdvb2QvYmFkIGlucHV0IGlzIGxvZ2dlZCwgYW5kIGBnaXQgYmlzZWN0Citsb2dgIHNob3dzIHdoYXQgeW91IGhhdmUgZG9uZSBzbyBmYXIuICBZb3UgY2FuIHRydW5jYXRlIGl0cworb3V0cHV0IHNvbWV3aGVyZSBhbmQgc2F2ZSBpdCBpbiBhIGZpbGUsIGFuZCBydW4KKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgcmVwbGF5IHRoYXQtZmlsZQorLS0tLS0tLS0tLS0tCisKK2lmIHlvdSBmaW5kIGxhdGVyIHlvdSBtYWRlIGEgbWlzdGFrZSB0ZWxsaW5nIGdvb2QvYmFkIGFib3V0IGEKK3JldmlzaW9uLgorCitJZiBpbiBhIG1pZGRsZSBvZiBiaXNlY3Qgc2Vzc2lvbiwgeW91IGtub3cgd2hhdCB0aGUgYmlzZWN0CitzdWdnZXN0ZWQgdG8gdHJ5IG5leHQgaXMgbm90IGEgZ29vZCBvbmUgdG8gdGVzdCAoZS5nLiB0aGUgY2hhbmdlCit0aGUgY29tbWl0IGludHJvZHVjZXMgaXMga25vd24gbm90IHRvIHdvcmsgaW4geW91ciBlbnZpcm9ubWVudAorYW5kIHlvdSBrbm93IGl0IGRvZXMgbm90IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCB0aGUgYnVnIHlvdQorYXJlIGNoYXNpbmcpLCB5b3UgbWF5IHdhbnQgdG8gZmluZCBhIG5lYXItYnkgY29tbWl0IGFuZCB0cnkgdGhhdAoraW5zdGVhZC4gIEl0IGdvZXMgc29tZXRoaW5nIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCiskIGdpdCBiaXNlY3QgZ29vZC9iYWQJCQkjIHByZXZpb3VzIHJvdW5kIHdhcyBnb29kL2JhZC4KK0Jpc2VjdGluZzogMzM3IHJldmlzaW9ucyBsZWZ0IHRvIHRlc3QgYWZ0ZXIgdGhpcworJCBnaXQgYmlzZWN0IHZpc3VhbGl6ZQkJCSMgb29wcywgdGhhdCBpcyB1bmludGVyZXN0aW5nLgorJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MwkJIyB0cnkgMyByZXZzIGJlZm9yZSB3aGF0CisJCQkJCSMgd2FzIHN1Z2dlc3RlZAorLS0tLS0tLS0tLS0tCisKK1RoZW4gY29tcGlsZSBhbmQgdGVzdCB0aGUgb25lIHlvdSBjaG9zZSB0byB0cnkuICBBZnRlciB0aGF0LAordGVsbCBiaXNlY3Qgd2hhdCB0aGUgcmVzdWx0IHdhcyBhcyB1c3VhbC4KKworWW91IGNhbiBmdXJ0aGVyIGN1dCBkb3duIHRoZSBudW1iZXIgb2YgdHJpYWxzIGlmIHlvdSBrbm93IHdoYXQKK3BhcnQgb2YgdGhlIHRyZWUgaXMgaW52b2x2ZWQgaW4gdGhlIHByb2JsZW0geW91IGFyZSB0cmFja2luZworZG93biwgYnkgZ2l2aW5nIHBhdGhzIHBhcmFtZXRlcnMgd2hlbiB5b3Ugc2F5IGBiaXNlY3Qgc3RhcnRgLAorbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGJpc2VjdCBzdGFydCBhcmNoL2kzODYgaW5jbHVkZS9hc20taTM4NgorLS0tLS0tLS0tLS0tCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtYmxhbWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtYmxhbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWQ5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1ibGFtZS50eHQKQEAgLTAsMCArMSw0NSBAQAorZ2l0LWJsYW1lKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWJsYW1lIC0gQmxhbWUgZmlsZSBsaW5lcyBvbiBjb21taXRzCisKK1NZTk9QU0lTCistLS0tLS0tLQorZ2l0LWJsYW1lIGZpbGUgW29wdGlvbnNdIGZpbGUgW3JldmlzaW9uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0Fubm90YXRlcyBlYWNoIGxpbmUgaW4gdGhlIGdpdmVuIGZpbGUgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb21taXQKK3doaWNoIGludHJvZHVjZWQgdGhlIGxpbmUuIFN0YXJ0IGFubm90YXRpb24gZnJvbSB0aGUgZ2l2ZW4gcmV2aXNpb24uCisKK09QVElPTlMKKy0tLS0tLS0KKy1jLCAtLWNvbXBhdGliaWxpdHk6OgorCVVzZSB0aGUgc2FtZSBvdXRwdXQgbW9kZSBhcyBnaXQtYW5ub3RhdGUgKERlZmF1bHQ6IG9mZikuCisKKy1sLCAtLWxvbmc6OgorCVNob3cgbG9uZyByZXYgKERlZmF1bHQ6IG9mZikuCisKKy10LCAtLXRpbWU6OgorCVNob3cgcmF3IHRpbWVzdGFtcCAoRGVmYXVsdDogb2ZmKS4KKworLVMsIC0tcmV2LWZpbGUgPHJldnMtZmlsZT46OgorCVVzZSByZXZzIGZyb20gcmV2cy1maWxlIGluc3RlYWQgb2YgY2FsbGluZyBnaXQtcmV2LWxpc3QuCisKKy1oLCAtLWhlbHA6OgorCVNob3cgaGVscCBtZXNzYWdlLgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtYW5ub3RhdGVbMV0KKworQVVUSE9SCistLS0tLS0KK1dyaXR0ZW4gYnkgRnJlZHJpayBLdWl2aW5lbiA8ZnJla3UwNDVAc3R1ZGVudC5saXUuc2U+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWJyYW5jaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1icmFuY2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2VmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1icmFuY2gudHh0CkBAIC0wLDAgKzEsMTA5IEBACitnaXQtYnJhbmNoKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1icmFuY2ggLSBMaXN0LCBjcmVhdGUsIG9yIGRlbGV0ZSBicmFuY2hlcy4KKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWJyYW5jaCcgWy1yXQorJ2dpdC1icmFuY2gnIFstbF0gWy1mXSA8YnJhbmNobmFtZT4gWzxzdGFydC1wb2ludD5dCisnZ2l0LWJyYW5jaCcgKC1kIHwgLUQpIDxicmFuY2huYW1lPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1dpdGggbm8gYXJndW1lbnRzIGdpdmVuIChvciBqdXN0IGAtcmApIGEgbGlzdCBvZiBhdmFpbGFibGUgYnJhbmNoZXMKK3dpbGwgYmUgc2hvd24sIHRoZSBjdXJyZW50IGJyYW5jaCB3aWxsIGJlIGhpZ2hsaWdodGVkIHdpdGggYW4gYXN0ZXJpc2suCisKK0luIGl0cyBzZWNvbmQgZm9ybSwgYSBuZXcgYnJhbmNoIG5hbWVkIDxicmFuY2huYW1lPiB3aWxsIGJlIGNyZWF0ZWQuCitJdCB3aWxsIHN0YXJ0IG91dCB3aXRoIGEgaGVhZCBlcXVhbCB0byB0aGUgb25lIGdpdmVuIGFzIDxzdGFydC1wb2ludD4uCitJZiBubyA8c3RhcnQtcG9pbnQ+IGlzIGdpdmVuLCB0aGUgYnJhbmNoIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgaGVhZAorZXF1YWwgdG8gdGhhdCBvZiB0aGUgY3VycmVudGx5IGNoZWNrZWQgb3V0IGJyYW5jaC4KKworV2l0aCBhIGAtZGAgb3IgYC1EYCBvcHRpb24sIGA8YnJhbmNobmFtZT5gIHdpbGwgYmUgZGVsZXRlZC4gIFlvdSBtYXkKK3NwZWNpZnkgbW9yZSB0aGFuIG9uZSBicmFuY2ggZm9yIGRlbGV0aW9uLiAgSWYgdGhlIGJyYW5jaCBjdXJyZW50bHkKK2hhcyBhIHJlZiBsb2cgdGhlbiB0aGUgcmVmIGxvZyB3aWxsIGFsc28gYmUgZGVsZXRlZC4KKworCitPUFRJT05TCistLS0tLS0tCistZDo6CisJRGVsZXRlIGEgYnJhbmNoLiBUaGUgYnJhbmNoIG11c3QgYmUgZnVsbHkgbWVyZ2VkLgorCistRDo6CisJRGVsZXRlIGEgYnJhbmNoIGlycmVzcGVjdGl2ZSBvZiBpdHMgaW5kZXggc3RhdHVzLgorCistbDo6CisJQ3JlYXRlIHRoZSBicmFuY2gncyByZWYgbG9nLiAgVGhpcyBhY3RpdmF0ZXMgcmVjb3JkaW5nIG9mCisJYWxsIGNoYW5nZXMgdG8gbWFkZSB0aGUgYnJhbmNoIHJlZiwgZW5hYmxpbmcgdXNlIG9mIGRhdGUKKwliYXNlZCBzaGExIGV4cHJlc3Npb25zIHN1Y2ggYXMgIjxicmFuY2huYW1lPkB7eWVzdGVyZGF5fSIuCisKKy1mOjoKKwlGb3JjZSB0aGUgY3JlYXRpb24gb2YgYSBuZXcgYnJhbmNoIGV2ZW4gaWYgaXQgbWVhbnMgZGVsZXRpbmcKKwlhIGJyYW5jaCB0aGF0IGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUgbmFtZS4KKworLXI6OgorCUxpc3Qgb25seSB0aGUgInJlbW90ZSIgYnJhbmNoZXMuCisKKzxicmFuY2huYW1lPjo6CisJVGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0byBjcmVhdGUgb3IgZGVsZXRlLgorCVRoZSBuZXcgYnJhbmNoIG5hbWUgbXVzdCBwYXNzIGFsbCBjaGVja3MgZGVmaW5lZCBieQorCWdpdGxpbms6Z2l0LWNoZWNrLXJlZi1mb3JtYXRbMV0uICBTb21lIG9mIHRoZXNlIGNoZWNrcworCW1heSByZXN0cmljdCB0aGUgY2hhcmFjdGVycyBhbGxvd2VkIGluIGEgYnJhbmNoIG5hbWUuCisKKzxzdGFydC1wb2ludD46OgorCVRoZSBuZXcgYnJhbmNoIHdpbGwgYmUgY3JlYXRlZCB3aXRoIGEgSEVBRCBlcXVhbCB0byB0aGlzLiAgSXQgbWF5CisJYmUgZ2l2ZW4gYXMgYSBicmFuY2ggbmFtZSwgYSBjb21taXQtaWQsIG9yIGEgdGFnLiAgSWYgdGhpcyBvcHRpb24KKwlpcyBvbWl0dGVkLCB0aGUgY3VycmVudCBicmFuY2ggaXMgYXNzdW1lZC4KKworCisKK0V4YW1wbGVzCistLS0tLS0tLQorCitTdGFydCBkZXZlbG9wbWVudCBvZmYgb2YgYSBrbm93biB0YWc6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtLy4uLi9saW51eC0yLjYgbXkyLjYKKyQgY2QgbXkyLjYKKyQgZ2l0IGJyYW5jaCBteTIuNi4xNCB2Mi42LjE0ICAgPDE+CiskIGdpdCBjaGVja291dCBteTIuNi4xNAorLS0tLS0tLS0tLS0tCisrCis8MT4gVGhpcyBzdGVwIGFuZCB0aGUgbmV4dCBvbmUgY291bGQgYmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBzdGVwIHdpdGgKKyJjaGVja291dCAtYiBteTIuNi4xNCB2Mi42LjE0Ii4KKworRGVsZXRlIHVubmVlZGVkIGJyYW5jaDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnLy4uLi9naXQuZ2l0IG15LmdpdAorJCBjZCBteS5naXQKKyQgZ2l0IGJyYW5jaCAtRCB0b2RvICAgIDwxPgorLS0tLS0tLS0tLS0tCisrCis8MT4gZGVsZXRlIHRvZG8gYnJhbmNoIGV2ZW4gaWYgdGhlICJtYXN0ZXIiIGJyYW5jaCBkb2VzIG5vdCBoYXZlIGFsbAorY29tbWl0cyBmcm9tIHRvZG8gYnJhbmNoLgorCisKK05vdGVzCistLS0tLQorCitJZiB5b3UgYXJlIGNyZWF0aW5nIGEgYnJhbmNoIHRoYXQgeW91IHdhbnQgdG8gaW1tZWRpYXRlbHkgY2hlY2tvdXQsIGl0J3MKK2Vhc2llciB0byB1c2UgdGhlIGdpdCBjaGVja291dCBjb21tYW5kIHdpdGggaXRzIGAtYmAgb3B0aW9uIHRvIGNyZWF0ZQorYSBicmFuY2ggYW5kIGNoZWNrIGl0IG91dCB3aXRoIGEgc2luZ2xlIGNvbW1hbmQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNhdC1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTljYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2F0LWZpbGUudHh0CkBAIC0wLDAgKzEsNzIgQEAKK2dpdC1jYXQtZmlsZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jYXQtZmlsZSAtIFByb3ZpZGUgY29udGVudCBvciB0eXBlIGluZm9ybWF0aW9uIGZvciByZXBvc2l0b3J5IG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY2F0LWZpbGUnIFstdCB8IC1zIHwgLWUgfCAtcCB8IDx0eXBlPl0gPG9iamVjdD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitQcm92aWRlcyBjb250ZW50IG9yIHR5cGUgb2Ygb2JqZWN0cyBpbiB0aGUgcmVwb3NpdG9yeS4gVGhlIHR5cGUKK2lzIHJlcXVpcmVkIHVubGVzcyAnLXQnIG9yICctcCcgaXMgdXNlZCB0byBmaW5kIHRoZSBvYmplY3QgdHlwZSwKK29yICctcycgaXMgdXNlZCB0byBmaW5kIHRoZSBvYmplY3Qgc2l6ZS4KKworT1BUSU9OUworLS0tLS0tLQorPG9iamVjdD46OgorCVRoZSBzaGExIGlkZW50aWZpZXIgb2YgdGhlIG9iamVjdC4KKworLXQ6OgorCUluc3RlYWQgb2YgdGhlIGNvbnRlbnQsIHNob3cgdGhlIG9iamVjdCB0eXBlIGlkZW50aWZpZWQgYnkKKwk8b2JqZWN0Pi4KKworLXM6OgorCUluc3RlYWQgb2YgdGhlIGNvbnRlbnQsIHNob3cgdGhlIG9iamVjdCBzaXplIGlkZW50aWZpZWQgYnkKKwk8b2JqZWN0Pi4KKworLWU6OgorCVN1cHByZXNzIGFsbCBvdXRwdXQ7IGluc3RlYWQgZXhpdCB3aXRoIHplcm8gc3RhdHVzIGlmIDxvYmplY3Q+CisJZXhpc3RzIGFuZCBpcyBhIHZhbGlkIG9iamVjdC4KKworLXA6OgorCVByZXR0eS1wcmludCB0aGUgY29udGVudHMgb2YgPG9iamVjdD4gYmFzZWQgb24gaXRzIHR5cGUuCisKKzx0eXBlPjo6CisJVHlwaWNhbGx5IHRoaXMgbWF0Y2hlcyB0aGUgcmVhbCB0eXBlIG9mIDxvYmplY3Q+IGJ1dCBhc2tpbmcKKwlmb3IgYSB0eXBlIHRoYXQgY2FuIHRyaXZpYWxseSBiZSBkZXJlZmVyZW5jZWQgZnJvbSB0aGUgZ2l2ZW4KKwk8b2JqZWN0PiBpcyBhbHNvIHBlcm1pdHRlZC4gIEFuIGV4YW1wbGUgaXMgdG8gYXNrIGZvciBhCisJInRyZWUiIHdpdGggPG9iamVjdD4gYmVpbmcgYSBjb21taXQgb2JqZWN0IHRoYXQgY29udGFpbnMgaXQsCisJb3IgdG8gYXNrIGZvciBhICJibG9iIiB3aXRoIDxvYmplY3Q+IGJlaW5nIGEgdGFnIG9iamVjdCB0aGF0CisJcG9pbnRzIGF0IGl0LgorCitPVVRQVVQKKy0tLS0tLQorSWYgJy10JyBpcyBzcGVjaWZpZWQsIG9uZSBvZiB0aGUgPHR5cGU+LgorCitJZiAnLXMnIGlzIHNwZWNpZmllZCwgdGhlIHNpemUgb2YgdGhlIDxvYmplY3Q+IGluIGJ5dGVzLgorCitJZiAnLWUnIGlzIHNwZWNpZmllZCwgbm8gb3V0cHV0LgorCitJZiAnLXAnIGlzIHNwZWNpZmllZCwgdGhlIGNvbnRlbnRzIG9mIDxvYmplY3Q+IGFyZSBwcmV0dHktcHJpbnRlZC4KKworT3RoZXJ3aXNlIHRoZSByYXcgKHRob3VnaCB1bmNvbXByZXNzZWQpIGNvbnRlbnRzIG9mIHRoZSA8b2JqZWN0PiB3aWxsCitiZSByZXR1cm5lZC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVjay1yZWYtZm9ybWF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2E1ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2stcmVmLWZvcm1hdC50eHQKQEAgLTAsMCArMSw1NSBAQAorZ2l0LWNoZWNrLXJlZi1mb3JtYXQoMSkKKz09PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jaGVjay1yZWYtZm9ybWF0IC0gTWFrZSBzdXJlIHJlZiBuYW1lIGlzIHdlbGwgZm9ybWVkCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVjay1yZWYtZm9ybWF0JyA8cmVmbmFtZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDaGVja3MgaWYgYSBnaXZlbiAncmVmbmFtZScgaXMgYWNjZXB0YWJsZSwgYW5kIGV4aXRzIG5vbi16ZXJvIGlmCitpdCBpcyBub3QuCisKK0EgcmVmZXJlbmNlIGlzIHVzZWQgaW4gZ2l0IHRvIHNwZWNpZnkgYnJhbmNoZXMgYW5kIHRhZ3MuICBBCiticmFuY2ggaGVhZCBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvaGVhZHNgIGRpcmVjdG9yeSwgYW5kCithIHRhZyBpcyBzdG9yZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvdGFnc2AgZGlyZWN0b3J5LiAgZ2l0CitpbXBvc2VzIHRoZSBmb2xsb3dpbmcgcnVsZXMgb24gaG93IHJlZnMgYXJlIG5hbWVkOgorCisuIEl0IGNhbiBpbmNsdWRlIHNsYXNoIGAvYCBmb3IgaGllcmFyY2hpY2FsIChkaXJlY3RvcnkpCisgIGdyb3VwaW5nLCBidXQgbm8gc2xhc2gtc2VwYXJhdGVkIGNvbXBvbmVudCBjYW4gYmVnaW4gd2l0aCBhCisgIGRvdCBgLmA7CisKKy4gSXQgY2Fubm90IGhhdmUgdHdvIGNvbnNlY3V0aXZlIGRvdHMgYC4uYCBhbnl3aGVyZTsKKworLiBJdCBjYW5ub3QgaGF2ZSBBU0NJSSBjb250cm9sIGNoYXJhY3RlciAoaS5lLiBieXRlcyB3aG9zZQorICB2YWx1ZXMgYXJlIGxvd2VyIHRoYW4gXDA0MCwgb3IgXDE3NyBgREVMYCksIHNwYWNlLCB0aWxkZSBgfmAsCisgIGNhcmV0IGB7Y2FyZXR9YCwgY29sb24gYDpgLCBxdWVzdGlvbi1tYXJrIGA/YCwgYXN0ZXJpc2sgYCpgLAorICBvciBvcGVuIGJyYWNrZXQgYFtgIGFueXdoZXJlOworCisuIEl0IGNhbm5vdCBlbmQgd2l0aCBhIHNsYXNoIGAvYC4KKworVGhlc2UgcnVsZXMgbWFrZXMgaXQgZWFzeSBmb3Igc2hlbGwgc2NyaXB0IGJhc2VkIHRvb2xzIHRvIHBhcnNlCityZWZuYW1lcywgcGF0aG5hbWUgZXhwYW5zaW9uIGJ5IHRoZSBzaGVsbCB3aGVuIGEgcmVmbmFtZSBpcyB1c2VkCit1bnF1b3RlZCAoYnkgbWlzdGFrZSksIGFuZCBhbHNvIGF2b2lkcyBhbWJpZ3VpdGllcyBpbiBjZXJ0YWluCityZWZuYW1lIGV4cHJlc3Npb25zIChzZWUgZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdKS4gIE5hbWVseToKKworLiBkb3VibGUtZG90IGAuLmAgYXJlIG9mdGVuIHVzZWQgYXMgaW4gYHJlZjEuLnJlZjJgLCBhbmQgaW4gc29tZQorICBjb250ZXh0IHRoaXMgbm90YXRpb24gbWVhbnMgYHtjYXJldH1yZWYxIHJlZjJgIChpLmUuIG5vdCBpbgorICByZWYxIGFuZCBpbiByZWYyKS4KKworLiB0aWxkZSBgfmAgYW5kIGNhcmV0IGB7Y2FyZXR9YCBhcmUgdXNlZCB0byBpbnRyb2R1Y2UgcG9zdGZpeAorICAnbnRoIHBhcmVudCcgYW5kICdwZWVsIG9uaW9uJyBvcGVyYXRpb24uCisKKy4gY29sb24gYDpgIGlzIHVzZWQgYXMgaW4gYHNyY3JlZjpkc3RyZWZgIHRvIG1lYW4gInVzZSBzcmNyZWZcJ3MKKyAgdmFsdWUgYW5kIHN0b3JlIGl0IGluIGRzdHJlZiIgaW4gZmV0Y2ggYW5kIHB1c2ggb3BlcmF0aW9ucy4KKyAgSXQgbWF5IGFsc28gYmUgdXNlZCB0byBzZWxlY3QgYSBzcGVjaWZpYyBvYmplY3Qgc3VjaCBhcyB3aXRoCisgIGdpdGxpbms6Z2l0LWNhdC1maWxlWzFdICJnaXQtY2F0LWZpbGUgYmxvYiB2MS4zLjM6cmVmcy5jIi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVjMTczCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2hlY2tvdXQtaW5kZXgudHh0CkBAIC0wLDAgKzEsMTg1IEBACitnaXQtY2hlY2tvdXQtaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlY2tvdXQtaW5kZXggLSBDb3B5IGZpbGVzIGZyb20gdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jaGVja291dC1pbmRleCcgWy11XSBbLXFdIFstYV0gWy1mXSBbLW5dIFstLXByZWZpeD08c3RyaW5nPl0KKwkJICAgWy0tc3RhZ2U9PG51bWJlcj58YWxsXQorCQkgICBbLS10ZW1wXQorCQkgICBbLXpdIFstLXN0ZGluXQorCQkgICBbLS1dIFs8ZmlsZT5dXCoKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitXaWxsIGNvcHkgYWxsIGZpbGVzIGxpc3RlZCBmcm9tIHRoZSBpbmRleCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkKKyhub3Qgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZmlsZXMpLgorCitPUFRJT05TCistLS0tLS0tCistdXwtLWluZGV4OjoKKwl1cGRhdGUgc3RhdCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNoZWNrZWQgb3V0IGVudHJpZXMgaW4KKwl0aGUgaW5kZXggZmlsZS4KKworLXF8LS1xdWlldDo6CisJYmUgcXVpZXQgaWYgZmlsZXMgZXhpc3Qgb3IgYXJlIG5vdCBpbiB0aGUgaW5kZXgKKworLWZ8LS1mb3JjZTo6CisJZm9yY2VzIG92ZXJ3cml0ZSBvZiBleGlzdGluZyBmaWxlcworCistYXwtLWFsbDo6CisJY2hlY2tzIG91dCBhbGwgZmlsZXMgaW4gdGhlIGluZGV4LiAgQ2Fubm90IGJlIHVzZWQKKwl0b2dldGhlciB3aXRoIGV4cGxpY2l0IGZpbGVuYW1lcy4KKworLW58LS1uby1jcmVhdGU6OgorCURvbid0IGNoZWNrb3V0IG5ldyBmaWxlcywgb25seSByZWZyZXNoIGZpbGVzIGFscmVhZHkgY2hlY2tlZAorCW91dC4KKworLS1wcmVmaXg9PHN0cmluZz46OgorCVdoZW4gY3JlYXRpbmcgZmlsZXMsIHByZXBlbmQgPHN0cmluZz4gKHVzdWFsbHkgYSBkaXJlY3RvcnkKKwlpbmNsdWRpbmcgYSB0cmFpbGluZyAvKQorCistLXN0YWdlPTxudW1iZXI+fGFsbDo6CisJSW5zdGVhZCBvZiBjaGVja2luZyBvdXQgdW5tZXJnZWQgZW50cmllcywgY29weSBvdXQgdGhlCisJZmlsZXMgZnJvbSBuYW1lZCBzdGFnZS4gIDxudW1iZXI+IG11c3QgYmUgYmV0d2VlbiAxIGFuZCAzLgorCU5vdGU6IC0tc3RhZ2U9YWxsIGF1dG9tYXRpY2FsbHkgaW1wbGllcyAtLXRlbXAuCisKKy0tdGVtcDo6CisJSW5zdGVhZCBvZiBjb3B5aW5nIHRoZSBmaWxlcyB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkKKwl3cml0ZSB0aGUgY29udGVudCB0byB0ZW1wb3JhcnkgZmlsZXMuICBUaGUgdGVtcG9yYXJ5IG5hbWUKKwlhc3NvY2lhdGlvbnMgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZG91dC4KKworLS1zdGRpbjo6CisJSW5zdGVhZCBvZiB0YWtpbmcgbGlzdCBvZiBwYXRocyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCisJcmVhZCBsaXN0IG9mIHBhdGhzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LiAgUGF0aHMgYXJlCisJc2VwYXJhdGVkIGJ5IExGIChpLmUuIG9uZSBwYXRoIHBlciBsaW5lKSBieSBkZWZhdWx0LgorCistejo6CisJT25seSBtZWFuaW5nZnVsIHdpdGggYC0tc3RkaW5gOyBwYXRocyBhcmUgc2VwYXJhdGVkIHdpdGgKKwlOVUwgY2hhcmFjdGVyIGluc3RlYWQgb2YgTEYuCisKK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworVGhlIG9yZGVyIG9mIHRoZSBmbGFncyB1c2VkIHRvIG1hdHRlciwgYnV0IG5vdCBhbnltb3JlLgorCitKdXN0IGRvaW5nIGBnaXQtY2hlY2tvdXQtaW5kZXhgIGRvZXMgbm90aGluZy4gWW91IHByb2JhYmx5IG1lYW50CitgZ2l0LWNoZWNrb3V0LWluZGV4IC1hYC4gQW5kIGlmIHlvdSB3YW50IHRvIGZvcmNlIGl0LCB5b3Ugd2FudAorYGdpdC1jaGVja291dC1pbmRleCAtZiAtYWAuCisKK0ludHVpdGl2ZW5lc3MgaXMgbm90IHRoZSBnb2FsIGhlcmUuIFJlcGVhdGFiaWxpdHkgaXMuIFRoZSByZWFzb24gZm9yCit0aGUgIm5vIGFyZ3VtZW50cyBtZWFucyBubyB3b3JrIiBiZWhhdmlvciBpcyB0aGF0IGZyb20gc2NyaXB0cyB5b3UgYXJlCitzdXBwb3NlZCB0byBiZSBhYmxlIHRvIGRvOgorCistLS0tLS0tLS0tLS0tLS0tCiskIGZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgeGFyZ3MgLTAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC0tCistLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIHdpbGwgZm9yY2UgYWxsIGV4aXN0aW5nIGAqLmhgIGZpbGVzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhlaXIKK2NhY2hlZCBjb3BpZXMuIElmIGFuIGVtcHR5IGNvbW1hbmQgbGluZSBpbXBsaWVkICJhbGwiLCB0aGVuIHRoaXMgd291bGQKK2ZvcmNlLXJlZnJlc2ggZXZlcnl0aGluZyBpbiB0aGUgaW5kZXgsIHdoaWNoIHdhcyBub3QgdGhlIHBvaW50LiAgQnV0CitzaW5jZSBnaXQtY2hlY2tvdXQtaW5kZXggYWNjZXB0cyAtLXN0ZGluIGl0IHdvdWxkIGJlIGZhc3RlciB0byB1c2U6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZmluZCAuIC1uYW1lICcqLmgnIC1wcmludDAgfCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXogLS1zdGRpbgorLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYC0tYCBpcyBqdXN0IGEgZ29vZCBpZGVhIHdoZW4geW91IGtub3cgdGhlIHJlc3Qgd2lsbCBiZSBmaWxlbmFtZXM7CitpdCB3aWxsIHByZXZlbnQgcHJvYmxlbXMgd2l0aCBhIGZpbGVuYW1lIG9mLCBmb3IgZXhhbXBsZSwgIGAtYWAuCitVc2luZyBgLS1gIGlzIHByb2JhYmx5IGEgZ29vZCBwb2xpY3kgaW4gc2NyaXB0cy4KKworCitVc2luZyAtLXRlbXAgb3IgLS1zdGFnZT1hbGwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV2hlbiBgLS10ZW1wYCBpcyB1c2VkIChvciBpbXBsaWVkIGJ5IGAtLXN0YWdlPWFsbGApCitgZ2l0LWNoZWNrb3V0LWluZGV4YCB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciBlYWNoIGluZGV4CitlbnRyeSBiZWluZyBjaGVja2VkIG91dC4gIFRoZSBpbmRleCB3aWxsIG5vdCBiZSB1cGRhdGVkIHdpdGggc3RhdAoraW5mb3JtYXRpb24uICBUaGVzZSBvcHRpb25zIGNhbiBiZSB1c2VmdWwgaWYgdGhlIGNhbGxlciBuZWVkcyBhbGwKK3N0YWdlcyBvZiBhbGwgdW5tZXJnZWQgZW50cmllcyBzbyB0aGF0IHRoZSB1bm1lcmdlZCBmaWxlcyBjYW4gYmUKK3Byb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBtZXJnZSB0b29sLgorCitBIGxpc3Rpbmcgd2lsbCBiZSB3cml0dGVuIHRvIHN0ZG91dCBwcm92aWRpbmcgdGhlIGFzc29jaWF0aW9uIG9mCit0ZW1wb3JhcnkgZmlsZSBuYW1lcyB0byB0cmFja2VkIHBhdGggbmFtZXMuICBUaGUgbGlzdGluZyBmb3JtYXQKK2hhcyB0d28gdmFyaWF0aW9uczoKKworICAgIC4gdGVtcG5hbWUgVEFCIHBhdGggUlMKKysKK1RoZSBmaXJzdCBmb3JtYXQgaXMgd2hhdCBnZXRzIHVzZWQgd2hlbiBgLS1zdGFnZWAgaXMgb21pdHRlZCBvcgoraXMgbm90IGAtLXN0YWdlPWFsbGAuIFRoZSBmaWVsZCB0ZW1wbmFtZSBpcyB0aGUgdGVtcG9yYXJ5IGZpbGUKK25hbWUgaG9sZGluZyB0aGUgZmlsZSBjb250ZW50IGFuZCBwYXRoIGlzIHRoZSB0cmFja2VkIHBhdGggbmFtZSBpbgordGhlIGluZGV4LiAgT25seSB0aGUgcmVxdWVzdGVkIGVudHJpZXMgYXJlIG91dHB1dC4KKworICAgIC4gc3RhZ2UxdGVtcCBTUCBzdGFnZTJ0ZW1wIFNQIHN0YWdlM3RtcCBUQUIgcGF0aCBSUworKworVGhlIHNlY29uZCBmb3JtYXQgaXMgd2hhdCBnZXRzIHVzZWQgd2hlbiBgLS1zdGFnZT1hbGxgLiAgVGhlIHRocmVlCitzdGFnZSB0ZW1wb3JhcnkgZmllbGRzIChzdGFnZTF0ZW1wLCBzdGFnZTJ0ZW1wLCBzdGFnZTN0ZW1wKSBsaXN0IHRoZQorbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUgaWYgdGhlcmUgaXMgYSBzdGFnZSBlbnRyeSBpbiB0aGUgaW5kZXgKK29yIGAuYCBpZiB0aGVyZSBpcyBubyBzdGFnZSBlbnRyeS4gIFBhdGhzIHdoaWNoIG9ubHkgaGF2ZSBhIHN0YWdlIDAKK2VudHJ5IHdpbGwgYWx3YXlzIGJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0LgorCitJbiBib3RoIGZvcm1hdHMgUlMgKHRoZSByZWNvcmQgc2VwYXJhdG9yKSBpcyBuZXdsaW5lIGJ5IGRlZmF1bHQKK2J1dCB3aWxsIGJlIHRoZSBudWxsIGJ5dGUgaWYgLXogd2FzIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorVGhlIHRlbXBvcmFyeSBmaWxlIG5hbWVzIGFyZSBhbHdheXMgc2FmZSBzdHJpbmdzOyB0aGV5IHdpbGwgbmV2ZXIKK2NvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMgb3Igd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLiAgVGhlIHBhdGgKK2ZpZWxkIGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZSB0ZW1wb3JhcnkKK2ZpbGUgbmFtZXMgYXJlIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4KKworSWYgdGhlIG9iamVjdCBiZWluZyBjb3BpZWQgb3V0IHRvIGEgdGVtcG9yYXJ5IGZpbGUgaXMgYSBzeW1ib2xpYworbGluayB0aGUgY29udGVudCBvZiB0aGUgbGluayB3aWxsIGJlIHdyaXR0ZW4gdG8gYSBub3JtYWwgZmlsZS4gIEl0IGlzCit1cCB0byB0aGUgZW5kLXVzZXIgb3IgdGhlIFBvcmNlbGFpbiB0byBtYWtlIHVzZSBvZiB0aGlzIGluZm9ybWF0aW9uLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorVG8gdXBkYXRlIGFuZCByZWZyZXNoIG9ubHkgdGhlIGZpbGVzIGFscmVhZHkgY2hlY2tlZCBvdXQ6OgorKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggLW4gLWYgLWEgJiYgZ2l0LXVwZGF0ZS1pbmRleCAtLWlnbm9yZS1taXNzaW5nIC0tcmVmcmVzaAorLS0tLS0tLS0tLS0tLS0tLQorCitVc2luZyBgZ2l0LWNoZWNrb3V0LWluZGV4YCB0byAiZXhwb3J0IGFuIGVudGlyZSB0cmVlIjo6CisJVGhlIHByZWZpeCBhYmlsaXR5IGJhc2ljYWxseSBtYWtlcyBpdCB0cml2aWFsIHRvIHVzZQorCWBnaXQtY2hlY2tvdXQtaW5kZXhgIGFzIGFuICJleHBvcnQgYXMgdHJlZSIgZnVuY3Rpb24uCisJSnVzdCByZWFkIHRoZSBkZXNpcmVkIHRyZWUgaW50byB0aGUgaW5kZXgsIGFuZCBkbzoKKysKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PWdpdC1leHBvcnQtZGlyLyAtYQorLS0tLS0tLS0tLS0tLS0tLQorKworYGdpdC1jaGVja291dC1pbmRleGAgd2lsbCAiZXhwb3J0IiB0aGUgaW5kZXggaW50byB0aGUgc3BlY2lmaWVkCitkaXJlY3RvcnkuCisrCitUaGUgZmluYWwgIi8iIGlzIGltcG9ydGFudC4gVGhlIGV4cG9ydGVkIG5hbWUgaXMgbGl0ZXJhbGx5IGp1c3QKK3ByZWZpeGVkIHdpdGggdGhlIHNwZWNpZmllZCBzdHJpbmcuICBDb250cmFzdCB0aGlzIHdpdGggdGhlCitmb2xsb3dpbmcgZXhhbXBsZS4KKworRXhwb3J0IGZpbGVzIHdpdGggYSBwcmVmaXg6OgorKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9Lm1lcmdlZC0gTWFrZWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0KKysKK1RoaXMgd2lsbCBjaGVjayBvdXQgdGhlIGN1cnJlbnRseSBjYWNoZWQgY29weSBvZiBgTWFrZWZpbGVgCitpbnRvIHRoZSBmaWxlIGAubWVyZ2VkLU1ha2VmaWxlYC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywKK0p1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVja291dC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVja291dC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkYmFkYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZWNrb3V0LnR4dApAQCAtMCwwICsxLDE1NiBAQAorZ2l0LWNoZWNrb3V0KDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNoZWNrb3V0IC0gQ2hlY2tvdXQgYW5kIHN3aXRjaCB0byBhIGJyYW5jaAorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtY2hlY2tvdXQnIFstZl0gWy1iIDxuZXdfYnJhbmNoPiBbLWxdXSBbLW1dIFs8YnJhbmNoPl0KKydnaXQtY2hlY2tvdXQnIFstbV0gWzxicmFuY2g+XSA8cGF0aHM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitXaGVuIDxwYXRocz4gYXJlIG5vdCBnaXZlbiwgdGhpcyBjb21tYW5kIHN3aXRjaGVzIGJyYW5jaGVzIGJ5Cit1cGRhdGluZyB0aGUgaW5kZXggYW5kIHdvcmtpbmcgdHJlZSB0byByZWZsZWN0IHRoZSBzcGVjaWZpZWQKK2JyYW5jaCwgPGJyYW5jaD4sIGFuZCB1cGRhdGluZyBIRUFEIHRvIGJlIDxicmFuY2g+IG9yLCBpZgorc3BlY2lmaWVkLCA8bmV3X2JyYW5jaD4uICBVc2luZyAtYiB3aWxsIGNhdXNlIDxuZXdfYnJhbmNoPiB0bworYmUgY3JlYXRlZC4KKworV2hlbiA8cGF0aHM+IGFyZSBnaXZlbiwgdGhpcyBjb21tYW5kIGRvZXMgKm5vdCogc3dpdGNoCiticmFuY2hlcy4gIEl0IHVwZGF0ZXMgdGhlIG5hbWVkIHBhdGhzIGluIHRoZSB3b3JraW5nIHRyZWUgZnJvbQordGhlIGluZGV4IGZpbGUgKGkuZS4gaXQgcnVucyBgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11YCkuICBJbgordGhpcyBjYXNlLCBgLWZgIGFuZCBgLWJgIG9wdGlvbnMgYXJlIG1lYW5pbmdsZXNzIGFuZCBnaXZpbmcKK2VpdGhlciBvZiB0aGVtIHJlc3VsdHMgaW4gYW4gZXJyb3IuICA8YnJhbmNoPiBhcmd1bWVudCBjYW4gYmUKK3VzZWQgdG8gc3BlY2lmeSBhIHNwZWNpZmljIHRyZWUtaXNoIHRvIHVwZGF0ZSB0aGUgaW5kZXggZm9yIHRoZQorZ2l2ZW4gcGF0aHMgYmVmb3JlIHVwZGF0aW5nIHRoZSB3b3JraW5nIHRyZWUuCisKKworT1BUSU9OUworLS0tLS0tLQorLWY6OgorCUZvcmNlIGEgcmUtcmVhZCBvZiBldmVyeXRoaW5nLgorCistYjo6CisJQ3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCA8bmV3X2JyYW5jaD4gYW5kIHN0YXJ0IGl0IGF0CisJPGJyYW5jaD4uICBUaGUgbmV3IGJyYW5jaCBuYW1lIG11c3QgcGFzcyBhbGwgY2hlY2tzIGRlZmluZWQKKwlieSBnaXRsaW5rOmdpdC1jaGVjay1yZWYtZm9ybWF0WzFdLiAgU29tZSBvZiB0aGVzZSBjaGVja3MKKwltYXkgcmVzdHJpY3QgdGhlIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiBhIGJyYW5jaCBuYW1lLgorCistbDo6CisJQ3JlYXRlIHRoZSBuZXcgYnJhbmNoJ3MgcmVmIGxvZy4gIFRoaXMgYWN0aXZhdGVzIHJlY29yZGluZyBvZgorCWFsbCBjaGFuZ2VzIHRvIG1hZGUgdGhlIGJyYW5jaCByZWYsIGVuYWJsaW5nIHVzZSBvZiBkYXRlCisJYmFzZWQgc2hhMSBleHByZXNzaW9ucyBzdWNoIGFzICI8YnJhbmNobmFtZT5Ae3llc3RlcmRheX0iLgorCistbTo6CisJSWYgeW91IGhhdmUgbG9jYWwgbW9kaWZpY2F0aW9ucyB0byBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0CisJYXJlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBjdXJyZW50IGJyYW5jaCBhbmQgdGhlIGJyYW5jaCB0bworCXdoaWNoIHlvdSBhcmUgc3dpdGNoaW5nLCB0aGUgY29tbWFuZCByZWZ1c2VzIHRvIHN3aXRjaAorCWJyYW5jaGVzIGluIG9yZGVyIHRvIHByZXNlcnZlIHlvdXIgbW9kaWZpY2F0aW9ucyBpbiBjb250ZXh0LgorCUhvd2V2ZXIsIHdpdGggdGhpcyBvcHRpb24sIGEgdGhyZWUtd2F5IG1lcmdlIGJldHdlZW4gdGhlIGN1cnJlbnQKKwlicmFuY2gsIHlvdXIgd29ya2luZyB0cmVlIGNvbnRlbnRzLCBhbmQgdGhlIG5ldyBicmFuY2gKKwlpcyBkb25lLCBhbmQgeW91IHdpbGwgYmUgb24gdGhlIG5ldyBicmFuY2guCisrCitXaGVuIGEgbWVyZ2UgY29uZmxpY3QgaGFwcGVucywgdGhlIGluZGV4IGVudHJpZXMgZm9yIGNvbmZsaWN0aW5nCitwYXRocyBhcmUgbGVmdCB1bm1lcmdlZCwgYW5kIHlvdSBuZWVkIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0cworYW5kIG1hcmsgdGhlIHJlc29sdmVkIHBhdGhzIHdpdGggYGdpdCB1cGRhdGUtaW5kZXhgLgorCis8bmV3X2JyYW5jaD46OgorCU5hbWUgZm9yIHRoZSBuZXcgYnJhbmNoLgorCis8YnJhbmNoPjo6CisJQnJhbmNoIHRvIGNoZWNrb3V0OyBtYXkgYmUgYW55IG9iamVjdCBJRCB0aGF0IHJlc29sdmVzIHRvIGEKKwljb21taXQuIERlZmF1bHRzIHRvIEhFQUQuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKKy4gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBjaGVja3Mgb3V0IHRoZSBgbWFzdGVyYCBicmFuY2gsIHJldmVydHMKK3RoZSBgTWFrZWZpbGVgIHRvIHR3byByZXZpc2lvbnMgYmFjaywgZGVsZXRlcyBoZWxsby5jIGJ5CittaXN0YWtlLCBhbmQgZ2V0cyBpdCBiYWNrIGZyb20gdGhlIGluZGV4LgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBtYXN0ZXIgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXJ+MiBNYWtlZmlsZSAgPDI+CiskIHJtIC1mIGhlbGxvLmMKKyQgZ2l0IGNoZWNrb3V0IGhlbGxvLmMgICAgICAgICAgICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IHN3aXRjaCBicmFuY2gKKzwyPiB0YWtlIG91dCBhIGZpbGUgb3V0IG9mIG90aGVyIGNvbW1pdAorPDM+IHJlc3RvcmUgaGVsbG8uYyBmcm9tIEhFQUQgb2YgY3VycmVudCBicmFuY2gKKysKK0lmIHlvdSBoYXZlIGFuIHVuZm9ydHVuYXRlIGJyYW5jaCB0aGF0IGlzIG5hbWVkIGBoZWxsby5jYCwgdGhpcworc3RlcCB3b3VsZCBiZSBjb25mdXNlZCBhcyBhbiBpbnN0cnVjdGlvbiB0byBzd2l0Y2ggdG8gdGhhdCBicmFuY2guCitZb3Ugc2hvdWxkIGluc3RlYWQgd3JpdGU6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC0tIGhlbGxvLmMKKy0tLS0tLS0tLS0tLQorCisuIEFmdGVyIHdvcmtpbmcgaW4gYSB3cm9uZyBicmFuY2gsIHN3aXRjaGluZyB0byB0aGUgY29ycmVjdAorYnJhbmNoIHdvdWxkIGJlIGRvbmUgdXNpbmc6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG15dG9waWMKKy0tLS0tLS0tLS0tLQorKworSG93ZXZlciwgeW91ciAid3JvbmciIGJyYW5jaCBhbmQgY29ycmVjdCAibXl0b3BpYyIgYnJhbmNoIG1heQorZGlmZmVyIGluIGZpbGVzIHRoYXQgeW91IGhhdmUgbG9jYWxseSBtb2RpZmllZCwgaW4gd2hpY2ggY2FzZSwKK3RoZSBhYm92ZSBjaGVja291dCB3b3VsZCBmYWlsIGxpa2UgdGhpczoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbXl0b3BpYworZmF0YWw6IEVudHJ5ICdmcm90eicgbm90IHVwdG9kYXRlLiBDYW5ub3QgbWVyZ2UuCistLS0tLS0tLS0tLS0KKysKK1lvdSBjYW4gZ2l2ZSB0aGUgYC1tYCBmbGFnIHRvIHRoZSBjb21tYW5kLCB3aGljaCB3b3VsZCB0cnkgYQordGhyZWUtd2F5IG1lcmdlOgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCAtbSBteXRvcGljCitBdXRvLW1lcmdpbmcgZnJvdHoKKy0tLS0tLS0tLS0tLQorKworQWZ0ZXIgdGhpcyB0aHJlZS13YXkgbWVyZ2UsIHRoZSBsb2NhbCBtb2RpZmljYXRpb25zIGFyZSBfbm90XworcmVnaXN0ZXJlZCBpbiB5b3VyIGluZGV4IGZpbGUsIHNvIGBnaXQgZGlmZmAgd291bGQgc2hvdyB5b3Ugd2hhdAorY2hhbmdlcyB5b3UgbWFkZSBzaW5jZSB0aGUgdGlwIG9mIHRoZSBuZXcgYnJhbmNoLgorCisuIFdoZW4gYSBtZXJnZSBjb25mbGljdCBoYXBwZW5zIGR1cmluZyBzd2l0Y2hpbmcgYnJhbmNoZXMgd2l0aAordGhlIGAtbWAgb3B0aW9uLCB5b3Ugd291bGQgc2VlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IC1tIG15dG9waWMKK0F1dG8tbWVyZ2luZyBmcm90egorbWVyZ2U6IHdhcm5pbmc6IGNvbmZsaWN0cyBkdXJpbmcgbWVyZ2UKK0VSUk9SOiBNZXJnZSBjb25mbGljdCBpbiBmcm90egorZmF0YWw6IG1lcmdlIHByb2dyYW0gZmFpbGVkCistLS0tLS0tLS0tLS0KKysKK0F0IHRoaXMgcG9pbnQsIGBnaXQgZGlmZmAgc2hvd3MgdGhlIGNoYW5nZXMgY2xlYW5seSBtZXJnZWQgYXMgaW4KK3RoZSBwcmV2aW91cyBleGFtcGxlLCBhcyB3ZWxsIGFzIHRoZSBjaGFuZ2VzIGluIHRoZSBjb25mbGljdGVkCitmaWxlcy4gIEVkaXQgYW5kIHJlc29sdmUgdGhlIGNvbmZsaWN0IGFuZCBtYXJrIGl0IHJlc29sdmVkIHdpdGgKK2BnaXQgdXBkYXRlLWluZGV4YCBhcyB1c3VhbDoKKysKKy0tLS0tLS0tLS0tLQorJCBlZGl0IGZyb3R6CiskIGdpdCB1cGRhdGUtaW5kZXggZnJvdHoKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnktcGljay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhOTUwYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS1waWNrLnR4dApAQCAtMCwwICsxLDYwIEBACitnaXQtY2hlcnJ5LXBpY2soMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2hlcnJ5LXBpY2sgLSBBcHBseSB0aGUgY2hhbmdlIGludHJvZHVjZWQgYnkgYW4gZXhpc3RpbmcgY29tbWl0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVycnktcGljaycgWy0tZWRpdF0gWy1uXSBbLXJdIDxjb21taXQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgYXBwbHkgdGhlIGNoYW5nZSB0aGUgcGF0Y2ggaW50cm9kdWNlcywgYW5kIHJlY29yZCBhCituZXcgY29tbWl0IHRoYXQgcmVjb3JkcyBpdC4gIFRoaXMgcmVxdWlyZXMgeW91ciB3b3JraW5nIHRyZWUgdG8gYmUgY2xlYW4gKG5vCittb2RpZmljYXRpb25zIGZyb20gdGhlIEhFQUQgY29tbWl0KS4KKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1pdD46OgorCUNvbW1pdCB0byBjaGVycnktcGljay4KKworLWV8LS1lZGl0OjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0LWNoZXJyeS1waWNrYCB3aWxsIGxldCB5b3UgZWRpdCB0aGUgY29tbWl0CisJbWVzc2FnZSBwcmlvciBjb21taXR0aW5nLgorCistcnwtLXJlcGxheTo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhcHBlbmRzIHdoaWNoIGNvbW1pdCB3YXMKKwljaGVycnktcGlja2VkIGFmdGVyIHRoZSBvcmlnaW5hbCBjb21taXQgbWVzc2FnZSB3aGVuCisJbWFraW5nIGEgY29tbWl0LiAgVGhpcyBvcHRpb24sICctLXJlcGxheScsIGNhdXNlcyBpdCB0bworCXVzZSB0aGUgb3JpZ2luYWwgY29tbWl0IG1lc3NhZ2UgaW50YWN0LiAgVGhpcyBpcyB1c2VmdWwKKwl3aGVuIHlvdSBhcmUgcmVvcmRlcmluZyB0aGUgcGF0Y2hlcyBpbiB5b3VyIHByaXZhdGUgdHJlZQorCWJlZm9yZSBwdWJsaXNoaW5nLgorCistbnwtLW5vLWNvbW1pdDo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBjb21taXQgd2l0aAorCWEgY29tbWl0IGxvZyBtZXNzYWdlIHN0YXRpbmcgd2hpY2ggY29tbWl0IHdhcworCWNoZXJyeS1waWNrZWQuICBUaGlzIGZsYWcgYXBwbGllcyB0aGUgY2hhbmdlIG5lY2Vzc2FyeQorCXRvIGNoZXJyeS1waWNrIHRoZSBuYW1lZCBjb21taXQgdG8geW91ciB3b3JraW5nIHRyZWUsCisJYnV0IGRvZXMgbm90IG1ha2UgdGhlIGNvbW1pdC4gIEluIGFkZGl0aW9uLCB3aGVuIHRoaXMKKwlvcHRpb24gaXMgdXNlZCwgeW91ciB3b3JraW5nIHRyZWUgZG9lcyBub3QgaGF2ZSB0byBtYXRjaAorCXRoZSBIRUFEIGNvbW1pdC4gIFRoZSBjaGVycnktcGljayBpcyBkb25lIGFnYWluc3QgdGhlCisJYmVnaW5uaW5nIHN0YXRlIG9mIHlvdXIgd29ya2luZyB0cmVlLgorKworVGhpcyBpcyB1c2VmdWwgd2hlbiBjaGVycnktcGlja2luZyBtb3JlIHRoYW4gb25lIGNvbW1pdHMnCitlZmZlY3QgdG8geW91ciB3b3JraW5nIHRyZWUgaW4gYSByb3cuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNoZXJyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2JhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jaGVycnkudHh0CkBAIC0wLDAgKzEsNTEgQEAKK2dpdC1jaGVycnkoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNoZXJyeSAtIEZpbmQgY29tbWl0cyBub3QgbWVyZ2VkIHVwc3RyZWFtCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jaGVycnknIFstdl0gPHVwc3RyZWFtPiBbPGhlYWQ+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoZSBjaGFuZ2VzZXQgKG9yICJkaWZmIikgb2YgZWFjaCBjb21taXQgYmV0d2VlbiB0aGUgZm9yay1wb2ludCBhbmQgPGhlYWQ+CitpcyBjb21wYXJlZCBhZ2FpbnN0IGVhY2ggY29tbWl0IGJldHdlZW4gdGhlIGZvcmstcG9pbnQgYW5kIDx1cHN0cmVhbT4uCisKK0V2ZXJ5IGNvbW1pdCB3aXRoIGEgY2hhbmdlc2V0IHRoYXQgZG9lc24ndCBleGlzdCBpbiB0aGUgb3RoZXIgYnJhbmNoCitoYXMgaXRzIGlkIChzaGExKSByZXBvcnRlZCwgcHJlZml4ZWQgYnkgYSBzeW1ib2wuICBUaG9zZSBleGlzdGluZyBvbmx5CitpbiB0aGUgPHVwc3RyZWFtPiBicmFuY2ggYXJlIHByZWZpeGVkIHdpdGggYSBtaW51cyAoLSkgc2lnbiwgYW5kIHRob3NlCit0aGF0IG9ubHkgZXhpc3QgaW4gdGhlIDxoZWFkPiBicmFuY2ggYXJlIHByZWZpeGVkIHdpdGggYSBwbHVzICgrKSBzeW1ib2wuCisKK0JlY2F1c2UgZ2l0LWNoZXJyeSBjb21wYXJlcyB0aGUgY2hhbmdlc2V0IHJhdGhlciB0aGFuIHRoZSBjb21taXQgaWQKKyhzaGExKSwgeW91IGNhbiB1c2UgZ2l0LWNoZXJyeSB0byBmaW5kIG91dCBpZiBhIGNvbW1pdCB5b3UgbWFkZSBsb2NhbGx5CitoYXMgYmVlbiBhcHBsaWVkIDx1cHN0cmVhbT4gdW5kZXIgYSBkaWZmZXJlbnQgY29tbWl0IGlkLiAgRm9yIGV4YW1wbGUsCit0aGlzIHdpbGwgaGFwcGVuIGlmIHlvdSdyZSBmZWVkaW5nIHBhdGNoZXMgPHVwc3RyZWFtPiB2aWEgZW1haWwgcmF0aGVyCit0aGFuIHB1c2hpbmcgb3IgcHVsbGluZyBjb21taXRzIGRpcmVjdGx5LgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlWZXJib3NlLgorCis8dXBzdHJlYW0+OjoKKwlVcHN0cmVhbSBicmFuY2ggdG8gY29tcGFyZSBhZ2FpbnN0LgorCis8aGVhZD46OgorCVdvcmtpbmcgYnJhbmNoOyBkZWZhdWx0cyB0byBIRUFELgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY2xlYW4udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY2xlYW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWFmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jbGVhbi50eHQKQEAgLTAsMCArMSw1MyBAQAorZ2l0LWNsZWFuKDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNsZWFuIC0gUmVtb3ZlIHVudHJhY2tlZCBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWNsZWFuJyBbLWRdIFstbl0gWy1xXSBbLXggfCAtWF0gWy0tXSA8cGF0aHM+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVtb3ZlcyBmaWxlcyB1bmtub3duIHRvIGdpdC4gIFRoaXMgYWxsb3dzIHRvIGNsZWFuIHRoZSB3b3JraW5nIHRyZWUKK2Zyb20gZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHZlcnNpb24gY29udHJvbC4gIElmIHRoZSAnLXgnIG9wdGlvbiBpcworc3BlY2lmaWVkLCBpZ25vcmVkIGZpbGVzIGFyZSBhbHNvIHJlbW92ZWQsIGFsbG93aW5nIHRvIHJlbW92ZSBhbGwKK2J1aWxkIHByb2R1Y3RzLgorV2hlbiBvcHRpb25hbCBgPHBhdGhzPi4uLmAgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIHBhdGhzCithZmZlY3RlZCBhcmUgZnVydGhlciBsaW1pdGVkIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlbS4KKworCitPUFRJT05TCistLS0tLS0tCistZDo6CisJUmVtb3ZlIHVudHJhY2tlZCBkaXJlY3RvcmllcyBpbiBhZGRpdGlvbiB0byB1bnRyYWNrZWQgZmlsZXMuCisKKy1uOjoKKwlEb24ndCBhY3R1YWxseSByZW1vdmUgYW55dGhpbmcsIGp1c3Qgc2hvdyB3aGF0IHdvdWxkIGJlIGRvbmUuCisKKy1xOjoKKwlCZSBxdWlldCwgb25seSByZXBvcnQgZXJyb3JzLCBidXQgbm90IHRoZSBmaWxlcyB0aGF0IGFyZQorCXN1Y2Nlc3NmdWxseSByZW1vdmVkLgorCisteDo6CisJRG9uJ3QgdXNlIHRoZSBpZ25vcmUgcnVsZXMuICBUaGlzIGFsbG93cyByZW1vdmluZyBhbGwgdW50cmFja2VkCisJZmlsZXMsIGluY2x1ZGluZyBidWlsZCBwcm9kdWN0cy4gIFRoaXMgY2FuIGJlIHVzZWQgKHBvc3NpYmx5IGluCisJY29uanVuY3Rpb24gd2l0aCBnaXRsaW5rOmdpdC1yZXNldFsxXSkgdG8gY3JlYXRlIGEgcHJpc3RpbmUKKwl3b3JraW5nIGRpcmVjdG9yeSB0byB0ZXN0IGEgY2xlYW4gYnVpbGQuCisKKy1YOjoKKwlSZW1vdmUgb25seSBmaWxlcyBpZ25vcmVkIGJ5IGdpdC4gIFRoaXMgbWF5IGJlIHVzZWZ1bCB0byByZWJ1aWxkCisJZXZlcnl0aGluZyBmcm9tIHNjcmF0Y2gsIGJ1dCBrZWVwIG1hbnVhbGx5IGNyZWF0ZWQgZmlsZXMuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNsb25lLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNsb25lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTczYzY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY2xvbmUudHh0CkBAIC0wLDAgKzEsMTcyIEBACitnaXQtY2xvbmUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY2xvbmUgLSBDbG9uZXMgYSByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWNsb25lJyBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy1sIFstc11dIFstcV0gWy1uXSBbLS1iYXJlXQorCSAgWy1vIDxuYW1lPl0gWy11IDx1cGxvYWQtcGFjaz5dIFstLXJlZmVyZW5jZSA8cmVwb3NpdG9yeT5dCisJICBbLS11c2Utc2VwYXJhdGUtcmVtb3RlXSA8cmVwb3NpdG9yeT4gWzxkaXJlY3Rvcnk+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0Nsb25lcyBhIHJlcG9zaXRvcnkgaW50byBhIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5LiAgQWxsIHJlbW90ZQorYnJhbmNoIGhlYWRzIGFyZSBjb3BpZWQgdW5kZXIgYCRHSVRfRElSL3JlZnMvaGVhZHMvYCwgZXhjZXB0Cit0aGF0IHRoZSByZW1vdGUgYG1hc3RlcmAgaXMgYWxzbyBjb3BpZWQgdG8gYG9yaWdpbmAgYnJhbmNoLgorCitJbiBhZGRpdGlvbiwgYCRHSVRfRElSL3JlbW90ZXMvb3JpZ2luYCBmaWxlIGlzIHNldCB1cCB0byBoYXZlCit0aGlzIGxpbmU6CisKKwlQdWxsOiBtYXN0ZXI6b3JpZ2luCisKK1RoaXMgaXMgdG8gaGVscCB0aGUgdHlwaWNhbCB3b3JrZmxvdyBvZiB3b3JraW5nIG9mZiBvZiB0aGUKK3JlbW90ZSBgbWFzdGVyYCBicmFuY2guICBFdmVyeSB0aW1lIGBnaXQgcHVsbGAgd2l0aG91dCBhcmd1bWVudAoraXMgcnVuLCB0aGUgcHJvZ3Jlc3Mgb24gdGhlIHJlbW90ZSBgbWFzdGVyYCBicmFuY2ggaXMgdHJhY2tlZCBieQorY29weWluZyBpdCBpbnRvIHRoZSBsb2NhbCBgb3JpZ2luYCBicmFuY2gsIGFuZCBtZXJnZWQgaW50byB0aGUKK2JyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSB3b3JraW5nIG9uLiAgUmVtb3RlIGJyYW5jaGVzIG90aGVyIHRoYW4KK2BtYXN0ZXJgIGFyZSBhbHNvIGFkZGVkIHRoZXJlIHRvIGJlIHRyYWNrZWQuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1sb2NhbDo6CistbDo6CisJV2hlbiB0aGUgcmVwb3NpdG9yeSB0byBjbG9uZSBmcm9tIGlzIG9uIGEgbG9jYWwgbWFjaGluZSwKKwl0aGlzIGZsYWcgYnlwYXNzZXMgbm9ybWFsICJnaXQgYXdhcmUiIHRyYW5zcG9ydAorCW1lY2hhbmlzbSBhbmQgY2xvbmVzIHRoZSByZXBvc2l0b3J5IGJ5IG1ha2luZyBhIGNvcHkgb2YKKwlIRUFEIGFuZCBldmVyeXRoaW5nIHVuZGVyIG9iamVjdHMgYW5kIHJlZnMgZGlyZWN0b3JpZXMuCisJVGhlIGZpbGVzIHVuZGVyIC5naXQvb2JqZWN0cy8gZGlyZWN0b3J5IGFyZSBoYXJkbGlua2VkCisJdG8gc2F2ZSBzcGFjZSB3aGVuIHBvc3NpYmxlLgorCistLXNoYXJlZDo6Cistczo6CisJV2hlbiB0aGUgcmVwb3NpdG9yeSB0byBjbG9uZSBpcyBvbiB0aGUgbG9jYWwgbWFjaGluZSwKKwlpbnN0ZWFkIG9mIHVzaW5nIGhhcmQgbGlua3MsIGF1dG9tYXRpY2FsbHkgc2V0dXAKKwkuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzIHRvIHNoYXJlIHRoZSBvYmplY3RzCisJd2l0aCB0aGUgc291cmNlIHJlcG9zaXRvcnkuICBUaGUgcmVzdWx0aW5nIHJlcG9zaXRvcnkKKwlzdGFydHMgb3V0IHdpdGhvdXQgYW55IG9iamVjdCBvZiBpdHMgb3duLgorCistLXJlZmVyZW5jZSA8cmVwb3NpdG9yeT46OgorCUlmIHRoZSByZWZlcmVuY2UgcmVwb3NpdG9yeSBpcyBvbiB0aGUgbG9jYWwgbWFjaGluZQorCWF1dG9tYXRpY2FsbHkgc2V0dXAgLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyB0bworCW9idGFpbiBvYmplY3RzIGZyb20gdGhlIHJlZmVyZW5jZSByZXBvc2l0b3J5LiAgVXNpbmcKKwlhbiBhbHJlYWR5IGV4aXN0aW5nIHJlcG9zaXRvcnkgYXMgYW4gYWx0ZXJuYXRlIHdpbGwKKwlyZXF1aXJlIGxlc3Mgb2JqZWN0cyB0byBiZSBjb3BpZWQgZnJvbSB0aGUgcmVwb3NpdG9yeQorCWJlaW5nIGNsb25lZCwgcmVkdWNpbmcgbmV0d29yayBhbmQgbG9jYWwgc3RvcmFnZSBjb3N0cy4KKworLS1xdWlldDo6CistcTo6CisJT3BlcmF0ZSBxdWlldGx5LiAgVGhpcyBmbGFnIGlzIHBhc3NlZCB0byAicnN5bmMiIGFuZAorCSJnaXQtZmV0Y2gtcGFjayIgY29tbWFuZHMgd2hlbiBnaXZlbi4KKworLW46OgorCU5vIGNoZWNrb3V0IG9mIEhFQUQgaXMgcGVyZm9ybWVkIGFmdGVyIHRoZSBjbG9uZSBpcyBjb21wbGV0ZS4KKworLS1iYXJlOjoKKwlNYWtlIGEgJ2JhcmUnIEdJVCByZXBvc2l0b3J5LiAgVGhhdCBpcywgaW5zdGVhZCBvZgorCWNyZWF0aW5nIGA8ZGlyZWN0b3J5PmAgYW5kIHBsYWNpbmcgdGhlIGFkbWluaXN0cmF0aXZlCisJZmlsZXMgaW4gYDxkaXJlY3Rvcnk+Ly5naXRgLCBtYWtlIHRoZSBgPGRpcmVjdG9yeT5gCisJaXRzZWxmIHRoZSBgJEdJVF9ESVJgLiBUaGlzIGltcGxpZXMgYC1uYCBvcHRpb24uICBXaGVuCisJdGhpcyBvcHRpb24gaXMgdXNlZCwgbmVpdGhlciB0aGUgYG9yaWdpbmAgYnJhbmNoIG5vciB0aGUKKwlkZWZhdWx0IGByZW1vdGVzL29yaWdpbmAgZmlsZSBpcyBjcmVhdGVkLgorCistbyA8bmFtZT46OgorCUluc3RlYWQgb2YgdXNpbmcgdGhlIGJyYW5jaCBuYW1lICdvcmlnaW4nIHRvIGtlZXAgdHJhY2sKKwlvZiB0aGUgdXBzdHJlYW0gcmVwb3NpdG9yeSwgdXNlIDxuYW1lPiBpbnN0ZWFkLiAgTm90ZQorCXRoYXQgdGhlIHNob3J0aGFuZCBuYW1lIHN0b3JlZCBpbiBgcmVtb3Rlcy9vcmlnaW5gIGlzCisJbm90IGFmZmVjdGVkLCBidXQgdGhlIGxvY2FsIGJyYW5jaCBuYW1lIHRvIHB1bGwgdGhlCisJcmVtb3RlIGBtYXN0ZXJgIGJyYW5jaCBpbnRvIGlzLgorCistLXVwbG9hZC1wYWNrIDx1cGxvYWQtcGFjaz46OgorLXUgPHVwbG9hZC1wYWNrPjo6CisJV2hlbiBnaXZlbiwgYW5kIHRoZSByZXBvc2l0b3J5IHRvIGNsb25lIGZyb20gaXMgaGFuZGxlZAorCWJ5ICdnaXQtZmV0Y2gtcGFjaycsICctLWV4ZWM9PHVwbG9hZC1wYWNrPicgaXMgcGFzc2VkIHRvCisJdGhlIGNvbW1hbmQgdG8gc3BlY2lmeSBub24tZGVmYXVsdCBwYXRoIGZvciB0aGUgY29tbWFuZAorCXJ1biBvbiB0aGUgb3RoZXIgZW5kLgorCistLXRlbXBsYXRlPTx0ZW1wbGF0ZV9kaXJlY3Rvcnk+OjoKKwlTcGVjaWZ5IHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0ZW1wbGF0ZXMgd2lsbCBiZSB1c2VkOworCWlmIHVuc2V0IHRoZSB0ZW1wbGF0ZXMgYXJlIHRha2VuIGZyb20gdGhlIGluc3RhbGxhdGlvbgorCWRlZmluZWQgZGVmYXVsdCwgdHlwaWNhbGx5IGAvdXNyL3NoYXJlL2dpdC1jb3JlL3RlbXBsYXRlc2AuCisKKy0tdXNlLXNlcGFyYXRlLXJlbW90ZTo6CisJU2F2ZSByZW1vdGVzIGhlYWRzIHVuZGVyIGAkR0lUX0RJUi9yZW1vdGVzL29yaWdpbi9gIGluc3RlYWQKKwlvZiBgJEdJVF9ESVIvcmVmcy9oZWFkcy9gLiAgT25seSB0aGUgbWFzdGVyIGJyYW5jaCBpcyBzYXZlZAorCWluIHRoZSBsYXR0ZXIuCisKKzxyZXBvc2l0b3J5Pjo6CisJVGhlIChwb3NzaWJseSByZW1vdGUpIHJlcG9zaXRvcnkgdG8gY2xvbmUgZnJvbS4gIEl0IGNhbgorCWJlIGFueSBVUkwgZ2l0LWZldGNoIHN1cHBvcnRzLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIG5hbWUgb2YgYSBuZXcgZGlyZWN0b3J5IHRvIGNsb25lIGludG8uICBUaGUgImh1bWFuaXNoIgorCXBhcnQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5IGlzIHVzZWQgaWYgbm8gZGlyZWN0b3J5IGlzCisJZXhwbGljaXRseSBnaXZlbiAoInJlcG8iIGZvciAiL3BhdGgvdG8vcmVwby5naXQiIGFuZCAiZm9vIgorCWZvciAiaG9zdC54ejpmb28vLmdpdCIpLiAgQ2xvbmluZyBpbnRvIGFuIGV4aXN0aW5nIGRpcmVjdG9yeQorCWlzIG5vdCBhbGxvd2VkLgorCitFeGFtcGxlcworLS0tLS0tLS0KKworQ2xvbmUgZnJvbSB1cHN0cmVhbTo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vLi4uL2xpbnV4LTIuNiBteTIuNgorJCBjZCBteTIuNgorJCBtYWtlCistLS0tLS0tLS0tLS0KKworCitNYWtlIGEgbG9jYWwgY2xvbmUgdGhhdCBib3Jyb3dzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aXRob3V0IGNoZWNraW5nIHRoaW5ncyBvdXQ6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSAtbCAtcyAtbiAuIC4uL2NvcHkKKyQgY2QgY29weQorJCBnaXQgc2hvdy1icmFuY2gKKy0tLS0tLS0tLS0tLQorCisKK0Nsb25lIGZyb20gdXBzdHJlYW0gd2hpbGUgYm9ycm93aW5nIGZyb20gYW4gZXhpc3RpbmcgbG9jYWwgZGlyZWN0b3J5OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1yZWZlcmVuY2UgbXkyLjYgXAorCWdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vLi4uL2xpbnV4LTIuNyBcCisJbXkyLjcKKyQgY2QgbXkyLjcKKy0tLS0tLS0tLS0tLQorCisKK0NyZWF0ZSBhIGJhcmUgcmVwb3NpdG9yeSB0byBwdWJsaXNoIHlvdXIgY2hhbmdlcyB0byB0aGUgcHVibGljOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1iYXJlIC1sIC9ob21lL3Byb2ovLmdpdCAvcHViL3NjbS9wcm9qLmdpdAorLS0tLS0tLS0tLS0tCisKKworQ3JlYXRlIGEgcmVwb3NpdG9yeSBvbiB0aGUga2VybmVsLm9yZyBtYWNoaW5lIHRoYXQgYm9ycm93cyBmcm9tIExpbnVzOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2xvbmUgLS1iYXJlIC1sIC1zIC9wdWIvc2NtLy4uLi90b3J2YWxkcy9saW51eC0yLjYuZ2l0IFwKKyAgICAvcHViL3NjbS8uLi4vbWUvc3Vic3lzLTIuNi5naXQKKy0tLS0tLS0tLS0tLQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY29tbWl0LXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY29tbWl0LXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDFhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQtdHJlZS50eHQKQEAgLTAsMCArMSwxMDAgQEAKK2dpdC1jb21taXQtdHJlZSgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb21taXQtdHJlZSAtIENyZWF0ZXMgYSBuZXcgY29tbWl0IG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1jb21taXQtdHJlZScgPHRyZWU+IFstcCA8cGFyZW50IGNvbW1pdD5dXCogPCBjaGFuZ2Vsb2cKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDcmVhdGVzIGEgbmV3IGNvbW1pdCBvYmplY3QgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRyZWUgb2JqZWN0IGFuZAorZW1pdHMgdGhlIG5ldyBjb21taXQgb2JqZWN0IGlkIG9uIHN0ZG91dC4gSWYgbm8gcGFyZW50IGlzIGdpdmVuIHRoZW4KK2l0IGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gaW5pdGlhbCB0cmVlLgorCitBIGNvbW1pdCBvYmplY3QgdXN1YWxseSBoYXMgMSBwYXJlbnQgKGEgY29tbWl0IGFmdGVyIGEgY2hhbmdlKSBvciB1cAordG8gMTYgcGFyZW50cy4gIE1vcmUgdGhhbiBvbmUgcGFyZW50IHJlcHJlc2VudHMgYSBtZXJnZSBvZiBicmFuY2hlcwordGhhdCBsZWQgdG8gdGhlbS4KKworV2hpbGUgYSB0cmVlIHJlcHJlc2VudHMgYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBzdGF0ZSBvZiBhIHdvcmtpbmcKK2RpcmVjdG9yeSwgYSBjb21taXQgcmVwcmVzZW50cyB0aGF0IHN0YXRlIGluICJ0aW1lIiwgYW5kIGV4cGxhaW5zIGhvdwordG8gZ2V0IHRoZXJlLgorCitOb3JtYWxseSBhIGNvbW1pdCB3b3VsZCBpZGVudGlmeSBhIG5ldyAiSEVBRCIgc3RhdGUsIGFuZCB3aGlsZSBnaXQKK2RvZXNuJ3QgY2FyZSB3aGVyZSB5b3Ugc2F2ZSB0aGUgbm90ZSBhYm91dCB0aGF0IHN0YXRlLCBpbiBwcmFjdGljZSB3ZQordGVuZCB0byBqdXN0IHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlIGZpbGUgdGhhdCBpcyBwb2ludGVkIGF0IGJ5CitgLmdpdC9IRUFEYCwgc28gdGhhdCB3ZSBjYW4gYWx3YXlzIHNlZSB3aGF0IHRoZSBsYXN0IGNvbW1pdHRlZAorc3RhdGUgd2FzLgorCitPUFRJT05TCistLS0tLS0tCis8dHJlZT46OgorCUFuIGV4aXN0aW5nIHRyZWUgb2JqZWN0CisKKy1wIDxwYXJlbnQgY29tbWl0Pjo6CisJRWFjaCAnLXAnIGluZGljYXRlcyB0aGUgaWQgb2YgYSBwYXJlbnQgY29tbWl0IG9iamVjdC4KKwkKKworQ29tbWl0IEluZm9ybWF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KKworQSBjb21taXQgZW5jYXBzdWxhdGVzOgorCistIGFsbCBwYXJlbnQgb2JqZWN0IGlkcworLSBhdXRob3IgbmFtZSwgZW1haWwgYW5kIGRhdGUKKy0gY29tbWl0dGVyIG5hbWUgYW5kIGVtYWlsIGFuZCB0aGUgY29tbWl0IHRpbWUuCisKK0lmIG5vdCBwcm92aWRlZCwgImdpdC1jb21taXQtdHJlZSIgdXNlcyB5b3VyIG5hbWUsIGhvc3RuYW1lIGFuZCBkb21haW4gdG8KK3Byb3ZpZGUgYXV0aG9yIGFuZCBjb21taXR0ZXIgaW5mby4gVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieQorZWl0aGVyIGAuZ2l0L2NvbmZpZ2AgZmlsZSwgb3IgdXNpbmcgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisKKwlHSVRfQVVUSE9SX05BTUUKKwlHSVRfQVVUSE9SX0VNQUlMCisJR0lUX0FVVEhPUl9EQVRFCisJR0lUX0NPTU1JVFRFUl9OQU1FCisJR0lUX0NPTU1JVFRFUl9FTUFJTAorCisobmIgIjwiLCAiPiIgYW5kICJcbiJzIGFyZSBzdHJpcHBlZCkKKworSW4gYC5naXQvY29uZmlnYCBmaWxlLCB0aGUgZm9sbG93aW5nIGl0ZW1zIGFyZSB1c2VkIGZvciBHSVRfQVVUSE9SX05BTUUgYW5kCitHSVRfQVVUSE9SX0VNQUlMOgorCisJW3VzZXJdCisJCW5hbWUgPSAiWW91ciBOYW1lIgorCQllbWFpbCA9ICJ5b3VyQGVtYWlsLmFkZHJlc3MueHoiCisKK0EgY29tbWl0IGNvbW1lbnQgaXMgcmVhZCBmcm9tIHN0ZGluIChtYXggOTk5IGNoYXJzKS4gSWYgYSBjaGFuZ2Vsb2cKK2VudHJ5IGlzIG5vdCBwcm92aWRlZCB2aWEgIjwiIHJlZGlyZWN0aW9uLCAiZ2l0LWNvbW1pdC10cmVlIiB3aWxsIGp1c3Qgd2FpdAorZm9yIG9uZSB0byBiZSBlbnRlcmVkIGFuZCB0ZXJtaW5hdGVkIHdpdGggXkQuCisKKworRGlhZ25vc3RpY3MKKy0tLS0tLS0tLS0tCitZb3UgZG9uJ3QgZXhpc3QuIEdvIGF3YXkhOjoKKyAgICBUaGUgcGFzc3dkKDUpIGdlY29zIGZpZWxkIGNvdWxkbid0IGJlIHJlYWQKK1lvdXIgcGFyZW50cyBtdXN0IGhhdmUgaGF0ZWQgeW91ITo6CisgICAgVGhlIHBhc3N3b3JkKDUpIGdlY29zIGZpZWxkIGlzIGxvbmdlciB0aGFuIGEgZ2lhbnQgc3RhdGljIGJ1ZmZlci4KK1lvdXIgc3lzYWRtaW4gbXVzdCBoYXRlIHlvdSE6OgorICAgIFRoZSBwYXNzd29yZCg1KSBuYW1lIGZpZWxkIGlzIGxvbmdlciB0aGFuIGEgZ2lhbnQgc3RhdGljIGJ1ZmZlci4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC13cml0ZS10cmVlWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWNvbW1pdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxN2E4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb21taXQudHh0CkBAIC0wLDAgKzEsMTcwIEBACitnaXQtY29tbWl0KDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb21taXQgLSBSZWNvcmQgeW91ciBjaGFuZ2VzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1jb21taXQnIFstYV0gWy1zXSBbLXZdIFsoLWMgfCAtQykgPGNvbW1pdD4gfCAtRiA8ZmlsZT4gfCAtbSA8bXNnPl0KKwkgICBbLS1uby12ZXJpZnldIFstLWFtZW5kXSBbLWVdIFstLWF1dGhvciA8YXV0aG9yPl0KKwkgICBbLS1dIFtbLWkgfCAtbyBdPGZpbGU+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1VwZGF0ZXMgdGhlIGluZGV4IGZpbGUgZm9yIGdpdmVuIHBhdGhzLCBvciBhbGwgbW9kaWZpZWQgZmlsZXMgaWYKKyctYScgaXMgc3BlY2lmaWVkLCBhbmQgbWFrZXMgYSBjb21taXQgb2JqZWN0LiAgVGhlIGNvbW1hbmQgc3BlY2lmaWVkCitieSBlaXRoZXIgdGhlIFZJU1VBTCBvciBFRElUT1IgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGVkaXQKK3RoZSBjb21taXQgbG9nIG1lc3NhZ2UuCisKK1NldmVyYWwgZW52aXJvbm1lbnQgdmFyaWFibGUgYXJlIHVzZWQgZHVyaW5nIGNvbW1pdHMuICBUaGV5IGFyZQorZG9jdW1lbnRlZCBpbiBnaXRsaW5rOmdpdC1jb21taXQtdHJlZVsxXS4KKworCitUaGlzIGNvbW1hbmQgY2FuIHJ1biBgY29tbWl0LW1zZ2AsIGBwcmUtY29tbWl0YCwgYW5kCitgcG9zdC1jb21taXRgIGhvb2tzLiAgU2VlIGxpbms6aG9va3MuaHRtbFtob29rc10gZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCitPUFRJT05TCistLS0tLS0tCistYXwtLWFsbDo6CisJVXBkYXRlIGFsbCBwYXRocyBpbiB0aGUgaW5kZXggZmlsZS4gIFRoaXMgZmxhZyBub3RpY2VzCisJZmlsZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgYW5kIGRlbGV0ZWQsIGJ1dCBuZXcgZmlsZXMKKwl5b3UgaGF2ZSBub3QgdG9sZCBnaXQgYWJvdXQgYXJlIG5vdCBhZmZlY3RlZC4KKworLWMgb3IgLUMgPGNvbW1pdD46OgorCVRha2UgZXhpc3RpbmcgY29tbWl0IG9iamVjdCwgYW5kIHJldXNlIHRoZSBsb2cgbWVzc2FnZQorCWFuZCB0aGUgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbiAoaW5jbHVkaW5nIHRoZSB0aW1lc3RhbXApCisJd2hlbiBjcmVhdGluZyB0aGUgY29tbWl0LiAgV2l0aCAnLUMnLCB0aGUgZWRpdG9yIGlzIG5vdAorCWludm9rZWQ7IHdpdGggJy1jJyB0aGUgdXNlciBjYW4gZnVydGhlciBlZGl0IHRoZSBjb21taXQKKwltZXNzYWdlLgorCistRiA8ZmlsZT46OgorCVRha2UgdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGZpbGUuICBVc2UgJy0nIHRvCisJcmVhZCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4KKworLS1hdXRob3IgPGF1dGhvcj46OgorCU92ZXJyaWRlIHRoZSBhdXRob3IgbmFtZSB1c2VkIGluIHRoZSBjb21taXQuICBVc2UKKwlgQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT5gIGZvcm1hdC4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gPG1zZz4gYXMgdGhlIGNvbW1pdCBtZXNzYWdlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBTaWduZWQtb2ZmLWJ5IGxpbmUgYXQgdGhlIGVuZCBvZiB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKy12fC0tdmVyaWZ5OjoKKwlMb29rIGZvciBzdXNwaWNpb3VzIGxpbmVzIHRoZSBjb21taXQgaW50cm9kdWNlcywgYW5kCisJYWJvcnQgY29tbWl0dGluZyBpZiB0aGVyZSBpcyBvbmUuICBUaGUgZGVmaW5pdGlvbiBvZgorCSdzdXNwaWNpb3VzIGxpbmVzJyBpcyBjdXJyZW50bHkgdGhlIGxpbmVzIHRoYXQgaGFzCisJdHJhaWxpbmcgd2hpdGVzcGFjZXMsIGFuZCB0aGUgbGluZXMgd2hvc2UgaW5kZW50YXRpb24KKwloYXMgYSBTUCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBUQUIKKwljaGFyYWN0ZXIuICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorCistbnwtLW5vLXZlcmlmeTo6CisJVGhlIG9wcG9zaXRlIG9mIGAtLXZlcmlmeWAuCisKKy1lfC0tZWRpdDo6CisJVGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSBmaWxlIHdpdGggYC1GYCwgY29tbWFuZCBsaW5lIHdpdGgKKwlgLW1gLCBhbmQgZnJvbSBmaWxlIHdpdGggYC1DYCBhcmUgdXN1YWxseSB1c2VkIGFzIHRoZQorCWNvbW1pdCBsb2cgbWVzc2FnZSB1bm1vZGlmaWVkLiAgVGhpcyBvcHRpb24gbGV0cyB5b3UKKwlmdXJ0aGVyIGVkaXQgdGhlIG1lc3NhZ2UgdGFrZW4gZnJvbSB0aGVzZSBzb3VyY2VzLgorCistLWFtZW5kOjoKKworCVVzZWQgdG8gYW1lbmQgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2guIFByZXBhcmUgdGhlIHRyZWUKKwlvYmplY3QgeW91IHdvdWxkIHdhbnQgdG8gcmVwbGFjZSB0aGUgbGF0ZXN0IGNvbW1pdCBhcyB1c3VhbAorCSh0aGlzIGluY2x1ZGVzIHRoZSB1c3VhbCAtaS8tbyBhbmQgZXhwbGljaXQgcGF0aHMpLCBhbmQgdGhlCisJY29tbWl0IGxvZyBlZGl0b3IgaXMgc2VlZGVkIHdpdGggdGhlIGNvbW1pdCBtZXNzYWdlIGZyb20gdGhlCisJdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaC4gVGhlIGNvbW1pdCB5b3UgY3JlYXRlIHJlcGxhY2VzIHRoZQorCWN1cnJlbnQgdGlwIC0tIGlmIGl0IHdhcyBhIG1lcmdlLCBpdCB3aWxsIGhhdmUgdGhlIHBhcmVudHMgb2YKKwl0aGUgY3VycmVudCB0aXAgYXMgcGFyZW50cyAtLSBzbyB0aGUgY3VycmVudCB0b3AgY29tbWl0IGlzCisJZGlzY2FyZGVkLgorKworLS0KK0l0IGlzIGEgcm91Z2ggZXF1aXZhbGVudCBmb3I6CistLS0tLS0KKwkkIGdpdCByZXNldCAtLXNvZnQgSEVBRF4KKwkkIC4uLiBkbyBzb21ldGhpbmcgZWxzZSB0byBjb21lIHVwIHdpdGggdGhlIHJpZ2h0IHRyZWUgLi4uCisJJCBnaXQgY29tbWl0IC1jIE9SSUdfSEVBRAorCistLS0tLS0KK2J1dCBjYW4gYmUgdXNlZCB0byBhbWVuZCBhIG1lcmdlIGNvbW1pdC4KKy0tCisKKy1pfC0taW5jbHVkZTo6CisJSW5zdGVhZCBvZiBjb21taXR0aW5nIG9ubHkgdGhlIGZpbGVzIHNwZWNpZmllZCBvbiB0aGUKKwljb21tYW5kIGxpbmUsIHVwZGF0ZSB0aGVtIGluIHRoZSBpbmRleCBmaWxlIGFuZCB0aGVuCisJY29tbWl0IHRoZSB3aG9sZSBpbmRleC4gIFRoaXMgaXMgdGhlIHRyYWRpdGlvbmFsCisJYmVoYXZpb3IuCisKKy1vfC0tb25seTo6CisJQ29tbWl0IG9ubHkgdGhlIGZpbGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCVRoaXMgZm9ybWF0IGNhbm5vdCBiZSB1c2VkIGR1cmluZyBhIG1lcmdlLCBub3Igd2hlbiB0aGUKKwlpbmRleCBhbmQgdGhlIGxhdGVzdCBjb21taXQgZG9lcyBub3QgbWF0Y2ggb24gdGhlCisJc3BlY2lmaWVkIHBhdGhzIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKworXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCis8ZmlsZT4uLi46OgorCUZpbGVzIHRvIGJlIGNvbW1pdHRlZC4gIFRoZSBtZWFuaW5nIG9mIHRoZXNlIGlzCisJZGlmZmVyZW50IGJldHdlZW4gYC0taW5jbHVkZWAgYW5kIGAtLW9ubHlgLiAgV2l0aG91dAorCWVpdGhlciwgaXQgZGVmYXVsdHMgYC0tb25seWAgc2VtYW50aWNzLgorCitJZiB5b3UgbWFrZSBhIGNvbW1pdCBhbmQgdGhlbiBmb3VuZCBhIG1pc3Rha2UgaW1tZWRpYXRlbHkgYWZ0ZXIKK3RoYXQsIHlvdSBjYW4gcmVjb3ZlciBmcm9tIGl0IHdpdGggZ2l0bGluazpnaXQtcmVzZXRbMV0uCisKKworRGlzY3Vzc2lvbgorLS0tLS0tLS0tLQorCitgZ2l0IGNvbW1pdGAgd2l0aG91dCBfYW55XyBwYXJhbWV0ZXIgY29tbWl0cyB0aGUgdHJlZSBzdHJ1Y3R1cmUKK3JlY29yZGVkIGJ5IHRoZSBjdXJyZW50IGluZGV4IGZpbGUuICBUaGlzIGlzIGEgd2hvbGUtdHJlZSBjb21taXQKK2V2ZW4gdGhlIGNvbW1hbmQgaXMgaW52b2tlZCBmcm9tIGEgc3ViZGlyZWN0b3J5LgorCitgZ2l0IGNvbW1pdCAtLWluY2x1ZGUgcGF0aHMuLi5gIGlzIGVxdWl2YWxlbnQgdG8KKworCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgcGF0aHMuLi4KKwlnaXQgY29tbWl0CisKK1RoYXQgaXMsIHVwZGF0ZSB0aGUgc3BlY2lmaWVkIHBhdGhzIHRvIHRoZSBpbmRleCBhbmQgdGhlbiBjb21taXQKK3RoZSB3aG9sZSB0cmVlLgorCitgZ2l0IGNvbW1pdCBwYXRocy4uLmAgbGFyZ2VseSBieXBhc3NlcyB0aGUgaW5kZXggZmlsZSBhbmQKK2NvbW1pdHMgb25seSB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBzcGVjaWZpZWQgcGF0aHMuICBJdCBoYXMKK2hvd2V2ZXIgc2V2ZXJhbCBzYWZldHkgdmFsdmVzIHRvIHByZXZlbnQgY29uZnVzaW9uLgorCisuIEl0IHJlZnVzZXMgdG8gcnVuIGR1cmluZyBhIG1lcmdlIChpLmUuIHdoZW4KKyAgYCRHSVRfRElSL01FUkdFX0hFQURgIGV4aXN0cyksIGFuZCByZW1pbmRzIHRyYWluZWQgZ2l0IHVzZXJzCisgIHRoYXQgdGhlIHRyYWRpdGlvbmFsIHNlbWFudGljcyBub3cgbmVlZHMgLWkgZmxhZy4KKworLiBJdCByZWZ1c2VzIHRvIHJ1biBpZiBuYW1lZCBgcGF0aHMuLi5gIGFyZSBkaWZmZXJlbnQgaW4gSEVBRAorICBhbmQgdGhlIGluZGV4IChkaXR0byBhYm91dCByZW1pbmRpbmcpLiAgQWRkZWQgcGF0aHMgYXJlIE9LLgorICBUaGlzIGlzIGJlY2F1c2UgYW4gZWFybGllciBgZ2l0IGRpZmZgIChub3QgYGdpdCBkaWZmIEhFQURgKQorICB3b3VsZCBoYXZlIHNob3duIHRoZSBkaWZmZXJlbmNlcyBzaW5jZSB0aGUgbGFzdCBgZ2l0CisgIHVwZGF0ZS1pbmRleCBwYXRocy4uLmAgdG8gdGhlIHVzZXIsIGFuZCBhbiBpbmV4cGVyaWVuY2VkIHVzZXIKKyAgbWF5IG1pc3Rha2VubHkgdGhpbmsgdGhhdCB0aGUgY2hhbmdlcyBiZXR3ZWVuIHRoZSBpbmRleCBhbmQKKyAgdGhlIEhFQUQgKGkuZS4gZWFybGllciBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSBsYXN0IGBnaXQKKyAgdXBkYXRlLWluZGV4IHBhdGhzLi4uYCB3YXMgZG9uZSkgYXJlIG5vdCBiZWluZyBjb21taXR0ZWQuCisKKy4gSXQgcmVhZHMgSEVBRCBjb21taXQgaW50byBhIHRlbXBvcmFyeSBpbmRleCBmaWxlLCB1cGRhdGVzIHRoZQorICBzcGVjaWZpZWQgYHBhdGhzLi4uYCBhbmQgbWFrZXMgYSBjb21taXQuICBBdCB0aGUgc2FtZSB0aW1lLAorICB0aGUgcmVhbCBpbmRleCBmaWxlIGlzIGFsc28gdXBkYXRlZCB3aXRoIHRoZSBzYW1lIGBwYXRocy4uLmAuCisKK2BnaXQgY29tbWl0IC0tYWxsYCB1cGRhdGVzIHRoZSBpbmRleCBmaWxlIHdpdGggX2FsbF8gY2hhbmdlcyB0bwordGhlIHdvcmtpbmcgdHJlZSwgYW5kIG1ha2VzIGEgd2hvbGUtdHJlZSBjb21taXQsIHJlZ2FyZGxlc3Mgb2YKK3doaWNoIHN1YmRpcmVjdG9yeSB0aGUgY29tbWFuZCBpcyBpbnZva2VkIGluLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb252ZXJ0LW9iamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY29udmVydC1vYmplY3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTIyMGMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY29udmVydC1vYmplY3RzLnR4dApAQCAtMCwwICsxLDI5IEBACitnaXQtY29udmVydC1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jb252ZXJ0LW9iamVjdHMgLSBDb252ZXJ0cyBvbGQtc3R5bGUgZ2l0IHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY29udmVydC1vYmplY3RzJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbnZlcnRzIG9sZC1zdHlsZSBnaXQgcmVwb3NpdG9yeSB0byB0aGUgbGF0ZXN0IGZvcm1hdAorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jb3VudC1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWNvdW50LW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGNlNzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1jb3VudC1vYmplY3RzLnR4dApAQCAtMCwwICsxLDM4IEBACitnaXQtY291bnQtb2JqZWN0cygxKQorPT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWNvdW50LW9iamVjdHMgLSBSZXBvcnRzIG9uIHVucGFja2VkIG9iamVjdHMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWNvdW50LW9iamVjdHMnIFstdl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvdW50cyB0aGUgbnVtYmVyIG9mIHVucGFja2VkIG9iamVjdCBmaWxlcyBhbmQgZGlzayBzcGFjZSBjb25zdW1lZCBieQordGhlbSwgdG8gaGVscCB5b3UgZGVjaWRlIHdoZW4gaXQgaXMgYSBnb29kIHRpbWUgdG8gcmVwYWNrLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy12OjoKKwlJbiBhZGRpdGlvbiB0byB0aGUgbnVtYmVyIG9mIGxvb3NlIG9iamVjdHMgYW5kIGRpc2sKKwlzcGFjZSBjb25zdW1lZCwgaXQgcmVwb3J0cyB0aGUgbnVtYmVyIG9mIGluLXBhY2sKKwlvYmplY3RzLCBhbmQgbnVtYmVyIG9mIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVtb3ZlZCBieQorCXJ1bm5pbmcgYGdpdC1wcnVuZS1wYWNrZWRgLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNleHBvcnRjb21taXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzZXhwb3J0Y29tbWl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTJkMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzZXhwb3J0Y29tbWl0LnR4dApAQCAtMCwwICsxLDg3IEBACitnaXQtY3ZzZXhwb3J0Y29tbWl0KDEpCis9PT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1jdnNleHBvcnRjb21taXQgLSBFeHBvcnQgYSBjb21taXQgdG8gYSBDVlMgY2hlY2tvdXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtY3ZzZXhwb3J0Y29tbWl0JyBbLWhdIFstdl0gWy1jXSBbLXBdIFstYV0gWy1mXSBbLW0gbXNncHJlZml4XSBbUEFSRU5UQ09NTUlUXSBDT01NSVRJRAorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRXhwb3J0cyBhIGNvbW1pdCBmcm9tIEdJVCB0byBhIENWUyBjaGVja291dCwgbWFraW5nIGl0IGVhc2llcgordG8gbWVyZ2UgcGF0Y2hlcyBmcm9tIGEgZ2l0IHJlcG9zaXRvcnkgaW50byBhIENWUyByZXBvc2l0b3J5LiAKKworRXhlY3V0ZSBpdCBmcm9tIHRoZSByb290IG9mIHRoZSBDVlMgd29ya2luZyBjb3B5LiBHSVRfRElSIG11c3QgYmUgZGVmaW5lZC4gCitTZWUgZXhhbXBsZXMgYmVsb3cuCisKK0l0IGRvZXMgaXRzIGJlc3QgdG8gZG8gdGhlIHNhZmUgdGhpbmcsIGl0IHdpbGwgY2hlY2sgdGhhdCB0aGUgZmlsZXMgYXJlIAordW5jaGFuZ2VkIGFuZCB1cCB0byBkYXRlIGluIHRoZSBDVlMgY2hlY2tvdXQsIGFuZCBpdCB3aWxsIG5vdCBhdXRvY29tbWl0IAorYnkgZGVmYXVsdC4KKworU3VwcG9ydHMgZmlsZSBhZGRpdGlvbnMsIHJlbW92YWxzLCBhbmQgY29tbWl0cyB0aGF0IGFmZmVjdCBiaW5hcnkgZmlsZXMuCisKK0lmIHRoZSBjb21taXQgaXMgYSBtZXJnZSBjb21taXQsIHlvdSBtdXN0IHRlbGwgZ2l0LWN2c2FwcGx5Y29tbWl0IHdoYXQgcGFyZW50CitzaG91bGQgdGhlIGNoYW5nZXNldCBiZSBkb25lIGFnYWluc3QuIAorCitPUFRJT05TCistLS0tLS0tCisKKy1jOjoKKwlDb21taXQgYXV0b21hdGljYWxseSBpZiB0aGUgcGF0Y2ggYXBwbGllZCBjbGVhbmx5LiBJdCB3aWxsIG5vdAorCWNvbW1pdCBpZiBhbnkgaHVua3MgZmFpbCB0byBhcHBseSBvciB0aGVyZSB3ZXJlIG90aGVyIHByb2JsZW1zLgorCistcDo6CisJQmUgcGVkYW50aWMgKHBhcmFub2lkKSB3aGVuIGFwcGx5aW5nIHBhdGNoZXMuIEludm9rZXMgcGF0Y2ggd2l0aAorCS0tZnV6ej0wCisKKy1hOjoKKwlBZGQgYXV0aG9yc2hpcCBpbmZvcm1hdGlvbi4gQWRkcyBBdXRob3IgbGluZSwgYW5kIENvbW1pdHRlciAoaWYKKwlkaWZmZXJlbnQgZnJvbSBBdXRob3IpIHRvIHRoZSBtZXNzYWdlLgorCistZjo6CisJRm9yY2UgdGhlIG1lcmdlIGV2ZW4gaWYgdGhlIGZpbGVzIGFyZSBub3QgdXAgdG8gZGF0ZS4KKworLW06OgorCVByZXBlbmQgdGhlIGNvbW1pdCBtZXNzYWdlIHdpdGggdGhlIHByb3ZpZGVkIHByZWZpeC4gCisJVXNlZnVsIGZvciBwYXRjaCBzZXJpZXMgYW5kIHRoZSBsaWtlLgorCistdjo6CisJVmVyYm9zZS4KKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK01lcmdlIG9uZSBwYXRjaCBpbnRvIENWUzo6CisrCistLS0tLS0tLS0tLS0KKyQgZXhwb3J0IEdJVF9ESVI9fi9wcm9qZWN0Ly5naXQKKyQgY2Qgfi9wcm9qZWN0X2N2c19jaGVja291dAorJCBnaXQtY3ZzZXhwb3J0Y29tbWl0IC12IDxjb21taXQtc2hhMT4KKyQgY3ZzIGNvbW1pdCAtRiAubWdzIDxmaWxlcz4gCistLS0tLS0tLS0tLS0KKworTWVyZ2UgcGVuZGluZyBwYXRjaGVzIGludG8gQ1ZTIGF1dG9tYXRpY2FsbHkgLS0gb25seSBpZiB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIDo6CisrCistLS0tLS0tLS0tLS0KKyQgZXhwb3J0IEdJVF9ESVI9fi9wcm9qZWN0Ly5naXQKKyQgY2Qgfi9wcm9qZWN0X2N2c19jaGVja291dAorJCBnaXQtY2hlcnJ5IGN2c2hlYWQgbXloZWFkIHwgc2VkIC1uICdzL14rIC8vcCcgfCB4YXJncyAtbDEgZ2l0LWN2c2V4cG9ydGNvbW1pdCAtYyAtcCAtdgorLS0tLS0tLS0tLS0tCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWFydGluIExhbmdob2ZmIDxtYXJ0aW5AY2F0YWx5c3QubmV0Lm56PgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxZDY2YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC50eHQKQEAgLTAsMCArMSwxNDEgQEAKK2dpdC1jdnNpbXBvcnQoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWN2c2ltcG9ydCAtIEltcG9ydCBhIENWUyByZXBvc2l0b3J5IGludG8gZ2l0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWN2c2ltcG9ydCcgWy1vIDxicmFuY2gtZm9yLUhFQUQ+XSBbLWhdIFstdl0gWy1kIDxDVlNST09UPl0gWy1zIDxzdWJzdD5dCisJICAgICAgWy1wIDxvcHRpb25zLWZvci1jdnNwcz5dIFstQyA8Z2l0X3JlcG9zaXRvcnk+XSBbLWldIFstUCA8ZmlsZT5dCisJICAgICAgWy1tXSBbLU0gcmVnZXhdIFs8Q1ZTX21vZHVsZT5dCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbXBvcnRzIGEgQ1ZTIHJlcG9zaXRvcnkgaW50byBnaXQuIEl0IHdpbGwgZWl0aGVyIGNyZWF0ZSBhIG5ldworcmVwb3NpdG9yeSwgb3IgaW5jcmVtZW50YWxseSBpbXBvcnQgaW50byBhbiBleGlzdGluZyBvbmUuCisKK1NwbGl0dGluZyB0aGUgQ1ZTIGxvZyBpbnRvIHBhdGNoIHNldHMgaXMgZG9uZSBieSAnY3ZzcHMnLgorQXQgbGVhc3QgdmVyc2lvbiAyLjEgaXMgcmVxdWlyZWQuCisKK1lvdSBzaG91bGQgKm5ldmVyKiBkbyBhbnkgd29yayBvZiB5b3VyIG93biBvbiB0aGUgYnJhbmNoZXMgdGhhdCBhcmUKK2NyZWF0ZWQgYnkgZ2l0LWN2c2ltcG9ydC4gVGhlIGluaXRpYWwgaW1wb3J0IHdpbGwgY3JlYXRlIGFuZCBwb3B1bGF0ZSBhCisibWFzdGVyIiBicmFuY2ggZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnkncyBtYWluIGJyYW5jaCB3aGljaCB5b3UncmUgZnJlZQordG8gd29yayB3aXRoOyBhZnRlciB0aGF0LCB5b3UgbmVlZCB0byAnZ2l0IG1lcmdlJyBpbmNyZW1lbnRhbCBpbXBvcnRzLCBvcgorYW55IENWUyBicmFuY2hlcywgeW91cnNlbGYuCisKK09QVElPTlMKKy0tLS0tLS0KKy1kIDxDVlNST09UPjo6CisJVGhlIHJvb3Qgb2YgdGhlIENWUyBhcmNoaXZlLiBNYXkgYmUgbG9jYWwgKGEgc2ltcGxlIHBhdGgpIG9yIHJlbW90ZTsKKwljdXJyZW50bHksIG9ubHkgdGhlIDpsb2NhbDosIDpleHQ6IGFuZCA6cHNlcnZlcjogYWNjZXNzIG1ldGhvZHMgCisJYXJlIHN1cHBvcnRlZC4KKworLUMgPHRhcmdldC1kaXI+OjoKKyAgICAgICAgVGhlIGdpdCByZXBvc2l0b3J5IHRvIGltcG9ydCB0by4gIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndAorICAgICAgICBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLiAgRGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKy1pOjoKKwlJbXBvcnQtb25seTogZG9uJ3QgcGVyZm9ybSBhIGNoZWNrb3V0IGFmdGVyIGltcG9ydGluZy4gIFRoaXMgb3B0aW9uCisJZW5zdXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGluZGV4IHJlbWFpbiB1bnRvdWNoZWQgYW5kIHdpbGwKKwlub3QgY3JlYXRlIHRoZW0gaWYgdGhleSBkbyBub3QgZXhpc3QuCisKKy1rOjoKKwlLaWxsIGtleXdvcmRzOiB3aWxsIGV4dHJhY3QgZmlsZXMgd2l0aCAta2sgZnJvbSB0aGUgQ1ZTIGFyY2hpdmUKKwl0byBhdm9pZCBub2lzeSBjaGFuZ2VzZXRzLiBIaWdobHkgcmVjb21tZW5kZWQsIGJ1dCBvZmYgYnkgZGVmYXVsdAorCXRvIHByZXNlcnZlIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJseSBpbXBvcnRlZCB0cmVlcy4gCisKKy11OjoKKwlDb252ZXJ0IHVuZGVyc2NvcmVzIGluIHRhZyBhbmQgYnJhbmNoIG5hbWVzIHRvIGRvdHMuCisKKy1vIDxicmFuY2gtZm9yLUhFQUQ+OjoKKwlUaGUgJ0hFQUQnIGJyYW5jaCBmcm9tIENWUyBpcyBpbXBvcnRlZCB0byB0aGUgJ29yaWdpbicgYnJhbmNoIHdpdGhpbgorCXRoZSBnaXQgcmVwb3NpdG9yeSwgYXMgJ0hFQUQnIGFscmVhZHkgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGZvciBnaXQuCisJVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGltcG9ydCBpbnRvIGEgZGlmZmVyZW50IGJyYW5jaC4KKysKK1VzZSAnLW8gbWFzdGVyJyBmb3IgY29udGludWluZyBhbiBpbXBvcnQgdGhhdCB3YXMgaW5pdGlhbGx5IGRvbmUgYnkKK3RoZSBvbGQgY3ZzMmdpdCB0b29sLgorCistcCA8b3B0aW9ucy1mb3ItY3ZzcHM+OjoKKwlBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGN2c3BzLgorCVRoZSBvcHRpb25zICctdScgYW5kICctQScgYXJlIGltcGxpY2l0IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4KKysKK0lmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgb3B0aW9ucywgc2VwYXJhdGUgdGhlbSB3aXRoIGEgY29tbWEuCisKKy1QIDxjdnNwcy1vdXRwdXQtZmlsZT46OgorCUluc3RlYWQgb2YgY2FsbGluZyBjdnNwcywgcmVhZCB0aGUgcHJvdmlkZWQgY3ZzcHMgb3V0cHV0IGZpbGUuIFVzZWZ1bAorCWZvciBkZWJ1Z2dpbmcgb3Igd2hlbiBjdnNwcyBpcyBiZWluZyBoYW5kbGVkIG91dHNpZGUgY3ZzaW1wb3J0LgorCistbTo6ICAgIAorCUF0dGVtcHQgdG8gZGV0ZWN0IG1lcmdlcyBiYXNlZCBvbiB0aGUgY29tbWl0IG1lc3NhZ2UuIFRoaXMgb3B0aW9uCisJd2lsbCBlbmFibGUgZGVmYXVsdCByZWdleGVzIHRoYXQgdHJ5IHRvIGNhcHR1cmUgdGhlIG5hbWUgc291cmNlIAorCWJyYW5jaCBuYW1lIGZyb20gdGhlIGNvbW1pdCBtZXNzYWdlLiAKKworLU0gPHJlZ2V4Pjo6CisJQXR0ZW1wdCB0byBkZXRlY3QgbWVyZ2VzIGJhc2VkIG9uIHRoZSBjb21taXQgbWVzc2FnZSB3aXRoIGEgY3VzdG9tCisJcmVnZXguIEl0IGNhbiBiZSB1c2VkIHdpdGggLW0gdG8gYWxzbyBzZWUgdGhlIGRlZmF1bHQgcmVnZXhlcy4gCisJWW91IG11c3QgZXNjYXBlIGZvcndhcmQgc2xhc2hlcy4gCisKKy12OjoKKwlWZXJib3NpdHk6IGxldCAnY3ZzaW1wb3J0JyByZXBvcnQgd2hhdCBpdCBpcyBkb2luZy4KKworPENWU19tb2R1bGU+OjoKKwlUaGUgQ1ZTIG1vZHVsZSB5b3Ugd2FudCB0byBpbXBvcnQuIFJlbGF0aXZlIHRvIDxDVlNST09UPi4KKworLWg6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworLXogPGZ1eno+OjoKKyAgICAgICAgUGFzcyB0aGUgdGltZXN0YW1wIGZ1enogZmFjdG9yIHRvIGN2c3BzLgorCistcyA8c3Vic3Q+OjoKKwlTdWJzdGl0dXRlIHRoZSBjaGFyYWN0ZXIgIi8iIGluIGJyYW5jaCBuYW1lcyB3aXRoIDxzdWJzdD4KKworLUEgPGF1dGhvci1jb252LWZpbGU+OjoKKwlDVlMgYnkgZGVmYXVsdCB1c2VzIHRoZSB1bml4IHVzZXJuYW1lIHdoZW4gd3JpdGluZyBpdHMKKwljb21taXQgbG9ncy4gVXNpbmcgdGhpcyBvcHRpb24gYW5kIGFuIGF1dGhvci1jb252LWZpbGUKKwlpbiB0aGlzIGZvcm1hdAorKworLS0tLS0tLS0tCisJZXhvbj1BbmRyZWFzIEVyaWNzc29uIDxhZUBvcDUuc2U+CisJc3Bhd249U2ltb24gUGF3biA8c3Bhd25AZnJvZy1wb25kLm9yZz4KKworLS0tLS0tLS0tCisrCitnaXQtY3ZzaW1wb3J0IHdpbGwgbWFrZSBpdCBhcHBlYXIgYXMgdGhvc2UgYXV0aG9ycyBoYWQKK3RoZWlyIEdJVF9BVVRIT1JfTkFNRSBhbmQgR0lUX0FVVEhPUl9FTUFJTCBzZXQgcHJvcGVybHkKK2FsbCBhbG9uZy4KKysKK0ZvciBjb252ZW5pZW5jZSwgdGhpcyBkYXRhIGlzIHNhdmVkIHRvICRHSVRfRElSL2N2cy1hdXRob3JzCitlYWNoIHRpbWUgdGhlIC1BIG9wdGlvbiBpcyBwcm92aWRlZCBhbmQgcmVhZCBmcm9tIHRoYXQgc2FtZQorZmlsZSBlYWNoIHRpbWUgZ2l0LWN2c2ltcG9ydCBpcyBydW4uCisrCitJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmVhdHVyZSBpZiB5b3UgaW50ZW5kIHRvCitleHBvcnQgY2hhbmdlcyBiYWNrIHRvIENWUyBhZ2FpbiBsYXRlciB3aXRoCitnaXRsaW5rOmdpdC1jdnNleHBvcnRjb21taXRbMV0uCisKK09VVFBVVAorLS0tLS0tCitJZiAnLXYnIGlzIHNwZWNpZmllZCwgdGhlIHNjcmlwdCByZXBvcnRzIHdoYXQgaXQgaXMgZG9pbmcuCisKK090aGVyd2lzZSwgc3VjY2VzcyBpcyBpbmRpY2F0ZWQgdGhlIFVuaXggd2F5LCBpLmUuIGJ5IHNpbXBseSBleGl0aW5nIHdpdGgKK2EgemVybyBleGl0IHN0YXR1cy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4sIHdpdGggaGVscCBmcm9tCit2YXJpb3VzIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNzZXJ2ZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtY3Zzc2VydmVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI4ZGIzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3Zzc2VydmVyLnR4dApAQCAtMCwwICsxLDE2MSBAQAorZ2l0LWN2c3NlcnZlcigxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtY3Zzc2VydmVyIC0gQSBDVlMgc2VydmVyIGVtdWxhdG9yIGZvciBnaXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCitleHBvcnQgQ1ZTX1NFUlZFUj1naXQtY3Zzc2VydmVyCisnY3ZzJyAtZCA6ZXh0OnVzZXJAc2VydmVyL3BhdGgvcmVwby5naXQgY28gPEhFQURfbmFtZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgYXBwbGljYXRpb24gaXMgYSBDVlMgZW11bGF0aW9uIGxheWVyIGZvciBnaXQuCisKK0l0IGlzIGhpZ2hseSBmdW5jdGlvbmFsLiBIb3dldmVyLCBub3QgYWxsIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkLAorYW5kIGZvciB0aG9zZSBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkLAorbm90IGFsbCBzd2l0Y2hlcyBhcmUgaW1wbGVtZW50ZWQuCisKK1Rlc3RpbmcgaGFzIGJlZW4gZG9uZSB1c2luZyBib3RoIHRoZSBDTEkgQ1ZTIGNsaWVudCwgYW5kIHRoZSBFY2xpcHNlIENWUworcGx1Z2luLiBNb3N0IGZ1bmN0aW9uYWxpdHkgd29ya3MgZmluZSB3aXRoIGJvdGggb2YgdGhlc2UgY2xpZW50cy4KKworTElNSVRBVElPTlMKKy0tLS0tLS0tLS0tCisKK0N1cnJlbnRseSBjdnNzZXJ2ZXIgd29ya3Mgb3ZlciBTU0ggY29ubmVjdGlvbnMgZm9yIHJlYWQvd3JpdGUgY2xpZW50cywgYW5kCitvdmVyIHBzZXJ2ZXIgZm9yIGFub255bW91cyBDVlMgYWNjZXNzLgorCitDVlMgY2xpZW50cyBjYW5ub3QgdGFnLCBicmFuY2ggb3IgcGVyZm9ybSBHSVQgbWVyZ2VzLgorCitJTlNUQUxMQVRJT04KKy0tLS0tLS0tLS0tLQorCisxLiBJZiB5b3UgYXJlIGdvaW5nIHRvIG9mZmVyIGFub255bW91cyBDVlMgYWNjZXNzIHZpYSBwc2VydmVyLCBhZGQgYSBsaW5lIGluCisgICAvZXRjL2luZXRkLmNvbmYgbGlrZQorKworLS0KKy0tLS0tLQorICAgY3ZzcHNlcnZlciBzdHJlYW0gdGNwIG5vd2FpdCBub2JvZHkgZ2l0LWN2c3NlcnZlciBwc2VydmVyCisKKy0tLS0tLQorTm90ZTogSW4gc29tZSBjYXNlcywgeW91IG5lZWQgdG8gcGFzcyB0aGUgJ3BzZXJ2ZXInIGFyZ3VtZW50IHR3aWNlIGZvcgorZ2l0LWN2c3NlcnZlciB0byBzZWUgaXQuIFNvIHRoZSBsaW5lIHdvdWxkIGxvb2sgbGlrZQorCistLS0tLS0KKyAgIGN2c3BzZXJ2ZXIgc3RyZWFtIHRjcCBub3dhaXQgbm9ib2R5IGdpdC1jdnNzZXJ2ZXIgcHNlcnZlciBwc2VydmVyCisKKy0tLS0tLQorTm8gc3BlY2lhbCBzZXR1cCBpcyBuZWVkZWQgZm9yIFNTSCBhY2Nlc3MsIG90aGVyIHRoYW4gaGF2aW5nIEdJVCB0b29scworaW4gdGhlIFBBVEguIElmIHlvdSBoYXZlIGNsaWVudHMgdGhhdCBkbyBub3QgYWNjZXB0IHRoZSBDVlNfU0VSVkVSCitlbnYgdmFyaWFibGUsIHlvdSBjYW4gcmVuYW1lIGdpdC1jdnNzZXJ2ZXIgdG8gY3ZzLgorLS0KKzIuIEZvciBlYWNoIHJlcG8gdGhhdCB5b3Ugd2FudCBhY2Nlc3NpYmxlIGZyb20gQ1ZTIHlvdSBuZWVkIHRvIGVkaXQgY29uZmlnIGluCisgICB0aGUgcmVwbyBhbmQgYWRkIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4KKysKKy0tCistLS0tLS0KKyAgIFtnaXRjdnNdCisgICAgICAgIGVuYWJsZWQ9MQorICAgICAgICAjIG9wdGlvbmFsIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgbG9nZmlsZT0vcGF0aC90by9sb2dmaWxlCisKKy0tLS0tLQorTm90ZTogeW91IG5lZWQgdG8gZW5zdXJlIGVhY2ggdXNlciB0aGF0IGlzIGdvaW5nIHRvIGludm9rZSBnaXQtY3Zzc2VydmVyIGhhcword3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZmlsZSBhbmQgdG8gdGhlIGdpdCByZXBvc2l0b3J5LiBXaGVuIG9mZmVyaW5nIGFub24KK2FjY2VzcyB2aWEgcHNlcnZlciwgdGhpcyBtZWFucyB0aGF0IHRoZSBub2JvZHkgdXNlciBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MKK3RvIGF0IGxlYXN0IHRoZSBzcWxpdGUgZGF0YWJhc2UgYXQgdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuCistLQorMy4gT24gdGhlIGNsaWVudCBtYWNoaW5lIHlvdSBuZWVkIHRvIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcy4KKyAgIENWU1JPT1Qgc2hvdWxkIGJlIHNldCBhcyBwZXIgbm9ybWFsLCBidXQgdGhlIGRpcmVjdG9yeSBzaG91bGQgcG9pbnQgYXQgdGhlCisgICBhcHByb3ByaWF0ZSBnaXQgcmVwby4gRm9yIGV4YW1wbGU6CisrCistLQorRm9yIFNTSCBhY2Nlc3MsIENWU19TRVJWRVIgc2hvdWxkIGJlIHNldCB0byBnaXQtY3Zzc2VydmVyCisKK0V4YW1wbGU6CisKKy0tLS0tLQorICAgICBleHBvcnQgQ1ZTUk9PVD06ZXh0OnVzZXJAc2VydmVyOi92YXIvZ2l0L3Byb2plY3QuZ2l0CisgICAgIGV4cG9ydCBDVlNfU0VSVkVSPWdpdC1jdnNzZXJ2ZXIKKy0tLS0tLQorLS0KKzQuIEZvciBTU0ggY2xpZW50cyB0aGF0IHdpbGwgbWFrZSBjb21taXRzLCBtYWtlIHN1cmUgdGhlaXIgLmJhc2hyYyBmaWxlCisgICBzZXRzIHRoZSBHSVRfQVVUSE9SIGFuZCBHSVRfQ09NTUlUVEVSIHZhcmlhYmxlcy4KKworNS4gQ2xpZW50cyBzaG91bGQgbm93IGJlIGFibGUgdG8gY2hlY2sgb3V0IHRoZSBwcm9qZWN0LiBVc2UgdGhlIENWUyAnbW9kdWxlJworICAgbmFtZSB0byBpbmRpY2F0ZSB3aGF0IEdJVCAnaGVhZCcgeW91IHdhbnQgdG8gY2hlY2sgb3V0LiBFeGFtcGxlOgorKworLS0tLS0tCisgICAgIGN2cyBjbyAtZCBwcm9qZWN0LW1hc3RlciBtYXN0ZXIKKy0tLS0tLQorCitFY2xpcHNlIENWUyBDbGllbnQgTm90ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBnZXQgYSBjaGVja291dCB3aXRoIHRoZSBFY2xpcHNlIENWUyBjbGllbnQ6CisKKzEuIFNlbGVjdCAiQ3JlYXRlIGEgbmV3IHByb2plY3QgLT4gRnJvbSBDVlMgY2hlY2tvdXQiCisyLiBDcmVhdGUgYSBuZXcgbG9jYXRpb24uIFNlZSB0aGUgbm90ZXMgYmVsb3cgZm9yIGRldGFpbHMgb24gaG93IHRvIGNob29zZSB0aGUKKyAgIHJpZ2h0IHByb3RvY29sLgorMy4gQnJvd3NlIHRoZSAnbW9kdWxlcycgYXZhaWxhYmxlLiBJdCB3aWxsIGdpdmUgeW91IGEgbGlzdCBvZiB0aGUgaGVhZHMgaW4KKyAgIHRoZSByZXBvc2l0b3J5LiBZb3Ugd2lsbCBub3QgYmUgYWJsZSB0byBicm93c2UgdGhlIHRyZWUgZnJvbSB0aGVyZS4gT25seQorICAgdGhlIGhlYWRzLgorNC4gUGljayAnSEVBRCcgd2hlbiBpdCBhc2tzIHdoYXQgYnJhbmNoL3RhZyB0byBjaGVjayBvdXQuIFVudGljayB0aGUKKyAgICJsYXVuY2ggY29tbWl0IHdpemFyZCIgdG8gYXZvaWQgY29tbWl0dGluZyB0aGUgLnByb2plY3QgZmlsZS4KKworUHJvdG9jb2wgbm90ZXM6IElmIHlvdSBhcmUgdXNpbmcgYW5vbnltb3VzIGFjY2VzcyB2aWEgcHNlcnZlciwganVzdCBzZWxlY3QgdGhhdC4KK1Rob3NlIHVzaW5nIFNTSCBhY2Nlc3Mgc2hvdWxkIGNob29zZSB0aGUgJ2V4dCcgcHJvdG9jb2wsIGFuZCBjb25maWd1cmUgJ2V4dCcKK2FjY2VzcyBvbiB0aGUgUHJlZmVyZW5jZXMtPlRlYW0tPkNWUy0+RXh0Q29ubmVjdGlvbiBwYW5lLiBTZXQgQ1ZTX1NFUlZFUiB0bworJ2dpdC1jdnNzZXJ2ZXInLiBOb3QgdGhhdCBwYXNzd29yZCBzdXBwb3J0IGlzIG5vdCBnb29kIHdoZW4gdXNpbmcgJ2V4dCcsCit5b3Ugd2lsbCBkZWZpbml0ZWx5IHdhbnQgdG8gaGF2ZSBTU0gga2V5cyBzZXR1cC4KKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBqdXN0IHVzZSB0aGUgbm9uLXN0YW5kYXJkIGV4dHNzaCBwcm90b2NvbCB0aGF0IEVjbGlwc2UKK29mZmVyLiBJbiB0aGF0IGNhc2UgQ1ZTX1NFUlZFUiBpcyBpZ25vcmVkLCBhbmQgeW91IHdpbGwgaGF2ZSB0byByZXBsYWNlCit0aGUgY3ZzIHV0aWxpdHkgb24gdGhlIHNlcnZlciB3aXRoIGdpdC1jdnNzZXJ2ZXIgb3IgbWFuaXB1bGF0ZSB5b3VyIC5iYXNocmMKK3NvIHRoYXQgY2FsbGluZyAnY3ZzJyBlZmZlY3RpdmVseSBjYWxscyBnaXQtY3Zzc2VydmVyLgorCitDbGllbnRzIGtub3duIHRvIHdvcmsKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDVlMgMS4xMi45IG9uIERlYmlhbgorQ1ZTIDEuMTEuMTcgb24gTWFjT1NYIChmcm9tIEZpbmsgcGFja2FnZSkKK0VjbGlwc2UgMy4wLCAzLjEuMiBvbiBNYWNPU1ggKHNlZSBFY2xpcHNlIENWUyBDbGllbnQgTm90ZXMpCitUb3J0b2lzZUNWUworCitPcGVyYXRpb25zIHN1cHBvcnRlZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIHRoZSBvcGVyYXRpb25zIHJlcXVpcmVkIGZvciBub3JtYWwgdXNlIGFyZSBzdXBwb3J0ZWQsIGluY2x1ZGluZworY2hlY2tvdXQsIGRpZmYsIHN0YXR1cywgdXBkYXRlLCBsb2csIGFkZCwgcmVtb3ZlLCBjb21taXQuCitMZWdhY3kgbW9uaXRvcmluZyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIChlZGl0LCB3YXRjaCBhbmQgcmVsYXRlZCkuCitFeHBvcnRzIGFuZCB0YWdnaW5nICh0YWdzIGFuZCBicmFuY2hlcykgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyBzdGFnZS4KKworVGhlIHNlcnZlciB3aWxsIHNldCB0aGUgLWsgbW9kZSB0byBiaW5hcnkgd2hlbiByZWxldmFudC4gSW4gcHJvcGVyIEdJVAordHJhZGl0aW9uLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIGFyZSBhbHdheXMgcmVzcGVjdGVkLgorTm8ga2V5d29yZCBleHBhbnNpb24gb3IgbmV3bGluZSBtdW5naW5nIGlzIHN1cHBvcnRlZC4KKworRGVwZW5kZW5jaWVzCistLS0tLS0tLS0tLS0KKworZ2l0LWN2c3NlcnZlciBkZXBlbmRzIG9uIERCRDo6U1FMaXRlLgorCitDb3B5cmlnaHQgYW5kIEF1dGhvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHByb2dyYW0gaXMgY29weXJpZ2h0IFRoZSBPcGVuIFVuaXZlcnNpdHkgVUsgLSAyMDA2LgorCitBdXRob3JzOiBNYXJ0eW4gU21pdGggICAgPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+CisgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisgICAgICAgICB3aXRoIGlkZWFzIGFuZCBwYXRjaGVzIGZyb20gcGFydGljaXBhbnRzIG9mIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE1hcnR5biBTbWl0aCA8bWFydHluQGNhdGFseXN0Lm5ldC5uej4gYW5kIE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4gTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRhZW1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kYWVtb24udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmN2QyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kYWVtb24udHh0CkBAIC0wLDAgKzEsMTEzIEBACitnaXQtZGFlbW9uKDEpCis9PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kYWVtb24gLSBBIHJlYWxseSBzaW1wbGUgc2VydmVyIGZvciBnaXQgcmVwb3NpdG9yaWVzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1kYWVtb24nIFstLXZlcmJvc2VdIFstLXN5c2xvZ10gWy0taW5ldGQgfCAtLXBvcnQ9bl0gWy0tZXhwb3J0LWFsbF0KKyAgICAgICAgICAgICBbLS10aW1lb3V0PW5dIFstLWluaXQtdGltZW91dD1uXSBbLS1zdHJpY3QtcGF0aHNdCisgICAgICAgICAgICAgWy0tYmFzZS1wYXRoPXBhdGhdIFstLXVzZXItcGF0aCB8IC0tdXNlci1wYXRoPXBhdGhdCisJICAgICBbLS1yZXVzZWFkZHJdIFstLWRldGFjaF0gWy0tcGlkLWZpbGU9ZmlsZV0gW2RpcmVjdG9yeS4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIHJlYWxseSBzaW1wbGUgVENQIGdpdCBkYWVtb24gdGhhdCBub3JtYWxseSBsaXN0ZW5zIG9uIHBvcnQgIkRFRkFVTFRfR0lUX1BPUlQiCitha2EgOTQxOC4gSXQgd2FpdHMgZm9yIGEgY29ubmVjdGlvbiwgYW5kIHdpbGwganVzdCBleGVjdXRlICJnaXQtdXBsb2FkLXBhY2siCit3aGVuIGl0IGdldHMgb25lLgorCitJdCdzIGNhcmVmdWwgaW4gdGhhdCB0aGVyZSdzIGEgbWFnaWMgcmVxdWVzdC1saW5lIHRoYXQgZ2l2ZXMgdGhlIGNvbW1hbmQgYW5kCit3aGF0IGRpcmVjdG9yeSB0byB1cGxvYWQsIGFuZCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBkaXJlY3RvcnkgaXMgT0suCisKK0l0IHZlcmlmaWVzIHRoYXQgdGhlIGRpcmVjdG9yeSBoYXMgdGhlIG1hZ2ljIGZpbGUgImdpdC1kYWVtb24tZXhwb3J0LW9rIiwgYW5kCitpdCB3aWxsIHJlZnVzZSB0byBleHBvcnQgYW55IGdpdCBkaXJlY3RvcnkgdGhhdCBoYXNuJ3QgZXhwbGljaXRseSBiZWVuIG1hcmtlZAorZm9yIGV4cG9ydCB0aGlzIHdheSAodW5sZXNzIHRoZSAnLS1leHBvcnQtYWxsJyBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkKS4gSWYgeW91CitwYXNzIHNvbWUgZGlyZWN0b3J5IHBhdGhzIGFzICdnaXQtZGFlbW9uJyBhcmd1bWVudHMsIHlvdSBjYW4gZnVydGhlciByZXN0cmljdAordGhlIG9mZmVycyB0byBhIHdoaXRlbGlzdCBjb21wcmlzaW5nIG9mIHRob3NlLgorCitUaGlzIGlzIGlkZWFsbHkgc3VpdGVkIGZvciByZWFkLW9ubHkgdXBkYXRlcywgaS5lLiwgcHVsbGluZyBmcm9tIGdpdCByZXBvc2l0b3JpZXMuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tc3RyaWN0LXBhdGhzOjoKKwlNYXRjaCBwYXRocyBleGFjdGx5IChpLmUuIGRvbid0IGFsbG93ICIvZm9vL3JlcG8iIHdoZW4gdGhlIHJlYWwgcGF0aCBpcworCSIvZm9vL3JlcG8uZ2l0IiBvciAiL2Zvby9yZXBvLy5naXQiKSBhbmQgZG9uJ3QgZG8gdXNlci1yZWxhdGl2ZSBwYXRocy4KKwlnaXQtZGFlbW9uIHdpbGwgcmVmdXNlIHRvIHN0YXJ0IHdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgbm8KKwl3aGl0ZWxpc3QgaXMgc3BlY2lmaWVkLgorCistLWJhc2UtcGF0aDo6CisJUmVtYXAgYWxsIHRoZSBwYXRoIHJlcXVlc3RzIGFzIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBwYXRoLgorCVRoaXMgaXMgc29ydCBvZiAiR0lUIHJvb3QiIC0gaWYgeW91IHJ1biBnaXQtZGFlbW9uIHdpdGgKKwknLS1iYXNlLXBhdGg9L3Nydi9naXQnIG9uIGV4YW1wbGUuY29tLCB0aGVuIGlmIHlvdSBsYXRlciB0cnkgdG8gcHVsbAorCSdnaXQ6Ly9leGFtcGxlLmNvbS9oZWxsby5naXQnLCBgZ2l0LWRhZW1vbmAgd2lsbCBpbnRlcnByZXQgdGhlIHBhdGgKKwlhcyAnL3Nydi9naXQvaGVsbG8uZ2l0Jy4KKworLS1leHBvcnQtYWxsOjoKKwlBbGxvdyBwdWxsaW5nIGZyb20gYWxsIGRpcmVjdG9yaWVzIHRoYXQgbG9vayBsaWtlIEdJVCByZXBvc2l0b3JpZXMKKwkoaGF2ZSB0aGUgJ29iamVjdHMnIGFuZCAncmVmcycgc3ViZGlyZWN0b3JpZXMpLCBldmVuIGlmIHRoZXkKKwlkbyBub3QgaGF2ZSB0aGUgJ2dpdC1kYWVtb24tZXhwb3J0LW9rJyBmaWxlLgorCistLWluZXRkOjoKKwlIYXZlIHRoZSBzZXJ2ZXIgcnVuIGFzIGFuIGluZXRkIHNlcnZpY2UuIEltcGxpZXMgLS1zeXNsb2cuCisKKy0tcG9ydDo6CisJTGlzdGVuIG9uIGFuIGFsdGVybmF0aXZlIHBvcnQuCisKKy0taW5pdC10aW1lb3V0OjoKKwlUaW1lb3V0IGJldHdlZW4gdGhlIG1vbWVudCB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgdGhlCisJY2xpZW50IHJlcXVlc3QgaXMgcmVjZWl2ZWQgKHR5cGljYWxseSBhIHJhdGhlciBsb3cgdmFsdWUsIHNpbmNlCisJdGhhdCBzaG91bGQgYmUgYmFzaWNhbGx5IGltbWVkaWF0ZSkuCisKKy0tdGltZW91dDo6CisJVGltZW91dCBmb3Igc3BlY2lmaWMgY2xpZW50IHN1Yi1yZXF1ZXN0cy4gVGhpcyBpbmNsdWRlcyB0aGUgdGltZQorCWl0IHRha2VzIGZvciB0aGUgc2VydmVyIHRvIHByb2Nlc3MgdGhlIHN1Yi1yZXF1ZXN0IGFuZCB0aW1lIHNwZW50CisJd2FpdGluZyBmb3IgbmV4dCBjbGllbnQncyByZXF1ZXN0LgorCistLXN5c2xvZzo6CisJTG9nIHRvIHN5c2xvZyBpbnN0ZWFkIG9mIHN0ZGVyci4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGRvZXMgbm90IGltcGx5CisJLS12ZXJib3NlLCB0aHVzIGJ5IGRlZmF1bHQgb25seSBlcnJvciBjb25kaXRpb25zIHdpbGwgYmUgbG9nZ2VkLgorCistLXVzZXItcGF0aCwgLS11c2VyLXBhdGg9cGF0aDo6CisJQWxsb3cgfnVzZXIgbm90YXRpb24gdG8gYmUgdXNlZCBpbiByZXF1ZXN0cy4gIFdoZW4KKwlzcGVjaWZpZWQgd2l0aCBubyBwYXJhbWV0ZXIsIHJlcXVlc3RzIHRvCisJZ2l0Oi8vaG9zdC9+YWxpY2UvZm9vIGlzIHRha2VuIGFzIGEgcmVxdWVzdCB0byBhY2Nlc3MKKwknZm9vJyByZXBvc2l0b3J5IGluIHRoZSBob21lIGRpcmVjdG9yeSBvZiB1c2VyIGBhbGljZWAuCisJSWYgYC0tdXNlci1wYXRoPXBhdGhgIGlzIHNwZWNpZmllZCwgdGhlIHNhbWUgcmVxdWVzdCBpcworCXRha2VuIGFzIGEgcmVxdWVzdCB0byBhY2Nlc3MgYHBhdGgvZm9vYCByZXBvc2l0b3J5IGluCisJdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHVzZXIgYGFsaWNlYC4KKworLS12ZXJib3NlOjoKKwlMb2cgZGV0YWlscyBhYm91dCB0aGUgaW5jb21pbmcgY29ubmVjdGlvbnMgYW5kIHJlcXVlc3RlZCBmaWxlcy4KKworLS1yZXVzZWFkZHI6OgorCVVzZSBTT19SRVVTRUFERFIgd2hlbiBiaW5kaW5nIHRoZSBsaXN0ZW5pbmcgc29ja2V0LgorCVRoaXMgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gcmVzdGFydCB3aXRob3V0IHdhaXRpbmcgZm9yCisJb2xkIGNvbm5lY3Rpb25zIHRvIHRpbWUgb3V0LgorCistLWRldGFjaDo6CisJRGV0YWNoIGZyb20gdGhlIHNoZWxsLiBJbXBsaWVzIC0tc3lzbG9nLgorCistLXBpZC1maWxlPWZpbGU6OgorCVNhdmUgdGhlIHByb2Nlc3MgaWQgaW4gJ2ZpbGUnLgorCis8ZGlyZWN0b3J5Pjo6CisJQSBkaXJlY3RvcnkgdG8gYWRkIHRvIHRoZSB3aGl0ZWxpc3Qgb2YgYWxsb3dlZCBkaXJlY3Rvcmllcy4gVW5sZXNzCisJLS1zdHJpY3QtcGF0aHMgaXMgc3BlY2lmaWVkIHRoaXMgd2lsbCBhbHNvIGluY2x1ZGUgc3ViZGlyZWN0b3JpZXMKKwlvZiBlYWNoIG5hbWVkIGRpcmVjdG9yeS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiwgWU9TSElGVUpJIEhpZGVha2kKKzx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kZXNjcmliZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kZXNjcmliZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwMGYzNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRlc2NyaWJlLnR4dApAQCAtMCwwICsxLDc5IEBACitnaXQtZGVzY3JpYmUoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGVzY3JpYmUgLSBTaG93IHRoZSBtb3N0IHJlY2VudCB0YWcgdGhhdCBpcyByZWFjaGFibGUgZnJvbSBhIGNvbW1pdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kZXNjcmliZScgWy0tYWxsXSBbLS10YWdzXSBbLS1hYmJyZXY9PG4+XSA8Y29tbWl0dGlzaD4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGUgY29tbWFuZCBmaW5kcyB0aGUgbW9zdCByZWNlbnQgdGFnIHRoYXQgaXMgcmVhY2hhYmxlIGZyb20gYQorY29tbWl0LCBhbmQgaWYgdGhlIGNvbW1pdCBpdHNlbGYgaXMgcG9pbnRlZCBhdCBieSB0aGUgdGFnLCBzaG93cwordGhlIHRhZy4gIE90aGVyd2lzZSwgaXQgc3VmZml4ZXMgdGhlIHRhZyBuYW1lIHdpdGggYWJicmV2aWF0ZWQKK29iamVjdCBuYW1lIG9mIHRoZSBjb21taXQuCisKKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1pdHRpc2g+OjoKKwlUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdHRpc2guCisKKy0tYWxsOjoKKwlJbnN0ZWFkIG9mIHVzaW5nIG9ubHkgdGhlIGFubm90YXRlZCB0YWdzLCB1c2UgYW55IHJlZgorCWZvdW5kIGluIGAuZ2l0L3JlZnMvYC4KKworLS10YWdzOjoKKwlJbnN0ZWFkIG9mIHVzaW5nIG9ubHkgdGhlIGFubm90YXRlZCB0YWdzLCB1c2UgYW55IHRhZworCWZvdW5kIGluIGAuZ2l0L3JlZnMvdGFnc2AuCisKKy0tYWJicmV2PTxuPjo6CisJSW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCA4IGhleGFkZWNpbWFsIGRpZ2l0cyBhcyB0aGUKKwlhYmJyZXZpYXRlZCBvYmplY3QgbmFtZSwgdXNlIDxuPiBkaWdpdHMuCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK1dpdGggc29tZXRoaW5nIGxpa2UgZ2l0LmdpdCBjdXJyZW50IHRyZWUsIEkgZ2V0OgorCisJW3RvcnZhbGRzQGc1IGdpdF0kIGdpdC1kZXNjcmliZSBwYXJlbnQKKwl2MS4wLjQtZzI0MTQ3MjFiCisKK2kuZS4gdGhlIGN1cnJlbnQgaGVhZCBvZiBteSAicGFyZW50IiBicmFuY2ggaXMgYmFzZWQgb24gdjEuMC40LAorYnV0IHNpbmNlIGl0IGhhcyBhIGZldyBjb21taXRzIG9uIHRvcCBvZiB0aGF0LCBpdCBoYXMgYWRkZWQgdGhlCitnaXQgaGFzaCBvZiB0aGUgdGhpbmcgdG8gdGhlIGVuZDogIi1nIiArIDgtY2hhciBzaG9ydGhhbmQgZm9yCit0aGUgY29tbWl0IGAyNDE0NzIxYjE5NDQ1M2YwNTgwNzlkODk3ZDEzYzRlMzc3ZjkyZGM2YC4KKworRG9pbmcgYSAiZ2l0LWRlc2NyaWJlIiBvbiBhIHRhZy1uYW1lIHdpbGwganVzdCBzaG93IHRoZSB0YWcgbmFtZToKKworCVt0b3J2YWxkc0BnNSBnaXRdJCBnaXQtZGVzY3JpYmUgdjEuMC40CisJdjEuMC40CisKK1dpdGggLS1hbGwsIHRoZSBjb21tYW5kIGNhbiB1c2UgYnJhbmNoIGhlYWRzIGFzIHJlZmVyZW5jZXMsIHNvCit0aGUgb3V0cHV0IHNob3dzIHRoZSByZWZlcmVuY2UgcGF0aCBhcyB3ZWxsOgorCisJW3RvcnZhbGRzQGc1IGdpdF0kIGdpdCBkZXNjcmliZSAtLWFsbCAtLWFiYnJldj00IHYxLjAuNV4yCisJdGFncy92MS4wLjAtZzk3NWIKKworCVt0b3J2YWxkc0BnNSBnaXRdJCBnaXQgZGVzY3JpYmUgLS1hbGwgSEVBRF4KKwloZWFkcy9sdC9kZXNjcmliZS1nOTc1YgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sIGJ1dCBzb21ld2hhdAorYnV0Y2hlcmVkIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWZpbGVzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtZmlsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDhiMzUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLWZpbGVzLnR4dApAQCAtMCwwICsxLDU4IEBACitnaXQtZGlmZi1maWxlcygxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYtZmlsZXMgLSBDb21wYXJlcyBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCB0aGUgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZGlmZi1maWxlcycgWy1xXSBbLTB8LTF8LTJ8LTN8LWN8LS1jY10gWzxjb21tb24gZGlmZiBvcHRpb25zPl0gWzxwYXRoPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb21wYXJlcyB0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4LiAgV2hlbiBwYXRocworYXJlIHNwZWNpZmllZCwgY29tcGFyZXMgb25seSB0aG9zZSBuYW1lZCBwYXRocy4gIE90aGVyd2lzZSBhbGwKK2VudHJpZXMgaW4gdGhlIGluZGV4IGFyZSBjb21wYXJlZC4gIFRoZSBvdXRwdXQgZm9ybWF0IGlzIHRoZQorc2FtZSBhcyAiZ2l0LWRpZmYtaW5kZXgiIGFuZCAiZ2l0LWRpZmYtdHJlZSIuCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCistMSAtMiAtMyBvciAtLWJhc2UgLS1vdXJzIC0tdGhlaXJzLCBhbmQgLTA6OgorCURpZmYgYWdhaW5zdCB0aGUgImJhc2UiIHZlcnNpb24sICJvdXIgYnJhbmNoIiBvciAidGhlaXIKKwlicmFuY2giIHJlc3BlY3RpdmVseS4gIFdpdGggdGhlc2Ugb3B0aW9ucywgZGlmZnMgZm9yCisJbWVyZ2VkIGVudHJpZXMgYXJlIG5vdCBzaG93bi4KKysKK1RoZSBkZWZhdWx0IGlzIHRvIGRpZmYgYWdhaW5zdCBvdXIgYnJhbmNoICgtMikgYW5kIHRoZSAKK2NsZWFubHkgcmVzb2x2ZWQgcGF0aHMuICBUaGUgb3B0aW9uIC0wIGNhbiBiZSBnaXZlbiB0bworb21pdCBkaWZmIG91dHB1dCBmb3IgdW5tZXJnZWQgZW50cmllcyBhbmQganVzdCBzaG93ICJVbm1lcmdlZCIuCisKKy1jLC0tY2M6OgorCVRoaXMgY29tcGFyZXMgc3RhZ2UgMiAob3VyIGJyYW5jaCksIHN0YWdlIDMgKHRoZWlyCisJYnJhbmNoKSBhbmQgdGhlIHdvcmtpbmcgdHJlZSBmaWxlIGFuZCBvdXRwdXRzIGEgY29tYmluZWQKKwlkaWZmLCBzaW1pbGFyIHRvIHRoZSB3YXkgJ2RpZmYtdHJlZScgc2hvd3MgYSBtZXJnZQorCWNvbW1pdCB3aXRoIHRoZXNlIGZsYWdzLgorCistcTo6CisJUmVtYWluIHNpbGVudCBldmVuIG9uIG5vbmV4aXN0ZW50IGZpbGVzCisKK091dHB1dCBmb3JtYXQKKy0tLS0tLS0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtZm9ybWF0LnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtaW5kZXgudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZGlmZi1pbmRleC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkNDNmMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtaW5kZXgudHh0CkBAIC0wLDAgKzEsMTMzIEBACitnaXQtZGlmZi1pbmRleCgxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWRpZmYtaW5kZXggLSBDb21wYXJlcyBjb250ZW50IGFuZCBtb2RlIG9mIGJsb2JzIGJldHdlZW4gdGhlIGluZGV4IGFuZCByZXBvc2l0b3J5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWRpZmYtaW5kZXgnIFstbV0gWy0tY2FjaGVkXSBbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ29tcGFyZXMgdGhlIGNvbnRlbnQgYW5kIG1vZGUgb2YgdGhlIGJsb2JzIGZvdW5kIHZpYSBhIHRyZWUKK29iamVjdCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IGluZGV4IGFuZCwgb3B0aW9uYWxseQoraWdub3JpbmcgdGhlIHN0YXQgc3RhdGUgb2YgdGhlIGZpbGUgb24gZGlzay4gIFdoZW4gcGF0aHMgYXJlCitzcGVjaWZpZWQsIGNvbXBhcmVzIG9ubHkgdGhvc2UgbmFtZWQgcGF0aHMuICBPdGhlcndpc2UgYWxsCitlbnRyaWVzIGluIHRoZSBpbmRleCBhcmUgY29tcGFyZWQuCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCis8dHJlZS1pc2g+OjoKKwlUaGUgaWQgb2YgYSB0cmVlIG9iamVjdCB0byBkaWZmIGFnYWluc3QuCisKKy0tY2FjaGVkOjoKKwlkbyBub3QgY29uc2lkZXIgdGhlIG9uLWRpc2sgZmlsZSBhdCBhbGwKKworLW06OgorCUJ5IGRlZmF1bHQsIGZpbGVzIHJlY29yZGVkIGluIHRoZSBpbmRleCBidXQgbm90IGNoZWNrZWQKKwlvdXQgYXJlIHJlcG9ydGVkIGFzIGRlbGV0ZWQuICBUaGlzIGZsYWcgbWFrZXMKKwkiZ2l0LWRpZmYtaW5kZXgiIHNheSB0aGF0IGFsbCBub24tY2hlY2tlZC1vdXQgZmlsZXMgYXJlIHVwCisJdG8gZGF0ZS4KKworT3V0cHV0IGZvcm1hdAorLS0tLS0tLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1mb3JtYXQudHh0W10KKworT3BlcmF0aW5nIE1vZGVzCistLS0tLS0tLS0tLS0tLS0KK1lvdSBjYW4gY2hvb3NlIHdoZXRoZXIgeW91IHdhbnQgdG8gdHJ1c3QgdGhlIGluZGV4IGZpbGUgZW50aXJlbHkKKyh1c2luZyB0aGUgJy0tY2FjaGVkJyBmbGFnKSBvciBhc2sgdGhlIGRpZmYgbG9naWMgdG8gc2hvdyBhbnkgZmlsZXMKK3RoYXQgZG9uJ3QgbWF0Y2ggdGhlIHN0YXQgc3RhdGUgYXMgYmVpbmcgInRlbnRhdGl2ZWx5IGNoYW5nZWQiLiAgQm90aAorb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgdmVyeSB1c2VmdWwgaW5kZWVkLgorCitDYWNoZWQgTW9kZQorLS0tLS0tLS0tLS0KK0lmICctLWNhY2hlZCcgaXMgc3BlY2lmaWVkLCBpdCBhbGxvd3MgeW91IHRvIGFzazoKKworCXNob3cgbWUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSEVBRCBhbmQgdGhlIGN1cnJlbnQgaW5kZXgKKwljb250ZW50cyAodGhlIG9uZXMgSSdkIHdyaXRlIHdpdGggYSAiZ2l0LXdyaXRlLXRyZWUiKQorCitGb3IgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgeW91IGhhdmUgd29ya2VkIG9uIHlvdXIgd29ya2luZyBkaXJlY3RvcnksIHVwZGF0ZWQKK3NvbWUgZmlsZXMgaW4gdGhlIGluZGV4IGFuZCBhcmUgcmVhZHkgdG8gY29tbWl0LiBZb3Ugd2FudCB0byBzZWUgZXhhY3RseQorKndoYXQqIHlvdSBhcmUgZ29pbmcgdG8gY29tbWl0IGlzIHdpdGhvdXQgaGF2aW5nIHRvIHdyaXRlIGEgbmV3IHRyZWUKK29iamVjdCBhbmQgY29tcGFyZSBpdCB0aGF0IHdheSwgYW5kIHRvIGRvIHRoYXQsIHlvdSBqdXN0IGRvCisKKwlnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFECisKK0V4YW1wbGU6IGxldCdzIHNheSBJIGhhZCByZW5hbWVkIGBjb21taXQuY2AgdG8gYGdpdC1jb21taXQuY2AsIGFuZCBJIGhhZAorZG9uZSBhbiAiZ2l0LXVwZGF0ZS1pbmRleCIgdG8gbWFrZSB0aGF0IGVmZmVjdGl2ZSBpbiB0aGUgaW5kZXggZmlsZS4KKyJnaXQtZGlmZi1maWxlcyIgd291bGRuJ3Qgc2hvdyBhbnl0aGluZyBhdCBhbGwsIHNpbmNlIHRoZSBpbmRleCBmaWxlCittYXRjaGVzIG15IHdvcmtpbmcgZGlyZWN0b3J5LiBCdXQgZG9pbmcgYSAiZ2l0LWRpZmYtaW5kZXgiIGRvZXM6CisKKyAgdG9ydmFsZHNAcHBjOTcwOn4vZ2l0PiBnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCBIRUFECisgIC0xMDA2NDQgYmxvYiAgICA0MTYxYWVjYzY3MDBhMmViNTc5ZTg0MmFmMGI3ZjIyYjk4NDQzZjc0ICAgICAgICBjb21taXQuYworICArMTAwNjQ0IGJsb2IgICAgNDE2MWFlY2M2NzAwYTJlYjU3OWU4NDJhZjBiN2YyMmI5ODQ0M2Y3NCAgICAgICAgZ2l0LWNvbW1pdC5jCisKK1lvdSBjYW4gdHJpdmlhbGx5IHNlZSB0aGF0IHRoZSBhYm92ZSBpcyBhIHJlbmFtZS4KKworSW4gZmFjdCwgImdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIiAqc2hvdWxkKiBhbHdheXMgYmUgZW50aXJlbHkgZXF1aXZhbGVudCB0bworYWN0dWFsbHkgZG9pbmcgYSAiZ2l0LXdyaXRlLXRyZWUiIGFuZCBjb21wYXJpbmcgdGhhdC4gRXhjZXB0IHRoaXMgb25lIGlzIG11Y2gKK25pY2VyIGZvciB0aGUgY2FzZSB3aGVyZSB5b3UganVzdCB3YW50IHRvIGNoZWNrIHdoZXJlIHlvdSBhcmUuCisKK1NvIGRvaW5nIGEgImdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIiBpcyBiYXNpY2FsbHkgdmVyeSB1c2VmdWwgd2hlbiB5b3UgYXJlCithc2tpbmcgeW91cnNlbGYgIndoYXQgaGF2ZSBJIGFscmVhZHkgbWFya2VkIGZvciBiZWluZyBjb21taXR0ZWQsIGFuZCAKK3doYXQncyB0aGUgZGlmZmVyZW5jZSB0byBhIHByZXZpb3VzIHRyZWUiLgorCitOb24tY2FjaGVkIE1vZGUKKy0tLS0tLS0tLS0tLS0tLQorVGhlICJub24tY2FjaGVkIiBtb2RlIHRha2VzIGEgZGlmZmVyZW50IGFwcHJvYWNoLCBhbmQgaXMgcG90ZW50aWFsbHkKK3RoZSBtb3JlIHVzZWZ1bCBvZiB0aGUgdHdvIGluIHRoYXQgd2hhdCBpdCBkb2VzIGNhbid0IGJlIGVtdWxhdGVkIHdpdGgKK2EgImdpdC13cml0ZS10cmVlIiArICJnaXQtZGlmZi10cmVlIi4gVGh1cyB0aGF0J3MgdGhlIGRlZmF1bHQgbW9kZS4KK1RoZSBub24tY2FjaGVkIHZlcnNpb24gYXNrcyB0aGUgcXVlc3Rpb246CisKKyAgc2hvdyBtZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBIRUFEIGFuZCB0aGUgY3VycmVudGx5IGNoZWNrZWQgb3V0CisgIHRyZWUgLSBpbmRleCBjb250ZW50cyBfYW5kXyBmaWxlcyB0aGF0IGFyZW4ndCB1cC10by1kYXRlCisKK3doaWNoIGlzIG9idmlvdXNseSBhIHZlcnkgdXNlZnVsIHF1ZXN0aW9uIHRvbywgc2luY2UgdGhhdCB0ZWxscyB5b3Ugd2hhdAoreW91ICpjb3VsZCogY29tbWl0LiBBZ2FpbiwgdGhlIG91dHB1dCBtYXRjaGVzIHRoZSAiZ2l0LWRpZmYtdHJlZSAtciIKK291dHB1dCB0byBhIHRlZSwgYnV0IHdpdGggYSB0d2lzdC4KKworVGhlIHR3aXN0IGlzIHRoYXQgaWYgc29tZSBmaWxlIGRvZXNuJ3QgbWF0Y2ggdGhlIGluZGV4LCB3ZSBkb24ndCBoYXZlCithIGJhY2tpbmcgc3RvcmUgdGhpbmcgZm9yIGl0LCBhbmQgd2UgdXNlIHRoZSBtYWdpYyAiYWxsLXplcm8iIHNoYTEgdG8KK3Nob3cgdGhhdC4gU28gbGV0J3Mgc2F5IHRoYXQgeW91IGhhdmUgZWRpdGVkIGBrZXJuZWwvc2NoZWQuY2AsIGJ1dAoraGF2ZSBub3QgYWN0dWFsbHkgZG9uZSBhICJnaXQtdXBkYXRlLWluZGV4IiBvbiBpdCB5ZXQgLSB0aGVyZSBpcyBubworIm9iamVjdCIgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgc3RhdGUsIGFuZCB5b3UgZ2V0OgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L3YyLjYvbGludXg+IGdpdC1kaWZmLWluZGV4IEhFQUQKKyAgKjEwMDY0NC0+MTAwNjY0IGJsb2IgICAgNzQ3NmJiLi4uLi4uLT4wMDAwMDAuLi4uLi4gICAgICBrZXJuZWwvc2NoZWQuYworCitpLmUuLCBpdCBzaG93cyB0aGF0IHRoZSB0cmVlIGhhcyBjaGFuZ2VkLCBhbmQgdGhhdCBga2VybmVsL3NjaGVkLmNgIGhhcyBpcworbm90IHVwLXRvLWRhdGUgYW5kIG1heSBjb250YWluIG5ldyBzdHVmZi4gVGhlIGFsbC16ZXJvIHNoYTEgbWVhbnMgdGhhdCB0bworZ2V0IHRoZSByZWFsIGRpZmYsIHlvdSBuZWVkIHRvIGxvb2sgYXQgdGhlIG9iamVjdCBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkKK2RpcmVjdGx5IHJhdGhlciB0aGFuIGRvIGFuIG9iamVjdC10by1vYmplY3QgZGlmZi4KKworTk9URTogQXMgd2l0aCBvdGhlciBjb21tYW5kcyBvZiB0aGlzIHR5cGUsICJnaXQtZGlmZi1pbmRleCIgZG9lcyBub3QKK2FjdHVhbGx5IGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IGFsbC4gU28gbWF5YmUKK2BrZXJuZWwvc2NoZWQuY2AgaGFzbid0IGFjdHVhbGx5IGNoYW5nZWQsIGFuZCBpdCdzIGp1c3QgdGhhdCB5b3UKK3RvdWNoZWQgaXQuIEluIGVpdGhlciBjYXNlLCBpdCdzIGEgbm90ZSB0aGF0IHlvdSBuZWVkIHRvCisiZ2l0LXVwZGF0ZS1pbmRleCIgaXQgdG8gbWFrZSB0aGUgaW5kZXggYmUgaW4gc3luYy4KKworTk9URTogWW91IGNhbiBoYXZlIGEgbWl4dHVyZSBvZiBmaWxlcyBzaG93IHVwIGFzICJoYXMgYmVlbiB1cGRhdGVkIgorYW5kICJpcyBzdGlsbCBkaXJ0eSBpbiB0aGUgd29ya2luZyBkaXJlY3RvcnkiIHRvZ2V0aGVyLiBZb3UgY2FuIGFsd2F5cwordGVsbCB3aGljaCBmaWxlIGlzIGluIHdoaWNoIHN0YXRlLCBzaW5jZSB0aGUgImhhcyBiZWVuIHVwZGF0ZWQiIG9uZXMKK3Nob3cgYSB2YWxpZCBzaGExLCBhbmQgdGhlICJub3QgaW4gc3luYyB3aXRoIHRoZSBpbmRleCIgb25lcyB3aWxsCithbHdheXMgaGF2ZSB0aGUgc3BlY2lhbCBhbGwtemVybyBzaGExLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXN0YWdlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXN0YWdlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3MzkxOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtc3RhZ2VzLnR4dApAQCAtMCwwICsxLDQwIEBACitnaXQtZGlmZi1zdGFnZXMoMSkKKz09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZGlmZi1zdGFnZXMgLSBDb21wYXJlcyBjb250ZW50IGFuZCBtb2RlIG9mIGJsb2JzIGJldHdlZW4gc3RhZ2VzIGluIGFuIHVubWVyZ2VkIGluZGV4IGZpbGUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZGlmZi1zdGFnZXMnIFs8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIDxzdGFnZTE+IDxzdGFnZTI+IFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ29tcGFyZXMgdGhlIGNvbnRlbnQgYW5kIG1vZGUgb2YgdGhlIGJsb2JzIGluIHR3byBzdGFnZXMgaW4gYW4KK3VubWVyZ2VkIGluZGV4IGZpbGUuCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6OmRpZmYtb3B0aW9ucy50eHRbXQorCis8c3RhZ2UxPiw8c3RhZ2UyPjo6CisJVGhlIHN0YWdlIG51bWJlciB0byBiZSBjb21wYXJlZC4KKworT3V0cHV0IGZvcm1hdAorLS0tLS0tLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1mb3JtYXQudHh0W10KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXRyZWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZThmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLXRyZWUudHh0CkBAIC0wLDAgKzEsMTY5IEBACitnaXQtZGlmZi10cmVlKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmLXRyZWUgLSBDb21wYXJlcyB0aGUgY29udGVudCBhbmQgbW9kZSBvZiBibG9icyBmb3VuZCB2aWEgdHdvIHRyZWUgb2JqZWN0cworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1kaWZmLXRyZWUnIFstLXN0ZGluXSBbLW1dIFstc10gWy12XSBbLS1uby1jb21taXQtaWRdIFstLXByZXR0eV0KKwkgICAgICBbLXRdIFstcl0gWy1jIHwgLS1jY10gWy0tcm9vdF0gWzxjb21tb24gZGlmZiBvcHRpb25zPl0KKwkgICAgICA8dHJlZS1pc2g+IFs8dHJlZS1pc2g+XSBbPHBhdGg+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NvbXBhcmVzIHRoZSBjb250ZW50IGFuZCBtb2RlIG9mIHRoZSBibG9icyBmb3VuZCB2aWEgdHdvIHRyZWUgb2JqZWN0cy4KKworSWYgdGhlcmUgaXMgb25seSBvbmUgPHRyZWUtaXNoPiBnaXZlbiwgdGhlIGNvbW1pdCBpcyBjb21wYXJlZCB3aXRoIGl0cyBwYXJlbnRzCisoc2VlIC0tc3RkaW4gYmVsb3cpLgorCitOb3RlIHRoYXQgImdpdC1kaWZmLXRyZWUiIGNhbiB1c2UgdGhlIHRyZWUgZW5jYXBzdWxhdGVkIGluIGEgY29tbWl0IG9iamVjdC4KKworT1BUSU9OUworLS0tLS0tLQoraW5jbHVkZTo6ZGlmZi1vcHRpb25zLnR4dFtdCisKKzx0cmVlLWlzaD46OgorCVRoZSBpZCBvZiBhIHRyZWUgb2JqZWN0LgorCis8cGF0aD4uLi46OgorCUlmIHByb3ZpZGVkLCB0aGUgcmVzdWx0cyBhcmUgbGltaXRlZCB0byBhIHN1YnNldCBvZiBmaWxlcworCW1hdGNoaW5nIG9uZSBvZiB0aGVzZSBwcmVmaXggc3RyaW5ncy4KKwlpLmUuLCBmaWxlIG1hdGNoZXMgYC9ePHBhdHRlcm4xPnw8cGF0dGVybjI+fC4uLi9gCisJTm90ZSB0aGF0IHRoaXMgcGFyYW1ldGVyIGRvZXMgbm90IHByb3ZpZGUgYW55IHdpbGRjYXJkIG9yIHJlZ2V4cAorCWZlYXR1cmVzLgorCistcjo6CisgICAgICAgIHJlY3Vyc2UgaW50byBzdWItdHJlZXMKKworLXQ6OgorCXNob3cgdHJlZSBlbnRyeSBpdHNlbGYgYXMgd2VsbCBhcyBzdWJ0cmVlcy4gIEltcGxpZXMgLXIuCisKKy0tcm9vdDo6CisJV2hlbiAnLS1yb290JyBpcyBzcGVjaWZpZWQgdGhlIGluaXRpYWwgY29tbWl0IHdpbGwgYmUgc2hvd2VkIGFzIGEgYmlnCisJY3JlYXRpb24gZXZlbnQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGRpZmYgYWdhaW5zdCB0aGUgTlVMTCB0cmVlLgorCistLXN0ZGluOjoKKwlXaGVuICctLXN0ZGluJyBpcyBzcGVjaWZpZWQsIHRoZSBjb21tYW5kIGRvZXMgbm90IHRha2UKKwk8dHJlZS1pc2g+IGFyZ3VtZW50cyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICBJbnN0ZWFkLCBpdAorCXJlYWRzIGVpdGhlciBvbmUgPGNvbW1pdD4gb3IgYSBwYWlyIG9mIDx0cmVlLWlzaD4KKwlzZXBhcmF0ZWQgd2l0aCBhIHNpbmdsZSBzcGFjZSBmcm9tIGl0cyBzdGFuZGFyZCBpbnB1dC4KKysKK1doZW4gYSBzaW5nbGUgY29tbWl0IGlzIGdpdmVuIG9uIG9uZSBsaW5lIG9mIHN1Y2ggaW5wdXQsIGl0IGNvbXBhcmVzCit0aGUgY29tbWl0IHdpdGggaXRzIHBhcmVudHMuICBUaGUgZm9sbG93aW5nIGZsYWdzIGZ1cnRoZXIgYWZmZWN0cyBpdHMKK2JlaGF2aW9yLiAgVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgY2FzZSB3aGVyZSB0d28gPHRyZWUtaXNoPgorc2VwYXJhdGVkIHdpdGggYSBzaW5nbGUgc3BhY2UgYXJlIGdpdmVuLgorCistbTo6CisJQnkgZGVmYXVsdCwgImdpdC1kaWZmLXRyZWUgLS1zdGRpbiIgZG9lcyBub3Qgc2hvdworCWRpZmZlcmVuY2VzIGZvciBtZXJnZSBjb21taXRzLiAgV2l0aCB0aGlzIGZsYWcsIGl0IHNob3dzCisJZGlmZmVyZW5jZXMgdG8gdGhhdCBjb21taXQgZnJvbSBhbGwgb2YgaXRzIHBhcmVudHMuIFNlZQorCWFsc28gJy1jJy4KKworLXM6OgorCUJ5IGRlZmF1bHQsICJnaXQtZGlmZi10cmVlIC0tc3RkaW4iIHNob3dzIGRpZmZlcmVuY2VzLAorCWVpdGhlciBpbiBtYWNoaW5lLXJlYWRhYmxlIGZvcm0gKHdpdGhvdXQgJy1wJykgb3IgaW4gcGF0Y2gKKwlmb3JtICh3aXRoICctcCcpLiAgVGhpcyBvdXRwdXQgY2FuIGJlIHN1cHByZXNzZWQuICBJdCBpcworCW9ubHkgdXNlZnVsIHdpdGggJy12JyBmbGFnLgorCistdjo6CisJVGhpcyBmbGFnIGNhdXNlcyAiZ2l0LWRpZmYtdHJlZSAtLXN0ZGluIiB0byBhbHNvIHNob3cKKwl0aGUgY29tbWl0IG1lc3NhZ2UgYmVmb3JlIHRoZSBkaWZmZXJlbmNlcy4KKworLS1wcmV0dHlbPShyYXd8bWVkaXVtfHNob3J0KV06OgorCVRoaXMgaXMgdXNlZCB0byBjb250cm9sICJwcmV0dHkgcHJpbnRpbmciIGZvcm1hdCBvZiB0aGUKKwljb21taXQgbWVzc2FnZS4gIFdpdGhvdXQgIj08c3R5bGU+IiwgaXQgZGVmYXVsdHMgdG8KKwltZWRpdW0uCisKKy0tbm8tY29tbWl0LWlkOjoKKwlnaXQtZGlmZi10cmVlIG91dHB1dHMgYSBsaW5lIHdpdGggdGhlIGNvbW1pdCBJRCB3aGVuCisJYXBwbGljYWJsZS4gIFRoaXMgZmxhZyBzdXBwcmVzc2VkIHRoZSBjb21taXQgSUQgb3V0cHV0LgorCistYzo6CisJVGhpcyBmbGFnIGNoYW5nZXMgdGhlIHdheSBhIG1lcmdlIGNvbW1pdCBpcyBkaXNwbGF5ZWQKKwkod2hpY2ggbWVhbnMgaXQgaXMgdXNlZnVsIG9ubHkgd2hlbiB0aGUgY29tbWFuZCBpcyBnaXZlbgorCW9uZSA8dHJlZS1pc2g+LCBvciAnLS1zdGRpbicpLiAgSXQgc2hvd3MgdGhlIGRpZmZlcmVuY2VzCisJZnJvbSBlYWNoIG9mIHRoZSBwYXJlbnRzIHRvIHRoZSBtZXJnZSByZXN1bHQgc2ltdWx0YW5lb3VzbHkKKwlpbnN0ZWFkIG9mIHNob3dpbmcgcGFpcndpc2UgZGlmZiBiZXR3ZWVuIGEgcGFyZW50IGFuZCB0aGUKKwlyZXN1bHQgb25lIGF0IGEgdGltZSAod2hpY2ggaXMgd2hhdCB0aGUgJy1tJyBvcHRpb24gZG9lcykuCisJRnVydGhlcm1vcmUsIGl0IGxpc3RzIG9ubHkgZmlsZXMgd2hpY2ggd2VyZSBtb2RpZmllZAorCWZyb20gYWxsIHBhcmVudHMuCisKKy0tY2M6OgorCVRoaXMgZmxhZyBjaGFuZ2VzIHRoZSB3YXkgYSBtZXJnZSBjb21taXQgcGF0Y2ggaXMgZGlzcGxheWVkLAorCWluIGEgc2ltaWxhciB3YXkgdG8gdGhlICctYycgb3B0aW9uLiBJdCBpbXBsaWVzIHRoZSAnLWMnCisJYW5kICctcCcgb3B0aW9ucyBhbmQgZnVydGhlciBjb21wcmVzc2VzIHRoZSBwYXRjaCBvdXRwdXQKKwlieSBvbWl0dGluZyBodW5rcyB0aGF0IHNob3cgZGlmZmVyZW5jZXMgZnJvbSBvbmx5IG9uZQorCXBhcmVudCwgb3Igc2hvdyB0aGUgc2FtZSBjaGFuZ2UgZnJvbSBhbGwgYnV0IG9uZSBwYXJlbnQKKwlmb3IgYW4gT2N0b3B1cyBtZXJnZS4gIFdoZW4gdGhpcyBvcHRpbWl6YXRpb24gbWFrZXMgYWxsCisJaHVua3MgZGlzYXBwZWFyLCB0aGUgY29tbWl0IGl0c2VsZiBhbmQgdGhlIGNvbW1pdCBsb2cKKwltZXNzYWdlIGlzIG5vdCBzaG93biwganVzdCBsaWtlIGluIGFueSBvdGhlciAiZW1wdHkgZGlmZiIgY2FzZS4KKworLS1hbHdheXM6OgorCVNob3cgdGhlIGNvbW1pdCBpdHNlbGYgYW5kIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgZXZlbgorCWlmIHRoZSBkaWZmIGl0c2VsZiBpcyBlbXB0eS4KKworCitMaW1pdGluZyBPdXRwdXQKKy0tLS0tLS0tLS0tLS0tLQorSWYgeW91J3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBkaWZmZXJlbmNlcyBpbiBhIHN1YnNldCBvZiBmaWxlcywgZm9yCitleGFtcGxlIHNvbWUgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzLCB5b3UgbWlnaHQgZG86CisKKwlnaXQtZGlmZi10cmVlIC1yIDx0cmVlLWlzaD4gPHRyZWUtaXNoPiBhcmNoL2lhNjQgaW5jbHVkZS9hc20taWE2NAorCithbmQgaXQgd2lsbCBvbmx5IHNob3cgeW91IHdoYXQgY2hhbmdlZCBpbiB0aG9zZSB0d28gZGlyZWN0b3JpZXMuCisKK09yIGlmIHlvdSBhcmUgc2VhcmNoaW5nIGZvciB3aGF0IGNoYW5nZWQgaW4ganVzdCBga2VybmVsL3NjaGVkLmNgLCBqdXN0IGRvCisKKwlnaXQtZGlmZi10cmVlIC1yIDx0cmVlLWlzaD4gPHRyZWUtaXNoPiBrZXJuZWwvc2NoZWQuYworCithbmQgaXQgd2lsbCBpZ25vcmUgYWxsIGRpZmZlcmVuY2VzIHRvIG90aGVyIGZpbGVzLgorCitUaGUgcGF0dGVybiBpcyBhbHdheXMgdGhlIHByZWZpeCwgYW5kIGlzIG1hdGNoZWQgZXhhY3RseS4gIFRoZXJlIGFyZSBubword2lsZGNhcmRzLiAgRXZlbiBzdHJpY3RlciwgaXQgaGFzIHRvIG1hdGNoIGEgY29tcGxldGUgcGF0aCBjb21wb25lbnQuCitJLmUuICJmb28iIGRvZXMgbm90IHBpY2sgdXAgYGZvb2Jhci5oYC4gICJmb28iIGRvZXMgbWF0Y2ggYGZvby9iYXIuaGAKK3NvIGl0IGNhbiBiZSB1c2VkIHRvIG5hbWUgc3ViZGlyZWN0b3JpZXMuCisKK0FuIGV4YW1wbGUgb2Ygbm9ybWFsIHVzYWdlIGlzOgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L2dpdD4gZ2l0LWRpZmYtdHJlZSA1MzE5ZTQuLi4uLi4KKyAgKjEwMDY2NC0+MTAwNjY0IGJsb2IgICAgYWMzNDhiLi4uLi4uLi0+YTAxNTEzLi4uLi4uLiAgICAgIGdpdC1mc2NrLW9iamVjdHMuYworCit3aGljaCB0ZWxscyB5b3UgdGhhdCB0aGUgbGFzdCBjb21taXQgY2hhbmdlZCBqdXN0IG9uZSBmaWxlIChpdCdzIGZyb20KK3RoaXMgb25lOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY29tbWl0IDNjNmY3Y2ExOWFkNDA0M2U5ZTcyZmE5NDEwNmYzNTI4OTdlNjUxYTgKK3RyZWUgNTMxOWU0ZDYwOWNkZDI4MjA2OWNjNGRjZTMzYzFkYjU1OTUzOWIwMworcGFyZW50IGI0ZTYyOGVhMzBkNWFiMzYwNjExOWQyZWE1Y2FlYWIxNDFkMzhkZjcKK2F1dGhvciBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAcHBjOTcwLm9zZGwub3JnPiBTYXQgQXByIDkgMTI6MDI6MzAgMjAwNQorY29tbWl0dGVyIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0BwcGM5NzAub3NkbC5vcmc+IFNhdCBBcHIgOSAxMjowMjozMCAyMDA1CisKK01ha2UgImdpdC1mc2NrLW9iamVjdHMiIHByaW50IG91dCBhbGwgdGhlIHJvb3QgY29tbWl0cyBpdCBmaW5kcy4KKworT25jZSBJIGRvIHRoZSByZWZlcmVuY2UgdHJhY2tpbmcsIEknbGwgYWxzbyBtYWtlIGl0IHByaW50IG91dCBhbGwgdGhlCitIRUFEIGNvbW1pdHMgaXQgZmluZHMsIHdoaWNoIGlzIGV2ZW4gbW9yZSBpbnRlcmVzdGluZy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2luIGNhc2UgeW91IGNhcmUpLgorCitPdXRwdXQgZm9ybWF0CistLS0tLS0tLS0tLS0tCitpbmNsdWRlOjpkaWZmLWZvcm1hdC50eHRbXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWRpZmYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOGM0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1kaWZmLnR4dApAQCAtMCwwICsxLDExNiBAQAorZ2l0LWRpZmYoMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1kaWZmIC0gU2hvdyBjaGFuZ2VzIGJldHdlZW4gY29tbWl0cywgY29tbWl0IGFuZCB3b3JraW5nIHRyZWUsIGV0YworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1kaWZmJyBbIC0tZGlmZi1vcHRpb25zIF0gPHRyZWUtaXNoPnswLDJ9IFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2hvdyBjaGFuZ2VzIGJldHdlZW4gdHdvIHRyZWVzLCBhIHRyZWUgYW5kIHRoZSB3b3JraW5nIHRyZWUsIGEKK3RyZWUgYW5kIHRoZSBpbmRleCBmaWxlLCBvciB0aGUgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgdHJlZS4KK1RoZSBjb21iaW5hdGlvbiBvZiB3aGF0IGlzIGNvbXBhcmVkIHdpdGggd2hhdCBpcyBkZXRlcm1pbmVkIGJ5Cit0aGUgbnVtYmVyIG9mIHRyZWVzIGdpdmVuIHRvIHRoZSBjb21tYW5kLgorCisqIFdoZW4gbm8gPHRyZWUtaXNoPiBpcyBnaXZlbiwgdGhlIHdvcmtpbmcgdHJlZSBhbmQgdGhlIGluZGV4CisgIGZpbGUgYXJlIGNvbXBhcmVkLCB1c2luZyBgZ2l0LWRpZmYtZmlsZXNgLgorCisqIFdoZW4gb25lIDx0cmVlLWlzaD4gaXMgZ2l2ZW4sIHRoZSB3b3JraW5nIHRyZWUgYW5kIHRoZSBuYW1lZAorICB0cmVlIGFyZSBjb21wYXJlZCwgdXNpbmcgYGdpdC1kaWZmLWluZGV4YC4gIFRoZSBvcHRpb24KKyAgYC0tY2FjaGVkYCBjYW4gYmUgZ2l2ZW4gdG8gY29tcGFyZSB0aGUgaW5kZXggZmlsZSBhbmQKKyAgdGhlIG5hbWVkIHRyZWUuCisKKyogV2hlbiB0d28gPHRyZWUtaXNoPnMgYXJlIGdpdmVuLCB0aGVzZSB0d28gdHJlZXMgYXJlIGNvbXBhcmVkCisgIHVzaW5nIGBnaXQtZGlmZi10cmVlYC4KKworT1BUSU9OUworLS0tLS0tLQorLS1kaWZmLW9wdGlvbnM6OgorCSctLWRpZmYtb3B0aW9ucycgYXJlIHBhc3NlZCB0byB0aGUgYGdpdC1kaWZmLWZpbGVzYCwKKwlgZ2l0LWRpZmYtaW5kZXhgLCBhbmQgYGdpdC1kaWZmLXRyZWVgIGNvbW1hbmRzLiAgU2VlIHRoZQorCWRvY3VtZW50YXRpb24gZm9yIHRoZXNlIGNvbW1hbmRzIGZvciBkZXNjcmlwdGlvbi4KKworPHBhdGg+Li4uOjoKKwlUaGUgPHBhdGg+IGFyZ3VtZW50cyBhcmUgYWxzbyBwYXNzZWQgdG8gYGdpdC1kaWZmLVwqYAorCWNvbW1hbmRzLgorCisKK0VYQU1QTEVTCistLS0tLS0tLQorCitWYXJpb3VzIHdheXMgdG8gY2hlY2sgeW91ciB3b3JraW5nIHRyZWU6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmICAgICAgICAgICAgPDE+CiskIGdpdCBkaWZmIC0tY2FjaGVkICAgPDI+CiskIGdpdCBkaWZmIEhFQUQgICAgICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUgc2luY2UgeW91ciBsYXN0IGdpdC11cGRhdGUtaW5kZXguCis8Mj4gY2hhbmdlcyBiZXR3ZWVuIHRoZSBpbmRleCBhbmQgeW91ciBsYXN0IGNvbW1pdDsgd2hhdCB5b3UKK3dvdWxkIGJlIGNvbW1pdHRpbmcgaWYgeW91IHJ1biAiZ2l0IGNvbW1pdCIgd2l0aG91dCAiLWEiIG9wdGlvbi4KKzwzPiBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUgc2luY2UgeW91ciBsYXN0IGNvbW1pdDsgd2hhdCB5b3UKK3dvdWxkIGJlIGNvbW1pdHRpbmcgaWYgeW91IHJ1biAiZ2l0IGNvbW1pdCAtYSIKKworQ29tcGFyaW5nIHdpdGggYXJiaXRyYXJ5IGNvbW1pdHM6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHRlc3QgICAgICAgICAgICA8MT4KKyQgZ2l0IGRpZmYgSEVBRCAtLSAuL3Rlc3QgIDwyPgorJCBnaXQgZGlmZiBIRUFEXiBIRUFEICAgICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBpbnN0ZWFkIG9mIHVzaW5nIHRoZSB0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoLCBjb21wYXJlIHdpdGggdGhlCit0aXAgb2YgInRlc3QiIGJyYW5jaC4KKzwyPiBpbnN0ZWFkIG9mIGNvbXBhcmluZyB3aXRoIHRoZSB0aXAgb2YgInRlc3QiIGJyYW5jaCwgY29tcGFyZSB3aXRoCit0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaCwgYnV0IGxpbWl0IHRoZSBjb21wYXJpc29uIHRvIHRoZQorZmlsZSAidGVzdCIuCis8Mz4gY29tcGFyZSB0aGUgdmVyc2lvbiBiZWZvcmUgdGhlIGxhc3QgY29tbWl0IGFuZCB0aGUgbGFzdCBjb21taXQuCisKKworTGltaXRpbmcgdGhlIGRpZmYgb3V0cHV0OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiAtLWRpZmYtZmlsdGVyPU1SQyAgICAgICAgICAgIDwxPgorJCBnaXQgZGlmZiAtLW5hbWUtc3RhdHVzIC1yICAgICAgICAgICAgIDwyPgorJCBnaXQgZGlmZiBhcmNoL2kzODYgaW5jbHVkZS9hc20taTM4NiAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gc2hvdyBvbmx5IG1vZGlmaWNhdGlvbiwgcmVuYW1lIGFuZCBjb3B5LCBidXQgbm90IGFkZGl0aW9uCitub3IgZGVsZXRpb24uCis8Mj4gc2hvdyBvbmx5IG5hbWVzIGFuZCB0aGUgbmF0dXJlIG9mIGNoYW5nZSwgYnV0IG5vdCBhY3R1YWwKK2RpZmYgb3V0cHV0LiAgLS1uYW1lLXN0YXR1cyBkaXNhYmxlcyB1c3VhbCBwYXRjaCBnZW5lcmF0aW9uCit3aGljaCBpbiB0dXJuIGFsc28gZGlzYWJsZXMgcmVjdXJzaXZlIGJlaGF2aW9yLCBzbyB3aXRob3V0IC1yCit5b3Ugd291bGQgb25seSBzZWUgdGhlIGRpcmVjdG9yeSBuYW1lIGlmIHRoZXJlIGlzIGEgY2hhbmdlIGluIGEKK2ZpbGUgaW4gYSBzdWJkaXJlY3RvcnkuCis8Mz4gbGltaXQgZGlmZiBvdXRwdXQgdG8gbmFtZWQgc3VidHJlZXMuCisKK011bmdpbmcgdGhlIGRpZmYgb3V0cHV0OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZiAtLWZpbmQtY29waWVzLWhhcmRlciAtQiAtQyAgPDE+CiskIGdpdCBkaWZmIC1SICAgICAgICAgICAgICAgICAgICAgICAgICA8Mj4KKy0tLS0tLS0tLS0tLQorKworPDE+IHNwZW5kIGV4dHJhIGN5Y2xlcyB0byBmaW5kIHJlbmFtZXMsIGNvcGllcyBhbmQgY29tcGxldGUKK3Jld3JpdGVzICh2ZXJ5IGV4cGVuc2l2ZSkuCis8Mj4gb3V0cHV0IGRpZmYgaW4gcmV2ZXJzZS4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gtcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY5YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtZmV0Y2gtcGFjay50eHQKQEAgLTAsMCArMSw3MyBAQAorZ2l0LWZldGNoLXBhY2soMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mZXRjaC1wYWNrIC0gUmVjZWl2ZSBtaXNzaW5nIG9iamVjdHMgZnJvbSBhbm90aGVyIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZmV0Y2gtcGFjaycgWy1xXSBbLWtdIFstLWV4ZWM9PGdpdC11cGxvYWQtcGFjaz5dIFs8aG9zdD46XTxkaXJlY3Rvcnk+IFs8cmVmcz4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW52b2tlcyAnZ2l0LXVwbG9hZC1wYWNrJyBvbiBhIHBvdGVudGlhbGx5IHJlbW90ZSByZXBvc2l0b3J5LAorYW5kIGFza3MgaXQgdG8gc2VuZCBvYmplY3RzIG1pc3NpbmcgZnJvbSB0aGlzIHJlcG9zaXRvcnksIHRvCit1cGRhdGUgdGhlIG5hbWVkIGhlYWRzLiAgVGhlIGxpc3Qgb2YgY29tbWl0cyBhdmFpbGFibGUgbG9jYWxseQoraXMgZm91bmQgb3V0IGJ5IHNjYW5uaW5nIGxvY2FsICRHSVRfRElSL3JlZnMvIGFuZCBzZW50IHRvCisnZ2l0LXVwbG9hZC1wYWNrJyBydW5uaW5nIG9uIHRoZSBvdGhlciBlbmQuCisKK1RoaXMgY29tbWFuZCBkZWdlbmVyYXRlcyB0byBkb3dubG9hZCBldmVyeXRoaW5nIHRvIGNvbXBsZXRlIHRoZQorYXNrZWQgcmVmcyBmcm9tIHRoZSByZW1vdGUgc2lkZSB3aGVuIHRoZSBsb2NhbCBzaWRlIGRvZXMgbm90CitoYXZlIGEgY29tbW9uIGFuY2VzdG9yIGNvbW1pdC4KKworCitPUFRJT05TCistLS0tLS0tCistcTo6CisJUGFzcyAnLXEnIGZsYWcgdG8gJ2dpdC11bnBhY2stb2JqZWN0cyc7IHRoaXMgbWFrZXMgdGhlCisJY2xvbmluZyBwcm9jZXNzIGxlc3MgdmVyYm9zZS4KKworLWs6OgorCURvIG5vdCBpbnZva2UgJ2dpdC11bnBhY2stb2JqZWN0cycgb24gcmVjZWl2ZWQgZGF0YSwgYnV0CisJY3JlYXRlIGEgc2luZ2xlIHBhY2tmaWxlIG91dCBvZiBpdCBpbnN0ZWFkLCBhbmQgc3RvcmUgaXQKKwlpbiB0aGUgb2JqZWN0IGRhdGFiYXNlLgorCistLWV4ZWM9PGdpdC11cGxvYWQtcGFjaz46OgorCVVzZSB0aGlzIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gJ2dpdC11cGxvYWQtcGFjaycgb24gdGhlCisJcmVtb3RlIHNpZGUsIGlmIGlzIG5vdCBmb3VuZCBvbiB5b3VyICRQQVRILgorCUluc3RhbGxhdGlvbnMgb2Ygc3NoZCBpZ25vcmVzIHRoZSB1c2VyJ3MgZW52aXJvbm1lbnQKKwlzZXR1cCBzY3JpcHRzIGZvciBsb2dpbiBzaGVsbHMgKGUuZy4gLmJhc2hfcHJvZmlsZSkgYW5kCisJeW91ciBwcml2YXRlbHkgaW5zdGFsbGVkIGdpdCBtYXkgbm90IGJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0KKwlkZWZhdWx0ICRQQVRILiAgQW5vdGhlciB3b3JrYXJvdW5kIHN1Z2dlc3RlZCBpcyB0byBzZXQKKwl1cCB5b3VyICRQQVRIIGluICIuYmFzaHJjIiwgYnV0IHRoaXMgZmxhZyBpcyBmb3IgcGVvcGxlCisJd2hvIGRvIG5vdCB3YW50IHRvIHBheSB0aGUgb3ZlcmhlYWQgZm9yIG5vbi1pbnRlcmFjdGl2ZQorCXNoZWxscyBieSBoYXZpbmcgYSBsZWFuIC5iYXNocmMgZmlsZSAodGhleSBzZXQgbW9zdCBvZgorCXRoZSB0aGluZ3MgdXAgaW4gLmJhc2hfcHJvZmlsZSkuCisKKzxob3N0Pjo6CisJQSByZW1vdGUgaG9zdCB0aGF0IGhvdXNlcyB0aGUgcmVwb3NpdG9yeS4gIFdoZW4gdGhpcworCXBhcnQgaXMgc3BlY2lmaWVkLCAnZ2l0LXVwbG9hZC1wYWNrJyBpcyBpbnZva2VkIHZpYQorCXNzaC4KKworPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIHN5bmMgZnJvbS4KKworPHJlZnM+Li4uOjoKKwlUaGUgcmVtb3RlIGhlYWRzIHRvIHVwZGF0ZSBmcm9tLiBUaGlzIGlzIHJlbGF0aXZlIHRvCisJJEdJVF9ESVIgKGUuZy4gIkhFQUQiLCAicmVmcy9oZWFkcy9tYXN0ZXIiKS4gIFdoZW4KKwl1bnNwZWNpZmllZCwgdXBkYXRlIGZyb20gYWxsIGhlYWRzIHRoZSByZW1vdGUgc2lkZSBoYXMuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mZXRjaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTllODZmZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZldGNoLnR4dApAQCAtMCwwICsxLDQ4IEBACitnaXQtZmV0Y2goMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZmV0Y2ggLSBEb3dubG9hZCBvYmplY3RzIGFuZCBhIGhlYWQgZnJvbSBhbm90aGVyIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtZmV0Y2gnIDxvcHRpb25zPiA8cmVwb3NpdG9yeT4gPHJlZnNwZWM+Li4uCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitGZXRjaGVzIG5hbWVkIGhlYWRzIG9yIHRhZ3MgZnJvbSBhbm90aGVyIHJlcG9zaXRvcnksIGFsb25nIHdpdGgKK3RoZSBvYmplY3RzIG5lY2Vzc2FyeSB0byBjb21wbGV0ZSB0aGVtLgorCitUaGUgcmVmIG5hbWVzIGFuZCB0aGVpciBvYmplY3QgbmFtZXMgb2YgZmV0Y2hlZCByZWZzIGFyZSBzdG9yZWQKK2luIGAuZ2l0L0ZFVENIX0hFQURgLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBsZWZ0IGZvciBhIGxhdGVyIG1lcmdlCitvcGVyYXRpb24gZG9uZSBieSAiZ2l0IG1lcmdlIi4KKworCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjpmZXRjaC1vcHRpb25zLnR4dFtdCisKK2luY2x1ZGU6OnB1bGwtZmV0Y2gtcGFyYW0udHh0W10KKworaW5jbHVkZTo6dXJscy50eHRbXQorCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXB1bGxbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZtdC1tZXJnZS1tc2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZm10LW1lcmdlLW1zZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwZWIzOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWZtdC1tZXJnZS1tc2cudHh0CkBAIC0wLDAgKzEsMzkgQEAKK2dpdC1mbXQtbWVyZ2UtbXNnKDEpCis9PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtZm10LW1lcmdlLW1zZyAtIFByb2R1Y2UgYSBtZXJnZSBjb21taXQgbWVzc2FnZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1mbXQtbWVyZ2UtbXNnJyA8JEdJVF9ESVIvRkVUQ0hfSEVBRAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Rha2VzIHRoZSBsaXN0IG9mIG1lcmdlZCBvYmplY3RzIG9uIHN0ZGluIGFuZCBwcm9kdWNlcyBhIHN1aXRhYmxlCitjb21taXQgbWVzc2FnZSB0byBiZSB1c2VkIGZvciB0aGUgbWVyZ2UgY29tbWl0LCB1c3VhbGx5IHRvIGJlCitwYXNzZWQgYXMgdGhlICc8bWVyZ2UtbWVzc2FnZT4nIGFyZ3VtZW50IG9mIGBnaXQtbWVyZ2VgLgorCitUaGlzIHNjcmlwdCBpcyBpbnRlbmRlZCBtb3N0bHkgZm9yIGludGVybmFsIHVzZSBieSBzY3JpcHRzCithdXRvbWF0aWNhbGx5IGludm9raW5nIGBnaXQtbWVyZ2VgLgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtbWVyZ2VbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFBldHIgQmF1ZGlzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZvcm1hdC1wYXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mb3JtYXQtcGF0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NDI1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mb3JtYXQtcGF0Y2gudHh0CkBAIC0wLDAgKzEsMTI5IEBACitnaXQtZm9ybWF0LXBhdGNoKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mb3JtYXQtcGF0Y2ggLSBQcmVwYXJlIHBhdGNoZXMgZm9yIGUtbWFpbCBzdWJtaXNzaW9uCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWZvcm1hdC1wYXRjaCcgWy1uIHwgLWtdIFstbyA8ZGlyPiB8IC0tc3Rkb3V0XSBbLS1hdHRhY2hdIFstLXRocmVhZF0KKwkgICAgICAgICAgIFstcyB8IC0tc2lnbm9mZl0gWy0tZGlmZi1vcHRpb25zXSBbLS1zdGFydC1udW1iZXIgPG4+XQorCQkgICBbLS1pbi1yZXBseS10bz1NZXNzYWdlLUlkXQorCQkgICA8c2luY2U+Wy4uPHVudGlsPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1ByZXBhcmUgZWFjaCBjb21taXQgYmV0d2VlbiA8c2luY2U+IGFuZCA8dW50aWw+IHdpdGggaXRzIHBhdGNoIGluCitvbmUgZmlsZSBwZXIgY29tbWl0LCBmb3JtYXR0ZWQgdG8gcmVzZW1ibGUgVU5JWCBtYWlsYm94IGZvcm1hdC4KK0lmIC4uPHVudGlsPiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCB3b3JraW5nCit0cmVlIGlzIGltcGxpZWQuCisKK1RoZSBvdXRwdXQgb2YgdGhpcyBjb21tYW5kIGlzIGNvbnZlbmllbnQgZm9yIGUtbWFpbCBzdWJtaXNzaW9uIG9yCitmb3IgdXNlIHdpdGggZ2l0bGluazpnaXQtYW1bMV0uCisKK0VhY2ggb3V0cHV0IGZpbGUgaXMgbnVtYmVyZWQgc2VxdWVudGlhbGx5IGZyb20gMSwgYW5kIHVzZXMgdGhlCitmaXJzdCBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSAobWFzc2FnZWQgZm9yIHBhdGhuYW1lIHNhZmV0eSkgYXMKK3RoZSBmaWxlbmFtZS4gVGhlIG5hbWVzIG9mIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHByaW50ZWQgdG8gc3RhbmRhcmQKK291dHB1dCwgdW5sZXNzIHRoZSAtLXN0ZG91dCBvcHRpb24gaXMgc3BlY2lmaWVkLgorCitJZiAtbyBpcyBzcGVjaWZpZWQsIG91dHB1dCBmaWxlcyBhcmUgY3JlYXRlZCBpbiA8ZGlyPi4gIE90aGVyd2lzZQordGhleSBhcmUgY3JlYXRlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKworSWYgLW4gaXMgc3BlY2lmaWVkLCBpbnN0ZWFkIG9mICJbUEFUQ0hdIFN1YmplY3QiLCB0aGUgZmlyc3QgbGluZQoraXMgZm9ybWF0dGVkIGFzICJbUEFUQ0ggbi9tXSBTdWJqZWN0Ii4KKworSWYgZ2l2ZW4gLS10aHJlYWQsIGdpdC1mb3JtYXQtcGF0Y2ggd2lsbCBnZW5lcmF0ZSBJbi1SZXBseS1UbyBhbmQKK1JlZmVyZW5jZXMgaGVhZGVycyB0byBtYWtlIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgcGF0Y2ggbWFpbHMgYXBwZWFyCithcyByZXBsaWVzIHRvIHRoZSBmaXJzdCBtYWlsOyB0aGlzIGFsc28gZ2VuZXJhdGVzIGEgTWVzc2FnZS1JZCBoZWFkZXIgdG8KK3JlZmVyZW5jZS4KKworT1BUSU9OUworLS0tLS0tLQorLW98LS1vdXRwdXQtZGlyZWN0b3J5IDxkaXI+OjoKKwlVc2UgPGRpcj4gdG8gc3RvcmUgdGhlIHJlc3VsdGluZyBmaWxlcywgaW5zdGVhZCBvZiB0aGUKKwljdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorCistbnwtLW51bWJlcmVkOjoKKwlOYW1lIG91dHB1dCBpbiAnW1BBVENIIG4vbV0nIGZvcm1hdC4KKworLS1zdGFydC1udW1iZXIgPG4+OjoKKwlTdGFydCBudW1iZXJpbmcgdGhlIHBhdGNoZXMgYXQgPG4+IGluc3RlYWQgb2YgMS4KKworLWt8LS1rZWVwLXN1YmplY3Q6OgorCURvIG5vdCBzdHJpcC9hZGQgJ1tQQVRDSF0nIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisJY29tbWl0IGxvZyBtZXNzYWdlLgorCistc3wtLXNpZ25vZmY6OgorCUFkZCBgU2lnbmVkLW9mZi1ieTpgIGxpbmUgdG8gdGhlIGNvbW1pdCBtZXNzYWdlLCB1c2luZworCXRoZSBjb21taXR0ZXIgaWRlbnRpdHkgb2YgeW91cnNlbGYuCisKKy0tc3Rkb3V0OjoKKwlQcmludCBhbGwgY29tbWl0cyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGluIG1ib3ggZm9ybWF0LAorCWluc3RlYWQgb2YgY3JlYXRpbmcgYSBmaWxlIGZvciBlYWNoIG9uZS4KKworLS1hdHRhY2g6OgorCUNyZWF0ZSBhdHRhY2htZW50cyBpbnN0ZWFkIG9mIGlubGluaW5nIHBhdGNoZXMuCisKKy0tdGhyZWFkOjoKKwlBZGQgSW4tUmVwbHktVG8gYW5kIFJlZmVyZW5jZXMgaGVhZGVycyB0byBtYWtlIHRoZSBzZWNvbmQgYW5kCisJc3Vic2VxdWVudCBtYWlscyBhcHBlYXIgYXMgcmVwbGllcyB0byB0aGUgZmlyc3QuICBBbHNvIGdlbmVyYXRlcworCXRoZSBNZXNzYWdlLUlkIGhlYWRlciB0byByZWZlcmVuY2UuCisKKy0taW4tcmVwbHktdG89TWVzc2FnZS1JZDo6CisJTWFrZSB0aGUgZmlyc3QgbWFpbCAob3IgYWxsIHRoZSBtYWlscyB3aXRoIC0tbm8tdGhyZWFkKSBhcHBlYXIgYXMgYQorCXJlcGx5IHRvIHRoZSBnaXZlbiBNZXNzYWdlLUlkLCB3aGljaCBhdm9pZHMgYnJlYWtpbmcgdGhyZWFkcyB0bworCXByb3ZpZGUgYSBuZXcgcGF0Y2ggc2VyaWVzLgorCitDT05GSUdVUkFUSU9OCistLS0tLS0tLS0tLS0tCitZb3UgY2FuIHNwZWNpZnkgZXh0cmEgbWFpbCBoZWFkZXIgbGluZXMgdG8gYmUgYWRkZWQgdG8gZWFjaAorbWVzc2FnZSBpbiB0aGUgcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIGFzIGZvbGxvd3M6CisKK1tmb3JtYXRdCisgICAgICAgIGhlYWRlcnMgPSAiT3JnYW5pemF0aW9uOiBnaXQtZm9vXG4iCisKKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK2dpdC1mb3JtYXQtcGF0Y2ggLWsgLS1zdGRvdXQgUjEuLlIyIHwgZ2l0LWFtIC0zIC1rOjoKKwlFeHRyYWN0IGNvbW1pdHMgYmV0d2VlbiByZXZpc2lvbnMgUjEgYW5kIFIyLCBhbmQgYXBwbHkKKwl0aGVtIG9uIHRvcCBvZiB0aGUgY3VycmVudCBicmFuY2ggdXNpbmcgYGdpdC1hbWAgdG8KKwljaGVycnktcGljayB0aGVtLgorCitnaXQtZm9ybWF0LXBhdGNoIG9yaWdpbjo6CisJRXh0cmFjdCBhbGwgY29tbWl0cyB3aGljaCBhcmUgaW4gdGhlIGN1cnJlbnQgYnJhbmNoIGJ1dAorCW5vdCBpbiB0aGUgb3JpZ2luIGJyYW5jaC4gIEZvciBlYWNoIGNvbW1pdCBhIHNlcGFyYXRlIGZpbGUKKwlpcyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworZ2l0LWZvcm1hdC1wYXRjaCAtTSAtQiBvcmlnaW46OgorCVRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBvbmUuICBBZGRpdGlvbmFsbHksIGl0IGRldGVjdHMKKwlhbmQgaGFuZGxlcyByZW5hbWVzIGFuZCBjb21wbGV0ZSByZXdyaXRlcyBpbnRlbGxpZ2VudGx5IHRvCisJcHJvZHVjZSBhIHJlbmFtaW5nIHBhdGNoLiAgQSByZW5hbWluZyBwYXRjaCByZWR1Y2VzIHRoZQorCWFtb3VudCBvZiB0ZXh0IG91dHB1dCwgYW5kIGdlbmVyYWxseSBtYWtlcyBpdCBlYXNpZXIgdG8KKwlyZXZpZXcgaXQuICBOb3RlIHRoYXQgdGhlICJwYXRjaCIgcHJvZ3JhbSBkb2VzIG5vdAorCXVuZGVyc3RhbmQgcmVuYW1pbmcgcGF0Y2hlcywgc28gdXNlIGl0IG9ubHkgd2hlbiB5b3Uga25vdworCXRoZSByZWNpcGllbnQgdXNlcyBnaXQgdG8gYXBwbHkgeW91ciBwYXRjaC4KKworCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWFtWzFdLCBnaXRsaW5rOmdpdC1zZW5kLWVtYWlsWzFdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWZzY2stb2JqZWN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLW9iamVjdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYWY5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1mc2NrLW9iamVjdHMudHh0CkBAIC0wLDAgKzEsMTM5IEBACitnaXQtZnNjay1vYmplY3RzKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1mc2NrLW9iamVjdHMgLSBWZXJpZmllcyB0aGUgY29ubmVjdGl2aXR5IGFuZCB2YWxpZGl0eSBvZiB0aGUgb2JqZWN0cyBpbiB0aGUgZGF0YWJhc2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtZnNjay1vYmplY3RzJyBbLS10YWdzXSBbLS1yb290XSBbLS11bnJlYWNoYWJsZV0gWy0tY2FjaGVdCisJCSBbLS1mdWxsXSBbLS1zdHJpY3RdIFs8b2JqZWN0PipdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVmVyaWZpZXMgdGhlIGNvbm5lY3Rpdml0eSBhbmQgdmFsaWRpdHkgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGRhdGFiYXNlLgorCitPUFRJT05TCistLS0tLS0tCis8b2JqZWN0Pjo6CisJQW4gb2JqZWN0IHRvIHRyZWF0IGFzIHRoZSBoZWFkIG9mIGFuIHVucmVhY2hhYmlsaXR5IHRyYWNlLgorKworSWYgbm8gb2JqZWN0cyBhcmUgZ2l2ZW4sIGdpdC1mc2NrLW9iamVjdHMgZGVmYXVsdHMgdG8gdXNpbmcgdGhlCitpbmRleCBmaWxlIGFuZCBhbGwgU0hBMSByZWZlcmVuY2VzIGluIC5naXQvcmVmcy8qIGFzIGhlYWRzLgorCistLXVucmVhY2hhYmxlOjoKKwlQcmludCBvdXQgb2JqZWN0cyB0aGF0IGV4aXN0IGJ1dCB0aGF0IGFyZW4ndCByZWFkYWJsZSBmcm9tIGFueQorCW9mIHRoZSByZWZlcmVuY2Ugbm9kZXMuCisKKy0tcm9vdDo6CisJUmVwb3J0IHJvb3Qgbm9kZXMuCisKKy0tdGFnczo6CisJUmVwb3J0IHRhZ3MuCisKKy0tY2FjaGU6OgorCUNvbnNpZGVyIGFueSBvYmplY3QgcmVjb3JkZWQgaW4gdGhlIGluZGV4IGFsc28gYXMgYSBoZWFkIG5vZGUgZm9yCisJYW4gdW5yZWFjaGFiaWxpdHkgdHJhY2UuCisKKy0tZnVsbDo6CisJQ2hlY2sgbm90IGp1c3Qgb2JqZWN0cyBpbiBHSVRfT0JKRUNUX0RJUkVDVE9SWQorCSgkR0lUX0RJUi9vYmplY3RzKSwgYnV0IGFsc28gdGhlIG9uZXMgZm91bmQgaW4gYWx0ZXJuYXRlCisJb2JqZWN0IHBvb2xzIGxpc3RlZCBpbiBHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUworCW9yICRHSVRfRElSL29iamVjdHMvaW5mby9hbHRlcm5hdGVzLAorCWFuZCBpbiBwYWNrZWQgZ2l0IGFyY2hpdmVzIGZvdW5kIGluICRHSVRfRElSL29iamVjdHMvcGFjaworCWFuZCBjb3JyZXNwb25kaW5nIHBhY2sgc3ViZGlyZWN0b3JpZXMgaW4gYWx0ZXJuYXRlCisJb2JqZWN0IHBvb2xzLgorCistLXN0cmljdDo6CisJRW5hYmxlIG1vcmUgc3RyaWN0IGNoZWNraW5nLCBuYW1lbHkgdG8gY2F0Y2ggYSBmaWxlIG1vZGUKKwlyZWNvcmRlZCB3aXRoIGcrdyBiaXQgc2V0LCB3aGljaCB3YXMgY3JlYXRlZCBieSBvbGRlcgorCXZlcnNpb25zIG9mIGdpdC4gIEV4aXN0aW5nIHJlcG9zaXRvcmllcywgaW5jbHVkaW5nIHRoZQorCUxpbnV4IGtlcm5lbCwgZ2l0IGl0c2VsZiwgYW5kIHNwYXJzZSByZXBvc2l0b3J5IGhhdmUgb2xkCisJb2JqZWN0cyB0aGF0IHRyaWdnZXJzIHRoaXMgY2hlY2ssIGJ1dCBpdCBpcyByZWNvbW1lbmRlZAorCXRvIGNoZWNrIG5ldyBwcm9qZWN0cyB3aXRoIHRoaXMgZmxhZy4KKworSXQgdGVzdHMgU0hBMSBhbmQgZ2VuZXJhbCBvYmplY3Qgc2FuaXR5LCBhbmQgaXQgZG9lcyBmdWxsIHRyYWNraW5nIG9mCit0aGUgcmVzdWx0aW5nIHJlYWNoYWJpbGl0eSBhbmQgZXZlcnl0aGluZyBlbHNlLiBJdCBwcmludHMgb3V0IGFueQorY29ycnVwdGlvbiBpdCBmaW5kcyAobWlzc2luZyBvciBiYWQgb2JqZWN0cyksIGFuZCBpZiB5b3UgdXNlIHRoZQorJy0tdW5yZWFjaGFibGUnIGZsYWcgaXQgd2lsbCBhbHNvIHByaW50IG91dCBvYmplY3RzIHRoYXQgZXhpc3QgYnV0Cit0aGF0IGFyZW4ndCByZWFkYWJsZSBmcm9tIGFueSBvZiB0aGUgc3BlY2lmaWVkIGhlYWQgbm9kZXMuCisKK1NvIGZvciBleGFtcGxlCisKKwlnaXQtZnNjay1vYmplY3RzIC0tdW5yZWFjaGFibGUgSEVBRCAkKGNhdCAuZ2l0L3JlZnMvaGVhZHMvKikKKword2lsbCBkbyBxdWl0ZSBhIF9sb3RfIG9mIHZlcmlmaWNhdGlvbiBvbiB0aGUgdHJlZS4gVGhlcmUgYXJlIGEgZmV3CitleHRyYSB2YWxpZGl0eSB0ZXN0cyB0byBiZSBhZGRlZCAobWFrZSBzdXJlIHRoYXQgdHJlZSBvYmplY3RzIGFyZQorc29ydGVkIHByb3Blcmx5IGV0YyksIGJ1dCBvbiB0aGUgd2hvbGUgaWYgImdpdC1mc2NrLW9iamVjdHMiIGlzIGhhcHB5LCB5b3UKK2RvIGhhdmUgYSB2YWxpZCB0cmVlLgorCitBbnkgY29ycnVwdCBvYmplY3RzIHlvdSB3aWxsIGhhdmUgdG8gZmluZCBpbiBiYWNrdXBzIG9yIG90aGVyIGFyY2hpdmVzCisoaS5lLiwgeW91IGNhbiBqdXN0IHJlbW92ZSB0aGVtIGFuZCBkbyBhbiAicnN5bmMiIHdpdGggc29tZSBvdGhlciBzaXRlIGluCit0aGUgaG9wZXMgdGhhdCBzb21lYm9keSBlbHNlIGhhcyB0aGUgb2JqZWN0IHlvdSBoYXZlIGNvcnJ1cHRlZCkuCisKK09mIGNvdXJzZSwgInZhbGlkIHRyZWUiIGRvZXNuJ3QgbWVhbiB0aGF0IGl0IHdhc24ndCBnZW5lcmF0ZWQgYnkgc29tZQorZXZpbCBwZXJzb24sIGFuZCB0aGUgZW5kIHJlc3VsdCBtaWdodCBiZSBjcmFwLiBnaXQgaXMgYSByZXZpc2lvbgordHJhY2tpbmcgc3lzdGVtLCBub3QgYSBxdWFsaXR5IGFzc3VyYW5jZSBzeXN0ZW0gOykKKworRXh0cmFjdGVkIERpYWdub3N0aWNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXhwZWN0IGRhbmdsaW5nIGNvbW1pdHMgLSBwb3RlbnRpYWwgaGVhZHMgLSBkdWUgdG8gbGFjayBvZiBoZWFkIGluZm9ybWF0aW9uOjoKKwlZb3UgaGF2ZW4ndCBzcGVjaWZpZWQgYW55IG5vZGVzIGFzIGhlYWRzIHNvIGl0IHdvbid0IGJlCisJcG9zc2libGUgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHVuLXBhcmVudGVkIGNvbW1pdHMgYW5kCisJcm9vdCBub2Rlcy4KKworbWlzc2luZyBzaGExIGRpcmVjdG9yeSAnPGRpcj4nOjoKKwlUaGUgZGlyZWN0b3J5IGhvbGRpbmcgdGhlIHNoYTEgb2JqZWN0cyBpcyBtaXNzaW5nLgorCit1bnJlYWNoYWJsZSA8dHlwZT4gPG9iamVjdD46OgorCVRoZSA8dHlwZT4gb2JqZWN0IDxvYmplY3Q+LCBpc24ndCBhY3R1YWxseSByZWZlcnJlZCB0byBkaXJlY3RseQorCW9yIGluZGlyZWN0bHkgaW4gYW55IG9mIHRoZSB0cmVlcyBvciBjb21taXRzIHNlZW4uIFRoaXMgY2FuCisJbWVhbiB0aGF0IHRoZXJlJ3MgYW5vdGhlciByb290IG5vZGUgdGhhdCB5b3UncmUgbm90IHNwZWNpZnlpbmcKKwlvciB0aGF0IHRoZSB0cmVlIGlzIGNvcnJ1cHQuIElmIHlvdSBoYXZlbid0IG1pc3NlZCBhIHJvb3Qgbm9kZQorCXRoZW4geW91IG1pZ2h0IGFzIHdlbGwgZGVsZXRlIHVucmVhY2hhYmxlIG5vZGVzIHNpbmNlIHRoZXkKKwljYW4ndCBiZSB1c2VkLgorCittaXNzaW5nIDx0eXBlPiA8b2JqZWN0Pjo6CisJVGhlIDx0eXBlPiBvYmplY3QgPG9iamVjdD4sIGlzIHJlZmVycmVkIHRvIGJ1dCBpc24ndCBwcmVzZW50IGluCisJdGhlIGRhdGFiYXNlLgorCitkYW5nbGluZyA8dHlwZT4gPG9iamVjdD46OgorCVRoZSA8dHlwZT4gb2JqZWN0IDxvYmplY3Q+LCBpcyBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSBidXQgbmV2ZXIKKwknZGlyZWN0bHknIHVzZWQuIEEgZGFuZ2xpbmcgY29tbWl0IGNvdWxkIGJlIGEgcm9vdCBub2RlLgorCit3YXJuaW5nOiBnaXQtZnNjay1vYmplY3RzOiB0cmVlIDx0cmVlPiBoYXMgZnVsbCBwYXRobmFtZXMgaW4gaXQ6OgorCUFuZCBpdCBzaG91bGRuJ3QuLi4KKworc2hhMSBtaXNtYXRjaCA8b2JqZWN0Pjo6CisJVGhlIGRhdGFiYXNlIGhhcyBhbiBvYmplY3Qgd2hvJ3Mgc2hhMSBkb2Vzbid0IG1hdGNoIHRoZQorCWRhdGFiYXNlIHZhbHVlLgorCVRoaXMgaW5kaWNhdGVzIGEgc2VyaW91cyBkYXRhIGludGVncml0eSBwcm9ibGVtLgorCitFbnZpcm9ubWVudCBWYXJpYWJsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHSVRfT0JKRUNUX0RJUkVDVE9SWTo6CisJdXNlZCB0byBzcGVjaWZ5IHRoZSBvYmplY3QgZGF0YWJhc2Ugcm9vdCAodXN1YWxseSAkR0lUX0RJUi9vYmplY3RzKQorCitHSVRfSU5ERVhfRklMRTo6CisJdXNlZCB0byBzcGVjaWZ5IHRoZSBpbmRleCBmaWxlIG9mIHRoZSBpbmRleAorCitHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUzo6CisJdXNlZCB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgb2JqZWN0IGRhdGFiYXNlIHJvb3RzICh1c3VhbGx5IHVuc2V0KQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtZ2V0LXRhci1jb21taXQtaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtZ2V0LXRhci1jb21taXQtaWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODA1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1nZXQtdGFyLWNvbW1pdC1pZC50eHQKQEAgLTAsMCArMSwzNyBAQAorZ2l0LWdldC10YXItY29tbWl0LWlkKDEpCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWdldC10YXItY29tbWl0LWlkIC0gRXh0cmFjdCBjb21taXQgSUQgZnJvbSBhbiBhcmNoaXZlIGNyZWF0ZWQgdXNpbmcgZ2l0LXRhci10cmVlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWdldC10YXItY29tbWl0LWlkJyA8IDx0YXJmaWxlPgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQWN0cyBhcyBhIGZpbHRlciwgZXh0cmFjdGluZyB0aGUgY29tbWl0IElEIHN0b3JlZCBpbiBhcmNoaXZlcyBjcmVhdGVkIGJ5CitnaXQtdGFyLXRyZWUuICBJdCByZWFkcyBvbmx5IHRoZSBmaXJzdCAxMDI0IGJ5dGVzIG9mIGlucHV0LCB0aHVzIGl0cworcnVudGltZSBpcyBub3QgaW5mbHVlbmNlZCBieSB0aGUgc2l6ZSBvZiA8dGFyZmlsZT4gdmVyeSBtdWNoLgorCitJZiBubyBjb21taXQgSUQgaXMgZm91bmQsIGdpdC1nZXQtdGFyLWNvbW1pdC1pZCBxdWlldGx5IGV4aXN0cyB3aXRoIGEKK3JldHVybiBjb2RlIG9mIDEuICBUaGlzIGNhbiBoYXBwZW4gaWYgPHRhcmZpbGU+IGhhZCBub3QgYmVlbiBjcmVhdGVkCit1c2luZyBnaXQtdGFyLXRyZWUgb3IgaWYgdGhlIGZpcnN0IHBhcmFtZXRlciBvZiBnaXQtdGFyLXRyZWUgaGFkIGJlZW4KK2EgdHJlZSBJRCBpbnN0ZWFkIG9mIGEgY29tbWl0IElEIG9yIHRhZy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBSZW5lIFNjaGFyZmUgPHJlbmUuc2NoYXJmZUBsc3JmaXJlLmF0aC5jeD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ncmVwLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWdyZXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzY4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1ncmVwLnR4dApAQCAtMCwwICsxLDExNCBAQAorZ2l0LWdyZXAoMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1ncmVwIC0gUHJpbnQgbGluZXMgbWF0Y2hpbmcgYSBwYXR0ZXJuCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWdyZXAnIFstLWNhY2hlZF0KKwkgICBbLWEgfCAtLXRleHRdIFstSV0gWy1pIHwgLS1pZ25vcmUtY2FzZV0gWy13IHwgLS13b3JkLXJlZ2V4cF0KKwkgICBbLXYgfCAtLWludmVydC1tYXRjaF0KKwkgICBbLUUgfCAtLWV4dGVuZGVkLXJlZ2V4cF0gWy1HIHwgLS1iYXNpYy1yZWdleHBdIFstRiB8IC0tZml4ZWQtc3RyaW5nc10KKwkgICBbLW5dIFstbCB8IC0tZmlsZXMtd2l0aC1tYXRjaGVzXSBbLUwgfCAtLWZpbGVzLXdpdGhvdXQtbWF0Y2hdCisJICAgWy1jIHwgLS1jb3VudF0KKwkgICBbLUEgPHBvc3QtY29udGV4dD5dIFstQiA8cHJlLWNvbnRleHQ+XSBbLUMgPGNvbnRleHQ+XQorCSAgIFstZiA8ZmlsZT5dIFstZV0gPHBhdHRlcm4+IFstLWFuZHwtLW9yfC0tbm90fCh8KXwtZSA8cGF0dGVybj4uLi5dCisJICAgWzx0cmVlPi4uLl0KKwkgICBbLS1dIFs8cGF0aD4uLi5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTG9vayBmb3Igc3BlY2lmaWVkIHBhdHRlcm5zIGluIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMsIGJsb2JzCityZWdpc3RlcmVkIGluIHRoZSBpbmRleCBmaWxlLCBvciBnaXZlbiB0cmVlIG9iamVjdHMuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1jYWNoZWQ6OgorCUluc3RlYWQgb2Ygc2VhcmNoaW5nIGluIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMsIGNoZWNrCisJdGhlIGJsb2JzIHJlZ2lzdGVyZWQgaW4gdGhlIGluZGV4IGZpbGUuCisKKy1hIHwgLS10ZXh0OjoKKwlQcm9jZXNzIGJpbmFyeSBmaWxlcyBhcyBpZiB0aGV5IHdlcmUgdGV4dC4KKworLWkgfCAtLWlnbm9yZS1jYXNlOjoKKwlJZ25vcmUgY2FzZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwYXR0ZXJucyBhbmQgdGhlCisJZmlsZXMuCisKKy13IHwgLS13b3JkLXJlZ2V4cDo6CisJTWF0Y2ggdGhlIHBhdHRlcm4gb25seSBhdCB3b3JkIGJvdW5kYXJ5IChlaXRoZXIgYmVnaW4gYXQgdGhlCisJYmVnaW5uaW5nIG9mIGEgbGluZSwgb3IgcHJlY2VkZWQgYnkgYSBub24td29yZCBjaGFyYWN0ZXI7IGVuZCBhdAorCXRoZSBlbmQgb2YgYSBsaW5lIG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXdvcmQgY2hhcmFjdGVyKS4KKworLXYgfCAtLWludmVydC1tYXRjaDo6CisJU2VsZWN0IG5vbi1tYXRjaGluZyBsaW5lcy4KKworLUUgfCAtLWV4dGVuZGVkLXJlZ2V4cCB8IC1HIHwgLS1iYXNpYy1yZWdleHA6OgorCVVzZSBQT1NJWCBleHRlbmRlZC9iYXNpYyByZWdleHAgZm9yIHBhdHRlcm5zLiAgRGVmYXVsdAorCWlzIHRvIHVzZSBiYXNpYyByZWdleHAuCisKKy1uOjoKKwlQcmVmaXggdGhlIGxpbmUgbnVtYmVyIHRvIG1hdGNoaW5nIGxpbmVzLgorCistbCB8IC0tZmlsZXMtd2l0aC1tYXRjaGVzIHwgLUwgfCAtLWZpbGVzLXdpdGhvdXQtbWF0Y2g6OgorCUluc3RlYWQgb2Ygc2hvd2luZyBldmVyeSBtYXRjaGVkIGxpbmUsIHNob3cgb25seSB0aGUKKwluYW1lcyBvZiBmaWxlcyB0aGF0IGNvbnRhaW4gKG9yIGRvIG5vdCBjb250YWluKSBtYXRjaGVzLgorCistYyB8IC0tY291bnQ6OgorCUluc3RlYWQgb2Ygc2hvd2luZyBldmVyeSBtYXRjaGVkIGxpbmUsIHNob3cgdGhlIG51bWJlciBvZgorCWxpbmVzIHRoYXQgbWF0Y2guCisKKy1bQUJDXSA8Y29udGV4dD46OgorCVNob3cgYGNvbnRleHRgIHRyYWlsaW5nIChgQWAgLS0gYWZ0ZXIpLCBvciBsZWFkaW5nIChgQmAKKwktLSBiZWZvcmUpLCBvciBib3RoIChgQ2AgLS0gY29udGV4dCkgbGluZXMsIGFuZCBwbGFjZSBhCisJbGluZSBjb250YWluaW5nIGAtLWAgYmV0d2VlbiBjb250aWd1b3VzIGdyb3VwcyBvZgorCW1hdGNoZXMuCisKKy1mIDxmaWxlPjo6CisJUmVhZCBwYXR0ZXJucyBmcm9tIDxmaWxlPiwgb25lIHBlciBsaW5lLgorCistZTo6CisJVGhlIG5leHQgcGFyYW1ldGVyIGlzIHRoZSBwYXR0ZXJuLiBUaGlzIG9wdGlvbiBoYXMgdG8gYmUKKwl1c2VkIGZvciBwYXR0ZXJucyBzdGFydGluZyB3aXRoIC0gYW5kIHNob3VsZCBiZSB1c2VkIGluCisJc2NyaXB0cyBwYXNzaW5nIHVzZXIgaW5wdXQgdG8gZ3JlcC4gIE11bHRpcGxlIHBhdHRlcm5zIGFyZQorCWNvbWJpbmVkIGJ5ICdvcicuCisKKy0tYW5kIHwgLS1vciB8IC0tbm90IHwgKCB8ICk6OgorCVNwZWNpZnkgaG93IG11bHRpcGxlIHBhdHRlcm5zIGFyZSBjb21iaW5lZCB1c2luZyBib29sZWFuCisJZXhwcmVzc2lvbnMuICBgLS1vcmAgaXMgdGhlIGRlZmF1bHQgb3BlcmF0b3IuICBgLS1hbmRgIGhhcworCWhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gYC0tb3JgLiAgYC1lYCBoYXMgdG8gYmUgdXNlZCBmb3IgYWxsCisJcGF0dGVybnMuCisKK2A8dHJlZT4uLi5gOjoKKwlTZWFyY2ggYmxvYnMgaW4gdGhlIHRyZWVzIGZvciBzcGVjaWZpZWQgcGF0dGVybnMuCisKK1wtLTo6CisJU2lnbmFscyB0aGUgZW5kIG9mIG9wdGlvbnM7IHRoZSByZXN0IG9mIHRoZSBwYXJhbWV0ZXJzCisJYXJlIDxwYXRoPiBsaW1pdGVycy4KKworCitFeGFtcGxlCistLS0tLS0tCisKK2dpdCBncmVwIC1lIFwnI2RlZmluZVwnIC0tYW5kIFwoIC1lIE1BWF9QQVRIIC1lIFBBVEhfTUFYIFwpOjoKKwlMb29rcyBmb3IgYSBsaW5lIHRoYXQgaGFzIGAjZGVmaW5lYCBhbmQgZWl0aGVyIGBNQVhfUEFUSGAgb3IKKwlgUEFUSF9NQVhgLgorCitBdXRob3IKKy0tLS0tLQorT3JpZ2luYWxseSB3cml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sIGxhdGVyCityZXZhbXBlZCBieSBKdW5pbyBDIEhhbWFuby4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWhhc2gtb2JqZWN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU4ZDAwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaGFzaC1vYmplY3QudHh0CkBAIC0wLDAgKzEsNDYgQEAKK2dpdC1oYXNoLW9iamVjdCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1oYXNoLW9iamVjdCAtIENvbXB1dGVzIG9iamVjdCBJRCBhbmQgb3B0aW9uYWxseSBjcmVhdGVzIGEgYmxvYiBmcm9tIGEgZmlsZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1oYXNoLW9iamVjdCcgWy10IDx0eXBlPl0gWy13XSBbLS1zdGRpbl0gWy0tXSA8ZmlsZT4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDb21wdXRlcyB0aGUgb2JqZWN0IElEIHZhbHVlIGZvciBhbiBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgdHlwZQord2l0aCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIGZpbGUgKHdoaWNoIGNhbiBiZSBvdXRzaWRlIG9mIHRoZQord29yayB0cmVlKSwgYW5kIG9wdGlvbmFsbHkgd3JpdGVzIHRoZSByZXN1bHRpbmcgb2JqZWN0IGludG8gdGhlCitvYmplY3QgZGF0YWJhc2UuICBSZXBvcnRzIGl0cyBvYmplY3QgSUQgdG8gaXRzIHN0YW5kYXJkIG91dHB1dC4KK1RoaXMgaXMgdXNlZCBieSAiZ2l0LWN2c2ltcG9ydCIgdG8gdXBkYXRlIHRoZSBpbmRleAord2l0aG91dCBtb2RpZnlpbmcgZmlsZXMgaW4gdGhlIHdvcmsgdHJlZS4gIFdoZW4gPHR5cGU+IGlzIG5vdAorc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byAiYmxvYiIuIAorCitPUFRJT05TCistLS0tLS0tCisKKy10IDx0eXBlPjo6CisJU3BlY2lmeSB0aGUgdHlwZSAoZGVmYXVsdDogImJsb2IiKS4KKworLXc6OgorCUFjdHVhbGx5IHdyaXRlIHRoZSBvYmplY3QgaW50byB0aGUgb2JqZWN0IGRhdGFiYXNlLgorCistLXN0ZGluOjoKKwlSZWFkIHRoZSBvYmplY3QgZnJvbSBzdGFuZGFyZCBpbnB1dCBpbnN0ZWFkIG9mIGZyb20gYSBmaWxlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1mZXRjaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1odHRwLWZldGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUwODA5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1mZXRjaC50eHQKQEAgLTAsMCArMSw1MyBAQAorZ2l0LWh0dHAtZmV0Y2goMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1odHRwLWZldGNoIC0gZG93bmxvYWRzIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHZpYSBIVFRQCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWh0dHAtZmV0Y2gnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLXcgZmlsZW5hbWVdIFstLXJlY292ZXJdIFstLXN0ZGluXSA8Y29tbWl0PiA8dXJsPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0Rvd25sb2FkcyBhIHJlbW90ZSBnaXQgcmVwb3NpdG9yeSB2aWEgSFRUUC4KKworT1BUSU9OUworLS0tLS0tLQorY29tbWl0LWlkOjoKKyAgICAgICAgRWl0aGVyIHRoZSBoYXNoIG9yIHRoZSBmaWxlbmFtZSB1bmRlciBbVVJMXS9yZWZzLyB0bworICAgICAgICBwdWxsLgorCistYzo6CisJR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKy10OjoKKwlHZXQgdHJlZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21taXQgb2JqZWN0cy4KKy1hOjoKKwlHZXQgYWxsIHRoZSBvYmplY3RzLgorLXY6OgorCVJlcG9ydCB3aGF0IGlzIGRvd25sb2FkZWQuCisKKy13IDxmaWxlbmFtZT46OgorICAgICAgICBXcml0ZXMgdGhlIGNvbW1pdC1pZCBpbnRvIHRoZSBmaWxlbmFtZSB1bmRlciAkR0lUX0RJUi9yZWZzLzxmaWxlbmFtZT4gb24KKyAgICAgICAgdGhlIGxvY2FsIGVuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgYSBjb21taXQgaWQgb24gdGhlIGNvbW1hbmRsaW5lICh3aGljaCBpcyBub3QgZXhwZWN0ZWQgaW4gdGhpcworCWNhc2UpLCAnZ2l0LWh0dHAtZmV0Y2gnIGV4cGVjdHMgbGluZXMgb24gc3RkaW4gaW4gdGhlIGZvcm1hdAorCisJCTxjb21taXQtaWQ+WydcdCc8ZmlsZW5hbWUtYXMtaW4tLXc+XQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaHR0cC1wdXNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtcHVzaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UxZjg5NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWh0dHAtcHVzaC50eHQKQEAgLTAsMCArMSw4OSBAQAorZ2l0LWh0dHAtcHVzaCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaHR0cC1wdXNoIC0gUHVzaCBtaXNzaW5nIG9iamVjdHMgdXNpbmcgSFRUUC9EQVYKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtaHR0cC1wdXNoJyBbLS1jb21wbGV0ZV0gWy0tZm9yY2VdIFstLXZlcmJvc2VdIDx1cmw+IDxyZWY+IFs8cmVmPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTZW5kcyBtaXNzaW5nIG9iamVjdHMgdG8gcmVtb3RlIHJlcG9zaXRvcnksIGFuZCB1cGRhdGVzIHRoZQorcmVtb3RlIGJyYW5jaC4KKworCitPUFRJT05TCistLS0tLS0tCistLWNvbXBsZXRlOjoKKwlEbyBub3QgYXNzdW1lIHRoYXQgdGhlIHJlbW90ZSByZXBvc2l0b3J5IGlzIGNvbXBsZXRlIGluIGl0cworCWN1cnJlbnQgc3RhdGUsIGFuZCB2ZXJpZnkgYWxsIG9iamVjdHMgaW4gdGhlIGVudGlyZSBsb2NhbAorCXJlZidzIGhpc3RvcnkgZXhpc3QgaW4gdGhlIHJlbW90ZSByZXBvc2l0b3J5LgorCistLWZvcmNlOjoKKwlVc3VhbGx5LCB0aGUgY29tbWFuZCByZWZ1c2VzIHRvIHVwZGF0ZSBhIHJlbW90ZSByZWYgdGhhdAorCWlzIG5vdCBhbiBhbmNlc3RvciBvZiB0aGUgbG9jYWwgcmVmIHVzZWQgdG8gb3ZlcndyaXRlIGl0LgorCVRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2suICBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdAorCXRoZSByZW1vdGUgcmVwb3NpdG9yeSBjYW4gbG9zZSBjb21taXRzOyB1c2UgaXQgd2l0aAorCWNhcmUuCisKKy0tdmVyYm9zZTo6CisJUmVwb3J0IHRoZSBsaXN0IG9mIG9iamVjdHMgYmVpbmcgd2Fsa2VkIGxvY2FsbHkgYW5kIHRoZQorCWxpc3Qgb2Ygb2JqZWN0cyBzdWNjZXNzZnVsbHkgc2VudCB0byB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuCisKKzxyZWY+Li4uOgorCVRoZSByZW1vdGUgcmVmcyB0byB1cGRhdGUuCisKKworU3BlY2lmeWluZyB0aGUgUmVmcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBICc8cmVmPicgc3BlY2lmaWNhdGlvbiBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIHBhdHRlcm4sIG9yIGEgcGFpcgorb2Ygc3VjaCBwYXR0ZXJucyBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAiOiIgKHRoaXMgbWVhbnMgdGhhdCBhIHJlZiBuYW1lCitjYW5ub3QgaGF2ZSBhIGNvbG9uIGluIGl0KS4gIEEgc2luZ2xlIHBhdHRlcm4gJzxuYW1lPicgaXMganVzdCBhIAorc2hvcnRoYW5kIGZvciAnPG5hbWU+OjxuYW1lPicuCisKK0VhY2ggcGF0dGVybiBwYWlyIGNvbnNpc3RzIG9mIHRoZSBzb3VyY2Ugc2lkZSAoYmVmb3JlIHRoZSBjb2xvbikKK2FuZCB0aGUgZGVzdGluYXRpb24gc2lkZSAoYWZ0ZXIgdGhlIGNvbG9uKS4gIFRoZSByZWYgdG8gYmUKK3B1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IGZpbmRpbmcgYSBtYXRjaCB0aGF0IG1hdGNoZXMgdGhlIHNvdXJjZQorc2lkZSwgYW5kIHdoZXJlIGl0IGlzIHB1c2hlZCBpcyBkZXRlcm1pbmVkIGJ5IHVzaW5nIHRoZQorZGVzdGluYXRpb24gc2lkZS4KKworIC0gSXQgaXMgYW4gZXJyb3IgaWYgPHNyYz4gZG9lcyBub3QgbWF0Y2ggZXhhY3RseSBvbmUgb2YgdGhlCisgICBsb2NhbCByZWZzLgorCisgLSBJZiA8ZHN0PiBkb2VzIG5vdCBtYXRjaCBhbnkgcmVtb3RlIHJlZiwgZWl0aGVyCisKKyAgICogaXQgaGFzIHRvIHN0YXJ0IHdpdGggInJlZnMvIjsgPGRzdD4gaXMgdXNlZCBhcyB0aGUKKyAgICAgZGVzdGluYXRpb24gbGl0ZXJhbGx5IGluIHRoaXMgY2FzZS4KKworICAgKiA8c3JjPiA9PSA8ZHN0PiBhbmQgdGhlIHJlZiB0aGF0IG1hdGNoZWQgdGhlIDxzcmM+IG11c3Qgbm90CisgICAgIGV4aXN0IGluIHRoZSBzZXQgb2YgcmVtb3RlIHJlZnM7IHRoZSByZWYgbWF0Y2hlZCA8c3JjPgorICAgICBsb2NhbGx5IGlzIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uLgorCitXaXRob3V0ICctLWZvcmNlJywgdGhlIDxzcmM+IHJlZiBpcyBzdG9yZWQgYXQgdGhlIHJlbW90ZSBvbmx5IGlmCis8ZHN0PiBkb2VzIG5vdCBleGlzdCwgb3IgPGRzdD4gaXMgYSBwcm9wZXIgc3Vic2V0IChpLmUuIGFuCithbmNlc3Rvcikgb2YgPHNyYz4uICBUaGlzIGNoZWNrLCBrbm93biBhcyAiZmFzdCBmb3J3YXJkIGNoZWNrIiwKK2lzIHBlcmZvcm1lZCBpbiBvcmRlciB0byBhdm9pZCBhY2NpZGVudGFsbHkgb3ZlcndyaXRpbmcgdGhlCityZW1vdGUgcmVmIGFuZCBsb3NlIG90aGVyIHBlb3BsZXMnIGNvbW1pdHMgZnJvbSB0aGVyZS4KKworV2l0aCAnLS1mb3JjZScsIHRoZSBmYXN0IGZvcndhcmQgY2hlY2sgaXMgZGlzYWJsZWQgZm9yIGFsbCByZWZzLgorCitPcHRpb25hbGx5LCBhIDxyZWY+IHBhcmFtZXRlciBjYW4gYmUgcHJlZml4ZWQgd2l0aCBhIHBsdXMgJysnIHNpZ24KK3RvIGRpc2FibGUgdGhlIGZhc3QtZm9yd2FyZCBjaGVjayBvbmx5IG9uIHRoYXQgcmVmLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IE5pY2sgSGVuZ2V2ZWxkIDxuaWNraEByZWFjdHJpeC5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IE5pY2sgSGVuZ2V2ZWxkCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaW1hcC1zZW5kLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWltYXAtc2VuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhOWU5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWltYXAtc2VuZC50eHQKQEAgLTAsMCArMSw2MiBAQAorZ2l0LWltYXAtc2VuZCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaW1hcC1zZW5kIC0gRHVtcCBhIG1haWxib3ggZnJvbSBzdGRpbiBpbnRvIGFuIGltYXAgZm9sZGVyCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWltYXAtc2VuZCcKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCB1cGxvYWRzIGEgbWFpbGJveCBnZW5lcmF0ZWQgd2l0aCBnaXQtZm9ybWF0LXBhdGNoCitpbnRvIGFuIGltYXAgZHJhZnRzIGZvbGRlci4gIFRoaXMgYWxsb3dzIHBhdGNoZXMgdG8gYmUgc2VudCBhcworb3RoZXIgZW1haWwgaXMgc2VudCB3aXRoIG1haWwgY2xpZW50cyB0aGF0IGNhbm5vdCByZWFkIG1haWxib3gKK2ZpbGVzIGRpcmVjdGx5LgorCitUeXBpY2FsIHVzYWdlIGlzIHNvbWV0aGluZyBsaWtlOgorCitnaXQtZm9ybWF0LXBhdGNoIC0tc2lnbm9mZiAtLXN0ZG91dCAtLWF0dGFjaCBvcmlnaW4gfCBnaXQtaW1hcC1zZW5kCisKKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCitnaXQtaW1hcC1zZW5kIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIHRoZSByZXBvc2l0b3J5Citjb25maWd1cmF0aW9uIGZpbGUgKHNob3duIHdpdGggZXhhbXBsZXMpOgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorW2ltYXBdCisgICAgRm9sZGVyID0gIklOQk9YLkRyYWZ0cyIKKworW2ltYXBdCisgICAgVHVubmVsID0gInNzaCAtcSB1c2VyQHNlcnZlci5jb20gL3Vzci9iaW4vaW1hcGQgLi9NYWlsZGlyIDI+IC9kZXYvbnVsbCIKKworW2ltYXBdCisgICAgSG9zdCA9IGltYXAuc2VydmVyLmNvbQorICAgIFVzZXIgPSBib2IKKyAgICBQYXNzID0gcHdkCisgICAgUG9ydCA9IDE0MworLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKworCitCVUdTCistLS0tCitEb2Vzbid0IGhhbmRsZSBsaW5lcyBzdGFydGluZyB3aXRoICJGcm9tICIgaW4gdGhlIG1lc3NhZ2UgYm9keS4KKworCitBdXRob3IKKy0tLS0tLQorRGVyaXZlZCBmcm9tIGlzeW5jIDEuMC4xIGJ5IE1pa2UgTWNDb3JtYWNrLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBNaWtlIE1jQ29ybWFjaworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWluZGV4LXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW5kZXgtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjZTU1NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWluZGV4LXBhY2sudHh0CkBAIC0wLDAgKzEsNDQgQEAKK2dpdC1pbmRleC1wYWNrKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtaW5kZXgtcGFjayAtIEJ1aWxkIHBhY2sgaW5kZXggZmlsZSBmb3IgYW4gZXhpc3RpbmcgcGFja2VkIGFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtaW5kZXgtcGFjaycgWy1vIDxpbmRleC1maWxlPl0gPHBhY2stZmlsZT4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGEgcGFja2VkIGFyY2hpdmUgKC5wYWNrKSBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSwgYW5kCitidWlsZHMgYSBwYWNrIGluZGV4IGZpbGUgKC5pZHgpIGZvciBpdC4gIFRoZSBwYWNrZWQgYXJjaGl2ZQordG9nZXRoZXIgd2l0aCB0aGUgcGFjayBpbmRleCBjYW4gdGhlbiBiZSBwbGFjZWQgaW4gdGhlCitvYmplY3RzL3BhY2svIGRpcmVjdG9yeSBvZiBhIGdpdCByZXBvc2l0b3J5LgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1vIDxpbmRleC1maWxlPjo6CisJV3JpdGUgdGhlIGdlbmVyYXRlZCBwYWNrIGluZGV4IGludG8gdGhlIHNwZWNpZmllZAorCWZpbGUuICBXaXRob3V0IHRoaXMgb3B0aW9uIHRoZSBuYW1lIG9mIHBhY2sgaW5kZXgKKwlmaWxlIGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIG5hbWUgb2YgcGFja2VkIGFyY2hpdmUKKwlmaWxlIGJ5IHJlcGxhY2luZyAucGFjayB3aXRoIC5pZHggKGFuZCB0aGUgcHJvZ3JhbQorCWZhaWxzIGlmIHRoZSBuYW1lIG9mIHBhY2tlZCBhcmNoaXZlIGRvZXMgbm90IGVuZAorCXdpdGggLnBhY2spLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFNlcmdleSBWbGFzb3YgPHZzdUBhbHRsaW51eC5ydT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBTZXJnZXkgVmxhc292CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1pbml0LWRiLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWluaXQtZGIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2Q1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbml0LWRiLnR4dApAQCAtMCwwICsxLDEwMSBAQAorZ2l0LWluaXQtZGIoMSkKKz09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1pbml0LWRiIC0gQ3JlYXRlcyBhbiBlbXB0eSBnaXQgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1pbml0LWRiJyBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy0tc2hhcmVkWz08cGVybWlzc2lvbnM+XV0KKworCitPUFRJT05TCistLS0tLS0tCisKKy0tCisKKy0tdGVtcGxhdGU9PHRlbXBsYXRlX2RpcmVjdG9yeT46OgorCitQcm92aWRlIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0ZW1wbGF0ZXMgd2lsbCBiZSB1c2VkLiAgVGhlIGRlZmF1bHQgdGVtcGxhdGUKK2RpcmVjdG9yeSBpcyBgL3Vzci9zaGFyZS9naXQtY29yZS90ZW1wbGF0ZXNgLgorCitXaGVuIHNwZWNpZmllZCwgYDx0ZW1wbGF0ZV9kaXJlY3Rvcnk+YCBpcyB1c2VkIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIHRlbXBsYXRlCitmaWxlcyByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdC4gIFRoZSB0ZW1wbGF0ZSBmaWxlcyBpbmNsdWRlIHNvbWUgZGlyZWN0b3J5CitzdHJ1Y3R1cmUsIHNvbWUgc3VnZ2VzdGVkICJleGNsdWRlIHBhdHRlcm5zIiwgYW5kIGNvcGllcyBvZiBub24tZXhlY3V0aW5nCisiaG9vayIgZmlsZXMuICBUaGUgc3VnZ2VzdGVkIHBhdHRlcm5zIGFuZCBob29rIGZpbGVzIGFyZSBhbGwgbW9kaWZpYWJsZSBhbmQKK2V4dGVuc2libGUuCisKKy0tc2hhcmVkWz17ZmFsc2V8dHJ1ZXx1bWFza3xncm91cHxhbGx8d29ybGR8ZXZlcnlib2R5fV06OgorCitTcGVjaWZ5IHRoYXQgdGhlIGdpdCByZXBvc2l0b3J5IGlzIHRvIGJlIHNoYXJlZCBhbW9uZ3N0IHNldmVyYWwgdXNlcnMuICBUaGlzCithbGxvd3MgdXNlcnMgYmVsb25naW5nIHRvIHRoZSBzYW1lIGdyb3VwIHRvIHB1c2ggaW50byB0aGF0CityZXBvc2l0b3J5LiAgV2hlbiBzcGVjaWZpZWQsIHRoZSBjb25maWcgdmFyaWFibGUgImNvcmUuc2hhcmVkUmVwb3NpdG9yeSIgaXMKK3NldCBzbyB0aGF0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyB1bmRlciBgJEdJVF9ESVJgIGFyZSBjcmVhdGVkIHdpdGggdGhlCityZXF1ZXN0ZWQgcGVybWlzc2lvbnMuICBXaGVuIG5vdCBzcGVjaWZpZWQsIGdpdCB3aWxsIHVzZSBwZXJtaXNzaW9ucyByZXBvcnRlZAorYnkgdW1hc2soMikuCisKK1RoZSBvcHRpb24gY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXMsIGRlZmF1bHRpbmcgdG8gJ2dyb3VwJyBpZiBubyB2YWx1ZQoraXMgZ2l2ZW46CisKKyAtICd1bWFzaycgKG9yICdmYWxzZScpOiBVc2UgcGVybWlzc2lvbnMgcmVwb3J0ZWQgYnkgdW1hc2soMikuIFRoZSBkZWZhdWx0LAorICAgd2hlbiBgLS1zaGFyZWRgIGlzIG5vdCBzcGVjaWZpZWQuCisKKyAtICdncm91cCcgKG9yICd0cnVlJyk6IE1ha2UgdGhlIHJlcG9zaXRvcnkgZ3JvdXAtd3JpdGFibGUsIChhbmQgZytzeCwgc2luY2UKKyAgIHRoZSBnaXQgZ3JvdXAgbWF5IGJlIG5vdCB0aGUgcHJpbWFyeSBncm91cCBvZiBhbGwgdXNlcnMpLgorCisgLSAnYWxsJyAob3IgJ3dvcmxkJyBvciAnZXZlcnlib2R5Jyk6IFNhbWUgYXMgJ2dyb3VwJywgYnV0IG1ha2UgdGhlIHJlcG9zaXRvcnkKKyAgIHJlYWRhYmxlIGJ5IGFsbCB1c2Vycy4KKworLS0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBjcmVhdGVzIGFuIGVtcHR5IGdpdCByZXBvc2l0b3J5IC0gYmFzaWNhbGx5IGEgYC5naXRgIGRpcmVjdG9yeQord2l0aCBzdWJkaXJlY3RvcmllcyBmb3IgYG9iamVjdHNgLCBgcmVmcy9oZWFkc2AsIGByZWZzL3RhZ3NgLCBhbmQKK3RlbXBsYXRlIGZpbGVzLgorQW4gaW5pdGlhbCBgSEVBRGAgZmlsZSB0aGF0IHJlZmVyZW5jZXMgdGhlIEhFQUQgb2YgdGhlIG1hc3RlciBicmFuY2gKK2lzIGFsc28gY3JlYXRlZC4KKworSWYgdGhlIGAkR0lUX0RJUmAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRoZW4gaXQgc3BlY2lmaWVzIGEgcGF0aAordG8gdXNlIGluc3RlYWQgb2YgYC4vLmdpdGAgZm9yIHRoZSBiYXNlIG9mIHRoZSByZXBvc2l0b3J5LgorCitJZiB0aGUgb2JqZWN0IHN0b3JhZ2UgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCB2aWEgdGhlIGAkR0lUX09CSkVDVF9ESVJFQ1RPUllgCitlbnZpcm9ubWVudCB2YXJpYWJsZSB0aGVuIHRoZSBzaGExIGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIHVuZGVybmVhdGggLQorb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IGAkR0lUX0RJUi9vYmplY3RzYCBkaXJlY3RvcnkgaXMgdXNlZC4KKworUnVubmluZyBgZ2l0LWluaXQtZGJgIGluIGFuIGV4aXN0aW5nIHJlcG9zaXRvcnkgaXMgc2FmZS4gSXQgd2lsbCBub3Qgb3ZlcndyaXRlCit0aGluZ3MgdGhhdCBhcmUgYWxyZWFkeSB0aGVyZS4gVGhlIHByaW1hcnkgcmVhc29uIGZvciByZXJ1bm5pbmcgYGdpdC1pbml0LWRiYAoraXMgdG8gcGljayB1cCBuZXdseSBhZGRlZCB0ZW1wbGF0ZXMuCisKKworCitFWEFNUExFUworLS0tLS0tLS0KKworU3RhcnQgYSBuZXcgZ2l0IHJlcG9zaXRvcnkgZm9yIGFuIGV4aXN0aW5nIGNvZGUgYmFzZTo6CisrCistLS0tLS0tLS0tLS0tLS0tCiskIGNkIC9wYXRoL3RvL215L2NvZGViYXNlCiskIGdpdC1pbml0LWRiICAgPDE+CiskIGdpdC1hZGQgLiAgICAgPDI+CistLS0tLS0tLS0tLS0tLS0tCisrCis8MT4gcHJlcGFyZSAvcGF0aC90by9teS9jb2RlYmFzZS8uZ2l0IGRpcmVjdG9yeQorPDI+IGFkZCBhbGwgZXhpc3RpbmcgZmlsZSB0byB0aGUgaW5kZXgKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtaW5zdGF3ZWIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtaW5zdGF3ZWIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDM5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1pbnN0YXdlYi50eHQKQEAgLTAsMCArMSw4NCBAQAorZ2l0LWluc3Rhd2ViKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWluc3Rhd2ViIC0gaW5zdGFudGx5IGJyb3dzZSB5b3VyIHdvcmtpbmcgcmVwb3NpdG9yeSBpbiBnaXR3ZWIKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWluc3Rhd2ViJyBbLS1sb2NhbF0gWy0taHR0cGQ9PGh0dHBkPl0gWy0tcG9ydD08cG9ydD5dIFstLWJyb3dzZXI9PGJyb3dzZXI+XQorCisnZ2l0LWluc3Rhd2ViJyBbLS1zdGFydF0gWy0tc3RvcF0gWy0tcmVzdGFydF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBIHNpbXBsZSBzY3JpcHQgdG8gc2V0dXAgZ2l0d2ViIGFuZCBhIHdlYiBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHRoZSBsb2NhbAorcmVwb3NpdG9yeS4KKworT1BUSU9OUworLS0tLS0tLQorCistbHwtLWxvY2FsOjoKKwlPbmx5IGJpbmQgdGhlIHdlYiBzZXJ2ZXIgdG8gdGhlIGxvY2FsIElQICgxMjcuMC4wLjEpLgorCistZHwtLWh0dHBkOjoKKwlUaGUgSFRUUCBkYWVtb24gY29tbWFuZC1saW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4KKwlDb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgYmUgc3BlY2lmaWVkIGhlcmUsIGFuZCB0aGUKKwljb25maWd1cmF0aW9uIGZpbGUgd2lsbCBiZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBjb21tYW5kLWxpbmUuCisJQ3VycmVudGx5LCBsaWdodHRwZCBhbmQgYXBhY2hlMiBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIHNlcnZlcnMuCisJKERlZmF1bHQ6IGxpZ2h0dHBkKQorCistbXwtLW1vZHVsZS1wYXRoOjoKKwlUaGUgbW9kdWxlIHBhdGggKG9ubHkgbmVlZGVkIGlmIGh0dHBkIGlzIEFwYWNoZSkuCisJKERlZmF1bHQ6IC91c3IvbGliL2FwYWNoZTIvbW9kdWxlcykKKworLXB8LS1wb3J0OjoKKwlUaGUgcG9ydCBudW1iZXIgdG8gYmluZCB0aGUgaHR0cGQgdG8uICAoRGVmYXVsdDogMTIzNCkKKworLWJ8LS1icm93c2VyOjoKKworCVRoZSB3ZWIgYnJvd3NlciBjb21tYW5kLWxpbmUgdG8gZXhlY3V0ZSB0byB2aWV3IHRoZSBnaXR3ZWIgcGFnZS4KKwlJZiBibGFuaywgdGhlIFVSTCBvZiB0aGUgZ2l0d2ViIGluc3RhbmNlIHdpbGwgYmUgcHJpbnRlZCB0bworCXN0ZG91dC4gIChEZWZhdWx0OiAnZmlyZWZveCcpCisKKy0tc3RhcnQ6OgorCVN0YXJ0IHRoZSBodHRwZCBpbnN0YW5jZSBhbmQgZXhpdC4gIFRoaXMgZG9lcyBub3QgZ2VuZXJhdGUKKwlhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHNwYXduaW5nIGEgbmV3IGluc3RhbmNlLgorCistLXN0b3A6OgorCVN0b3AgdGhlIGh0dHBkIGluc3RhbmNlIGFuZCBleGl0LiAgVGhpcyBkb2VzIG5vdCBnZW5lcmF0ZQorCWFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3Igc3Bhd25pbmcgYSBuZXcgaW5zdGFuY2UsCisJbm9yIGRvZXMgaXQgY2xvc2UgdGhlIGJyb3dzZXIuCisKKy0tcmVzdGFydDo6CisJUmVzdGFydCB0aGUgaHR0cGQgaW5zdGFuY2UgYW5kIGV4aXQuICBUaGlzIGRvZXMgbm90IGdlbmVyYXRlCisJYW55IG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBzcGF3bmluZyBhIG5ldyBpbnN0YW5jZS4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorCitZb3UgbWF5IHNwZWNpZnkgY29uZmlndXJhdGlvbiBpbiB5b3VyIC5naXQvY29uZmlnCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbaW5zdGF3ZWJdCisJbG9jYWwgPSB0cnVlCisJaHR0cGQgPSBhcGFjaGUyIC1mCisJcG9ydCA9IDQzMjEKKwlicm93c2VyID0ga29ucXVlcm9yCisJbW9kdWxlcGF0aCA9IC91c3IvbGliL2FwYWNoZTIvbW9kdWxlcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbG9jYWwtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9jYWwtZmV0Y2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYmRmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1sb2NhbC1mZXRjaC50eHQKQEAgLTAsMCArMSw0OSBAQAorZ2l0LWxvY2FsLWZldGNoKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LWxvY2FsLWZldGNoIC0gRHVwbGljYXRlcyBhbm90aGVyIGdpdCByZXBvc2l0b3J5IG9uIGEgbG9jYWwgc3lzdGVtCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWxvY2FsLWZldGNoJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy13IGZpbGVuYW1lXSBbLS1yZWNvdmVyXSBbLWxdIFstc10gWy1uXSBjb21taXQtaWQgcGF0aAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0R1cGxpY2F0ZXMgYW5vdGhlciBnaXQgcmVwb3NpdG9yeSBvbiBhIGxvY2FsIHN5c3RlbS4KKworT1BUSU9OUworLS0tLS0tLQorLWM6OgorCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCistdDo6CisJR2V0IHRyZWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tbWl0IG9iamVjdHMuCistYTo6CisJR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy12OjoKKwlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorCistdyA8ZmlsZW5hbWU+OjoKKyAgICAgICAgV3JpdGVzIHRoZSBjb21taXQtaWQgaW50byB0aGUgZmlsZW5hbWUgdW5kZXIgJEdJVF9ESVIvcmVmcy88ZmlsZW5hbWU+IG9uCisgICAgICAgIHRoZSBsb2NhbCBlbmQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlLgorCistLXN0ZGluOjoKKwlJbnN0ZWFkIG9mIGEgY29tbWl0IGlkIG9uIHRoZSBjb21tYW5kbGluZSAod2hpY2ggaXMgbm90IGV4cGVjdGVkIGluIHRoaXMKKwljYXNlKSwgJ2dpdC1sb2NhbC1mZXRjaCcgZXhwZWN0cyBsaW5lcyBvbiBzdGRpbiBpbiB0aGUgZm9ybWF0CisKKwkJPGNvbW1pdC1pZD5bJ1x0JzxmaWxlbmFtZS1hcy1pbi0tdz5dCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1sb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWZmZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbG9nLnR4dApAQCAtMCwwICsxLDc3IEBACitnaXQtbG9nKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1sb2cgLSBTaG93IGNvbW1pdCBsb2dzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWxvZycgPG9wdGlvbj4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTaG93cyB0aGUgY29tbWl0IGxvZ3MuCisKK1RoZSBjb21tYW5kIHRha2VzIG9wdGlvbnMgYXBwbGljYWJsZSB0byB0aGUgZ2l0bGluazpnaXQtcmV2LWxpc3RbMV0KK2NvbW1hbmQgdG8gY29udHJvbCB3aGF0IGlzIHNob3duIGFuZCBob3csIGFuZCBvcHRpb25zIGFwcGxpY2FibGUgdG8KK3RoZSBnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0gY29tbWFuZHMgdG8gY29udHJvbCBob3cgdGhlIGNoYW5nZQorZWFjaCBjb21taXQgaW50cm9kdWNlcyBhcmUgc2hvd24uCisKK1RoaXMgbWFudWFsIHBhZ2UgZGVzY3JpYmVzIG9ubHkgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkIG9wdGlvbnMuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1wcmV0dHk9PGZvcm1hdD46OgorCUNvbnRyb2xzIHRoZSB3YXkgdGhlIGNvbW1pdCBsb2cgaXMgZm9ybWF0dGVkLgorCistLW1heC1jb3VudD08bj46OgorCUxpbWl0cyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMgdG8gc2hvdy4KKworPHNpbmNlPi4uPHVudGlsPjo6CisJU2hvdyBvbmx5IGNvbW1pdHMgYmV0d2VlbiB0aGUgbmFtZWQgdHdvIGNvbW1pdHMuCisKKy1wOjoKKwlTaG93IHRoZSBjaGFuZ2UgdGhlIGNvbW1pdCBpbnRyb2R1Y2VzIGluIGEgcGF0Y2ggZm9ybS4KKworPHBhdGhzPi4uLjo6CisJU2hvdyBvbmx5IGNvbW1pdHMgdGhhdCBhZmZlY3QgdGhlIHNwZWNpZmllZCBwYXRocy4KKworCitFeGFtcGxlcworLS0tLS0tLS0KK2dpdCBsb2cgLS1uby1tZXJnZXM6OgorCisJU2hvdyB0aGUgd2hvbGUgY29tbWl0IGhpc3RvcnksIGJ1dCBza2lwIGFueSBtZXJnZXMKKworZ2l0IGxvZyB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFsbCBjb21taXRzIHNpbmNlIHZlcnNpb24gJ3YyLjYuMTInIHRoYXQgY2hhbmdlZCBhbnkgZmlsZQorCWluIHRoZSBpbmNsdWRlL3Njc2kgb3IgZHJpdmVycy9zY3NpIHN1YmRpcmVjdG9yaWVzCisKK2dpdCBsb2cgLS1zaW5jZT0iMiB3ZWVrcyBhZ28iIFwtLSBnaXRrOjoKKworCVNob3cgdGhlIGNoYW5nZXMgZHVyaW5nIHRoZSBsYXN0IHR3byB3ZWVrcyB0byB0aGUgZmlsZSAnZ2l0aycuCisJVGhlICItLSIgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZSAqYnJhbmNoKiBuYW1lZAorCSdnaXRrJworCitnaXQgbG9nIC1yIC0tbmFtZS1zdGF0dXMgcmVsZWFzZS4udGVzdDo6CisKKwlTaG93IHRoZSBjb21taXRzIHRoYXQgYXJlIGluIHRoZSAidGVzdCIgYnJhbmNoIGJ1dCBub3QgeWV0CisJaW4gdGhlICJyZWxlYXNlIiBicmFuY2gsIGFsb25nIHdpdGggdGhlIGxpc3Qgb2YgcGF0aHMKKwllYWNoIGNvbW1pdCBtb2RpZmllcy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbG9zdC1mb3VuZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyYTlkNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxvc3QtZm91bmQudHh0CkBAIC0wLDAgKzEsNzggQEAKK2dpdC1sb3N0LWZvdW5kKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbG9zdC1mb3VuZCAtIFJlY292ZXIgbG9zdCByZWZzIHRoYXQgbHVja2lseSBoYXZlIG5vdCB5ZXQgYmVlbiBwcnVuZWQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWxvc3QtZm91bmQnCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRmluZHMgZGFuZ2xpbmcgY29tbWl0cyBhbmQgdGFncyBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UsIGFuZAorY3JlYXRlcyByZWZzIHRvIHRoZW0gaW4gLmdpdC9sb3N0LWZvdW5kLyBkaXJlY3RvcnkuICBDb21taXRzIGFuZAordGFncyB0aGF0IGRlcmVmZXJlbmNlIHRvIGNvbW1pdHMgZ28gdG8gLmdpdC9sb3N0LWZvdW5kL2NvbW1pdAorYW5kIG90aGVycyBhcmUgc3RvcmVkIGluIC5naXQvbG9zdC1mb3VuZC9vdGhlciBkaXJlY3RvcnkuCisKKworT1VUUFVUCistLS0tLS0KK09uZSBsaW5lIGRlc2NyaXB0aW9uIGZyb20gdGhlIGNvbW1pdCBhbmQgdGFnIGZvdW5kIGFsb25nIHdpdGgKK3RoZWlyIG9iamVjdCBuYW1lIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKworRVhBTVBMRQorLS0tLS0tLQorCitTdXBwb3NlIHlvdSBydW4gJ2dpdCB0YWcgLWYnIGFuZCBtaXN0eXBlZCB0aGUgdGFnIHRvIG92ZXJ3cml0ZS4KK1RoZSByZWYgdG8geW91ciB0YWcgaXMgb3ZlcndyaXR0ZW4sIGJ1dCB1bnRpbCB5b3UgcnVuICdnaXQKK3BydW5lJywgaXQgaXMgc3RpbGwgdGhlcmUuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgbG9zdC1mb3VuZAorWzFlZjJiMTk2ZDkwOWVlZDUyM2Q0ZjNjOWJmNTRiNzhjZGQ2ODQzYzZdIEdJVCAwLjk5LjljCisuLi4KKy0tLS0tLS0tLS0tLQorCitBbHNvIHlvdSBjYW4gdXNlIGdpdGsgdG8gYnJvd3NlIGhvdyB0aGV5IHJlbGF0ZSB0byBlYWNoIG90aGVyCithbmQgZXhpc3RpbmcgKHByb2JhYmx5IG9sZCkgdGFncy4KKworLS0tLS0tLS0tLS0tCiskIGdpdGsgJChjZCAuZ2l0L2xvc3QtZm91bmQvY29tbWl0ICYmIGVjaG8gPz8qKQorLS0tLS0tLS0tLS0tCisKK0FmdGVyIG1ha2luZyBzdXJlIHRoYXQgaXQgaXMgdGhlIG9iamVjdCB5b3UgYXJlIGxvb2tpbmcgZm9yLCB5b3UKK2NhbiByZWNvbm5lY3QgaXQgdG8geW91ciByZWd1bGFyIC5naXQvcmVmcyBoaWVyYXJjaHkuCisKKy0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgLXQgMWVmMmIxOTYKK3RhZworJCBnaXQgY2F0LWZpbGUgdGFnIDFlZjJiMTk2CitvYmplY3QgZmE0MWJiY2U4ZTM4YzY3YTIxODQxNWRlNmNmYTUxMGM3ZTUwMDMyYQordHlwZSBjb21taXQKK3RhZyB2MC45OS45YwordGFnZ2VyIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4gMTEzMTA1OTU5NCAtMDgwMAorCitHSVQgMC45OS45YworCitUaGlzIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgY2hhbmdlcyBmcm9tIHRoZSAibWFzdGVyIiBicmFuY2gsIHNpbmNlCisuLi4KKyQgZ2l0IHVwZGF0ZS1yZWYgcmVmcy90YWdzL25vdC1sb3N0LWFueW1vcmUgMWVmMmIxOTYKKyQgZ2l0IHJldi1wYXJzZSBub3QtbG9zdC1hbnltb3JlCisxZWYyYjE5NmQ5MDllZWQ1MjNkNGYzYzliZjU0Yjc4Y2RkNjg0M2M2CistLS0tLS0tLS0tLS0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8g5r+x6YeOIOe0lCA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbHMtZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtZmlsZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjBiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1scy1maWxlcy50eHQKQEAgLTAsMCArMSwyNTQgQEAKK2dpdC1scy1maWxlcygxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1scy1maWxlcyAtIEluZm9ybWF0aW9uIGFib3V0IGZpbGVzIGluIHRoZSBpbmRleC93b3JraW5nIGRpcmVjdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1scy1maWxlcycgWy16XSBbLXRdIFstdl0KKwkJKC0tW2NhY2hlZHxkZWxldGVkfG90aGVyc3xpZ25vcmVkfHN0YWdlfHVubWVyZ2VkfGtpbGxlZHxtb2RpZmllZF0pXCoKKwkJKC1bY3xkfG98aXxzfHV8a3xtXSlcKgorCQlbLXggPHBhdHRlcm4+fC0tZXhjbHVkZT08cGF0dGVybj5dCisJCVstWCA8ZmlsZT58LS1leGNsdWRlLWZyb209PGZpbGU+XQorCQlbLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9PGZpbGU+XQorCQlbLS1lcnJvci11bm1hdGNoXQorCQlbLS1mdWxsLW5hbWVdIFstLWFiYnJldl0gWy0tXSBbPGZpbGU+XVwqCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBtZXJnZXMgdGhlIGZpbGUgbGlzdGluZyBpbiB0aGUgZGlyZWN0b3J5IGNhY2hlIGluZGV4IHdpdGggdGhlCithY3R1YWwgd29ya2luZyBkaXJlY3RvcnkgbGlzdCwgYW5kIHNob3dzIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgdGhlCit0d28uCisKK09uZSBvciBtb3JlIG9mIHRoZSBvcHRpb25zIGJlbG93IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgZmlsZXMKK3Nob3duOgorCitPUFRJT05TCistLS0tLS0tCistY3wtLWNhY2hlZDo6CisJU2hvdyBjYWNoZWQgZmlsZXMgaW4gdGhlIG91dHB1dCAoZGVmYXVsdCkKKworLWR8LS1kZWxldGVkOjoKKwlTaG93IGRlbGV0ZWQgZmlsZXMgaW4gdGhlIG91dHB1dAorCistbXwtLW1vZGlmaWVkOjoKKwlTaG93IG1vZGlmaWVkIGZpbGVzIGluIHRoZSBvdXRwdXQKKworLW98LS1vdGhlcnM6OgorCVNob3cgb3RoZXIgZmlsZXMgaW4gdGhlIG91dHB1dAorCistaXwtLWlnbm9yZWQ6OgorCVNob3cgaWdub3JlZCBmaWxlcyBpbiB0aGUgb3V0cHV0CisJTm90ZSB0aGUgdGhpcyBhbHNvIHJldmVyc2VzIGFueSBleGNsdWRlIGxpc3QgcHJlc2VudC4KKworLXN8LS1zdGFnZTo6CisJU2hvdyBzdGFnZSBmaWxlcyBpbiB0aGUgb3V0cHV0CisKKy0tZGlyZWN0b3J5OjoKKwlJZiBhIHdob2xlIGRpcmVjdG9yeSBpcyBjbGFzc2lmaWVkIGFzICJvdGhlciIsIHNob3cganVzdCBpdHMKKwluYW1lICh3aXRoIGEgdHJhaWxpbmcgc2xhc2gpIGFuZCBub3QgaXRzIHdob2xlIGNvbnRlbnRzLgorCistLW5vLWVtcHR5LWRpcmVjdG9yeTo6CisJRG8gbm90IGxpc3QgZW1wdHkgZGlyZWN0b3JpZXMuIEhhcyBubyBlZmZlY3Qgd2l0aG91dCAtLWRpcmVjdG9yeS4KKworLXV8LS11bm1lcmdlZDo6CisJU2hvdyB1bm1lcmdlZCBmaWxlcyBpbiB0aGUgb3V0cHV0IChmb3JjZXMgLS1zdGFnZSkKKworLWt8LS1raWxsZWQ6OgorCVNob3cgZmlsZXMgb24gdGhlIGZpbGVzeXN0ZW0gdGhhdCBuZWVkIHRvIGJlIHJlbW92ZWQgZHVlCisJdG8gZmlsZS9kaXJlY3RvcnkgY29uZmxpY3RzIGZvciBjaGVja291dC1pbmRleCB0bworCXN1Y2NlZWQuCisKKy16OjoKKwlcMCBsaW5lIHRlcm1pbmF0aW9uIG9uIG91dHB1dC4KKworLXh8LS1leGNsdWRlPTxwYXR0ZXJuPjo6CisJU2tpcHMgZmlsZXMgbWF0Y2hpbmcgcGF0dGVybi4KKwlOb3RlIHRoYXQgcGF0dGVybiBpcyBhIHNoZWxsIHdpbGRjYXJkIHBhdHRlcm4uCisKKy1YfC0tZXhjbHVkZS1mcm9tPTxmaWxlPjo6CisJZXhjbHVkZSBwYXR0ZXJucyBhcmUgcmVhZCBmcm9tIDxmaWxlPjsgMSBwZXIgbGluZS4KKworLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9PGZpbGU+OjoKKwlyZWFkIGFkZGl0aW9uYWwgZXhjbHVkZSBwYXR0ZXJucyB0aGF0IGFwcGx5IG9ubHkgdG8gdGhlCisJZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMgaW4gPGZpbGU+LgorCistLWVycm9yLXVubWF0Y2g6OgorCUlmIGFueSA8ZmlsZT4gZG9lcyBub3QgYXBwZWFyIGluIHRoZSBpbmRleCwgdHJlYXQgdGhpcyBhcyBhbgorCWVycm9yIChyZXR1cm4gMSkuCisKKy10OjoKKwlJZGVudGlmeSB0aGUgZmlsZSBzdGF0dXMgd2l0aCB0aGUgZm9sbG93aW5nIHRhZ3MgKGZvbGxvd2VkIGJ5CisJYSBzcGFjZSkgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZToKKwlIOjoJY2FjaGVkCisJTTo6CXVubWVyZ2VkCisJUjo6CXJlbW92ZWQvZGVsZXRlZAorCUM6Ogltb2RpZmllZC9jaGFuZ2VkCisJSzo6CXRvIGJlIGtpbGxlZAorCT86OglvdGhlcgorCistdjo6CisJU2ltaWxhciB0byBgLXRgLCBidXQgdXNlIGxvd2VyY2FzZSBsZXR0ZXJzIGZvciBmaWxlcworCXRoYXQgYXJlIG1hcmtlZCBhcyAnYWx3YXlzIG1hdGNoaW5nIGluZGV4Jy4KKworLS1mdWxsLW5hbWU6OgorCVdoZW4gcnVuIGZyb20gYSBzdWJkaXJlY3RvcnksIHRoZSBjb21tYW5kIHVzdWFsbHkKKwlvdXRwdXRzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFRoaXMKKwlvcHRpb24gZm9yY2VzIHBhdGhzIHRvIGJlIG91dHB1dCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdAorCXRvcCBkaXJlY3RvcnkuCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4KKwlOb24gZGVmYXVsdCBudW1iZXIgb2YgZGlnaXRzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCAtLWFiYnJldj08bj4uCisKK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworPGZpbGU+OjoKKwlGaWxlcyB0byBzaG93LiBJZiBubyBmaWxlcyBhcmUgZ2l2ZW4gYWxsIGZpbGVzIHdoaWNoIG1hdGNoIHRoZSBvdGhlcgorCXNwZWNpZmllZCBjcml0ZXJpYSBhcmUgc2hvd24uCisKK091dHB1dAorLS0tLS0tCitzaG93IGZpbGVzIGp1c3Qgb3V0cHV0cyB0aGUgZmlsZW5hbWUgdW5sZXNzICctLXN0YWdlJyBpcyBzcGVjaWZpZWQgaW4KK3doaWNoIGNhc2UgaXQgb3V0cHV0czoKKworICAgICAgICBbPHRhZz4gXTxtb2RlPiA8b2JqZWN0PiA8c3RhZ2U+IDxmaWxlPgorCisiZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQiIGFuZCAiZ2l0LWxzLWZpbGVzIC0tc3RhZ2UiIGNhbiBiZSB1c2VkIHRvIGV4YW1pbmUKK2RldGFpbGVkIGluZm9ybWF0aW9uIG9uIHVubWVyZ2VkIHBhdGhzLgorCitGb3IgYW4gdW5tZXJnZWQgcGF0aCwgaW5zdGVhZCBvZiByZWNvcmRpbmcgYSBzaW5nbGUgbW9kZS9TSEExIHBhaXIsCit0aGUgZGlyY2FjaGUgcmVjb3JkcyB1cCB0byB0aHJlZSBzdWNoIHBhaXJzOyBvbmUgZnJvbSB0cmVlIE8gaW4gc3RhZ2UKKzEsIEEgaW4gc3RhZ2UgMiwgYW5kIEIgaW4gc3RhZ2UgMy4gIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgYnkKK3RoZSB1c2VyIChvciB0aGUgcG9yY2VsYWluKSB0byBzZWUgd2hhdCBzaG91bGQgZXZlbnR1YWxseSBiZSByZWNvcmRlZCBhdCB0aGUKK3BhdGguIChzZWUgZ2l0LXJlYWQtdHJlZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdGF0ZSkKKworV2hlbiBgLXpgIG9wdGlvbiBpcyBub3QgdXNlZCwgVEFCLCBMRiwgYW5kIGJhY2tzbGFzaCBjaGFyYWN0ZXJzCitpbiBwYXRobmFtZXMgYXJlIHJlcHJlc2VudGVkIGFzIGBcdGAsIGBcbmAsIGFuZCBgXFxgLAorcmVzcGVjdGl2ZWx5LgorCisKK0V4Y2x1ZGUgUGF0dGVybnMKKy0tLS0tLS0tLS0tLS0tLS0KKworJ2dpdC1scy1maWxlcycgY2FuIHVzZSBhIGxpc3Qgb2YgImV4Y2x1ZGUgcGF0dGVybnMiIHdoZW4KK3RyYXZlcnNpbmcgdGhlIGRpcmVjdG9yeSB0cmVlIGFuZCBmaW5kaW5nIGZpbGVzIHRvIHNob3cgd2hlbiB0aGUKK2ZsYWdzIC0tb3RoZXJzIG9yIC0taWdub3JlZCBhcmUgc3BlY2lmaWVkLgorCitUaGVzZSBleGNsdWRlIHBhdHRlcm5zIGNvbWUgZnJvbSB0aGVzZSBwbGFjZXM6CisKKyAgMS4gY29tbWFuZCBsaW5lIGZsYWcgLS1leGNsdWRlPTxwYXR0ZXJuPiBzcGVjaWZpZXMgYSBzaW5nbGUKKyAgICAgcGF0dGVybi4KKworICAyLiBjb21tYW5kIGxpbmUgZmxhZyAtLWV4Y2x1ZGUtZnJvbT08ZmlsZT4gc3BlY2lmaWVzIGEgbGlzdCBvZgorICAgICBwYXR0ZXJucyBzdG9yZWQgaW4gYSBmaWxlLgorCisgIDMuIGNvbW1hbmQgbGluZSBmbGFnIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxuYW1lPiBzcGVjaWZpZXMKKyAgICAgYSBuYW1lIG9mIHRoZSBmaWxlIGluIGVhY2ggZGlyZWN0b3J5ICdnaXQtbHMtZmlsZXMnCisgICAgIGV4YW1pbmVzLCBhbmQgaWYgZXhpc3RzLCBpdHMgY29udGVudHMgYXJlIHVzZWQgYXMgYW4KKyAgICAgYWRkaXRpb25hbCBsaXN0IG9mIHBhdHRlcm5zLgorCitBbiBleGNsdWRlIHBhdHRlcm4gZmlsZSB1c2VkIGJ5ICgyKSBhbmQgKDMpIGNvbnRhaW5zIG9uZSBwYXR0ZXJuCitwZXIgbGluZS4gIEEgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGEgJyMnIGNhbiBiZSB1c2VkIGFzIGNvbW1lbnQKK2ZvciByZWFkYWJpbGl0eS4KKworVGhlcmUgYXJlIHRocmVlIGxpc3RzIG9mIHBhdHRlcm5zIHRoYXQgYXJlIGluIGVmZmVjdCBhdCBhIGdpdmVuCit0aW1lLiAgVGhleSBhcmUgYnVpbHQgYW5kIG9yZGVyZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisKKyAqIC0tZXhjbHVkZT08cGF0dGVybj4gZnJvbSB0aGUgY29tbWFuZCBsaW5lOyBwYXR0ZXJucyBhcmUKKyAgIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXIgb24gdGhlIGNvbW1hbmQgbGluZS4KKworICogbGluZXMgcmVhZCBmcm9tIC0tZXhjbHVkZS1mcm9tPTxmaWxlPjsgcGF0dGVybnMgYXJlIG9yZGVyZWQKKyAgIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBmaWxlLgorCisgKiBXaGVuIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PTxuYW1lPiBpcyBzcGVjaWZpZWQsIHVwb24KKyAgIGVudGVyaW5nIGEgZGlyZWN0b3J5IHRoYXQgaGFzIHN1Y2ggYSBmaWxlLCBpdHMgY29udGVudHMgYXJlCisgICBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50ICJsaXN0IG9mIHBhdHRlcm5zIi4gIFRoZXkKKyAgIGFyZSBwb3BwZWQgb2ZmIHdoZW4gbGVhdmluZyB0aGUgZGlyZWN0b3J5LgorCitFYWNoIHBhdHRlcm4gaW4gdGhlIHBhdHRlcm4gbGlzdCBzcGVjaWZpZXMgImEgbWF0Y2ggcGF0dGVybiIgYW5kCitvcHRpb25hbGx5IHRoZSBmYXRlOyBlaXRoZXIgYSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgcGF0dGVybiBpcworY29uc2lkZXJlZCBleGNsdWRlZCBvciBpbmNsdWRlZC4gIEEgZmlsZW5hbWUgaXMgbWF0Y2hlZCBhZ2FpbnN0Cit0aGUgcGF0dGVybnMgaW4gdGhlIHRocmVlIGxpc3RzOyB0aGUgLS1leGNsdWRlLWZyb20gbGlzdCBpcworY2hlY2tlZCBmaXJzdCwgdGhlbiB0aGUgLS1leGNsdWRlLXBlci1kaXJlY3RvcnkgbGlzdCwgYW5kIHRoZW4KK2ZpbmFsbHkgdGhlIC0tZXhjbHVkZSBsaXN0LiBUaGUgbGFzdCBtYXRjaCBkZXRlcm1pbmVzIGl0cyBmYXRlLgorSWYgdGhlcmUgaXMgbm8gbWF0Y2ggaW4gdGhlIHRocmVlIGxpc3RzLCB0aGUgZmF0ZSBpcyAiaW5jbHVkZWQiLgorCitBIHBhdHRlcm4gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCAtLWV4Y2x1ZGUgb3IgcmVhZAorZnJvbSB0aGUgZmlsZSBzcGVjaWZpZWQgd2l0aCAtLWV4Y2x1ZGUtZnJvbSBpcyByZWxhdGl2ZSB0byB0aGUKK3RvcCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUuICBBIHBhdHRlcm4gcmVhZCBmcm9tIGEgZmlsZSBzcGVjaWZpZWQKK2J5IC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGUKK3BhdHRlcm4gZmlsZSBhcHBlYXJzIGluLgorCitBbiBleGNsdWRlIHBhdHRlcm4gaXMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAtIGFuIG9wdGlvbmFsIHByZWZpeCAnIScgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZmF0ZSB0aGlzIHBhdHRlcm4KKyAgIHNwZWNpZmllcyBpcyAiaW5jbHVkZSIsIG5vdCB0aGUgdXN1YWwgImV4Y2x1ZGUiOyB0aGUKKyAgIHJlbWFpbmRlciBvZiB0aGUgcGF0dGVybiBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nIHRvCisgICB0aGUgZm9sbG93aW5nIHJ1bGVzLgorCisgLSBpZiBpdCBkb2VzIG5vdCBjb250YWluIGEgc2xhc2ggJy8nLCBpdCBpcyBhIHNoZWxsIGdsb2IKKyAgIHBhdHRlcm4gYW5kIHVzZWQgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgZmlsZW5hbWUgd2l0aG91dAorICAgbGVhZGluZyBkaXJlY3Rvcmllcy4KKworIC0gb3RoZXJ3aXNlLCBpdCBpcyBhIHNoZWxsIGdsb2IgcGF0dGVybiwgc3VpdGFibGUgZm9yCisgICBjb25zdW1wdGlvbiBieSBmbm1hdGNoKDMpIHdpdGggRk5NX1BBVEhOQU1FIGZsYWcuICBJLmUuIGEKKyAgIHNsYXNoIGluIHRoZSBwYXR0ZXJuIG11c3QgbWF0Y2ggYSBzbGFzaCBpbiB0aGUgcGF0aG5hbWUuCisgICAiRG9jdW1lbnRhdGlvbi9cKi5odG1sIiBtYXRjaGVzICJEb2N1bWVudGF0aW9uL2dpdC5odG1sIiBidXQKKyAgIG5vdCAicHBjL3BwYy5odG1sIi4gIEFzIGEgbmF0dXJhbCBleGNlcHRpb24sICIvKi5jIiBtYXRjaGVzCisgICAiY2F0LWZpbGUuYyIgYnV0IG5vdCAibW96aWxsYS1zaGExL3NoYTEuYyIuCisKK0FuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgJCBjYXQgLmdpdC9pbmZvL2V4Y2x1ZGUKKyAgICAjIGlnbm9yZSBvYmplY3RzIGFuZCBhcmNoaXZlcywgYW55d2hlcmUgaW4gdGhlIHRyZWUuCisgICAgKi5bb2FdCisgICAgJCBjYXQgRG9jdW1lbnRhdGlvbi8uZ2l0aWdub3JlCisgICAgIyBpZ25vcmUgZ2VuZXJhdGVkIGh0bWwgZmlsZXMsCisgICAgKi5odG1sCisgICAgIyBleGNlcHQgZm9vLmh0bWwgd2hpY2ggaXMgbWFpbnRhaW5lZCBieSBoYW5kCisgICAgIWZvby5odG1sCisgICAgJCBnaXQtbHMtZmlsZXMgLS1pZ25vcmVkIFwKKyAgICAgICAgLS1leGNsdWRlPSdEb2N1bWVudGF0aW9uLyouWzAtOV0nIFwKKyAgICAgICAgLS1leGNsdWRlLWZyb209LmdpdC9pbmZvL2V4Y2x1ZGUgXAorICAgICAgICAtLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbm90aGVyIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgJCBjYXQgLmdpdGlnbm9yZQorICAgIHZtbGludXgqCisgICAgJCBscyBhcmNoL2Zvby9rZXJuZWwvdm0qCisgICAgYXJjaC9mb28va2VybmVsL3ZtbGludXgubGRzLlMKKyAgICAkIGVjaG8gJyEvdm1saW51eConID5hcmNoL2Zvby9rZXJuZWwvLmdpdGlnbm9yZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNlY29uZCAuZ2l0aWdub3JlIGtlZXBzIGBhcmNoL2Zvby9rZXJuZWwvdm1saW51eC5sZHMuU2AgZmlsZQorZnJvbSBnZXR0aW5nIGlnbm9yZWQuCisKKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1yZWFkLXRyZWVbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbHMtcmVtb3RlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXJlbW90ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0YzFhMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXJlbW90ZS50eHQKQEAgLTAsMCArMSw2MyBAQAorZ2l0LWxzLXJlbW90ZSgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbHMtcmVtb3RlIC0gTG9vayBhdCByZWZlcmVuY2VzIG90aGVyIHJlcG9zaXRvcnkgaGFzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LWxzLXJlbW90ZScgWy0taGVhZHNdIFstLXRhZ3NdIDxyZXBvc2l0b3J5PiA8cmVmcz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitEaXNwbGF5cyB0aGUgcmVmZXJlbmNlcyBvdGhlciByZXBvc2l0b3J5IGhhcy4KKworCitPUFRJT05TCistLS0tLS0tCistaHwtLWhlYWRzLCAtdHwtLXRhZ3M6OgorCUxpbWl0IHRvIG9ubHkgcmVmcy9oZWFkcyBhbmQgcmVmcy90YWdzLCByZXNwZWN0aXZlbHkuCisJVGhlc2Ugb3B0aW9ucyBhcmUgX25vdF8gbXV0dWFsbHkgZXhjbHVzaXZlOyB3aGVuIGdpdmVuCisJYm90aCwgcmVmZXJlbmNlcyBzdG9yZWQgaW4gcmVmcy9oZWFkcyBhbmQgcmVmcy90YWdzIGFyZQorCWRpc3BsYXllZC4KKworPHJlcG9zaXRvcnk+OjoKKwlMb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeS4gIFRoZSBzaG9ydGhhbmQgZGVmaW5lZCBpbgorCSRHSVRfRElSL2JyYW5jaGVzLyBjYW4gYmUgdXNlZC4KKworPHJlZnM+Li4uOjoKKwlXaGVuIHVuc3BlY2lmaWVkLCBhbGwgcmVmZXJlbmNlcywgYWZ0ZXIgZmlsdGVyaW5nIGRvbmUKKwl3aXRoIC0taGVhZHMgYW5kIC0tdGFncywgYXJlIHNob3duLiAgV2hlbiA8cmVmcz4uLi4gYXJlCisJc3BlY2lmaWVkLCBvbmx5IHJlZmVyZW5jZXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhdHRlcm5zCisJYXJlIGRpc3BsYXllZC4KKworRVhBTVBMRVMKKy0tLS0tLS0tCisKKwkkIGdpdCBscy1yZW1vdGUgLS10YWdzIC4vLgorCWQ2NjAyZWM1MTk0Yzg3YjBmYzg3MTAzY2E0ZDY3MjUxYzc2ZjIzM2EJcmVmcy90YWdzL3YwLjk5CisJZjI1YTI2NWEzNDJhZWQ2MDQxYWIwY2M0ODQyMjRkOWNhNTRiNmY0MQlyZWZzL3RhZ3MvdjAuOTkuMQorCTdjZWNhMjc1ZDA0N2M5MGMwYzdkNWFmYjEzYWI5N2VmZGY1MWJkNmUJcmVmcy90YWdzL3YwLjk5LjMKKwljNWRiNTQ1NmFlM2IwODczZmM2NTljMTlmYWZkZGUyMjMxM2NjNDQxCXJlZnMvdGFncy92MC45OS4yCisJMDkxODM4NWRiZDk2NTZjYWIwZDFkODFiYTc0NTNkNDliYmMxNjI1MAlyZWZzL3RhZ3MvanVuaW8tZ3BnLXB1YgorCSQgZ2l0IGxzLXJlbW90ZSBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdCBtYXN0ZXIgcHUgcmMKKwk1ZmU5NzhhNTM4MWYxZmJhZDI2YTgwZTY4MmRkZDJhNDAxOTY2NzQwCXJlZnMvaGVhZHMvbWFzdGVyCisJYzc4MWE4NGI1MjA0ZmIyOTRjOWNjYzc5ZjhiM2JhY2VlYjMyYzA2MQlyZWZzL2hlYWRzL3B1CisJYjFkMDk2ZjI5MjZjNGUzN2M5YzBiNmE3YmYyMTE5YmVkYWEyNzdjYglyZWZzL2hlYWRzL3JjCisJJCBlY2hvIGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0ID4uZ2l0L2JyYW5jaGVzL3B1YmxpYworCSQgZ2l0IGxzLXJlbW90ZSAtLXRhZ3MgcHVibGljIHZcKgorCWQ2NjAyZWM1MTk0Yzg3YjBmYzg3MTAzY2E0ZDY3MjUxYzc2ZjIzM2EJcmVmcy90YWdzL3YwLjk5CisJZjI1YTI2NWEzNDJhZWQ2MDQxYWIwY2M0ODQyMjRkOWNhNTRiNmY0MQlyZWZzL3RhZ3MvdjAuOTkuMQorCWM1ZGI1NDU2YWUzYjA4NzNmYzY1OWMxOWZhZmRkZTIyMzEzY2M0NDEJcmVmcy90YWdzL3YwLjk5LjIKKwk3Y2VjYTI3NWQwNDdjOTBjMGM3ZDVhZmIxM2FiOTdlZmRmNTFiZDZlCXJlZnMvdGFncy92MC45OS4zCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4M2JhYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CkBAIC0wLDAgKzEsODMgQEAKK2dpdC1scy10cmVlKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbHMtdHJlZSAtIExpc3RzIHRoZSBjb250ZW50cyBvZiBhIHRyZWUgb2JqZWN0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LWxzLXRyZWUnIFstZF0gWy1yXSBbLXRdIFstel0KKwkgICAgWy0tbmFtZS1vbmx5XSBbLS1uYW1lLXN0YXR1c10gWy0tZnVsbC1uYW1lXSBbLS1hYmJyZXY9WzxuPl1dCisJICAgIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0xpc3RzIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIHRyZWUgb2JqZWN0LCBsaWtlIHdoYXQgIi9iaW4vbHMgLWEiIGRvZXMKK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBOb3RlIHRoYXQgdGhlIHVzYWdlIGlzIHN1YnRseSBkaWZmZXJlbnQsCit0aG91Z2ggLSAncGF0aHMnIGRlbm90ZSBqdXN0IGEgbGlzdCBvZiBwYXR0ZXJucyB0byBtYXRjaCwgZS5nLiBzbyBzcGVjaWZ5aW5nCitkaXJlY3RvcnkgbmFtZSAod2l0aG91dCAnLXInKSB3aWxsIGJlaGF2ZSBkaWZmZXJlbnRseSwgYW5kIG9yZGVyIG9mIHRoZQorYXJndW1lbnRzIGRvZXMgbm90IG1hdHRlci4KKworT1BUSU9OUworLS0tLS0tLQorPHRyZWUtaXNoPjo6CisJSWQgb2YgYSB0cmVlLWlzaC4KKworLWQ6OgorCVNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4uCisKKy1yOjoKKwlSZWN1cnNlIGludG8gc3ViLXRyZWVzLgorCistdDo6CisJU2hvdyB0cmVlIGVudHJpZXMgZXZlbiB3aGVuIGdvaW5nIHRvIHJlY3Vyc2UgdGhlbS4gSGFzIG5vIGVmZmVjdAorCWlmICctcicgd2FzIG5vdCBwYXNzZWQuICctZCcgaW1wbGllcyAnLXQnLgorCistejo6CisJXDAgbGluZSB0ZXJtaW5hdGlvbiBvbiBvdXRwdXQuCisKKy0tbmFtZS1vbmx5OjoKKy0tbmFtZS1zdGF0dXM6OgorCUxpc3Qgb25seSBmaWxlbmFtZXMgKGluc3RlYWQgb2YgdGhlICJsb25nIiBvdXRwdXQpLCBvbmUgcGVyIGxpbmUuCisKKy0tYWJicmV2Wz08bj5dOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZ1bGwgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QKKwlsaW5lcywgc2hvdyBvbmx5IGhhbmRmdWwgaGV4ZGlnaXRzIHByZWZpeC4KKwlOb24gZGVmYXVsdCBudW1iZXIgb2YgZGlnaXRzIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCAtLWFiYnJldj08bj4uCisKKy0tZnVsbC1uYW1lOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIHBhdGggbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZworCWRpcmVjdG9yeSwgc2hvdyB0aGUgZnVsbCBwYXRoIG5hbWVzLgorCitwYXRoczo6CisJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3cgdGhlbSAobm90ZSB0aGF0IHRoaXMgaXNuJ3QgcmVhbGx5IHJhdworCXBhdGhuYW1lcywgYnV0IHJhdGhlciBhIGxpc3Qgb2YgcGF0dGVybnMgdG8gbWF0Y2gpLiAgT3RoZXJ3aXNlCisJaW1wbGljaXRseSB1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisKKworT3V0cHV0IEZvcm1hdAorLS0tLS0tLS0tLS0tLQorICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKworV2hlbiB0aGUgYC16YCBvcHRpb24gaXMgbm90IHVzZWQsIFRBQiwgTEYsIGFuZCBiYWNrc2xhc2ggY2hhcmFjdGVycworaW4gcGF0aG5hbWVzIGFyZSByZXByZXNlbnRlZCBhcyBgXHRgLCBgXG5gLCBhbmQgYFxcYCwgcmVzcGVjdGl2ZWx5LgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFBldHIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6PgorQ29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4sCithbm90aGVyIG1ham9yIHJld3JpdGUgYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0Cis8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsaW5mby50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsaW5mby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwYTA2NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1haWxpbmZvLnR4dApAQCAtMCwwICsxLDcyIEBACitnaXQtbWFpbGluZm8oMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWFpbGluZm8gLSBFeHRyYWN0cyBwYXRjaCBmcm9tIGEgc2luZ2xlIGUtbWFpbCBtZXNzYWdlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1haWxpbmZvJyBbLWtdIFstdSB8IC0tZW5jb2Rpbmc9PGVuY29kaW5nPl0gPG1zZz4gPHBhdGNoPgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZGluZyBhIHNpbmdsZSBlLW1haWwgbWVzc2FnZSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgYW5kCit3cml0ZXMgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpbiA8bXNnPiBmaWxlLCBhbmQgdGhlIHBhdGNoZXMgaW4KKzxwYXRjaD4gZmlsZS4gIFRoZSBhdXRob3IgbmFtZSwgZS1tYWlsIGFuZCBlLW1haWwgc3ViamVjdCBhcmUKK3dyaXR0ZW4gb3V0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgdG8gYmUgdXNlZCBieSBnaXQtYXBwbHlwYXRjaAordG8gY3JlYXRlIGEgY29tbWl0LiAgSXQgaXMgdXN1YWxseSBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzCitjb21tYW5kIGRpcmVjdGx5LgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1rOjoKKwlVc3VhbGx5IHRoZSBwcm9ncmFtICdjbGVhbnMgdXAnIHRoZSBTdWJqZWN0OiBoZWFkZXIgbGluZQorCXRvIGV4dHJhY3QgdGhlIHRpdGxlIGxpbmUgZm9yIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UsCisJYW1vbmcgd2hpY2ggKDEpIHJlbW92ZSAnUmU6JyBvciAncmU6JywgKDIpIGxlYWRpbmcKKwl3aGl0ZXNwYWNlcywgKDMpICdbJyB1cCB0byAnXScsIHR5cGljYWxseSAnW1BBVENIXScsIGFuZAorCXRoZW4gcHJlcGVuZHMgIltQQVRDSF0gIi4gIFRoaXMgZmxhZyBmb3JiaWRzIHRoaXMKKwltdW5naW5nLCBhbmQgaXMgbW9zdCB1c2VmdWwgd2hlbiB1c2VkIHRvIHJlYWQgYmFjayAnZ2l0CisJZm9ybWF0LXBhdGNoIC0tbWJveCcgb3V0cHV0LgorCistdTo6CisJQnkgZGVmYXVsdCwgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSwgYXV0aG9yIG5hbWUgYW5kCisJYXV0aG9yIGVtYWlsIGFyZSB0YWtlbiBmcm9tIHRoZSBlLW1haWwgd2l0aG91dCBhbnkKKwljaGFyc2V0IGNvbnZlcnNpb24sIGFmdGVyIG1pbmltYWxseSBkZWNvZGluZyBNSU1FCisJdHJhbnNmZXIgZW5jb2RpbmcuICBUaGlzIGZsYWcgY2F1c2VzIHRoZSByZXN1bHRpbmcKKwljb21taXQgdG8gYmUgZW5jb2RlZCBpbiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5CisJaTE4bi5jb21taXRlbmNvZGluZyBjb25maWd1cmF0aW9uIChkZWZhdWx0cyB0byB1dGYtOCkgYnkKKwl0cmFuc2xpdGVyYXRpbmcgdGhlbS4gCisJTm90ZSB0aGF0IHRoZSBwYXRjaCBpcyBhbHdheXMgdXNlZCBhcyBpcyB3aXRob3V0IGNoYXJzZXQKKwljb252ZXJzaW9uLCBldmVuIHdpdGggdGhpcyBmbGFnLgorCistLWVuY29kaW5nPTxlbmNvZGluZz46OgorCVNpbWlsYXIgdG8gLXUgYnV0IGlmIHRoZSBsb2NhbCBjb252ZW50aW9uIGlzIGRpZmZlcmVudAorCWZyb20gd2hhdCBpcyBzcGVjaWZpZWQgYnkgaTE4bi5jb21taXRlbmNvZGluZywgdGhpcyBmbGFnCisJY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgaXQuCisKKzxtc2c+OjoKKwlUaGUgY29tbWl0IGxvZyBtZXNzYWdlIGV4dHJhY3RlZCBmcm9tIGUtbWFpbCwgdXN1YWxseQorCWV4Y2VwdCB0aGUgdGl0bGUgbGluZSB3aGljaCBjb21lcyBmcm9tIGUtbWFpbCBTdWJqZWN0LgorCis8cGF0Y2g+OjoKKwlUaGUgcGF0Y2ggZXh0cmFjdGVkIGZyb20gZS1tYWlsLgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tYWlsc3BsaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWFpbHNwbGl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE3ODAxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWFpbHNwbGl0LnR4dApAQCAtMCwwICsxLDUyIEBACitnaXQtbWFpbHNwbGl0KDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tYWlsc3BsaXQgLSBUb3RhbGx5IGJyYWluZGFtYWdlZCBtYm94IHNwbGl0dGVyIHByb2dyYW0KKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW1haWxzcGxpdCcgWy1iXSBbLWY8bm4+XSBbLWQ8cHJlYz5dIC1vPGRpcmVjdG9yeT4gWy0tXSBbPG1ib3g+Li4uXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1NwbGl0cyBhIG1ib3ggZmlsZSBpbnRvIGEgbGlzdCBvZiBmaWxlczogIjAwMDEiICIwMDAyIiAuLiAgaW4gdGhlIHNwZWNpZmllZAorZGlyZWN0b3J5IHNvIHlvdSBjYW4gcHJvY2VzcyB0aGVtIGZ1cnRoZXIgZnJvbSB0aGVyZS4KKworT1BUSU9OUworLS0tLS0tLQorPG1ib3g+OjoKKwlNYm94IGZpbGUgdG8gc3BsaXQuICBJZiBub3QgZ2l2ZW4sIHRoZSBtYm94IGlzIHJlYWQgZnJvbQorCXRoZSBzdGFuZGFyZCBpbnB1dC4KKworPGRpcmVjdG9yeT46OgorCURpcmVjdG9yeSBpbiB3aGljaCB0byBwbGFjZSB0aGUgaW5kaXZpZHVhbCBtZXNzYWdlcy4KKworLWI6OgorCUlmIGFueSBmaWxlIGRvZXNuJ3QgYmVnaW4gd2l0aCBhIEZyb20gbGluZSwgYXNzdW1lIGl0IGlzIGEKKwlzaW5nbGUgbWFpbCBtZXNzYWdlIGluc3RlYWQgb2Ygc2lnbmFsaW5nIGVycm9yLgorCistZDxwcmVjPjo6CisJSW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0IGRpZ2l0cyB3aXRoIGxlYWRpbmcgemVyb3MsCisJZGlmZmVyZW50IHByZWNpc2lvbiBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGUgZ2VuZXJhdGVkCisJZmlsZW5hbWVzLgorCistZjxubj46OgorCVNraXAgdGhlIGZpcnN0IDxubj4gbnVtYmVycywgZm9yIGV4YW1wbGUgaWYgLWYzIGlzIHNwZWNpZmllZCwKKwlzdGFydCB0aGUgbnVtYmVyaW5nIHdpdGggMDAwNC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorYW5kIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWJhc2UudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtYmFzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5OWJlMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLWJhc2UudHh0CkBAIC0wLDAgKzEsNDMgQEAKK2dpdC1tZXJnZS1iYXNlKDEpCis9PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2UtYmFzZSAtIEZpbmRzIGFzIGdvb2QgYSBjb21tb24gYW5jZXN0b3IgYXMgcG9zc2libGUgZm9yIGEgbWVyZ2UKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2UtYmFzZScgWy0tYWxsXSA8Y29tbWl0PiA8Y29tbWl0PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworImdpdC1tZXJnZS1iYXNlIiBmaW5kcyBhcyBnb29kIGEgY29tbW9uIGFuY2VzdG9yIGFzIHBvc3NpYmxlIGJldHdlZW4KK3RoZSB0d28gY29tbWl0cy4gVGhhdCBpcywgZ2l2ZW4gdHdvIGNvbW1pdHMgQSBhbmQgQiAnZ2l0LW1lcmdlLWJhc2UgQQorQicgd2lsbCBvdXRwdXQgYSBjb21taXQgd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gYm90aCBBIGFuZCBCIHRocm91Z2gKK3RoZSBwYXJlbnQgcmVsYXRpb25zaGlwLgorCitHaXZlbiBhIHNlbGVjdGlvbiBvZiBlcXVhbGx5IGdvb2QgY29tbW9uIGFuY2VzdG9ycyBpdCBzaG91bGQgbm90IGJlCityZWxpZWQgb24gdG8gZGVjaWRlIGluIGFueSBwYXJ0aWN1bGFyIHdheS4KKworVGhlICJnaXQtbWVyZ2UtYmFzZSIgYWxnb3JpdGhtIGlzIHN0aWxsIGluIGZsdXggLSB1c2UgdGhlIHNvdXJjZS4uLgorCitPUFRJT05TCistLS0tLS0tCistLWFsbDo6CisJT3V0cHV0IGFsbCBjb21tb24gYW5jZXN0b3JzIGZvciB0aGUgdHdvIGNvbW1pdHMgaW5zdGVhZCBvZgorCWp1c3Qgb25lLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtaW5kZXgudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtaW5kZXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZDA2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS1pbmRleC50eHQKQEAgLTAsMCArMSw4OCBAQAorZ2l0LW1lcmdlLWluZGV4KDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LW1lcmdlLWluZGV4IC0gUnVucyBhIG1lcmdlIGZvciBmaWxlcyBuZWVkaW5nIG1lcmdpbmcKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWVyZ2UtaW5kZXgnIFstb10gWy1xXSA8bWVyZ2UtcHJvZ3JhbT4gKC1hIHwgXC0tIHwgPGZpbGU+XCopCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBsb29rcyB1cCB0aGUgPGZpbGU+KHMpIGluIHRoZSBpbmRleCBhbmQsIGlmIHRoZXJlIGFyZSBhbnkgbWVyZ2UKK2VudHJpZXMsIHBhc3NlcyB0aGUgU0hBMSBoYXNoIGZvciB0aG9zZSBmaWxlcyBhcyBhcmd1bWVudHMgMSwgMiwgMyAoZW1wdHkKK2FyZ3VtZW50IGlmIG5vIGZpbGUpLCBhbmQgPGZpbGU+IGFzIGFyZ3VtZW50IDQuICBGaWxlIG1vZGVzIGZvciB0aGUgdGhyZWUKK2ZpbGVzIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIDUsIDYgYW5kIDcuCisKK09QVElPTlMKKy0tLS0tLS0KK1wtLTo6CisJRG8gbm90IGludGVycHJldCBhbnkgbW9yZSBhcmd1bWVudHMgYXMgb3B0aW9ucy4KKworLWE6OgorCVJ1biBtZXJnZSBhZ2FpbnN0IGFsbCBmaWxlcyBpbiB0aGUgaW5kZXggdGhhdCBuZWVkIG1lcmdpbmcuCisKKy1vOjoKKwlJbnN0ZWFkIG9mIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBmYWlsZWQgbWVyZ2UsIGRvIGFsbCBvZiB0aGVtCisJaW4gb25lIHNob3QgLSBjb250aW51ZSB3aXRoIG1lcmdpbmcgZXZlbiB3aGVuIHByZXZpb3VzIG1lcmdlcworCXJldHVybmVkIGVycm9ycywgYW5kIG9ubHkgcmV0dXJuIHRoZSBlcnJvciBjb2RlIGFmdGVyIGFsbCB0aGUKKwltZXJnZXMgYXJlIG92ZXIuCisKKy1xOjoKKwlEbyBub3QgY29tcGxhaW4gYWJvdXQgZmFpbGVkIG1lcmdlIHByb2dyYW0gKHRoZSBtZXJnZSBwcm9ncmFtCisJZmFpbHVyZSB1c3VhbGx5IGluZGljYXRlcyBjb25mbGljdHMgZHVyaW5nIG1lcmdlKS4gVGhpcyBpcyBmb3IKKwlwb3JjZWxhaW5zIHdoaWNoIG1pZ2h0IHdhbnQgdG8gZW1pdCBjdXN0b20gbWVzc2FnZXMuCisKK0lmICJnaXQtbWVyZ2UtaW5kZXgiIGlzIGNhbGxlZCB3aXRoIG11bHRpcGxlIDxmaWxlPnMgKG9yIC1hKSB0aGVuIGl0Citwcm9jZXNzZXMgdGhlbSBpbiB0dXJuIG9ubHkgc3RvcHBpbmcgaWYgbWVyZ2UgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQKK2NvZGUuCisKK1R5cGljYWxseSB0aGlzIGlzIHJ1biB3aXRoIHRoZSBhIHNjcmlwdCBjYWxsaW5nIHRoZSBtZXJnZSBjb21tYW5kIGZyb20KK3RoZSBSQ1MgcGFja2FnZS4KKworQSBzYW1wbGUgc2NyaXB0IGNhbGxlZCAiZ2l0LW1lcmdlLW9uZS1maWxlIiBpcyBpbmNsdWRlZCBpbiB0aGUKK2Rpc3RyaWJ1dGlvbi4KKworQUxFUlQgQUxFUlQgQUxFUlQhIFRoZSBnaXQgIm1lcmdlIG9iamVjdCBvcmRlciIgaXMgZGlmZmVyZW50IGZyb20gdGhlCitSQ1MgIm1lcmdlIiBwcm9ncmFtIG1lcmdlIG9iamVjdCBvcmRlci4gSW4gdGhlIGFib3ZlIG9yZGVyaW5nLCB0aGUKK29yaWdpbmFsIGlzIGZpcnN0LiBCdXQgdGhlIGFyZ3VtZW50IG9yZGVyIHRvIHRoZSAzLXdheSBtZXJnZSBwcm9ncmFtCisibWVyZ2UiIGlzIHRvIGhhdmUgdGhlIG9yaWdpbmFsIGluIHRoZSBtaWRkbGUuIERvbid0IGFzayBtZSB3aHkuCisKK0V4YW1wbGVzOgorCisgIHRvcnZhbGRzQHBwYzk3MDp+L21lcmdlLXRlc3Q+IGdpdC1tZXJnZS1pbmRleCBjYXQgTU0KKyAgVGhpcyBpcyBNTSBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLgkJCSMgb3JpZ2luYWwKKyAgVGhpcyBpcyBtb2RpZmllZCBNTSBpbiB0aGUgYnJhbmNoIEEuCQkJIyBtZXJnZTEKKyAgVGhpcyBpcyBtb2RpZmllZCBNTSBpbiB0aGUgYnJhbmNoIEIuCQkJIyBtZXJnZTIKKyAgVGhpcyBpcyBtb2RpZmllZCBNTSBpbiB0aGUgYnJhbmNoIEIuCQkJIyBjdXJyZW50IGNvbnRlbnRzCisKK29yIAorCisgIHRvcnZhbGRzQHBwYzk3MDp+L21lcmdlLXRlc3Q+IGdpdC1tZXJnZS1pbmRleCBjYXQgQUEgTU0KKyAgY2F0OiA6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgVGhpcyBpcyBhZGRlZCBBQSBpbiB0aGUgYnJhbmNoIEEuCisgIFRoaXMgaXMgYWRkZWQgQUEgaW4gdGhlIGJyYW5jaCBCLgorICBUaGlzIGlzIGFkZGVkIEFBIGluIHRoZSBicmFuY2ggQi4KKyAgZmF0YWw6IG1lcmdlIHByb2dyYW0gZmFpbGVkCisKK3doZXJlIHRoZSBsYXR0ZXIgZXhhbXBsZSBzaG93cyBob3cgImdpdC1tZXJnZS1pbmRleCIgd2lsbCBzdG9wIHRyeWluZyB0bworbWVyZ2Ugb25jZSBhbnl0aGluZyBoYXMgcmV0dXJuZWQgYW4gZXJyb3IgKGkuZS4sICJjYXQiIHJldHVybmVkIGFuIGVycm9yCitmb3IgdGhlIEFBIGZpbGUsIGJlY2F1c2UgaXQgZGlkbid0IGV4aXN0IGluIHRoZSBvcmlnaW5hbCwgYW5kIHRodXMKKyJnaXQtbWVyZ2UtaW5kZXgiIGRpZG4ndCBldmVuIHRyeSB0byBtZXJnZSB0aGUgTU0gdGhpbmcpLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CitPbmUtc2hvdCBtZXJnZSBieSBQZXRyIEJhdWRpcyA8cGFza3lAdWN3LmN6PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLW9uZS1maWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLW9uZS1maWxlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFhZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2Utb25lLWZpbGUudHh0CkBAIC0wLDAgKzEsMzAgQEAKK2dpdC1tZXJnZS1vbmUtZmlsZSgxKQorPT09PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS1vbmUtZmlsZSAtIFRoZSBzdGFuZGFyZCBoZWxwZXIgcHJvZ3JhbSB0byB1c2Ugd2l0aCAiZ2l0LW1lcmdlLWluZGV4IgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tZXJnZS1vbmUtZmlsZScKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGlzIHRoZSBzdGFuZGFyZCBoZWxwZXIgcHJvZ3JhbSB0byB1c2Ugd2l0aCAiZ2l0LW1lcmdlLWluZGV4IgordG8gcmVzb2x2ZSBhIG1lcmdlIGFmdGVyIHRoZSB0cml2aWFsIG1lcmdlIGRvbmUgd2l0aCAiZ2l0LXJlYWQtdHJlZSAtbSIuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBQZXRyIEJhdWRpcyA8cGFza3lAc3VzZS5jej4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tZXJnZS10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZiNGZiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UtdHJlZS50eHQKQEAgLTAsMCArMSwzNyBAQAorZ2l0LW1lcmdlLXRyZWUoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1tZXJnZS10cmVlIC0gU2hvdyB0aHJlZS13YXkgbWVyZ2Ugd2l0aG91dCB0b3VjaGluZyBpbmRleAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tZXJnZS10cmVlJyA8YmFzZS10cmVlPiA8YnJhbmNoMT4gPGJyYW5jaDI+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZHMgdGhyZWUgdHJlZWlzaCwgYW5kIG91dHB1dCB0cml2aWFsIG1lcmdlIHJlc3VsdHMgYW5kCitjb25mbGljdGluZyBzdGFnZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIFRoaXMgaXMgc2ltaWxhciB0bword2hhdCB0aHJlZS13YXkgcmVhZC10cmVlIC1tIGRvZXMsIGJ1dCBpbnN0ZWFkIG9mIHN0b3JpbmcgdGhlCityZXN1bHRzIGluIHRoZSBpbmRleCwgdGhlIGNvbW1hbmQgb3V0cHV0cyB0aGUgZW50cmllcyB0byB0aGUKK3N0YW5kYXJkIG91dHB1dC4KKworVGhpcyBpcyBtZWFudCB0byBiZSB1c2VkIGJ5IGhpZ2hlciBsZXZlbCBzY3JpcHRzIHRvIGNvbXB1dGUKK21lcmdlIHJlc3VsdHMgb3V0c2lkZSBpbmRleCwgYW5kIHN0dWZmIHRoZSByZXN1bHRzIGJhY2sgaW50byB0aGUKK2luZGV4LiAgRm9yIHRoaXMgcmVhc29uLCB0aGUgb3V0cHV0IGZyb20gdGhlIGNvbW1hbmQgb21pdHMKK2VudHJpZXMgdGhhdCBtYXRjaCA8YnJhbmNoMT4gdHJlZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1lcmdlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJmMzBhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbWVyZ2UudHh0CkBAIC0wLDAgKzEsMTU4IEBACitnaXQtbWVyZ2UoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWVyZ2UgLSBHcmFuZCBVbmlmaWVkIE1lcmdlIERyaXZlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1tZXJnZScgWy1uXSBbLS1uby1jb21taXRdIFstcyA8c3RyYXRlZ3k+XS4uLiA8bXNnPiA8aGVhZD4gPHJlbW90ZT4gPHJlbW90ZT4uLi4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgaXMgdGhlIHRvcC1sZXZlbCB1c2VyIGludGVyZmFjZSB0byB0aGUgbWVyZ2UgbWFjaGluZXJ5Cit3aGljaCBkcml2ZXMgbXVsdGlwbGUgbWVyZ2Ugc3RyYXRlZ3kgc2NyaXB0cy4KKworCitPUFRJT05TCistLS0tLS0tCitpbmNsdWRlOjptZXJnZS1vcHRpb25zLnR4dFtdCisKKzxtc2c+OjoKKwlUaGUgY29tbWl0IG1lc3NhZ2UgdG8gYmUgdXNlZCBmb3IgdGhlIG1lcmdlIGNvbW1pdCAoaW4gY2FzZQorCWl0IGlzIGNyZWF0ZWQpLiBUaGUgYGdpdC1mbXQtbWVyZ2UtbXNnYCBzY3JpcHQgY2FuIGJlIHVzZWQKKwl0byBnaXZlIGEgZ29vZCBkZWZhdWx0IGZvciBhdXRvbWF0ZWQgYGdpdC1tZXJnZWAgaW52b2NhdGlvbnMuCisKKzxoZWFkPjo6CisJb3VyIGJyYW5jaCBoZWFkIGNvbW1pdC4KKworPHJlbW90ZT46OgorCW90aGVyIGJyYW5jaCBoZWFkIG1lcmdlZCBpbnRvIG91ciBicmFuY2guICBZb3UgbmVlZCBhdAorCWxlYXN0IG9uZSA8cmVtb3RlPi4gIFNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSA8cmVtb3RlPgorCW9idmlvdXNseSBtZWFucyB5b3UgYXJlIHRyeWluZyBhbiBPY3RvcHVzLgorCitpbmNsdWRlOjptZXJnZS1zdHJhdGVnaWVzLnR4dFtdCisKKworSWYgeW91IHRyaWVkIGEgbWVyZ2Ugd2hpY2ggcmVzdWx0ZWQgaW4gYSBjb21wbGV4IGNvbmZsaWN0cyBhbmQKK3dvdWxkIHdhbnQgdG8gc3RhcnQgb3ZlciwgeW91IGNhbiByZWNvdmVyIHdpdGgKK2dpdGxpbms6Z2l0LXJlc2V0WzFdLgorCisKK0hPVyBNRVJHRSBXT1JLUworLS0tLS0tLS0tLS0tLS0tCisKK0EgbWVyZ2UgaXMgYWx3YXlzIGJldHdlZW4gdGhlIGN1cnJlbnQgYEhFQURgIGFuZCBvbmUgb3IgbW9yZQorcmVtb3RlIGJyYW5jaCBoZWFkcywgYW5kIHRoZSBpbmRleCBmaWxlIG11c3QgZXhhY3RseSBtYXRjaCB0aGUKK3RyZWUgb2YgYEhFQURgIGNvbW1pdCAoaS5lLiB0aGUgY29udGVudHMgb2YgdGhlIGxhc3QgY29tbWl0KSB3aGVuCitpdCBoYXBwZW5zLiAgSW4gb3RoZXIgd29yZHMsIGBnaXQtZGlmZiAtLWNhY2hlZCBIRUFEYCBtdXN0CityZXBvcnQgbm8gY2hhbmdlcy4KKworW05PVEVdCitUaGlzIGlzIGEgYml0IG9mIGxpZS4gIEluIGNlcnRhaW4gc3BlY2lhbCBjYXNlcywgeW91ciBpbmRleCBhcmUKK2FsbG93ZWQgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIHRyZWUgb2YgYEhFQURgIGNvbW1pdC4gIFRoZSBtb3N0Citub3RhYmxlIGNhc2UgaXMgd2hlbiB5b3VyIGBIRUFEYCBjb21taXQgaXMgYWxyZWFkeSBhaGVhZCBvZiB3aGF0CitpcyBiZWluZyBtZXJnZWQsIGluIHdoaWNoIGNhc2UgeW91ciBpbmRleCBjYW4gaGF2ZSBhcmJpdHJhcnkKK2RpZmZlcmVuY2UgZnJvbSB5b3VyIGBIRUFEYCBjb21taXQuICBPdGhlcndpc2UsIHlvdXIgaW5kZXggZW50cmllcworYXJlIGFsbG93ZWQgaGF2ZSBkaWZmZXJlbmNlcyBmcm9tIHlvdXIgYEhFQURgIGNvbW1pdCB0aGF0IG1hdGNoCit0aGUgcmVzdWx0IG9mIHRyaXZpYWwgbWVyZ2UgKGUuZy4geW91IHJlY2VpdmVkIHRoZSBzYW1lIHBhdGNoCitmcm9tIGV4dGVybmFsIHNvdXJjZSB0byBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdCBhcyB3aGF0IHlvdSBhcmUKK21lcmdpbmcpLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0aCBkaWQgbm90IGV4aXN0IGluIHRoZSBjb21tb24KK2FuY2VzdG9yIGFuZCB5b3VyIGhlYWQgY29tbWl0IGJ1dCBleGlzdHMgaW4gdGhlIHRyZWUgeW91IGFyZQorbWVyZ2luZyBpbnRvIHlvdXIgcmVwb3NpdG9yeSwgYW5kIGlmIHlvdSBhbHJlYWR5IGhhcHBlbiB0byBoYXZlCit0aGF0IHBhdGggZXhhY3RseSBpbiB5b3VyIGluZGV4LCB0aGUgbWVyZ2UgZG9lcyBub3QgaGF2ZSB0bworZmFpbC4KKworT3RoZXJ3aXNlLCBtZXJnZSB3aWxsIHJlZnVzZSB0byBkbyBhbnkgaGFybSB0byB5b3VyIHJlcG9zaXRvcnkKKyh0aGF0IGlzLCBpdCBtYXkgZmV0Y2ggdGhlIG9iamVjdHMgZnJvbSByZW1vdGUsIGFuZCBpdCBtYXkgZXZlbgordXBkYXRlIHRoZSBsb2NhbCBicmFuY2ggdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSByZW1vdGUgYnJhbmNoCit3aXRoIGBnaXQgcHVsbCByZW1vdGUgcmJyYW5jaDpsYnJhbmNoYCwgYnV0IHlvdXIgd29ya2luZyB0cmVlLAorYC5naXQvSEVBRGAgcG9pbnRlciBhbmQgaW5kZXggZmlsZSBhcmUgbGVmdCBpbnRhY3QpLgorCitZb3UgbWF5IGhhdmUgbG9jYWwgbW9kaWZpY2F0aW9ucyBpbiB0aGUgd29ya2luZyB0cmVlIGZpbGVzLiAgSW4KK290aGVyIHdvcmRzLCBgZ2l0LWRpZmZgIGlzIGFsbG93ZWQgdG8gcmVwb3J0IGNoYW5nZXMuCitIb3dldmVyLCB0aGUgbWVyZ2UgdXNlcyB5b3VyIHdvcmtpbmcgdHJlZSBhcyB0aGUgd29ya2luZyBhcmVhLAorYW5kIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlIG1lcmdlIG9wZXJhdGlvbiBmcm9tIGxvc2luZyBzdWNoCitjaGFuZ2VzLCBpdCBtYWtlcyBzdXJlIHRoYXQgdGhleSBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlCittZXJnZS4gVGhvc2UgY29tcGxleCB0YWJsZXMgaW4gcmVhZC10cmVlIGRvY3VtZW50YXRpb24gZGVmaW5lCit3aGF0IGl0IG1lYW5zIGZvciBhIHBhdGggdG8gImludGVyZmVyZSB3aXRoIHRoZSBtZXJnZSIuICBBbmQgaWYKK3lvdXIgbG9jYWwgbW9kaWZpY2F0aW9ucyBpbnRlcmZlcmUgd2l0aCB0aGUgbWVyZ2UsIGFnYWluLCBpdAorc3RvcHMgYmVmb3JlIHRvdWNoaW5nIGFueXRoaW5nLgorCitTbyBpbiB0aGUgYWJvdmUgdHdvICJmYWlsZWQgbWVyZ2UiIGNhc2UsIHlvdSBkbyBub3QgaGF2ZSB0bword29ycnkgYWJvdXQgbG9zcyBvZiBkYXRhIC0tLSB5b3Ugc2ltcGx5IHdlcmUgbm90IHJlYWR5IHRvIGRvCithIG1lcmdlLCBzbyBubyBtZXJnZSBoYXBwZW5lZCBhdCBhbGwuICBZb3UgbWF5IHdhbnQgdG8gZmluaXNoCit3aGF0ZXZlciB5b3Ugd2VyZSBpbiB0aGUgbWlkZGxlIG9mIGRvaW5nLCBhbmQgcmV0cnkgdGhlIHNhbWUKK3B1bGwgYWZ0ZXIgeW91IGFyZSBkb25lIGFuZCByZWFkeS4KKworV2hlbiB0aGluZ3MgY2xlYW5seSBtZXJnZSwgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKworMS4gdGhlIHJlc3VsdHMgYXJlIHVwZGF0ZWQgYm90aCBpbiB0aGUgaW5kZXggZmlsZSBhbmQgaW4geW91cgorICAgd29ya2luZyB0cmVlLAorMi4gaW5kZXggZmlsZSBpcyB3cml0dGVuIG91dCBhcyBhIHRyZWUsCiszLiB0aGUgdHJlZSBnZXRzIGNvbW1pdHRlZCwgYW5kIAorNC4gdGhlIGBIRUFEYCBwb2ludGVyIGdldHMgYWR2YW5jZWQuCisKK0JlY2F1c2Ugb2YgMi4sIHdlIHJlcXVpcmUgdGhhdCB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIGluZGV4CitmaWxlIHRvIG1hdGNoIGV4YWN0bHkgdGhlIGN1cnJlbnQgYEhFQURgIGNvbW1pdDsgb3RoZXJ3aXNlIHdlCit3aWxsIHdyaXRlIG91dCB5b3VyIGxvY2FsIGNoYW5nZXMgYWxyZWFkeSByZWdpc3RlcmVkIGluIHlvdXIKK2luZGV4IGZpbGUgYWxvbmcgd2l0aCB0aGUgbWVyZ2UgcmVzdWx0LCB3aGljaCBpcyBub3QgZ29vZC4KK0JlY2F1c2UgMS4gaW52b2x2ZXMgb25seSB0aGUgcGF0aHMgZGlmZmVyZW50IGJldHdlZW4geW91cgorYnJhbmNoIGFuZCB0aGUgcmVtb3RlIGJyYW5jaCB5b3UgYXJlIHB1bGxpbmcgZnJvbSBkdXJpbmcgdGhlCittZXJnZSAod2hpY2ggaXMgdHlwaWNhbGx5IGEgZnJhY3Rpb24gb2YgdGhlIHdob2xlIHRyZWUpLCB5b3UgY2FuCitoYXZlIGxvY2FsIG1vZGlmaWNhdGlvbnMgaW4geW91ciB3b3JraW5nIHRyZWUgYXMgbG9uZyBhcyB0aGV5IGRvCitub3Qgb3ZlcmxhcCB3aXRoIHdoYXQgdGhlIG1lcmdlIHVwZGF0ZXMuCisKK1doZW4gdGhlcmUgYXJlIGNvbmZsaWN0cywgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKworMS4gYEhFQURgIHN0YXlzIHRoZSBzYW1lLgorCisyLiBDbGVhbmx5IG1lcmdlZCBwYXRocyBhcmUgdXBkYXRlZCBib3RoIGluIHRoZSBpbmRleCBmaWxlIGFuZAorICAgaW4geW91ciB3b3JraW5nIHRyZWUuCisKKzMuIEZvciBjb25mbGljdGluZyBwYXRocywgdGhlIGluZGV4IGZpbGUgcmVjb3JkcyB1cCB0byB0aHJlZQorICAgdmVyc2lvbnM7IHN0YWdlMSBzdG9yZXMgdGhlIHZlcnNpb24gZnJvbSB0aGUgY29tbW9uIGFuY2VzdG9yLAorICAgc3RhZ2UyIGZyb20gYEhFQURgLCBhbmQgc3RhZ2UzIGZyb20gdGhlIHJlbW90ZSBicmFuY2ggKHlvdQorICAgY2FuIGluc3BlY3QgdGhlIHN0YWdlcyB3aXRoIGBnaXQtbHMtZmlsZXMgLXVgKS4gIFRoZSB3b3JraW5nCisgICB0cmVlIGZpbGVzIGhhdmUgdGhlIHJlc3VsdCBvZiAibWVyZ2UiIHByb2dyYW07IGkuZS4gMy13YXkKKyAgIG1lcmdlIHJlc3VsdCB3aXRoIGZhbWlsaWFyIGNvbmZsaWN0IG1hcmtlcnMgYDw8PCA9PT0gPj4+YC4KKworNC4gTm8gb3RoZXIgY2hhbmdlcyBhcmUgZG9uZS4gIEluIHBhcnRpY3VsYXIsIHRoZSBsb2NhbAorICAgbW9kaWZpY2F0aW9ucyB5b3UgaGFkIGJlZm9yZSB5b3Ugc3RhcnRlZCBtZXJnZSB3aWxsIHN0YXkgdGhlCisgICBzYW1lIGFuZCB0aGUgaW5kZXggZW50cmllcyBmb3IgdGhlbSBzdGF5IGFzIHRoZXkgd2VyZSwKKyAgIGkuZS4gbWF0Y2hpbmcgYEhFQURgLgorCitBZnRlciBzZWVpbmcgYSBjb25mbGljdCwgeW91IGNhbiBkbyB0d28gdGhpbmdzOgorCisgKiBEZWNpZGUgbm90IHRvIG1lcmdlLiAgVGhlIG9ubHkgY2xlYW4tdXAgeW91IG5lZWQgYXJlIHRvIHJlc2V0CisgICB0aGUgaW5kZXggZmlsZSB0byB0aGUgYEhFQURgIGNvbW1pdCB0byByZXZlcnNlIDIuIGFuZCB0byBjbGVhbgorICAgdXAgd29ya2luZyB0cmVlIGNoYW5nZXMgbWFkZSBieSAyLiBhbmQgMy47IGBnaXQtcmVzZXRgIGNhbgorICAgYmUgdXNlZCBmb3IgdGhpcy4KKworICogUmVzb2x2ZSB0aGUgY29uZmxpY3RzLiAgYGdpdC1kaWZmYCB3b3VsZCByZXBvcnQgb25seSB0aGUKKyAgIGNvbmZsaWN0aW5nIHBhdGhzIGJlY2F1c2Ugb2YgdGhlIGFib3ZlIDIuIGFuZCAzLi4gIEVkaXQgdGhlCisgICB3b3JraW5nIHRyZWUgZmlsZXMgaW50byBhIGRlc2lyYWJsZSBzaGFwZSwgYGdpdC11cGRhdGUtaW5kZXhgCisgICB0aGVtLCB0byBtYWtlIHRoZSBpbmRleCBmaWxlIGNvbnRhaW4gd2hhdCB0aGUgbWVyZ2UgcmVzdWx0CisgICBzaG91bGQgYmUsIGFuZCBydW4gYGdpdC1jb21taXRgIHRvIGNvbW1pdCB0aGUgcmVzdWx0LgorCisKK1NFRSBBTFNPCistLS0tLS0tLQorZ2l0bGluazpnaXQtZm10LW1lcmdlLW1zZ1sxXSwgZ2l0bGluazpnaXQtcHVsbFsxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ta3RhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ta3RhZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2MGEzZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdGFnLnR4dApAQCAtMCwwICsxLDQ3IEBACitnaXQtbWt0YWcoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWt0YWcgLSBDcmVhdGVzIGEgdGFnIG9iamVjdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1ta3RhZycgPCBzaWduYXR1cmVfZmlsZQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGEgdGFnIGNvbnRlbnRzIG9uIHN0YW5kYXJkIGlucHV0IGFuZCBjcmVhdGVzIGEgdGFnIG9iamVjdAordGhhdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHNpZ24gb3RoZXIgb2JqZWN0cy4KKworVGhlIG91dHB1dCBpcyB0aGUgbmV3IHRhZydzIDxvYmplY3Q+IGlkZW50aWZpZXIuCisKK1RhZyBGb3JtYXQKKy0tLS0tLS0tLS0KK0EgdGFnIHNpZ25hdHVyZSBmaWxlIGhhcyBhIHZlcnkgc2ltcGxlIGZpeGVkIGZvcm1hdDogdGhyZWUgbGluZXMgb2YKKworICBvYmplY3QgPHNoYTE+CisgIHR5cGUgPHR5cGVuYW1lPgorICB0YWcgPHRhZ25hbWU+CisKK2ZvbGxvd2VkIGJ5IHNvbWUgJ29wdGlvbmFsJyBmcmVlLWZvcm0gc2lnbmF0dXJlIHRoYXQgZ2l0IGl0c2VsZgorZG9lc24ndCBjYXJlIGFib3V0LCBidXQgdGhhdCBjYW4gYmUgdmVyaWZpZWQgd2l0aCBncGcgb3Igc2ltaWxhci4KKworVGhlIHNpemUgb2YgdGhlIGZ1bGwgb2JqZWN0IGlzIGFydGlmaWNpYWxseSBsaW1pdGVkIHRvIDhrQi4gIChKdXN0CitiZWNhdXNlIEknbSBhIGxhenkgYmFzdGFyZCwgYW5kIGlmIHlvdSBjYW4ndCBmaXQgYSBzaWduYXR1cmUgaW4gdGhhdAorc2l6ZSwgeW91J3JlIGRvaW5nIHNvbWV0aGluZyB3cm9uZykKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtbWt0cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdHJlZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5ZWU2MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW1rdHJlZS50eHQKQEAgLTAsMCArMSwzNSBAQAorZ2l0LW1rdHJlZSgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbWt0cmVlIC0gQnVpbGQgYSB0cmVlLW9iamVjdCBmcm9tIGxzLXRyZWUgZm9ybWF0dGVkIHRleHQKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtbWt0cmVlJyBbLXpdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVhZHMgc3RhbmRhcmQgaW5wdXQgaW4gbm9uLXJlY3Vyc2l2ZSBgbHMtdHJlZWAgb3V0cHV0IGZvcm1hdCwKK2FuZCBjcmVhdGVzIGEgdHJlZSBvYmplY3QuICBUaGUgb2JqZWN0IG5hbWUgb2YgdGhlIHRyZWUgb2JqZWN0CitidWlsdCBpcyB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK09QVElPTlMKKy0tLS0tLS0KKy16OjoKKwlSZWFkIHRoZSBOVUwtdGVybWluYXRlZCBgbHMtdHJlZSAtemAgb3V0cHV0IGluc3RlYWQuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1tdi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1tdi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3YzQzYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW12LnR4dApAQCAtMCwwICsxLDU0IEBACitnaXQtbXYoMSkKKz09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbXYgLSBNb3ZlIG9yIHJlbmFtZSBhIGZpbGUsIGRpcmVjdG9yeSBvciBzeW1saW5rCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW12JyA8b3B0aW9ucz4uLi4gPGFyZ3M+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBtb3ZlIG9yIHJlbmFtZSBhIGZpbGUsIGRpcmVjdG9yeSBvciBzeW1saW5rLgorCisgZ2l0LW12IFstZl0gWy1uXSA8c291cmNlPiA8ZGVzdGluYXRpb24+CisgZ2l0LW12IFstZl0gWy1uXSBbLWtdIDxzb3VyY2U+IC4uLiA8ZGVzdGluYXRpb24gZGlyZWN0b3J5PgorCitJbiB0aGUgZmlyc3QgZm9ybSwgaXQgcmVuYW1lcyA8c291cmNlPiwgd2hpY2ggbXVzdCBleGlzdCBhbmQgYmUgZWl0aGVyCithIGZpbGUsIHN5bWxpbmsgb3IgZGlyZWN0b3J5LCB0byA8ZGVzdGluYXRpb24+LgorSW4gdGhlIHNlY29uZCBmb3JtLCB0aGUgbGFzdCBhcmd1bWVudCBoYXMgdG8gYmUgYW4gZXhpc3RpbmcKK2RpcmVjdG9yeTsgdGhlIGdpdmVuIHNvdXJjZXMgd2lsbCBiZSBtb3ZlZCBpbnRvIHRoaXMgZGlyZWN0b3J5LgorCitUaGUgaW5kZXggaXMgdXBkYXRlZCBhZnRlciBzdWNjZXNzZnVsIGNvbXBsZXRpb24sIGJ1dCB0aGUgY2hhbmdlIG11c3Qgc3RpbGwgYmUKK2NvbW1pdHRlZC4KKworT1BUSU9OUworLS0tLS0tLQorLWY6OgorCUZvcmNlIHJlbmFtaW5nIG9yIG1vdmluZyBvZiBhIGZpbGUgZXZlbiBpZiB0aGUgdGFyZ2V0IGV4aXN0cworLWs6OgorICAgICAgICBTa2lwIG1vdmUgb3IgcmVuYW1lIGFjdGlvbnMgd2hpY2ggd291bGQgbGVhZCB0byBhbiBlcnJvcgorCWNvbmRpdGlvbi4gQW4gZXJyb3IgaGFwcGVucyB3aGVuIGEgc291cmNlIGlzIG5laXRoZXIgZXhpc3Rpbmcgbm9yCisgICAgICAgIGNvbnRyb2xsZWQgYnkgR0lULCBvciB3aGVuIGl0IHdvdWxkIG92ZXJ3cml0ZSBhbiBleGlzdGluZworICAgICAgICBmaWxlIHVubGVzcyAnLWYnIGlzIGdpdmVuLgorLW46OgorCURvIG5vdGhpbmc7IG9ubHkgc2hvdyB3aGF0IHdvdWxkIGhhcHBlbgorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK1Jld3JpdHRlbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorTW92ZSBmdW5jdGlvbmFsaXR5IGFkZGVkIGJ5IEpvc2VmIFdlaWRlbmRvcmZlciA8Sm9zZWYuV2VpZGVuZG9yZmVyQGdteC5kZT4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1uYW1lLXJldi50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1uYW1lLXJldi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmYmY2NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LW5hbWUtcmV2LnR4dApAQCAtMCwwICsxLDY3IEBACitnaXQtbmFtZS1yZXYoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtbmFtZS1yZXYgLSBGaW5kIHN5bWJvbGljIG5hbWVzIGZvciBnaXZlbiByZXZzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LW5hbWUtcmV2JyBbLS10YWdzXSAoIC0tYWxsIHwgLS1zdGRpbiB8IDxjb21taXR0aXNoPi4uLiApCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRmluZHMgc3ltYm9saWMgbmFtZXMgc3VpdGFibGUgZm9yIGh1bWFuIGRpZ2VzdGlvbiBmb3IgcmV2aXNpb25zIGdpdmVuIGluIGFueQorZm9ybWF0IHBhcnNhYmxlIGJ5IGdpdC1yZXYtcGFyc2UuCisKKworT1BUSU9OUworLS0tLS0tLQorCistLXRhZ3M6OgorCURvIG5vdCB1c2UgYnJhbmNoIG5hbWVzLCBidXQgb25seSB0YWdzIHRvIG5hbWUgdGhlIGNvbW1pdHMKKworLS1hbGw6OgorCUxpc3QgYWxsIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gYWxsIHJlZnMKKworLS1zdGRpbjo6CisJUmVhZCBmcm9tIHN0ZGluLCBhcHBlbmQgIig8cmV2X25hbWU+KSIgdG8gYWxsIHNoYTEncyBvZiBuYW1lYWJsZQorCWNvbW1pdHMsIGFuZCBwYXNzIHRvIHN0ZG91dAorCitFWEFNUExFCistLS0tLS0tCisKK0dpdmVuIGEgY29tbWl0LCBmaW5kIG91dCB3aGVyZSBpdCBpcyByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVmcy4gU2F5IHNvbWVib2R5Cit3cm90ZSB5b3UgYWJvdXQgdGhhdCBmYW50YXN0aWMgY29tbWl0IDMzZGI1ZjRkOTAyN2ExMGU0NzdjY2YwNTRiMmMxYWI5NGY3NGM4NWEuCitPZiBjb3Vyc2UsIHlvdSBsb29rIGludG8gdGhlIGNvbW1pdCwgYnV0IHRoYXQgb25seSB0ZWxscyB5b3Ugd2hhdCBoYXBwZW5lZCwgYnV0Citub3QgdGhlIGNvbnRleHQuCisKK0VudGVyIGdpdC1uYW1lLXJldjoKKworLS0tLS0tLS0tLS0tCislIGdpdCBuYW1lLXJldiAzM2RiNWY0ZDkwMjdhMTBlNDc3Y2NmMDU0YjJjMWFiOTRmNzRjODVhCiszM2RiNWY0ZDkwMjdhMTBlNDc3Y2NmMDU0YjJjMWFiOTRmNzRjODVhIHRhZ3MvdjAuOTleMH45NDAKKy0tLS0tLS0tLS0tLQorCitOb3cgeW91IGFyZSB3aXNlciwgYmVjYXVzZSB5b3Uga25vdyB0aGF0IGl0IGhhcHBlbmVkIDk0MCByZXZpc2lvbnMgYmVmb3JlIHYwLjk5LgorCitBbm90aGVyIG5pY2UgdGhpbmcgeW91IGNhbiBkbyBpczoKKworLS0tLS0tLS0tLS0tCislIGdpdCBsb2cgfCBnaXQgbmFtZS1yZXYgLS1zdGRpbgorLS0tLS0tLS0tLS0tCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wNGltcG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wNGltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5ZThmYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXA0aW1wb3J0LnR4dApAQCAtMCwwICsxLDE2OCBAQAorZ2l0LXA0aW1wb3J0KDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXA0aW1wb3J0IC0gSW1wb3J0IGEgUGVyZm9yY2UgcmVwb3NpdG9yeSBpbnRvIGdpdAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorYGdpdC1wNGltcG9ydGAgWy1xfC12XSBbLS1ub3RhZ3NdIFstLWF1dGhvcnMgPGZpbGU+XSBbLXQgPHRpbWV6b25lPl0gPC8vcDRyZXBvL3BhdGg+IDxicmFuY2g+CisKK2BnaXQtcDRpbXBvcnRgIC0tc3RpdGNoIDwvL3A0cmVwby9wYXRoPgorCitgZ2l0LXA0aW1wb3J0YAorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW1wb3J0IGEgUGVyZm9yY2UgcmVwb3NpdG9yeSBpbnRvIGFuIGV4aXN0aW5nIGdpdCByZXBvc2l0b3J5LiAgV2hlbgorYSA8Ly9wNHJlcG8vcGF0aD4gYW5kIDxicmFuY2g+IGFyZSBzcGVjaWZpZWQgYSBuZXcgYnJhbmNoIHdpdGggdGhlCitnaXZlbiBuYW1lIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIGluaXRpYWwgaW1wb3J0IHdpbGwgYmVnaW4uCisKK09uY2UgdGhlIGluaXRpYWwgaW1wb3J0IGlzIGNvbXBsZXRlIHlvdSBjYW4gZG8gYW4gaW5jcmVtZW50YWwgaW1wb3J0CitvZiBuZXcgY29tbWl0cyBmcm9tIHRoZSBQZXJmb3JjZSByZXBvc2l0b3J5LiAgWW91IGRvIHRoaXMgYnkgY2hlY2tpbmcKK291dCB0aGUgYXBwcm9wcmlhdGUgZ2l0IGJyYW5jaCBhbmQgdGhlbiBydW5uaW5nIGBnaXQtcDRpbXBvcnRgIHdpdGhvdXQKK2FueSBvcHRpb25zLgorCitUaGUgc3RhbmRhcmQgcDQgY2xpZW50IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgUGVyZm9yY2UKK3JlcG9zaXRvcnk7IGl0IG11c3QgYmUgY29uZmlndXJlZCBjb3JyZWN0bHkgaW4gb3JkZXIgZm9yIGBnaXQtcDRpbXBvcnRgCit0byBvcGVyYXRlIChzZWUgYmVsb3cpLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1xOjoKKwlEbyBub3QgZGlzcGxheSBhbnkgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCisKKy12OjoKKyAgICAgICAgR2l2ZSBleHRyYSBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KKworXC0tYXV0aG9yczo6CisJU3BlY2lmeSBhbiBhdXRob3JzIGZpbGUgY29udGFpbmluZyBhIG1hcHBpbmcgb2YgUGVyZm9yY2UgdXNlcgorCWlkcyB0byBmdWxsIG5hbWVzIGFuZCBlbWFpbCBhZGRyZXNzZXMgKHNlZSBOb3RlcyBiZWxvdykuCisKK1wtLW5vdGFnczo6CisJRG8gbm90IGNyZWF0ZSBhIHRhZyBmb3IgZWFjaCBpbXBvcnRlZCBjb21taXQuCisKK1wtLXN0aXRjaDo6CisJSW1wb3J0IHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcGVyZm9yY2UgYnJhbmNoIGludG8gdGhlCisJY3VycmVudGx5IGNoZWNrZWQgb3V0IGdpdCBicmFuY2guCisKK1wtLWxvZzo6CisJU3RvcmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBzcGVjaWZpZWQgZmlsZS4KKworLXQ6OgorCVNwZWNpZnkgdGhhdCB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaXMgaW4gdGhlIHNwZWNpZmllZCB0aW1lem9uZS4KKwlUaW1lem9uZSBtdXN0IGJlIGluIHRoZSBmb3JtYXQgIlVTL1BhY2lmaWMiIG9yICJFdXJvcGUvTG9uZG9uIgorCWV0Yy4gIFlvdSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzIG9uY2UsIGl0IHdpbGwgYmUgc2F2ZWQgaW4KKwl0aGUgZ2l0IGNvbmZpZyBmaWxlIGZvciB0aGUgcmVwb3NpdG9yeS4KKworPC8vcDRyZXBvL3BhdGg+OjoKKwlUaGUgUGVyZm9yY2UgcGF0aCB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgaW50byB0aGUgc3BlY2lmaWVkIGJyYW5jaC4KKworPGJyYW5jaD46OgorCVRoZSBuZXcgYnJhbmNoIHRoYXQgd2lsbCBiZSBjcmVhdGVkIHRvIGhvbGQgdGhlIFBlcmZvcmNlIGltcG9ydHMuCisKKworUDQgQ2xpZW50CistLS0tLS0tLS0KK1lvdSBtdXN0IG1ha2UgdGhlIGBwNGAgY2xpZW50IGNvbW1hbmQgYXZhaWxhYmxlIGluIHlvdXIgJFBBVEggYW5kCitjb25maWd1cmUgaXQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgdGFyZ2V0IFBlcmZvcmNlIHJlcG9zaXRvcnkuCitUeXBpY2FsbHkgdGhpcyBtZWFucyB5b3UgbXVzdCBzZXQgdGhlICIkUDRQT1JUIiBhbmQgIiRQNENMSUVOVCIKK2Vudmlyb25tZW50IHZhcmlhYmxlcy4KKworWW91IG11c3QgYWxzbyBjb25maWd1cmUgYSBgcDRgIGNsaWVudCAidmlldyIgd2hpY2ggbWFwcyB0aGUgUGVyZm9yY2UKK2JyYW5jaCBpbnRvIHRoZSB0b3AgbGV2ZWwgb2YgeW91ciBnaXQgcmVwb3NpdG9yeSwgZm9yIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLQorQ2xpZW50OiBteWhvc3QKKworUm9vdDogICAvaG9tZS9zZWFuL2ltcG9ydAorCitPcHRpb25zOiAgIG5vYWxsd3JpdGUgY2xvYmJlciBub2NvbXByZXNzIHVubG9ja2VkIG1vZHRpbWUgcm1kaXIKKworVmlldzoKKyAgICAgICAgLy9wdWJsaWMvamFtLy4uLiAvL215aG9zdC9qYW0vLi4uCistLS0tLS0tLS0tLS0KKworV2l0aCB0aGUgYWJvdmUgYHA0YCBjbGllbnQgc2V0dXAsIHlvdSBjb3VsZCBpbXBvcnQgdGhlICJqYW0iCitwZXJmb3JjZSBicmFuY2ggaW50byBhIGJyYW5jaCBuYW1lZCAiamFtbXkiLCBsaWtlIHNvOgorCistLS0tLS0tLS0tLS0KKyQgbWtkaXIgLXAgL2hvbWUvc2Vhbi9pbXBvcnQvamFtCiskIGNkIC9ob21lL3NlYW4vaW1wb3J0L2phbQorJCBnaXQgaW5pdC1kYgorJCBnaXQgcDRpbXBvcnQgLy9wdWJsaWMvamFtIGphbW15CistLS0tLS0tLS0tLS0KKworCitNdWx0aXBsZSBCcmFuY2hlcworLS0tLS0tLS0tLS0tLS0tLS0KK05vdGUgdGhhdCBieSBjcmVhdGluZyBtdWx0aXBsZSAidmlld3MiIHlvdSBjYW4gdXNlIGBnaXQtcDRpbXBvcnRgCit0byBpbXBvcnQgYWRkaXRpb25hbCBicmFuY2hlcyBpbnRvIHRoZSBzYW1lIGdpdCByZXBvc2l0b3J5LgorSG93ZXZlciwgdGhlIGBwNGAgY2xpZW50IGhhcyBhIGxpbWl0YXRpb24gaW4gdGhhdCBpdCBzaWxlbnRseQoraWdub3JlcyBhbGwgYnV0IHRoZSBsYXN0ICJ2aWV3IiB0aGF0IG1hcHMgaW50byB0aGUgc2FtZSBsb2NhbAorZGlyZWN0b3J5LiAgU28gdGhlIGZvbGxvd2luZyB3aWxsICpub3QqIHdvcms6CisKKy0tLS0tLS0tLS0tLQorVmlldzoKKyAgICAgICAgLy9wdWJsaWMvamFtLy4uLiAvL215aG9zdC9qYW0vLi4uCisgICAgICAgIC8vcHVibGljL290aGVyLy4uLiAvL215aG9zdC9qYW0vLi4uCisgICAgICAgIC8vcHVibGljL2d1ZXN0Ly4uLiAvL215aG9zdC9qYW0vLi4uCistLS0tLS0tLS0tLS0KKworSWYgeW91IHdhbnQgbW9yZSB0aGFuIG9uZSBQZXJmb3JjZSBicmFuY2ggdG8gYmUgaW1wb3J0ZWQgaW50byB0aGUKK3NhbWUgZGlyZWN0b3J5IHlvdSBtdXN0IGVtcGxveSBhIHdvcmthcm91bmQuICBBIHNpbXBsZSBvcHRpb24gaXMKK3RvIGFkanVzdCB5b3VyIGBwNGAgY2xpZW50IGJlZm9yZSBlYWNoIGltcG9ydCB0byBvbmx5IGluY2x1ZGUgYQorc2luZ2xlIHZpZXcuCisKK0Fub3RoZXIgb3B0aW9uIGlzIHRvIGNyZWF0ZSBtdWx0aXBsZSBzeW1saW5rcyBsb2NhbGx5IHdoaWNoIGFsbAorcG9pbnQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGluIHlvdXIgZ2l0IHJlcG9zaXRvcnkgYW5kIHRoZW4gdXNlCitvbmUgcGVyICJ2aWV3IiBpbnN0ZWFkIG9mIGxpc3RpbmcgdGhlIGFjdHVhbCBkaXJlY3RvcnkuCisKKworVGFncworLS0tLQorQSBnaXQgdGFnIG9mIHRoZSBmb3JtIHA0L3h4IGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IGNoYW5nZSBpbXBvcnRlZCBmcm9tCit0aGUgUGVyZm9yY2UgcmVwb3NpdG9yeSB3aGVyZSB4eCBpcyB0aGUgUGVyZm9yY2UgY2hhbmdlc2V0IG51bWJlci4KK1RoZXJlZm9yZSBhZnRlciB0aGUgaW1wb3J0IHlvdSBjYW4gdXNlIGdpdCB0byBhY2Nlc3MgYW55IGNvbW1pdCBieSBpdHMKK1BlcmZvcmNlIG51bWJlciwgZS5nLiBnaXQgc2hvdyBwNC8zMjcuCisKK1RoZSB0YWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBIRUFEIGNvbW1pdCBpcyBhbHNvIGhvdyBgZ2l0LXA0aW1wb3J0YAorZGV0ZXJtaW5lcyBpZiB0aGVyZSBhcmUgbmV3IGNoYW5nZXMgdG8gaW5jcmVtZW50YWxseSBpbXBvcnQgZnJvbSB0aGUKK1BlcmZvcmNlIHJlcG9zaXRvcnkuCisKK0lmIHlvdSBpbXBvcnQgZnJvbSBhIHJlcG9zaXRvcnkgd2l0aCBtYW55IHRob3VzYW5kcyBvZiBjaGFuZ2VzCit5b3Ugd2lsbCBoYXZlIGFuIGVxdWFsIG51bWJlciBvZiBwNC94eHh4IGdpdCB0YWdzLiAgR2l0IHRhZ3MgY2FuCitiZSBleHBlbnNpdmUgaW4gdGVybXMgb2YgZGlzayBzcGFjZSBhbmQgcmVwb3NpdG9yeSBvcGVyYXRpb25zLgorSWYgeW91IGRvbid0IG5lZWQgdG8gcGVyZm9ybSBmdXJ0aGVyIGluY3JlbWVudGFsIGltcG9ydHMsIHlvdQorbWF5IGRlbGV0ZSB0aGUgdGFncy4KKworCitOb3RlcworLS0tLS0KK1lvdSBjYW4gaW50ZXJydXB0IHRoZSBpbXBvcnQgKGUuZy4gY3RybC1jKSBhdCBhbnkgdGltZSBhbmQgcmVzdGFydCBpdAord2l0aG91dCB3b3JyeS4KKworQXV0aG9yIGluZm9ybWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBieSBxdWVyeWluZyB0aGUKK1BlcmZvcmNlICJ1c2VycyIgdGFibGUgdXNpbmcgdGhlIGlkIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGNoYW5nZS4KK0hvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIG1hbnVhbGx5IHN1cHBseSB0aGVzZSBtYXBwaW5ncyB5b3UgY2FuIGRvCitzbyB3aXRoIHRoZSAiLS1hdXRob3JzIiBvcHRpb24uICBJdCBhY2NlcHRzIGEgZmlsZSBjb250YWluaW5nIGEgbGlzdAorb2YgbWFwcGluZ3Mgd2l0aCBlYWNoIGxpbmUgY29udGFpbmluZyBvbmUgbWFwcGluZyBpbiB0aGUgZm9ybWF0OgorCistLS0tLS0tLS0tLS0KKyAgICBwZXJmb3JjZV9pZCA9IEZ1bGwgTmFtZSA8ZW1haWxAYWRkcmVzcy5jb20+CistLS0tLS0tLS0tLS0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBTZWFuIEVzdGFicm9va3MgPHNlYW5sa21sQHN5bXBhdGljby5jYT4KKworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1vYmplY3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5MWY4OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBhY2stb2JqZWN0cy50eHQKQEAgLTAsMCArMSwxMTIgQEAKK2dpdC1wYWNrLW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhY2stb2JqZWN0cyAtIENyZWF0ZSBhIHBhY2tlZCBhcmNoaXZlIG9mIG9iamVjdHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcGFjay1vYmplY3RzJyBbLXFdIFstLW5vLXJldXNlLWRlbHRhXSBbLS1ub24tZW1wdHldCisJWy0tbG9jYWxdIFstLWluY3JlbWVudGFsXSBbLS13aW5kb3c9Tl0gWy0tZGVwdGg9Tl0KKwl7LS1zdGRvdXQgfCBiYXNlLW5hbWV9IDwgb2JqZWN0LWxpc3QKKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgYW5kIHdyaXRlcyBhIHBhY2tlZAorYXJjaGl2ZSB3aXRoIHNwZWNpZmllZCBiYXNlLW5hbWUsIG9yIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK0EgcGFja2VkIGFyY2hpdmUgaXMgYW4gZWZmaWNpZW50IHdheSB0byB0cmFuc2ZlciBzZXQgb2Ygb2JqZWN0cworYmV0d2VlbiB0d28gcmVwb3NpdG9yaWVzLCBhbmQgYWxzbyBpcyBhbiBhcmNoaXZhbCBmb3JtYXQgd2hpY2gKK2lzIGVmZmljaWVudCB0byBhY2Nlc3MuICBUaGUgcGFja2VkIGFyY2hpdmUgZm9ybWF0ICgucGFjaykgaXMKK2Rlc2lnbmVkIHRvIGJlIHVucGFja2FibGUgd2l0aG91dCBoYXZpbmcgYW55dGhpbmcgZWxzZSwgYnV0IGZvcgorcmFuZG9tIGFjY2VzcywgYWNjb21wYW5pZWQgd2l0aCB0aGUgcGFjayBpbmRleCBmaWxlICguaWR4KS4KKworJ2dpdC11bnBhY2stb2JqZWN0cycgY29tbWFuZCBjYW4gcmVhZCB0aGUgcGFja2VkIGFyY2hpdmUgYW5kCitleHBhbmQgdGhlIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBwYWNrIGludG8gIm9uZS1maWxlCitvbmUtb2JqZWN0IiBmb3JtYXQ7IHRoaXMgaXMgdHlwaWNhbGx5IGRvbmUgYnkgdGhlIHNtYXJ0LXB1bGwKK2NvbW1hbmRzIHdoZW4gYSBwYWNrIGlzIGNyZWF0ZWQgb24tdGhlLWZseSBmb3IgZWZmaWNpZW50IG5ldHdvcmsKK3RyYW5zcG9ydCBieSB0aGVpciBwZWVycy4KKworUGxhY2luZyBib3RoIGluIHRoZSBwYWNrLyBzdWJkaXJlY3Rvcnkgb2YgJEdJVF9PQkpFQ1RfRElSRUNUT1JZIChvcgorYW55IG9mIHRoZSBkaXJlY3RvcmllcyBvbiAkR0lUX0FMVEVSTkFURV9PQkpFQ1RfRElSRUNUT1JJRVMpCitlbmFibGVzIGdpdCB0byByZWFkIGZyb20gc3VjaCBhbiBhcmNoaXZlLgorCitJbiBhIHBhY2tlZCBhcmNoaXZlLCBhbiBvYmplY3QgaXMgZWl0aGVyIHN0b3JlZCBhcyBhIGNvbXByZXNzZWQKK3dob2xlLCBvciBhcyBhIGRpZmZlcmVuY2UgZnJvbSBzb21lIG90aGVyIG9iamVjdC4gIFRoZSBsYXR0ZXIgaXMKK29mdGVuIGNhbGxlZCBhIGRlbHRhLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2Jhc2UtbmFtZTo6CisJV3JpdGUgaW50byBhIHBhaXIgb2YgZmlsZXMgKC5wYWNrIGFuZCAuaWR4KSwgdXNpbmcKKwk8YmFzZS1uYW1lPiB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKwlXaGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHRoZSB0d28gZmlsZXMgYXJlIHdyaXR0ZW4gaW4KKwk8YmFzZS1uYW1lPi08U0hBMT4ue3BhY2ssaWR4fSBmaWxlcy4gIDxTSEExPiBpcyBhIGhhc2gKKwlvZiBvYmplY3QgbmFtZXMgKGN1cnJlbnRseSBpbiByYW5kb20gb3JkZXIgc28gaXQgZG9lcworCW5vdCBoYXZlIGFueSB1c2VmdWwgbWVhbmluZykgdG8gbWFrZSB0aGUgcmVzdWx0aW5nCisJZmlsZW5hbWUgcmVhc29uYWJseSB1bmlxdWUsIGFuZCB3cml0dGVuIHRvIHRoZSBzdGFuZGFyZAorCW91dHB1dCBvZiB0aGUgY29tbWFuZC4KKworLS1zdGRvdXQ6OgorCVdyaXRlIHRoZSBwYWNrIGNvbnRlbnRzICh3aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuIHRvCisJLnBhY2sgZmlsZSkgb3V0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKKy0td2luZG93IGFuZCAtLWRlcHRoOjoKKwlUaGVzZSB0d28gb3B0aW9ucyBhZmZlY3RzIGhvdyB0aGUgb2JqZWN0cyBjb250YWluZWQgaW4KKwl0aGUgcGFjayBhcmUgc3RvcmVkIHVzaW5nIGRlbHRhIGNvbXByZXNzaW9uLiAgVGhlCisJb2JqZWN0cyBhcmUgZmlyc3QgaW50ZXJuYWxseSBzb3J0ZWQgYnkgdHlwZSwgc2l6ZSBhbmQKKwlvcHRpb25hbGx5IG5hbWVzIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZSBvdGhlciBvYmplY3RzCisJd2l0aGluIC0td2luZG93IHRvIHNlZSBpZiB1c2luZyBkZWx0YSBjb21wcmVzc2lvbiBzYXZlcworCXNwYWNlLiAgLS1kZXB0aCBsaW1pdHMgdGhlIG1heGltdW0gZGVsdGEgZGVwdGg7IG1ha2luZworCWl0IHRvbyBkZWVwIGFmZmVjdHMgdGhlIHBlcmZvcm1hbmNlIG9uIHRoZSB1bnBhY2tlcgorCXNpZGUsIGJlY2F1c2UgZGVsdGEgZGF0YSBuZWVkcyB0byBiZSBhcHBsaWVkIHRoYXQgbWFueQorCXRpbWVzIHRvIGdldCB0byB0aGUgbmVjZXNzYXJ5IG9iamVjdC4KKworLS1pbmNyZW1lbnRhbDo6CisJVGhpcyBmbGFnIGNhdXNlcyBhbiBvYmplY3QgYWxyZWFkeSBpbiBhIHBhY2sgaWdub3JlZAorCWV2ZW4gaWYgaXQgYXBwZWFycyBpbiB0aGUgc3RhbmRhcmQgaW5wdXQuCisKKy0tbG9jYWw6OgorCVRoaXMgZmxhZyBpcyBzaW1pbGFyIHRvIGAtLWluY3JlbWVudGFsYDsgaW5zdGVhZCBvZgorCWlnbm9yaW5nIGFsbCBwYWNrZWQgb2JqZWN0cywgaXQgb25seSBpZ25vcmVzIG9iamVjdHMKKwl0aGF0IGFyZSBwYWNrZWQgYW5kIG5vdCBpbiB0aGUgbG9jYWwgb2JqZWN0IHN0b3JlCisJKGkuZS4gYm9ycm93ZWQgZnJvbSBhbiBhbHRlcm5hdGUpLgorCistLW5vbi1lbXB0eTo6CisgICAgICAgIE9ubHkgY3JlYXRlIGEgcGFja2VkIGFyY2hpdmUgaWYgaXQgd291bGQgY29udGFpbiBhdAorICAgICAgICBsZWFzdCBvbmUgb2JqZWN0LgorCistcTo6CisJVGhpcyBmbGFnIG1ha2VzIHRoZSBjb21tYW5kIG5vdCB0byByZXBvcnQgaXRzIHByb2dyZXNzCisJb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbS4KKworLS1uby1yZXVzZS1kZWx0YTo6CisJV2hlbiBjcmVhdGluZyBhIHBhY2tlZCBhcmNoaXZlIGluIGEgcmVwb3NpdG9yeSB0aGF0CisJaGFzIGV4aXN0aW5nIHBhY2tzLCB0aGUgY29tbWFuZCByZXVzZXMgZXhpc3RpbmcgZGVsdGFzLgorCVRoaXMgc29tZXRpbWVzIHJlc3VsdHMgaW4gYSBzbGlnaHRseSBzdWJvcHRpbWFsIHBhY2suCisJVGhpcyBmbGFnIHRlbGxzIHRoZSBjb21tYW5kIG5vdCB0byByZXVzZSBleGlzdGluZyBkZWx0YXMKKwlidXQgY29tcHV0ZSB0aGVtIGZyb20gc2NyYXRjaC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1yZXBhY2tbMV0KK2dpdGxpbms6Z2l0LXBydW5lLXBhY2tlZFsxXQorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1yZWR1bmRhbnQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGFjay1yZWR1bmRhbnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTRiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wYWNrLXJlZHVuZGFudC50eHQKQEAgLTAsMCArMSw1OCBAQAorZ2l0LXBhY2stcmVkdW5kYW50KDEpCis9PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXBhY2stcmVkdW5kYW50IC0gUHJvZ3JhbSB1c2VkIHRvIGZpbmQgcmVkdW5kYW50IHBhY2sgZmlsZXMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGFjay1yZWR1bmRhbnQnIFsgLS12ZXJib3NlIF0gWyAtLWFsdC1vZGIgXSA8IC0tYWxsIHwgLnBhY2sgZmlsZW5hbWUgLi4uID4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHByb2dyYW0gY29tcHV0ZXMgd2hpY2ggcGFja3MgaW4geW91ciByZXBvc2l0b3J5CithcmUgcmVkdW5kYW50LiBUaGUgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwaXBpbmcgdG8KKyd4YXJncyBybScgaWYgeW91IGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeS4KKworZ2l0LXBhY2stcmVkdW5kYW50IGFjY2VwdHMgYSBsaXN0IG9mIG9iamVjdHMgb24gc3RhbmRhcmQgaW5wdXQuIEFueSBvYmplY3RzCitnaXZlbiB3aWxsIGJlIGlnbm9yZWQgd2hlbiBjaGVja2luZyB3aGljaCBwYWNrcyBhcmUgcmVxdWlyZWQuIFRoaXMgbWFrZXMgdGhlIAorZm9sbG93aW5nIGNvbW1hbmQgdXNlZnVsIHdoZW4gd2FudGluZyB0byByZW1vdmUgcGFja3Mgd2hpY2ggY29udGFpbiB1bnJlYWNoYWJsZQorb2JqZWN0cy4KKworZ2l0LWZzY2stb2JqZWN0cyAtLWZ1bGwgLS11bnJlYWNoYWJsZSB8IGN1dCAtZCAnICcgLWYzIHwgXAorZ2l0LXBhY2stcmVkdW5kYW50IC0tYWxsIHwgeGFyZ3Mgcm0KKworT1BUSU9OUworLS0tLS0tLQorCisKKy0tYWxsOjoKKwlQcm9jZXNzZXMgYWxsIHBhY2tzLiBBbnkgZmlsZW5hbWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIGlnbm9yZWQuCisKKy0tYWx0LW9kYjo6CisJRG9uJ3QgcmVxdWlyZSBvYmplY3RzIHByZXNlbnQgaW4gcGFja3MgZnJvbSBhbHRlcm5hdGUgb2JqZWN0CisJZGlyZWN0b3JpZXMgdG8gYmUgcHJlc2VudCBpbiBsb2NhbCBwYWNrcy4KKworLS12ZXJib3NlOjoKKwlPdXRwdXRzIHNvbWUgc3RhdGlzdGljcyB0byBzdGRlcnIuIEhhcyBhIHNtYWxsIHBlcmZvcm1hbmNlIHBlbmFsdHkuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEx1a2FzIFNhbmRzdHLDtm0gPGx1a2Fzc0BldGVrLmNoYWxtZXJzLnNlPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBMdWthcyBTYW5kc3Ryw7ZtIDxsdWthc3NAZXRlay5jaGFsbWVycy5zZT4KKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0KK2dpdGxpbms6Z2l0LXJlcGFja1sxXQorZ2l0bGluazpnaXQtcHJ1bmUtcGFja2VkWzFdCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wYXJzZS1yZW1vdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcGFyc2UtcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI3YWZlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcGFyc2UtcmVtb3RlLnR4dApAQCAtMCwwICsxLDQ4IEBACitnaXQtcGFyc2UtcmVtb3RlKDEpCis9PT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wYXJzZS1yZW1vdGUgLSBSb3V0aW5lcyB0byBoZWxwIHBhcnNpbmcgJEdJVF9ESVIvcmVtb3Rlcy8KKworCitTWU5PUFNJUworLS0tLS0tLS0KKycuIGdpdC1wYXJzZS1yZW1vdGUnCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBzY3JpcHQgaXMgaW5jbHVkZWQgaW4gdmFyaW91cyBzY3JpcHRzIHRvIHN1cHBseQorcm91dGluZXMgdG8gcGFyc2UgZmlsZXMgdW5kZXIgJEdJVF9ESVIvcmVtb3Rlcy8gYW5kCiskR0lUX0RJUi9icmFuY2hlcy8uCisKK1RoZSBwcmltYXJ5IGVudHJ5IHBvaW50cyBhcmU6CisKK2dldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2g6OgorCUdpdmVuIHRoZSBsaXN0IG9mIHVzZXItc3VwcGxpZWQgYDxyZXBvPiA8cmVmc3BlYz4uLi5gLAorCXJldHVybiB0aGUgbGlzdCBvZiByZWZzIHRvIGZldGNoIGFmdGVyIGNhbm9uaWNhbGl6aW5nCisJdGhlbSBpbnRvIGAkR0lUX0RJUmAgcmVsYXRpdmUgcGF0aHMKKwkoZS5nLiBgcmVmcy9oZWFkcy9mb29gKS4gIFdoZW4gYDxyZWZzcGVjPi4uLmAgaXMgZW1wdHkKKwl0aGUgcmV0dXJuZWQgbGlzdCBvZiByZWZzIGNvbnNpc3RzIG9mIHRoZSBkZWZhdWx0cworCWZvciB0aGUgZ2l2ZW4gYDxyZXBvPmAsIGlmIHNwZWNpZmllZCBpbgorCWAkR0lUX0RJUi9yZW1vdGVzL2Agb3IgYCRHSVRfRElSL2JyYW5jaGVzL2AuCisKK2dldF9yZW1vdGVfcmVmc19mb3JfcHVzaDo6CisJR2l2ZW4gdGhlIGxpc3Qgb2YgdXNlci1zdXBwbGllZCBgPHJlcG8+IDxyZWZzcGVjPi4uLmAsCisJcmV0dXJuIHRoZSBsaXN0IG9mIHJlZnMgdG8gcHVzaCBpbiBhIGZvcm0gc3VpdGFibGUgdG8gYmUKKwlmZWQgdG8gdGhlIGBnaXQtc2VuZC1wYWNrYCBjb21tYW5kLiAgV2hlbiBgPHJlZnNwZWM+Li4uYAorCWlzIGVtcHR5IHRoZSByZXR1cm5lZCBsaXN0IG9mIHJlZnMgY29uc2lzdHMgb2YgdGhlCisJZGVmYXVsdHMgZm9yIHRoZSBnaXZlbiBgPHJlcG8+YCwgaWYgc3BlY2lmaWVkIGluCisJYCRHSVRfRElSL3JlbW90ZXMvYC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBhdGNoLWlkLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBhdGNoLWlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg5MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcGF0Y2gtaWQudHh0CkBAIC0wLDAgKzEsNDMgQEAKK2dpdC1wYXRjaC1pZCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wYXRjaC1pZCAtIEdlbmVyYXRlIGEgcGF0Y2ggSUQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXBhdGNoLWlkJyA8IDxwYXRjaD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitBICJwYXRjaCBJRCIgaXMgbm90aGluZyBidXQgYSBTSEExIG9mIHRoZSBkaWZmIGFzc29jaWF0ZWQgd2l0aCBhIHBhdGNoLCB3aXRoCit3aGl0ZXNwYWNlIGFuZCBsaW5lIG51bWJlcnMgaWdub3JlZC4gIEFzIHN1Y2gsIGl0J3MgInJlYXNvbmFibHkgc3RhYmxlIiwgYnV0IGF0Cit0aGUgc2FtZSB0aW1lIGFsc28gcmVhc29uYWJseSB1bmlxdWUsIGkuZS4sIHR3byBwYXRjaGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSAicGF0Y2gKK0lEIiBhcmUgYWxtb3N0IGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUgdGhpbmcuCisKK0lPVywgeW91IGNhbiB1c2UgdGhpcyB0aGluZyB0byBsb29rIGZvciBsaWtlbHkgZHVwbGljYXRlIGNvbW1pdHMuCisKK1doZW4gZGVhbGluZyB3aXRoIGdpdC1kaWZmLXRyZWUgb3V0cHV0LCBpdCB0YWtlcyBhZHZhbnRhZ2Ugb2YKK3RoZSBmYWN0IHRoYXQgdGhlIHBhdGNoIGlzIHByZWZpeGVkIHdpdGggdGhlIG9iamVjdCBuYW1lIG9mIHRoZQorY29tbWl0LCBhbmQgb3V0cHV0cyB0d28gNDAtYnl0ZSBoZXhhZGVjaW1hbCBzdHJpbmcuICBUaGUgZmlyc3QKK3N0cmluZyBpcyB0aGUgcGF0Y2ggSUQsIGFuZCB0aGUgc2Vjb25kIHN0cmluZyBpcyB0aGUgY29tbWl0IElELgorVGhpcyBjYW4gYmUgdXNlZCB0byBtYWtlIGEgbWFwcGluZyBmcm9tIHBhdGNoIElEIHRvIGNvbW1pdCBJRC4KKworT1BUSU9OUworLS0tLS0tLQorPHBhdGNoPjo6CisJVGhlIGRpZmYgdG8gY3JlYXRlIHRoZSBJRCBvZi4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBlZWstcmVtb3RlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXBlZWstcmVtb3RlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAwNjBjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcGVlay1yZW1vdGUudHh0CkBAIC0wLDAgKzEsNTIgQEAKK2dpdC1wZWVrLXJlbW90ZSgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1wZWVrLXJlbW90ZSAtIExpc3RzIHRoZSByZWZlcmVuY2VzIGluIGEgcmVtb3RlIHJlcG9zaXRvcnkKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcGVlay1yZW1vdGUnIFstLWV4ZWM9PGdpdC11cGxvYWQtcGFjaz5dIFs8aG9zdD46XTxkaXJlY3Rvcnk+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorTGlzdHMgdGhlIHJlZmVyZW5jZXMgdGhlIHJlbW90ZSByZXBvc2l0b3J5IGhhcywgYW5kIG9wdGlvbmFsbHkKK3N0b3JlcyB0aGVtIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5IHVuZGVyIHRoZSBzYW1lIG5hbWUuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tZXhlYz08Z2l0LXVwbG9hZC1wYWNrPjo6CisJVXNlIHRoaXMgdG8gc3BlY2lmeSB0aGUgcGF0aCB0byAnZ2l0LXVwbG9hZC1wYWNrJyBvbiB0aGUKKwlyZW1vdGUgc2lkZSwgaWYgaXQgaXMgbm90IGZvdW5kIG9uIHlvdXIgJFBBVEguIFNvbWUKKwlpbnN0YWxsYXRpb25zIG9mIHNzaGQgaWdub3JlcyB0aGUgdXNlcidzIGVudmlyb25tZW50CisJc2V0dXAgc2NyaXB0cyBmb3IgbG9naW4gc2hlbGxzIChlLmcuIC5iYXNoX3Byb2ZpbGUpIGFuZAorCXlvdXIgcHJpdmF0ZWx5IGluc3RhbGxlZCBnaXQgbWF5IG5vdCBiZSBmb3VuZCBvbiB0aGUgc3lzdGVtCisJZGVmYXVsdCAkUEFUSC4gIEFub3RoZXIgd29ya2Fyb3VuZCBzdWdnZXN0ZWQgaXMgdG8gc2V0CisJdXAgeW91ciAkUEFUSCBpbiAiLmJhc2hyYyIsIGJ1dCB0aGlzIGZsYWcgaXMgZm9yIHBlb3BsZQorCXdobyBkbyBub3Qgd2FudCB0byBwYXkgdGhlIG92ZXJoZWFkIGZvciBub24taW50ZXJhY3RpdmUKKwlzaGVsbHMsIGJ1dCBwcmVmZXIgaGF2aW5nIGEgbGVhbiAuYmFzaHJjIGZpbGUgKHRoZXkgc2V0IG1vc3Qgb2YKKwl0aGUgdGhpbmdzIHVwIGluIC5iYXNoX3Byb2ZpbGUpLgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdGhhdCBob3VzZXMgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC11cGxvYWQtcGFjaycgaXMgaW52b2tlZCB2aWEKKwlzc2guCisKKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byBzeW5jIGZyb20uCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLXBhY2tlZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS1wYWNrZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNDg4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS1wYWNrZWQudHh0CkBAIC0wLDAgKzEsNTEgQEAKK2dpdC1wcnVuZS1wYWNrZWQoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcHJ1bmUtcGFja2VkIC0gUHJvZ3JhbSB1c2VkIHRvIHJlbW92ZSB0aGUgZXh0cmEgb2JqZWN0IGZpbGVzIHRoYXQgYXJlIG5vdworcmVzaWRpbmcgaW4gYSBwYWNrIGZpbGUuCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXBydW5lLXBhY2tlZCcgWy1uXQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBwcm9ncmFtIHNlYXJjaCB0aGUgYCRHSVRfT0JKRUNUX0RJUmAgZm9yIGFsbCBvYmplY3RzIHRoYXQgY3VycmVudGx5CitleGlzdCBpbiBhIHBhY2sgZmlsZSBhcyB3ZWxsIGFzIHRoZSBpbmRlcGVuZGVudCBvYmplY3QgZGlyZWN0b3JpZXMuCisKK0FsbCBzdWNoIGV4dHJhIG9iamVjdHMgYXJlIHJlbW92ZWQuCisKK0EgcGFjayBpcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cywgaW5kaXZpZHVhbGx5IGNvbXByZXNzZWQsIHdpdGggZGVsdGEKK2NvbXByZXNzaW9uIGFwcGxpZWQsIHN0b3JlZCBpbiBhIHNpbmdsZSBmaWxlLCB3aXRoIGFuIGFzc29jaWF0ZWQgaW5kZXggZmlsZS4KKworUGFja3MgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBsb2FkIG9uIG1pcnJvciBzeXN0ZW1zLCBiYWNrdXAgZW5naW5lcywKK2Rpc2sgc3RvcmFnZSwgZXRjLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1uOjoKKyAgICAgICAgRG9uJ3QgYWN0dWFsbHkgcmVtb3ZlIGFueSBvYmplY3RzLCBvbmx5IHNob3cgdGhvc2UgdGhhdCB3b3VsZCBoYXZlIGJlZW4KKyAgICAgICAgcmVtb3ZlZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXQorZ2l0bGluazpnaXQtcmVwYWNrWzFdCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1wcnVuZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExZTMwMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXBydW5lLnR4dApAQCAtMCwwICsxLDYxIEBACitnaXQtcHJ1bmUoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcHJ1bmUgLSBQcnVuZXMgYWxsIHVucmVhY2hhYmxlIG9iamVjdHMgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXBydW5lJyBbLW5dIFstLV0gWzxoZWFkPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1RoaXMgcnVucyBgZ2l0LWZzY2stb2JqZWN0cyAtLXVucmVhY2hhYmxlYCB1c2luZyBhbGwgdGhlIHJlZnMKK2F2YWlsYWJsZSBpbiBgJEdJVF9ESVIvcmVmc2AsIG9wdGlvbmFsbHkgd2l0aCBhZGRpdGlvbmFsIHNldCBvZgorb2JqZWN0cyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHBydW5lcyBhbGwKK29iamVjdHMgdW5yZWFjaGFibGUgZnJvbSBhbnkgb2YgdGhlc2UgaGVhZCBvYmplY3RzIGZyb20gdGhlIG9iamVjdCBkYXRhYmFzZS4KK0luIGFkZGl0aW9uLCBpdAorcHJ1bmVzIHRoZSB1bnBhY2tlZCBvYmplY3RzIHRoYXQgYXJlIGFsc28gZm91bmQgaW4gcGFja3MgYnkKK3J1bm5pbmcgYGdpdCBwcnVuZS1wYWNrZWRgLgorCitPUFRJT05TCistLS0tLS0tCisKKy1uOjoKKwlEbyBub3QgcmVtb3ZlIGFueXRoaW5nOyBqdXN0IHJlcG9ydCB3aGF0IGl0IHdvdWxkCisJcmVtb3ZlLgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxoZWFkPi4uLjo6CisJSW4gYWRkaXRpb24gdG8gb2JqZWN0cworCXJlYWNoYWJsZSBmcm9tIGFueSBvZiBvdXIgcmVmZXJlbmNlcywga2VlcCBvYmplY3RzCisJcmVhY2hhYmxlIGZyb20gbGlzdGVkIDxoZWFkPnMuCisKK0VYQU1QTEUKKy0tLS0tLS0KKworVG8gcHJ1bmUgb2JqZWN0cyBub3QgdXNlZCBieSB5b3VyIHJlcG9zaXRvcnkgbm9yIGFub3RoZXIgdGhhdAorYm9ycm93cyBmcm9tIHlvdXIgcmVwb3NpdG9yeSB2aWEgaXRzCitgLmdpdC9vYmplY3RzL2luZm8vYWx0ZXJuYXRlc2A6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgcHJ1bmUgJChjZCAuLi9hbm90aGVyICYmICQoZ2l0LXJldi1wYXJzZSAtLWFsbCkpCistLS0tLS0tLS0tLS0KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1NzdmYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXB1bGwudHh0CkBAIC0wLDAgKzEsMTMyIEBACitnaXQtcHVsbCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXB1bGwgLSBQdWxsIGFuZCBtZXJnZSBmcm9tIGFub3RoZXIgcmVwb3NpdG9yeQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wdWxsJyA8b3B0aW9ucz4gPHJlcG9zaXRvcnk+IDxyZWZzcGVjPi4uLgorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUnVucyBgZ2l0LWZldGNoYCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLCBhbmQgY2FsbHMgYGdpdC1tZXJnZWAKK3RvIG1lcmdlIHRoZSByZXRyaWV2ZWQgaGVhZChzKSBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC4KKworTm90ZSB0aGF0IHlvdSBjYW4gdXNlIGAuYCAoY3VycmVudCBkaXJlY3RvcnkpIGFzIHRoZQorPHJlcG9zaXRvcnk+IHRvIHB1bGwgZnJvbSB0aGUgbG9jYWwgcmVwb3NpdG9yeSAtLSB0aGlzIGlzIHVzZWZ1bAord2hlbiBtZXJnaW5nIGxvY2FsIGJyYW5jaGVzIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLgorCisKK09QVElPTlMKKy0tLS0tLS0KK2luY2x1ZGU6Om1lcmdlLW9wdGlvbnMudHh0W10KKworaW5jbHVkZTo6ZmV0Y2gtb3B0aW9ucy50eHRbXQorCitpbmNsdWRlOjpwdWxsLWZldGNoLXBhcmFtLnR4dFtdCisKK2luY2x1ZGU6OnVybHMudHh0W10KKworaW5jbHVkZTo6bWVyZ2Utc3RyYXRlZ2llcy50eHRbXQorCitFWEFNUExFUworLS0tLS0tLS0KKworZ2l0IHB1bGwsIGdpdCBwdWxsIG9yaWdpbjo6CisJRmV0Y2ggdGhlIGRlZmF1bHQgaGVhZCBmcm9tIHRoZSByZXBvc2l0b3J5IHlvdSBjbG9uZWQKKwlmcm9tIGFuZCBtZXJnZSBpdCBpbnRvIHlvdXIgY3VycmVudCBicmFuY2guCisKK2dpdCBwdWxsIC1zIG91cnMgLiBvYnNvbGV0ZTo6CisJTWVyZ2UgbG9jYWwgYnJhbmNoIGBvYnNvbGV0ZWAgaW50byB0aGUgY3VycmVudCBicmFuY2gsCisJdXNpbmcgYG91cnNgIG1lcmdlIHN0cmF0ZWd5LgorCitnaXQgcHVsbCAuIGZpeGVzIGVuaGFuY2VtZW50czo6CisJQnVuZGxlIGxvY2FsIGJyYW5jaCBgZml4ZXNgIGFuZCBgZW5oYW5jZW1lbnRzYCBvbiB0b3Agb2YKKwl0aGUgY3VycmVudCBicmFuY2gsIG1ha2luZyBhbiBPY3RvcHVzIG1lcmdlLgorCitnaXQgcHVsbCAtLW5vLWNvbW1pdCAuIG1haW50OjoKKwlNZXJnZSBsb2NhbCBicmFuY2ggYG1haW50YCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgYnV0CisJZG8gbm90IG1ha2UgYSBjb21taXQgYXV0b21hdGljYWxseS4gIFRoaXMgY2FuIGJlIHVzZWQKKwl3aGVuIHlvdSB3YW50IHRvIGluY2x1ZGUgZnVydGhlciBjaGFuZ2VzIHRvIHRoZSBtZXJnZSwKKwlvciB3YW50IHRvIHdyaXRlIHlvdXIgb3duIG1lcmdlIGNvbW1pdCBtZXNzYWdlLgorKworWW91IHNob3VsZCByZWZyYWluIGZyb20gYWJ1c2luZyB0aGlzIG9wdGlvbiB0byBzbmVhayBzdWJzdGFudGlhbAorY2hhbmdlcyBpbnRvIGEgbWVyZ2UgY29tbWl0LiAgU21hbGwgZml4dXBzIGxpa2UgYnVtcGluZworcmVsZWFzZS92ZXJzaW9uIG5hbWUgd291bGQgYmUgYWNjZXB0YWJsZS4KKworQ29tbWFuZCBsaW5lIHB1bGwgb2YgbXVsdGlwbGUgYnJhbmNoZXMgZnJvbSBvbmUgcmVwb3NpdG9yeTo6CisrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2F0IC5naXQvcmVtb3Rlcy9vcmlnaW4KK1VSTDogZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9naXQvZ2l0LmdpdAorUHVsbDogbWFzdGVyOm9yaWdpbgorCiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZ2l0IGZldGNoIG9yaWdpbiBtYXN0ZXI6b3JpZ2luICtwdTpwdSBtYWludDptYWludAorJCBnaXQgcHVsbCAuIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrCitIZXJlLCBhIHR5cGljYWwgYC5naXQvcmVtb3Rlcy9vcmlnaW5gIGZpbGUgZnJvbSBhCitgZ2l0LWNsb25lYCBvcGVyYXRpb24gaXMgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoCitjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBgZ2l0LWZldGNoYCB0byBmaXJzdCB1cGRhdGUKK211bHRpcGxlIGJyYW5jaGVzIG9mIHRoZSBsb2NhbCByZXBvc2l0b3J5IGFuZCB0aGVuCit0byBtZXJnZSB0aGUgcmVtb3RlIGBvcmlnaW5gIGJyYW5jaCBpbnRvIHRoZSBsb2NhbAorYG1hc3RlcmAgYnJhbmNoLiAgVGhlIGxvY2FsIGBwdWAgYnJhbmNoIGlzIHVwZGF0ZWQKK2V2ZW4gaWYgaXQgZG9lcyBub3QgcmVzdWx0IGluIGEgZmFzdCBmb3J3YXJkIHVwZGF0ZS4KK0hlcmUsIHRoZSBwdWxsIGNhbiBvYnRhaW4gaXRzIG9iamVjdHMgZnJvbSB0aGUgbG9jYWwKK3JlcG9zaXRvcnkgdXNpbmcgYC5gLCBhcyB0aGUgcHJldmlvdXMgYGdpdC1mZXRjaGAgaXMKK2tub3duIHRvIGhhdmUgYWxyZWFkeSBvYnRhaW5lZCBhbmQgbWFkZSBhdmFpbGFibGUKK2FsbCB0aGUgbmVjZXNzYXJ5IG9iamVjdHMuCisKKworUHVsbCBvZiBtdWx0aXBsZSBicmFuY2hlcyBmcm9tIG9uZSByZXBvc2l0b3J5IHVzaW5nIGAuZ2l0L3JlbW90ZXNgIGZpbGU6OgorKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L3JlbW90ZXMvb3JpZ2luCitVUkw6IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZ2l0L2dpdC5naXQKK1B1bGw6IG1hc3RlcjpvcmlnaW4KK1B1bGw6ICtwdTpwdQorUHVsbDogbWFpbnQ6bWFpbnQKKworJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCBwdWxsIG9yaWdpbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisrCitIZXJlLCBhIHR5cGljYWwgYC5naXQvcmVtb3Rlcy9vcmlnaW5gIGZpbGUgZnJvbSBhCitgZ2l0LWNsb25lYCBvcGVyYXRpb24gaGFzIGJlZW4gaGFuZC1tb2RpZmllZCB0byBpbmNsdWRlCit0aGUgYnJhbmNoLW1hcHBpbmcgb2YgYWRkaXRpb25hbCByZW1vdGUgYW5kIGxvY2FsCitoZWFkcyBkaXJlY3RseS4gIEEgc2luZ2xlIGBnaXQtcHVsbGAgb3BlcmF0aW9uIHdoaWxlCitpbiB0aGUgYG1hc3RlcmAgYnJhbmNoIHdpbGwgZmV0Y2ggbXVsdGlwbGUgaGVhZHMgYW5kCittZXJnZSB0aGUgcmVtb3RlIGBvcmlnaW5gIGhlYWQgaW50byB0aGUgY3VycmVudCwKK2xvY2FsIGBtYXN0ZXJgIGJyYW5jaC4KKworCitJZiB5b3UgdHJpZWQgYSBwdWxsIHdoaWNoIHJlc3VsdGVkIGluIGEgY29tcGxleCBjb25mbGljdHMgYW5kCit3b3VsZCB3YW50IHRvIHN0YXJ0IG92ZXIsIHlvdSBjYW4gcmVjb3ZlciB3aXRoCitnaXRsaW5rOmdpdC1yZXNldFsxXS4KKworCitTRUUgQUxTTworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWZldGNoWzFdLCBnaXRsaW5rOmdpdC1tZXJnZVsxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK2FuZCBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvbiBMb2VsaWdlciwKK0RhdmlkIEdyZWF2ZXMsCitKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcHVzaC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhZTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXB1c2gudHh0CkBAIC0wLDAgKzEsODcgQEAKK2dpdC1wdXNoKDEpCis9PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcHVzaCAtIFVwZGF0ZSByZW1vdGUgcmVmcyBhbG9uZyB3aXRoIGFzc29jaWF0ZWQgb2JqZWN0cworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1wdXNoJyBbLS1hbGxdIFstLXRhZ3NdIFstZiB8IC0tZm9yY2VdIDxyZXBvc2l0b3J5PiA8cmVmc3BlYz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1VwZGF0ZXMgcmVtb3RlIHJlZnMgdXNpbmcgbG9jYWwgcmVmcywgd2hpbGUgc2VuZGluZyBvYmplY3RzCituZWNlc3NhcnkgdG8gY29tcGxldGUgdGhlIGdpdmVuIHJlZnMuCisKK1lvdSBjYW4gbWFrZSBpbnRlcmVzdGluZyB0aGluZ3MgaGFwcGVuIHRvIGEgcmVwb3NpdG9yeQorZXZlcnkgdGltZSB5b3UgcHVzaCBpbnRvIGl0LCBieSBzZXR0aW5nIHVwICdob29rcycgdGhlcmUuICBTZWUKK2RvY3VtZW50YXRpb24gZm9yIGdpdGxpbms6Z2l0LXJlY2VpdmUtcGFja1sxXS4KKworCitPUFRJT05TCistLS0tLS0tCis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgZGVzdGluYXRpb24gb2YgYSBwdXNoCisJb3BlcmF0aW9uLiAgU2VlIHRoZSBzZWN0aW9uIDw8VVJMUyxHSVQgVVJMUz4+IGJlbG93LgorCis8cmVmc3BlYz46OgorCVRoZSBjYW5vbmljYWwgZm9ybWF0IG9mIGEgPHJlZnNwZWM+IHBhcmFtZXRlciBpcworCWArPzxzcmM+Ojxkc3Q+YDsgdGhhdCBpcywgYW4gb3B0aW9uYWwgcGx1cyBgK2AsIGZvbGxvd2VkCisJYnkgdGhlIHNvdXJjZSByZWYsIGZvbGxvd2VkIGJ5IGEgY29sb24gYDpgLCBmb2xsb3dlZCBieQorCXRoZSBkZXN0aW5hdGlvbiByZWYuCisrCitUaGUgPHNyYz4gc2lkZSBjYW4gYmUgYW4KK2FyYml0cmFyeSAiU0hBMSBleHByZXNzaW9uIiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuCithcmd1bWVudCB0byBgZ2l0LWNhdC1maWxlIC10YC4gIEUuZy4gYG1hc3Rlcn40YCAocHVzaAorZm91ciBwYXJlbnRzIGJlZm9yZSB0aGUgY3VycmVudCBtYXN0ZXIgaGVhZCkuCisrCitUaGUgbG9jYWwgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPiBpcyB1c2VkCit0byBmYXN0IGZvcndhcmQgdGhlIHJlbW90ZSByZWYgdGhhdCBtYXRjaGVzIDxkc3Q+LiAgSWYKK3RoZSBvcHRpb25hbCBwbHVzIGArYCBpcyB1c2VkLCB0aGUgcmVtb3RlIHJlZiBpcyB1cGRhdGVkCitldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZCB1cGRhdGUuCisrCitOb3RlOiBJZiBubyBleHBsaWNpdCByZWZzcGVjIGlzIGZvdW5kLCAodGhhdCBpcyBuZWl0aGVyCitvbiB0aGUgY29tbWFuZCBsaW5lIG5vciBpbiBhbnkgUHVzaCBsaW5lIG9mIHRoZQorY29ycmVzcG9uZGluZyByZW1vdGVzIGZpbGUtLS1zZWUgYmVsb3cpLCB0aGVuIGFsbCB0aGUKK3JlZnMgdGhhdCBleGlzdCBib3RoIG9uIHRoZSBsb2NhbCBzaWRlIGFuZCBvbiB0aGUgcmVtb3RlCitzaWRlIGFyZSB1cGRhdGVkLgorKworU29tZSBzaG9ydC1jdXQgbm90YXRpb25zIGFyZSBhbHNvIHN1cHBvcnRlZC4KKysKKyogYHRhZyA8dGFnPmAgbWVhbnMgdGhlIHNhbWUgYXMgYHJlZnMvdGFncy88dGFnPjpyZWZzL3RhZ3MvPHRhZz5gLgorKiBBIHBhcmFtZXRlciA8cmVmPiB3aXRob3V0IGEgY29sb24gaXMgZXF1aXZhbGVudCB0bworICA8cmVmPmA6YDxyZWY+LCBoZW5jZSB1cGRhdGVzIDxyZWY+IGluIHRoZSBkZXN0aW5hdGlvbiBmcm9tIDxyZWY+CisgIGluIHRoZSBzb3VyY2UuCisKK1wtLWFsbDo6CisJSW5zdGVhZCBvZiBuYW1pbmcgZWFjaCByZWYgdG8gcHVzaCwgc3BlY2lmaWVzIHRoYXQgYWxsCisJcmVmcyBiZSBwdXNoZWQuCisKK1wtLXRhZ3M6OgorCUFsbCByZWZzIHVuZGVyIGAkR0lUX0RJUi9yZWZzL3RhZ3NgIGFyZSBwdXNoZWQsIGluCisJYWRkaXRpb24gdG8gcmVmc3BlY3MgZXhwbGljaXRseSBsaXN0ZWQgb24gdGhlIGNvbW1hbmQKKwlsaW5lLgorCistZiwgXC0tZm9yY2U6OgorCVVzdWFsbHksIHRoZSBjb21tYW5kIHJlZnVzZXMgdG8gdXBkYXRlIGEgcmVtb3RlIHJlZiB0aGF0IGlzCisJbm90IGEgZGVzY2VuZGFudCBvZiB0aGUgbG9jYWwgcmVmIHVzZWQgdG8gb3ZlcndyaXRlIGl0LgorCVRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2suICBUaGlzIGNhbiBjYXVzZSB0aGUKKwlyZW1vdGUgcmVwb3NpdG9yeSB0byBsb3NlIGNvbW1pdHM7IHVzZSBpdCB3aXRoIGNhcmUuCisKK2luY2x1ZGU6OnVybHMudHh0W10KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXF1aWx0aW1wb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTlhOGMzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcXVpbHRpbXBvcnQudHh0CkBAIC0wLDAgKzEsNjEgQEAKK2dpdC1xdWlsdGltcG9ydCgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcXVpbHRpbXBvcnQgLSBBcHBsaWVzIGEgcXVpbHQgcGF0Y2hzZXQgb250byB0aGUgY3VycmVudCBicmFuY2gKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcXVpbHRpbXBvcnQnIFstLWRyeS1ydW5dIFstLWF1dGhvciA8YXV0aG9yPl0gWy0tcGF0Y2hlcyA8ZGlyPl0KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0FwcGxpZXMgYSBxdWlsdCBwYXRjaHNldCBvbnRvIHRoZSBjdXJyZW50IGdpdCBicmFuY2gsIHByZXNlcnZpbmcKK3RoZSBwYXRjaCBib3VuZGFyaWVzLCBwYXRjaCBvcmRlciwgYW5kIHBhdGNoIGRlc2NyaXB0aW9ucyBwcmVzZW50CitpbiB0aGUgcXVpbHQgcGF0Y2hzZXQuCisKK0ZvciBlYWNoIHBhdGNoIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGV4dHJhY3QgdGhlIGF1dGhvciBmcm9tIHRoZQorcGF0Y2ggZGVzY3JpcHRpb24uICBJZiB0aGF0IGZhaWxzIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGF1dGhvcgorc3BlY2lmaWVkIHdpdGggLS1hdXRob3IuICBJZiB0aGUgLS1hdXRob3IgZmxhZyB3YXMgbm90IGdpdmVuCit0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaXMgZGlzcGxheWVkIGFuZCB0aGUgdXNlciBpcyBhc2tlZCB0bworaW50ZXJhY3RpdmVseSBlbnRlciB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4KKworSWYgYSBzdWJqZWN0IGlzIG5vdCBmb3VuZCBpbiB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gdGhlIHBhdGNoIG5hbWUgaXMKK3ByZXNlcnZlZCBhcyB0aGUgMSBsaW5lIHN1YmplY3QgaW4gdGhlIGdpdCBkZXNjcmlwdGlvbi4KKworT1BUSU9OUworLS0tLS0tLQorLS1kcnktcnVuOjoKKwlXYWxrIHRocm91Z2ggdGhlIHBhdGNoZXMgaW4gdGhlIHNlcmllcyBhbmQgd2FybgorCWlmIHdlIGNhbm5vdCBmaW5kIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGNvbW1pdAorCWEgcGF0Y2guICBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcgb25seSBtaXNzaW5nIGF1dGhvcgorCWluZm9ybWF0aW9uIGlzIHdhcm5lZCBhYm91dC4KKworLS1hdXRob3IgQXV0aG9yIE5hbWUgPEF1dGhvciBFbWFpbD46OgorCVRoZSBhdXRob3IgbmFtZSBhbmQgZW1haWwgYWRkcmVzcyB0byB1c2Ugd2hlbiBubyBhdXRob3IKKwlpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGNoIGRlc2NyaXB0aW9uLgorCistLXBhdGNoZXMgPGRpcj46OgorCVRoZSBkaXJlY3RvcnkgdG8gZmluZCB0aGUgcXVpbHQgcGF0Y2hlcyBhbmQgdGhlCisJcXVpbHQgc2VyaWVzIGZpbGUuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgZm9yIHRoZSBwYXRjaCBkaXJlY3RvcnkgaXMgcGF0Y2hlcworCW9yIHRoZSB2YWx1ZSBvZiB0aGUgJFFVSUxUX1BBVENIRVMgZW52aXJvbm1lbnQKKwl2YXJpYWJsZS4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBCaWVkZXJtYW4gPGViaWVkZXJtQGxueGkuY29tPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AbG54aS5jb20+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZWFkLXRyZWUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWJkOWMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dApAQCAtMCwwICsxLDMzMiBAQAorZ2l0LXJlYWQtdHJlZSgxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVhZC10cmVlIC0gUmVhZHMgdHJlZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBpbmRleAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZWFkLXRyZWUnICg8dHJlZS1pc2g+IHwgW1stbSBbLS1hZ2dyZXNzaXZlXSB8IC0tcmVzZXQgfCAtLXByZWZpeD08cHJlZml4Pl0gWy11IHwgLWldXSA8dHJlZS1pc2gxPiBbPHRyZWUtaXNoMj4gWzx0cmVlLWlzaDM+XV0pCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyB0aGUgdHJlZSBpbmZvcm1hdGlvbiBnaXZlbiBieSA8dHJlZS1pc2g+IGludG8gdGhlIGluZGV4LAorYnV0IGRvZXMgbm90IGFjdHVhbGx5ICp1cGRhdGUqIGFueSBvZiB0aGUgZmlsZXMgaXQgImNhY2hlcyIuIChzZWU6CitnaXRsaW5rOmdpdC1jaGVja291dC1pbmRleFsxXSkKKworT3B0aW9uYWxseSwgaXQgY2FuIG1lcmdlIGEgdHJlZSBpbnRvIHRoZSBpbmRleCwgcGVyZm9ybSBhCitmYXN0LWZvcndhcmQgKGkuZS4gMi13YXkpIG1lcmdlLCBvciBhIDMtd2F5IG1lcmdlLCB3aXRoIHRoZSBgLW1gCitmbGFnLiAgV2hlbiB1c2VkIHdpdGggYC1tYCwgdGhlIGAtdWAgZmxhZyBjYXVzZXMgaXQgdG8gYWxzbyB1cGRhdGUKK3RoZSBmaWxlcyBpbiB0aGUgd29yayB0cmVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCisKK1RyaXZpYWwgbWVyZ2VzIGFyZSBkb25lIGJ5IGBnaXQtcmVhZC10cmVlYCBpdHNlbGYuICBPbmx5IGNvbmZsaWN0aW5nIHBhdGhzCit3aWxsIGJlIGluIHVubWVyZ2VkIHN0YXRlIHdoZW4gYGdpdC1yZWFkLXRyZWVgIHJldHVybnMuCisKK09QVElPTlMKKy0tLS0tLS0KKy1tOjoKKwlQZXJmb3JtIGEgbWVyZ2UsIG5vdCBqdXN0IGEgcmVhZC4gIFRoZSBjb21tYW5kIHdpbGwKKwlyZWZ1c2UgdG8gcnVuIGlmIHlvdXIgaW5kZXggZmlsZSBoYXMgdW5tZXJnZWQgZW50cmllcywKKwlpbmRpY2F0aW5nIHRoYXQgeW91IGhhdmUgbm90IGZpbmlzaGVkIHByZXZpb3VzIG1lcmdlIHlvdQorCXN0YXJ0ZWQuCisKKy0tcmVzZXQ6OgorICAgICAgICBTYW1lIGFzIC1tLCBleGNlcHQgdGhhdCB1bm1lcmdlZCBlbnRyaWVzIGFyZSBkaXNjYXJkZWQKKyAgICAgICAgaW5zdGVhZCBvZiBmYWlsaW5nLgorCistdTo6CisJQWZ0ZXIgYSBzdWNjZXNzZnVsIG1lcmdlLCB1cGRhdGUgdGhlIGZpbGVzIGluIHRoZSB3b3JrCisJdHJlZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCistaTo6CisJVXN1YWxseSBhIG1lcmdlIHJlcXVpcmVzIHRoZSBpbmRleCBmaWxlIGFzIHdlbGwgYXMgdGhlCisJZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcmUgdXAgdG8gZGF0ZSB3aXRoIHRoZQorCWN1cnJlbnQgaGVhZCBjb21taXQsIGluIG9yZGVyIG5vdCB0byBsb3NlIGxvY2FsCisJY2hhbmdlcy4gIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgY2hlY2sgd2l0aCB0aGUgd29ya2luZworCXRyZWUgYW5kIGlzIG1lYW50IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIG1lcmdlIG9mCisJdHJlZXMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGN1cnJlbnQKKwl3b3JraW5nIHRyZWUgc3RhdHVzIGludG8gYSB0ZW1wb3JhcnkgaW5kZXggZmlsZS4KKworLS1hZ2dyZXNzaXZlOjoKKwlVc3VhbGx5IGEgdGhyZWUtd2F5IG1lcmdlIGJ5IGBnaXQtcmVhZC10cmVlYCByZXNvbHZlcworCXRoZSBtZXJnZSBmb3IgcmVhbGx5IHRyaXZpYWwgY2FzZXMgYW5kIGxlYXZlcyBvdGhlcgorCWNhc2VzIHVucmVzb2x2ZWQgaW4gdGhlIGluZGV4LCBzbyB0aGF0IFBvcmNlbGFpbnMgY2FuCisJaW1wbGVtZW50IGRpZmZlcmVudCBtZXJnZSBwb2xpY2llcy4gIFRoaXMgZmxhZyBtYWtlcyB0aGUKKwljb21tYW5kIHRvIHJlc29sdmUgYSBmZXcgbW9yZSBjYXNlcyBpbnRlcm5hbGx5OgorKworKiB3aGVuIG9uZSBzaWRlIHJlbW92ZXMgYSBwYXRoIGFuZCB0aGUgb3RoZXIgc2lkZSBsZWF2ZXMgdGhlIHBhdGgKKyAgdW5tb2RpZmllZC4gIFRoZSByZXNvbHV0aW9uIGlzIHRvIHJlbW92ZSB0aGF0IHBhdGguCisqIHdoZW4gYm90aCBzaWRlcyByZW1vdmUgYSBwYXRoLiAgVGhlIHJlc29sdXRpb24gaXMgdG8gcmVtb3ZlIHRoYXQgcGF0aC4KKyogd2hlbiBib3RoIHNpZGVzIGFkZHMgYSBwYXRoIGlkZW50aWNhbGx5LiAgVGhlIHJlc29sdXRpb24KKyAgaXMgdG8gYWRkIHRoYXQgcGF0aC4KKworLS1wcmVmaXg9PHByZWZpeD4vOjoKKwlLZWVwIHRoZSBjdXJyZW50IGluZGV4IGNvbnRlbnRzLCBhbmQgcmVhZCB0aGUgY29udGVudHMKKwlvZiBuYW1lZCB0cmVlLWlzaCB1bmRlciBkaXJlY3RvcnkgYXQgYDxwcmVmaXg+YC4gIFRoZQorCW9yaWdpbmFsIGluZGV4IGZpbGUgY2Fubm90IGhhdmUgYW55dGhpbmcgYXQgdGhlIHBhdGgKKwlgPHByZWZpeD5gIGl0c2VsZiwgYW5kIGhhdmUgbm90aGluZyBpbiBgPHByZWZpeD4vYAorCWRpcmVjdG9yeS4gIE5vdGUgdGhhdCB0aGUgYDxwcmVmaXg+L2AgdmFsdWUgbXVzdCBlbmQKKwl3aXRoIGEgc2xhc2guCisKKworPHRyZWUtaXNoIz46OgorCVRoZSBpZCBvZiB0aGUgdHJlZSBvYmplY3QocykgdG8gYmUgcmVhZC9tZXJnZWQuCisKKworTWVyZ2luZworLS0tLS0tLQorSWYgYC1tYCBpcyBzcGVjaWZpZWQsIGBnaXQtcmVhZC10cmVlYCBjYW4gcGVyZm9ybSAzIGtpbmRzIG9mCittZXJnZSwgYSBzaW5nbGUgdHJlZSBtZXJnZSBpZiBvbmx5IDEgdHJlZSBpcyBnaXZlbiwgYQorZmFzdC1mb3J3YXJkIG1lcmdlIHdpdGggMiB0cmVlcywgb3IgYSAzLXdheSBtZXJnZSBpZiAzIHRyZWVzIGFyZQorcHJvdmlkZWQuCisKKworU2luZ2xlIFRyZWUgTWVyZ2UKK35+fn5+fn5+fn5+fn5+fn5+CitJZiBvbmx5IDEgdHJlZSBpcyBzcGVjaWZpZWQsIGdpdC1yZWFkLXRyZWUgb3BlcmF0ZXMgYXMgaWYgdGhlIHVzZXIgZGlkIG5vdAorc3BlY2lmeSBgLW1gLCBleGNlcHQgdGhhdCBpZiB0aGUgb3JpZ2luYWwgaW5kZXggaGFzIGFuIGVudHJ5IGZvciBhCitnaXZlbiBwYXRobmFtZSwgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgcGF0aCBtYXRjaGVzIHdpdGggdGhlIHRyZWUKK2JlaW5nIHJlYWQsIHRoZSBzdGF0IGluZm8gZnJvbSB0aGUgaW5kZXggaXMgdXNlZC4gKEluIG90aGVyIHdvcmRzLCB0aGUKK2luZGV4J3Mgc3RhdCgpcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgbWVyZ2VkIHRyZWUncykuCisKK1RoYXQgbWVhbnMgdGhhdCBpZiB5b3UgZG8gYSBgZ2l0LXJlYWQtdHJlZSAtbSA8bmV3dHJlZT5gIGZvbGxvd2VkIGJ5IGEKK2BnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWFgLCB0aGUgYGdpdC1jaGVja291dC1pbmRleGAgb25seSBjaGVja3Mgb3V0Cit0aGUgc3R1ZmYgdGhhdCByZWFsbHkgY2hhbmdlZC4KKworVGhpcyBpcyB1c2VkIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZhbHNlIGhpdHMgd2hlbiBgZ2l0LWRpZmYtZmlsZXNgIGlzCitydW4gYWZ0ZXIgYGdpdC1yZWFkLXRyZWVgLgorCisKK1R3byBUcmVlIE1lcmdlCit+fn5+fn5+fn5+fn5+fgorCitUeXBpY2FsbHksIHRoaXMgaXMgaW52b2tlZCBhcyBgZ2l0LXJlYWQtdHJlZSAtbSAkSCAkTWAsIHdoZXJlICRICitpcyB0aGUgaGVhZCBjb21taXQgb2YgdGhlIGN1cnJlbnQgcmVwb3NpdG9yeSwgYW5kICRNIGlzIHRoZSBoZWFkCitvZiBhIGZvcmVpZ24gdHJlZSwgd2hpY2ggaXMgc2ltcGx5IGFoZWFkIG9mICRIIChpLmUuIHdlIGFyZSBpbiBhCitmYXN0IGZvcndhcmQgc2l0dWF0aW9uKS4KKworV2hlbiB0d28gdHJlZXMgYXJlIHNwZWNpZmllZCwgdGhlIHVzZXIgaXMgdGVsbGluZyBnaXQtcmVhZC10cmVlCit0aGUgZm9sbG93aW5nOgorCisgICAgIDEuIFRoZSBjdXJyZW50IGluZGV4IGFuZCB3b3JrIHRyZWUgaXMgZGVyaXZlZCBmcm9tICRILCBidXQKKyAgICAgICAgdGhlIHVzZXIgbWF5IGhhdmUgbG9jYWwgY2hhbmdlcyBpbiB0aGVtIHNpbmNlICRIOworCisgICAgIDIuIFRoZSB1c2VyIHdhbnRzIHRvIGZhc3QtZm9yd2FyZCB0byAkTS4KKworSW4gdGhpcyBjYXNlLCB0aGUgYGdpdC1yZWFkLXRyZWUgLW0gJEggJE1gIGNvbW1hbmQgbWFrZXMgc3VyZQordGhhdCBubyBsb2NhbCBjaGFuZ2UgaXMgbG9zdCBhcyB0aGUgcmVzdWx0IG9mIHRoaXMgIm1lcmdlIi4KK0hlcmUgYXJlIHRoZSAiY2FycnkgZm9yd2FyZCIgcnVsZXM6CisKKyAgICAgICAgSSAoaW5kZXgpICAgICAgICAgICBIICAgICAgICBNICAgICAgICBSZXN1bHQKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAwIG5vdGhpbmcgICAgICAgICAgICAgbm90aGluZyAgbm90aGluZyAgKGRvZXMgbm90IGhhcHBlbikKKyAgICAgIDEgbm90aGluZyAgICAgICAgICAgICBub3RoaW5nICBleGlzdHMgICB1c2UgTQorICAgICAgMiBub3RoaW5nICAgICAgICAgICAgIGV4aXN0cyAgIG5vdGhpbmcgIHJlbW92ZSBwYXRoIGZyb20gaW5kZXgKKyAgICAgIDMgbm90aGluZyAgICAgICAgICAgICBleGlzdHMgICBleGlzdHMgICB1c2UgTQorCisgICAgICAgIGNsZWFuIEk9PUggIEk9PU0KKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIDQgeWVzICAgTi9BICAgTi9BICAgICBub3RoaW5nICBub3RoaW5nICBrZWVwIGluZGV4CisgICAgICA1IG5vICAgIE4vQSAgIE4vQSAgICAgbm90aGluZyAgbm90aGluZyAga2VlcCBpbmRleAorCisgICAgICA2IHllcyAgIE4vQSAgIHllcyAgICAgbm90aGluZyAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAgNyBubyAgICBOL0EgICB5ZXMgICAgIG5vdGhpbmcgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKyAgICAgIDggeWVzICAgTi9BICAgbm8gICAgICBub3RoaW5nICBleGlzdHMgICBmYWlsCisgICAgICA5IG5vICAgIE4vQSAgIG5vICAgICAgbm90aGluZyAgZXhpc3RzICAgZmFpbAorCisgICAgIDEwIHllcyAgIHllcyAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgcmVtb3ZlIHBhdGggZnJvbSBpbmRleAorICAgICAxMSBubyAgICB5ZXMgICBOL0EgICAgIGV4aXN0cyAgIG5vdGhpbmcgIGZhaWwKKyAgICAgMTIgeWVzICAgbm8gICAgTi9BICAgICBleGlzdHMgICBub3RoaW5nICBmYWlsCisgICAgIDEzIG5vICAgIG5vICAgIE4vQSAgICAgZXhpc3RzICAgbm90aGluZyAgZmFpbAorCisgICAgICAgIGNsZWFuIChIPU0pCisgICAgICAgLS0tLS0tCisgICAgIDE0IHllcyAgICAgICAgICAgICAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAxNSBubyAgICAgICAgICAgICAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKworICAgICAgICBjbGVhbiBJPT1IICBJPT1NIChIIT1NKQorICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxNiB5ZXMgICBubyAgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKyAgICAgMTcgbm8gICAgbm8gICAgbm8gICAgICBleGlzdHMgICBleGlzdHMgICBmYWlsCisgICAgIDE4IHllcyAgIG5vICAgIHllcyAgICAgZXhpc3RzICAgZXhpc3RzICAga2VlcCBpbmRleAorICAgICAxOSBubyAgICBubyAgICB5ZXMgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGtlZXAgaW5kZXgKKyAgICAgMjAgeWVzICAgeWVzICAgbm8gICAgICBleGlzdHMgICBleGlzdHMgICB1c2UgTQorICAgICAyMSBubyAgICB5ZXMgICBubyAgICAgIGV4aXN0cyAgIGV4aXN0cyAgIGZhaWwKKworSW4gYWxsICJrZWVwIGluZGV4IiBjYXNlcywgdGhlIGluZGV4IGVudHJ5IHN0YXlzIGFzIGluIHRoZQorb3JpZ2luYWwgaW5kZXggZmlsZS4gIElmIHRoZSBlbnRyeSB3ZXJlIG5vdCB1cCB0byBkYXRlLAorZ2l0LXJlYWQtdHJlZSBrZWVwcyB0aGUgY29weSBpbiB0aGUgd29yayB0cmVlIGludGFjdCB3aGVuCitvcGVyYXRpbmcgdW5kZXIgdGhlIC11IGZsYWcuCisKK1doZW4gdGhpcyBmb3JtIG9mIGdpdC1yZWFkLXRyZWUgcmV0dXJucyBzdWNjZXNzZnVsbHksIHlvdSBjYW4KK3NlZSB3aGF0ICJsb2NhbCBjaGFuZ2VzIiB5b3UgbWFkZSBhcmUgY2FycmllZCBmb3J3YXJkIGJ5IHJ1bm5pbmcKK2BnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkTWAuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdAorbmVjZXNzYXJpbHkgbWF0Y2ggYGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICRIYCB3b3VsZCBoYXZlCitwcm9kdWNlZCBiZWZvcmUgc3VjaCBhIHR3byB0cmVlIG1lcmdlLiAgVGhpcyBpcyBiZWNhdXNlIG9mIGNhc2VzCisxOCBhbmQgMTkgLS0tIGlmIHlvdSBhbHJlYWR5IGhhZCB0aGUgY2hhbmdlcyBpbiAkTSAoZS5nLiBtYXliZQoreW91IHBpY2tlZCBpdCB1cCB2aWEgZS1tYWlsIGluIGEgcGF0Y2ggZm9ybSksIGBnaXQtZGlmZi1pbmRleAorLS1jYWNoZWQgJEhgIHdvdWxkIGhhdmUgdG9sZCB5b3UgYWJvdXQgdGhlIGNoYW5nZSBiZWZvcmUgdGhpcworbWVyZ2UsIGJ1dCBpdCB3b3VsZCBub3Qgc2hvdyBpbiBgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJE1gCitvdXRwdXQgYWZ0ZXIgdHdvLXRyZWUgbWVyZ2UuCisKKworMy1XYXkgTWVyZ2UKK35+fn5+fn5+fn5+CitFYWNoICJpbmRleCIgZW50cnkgaGFzIHR3byBiaXRzIHdvcnRoIG9mICJzdGFnZSIgc3RhdGUuIHN0YWdlIDAgaXMgdGhlCitub3JtYWwgb25lLCBhbmQgaXMgdGhlIG9ubHkgb25lIHlvdSdkIHNlZSBpbiBhbnkga2luZCBvZiBub3JtYWwgdXNlLgorCitIb3dldmVyLCB3aGVuIHlvdSBkbyBgZ2l0LXJlYWQtdHJlZWAgd2l0aCB0aHJlZSB0cmVlcywgdGhlICJzdGFnZSIKK3N0YXJ0cyBvdXQgYXQgMS4KKworVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gZG8KKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tIDx0cmVlMT4gPHRyZWUyPiA8dHJlZTM+CistLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhbiBpbmRleCB3aXRoIGFsbCBvZiB0aGUgPHRyZWUxPiBlbnRyaWVzIGluCisic3RhZ2UxIiwgYWxsIG9mIHRoZSA8dHJlZTI+IGVudHJpZXMgaW4gInN0YWdlMiIgYW5kIGFsbCBvZiB0aGUKKzx0cmVlMz4gZW50cmllcyBpbiAic3RhZ2UzIi4gIFdoZW4gcGVyZm9ybWluZyBhIG1lcmdlIG9mIGFub3RoZXIKK2JyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgd2UgdXNlIHRoZSBjb21tb24gYW5jZXN0b3IgdHJlZQorYXMgPHRyZWUxPiwgdGhlIGN1cnJlbnQgYnJhbmNoIGhlYWQgYXMgPHRyZWUyPiwgYW5kIHRoZSBvdGhlcgorYnJhbmNoIGhlYWQgYXMgPHRyZWUzPi4KKworRnVydGhlcm1vcmUsIGBnaXQtcmVhZC10cmVlYCBoYXMgc3BlY2lhbC1jYXNlIGxvZ2ljIHRoYXQgc2F5czogaWYgeW91IHNlZQorYSBmaWxlIHRoYXQgbWF0Y2hlcyBpbiBhbGwgcmVzcGVjdHMgaW4gdGhlIGZvbGxvd2luZyBzdGF0ZXMsIGl0CisiY29sbGFwc2VzIiBiYWNrIHRvICJzdGFnZTAiOgorCisgICAtIHN0YWdlIDIgYW5kIDMgYXJlIHRoZSBzYW1lOyB0YWtlIG9uZSBvciB0aGUgb3RoZXIgKGl0IG1ha2VzIG5vCisgICAgIGRpZmZlcmVuY2UgLSB0aGUgc2FtZSB3b3JrIGhhcyBiZWVuIGRvbmUgb24gb3VyIGJyYW5jaCBpbgorICAgICBzdGFnZSAyIGFuZCB0aGVpciBicmFuY2ggaW4gc3RhZ2UgMykKKworICAgLSBzdGFnZSAxIGFuZCBzdGFnZSAyIGFyZSB0aGUgc2FtZSBhbmQgc3RhZ2UgMyBpcyBkaWZmZXJlbnQ7IHRha2UKKyAgICAgc3RhZ2UgMyAob3VyIGJyYW5jaCBpbiBzdGFnZSAyIGRpZCBub3QgZG8gYW55dGhpbmcgc2luY2UgdGhlCisgICAgIGFuY2VzdG9yIGluIHN0YWdlIDEgd2hpbGUgdGhlaXIgYnJhbmNoIGluIHN0YWdlIDMgd29ya2VkIG9uCisgICAgIGl0KQorCisgICAtIHN0YWdlIDEgYW5kIHN0YWdlIDMgYXJlIHRoZSBzYW1lIGFuZCBzdGFnZSAyIGlzIGRpZmZlcmVudCB0YWtlCisgICAgIHN0YWdlIDIgKHdlIGRpZCBzb21ldGhpbmcgd2hpbGUgdGhleSBkaWQgbm90aGluZykKKworVGhlIGBnaXQtd3JpdGUtdHJlZWAgY29tbWFuZCByZWZ1c2VzIHRvIHdyaXRlIGEgbm9uc2Vuc2ljYWwgdHJlZSwgYW5kIGl0Cit3aWxsIGNvbXBsYWluIGFib3V0IHVubWVyZ2VkIGVudHJpZXMgaWYgaXQgc2VlcyBhIHNpbmdsZSBlbnRyeSB0aGF0IGlzIG5vdAorc3RhZ2UgMC4KKworT0ssIHRoaXMgYWxsIHNvdW5kcyBsaWtlIGEgY29sbGVjdGlvbiBvZiB0b3RhbGx5IG5vbnNlbnNpY2FsIHJ1bGVzLAorYnV0IGl0J3MgYWN0dWFsbHkgZXhhY3RseSB3aGF0IHlvdSB3YW50IGluIG9yZGVyIHRvIGRvIGEgZmFzdAorbWVyZ2UuIFRoZSBkaWZmZXJlbnQgc3RhZ2VzIHJlcHJlc2VudCB0aGUgInJlc3VsdCB0cmVlIiAoc3RhZ2UgMCwgYWthCisibWVyZ2VkIiksIHRoZSBvcmlnaW5hbCB0cmVlIChzdGFnZSAxLCBha2EgIm9yaWciKSwgYW5kIHRoZSB0d28gdHJlZXMKK3lvdSBhcmUgdHJ5aW5nIHRvIG1lcmdlIChzdGFnZSAyIGFuZCAzIHJlc3BlY3RpdmVseSkuCisKK1RoZSBvcmRlciBvZiBzdGFnZXMgMSwgMiBhbmQgMyAoaGVuY2UgdGhlIG9yZGVyIG9mIHRocmVlCis8dHJlZS1pc2g+IGNvbW1hbmQgbGluZSBhcmd1bWVudHMpIGFyZSBzaWduaWZpY2FudCB3aGVuIHlvdQorc3RhcnQgYSAzLXdheSBtZXJnZSB3aXRoIGFuIGluZGV4IGZpbGUgdGhhdCBpcyBhbHJlYWR5Citwb3B1bGF0ZWQuICBIZXJlIGlzIGFuIG91dGxpbmUgb2YgaG93IHRoZSBhbGdvcml0aG0gd29ya3M6CisKKy0gaWYgYSBmaWxlIGV4aXN0cyBpbiBpZGVudGljYWwgZm9ybWF0IGluIGFsbCB0aHJlZSB0cmVlcywgaXQgd2lsbAorICBhdXRvbWF0aWNhbGx5IGNvbGxhcHNlIHRvICJtZXJnZWQiIHN0YXRlIGJ5IGdpdC1yZWFkLXRyZWUuCisKKy0gYSBmaWxlIHRoYXQgaGFzIF9hbnlfIGRpZmZlcmVuY2Ugd2hhdC1zby1ldmVyIGluIHRoZSB0aHJlZSB0cmVlcworICB3aWxsIHN0YXkgYXMgc2VwYXJhdGUgZW50cmllcyBpbiB0aGUgaW5kZXguIEl0J3MgdXAgdG8gInBvcmNlbGFpbgorICBwb2xpY3kiIHRvIGRldGVybWluZSBob3cgdG8gcmVtb3ZlIHRoZSBub24tMCBzdGFnZXMsIGFuZCBpbnNlcnQgYQorICBtZXJnZWQgdmVyc2lvbi4KKworLSB0aGUgaW5kZXggZmlsZSBzYXZlcyBhbmQgcmVzdG9yZXMgd2l0aCBhbGwgdGhpcyBpbmZvcm1hdGlvbiwgc28geW91CisgIGNhbiBtZXJnZSB0aGluZ3MgaW5jcmVtZW50YWxseSwgYnV0IGFzIGxvbmcgYXMgaXQgaGFzIGVudHJpZXMgaW4KKyAgc3RhZ2VzIDEvMi8zIChpLmUuLCAidW5tZXJnZWQgZW50cmllcyIpIHlvdSBjYW4ndCB3cml0ZSB0aGUgcmVzdWx0LiBTbworICBub3cgdGhlIG1lcmdlIGFsZ29yaXRobSBlbmRzIHVwIGJlaW5nIHJlYWxseSBzaW1wbGU6CisKKyAgKiB5b3Ugd2FsayB0aGUgaW5kZXggaW4gb3JkZXIsIGFuZCBpZ25vcmUgYWxsIGVudHJpZXMgb2Ygc3RhZ2UgMCwKKyAgICBzaW5jZSB0aGV5J3ZlIGFscmVhZHkgYmVlbiBkb25lLgorCisgICogaWYgeW91IGZpbmQgYSAic3RhZ2UxIiwgYnV0IG5vIG1hdGNoaW5nICJzdGFnZTIiIG9yICJzdGFnZTMiLCB5b3UKKyAgICBrbm93IGl0J3MgYmVlbiByZW1vdmVkIGZyb20gYm90aCB0cmVlcyAoaXQgb25seSBleGlzdGVkIGluIHRoZQorICAgIG9yaWdpbmFsIHRyZWUpLCBhbmQgeW91IHJlbW92ZSB0aGF0IGVudHJ5LgorCisgICogaWYgeW91IGZpbmQgYSBtYXRjaGluZyAic3RhZ2UyIiBhbmQgInN0YWdlMyIgdHJlZSwgeW91IHJlbW92ZSBvbmUKKyAgICBvZiB0aGVtLCBhbmQgdHVybiB0aGUgb3RoZXIgaW50byBhICJzdGFnZTAiIGVudHJ5LiBSZW1vdmUgYW55CisgICAgbWF0Y2hpbmcgInN0YWdlMSIgZW50cnkgaWYgaXQgZXhpc3RzIHRvby4gIC4uIGFsbCB0aGUgbm9ybWFsCisgICAgdHJpdmlhbCBydWxlcyAuLgorCitZb3Ugd291bGQgbm9ybWFsbHkgdXNlIGBnaXQtbWVyZ2UtaW5kZXhgIHdpdGggc3VwcGxpZWQKK2BnaXQtbWVyZ2Utb25lLWZpbGVgIHRvIGRvIHRoaXMgbGFzdCBzdGVwLiAgVGhlIHNjcmlwdCB1cGRhdGVzCit0aGUgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZSBhcyBpdCBtZXJnZXMgZWFjaCBwYXRoIGFuZCBhdCB0aGUKK2VuZCBvZiBhIHN1Y2Nlc3NmdWwgbWVyZ2UuCisKK1doZW4geW91IHN0YXJ0IGEgMy13YXkgbWVyZ2Ugd2l0aCBhbiBpbmRleCBmaWxlIHRoYXQgaXMgYWxyZWFkeQorcG9wdWxhdGVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgdGhlCitmaWxlcyBpbiB5b3VyIHdvcmsgdHJlZSwgYW5kIHlvdSBjYW4gZXZlbiBoYXZlIGZpbGVzIHdpdGgKK2NoYW5nZXMgdW5yZWNvcmRlZCBpbiB0aGUgaW5kZXggZmlsZS4gIEl0IGlzIGZ1cnRoZXIgYXNzdW1lZAordGhhdCB0aGlzIHN0YXRlIGlzICJkZXJpdmVkIiBmcm9tIHRoZSBzdGFnZSAyIHRyZWUuICBUaGUgMy13YXkKK21lcmdlIHJlZnVzZXMgdG8gcnVuIGlmIGl0IGZpbmRzIGFuIGVudHJ5IGluIHRoZSBvcmlnaW5hbCBpbmRleAorZmlsZSB0aGF0IGRvZXMgbm90IG1hdGNoIHN0YWdlIDIuCisKK1RoaXMgaXMgZG9uZSB0byBwcmV2ZW50IHlvdSBmcm9tIGxvc2luZyB5b3VyIHdvcmstaW4tcHJvZ3Jlc3MKK2NoYW5nZXMsIGFuZCBtaXhpbmcgeW91ciByYW5kb20gY2hhbmdlcyBpbiBhbiB1bnJlbGF0ZWQgbWVyZ2UKK2NvbW1pdC4gIFRvIGlsbHVzdHJhdGUsIHN1cHBvc2UgeW91IHN0YXJ0IGZyb20gd2hhdCBoYXMgYmVlbgorY29tbWl0dGVkIGxhc3QgdG8geW91ciByZXBvc2l0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tCiskIEpDPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJIRUFEXjAiYAorJCBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJEpDCistLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBkbyByYW5kb20gZWRpdHMsIHdpdGhvdXQgcnVubmluZyBnaXQtdXBkYXRlLWluZGV4LiAgQW5kIHRoZW4KK3lvdSBub3RpY2UgdGhhdCB0aGUgdGlwIG9mIHlvdXIgInVwc3RyZWFtIiB0cmVlIGhhcyBhZHZhbmNlZAorc2luY2UgeW91IHB1bGxlZCBmcm9tIGhpbToKKworLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtZmV0Y2ggZ2l0Oi8vLi4uLiBsaW51cworJCBMVD1gY2F0IC5naXQvRkVUQ0hfSEVBRGAKKy0tLS0tLS0tLS0tLS0tLS0KKworWW91ciB3b3JrIHRyZWUgaXMgc3RpbGwgYmFzZWQgb24geW91ciBIRUFEICgkSkMpLCBidXQgeW91IGhhdmUKK3NvbWUgZWRpdHMgc2luY2UuICBUaHJlZS13YXkgbWVyZ2UgbWFrZXMgc3VyZSB0aGF0IHlvdSBoYXZlIG5vdAorYWRkZWQgb3IgbW9kaWZpZWQgaW5kZXggZW50cmllcyBzaW5jZSAkSkMsIGFuZCBpZiB5b3UgaGF2ZW4ndCwKK3RoZW4gZG9lcyB0aGUgcmlnaHQgdGhpbmcuICBTbyB3aXRoIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6CisKKy0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LXJlYWQtdHJlZSAtbSAtdSBgZ2l0LW1lcmdlLWJhc2UgJEpDICRMVGAgJEpDICRMVAorJCBnaXQtbWVyZ2UtaW5kZXggZ2l0LW1lcmdlLW9uZS1maWxlIC1hCiskIGVjaG8gIk1lcmdlIHdpdGggTGludXMiIHwgXAorICBnaXQtY29tbWl0LXRyZWUgYGdpdC13cml0ZS10cmVlYCAtcCAkSkMgLXAgJExUCistLS0tLS0tLS0tLS0tLS0tCisKK3doYXQgeW91IHdvdWxkIGNvbW1pdCBpcyBhIHB1cmUgbWVyZ2UgYmV0d2VlbiAkSkMgYW5kICRMVCB3aXRob3V0Cit5b3VyIHdvcmstaW4tcHJvZ3Jlc3MgY2hhbmdlcywgYW5kIHlvdXIgd29yayB0cmVlIHdvdWxkIGJlCit1cGRhdGVkIHRvIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCitIb3dldmVyLCBpZiB5b3UgaGF2ZSBsb2NhbCBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUgdGhhdAord291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgdGhpcyBtZXJnZSxgZ2l0LXJlYWQtdHJlZWAgd2lsbCByZWZ1c2UKK3RvIHJ1biB0byBwcmV2ZW50IHlvdXIgY2hhbmdlcyBmcm9tIGJlaW5nIGxvc3QuCisKK0luIG90aGVyIHdvcmRzLCB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHdoYXQgZXhpc3RzIG9ubHkKK2luIHRoZSB3b3JraW5nIHRyZWUuICBXaGVuIHlvdSBoYXZlIGxvY2FsIGNoYW5nZXMgaW4gYSBwYXJ0IG9mCit0aGUgcHJvamVjdCB0aGF0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGUgbWVyZ2UsIHlvdXIgY2hhbmdlcyBkbworbm90IGludGVyZmVyZSB3aXRoIHRoZSBtZXJnZSwgYW5kIGFyZSBrZXB0IGludGFjdC4gIFdoZW4gdGhleQorKmRvKiBpbnRlcmZlcmUsIHRoZSBtZXJnZSBkb2VzIG5vdCBldmVuIHN0YXJ0IChgZ2l0LXJlYWQtdHJlZWAKK2NvbXBsYWlucyBsb3VkbHkgYW5kIGZhaWxzIHdpdGhvdXQgbW9kaWZ5aW5nIGFueXRoaW5nKS4gIEluIHN1Y2gKK2EgY2FzZSwgeW91IGNhbiBzaW1wbHkgY29udGludWUgZG9pbmcgd2hhdCB5b3Ugd2VyZSBpbiB0aGUKK21pZGRsZSBvZiBkb2luZywgYW5kIHdoZW4geW91ciB3b3JraW5nIHRyZWUgaXMgcmVhZHkgKGkuZS4geW91CitoYXZlIGZpbmlzaGVkIHlvdXIgd29yay1pbi1wcm9ncmVzcyksIGF0dGVtcHQgdGhlIG1lcmdlIGFnYWluLgorCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtd3JpdGUtdHJlZVsxXTsgZ2l0bGluazpnaXQtbHMtZmlsZXNbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmViYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3YmNhYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlYmFzZS50eHQKQEAgLTAsMCArMSwxNTMgQEAKK2dpdC1yZWJhc2UoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlYmFzZSAtIFJlYmFzZSBsb2NhbCBjb21taXRzIHRvIGEgbmV3IGhlYWQKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlYmFzZScgWy0tbWVyZ2VdIFstLW9udG8gPG5ld2Jhc2U+XSA8dXBzdHJlYW0+IFs8YnJhbmNoPl0KKworJ2dpdC1yZWJhc2UnIC0tY29udGludWUgfCAtLXNraXAgfCAtLWFib3J0CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorZ2l0LXJlYmFzZSByZXBsYWNlcyA8YnJhbmNoPiB3aXRoIGEgbmV3IGJyYW5jaCBvZiB0aGUgc2FtZSBuYW1lLiAgV2hlbgordGhlIC0tb250byBvcHRpb24gaXMgcHJvdmlkZWQgdGhlIG5ldyBicmFuY2ggc3RhcnRzIG91dCB3aXRoIGEgSEVBRCBlcXVhbAordG8gPG5ld2Jhc2U+LCBvdGhlcndpc2UgaXQgaXMgZXF1YWwgdG8gPHVwc3RyZWFtPi4gIEl0IHRoZW4gYXR0ZW1wdHMgdG8KK2NyZWF0ZSBhIG5ldyBjb21taXQgZm9yIGVhY2ggY29tbWl0IGZyb20gdGhlIG9yaWdpbmFsIDxicmFuY2g+IHRoYXQgZG9lcworbm90IGV4aXN0IGluIHRoZSA8dXBzdHJlYW0+IGJyYW5jaC4KKworSXQgaXMgcG9zc2libGUgdGhhdCBhIG1lcmdlIGZhaWx1cmUgd2lsbCBwcmV2ZW50IHRoaXMgcHJvY2VzcyBmcm9tIGJlaW5nCitjb21wbGV0ZWx5IGF1dG9tYXRpYy4gIFlvdSB3aWxsIGhhdmUgdG8gcmVzb2x2ZSBhbnkgc3VjaCBtZXJnZSBmYWlsdXJlCithbmQgcnVuIGBnaXQgcmViYXNlIC0tY29udGludWVgLiAgQW5vdGhlciBvcHRpb24gaXMgdG8gYnlwYXNzIHRoZSBjb21taXQKK3RoYXQgY2F1c2VkIHRoZSBtZXJnZSBmYWlsdXJlIHdpdGggYGdpdCByZWJhc2UgLS1za2lwYC4gIFRvIHJlc3RvcmUgdGhlCitvcmlnaW5hbCA8YnJhbmNoPiBhbmQgcmVtb3ZlIHRoZSAuZG90ZXN0IHdvcmtpbmcgZmlsZXMsIHVzZSB0aGUgY29tbWFuZAorYGdpdCByZWJhc2UgLS1hYm9ydGAgaW5zdGVhZC4KKworTm90ZSB0aGF0IGlmIDxicmFuY2g+IGlzIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgdGhlIGN1cnJlbnRseQorY2hlY2tlZCBvdXQgYnJhbmNoIGlzIHVzZWQuCisKK0Fzc3VtZSB0aGUgZm9sbG93aW5nIGhpc3RvcnkgZXhpc3RzIGFuZCB0aGUgY3VycmVudCBicmFuY2ggaXMgInRvcGljIjoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgQS0tLUItLS1DIHRvcGljCisgICAgICAgICAvCisgICAgRC0tLUUtLS1GLS0tRyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitGcm9tIHRoaXMgcG9pbnQsIHRoZSByZXN1bHQgb2YgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKworICAgIGdpdC1yZWJhc2UgbWFzdGVyCisgICAgZ2l0LXJlYmFzZSBtYXN0ZXIgdG9waWMKKword291bGQgYmU6CisKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgQSctLUInLS1DJyB0b3BpYworICAgICAgICAgICAgICAgICAvCisgICAgRC0tLUUtLS1GLS0tRyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitXaGlsZSwgc3RhcnRpbmcgZnJvbSB0aGUgc2FtZSBwb2ludCwgdGhlIHJlc3VsdCBvZiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZworY29tbWFuZHM6CisKKyAgICBnaXQtcmViYXNlIC0tb250byBtYXN0ZXJ+MSBtYXN0ZXIKKyAgICBnaXQtcmViYXNlIC0tb250byBtYXN0ZXJ+MSBtYXN0ZXIgdG9waWMKKword291bGQgYmU6CisKKy0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBBJy0tQictLUMnIHRvcGljCisgICAgICAgICAgICAgLworICAgIEQtLS1FLS0tRi0tLUcgbWFzdGVyCistLS0tLS0tLS0tLS0KKworSW4gY2FzZSBvZiBjb25mbGljdCwgZ2l0LXJlYmFzZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IHByb2JsZW1hdGljIGNvbW1pdAorYW5kIGxlYXZlIGNvbmZsaWN0IG1hcmtlcnMgaW4gdGhlIHRyZWUuICBZb3UgY2FuIHVzZSBnaXQgZGlmZiB0byBsb2NhdGUKK3RoZSBtYXJrZXJzICg8PDw8PDwpIGFuZCBtYWtlIGVkaXRzIHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LiAgRm9yIGVhY2gKK2ZpbGUgeW91IGVkaXQsIHlvdSBuZWVkIHRvIHRlbGwgZ2l0IHRoYXQgdGhlIGNvbmZsaWN0IGhhcyBiZWVuIHJlc29sdmVkLAordHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZSB3aXRoCisKKworICAgIGdpdCB1cGRhdGUtaW5kZXggPGZpbGVuYW1lPgorCisKK0FmdGVyIHJlc29sdmluZyB0aGUgY29uZmxpY3QgbWFudWFsbHkgYW5kIHVwZGF0aW5nIHRoZSBpbmRleCB3aXRoIHRoZQorZGVzaXJlZCByZXNvbHV0aW9uLCB5b3UgY2FuIGNvbnRpbnVlIHRoZSByZWJhc2luZyBwcm9jZXNzIHdpdGgKKworCisgICAgZ2l0IHJlYmFzZSAtLWNvbnRpbnVlCisKKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1bmRvIHRoZSBnaXQtcmViYXNlIHdpdGgKKworCisgICAgZ2l0IHJlYmFzZSAtLWFib3J0CisKK09QVElPTlMKKy0tLS0tLS0KKzxuZXdiYXNlPjo6CisJU3RhcnRpbmcgcG9pbnQgYXQgd2hpY2ggdG8gY3JlYXRlIHRoZSBuZXcgY29tbWl0cy4gSWYgdGhlCisJLS1vbnRvIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhcnRpbmcgcG9pbnQgaXMKKwk8dXBzdHJlYW0+LgorCis8dXBzdHJlYW0+OjoKKwlVcHN0cmVhbSBicmFuY2ggdG8gY29tcGFyZSBhZ2FpbnN0LgorCis8YnJhbmNoPjo6CisJV29ya2luZyBicmFuY2g7IGRlZmF1bHRzIHRvIEhFQUQuCisKKy0tY29udGludWU6OgorCVJlc3RhcnQgdGhlIHJlYmFzaW5nIHByb2Nlc3MgYWZ0ZXIgaGF2aW5nIHJlc29sdmVkIGEgbWVyZ2UgY29uZmxpY3QuCisKKy0tYWJvcnQ6OgorCVJlc3RvcmUgdGhlIG9yaWdpbmFsIGJyYW5jaCBhbmQgYWJvcnQgdGhlIHJlYmFzZSBvcGVyYXRpb24uCisKKy0tc2tpcDo6CisJUmVzdGFydCB0aGUgcmViYXNpbmcgcHJvY2VzcyBieSBza2lwcGluZyB0aGUgY3VycmVudCBwYXRjaC4KKworLS1tZXJnZTo6CisJVXNlIG1lcmdpbmcgc3RyYXRlZ2llcyB0byByZWJhc2UuICBXaGVuIHRoZSByZWN1cnNpdmUgKGRlZmF1bHQpIG1lcmdlCisJc3RyYXRlZ3kgaXMgdXNlZCwgdGhpcyBhbGxvd3MgcmViYXNlIHRvIGJlIGF3YXJlIG9mIHJlbmFtZXMgb24gdGhlCisJdXBzdHJlYW0gc2lkZS4KKworLXMgPHN0cmF0ZWd5PiwgXC0tc3RyYXRlZ3k9PHN0cmF0ZWd5Pjo6CisJVXNlIHRoZSBnaXZlbiBtZXJnZSBzdHJhdGVneTsgY2FuIGJlIHN1cHBsaWVkIG1vcmUgdGhhbgorCW9uY2UgdG8gc3BlY2lmeSB0aGVtIGluIHRoZSBvcmRlciB0aGV5IHNob3VsZCBiZSB0cmllZC4KKwlJZiB0aGVyZSBpcyBubyBgLXNgIG9wdGlvbiwgYSBidWlsdC1pbiBsaXN0IG9mIHN0cmF0ZWdpZXMKKwlpcyB1c2VkIGluc3RlYWQgKGBnaXQtbWVyZ2UtcmVjdXJzaXZlYCB3aGVuIG1lcmdpbmcgYSBzaW5nbGUKKwloZWFkLCBgZ2l0LW1lcmdlLW9jdG9wdXNgIG90aGVyd2lzZSkuICBUaGlzIGltcGxpZXMgLS1tZXJnZS4KKworaW5jbHVkZTo6bWVyZ2Utc3RyYXRlZ2llcy50eHRbXQorCitOT1RFUworLS0tLS0KK1doZW4geW91IHJlYmFzZSBhIGJyYW5jaCwgeW91IGFyZSBjaGFuZ2luZyBpdHMgaGlzdG9yeSBpbiBhIHdheSB0aGF0Cit3aWxsIGNhdXNlIHByb2JsZW1zIGZvciBhbnlvbmUgd2hvIGFscmVhZHkgaGFzIGEgY29weSBvZiB0aGUgYnJhbmNoCitpbiB0aGVpciByZXBvc2l0b3J5IGFuZCB0cmllcyB0byBwdWxsIHVwZGF0ZXMgZnJvbSB5b3UuICBZb3Ugc2hvdWxkCit1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgb2YgdXNpbmcgJ2dpdCByZWJhc2UnIG9uIGEgcmVwb3NpdG9yeSB0aGF0Cit5b3Ugc2hhcmUuCisKK1doZW4gdGhlIGdpdCByZWJhc2UgY29tbWFuZCBpcyBydW4sIGl0IHdpbGwgZmlyc3QgZXhlY3V0ZSBhICJwcmUtcmViYXNlIgoraG9vayBpZiBvbmUgZXhpc3RzLiAgWW91IGNhbiB1c2UgdGhpcyBob29rIHRvIGRvIHNhbml0eSBjaGVja3MgYW5kCityZWplY3QgdGhlIHJlYmFzZSBpZiBpdCBpc24ndCBhcHByb3ByaWF0ZS4gIFBsZWFzZSBzZWUgdGhlIHRlbXBsYXRlCitwcmUtcmViYXNlIGhvb2sgc2NyaXB0IGZvciBhbiBleGFtcGxlLgorCitZb3UgbXVzdCBiZSBpbiB0aGUgdG9wIGRpcmVjdG9yeSBvZiB5b3VyIHByb2plY3QgdG8gc3RhcnQgKG9yIGNvbnRpbnVlKQorYSByZWJhc2UuICBVcG9uIGNvbXBsZXRpb24sIDxicmFuY2g+IHdpbGwgYmUgdGhlIGN1cnJlbnQgYnJhbmNoLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVjZWl2ZS1wYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlY2VpdmUtcGFjay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0NTdkNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlY2VpdmUtcGFjay50eHQKQEAgLTAsMCArMSw5OCBAQAorZ2l0LXJlY2VpdmUtcGFjaygxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVjZWl2ZS1wYWNrIC0gUmVjZWl2ZSB3aGF0IGlzIHB1c2hlZCBpbnRvIGl0CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlY2VpdmUtcGFjaycgPGRpcmVjdG9yeT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbnZva2VkIGJ5ICdnaXQtc2VuZC1wYWNrJyBhbmQgdXBkYXRlcyB0aGUgcmVwb3NpdG9yeSB3aXRoIHRoZQoraW5mb3JtYXRpb24gZmVkIGZyb20gdGhlIHJlbW90ZSBlbmQuCisKK1RoaXMgY29tbWFuZCBpcyB1c3VhbGx5IG5vdCBpbnZva2VkIGRpcmVjdGx5IGJ5IHRoZSBlbmQgdXNlci4KK1RoZSBVSSBmb3IgdGhlIHByb3RvY29sIGlzIG9uIHRoZSAnZ2l0LXNlbmQtcGFjaycgc2lkZSwgYW5kIHRoZQorcHJvZ3JhbSBwYWlyIGlzIG1lYW50IHRvIGJlIHVzZWQgdG8gcHVzaCB1cGRhdGVzIHRvIHJlbW90ZQorcmVwb3NpdG9yeS4gIEZvciBwdWxsIG9wZXJhdGlvbnMsIHNlZSAnZ2l0LWZldGNoLXBhY2snLgorCitUaGUgY29tbWFuZCBhbGxvd3MgZm9yIGNyZWF0aW9uIGFuZCBmYXN0IGZvcndhcmRpbmcgb2Ygc2hhMSByZWZzCisoaGVhZHMvdGFncykgb24gdGhlIHJlbW90ZSBlbmQgKHN0cmljdGx5IHNwZWFraW5nLCBpdCBpcyB0aGUKK2xvY2FsIGVuZCByZWNlaXZlLXBhY2sgcnVucywgYnV0IHRvIHRoZSB1c2VyIHdobyBpcyBzaXR0aW5nIGF0Cit0aGUgc2VuZC1wYWNrIGVuZCwgaXQgaXMgdXBkYXRpbmcgdGhlIHJlbW90ZS4gIENvbmZ1c2VkPykKKworQmVmb3JlIGVhY2ggcmVmIGlzIHVwZGF0ZWQsIGlmICRHSVRfRElSL2hvb2tzL3VwZGF0ZSBmaWxlIGV4aXN0cworYW5kIGV4ZWN1dGFibGUsIGl0IGlzIGNhbGxlZCB3aXRoIHRocmVlIHBhcmFtZXRlcnM6CisKKyAgICAgICAkR0lUX0RJUi9ob29rcy91cGRhdGUgcmVmbmFtZSBzaGExLW9sZCBzaGExLW5ldworCitUaGUgcmVmbmFtZSBwYXJhbWV0ZXIgaXMgcmVsYXRpdmUgdG8gJEdJVF9ESVI7IGUuZy4gZm9yIHRoZQorbWFzdGVyIGhlYWQgdGhpcyBpcyAicmVmcy9oZWFkcy9tYXN0ZXIiLiAgVHdvIHNoYTEgYXJlIHRoZQorb2JqZWN0IG5hbWVzIGZvciB0aGUgcmVmbmFtZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1cGRhdGUuICBOb3RlCit0aGF0IHRoZSBob29rIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHJlZm5hbWUgaXMgdXBkYXRlZCwgc28gZWl0aGVyCitzaGExLW9sZCBpcyAwezQwfSAobWVhbmluZyB0aGVyZSBpcyBubyBzdWNoIHJlZiB5ZXQpLCBvciBpdAorc2hvdWxkIG1hdGNoIHdoYXQgaXMgcmVjb3JkZWQgaW4gcmVmbmFtZS4KKworVGhlIGhvb2sgc2hvdWxkIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgaWYgaXQgd2FudHMgdG8KK2Rpc2FsbG93IHVwZGF0aW5nIHRoZSBuYW1lZCByZWYuICBPdGhlcndpc2UgaXQgc2hvdWxkIGV4aXQgd2l0aAoremVyby4KKworVXNpbmcgdGhpcyBob29rLCBpdCBpcyBlYXN5IHRvIGdlbmVyYXRlIG1haWxzIG9uIHVwZGF0ZXMgdG8KK3RoZSBsb2NhbCByZXBvc2l0b3J5LiBUaGlzIGV4YW1wbGUgc2NyaXB0IHNlbmRzIGEgbWFpbCB3aXRoCit0aGUgY29tbWl0cyBwdXNoZWQgdG8gdGhlIHJlcG9zaXRvcnk6CisKKwkjIS9iaW4vc2gKKwkjIG1haWwgb3V0IGNvbW1pdCB1cGRhdGUgaW5mb3JtYXRpb24uCisJaWYgZXhwciAiJDIiIDogJzAqJCcgPi9kZXYvbnVsbAorCXRoZW4KKwkJZWNobyAiQ3JlYXRlZCBhIG5ldyByZWYsIHdpdGggdGhlIGZvbGxvd2luZyBjb21taXRzOiIKKwkJZ2l0LXJldi1saXN0IC0tcHJldHR5ICIkMiIKKwllbHNlCisJCWVjaG8gIk5ldyBjb21taXRzOiIKKwkJZ2l0LXJldi1saXN0IC0tcHJldHR5ICIkMyIgIl4kMiIKKwlmaSB8CisJbWFpbCAtcyAiQ2hhbmdlcyB0byByZWYgJDEiIGNvbW1pdC1saXN0QG15ZG9tYWluCisJZXhpdCAwCisKK0Fub3RoZXIgaG9vayAkR0lUX0RJUi9ob29rcy9wb3N0LXVwZGF0ZSwgaWYgZXhpc3RzIGFuZAorZXhlY3V0YWJsZSwgaXMgY2FsbGVkIHdpdGggdGhlIGxpc3Qgb2YgcmVmcyB0aGF0IGhhdmUgYmVlbgordXBkYXRlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHJlcG9zaXRvcnkgd2lkZSBjbGVhbnVwCit0YXNrIGlmIG5lZWRlZC4gIFRoZSBleGl0IGNvZGUgZnJvbSB0aGlzIGhvb2sgaW52b2NhdGlvbiBpcworaWdub3JlZDsgdGhlIG9ubHkgdGhpbmcgbGVmdCBmb3IgZ2l0LXJlY2VpdmUtcGFjayB0byBkbyBhdCB0aGF0Citwb2ludCBpcyB0byBleGl0IGl0c2VsZiBhbnl3YXkuICBUaGlzIGhvb2sgY2FuIGJlIHVzZWQsIGZvcgorZXhhbXBsZSwgdG8gcnVuICJnaXQtdXBkYXRlLXNlcnZlci1pbmZvIiBpZiB0aGUgcmVwb3NpdG9yeSBpcworcGFja2VkIGFuZCBpcyBzZXJ2ZWQgdmlhIGEgZHVtYiB0cmFuc3BvcnQuCisKKwkjIS9iaW4vc2gKKwlleGVjIGdpdC11cGRhdGUtc2VydmVyLWluZm8KKworVGhlcmUgYXJlIG90aGVyIHJlYWwtd29ybGQgZXhhbXBsZXMgb2YgdXNpbmcgdXBkYXRlIGFuZAorcG9zdC11cGRhdGUgaG9va3MgZm91bmQgaW4gdGhlIERvY3VtZW50YXRpb24vaG93dG8gZGlyZWN0b3J5LgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byBzeW5jIGludG8uCisKKworU0VFIEFMU08KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1zZW5kLXBhY2tbMV0KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlbGluay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWxpbmsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTYwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZWxpbmsudHh0CkBAIC0wLDAgKzEsMzcgQEAKK2dpdC1yZWxpbmsoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlbGluayAtIEhhcmRsaW5rIGNvbW1vbiBvYmplY3RzIGluIGxvY2FsIHJlcG9zaXRvcmllcworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVsaW5rJyBbLS1zYWZlXSA8ZGlyPiA8ZGlyPiBbPGRpcj5dXCoKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIHdpbGwgc2NhbiAyIG9yIG1vcmUgb2JqZWN0IHJlcG9zaXRvcmllcyBhbmQgbG9vayBmb3IgY29tbW9uIG9iamVjdHMsIGNoZWNrCitpZiB0aGV5IGFyZSBoYXJkbGlua2VkLCBhbmQgcmVwbGFjZSBvbmUgd2l0aCBhIGhhcmRsaW5rIHRvIHRoZSBvdGhlciBpZiBub3QuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tc2FmZTo6CisJU3RvcHMgaWYgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBoYXNoIGV4aXN0IGJ1dCBoYXZlIGRpZmZlcmVudCBzaXplcy4KKwlEZWZhdWx0IGlzIHRvIHdhcm4gYW5kIGNvbnRpbnVlLgorCis8ZGlyPjo6CisJRGlyZWN0b3JpZXMgY29udGFpbmluZyBhIC5naXQvb2JqZWN0cy8gc3ViZGlyZWN0b3J5LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlcGFjay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTYyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBhY2sudHh0CkBAIC0wLDAgKzEsNzUgQEAKK2dpdC1yZXBhY2soMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlcGFjayAtIFNjcmlwdCB1c2VkIHRvIHBhY2sgYSByZXBvc2l0b3J5IGZyb20gYSBjb2xsZWN0aW9uIG9mCitvYmplY3RzIGludG8gcGFjayBmaWxlcy4KKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVwYWNrJyBbLWFdIFstZF0gWy1mXSBbLWxdIFstbl0gWy1xXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBjb21iaW5lIGFsbCBvYmplY3RzIHRoYXQgZG8gbm90IGN1cnJlbnRseQorcmVzaWRlIGluIGEgInBhY2siLCBpbnRvIGEgcGFjay4KKworQSBwYWNrIGlzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzLCBpbmRpdmlkdWFsbHkgY29tcHJlc3NlZCwgd2l0aAorZGVsdGEgY29tcHJlc3Npb24gYXBwbGllZCwgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUsIHdpdGggYW4KK2Fzc29jaWF0ZWQgaW5kZXggZmlsZS4KKworUGFja3MgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBsb2FkIG9uIG1pcnJvciBzeXN0ZW1zLCBiYWNrdXAKK2VuZ2luZXMsIGRpc2sgc3RvcmFnZSwgZXRjLgorCitPUFRJT05TCistLS0tLS0tCisKKy1hOjoKKwlJbnN0ZWFkIG9mIGluY3JlbWVudGFsbHkgcGFja2luZyB0aGUgdW5wYWNrZWQgb2JqZWN0cywKKwlwYWNrIGV2ZXJ5dGhpbmcgYXZhaWxhYmxlIGludG8gYSBzaW5nbGUgcGFjay4KKwlFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHBhY2tpbmcgYSByZXBvc2l0b3J5IHRoYXQgaXMgdXNlZAorCWZvciBhIHByaXZhdGUgZGV2ZWxvcG1lbnQgYW5kIHRoZXJlIG5vIG5lZWQgdG8gd29ycnkKKwlhYm91dCBwZW9wbGUgZmV0Y2hpbmcgdmlhIGR1bWIgcHJvdG9jb2xzIGZyb20gaXQuICBVc2UKKwl3aXRoICctZCcuCisKKy1kOjoKKwlBZnRlciBwYWNraW5nLCBpZiB0aGUgbmV3bHkgY3JlYXRlZCBwYWNrcyBtYWtlIHNvbWUKKwlleGlzdGluZyBwYWNrcyByZWR1bmRhbnQsIHJlbW92ZSB0aGUgcmVkdW5kYW50IHBhY2tzLgorCUFsc28gcnVucyBnaXRsaW5rOmdpdC1wcnVuZS1wYWNrZWRbMV0uCisKKy1sOjoKKyAgICAgICAgUGFzcyB0aGUgYC0tbG9jYWxgIG9wdGlvbiB0byBgZ2l0IHBhY2stb2JqZWN0c2AsIHNlZQorICAgICAgICBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy1mOjoKKyAgICAgICAgUGFzcyB0aGUgYC0tbm8tcmV1c2UtZGVsdGFgIG9wdGlvbiB0byBgZ2l0IHBhY2stb2JqZWN0c2AsIHNlZQorICAgICAgICBnaXRsaW5rOmdpdC1wYWNrLW9iamVjdHNbMV0uCisKKy1xOjoKKyAgICAgICAgUGFzcyB0aGUgYC1xYCBvcHRpb24gdG8gYGdpdCBwYWNrLW9iamVjdHNgLCBzZWUKKyAgICAgICAgZ2l0bGluazpnaXQtcGFjay1vYmplY3RzWzFdLgorCistbjo6CisgICAgICAgIERvIG5vdCB1cGRhdGUgdGhlIHNlcnZlciBpbmZvcm1hdGlvbiB3aXRoCisgICAgICAgIGBnaXQgdXBkYXRlLXNlcnZlci1pbmZvYC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBSeWFuIEFuZGVyc29uIDxyeWFuQG1pY2hvbmxpbmUuY29tPgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXQorZ2l0bGluazpnaXQtcHJ1bmUtcGFja2VkWzFdCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXBvLWNvbmZpZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXBvLWNvbmZpZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzZDY2ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcG8tY29uZmlnLnR4dApAQCAtMCwwICsxLDIwMCBAQAorZ2l0LXJlcG8tY29uZmlnKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJlcG8tY29uZmlnIC0gR2V0IGFuZCBzZXQgb3B0aW9ucyBpbiAuZ2l0L2NvbmZpZworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC1yZXBvLWNvbmZpZycgW3R5cGVdIG5hbWUgW3ZhbHVlIFt2YWx1ZV9yZWdleF1dCisnZ2l0LXJlcG8tY29uZmlnJyBbdHlwZV0gLS1yZXBsYWNlLWFsbCBuYW1lIFt2YWx1ZSBbdmFsdWVfcmVnZXhdXQorJ2dpdC1yZXBvLWNvbmZpZycgW3R5cGVdIC0tZ2V0IG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1yZXBvLWNvbmZpZycgW3R5cGVdIC0tZ2V0LWFsbCBuYW1lIFt2YWx1ZV9yZWdleF0KKydnaXQtcmVwby1jb25maWcnIFt0eXBlXSAtLXVuc2V0IG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1yZXBvLWNvbmZpZycgW3R5cGVdIC0tdW5zZXQtYWxsIG5hbWUgW3ZhbHVlX3JlZ2V4XQorJ2dpdC1yZXBvLWNvbmZpZycgLWwgfCAtLWxpc3QKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitZb3UgY2FuIHF1ZXJ5L3NldC9yZXBsYWNlL3Vuc2V0IG9wdGlvbnMgd2l0aCB0aGlzIGNvbW1hbmQuIFRoZSBuYW1lIGlzCithY3R1YWxseSB0aGUgc2VjdGlvbiBhbmQgdGhlIGtleSBzZXBhcmF0ZWQgYnkgYSBkb3QsIGFuZCB0aGUgdmFsdWUgd2lsbCBiZQorZXNjYXBlZC4KKworSWYgeW91IHdhbnQgdG8gc2V0L3Vuc2V0IGFuIG9wdGlvbiB3aGljaCBjYW4gb2NjdXIgb24gbXVsdGlwbGUKK2xpbmVzLCBhIFBPU0lYIHJlZ2V4cCBgdmFsdWVfcmVnZXhgIG5lZWRzIHRvIGJlIGdpdmVuLiAgT25seSB0aGUKK2V4aXN0aW5nIHZhbHVlcyB0aGF0IG1hdGNoIHRoZSByZWdleHAgYXJlIHVwZGF0ZWQgb3IgdW5zZXQuICBJZgoreW91IHdhbnQgdG8gaGFuZGxlIHRoZSBsaW5lcyB0aGF0IGRvICpub3QqIG1hdGNoIHRoZSByZWdleCwganVzdAorcHJlcGVuZCBhIHNpbmdsZSBleGNsYW1hdGlvbiBtYXJrIGluIGZyb250IChzZWUgRVhBTVBMRVMpLgorCitUaGUgdHlwZSBzcGVjaWZpZXIgY2FuIGJlIGVpdGhlciAnLS1pbnQnIG9yICctLWJvb2wnLCB3aGljaCB3aWxsIG1ha2UKKydnaXQtcmVwby1jb25maWcnIGVuc3VyZSB0aGF0IHRoZSB2YXJpYWJsZShzKSBhcmUgb2YgdGhlIGdpdmVuIHR5cGUgYW5kCitjb252ZXJ0IHRoZSB2YWx1ZSB0byB0aGUgY2Fub25pY2FsIGZvcm0gKHNpbXBsZSBkZWNpbWFsIG51bWJlciBmb3IgaW50LAorYSAidHJ1ZSIgb3IgImZhbHNlIiBzdHJpbmcgZm9yIGJvb2wpLiBJZiBubyB0eXBlIHNwZWNpZmllciBpcyBwYXNzZWQsCitubyBjaGVja3Mgb3IgdHJhbnNmb3JtYXRpb25zIGFyZSBwZXJmb3JtZWQgb24gdGhlIHZhbHVlLgorCitUaGlzIGNvbW1hbmQgd2lsbCBmYWlsIGlmOgorCisuIFRoZSAuZ2l0L2NvbmZpZyBmaWxlIGlzIGludmFsaWQsCisuIENhbiBub3Qgd3JpdGUgdG8gLmdpdC9jb25maWcsCisuIG5vIHNlY3Rpb24gd2FzIHByb3ZpZGVkLAorLiB0aGUgc2VjdGlvbiBvciBrZXkgaXMgaW52YWxpZCwKKy4geW91IHRyeSB0byB1bnNldCBhbiBvcHRpb24gd2hpY2ggZG9lcyBub3QgZXhpc3QsIG9yCisuIHlvdSB0cnkgdG8gdW5zZXQvc2V0IGFuIG9wdGlvbiBmb3Igd2hpY2ggbXVsdGlwbGUgbGluZXMgbWF0Y2guCisKKworT1BUSU9OUworLS0tLS0tLQorCistLXJlcGxhY2UtYWxsOjoKKwlEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlcGxhY2UgYXQgbW9zdCBvbmUgbGluZS4gVGhpcyByZXBsYWNlcworCWFsbCBsaW5lcyBtYXRjaGluZyB0aGUga2V5IChhbmQgb3B0aW9uYWxseSB0aGUgdmFsdWVfcmVnZXgpLgorCistLWdldDo6CisJR2V0IHRoZSB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkgKG9wdGlvbmFsbHkgZmlsdGVyZWQgYnkgYSByZWdleAorCW1hdGNoaW5nIHRoZSB2YWx1ZSkuCisKKy0tZ2V0LWFsbDo6CisJTGlrZSBnZXQsIGJ1dCBkb2VzIG5vdCBmYWlsIGlmIHRoZSBudW1iZXIgb2YgdmFsdWVzIGZvciB0aGUga2V5CisJaXMgbm90IGV4YWN0bHkgb25lLgorCistLWdldC1yZWdleHA6OgorCUxpa2UgLS1nZXQtYWxsLCBidXQgaW50ZXJwcmV0cyB0aGUgbmFtZSBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKworLS11bnNldDo6CisJUmVtb3ZlIHRoZSBsaW5lIG1hdGNoaW5nIHRoZSBrZXkgZnJvbSAuZ2l0L2NvbmZpZy4KKworLS11bnNldC1hbGw6OgorCVJlbW92ZSBhbGwgbWF0Y2hpbmcgbGluZXMgZnJvbSAuZ2l0L2NvbmZpZy4KKworLWwsIC0tbGlzdDo6CisJTGlzdCBhbGwgdmFyaWFibGVzIHNldCBpbiAuZ2l0L2NvbmZpZy4KKworCitFTlZJUk9OTUVOVAorLS0tLS0tLS0tLS0KKworR0lUX0NPTkZJRzo6CisJVGFrZSB0aGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBnaXZlbiBmaWxlIGluc3RlYWQgb2YgLmdpdC9jb25maWcuCisKK0dJVF9DT05GSUdfTE9DQUw6OgorCUN1cnJlbnRseSB0aGUgc2FtZSBhcyAkR0lUX0NPTkZJRzsgd2hlbiBHaXQgd2lsbCBzdXBwb3J0IGdsb2JhbAorCWNvbmZpZ3VyYXRpb24gZmlsZXMsIHRoaXMgd2lsbCBjYXVzZSBpdCB0byB0YWtlIHRoZSBjb25maWd1cmF0aW9uCisJZnJvbSB0aGUgZ2xvYmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBhZGRpdGlvbiB0byB0aGUgZ2l2ZW4gZmlsZS4KKworCitFWEFNUExFCistLS0tLS0tCisKK0dpdmVuIGEgLmdpdC9jb25maWcgbGlrZSB0aGlzOgorCisJIworCSMgVGhpcyBpcyB0aGUgY29uZmlnIGZpbGUsIGFuZAorCSMgYSAnIycgb3IgJzsnIGNoYXJhY3RlciBpbmRpY2F0ZXMKKwkjIGEgY29tbWVudAorCSMKKworCTsgY29yZSB2YXJpYWJsZXMKKwlbY29yZV0KKwkJOyBEb24ndCB0cnVzdCBmaWxlIG1vZGVzCisJCWZpbGVtb2RlID0gZmFsc2UKKworCTsgT3VyIGRpZmYgYWxnb3JpdGhtCisJW2RpZmZdCisJCWV4dGVybmFsID0gIi91c3IvbG9jYWwvYmluL2dudS1kaWZmIC11IgorCQlyZW5hbWVzID0gdHJ1ZQorCisJOyBQcm94eSBzZXR0aW5ncworCVtjb3JlXQorCQlnaXRwcm94eT0ic3NoIiBmb3IgInNzaDovL2tlcm5lbC5vcmcvIgorCQlnaXRwcm94eT0icHJveHktY29tbWFuZCIgZm9yIGtlcm5lbC5vcmcKKwkJZ2l0cHJveHk9Im15cHJvdG9jb2wtY29tbWFuZCIgZm9yICJteTovLyIKKwkJZ2l0cHJveHk9ZGVmYXVsdC1wcm94eSA7IGZvciBhbGwgdGhlIHJlc3QKKworeW91IGNhbiBzZXQgdGhlIGZpbGVtb2RlIHRvIHRydWUgd2l0aAorCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIGNvcmUuZmlsZW1vZGUgdHJ1ZQorLS0tLS0tLS0tLS0tCisKK1RoZSBoeXBvdGhldGljYWwgcHJveHkgY29tbWFuZCBlbnRyaWVzIGFjdHVhbGx5IGhhdmUgYSBwb3N0Zml4IHRvIGRpc2Nlcm4KK3doYXQgVVJMIHRoZXkgYXBwbHkgdG8uIEhlcmUgaXMgaG93IHRvIGNoYW5nZSB0aGUgZW50cnkgZm9yIGtlcm5lbC5vcmcKK3RvICJzc2giLgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIGNvcmUuZ2l0cHJveHkgJyJzc2giIGZvciBrZXJuZWwub3JnJyAnZm9yIGtlcm5lbC5vcmckJworLS0tLS0tLS0tLS0tCisKK1RoaXMgbWFrZXMgc3VyZSB0aGF0IG9ubHkgdGhlIGtleS92YWx1ZSBwYWlyIGZvciBrZXJuZWwub3JnIGlzIHJlcGxhY2VkLgorCitUbyBkZWxldGUgdGhlIGVudHJ5IGZvciByZW5hbWVzLCBkbworCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIC0tdW5zZXQgZGlmZi5yZW5hbWVzCistLS0tLS0tLS0tLS0KKworSWYgeW91IHdhbnQgdG8gZGVsZXRlIGFuIGVudHJ5IGZvciBhIG11bHRpdmFyIChsaWtlIGNvcmUuZ2l0cHJveHkgYWJvdmUpLAoreW91IGhhdmUgdG8gcHJvdmlkZSBhIHJlZ2V4IG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiBleGFjdGx5IG9uZSBsaW5lLgorCitUbyBxdWVyeSB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4ga2V5LCBkbworCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGNvcmUuZmlsZW1vZGUKKy0tLS0tLS0tLS0tLQorCitvcgorCistLS0tLS0tLS0tLS0KKyUgZ2l0IHJlcG8tY29uZmlnIGNvcmUuZmlsZW1vZGUKKy0tLS0tLS0tLS0tLQorCitvciwgdG8gcXVlcnkgYSBtdWx0aXZhcjoKKworLS0tLS0tLS0tLS0tCislIGdpdCByZXBvLWNvbmZpZyAtLWdldCBjb3JlLmdpdHByb3h5ICJmb3Iga2VybmVsLm9yZyQiCistLS0tLS0tLS0tLS0KKworSWYgeW91IHdhbnQgdG8ga25vdyBhbGwgdGhlIHZhbHVlcyBmb3IgYSBtdWx0aXZhciwgZG86CisKKy0tLS0tLS0tLS0tLQorJSBnaXQgcmVwby1jb25maWcgLS1nZXQtYWxsIGNvcmUuZ2l0cHJveHkKKy0tLS0tLS0tLS0tLQorCitJZiB5b3UgbGlrZSB0byBsaXZlIGRhbmdlcm91cywgeW91IGNhbiByZXBsYWNlICphbGwqIGNvcmUuZ2l0cHJveHkgYnkgYQorbmV3IG9uZSB3aXRoCisKKy0tLS0tLS0tLS0tLQorJSBnaXQgcmVwby1jb25maWcgLS1yZXBsYWNlLWFsbCBjb3JlLmdpdHByb3h5IHNzaAorLS0tLS0tLS0tLS0tCisKK0hvd2V2ZXIsIGlmIHlvdSByZWFsbHkgb25seSB3YW50IHRvIHJlcGxhY2UgdGhlIGxpbmUgZm9yIHRoZSBkZWZhdWx0IHByb3h5LAoraS5lLiB0aGUgb25lIHdpdGhvdXQgYSAiZm9yIC4uLiIgcG9zdGZpeCwgZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tCislIGdpdCByZXBvLWNvbmZpZyBjb3JlLmdpdHByb3h5IHNzaCAnISBmb3IgJworLS0tLS0tLS0tLS0tCisKK1RvIGFjdHVhbGx5IG1hdGNoIG9ubHkgdmFsdWVzIHdpdGggYW4gZXhjbGFtYXRpb24gbWFyaywgeW91IGhhdmUgdG8KKworLS0tLS0tLS0tLS0tCislIGdpdCByZXBvLWNvbmZpZyBzZWN0aW9uLmtleSB2YWx1ZSAnWyFdJworLS0tLS0tLS0tLS0tCisKKworaW5jbHVkZTo6Y29uZmlnLnR4dFtdCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEpvaGFubmVzIFNjaGluZGVsaW4sIFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVxdWVzdC1wdWxsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcXVlc3QtcHVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4YTVmZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlcXVlc3QtcHVsbC50eHQKQEAgLTAsMCArMSw0MCBAQAorZ2l0LXJlcXVlc3QtcHVsbCgxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVxdWVzdC1wdWxsIC0gR2VuZXJhdGVzIGEgc3VtbWFyeSBvZiBwZW5kaW5nIGNoYW5nZXMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlcXVlc3QtcHVsbCcgPHN0YXJ0PiA8dXJsPiBbPGVuZD5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitTdW1tYXJpemVzIHRoZSBjaGFuZ2VzIGJldHdlZW4gdHdvIGNvbW1pdHMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgYW5kIGluY2x1ZGVzCit0aGUgZ2l2ZW4gVVJMIGluIHRoZSBnZW5lcmF0ZWQgc3VtbWFyeS4KKworT1BUSU9OUworLS0tLS0tLQorPHN0YXJ0Pjo6CisJQ29tbWl0IHRvIHN0YXJ0IGF0LgorCis8dXJsPjo6CisJVVJMIHRvIGluY2x1ZGUgaW4gdGhlIHN1bW1hcnkuCisKKzxlbmQ+OjoKKwlDb21taXQgdG8gc2VuZCBhdDsgZGVmYXVsdHMgdG8gSEVBRC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4gYW5kIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1yZXJlcmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjZiNjUxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmVyZXJlLnR4dApAQCAtMCwwICsxLDE3NyBAQAorZ2l0LXJlcmVyZSgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVyZXJlIC0gUmV1c2UgcmVjb3JkZWQgcmVzb2x2ZQorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmVyZXJlJworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitJbiBhIHdvcmtmbG93IHRoYXQgZW1wbG95cyByZWxhdGl2ZWx5IGxvbmcgbGl2ZWQgdG9waWMgYnJhbmNoZXMsCit0aGUgZGV2ZWxvcGVyIHNvbWV0aW1lcyBuZWVkcyB0byByZXNvbHZlIHRoZSBzYW1lIGNvbmZsaWN0IG92ZXIKK2FuZCBvdmVyIGFnYWluIHVudGlsIHRoZSB0b3BpYyBicmFuY2hlcyBhcmUgZG9uZSAoZWl0aGVyIG1lcmdlZAordG8gdGhlICJyZWxlYXNlIiBicmFuY2gsIG9yIHNlbnQgb3V0IGFuZCBhY2NlcHRlZCB1cHN0cmVhbSkuCisKK1RoaXMgY29tbWFuZCBoZWxwcyB0aGlzIHByb2Nlc3MgYnkgcmVjb3JkaW5nIGNvbmZsaWN0ZWQKK2F1dG9tZXJnZSByZXN1bHRzIGFuZCBjb3JyZXNwb25kaW5nIGhhbmQtcmVzb2x2ZSByZXN1bHRzIG9uIHRoZQoraW5pdGlhbCBtYW51YWwgbWVyZ2UsIGFuZCBsYXRlciBieSBub3RpY2luZyB0aGUgc2FtZSBhdXRvbWVyZ2UKK3Jlc3VsdHMgYW5kIGFwcGx5aW5nIHRoZSBwcmV2aW91c2x5IHJlY29yZGVkIGhhbmQgcmVzb2x1dGlvbi4KKworW05PVEVdCitZb3UgbmVlZCB0byBjcmVhdGUgYCRHSVRfRElSL3JyLWNhY2hlYCBkaXJlY3RvcnkgdG8gZW5hYmxlIHRoaXMKK2NvbW1hbmQuCisKK0RJU0NVU1NJT04KKy0tLS0tLS0tLS0KKworV2hlbiB5b3VyIHRvcGljIGJyYW5jaCBtb2RpZmllcyBvdmVybGFwcGluZyBhcmVhIHRoYXQgeW91cgorbWFzdGVyIGJyYW5jaCAob3IgdXBzdHJlYW0pIHRvdWNoZWQgc2luY2UgeW91ciB0b3BpYyBicmFuY2gKK2ZvcmtlZCBmcm9tIGl0LCB5b3UgbWF5IHdhbnQgdG8gdGVzdCBpdCB3aXRoIHRoZSBsYXRlc3QgbWFzdGVyLAorZXZlbiBiZWZvcmUgeW91ciB0b3BpYyBicmFuY2ggaXMgcmVhZHkgdG8gYmUgcHVzaGVkIHVwc3RyZWFtOgorCistLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgby0tLSotLS1vIHRvcGljCisgICAgICAgICAgICAgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tbyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitGb3Igc3VjaCBhIHRlc3QsIHlvdSBuZWVkIHRvIG1lcmdlIG1hc3RlciBhbmQgdG9waWMgc29tZWhvdy4KK09uZSB3YXkgdG8gZG8gaXQgaXMgdG8gcHVsbCBtYXN0ZXIgaW50byB0aGUgdG9waWMgYnJhbmNoOgorCistLS0tLS0tLS0tLS0KKwkkIGdpdCBjaGVja291dCB0b3BpYworCSQgZ2l0IHB1bGwgLiBtYXN0ZXIKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0rIHRvcGljCisgICAgICAgICAgICAgLyAgICAgICAgICAgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tbyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGUgY29tbWl0cyBtYXJrZWQgd2l0aCBgKmAgdG91Y2ggdGhlIHNhbWUgYXJlYSBpbiB0aGUgc2FtZQorZmlsZTsgeW91IG5lZWQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3RzIHdoZW4gY3JlYXRpbmcgdGhlIGNvbW1pdAorbWFya2VkIHdpdGggYCtgLiAgVGhlbiB5b3UgY2FuIHRlc3QgdGhlIHJlc3VsdCB0byBtYWtlIHN1cmUgeW91cgord29yay1pbi1wcm9ncmVzcyBzdGlsbCB3b3JrcyB3aXRoIHdoYXQgaXMgaW4gdGhlIGxhdGVzdCBtYXN0ZXIuCisKK0FmdGVyIHRoaXMgdGVzdCBtZXJnZSwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbnRpbnVlIHlvdXIgd29yaworb24gdGhlIHRvcGljLiAgVGhlIGVhc2llc3QgaXMgdG8gYnVpbGQgb24gdG9wIG9mIHRoZSB0ZXN0IG1lcmdlCitjb21taXQgYCtgLCBhbmQgd2hlbiB5b3VyIHdvcmsgaW4gdGhlIHRvcGljIGJyYW5jaCBpcyBmaW5hbGx5CityZWFkeSwgcHVsbCB0aGUgdG9waWMgYnJhbmNoIGludG8gbWFzdGVyLCBhbmQvb3IgYXNrIHRoZQordXBzdHJlYW0gdG8gcHVsbCBmcm9tIHlvdS4gIEJ5IHRoYXQgdGltZSwgaG93ZXZlciwgdGhlIG1hc3RlciBvcgordGhlIHVwc3RyZWFtIG1pZ2h0IGhhdmUgYmVlbiBhZHZhbmNlZCBzaW5jZSB0aGUgdGVzdCBtZXJnZSBgK2AsCitpbiB3aGljaCBjYXNlIHRoZSBmaW5hbCBjb21taXQgZ3JhcGggd291bGQgbG9vayBsaWtlIHRoaXM6CisKKy0tLS0tLS0tLS0tLQorCSQgZ2l0IGNoZWNrb3V0IHRvcGljCisJJCBnaXQgcHVsbCAuIG1hc3RlcgorCSQgLi4uIHdvcmsgb24gYm90aCB0b3BpYyBhbmQgbWFzdGVyIGJyYW5jaGVzCisJJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisJJCBnaXQgcHVsbCAuIHRvcGljCisKKyAgICAgICAgICAgICAgby0tLSotLS1vLS0tKy0tLW8tLS1vIHRvcGljCisgICAgICAgICAgICAgLyAgICAgICAgICAgLyAgICAgICAgIFwKKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8tLS1vLS0tby0tLSsgbWFzdGVyCistLS0tLS0tLS0tLS0KKworV2hlbiB5b3VyIHRvcGljIGJyYW5jaCBpcyBsb25nLWxpdmVkLCBob3dldmVyLCB5b3VyIHRvcGljIGJyYW5jaAord291bGQgZW5kIHVwIGhhdmluZyBtYW55IHN1Y2ggIk1lcmdlIGZyb20gbWFzdGVyIiBjb21taXRzIG9uIGl0LAord2hpY2ggd291bGQgdW5uZWNlc3NhcmlseSBjbHV0dGVyIHRoZSBkZXZlbG9wbWVudCBoaXN0b3J5LgorUmVhZGVycyBvZiB0aGUgTGludXgga2VybmVsIG1haWxpbmcgbGlzdCBtYXkgcmVtZW1iZXIgdGhhdCBMaW51cworY29tcGxhaW5lZCBhYm91dCBzdWNoIHRvbyBmcmVxdWVudCB0ZXN0IG1lcmdlcyB3aGVuIGEgc3Vic3lzdGVtCittYWludGFpbmVyIGFza2VkIHRvIHB1bGwgZnJvbSBhIGJyYW5jaCBmdWxsIG9mICJ1c2VsZXNzIG1lcmdlcyIuCisKK0FzIGFuIGFsdGVybmF0aXZlLCB0byBrZWVwIHRoZSB0b3BpYyBicmFuY2ggY2xlYW4gb2YgdGVzdAorbWVyZ2VzLCB5b3UgY291bGQgYmxvdyBhd2F5IHRoZSB0ZXN0IG1lcmdlLCBhbmQga2VlcCBidWlsZGluZyBvbgordG9wIG9mIHRoZSB0aXAgYmVmb3JlIHRoZSB0ZXN0IG1lcmdlOgorCistLS0tLS0tLS0tLS0KKwkkIGdpdCBjaGVja291dCB0b3BpYworCSQgZ2l0IHB1bGwgLiBtYXN0ZXIKKwkkIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gOyMgcmV3aW5kIHRoZSB0ZXN0IG1lcmdlCisJJCAuLi4gd29yayBvbiBib3RoIHRvcGljIGFuZCBtYXN0ZXIgYnJhbmNoZXMKKwkkIGdpdCBjaGVja291dCBtYXN0ZXIKKwkkIGdpdCBwdWxsIC4gdG9waWMKKworICAgICAgICAgICAgICBvLS0tKi0tLW8tLS0tLS0tby0tLW8gdG9waWMKKyAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgXAorICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vLS0tKyBtYXN0ZXIKKy0tLS0tLS0tLS0tLQorCitUaGlzIHdvdWxkIGxlYXZlIG9ubHkgb25lIG1lcmdlIGNvbW1pdCB3aGVuIHlvdXIgdG9waWMgYnJhbmNoIGlzCitmaW5hbGx5IHJlYWR5IGFuZCBtZXJnZWQgaW50byB0aGUgbWFzdGVyIGJyYW5jaC4gIFRoaXMgbWVyZ2UKK3dvdWxkIHJlcXVpcmUgeW91IHRvIHJlc29sdmUgdGhlIGNvbmZsaWN0LCBpbnRyb2R1Y2VkIGJ5IHRoZQorY29tbWl0cyBtYXJrZWQgd2l0aCBgKmAuICBIb3dldmVyLCBvZnRlbiB0aGlzIGNvbmZsaWN0IGlzIHRoZQorc2FtZSBjb25mbGljdCB5b3UgcmVzb2x2ZWQgd2hlbiB5b3UgY3JlYXRlZCB0aGUgdGVzdCBtZXJnZSB5b3UKK2JsZXcgYXdheS4gIGBnaXQtcmVyZXJlYCBjb21tYW5kIGhlbHBzIHlvdSB0byByZXNvbHZlIHRoaXMgZmluYWwKK2NvbmZsaWN0ZWQgbWVyZ2UgdXNpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20geW91ciBlYXJsaWVyIGhhbmQKK3Jlc29sdmUuCisKK1J1bm5pbmcgYGdpdC1yZXJlcmVgIGNvbW1hbmQgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBjb25mbGljdGVkCithdXRvbWVyZ2UgcmVjb3JkcyB0aGUgY29uZmxpY3RlZCB3b3JraW5nIHRyZWUgZmlsZXMsIHdpdGggdGhlCit1c3VhbCBjb25mbGljdCBtYXJrZXJzIGA8PDw8PDw8YCwgYD09PT09PT1gLCBhbmQgYD4+Pj4+Pj5gIGluCit0aGVtLiAgTGF0ZXIsIGFmdGVyIHlvdSBhcmUgZG9uZSByZXNvbHZpbmcgdGhlIGNvbmZsaWN0cywKK3J1bm5pbmcgYGdpdC1yZXJlcmVgIGFnYWluIHJlY29yZHMgdGhlIHJlc29sdmVkIHN0YXRlIG9mIHRoZXNlCitmaWxlcy4gIFN1cHBvc2UgeW91IGRpZCB0aGlzIHdoZW4geW91IGNyZWF0ZWQgdGhlIHRlc3QgbWVyZ2Ugb2YKK21hc3RlciBpbnRvIHRoZSB0b3BpYyBicmFuY2guCisKK05leHQgdGltZSwgcnVubmluZyBgZ2l0LXJlcmVyZWAgYWZ0ZXIgc2VlaW5nIGEgY29uZmxpY3RlZAorYXV0b21lcmdlLCBpZiB0aGUgY29uZmxpY3QgaXMgdGhlIHNhbWUgYXMgdGhlIGVhcmxpZXIgb25lCityZWNvcmRlZCwgaXQgaXMgbm90aWNlZCBhbmQgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGUKK2VhcmxpZXIgY29uZmxpY3RlZCBhdXRvbWVyZ2UsIHRoZSBlYXJsaWVyIG1hbnVhbCByZXNvbHV0aW9uLCBhbmQKK3RoZSBjdXJyZW50IGNvbmZsaWN0ZWQgYXV0b21lcmdlIGlzIHBlcmZvcm1lZCBieSB0aGUgY29tbWFuZC4KK0lmIHRoaXMgdGhyZWUtd2F5IG1lcmdlIHJlc29sdmVzIGNsZWFubHksIHRoZSByZXN1bHQgaXMgd3JpdHRlbgorb3V0IHRvIHlvdXIgd29ya2luZyB0cmVlIGZpbGUsIHNvIHlvdSB3b3VsZCBub3QgaGF2ZSB0byBtYW51YWxseQorcmVzb2x2ZSBpdC4gIE5vdGUgdGhhdCBgZ2l0LXJlcmVyZWAgbGVhdmVzIHRoZSBpbmRleCBmaWxlIGFsb25lLAorc28geW91IHN0aWxsIG5lZWQgdG8gZG8gdGhlIGZpbmFsIHNhbml0eSBjaGVja3Mgd2l0aCBgZ2l0IGRpZmZgCisob3IgYGdpdCBkaWZmIC1jYCkgYW5kIGBnaXQgdXBkYXRlLWluZGV4YCB3aGVuIHlvdSBhcmUKK3NhdGlzZmllZC4KKworQXMgYSBjb252ZW5pZW5jZSBtZWFzdXJlLCBgZ2l0LW1lcmdlYCBhdXRvbWF0aWNhbGx5IGludm9rZXMKK2BnaXQtcmVyZXJlYCB3aGVuIGl0IGV4aXRzIHdpdGggYSBmYWlsZWQgYXV0b21lcmdlLCB3aGljaAorcmVjb3JkcyBpdCBpZiBpdCBpcyBhIG5ldyBjb25mbGljdCwgb3IgcmV1c2VzIHRoZSBlYXJsaWVyIGhhbmQKK3Jlc29sdmUgd2hlbiBpdCBpcyBub3QuICBgZ2l0LWNvbW1pdGAgYWxzbyBpbnZva2VzIGBnaXQtcmVyZXJlYAord2hlbiByZWNvcmRpbmcgYSBtZXJnZSByZXN1bHQuICBXaGF0IHRoaXMgbWVhbnMgaXMgdGhhdCB5b3UgZG8KK25vdCBoYXZlIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgeW91cnNlbGYgKE5vdGU6IHlvdSBzdGlsbCBoYXZlCit0byBjcmVhdGUgYCRHSVRfRElSL3JyLWNhY2hlYCBkaXJlY3RvcnkgdG8gZW5hYmxlIHRoaXMgY29tbWFuZCkuCisKK0luIG91ciBleGFtcGxlLCB3aGVuIHlvdSBkaWQgdGhlIHRlc3QgbWVyZ2UsIHRoZSBtYW51YWwKK3Jlc29sdXRpb24gaXMgcmVjb3JkZWQsIGFuZCBpdCB3aWxsIGJlIHJldXNlZCB3aGVuIHlvdSBkbyB0aGUKK2FjdHVhbCBtZXJnZSBsYXRlciB3aXRoIHVwZGF0ZWQgbWFzdGVyIGFuZCB0b3BpYyBicmFuY2gsIGFzIGxvbmcKK2FzIHRoZSBlYXJsaWVyIHJlc29sdXRpb24gaXMgc3RpbGwgYXBwbGljYWJsZS4KKworVGhlIGluZm9ybWF0aW9uIGBnaXQtcmVyZXJlYCByZWNvcmRzIGlzIGFsc28gdXNlZCB3aGVuIHJ1bm5pbmcKK2BnaXQtcmViYXNlYC4gIEFmdGVyIGJsb3dpbmcgYXdheSB0aGUgdGVzdCBtZXJnZSBhbmQgY29udGludWluZworZGV2ZWxvcG1lbnQgb24gdGhlIHRvcGljIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIG8tLS0qLS0tby0tLS0tLS1vLS0tbyB0b3BpYworICAgICAgICAgICAgIC8KKyAgICBvLS0tby0tLW8tLS0qLS0tby0tLW8tLS1vLS0tbyAgIG1hc3RlcgorCisJJCBnaXQgcmViYXNlIG1hc3RlciB0b3BpYworCisJCQkJICBvLS0tKi0tLW8tLS0tLS0tby0tLW8gdG9waWMKKwkJCQkgLworICAgIG8tLS1vLS0tby0tLSotLS1vLS0tby0tLW8tLS1vICAgbWFzdGVyCistLS0tLS0tLS0tLS0KKworeW91IGNvdWxkIHJ1biBgZ2l0IHJlYmFzZSBtYXN0ZXIgdG9waWNgLCB0byBrZWVwIHlvdXJzZWxmCit1cC10by1kYXRlIGV2ZW4gYmVmb3JlIHlvdXIgdG9waWMgaXMgcmVhZHkgdG8gYmUgc2VudCB1cHN0cmVhbS4KK1RoaXMgd291bGQgcmVzdWx0IGluIGZhbGxpbmcgYmFjayB0byB0aHJlZS13YXkgbWVyZ2UsIGFuZCBpdAord291bGQgY29uZmxpY3QgdGhlIHNhbWUgd2F5IHRoZSB0ZXN0IG1lcmdlIHlvdSByZXNvbHZlZCBlYXJsaWVyLgorYGdpdC1yZXJlcmVgIGlzIHJ1biBieSBgZ2l0IHJlYmFzZWAgdG8gaGVscCB5b3UgcmVzb2x2ZSB0aGlzCitjb25mbGljdC4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmVzZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVzZXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTBmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1yZXNldC50eHQKQEAgLTAsMCArMSwxODIgQEAKK2dpdC1yZXNldCgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1yZXNldCAtIFJlc2V0IGN1cnJlbnQgSEVBRCB0byB0aGUgc3BlY2lmaWVkIHN0YXRlCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1yZXNldCcgWy0tbWl4ZWQgfCAtLXNvZnQgfCAtLWhhcmRdIFs8Y29tbWl0LWlzaD5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2V0cyB0aGUgY3VycmVudCBoZWFkIHRvIHRoZSBzcGVjaWZpZWQgY29tbWl0IGFuZCBvcHRpb25hbGx5IHJlc2V0cyB0aGUKK2luZGV4IGFuZCB3b3JraW5nIHRyZWUgdG8gbWF0Y2guCisKK1RoaXMgY29tbWFuZCBpcyB1c2VmdWwgaWYgeW91IG5vdGljZSBzb21lIHNtYWxsIGVycm9yIGluIGEgcmVjZW50Citjb21taXQgKG9yIHNldCBvZiBjb21taXRzKSBhbmQgd2FudCB0byByZWRvIHRoYXQgcGFydCB3aXRob3V0IHNob3dpbmcKK3RoZSB1bmRvIGluIHRoZSBoaXN0b3J5LgorCitJZiB5b3Ugd2FudCB0byB1bmRvIGEgY29tbWl0IG90aGVyIHRoYW4gdGhlIGxhdGVzdCBvbiBhIGJyYW5jaCwKK2dpdGxpbms6Z2l0LXJldmVydFsxXSBpcyB5b3VyIGZyaWVuZC4KKworT1BUSU9OUworLS0tLS0tLQorLS1taXhlZDo6CisJUmVzZXRzIHRoZSBpbmRleCBidXQgbm90IHRoZSB3b3JraW5nIHRyZWUgKGkuZS4sIHRoZSBjaGFuZ2VkIGZpbGVzCisJYXJlIHByZXNlcnZlZCBidXQgbm90IG1hcmtlZCBmb3IgY29tbWl0KSBhbmQgcmVwb3J0cyB3aGF0IGhhcyBub3QKKwliZWVuIHVwZGF0ZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYWN0aW9uLgorCistLXNvZnQ6OgorCURvZXMgbm90IHRvdWNoIHRoZSBpbmRleCBmaWxlIG5vciB0aGUgd29ya2luZyB0cmVlIGF0IGFsbCwgYnV0CisJcmVxdWlyZXMgdGhlbSB0byBiZSBpbiBhIGdvb2Qgb3JkZXIuIFRoaXMgbGVhdmVzIGFsbCB5b3VyIGNoYW5nZWQKKwlmaWxlcyAiVXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iLCBhcyBnaXRsaW5rOmdpdC1zdGF0dXNbMV0gd291bGQKKwlwdXQgaXQuCisKKy0taGFyZDo6CisJTWF0Y2hlcyB0aGUgd29ya2luZyB0cmVlIGFuZCBpbmRleCB0byB0aGF0IG9mIHRoZSB0cmVlIGJlaW5nCisJc3dpdGNoZWQgdG8uIEFueSBjaGFuZ2VzIHRvIHRyYWNrZWQgZmlsZXMgaW4gdGhlIHdvcmtpbmcgdHJlZQorCXNpbmNlIDxjb21taXQtaXNoPiBhcmUgbG9zdC4KKworPGNvbW1pdC1pc2g+OjoKKwlDb21taXQgdG8gbWFrZSB0aGUgY3VycmVudCBIRUFELgorCitFeGFtcGxlcworLS0tLS0tLS0KKworVW5kbyBhIGNvbW1pdCBhbmQgcmVkbzo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAuLi4KKyQgZ2l0IHJlc2V0IC0tc29mdCBIRUFEXiAgICAgIDwxPgorJCBlZGl0ICAgICAgICAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCBjb21taXQgLWEgLWMgT1JJR19IRUFEICA8Mz4KKy0tLS0tLS0tLS0tLQorKworPDE+IFRoaXMgaXMgbW9zdCBvZnRlbiBkb25lIHdoZW4geW91IHJlbWVtYmVyZWQgd2hhdCB5b3UKK2p1c3QgY29tbWl0dGVkIGlzIGluY29tcGxldGUsIG9yIHlvdSBtaXNzcGVsbGVkIHlvdXIgY29tbWl0CittZXNzYWdlLCBvciBib3RoLiAgTGVhdmVzIHdvcmtpbmcgdHJlZSBhcyBpdCB3YXMgYmVmb3JlICJyZXNldCIuCis8Mj4gbWFrZSBjb3JyZWN0aW9ucyB0byB3b3JraW5nIHRyZWUgZmlsZXMuCis8Mz4gInJlc2V0IiBjb3BpZXMgdGhlIG9sZCBoZWFkIHRvIC5naXQvT1JJR19IRUFEOyByZWRvIHRoZQorY29tbWl0IGJ5IHN0YXJ0aW5nIHdpdGggaXRzIGxvZyBtZXNzYWdlLiAgSWYgeW91IGRvIG5vdCBuZWVkIHRvCitlZGl0IHRoZSBtZXNzYWdlIGZ1cnRoZXIsIHlvdSBjYW4gZ2l2ZSAtQyBvcHRpb24gaW5zdGVhZC4KKworVW5kbyBjb21taXRzIHBlcm1hbmVudGx5OjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC4uLgorJCBnaXQgcmVzZXQgLS1oYXJkIEhFQUR+MyAgIDwxPgorLS0tLS0tLS0tLS0tCisrCis8MT4gVGhlIGxhc3QgdGhyZWUgY29tbWl0cyAoSEVBRCwgSEVBRF4sIGFuZCBIRUFEfjIpIHdlcmUgYmFkCithbmQgeW91IGRvIG5vdCB3YW50IHRvIGV2ZXIgc2VlIHRoZW0gYWdhaW4uICBEbyAqbm90KiBkbyB0aGlzIGlmCit5b3UgaGF2ZSBhbHJlYWR5IGdpdmVuIHRoZXNlIGNvbW1pdHMgdG8gc29tZWJvZHkgZWxzZS4KKworVW5kbyBhIGNvbW1pdCwgbWFraW5nIGl0IGEgdG9waWMgYnJhbmNoOjoKKysKKy0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIHRvcGljL3dpcCAgICAgPDE+CiskIGdpdCByZXNldCAtLWhhcmQgSEVBRH4zICA8Mj4KKyQgZ2l0IGNoZWNrb3V0IHRvcGljL3dpcCAgIDwzPgorLS0tLS0tLS0tLS0tCisrCis8MT4gWW91IGhhdmUgbWFkZSBzb21lIGNvbW1pdHMsIGJ1dCByZWFsaXplIHRoZXkgd2VyZSBwcmVtYXR1cmUKK3RvIGJlIGluIHRoZSAibWFzdGVyIiBicmFuY2guICBZb3Ugd2FudCB0byBjb250aW51ZSBwb2xpc2hpbmcKK3RoZW0gaW4gYSB0b3BpYyBicmFuY2gsIHNvIGNyZWF0ZSAidG9waWMvd2lwIiBicmFuY2ggb2ZmIG9mIHRoZQorY3VycmVudCBIRUFELgorPDI+IFJld2luZCB0aGUgbWFzdGVyIGJyYW5jaCB0byBnZXQgcmlkIG9mIHRob3NlIHRocmVlIGNvbW1pdHMuCis8Mz4gU3dpdGNoIHRvICJ0b3BpYy93aXAiIGJyYW5jaCBhbmQga2VlcCB3b3JraW5nLgorCitVbmRvIHVwZGF0ZS1pbmRleDo6CisrCistLS0tLS0tLS0tLS0KKyQgZWRpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8MT4KKyQgZ2l0LXVwZGF0ZS1pbmRleCBmcm90ei5jIGZpbGZyZS5jCiskIG1haWx4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCByZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CiskIGdpdCBwdWxsIGdpdDovL2luZm8uZXhhbXBsZS5jb20vIG5pdGZvbCAgPDQ+CistLS0tLS0tLS0tLS0KKysKKzwxPiB5b3UgYXJlIGhhcHBpbHkgd29ya2luZyBvbiBzb21ldGhpbmcsIGFuZCBmaW5kIHRoZSBjaGFuZ2VzCitpbiB0aGVzZSBmaWxlcyBhcmUgaW4gZ29vZCBvcmRlci4gIFlvdSBkbyBub3Qgd2FudCB0byBzZWUgdGhlbQord2hlbiB5b3UgcnVuICJnaXQgZGlmZiIsIGJlY2F1c2UgeW91IHBsYW4gdG8gd29yayBvbiBvdGhlciBmaWxlcworYW5kIGNoYW5nZXMgd2l0aCB0aGVzZSBmaWxlcyBhcmUgZGlzdHJhY3RpbmcuCis8Mj4gc29tZWJvZHkgYXNrcyB5b3UgdG8gcHVsbCwgYW5kIHRoZSBjaGFuZ2VzIHNvdW5kcyB3b3J0aHkgb2YgbWVyZ2luZy4KKzwzPiBob3dldmVyLCB5b3UgYWxyZWFkeSBkaXJ0aWVkIHRoZSBpbmRleCAoaS5lLiB5b3VyIGluZGV4IGRvZXMKK25vdCBtYXRjaCB0aGUgSEVBRCBjb21taXQpLiAgQnV0IHlvdSBrbm93IHRoZSBwdWxsIHlvdSBhcmUgZ29pbmcKK3RvIG1ha2UgZG9lcyBub3QgYWZmZWN0IGZyb3R6LmMgbm9yIGZpbGZyZS5jLCBzbyB5b3UgcmV2ZXJ0IHRoZQoraW5kZXggY2hhbmdlcyBmb3IgdGhlc2UgdHdvIGZpbGVzLiAgWW91ciBjaGFuZ2VzIGluIHdvcmtpbmcgdHJlZQorcmVtYWluIHRoZXJlLgorPDQ+IHRoZW4geW91IGNhbiBwdWxsIGFuZCBtZXJnZSwgbGVhdmluZyBmcm90ei5jIGFuZCBmaWxmcmUuYworY2hhbmdlcyBzdGlsbCBpbiB0aGUgd29ya2luZyB0cmVlLgorCitVbmRvIGEgbWVyZ2Ugb3IgcHVsbDo6CisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IHB1bGwgICAgICAgICAgICAgICAgICAgICAgICAgPDE+CitUcnlpbmcgcmVhbGx5IHRyaXZpYWwgaW4taW5kZXggbWVyZ2UuLi4KK2ZhdGFsOiBNZXJnZSByZXF1aXJlcyBmaWxlLWxldmVsIG1lcmdpbmcKK05vcGUuCisuLi4KK0F1dG8tbWVyZ2luZyBuaXRmb2wKK0NPTkZMSUNUIChjb250ZW50KTogTWVyZ2UgY29uZmxpY3QgaW4gbml0Zm9sCitBdXRvbWF0aWMgbWVyZ2UgZmFpbGVkL3ByZXZlbnRlZDsgZml4IHVwIGJ5IGhhbmQKKyQgZ2l0IHJlc2V0IC0taGFyZCAgICAgICAgICAgICAgICAgPDI+CiskIGdpdCBwdWxsIC4gdG9waWMvYnJhbmNoICAgICAgICAgIDwzPgorVXBkYXRpbmcgZnJvbSA0MTIyMy4uLiB0byAxMzEzNC4uLgorRmFzdCBmb3J3YXJkCiskIGdpdCByZXNldCAtLWhhcmQgT1JJR19IRUFEICAgICAgIDw0PgorLS0tLS0tLS0tLS0tCisrCis8MT4gdHJ5IHRvIHVwZGF0ZSBmcm9tIHRoZSB1cHN0cmVhbSByZXN1bHRlZCBpbiBhIGxvdCBvZgorY29uZmxpY3RzOyB5b3Ugd2VyZSBub3QgcmVhZHkgdG8gc3BlbmQgYSBsb3Qgb2YgdGltZSBtZXJnaW5nCityaWdodCBub3csIHNvIHlvdSBkZWNpZGUgdG8gZG8gdGhhdCBsYXRlci4KKzwyPiAicHVsbCIgaGFzIG5vdCBtYWRlIG1lcmdlIGNvbW1pdCwgc28gImdpdCByZXNldCAtLWhhcmQiCit3aGljaCBpcyBhIHN5bm9ueW0gZm9yICJnaXQgcmVzZXQgLS1oYXJkIEhFQUQiIGNsZWFycyB0aGUgbWVzcworZnJvbSB0aGUgaW5kZXggZmlsZSBhbmQgdGhlIHdvcmtpbmcgdHJlZS4KKzwzPiBtZXJnZSBhIHRvcGljIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCwgd2hpY2ggcmVzdWx0ZWQKK2luIGEgZmFzdCBmb3J3YXJkLgorPDQ+IGJ1dCB5b3UgZGVjaWRlZCB0aGF0IHRoZSB0b3BpYyBicmFuY2ggaXMgbm90IHJlYWR5IGZvciBwdWJsaWMKK2NvbnN1bXB0aW9uIHlldC4gICJwdWxsIiBvciAibWVyZ2UiIGFsd2F5cyBsZWF2ZXMgdGhlIG9yaWdpbmFsCit0aXAgb2YgdGhlIGN1cnJlbnQgYnJhbmNoIGluIE9SSUdfSEVBRCwgc28gcmVzZXR0aW5nIGhhcmQgdG8gaXQKK2JyaW5ncyB5b3VyIGluZGV4IGZpbGUgYW5kIHRoZSB3b3JraW5nIHRyZWUgYmFjayB0byB0aGF0IHN0YXRlLAorYW5kIHJlc2V0cyB0aGUgdGlwIG9mIHRoZSBicmFuY2ggdG8gdGhhdCBjb21taXQuCisKK0ludGVycnVwdGVkIHdvcmtmbG93OjoKKysKK1N1cHBvc2UgeW91IGFyZSBpbnRlcnJ1cHRlZCBieSBhbiB1cmdlbnQgZml4IHJlcXVlc3Qgd2hpbGUgeW91CithcmUgaW4gdGhlIG1pZGRsZSBvZiBhIGxhcmdlIGNoYW5nZS4gIFRoZSBmaWxlcyBpbiB5b3VyCit3b3JraW5nIHRyZWUgYXJlIG5vdCBpbiBhbnkgc2hhcGUgdG8gYmUgY29tbWl0dGVkIHlldCwgYnV0IHlvdQorbmVlZCB0byBnZXQgdG8gdGhlIG90aGVyIGJyYW5jaCBmb3IgYSBxdWljayBidWdmaXguCisrCistLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IGZlYXR1cmUgOyMgeW91IHdlcmUgd29ya2luZyBpbiAiZmVhdHVyZSIgYnJhbmNoIGFuZAorJCB3b3JrIHdvcmsgd29yayAgICAgICA7IyBnb3QgaW50ZXJydXB0ZWQKKyQgZ2l0IGNvbW1pdCAtYSAtbSAnc25hcHNob3QgV0lQJyAgICAgICAgICAgICAgICAgPDE+CiskIGdpdCBjaGVja291dCBtYXN0ZXIKKyQgZml4IGZpeCBmaXgKKyQgZ2l0IGNvbW1pdCA7IyBjb21taXQgd2l0aCByZWFsIGxvZworJCBnaXQgY2hlY2tvdXQgZmVhdHVyZQorJCBnaXQgcmVzZXQgLS1zb2Z0IEhFQUReIDsjIGdvIGJhY2sgdG8gV0lQIHN0YXRlICA8Mj4KKyQgZ2l0IHJlc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CistLS0tLS0tLS0tLS0KKysKKzwxPiBUaGlzIGNvbW1pdCB3aWxsIGdldCBibG93biBhd2F5IHNvIGEgdGhyb3ctYXdheSBsb2cgbWVzc2FnZSBpcyBPSy4KKzwyPiBUaGlzIHJlbW92ZXMgdGhlICdXSVAnIGNvbW1pdCBmcm9tIHRoZSBjb21taXQgaGlzdG9yeSwgYW5kIHNldHMKKyAgICB5b3VyIHdvcmtpbmcgdHJlZSB0byB0aGUgc3RhdGUganVzdCBiZWZvcmUgeW91IG1hZGUgdGhhdCBzbmFwc2hvdC4KKzwzPiBBdCB0aGlzIHBvaW50IHRoZSBpbmRleCBmaWxlIHN0aWxsIGhhcyBhbGwgdGhlIFdJUCBjaGFuZ2VzIHlvdQorICAgIGNvbW1pdHRlZCBhcyAnc25hcHNob3QgV0lQJy4gIFRoaXMgdXBkYXRlcyB0aGUgaW5kZXggdG8gc2hvdyB5b3VyCisgICAgV0lQIGZpbGVzIGFzIHVuY29tbWl0dGVkLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJlc29sdmUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcmVzb2x2ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU1N2MyYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJlc29sdmUudHh0CkBAIC0wLDAgKzEsMzYgQEAKK2dpdC1yZXNvbHZlKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmVzb2x2ZSAtIE1lcmdlIHR3byBjb21taXRzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJlc29sdmUnIDxjdXJyZW50PiA8bWVyZ2VkPiA8bWVzc2FnZT4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiB0d28gY29tbWl0cyBhbmQgYSBtZXJnZSBtZXNzYWdlLCBtZXJnZSB0aGUgPG1lcmdlZD4gY29tbWl0CitpbnRvIDxjdXJyZW50PiBjb21taXQsIHdpdGggdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSA8bWVzc2FnZT4uCisKK1doZW4gPGN1cnJlbnQ+IGlzIGEgZGVzY2VuZGFudCBvZiA8bWVyZ2VkPiwgb3IgPGN1cnJlbnQ+IGlzIGFuCithbmNlc3RvciBvZiA8bWVyZ2VkPiwgbm8gbmV3IGNvbW1pdCBpcyBjcmVhdGVkIGFuZCB0aGUgPG1lc3NhZ2U+CitpcyBpZ25vcmVkLiAgVGhlIGZvcm1lciBpcyBpbmZvcm1hbGx5IGNhbGxlZCAiYWxyZWFkeSB1cCB0bworZGF0ZSIsIGFuZCB0aGUgbGF0dGVyIGlzIG9mdGVuIGNhbGxlZCAiZmFzdCBmb3J3YXJkIi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorRGFuIEhvbG1zYW5kIDxob2xtc2FuZEBnbWFpbC5jb20+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXJldi1saXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJldi1saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDlmZmYxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtcmV2LWxpc3QudHh0CkBAIC0wLDAgKzEsMTQyIEBACitnaXQtcmV2LWxpc3QoMSkKKz09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmV2LWxpc3QgLSBMaXN0cyBjb21taXQgb2JqZWN0cyBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtcmV2LWxpc3QnIFsgXC0tbWF4LWNvdW50PW51bWJlciBdCisJICAgICBbIFwtLW1heC1hZ2U9dGltZXN0YW1wIF0KKwkgICAgIFsgXC0tbWluLWFnZT10aW1lc3RhbXAgXQorCSAgICAgWyBcLS1zcGFyc2UgXQorCSAgICAgWyBcLS1uby1tZXJnZXMgXQorCSAgICAgWyBcLS1yZW1vdmUtZW1wdHkgXQorCSAgICAgWyBcLS1ub3QgXQorCSAgICAgWyBcLS1hbGwgXQorCSAgICAgWyBcLS10b3BvLW9yZGVyIF0KKwkgICAgIFsgXC0tcGFyZW50cyBdCisJICAgICBbIFtcLS1vYmplY3RzIHwgXC0tb2JqZWN0cy1lZGdlXSBbIFwtLXVucGFja2VkIF0gXQorCSAgICAgWyBcLS1wcmV0dHkgfCBcLS1oZWFkZXIgXQorCSAgICAgWyBcLS1iaXNlY3QgXQorCSAgICAgWyBcLS1tZXJnZSBdCisJICAgICA8Y29tbWl0Pi4uLiBbIFwtLSA8cGF0aHM+Li4uIF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitMaXN0cyBjb21taXQgb2JqZWN0cyBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIgc3RhcnRpbmcgYXQgdGhlCitnaXZlbiBjb21taXQocyksIHRha2luZyBhbmNlc3RyeSByZWxhdGlvbnNoaXAgaW50byBhY2NvdW50LiAgVGhpcyBpcwordXNlZnVsIHRvIHByb2R1Y2UgaHVtYW4tcmVhZGFibGUgbG9nIG91dHB1dC4KKworQ29tbWl0cyB3aGljaCBhcmUgc3RhdGVkIHdpdGggYSBwcmVjZWRpbmcgJ3tjYXJldH0nIGNhdXNlIGxpc3RpbmcgdG8gc3RvcCBhdAordGhhdCBwb2ludC4gVGhlaXIgcGFyZW50cyBhcmUgaW1wbGllZC4gImdpdC1yZXYtbGlzdCBmb28gYmFyIHtjYXJldH1iYXoiIHRodXMKK21lYW5zICJsaXN0IGFsbCB0aGUgY29tbWl0cyB3aGljaCBhcmUgaW5jbHVkZWQgaW4gJ2ZvbycgYW5kICdiYXInLCBidXQKK25vdCBpbiAnYmF6JyIuCisKK0Egc3BlY2lhbCBub3RhdGlvbiA8Y29tbWl0MT4uLjxjb21taXQyPiBjYW4gYmUgdXNlZCBhcyBhCitzaG9ydC1oYW5kIGZvciB7Y2FyZXR9PGNvbW1pdDE+IDxjb21taXQyPi4KKworQW5vdGhlciBzcGVjaWFsIG5vdGF0aW9uIGlzIDxjb21taXQxPi4uLjxjb21taXQyPiB3aGljaCBpcyB1c2VmdWwgZm9yCittZXJnZXMuICBUaGUgcmVzdWx0aW5nIHNldCBvZiBjb21taXRzIGlzIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZQorYmV0d2VlbiB0aGUgdHdvIG9wZXJhbmRzLiAgVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgYXJlIGVxdWl2YWxlbnQ6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQtcmV2LWxpc3QgQSBCIC0tbm90ICQoZ2l0LW1lcmdlLWJhc2UgLS1hbGwgQSBCKQorJCBnaXQtcmV2LWxpc3QgQS4uLkIKKy0tLS0tLS0tLS0tLQorCitPUFRJT05TCistLS0tLS0tCistLXByZXR0eTo6CisJUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21taXQgY2hhbmdlc2V0cyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorCistLWhlYWRlcjo6CisJUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb21taXQgaW4gcmF3LWZvcm1hdDsgZWFjaAorCXJlY29yZCBpcyBzZXBhcmF0ZWQgd2l0aCBhIE5VTCBjaGFyYWN0ZXIuCisKKy0tcGFyZW50czo6CisJUHJpbnQgdGhlIHBhcmVudHMgb2YgdGhlIGNvbW1pdC4KKworLS1vYmplY3RzOjoKKwlQcmludCB0aGUgb2JqZWN0IElEcyBvZiBhbnkgb2JqZWN0IHJlZmVyZW5jZWQgYnkgdGhlIGxpc3RlZCBjb21taXRzLgorCSdnaXQtcmV2LWxpc3QgLS1vYmplY3RzIGZvbyBeYmFyJyB0aHVzIG1lYW5zICJzZW5kIG1lIGFsbCBvYmplY3QgSURzCisJd2hpY2ggSSBuZWVkIHRvIGRvd25sb2FkIGlmIEkgaGF2ZSB0aGUgY29tbWl0IG9iamVjdCAnYmFyJywgYnV0CisJbm90ICdmb28nIi4KKworLS1vYmplY3RzLWVkZ2U6OgorCVNpbWlsYXIgdG8gYC0tb2JqZWN0c2AsIGJ1dCBhbHNvIHByaW50IHRoZSBJRHMgb2YKKwlleGNsdWRlZCBjb21taXRzIHByZWZpeGVkIHdpdGggYSBgLWAgY2hhcmFjdGVyLiAgVGhpcyBpcworCXVzZWQgYnkgYGdpdC1wYWNrLW9iamVjdHNgIHRvIGJ1aWxkICd0aGluJyBwYWNrLCB3aGljaAorCXJlY29yZHMgb2JqZWN0cyBpbiBkZWx0aWZpZWQgZm9ybSBiYXNlZCBvbiBvYmplY3RzCisJY29udGFpbmVkIGluIHRoZXNlIGV4Y2x1ZGVkIGNvbW1pdHMgdG8gcmVkdWNlIG5ldHdvcmsKKwl0cmFmZmljLgorCistLXVucGFja2VkOjoKKwlPbmx5IHVzZWZ1bCB3aXRoIGAtLW9iamVjdHNgOyBwcmludCB0aGUgb2JqZWN0IElEcyB0aGF0CisJYXJlIG5vdCBpbiBwYWNrcy4KKworLS1iaXNlY3Q6OgorCUxpbWl0IG91dHB1dCB0byB0aGUgb25lIGNvbW1pdCBvYmplY3Qgd2hpY2ggaXMgcm91Z2hseSBoYWxmd2F5CisJYmV0d2VlbiB0aGUgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIGNvbW1pdHMuIFRodXMsIGlmICdnaXQtcmV2LWxpc3QKKwktLWJpc2VjdCBmb28ge2NhcmV0fWJhciB7Y2FyZXR9YmF6JyBvdXRwdXRzICdtaWRwb2ludCcsIHRoZSBvdXRwdXQKKwlvZiAnZ2l0LXJldi1saXN0IGZvbyB7Y2FyZXR9bWlkcG9pbnQnIGFuZCAnZ2l0LXJldi1saXN0IG1pZHBvaW50CisJe2NhcmV0fWJhciB7Y2FyZXR9YmF6JyB3b3VsZCBiZSBvZiByb3VnaGx5IHRoZSBzYW1lIGxlbmd0aC4KKwlGaW5kaW5nIHRoZSBjaGFuZ2UKKwl3aGljaCBpbnRyb2R1Y2VzIGEgcmVncmVzc2lvbiBpcyB0aHVzIHJlZHVjZWQgdG8gYSBiaW5hcnkgc2VhcmNoOgorCXJlcGVhdGVkbHkgZ2VuZXJhdGUgYW5kIHRlc3QgbmV3ICdtaWRwb2ludCdzIHVudGlsIHRoZSBjb21taXQgY2hhaW4KKwlpcyBvZiBsZW5ndGggb25lLgorCistLW1heC1jb3VudDo6CisJTGltaXQgdGhlIG51bWJlciBvZiBjb21taXRzIG91dHB1dC4KKworLS1tYXgtYWdlPXRpbWVzdGFtcCwgLS1taW4tYWdlPXRpbWVzdGFtcDo6CisJTGltaXQgdGhlIGNvbW1pdHMgb3V0cHV0IHRvIHNwZWNpZmllZCB0aW1lIHJhbmdlLgorCistLXNwYXJzZTo6CisJV2hlbiBvcHRpb25hbCBwYXRocyBhcmUgZ2l2ZW4sIHRoZSBjb21tYW5kIG91dHB1dHMgb25seQorCXRoZSBjb21taXRzIHRoYXQgY2hhbmdlcyBhdCBsZWFzdCBvbmUgb2YgdGhlbSwgYW5kIGFsc28KKwlpZ25vcmVzIG1lcmdlcyB0aGF0IGRvIG5vdCB0b3VjaCB0aGUgZ2l2ZW4gcGF0aHMuICBUaGlzCisJZmxhZyBtYWtlcyB0aGUgY29tbWFuZCBvdXRwdXQgYWxsIGVsaWdpYmxlIGNvbW1pdHMKKwkoc3RpbGwgc3ViamVjdCB0byBjb3VudCBhbmQgYWdlIGxpbWl0YXRpb24pLCBidXQgYXBwbHkKKwltZXJnZSBzaW1wbGlmaWNhdGlvbiBuZXZlcnRoZWxlc3MuCisKKy0tcmVtb3ZlLWVtcHR5OjoKKwlTdG9wIHdoZW4gYSBnaXZlbiBwYXRoIGRpc2FwcGVhcnMgZnJvbSB0aGUgdHJlZS4KKworLS1uby1tZXJnZXM6OgorCURvIG5vdCBwcmludCBjb21taXRzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJlbnQuCisKKy0tbm90OjoKKwlSZXZlcnNlcyB0aGUgbWVhbmluZyBvZiB0aGUgJ3tjYXJldH0nIHByZWZpeCAob3IgbGFjaworCXRoZXJlb2YpIGZvciBhbGwgZm9sbG93aW5nIHJldmlzaW9uIHNwZWNpZmllcnMsIHVwIHRvCisJdGhlIG5leHQgYC0tbm90YC4KKworLS1hbGw6OgorCVByZXRlbmQgYXMgaWYgYWxsIHRoZSByZWZzIGluIGAkR0lUX0RJUi9yZWZzL2AgYXJlCisJbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXMgPGNvbW1pdD4uCisKKy0tdG9wby1vcmRlcjo6CisJQnkgZGVmYXVsdCwgdGhlIGNvbW1pdHMgYXJlIHNob3duIGluIHJldmVyc2UKKwljaHJvbm9sb2dpY2FsIG9yZGVyLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlbSBhcHBlYXIgaW4KKwl0b3BvbG9naWNhbCBvcmRlciAoaS5lLiBkZXNjZW5kYW50IGNvbW1pdHMgYXJlIHNob3duCisJYmVmb3JlIHRoZWlyIHBhcmVudHMpLgorCistLW1lcmdlOjoKKwlBZnRlciBhIGZhaWxlZCBtZXJnZSwgc2hvdyByZWZzIHRoYXQgdG91Y2ggZmlsZXMgaGF2aW5nIGEKKwljb25mbGljdCBhbmQgZG9uJ3QgZXhpc3Qgb24gYWxsIGhlYWRzIHRvIG1lcmdlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmV2LXBhcnNlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJldi1wYXJzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MWI0YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJldi1wYXJzZS50eHQKQEAgLTAsMCArMSwyMzIgQEAKK2dpdC1yZXYtcGFyc2UoMSkKKz09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJldi1wYXJzZSAtIFBpY2sgb3V0IGFuZCBtYXNzYWdlIHBhcmFtZXRlcnMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmV2LXBhcnNlJyBbIC0tb3B0aW9uIF0gPGFyZ3M+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitNYW55IGdpdCBwb3JjZWxhaW5pc2ggY29tbWFuZHMgdGFrZSBtaXh0dXJlIG9mIGZsYWdzCisoaS5lLiBwYXJhbWV0ZXJzIHRoYXQgYmVnaW4gd2l0aCBhIGRhc2ggJy0nKSBhbmQgcGFyYW1ldGVycworbWVhbnQgZm9yIHVuZGVybHlpbmcgYGdpdC1yZXYtbGlzdGAgY29tbWFuZCB0aGV5IHVzZSBpbnRlcm5hbGx5CithbmQgZmxhZ3MgYW5kIHBhcmFtZXRlcnMgZm9yIG90aGVyIGNvbW1hbmRzIHRoZXkgdXNlIGFzIHRoZQorZG93bnN0cmVhbSBvZiBgZ2l0LXJldi1saXN0YC4gIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvCitkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uCisKKworT1BUSU9OUworLS0tLS0tLQorLS1yZXZzLW9ubHk6OgorCURvIG5vdCBvdXRwdXQgZmxhZ3MgYW5kIHBhcmFtZXRlcnMgbm90IG1lYW50IGZvcgorCWBnaXQtcmV2LWxpc3RgIGNvbW1hbmQuCisKKy0tbm8tcmV2czo6CisJRG8gbm90IG91dHB1dCBmbGFncyBhbmQgcGFyYW1ldGVycyBtZWFudCBmb3IKKwlgZ2l0LXJldi1saXN0YCBjb21tYW5kLgorCistLWZsYWdzOjoKKwlEbyBub3Qgb3V0cHV0IG5vbi1mbGFnIHBhcmFtZXRlcnMuCisKKy0tbm8tZmxhZ3M6OgorCURvIG5vdCBvdXRwdXQgZmxhZyBwYXJhbWV0ZXJzLgorCistLWRlZmF1bHQgPGFyZz46OgorCUlmIHRoZXJlIGlzIG5vIHBhcmFtZXRlciBnaXZlbiBieSB0aGUgdXNlciwgdXNlIGA8YXJnPmAKKwlpbnN0ZWFkLgorCistLXZlcmlmeTo6CisJVGhlIHBhcmFtZXRlciBnaXZlbiBtdXN0IGJlIHVzYWJsZSBhcyBhIHNpbmdsZSwgdmFsaWQKKwlvYmplY3QgbmFtZS4gIE90aGVyd2lzZSBiYXJmIGFuZCBhYm9ydC4KKworLS1zcTo6CisJVXN1YWxseSB0aGUgb3V0cHV0IGlzIG1hZGUgb25lIGxpbmUgcGVyIGZsYWcgYW5kCisJcGFyYW1ldGVyLiAgVGhpcyBvcHRpb24gbWFrZXMgb3V0cHV0IGEgc2luZ2xlIGxpbmUsCisJcHJvcGVybHkgcXVvdGVkIGZvciBjb25zdW1wdGlvbiBieSBzaGVsbC4gIFVzZWZ1bCB3aGVuCisJeW91IGV4cGVjdCB5b3VyIHBhcmFtZXRlciB0byBjb250YWluIHdoaXRlc3BhY2VzIGFuZAorCW5ld2xpbmVzIChlLmcuIHdoZW4gdXNpbmcgcGlja2F4ZSBgLVNgIHdpdGgKKwlgZ2l0LWRpZmYtXCpgKS4KKworLS1ub3Q6OgorCVdoZW4gc2hvd2luZyBvYmplY3QgbmFtZXMsIHByZWZpeCB0aGVtIHdpdGggJ3tjYXJldH0nIGFuZAorCXN0cmlwICd7Y2FyZXR9JyBwcmVmaXggZnJvbSB0aGUgb2JqZWN0IG5hbWVzIHRoYXQgYWxyZWFkeSBoYXZlCisJb25lLgorCistLXN5bWJvbGljOjoKKwlVc3VhbGx5IHRoZSBvYmplY3QgbmFtZXMgYXJlIG91dHB1dCBpbiBTSEExIGZvcm0gKHdpdGgKKwlwb3NzaWJsZSAne2NhcmV0fScgcHJlZml4KTsgdGhpcyBvcHRpb24gbWFrZXMgdGhlbSBvdXRwdXQgaW4gYQorCWZvcm0gYXMgY2xvc2UgdG8gdGhlIG9yaWdpbmFsIGlucHV0IGFzIHBvc3NpYmxlLgorCisKKy0tYWxsOjoKKwlTaG93IGFsbCByZWZzIGZvdW5kIGluIGAkR0lUX0RJUi9yZWZzYC4KKworLS1icmFuY2hlczo6CisJU2hvdyBicmFuY2ggcmVmcyBmb3VuZCBpbiBgJEdJVF9ESVIvcmVmcy9oZWFkc2AuCisKKy0tdGFnczo6CisJU2hvdyB0YWcgcmVmcyBmb3VuZCBpbiBgJEdJVF9ESVIvcmVmcy90YWdzYC4KKworLS1yZW1vdGVzOjoKKwlTaG93IHRhZyByZWZzIGZvdW5kIGluIGAkR0lUX0RJUi9yZWZzL3JlbW90ZXNgLgorCistLXNob3ctcHJlZml4OjoKKwlXaGVuIHRoZSBjb21tYW5kIGlzIGludm9rZWQgZnJvbSBhIHN1YmRpcmVjdG9yeSwgc2hvdyB0aGUKKwlwYXRoIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgdG9wLWxldmVsCisJZGlyZWN0b3J5LgorCistLXNob3ctY2R1cDo6CisJV2hlbiB0aGUgY29tbWFuZCBpcyBpbnZva2VkIGZyb20gYSBzdWJkaXJlY3RvcnksIHNob3cgdGhlCisJcGF0aCBvZiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgY3VycmVudAorCWRpcmVjdG9yeSAodHlwaWNhbGx5IGEgc2VxdWVuY2Ugb2YgIi4uLyIsIG9yIGFuIGVtcHR5IHN0cmluZykuCisKKy0tZ2l0LWRpcjo6CisJU2hvdyBgJEdJVF9ESVJgIGlmIGRlZmluZWQgZWxzZSBzaG93IHRoZSBwYXRoIHRvIHRoZSAuZ2l0IGRpcmVjdG9yeS4KKworLS1zaG9ydCwgLS1zaG9ydD1udW1iZXI6OgorCUluc3RlYWQgb2Ygb3V0cHV0dGluZyB0aGUgZnVsbCBTSEExIHZhbHVlcyBvZiBvYmplY3QgbmFtZXMgdHJ5IHRvCisJYWJicmV2aWF0ZSB0aGVtIHRvIGEgc2hvcnRlciB1bmlxdWUgbmFtZS4gV2hlbiBubyBsZW5ndGggaXMgc3BlY2lmaWVkCisJNyBpcyB1c2VkLiBUaGUgbWluaW11bSBsZW5ndGggaXMgNC4KKworLS1zaW5jZT1kYXRlc3RyaW5nLCAtLWFmdGVyPWRhdGVzdHJpbmc6OgorCVBhcnNlcyB0aGUgZGF0ZSBzdHJpbmcsIGFuZCBvdXRwdXRzIGNvcnJlc3BvbmRpbmcKKwktLW1heC1hZ2U9IHBhcmFtZXRlciBmb3IgZ2l0LXJldi1saXN0IGNvbW1hbmQuCisKKy0tdW50aWw9ZGF0ZXN0cmluZywgLS1iZWZvcmU9ZGF0ZXN0cmluZzo6CisJUGFyc2VzIHRoZSBkYXRlIHN0cmluZywgYW5kIG91dHB1dHMgY29ycmVzcG9uZGluZworCS0tbWluLWFnZT0gcGFyYW1ldGVyIGZvciBnaXQtcmV2LWxpc3QgY29tbWFuZC4KKworPGFyZ3M+Li4uOjoKKwlGbGFncyBhbmQgcGFyYW1ldGVycyB0byBiZSBwYXJzZWQuCisKKworU1BFQ0lGWUlORyBSRVZJU0lPTlMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgcmV2aXNpb24gcGFyYW1ldGVyIHR5cGljYWxseSwgYnV0IG5vdCBuZWNlc3NhcmlseSwgbmFtZXMgYQorY29tbWl0IG9iamVjdC4gIFRoZXkgdXNlIHdoYXQgaXMgY2FsbGVkIGFuICdleHRlbmRlZCBTSEExJworc3ludGF4LgorCisqIFRoZSBmdWxsIFNIQTEgb2JqZWN0IG5hbWUgKDQwLWJ5dGUgaGV4YWRlY2ltYWwgc3RyaW5nKSwgb3IKKyAgYSBzdWJzdHJpbmcgb2Ygc3VjaCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIHJlcG9zaXRvcnkuCisgIEUuZy4gZGFlODZlMTk1MGIxMjc3ZTU0NWNlZTE4MDU1MTc1MDAyOWNmZTczNSBhbmQgZGFlODZlIGJvdGgKKyAgbmFtZSB0aGUgc2FtZSBjb21taXQgb2JqZWN0IGlmIHRoZXJlIGFyZSBubyBvdGhlciBvYmplY3QgaW4KKyAgeW91ciByZXBvc2l0b3J5IHdob3NlIG9iamVjdCBuYW1lIHN0YXJ0cyB3aXRoIGRhZTg2ZS4KKworKiBBIHN5bWJvbGljIHJlZiBuYW1lLiAgRS5nLiAnbWFzdGVyJyB0eXBpY2FsbHkgbWVhbnMgdGhlIGNvbW1pdAorICBvYmplY3QgcmVmZXJlbmNlZCBieSAkR0lUX0RJUi9yZWZzL2hlYWRzL21hc3Rlci4gIElmIHlvdQorICBoYXBwZW4gdG8gaGF2ZSBib3RoIGhlYWRzL21hc3RlciBhbmQgdGFncy9tYXN0ZXIsIHlvdSBjYW4KKyAgZXhwbGljaXRseSBzYXkgJ2hlYWRzL21hc3RlcicgdG8gdGVsbCBnaXQgd2hpY2ggb25lIHlvdSBtZWFuLgorCisqIEEgc3VmZml4ICdAJyBmb2xsb3dlZCBieSBhIGRhdGUgc3BlY2lmaWNhdGlvbiBlbmNsb3NlZCBpbiBhIGJyYWNlCisgIHBhaXIgKGUuZy4gJ1x7eWVzdGVyZGF5XH0nLCAnXHsxIG1vbnRoIDIgd2Vla3MgMyBkYXlzIDEgaG91ciAxCisgIHNlY29uZCBhZ29cfScgb3IgJ1x7MTk3OS0wMi0yNiAxODozMDowMFx9JykgdG8gc3BlY2lmeSB0aGUgdmFsdWUKKyAgb2YgdGhlIHJlZiBhdCBhIHByaW9yIHBvaW50IGluIHRpbWUuICBUaGlzIHN1ZmZpeCBtYXkgb25seSBiZQorICB1c2VkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIHJlZiBuYW1lIGFuZCB0aGUgcmVmIG11c3QgaGF2ZSBhbgorICBleGlzdGluZyBsb2cgKCRHSVRfRElSL2xvZ3MvPHJlZj4pLgorCisqIEEgc3VmZml4ICd7Y2FyZXR9JyB0byBhIHJldmlzaW9uIHBhcmFtZXRlciBtZWFucyB0aGUgZmlyc3QgcGFyZW50IG9mCisgIHRoYXQgY29tbWl0IG9iamVjdC4gICd7Y2FyZXR9PG4+JyBtZWFucyB0aGUgPG4+dGggcGFyZW50IChpLmUuCisgICdyZXZ7Y2FyZXR9JworICBpcyBlcXVpdmFsZW50IHRvICdyZXZ7Y2FyZXR9MScpLiAgQXMgYSBzcGVjaWFsIHJ1bGUsCisgICdyZXZ7Y2FyZXR9MCcgbWVhbnMgdGhlIGNvbW1pdCBpdHNlbGYgYW5kIGlzIHVzZWQgd2hlbiAncmV2JyBpcyB0aGUKKyAgb2JqZWN0IG5hbWUgb2YgYSB0YWcgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIGEgY29tbWl0IG9iamVjdC4KKworKiBBIHN1ZmZpeCAnfjxuPicgdG8gYSByZXZpc2lvbiBwYXJhbWV0ZXIgbWVhbnMgdGhlIGNvbW1pdAorICBvYmplY3QgdGhhdCBpcyB0aGUgPG4+dGggZ2VuZXJhdGlvbiBncmFuZC1wYXJlbnQgb2YgdGhlIG5hbWVkCisgIGNvbW1pdCBvYmplY3QsIGZvbGxvd2luZyBvbmx5IHRoZSBmaXJzdCBwYXJlbnQuICBJLmUuIHJldn4zIGlzCisgIGVxdWl2YWxlbnQgdG8gcmV2e2NhcmV0fXtjYXJldH17Y2FyZXR9IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG9cCisgIHJldntjYXJldH0xe2NhcmV0fTF7Y2FyZXR9MS4KKworKiBBIHN1ZmZpeCAne2NhcmV0fScgZm9sbG93ZWQgYnkgYW4gb2JqZWN0IHR5cGUgbmFtZSBlbmNsb3NlZCBpbgorICBicmFjZSBwYWlyIChlLmcuIGB2MC45OS44e2NhcmV0fVx7Y29tbWl0XH1gKSBtZWFucyB0aGUgb2JqZWN0CisgIGNvdWxkIGJlIGEgdGFnLCBhbmQgZGVyZWZlcmVuY2UgdGhlIHRhZyByZWN1cnNpdmVseSB1bnRpbCBhbgorICBvYmplY3Qgb2YgdGhhdCB0eXBlIGlzIGZvdW5kIG9yIHRoZSBvYmplY3QgY2Fubm90IGJlCisgIGRlcmVmZXJlbmNlZCBhbnltb3JlIChpbiB3aGljaCBjYXNlLCBiYXJmKS4gIGByZXZ7Y2FyZXR9MGAKKyAgaW50cm9kdWNlZCBlYXJsaWVyIGlzIGEgc2hvcnQtaGFuZCBmb3IgYHJldntjYXJldH1ce2NvbW1pdFx9YC4KKworKiBBIHN1ZmZpeCAne2NhcmV0fScgZm9sbG93ZWQgYnkgYW4gZW1wdHkgYnJhY2UgcGFpcgorICAoZS5nLiBgdjAuOTkuOHtjYXJldH1ce1x9YCkgbWVhbnMgdGhlIG9iamVjdCBjb3VsZCBiZSBhIHRhZywKKyAgYW5kIGRlcmVmZXJlbmNlIHRoZSB0YWcgcmVjdXJzaXZlbHkgdW50aWwgYSBub24tdGFnIG9iamVjdCBpcworICBmb3VuZC4KKworSGVyZSBpcyBhbiBpbGx1c3RyYXRpb24sIGJ5IEpvbiBMb2VsaWdlci4gIEJvdGggbm9kZSBCIGFuZCBDIGFyZQorYSBjb21taXQgcGFyZW50cyBvZiBjb21taXQgbm9kZSBBLiAgUGFyZW50IGNvbW1pdHMgYXJlIG9yZGVyZWQKK2xlZnQtdG8tcmlnaHQuCisKKyAgICBHICAgSCAgIEkgICBKCisgICAgIFwgLyAgICAgXCAvCisgICAgICBEICAgRSAgIEYKKyAgICAgICBcICB8ICAvIFwKKyAgICAgICAgXCB8IC8gICB8CisgICAgICAgICBcfC8gICAgfAorICAgICAgICAgIEIgICAgIEMKKyAgICAgICAgICAgXCAgIC8KKyAgICAgICAgICAgIFwgLworICAgICAgICAgICAgIEEKKworICAgIEEgPSAgICAgID0gQV4wCisgICAgQiA9IEFeICAgPSBBXjEgICAgID0gQX4xCisgICAgQyA9IEFeMiAgPSBBXjIKKyAgICBEID0gQV5eICA9IEFeMV4xICAgPSBBfjIKKyAgICBFID0gQl4yICA9IEFeXjIKKyAgICBGID0gQl4zICA9IEFeXjMKKyAgICBHID0gQV5eXiA9IEFeMV4xXjEgPSBBfjMKKyAgICBIID0gRF4yICA9IEJeXjIgICAgPSBBXl5eMiAgPSBBfjJeMgorICAgIEkgPSBGXiAgID0gQl4zXiAgICA9IEFeXjNeCisgICAgSiA9IEZeMiAgPSBCXjNeMiAgID0gQV5eM14yCisKKworU1BFQ0lGWUlORyBSQU5HRVMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0hpc3RvcnkgdHJhdmVyc2luZyBjb21tYW5kcyBzdWNoIGFzIGBnaXQtbG9nYCBvcGVyYXRlIG9uIGEgc2V0CitvZiBjb21taXRzLCBub3QganVzdCBhIHNpbmdsZSBjb21taXQuICBUbyB0aGVzZSBjb21tYW5kcywKK3NwZWNpZnlpbmcgYSBzaW5nbGUgcmV2aXNpb24gd2l0aCB0aGUgbm90YXRpb24gZGVzY3JpYmVkIGluIHRoZQorcHJldmlvdXMgc2VjdGlvbiBtZWFucyB0aGUgc2V0IG9mIGNvbW1pdHMgcmVhY2hhYmxlIGZyb20gdGhhdAorY29tbWl0LCBmb2xsb3dpbmcgdGhlIGNvbW1pdCBhbmNlc3RyeSBjaGFpbi4KKworVG8gZXhjbHVkZSBjb21taXRzIHJlYWNoYWJsZSBmcm9tIGEgY29tbWl0LCBhIHByZWZpeCBge2NhcmV0fWAKK25vdGF0aW9uIGlzIHVzZWQuICBFLmcuICJge2NhcmV0fXIxIHIyYCIgbWVhbnMgY29tbWl0cyByZWFjaGFibGUKK2Zyb20gYHIyYCBidXQgZXhjbHVkZSB0aGUgb25lcyByZWFjaGFibGUgZnJvbSBgcjFgLgorCitUaGlzIHNldCBvcGVyYXRpb24gYXBwZWFycyBzbyBvZnRlbiB0aGF0IHRoZXJlIGlzIGEgc2hvcnRoYW5kCitmb3IgaXQuICAiYHIxLi5yMmAiIGlzIGVxdWl2YWxlbnQgdG8gImB7Y2FyZXR9cjEgcjJgIi4gIEl0IGlzCit0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyAoc3VidHJhY3QgdGhlIHNldCBvZiBjb21taXRzCityZWFjaGFibGUgZnJvbSBgcjFgIGZyb20gdGhlIHNldCBvZiBjb21taXRzIHJlYWNoYWJsZSBmcm9tCitgcjJgKS4KKworQSBzaW1pbGFyIG5vdGF0aW9uICJgcjFcLi4ucjJgIiBpcyBjYWxsZWQgc3ltbWV0cmljIGRpZmZlcmVuY2UKK29mIGByMWAgYW5kIGByMmAgYW5kIGlzIGRlZmluZWQgYXMKKyJgcjEgcjIgLS1ub3QgJChnaXQtbWVyZ2UtYmFzZSAtLWFsbCByMSByMilgIi4KK0l0IGl0IHRoZSBzZXQgb2YgY29tbWl0cyB0aGF0IGFyZSByZWFjaGFibGUgZnJvbSBlaXRoZXIgb25lIG9mCitgcjFgIG9yIGByMmAgYnV0IG5vdCBmcm9tIGJvdGguCisKK0hlcmUgYXJlIGEgZmV3IGV4YW1wbGVzOgorCisgICBEICAgICAgICAgICAgICAgIEEgQiBECisgICBEIEYgICAgICAgICAgICAgIEEgQiBDIEQgRgorICAgXkEgRwkJICAgIEIgRAorICAgXkEgRiAgICAgICAgICAgICBCIEMgRgorICAgRy4uLkkgICAgICAgICAgICBDIEQgRiBHIEkKKyAgIF5CIEcgSQkgICAgQyBEIEYgRyBJCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYW5kCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcmV2ZXJ0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXJldmVydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNzgxNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXJldmVydC50eHQKQEAgLTAsMCArMSw1NyBAQAorZ2l0LXJldmVydCgxKQorPT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtcmV2ZXJ0IC0gUmV2ZXJ0IGFuIGV4aXN0aW5nIGNvbW1pdAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtcmV2ZXJ0JyBbLS1lZGl0IHwgLS1uby1lZGl0XSBbLW5dIDxjb21taXQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorR2l2ZW4gb25lIGV4aXN0aW5nIGNvbW1pdCwgcmV2ZXJ0IHRoZSBjaGFuZ2UgdGhlIHBhdGNoIGludHJvZHVjZXMsIGFuZCByZWNvcmQgYQorbmV3IGNvbW1pdCB0aGF0IHJlY29yZHMgaXQuICBUaGlzIHJlcXVpcmVzIHlvdXIgd29ya2luZyB0cmVlIHRvIGJlIGNsZWFuIChubworbW9kaWZpY2F0aW9ucyBmcm9tIHRoZSBIRUFEIGNvbW1pdCkuCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb21taXQ+OjoKKwlDb21taXQgdG8gcmV2ZXJ0LgorCistZXwtLWVkaXQ6OgorCVdpdGggdGhpcyBvcHRpb24sIGBnaXQtcmV2ZXJ0YCB3aWxsIGxldCB5b3UgZWRpdCB0aGUgY29tbWl0CisJbWVzc2FnZSBwcmlvciBjb21taXR0aW5nIHRoZSByZXZlcnQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgaWYKKwl5b3UgcnVuIHRoZSBjb21tYW5kIGZyb20gYSB0ZXJtaW5hbC4KKworLS1uby1lZGl0OjoKKwlXaXRoIHRoaXMgb3B0aW9uLCBgZ2l0LXJldmVydGAgd2lsbCBub3Qgc3RhcnQgdGhlIGNvbW1pdAorCW1lc3NhZ2UgZWRpdG9yLgorCistbnwtLW5vLWNvbW1pdDo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYSBjb21taXQgd2l0aAorCWEgY29tbWl0IGxvZyBtZXNzYWdlIHN0YXRpbmcgd2hpY2ggY29tbWl0IHdhcyByZXZlcnRlZC4KKwlUaGlzIGZsYWcgYXBwbGllcyB0aGUgY2hhbmdlIG5lY2Vzc2FyeSB0byByZXZlcnQgdGhlCisJbmFtZWQgY29tbWl0IHRvIHlvdXIgd29ya2luZyB0cmVlLCBidXQgZG9lcyBub3QgbWFrZSB0aGUKKwljb21taXQuICBJbiBhZGRpdGlvbiwgd2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCB5b3VyCisJd29ya2luZyB0cmVlIGRvZXMgbm90IGhhdmUgdG8gbWF0Y2ggdGhlIEhFQUQgY29tbWl0LgorCVRoZSByZXZlcnQgaXMgZG9uZSBhZ2FpbnN0IHRoZSBiZWdpbm5pbmcgc3RhdGUgb2YgeW91cgorCXdvcmtpbmcgdHJlZS4KKysKK1RoaXMgaXMgdXNlZnVsIHdoZW4gcmV2ZXJ0aW5nIG1vcmUgdGhhbiBvbmUgY29tbWl0cycKK2VmZmVjdCB0byB5b3VyIHdvcmtpbmcgdHJlZSBpbiBhIHJvdy4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtcm0udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcm0udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmM0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1ybS50eHQKQEAgLTAsMCArMSw5MiBAQAorZ2l0LXJtKDEpCis9PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXJtIC0gUmVtb3ZlIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBhbmQgZnJvbSB0aGUgaW5kZXgKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXJtJyBbLWZdIFstbl0gWy12XSBbLS1dIDxmaWxlPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0EgY29udmVuaWVuY2Ugd3JhcHBlciBmb3IgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZS4gRm9yIHRob3NlIGNvbWluZworZnJvbSBjdnMsIGdpdC1ybSBwcm92aWRlcyBhbiBvcGVyYXRpb24gc2ltaWxhciB0byAiY3ZzIHJtIiBvciAiY3ZzCityZW1vdmUiLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxmaWxlPi4uLjo6CisJRmlsZXMgdG8gcmVtb3ZlIGZyb20gdGhlIGluZGV4IGFuZCBvcHRpb25hbGx5LCBmcm9tIHRoZQorCXdvcmtpbmcgdHJlZSBhcyB3ZWxsLgorCistZjo6CisJUmVtb3ZlIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgdHJlZSBhcyB3ZWxsIGFzIGZyb20gdGhlIGluZGV4LgorCistbjo6CisgICAgICAgIERvbid0IGFjdHVhbGx5IHJlbW92ZSB0aGUgZmlsZShzKSwganVzdCBzaG93IGlmIHRoZXkgZXhpc3QgaW4KKyAgICAgICAgdGhlIGluZGV4LgorCistdjo6CisgICAgICAgIEJlIHZlcmJvc2UuCisKK1wtLTo6CisJVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgY29tbWFuZC1saW5lIG9wdGlvbnMgZnJvbQorCXRoZSBsaXN0IG9mIGZpbGVzLCAodXNlZnVsIHdoZW4gZmlsZW5hbWVzIG1pZ2h0IGJlIG1pc3Rha2VuCisJZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zKS4KKworCitESVNDVVNTSU9OCistLS0tLS0tLS0tCisKK1RoZSBsaXN0IG9mIDxmaWxlPiBnaXZlbiB0byB0aGUgY29tbWFuZCBpcyBmZWQgdG8gYGdpdC1scy1maWxlc2AKK2NvbW1hbmQgdG8gbGlzdCBmaWxlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGluIHRoZSBpbmRleCBhbmQKK2FyZSBub3QgaWdub3JlZC9leGNsdWRlZCBieSBgJEdJVF9ESVIvaW5mby9leGNsdWRlYCBmaWxlIG9yCitgLmdpdGlnbm9yZWAgZmlsZSBpbiBlYWNoIGRpcmVjdG9yeS4gIFRoaXMgbWVhbnMgdHdvIHRoaW5nczoKKworLiBZb3UgY2FuIHB1dCB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlCisgIGNvbW1hbmQgd2lsbCByZW1vdmUgYWxsIGZpbGVzIGluIGl0IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMgKHRoZQorICBkaXJlY3RvcmllcyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZW1vdmVkIGZyb20gdGhlIHdvcmtpbmcgdHJlZSk7CisKKy4gR2l2aW5nIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGlzIG5vdCBpbiB0aGUgaW5kZXggZG9lcyBub3QKKyAgcmVtb3ZlIHRoYXQgZmlsZS4KKworCitFWEFNUExFUworLS0tLS0tLS0KK2dpdC1ybSBEb2N1bWVudGF0aW9uL1xcKi50eHQ6OgorCisJUmVtb3ZlcyBhbGwgYFwqLnR4dGAgZmlsZXMgZnJvbSB0aGUgaW5kZXggdGhhdCBhcmUgdW5kZXIgdGhlCisJYERvY3VtZW50YXRpb25gIGRpcmVjdG9yeSBhbmQgYW55IG9mIGl0cyBzdWJkaXJlY3Rvcmllcy4gVGhlCisJZmlsZXMgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIHdvcmtpbmcgdHJlZS4KKysKK05vdGUgdGhhdCB0aGUgYXN0ZXJpc2sgYFwqYCBpcyBxdW90ZWQgZnJvbSB0aGUgc2hlbGwgaW4gdGhpcworZXhhbXBsZTsgdGhpcyBsZXRzIHRoZSBjb21tYW5kIGluY2x1ZGUgdGhlIGZpbGVzIGZyb20KK3N1YmRpcmVjdG9yaWVzIG9mIGBEb2N1bWVudGF0aW9uL2AgZGlyZWN0b3J5LgorCitnaXQtcm0gLWYgZ2l0LSouc2g6OgorCisJUmVtb3ZlIGFsbCBnaXQtKi5zaCBzY3JpcHRzIHRoYXQgYXJlIGluIHRoZSBpbmRleC4gVGhlIGZpbGVzCisJYXJlIHJlbW92ZWQgZnJvbSB0aGUgaW5kZXgsIGFuZCAoYmVjYXVzZSBvZiB0aGUgLWYgb3B0aW9uKSwKKwlmcm9tIHRoZSB3b3JraW5nIHRyZWUgYXMgd2VsbC4gQmVjYXVzZSB0aGlzIGV4YW1wbGUgbGV0cyB0aGUKKwlzaGVsbCBleHBhbmQgdGhlIGFzdGVyaXNrIChpLmUuIHlvdSBhcmUgbGlzdGluZyB0aGUgZmlsZXMKKwlleHBsaWNpdGx5KSwgaXQgZG9lcyBub3QgcmVtb3ZlIGBzdWJkaXIvZ2l0LWZvby5zaGAuCisKK1NlZSBBbHNvCistLS0tLS0tLQorZ2l0bGluazpnaXQtYWRkWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNlbmQtZW1haWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MWIzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLWVtYWlsLnR4dApAQCAtMCwwICsxLDEwMyBAQAorZ2l0LXNlbmQtZW1haWwoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zZW5kLWVtYWlsIC0gU2VuZCBhIGNvbGxlY3Rpb24gb2YgcGF0Y2hlcyBhcyBlbWFpbHMKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtc2VuZC1lbWFpbCcgW29wdGlvbnNdIDxmaWxlfGRpcmVjdG9yeT4gWy4uLiBmaWxlfGRpcmVjdG9yeV0KKworCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGFrZXMgdGhlIHBhdGNoZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBhbmQgZW1haWxzIHRoZW0gb3V0LgorCitUaGUgaGVhZGVyIG9mIHRoZSBlbWFpbCBpcyBjb25maWd1cmFibGUgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuICBJZiBub3QKK3NwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHdpdGggYSBSZWFkTGluZQorZW5hYmxlZCBpbnRlcmZhY2UgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uLgorCitPUFRJT05TCistLS0tLS0tCitUaGUgb3B0aW9ucyBhdmFpbGFibGUgYXJlOgorCistLWJjYzo6CisJU3BlY2lmeSBhICJCY2M6IiB2YWx1ZSBmb3IgZWFjaCBlbWFpbC4KKworCVRoZSAtLWJjYyBvcHRpb24gbXVzdCBiZSByZXBlYXRlZCBmb3IgZWFjaCB1c2VyIHlvdSB3YW50IG9uIHRoZSBiY2MgbGlzdC4KKworLS1jYzo6CisJU3BlY2lmeSBhIHN0YXJ0aW5nICJDYzoiIHZhbHVlIGZvciBlYWNoIGVtYWlsLgorCisJVGhlIC0tY2Mgb3B0aW9uIG11c3QgYmUgcmVwZWF0ZWQgZm9yIGVhY2ggdXNlciB5b3Ugd2FudCBvbiB0aGUgY2MgbGlzdC4KKworLS1jaGFpbi1yZXBseS10bywgLS1uby1jaGFpbi1yZXBseS10bzo6CisJSWYgdGhpcyBpcyBzZXQsIGVhY2ggZW1haWwgd2lsbCBiZSBzZW50IGFzIGEgcmVwbHkgdG8gdGhlIHByZXZpb3VzCisJZW1haWwgc2VudC4gIElmIGRpc2FibGVkIHdpdGggIi0tbm8tY2hhaW4tcmVwbHktdG8iLCBhbGwgZW1haWxzIGFmdGVyCisJdGhlIGZpcnN0IHdpbGwgYmUgc2VudCBhcyByZXBsaWVzIHRvIHRoZSBmaXJzdCBlbWFpbCBzZW50LiAgV2hlbiB1c2luZworCXRoaXMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIGZpcnN0IGZpbGUgZ2l2ZW4gYmUgYW4gb3ZlcnZpZXcgb2YgdGhlCisJZW50aXJlIHBhdGNoIHNlcmllcy4KKwlEZWZhdWx0IGlzIC0tY2hhaW4tcmVwbHktdG8KKworLS1jb21wb3NlOjoKKwlVc2UgJEVESVRPUiB0byBlZGl0IGFuIGludHJvZHVjdG9yeSBtZXNzYWdlIGZvciB0aGUKKwlwYXRjaCBzZXJpZXMuCisKKy0tZnJvbTo6CisJU3BlY2lmeSB0aGUgc2VuZGVyIG9mIHRoZSBlbWFpbHMuICBUaGlzIHdpbGwgZGVmYXVsdCB0bworCXRoZSB2YWx1ZSBHSVRfQ09NTUlUVEVSX0lERU5ULCBhcyByZXR1cm5lZCBieSAiZ2l0LXZhciAtbCIuCisJVGhlIHVzZXIgd2lsbCBzdGlsbCBiZSBwcm9tcHRlZCB0byBjb25maXJtIHRoaXMgZW50cnkuCisKKy0taW4tcmVwbHktdG86OgorCVNwZWNpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBJbi1SZXBseS1UbyBoZWFkZXIuCisJU3Vic2VxdWVudCBlbWFpbHMgd2lsbCByZWZlciB0byB0aGUgcHJldmlvdXMgZW1haWwgCisJaW5zdGVhZCBvZiB0aGlzIGlmIC0tY2hhaW4tcmVwbHktdG8gaXMgc2V0ICh0aGUgZGVmYXVsdCkKKwlPbmx5IG5lY2Vzc2FyeSBpZiAtLWNvbXBvc2UgaXMgYWxzbyBzZXQuICBJZiAtLWNvbXBvc2UKKwlpcyBub3Qgc2V0LCB0aGlzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yLgorCistLW5vLXNpZ25lZC1vZmYtYnktY2M6OgorCURvIG5vdCBhZGQgZW1haWxzIGZvdW5kIGluIFNpZ25lZC1vZmYtYnk6IGxpbmVzIHRvIHRoZSBjYyBsaXN0LgorCistLXF1aWV0OjoKKwlNYWtlIGdpdC1zZW5kLWVtYWlsIGxlc3MgdmVyYm9zZS4gIE9uZSBsaW5lIHBlciBlbWFpbCBzaG91bGQgYmUKKwlhbGwgdGhhdCBpcyBvdXRwdXQuCisKKy0tc210cC1zZXJ2ZXI6OgorCUlmIHNldCwgc3BlY2lmaWVzIHRoZSBvdXRnb2luZyBTTVRQIHNlcnZlciB0byB1c2UuICBEZWZhdWx0cyB0bworCWxvY2FsaG9zdC4KKworLS1zdWJqZWN0OjoKKyAgIAlTcGVjaWZ5IHRoZSBpbml0aWFsIHN1YmplY3Qgb2YgdGhlIGVtYWlsIHRocmVhZC4KKwlPbmx5IG5lY2Vzc2FyeSBpZiAtLWNvbXBvc2UgaXMgYWxzbyBzZXQuICBJZiAtLWNvbXBvc2UKKwlpcyBub3Qgc2V0LCB0aGlzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yLgorCistLXN1cHByZXNzLWZyb206OgorCURvIG5vdCBhZGQgdGhlIEZyb206IGFkZHJlc3MgdG8gdGhlIGNjOiBsaXN0LCBpZiBpdCBzaG93cyB1cCBpbiBhIEZyb206CisJbGluZS4KKworLS10bzo6CisJU3BlY2lmeSB0aGUgcHJpbWFyeSByZWNpcGllbnQgb2YgdGhlIGVtYWlscyBnZW5lcmF0ZWQuCisJR2VuZXJhbGx5LCB0aGlzIHdpbGwgYmUgdGhlIHVwc3RyZWFtIG1haW50YWluZXIgb2YgdGhlCisJcHJvamVjdCBpbnZvbHZlZC4KKworCVRoZSAtLXRvIG9wdGlvbiBtdXN0IGJlIHJlcGVhdGVkIGZvciBlYWNoIHVzZXIgeW91IHdhbnQgb24gdGhlIHRvIGxpc3QuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKworZ2l0LXNlbmQtZW1haWwgaXMgb3JpZ2luYWxseSBiYXNlZCB1cG9uCitzZW5kX2xvdHNfb2ZfZW1haWwucGwgYnkgR3JlZyBLcm9haC1IYXJ0bWFuLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBSeWFuIEFuZGVyc29uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zZW5kLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1wYWNrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY3ZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2VuZC1wYWNrLnR4dApAQCAtMCwwICsxLDExMCBAQAorZ2l0LXNlbmQtcGFjaygxKQorPT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2VuZC1wYWNrIC0gUHVzaCBtaXNzaW5nIG9iamVjdHMgcGFja2VkCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNlbmQtcGFjaycgWy0tYWxsXSBbLS1mb3JjZV0gWy0tZXhlYz08Z2l0LXJlY2VpdmUtcGFjaz5dIFs8aG9zdD46XTxkaXJlY3Rvcnk+IFs8cmVmPi4uLl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitJbnZva2VzICdnaXQtcmVjZWl2ZS1wYWNrJyBvbiBhIHBvc3NpYmx5IHJlbW90ZSByZXBvc2l0b3J5LCBhbmQKK3VwZGF0ZXMgaXQgZnJvbSB0aGUgY3VycmVudCByZXBvc2l0b3J5LCBzZW5kaW5nIG5hbWVkIHJlZnMuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1leGVjPTxnaXQtcmVjZWl2ZS1wYWNrPjo6CisJUGF0aCB0byB0aGUgJ2dpdC1yZWNlaXZlLXBhY2snIHByb2dyYW0gb24gdGhlIHJlbW90ZQorCWVuZC4gIFNvbWV0aW1lcyB1c2VmdWwgd2hlbiBwdXNoaW5nIHRvIGEgcmVtb3RlCisJcmVwb3NpdG9yeSBvdmVyIHNzaCwgYW5kIHlvdSBkbyBub3QgaGF2ZSB0aGUgcHJvZ3JhbSBpbgorCWEgZGlyZWN0b3J5IG9uIHRoZSBkZWZhdWx0ICRQQVRILgorCistLWFsbDo6CisJSW5zdGVhZCBvZiBleHBsaWNpdGx5IHNwZWNpZnlpbmcgd2hpY2ggcmVmcyB0byB1cGRhdGUsCisJdXBkYXRlIGFsbCByZWZzIHRoYXQgbG9jYWxseSBleGlzdC4KKworLS1mb3JjZTo6CisJVXN1YWxseSwgdGhlIGNvbW1hbmQgcmVmdXNlcyB0byB1cGRhdGUgYSByZW1vdGUgcmVmIHRoYXQKKwlpcyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIGxvY2FsIHJlZiB1c2VkIHRvIG92ZXJ3cml0ZSBpdC4KKwlUaGlzIGZsYWcgZGlzYWJsZXMgdGhlIGNoZWNrLiAgV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQKKwl0aGUgcmVtb3RlIHJlcG9zaXRvcnkgY2FuIGxvc2UgY29tbWl0czsgdXNlIGl0IHdpdGgKKwljYXJlLgorCis8aG9zdD46OgorCUEgcmVtb3RlIGhvc3QgdG8gaG91c2UgdGhlIHJlcG9zaXRvcnkuICBXaGVuIHRoaXMKKwlwYXJ0IGlzIHNwZWNpZmllZCwgJ2dpdC1yZWNlaXZlLXBhY2snIGlzIGludm9rZWQgdmlhCisJc3NoLgorCis8ZGlyZWN0b3J5Pjo6CisJVGhlIHJlcG9zaXRvcnkgdG8gdXBkYXRlLgorCis8cmVmPi4uLjoKKwlUaGUgcmVtb3RlIHJlZnMgdG8gdXBkYXRlLgorCisKK1NwZWNpZnlpbmcgdGhlIFJlZnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gc3BlY2lmeSB3aGljaCByZWZzIHRvIHVwZGF0ZSBvbiB0aGUKK3JlbW90ZSBlbmQuCisKK1dpdGggJy0tYWxsJyBmbGFnLCBhbGwgcmVmcyB0aGF0IGV4aXN0IGxvY2FsbHkgYXJlIHRyYW5zZmVycmVkIHRvCit0aGUgcmVtb3RlIHNpZGUuICBZb3UgY2Fubm90IHNwZWNpZnkgYW55ICc8cmVmPicgaWYgeW91IHVzZQordGhpcyBmbGFnLgorCitXaXRob3V0ICctLWFsbCcgYW5kIHdpdGhvdXQgYW55ICc8cmVmPicsIHRoZSByZWZzIHRoYXQgZXhpc3QKK2JvdGggb24gdGhlIGxvY2FsIHNpZGUgYW5kIG9uIHRoZSByZW1vdGUgc2lkZSBhcmUgdXBkYXRlZC4KKworV2hlbiBvbmUgb3IgbW9yZSAnPHJlZj4nIGFyZSBzcGVjaWZpZWQgZXhwbGljaXRseSwgaXQgY2FuIGJlIGVpdGhlciBhCitzaW5nbGUgcGF0dGVybiwgb3IgYSBwYWlyIG9mIHN1Y2ggcGF0dGVybiBzZXBhcmF0ZWQgYnkgYSBjb2xvbgorIjoiICh0aGlzIG1lYW5zIHRoYXQgYSByZWYgbmFtZSBjYW5ub3QgaGF2ZSBhIGNvbG9uIGluIGl0KS4gIEEKK3NpbmdsZSBwYXR0ZXJuICc8bmFtZT4nIGlzIGp1c3QgYSBzaG9ydGhhbmQgZm9yICc8bmFtZT46PG5hbWU+Jy4KKworRWFjaCBwYXR0ZXJuIHBhaXIgY29uc2lzdHMgb2YgdGhlIHNvdXJjZSBzaWRlIChiZWZvcmUgdGhlIGNvbG9uKQorYW5kIHRoZSBkZXN0aW5hdGlvbiBzaWRlIChhZnRlciB0aGUgY29sb24pLiAgVGhlIHJlZiB0byBiZQorcHVzaGVkIGlzIGRldGVybWluZWQgYnkgZmluZGluZyBhIG1hdGNoIHRoYXQgbWF0Y2hlcyB0aGUgc291cmNlCitzaWRlLCBhbmQgd2hlcmUgaXQgaXMgcHVzaGVkIGlzIGRldGVybWluZWQgYnkgdXNpbmcgdGhlCitkZXN0aW5hdGlvbiBzaWRlLgorCisgLSBJdCBpcyBhbiBlcnJvciBpZiA8c3JjPiBkb2VzIG5vdCBtYXRjaCBleGFjdGx5IG9uZSBvZiB0aGUKKyAgIGxvY2FsIHJlZnMuCisKKyAtIEl0IGlzIGFuIGVycm9yIGlmIDxkc3Q+IG1hdGNoZXMgbW9yZSB0aGFuIG9uZSByZW1vdGUgcmVmcy4KKworIC0gSWYgPGRzdD4gZG9lcyBub3QgbWF0Y2ggYW55IHJlbW90ZSByZWYsIGVpdGhlcgorCisgICAqIGl0IGhhcyB0byBzdGFydCB3aXRoICJyZWZzLyI7IDxkc3Q+IGlzIHVzZWQgYXMgdGhlCisgICAgIGRlc3RpbmF0aW9uIGxpdGVyYWxseSBpbiB0aGlzIGNhc2UuCisKKyAgICogPHNyYz4gPT0gPGRzdD4gYW5kIHRoZSByZWYgdGhhdCBtYXRjaGVkIHRoZSA8c3JjPiBtdXN0IG5vdAorICAgICBleGlzdCBpbiB0aGUgc2V0IG9mIHJlbW90ZSByZWZzOyB0aGUgcmVmIG1hdGNoZWQgPHNyYz4KKyAgICAgbG9jYWxseSBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbi4KKworV2l0aG91dCAnLS1mb3JjZScsIHRoZSA8c3JjPiByZWYgaXMgc3RvcmVkIGF0IHRoZSByZW1vdGUgb25seSBpZgorPGRzdD4gZG9lcyBub3QgZXhpc3QsIG9yIDxkc3Q+IGlzIGEgcHJvcGVyIHN1YnNldCAoaS5lLiBhbgorYW5jZXN0b3IpIG9mIDxzcmM+LiAgVGhpcyBjaGVjaywga25vd24gYXMgImZhc3QgZm9yd2FyZCBjaGVjayIsCitpcyBwZXJmb3JtZWQgaW4gb3JkZXIgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIHRoZQorcmVtb3RlIHJlZiBhbmQgbG9zZSBvdGhlciBwZW9wbGVzJyBjb21taXRzIGZyb20gdGhlcmUuCisKK1dpdGggJy0tZm9yY2UnLCB0aGUgZmFzdCBmb3J3YXJkIGNoZWNrIGlzIGRpc2FibGVkIGZvciBhbGwgcmVmcy4KKworT3B0aW9uYWxseSwgYSA8cmVmPiBwYXJhbWV0ZXIgY2FuIGJlIHByZWZpeGVkIHdpdGggYSBwbHVzICcrJyBzaWduCit0byBkaXNhYmxlIHRoZSBmYXN0LWZvcndhcmQgY2hlY2sgb25seSBvbiB0aGF0IHJlZi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNoLXNldHVwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIxN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2gtc2V0dXAudHh0CkBAIC0wLDAgKzEsMzUgQEAKK2dpdC1zaC1zZXR1cCgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaC1zZXR1cCAtIENvbW1vbiBnaXQgc2hlbGwgc2NyaXB0IHNldHVwIGNvZGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNoLXNldHVwJworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworU2V0cyB1cCB0aGUgbm9ybWFsIGdpdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMKKyhjdXJyZW50bHkganVzdCAiZGllKCkiKSwgYW5kIHJldHVybnMgT0sgaWYgaXQgYWxsIGxvb2tzIGxpa2UgYSBnaXQgYXJjaGl2ZS4KK1NvLCB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBnaXQgc2NyaXB0cyBtb3JlIGNhcmVmdWwgYW5kIHJlYWRhYmxlLAordXNlIGl0IGFzIGZvbGxvd3M6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy4gZ2l0LXNoLXNldHVwIHx8IGRpZSAiTm90IGEgZ2l0IGFyY2hpdmUiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaGVsbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0MjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXNoZWxsLnR4dApAQCAtMCwwICsxLDM1IEBACitnaXQtc2hlbGwoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc2hlbGwgLSBSZXN0cmljdGVkIGxvZ2luIHNoZWxsIGZvciBHSVQgb3ZlciBTU0ggb25seQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zaGVsbCcgLWMgPGNvbW1hbmQ+IDxhcmd1bWVudD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBsb2dpbiBzaGVsbCBmb3IgU1NIIGFjY291bnRzIHlvdSB3YW50Cit0byByZXN0cmljdCB0byBHSVQgcHVsbC9wdXNoIGFjY2VzcyBvbmx5LiBJdCBwZXJtaXRzIGV4ZWN1dGlvbiBvbmx5CitvZiBzZXJ2ZXItc2lkZSBHSVQgY29tbWFuZHMgaW1wbGVtZW50aW5nIHRoZSBwdWxsL3B1c2ggZnVuY3Rpb25hbGl0eS4KK1RoZSBjb21tYW5kcyBjYW4gYmUgZXhlY3V0ZWQgb25seSBieSB0aGUgJy1jJyBvcHRpb247IHRoZSBzaGVsbCBpcyBub3QKK2ludGVyYWN0aXZlLgorCitDdXJyZW50bHksIG9ubHkgdGhlIGBnaXQtcmVjZWl2ZS1wYWNrYCBhbmQgYGdpdC11cGxvYWQtcGFja2AgY29tbWFuZHMKK2FyZSBwZXJtaXR0ZWQgdG8gYmUgY2FsbGVkLCB3aXRoIGEgc2luZ2xlIHJlcXVpcmVkIGFyZ3VtZW50LgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvcnRsb2cudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvcnRsb2cudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODZlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG9ydGxvZy50eHQKQEAgLTAsMCArMSw0MyBAQAorZ2l0LXNob3J0bG9nKDEpCis9PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXNob3J0bG9nIC0gU3VtbWFyaXplICdnaXQgbG9nJyBvdXRwdXQKKworU1lOT1BTSVMKKy0tLS0tLS0tCitnaXQtbG9nIC0tcHJldHR5PXNob3J0IHwgJ2dpdC1zaG9ydGxvZycKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitTdW1tYXJpemVzICdnaXQgbG9nJyBvdXRwdXQgaW4gYSBmb3JtYXQgc3VpdGFibGUgZm9yIGluY2x1c2lvbgoraW4gcmVsZWFzZSBhbm5vdW5jZW1lbnRzLiBFYWNoIGNvbW1pdCB3aWxsIGJlIGdyb3VwZWQgYnkgYXV0aG9yCit0aGUgZmlyc3QgbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2Ugd2lsbCBiZSBzaG93bi4KKworQWRkaXRpb25hbGx5LCAiW1BBVENIXSIgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBjb21taXQgZGVzY3JpcHRpb24uCisKK0ZJTEVTCistLS0tLQorJy5tYWlsbWFwJzo6CisJSWYgdGhpcyBmaWxlIGV4aXN0cywgaXQgd2lsbCBiZSB1c2VkIGZvciBtYXBwaW5nIGF1dGhvciBlbWFpbAorCWFkZHJlc3NlcyB0byBhIHJlYWwgYXV0aG9yIG5hbWUuIE9uZSBtYXBwaW5nIHBlciBsaW5lLCBmaXJzdAorCXRoZSBhdXRob3IgbmFtZSBmb2xsb3dlZCBieSB0aGUgZW1haWwgYWRkcmVzcyBlbmNsb3NlZCBieQorCSc8JyBhbmQgJz4nLiBVc2UgaGFzaCAnIycgZm9yIGNvbW1lbnRzLiBFeGFtcGxlOgorCisJCSMgS2VlcCBhbHBoYWJldGl6ZWQKKwkJQWRhbSBNb3Jyb3cgPGFkYW1AbG9jYWxob3N0LmxvY2FsZG9tYWluPgorCQlFdmUgSm9uZXMgPGV2ZUBsYXB0b3AuKG5vbmUpPgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1icmFuY2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1icmFuY2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNDQ1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWJyYW5jaC50eHQKQEAgLTAsMCArMSwxNjcgQEAKK2dpdC1zaG93LWJyYW5jaCgxKQorPT09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93LWJyYW5jaCAtIFNob3cgYnJhbmNoZXMgYW5kIHRoZWlyIGNvbW1pdHMKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisnZ2l0LXNob3ctYnJhbmNoJyBbLS1hbGxdIFstLWhlYWRzXSBbLS10YWdzXSBbLS10b3BvLW9yZGVyXSBbLS1jdXJyZW50XQorCQlbLS1tb3JlPTxuPiB8IC0tbGlzdCB8IC0taW5kZXBlbmRlbnQgfCAtLW1lcmdlLWJhc2VdCisJCVstLW5vLW5hbWUgfCAtLXNoYTEtbmFtZV0gWzxyZXY+IHwgPGdsb2I+XS4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KKworU2hvd3MgdGhlIGNvbW1pdCBhbmNlc3RyeSBncmFwaCBzdGFydGluZyBmcm9tIHRoZSBjb21taXRzIG5hbWVkCit3aXRoIDxyZXY+cyBvciA8Z2xvYnM+cyAob3IgYWxsIHJlZnMgdW5kZXIgJEdJVF9ESVIvcmVmcy9oZWFkcworYW5kL29yICRHSVRfRElSL3JlZnMvdGFncykgc2VtaS12aXN1YWxseS4KKworSXQgY2Fubm90IHNob3cgbW9yZSB0aGFuIDI5IGJyYW5jaGVzIGFuZCBjb21taXRzIGF0IGEgdGltZS4KKworSXQgdXNlcyBgc2hvd2JyYW5jaC5kZWZhdWx0YCBtdWx0aS12YWx1ZWQgY29uZmlndXJhdGlvbiBpdGVtcyBpZgorbm8gPHJldj4gbm9yIDxnbG9iPiBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxyZXY+OjoKKwlBcmJpdHJhcnkgZXh0ZW5kZWQgU0hBMSBleHByZXNzaW9uIChzZWUgYGdpdC1yZXYtcGFyc2VgKQorCXRoYXQgdHlwaWNhbGx5IG5hbWVzIGEgYnJhbmNoIEhFQUQgb3IgYSB0YWcuCisKKzxnbG9iPjo6CisJQSBnbG9iIHBhdHRlcm4gdGhhdCBtYXRjaGVzIGJyYW5jaCBvciB0YWcgbmFtZXMgdW5kZXIKKwkkR0lUX0RJUi9yZWZzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIG1hbnkgdG9waWMKKwlicmFuY2hlcyB1bmRlciAkR0lUX0RJUi9yZWZzL2hlYWRzL3RvcGljLCBnaXZpbmcKKwlgdG9waWMvKmAgd291bGQgc2hvdyBhbGwgb2YgdGhlbS4KKworLS1hbGwgLS1oZWFkcyAtLXRhZ3M6OgorCVNob3cgYWxsIHJlZnMgdW5kZXIgJEdJVF9ESVIvcmVmcywgJEdJVF9ESVIvcmVmcy9oZWFkcywKKwlhbmQgJEdJVF9ESVIvcmVmcy90YWdzLCByZXNwZWN0aXZlbHkuCisKKy0tY3VycmVudDo6CisJV2l0aCB0aGlzIG9wdGlvbiwgdGhlIGNvbW1hbmQgaW5jbHVkZXMgdGhlIGN1cnJlbnQKKwlicmFuY2ggdG8gdGhlIGxpc3Qgb2YgcmV2cyB0byBiZSBzaG93biB3aGVuIGl0IGlzIG5vdAorCWdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKy0tdG9wby1vcmRlcjo6CisgICAgICAgIEJ5IGRlZmF1bHQsIHRoZSBicmFuY2hlcyBhbmQgdGhlaXIgY29tbWl0cyBhcmUgc2hvd24gaW4KKyAgICAgICAgcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlbQorICAgICAgICBhcHBlYXIgaW4gdG9wb2xvZ2ljYWwgb3JkZXIgKGkuZS4sIGRlc2NlbmRhbnQgY29tbWl0cworICAgICAgICBhcmUgc2hvd24gYmVmb3JlIHRoZWlyIHBhcmVudHMpLgorCistLXNwYXJzZTo6CisJQnkgZGVmYXVsdCwgdGhlIG91dHB1dCBvbWl0cyBtZXJnZXMgdGhhdCBhcmUgcmVhY2hhYmxlCisJZnJvbSBvbmx5IG9uZSB0aXAgYmVpbmcgc2hvd24uICBUaGlzIG9wdGlvbiBtYWtlcyB0aGVtCisJdmlzaWJsZS4KKworLS1tb3JlPTxuPjo6CisJVXN1YWxseSB0aGUgY29tbWFuZCBzdG9wcyBvdXRwdXQgdXBvbiBzaG93aW5nIHRoZSBjb21taXQKKwl0aGF0IGlzIHRoZSBjb21tb24gYW5jZXN0b3Igb2YgYWxsIHRoZSBicmFuY2hlcy4gIFRoaXMKKwlmbGFnIHRlbGxzIHRoZSBjb21tYW5kIHRvIGdvIDxuPiBtb3JlIGNvbW1vbiBjb21taXRzCisJYmV5b25kIHRoYXQuICBXaGVuIDxuPiBpcyBuZWdhdGl2ZSwgZGlzcGxheSBvbmx5IHRoZQorCTxyZWZlcmVuY2U+cyBnaXZlbiwgd2l0aG91dCBzaG93aW5nIHRoZSBjb21taXQgYW5jZXN0cnkKKwl0cmVlLgorCistLWxpc3Q6OgorCVN5bm9ueW0gdG8gYC0tbW9yZT0tMWAKKworLS1tZXJnZS1iYXNlOjoKKwlJbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGNvbW1pdCBsaXN0LCBqdXN0IGFjdCBsaWtlIHRoZQorCSdnaXQtbWVyZ2UtYmFzZSAtYScgY29tbWFuZCwgZXhjZXB0IHRoYXQgaXQgY2FuIGFjY2VwdAorCW1vcmUgdGhhbiB0d28gaGVhZHMuCisKKy0taW5kZXBlbmRlbnQ6OgorCUFtb25nIHRoZSA8cmVmZXJlbmNlPnMgZ2l2ZW4sIGRpc3BsYXkgb25seSB0aGUgb25lcyB0aGF0CisJY2Fubm90IGJlIHJlYWNoZWQgZnJvbSBhbnkgb3RoZXIgPHJlZmVyZW5jZT4uCisKKy0tbm8tbmFtZTo6CisJRG8gbm90IHNob3cgbmFtaW5nIHN0cmluZ3MgZm9yIGVhY2ggY29tbWl0LgorCistLXNoYTEtbmFtZTo6CisJSW5zdGVhZCBvZiBuYW1pbmcgdGhlIGNvbW1pdHMgdXNpbmcgdGhlIHBhdGggdG8gcmVhY2gKKwl0aGVtIGZyb20gaGVhZHMgKGUuZy4gIm1hc3Rlcn4yIiB0byBtZWFuIHRoZSBncmFuZHBhcmVudAorCW9mICJtYXN0ZXIiKSwgbmFtZSB0aGVtIHdpdGggdGhlIHVuaXF1ZSBwcmVmaXggb2YgdGhlaXIKKwlvYmplY3QgbmFtZXMuCisKK05vdGUgdGhhdCAtLW1vcmUsIC0tbGlzdCwgLS1pbmRlcGVuZGVudCBhbmQgLS1tZXJnZS1iYXNlIG9wdGlvbnMKK2FyZSBtdXR1YWxseSBleGNsdXNpdmUuCisKKworT1VUUFVUCistLS0tLS0KK0dpdmVuIE4gPHJlZmVyZW5jZXM+LCB0aGUgZmlyc3QgTiBsaW5lcyBhcmUgdGhlIG9uZS1saW5lCitkZXNjcmlwdGlvbiBmcm9tIHRoZWlyIGNvbW1pdCBtZXNzYWdlLiAgVGhlIGJyYW5jaCBoZWFkIHRoYXQgaXMKK3BvaW50ZWQgYXQgYnkgJEdJVF9ESVIvSEVBRCBpcyBwcmVmaXhlZCB3aXRoIGFuIGFzdGVyaXNrIGAqYAorY2hhcmFjdGVyIHdoaWxlIG90aGVyIGhlYWRzIGFyZSBwcmVmaXhlZCB3aXRoIGEgYCFgIGNoYXJhY3Rlci4KKworRm9sbG93aW5nIHRoZXNlIE4gbGluZXMsIG9uZS1saW5lIGxvZyBmb3IgZWFjaCBjb21taXQgaXMKK2Rpc3BsYXllZCwgaW5kZW50ZWQgTiBwbGFjZXMuICBJZiBhIGNvbW1pdCBpcyBvbiB0aGUgSS10aAorYnJhbmNoLCB0aGUgSS10aCBpbmRlbnRhdGlvbiBjaGFyYWN0ZXIgc2hvd3MgYSBgK2Agc2lnbjsKK290aGVyd2lzZSBpdCBzaG93cyBhIHNwYWNlLiAgTWVyZ2UgY29tbWl0cyBhcmUgZGVub3RlZCBieQorYSBgLWAgc2lnbi4gIEVhY2ggY29tbWl0IHNob3dzIGEgc2hvcnQgbmFtZSB0aGF0CitjYW4gYmUgdXNlZCBhcyBhbiBleHRlbmRlZCBTSEExIHRvIG5hbWUgdGhhdCBjb21taXQuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aHJlZSBicmFuY2hlcywgIm1hc3RlciIsICJmaXhlcyIKK2FuZCAibWhmIjoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93LWJyYW5jaCBtYXN0ZXIgZml4ZXMgbWhmCisqIFttYXN0ZXJdIEFkZCAnZ2l0IHNob3ctYnJhbmNoJy4KKyAhIFtmaXhlc10gSW50cm9kdWNlICJyZXNldCB0eXBlIiBmbGFnIHRvICJnaXQgcmVzZXQiCisgICEgW21oZl0gQWxsb3cgIityZW1vdGU6bG9jYWwiIHJlZnNwZWMgdG8gY2F1c2UgLS1mb3JjZSB3aGVuIGZldGNoaW5nLgorLS0tCisgICsgW21oZl0gQWxsb3cgIityZW1vdGU6bG9jYWwiIHJlZnNwZWMgdG8gY2F1c2UgLS1mb3JjZSB3aGVuIGZldGNoaW5nLgorICArIFttaGZ+MV0gVXNlIGdpdC1vY3RvcHVzIHdoZW4gcHVsbGluZyBtb3JlIHRoYW4gb25lIGhlYWRzLgorICsgIFtmaXhlc10gSW50cm9kdWNlICJyZXNldCB0eXBlIiBmbGFnIHRvICJnaXQgcmVzZXQiCisgICsgW21oZn4yXSAiZ2l0IGZldGNoIC0tZm9yY2UiLgorICArIFttaGZ+M10gVXNlIC5naXQvcmVtb3RlL29yaWdpbiwgbm90IC5naXQvYnJhbmNoZXMvb3JpZ2luLgorICArIFttaGZ+NF0gTWFrZSAiZ2l0IHB1bGwiIGFuZCAiZ2l0IGZldGNoIiBkZWZhdWx0IHRvIG9yaWdpbgorICArIFttaGZ+NV0gSW5mYW1vdXMgJ29jdG9wdXMgbWVyZ2UnCisgICsgW21oZn42XSBSZXRpcmUgZ2l0LXBhcnNlLXJlbW90ZS4KKyAgKyBbbWhmfjddIE11bHRpLWhlYWQgZmV0Y2guCisgICsgW21oZn44XSBTdGFydCBhZGRpbmcgdGhlICRHSVRfRElSL3JlbW90ZXMvIHN1cHBvcnQuCisqKysgW21hc3Rlcl0gQWRkICdnaXQgc2hvdy1icmFuY2gnLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXNlIHRocmVlIGJyYW5jaGVzIGFsbCBmb3JrZWQgZnJvbSBhIGNvbW1vbiBjb21taXQsIFttYXN0ZXJdLAord2hvc2UgY29tbWl0IG1lc3NhZ2UgaXMgIkFkZCAnZ2l0IHNob3ctYnJhbmNoJy4gICJmaXhlcyIgYnJhbmNoCithZGRzIG9uZSBjb21taXQgJ0ludHJvZHVjZSAicmVzZXQgdHlwZSInLiAgIm1oZiIgYnJhbmNoIGhhcyBtYW55CitvdGhlciBjb21taXRzLiAgVGhlIGN1cnJlbnQgYnJhbmNoIGlzICJtYXN0ZXIiLgorCisKK0VYQU1QTEUKKy0tLS0tLS0KKworSWYgeW91IGtlZXAgeW91ciBwcmltYXJ5IGJyYW5jaGVzIGltbWVkaWF0ZWx5IHVuZGVyCitgJEdJVF9ESVIvcmVmcy9oZWFkc2AsIGFuZCB0b3BpYyBicmFuY2hlcyBpbiBzdWJkaXJlY3RvcmllcyBvZgoraXQsIGhhdmluZyB0aGUgZm9sbG93aW5nIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbWF5IGhlbHA6CisKKy0tLS0tLS0tLS0tLQorW3Nob3dicmFuY2hdCisJZGVmYXVsdCA9IC0tdG9wby1vcmRlcgorCWRlZmF1bHQgPSBoZWFkcy8qCisKKy0tLS0tLS0tLS0tLQorCitXaXRoIHRoaXMsIGBnaXQgc2hvdy1icmFuY2hgIHdpdGhvdXQgZXh0cmEgcGFyYW1ldGVycyB3b3VsZCBzaG93Citvbmx5IHRoZSBwcmltYXJ5IGJyYW5jaGVzLiAgSW4gYWRkaXRpb24sIGlmIHlvdSBoYXBwZW4gdG8gYmUgb24KK3lvdXIgdG9waWMgYnJhbmNoLCBpdCBpcyBzaG93biBhcyB3ZWxsLgorCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA5YjYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy1pbmRleC50eHQKQEAgLTAsMCArMSwzNSBAQAorZ2l0LXNob3ctaW5kZXgoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93LWluZGV4IC0gU2hvdyBwYWNrZWQgYXJjaGl2ZSBpbmRleAorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zaG93LWluZGV4JyA8IGlkeC1maWxlCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkcyBnaXZlbiBpZHggZmlsZSBmb3IgcGFja2VkIGdpdCBhcmNoaXZlIGNyZWF0ZWQgd2l0aAorZ2l0LXBhY2stb2JqZWN0cyBjb21tYW5kLCBhbmQgZHVtcHMgaXRzIGNvbnRlbnRzLgorCitUaGUgaW5mb3JtYXRpb24gaXQgb3V0cHV0cyBpcyBzdWJzZXQgb2Ygd2hhdCB5b3UgY2FuIGdldCBmcm9tCisnZ2l0LXZlcmlmeS1wYWNrIC12JzsgdGhpcyBjb21tYW5kIG9ubHkgc2hvd3MgdGhlIHBhY2tmaWxlCitvZmZzZXQgYW5kIFNIQTEgb2YgZWFjaCBvYmplY3QuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zaG93LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRkZjNmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc2hvdy50eHQKQEAgLTAsMCArMSw0OSBAQAorZ2l0LXNob3coMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zaG93IC0gU2hvdyBvbmUgY29tbWl0IHdpdGggZGlmZmVyZW5jZSBpdCBpbnRyb2R1Y2VzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNob3cnIDxvcHRpb24+Li4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorU2hvd3MgY29tbWl0IGxvZyBhbmQgdGV4dHVhbCBkaWZmIGZvciBhIHNpbmdsZSBjb21taXQuICBUaGUKK2NvbW1hbmQgaW50ZXJuYWxseSBpbnZva2VzICdnaXQtcmV2LWxpc3QnIHBpcGVkIHRvCisnZ2l0LWRpZmYtdHJlZScsIGFuZCB0YWtlcyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgYm90aCBvZgordGhlc2UgY29tbWFuZHMuIEl0IGFsc28gcHJlc2VudHMgdGhlIG1lcmdlIGNvbW1pdCBpbiBhIHNwZWNpYWwKK2Zvcm1hdCBhcyBwcm9kdWNlZCBieSAnZ2l0LWRpZmYtdHJlZSAtLWNjJy4KKworVGhpcyBtYW51YWwgcGFnZSBkZXNjcmliZXMgb25seSB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb3B0aW9ucy4KKworCitPUFRJT05TCistLS0tLS0tCis8Y29tbWl0aWQ+OjoKKwlJRCBvZiB0aGUgY29tbWl0IHRvIHNob3cuCisKKy0tcHJldHR5PTxmb3JtYXQ+OjoKKwlDb250cm9scyB0aGUgb3V0cHV0IGZvcm1hdCBmb3IgdGhlIGNvbW1pdCBsb2dzLgorCTxmb3JtYXQ+IGNhbiBiZSBvbmUgb2YgJ3JhdycsICdtZWRpdW0nLCAnc2hvcnQnLCAnZnVsbCcsCisJYW5kICdvbmVsaW5lJy4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIFBldHIgQmF1ZGlzIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitUaGlzIG1hbnVhbCBwYWdlIGlzIGEgc3R1Yi4gWW91IGNhbiBoZWxwIHRoZSBnaXQgZG9jdW1lbnRhdGlvbiBieSBleHBhbmRpbmcgaXQuCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtZmV0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLWZldGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzExNmIzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLWZldGNoLnR4dApAQCAtMCwwICsxLDUxIEBACitnaXQtc3NoLWZldGNoKDEpCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zc2gtZmV0Y2ggLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXNzaC1mZXRjaCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstdyBmaWxlbmFtZV0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1B1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uLCBpbnZva2luZworZ2l0LXNzaC11cGxvYWQgb24gdGhlIG90aGVyIGVuZC4gSXQgZnVuY3Rpb25zIGlkZW50aWNhbGx5IHRvCitnaXQtc3NoLXVwbG9hZCwgYXNpZGUgZnJvbSB3aGljaCBlbmQgeW91IHJ1biBpdCBvbi4KKworCitPUFRJT05TCistLS0tLS0tCitjb21taXQtaWQ6OgorICAgICAgICBFaXRoZXIgdGhlIGhhc2ggb3IgdGhlIGZpbGVuYW1lIHVuZGVyIFtVUkxdL3JlZnMvIHRvCisgICAgICAgIHB1bGwuCisKKy1jOjoKKwlHZXQgdGhlIGNvbW1pdCBvYmplY3RzLgorLXQ6OgorCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLWE6OgorCUdldCBhbGwgdGhlIG9iamVjdHMuCistdjo6CisJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKy13OjoKKyAgICAgICAgV3JpdGVzIHRoZSBjb21taXQtaWQgaW50byB0aGUgZmlsZW5hbWUgdW5kZXIgJEdJVF9ESVIvcmVmcy8gb24KKyAgICAgICAgdGhlIGxvY2FsIGVuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgRGFuaWVsIEJhcmthbG93IDxiYXJrYWxvd0BpYWJlcnZvbi5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXVwbG9hZC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtdXBsb2FkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDI2NzRlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXVwbG9hZC50eHQKQEAgLTAsMCArMSw0NyBAQAorZ2l0LXNzaC11cGxvYWQoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zc2gtdXBsb2FkIC0gUHVzaGVzIHRvIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zc2gtdXBsb2FkJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy13IGZpbGVuYW1lXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUHVzaGVzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uLCBpbnZva2luZworZ2l0LXNzaC1mZXRjaCBvbiB0aGUgb3RoZXIgZW5kLiBJdCBmdW5jdGlvbnMgaWRlbnRpY2FsbHkgdG8KK2dpdC1zc2gtZmV0Y2gsIGFzaWRlIGZyb20gd2hpY2ggZW5kIHlvdSBydW4gaXQgb24uCisKK09QVElPTlMKKy0tLS0tLS0KK2NvbW1pdC1pZDo6CisgICAgICAgIElkIG9mIGNvbW1pdCB0byBwdXNoLgorCistYzo6CisgICAgICAgIEdldCB0aGUgY29tbWl0IG9iamVjdHMuCistdDo6CisgICAgICAgIEdldCB0cmVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIGNvbW1pdCBvYmplY3QuCistYTo6CisgICAgICAgIEdldCBhbGwgdGhlIG9iamVjdHMuCistdjo6CisgICAgICAgIFJlcG9ydCB3aGF0IGlzIHVwbG9hZGVkLgorLXc6OgorICAgICAgICBXcml0ZXMgdGhlIGNvbW1pdC1pZCBpbnRvIHRoZSBmaWxlbmFtZSB1bmRlciBbVVJMXS9yZWZzLyBvbgorICAgICAgICB0aGUgcmVtb3RlIGVuZCBhZnRlciB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IERhbmllbCBCYXJrYWxvdyA8YmFya2Fsb3dAaWFiZXJ2b24ub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYW5pZWwgQmFya2Fsb3cKKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXN0YXR1cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdGF0dXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzg1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdGF0dXMudHh0CkBAIC0wLDAgKzEsNDkgQEAKK2dpdC1zdGF0dXMoMSkKKz09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXN0YXR1cyAtIFNob3cgd29ya2luZyB0cmVlIHN0YXR1cworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zdGF0dXMnIDxvcHRpb25zPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0V4YW1pbmVzIHBhdGhzIGluIHRoZSB3b3JraW5nIHRyZWUgdGhhdCBoYXMgY2hhbmdlcyB1bnJlY29yZGVkCit0byB0aGUgaW5kZXggZmlsZSwgYW5kIGNoYW5nZXMgYmV0d2VlbiB0aGUgaW5kZXggZmlsZSBhbmQgdGhlCitjdXJyZW50IEhFQUQgY29tbWl0LiAgVGhlIGZvcm1lciBwYXRocyBhcmUgd2hhdCB5b3UgX2NvdWxkXworY29tbWl0IGJ5IHJ1bm5pbmcgJ2dpdC11cGRhdGUtaW5kZXgnIGJlZm9yZSBydW5uaW5nICdnaXQKK2NvbW1pdCcsIGFuZCB0aGUgbGF0dGVyIHBhdGhzIGFyZSB3aGF0IHlvdSBfd291bGRfIGNvbW1pdCBieQorcnVubmluZyAnZ2l0IGNvbW1pdCcuCisKK0lmIHRoZXJlIGlzIG5vIHBhdGggdGhhdCBpcyBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgaW5kZXggZmlsZSBhbmQKK3RoZSBjdXJyZW50IEhFQUQgY29tbWl0LCB0aGUgY29tbWFuZCBleGl0cyB3aXRoIG5vbi16ZXJvCitzdGF0dXMuCisKK1RoZSBjb21tYW5kIHRha2VzIHRoZSBzYW1lIHNldCBvZiBvcHRpb25zIGFzIGBnaXQtY29tbWl0YDsgaXQKK3Nob3dzIHdoYXQgd291bGQgYmUgY29tbWl0dGVkIGlmIHRoZSBzYW1lIG9wdGlvbnMgYXJlIGdpdmVuIHRvCitgZ2l0LWNvbW1pdGAuCisKKworT1VUUFVUCistLS0tLS0KK1RoZSBvdXRwdXQgZnJvbSB0aGlzIGNvbW1hbmQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBhcyBhIGNvbW1pdAordGVtcGxhdGUgY29tbWVudHMsIGFuZCBhbGwgdGhlIG91dHB1dCBsaW5lcyBhcmUgcHJlZml4ZWQgd2l0aCAnIycuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiBhbmQKK0p1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3RyaXBzcGFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zdHJpcHNwYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAzZGQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3RyaXBzcGFjZS50eHQKQEAgLTAsMCArMSwzMyBAQAorZ2l0LXN0cmlwc3BhY2UoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC1zdHJpcHNwYWNlIC0gRmlsdGVyIG91dCBlbXB0eSBsaW5lcworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zdHJpcHNwYWNlJyA8IDxzdHJlYW0+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUmVtb3ZlIG11bHRpcGxlIGVtcHR5IGxpbmVzLCBhbmQgZW1wdHkgbGluZXMgYXQgYmVnaW5uaW5nIGFuZCBlbmQuCisKK09QVElPTlMKKy0tLS0tLS0KKzxzdHJlYW0+OjoKKwlCeXRlIHN0cmVhbSB0byBhY3Qgb24uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1zdm4udHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3ZuLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDg2ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3ZuLnR4dApAQCAtMCwwICsxLDMxOSBAQAorZ2l0LXN2bigxKQorPT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3ZuIC0gYmlkaXJlY3Rpb25hbCBvcGVyYXRpb24gYmV0d2VlbiBhIHNpbmdsZSBTdWJ2ZXJzaW9uIGJyYW5jaCBhbmQgZ2l0CisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC1zdm4nIDxjb21tYW5kPiBbb3B0aW9uc10gW2FyZ3VtZW50c10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitnaXQtc3ZuIGlzIGEgc2ltcGxlIGNvbmR1aXQgZm9yIGNoYW5nZXNldHMgYmV0d2VlbiBhIHNpbmdsZSBTdWJ2ZXJzaW9uCiticmFuY2ggYW5kIGdpdC4KKworZ2l0LXN2biBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBnaXQtc3ZuaW1wb3J0LiAgVGhlIHdlcmUgZGVzaWduZWQKK3dpdGggdmVyeSBkaWZmZXJlbnQgZ29hbHMgaW4gbWluZC4KKworZ2l0LXN2biBpcyBkZXNpZ25lZCBmb3IgYW4gaW5kaXZpZHVhbCBkZXZlbG9wZXIgd2hvIHdhbnRzIGEKK2JpZGlyZWN0aW9uYWwgZmxvdyBvZiBjaGFuZ2VzZXRzIGJldHdlZW4gYSBzaW5nbGUgYnJhbmNoIGluIFN1YnZlcnNpb24KK2FuZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGJyYW5jaGVzIGluIGdpdC4gIGdpdC1zdm5pbXBvcnQgaXMgZGVzaWduZWQKK2ZvciByZWFkLW9ubHkgb3BlcmF0aW9uIG9uIHJlcG9zaXRvcmllcyB0aGF0IG1hdGNoIGEgcGFydGljdWxhciBsYXlvdXQKKyhhbGJlaXQgdGhlIHJlY29tbWVuZGVkIG9uZSBieSBTVk4gZGV2ZWxvcGVycykuCisKK0ZvciBpbXBvcnRpbmcgc3ZuLCBnaXQtc3ZuaW1wb3J0IGlzIHBvdGVudGlhbGx5IG1vcmUgcG93ZXJmdWwgd2hlbgorb3BlcmF0aW5nIG9uIHJlcG9zaXRvcmllcyBvcmdhbml6ZWQgdW5kZXIgdGhlIHJlY29tbWVuZGVkCit0cnVuay9icmFuY2gvdGFncyBzdHJ1Y3R1cmUsIGFuZCBzaG91bGQgYmUgZmFzdGVyLCB0b28uCisKK2dpdC1zdm4gbW9zdGx5IGlnbm9yZXMgdGhlIHZlcnkgbGltaXRlZCB2aWV3IG9mIGJyYW5jaGluZyB0aGF0CitTdWJ2ZXJzaW9uIGhhcy4gIFRoaXMgYWxsb3dzIGdpdC1zdm4gdG8gYmUgbXVjaCBlYXNpZXIgdG8gdXNlLAorZXNwZWNpYWxseSBvbiByZXBvc2l0b3JpZXMgdGhhdCBhcmUgbm90IG9yZ2FuaXplZCBpbiBhIG1hbm5lciB0aGF0CitnaXQtc3ZuaW1wb3J0IGlzIGRlc2lnbmVkIGZvci4KKworQ09NTUFORFMKKy0tLS0tLS0tCitpbml0OjoKKwlDcmVhdGVzIGFuIGVtcHR5IGdpdCByZXBvc2l0b3J5IHdpdGggYWRkaXRpb25hbCBtZXRhZGF0YQorCWRpcmVjdG9yaWVzIGZvciBnaXQtc3ZuLiAgVGhlIFN1YnZlcnNpb24gVVJMIG11c3QgYmUgc3BlY2lmaWVkCisJYXMgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQuCisKK2ZldGNoOjoKKwlGZXRjaCB1bmZldGNoZWQgcmV2aXNpb25zIGZyb20gdGhlIFN1YnZlcnNpb24gVVJMIHdlIGFyZQorCXRyYWNraW5nLiAgcmVmcy9yZW1vdGVzL2dpdC1zdm4gd2lsbCBiZSB1cGRhdGVkIHRvIHRoZQorCWxhdGVzdCByZXZpc2lvbi4KKworCU5vdGU6IFlvdSBzaG91bGQgbmV2ZXIgYXR0ZW1wdCB0byBtb2RpZnkgdGhlIHJlbW90ZXMvZ2l0LXN2bgorCWJyYW5jaCBvdXRzaWRlIG9mIGdpdC1zdm4uICBJbnN0ZWFkLCBjcmVhdGUgYSBicmFuY2ggZnJvbQorCXJlbW90ZXMvZ2l0LXN2biBhbmQgd29yayBvbiB0aGF0IGJyYW5jaC4gIFVzZSB0aGUgJ2NvbW1pdCcKKwljb21tYW5kIChzZWUgYmVsb3cpIHRvIHdyaXRlIGdpdCBjb21taXRzIGJhY2sgdG8KKwlyZW1vdGVzL2dpdC1zdm4uCisKKwlTZWUgJ0FkZGl0aW9uYWwgRmV0Y2ggQXJndW1lbnRzJyBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4KKwltYW51YWxseSBqb2luaW5nIGJyYW5jaGVzIG9uIGNvbW1pdC4KKworY29tbWl0OjoKKwlDb21taXQgc3BlY2lmaWVkIGNvbW1pdCBvciB0cmVlIG9iamVjdHMgdG8gU1ZOLiAgVGhpcyByZWxpZXMgb24KKwl5b3VyIGltcG9ydGVkIGZldGNoIGRhdGEgYmVpbmcgdXAtdG8tZGF0ZS4gIFRoaXMgbWFrZXMKKwlhYnNvbHV0ZWx5IG5vIGF0dGVtcHRzIHRvIGRvIHBhdGNoaW5nIHdoZW4gY29tbWl0dGluZyB0byBTVk4sIGl0CisJc2ltcGx5IG92ZXJ3cml0ZXMgZmlsZXMgd2l0aCB0aG9zZSBzcGVjaWZpZWQgaW4gdGhlIHRyZWUgb3IKKwljb21taXQuICBBbGwgbWVyZ2luZyBpcyBhc3N1bWVkIHRvIGhhdmUgdGFrZW4gcGxhY2UKKwlpbmRlcGVuZGVudGx5IG9mIGdpdC1zdm4gZnVuY3Rpb25zLgorCityZWJ1aWxkOjoKKwlOb3QgYSBwYXJ0IG9mIGRhaWx5IHVzYWdlLCBidXQgdGhpcyBpcyBhIHVzZWZ1bCBjb21tYW5kIGlmCisJeW91J3ZlIGp1c3QgY2xvbmVkIGEgcmVwb3NpdG9yeSAodXNpbmcgZ2l0LWNsb25lKSB0aGF0IHdhcworCXRyYWNrZWQgd2l0aCBnaXQtc3ZuLiAgVW5mb3J0dW5hdGVseSwgZ2l0LWNsb25lIGRvZXMgbm90IGNsb25lCisJZ2l0LXN2biBtZXRhZGF0YSBhbmQgdGhlIHN2biB3b3JraW5nIHRyZWUgdGhhdCBnaXQtc3ZuIHVzZXMgZm9yCisJaXRzIG9wZXJhdGlvbnMuICBUaGlzIHJlYnVpbGRzIHRoZSBtZXRhZGF0YSBzbyBnaXQtc3ZuIGNhbgorCXJlc3VtZSBmZXRjaCBvcGVyYXRpb25zLiAgQSBTdWJ2ZXJzaW9uIFVSTCBtYXkgYmUgb3B0aW9uYWxseQorCXNwZWNpZmllZCBhdCB0aGUgY29tbWFuZC1saW5lIGlmIHRoZSBkaXJlY3RvcnkvcmVwb3NpdG9yeSB5b3UncmUKKwl0cmFja2luZyBoYXMgbW92ZWQgb3IgY2hhbmdlZCBwcm90b2NvbHMuCisKK3Nob3ctaWdub3JlOjoKKwlSZWN1cnNpdmVseSBmaW5kcyBhbmQgbGlzdHMgdGhlIHN2bjppZ25vcmUgcHJvcGVydHkgb24KKwlkaXJlY3Rvcmllcy4gIFRoZSBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIGFwcGVuZGluZyB0bworCXRoZSAkR0lUX0RJUi9pbmZvL2V4Y2x1ZGUgZmlsZS4KKworT1BUSU9OUworLS0tLS0tLQorLXIgPEFSRz46OgorLS1yZXZpc2lvbiA8QVJHPjo6CisJT25seSB1c2VkIHdpdGggdGhlICdmZXRjaCcgY29tbWFuZC4KKworCVRha2VzIGFueSB2YWxpZCAtcjxhcmd1bWVudD4gc3ZuIHdvdWxkIGFjY2VwdCBhbmQgcGFzc2VzIGl0CisJZGlyZWN0bHkgdG8gc3ZuLiAtcjxBUkcxPjo8QVJHMj4gcmFuZ2VzIGFuZCAieyIgREFURSAifSIgc3ludGF4CisJaXMgYWxzbyBzdXBwb3J0ZWQuICBUaGlzIGlzIHBhc3NlZCBkaXJlY3RseSB0byBzdm4sIHNlZSBzdm4KKwlkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCisKKwlUaGlzIGNhbiBhbGxvdyB5b3UgdG8gbWFrZSBwYXJ0aWFsIG1pcnJvcnMgd2hlbiBydW5uaW5nIGZldGNoLgorCistOjoKKy0tc3RkaW46OgorCU9ubHkgdXNlZCB3aXRoIHRoZSAnY29tbWl0JyBjb21tYW5kLgorCisJUmVhZCBhIGxpc3Qgb2YgY29tbWl0cyBmcm9tIHN0ZGluIGFuZCBjb21taXQgdGhlbSBpbiByZXZlcnNlCisJb3JkZXIuICBPbmx5IHRoZSBsZWFkaW5nIHNoYTEgaXMgcmVhZCBmcm9tIGVhY2ggbGluZSwgc28KKwlnaXQtcmV2LWxpc3QgLS1wcmV0dHk9b25lbGluZSBvdXRwdXQgY2FuIGJlIHVzZWQuCisKKy0tcm1kaXI6OgorCU9ubHkgdXNlZCB3aXRoIHRoZSAnY29tbWl0JyBjb21tYW5kLgorCisJUmVtb3ZlIGRpcmVjdG9yaWVzIGZyb20gdGhlIFNWTiB0cmVlIGlmIHRoZXJlIGFyZSBubyBmaWxlcyBsZWZ0CisJYmVoaW5kLiAgU1ZOIGNhbiB2ZXJzaW9uIGVtcHR5IGRpcmVjdG9yaWVzLCBhbmQgdGhleSBhcmUgbm90CisJcmVtb3ZlZCBieSBkZWZhdWx0IGlmIHRoZXJlIGFyZSBubyBmaWxlcyBsZWZ0IGluIHRoZW0uICBnaXQKKwljYW5ub3QgdmVyc2lvbiBlbXB0eSBkaXJlY3Rvcmllcy4gIEVuYWJsaW5nIHRoaXMgZmxhZyB3aWxsIG1ha2UKKwl0aGUgY29tbWl0IHRvIFNWTiBhY3QgbGlrZSBnaXQuCisKKwlyZXBvLWNvbmZpZyBrZXk6IHN2bi5ybWRpcgorCistZTo6CistLWVkaXQ6OgorCU9ubHkgdXNlZCB3aXRoIHRoZSAnY29tbWl0JyBjb21tYW5kLgorCisJRWRpdCB0aGUgY29tbWl0IG1lc3NhZ2UgYmVmb3JlIGNvbW1pdHRpbmcgdG8gU1ZOLiAgVGhpcyBpcyBvZmYgYnkKKwlkZWZhdWx0IGZvciBvYmplY3RzIHRoYXQgYXJlIGNvbW1pdHMsIGFuZCBmb3JjZWQgb24gd2hlbiBjb21taXR0aW5nCisJdHJlZSBvYmplY3RzLgorCisJcmVwby1jb25maWcga2V5OiBzdm4uZWRpdAorCistbDxudW0+OjoKKy0tZmluZC1jb3BpZXMtaGFyZGVyOjoKKwlCb3RoIG9mIHRoZXNlIGFyZSBvbmx5IHVzZWQgd2l0aCB0aGUgJ2NvbW1pdCcgY29tbWFuZC4KKworCVRoZXkgYXJlIGJvdGggcGFzc2VkIGRpcmVjdGx5IHRvIGdpdC1kaWZmLXRyZWUgc2VlCisJZ2l0LWRpZmYtdHJlZSgxKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCXJlcG8tY29uZmlnIGtleTogc3ZuLmwKKwlyZXBvLWNvbmZpZyBrZXk6IHN2bi5maW5kY29waWVzaGFyZGVyCisKKy1BPGZpbGVuYW1lPjo6CistLWF1dGhvcnMtZmlsZT08ZmlsZW5hbWU+OjoKKworCVN5bnRheCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGZpbGVzIHVzZWQgYnkgZ2l0LXN2bmltcG9ydCBhbmQKKwlnaXQtY3ZzaW1wb3J0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xvZ2lubmFtZSA9IEpvZSBVc2VyIDx1c2VyQGV4YW1wbGUuY29tPgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwlJZiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQgYW5kIGdpdC1zdm4gZW5jb3VudGVycyBhbiBTVk4KKwljb21taXR0ZXIgbmFtZSB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhdXRob3JzLWZpbGUsIGdpdC1zdm4KKwl3aWxsIGFib3J0IG9wZXJhdGlvbi4gVGhlIHVzZXIgd2lsbCB0aGVuIGhhdmUgdG8gYWRkIHRoZQorCWFwcHJvcHJpYXRlIGVudHJ5LiAgUmUtcnVubmluZyB0aGUgcHJldmlvdXMgZ2l0LXN2biBjb21tYW5kCisJYWZ0ZXIgdGhlIGF1dGhvcnMtZmlsZSBpcyBtb2RpZmllZCBzaG91bGQgY29udGludWUgb3BlcmF0aW9uLgorCisJcmVwby1jb25maWcga2V5OiBzdm4uYXV0aG9ycy1maWxlCisKK0FEVkFOQ0VEIE9QVElPTlMKKy0tLS0tLS0tLS0tLS0tLS0KKy1iPHJlZm5hbWU+OjoKKy0tYnJhbmNoIDxyZWZuYW1lPjo6CisJVXNlZCB3aXRoICdmZXRjaCcgb3IgJ2NvbW1pdCcuCisKKwlUaGlzIGNhbiBiZSB1c2VkIHRvIGpvaW4gYXJiaXRyYXJ5IGdpdCBicmFuY2hlcyB0byByZW1vdGVzL2dpdC1zdm4KKwlvbiBuZXcgY29tbWl0cyB3aGVyZSB0aGUgdHJlZSBvYmplY3QgaXMgZXF1aXZhbGVudC4KKworCVdoZW4gdXNlZCB3aXRoIGRpZmZlcmVudCBHSVRfU1ZOX0lEIHZhbHVlcywgdGFncyBhbmQgYnJhbmNoZXMgaW4KKwlTVk4gY2FuIGJlIHRyYWNrZWQgdGhpcyB3YXksIGFzIGNhbiBzb21lIG1lcmdlcyB3aGVyZSB0aGUgaGVhZHMKKwllbmQgdXAgaGF2aW5nIGNvbXBsZXRlbHkgZXF1aXZhbGVudCBjb250ZW50LiAgVGhpcyBjYW4gZXZlbiBiZQorCXVzZWQgdG8gdHJhY2sgYnJhbmNoZXMgYWNyb3NzIG11bHRpcGxlIFNWTiBfcmVwb3NpdG9yaWVzXy4KKworCVRoaXMgb3B0aW9uIG1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2gKKwlicmFuY2guCisKKwlyZXBvLWNvbmZpZyBrZXk6IHN2bi5icmFuY2gKKworLWk8R0lUX1NWTl9JRD46OgorLS1pZCA8R0lUX1NWTl9JRD46OgorCVRoaXMgc2V0cyBHSVRfU1ZOX0lEIChpbnN0ZWFkIG9mIHVzaW5nIHRoZSBlbnZpcm9ubWVudCkuICBTZWUKKwl0aGUgc2VjdGlvbiBvbiAiVHJhY2tpbmcgTXVsdGlwbGUgUmVwb3NpdG9yaWVzIG9yIEJyYW5jaGVzIiBmb3IKKwltb3JlIGluZm9ybWF0aW9uIG9uIHVzaW5nIEdJVF9TVk5fSUQuCisKK0NPTVBBVElCSUxJVFkgT1BUSU9OUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLXVwZ3JhZGU6OgorCU9ubHkgdXNlZCB3aXRoIHRoZSAncmVidWlsZCcgY29tbWFuZC4KKworCVJ1biB0aGlzIGlmIHlvdSB1c2VkIGFuIG9sZCB2ZXJzaW9uIG9mIGdpdC1zdm4gdGhhdCB1c2VkCisJImdpdC1zdm4tSEVBRCIgaW5zdGVhZCBvZiAicmVtb3Rlcy9naXQtc3ZuIiBhcyB0aGUgYnJhbmNoCisJZm9yIHRyYWNraW5nIHRoZSByZW1vdGUuCisKKy0tbm8taWdub3JlLWV4dGVybmFsczo6CisJT25seSB1c2VkIHdpdGggdGhlICdmZXRjaCcgYW5kICdyZWJ1aWxkJyBjb21tYW5kLgorCisJQnkgZGVmYXVsdCwgZ2l0LXN2biBwYXNzZXMgLS1pZ25vcmUtZXh0ZXJuYWxzIHRvIHN2biB0byBhdm9pZAorCWZldGNoaW5nIHN2bjpleHRlcm5hbCB0cmVlcyBpbnRvIGdpdC4gIFBhc3MgdGhpcyBmbGFnIHRvIGVuYWJsZQorCWV4dGVybmFscyB0cmFja2luZyBkaXJlY3RseSB2aWEgZ2l0LgorCisJVmVyc2lvbnMgb2Ygc3ZuIHRoYXQgZG8gbm90IHN1cHBvcnQgLS1pZ25vcmUtZXh0ZXJuYWxzIGFyZQorCWF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHRoaXMgZmxhZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKwllbmFibGVkIGZvciB0aGVtLgorCisJT3RoZXJ3aXNlLCBkbyBub3QgZW5hYmxlIHRoaXMgZmxhZyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUKKwlkb2luZy4KKworCXJlcG8tY29uZmlnIGtleTogc3ZuLm5vaWdub3JlZXh0ZXJuYWxzCisKK0Jhc2ljIEV4YW1wbGVzCit+fn5+fn5+fn5+fn5+fgorCitUcmFja2luZyBhbmQgY29udHJpYnV0aW5nIHRvIGFuIFN1YnZlcnNpb24gbWFuYWdlZC1wcm9qZWN0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW5pdGlhbGl6ZSBhIHRyZWUgKGxpa2UgZ2l0IGluaXQtZGIpOgorCWdpdC1zdm4gaW5pdCBodHRwOi8vc3ZuLmZvby5vcmcvcHJvamVjdC90cnVuaworIyBGZXRjaCByZW1vdGUgcmV2aXNpb25zOgorCWdpdC1zdm4gZmV0Y2gKKyMgQ3JlYXRlIHlvdXIgb3duIGJyYW5jaCB0byBoYWNrIG9uOgorCWdpdCBjaGVja291dCAtYiBteS1icmFuY2ggcmVtb3Rlcy9naXQtc3ZuCisjIENvbW1pdCBvbmx5IHRoZSBnaXQgY29tbWl0cyB5b3Ugd2FudCB0byBTVk46CisJZ2l0LXN2biBjb21taXQgPHRyZWUtaXNoPiBbPHRyZWUtaXNoXzI+IC4uLl0KKyMgQ29tbWl0IGFsbCB0aGUgZ2l0IGNvbW1pdHMgZnJvbSBteS1icmFuY2ggdGhhdCBkb24ndCBleGlzdCBpbiBTVk46CisJZ2l0LXN2biBjb21taXQgcmVtb3Rlcy9naXQtc3ZuLi5teS1icmFuY2gKKyMgU29tZXRoaW5nIGlzIGNvbW1pdHRlZCB0byBTVk4sIHB1bGwgdGhlIGxhdGVzdCBpbnRvIHlvdXIgYnJhbmNoOgorCWdpdC1zdm4gZmV0Y2ggJiYgZ2l0IHB1bGwgLiByZW1vdGVzL2dpdC1zdm4KKyMgQXBwZW5kIHN2bjppZ25vcmUgc2V0dGluZ3MgdG8gdGhlIGRlZmF1bHQgZ2l0IGV4Y2x1ZGUgZmlsZToKKwlnaXQtc3ZuIHNob3ctaWdub3JlID4+IC5naXQvaW5mby9leGNsdWRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworREVTSUdOIFBISUxPU09QSFkKKy0tLS0tLS0tLS0tLS0tLS0tCitNZXJnZSB0cmFja2luZyBpbiBTdWJ2ZXJzaW9uIGlzIGxhY2tpbmcgYW5kIGRvaW5nIGJyYW5jaGVkIGRldmVsb3BtZW50Cit3aXRoIFN1YnZlcnNpb24gaXMgY3VtYmVyc29tZSBhcyBhIHJlc3VsdC4gIGdpdC1zdm4gY29tcGxldGVseSBmb3Jnb2VzCithbnkgYXV0b21hdGVkIG1lcmdlL2JyYW5jaCB0cmFja2luZyBvbiB0aGUgU3VidmVyc2lvbiBzaWRlIGFuZCBsZWF2ZXMgaXQKK2VudGlyZWx5IHVwIHRvIHRoZSB1c2VyIG9uIHRoZSBnaXQgc2lkZS4gIEl0J3Mgc2ltcGx5IG5vdCB3b3J0aCBpdCB0byBkbworYSB1c2VmdWwgdHJhbnNsYXRpb24gd2hlbiB0aGUgb3JpZ2luYWwgc2lnbmFsIGlzIHdlYWsuCisKK1RSQUNLSU5HIE1VTFRJUExFIFJFUE9TSVRPUklFUyBPUiBCUkFOQ0hFUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGlzIGZvciBhZHZhbmNlZCB1c2VycywgbW9zdCB1c2VycyBzaG91bGQgaWdub3JlIHRoaXMgc2VjdGlvbi4KKworQmVjYXVzZSBnaXQtc3ZuIGRvZXMgbm90IGNhcmUgYWJvdXQgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGRpZmZlcmVudAorYnJhbmNoZXMgb3IgZGlyZWN0b3JpZXMgaW4gYSBTdWJ2ZXJzaW9uIHJlcG9zaXRvcnksIGdpdC1zdm4gaGFzIGEgc2ltcGxlCitoYWNrIHRvIGFsbG93IGl0IHRvIHRyYWNrIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcmVsYXRlZCBfb3JfIHVucmVsYXRlZAorU1ZOIHJlcG9zaXRvcmllcyB2aWEgb25lIGdpdCByZXBvc2l0b3J5LiAgU2ltcGx5IHNldCB0aGUgR0lUX1NWTl9JRAorZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYSBuYW1lIG90aGVyIG90aGVyIHRoYW4gImdpdC1zdm4iICh0aGUgZGVmYXVsdCkKK2FuZCBnaXQtc3ZuIHdpbGwgaWdub3JlIHRoZSBjb250ZW50cyBvZiB0aGUgJEdJVF9ESVIvZ2l0LXN2biBkaXJlY3RvcnkKK2FuZCBpbnN0ZWFkIGRvIGFsbCBvZiBpdHMgd29yayBpbiAkR0lUX0RJUi8kR0lUX1NWTl9JRCBmb3IgdGhhdAoraW52b2NhdGlvbi4gIFRoZSBpbnRlcmZhY2UgYnJhbmNoIHdpbGwgYmUgcmVtb3Rlcy8kR0lUX1NWTl9JRCwgaW5zdGVhZCBvZgorcmVtb3Rlcy9naXQtc3ZuLiAgQW55IHJlbW90ZXMvJEdJVF9TVk5fSUQgYnJhbmNoIHNob3VsZCBuZXZlciBiZSBtb2RpZmllZAorYnkgdGhlIHVzZXIgb3V0c2lkZSBvZiBnaXQtc3ZuIGNvbW1hbmRzLgorCitBRERJVElPTkFMIEZFVENIIEFSR1VNRU5UUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgaXMgZm9yIGFkdmFuY2VkIHVzZXJzLCBtb3N0IHVzZXJzIHNob3VsZCBpZ25vcmUgdGhpcyBzZWN0aW9uLgorCitVbmZldGNoZWQgU1ZOIHJldmlzaW9ucyBtYXkgYmUgaW1wb3J0ZWQgYXMgY2hpbGRyZW4gb2YgZXhpc3RpbmcgY29tbWl0cworYnkgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byAnZmV0Y2gnLiAgQWRkaXRpb25hbCBwYXJlbnRzIG1heQorb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvcm0gb2Ygc2hhMSBoZXggc3VtcyBhdCB0aGUKK2NvbW1hbmQtbGluZS4gIFVuZmV0Y2hlZCBTVk4gcmV2aXNpb25zIG1heSBhbHNvIGJlIHRpZWQgdG8gcGFydGljdWxhcgorZ2l0IGNvbW1pdHMgd2l0aCB0aGUgZm9sbG93aW5nIHN5bnRheDoKKworCXN2bl9yZXZpc2lvbl9udW1iZXI9Z2l0X2NvbW1pdF9zaGExCisKK1RoaXMgYWxsb3dzIHlvdSB0byB0aWUgdW5mZXRjaGVkIFNWTiByZXZpc2lvbiAzNzUgdG8geW91ciBjdXJyZW50IEhFQUQ6OgorCisJYGdpdC1zdm4gZmV0Y2ggMzc1PSQoZ2l0LXJldi1wYXJzZSBIRUFEKWAKKworQWR2YW5jZWQgRXhhbXBsZTogVHJhY2tpbmcgYSBSZW9yZ2FuaXplZCBSZXBvc2l0b3J5Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0lmIHlvdSdyZSB0cmFja2luZyBhIGRpcmVjdG9yeSB0aGF0IGhhcyBtb3ZlZCwgb3Igb3RoZXJ3aXNlIGJlZW4KK2JyYW5jaGVkIG9yIHRhZ2dlZCBvZmYgb2YgYW5vdGhlciBkaXJlY3RvcnkgaW4gdGhlIHJlcG9zaXRvcnkgYW5kIHlvdQorY2FyZSBhYm91dCB0aGUgZnVsbCBoaXN0b3J5IG9mIHRoZSBwcm9qZWN0LCB0aGVuIHlvdSBjYW4gcmVhZCB0aGlzCitzZWN0aW9uLgorCitUaGlzIGlzIGhvdyBZYW5uIERpcnNvbiB0cmFja2VkIHRoZSB0cnVuayBvZiB0aGUgdWZvYWkgZGlyZWN0b3J5IHdoZW4KK3RoZSAvdHJ1bmsgZGlyZWN0b3J5IG9mIGhpcyByZXBvc2l0b3J5IHdhcyBtb3ZlZCB0byAvdWZvYWkvdHJ1bmsgYW5kCitoZSBuZWVkZWQgdG8gY29udGludWUgdHJhY2tpbmcgL3Vmb2FpL3RydW5rIHdoZXJlIC90cnVuayBsZWZ0IG9mZi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJIyBUaGlzIGxvZyBtZXNzYWdlIHNob3dzIHdoZW4gdGhlIHJlcG9zaXRvcnkgd2FzIHJlb3JnYW5pemVkOgorCXIxNjYgfCB5ZGlyc29uIHwgMjAwNi0wMy0wMiAwMTozNjo1NSArMDEwMCAoVGh1LCAwMiBNYXIgMjAwNikgfCAxIGxpbmUKKwlDaGFuZ2VkIHBhdGhzOgorCSAgIEQgL3RydW5rCisJICAgQSAvdWZvYWkvdHJ1bmsgKGZyb20gL3RydW5rOjE2NSkKKworCSMgRmlyc3Qgd2Ugc3RhcnQgdHJhY2tpbmcgdGhlIG9sZCByZXZpc2lvbnM6CisJR0lUX1NWTl9JRD1naXQtb2xkc3ZuIGdpdC1zdm4gaW5pdCBcCisJCQlodHRwczovL3N2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC91Zm9haS90cnVuaworCUdJVF9TVk5fSUQ9Z2l0LW9sZHN2biBnaXQtc3ZuIGZldGNoIC1yMToxNjUKKworCSMgQW5kIG5vdywgd2UgY29udGludWUgdHJhY2tpbmcgdGhlIG5ldyByZXZpc2lvbnM6CisJR0lUX1NWTl9JRD1naXQtbmV3c3ZuIGdpdC1zdm4gaW5pdCBcCisJICAgICAgaHR0cHM6Ly9zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3QvdWZvYWkvdWZvYWkvdHJ1bmsKKwlHSVRfU1ZOX0lEPWdpdC1uZXdzdm4gZ2l0LXN2biBmZXRjaCBcCisJICAgICAgMTY2PWBnaXQtcmV2LXBhcnNlIHJlZnMvcmVtb3Rlcy9naXQtb2xkc3ZuYAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JVR1MKKy0tLS0KK0lmIHNvbWVib2R5IGNvbW1pdHMgYSBjb25mbGljdGluZyBjaGFuZ2VzZXQgdG8gU1ZOIGF0IGEgYmFkIG1vbWVudAorKHJpZ2h0IGJlZm9yZSB5b3UgY29tbWl0KSBjYXVzaW5nIGEgY29uZmxpY3QgYW5kIHlvdXIgY29tbWl0IHRvIGZhaWwsCit5b3VyIHN2biB3b3JraW5nIHRyZWUgKCRHSVRfRElSL2dpdC1zdm4vdHJlZSkgbWF5IGJlIGRpcnRpZWQuICBUaGUKK2Vhc2llc3QgdGhpbmcgdG8gZG8gaXMgcHJvYmFibHkganVzdCB0byBybSAtcmYgJEdJVF9ESVIvZ2l0LXN2bi90cmVlIGFuZAorcnVuICdyZWJ1aWxkJy4KKworV2UgaWdub3JlIGFsbCBTVk4gcHJvcGVydGllcyBleGNlcHQgc3ZuOmV4ZWN1dGFibGUuICBUb28gZGlmZmljdWx0IHRvCittYXAgdGhlbSBzaW5jZSB3ZSByZWx5IGhlYXZpbHkgb24gZ2l0IHdyaXRlLXRyZWUgYmVpbmcgX2V4YWN0bHlfIHRoZQorc2FtZSBvbiBib3RoIHRoZSBTVk4gYW5kIGdpdCB3b3JraW5nIHRyZWVzIGFuZCBJIHByZWZlciBub3QgdG8gY2x1dHRlcgord29ya2luZyB0cmVlcyB3aXRoIG1ldGFkYXRhIGZpbGVzLgorCitzdm46a2V5d29yZHMgY2FuJ3QgYmUgaWdub3JlZCBpbiBTdWJ2ZXJzaW9uIChhdCBsZWFzdCBJIGRvbid0IGtub3cgb2YKK2Egd2F5IHRvIGlnbm9yZSB0aGVtKS4KKworUmVuYW1lZCBhbmQgY29waWVkIGRpcmVjdG9yaWVzIGFyZSBub3QgZGV0ZWN0ZWQgYnkgZ2l0IGFuZCBoZW5jZSBub3QKK3RyYWNrZWQgd2hlbiBjb21taXR0aW5nIHRvIFNWTi4gIEkgZG8gbm90IHBsYW4gb24gYWRkaW5nIHN1cHBvcnQgZm9yCit0aGlzIGFzIGl0J3MgcXVpdGUgZGlmZmljdWx0IGFuZCB0aW1lLWNvbnN1bWluZyB0byBnZXQgd29ya2luZyBmb3IgYWxsCit0aGUgcG9zc2libGUgY29ybmVyIGNhc2VzIChnaXQgZG9lc24ndCBkbyBpdCwgZWl0aGVyKS4gIFJlbmFtZWQgYW5kCitjb3BpZWQgZmlsZXMgYXJlIGZ1bGx5IHN1cHBvcnRlZCBpZiB0aGV5J3JlIHNpbWlsYXIgZW5vdWdoIGZvciBnaXQgdG8KK2RldGVjdCB0aGVtLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KK1dyaXR0ZW4gYnkgRXJpYyBXb25nIDxub3JtYWxwZXJzb25AeWhidC5uZXQ+LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3ZuaW1wb3J0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN2bmltcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiODdjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN2bmltcG9ydC50eHQKQEAgLTAsMCArMSwxNjAgQEAKK2dpdC1zdm5pbXBvcnQoMSkKKz09PT09PT09PT09PT09PT0KK3YwLjEsIEp1bHkgMjAwNQorCitOQU1FCistLS0tCitnaXQtc3ZuaW1wb3J0IC0gSW1wb3J0IGEgU1ZOIHJlcG9zaXRvcnkgaW50byBnaXQKKworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydnaXQtc3ZuaW1wb3J0JyBbIC1vIDxicmFuY2gtZm9yLUhFQUQ+IF0gWyAtaCBdIFsgLXYgXSBbIC1kIHwgLUQgXQorCQlbIC1DIDxHSVRfcmVwb3NpdG9yeT4gXSBbIC1pIF0gWyAtdSBdIFstbCBsaW1pdF9yZXZdCisJCVsgLWIgYnJhbmNoX3N1YmRpciBdIFsgLVQgdHJ1bmtfc3ViZGlyIF0gWyAtdCB0YWdfc3ViZGlyIF0KKwkJWyAtcyBzdGFydF9jaGcgXSBbIC1tIF0gWyAtciBdIFsgLU0gcmVnZXggXQorCQlbIC1JIDxpZ25vcmVmaWxlX25hbWU+IF0gWyAtQSA8YXV0aG9yX2ZpbGU+IF0KKwkJPFNWTl9yZXBvc2l0b3J5X1VSTD4gWyA8cGF0aD4gXQorCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorSW1wb3J0cyBhIFNWTiByZXBvc2l0b3J5IGludG8gZ2l0LiBJdCB3aWxsIGVpdGhlciBjcmVhdGUgYSBuZXcKK3JlcG9zaXRvcnksIG9yIGluY3JlbWVudGFsbHkgaW1wb3J0IGludG8gYW4gZXhpc3Rpbmcgb25lLgorCitTVk4gYWNjZXNzIGlzIGRvbmUgYnkgdGhlIFNWTjo6UGVybCBtb2R1bGUuCisKK2dpdC1zdm5pbXBvcnQgYXNzdW1lcyB0aGF0IFNWTiByZXBvc2l0b3JpZXMgYXJlIG9yZ2FuaXplZCBpbnRvIG9uZQorInRydW5rIiBkaXJlY3Rvcnkgd2hlcmUgdGhlIG1haW4gZGV2ZWxvcG1lbnQgaGFwcGVucywgImJyYW5jaC9GT08iCitkaXJlY3RvcmllcyBmb3IgYnJhbmNoZXMsIGFuZCAiL3RhZ3MvRk9PIiBkaXJlY3RvcmllcyBmb3IgdGFncy4KK090aGVyIHN1YmRpcmVjdG9yaWVzIGFyZSBpZ25vcmVkLgorCitnaXQtc3ZuaW1wb3J0IGNyZWF0ZXMgYSBmaWxlICIuZ2l0L3N2bjJnaXQiLCB3aGljaCBpcyByZXF1aXJlZCBmb3IKK2luY3JlbWVudGFsIFNWTiBpbXBvcnRzLgorCitPUFRJT05TCistLS0tLS0tCistQyA8dGFyZ2V0LWRpcj46OgorICAgICAgICBUaGUgR0lUIHJlcG9zaXRvcnkgdG8gaW1wb3J0IHRvLiAgSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0CisgICAgICAgIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKworLXMgPHN0YXJ0X3Jldj46OgorICAgICAgICBTdGFydCBpbXBvcnRpbmcgYXQgdGhpcyBTVk4gY2hhbmdlIG51bWJlci4gVGhlICBkZWZhdWx0IGlzIDEuCisrCitXaGVuIGltcG9ydGluZyBpbmNyZW1lbnRhbGx5LCB5b3UgbWlnaHQgbmVlZCB0byBlZGl0IHRoZSAuZ2l0L3N2bjJnaXQgZmlsZS4KKworLWk6OgorCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKwllbnN1cmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgaW5kZXggcmVtYWluIHVudG91Y2hlZCBhbmQgd2lsbAorCW5vdCBjcmVhdGUgdGhlbSBpZiB0aGV5IGRvIG5vdCBleGlzdC4KKworLVQgPHRydW5rX3N1YmRpcj46OgorCU5hbWUgdGhlIFNWTiB0cnVuay4gRGVmYXVsdCAidHJ1bmsiLgorCistdCA8dGFnX3N1YmRpcj46OgorCU5hbWUgdGhlIFNWTiBzdWJkaXJlY3RvcnkgZm9yIHRhZ3MuIERlZmF1bHQgInRhZ3MiLgorCistYiA8YnJhbmNoX3N1YmRpcj46OgorCU5hbWUgdGhlIFNWTiBzdWJkaXJlY3RvcnkgZm9yIGJyYW5jaGVzLiBEZWZhdWx0ICJicmFuY2hlcyIuCisKKy1vIDxicmFuY2gtZm9yLUhFQUQ+OjoKKwlUaGUgJ3RydW5rJyBicmFuY2ggZnJvbSBTVk4gaXMgaW1wb3J0ZWQgdG8gdGhlICdvcmlnaW4nIGJyYW5jaCB3aXRoaW4KKwl0aGUgZ2l0IHJlcG9zaXRvcnkuIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBpbXBvcnQgaW50byBhCisJZGlmZmVyZW50IGJyYW5jaC4KKworLXI6OgorCVByZXBlbmQgJ3JYOiAnIHRvIGNvbW1pdCBtZXNzYWdlcywgd2hlcmUgWCBpcyB0aGUgaW1wb3J0ZWQKKwlzdWJ2ZXJzaW9uIHJldmlzaW9uLgorCistSSA8aWdub3JlZmlsZV9uYW1lPjo6CisJSW1wb3J0IHRoZSBzdm46aWdub3JlIGRpcmVjdG9yeSBwcm9wZXJ0eSB0byBmaWxlcyB3aXRoIHRoaXMKKwluYW1lIGluIGVhY2ggZGlyZWN0b3J5LiAoVGhlIFN1YnZlcnNpb24gYW5kIEdJVCBpZ25vcmUKKwlzeW50YXhlcyBhcmUgc2ltaWxhciBlbm91Z2ggdGhhdCB1c2luZyB0aGUgU3VidmVyc2lvbiBwYXR0ZXJucworCWRpcmVjdGx5IHdpdGggIi1JIC5naXRpZ25vcmUiIHdpbGwgYWxtb3N0IGFsd2F5cyBqdXN0IHdvcmsuKQorCistQSA8YXV0aG9yX2ZpbGU+OjoKKwlSZWFkIGEgZmlsZSB3aXRoIGxpbmVzIG9uIHRoZSBmb3JtCisrCistLS0tLS0KKwl1c2VybmFtZSA9IFVzZXIncyBGdWxsIE5hbWUgPGVtYWlsQGFkZHIuZXM+CisKKy0tLS0tLQorKworYW5kIHVzZSAiVXNlcidzIEZ1bGwgTmFtZSA8ZW1haWxAYWRkci5lcz4iIGFzIHRoZSBHSVQKK2F1dGhvciBhbmQgY29tbWl0dGVyIGZvciBTdWJ2ZXJzaW9uIGNvbW1pdHMgbWFkZSBieQorInVzZXJuYW1lIi4gSWYgZW5jb3VudGVyaW5nIGEgY29tbWl0IG1hZGUgYnkgYSB1c2VyIG5vdCBpbiB0aGUKK2xpc3QsIGFib3J0LgorKworRm9yIGNvbnZlbmllbmNlLCB0aGlzIGRhdGEgaXMgc2F2ZWQgdG8gJEdJVF9ESVIvc3ZuLWF1dGhvcnMKK2VhY2ggdGltZSB0aGUgLUEgb3B0aW9uIGlzIHByb3ZpZGVkLCBhbmQgcmVhZCBmcm9tIHRoYXQgc2FtZQorZmlsZSBlYWNoIHRpbWUgZ2l0LXN2bmltcG9ydCBpcyBydW4gd2l0aCBhbiBleGlzdGluZyBHSVQKK3JlcG9zaXRvcnkgd2l0aG91dCAtQS4KKworLW06OgorCUF0dGVtcHQgdG8gZGV0ZWN0IG1lcmdlcyBiYXNlZCBvbiB0aGUgY29tbWl0IG1lc3NhZ2UuIFRoaXMgb3B0aW9uCisJd2lsbCBlbmFibGUgZGVmYXVsdCByZWdleGVzIHRoYXQgdHJ5IHRvIGNhcHR1cmUgdGhlIG5hbWUgc291cmNlCisJYnJhbmNoIG5hbWUgZnJvbSB0aGUgY29tbWl0IG1lc3NhZ2UuCisKKy1NIDxyZWdleD46OgorCUF0dGVtcHQgdG8gZGV0ZWN0IG1lcmdlcyBiYXNlZCBvbiB0aGUgY29tbWl0IG1lc3NhZ2Ugd2l0aCBhIGN1c3RvbQorCXJlZ2V4LiBJdCBjYW4gYmUgdXNlZCB3aXRoIC1tIHRvIGFsc28gc2VlIHRoZSBkZWZhdWx0IHJlZ2V4ZXMuCisJWW91IG11c3QgZXNjYXBlIGZvcndhcmQgc2xhc2hlcy4KKworLWwgPG1heF9yZXY+OjoKKwlTcGVjaWZ5IGEgbWF4aW11bSByZXZpc2lvbiBudW1iZXIgdG8gcHVsbC4KKworCUZvcm1lcmx5LCB0aGlzIG9wdGlvbiBjb250cm9sbGVkIGhvdyBtYW55IHJldmlzaW9ucyB0byBwdWxsLAorCWR1ZSB0byBTVk4gbWVtb3J5IGxlYWtzLiAoVGhlc2UgaGF2ZSBiZWVuIHdvcmtlZCBhcm91bmQuKQorCistdjo6CisJVmVyYm9zaXR5OiBsZXQgJ3N2bmltcG9ydCcgcmVwb3J0IHdoYXQgaXQgaXMgZG9pbmcuCisKKy1kOjoKKwlVc2UgZGlyZWN0IEhUVFAgcmVxdWVzdHMgaWYgcG9zc2libGUuIFRoZSAiPHBhdGg+IiBhcmd1bWVudCBpcyB1c2VkCisJb25seSBmb3IgcmV0cmlldmluZyB0aGUgU1ZOIGxvZ3M7IHRoZSBwYXRoIHRvIHRoZSBjb250ZW50cyBpcworCWluY2x1ZGVkIGluIHRoZSBTVk4gbG9nLgorCistRDo6CisJVXNlIGRpcmVjdCBIVFRQIHJlcXVlc3RzIGlmIHBvc3NpYmxlLiBUaGUgIjxwYXRoPiIgYXJndW1lbnQgaXMgdXNlZAorCWZvciByZXRyaWV2aW5nIHRoZSBsb2dzLCBhcyB3ZWxsIGFzIGZvciB0aGUgY29udGVudHMuCisrCitUaGVyZSdzIG5vIHNhZmUgd2F5IHRvIGF1dG9tYXRpY2FsbHkgZmluZCBvdXQgd2hpY2ggb2YgdGhlc2Ugb3B0aW9ucyB0bwordXNlLCBzbyB5b3UgbmVlZCB0byB0cnkgYm90aC4gVXN1YWxseSwgdGhlIG9uZSB0aGF0J3Mgd3Jvbmcgd2lsbCBkaWUKK3dpdGggYSA0MHggZXJyb3IgcHJldHR5IHF1aWNrbHkuCisKKzxTVk5fcmVwb3NpdG9yeV9VUkw+OjoKKwlUaGUgVVJMIG9mIHRoZSBTVk4gbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydC4gRm9yIGxvY2FsCisJcmVwb3NpdG9yaWVzLCB1c2UgImZpbGU6Ly8vYWJzb2x1dGUvcGF0aCIuCisrCitJZiB5b3UncmUgdXNpbmcgdGhlICItZCIgb3IgIi1EIiBvcHRpb24sIHRoaXMgaXMgdGhlIFVSTCBvZiB0aGUgU1ZOCityZXBvc2l0b3J5IGl0c2VsZjsgaXQgdXN1YWxseSBlbmRzIGluICIvc3ZuIi4KKworPHBhdGg+OjoKKwlUaGUgcGF0aCB0byB0aGUgbW9kdWxlIHlvdSB3YW50IHRvIGNoZWNrIG91dC4KKworLWg6OgorCVByaW50IGEgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworT1VUUFVUCistLS0tLS0KK0lmICctdicgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0IHJlcG9ydHMgd2hhdCBpdCBpcyBkb2luZy4KKworT3RoZXJ3aXNlLCBzdWNjZXNzIGlzIGluZGljYXRlZCB0aGUgVW5peCB3YXksIGkuZS4gYnkgc2ltcGx5IGV4aXRpbmcgd2l0aAorYSB6ZXJvIGV4aXQgc3RhdHVzLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBNYXR0aGlhcyBVcmxpY2hzIDxzbXVyZkBzbXVyZi5ub3Jpcy5kZT4sIHdpdGggaGVscCBmcm9tCit2YXJpb3VzIHBhcnRpY2lwYW50cyBvZiB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitCYXNlZCBvbiBhIGN2czJnaXQgc2NyaXB0IGJ5IHRoZSBzYW1lIGF1dGhvci4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgTWF0dGhpYXMgVXJsaWNocyA8c211cmZAc211cmYubm9yaXMuZGU+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtc3ltYm9saWMtcmVmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXN5bWJvbGljLXJlZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhYzZhNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXN5bWJvbGljLXJlZi50eHQKQEAgLTAsMCArMSw1MiBAQAorZ2l0LXN5bWJvbGljLXJlZigxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtc3ltYm9saWMtcmVmIC0gcmVhZCBhbmQgbW9kaWZ5IHN5bWJvbGljIHJlZnMKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXN5bWJvbGljLXJlZicgPG5hbWU+IFs8cmVmPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiBvbmUgYXJndW1lbnQsIHJlYWRzIHdoaWNoIGJyYW5jaCBoZWFkIHRoZSBnaXZlbiBzeW1ib2xpYworcmVmIHJlZmVycyB0byBhbmQgb3V0cHV0cyBpdHMgcGF0aCwgcmVsYXRpdmUgdG8gdGhlIGAuZ2l0L2AKK2RpcmVjdG9yeS4gIFR5cGljYWxseSB5b3Ugd291bGQgZ2l2ZSBgSEVBRGAgYXMgdGhlIDxuYW1lPgorYXJndW1lbnQgdG8gc2VlIG9uIHdoaWNoIGJyYW5jaCB5b3VyIHdvcmtpbmcgdHJlZSBpcyBvbi4KKworR2l2ZSB0d28gYXJndW1lbnRzLCBjcmVhdGUgb3IgdXBkYXRlIGEgc3ltYm9saWMgcmVmIDxuYW1lPiB0bworcG9pbnQgYXQgdGhlIGdpdmVuIGJyYW5jaCA8cmVmPi4KKworVHJhZGl0aW9uYWxseSwgYC5naXQvSEVBRGAgaXMgYSBzeW1saW5rIHBvaW50aW5nIGF0CitgcmVmcy9oZWFkcy9tYXN0ZXJgLiAgV2hlbiB3ZSB3YW50IHRvIHN3aXRjaCB0byBhbm90aGVyIGJyYW5jaCwKK3dlIGRpZCBgbG4gLXNmIHJlZnMvaGVhZHMvbmV3YnJhbmNoIC5naXQvSEVBRGAsIGFuZCB3aGVuIHdlIHdhbnQKK3RvIGZpbmQgb3V0IHdoaWNoIGJyYW5jaCB3ZSBhcmUgb24sIHdlIGRpZCBgcmVhZGxpbmsgLmdpdC9IRUFEYC4KK1RoaXMgd2FzIGZpbmUsIGFuZCBpbnRlcm5hbGx5IHRoYXQgaXMgd2hhdCBzdGlsbCBoYXBwZW5zIGJ5CitkZWZhdWx0LCBidXQgb24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IGhhdmUgd29ya2luZyBzeW1saW5rcywKK29yIHRoYXQgZG8gbm90IGhhdmUgdGhlIGByZWFkbGluaygxKWAgY29tbWFuZCwgdGhpcyB3YXMgYSBiaXQKK2N1bWJlcnNvbWUuICBPbiBzb21lIHBsYXRmb3JtcywgYGxuIC1zZmAgZG9lcyBub3QgZXZlbiB3b3JrIGFzCithZHZlcnRpc2VkIChob3Jyb3JzKS4KKworQSBzeW1ib2xpYyByZWYgY2FuIGJlIGEgcmVndWxhciBmaWxlIHRoYXQgc3RvcmVzIGEgc3RyaW5nIHRoYXQKK2JlZ2lucyB3aXRoIGByZWY6IHJlZnMvYC4gIEZvciBleGFtcGxlLCB5b3VyIGAuZ2l0L0hFQURgICpjYW4qCitiZSBhIHJlZ3VsYXIgZmlsZSB3aG9zZSBjb250ZW50cyBpcyBgcmVmOiByZWZzL2hlYWRzL21hc3RlcmAuCitUaGlzIGNhbiBiZSB1c2VkIG9uIGEgZmlsZXN5c3RlbSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgc3ltYm9saWMKK2xpbmtzLiAgSW5zdGVhZCBvZiBkb2luZyBgcmVhZGxpbmsgLmdpdC9IRUFEYCwgYGdpdC1zeW1ib2xpYy1yZWYKK0hFQURgIGNhbiBiZSB1c2VkIHRvIGZpbmQgb3V0IHdoaWNoIGJyYW5jaCB3ZSBhcmUgb24uICBUbyBwb2ludAordGhlIEhFQUQgdG8gYG5ld2JyYW5jaGAsIGluc3RlYWQgb2YgYGxuIC1zZiByZWZzL2hlYWRzL25ld2JyYW5jaAorLmdpdC9IRUFEYCwgYGdpdC1zeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzL25ld2JyYW5jaGAgY2FuIGJlCit1c2VkLgorCitDdXJyZW50bHksIC5naXQvSEVBRCB1c2VzIGEgcmVndWxhciBmaWxlIHN5bWJvbGljIHJlZiBvbiBDeWd3aW4sCithbmQgZXZlcnl3aGVyZSBlbHNlIGl0IGlzIGltcGxlbWVudGVkIGFzIGEgc3ltbGluay4gIFRoaXMgY2FuIGJlCitjaGFuZ2VkIGF0IGNvbXBpbGF0aW9uIHRpbWUuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC10YWcudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3NmMyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdGFnLnR4dApAQCAtMCwwICsxLDc1IEBACitnaXQtdGFnKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC10YWcgLSBDcmVhdGUgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC10YWcnIFstYSB8IC1zIHwgLXUgPGtleS1pZD5dIFstZiB8IC1kXSBbLW0gPG1zZz5dIDxuYW1lPiBbPGhlYWQ+XQorJ2dpdC10YWcnIC1sIFs8cGF0dGVybj5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQWRkcyBhICd0YWcnIHJlZmVyZW5jZSBpbiBgLmdpdC9yZWZzL3RhZ3MvYAorCitVbmxlc3MgYC1mYCBpcyBnaXZlbiwgdGhlIHRhZyBtdXN0IG5vdCB5ZXQgZXhpc3QgaW4KK2AuZ2l0L3JlZnMvdGFncy9gIGRpcmVjdG9yeS4KKworSWYgb25lIG9mIGAtYWAsIGAtc2AsIG9yIGAtdSA8a2V5LWlkPmAgaXMgcGFzc2VkLCB0aGUgY29tbWFuZAorY3JlYXRlcyBhICd0YWcnIG9iamVjdCwgYW5kIHJlcXVpcmVzIHRoZSB0YWcgbWVzc2FnZS4gIFVubGVzcworYC1tIDxtc2c+YCBpcyBnaXZlbiwgYW4gZWRpdG9yIGlzIHN0YXJ0ZWQgZm9yIHRoZSB1c2VyIHRvIHR5cGUKK2luIHRoZSB0YWcgbWVzc2FnZS4KKworT3RoZXJ3aXNlIGp1c3QgdGhlIFNIQTEgb2JqZWN0IG5hbWUgb2YgdGhlIGNvbW1pdCBvYmplY3QgaXMKK3dyaXR0ZW4gKGkuZS4gYSBsaWdodHdlaWdodCB0YWcpLgorCitBIEdudVBHIHNpZ25lZCB0YWcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZCB3aGVuIGAtc2Agb3IgYC11Cis8a2V5LWlkPmAgaXMgdXNlZC4gIFdoZW4gYC11IDxrZXktaWQ+YCBpcyBub3QgdXNlZCwgdGhlCitjb21taXR0ZXIgaWRlbnRpdHkgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZCB0byBmaW5kIHRoZQorR251UEcga2V5IGZvciBzaWduaW5nLgorCitgLWQgPHRhZz5gIGRlbGV0ZXMgdGhlIHRhZy4KKworYC1sIDxwYXR0ZXJuPmAgbGlzdHMgdGFncyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIChvciBhbGwKK2lmIG5vIHBhdHRlcm4gaXMgZ2l2ZW4pLgorCitPUFRJT05TCistLS0tLS0tCistYTo6CisJTWFrZSBhbiB1bnNpZ25lZCwgYW5ub3RhdGVkIHRhZyBvYmplY3QKKworLXM6OgorCU1ha2UgYSBHUEctc2lnbmVkIHRhZywgdXNpbmcgdGhlIGRlZmF1bHQgZS1tYWlsIGFkZHJlc3MncyBrZXkKKworLXUgPGtleS1pZD46OgorCU1ha2UgYSBHUEctc2lnbmVkIHRhZywgdXNpbmcgdGhlIGdpdmVuIGtleQorCistZjo6CisJUmVwbGFjZSBhbiBleGlzdGluZyB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSAoaW5zdGVhZCBvZiBmYWlsaW5nKQorCistZDo6CisJRGVsZXRlIGFuIGV4aXN0aW5nIHRhZyB3aXRoIHRoZSBnaXZlbiBuYW1lCisKKy1sIDxwYXR0ZXJuPjo6CisJTGlzdCB0YWdzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4gKG9yIGFsbCBpZiBubyBwYXR0ZXJuIGlzIGdpdmVuKS4KKworLW0gPG1zZz46OgorCVVzZSB0aGUgZ2l2ZW4gdGFnIG1lc3NhZ2UgKGluc3RlYWQgb2YgcHJvbXB0aW5nKQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4sCitKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4uCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXRhci10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXRhci10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTFjN2ZhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdGFyLXRyZWUudHh0CkBAIC0wLDAgKzEsOTAgQEAKK2dpdC10YXItdHJlZSgxKQorPT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC10YXItdHJlZSAtIENyZWF0ZXMgYSB0YXIgYXJjaGl2ZSBvZiB0aGUgZmlsZXMgaW4gdGhlIG5hbWVkIHRyZWUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdGFyLXRyZWUnIFstLXJlbW90ZT08cmVwbz5dIDx0cmVlLWlzaD4gWyA8YmFzZT4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0NyZWF0ZXMgYSB0YXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlIG5hbWVkIHRyZWUuCitXaGVuIDxiYXNlPiBpcyBzcGVjaWZpZWQgaXQgaXMgYWRkZWQgYXMgYSBsZWFkaW5nIHBhdGggdG8gdGhlIGZpbGVzIGluIHRoZQorZ2VuZXJhdGVkIHRhciBhcmNoaXZlLgorCitnaXQtdGFyLXRyZWUgYmVoYXZlcyBkaWZmZXJlbnRseSB3aGVuIGdpdmVuIGEgdHJlZSBJRCB2ZXJzdXMgd2hlbiBnaXZlbgorYSBjb21taXQgSUQgb3IgdGFnIElELiAgSW4gdGhlIGZpcnN0IGNhc2UgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkIGFzCittb2RpZmljYXRpb24gdGltZSBvZiBlYWNoIGZpbGUgaW4gdGhlIGFyY2hpdmUuICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCitjb21taXQgdGltZSBhcyByZWNvcmRlZCBpbiB0aGUgcmVmZXJlbmNlZCBjb21taXQgb2JqZWN0IGlzIHVzZWQgaW5zdGVhZC4KK0FkZGl0aW9uYWxseSB0aGUgY29tbWl0IElEIGlzIHN0b3JlZCBpbiBhIGdsb2JhbCBleHRlbmRlZCBwYXggaGVhZGVyLgorSXQgY2FuIGJlIGV4dHJhY3RlZCB1c2luZyBnaXQtZ2V0LXRhci1jb21taXQtaWQuCisKK09QVElPTlMKKy0tLS0tLS0KKworPHRyZWUtaXNoPjo6CisJVGhlIHRyZWUgb3IgY29tbWl0IHRvIHByb2R1Y2UgdGFyIGFyY2hpdmUgZm9yLiAgSWYgaXQgaXMKKwl0aGUgb2JqZWN0IG5hbWUgb2YgYSBjb21taXQgb2JqZWN0LgorCis8YmFzZT46OgorCUxlYWRpbmcgcGF0aCB0byB0aGUgZmlsZXMgaW4gdGhlIHJlc3VsdGluZyB0YXIgYXJjaGl2ZS4KKworLS1yZW1vdGU9PHJlcG8+OjoKKwlJbnN0ZWFkIG9mIG1ha2luZyBhIHRhciBhcmNoaXZlIGZyb20gbG9jYWwgcmVwb3NpdG9yeSwKKwlyZXRyaWV2ZSBhIHRhciBhcmNoaXZlIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS4KKworQ09ORklHVVJBVElPTgorLS0tLS0tLS0tLS0tLQorQnkgZGVmYXVsdCwgZmlsZSBhbmQgZGlyZWN0b3JpZXMgbW9kZXMgYXJlIHNldCB0byAwNjY2IG9yIDA3NzcuIEl0IGlzCitwb3NzaWJsZSB0byBjaGFuZ2UgdGhpcyBieSBzZXR0aW5nIHRoZSAidW1hc2siIHZhcmlhYmxlIGluIHRoZQorcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIGFzIGZvbGxvd3MgOgorCitbdGFyXQorICAgICAgICB1bWFzayA9IDAwMgk7IyBncm91cCBmcmllbmRseQorCitUaGUgc3BlY2lhbCB1bWFzayB2YWx1ZSAidXNlciIgaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIncyBjdXJyZW50IHVtYXNrCit3aWxsIGJlIHVzZWQgaW5zdGVhZC4gVGhlIGRlZmF1bHQgdmFsdWUgcmVtYWlucyAwLCB3aGljaCBtZWFucyB3b3JsZAorcmVhZGFibGUvd3JpdGFibGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCitFWEFNUExFUworLS0tLS0tLS0KK2dpdCB0YXItdHJlZSBIRUFEIGp1bmsgfCAoY2QgL3Zhci90bXAvICYmIHRhciB4ZiAtKTo6CisKKwlDcmVhdGUgYSB0YXIgYXJjaGl2ZSB0aGF0IGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUKKwlsYXRlc3QgY29tbWl0IG9uIHRoZSBjdXJyZW50IGJyYW5jaCwgYW5kIGV4dHJhY3RzIGl0IGluCisJYC92YXIvdG1wL2p1bmtgIGRpcmVjdG9yeS4KKworZ2l0IHRhci10cmVlIHYxLjQuMCBnaXQtMS40LjAgfCBnemlwID5naXQtMS40LjAudGFyLmd6OjoKKworCUNyZWF0ZSBhIHRhcmJhbGwgZm9yIHYxLjQuMCByZWxlYXNlLgorCitnaXQgdGFyLXRyZWUgdjEuNC4we2NhcmV0fVx7dHJlZVx9IGdpdC0xLjQuMCB8IGd6aXAgPmdpdC0xLjQuMC50YXIuZ3o6OgorCisJQ3JlYXRlIGEgdGFyYmFsbCBmb3IgdjEuNC4wIHJlbGVhc2UsIGJ1dCB3aXRob3V0IGEKKwlnbG9iYWwgZXh0ZW5kZWQgcGF4IGhlYWRlci4KKworZ2l0IHRhci10cmVlIC0tcmVtb3RlPWV4YW1wbGUuY29tOmdpdC5naXQgdjEuNC4wID5naXQtMS40LjAudGFyOjoKKworCUdldCBhIHRhcmJhbGwgdjEuNC4wIGZyb20gZXhhbXBsZS5jb20uCisKK2dpdCB0YXItdHJlZSBIRUFEOkRvY3VtZW50YXRpb24vIGdpdC1kb2NzID4gZ2l0LTEuNC4wLWRvY3MudGFyOjoKKworCVB1dCBldmVyeXRoaW5nIGluIHRoZSBjdXJyZW50IGhlYWQncyBEb2N1bWVudGF0aW9uLyBkaXJlY3RvcnkKKwlpbnRvICdnaXQtMS40LjAtZG9jcy50YXInLCB3aXRoIHRoZSBwcmVmaXggJ2dpdC1kb2NzLycuCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IFJlbmUgU2NoYXJmZS4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC10b29scy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC10b29scy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxNGNiYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXRvb2xzLnR4dApAQCAtMCwwICsxLDk3IEBACitBIHNob3J0IGdpdCB0b29scyBzdXJ2ZXkKKz09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK0FwYXJ0IGZyb20gZ2l0IGNvbnRyaWIvIGFyZWEgdGhlcmUgYXJlIHNvbWUgb3RoZXJzIHRoaXJkLXBhcnR5IHRvb2xzCit5b3UgbWF5IHdhbnQgdG8gbG9vay4KKworVGhpcyBkb2N1bWVudCBwcmVzZW50cyBhIGJyaWVmIHN1bW1hcnkgb2YgZWFjaCB0b29sIGFuZCB0aGUgY29ycmVzcG9uZGluZworbGluay4KKworCitBbHRlcm5hdGl2ZS9BdWdtZW50YXRpdmUgUG9yY2VsYWlucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgLSAqQ29naXRvKiAoaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vY29naXRvLykKKworICAgQ29naXRvIGlzIGEgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBsYXllcmVkIG9uIHRvcCBvZiB0aGUgZ2l0IHRyZWUgaGlzdG9yeQorICAgc3RvcmFnZSBzeXN0ZW0uIEl0IGFpbXMgYXQgc2VhbWxlc3MgdXNlciBpbnRlcmZhY2UgYW5kIGVhc2Ugb2YgdXNlLAorICAgcHJvdmlkaW5nIGdlbmVyYWxseSBzbW9vdGhlciB1c2VyIGV4cGVyaWVuY2UgdGhhbiB0aGUgInJhdyIgQ29yZSBHSVQKKyAgIGl0c2VsZiBhbmQgaW5kZWVkIG1hbnkgb3RoZXIgdmVyc2lvbiBjb250cm9sIHN5c3RlbXMuCisKKworICAgLSAqcGcqIChodHRwOi8vd3d3LnNwZWFyY2Uub3JnL2NhdGVnb3J5L3Byb2plY3RzL3NjbS9wZy8pCisKKyAgIHBnIGlzIGEgc2hlbGwgc2NyaXB0IHdyYXBwZXIgYXJvdW5kIEdJVCB0byBoZWxwIHRoZSB1c2VyIG1hbmFnZSBhIHNldCBvZgorICAgcGF0Y2hlcyB0byBmaWxlcy4gcGcgaXMgc29tZXdoYXQgbGlrZSBxdWlsdCBvciBTdEdJVCwgYnV0IGl0IGRvZXMgaGF2ZSBhCisgICBzbGlnaHRseSBkaWZmZXJlbnQgZmVhdHVyZSBzZXQuCisKKworICAgLSAqU3RHaXQqIChodHRwOi8vd3d3LnByb2NvZGUub3JnL3N0Z2l0LykKKworICAgU3RhY2tlZCBHSVQgcHJvdmlkZXMgYSBxdWlsdC1saWtlIHBhdGNoIG1hbmFnZW1lbnQgZnVuY3Rpb25hbGl0eSBpbiB0aGUKKyAgICBHSVQgZW52aXJvbm1lbnQuIFlvdSBjYW4gZWFzaWx5IG1hbmFnZSB5b3VyIHBhdGNoZXMgaW4gdGhlIHNjb3BlIG9mIEdJVAorICAgdW50aWwgdGhleSBnZXQgbWVyZ2VkIHVwc3RyZWFtLgorCisKK0hpc3RvcnkgVmlld2VycworLS0tLS0tLS0tLS0tLS0tCisKKyAgIC0gKmdpdGsqIChzaGlwcGVkIHdpdGggZ2l0LWNvcmUpCisKKyAgIGdpdGsgaXMgYSBzaW1wbGUgVGsgR1VJIGZvciBicm93c2luZyBoaXN0b3J5IG9mIEdJVCByZXBvc2l0b3JpZXMgZWFzaWx5LgorCisKKyAgIC0gKmdpdHZpZXcqICAoY29udHJpYi8pCisKKyAgIGdpdHZpZXcgaXMgYSBHVEsgYmFzZWQgcmVwb3NpdG9yeSBicm93c2VyIGZvciBnaXQKKworCisgICAtICpnaXR3ZWIqIChmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdHdlYi8pCisKKyAgIEdJVHdlYiBwcm92aWRlcyBmdWxsLWZsZWRnZWQgd2ViIGludGVyZmFjZSBmb3IgR0lUIHJlcG9zaXRvcmllcy4KKworCisgICAtICpxZ2l0KiAoaHR0cDovL2RpZ2lsYW5kZXIubGliZXJvLml0L21jb3N0YWxiYS8pCisKKyAgIFFHaXQgaXMgYSBnaXQvU3RHSVQgR1VJIHZpZXdlciBidWlsdCBvbiBRdC9DKysuIFFHaXQgY291bGQgYmUgdXNlZAorICAgdG8gYnJvd3NlIGhpc3RvcnkgYW5kIGRpcmVjdG9yeSB0cmVlLCB2aWV3IGFubm90YXRlZCBmaWxlcywgY29tbWl0CisgICBjaGFuZ2VzIGNoZXJyeSBwaWNraW5nIHNpbmdsZSBmaWxlcyBvciBhcHBseWluZyBwYXRjaGVzLgorICAgQ3VycmVudGx5IGl0IGlzIHRoZSBmYXN0ZXN0IGFuZCBtb3N0IGZlYXR1cmUgcmljaCBhbW9uZyB0aGUgZ2l0CisgICB2aWV3ZXJzIGFuZCBjb21taXQgdG9vbHMuCisKKworCitGb3JlaWduIFNDTSBpbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAtICpnaXQtc3ZuKiAoY29udHJpYi8pCisKKyAgIGdpdC1zdm4gaXMgYSBzaW1wbGUgY29uZHVpdCBmb3IgY2hhbmdlc2V0cyBiZXR3ZWVuIGEgc2luZ2xlIFN1YnZlcnNpb24KKyAgIGJyYW5jaCBhbmQgZ2l0LgorCisKKyAgIC0gKnF1aWx0MmdpdCAvIGdpdDJxdWlsdCogKGh0dHA6Ly9ob21lLXRqLm9yZy93aWtpL2luZGV4LnBocC9NaXNjKQorCisgICBUaGVzZSB1dGlsaXRpZXMgY29udmVydCBwYXRjaCBzZXJpZXMgaW4gYSBxdWlsdCByZXBvc2l0b3J5IGFuZCBjb21taXQKKyAgIHNlcmllcyBpbiBnaXQgYmFjayBhbmQgZm9ydGguCisKKworT3RoZXJzCistLS0tLS0KKworICAgLSAqKGgpZ2N0KiAoaHR0cDovL3d3dy5jeWQubGl1LnNlL3VzZXJzL35mcmVrdTA0NS9nY3QvKQorCisgICBDb21taXQgVG9vbCBvciAoaClnY3QgaXMgYSBHVUkgZW5hYmxlZCBjb21taXQgdG9vbCBmb3IgZ2l0IGFuZAorICAgTWVyY3VyaWFsIChoZykuIEl0IGFsbG93cyB0aGUgdXNlciB0byB2aWV3IGRpZmZzLCBzZWxlY3Qgd2hpY2ggZmlsZXMKKyAgIHRvIGNvbW1pdHRlZCAob3IgaWdub3JlZCAvIHJldmVydGVkKSB3cml0ZSBjb21taXQgbWVzc2FnZXMgYW5kCisgICBwZXJmb3JtIHRoZSBjb21taXQgaXRzZWxmLgorCisgICAtICpnaXQuZWwqIChjb250cmliLykKKworICAgVGhpcyBpcyBhbiBFbWFjcyBpbnRlcmZhY2UgZm9yIGdpdC4gVGhlIHVzZXIgaW50ZXJmYWNlIGlzIG1vZGVsZWQgb24KKyAgIHBjbC1jdnMuIEl0IGhhcyBiZWVuIGRldmVsb3BlZCBvbiBFbWFjcyAyMSBhbmQgd2lsbCBwcm9iYWJseSBuZWVkIHNvbWUKKyAgIHR3ZWFraW5nIHRvIHdvcmsgb24gWEVtYWNzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLWZpbGUudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdW5wYWNrLWZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxM2RjODEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stZmlsZS50eHQKQEAgLTAsMCArMSwzNiBAQAorZ2l0LXVucGFjay1maWxlKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVucGFjay1maWxlIC0gQ3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIHdpdGggYSBibG9iJ3MgY29udGVudHMKKworCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11bnBhY2stZmlsZScgPGJsb2I+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQ3JlYXRlcyBhIGZpbGUgaG9sZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGJsb2Igc3BlY2lmaWVkIGJ5IHNoYTEuIEl0CityZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKwkubWVyZ2VfZmlsZV9YWFhYWAorCitPUFRJT05TCistLS0tLS0tCis8YmxvYj46OgorCU11c3QgYmUgYSBibG9iIGlkCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stb2JqZWN0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11bnBhY2stb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwYjM4YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZ2l0LXVucGFjay1vYmplY3RzLnR4dApAQCAtMCwwICsxLDQ5IEBACitnaXQtdW5wYWNrLW9iamVjdHMoMSkKKz09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdW5wYWNrLW9iamVjdHMgLSBVbnBhY2sgb2JqZWN0cyBmcm9tIGEgcGFja2VkIGFyY2hpdmUKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtdW5wYWNrLW9iamVjdHMnIFstbl0gWy1xXSA8cGFjay1maWxlCisKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitSZWFkIGEgcGFja2VkIGFyY2hpdmUgKC5wYWNrKSBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgZXhwYW5kaW5nCit0aGUgb2JqZWN0cyBjb250YWluZWQgd2l0aGluIGFuZCB3cml0aW5nIHRoZW0gaW50byB0aGUgcmVwb3NpdG9yeSBpbgorImxvb3NlIiAob25lIG9iamVjdCBwZXIgZmlsZSkgZm9ybWF0LgorCitPYmplY3RzIHRoYXQgYWxyZWFkeSBleGlzdCBpbiB0aGUgcmVwb3NpdG9yeSB3aWxsICpub3QqIGJlIHVucGFja2VkCitmcm9tIHRoZSBwYWNrLWZpbGUuICBUaGVyZWZvcmUsIG5vdGhpbmcgd2lsbCBiZSB1bnBhY2tlZCBpZiB5b3UgdXNlCit0aGlzIGNvbW1hbmQgb24gYSBwYWNrLWZpbGUgdGhhdCBleGlzdHMgd2l0aGluIHRoZSB0YXJnZXQgcmVwb3NpdG9yeS4KKworUGxlYXNlIHNlZSB0aGUgYGdpdC1yZXBhY2tgIGRvY3VtZW50YXRpb24gZm9yIG9wdGlvbnMgdG8gZ2VuZXJhdGUKK25ldyBwYWNrcyBhbmQgcmVwbGFjZSBleGlzdGluZyBvbmVzLgorCitPUFRJT05TCistLS0tLS0tCistbjo6CisgICAgICAgIE9ubHkgbGlzdCB0aGUgb2JqZWN0cyB0aGF0IHdvdWxkIGJlIHVucGFja2VkLCBkb24ndCBhY3R1YWxseSB1bnBhY2sKKyAgICAgICAgdGhlbS4KKworLXE6OgorCVRoZSBjb21tYW5kIHVzdWFsbHkgc2hvd3MgcGVyY2VudGFnZSBwcm9ncmVzcy4gIFRoaXMKKwlmbGFnIHN1cHByZXNzZXMgaXQuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtaW5kZXgudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLWluZGV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU2ZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBkYXRlLWluZGV4LnR4dApAQCAtMCwwICsxLDMxOCBAQAorZ2l0LXVwZGF0ZS1pbmRleCgxKQorPT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnaXQtdXBkYXRlLWluZGV4IC0gTW9kaWZpZXMgdGhlIGluZGV4IG9yIGRpcmVjdG9yeSBjYWNoZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ2dpdC11cGRhdGUtaW5kZXgnCisJICAgICBbLS1hZGRdIFstLXJlbW92ZSB8IC0tZm9yY2UtcmVtb3ZlXSBbLS1yZXBsYWNlXQorCSAgICAgWy0tcmVmcmVzaF0gWy1xXSBbLS11bm1lcmdlZF0gWy0taWdub3JlLW1pc3NpbmddCisJICAgICBbLS1jYWNoZWluZm8gPG1vZGU+IDxvYmplY3Q+IDxmaWxlPl1cKgorCSAgICAgWy0tY2htb2Q9KCt8LSl4XQorCSAgICAgWy0tYXNzdW1lLXVuY2hhbmdlZCB8IC0tbm8tYXNzdW1lLXVuY2hhbmdlZF0KKwkgICAgIFstLXJlYWxseS1yZWZyZXNoXSBbLS11bnJlc29sdmVdIFstLWFnYWluXQorCSAgICAgWy0taW5mby1vbmx5XSBbLS1pbmRleC1pbmZvXQorCSAgICAgWy16XSBbLS1zdGRpbl0KKwkgICAgIFstLXZlcmJvc2VdCisJICAgICBbLS1dIFs8ZmlsZT5dXCoKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitNb2RpZmllcyB0aGUgaW5kZXggb3IgZGlyZWN0b3J5IGNhY2hlLiBFYWNoIGZpbGUgbWVudGlvbmVkIGlzIHVwZGF0ZWQKK2ludG8gdGhlIGluZGV4IGFuZCBhbnkgJ3VubWVyZ2VkJyBvciAnbmVlZHMgdXBkYXRpbmcnIHN0YXRlIGlzCitjbGVhcmVkLgorCitUaGUgd2F5ICJnaXQtdXBkYXRlLWluZGV4IiBoYW5kbGVzIGZpbGVzIGl0IGlzIHRvbGQgYWJvdXQgY2FuIGJlIG1vZGlmaWVkCit1c2luZyB0aGUgdmFyaW91cyBvcHRpb25zOgorCitPUFRJT05TCistLS0tLS0tCistLWFkZDo6CisJSWYgYSBzcGVjaWZpZWQgZmlsZSBpc24ndCBpbiB0aGUgaW5kZXggYWxyZWFkeSB0aGVuIGl0J3MKKwlhZGRlZC4KKwlEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBpZ25vcmUgbmV3IGZpbGVzLgorCistLXJlbW92ZTo6CisJSWYgYSBzcGVjaWZpZWQgZmlsZSBpcyBpbiB0aGUgaW5kZXggYnV0IGlzIG1pc3NpbmcgdGhlbiBpdCdzCisJcmVtb3ZlZC4KKwlEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGlnbm9yZSByZW1vdmVkIGZpbGUuCisKKy0tcmVmcmVzaDo6CisJTG9va3MgYXQgdGhlIGN1cnJlbnQgaW5kZXggYW5kIGNoZWNrcyB0byBzZWUgaWYgbWVyZ2VzIG9yCisJdXBkYXRlcyBhcmUgbmVlZGVkIGJ5IGNoZWNraW5nIHN0YXQoKSBpbmZvcm1hdGlvbi4KKworLXE6OgorICAgICAgICBRdWlldC4gIElmIC0tcmVmcmVzaCBmaW5kcyB0aGF0IHRoZSBpbmRleCBuZWVkcyBhbiB1cGRhdGUsIHRoZQorICAgICAgICBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGVycm9yIG91dC4gIFRoaXMgb3B0aW9uIG1ha2VzCisgICAgICAgIGdpdC11cGRhdGUtaW5kZXggY29udGludWUgYW55d2F5LgorCistLXVubWVyZ2VkOjoKKyAgICAgICAgSWYgLS1yZWZyZXNoIGZpbmRzIHVubWVyZ2VkIGNoYW5nZXMgaW4gdGhlIGluZGV4LCB0aGUgZGVmYXVsdAorICAgICAgICBiZWhhdmlvciBpcyB0byBlcnJvciBvdXQuICBUaGlzIG9wdGlvbiBtYWtlcyBnaXQtdXBkYXRlLWluZGV4IAorICAgICAgICBjb250aW51ZSBhbnl3YXkuCisKKy0taWdub3JlLW1pc3Npbmc6OgorCUlnbm9yZXMgbWlzc2luZyBmaWxlcyBkdXJpbmcgYSAtLXJlZnJlc2gKKworLS1jYWNoZWluZm8gPG1vZGU+IDxvYmplY3Q+IDxwYXRoPjo6CisJRGlyZWN0bHkgaW5zZXJ0IHRoZSBzcGVjaWZpZWQgaW5mbyBpbnRvIHRoZSBpbmRleC4KKwkKKy0taW5kZXgtaW5mbzo6CisgICAgICAgIFJlYWQgaW5kZXggaW5mb3JtYXRpb24gZnJvbSBzdGRpbi4KKworLS1jaG1vZD0oK3wtKXg6OgorICAgICAgICBTZXQgdGhlIGV4ZWN1dGUgcGVybWlzc2lvbnMgb24gdGhlIHVwZGF0ZWQgZmlsZXMuICAgICAgICAKKworLS1hc3N1bWUtdW5jaGFuZ2VkLCAtLW5vLWFzc3VtZS11bmNoYW5nZWQ6OgorCVdoZW4gdGhlc2UgZmxhZ3MgYXJlIHNwZWNpZmllZCwgdGhlIG9iamVjdCBuYW1lIHJlY29yZGVkCisJZm9yIHRoZSBwYXRocyBhcmUgbm90IHVwZGF0ZWQuICBJbnN0ZWFkLCB0aGVzZSBvcHRpb25zCisJc2V0cyBhbmQgdW5zZXRzIHRoZSAiYXNzdW1lIHVuY2hhbmdlZCIgYml0IGZvciB0aGUKKwlwYXRocy4gIFdoZW4gdGhlICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQgaXMgb24sIGdpdCBzdG9wcworCWNoZWNraW5nIHRoZSB3b3JraW5nIHRyZWUgZmlsZXMgZm9yIHBvc3NpYmxlCisJbW9kaWZpY2F0aW9ucywgc28geW91IG5lZWQgdG8gbWFudWFsbHkgdW5zZXQgdGhlIGJpdCB0bworCXRlbGwgZ2l0IHdoZW4geW91IGNoYW5nZSB0aGUgd29ya2luZyB0cmVlIGZpbGUuIFRoaXMgaXMKKwlzb21ldGltZXMgaGVscGZ1bCB3aGVuIHdvcmtpbmcgd2l0aCBhIGJpZyBwcm9qZWN0IG9uIGEKKwlmaWxlc3lzdGVtIHRoYXQgaGFzIHZlcnkgc2xvdyBsc3RhdCgyKSBzeXN0ZW0gY2FsbAorCShlLmcuIGNpZnMpLgorCistLWFnYWluOjoKKwlSdW5zIGBnaXQtdXBkYXRlLWluZGV4YCBpdHNlbGYgb24gdGhlIHBhdGhzIHdob3NlIGluZGV4CisJZW50cmllcyBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2UgZnJvbSB0aGUgYEhFQURgIGNvbW1pdC4KKworLS11bnJlc29sdmU6OgorCVJlc3RvcmVzIHRoZSAndW5tZXJnZWQnIG9yICduZWVkcyB1cGRhdGluZycgc3RhdGUgb2YgYQorCWZpbGUgZHVyaW5nIGEgbWVyZ2UgaWYgaXQgd2FzIGNsZWFyZWQgYnkgYWNjaWRlbnQuCisKKy0taW5mby1vbmx5OjoKKwlEbyBub3QgY3JlYXRlIG9iamVjdHMgaW4gdGhlIG9iamVjdCBkYXRhYmFzZSBmb3IgYWxsCisJPGZpbGU+IGFyZ3VtZW50cyB0aGF0IGZvbGxvdyB0aGlzIGZsYWc7IGp1c3QgaW5zZXJ0CisJdGhlaXIgb2JqZWN0IElEcyBpbnRvIHRoZSBpbmRleC4KKworLS1mb3JjZS1yZW1vdmU6OgorCVJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleCBldmVuIHdoZW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisJc3RpbGwgaGFzIHN1Y2ggYSBmaWxlLiAoSW1wbGllcyAtLXJlbW92ZS4pCisKKy0tcmVwbGFjZTo6CisJQnkgZGVmYXVsdCwgd2hlbiBhIGZpbGUgYHBhdGhgIGV4aXN0cyBpbiB0aGUgaW5kZXgsCisJZ2l0LXVwZGF0ZS1pbmRleCByZWZ1c2VzIGFuIGF0dGVtcHQgdG8gYWRkIGBwYXRoL2ZpbGVgLgorCVNpbWlsYXJseSBpZiBhIGZpbGUgYHBhdGgvZmlsZWAgZXhpc3RzLCBhIGZpbGUgYHBhdGhgCisJY2Fubm90IGJlIGFkZGVkLiAgV2l0aCAtLXJlcGxhY2UgZmxhZywgZXhpc3RpbmcgZW50cmllcworCXRoYXQgY29uZmxpY3RzIHdpdGggdGhlIGVudHJ5IGJlaW5nIGFkZGVkIGFyZQorCWF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aXRoIHdhcm5pbmcgbWVzc2FnZXMuCisKKy0tc3RkaW46OgorCUluc3RlYWQgb2YgdGFraW5nIGxpc3Qgb2YgcGF0aHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLAorCXJlYWQgbGlzdCBvZiBwYXRocyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dC4gIFBhdGhzIGFyZQorCXNlcGFyYXRlZCBieSBMRiAoaS5lLiBvbmUgcGF0aCBwZXIgbGluZSkgYnkgZGVmYXVsdC4KKworLS12ZXJib3NlOjoKKyAgICAgICAgUmVwb3J0IHdoYXQgaXMgYmVpbmcgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSBpbmRleC4KKworLXo6OgorCU9ubHkgbWVhbmluZ2Z1bCB3aXRoIGAtLXN0ZGluYDsgcGF0aHMgYXJlIHNlcGFyYXRlZCB3aXRoCisJTlVMIGNoYXJhY3RlciBpbnN0ZWFkIG9mIExGLgorCitcLS06OgorCURvIG5vdCBpbnRlcnByZXQgYW55IG1vcmUgYXJndW1lbnRzIGFzIG9wdGlvbnMuCisKKzxmaWxlPjo6CisJRmlsZXMgdG8gYWN0IG9uLgorCU5vdGUgdGhhdCBmaWxlcyBiZWdpbm5pbmcgd2l0aCAnLicgYXJlIGRpc2NhcmRlZC4gVGhpcyBpbmNsdWRlcworCWAuL2ZpbGVgIGFuZCBgZGlyLy4vZmlsZWAuIElmIHlvdSBkb24ndCB3YW50IHRoaXMsIHRoZW4gdXNlCQorCWNsZWFuZXIgbmFtZXMuCisJVGhlIHNhbWUgYXBwbGllcyB0byBkaXJlY3RvcmllcyBlbmRpbmcgJy8nIGFuZCBwYXRocyB3aXRoICcvLycKKworVXNpbmcgLS1yZWZyZXNoCistLS0tLS0tLS0tLS0tLS0KKyctLXJlZnJlc2gnIGRvZXMgbm90IGNhbGN1bGF0ZSBhIG5ldyBzaGExIGZpbGUgb3IgYnJpbmcgdGhlIGluZGV4Cit1cC10by1kYXRlIGZvciBtb2RlL2NvbnRlbnQgY2hhbmdlcy4gQnV0IHdoYXQgaXQgKmRvZXMqIGRvIGlzIHRvCisicmUtbWF0Y2giIHRoZSBzdGF0IGluZm9ybWF0aW9uIG9mIGEgZmlsZSB3aXRoIHRoZSBpbmRleCwgc28gdGhhdCB5b3UKK2NhbiByZWZyZXNoIHRoZSBpbmRleCBmb3IgYSBmaWxlIHRoYXQgaGFzbid0IGJlZW4gY2hhbmdlZCBidXQgd2hlcmUKK3RoZSBzdGF0IGVudHJ5IGlzIG91dCBvZiBkYXRlLgorCitGb3IgZXhhbXBsZSwgeW91J2Qgd2FudCB0byBkbyB0aGlzIGFmdGVyIGRvaW5nIGEgImdpdC1yZWFkLXRyZWUiLCB0byBsaW5rCit1cCB0aGUgc3RhdCBpbmRleCBkZXRhaWxzIHdpdGggdGhlIHByb3BlciBmaWxlcy4KKworVXNpbmcgLS1jYWNoZWluZm8gb3IgLS1pbmZvLW9ubHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisnLS1jYWNoZWluZm8nIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBmaWxlIHRoYXQgaXMgbm90IGluIHRoZQorY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZnVsIGZvciBtaW5pbXVtLWNoZWNrb3V0CittZXJnaW5nLgorCitUbyBwcmV0ZW5kIHlvdSBoYXZlIGEgZmlsZSB3aXRoIG1vZGUgYW5kIHNoYTEgYXQgcGF0aCwgc2F5OgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC11cGRhdGUtaW5kZXggLS1jYWNoZWluZm8gbW9kZSBzaGExIHBhdGgKKy0tLS0tLS0tLS0tLS0tLS0KKworJy0taW5mby1vbmx5JyBpcyB1c2VkIHRvIHJlZ2lzdGVyIGZpbGVzIHdpdGhvdXQgcGxhY2luZyB0aGVtIGluIHRoZSBvYmplY3QKK2RhdGFiYXNlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHN0YXR1cy1vbmx5IHJlcG9zaXRvcmllcy4KKworQm90aCAnLS1jYWNoZWluZm8nIGFuZCAnLS1pbmZvLW9ubHknIGJlaGF2ZSBzaW1pbGFybHk6IHRoZSBpbmRleCBpcyB1cGRhdGVkCitidXQgdGhlIG9iamVjdCBkYXRhYmFzZSBpc24ndC4gICctLWNhY2hlaW5mbycgaXMgdXNlZnVsIHdoZW4gdGhlIG9iamVjdCBpcworaW4gdGhlIGRhdGFiYXNlIGJ1dCB0aGUgZmlsZSBpc24ndCBhdmFpbGFibGUgbG9jYWxseS4gICctLWluZm8tb25seScgaXMKK3VzZWZ1bCB3aGVuIHRoZSBmaWxlIGlzIGF2YWlsYWJsZSwgYnV0IHlvdSBkbyBub3Qgd2lzaCB0byB1cGRhdGUgdGhlCitvYmplY3QgZGF0YWJhc2UuCisKKworVXNpbmcgLS1pbmRleC1pbmZvCistLS0tLS0tLS0tLS0tLS0tLS0KKworYC0taW5kZXgtaW5mb2AgaXMgYSBtb3JlIHBvd2VyZnVsIG1lY2hhbmlzbSB0aGF0IGxldHMgeW91IGZlZWQKK211bHRpcGxlIGVudHJ5IGRlZmluaXRpb25zIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LCBhbmQgZGVzaWduZWQKK3NwZWNpZmljYWxseSBmb3Igc2NyaXB0cy4gIEl0IGNhbiB0YWtlIGlucHV0cyBvZiB0aHJlZSBmb3JtYXRzOgorCisgICAgLiBtb2RlICAgICAgICAgU1Agc2hhMSAgICAgICAgICBUQUIgcGF0aAorKworVGhlIGZpcnN0IGZvcm1hdCBpcyB3aGF0ICJnaXQtYXBwbHkgLS1pbmRleC1pbmZvIgorcmVwb3J0cywgYW5kIHVzZWQgdG8gcmVjb25zdHJ1Y3QgYSBwYXJ0aWFsIHRyZWUKK3RoYXQgaXMgdXNlZCBmb3IgcGhvbnkgbWVyZ2UgYmFzZSB0cmVlIHdoZW4gZmFsbGluZworYmFjayBvbiAzLXdheSBtZXJnZS4KKworICAgIC4gbW9kZSBTUCB0eXBlIFNQIHNoYTEgICAgICAgICAgVEFCIHBhdGgKKysKK1RoZSBzZWNvbmQgZm9ybWF0IGlzIHRvIHN0dWZmIGdpdC1scy10cmVlIG91dHB1dAoraW50byB0aGUgaW5kZXggZmlsZS4KKworICAgIC4gbW9kZSAgICAgICAgIFNQIHNoYTEgU1Agc3RhZ2UgVEFCIHBhdGgKKysKK1RoaXMgZm9ybWF0IGlzIHRvIHB1dCBoaWdoZXIgb3JkZXIgc3RhZ2VzIGludG8gdGhlCitpbmRleCBmaWxlIGFuZCBtYXRjaGVzIGdpdC1scy1maWxlcyAtLXN0YWdlIG91dHB1dC4KKworVG8gcGxhY2UgYSBoaWdoZXIgc3RhZ2UgZW50cnkgdG8gdGhlIGluZGV4LCB0aGUgcGF0aCBzaG91bGQKK2ZpcnN0IGJlIHJlbW92ZWQgYnkgZmVlZGluZyBhIG1vZGU9MCBlbnRyeSBmb3IgdGhlIHBhdGgsIGFuZAordGhlbiBmZWVkaW5nIG5lY2Vzc2FyeSBpbnB1dCBsaW5lcyBpbiB0aGUgdGhpcmQgZm9ybWF0LgorCitGb3IgZXhhbXBsZSwgc3RhcnRpbmcgd2l0aCB0aGlzIGluZGV4OgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGxzLWZpbGVzIC1zCisxMDA2NDQgOGExMjE4YTEwMjRhMjEyYmIzZGIzMGJlY2Q4NjAzMTVmOWYzYWM1MiAwICAgICAgIGZyb3R6CistLS0tLS0tLS0tLS0KKworeW91IGNhbiBmZWVkIHRoZSBmb2xsb3dpbmcgaW5wdXQgdG8gYC0taW5kZXgtaW5mb2A6CisKKy0tLS0tLS0tLS0tLQorJCBnaXQgdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbworMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCWZyb3R6CisxMDA2NDQgOGExMjE4YTEwMjRhMjEyYmIzZGIzMGJlY2Q4NjAzMTVmOWYzYWM1MiAxCWZyb3R6CisxMDA3NTUgOGExMjE4YTEwMjRhMjEyYmIzZGIzMGJlY2Q4NjAzMTVmOWYzYWM1MiAyCWZyb3R6CistLS0tLS0tLS0tLS0KKworVGhlIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZlZWRzIDAgYXMgdGhlIG1vZGUgdG8gcmVtb3ZlIHRoZQorcGF0aDsgdGhlIFNIQTEgZG9lcyBub3QgbWF0dGVyIGFzIGxvbmcgYXMgaXQgaXMgd2VsbCBmb3JtYXR0ZWQuCitUaGVuIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGxpbmUgZmVlZHMgc3RhZ2UgMSBhbmQgc3RhZ2UgMiBlbnRyaWVzCitmb3IgdGhhdCBwYXRoLiAgQWZ0ZXIgdGhlIGFib3ZlLCB3ZSB3b3VsZCBlbmQgdXAgd2l0aCB0aGlzOgorCistLS0tLS0tLS0tLS0KKyQgZ2l0IGxzLWZpbGVzIC1zCisxMDA2NDQgOGExMjE4YTEwMjRhMjEyYmIzZGIzMGJlY2Q4NjAzMTVmOWYzYWM1MiAxCWZyb3R6CisxMDA3NTUgOGExMjE4YTEwMjRhMjEyYmIzZGIzMGJlY2Q4NjAzMTVmOWYzYWM1MiAyCWZyb3R6CistLS0tLS0tLS0tLS0KKworCitVc2luZyAiYXNzdW1lIHVuY2hhbmdlZCIgYml0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbnkgb3BlcmF0aW9ucyBpbiBnaXQgZGVwZW5kIG9uIHlvdXIgZmlsZXN5c3RlbSB0byBoYXZlIGFuCitlZmZpY2llbnQgYGxzdGF0KDIpYCBpbXBsZW1lbnRhdGlvbiwgc28gdGhhdCBgc3RfbXRpbWVgCitpbmZvcm1hdGlvbiBmb3Igd29ya2luZyB0cmVlIGZpbGVzIGNhbiBiZSBjaGVhcGx5IGNoZWNrZWQgdG8gc2VlCitpZiB0aGUgZmlsZSBjb250ZW50cyBoYXZlIGNoYW5nZWQgZnJvbSB0aGUgdmVyc2lvbiByZWNvcmRlZCBpbgordGhlIGluZGV4IGZpbGUuICBVbmZvcnR1bmF0ZWx5LCBzb21lIGZpbGVzeXN0ZW1zIGhhdmUKK2luZWZmaWNpZW50IGBsc3RhdCgyKWAuICBJZiB5b3VyIGZpbGVzeXN0ZW0gaXMgb25lIG9mIHRoZW0sIHlvdQorY2FuIHNldCAiYXNzdW1lIHVuY2hhbmdlZCIgYml0IHRvIHBhdGhzIHlvdSBoYXZlIG5vdCBjaGFuZ2VkIHRvCitjYXVzZSBnaXQgbm90IHRvIGRvIHRoaXMgY2hlY2suICBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIGJpdCBvbiBhCitwYXRoIGRvZXMgbm90IG1lYW4gZ2l0IHdpbGwgY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHRvCitzZWUgaWYgaXQgaGFzIGNoYW5nZWQgLS0gaXQgbWFrZXMgZ2l0IHRvIG9taXQgYW55IGNoZWNraW5nIGFuZAorYXNzdW1lIGl0IGhhcyAqbm90KiBjaGFuZ2VkLiAgV2hlbiB5b3UgbWFrZSBjaGFuZ2VzIHRvIHdvcmtpbmcKK3RyZWUgZmlsZXMsIHlvdSBoYXZlIHRvIGV4cGxpY2l0bHkgdGVsbCBnaXQgYWJvdXQgaXQgYnkgZHJvcHBpbmcKKyJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQsIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgeW91IG1vZGlmeSB0aGVtLgorCitJbiBvcmRlciB0byBzZXQgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCwgdXNlIGAtLWFzc3VtZS11bmNoYW5nZWRgCitvcHRpb24uICBUbyB1bnNldCwgdXNlIGAtLW5vLWFzc3VtZS11bmNoYW5nZWRgLgorCitUaGUgY29tbWFuZCBsb29rcyBhdCBgY29yZS5pZ25vcmVzdGF0YCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiAgV2hlbgordGhpcyBpcyB0cnVlLCBwYXRocyB1cGRhdGVkIHdpdGggYGdpdC11cGRhdGUtaW5kZXggcGF0aHMuLi5gIGFuZAorcGF0aHMgdXBkYXRlZCB3aXRoIG90aGVyIGdpdCBjb21tYW5kcyB0aGF0IHVwZGF0ZSBib3RoIGluZGV4IGFuZAord29ya2luZyB0cmVlIChlLmcuIGBnaXQtYXBwbHkgLS1pbmRleGAsIGBnaXQtY2hlY2tvdXQtaW5kZXggLXVgLAorYW5kIGBnaXQtcmVhZC10cmVlIC11YCkgYXJlIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzICJhc3N1bWUKK3VuY2hhbmdlZCIuICBOb3RlIHRoYXQgImFzc3VtZSB1bmNoYW5nZWQiIGJpdCBpcyAqbm90KiBzZXQgaWYKK2BnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaGAgZmluZHMgdGhlIHdvcmtpbmcgdHJlZSBmaWxlIG1hdGNoZXMKK3RoZSBpbmRleCAodXNlIGBnaXQtdXBkYXRlLWluZGV4IC0tcmVhbGx5LXJlZnJlc2hgIGlmIHlvdSB3YW50Cit0byBtYXJrIHRoZW0gYXMgImFzc3VtZSB1bmNoYW5nZWQiKS4KKworCitFeGFtcGxlcworLS0tLS0tLS0KK1RvIHVwZGF0ZSBhbmQgcmVmcmVzaCBvbmx5IHRoZSBmaWxlcyBhbHJlYWR5IGNoZWNrZWQgb3V0OgorCistLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jaGVja291dC1pbmRleCAtbiAtZiAtYSAmJiBnaXQtdXBkYXRlLWluZGV4IC0taWdub3JlLW1pc3NpbmcgLS1yZWZyZXNoCistLS0tLS0tLS0tLS0tLS0tCisKK09uIGFuIGluZWZmaWNpZW50IGZpbGVzeXN0ZW0gd2l0aCBgY29yZS5pZ25vcmVzdGF0YCBzZXQ6OgorKworLS0tLS0tLS0tLS0tCiskIGdpdCB1cGRhdGUtaW5kZXggLS1yZWFsbHktcmVmcmVzaCAgICAgICAgICAgICAgPDE+CiskIGdpdCB1cGRhdGUtaW5kZXggLS1uby1hc3N1bWUtdW5jaGFuZ2VkIGZvby5jICAgPDI+CiskIGdpdCBkaWZmIC0tbmFtZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgPDM+CiskIGVkaXQgZm9vLmMKKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8ND4KK00gZm9vLmMKKyQgZ2l0IHVwZGF0ZS1pbmRleCBmb28uYyAgICAgICAgICAgICAgICAgICAgICAgICA8NT4KKyQgZ2l0IGRpZmYgLS1uYW1lLW9ubHkgICAgICAgICAgICAgICAgICAgICAgICAgICA8Nj4KKyQgZWRpdCBmb28uYworJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw3PgorJCBnaXQgdXBkYXRlLWluZGV4IC0tbm8tYXNzdW1lLXVuY2hhbmdlZCBmb28uYyAgIDw4PgorJCBnaXQgZGlmZiAtLW5hbWUtb25seSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw5PgorTSBmb28uYworLS0tLS0tLS0tLS0tCisrCis8MT4gZm9yY2VzIGxzdGF0KDIpIHRvIHNldCAiYXNzdW1lIHVuY2hhbmdlZCIgYml0cyBmb3IgcGF0aHMgdGhhdCBtYXRjaCBpbmRleC4KKzwyPiBtYXJrIHRoZSBwYXRoIHRvIGJlIGVkaXRlZC4KKzwzPiB0aGlzIGRvZXMgbHN0YXQoMikgYW5kIGZpbmRzIGluZGV4IG1hdGNoZXMgdGhlIHBhdGguCis8ND4gdGhpcyBkb2VzIGxzdGF0KDIpIGFuZCBmaW5kcyBpbmRleCBkb2VzICpub3QqIG1hdGNoIHRoZSBwYXRoLgorPDU+IHJlZ2lzdGVyaW5nIHRoZSBuZXcgdmVyc2lvbiB0byBpbmRleCBzZXRzICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQuCis8Nj4gYW5kIGl0IGlzIGFzc3VtZWQgdW5jaGFuZ2VkLgorPDc+IGV2ZW4gYWZ0ZXIgeW91IGVkaXQgaXQuCis8OD4geW91IGNhbiB0ZWxsIGFib3V0IHRoZSBjaGFuZ2UgYWZ0ZXIgdGhlIGZhY3QuCis8OT4gbm93IGl0IGNoZWNrcyB3aXRoIGxzdGF0KDIpIGFuZCBmaW5kcyBpdCBoYXMgYmVlbiBjaGFuZ2VkLgorCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworVGhlIGNvbW1hbmQgaG9ub3JzIGBjb3JlLmZpbGVtb2RlYCBjb25maWd1cmF0aW9uIHZhcmlhYmxlLiAgSWYKK3lvdXIgcmVwb3NpdG9yeSBpcyBvbiBhbiBmaWxlc3lzdGVtIHdob3NlIGV4ZWN1dGFibGUgYml0cyBhcmUKK3VucmVsaWFibGUsIHRoaXMgc2hvdWxkIGJlIHNldCB0byAnZmFsc2UnIChzZWUgZ2l0bGluazpnaXQtcmVwby1jb25maWdbMV0pLgorVGhpcyBjYXVzZXMgdGhlIGNvbW1hbmQgdG8gaWdub3JlIGRpZmZlcmVuY2VzIGluIGZpbGUgbW9kZXMgcmVjb3JkZWQKK2luIHRoZSBpbmRleCBhbmQgdGhlIGZpbGUgbW9kZSBvbiB0aGUgZmlsZXN5c3RlbSBpZiB0aGV5IGRpZmZlciBvbmx5IG9uCitleGVjdXRhYmxlIGJpdC4gICBPbiBzdWNoIGFuIHVuZm9ydHVuYXRlIGZpbGVzeXN0ZW0sIHlvdSBtYXkKK25lZWQgdG8gdXNlIGBnaXQtdXBkYXRlLWluZGV4IC0tY2htb2Q9YC4KKworVGhlIGNvbW1hbmQgbG9va3MgYXQgYGNvcmUuaWdub3Jlc3RhdGAgY29uZmlndXJhdGlvbiB2YXJpYWJsZS4gIFNlZQorJ1VzaW5nICJhc3N1bWUgdW5jaGFuZ2VkIiBiaXQnIHNlY3Rpb24gYWJvdmUuCisKKworU2VlIEFsc28KKy0tLS0tLS0tCitnaXRsaW5rOmdpdC1yZXBvLWNvbmZpZ1sxXQorCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtcmVmLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1yZWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNjIwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtcmVmLnR4dApAQCAtMCwwICsxLDg0IEBACitnaXQtdXBkYXRlLXJlZigxKQorPT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwZGF0ZS1yZWYgLSB1cGRhdGUgdGhlIG9iamVjdCBuYW1lIHN0b3JlZCBpbiBhIHJlZiBzYWZlbHkKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVwZGF0ZS1yZWYnIFstbSA8cmVhc29uPl0gPHJlZj4gPG5ld3ZhbHVlPiBbPG9sZHZhbHVlPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitHaXZlbiB0d28gYXJndW1lbnRzLCBzdG9yZXMgdGhlIDxuZXd2YWx1ZT4gaW4gdGhlIDxyZWY+LCBwb3NzaWJseQorZGVyZWZlcmVuY2luZyB0aGUgc3ltYm9saWMgcmVmcy4gIEUuZy4gYGdpdC11cGRhdGUtcmVmIEhFQUQKKzxuZXd2YWx1ZT5gIHVwZGF0ZXMgdGhlIGN1cnJlbnQgYnJhbmNoIGhlYWQgdG8gdGhlIG5ldyBvYmplY3QuCisKK0dpdmVuIHRocmVlIGFyZ3VtZW50cywgc3RvcmVzIHRoZSA8bmV3dmFsdWU+IGluIHRoZSA8cmVmPiwKK3Bvc3NpYmx5IGRlcmVmZXJlbmNpbmcgdGhlIHN5bWJvbGljIHJlZnMsIGFmdGVyIHZlcmlmeWluZyB0aGF0Cit0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgPHJlZj4gbWF0Y2hlcyA8b2xkdmFsdWU+LgorRS5nLiBgZ2l0LXVwZGF0ZS1yZWYgcmVmcy9oZWFkcy9tYXN0ZXIgPG5ld3ZhbHVlPiA8b2xkdmFsdWU+YAordXBkYXRlcyB0aGUgbWFzdGVyIGJyYW5jaCBoZWFkIHRvIDxuZXd2YWx1ZT4gb25seSBpZiBpdHMgY3VycmVudAordmFsdWUgaXMgPG9sZHZhbHVlPi4KKworSXQgYWxzbyBhbGxvd3MgYSAicmVmIiBmaWxlIHRvIGJlIGEgc3ltYm9saWMgcG9pbnRlciB0byBhbm90aGVyCityZWYgZmlsZSBieSBzdGFydGluZyB3aXRoIHRoZSBmb3VyLWJ5dGUgaGVhZGVyIHNlcXVlbmNlIG9mCisicmVmOiIuCisKK01vcmUgaW1wb3J0YW50bHksIGl0IGFsbG93cyB0aGUgdXBkYXRlIG9mIGEgcmVmIGZpbGUgdG8gZm9sbG93Cit0aGVzZSBzeW1ib2xpYyBwb2ludGVycywgd2hldGhlciB0aGV5IGFyZSBzeW1saW5rcyBvciB0aGVzZQorInJlZ3VsYXIgZmlsZSBzeW1ib2xpYyByZWZzIi4gIEl0IGZvbGxvd3MgKnJlYWwqIHN5bWxpbmtzIG9ubHkKK2lmIHRoZXkgc3RhcnQgd2l0aCAicmVmcy8iOiBvdGhlcndpc2UgaXQgd2lsbCBqdXN0IHRyeSB0byByZWFkCit0aGVtIGFuZCB1cGRhdGUgdGhlbSBhcyBhIHJlZ3VsYXIgZmlsZSAoaS5lLiBpdCB3aWxsIGFsbG93IHRoZQorZmlsZXN5c3RlbSB0byBmb2xsb3cgdGhlbSwgYnV0IHdpbGwgb3ZlcndyaXRlIHN1Y2ggYSBzeW1saW5rIHRvCitzb21ld2hlcmUgZWxzZSB3aXRoIGEgcmVndWxhciBmaWxlbmFtZSkuCisKK0luIGdlbmVyYWwsIHVzaW5nCisKKwlnaXQtdXBkYXRlLXJlZiBIRUFEICIkaGVhZCIKKworc2hvdWxkIGJlIGEgX2xvdF8gc2FmZXIgdGhhbiBkb2luZworCisJZWNobyAiJGhlYWQiID4gIiRHSVRfRElSL0hFQUQiCisKK2JvdGggZnJvbSBhIHN5bWxpbmsgZm9sbG93aW5nIHN0YW5kcG9pbnQgKmFuZCogYW4gZXJyb3IgY2hlY2tpbmcKK3N0YW5kcG9pbnQuICBUaGUgInJlZnMvIiBydWxlIGZvciBzeW1saW5rcyBtZWFucyB0aGF0IHN5bWxpbmtzCit0aGF0IHBvaW50IHRvICJvdXRzaWRlIiB0aGUgdHJlZSBhcmUgc2FmZTogdGhleSdsbCBiZSBmb2xsb3dlZAorZm9yIHJlYWRpbmcgYnV0IG5vdCBmb3Igd3JpdGluZyAoc28gd2UnbGwgbmV2ZXIgd3JpdGUgdGhyb3VnaCBhCityZWYgc3ltbGluayB0byBzb21lIG90aGVyIHRyZWUsIGlmIHlvdSBoYXZlIGNvcGllZCBhIHdob2xlCithcmNoaXZlIGJ5IGNyZWF0aW5nIGEgc3ltbGluayB0cmVlKS4KKworTG9nZ2luZyBVcGRhdGVzCistLS0tLS0tLS0tLS0tLS0KK0lmIGNvbmZpZyBwYXJhbWV0ZXIgImNvcmUubG9nQWxsUmVmVXBkYXRlcyIgaXMgdHJ1ZSBvciB0aGUgZmlsZQorIiRHSVRfRElSL2xvZ3MvPHJlZj4iIGV4aXN0cyB0aGVuIGBnaXQtdXBkYXRlLXJlZmAgd2lsbCBhcHBlbmQKK2EgbGluZSB0byB0aGUgbG9nIGZpbGUgIiRHSVRfRElSL2xvZ3MvPHJlZj4iIChkZXJlZmVyZW5jaW5nIGFsbAorc3ltYm9saWMgcmVmcyBiZWZvcmUgY3JlYXRpbmcgdGhlIGxvZyBuYW1lKSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKK2luIHJlZiB2YWx1ZS4gIExvZyBsaW5lcyBhcmUgZm9ybWF0dGVkIGFzOgorCisgICAgLiBvbGRzaGExIFNQIG5ld3NoYTEgU1AgY29tbWl0dGVyIExGCisrCitXaGVyZSAib2xkc2hhMSIgaXMgdGhlIDQwIGNoYXJhY3RlciBoZXhhZGVjaW1hbCB2YWx1ZSBwcmV2aW91c2x5CitzdG9yZWQgaW4gPHJlZj4sICJuZXdzaGExIiBpcyB0aGUgNDAgY2hhcmFjdGVyIGhleGFkZWNpbWFsIHZhbHVlIG9mCis8bmV3dmFsdWU+IGFuZCAiY29tbWl0dGVyIiBpcyB0aGUgY29tbWl0dGVyJ3MgbmFtZSwgZW1haWwgYWRkcmVzcworYW5kIGRhdGUgaW4gdGhlIHN0YW5kYXJkIEdJVCBjb21taXR0ZXIgaWRlbnQgZm9ybWF0LgorCitPcHRpb25hbGx5IHdpdGggLW06CisKKyAgICAuIG9sZHNoYTEgU1AgbmV3c2hhMSBTUCBjb21taXR0ZXIgVEFCIG1lc3NhZ2UgTEYKKysKK1doZXJlIGFsbCBmaWVsZHMgYXJlIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgIm1lc3NhZ2UiIGlzIHRoZQordmFsdWUgc3VwcGxpZWQgdG8gdGhlIC1tIG9wdGlvbi4KKworQW4gdXBkYXRlIHdpbGwgZmFpbCAod2l0aG91dCBjaGFuZ2luZyA8cmVmPikgaWYgdGhlIGN1cnJlbnQgdXNlciBpcwordW5hYmxlIHRvIGNyZWF0ZSBhIG5ldyBsb2cgZmlsZSwgYXBwZW5kIHRvIHRoZSBleGlzdGluZyBsb2cgZmlsZQorb3IgZG9lcyBub3QgaGF2ZSBjb21taXR0ZXIgaW5mb3JtYXRpb24gYXZhaWxhYmxlLgorCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mby50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtc2VydmVyLWluZm8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YTAzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGRhdGUtc2VydmVyLWluZm8udHh0CkBAIC0wLDAgKzEsNTggQEAKK2dpdC11cGRhdGUtc2VydmVyLWluZm8oMSkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbyAtIFVwZGF0ZSBhdXhpbGlhcnkgaW5mbyBmaWxlIHRvIGhlbHAgZHVtYiBzZXJ2ZXJzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbycgWy0tZm9yY2VdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorQSBkdW1iIHNlcnZlciB0aGF0IGRvZXMgbm90IGRvIG9uLXRoZS1mbHkgcGFjayBnZW5lcmF0aW9ucyBtdXN0CitoYXZlIHNvbWUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGZpbGVzIGluICRHSVRfRElSL2luZm8gYW5kCiskR0lUX09CSkVDVF9ESVJFQ1RPUlkvaW5mbyBkaXJlY3RvcmllcyB0byBoZWxwIGNsaWVudHMgZGlzY292ZXIKK3doYXQgcmVmZXJlbmNlcyBhbmQgcGFja3MgdGhlIHNlcnZlciBoYXMuICBUaGlzIGNvbW1hbmQKK2dlbmVyYXRlcyBzdWNoIGF1eGlsaWFyeSBmaWxlcy4KKworCitPUFRJT05TCistLS0tLS0tCisKKy1mfC0tZm9yY2U6OgorCVVwZGF0ZSB0aGUgaW5mbyBmaWxlcyBmcm9tIHNjcmF0Y2guCisKKworT1VUUFVUCistLS0tLS0KKworQ3VycmVudGx5IHRoZSBjb21tYW5kIHVwZGF0ZXMgdGhlIGZvbGxvd2luZyBmaWxlcy4gIFBsZWFzZSBzZWUKK2xpbms6cmVwb3NpdG9yeS1sYXlvdXQuaHRtbFtyZXBvc2l0b3J5LWxheW91dF0gZm9yIGRlc2NyaXB0aW9uCitvZiB3aGF0IHRoZXkgYXJlIGZvcjoKKworKiBvYmplY3RzL2luZm8vcGFja3MKKworKiBpbmZvL3JlZnMKKworCitCVUdTCistLS0tCitXaGVuIHlvdSByZW1vdmUgYW4gZXhpc3RpbmcgcmVmLCB0aGUgY29tbWFuZCBmYWlscyB0byB1cGRhdGUKK2luZm8vcmVmcyBmaWxlIHVubGVzcyBgLS1mb3JjZWAgZmxhZyBpcyBnaXZlbi4KKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vLgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYzkzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGxvYWQtcGFjay50eHQKQEAgLTAsMCArMSwzOSBAQAorZ2l0LXVwbG9hZC1wYWNrKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXVwbG9hZC1wYWNrIC0gU2VuZCBtaXNzaW5nIG9iamVjdHMgcGFja2VkCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXVwbG9hZC1wYWNrJyA8ZGlyZWN0b3J5PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ludm9rZWQgYnkgJ2dpdC1mZXRjaC1wYWNrJywgbGVhcm5zIHdoYXQKK29iamVjdHMgdGhlIG90aGVyIHNpZGUgaXMgbWlzc2luZywgYW5kIHNlbmRzIHRoZW0gYWZ0ZXIgcGFja2luZy4KKworVGhpcyBjb21tYW5kIGlzIHVzdWFsbHkgbm90IGludm9rZWQgZGlyZWN0bHkgYnkgdGhlIGVuZCB1c2VyLgorVGhlIFVJIGZvciB0aGUgcHJvdG9jb2wgaXMgb24gdGhlICdnaXQtZmV0Y2gtcGFjaycgc2lkZSwgYW5kIHRoZQorcHJvZ3JhbSBwYWlyIGlzIG1lYW50IHRvIGJlIHVzZWQgdG8gcHVsbCB1cGRhdGVzIGZyb20gYSByZW1vdGUKK3JlcG9zaXRvcnkuICBGb3IgcHVzaCBvcGVyYXRpb25zLCBzZWUgJ2dpdC1zZW5kLXBhY2snLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxkaXJlY3Rvcnk+OjoKKwlUaGUgcmVwb3NpdG9yeSB0byBzeW5jIGZyb20uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0RvY3VtZW50YXRpb24gYnkgSnVuaW8gQyBIYW1hbm8uCisKK0dJVAorLS0tCitQYXJ0IG9mIHRoZSBnaXRsaW5rOmdpdFs3XSBzdWl0ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLXRhci50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC11cGxvYWQtdGFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTRhZjYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdXBsb2FkLXRhci50eHQKQEAgLTAsMCArMSwzOSBAQAorZ2l0LXVwbG9hZC10YXIoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC11cGxvYWQtdGFyIC0gU2VuZCB0YXIgYXJjaGl2ZQorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC11cGxvYWQtdGFyJyA8ZGlyZWN0b3J5PgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0ludm9rZWQgYnkgJ2dpdC10YXItdHJlZSAtLXJlbW90ZScgYW5kIHNlbmRzIGEgZ2VuZXJhdGVkIHRhciBhcmNoaXZlCit0byB0aGUgb3RoZXIgZW5kIG92ZXIgdGhlIGdpdCBwcm90b2NvbC4KKworVGhpcyBjb21tYW5kIGlzIHVzdWFsbHkgbm90IGludm9rZWQgZGlyZWN0bHkgYnkgdGhlIGVuZCB1c2VyLgorVGhlIFVJIGZvciB0aGUgcHJvdG9jb2wgaXMgb24gdGhlICdnaXQtdGFyLXRyZWUnIHNpZGUsIGFuZCB0aGUKK3Byb2dyYW0gcGFpciBpcyBtZWFudCB0byBiZSB1c2VkIHRvIGdldCBhIHRhciBhcmNoaXZlIGZyb20gYQorcmVtb3RlIHJlcG9zaXRvcnkuCisKKworT1BUSU9OUworLS0tLS0tLQorPGRpcmVjdG9yeT46OgorCVRoZSByZXBvc2l0b3J5IHRvIGdldCBhIHRhciBhcmNoaXZlIGZyb20uCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEp1bmlvIEMgSGFtYW5vIDxqdW5pb0BrZXJuZWwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFuby4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC12YXIudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdmFyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIxYTBkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdmFyLnR4dApAQCAtMCwwICsxLDY1IEBACitnaXQtdmFyKDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC12YXIgLSBQcmludCB0aGUgZ2l0IHVzZXJzIGlkZW50aXR5CisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXZhcicgWyAtbCB8IDx2YXJpYWJsZT4gXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1ByaW50cyBhIGdpdCBsb2dpY2FsIHZhcmlhYmxlLgorCitPUFRJT05TCistLS0tLS0tCistbDo6CisJQ2F1c2UgdGhlIGxvZ2ljYWwgdmFyaWFibGVzIHRvIGJlIGxpc3RlZC4gSW4gYWRkaXRpb24sIGFsbCB0aGUKKwl2YXJpYWJsZXMgb2YgdGhlIGdpdCBjb25maWd1cmF0aW9uIGZpbGUgLmdpdC9jb25maWcgYXJlIGxpc3RlZAorCWFzIHdlbGwuIChIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgbGlzdGluZyBmdW5jdGlvbmFsaXR5CisJaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgZ2l0LXJlcG8tY29uZmlnIC1sYC4pCisKK0VYQU1QTEUKKy0tLS0tLS0tCisJJCBnaXQtdmFyIEdJVF9BVVRIT1JfSURFTlQKKwlFcmljIFcuIEJpZWRlcm1hbiA8ZWJpZWRlcm1AbG54aS5jb20+IDExMjEyMjMyNzggLTA2MDAKKworCitWQVJJQUJMRVMKKy0tLS0tLS0tLS0KK0dJVF9BVVRIT1JfSURFTlQ6OgorICAgIFRoZSBhdXRob3Igb2YgYSBwaWVjZSBvZiBjb2RlLgorCitHSVRfQ09NTUlUVEVSX0lERU5UOjoKKyAgICBUaGUgcGVyc29uIHdobyBwdXQgYSBwaWVjZSBvZiBjb2RlIGludG8gZ2l0LgorCitEaWFnbm9zdGljcworLS0tLS0tLS0tLS0KK1lvdSBkb24ndCBleGlzdC4gR28gYXdheSE6OgorICAgIFRoZSBwYXNzd2QoNSkgZ2Vjb3MgZmllbGQgY291bGRuJ3QgYmUgcmVhZAorWW91ciBwYXJlbnRzIG11c3QgaGF2ZSBoYXRlZCB5b3UhOjoKKyAgICBUaGUgcGFzc3dvcmQoNSkgZ2Vjb3MgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorWW91ciBzeXNhZG1pbiBtdXN0IGhhdGUgeW91ITo6CisgICAgVGhlIHBhc3N3b3JkKDUpIG5hbWUgZmllbGQgaXMgbG9uZ2VyIHRoYW4gYSBnaWFudCBzdGF0aWMgYnVmZmVyLgorCitTZWUgQWxzbworLS0tLS0tLS0KK2dpdGxpbms6Z2l0LWNvbW1pdC10cmVlWzFdCitnaXRsaW5rOmdpdC10YWdbMV0KK2dpdGxpbms6Z2l0LXJlcG8tY29uZmlnWzFdCisKK0F1dGhvcgorLS0tLS0tCitXcml0dGVuIGJ5IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEVyaWMgQmllZGVybWFuIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXBhY2sudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjEzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC12ZXJpZnktcGFjay50eHQKQEAgLTAsMCArMSw1NCBAQAorZ2l0LXZlcmlmeS1wYWNrKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXZlcmlmeS1wYWNrIC0gVmFsaWRhdGUgcGFja2VkIGdpdCBhcmNoaXZlIGZpbGVzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXZlcmlmeS1wYWNrJyBbLXZdIFstLV0gPHBhY2s+LmlkeCAuLi4KKworCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1JlYWRzIGdpdmVuIGlkeCBmaWxlIGZvciBwYWNrZWQgZ2l0IGFyY2hpdmUgY3JlYXRlZCB3aXRoCitnaXQtcGFjay1vYmplY3RzIGNvbW1hbmQgYW5kIHZlcmlmaWVzIGlkeCBmaWxlIGFuZCB0aGUKK2NvcnJlc3BvbmRpbmcgcGFjayBmaWxlLgorCitPUFRJT05TCistLS0tLS0tCis8cGFjaz4uaWR4IC4uLjo6CisJVGhlIGlkeCBmaWxlcyB0byB2ZXJpZnkuCisKKy12OjoKKwlBZnRlciB2ZXJpZnlpbmcgdGhlIHBhY2ssIHNob3cgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5lZAorCWluIHRoZSBwYWNrLgorXC0tOjoKKwlEbyBub3QgaW50ZXJwcmV0IGFueSBtb3JlIGFyZ3VtZW50cyBhcyBvcHRpb25zLgorCitPVVRQVVQgRk9STUFUCistLS0tLS0tLS0tLS0tCitXaGVuIHNwZWNpZnlpbmcgdGhlIC12IG9wdGlvbiB0aGUgZm9ybWF0IHVzZWQgaXM6CisKKwlTSEExIHR5cGUgc2l6ZSBvZmZzZXQtaW4tcGFja2ZpbGUKKworZm9yIG9iamVjdHMgdGhhdCBhcmUgbm90IGRlbHRpZmllZCBpbiB0aGUgcGFjaywgYW5kCisKKwlTSEExIHR5cGUgc2l6ZSBvZmZzZXQtaW4tcGFja2ZpbGUgZGVwdGggYmFzZS1TSEExCisKK2ZvciBvYmplY3RzIHRoYXQgYXJlIGRlbHRpZmllZC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBKdW5pbyBDIEhhbWFubworCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC12ZXJpZnktdGFnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjliZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtdmVyaWZ5LXRhZy50eHQKQEAgLTAsMCArMSwzMiBAQAorZ2l0LXZlcmlmeS10YWcoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC12ZXJpZnktdGFnIC0gQ2hlY2sgdGhlIEdQRyBzaWduYXR1cmUgb2YgdGFnCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdC12ZXJpZnktdGFnJyA8dGFnPgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1ZhbGlkYXRlcyB0aGUgZ3BnIHNpZ25hdHVyZSBjcmVhdGVkIGJ5IGdpdC10YWcuCisKK09QVElPTlMKKy0tLS0tLS0KKzx0YWc+OjoKKwlTSEExIGlkZW50aWZpZXIgb2YgYSBnaXQgdGFnIG9iamVjdC4KKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSmFuIEhhcmtlcyA8amFoYXJrZXNAY3MuY211LmVkdT4gYW5kIEVyaWMgVy4gQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtd2hhdGNoYW5nZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdC13aGF0Y2hhbmdlZC50eHQKQEAgLTAsMCArMSw4MSBAQAorZ2l0LXdoYXRjaGFuZ2VkKDEpCis9PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2l0LXdoYXRjaGFuZ2VkIC0gU2hvdyBsb2dzIHdpdGggZGlmZmVyZW5jZSBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzCisKKworU1lOT1BTSVMKKy0tLS0tLS0tCisnZ2l0LXdoYXRjaGFuZ2VkJyA8b3B0aW9uPi4uLgorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Nob3dzIGNvbW1pdCBsb2dzIGFuZCBkaWZmIG91dHB1dCBlYWNoIGNvbW1pdCBpbnRyb2R1Y2VzLiAgVGhlCitjb21tYW5kIGludGVybmFsbHkgaW52b2tlcyAnZ2l0LXJldi1saXN0JyBwaXBlZCB0bworJ2dpdC1kaWZmLXRyZWUnLCBhbmQgdGFrZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGJvdGggb2YKK3RoZXNlIGNvbW1hbmRzLgorCitUaGlzIG1hbnVhbCBwYWdlIGRlc2NyaWJlcyBvbmx5IHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBvcHRpb25zLgorCisKK09QVElPTlMKKy0tLS0tLS0KKy1wOjoKKwlTaG93IHRleHR1YWwgZGlmZnMsIGluc3RlYWQgb2YgdGhlIGdpdCBpbnRlcm5hbCBkaWZmCisJb3V0cHV0IGZvcm1hdCB0aGF0IGlzIHVzZWZ1bCBvbmx5IHRvIHRlbGwgdGhlIGNoYW5nZWQKKwlwYXRocyBhbmQgdGhlaXIgbmF0dXJlIG9mIGNoYW5nZXMuCisKKy0tbWF4LWNvdW50PTxuPjo6CisJTGltaXQgb3V0cHV0IHRvIDxuPiBjb21taXRzLgorCis8c2luY2U+Li48dW50aWw+OjoKKwlMaW1pdCBvdXRwdXQgdG8gYmV0d2VlbiB0aGUgdHdvIG5hbWVkIGNvbW1pdHMgKGJvdHRvbQorCWV4Y2x1c2l2ZSwgdG9wIGluY2x1c2l2ZSkuCisKKy1yOjoKKwlTaG93IGdpdCBpbnRlcm5hbCBkaWZmIG91dHB1dCwgYnV0IGZvciB0aGUgd2hvbGUgdHJlZSwKKwlub3QganVzdCB0aGUgdG9wIGxldmVsLgorCistLXByZXR0eT08Zm9ybWF0Pjo6CisJQ29udHJvbHMgdGhlIG91dHB1dCBmb3JtYXQgZm9yIHRoZSBjb21taXQgbG9ncy4KKwk8Zm9ybWF0PiBjYW4gYmUgb25lIG9mICdyYXcnLCAnbWVkaXVtJywgJ3Nob3J0JywgJ2Z1bGwnLAorCWFuZCAnb25lbGluZScuCisKKy1tOjoKKwlCeSBkZWZhdWx0LCBkaWZmZXJlbmNlcyBmb3IgbWVyZ2UgY29tbWl0cyBhcmUgbm90IHNob3duLgorCVdpdGggdGhpcyBmbGFnLCBzaG93IGRpZmZlcmVuY2VzIHRvIHRoYXQgY29tbWl0IGZyb20gYWxsCisJb2YgaXRzIHBhcmVudHMuCisrCitIb3dldmVyLCBpdCBpcyBub3QgdmVyeSB1c2VmdWwgaW4gZ2VuZXJhbCwgYWx0aG91Z2ggaXQKKyppcyogdXNlZnVsIG9uIGEgZmlsZS1ieS1maWxlIGJhc2lzLgorCitFeGFtcGxlcworLS0tLS0tLS0KK2dpdC13aGF0Y2hhbmdlZCAtcCB2Mi42LjEyLi4gaW5jbHVkZS9zY3NpIGRyaXZlcnMvc2NzaTo6CisKKwlTaG93IGFzIHBhdGNoZXMgdGhlIGNvbW1pdHMgc2luY2UgdmVyc2lvbiAndjIuNi4xMicgdGhhdCBjaGFuZ2VkCisJYW55IGZpbGUgaW4gdGhlIGluY2x1ZGUvc2NzaSBvciBkcml2ZXJzL3Njc2kgc3ViZGlyZWN0b3JpZXMKKworZ2l0LXdoYXRjaGFuZ2VkIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBcLS0gZ2l0azo6CisKKwlTaG93IHRoZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGFzdCB0d28gd2Vla3MgdG8gdGhlIGZpbGUgJ2dpdGsnLgorCVRoZSAiLS0iIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgKmJyYW5jaCogbmFtZWQKKwknZ2l0aycKKworCitBdXRob3IKKy0tLS0tLQorV3JpdHRlbiBieSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+IGFuZAorSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC13cml0ZS10cmVlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVmYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtd3JpdGUtdHJlZS50eHQKQEAgLTAsMCArMSw1MCBAQAorZ2l0LXdyaXRlLXRyZWUoMSkKKz09PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdC13cml0ZS10cmVlIC0gQ3JlYXRlcyBhIHRyZWUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgaW5kZXgKKworCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXQtd3JpdGUtdHJlZScgWy0tbWlzc2luZy1va10gWy0tcHJlZml4PTxwcmVmaXg+L10KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitDcmVhdGVzIGEgdHJlZSBvYmplY3QgdXNpbmcgdGhlIGN1cnJlbnQgaW5kZXguCisKK1RoZSBpbmRleCBtdXN0IGJlIGluIGEgZnVsbHkgbWVyZ2VkIHN0YXRlLgorCitDb25jZXB0dWFsbHksIGBnaXQtd3JpdGUtdHJlZWAgc3luYygpcyB0aGUgY3VycmVudCBpbmRleCBjb250ZW50cworaW50byBhIHNldCBvZiB0cmVlIGZpbGVzLgorSW4gb3JkZXIgdG8gaGF2ZSB0aGF0IG1hdGNoIHdoYXQgaXMgYWN0dWFsbHkgaW4geW91ciBkaXJlY3RvcnkgcmlnaHQKK25vdywgeW91IG5lZWQgdG8gaGF2ZSBkb25lIGEgYGdpdC11cGRhdGUtaW5kZXhgIHBoYXNlIGJlZm9yZSB5b3UgZGlkIHRoZQorYGdpdC13cml0ZS10cmVlYC4KKworCitPUFRJT05TCistLS0tLS0tCistLW1pc3Npbmctb2s6OgorCU5vcm1hbGx5IGBnaXQtd3JpdGUtdHJlZWAgZW5zdXJlcyB0aGF0IHRoZSBvYmplY3RzIHJlZmVyZW5jZWQgYnkgdGhlCisJZGlyZWN0b3J5IGV4aXN0IGluIHRoZSBvYmplY3QgZGF0YWJhc2UuICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB0aGlzCisJY2hlY2suCisKKy0tcHJlZml4PTxwcmVmaXg+Lzo6CisJV3JpdGVzIGEgdHJlZSBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgc3ViZGlyZWN0b3J5CisJYDxwcmVmaXg+YC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdGhlIHRyZWUgb2JqZWN0CisJZm9yIGEgc3VicHJvamVjdCB0aGF0IGlzIGluIHRoZSBuYW1lZCBzdWJkaXJlY3RvcnkuCisKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorRG9jdW1lbnRhdGlvbiBieSBEYXZpZCBHcmVhdmVzLCBKdW5pbyBDIEhhbWFubyBhbmQgdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2YxODdhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CkBAIC0wLDAgKzEsNjYxIEBACitnaXQoNykKKz09PT09PQorCitOQU1FCistLS0tCitnaXQgLSB0aGUgc3R1cGlkIGNvbnRlbnQgdHJhY2tlcgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdCcgWy0tdmVyc2lvbl0gWy0tZXhlYy1wYXRoWz1HSVRfRVhFQ19QQVRIXV0gWy1wfC0tcGFnaW5hdGVdCisJWy0tYmFyZV0gWy0tZ2l0LWRpcj1HSVRfRElSXSBbLS1oZWxwXSBDT01NQU5EIFtBUkdTXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK0dpdCBpcyBhIGZhc3QsIHNjYWxhYmxlLCBkaXN0cmlidXRlZCByZXZpc2lvbiBjb250cm9sIHN5c3RlbSB3aXRoIGFuCit1bnVzdWFsbHkgcmljaCBjb21tYW5kIHNldCB0aGF0IHByb3ZpZGVzIGJvdGggaGlnaC1sZXZlbCBvcGVyYXRpb25zCithbmQgZnVsbCBhY2Nlc3MgdG8gaW50ZXJuYWxzLgorCitTZWUgdGhpcyBsaW5rOnR1dG9yaWFsLmh0bWxbdHV0b3JpYWxdIHRvIGdldCBzdGFydGVkLCB0aGVuIHNlZQorbGluazpldmVyeWRheS5odG1sW0V2ZXJ5ZGF5IEdpdF0gZm9yIGEgdXNlZnVsIG1pbmltdW0gc2V0IG9mIGNvbW1hbmRzLCBhbmQKKyJtYW4gZ2l0LWNvbW1hbmRuYW1lIiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGNvbW1hbmQuICBDVlMgdXNlcnMgbWF5CithbHNvIHdhbnQgdG8gcmVhZCBsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtDVlMgbWlncmF0aW9uXS4KKworVGhlIENPTU1BTkQgaXMgZWl0aGVyIGEgbmFtZSBvZiBhIEdpdCBjb21tYW5kIChzZWUgYmVsb3cpIG9yIGFuIGFsaWFzCithcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKHNlZSBnaXRsaW5rOmdpdC1yZXBvLWNvbmZpZ1sxXSkuCisKK09QVElPTlMKKy0tLS0tLS0KKy0tdmVyc2lvbjo6CisJUHJpbnRzIHRoZSBnaXQgc3VpdGUgdmVyc2lvbiB0aGF0IHRoZSAnZ2l0JyBwcm9ncmFtIGNhbWUgZnJvbS4KKworLS1oZWxwOjoKKwlQcmludHMgdGhlIHN5bm9wc2lzIGFuZCBhIGxpc3Qgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZAorCWNvbW1hbmRzLiAgSWYgYSBnaXQgY29tbWFuZCBpcyBuYW1lZCB0aGlzIG9wdGlvbiB3aWxsIGJyaW5nIHVwCisJdGhlIG1hbi1wYWdlIGZvciB0aGF0IGNvbW1hbmQuIElmIHRoZSBvcHRpb24gJy0tYWxsJyBvciAnLWEnIGlzCisJZ2l2ZW4gdGhlbiBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzIGFyZSBwcmludGVkLgorCistLWV4ZWMtcGF0aDo6CisJUGF0aCB0byB3aGVyZXZlciB5b3VyIGNvcmUgZ2l0IHByb2dyYW1zIGFyZSBpbnN0YWxsZWQuCisJVGhpcyBjYW4gYWxzbyBiZSBjb250cm9sbGVkIGJ5IHNldHRpbmcgdGhlIEdJVF9FWEVDX1BBVEgKKwllbnZpcm9ubWVudCB2YXJpYWJsZS4gSWYgbm8gcGF0aCBpcyBnaXZlbiAnZ2l0JyB3aWxsIHByaW50CisJdGhlIGN1cnJlbnQgc2V0dGluZyBhbmQgdGhlbiBleGl0LgorCistcHwtLXBhZ2luYXRlOjoKKwlQaXBlIGFsbCBvdXRwdXQgaW50byAnbGVzcycgKG9yIGlmIHNldCwgJFBBR0VSKS4KKworLS1naXQtZGlyPTxwYXRoPjo6CisJU2V0IHRoZSBwYXRoIHRvIHRoZSByZXBvc2l0b3J5LiBUaGlzIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkKKwlzZXR0aW5nIHRoZSBHSVRfRElSIGVudmlyb25tZW50IHZhcmlhYmxlLgorCistLWJhcmU6OgorCVNhbWUgYXMgLS1naXQtZGlyPWBwd2RgLgorCitGVVJUSEVSIERPQ1VNRU5UQVRJT04KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZWUgdGhlIHJlZmVyZW5jZXMgYWJvdmUgdG8gZ2V0IHN0YXJ0ZWQgdXNpbmcgZ2l0LiAgVGhlIGZvbGxvd2luZyBpcworcHJvYmFibHkgbW9yZSBkZXRhaWwgdGhhbiBuZWNlc3NhcnkgZm9yIGEgZmlyc3QtdGltZSB1c2VyLgorCitUaGUgPDxEaXNjdXNzaW9uLERpc2N1c3Npb24+PiBzZWN0aW9uIGJlbG93IGFuZCB0aGUKK2xpbms6Y29yZS10dXRvcmlhbC5odG1sW0NvcmUgdHV0b3JpYWxdIGJvdGggcHJvdmlkZSBpbnRyb2R1Y3Rpb25zIHRvIHRoZQordW5kZXJseWluZyBnaXQgYXJjaGl0ZWN0dXJlLgorCitTZWUgYWxzbyB0aGUgbGluazpob3d0by1pbmRleC5odG1sW2hvd3RvXSBkb2N1bWVudHMgZm9yIHNvbWUgdXNlZnVsCitleGFtcGxlcy4KKworR0lUIENPTU1BTkRTCistLS0tLS0tLS0tLS0KKworV2UgZGl2aWRlIGdpdCBpbnRvIGhpZ2ggbGV2ZWwgKCJwb3JjZWxhaW4iKSBjb21tYW5kcyBhbmQgbG93IGxldmVsCisoInBsdW1iaW5nIikgY29tbWFuZHMuCisKK0xvdy1sZXZlbCBjb21tYW5kcyAocGx1bWJpbmcpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbHRob3VnaCBnaXQgaW5jbHVkZXMgaXRzCitvd24gcG9yY2VsYWluIGxheWVyLCBpdHMgbG93LWxldmVsIGNvbW1hbmRzIGFyZSBzdWZmaWNpZW50IHRvIHN1cHBvcnQKK2RldmVsb3BtZW50IG9mIGFsdGVybmF0aXZlIHBvcmNlbGFpbnMuICBEZXZlbG9wZXJzIG9mIHN1Y2ggcG9yY2VsYWlucworbWlnaHQgc3RhcnQgYnkgcmVhZGluZyBhYm91dCBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0gYW5kCitnaXRsaW5rOmdpdC1yZWFkLXRyZWVbMV0uCisKK1dlIGRpdmlkZSB0aGUgbG93LWxldmVsIGNvbW1hbmRzIGludG8gY29tbWFuZHMgdGhhdCBtYW5pcHVsYXRlIG9iamVjdHMgKGluCit0aGUgcmVwb3NpdG9yeSwgaW5kZXgsIGFuZCB3b3JraW5nIHRyZWUpLCBjb21tYW5kcyB0aGF0IGludGVycm9nYXRlIGFuZAorY29tcGFyZSBvYmplY3RzLCBhbmQgY29tbWFuZHMgdGhhdCBtb3ZlIG9iamVjdHMgYW5kIHJlZmVyZW5jZXMgYmV0d2VlbgorcmVwb3NpdG9yaWVzLgorCitNYW5pcHVsYXRpb24gY29tbWFuZHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorZ2l0bGluazpnaXQtYXBwbHlbMV06OgorCVJlYWRzIGEgImRpZmYgLXVwMSIgb3IgZ2l0IGdlbmVyYXRlZCBwYXRjaCBmaWxlIGFuZAorCWFwcGxpZXMgaXQgdG8gdGhlIHdvcmtpbmcgdHJlZS4KKworZ2l0bGluazpnaXQtY2hlY2tvdXQtaW5kZXhbMV06OgorCUNvcHkgZmlsZXMgZnJvbSB0aGUgaW5kZXggdG8gdGhlIHdvcmtpbmcgdHJlZS4KKworZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV06OgorCUNyZWF0ZXMgYSBuZXcgY29tbWl0IG9iamVjdC4KKworZ2l0bGluazpnaXQtaGFzaC1vYmplY3RbMV06OgorCUNvbXB1dGVzIHRoZSBvYmplY3QgSUQgZnJvbSBhIGZpbGUuCisKK2dpdGxpbms6Z2l0LWluZGV4LXBhY2tbMV06OgorCUJ1aWxkIHBhY2sgaWR4IGZpbGUgZm9yIGFuIGV4aXN0aW5nIHBhY2tlZCBhcmNoaXZlLgorCitnaXRsaW5rOmdpdC1pbml0LWRiWzFdOjoKKwlDcmVhdGVzIGFuIGVtcHR5IGdpdCBvYmplY3QgZGF0YWJhc2UsIG9yIHJlaW5pdGlhbGl6ZSBhbgorCWV4aXN0aW5nIG9uZS4KKworZ2l0bGluazpnaXQtbWVyZ2UtaW5kZXhbMV06OgorCVJ1bnMgYSBtZXJnZSBmb3IgZmlsZXMgbmVlZGluZyBtZXJnaW5nLgorCitnaXRsaW5rOmdpdC1ta3RhZ1sxXTo6CisJQ3JlYXRlcyBhIHRhZyBvYmplY3QuCisKK2dpdGxpbms6Z2l0LW1rdHJlZVsxXTo6CisJQnVpbGQgYSB0cmVlLW9iamVjdCBmcm9tIGxzLXRyZWUgZm9ybWF0dGVkIHRleHQuCisKK2dpdGxpbms6Z2l0LXBhY2stb2JqZWN0c1sxXTo6CisJQ3JlYXRlcyBhIHBhY2tlZCBhcmNoaXZlIG9mIG9iamVjdHMuCisKK2dpdGxpbms6Z2l0LXBydW5lLXBhY2tlZFsxXTo6CisJUmVtb3ZlIGV4dHJhIG9iamVjdHMgdGhhdCBhcmUgYWxyZWFkeSBpbiBwYWNrIGZpbGVzLgorCitnaXRsaW5rOmdpdC1yZWFkLXRyZWVbMV06OgorCVJlYWRzIHRyZWUgaW5mb3JtYXRpb24gaW50byB0aGUgaW5kZXguCisKK2dpdGxpbms6Z2l0LXJlcG8tY29uZmlnWzFdOjoKKwlHZXQgYW5kIHNldCBvcHRpb25zIGluIC5naXQvY29uZmlnLgorCitnaXRsaW5rOmdpdC11bnBhY2stb2JqZWN0c1sxXTo6CisJVW5wYWNrcyBvYmplY3RzIG91dCBvZiBhIHBhY2tlZCBhcmNoaXZlLgorCitnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV06OgorCVJlZ2lzdGVycyBmaWxlcyBpbiB0aGUgd29ya2luZyB0cmVlIHRvIHRoZSBpbmRleC4KKworZ2l0bGluazpnaXQtd3JpdGUtdHJlZVsxXTo6CisJQ3JlYXRlcyBhIHRyZWUgZnJvbSB0aGUgaW5kZXguCisKKworSW50ZXJyb2dhdGlvbiBjb21tYW5kcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitnaXRsaW5rOmdpdC1jYXQtZmlsZVsxXTo6CisJUHJvdmlkZSBjb250ZW50IG9yIHR5cGUvc2l6ZSBpbmZvcm1hdGlvbiBmb3IgcmVwb3NpdG9yeSBvYmplY3RzLgorCitnaXRsaW5rOmdpdC1kZXNjcmliZVsxXTo6CisJU2hvdyB0aGUgbW9zdCByZWNlbnQgdGFnIHRoYXQgaXMgcmVhY2hhYmxlIGZyb20gYSBjb21taXQuCisKK2dpdGxpbms6Z2l0LWRpZmYtaW5kZXhbMV06OgorCUNvbXBhcmVzIGNvbnRlbnQgYW5kIG1vZGUgb2YgYmxvYnMgYmV0d2VlbiB0aGUgaW5kZXggYW5kIHJlcG9zaXRvcnkuCisKK2dpdGxpbms6Z2l0LWRpZmYtZmlsZXNbMV06OgorCUNvbXBhcmVzIGZpbGVzIGluIHRoZSB3b3JraW5nIHRyZWUgYW5kIHRoZSBpbmRleC4KKworZ2l0bGluazpnaXQtZGlmZi1zdGFnZXNbMV06OgorCUNvbXBhcmVzIHR3byAibWVyZ2Ugc3RhZ2VzIiBpbiB0aGUgaW5kZXguCisKK2dpdGxpbms6Z2l0LWRpZmYtdHJlZVsxXTo6CisJQ29tcGFyZXMgdGhlIGNvbnRlbnQgYW5kIG1vZGUgb2YgYmxvYnMgZm91bmQgdmlhIHR3byB0cmVlIG9iamVjdHMuCisKK2dpdGxpbms6Z2l0LWZzY2stb2JqZWN0c1sxXTo6CisJVmVyaWZpZXMgdGhlIGNvbm5lY3Rpdml0eSBhbmQgdmFsaWRpdHkgb2YgdGhlIG9iamVjdHMgaW4gdGhlIGRhdGFiYXNlLgorCitnaXRsaW5rOmdpdC1scy1maWxlc1sxXTo6CisJSW5mb3JtYXRpb24gYWJvdXQgZmlsZXMgaW4gdGhlIGluZGV4IGFuZCB0aGUgd29ya2luZyB0cmVlLgorCitnaXRsaW5rOmdpdC1scy10cmVlWzFdOjoKKwlEaXNwbGF5cyBhIHRyZWUgb2JqZWN0IGluIGh1bWFuIHJlYWRhYmxlIGZvcm0uCisKK2dpdGxpbms6Z2l0LW1lcmdlLWJhc2VbMV06OgorCUZpbmRzIGFzIGdvb2QgY29tbW9uIGFuY2VzdG9ycyBhcyBwb3NzaWJsZSBmb3IgYSBtZXJnZS4KKworZ2l0bGluazpnaXQtbmFtZS1yZXZbMV06OgorCUZpbmQgc3ltYm9saWMgbmFtZXMgZm9yIGdpdmVuIHJldnMuCisKK2dpdGxpbms6Z2l0LXBhY2stcmVkdW5kYW50WzFdOjoKKwlGaW5kIHJlZHVuZGFudCBwYWNrIGZpbGVzLgorCitnaXRsaW5rOmdpdC1yZXYtbGlzdFsxXTo6CisJTGlzdHMgY29tbWl0IG9iamVjdHMgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCitnaXRsaW5rOmdpdC1zaG93LWluZGV4WzFdOjoKKwlEaXNwbGF5cyBjb250ZW50cyBvZiBhIHBhY2sgaWR4IGZpbGUuCisKK2dpdGxpbms6Z2l0LXRhci10cmVlWzFdOjoKKwlDcmVhdGVzIGEgdGFyIGFyY2hpdmUgb2YgdGhlIGZpbGVzIGluIHRoZSBuYW1lZCB0cmVlIG9iamVjdC4KKworZ2l0bGluazpnaXQtdW5wYWNrLWZpbGVbMV06OgorCUNyZWF0ZXMgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIGEgYmxvYidzIGNvbnRlbnRzLgorCitnaXRsaW5rOmdpdC12YXJbMV06OgorCURpc3BsYXlzIGEgZ2l0IGxvZ2ljYWwgdmFyaWFibGUuCisKK2dpdGxpbms6Z2l0LXZlcmlmeS1wYWNrWzFdOjoKKwlWYWxpZGF0ZXMgcGFja2VkIGdpdCBhcmNoaXZlIGZpbGVzLgorCitJbiBnZW5lcmFsLCB0aGUgaW50ZXJyb2dhdGUgY29tbWFuZHMgZG8gbm90IHRvdWNoIHRoZSBmaWxlcyBpbgordGhlIHdvcmtpbmcgdHJlZS4KKworCitTeW5jaGluZyByZXBvc2l0b3JpZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitnaXRsaW5rOmdpdC1mZXRjaC1wYWNrWzFdOjoKKwlVcGRhdGVzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSAoZW5naW5lIGZvciBzc2ggYW5kCisJbG9jYWwgdHJhbnNwb3J0KS4KKworZ2l0bGluazpnaXQtaHR0cC1mZXRjaFsxXTo6CisJRG93bmxvYWRzIGEgcmVtb3RlIGdpdCByZXBvc2l0b3J5IHZpYSBIVFRQIGJ5IHdhbGtpbmcKKwljb21taXQgY2hhaW4uCisKK2dpdGxpbms6Z2l0LWxvY2FsLWZldGNoWzFdOjoKKwlEdXBsaWNhdGVzIGFub3RoZXIgZ2l0IHJlcG9zaXRvcnkgb24gYSBsb2NhbCBzeXN0ZW0gYnkKKwl3YWxraW5nIGNvbW1pdCBjaGFpbi4KKworZ2l0bGluazpnaXQtcGVlay1yZW1vdGVbMV06OgorCUxpc3RzIHJlZmVyZW5jZXMgb24gYSByZW1vdGUgcmVwb3NpdG9yeSB1c2luZworCXVwbG9hZC1wYWNrIHByb3RvY29sIChlbmdpbmUgZm9yIHNzaCBhbmQgbG9jYWwKKwl0cmFuc3BvcnQpLgorCitnaXRsaW5rOmdpdC1yZWNlaXZlLXBhY2tbMV06OgorCUludm9rZWQgYnkgJ2dpdC1zZW5kLXBhY2snIHRvIHJlY2VpdmUgd2hhdCBpcyBwdXNoZWQgdG8gaXQuCisKK2dpdGxpbms6Z2l0LXNlbmQtcGFja1sxXTo6CisJUHVzaGVzIHRvIGEgcmVtb3RlIHJlcG9zaXRvcnksIGludGVsbGlnZW50bHkuCisKK2dpdGxpbms6Z2l0LWh0dHAtcHVzaFsxXTo6CisJUHVzaCBtaXNzaW5nIG9iamVjdHMgdXNpbmcgSFRUUC9EQVYuCisKK2dpdGxpbms6Z2l0LXNoZWxsWzFdOjoKKwlSZXN0cmljdGVkIHNoZWxsIGZvciBHSVQtb25seSBTU0ggYWNjZXNzLgorCitnaXRsaW5rOmdpdC1zc2gtZmV0Y2hbMV06OgorCVB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uIGJ5CisJd2Fsa2luZyBjb21taXQgY2hhaW4uCisKK2dpdGxpbms6Z2l0LXNzaC11cGxvYWRbMV06OgorCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLWZldGNoLgorCitnaXRsaW5rOmdpdC11cGRhdGUtc2VydmVyLWluZm9bMV06OgorCVVwZGF0ZXMgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIG9uIGEgZHVtYiBzZXJ2ZXIgdG8gaGVscAorCWNsaWVudHMgZGlzY292ZXIgcmVmZXJlbmNlcyBhbmQgcGFja3Mgb24gaXQuCisKK2dpdGxpbms6Z2l0LXVwbG9hZC1wYWNrWzFdOjoKKwlJbnZva2VkIGJ5ICdnaXQtZmV0Y2gtcGFjaycgdG8gcHVzaAorCXdoYXQgYXJlIGFza2VkIGZvci4KKworZ2l0bGluazpnaXQtdXBsb2FkLXRhclsxXTo6CisJSW52b2tlZCBieSAnZ2l0LXRhci10cmVlIC0tcmVtb3RlJyB0byByZXR1cm4gdGhlIHRhcgorCWFyY2hpdmUgdGhlIG90aGVyIGVuZCBhc2tlZCBmb3IuCisKKworSGlnaC1sZXZlbCBjb21tYW5kcyAocG9yY2VsYWluKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXZSBzZXBhcmF0ZSB0aGUgcG9yY2VsYWluIGNvbW1hbmRzIGludG8gdGhlIG1haW4gY29tbWFuZHMgYW5kIHNvbWUKK2FuY2lsbGFyeSB1c2VyIHV0aWxpdGllcy4KKworTWFpbiBwb3JjZWxhaW4gY29tbWFuZHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2dpdGxpbms6Z2l0LWFkZFsxXTo6CisJQWRkIHBhdGhzIHRvIHRoZSBpbmRleC4KKworZ2l0bGluazpnaXQtYW1bMV06OgorCUFwcGx5IHBhdGNoZXMgZnJvbSBhIG1haWxib3gsIGJ1dCBjb29sZXIuCisKK2dpdGxpbms6Z2l0LWFwcGx5bWJveFsxXTo6CisJQXBwbHkgcGF0Y2hlcyBmcm9tIGEgbWFpbGJveCwgb3JpZ2luYWwgdmVyc2lvbiBieSBMaW51cy4KKworZ2l0bGluazpnaXQtYmlzZWN0WzFdOjoKKwlGaW5kIHRoZSBjaGFuZ2UgdGhhdCBpbnRyb2R1Y2VkIGEgYnVnIGJ5IGJpbmFyeSBzZWFyY2guCisKK2dpdGxpbms6Z2l0LWJyYW5jaFsxXTo6CisJQ3JlYXRlIGFuZCBTaG93IGJyYW5jaGVzLgorCitnaXRsaW5rOmdpdC1jaGVja291dFsxXTo6CisJQ2hlY2tvdXQgYW5kIHN3aXRjaCB0byBhIGJyYW5jaC4KKworZ2l0bGluazpnaXQtY2hlcnJ5LXBpY2tbMV06OgorCUNoZXJyeS1waWNrIHRoZSBlZmZlY3Qgb2YgYW4gZXhpc3RpbmcgY29tbWl0LgorCitnaXRsaW5rOmdpdC1jbGVhblsxXTo6CisJUmVtb3ZlIHVudHJhY2tlZCBmaWxlcyBmcm9tIHRoZSB3b3JraW5nIHRyZWUuCisKK2dpdGxpbms6Z2l0LWNsb25lWzFdOjoKKwlDbG9uZXMgYSByZXBvc2l0b3J5IGludG8gYSBuZXcgZGlyZWN0b3J5LgorCitnaXRsaW5rOmdpdC1jb21taXRbMV06OgorCVJlY29yZCBjaGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5LgorCitnaXRsaW5rOmdpdC1kaWZmWzFdOjoKKwlTaG93IGNoYW5nZXMgYmV0d2VlbiBjb21taXRzLCBjb21taXQgYW5kIHdvcmtpbmcgdHJlZSwgZXRjLgorCitnaXRsaW5rOmdpdC1mZXRjaFsxXTo6CisJRG93bmxvYWQgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IHZpYSB2YXJpb3VzIHByb3RvY29scy4KKworZ2l0bGluazpnaXQtZm9ybWF0LXBhdGNoWzFdOjoKKwlQcmVwYXJlIHBhdGNoZXMgZm9yIGUtbWFpbCBzdWJtaXNzaW9uLgorCitnaXRsaW5rOmdpdC1ncmVwWzFdOjoKKwlQcmludCBsaW5lcyBtYXRjaGluZyBhIHBhdHRlcm4uCisKK2dpdGxpbms6Z2l0LWxvZ1sxXTo6CisJU2hvd3MgY29tbWl0IGxvZ3MuCisKK2dpdGxpbms6Z2l0LWxzLXJlbW90ZVsxXTo6CisJU2hvd3MgcmVmZXJlbmNlcyBpbiBhIHJlbW90ZSBvciBsb2NhbCByZXBvc2l0b3J5LgorCitnaXRsaW5rOmdpdC1tZXJnZVsxXTo6CisJR3JhbmQgdW5pZmllZCBtZXJnZSBkcml2ZXIuCisKK2dpdGxpbms6Z2l0LW12WzFdOjoKKwlNb3ZlIG9yIHJlbmFtZSBhIGZpbGUsIGEgZGlyZWN0b3J5LCBvciBhIHN5bWxpbmsuCisKK2dpdGxpbms6Z2l0LXB1bGxbMV06OgorCUZldGNoIGZyb20gYW5kIG1lcmdlIHdpdGggYSByZW1vdGUgcmVwb3NpdG9yeS4KKworZ2l0bGluazpnaXQtcHVzaFsxXTo6CisJVXBkYXRlIHJlbW90ZSByZWZzIGFsb25nIHdpdGggYXNzb2NpYXRlZCBvYmplY3RzLgorCitnaXRsaW5rOmdpdC1yZWJhc2VbMV06OgorCVJlYmFzZSBsb2NhbCBjb21taXRzIHRvIHRoZSB1cGRhdGVkIHVwc3RyZWFtIGhlYWQuCisKK2dpdGxpbms6Z2l0LXJlcGFja1sxXTo6CisJUGFjayB1bnBhY2tlZCBvYmplY3RzIGluIGEgcmVwb3NpdG9yeS4KKworZ2l0bGluazpnaXQtcmVyZXJlWzFdOjoKKwlSZXVzZSByZWNvcmRlZCByZXNvbHV0aW9uIG9mIGNvbmZsaWN0ZWQgbWVyZ2VzLgorCitnaXRsaW5rOmdpdC1yZXNldFsxXTo6CisJUmVzZXQgY3VycmVudCBIRUFEIHRvIHRoZSBzcGVjaWZpZWQgc3RhdGUuCisKK2dpdGxpbms6Z2l0LXJlc29sdmVbMV06OgorCU1lcmdlIHR3byBjb21taXRzLgorCitnaXRsaW5rOmdpdC1yZXZlcnRbMV06OgorCVJldmVydCBhbiBleGlzdGluZyBjb21taXQuCisKK2dpdGxpbms6Z2l0LXJtWzFdOjoKKwlSZW1vdmUgZmlsZXMgZnJvbSB0aGUgd29ya2luZyB0cmVlIGFuZCBmcm9tIHRoZSBpbmRleC4KKworZ2l0bGluazpnaXQtc2hvcnRsb2dbMV06OgorCVN1bW1hcml6ZXMgJ2dpdCBsb2cnIG91dHB1dC4KKworZ2l0bGluazpnaXQtc2hvd1sxXTo6CisJU2hvdyBvbmUgY29tbWl0IGxvZyBhbmQgaXRzIGRpZmYuCisKK2dpdGxpbms6Z2l0LXNob3ctYnJhbmNoWzFdOjoKKwlTaG93IGJyYW5jaGVzIGFuZCB0aGVpciBjb21taXRzLgorCitnaXRsaW5rOmdpdC1zdGF0dXNbMV06OgorCVNob3dzIHRoZSB3b3JraW5nIHRyZWUgc3RhdHVzLgorCitnaXRsaW5rOmdpdC12ZXJpZnktdGFnWzFdOjoKKwlDaGVjayB0aGUgR1BHIHNpZ25hdHVyZSBvZiB0YWcuCisKK2dpdGxpbms6Z2l0LXdoYXRjaGFuZ2VkWzFdOjoKKwlTaG93cyBjb21taXQgbG9ncyBhbmQgZGlmZmVyZW5jZXMgdGhleSBpbnRyb2R1Y2UuCisKKworQW5jaWxsYXJ5IENvbW1hbmRzCit+fn5+fn5+fn5+fn5+fn5+fn4KK01hbmlwdWxhdG9yczoKKworZ2l0bGluazpnaXQtYXBwbHlwYXRjaFsxXTo6CisJQXBwbHkgb25lIHBhdGNoIGV4dHJhY3RlZCBmcm9tIGFuIGUtbWFpbC4KKworZ2l0bGluazpnaXQtYXJjaGltcG9ydFsxXTo6CisJSW1wb3J0IGFuIGFyY2ggcmVwb3NpdG9yeSBpbnRvIGdpdC4KKworZ2l0bGluazpnaXQtY29udmVydC1vYmplY3RzWzFdOjoKKwlDb252ZXJ0cyBvbGQtc3R5bGUgZ2l0IHJlcG9zaXRvcnkuCisKK2dpdGxpbms6Z2l0LWN2c2ltcG9ydFsxXTo6CisJU2FsdmFnZSB5b3VyIGRhdGEgb3V0IG9mIGFub3RoZXIgU0NNIHBlb3BsZSBsb3ZlIHRvIGhhdGUuCisKK2dpdGxpbms6Z2l0LWN2c2V4cG9ydGNvbW1pdFsxXTo6CisJRXhwb3J0IGEgc2luZ2xlIGNvbW1pdCB0byBhIENWUyBjaGVja291dC4KKworZ2l0bGluazpnaXQtY3Zzc2VydmVyWzFdOjoKKwlBIENWUyBzZXJ2ZXIgZW11bGF0b3IgZm9yIGdpdC4KKworZ2l0bGluazpnaXQtbG9zdC1mb3VuZFsxXTo6CisJUmVjb3ZlciBsb3N0IHJlZnMgdGhhdCBsdWNraWx5IGhhdmUgbm90IHlldCBiZWVuIHBydW5lZC4KKworZ2l0bGluazpnaXQtbWVyZ2Utb25lLWZpbGVbMV06OgorCVRoZSBzdGFuZGFyZCBoZWxwZXIgcHJvZ3JhbSB0byB1c2Ugd2l0aCBgZ2l0LW1lcmdlLWluZGV4YC4KKworZ2l0bGluazpnaXQtcHJ1bmVbMV06OgorCVBydW5lcyBhbGwgdW5yZWFjaGFibGUgb2JqZWN0cyBmcm9tIHRoZSBvYmplY3QgZGF0YWJhc2UuCisKK2dpdGxpbms6Z2l0LXF1aWx0aW1wb3J0WzFdOjoKKwlBcHBsaWVzIGEgcXVpbHQgcGF0Y2hzZXQgb250byB0aGUgY3VycmVudCBicmFuY2guCisKK2dpdGxpbms6Z2l0LXJlbGlua1sxXTo6CisJSGFyZGxpbmsgY29tbW9uIG9iamVjdHMgaW4gbG9jYWwgcmVwb3NpdG9yaWVzLgorCitnaXRsaW5rOmdpdC1zdm5bMV06OgorCUJpZGlyZWN0aW9uYWwgb3BlcmF0aW9uIGJldHdlZW4gYSBzaW5nbGUgU3VidmVyc2lvbiBicmFuY2ggYW5kIGdpdC4KKworZ2l0bGluazpnaXQtc3ZuaW1wb3J0WzFdOjoKKwlJbXBvcnQgYSBTVk4gcmVwb3NpdG9yeSBpbnRvIGdpdC4KKworZ2l0bGluazpnaXQtc2gtc2V0dXBbMV06OgorCUNvbW1vbiBnaXQgc2hlbGwgc2NyaXB0IHNldHVwIGNvZGUuCisKK2dpdGxpbms6Z2l0LXN5bWJvbGljLXJlZlsxXTo6CisJUmVhZCBhbmQgbW9kaWZ5IHN5bWJvbGljIHJlZnMuCisKK2dpdGxpbms6Z2l0LXRhZ1sxXTo6CisJQW4gZXhhbXBsZSBzY3JpcHQgdG8gY3JlYXRlIGEgdGFnIG9iamVjdCBzaWduZWQgd2l0aCBHUEcuCisKK2dpdGxpbms6Z2l0LXVwZGF0ZS1yZWZbMV06OgorCVVwZGF0ZSB0aGUgb2JqZWN0IG5hbWUgc3RvcmVkIGluIGEgcmVmIHNhZmVseS4KKworCitJbnRlcnJvZ2F0b3JzOgorCitnaXRsaW5rOmdpdC1hbm5vdGF0ZVsxXTo6CisJQW5ub3RhdGUgZmlsZSBsaW5lcyB3aXRoIGNvbW1pdCBpbmZvLgorCitnaXRsaW5rOmdpdC1ibGFtZVsxXTo6CisJQmxhbWUgZmlsZSBsaW5lcyBvbiBjb21taXRzLgorCitnaXRsaW5rOmdpdC1jaGVjay1yZWYtZm9ybWF0WzFdOjoKKwlNYWtlIHN1cmUgcmVmIG5hbWUgaXMgd2VsbCBmb3JtZWQuCisKK2dpdGxpbms6Z2l0LWNoZXJyeVsxXTo6CisJRmluZCBjb21taXRzIG5vdCBtZXJnZWQgdXBzdHJlYW0uCisKK2dpdGxpbms6Z2l0LWNvdW50LW9iamVjdHNbMV06OgorCUNvdW50IHVucGFja2VkIG51bWJlciBvZiBvYmplY3RzIGFuZCB0aGVpciBkaXNrIGNvbnN1bXB0aW9uLgorCitnaXRsaW5rOmdpdC1kYWVtb25bMV06OgorCUEgcmVhbGx5IHNpbXBsZSBzZXJ2ZXIgZm9yIGdpdCByZXBvc2l0b3JpZXMuCisKK2dpdGxpbms6Z2l0LWZtdC1tZXJnZS1tc2dbMV06OgorCVByb2R1Y2UgYSBtZXJnZSBjb21taXQgbWVzc2FnZS4KKworZ2l0bGluazpnaXQtZ2V0LXRhci1jb21taXQtaWRbMV06OgorCUV4dHJhY3QgY29tbWl0IElEIGZyb20gYW4gYXJjaGl2ZSBjcmVhdGVkIHVzaW5nIGdpdC10YXItdHJlZS4KKworZ2l0bGluazpnaXQtaW1hcC1zZW5kWzFdOjoKKwlEdW1wIGEgbWFpbGJveCBmcm9tIHN0ZGluIGludG8gYW4gaW1hcCBmb2xkZXIuCisKK2dpdGxpbms6Z2l0LWluc3Rhd2ViWzFdOjoKKwlJbnN0YW50bHkgYnJvd3NlIHlvdXIgd29ya2luZyByZXBvc2l0b3J5IGluIGdpdHdlYi4KKworZ2l0bGluazpnaXQtbWFpbGluZm9bMV06OgorCUV4dHJhY3RzIHBhdGNoIGFuZCBhdXRob3JzaGlwIGluZm9ybWF0aW9uIGZyb20gYSBzaW5nbGUKKwllLW1haWwgbWVzc2FnZSwgb3B0aW9uYWxseSB0cmFuc2xpdGVyYXRpbmcgdGhlIGNvbW1pdAorCW1lc3NhZ2UgaW50byB1dGYtOC4KKworZ2l0bGluazpnaXQtbWFpbHNwbGl0WzFdOjoKKwlBIHN0dXBpZCBwcm9ncmFtIHRvIHNwbGl0IFVOSVggbWJveCBmb3JtYXQgbWFpbGJveCBpbnRvCisJaW5kaXZpZHVhbCBwaWVjZXMgb2YgZS1tYWlsLgorCitnaXRsaW5rOmdpdC1tZXJnZS10cmVlWzFdOjoKKwlTaG93IHRocmVlLXdheSBtZXJnZSB3aXRob3V0IHRvdWNoaW5nIGluZGV4LgorCitnaXRsaW5rOmdpdC1wYXRjaC1pZFsxXTo6CisJQ29tcHV0ZSB1bmlxdWUgSUQgZm9yIGEgcGF0Y2guCisKK2dpdGxpbms6Z2l0LXBhcnNlLXJlbW90ZVsxXTo6CisJUm91dGluZXMgdG8gaGVscCBwYXJzaW5nIGAkR0lUX0RJUi9yZW1vdGVzL2AgZmlsZXMuCisKK2dpdGxpbms6Z2l0LXJlcXVlc3QtcHVsbFsxXTo6CisJZ2l0LXJlcXVlc3QtcHVsbC4KKworZ2l0bGluazpnaXQtcmV2LXBhcnNlWzFdOjoKKwlQaWNrIG91dCBhbmQgbWFzc2FnZSBwYXJhbWV0ZXJzLgorCitnaXRsaW5rOmdpdC1zZW5kLWVtYWlsWzFdOjoKKwlTZW5kIHBhdGNoIGUtbWFpbHMgb3V0IG9mICJmb3JtYXQtcGF0Y2ggLS1tYm94IiBvdXRwdXQuCisKK2dpdGxpbms6Z2l0LXN5bWJvbGljLXJlZlsxXTo6CisJUmVhZCBhbmQgbW9kaWZ5IHN5bWJvbGljIHJlZnMuCisKK2dpdGxpbms6Z2l0LXN0cmlwc3BhY2VbMV06OgorCUZpbHRlciBvdXQgZW1wdHkgbGluZXMuCisKKworQ29tbWFuZHMgbm90IHlldCBkb2N1bWVudGVkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZ2l0bGluazpnaXRrWzFdOjoKKwlUaGUgZ2l0ayByZXBvc2l0b3J5IGJyb3dzZXIuCisKKworQ29uZmlndXJhdGlvbiBNZWNoYW5pc20KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N0YXJ0aW5nIGZyb20gMC45OS45IChhY3R1YWxseSBtaWQgMC45OS44LkdJVCksIGAuZ2l0L2NvbmZpZ2AgZmlsZQoraXMgdXNlZCB0byBob2xkIHBlci1yZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4gIEl0IGlzIGEKK3NpbXBsZSB0ZXh0IGZpbGUgbW9kZWxlZCBhZnRlciBgLmluaWAgZm9ybWF0IGZhbWlsaWFyIHRvIHNvbWUKK3Blb3BsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKKworLS0tLS0tLS0tLS0tCisjCisjIEEgJyMnIG9yICc7JyBjaGFyYWN0ZXIgaW5kaWNhdGVzIGEgY29tbWVudC4KKyMKKworOyBjb3JlIHZhcmlhYmxlcworW2NvcmVdCisJOyBEb24ndCB0cnVzdCBmaWxlIG1vZGVzCisJZmlsZW1vZGUgPSBmYWxzZQorCis7IHVzZXIgaWRlbnRpdHkKK1t1c2VyXQorCW5hbWUgPSAiSnVuaW8gQyBIYW1hbm8iCisJZW1haWwgPSAianVua2lvQHR3aW5zdW4uY29tIgorCistLS0tLS0tLS0tLS0KKworVmFyaW91cyBjb21tYW5kcyByZWFkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgYWRqdXN0Cit0aGVpciBvcGVyYXRpb24gYWNjb3JkaW5nbHkuCisKKworSWRlbnRpZmllciBUZXJtaW5vbG9neQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPG9iamVjdD46OgorCUluZGljYXRlcyB0aGUgb2JqZWN0IG5hbWUgZm9yIGFueSB0eXBlIG9mIG9iamVjdC4KKworPGJsb2I+OjoKKwlJbmRpY2F0ZXMgYSBibG9iIG9iamVjdCBuYW1lLgorCis8dHJlZT46OgorCUluZGljYXRlcyBhIHRyZWUgb2JqZWN0IG5hbWUuCisKKzxjb21taXQ+OjoKKwlJbmRpY2F0ZXMgYSBjb21taXQgb2JqZWN0IG5hbWUuCisKKzx0cmVlLWlzaD46OgorCUluZGljYXRlcyBhIHRyZWUsIGNvbW1pdCBvciB0YWcgb2JqZWN0IG5hbWUuICBBCisJY29tbWFuZCB0aGF0IHRha2VzIGEgPHRyZWUtaXNoPiBhcmd1bWVudCB1bHRpbWF0ZWx5IHdhbnRzIHRvCisJb3BlcmF0ZSBvbiBhIDx0cmVlPiBvYmplY3QgYnV0IGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2VzCisJPGNvbW1pdD4gYW5kIDx0YWc+IG9iamVjdHMgdGhhdCBwb2ludCBhdCBhIDx0cmVlPi4KKworPHR5cGU+OjoKKwlJbmRpY2F0ZXMgdGhhdCBhbiBvYmplY3QgdHlwZSBpcyByZXF1aXJlZC4KKwlDdXJyZW50bHkgb25lIG9mOiBgYmxvYmAsIGB0cmVlYCwgYGNvbW1pdGAsIG9yIGB0YWdgLgorCis8ZmlsZT46OgorCUluZGljYXRlcyBhIGZpbGVuYW1lIC0gYWxtb3N0IGFsd2F5cyByZWxhdGl2ZSB0byB0aGUKKwlyb290IG9mIHRoZSB0cmVlIHN0cnVjdHVyZSBgR0lUX0lOREVYX0ZJTEVgIGRlc2NyaWJlcy4KKworU3ltYm9saWMgSWRlbnRpZmllcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitBbnkgZ2l0IGNvbW1hbmQgYWNjZXB0aW5nIGFueSA8b2JqZWN0PiBjYW4gYWxzbyB1c2UgdGhlIGZvbGxvd2luZworc3ltYm9saWMgbm90YXRpb246CisKK0hFQUQ6OgorCWluZGljYXRlcyB0aGUgaGVhZCBvZiB0aGUgY3VycmVudCBicmFuY2ggKGkuZS4gdGhlCisJY29udGVudHMgb2YgYCRHSVRfRElSL0hFQURgKS4KKworPHRhZz46OgorCWEgdmFsaWQgdGFnICduYW1lJworCShpLmUuIHRoZSBjb250ZW50cyBvZiBgJEdJVF9ESVIvcmVmcy90YWdzLzx0YWc+YCkuCisKKzxoZWFkPjo6CisJYSB2YWxpZCBoZWFkICduYW1lJworCShpLmUuIHRoZSBjb250ZW50cyBvZiBgJEdJVF9ESVIvcmVmcy9oZWFkcy88aGVhZD5gKS4KKworCitGaWxlL0RpcmVjdG9yeSBTdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQbGVhc2Ugc2VlIGxpbms6cmVwb3NpdG9yeS1sYXlvdXQuaHRtbFtyZXBvc2l0b3J5IGxheW91dF0gZG9jdW1lbnQuCisKK1JlYWQgbGluazpob29rcy5odG1sW2hvb2tzXSBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGVhY2ggaG9vay4KKworSGlnaGVyIGxldmVsIFNDTXMgbWF5IHByb3ZpZGUgYW5kIG1hbmFnZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZQorYCRHSVRfRElSYC4KKworCitUZXJtaW5vbG9neQorLS0tLS0tLS0tLS0KK1BsZWFzZSBzZWUgbGluazpnbG9zc2FyeS5odG1sW2dsb3NzYXJ5XSBkb2N1bWVudC4KKworCitFbnZpcm9ubWVudCBWYXJpYWJsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVmFyaW91cyBnaXQgY29tbWFuZHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorCitUaGUgZ2l0IFJlcG9zaXRvcnkKK35+fn5+fn5+fn5+fn5+fn5+fgorVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFwcGx5IHRvICdhbGwnIGNvcmUgZ2l0IGNvbW1hbmRzLiBOYjogaXQKK2lzIHdvcnRoIG5vdGluZyB0aGF0IHRoZXkgbWF5IGJlIHVzZWQvb3ZlcnJpZGRlbiBieSBTQ01TIHNpdHRpbmcgYWJvdmUKK2dpdCBzbyB0YWtlIGNhcmUgaWYgdXNpbmcgQ29naXRvIGV0Yy4KKworJ0dJVF9JTkRFWF9GSUxFJzo6CisJVGhpcyBlbnZpcm9ubWVudCBhbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gb2YgYW4gYWx0ZXJuYXRlCisJaW5kZXggZmlsZS4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb2YgYCRHSVRfRElSL2luZGV4YAorCWlzIHVzZWQuCisKKydHSVRfT0JKRUNUX0RJUkVDVE9SWSc6OgorCUlmIHRoZSBvYmplY3Qgc3RvcmFnZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHZpYSB0aGlzCisJZW52aXJvbm1lbnQgdmFyaWFibGUgdGhlbiB0aGUgc2hhMSBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZAorCXVuZGVybmVhdGggLSBvdGhlcndpc2UgdGhlIGRlZmF1bHQgYCRHSVRfRElSL29iamVjdHNgCisJZGlyZWN0b3J5IGlzIHVzZWQuCisKKydHSVRfQUxURVJOQVRFX09CSkVDVF9ESVJFQ1RPUklFUyc6OgorCUR1ZSB0byB0aGUgaW1tdXRhYmxlIG5hdHVyZSBvZiBnaXQgb2JqZWN0cywgb2xkIG9iamVjdHMgY2FuIGJlCisJYXJjaGl2ZWQgaW50byBzaGFyZWQsIHJlYWQtb25seSBkaXJlY3Rvcmllcy4gVGhpcyB2YXJpYWJsZQorCXNwZWNpZmllcyBhICI6IiBzZXBhcmF0ZWQgbGlzdCBvZiBnaXQgb2JqZWN0IGRpcmVjdG9yaWVzIHdoaWNoCisJY2FuIGJlIHVzZWQgdG8gc2VhcmNoIGZvciBnaXQgb2JqZWN0cy4gTmV3IG9iamVjdHMgd2lsbCBub3QgYmUKKwl3cml0dGVuIHRvIHRoZXNlIGRpcmVjdG9yaWVzLgorCisnR0lUX0RJUic6OgorCUlmIHRoZSAnR0lUX0RJUicgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRoZW4gaXQKKwlzcGVjaWZpZXMgYSBwYXRoIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGAuZ2l0YAorCWZvciB0aGUgYmFzZSBvZiB0aGUgcmVwb3NpdG9yeS4KKworZ2l0IENvbW1pdHMKK35+fn5+fn5+fn5+CisnR0lUX0FVVEhPUl9OQU1FJzo6CisnR0lUX0FVVEhPUl9FTUFJTCc6OgorJ0dJVF9BVVRIT1JfREFURSc6OgorJ0dJVF9DT01NSVRURVJfTkFNRSc6OgorJ0dJVF9DT01NSVRURVJfRU1BSUwnOjoKKwlzZWUgZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0KKworZ2l0IERpZmZzCit+fn5+fn5+fn4KKydHSVRfRElGRl9PUFRTJzo6CisnR0lUX0VYVEVSTkFMX0RJRkYnOjoKKwlzZWUgdGhlICJnZW5lcmF0aW5nIHBhdGNoZXMiIHNlY3Rpb24gaW4gOgorCWdpdGxpbms6Z2l0LWRpZmYtaW5kZXhbMV07CisJZ2l0bGluazpnaXQtZGlmZi1maWxlc1sxXTsKKwlnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0KKworb3RoZXIKK35+fn5+CisnR0lUX1RSQUNFJzo6CisJSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgZ2l0IHdpbGwgcHJpbnQgYHRyYWNlOmAgbWVzc2FnZXMgb24KKwlzdGRlcnIgdGVsbGluZyBhYm91dCBhbGlhcyBleHBhbnNpb24sIGJ1aWx0LWluIGNvbW1hbmQKKwlleGVjdXRpb24gYW5kIGV4dGVybmFsIGNvbW1hbmQgZXhlY3V0aW9uLgorCitEaXNjdXNzaW9uW1tEaXNjdXNzaW9uXV0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5jbHVkZTo6UkVBRE1FW10KKworQXV0aG9ycworLS0tLS0tLQorKiBnaXQncyBmb3VuZGluZyBmYXRoZXIgaXMgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPi4KKyogVGhlIGN1cnJlbnQgZ2l0IG51cnNlIGlzIEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4uCisqIFRoZSBnaXQgcG90dHkgd2FzIHdyaXR0ZW4gYnkgQW5kcmVzIEVyaWNzc29uIDxhZUBvcDUuc2U+LgorKiBHZW5lcmFsIHVwYnJpbmdpbmcgaXMgaGFuZGxlZCBieSB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorVGhlIGRvY3VtZW50YXRpb24gZm9yIGdpdCBzdWl0ZSB3YXMgc3RhcnRlZCBieSBEYXZpZCBHcmVhdmVzCis8ZGF2aWRAZGdyZWF2ZXMuY29tPiwgYW5kIGxhdGVyIGVuaGFuY2VkIGdyZWF0bHkgYnkgdGhlCitjb250cmlidXRvcnMgb24gdGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGdpdGxpbms6Z2l0WzddIHN1aXRlCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2l0ay50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdGsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDgyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dpdGsudHh0CkBAIC0wLDAgKzEsNTEgQEAKK2dpdGsoMSkKKz09PT09PT0KKworTkFNRQorLS0tLQorZ2l0ayAtIFNvbWUgZ2l0IGNvbW1hbmQgbm90IHlldCBkb2N1bWVudGVkLgorCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ2dpdGsnIFsgLS1vcHRpb24gXSA8YXJncz4uLi4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitEb2VzIHNvbWV0aGluZyBub3QgeWV0IGRvY3VtZW50ZWQuCisKKworT1BUSU9OUworLS0tLS0tLQorLS1vcHRpb246OgorCVNvbWUgb3B0aW9uIG5vdCB5ZXQgZG9jdW1lbnRlZC4KKworPGFyZ3M+Li4uOjoKKwlTb21lIGFyZ3VtZW50IG5vdCB5ZXQgZG9jdW1lbnRlZC4KKworCitFeGFtcGxlcworLS0tLS0tLS0KK2dpdGsgdjIuNi4xMi4uIGluY2x1ZGUvc2NzaSBkcml2ZXJzL3Njc2k6OgorCisJU2hvdyBhcyB0aGUgY2hhbmdlcyBzaW5jZSB2ZXJzaW9uICd2Mi42LjEyJyB0aGF0IGNoYW5nZWQgYW55CisJZmlsZSBpbiB0aGUgaW5jbHVkZS9zY3NpIG9yIGRyaXZlcnMvc2NzaSBzdWJkaXJlY3RvcmllcworCitnaXRrIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBcLS0gZ2l0azo6CisKKwlTaG93IHRoZSBjaGFuZ2VzIGR1cmluZyB0aGUgbGFzdCB0d28gd2Vla3MgdG8gdGhlIGZpbGUgJ2dpdGsnLgorCVRoZSAiLS0iIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgKmJyYW5jaCogbmFtZWQKKwknZ2l0aycKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tCitEb2N1bWVudGF0aW9uIGJ5IEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorCitHSVQKKy0tLQorUGFydCBvZiB0aGUgZ2l0bGluazpnaXRbN10gc3VpdGUKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9nbG9zc2FyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2dsb3NzYXJ5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDQ0OWNhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9nbG9zc2FyeS50eHQKQEAgLTAsMCArMSwzMzMgQEAKK2FsdGVybmF0ZSBvYmplY3QgZGF0YWJhc2U6OgorCVZpYSB0aGUgYWx0ZXJuYXRlcyBtZWNoYW5pc20sIGEgcmVwb3NpdG9yeSBjYW4gaW5oZXJpdCBwYXJ0IG9mIGl0cworCW9iamVjdCBkYXRhYmFzZSBmcm9tIGFub3RoZXIgb2JqZWN0IGRhdGFiYXNlLCB3aGljaCBpcyBjYWxsZWQKKwkiYWx0ZXJuYXRlIi4KKworYmFyZSByZXBvc2l0b3J5OjoKKwlBIGJhcmUgcmVwb3NpdG9yeSBpcyBub3JtYWxseSBhbiBhcHByb3ByaWF0ZWx5IG5hbWVkCisJZGlyZWN0b3J5IHdpdGggYSBgLmdpdGAgc3VmZml4IHRoYXQgZG9lcyBub3QgaGF2ZSBhCisJbG9jYWxseSBjaGVja2VkLW91dCBjb3B5IG9mIGFueSBvZiB0aGUgZmlsZXMgdW5kZXIgcmV2aXNpb24KKwljb250cm9sLiAgVGhhdCBpcywgYWxsIG9mIHRoZSBgZ2l0YCBhZG1pbmlzdHJhdGl2ZSBhbmQKKwljb250cm9sIGZpbGVzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgcHJlc2VudCBpbiB0aGUKKwloaWRkZW4gYC5naXRgIHN1Yi1kaXJlY3RvcnkgYXJlIGRpcmVjdGx5IHByZXNlbnQgaW4KKwl0aGUgYHJlcG9zaXRvcnkuZ2l0YCBkaXJlY3RvcnkgaW5zdGVhZCwgYW5kIG5vIG90aGVyIGZpbGVzCisJYXJlIHByZXNlbnQgYW5kIGNoZWNrZWQgb3V0LiAgVXN1YWxseSBwdWJsaXNoZXJzIG9mIHB1YmxpYworCXJlcG9zaXRvcmllcyBtYWtlIGJhcmUgcmVwb3NpdG9yaWVzIGF2YWlsYWJsZS4KKworYmxvYiBvYmplY3Q6OgorCVVudHlwZWQgb2JqZWN0LCBlLmcuIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuCisKK2JyYW5jaDo6CisJQSBub24tY3ljbGljYWwgZ3JhcGggb2YgcmV2aXNpb25zLCBpLmUuIHRoZSBjb21wbGV0ZSBoaXN0b3J5IG9mCisJYSBwYXJ0aWN1bGFyIHJldmlzaW9uLCB3aGljaCBpcyBjYWxsZWQgdGhlIGJyYW5jaCBoZWFkLiBUaGUKKwlicmFuY2ggaGVhZHMgYXJlIHN0b3JlZCBpbiBgJEdJVF9ESVIvcmVmcy9oZWFkcy9gLgorCitjYWNoZTo6CisJT2Jzb2xldGUgZm9yOiBpbmRleC4KKworY2hhaW46OgorCUEgbGlzdCBvZiBvYmplY3RzLCB3aGVyZSBlYWNoIG9iamVjdCBpbiB0aGUgbGlzdCBjb250YWlucyBhCisJcmVmZXJlbmNlIHRvIGl0cyBzdWNjZXNzb3IgKGZvciBleGFtcGxlLCB0aGUgc3VjY2Vzc29yIG9mIGEgY29tbWl0CisJY291bGQgYmUgb25lIG9mIGl0cyBwYXJlbnRzKS4KKworY2hhbmdlc2V0OjoKKwlCaXRLZWVwZXIvY3ZzcHMgc3BlYWsgZm9yICJjb21taXQiLiBTaW5jZSBnaXQgZG9lcyBub3Qgc3RvcmUKKwljaGFuZ2VzLCBidXQgc3RhdGVzLCBpdCByZWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSB0byB1c2UKKwl0aGUgdGVybSAiY2hhbmdlc2V0cyIgd2l0aCBnaXQuCisKK2NoZWNrb3V0OjoKKwlUaGUgYWN0aW9uIG9mIHVwZGF0aW5nIHRoZSB3b3JraW5nIHRyZWUgdG8gYSByZXZpc2lvbiB3aGljaCB3YXMKKwlzdG9yZWQgaW4gdGhlIG9iamVjdCBkYXRhYmFzZS4KKworY2hlcnJ5LXBpY2tpbmc6OgorCUluIFNDTSBqYXJnb24sICJjaGVycnkgcGljayIgbWVhbnMgdG8gY2hvb3NlIGEgc3Vic2V0IG9mCisJY2hhbmdlcyBvdXQgb2YgYSBzZXJpZXMgb2YgY2hhbmdlcyAodHlwaWNhbGx5IGNvbW1pdHMpCisJYW5kIHJlY29yZCB0aGVtIGFzIGEgbmV3IHNlcmllcyBvZiBjaGFuZ2VzIG9uIHRvcCBvZgorCWRpZmZlcmVudCBjb2RlYmFzZS4gIEluIEdJVCwgdGhpcyBpcyBwZXJmb3JtZWQgYnkKKwkiZ2l0IGNoZXJyeS1waWNrIiBjb21tYW5kIHRvIGV4dHJhY3QgdGhlIGNoYW5nZQorCWludHJvZHVjZWQgYnkgYW4gZXhpc3RpbmcgY29tbWl0IGFuZCB0byByZWNvcmQgaXQgYmFzZWQKKwlvbiB0aGUgdGlwIG9mIHRoZSBjdXJyZW50IGJyYW5jaCBhcyBhIG5ldyBjb21taXQuCisKK2NsZWFuOjoKKwlBIHdvcmtpbmcgdHJlZSBpcyBjbGVhbiwgaWYgaXQgY29ycmVzcG9uZHMgdG8gdGhlIHJldmlzaW9uCisJcmVmZXJlbmNlZCBieSB0aGUgY3VycmVudCBoZWFkLiAgQWxzbyBzZWUgImRpcnR5Ii4KKworY29tbWl0OjoKKwlBcyBhIHZlcmI6IFRoZSBhY3Rpb24gb2Ygc3RvcmluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW5kZXggaW4gdGhlCisJb2JqZWN0IGRhdGFiYXNlLiBUaGUgcmVzdWx0IGlzIGEgcmV2aXNpb24uCisJQXMgYSBub3VuOiBTaG9ydCBoYW5kIGZvciBjb21taXQgb2JqZWN0LgorCitjb21taXQgb2JqZWN0OjoKKwlBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhcgorCXJldmlzaW9uLCBzdWNoIGFzIHBhcmVudHMsIGNvbW1pdHRlciwgYXV0aG9yLCBkYXRlIGFuZCB0aGUKKwl0cmVlIG9iamVjdCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgdG9wIGRpcmVjdG9yeSBvZiB0aGUKKwlzdG9yZWQgcmV2aXNpb24uCisKK2NvcmUgZ2l0OjoKKwlGdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHV0aWxpdGllcyBvZiBnaXQuIEV4cG9zZXMgb25seQorCWxpbWl0ZWQgc291cmNlIGNvZGUgbWFuYWdlbWVudCB0b29scy4KKworREFHOjoKKwlEaXJlY3RlZCBhY3ljbGljIGdyYXBoLiBUaGUgY29tbWl0IG9iamVjdHMgZm9ybSBhIGRpcmVjdGVkIGFjeWNsaWMKKwlncmFwaCwgYmVjYXVzZSB0aGV5IGhhdmUgcGFyZW50cyAoZGlyZWN0ZWQpLCBhbmQgdGhlIGdyYXBoIG9mIGNvbW1pdAorCW9iamVjdHMgaXMgYWN5Y2xpYyAodGhlcmUgaXMgbm8gY2hhaW4gd2hpY2ggYmVnaW5zIGFuZCBlbmRzIHdpdGggdGhlCisJc2FtZSBvYmplY3QpLgorCitkaXJjYWNoZTo6CisJWW91IGFyZSAqd2FhYWFheSogYmVoaW5kLgorCitkaXJ0eTo6CisJQSB3b3JraW5nIHRyZWUgaXMgc2FpZCB0byBiZSBkaXJ0eSBpZiBpdCBjb250YWlucyBtb2RpZmljYXRpb25zCisJd2hpY2ggaGF2ZSBub3QgYmVlbiBjb21taXR0ZWQgdG8gdGhlIGN1cnJlbnQgYnJhbmNoLgorCitkaXJlY3Rvcnk6OgorCVRoZSBsaXN0IHlvdSBnZXQgd2l0aCAibHMiIDotKQorCitlbnQ6OgorCUZhdm9yaXRlIHN5bm9ueW0gdG8gInRyZWUtaXNoIiBieSBzb21lIHRvdGFsIGdlZWtzLiBTZWUKKwlgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbnRfKE1pZGRsZS1lYXJ0aClgIGZvciBhbiBpbi1kZXB0aAorCWV4cGxhbmF0aW9uLiAgQXZvaWQgdGhpcyB0ZXJtLCBub3QgdG8gY29uZnVzZSBwZW9wbGUuCisKK2Zhc3QgZm9yd2FyZDo6CisJQSBmYXN0LWZvcndhcmQgaXMgYSBzcGVjaWFsIHR5cGUgb2YgbWVyZ2Ugd2hlcmUgeW91IGhhdmUKKwlhIHJldmlzaW9uIGFuZCB5b3UgYXJlICJtZXJnaW5nIiBhbm90aGVyIGJyYW5jaCdzIGNoYW5nZXMKKwl0aGF0IGhhcHBlbiB0byBiZSBhIGRlc2NlbmRhbnQgb2Ygd2hhdCB5b3UgaGF2ZS4KKwlJbiBzdWNoIHRoZXNlIGNhc2VzLCB5b3UgZG8gbm90IG1ha2UgYSBuZXcgbWVyZ2UgY29tbWl0IGJ1dAorCWluc3RlYWQganVzdCB1cGRhdGUgdG8gaGlzIHJldmlzaW9uLiBUaGlzIHdpbGwgaGFwcGVuCisJZnJlcXVlbnRseSBvbiBhIHRyYWNraW5nIGJyYW5jaCBvZiBhIHJlbW90ZSByZXBvc2l0b3J5LgorCitmZXRjaDo6CisJRmV0Y2hpbmcgYSBicmFuY2ggbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncyBoZWFkIHJlZiBmcm9tIGEKKwlyZW1vdGUgcmVwb3NpdG9yeSwgdG8gZmluZCBvdXQgd2hpY2ggb2JqZWN0cyBhcmUgbWlzc2luZyBmcm9tCisJdGhlIGxvY2FsIG9iamVjdCBkYXRhYmFzZSwgYW5kIHRvIGdldCB0aGVtLCB0b28uCisKK2ZpbGUgc3lzdGVtOjoKKwlMaW51cyBUb3J2YWxkcyBvcmlnaW5hbGx5IGRlc2lnbmVkIGdpdCB0byBiZSBhIHVzZXIgc3BhY2UgZmlsZQorCXN5c3RlbSwgaS5lLiB0aGUgaW5mcmFzdHJ1Y3R1cmUgdG8gaG9sZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisJVGhhdCBlbnN1cmVkIHRoZSBlZmZpY2llbmN5IGFuZCBzcGVlZCBvZiBnaXQuCisKK2dpdCBhcmNoaXZlOjoKKwlTeW5vbnltIGZvciByZXBvc2l0b3J5IChmb3IgYXJjaCBwZW9wbGUpLgorCitncmFmdHM6OgorCUdyYWZ0cyBlbmFibGVzIHR3byBvdGhlcndpc2UgZGlmZmVyZW50IGxpbmVzIG9mIGRldmVsb3BtZW50IHRvIGJlCisJam9pbmVkIHRvZ2V0aGVyIGJ5IHJlY29yZGluZyBmYWtlIGFuY2VzdHJ5IGluZm9ybWF0aW9uIGZvciBjb21taXRzLgorCVRoaXMgd2F5IHlvdSBjYW4gbWFrZSBnaXQgcHJldGVuZCB0aGUgc2V0IG9mIHBhcmVudHMgYSBjb21taXQKKwloYXMgaXMgZGlmZmVyZW50IGZyb20gd2hhdCB3YXMgcmVjb3JkZWQgd2hlbiB0aGUgY29tbWl0IHdhcyBjcmVhdGVkLgorCUNvbmZpZ3VyZWQgdmlhIHRoZSBgLmdpdC9pbmZvL2dyYWZ0c2AgZmlsZS4KKworaGFzaDo6CisJSW4gZ2l0J3MgY29udGV4dCwgc3lub255bSB0byBvYmplY3QgbmFtZS4KKworaGVhZDo6CisJVGhlIHRvcCBvZiBhIGJyYW5jaC4gSXQgY29udGFpbnMgYSByZWYgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKwljb21taXQgb2JqZWN0LgorCitoZWFkIHJlZjo6CisJQSByZWYgcG9pbnRpbmcgdG8gYSBoZWFkLiBPZnRlbiwgdGhpcyBpcyBhYmJyZXZpYXRlZCB0byAiaGVhZCIuCisJSGVhZCByZWZzIGFyZSBzdG9yZWQgaW4gYCRHSVRfRElSL3JlZnMvaGVhZHMvYC4KKworaG9vazo6CisJRHVyaW5nIHRoZSBub3JtYWwgZXhlY3V0aW9uIG9mIHNldmVyYWwgZ2l0IGNvbW1hbmRzLAorCWNhbGwtb3V0cyBhcmUgbWFkZSB0byBvcHRpb25hbCBzY3JpcHRzIHRoYXQgYWxsb3cKKwlhIGRldmVsb3BlciB0byBhZGQgZnVuY3Rpb25hbGl0eSBvciBjaGVja2luZy4KKwlUeXBpY2FsbHksIHRoZSBob29rcyBhbGxvdyBmb3IgYSBjb21tYW5kIHRvIGJlIHByZS12ZXJpZmllZAorCWFuZCBwb3RlbnRpYWxseSBhYm9ydGVkLCBhbmQgYWxsb3cgZm9yIGEgcG9zdC1ub3RpZmljYXRpb24KKwlhZnRlciB0aGUgb3BlcmF0aW9uIGlzIGRvbmUuCisJVGhlIGhvb2sgc2NyaXB0cyBhcmUgZm91bmQgaW4gdGhlIGAkR0lUX0RJUi9ob29rcy9gIGRpcmVjdG9yeSwKKwlhbmQgYXJlIGVuYWJsZWQgYnkgc2ltcGx5IG1ha2luZyB0aGVtIGV4ZWN1dGFibGUuCisKK2luZGV4OjoKKwlBIGNvbGxlY3Rpb24gb2YgZmlsZXMgd2l0aCBzdGF0IGluZm9ybWF0aW9uLCB3aG9zZSBjb250ZW50cyBhcmUKKwlzdG9yZWQgYXMgb2JqZWN0cy4gVGhlIGluZGV4IGlzIGEgc3RvcmVkIHZlcnNpb24gb2YgeW91ciB3b3JraW5nCisJdHJlZS4gVHJ1dGggYmUgdG9sZCwgaXQgY2FuIGFsc28gY29udGFpbiBhIHNlY29uZCwgYW5kIGV2ZW4gYSB0aGlyZAorCXZlcnNpb24gb2YgYSB3b3JraW5nIHRyZWUsIHdoaWNoIGFyZSB1c2VkIHdoZW4gbWVyZ2luZy4KKworaW5kZXggZW50cnk6OgorCVRoZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYSBwYXJ0aWN1bGFyIGZpbGUsIHN0b3JlZCBpbiB0aGUgaW5kZXguCisJQW4gaW5kZXggZW50cnkgY2FuIGJlIHVubWVyZ2VkLCBpZiBhIG1lcmdlIHdhcyBzdGFydGVkLCBidXQgbm90CisJeWV0IGZpbmlzaGVkIChpLmUuIGlmIHRoZSBpbmRleCBjb250YWlucyBtdWx0aXBsZSB2ZXJzaW9ucyBvZgorCXRoYXQgZmlsZSkuCisKK21hc3Rlcjo6CisJVGhlIGRlZmF1bHQgZGV2ZWxvcG1lbnQgYnJhbmNoLiBXaGVuZXZlciB5b3UgY3JlYXRlIGEgZ2l0CisJcmVwb3NpdG9yeSwgYSBicmFuY2ggbmFtZWQgIm1hc3RlciIgaXMgY3JlYXRlZCwgYW5kIGJlY29tZXMKKwl0aGUgYWN0aXZlIGJyYW5jaC4gSW4gbW9zdCBjYXNlcywgdGhpcyBjb250YWlucyB0aGUgbG9jYWwKKwlkZXZlbG9wbWVudCwgdGhvdWdoIHRoYXQgaXMgcHVyZWx5IGNvbnZlbnRpb25hbCBhbmQgbm90IHJlcXVpcmVkLgorCittZXJnZTo6CisJVG8gbWVyZ2UgYnJhbmNoZXMgbWVhbnMgdG8gdHJ5IHRvIGFjY3VtdWxhdGUgdGhlIGNoYW5nZXMgc2luY2UgYQorCWNvbW1vbiBhbmNlc3RvciBhbmQgYXBwbHkgdGhlbSB0byB0aGUgZmlyc3QgYnJhbmNoLiBBbiBhdXRvbWF0aWMKKwltZXJnZSB1c2VzIGhldXJpc3RpY3MgdG8gYWNjb21wbGlzaCB0aGF0LiBFdmlkZW50bHksIGFuIGF1dG9tYXRpYworCW1lcmdlIGNhbiBmYWlsLgorCitvYmplY3Q6OgorCVRoZSB1bml0IG9mIHN0b3JhZ2UgaW4gZ2l0LiBJdCBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5CisJdGhlIFNIQTEgb2YgaXRzIGNvbnRlbnRzLiBDb25zZXF1ZW50bHksIGFuIG9iamVjdCBjYW4gbm90CisJYmUgY2hhbmdlZC4KKworb2JqZWN0IGRhdGFiYXNlOjoKKwlTdG9yZXMgYSBzZXQgb2YgIm9iamVjdHMiLCBhbmQgYW4gaW5kaXZpZHVhbCBvYmplY3QgaXMgaWRlbnRpZmllZAorCWJ5IGl0cyBvYmplY3QgbmFtZS4gVGhlIG9iamVjdHMgdXN1YWxseSBsaXZlIGluIGAkR0lUX0RJUi9vYmplY3RzL2AuCisKK29iamVjdCBpZGVudGlmaWVyOjoKKwlTeW5vbnltIGZvciBvYmplY3QgbmFtZS4KKworb2JqZWN0IG5hbWU6OgorCVRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiBhbiBvYmplY3QuIFRoZSBoYXNoIG9mIHRoZSBvYmplY3QncyBjb250ZW50cworCXVzaW5nIHRoZSBTZWN1cmUgSGFzaCBBbGdvcml0aG0gMSBhbmQgdXN1YWxseSByZXByZXNlbnRlZCBieSB0aGUgNDAKKwljaGFyYWN0ZXIgaGV4YWRlY2ltYWwgZW5jb2Rpbmcgb2YgdGhlIGhhc2ggb2YgdGhlIG9iamVjdCAocG9zc2libHkKKwlmb2xsb3dlZCBieSBhIHdoaXRlIHNwYWNlKS4KKworb2JqZWN0IHR5cGU6CisJT25lIG9mIHRoZSBpZGVudGlmaWVycyAiY29tbWl0IiwidHJlZSIsInRhZyIgYW5kICJibG9iIiBkZXNjcmliaW5nCisJdGhlIHR5cGUgb2YgYW4gb2JqZWN0LgorCitvY3RvcHVzOjoKKwlUbyBtZXJnZSBtb3JlIHRoYW4gdHdvIGJyYW5jaGVzLiBBbHNvIGRlbm90ZXMgYW4gaW50ZWxsaWdlbnQKKwlwcmVkYXRvci4KKworb3JpZ2luOjoKKwlUaGUgZGVmYXVsdCB1cHN0cmVhbSB0cmFja2luZyBicmFuY2guIE1vc3QgcHJvamVjdHMgaGF2ZSBhdAorCWxlYXN0IG9uZSB1cHN0cmVhbSBwcm9qZWN0IHdoaWNoIHRoZXkgdHJhY2suIEJ5IGRlZmF1bHQKKwknb3JpZ2luJyBpcyB1c2VkIGZvciB0aGF0IHB1cnBvc2UuICBOZXcgdXBzdHJlYW0gdXBkYXRlcworCXdpbGwgYmUgZmV0Y2hlZCBpbnRvIHRoaXMgYnJhbmNoOyB5b3Ugc2hvdWxkIG5ldmVyIGNvbW1pdAorCXRvIGl0IHlvdXJzZWxmLgorCitwYWNrOjoKKwlBIHNldCBvZiBvYmplY3RzIHdoaWNoIGhhdmUgYmVlbiBjb21wcmVzc2VkIGludG8gb25lIGZpbGUgKHRvIHNhdmUKKwlzcGFjZSBvciB0byB0cmFuc21pdCB0aGVtIGVmZmljaWVudGx5KS4KKworcGFjayBpbmRleDo6CisJVGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMsIGFuZCBvdGhlciBpbmZvcm1hdGlvbiwgb2YgdGhlIG9iamVjdHMgaW4gYQorCXBhY2ssIHRvIGFzc2lzdCBpbiBlZmZpY2llbnRseSBhY2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGEgcGFjay4KKworcGFyZW50OjoKKwlBIGNvbW1pdCBvYmplY3QgY29udGFpbnMgYSAocG9zc2libHkgZW1wdHkpIGxpc3Qgb2YgdGhlIGxvZ2ljYWwKKwlwcmVkZWNlc3NvcihzKSBpbiB0aGUgbGluZSBvZiBkZXZlbG9wbWVudCwgaS5lLiBpdHMgcGFyZW50cy4KKworcGlja2F4ZTo6CisJVGhlIHRlcm0gcGlja2F4ZSByZWZlcnMgdG8gYW4gb3B0aW9uIHRvIHRoZSBkaWZmY29yZSByb3V0aW5lcworCXRoYXQgaGVscCBzZWxlY3QgY2hhbmdlcyB0aGF0IGFkZCBvciBkZWxldGUgYSBnaXZlbiB0ZXh0IHN0cmluZy4KKwlXaXRoIHRoZSAtLXBpY2theGUtYWxsIG9wdGlvbiwgaXQgY2FuIGJlIHVzZWQgdG8gdmlldyB0aGUKKwlmdWxsIGNoYW5nZXNldCB0aGF0IGludHJvZHVjZWQgb3IgcmVtb3ZlZCwgc2F5LCBhIHBhcnRpY3VsYXIKKwlsaW5lIG9mIHRleHQuICBTZWUgZ2l0bGluazpnaXQtZGlmZlsxXS4KKworcGx1bWJpbmc6OgorCUN1dGUgbmFtZSBmb3IgY29yZSBnaXQuCisKK3BvcmNlbGFpbjo6CisJQ3V0ZSBuYW1lIGZvciBwcm9ncmFtcyBhbmQgcHJvZ3JhbSBzdWl0ZXMgZGVwZW5kaW5nIG9uIGNvcmUgZ2l0LAorCXByZXNlbnRpbmcgYSBoaWdoIGxldmVsIGFjY2VzcyB0byBjb3JlIGdpdC4gUG9yY2VsYWlucyBleHBvc2UKKwltb3JlIG9mIGEgU0NNIGludGVyZmFjZSB0aGFuIHRoZSBwbHVtYmluZy4KKworcHVsbDo6CisJUHVsbGluZyBhIGJyYW5jaCBtZWFucyB0byBmZXRjaCBpdCBhbmQgbWVyZ2UgaXQuCisKK3B1c2g6OgorCVB1c2hpbmcgYSBicmFuY2ggbWVhbnMgdG8gZ2V0IHRoZSBicmFuY2gncyBoZWFkIHJlZiBmcm9tIGEgcmVtb3RlCisJcmVwb3NpdG9yeSwgZmluZCBvdXQgaWYgaXQgaXMgYW4gYW5jZXN0b3IgdG8gdGhlIGJyYW5jaCdzIGxvY2FsCisJaGVhZCByZWYgaXMgYSBkaXJlY3QsIGFuZCBpbiB0aGF0IGNhc2UsIHB1dHRpbmcgYWxsIG9iamVjdHMsIHdoaWNoCisJYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBsb2NhbCBoZWFkIHJlZiwgYW5kIHdoaWNoIGFyZSBtaXNzaW5nIGZyb20KKwl0aGUgcmVtb3RlIHJlcG9zaXRvcnksIGludG8gdGhlIHJlbW90ZSBvYmplY3QgZGF0YWJhc2UsIGFuZCB1cGRhdGluZworCXRoZSByZW1vdGUgaGVhZCByZWYuIElmIHRoZSByZW1vdGUgaGVhZCBpcyBub3QgYW4gYW5jZXN0b3IgdG8gdGhlCisJbG9jYWwgaGVhZCwgdGhlIHB1c2ggZmFpbHMuCisKK3JlYWNoYWJsZTo6CisJQW4gb2JqZWN0IGlzIHJlYWNoYWJsZSBmcm9tIGEgcmVmL2NvbW1pdC90cmVlL3RhZywgaWYgdGhlcmUgaXMgYQorCWNoYWluIGxlYWRpbmcgZnJvbSB0aGUgbGF0dGVyIHRvIHRoZSBmb3JtZXIuCisKK3JlYmFzZTo6CisJVG8gY2xlYW4gYSBicmFuY2ggYnkgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbWFpbiBsaW5lIG9mCisJZGV2ZWxvcG1lbnQgKCJtYXN0ZXIiKSwgYW5kIHJlYXBwbHkgdGhlIChwb3NzaWJseSBjaGVycnktcGlja2VkKQorCWNoYW5nZXMgZnJvbSB0aGF0IGJyYW5jaC4KKworcmVmOjoKKwlBIDQwLWJ5dGUgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGEgU0hBMSBvciBhIG5hbWUgdGhhdCBkZW5vdGVzCisJYSBwYXJ0aWN1bGFyIG9iamVjdC4gVGhlc2UgbWF5IGJlIHN0b3JlZCBpbiBgJEdJVF9ESVIvcmVmcy9gLgorCityZWZzcGVjOjoKKwlBIHJlZnNwZWMgaXMgdXNlZCBieSBmZXRjaCBhbmQgcHVzaCB0byBkZXNjcmliZSB0aGUgbWFwcGluZworCWJldHdlZW4gcmVtb3RlIHJlZiBhbmQgbG9jYWwgcmVmLiAgVGhleSBhcmUgY29tYmluZWQgd2l0aAorCWEgY29sb24gaW4gdGhlIGZvcm1hdCA8c3JjPjo8ZHN0PiwgcHJlY2VkZWQgYnkgYW4gb3B0aW9uYWwKKwlwbHVzIHNpZ24sICsuICBGb3IgZXhhbXBsZToKKwlgZ2l0IGZldGNoICRVUkwgcmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9vcmlnaW5gCisJbWVhbnMgImdyYWIgdGhlIG1hc3RlciBicmFuY2ggaGVhZCBmcm9tIHRoZSAkVVJMIGFuZCBzdG9yZQorCWl0IGFzIG15IG9yaWdpbiBicmFuY2ggaGVhZCIuCisJQW5kIGBnaXQgcHVzaCAkVVJMIHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvdG8tdXBzdHJlYW1gCisJbWVhbnMgInB1Ymxpc2ggbXkgbWFzdGVyIGJyYW5jaCBoZWFkIGFzIHRvLXVwc3RyZWFtIG1hc3RlciBoZWFkCisJYXQgJFVSTCIuICAgU2VlIGFsc28gZ2l0bGluazpnaXQtcHVzaFsxXQorCityZXBvc2l0b3J5OjoKKwlBIGNvbGxlY3Rpb24gb2YgcmVmcyB0b2dldGhlciB3aXRoIGFuIG9iamVjdCBkYXRhYmFzZSBjb250YWluaW5nCisJYWxsIG9iamVjdHMsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSB0aGUgcmVmcywgcG9zc2libHkgYWNjb21wYW5pZWQKKwlieSBtZXRhIGRhdGEgZnJvbSBvbmUgb3IgbW9yZSBwb3JjZWxhaW5zLiBBIHJlcG9zaXRvcnkgY2FuCisJc2hhcmUgYW4gb2JqZWN0IGRhdGFiYXNlIHdpdGggb3RoZXIgcmVwb3NpdG9yaWVzLgorCityZXNvbHZlOjoKKwlUaGUgYWN0aW9uIG9mIGZpeGluZyB1cCBtYW51YWxseSB3aGF0IGEgZmFpbGVkIGF1dG9tYXRpYyBtZXJnZQorCWxlZnQgYmVoaW5kLgorCityZXZpc2lvbjo6CisJQSBwYXJ0aWN1bGFyIHN0YXRlIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCB3YXMgc3RvcmVkIGluCisJdGhlIG9iamVjdCBkYXRhYmFzZS4gSXQgaXMgcmVmZXJlbmNlZCBieSBhIGNvbW1pdCBvYmplY3QuCisKK3Jld2luZDo6CisJVG8gdGhyb3cgYXdheSBwYXJ0IG9mIHRoZSBkZXZlbG9wbWVudCwgaS5lLiB0byBhc3NpZ24gdGhlIGhlYWQgdG8KKwlhbiBlYXJsaWVyIHJldmlzaW9uLgorCitTQ006OgorCVNvdXJjZSBjb2RlIG1hbmFnZW1lbnQgKHRvb2wpLgorCitTSEExOjoKKwlTeW5vbnltIGZvciBvYmplY3QgbmFtZS4KKwordG9waWMgYnJhbmNoOjoKKwlBIHJlZ3VsYXIgZ2l0IGJyYW5jaCB0aGF0IGlzIHVzZWQgYnkgYSBkZXZlbG9wZXIgdG8KKwlpZGVudGlmeSBhIGNvbmNlcHR1YWwgbGluZSBvZiBkZXZlbG9wbWVudC4gIFNpbmNlIGJyYW5jaGVzCisJYXJlIHZlcnkgZWFzeSBhbmQgaW5leHBlbnNpdmUsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0bworCWhhdmUgc2V2ZXJhbCBzbWFsbCBicmFuY2hlcyB0aGF0IGVhY2ggY29udGFpbiB2ZXJ5IHdlbGwKKwlkZWZpbmVkIGNvbmNlcHRzIG9yIHNtYWxsIGluY3JlbWVudGFsIHlldCByZWxhdGVkIGNoYW5nZXMuCisKK3RyYWNraW5nIGJyYW5jaDo6CisJQSByZWd1bGFyIGdpdCBicmFuY2ggdGhhdCBpcyB1c2VkIHRvIGZvbGxvdyBjaGFuZ2VzIGZyb20KKwlhbm90aGVyIHJlcG9zaXRvcnkuICBBIHRyYWNraW5nIGJyYW5jaCBzaG91bGQgbm90IGNvbnRhaW4KKwlkaXJlY3QgbW9kaWZpY2F0aW9ucyBvciBoYXZlIGxvY2FsIGNvbW1pdHMgbWFkZSB0byBpdC4KKwlBIHRyYWNraW5nIGJyYW5jaCBjYW4gdXN1YWxseSBiZSBpZGVudGlmaWVkIGFzIHRoZQorCXJpZ2h0LWhhbmQtc2lkZSByZWYgaW4gYSBQdWxsOiByZWZzcGVjLgorCit0cmVlIG9iamVjdDo6CisJQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZpbGUgbmFtZXMgYW5kIG1vZGVzIGFsb25nIHdpdGggcmVmcworCXRvIHRoZSBhc3NvY2lhdGVkIGJsb2IgYW5kL29yIHRyZWUgb2JqZWN0cy4gQSB0cmVlIGlzIGVxdWl2YWxlbnQKKwl0byBhIGRpcmVjdG9yeS4KKwordHJlZTo6CisJRWl0aGVyIGEgd29ya2luZyB0cmVlLCBvciBhIHRyZWUgb2JqZWN0IHRvZ2V0aGVyIHdpdGggdGhlCisJZGVwZW5kZW50IGJsb2IgYW5kIHRyZWUgb2JqZWN0cyAoaS5lLiBhIHN0b3JlZCByZXByZXNlbnRhdGlvbgorCW9mIGEgd29ya2luZyB0cmVlKS4KKwordHJlZS1pc2g6OgorCUEgcmVmIHBvaW50aW5nIHRvIGVpdGhlciBhIGNvbW1pdCBvYmplY3QsIGEgdHJlZSBvYmplY3QsIG9yIGEKKwl0YWcgb2JqZWN0IHBvaW50aW5nIHRvIGEgdGFnIG9yIGNvbW1pdCBvciB0cmVlIG9iamVjdC4KKwordGFnIG9iamVjdDo6CisJQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSByZWYgcG9pbnRpbmcgdG8gYW5vdGhlciBvYmplY3QsIHdoaWNoIGNhbgorCWNvbnRhaW4gYSBtZXNzYWdlIGp1c3QgbGlrZSBhIGNvbW1pdCBvYmplY3QuIEl0IGNhbiBhbHNvCisJY29udGFpbiBhIChQR1ApIHNpZ25hdHVyZSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBjYWxsZWQgYSAic2lnbmVkCisJdGFnIG9iamVjdCIuCisKK3RhZzo6CisJQSByZWYgcG9pbnRpbmcgdG8gYSB0YWcgb3IgY29tbWl0IG9iamVjdC4gSW4gY29udHJhc3QgdG8gYSBoZWFkLAorCWEgdGFnIGlzIG5vdCBjaGFuZ2VkIGJ5IGEgY29tbWl0LiBUYWdzIChub3QgdGFnIG9iamVjdHMpIGFyZQorCXN0b3JlZCBpbiBgJEdJVF9ESVIvcmVmcy90YWdzL2AuIEEgZ2l0IHRhZyBoYXMgbm90aGluZyB0byBkbyB3aXRoCisJYSBMaXNwIHRhZyAod2hpY2ggaXMgY2FsbGVkIG9iamVjdCB0eXBlIGluIGdpdCdzIGNvbnRleHQpLgorCUEgdGFnIGlzIG1vc3QgdHlwaWNhbGx5IHVzZWQgdG8gbWFyayBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlCisJY29tbWl0IGFuY2VzdHJ5IGNoYWluLgorCit1bm1lcmdlZCBpbmRleDoKKwlBbiBpbmRleCB3aGljaCBjb250YWlucyB1bm1lcmdlZCBpbmRleCBlbnRyaWVzLgorCit3b3JraW5nIHRyZWU6OgorCVRoZSBzZXQgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGN1cnJlbnRseSBiZWluZyB3b3JrZWQgb24sCisJaS5lLiB5b3UgY2FuIHdvcmsgaW4geW91ciB3b3JraW5nIHRyZWUgd2l0aG91dCB1c2luZyBnaXQgYXQgYWxsLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvb2tzLnR4dCBiL0RvY3VtZW50YXRpb24vaG9va3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGI0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvb2tzLnR4dApAQCAtMCwwICsxLDE2MCBAQAorSG9va3MgdXNlZCBieSBnaXQKKz09PT09PT09PT09PT09PT09CisKK0hvb2tzIGFyZSBsaXR0bGUgc2NyaXB0cyB5b3UgY2FuIHBsYWNlIGluIGAkR0lUX0RJUi9ob29rc2AKK2RpcmVjdG9yeSB0byB0cmlnZ2VyIGFjdGlvbiBhdCBjZXJ0YWluIHBvaW50cy4gIFdoZW4KK2BnaXQtaW5pdC1kYmAgaXMgcnVuLCBhIGhhbmRmdWwgZXhhbXBsZSBob29rcyBhcmUgY29waWVkIGluIHRoZQorYGhvb2tzYCBkaXJlY3Rvcnkgb2YgdGhlIG5ldyByZXBvc2l0b3J5LCBidXQgYnkgZGVmYXVsdCB0aGV5IGFyZQorYWxsIGRpc2FibGVkLiAgVG8gZW5hYmxlIGEgaG9vaywgbWFrZSBpdCBleGVjdXRhYmxlIHdpdGggYGNobW9kCisreGAuCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBjdXJyZW50bHkgZGVmaW5lZCBob29rcy4KKworYXBwbHlwYXRjaC1tc2cKKy0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtYXBwbHlwYXRjaGAgc2NyaXB0LCB3aGljaCBpcwordHlwaWNhbGx5IGludm9rZWQgYnkgYGdpdC1hcHBseW1ib3hgLiAgSXQgdGFrZXMgYSBzaW5nbGUKK3BhcmFtZXRlciwgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBob2xkcyB0aGUgcHJvcG9zZWQgY29tbWl0Citsb2cgbWVzc2FnZS4gIEV4aXRpbmcgd2l0aCBub24temVybyBzdGF0dXMgY2F1c2VzIHRoZQorJ2dpdC1hcHBseXBhdGNoJyB0byBhYm9ydCBiZWZvcmUgYXBwbHlpbmcgdGhlIHBhdGNoLgorCitUaGUgaG9vayBpcyBhbGxvd2VkIHRvIGVkaXQgdGhlIG1lc3NhZ2UgZmlsZSBpbiBwbGFjZSwgYW5kIGNhbgorYmUgdXNlZCB0byBub3JtYWxpemUgdGhlIG1lc3NhZ2UgaW50byBzb21lIHByb2plY3Qgc3RhbmRhcmQKK2Zvcm1hdCAoaWYgdGhlIHByb2plY3QgaGFzIG9uZSkuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmdXNlCit0aGUgY29tbWl0IGFmdGVyIGluc3BlY3RpbmcgdGhlIG1lc3NhZ2UgZmlsZS4KKworVGhlIGRlZmF1bHQgYXBwbHlwYXRjaC1tc2cgaG9vaywgd2hlbiBlbmFibGVkLCBydW5zIHRoZQorY29tbWl0LW1zZyBob29rLCBpZiB0aGUgbGF0dGVyIGlzIGVuYWJsZWQuCisKK3ByZS1hcHBseXBhdGNoCistLS0tLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWFwcGx5cGF0Y2hgIHNjcmlwdCwgd2hpY2ggaXMKK3R5cGljYWxseSBpbnZva2VkIGJ5IGBnaXQtYXBwbHltYm94YC4gIEl0IHRha2VzIG5vIHBhcmFtZXRlciwKK2FuZCBpcyBpbnZva2VkIGFmdGVyIHRoZSBwYXRjaCBpcyBhcHBsaWVkLCBidXQgYmVmb3JlIGEgY29tbWl0CitpcyBtYWRlLiAgRXhpdGluZyB3aXRoIG5vbi16ZXJvIHN0YXR1cyBjYXVzZXMgdGhlIHdvcmtpbmcgdHJlZQorYWZ0ZXIgYXBwbGljYXRpb24gb2YgdGhlIHBhdGNoIG5vdCBjb21taXR0ZWQuCisKK0l0IGNhbiBiZSB1c2VkIHRvIGluc3BlY3QgdGhlIGN1cnJlbnQgd29ya2luZyB0cmVlIGFuZCByZWZ1c2UgdG8KK21ha2UgYSBjb21taXQgaWYgaXQgZG9lcyBub3QgcGFzcyBjZXJ0YWluIHRlc3QuCisKK1RoZSBkZWZhdWx0IHByZS1hcHBseXBhdGNoIGhvb2ssIHdoZW4gZW5hYmxlZCwgcnVucyB0aGUKK3ByZS1jb21taXQgaG9vaywgaWYgdGhlIGxhdHRlciBpcyBlbmFibGVkLgorCitwb3N0LWFwcGx5cGF0Y2gKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LWFwcGx5cGF0Y2hgIHNjcmlwdCwgd2hpY2ggaXMKK3R5cGljYWxseSBpbnZva2VkIGJ5IGBnaXQtYXBwbHltYm94YC4gIEl0IHRha2VzIG5vIHBhcmFtZXRlciwKK2FuZCBpcyBpbnZva2VkIGFmdGVyIHRoZSBwYXRjaCBpcyBhcHBsaWVkIGFuZCBhIGNvbW1pdCBpcyBtYWRlLgorCitUaGlzIGhvb2sgaXMgbWVhbnQgcHJpbWFyaWx5IGZvciBub3RpZmljYXRpb24sIGFuZCBjYW5ub3QgYWZmZWN0Cit0aGUgb3V0Y29tZSBvZiBgZ2l0LWFwcGx5cGF0Y2hgLgorCitwcmUtY29tbWl0CistLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtY29tbWl0YCwgYW5kIGNhbiBiZSBieXBhc3NlZAord2l0aCBgXC0tbm8tdmVyaWZ5YCBvcHRpb24uICBJdCB0YWtlcyBubyBwYXJhbWV0ZXIsIGFuZCBpcworaW52b2tlZCBiZWZvcmUgb2J0YWluaW5nIHRoZSBwcm9wb3NlZCBjb21taXQgbG9nIG1lc3NhZ2UgYW5kCittYWtpbmcgYSBjb21taXQuICBFeGl0aW5nIHdpdGggbm9uLXplcm8gc3RhdHVzIGZyb20gdGhpcyBzY3JpcHQKK2NhdXNlcyB0aGUgYGdpdC1jb21taXRgIHRvIGFib3J0LgorCitUaGUgZGVmYXVsdCBwcmUtY29tbWl0IGhvb2ssIHdoZW4gZW5hYmxlZCwgY2F0Y2hlcyBpbnRyb2R1Y3Rpb24KK29mIGxpbmVzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZXMgYW5kIGFib3J0cyB0aGUgY29tbWl0IHdoZW4KK2Egc3VjaCBsaW5lIGlzIGZvdW5kLgorCitjb21taXQtbXNnCistLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtY29tbWl0YCwgYW5kIGNhbiBiZSBieXBhc3NlZAord2l0aCBgXC0tbm8tdmVyaWZ5YCBvcHRpb24uICBJdCB0YWtlcyBhIHNpbmdsZSBwYXJhbWV0ZXIsIHRoZQorbmFtZSBvZiB0aGUgZmlsZSB0aGF0IGhvbGRzIHRoZSBwcm9wb3NlZCBjb21taXQgbG9nIG1lc3NhZ2UuCitFeGl0aW5nIHdpdGggbm9uLXplcm8gc3RhdHVzIGNhdXNlcyB0aGUgYGdpdC1jb21taXRgIHRvCithYm9ydC4KKworVGhlIGhvb2sgaXMgYWxsb3dlZCB0byBlZGl0IHRoZSBtZXNzYWdlIGZpbGUgaW4gcGxhY2UsIGFuZCBjYW4KK2JlIHVzZWQgdG8gbm9ybWFsaXplIHRoZSBtZXNzYWdlIGludG8gc29tZSBwcm9qZWN0IHN0YW5kYXJkCitmb3JtYXQgKGlmIHRoZSBwcm9qZWN0IGhhcyBvbmUpLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlZnVzZQordGhlIGNvbW1pdCBhZnRlciBpbnNwZWN0aW5nIHRoZSBtZXNzYWdlIGZpbGUuCisKK1RoZSBkZWZhdWx0IGNvbW1pdC1tc2cgaG9vaywgd2hlbiBlbmFibGVkLCBkZXRlY3RzIGR1cGxpY2F0ZQorU2lnbmVkLW9mZi1ieTogbGluZXMsIGFuZCBhYm9ydHMgdGhlIGNvbW1pdCB3aGVuIG9uZSBpcyBmb3VuZC4KKworcG9zdC1jb21taXQKKy0tLS0tLS0tLS0tCisKK1RoaXMgaG9vayBpcyBpbnZva2VkIGJ5IGBnaXQtY29tbWl0YC4gIEl0IHRha2VzIG5vCitwYXJhbWV0ZXIsIGFuZCBpcyBpbnZva2VkIGFmdGVyIGEgY29tbWl0IGlzIG1hZGUuCisKK1RoaXMgaG9vayBpcyBtZWFudCBwcmltYXJpbHkgZm9yIG5vdGlmaWNhdGlvbiwgYW5kIGNhbm5vdCBhZmZlY3QKK3RoZSBvdXRjb21lIG9mIGBnaXQtY29tbWl0YC4KKworVGhlIGRlZmF1bHQgcG9zdC1jb21taXQgaG9vaywgd2hlbiBlbmFibGVkLCBkZW1vbnN0cmF0ZXMgaG93IHRvCitzZW5kIG91dCBhIGNvbW1pdCBub3RpZmljYXRpb24gZS1tYWlsLgorCit1cGRhdGUKKy0tLS0tLQorCitUaGlzIGhvb2sgaXMgaW52b2tlZCBieSBgZ2l0LXJlY2VpdmUtcGFja2Agb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5LAord2hpY2ggaXMgaGFwcGVucyB3aGVuIGEgYGdpdCBwdXNoYCBpcyBkb25lIG9uIGEgbG9jYWwgcmVwb3NpdG9yeS4KK0p1c3QgYmVmb3JlIHVwZGF0aW5nIHRoZSByZWYgb24gdGhlIHJlbW90ZSByZXBvc2l0b3J5LCB0aGUgdXBkYXRlIGhvb2sKK2lzIGludm9rZWQuICBJdHMgZXhpdCBzdGF0dXMgZGV0ZXJtaW5lcyB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mCit0aGUgcmVmIHVwZGF0ZS4KKworVGhlIGhvb2sgZXhlY3V0ZXMgb25jZSBmb3IgZWFjaCByZWYgdG8gYmUgdXBkYXRlZCwgYW5kIHRha2VzCit0aHJlZSBwYXJhbWV0ZXJzOgorICAgIC0gdGhlIG5hbWUgb2YgdGhlIHJlZiBiZWluZyB1cGRhdGVkLAorICAgIC0gdGhlIG9sZCBvYmplY3QgbmFtZSBzdG9yZWQgaW4gdGhlIHJlZiwKKyAgICAtIGFuZCB0aGUgbmV3IG9iamVjdG5hbWUgdG8gYmUgc3RvcmVkIGluIHRoZSByZWYuCisKK0EgemVybyBleGl0IGZyb20gdGhlIHVwZGF0ZSBob29rIGFsbG93cyB0aGUgcmVmIHRvIGJlIHVwZGF0ZWQuCitFeGl0aW5nIHdpdGggYSBub24temVybyBzdGF0dXMgcHJldmVudHMgYGdpdC1yZWNlaXZlLXBhY2tgCitmcm9tIHVwZGF0aW5nIHRoZSByZWYuCisKK1RoaXMgaG9vayBjYW4gYmUgdXNlZCB0byBwcmV2ZW50ICdmb3JjZWQnIHVwZGF0ZSBvbiBjZXJ0YWluIHJlZnMgYnkKK21ha2luZyBzdXJlIHRoYXQgdGhlIG9iamVjdCBuYW1lIGlzIGEgY29tbWl0IG9iamVjdCB0aGF0IGlzIGEKK2Rlc2NlbmRhbnQgb2YgdGhlIGNvbW1pdCBvYmplY3QgbmFtZWQgYnkgdGhlIG9sZCBvYmplY3QgbmFtZS4KK1RoYXQgaXMsIHRvIGVuZm9yY2UgYSAiZmFzdCBmb3J3YXJkIG9ubHkiIHBvbGljeS4KKworSXQgY291bGQgYWxzbyBiZSB1c2VkIHRvIGxvZyB0aGUgb2xkLi5uZXcgc3RhdHVzLiAgSG93ZXZlciwgaXQKK2RvZXMgbm90IGtub3cgdGhlIGVudGlyZSBzZXQgb2YgYnJhbmNoZXMsIHNvIGl0IHdvdWxkIGVuZCB1cAorZmlyaW5nIG9uZSBlLW1haWwgcGVyIHJlZiB3aGVuIHVzZWQgbmFpdmVseSwgdGhvdWdoLgorCitBbm90aGVyIHVzZSBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBpcyB0byB1c2UgdGhpcyBob29rIHRvCitpbXBsZW1lbnQgYWNjZXNzIGNvbnRyb2wgd2hpY2ggaXMgZmluZXIgZ3JhaW5lZCB0aGFuIHRoZSBvbmUKK2Jhc2VkIG9uIGZpbGVzeXN0ZW0gZ3JvdXAuCisKK1RoZSBzdGFuZGFyZCBvdXRwdXQgb2YgdGhpcyBob29rIGlzIHNlbnQgdG8gL2Rldi9udWxsOyBpZiB5b3UKK3dhbnQgdG8gcmVwb3J0IHNvbWV0aGluZyB0byB0aGUgZ2l0LXNlbmQtcGFjayBvbiB0aGUgb3RoZXIgZW5kLAoreW91IGNhbiByZWRpcmVjdCB5b3VyIG91dHB1dCB0byB5b3VyIHN0ZGVyci4KKworCitwb3N0LXVwZGF0ZQorLS0tLS0tLS0tLS0KKworVGhpcyBob29rIGlzIGludm9rZWQgYnkgYGdpdC1yZWNlaXZlLXBhY2tgIG9uIHRoZSByZW1vdGUgcmVwb3NpdG9yeSwKK3doaWNoIGlzIGhhcHBlbnMgd2hlbiBhIGBnaXQgcHVzaGAgaXMgZG9uZSBvbiBhIGxvY2FsIHJlcG9zaXRvcnkuCitJdCBleGVjdXRlcyBvbiB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgb25jZSBhZnRlciBhbGwgdGhlIHJlZnMgaGF2ZQorYmVlbiB1cGRhdGVkLgorCitJdCB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBlYWNoIG9mIHdoaWNoIGlzIHRoZQorbmFtZSBvZiByZWYgdGhhdCB3YXMgYWN0dWFsbHkgdXBkYXRlZC4KKworVGhpcyBob29rIGlzIG1lYW50IHByaW1hcmlseSBmb3Igbm90aWZpY2F0aW9uLCBhbmQgY2Fubm90IGFmZmVjdAordGhlIG91dGNvbWUgb2YgYGdpdC1yZWNlaXZlLXBhY2tgLgorCitUaGUgcG9zdC11cGRhdGUgaG9vayBjYW4gdGVsbCB3aGF0IGFyZSB0aGUgaGVhZHMgdGhhdCB3ZXJlIHB1c2hlZCwKK2J1dCBpdCBkb2VzIG5vdCBrbm93IHdoYXQgdGhlaXIgb3JpZ2luYWwgYW5kIHVwZGF0ZWQgdmFsdWVzIGFyZSwKK3NvIGl0IGlzIGEgcG9vciBwbGFjZSB0byBkbyBsb2cgb2xkLi5uZXcuCisKK1RoZSBkZWZhdWx0IHBvc3QtdXBkYXRlIGhvb2ssIHdoZW4gZW5hYmxlZCwgcnVucworYGdpdC11cGRhdGUtc2VydmVyLWluZm9gIHRvIGtlZXAgdGhlIGluZm9ybWF0aW9uIHVzZWQgYnkgZHVtYgordHJhbnNwb3J0cyAoZS5nLiwgaHR0cCkgdXAtdG8tZGF0ZS4gIElmIHlvdSBhcmUgcHVibGlzaGluZworYSBnaXQgcmVwb3NpdG9yeSB0aGF0IGlzIGFjY2Vzc2libGUgdmlhIGh0dHAsIHlvdSBzaG91bGQKK3Byb2JhYmx5IGVuYWJsZSB0aGlzIGhvb2suCisKK1RoZSBzdGFuZGFyZCBvdXRwdXQgb2YgdGhpcyBob29rIGlzIHNlbnQgdG8gL2Rldi9udWxsOyBpZiB5b3UKK3dhbnQgdG8gcmVwb3J0IHNvbWV0aGluZyB0byB0aGUgZ2l0LXNlbmQtcGFjayBvbiB0aGUgb3RoZXIgZW5kLAoreW91IGNhbiByZWRpcmVjdCB5b3VyIG91dHB1dCB0byB5b3VyIHN0ZGVyci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8taW5kZXguc2ggYi9Eb2N1bWVudGF0aW9uL2hvd3RvLWluZGV4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0YWEzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvLWluZGV4LnNoCkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9zaAorCitjYXQgPDxcRU9GCitHSVQgSG93dG8gSW5kZXgKKz09PT09PT09PT09PT09PQorCitIZXJlIGlzIGEgY29sbGVjdGlvbiBvZiBtYWlsaW5nIGxpc3QgcG9zdGluZ3MgbWFkZSBieSB2YXJpb3VzCitwZW9wbGUgZGVzY3JpYmluZyBob3cgdGhleSB1c2UgZ2l0IGluIHRoZWlyIHdvcmtmbG93LgorCitFT0YKKworZm9yIHR4dAorZG8KKwl0aXRsZT1gZXhwciAiJHR4dCIgOiAnLiovXCguKlwpXC50eHQkJ2AKKwlmcm9tPWBzZWQgLW5lICcKKwkvXiQvcQorCS9eRnJvbTpbIAldL3sKKwkJcy8vLworCQlzL15bIAldKi8vCisJCXMvWyAJXSokLy8KKwkJcy9eL2J5IC8KKwkJcAorCX0KKwknICIkdHh0ImAKKworCWFic3RyYWN0PWBzZWQgLW5lICcKKwkvXkFic3RyYWN0OlsgCV0veworCQlzL15bXiAJXSovLworCQl4CisJCXMvLiovLworCQl4CisJCTogYWdhaW4KKwkJL15bIAldL3sKKwkJCXMvXlsgCV0qLy8KKwkJCUgKKwkJCW4KKwkJCWIgYWdhaW4KKwkJfQorCQl4CisJCXAKKwkJcQorCX0nICIkdHh0ImAKKworCWlmIGdyZXAgJ0NvbnRlbnQtdHlwZTogdGV4dC9hc2NpaWRvYycgPi9kZXYvbnVsbCAkdHh0CisJdGhlbgorCQlmaWxlPWBleHByICIkdHh0IiA6ICdcKC4qXClcLnR4dCQnYC5odG1sCisJZWxzZQorCQlmaWxlPSIkdHh0IgorCWZpCisKKwllY2hvICIqIGxpbms6JGZpbGVbJHRpdGxlXSAkZnJvbQorJGFic3RyYWN0CisKKyIKKworZG9uZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9pc29sYXRlLWJ1Z3Mtd2l0aC1iaXNlY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9pc29sYXRlLWJ1Z3Mtd2l0aC1iaXNlY3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNmJiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL2lzb2xhdGUtYnVncy13aXRoLWJpc2VjdC50eHQKQEAgLTAsMCArMSw2NSBAQAorRnJvbToJTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzICgpIG9zZGwgISBvcmc+CitUbzoJZ2l0QHZnZXIua2VybmVsLm9yZworRGF0ZToJMjAwNS0xMS0wOCAxOjMxOjM0CitTdWJqZWN0OiBSZWFsLWxpZmUga2VybmVsIGRlYnVnZ2luZyBzY2VuYXJpbworQWJzdHJhY3Q6IFNob3J0LW4tc3dlZXQsIExpbnVzIHRlbGxzIHVzIGhvdyB0byBsZXZlcmFnZSBgZ2l0LWJpc2VjdGAgdG8gcGVyZm9ybQorCWJ1ZyBpc29sYXRpb24gb24gYSByZXBvc2l0b3J5IHdoZXJlICJnb29kIiBhbmQgImJhZCIgcmV2aXNpb25zIGFyZSBrbm93bgorCWluIG9yZGVyIHRvIGlkZW50aWZ5IGEgc3VzcGVjdCBjb21taXQuCisKKworSG93IFRvIFVzZSBnaXQtYmlzZWN0IFRvIElzb2xhdGUgYSBCb2d1cyBDb21taXQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSB3YXkgdG8gdXNlICJnaXQgYmlzZWN0IiBjb3VsZG4ndCBiZSBlYXNpZXIuCisKK0ZpZ3VyZSBvdXQgd2hhdCB0aGUgb2xkZXN0IGJhZCBzdGF0ZSB5b3Uga25vdyBhYm91dCBpcyAodGhhdCdzIHVzdWFsbHkgdGhlIAoraGVhZCBvZiAibWFzdGVyIiwgc2luY2UgdGhhdCdzIHdoYXQgeW91IGp1c3QgdHJpZWQgdG8gYm9vdCBhbmQgZmFpbGVkIGF0KS4gCitBbHNvLCBmaWd1cmUgb3V0IHRoZSBtb3N0IHJlY2VudCBrbm93bi1nb29kIGNvbW1pdCAodXN1YWxseSB0aGUgX3ByZXZpb3VzXyAKK2tlcm5lbCB5b3UgcmFuOiBhbmQgaWYgeW91J3ZlIG9ubHkgZG9uZSBhIHNpbmdsZSAicHVsbCIgaW4gYmV0d2VlbiwgaXQgCit3aWxsIGJlIE9SSUdfSEVBRCkuCisKK1RoZW4gZG8KKworCWdpdCBiaXNlY3Qgc3RhcnQKKwlnaXQgYmlzZWN0IGJhZCBtYXN0ZXIJCTwtIG1hcmsgIm1hc3RlciIgYXMgdGhlIGJhZCBzdGF0ZQorCWdpdCBiaXNlY3QgZ29vZCBPUklHX0hFQUQJPC0gbWFyayBPUklHX0hFQUQgYXMgZ29vZCAob3IKKwkJCQkJICAgd2hhdGV2ZXIgb3RoZXIga25vd24tZ29vZCAKKwkJCQkJICAgdGhpbmcgeW91IGJvb3RlZCBsYXN0KQorCithbmQgYXQgdGhpcyBwb2ludCAiZ2l0IGJpc2VjdCIgd2lsbCBjaHVybiBmb3IgYSB3aGlsZSwgYW5kIHRlbGwgeW91IHdoYXQgCit0aGUgbWlkLXBvaW50IGJldHdlZW4gdGhvc2UgdHdvIGNvbW1pdHMgYXJlLCBhbmQgY2hlY2sgdGhhdCBzdGF0ZSBvdXQgYXMgCit0aGUgaGVhZCBvZiB0aGUgbmV3ICJiaXNlY3QiIGJyYW5jaC4KKworQ29tcGlsZSBhbmQgcmVib290LgorCitJZiBpdCdzIGdvb2QsIGp1c3QgZG8KKworCWdpdCBiaXNlY3QgZ29vZAkJPC0gbWFyayBjdXJyZW50IGhlYWQgYXMgZ29vZAorCitvdGhlcndpc2UsIHJlYm9vdCBpbnRvIGEgZ29vZCBrZXJuZWwgaW5zdGVhZCwgYW5kIGRvIChzdXJwcmlzZSBzdXJwcmlzZSwgCitnaXQgcmVhbGx5IGlzIHZlcnkgaW50dWl0aXZlKToKKworCWdpdCBiaXNlY3QgYmFkCQk8LSBtYXJrIGN1cnJlbnQgaGVhZCBhcyBiYWQKKworYW5kIHdoYXRldmVyIHlvdSBkbywgZ2l0IHdpbGwgc2VsZWN0IGEgbmV3IGhhbGYtd2F5IHBvaW50LiBEbyB0aGlzIGZvciBhIAord2hpbGUsIHVudGlsIGdpdCB0ZWxscyB5b3UgZXhhY3RseSB3aGljaCBjb21taXQgd2FzIHRoZSBmaXJzdCBiYWQgY29tbWl0LiAKK1RoYXQncyB5b3VyIGN1bHByaXQuCisKK0l0IHJlYWxseSB3b3JrcyB3b25kZXJmdWxseSB3ZWxsLCBleGNlcHQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXJlIHdhcyAKK19hbm90aGVyXyBjb21taXQgdGhhdCBicm9rZSBzb21ldGhpbmcgaW4gYmV0d2VlbiwgbGlrZSBpbnRyb2R1Y2VkIHNvbWUgCitzdHVwaWQgY29tcGlsZSBlcnJvci4gSW4gdGhhdCBjYXNlIHlvdSBzaG91bGQgbm90IG1hcmsgdGhhdCBjb21taXQgZ29vZCBvciAKK2JhZDogeW91IHNob3VsZCB0cnkgdG8gZmluZCBhbm90aGVyIGNvbW1pdCBjbG9zZS1ieSwgYW5kIGRvIGEgImdpdCByZXNldCAKKy0taGFyZCA8bmV3Y29tbWl0PiIgdG8gdHJ5IG91dCBfdGhhdF8gY29tbWl0IGluc3RlYWQsIGFuZCB0aGVuIHRlc3QgdGhhdCAKK2luc3RlYWQgKGFuZCBtYXJrIGl0IGdvb2Qgb3IgYmFkKS4KKworWW91IGNhbiBkbyAiZ2l0IGJpc2VjdCB2aXN1YWxpemUiIHdoaWxlIHlvdSBkbyBhbGwgdGhpcyB0byBzZWUgd2hhdCdzIAorZ29pbmcgb24gYnkgc3RhcnRpbmcgdXAgZ2l0ayBvbiB0aGUgYmlzZWN0aW9uIHJhbmdlLgorCitGaW5hbGx5LCBvbmNlIHlvdSd2ZSBmaWd1cmVkIG91dCBleGFjdGx5IHdoaWNoIGNvbW1pdCB3YXMgYmFkLCB5b3UgY2FuIAordGhlbiBnbyBiYWNrIHRvIHRoZSBtYXN0ZXIgYnJhbmNoLCBhbmQgdHJ5IHJldmVydGluZyBqdXN0IHRoYXQgY29tbWl0OgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlcgorCWdpdCByZXZlcnQgPGJhZC1jb21taXQtaWQ+CisKK3RvIHZlcmlmeSB0aGF0IHRoZSB0b3Atb2Yta2VybmVsIHdvcmtzIHdpdGggdGhhdCBzaW5nbGUgY29tbWl0IHJldmVydGVkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL21ha2UtZGlzdC50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL21ha2UtZGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlMzMwYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vbWFrZS1kaXN0LnR4dApAQCAtMCwwICsxLDUyIEBACitEYXRlOiAgIEZyaSwgMTIgQXVnIDIwMDUgMjI6Mzk6NDggLTA3MDAgKFBEVCkKK0Zyb206IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK1RvOiBEYXZlIEpvbmVzIDxkYXZlakByZWRoYXQuY29tPgorY2M6IGdpdEB2Z2VyLmtlcm5lbC5vcmcKK1N1YmplY3Q6IFJlOiBGd2Q6IFJlOiBnaXQgY2hlY2tvdXQgLWYgYnJhbmNoIGRvZXNuJ3QgcmVtb3ZlIGV4dHJhIGZpbGVzCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBMaW51cyB0YWxrcyBhYm91dCBidWlsZGluZyBhIHRhcmJhbGwsCisgaW5jcmVtZW50YWwgcGF0Y2gsIGFuZCBDaGFuZ2VMb2csIGdpdmVuIGEgYmFzZSByZWxlYXNlIGFuZCB0d28KKyByYyByZWxlYXNlcywgZm9sbG93aW5nIHRoZSBjb252ZW50aW9uIG9mIGdpdmluZyB0aGUgcGF0Y2ggZnJvbQorIHRoZSBiYXNlIHJlbGVhc2UgYW5kIHRoZSBsYXRlc3QgcmMsIHdpdGggQ2hhbmdlTG9nIGJldHdlZW4gdGhlCisgbGFzdCByYyBhbmQgdGhlIGxhdGVzdCByYy4KKworT24gU2F0LCAxMyBBdWcgMjAwNSwgRGF2ZSBKb25lcyB3cm90ZToKKz4KKz4gID4gR2l0IGFjdHVhbGx5IGhhcyBhIF9sb3RfIG9mIG5pZnR5IHRvb2xzLiBJIGRpZG4ndCByZWFsaXplIHRoYXQgcGVvcGxlCis+ICA+IGRpZG4ndCBrbm93IGFib3V0IHN1Y2ggYmFzaWMgc3R1ZmYgYXMgImdpdC10YXItdHJlZSIgYW5kICJnaXQtbHMtZmlsZXMiLgorPgorPiBNYXliZSBpdHMgYmVjYXVzZSB0aGluZ3MgYXJlIG1vdmluZyBzbyBmYXN0IDopICBPciBtYXliZSBJIGp1c3Qgd2Fzbid0Cis+IHBheWluZyBhdHRlbnRpb24gb24gdGhhdCBkYXkuIChJIGV2ZW4gcmVhZCB0aGUgZ2l0IGNoYW5nZXMgdmlhIFJTUywKKz4gc28gSSBzaG91bGQgaGF2ZSBubyBleGN1c2UpLgorCitXZWxsLCBnaXQtdGFyLXRyZWUgaGFzIGJlZW4gdGhlcmUgc2luY2UgbGF0ZSBBcHJpbCAtIGl0J3MgYWN0dWFsbHkgb25lIG9mCit0aG9zZSByZWFsbHkgZWFybHkgY29tbWFuZHMuIEknbSBwcmV0dHkgc3VyZSB0aGUgUlNTIGZlZWQgY2FtZSBsYXRlciA7KQorCitJIHVzZSBpdCBhbGwgdGhlIHRpbWUgaW4gZG9pbmcgcmVsZWFzZXMsIGl0J3MgYSBsb3QgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYQordGFyIHRyZWUgYnkgcmVhZGluZyB0aGUgZmlsZXN5c3RlbSAoZXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZSB0byBjaGVjayB0aGluZ3MKK291dCkuIEEgaGlkZGVuIHBlYXJsLgorCitUaGlzIGlzIG15IGNyYXBweSAicmVsZWFzZS1zY3JpcHQiOgorCisgICAgICAgIFt0b3J2YWxkc0BnNSB+XSQgY2F0IGJpbi9yZWxlYXNlLXNjcmlwdAorICAgICAgICAjIS9iaW4vc2gKKyAgICAgICAgc3RhYmxlPSIkMSIKKyAgICAgICAgbGFzdD0iJDIiCisgICAgICAgIG5ldz0iJDMiCisgICAgICAgIGVjaG8gIiMgZ2l0LXRhZyB2JG5ldyIKKyAgICAgICAgZWNobyAiZ2l0LXRhci10cmVlIHYkbmV3IGxpbnV4LSRuZXcgfCBnemlwIC05ID4gLi4vbGludXgtJG5ldy50YXIuZ3oiCisgICAgICAgIGVjaG8gImdpdC1kaWZmLXRyZWUgLXAgdiRzdGFibGUgdiRuZXcgfCBnemlwIC05ID4gLi4vcGF0Y2gtJG5ldy5neiIKKyAgICAgICAgZWNobyAiZ2l0LXJldi1saXN0IC0tcHJldHR5IHYkbmV3IF52JGxhc3QgPiAuLi9DaGFuZ2VMb2ctJG5ldyIKKyAgICAgICAgZWNobyAiZ2l0LXJldi1saXN0IC0tcHJldHR5PXNob3J0IHYkbmV3IF52JGxhc3QgfCBnaXQtc2hvcnRsb2cgPiAuLi9TaG9ydExvZyIKKyAgICAgICAgZWNobyAiZ2l0LWRpZmYtdHJlZSAtcCB2JGxhc3QgdiRuZXcgfCBnaXQtYXBwbHkgLS1zdGF0ID4gLi4vZGlmZnN0YXQtJG5ldyIKKworYW5kIHdoZW4gSSB3YW50IHRvIGRvIGEgbmV3IGtlcm5lbCByZWxlYXNlIEkgbGl0ZXJhbGx5IGZpcnN0IHRhZyBpdCwgYW5kCit0aGVuIGRvCisKKyAgICAgICAgcmVsZWFzZS1zY3JpcHQgMi42LjEyIDIuNi4xMy1yYzYgMi42LjEzLXJjNworCithbmQgY2hlY2sgdGhhdCB0aGluZ3MgbG9vayBzYW5lLCBhbmQgdGhlbiBqdXN0IGN1dC1hbmQtcGFzdGUgdGhlIGNvbW1hbmRzLgorCitZZWFoLCBpdCdzIHN0dXBpZC4KKworICAgICAgICAgICAgICAgIExpbnVzCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vcmViYXNlLWFuZC1lZGl0LnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vcmViYXNlLWFuZC1lZGl0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDZjNTVjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtYW5kLWVkaXQudHh0CkBAIC0wLDAgKzEsODEgQEAKK0RhdGU6CVNhdCwgMTMgQXVnIDIwMDUgMjI6MTY6MDIgLTA3MDAgKFBEVCkKK0Zyb206CUxpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KK1RvOglTdGV2ZSBGcmVuY2ggPHNtZnJlbmNoQGF1c3Rpbi5yci5jb20+CitjYzoJZ2l0QHZnZXIua2VybmVsLm9yZworU3ViamVjdDogUmU6IHNlbmRpbmcgY2hhbmdlc2V0cyBmcm9tIHRoZSBtaWRkbGUgb2YgYSBnaXQgdHJlZQorQWJzdHJhY3Q6IEluIHRoaXMgYXJ0aWNsZSwgTGludXMgZGVtb25zdHJhdGVzIGhvdyBhIGJyb2tlbiBjb21taXQKKyBpbiBhIHNlcXVlbmNlIG9mIGNvbW1pdHMgY2FuIGJlIHJlbW92ZWQgYnkgcmV3aW5kaW5nIHRoZSBoZWFkIGFuZAorIHJlYXBwbHlpbmcgc2VsZWN0ZWQgY2hhbmdlcy4KKworT24gU2F0LCAxMyBBdWcgMjAwNSwgTGludXMgVG9ydmFsZHMgd3JvdGU6CisKKz4gVGhhdCdzIGNvcnJlY3QuIFNhbWUgdGhpbmdzIGFwcGx5OiB5b3UgY2FuIG1vdmUgYSBwYXRjaCBvdmVyLCBhbmQgY3JlYXRlIGEgCis+IG5ldyBvbmUgd2l0aCBhIG1vZGlmaWVkIGNvbW1lbnQsIGJ1dCBiYXNpY2FsbHkgdGhlIF9vbGRfIGNvbW1pdCB3aWxsIGJlIAorPiBpbW11dGFibGUuCisKK0xldCBtZSBjbGFyaWZ5LgorCitZb3UgY2FuIGVudGlyZWx5IF9kcm9wXyBvbGQgYnJhbmNoZXMsIHNvIGNvbW1pdHMgbWF5IGJlIGltbXV0YWJsZSwgYnV0Citub3RoaW5nIGZvcmNlcyB5b3UgdG8ga2VlcCB0aGVtLiBPZiBjb3Vyc2UsIHdoZW4geW91IGRyb3AgYSBjb21taXQsIHlvdSdsbCAKK2Fsd2F5cyBlbmQgdXAgZHJvcHBpbmcgYWxsIHRoZSBjb21taXRzIHRoYXQgZGVwZW5kZWQgb24gaXQsIGFuZCBpZiB5b3UgCithY3R1YWxseSBnb3Qgc29tZWJvZHkgZWxzZSB0byBwdWxsIHRoYXQgY29tbWl0IHlvdSBjYW4ndCBkcm9wIGl0IGZyb20gCitfdGhlaXJfIHJlcG9zaXRvcnksIGJ1dCB1bmRvaW5nIHRoaW5ncyBpcyBub3QgaW1wb3NzaWJsZS4KKworRm9yIGV4YW1wbGUsIGxldCdzIHNheSB0aGF0IHlvdSd2ZSBtYWRlIGEgbWVzcyBvZiB0aGluZ3M6IHlvdSd2ZSBjb21taXR0ZWQKK3RocmVlIGNvbW1pdHMgIm9sZC0+YS0+Yi0+YyIsIGFuZCB5b3Ugbm90aWNlIHRoYXQgImEiIHdhcyBicm9rZW4sIGJ1dCB5b3UKK3dhbnQgdG8gc2F2ZSAiYiIgYW5kICJjIi4gV2hhdCB5b3UgY2FuIGRvIGlzCisKKwkjIENyZWF0ZSBhIGJyYW5jaCAiYnJva2VuIiB0aGF0IGlzIHRoZSBjdXJyZW50IGNvZGUKKwkjIGZvciByZWZlcmVuY2UKKwlnaXQgYnJhbmNoIGJyb2tlbgorCisJIyBSZXNldCB0aGUgbWFpbiBicmFuY2ggdG8gdGhyZWUgcGFyZW50cyBiYWNrOiB0aGlzIAorCSMgZWZmZWN0aXZlbHkgdW5kb2VzIHRoZSB0aHJlZSB0b3AgY29tbWl0cworCWdpdCByZXNldCBIRUFEXl5eCisJZ2l0IGNoZWNrb3V0IC1mCisKKwkjIENoZWNrIHRoZSByZXN1bHQgdmlzdWFsbHkgdG8gbWFrZSBzdXJlIHlvdSBrbm93IHdoYXQncworCSMgZ29pbmcgb24KKwlnaXRrIC0tYWxsCisKKwkjIFJlLWFwcGx5IHRoZSB0d28gdG9wIG9uZXMgZnJvbSAiYnJva2VuIgorCSMKKwkjIEZpcnN0ICJwYXJlbnQgb2YgYnJva2VuIiAoYWthIGIpOgorCWdpdC1kaWZmLXRyZWUgLXAgYnJva2VuXiB8IGdpdC1hcHBseSAtLWluZGV4CisJZ2l0IGNvbW1pdCAtLXJlZWRpdD1icm9rZW5eCisKKwkjIFRoZW4gInRvcCBvZiBicm9rZW4iIChha2EgYyk6CisJZ2l0LWRpZmYtdHJlZSAtcCBicm9rZW4gfCBnaXQtYXBwbHkgLS1pbmRleAorCWdpdCBjb21taXQgLS1yZWVkaXQ9YnJva2VuCisKK2FuZCB5b3UndmUgbm93IHJlLWFwcGxpZWQgKGFuZCBwb3NzaWJseSBlZGl0ZWQgdGhlIGNvbW1lbnRzKSB0aGUgdHdvCitjb21taXRzIGIvYywgYW5kIGNvbW1pdCAiYSIgaXMgYmFzaWNhbGx5IGdvbmUgKGl0IHN0aWxsIGV4aXN0cyBpbiB0aGUKKyJicm9rZW4iIGJyYW5jaCwgb2YgY291cnNlKS4KKworRmluYWxseSwgY2hlY2sgb3V0IHRoZSBlbmQgcmVzdWx0IGFnYWluOgorCisJIyBMb29rIGF0IHRoZSBuZXcgY29tbWl0IGhpc3RvcnkKKwlnaXRrIC0tYWxsCisKK3RvIHNlZSB0aGF0IGV2ZXJ5dGhpbmcgbG9va3Mgc2Vuc2libGUuCisKK0FuZCB0aGVuLCB5b3UgY2FuIGp1c3QgcmVtb3ZlIHRoZSBicm9rZW4gYnJhbmNoIGlmIHlvdSBkZWNpZGUgeW91IHJlYWxseSAKK2Rvbid0IHdhbnQgaXQ6CisKKwkjIHJlbW92ZSAnYnJva2VuJyBicmFuY2gKKwlnaXQgYnJhbmNoIC1kIGJyb2tlbgorCisJIyBQcnVuZSBvbGQgb2JqZWN0cyBpZiB5b3UncmUgcmVhbGx5IHJlYWxseSBzdXJlCisJZ2l0IHBydW5lCisKK0FuZCB5ZWFoLCBJJ20gc3VyZSB0aGVyZSBhcmUgb3RoZXIgd2F5cyBvZiBkb2luZyB0aGlzLiBBbmQgYXMgdXN1YWwsIHRoZSAKK2Fib3ZlIGlzIHRvdGFsbHkgdW50ZXN0ZWQsIGFuZCBJIGp1c3Qgd3JvdGUgaXQgZG93biBpbiB0aGlzIGVtYWlsLCBzbyBpZiAKK0kndmUgZG9uZSBzb21ldGhpbmcgd3JvbmcsIHlvdSdsbCBoYXZlIHRvIGZpZ3VyZSBpdCBvdXQgb24geW91ciBvd24gOykKKworCQkJTGludXMKKy0KK1RvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBnaXQiIGluCit0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZworTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1sCisKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtZnJvbS1pbnRlcm5hbC1icmFuY2gudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJhc2UtZnJvbS1pbnRlcm5hbC1icmFuY2gudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDY0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JlYmFzZS1mcm9tLWludGVybmFsLWJyYW5jaC50eHQKQEAgLTAsMCArMSwxNjUgQEAKK0Zyb206CUp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK1RvOglnaXRAdmdlci5rZXJuZWwub3JnCitDYzoJUGV0ciBCYXVkaXMgPHBhc2t5QHN1c2UuY3o+LCBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAb3NkbC5vcmc+CitTdWJqZWN0OiBSZTogc2VuZGluZyBjaGFuZ2VzZXRzIGZyb20gdGhlIG1pZGRsZSBvZiBhIGdpdCB0cmVlCitEYXRlOglTdW4sIDE0IEF1ZyAyMDA1IDE4OjM3OjM5IC0wNzAwCitBYnN0cmFjdDogSW4gdGhpcyBhcnRpY2xlLCBKQyB0YWxrcyBhYm91dCBob3cgaGUgcmViYXNlcyB0aGUKKyBwdWJsaWMgInB1IiBicmFuY2ggdXNpbmcgdGhlIGNvcmUgR0lUIHRvb2xzIHdoZW4gaGUgdXBkYXRlcworIHRoZSAibWFzdGVyIiBicmFuY2gsIGFuZCBob3cgInJlYmFzZSIgd29ya3MuICBBbHNvIGRpc2N1c3NlZAorIGlzIGhvdyB0aGlzIGFwcGxpZXMgdG8gaW5kaXZpZHVhbCBkZXZlbG9wZXJzIHdobyBzZW5kcyBwYXRjaGVzCisgdXBzdHJlYW0uCisKK1BldHIgQmF1ZGlzIDxwYXNreUBzdXNlLmN6PiB3cml0ZXM6CisKKz4gRGVhciBkaWFyeSwgb24gU3VuLCBBdWcgMTQsIDIwMDUgYXQgMDk6NTc6MTNBTSBDRVNULCBJIGdvdCBhIGxldHRlcgorPiB3aGVyZSBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IHRvbGQgbWUgdGhhdC4uLgorPj4gTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPiB3cml0ZXM6Cis+PiAKKz4+ID4gSnVuaW8sIG1heWJlIHlvdSB3YW50IHRvIHRhbGsgYWJvdXQgaG93IHlvdSBtb3ZlIHBhdGNoZXMgZnJvbSB5b3VyICJwdSIgCis+PiA+IGJyYW5jaCB0byB0aGUgcmVhbCBicmFuY2hlcy4KKz4+IAorPiBBY3R1YWxseSwgd291bGRuJ3QgdGhpcyBiZSBhbHNvIHByZWNpc2VseSBmb3Igd2hhdCBTdEdJVCBpcyBpbnRlbmRlZCB0bz8KKworRXhhY3RseSBteSBmZWVsaW5nLiAgSSB3YXMgc29ydCBvZiB3YWl0aW5nIGZvciBDYXRhbGluIHRvIHNwZWFrCit1cC4gIFdpdGggaXRzIGJhc2luZyBwaGlsb3NvcGhpY2FsIGFuY2VzdHJ5IG9uIHF1aWx0LCB0aGlzIGlzCit0aGUga2luZCBvZiB0YXNrIFN0R0lUIGlzIGRlc2lnbmVkIHRvIGRvLgorCitJIGp1c3QgaGF2ZSBkb25lIGEgc2ltcGxlciBvbmUsIHRoaXMgdGltZSB1c2luZyBvbmx5IHRoZSBjb3JlCitHSVQgdG9vbHMuCisKK0kgaGFkIGEgaGFuZGZ1bCBjb21taXRzIHRoYXQgd2VyZSBhaGVhZCBvZiBtYXN0ZXIgaW4gcHUsIGFuZCBJCit3YW50ZWQgdG8gYWRkIHNvbWUgZG9jdW1lbnRhdGlvbiBieXBhc3NpbmcgbXkgdXN1YWwgaGFiaXQgb2YKK3BsYWNpbmcgbmV3IHRoaW5ncyBpbiBwdSBmaXJzdC4gIEF0IHRoZSBiZWdpbm5pbmcsIHRoZSBjb21taXQKK2FuY2VzdHJ5IGdyYXBoIGxvb2tlZCBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiJwdSIgaGVhZAorICAgIG1hc3RlciAtLT4gIzEgLS0+ICMyIC0tPiAjMworCitTbyBJIHN0YXJ0ZWQgZnJvbSBtYXN0ZXIsIG1hZGUgYSBidW5jaCBvZiBlZGl0cywgYW5kIGNvbW1pdHRlZDoKKworICAgICQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorICAgICQgY2QgRG9jdW1lbnRhdGlvbjsgZWQgZ2l0LnR4dCAuLi4KKyAgICAkIGNkIC4uOyBnaXQgYWRkIERvY3VtZW50YXRpb24vKi50eHQKKyAgICAkIGdpdCBjb21taXQgLXMKKworQWZ0ZXIgdGhlIGNvbW1pdCwgdGhlIGFuY2VzdHJ5IGdyYXBoIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqInB1IiBoZWFkCisgICAgbWFzdGVyXiAtLT4gIzEgLS0+ICMyIC0tPiAjMworICAgICAgICAgIFwKKyAgICAgICAgICAgIFwtLS0+IG1hc3RlcgorCitUaGUgb2xkIG1hc3RlciBpcyBub3cgbWFzdGVyXiAodGhlIGZpcnN0IHBhcmVudCBvZiB0aGUgbWFzdGVyKS4KK1RoZSBuZXcgbWFzdGVyIGNvbW1pdCBob2xkcyBteSBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisKK05vdyBJIGhhdmUgdG8gZGVhbCB3aXRoICJwdSIgYnJhbmNoLgorCitUaGlzIGlzIHRoZSBraW5kIG9mIHNpdHVhdGlvbiBJIHVzZWQgdG8gaGF2ZSBhbGwgdGhlIHRpbWUgd2hlbgorTGludXMgd2FzIHRoZSBtYWludGFpbmVyIGFuZCBJIHdhcyBhIGNvbnRyaWJ1dG9yLCB3aGVuIHlvdSBsb29rCithdCAibWFzdGVyIiBicmFuY2ggYmVpbmcgdGhlICJtYWludGFpbmVyIiBicmFuY2gsIGFuZCAicHUiCiticmFuY2ggYmVpbmcgdGhlICJjb250cmlidXRvciIgYnJhbmNoLiAgWW91ciB3b3JrIHN0YXJ0ZWQgYXQgdGhlCit0aXAgb2YgdGhlICJtYWludGFpbmVyIiBicmFuY2ggc29tZSB0aW1lIGFnbywgeW91IG1hZGUgYSBsb3Qgb2YKK3Byb2dyZXNzIGluIHRoZSBtZWFudGltZSwgYW5kIG5vdyB0aGUgbWFpbnRhaW5lciBicmFuY2ggaGFzIHNvbWUKK290aGVyIGNvbW1pdHMgeW91IGRvIG5vdCBoYXZlIHlldC4gIEFuZCAiZ2l0IHJlYmFzZSIgd2FzIHdyaXR0ZW4KK3dpdGggdGhlIGV4cGxpY2l0IHB1cnBvc2Ugb2YgaGVscGluZyB0byBtYWludGFpbiBicmFuY2hlcyBsaWtlCisicHUiLiAgWW91IF9jb3VsZF8gbWVyZ2UgbWFzdGVyIHRvIHB1IGFuZCBrZWVwIGdvaW5nLCBidXQgaWYgeW91CitldmVudHVhbGx5IHdhbnQgdG8gY2hlcnJ5cGljayBhbmQgbWVyZ2Ugc29tZSBidXQgbm90IG5lY2Vzc2FyaWx5CithbGwgY2hhbmdlcyBiYWNrIHRvIHRoZSBtYXN0ZXIgYnJhbmNoLCBpdCBvZnRlbiBtYWtlcyBsYXRlcgorb3BlcmF0aW9ucyBmb3IgX3lvdV8gZWFzaWVyIGlmIHlvdSByZWJhc2UgKGkuZS4gY2FycnkgZm9yd2FyZAoreW91ciBjaGFuZ2VzKSAicHUiIHJhdGhlciB0aGFuIG1lcmdlLiAgU28gSSByYW4gImdpdCByZWJhc2UiOgorCisgICAgJCBnaXQgY2hlY2tvdXQgcHUKKyAgICAkIGdpdCByZWJhc2UgbWFzdGVyIHB1CisKK1doYXQgdGhpcyBkb2VzIGlzIHRvIHBpY2sgYWxsIHRoZSBjb21taXRzIHNpbmNlIHRoZSBjdXJyZW50CiticmFuY2ggKG5vdGUgdGhhdCBJIG5vdyBhbSBvbiAicHUiIGJyYW5jaCkgZm9ya2VkIGZyb20gdGhlCittYXN0ZXIgYnJhbmNoLCBhbmQgZm9yd2FyZCBwb3J0IHRoZXNlIGNoYW5nZXMuCisKKyAgICBtYXN0ZXJeIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqInB1IiBoZWFkCisgICAgICAgICAgICBcLS0tPiBtYXN0ZXIgLS0+ICMxJyAtLT4gIzInIC0tPiAjMycKKworVGhlIGRpZmYgYmV0d2VlbiBtYXN0ZXJeIGFuZCAjMSBpcyBhcHBsaWVkIHRvIG1hc3RlciBhbmQKK2NvbW1pdHRlZCB0byBjcmVhdGUgIzEnIGNvbW1pdCB3aXRoIHRoZSBjb21taXQgaW5mb3JtYXRpb24gKGxvZywKK2F1dGhvciBhbmQgZGF0ZSkgdGFrZW4gZnJvbSBjb21taXQgIzEuICBPbiB0b3Agb2YgdGhhdCAjMicgYW5kICMzJworY29tbWl0cyBhcmUgbWFkZSBzaW1pbGFybHkgb3V0IG9mICMyIGFuZCAjMyBjb21taXRzLgorCitPbGQgIzMgaXMgbm90IHJlY29yZGVkIGluIGFueSBvZiB0aGUgLmdpdC9yZWZzL2hlYWRzLyBmaWxlCithbnltb3JlLCBzbyBhZnRlciBkb2luZyB0aGlzIHlvdSB3aWxsIGhhdmUgZGFuZ2xpbmcgY29tbWl0IGlmCit5b3UgcmFuIGZzY2stY2FjaGUsIHdoaWNoIGlzIG5vcm1hbC4gIEFmdGVyIHRlc3RpbmcgInB1IiwgeW91CitjYW4gcnVuICJnaXQgcHJ1bmUiIHRvIGdldCByaWQgb2YgdGhvc2Ugb3JpZ2luYWwgdGhyZWUgY29tbWl0cy4KKworV2hpbGUgSSBhbSB0YWxraW5nIGFib3V0ICJnaXQgcmViYXNlIiwgSSBzaG91bGQgdGFsayBhYm91dCBob3cKK3RvIGRvIGNoZXJyeXBpY2tpbmcgdXNpbmcgb25seSB0aGUgY29yZSBHSVQgdG9vbHMuCisKK0xldCdzIGdvIGJhY2sgdG8gdGhlIGVhcmxpZXIgcGljdHVyZSwgd2l0aCBkaWZmZXJlbnQgbGFiZWxzLgorCitZb3UsIGFzIGFuIGluZGl2aWR1YWwgZGV2ZWxvcGVyLCBjbG9uZWQgdXBzdHJlYW0gcmVwb3NpdG9yeSBhbmQKK21hZGUgYSBjb3VwbGUgb2YgY29tbWl0cyBvbiB0b3Agb2YgaXQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp5b3VyICJtYXN0ZXIiIGhlYWQKKyAgIHVwc3RyZWFtIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisKK1lvdSB3b3VsZCB3YW50IGNoYW5nZXMgIzIgYW5kICMzIGluY29ycG9yYXRlZCBpbiB0aGUgdXBzdHJlYW0sCit3aGlsZSB5b3UgZmVlbCB0aGF0ICMxIG1heSBuZWVkIGZ1cnRoZXIgaW1wcm92ZW1lbnRzLiAgU28geW91CitwcmVwYXJlICMyIGFuZCAjMyBmb3IgZS1tYWlsIHN1Ym1pc3Npb24uCisKKyAgICAkIGdpdCBmb3JtYXQtcGF0Y2ggbWFzdGVyXl4gbWFzdGVyCisKK1RoaXMgY3JlYXRlcyB0d28gZmlsZXMsIDAwMDEtWFhYWC50eHQgYW5kIDAwMDItWFhYWC50eHQuICBTZW5kCit0aGVtIG91dCAiVG86ICIgeW91ciBwcm9qZWN0IG1haW50YWluZXIgYW5kICJDYzogIiB5b3VyIG1haWxpbmcKK2xpc3QuICBZb3UgY291bGQgdXNlIGNvbnRyaWJ1dGVkIHNjcmlwdCBnaXQtc2VuZC1lbWFpbCBpZgoreW91ciBob3N0IGhhcyBuZWNlc3NhcnkgcGVybCBtb2R1bGVzIGZvciB0aGlzLCBidXQgeW91ciB1c3VhbAorTVVBIHdvdWxkIGRvIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QgY29ycnVwdCB3aGl0ZXNwYWNlcyBpbiB0aGUKK3BhdGNoLgorCitUaGVuIHlvdSB3b3VsZCB3YWl0LCBhbmQgeW91IGZpbmQgb3V0IHRoYXQgdGhlIHVwc3RyZWFtIHBpY2tlZAordXAgeW91ciBjaGFuZ2VzLCBhbG9uZyB3aXRoIG90aGVyIGNoYW5nZXMuCisKKyAgIHdoZXJlICAgICAgICAgICAgICAgICAgICAgICp5b3VyICJtYXN0ZXIiIGhlYWQKKyAgdXBzdHJlYW0gLS0+ICMxIC0tPiAjMiAtLT4gIzMKKyAgICB1c2VkICAgXCAKKyAgIHRvIGJlICAgICBcLS0+ICNBIC0tPiAjMicgLS0+ICMzJyAtLT4gI0IgLS0+ICNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXBzdHJlYW0gaGVhZAorCitUaGUgdHdvIGNvbW1pdHMgIzInIGFuZCAjMycgaW4gdGhlIGFib3ZlIHBpY3R1cmUgcmVjb3JkIHRoZSBzYW1lCitjaGFuZ2VzIHlvdXIgZS1tYWlsIHN1Ym1pc3Npb24gZm9yICMyIGFuZCAjMyBjb250YWluZWQsIGJ1dAorcHJvYmFibHkgd2l0aCB0aGUgbmV3IHNpZ24tb2ZmIGxpbmUgYWRkZWQgYnkgdGhlIHVwc3RyZWFtCittYWludGFpbmVyIGFuZCBkZWZpbml0ZWx5IHdpdGggZGlmZmVyZW50IGNvbW1pdHRlciBhbmQgYW5jZXN0cnkKK2luZm9ybWF0aW9uLCB0aGV5IGFyZSBkaWZmZXJlbnQgb2JqZWN0cyBmcm9tICMyIGFuZCAjMyBjb21taXRzLgorCitZb3UgZmV0Y2ggZnJvbSB1cHN0cmVhbSwgYnV0IG5vdCBtZXJnZS4KKworICAgICQgZ2l0IGZldGNoIHVwc3RyZWFtCisKK1RoaXMgbGVhdmVzIHRoZSB1cGRhdGVkIHVwc3RyZWFtIGhlYWQgaW4gLmdpdC9GRVRDSF9IRUFEIGJ1dAorZG9lcyBub3QgdG91Y2ggeW91ciAuZ2l0L0hFQUQgbm9yIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIuICAKK1lvdSBydW4gImdpdCByZWJhc2UiIG5vdy4KKworICAgICQgZ2l0IHJlYmFzZSBGRVRDSF9IRUFEIG1hc3RlcgorCitFYXJsaWVyLCBJIHNhaWQgdGhhdCByZWJhc2UgYXBwbGllcyBhbGwgdGhlIGNvbW1pdHMgZnJvbSB5b3VyCiticmFuY2ggb24gdG9wIG9mIHRoZSB1cHN0cmVhbSBoZWFkLiAgV2VsbCwgSSBsaWVkLiAgImdpdCByZWJhc2UiCitpcyBhIGJpdCBzbWFydGVyIHRoYW4gdGhhdCBhbmQgbm90aWNlcyB0aGF0ICMyIGFuZCAjMyBuZWVkIG5vdAorYmUgYXBwbGllZCwgc28gaXQgb25seSBhcHBsaWVzICMxLiAgVGhlIGNvbW1pdCBhbmNlc3RyeSBncmFwaAorYmVjb21lcyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICB3aGVyZSAgICAgICAgICAgICAgICAgICAgICp5b3VyIG9sZCAibWFzdGVyIiBoZWFkCisgIHVwc3RyZWFtIC0tPiAjMSAtLT4gIzIgLS0+ICMzCisgICAgdXNlZCAgIFwgICAgICAgICAgICAgICAgICAgICAgeW91ciBuZXcgIm1hc3RlciIgaGVhZCoKKyAgIHRvIGJlICAgICBcLS0+ICNBIC0tPiAjMicgLS0+ICMzJyAtLT4gI0IgLS0+ICNDIC0tPiAjMScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZAorCitBZ2FpbiwgImdpdCBwcnVuZSIgd291bGQgZGlzY2FyZCB0aGUgZGlzdXNlZCBjb21taXRzICMxLSMzIGFuZAoreW91IGNvbnRpbnVlIG9uIHN0YXJ0aW5nIGZyb20gdGhlIG5ldyAibWFzdGVyIiBoZWFkLCB3aGljaCBpcwordGhlICMxJyBjb21taXQuCisKKy1qYworCistCitUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgZ2l0IiBpbgordGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKK01vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAorCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vcmVidWlsZC1mcm9tLXVwZGF0ZS1ob29rLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjYyMWI1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9ob3d0by9yZWJ1aWxkLWZyb20tdXBkYXRlLWhvb2sudHh0CkBAIC0wLDAgKzEsODcgQEAKK1N1YmplY3Q6IFtIT1dUT10gVXNpbmcgcG9zdC11cGRhdGUgaG9vaworTWVzc2FnZS1JRDogPDd2eTg2bzZ1c3guZnNmQGFzc2lnbmVkLWJ5LWRoY3AuY294Lm5ldD4KK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK0RhdGU6IEZyaSwgMjYgQXVnIDIwMDUgMTg6MTk6MTAgLTA3MDAKK0Fic3RyYWN0OiBJbiB0aGlzIGhvdy10byBhcnRpY2xlLCBKQyB0YWxrcyBhYm91dCBob3cgaGUKKyB1c2VzIHRoZSBwb3N0LXVwZGF0ZSBob29rIHRvIGF1dG9tYXRlIGdpdCBkb2N1bWVudGF0aW9uIHBhZ2UKKyBzaG93biBhdCBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8uCisKK1RoZSBwYWdlcyB1bmRlciBodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KK2FyZSBidWlsdCBmcm9tIERvY3VtZW50YXRpb24vIGRpcmVjdG9yeSBvZiB0aGUgZ2l0LmdpdCBwcm9qZWN0CithbmQgbmVlZGVkIHRvIGJlIGtlcHQgdXAtdG8tZGF0ZS4gIFRoZSB3d3cua2VybmVsLm9yZy8gc2VydmVycworYXJlIG1pcnJvcmVkIGFuZCBJIHdhcyB0b2xkIHRoYXQgdGhlIG9yaWdpbiBvZiB0aGUgbWlycm9yIGlzIG9uCit0aGUgbWFjaGluZSAkc29tZS5rZXJuZWwub3JnLCBvbiB3aGljaCBJIHdhcyBnaXZlbiBhbiBhY2NvdW50Cit3aGVuIEkgdG9vayBvdmVyIGdpdCBtYWludGFpbmVyc2hpcCBmcm9tIExpbnVzLgorCitUaGUgZGlyZWN0b3JpZXMgcmVsZXZhbnQgdG8gdGhpcyBob3ctdG8gYXJlIHRoZXNlIHR3bzoKKworICAgIC9wdWIvc2NtL2dpdC9naXQuZ2l0LwlUaGUgcHVibGljIGdpdCByZXBvc2l0b3J5LgorICAgIC9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLwlUaGUgSFRNTCBkb2N1bWVudGF0aW9uIHBhZ2UuCisKK1NvIEkgbWFkZSBhIHJlcG9zaXRvcnkgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24gdW5kZXIgbXkKK2hvbWUgZGlyZWN0b3J5IG92ZXIgdGhlcmUuCisKKyAgICAkIGNkCisgICAgJCBta2RpciBkb2MtZ2l0ICYmIGNkIGRvYy1naXQKKyAgICAkIGdpdCBjbG9uZSAvcHViL3NjbS9naXQvZ2l0LmdpdC8gZG9jZ2VuCisKK1doYXQgbmVlZHMgdG8gaGFwcGVuIGlzIHRvIHVwZGF0ZSB0aGUgJEhPTUUvZG9jLWdpdC9kb2NnZW4vCit3b3JraW5nIHRyZWUsIGJ1aWxkIEhUTUwgZG9jcyB0aGVyZSBhbmQgaW5zdGFsbCB0aGUgcmVzdWx0IGluCisvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8gZGlyZWN0b3J5LiAgU28gSSB3cm90ZSBhIGxpdHRsZQorc2NyaXB0OgorCisgICAgJCBjYXQgPmRvZG9kb2Muc2ggPDxcRU9GCisgICAgIyEvYmluL3NoCisgICAgY2QgJEhPTUUvZG9jLWdpdC9kb2NnZW4gfHwgZXhpdAorCisgICAgdW5zZXQgR0lUX0RJUgorCisgICAgZ2l0IHB1bGwgL3B1Yi9zY20vZ2l0L2dpdC5naXQvIG1hc3RlciAmJgorICAgIGNkIERvY3VtZW50YXRpb24gJiYKKyAgICBtYWtlIGluc3RhbGwtd2ViZG9jCisgICAgRU9GCisKK0luaXRpYWxseSBJIHVzZWQgdG8gcnVuIHRoaXMgYnkgaGFuZCB3aGVuZXZlciBJIHB1c2ggaW50byB0aGUKK3B1YmxpYyBnaXQgcmVwb3NpdG9yeS4gIFRoZW4gSSBkaWQgYSBjcm9uIGpvYiB0aGF0IHJhbiB0d2ljZSBhCitkYXkuICBUaGUgY3VycmVudCByb3VuZCB1c2VzIHRoZSBwb3N0LXVwZGF0ZSBob29rIG1lY2hhbmlzbSwKK2xpa2UgdGhpczoKKworICAgICQgY2F0ID4vcHViL3NjbS9naXQvZ2l0LmdpdC9ob29rcy9wb3N0LXVwZGF0ZSA8PFxFT0YKKyAgICAjIS9iaW4vc2gKKyAgICAjCisgICAgIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIHByZXBhcmUgYSBwYWNrZWQgcmVwb3NpdG9yeSBmb3IgdXNlIG92ZXIKKyAgICAjIGR1bWIgdHJhbnNwb3J0cy4KKyAgICAjCisgICAgIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlIGJ5ICJjaG1vZCAreCBwb3N0LXVwZGF0ZSIuCisKKyAgICBjYXNlICIgJCogIiBpbgorICAgIConIHJlZnMvaGVhZHMvbWFzdGVyICcqKQorICAgICAgICAgICAgZWNobyAkSE9NRS9kb2MtZ2l0L2RvZG9kb2Muc2ggfCBhdCBub3cKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIGV4ZWMgZ2l0LXVwZGF0ZS1zZXJ2ZXItaW5mbworICAgIEVPRgorICAgICQgY2htb2QgK3ggL3B1Yi9zY20vZ2l0L2dpdC5naXQvaG9va3MvcG9zdC11cGRhdGUKKworVGhlcmUgYXJlIGZvdXIgdGhpbmdzIHdvcnRoIG1lbnRpb25pbmc6CisKKyAtIFRoZSB1cGRhdGUtaG9vayBpcyBydW4gYWZ0ZXIgdGhlIHJlcG9zaXRvcnkgYWNjZXB0cyBhICJnaXQKKyAgIHB1c2giLCB1bmRlciBteSB1c2VyIHByaXZpbGVnZS4gIEl0IGlzIGdpdmVuIHRoZSBmdWxsIG5hbWVzCisgICBvZiByZWZzIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWQgYXMgYXJndW1lbnRzLiAgTXkgcG9zdC11cGRhdGUKKyAgIHJ1bnMgdGhlIGRvZG9kb2Muc2ggc2NyaXB0IG9ubHkgd2hlbiB0aGUgbWFzdGVyIGhlYWQgaXMKKyAgIHVwZGF0ZWQuCisKKyAtIFdoZW4gdXBkYXRlLWhvb2sgaXMgcnVuLCBHSVRfRElSIGlzIHNldCB0byAnLicgYnkgdGhlIGNhbGxpbmcKKyAgIHJlY2VpdmUtcGFjay4gIFRoaXMgaXMgaW5oZXJpdGVkIGJ5IHRoZSBkb2RvZG9jLnNoIHJ1biB2aWEKKyAgIHRoZSAiYXQiIGNvbW1hbmQsIGFuZCBuZWVkcyB0byBiZSB1bnNldDsgb3RoZXJ3aXNlLCAiZ2l0CisgICBwdWxsIiBpdCBkb2VzIGludG8gJEhPTUUvZG9jLWdpdC9kb2NnZW4vIHJlcG9zaXRvcnkgd291bGQgbm90CisgICB3b3JrIGNvcnJlY3RseS4KKworIC0gVGhlIHN0ZG91dCBvZiB1cGRhdGUgaG9vayBzY3JpcHQgaXMgbm90IGNvbm5lY3RlZCB0byBnaXQKKyAgIHB1c2g7IEkgcnVuIHRoZSBoZWF2eSBwYXJ0IG9mIHRoZSBjb21tYW5kIGluc2lkZSAiYXQiLCB0bworICAgcmVjZWl2ZSB0aGUgZXhlY3V0aW9uIHJlcG9ydCB2aWEgZS1tYWlsLgorCisgLSBUaGlzIGlzIHN0aWxsIGNydWRlIGFuZCBkb2VzIG5vdCBwcm90ZWN0IGFnYWluc3Qgc2ltdWx0YW5lb3VzCisgICBtYWtlIGludm9jYXRpb25zIHN0b21waW5nIG9uIGVhY2ggb3RoZXIuICBJIHdvdWxkIG5lZWQgdG8gYWRkCisgICBzb21lIGxvY2tpbmcgbWVjaGFuaXNtIGZvciB0aGlzLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3JldmVydC1icmFuY2gtcmViYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vcmV2ZXJ0LWJyYW5jaC1yZWJhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDQ3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3JldmVydC1icmFuY2gtcmViYXNlLnR4dApAQCAtMCwwICsxLDIwMCBAQAorRnJvbTogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorVG86IGdpdEB2Z2VyLmtlcm5lbC5vcmcKK1N1YmplY3Q6IFtIT1dUT10gUmV2ZXJ0aW5nIGFuIGV4aXN0aW5nIGNvbW1pdAorQWJzdHJhY3Q6IEluIHRoaXMgYXJ0aWNsZSwgSkMgZ2l2ZXMgYSBzbWFsbCByZWFsLWxpZmUgZXhhbXBsZSBvZiB1c2luZworICdnaXQgcmV2ZXJ0JyBjb21tYW5kLCBhbmQgdXNpbmcgYSB0ZW1wb3JhcnkgYnJhbmNoIGFuZCB0YWcgZm9yIHNhZmV0eQorIGFuZCBlYXNpZXIgc2FuaXR5IGNoZWNraW5nLgorRGF0ZTogTW9uLCAyOSBBdWcgMjAwNSAyMTozOTowMiAtMDcwMAorQ29udGVudC10eXBlOiB0ZXh0L2FzY2lpZG9jCitNZXNzYWdlLUlEOiA8N3ZvZTdnM3VvcC5mc2ZAYXNzaWduZWQtYnktZGhjcC5jb3gubmV0PgorCitSZXZlcnRpbmcgYW4gZXhpc3RpbmcgY29tbWl0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK09uZSBvZiB0aGUgY2hhbmdlcyBJIHB1bGxlZCBpbnRvIHRoZSAnbWFzdGVyJyBicmFuY2ggdHVybnMgb3V0IHRvCiticmVhayBidWlsZGluZyBHSVQgd2l0aCBHQ0MgMi45NS4gIFdoaWxlIHRoZXkgd2VyZSB3ZWxsIGludGVudGlvbmVkCitwb3J0YWJpbGl0eSBmaXhlcywga2VlcGluZyB0aGluZ3Mgd29ya2luZyB3aXRoIGdjYy0yLjk1IHdhcyBhbHNvCitpbXBvcnRhbnQuICBIZXJlIGlzIHdoYXQgSSBkaWQgdG8gcmV2ZXJ0IHRoZSBjaGFuZ2UgaW4gdGhlICdtYXN0ZXInCiticmFuY2ggYW5kIHRvIGFkanVzdCB0aGUgJ3B1JyBicmFuY2gsIHVzaW5nIGNvcmUgR0lUIHRvb2xzIGFuZAorYmFyZWJvbmUgUG9yY2VsYWluLgorCitGaXJzdCwgcHJlcGFyZSBhIHRocm93LWF3YXkgYnJhbmNoIGluIGNhc2UgSSBzY3JldyB0aGluZ3MgdXAuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgLWIgcmV2ZXJ0LWM5OSBtYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3cgSSBhbSBvbiB0aGUgJ3JldmVydC1jOTknIGJyYW5jaC4gIExldCdzIGZpZ3VyZSBvdXQgd2hpY2ggY29tbWl0IHRvCityZXZlcnQuICBJIGhhcHBlbiB0byBrbm93IHRoYXQgdGhlIHRvcCBvZiB0aGUgJ21hc3RlcicgYnJhbmNoIGlzIGEKK21lcmdlLCBhbmQgaXRzIHNlY29uZCBwYXJlbnQgKGkuZS4gZm9yZWlnbiBjb21taXQgSSBtZXJnZWQgZnJvbSkgaGFzCit0aGUgY2hhbmdlIEkgd291bGQgd2FudCB0byB1bmRvLiAgRnVydGhlciBJIGhhcHBlbiB0byBrbm93IHRoYXQgdGhhdAorbWVyZ2UgaW50cm9kdWNlZCA1IGNvbW1pdHMgb3Igc286CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc2hvdy1icmFuY2ggLS1tb3JlPTQgbWFzdGVyIG1hc3Rlcl4yIHwgaGVhZAorKiBbbWFzdGVyXSBNZXJnZSByZWZzL2hlYWRzL3BvcnRhYmxlIGZyb20gaHR0cDovL3d3dy5jcy5iZXJrZWxleS4uLi4KKyAhIFttYXN0ZXJeMl0gUmVwbGFjZSBDOTkgYXJyYXkgaW5pdGlhbGl6ZXJzIHdpdGggY29kZS4KKy0tCistICBbbWFzdGVyXSBNZXJnZSByZWZzL2hlYWRzL3BvcnRhYmxlIGZyb20gaHR0cDovL3d3dy5jcy5iZXJrZWxleS4uLi4KKyorIFttYXN0ZXJeMl0gUmVwbGFjZSBDOTkgYXJyYXkgaW5pdGlhbGl6ZXJzIHdpdGggY29kZS4KKyorIFttYXN0ZXJeMn4xXSBSZXBsYWNlIHVuc2V0ZW52KCkgYW5kIHNldGVudigpIHdpdGggb2xkZXIgcHV0ZW52KCkuCisqKyBbbWFzdGVyXjJ+Ml0gSW5jbHVkZSBzeXMvdGltZS5oIGluIGRhZW1vbi5jLgorKisgW21hc3Rlcl4yfjNdIEZpeCA/OiBzdGF0ZW1lbnRzLgorKisgW21hc3Rlcl4yfjRdIFJlcGxhY2UgemVyby1sZW5ndGggYXJyYXkgZGVjbHMgd2l0aCBbXS4KKyogIFttYXN0ZXJ+MV0gdHV0b3JpYWwgbm90ZSBhYm91dCBnaXQgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICctLW1vcmU9NCcgYWJvdmUgbWVhbnMgImFmdGVyIHdlIHJlYWNoIHRoZSBtZXJnZSBiYXNlIG9mIHJlZnMsCitzaG93IHVudGlsIHdlIGRpc3BsYXkgZm91ciBtb3JlIGNvbW1vbiBjb21taXRzIi4gIFRoYXQgbGFzdCBjb21taXQKK3dvdWxkIGhhdmUgYmVlbiB3aGVyZSB0aGUgInBvcnRhYmxlIiBicmFuY2ggd2FzIGZvcmtlZCBmcm9tIHRoZSBtYWluCitnaXQuZ2l0IHJlcG9zaXRvcnksIHNvIHRoaXMgd291bGQgc2hvdyBldmVyeXRoaW5nIG9uIGJvdGggYnJhbmNoZXMKK3NpbmNlIHRoZW4uICBJIGp1c3QgbGltaXRlZCB0aGUgb3V0cHV0IHRvIHRoZSBmaXJzdCBoYW5kZnVsIHVzaW5nCisnaGVhZCcuCisKK05vdyBJIGtub3cgJ21hc3Rlcl4yfjQnIChwcm9ub3VuY2UgaXQgYXMgImZpbmQgdGhlIHNlY29uZCBwYXJlbnQgb2YKK3RoZSAnbWFzdGVyJywgYW5kIHRoZW4gZ28gZm91ciBnZW5lcmF0aW9ucyBiYWNrIGZvbGxvd2luZyB0aGUgZmlyc3QKK3BhcmVudCIpIGlzIHRoZSBvbmUgSSB3b3VsZCB3YW50IHRvIHJldmVydC4gIFNpbmNlIEkgYWxzbyB3YW50IHRvIHNheQord2h5IEkgYW0gcmV2ZXJ0aW5nIGl0LCB0aGUgJy1uJyBmbGFnIGlzIGdpdmVuIHRvICdnaXQgcmV2ZXJ0Jy4gIFRoaXMKK3ByZXZlbnRzIGl0IGZyb20gYWN0dWFsbHkgbWFraW5nIGEgY29tbWl0LCBhbmQgaW5zdGVhZCAnZ2l0IHJldmVydCcKK2xlYXZlcyB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIGl0IHdhbnRlZCB0byB1c2UgaW4gJy5tc2cnIGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcmV2ZXJ0IC1uIG1hc3Rlcl4yfjQKKyQgY2F0IC5tc2cKK1JldmVydCAiUmVwbGFjZSB6ZXJvLWxlbmd0aCBhcnJheSBkZWNscyB3aXRoIFtdLiIKKworVGhpcyByZXZlcnRzIDZjNWY5YmFhM2JjMGQ2M2UxNDFlMGFmYzIzMTEwMjA1Mzc5OTA1YTQgY29tbWl0LgorJCBnaXQgZGlmZiBIRUFEIDsjIHRvIG1ha2Ugc3VyZSB3aGF0IHdlIGFyZSByZXZlcnRpbmcgbWFrZXMgc2Vuc2UuCiskIG1ha2UgQ0M9Z2NjLTIuOTUgY2xlYW4gdGVzdCA7IyBtYWtlIHN1cmUgaXQgZml4ZWQgdGhlIGJyZWFrYWdlLgorJCBtYWtlIGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGRpZCBub3QgY2F1c2Ugb3RoZXIgYnJlYWthZ2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJldmVydGVkIGNoYW5nZSBtYWtlcyBzZW5zZSAoZnJvbSByZWFkaW5nIHRoZSAnZGlmZicgb3V0cHV0KSwgZG9lcworZml4IHRoZSBwcm9ibGVtIChmcm9tICdtYWtlIENDPWdjYy0yLjk1JyB0ZXN0KSwgYW5kIGRvZXMgbm90IGNhdXNlIG5ldworYnJlYWthZ2UgKGZyb20gdGhlIGxhc3QgJ21ha2UgdGVzdCcpLiAgSSdtIHJlYWR5IHRvIGNvbW1pdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWEgLXMgOyMgcmVhZCAubXNnIGludG8gdGhlIGxvZywKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgZXhwbGFpbiB3aHkgSSBhbSByZXZlcnRpbmcuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSSBjb3VsZCBoYXZlIHNjcmV3ZWQgdXAgaW4gYW55IG9mIHRoZSBhYm92ZSBzdGVwcywgYnV0IGluIHRoZSB3b3JzdAorY2FzZSBJIGNvdWxkIGp1c3QgaGF2ZSBkb25lICdnaXQgY2hlY2tvdXQgbWFzdGVyJyB0byBzdGFydCBvdmVyLgorRm9ydHVuYXRlbHkgSSBkaWQgbm90IGhhdmUgdG87IHdoYXQgSSBoYXZlIGluIHRoZSBjdXJyZW50IGJyYW5jaAorJ3JldmVydC1jOTknIGlzIHdoYXQgSSB3YW50LiAgU28gbWVyZ2UgdGhhdCBiYWNrIGludG8gJ21hc3Rlcic6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgbWFzdGVyCiskIGdpdCByZXNvbHZlIG1hc3RlciByZXZlcnQtYzk5IGZhc3QgOyMgdGhpcyBzaG91bGQgYmUgYSBmYXN0IGZvcndhcmQKK1VwZGF0aW5nIGZyb20gMTBkNzgxYjljYWE0ZjcxNDk1YzdiMzQ5NjNiZWYxMzcyMTZmODZhOCB0byBlM2E2OTNjLi4uCisgY2FjaGUuaCAgICAgICAgfCAgICA4ICsrKystLS0tCisgY29tbWl0LmMgICAgICAgfCAgICAyICstCisgbHMtZmlsZXMuYyAgICAgfCAgICAyICstCisgcmVjZWl2ZS1wYWNrLmMgfCAgICAyICstCisgc2VydmVyLWluZm8uYyAgfCAgICAyICstCisgNSBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDggZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICdmYXN0JyBpbiB0aGUgYWJvdmUgJ2dpdCByZXNvbHZlJyBpcyBub3QgYSBtYWdpYy4gIEkga25ldyB0aGlzCisncmVzb2x2ZScgd291bGQgcmVzdWx0IGluIGEgZmFzdCBmb3J3YXJkIG1lcmdlLCBhbmQgaWYgbm90LCB0aGVyZSBpcworc29tZXRoaW5nIHZlcnkgd3JvbmcgKHNvIEkgd291bGQgZG8gJ2dpdCByZXNldCcgb24gdGhlICdtYXN0ZXInIGJyYW5jaAorYW5kIGV4YW1pbmUgdGhlIHNpdHVhdGlvbikuICBXaGVuIGEgZmFzdCBmb3J3YXJkIG1lcmdlIGlzIGRvbmUsIHRoZQorbWVzc2FnZSBwYXJhbWV0ZXIgdG8gJ2dpdCByZXNvbHZlJyBpcyBkaXNjYXJkZWQsIGJlY2F1c2Ugbm8gbmV3IGNvbW1pdAoraXMgY3JlYXRlZC4gIFlvdSBjb3VsZCBoYXZlIHNhaWQgJ2p1bmsnIG9yICdub3RoaW5nJyB0aGVyZSBhcyB3ZWxsLgorCitUaGVyZSBpcyBubyBuZWVkIHRvIHJlZG8gdGhlIHRlc3QgYXQgdGhpcyBwb2ludC4gIFdlIGZhc3QgZm9yd2FyZGVkCithbmQgd2Uga25vdyAnbWFzdGVyJyBtYXRjaGVzICdyZXZlcnQtYzk5JyBleGFjdGx5LiAgSW4gZmFjdDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIG1hc3Rlci4ucmV2ZXJ0LWM5OQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3NheXMgbm90aGluZy4KKworVGhlbiB3ZSByZWJhc2UgdGhlICdwdScgYnJhbmNoIGFzIHVzdWFsLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IHB1CiskIGdpdCB0YWcgcHUtYW5jaG9yIHB1CiskIGdpdCByZWJhc2UgbWFzdGVyCisqIEFwcGx5aW5nOiBSZWRvICJyZXZlcnQiIHVzaW5nIHRocmVlLXdheSBtZXJnZSBtYWNoaW5lcnkuCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogUmVtb3ZlIGdpdC1hcHBseS1wYXRjaC1zY3JpcHQuCitGaXJzdCB0cnlpbmcgc2ltcGxlIG1lcmdlIHN0cmF0ZWd5IHRvIGNoZXJyeS1waWNrLgorU2ltcGxlIGNoZXJyeS1waWNrIGZhaWxzOyB0cnlpbmcgQXV0b21hdGljIGNoZXJyeS1waWNrLgorUmVtb3ZpbmcgRG9jdW1lbnRhdGlvbi9naXQtYXBwbHktcGF0Y2gtc2NyaXB0LnR4dAorUmVtb3ZpbmcgZ2l0LWFwcGx5LXBhdGNoLXNjcmlwdAorRmluaXNoZWQgb25lIGNoZXJyeS1waWNrLgorKiBBcHBseWluZzogRG9jdW1lbnQgImdpdCBjaGVycnktcGljayIgYW5kICJnaXQgcmV2ZXJ0IgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IG1haWxpbmZvIGFuZCBhcHBseW1ib3ggdXBkYXRlcworRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IFNob3cgY29tbWl0cyBpbiB0b3BvIG9yZGVyIGFuZCBuYW1lIGFsbCBjb21taXRzLgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKyogQXBwbHlpbmc6IE1vcmUgZG9jdW1lbnRhdGlvbiB1cGRhdGVzLgorRmlyc3QgdHJ5aW5nIHNpbXBsZSBtZXJnZSBzdHJhdGVneSB0byBjaGVycnktcGljay4KK0ZpbmlzaGVkIG9uZSBjaGVycnktcGljay4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdGVtcG9yYXJ5IHRhZyAncHUtYW5jaG9yJyBpcyBtZSBqdXN0IGJlaW5nIGNhcmVmdWwsIGluIGNhc2UgJ2dpdAorcmViYXNlJyBzY3Jld3MgdXAuICBBZnRlciB0aGlzLCBJIGNhbiBkbyB0aGVzZSBmb3Igc2FuaXR5IGNoZWNrOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgcHUtYW5jaG9yLi5wdSA7IyBtYWtlIHN1cmUgd2UgZ290IHRoZSBtYXN0ZXIgZml4LgorJCBtYWtlIENDPWdjYy0yLjk1IGNsZWFuIHRlc3QgOyMgbWFrZSBzdXJlIGl0IGZpeGVkIHRoZSBicmVha2FnZS4KKyQgbWFrZSBjbGVhbiB0ZXN0IDsjIG1ha2Ugc3VyZSBpdCBkaWQgbm90IGNhdXNlIG90aGVyIGJyZWFrYWdlLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZXJ5dGhpbmcgaXMgaW4gdGhlIGdvb2Qgb3JkZXIuICBJIGRvIG5vdCBuZWVkIHRoZSB0ZW1wb3JhcnkgYnJhbmNoCitub3IgdGFnIGFueW1vcmUsIHNvIHJlbW92ZSB0aGVtOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgcm0gLWYgLmdpdC9yZWZzL3RhZ3MvcHUtYW5jaG9yIAorJCBnaXQgYnJhbmNoIC1kIHJldmVydC1jOTkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCB3YXMgYW4gZW1lcmdlbmN5IGZpeCwgc28gd2UgbWlnaHQgYXMgd2VsbCBtZXJnZSBpdCBpbnRvIHRoZQorJ3JlbGVhc2UgY2FuZGlkYXRlJyBicmFuY2gsIGFsdGhvdWdoIEkgZXhwZWN0IHRoZSBuZXh0IHJlbGVhc2Ugd291bGQKK2JlIHNvbWUgZGF5cyBvZmY6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2hlY2tvdXQgcmMKKyQgZ2l0IHB1bGwgLiBtYXN0ZXIKK1BhY2tpbmcgMCBvYmplY3RzCitVbnBhY2tpbmcgMCBvYmplY3RzCisKKyogY29tbWl0dGlzaDogZTNhNjkzYy4uLglyZWZzL2hlYWRzL21hc3RlciBmcm9tIC4KK1RyeWluZyB0byBtZXJnZSBlM2E2OTNjLi4uIGludG8gOGMxZjVmMC4uLiB1c2luZyAxMGQ3ODFiLi4uCitDb21taXR0ZWQgbWVyZ2UgN2ZiOWI3MjYyYTFkMWUwYTQ3YmJmZGNiYmNmNTBjZTA2MzVkM2Y4ZgorIGNhY2hlLmggICAgICAgIHwgICAgOCArKysrLS0tLQorIGNvbW1pdC5jICAgICAgIHwgICAgMiArLQorIGxzLWZpbGVzLmMgICAgIHwgICAgMiArLQorIHJlY2VpdmUtcGFjay5jIHwgICAgMiArLQorIHNlcnZlci1pbmZvLmMgIHwgICAgMiArLQorIDUgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuZCB0aGUgZmluYWwgcmVwb3NpdG9yeSBzdGF0dXMgbG9va3MgbGlrZSB0aGlzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3ctYnJhbmNoIC0tbW9yZT0xIG1hc3RlciBwdSByYworISBbbWFzdGVyXSBSZXZlcnQgIlJlcGxhY2UgemVyby1sZW5ndGggYXJyYXkgZGVjbHMgd2l0aCBbXS4iCisgISBbcHVdIGdpdC1yZXBhY2s6IEFkZCBvcHRpb24gdG8gcmVwYWNrIGFsbCBvYmplY3RzLgorICAqIFtyY10gTWVyZ2UgcmVmcy9oZWFkcy9tYXN0ZXIgZnJvbSAuCistLS0KKyArICBbcHVdIGdpdC1yZXBhY2s6IEFkZCBvcHRpb24gdG8gcmVwYWNrIGFsbCBvYmplY3RzLgorICsgIFtwdX4xXSBNb3JlIGRvY3VtZW50YXRpb24gdXBkYXRlcy4KKyArICBbcHV+Ml0gU2hvdyBjb21taXRzIGluIHRvcG8gb3JkZXIgYW5kIG5hbWUgYWxsIGNvbW1pdHMuCisgKyAgW3B1fjNdIG1haWxpbmZvIGFuZCBhcHBseW1ib3ggdXBkYXRlcworICsgIFtwdX40XSBEb2N1bWVudCAiZ2l0IGNoZXJyeS1waWNrIiBhbmQgImdpdCByZXZlcnQiCisgKyAgW3B1fjVdIFJlbW92ZSBnaXQtYXBwbHktcGF0Y2gtc2NyaXB0LgorICsgIFtwdX42XSBSZWRvICJyZXZlcnQiIHVzaW5nIHRocmVlLXdheSBtZXJnZSBtYWNoaW5lcnkuCisgIC0gW3JjXSBNZXJnZSByZWZzL2hlYWRzL21hc3RlciBmcm9tIC4KKysrKiBbbWFzdGVyXSBSZXZlcnQgIlJlcGxhY2UgemVyby1sZW5ndGggYXJyYXkgZGVjbHMgd2l0aCBbXS4iCisgIC0gW3JjfjFdIE1lcmdlIHJlZnMvaGVhZHMvbWFzdGVyIGZyb20gLgorLi4uIFttYXN0ZXJ+MV0gTWVyZ2UgcmVmcy9oZWFkcy9wb3J0YWJsZSBmcm9tIGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuLi4uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vc2VwYXJhdGluZy10b3BpYy1icmFuY2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3NlcGFyYXRpbmctdG9waWMtYnJhbmNoZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MGUyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3NlcGFyYXRpbmctdG9waWMtYnJhbmNoZXMudHh0CkBAIC0wLDAgKzEsOTEgQEAKK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5raW9AY294Lm5ldD4KK1N1YmplY3Q6IFNlcGFyYXRpbmcgdG9waWMgYnJhbmNoZXMKK0Fic3RyYWN0OiBJbiB0aGlzIGFydGljbGUsIEpDIGRlc2NyaWJlcyBob3cgdG8gc2VwYXJhdGUgdG9waWMgYnJhbmNoZXMuCisKK1RoaXMgdGV4dCB3YXMgb3JpZ2luYWxseSBhIGZvb3Rub3RlIHRvIGEgZGlzY3Vzc2lvbiBhYm91dCB0aGUKK2JlaGF2aW91ciBvZiB0aGUgZ2l0IGRpZmYgY29tbWFuZHMuCisKK09mdGVuIEkgZmluZCBteXNlbGYgZG9pbmcgdGhhdCBbcnVubmluZyBkaWZmIGFnYWluc3Qgc29tZXRoaW5nIG90aGVyCit0aGFuIEhFQURdIHdoaWxlIHJld3JpdGluZyBtZXNzeSBkZXZlbG9wbWVudCBoaXN0b3J5LiAgRm9yIGV4YW1wbGUsIEkKK3N0YXJ0IGRvaW5nIHNvbWUgd29yayB3aXRob3V0IGtub3dpbmcgZXhhY3RseSB3aGVyZSBpdCBsZWFkcywgYW5kIGVuZAordXAgd2l0aCBhIGhpc3RvcnkgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAibWFzdGVyIgorICAgICAgICBvLS0tbworICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICJ0b3BpYyIgCisgICAgICAgICAgICAgIG8tLS1vLS0tby0tLW8tLS1vLS0tbworCitBdCB0aGlzIHBvaW50LCAidG9waWMiIGNvbnRhaW5zIHNvbWV0aGluZyBJIGtub3cgSSB3YW50LCBidXQgaXQKK2NvbnRhaW5zIHR3byBjb25jZXB0cyB0aGF0IHR1cm5lZCBvdXQgdG8gYmUgY29tcGxldGVseSBpbmRlcGVuZGVudC4KK0FuZCBvZnRlbiwgb25lIHRvcGljIGNvbXBvbmVudCBpcyBsYXJnZXIgdGhhbiB0aGUgb3RoZXIuICBJdCBtYXkKK2NvbnRhaW4gbW9yZSB0aGFuIHR3byB0b3BpY3MuCisKK0luIG9yZGVyIHRvIHJld3JpdGUgdGhpcyBtZXNzIHRvIGJlIG1vcmUgbWFuYWdlYWJsZSwgSSB3b3VsZCBmaXJzdCBkbworImRpZmYgbWFzdGVyLi50b3BpYyIsIHRvIGV4dHJhY3QgdGhlIGNoYW5nZXMgaW50byBhIHNpbmdsZSBwYXRjaCwgc3RhcnQKK3BpY2tpbmcgcGllY2VzIGZyb20gaXQgdG8gZ2V0IGxvZ2ljYWxseSBzZWxmLWNvbnRhaW5lZCB1bml0cywgYW5kCitzdGFydCBidWlsZGluZyBvbiB0b3Agb2YgIm1hc3RlciI6CisKKyAgICAgICAgJCBnaXQgZGlmZiBtYXN0ZXIuLnRvcGljID5QLmRpZmYKKyAgICAgICAgJCBnaXQgY2hlY2tvdXQgLWIgdG9waWNBIG1hc3RlcgorICAgICAgICAuLi4gcGljayBhbmQgYXBwbHkgcGllY2VzIGZyb20gUC5kaWZmIHRvIGJ1aWxkCisgICAgICAgIC4uLiBjb21taXRzIG9uIHRvcGljQSBicmFuY2guCisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIG8tLS1vLS0tbworICAgICAgICAgICAgIC8gICAgICAgICJ0b3BpY0EiCisgICAgICAgIG8tLS1vIm1hc3RlciIKKyAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAidG9waWMiIAorICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLW8KKworQmVmb3JlIGRvaW5nIGVhY2ggY29tbWl0IG9uICJ0b3BpY0EiIEhFQUQsIEkgcnVuICJkaWZmIEhFQUQiCitiZWZvcmUgdXBkYXRlLWluZGV4IHRoZSBhZmZlY3RlZCBwYXRocywgb3IgImRpZmYgLS1jYWNoZWQgSEVBRCIKK2FmdGVyLiAgQWxzbyBJIHdvdWxkIHJ1biAiZGlmZiAtLWNhY2hlZCBtYXN0ZXIiIHRvIG1ha2Ugc3VyZQordGhhdCB0aGUgY2hhbmdlcyBhcmUgb25seSB0aGUgb25lcyByZWxhdGVkIHRvICJ0b3BpY0EiLiAgVXN1YWxseQorSSBkbyB0aGlzIGZvciBzbWFsbGVyIHRvcGljcyBmaXJzdC4KKworQWZ0ZXIgdGhhdCwgSSdkIGRvIHRoZSByZW1haW5kZXIgb2YgdGhlIG9yaWdpbmFsICJ0b3BpYyIsIGJ1dAorZm9yIHRoYXQsIEkgZG8gbm90IHN0YXJ0IGZyb20gdGhlIHBhdGNoZmlsZSBJIGV4dHJhY3RlZCBieQorY29tcGFyaW5nICJtYXN0ZXIiIGFuZCAidG9waWMiIEkgdXNlZCBpbml0aWFsbHkuICBTdGlsbCBvbgorInRvcGljQSIsIEkgZXh0cmFjdCAiZGlmZiB0b3BpYyIsIGFuZCB1c2UgaXQgdG8gcmVidWlsZCB0aGUKK290aGVyIHRvcGljOgorCisgICAgICAgICQgZ2l0IGRpZmYgLVIgdG9waWMgPlAuZGlmZiA7IyAtLWNhY2hlZCBhbHNvIHdvdWxkIHdvcmsgZmluZQorICAgICAgICAkIGdpdCBjaGVja291dCAtYiB0b3BpY0IgbWFzdGVyCisgICAgICAgIC4uLiBwaWNrIGFuZCBhcHBseSBwaWVjZXMgZnJvbSBQLmRpZmYgdG8gYnVpbGQKKyAgICAgICAgLi4uIGNvbW1pdHMgb24gdG9waWNCIGJyYW5jaC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9waWNCIgorICAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8KKyAgICAgICAgICAgICAgLworICAgICAgICAgICAgIC9vLS0tby0tLW8KKyAgICAgICAgICAgIHwvICAgICAgICAidG9waWNBIgorICAgICAgICBvLS0tbyJtYXN0ZXIiCisgICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICAgInRvcGljIiAKKyAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8tLS1vCisKK0FmdGVyIEkgYW0gZG9uZSwgSSdkIHRyeSBhIHByZXRlbmQtbWVyZ2UgYmV0d2VlbiAidG9waWNBIiBhbmQKKyJ0b3BpY0IiIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSBJIGhhdmUgbm90IG1pc3NlZCBhbnl0aGluZzoKKworICAgICAgICAkIGdpdCBwdWxsIC4gdG9waWNBIDsjIG1lcmdlIGl0IGludG8gY3VycmVudCAidG9waWNCIgorICAgICAgICAkIGdpdCBkaWZmIHRvcGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3BpY0IiCisgICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLSogKHByZXRlbmQgbWVyZ2UpCisgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICAgLworICAgICAgICAgICAgIC9vLS0tby0tLW8tLS0tLS0tLS0tJworICAgICAgICAgICAgfC8gICAgICAgICJ0b3BpY0EiCisgICAgICAgIG8tLS1vIm1hc3RlciIKKyAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAidG9waWMiIAorICAgICAgICAgICAgICBvLS0tby0tLW8tLS1vLS0tby0tLW8KKworVGhlIGxhc3QgZGlmZiBiZXR0ZXIgbm90IHRvIHNob3cgYW55dGhpbmcgb3RoZXIgdGhhbiBjbGVhbnVwcworZm9yIGNydWZ0cy4gIFRoZW4gSSBjYW4gZmluYWxseSBjbGVhbiB0aGluZ3MgdXA6CisKKyAgICAgICAgJCBnaXQgYnJhbmNoIC1EIHRvcGljCisgICAgICAgICQgZ2l0IHJlc2V0IC0taGFyZCBIRUFEXiA7IyBudWtlIHByZXRlbmQgbWVyZ2UKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9waWNCIgorICAgICAgICAgICAgICAgby0tLW8tLS1vLS0tby0tLW8KKyAgICAgICAgICAgICAgLyAKKyAgICAgICAgICAgICAvby0tLW8tLS1vCisgICAgICAgICAgICB8LyAgICAgICAgInRvcGljQSIKKyAgICAgICAgby0tLW8ibWFzdGVyIgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hvd3RvL3NldHVwLWdpdC1zZXJ2ZXItb3Zlci1odHRwLnR4dCBiL0RvY3VtZW50YXRpb24vaG93dG8vc2V0dXAtZ2l0LXNlcnZlci1vdmVyLWh0dHAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMTkxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3NldHVwLWdpdC1zZXJ2ZXItb3Zlci1odHRwLnR4dApAQCAtMCwwICsxLDI1NiBAQAorRnJvbTogUnV0Z2VyIE5pamx1bnNpbmcgPHJ1dGdlckBub3NwYW0uY29tPgorU3ViamVjdDogU2V0dGluZyB1cCBhIGdpdCByZXBvc2l0b3J5IHdoaWNoIGNhbiBiZSBwdXNoZWQgaW50byBhbmQgcHVsbGVkIGZyb20gb3ZlciBIVFRQLgorRGF0ZTogVGh1LCAxMCBBdWcgMjAwNiAyMjowMDoyNiArMDIwMAorCitTaW5jZSBBcGFjaGUgaXMgb25lIG9mIHRob3NlIHBhY2thZ2VzIHBlb3BsZSBsaWtlIHRvIGNvbXBpbGUKK3RoZW1zZWx2ZXMgd2hpbGUgb3RoZXJzIHByZWZlciB0aGUgYnVyZWF1Y3JhdCdzIGRyZWFtIERlYmlhbiwgaXQgaXMKK2ltcG9zc2libGUgdG8gZ2l2ZSBndWlkZWxpbmVzIHdoaWNoIHdpbGwgd29yayBmb3IgZXZlcnlvbmUuIEp1c3Qgc2VuZAorc29tZSBmZWVkYmFjayB0byB0aGUgbWFpbGluZyBsaXN0IGF0IGdpdEB2Z2VyLmtlcm5lbC5vcmcgdG8gZ2V0IHRoaXMKK2RvY3VtZW50IHRhaWxvcmVkIHRvIHlvdXIgZmF2b3JpdGUgZGlzdHJvLgorCisKK1doYXQncyBuZWVkZWQ6CisKKy0gSGF2ZSBhbiBBcGFjaGUgd2ViLXNlcnZlcgorCisgIE9uIERlYmlhbjoKKyAgICAkIGFwdC1nZXQgaW5zdGFsbCBhcGFjaGUyCisgICAgVG8gZ2V0IGFwYWNoZTIgYnkgZGVmYXVsdCBzdGFydGVkLAorICAgIGVkaXQgL2V0Yy9kZWZhdWx0L2FwYWNoZTIgYW5kIHNldCBOT19TVEFSVD0wCisKKy0gY2FuIGVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgaXQuCisKKyAgVGhpcyBjb3VsZCBiZSBmb3VuZCB1bmRlciAvZXRjL2h0dHBkLCBvciByZWZlciB0byB5b3VyIEFwYWNoZSBkb2N1bWVudGF0aW9uLgorCisgIE9uIERlYmlhbjogdGhpcyBtZWFucyBiZWluZyBhYmxlIHRvIGVkaXQgZmlsZXMgdW5kZXIgL2V0Yy9hcGFjaGUyCisKKy0gY2FuIHJlc3RhcnQgaXQuCisKKyAgJ2FwYWNoZWN0bCAtLWdyYWNlZnVsJyBtaWdodCBkby4gSWYgaXQgZG9lc24ndCwganVzdCBzdG9wIGFuZAorICByZXN0YXJ0IGFwYWNoZS4gQmUgd2FybmluZyB0aGF0IGFjdGl2ZSBjb25uZWN0aW9ucyB0byB5b3VyIHNlcnZlcgorICBtaWdodCBiZSBhYm9ydGVkIGJ5IHRoaXMuCisKKyAgT24gRGViaWFuOgorICAgICQgL2V0Yy9pbml0LmQvYXBhY2hlMiByZXN0YXJ0CisgIG9yCisgICAgJCAvZXRjL2luaXQuZC9hcGFjaGUyIGZvcmNlLXJlbG9hZAorICAgICh3aGljaCBzZWVtcyB0byBkbyB0aGUgc2FtZSkKKyAgVGhpcyBhZGRzIHN5bWxpbmtzIGZyb20gdGhlIC9ldGMvYXBhY2hlMi9tb2RzLWVuYWJsZWQgdG8KKyAgL2V0Yy9hcGFjaGUyL21vZHMtYXZhaWxhYmxlLgorCistIGhhdmUgcGVybWlzc2lvbnMgdG8gY2hvd24gYSBkaXJlY3RvcnkKKworLSBoYXZlIGdpdCBpbnN0YWxsZWQgYXQgdGhlIHNlcnZlciBfYW5kXyBjbGllbnQKKworSW4gZWZmZWN0LCB0aGlzIHByb2JhYmx5IG1lYW5zIHlvdSdyZSBnb2luZyB0byBiZSByb290LgorCisKK1N0ZXAgMTogc2V0dXAgYSBiYXJlIEdJVCByZXBvc2l0b3J5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCBnaXQtaHR0cC1wdXNoIGNhbm5vdCByZW1vdGVseSBjcmVhdGUgYSBHSVQKK3JlcG9zaXRvcnkuIFNvIHdlIGhhdmUgdG8gZG8gdGhhdCBhdCB0aGUgc2VydmVyIHNpZGUgd2l0aCBnaXQuIEFub3RoZXIKK29wdGlvbiB3b3VsZCBiZSB0byBnZW5lcmF0ZSBhbiBlbXB0eSByZXBvc2l0b3J5IGF0IHRoZSBjbGllbnQgYW5kIGNvcHkKK2l0IHRvIHRoZSBzZXJ2ZXIgd2l0aCBXZWJEQVYuIEJ1dCB0aGVuIHlvdSdyZSBwcm9iYWJseSB0aGUgZmlyc3QgdG8KK3RyeSB0aGF0IG91dCA6KQorCitDcmVhdGUgdGhlIGRpcmVjdG9yeSB1bmRlciB0aGUgRG9jdW1lbnRSb290IG9mIHRoZSBkaXJlY3RvcmllcyBzZXJ2ZWQKK2J5IEFwYWNoZS4gQXMgYW4gZXhhbXBsZSB3ZSB0YWtlIC91c3IvbG9jYWwvYXBhY2hlMiwgYnV0IHRyeSAiZ3JlcAorRG9jdW1lbnRSb290IC93aGVyZS9ldmVyL2h0dHBkLmNvbmYiIHRvIGZpbmQgeW91ciByb290OgorCisgICAgJCBjZCAvdXNyL2xvY2FsL2FwYWNoZS9odGRvY3MKKyAgICAkIG1rZGlyIG15LW5ldy1yZXBvLmdpdAorCisgIE9uIERlYmlhbjoKKworICAgICQgY2QgL3Zhci93d3cKKyAgICAkIG1rZGlyIG15LW5ldy1yZXBvLmdpdAorCisKK0luaXRpYWxpemUgYSBiYXJlIHJlcG9zaXRvcnkKKworICAgICQgY2QgbXktbmV3LXJlcG8uZ2l0CisgICAgJCBnaXQgLS1iYXJlIGluaXQtZGIKKworCitDaGFuZ2UgdGhlIG93bmVyc2hpcCB0byB5b3VyIHdlYi1zZXJ2ZXIncyBjcmVkZW50aWFscy4gVXNlICJncmVwIF5Vc2VyCitodHRwZC5jb25mIiBhbmQgImdyZXAgXkdyb3VwIGh0dHBkLmNvbmYiIHRvIGZpbmQgb3V0OgorCisgICAgJCBjaG93biAtUiB3d3cud3d3IC4KKworICBPbiBEZWJpYW46CisKKyAgICAkIGNob3duIC1SIHd3dy1kYXRhLnd3dy1kYXRhIC4KKworCitJZiB5b3UgZG8gbm90IGtub3cgd2hpY2ggdXNlciBBcGFjaGUgcnVucyBhcywgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IGRvCithICJjaG1vZCAtUiBhK3cgLiIsIGluc3BlY3QgdGhlIGZpbGVzIHdoaWNoIGFyZSBjcmVhdGVkIGxhdGVyIG9uLCBhbmQKK3NldCB0aGUgcGVybWlzc2lvbnMgYXBwcm9wcmlhdGVseS4KKworUmVzdGFydCBhcGFjaGUyLCBhbmQgY2hlY2sgd2hldGhlciBodHRwOi8vc2VydmVyL215LW5ldy1yZXBvLmdpdCBnaXZlcworYSBkaXJlY3RvcnkgbGlzdGluZy4gSWYgbm90LCBjaGVjayB3aGV0aGVyIGFwYWNoZSBzdGFydGVkIHVwCitzdWNjZXNzZnVsbHkuCisKKworU3RlcCAyOiBlbmFibGUgREFWIG9uIHRoaXMgcmVwb3NpdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGaXJzdCBtYWtlIHN1cmUgdGhlIGRhdl9tb2R1bGUgaXMgbG9hZGVkLiBGb3IgdGhpcywgaW5zZXJ0IGluIGh0dHBkLmNvbmY6CisKKyAgICBMb2FkTW9kdWxlIGRhdl9tb2R1bGUgbGliZXhlYy9odHRwZC9saWJkYXYuc28KKyAgICBBZGRNb2R1bGUgbW9kX2Rhdi5jCisKK0Fsc28gbWFrZSBzdXJlIHRoYXQgdGhpcyBsaW5lIGV4aXN0cyB3aGljaCBpcyB0aGUgZmlsZSB1c2VkIGZvcgorbG9ja2luZyBEQVYgb3BlcmF0aW9uczoKKworICBEQVZMb2NrREIgIi91c3IvbG9jYWwvYXBhY2hlMi90ZW1wL0RBVi5sb2NrIgorCisgIE9uIERlYmlhbiB0aGVzZSBzdGVwcyBjYW4gYmUgcGVyZm9ybWVkIHdpdGg6CisKKyAgICBFbmFibGUgdGhlIGRhdiBhbmQgZGF2X2ZzIG1vZHVsZXMgb2YgYXBhY2hlOgorICAgICQgYTJlbm1vZCBkYXZfZnMKKyAgICAoanVzdCB0byBiZSBzdXJlLiBkYXZfZnMgbWlnaHQgYmUgdW5uZWVkZWQsIEkgZG9uJ3Qga25vdykKKyAgICAkIGEyZW5tb2QgZGF2CisgICAgVGhlIERBViBsb2NrIGlzIGxvY2F0ZWQgaW4gL2V0Yy9hcGFjaGUyL21vZHMtYXZhaWxhYmxlL2Rhdl9mcy5jb25mOgorICAgICAgREFWTG9ja0RCIC92YXIvbG9jay9hcGFjaGUyL0RBVkxvY2sKKworT2YgY291cnNlLCBpdCBjYW4gcG9pbnQgc29tZXdoZXJlIGVsc2UsIGJ1dCB0aGUgc3RyaW5nIGlzIGFjdHVhbGx5IGp1c3QgYQorcHJlZml4IGluIHNvbWUgQXBhY2hlIGNvbmZpZ3VyYXRpb25zLCBhbmQgdGhlcmVmb3JlIHRoZSBfZGlyZWN0b3J5XyBoYXMgdG8KK2JlIHdyaXRhYmxlIGJ5IHRoZSB1c2VyIEFwYWNoZSBydW5zIGFzLgorCitUaGVuLCBhZGQgc29tZXRoaW5nIGxpa2UgdGhpcyB0byB5b3VyIGh0dHBkLmNvbmYKKworICA8TG9jYXRpb24gL215LW5ldy1yZXBvLmdpdD4KKyAgICAgREFWIG9uCisgICAgIEF1dGhUeXBlIEJhc2ljCisgICAgIEF1dGhOYW1lICJHaXQiCisgICAgIEF1dGhVc2VyRmlsZSAvdXNyL2xvY2FsL2FwYWNoZTIvY29uZi9wYXNzd2QuZ2l0CisgICAgIFJlcXVpcmUgdmFsaWQtdXNlcgorICA8L0xvY2F0aW9uPgorCisgIE9uIERlYmlhbjoKKyAgICBDcmVhdGUgKG9yIGFkZCB0bykgL2V0Yy9hcGFjaGUyL2NvbmYuZC9naXQuY29uZiA6CisKKyAgICA8TG9jYXRpb24gL215LW5ldy1yZXBvLmdpdD4KKyAgICAgICBEQVYgb24KKyAgICAgICBBdXRoVHlwZSBCYXNpYworICAgICAgIEF1dGhOYW1lICJHaXQiCisgICAgICAgQXV0aFVzZXJGaWxlIC9ldGMvYXBhY2hlMi9wYXNzd2QuZ2l0CisgICAgICAgUmVxdWlyZSB2YWxpZC11c2VyCisgICAgPC9Mb2NhdGlvbj4KKworICAgIERlYmlhbiBhdXRvbWF0aWNhbGx5IHJlYWRzIGFsbCBmaWxlcyB1bmRlciAvZXRjL2FwYWNoMi9jb25mLmQuCisKK1RoZSBwYXNzd29yZCBmaWxlIGNhbiBiZSBzb21ld2hlcmUgZWxzZSwgYnV0IGl0IGhhcyB0byBiZSByZWFkYWJsZSBieQorQXBhY2hlIGFuZCBwcmVmZXJhYmx5IG5vdCByZWFkYWJsZSBieSB0aGUgd29ybGQuCisKK0NyZWF0ZSB0aGlzIGZpbGUgYnkKKyAgICAkIGh0cGFzc3dkIC1jIC91c3IvbG9jYWwvYXBhY2hlMi9jb25mL3Bhc3N3ZC5naXQgPHVzZXI+CisKKyAgICBPbiBEZWJpYW46CisgICAgICAkIGh0cGFzc3dkIC1jIC9ldGMvYXBhY2hlMi9wYXNzd2QuZ2l0IDx1c2VyPgorCitZb3Ugd2lsbCBiZSBhc2tlZCBhIHBhc3N3b3JkLCBhbmQgdGhlIGZpbGUgaXMgY3JlYXRlZC4gU3Vic2VxdWVudCBjYWxscwordG8gaHRwYXNzd2Qgc2hvdWxkIG9taXQgdGhlICctYycgb3B0aW9uLCBzaW5jZSB5b3Ugd2FudCB0byBhcHBlbmQgdG8gdGhlCitleGlzdGluZyBmaWxlLgorCitZb3UgbmVlZCB0byByZXN0YXJ0IEFwYWNoZS4KKworTm93IGdvIHRvIGh0dHA6Ly88dXNlcm5hbWU+QDxzZXJ2ZXJuYW1lPi9teS1uZXctcmVwby5naXQgaW4geW91cgorYnJvd3NlciB0byBjaGVjayB3aGV0aGVyIGl0IGFza3MgZm9yIGEgcGFzc3dvcmQgYW5kIGFjY2VwdHMgdGhlIHJpZ2h0CitwYXNzd29yZC4KKworT24gRGViaWFuOgorCisgICBUbyB0ZXN0IHRoZSBXZWJEQVYgcGFydCwgZG86CisKKyAgICQgYXB0LWdldCBpbnN0YWxsIGxpdG11cworICAgJCBsaXRtdXMgaHR0cDovLzxzZXJ2ZXJuYW1lPi9teS1uZXctcmVwby5naXQgPHVzZXJuYW1lPiA8cGFzc3dvcmQ+CisKKyAgIE1vc3QgdGVzdHMgc2hvdWxkIHBhc3MuCisKK0EgY29tbWFuZCBsaW5lIHRvb2wgdG8gdGVzdCBXZWJEQVYgaXMgY2FkYXZlci4KKworSWYgeW91J3JlIGludG8gV2luZG93cywgZnJvbSBYUCBvbndhcmRzIEludGVybmV0IEV4cGxvcmVyIHN1cHBvcnRzCitXZWJEQVYuIEZvciB0aGlzLCBkbyBJbnRlcm5ldCBFeHBsb3JlciAtPiBPcGVuIExvY2F0aW9uIC0+CitodHRwOi8vPHNlcnZlcm5hbWU+L215LW5ldy1yZXBvLmdpdCBbeF0gT3BlbiBhcyB3ZWJmb2xkZXIgLT4gbG9naW4gLgorCisKK1N0ZXAgMzogc2V0dXAgdGhlIGNsaWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIEhUVFAgc3VwcG9ydCwgaS5lLiB5b3VyIGdpdCB3YXMgYnVpbHQgd2l0aCBjdXJsLgorVGhlIGVhc2llc3Qgd2F5IHRvIGNoZWNrIGlzIHRvIGxvb2sgZm9yIHRoZSBleGVjdXRhYmxlICdnaXQtaHR0cC1wdXNoJy4KKworVGhlbiwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciAkSE9NRS8ubmV0cmMgKHlvdSBjYW4gZG8gd2l0aG91dCwgYnV0IHdpbGwgYmUKK2Fza2VkIHRvIGlucHV0IHlvdXIgcGFzc3dvcmQgYSBfbG90XyBvZiB0aW1lcyk6CisKKyAgICBtYWNoaW5lIDxzZXJ2ZXJuYW1lPgorICAgIGxvZ2luIDx1c2VybmFtZT4KKyAgICBwYXNzd29yZCA8cGFzc3dvcmQ+CisKKy4uLmFuZCBzZXQgcGVybWlzc2lvbnM6CisgICAgIGNobW9kIDYwMCB+Ly5uZXRyYworCitJZiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIHdlYi1zZXJ2ZXIgYnkgaXRzIElQLCB5b3UgaGF2ZSB0byB0eXBlIHRoYXQgaW4sCitpbnN0ZWFkIG9mIHRoZSBzZXJ2ZXIgbmFtZS4KKworVG8gY2hlY2sgd2hldGhlciBhbGwgaXMgT0ssIGRvOgorCisgICBjdXJsIC0tbmV0cmMgLS1sb2NhdGlvbiAtdiBodHRwOi8vPHVzZXJuYW1lPkA8c2VydmVybmFtZT4vbXktbmV3LXJlcG8uZ2l0LworCisuLi50aGlzIHNob3VsZCBnaXZlIGEgZGlyZWN0b3J5IGxpc3RpbmcgaW4gSFRNTCBvZiAvdmFyL3d3dy9teS1uZXctcmVwby5naXQgLgorCisKK05vdywgYWRkIHRoZSByZW1vdGUgaW4geW91ciBleGlzdGluZyByZXBvc2l0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBwcm9qZWN0Cit5b3Ugd2FudCB0byBleHBvcnQ6CisKKyAgICQgZ2l0LXJlcG8tY29uZmlnIHJlbW90ZS51cGxvYWQudXJsIFwKKyAgICAgICBodHRwOi8vPHVzZXJuYW1lPkA8c2VydmVybmFtZT4vbXktbmV3LXJlcG8uZ2l0LworCitJdCBpcyBpbXBvcnRhbnQgdG8gcHV0IHRoZSBsYXN0ICcvJzsgV2l0aG91dCBpdCwgdGhlIHNlcnZlciB3aWxsIHNlbmQKK2EgcmVkaXJlY3Qgd2hpY2ggZ2l0LWh0dHAtcHVzaCBkb2VzIG5vdCAoeWV0KSB1bmRlcnN0YW5kLCBhbmQgZ2l0LWh0dHAtcHVzaAord2lsbCByZXBlYXQgdGhlIHJlcXVlc3QgaW5maW5pdGVseS4KKworCitTdGVwIDQ6IG1ha2UgdGhlIGluaXRpYWwgcHVzaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnJvbSB5b3VyIGNsaWVudCByZXBvc2l0b3J5LCBkbworCisgICAkIGdpdCBwdXNoIHVwbG9hZCBtYXN0ZXIKKworVGhpcyBwdXNoZXMgYnJhbmNoICdtYXN0ZXInICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBicmFuY2ggeW91Cit3YW50IHRvIGV4cG9ydCkgdG8gcmVwb3NpdG9yeSBjYWxsZWQgJ3VwbG9hZCcsIHdoaWNoIHdlIHByZXZpb3VzbHkKK2RlZmluZWQgd2l0aCBnaXQtcmVwby1jb25maWcuCisKKworVHJvdWJsZXNob290aW5nOgorLS0tLS0tLS0tLS0tLS0tLQorCitJZiBnaXQtaHR0cC1wdXNoIHNheXMKKworICAgRXJyb3I6IG5vIERBViBsb2NraW5nIHN1cHBvcnQgb24gcmVtb3RlIHJlcG8gaHR0cDovLy4uLgorCit0aGVuIGl0IG1lYW5zIHRoZSB3ZWItc2VydmVyIGRpZCBub3QgYWNjZXB0IHlvdXIgYXV0aGVudGljYXRpb24uIE1ha2Ugc3VyZQordGhhdCB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBtYXRjaGVzIGluIGh0dHBkLmNvbmYsIC5uZXRyYyBhbmQgdGhlIFVSTAoreW91IGFyZSB1cGxvYWRpbmcgdG8uCisKK0lmIGdpdC1odHRwLXB1c2ggc2hvd3MgeW91IGFuIGVycm9yICgyMi81MDIpIHdoZW4gdHJ5aW5nIHRvIE1PVkUgYSBibG9iLAoraXQgbWVhbnMgdGhhdCB5b3VyIHdlYi1zZXJ2ZXIgc29tZWhvdyBkb2VzIG5vdCByZWNvZ25pemUgaXRzIG5hbWUgaW4gdGhlCityZXF1ZXN0OyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB5b3Ugc3RhcnQgQXBhY2hlLCBidXQgdGhlbiBkaXNhYmxlIHRoZQorbmV0d29yayBpbnRlcmZhY2UuIEEgc2ltcGxlIHJlc3RhcnQgb2YgQXBhY2hlIGhlbHBzLgorCitFcnJvcnMgbGlrZSAoMjIvNTAyKSBhcmUgb2YgZm9ybWF0IChjdXJsIGVycm9yIGNvZGUvaHR0cCBlcnJvcgorY29kZSkuIFNvICgyMi80MDQpIG1lYW5zIHNvbWV0aGluZyBsaWtlICdub3QgZm91bmQnIGF0IHRoZSBzZXJ2ZXIuCisKK1JlYWRpbmcgL3Vzci9sb2NhbC9hcGFjaGUyL2xvZ3MvZXJyb3JfbG9nIGlzIG9mdGVuIGhlbHBmdWwuCisKKyAgT24gRGViaWFuOiBSZWFkIC92YXIvbG9nL2FwYWNoZTIvZXJyb3IubG9nIGluc3RlYWQuCisKKworRGViaWFuIFJlZmVyZW5jZXM6IGh0dHA6Ly93d3cuZGViaWFuLWFkbWluaXN0cmF0aW9uLm9yZy9hcnRpY2xlcy8yODUKKworQXV0aG9ycworICBKb2hhbm5lcyBTY2hpbmRlbGluIDxKb2hhbm5lcy5TY2hpbmRlbGluQGdteC5kZT4KKyAgUnV0Z2VyIE5pamx1bnNpbmcgPGdpdEB3aW5nZGluZy5kZW1vbi5ubD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vdXBkYXRlLWhvb2stZXhhbXBsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3VwZGF0ZS1ob29rLWV4YW1wbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hvd3RvL3VwZGF0ZS1ob29rLWV4YW1wbGUudHh0CkBAIC0wLDAgKzEsMTcyIEBACitGcm9tOiBKdW5pbyBDIEhhbWFubyA8anVua2lvQGNveC5uZXQ+IGFuZCBDYXJsIEJhbGR3aW4gPGNuYkBmYy5ocC5jb20+CitTdWJqZWN0OiBjb250cm9sIGFjY2VzcyB0byBicmFuY2hlcy4KK0RhdGU6IFRodSwgMTcgTm92IDIwMDUgMjM6NTU6MzIgLTA4MDAKK01lc3NhZ2UtSUQ6IDw3dmZ5cHVtbHUzLmZzZkBhc3NpZ25lZC1ieS1kaGNwLmNveC5uZXQ+CitBYnN0cmFjdDogQW4gZXhhbXBsZSBob29rcy91cGRhdGUgc2NyaXB0IGlzIHByZXNlbnRlZCB0bworIGltcGxlbWVudCByZXBvc2l0b3J5IG1haW50ZW5hbmNlIHBvbGljaWVzLCBzdWNoIGFzIHdobyBjYW4gcHVzaAorIGludG8gd2hpY2ggYnJhbmNoIGFuZCB3aG8gY2FuIG1ha2UgYSB0YWcuCisKK1doZW4geW91ciBkZXZlbG9wZXIgcnVucyBnaXQtcHVzaCBpbnRvIHRoZSByZXBvc2l0b3J5LAorZ2l0LXJlY2VpdmUtcGFjayBpcyBydW4gKGVpdGhlciBsb2NhbGx5IG9yIG92ZXIgc3NoKSBhcyB0aGF0CitkZXZlbG9wZXIsIHNvIGlzIGhvb2tzL3VwZGF0ZSBzY3JpcHQuICBRdW90aW5nIGZyb20gdGhlIHJlbGV2YW50CitzZWN0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uOgorCisgICAgQmVmb3JlIGVhY2ggcmVmIGlzIHVwZGF0ZWQsIGlmICRHSVRfRElSL2hvb2tzL3VwZGF0ZSBmaWxlIGV4aXN0cworICAgIGFuZCBleGVjdXRhYmxlLCBpdCBpcyBjYWxsZWQgd2l0aCB0aHJlZSBwYXJhbWV0ZXJzOgorCisgICAgICAgICAgICRHSVRfRElSL2hvb2tzL3VwZGF0ZSByZWZuYW1lIHNoYTEtb2xkIHNoYTEtbmV3CisKKyAgICBUaGUgcmVmbmFtZSBwYXJhbWV0ZXIgaXMgcmVsYXRpdmUgdG8gJEdJVF9ESVI7IGUuZy4gZm9yIHRoZQorICAgIG1hc3RlciBoZWFkIHRoaXMgaXMgInJlZnMvaGVhZHMvbWFzdGVyIi4gIFR3byBzaGExIGFyZSB0aGUKKyAgICBvYmplY3QgbmFtZXMgZm9yIHRoZSByZWZuYW1lIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZS4gIE5vdGUKKyAgICB0aGF0IHRoZSBob29rIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHJlZm5hbWUgaXMgdXBkYXRlZCwgc28gZWl0aGVyCisgICAgc2hhMS1vbGQgaXMgMHs0MH0gKG1lYW5pbmcgdGhlcmUgaXMgbm8gc3VjaCByZWYgeWV0KSwgb3IgaXQKKyAgICBzaG91bGQgbWF0Y2ggd2hhdCBpcyByZWNvcmRlZCBpbiByZWZuYW1lLgorCitTbyBpZiB5b3VyIHBvbGljeSBpcyAoMSkgYWx3YXlzIHJlcXVpcmUgZmFzdC1mb3J3YXJkIHB1c2gKKyhpLmUuIG5ldmVyIGFsbG93ICJnaXQtcHVzaCByZXBvICticmFuY2g6YnJhbmNoIiksICgyKSB5b3UKK2hhdmUgYSBsaXN0IG9mIHVzZXJzIGFsbG93ZWQgdG8gdXBkYXRlIGVhY2ggYnJhbmNoLCBhbmQgKDMpIHlvdQorZG8gbm90IGxldCB0YWdzIHRvIGJlIG92ZXJ3cml0dGVuLCB0aGVuIHlvdSBjYW4gdXNlIHNvbWV0aGluZworbGlrZSB0aGlzIGFzIHlvdXIgaG9va3MvdXBkYXRlIHNjcmlwdC4KKworW2pjOiBlZGl0b3JpYWwgbm90ZS4gIFRoaXMgaXMgYSBtdWNoIGltcHJvdmVkIHZlcnNpb24gYnkgQ2FybAorc2luY2UgSSBwb3N0ZWQgdGhlIG9yaWdpbmFsIG91dGxpbmVdCisKKy0tID44IC0tIGJlZ2lubmluZyBvZiBzY3JpcHQgLS0gPjggLS0KKworIyEvYmluL2Jhc2gKKwordW1hc2sgMDAyCisKKyMgSWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSB3aXRoIHRoaXMgYWNjZXNzIGNvbnRyb2wgaG9vayBzY3JpcHQKKyMgeW91IGNhbiB0cnkgc2V0dGluZyB0aGlzIHRvIHRydWUuICBJdCB3aWxsIHRlbGwgeW91IGV4YWN0bHkKKyMgd2h5IGEgdXNlciBpcyBiZWluZyBhbGxvd2VkL2RlbmllZCBhY2Nlc3MuCisKK3ZlcmJvc2U9ZmFsc2UKKworIyBEZWZhdWx0IHNoZWxsIGdsb2JiaW5nIG1lc3NlcyB0aGluZ3MgdXAgZG93bnN0cmVhbQorR0xPQklHTk9SRT0qCisKK2Z1bmN0aW9uIGdyYW50IHsKKyAgJHZlcmJvc2UgJiYgZWNobyA+JjIgIi1HcmFudC0JCSQxIgorICBlY2hvIGdyYW50CisgIGV4aXQgMAorfQorCitmdW5jdGlvbiBkZW55IHsKKyAgJHZlcmJvc2UgJiYgZWNobyA+JjIgIi1EZW55LQkJJDEiCisgIGVjaG8gZGVueQorICBleGl0IDEKK30KKworZnVuY3Rpb24gaW5mbyB7CisgICR2ZXJib3NlICYmIGVjaG8gPiYyICItSW5mby0JCSQxIgorfQorCisjIEltcGxlbWVudCBnZW5lcmljIGJyYW5jaCBhbmQgdGFnIHBvbGljaWVzLgorIyAtIFRhZ3Mgc2hvdWxkIG5vdCBiZSB1cGRhdGVkIG9uY2UgY3JlYXRlZC4KKyMgLSBCcmFuY2hlcyBzaG91bGQgb25seSBiZSBmYXN0LWZvcndhcmRlZC4KK2Nhc2UgIiQxIiBpbgorICByZWZzL3RhZ3MvKikKKyAgICBbIC1mICIkR0lUX0RJUi8kMSIgXSAmJgorICAgIGRlbnkgPi9kZXYvbnVsbCAiWW91IGNhbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyB0YWciCisgICAgOzsKKyAgcmVmcy9oZWFkcy8qKQorICAgICMgTm8gcmViYXNpbmcgb3IgcmV3aW5kaW5nCisgICAgaWYgZXhwciAiJDIiIDogJzAqJCcgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgaW5mbyAiVGhlIGJyYW5jaCAnJDEnIGlzIG5ldy4uLiIKKyAgICBlbHNlCisgICAgICAjIHVwZGF0aW5nIC0tIG1ha2Ugc3VyZSBpdCBpcyBhIGZhc3QgZm9yd2FyZAorICAgICAgbWI9JChnaXQtbWVyZ2UtYmFzZSAiJDIiICIkMyIpCisgICAgICBjYXNlICIkbWIsJDIiIGluCisgICAgICAgICIkMiwkbWIiKSBpbmZvICJVcGRhdGUgaXMgZmFzdC1mb3J3YXJkIiA7OworICAgICAgICAqKSAgICAgICAgZGVueSA+L2Rldi9udWxsICAiVGhpcyBpcyBub3QgYSBmYXN0LWZvcndhcmQgdXBkYXRlLiIgOzsKKyAgICAgIGVzYWMKKyAgICBmaQorICAgIDs7CisgICopCisgICAgZGVueSA+L2Rldi9udWxsIFwKKyAgICAiQnJhbmNoIGlzIG5vdCB1bmRlciByZWZzL2hlYWRzIG9yIHJlZnMvdGFncy4gIFdoYXQgYXJlIHlvdSB0cnlpbmcgdG8gZG8/IgorICAgIDs7Citlc2FjCisKKyMgSW1wbGVtZW50IHBlci1icmFuY2ggY29udHJvbHMgYmFzZWQgb24gdXNlcm5hbWUKK2FsbG93ZWRfdXNlcnNfZmlsZT0kR0lUX0RJUi9pbmZvL2FsbG93ZWQtdXNlcnMKK3VzZXJuYW1lPSQoaWQgLXUgLW4pCitpbmZvICJUaGUgdXNlciBpczogJyR1c2VybmFtZSciCisKK2lmIFsgLWYgIiRhbGxvd2VkX3VzZXJzX2ZpbGUiIF07IHRoZW4KKyAgcmM9JChjYXQgJGFsbG93ZWRfdXNlcnNfZmlsZSB8IGdyZXAgLXYgJ14jJyB8IGdyZXAgLXYgJ14kJyB8CisgICAgd2hpbGUgcmVhZCBoZWFkX3BhdHRlcm4gdXNlcl9wYXR0ZXJuczsgZG8KKyAgICAgIG1hdGNobGVuPSQoZXhwciAiJDEiIDogIiRoZWFkX3BhdHRlcm4iKQorICAgICAgaWYgWyAiJG1hdGNobGVuIiA9PSAiJHsjMX0iIF07IHRoZW4KKyAgICAgICAgaW5mbyAiRm91bmQgbWF0Y2hpbmcgaGVhZCBwYXR0ZXJuOiAnJGhlYWRfcGF0dGVybiciCisgICAgICAgIGZvciB1c2VyX3BhdHRlcm4gaW4gJHVzZXJfcGF0dGVybnM7IGRvCisgICAgICAgICAgaW5mbyAiQ2hlY2tpbmcgdXNlcjogJyR1c2VybmFtZScgYWdhaW5zdCBwYXR0ZXJuOiAnJHVzZXJfcGF0dGVybiciCisgICAgICAgICAgbWF0Y2hsZW49JChleHByICIkdXNlcm5hbWUiIDogIiR1c2VyX3BhdHRlcm4iKQorICAgICAgICAgIGlmIFsgIiRtYXRjaGxlbiIgPT0gIiR7I3VzZXJuYW1lfSIgXTsgdGhlbgorICAgICAgICAgICAgZ3JhbnQgIkFsbG93aW5nIHVzZXI6ICckdXNlcm5hbWUnIHdpdGggcGF0dGVybjogJyR1c2VyX3BhdHRlcm4nIgorICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKyAgICAgICAgZGVueSAiVGhlIHVzZXIgaXMgbm90IGluIHRoZSBhY2Nlc3MgbGlzdCBmb3IgdGhpcyBicmFuY2giCisgICAgICBmaQorICAgIGRvbmUKKyAgKQorICBjYXNlICIkcmMiIGluCisgICAgZ3JhbnQpIGdyYW50ID4vZGV2L251bGwgIkdyYW50aW5nIGFjY2VzcyBiYXNlZCBvbiAkYWxsb3dlZF91c2Vyc19maWxlIiA7OworICAgIGRlbnkpICBkZW55ICA+L2Rldi9udWxsICJEZW55aW5nICBhY2Nlc3MgYmFzZWQgb24gJGFsbG93ZWRfdXNlcnNfZmlsZSIgOzsKKyAgICAqKSA7OworICBlc2FjCitmaQorCithbGxvd2VkX2dyb3Vwc19maWxlPSRHSVRfRElSL2luZm8vYWxsb3dlZC1ncm91cHMKK2dyb3Vwcz0kKGlkIC1HIC1uKQoraW5mbyAiVGhlIHVzZXIgYmVsb25ncyB0byB0aGUgZm9sbG93aW5nIGdyb3VwczoiCitpbmZvICInJGdyb3VwcyciCisKK2lmIFsgLWYgIiRhbGxvd2VkX2dyb3Vwc19maWxlIiBdOyB0aGVuCisgIHJjPSQoY2F0ICRhbGxvd2VkX2dyb3Vwc19maWxlIHwgZ3JlcCAtdiAnXiMnIHwgZ3JlcCAtdiAnXiQnIHwKKyAgICB3aGlsZSByZWFkIGhlYWRfcGF0dGVybiBncm91cF9wYXR0ZXJuczsgZG8KKyAgICAgIG1hdGNobGVuPSQoZXhwciAiJDEiIDogIiRoZWFkX3BhdHRlcm4iKQorICAgICAgaWYgWyAiJG1hdGNobGVuIiA9PSAiJHsjMX0iIF07IHRoZW4KKyAgICAgICAgaW5mbyAiRm91bmQgbWF0Y2hpbmcgaGVhZCBwYXR0ZXJuOiAnJGhlYWRfcGF0dGVybiciCisgICAgICAgIGZvciBncm91cF9wYXR0ZXJuIGluICRncm91cF9wYXR0ZXJuczsgZG8KKyAgICAgICAgICBmb3IgZ3JvdXBuYW1lIGluICRncm91cHM7IGRvCisgICAgICAgICAgICBpbmZvICJDaGVja2luZyBncm91cDogJyRncm91cG5hbWUnIGFnYWluc3QgcGF0dGVybjogJyRncm91cF9wYXR0ZXJuJyIKKyAgICAgICAgICAgIG1hdGNobGVuPSQoZXhwciAiJGdyb3VwbmFtZSIgOiAiJGdyb3VwX3BhdHRlcm4iKQorICAgICAgICAgICAgaWYgWyAiJG1hdGNobGVuIiA9PSAiJHsjZ3JvdXBuYW1lfSIgXTsgdGhlbgorICAgICAgICAgICAgICBncmFudCAiQWxsb3dpbmcgZ3JvdXA6ICckZ3JvdXBuYW1lJyB3aXRoIHBhdHRlcm46ICckZ3JvdXBfcGF0dGVybiciCisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgICAgICBkZW55ICJOb25lIG9mIHRoZSB1c2VyJ3MgZ3JvdXBzIGFyZSBpbiB0aGUgYWNjZXNzIGxpc3QgZm9yIHRoaXMgYnJhbmNoIgorICAgICAgZmkKKyAgICBkb25lCisgICkKKyAgY2FzZSAiJHJjIiBpbgorICAgIGdyYW50KSBncmFudCA+L2Rldi9udWxsICJHcmFudGluZyBhY2Nlc3MgYmFzZWQgb24gJGFsbG93ZWRfZ3JvdXBzX2ZpbGUiIDs7CisgICAgZGVueSkgIGRlbnkgID4vZGV2L251bGwgIkRlbnlpbmcgIGFjY2VzcyBiYXNlZCBvbiAkYWxsb3dlZF9ncm91cHNfZmlsZSIgOzsKKyAgICAqKSA7OworICBlc2FjCitmaQorCitkZW55ID4vZGV2L251bGwgIlRoZXJlIGFyZSBubyBtb3JlIHJ1bGVzIHRvIGNoZWNrLiAgRGVueWluZyBhY2Nlc3MiCisKKy0tID44IC0tIGVuZCBvZiBzY3JpcHQgLS0gPjggLS0KKworVGhpcyB1c2VzIHR3byBmaWxlcywgJEdJVF9ESVIvaW5mby9hbGxvd2VkLXVzZXJzIGFuZAorYWxsb3dlZC1ncm91cHMsIHRvIGRlc2NyaWJlIHdoaWNoIGhlYWRzIGNhbiBiZSBwdXNoZWQgaW50byBieQord2hvbS4gIFRoZSBmb3JtYXQgb2YgZWFjaCBmaWxlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorCisJcmVmcy9oZWFkcy9tYXN0ZXIJanVuaW8KKyAgICAgICAgcmVmcy9oZWFkcy9jb2dpdG8kCXBhc2t5CisJcmVmcy9oZWFkcy9idy8JCWxpbnVzCisgICAgICAgIHJlZnMvaGVhZHMvdG1wLwkJKgorICAgICAgICByZWZzL3RhZ3MvdlswLTldKglqdW5pbworCitXaXRoIHRoaXMsIExpbnVzIGNhbiBwdXNoIG9yIGNyZWF0ZSAiYncvcGVuZ3VpbiIgb3IgImJ3L3plYnJhIgorb3IgImJ3L3BhbmRhIiBicmFuY2hlcywgUGFza3kgY2FuIGRvIG9ubHkgImNvZ2l0byIsIGFuZCBKQyBjYW4KK2RvIG1hc3RlciBicmFuY2ggYW5kIG1ha2UgdmVyc2lvbmVkIHRhZ3MuICBBbmQgYW55Ym9keSBjYW4gZG8KK3RtcC9ibGFoIGJyYW5jaGVzLgorCistLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaG93dG8vdXNpbmctdG9waWMtYnJhbmNoZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9ob3d0by91c2luZy10b3BpYy1icmFuY2hlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5ODE5NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaG93dG8vdXNpbmctdG9waWMtYnJhbmNoZXMudHh0CkBAIC0wLDAgKzEsMjk2IEBACitEYXRlOiBNb24sIDE1IEF1ZyAyMDA1IDEyOjE3OjQxIC0wNzAwCitGcm9tOiB0b255Lmx1Y2tAaW50ZWwuY29tCitTdWJqZWN0OiBTb21lIHR1dG9yaWFsIHRleHQgKHdhcyBnaXQvY29naXRvIHdvcmtzaG9wL2JvZiBhdCBsaW51eGNvbmYgYXU/KQorQWJzdHJhY3Q6IEluIHRoaXMgYXJ0aWNsZSwgVG9ueSBMdWNrIGRpc2N1c3NlcyBob3cgaGUgdXNlcyBHSVQKKyBhcyBhIExpbnV4IHN1YnN5c3RlbSBtYWludGFpbmVyLgorCitIZXJlJ3Mgc29tZXRoaW5nIHRoYXQgSSd2ZSBiZWVuIHB1dHRpbmcgdG9nZXRoZXIgb24gaG93IEknbSB1c2luZworR0lUIGFzIGEgTGludXggc3Vic3lzdGVtIG1haW50YWluZXIuCisKKy1Ub255CisKK0xhc3QgdXBkYXRlZCB3LnIudC4gR0lUIDEuMQorCitMaW51eCBzdWJzeXN0ZW0gbWFpbnRlbmFuY2UgdXNpbmcgR0lUCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK015IHJlcXVpcmVtZW50cyBoZXJlIGFyZSB0byBiZSBhYmxlIHRvIGNyZWF0ZSB0d28gcHVibGljIHRyZWVzOgorCisxKSBBICJ0ZXN0IiB0cmVlIGludG8gd2hpY2ggcGF0Y2hlcyBhcmUgaW5pdGlhbGx5IHBsYWNlZCBzbyB0aGF0IHRoZXkKK2NhbiBnZXQgc29tZSBleHBvc3VyZSB3aGVuIGludGVncmF0ZWQgd2l0aCBvdGhlciBvbmdvaW5nIGRldmVsb3BtZW50LgorVGhpcyB0cmVlIGlzIGF2YWlsYWJsZSB0byBBbmRyZXcgZm9yIHB1bGxpbmcgaW50byAtbW0gd2hlbmV2ZXIgaGUgd2FudHMuCisKKzIpIEEgInJlbGVhc2UiIHRyZWUgaW50byB3aGljaCB0ZXN0ZWQgcGF0Y2hlcyBhcmUgbW92ZWQgZm9yIGZpbmFsCitzYW5pdHkgY2hlY2tpbmcsIGFuZCBhcyBhIHZlaGljbGUgdG8gc2VuZCB0aGVtIHVwc3RyZWFtIHRvIExpbnVzCisoYnkgc2VuZGluZyBoaW0gYSAicGxlYXNlIHB1bGwiIHJlcXVlc3QuKQorCitOb3RlIHRoYXQgdGhlIHBlcmlvZCBvZiB0aW1lIHRoYXQgZWFjaCBwYXRjaCBzcGVuZHMgaW4gdGhlICJ0ZXN0IiB0cmVlCitpcyBkZXBlbmRlbnQgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlIGNoYW5nZS4gIFNpbmNlIEdJVCBkb2VzIG5vdCBzdXBwb3J0CitjaGVycnkgcGlja2luZywgaXQgaXMgbm90IHByYWN0aWNhbCB0byBzaW1wbHkgYXBwbHkgYWxsIHBhdGNoZXMgdG8gdGhlCit0ZXN0IHRyZWUgYW5kIHRoZW4gcHVsbCB0byB0aGUgcmVsZWFzZSB0cmVlIGFzIHRoYXQgd291bGQgbGVhdmUgdHJpdmlhbAorcGF0Y2hlcyBibG9ja2VkIGluIHRoZSB0ZXN0IHRyZWUgd2FpdGluZyBmb3IgY29tcGxleCBjaGFuZ2VzIHRvIGFjY3VtdWxhdGUKK2Vub3VnaCB0ZXN0IHRpbWUgdG8gZ3JhZHVhdGUuCisKK0JhY2sgaW4gdGhlIEJpdEtlZXBlciBkYXlzIEkgYWNoaWV2ZWQgdGhpcyBieSBjcmVhdGluZyBzbWFsbCBmb3Jlc3RzIG9mCit0ZW1wb3JhcnkgdHJlZXMsIG9uZSB0cmVlIGZvciBlYWNoIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcGF0Y2hlcywgYW5kIHRoZW4KK3B1bGxpbmcgY2hhbmdlcyBmcm9tIHRoZXNlIHRyZWVzIGZpcnN0IHRvIHRoZSB0ZXN0IHRyZWUsIGFuZCB0aGVuIHRvIHRoZQorcmVsZWFzZSB0cmVlLiAgQXQgZmlyc3QgSSByZXBsaWNhdGVkIHRoaXMgaW4gR0lULCBidXQgdGhlbiBJIHJlYWxpc2VkCit0aGF0IEkgY291bGQgc28gdGhpcyBmYXIgbW9yZSBlZmZpY2llbnRseSB1c2luZyBicmFuY2hlcyBpbnNpZGUgYSBzaW5nbGUKK0dJVCByZXBvc2l0b3J5LgorCitTbyBoZXJlIGlzIHRoZSBzdGVwLWJ5LXN0ZXAgZ3VpZGUgaG93IHRoaXMgYWxsIHdvcmtzIGZvciBtZS4KKworRmlyc3QgY3JlYXRlIHlvdXIgd29yayB0cmVlIGJ5IGNsb25pbmcgTGludXMncyBwdWJsaWMgdHJlZToKKworICQgZ2l0IGNsb25lIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51eC0yLjYuZ2l0IHdvcmsKKworQ2hhbmdlIGRpcmVjdG9yeSBpbnRvIHRoZSBjbG9uZWQgdHJlZSB5b3UganVzdCBjcmVhdGVkCisKKyAkIGNkIHdvcmsKKworU2V0IHVwIGEgcmVtb3RlcyBmaWxlIHNvIHRoYXQgeW91IGNhbiBmZXRjaCB0aGUgbGF0ZXN0IGZyb20gTGludXMnIG1hc3RlcgorYnJhbmNoIGludG8gYSBsb2NhbCBicmFuY2ggbmFtZWQgImxpbnVzIjoKKworICQgY2F0ID4gLmdpdC9yZW1vdGVzL2xpbnVzCisgVVJMOiBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXgtMi42LmdpdAorIFB1bGw6IG1hc3RlcjpsaW51cworIF5ECisKK2FuZCBjcmVhdGUgdGhlIGxpbnVzIGJyYW5jaDoKKworICQgZ2l0IGJyYW5jaCBsaW51cworCitUaGUgImxpbnVzIiBicmFuY2ggd2lsbCBiZSB1c2VkIHRvIHRyYWNrIHRoZSB1cHN0cmVhbSBrZXJuZWwuICBUbyB1cGRhdGUgaXQsCit5b3Ugc2ltcGx5IHJ1bjoKKworICQgZ2l0IGZldGNoIGxpbnVzCisKK3lvdSBjYW4gZG8gdGhpcyBmcmVxdWVudGx5IChhbmQgaXQgc2hvdWxkIGJlIHNhZmUgdG8gZG8gc28gd2l0aCBwZW5kaW5nCit3b3JrIGluIHlvdXIgdHJlZSwgYnV0IHBlcmhhcHMgbm90IGlmIHlvdSBhcmUgaW4gbWlkLW1lcmdlKS4KKworSWYgeW91IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBvdGhlciBwdWJsaWMgdHJlZXMsIHlvdSBjYW4gYWRkIHJlbW90ZSBicmFuY2hlcworZm9yIHRoZW0gdG9vOgorCisgJCBnaXQgYnJhbmNoIGFub3RoZXIKKyAkIGNhdCA+IC5naXQvcmVtb3Rlcy9hbm90aGVyCisgVVJMOiAuLi4gaW5zZXJ0IFVSTCBoZXJlIC4uLgorIFB1bGw6IG5hbWUtb2YtYnJhbmNoLWluLXRoaXMtcmVtb3RlLXRyZWU6YW5vdGhlcgorIF5ECisKK2FuZCBydW46CisKKyAkIGdpdCBmZXRjaCBhbm90aGVyCisKK05vdyBjcmVhdGUgdGhlIGJyYW5jaGVzIGluIHdoaWNoIHlvdSBhcmUgZ29pbmcgdG8gd29yaywgdGhlc2Ugc3RhcnQKK291dCBhdCB0aGUgY3VycmVudCB0aXAgb2YgdGhlIGxpbnVzIGJyYW5jaC4KKworICQgZ2l0IGJyYW5jaCB0ZXN0IGxpbnVzCisgJCBnaXQgYnJhbmNoIHJlbGVhc2UgbGludXMKKworVGhlc2UgY2FuIGJlIGVhc2lseSBrZXB0IHVwIHRvIGRhdGUgYnkgbWVyZ2luZyBmcm9tIHRoZSAibGludXMiIGJyYW5jaDoKKworICQgZ2l0IGNoZWNrb3V0IHRlc3QgJiYgZ2l0IG1lcmdlICJBdXRvLXVwZGF0ZSBmcm9tIHVwc3RyZWFtIiB0ZXN0IGxpbnVzCisgJCBnaXQgY2hlY2tvdXQgcmVsZWFzZSAmJiBnaXQgbWVyZ2UgIkF1dG8tdXBkYXRlIGZyb20gdXBzdHJlYW0iIHJlbGVhc2UgbGludXMKKworSW1wb3J0YW50IG5vdGUhICBJZiB5b3UgaGF2ZSBhbnkgbG9jYWwgY2hhbmdlcyBpbiB0aGVzZSBicmFuY2hlcywgdGhlbgordGhpcyBtZXJnZSB3aWxsIGNyZWF0ZSBhIGNvbW1pdCBvYmplY3QgaW4gdGhlIGhpc3RvcnkgKHdpdGggbm8gbG9jYWwKK2NoYW5nZXMgZ2l0IHdpbGwgc2ltcGx5IGRvIGEgIkZhc3QgZm9yd2FyZCIgbWVyZ2UpLiAgTWFueSBwZW9wbGUgZGlzbGlrZQordGhlICJub2lzZSIgdGhhdCB0aGlzIGNyZWF0ZXMgaW4gdGhlIExpbnV4IGhpc3RvcnksIHNvIHlvdSBzaG91bGQgYXZvaWQKK2RvaW5nIHRoaXMgY2FwcmljaW91c2x5IGluIHRoZSAicmVsZWFzZSIgYnJhbmNoLCBhcyB0aGVzZSBub2lzeSBjb21taXRzCit3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSBwZXJtYW5lbnQgaGlzdG9yeSB3aGVuIHlvdSBhc2sgTGludXMgdG8gcHVsbAorZnJvbSB0aGUgcmVsZWFzZSBicmFuY2guCisKK1NldCB1cCBzbyB0aGF0IHlvdSBjYW4gcHVzaCB1cHN0cmVhbSB0byB5b3VyIHB1YmxpYyB0cmVlICh5b3UgbmVlZCB0bworbG9nLWluIHRvIHRoZSByZW1vdGUgc3lzdGVtIGFuZCBjcmVhdGUgYW4gZW1wdHkgdHJlZSB0aGVyZSBiZWZvcmUgdGhlCitmaXJzdCBwdXNoKS4KKworICQgY2F0ID4gLmdpdC9yZW1vdGVzL215dHJlZQorIFVSTDogbWFzdGVyLmtlcm5lbC5vcmc6L3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9hZWdsL2xpbnV4LTIuNi5naXQKKyBQdXNoOiByZWxlYXNlCisgUHVzaDogdGVzdAorIF5ECisKK2FuZCB0aGUgcHVzaCBib3RoIHRoZSB0ZXN0IGFuZCByZWxlYXNlIHRyZWVzIHVzaW5nOgorCisgJCBnaXQgcHVzaCBteXRyZWUKKworb3IgcHVzaCBqdXN0IG9uZSBvZiB0aGUgdGVzdCBhbmQgcmVsZWFzZSBicmFuY2hlcyB1c2luZzoKKworICQgZ2l0IHB1c2ggbXl0cmVlIHRlc3QKK29yCisgJCBnaXQgcHVzaCBteXRyZWUgcmVsZWFzZQorCitOb3cgdG8gYXBwbHkgc29tZSBwYXRjaGVzIGZyb20gdGhlIGNvbW11bml0eS4gIFRoaW5rIG9mIGEgc2hvcnQKK3NuYXBweSBuYW1lIGZvciBhIGJyYW5jaCB0byBob2xkIHRoaXMgcGF0Y2ggKG9yIHJlbGF0ZWQgZ3JvdXAgb2YKK3BhdGNoZXMpLCBhbmQgY3JlYXRlIGEgbmV3IGJyYW5jaCBmcm9tIHRoZSBjdXJyZW50IHRpcCBvZiB0aGUKK2xpbnVzIGJyYW5jaDoKKworICQgZ2l0IGNoZWNrb3V0IC1iIHNwZWVkLXVwLXNwaW5sb2NrcyBsaW51cworCitOb3cgeW91IGFwcGx5IHRoZSBwYXRjaChlcyksIHJ1biBzb21lIHRlc3RzLCBhbmQgY29tbWl0IHRoZSBjaGFuZ2UocykuICBJZgordGhlIHBhdGNoIGlzIGEgbXVsdGktcGFydCBzZXJpZXMsIHRoZW4geW91IHNob3VsZCBhcHBseSBlYWNoIGFzIGEgc2VwYXJhdGUKK2NvbW1pdCB0byB0aGlzIGJyYW5jaC4KKworICQgLi4uIHBhdGNoIC4uLiB0ZXN0ICAuLi4gY29tbWl0IFsgLi4uIHBhdGNoIC4uLiB0ZXN0IC4uLiBjb21taXQgXSoKKworV2hlbiB5b3UgYXJlIGhhcHB5IHdpdGggdGhlIHN0YXRlIG9mIHRoaXMgY2hhbmdlLCB5b3UgY2FuIHB1bGwgaXQgaW50byB0aGUKKyJ0ZXN0IiBicmFuY2ggaW4gcHJlcGFyYXRpb24gdG8gbWFrZSBpdCBwdWJsaWM6CisKKyAkIGdpdCBjaGVja291dCB0ZXN0ICYmIGdpdCBtZXJnZSAiUHVsbCBzcGVlZC11cC1zcGlubG9jayBjaGFuZ2VzIiB0ZXN0IHNwZWVkLXVwLXNwaW5sb2NrcworCitJdCBpcyB1bmxpa2VseSB0aGF0IHlvdSB3b3VsZCBoYXZlIGFueSBjb25mbGljdHMgaGVyZSAuLi4gYnV0IHlvdSBtaWdodCBpZiB5b3UKK3NwZW50IGEgd2hpbGUgb24gdGhpcyBzdGVwIGFuZCBoYWQgYWxzbyBwdWxsZWQgbmV3IHZlcnNpb25zIGZyb20gdXBzdHJlYW0uCisKK1NvbWUgdGltZSBsYXRlciB3aGVuIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgYW5kIHRlc3RpbmcgZG9uZSwgeW91IGNhbiBwdWxsIHRoZQorc2FtZSBicmFuY2ggaW50byB0aGUgInJlbGVhc2UiIHRyZWUgcmVhZHkgdG8gZ28gdXBzdHJlYW0uICBUaGlzIGlzIHdoZXJlIHlvdQorc2VlIHRoZSB2YWx1ZSBvZiBrZWVwaW5nIGVhY2ggcGF0Y2ggKG9yIHBhdGNoIHNlcmllcykgaW4gaXRzIG93biBicmFuY2guICBJdAorbWVhbnMgdGhhdCB0aGUgcGF0Y2hlcyBjYW4gYmUgbW92ZWQgaW50byB0aGUgInJlbGVhc2UiIHRyZWUgaW4gYW55IG9yZGVyLgorCisgJCBnaXQgY2hlY2tvdXQgcmVsZWFzZSAmJiBnaXQgbWVyZ2UgIlB1bGwgc3BlZWQtdXAtc3BpbmxvY2sgY2hhbmdlcyIgcmVsZWFzZSBzcGVlZC11cC1zcGlubG9ja3MKKworQWZ0ZXIgYSB3aGlsZSwgeW91IHdpbGwgaGF2ZSBhIG51bWJlciBvZiBicmFuY2hlcywgYW5kIGRlc3BpdGUgdGhlCit3ZWxsIGNob3NlbiBuYW1lcyB5b3UgcGlja2VkIGZvciBlYWNoIG9mIHRoZW0sIHlvdSBtYXkgZm9yZ2V0IHdoYXQKK3RoZXkgYXJlIGZvciwgb3Igd2hhdCBzdGF0dXMgdGhleSBhcmUgaW4uICBUbyBnZXQgYSByZW1pbmRlciBvZiB3aGF0CitjaGFuZ2VzIGFyZSBpbiBhIHNwZWNpZmljIGJyYW5jaCwgdXNlOgorCisgJCBnaXQtd2hhdGNoYW5nZWQgYnJhbmNobmFtZSBebGludXMgfCBnaXQtc2hvcnRsb2cKKworVG8gc2VlIHdoZXRoZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBtZXJnZWQgaW50byB0aGUgdGVzdCBvciByZWxlYXNlIGJyYW5jaGVzCit1c2U6CisKKyAkIGdpdC1yZXYtbGlzdCBicmFuY2huYW1lIF50ZXN0CitvcgorICQgZ2l0LXJldi1saXN0IGJyYW5jaG5hbWUgXnJlbGVhc2UKKworW0lmIHRoaXMgYnJhbmNoIGhhcyBub3QgeWV0IGJlZW4gbWVyZ2VkIHlvdSB3aWxsIHNlZSBhIHNldCBvZiBTSEExIHZhbHVlcworZm9yIHRoZSBjb21taXRzLCBpZiBpdCBoYXMgYmVlbiBtZXJnZWQsIHRoZW4gdGhlcmUgd2lsbCBiZSBubyBvdXRwdXRdCisKK09uY2UgYSBwYXRjaCBjb21wbGV0ZXMgdGhlIGdyZWF0IGN5Y2xlIChtb3ZpbmcgZnJvbSB0ZXN0IHRvIHJlbGVhc2UsIHRoZW4KK3B1bGxlZCBieSBMaW51cywgYW5kIGZpbmFsbHkgY29taW5nIGJhY2sgaW50byB5b3VyIGxvY2FsICJsaW51cyIgYnJhbmNoKQordGhlIGJyYW5jaCBmb3IgdGhpcyBjaGFuZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIFlvdSBkZXRlY3QgdGhpcyB3aGVuIHRoZQorb3V0cHV0IGZyb206CisKKyAkIGdpdC1yZXYtbGlzdCBicmFuY2huYW1lIF5saW51cworCitpcyBlbXB0eS4gIEF0IHRoaXMgcG9pbnQgdGhlIGJyYW5jaCBjYW4gYmUgZGVsZXRlZDoKKworICQgZ2l0IGJyYW5jaCAtZCBicmFuY2huYW1lCisKK1NvbWUgY2hhbmdlcyBhcmUgc28gdHJpdmlhbCB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY3JlYXRlIGEgc2VwYXJhdGUKK2JyYW5jaCBhbmQgdGhlbiBtZXJnZSBpbnRvIGVhY2ggb2YgdGhlIHRlc3QgYW5kIHJlbGVhc2UgYnJhbmNoZXMuICBGb3IKK3RoZXNlIGNoYW5nZXMsIGp1c3QgYXBwbHkgZGlyZWN0bHkgdG8gdGhlICJyZWxlYXNlIiBicmFuY2gsIGFuZCB0aGVuCittZXJnZSB0aGF0IGludG8gdGhlICJ0ZXN0IiBicmFuY2guCisKK1RvIGNyZWF0ZSBkaWZmc3RhdCBhbmQgc2hvcnRsb2cgc3VtbWFyaWVzIG9mIGNoYW5nZXMgdG8gaW5jbHVkZSBpbiBhICJwbGVhc2UKK3B1bGwiIHJlcXVlc3QgdG8gTGludXMgeW91IGNhbiB1c2U6CisKKyAkIGdpdC13aGF0Y2hhbmdlZCAtcCByZWxlYXNlIF5saW51cyB8IGRpZmZzdGF0IC1wMQorYW5kCisgJCBnaXQtd2hhdGNoYW5nZWQgcmVsZWFzZSBebGludXMgfCBnaXQtc2hvcnRsb2cKKworCitIZXJlIGFyZSBzb21lIG9mIHRoZSBzY3JpcHRzIHRoYXQgSSB1c2UgdG8gc2ltcGxpZnkgYWxsIHRoaXMgZXZlbiBmdXJ0aGVyLgorCis9PT09IHVwZGF0ZSBzY3JpcHQgPT09PQorIyBVcGRhdGUgYSBicmFuY2ggaW4gbXkgR0lUIHRyZWUuICBJZiB0aGUgYnJhbmNoIHRvIGJlIHVwZGF0ZWQKKyMgaXMgImxpbnVzIiwgdGhlbiBwdWxsIGZyb20ga2VybmVsLm9yZy4gIE90aGVyd2lzZSBtZXJnZSBsb2NhbAorIyBsaW51cyBicmFuY2ggaW50byB0ZXN0fHJlbGVhc2UgYnJhbmNoCisKK2Nhc2UgIiQxIiBpbgordGVzdHxyZWxlYXNlKQorCWdpdCBjaGVja291dCAkMSAmJiBnaXQgbWVyZ2UgIkF1dG8tdXBkYXRlIGZyb20gdXBzdHJlYW0iICQxIGxpbnVzCisJOzsKK2xpbnVzKQorCWJlZm9yZT0kKGNhdCAuZ2l0L3JlZnMvaGVhZHMvbGludXMpCisJZ2l0IGZldGNoIGxpbnVzCisJYWZ0ZXI9JChjYXQgLmdpdC9yZWZzL2hlYWRzL2xpbnVzKQorCWlmIFsgJGJlZm9yZSAhPSAkYWZ0ZXIgXQorCXRoZW4KKwkJZ2l0LXdoYXRjaGFuZ2VkICRhZnRlciBeJGJlZm9yZSB8IGdpdC1zaG9ydGxvZworCWZpCisJOzsKKyopCisJZWNobyAiVXNhZ2U6ICQwIGxpbnVzfHRlc3R8cmVsZWFzZSIgMT4mMgorCWV4aXQgMQorCTs7Citlc2FjCisKKz09PT0gbWVyZ2Ugc2NyaXB0ID09PT0KKyMgTWVyZ2UgYSBicmFuY2ggaW50byBlaXRoZXIgdGhlIHRlc3Qgb3IgcmVsZWFzZSBicmFuY2gKKworcG5hbWU9JDAKKwordXNhZ2UoKQoreworCWVjaG8gIlVzYWdlOiAkcG5hbWUgYnJhbmNoIHRlc3R8cmVsZWFzZSIgMT4mMgorCWV4aXQgMQorfQorCitpZiBbICEgLWYgLmdpdC9yZWZzL2hlYWRzLyIkMSIgXQordGhlbgorCWVjaG8gIkNhbid0IHNlZSBicmFuY2ggPCQxPiIgMT4mMgorCXVzYWdlCitmaQorCitjYXNlICIkMiIgaW4KK3Rlc3R8cmVsZWFzZSkKKwlpZiBbICQoZ2l0LXJldi1saXN0ICQxIF4kMiB8IHdjIC1jKSAtZXEgMCBdCisJdGhlbgorCQllY2hvICQxIGFscmVhZHkgbWVyZ2VkIGludG8gJDIgMT4mMgorCQlleGl0IDEKKwlmaQorCWdpdCBjaGVja291dCAkMiAmJiBnaXQgbWVyZ2UgIlB1bGwgJDEgaW50byAkMiBicmFuY2giICQyICQxCisJOzsKKyopCisJdXNhZ2UKKwk7OworZXNhYworCis9PT09IHN0YXR1cyBzY3JpcHQgPT09PQorIyByZXBvcnQgb24gc3RhdHVzIG9mIG15IGlhNjQgR0lUIHRyZWUKKworZ2I9JCh0cHV0IHNldGFiIDIpCityYj0kKHRwdXQgc2V0YWIgMSkKK3Jlc3RvcmU9JCh0cHV0IHNldGFiIDkpCisKK2lmIFsgYGdpdC1yZXYtbGlzdCByZWxlYXNlIF50ZXN0IHwgd2MgLWNgIC1ndCAwIF0KK3RoZW4KKwllY2hvICRyYiBXYXJuaW5nOiBjb21taXRzIGluIHJlbGVhc2UgdGhhdCBhcmUgbm90IGluIHRlc3QgJHJlc3RvcmUKKwlnaXQtd2hhdGNoYW5nZWQgcmVsZWFzZSBedGVzdAorZmkKKworZm9yIGJyYW5jaCBpbiBgbHMgLmdpdC9yZWZzL2hlYWRzYAorZG8KKwlpZiBbICRicmFuY2ggPSBsaW51cyAtbyAkYnJhbmNoID0gdGVzdCAtbyAkYnJhbmNoID0gcmVsZWFzZSBdCisJdGhlbgorCQljb250aW51ZQorCWZpCisKKwllY2hvIC1uICRnYiA9PT09PT09ICRicmFuY2ggPT09PT09ICRyZXN0b3JlICIgIgorCXN0YXR1cz0KKwlmb3IgcmVmIGluIHRlc3QgcmVsZWFzZSBsaW51cworCWRvCisJCWlmIFsgYGdpdC1yZXYtbGlzdCAkYnJhbmNoIF4kcmVmIHwgd2MgLWNgIC1ndCAwIF0KKwkJdGhlbgorCQkJc3RhdHVzPSRzdGF0dXMke3JlZjowOjF9CisJCWZpCisJZG9uZQorCWNhc2UgJHN0YXR1cyBpbgorCXRybCkKKwkJZWNobyAkcmIgTmVlZCB0byBwdWxsIGludG8gdGVzdCAkcmVzdG9yZQorCQk7OworCXJsKQorCQllY2hvICJJbiB0ZXN0IgorCQk7OworCWwpCisJCWVjaG8gIldhaXRpbmcgZm9yIGxpbnVzIgorCQk7OworCSIiKQorCQllY2hvICRyYiBBbGwgZG9uZSAkcmVzdG9yZQorCQk7OworCSopCisJCWVjaG8gJHJiICI8JHN0YXR1cz4iICRyZXN0b3JlCisJCTs7CisJZXNhYworCWdpdC13aGF0Y2hhbmdlZCAkYnJhbmNoIF5saW51cyB8IGdpdC1zaG9ydGxvZworZG9uZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLXdlYmRvYy5zaCBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC13ZWJkb2Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjAyMTFhNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC13ZWJkb2Muc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisKK1Q9IiQxIgorCitmb3IgaCBpbiAqLmh0bWwgKi50eHQgaG93dG8vKi50eHQgaG93dG8vKi5odG1sCitkbworCWlmIHRlc3QgLWYgIiRULyRoIiAmJgorCSAgIGRpZmYgLXUgLUknTGFzdCB1cGRhdGVkIFswLTldWzAtOV0tW0EtWl1bYS16XVthLXpdLScgIiRULyRoIiAiJGgiCisJdGhlbgorCQk6OyAjIHVwIHRvIGRhdGUKKwllbHNlCisJCWVjaG8gPiYyICIjIGluc3RhbGwgJGggJFQvJGgiCisJCXJtIC1mICIkVC8kaCIKKwkJbWtkaXIgLXAgYGRpcm5hbWUgIiRULyRoImAKKwkJY3AgIiRoIiAiJFQvJGgiCisJZmkKK2RvbmUKK3N0cmlwX2xlYWRpbmc9YGVjaG8gIiRULyIgfCBzZWQgLWUgJ3N8LnwufGcnYAorZm9yIHRoIGluICIkVCIvKi5odG1sICIkVCIvKi50eHQgIiRUIi9ob3d0by8qLnR4dCAiJFQiL2hvd3RvLyouaHRtbAorZG8KKwloPWBleHByICIkdGgiIDogIiRzdHJpcF9sZWFkaW5nIidcKC4qXCknYAorCWNhc2UgIiRoIiBpbgorCWluZGV4Lmh0bWwpIGNvbnRpbnVlIDs7CisJZXNhYworCXRlc3QgLWYgIiRoIiAmJiBjb250aW51ZQorCWVjaG8gPiYyICIjIHJtIC1mICR0aCIKKwlybSAtZiAiJHRoIgorZG9uZQorbG4gLXNmIGdpdC5odG1sICIkVC9pbmRleC5odG1sIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZXJnZS1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbWVyZ2Utb3B0aW9ucy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyY2VmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVyZ2Utb3B0aW9ucy50eHQKQEAgLTAsMCArMSwyNCBAQAorLW4sIFwtLW5vLXN1bW1hcnk6OgorCURvIG5vdCBzaG93IGRpZmZzdGF0IGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlLgorCistLW5vLWNvbW1pdDo6CisJUGVyZm9ybSB0aGUgbWVyZ2UgYnV0IHByZXRlbmQgdGhlIG1lcmdlIGZhaWxlZCBhbmQgZG8KKwlub3QgYXV0b2NvbW1pdCwgdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byBpbnNwZWN0IGFuZAorCWZ1cnRoZXIgdHdlYWsgdGhlIG1lcmdlIHJlc3VsdCBiZWZvcmUgY29tbWl0dGluZy4KKworLS1zcXVhc2g6OgorCVByb2R1Y2UgdGhlIHdvcmtpbmcgdHJlZSBhbmQgaW5kZXggc3RhdGUgYXMgaWYgYSByZWFsCisJbWVyZ2UgaGFwcGVuZWQsIGJ1dCBkbyBub3QgYWN0dWFsbHkgbWFrZSBhIGNvbW1pdCBvcgorCW1vdmUgdGhlIGBIRUFEYCwgbm9yIHJlY29yZCBgJEdJVF9ESVIvTUVSR0VfSEVBRGAgdG8KKwljYXVzZSB0aGUgbmV4dCBgZ2l0IGNvbW1pdGAgY29tbWFuZCB0byBjcmVhdGUgYSBtZXJnZQorCWNvbW1pdC4gIFRoaXMgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBzaW5nbGUgY29tbWl0IG9uCisJdG9wIG9mIHRoZSBjdXJyZW50IGJyYW5jaCB3aG9zZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMKKwltZXJnaW5nIGFub3RoZXIgYnJhbmNoIChvciBtb3JlIGluIGNhc2Ugb2YgYW4gb2N0b3B1cykuCisKKy1zIDxzdHJhdGVneT4sIFwtLXN0cmF0ZWd5PTxzdHJhdGVneT46OgorCVVzZSB0aGUgZ2l2ZW4gbWVyZ2Ugc3RyYXRlZ3k7IGNhbiBiZSBzdXBwbGllZCBtb3JlIHRoYW4KKwlvbmNlIHRvIHNwZWNpZnkgdGhlbSBpbiB0aGUgb3JkZXIgdGhleSBzaG91bGQgYmUgdHJpZWQuCisJSWYgdGhlcmUgaXMgbm8gYC1zYCBvcHRpb24sIGEgYnVpbHQtaW4gbGlzdCBvZiBzdHJhdGVnaWVzCisJaXMgdXNlZCBpbnN0ZWFkIChgZ2l0LW1lcmdlLXJlY3Vyc2l2ZWAgd2hlbiBtZXJnaW5nIGEgc2luZ2xlCisJaGVhZCwgYGdpdC1tZXJnZS1vY3RvcHVzYCBvdGhlcndpc2UpLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lcmdlLXN0cmF0ZWdpZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGYwMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9tZXJnZS1zdHJhdGVnaWVzLnR4dApAQCAtMCwwICsxLDM1IEBACitNRVJHRSBTVFJBVEVHSUVTCistLS0tLS0tLS0tLS0tLS0tCisKK3Jlc29sdmU6OgorCVRoaXMgY2FuIG9ubHkgcmVzb2x2ZSB0d28gaGVhZHMgKGkuZS4gdGhlIGN1cnJlbnQgYnJhbmNoCisJYW5kIGFub3RoZXIgYnJhbmNoIHlvdSBwdWxsZWQgZnJvbSkgdXNpbmcgMy13YXkgbWVyZ2UKKwlhbGdvcml0aG0uICBJdCB0cmllcyB0byBjYXJlZnVsbHkgZGV0ZWN0IGNyaXNzLWNyb3NzCisJbWVyZ2UgYW1iaWd1aXRpZXMgYW5kIGlzIGNvbnNpZGVyZWQgZ2VuZXJhbGx5IHNhZmUgYW5kCisJZmFzdC4KKworcmVjdXJzaXZlOjoKKwlUaGlzIGNhbiBvbmx5IHJlc29sdmUgdHdvIGhlYWRzIHVzaW5nIDMtd2F5IG1lcmdlCisJYWxnb3JpdGhtLiAgV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjb21tb24KKwlhbmNlc3RvcnMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgMy13YXkgbWVyZ2UsIGl0IGNyZWF0ZXMgYQorCW1lcmdlZCB0cmVlIG9mIHRoZSBjb21tb24gYW5jZXN0b3JzIGFuZCB1c2VzIHRoYXQgYXMKKwl0aGUgcmVmZXJlbmNlIHRyZWUgZm9yIHRoZSAzLXdheSBtZXJnZS4gIFRoaXMgaGFzIGJlZW4KKwlyZXBvcnRlZCB0byByZXN1bHQgaW4gZmV3ZXIgbWVyZ2UgY29uZmxpY3RzIHdpdGhvdXQKKwljYXVzaW5nIG1pcy1tZXJnZXMgYnkgdGVzdHMgZG9uZSBvbiBhY3R1YWwgbWVyZ2UgY29tbWl0cworCXRha2VuIGZyb20gTGludXggMi42IGtlcm5lbCBkZXZlbG9wbWVudCBoaXN0b3J5LgorCUFkZGl0aW9uYWxseSB0aGlzIGNhbiBkZXRlY3QgYW5kIGhhbmRsZSBtZXJnZXMgaW52b2x2aW5nCisJcmVuYW1lcy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgd2hlbgorCXB1bGxpbmcgb3IgbWVyZ2luZyBvbmUgYnJhbmNoLgorCitvY3RvcHVzOjoKKwlUaGlzIHJlc29sdmVzIG1vcmUgdGhhbiB0d28taGVhZCBjYXNlLCBidXQgcmVmdXNlcyB0byBkbworCWNvbXBsZXggbWVyZ2UgdGhhdCBuZWVkcyBtYW51YWwgcmVzb2x1dGlvbi4gIEl0IGlzCisJcHJpbWFyaWx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIGJ1bmRsaW5nIHRvcGljIGJyYW5jaAorCWhlYWRzIHRvZ2V0aGVyLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBtZXJnZSBzdHJhdGVneSB3aGVuCisJcHVsbGluZyBvciBtZXJnaW5nIG1vcmUgdGhhbiBvbmUgYnJhbmNoZXMuCisKK291cnM6OgorCVRoaXMgcmVzb2x2ZXMgYW55IG51bWJlciBvZiBoZWFkcywgYnV0IHRoZSByZXN1bHQgb2YgdGhlCisJbWVyZ2UgaXMgYWx3YXlzIHRoZSBjdXJyZW50IGJyYW5jaCBoZWFkLiAgSXQgaXMgbWVhbnQgdG8KKwliZSB1c2VkIHRvIHN1cGVyc2VkZSBvbGQgZGV2ZWxvcG1lbnQgaGlzdG9yeSBvZiBzaWRlCisJYnJhbmNoZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3B1bGwtZmV0Y2gtcGFyYW0udHh0IGIvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODUyZjQxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wdWxsLWZldGNoLXBhcmFtLnR4dApAQCAtMCwwICsxLDY5IEBACis8cmVwb3NpdG9yeT46OgorCVRoZSAicmVtb3RlIiByZXBvc2l0b3J5IHRoYXQgaXMgdGhlIHNvdXJjZSBvZiBhIGZldGNoCisJb3IgcHVsbCBvcGVyYXRpb24uICBTZWUgdGhlIHNlY3Rpb24gPDxVUkxTLEdJVCBVUkxTPj4gYmVsb3cuCisKKzxyZWZzcGVjPjo6CisJVGhlIGNhbm9uaWNhbCBmb3JtYXQgb2YgYSA8cmVmc3BlYz4gcGFyYW1ldGVyIGlzCisJYCs/PHNyYz46PGRzdD5gOyB0aGF0IGlzLCBhbiBvcHRpb25hbCBwbHVzIGArYCwgZm9sbG93ZWQKKwlieSB0aGUgc291cmNlIHJlZiwgZm9sbG93ZWQgYnkgYSBjb2xvbiBgOmAsIGZvbGxvd2VkIGJ5CisJdGhlIGRlc3RpbmF0aW9uIHJlZi4KKysKK1RoZSByZW1vdGUgcmVmIHRoYXQgbWF0Y2hlcyA8c3JjPgoraXMgZmV0Y2hlZCwgYW5kIGlmIDxkc3Q+IGlzIG5vdCBlbXB0eSBzdHJpbmcsIHRoZSBsb2NhbAorcmVmIHRoYXQgbWF0Y2hlcyBpdCBpcyBmYXN0IGZvcndhcmRlZCB1c2luZyA8c3JjPi4KK0FnYWluLCBpZiB0aGUgb3B0aW9uYWwgcGx1cyBgK2AgaXMgdXNlZCwgdGhlIGxvY2FsIHJlZgoraXMgdXBkYXRlZCBldmVuIGlmIGl0IGRvZXMgbm90IHJlc3VsdCBpbiBhIGZhc3QgZm9yd2FyZAordXBkYXRlLgorKworW05PVEVdCitJZiB0aGUgcmVtb3RlIGJyYW5jaCBmcm9tIHdoaWNoIHlvdSB3YW50IHRvIHB1bGwgaXMKK21vZGlmaWVkIGluIG5vbi1saW5lYXIgd2F5cyBzdWNoIGFzIGJlaW5nIHJld291bmQgYW5kCityZWJhc2VkIGZyZXF1ZW50bHksIHRoZW4gYSBwdWxsIHdpbGwgYXR0ZW1wdCBhIG1lcmdlIHdpdGgKK2FuIG9sZGVyIHZlcnNpb24gb2YgaXRzZWxmLCBsaWtlbHkgY29uZmxpY3QsIGFuZCBmYWlsLgorSXQgaXMgdW5kZXIgdGhlc2UgY29uZGl0aW9ucyB0aGF0IHlvdSB3b3VsZCB3YW50IHRvIHVzZQordGhlIGArYCBzaWduIHRvIGluZGljYXRlIG5vbi1mYXN0LWZvcndhcmQgdXBkYXRlcyB3aWxsCitiZSBuZWVkZWQuICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gZWFzeSB3YXkgdG8gZGV0ZXJtaW5lCitvciBkZWNsYXJlIHRoYXQgYSBicmFuY2ggd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBhCityZXBvc2l0b3J5IHdpdGggdGhpcyBiZWhhdmlvcjsgdGhlIHB1bGxpbmcgdXNlciBzaW1wbHkKK211c3Qga25vdyB0aGlzIGlzIHRoZSBleHBlY3RlZCB1c2FnZSBwYXR0ZXJuIGZvciBhIGJyYW5jaC4KKysKK1tOT1RFXQorWW91IG5ldmVyIGRvIHlvdXIgb3duIGRldmVsb3BtZW50IG9uIGJyYW5jaGVzIHRoYXQgYXBwZWFyCitvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIGEgPHJlZnNwZWM+IGNvbG9uIG9uIGBQdWxsOmAgbGluZXM7Cit0aGV5IGFyZSB0byBiZSB1cGRhdGVkIGJ5IGBnaXQtZmV0Y2hgLiAgSWYgeW91IGludGVuZCB0byBkbworZGV2ZWxvcG1lbnQgZGVyaXZlZCBmcm9tIGEgcmVtb3RlIGJyYW5jaCBgQmAsIGhhdmUgYSBgUHVsbDpgCitsaW5lIHRvIHRyYWNrIGl0IChpLmUuIGBQdWxsOiBCOnJlbW90ZS1CYCksIGFuZCBoYXZlIGEgc2VwYXJhdGUKK2JyYW5jaCBgbXktQmAgdG8gZG8geW91ciBkZXZlbG9wbWVudCBvbiB0b3Agb2YgaXQuICBUaGUgbGF0dGVyCitpcyBjcmVhdGVkIGJ5IGBnaXQgYnJhbmNoIG15LUIgcmVtb3RlLUJgIChvciBpdHMgZXF1aXZhbGVudCBgZ2l0CitjaGVja291dCAtYiBteS1CIHJlbW90ZS1CYCkuICBSdW4gYGdpdCBmZXRjaGAgdG8ga2VlcCB0cmFjayBvZgordGhlIHByb2dyZXNzIG9mIHRoZSByZW1vdGUgc2lkZSwgYW5kIHdoZW4geW91IHNlZSBzb21ldGhpbmcgbmV3CitvbiB0aGUgcmVtb3RlIGJyYW5jaCwgbWVyZ2UgaXQgaW50byB5b3VyIGRldmVsb3BtZW50IGJyYW5jaCB3aXRoCitgZ2l0IHB1bGwgLiByZW1vdGUtQmAsIHdoaWxlIHlvdSBhcmUgb24gYG15LUJgIGJyYW5jaC4KK1RoZSBjb21tb24gYFB1bGw6IG1hc3RlcjpvcmlnaW5gIG1hcHBpbmcgb2YgYSByZW1vdGUgYG1hc3RlcmAKK2JyYW5jaCB0byBhIGxvY2FsIGBvcmlnaW5gIGJyYW5jaCwgd2hpY2ggaXMgdGhlbiBtZXJnZWQgdG8gYQorbG9jYWwgZGV2ZWxvcG1lbnQgYnJhbmNoLCBhZ2FpbiB0eXBpY2FsbHkgbmFtZWQgYG1hc3RlcmAsIGlzIG1hZGUKK3doZW4geW91IHJ1biBgZ2l0IGNsb25lYCBmb3IgeW91IHRvIGZvbGxvdyB0aGlzIHBhdHRlcm4uCisrCitbTk9URV0KK1RoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGxpc3RpbmcgbXVsdGlwbGUgPHJlZnNwZWM+CitkaXJlY3RseSBvbiBgZ2l0LXB1bGxgIGNvbW1hbmQgbGluZSBhbmQgaGF2aW5nIG11bHRpcGxlCitgUHVsbDpgIDxyZWZzcGVjPiBsaW5lcyBmb3IgYSA8cmVwb3NpdG9yeT4gYW5kIHJ1bm5pbmcKK2BnaXQtcHVsbGAgY29tbWFuZCB3aXRob3V0IGFueSBleHBsaWNpdCA8cmVmc3BlYz4gcGFyYW1ldGVycy4KKzxyZWZzcGVjPiBsaXN0ZWQgZXhwbGljaXRseSBvbiB0aGUgY29tbWFuZCBsaW5lIGFyZSBhbHdheXMKK21lcmdlZCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaCBhZnRlciBmZXRjaGluZy4gIEluIG90aGVyIHdvcmRzLAoraWYgeW91IGxpc3QgbW9yZSB0aGFuIG9uZSByZW1vdGUgcmVmcywgeW91IHdvdWxkIGJlIG1ha2luZworYW4gT2N0b3B1cy4gIFdoaWxlIGBnaXQtcHVsbGAgcnVuIHdpdGhvdXQgYW55IGV4cGxpY2l0IDxyZWZzcGVjPgorcGFyYW1ldGVyIHRha2VzIGRlZmF1bHQgPHJlZnNwZWM+cyBmcm9tIGBQdWxsOmAgbGluZXMsIGl0CittZXJnZXMgb25seSB0aGUgZmlyc3QgPHJlZnNwZWM+IGZvdW5kIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLAorYWZ0ZXIgZmV0Y2hpbmcgYWxsIHRoZSByZW1vdGUgcmVmcy4gIFRoaXMgaXMgYmVjYXVzZSBtYWtpbmcgYW4KK09jdG9wdXMgZnJvbSByZW1vdGUgcmVmcyBpcyByYXJlbHkgZG9uZSwgd2hpbGUga2VlcGluZyB0cmFjaworb2YgbXVsdGlwbGUgcmVtb3RlIGhlYWRzIGluIG9uZS1nbyBieSBmZXRjaGluZyBtb3JlIHRoYW4gb25lCitpcyBvZnRlbiB1c2VmdWwuCisrCitTb21lIHNob3J0LWN1dCBub3RhdGlvbnMgYXJlIGFsc28gc3VwcG9ydGVkLgorKworKiBgdGFnIDx0YWc+YCBtZWFucyB0aGUgc2FtZSBhcyBgcmVmcy90YWdzLzx0YWc+OnJlZnMvdGFncy88dGFnPmA7IAorICBpdCByZXF1ZXN0cyBmZXRjaGluZyBldmVyeXRoaW5nIHVwIHRvIHRoZSBnaXZlbiB0YWcuCisqIEEgcGFyYW1ldGVyIDxyZWY+IHdpdGhvdXQgYSBjb2xvbiBpcyBlcXVpdmFsZW50IHRvCisgIDxyZWY+OiB3aGVuIHB1bGxpbmcvZmV0Y2hpbmcsIHNvIGl0IG1lcmdlcyA8cmVmPiBpbnRvIHRoZSBjdXJyZW50CisgIGJyYW5jaCB3aXRob3V0IHN0b3JpbmcgdGhlIHJlbW90ZSBicmFuY2ggYW55d2hlcmUgbG9jYWxseQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQgYi9Eb2N1bWVudGF0aW9uL3JlcG9zaXRvcnktbGF5b3V0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzVkMThiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9yZXBvc2l0b3J5LWxheW91dC50eHQKQEAgLTAsMCArMSwxNDMgQEAKK2dpdCByZXBvc2l0b3J5IGxheW91dAorPT09PT09PT09PT09PT09PT09PT09CisKK1lvdSBtYXkgZmluZCB0aGVzZSB0aGluZ3MgaW4geW91ciBnaXQgcmVwb3NpdG9yeSAoYC5naXRgCitkaXJlY3RvcnkgZm9yIGEgcmVwb3NpdG9yeSBhc3NvY2lhdGVkIHdpdGggeW91ciB3b3JraW5nIHRyZWUsIG9yCitgJ3Byb2plY3QnLmdpdGAgZGlyZWN0b3J5IGZvciBhIHB1YmxpYyAnYmFyZScgcmVwb3NpdG9yeSkuCisKK29iamVjdHM6OgorCU9iamVjdCBzdG9yZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LiAgVXN1YWxseQorCWFuIG9iamVjdCBzdG9yZSBpcyBzZWxmIHN1ZmZpY2llbnQgKGkuZS4gYWxsIHRoZSBvYmplY3RzCisJdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkgYW4gb2JqZWN0IGZvdW5kIGluIGl0IGFyZSBhbHNvCisJZm91bmQgaW4gaXQpLCBidXQgdGhlcmUgYXJlIGNvdXBsZSBvZiB3YXlzIHRvIHZpb2xhdGUKKwlpdC4KKysKKy4gWW91IGNvdWxkIHBvcHVsYXRlIHRoZSByZXBvc2l0b3J5IGJ5IHJ1bm5pbmcgYSBjb21taXQgd2Fsa2VyCit3aXRob3V0IGAtYWAgb3B0aW9uLiAgRGVwZW5kaW5nIG9uIHdoaWNoIG9wdGlvbnMgYXJlIGdpdmVuLCB5b3UKK2NvdWxkIGhhdmUgb25seSBjb21taXQgb2JqZWN0cyB3aXRob3V0IGFzc29jaWF0ZWQgYmxvYnMgYW5kCit0cmVlcyB0aGlzIHdheSwgZm9yIGV4YW1wbGUuICBBIHJlcG9zaXRvcnkgd2l0aCB0aGlzIGtpbmQgb2YKK2luY29tcGxldGUgb2JqZWN0IHN0b3JlIGlzIG5vdCBzdWl0YWJsZSB0byBiZSBwdWJsaXNoZWQgdG8gdGhlCitvdXRzaWRlIHdvcmxkIGJ1dCBzb21ldGltZXMgdXNlZnVsIGZvciBwcml2YXRlIHJlcG9zaXRvcnkuCisuIFlvdSBjYW4gYmUgdXNpbmcgYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBtZWNoYW5pc20sIG9yCitgJEdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTYCBtZWNoYW5pc20gdG8gJ2JvcnJvdycKK29iamVjdHMgZnJvbSBvdGhlciBvYmplY3Qgc3RvcmVzLiAgQSByZXBvc2l0b3J5IHdpdGggdGhpcyBraW5kCitvZiBpbmNvbXBsZXRlIG9iamVjdCBzdG9yZSBpcyBub3Qgc3VpdGFibGUgdG8gYmUgcHVibGlzaGVkIGZvcgordXNlIHdpdGggZHVtYiB0cmFuc3BvcnRzIGJ1dCBvdGhlcndpc2UgaXMgT0sgYXMgbG9uZyBhcworYG9iamVjdHMvaW5mby9hbHRlcm5hdGVzYCBwb2ludHMgYXQgdGhlIHJpZ2h0IG9iamVjdCBzdG9yZXMKK2l0IGJvcnJvd3MgZnJvbS4KKworb2JqZWN0cy9bMC05YS1mXVswLTlhLWZdOjoKKwlUcmFkaXRpb25hbGx5LCBlYWNoIG9iamVjdCBpcyBzdG9yZWQgaW4gaXRzIG93biBmaWxlLgorCVRoZXkgYXJlIHNwbGl0IGludG8gMjU2IHN1YmRpcmVjdG9yaWVzIHVzaW5nIHRoZSBmaXJzdAorCXR3byBsZXR0ZXJzIGZyb20gaXRzIG9iamVjdCBuYW1lIHRvIGtlZXAgdGhlIG51bWJlciBvZgorCWRpcmVjdG9yeSBlbnRyaWVzIGBvYmplY3RzYCBkaXJlY3RvcnkgaXRzZWxmIG5lZWRzIHRvCisJaG9sZC4gIE9iamVjdHMgZm91bmQgaGVyZSBhcmUgb2Z0ZW4gY2FsbGVkICd1bnBhY2tlZCcKKwlvYmplY3RzLgorCitvYmplY3RzL3BhY2s6OgorCVBhY2tzIChmaWxlcyB0aGF0IHN0b3JlIG1hbnkgb2JqZWN0IGluIGNvbXByZXNzZWQgZm9ybSwKKwlhbG9uZyB3aXRoIGluZGV4IGZpbGVzIHRvIGFsbG93IHRoZW0gdG8gYmUgcmFuZG9tbHkKKwlhY2Nlc3NlZCkgYXJlIGZvdW5kIGluIHRoaXMgZGlyZWN0b3J5LgorCitvYmplY3RzL2luZm86OgorCUFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBzdG9yZSBpcworCXJlY29yZGVkIGluIHRoaXMgZGlyZWN0b3J5LgorCitvYmplY3RzL2luZm8vcGFja3M6OgorCVRoaXMgZmlsZSBpcyB0byBoZWxwIGR1bWIgdHJhbnNwb3J0cyBkaXNjb3ZlciB3aGF0IHBhY2tzCisJYXJlIGF2YWlsYWJsZSBpbiB0aGlzIG9iamVjdCBzdG9yZS4gIFdoZW5ldmVyIGEgcGFjayBpcworCWFkZGVkIG9yIHJlbW92ZWQsIGBnaXQgdXBkYXRlLXNlcnZlci1pbmZvYCBzaG91bGQgYmUgcnVuCisJdG8ga2VlcCB0aGlzIGZpbGUgdXAtdG8tZGF0ZSBpZiB0aGUgcmVwb3NpdG9yeSBpcworCXB1Ymxpc2hlZCBmb3IgZHVtYiB0cmFuc3BvcnRzLiAgYGdpdCByZXBhY2tgIGRvZXMgdGhpcworCWJ5IGRlZmF1bHQuCisKK29iamVjdHMvaW5mby9hbHRlcm5hdGVzOjoKKwlUaGlzIGZpbGUgcmVjb3JkcyBhYnNvbHV0ZSBmaWxlc3lzdGVtIHBhdGhzIG9mIGFsdGVybmF0ZQorCW9iamVjdCBzdG9yZXMgdGhhdCB0aGlzIG9iamVjdCBzdG9yZSBib3Jyb3dzIG9iamVjdHMKKwlmcm9tLCBvbmUgcGF0aG5hbWUgcGVyIGxpbmUuCisKK3JlZnM6OgorCVJlZmVyZW5jZXMgYXJlIHN0b3JlZCBpbiBzdWJkaXJlY3RvcmllcyBvZiB0aGlzCisJZGlyZWN0b3J5LiAgVGhlIGBnaXQgcHJ1bmVgIGNvbW1hbmQga25vd3MgdG8ga2VlcAorCW9iamVjdHMgcmVhY2hhYmxlIGZyb20gcmVmcyBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSBhbmQKKwlpdHMgc3ViZGlyZWN0b3JpZXMuCisKK3JlZnMvaGVhZHMvYG5hbWVgOjoKKwlyZWNvcmRzIHRpcC1vZi10aGUtdHJlZSBjb21taXQgb2JqZWN0cyBvZiBicmFuY2ggYG5hbWVgCisKK3JlZnMvdGFncy9gbmFtZWA6OgorCXJlY29yZHMgYW55IG9iamVjdCBuYW1lIChub3QgbmVjZXNzYXJpbHkgYSBjb21taXQKKwlvYmplY3QsIG9yIGEgdGFnIG9iamVjdCB0aGF0IHBvaW50cyBhdCBhIGNvbW1pdCBvYmplY3QpLgorCitIRUFEOjoKKwlBIHN5bWxpbmsgb2YgdGhlIGZvcm0gYHJlZnMvaGVhZHMvJ25hbWUnYCB0byBwb2ludCBhdAorCXRoZSBjdXJyZW50IGJyYW5jaCwgaWYgZXhpc3RzLiAgSXQgZG9lcyBub3QgbWVhbiBtdWNoIGlmCisJdGhlIHJlcG9zaXRvcnkgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgd29ya2luZyB0cmVlCisJKGkuZS4gYSAnYmFyZScgcmVwb3NpdG9yeSksIGJ1dCBhIHZhbGlkIGdpdCByZXBvc2l0b3J5CisJKm11c3QqIGhhdmUgc3VjaCBhIHN5bWxpbmsgaGVyZS4gIEl0IGlzIGxlZ2FsIGlmIHRoZQorCW5hbWVkIGJyYW5jaCAnbmFtZScgZG9lcyBub3QgKHlldCkgZXhpc3QuCisKK2JyYW5jaGVzOjoKKwlBIHNsaWdodGx5IGRlcHJlY2F0ZWQgd2F5IHRvIHN0b3JlIHNob3J0aGFuZHMgdG8gYmUgdXNlZAorCXRvIHNwZWNpZnkgVVJMIHRvIGBnaXQgZmV0Y2hgLCBgZ2l0IHB1bGxgIGFuZCBgZ2l0IHB1c2hgCisJY29tbWFuZHMgaXMgdG8gc3RvcmUgYSBmaWxlIGluIGBicmFuY2hlcy8nbmFtZSdgIGFuZAorCWdpdmUgJ25hbWUnIHRvIHRoZXNlIGNvbW1hbmRzIGluIHBsYWNlIG9mICdyZXBvc2l0b3J5JworCWFyZ3VtZW50LgorCitob29rczo6CisJSG9va3MgYXJlIGN1c3RvbWl6YXRpb24gc2NyaXB0cyB1c2VkIGJ5IHZhcmlvdXMgZ2l0CisJY29tbWFuZHMuICBBIGhhbmRmdWwgb2Ygc2FtcGxlIGhvb2tzIGFyZSBpbnN0YWxsZWQgd2hlbgorCWBnaXQgaW5pdC1kYmAgaXMgcnVuLCBidXQgYWxsIG9mIHRoZW0gYXJlIGRpc2FibGVkIGJ5CisJZGVmYXVsdC4gIFRvIGVuYWJsZSwgdGhleSBuZWVkIHRvIGJlIG1hZGUgZXhlY3V0YWJsZS4KKwlSZWFkIGxpbms6aG9va3MuaHRtbFtob29rc10gZm9yIG1vcmUgZGV0YWlscyBhYm91dAorCWVhY2ggaG9vay4KKworaW5kZXg6OgorCVRoZSBjdXJyZW50IGluZGV4IGZpbGUgZm9yIHRoZSByZXBvc2l0b3J5LiAgSXQgaXMKKwl1c3VhbGx5IG5vdCBmb3VuZCBpbiBhIGJhcmUgcmVwb3NpdG9yeS4KKworaW5mbzo6CisJQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVwb3NpdG9yeSBpcyByZWNvcmRlZAorCWluIHRoaXMgZGlyZWN0b3J5LgorCitpbmZvL3JlZnM6OgorCVRoaXMgZmlsZSBpcyB0byBoZWxwIGR1bWIgdHJhbnNwb3J0cyB0byBkaXNjb3ZlciB3aGF0CisJcmVmcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgcmVwb3NpdG9yeS4gIFdoZW5ldmVyIHlvdQorCWNyZWF0ZS9kZWxldGUgYSBuZXcgYnJhbmNoIG9yIGEgbmV3IHRhZywgYGdpdAorCXVwZGF0ZS1zZXJ2ZXItaW5mb2Agc2hvdWxkIGJlIHJ1biB0byBrZWVwIHRoaXMgZmlsZQorCXVwLXRvLWRhdGUgaWYgdGhlIHJlcG9zaXRvcnkgaXMgcHVibGlzaGVkIGZvciBkdW1iCisJdHJhbnNwb3J0cy4gIFRoZSBgZ2l0LXJlY2VpdmUtcGFja2AgY29tbWFuZCwgd2hpY2ggaXMKKwlydW4gb24gYSByZW1vdGUgcmVwb3NpdG9yeSB3aGVuIHlvdSBgZ2l0IHB1c2hgIGludG8gaXQsCisJcnVucyBgaG9va3MvdXBkYXRlYCBob29rIHRvIGhlbHAgeW91IGFjaGlldmUgdGhpcy4KKworaW5mby9ncmFmdHM6OgorCVRoaXMgZmlsZSByZWNvcmRzIGZha2UgY29tbWl0IGFuY2VzdHJ5IGluZm9ybWF0aW9uLCB0bworCXByZXRlbmQgdGhlIHNldCBvZiBwYXJlbnRzIGEgY29tbWl0IGhhcyBpcyBkaWZmZXJlbnQKKwlmcm9tIGhvdyB0aGUgY29tbWl0IHdhcyBhY3R1YWxseSBjcmVhdGVkLiAgT25lIHJlY29yZAorCXBlciBsaW5lIGRlc2NyaWJlcyBhIGNvbW1pdCBhbmQgaXRzIGZha2UgcGFyZW50cyBieQorCWxpc3RpbmcgdGhlaXIgNDAtYnl0ZSBoZXhhZGVjaW1hbCBvYmplY3QgbmFtZXMgc2VwYXJhdGVkCisJYnkgYSBzcGFjZSBhbmQgdGVybWluYXRlZCBieSBhIG5ld2xpbmUuCisKK2luZm8vZXhjbHVkZTo6CisJVGhpcyBmaWxlLCBieSBjb252ZW50aW9uIGFtb25nIFBvcmNlbGFpbnMsIHN0b3JlcyB0aGUKKwlleGNsdWRlIHBhdHRlcm4gbGlzdC4gYC5naXRpZ25vcmVgIGlzIHRoZSBwZXItZGlyZWN0b3J5CisJaWdub3JlIGZpbGUuICBgZ2l0IHN0YXR1c2AsIGBnaXQgYWRkYCwgYGdpdCBybWAgYW5kIGBnaXQKKwljbGVhbmAgbG9vayBhdCBpdCBidXQgdGhlIGNvcmUgZ2l0IGNvbW1hbmRzIGRvIG5vdCBsb29rCisJYXQgaXQuICBTZWUgYWxzbzogZ2l0bGluazpnaXQtbHMtZmlsZXNbMV0gYC0tZXhjbHVkZS1mcm9tYAorCWFuZCBgLS1leGNsdWRlLXBlci1kaXJlY3RvcnlgLgorCityZW1vdGVzOjoKKwlTdG9yZXMgc2hvcnRoYW5kcyB0byBiZSB1c2VkIHRvIGdpdmUgVVJMIGFuZCBkZWZhdWx0CisJcmVmbmFtZXMgdG8gaW50ZXJhY3Qgd2l0aCByZW1vdGUgcmVwb3NpdG9yeSB0byBgZ2l0CisJZmV0Y2hgLCBgZ2l0IHB1bGxgIGFuZCBgZ2l0IHB1c2hgIGNvbW1hbmRzLgorCitsb2dzOjoKKwlSZWNvcmRzIG9mIGNoYW5nZXMgbWFkZSB0byByZWZzIGFyZSBzdG9yZWQgaW4gdGhpcworCWRpcmVjdG9yeS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiBnaXQtdXBkYXRlLXJlZgorCWZvciBtb3JlIGluZm9ybWF0aW9uLgorCitsb2dzL3JlZnMvaGVhZHMvYG5hbWVgOjoKKwlSZWNvcmRzIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhlIGJyYW5jaCB0aXAgbmFtZWQgYG5hbWVgLgorCitsb2dzL3JlZnMvdGFncy9gbmFtZWA6OgorCVJlY29yZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgdGFnIG5hbWVkIGBuYW1lYC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc29ydF9nbG9zc2FyeS5wbCBiL0RvY3VtZW50YXRpb24vc29ydF9nbG9zc2FyeS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJjNTUyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3J0X2dsb3NzYXJ5LnBsCkBAIC0wLDAgKzEsNjkgQEAKKyMhL3Vzci9iaW4vcGVybAorCisldGVybXM9KCk7CisKK3doaWxlKDw+KSB7CisJaWYoL14oXFMuKik6OiQvKSB7CisJCW15ICR0ZXJtPSQxOworCQlpZihkZWZpbmVkKCR0ZXJtc3skdGVybX0pKSB7CisJCQlkaWUgIiQxIGRlZmluZWQgdHdpY2VcbiI7CisJCX0KKwkJJHRlcm1zeyR0ZXJtfT0iIjsKKwkJTE9PUDogd2hpbGUoPD4pIHsKKwkJCWlmKC9eJC8pIHsKKwkJCQlsYXN0IExPT1A7CisJCQl9CisJCQlpZigvXglcUy8pIHsKKwkJCQkkdGVybXN7JHRlcm19Lj0kXzsKKwkJCX0gZWxzZSB7CisJCQkJZGllICJFcnJvciAxOiAkXyI7CisJCQl9CisJCX0KKwl9Cit9CisKK3N1YiBmb3JtYXRfdGFiXzgwICgkKSB7CisJbXkgJHRleHQ9JF9bMF07CisJbXkgJHJlc3VsdD0iIjsKKwkkdGV4dD1+cy9ccysvIC9nOworCSR0ZXh0PX5zL15ccysvLzsKKwl3aGlsZSgkdGV4dD1+L14oLnsxLDcyfSkofFxzKyhcUy4qKT8pJC8pIHsKKwkJJHJlc3VsdC49IgkiLiQxLiJcbiI7CisJCSR0ZXh0PSQzOworCX0KKwlyZXR1cm4gJHJlc3VsdDsKK30KKworc3ViIG5vX3NwYWNlcyAoJCkgeworCW15ICRyZXN1bHQ9JF9bMF07CisJJHJlc3VsdD1+dHIvIC9fLzsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworcHJpbnQgJ0dJVCBHbG9zc2FyeQorPT09PT09PT09PT09CisKK1RoaXMgbGlzdCBpcyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHk6CisKKyc7CisKK0BrZXlzPXNvcnQge3VjKCRhKSBjbXAgdWMoJGIpfSBrZXlzICV0ZXJtczsKKyRwYXR0ZXJuPScoXGIoPzwhbGluazpnaXQtKScuam9pbignXGJ8XGIoPzwhbGluazpnaXQtKScscmV2ZXJzZSBAa2V5cykuJ1xiKSc7Citmb3JlYWNoICRrZXkgKEBrZXlzKSB7CisJJHRlcm1zeyRrZXl9PX5zLyRwYXR0ZXJuL3NwcmludGYgIjw8cmVmXyIubm9fc3BhY2VzKCQxKS4iLCQxPj4iOy9lZzsKKwlwcmludCAnW1tyZWZfJy5ub19zcGFjZXMoJGtleSkuJ11dJy4ka2V5LiI6OlxuIgorCQkuZm9ybWF0X3RhYl84MCgkdGVybXN7JGtleX0pLiJcbiI7Cit9CisKK3ByaW50ICcKKworQXV0aG9yCistLS0tLS0KK1dyaXR0ZW4gYnkgSm9oYW5uZXMgU2NoaW5kZWxpbiA8Sm9oYW5uZXMuU2NoaW5kZWxpbkBnbXguZGU+IGFuZAordGhlIGdpdC1saXN0IDxnaXRAdmdlci5rZXJuZWwub3JnPi4KKworR0lUCistLS0KK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorJzsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1mb3JtYXQudHh0IGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1mb3JtYXQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWZmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWZvcm1hdC50eHQKQEAgLTAsMCArMSwxMTYgQEAKK0dJVCBwYWNrIGZvcm1hdAorPT09PT09PT09PT09PT09CisKKz0gcGFjay0qLnBhY2sgZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgIC0gVGhlIGhlYWRlciBhcHBlYXJzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgNC1ieXRlIHNpZ25hdHVyZToKKyAgICAgICAgIFRoZSBzaWduYXR1cmUgaXM6IHsnUCcsICdBJywgJ0MnLCAnSyd9CisKKyAgICAgNC1ieXRlIHZlcnNpb24gbnVtYmVyIChuZXR3b3JrIGJ5dGUgb3JkZXIpOgorICAgICAgICAgR0lUIGN1cnJlbnRseSBhY2NlcHRzIHZlcnNpb24gbnVtYmVyIDIgb3IgMyBidXQKKyAgICAgICAgIGdlbmVyYXRlcyB2ZXJzaW9uIDIgb25seS4KKworICAgICA0LWJ5dGUgbnVtYmVyIG9mIG9iamVjdHMgY29udGFpbmVkIGluIHRoZSBwYWNrIChuZXR3b3JrIGJ5dGUgb3JkZXIpCisKKyAgICAgT2JzZXJ2YXRpb246IHdlIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiA0RyB2ZXJzaW9ucyA7LSkgYW5kCisgICAgIG1vcmUgdGhhbiA0RyBvYmplY3RzIGluIGEgcGFjay4KKworICAgLSBUaGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IG51bWJlciBvZiBvYmplY3QgZW50cmllcywgZWFjaCBvZgorICAgICB3aGljaCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICAgKHVuZGVsdGlmaWVkIHJlcHJlc2VudGF0aW9uKQorICAgICBuLWJ5dGUgdHlwZSBhbmQgbGVuZ3RoICg0LWJpdCB0eXBlLCAobi0xKSo3KzQtYml0IGxlbmd0aCkKKyAgICAgY29tcHJlc3NlZCBkYXRhCisKKyAgICAgKGRlbHRpZmllZCByZXByZXNlbnRhdGlvbikKKyAgICAgbi1ieXRlIHR5cGUgYW5kIGxlbmd0aCAoNC1iaXQgdHlwZSwgKG4tMSkqNys0LWJpdCBsZW5ndGgpCisgICAgIDIwLWJ5dGUgYmFzZSBvYmplY3QgbmFtZQorICAgICBjb21wcmVzc2VkIGRlbHRhIGRhdGEKKworICAgICBPYnNlcnZhdGlvbjogbGVuZ3RoIG9mIGVhY2ggb2JqZWN0IGlzIGVuY29kZWQgaW4gYSB2YXJpYWJsZQorICAgICBsZW5ndGggZm9ybWF0IGFuZCBpcyBub3QgY29uc3RyYWluZWQgdG8gMzItYml0IG9yIGFueXRoaW5nLgorCisgIC0gVGhlIHRyYWlsZXIgcmVjb3JkcyAyMC1ieXRlIFNIQTEgY2hlY2tzdW0gb2YgYWxsIG9mIHRoZSBhYm92ZS4KKworPSBwYWNrLSouaWR4IGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgIC0gVGhlIGhlYWRlciBjb25zaXN0cyBvZiAyNTYgNC1ieXRlIG5ldHdvcmsgYnl0ZSBvcmRlcgorICAgIGludGVnZXJzLiAgTi10aCBlbnRyeSBvZiB0aGlzIHRhYmxlIHJlY29yZHMgdGhlIG51bWJlciBvZgorICAgIG9iamVjdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcGFjaywgdGhlIGZpcnN0IGJ5dGUgb2Ygd2hvc2UKKyAgICBvYmplY3QgbmFtZSBhcmUgc21hbGxlciB0aGFuIE4uICBUaGlzIGlzIGNhbGxlZCB0aGUKKyAgICAnZmlyc3QtbGV2ZWwgZmFuLW91dCcgdGFibGUuCisKKyAgICBPYnNlcnZhdGlvbjogd2Ugd291bGQgbmVlZCB0byBleHRlbmQgdGhpcyB0byBhbiBhcnJheSBvZgorICAgIDgtYnl0ZSBpbnRlZ2VycyB0byBnbyBiZXlvbmQgNEcgb2JqZWN0cyBwZXIgcGFjaywgYnV0IGl0IGlzCisgICAgbm90IHN0cmljdGx5IG5lY2Vzc2FyeS4KKworICAtIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgc29ydGVkIDI0LWJ5dGUgZW50cmllcywgb25lIGVudHJ5CisgICAgcGVyIG9iamVjdCBpbiB0aGUgcGFjay4gIEVhY2ggZW50cnkgaXM6CisKKyAgICA0LWJ5dGUgbmV0d29yayBieXRlIG9yZGVyIGludGVnZXIsIHJlY29yZGluZyB3aGVyZSB0aGUKKyAgICBvYmplY3QgaXMgc3RvcmVkIGluIHRoZSBwYWNrZmlsZSBhcyB0aGUgb2Zmc2V0IGZyb20gdGhlCisgICAgYmVnaW5uaW5nLgorCisgICAgMjAtYnl0ZSBvYmplY3QgbmFtZS4KKworICAgIE9ic2VydmF0aW9uOiB3ZSB3b3VsZCBkZWZpbml0ZWx5IG5lZWQgdG8gZXh0ZW5kIHRoaXMgdG8KKyAgICA4LWJ5dGUgaW50ZWdlciBwbHVzIDIwLWJ5dGUgb2JqZWN0IG5hbWUgdG8gaGFuZGxlIGEgcGFja2ZpbGUKKyAgICB0aGF0IGlzIGxhcmdlciB0aGFuIDRHQi4KKworICAtIFRoZSBmaWxlIGlzIGNvbmNsdWRlZCB3aXRoIGEgdHJhaWxlcjoKKworICAgIEEgY29weSBvZiB0aGUgMjAtYnl0ZSBTSEExIGNoZWNrc3VtIGF0IHRoZSBlbmQgb2YKKyAgICBjb3JyZXNwb25kaW5nIHBhY2tmaWxlLgorCisgICAgMjAtYnl0ZSBTSEExLWNoZWNrc3VtIG9mIGFsbCBvZiB0aGUgYWJvdmUuCisKK1BhY2sgSWR4IGZpbGU6CisKKwlpZHgKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgICB8IGZhbm91dFswXSA9IDIgICAgICAgICAgICAgICAgICB8LS4KKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8CisJICAgIHwgZmFub3V0WzFdICAgICAgICAgICAgICAgICAgICAgIHwgfAorCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwKKwkgICAgfCBmYW5vdXRbMl0gICAgICAgICAgICAgICAgICAgICAgfCB8CisJICAgIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gfAorCSAgICB8IGZhbm91dFsyNTVdICAgICAgICAgICAgICAgICAgICB8IHwKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8CittYWluCSAgICB8IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKK2luZGV4CSAgICB8IG9iamVjdCBuYW1lIDAwWFhYWFhYWFhYWFhYWFhYWCB8IHwKK3RhYmxlCSAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIHwgCisJICAgIHwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorCSAgICB8IG9iamVjdCBuYW1lIDAwWFhYWFhYWFhYWFhYWFhYWCB8IHwKKwkgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyB8CisJICAuLXwgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgIHw8KworCSAgfCB8IG9iamVjdCBuYW1lIDAxWFhYWFhYWFhYWFhYWFhYWCB8CisJICB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwkgIHwgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAgfCB8IG9iamVjdCBuYW1lIDAxWFhYWFhYWFhYWFhYWFhYWCB8CisJICB8IH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKwkgIHwgfCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfAorCSAgfCB8IG9iamVjdCBuYW1lIEZGWFhYWFhYWFhYWFhYWFhYWCB8CisJICB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKK3RyYWlsZXIJICB8IHwgcGFja2ZpbGUgY2hlY2tzdW0gICAgICAgICAgICAgIHwKKwkgIHwgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCSAgfCB8IGlkeGZpbGUgY2hlY2tzdW0gICAgICAgICAgICAgICB8CisJICB8ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAuLS0tLS0tLS4gICAgICAKKyAgICAgICAgICAgICAgICAgIHwKK1BhY2sgZmlsZSBlbnRyeTogPCsKKworICAgICBwYWNrZWQgb2JqZWN0IGhlYWRlcjoKKwkxLWJ5dGUgdHlwZSAodXBwZXIgNC1iaXQpCisJICAgICAgIHNpemUwIChsb3dlciA0LWJpdCkgCisgICAgICAgIG4tYnl0ZSBzaXplTiAoYXMgbG9uZyBhcyBNU0IgaXMgc2V0LCBlYWNoIDctYml0KQorCQlzaXplMC4uc2l6ZU4gZm9ybSA0KzcrNysuLis3IGJpdCBpbnRlZ2VyLCBzaXplMAorCQlpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0LgorICAgICBwYWNrZWQgb2JqZWN0IGRhdGE6CisgICAgICAgIElmIGl0IGlzIG5vdCBERUxUQSwgdGhlbiBkZWZsYXRlZCBieXRlcyAodGhlIHNpemUgYWJvdmUKKwkJaXMgdGhlIHNpemUgYmVmb3JlIGNvbXByZXNzaW9uKS4KKwlJZiBpdCBpcyBERUxUQSwgdGhlbgorCSAgMjAtYnl0ZSBiYXNlIG9iamVjdCBuYW1lIFNIQTEgKHRoZSBzaXplIGFib3ZlIGlzIHRoZQorCSAgCXNpemUgb2YgdGhlIGRlbHRhIGRhdGEgdGhhdCBmb2xsb3dzKS4KKyAgICAgICAgICBkZWx0YSBkYXRhLCBkZWZsYXRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3BhY2staGV1cmlzdGljcy50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWhldXJpc3RpY3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwM2ViNWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLWhldXJpc3RpY3MudHh0CkBAIC0wLDAgKzEsNDY2IEBACisgICAgICAgIENvbmNlcm5pbmcgR2l0J3MgUGFja2luZyBIZXVyaXN0aWNzCisgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgT2gsIGhlcmUncyBhIHJlYWxseSBzdHVwaWQgcXVlc3Rpb246CisKKyAgICAgICAgICAgICAgICAgIFdoZXJlIGRvIEkgZ28KKyAgICAgICAgICAgICAgIHRvIGxlYXJuIHRoZSBkZXRhaWxzCisJICAgIG9mIGdpdCdzIHBhY2tpbmcgaGV1cmlzdGljcz8KKworQmUgY2FyZWZ1bCB3aGF0IHlvdSBhc2shCisKK0ZvbGxvd2VycyBvZiB0aGUgZ2l0LCBwbGVhc2Ugb3BlbiB0aGUgZ2l0IElSQyBMb2cgYW5kIHR1cm4gdG8KK0ZlYnJ1YXJ5IDEwLCAyMDA2LgorCitJdCdzIGEgcmFyZSBvY2Nhc2lvbiwgYW5kIHdlIGFyZSBqb2luZWQgYnkgdGhlIEtpbmcgR2l0IEhpbXNlbGYsCitMaW51cyBUb3J2YWxkcyAobGludXMpLiAgTmF0aGFuaWVsIFNtaXRoLCAobmpzYCksIGhhcyB0aGUgZmxvb3IKK2FuZCBzZWVrcyBlbmxpZ2h0ZW5tZW50LiAgT3RoZXJzIGFyZSBwcmVzZW50LCBidXQgc2lsZW50LgorCitMZXQncyBsaXN0ZW4gaW4hCisKKyAgICA8bmpzYD4gT2gsIGhlcmUncyBhIHJlYWxseSBzdHVwaWQgcXVlc3Rpb24gLS0gd2hlcmUgZG8gSSBnbyB0bworICAgICAgICBsZWFybiB0aGUgZGV0YWlscyBvZiBnaXQncyBwYWNraW5nIGhldXJpc3RpY3M/ICBnb29nbGUgYXZhaWxzCisgICAgICAgIG1lIG5vdCwgcmVhZGluZyB0aGUgc291cmNlIGRpZG4ndCBoZWxwIGEgbG90LCBhbmQgd2FkaW5nCisgICAgICAgIHRocm91Z2ggdGhlIHdob2xlIG1haWxpbmcgbGlzdCBzZWVtcyBsZXNzIGVmZmljaWVudCB0aGFuIGFueQorICAgICAgICBvZiB0aGF0LgorCitJdCBpcyBhIGJvbGQgc3RhcnQhICBBIHBsZWEgZm9yIGhlbHAgY29tYmluZWQgd2l0aCBhIHNpbXVsdGFuZW91cwordHJpLXBhcnQgYXR0YWNrIG9uIHNvbWUgb2YgdGhlIHRyaWVkIGFuZCB0cnVlIG1haW5zdGF5cyBpbiB0aGUgcXVlc3QKK2ZvciBlbmxpZ2h0ZW5tZW50LiAgQnJhc2ggYWNjdXNhdGlvbnMgb2YgZ29vZ2xlIGJlaW5nIHVzZWxlc3MuIEh1YnJpcyEKK01hbGlnbmluZyB0aGUgc291cmNlLiAgSGVyZXN5ISAgRGlzZGFpbiBmb3IgdGhlIG1haWxpbmcgbGlzdCBhcmNoaXZlcy4KK1dvZS4KKworICAgIDxwYXNreT4geWVzLCB0aGUgcGFja2luZy1yZWxhdGVkIGRlbHRhIHN0dWZmIGlzIHNvbWV3aGF0CisgICAgICAgIG15c3RlcmlvdXMgZXZlbiBmb3IgbWUgOykKKworQWghICBNb2Rlc3R5IGFmdGVyIGFsbC4KKworICAgIDxsaW51cz4gbmpzLCBJIGRvbid0IHRoaW5rIHRoZSBkb2NzIGV4aXN0LiBUaGF0J3Mgc29tZXRoaW5nIHdoZXJlCisJIEkgZG9uJ3QgdGhpbmsgYW55Ym9keSBlbHNlIHRoYW4gbWUgZXZlbiByZWFsbHkgZ290IGludm9sdmVkLgorCSBNb3N0IG9mIHRoZSByZXN0IG9mIGdpdCBvdGhlcnMgaGF2ZSBiZWVuIGJ1c3kgd2l0aCAoZXNwZWNpYWxseQorCSBKdW5pbyksIGJ1dCBwYWNraW5nIG5vYm9keSB0b3VjaGVkIGFmdGVyIEkgZGlkIGl0LgorCitJdCdzIGNyeXB0aWMsIHlldCB2YWd1ZS4gIExpbnVzIGluIHN0eWxlIGZvciBzdXJlLiAgV2lzZSBtZW4KK2ludGVycHJldCB0aGlzIGFzIGFuIGFwb2xvZ3kuICBBIGZldyBhcmd1ZSBpdCBpcyBtZXJlbHkgYQorc3RhdGVtZW50IG9mIGZhY3QuCisKKyAgICA8bmpzYD4gSSBndWVzcyB0aGUgbmV4dCBzdGVwIGlzICJyZWFkIHRoZSBzb3VyY2UgYWdhaW4iLCBidXQgSQorICAgICAgICBoYXZlIHRvIGJ1aWxkIHVwIGEgY2VydGFpbiBsZXZlbCBvZiBndW1wdGlvbiBmaXJzdCA6LSkKKworSW5kZWVkISAgT24gYm90aCBwb2ludHMuCisKKyAgICA8bGludXM+IFRoZSBwYWNraW5nIGhldXJpc3RpYyBpcyBhY3R1YWxseSByZWFsbHkgcmVhbGx5IHNpbXBsZS4KKworQmFpdC4uLgorCisgICAgPGxpbnVzPiBCdXQgc3RyYW5nZS4KKworQW5kIHN3aXRjaC4gIFRoYXQgb3VnaHQgdG8gZG8gaXQhCisKKyAgICA8bGludXM+IFJlbWVtYmVyOiBnaXQgcmVhbGx5IGRvZXNuJ3QgZm9sbG93IGZpbGVzLiBTbyB3aGF0IGl0IGRvZXMgaXMKKyAgICAgICAgLSBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIG9iamVjdHMKKyAgICAgICAgLSBzb3J0IHRoZSBsaXN0IGFjY29yZGluZyB0byBtYWdpYyBoZXVyaXN0aWNzCisgICAgICAgIC0gd2FsayB0aGUgbGlzdCwgdXNpbmcgYSBzbGlkaW5nIHdpbmRvdywgc2VlaW5nIGlmIGFuIG9iamVjdAorICAgICAgICAgIGNhbiBiZSBkaWZmZWQgYWdhaW5zdCBhbm90aGVyIG9iamVjdCBpbiB0aGUgd2luZG93CisgICAgICAgIC0gd3JpdGUgb3V0IHRoZSBsaXN0IGluIHJlY2VuY3kgb3JkZXIKKworVGhlIHRyYWRpdGlvbmFsIHVuZGVyc3RhdGVtZW50OgorCisgICAgPG5qc2A+IEkgc3VzcGVjdCB0aGF0IHdoYXQgSSdtIG1pc3NpbmcgaXMgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiBvZgorICAgICAgICB0aGUgd29yZCAibWFnaWMiCisKK1RoZSB0cmFkaXRpb25hbCBpbnNpZ2h0OgorCisgICAgPHBhc2t5PiB5ZXMKKworQW5kIEJhYmVsLWxpa2UgY29uZnVzaW9uIGZsb3dlZC4KKworICAgIDxuanNgPiBvaCwgaG1tLCBhbmQgSSdtIG5vdCBzdXJlIHdoYXQgdGhpcyBzbGlkaW5nIHdpbmRvdyBtZWFucyBlaXRoZXIKKworICAgIDxwYXNreT4gaWlyYywgaXQgYXBwZWFyZWQgdG8gbWUgdG8gYmUganVzdCB0aGUgc2hhMSBvZiB0aGUgb2JqZWN0CisgICAgICAgIHdoZW4gcmVhZGluZyB0aGUgY29kZSBjYXN1YWxseSAuLi4KKworICAgICAgICAuLi4gd2hpY2ggc2ltcGx5IGRvZXNuJ3Qgc291bmQgYXMgYSB2ZXJ5IGdvb2QgaGV1cmlzdGljcywgdGhvdWdoIDspCisKKyAgICA8bmpzYD4gLi4uLi5hbmQgcmVjZW5jeSBvcmRlci4gIG9rYXksIEkgdGhpbmsgaXQncyBjbGVhciBJIGRpZG4ndAorICAgICAgIGV2ZW4gcmVhbGl6ZSBob3cgbXVjaCBJIHdhc24ndCByZWFsaXppbmcgOi0pCisKK0FoLCBncmFzc2hvcHBlciEgIEFuZCB0aHVzIHRoZSBlbmxpZ2h0ZW5tZW50IGJlZ2lucyBhbmV3LgorCisgICAgPGxpbnVzPiBUaGUgIm1hZ2ljIiBpcyBhY3R1YWxseSBpbiB0aGVvcnkgdG90YWxseSBhcmJpdHJhcnkuCisgICAgICAgIEFOWSBvcmRlciB3aWxsIGdpdmUgeW91IGEgd29ya2luZyBwYWNrLCBidXQgbm8sIGl0J3Mgbm90CisgICAgICAgIG9yZGVyZWQgYnkgU0hBMS4KKworICAgICAgICBCZWZvcmUgdGFsa2luZyBhYm91dCB0aGUgb3JkZXJpbmcgZm9yIHRoZSBzbGlkaW5nIGRlbHRhCisgICAgICAgIHdpbmRvdywgbGV0J3MgdGFsayBhYm91dCB0aGUgcmVjZW5jeSBvcmRlci4gVGhhdCdzIG1vcmUKKyAgICAgICAgaW1wb3J0YW50IGluIG9uZSB3YXkuCisKKyAgICA8bmpzYD4gUmlnaHQsIGJ1dCBpZiBhbGwgeW91IHdhbnQgaXMgYSB3b3JraW5nIHdheSB0byBwYWNrIHRoaW5ncworICAgICAgICB0b2dldGhlciwgeW91IGNvdWxkIGp1c3QgdXNlIGNhdCBhbmQgc2F2ZSB5b3Vyc2VsZiBzb21lCisgICAgICAgIHRyb3VibGUuLi4KKworV2FhYWl0IGZvciBpdC4uLi4KKworICAgIDxsaW51cz4gVGhlIHJlY2VuY3kgb3JkZXJpbmcgKHdoaWNoIGlzIGJhc2ljYWxseTogcHV0IG9iamVjdHMKKyAgICAgICAgX3BoeXNpY2FsbHlfIGludG8gdGhlIHBhY2sgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUKKyAgICAgICAgInJlYWNoYWJsZSIgZnJvbSB0aGUgaGVhZCkgaXMgaW1wb3J0YW50LgorCisgICAgPG5qc2A+IG9rYXkKKworICAgIDxsaW51cz4gSXQncyBpbXBvcnRhbnQgYmVjYXVzZSB0aGF0J3MgdGhlIHRoaW5nIHRoYXQgZ2l2ZXMgcGFja3MKKyAgICAgICAgZ29vZCBsb2NhbGl0eS4gSXQga2VlcHMgdGhlIG9iamVjdHMgY2xvc2UgdG8gdGhlIGhlYWQgKHdoZXRoZXIKKyAgICAgICAgdGhleSBhcmUgb2xkIG9yIG5ldywgYnV0IHRoZXkgYXJlIF9yZWFjaGFibGVfIGZyb20gdGhlIGhlYWQpCisgICAgICAgIGF0IHRoZSBoZWFkIG9mIHRoZSBwYWNrLiBTbyBwYWNrcyBhY3R1YWxseSBoYXZlIGFic29sdXRlbHkKKyAgICAgICAgX3dvbmRlcmZ1bF8gSU8gcGF0dGVybnMuCisKK1JlYWQgdGhhdCBhZ2FpbiwgYmVjYXVzZSBpdCBpcyBpbXBvcnRhbnQuCisKKyAgICA8bGludXM+IEJ1dCByZWNlbmN5IG9yZGVyaW5nIGlzIHRvdGFsbHkgdXNlbGVzcyBmb3IgZGVjaWRpbmcgaG93CisgICAgICAgIHRvIGFjdHVhbGx5IGdlbmVyYXRlIHRoZSBkZWx0YXMsIHNvIHRoZSBkZWx0YSBvcmRlcmluZyBpcworICAgICAgICBzb21ldGhpbmcgZWxzZS4KKworICAgICAgICBUaGUgZGVsdGEgb3JkZXJpbmcgaXMgKHdhaXQgZm9yIGl0KToKKyAgICAgICAgLSBmaXJzdCBzb3J0IGJ5IHRoZSAiYmFzZW5hbWUiIG9mIHRoZSBvYmplY3QsIGFzIGRlZmluZWQgYnkKKyAgICAgICAgICB0aGUgbmFtZSB0aGUgb2JqZWN0IHdhcyBfZmlyc3RfIHJlYWNoZWQgdGhyb3VnaCB3aGVuCisgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgb2JqZWN0IGxpc3QKKyAgICAgICAgLSB3aXRoaW4gdGhlIHNhbWUgYmFzZW5hbWUsIHNvcnQgYnkgc2l6ZSBvZiB0aGUgb2JqZWN0CisgICAgICAgIC0gYnV0IGFsd2F5cyBzb3J0IGRpZmZlcmVudCB0eXBlcyBzZXBhcmF0ZWx5IChjb21taXRzIGZpcnN0KS4KKworICAgICAgICBUaGF0J3Mgbm90IGV4YWN0bHkgaXQsIGJ1dCBpdCdzIHZlcnkgY2xvc2UuCisKKyAgICA8bmpzYD4gVGhlICJfZmlyc3RfIHJlYWNoZWQiIHRoaW5nIGlzIG5vdCB0b28gaW1wb3J0YW50LCBqdXN0IHlvdQorICAgICAgICBuZWVkIHNvbWUgd2F5IHRvIGJyZWFrIHRpZXMgc2luY2UgdGhlIHNhbWUgb2JqZWN0cyBtYXkgYmUKKyAgICAgICAgcmVhY2hhYmxlIG1hbnkgd2F5cywgeWVzPworCitBbmQgYXMgaWYgdG8gY2xhcmlmeToKKworICAgIDxsaW51cz4gVGhlIHBvaW50IGlzIHRoYXQgaXQncyBhbGwgcmVhbGx5IGp1c3QgYW55IHJhbmRvbQorICAgICAgICBoZXVyaXN0aWMsIGFuZCB0aGUgb3JkZXJpbmcgaXMgdG90YWxseSB1bmltcG9ydGFudCBmb3IKKyAgICAgICAgY29ycmVjdG5lc3MsIGJ1dCBpdCBoZWxwcyBhIGxvdCBpZiB0aGUgaGV1cmlzdGljIGdpdmVzCisgICAgICAgICJjbHVtcGluZyIgZm9yIHRoaW5ncyB0aGF0IGFyZSBsaWtlbHkgdG8gZGVsdGEgd2VsbCBhZ2FpbnN0CisgICAgICAgIGVhY2ggb3RoZXIuCisKK0l0IGlzIGFuIGltcG9ydGFudCBwb2ludCwgc28gc2VjcmV0bHksIEkgZGlkIG15IG93biByZXNlYXJjaCBhbmQgaGF2ZQoraW5jbHVkZWQgbXkgcmVzdWx0cyBiZWxvdy4gIFRvIGJlIGZhaXIsIGl0IGhhcyBjaGFuZ2VkIHNvbWUgb3ZlciB0aW1lLgorQW5kIHRocm91Z2ggdGhlIG1hZ2ljIG9mIFJldmlzaW9uaXN0aWMgSGlzdG9yeSwgSSBkcmF3IHVwb24gdGhpcyBlbnRyeQorZnJvbSBUaGUgR2l0IElSQyBMb2dzIG9uIG15IGZhdGhlcidzIGJpcnRoZGF5LCBNYXJjaCAxOgorCisgICAgPGdpdHN0ZXI+IFRoZSBxdW90ZSBmcm9tIHRoZSBhYm92ZSBsaW51cyBzaG91bGQgYmUgcmV3cml0dGVuIGEKKyAgICAgICAgYml0ICh3YWl0IGZvciBpdCk6CisgICAgICAgIC0gZmlyc3Qgc29ydCBieSB0eXBlLiAgRGlmZmVyZW50IG9iamVjdHMgbmV2ZXIgZGVsdGEgd2l0aAorCSAgZWFjaCBvdGhlci4KKyAgICAgICAgLSB0aGVuIHNvcnQgYnkgZmlsZW5hbWUvZGlybmFtZS4gIGhhc2ggb2YgdGhlIGJhc2VuYW1lCisgICAgICAgICAgb2NjdXBpZXMgdGhlIHRvcCBCSVRTX1BFUl9JTlQtRElSX0JJVFMgYml0cywgYW5kIGJvdHRvbQorICAgICAgICAgIERJUl9CSVRTIGFyZSBmb3IgdGhlIGhhc2ggb2YgbGVhZGluZyBwYXRoIGVsZW1lbnRzLgorICAgICAgICAtIHRoZW4gaWYgd2UgYXJlIGRvaW5nICJ0aGluIiBwYWNrLCB0aGUgb2JqZWN0cyB3ZSBhcmUgX25vdF8KKyAgICAgICAgICBnb2luZyB0byBwYWNrIGJ1dCB3ZSBrbm93IGFib3V0IGFyZSBzb3J0ZWQgZWFybGllciB0aGFuCisgICAgICAgICAgb3RoZXIgb2JqZWN0cy4KKyAgICAgICAgLSBhbmQgZmluYWxseSBzb3J0IGJ5IHNpemUsIGxhcmdlciB0byBzbWFsbGVyLgorCitJbiBvbmUgc3dlbGwtZm9vcCwgY2xhcmlmaWNhdGlvbiBhbmQgb2JzY3VyaWZpY2F0aW9uISAgTm9uZXRoZWxlc3MsCithdXRob3JpdGF0aXZlLiAgQ3J5cHRpYywgeWV0IGNvbmNpc2UuICBJdCBldmVuIHNvbGljaXRzIG5vdGlvbnMgb2YKK3F1b3RlcyBmcm9tIFRoZSBTb3VyY2UgQ29kZS4gIENsZWFybHksIG1vcmUgc3R1ZHkgaXMgbmVlZGVkLgorCisgICAgPGdpdHN0ZXI+IFRoYXQncyB0aGUgc29ydCBvcmRlci4gIFdoYXQgdGhpcyBtZWFucyBpczoKKyAgICAgICAgLSB3ZSBkbyBub3QgZGVsdGEgZGlmZmVyZW50IG9iamVjdCB0eXBlcy4KKwktIHdlIHByZWZlciB0byBkZWx0YSB0aGUgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGZ1bGwgcGF0aCwgYnV0CisgICAgICAgICAgYWxsb3cgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGZyb20gZGlmZmVyZW50IGRpcmVjdG9yaWVzLgorCS0gd2UgYWx3YXlzIHByZWZlciB0byBkZWx0YSBhZ2FpbnN0IG9iamVjdHMgd2UgYXJlIG5vdCBnb2luZworICAgICAgICAgIHRvIHNlbmQsIGlmIHRoZXJlIGFyZSBzb21lLgorCS0gd2UgcHJlZmVyIHRvIGRlbHRhIGFnYWluc3QgbGFyZ2VyIG9iamVjdHMsIHNvIHRoYXQgd2UgaGF2ZQorICAgICAgICAgIGxvdHMgb2YgcmVtb3ZhbHMuCisKKyAgICAgICAgVGhlIHBlbnVsdGltYXRlIHJ1bGUgaXMgZm9yICJ0aGluIiBwYWNrcy4gIEl0IGlzIHVzZWQgd2hlbgorICAgICAgICB0aGUgb3RoZXIgc2lkZSBpcyBrbm93biB0byBoYXZlIHN1Y2ggb2JqZWN0cy4KKworVGhlcmUgaXQgaXMgYWdhaW4uICJUaGluIiBwYWNrcy4gIEknbSB0aGlua2luZyB0byBteXNlbGYsICJXaGF0CitpcyBhICd0aGluJyBwYWNrPyIgIFNvIEkgYXNrOgorCisgICAgPGpkbD4gV2hhdCBpcyBhICJ0aGluIiBwYWNrPworCisgICAgPGdpdHN0ZXI+IFVzZSBvZiAtLW9iamVjdHMtZWRnZSB0byByZXYtbGlzdCBhcyB0aGUgdXBzdHJlYW0gb2YKKyAgICAgICAgcGFjay1vYmplY3RzLiAgVGhlIHBhY2sgdHJhbnNmZXIgcHJvdG9jb2wgbmVnb3RpYXRlcyB0aGF0LgorCitXb28gaG9vISAgQ2xlYXJlZCB0aGF0IF9yaWdodF8gdXAhCisKKyAgICA8Z2l0c3Rlcj4gVGhlcmUgYXJlIHR3byBkaXJlY3Rpb25zIC0gcHVzaCBhbmQgZmV0Y2guCisKK1RoZXJlISAgRGlkIHlvdSBzZWUgaXQ/ICBJdCBpcyBub3QgJyJwdXNoIiBhbmQgInB1bGwiJyEgIEhvdyBvZnRlbiB0aGUKK2NvbmZ1c2lvbiBoYXMgc3RhcnRlZCBoZXJlLiAgU28gY2FzdWFsbHkgbWVudGlvbmVkLCB0b28hCisKKyAgICA8Z2l0c3Rlcj4gRm9yIHB1c2gsIGdpdC1zZW5kLXBhY2sgaW52b2tlcyBnaXQtcmVjZWl2ZS1wYWNrIG9uIHRoZQorICAgICAgICBvdGhlciBlbmQuICBUaGUgcmVjZWl2ZS1wYWNrIHNheXMgIkkgaGF2ZSB1cCB0byB0aGVzZSBjb21taXRzIi4KKyAgICAgICAgc2VuZC1wYWNrIGxvb2tzIGF0IHRoZW0sIGFuZCBjb21wdXRlcyB3aGF0IGFyZSBtaXNzaW5nIGZyb20KKyAgICAgICAgdGhlIG90aGVyIGVuZC4gIFNvICJ0aGluIiBjb3VsZCBiZSB0aGUgZGVmYXVsdCB0aGVyZS4KKworICAgICAgICBJbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBmZXRjaCwgZ2l0LWZldGNoLXBhY2sgYW5kCisgICAgICAgIGdpdC1jbG9uZS1wYWNrIGludm9rZXMgZ2l0LXVwbG9hZC1wYWNrIG9uIHRoZSBvdGhlciBlbmQKKwkodmlhIHNzaCBvciBieSB0YWxraW5nIHRvIHRoZSBkYWVtb24pLgorCisJVGhlcmUgYXJlIHR3byBjYXNlczogZmV0Y2gtcGFjayB3aXRoIC1rIGFuZCBjbG9uZS1wYWNrIGlzIG9uZSwKKyAgICAgICAgZmV0Y2gtcGFjayB3aXRob3V0IC1rIGlzIHRoZSBvdGhlci4gIGNsb25lLXBhY2sgYW5kIGZldGNoLXBhY2sKKyAgICAgICAgd2l0aCAtayB3aWxsIGtlZXAgdGhlIGRvd25sb2FkZWQgcGFja2ZpbGUgd2l0aG91dCBleHBhbmRlZCwgc28KKyAgICAgICAgd2UgZG8gbm90IHVzZSB0aGluIHBhY2sgdHJhbnNmZXIuICBPdGhlcndpc2UsIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgcGFjayB3aWxsIGhhdmUgZGVsdGEgd2l0aG91dCBiYXNlIG9iamVjdCBpbiB0aGUgc2FtZSBwYWNrLgorCisgICAgICAgIEJ1dCBmZXRjaC1wYWNrIHdpdGhvdXQgLWsgd2lsbCBleHBsb2RlIHRoZSByZWNlaXZlZCBwYWNrIGludG8KKyAgICAgICAgaW5kaXZpZHVhbCBvYmplY3RzLCBzbyB3ZSBhdXRvbWF0aWNhbGx5IGFzayB1cGxvYWQtcGFjayB0bworICAgICAgICBnaXZlIHVzIGEgdGhpbiBwYWNrIGlmIHVwbG9hZC1wYWNrIHN1cHBvcnRzIGl0LgorCitPSyB0aGVuLgorCitVaC4KKworTGV0J3MgcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBjb252ZXJzYXRpb24gc3RpbGwgaW4gcHJvZ3Jlc3MuCisKKyAgICA8bmpzYD4gYW5kICJiYXNlbmFtZSIgbWVhbnMgc29tZXRoaW5nIGxpa2UgInRoZSB0YWlsIG9mIGVuZCBvZgorICAgICAgICBwYXRoIG9mIGZpbGUgb2JqZWN0cyBhbmQgZGlyIG9iamVjdHMsIGFzIHBlciBiYXNlbmFtZSgzKSwgYW5kCisgICAgICAgIHdlIGp1c3QgZGVjbGFyZSBhbGwgY29tbWl0IGFuZCB0YWcgb2JqZWN0cyB0byBoYXZlIHRoZSBzYW1lCisgICAgICAgIGJhc2VuYW1lIiBvciBzb21ldGhpbmc/CisKK0x1Y2tpbHksIHRoYXQgdG9vIGlzIGEgcG9pbnQgdGhhdCBnaXRzdGVyIGNsYXJpZmllZCBmb3IgdXMhCisKK0lmIEkgbWlnaHQgYWRkLCB0aGUgdHJpY2sgaXMgdG8gbWFrZSBmaWxlcyB0aGF0IF9taWdodF8gYmUgc2ltaWxhciBiZQorbG9jYXRlZCBjbG9zZSB0byBlYWNoIG90aGVyIGluIHRoZSBoYXNoIGJ1Y2tldHMgYmFzZWQgb24gdGhlaXIgZmlsZQorbmFtZXMuICBJdCB1c2VkIHRvIGJlIHRoYXQgImZvby9NYWtlZmlsZSIsICJiYXIvYmF6L3F1dXgvTWFrZWZpbGUiIGFuZAorIk1ha2VmaWxlIiBhbGwgbGFuZGVkIGluIHRoZSBzYW1lIGJ1Y2tldCBkdWUgdG8gdGhlaXIgY29tbW9uIGJhc2VuYW1lLAorIk1ha2VmaWxlIi4gSG93ZXZlciwgbm93IHRoZXkgbGFuZCBpbiAiY2xvc2UiIGJ1Y2tldHMuCisKK1RoZSBhbGdvcml0aG0gYWxsb3dzIG5vdCBqdXN0IGZvciB0aGUgX3NhbWVfIGJ1Y2tldCwgYnV0IGZvciBfY2xvc2VfCitidWNrZXRzIHRvIGJlIGNvbnNpZGVyZWQgZGVsdGEgY2FuZGlkYXRlcy4gIFRoZSByYXRpb25hbGUgaXMKK2Vzc2VudGlhbGx5IHRoYXQgZmlsZXMsIGxpa2UgTWFrZWZpbGVzLCBvZnRlbiBoYXZlIHZlcnkgc2ltaWxhcgorY29udGVudCBubyBtYXR0ZXIgd2hhdCBkaXJlY3RvcnkgdGhleSBsaXZlIGluLgorCisgICAgPGxpbnVzPiBJIHBsYXllZCBhcm91bmQgd2l0aCBkaWZmZXJlbnQgZGVsdGEgYWxnb3JpdGhtcywgYW5kIHdpdGgKKyAgICAgICAgbWFraW5nIHRoZSAiZGVsdGEgd2luZG93IiBiaWdnZXIsIGJ1dCBoYXZpbmcgdG9vIGJpZyBvZiBhCisgICAgICAgIHNsaWRpbmcgd2luZG93IG1ha2VzIGl0IHZlcnkgZXhwZW5zaXZlIHRvIGdlbmVyYXRlIHRoZSBwYWNrOgorICAgICAgICB5b3UgbmVlZCB0byBjb21wYXJlIGV2ZXJ5IG9iamVjdCB3aXRoIGEgX3Rvbl8gb2Ygb3RoZXIgb2JqZWN0cy4KKworICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3RoZXIgdHJpdmlhbCBoZXVyaXN0aWNzIHRvbywgd2hpY2gKKyAgICAgICAgYmFzaWNhbGx5IGJvaWwgZG93biB0byAiZG9uJ3QgYm90aGVyIGV2ZW4gdHJ5aW5nIHRvIGRlbHRhIHRoaXMKKyAgICAgICAgcGFpciIgaWYgd2UgY2FuIHRlbGwgYmVmb3JlLWhhbmQgdGhhdCB0aGUgZGVsdGEgaXNuJ3Qgd29ydGggaXQKKyAgICAgICAgKGR1ZSB0byBzaXplIGRpZmZlcmVuY2VzLCB3aGVyZSB3ZSBjYW4gdGFrZSBhIHByZXZpb3VzIGRlbHRhCisgICAgICAgIHJlc3VsdCBpbnRvIGFjY291bnQgdG8gZGVjaWRlIHRoYXQgIm9rLCBubyBwb2ludCBpbiB0cnlpbmcKKyAgICAgICAgdGhhdCBvbmUsIGl0IHdpbGwgYmUgd29yc2UiKS4KKworICAgICAgICBFbmQgcmVzdWx0OiBwYWNraW5nIGlzIGFjdHVhbGx5IHZlcnkgc2l6ZSBlZmZpY2llbnQuIEl0J3MKKyAgICAgICAgc29tZXdoYXQgQ1BVLXdhc3RlZnVsLCBidXQgb24gdGhlIG90aGVyIGhhbmQsIHNpbmNlIHlvdSdyZQorICAgICAgICByZWFsbHkgb25seSBzdXBwb3NlZCB0byBkbyBpdCBtYXliZSBvbmNlIGEgbW9udGggKGFuZCB5b3UgY2FuCisgICAgICAgIGRvIGl0IGR1cmluZyB0aGUgbmlnaHQpLCBub2JvZHkgcmVhbGx5IHNlZW1zIHRvIGNhcmUuCisKK05pY2UgRW5naW5lZXJpbmcgVG91Y2gsIHRoZXJlLiAgRmluZCB3aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLCBhbmQKK3Byb2NsYWltIGl0IGEgbm9uLWlzc3VlLiAgR29vZCBzdHlsZSB0b28hCisKKyAgICA8bmpzYD4gU28sIGp1c3QgdG8gcmVwZWF0IHRvIHNlZSBpZiBJJ20gZm9sbG93aW5nLCB3ZSBzdGFydCBieQorICAgICAgICBnZXR0aW5nIGEgbGlzdCBvZiB0aGUgb2JqZWN0cyB3ZSB3YW50IHRvIHBhY2ssIHdlIHNvcnQgaXQgYnkKKyAgICAgICAgdGhpcyBoZXVyaXN0aWMgKGJhc2ljYWxseSBsZXhpY29ncmFwaGljYWxseSBvbiB0aGUgdHVwbGUKKyAgICAgICAgKHR5cGUsIGJhc2VuYW1lLCBzaXplKSkuCisKKyAgICAgICAgVGhlbiB3ZSB3YWxrIHRocm91Z2ggdGhpcyBsaXN0LCBhbmQgY2FsY3VsYXRlIGEgZGVsdGEgb2YKKyAgICAgICAgZWFjaCBvYmplY3QgYWdhaW5zdCB0aGUgbGFzdCBuICh0dW5hYmxlIHBhcmFtZXRlcikgb2JqZWN0cywKKyAgICAgICAgYW5kIHBpY2sgdGhlIHNtYWxsZXN0IG9mIHRoZXNlIGRlbHRhcy4KKworVmFzdGx5IHNpbXBsaWZpZWQsIGJ1dCB0aGUgZXNzZW5jZSBpcyB0aGVyZSEKKworICAgIDxsaW51cz4gQ29ycmVjdC4KKworICAgIDxuanNgPiBBbmQgdGhlbiBvbmNlIHdlIGhhdmUgcGlja2VkIGEgZGVsdGEgb3IgZnVsbHRleHQgdG8KKyAgICAgICAgcmVwcmVzZW50IGVhY2ggb2JqZWN0LCB3ZSByZS1zb3J0IGJ5IHJlY2VuY3ksIGFuZCB3cml0ZSB0aGVtCisgICAgICAgIG91dCBpbiB0aGF0IG9yZGVyLgorCisgICAgPGxpbnVzPiBZdXAuIFNvbWUgb3RoZXIgc21hbGwgZGV0YWlsczoKKworQW5kIG9mIGNvdXJzZSB0aGVyZSBpcyB0aGUgIk90aGVyIFNob2UiIEZhY3RvciB0b28uCisKKyAgICA8bGludXM+IC0gV2UgbGltaXQgdGhlIGRlbHRhIGRlcHRoIHRvIGFub3RoZXIgbWFnaWMgdmFsdWUgKHJpZ2h0CisgICAgICAgIG5vdyBib3RoIHRoZSB3aW5kb3cgYW5kIGRlbHRhIGRlcHRoIG1hZ2ljIHZhbHVlcyBhcmUganVzdCAiMTAiKQorCisgICAgPG5qc2A+IEhybSwgbXkgaW50dWl0aW9uIGlzIHRoYXQgeW91J2QgZW5kIHVwIHdpdGggcmVhbGx5IF9iYWRfIElPCisgICAgICAgIHBhdHRlcm5zLCBiZWNhdXNlIHRoZSB0aGluZ3MgeW91IHdhbnQgYXJlIG5lYXIgYnksIGJ1dCB0bworICAgICAgICBhY3R1YWxseSByZWNvbnN0cnVjdCB0aGVtIHlvdSBtYXkgaGF2ZSB0byBqdW1wIGFsbCBvdmVyIGluCisgICAgICAgIHJhbmRvbSB3YXlzLgorCisgICAgPGxpbnVzPiAtIFdoZW4gd2Ugd3JpdGUgb3V0IGEgZGVsdGEsIGFuZCB3ZSBoYXZlbid0IHlldCB3cml0dGVuCisgICAgICAgIG91dCB0aGUgb2JqZWN0IGl0IGlzIGEgZGVsdGEgYWdhaW5zdCwgd2Ugd3JpdGUgb3V0IHRoZSBiYXNlCisgICAgICAgIG9iamVjdCBmaXJzdC4gIEFuZCBubywgd2hlbiB3ZSByZWNvbnN0cnVjdCB0aGVtLCB3ZSBhY3R1YWxseQorICAgICAgICBnZXQgbmljZSBJTyBwYXR0ZXJucywgYmVjYXVzZToKKyAgICAgICAgLSBsYXJnZXIgb2JqZWN0cyB0ZW5kIHRvIGJlICJtb3JlIHJlY2VudCIgKExpbnVzJyBsYXc6IGZpbGVzIGdyb3cpCisgICAgICAgIC0gd2UgYWN0aXZlbHkgdHJ5IHRvIGdlbmVyYXRlIGRlbHRhcyBmcm9tIGEgbGFyZ2VyIG9iamVjdCB0byBhCisgICAgICAgICAgc21hbGxlciBvbmUKKyAgICAgICAgLSB0aGlzIG1lYW5zIHRoYXQgdGhlIHRvcC1vZi10cmVlIHZlcnkgc2VsZG9tIGhhcyBkZWx0YXMKKyAgICAgICAgICAoaS5lLiBkZWx0YXMgaW4gX3ByYWN0aWNlXyBhcmUgImJhY2t3YXJkcyBkZWx0YXMiKQorCitBZ2Fpbiwgd2Ugc2hvdWxkIHJlcmVhZCB0aGF0IHdob2xlIHBhcmFncmFwaC4gIE5vdCBqdXN0IGJlY2F1c2UKK0xpbnVzIGhhcyBzbGlwcGVkIExpbnVzJ3MgTGF3IGluIHRoZXJlIG9uIHVzLCBidXQgYmVjYXVzZSBpdCBpcworaW1wb3J0YW50LiAgTGV0J3MgbWFrZSBzdXJlIHdlIGNsYXJpZnkgc29tZSBvZiB0aGUgcG9pbnRzIGhlcmU6CisKKyAgICA8bmpzYD4gU28gdGhlIHBvaW50IGlzIGp1c3QgdGhhdCBpbiBwcmFjdGljZSwgZGVsdGEgb3JkZXIgYW5kCisgICAgICAgIHJlY2VuY3kgb3JkZXIgbWF0Y2ggZWFjaCBvdGhlciBxdWl0ZSB3ZWxsLgorCisgICAgPGxpbnVzPiBZZXMuIFRoZXJlJ3MgYW5vdGhlciBuaWNlIHNpZGUgdG8gdGhpcyAoYW5kIHllcywgaXQgd2FzCisJZGVzaWduZWQgdGhhdCB3YXkgOyk6CisgICAgICAgIC0gdGhlIHJlYXNvbiB3ZSBnZW5lcmF0ZSBkZWx0YXMgYWdhaW5zdCB0aGUgbGFyZ2VyIG9iamVjdCBpcworCSAgYWN0dWFsbHkgYSBiaWcgc3BhY2Ugc2F2ZXIgdG9vIQorCisgICAgPG5qc2A+IEhtbSwgYnV0IHlvdXIgbGFzdCBjb21tZW50IChpZiAid2UgaGF2ZW4ndCB5ZXQgd3JpdHRlbiBvdXQKKyAgICAgICAgdGhlIG9iamVjdCBpdCBpcyBhIGRlbHRhIGFnYWluc3QsIHdlIHdyaXRlIG91dCB0aGUgYmFzZSBvYmplY3QKKyAgICAgICAgZmlyc3QiKSwgc2VlbXMgbGlrZSBpdCB3b3VsZCBtYWtlIHRoZXNlIGZhY3RzIG1vc3RseQorICAgICAgICBpcnJlbGV2YW50IGJlY2F1c2UgZXZlbiBpZiBpbiBwcmFjdGljZSB5b3Ugd291bGQgbm90IGhhdmUgdG8KKyAgICAgICAgd2FuZGVyIGFyb3VuZCBtdWNoLCBpbiBmYWN0IHlvdSBqdXN0IGJydXRlLWZvcmNlIHNheSB0aGF0IGluCisgICAgICAgIHRoZSBjYXNlcyB3aGVyZSB5b3UgbWlnaHQgaGF2ZSB0byB3YW5kZXIsIGRvbid0IGRvIHRoYXQgOi0pCisKKyAgICA8bGludXM+IFllcyBhbmQgbm8uIE5vdGljZSB0aGUgcnVsZTogd2Ugb25seSB3cml0ZSBvdXQgdGhlIGJhc2UKKyAgICAgICAgb2JqZWN0IGZpcnN0IGlmIHRoZSBkZWx0YSBhZ2FpbnN0IGl0IHdhcyBtb3JlIHJlY2VudC4gIFRoYXQKKyAgICAgICAgbWVhbnMgdGhhdCB5b3UgY2FuIGFjdHVhbGx5IGhhdmUgZGVsdGFzIHRoYXQgcmVmZXIgdG8gYSBiYXNlCisgICAgICAgIG9iamVjdCB0aGF0IGlzIF9ub3RfIGNsb3NlIHRvIHRoZSBkZWx0YSBvYmplY3QsIGJ1dCB0aGF0IG9ubHkKKyAgICAgICAgaGFwcGVucyB3aGVuIHRoZSBkZWx0YSBpcyBuZWVkZWQgdG8gZ2VuZXJhdGUgYW4gX29sZF8gb2JqZWN0LgorCisgICAgPGxpbnVzPiBTZWU/CisKK1llYWgsIG5vLiAgSSBtaXNzZWQgdGhhdCBvbiB0aGUgZmlyc3QgdHdvIG9yIHRocmVlIHJlYWRpbmdzIG15c2VsZi4KKworICAgIDxsaW51cz4gVGhpcyBrZWVwcyB0aGUgZnJvbnQgb2YgdGhlIHBhY2sgZGVuc2UuIFRoZSBmcm9udCBvZiB0aGUKKyAgICAgICAgcGFjayBuZXZlciBjb250YWlucyBkYXRhIHRoYXQgaXNuJ3QgcmVsZXZhbnQgdG8gYSAicmVjZW50IgorICAgICAgICBvYmplY3QuICBUaGUgc2l6ZSBvcHRpbWl6YXRpb24gY29tZXMgZnJvbSBvdXIgdXNlIG9mIHhkZWx0YQorICAgICAgICAoYnV0IGlzIHRydWUgZm9yIG1hbnkgb3RoZXIgZGVsdGEgYWxnb3JpdGhtcyk6IHJlbW92aW5nIGRhdGEKKyAgICAgICAgaXMgY2hlYXBlciAoaW4gc2l6ZSkgdGhhbiBhZGRpbmcgZGF0YS4KKworICAgICAgICBXaGVuIHlvdSByZW1vdmUgZGF0YSwgeW91IG9ubHkgbmVlZCB0byBzYXkgImNvcHkgYnl0ZXMgbi0tbSIuCisJSW4gY29udHJhc3QsIGluIGEgZGVsdGEgdGhhdCBfYWRkc18gZGF0YSwgeW91IGhhdmUgdG8gc2F5ICJhZGQKKyAgICAgICAgdGhlc2UgYnl0ZXM6ICdhY3R1YWwgZGF0YSBnb2VzIGhlcmUnIgorCisgICAgKioqIG5qc2AgaGFzIHF1aXQ6IFJlYWQgZXJyb3I6IDEwNCAoQ29ubmVjdGlvbiByZXNldCBieSBwZWVyKQorCisgICAgPGxpbnVzPiBVaGh1aC4gSSBob3BlIEkgZGlkbid0IGJsb3cgbmpzYCBtaW5kLgorCisgICAgKioqIG5qc2AgaGFzIGpvaW5lZCBjaGFubmVsICNnaXQKKworICAgIDxwYXNreT4gOikKKworVGhlIHNpbGVudCBvYnNlcnZlcnMgYXJlIGFtdXNlZC4gIE9mIGNvdXJzZS4KKworQW5kIGFzIGlmIG5qc2Agd2FzIGV4cGVjdGVkIHRvIGJlIG9tbmlzY2llbnQ6CisKKyAgICA8bGludXM+IG5qcyAtIGRpZCB5b3UgbWlzcyBhbnl0aGluZz8KKworT0ssIEknbGwgc3BlbGwgaXQgb3V0LiAgVGhhdCdzIEdlZWsgSHVtb3IuICBJZiBuanNgIHdhcyBub3QgYWN0dWFsbHkKK2Nvbm5lY3RlZCBmb3IgYSBsaXR0bGUgYml0IHRoZXJlLCBob3cgd291bGQgaGUga25vdyBpZiBtaXNzZWQgYW55dGhpbmcKK3doaWxlIGhlIHdhcyBkaXNjb25uZWN0ZWQ/ICBIZSdzIGEgYmVuZXZvbGVudCBkaWN0YXRvciB3aXRoIGEgc2Vuc2Ugb2YKK2h1bW9yISAgV2VsbCBub3RlZCEKKworICAgIDxuanNgPiBTdHVwaWQgcm91dGVyLiAgT3IgZ3JlbWxpbnMsIG9yIHdoYXRldmVyLgorCitJdCdzIGEgY2hlYXAgc2hvdCBhdCBDaXNjby4gIFRha2UgJ2VtIHdoZW4geW91IGNhbi4KKworICAgIDxuanNgPiBZZXMgYW5kIG5vLiBOb3RpY2UgdGhlIHJ1bGU6IHdlIG9ubHkgd3JpdGUgb3V0IHRoZSBiYXNlCisgICAgICAgIG9iamVjdCBmaXJzdCBpZiB0aGUgZGVsdGEgYWdhaW5zdCBpdCB3YXMgbW9yZSByZWNlbnQuCisKKyAgICAgICAgSSdtIGdldHRpbmcgbG9zdCBpbiBhbGwgdGhlc2Ugb3JkZXJzLCBsZXQgbWUgcmUtcmVhZCA6LSkKKwlTbyB0aGUgd3JpdGUtb3V0IG9yZGVyIGlzIGZyb20gbW9zdCByZWNlbnQgdG8gbGVhc3QgcmVjZW50PworICAgICAgICAoQ29uY2VpdmFibHkgaXQgY291bGQgYmUgdGhlIG9wcG9zaXRlIHdheSB0b28sIEknbSBub3Qgc3VyZSBpZgorICAgICAgICB3ZSd2ZSBzYWlkKSB0aG91Z2ggbXkgY29ubmVjdGlvbiBiYWNrIGF0IGhvbWUgaXMgbG9nZ2luZywgc28gSQorICAgICAgICBjYW4ganVzdCByZWFkIHdoYXQgeW91IHNhaWQgdGhlcmUgOi0pCisKK0FuZCBmb3IgdGhvc2Ugb2YgeW91IHBheWluZyBhdHRlbnRpb24sIHRoZSBPbW5pc2NpZW50IFRyaWNrIGhhcyBqdXN0CitiZWVuIGRldGFpbGVkIQorCisgICAgPGxpbnVzPiBZZXMsIHdlIGFsd2F5cyB3cml0ZSBvdXQgbW9zdCByZWNlbnQgZmlyc3QKKworRm9yIHRoZSBvdGhlciByZWNvcmQ6CisKKyAgICA8cGFza3k+IG5qc2A6IGh0dHA6Ly9wYXN0ZWJpbi5jb20vNTQ3OTY1CisKK1RoZSAnbmV0IG5ldmVyIGZvcmdldHMsIHNvIHRoYXQgc2hvdWxkIGJlIGdvb2QgdW50aWwgdGhlIGVuZCBvZiB0aW1lLgorCisgICAgPG5qc2A+IEFuZCwgeWVhaCwgSSBnb3QgdGhlIHBhcnQgYWJvdXQgZGVlcGVyLWluLWhpc3Rvcnkgc3R1ZmYKKyAgICAgICAgaGF2aW5nIHdvcnNlIElPIGNoYXJhY3RlcmlzdGljcywgb25lIHNvcnQgb2YgZG9lc24ndCBjYXJlLgorCisgICAgPGxpbnVzPiBXaXRoIHRoZSBjYXZlYXQgdGhhdCBpZiB0aGUgIm1vc3QgcmVjZW50IiBuZWVkcyBhbiBvbGRlcgorICAgICAgICBvYmplY3QgdG8gZGVsdGEgYWdhaW5zdCAoaGV5LCBzaHJpbmtpbmcgc29tZXRpbWVzIGRvZXMKKyAgICAgICAgaGFwcGVuKSwgd2Ugd3JpdGUgb3V0IHRoZSBvbGQgb2JqZWN0IHdpdGggdGhlIGRlbHRhLgorCisgICAgPG5qc2A+IChpZiBvbmx5IGl0IGhhcHBlbmVkIG1vcmUuLi4pCisKKyAgICA8bGludXM+IEFueXdheSwgdGhlIHBhY2stZmlsZSBjb3VsZCBlYXNpbHkgYmUgZGVuc2VyIHN0aWxsLCBidXQKKyAgICAgICAgYmVjYXVzZSBpdCdzIHVzZWQgYm90aCBmb3Igc3RyZWFtaW5nICh0aGUgZ2l0IHByb3RvY29sKSBhbmQKKyAgICAgICAgZm9yIG9uLWRpc2ssIGl0IGhhcyBhIGZldyBwZXNzaW1pemF0aW9ucy4KKworQWN0dWFsbHksIGl0IGlzIGEgbWFkZS11cCB3b3JkLiBCdXQgaXQgaXMgYSBtYWRlLXVwIHdvcmQgYmVpbmcKK3VzZWQgYXMgc2V0dXAgZm9yIGEgbGF0ZXIgb3B0aW1pemF0aW9uLCB3aGljaCBpcyBhIHJlYWwgd29yZDoKKworICAgIDxsaW51cz4gSW4gcGFydGljdWxhciwgd2hpbGUgdGhlIHBhY2stZmlsZSBpcyB0aGVuIGNvbXByZXNzZWQsCisgICAgICAgIGl0J3MgY29tcHJlc3NlZCBqdXN0IG9uZSBvYmplY3QgYXQgYSB0aW1lLCBzbyB0aGUgYWN0dWFsCisgICAgICAgIGNvbXByZXNzaW9uIGZhY3RvciBpcyBsZXNzIHRoYW4gaXQgY291bGQgYmUgaW4gdGhlb3J5LiBCdXQgaXQKKyAgICAgICAgbWVhbnMgdGhhdCBpdCdzIGFsbCBuaWNlIHJhbmRvbS1hY2Nlc3Mgd2l0aCBhIHNpbXBsZSBpbmRleCB0bworICAgICAgICBkbyAib2JqZWN0IG5hbWUtPmxvY2F0aW9uIGluIHBhY2tmaWxlIiB0cmFuc2xhdGlvbi4KKworICAgIDxuanNgPiBJJ20gYXNzdW1pbmcgdGhlIHJlYWwgd2luIGZvciBkZWx0YS1pbmcgbGFyZ2UtPnNtYWxsIGlzCisgICAgICAgIG1vcmUgaG9tb2dlbmVvdXMgc3RhdGlzdGljcyBmb3IgZ3ppcCB0byBydW4gb3Zlcj8KKworICAgICAgICAoWW91IGhhdmUgdG8gcHV0IHRoZSBieXRlcyBpbiBvbmUgcGxhY2Ugb3IgYW5vdGhlciwgYnV0CisgICAgICAgIHB1dHRpbmcgdGhlbSBpbiBhIGxhcmdlciBibG9iIHdpbnMgb24gY29tcHJlc3Npb24pCisKKyAgICAgICAgQWN0dWFsbHksIHdoYXQgaXMgdGhlIGNvbXByZXNzaW9uIHN0cmF0ZWd5IC0tIGVhY2ggZGVsdGEKKyAgICAgICAgaW5kaXZpZHVhbGx5IGd6aXBwZWQsIHRoZSB3aG9sZSBmaWxlIGd6aXBwZWQsIHNvbWV3aGVyZSBpbgorICAgICAgICBiZXR3ZWVuLCBubyBjb21wcmVzc2lvbiBhdCBhbGwsIC4uLi4/CisKKyAgICAgICAgUmlnaHQuCisKK1JlYWxpdHkgSVJDIHNldHMgaW4uICBGb3IgZXhhbXBsZToKKworICAgIDxwYXNreT4gSSdsbCByZWFkIHRoZSByZXN0IGluIHRoZSBtb3JuaW5nLCBJIHJlYWxseSBoYXZlIHRvIGdvCisgICAgICAgIHNsZWVwIG9yIHRoZXJlJ3Mgbm8gaG9wZSB3aGF0c29ldmVyIGZvciBtZSBhdCB0aGUgdG9kYXkncworICAgICAgICBleGFtLi4uIGcnbml0ZSBhbGwuCisKK0hlaC4KKworICAgIDxsaW51cz4gcGFza3k6IGcnbml0ZQorCisgICAgPG5qc2A+IHBhc2t5OiAnbHVjaworCisgICAgPGxpbnVzPiBSaWdodDogbGFyZ2UtPnNtYWxsIG1hdHRlcnMgZXhhY3RseSBiZWNhdXNlIG9mIGNvbXByZXNzaW9uCisgICAgICAgIGJlaGF2aW91ci4gSWYgaXQgd2FzIG5vbi1jb21wcmVzc2VkLCBpdCBwcm9iYWJseSB3b3VsZG4ndCBtYWtlCisgICAgICAgIGFueSBkaWZmZXJlbmNlLgorCisgICAgPG5qc2A+IHllYWgKKworICAgIDxsaW51cz4gQW55d2F5OiBJJ20gbm90IGV2ZW4gdHJ5aW5nIHRvIGNsYWltIHRoYXQgdGhlIHBhY2stZmlsZXMKKyAgICAgICAgYXJlIHBlcmZlY3QsIGJ1dCB0aGV5IGRvIHRlbmQgdG8gaGF2ZSBhIG5pY2UgYmFsYW5jZSBvZgorICAgICAgICBkZW5zaXR5IHZzIGVhc2Utb2YgdXNlLgorCitHYXNwISAgT0ssIHNhdmVkLiAgVGhhdCdzIGEgZmFpciBFbmdpbmVlcmluZyB0cmFkZSBvZmYuICBDbG9zZSBjYWxsIQorSW4gZmFjdCwgTGludXMgcmVmbGVjdHMgb24gc29tZSBCYXNpYyBFbmdpbmVlcmluZyBGdW5kYW1lbnRhbHMsCitkZXNpZ24gb3B0aW9ucywgZXRjLgorCisgICAgPGxpbnVzPiBNb3JlIGltcG9ydGFudGx5LCB0aGV5IGFsbG93IGdpdCB0byBzdGlsbCBfY29uY2VwdHVhbGx5XworICAgICAgICBuZXZlciBkZWFsIHdpdGggZGVsdGFzIGF0IGFsbCwgYW5kIGJlIGEgIndob2xlIG9iamVjdCIgc3RvcmUuCisKKyAgICAgICAgV2hpY2ggaGFzIHNvbWUgcHJvYmxlbXMgKHdlIGRpc2N1c3NlZCBiYWQgaHVnZS1maWxlCisgICAgICAgIGJlaGF2aW91ciBvbiB0aGUgZ2l0IGxpc3RzIHRoZSBvdGhlciBkYXkpLCBidXQgaXQgZG9lcyBtZWFuCisgICAgICAgIHRoYXQgdGhlIGJhc2ljIGdpdCBjb25jZXB0cyBhcmUgcmVhbGx5IHJlYWxseSBzaW1wbGUgYW5kCisgICAgICAgIHN0cmFpZ2h0Zm9yd2FyZC4KKworICAgICAgICBJdCdzIGFsbCBiZWVuIHF1aXRlIHN0YWJsZS4KKworICAgICAgICBXaGljaCBJIHRoaW5rIGlzIHZlcnkgbXVjaCBhIHJlc3VsdCBvZiBoYXZpbmcgdmVyeSBzaW1wbGUKKyAgICAgICAgYmFzaWMgaWRlYXMsIHNvIHRoYXQgdGhlcmUncyBuZXZlciBhbnkgY29uZnVzaW9uIGFib3V0IHdoYXQncworICAgICAgICBnb2luZyBvbi4KKworICAgICAgICBCdWdzIGhhcHBlbiwgYnV0IHRoZXkgYXJlICJzaW1wbGUiIGJ1Z3MuIEFuZCBidWdzIHRoYXQKKyAgICAgICAgYWN0dWFsbHkgZ2V0IHNvbWUgb2JqZWN0IHN0b3JlIGRldGFpbCB3cm9uZyBhcmUgYWxtb3N0IGFsd2F5cworICAgICAgICBzbyBvYnZpb3VzIHRoYXQgdGhleSBuZXZlciBnbyBhbnl3aGVyZS4KKworICAgIDxuanNgPiBZZWFoLgorCitOdWZmIHNhaWQuCisKKyAgICA8bGludXM+IEFueXdheS4gIEknbSBvZmYgZm9yIGJlZC4gSXQncyBub3QgNkFNIGhlcmUsIGJ1dCBJJ3ZlIGdvdAorCSB0aHJlZSBraWRzLCBhbmQgaGF2ZSB0byBnZXQgdXAgZWFybHkgaW4gdGhlIG1vcm5pbmcgdG8gc2VuZAorCSB0aGVtIG9mZi4gSSBuZWVkIG15IGJlYXV0eSBzbGVlcC4KKworICAgIDxuanNgPiA6LSkKKworICAgIDxuanNgPiBhcHByZWNpYXRlIHRoZSBpbmZvZHVtcCwgSSByZWFsbHkgd2FzIGZhaWxpbmcgdG8gZmluZCB0aGUKKyAgICAgICAgZGV0YWlscyBvbiBnaXQgcGFja3MgOi0pCisKK0FuZCBub3cgeW91IGtub3cgdGhlIHJlc3Qgb2YgdGhlIHN0b3J5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1wcm90b2NvbC50eHQgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC9wYWNrLXByb3RvY29sLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Q0OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvcGFjay1wcm90b2NvbC50eHQKQEAgLTAsMCArMSw0MSBAQAorUGFjayB0cmFuc2ZlciBwcm90b2NvbHMKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGFyZSB0d28gUGFjayBwdXNoLXB1bGwgcHJvdG9jb2xzLgorCit1cGxvYWQtcGFjayAoUykgfCBmZXRjaC9jbG9uZS1wYWNrIChDKSBwcm90b2NvbDoKKworCSMgVGVsbCB0aGUgcHVsbGVyIHdoYXQgY29tbWl0cyB3ZSBoYXZlIGFuZCB3aGF0IHRoZWlyIG5hbWVzIGFyZQorCVM6IFNIQTEgbmFtZQorCVM6IC4uLgorCVM6IFNIQTEgbmFtZQorCVM6ICMgZmx1c2ggLS0gaXQncyB5b3VyIHR1cm4KKwkjIFRlbGwgdGhlIHB1c2hlciB3aGF0IGNvbW1pdHMgd2Ugd2FudCwgYW5kIHdoYXQgd2UgaGF2ZQorCUM6IHdhbnQgbmFtZQorCUM6IC4uCisJQzogd2FudCBuYW1lCisJQzogaGF2ZSBTSEExCisJQzogaGF2ZSBTSEExCisJQzogLi4uCisJQzogIyBmbHVzaCAtLSBvY2Nhc2lvbmFsbHkgYXNrICJoYWQgZW5vdWdoPyIKKwlTOiBOQUsKKwlDOiBoYXZlIFNIQTEKKwlDOiAuLi4KKwlDOiBoYXZlIFNIQTEKKwlTOiBBQ0sKKwlDOiBkb25lCisJUzogWFhYWFhYWCAtLSBwYWNrZmlsZSBjb250ZW50cy4KKworc2VuZC1wYWNrIHwgcmVjZWl2ZS1wYWNrIHByb3RvY29sLgorCisJIyBUZWxsIHRoZSBwdXNoZXIgd2hhdCBjb21taXRzIHdlIGhhdmUgYW5kIHdoYXQgdGhlaXIgbmFtZXMgYXJlCisJQzogU0hBMSBuYW1lCisJQzogLi4uCisJQzogU0hBMSBuYW1lCisJQzogIyBmbHVzaCAtLSBpdCdzIHlvdXIgdHVybgorCSMgVGVsbCB0aGUgcHVsbGVyIHdoYXQgdGhlIHB1c2hlciBoYXMKKwlTOiBvbGQtU0hBMSBuZXctU0hBMSBuYW1lCisJUzogb2xkLVNIQTEgbmV3LVNIQTEgbmFtZQorCVM6IC4uLgorCVM6ICMgZmx1c2ggLS0gZG9uZSB3aXRoIHRoZSBsaXN0CisJUzogWFhYWFhYWCAtLS0gcGFja2ZpbGUgY29udGVudHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC90cml2aWFsLW1lcmdlLnR4dCBiL0RvY3VtZW50YXRpb24vdGVjaG5pY2FsL3RyaXZpYWwtbWVyZ2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Yzg0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RlY2huaWNhbC90cml2aWFsLW1lcmdlLnR4dApAQCAtMCwwICsxLDEyMSBAQAorVHJpdmlhbCBtZXJnZSBydWxlcworPT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgb3V0Y29tZXMgb2YgdGhlIHRyaXZpYWwgbWVyZ2UgbG9naWMgaW4gcmVhZC10cmVlLgorCitPbmUtd2F5IG1lcmdlCistLS0tLS0tLS0tLS0tCisKK1RoaXMgcmVwbGFjZXMgdGhlIGluZGV4IHdpdGggYSBkaWZmZXJlbnQgdHJlZSwga2VlcGluZyB0aGUgc3RhdCBpbmZvCitmb3IgZW50cmllcyB0aGF0IGRvbid0IGNoYW5nZSwgYW5kIGFsbG93aW5nIC11IHRvIG1ha2UgdGhlIG1pbmltdW0KK3JlcXVpcmVkIGNoYW5nZXMgdG8gdGhlIHdvcmtpbmcgdHJlZSB0byBoYXZlIGl0IG1hdGNoLgorCitFbnRyaWVzIG1hcmtlZCAnKycgaGF2ZSBzdGF0IGluZm9ybWF0aW9uLiBTcGFjZXMgbWFya2VkICcqJyBkb24ndAorYWZmZWN0IHRoZSByZXN1bHQuCisKKyAgIGluZGV4ICAgdHJlZSAgICByZXN1bHQKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqICAgICAgIChlbXB0eSkgKGVtcHR5KQorICAgKGVtcHR5KSB0cmVlICAgIHRyZWUKKyAgIGluZGV4KyAgdHJlZSAgICB0cmVlCisgICBpbmRleCsgIGluZGV4ICAgaW5kZXgrCisKK1R3by13YXkgbWVyZ2UKKy0tLS0tLS0tLS0tLS0KKworSXQgaXMgcGVybWl0dGVkIGZvciB0aGUgaW5kZXggdG8gbGFjayBhbiBlbnRyeTsgdGhpcyBkb2VzIG5vdCBwcmV2ZW50CithbnkgY2FzZSBmcm9tIGFwcGx5aW5nLgorCitJZiB0aGUgaW5kZXggZXhpc3RzLCBpdCBpcyBhbiBlcnJvciBmb3IgaXQgbm90IHRvIG1hdGNoIGVpdGhlciB0aGUgb2xkCitvciB0aGUgcmVzdWx0LgorCitJZiBtdWx0aXBsZSBjYXNlcyBhcHBseSwgdGhlIG9uZSB1c2VkIGlzIGxpc3RlZCBmaXJzdC4KKworQSByZXN1bHQgd2hpY2ggY2hhbmdlcyB0aGUgaW5kZXggaXMgYW4gZXJyb3IgaWYgdGhlIGluZGV4IGlzIG5vdCBlbXB0eQorYW5kIG5vdCB1cC10by1kYXRlLgorCitFbnRyaWVzIG1hcmtlZCAnKycgaGF2ZSBzdGF0IGluZm9ybWF0aW9uLiBTcGFjZXMgbWFya2VkICcqJyBkb24ndAorYWZmZWN0IHRoZSByZXN1bHQuCisKKyBjYXNlICBpbmRleCAgIG9sZCAgICAgbmV3ICAgICByZXN1bHQKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMC8yICAgKGVtcHR5KSAqICAgICAgIChlbXB0eSkgKGVtcHR5KQorIDEvMyAgIChlbXB0eSkgKiAgICAgICBuZXcgICAgIG5ldworIDQvNSAgIGluZGV4KyAgKGVtcHR5KSAoZW1wdHkpIGluZGV4KworIDYvNyAgIGluZGV4KyAgKGVtcHR5KSBpbmRleCAgIGluZGV4KworIDEwICAgIGluZGV4KyAgaW5kZXggICAoZW1wdHkpIChlbXB0eSkKKyAxNC8xNSBpbmRleCsgIG9sZCAgICAgb2xkICAgICBpbmRleCsKKyAxOC8xOSBpbmRleCsgIG9sZCAgICAgaW5kZXggICBpbmRleCsKKyAyMCAgICBpbmRleCsgIGluZGV4ICAgbmV3ICAgICBuZXcKKworVGhyZWUtd2F5IG1lcmdlCistLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgcGVybWl0dGVkIGZvciB0aGUgaW5kZXggdG8gbGFjayBhbiBlbnRyeTsgdGhpcyBkb2VzIG5vdCBwcmV2ZW50CithbnkgY2FzZSBmcm9tIGFwcGx5aW5nLgorCitJZiB0aGUgaW5kZXggZXhpc3RzLCBpdCBpcyBhbiBlcnJvciBmb3IgaXQgbm90IHRvIG1hdGNoIGVpdGhlciB0aGUKK2hlYWQgb3IgKGlmIHRoZSBtZXJnZSBpcyB0cml2aWFsKSB0aGUgcmVzdWx0LgorCitJZiBtdWx0aXBsZSBjYXNlcyBhcHBseSwgdGhlIG9uZSB1c2VkIGlzIGxpc3RlZCBmaXJzdC4KKworQSByZXN1bHQgb2YgIm5vIG1lcmdlIiBtZWFucyB0aGF0IGluZGV4IGlzIGxlZnQgaW4gc3RhZ2UgMCwgYW5jZXN0IGluCitzdGFnZSAxLCBoZWFkIGluIHN0YWdlIDIsIGFuZCByZW1vdGUgaW4gc3RhZ2UgMyAoaWYgYW55IG9mIHRoZXNlIGFyZQorZW1wdHksIG5vIGVudHJ5IGlzIGxlZnQgZm9yIHRoYXQgc3RhZ2UpLiBPdGhlcndpc2UsIHRoZSBnaXZlbiBlbnRyeSBpcworbGVmdCBpbiBzdGFnZSAwLCBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGVudHJpZXMuCisKK0EgcmVzdWx0IG9mICJubyBtZXJnZSIgaXMgYW4gZXJyb3IgaWYgdGhlIGluZGV4IGlzIG5vdCBlbXB0eSBhbmQgbm90Cit1cC10by1kYXRlLgorCisqZW1wdHkqIG1lYW5zIHRoYXQgdGhlIHRyZWUgbXVzdCBub3QgaGF2ZSBhIGRpcmVjdG9yeS1maWxlIGNvbmZsaWN0Cisgd2l0aCB0aGUgZW50cnkuCisKK0ZvciBtdWx0aXBsZSBhbmNlc3RvcnMsIGEgJysnIG1lYW5zIHRoYXQgdGhpcyBjYXNlIGFwcGxpZXMgZXZlbiBpZgorb25seSBvbmUgYW5jZXN0b3Igb3IgcmVtb3RlIGZpdHM7IGEgJ14nIG1lYW5zIGFsbCBvZiB0aGUgYW5jZXN0b3JzCittdXN0IGJlIHRoZSBzYW1lLgorCitjYXNlICBhbmNlc3QgICAgaGVhZCAgICByZW1vdGUgICAgcmVzdWx0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxICAgICAoZW1wdHkpKyAgKGVtcHR5KSAoZW1wdHkpICAgKGVtcHR5KQorMkFMVCAgKGVtcHR5KSsgICplbXB0eSogcmVtb3RlICAgIHJlbW90ZQorMiAgICAgKGVtcHR5KV4gIChlbXB0eSkgcmVtb3RlICAgIG5vIG1lcmdlCiszQUxUICAoZW1wdHkpKyAgaGVhZCAgICAqZW1wdHkqICAgaGVhZAorMyAgICAgKGVtcHR5KV4gIGhlYWQgICAgKGVtcHR5KSAgIG5vIG1lcmdlCis0ICAgICAoZW1wdHkpXiAgaGVhZCAgICByZW1vdGUgICAgbm8gbWVyZ2UKKzVBTFQgICogICAgICAgICBoZWFkICAgIGhlYWQgICAgICBoZWFkCis2ICAgICBhbmNlc3QrICAgKGVtcHR5KSAoZW1wdHkpICAgbm8gbWVyZ2UKKzggICAgIGFuY2VzdF4gICAoZW1wdHkpIGFuY2VzdCAgICBubyBtZXJnZQorNyAgICAgYW5jZXN0KyAgIChlbXB0eSkgcmVtb3RlICAgIG5vIG1lcmdlCisxMCAgICBhbmNlc3ReICAgYW5jZXN0ICAoZW1wdHkpICAgbm8gbWVyZ2UKKzkgICAgIGFuY2VzdCsgICBoZWFkICAgIChlbXB0eSkgICBubyBtZXJnZQorMTYgICAgYW5jMS9hbmMyIGFuYzEgICAgYW5jMiAgICAgIG5vIG1lcmdlCisxMyAgICBhbmNlc3QrICAgaGVhZCAgICBhbmNlc3QgICAgaGVhZAorMTQgICAgYW5jZXN0KyAgIGFuY2VzdCAgcmVtb3RlICAgIHJlbW90ZQorMTEgICAgYW5jZXN0KyAgIGhlYWQgICAgcmVtb3RlICAgIG5vIG1lcmdlCisKK09ubHkgIzJBTFQgYW5kICMzQUxUIHVzZSAqZW1wdHkqLCBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgb25seSBjYXNlcword2hlcmUgdGhlcmUgY2FuIGJlIGNvbmZsaWN0cyB0aGF0IGRpZG4ndCBleGlzdCBiZWZvcmUuIE5vdGUgdGhhdCB3ZQorYWxsb3cgZGlyZWN0b3J5LWZpbGUgY29uZmxpY3RzIGJldHdlZW4gdGhpbmdzIGluIGRpZmZlcmVudCBzdGFnZXMKK2FmdGVyIHRoZSB0cml2aWFsIG1lcmdlLgorCitBIHBvc3NpYmxlIGFsdGVybmF0aXZlIGZvciAjNiBpcyAoZW1wdHkpLCB3aGljaCB3b3VsZCBtYWtlIGl0IGxpa2UKKyMxLiBUaGlzIGlzIG5vdCB1c2VkLCBkdWUgdG8gdGhlIGxpa2VsaWhvb2QgdGhhdCBpdCBhcmlzZXMgZHVlIHRvCittb3ZpbmcgdGhlIGZpbGUgdG8gbXVsdGlwbGUgZGlmZmVyZW50IGxvY2F0aW9ucyBvciBtb3ZpbmcgYW5kIGRlbGV0aW5nCitpdCBpbiBkaWZmZXJlbnQgYnJhbmNoZXMuCisKK0Nhc2UgIzEgaXMgaW5jbHVkZWQgZm9yIGNvbXBsZXRlbmVzcywgYW5kIGFsc28gaW4gY2FzZSB3ZSBkZWNpZGUgdG8KK3B1dCBvbiAnKycgbWFya2luZ3M7IGFueSBwYXRoIHRoYXQgaXMgbmV2ZXIgbWVudGlvbmVkIGF0IGFsbCBpc24ndAoraGFuZGxlZC4KKworTm90ZSB0aGF0ICMxNiBpcyB3aGVuIGJvdGggIzEzIGFuZCAjMTQgYXBwbHk7IGluIHRoaXMgY2FzZSwgd2UgcmVmdXNlCit0aGUgdHJpdmlhbCBtZXJnZSwgYmVjYXVzZSB3ZSBjYW4ndCB0ZWxsIGZyb20gdGhpcyBkYXRhIHdoaWNoIGlzCityaWdodC4gVGhpcyBpcyBhIGNhc2Ugb2YgYSByZXZlcnRlZCBwYXRjaCAoaW4gc29tZSBkaXJlY3Rpb24sIG1heWJlCittdWx0aXBsZSB0aW1lcyksIGFuZCB0aGUgcmlnaHQgYW5zd2VyIGRlcGVuZHMgb24gbG9va2luZyBhdCBjcm9zc2luZ3MKK29mIGhpc3Rvcnkgb3IgY29tbW9uIGFuY2VzdG9ycyBvZiB0aGUgYW5jZXN0b3JzLgorCitOb3RlIHRoYXQsIGJldHdlZW4gIzYsICM3LCAjOSwgYW5kICMxMSwgYWxsIGNhc2VzIG5vdCBvdGhlcndpc2UKK2NvdmVyZWQgYXJlIGhhbmRsZWQgaW4gdGhpcyB0YWJsZS4KKworRm9yICM4IGFuZCAjMTAsIHRoZXJlIGlzIGFsdGVybmF0aXZlIGJlaGF2aW9yLCBub3QgY3VycmVudGx5CitpbXBsZW1lbnRlZCwgd2hlcmUgdGhlIHJlc3VsdCBpcyAoZW1wdHkpLiBBcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQsCit0aGUgYXV0b21hdGljIG1lcmdlIHdpbGwgZ2VuZXJhbGx5IGdpdmUgdGhpcyBlZmZlY3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLTIudHh0IGIvRG9jdW1lbnRhdGlvbi90dXRvcmlhbC0yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjRmZTEyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90dXRvcmlhbC0yLnR4dApAQCAtMCwwICsxLDM5MiBAQAorQSB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0OiBwYXJ0IHR3bworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3Ugc2hvdWxkIHdvcmsgdGhyb3VnaCBsaW5rOnR1dG9yaWFsLmh0bWxbQSB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8KK2dpdF0gYmVmb3JlIHJlYWRpbmcgdGhpcyB0dXRvcmlhbC4KKworVGhlIGdvYWwgb2YgdGhpcyB0dXRvcmlhbCBpcyB0byBpbnRyb2R1Y2UgdHdvIGZ1bmRhbWVudGFsIHBpZWNlcyBvZgorZ2l0J3MgYXJjaGl0ZWN0dXJlLS10aGUgb2JqZWN0IGRhdGFiYXNlIGFuZCB0aGUgaW5kZXggZmlsZS0tYW5kIHRvCitwcm92aWRlIHRoZSByZWFkZXIgd2l0aCBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byB1bmRlcnN0YW5kIHRoZSByZXN0CitvZiB0aGUgZ2l0IGRvY3VtZW50YXRpb24uCisKK1RoZSBnaXQgb2JqZWN0IGRhdGFiYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMZXQncyBzdGFydCBhIG5ldyBwcm9qZWN0IGFuZCBjcmVhdGUgYSBzbWFsbCBhbW91bnQgb2YgaGlzdG9yeToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIG1rZGlyIHRlc3QtcHJvamVjdAorJCBjZCB0ZXN0LXByb2plY3QKKyQgZ2l0IGluaXQtZGIKK2RlZmF1bHRpbmcgdG8gbG9jYWwgc3RvcmFnZSBhcmVhCiskIGVjaG8gJ2hlbGxvIHdvcmxkJyA+IGZpbGUudHh0CiskIGdpdCBhZGQgLgorJCBnaXQgY29tbWl0IC1hIC1tICJpbml0aWFsIGNvbW1pdCIKK0NvbW1pdHRpbmcgaW5pdGlhbCB0cmVlIDkyYjhiNjk0ZmZiMTY3NWU1OTc1MTQ4ZTExMjE4MTAwODFkYmRmZmUKKyQgZWNobyAnaGVsbG8gd29ybGQhJyA+ZmlsZS50eHQKKyQgZ2l0IGNvbW1pdCAtYSAtbSAiYWRkIGVtcGhhc2lzIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQgYXJlIHRoZSA0MCBkaWdpdHMgb2YgaGV4IHRoYXQgZ2l0IHJlc3BvbmRlZCB0byB0aGUgZmlyc3QgY29tbWl0Cit3aXRoPworCitXZSBzYXcgaW4gcGFydCBvbmUgb2YgdGhlIHR1dG9yaWFsIHRoYXQgY29tbWl0cyBoYXZlIG5hbWVzIGxpa2UgdGhpcy4KK0l0IHR1cm5zIG91dCB0aGF0IGV2ZXJ5IG9iamVjdCBpbiB0aGUgZ2l0IGhpc3RvcnkgaXMgc3RvcmVkIHVuZGVyCitzdWNoIGEgNDAtZGlnaXQgaGV4IG5hbWUuICBUaGF0IG5hbWUgaXMgdGhlIFNIQTEgaGFzaCBvZiB0aGUgb2JqZWN0J3MKK2NvbnRlbnRzOyBhbW9uZyBvdGhlciB0aGluZ3MsIHRoaXMgZW5zdXJlcyB0aGF0IGdpdCB3aWxsIG5ldmVyIHN0b3JlCit0aGUgc2FtZSBkYXRhIHR3aWNlIChzaW5jZSBpZGVudGljYWwgZGF0YSBpcyBnaXZlbiBhbiBpZGVudGljYWwgU0hBMQorbmFtZSksIGFuZCB0aGF0IHRoZSBjb250ZW50cyBvZiBhIGdpdCBvYmplY3Qgd2lsbCBuZXZlciBjaGFuZ2UgKHNpbmNlCit0aGF0IHdvdWxkIGNoYW5nZSB0aGUgb2JqZWN0J3MgbmFtZSBhcyB3ZWxsKS4KKworV2UgY2FuIGFzayBnaXQgYWJvdXQgdGhpcyBwYXJ0aWN1bGFyIG9iamVjdCB3aXRoIHRoZSBjYXQtZmlsZQorY29tbWFuZC0tanVzdCBjdXQtYW5kLXBhc3RlIGZyb20gdGhlIHJlcGx5IHRvIHRoZSBpbml0aWFsIGNvbW1pdCwgdG8KK3NhdmUgeW91cnNlbGYgdHlwaW5nIGFsbCA0MCBoZXggZGlnaXRzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNhdC1maWxlIC10IDkyYjhiNjk0ZmZiMTY3NWU1OTc1MTQ4ZTExMjE4MTAwODFkYmRmZmUKK3RyZWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHRyZWUgY2FuIHJlZmVyIHRvIG9uZSBvciBtb3JlICJibG9iIiBvYmplY3RzLCBlYWNoIGNvcnJlc3BvbmRpbmcgdG8KK2EgZmlsZS4gIEluIGFkZGl0aW9uLCBhIHRyZWUgY2FuIGFsc28gcmVmZXIgdG8gb3RoZXIgdHJlZSBvYmplY3RzLAordGh1cyBjcmVhdGluZyBhIGRpcmVjdG9yeSBoaWVyYXJjaHkuICBZb3UgY2FuIGV4YW1pbmUgdGhlIGNvbnRlbnRzIG9mCithbnkgdHJlZSB1c2luZyBscy10cmVlIChyZW1lbWJlciB0aGF0IGEgbG9uZyBlbm91Z2ggaW5pdGlhbCBwb3J0aW9uCitvZiB0aGUgU0hBMSB3aWxsIGFsc28gd29yayk6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtdHJlZSA5MmI4YjY5NAorMTAwNjQ0IGJsb2IgM2IxOGU1MTJkYmE3OWU0YzgzMDBkZDA4YWViMzdmOGU3MjhiOGRhZCAgICBmaWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RodXMgd2Ugc2VlIHRoYXQgdGhpcyB0cmVlIGhhcyBvbmUgZmlsZSBpbiBpdC4gIFRoZSBTSEExIGhhc2ggaXMgYQorcmVmZXJlbmNlIHRvIHRoYXQgZmlsZSdzIGRhdGE6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY2F0LWZpbGUgLXQgM2IxOGU1MTIKK2Jsb2IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBICJibG9iIiBpcyBqdXN0IGZpbGUgZGF0YSwgd2hpY2ggd2UgY2FuIGFsc28gZXhhbWluZSB3aXRoIGNhdC1maWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNhdC1maWxlIGJsb2IgM2IxOGU1MTIKK2hlbGxvIHdvcmxkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9sZCBmaWxlIGRhdGE7IHNvIHRoZSBvYmplY3QgdGhhdCBnaXQgbmFtZWQgaW4KK2l0cyByZXNwb25zZSB0byB0aGUgaW5pdGlhbCB0cmVlIHdhcyBhIHRyZWUgd2l0aCBhIHNuYXBzaG90IG9mIHRoZQorZGlyZWN0b3J5IHN0YXRlIHRoYXQgd2FzIHJlY29yZGVkIGJ5IHRoZSBmaXJzdCBjb21taXQuCisKK0FsbCBvZiB0aGVzZSBvYmplY3RzIGFyZSBzdG9yZWQgdW5kZXIgdGhlaXIgU0hBMSBuYW1lcyBpbnNpZGUgdGhlIGdpdAorZGlyZWN0b3J5OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZmluZCAuZ2l0L29iamVjdHMvCisuZ2l0L29iamVjdHMvCisuZ2l0L29iamVjdHMvcGFjaworLmdpdC9vYmplY3RzL2luZm8KKy5naXQvb2JqZWN0cy8zYgorLmdpdC9vYmplY3RzLzNiLzE4ZTUxMmRiYTc5ZTRjODMwMGRkMDhhZWIzN2Y4ZTcyOGI4ZGFkCisuZ2l0L29iamVjdHMvOTIKKy5naXQvb2JqZWN0cy85Mi9iOGI2OTRmZmIxNjc1ZTU5NzUxNDhlMTEyMTgxMDA4MWRiZGZmZQorLmdpdC9vYmplY3RzLzU0CisuZ2l0L29iamVjdHMvNTQvMTk2Y2MyNzAzZGMxNjVjYmQzNzNhNjVhNGRjZjIyZDUwYWU3ZjcKKy5naXQvb2JqZWN0cy9hMAorLmdpdC9vYmplY3RzL2EwLzQyMzg5Njk3MzY0NDc3MTQ5N2JkYzAzZWI5OWQ1MjgxNjE1YjUxCisuZ2l0L29iamVjdHMvZDAKKy5naXQvb2JqZWN0cy9kMC80OTJiMzY4YjY2YmRhYmYyYWMxZmQ4YzkyYjM5ZDNkYjkxNmU1OQorLmdpdC9vYmplY3RzL2M0CisuZ2l0L29iamVjdHMvYzQvZDU5ZjM5MGI5Y2ZkNDMxODExN2FmZGUxMWQ2MDFjMTA4NWYyNDEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbmQgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIGZpbGVzIGlzIGp1c3QgdGhlIGNvbXByZXNzZWQgZGF0YSBwbHVzIGEKK2hlYWRlciBpZGVudGlmeWluZyB0aGVpciBsZW5ndGggYW5kIHRoZWlyIHR5cGUuICBUaGUgdHlwZSBpcyBlaXRoZXIgYQorYmxvYiwgYSB0cmVlLCBhIGNvbW1pdCwgb3IgYSB0YWcuICBXZSd2ZSBzZWVuIGEgYmxvYiBhbmQgYSB0cmVlIG5vdywKK3NvIG5leHQgd2Ugc2hvdWxkIGxvb2sgYXQgYSBjb21taXQuCisKK1RoZSBzaW1wbGVzdCBjb21taXQgdG8gZmluZCBpcyB0aGUgSEVBRCBjb21taXQsIHdoaWNoIHdlIGNhbiBmaW5kCitmcm9tIC5naXQvSEVBRDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGNhdCAuZ2l0L0hFQUQKK3JlZjogcmVmcy9oZWFkcy9tYXN0ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB5b3UgY2FuIHNlZSwgdGhpcyB0ZWxscyB1cyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IG9uLCBhbmQgaXQKK3RlbGxzIHVzIHRoaXMgYnkgbmFtaW5nIGEgZmlsZSB1bmRlciB0aGUgLmdpdCBkaXJlY3RvcnksIHdoaWNoIGl0c2VsZgorY29udGFpbnMgYSBTSEExIG5hbWUgcmVmZXJyaW5nIHRvIGEgY29tbWl0IG9iamVjdCwgd2hpY2ggd2UgY2FuCitleGFtaW5lIHdpdGggY2F0LWZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBjYXQgLmdpdC9yZWZzL2hlYWRzL21hc3RlcgorYzRkNTlmMzkwYjljZmQ0MzE4MTE3YWZkZTExZDYwMWMxMDg1ZjI0MQorJCBnaXQgY2F0LWZpbGUgLXQgYzRkNTlmMzkKK2NvbW1pdAorJCBnaXQgY2F0LWZpbGUgY29tbWl0IGM0ZDU5ZjM5Cit0cmVlIGQwNDkyYjM2OGI2NmJkYWJmMmFjMWZkOGM5MmIzOWQzZGI5MTZlNTkKK3BhcmVudCA1NDE5NmNjMjcwM2RjMTY1Y2JkMzczYTY1YTRkY2YyMmQ1MGFlN2Y3CithdXRob3IgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHB1enpsZS5maWVsZHNlcy5vcmc+IDExNDM0MTg3MDIgLTA1MDAKK2NvbW1pdHRlciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxODcwMiAtMDUwMAorCithZGQgZW1waGFzaXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgInRyZWUiIG9iamVjdCBoZXJlIHJlZmVycyB0byB0aGUgbmV3IHN0YXRlIG9mIHRoZSB0cmVlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxzLXRyZWUgZDA0OTJiMzYKKzEwMDY0NCBibG9iIGEwNDIzODk2OTczNjQ0NzcxNDk3YmRjMDNlYjk5ZDUyODE2MTViNTEgICAgZmlsZS50eHQKKyQgZ2l0IGNhdC1maWxlIGJsb2IgYTA0MjM4OTYKK2hlbGxvIHdvcmxkIQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2FuZCB0aGUgInBhcmVudCIgb2JqZWN0IHJlZmVycyB0byB0aGUgcHJldmlvdXMgY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0LWNhdC1maWxlIGNvbW1pdCA1NDE5NmNjMgordHJlZSA5MmI4YjY5NGZmYjE2NzVlNTk3NTE0OGUxMTIxODEwMDgxZGJkZmZlCithdXRob3IgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHB1enpsZS5maWVsZHNlcy5vcmc+IDExNDM0MTQ2NjggLTA1MDAKK2NvbW1pdHRlciBKLiBCcnVjZSBGaWVsZHMgPGJmaWVsZHNAcHV6emxlLmZpZWxkc2VzLm9yZz4gMTE0MzQxNDY2OCAtMDUwMAorCitpbml0aWFsIGNvbW1pdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0cmVlIG9iamVjdCBpcyB0aGUgdHJlZSB3ZSBleGFtaW5lZCBmaXJzdCwgYW5kIHRoaXMgY29tbWl0IGlzCit1bnVzdWFsIGluIHRoYXQgaXQgbGFja3MgYW55IHBhcmVudC4KKworTW9zdCBjb21taXRzIGhhdmUgb25seSBvbmUgcGFyZW50LCBidXQgaXQgaXMgYWxzbyBjb21tb24gZm9yIGEgY29tbWl0Cit0byBoYXZlIG11bHRpcGxlIHBhcmVudHMuICAgSW4gdGhhdCBjYXNlIHRoZSBjb21taXQgcmVwcmVzZW50cyBhCittZXJnZSwgd2l0aCB0aGUgcGFyZW50IHJlZmVyZW5jZXMgcG9pbnRpbmcgdG8gdGhlIGhlYWRzIG9mIHRoZSBtZXJnZWQKK2JyYW5jaGVzLgorCitCZXNpZGVzIGJsb2JzLCB0cmVlcywgYW5kIGNvbW1pdHMsIHRoZSBvbmx5IHJlbWFpbmluZyB0eXBlIG9mIG9iamVjdAoraXMgYSAidGFnIiwgd2hpY2ggd2Ugd29uJ3QgZGlzY3VzcyBoZXJlOyByZWZlciB0byBnaXRsaW5rOmdpdC10YWdbMV0KK2ZvciBkZXRhaWxzLgorCitTbyBub3cgd2Uga25vdyBob3cgZ2l0IHVzZXMgdGhlIG9iamVjdCBkYXRhYmFzZSB0byByZXByZXNlbnQgYQorcHJvamVjdCdzIGhpc3Rvcnk6CisKKyAgKiAiY29tbWl0IiBvYmplY3RzIHJlZmVyIHRvICJ0cmVlIiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUKKyAgICBzbmFwc2hvdCBvZiBhIGRpcmVjdG9yeSB0cmVlIGF0IGEgcGFydGljdWxhciBwb2ludCBpbiB0aGUKKyAgICBoaXN0b3J5LCBhbmQgcmVmZXIgdG8gInBhcmVudCIgY29tbWl0cyB0byBzaG93IGhvdyB0aGV5J3JlCisgICAgY29ubmVjdGVkIGludG8gdGhlIHByb2plY3QgaGlzdG9yeS4KKyAgKiAidHJlZSIgb2JqZWN0cyByZXByZXNlbnQgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIGRpcmVjdG9yeSwKKyAgICBhc3NvY2lhdGluZyBkaXJlY3RvcnkgbmFtZXMgdG8gImJsb2IiIG9iamVjdHMgY29udGFpbmluZyBmaWxlCisgICAgZGF0YSBhbmQgInRyZWUiIG9iamVjdHMgY29udGFpbmluZyBzdWJkaXJlY3RvcnkgaW5mb3JtYXRpb24uCisgICogImJsb2IiIG9iamVjdHMgY29udGFpbiBmaWxlIGRhdGEgd2l0aG91dCBhbnkgb3RoZXIgc3RydWN0dXJlLgorICAqIFJlZmVyZW5jZXMgdG8gY29tbWl0IG9iamVjdHMgYXQgdGhlIGhlYWQgb2YgZWFjaCBicmFuY2ggYXJlCisgICAgc3RvcmVkIGluIGZpbGVzIHVuZGVyIC5naXQvcmVmcy9oZWFkcy8uCisgICogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgYnJhbmNoIGlzIHN0b3JlZCBpbiAuZ2l0L0hFQUQuCisKK05vdGUsIGJ5IHRoZSB3YXksIHRoYXQgbG90cyBvZiBjb21tYW5kcyB0YWtlIGEgdHJlZSBhcyBhbiBhcmd1bWVudC4KK0J1dCBhcyB3ZSBjYW4gc2VlIGFib3ZlLCBhIHRyZWUgY2FuIGJlIHJlZmVycmVkIHRvIGluIG1hbnkgZGlmZmVyZW50Cit3YXlzLS1ieSB0aGUgU0hBMSBuYW1lIGZvciB0aGF0IHRyZWUsIGJ5IHRoZSBuYW1lIG9mIGEgY29tbWl0IHRoYXQKK3JlZmVycyB0byB0aGUgdHJlZSwgYnkgdGhlIG5hbWUgb2YgYSBicmFuY2ggd2hvc2UgaGVhZCByZWZlcnMgdG8gdGhhdAordHJlZSwgZXRjLi0tYW5kIG1vc3Qgc3VjaCBjb21tYW5kcyBjYW4gYWNjZXB0IGFueSBvZiB0aGVzZSBuYW1lcy4KKworSW4gY29tbWFuZCBzeW5vcHNlcywgdGhlIHdvcmQgInRyZWUtaXNoIiBpcyBzb21ldGltZXMgdXNlZCB0bworZGVzaWduYXRlIHN1Y2ggYW4gYXJndW1lbnQuCisKK1RoZSBpbmRleCBmaWxlCistLS0tLS0tLS0tLS0tLQorCitUaGUgcHJpbWFyeSB0b29sIHdlJ3ZlIGJlZW4gdXNpbmcgdG8gY3JlYXRlIGNvbW1pdHMgaXMgImdpdCBjb21taXQKKy1hIiwgd2hpY2ggY3JlYXRlcyBhIGNvbW1pdCBpbmNsdWRpbmcgZXZlcnkgY2hhbmdlIHlvdSd2ZSBtYWRlIHRvCit5b3VyIHdvcmtpbmcgdHJlZS4gIEJ1dCB3aGF0IGlmIHlvdSB3YW50IHRvIGNvbW1pdCBjaGFuZ2VzIG9ubHkgdG8KK2NlcnRhaW4gZmlsZXM/ICBPciBvbmx5IGNlcnRhaW4gY2hhbmdlcyB0byBjZXJ0YWluIGZpbGVzPworCitJZiB3ZSBsb29rIGF0IHRoZSB3YXkgY29tbWl0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGUgY292ZXIsIHdlJ2xsIHNlZQordGhhdCB0aGVyZSBhcmUgbW9yZSBmbGV4aWJsZSB3YXlzIGNyZWF0aW5nIGNvbW1pdHMuCisKK0NvbnRpbnVpbmcgd2l0aCBvdXIgdGVzdC1wcm9qZWN0LCBsZXQncyBtb2RpZnkgZmlsZS50eHQgYWdhaW46CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICJoZWxsbyB3b3JsZCwgYWdhaW4iID4+ZmlsZS50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitidXQgdGhpcyB0aW1lIGluc3RlYWQgb2YgaW1tZWRpYXRlbHkgbWFraW5nIHRoZSBjb21taXQsIGxldCdzIHRha2UgYW4KK2ludGVybWVkaWF0ZSBzdGVwLCBhbmQgYXNrIGZvciBkaWZmcyBhbG9uZyB0aGUgd2F5IHRvIGtlZXAgdHJhY2sgb2YKK3doYXQncyBoYXBwZW5pbmc6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSArMSwyIEBACisgaGVsbG8gd29ybGQhCisraGVsbG8gd29ybGQsIGFnYWluCiskIGdpdCB1cGRhdGUtaW5kZXggZmlsZS50eHQKKyQgZ2l0IGRpZmYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbGFzdCBkaWZmIGlzIGVtcHR5LCBidXQgbm8gbmV3IGNvbW1pdHMgaGF2ZSBiZWVuIG1hZGUsIGFuZCB0aGUKK2hlYWQgc3RpbGwgZG9lc24ndCBjb250YWluIHRoZSBuZXcgbGluZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1kaWZmIEhFQUQKK2RpZmYgLS1naXQgYS9maWxlLnR4dCBiL2ZpbGUudHh0CitpbmRleCBhMDQyMzg5Li41MTNmZWJhIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSArMSwyIEBACisgaGVsbG8gd29ybGQhCisraGVsbG8gd29ybGQsIGFnYWluCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU28gImdpdCBkaWZmIiBpcyBjb21wYXJpbmcgYWdhaW5zdCBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgaGVhZC4KK1RoZSB0aGluZyB0aGF0IGl0J3MgY29tcGFyaW5nIGFnYWluc3QgaXMgYWN0dWFsbHkgdGhlIGluZGV4IGZpbGUsCit3aGljaCBpcyBzdG9yZWQgaW4gLmdpdC9pbmRleCBpbiBhIGJpbmFyeSBmb3JtYXQsIGJ1dCB3aG9zZSBjb250ZW50cword2UgY2FuIGV4YW1pbmUgd2l0aCBscy1maWxlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBscy1maWxlcyAtLXN0YWdlCisxMDA2NDQgNTEzZmViYTJlNTNlYmJkMjUzMjQxOWRlZDg0OGJhMTlkZTg4YmEwMCAwICAgICAgIGZpbGUudHh0CiskIGdpdCBjYXQtZmlsZSAtdCA1MTNmZWJhMgorYmxvYgorJCBnaXQgY2F0LWZpbGUgYmxvYiA1MTNmZWJhMgoraGVsbG8gd29ybGQhCitoZWxsbyB3b3JsZCwgYWdhaW4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyB3aGF0IG91ciAiZ2l0IHVwZGF0ZS1pbmRleCIgZGlkIHdhcyBzdG9yZSBhIG5ldyBibG9iIGFuZCB0aGVuIHB1dAorYSByZWZlcmVuY2UgdG8gaXQgaW4gdGhlIGluZGV4IGZpbGUuICBJZiB3ZSBtb2RpZnkgdGhlIGZpbGUgYWdhaW4sCit3ZSdsbCBzZWUgdGhhdCB0aGUgbmV3IG1vZGlmaWNhdGlvbnMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgImdpdC1kaWZmIgorb3V0cHV0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZWNobyAnYWdhaW4/JyA+PmZpbGUudHh0CiskIGdpdCBkaWZmCitpbmRleCA1MTNmZWJhLi5iYTNkYTdiIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSwyICsxLDMgQEAKKyBoZWxsbyB3b3JsZCEKKyBoZWxsbyB3b3JsZCwgYWdhaW4KKythZ2Fpbj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaXRoIHRoZSByaWdodCBhcmd1bWVudHMsIGdpdCBkaWZmIGNhbiBhbHNvIHNob3cgdXMgdGhlIGRpZmZlcmVuY2UKK2JldHdlZW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCB0aGUgbGFzdCBjb21taXQsIG9yIGJldHdlZW4gdGhlCitpbmRleCBhbmQgdGhlIGxhc3QgY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGRpZmYgSEVBRAorZGlmZiAtLWdpdCBhL2ZpbGUudHh0IGIvZmlsZS50eHQKK2luZGV4IGEwNDIzODkuLmJhM2RhN2IgMTAwNjQ0CistLS0gYS9maWxlLnR4dAorKysrIGIvZmlsZS50eHQKK0BAIC0xICsxLDMgQEAKKyBoZWxsbyB3b3JsZCEKKytoZWxsbyB3b3JsZCwgYWdhaW4KKythZ2Fpbj8KKyQgZ2l0IGRpZmYgLS1jYWNoZWQKK2RpZmYgLS1naXQgYS9maWxlLnR4dCBiL2ZpbGUudHh0CitpbmRleCBhMDQyMzg5Li41MTNmZWJhIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSArMSwyIEBACisgaGVsbG8gd29ybGQhCisraGVsbG8gd29ybGQsIGFnYWluCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQXQgYW55IHRpbWUsIHdlIGNhbiBjcmVhdGUgYSBuZXcgY29tbWl0IHVzaW5nICJnaXQgY29tbWl0IiAod2l0aG91dAordGhlIC1hIG9wdGlvbiksIGFuZCB2ZXJpZnkgdGhhdCB0aGUgc3RhdGUgY29tbWl0dGVkIG9ubHkgaW5jbHVkZXMgdGhlCitjaGFuZ2VzIHN0b3JlZCBpbiB0aGUgaW5kZXggZmlsZSwgbm90IHRoZSBhZGRpdGlvbmFsIGNoYW5nZSB0aGF0IGlzCitzdGlsbCBvbmx5IGluIG91ciB3b3JraW5nIHRyZWU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgY29tbWl0IC1tICJyZXBlYXQiCiskIGdpdCBkaWZmIEhFQUQKK2RpZmYgLS1naXQgYS9maWxlLnR4dCBiL2ZpbGUudHh0CitpbmRleCA1MTNmZWJhLi5iYTNkYTdiIDEwMDY0NAorLS0tIGEvZmlsZS50eHQKKysrKyBiL2ZpbGUudHh0CitAQCAtMSwyICsxLDMgQEAKKyBoZWxsbyB3b3JsZCEKKyBoZWxsbyB3b3JsZCwgYWdhaW4KKythZ2Fpbj8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTbyBieSBkZWZhdWx0ICJnaXQgY29tbWl0IiB1c2VzIHRoZSBpbmRleCB0byBjcmVhdGUgdGhlIGNvbW1pdCwgbm90Cit0aGUgd29ya2luZyB0cmVlOyB0aGUgLWEgb3B0aW9uIHRvIGNvbW1pdCB0ZWxscyBpdCB0byBmaXJzdCB1cGRhdGUKK3RoZSBpbmRleCB3aXRoIGFsbCBjaGFuZ2VzIGluIHRoZSB3b3JraW5nIHRyZWUuCisKK0ZpbmFsbHksIGl0J3Mgd29ydGggbG9va2luZyBhdCB0aGUgZWZmZWN0IG9mICJnaXQgYWRkIiBvbiB0aGUgaW5kZXgKK2ZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBlY2hvICJnb29kYnllLCB3b3JsZCIgPmNsb3NpbmcudHh0CiskIGdpdCBhZGQgY2xvc2luZy50eHQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZWZmZWN0IG9mIHRoZSAiZ2l0IGFkZCIgd2FzIHRvIGFkZCBvbmUgZW50cnkgdG8gdGhlIGluZGV4IGZpbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbHMtZmlsZXMgLS1zdGFnZQorMTAwNjQ0IDhiOTc0M2IyMGQ0YjE1YmUzOTU1ZmM4ZDVjZDJiMDljZDIzMzYxMzggMCAgICAgICBjbG9zaW5nLnR4dAorMTAwNjQ0IDUxM2ZlYmEyZTUzZWJiZDI1MzI0MTlkZWQ4NDhiYTE5ZGU4OGJhMDAgMCAgICAgICBmaWxlLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FuZCwgYXMgeW91IGNhbiBzZWUgd2l0aCBjYXQtZmlsZSwgdGhpcyBuZXcgZW50cnkgcmVmZXJzIHRvIHRoZQorY3VycmVudCBjb250ZW50cyBvZiB0aGUgZmlsZToKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSBibG9iIGE2YjExZjdhCitnb29kYnllLCB3b3JkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlICJzdGF0dXMiIGNvbW1hbmQgaXMgYSB1c2VmdWwgd2F5IHRvIGdldCBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlCitzaXR1YXRpb246CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgc3RhdHVzCisjCisjIFVwZGF0ZWQgYnV0IG5vdCBjaGVja2VkIGluOgorIyAgICh3aWxsIGNvbW1pdCkKKyMKKyMgICAgICAgbmV3IGZpbGU6IGNsb3NpbmcudHh0CisjCisjCisjIENoYW5nZWQgYnV0IG5vdCB1cGRhdGVkOgorIyAgICh1c2UgZ2l0LXVwZGF0ZS1pbmRleCB0byBtYXJrIGZvciBjb21taXQpCisjCisjICAgICAgIG1vZGlmaWVkOiBmaWxlLnR4dAorIworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIHRoZSBjdXJyZW50IHN0YXRlIG9mIGNsb3NpbmcudHh0IGlzIGNhY2hlZCBpbiB0aGUgaW5kZXggZmlsZSwKK2l0IGlzIGxpc3RlZCBhcyAidXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iLiAgU2luY2UgZmlsZS50eHQgaGFzCitjaGFuZ2VzIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0aGF0IGFyZW4ndCByZWZsZWN0ZWQgaW4gdGhlIGluZGV4LAoraXQgaXMgbWFya2VkICJjaGFuZ2VkIGJ1dCBub3QgdXBkYXRlZCIuICBBdCB0aGlzIHBvaW50LCBydW5uaW5nICJnaXQKK2NvbW1pdCIgd291bGQgY3JlYXRlIGEgY29tbWl0IHRoYXQgYWRkZWQgY2xvc2luZy50eHQgKHdpdGggaXRzIG5ldworY29udGVudHMpLCBidXQgdGhhdCBkaWRuJ3QgbW9kaWZ5IGZpbGUudHh0LgorCitBbHNvLCBub3RlIHRoYXQgYSBiYXJlICJnaXQgZGlmZiIgc2hvd3MgdGhlIGNoYW5nZXMgdG8gZmlsZS50eHQsIGJ1dAorbm90IHRoZSBhZGRpdGlvbiBvZiBjbG9zaW5nLnR4dCwgYmVjYXVzZSB0aGUgdmVyc2lvbiBvZiBjbG9zaW5nLnR4dAoraW4gdGhlIGluZGV4IGZpbGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgorCitJbiBhZGRpdGlvbiB0byBiZWluZyB0aGUgc3RhZ2luZyBhcmVhIGZvciBuZXcgY29tbWl0cywgdGhlIGluZGV4IGZpbGUKK2lzIGFsc28gcG9wdWxhdGVkIGZyb20gdGhlIG9iamVjdCBkYXRhYmFzZSB3aGVuIGNoZWNraW5nIG91dCBhCiticmFuY2gsIGFuZCBpcyB1c2VkIHRvIGhvbGQgdGhlIHRyZWVzIGludm9sdmVkIGluIGEgbWVyZ2Ugb3BlcmF0aW9uLgorU2VlIHRoZSBsaW5rOmNvcmUtdHV0b3JpYWwudHh0W2NvcmUgdHV0b3JpYWxdIGFuZCB0aGUgcmVsZXZhbnQgbWFuCitwYWdlcyBmb3IgZGV0YWlscy4KKworV2hhdCBuZXh0PworLS0tLS0tLS0tLQorCitBdCB0aGlzIHBvaW50IHlvdSBzaG91bGQga25vdyBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byByZWFkIHRoZSBtYW4KK3BhZ2VzIGZvciBhbnkgb2YgdGhlIGdpdCBjb21tYW5kczsgb25lIGdvb2QgcGxhY2UgdG8gc3RhcnQgd291bGQgYmUKK3dpdGggdGhlIGNvbW1hbmRzIG1lbnRpb25lZCBpbiBsaW5rOmV2ZXJ5ZGF5Lmh0bWxbRXZlcnlkYXkgZ2l0XS4gIFlvdQorc2hvdWxkIGJlIGFibGUgdG8gZmluZCBhbnkgdW5rbm93biBqYXJnb24gaW4gdGhlCitsaW5rOmdsb3NzYXJ5Lmh0bWxbR2xvc3NhcnldLgorCitUaGUgbGluazpjdnMtbWlncmF0aW9uLmh0bWxbQ1ZTIG1pZ3JhdGlvbl0gZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvCitpbXBvcnQgYSBDVlMgcmVwb3NpdG9yeSBpbnRvIGdpdCwgYW5kIHNob3dzIGhvdyB0byB1c2UgZ2l0IGluIGEKK0NWUy1saWtlIHdheS4KKworRm9yIHNvbWUgaW50ZXJlc3RpbmcgZXhhbXBsZXMgb2YgZ2l0IHVzZSwgc2VlIHRoZQorbGluazpob3d0by1pbmRleC5odG1sW2hvd3Rvc10uCisKK0ZvciBnaXQgZGV2ZWxvcGVycywgdGhlIGxpbms6Y29yZS10dXRvcmlhbC5odG1sW0NvcmUgdHV0b3JpYWxdIGdvZXMKK2ludG8gZGV0YWlsIG9uIHRoZSBsb3dlci1sZXZlbCBnaXQgbWVjaGFuaXNtcyBpbnZvbHZlZCBpbiwgZm9yCitleGFtcGxlLCBjcmVhdGluZyBhIG5ldyBjb21taXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdHV0b3JpYWwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3R1dG9yaWFsLnR4dApAQCAtMCwwICsxLDQ4NyBAQAorQSB0dXRvcmlhbCBpbnRyb2R1Y3Rpb24gdG8gZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyB0dXRvcmlhbCBleHBsYWlucyBob3cgdG8gaW1wb3J0IGEgbmV3IHByb2plY3QgaW50byBnaXQsIG1ha2UKK2NoYW5nZXMgdG8gaXQsIGFuZCBzaGFyZSBjaGFuZ2VzIHdpdGggb3RoZXIgZGV2ZWxvcGVycy4KKworRmlyc3QsIG5vdGUgdGhhdCB5b3UgY2FuIGdldCBkb2N1bWVudGF0aW9uIGZvciBhIGNvbW1hbmQgc3VjaCBhcyAiZ2l0CitkaWZmIiB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgbWFuIGdpdC1kaWZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW1wb3J0aW5nIGEgbmV3IHByb2plY3QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Fzc3VtZSB5b3UgaGF2ZSBhIHRhcmJhbGwgcHJvamVjdC50YXIuZ3ogd2l0aCB5b3VyIGluaXRpYWwgd29yay4gIFlvdQorY2FuIHBsYWNlIGl0IHVuZGVyIGdpdCByZXZpc2lvbiBjb250cm9sIGFzIGZvbGxvd3MuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCB0YXIgeHpmIHByb2plY3QudGFyLmd6CiskIGNkIHByb2plY3QKKyQgZ2l0IGluaXQtZGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgd2lsbCByZXBseQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlZmF1bHRpbmcgdG8gbG9jYWwgc3RvcmFnZSBhcmVhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91J3ZlIG5vdyBpbml0aWFsaXplZCB0aGUgd29ya2luZyBkaXJlY3RvcnktLXlvdSBtYXkgbm90aWNlIGEgbmV3CitkaXJlY3RvcnkgY3JlYXRlZCwgbmFtZWQgIi5naXQiLiAgVGVsbCBnaXQgdGhhdCB5b3Ugd2FudCBpdCB0byB0cmFjaworZXZlcnkgZmlsZSB1bmRlciB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2l0aAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGFkZCAuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmluYWxseSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjb21taXQgLWEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit3aWxsIHByb21wdCB5b3UgZm9yIGEgY29tbWl0IG1lc3NhZ2UsIHRoZW4gcmVjb3JkIHRoZSBjdXJyZW50IHN0YXRlCitvZiBhbGwgdGhlIGZpbGVzIHRvIHRoZSByZXBvc2l0b3J5LgorCitUcnkgbW9kaWZ5aW5nIHNvbWUgZmlsZXMsIHRoZW4gcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RvIHJldmlldyB5b3VyIGNoYW5nZXMuICBXaGVuIHlvdSdyZSBkb25lLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgYWdhaW4gcHJvbXB0IHlvdXIgZm9yIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBjaGFuZ2UsIGFuZCB0aGVuCityZWNvcmQgdGhlIG5ldyB2ZXJzaW9ucyBvZiB0aGUgbW9kaWZpZWQgZmlsZXMuCisKK0Egbm90ZSBvbiBjb21taXQgbWVzc2FnZXM6IFRob3VnaCBub3QgcmVxdWlyZWQsIGl0J3MgYSBnb29kIGlkZWEgdG8KK2JlZ2luIHRoZSBjb21taXQgbWVzc2FnZSB3aXRoIGEgc2luZ2xlIHNob3J0IChsZXNzIHRoYW4gNTAgY2hhcmFjdGVyKQorbGluZSBzdW1tYXJpemluZyB0aGUgY2hhbmdlLCBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUgYW5kIHRoZW4gYSBtb3JlCit0aG9yb3VnaCBkZXNjcmlwdGlvbi4gIFRvb2xzIHRoYXQgdHVybiBjb21taXRzIGludG8gZW1haWwsIGZvcgorZXhhbXBsZSwgdXNlIHRoZSBmaXJzdCBsaW5lIG9uIHRoZSBTdWJqZWN0IGxpbmUgYW5kIHRoZSByZXN0IG9mIHRoZQorY29tbWl0IGluIHRoZSBib2R5LgorCitUbyBhZGQgYSBuZXcgZmlsZSwgZmlyc3QgY3JlYXRlIHRoZSBmaWxlLCB0aGVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYWRkIHBhdGgvdG8vbmV3L2ZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0aGVuIGNvbW1pdCBhcyB1c3VhbC4gIE5vIHNwZWNpYWwgY29tbWFuZCBpcyByZXF1aXJlZCB3aGVuIHJlbW92aW5nIGEKK2ZpbGU7IGp1c3QgcmVtb3ZlIGl0LCB0aGVuIGNvbW1pdC4KKworQXQgYW55IHBvaW50IHlvdSBjYW4gdmlldyB0aGUgaGlzdG9yeSBvZiB5b3VyIGNoYW5nZXMgdXNpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYWxzbyB3YW50IHRvIHNlZSBjb21wbGV0ZSBkaWZmcyBhdCBlYWNoIHN0ZXAsIHVzZQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyAtcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01hbmFnaW5nIGJyYW5jaGVzCistLS0tLS0tLS0tLS0tLS0tLQorCitBIHNpbmdsZSBnaXQgcmVwb3NpdG9yeSBjYW4gbWFpbnRhaW4gbXVsdGlwbGUgYnJhbmNoZXMgb2YKK2RldmVsb3BtZW50LiAgVG8gY3JlYXRlIGEgbmV3IGJyYW5jaCBuYW1lZCAiZXhwZXJpbWVudGFsIiwgdXNlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoIGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBub3cgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworeW91J2xsIGdldCBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGJyYW5jaGVzOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZXhwZXJpbWVudGFsCisqIG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAiZXhwZXJpbWVudGFsIiBicmFuY2ggaXMgdGhlIG9uZSB5b3UganVzdCBjcmVhdGVkLCBhbmQgdGhlCisibWFzdGVyIiBicmFuY2ggaXMgYSBkZWZhdWx0IGJyYW5jaCB0aGF0IHdhcyBjcmVhdGVkIGZvciB5b3UKK2F1dG9tYXRpY2FsbHkuICBUaGUgYXN0ZXJpc2sgbWFya3MgdGhlIGJyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSBvbjsKK3R5cGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjaGVja291dCBleHBlcmltZW50YWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0byBzd2l0Y2ggdG8gdGhlIGV4cGVyaW1lbnRhbCBicmFuY2guICBOb3cgZWRpdCBhIGZpbGUsIGNvbW1pdCB0aGUKK2NoYW5nZSwgYW5kIHN3aXRjaCBiYWNrIHRvIHRoZSBtYXN0ZXIgYnJhbmNoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhlZGl0IGZpbGUpCiskIGdpdCBjb21taXQgLWEKKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NoZWNrIHRoYXQgdGhlIGNoYW5nZSB5b3UgbWFkZSBpcyBubyBsb25nZXIgdmlzaWJsZSwgc2luY2UgaXQgd2FzCittYWRlIG9uIHRoZSBleHBlcmltZW50YWwgYnJhbmNoIGFuZCB5b3UncmUgYmFjayBvbiB0aGUgbWFzdGVyIGJyYW5jaC4KKworWW91IGNhbiBtYWtlIGEgZGlmZmVyZW50IGNoYW5nZSBvbiB0aGUgbWFzdGVyIGJyYW5jaDoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisoZWRpdCBmaWxlKQorJCBnaXQgY29tbWl0IC1hCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYXQgdGhpcyBwb2ludCB0aGUgdHdvIGJyYW5jaGVzIGhhdmUgZGl2ZXJnZWQsIHdpdGggZGlmZmVyZW50IGNoYW5nZXMKK21hZGUgaW4gZWFjaC4gIFRvIG1lcmdlIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIHR3byBicmFuY2hlcywgcnVuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbCAuIGV4cGVyaW1lbnRhbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBjaGFuZ2VzIGRvbid0IGNvbmZsaWN0LCB5b3UncmUgZG9uZS4gIElmIHRoZXJlIGFyZSBjb25mbGljdHMsCittYXJrZXJzIHdpbGwgYmUgbGVmdCBpbiB0aGUgcHJvYmxlbWF0aWMgZmlsZXMgc2hvd2luZyB0aGUgY29uZmxpY3Q7CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZGlmZgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGlzLiAgT25jZSB5b3UndmUgZWRpdGVkIHRoZSBmaWxlcyB0byByZXNvbHZlIHRoZQorY29uZmxpY3RzLAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNvbW1pdCAtYQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgY29tbWl0IHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLiBGaW5hbGx5LAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0aworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyBhIG5pY2UgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXN1bHRpbmcgaGlzdG9yeS4KKworSWYgeW91IGRldmVsb3Agb24gYSBicmFuY2ggY3JhenktaWRlYSwgdGhlbiByZWdyZXQgaXQsIHlvdSBjYW4gYWx3YXlzCitkZWxldGUgdGhlIGJyYW5jaCB3aXRoCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaCAtRCBjcmF6eS1pZGVhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JyYW5jaGVzIGFyZSBjaGVhcCBhbmQgZWFzeSwgc28gdGhpcyBpcyBhIGdvb2Qgd2F5IHRvIHRyeSBzb21ldGhpbmcKK291dC4KKworVXNpbmcgZ2l0IGZvciBjb2xsYWJvcmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU3VwcG9zZSB0aGF0IEFsaWNlIGhhcyBzdGFydGVkIGEgbmV3IHByb2plY3Qgd2l0aCBhIGdpdCByZXBvc2l0b3J5IGluCisvaG9tZS9hbGljZS9wcm9qZWN0LCBhbmQgdGhhdCBCb2IsIHdobyBoYXMgYSBob21lIGRpcmVjdG9yeSBvbiB0aGUKK3NhbWUgbWFjaGluZSwgd2FudHMgdG8gY29udHJpYnV0ZS4KKworQm9iIGJlZ2lucyB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNsb25lIC9ob21lL2FsaWNlL3Byb2plY3QgbXlyZXBvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBjcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSAibXlyZXBvIiBjb250YWluaW5nIGEgY2xvbmUgb2YgQWxpY2UncworcmVwb3NpdG9yeS4gIFRoZSBjbG9uZSBpcyBvbiBhbiBlcXVhbCBmb290aW5nIHdpdGggdGhlIG9yaWdpbmFsCitwcm9qZWN0LCBwb3NzZXNzaW5nIGl0cyBvd24gY29weSBvZiB0aGUgb3JpZ2luYWwgcHJvamVjdCdzIGhpc3RvcnkuCisKK0JvYiB0aGVuIG1ha2VzIHNvbWUgY2hhbmdlcyBhbmQgY29tbWl0cyB0aGVtOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhlZGl0IGZpbGVzKQorJCBnaXQgY29tbWl0IC1hCisocmVwZWF0IGFzIG5lY2Vzc2FyeSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIGhlJ3MgcmVhZHksIGhlIHRlbGxzIEFsaWNlIHRvIHB1bGwgY2hhbmdlcyBmcm9tIHRoZSByZXBvc2l0b3J5CithdCAvaG9tZS9ib2IvbXlyZXBvLiAgU2hlIGRvZXMgdGhpcyB3aXRoOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgY2QgL2hvbWUvYWxpY2UvcHJvamVjdAorJCBnaXQgcHVsbCAvaG9tZS9ib2IvbXlyZXBvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBhY3R1YWxseSBwdWxscyBjaGFuZ2VzIGZyb20gdGhlIGJyYW5jaCBpbiBCb2IncyByZXBvc2l0b3J5IG5hbWVkCisibWFzdGVyIi4gIEFsaWNlIGNvdWxkIHJlcXVlc3QgYSBkaWZmZXJlbnQgYnJhbmNoIGJ5IGFkZGluZyB0aGUgbmFtZQorb2YgdGhlIGJyYW5jaCB0byB0aGUgZW5kIG9mIHRoZSBnaXQgcHVsbCBjb21tYW5kIGxpbmUuCisKK1RoaXMgbWVyZ2VzIEJvYidzIGNoYW5nZXMgaW50byBoZXIgcmVwb3NpdG9yeTsgImdpdCBsb2ciIHdpbGwKK25vdyBzaG93IHRoZSBuZXcgY29tbWl0cy4gIElmIEFsaWNlIGhhcyBtYWRlIGhlciBvd24gY2hhbmdlcyBpbiB0aGUKK21lYW50aW1lLCB0aGVuIEJvYidzIGNoYW5nZXMgd2lsbCBiZSBtZXJnZWQgaW4sIGFuZCBzaGUgd2lsbCBuZWVkIHRvCittYW51YWxseSBmaXggYW55IGNvbmZsaWN0cy4KKworQSBtb3JlIGNhdXRpb3VzIEFsaWNlIG1pZ2h0IHdpc2ggdG8gZXhhbWluZSBCb2IncyBjaGFuZ2VzIGJlZm9yZQorcHVsbGluZyB0aGVtLiAgU2hlIGNhbiBkbyB0aGlzIGJ5IGNyZWF0aW5nIGEgdGVtcG9yYXJ5IGJyYW5jaCBqdXN0Citmb3IgdGhlIHB1cnBvc2Ugb2Ygc3R1ZHlpbmcgQm9iJ3MgY2hhbmdlczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZmV0Y2ggL2hvbWUvYm9iL215cmVwbyBtYXN0ZXI6Ym9iLWluY29taW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3doaWNoIGZldGNoZXMgdGhlIGNoYW5nZXMgZnJvbSBCb2IncyBtYXN0ZXIgYnJhbmNoIGludG8gYSBuZXcgYnJhbmNoCituYW1lZCBib2ItaW5jb21pbmcuICAoVW5saWtlIGdpdCBwdWxsLCBnaXQgZmV0Y2gganVzdCBmZXRjaGVzIGEgY29weQorb2YgQm9iJ3MgbGluZSBvZiBkZXZlbG9wbWVudCB3aXRob3V0IGRvaW5nIGFueSBtZXJnaW5nKS4gIFRoZW4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIC1wIG1hc3Rlci4uYm9iLWluY29taW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGNoYW5nZXMgdGhhdCBCb2IgbWFkZSBzaW5jZSBoZSBicmFuY2hlZCBmcm9tCitBbGljZSdzIG1hc3RlciBicmFuY2guCisKK0FmdGVyIGV4YW1pbmluZyB0aG9zZSBjaGFuZ2VzLCBhbmQgcG9zc2libHkgZml4aW5nIHRoaW5ncywgQWxpY2UgY2FuCitwdWxsIHRoZSBjaGFuZ2VzIGludG8gaGVyIG1hc3RlciBicmFuY2g6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGNoZWNrb3V0IG1hc3RlcgorJCBnaXQgcHVsbCAuIGJvYi1pbmNvbWluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbGFzdCBjb21tYW5kIGlzIGEgcHVsbCBmcm9tIHRoZSAiYm9iLWluY29taW5nIiBicmFuY2ggaW4gQWxpY2Uncworb3duIHJlcG9zaXRvcnkuCisKK0xhdGVyLCBCb2IgY2FuIHVwZGF0ZSBoaXMgcmVwbyB3aXRoIEFsaWNlJ3MgbGF0ZXN0IGNoYW5nZXMgdXNpbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgcHVsbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RlIHRoYXQgaGUgZG9lc24ndCBuZWVkIHRvIGdpdmUgdGhlIHBhdGggdG8gQWxpY2UncyByZXBvc2l0b3J5Oword2hlbiBCb2IgY2xvbmVkIEFsaWNlJ3MgcmVwb3NpdG9yeSwgZ2l0IHN0b3JlZCB0aGUgbG9jYXRpb24gb2YgaGVyCityZXBvc2l0b3J5IGluIHRoZSBmaWxlIC5naXQvcmVtb3Rlcy9vcmlnaW4sIGFuZCB0aGF0IGxvY2F0aW9uIGlzIHVzZWQKK2FzIHRoZSBkZWZhdWx0IGZvciBwdWxscy4KKworQm9iIG1heSBhbHNvIG5vdGljZSBhIGJyYW5jaCBpbiBoaXMgcmVwb3NpdG9yeSB0aGF0IGhlIGRpZG4ndCBjcmVhdGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGJyYW5jaAorKiBtYXN0ZXIKKyAgb3JpZ2luCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAib3JpZ2luIiBicmFuY2gsIHdoaWNoIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYnkgImdpdCBjbG9uZSIsCitpcyBhIHByaXN0aW5lIGNvcHkgb2YgQWxpY2UncyBtYXN0ZXIgYnJhbmNoOyBCb2Igc2hvdWxkIG5ldmVyIGNvbW1pdAordG8gaXQuCisKK0lmIEJvYiBsYXRlciBkZWNpZGVzIHRvIHdvcmsgZnJvbSBhIGRpZmZlcmVudCBob3N0LCBoZSBjYW4gc3RpbGwKK3BlcmZvcm0gY2xvbmVzIGFuZCBwdWxscyB1c2luZyB0aGUgc3NoIHByb3RvY29sOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjbG9uZSBhbGljZS5vcmc6L2hvbWUvYWxpY2UvcHJvamVjdCBteXJlcG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWx0ZXJuYXRpdmVseSwgZ2l0IGhhcyBhIG5hdGl2ZSBwcm90b2NvbCwgb3IgY2FuIHVzZSByc3luYyBvciBodHRwOworc2VlIGdpdGxpbms6Z2l0LXB1bGxbMV0gZm9yIGRldGFpbHMuCisKK0dpdCBjYW4gYWxzbyBiZSB1c2VkIGluIGEgQ1ZTLWxpa2UgbW9kZSwgd2l0aCBhIGNlbnRyYWwgcmVwb3NpdG9yeQordGhhdCB2YXJpb3VzIHVzZXJzIHB1c2ggY2hhbmdlcyB0bzsgc2VlIGdpdGxpbms6Z2l0LXB1c2hbMV0gYW5kCitsaW5rOmN2cy1taWdyYXRpb24uaHRtbFtnaXQgZm9yIENWUyB1c2Vyc10uCisKK0V4cGxvcmluZyBoaXN0b3J5CistLS0tLS0tLS0tLS0tLS0tLQorCitHaXQgaGlzdG9yeSBpcyByZXByZXNlbnRlZCBhcyBhIHNlcmllcyBvZiBpbnRlcnJlbGF0ZWQgY29tbWl0cy4gIFdlCitoYXZlIGFscmVhZHkgc2VlbiB0aGF0IHRoZSBnaXQgbG9nIGNvbW1hbmQgY2FuIGxpc3QgdGhvc2UgY29tbWl0cy4KK05vdGUgdGhhdCBmaXJzdCBsaW5lIG9mIGVhY2ggZ2l0IGxvZyBlbnRyeSBhbHNvIGdpdmVzIGEgbmFtZSBmb3IgdGhlCitjb21taXQ6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZworY29tbWl0IGM4MmEyMmMzOWNiYzMyNTc2ZjY0ZjVjNmIzZjI0Yjk5ZWE4MTQ5YzcKK0F1dGhvcjogSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorRGF0ZTogICBUdWUgTWF5IDE2IDE3OjE4OjIyIDIwMDYgLTA3MDAKKworICAgIG1lcmdlLWJhc2U6IENsYXJpZnkgdGhlIGNvbW1lbnRzIG9uIHBvc3QgcHJvY2Vzc2luZy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2UgY2FuIGdpdmUgdGhpcyBuYW1lIHRvIGdpdCBzaG93IHRvIHNlZSB0aGUgZGV0YWlscyBhYm91dCB0aGlzCitjb21taXQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgYzgyYTIyYzM5Y2JjMzI1NzZmNjRmNWM2YjNmMjRiOTllYTgxNDljNworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCdXQgdGhlcmUgb3RoZXIgd2F5cyB0byByZWZlciB0byBjb21taXRzLiAgWW91IGNhbiB1c2UgYW55IGluaXRpYWwKK3BhcnQgb2YgdGhlIG5hbWUgdGhhdCBpcyBsb25nIGVub3VnaCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29tbWl0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IGM4MmEyMmMzOWMJIyB0aGUgZmlyc3QgZmV3IGNoYXJhY3RlcnMgb2YgdGhlIG5hbWUgYXJlCisJCQkjIHVzdWFsbHkgZW5vdWdoCiskIGdpdCBzaG93IEhFQUQJCSMgdGhlIHRpcCBvZiB0aGUgY3VycmVudCBicmFuY2gKKyQgZ2l0IHNob3cgZXhwZXJpbWVudGFsCSMgdGhlIHRpcCBvZiB0aGUgImV4cGVyaW1lbnRhbCIgYnJhbmNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0V2ZXJ5IGNvbW1pdCBoYXMgYXQgbGVhc3Qgb25lICJwYXJlbnQiIGNvbW1pdCwgd2hpY2ggcG9pbnRzIHRvIHRoZQorcHJldmlvdXMgc3RhdGUgb2YgdGhlIHByb2plY3Q6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IHNob3cgSEVBRF4gICMgdG8gc2VlIHRoZSBwYXJlbnQgb2YgSEVBRAorJCBnaXQgc2hvdyBIRUFEXl4gIyB0byBzZWUgdGhlIGdyYW5kcGFyZW50IG9mIEhFQUQKKyQgZ2l0IHNob3cgSEVBRH40ICMgdG8gc2VlIHRoZSBncmVhdC1ncmVhdCBncmFuZHBhcmVudCBvZiBIRUFECistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGUgdGhhdCBtZXJnZSBjb21taXRzIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgcGFyZW50OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBzaG93IEhFQUReMSAjIHNob3cgdGhlIGZpcnN0IHBhcmVudCBvZiBIRUFEIChzYW1lIGFzIEhFQUReKQorJCBnaXQgc2hvdyBIRUFEXjIgIyBzaG93IHRoZSBzZWNvbmQgcGFyZW50IG9mIEhFQUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGdpdmUgY29tbWl0cyBuYW1lcyBvZiB5b3VyIG93bjsgYWZ0ZXIgcnVubmluZworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC10YWcgdjIuNSAxYjJlMWQ2M2ZmCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3lvdSBjYW4gcmVmZXIgdG8gMWIyZTFkNjNmZiBieSB0aGUgbmFtZSAidjIuNSIuICBJZiB5b3UgaW50ZW5kIHRvCitzaGFyZSB0aGlzIG5hbWUgd2l0aCBvdGhlciBwZW9wbGUgKGZvciBleGFtcGxlLCB0byBpZGVudGlmeSBhIHJlbGVhc2UKK3ZlcnNpb24pLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhICJ0YWciIG9iamVjdCwgYW5kIHBlcmhhcHMgc2lnbiBpdDsgc2VlCitnaXRsaW5rOmdpdC10YWdbMV0gZm9yIGRldGFpbHMuCisKK0FueSBnaXQgY29tbWFuZCB0aGF0IG5lZWRzIHRvIGtub3cgYSBjb21taXQgY2FuIHRha2UgYW55IG9mIHRoZXNlCituYW1lcy4gIEZvciBleGFtcGxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHYyLjUgSEVBRAkgIyBjb21wYXJlIHRoZSBjdXJyZW50IEhFQUQgdG8gdjIuNQorJCBnaXQgYnJhbmNoIHN0YWJsZSB2Mi41ICMgc3RhcnQgYSBuZXcgYnJhbmNoIG5hbWVkICJzdGFibGUiIGJhc2VkCisJCQkgIyBhdCB2Mi41CiskIGdpdCByZXNldCAtLWhhcmQgSEVBRF4gIyByZXNldCB5b3VyIGN1cnJlbnQgYnJhbmNoIGFuZCB3b3JraW5nCisJCQkgIyBkaXJlY3RvcnkgdG8gaXRzIHN0YXRlIGF0IEhFQUReCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JlIGNhcmVmdWwgd2l0aCB0aGF0IGxhc3QgY29tbWFuZDogaW4gYWRkaXRpb24gdG8gbG9zaW5nIGFueSBjaGFuZ2VzCitpbiB0aGUgd29ya2luZyBkaXJlY3RvcnksIGl0IHdpbGwgYWxzbyByZW1vdmUgYWxsIGxhdGVyIGNvbW1pdHMgZnJvbQordGhpcyBicmFuY2guICBJZiB0aGlzIGJyYW5jaCBpcyB0aGUgb25seSBicmFuY2ggY29udGFpbmluZyB0aG9zZQorY29tbWl0cywgdGhleSB3aWxsIGJlIGxvc3QuICAoQWxzbywgZG9uJ3QgdXNlICJnaXQgcmVzZXQiIG9uIGEKK3B1YmxpY2x5LXZpc2libGUgYnJhbmNoIHRoYXQgb3RoZXIgZGV2ZWxvcGVycyBwdWxsIGZyb20sIGFzIGdpdCB3aWxsCitiZSBjb25mdXNlZCBieSBoaXN0b3J5IHRoYXQgZGlzYXBwZWFycyBpbiB0aGlzIHdheS4pCisKK1RoZSBnaXQgZ3JlcCBjb21tYW5kIGNhbiBzZWFyY2ggZm9yIHN0cmluZ3MgaW4gYW55IHZlcnNpb24gb2YgeW91cgorcHJvamVjdCwgc28KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgZ3JlcCAiaGVsbG8iIHYyLjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc2VhcmNoZXMgZm9yIGFsbCBvY2N1cnJlbmNlcyBvZiAiaGVsbG8iIGluIHYyLjUuCisKK0lmIHlvdSBsZWF2ZSBvdXQgdGhlIGNvbW1pdCBuYW1lLCBnaXQgZ3JlcCB3aWxsIHNlYXJjaCBhbnkgb2YgdGhlCitmaWxlcyBpdCBtYW5hZ2VzIGluIHlvdXIgY3VycmVudCBkaXJlY3RvcnkuICBTbworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBncmVwICJoZWxsbyIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaXMgYSBxdWljayB3YXkgdG8gc2VhcmNoIGp1c3QgdGhlIGZpbGVzIHRoYXQgYXJlIHRyYWNrZWQgYnkgZ2l0LgorCitNYW55IGdpdCBjb21tYW5kcyBhbHNvIHRha2Ugc2V0cyBvZiBjb21taXRzLCB3aGljaCBjYW4gYmUgc3BlY2lmaWVkCitpbiBhIG51bWJlciBvZiB3YXlzLiAgSGVyZSBhcmUgc29tZSBleGFtcGxlcyB3aXRoIGdpdCBsb2c6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyQgZ2l0IGxvZyB2Mi41Li52Mi42ICAgICAgICAgICAgIyBjb21taXRzIGJldHdlZW4gdjIuNSBhbmQgdjIuNgorJCBnaXQgbG9nIHYyLjUuLiAgICAgICAgICAgICAgICAjIGNvbW1pdHMgc2luY2UgdjIuNQorJCBnaXQgbG9nIC0tc2luY2U9IjIgd2Vla3MgYWdvIiAjIGNvbW1pdHMgZnJvbSB0aGUgbGFzdCAyIHdlZWtzCiskIGdpdCBsb2cgdjIuNS4uIE1ha2VmaWxlICAgICAgICMgY29tbWl0cyBzaW5jZSB2Mi41IHdoaWNoIG1vZGlmeQorCQkJCSMgTWFrZWZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworWW91IGNhbiBhbHNvIGdpdmUgZ2l0IGxvZyBhICJyYW5nZSIgb2YgY29tbWl0cyB3aGVyZSB0aGUgZmlyc3QgaXMgbm90CituZWNlc3NhcmlseSBhbiBhbmNlc3RvciBvZiB0aGUgc2Vjb25kOyBmb3IgZXhhbXBsZSwgaWYgdGhlIHRpcHMgb2YKK3RoZSBicmFuY2hlcyAic3RhYmxlLXJlbGVhc2UiIGFuZCAibWFzdGVyIiBkaXZlcmdlZCBmcm9tIGEgY29tbW9uCitjb21taXQgc29tZSB0aW1lIGFnbywgdGhlbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBsb2cgc3RhYmxlLi5leHBlcmltZW50YWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKword2lsbCBsaXN0IGNvbW1pdHMgbWFkZSBpbiB0aGUgZXhwZXJpbWVudGFsIGJyYW5jaCBidXQgbm90IGluIHRoZQorc3RhYmxlIGJyYW5jaCwgd2hpbGUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQgbG9nIGV4cGVyaW1lbnRhbC4uc3RhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3dpbGwgc2hvdyB0aGUgbGlzdCBvZiBjb21taXRzIG1hZGUgb24gdGhlIHN0YWJsZSBicmFuY2ggYnV0IG5vdAordGhlIGV4cGVyaW1lbnRhbCBicmFuY2guCisKK1RoZSAiZ2l0IGxvZyIgY29tbWFuZCBoYXMgYSB3ZWFrbmVzczogaXQgbXVzdCBwcmVzZW50IGNvbW1pdHMgaW4gYQorbGlzdC4gIFdoZW4gdGhlIGhpc3RvcnkgaGFzIGxpbmVzIG9mIGRldmVsb3BtZW50IHRoYXQgZGl2ZXJnZWQgYW5kCit0aGVuIG1lcmdlZCBiYWNrIHRvZ2V0aGVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggImdpdCBsb2ciIHByZXNlbnRzCit0aG9zZSBjb21taXRzIGlzIG1lYW5pbmdsZXNzLgorCitNb3N0IHByb2plY3RzIHdpdGggbXVsdGlwbGUgY29udHJpYnV0b3JzIChzdWNoIGFzIHRoZSBsaW51eCBrZXJuZWwsCitvciBnaXQgaXRzZWxmKSBoYXZlIGZyZXF1ZW50IG1lcmdlcywgYW5kIGdpdGsgZG9lcyBhIGJldHRlciBqb2Igb2YKK3Zpc3VhbGl6aW5nIHRoZWlyIGhpc3RvcnkuICBGb3IgZXhhbXBsZSwKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXRrIC0tc2luY2U9IjIgd2Vla3MgYWdvIiBkcml2ZXJzLworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCithbGxvd3MgeW91IHRvIGJyb3dzZSBhbnkgY29tbWl0cyBmcm9tIHRoZSBsYXN0IDIgd2Vla3Mgb2YgY29tbWl0cwordGhhdCBtb2RpZmllZCBmaWxlcyB1bmRlciB0aGUgImRyaXZlcnMiIGRpcmVjdG9yeS4gIChOb3RlOiB5b3UgY2FuCithZGp1c3QgZ2l0aydzIGZvbnRzIGJ5IGhvbGRpbmcgZG93biB0aGUgY29udHJvbCBrZXkgd2hpbGUgcHJlc3NpbmcKKyItIiBvciAiKyIuKQorCitGaW5hbGx5LCBtb3N0IGNvbW1hbmRzIHRoYXQgdGFrZSBmaWxlbmFtZXMgd2lsbCBvcHRpb25hbGx5IGFsbG93IHlvdQordG8gcHJlY2VkZSBhbnkgZmlsZW5hbWUgYnkgYSBjb21taXQsIHRvIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHZlcnNpb24KK29mIHRoZSBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBkaWZmIHYyLjU6TWFrZWZpbGUgSEVBRDpNYWtlZmlsZS5pbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIGFsc28gdXNlICJnaXQgY2F0LWZpbGUgLXAiIHRvIHNlZSBhbnkgc3VjaCBmaWxlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdCBjYXQtZmlsZSAtcCB2Mi41Ok1ha2VmaWxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05leHQgU3RlcHMKKy0tLS0tLS0tLS0KKworVGhpcyB0dXRvcmlhbCBzaG91bGQgYmUgZW5vdWdoIHRvIHBlcmZvcm0gYmFzaWMgZGlzdHJpYnV0ZWQgcmV2aXNpb24KK2NvbnRyb2wgZm9yIHlvdXIgcHJvamVjdHMuICBIb3dldmVyLCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBkZXB0aAorYW5kIHBvd2VyIG9mIGdpdCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIHR3byBzaW1wbGUgaWRlYXMgb24gd2hpY2ggaXQKK2lzIGJhc2VkOgorCisgICogVGhlIG9iamVjdCBkYXRhYmFzZSBpcyB0aGUgcmF0aGVyIGVsZWdhbnQgc3lzdGVtIHVzZWQgdG8KKyAgICBzdG9yZSB0aGUgaGlzdG9yeSBvZiB5b3VyIHByb2plY3QtLWZpbGVzLCBkaXJlY3RvcmllcywgYW5kCisgICAgY29tbWl0cy4KKworICAqIFRoZSBpbmRleCBmaWxlIGlzIGEgY2FjaGUgb2YgdGhlIHN0YXRlIG9mIGEgZGlyZWN0b3J5IHRyZWUsCisgICAgdXNlZCB0byBjcmVhdGUgY29tbWl0cywgY2hlY2sgb3V0IHdvcmtpbmcgZGlyZWN0b3JpZXMsIGFuZAorICAgIGhvbGQgdGhlIHZhcmlvdXMgdHJlZXMgaW52b2x2ZWQgaW4gYSBtZXJnZS4KKworbGluazp0dXRvcmlhbC0yLmh0bWxbUGFydCB0d28gb2YgdGhpcyB0dXRvcmlhbF0gZXhwbGFpbnMgdGhlIG9iamVjdAorZGF0YWJhc2UsIHRoZSBpbmRleCBmaWxlLCBhbmQgYSBmZXcgb3RoZXIgb2RkcyBhbmQgZW5kcyB0aGF0IHlvdSdsbAorbmVlZCB0byBtYWtlIHRoZSBtb3N0IG9mIGdpdC4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gY29uc2lkZXIgd2l0aCB0aGF0IHJpZ2h0IGF3YXksIGEgZmV3IG90aGVyCitkaWdyZXNzaW9ucyB0aGF0IG1heSBiZSBpbnRlcmVzdGluZyBhdCB0aGlzIHBvaW50IGFyZToKKworICAqIGdpdGxpbms6Z2l0LWZvcm1hdC1wYXRjaFsxXSwgZ2l0bGluazpnaXQtYW1bMV06IFRoZXNlIGNvbnZlcnQKKyAgICBzZXJpZXMgb2YgZ2l0IGNvbW1pdHMgaW50byBlbWFpbGVkIHBhdGNoZXMsIGFuZCB2aWNlIHZlcnNhLAorICAgIHVzZWZ1bCBmb3IgcHJvamVjdHMgc3VjaCBhcyB0aGUgbGludXgga2VybmVsIHdoaWNoIHJlbHkgaGVhdmlseQorICAgIG9uIGVtYWlsZWQgcGF0Y2hlcy4KKworICAqIGdpdGxpbms6Z2l0LWJpc2VjdFsxXTogV2hlbiB0aGVyZSBpcyBhIHJlZ3Jlc3Npb24gaW4geW91cgorICAgIHByb2plY3QsIG9uZSB3YXkgdG8gdHJhY2sgZG93biB0aGUgYnVnIGlzIGJ5IHNlYXJjaGluZyB0aHJvdWdoCisgICAgdGhlIGhpc3RvcnkgdG8gZmluZCB0aGUgZXhhY3QgY29tbWl0IHRoYXQncyB0byBibGFtZS4gIEdpdCBiaXNlY3QKKyAgICBjYW4gaGVscCB5b3UgcGVyZm9ybSBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoYXQgY29tbWl0LiAgSXQgaXMKKyAgICBzbWFydCBlbm91Z2ggdG8gcGVyZm9ybSBhIGNsb3NlLXRvLW9wdGltYWwgc2VhcmNoIGV2ZW4gaW4gdGhlCisgICAgY2FzZSBvZiBjb21wbGV4IG5vbi1saW5lYXIgaGlzdG9yeSB3aXRoIGxvdHMgb2YgbWVyZ2VkIGJyYW5jaGVzLgorCisgICogbGluazpldmVyeWRheS5odG1sW0V2ZXJ5ZGF5IEdJVCB3aXRoIDIwIENvbW1hbmRzIE9yIFNvXQorCisgICogbGluazpjdnMtbWlncmF0aW9uLmh0bWxbZ2l0IGZvciBDVlMgdXNlcnNdLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91cmxzLnR4dCBiL0RvY3VtZW50YXRpb24vdXJscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlY2JhNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdXJscy50eHQKQEAgLTAsMCArMSw2OSBAQAorR0lUIFVSTFNbW1VSTFNdXQorLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgb2YgdGhlIGZvbGxvd2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQKK3RvIG5hbWUgdGhlIHJlbW90ZSByZXBvc2l0b3J5OgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gcnN5bmM6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGh0dHA6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGh0dHBzOi8vaG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBnaXQ6Ly9ob3N0Lnh6L3BhdGgvdG8vcmVwby5naXQvCistIGdpdDovL2hvc3QueHovfnVzZXIvcGF0aC90by9yZXBvLmdpdC8KKy0gc3NoOi8ve3N0YXJ0c2J9dXNlckB7ZW5kc2J9aG9zdC54ei9wYXRoL3RvL3JlcG8uZ2l0LworLSBzc2g6Ly97c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6L351c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHNzaDovL3tzdGFydHNifXVzZXJAe2VuZHNifWhvc3QueHovfi9wYXRoL3RvL3JlcG8uZ2l0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU1NIIGlzIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBwcm90b2NvbC4gIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5Cit3aGljaCB1c2VyIHRvIGxvZy1pbiBhcywgYW5kIGFuIGFsdGVybmF0ZSwgc2NwLWxpa2Ugc3ludGF4IGlzIGFsc28KK3N1cHBvcnRlZC4gIEJvdGggc3ludGF4ZXMgc3VwcG9ydCB1c2VybmFtZSBleHBhbnNpb24sCithcyBkb2VzIHRoZSBuYXRpdmUgZ2l0IHByb3RvY29sLiBUaGUgZm9sbG93aW5nIHRocmVlIGFyZQoraWRlbnRpY2FsIHRvIHRoZSBsYXN0IHRocmVlIGFib3ZlLCByZXNwZWN0aXZlbHk6CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSB7c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6Oi9wYXRoL3RvL3JlcG8uZ2l0LworLSB7c3RhcnRzYn11c2VyQHtlbmRzYn1ob3N0Lnh6On51c2VyL3BhdGgvdG8vcmVwby5naXQvCistIHtzdGFydHNifXVzZXJAe2VuZHNifWhvc3QueHo6cGF0aC90by9yZXBvLmdpdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RvIHN5bmMgd2l0aCBhIGxvY2FsIGRpcmVjdG9yeSwgdXNlOgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gL3BhdGgvdG8vcmVwby5naXQvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUkVNT1RFUworLS0tLS0tLQorCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUsIGFzIGEgc2hvcnQtaGFuZCwgdGhlIG5hbWUgb2YgYQorZmlsZSBpbiBgJEdJVF9ESVIvcmVtb3Rlc2AgZGlyZWN0b3J5IGNhbiBiZSBnaXZlbjsgdGhlCituYW1lZCBmaWxlIHNob3VsZCBiZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworCVVSTDogb25lIG9mIHRoZSBhYm92ZSBVUkwgZm9ybWF0CisJUHVzaDogPHJlZnNwZWM+CisJUHVsbDogPHJlZnNwZWM+CisKK1RoZW4gc3VjaCBhIHNob3J0LWhhbmQgaXMgc3BlY2lmaWVkIGluIHBsYWNlIG9mCis8cmVwb3NpdG9yeT4gd2l0aG91dCA8cmVmc3BlYz4gcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZAorbGluZSwgPHJlZnNwZWM+IHNwZWNpZmllZCBvbiBgUHVzaDpgIGxpbmVzIG9yIGBQdWxsOmAKK2xpbmVzIGFyZSB1c2VkIGZvciBgZ2l0LXB1c2hgIGFuZCBgZ2l0LWZldGNoYC9gZ2l0LXB1bGxgLAorcmVzcGVjdGl2ZWx5LiAgTXVsdGlwbGUgYFB1c2g6YCBhbmQgYFB1bGw6YCBsaW5lcyBtYXkKK2JlIHNwZWNpZmllZCBmb3IgYWRkaXRpb25hbCBicmFuY2ggbWFwcGluZ3MuCisKK1RoZSBuYW1lIG9mIGEgZmlsZSBpbiBgJEdJVF9ESVIvYnJhbmNoZXNgIGRpcmVjdG9yeSBjYW4gYmUKK3NwZWNpZmllZCBhcyBhbiBvbGRlciBub3RhdGlvbiBzaG9ydC1oYW5kOyB0aGUgbmFtZWQKK2ZpbGUgc2hvdWxkIGNvbnRhaW4gYSBzaW5nbGUgbGluZSwgYSBVUkwgaW4gb25lIG9mIHRoZQorYWJvdmUgZm9ybWF0cywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGhhc2ggYCNgIGFuZCB0aGUKK25hbWUgb2YgcmVtb3RlIGhlYWQgKFVSTCBmcmFnbWVudCBub3RhdGlvbikuCitgJEdJVF9ESVIvYnJhbmNoZXMvPHJlbW90ZT5gIGZpbGUgdGhhdCBzdG9yZXMgYSA8dXJsPgord2l0aG91dCB0aGUgZnJhZ21lbnQgaXMgZXF1aXZhbGVudCB0byBoYXZlIHRoaXMgaW4gdGhlCitjb3JyZXNwb25kaW5nIGZpbGUgaW4gdGhlIGAkR0lUX0RJUi9yZW1vdGVzL2AgZGlyZWN0b3J5LgorCisJVVJMOiA8dXJsPgorCVB1bGw6IHJlZnMvaGVhZHMvbWFzdGVyOjxyZW1vdGU+CisKK3doaWxlIGhhdmluZyBgPHVybD4jPGhlYWQ+YCBpcyBlcXVpdmFsZW50IHRvCisKKwlVUkw6IDx1cmw+CisJUHVsbDogcmVmcy9oZWFkcy88aGVhZD46PHJlbW90ZT4KZGlmZiAtLWdpdCBhL0dJVC1WRVJTSU9OLUdFTiBiL0dJVC1WRVJTSU9OLUdFTgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDkyM2M5Ci0tLSAvZGV2L251bGwKKysrIGIvR0lULVZFUlNJT04tR0VOCkBAIC0wLDAgKzEsNDYgQEAKKyMhL2Jpbi9zaAorCitHVkY9R0lULVZFUlNJT04tRklMRQorREVGX1ZFUj12MS40LjIuR0lUCisKK0xGPScKKycKKworIyBGaXJzdCB0cnkgZ2l0LWRlc2NyaWJlLCB0aGVuIHNlZSBpZiB0aGVyZSBpcyBhIHZlcnNpb24gZmlsZQorIyAoaW5jbHVkZWQgaW4gcmVsZWFzZSB0YXJiYWxscyksIHRoZW4gZGVmYXVsdAoraWYgVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgorICAgY2FzZSAiJFZOIiBpbgorICAgKiRMRiopIChleGl0IDEpIDs7CisgICB2WzAtOV0qKSA6IGhhcHB5IDs7CisgICBlc2FjCit0aGVuCisJVk49JChlY2hvICIkVk4iIHwgc2VkIC1lICdzLy0vLi9nJyk7CitlbGlmIHRlc3QgLWYgdmVyc2lvbgordGhlbgorCVZOPSQoY2F0IHZlcnNpb24pIHx8IFZOPSIkREVGX1ZFUiIKK2Vsc2UKKwlWTj0iJERFRl9WRVIiCitmaQorCitWTj0kKGV4cHIgIiRWTiIgOiB2KidcKC4qXCknKQorCitkaXJ0eT0kKHNoIC1jICdnaXQgZGlmZi1pbmRleCAtLW5hbWUtb25seSBIRUFEJyAyPi9kZXYvbnVsbCkgfHwgZGlydHk9CitjYXNlICIkZGlydHkiIGluCisnJykKKwk7OworKikKKwlWTj0iJFZOLWRpcnR5IiA7OworZXNhYworCitpZiB0ZXN0IC1yICRHVkYKK3RoZW4KKwlWQz0kKHNlZCAtZSAncy9eR0lUX1ZFUlNJT04gPSAvLycgPCRHVkYpCitlbHNlCisJVkM9dW5zZXQKK2ZpCit0ZXN0ICIkVk4iID0gIiRWQyIgfHwgeworCWVjaG8gPiYyICJHSVRfVkVSU0lPTiA9ICRWTiIKKwllY2hvICJHSVRfVkVSU0lPTiA9ICRWTiIgPiRHVkYKK30KKworCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk3NzhjCi0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDEyMyBAQAorCisJCUdpdCBpbnN0YWxsYXRpb24KKworTm9ybWFsbHkgeW91IGNhbiBqdXN0IGRvICJtYWtlIiBmb2xsb3dlZCBieSAibWFrZSBpbnN0YWxsIiwgYW5kIHRoYXQKK3dpbGwgaW5zdGFsbCB0aGUgZ2l0IHByb2dyYW1zIGluIHlvdXIgb3duIH4vYmluLyBkaXJlY3RvcnkuICBJZiB5b3Ugd2FudAordG8gZG8gYSBnbG9iYWwgaW5zdGFsbCwgeW91IGNhbiBkbworCisJJCBtYWtlIHByZWZpeD0vdXNyIGFsbCBkb2MgOyMgYXMgeW91cnNlbGYKKwkjIG1ha2UgcHJlZml4PS91c3IgaW5zdGFsbCBpbnN0YWxsLWRvYyA7IyBhcyByb290CisKKyhvciBwcmVmaXg9L3Vzci9sb2NhbCwgb2YgY291cnNlKS4gIEp1c3QgbGlrZSBhbnkgcHJvZ3JhbSBzdWl0ZQordGhhdCB1c2VzICRwcmVmaXgsIHRoZSBidWlsdCByZXN1bHRzIGhhdmUgc29tZSBwYXRocyBlbmNvZGVkLAord2hpY2ggYXJlIGRlcml2ZWQgZnJvbSAkcHJlZml4LCBzbyAibWFrZSBhbGw7IG1ha2UgcHJlZml4PS91c3IKK2luc3RhbGwiIHdvdWxkIG5vdCB3b3JrLgorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIGF1dG9jb25mIGdlbmVyYXRlZCAuL2NvbmZpZ3VyZSBzY3JpcHQgdG8KK3NldCB1cCBpbnN0YWxsIHBhdGhzICh2aWEgY29uZmlnLm1hay5hdXRvZ2VuKSwgc28geW91IGNhbiB3cml0ZSBpbnN0ZWFkCisKKwkkIGF1dG9jb25mIDsjIGFzIHlvdXJzZWxmIGlmIC4vY29uZmlndXJlIGRvZXNuJ3QgZXhpc3QgeWV0CisJJCAuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyIDsjIGFzIHlvdXJzZWxmCisJJCBtYWtlIGFsbCBkb2MgOyMgYXMgeW91cnNlbGYKKwkjIG1ha2UgaW5zdGFsbCBpbnN0YWxsLWRvYyA7IyBhcyByb290CisKKworSXNzdWVzIG9mIG5vdGU6CisKKyAtIGdpdCBub3JtYWxseSBpbnN0YWxscyBhIGhlbHBlciBzY3JpcHQgd3JhcHBlciBjYWxsZWQgImdpdCIsIHdoaWNoCisgICBjb25mbGljdHMgd2l0aCBhIHNpbWlsYXJseSBuYW1lZCAiR05VIGludGVyYWN0aXZlIHRvb2xzIiBwcm9ncmFtLgorCisgICBUb3VnaC4gIEVpdGhlciBkb24ndCB1c2UgdGhlIHdyYXBwZXIgc2NyaXB0LCBvciBkZWxldGUgdGhlIG9sZCBHTlUKKyAgIGludGVyYWN0aXZlIHRvb2xzLiAgTm9uZSBvZiB0aGUgY29yZSBnaXQgc3R1ZmYgbmVlZHMgdGhlIHdyYXBwZXIsCisgICBpdCdzIGp1c3QgYSBjb252ZW5pZW50IHNob3J0aGFuZCBhbmQgd2hpbGUgaXQgaXMgZG9jdW1lbnRlZCBpbiBzb21lCisgICBwbGFjZXMsIHlvdSBjYW4gYWx3YXlzIHJlcGxhY2UgImdpdCBjb21taXQiIHdpdGggImdpdC1jb21taXQiCisgICBpbnN0ZWFkLiAKKworICAgQnV0IGxldCdzIGZhY2UgaXQsIG1vc3Qgb2YgdXMgZG9uJ3QgaGF2ZSBHTlUgaW50ZXJhY3RpdmUgdG9vbHMsIGFuZAorICAgZXZlbiBpZiB3ZSBoYWQgaXQsIHdlIHdvdWxkbid0IGtub3cgd2hhdCBpdCBkb2VzLiAgSSBkb24ndCB0aGluayBpdAorICAgaGFzIGJlZW4gYWN0aXZlbHkgZGV2ZWxvcGVkIHNpbmNlIDE5OTcsIGFuZCBwZW9wbGUgaGF2ZSBtb3ZlZCBvdmVyIHRvCisgICBncmFwaGljYWwgZmlsZSBtYW5hZ2Vycy4KKworIC0gR2l0IGlzIHJlYXNvbmFibHkgc2VsZi1zdWZmaWNpZW50LCBidXQgZG9lcyBkZXBlbmQgb24gYSBmZXcgZXh0ZXJuYWwKKyAgIHByb2dyYW1zIGFuZCBsaWJyYXJpZXM6CisKKwktICJ6bGliIiwgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkuIEdpdCB3b24ndCBidWlsZCB3aXRob3V0IGl0LgorCisJLSAib3BlbnNzbCIuICBUaGUgZ2l0LXJldi1saXN0IHByb2dyYW0gdXNlcyBiaWdudW0gc3VwcG9ydCBmcm9tCisJICBvcGVuc3NsLCBhbmQgdW5sZXNzIHlvdSBzcGVjaWZ5IG90aGVyd2lzZSwgeW91J2xsIGFsc28gZ2V0IHRoZQorCSAgU0hBMSBsaWJyYXJ5IGZyb20gaGVyZS4KKworCSAgSWYgeW91IGRvbid0IGhhdmUgb3BlbnNzbCwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZSBTSEExIGxpYnJhcmllcworCSAgdGhhdCBjb21lIHdpdGggZ2l0IChnaXQgaW5jbHVkZXMgdGhlIG9uZSBmcm9tIE1vemlsbGEsIGFuZCBoYXMKKwkgIGl0cyBvd24gUG93ZXJQQyBhbmQgQVJNIG9wdGltaXplZCBvbmVzIHRvbyAtIHNlZSB0aGUgTWFrZWZpbGUpLgorCisJLSAibGliY3VybCIgYW5kICJjdXJsIiBleGVjdXRhYmxlLiAgZ2l0LWh0dHAtZmV0Y2ggYW5kCisJICBnaXQtZmV0Y2ggdXNlIHRoZW0uICBJZiB5b3UgZG8gbm90IHVzZSBodHRwCisJICB0cmFuc2ZlciwgeW91IGFyZSBwcm9iYWJseSBPSyBpZiB5b3UgZG8gbm90IGhhdmUKKwkgIHRoZW0uCisKKwktIGV4cGF0IGxpYnJhcnk7IGdpdC1odHRwLXB1c2ggdXNlcyBpdCBmb3IgcmVtb3RlIGxvY2sKKwkgIG1hbmFnZW1lbnQgb3ZlciBEQVYuICBTaW1pbGFyIHRvICJjdXJsIiBhYm92ZSwgdGhpcyBpcyBvcHRpb25hbC4KKworCS0gIkdOVSBkaWZmIiB0byBnZW5lcmF0ZSBwYXRjaGVzLiAgT2YgY291cnNlLCB5b3UgZG9uJ3QgX2hhdmVfIHRvCisJICBnZW5lcmF0ZSBwYXRjaGVzIGlmIHlvdSBkb24ndCB3YW50IHRvLCBidXQgbGV0J3MgZmFjZSBpdCwgeW91J2xsCisJICBiZSB3YW50aW5nIHRvLiBPciB3aHkgZGlkIHlvdSBnZXQgZ2l0IGluIHRoZSBmaXJzdCBwbGFjZT8KKworCSAgTm9uLUdOVSB2ZXJzaW9ucyBvZiB0aGUgZGlmZi9wYXRjaCBwcm9ncmFtcyBkb24ndCBnZW5lcmFsbHkgc3VwcG9ydAorCSAgdGhlIHVuaWZpZWQgcGF0Y2ggZm9ybWF0ICh3aGljaCBpcyB0aGUgb25lIGdpdCB1c2VzKSwgc28geW91CisJICByZWFsbHkgZG8gd2FudCB0byBnZXQgdGhlIEdOVSBvbmUuICBUcnVzdCBtZSwgeW91IHdpbGwgd2FudCB0bworCSAgZG8gdGhhdCBldmVuIGlmIGl0IHdhc24ndCBmb3IgZ2l0LiAgVGhlcmUncyBubyBwb2ludCBpbiBsaXZpbmcKKwkgIGluIHRoZSBkYXJrIGFnZXMgYW55IG1vcmUuIAorCisJLSAibWVyZ2UiLCB0aGUgc3RhbmRhcmQgVU5JWCB0aHJlZS13YXkgbWVyZ2UgcHJvZ3JhbS4gIEl0IHVzdWFsbHkKKwkgIGNvbWVzIHdpdGggdGhlICJyY3MiIHBhY2thZ2Ugb24gbW9zdCBMaW51eCBkaXN0cmlidXRpb25zLCBzbyBpZgorCSAgeW91IGhhdmUgYSBkZXZlbG9wZXIgaW5zdGFsbCB5b3UgcHJvYmFibHkgaGF2ZSBpdCBhbHJlYWR5LCBidXQgYQorCSAgImdyYXBoaWNhbCB1c2VyIGRlc2t0b3AiIGluc3RhbGwgbWlnaHQgaGF2ZSBsZWZ0IGl0IG91dC4KKworCSAgWW91J2xsIG9ubHkgbmVlZCB0aGUgbWVyZ2UgcHJvZ3JhbSBpZiB5b3UgZG8gZGV2ZWxvcG1lbnQgdXNpbmcKKwkgIGdpdCwgYW5kIGlmIHlvdSBvbmx5IHVzZSBnaXQgdG8gdHJhY2sgb3RoZXIgcGVvcGxlcyB3b3JrIHlvdSdsbAorCSAgbmV2ZXIgbm90aWNlIHRoZSBsYWNrIG9mIGl0LiAKKworICAgICAgICAtICJ3aXNoIiwgdGhlIFRjbC9UayB3aW5kb3dpbmcgc2hlbGwgaXMgdXNlZCBpbiBnaXRrIHRvIHNob3cgdGhlCisgICAgICAgICAgaGlzdG9yeSBncmFwaGljYWxseQorCisJLSAic3NoIiBpcyB1c2VkIHRvIHB1c2ggYW5kIHB1bGwgb3ZlciB0aGUgbmV0CisKKwktICJwZXJsIiBhbmQgUE9TSVgtY29tcGxpYW50IHNoZWxscyBhcmUgbmVlZGVkIHRvIHVzZSBtb3N0IG9mCisJICB0aGUgYmFyZWJvbmUgUG9yY2VsYWluaXNoIHNjcmlwdHMuCisKKwktICJweXRob24iIDIuMyBvciBtb3JlIHJlY2VudDsgaWYgeW91IGhhdmUgMi4zLCB5b3UgbWF5IG5lZWQKKyAgICAgICAgICB0byBidWlsZCB3aXRoICJtYWtlIFdJVEhfT1dOX1NVQlBST0NFU1NfUFk9WWVzUGxlYXNlIi4KKworIC0gU29tZSBwbGF0Zm9ybSBzcGVjaWZpYyBpc3N1ZXMgYXJlIGRlYWx0IHdpdGggTWFrZWZpbGUgcnVsZXMsCisgICBidXQgZGVwZW5kaW5nIG9uIHlvdXIgc3BlY2lmaWMgaW5zdGFsbGF0aW9uLCB5b3UgbWF5IG5vdAorICAgaGF2ZSBhbGwgdGhlIGxpYnJhcmllcy90b29scyBuZWVkZWQsIG9yIHlvdSBtYXkgaGF2ZQorICAgbmVjZXNzYXJ5IGxpYnJhcmllcyBhdCB1bnVzdWFsIGxvY2F0aW9ucy4gIFBsZWFzZSBsb29rIGF0IHRoZQorICAgdG9wIG9mIHRoZSBNYWtlZmlsZSB0byBzZWUgd2hhdCBjYW4gYmUgYWRqdXN0ZWQgZm9yIHlvdXIgbmVlZHMuCisgICBZb3UgY2FuIHBsYWNlIGxvY2FsIHNldHRpbmdzIGluIGNvbmZpZy5tYWsgYW5kIHRoZSBNYWtlZmlsZQorICAgd2lsbCBpbmNsdWRlIHRoZW0uICBOb3RlIHRoYXQgY29uZmlnLm1hayBpcyBub3QgZGlzdHJpYnV0ZWQ7CisgICB0aGUgbmFtZSBpcyByZXNlcnZlZCBmb3IgbG9jYWwgc2V0dGluZ3MuCisKKyAtIFRvIGJ1aWxkIGFuZCBpbnN0YWxsIGRvY3VtZW50YXRpb24gc3VpdGUsIHlvdSBuZWVkIHRvIGhhdmUgdGhlCisgICBhc2NpaWRvYy94bWx0byB0b29sY2hhaW4uICBBbHRlcm5hdGl2ZWx5LCBwcmUtZm9ybWF0dGVkCisgICBkb2N1bWVudGF0aW9uIGFyZSBhdmFpbGFibGUgaW4gImh0bWwiIGFuZCAibWFuIiBicmFuY2hlcyBvZiB0aGUgZ2l0CisgICByZXBvc2l0b3J5IGl0c2VsZi4gIEZvciBleGFtcGxlLCB5b3UgY291bGQ6CisKKwkkIG1rZGlyIG1hbnVhbCAmJiBjZCBtYW51YWwKKwkkIGdpdCBpbml0LWRiCisJJCBnaXQgZmV0Y2gtcGFjayBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2dpdC9naXQuZ2l0IG1hbiBodG1sIHwKKwkgIHdoaWxlIHJlYWQgYSBiCisJICBkbworCSAgICBlY2hvICRhID4uZ2l0LyRiCisJICBkb25lCisJJCBjcCAuZ2l0L3JlZnMvaGVhZHMvbWFuIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKwkkIGdpdCBjaGVja291dAorCisgICB0byBjaGVja291dCB0aGUgcHJlLWJ1aWx0IG1hbiBwYWdlcy4gIEFsc28gaW4gdGhpcyByZXBvc2l0b3J5OgorCisJJCBnaXQgY2hlY2tvdXQgaHRtbAorCisgICB3b3VsZCBpbnN0ZWFkIGdpdmUgeW91IGEgY29weSBvZiB3aGF0IHlvdSBzZWUgYXQ6CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy8KKwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzYxZDZjCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUKQEAgLTAsMCArMSw4MTggQEAKKyMgVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoaXMgTWFrZWZpbGUgaXMuLi4KK2FsbDoKKworIyBEZWZpbmUgTU9aSUxMQV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgY29taW5nIGZyb20gTW96aWxsYS4gSXQgaXMgR1BMJ2QgYW5kIHNob3VsZCBiZSBmYXN0CisjIG9uIG5vbi14ODYgYXJjaGl0ZWN0dXJlcyAoZS5nLiBQb3dlclBDKSwgd2hpbGUgdGhlIE9wZW5TU0wgdmVyc2lvbiAoZGVmYXVsdAorIyBjaG9pY2UpIGhhcyB2ZXJ5IGZhc3QgdmVyc2lvbiBvcHRpbWl6ZWQgZm9yIGk1ODYuCisjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIE5PX0VYUEFUIGlmIHlvdSBkbyBub3QgaGF2ZSBleHBhdCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdXNoIGlzCisjIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgcHVzaCB1c2luZyBodHRwOi8vIGFuZCBodHRwczovLyB0cmFuc3BvcnRzLgorIworIyBEZWZpbmUgTk9fRF9JTk9fSU5fRElSRU5UIGlmIHlvdSBkb24ndCBoYXZlIGRfaW5vIGluIHlvdXIgc3RydWN0IGRpcmVudC4KKyMKKyMgRGVmaW5lIE5PX0RfVFlQRV9JTl9ESVJFTlQgaWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzIERUX1VOS05PV04gYnV0IGxhY2tzCisjIGRfdHlwZSBpbiBzdHJ1Y3QgZGlyZW50IChsYXRlc3QgQ3lnd2luIC0tIHdpbGwgYmUgZml4ZWQgc29vbmlzaCkuCisjCisjIERlZmluZSBOT19DOTlfRk9STUFUIGlmIHlvdXIgZm9ybWF0dGVkIElPIGZ1bmN0aW9ucyAocHJpbnRmL3NjYW5mIGV0LmFsLikKKyMgZG8gbm90IHN1cHBvcnQgdGhlICdzaXplIHNwZWNpZmllcnMnIGludHJvZHVjZWQgYnkgQzk5LCBuYW1lbHkgbGwsIGhoLAorIyBqLCB6LCB0LiAocmVwcmVzZW50aW5nIGxvbmcgbG9uZyBpbnQsIGNoYXIsIGludG1heF90LCBzaXplX3QsIHB0cmRpZmZfdCkuCisjIHNvbWUgYyBjb21waWxlcnMgc3VwcG9ydGVkIHRoZXNlIHNwZWNpZmllcnMgcHJpb3IgdG8gQzk5IGFzIGFuIGV4dGVuc2lvbi4KKyMKKyMgRGVmaW5lIE5PX1NUUkNBU0VTVFIgaWYgeW91IGRvbid0IGhhdmUgc3RyY2FzZXN0ci4KKyMKKyMgRGVmaW5lIE5PX1NUUkxDUFkgaWYgeW91IGRvbid0IGhhdmUgc3RybGNweS4KKyMKKyMgRGVmaW5lIE5PX1NFVEVOViBpZiB5b3UgZG9uJ3QgaGF2ZSBzZXRlbnYgaW4gdGhlIEMgbGlicmFyeS4KKyMKKyMgRGVmaW5lIE5PX1NZTUxJTktfSEVBRCBpZiB5b3UgbmV2ZXIgd2FudCAuZ2l0L0hFQUQgdG8gYmUgYSBzeW1ib2xpYyBsaW5rLgorIyBFbmFibGUgaXQgb24gV2luZG93cy4gIEJ5IGRlZmF1bHQsIHN5bXJlZnMgYXJlIHN0aWxsIHVzZWQuCisjCisjIERlZmluZSBOT19TVk5fVEVTVFMgaWYgeW91IHdhbnQgdG8gc2tpcCB0aW1lLWNvbnN1bWluZyBTVk4gaW50ZXJvcGVyYWJpbGl0eQorIyB0ZXN0cy4gIFRoZXNlIHRlc3RzIHRha2UgdXAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGhlIHRvdGFsIHRlc3QgdGltZQorIyBidXQgYXJlIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBwbGFuIHRvIHRhbGsgdG8gU1ZOIHJlcG9zLgorIworIyBEZWZpbmUgTk9fRklOSyBpZiB5b3UgYXJlIGJ1aWxkaW5nIG9uIERhcndpbi9NYWMgT1MgWCwgaGF2ZSBGaW5rCisjIGluc3RhbGxlZCBpbiAvc3csIGJ1dCBkb24ndCB3YW50IEdJVCB0byBsaW5rIGFnYWluc3QgYW55IGxpYnJhcmllcworIyBpbnN0YWxsZWQgdGhlcmUuICBJZiBkZWZpbmVkIHlvdSBtYXkgc3BlY2lmeSB5b3VyIG93biAob3IgRmluaydzKQorIyBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzIGJ5IGRlZmluaW5nIENGTEFHUworIyBhbmQgTERGTEFHUyBhcHByb3ByaWF0ZWx5LgorIworIyBEZWZpbmUgTk9fREFSV0lOX1BPUlRTIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gRGFyd2luL01hYyBPUyBYLAorIyBoYXZlIERhcndpblBvcnRzIGluc3RhbGxlZCBpbiAvb3B0L2xvY2FsLCBidXQgZG9uJ3Qgd2FudCBHSVQgdG8KKyMgbGluayBhZ2FpbnN0IGFueSBsaWJyYXJpZXMgaW5zdGFsbGVkIHRoZXJlLiAgSWYgZGVmaW5lZCB5b3UgbWF5CisjIHNwZWNpZnkgeW91ciBvd24gKG9yIERhcndpblBvcnQncykgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQKKyMgbGlicmFyeSBkaXJlY3RvcmllcyBieSBkZWZpbmluZyBDRkxBR1MgYW5kIExERkxBR1MgYXBwcm9wcmlhdGVseS4KKyMKKyMgRGVmaW5lIFBQQ19TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBQb3dlclBDLgorIworIyBEZWZpbmUgQVJNX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBvcHRpbWl6ZWQgZm9yIEFSTS4KKyMKKyMgRGVmaW5lIE5FRURTX1NTTF9XSVRIX0NSWVBUTyBpZiB5b3UgbmVlZCAtbGNyeXB0byB3aXRoIC1sc3NsIChEYXJ3aW4pLgorIworIyBEZWZpbmUgTkVFRFNfTElCSUNPTlYgaWYgbGlua2luZyB3aXRoIGxpYmMgaXMgbm90IGVub3VnaCAoRGFyd2luKS4KKyMKKyMgRGVmaW5lIE5FRURTX1NPQ0tFVCBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChTdW5PUywKKyMgUGF0cmljayBNYXVyaXR6KS4KKyMKKyMgRGVmaW5lIE5PX01NQVAgaWYgeW91IHdhbnQgdG8gYXZvaWQgbW1hcC4KKyMKKyMgRGVmaW5lIFdJVEhfT1dOX1NVQlBST0NFU1NfUFkgaWYgeW91IHdhbnQgdG8gdXNlIHdpdGggcHl0aG9uIDIuMy4KKyMKKyMgRGVmaW5lIE5PX0lQVjYgaWYgeW91IGxhY2sgSVB2NiBzdXBwb3J0IGFuZCBnZXRhZGRyaW5mbygpLgorIworIyBEZWZpbmUgTk9fU09DS0FERFJfU1RPUkFHRSBpZiB5b3VyIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgc3RydWN0CisjIHNvY2thZGRyX3N0b3JhZ2UuCisjCisjIERlZmluZSBOT19JQ09OViBpZiB5b3VyIGxpYmMgZG9lcyBub3QgcHJvcGVybHkgc3VwcG9ydCBpY29udi4KKyMKKyMgRGVmaW5lIE5PX0FDQ1VSQVRFX0RJRkYgaWYgeW91ciBkaWZmIHByb2dyYW0gYXQgbGVhc3Qgc29tZXRpbWVzIG1pc3NlcworIyBhIG1pc3NpbmcgbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorIworIyBEZWZpbmUgTk9fUFlUSE9OIGlmIHlvdSB3YW50IHRvIGxvc2UgYWxsIGJlbmVmaXRzIG9mIHRoZSByZWN1cnNpdmUgbWVyZ2UuCisjCisjIERlZmluZSBDT0xMSVNJT05fQ0hFQ0sgYmVsb3cgaWYgeW91IGJlbGlldmUgdGhhdCBTSEExJ3MKKyMgMTQ2MTUwMTYzNzMzMDkwMjkxODIwMzY4NDgzMjcxNjI4MzAxOTY1NTkzMjU0Mjk3NiBoYXNoZXMgZG8gbm90IGdpdmUgeW91CisjIHN1ZmZpY2llbnQgZ3VhcmFudGVlIHRoYXQgbm8gY29sbGlzaW9ucyBiZXR3ZWVuIG9iamVjdHMgd2lsbCBldmVyIGhhcHBlbi4KKworIyBEZWZpbmUgVVNFX05TRUMgYmVsb3cgaWYgeW91IHdhbnQgZ2l0IHRvIGNhcmUgYWJvdXQgc3ViLXNlY29uZCBmaWxlIG10aW1lcworIyBhbmQgY3RpbWVzLiBOb3RlIHRoYXQgeW91IG5lZWQgcmVjZW50IGdsaWJjIChhdCBsZWFzdCAyLjIuNCkgZm9yIHRoaXMsIGFuZAorIyBpdCB3aWxsIEJSRUFLIFlPVVIgTE9DQUwgRElGRlMhIHNob3ctZGlmZiBhbmQgYW55dGhpbmcgdXNpbmcgaXQgd2lsbCBsaWtlbHkKKyMgcmFuZG9tbHkgYnJlYWsgdW5sZXNzIHlvdXIgdW5kZXJseWluZyBmaWxlc3lzdGVtIHN1cHBvcnRzIHRob3NlIHN1Yi1zZWNvbmQKKyMgdGltZXMgKG15IGV4dDMgZG9lc24ndCkuCisKKyMgRGVmaW5lIFVTRV9TVERFViBiZWxvdyBpZiB5b3Ugd2FudCBnaXQgdG8gY2FyZSBhYm91dCB0aGUgdW5kZXJseWluZyBkZXZpY2UKKyMgY2hhbmdlIGJlaW5nIGNvbnNpZGVyZWQgYW4gaW5vZGUgY2hhbmdlIGZyb20gdGhlIHVwZGF0ZS1jYWNoZSBwZXJzcGVjdGl2ZS4KKworR0lULVZFUlNJT04tRklMRTogLkZPUkNFLUdJVC1WRVJTSU9OLUZJTEUKKwlAJChTSEVMTF9QQVRIKSAuL0dJVC1WRVJTSU9OLUdFTgorLWluY2x1ZGUgR0lULVZFUlNJT04tRklMRQorCit1bmFtZV9TIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1zIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX00gOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLW0gMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfTyA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtbyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9SIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1yIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX1AgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXAgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQorCisjIENGTEFHUyBhbmQgTERGTEFHUyBhcmUgZm9yIHRoZSB1c2VycyB0byBvdmVycmlkZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKK0NGTEFHUyA9IC1nIC1PMiAtV2FsbAorTERGTEFHUyA9CitBTExfQ0ZMQUdTID0gJChDRkxBR1MpCitBTExfTERGTEFHUyA9ICQoTERGTEFHUykKK1NUUklQID89IHN0cmlwCisKK3ByZWZpeCA9ICQoSE9NRSkKK2JpbmRpciA9ICQocHJlZml4KS9iaW4KK2dpdGV4ZWNkaXIgPSAkKGJpbmRpcikKK3RlbXBsYXRlX2RpciA9ICQocHJlZml4KS9zaGFyZS9naXQtY29yZS90ZW1wbGF0ZXMvCitHSVRfUFlUSE9OX0RJUiA9ICQocHJlZml4KS9zaGFyZS9naXQtY29yZS9weXRob24KKyMgREVTVERJUj0KKworZXhwb3J0IHByZWZpeCBiaW5kaXIgZ2l0ZXhlY2RpciB0ZW1wbGF0ZV9kaXIgR0lUX1BZVEhPTl9ESVIKKworQ0MgPSBnY2MKK0FSID0gYXIKK1RBUiA9IHRhcgorSU5TVEFMTCA9IGluc3RhbGwKK1JQTUJVSUxEID0gcnBtYnVpbGQKKworIyBzcGFyc2UgaXMgYXJjaGl0ZWN0dXJlLW5ldXRyYWwsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmVlZCB0byB0ZWxsIGl0CisjIGV4cGxpY2l0bHkgd2hhdCBhcmNoaXRlY3R1cmUgdG8gY2hlY2sgZm9yLiBGaXggdGhpcyB1cCBmb3IgeW91cnMuLgorU1BBUlNFX0ZMQUdTID0gLURfX0JJR19FTkRJQU5fXyAtRF9fcG93ZXJwY19fCisKKworCisjIyMgLS0tIEVORCBDT05GSUdVUkFUSU9OIFNFQ1RJT04gLS0tCisKK1NDUklQVF9TSCA9IFwKKwlnaXQtYmlzZWN0LnNoIGdpdC1icmFuY2guc2ggZ2l0LWNoZWNrb3V0LnNoIFwKKwlnaXQtY2hlcnJ5LnNoIGdpdC1jbGVhbi5zaCBnaXQtY2xvbmUuc2ggZ2l0LWNvbW1pdC5zaCBcCisJZ2l0LWZldGNoLnNoIFwKKwlnaXQtbHMtcmVtb3RlLnNoIFwKKwlnaXQtbWVyZ2Utb25lLWZpbGUuc2ggZ2l0LXBhcnNlLXJlbW90ZS5zaCBcCisJZ2l0LXB1bGwuc2ggZ2l0LXJlYmFzZS5zaCBcCisJZ2l0LXJlcGFjay5zaCBnaXQtcmVxdWVzdC1wdWxsLnNoIGdpdC1yZXNldC5zaCBcCisJZ2l0LXJlc29sdmUuc2ggZ2l0LXJldmVydC5zaCBnaXQtc2gtc2V0dXAuc2ggXAorCWdpdC10YWcuc2ggZ2l0LXZlcmlmeS10YWcuc2ggXAorCWdpdC1hcHBseW1ib3guc2ggZ2l0LWFwcGx5cGF0Y2guc2ggZ2l0LWFtLnNoIFwKKwlnaXQtbWVyZ2Uuc2ggZ2l0LW1lcmdlLXN0dXBpZC5zaCBnaXQtbWVyZ2Utb2N0b3B1cy5zaCBcCisJZ2l0LW1lcmdlLXJlc29sdmUuc2ggZ2l0LW1lcmdlLW91cnMuc2ggXAorCWdpdC1sb3N0LWZvdW5kLnNoIGdpdC1xdWlsdGltcG9ydC5zaAorCitTQ1JJUFRfUEVSTCA9IFwKKwlnaXQtYXJjaGltcG9ydC5wZXJsIGdpdC1jdnNpbXBvcnQucGVybCBnaXQtcmVsaW5rLnBlcmwgXAorCWdpdC1zaG9ydGxvZy5wZXJsIGdpdC1yZXJlcmUucGVybCBcCisJZ2l0LWFubm90YXRlLnBlcmwgZ2l0LWN2c3NlcnZlci5wZXJsIFwKKwlnaXQtc3ZuaW1wb3J0LnBlcmwgZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsIFwKKwlnaXQtc2VuZC1lbWFpbC5wZXJsIGdpdC1zdm4ucGVybAorCitTQ1JJUFRfUFlUSE9OID0gXAorCWdpdC1tZXJnZS1yZWN1cnNpdmUucHkKKworU0NSSVBUUyA9ICQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgXAorCSAgJChwYXRzdWJzdCAlLnBlcmwsJSwkKFNDUklQVF9QRVJMKSkgXAorCSAgJChwYXRzdWJzdCAlLnB5LCUsJChTQ1JJUFRfUFlUSE9OKSkgXAorCSAgZ2l0LWNoZXJyeS1waWNrIGdpdC1zdGF0dXMgZ2l0LWluc3Rhd2ViCisKKyMgVGhlIG9uZXMgdGhhdCBkbyBub3QgaGF2ZSB0byBsaW5rIHdpdGggbGNyeXB0bywgbHogbm9yIHhkaWZmLgorU0lNUExFX1BST0dSQU1TID0gXAorCWdpdC1kYWVtb24kWAorCisjIC4uLiBhbmQgYWxsIHRoZSByZXN0IHRoYXQgY291bGQgYmUgbW92ZWQgb3V0IG9mIGJpbmRpciB0byBnaXRleGVjZGlyCitQUk9HUkFNUyA9IFwKKwlnaXQtY2hlY2tvdXQtaW5kZXgkWCBcCisJZ2l0LWNvbnZlcnQtb2JqZWN0cyRYIGdpdC1mZXRjaC1wYWNrJFggZ2l0LWZzY2stb2JqZWN0cyRYIFwKKwlnaXQtaGFzaC1vYmplY3QkWCBnaXQtaW5kZXgtcGFjayRYIGdpdC1sb2NhbC1mZXRjaCRYIFwKKwlnaXQtbWVyZ2UtYmFzZSRYIFwKKwlnaXQtbWVyZ2UtaW5kZXgkWCBnaXQtbWt0YWckWCBnaXQtbWt0cmVlJFggZ2l0LXBhY2stb2JqZWN0cyRYIGdpdC1wYXRjaC1pZCRYIFwKKwlnaXQtcGVlay1yZW1vdGUkWCBnaXQtcmVjZWl2ZS1wYWNrJFggXAorCWdpdC1zZW5kLXBhY2skWCBnaXQtc2hlbGwkWCBcCisJZ2l0LXNob3ctaW5kZXgkWCBnaXQtc3NoLWZldGNoJFggXAorCWdpdC1zc2gtdXBsb2FkJFggZ2l0LXVucGFjay1maWxlJFggXAorCWdpdC11bnBhY2stb2JqZWN0cyRYIGdpdC11cGRhdGUtc2VydmVyLWluZm8kWCBcCisJZ2l0LXVwbG9hZC1wYWNrJFggZ2l0LXZlcmlmeS1wYWNrJFggXAorCWdpdC1zeW1ib2xpYy1yZWYkWCBcCisJZ2l0LW5hbWUtcmV2JFggZ2l0LXBhY2stcmVkdW5kYW50JFggZ2l0LXZhciRYIFwKKwlnaXQtZGVzY3JpYmUkWCBnaXQtbWVyZ2UtdHJlZSRYIGdpdC1ibGFtZSRYIGdpdC1pbWFwLXNlbmQkWAorCitCVUlMVF9JTlMgPSBnaXQtbG9nJFggZ2l0LXdoYXRjaGFuZ2VkJFggZ2l0LXNob3ckWCBnaXQtdXBkYXRlLXJlZiRYIFwKKwlnaXQtY291bnQtb2JqZWN0cyRYIGdpdC1kaWZmJFggZ2l0LXB1c2gkWCBnaXQtbWFpbHNwbGl0JFggXAorCWdpdC1ncmVwJFggZ2l0LWFkZCRYIGdpdC1ybSRYIGdpdC1yZXYtbGlzdCRYIGdpdC1zdHJpcHNwYWNlJFggXAorCWdpdC1jaGVjay1yZWYtZm9ybWF0JFggZ2l0LXJldi1wYXJzZSRYIGdpdC1tYWlsaW5mbyRYIFwKKwlnaXQtaW5pdC1kYiRYIGdpdC10YXItdHJlZSRYIGdpdC11cGxvYWQtdGFyJFggZ2l0LWZvcm1hdC1wYXRjaCRYIFwKKwlnaXQtbHMtZmlsZXMkWCBnaXQtbHMtdHJlZSRYIGdpdC1nZXQtdGFyLWNvbW1pdC1pZCRYIFwKKwlnaXQtcmVhZC10cmVlJFggZ2l0LWNvbW1pdC10cmVlJFggZ2l0LXdyaXRlLXRyZWUkWCBcCisJZ2l0LWFwcGx5JFggZ2l0LXNob3ctYnJhbmNoJFggZ2l0LWRpZmYtZmlsZXMkWCBnaXQtdXBkYXRlLWluZGV4JFggXAorCWdpdC1kaWZmLWluZGV4JFggZ2l0LWRpZmYtc3RhZ2VzJFggZ2l0LWRpZmYtdHJlZSRYIGdpdC1jYXQtZmlsZSRYIFwKKwlnaXQtZm10LW1lcmdlLW1zZyRYIGdpdC1wcnVuZSRYIGdpdC1tdiRYIGdpdC1wcnVuZS1wYWNrZWQkWCBcCisJZ2l0LXJlcG8tY29uZmlnJFgKKworIyB3aGF0ICdhbGwnIHdpbGwgYnVpbGQgYW5kICdpbnN0YWxsJyB3aWxsIGluc3RhbGwsIGluIGdpdGV4ZWNkaXIKK0FMTF9QUk9HUkFNUyA9ICQoUFJPR1JBTVMpICQoU0lNUExFX1BST0dSQU1TKSAkKFNDUklQVFMpCisKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtLSB0byBiZSByZW1vdmVkIGFmdGVyIDEuMAorUFJPR1JBTVMgKz0gZ2l0LXNzaC1wdWxsJFggZ2l0LXNzaC1wdXNoJFgKKworIyBTZXQgcGF0aHMgdG8gdG9vbHMgZWFybHkgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGZvciB2ZXJzaW9uIHRlc3RzLgoraWZuZGVmIFNIRUxMX1BBVEgKKwlTSEVMTF9QQVRIID0gL2Jpbi9zaAorZW5kaWYKK2lmbmRlZiBQRVJMX1BBVEgKKwlQRVJMX1BBVEggPSAvdXNyL2Jpbi9wZXJsCitlbmRpZgoraWZuZGVmIFBZVEhPTl9QQVRICisJUFlUSE9OX1BBVEggPSAvdXNyL2Jpbi9weXRob24KK2VuZGlmCisKK1BZTU9EVUxFUyA9IFwKKwlnaXRNZXJnZUNvbW1vbi5weQorCitMSUJfRklMRT1saWJnaXQuYQorWERJRkZfTElCPXhkaWZmL2xpYi5hCisKK0xJQl9IID0gXAorCWJsb2IuaCBjYWNoZS5oIGNvbW1pdC5oIGNzdW0tZmlsZS5oIGRlbHRhLmggXAorCWRpZmYuaCBvYmplY3QuaCBwYWNrLmggcGt0LWxpbmUuaCBxdW90ZS5oIHJlZnMuaCBcCisJcnVuLWNvbW1hbmQuaCBzdHJidWYuaCB0YWcuaCB0cmVlLmggZ2l0LWNvbXBhdC11dGlsLmggcmV2aXNpb24uaCBcCisJdHJlZS13YWxrLmggbG9nLXRyZWUuaCBkaXIuaCBwYXRoLWxpc3QuaAorCitESUZGX09CSlMgPSBcCisJZGlmZi5vIGRpZmYtbGliLm8gZGlmZmNvcmUtYnJlYWsubyBkaWZmY29yZS1vcmRlci5vIFwKKwlkaWZmY29yZS1waWNrYXhlLm8gZGlmZmNvcmUtcmVuYW1lLm8gdHJlZS1kaWZmLm8gY29tYmluZS1kaWZmLm8gXAorCWRpZmZjb3JlLWRlbHRhLm8gbG9nLXRyZWUubworCitMSUJfT0JKUyA9IFwKKwlibG9iLm8gY29tbWl0Lm8gY29ubmVjdC5vIGNzdW0tZmlsZS5vIGNhY2hlLXRyZWUubyBiYXNlODUubyBcCisJZGF0ZS5vIGRpZmYtZGVsdGEubyBlbnRyeS5vIGV4ZWNfY21kLm8gaWRlbnQubyBsb2NrZmlsZS5vIFwKKwlvYmplY3QubyBwYWNrLWNoZWNrLm8gcGF0Y2gtZGVsdGEubyBwYXRoLm8gcGt0LWxpbmUubyBcCisJcXVvdGUubyByZWFkLWNhY2hlLm8gcmVmcy5vIHJ1bi1jb21tYW5kLm8gZGlyLm8gb2JqZWN0LXJlZnMubyBcCisJc2VydmVyLWluZm8ubyBzZXR1cC5vIHNoYTFfZmlsZS5vIHNoYTFfbmFtZS5vIHN0cmJ1Zi5vIFwKKwl0YWcubyB0cmVlLm8gdXNhZ2UubyBjb25maWcubyBlbnZpcm9ubWVudC5vIGN0eXBlLm8gY29weS5vIFwKKwlmZXRjaC1jbG9uZS5vIHJldmlzaW9uLm8gcGFnZXIubyB0cmVlLXdhbGsubyB4ZGlmZi1pbnRlcmZhY2UubyBcCisJYWxsb2MubyBtZXJnZS1maWxlLm8gcGF0aC1saXN0Lm8gJChESUZGX09CSlMpCisKK0JVSUxUSU5fT0JKUyA9IFwKKwlidWlsdGluLWxvZy5vIGJ1aWx0aW4taGVscC5vIGJ1aWx0aW4tY291bnQubyBidWlsdGluLWRpZmYubyBidWlsdGluLXB1c2gubyBcCisJYnVpbHRpbi1ncmVwLm8gYnVpbHRpbi1hZGQubyBidWlsdGluLXJldi1saXN0Lm8gYnVpbHRpbi1jaGVjay1yZWYtZm9ybWF0Lm8gXAorCWJ1aWx0aW4tcm0ubyBidWlsdGluLWluaXQtZGIubyBidWlsdGluLXJldi1wYXJzZS5vIFwKKwlidWlsdGluLXRhci10cmVlLm8gYnVpbHRpbi11cGxvYWQtdGFyLm8gYnVpbHRpbi11cGRhdGUtaW5kZXgubyBcCisJYnVpbHRpbi1scy1maWxlcy5vIGJ1aWx0aW4tbHMtdHJlZS5vIGJ1aWx0aW4td3JpdGUtdHJlZS5vIFwKKwlidWlsdGluLXJlYWQtdHJlZS5vIGJ1aWx0aW4tY29tbWl0LXRyZWUubyBidWlsdGluLW1haWxpbmZvLm8gXAorCWJ1aWx0aW4tYXBwbHkubyBidWlsdGluLXNob3ctYnJhbmNoLm8gYnVpbHRpbi1kaWZmLWZpbGVzLm8gXAorCWJ1aWx0aW4tZGlmZi1pbmRleC5vIGJ1aWx0aW4tZGlmZi1zdGFnZXMubyBidWlsdGluLWRpZmYtdHJlZS5vIFwKKwlidWlsdGluLWNhdC1maWxlLm8gYnVpbHRpbi1tYWlsc3BsaXQubyBidWlsdGluLXN0cmlwc3BhY2UubyBcCisJYnVpbHRpbi11cGRhdGUtcmVmLm8gYnVpbHRpbi1mbXQtbWVyZ2UtbXNnLm8gYnVpbHRpbi1wcnVuZS5vIFwKKwlidWlsdGluLW12Lm8gYnVpbHRpbi1wcnVuZS1wYWNrZWQubyBidWlsdGluLXJlcG8tY29uZmlnLm8KKworR0lUTElCUyA9ICQoTElCX0ZJTEUpICQoWERJRkZfTElCKQorTElCUyA9ICQoR0lUTElCUykgLWx6CisKKyMKKyMgUGxhdGZvcm0gc3BlY2lmaWMgdHdlYWtzCisjCisKKyMgV2UgY2hvb3NlIHRvIGF2b2lkICJpZiAuLiBlbHNlIGlmIC4uIGVsc2UgLi4gZW5kaWYgZW5kaWYiCisjIGJlY2F1c2UgbWFpbnRhaW5pbmcgdGhlIG5lc3RpbmcgdG8gbWF0Y2ggaXMgYSBwYWluLiAgSWYKKyMgd2UgaGFkICJlbGlmIiB0aGluZ3Mgd291bGQgaGF2ZSBiZWVuIG11Y2ggbmljZXIuLi4KKworaWZlcSAoJCh1bmFtZV9TKSxMaW51eCkKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxHTlUva0ZyZWVCU0QpCisJTk9fU1RSTENQWSA9IFllc1BsZWFzZQorZW5kaWYKK2lmZXEgKCQodW5hbWVfUyksRGFyd2luKQorCU5FRURTX1NTTF9XSVRIX0NSWVBUTyA9IFllc1BsZWFzZQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJTk9fU1RSTENQWSA9IFllc1BsZWFzZQorCWlmbmRlZiBOT19GSU5LCisJCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvc3cvbGliICYmIGVjaG8geSkseSkKKwkJCUFMTF9DRkxBR1MgKz0gLUkvc3cvaW5jbHVkZQorCQkJQUxMX0xERkxBR1MgKz0gLUwvc3cvbGliCisJCWVuZGlmCisJZW5kaWYKKwlpZm5kZWYgTk9fREFSV0lOX1BPUlRTCisJCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvb3B0L2xvY2FsL2xpYiAmJiBlY2hvIHkpLHkpCisJCQlBTExfQ0ZMQUdTICs9IC1JL29wdC9sb2NhbC9pbmNsdWRlCisJCQlBTExfTERGTEFHUyArPSAtTC9vcHQvbG9jYWwvbGliCisJCWVuZGlmCisJZW5kaWYKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLFN1bk9TKQorCU5FRURTX1NPQ0tFVCA9IFllc1BsZWFzZQorCU5FRURTX05TTCA9IFllc1BsZWFzZQorCVNIRUxMX1BBVEggPSAvYmluL2Jhc2gKKwlOT19TVFJDQVNFU1RSID0gWWVzUGxlYXNlCisJTk9fU1RSTENQWSA9IFllc1BsZWFzZQorCWlmZXEgKCQodW5hbWVfUiksNS44KQorCQlORUVEU19MSUJJQ09OViA9IFllc1BsZWFzZQorCQlOT19VTlNFVEVOViA9IFllc1BsZWFzZQorCQlOT19TRVRFTlYgPSBZZXNQbGVhc2UKKwllbmRpZgorCWlmZXEgKCQodW5hbWVfUiksNS45KQorCQlOT19VTlNFVEVOViA9IFllc1BsZWFzZQorCQlOT19TRVRFTlYgPSBZZXNQbGVhc2UKKwllbmRpZgorCUlOU1RBTEwgPSBnaW5zdGFsbAorCVRBUiA9IGd0YXIKKwlBTExfQ0ZMQUdTICs9IC1EX19FWFRFTlNJT05TX18KK2VuZGlmCitpZmVxICgkKHVuYW1lX08pLEN5Z3dpbikKKwlOT19EX1RZUEVfSU5fRElSRU5UID0gWWVzUGxlYXNlCisJTk9fRF9JTk9fSU5fRElSRU5UID0gWWVzUGxlYXNlCisJTk9fU1RSQ0FTRVNUUiA9IFllc1BsZWFzZQorCU5PX1NZTUxJTktfSEVBRCA9IFllc1BsZWFzZQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJTk9fQzk5X0ZPUk1BVCA9IFllc1BsZWFzZQorCSMgVGhlcmUgYXJlIGNvbmZsaWN0aW5nIHJlcG9ydHMgYWJvdXQgdGhpcy4KKwkjIE9uIHNvbWUgYm94ZXMgTk9fTU1BUCBpcyBuZWVkZWQsIGFuZCBub3Qgc28gZWxzZXdoZXJlLgorCSMgVHJ5IHVuY29tbWVudGluZyB0aGlzIGlmIHlvdSBzZWUgdGhpbmdzIGJyZWFrIC0tIFlNTVYuCisJIyBOT19NTUFQID0gWWVzUGxlYXNlCisJTk9fSVBWNiA9IFllc1BsZWFzZQorCVggPSAuZXhlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxGcmVlQlNEKQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJQUxMX0NGTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9sb2NhbC9saWIKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLE9wZW5CU0QpCisJTk9fU1RSQ0FTRVNUUiA9IFllc1BsZWFzZQorCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJQUxMX0NGTEFHUyArPSAtSS91c3IvbG9jYWwvaW5jbHVkZQorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9sb2NhbC9saWIKK2VuZGlmCitpZmVxICgkKHVuYW1lX1MpLE5ldEJTRCkKKwlpZmVxICgkKHNoZWxsIGV4cHIgIiQodW5hbWVfUikiIDogJ1swMV1cLicpLDIpCisJCU5FRURTX0xJQklDT05WID0gWWVzUGxlYXNlCisJZW5kaWYKKwlBTExfQ0ZMQUdTICs9IC1JL3Vzci9wa2cvaW5jbHVkZQorCUFMTF9MREZMQUdTICs9IC1ML3Vzci9wa2cvbGliIC1XbCwtcnBhdGgsL3Vzci9wa2cvbGliCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxBSVgpCisJTk9fU1RSQ0FTRVNUUj1ZZXNQbGVhc2UKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCisJTkVFRFNfTElCSUNPTlY9WWVzUGxlYXNlCitlbmRpZgoraWZlcSAoJCh1bmFtZV9TKSxJUklYNjQpCisJTk9fSVBWNj1ZZXNQbGVhc2UKKwlOT19TRVRFTlY9WWVzUGxlYXNlCisJTk9fU1RSQ0FTRVNUUj1ZZXNQbGVhc2UKKwlOT19TVFJMQ1BZID0gWWVzUGxlYXNlCisJTk9fU09DS0FERFJfU1RPUkFHRT1ZZXNQbGVhc2UKKwlTSEVMTF9QQVRIPS91c3IvZ251L2Jpbi9iYXNoCisJQUxMX0NGTEFHUyArPSAtRFBBVEhfTUFYPTEwMjQKKwkjIGZvciBub3csIGJ1aWxkIDMyLWJpdCB2ZXJzaW9uCisJQUxMX0xERkxBR1MgKz0gLUwvdXNyL2xpYjMyCitlbmRpZgoraWZuZXEgKCwkKGZpbmRzdHJpbmcgYXJtLCQodW5hbWVfTSkpKQorCUFSTV9TSEExID0gWWVzUGxlYXNlCitlbmRpZgorCistaW5jbHVkZSBjb25maWcubWFrLmF1dG9nZW4KKy1pbmNsdWRlIGNvbmZpZy5tYWsKKworaWZkZWYgV0lUSF9PV05fU1VCUFJPQ0VTU19QWQorCVBZTU9EVUxFUyArPSBjb21wYXQvc3VicHJvY2Vzcy5weQorZWxzZQorCWlmZXEgKCQoTk9fUFlUSE9OKSwpCisJCWlmbmVxICgkKHNoZWxsICQoUFlUSE9OX1BBVEgpIC1jICdpbXBvcnQgc3VicHJvY2VzcztwcmludCJPSyInIDI+L2Rldi9udWxsKSxPSykKKwkJCVBZTU9EVUxFUyArPSBjb21wYXQvc3VicHJvY2Vzcy5weQorCQllbmRpZgorCWVuZGlmCitlbmRpZgorCitpZm5kZWYgTk9fQ1VSTAorCWlmZGVmIENVUkxESVIKKwkJIyBUaGlzIGlzIHN0aWxsIHByb2JsZW1hdGljIC0tIGdjYyBkb2VzIG5vdCBhbHdheXMgd2FudCAtUi4KKwkJQUxMX0NGTEFHUyArPSAtSSQoQ1VSTERJUikvaW5jbHVkZQorCQlDVVJMX0xJQkNVUkwgPSAtTCQoQ1VSTERJUikvbGliIC1SJChDVVJMRElSKS9saWIgLWxjdXJsCisJZWxzZQorCQlDVVJMX0xJQkNVUkwgPSAtbGN1cmwKKwllbmRpZgorCVBST0dSQU1TICs9IGdpdC1odHRwLWZldGNoJFgKKwljdXJsX2NoZWNrIDo9ICQoc2hlbGwgKGVjaG8gMDcwOTA4OyBjdXJsLWNvbmZpZyAtLXZlcm51bSkgfCBzb3J0IC1yIHwgc2VkIC1uZSAycCkKKwlpZmVxICIkKGN1cmxfY2hlY2spIiAiMDcwOTA4IgorCQlpZm5kZWYgTk9fRVhQQVQKKwkJCVBST0dSQU1TICs9IGdpdC1odHRwLXB1c2gkWAorCQllbmRpZgorCWVuZGlmCisJaWZuZGVmIE5PX0VYUEFUCisJCUVYUEFUX0xJQkVYUEFUID0gLWxleHBhdAorCWVuZGlmCitlbmRpZgorCitpZm5kZWYgTk9fT1BFTlNTTAorCU9QRU5TU0xfTElCU1NMID0gLWxzc2wKKwlpZmRlZiBPUEVOU1NMRElSCisJCSMgQWdhaW4gdGhpcyBtYXkgYmUgcHJvYmxlbWF0aWMgLS0gZ2NjIGRvZXMgbm90IGFsd2F5cyB3YW50IC1SLgorCQlBTExfQ0ZMQUdTICs9IC1JJChPUEVOU1NMRElSKS9pbmNsdWRlCisJCU9QRU5TU0xfTElOSyA9IC1MJChPUEVOU1NMRElSKS9saWIgLVIkKE9QRU5TU0xESVIpL2xpYgorCWVsc2UKKwkJT1BFTlNTTF9MSU5LID0KKwllbmRpZgorZWxzZQorCUFMTF9DRkxBR1MgKz0gLUROT19PUEVOU1NMCisJTU9aSUxMQV9TSEExID0gMQorCU9QRU5TU0xfTElCU1NMID0KK2VuZGlmCitpZmRlZiBORUVEU19TU0xfV0lUSF9DUllQVE8KKwlMSUJfNF9DUllQVE8gPSAkKE9QRU5TU0xfTElOSykgLWxjcnlwdG8gLWxzc2wKK2Vsc2UKKwlMSUJfNF9DUllQVE8gPSAkKE9QRU5TU0xfTElOSykgLWxjcnlwdG8KK2VuZGlmCitpZmRlZiBORUVEU19MSUJJQ09OVgorCWlmZGVmIElDT05WRElSCisJCSMgQWdhaW4gdGhpcyBtYXkgYmUgcHJvYmxlbWF0aWMgLS0gZ2NjIGRvZXMgbm90IGFsd2F5cyB3YW50IC1SLgorCQlBTExfQ0ZMQUdTICs9IC1JJChJQ09OVkRJUikvaW5jbHVkZQorCQlJQ09OVl9MSU5LID0gLUwkKElDT05WRElSKS9saWIgLVIkKElDT05WRElSKS9saWIKKwllbHNlCisJCUlDT05WX0xJTksgPQorCWVuZGlmCisJTElCUyArPSAkKElDT05WX0xJTkspIC1saWNvbnYKK2VuZGlmCitpZmRlZiBORUVEU19TT0NLRVQKKwlMSUJTICs9IC1sc29ja2V0CisJU0lNUExFX0xJQiArPSAtbHNvY2tldAorZW5kaWYKK2lmZGVmIE5FRURTX05TTAorCUxJQlMgKz0gLWxuc2wKKwlTSU1QTEVfTElCICs9IC1sbnNsCitlbmRpZgoraWZkZWYgTk9fRF9UWVBFX0lOX0RJUkVOVAorCUFMTF9DRkxBR1MgKz0gLUROT19EX1RZUEVfSU5fRElSRU5UCitlbmRpZgoraWZkZWYgTk9fRF9JTk9fSU5fRElSRU5UCisJQUxMX0NGTEFHUyArPSAtRE5PX0RfSU5PX0lOX0RJUkVOVAorZW5kaWYKK2lmZGVmIE5PX0M5OV9GT1JNQVQKKwlBTExfQ0ZMQUdTICs9IC1ETk9fQzk5X0ZPUk1BVAorZW5kaWYKK2lmZGVmIE5PX1NZTUxJTktfSEVBRAorCUFMTF9DRkxBR1MgKz0gLUROT19TWU1MSU5LX0hFQUQKK2VuZGlmCitpZmRlZiBOT19TVFJDQVNFU1RSCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1NUUkNBU0VTVFIKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RyY2FzZXN0ci5vCitlbmRpZgoraWZkZWYgTk9fU1RSTENQWQorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJMQ1BZCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3N0cmxjcHkubworZW5kaWYKK2lmZGVmIE5PX1NFVEVOVgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc2V0ZW52Lm8KK2VuZGlmCitpZmRlZiBOT19TRVRFTlYKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fVU5TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvdW5zZXRlbnYubworZW5kaWYKK2lmZGVmIE5PX01NQVAKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fTU1BUAorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9tbWFwLm8KK2VuZGlmCitpZmRlZiBOT19JUFY2CisJQUxMX0NGTEFHUyArPSAtRE5PX0lQVjYKK2VuZGlmCitpZmRlZiBOT19TT0NLQUREUl9TVE9SQUdFCitpZmRlZiBOT19JUFY2CisJQUxMX0NGTEFHUyArPSAtRHNvY2thZGRyX3N0b3JhZ2U9c29ja2FkZHJfaW4KK2Vsc2UKKwlBTExfQ0ZMQUdTICs9IC1Ec29ja2FkZHJfc3RvcmFnZT1zb2NrYWRkcl9pbjYKK2VuZGlmCitlbmRpZgoraWZkZWYgTk9fSU5FVF9OVE9QCisJTElCX09CSlMgKz0gY29tcGF0L2luZXRfbnRvcC5vCitlbmRpZgorCitpZmRlZiBOT19JQ09OVgorCUFMTF9DRkxBR1MgKz0gLUROT19JQ09OVgorZW5kaWYKKworaWZkZWYgUFBDX1NIQTEKKwlTSEExX0hFQURFUiA9ICJwcGMvc2hhMS5oIgorCUxJQl9PQkpTICs9IHBwYy9zaGExLm8gcHBjL3NoYTFwcGMubworZWxzZQoraWZkZWYgQVJNX1NIQTEKKwlTSEExX0hFQURFUiA9ICJhcm0vc2hhMS5oIgorCUxJQl9PQkpTICs9IGFybS9zaGExLm8gYXJtL3NoYTFfYXJtLm8KK2Vsc2UKK2lmZGVmIE1PWklMTEFfU0hBMQorCVNIQTFfSEVBREVSID0gIm1vemlsbGEtc2hhMS9zaGExLmgiCisJTElCX09CSlMgKz0gbW96aWxsYS1zaGExL3NoYTEubworZWxzZQorCVNIQTFfSEVBREVSID0gPG9wZW5zc2wvc2hhLmg+CisJTElCUyArPSAkKExJQl80X0NSWVBUTykKK2VuZGlmCitlbmRpZgorZW5kaWYKK2lmZGVmIE5PX0FDQ1VSQVRFX0RJRkYKKwlBTExfQ0ZMQUdTICs9IC1ETk9fQUNDVVJBVEVfRElGRgorZW5kaWYKKworIyBTaGVsbCBxdW90ZSAoZG8gbm90IHVzZSAkKGNhbGwpIHRvIGFjY29tbW9kYXRlIGFuY2llbnQgc2V0dXBzKTsKKworU0hBMV9IRUFERVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIQTFfSEVBREVSKSkKKworREVTVERJUl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoREVTVERJUikpCitiaW5kaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGJpbmRpcikpCitnaXRleGVjZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChnaXRleGVjZGlyKSkKK3RlbXBsYXRlX2Rpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQodGVtcGxhdGVfZGlyKSkKK3ByZWZpeF9TUSA9ICQoc3Vic3QgJywnXCcnLCQocHJlZml4KSkKKworU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCitQRVJMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFBFUkxfUEFUSCkpCitQWVRIT05fUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoUFlUSE9OX1BBVEgpKQorR0lUX1BZVEhPTl9ESVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKEdJVF9QWVRIT05fRElSKSkKKworQUxMX0NGTEFHUyArPSAtRFNIQTFfSEVBREVSPSckKFNIQTFfSEVBREVSX1NRKScgJChDT01QQVRfQ0ZMQUdTKQorTElCX09CSlMgKz0gJChDT01QQVRfT0JKUykKK2V4cG9ydCBwcmVmaXggVEFSIElOU1RBTEwgREVTVERJUiBTSEVMTF9QQVRIIHRlbXBsYXRlX2RpcgorIyMjIEJ1aWxkIHJ1bGVzCisKK2FsbDogJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWCBnaXRrCisKK2FsbDoKKwkkKE1BS0UpIC1DIHRlbXBsYXRlcworCitzdHJpcDogJChQUk9HUkFNUykgZ2l0JFgKKwkkKFNUUklQKSAkKFNUUklQX09QVFMpICQoUFJPR1JBTVMpIGdpdCRYCisKK2dpdCRYOiBnaXQuYyBjb21tb24tY21kcy5oICQoQlVJTFRJTl9PQkpTKSAkKEdJVExJQlMpIEdJVC1DRkxBR1MKKwkkKENDKSAtREdJVF9WRVJTSU9OPSciJChHSVRfVkVSU0lPTikiJyBcCisJCSQoQUxMX0NGTEFHUykgLW8gJEAgJChmaWx0ZXIgJS5jLCReKSBcCisJCSQoQlVJTFRJTl9PQkpTKSAkKEFMTF9MREZMQUdTKSAkKExJQlMpCisKK2J1aWx0aW4taGVscC5vOiBjb21tb24tY21kcy5oCisKKyQoQlVJTFRfSU5TKTogZ2l0JFgKKwlybSAtZiAkQCAmJiBsbiBnaXQkWCAkQAorCitjb21tb24tY21kcy5oOiBEb2N1bWVudGF0aW9uL2dpdC0qLnR4dAorCS4vZ2VuZXJhdGUtY21kbGlzdC5zaCA+ICRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpIDogJSA6ICUuc2gKKwlybSAtZiAkQCAkQCsKKwlzZWQgLWUgJzFzfCMhLiovc2h8IyEkKFNIRUxMX1BBVEhfU1EpfCcgXAorCSAgICAtZSAnc3xAQFBFUkxAQHwkKFBFUkxfUEFUSF9TUSl8ZycgXAorCSAgICAtZSAncy9AQEdJVF9WRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgXAorCSAgICAtZSAncy9AQE5PX0NVUkxAQC8kKE5PX0NVUkwpL2cnIFwKKwkgICAgLWUgJ3MvQEBOT19QWVRIT05AQC8kKE5PX1BZVEhPTikvZycgXAorCSAgICAkQC5zaCA+JEArCisJY2htb2QgK3ggJEArCisJbXYgJEArICRACisKKyQocGF0c3Vic3QgJS5wZXJsLCUsJChTQ1JJUFRfUEVSTCkpIDogJSA6ICUucGVybAorCXJtIC1mICRAICRAKworCXNlZCAtZSAnMXN8IyEuKnBlcmx8IyEkKFBFUkxfUEFUSF9TUSl8JyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgICRALnBlcmwgPiRAKworCWNobW9kICt4ICRAKworCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUucHksJSwkKFNDUklQVF9QWVRIT04pKSA6ICUgOiAlLnB5IEdJVC1DRkxBR1MKKwlybSAtZiAkQCAkQCsKKwlzZWQgLWUgJzFzfCMhLipweXRob258IyEkKFBZVEhPTl9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJ3N8QEBHSVRfUFlUSE9OX1BBVEhAQHwkKEdJVF9QWVRIT05fRElSX1NRKXxnJyBcCisJICAgIC1lICdzL0BAR0lUX1ZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyBcCisJICAgICRALnB5ID4kQCsKKwljaG1vZCAreCAkQCsKKwltdiAkQCsgJEAKKworZ2l0LWNoZXJyeS1waWNrOiBnaXQtcmV2ZXJ0CisJY3AgJDwgJEArCisJbXYgJEArICRACisKK2dpdC1zdGF0dXM6IGdpdC1jb21taXQKKwljcCAkPCAkQCsKKwltdiAkQCsgJEAKKworZ2l0LWluc3Rhd2ViOiBnaXQtaW5zdGF3ZWIuc2ggZ2l0d2ViL2dpdHdlYi5jZ2kgZ2l0d2ViL2dpdHdlYi5jc3MKKwlybSAtZiAkQCAkQCsKKwlzZWQgLWUgJzFzfCMhLiovc2h8IyEkKFNIRUxMX1BBVEhfU1EpfCcgXAorCSAgICAtZSAncy9AQEdJVF9WRVJTSU9OQEAvJChHSVRfVkVSU0lPTikvZycgXAorCSAgICAtZSAncy9AQE5PX0NVUkxAQC8kKE5PX0NVUkwpL2cnIFwKKwkgICAgLWUgJ3MvQEBOT19QWVRIT05AQC8kKE5PX1BZVEhPTikvZycgXAorCSAgICAtZSAnL0BAR0lUV0VCX0NHSUBAL3IgZ2l0d2ViL2dpdHdlYi5jZ2knIFwKKwkgICAgLWUgJy9AQEdJVFdFQl9DR0lAQC9kJyBcCisJICAgIC1lICcvQEBHSVRXRUJfQ1NTQEAvciBnaXR3ZWIvZ2l0d2ViLmNzcycgXAorCSAgICAtZSAnL0BAR0lUV0VCX0NTU0BAL2QnIFwKKwkgICAgJEAuc2ggfCBzZWQgInN8L3Vzci9iaW4vZ2l0fCQoYmluZGlyKS9naXR8IiA+ICRAKworCWNobW9kICt4ICRAKworCW12ICRAKyAkQAorCisjIFRoZXNlIGNhbiByZWNvcmQgR0lUX1ZFUlNJT04KK2dpdCRYIGdpdC5zcGVjIFwKKwkkKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpIFwKKwkkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSBcCisJJChwYXRzdWJzdCAlLnB5LCUsJChTQ1JJUFRfUFlUSE9OKSkgXAorCTogR0lULVZFUlNJT04tRklMRQorCislLm86ICUuYyBHSVQtQ0ZMQUdTCisJJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICQ8CislLm86ICUuUworCSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAkPAorCitleGVjX2NtZC5vOiBleGVjX2NtZC5jIEdJVC1DRkxBR1MKKwkkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgJy1ER0lUX0VYRUNfUEFUSD0iJChnaXRleGVjZGlyX1NRKSInICQ8CitidWlsdGluLWluaXQtZGIubzogYnVpbHRpbi1pbml0LWRiLmMgR0lULUNGTEFHUworCSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtRERFRkFVTFRfR0lUX1RFTVBMQVRFX0RJUj0nIiQodGVtcGxhdGVfZGlyX1NRKSInICQ8CisKK2h0dHAubzogaHR0cC5jIEdJVC1DRkxBR1MKKwkkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgLURHSVRfVVNFUl9BR0VOVD0nImdpdC8kKEdJVF9WRVJTSU9OKSInICQ8CisKK2lmZGVmIE5PX0VYUEFUCitodHRwLWZldGNoLm86IGh0dHAtZmV0Y2guYyBodHRwLmggR0lULUNGTEFHUworCSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtRE5PX0VYUEFUICQ8CitlbmRpZgorCitnaXQtJSRYOiAlLm8gJChHSVRMSUJTKQorCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSAkKExJQlMpCisKKyQoU0lNUExFX1BST0dSQU1TKSA6ICQoTElCX0ZJTEUpCiskKFNJTVBMRV9QUk9HUkFNUykgOiBnaXQtJSRYIDogJS5vCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pIFwKKwkJJChMSUJfRklMRSkgJChTSU1QTEVfTElCKQorCitzc2gtcHVsbC5vOiBzc2gtZmV0Y2guYworc3NoLXB1c2gubzogc3NoLXVwbG9hZC5jCitnaXQtbG9jYWwtZmV0Y2gkWDogZmV0Y2gubworZ2l0LXNzaC1mZXRjaCRYOiByc2gubyBmZXRjaC5vCitnaXQtc3NoLXVwbG9hZCRYOiByc2gubworZ2l0LXNzaC1wdWxsJFg6IHJzaC5vIGZldGNoLm8KK2dpdC1zc2gtcHVzaCRYOiByc2gubworCitnaXQtaW1hcC1zZW5kJFg6IGltYXAtc2VuZC5vICQoTElCX0ZJTEUpCisKK2h0dHAubyBodHRwLWZldGNoLm8gaHR0cC1wdXNoLm86IGh0dHAuaAorZ2l0LWh0dHAtZmV0Y2gkWDogZmV0Y2gubyBodHRwLm8gaHR0cC1mZXRjaC5vICQoR0lUTElCUykKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgXAorCQkkKExJQlMpICQoQ1VSTF9MSUJDVVJMKSAkKEVYUEFUX0xJQkVYUEFUKQorCitnaXQtaHR0cC1wdXNoJFg6IHJldmlzaW9uLm8gaHR0cC5vIGh0dHAtcHVzaC5vICQoR0lUTElCUykKKwkkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgXAorCQkkKExJQlMpICQoQ1VSTF9MSUJDVVJMKSAkKEVYUEFUX0xJQkVYUEFUKQorCiskKExJQl9PQkpTKSAkKEJVSUxUSU5fT0JKUyk6ICQoTElCX0gpCiskKHBhdHN1YnN0IGdpdC0lJFgsJS5vLCQoUFJPR1JBTVMpKTogJChMSUJfSCkgJCh3aWxkY2FyZCAqLyouaCkKKyQoRElGRl9PQkpTKTogZGlmZmNvcmUuaAorCiskKExJQl9GSUxFKTogJChMSUJfT0JKUykKKwlybSAtZiAkQCAmJiAkKEFSKSByY3MgJEAgJChMSUJfT0JKUykKKworWERJRkZfT0JKUz14ZGlmZi94ZGlmZmkubyB4ZGlmZi94cHJlcGFyZS5vIHhkaWZmL3h1dGlscy5vIHhkaWZmL3hlbWl0Lm8KKworJChYRElGRl9MSUIpOiAkKFhESUZGX09CSlMpCisJcm0gLWYgJEAgJiYgJChBUikgcmNzICRAICQoWERJRkZfT0JKUykKKworCitkb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGFsbAorCitUQUdTOgorCXJtIC1mIFRBR1MKKwlmaW5kIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGV0YWdzIC1hCisKK3RhZ3M6CisJcm0gLWYgdGFncworCWZpbmQgLiAtbmFtZSAnKi5baGNTXScgLXByaW50IHwgeGFyZ3MgY3RhZ3MgLWEKKworIyMjIERldGVjdCBwcmVmaXggY2hhbmdlcworVFJBQ0tfQ0ZMQUdTID0gJChzdWJzdCAnLCdcJycsJChBTExfQ0ZMQUdTKSk6JChHSVRfUFlUSE9OX0RJUl9TUSk6XAorICAgICAgICAgICAgICQoYmluZGlyX1NRKTokKGdpdGV4ZWNkaXJfU1EpOiQodGVtcGxhdGVfZGlyX1NRKTokKHByZWZpeF9TUSkKKworR0lULUNGTEFHUzogLkZPUkNFLUdJVC1DRkxBR1MKKwlARkxBR1M9JyQoVFJBQ0tfQ0ZMQUdTKSc7IFwKKwkgICAgaWYgdGVzdCB4IiQkRkxBR1MiICE9IHgiYGNhdCBHSVQtQ0ZMQUdTIDI+L2Rldi9udWxsYCIgOyB0aGVuIFwKKwkJZWNobyAxPiYyICIgICAgKiBuZXcgYnVpbGQgZmxhZ3Mgb3IgcHJlZml4IjsgXAorCQllY2hvICIkJEZMQUdTIiA+R0lULUNGTEFHUzsgXAorICAgICAgICAgICAgZmkKKworIyMjIFRlc3RpbmcgcnVsZXMKKworIyBHTlUgbWFrZSBzdXBwb3J0cyBleHBvcnRpbmcgYWxsIHZhcmlhYmxlcyBieSAiZXhwb3J0IiB3aXRob3V0IHBhcmFtZXRlcnMuCisjIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCBnZXRzIHF1aXRlIGJpZywgYW5kIHNvbWUgcHJvZ3JhbXMgaGF2ZSBwcm9ibGVtcworIyB3aXRoIHRoYXQuCisKK2V4cG9ydCBOT19QWVRIT04KK2V4cG9ydCBOT19TVk5fVEVTVFMKKwordGVzdDogYWxsCisJJChNQUtFKSAtQyB0LyBhbGwKKwordGVzdC1kYXRlJFg6IHRlc3QtZGF0ZS5jIGRhdGUubyBjdHlwZS5vCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSB0ZXN0LWRhdGUuYyBkYXRlLm8gY3R5cGUubworCit0ZXN0LWRlbHRhJFg6IHRlc3QtZGVsdGEuYyBkaWZmLWRlbHRhLm8gcGF0Y2gtZGVsdGEubworCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJF4KKwordGVzdC1kdW1wLWNhY2hlLXRyZWUkWDogZHVtcC1jYWNoZS10cmVlLm8gJChHSVRMSUJTKQorCSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSAkKExJQlMpCisKK3Rlc3Qtc2hhMSRYOiB0ZXN0LXNoYTEubyAkKEdJVExJQlMpCisJJChDQykgJChBTExfQ0ZMQUdTKSAtbyAkQCAkKEFMTF9MREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pICQoTElCUykKKworY2hlY2stc2hhMTo6IHRlc3Qtc2hhMSRYCisJLi90ZXN0LXNoYTEuc2gKKworY2hlY2s6CisJZm9yIGkgaW4gKi5jOyBkbyBzcGFyc2UgJChBTExfQ0ZMQUdTKSAkKFNQQVJTRV9GTEFHUykgJCRpIHx8IGV4aXQ7IGRvbmUKKworCisKKyMjIyBJbnN0YWxsYXRpb24gcnVsZXMKKworaW5zdGFsbDogYWxsCisJJChJTlNUQUxMKSAtZCAtbTc1NSAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKScKKwkkKElOU1RBTEwpIC1kIC1tNzU1ICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKScKKwkkKElOU1RBTEwpICQoQUxMX1BST0dSQU1TKSAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSknCisJJChJTlNUQUxMKSBnaXQkWCBnaXRrICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpJworCSQoTUFLRSkgLUMgdGVtcGxhdGVzIERFU1RESVI9JyQoREVTVERJUl9TUSknIGluc3RhbGwKKwkkKElOU1RBTEwpIC1kIC1tNzU1ICckKERFU1RESVJfU1EpJChHSVRfUFlUSE9OX0RJUl9TUSknCisJJChJTlNUQUxMKSAkKFBZTU9EVUxFUykgJyQoREVTVERJUl9TUSkkKEdJVF9QWVRIT05fRElSX1NRKScKKwlpZiB0ZXN0ICd6JChiaW5kaXJfU1EpJyAhPSAneiQoZ2l0ZXhlY2Rpcl9TUSknOyBcCisJdGhlbiBcCisJCWxuIC1mICckKERFU1RESVJfU1EpJChiaW5kaXJfU1EpL2dpdCRYJyBcCisJCQknJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvZ2l0JFgnIHx8IFwKKwkJY3AgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSkvZ2l0JFgnIFwKKwkJCSckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS9naXQkWCc7IFwKKwlmaQorCSQoZm9yZWFjaCBwLCQoQlVJTFRfSU5TKSwgcm0gLWYgJyQoREVTVERJUl9TUSkkKGdpdGV4ZWNkaXJfU1EpLyRwJyAmJiBsbiAnJChERVNURElSX1NRKSQoZ2l0ZXhlY2Rpcl9TUSkvZ2l0JFgnICckKERFU1RESVJfU1EpJChnaXRleGVjZGlyX1NRKS8kcCcgOykKKworaW5zdGFsbC1kb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluc3RhbGwKKworCisKKworIyMjIE1haW50YWluZXIncyBkaXN0IHJ1bGVzCisKK2dpdC5zcGVjOiBnaXQuc3BlYy5pbgorCXNlZCAtZSAncy9AQFZFUlNJT05AQC8kKEdJVF9WRVJTSU9OKS9nJyA8ICQ8ID4gJEArCisJbXYgJEArICRACisKK0dJVF9UQVJOQU1FPWdpdC0kKEdJVF9WRVJTSU9OKQorZGlzdDogZ2l0LnNwZWMgZ2l0LXRhci10cmVlCisJLi9naXQtdGFyLXRyZWUgSEVBRF57dHJlZX0gJChHSVRfVEFSTkFNRSkgPiAkKEdJVF9UQVJOQU1FKS50YXIKKwlAbWtkaXIgLXAgJChHSVRfVEFSTkFNRSkKKwlAY3AgZ2l0LnNwZWMgJChHSVRfVEFSTkFNRSkKKwlAZWNobyAkKEdJVF9WRVJTSU9OKSA+ICQoR0lUX1RBUk5BTUUpL3ZlcnNpb24KKwkkKFRBUikgcmYgJChHSVRfVEFSTkFNRSkudGFyIFwKKwkJJChHSVRfVEFSTkFNRSkvZ2l0LnNwZWMgJChHSVRfVEFSTkFNRSkvdmVyc2lvbgorCUBybSAtcmYgJChHSVRfVEFSTkFNRSkKKwlnemlwIC1mIC05ICQoR0lUX1RBUk5BTUUpLnRhcgorCitycG06IGRpc3QKKwkkKFJQTUJVSUxEKSAtdGEgJChHSVRfVEFSTkFNRSkudGFyLmd6CisKK2h0bWxkb2NzID0gZ2l0LWh0bWxkb2NzLSQoR0lUX1ZFUlNJT04pCittYW5wYWdlcyA9IGdpdC1tYW5wYWdlcy0kKEdJVF9WRVJTSU9OKQorZGlzdC1kb2M6CisJcm0gLWZyIC5kb2MtdG1wLWRpcgorCW1rZGlyIC5kb2MtdG1wLWRpcgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBXRUJET0NfREVTVD0uLi8uZG9jLXRtcC1kaXIgaW5zdGFsbC13ZWJkb2MKKwljZCAuZG9jLXRtcC1kaXIgJiYgJChUQVIpIGNmIC4uLyQoaHRtbGRvY3MpLnRhciAuCisJZ3ppcCAtbiAtOSAtZiAkKGh0bWxkb2NzKS50YXIKKwk6CisJcm0gLWZyIC5kb2MtdG1wLWRpcgorCW1rZGlyIC5kb2MtdG1wLWRpciAuZG9jLXRtcC1kaXIvbWFuMSAuZG9jLXRtcC1kaXIvbWFuNworCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBERVNURElSPS4vIFwKKwkJbWFuMWRpcj0uLi8uZG9jLXRtcC1kaXIvbWFuMSBcCisJCW1hbjdkaXI9Li4vLmRvYy10bXAtZGlyL21hbjcgXAorCQlpbnN0YWxsCisJY2QgLmRvYy10bXAtZGlyICYmICQoVEFSKSBjZiAuLi8kKG1hbnBhZ2VzKS50YXIgLgorCWd6aXAgLW4gLTkgLWYgJChtYW5wYWdlcykudGFyCisJcm0gLWZyIC5kb2MtdG1wLWRpcgorCisjIyMgQ2xlYW5pbmcgcnVsZXMKKworY2xlYW46CisJcm0gLWYgKi5vIG1vemlsbGEtc2hhMS8qLm8gYXJtLyoubyBwcGMvKi5vIGNvbXBhdC8qLm8geGRpZmYvKi5vIFwKKwkJJChMSUJfRklMRSkgJChYRElGRl9MSUIpCisJcm0gLWYgJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBnaXQkWAorCXJtIC1mICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MKKwlybSAtcmYgYXV0b200dGUuY2FjaGUKKwlybSAtZiBjb25maWcubG9nIGNvbmZpZy5tYWsuYXV0b2dlbiBjb25maWd1cmUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKKwlybSAtcmYgJChHSVRfVEFSTkFNRSkgLmRvYy10bXAtZGlyCisJcm0gLWYgJChHSVRfVEFSTkFNRSkudGFyLmd6IGdpdC1jb3JlXyQoR0lUX1ZFUlNJT04pLSoudGFyLmd6CisJcm0gLWYgJChodG1sZG9jcykudGFyLmd6ICQobWFucGFnZXMpLnRhci5negorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbi8gY2xlYW4KKwkkKE1BS0UpIC1DIHRlbXBsYXRlcyBjbGVhbgorCSQoTUFLRSkgLUMgdC8gY2xlYW4KKwlybSAtZiBHSVQtVkVSU0lPTi1GSUxFIEdJVC1DRkxBR1MKKworLlBIT05ZOiBhbGwgaW5zdGFsbCBjbGVhbiBzdHJpcAorLlBIT05ZOiAuRk9SQ0UtR0lULVZFUlNJT04tRklMRSBUQUdTIHRhZ3MgLkZPUkNFLUdJVC1DRkxBR1MKKworIyMjIENoZWNrIGRvY3VtZW50YXRpb24KKyMKK2NoZWNrLWRvY3M6OgorCUBmb3IgdiBpbiAkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpIGdpdCRYIGdpdGs7IFwKKwlkbyBcCisJCWNhc2UgIiQkdiIgaW4gXAorCQlnaXQtbWVyZ2Utb2N0b3B1cyB8IGdpdC1tZXJnZS1vdXJzIHwgZ2l0LW1lcmdlLXJlY3Vyc2l2ZSB8IFwKKwkJZ2l0LW1lcmdlLXJlc29sdmUgfCBnaXQtbWVyZ2Utc3R1cGlkIHwgXAorCQlnaXQtc3NoLXB1bGwgfCBnaXQtc3NoLXB1c2ggKSBjb250aW51ZSA7OyBcCisJCWVzYWMgOyBcCisJCXRlc3QgLWYgIkRvY3VtZW50YXRpb24vJCR2LnR4dCIgfHwgXAorCQllY2hvICJubyBkb2M6ICQkdiI7IFwKKwkJZ3JlcCAtcSAiXmdpdGxpbms6JCR2XFtbMC05XVxdOjoiIERvY3VtZW50YXRpb24vZ2l0LnR4dCB8fCBcCisJCWNhc2UgIiQkdiIgaW4gXAorCQlnaXQpIDs7IFwKKwkJKikgZWNobyAibm8gbGluazogJCR2Ijs7IFwKKwkJZXNhYyA7IFwKKwlkb25lIHwgc29ydApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTdlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9SRUFETUUKQEAgLTAsMCArMSw1ODkgQEAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCUdJVCAtIHRoZSBzdHVwaWQgY29udGVudCB0cmFja2VyCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyJnaXQiIGNhbiBtZWFuIGFueXRoaW5nLCBkZXBlbmRpbmcgb24geW91ciBtb29kLgorCisgLSByYW5kb20gdGhyZWUtbGV0dGVyIGNvbWJpbmF0aW9uIHRoYXQgaXMgcHJvbm91bmNlYWJsZSwgYW5kIG5vdAorICAgYWN0dWFsbHkgdXNlZCBieSBhbnkgY29tbW9uIFVOSVggY29tbWFuZC4gIFRoZSBmYWN0IHRoYXQgaXQgaXMgYQorICAgbWlzcHJvbnVuY2lhdGlvbiBvZiAiZ2V0IiBtYXkgb3IgbWF5IG5vdCBiZSByZWxldmFudC4KKyAtIHN0dXBpZC4gY29udGVtcHRpYmxlIGFuZCBkZXNwaWNhYmxlLiBzaW1wbGUuIFRha2UgeW91ciBwaWNrIGZyb20gdGhlCisgICBkaWN0aW9uYXJ5IG9mIHNsYW5nLgorIC0gImdsb2JhbCBpbmZvcm1hdGlvbiB0cmFja2VyIjogeW91J3JlIGluIGEgZ29vZCBtb29kLCBhbmQgaXQgYWN0dWFsbHkKKyAgIHdvcmtzIGZvciB5b3UuIEFuZ2VscyBzaW5nLCBhbmQgYSBsaWdodCBzdWRkZW5seSBmaWxscyB0aGUgcm9vbS4gCisgLSAiZ29kZGFtbiBpZGlvdGljIHRydWNrbG9hZCBvZiBzaCp0Ijogd2hlbiBpdCBicmVha3MKKworVGhpcyBpcyBhIHN0dXBpZCAoYnV0IGV4dHJlbWVseSBmYXN0KSBkaXJlY3RvcnkgY29udGVudCBtYW5hZ2VyLiAgSXQKK2RvZXNuJ3QgZG8gYSB3aG9sZSBsb3QsIGJ1dCB3aGF0IGl0ICdkb2VzJyBkbyBpcyB0cmFjayBkaXJlY3RvcnkKK2NvbnRlbnRzIGVmZmljaWVudGx5LiAKKworVGhlcmUgYXJlIHR3byBvYmplY3QgYWJzdHJhY3Rpb25zOiB0aGUgIm9iamVjdCBkYXRhYmFzZSIsIGFuZCB0aGUKKyJjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSIgYWthICJpbmRleCIuCisKK1RoZSBPYmplY3QgRGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBvYmplY3QgZGF0YWJhc2UgaXMgbGl0ZXJhbGx5IGp1c3QgYSBjb250ZW50LWFkZHJlc3NhYmxlIGNvbGxlY3Rpb24KK29mIG9iamVjdHMuICBBbGwgb2JqZWN0cyBhcmUgbmFtZWQgYnkgdGhlaXIgY29udGVudCwgd2hpY2ggaXMKK2FwcHJveGltYXRlZCBieSB0aGUgU0hBMSBoYXNoIG9mIHRoZSBvYmplY3QgaXRzZWxmLiAgT2JqZWN0cyBtYXkgcmVmZXIKK3RvIG90aGVyIG9iamVjdHMgKGJ5IHJlZmVyZW5jaW5nIHRoZWlyIFNIQTEgaGFzaCksIGFuZCBzbyB5b3UgY2FuCitidWlsZCB1cCBhIGhpZXJhcmNoeSBvZiBvYmplY3RzLgorCitBbGwgb2JqZWN0cyBoYXZlIGEgc3RhdGljYWxseSBkZXRlcm1pbmVkICJ0eXBlIiBha2EgInRhZyIsIHdoaWNoIGlzCitkZXRlcm1pbmVkIGF0IG9iamVjdCBjcmVhdGlvbiB0aW1lLCBhbmQgd2hpY2ggaWRlbnRpZmllcyB0aGUgZm9ybWF0IG9mCit0aGUgb2JqZWN0IChpLmUuIGhvdyBpdCBpcyB1c2VkLCBhbmQgaG93IGl0IGNhbiByZWZlciB0byBvdGhlcgorb2JqZWN0cykuICBUaGVyZSBhcmUgY3VycmVudGx5IGZvdXIgZGlmZmVyZW50IG9iamVjdCB0eXBlczogImJsb2IiLAorInRyZWUiLCAiY29tbWl0IiBhbmQgInRhZyIuCisKK0EgImJsb2IiIG9iamVjdCBjYW5ub3QgcmVmZXIgdG8gYW55IG90aGVyIG9iamVjdCwgYW5kIGlzLCBsaWtlIHRoZSB0eXBlCitpbXBsaWVzLCBhIHB1cmUgc3RvcmFnZSBvYmplY3QgY29udGFpbmluZyBzb21lIHVzZXIgZGF0YS4gIEl0IGlzIHVzZWQgdG8KK2FjdHVhbGx5IHN0b3JlIHRoZSBmaWxlIGRhdGEsIGkuZS4gYSBibG9iIG9iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggc29tZQorcGFydGljdWxhciB2ZXJzaW9uIG9mIHNvbWUgZmlsZS4gCisKK0EgInRyZWUiIG9iamVjdCBpcyBhbiBvYmplY3QgdGhhdCB0aWVzIG9uZSBvciBtb3JlICJibG9iIiBvYmplY3RzIGludG8gYQorZGlyZWN0b3J5IHN0cnVjdHVyZS4gSW4gYWRkaXRpb24sIGEgdHJlZSBvYmplY3QgY2FuIHJlZmVyIHRvIG90aGVyIHRyZWUKK29iamVjdHMsIHRodXMgY3JlYXRpbmcgYSBkaXJlY3RvcnkgaGllcmFyY2h5LiAKKworQSAiY29tbWl0IiBvYmplY3QgdGllcyBzdWNoIGRpcmVjdG9yeSBoaWVyYXJjaGllcyB0b2dldGhlciBpbnRvCithIERBRyBvZiByZXZpc2lvbnMgLSBlYWNoICJjb21taXQiIGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSB0cmVlCisodGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkgYXQgdGhlIHRpbWUgb2YgdGhlIGNvbW1pdCkuIEluIGFkZGl0aW9uLCBhCisiY29tbWl0IiByZWZlcnMgdG8gb25lIG9yIG1vcmUgInBhcmVudCIgY29tbWl0IG9iamVjdHMgdGhhdCBkZXNjcmliZSB0aGUKK2hpc3Rvcnkgb2YgaG93IHdlIGFycml2ZWQgYXQgdGhhdCBkaXJlY3RvcnkgaGllcmFyY2h5LgorCitBcyBhIHNwZWNpYWwgY2FzZSwgYSBjb21taXQgb2JqZWN0IHdpdGggbm8gcGFyZW50cyBpcyBjYWxsZWQgdGhlICJyb290Igorb2JqZWN0LCBhbmQgaXMgdGhlIHBvaW50IG9mIGFuIGluaXRpYWwgcHJvamVjdCBjb21taXQuICBFYWNoIHByb2plY3QKK211c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcm9vdCwgYW5kIHdoaWxlIHlvdSBjYW4gdGllIHNldmVyYWwgZGlmZmVyZW50Cityb290IG9iamVjdHMgdG9nZXRoZXIgaW50byBvbmUgcHJvamVjdCBieSBjcmVhdGluZyBhIGNvbW1pdCBvYmplY3Qgd2hpY2gKK2hhcyB0d28gb3IgbW9yZSBzZXBhcmF0ZSByb290cyBhcyBpdHMgdWx0aW1hdGUgcGFyZW50cywgdGhhdCdzIHByb2JhYmx5CitqdXN0IGdvaW5nIHRvIGNvbmZ1c2UgcGVvcGxlLiAgU28gYWltIGZvciB0aGUgbm90aW9uIG9mICJvbmUgcm9vdCBvYmplY3QKK3BlciBwcm9qZWN0IiwgZXZlbiBpZiBnaXQgaXRzZWxmIGRvZXMgbm90IGVuZm9yY2UgdGhhdC4gCisKK0EgInRhZyIgb2JqZWN0IHN5bWJvbGljYWxseSBpZGVudGlmaWVzIGFuZCBjYW4gYmUgdXNlZCB0byBzaWduIG90aGVyCitvYmplY3RzLiBJdCBjb250YWlucyB0aGUgaWRlbnRpZmllciBhbmQgdHlwZSBvZiBhbm90aGVyIG9iamVjdCwgYQorc3ltYm9saWMgbmFtZSAob2YgY291cnNlISkgYW5kLCBvcHRpb25hbGx5LCBhIHNpZ25hdHVyZS4KKworUmVnYXJkbGVzcyBvZiBvYmplY3QgdHlwZSwgYWxsIG9iamVjdHMgc2hhcmUgdGhlIGZvbGxvd2luZworY2hhcmFjdGVyaXN0aWNzOiB0aGV5IGFyZSBhbGwgZGVmbGF0ZWQgd2l0aCB6bGliLCBhbmQgaGF2ZSBhIGhlYWRlcgordGhhdCBub3Qgb25seSBzcGVjaWZpZXMgdGhlaXIgdHlwZSwgYnV0IGFsc28gcHJvdmlkZXMgc2l6ZSBpbmZvcm1hdGlvbgorYWJvdXQgdGhlIGRhdGEgaW4gdGhlIG9iamVjdC4gIEl0J3Mgd29ydGggbm90aW5nIHRoYXQgdGhlIFNIQTEgaGFzaAordGhhdCBpcyB1c2VkIHRvIG5hbWUgdGhlIG9iamVjdCBpcyB0aGUgaGFzaCBvZiB0aGUgb3JpZ2luYWwgZGF0YQorcGx1cyB0aGlzIGhlYWRlciwgc28gYHNoYTFzdW1gICdmaWxlJyBkb2VzIG5vdCBtYXRjaCB0aGUgb2JqZWN0IG5hbWUKK2ZvciAnZmlsZScuCisoSGlzdG9yaWNhbCBub3RlOiBpbiB0aGUgZGF3biBvZiB0aGUgYWdlIG9mIGdpdCB0aGUgaGFzaAord2FzIHRoZSBzaGExIG9mIHRoZSAnY29tcHJlc3NlZCcgb2JqZWN0LikKKworQXMgYSByZXN1bHQsIHRoZSBnZW5lcmFsIGNvbnNpc3RlbmN5IG9mIGFuIG9iamVjdCBjYW4gYWx3YXlzIGJlIHRlc3RlZAoraW5kZXBlbmRlbnRseSBvZiB0aGUgY29udGVudHMgb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdDogYWxsIG9iamVjdHMgY2FuCitiZSB2YWxpZGF0ZWQgYnkgdmVyaWZ5aW5nIHRoYXQgKGEpIHRoZWlyIGhhc2hlcyBtYXRjaCB0aGUgY29udGVudCBvZiB0aGUKK2ZpbGUgYW5kIChiKSB0aGUgb2JqZWN0IHN1Y2Nlc3NmdWxseSBpbmZsYXRlcyB0byBhIHN0cmVhbSBvZiBieXRlcyB0aGF0Citmb3JtcyBhIHNlcXVlbmNlIG9mIDxhc2NpaSB0eXBlIHdpdGhvdXQgc3BhY2U+ICsgPHNwYWNlPiArIDxhc2NpaSBkZWNpbWFsCitzaXplPiArIDxieXRlXDA+ICsgPGJpbmFyeSBvYmplY3QgZGF0YT4uIAorCitUaGUgc3RydWN0dXJlZCBvYmplY3RzIGNhbiBmdXJ0aGVyIGhhdmUgdGhlaXIgc3RydWN0dXJlIGFuZAorY29ubmVjdGl2aXR5IHRvIG90aGVyIG9iamVjdHMgdmVyaWZpZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IGRvbmUgd2l0aAordGhlIGBnaXQtZnNjay1vYmplY3RzYCBwcm9ncmFtLCB3aGljaCBnZW5lcmF0ZXMgYSBmdWxsIGRlcGVuZGVuY3kgZ3JhcGgKK29mIGFsbCBvYmplY3RzLCBhbmQgdmVyaWZpZXMgdGhlaXIgaW50ZXJuYWwgY29uc2lzdGVuY3kgKGluIGFkZGl0aW9uCit0byBqdXN0IHZlcmlmeWluZyB0aGVpciBzdXBlcmZpY2lhbCBjb25zaXN0ZW5jeSB0aHJvdWdoIHRoZSBoYXNoKS4KKworVGhlIG9iamVjdCB0eXBlcyBpbiBzb21lIG1vcmUgZGV0YWlsOgorCitCbG9iIE9iamVjdAorfn5+fn5+fn5+fn4KK0EgImJsb2IiIG9iamVjdCBpcyBub3RoaW5nIGJ1dCBhIGJpbmFyeSBibG9iIG9mIGRhdGEsIGFuZCBkb2Vzbid0CityZWZlciB0byBhbnl0aGluZyBlbHNlLiAgVGhlcmUgaXMgbm8gc2lnbmF0dXJlIG9yIGFueSBvdGhlcgordmVyaWZpY2F0aW9uIG9mIHRoZSBkYXRhLCBzbyB3aGlsZSB0aGUgb2JqZWN0IGlzIGNvbnNpc3RlbnQgKGl0ICdpcycKK2luZGV4ZWQgYnkgaXRzIHNoYTEgaGFzaCwgc28gdGhlIGRhdGEgaXRzZWxmIGlzIGNlcnRhaW5seSBjb3JyZWN0KSwgaXQKK2hhcyBhYnNvbHV0ZWx5IG5vIG90aGVyIGF0dHJpYnV0ZXMuICBObyBuYW1lIGFzc29jaWF0aW9ucywgbm8KK3Blcm1pc3Npb25zLiAgSXQgaXMgcHVyZWx5IGEgYmxvYiBvZiBkYXRhIChpLmUuIG5vcm1hbGx5ICJmaWxlCitjb250ZW50cyIpLgorCitJbiBwYXJ0aWN1bGFyLCBzaW5jZSB0aGUgYmxvYiBpcyBlbnRpcmVseSBkZWZpbmVkIGJ5IGl0cyBkYXRhLCBpZiB0d28KK2ZpbGVzIGluIGEgZGlyZWN0b3J5IHRyZWUgKG9yIGluIG11bHRpcGxlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKK3JlcG9zaXRvcnkpIGhhdmUgdGhlIHNhbWUgY29udGVudHMsIHRoZXkgd2lsbCBzaGFyZSB0aGUgc2FtZSBibG9iCitvYmplY3QuIFRoZSBvYmplY3QgaXMgdG90YWxseSBpbmRlcGVuZGVudCBvZiBpdHMgbG9jYXRpb24gaW4gdGhlCitkaXJlY3RvcnkgdHJlZSwgYW5kIHJlbmFtaW5nIGEgZmlsZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIG9iamVjdCB0aGF0CitmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBpbiBhbnkgd2F5LgorCitBIGJsb2IgaXMgdHlwaWNhbGx5IGNyZWF0ZWQgd2hlbiBnaXRsaW5rOmdpdC11cGRhdGUtaW5kZXhbMV0KK2lzIHJ1biwgYW5kIGl0cyBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBieSBnaXRsaW5rOmdpdC1jYXQtZmlsZVsxXS4KKworVHJlZSBPYmplY3QKK35+fn5+fn5+fn5+CitUaGUgbmV4dCBoaWVyYXJjaGljYWwgb2JqZWN0IHR5cGUgaXMgdGhlICJ0cmVlIiBvYmplY3QuICBBIHRyZWUgb2JqZWN0CitpcyBhIGxpc3Qgb2YgbW9kZS9uYW1lL2Jsb2IgZGF0YSwgc29ydGVkIGJ5IG5hbWUuICBBbHRlcm5hdGl2ZWx5LCB0aGUKK21vZGUgZGF0YSBtYXkgc3BlY2lmeSBhIGRpcmVjdG9yeSBtb2RlLCBpbiB3aGljaCBjYXNlIGluc3RlYWQgb2YKK25hbWluZyBhIGJsb2IsIHRoYXQgbmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggYW5vdGhlciBUUkVFIG9iamVjdC4KKworTGlrZSB0aGUgImJsb2IiIG9iamVjdCwgYSB0cmVlIG9iamVjdCBpcyB1bmlxdWVseSBkZXRlcm1pbmVkIGJ5IHRoZQorc2V0IGNvbnRlbnRzLCBhbmQgc28gdHdvIHNlcGFyYXRlIGJ1dCBpZGVudGljYWwgdHJlZXMgd2lsbCBhbHdheXMKK3NoYXJlIHRoZSBleGFjdCBzYW1lIG9iamVjdC4gVGhpcyBpcyB0cnVlIGF0IGFsbCBsZXZlbHMsIGkuZS4gaXQncwordHJ1ZSBmb3IgYSAibGVhZiIgdHJlZSAod2hpY2ggZG9lcyBub3QgcmVmZXIgdG8gYW55IG90aGVyIHRyZWVzLCBvbmx5CitibG9icykgYXMgd2VsbCBhcyBmb3IgYSB3aG9sZSBzdWJkaXJlY3RvcnkuCisKK0ZvciB0aGF0IHJlYXNvbiBhICJ0cmVlIiBvYmplY3QgaXMganVzdCBhIHB1cmUgZGF0YSBhYnN0cmFjdGlvbjogaXQKK2hhcyBubyBoaXN0b3J5LCBubyBzaWduYXR1cmVzLCBubyB2ZXJpZmljYXRpb24gb2YgdmFsaWRpdHksIGV4Y2VwdAordGhhdCBzaW5jZSB0aGUgY29udGVudHMgYXJlIGFnYWluIHByb3RlY3RlZCBieSB0aGUgaGFzaCBpdHNlbGYsIHdlIGNhbgordHJ1c3QgdGhhdCB0aGUgdHJlZSBpcyBpbW11dGFibGUgYW5kIGl0cyBjb250ZW50cyBuZXZlciBjaGFuZ2UuCisKK1NvIHlvdSBjYW4gdHJ1c3QgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSB0byBiZSB2YWxpZCwgdGhlIHNhbWUgd2F5IHlvdQorY2FuIHRydXN0IHRoZSBjb250ZW50cyBvZiBhIGJsb2IsIGJ1dCB5b3UgZG9uJ3Qga25vdyB3aGVyZSB0aG9zZQorY29udGVudHMgJ2NhbWUnIGZyb20uCisKK1NpZGUgbm90ZSBvbiB0cmVlczogc2luY2UgYSAidHJlZSIgb2JqZWN0IGlzIGEgc29ydGVkIGxpc3Qgb2YKKyJmaWxlbmFtZStjb250ZW50IiwgeW91IGNhbiBjcmVhdGUgYSBkaWZmIGJldHdlZW4gdHdvIHRyZWVzIHdpdGhvdXQKK2FjdHVhbGx5IGhhdmluZyB0byB1bnBhY2sgdHdvIHRyZWVzLiAgSnVzdCBpZ25vcmUgYWxsIGNvbW1vbiBwYXJ0cywKK2FuZCB5b3VyIGRpZmYgd2lsbCBsb29rIHJpZ2h0LiAgSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4gZWZmZWN0aXZlbHkKKyhhbmQgZWZmaWNpZW50bHkpIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbnkgdHdvIHJhbmRvbSB0cmVlcyBieQorTyhuKSB3aGVyZSAibiIgaXMgdGhlIHNpemUgb2YgdGhlIGRpZmZlcmVuY2UsIHJhdGhlciB0aGFuIHRoZSBzaXplIG9mCit0aGUgdHJlZS4KKworU2lkZSBub3RlIDIgb24gdHJlZXM6IHNpbmNlIHRoZSBuYW1lIG9mIGEgImJsb2IiIGRlcGVuZHMgZW50aXJlbHkgYW5kCitleGNsdXNpdmVseSBvbiBpdHMgY29udGVudHMgKGkuZS4gdGhlcmUgYXJlIG5vIG5hbWVzIG9yIHBlcm1pc3Npb25zCitpbnZvbHZlZCksIHlvdSBjYW4gc2VlIHRyaXZpYWwgcmVuYW1lcyBvciBwZXJtaXNzaW9uIGNoYW5nZXMgYnkKK25vdGljaW5nIHRoYXQgdGhlIGJsb2Igc3RheWVkIHRoZSBzYW1lLiAgSG93ZXZlciwgcmVuYW1lcyB3aXRoIGRhdGEKK2NoYW5nZXMgbmVlZCBhIHNtYXJ0ZXIgImRpZmYiIGltcGxlbWVudGF0aW9uLgorCitBIHRyZWUgaXMgY3JlYXRlZCB3aXRoIGdpdGxpbms6Z2l0LXdyaXRlLXRyZWVbMV0gYW5kCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtbHMtdHJlZVsxXS4KK1R3byB0cmVlcyBjYW4gYmUgY29tcGFyZWQgd2l0aCBnaXRsaW5rOmdpdC1kaWZmLXRyZWVbMV0uCisKK0NvbW1pdCBPYmplY3QKK35+fn5+fn5+fn5+fn4KK1RoZSAiY29tbWl0IiBvYmplY3QgaXMgYW4gb2JqZWN0IHRoYXQgaW50cm9kdWNlcyB0aGUgbm90aW9uIG9mCitoaXN0b3J5IGludG8gdGhlIHBpY3R1cmUuICBJbiBjb250cmFzdCB0byB0aGUgb3RoZXIgb2JqZWN0cywgaXQKK2RvZXNuJ3QganVzdCBkZXNjcmliZSB0aGUgcGh5c2ljYWwgc3RhdGUgb2YgYSB0cmVlLCBpdCBkZXNjcmliZXMgaG93Cit3ZSBnb3QgdGhlcmUsIGFuZCB3aHkuCisKK0EgImNvbW1pdCIgaXMgZGVmaW5lZCBieSB0aGUgdHJlZS1vYmplY3QgdGhhdCBpdCByZXN1bHRzIGluLCB0aGUKK3BhcmVudCBjb21taXRzICh6ZXJvLCBvbmUgb3IgbW9yZSkgdGhhdCBsZWQgdXAgdG8gdGhhdCBwb2ludCwgYW5kIGEKK2NvbW1lbnQgb24gd2hhdCBoYXBwZW5lZC4gIEFnYWluLCBhIGNvbW1pdCBpcyBub3QgdHJ1c3RlZCBwZXIgc2U6Cit0aGUgY29udGVudHMgYXJlIHdlbGwtZGVmaW5lZCBhbmQgInNhZmUiIGR1ZSB0byB0aGUgY3J5cHRvZ3JhcGhpY2FsbHkKK3N0cm9uZyBzaWduYXR1cmVzIGF0IGFsbCBsZXZlbHMsIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gdG8gYmVsaWV2ZQordGhhdCB0aGUgdHJlZSBpcyAiZ29vZCIgb3IgdGhhdCB0aGUgbWVyZ2UgaW5mb3JtYXRpb24gbWFrZXMgc2Vuc2UuCitUaGUgcGFyZW50cyBkbyBub3QgaGF2ZSB0byBhY3R1YWxseSBoYXZlIGFueSByZWxhdGlvbnNoaXAgd2l0aCB0aGUKK3Jlc3VsdCwgZm9yIGV4YW1wbGUuCisKK05vdGUgb24gY29tbWl0czogdW5saWtlIHJlYWwgU0NNJ3MsIGNvbW1pdHMgZG8gbm90IGNvbnRhaW4KK3JlbmFtZSBpbmZvcm1hdGlvbiBvciBmaWxlIG1vZGUgY2hhbmdlIGluZm9ybWF0aW9uLiAgQWxsIG9mIHRoYXQgaXMKK2ltcGxpY2l0IGluIHRoZSB0cmVlcyBpbnZvbHZlZCAodGhlIHJlc3VsdCB0cmVlLCBhbmQgdGhlIHJlc3VsdCB0cmVlcworb2YgdGhlIHBhcmVudHMpLCBhbmQgZGVzY3JpYmluZyB0aGF0IG1ha2VzIG5vIHNlbnNlIGluIHRoaXMgaWRpb3RpYworZmlsZSBtYW5hZ2VyLgorCitBIGNvbW1pdCBpcyBjcmVhdGVkIHdpdGggZ2l0bGluazpnaXQtY29tbWl0LXRyZWVbMV0gYW5kCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0uCisKK1RydXN0Cit+fn5+fgorQW4gYXNpZGUgb24gdGhlIG5vdGlvbiBvZiAidHJ1c3QiLiBUcnVzdCBpcyByZWFsbHkgb3V0c2lkZSB0aGUgc2NvcGUKK29mICJnaXQiLCBidXQgaXQncyB3b3J0aCBub3RpbmcgYSBmZXcgdGhpbmdzLiAgRmlyc3Qgb2ZmLCBzaW5jZQorZXZlcnl0aGluZyBpcyBoYXNoZWQgd2l0aCBTSEExLCB5b3UgJ2NhbicgdHJ1c3QgdGhhdCBhbiBvYmplY3QgaXMKK2ludGFjdCBhbmQgaGFzIG5vdCBiZWVuIG1lc3NlZCB3aXRoIGJ5IGV4dGVybmFsIHNvdXJjZXMuICBTbyB0aGUgbmFtZQorb2YgYW4gb2JqZWN0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBrbm93biBzdGF0ZSAtIGp1c3Qgbm90IGEgc3RhdGUgdGhhdAoreW91IG1heSB3YW50IHRvIHRydXN0LgorCitGdXJ0aGVybW9yZSwgc2luY2UgdGhlIFNIQTEgc2lnbmF0dXJlIG9mIGEgY29tbWl0IHJlZmVycyB0byB0aGUKK1NIQTEgc2lnbmF0dXJlcyBvZiB0aGUgdHJlZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGggYW5kIHRoZSBzaWduYXR1cmVzCitvZiB0aGUgcGFyZW50LCBhIHNpbmdsZSBuYW1lZCBjb21taXQgc3BlY2lmaWVzIHVuaXF1ZWx5IGEgd2hvbGUgc2V0CitvZiBoaXN0b3J5LCB3aXRoIGZ1bGwgY29udGVudHMuICBZb3UgY2FuJ3QgbGF0ZXIgZmFrZSBhbnkgc3RlcCBvZiB0aGUKK3dheSBvbmNlIHlvdSBoYXZlIHRoZSBuYW1lIG9mIGEgY29tbWl0LgorCitTbyB0byBpbnRyb2R1Y2Ugc29tZSByZWFsIHRydXN0IGluIHRoZSBzeXN0ZW0sIHRoZSBvbmx5IHRoaW5nIHlvdSBuZWVkCit0byBkbyBpcyB0byBkaWdpdGFsbHkgc2lnbiBqdXN0ICdvbmUnIHNwZWNpYWwgbm90ZSwgd2hpY2ggaW5jbHVkZXMgdGhlCituYW1lIG9mIGEgdG9wLWxldmVsIGNvbW1pdC4gIFlvdXIgZGlnaXRhbCBzaWduYXR1cmUgc2hvd3Mgb3RoZXJzCit0aGF0IHlvdSB0cnVzdCB0aGF0IGNvbW1pdCwgYW5kIHRoZSBpbW11dGFiaWxpdHkgb2YgdGhlIGhpc3Rvcnkgb2YKK2NvbW1pdHMgdGVsbHMgb3RoZXJzIHRoYXQgdGhleSBjYW4gdHJ1c3QgdGhlIHdob2xlIGhpc3RvcnkuCisKK0luIG90aGVyIHdvcmRzLCB5b3UgY2FuIGVhc2lseSB2YWxpZGF0ZSBhIHdob2xlIGFyY2hpdmUgYnkganVzdAorc2VuZGluZyBvdXQgYSBzaW5nbGUgZW1haWwgdGhhdCB0ZWxscyB0aGUgcGVvcGxlIHRoZSBuYW1lIChTSEExIGhhc2gpCitvZiB0aGUgdG9wIGNvbW1pdCwgYW5kIGRpZ2l0YWxseSBzaWduIHRoYXQgZW1haWwgdXNpbmcgc29tZXRoaW5nCitsaWtlIEdQRy9QR1AuCisKK1RvIGFzc2lzdCBpbiB0aGlzLCBnaXQgYWxzbyBwcm92aWRlcyB0aGUgdGFnIG9iamVjdC4uLgorCitUYWcgT2JqZWN0Cit+fn5+fn5+fn5+CitHaXQgcHJvdmlkZXMgdGhlICJ0YWciIG9iamVjdCB0byBzaW1wbGlmeSBjcmVhdGluZywgbWFuYWdpbmcgYW5kCitleGNoYW5naW5nIHN5bWJvbGljIGFuZCBzaWduZWQgdG9rZW5zLiAgVGhlICJ0YWciIG9iamVjdCBhdCBpdHMKK3NpbXBsZXN0IHNpbXBseSBzeW1ib2xpY2FsbHkgaWRlbnRpZmllcyBhbm90aGVyIG9iamVjdCBieSBjb250YWluaW5nCit0aGUgc2hhMSwgdHlwZSBhbmQgc3ltYm9saWMgbmFtZS4KKworSG93ZXZlciBpdCBjYW4gb3B0aW9uYWxseSBjb250YWluIGFkZGl0aW9uYWwgc2lnbmF0dXJlIGluZm9ybWF0aW9uCisod2hpY2ggZ2l0IGRvZXNuJ3QgY2FyZSBhYm91dCBhcyBsb25nIGFzIHRoZXJlJ3MgbGVzcyB0aGFuIDhrIG9mCitpdCkuIFRoaXMgY2FuIHRoZW4gYmUgdmVyaWZpZWQgZXh0ZXJuYWxseSB0byBnaXQuCisKK05vdGUgdGhhdCBkZXNwaXRlIHRoZSB0YWcgZmVhdHVyZXMsICJnaXQiIGl0c2VsZiBvbmx5IGhhbmRsZXMgY29udGVudAoraW50ZWdyaXR5OyB0aGUgdHJ1c3QgZnJhbWV3b3JrIChhbmQgc2lnbmF0dXJlIHByb3Zpc2lvbiBhbmQKK3ZlcmlmaWNhdGlvbikgaGFzIHRvIGNvbWUgZnJvbSBvdXRzaWRlLgorCitBIHRhZyBpcyBjcmVhdGVkIHdpdGggZ2l0bGluazpnaXQtbWt0YWdbMV0sCitpdHMgZGF0YSBjYW4gYmUgYWNjZXNzZWQgYnkgZ2l0bGluazpnaXQtY2F0LWZpbGVbMV0sCithbmQgdGhlIHNpZ25hdHVyZSBjYW4gYmUgdmVyaWZpZWQgYnkKK2dpdGxpbms6Z2l0LXZlcmlmeS10YWdbMV0uCisKKworVGhlICJpbmRleCIgYWthICJDdXJyZW50IERpcmVjdG9yeSBDYWNoZSIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgaW5kZXggaXMgYSBzaW1wbGUgYmluYXJ5IGZpbGUsIHdoaWNoIGNvbnRhaW5zIGFuIGVmZmljaWVudAorcmVwcmVzZW50YXRpb24gb2YgYSB2aXJ0dWFsIGRpcmVjdG9yeSBjb250ZW50IGF0IHNvbWUgcmFuZG9tIHRpbWUuICBJdAorZG9lcyBzbyBieSBhIHNpbXBsZSBhcnJheSB0aGF0IGFzc29jaWF0ZXMgYSBzZXQgb2YgbmFtZXMsIGRhdGVzLAorcGVybWlzc2lvbnMgYW5kIGNvbnRlbnQgKGFrYSAiYmxvYiIpIG9iamVjdHMgdG9nZXRoZXIuICBUaGUgY2FjaGUgaXMKK2Fsd2F5cyBrZXB0IG9yZGVyZWQgYnkgbmFtZSwgYW5kIG5hbWVzIGFyZSB1bmlxdWUgKHdpdGggYSBmZXcgdmVyeQorc3BlY2lmaWMgcnVsZXMpIGF0IGFueSBwb2ludCBpbiB0aW1lLCBidXQgdGhlIGNhY2hlIGhhcyBubyBsb25nLXRlcm0KK21lYW5pbmcsIGFuZCBjYW4gYmUgcGFydGlhbGx5IHVwZGF0ZWQgYXQgYW55IHRpbWUuCisKK0luIHBhcnRpY3VsYXIsIHRoZSBpbmRleCBjZXJ0YWlubHkgZG9lcyBub3QgbmVlZCB0byBiZSBjb25zaXN0ZW50IHdpdGgKK3RoZSBjdXJyZW50IGRpcmVjdG9yeSBjb250ZW50cyAoaW4gZmFjdCwgbW9zdCBvcGVyYXRpb25zIHdpbGwgZGVwZW5kIG9uCitkaWZmZXJlbnQgd2F5cyB0byBtYWtlIHRoZSBpbmRleCAnbm90JyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIGRpcmVjdG9yeQoraGllcmFyY2h5KSwgYnV0IGl0IGhhcyB0aHJlZSB2ZXJ5IGltcG9ydGFudCBhdHRyaWJ1dGVzOgorCisnKGEpIGl0IGNhbiByZS1nZW5lcmF0ZSB0aGUgZnVsbCBzdGF0ZSBpdCBjYWNoZXMgKG5vdCBqdXN0IHRoZQorZGlyZWN0b3J5IHN0cnVjdHVyZTogaXQgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlICJibG9iIiBvYmplY3RzIHNvCit0aGF0IGl0IGNhbiByZWdlbmVyYXRlIHRoZSBkYXRhIHRvbyknCisKK0FzIGEgc3BlY2lhbCBjYXNlLCB0aGVyZSBpcyBhIGNsZWFyIGFuZCB1bmFtYmlndW91cyBvbmUtd2F5IG1hcHBpbmcKK2Zyb20gYSBjdXJyZW50IGRpcmVjdG9yeSBjYWNoZSB0byBhICJ0cmVlIG9iamVjdCIsIHdoaWNoIGNhbiBiZQorZWZmaWNpZW50bHkgY3JlYXRlZCBmcm9tIGp1c3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNhY2hlIHdpdGhvdXQKK2FjdHVhbGx5IGxvb2tpbmcgYXQgYW55IG90aGVyIGRhdGEuICBTbyBhIGRpcmVjdG9yeSBjYWNoZSBhdCBhbnkgb25lCit0aW1lIHVuaXF1ZWx5IHNwZWNpZmllcyBvbmUgYW5kIG9ubHkgb25lICJ0cmVlIiBvYmplY3QgKGJ1dCBoYXMKK2FkZGl0aW9uYWwgZGF0YSB0byBtYWtlIGl0IGVhc3kgdG8gbWF0Y2ggdXAgdGhhdCB0cmVlIG9iamVjdCB3aXRoIHdoYXQKK2hhcyBoYXBwZW5lZCBpbiB0aGUgZGlyZWN0b3J5KQorCisnKGIpIGl0IGhhcyBlZmZpY2llbnQgbWV0aG9kcyBmb3IgZmluZGluZyBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGF0CitjYWNoZWQgc3RhdGUgKCJ0cmVlIG9iamVjdCB3YWl0aW5nIHRvIGJlIGluc3RhbnRpYXRlZCIpIGFuZCB0aGUKK2N1cnJlbnQgc3RhdGUuJworCisnKGMpIGl0IGNhbiBhZGRpdGlvbmFsbHkgZWZmaWNpZW50bHkgcmVwcmVzZW50IGluZm9ybWF0aW9uIGFib3V0IG1lcmdlCitjb25mbGljdHMgYmV0d2VlbiBkaWZmZXJlbnQgdHJlZSBvYmplY3RzLCBhbGxvd2luZyBlYWNoIHBhdGhuYW1lIHRvIGJlCithc3NvY2lhdGVkIHdpdGggc3VmZmljaWVudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJlZXMgaW52b2x2ZWQgdGhhdAoreW91IGNhbiBjcmVhdGUgYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiB0aGVtLicKKworVGhvc2UgYXJlIHRoZSB0aHJlZSBPTkxZIHRoaW5ncyB0aGF0IHRoZSBkaXJlY3RvcnkgY2FjaGUgZG9lcy4gIEl0J3MgYQorY2FjaGUsIGFuZCB0aGUgbm9ybWFsIG9wZXJhdGlvbiBpcyB0byByZS1nZW5lcmF0ZSBpdCBjb21wbGV0ZWx5IGZyb20gYQora25vd24gdHJlZSBvYmplY3QsIG9yIHVwZGF0ZS9jb21wYXJlIGl0IHdpdGggYSBsaXZlIHRyZWUgdGhhdCBpcyBiZWluZworZGV2ZWxvcGVkLiAgSWYgeW91IGJsb3cgdGhlIGRpcmVjdG9yeSBjYWNoZSBhd2F5IGVudGlyZWx5LCB5b3UgZ2VuZXJhbGx5CitoYXZlbid0IGxvc3QgYW55IGluZm9ybWF0aW9uIGFzIGxvbmcgYXMgeW91IGhhdmUgdGhlIG5hbWUgb2YgdGhlIHRyZWUKK3RoYXQgaXQgZGVzY3JpYmVkLiAKKworQXQgdGhlIHNhbWUgdGltZSwgdGhlIGluZGV4IGlzIGF0IHRoZSBzYW1lIHRpbWUgYWxzbyB0aGUKK3N0YWdpbmcgYXJlYSBmb3IgY3JlYXRpbmcgbmV3IHRyZWVzLCBhbmQgY3JlYXRpbmcgYSBuZXcgdHJlZSBhbHdheXMKK2ludm9sdmVzIGEgY29udHJvbGxlZCBtb2RpZmljYXRpb24gb2YgdGhlIGluZGV4IGZpbGUuICBJbiBwYXJ0aWN1bGFyLAordGhlIGluZGV4IGZpbGUgY2FuIGhhdmUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVybWVkaWF0ZSB0cmVlIHRoYXQKK2hhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkLiAgU28gdGhlIGluZGV4IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEKK3dyaXRlLWJhY2sgY2FjaGUsIHdoaWNoIGNhbiBjb250YWluIGRpcnR5IGluZm9ybWF0aW9uIHRoYXQgaGFzIG5vdCB5ZXQKK2JlZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSBiYWNraW5nIHN0b3JlLgorCisKKworVGhlIFdvcmtmbG93CistLS0tLS0tLS0tLS0KK0dlbmVyYWxseSwgYWxsICJnaXQiIG9wZXJhdGlvbnMgd29yayBvbiB0aGUgaW5kZXggZmlsZS4gU29tZSBvcGVyYXRpb25zCit3b3JrICpwdXJlbHkqIG9uIHRoZSBpbmRleCBmaWxlIChzaG93aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQoraW5kZXgpLCBidXQgbW9zdCBvcGVyYXRpb25zIG1vdmUgZGF0YSB0byBhbmQgZnJvbSB0aGUgaW5kZXggZmlsZS4gRWl0aGVyCitmcm9tIHRoZSBkYXRhYmFzZSBvciBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gVGh1cyB0aGVyZSBhcmUgZm91cgorbWFpbiBjb21iaW5hdGlvbnM6IAorCisxKSB3b3JraW5nIGRpcmVjdG9yeSAtPiBpbmRleAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aXRoCit0aGUgZ2l0bGluazpnaXQtdXBkYXRlLWluZGV4WzFdIGNvbW1hbmQuICBZb3UKK2dlbmVyYWxseSB1cGRhdGUgdGhlIGluZGV4IGluZm9ybWF0aW9uIGJ5IGp1c3Qgc3BlY2lmeWluZyB0aGUgZmlsZW5hbWUKK3lvdSB3YW50IHRvIHVwZGF0ZSwgbGlrZSBzbzoKKworCWdpdC11cGRhdGUtaW5kZXggZmlsZW5hbWUKKworYnV0IHRvIGF2b2lkIGNvbW1vbiBtaXN0YWtlcyB3aXRoIGZpbGVuYW1lIGdsb2JiaW5nIGV0YywgdGhlIGNvbW1hbmQKK3dpbGwgbm90IG5vcm1hbGx5IGFkZCB0b3RhbGx5IG5ldyBlbnRyaWVzIG9yIHJlbW92ZSBvbGQgZW50cmllcywKK2kuZS4gaXQgd2lsbCBub3JtYWxseSBqdXN0IHVwZGF0ZSBleGlzdGluZyBjYWNoZSBlbnRyaWVzLgorCitUbyB0ZWxsIGdpdCB0aGF0IHllcywgeW91IHJlYWxseSBkbyByZWFsaXplIHRoYXQgY2VydGFpbiBmaWxlcyBubworbG9uZ2VyIGV4aXN0LCBvciB0aGF0IG5ldyBmaWxlcyBzaG91bGQgYmUgYWRkZWQsIHlvdQorc2hvdWxkIHVzZSB0aGUgYC0tcmVtb3ZlYCBhbmQgYC0tYWRkYCBmbGFncyByZXNwZWN0aXZlbHkuCisKK05PVEUhIEEgYC0tcmVtb3ZlYCBmbGFnIGRvZXMgJ25vdCcgbWVhbiB0aGF0IHN1YnNlcXVlbnQgZmlsZW5hbWVzIHdpbGwKK25lY2Vzc2FyaWx5IGJlIHJlbW92ZWQ6IGlmIHRoZSBmaWxlcyBzdGlsbCBleGlzdCBpbiB5b3VyIGRpcmVjdG9yeQorc3RydWN0dXJlLCB0aGUgaW5kZXggd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlaXIgbmV3IHN0YXR1cywgbm90CityZW1vdmVkLiBUaGUgb25seSB0aGluZyBgLS1yZW1vdmVgIG1lYW5zIGlzIHRoYXQgdXBkYXRlLWNhY2hlIHdpbGwgYmUKK2NvbnNpZGVyaW5nIGEgcmVtb3ZlZCBmaWxlIHRvIGJlIGEgdmFsaWQgdGhpbmcsIGFuZCBpZiB0aGUgZmlsZSByZWFsbHkKK2RvZXMgbm90IGV4aXN0IGFueSBtb3JlLCBpdCB3aWxsIHVwZGF0ZSB0aGUgaW5kZXggYWNjb3JkaW5nbHkuCisKK0FzIGEgc3BlY2lhbCBjYXNlLCB5b3UgY2FuIGFsc28gZG8gYGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoYCwgd2hpY2gKK3dpbGwgcmVmcmVzaCB0aGUgInN0YXQiIGluZm9ybWF0aW9uIG9mIGVhY2ggaW5kZXggdG8gbWF0Y2ggdGhlIGN1cnJlbnQKK3N0YXQgaW5mb3JtYXRpb24uIEl0IHdpbGwgJ25vdCcgdXBkYXRlIHRoZSBvYmplY3Qgc3RhdHVzIGl0c2VsZiwgYW5kCitpdCB3aWxsIG9ubHkgdXBkYXRlIHRoZSBmaWVsZHMgdGhhdCBhcmUgdXNlZCB0byBxdWlja2x5IHRlc3Qgd2hldGhlcgorYW4gb2JqZWN0IHN0aWxsIG1hdGNoZXMgaXRzIG9sZCBiYWNraW5nIHN0b3JlIG9iamVjdC4KKworMikgaW5kZXggLT4gb2JqZWN0IGRhdGFiYXNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworWW91IHdyaXRlIHlvdXIgY3VycmVudCBpbmRleCBmaWxlIHRvIGEgInRyZWUiIG9iamVjdCB3aXRoIHRoZSBwcm9ncmFtCisKKwlnaXQtd3JpdGUtdHJlZQorCit0aGF0IGRvZXNuJ3QgY29tZSB3aXRoIGFueSBvcHRpb25zIC0gaXQgd2lsbCBqdXN0IHdyaXRlIG91dCB0aGUKK2N1cnJlbnQgaW5kZXggaW50byB0aGUgc2V0IG9mIHRyZWUgb2JqZWN0cyB0aGF0IGRlc2NyaWJlIHRoYXQgc3RhdGUsCithbmQgaXQgd2lsbCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyB0b3AtbGV2ZWwgdHJlZS4gWW91IGNhbgordXNlIHRoYXQgdHJlZSB0byByZS1nZW5lcmF0ZSB0aGUgaW5kZXggYXQgYW55IHRpbWUgYnkgZ29pbmcgaW4gdGhlCitvdGhlciBkaXJlY3Rpb246CisKKzMpIG9iamVjdCBkYXRhYmFzZSAtPiBpbmRleAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSByZWFkIGEgInRyZWUiIGZpbGUgZnJvbSB0aGUgb2JqZWN0IGRhdGFiYXNlLCBhbmQgdXNlIHRoYXQgdG8KK3BvcHVsYXRlIChhbmQgb3ZlcndyaXRlIC0gZG9uJ3QgZG8gdGhpcyBpZiB5b3VyIGluZGV4IGNvbnRhaW5zIGFueQordW5zYXZlZCBzdGF0ZSB0aGF0IHlvdSBtaWdodCB3YW50IHRvIHJlc3RvcmUgbGF0ZXIhKSB5b3VyIGN1cnJlbnQKK2luZGV4LiAgTm9ybWFsIG9wZXJhdGlvbiBpcyBqdXN0CisKKwkJZ2l0LXJlYWQtdHJlZSA8c2hhMSBvZiB0cmVlPgorCithbmQgeW91ciBpbmRleCBmaWxlIHdpbGwgbm93IGJlIGVxdWl2YWxlbnQgdG8gdGhlIHRyZWUgdGhhdCB5b3Ugc2F2ZWQKK2VhcmxpZXIuIEhvd2V2ZXIsIHRoYXQgaXMgb25seSB5b3VyICdpbmRleCcgZmlsZTogeW91ciB3b3JraW5nCitkaXJlY3RvcnkgY29udGVudHMgaGF2ZSBub3QgYmVlbiBtb2RpZmllZC4KKworNCkgaW5kZXggLT4gd29ya2luZyBkaXJlY3RvcnkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSB1cGRhdGUgeW91ciB3b3JraW5nIGRpcmVjdG9yeSBmcm9tIHRoZSBpbmRleCBieSAiY2hlY2tpbmcgb3V0IgorZmlsZXMuIFRoaXMgaXMgbm90IGEgdmVyeSBjb21tb24gb3BlcmF0aW9uLCBzaW5jZSBub3JtYWxseSB5b3UnZCBqdXN0CitrZWVwIHlvdXIgZmlsZXMgdXBkYXRlZCwgYW5kIHJhdGhlciB0aGFuIHdyaXRlIHRvIHlvdXIgd29ya2luZworZGlyZWN0b3J5LCB5b3UnZCB0ZWxsIHRoZSBpbmRleCBmaWxlcyBhYm91dCB0aGUgY2hhbmdlcyBpbiB5b3VyCit3b3JraW5nIGRpcmVjdG9yeSAoaS5lLiBgZ2l0LXVwZGF0ZS1pbmRleGApLgorCitIb3dldmVyLCBpZiB5b3UgZGVjaWRlIHRvIGp1bXAgdG8gYSBuZXcgdmVyc2lvbiwgb3IgY2hlY2sgb3V0IHNvbWVib2R5CitlbHNlJ3MgdmVyc2lvbiwgb3IganVzdCByZXN0b3JlIGEgcHJldmlvdXMgdHJlZSwgeW91J2QgcG9wdWxhdGUgeW91cgoraW5kZXggZmlsZSB3aXRoIHJlYWQtdHJlZSwgYW5kIHRoZW4geW91IG5lZWQgdG8gY2hlY2sgb3V0IHRoZSByZXN1bHQKK3dpdGgKKworCQlnaXQtY2hlY2tvdXQtaW5kZXggZmlsZW5hbWUKKworb3IsIGlmIHlvdSB3YW50IHRvIGNoZWNrIG91dCBhbGwgb2YgdGhlIGluZGV4LCB1c2UgYC1hYC4KKworTk9URSEgZ2l0LWNoZWNrb3V0LWluZGV4IG5vcm1hbGx5IHJlZnVzZXMgdG8gb3ZlcndyaXRlIG9sZCBmaWxlcywgc28KK2lmIHlvdSBoYXZlIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIGFscmVhZHkgY2hlY2tlZCBvdXQsIHlvdSB3aWxsCituZWVkIHRvIHVzZSB0aGUgIi1mIiBmbGFnICgnYmVmb3JlJyB0aGUgIi1hIiBmbGFnIG9yIHRoZSBmaWxlbmFtZSkgdG8KKydmb3JjZScgdGhlIGNoZWNrb3V0LgorCisKK0ZpbmFsbHksIHRoZXJlIGFyZSBhIGZldyBvZGRzIGFuZCBlbmRzIHdoaWNoIGFyZSBub3QgcHVyZWx5IG1vdmluZworZnJvbSBvbmUgcmVwcmVzZW50YXRpb24gdG8gdGhlIG90aGVyOgorCis1KSBUeWluZyBpdCBhbGwgdG9nZXRoZXIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorVG8gY29tbWl0IGEgdHJlZSB5b3UgaGF2ZSBpbnN0YW50aWF0ZWQgd2l0aCAiZ2l0LXdyaXRlLXRyZWUiLCB5b3UnZAorY3JlYXRlIGEgImNvbW1pdCIgb2JqZWN0IHRoYXQgcmVmZXJzIHRvIHRoYXQgdHJlZSBhbmQgdGhlIGhpc3RvcnkKK2JlaGluZCBpdCAtIG1vc3Qgbm90YWJseSB0aGUgInBhcmVudCIgY29tbWl0cyB0aGF0IHByZWNlZGVkIGl0IGluCitoaXN0b3J5LgorCitOb3JtYWxseSBhICJjb21taXQiIGhhcyBvbmUgcGFyZW50OiB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIHRyZWUKK2JlZm9yZSBhIGNlcnRhaW4gY2hhbmdlIHdhcyBtYWRlLiBIb3dldmVyLCBzb21ldGltZXMgaXQgY2FuIGhhdmUgdHdvCitvciBtb3JlIHBhcmVudCBjb21taXRzLCBpbiB3aGljaCBjYXNlIHdlIGNhbGwgaXQgYSAibWVyZ2UiLCBkdWUgdG8gdGhlCitmYWN0IHRoYXQgc3VjaCBhIGNvbW1pdCBicmluZ3MgdG9nZXRoZXIgKCJtZXJnZXMiKSB0d28gb3IgbW9yZQorcHJldmlvdXMgc3RhdGVzIHJlcHJlc2VudGVkIGJ5IG90aGVyIGNvbW1pdHMuCisKK0luIG90aGVyIHdvcmRzLCB3aGlsZSBhICJ0cmVlIiByZXByZXNlbnRzIGEgcGFydGljdWxhciBkaXJlY3Rvcnkgc3RhdGUKK29mIGEgd29ya2luZyBkaXJlY3RvcnksIGEgImNvbW1pdCIgcmVwcmVzZW50cyB0aGF0IHN0YXRlIGluICJ0aW1lIiwKK2FuZCBleHBsYWlucyBob3cgd2UgZ290IHRoZXJlLgorCitZb3UgY3JlYXRlIGEgY29tbWl0IG9iamVjdCBieSBnaXZpbmcgaXQgdGhlIHRyZWUgdGhhdCBkZXNjcmliZXMgdGhlCitzdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgY29tbWl0LCBhbmQgYSBsaXN0IG9mIHBhcmVudHM6CisKKwlnaXQtY29tbWl0LXRyZWUgPHRyZWU+IC1wIDxwYXJlbnQ+IFstcCA8cGFyZW50Mj4gLi5dCisKK2FuZCB0aGVuIGdpdmluZyB0aGUgcmVhc29uIGZvciB0aGUgY29tbWl0IG9uIHN0ZGluIChlaXRoZXIgdGhyb3VnaAorcmVkaXJlY3Rpb24gZnJvbSBhIHBpcGUgb3IgZmlsZSwgb3IgYnkganVzdCB0eXBpbmcgaXQgYXQgdGhlIHR0eSkuCisKK2dpdC1jb21taXQtdHJlZSB3aWxsIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cwordGhhdCBjb21taXQsIGFuZCB5b3Ugc2hvdWxkIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlLiBOb3JtYWxseSwKK3lvdSdkIGNvbW1pdCBhIG5ldyBgSEVBRGAgc3RhdGUsIGFuZCB3aGlsZSBnaXQgZG9lc24ndCBjYXJlIHdoZXJlIHlvdQorc2F2ZSB0aGUgbm90ZSBhYm91dCB0aGF0IHN0YXRlLCBpbiBwcmFjdGljZSB3ZSB0ZW5kIHRvIGp1c3Qgd3JpdGUgdGhlCityZXN1bHQgdG8gdGhlIGZpbGUgcG9pbnRlZCBhdCBieSBgLmdpdC9IRUFEYCwgc28gdGhhdCB3ZSBjYW4gYWx3YXlzIHNlZQord2hhdCB0aGUgbGFzdCBjb21taXR0ZWQgc3RhdGUgd2FzLgorCitIZXJlIGlzIGFuIEFTQ0lJIGFydCBieSBKb24gTG9lbGlnZXIgdGhhdCBpbGx1c3RyYXRlcyBob3cKK3ZhcmlvdXMgcGllY2VzIGZpdCB0b2dldGhlci4KKworLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1pdC10cmVlCisgICAgICAgICAgICAgICAgICAgICAgY29tbWl0IG9iagorICAgICAgICAgICAgICAgICAgICAgICArLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfAorICAgICAgICAgICAgICAgICAgICAgICBWICAgIFYKKyAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICB8IE9iamVjdCBEQiB8CisgICAgICAgICAgICAgICAgICAgIHwgIEJhY2tpbmcgIHwKKyAgICAgICAgICAgICAgICAgICAgfCAgIFN0b3JlICAgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgd3JpdGUtdHJlZSAgfCAgICAgfAorICAgICAgICAgICAgIHRyZWUgb2JqICB8ICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgIHJlYWQtdHJlZQorICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8ICB0cmVlIG9iagorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWCisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICAgfCAgIEluZGV4ICAgfAorICAgICAgICAgICAgICAgICAgICB8ICAiY2FjaGUiICB8CisgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLSsKKyAgICAgICAgIHVwZGF0ZS1pbmRleCAgXgorICAgICAgICAgICAgIGJsb2Igb2JqICB8ICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwKKyAgICBjaGVja291dC1pbmRleCAtdSAgfCAgICAgfCAgY2hlY2tvdXQtaW5kZXgKKyAgICAgICAgICAgICBzdGF0ICAgICAgfCAgICAgfCAgYmxvYiBvYmoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVgorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgICAgIHwgIFdvcmtpbmcgIHwKKyAgICAgICAgICAgICAgICAgICAgfCBEaXJlY3RvcnkgfAorICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCisKKy0tLS0tLS0tLS0tLQorCisKKzYpIEV4YW1pbmluZyB0aGUgZGF0YQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1lvdSBjYW4gZXhhbWluZSB0aGUgZGF0YSByZXByZXNlbnRlZCBpbiB0aGUgb2JqZWN0IGRhdGFiYXNlIGFuZCB0aGUKK2luZGV4IHdpdGggdmFyaW91cyBoZWxwZXIgdG9vbHMuIEZvciBldmVyeSBvYmplY3QsIHlvdSBjYW4gdXNlCitnaXRsaW5rOmdpdC1jYXQtZmlsZVsxXSB0byBleGFtaW5lIGRldGFpbHMgYWJvdXQgdGhlCitvYmplY3Q6CisKKwkJZ2l0LWNhdC1maWxlIC10IDxvYmplY3RuYW1lPgorCitzaG93cyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LCBhbmQgb25jZSB5b3UgaGF2ZSB0aGUgdHlwZSAod2hpY2ggaXMKK3VzdWFsbHkgaW1wbGljaXQgaW4gd2hlcmUgeW91IGZpbmQgdGhlIG9iamVjdCksIHlvdSBjYW4gdXNlCisKKwkJZ2l0LWNhdC1maWxlIGJsb2J8dHJlZXxjb21taXR8dGFnIDxvYmplY3RuYW1lPgorCit0byBzaG93IGl0cyBjb250ZW50cy4gTk9URSEgVHJlZXMgaGF2ZSBiaW5hcnkgY29udGVudCwgYW5kIGFzIGEgcmVzdWx0Cit0aGVyZSBpcyBhIHNwZWNpYWwgaGVscGVyIGZvciBzaG93aW5nIHRoYXQgY29udGVudCwgY2FsbGVkCitgZ2l0LWxzLXRyZWVgLCB3aGljaCB0dXJucyB0aGUgYmluYXJ5IGNvbnRlbnQgaW50byBhIG1vcmUgZWFzaWx5CityZWFkYWJsZSBmb3JtLgorCitJdCdzIGVzcGVjaWFsbHkgaW5zdHJ1Y3RpdmUgdG8gbG9vayBhdCAiY29tbWl0IiBvYmplY3RzLCBzaW5jZSB0aG9zZQordGVuZCB0byBiZSBzbWFsbCBhbmQgZmFpcmx5IHNlbGYtZXhwbGFuYXRvcnkuIEluIHBhcnRpY3VsYXIsIGlmIHlvdQorZm9sbG93IHRoZSBjb252ZW50aW9uIG9mIGhhdmluZyB0aGUgdG9wIGNvbW1pdCBuYW1lIGluIGAuZ2l0L0hFQURgLAoreW91IGNhbiBkbworCisJCWdpdC1jYXQtZmlsZSBjb21taXQgSEVBRAorCit0byBzZWUgd2hhdCB0aGUgdG9wIGNvbW1pdCB3YXMuCisKKzcpIE1lcmdpbmcgbXVsdGlwbGUgdHJlZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworR2l0IGhlbHBzIHlvdSBkbyBhIHRocmVlLXdheSBtZXJnZSwgd2hpY2ggeW91IGNhbiBleHBhbmQgdG8gbi13YXkgYnkKK3JlcGVhdGluZyB0aGUgbWVyZ2UgcHJvY2VkdXJlIGFyYml0cmFyeSB0aW1lcyB1bnRpbCB5b3UgZmluYWxseQorImNvbW1pdCIgdGhlIHN0YXRlLiAgVGhlIG5vcm1hbCBzaXR1YXRpb24gaXMgdGhhdCB5b3UnZCBvbmx5IGRvIG9uZQordGhyZWUtd2F5IG1lcmdlICh0d28gcGFyZW50cyksIGFuZCBjb21taXQgaXQsIGJ1dCBpZiB5b3UgbGlrZSB0bywgeW91CitjYW4gZG8gbXVsdGlwbGUgcGFyZW50cyBpbiBvbmUgZ28uCisKK1RvIGRvIGEgdGhyZWUtd2F5IG1lcmdlLCB5b3UgbmVlZCB0aGUgdHdvIHNldHMgb2YgImNvbW1pdCIgb2JqZWN0cwordGhhdCB5b3Ugd2FudCB0byBtZXJnZSwgdXNlIHRob3NlIHRvIGZpbmQgdGhlIGNsb3Nlc3QgY29tbW9uIHBhcmVudCAoYQordGhpcmQgImNvbW1pdCIgb2JqZWN0KSwgYW5kIHRoZW4gdXNlIHRob3NlIGNvbW1pdCBvYmplY3RzIHRvIGZpbmQgdGhlCitzdGF0ZSBvZiB0aGUgZGlyZWN0b3J5ICgidHJlZSIgb2JqZWN0KSBhdCB0aGVzZSBwb2ludHMuCisKK1RvIGdldCB0aGUgImJhc2UiIGZvciB0aGUgbWVyZ2UsIHlvdSBmaXJzdCBsb29rIHVwIHRoZSBjb21tb24gcGFyZW50CitvZiB0d28gY29tbWl0cyB3aXRoCisKKwkJZ2l0LW1lcmdlLWJhc2UgPGNvbW1pdDE+IDxjb21taXQyPgorCit3aGljaCB3aWxsIHJldHVybiB5b3UgdGhlIGNvbW1pdCB0aGV5IGFyZSBib3RoIGJhc2VkIG9uLiAgWW91IHNob3VsZAorbm93IGxvb2sgdXAgdGhlICJ0cmVlIiBvYmplY3RzIG9mIHRob3NlIGNvbW1pdHMsIHdoaWNoIHlvdSBjYW4gZWFzaWx5CitkbyB3aXRoIChmb3IgZXhhbXBsZSkKKworCQlnaXQtY2F0LWZpbGUgY29tbWl0IDxjb21taXRuYW1lPiB8IGhlYWQgLTEKKworc2luY2UgdGhlIHRyZWUgb2JqZWN0IGluZm9ybWF0aW9uIGlzIGFsd2F5cyB0aGUgZmlyc3QgbGluZSBpbiBhIGNvbW1pdAorb2JqZWN0LgorCitPbmNlIHlvdSBrbm93IHRoZSB0aHJlZSB0cmVlcyB5b3UgYXJlIGdvaW5nIHRvIG1lcmdlICh0aGUgb25lCisib3JpZ2luYWwiIHRyZWUsIGFrYSB0aGUgY29tbW9uIGNhc2UsIGFuZCB0aGUgdHdvICJyZXN1bHQiIHRyZWVzLCBha2EKK3RoZSBicmFuY2hlcyB5b3Ugd2FudCB0byBtZXJnZSksIHlvdSBkbyBhICJtZXJnZSIgcmVhZCBpbnRvIHRoZQoraW5kZXguIFRoaXMgd2lsbCBjb21wbGFpbiBpZiBpdCBoYXMgdG8gdGhyb3cgYXdheSB5b3VyIG9sZCBpbmRleCBjb250ZW50cywgc28geW91IHNob3VsZAorbWFrZSBzdXJlIHRoYXQgeW91J3ZlIGNvbW1pdHRlZCB0aG9zZSAtIGluIGZhY3QgeW91IHdvdWxkIG5vcm1hbGx5CithbHdheXMgZG8gYSBtZXJnZSBhZ2FpbnN0IHlvdXIgbGFzdCBjb21taXQgKHdoaWNoIHNob3VsZCB0aHVzIG1hdGNoCit3aGF0IHlvdSBoYXZlIGluIHlvdXIgY3VycmVudCBpbmRleCBhbnl3YXkpLgorCitUbyBkbyB0aGUgbWVyZ2UsIGRvCisKKwkJZ2l0LXJlYWQtdHJlZSAtbSAtdSA8b3JpZ3RyZWU+IDx5b3VydHJlZT4gPHRhcmdldHRyZWU+CisKK3doaWNoIHdpbGwgZG8gYWxsIHRyaXZpYWwgbWVyZ2Ugb3BlcmF0aW9ucyBmb3IgeW91IGRpcmVjdGx5IGluIHRoZQoraW5kZXggZmlsZSwgYW5kIHlvdSBjYW4ganVzdCB3cml0ZSB0aGUgcmVzdWx0IG91dCB3aXRoCitgZ2l0LXdyaXRlLXRyZWVgLgorCitIaXN0b3JpY2FsIG5vdGUuICBXZSBkaWQgbm90IGhhdmUgYC11YCBmYWNpbGl0eSB3aGVuIHRoaXMKK3NlY3Rpb24gd2FzIGZpcnN0IHdyaXR0ZW4sIHNvIHdlIHVzZWQgdG8gd2FybiB0aGF0Cit0aGUgbWVyZ2UgaXMgZG9uZSBpbiB0aGUgaW5kZXggZmlsZSwgbm90IGluIHlvdXIKK3dvcmtpbmcgdHJlZSwgYW5kIHlvdXIgd29ya2luZyB0cmVlIHdpbGwgbm90IG1hdGNoIHlvdXIKK2luZGV4IGFmdGVyIHRoaXMgc3RlcC4KK1RoaXMgaXMgbm8gbG9uZ2VyIHRydWUuICBUaGUgYWJvdmUgY29tbWFuZCwgdGhhbmtzIHRvIGAtdWAKK29wdGlvbiwgdXBkYXRlcyB5b3VyIHdvcmtpbmcgdHJlZSB3aXRoIHRoZSBtZXJnZSByZXN1bHRzIGZvcgorcGF0aHMgdGhhdCBoYXZlIGJlZW4gdHJpdmlhbGx5IG1lcmdlZC4KKworCis4KSBNZXJnaW5nIG11bHRpcGxlIHRyZWVzLCBjb250aW51ZWQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitTYWRseSwgbWFueSBtZXJnZXMgYXJlbid0IHRyaXZpYWwuIElmIHRoZXJlIGFyZSBmaWxlcyB0aGF0IGhhdmUKK2JlZW4gYWRkZWQubW92ZWQgb3IgcmVtb3ZlZCwgb3IgaWYgYm90aCBicmFuY2hlcyBoYXZlIG1vZGlmaWVkIHRoZQorc2FtZSBmaWxlLCB5b3Ugd2lsbCBiZSBsZWZ0IHdpdGggYW4gaW5kZXggdHJlZSB0aGF0IGNvbnRhaW5zICJtZXJnZQorZW50cmllcyIgaW4gaXQuIFN1Y2ggYW4gaW5kZXggdHJlZSBjYW4gJ05PVCcgYmUgd3JpdHRlbiBvdXQgdG8gYSB0cmVlCitvYmplY3QsIGFuZCB5b3Ugd2lsbCBoYXZlIHRvIHJlc29sdmUgYW55IHN1Y2ggbWVyZ2UgY2xhc2hlcyB1c2luZworb3RoZXIgdG9vbHMgYmVmb3JlIHlvdSBjYW4gd3JpdGUgb3V0IHRoZSByZXN1bHQuCisKK1lvdSBjYW4gZXhhbWluZSBzdWNoIGluZGV4IHN0YXRlIHdpdGggYGdpdC1scy1maWxlcyAtLXVubWVyZ2VkYAorY29tbWFuZC4gIEFuIGV4YW1wbGU6CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJCBnaXQtcmVhZC10cmVlIC1tICRvcmlnIEhFQUQgJHRhcmdldAorJCBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZAorMTAwNjQ0IDI2MzQxNGY0MjNkMGU0ZDcwZGFlOGZlNTNmYTM0NjE0ZmYzZTI4NjAgMQloZWxsby5jCisxMDA2NDQgMDZmYTZhMjQyNTZkYzdlNTYwZWZhNTY4N2ZhODRiNTFmMDI2M2MzYSAyCWhlbGxvLmMKKzEwMDY0NCBjYzQ0YzczZWI3ODM1NjVkYTU4MzFiNGQ4MjBjOTYyOTU0MDE5YjY5IDMJaGVsbG8uYworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VhY2ggbGluZSBvZiB0aGUgYGdpdC1scy1maWxlcyAtLXVubWVyZ2VkYCBvdXRwdXQgYmVnaW5zIHdpdGgKK3RoZSBibG9iIG1vZGUgYml0cywgYmxvYiBTSEExLCAnc3RhZ2UgbnVtYmVyJywgYW5kIHRoZQorZmlsZW5hbWUuICBUaGUgJ3N0YWdlIG51bWJlcicgaXMgZ2l0J3Mgd2F5IHRvIHNheSB3aGljaCB0cmVlIGl0CitjYW1lIGZyb206IHN0YWdlIDEgY29ycmVzcG9uZHMgdG8gYCRvcmlnYCB0cmVlLCBzdGFnZSAyIGBIRUFEYAordHJlZSwgYW5kIHN0YWdlMyBgJHRhcmdldGAgdHJlZS4KKworRWFybGllciB3ZSBzYWlkIHRoYXQgdHJpdmlhbCBtZXJnZXMgYXJlIGRvbmUgaW5zaWRlCitgZ2l0LXJlYWQtdHJlZSAtbWAuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGUgZGlkIG5vdCBjaGFuZ2UKK2Zyb20gYCRvcmlnYCB0byBgSEVBRGAgbm9yIGAkdGFyZ2V0YCwgb3IgaWYgdGhlIGZpbGUgY2hhbmdlZAorZnJvbSBgJG9yaWdgIHRvIGBIRUFEYCBhbmQgYCRvcmlnYCB0byBgJHRhcmdldGAgdGhlIHNhbWUgd2F5LAorb2J2aW91c2x5IHRoZSBmaW5hbCBvdXRjb21lIGlzIHdoYXQgaXMgaW4gYEhFQURgLiAgV2hhdCB0aGUKK2Fib3ZlIGV4YW1wbGUgc2hvd3MgaXMgdGhhdCBmaWxlIGBoZWxsby5jYCB3YXMgY2hhbmdlZCBmcm9tCitgJG9yaWdgIHRvIGBIRUFEYCBhbmQgYCRvcmlnYCB0byBgJHRhcmdldGAgaW4gYSBkaWZmZXJlbnQgd2F5LgorWW91IGNvdWxkIHJlc29sdmUgdGhpcyBieSBydW5uaW5nIHlvdXIgZmF2b3JpdGUgMy13YXkgbWVyZ2UKK3Byb2dyYW0sIGUuZy4gIGBkaWZmM2Agb3IgYG1lcmdlYCwgb24gdGhlIGJsb2Igb2JqZWN0cyBmcm9tCit0aGVzZSB0aHJlZSBzdGFnZXMgeW91cnNlbGYsIGxpa2UgdGhpczoKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiskIGdpdC1jYXQtZmlsZSBibG9iIDI2MzQxNGYuLi4gPmhlbGxvLmN+MQorJCBnaXQtY2F0LWZpbGUgYmxvYiAwNmZhNmEyLi4uID5oZWxsby5jfjIKKyQgZ2l0LWNhdC1maWxlIGJsb2IgY2M0NGM3My4uLiA+aGVsbG8uY34zCiskIG1lcmdlIGhlbGxvLmN+MiBoZWxsby5jfjEgaGVsbG8uY34zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyB3b3VsZCBsZWF2ZSB0aGUgbWVyZ2UgcmVzdWx0IGluIGBoZWxsby5jfjJgIGZpbGUsIGFsb25nCit3aXRoIGNvbmZsaWN0IG1hcmtlcnMgaWYgdGhlcmUgYXJlIGNvbmZsaWN0cy4gIEFmdGVyIHZlcmlmeWluZwordGhlIG1lcmdlIHJlc3VsdCBtYWtlcyBzZW5zZSwgeW91IGNhbiB0ZWxsIGdpdCB3aGF0IHRoZSBmaW5hbAorbWVyZ2UgcmVzdWx0IGZvciB0aGlzIGZpbGUgaXMgYnk6CisKKwltdiAtZiBoZWxsby5jfjIgaGVsbG8uYworCWdpdC11cGRhdGUtaW5kZXggaGVsbG8uYworCitXaGVuIGEgcGF0aCBpcyBpbiB1bm1lcmdlZCBzdGF0ZSwgcnVubmluZyBgZ2l0LXVwZGF0ZS1pbmRleGAgZm9yCit0aGF0IHBhdGggdGVsbHMgZ2l0IHRvIG1hcmsgdGhlIHBhdGggcmVzb2x2ZWQuCisKK1RoZSBhYm92ZSBpcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBnaXQgbWVyZ2UgYXQgdGhlIGxvd2VzdCBsZXZlbCwKK3RvIGhlbHAgeW91IHVuZGVyc3RhbmQgd2hhdCBjb25jZXB0dWFsbHkgaGFwcGVucyB1bmRlciB0aGUgaG9vZC4KK0luIHByYWN0aWNlLCBub2JvZHksIG5vdCBldmVuIGdpdCBpdHNlbGYsIHVzZXMgdGhyZWUgYGdpdC1jYXQtZmlsZWAKK2ZvciB0aGlzLiAgVGhlcmUgaXMgYGdpdC1tZXJnZS1pbmRleGAgcHJvZ3JhbSB0aGF0IGV4dHJhY3RzIHRoZQorc3RhZ2VzIHRvIHRlbXBvcmFyeSBmaWxlcyBhbmQgY2FsbHMgYSAibWVyZ2UiIHNjcmlwdCBvbiBpdDoKKworCWdpdC1tZXJnZS1pbmRleCBnaXQtbWVyZ2Utb25lLWZpbGUgaGVsbG8uYworCithbmQgdGhhdCBpcyB3aGF0IGhpZ2hlciBsZXZlbCBgZ2l0IHJlc29sdmVgIGlzIGltcGxlbWVudGVkIHdpdGguCmRpZmYgLS1naXQgYS9hbGxvYy5jIGIvYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjBkYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYWxsb2MuYwpAQCAtMCwwICsxLDY0IEBACisvKgorICogYWxsb2MuYyAgLSBzcGVjaWFsaXplZCBhbGxvY2F0b3IgZm9yIGludGVybmFsIG9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGUgc3RhbmRhcmQgbWFsbG9jL2ZyZWUgd2FzdGVzIHRvbyBtdWNoIHNwYWNlIGZvciBvYmplY3RzLCBwYXJ0bHkgYmVjYXVzZQorICogaXQgbWFpbnRhaW5zIGFsbCB0aGUgYWxsb2NhdGlvbiBpbmZyYXN0cnVjdHVyZSAod2hpY2ggaXNuJ3QgbmVlZGVkLCBzaW5jZQorICogd2UgbmV2ZXIgZnJlZSBhbiBvYmplY3QgZGVzY3JpcHRvciBhbnl3YXkpLCBidXQgZXZlbiBtb3JlIGJlY2F1c2UgaXQgZW5kcworICogdXAgd2l0aCBtYXhpbWFsIGFsaWdubWVudCBiZWNhdXNlIGl0IGRvZXNuJ3Qga25vdyB3aGF0IHRoZSBvYmplY3QgYWxpZ25tZW50CisgKiBmb3IgdGhlIG5ldyBhbGxvY2F0aW9uIGlzLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorCisjZGVmaW5lIEJMT0NLSU5HIDEwMjQKKworI2RlZmluZSBERUZJTkVfQUxMT0NBVE9SKG5hbWUpCQkJCQlcCitzdGF0aWMgdW5zaWduZWQgaW50IG5hbWUjI19hbGxvY3M7CQkJCVwKK3N0cnVjdCBuYW1lICphbGxvY18jI25hbWUjI19ub2RlKHZvaWQpCQkJCVwKK3sJCQkJCQkJCVwKKwlzdGF0aWMgaW50IG5yOwkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG5hbWUgKmJsb2NrOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAoIW5yKSB7CQkJCQkJXAorCQluciA9IEJMT0NLSU5HOwkJCQkJXAorCQlibG9jayA9IHhjYWxsb2MoQkxPQ0tJTkcsIHNpemVvZihzdHJ1Y3QgbmFtZSkpOwlcCisJfQkJCQkJCQlcCisJbnItLTsJCQkJCQkJXAorCW5hbWUjI19hbGxvY3MrKzsJCQkJCVwKKwlyZXR1cm4gYmxvY2srKzsJCQkJCQlcCit9CisKK0RFRklORV9BTExPQ0FUT1IoYmxvYikKK0RFRklORV9BTExPQ0FUT1IodHJlZSkKK0RFRklORV9BTExPQ0FUT1IoY29tbWl0KQorREVGSU5FX0FMTE9DQVRPUih0YWcpCisKKyNpZmRlZiBOT19DOTlfRk9STUFUCisjZGVmaW5lIFNaX0ZNVCAiJXUiCisjZWxzZQorI2RlZmluZSBTWl9GTVQgIiV6dSIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZXBvcnQoY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgaW50IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiUxMHM6ICU4dSAoIiBTWl9GTVQgIiBrQilcbiIsIG5hbWUsIGNvdW50LCBzaXplKTsKK30KKworI3VuZGVmIFNaX0ZNVAorCisjZGVmaW5lIFJFUE9SVChuYW1lKQlcCisgICAgcmVwb3J0KCNuYW1lLCBuYW1lIyNfYWxsb2NzLCBuYW1lIyNfYWxsb2NzKnNpemVvZihzdHJ1Y3QgbmFtZSkgPj4gMTApCisKK3ZvaWQgYWxsb2NfcmVwb3J0KHZvaWQpCit7CisJUkVQT1JUKGJsb2IpOworCVJFUE9SVCh0cmVlKTsKKwlSRVBPUlQoY29tbWl0KTsKKwlSRVBPUlQodGFnKTsKK30KZGlmZiAtLWdpdCBhL2FybS9zaGExLmMgYi9hcm0vc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjFhMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcm0vc2hhMS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBTSEEtMSBpbXBsZW1lbnRhdGlvbiBvcHRpbWl6ZWQgZm9yIEFSTQorICoKKyAqIENvcHlyaWdodDogICAoQykgMjAwNSBieSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKiBDcmVhdGVkOiAgICAgU2VwdGVtYmVyIDE3LCAyMDA1CisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNoYTEuaCIKKworZXh0ZXJuIHZvaWQgc2hhX3RyYW5zZm9ybSh1aW50MzJfdCAqaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdWludDMyX3QgKlcpOworCit2b2lkIFNIQTFfSW5pdChTSEFfQ1RYICpjKQoreworCWMtPmxlbiA9IDA7CisJYy0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJYy0+aGFzaFsxXSA9IDB4ZWZjZGFiODk7CisJYy0+aGFzaFsyXSA9IDB4OThiYWRjZmU7CisJYy0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJYy0+aGFzaFs0XSA9IDB4YzNkMmUxZjA7Cit9CisKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcCwgdW5zaWduZWQgbG9uZyBuKQoreworCXVpbnQzMl90IHdvcmtzcGFjZVs4MF07CisJdW5zaWduZWQgaW50IHBhcnRpYWw7CisJdW5zaWduZWQgbG9uZyBkb25lOworCisJcGFydGlhbCA9IGMtPmxlbiAmIDB4M2Y7CisJYy0+bGVuICs9IG47CisJaWYgKChwYXJ0aWFsICsgbikgPj0gNjQpIHsKKwkJaWYgKHBhcnRpYWwpIHsKKwkJCWRvbmUgPSA2NCAtIHBhcnRpYWw7CisJCQltZW1jcHkoYy0+YnVmZmVyICsgcGFydGlhbCwgcCwgZG9uZSk7CisJCQlzaGFfdHJhbnNmb3JtKGMtPmhhc2gsIGMtPmJ1ZmZlciwgd29ya3NwYWNlKTsKKwkJCXBhcnRpYWwgPSAwOworCQl9IGVsc2UKKwkJCWRvbmUgPSAwOworCQl3aGlsZSAobiA+PSBkb25lICsgNjQpIHsKKwkJCXNoYV90cmFuc2Zvcm0oYy0+aGFzaCwgcCArIGRvbmUsIHdvcmtzcGFjZSk7CisJCQlkb25lICs9IDY0OworCQl9CisJfSBlbHNlCisJCWRvbmUgPSAwOworCWlmIChuIC0gZG9uZSkKKwkJbWVtY3B5KGMtPmJ1ZmZlciArIHBhcnRpYWwsIHAgKyBkb25lLCBuIC0gZG9uZSk7Cit9CisKK3ZvaWQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKQoreworCXVpbnQ2NF90IGJpdGxlbjsKKwl1aW50MzJfdCBiaXRsZW5faGksIGJpdGxlbl9sbzsgCisJdW5zaWduZWQgaW50IGksIG9mZnNldCwgcGFkbGVuOworCXVuc2lnbmVkIGNoYXIgYml0c1s4XTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwYWRkaW5nWzY0XSA9IHsgMHg4MCwgfTsKKworCWJpdGxlbiA9IGMtPmxlbiA8PCAzOworCW9mZnNldCA9IGMtPmxlbiAmIDB4M2Y7CisJcGFkbGVuID0gKChvZmZzZXQgPCA1NikgPyA1NiA6ICg2NCArIDU2KSkgLSBvZmZzZXQ7CisJU0hBMV9VcGRhdGUoYywgcGFkZGluZywgcGFkbGVuKTsKKworCWJpdGxlbl9oaSA9IGJpdGxlbiA+PiAzMjsKKwliaXRsZW5fbG8gPSBiaXRsZW4gJiAweGZmZmZmZmZmOworCWJpdHNbMF0gPSBiaXRsZW5faGkgPj4gMjQ7CisJYml0c1sxXSA9IGJpdGxlbl9oaSA+PiAxNjsKKwliaXRzWzJdID0gYml0bGVuX2hpID4+IDg7CisJYml0c1szXSA9IGJpdGxlbl9oaTsKKwliaXRzWzRdID0gYml0bGVuX2xvID4+IDI0OworCWJpdHNbNV0gPSBiaXRsZW5fbG8gPj4gMTY7CisJYml0c1s2XSA9IGJpdGxlbl9sbyA+PiA4OworCWJpdHNbN10gPSBiaXRsZW5fbG87CisJU0hBMV9VcGRhdGUoYywgYml0cywgOCk7IAorCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQl1aW50MzJfdCB2ID0gYy0+aGFzaFtpXTsKKwkJaGFzaFswXSA9IHYgPj4gMjQ7CisJCWhhc2hbMV0gPSB2ID4+IDE2OworCQloYXNoWzJdID0gdiA+PiA4OworCQloYXNoWzNdID0gdjsKKwkJaGFzaCArPSA0OworCX0KK30KZGlmZiAtLWdpdCBhL2FybS9zaGExLmggYi9hcm0vc2hhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTI2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcm0vc2hhMS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiBTSEEtMSBpbXBsZW1lbnRhdGlvbiBvcHRpbWl6ZWQgZm9yIEFSTQorICoKKyAqIENvcHlyaWdodDoJKEMpIDIwMDUgYnkgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICogQ3JlYXRlZDoJU2VwdGVtYmVyIDE3LCAyMDA1CisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBzaGFfY29udGV4dCB7CisJdWludDY0X3QgbGVuOworCXVpbnQzMl90IGhhc2hbNV07CisJdW5zaWduZWQgY2hhciBidWZmZXJbNjRdOworfSBTSEFfQ1RYOworCit2b2lkIFNIQTFfSW5pdChTSEFfQ1RYICpjKTsKK3ZvaWQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcCwgdW5zaWduZWQgbG9uZyBuKTsKK3ZvaWQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKTsKZGlmZiAtLWdpdCBhL2FybS9zaGExX2FybS5TIGIvYXJtL3NoYTFfYXJtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5MmQyMAotLS0gL2Rldi9udWxsCisrKyBiL2FybS9zaGExX2FybS5TCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogIFNIQSB0cmFuc2Zvcm0gb3B0aW1pemVkIGZvciBBUk0KKyAqCisgKiAgQ29weXJpZ2h0OgkoQykgMjAwNSBieSBOaWNvbGFzIFBpdHJlIDxuaWNvQGNhbS5vcmc+CisgKiAgQ3JlYXRlZDoJU2VwdGVtYmVyIDE3LCAyMDA1CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisJLnRleHQKKwkuZ2xvYmwJc2hhX3RyYW5zZm9ybQorCisvKgorICogdm9pZCBzaGFfdHJhbnNmb3JtKHVpbnQzMl90ICpoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1aW50MzJfdCAqVyk7CisgKgorICogbm90ZTogdGhlICJkYXRhIiBwb2ludGVyIG1heSBiZSB1bmFsaWduZWQuCisgKi8KKworc2hhX3RyYW5zZm9ybToKKworCXN0bWZkCXNwISwge3I0IC0gcjgsIGxyfQorCisJQCBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwlAICAgICAgICAgV1tpXSA9IG50b2hsKCgodWludDMyX3QgKilkYXRhKVtpXSk7ICovCisKKyNpZmRlZiBfX0FSTUVCX18KKwltb3YJcjQsIHIwCisJbW92CXIwLCByMgorCW1vdglyMiwgIzY0CisJYmwJbWVtY3B5CisJbW92CXIyLCByMAorCW1vdglyMCwgcjQKKyNlbHNlCisJbW92CXIzLCByMgorCW1vdglsciwgIzE2CisxOglsZHJiCXI0LCBbcjFdLCAjMQorCWxkcmIJcjUsIFtyMV0sICMxCisJbGRyYglyNiwgW3IxXSwgIzEKKwlsZHJiCXI3LCBbcjFdLCAjMQorCXN1YnMJbHIsIGxyLCAjMQorCW9ycglyNSwgcjUsIHI0LCBsc2wgIzgKKwlvcnIJcjYsIHI2LCByNSwgbHNsICM4CisJb3JyCXI3LCByNywgcjYsIGxzbCAjOAorCXN0cglyNywgW3IzXSwgIzQKKwlibmUJMWIKKyNlbmRpZgorCisJQCBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKwlAICAgICAgICAgV1tpKzE2XSA9IHJvcihXW2krMTNdIF4gV1tpKzhdIF4gV1tpKzJdIF4gV1tpXSwgMzEpOworCisJc3ViCXIzLCByMiwgIzQKKwltb3YJbHIsICM2NAorMjoJbGRyCXI0LCBbcjMsICM0XSEKKwlzdWJzCWxyLCBsciwgIzEKKwlsZHIJcjUsIFtyMywgIzhdCisJbGRyCXI2LCBbcjMsICMzMl0KKwlsZHIJcjcsIFtyMywgIzUyXQorCWVvcglyNCwgcjQsIHI1CisJZW9yCXI0LCByNCwgcjYKKwllb3IJcjQsIHI0LCByNworCW1vdglyNCwgcjQsIHJvciAjMzEKKwlzdHIJcjQsIFtyMywgIzY0XQorCWJuZQkyYgorCisJLyoKKwkgKiBUaGUgU0hBIGZ1bmN0aW9ucyBhcmU6CisJICoKKwkgKiBmMShCLEMsRCkgPSAoRCBeIChCICYgKEMgXiBEKSkpCisJICogZjIoQixDLEQpID0gKEIgXiBDIF4gRCkKKwkgKiBmMyhCLEMsRCkgPSAoKEIgJiBDKSB8IChEICYgKEIgfCBDKSkpCisJICoKKwkgKiBUaGVuIHRoZSBzdWItYmxvY2tzIGFyZSBwcm9jZXNzZWQgYXMgZm9sbG93czoKKwkgKgorCSAqIEEnID0gcm9yKEEsIDI3KSArIGYoQixDLEQpICsgRSArIEsgKyAqVysrCisJICogQicgPSBBCisJICogQycgPSByb3IoQiwgMikKKwkgKiBEJyA9IEMKKwkgKiBFJyA9IEQKKwkgKgorCSAqIFdlIHRoZXJlZm9yZSB1bnJvbGwgZWFjaCBsb29wIDUgdGltZXMgdG8gYXZvaWQgcmVnaXN0ZXIgc2h1ZmZsaW5nLgorCSAqIEFsc28gdGhlIHJvciBmb3IgQyAoYW5kIGFsc28gRCBhbmQgRSB3aGljaCBhcmUgc3VjY2Vzc2l2ZWx5ZGVyaXZlZAorCSAqIGZyb20gaXQpIGlzIGFwcGxpZWQgaW4gcGxhY2UgdG8gY3V0IG9uIGFuIGFkZGl0aW9uYWwgbW92IGluc24gZm9yCisJICogZWFjaCByb3VuZC4KKwkgKi8KKworCS5tYWNybwlzaGFfZjEsIEEsIEIsIEMsIEQsIEUKKwlsZHIJcjMsIFtyMl0sICM0CisJZW9yCWlwLCBcQywgXEQKKwlhZGQJXEUsIHIxLCBcRSwgcm9yICMyCisJYW5kCWlwLCBcQiwgaXAsIHJvciAjMgorCWFkZAlcRSwgXEUsIFxBLCByb3IgIzI3CisJZW9yCWlwLCBpcCwgXEQsIHJvciAjMgorCWFkZAlcRSwgXEUsIHIzCisJYWRkCVxFLCBcRSwgaXAKKwkuZW5kbQorCisJLm1hY3JvCXNoYV9mMiwgQSwgQiwgQywgRCwgRQorCWxkcglyMywgW3IyXSwgIzQKKwlhZGQJXEUsIHIxLCBcRSwgcm9yICMyCisJZW9yCWlwLCBcQiwgXEMsIHJvciAjMgorCWFkZAlcRSwgXEUsIFxBLCByb3IgIzI3CisJZW9yCWlwLCBpcCwgXEQsIHJvciAjMgorCWFkZAlcRSwgXEUsIHIzCisJYWRkCVxFLCBcRSwgaXAKKwkuZW5kbQorCisJLm1hY3JvCXNoYV9mMywgQSwgQiwgQywgRCwgRQorCWxkcglyMywgW3IyXSwgIzQKKwlhZGQJXEUsIHIxLCBcRSwgcm9yICMyCisJb3JyCWlwLCBcQiwgXEMsIHJvciAjMgorCWFkZAlcRSwgXEUsIFxBLCByb3IgIzI3CisJYW5kCWlwLCBpcCwgXEQsIHJvciAjMgorCWFkZAlcRSwgXEUsIHIzCisJYW5kCXIzLCBcQiwgXEMsIHJvciAjMgorCW9ycglpcCwgaXAsIHIzCisJYWRkCVxFLCBcRSwgaXAKKwkuZW5kbQorCisJbGRtaWEJcjAsIHtyNCAtIHI4fQorCisJbW92CWxyLCAjNAorCWxkcglyMSwgLkxfc2hhX0sgKyAwCisKKwkvKiBhZGp1c3QgaW5pdGlhbCB2YWx1ZXMgKi8KKwltb3YJcjYsIHI2LCByb3IgIzMwCisJbW92CXI3LCByNywgcm9yICMzMAorCW1vdglyOCwgcjgsIHJvciAjMzAKKworMzoJc3VicwlsciwgbHIsICMxCisJc2hhX2YxCXI0LCByNSwgcjYsIHI3LCByOAorCXNoYV9mMQlyOCwgcjQsIHI1LCByNiwgcjcKKwlzaGFfZjEJcjcsIHI4LCByNCwgcjUsIHI2CisJc2hhX2YxCXI2LCByNywgcjgsIHI0LCByNQorCXNoYV9mMQlyNSwgcjYsIHI3LCByOCwgcjQKKwlibmUJM2IKKworCWxkcglyMSwgLkxfc2hhX0sgKyA0CisJbW92CWxyLCAjNAorCis0OglzdWJzCWxyLCBsciwgIzEKKwlzaGFfZjIJcjQsIHI1LCByNiwgcjcsIHI4CisJc2hhX2YyCXI4LCByNCwgcjUsIHI2LCByNworCXNoYV9mMglyNywgcjgsIHI0LCByNSwgcjYKKwlzaGFfZjIJcjYsIHI3LCByOCwgcjQsIHI1CisJc2hhX2YyCXI1LCByNiwgcjcsIHI4LCByNAorCWJuZQk0YgorCisJbGRyCXIxLCAuTF9zaGFfSyArIDgKKwltb3YJbHIsICM0CisKKzU6CXN1YnMJbHIsIGxyLCAjMQorCXNoYV9mMwlyNCwgcjUsIHI2LCByNywgcjgKKwlzaGFfZjMJcjgsIHI0LCByNSwgcjYsIHI3CisJc2hhX2YzCXI3LCByOCwgcjQsIHI1LCByNgorCXNoYV9mMwlyNiwgcjcsIHI4LCByNCwgcjUKKwlzaGFfZjMJcjUsIHI2LCByNywgcjgsIHI0CisJYm5lCTViCisKKwlsZHIJcjEsIC5MX3NoYV9LICsgMTIKKwltb3YJbHIsICM0CisKKzY6CXN1YnMJbHIsIGxyLCAjMQorCXNoYV9mMglyNCwgcjUsIHI2LCByNywgcjgKKwlzaGFfZjIJcjgsIHI0LCByNSwgcjYsIHI3CisJc2hhX2YyCXI3LCByOCwgcjQsIHI1LCByNgorCXNoYV9mMglyNiwgcjcsIHI4LCByNCwgcjUKKwlzaGFfZjIJcjUsIHI2LCByNywgcjgsIHI0CisJYm5lCTZiCisKKwlsZG1pYQlyMCwge3IxLCByMiwgcjMsIGlwLCBscn0KKwlhZGQJcjQsIHIxLCByNAorCWFkZAlyNSwgcjIsIHI1CisJYWRkCXI2LCByMywgcjYsIHJvciAjMgorCWFkZAlyNywgaXAsIHI3LCByb3IgIzIKKwlhZGQJcjgsIGxyLCByOCwgcm9yICMyCisJc3RtaWEJcjAsIHtyNCAtIHI4fQorCisJbGRtZmQJc3AhLCB7cjQgLSByOCwgcGN9CisKKy5MX3NoYV9LOgorCS53b3JkCTB4NWE4Mjc5OTksIDB4NmVkOWViYTEsIDB4OGYxYmJjZGMsIDB4Y2E2MmMxZDYKKwpkaWZmIC0tZ2l0IGEvYmFzZTg1LmMgYi9iYXNlODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU5N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvYmFzZTg1LmMKQEAgLTAsMCArMSwxNDAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjdW5kZWYgREVCVUdfODUKKworI2lmZGVmIERFQlVHXzg1CisjZGVmaW5lIHNheShhKSBmcHJpbnRmKHN0ZGVyciwgYSkKKyNkZWZpbmUgc2F5MShhLGIpIGZwcmludGYoc3RkZXJyLCBhLCBiKQorI2RlZmluZSBzYXkyKGEsYixjKSBmcHJpbnRmKHN0ZGVyciwgYSwgYiwgYykKKyNlbHNlCisjZGVmaW5lIHNheShhKSBkbyB7fSB3aGlsZSgwKQorI2RlZmluZSBzYXkxKGEsYikgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgc2F5MihhLGIsYykgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBlbjg1W10gPSB7CisJJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLAorCSdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywKKwknSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLCAnUScsICdSJywgJ1MnLCAnVCcsCisJJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKKwknYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsCisJJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLAorCSd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsCisJJyEnLCAnIycsICckJywgJyUnLCAnJicsICcoJywgJyknLCAnKicsICcrJywgJy0nLAorCSc7JywgJzwnLCAnPScsICc+JywgJz8nLCAnQCcsICdeJywgJ18nLAknYCcsICd7JywKKwknfCcsICd9JywgJ34nCit9OworCitzdGF0aWMgY2hhciBkZTg1WzI1Nl07CitzdGF0aWMgdm9pZCBwcmVwX2Jhc2U4NSh2b2lkKQoreworCWludCBpOworCWlmIChkZTg1WydaJ10pCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbjg1KTsgaSsrKSB7CisJCWludCBjaCA9IGVuODVbaV07CisJCWRlODVbY2hdID0gaSArIDE7CisJfQorfQorCitpbnQgZGVjb2RlXzg1KGNoYXIgKmRzdCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworCXByZXBfYmFzZTg1KCk7CisKKwlzYXkyKCJkZWNvZGUgODUgPCUuKnM+IiwgbGVuLzQqNSwgYnVmZmVyKTsKKwl3aGlsZSAobGVuKSB7CisJCXVuc2lnbmVkIGFjYyA9IDA7CisJCWludCBkZSwgY250ID0gNDsKKwkJdW5zaWduZWQgY2hhciBjaDsKKwkJZG8geworCQkJY2ggPSAqYnVmZmVyKys7CisJCQlkZSA9IGRlODVbY2hdOworCQkJaWYgKC0tZGUgPCAwKQorCQkJCXJldHVybiBlcnJvcigiaW52YWxpZCBiYXNlODUgYWxwaGFiZXQgJWMiLCBjaCk7CisJCQlhY2MgPSBhY2MgKiA4NSArIGRlOworCQl9IHdoaWxlICgtLWNudCk7CisJCWNoID0gKmJ1ZmZlcisrOworCQlkZSA9IGRlODVbY2hdOworCQlpZiAoLS1kZSA8IDApCisJCQlyZXR1cm4gZXJyb3IoImludmFsaWQgYmFzZTg1IGFscGhhYmV0ICVjIiwgY2gpOworCQkvKgorCQkgKiBEZXRlY3Qgb3ZlcmZsb3cuICBUaGUgbGFyZ2VzdAorCQkgKiA1LWxldHRlciBwb3NzaWJsZSBpcyAifE5zQzAiIHRvCisJCSAqIGVuY29kZSAweGZmZmZmZmZmLCBhbmQgInxOc0MiIGdpdmVzCisJCSAqIDB4MDMwMzAzMDMgYXQgdGhpcyBwb2ludCAoaS5lLgorCQkgKiAweGZmZmZmZmZmID0gMHgwMzAzMDMwMyAqIDg1KS4KKwkJICovCisJCWlmICgweDAzMDMwMzAzIDwgYWNjIHx8CisJCSAgICAweGZmZmZmZmZmIC0gZGUgPCAoYWNjICo9IDg1KSkKKwkJCWVycm9yKCJpbnZhbGlkIGJhc2U4NSBzZXF1ZW5jZSAlLjVzIiwgYnVmZmVyLTUpOworCQlhY2MgKz0gZGU7CisJCXNheTEoIiAlMDh4IiwgYWNjKTsKKworCQljbnQgPSAobGVuIDwgNCkgPyBsZW4gOiA0OworCQlsZW4gLT0gY250OworCQlkbyB7CisJCQlhY2MgPSAoYWNjIDw8IDgpIHwgKGFjYyA+PiAyNCk7CisJCQkqZHN0KysgPSBhY2M7CisJCX0gd2hpbGUgKC0tY250KTsKKwl9CisJc2F5KCJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5jb2RlXzg1KGNoYXIgKmJ1ZiwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGJ5dGVzKQoreworCXByZXBfYmFzZTg1KCk7CisKKwlzYXkoImVuY29kZSA4NSIpOworCXdoaWxlIChieXRlcykgeworCQl1bnNpZ25lZCBhY2MgPSAwOworCQlpbnQgY250OworCQlmb3IgKGNudCA9IDI0OyBjbnQgPj0gMDsgY250IC09IDgpIHsKKwkJCWludCBjaCA9ICpkYXRhKys7CisJCQlhY2MgfD0gY2ggPDwgY250OworCQkJaWYgKC0tYnl0ZXMgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlzYXkxKCIgJTA4eCIsIGFjYyk7CisJCWZvciAoY250ID0gNDsgY250ID49IDA7IGNudC0tKSB7CisJCQlpbnQgdmFsID0gYWNjICUgODU7CisJCQlhY2MgLz0gODU7CisJCQlidWZbY250XSA9IGVuODVbdmFsXTsKKwkJfQorCQlidWYgKz0gNTsKKwl9CisJc2F5KCJcbiIpOworCisJKmJ1ZiA9IDA7Cit9CisKKyNpZmRlZiBERUJVR184NQoraW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJY2hhciBidWZbMTAyNF07CisKKwlpZiAoIXN0cmNtcChhdlsxXSwgIi1lIikpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihhdlsyXSk7CisJCWVuY29kZV84NShidWYsIGF2WzJdLCBsZW4pOworCQlpZiAobGVuIDw9IDI2KSBsZW4gPSBsZW4gKyAnQScgLSAxOworCQllbHNlIGxlbiA9IGxlbiArICdhJyAtIDI2ICsgMTsKKwkJcHJpbnRmKCJlbmNvZGVkOiAlYyVzXG4iLCBsZW4sIGJ1Zik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcChhdlsxXSwgIi1kIikpIHsKKwkJaW50IGxlbiA9ICphdlsyXTsKKwkJaWYgKCdBJyA8PSBsZW4gJiYgbGVuIDw9ICdaJykgbGVuID0gbGVuIC0gJ0EnICsgMTsKKwkJZWxzZSBsZW4gPSBsZW4gLSAnYScgKyAyNiArIDE7CisJCWRlY29kZV84NShidWYsIGF2WzJdKzEsIGxlbik7CisJCXByaW50ZigiZGVjb2RlZDogJS4qc1xuIiwgbGVuLCBidWYpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoYXZbMV0sICItdCIpKSB7CisJCWNoYXIgdFs0XSA9IHsgLTEsLTEsLTEsLTEgfTsKKwkJZW5jb2RlXzg1KGJ1ZiwgdCwgNCk7CisJCXByaW50ZigiZW5jb2RlZDogRCVzXG4iLCBidWYpOworCQlyZXR1cm4gMDsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2JsYW1lLmMgYi9ibGFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOTliNTMKLS0tIC9kZXYvbnVsbAorKysgYi9ibGFtZS5jCkBAIC0wLDAgKzEsOTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCBGcmVkcmlrIEt1aXZpbmVuIDxmcmVrdTA0NUBzdHVkZW50LmxpdS5zZT4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgInhkaWZmLWludGVyZmFjZS5oIgorCisjZGVmaW5lIERFQlVHIDAKKworc3RhdGljIGNvbnN0IGNoYXIgYmxhbWVfdXNhZ2VbXSA9ICJnaXQtYmxhbWUgWy1jXSBbLWxdIFstdF0gWy1TIDxyZXZzLWZpbGU+XSBbLS1dIGZpbGUgW2NvbW1pdF1cbiIKKwkiICAtYywgLS1jb21wYXRpYmlsaXR5IFVzZSB0aGUgc2FtZSBvdXRwdXQgbW9kZSBhcyBnaXQtYW5ub3RhdGUgKERlZmF1bHQ6IG9mZilcbiIKKwkiICAtbCwgLS1sb25nICAgICAgICAgIFNob3cgbG9uZyBjb21taXQgU0hBMSAoRGVmYXVsdDogb2ZmKVxuIgorCSIgIC10LCAtLXRpbWUgICAgICAgICAgU2hvdyByYXcgdGltZXN0YW1wIChEZWZhdWx0OiBvZmYpXG4iCisJIiAgLVMsIC0tcmV2cy1maWxlICAgICBVc2UgcmV2aXNpb25zIGZyb20gcmV2cy1maWxlIGluc3RlYWQgb2YgY2FsbGluZyBnaXQtcmV2LWxpc3RcbiIKKwkiICAtaCwgLS1oZWxwICAgICAgICAgIFRoaXMgbWVzc2FnZSI7CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0ICoqYmxhbWVfbGluZXM7CitzdGF0aWMgaW50IG51bV9ibGFtZV9saW5lczsKK3N0YXRpYyBjaGFyKiBibGFtZV9jb250ZW50czsKK3N0YXRpYyBpbnQgYmxhbWVfbGVuOworCitzdHJ1Y3QgdXRpbF9pbmZvIHsKKwlpbnQgKmxpbmVfbWFwOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CS8qIGJsb2Igc2hhLCBub3QgY29tbWl0ISAqLworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IG51bV9saW5lczsKKwljb25zdCBjaGFyKiBwYXRobmFtZTsKKworCXZvaWQqIHRvcG9fZGF0YTsKK307CisKK3N0cnVjdCBjaHVuayB7CisJaW50IG9mZjEsIGxlbjE7CS8qIC0tLSAqLworCWludCBvZmYyLCBsZW4yOwkvKiArKysgKi8KK307CisKK3N0cnVjdCBwYXRjaCB7CisJc3RydWN0IGNodW5rICpjaHVua3M7CisJaW50IG51bTsKK307CisKK3N0YXRpYyB2b2lkIGdldF9ibG9iKHN0cnVjdCBjb21taXQgKmNvbW1pdCk7CisKKy8qIE9ubHkgdXNlZCBmb3Igc3RhdGlzdGljcyAqLworc3RhdGljIGludCBudW1fZ2V0X3BhdGNoID0gMDsKK3N0YXRpYyBpbnQgbnVtX2NvbW1pdHMgPSAwOworc3RhdGljIGludCBwYXRjaF90aW1lID0gMDsKKworc3RydWN0IGJsYW1lX2RpZmZfc3RhdGUgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCXN0cnVjdCBwYXRjaCAqcmV0OworfTsKKworc3RhdGljIHZvaWQgcHJvY2Vzc191MF9kaWZmKHZvaWQgKnN0YXRlXywgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGJsYW1lX2RpZmZfc3RhdGUgKnN0YXRlID0gc3RhdGVfOworCXN0cnVjdCBjaHVuayAqY2h1bms7CisKKwlpZiAobGVuIDwgNCB8fCBsaW5lWzBdICE9ICdAJyB8fCBsaW5lWzFdICE9ICdAJykKKwkJcmV0dXJuOworCisJaWYgKERFQlVHKQorCQlwcmludGYoImNodW5rIGxpbmU6ICUuKnMiLCAoaW50KWxlbiwgbGluZSk7CisJc3RhdGUtPnJldC0+bnVtKys7CisJc3RhdGUtPnJldC0+Y2h1bmtzID0geHJlYWxsb2Moc3RhdGUtPnJldC0+Y2h1bmtzLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgY2h1bmspICogc3RhdGUtPnJldC0+bnVtKTsKKwljaHVuayA9ICZzdGF0ZS0+cmV0LT5jaHVua3Nbc3RhdGUtPnJldC0+bnVtIC0gMV07CisKKwlhc3NlcnQoIXN0cm5jbXAobGluZSwgIkBAIC0iLCA0KSk7CisKKwlpZiAocGFyc2VfaHVua19oZWFkZXIobGluZSwgbGVuLAorCQkJICAgICAgJmNodW5rLT5vZmYxLCAmY2h1bmstPmxlbjEsCisJCQkgICAgICAmY2h1bmstPm9mZjIsICZjaHVuay0+bGVuMikpIHsKKwkJc3RhdGUtPnJldC0+bnVtLS07CisJCXJldHVybjsKKwl9CisKKwlpZiAoY2h1bmstPmxlbjEgPT0gMCkKKwkJY2h1bmstPm9mZjErKzsKKwlpZiAoY2h1bmstPmxlbjIgPT0gMCkKKwkJY2h1bmstPm9mZjIrKzsKKworCWlmIChjaHVuay0+b2ZmMSA+IDApCisJCWNodW5rLT5vZmYxLS07CisJaWYgKGNodW5rLT5vZmYyID4gMCkKKwkJY2h1bmstPm9mZjItLTsKKworCWFzc2VydChjaHVuay0+b2ZmMSA+PSAwKTsKKwlhc3NlcnQoY2h1bmstPm9mZjIgPj0gMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGF0Y2ggKmdldF9wYXRjaChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBjb21taXQgKm90aGVyKQoreworCXN0cnVjdCBibGFtZV9kaWZmX3N0YXRlIHN0YXRlOworCXhwcGFyYW1fdCB4cHA7CisJeGRlbWl0Y29uZl90IHhlY2ZnOworCW1tZmlsZV90IGZpbGVfYywgZmlsZV9vOworCXhkZW1pdGNiX3QgZWNiOworCXN0cnVjdCB1dGlsX2luZm8gKmluZm9fYyA9IChzdHJ1Y3QgdXRpbF9pbmZvICopY29tbWl0LT51dGlsOworCXN0cnVjdCB1dGlsX2luZm8gKmluZm9fbyA9IChzdHJ1Y3QgdXRpbF9pbmZvICopb3RoZXItPnV0aWw7CisJc3RydWN0IHRpbWV2YWwgdHZfc3RhcnQsIHR2X2VuZDsKKworCWdldF9ibG9iKGNvbW1pdCk7CisJZmlsZV9jLnB0ciA9IGluZm9fYy0+YnVmOworCWZpbGVfYy5zaXplID0gaW5mb19jLT5zaXplOworCisJZ2V0X2Jsb2Iob3RoZXIpOworCWZpbGVfby5wdHIgPSBpbmZvX28tPmJ1ZjsKKwlmaWxlX28uc2l6ZSA9IGluZm9fby0+c2l6ZTsKKworCWdldHRpbWVvZmRheSgmdHZfc3RhcnQsIE5VTEwpOworCisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAwOworCXhlY2ZnLmZsYWdzID0gMDsKKwllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJZWNiLnByaXYgPSAmc3RhdGU7CisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUueG0uY29uc3VtZSA9IHByb2Nlc3NfdTBfZGlmZjsKKwlzdGF0ZS5yZXQgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgcGF0Y2gpKTsKKwlzdGF0ZS5yZXQtPmNodW5rcyA9IE5VTEw7CisJc3RhdGUucmV0LT5udW0gPSAwOworCisJeGRsX2RpZmYoJmZpbGVfYywgJmZpbGVfbywgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKworCWdldHRpbWVvZmRheSgmdHZfZW5kLCBOVUxMKTsKKwlwYXRjaF90aW1lICs9IDEwMDAwMDAgKiAodHZfZW5kLnR2X3NlYyAtIHR2X3N0YXJ0LnR2X3NlYykgKworCQl0dl9lbmQudHZfdXNlYyAtIHR2X3N0YXJ0LnR2X3VzZWM7CisKKwludW1fZ2V0X3BhdGNoKys7CisJcmV0dXJuIHN0YXRlLnJldDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9wYXRjaChzdHJ1Y3QgcGF0Y2ggKnApCit7CisJZnJlZShwLT5jaHVua3MpOworCWZyZWUocCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jsb2Jfc2hhMV9pbnRlcm5hbChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpiYXNlLAorCQkJCSAgaW50IGJhc2VsZW4sIGNvbnN0IGNoYXIgKnBhdGhuYW1lLAorCQkJCSAgdW5zaWduZWQgbW9kZSwgaW50IHN0YWdlKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmxvYl9zaGExWzIwXTsKK3N0YXRpYyBjb25zdCBjaGFyKiBibGFtZV9maWxlOworc3RhdGljIGludCBnZXRfYmxvYl9zaGExKHN0cnVjdCB0cmVlICp0LCBjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJCSB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnBhdGhzcGVjWzJdOworCWJsYW1lX2ZpbGUgPSBwYXRobmFtZTsKKwlwYXRoc3BlY1swXSA9IHBhdGhuYW1lOworCXBhdGhzcGVjWzFdID0gTlVMTDsKKwltZW1zZXQoYmxvYl9zaGExLCAwLCBzaXplb2YoYmxvYl9zaGExKSk7CisJcmVhZF90cmVlX3JlY3Vyc2l2ZSh0LCAiIiwgMCwgMCwgcGF0aHNwZWMsIGdldF9ibG9iX3NoYTFfaW50ZXJuYWwpOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJaWYgKGJsb2Jfc2hhMVtpXSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gMjApCisJCXJldHVybiAtMTsKKworCW1lbWNweShzaGExLCBibG9iX3NoYTEsIDIwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYmxvYl9zaGExX2ludGVybmFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkJICBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aG5hbWUsCisJCQkJICB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBSRUFEX1RSRUVfUkVDVVJTSVZFOworCisJaWYgKHN0cm5jbXAoYmxhbWVfZmlsZSwgYmFzZSwgYmFzZWxlbikgfHwKKwkgICAgc3RyY21wKGJsYW1lX2ZpbGUgKyBiYXNlbGVuLCBwYXRobmFtZSkpCisJCXJldHVybiAtMTsKKworCW1lbWNweShibG9iX3NoYTEsIHNoYTEsIDIwKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9ibG9iKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvICppbmZvID0gY29tbWl0LT51dGlsOworCWNoYXIgdHlwZVsyMF07CisKKwlpZiAoaW5mby0+YnVmKQorCQlyZXR1cm47CisKKwlpbmZvLT5idWYgPSByZWFkX3NoYTFfZmlsZShpbmZvLT5zaGExLCB0eXBlLCAmaW5mby0+c2l6ZSk7CisKKwlhc3NlcnQoIXN0cmNtcCh0eXBlLCBibG9iX3R5cGUpKTsKK30KKworLyogRm9yIGRlYnVnZ2luZyBvbmx5ICovCitzdGF0aWMgdm9pZCBwcmludF9wYXRjaChzdHJ1Y3QgcGF0Y2ggKnApCit7CisJaW50IGk7CisJcHJpbnRmKCJOdW0gY2h1bmtzOiAlZFxuIiwgcC0+bnVtKTsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnVtOyBpKyspIHsKKwkJcHJpbnRmKCIlZCwlZCAlZCwlZFxuIiwgcC0+Y2h1bmtzW2ldLm9mZjEsIHAtPmNodW5rc1tpXS5sZW4xLAorCQkgICAgICAgcC0+Y2h1bmtzW2ldLm9mZjIsIHAtPmNodW5rc1tpXS5sZW4yKTsKKwl9Cit9CisKKyNpZiBERUJVRworLyogRm9yIGRlYnVnZ2luZyBvbmx5ICovCitzdGF0aWMgdm9pZCBwcmludF9tYXAoc3RydWN0IGNvbW1pdCAqY21pdCwgc3RydWN0IGNvbW1pdCAqb3RoZXIpCit7CisJc3RydWN0IHV0aWxfaW5mbyAqdXRpbCA9IGNtaXQtPnV0aWw7CisJc3RydWN0IHV0aWxfaW5mbyAqdXRpbDIgPSBvdGhlci0+dXRpbDsKKworCWludCBpOworCWludCBtYXggPQorCSAgICB1dGlsLT5udW1fbGluZXMgPgorCSAgICB1dGlsMi0+bnVtX2xpbmVzID8gdXRpbC0+bnVtX2xpbmVzIDogdXRpbDItPm51bV9saW5lczsKKwlpbnQgbnVtOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXByaW50ZigiaTogJWQgIiwgaSk7CisJCW51bSA9IC0xOworCisJCWlmIChpIDwgdXRpbC0+bnVtX2xpbmVzKSB7CisJCQludW0gPSB1dGlsLT5saW5lX21hcFtpXTsKKwkJCXByaW50ZigiJWRcdCIsIG51bSk7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJcdCIpOworCisJCWlmIChpIDwgdXRpbDItPm51bV9saW5lcykgeworCQkJaW50IG51bTIgPSB1dGlsMi0+bGluZV9tYXBbaV07CisJCQlwcmludGYoIiVkXHQiLCBudW0yKTsKKwkJCWlmIChudW0gIT0gLTEgJiYgbnVtMiAhPSBudW0pCisJCQkJcHJpbnRmKCItLS0iKTsKKwkJfSBlbHNlCisJCQlwcmludGYoIlx0Iik7CisKKwkJcHJpbnRmKCJcbiIpOworCX0KK30KKyNlbmRpZgorCisvKiBwIGlzIGEgcGF0Y2ggZnJvbSBjb21taXQgdG8gb3RoZXIuICovCitzdGF0aWMgdm9pZCBmaWxsX2xpbmVfbWFwKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqb3RoZXIsCisJCQkgIHN0cnVjdCBwYXRjaCAqcCkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvICp1dGlsID0gY29tbWl0LT51dGlsOworCXN0cnVjdCB1dGlsX2luZm8gKnV0aWwyID0gb3RoZXItPnV0aWw7CisJaW50ICptYXAgPSB1dGlsLT5saW5lX21hcDsKKwlpbnQgKm1hcDIgPSB1dGlsMi0+bGluZV9tYXA7CisJaW50IGN1cl9jaHVuayA9IDA7CisJaW50IGkxLCBpMjsKKworCWlmIChwLT5udW0gJiYgREVCVUcpCisJCXByaW50X3BhdGNoKHApOworCisJaWYgKERFQlVHKQorCQlwcmludGYoIm51bSBsaW5lcyAxOiAlZCBudW0gbGluZXMgMjogJWRcbiIsIHV0aWwtPm51bV9saW5lcywKKwkJICAgICAgIHV0aWwyLT5udW1fbGluZXMpOworCisJZm9yIChpMSA9IDAsIGkyID0gMDsgaTEgPCB1dGlsLT5udW1fbGluZXM7IGkxKyssIGkyKyspIHsKKwkJc3RydWN0IGNodW5rICpjaHVuayA9IE5VTEw7CisJCWlmIChjdXJfY2h1bmsgPCBwLT5udW0pCisJCQljaHVuayA9ICZwLT5jaHVua3NbY3VyX2NodW5rXTsKKworCQlpZiAoY2h1bmsgJiYgY2h1bmstPm9mZjEgPT0gaTEpIHsKKwkJCWlmIChERUJVRyAmJiBpMiAhPSBjaHVuay0+b2ZmMikKKwkJCQlwcmludGYoImkyOiAlZCBvZmYyOiAlZFxuIiwgaTIsIGNodW5rLT5vZmYyKTsKKworCQkJYXNzZXJ0KGkyID09IGNodW5rLT5vZmYyKTsKKworCQkJaTEtLTsKKwkJCWkyLS07CisJCQlpZiAoY2h1bmstPmxlbjEgPiAwKQorCQkJCWkxICs9IGNodW5rLT5sZW4xOworCisJCQlpZiAoY2h1bmstPmxlbjIgPiAwKQorCQkJCWkyICs9IGNodW5rLT5sZW4yOworCisJCQljdXJfY2h1bmsrKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChpMiA+PSB1dGlsMi0+bnVtX2xpbmVzKQorCQkJCWJyZWFrOworCisJCQlpZiAobWFwW2kxXSAhPSBtYXAyW2kyXSAmJiBtYXBbaTFdICE9IC0xKSB7CisJCQkJaWYgKERFQlVHKQorCQkJCQlwcmludGYoIm1hcDogaTE6ICVkICVkICVwIGkyOiAlZCAlZCAlcFxuIiwKKwkJCQkJICAgICAgIGkxLCBtYXBbaTFdLAorCQkJCQkgICAgICAgKHZvaWQgKikgKGkxICE9IC0xID8gYmxhbWVfbGluZXNbbWFwW2kxXV0gOiBOVUxMKSwKKwkJCQkJICAgICAgIGkyLCBtYXAyW2kyXSwKKwkJCQkJICAgICAgICh2b2lkICopIChpMiAhPSAtMSA/IGJsYW1lX2xpbmVzW21hcDJbaTJdXSA6IE5VTEwpKTsKKwkJCQlpZiAobWFwMltpMl0gIT0gLTEgJiYKKwkJCQkgICAgYmxhbWVfbGluZXNbbWFwW2kxXV0gJiYKKwkJCQkgICAgIWJsYW1lX2xpbmVzW21hcDJbaTJdXSkKKwkJCQkJbWFwW2kxXSA9IG1hcDJbaTJdOworCQkJfQorCisJCQlpZiAobWFwW2kxXSA9PSAtMSAmJiBtYXAyW2kyXSAhPSAtMSkKKwkJCQltYXBbaTFdID0gbWFwMltpMl07CisJCX0KKworCQlpZiAoREVCVUcgPiAxKQorCQkJcHJpbnRmKCJsMTogJWQgbDI6ICVkIGkxOiAlZCBpMjogJWRcbiIsCisJCQkgICAgICAgbWFwW2kxXSwgbWFwMltpMl0sIGkxLCBpMik7CisJfQorfQorCitzdGF0aWMgaW50IG1hcF9saW5lKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgaW50IGxpbmUpCit7CisJc3RydWN0IHV0aWxfaW5mbyAqaW5mbyA9IGNvbW1pdC0+dXRpbDsKKwlhc3NlcnQobGluZSA+PSAwICYmIGxpbmUgPCBpbmZvLT5udW1fbGluZXMpOworCXJldHVybiBpbmZvLT5saW5lX21hcFtsaW5lXTsKK30KKworc3RhdGljIHN0cnVjdCB1dGlsX2luZm8qIGdldF91dGlsKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvICp1dGlsID0gY29tbWl0LT51dGlsOworCisJaWYgKHV0aWwpCisJCXJldHVybiB1dGlsOworCisJdXRpbCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCB1dGlsX2luZm8pKTsKKwl1dGlsLT5idWYgPSBOVUxMOworCXV0aWwtPnNpemUgPSAwOworCXV0aWwtPmxpbmVfbWFwID0gTlVMTDsKKwl1dGlsLT5udW1fbGluZXMgPSAtMTsKKwl1dGlsLT5wYXRobmFtZSA9IE5VTEw7CisJY29tbWl0LT51dGlsID0gdXRpbDsKKwlyZXR1cm4gdXRpbDsKK30KKworc3RhdGljIGludCBmaWxsX3V0aWxfaW5mbyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IHV0aWxfaW5mbyAqdXRpbCA9IGNvbW1pdC0+dXRpbDsKKworCWFzc2VydCh1dGlsKTsKKwlhc3NlcnQodXRpbC0+cGF0aG5hbWUpOworCisJaWYgKGdldF9ibG9iX3NoYTEoY29tbWl0LT50cmVlLCB1dGlsLT5wYXRobmFtZSwgdXRpbC0+c2hhMSkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX2xpbmVfbWFwKHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvICp1dGlsID0gY29tbWl0LT51dGlsOworCWludCBpOworCisJaWYgKHV0aWwtPmxpbmVfbWFwKQorCQlyZXR1cm47CisKKwlnZXRfYmxvYihjb21taXQpOworCisJdXRpbC0+bnVtX2xpbmVzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdXRpbC0+c2l6ZTsgaSsrKSB7CisJCWlmICh1dGlsLT5idWZbaV0gPT0gJ1xuJykKKwkJCXV0aWwtPm51bV9saW5lcysrOworCX0KKwlpZih1dGlsLT5idWZbdXRpbC0+c2l6ZSAtIDFdICE9ICdcbicpCisJCXV0aWwtPm51bV9saW5lcysrOworCisJdXRpbC0+bGluZV9tYXAgPSB4bWFsbG9jKHNpemVvZihpbnQpICogdXRpbC0+bnVtX2xpbmVzKTsKKworCWZvciAoaSA9IDA7IGkgPCB1dGlsLT5udW1fbGluZXM7IGkrKykKKwkJdXRpbC0+bGluZV9tYXBbaV0gPSAtMTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9maXJzdF9jb21taXQoc3RydWN0IGNvbW1pdCogY29tbWl0LCBjb25zdCBjaGFyKiBmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gY29tbWl0LT51dGlsOworCWludCBpOworCisJdXRpbC0+cGF0aG5hbWUgPSBmaWxlbmFtZTsKKwlpZiAoZmlsbF91dGlsX2luZm8oY29tbWl0KSkKKwkJZGllKCJmaWxsX3V0aWxfaW5mbyBmYWlsZWQiKTsKKworCWFsbG9jX2xpbmVfbWFwKGNvbW1pdCk7CisKKwl1dGlsID0gY29tbWl0LT51dGlsOworCisJZm9yIChpID0gMDsgaSA8IHV0aWwtPm51bV9saW5lczsgaSsrKQorCQl1dGlsLT5saW5lX21hcFtpXSA9IGk7Cit9CisKKworc3RhdGljIHZvaWQgcHJvY2Vzc19jb21taXRzKHN0cnVjdCByZXZfaW5mbyAqcmV2LCBjb25zdCBjaGFyICpwYXRoLAorCQkJICAgIHN0cnVjdCBjb21taXQqKiBpbml0aWFsKQoreworCWludCBpOworCXN0cnVjdCB1dGlsX2luZm8qIHV0aWw7CisJaW50IGxpbmVzX2xlZnQ7CisJaW50ICpibGFtZV9wOworCWludCAqbmV3X2xpbmVzOworCWludCBuZXdfbGluZXNfbGVuOworCisJc3RydWN0IGNvbW1pdCogY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldik7CisJYXNzZXJ0KGNvbW1pdCk7CisJaW5pdF9maXJzdF9jb21taXQoY29tbWl0LCBwYXRoKTsKKworCXV0aWwgPSBjb21taXQtPnV0aWw7CisJbnVtX2JsYW1lX2xpbmVzID0gdXRpbC0+bnVtX2xpbmVzOworCWJsYW1lX2xpbmVzID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1pdCAqKSAqIG51bV9ibGFtZV9saW5lcyk7CisJYmxhbWVfY29udGVudHMgPSB1dGlsLT5idWY7CisJYmxhbWVfbGVuID0gdXRpbC0+c2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxhbWVfbGluZXM7IGkrKykKKwkJYmxhbWVfbGluZXNbaV0gPSBOVUxMOworCisJbGluZXNfbGVmdCA9IG51bV9ibGFtZV9saW5lczsKKwlibGFtZV9wID0geG1hbGxvYyhzaXplb2YoaW50KSAqIG51bV9ibGFtZV9saW5lcyk7CisJbmV3X2xpbmVzID0geG1hbGxvYyhzaXplb2YoaW50KSAqIG51bV9ibGFtZV9saW5lcyk7CisJZG8geworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCWludCBudW1fcGFyZW50czsKKwkJc3RydWN0IHV0aWxfaW5mbyAqdXRpbDsKKworCQlpZiAoREVCVUcpCisJCQlwcmludGYoIlxuUHJvY2Vzc2luZyBjb21taXQ6ICVkICVzXG4iLCBudW1fY29tbWl0cywKKwkJCSAgICAgICBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisKKwkJaWYgKGxpbmVzX2xlZnQgPT0gMCkKKwkJCXJldHVybjsKKworCQludW1fY29tbWl0cysrOworCQltZW1zZXQoYmxhbWVfcCwgMCwgc2l6ZW9mKGludCkgKiBudW1fYmxhbWVfbGluZXMpOworCQluZXdfbGluZXNfbGVuID0gMDsKKwkJbnVtX3BhcmVudHMgPSAwOworCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCSAgICAgcGFyZW50cyAhPSBOVUxMOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkKKwkJCW51bV9wYXJlbnRzKys7CisKKwkJaWYobnVtX3BhcmVudHMgPT0gMCkKKwkJCSppbml0aWFsID0gY29tbWl0OworCisJCWlmIChmaWxsX3V0aWxfaW5mbyhjb21taXQpKQorCQkJY29udGludWU7CisKKwkJYWxsb2NfbGluZV9tYXAoY29tbWl0KTsKKwkJdXRpbCA9IGNvbW1pdC0+dXRpbDsKKworCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCSAgICAgcGFyZW50cyAhPSBOVUxMOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdCAqcGFyZW50ID0gcGFyZW50cy0+aXRlbTsKKwkJCXN0cnVjdCBwYXRjaCAqcGF0Y2g7CisKKwkJCWlmIChwYXJzZV9jb21taXQocGFyZW50KSA8IDApCisJCQkJZGllKCJwYXJzZV9jb21taXQgZXJyb3IiKTsKKworCQkJaWYgKERFQlVHKQorCQkJCXByaW50ZigicGFyZW50OiAlc1xuIiwKKwkJCQkgICAgICAgc2hhMV90b19oZXgocGFyZW50LT5vYmplY3Quc2hhMSkpOworCisJCQlpZiAoZmlsbF91dGlsX2luZm8ocGFyZW50KSkgeworCQkJCW51bV9wYXJlbnRzLS07CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXBhdGNoID0gZ2V0X3BhdGNoKHBhcmVudCwgY29tbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2xpbmVfbWFwKHBhcmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2xpbmVfbWFwKHBhcmVudCwgY29tbWl0LCBwYXRjaCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXRjaC0+bnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcGF0Y2gtPmNodW5rc1tpXS5sZW4yOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hcHBlZF9saW5lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9saW5lKGNvbW1pdCwgcGF0Y2gtPmNodW5rc1tpXS5vZmYyICsgbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRfbGluZSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhbWVfcFttYXBwZWRfbGluZV0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibGFtZV9wW21hcHBlZF9saW5lXSA9PSBudW1fcGFyZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbGluZXNbbmV3X2xpbmVzX2xlbisrXSA9IG1hcHBlZF9saW5lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wYXRjaChwYXRjaCk7CisJCX0KKworCQlpZiAoREVCVUcpCisJCQlwcmludGYoInBhcmVudHM6ICVkXG4iLCBudW1fcGFyZW50cyk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5ld19saW5lc19sZW47IGkrKykgeworCQkJaW50IG1hcHBlZF9saW5lID0gbmV3X2xpbmVzW2ldOworCQkJaWYgKGJsYW1lX2xpbmVzW21hcHBlZF9saW5lXSA9PSBOVUxMKSB7CisJCQkJYmxhbWVfbGluZXNbbWFwcGVkX2xpbmVdID0gY29tbWl0OworCQkJCWxpbmVzX2xlZnQtLTsKKwkJCQlpZiAoREVCVUcpCisJCQkJCXByaW50ZigiYmxhbWU6IG1hcHBlZDogJWQgaTogJWRcbiIsCisJCQkJCSAgICAgICBtYXBwZWRfbGluZSwgaSk7CisJCQl9CisJCX0KKwl9IHdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldikpICE9IE5VTEwpOworfQorCisKK3N0YXRpYyBpbnQgY29tcGFyZV90cmVlX3BhdGgoc3RydWN0IHJldl9pbmZvKiByZXZzLAorCQkJICAgICBzdHJ1Y3QgY29tbWl0KiBjMSwgc3RydWN0IGNvbW1pdCogYzIpCit7CisJaW50IHJldDsKKwljb25zdCBjaGFyKiBwYXRoc1syXTsKKwlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gYzItPnV0aWw7CisJcGF0aHNbMF0gPSB1dGlsLT5wYXRobmFtZTsKKwlwYXRoc1sxXSA9IE5VTEw7CisKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMoZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwgcGF0aHMpLAorCQkJICAgICAgJnJldnMtPnBydW5pbmcpOworCXJldCA9IHJldl9jb21wYXJlX3RyZWUocmV2cywgYzEtPnRyZWUsIGMyLT50cmVlKTsKKwlkaWZmX3RyZWVfcmVsZWFzZV9wYXRocygmcmV2cy0+cHJ1bmluZyk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IHNhbWVfdHJlZV9hc19lbXB0eV9wYXRoKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IHRyZWUqIHQxLAorCQkJCSAgIGNvbnN0IGNoYXIqIHBhdGgpCit7CisJaW50IHJldDsKKwljb25zdCBjaGFyKiBwYXRoc1syXTsKKwlwYXRoc1swXSA9IHBhdGg7CisJcGF0aHNbMV0gPSBOVUxMOworCisJZGlmZl90cmVlX3NldHVwX3BhdGhzKGdldF9wYXRoc3BlYyhyZXZzLT5wcmVmaXgsIHBhdGhzKSwKKwkJCSAgICAgICZyZXZzLT5wcnVuaW5nKTsKKwlyZXQgPSByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHJldnMsIHQxKTsKKwlkaWZmX3RyZWVfcmVsZWFzZV9wYXRocygmcmV2cy0+cHJ1bmluZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGZpbmRfcmVuYW1lKHN0cnVjdCBjb21taXQqIGNvbW1pdCwgc3RydWN0IGNvbW1pdCogcGFyZW50KQoreworCXN0cnVjdCB1dGlsX2luZm8qIGN1dGlsID0gY29tbWl0LT51dGlsOworCXN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZl9vcHRzOworCWNvbnN0IGNoYXIgKnBhdGhzWzFdOworCWludCBpOworCisJaWYgKERFQlVHKSB7CisJCXByaW50ZigiZmluZF9yZW5hbWUgY29tbWl0OiAlcyAiLAorCQkgICAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQlwdXRzKHNoYTFfdG9faGV4KHBhcmVudC0+b2JqZWN0LnNoYTEpKTsKKwl9CisKKwlkaWZmX3NldHVwKCZkaWZmX29wdHMpOworCWRpZmZfb3B0cy5yZWN1cnNpdmUgPSAxOworCWRpZmZfb3B0cy5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCXBhdGhzWzBdID0gTlVMTDsKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMocGF0aHMsICZkaWZmX29wdHMpOworCWlmIChkaWZmX3NldHVwX2RvbmUoJmRpZmZfb3B0cykgPCAwKQorCQlkaWUoImRpZmZfc2V0dXBfZG9uZSBmYWlsZWQiKTsKKworCWRpZmZfdHJlZV9zaGExKGNvbW1pdC0+dHJlZS0+b2JqZWN0LnNoYTEsIHBhcmVudC0+dHJlZS0+b2JqZWN0LnNoYTEsCisJCSAgICAgICAiIiwgJmRpZmZfb3B0cyk7CisJZGlmZmNvcmVfc3RkKCZkaWZmX29wdHMpOworCisJZm9yIChpID0gMDsgaSA8IGRpZmZfcXVldWVkX2RpZmYubnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IGRpZmZfcXVldWVkX2RpZmYucXVldWVbaV07CisKKwkJaWYgKHAtPnN0YXR1cyA9PSAnUicgJiYgIXN0cmNtcChwLT5vbmUtPnBhdGgsIGN1dGlsLT5wYXRobmFtZSkpIHsKKwkJCWlmIChERUJVRykKKwkJCQlwcmludGYoInJlbmFtZSAlcyAtPiAlc1xuIiwgcC0+b25lLT5wYXRoLCBwLT50d28tPnBhdGgpOworCQkJcmV0dXJuIHAtPnR3by0+cGF0aDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaW1wbGlmeV9jb21taXQoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAsICpwYXJlbnQ7CisKKwlpZiAoIWNvbW1pdC0+dHJlZSkKKwkJcmV0dXJuOworCisJaWYgKCFjb21taXQtPnBhcmVudHMpIHsKKwkJc3RydWN0IHV0aWxfaW5mbyogdXRpbCA9IGNvbW1pdC0+dXRpbDsKKwkJaWYgKCFzYW1lX3RyZWVfYXNfZW1wdHlfcGF0aChyZXZzLCBjb21taXQtPnRyZWUsCisJCQkJCSAgICAgdXRpbC0+cGF0aG5hbWUpKQorCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVFJFRUNIQU5HRTsKKwkJcmV0dXJuOworCX0KKworCXBwID0gJmNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAoKHBhcmVudCA9ICpwcCkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCisJCWlmIChwLT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQlwcCA9ICZwYXJlbnQtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBhcnNlX2NvbW1pdChwKTsKKwkJc3dpdGNoIChjb21wYXJlX3RyZWVfcGF0aChyZXZzLCBwLCBjb21taXQpKSB7CisJCWNhc2UgUkVWX1RSRUVfU0FNRToKKwkJCXBhcmVudC0+bmV4dCA9IE5VTEw7CisJCQljb21taXQtPnBhcmVudHMgPSBwYXJlbnQ7CisJCQlnZXRfdXRpbChwKS0+cGF0aG5hbWUgPSBnZXRfdXRpbChjb21taXQpLT5wYXRobmFtZTsKKwkJCXJldHVybjsKKworCQljYXNlIFJFVl9UUkVFX05FVzoKKwkJeworCisJCQlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gY29tbWl0LT51dGlsOworCQkJaWYgKHJldnMtPnJlbW92ZV9lbXB0eV90cmVlcyAmJgorCQkJICAgIHNhbWVfdHJlZV9hc19lbXB0eV9wYXRoKHJldnMsIHAtPnRyZWUsCisJCQkJCQkgICAgdXRpbC0+cGF0aG5hbWUpKSB7CisJCQkJY29uc3QgY2hhciogbmV3X25hbWUgPSBmaW5kX3JlbmFtZShjb21taXQsIHApOworCQkJCWlmIChuZXdfbmFtZSkgeworCQkJCQlzdHJ1Y3QgdXRpbF9pbmZvKiBwdXRpbCA9IGdldF91dGlsKHApOworCQkJCQlpZiAoIXB1dGlsLT5wYXRobmFtZSkKKwkJCQkJCXB1dGlsLT5wYXRobmFtZSA9IHN0cmR1cChuZXdfbmFtZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJKnBwID0gcGFyZW50LT5uZXh0OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIFJFVl9UUkVFX0RJRkZFUkVOVDoKKwkJCXBwID0gJnBhcmVudC0+bmV4dDsKKwkJCWlmICghZ2V0X3V0aWwocCktPnBhdGhuYW1lKQorCQkJCWdldF91dGlsKHApLT5wYXRobmFtZSA9CisJCQkJCWdldF91dGlsKGNvbW1pdCktPnBhdGhuYW1lOworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJiYWQgdHJlZSBjb21wYXJlIGZvciBjb21taXQgJXMiLAorCQkgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCX0KKwljb21taXQtPm9iamVjdC5mbGFncyB8PSBUUkVFQ0hBTkdFOworfQorCisKK3N0cnVjdCBjb21taXRfaW5mbworeworCWNoYXIqIGF1dGhvcjsKKwljaGFyKiBhdXRob3JfbWFpbDsKKwl1bnNpZ25lZCBsb25nIGF1dGhvcl90aW1lOworCWNoYXIqIGF1dGhvcl90ejsKK307CisKK3N0YXRpYyB2b2lkIGdldF9jb21taXRfaW5mbyhzdHJ1Y3QgY29tbWl0KiBjb21taXQsIHN0cnVjdCBjb21taXRfaW5mbyogcmV0KQoreworCWludCBsZW47CisJY2hhciogdG1wOworCXN0YXRpYyBjaGFyIGF1dGhvcl9idWZbMTAyNF07CisKKwl0bXAgPSBzdHJzdHIoY29tbWl0LT5idWZmZXIsICJcbmF1dGhvciAiKSArIDg7CisJbGVuID0gc3RyY2hyKHRtcCwgJ1xuJykgLSB0bXA7CisJcmV0LT5hdXRob3IgPSBhdXRob3JfYnVmOworCW1lbWNweShyZXQtPmF1dGhvciwgdG1wLCBsZW4pOworCisJdG1wID0gcmV0LT5hdXRob3I7CisJdG1wICs9IGxlbjsKKwkqdG1wID0gMDsKKwl3aGlsZSgqdG1wICE9ICcgJykKKwkJdG1wLS07CisJcmV0LT5hdXRob3JfdHogPSB0bXArMTsKKworCSp0bXAgPSAwOworCXdoaWxlKCp0bXAgIT0gJyAnKQorCQl0bXAtLTsKKwlyZXQtPmF1dGhvcl90aW1lID0gc3RydG91bCh0bXAsIE5VTEwsIDEwKTsKKworCSp0bXAgPSAwOworCXdoaWxlKCp0bXAgIT0gJyAnKQorCQl0bXAtLTsKKwlyZXQtPmF1dGhvcl9tYWlsID0gdG1wICsgMTsKKworCSp0bXAgPSAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciogZm9ybWF0X3RpbWUodW5zaWduZWQgbG9uZyB0aW1lLCBjb25zdCBjaGFyKiB0el9zdHIsCisJCQkgICAgICAgaW50IHNob3dfcmF3X3RpbWUpCit7CisJc3RhdGljIGNoYXIgdGltZV9idWZbMTI4XTsKKwl0aW1lX3QgdCA9IHRpbWU7CisJaW50IG1pbnV0ZXMsIHR6OworCXN0cnVjdCB0bSAqdG07CisKKwlpZiAoc2hvd19yYXdfdGltZSkgeworCQlzcHJpbnRmKHRpbWVfYnVmLCAiJWx1ICVzIiwgdGltZSwgdHpfc3RyKTsKKwkJcmV0dXJuIHRpbWVfYnVmOworCX0KKworCXR6ID0gYXRvaSh0el9zdHIpOworCW1pbnV0ZXMgPSB0eiA8IDAgPyAtdHogOiB0ejsKKwltaW51dGVzID0gKG1pbnV0ZXMgLyAxMDApKjYwICsgKG1pbnV0ZXMgJSAxMDApOworCW1pbnV0ZXMgPSB0eiA8IDAgPyAtbWludXRlcyA6IG1pbnV0ZXM7CisJdCA9IHRpbWUgKyBtaW51dGVzICogNjA7CisJdG0gPSBnbXRpbWUoJnQpOworCisJc3RyZnRpbWUodGltZV9idWYsIHNpemVvZih0aW1lX2J1ZiksICIlWS0lbS0lZCAlSDolTTolUyAiLCB0bSk7CisJc3RyY2F0KHRpbWVfYnVmLCB0el9zdHIpOworCXJldHVybiB0aW1lX2J1ZjsKK30KKworc3RhdGljIHZvaWQgdG9wb19zZXR0ZXIoc3RydWN0IGNvbW1pdCogYywgdm9pZCogZGF0YSkKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gYy0+dXRpbDsKKwl1dGlsLT50b3BvX2RhdGEgPSBkYXRhOworfQorCitzdGF0aWMgdm9pZCogdG9wb19nZXR0ZXIoc3RydWN0IGNvbW1pdCogYykKK3sKKwlzdHJ1Y3QgdXRpbF9pbmZvKiB1dGlsID0gYy0+dXRpbDsKKwlyZXR1cm4gdXRpbC0+dG9wb19kYXRhOworfQorCitzdGF0aWMgaW50IHJlYWRfYW5jZXN0cnkoY29uc3QgY2hhciAqZ3JhZnRfZmlsZSwKKwkJCSB1bnNpZ25lZCBjaGFyICoqc3RhcnRfc2hhMSkKK3sKKwlGSUxFICpmcCA9IGZvcGVuKGdyYWZ0X2ZpbGUsICJyIik7CisJY2hhciBidWZbMTAyNF07CisJaWYgKCFmcCkKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJLyogVGhlIGZvcm1hdCBpcyBqdXN0ICJDb21taXQgUGFyZW50MSBQYXJlbnQyIC4uLlxuIiAqLworCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCXN0cnVjdCBjb21taXRfZ3JhZnQgKmdyYWZ0ID0gcmVhZF9ncmFmdF9saW5lKGJ1ZiwgbGVuKTsKKwkJcmVnaXN0ZXJfY29tbWl0X2dyYWZ0KGdyYWZ0LCAwKTsKKwkJaWYgKCEqc3RhcnRfc2hhMSkKKwkJCSpzdGFydF9zaGExID0gZ3JhZnQtPnNoYTE7CisJfQorCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY29tbWl0ICppbml0aWFsID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCAqc2hhMV9wID0gTlVMTDsKKworCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gTlVMTCwgKmNvbW1pdCA9IE5VTEw7CisJY2hhciBmaWxlbmFtZV9idWZbMjU2XTsKKwlpbnQgc2hhMV9sZW4gPSA4OworCWludCBjb21wYXRpYmlsaXR5ID0gMDsKKwlpbnQgc2hvd19yYXdfdGltZSA9IDA7CisJaW50IG9wdGlvbnMgPSAxOworCXN0cnVjdCBjb21taXQqIHN0YXJ0X2NvbW1pdDsKKworCWNvbnN0IGNoYXIqIGFyZ3NbMTBdOworCXN0cnVjdCByZXZfaW5mbyByZXY7CisKKwlzdHJ1Y3QgY29tbWl0X2luZm8gY2k7CisJY29uc3QgY2hhciAqYnVmOworCWludCBtYXhfZGlnaXRzOworCWludCBsb25nZXN0X2ZpbGUsIGxvbmdlc3RfYXV0aG9yOworCWludCBmb3VuZF9yZW5hbWU7CisKKwljb25zdCBjaGFyKiBwcmVmaXggPSBzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJZm9yKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmKG9wdGlvbnMpIHsKKwkJCWlmKCFzdHJjbXAoYXJndltpXSwgIi1oIikgfHwKKwkJCSAgICFzdHJjbXAoYXJndltpXSwgIi0taGVscCIpKQorCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCWVsc2UgaWYoIXN0cmNtcChhcmd2W2ldLCAiLWwiKSB8fAorCQkJCSFzdHJjbXAoYXJndltpXSwgIi0tbG9uZyIpKSB7CisJCQkJc2hhMV9sZW4gPSA0MDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItYyIpIHx8CisJCQkJICAhc3RyY21wKGFyZ3ZbaV0sICItLWNvbXBhdGliaWxpdHkiKSkgeworCQkJCWNvbXBhdGliaWxpdHkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmKCFzdHJjbXAoYXJndltpXSwgIi10IikgfHwKKwkJCQkgICFzdHJjbXAoYXJndltpXSwgIi0tdGltZSIpKSB7CisJCQkJc2hvd19yYXdfdGltZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYoIXN0cmNtcChhcmd2W2ldLCAiLVMiKSkgeworCQkJCWlmIChpICsgMSA8IGFyZ2MgJiYKKwkJCQkgICAgIXJlYWRfYW5jZXN0cnkoYXJndltpICsgMV0sICZzaGExX3ApKSB7CisJCQkJCWNvbXBhdGliaWxpdHkgPSAxOworCQkJCQlpKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQl1c2FnZShibGFtZV91c2FnZSk7CisJCQl9IGVsc2UgaWYoIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkgeworCQkJCW9wdGlvbnMgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmKGFyZ3ZbaV1bMF0gPT0gJy0nKQorCQkJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwkJCWVsc2UKKwkJCQlvcHRpb25zID0gMDsKKwkJfQorCisJCWlmKCFvcHRpb25zKSB7CisJCQlpZighZmlsZW5hbWUpCisJCQkJZmlsZW5hbWUgPSBhcmd2W2ldOworCQkJZWxzZSBpZighY29tbWl0KQorCQkJCWNvbW1pdCA9IGFyZ3ZbaV07CisJCQllbHNlCisJCQkJdXNhZ2UoYmxhbWVfdXNhZ2UpOworCQl9CisJfQorCisJaWYoIWZpbGVuYW1lKQorCQl1c2FnZShibGFtZV91c2FnZSk7CisJaWYgKGNvbW1pdCAmJiBzaGExX3ApCisJCXVzYWdlKGJsYW1lX3VzYWdlKTsKKwllbHNlIGlmKCFjb21taXQpCisJCWNvbW1pdCA9ICJIRUFEIjsKKworCWlmKHByZWZpeCkKKwkJc3ByaW50ZihmaWxlbmFtZV9idWYsICIlcyVzIiwgcHJlZml4LCBmaWxlbmFtZSk7CisJZWxzZQorCQlzdHJjcHkoZmlsZW5hbWVfYnVmLCBmaWxlbmFtZSk7CisJZmlsZW5hbWUgPSBmaWxlbmFtZV9idWY7CisKKwlpZiAoIXNoYTFfcCkgeworCQlpZiAoZ2V0X3NoYTEoY29tbWl0LCBzaGExKSkKKwkJCWRpZSgiZ2V0X3NoYTEgZmFpbGVkLCBjb21taXQgJyVzJyBub3QgZm91bmQiLCBjb21taXQpOworCQlzaGExX3AgPSBzaGExOworCX0KKwlzdGFydF9jb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExX3ApOworCWdldF91dGlsKHN0YXJ0X2NvbW1pdCktPnBhdGhuYW1lID0gZmlsZW5hbWU7CisJaWYgKGZpbGxfdXRpbF9pbmZvKHN0YXJ0X2NvbW1pdCkpIHsKKwkJcHJpbnRmKCIlcyBub3QgZm91bmQgaW4gJXNcbiIsIGZpbGVuYW1lLCBjb21taXQpOworCQlyZXR1cm4gMTsKKwl9CisKKworCWluaXRfcmV2aXNpb25zKCZyZXYsIHNldHVwX2dpdF9kaXJlY3RvcnkoKSk7CisJcmV2LnJlbW92ZV9lbXB0eV90cmVlcyA9IDE7CisJcmV2LnRvcG9fb3JkZXIgPSAxOworCXJldi5wcnVuZV9mbiA9IHNpbXBsaWZ5X2NvbW1pdDsKKwlyZXYudG9wb19zZXR0ZXIgPSB0b3BvX3NldHRlcjsKKwlyZXYudG9wb19nZXR0ZXIgPSB0b3BvX2dldHRlcjsKKwlyZXYucGFyZW50cyA9IDE7CisJcmV2LmxpbWl0ZWQgPSAxOworCisJY29tbWl0X2xpc3RfaW5zZXJ0KHN0YXJ0X2NvbW1pdCwgJnJldi5jb21taXRzKTsKKworCWFyZ3NbMF0gPSBmaWxlbmFtZTsKKwlhcmdzWzFdID0gTlVMTDsKKwlkaWZmX3RyZWVfc2V0dXBfcGF0aHMoYXJncywgJnJldi5wcnVuaW5nKTsKKwlwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldik7CisJcHJvY2Vzc19jb21taXRzKCZyZXYsIGZpbGVuYW1lLCAmaW5pdGlhbCk7CisKKwlidWYgPSBibGFtZV9jb250ZW50czsKKwlmb3IgKG1heF9kaWdpdHMgPSAxLCBpID0gMTA7IGkgPD0gbnVtX2JsYW1lX2xpbmVzICsgMTsgbWF4X2RpZ2l0cysrKQorCQlpICo9IDEwOworCisJbG9uZ2VzdF9maWxlID0gMDsKKwlsb25nZXN0X2F1dGhvciA9IDA7CisJZm91bmRfcmVuYW1lID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2JsYW1lX2xpbmVzOyBpKyspIHsKKwkJc3RydWN0IGNvbW1pdCAqYyA9IGJsYW1lX2xpbmVzW2ldOworCQlzdHJ1Y3QgdXRpbF9pbmZvKiB1OworCQlpZiAoIWMpCisJCQljID0gaW5pdGlhbDsKKwkJdSA9IGMtPnV0aWw7CisKKwkJaWYgKCFmb3VuZF9yZW5hbWUgJiYgc3RyY21wKGZpbGVuYW1lLCB1LT5wYXRobmFtZSkpCisJCQlmb3VuZF9yZW5hbWUgPSAxOworCQlpZiAobG9uZ2VzdF9maWxlIDwgc3RybGVuKHUtPnBhdGhuYW1lKSkKKwkJCWxvbmdlc3RfZmlsZSA9IHN0cmxlbih1LT5wYXRobmFtZSk7CisJCWdldF9jb21taXRfaW5mbyhjLCAmY2kpOworCQlpZiAobG9uZ2VzdF9hdXRob3IgPCBzdHJsZW4oY2kuYXV0aG9yKSkKKwkJCWxvbmdlc3RfYXV0aG9yID0gc3RybGVuKGNpLmF1dGhvcik7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9ibGFtZV9saW5lczsgaSsrKSB7CisJCXN0cnVjdCBjb21taXQgKmMgPSBibGFtZV9saW5lc1tpXTsKKwkJc3RydWN0IHV0aWxfaW5mbyogdTsKKworCQlpZiAoIWMpCisJCQljID0gaW5pdGlhbDsKKworCQl1ID0gYy0+dXRpbDsKKwkJZ2V0X2NvbW1pdF9pbmZvKGMsICZjaSk7CisJCWZ3cml0ZShzaGExX3RvX2hleChjLT5vYmplY3Quc2hhMSksIHNoYTFfbGVuLCAxLCBzdGRvdXQpOworCQlpZihjb21wYXRpYmlsaXR5KSB7CisJCQlwcmludGYoIlx0KCUxMHNcdCUxMHNcdCVkKSIsIGNpLmF1dGhvciwKKwkJCSAgICAgICBmb3JtYXRfdGltZShjaS5hdXRob3JfdGltZSwgY2kuYXV0aG9yX3R6LAorCQkJCQkgICBzaG93X3Jhd190aW1lKSwKKwkJCSAgICAgICBpKzEpOworCQl9IGVsc2UgeworCQkJaWYgKGZvdW5kX3JlbmFtZSkKKwkJCQlwcmludGYoIiAlLSouKnMiLCBsb25nZXN0X2ZpbGUsIGxvbmdlc3RfZmlsZSwKKwkJCQkgICAgICAgdS0+cGF0aG5hbWUpOworCQkJcHJpbnRmKCIgKCUtKi4qcyAlMTBzICUqZCkgIiwKKwkJCSAgICAgICBsb25nZXN0X2F1dGhvciwgbG9uZ2VzdF9hdXRob3IsIGNpLmF1dGhvciwKKwkJCSAgICAgICBmb3JtYXRfdGltZShjaS5hdXRob3JfdGltZSwgY2kuYXV0aG9yX3R6LAorCQkJCQkgICBzaG93X3Jhd190aW1lKSwKKwkJCSAgICAgICBtYXhfZGlnaXRzLCBpKzEpOworCQl9CisKKwkJaWYoaSA9PSBudW1fYmxhbWVfbGluZXMgLSAxKSB7CisJCQlmd3JpdGUoYnVmLCBibGFtZV9sZW4gLSAoYnVmIC0gYmxhbWVfY29udGVudHMpLAorCQkJICAgICAgIDEsIHN0ZG91dCk7CisJCQlpZihibGFtZV9jb250ZW50c1tibGFtZV9sZW4tMV0gIT0gJ1xuJykKKwkJCQlwdXRjKCdcbicsIHN0ZG91dCk7CisJCX0gZWxzZSB7CisJCQljaGFyKiBuZXh0X2J1ZiA9IHN0cmNocihidWYsICdcbicpICsgMTsKKwkJCWZ3cml0ZShidWYsIG5leHRfYnVmIC0gYnVmLCAxLCBzdGRvdXQpOworCQkJYnVmID0gbmV4dF9idWY7CisJCX0KKwl9CisKKwlpZiAoREVCVUcpIHsKKwkJcHJpbnRmKCJudW0gZ2V0IHBhdGNoOiAlZFxuIiwgbnVtX2dldF9wYXRjaCk7CisJCXByaW50ZigibnVtIGNvbW1pdHM6ICVkXG4iLCBudW1fY29tbWl0cyk7CisJCXByaW50ZigicGF0Y2ggdGltZTogJWZcbiIsIHBhdGNoX3RpbWUgLyAxMDAwMDAwLjApOworCQlwcmludGYoImluaXRpYWw6ICVzXG4iLCBzaGExX3RvX2hleChpbml0aWFsLT5vYmplY3Quc2hhMSkpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYmxvYi5jIGIvYmxvYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYWYyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9ibG9iLmMKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitjb25zdCBjaGFyICpibG9iX3R5cGUgPSAiYmxvYiI7CisKK3N0cnVjdCBibG9iICpsb29rdXBfYmxvYihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJc3RydWN0IGJsb2IgKnJldCA9IGFsbG9jX2Jsb2Jfbm9kZSgpOworCQljcmVhdGVkX29iamVjdChzaGExLCAmcmV0LT5vYmplY3QpOworCQlyZXQtPm9iamVjdC50eXBlID0gT0JKX0JMT0I7CisJCXJldHVybiByZXQ7CisJfQorCWlmICghb2JqLT50eXBlKQorCQlvYmotPnR5cGUgPSBPQkpfQkxPQjsKKwlpZiAob2JqLT50eXBlICE9IE9CSl9CTE9CKSB7CisJCWVycm9yKCJPYmplY3QgJXMgaXMgYSAlcywgbm90IGEgYmxvYiIsCisJCSAgICAgIHNoYTFfdG9faGV4KHNoYTEpLCB0eXBlbmFtZShvYmotPnR5cGUpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAoc3RydWN0IGJsb2IgKikgb2JqOworfQorCitpbnQgcGFyc2VfYmxvYl9idWZmZXIoc3RydWN0IGJsb2IgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfYmxvYihzdHJ1Y3QgYmxvYiAqaXRlbSkKK3sKKyAgICAgICAgY2hhciB0eXBlWzIwXTsKKyAgICAgICAgdm9pZCAqYnVmZmVyOworICAgICAgICB1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldDsKKworICAgICAgICBpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsIHR5cGUsICZzaXplKTsKKyAgICAgICAgaWYgKCFidWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisgICAgICAgIGlmIChzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSBibG9iIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwlyZXQgPSBwYXJzZV9ibG9iX2J1ZmZlcihpdGVtLCBidWZmZXIsIHNpemUpOworCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYmxvYi5oIGIvYmxvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNWQ5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9ibG9iLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBCTE9CX0gKKyNkZWZpbmUgQkxPQl9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmJsb2JfdHlwZTsKKworc3RydWN0IGJsb2IgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworfTsKKworc3RydWN0IGJsb2IgKmxvb2t1cF9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitpbnQgcGFyc2VfYmxvYl9idWZmZXIoc3RydWN0IGJsb2IgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX2Jsb2Ioc3RydWN0IGJsb2IgKml0ZW0pOworCisjZW5kaWYgLyogQkxPQl9IICovCmRpZmYgLS1naXQgYS9idWlsdGluLWFkZC5jIGIvYnVpbHRpbi1hZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I5YzgxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1hZGQuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqICJnaXQgYWRkIiBidWlsdGluIGNvbW1hbmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGludXMgVG9ydmFsZHMKKyAqLworI2luY2x1ZGUgPGZubWF0Y2guaD4KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9hZGRfdXNhZ2VbXSA9CisiZ2l0LWFkZCBbLW5dIFstdl0gPGZpbGVwYXR0ZXJuPi4uLiI7CisKK3N0YXRpYyB2b2lkIHBydW5lX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICoqcGF0aHNwZWMsIGludCBwcmVmaXgpCit7CisJY2hhciAqc2VlbjsKKwlpbnQgaSwgc3BlY3M7CisJc3RydWN0IGRpcl9lbnRyeSAqKnNyYywgKipkc3Q7CisKKwlmb3IgKHNwZWNzID0gMDsgcGF0aHNwZWNbc3BlY3NdOyAgc3BlY3MrKykKKwkJLyogbm90aGluZyAqLzsKKwlzZWVuID0geGNhbGxvYyhzcGVjcywgMSk7CisKKwlzcmMgPSBkc3QgPSBkaXItPmVudHJpZXM7CisJaSA9IGRpci0+bnI7CisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXN0cnVjdCBkaXJfZW50cnkgKmVudHJ5ID0gKnNyYysrOworCQlpZiAoIW1hdGNoX3BhdGhzcGVjKHBhdGhzcGVjLCBlbnRyeS0+bmFtZSwgZW50cnktPmxlbiwgcHJlZml4LCBzZWVuKSkgeworCQkJZnJlZShlbnRyeSk7CisJCQljb250aW51ZTsKKwkJfQorCQkqZHN0KysgPSBlbnRyeTsKKwl9CisJZGlyLT5uciA9IGRzdCAtIGRpci0+ZW50cmllczsKKworCWZvciAoaSA9IDA7IGkgPCBzcGVjczsgaSsrKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQljb25zdCBjaGFyICptYXRjaDsKKwkJaWYgKHNlZW5baV0pCisJCQljb250aW51ZTsKKworCQkvKiBFeGlzdGluZyBmaWxlPyBXZSBtdXN0IGhhdmUgaWdub3JlZCBpdCAqLworCQltYXRjaCA9IHBhdGhzcGVjW2ldOworCQlpZiAoIW1hdGNoWzBdIHx8ICFsc3RhdChtYXRjaCwgJnN0KSkKKwkJCWNvbnRpbnVlOworCQlkaWUoInBhdGhzcGVjICclcycgZGlkIG5vdCBtYXRjaCBhbnkgZmlsZXMiLCBtYXRjaCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqcGF0aCwgKmJhc2U7CisJaW50IGJhc2VsZW47CisKKwkvKiBTZXQgdXAgdGhlIGRlZmF1bHQgZ2l0IHBvcmNlbGFpbiBleGNsdWRlcyAqLworCW1lbXNldChkaXIsIDAsIHNpemVvZigqZGlyKSk7CisJZGlyLT5leGNsdWRlX3Blcl9kaXIgPSAiLmdpdGlnbm9yZSI7CisJcGF0aCA9IGdpdF9wYXRoKCJpbmZvL2V4Y2x1ZGUiKTsKKwlpZiAoIWFjY2VzcyhwYXRoLCBSX09LKSkKKwkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZShkaXIsIHBhdGgpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgY29tbW9uIHByZWZpeCBmb3IgdGhlIHBhdGhzcGVjLCBhbmQKKwkgKiB1c2UgdGhhdCB0byBvcHRpbWl6ZSB0aGUgZGlyZWN0b3J5IHdhbGsKKwkgKi8KKwliYXNlbGVuID0gY29tbW9uX3ByZWZpeChwYXRoc3BlYyk7CisJcGF0aCA9ICIuIjsKKwliYXNlID0gIiI7CisJaWYgKGJhc2VsZW4pIHsKKwkJY2hhciAqY29tbW9uID0geG1hbGxvYyhiYXNlbGVuICsgMSk7CisJCWNvbW1vbiA9IHhtYWxsb2MoYmFzZWxlbiArIDEpOworCQltZW1jcHkoY29tbW9uLCAqcGF0aHNwZWMsIGJhc2VsZW4pOworCQljb21tb25bYmFzZWxlbl0gPSAwOworCQlwYXRoID0gYmFzZSA9IGNvbW1vbjsKKwl9CisKKwkvKiBSZWFkIHRoZSBkaXJlY3RvcnkgYW5kIHBydW5lIGl0ICovCisJcmVhZF9kaXJlY3RvcnkoZGlyLCBwYXRoLCBiYXNlLCBiYXNlbGVuKTsKKwlpZiAocGF0aHNwZWMpCisJCXBydW5lX2RpcmVjdG9yeShkaXIsIHBhdGhzcGVjLCBiYXNlbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitpbnQgY21kX2FkZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQ7CisJaW50IHZlcmJvc2UgPSAwLCBzaG93X29ubHkgPSAwOworCWNvbnN0IGNoYXIgKipwYXRoc3BlYzsKKwlzdHJ1Y3QgZGlyX3N0cnVjdCBkaXI7CisKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwluZXdmZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoJmxvY2tfZmlsZSwgZ2V0X2luZGV4X2ZpbGUoKSwgMSk7CisKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbiIpKSB7CisJCQlzaG93X29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJdmVyYm9zZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZShidWlsdGluX2FkZF91c2FnZSk7CisJfQorCXBhdGhzcGVjID0gZ2V0X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIGkpOworCisJZmlsbF9kaXJlY3RvcnkoJmRpciwgcGF0aHNwZWMpOworCisJaWYgKHNob3dfb25seSkgeworCQljb25zdCBjaGFyICpzZXAgPSAiIiwgKmVvZiA9ICIiOworCQlmb3IgKGkgPSAwOyBpIDwgZGlyLm5yOyBpKyspIHsKKwkJCXByaW50ZigiJXMlcyIsIHNlcCwgZGlyLmVudHJpZXNbaV0tPm5hbWUpOworCQkJc2VwID0gIiAiOworCQkJZW9mID0gIlxuIjsKKwkJfQorCQlmcHV0cyhlb2YsIHN0ZG91dCk7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBkaXIubnI7IGkrKykKKwkJYWRkX2ZpbGVfdG9faW5kZXgoZGlyLmVudHJpZXNbaV0tPm5hbWUsIHZlcmJvc2UpOworCisJaWYgKGFjdGl2ZV9jYWNoZV9jaGFuZ2VkKSB7CisJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCSAgICBjbG9zZShuZXdmZCkgfHwgY29tbWl0X2xvY2tfZmlsZSgmbG9ja19maWxlKSkKKwkJCWRpZSgiVW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWFwcGx5LmMgYi9idWlsdGluLWFwcGx5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmNDc3YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tYXBwbHkuYwpAQCAtMCwwICsxLDI0MzMgQEAKKy8qCisgKiBhcHBseS5jCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICoKKyAqIFRoaXMgYXBwbGllcyBwYXRjaGVzIG9uIHRvcCBvZiBzb21lIChhcmJpdHJhcnkpIHZlcnNpb24gb2YgdGhlIFNDTS4KKyAqCisgKi8KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8qCisgKiAgLS1jaGVjayB0dXJucyBvbiBjaGVja2luZyB0aGF0IHRoZSB3b3JraW5nIHRyZWUgbWF0Y2hlcyB0aGUKKyAqICAgIGZpbGVzIHRoYXQgYXJlIGJlaW5nIG1vZGlmaWVkLCBidXQgZG9lc24ndCBhcHBseSB0aGUgcGF0Y2gKKyAqICAtLXN0YXQgZG9lcyBqdXN0IGEgZGlmZnN0YXQsIGFuZCBkb2Vzbid0IGFjdHVhbGx5IGFwcGx5CisgKiAgLS1udW1zdGF0IGRvZXMgbnVtZXJpYyBkaWZmc3RhdCwgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgYXBwbHkKKyAqICAtLWluZGV4LWluZm8gc2hvd3MgdGhlIG9sZCBhbmQgbmV3IGluZGV4IGluZm8gZm9yIHBhdGhzIGlmIGF2YWlsYWJsZS4KKyAqICAtLWluZGV4IHVwZGF0ZXMgdGhlIGNhY2hlIGFzIHdlbGwuCisgKiAgLS1jYWNoZWQgdXBkYXRlcyBvbmx5IHRoZSBjYWNoZSB3aXRob3V0IGV2ZXIgdG91Y2hpbmcgdGhlIHdvcmtpbmcgdHJlZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeDsKK3N0YXRpYyBpbnQgcHJlZml4X2xlbmd0aCA9IC0xOworc3RhdGljIGludCBuZXdmZCA9IC0xOworCitzdGF0aWMgaW50IHBfdmFsdWUgPSAxOworc3RhdGljIGludCBhbGxvd19iaW5hcnlfcmVwbGFjZW1lbnQgPSAwOworc3RhdGljIGludCBjaGVja19pbmRleCA9IDA7CitzdGF0aWMgaW50IHdyaXRlX2luZGV4ID0gMDsKK3N0YXRpYyBpbnQgY2FjaGVkID0gMDsKK3N0YXRpYyBpbnQgZGlmZnN0YXQgPSAwOworc3RhdGljIGludCBudW1zdGF0ID0gMDsKK3N0YXRpYyBpbnQgc3VtbWFyeSA9IDA7CitzdGF0aWMgaW50IGNoZWNrID0gMDsKK3N0YXRpYyBpbnQgYXBwbHkgPSAxOworc3RhdGljIGludCBub19hZGQgPSAwOworc3RhdGljIGludCBzaG93X2luZGV4X2luZm8gPSAwOworc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBfY29udGV4dCA9IC0xOworc3RhdGljIGNvbnN0IGNoYXIgYXBwbHlfdXNhZ2VbXSA9CisiZ2l0LWFwcGx5IFstLXN0YXRdIFstLW51bXN0YXRdIFstLXN1bW1hcnldIFstLWNoZWNrXSBbLS1pbmRleF0gWy0tY2FjaGVkXSBbLS1hcHBseV0gWy0tbm8tYWRkXSBbLS1pbmRleC1pbmZvXSBbLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnRdIFstel0gWy1wTlVNXSBbLUNOVU1dIFstLXdoaXRlc3BhY2U9PG5vd2Fybnx3YXJufGVycm9yfGVycm9yLWFsbHxzdHJpcD5dIDxwYXRjaD4uLi4iOworCitzdGF0aWMgZW51bSB3aGl0ZXNwYWNlX2VvbCB7CisJbm93YXJuX3doaXRlc3BhY2UsCisJd2Fybl9vbl93aGl0ZXNwYWNlLAorCWVycm9yX29uX3doaXRlc3BhY2UsCisJc3RyaXBfd2hpdGVzcGFjZSwKK30gbmV3X3doaXRlc3BhY2UgPSB3YXJuX29uX3doaXRlc3BhY2U7CitzdGF0aWMgaW50IHdoaXRlc3BhY2VfZXJyb3IgPSAwOworc3RhdGljIGludCBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzID0gNTsKK3N0YXRpYyBpbnQgYXBwbGllZF9hZnRlcl9zdHJpcHBpbmcgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKnBhdGNoX2lucHV0X2ZpbGUgPSBOVUxMOworCitzdGF0aWMgdm9pZCBwYXJzZV93aGl0ZXNwYWNlX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24pCit7CisJaWYgKCFvcHRpb24pIHsKKwkJbmV3X3doaXRlc3BhY2UgPSB3YXJuX29uX3doaXRlc3BhY2U7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAid2FybiIpKSB7CisJCW5ld193aGl0ZXNwYWNlID0gd2Fybl9vbl93aGl0ZXNwYWNlOworCQlyZXR1cm47CisJfQorCWlmICghc3RyY21wKG9wdGlvbiwgIm5vd2FybiIpKSB7CisJCW5ld193aGl0ZXNwYWNlID0gbm93YXJuX3doaXRlc3BhY2U7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAiZXJyb3IiKSkgeworCQluZXdfd2hpdGVzcGFjZSA9IGVycm9yX29uX3doaXRlc3BhY2U7CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAob3B0aW9uLCAiZXJyb3ItYWxsIikpIHsKKwkJbmV3X3doaXRlc3BhY2UgPSBlcnJvcl9vbl93aGl0ZXNwYWNlOworCQlzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzID0gMDsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXN0cmNtcChvcHRpb24sICJzdHJpcCIpKSB7CisJCW5ld193aGl0ZXNwYWNlID0gc3RyaXBfd2hpdGVzcGFjZTsKKwkJcmV0dXJuOworCX0KKwlkaWUoInVucmVjb2duaXplZCB3aGl0ZXNwYWNlIG9wdGlvbiAnJXMnIiwgb3B0aW9uKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfd2hpdGVzcGFjZV9tb2RlKGNvbnN0IGNoYXIgKndoaXRlc3BhY2Vfb3B0aW9uKQoreworCWlmICghd2hpdGVzcGFjZV9vcHRpb24gJiYgIWFwcGx5X2RlZmF1bHRfd2hpdGVzcGFjZSkgeworCQluZXdfd2hpdGVzcGFjZSA9IChhcHBseQorCQkJCSAgPyB3YXJuX29uX3doaXRlc3BhY2UKKwkJCQkgIDogbm93YXJuX3doaXRlc3BhY2UpOworCX0KK30KKworLyoKKyAqIEZvciAiZGlmZi1zdGF0IiBsaWtlIGJlaGF2aW91ciwgd2Uga2VlcCB0cmFjayBvZiB0aGUgYmlnZ2VzdCBjaGFuZ2UKKyAqIHdlJ3ZlIHNlZW4sIGFuZCB0aGUgbG9uZ2VzdCBmaWxlbmFtZS4gVGhhdCBhbGxvd3MgdXMgdG8gZG8gc2ltcGxlCisgKiBzY2FsaW5nLgorICovCitzdGF0aWMgaW50IG1heF9jaGFuZ2UsIG1heF9sZW47CisKKy8qCisgKiBWYXJpb3VzICJjdXJyZW50IHN0YXRlIiwgbm90YWJseSBsaW5lIG51bWJlcnMgYW5kIHdoYXQKKyAqIGZpbGUgKGFuZCBob3cpIHdlJ3JlIHBhdGNoaW5nIHJpZ2h0IG5vdy4uIFRoZSAiaXNfeHh4eCIKKyAqIHRoaW5ncyBhcmUgZmxhZ3MsIHdoZXJlIC0xIG1lYW5zICJkb24ndCBrbm93IHlldCIuCisgKi8KK3N0YXRpYyBpbnQgbGluZW5yID0gMTsKKworc3RydWN0IGZyYWdtZW50IHsKKwl1bnNpZ25lZCBsb25nIGxlYWRpbmcsIHRyYWlsaW5nOworCXVuc2lnbmVkIGxvbmcgb2xkcG9zLCBvbGRsaW5lczsKKwl1bnNpZ25lZCBsb25nIG5ld3BvcywgbmV3bGluZXM7CisJY29uc3QgY2hhciAqcGF0Y2g7CisJaW50IHNpemU7CisJc3RydWN0IGZyYWdtZW50ICpuZXh0OworfTsKKworc3RydWN0IHBhdGNoIHsKKwljaGFyICpuZXdfbmFtZSwgKm9sZF9uYW1lLCAqZGVmX25hbWU7CisJdW5zaWduZWQgaW50IG9sZF9tb2RlLCBuZXdfbW9kZTsKKwlpbnQgaXNfcmVuYW1lLCBpc19jb3B5LCBpc19uZXcsIGlzX2RlbGV0ZSwgaXNfYmluYXJ5LCBpc19yZXZlcnNlOworI2RlZmluZSBCSU5BUllfREVMVEFfREVGTEFURUQgMQorI2RlZmluZSBCSU5BUllfTElURVJBTF9ERUZMQVRFRCAyCisJdW5zaWduZWQgbG9uZyBkZWZsYXRlX29yaWdsZW47CisJaW50IGxpbmVzX2FkZGVkLCBsaW5lc19kZWxldGVkOworCWludCBzY29yZTsKKwlpbnQgaW5hY2N1cmF0ZV9lb2Y6MTsKKwlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50czsKKwljaGFyICpyZXN1bHQ7CisJdW5zaWduZWQgbG9uZyByZXN1bHRzaXplOworCWNoYXIgb2xkX3NoYTFfcHJlZml4WzQxXTsKKwljaGFyIG5ld19zaGExX3ByZWZpeFs0MV07CisJc3RydWN0IHBhdGNoICpuZXh0OworfTsKKworI2RlZmluZSBDSFVOS1NJWkUgKDgxOTIpCisjZGVmaW5lIFNMT1AgKDE2KQorCitzdGF0aWMgdm9pZCAqcmVhZF9wYXRjaF9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMCwgYWxsb2MgPSBDSFVOS1NJWkU7CisJdm9pZCAqYnVmZmVyID0geG1hbGxvYyhhbGxvYyk7CisKKwlmb3IgKDs7KSB7CisJCWludCBuciA9IGFsbG9jIC0gc2l6ZTsKKwkJaWYgKG5yIDwgMTAyNCkgeworCQkJYWxsb2MgKz0gQ0hVTktTSVpFOworCQkJYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCBhbGxvYyk7CisJCQluciA9IGFsbG9jIC0gc2l6ZTsKKwkJfQorCQluciA9IHhyZWFkKGZkLCAoY2hhciAqKSBidWZmZXIgKyBzaXplLCBucik7CisJCWlmICghbnIpCisJCQlicmVhazsKKwkJaWYgKG5yIDwgMCkKKwkJCWRpZSgiZ2l0LWFwcGx5OiByZWFkIHJldHVybmVkICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJc2l6ZSArPSBucjsKKwl9CisJKnNpemVwID0gc2l6ZTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBzb21lIHNsb3AgaW4gdGhlIGJ1ZmZlcgorCSAqIHNvIHRoYXQgd2UgY2FuIGRvIHNwZWN1bGF0aXZlICJtZW1jbXAiIGV0YywgYW5kCisJICogc2VlIHRvIGl0IHRoYXQgaXQgaXMgTlVMLWZpbGxlZC4KKwkgKi8KKwlpZiAoYWxsb2MgPCBzaXplICsgU0xPUCkKKwkJYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCBzaXplICsgU0xPUCk7CisJbWVtc2V0KChjaGFyICopIGJ1ZmZlciArIHNpemUsIDAsIFNMT1ApOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxpbmVsZW4oY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCXdoaWxlIChzaXplLS0pIHsKKwkJbGVuKys7CisJCWlmICgqYnVmZmVyKysgPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGlzX2Rldl9udWxsKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gIW1lbWNtcCgiL2Rldi9udWxsIiwgc3RyLCA5KSAmJiBpc3NwYWNlKHN0cls5XSk7Cit9CisKKyNkZWZpbmUgVEVSTV9TUEFDRQkxCisjZGVmaW5lIFRFUk1fVEFCCTIKKworc3RhdGljIGludCBuYW1lX3Rlcm1pbmF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGMsIGludCB0ZXJtaW5hdGUpCit7CisJaWYgKGMgPT0gJyAnICYmICEodGVybWluYXRlICYgVEVSTV9TUEFDRSkpCisJCXJldHVybiAwOworCWlmIChjID09ICdcdCcgJiYgISh0ZXJtaW5hdGUgJiBURVJNX1RBQikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjaGFyICogZmluZF9uYW1lKGNvbnN0IGNoYXIgKmxpbmUsIGNoYXIgKmRlZiwgaW50IHBfdmFsdWUsIGludCB0ZXJtaW5hdGUpCit7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpzdGFydCA9IGxpbmU7CisJY2hhciAqbmFtZTsKKworCWlmICgqbGluZSA9PSAnIicpIHsKKwkJLyogUHJvcG9zZWQgIm5ldy1zdHlsZSIgR05VIHBhdGNoL2RpZmYgZm9ybWF0OyBzZWUKKwkJICogaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTI5MjczMTY0MDg2OTAmdz0yCisJCSAqLworCQluYW1lID0gdW5xdW90ZV9jX3N0eWxlKGxpbmUsIE5VTEwpOworCQlpZiAobmFtZSkgeworCQkJY2hhciAqY3AgPSBuYW1lOworCQkJd2hpbGUgKHBfdmFsdWUpIHsKKwkJCQljcCA9IHN0cmNocihuYW1lLCAnLycpOworCQkJCWlmICghY3ApCisJCQkJCWJyZWFrOworCQkJCWNwKys7CisJCQkJcF92YWx1ZS0tOworCQkJfQorCQkJaWYgKGNwKSB7CisJCQkJLyogbmFtZSBjYW4gbGF0ZXIgYmUgZnJlZWQsIHNvIHdlIG5lZWQKKwkJCQkgKiB0byBtZW1tb3ZlLCBub3QganVzdCByZXR1cm4gY3AKKwkJCQkgKi8KKwkJCQltZW1tb3ZlKG5hbWUsIGNwLCBzdHJsZW4oY3ApICsgMSk7CisJCQkJZnJlZShkZWYpOworCQkJCXJldHVybiBuYW1lOworCQkJfQorCQkJZWxzZSB7CisJCQkJZnJlZShuYW1lKTsKKwkJCQluYW1lID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKmxpbmU7CisKKwkJaWYgKGlzc3BhY2UoYykpIHsKKwkJCWlmIChjID09ICdcbicpCisJCQkJYnJlYWs7CisJCQlpZiAobmFtZV90ZXJtaW5hdGUoc3RhcnQsIGxpbmUtc3RhcnQsIGMsIHRlcm1pbmF0ZSkpCisJCQkJYnJlYWs7CisJCX0KKwkJbGluZSsrOworCQlpZiAoYyA9PSAnLycgJiYgIS0tcF92YWx1ZSkKKwkJCXN0YXJ0ID0gbGluZTsKKwl9CisJaWYgKCFzdGFydCkKKwkJcmV0dXJuIGRlZjsKKwlsZW4gPSBsaW5lIC0gc3RhcnQ7CisJaWYgKCFsZW4pCisJCXJldHVybiBkZWY7CisKKwkvKgorCSAqIEdlbmVyYWxseSB3ZSBwcmVmZXIgdGhlIHNob3J0ZXIgbmFtZSwgZXNwZWNpYWxseQorCSAqIGlmIHRoZSBvdGhlciBvbmUgaXMganVzdCBhIHZhcmlhdGlvbiBvZiB0aGF0IHdpdGgKKwkgKiBzb21ldGhpbmcgZWxzZSB0YWNrZWQgb24gdG8gdGhlIGVuZCAoaWUgImZpbGUub3JpZyIKKwkgKiBvciAiZmlsZX4iKS4KKwkgKi8KKwlpZiAoZGVmKSB7CisJCWludCBkZWZsZW4gPSBzdHJsZW4oZGVmKTsKKwkJaWYgKGRlZmxlbiA8IGxlbiAmJiAhc3RybmNtcChzdGFydCwgZGVmLCBkZWZsZW4pKQorCQkJcmV0dXJuIGRlZjsKKwl9CisKKwluYW1lID0geG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkobmFtZSwgc3RhcnQsIGxlbik7CisJbmFtZVtsZW5dID0gMDsKKwlmcmVlKGRlZik7CisJcmV0dXJuIG5hbWU7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5hbWUgZXRjIGluZm8gZnJvbSB0aGUgLS0vKysrIGxpbmVzIG9mIGEgdHJhZGl0aW9uYWwgcGF0Y2ggaGVhZGVyCisgKgorICogTk9URSEgVGhpcyBoYXJkY29kZXMgIi1wMSIgYmVoYXZpb3VyIGluIGZpbGVuYW1lIGRldGVjdGlvbi4KKyAqCisgKiBGSVhNRSEgVGhlIGVuZC1vZi1maWxlbmFtZSBoZXVyaXN0aWNzIGFyZSBraW5kIG9mIHNjcmV3eS4gRm9yIGV4aXN0aW5nCisgKiBmaWxlcywgd2UgY2FuIGhhcHBpbHkgY2hlY2sgdGhlIGluZGV4IGZvciBhIG1hdGNoLCBidXQgZm9yIGNyZWF0aW5nIGEKKyAqIG5ldyBmaWxlIHdlIHNob3VsZCB0cnkgdG8gbWF0Y2ggd2hhdGV2ZXIgInBhdGNoIiBkb2VzLiBJIGhhdmUgbm8gaWRlYS4KKyAqLworc3RhdGljIHZvaWQgcGFyc2VfdHJhZGl0aW9uYWxfcGF0Y2goY29uc3QgY2hhciAqZmlyc3QsIGNvbnN0IGNoYXIgKnNlY29uZCwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwljaGFyICpuYW1lOworCisJZmlyc3QgKz0gNDsJLyogc2tpcCAiLS0tICIgKi8KKwlzZWNvbmQgKz0gNDsJLyogc2tpcCAiKysrICIgKi8KKwlpZiAoaXNfZGV2X251bGwoZmlyc3QpKSB7CisJCXBhdGNoLT5pc19uZXcgPSAxOworCQlwYXRjaC0+aXNfZGVsZXRlID0gMDsKKwkJbmFtZSA9IGZpbmRfbmFtZShzZWNvbmQsIE5VTEwsIHBfdmFsdWUsIFRFUk1fU1BBQ0UgfCBURVJNX1RBQik7CisJCXBhdGNoLT5uZXdfbmFtZSA9IG5hbWU7CisJfSBlbHNlIGlmIChpc19kZXZfbnVsbChzZWNvbmQpKSB7CisJCXBhdGNoLT5pc19uZXcgPSAwOworCQlwYXRjaC0+aXNfZGVsZXRlID0gMTsKKwkJbmFtZSA9IGZpbmRfbmFtZShmaXJzdCwgTlVMTCwgcF92YWx1ZSwgVEVSTV9TUEFDRSB8IFRFUk1fVEFCKTsKKwkJcGF0Y2gtPm9sZF9uYW1lID0gbmFtZTsKKwl9IGVsc2UgeworCQluYW1lID0gZmluZF9uYW1lKGZpcnN0LCBOVUxMLCBwX3ZhbHVlLCBURVJNX1NQQUNFIHwgVEVSTV9UQUIpOworCQluYW1lID0gZmluZF9uYW1lKHNlY29uZCwgbmFtZSwgcF92YWx1ZSwgVEVSTV9TUEFDRSB8IFRFUk1fVEFCKTsKKwkJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPm5ld19uYW1lID0gbmFtZTsKKwl9CisJaWYgKCFuYW1lKQorCQlkaWUoInVuYWJsZSB0byBmaW5kIGZpbGVuYW1lIGluIHBhdGNoIGF0IGxpbmUgJWQiLCBsaW5lbnIpOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfaGRyZW5kKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcmV0dXJuIC0xOworfQorCisvKgorICogV2UncmUgYW5hbCBhYm91dCBkaWZmIGhlYWRlciBjb25zaXN0ZW5jeSwgdG8gbWFrZQorICogc3VyZSB0aGF0IHdlIGRvbid0IGVuZCB1cCBoYXZpbmcgc3RyYW5nZSBhbWJpZ3VvdXMKKyAqIHBhdGNoZXMgZmxvYXRpbmcgYXJvdW5kLgorICoKKyAqIEFzIGEgcmVzdWx0LCBnaXRkaWZmX3tvbGR8bmV3fW5hbWUoKSB3aWxsIGNoZWNrCisgKiB0aGVpciBuYW1lcyBhZ2FpbnN0IGFueSBwcmV2aW91cyBpbmZvcm1hdGlvbiwganVzdAorICogdG8gbWFrZSBzdXJlLi4KKyAqLworc3RhdGljIGNoYXIgKmdpdGRpZmZfdmVyaWZ5X25hbWUoY29uc3QgY2hhciAqbGluZSwgaW50IGlzbnVsbCwgY2hhciAqb3JpZ19uYW1lLCBjb25zdCBjaGFyICpvbGRuZXcpCit7CisJaWYgKCFvcmlnX25hbWUgJiYgIWlzbnVsbCkKKwkJcmV0dXJuIGZpbmRfbmFtZShsaW5lLCBOVUxMLCAxLCAwKTsKKworCWlmIChvcmlnX25hbWUpIHsKKwkJaW50IGxlbjsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJY2hhciAqYW5vdGhlcjsKKwkJbmFtZSA9IG9yaWdfbmFtZTsKKwkJbGVuID0gc3RybGVuKG5hbWUpOworCQlpZiAoaXNudWxsKQorCQkJZGllKCJnaXQtYXBwbHk6IGJhZCBnaXQtZGlmZiAtIGV4cGVjdGVkIC9kZXYvbnVsbCwgZ290ICVzIG9uIGxpbmUgJWQiLCBuYW1lLCBsaW5lbnIpOworCQlhbm90aGVyID0gZmluZF9uYW1lKGxpbmUsIE5VTEwsIDEsIDApOworCQlpZiAoIWFub3RoZXIgfHwgbWVtY21wKGFub3RoZXIsIG5hbWUsIGxlbikpCisJCQlkaWUoImdpdC1hcHBseTogYmFkIGdpdC1kaWZmIC0gaW5jb25zaXN0ZW50ICVzIGZpbGVuYW1lIG9uIGxpbmUgJWQiLCBvbGRuZXcsIGxpbmVucik7CisJCWZyZWUoYW5vdGhlcik7CisJCXJldHVybiBvcmlnX25hbWU7CisJfQorCWVsc2UgeworCQkvKiBleHBlY3QgIi9kZXYvbnVsbCIgKi8KKwkJaWYgKG1lbWNtcCgiL2Rldi9udWxsIiwgbGluZSwgOSkgfHwgbGluZVs5XSAhPSAnXG4nKQorCQkJZGllKCJnaXQtYXBwbHk6IGJhZCBnaXQtZGlmZiAtIGV4cGVjdGVkIC9kZXYvbnVsbCBvbiBsaW5lICVkIiwgbGluZW5yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGdpdGRpZmZfb2xkbmFtZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5vbGRfbmFtZSA9IGdpdGRpZmZfdmVyaWZ5X25hbWUobGluZSwgcGF0Y2gtPmlzX25ldywgcGF0Y2gtPm9sZF9uYW1lLCAib2xkIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9uZXduYW1lKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPm5ld19uYW1lID0gZ2l0ZGlmZl92ZXJpZnlfbmFtZShsaW5lLCBwYXRjaC0+aXNfZGVsZXRlLCBwYXRjaC0+bmV3X25hbWUsICJuZXciKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX29sZG1vZGUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+b2xkX21vZGUgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfbmV3bW9kZShjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5uZXdfbW9kZSA9IHN0cnRvdWwobGluZSwgTlVMTCwgOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9kZWxldGUoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlwYXRjaC0+aXNfZGVsZXRlID0gMTsKKwlwYXRjaC0+b2xkX25hbWUgPSBwYXRjaC0+ZGVmX25hbWU7CisJcmV0dXJuIGdpdGRpZmZfb2xkbW9kZShsaW5lLCBwYXRjaCk7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9uZXdmaWxlKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX25ldyA9IDE7CisJcGF0Y2gtPm5ld19uYW1lID0gcGF0Y2gtPmRlZl9uYW1lOworCXJldHVybiBnaXRkaWZmX25ld21vZGUobGluZSwgcGF0Y2gpOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfY29weXNyYyhjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19jb3B5ID0gMTsKKwlwYXRjaC0+b2xkX25hbWUgPSBmaW5kX25hbWUobGluZSwgTlVMTCwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9jb3B5ZHN0KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcGF0Y2gtPmlzX2NvcHkgPSAxOworCXBhdGNoLT5uZXdfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX3JlbmFtZXNyYyhjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19yZW5hbWUgPSAxOworCXBhdGNoLT5vbGRfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX3JlbmFtZWRzdChjb25zdCBjaGFyICpsaW5lLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXBhdGNoLT5pc19yZW5hbWUgPSAxOworCXBhdGNoLT5uZXdfbmFtZSA9IGZpbmRfbmFtZShsaW5lLCBOVUxMLCAwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaXRkaWZmX3NpbWlsYXJpdHkoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpZiAoKHBhdGNoLT5zY29yZSA9IHN0cnRvdWwobGluZSwgTlVMTCwgMTApKSA9PSBVTE9OR19NQVgpCisJCXBhdGNoLT5zY29yZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2l0ZGlmZl9kaXNzaW1pbGFyaXR5KGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaWYgKChwYXRjaC0+c2NvcmUgPSBzdHJ0b3VsKGxpbmUsIE5VTEwsIDEwKSkgPT0gVUxPTkdfTUFYKQorCQlwYXRjaC0+c2NvcmUgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdGRpZmZfaW5kZXgoY29uc3QgY2hhciAqbGluZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwkvKiBpbmRleCBsaW5lIGlzIE4gaGV4YWRlY2ltYWwsICIuLiIsIE4gaGV4YWRlY2ltYWwsCisJICogYW5kIG9wdGlvbmFsIHNwYWNlIHdpdGggb2N0YWwgbW9kZS4KKwkgKi8KKwljb25zdCBjaGFyICpwdHIsICplb2w7CisJaW50IGxlbjsKKworCXB0ciA9IHN0cmNocihsaW5lLCAnLicpOworCWlmICghcHRyIHx8IHB0clsxXSAhPSAnLicgfHwgNDAgPCBwdHIgLSBsaW5lKQorCQlyZXR1cm4gMDsKKwlsZW4gPSBwdHIgLSBsaW5lOworCW1lbWNweShwYXRjaC0+b2xkX3NoYTFfcHJlZml4LCBsaW5lLCBsZW4pOworCXBhdGNoLT5vbGRfc2hhMV9wcmVmaXhbbGVuXSA9IDA7CisKKwlsaW5lID0gcHRyICsgMjsKKwlwdHIgPSBzdHJjaHIobGluZSwgJyAnKTsKKwllb2wgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisKKwlpZiAoIXB0ciB8fCBlb2wgPCBwdHIpCisJCXB0ciA9IGVvbDsKKwlsZW4gPSBwdHIgLSBsaW5lOworCisJaWYgKDQwIDwgbGVuKQorCQlyZXR1cm4gMDsKKwltZW1jcHkocGF0Y2gtPm5ld19zaGExX3ByZWZpeCwgbGluZSwgbGVuKTsKKwlwYXRjaC0+bmV3X3NoYTFfcHJlZml4W2xlbl0gPSAwOworCWlmICgqcHRyID09ICcgJykKKwkJcGF0Y2gtPm5ld19tb2RlID0gcGF0Y2gtPm9sZF9tb2RlID0gc3RydG91bChwdHIrMSwgTlVMTCwgOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIGlzIG5vcm1hbCBmb3IgYSBkaWZmIHRoYXQgZG9lc24ndCBjaGFuZ2UgYW55dGhpbmc6IHdlJ2xsIGZhbGwgdGhyb3VnaAorICogaW50byB0aGUgbmV4dCBkaWZmLiBUZWxsIHRoZSBwYXJzZXIgdG8gYnJlYWsgb3V0LgorICovCitzdGF0aWMgaW50IGdpdGRpZmZfdW5yZWNvZ25pemVkKGNvbnN0IGNoYXIgKmxpbmUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3RvcF9hdF9zbGFzaChjb25zdCBjaGFyICpsaW5lLCBpbnQgbGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsbGVuOyBpKyspIHsKKwkJaW50IGNoID0gbGluZVtpXTsKKwkJaWYgKGNoID09ICcvJykKKwkJCXJldHVybiBsaW5lICsgaTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRoaXMgaXMgdG8gZXh0cmFjdCB0aGUgc2FtZSBuYW1lIHRoYXQgYXBwZWFycyBvbiAiZGlmZiAtLWdpdCIKKyAqIGxpbmUuICBXZSBkbyBub3QgZmluZCBhbmQgcmV0dXJuIGFueXRoaW5nIGlmIGl0IGlzIGEgcmVuYW1lCisgKiBwYXRjaCwgYW5kIGl0IGlzIE9LIGJlY2F1c2Ugd2Ugd2lsbCBmaW5kIHRoZSBuYW1lIGVsc2V3aGVyZS4KKyAqIFdlIG5lZWQgdG8gcmVsaWFibHkgZmluZCBuYW1lIG9ubHkgd2hlbiBpdCBpcyBtb2RlLWNoYW5nZSBvbmx5LAorICogY3JlYXRpb24gb3IgZGVsZXRpb24gb2YgYW4gZW1wdHkgZmlsZS4gIEluIGFueSBvZiB0aGVzZSBjYXNlcywKKyAqIGJvdGggc2lkZXMgYXJlIHRoZSBzYW1lIG5hbWUgdW5kZXIgYS8gYW5kIGIvIHJlc3BlY3RpdmVseS4KKyAqLworc3RhdGljIGNoYXIgKmdpdF9oZWFkZXJfbmFtZShjaGFyICpsaW5lLCBpbnQgbGxlbikKK3sKKwlpbnQgbGVuOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqc2Vjb25kID0gTlVMTDsKKworCWxpbmUgKz0gc3RybGVuKCJkaWZmIC0tZ2l0ICIpOworCWxsZW4gLT0gc3RybGVuKCJkaWZmIC0tZ2l0ICIpOworCisJaWYgKCpsaW5lID09ICciJykgeworCQljb25zdCBjaGFyICpjcDsKKwkJY2hhciAqZmlyc3QgPSB1bnF1b3RlX2Nfc3R5bGUobGluZSwgJnNlY29uZCk7CisJCWlmICghZmlyc3QpCisJCQlyZXR1cm4gTlVMTDsKKworCQkvKiBhZHZhbmNlIHRvIHRoZSBmaXJzdCBzbGFzaCAqLworCQljcCA9IHN0b3BfYXRfc2xhc2goZmlyc3QsIHN0cmxlbihmaXJzdCkpOworCQlpZiAoIWNwIHx8IGNwID09IGZpcnN0KSB7CisJCQkvKiB3ZSBkbyBub3QgYWNjZXB0IGFic29sdXRlIHBhdGhzICovCisJCWZyZWVfZmlyc3RfYW5kX2ZhaWw6CisJCQlmcmVlKGZpcnN0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWxlbiA9IHN0cmxlbihjcCsxKTsKKwkJbWVtbW92ZShmaXJzdCwgY3ArMSwgbGVuKzEpOyAvKiBpbmNsdWRpbmcgTlVMICovCisKKwkJLyogc2Vjb25kIHBvaW50cyBhdCBvbmUgcGFzdCBjbG9zaW5nIGRxIG9mIG5hbWUuCisJCSAqIGZpbmQgdGhlIHNlY29uZCBuYW1lLgorCQkgKi8KKwkJd2hpbGUgKChzZWNvbmQgPCBsaW5lICsgbGxlbikgJiYgaXNzcGFjZSgqc2Vjb25kKSkKKwkJCXNlY29uZCsrOworCisJCWlmIChsaW5lICsgbGxlbiA8PSBzZWNvbmQpCisJCQlnb3RvIGZyZWVfZmlyc3RfYW5kX2ZhaWw7CisJCWlmICgqc2Vjb25kID09ICciJykgeworCQkJY2hhciAqc3AgPSB1bnF1b3RlX2Nfc3R5bGUoc2Vjb25kLCBOVUxMKTsKKwkJCWlmICghc3ApCisJCQkJZ290byBmcmVlX2ZpcnN0X2FuZF9mYWlsOworCQkJY3AgPSBzdG9wX2F0X3NsYXNoKHNwLCBzdHJsZW4oc3ApKTsKKwkJCWlmICghY3AgfHwgY3AgPT0gc3ApIHsKKwkJCWZyZWVfYm90aF9hbmRfZmFpbDoKKwkJCQlmcmVlKHNwKTsKKwkJCQlnb3RvIGZyZWVfZmlyc3RfYW5kX2ZhaWw7CisJCQl9CisJCQkvKiBUaGV5IG11c3QgbWF0Y2gsIG90aGVyd2lzZSBpZ25vcmUgKi8KKwkJCWlmIChzdHJjbXAoY3ArMSwgZmlyc3QpKQorCQkJCWdvdG8gZnJlZV9ib3RoX2FuZF9mYWlsOworCQkJZnJlZShzcCk7CisJCQlyZXR1cm4gZmlyc3Q7CisJCX0KKworCQkvKiB1bnF1b3RlZCBzZWNvbmQgKi8KKwkJY3AgPSBzdG9wX2F0X3NsYXNoKHNlY29uZCwgbGluZSArIGxsZW4gLSBzZWNvbmQpOworCQlpZiAoIWNwIHx8IGNwID09IHNlY29uZCkKKwkJCWdvdG8gZnJlZV9maXJzdF9hbmRfZmFpbDsKKwkJY3ArKzsKKwkJaWYgKGxpbmUgKyBsbGVuIC0gY3AgIT0gbGVuICsgMSB8fAorCQkgICAgbWVtY21wKGZpcnN0LCBjcCwgbGVuKSkKKwkJCWdvdG8gZnJlZV9maXJzdF9hbmRfZmFpbDsKKwkJcmV0dXJuIGZpcnN0OworCX0KKworCS8qIHVucXVvdGVkIGZpcnN0IG5hbWUgKi8KKwluYW1lID0gc3RvcF9hdF9zbGFzaChsaW5lLCBsbGVuKTsKKwlpZiAoIW5hbWUgfHwgbmFtZSA9PSBsaW5lKQorCQlyZXR1cm4gTlVMTDsKKworCW5hbWUrKzsKKworCS8qIHNpbmNlIHRoZSBmaXJzdCBuYW1lIGlzIHVucXVvdGVkLCBhIGRxIGlmIGV4aXN0cyBtdXN0IGJlCisJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgc2Vjb25kIG5hbWUuCisJICovCisJZm9yIChzZWNvbmQgPSBuYW1lOyBzZWNvbmQgPCBsaW5lICsgbGxlbjsgc2Vjb25kKyspIHsKKwkJaWYgKCpzZWNvbmQgPT0gJyInKSB7CisJCQljb25zdCBjaGFyICpjcCA9IHNlY29uZDsKKwkJCWNvbnN0IGNoYXIgKm5wOworCQkJY2hhciAqc3AgPSB1bnF1b3RlX2Nfc3R5bGUoc2Vjb25kLCBOVUxMKTsKKworCQkJaWYgKCFzcCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW5wID0gc3RvcF9hdF9zbGFzaChzcCwgc3RybGVuKHNwKSk7CisJCQlpZiAoIW5wIHx8IG5wID09IHNwKSB7CisJCQlmcmVlX3NlY29uZF9hbmRfZmFpbDoKKwkJCQlmcmVlKHNwKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW5wKys7CisJCQlsZW4gPSBzdHJsZW4obnApOworCQkJaWYgKGxlbiA8IGNwIC0gbmFtZSAmJgorCQkJICAgICFzdHJuY21wKG5wLCBuYW1lLCBsZW4pICYmCisJCQkgICAgaXNzcGFjZShuYW1lW2xlbl0pKSB7CisJCQkJLyogR29vZCAqLworCQkJCW1lbW1vdmUoc3AsIG5wLCBsZW4gKyAxKTsKKwkJCQlyZXR1cm4gc3A7CisJCQl9CisJCQlnb3RvIGZyZWVfc2Vjb25kX2FuZF9mYWlsOworCQl9CisJfQorCisJLyoKKwkgKiBBY2NlcHQgYSBuYW1lIG9ubHkgaWYgaXQgc2hvd3MgdXAgdHdpY2UsIGV4YWN0bHkgdGhlIHNhbWUKKwkgKiBmb3JtLgorCSAqLworCWZvciAobGVuID0gMCA7IDsgbGVuKyspIHsKKwkJY2hhciBjID0gbmFtZVtsZW5dOworCisJCXN3aXRjaCAoYykgeworCQlkZWZhdWx0OgorCQkJY29udGludWU7CisJCWNhc2UgJ1xuJzoKKwkJCXJldHVybiBOVUxMOworCQljYXNlICdcdCc6IGNhc2UgJyAnOgorCQkJc2Vjb25kID0gbmFtZStsZW47CisJCQlmb3IgKDs7KSB7CisJCQkJY2hhciBjID0gKnNlY29uZCsrOworCQkJCWlmIChjID09ICdcbicpCisJCQkJCXJldHVybiBOVUxMOworCQkJCWlmIChjID09ICcvJykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2Vjb25kW2xlbl0gPT0gJ1xuJyAmJiAhbWVtY21wKG5hbWUsIHNlY29uZCwgbGVuKSkgeworCQkJCWNoYXIgKnJldCA9IHhtYWxsb2MobGVuICsgMSk7CisJCQkJbWVtY3B5KHJldCwgbmFtZSwgbGVuKTsKKwkJCQlyZXRbbGVuXSA9IDA7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogVmVyaWZ5IHRoYXQgd2UgcmVjb2duaXplIHRoZSBsaW5lcyBmb2xsb3dpbmcgYSBnaXQgaGVhZGVyICovCitzdGF0aWMgaW50IHBhcnNlX2dpdF9oZWFkZXIoY2hhciAqbGluZSwgaW50IGxlbiwgdW5zaWduZWQgaW50IHNpemUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwkvKiBBIGdpdCBkaWZmIGhhcyBleHBsaWNpdCBuZXcvZGVsZXRlIGluZm9ybWF0aW9uLCBzbyB3ZSBkb24ndCBndWVzcyAqLworCXBhdGNoLT5pc19uZXcgPSAwOworCXBhdGNoLT5pc19kZWxldGUgPSAwOworCisJLyoKKwkgKiBTb21lIHRoaW5ncyBtYXkgbm90IGhhdmUgdGhlIG9sZCBuYW1lIGluIHRoZQorCSAqIHJlc3Qgb2YgdGhlIGhlYWRlcnMgYW55d2hlcmUgKHB1cmUgbW9kZSBjaGFuZ2VzLAorCSAqIG9yIHJlbW92aW5nIG9yIGFkZGluZyBlbXB0eSBmaWxlcyksIHNvIHdlIGdldAorCSAqIHRoZSBkZWZhdWx0IG5hbWUgZnJvbSB0aGUgaGVhZGVyLgorCSAqLworCXBhdGNoLT5kZWZfbmFtZSA9IGdpdF9oZWFkZXJfbmFtZShsaW5lLCBsZW4pOworCisJbGluZSArPSBsZW47CisJc2l6ZSAtPSBsZW47CisJbGluZW5yKys7CisJZm9yIChvZmZzZXQgPSBsZW4gOyBzaXplID4gMCA7IG9mZnNldCArPSBsZW4sIHNpemUgLT0gbGVuLCBsaW5lICs9IGxlbiwgbGluZW5yKyspIHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBvcGVudHJ5IHsKKwkJCWNvbnN0IGNoYXIgKnN0cjsKKwkJCWludCAoKmZuKShjb25zdCBjaGFyICosIHN0cnVjdCBwYXRjaCAqKTsKKwkJfSBvcHRhYmxlW10gPSB7CisJCQl7ICJAQCAtIiwgZ2l0ZGlmZl9oZHJlbmQgfSwKKwkJCXsgIi0tLSAiLCBnaXRkaWZmX29sZG5hbWUgfSwKKwkJCXsgIisrKyAiLCBnaXRkaWZmX25ld25hbWUgfSwKKwkJCXsgIm9sZCBtb2RlICIsIGdpdGRpZmZfb2xkbW9kZSB9LAorCQkJeyAibmV3IG1vZGUgIiwgZ2l0ZGlmZl9uZXdtb2RlIH0sCisJCQl7ICJkZWxldGVkIGZpbGUgbW9kZSAiLCBnaXRkaWZmX2RlbGV0ZSB9LAorCQkJeyAibmV3IGZpbGUgbW9kZSAiLCBnaXRkaWZmX25ld2ZpbGUgfSwKKwkJCXsgImNvcHkgZnJvbSAiLCBnaXRkaWZmX2NvcHlzcmMgfSwKKwkJCXsgImNvcHkgdG8gIiwgZ2l0ZGlmZl9jb3B5ZHN0IH0sCisJCQl7ICJyZW5hbWUgb2xkICIsIGdpdGRpZmZfcmVuYW1lc3JjIH0sCisJCQl7ICJyZW5hbWUgbmV3ICIsIGdpdGRpZmZfcmVuYW1lZHN0IH0sCisJCQl7ICJyZW5hbWUgZnJvbSAiLCBnaXRkaWZmX3JlbmFtZXNyYyB9LAorCQkJeyAicmVuYW1lIHRvICIsIGdpdGRpZmZfcmVuYW1lZHN0IH0sCisJCQl7ICJzaW1pbGFyaXR5IGluZGV4ICIsIGdpdGRpZmZfc2ltaWxhcml0eSB9LAorCQkJeyAiZGlzc2ltaWxhcml0eSBpbmRleCAiLCBnaXRkaWZmX2Rpc3NpbWlsYXJpdHkgfSwKKwkJCXsgImluZGV4ICIsIGdpdGRpZmZfaW5kZXggfSwKKwkJCXsgIiIsIGdpdGRpZmZfdW5yZWNvZ25pemVkIH0sCisJCX07CisJCWludCBpOworCisJCWxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSk7CisJCWlmICghbGVuIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCQlicmVhazsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3B0YWJsZSk7IGkrKykgeworCQkJY29uc3Qgc3RydWN0IG9wZW50cnkgKnAgPSBvcHRhYmxlICsgaTsKKwkJCWludCBvcGxlbiA9IHN0cmxlbihwLT5zdHIpOworCQkJaWYgKGxlbiA8IG9wbGVuIHx8IG1lbWNtcChwLT5zdHIsIGxpbmUsIG9wbGVuKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwLT5mbihsaW5lICsgb3BsZW4sIHBhdGNoKSA8IDApCisJCQkJcmV0dXJuIG9mZnNldDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBwYXJzZV9udW0oY29uc3QgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyAqcCkKK3sKKwljaGFyICpwdHI7CisKKwlpZiAoIWlzZGlnaXQoKmxpbmUpKQorCQlyZXR1cm4gMDsKKwkqcCA9IHN0cnRvdWwobGluZSwgJnB0ciwgMTApOworCXJldHVybiBwdHIgLSBsaW5lOworfQorCitzdGF0aWMgaW50IHBhcnNlX3JhbmdlKGNvbnN0IGNoYXIgKmxpbmUsIGludCBsZW4sIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKmV4cGVjdCwKKwkJCXVuc2lnbmVkIGxvbmcgKnAxLCB1bnNpZ25lZCBsb25nICpwMikKK3sKKwlpbnQgZGlnaXRzLCBleDsKKworCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBsZW4pCisJCXJldHVybiAtMTsKKwlsaW5lICs9IG9mZnNldDsKKwlsZW4gLT0gb2Zmc2V0OworCisJZGlnaXRzID0gcGFyc2VfbnVtKGxpbmUsIHAxKTsKKwlpZiAoIWRpZ2l0cykKKwkJcmV0dXJuIC0xOworCisJb2Zmc2V0ICs9IGRpZ2l0czsKKwlsaW5lICs9IGRpZ2l0czsKKwlsZW4gLT0gZGlnaXRzOworCisJKnAyID0gMTsKKwlpZiAoKmxpbmUgPT0gJywnKSB7CisJCWRpZ2l0cyA9IHBhcnNlX251bShsaW5lKzEsIHAyKTsKKwkJaWYgKCFkaWdpdHMpCisJCQlyZXR1cm4gLTE7CisKKwkJb2Zmc2V0ICs9IGRpZ2l0cysxOworCQlsaW5lICs9IGRpZ2l0cysxOworCQlsZW4gLT0gZGlnaXRzKzE7CisJfQorCisJZXggPSBzdHJsZW4oZXhwZWN0KTsKKwlpZiAoZXggPiBsZW4pCisJCXJldHVybiAtMTsKKwlpZiAobWVtY21wKGxpbmUsIGV4cGVjdCwgZXgpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gb2Zmc2V0ICsgZXg7Cit9CisKKy8qCisgKiBQYXJzZSBhIHVuaWZpZWQgZGlmZiBmcmFnbWVudCBoZWFkZXIgb2YgdGhlCisgKiBmb3JtICJAQCAtYSxiICtjLGQgQEAiCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfZnJhZ21lbnRfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sIHN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnQpCit7CisJaW50IG9mZnNldDsKKworCWlmICghbGVuIHx8IGxpbmVbbGVuLTFdICE9ICdcbicpCisJCXJldHVybiAtMTsKKworCS8qIEZpZ3VyZSBvdXQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiBhIGZyYWdtZW50ICovCisJb2Zmc2V0ID0gcGFyc2VfcmFuZ2UobGluZSwgbGVuLCA0LCAiICsiLCAmZnJhZ21lbnQtPm9sZHBvcywgJmZyYWdtZW50LT5vbGRsaW5lcyk7CisJb2Zmc2V0ID0gcGFyc2VfcmFuZ2UobGluZSwgbGVuLCBvZmZzZXQsICIgQEAiLCAmZnJhZ21lbnQtPm5ld3BvcywgJmZyYWdtZW50LT5uZXdsaW5lcyk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IGZpbmRfaGVhZGVyKGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50ICpoZHJzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsZW47CisKKwlwYXRjaC0+aXNfcmVuYW1lID0gcGF0Y2gtPmlzX2NvcHkgPSAwOworCXBhdGNoLT5pc19uZXcgPSBwYXRjaC0+aXNfZGVsZXRlID0gLTE7CisJcGF0Y2gtPm9sZF9tb2RlID0gcGF0Y2gtPm5ld19tb2RlID0gMDsKKwlwYXRjaC0+b2xkX25hbWUgPSBwYXRjaC0+bmV3X25hbWUgPSBOVUxMOworCWZvciAob2Zmc2V0ID0gMDsgc2l6ZSA+IDA7IG9mZnNldCArPSBsZW4sIHNpemUgLT0gbGVuLCBsaW5lICs9IGxlbiwgbGluZW5yKyspIHsKKwkJdW5zaWduZWQgbG9uZyBuZXh0bGVuOworCisJCWxlbiA9IGxpbmVsZW4obGluZSwgc2l6ZSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisKKwkJLyogVGVzdGluZyB0aGlzIGVhcmx5IGFsbG93cyB1cyB0byB0YWtlIGEgZmV3IHNob3J0Y3V0cy4uICovCisJCWlmIChsZW4gPCA2KQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGRvbid0IGZpbmQgYW55IHVuY29ubmVjdGVkIHBhdGNoIGZyYWdtZW50cy4KKwkJICogVGhhdCdzIGEgc2lnbiB0aGF0IHdlIGRpZG4ndCBmaW5kIGEgaGVhZGVyLCBhbmQgdGhhdCBhCisJCSAqIHBhdGNoIGhhcyBiZWNvbWUgY29ycnVwdGVkL2Jyb2tlbiB1cC4KKwkJICovCisJCWlmICghbWVtY21wKCJAQCAtIiwgbGluZSwgNCkpIHsKKwkJCXN0cnVjdCBmcmFnbWVudCBkdW1teTsKKwkJCWlmIChwYXJzZV9mcmFnbWVudF9oZWFkZXIobGluZSwgbGVuLCAmZHVtbXkpIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWVycm9yKCJwYXRjaCBmcmFnbWVudCB3aXRob3V0IGhlYWRlciBhdCBsaW5lICVkOiAlLipzIiwgbGluZW5yLCAoaW50KWxlbi0xLCBsaW5lKTsKKwkJfQorCisJCWlmIChzaXplIDwgbGVuICsgNikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIEdpdCBwYXRjaD8gSXQgbWlnaHQgbm90IGhhdmUgYSByZWFsIHBhdGNoLCBqdXN0IGEgcmVuYW1lCisJCSAqIG9yIG1vZGUgY2hhbmdlLCBzbyB3ZSBoYW5kbGUgdGhhdCBzcGVjaWFsbHkKKwkJICovCisJCWlmICghbWVtY21wKCJkaWZmIC0tZ2l0ICIsIGxpbmUsIDExKSkgeworCQkJaW50IGdpdF9oZHJfbGVuID0gcGFyc2VfZ2l0X2hlYWRlcihsaW5lLCBsZW4sIHNpemUsIHBhdGNoKTsKKwkJCWlmIChnaXRfaGRyX2xlbiA8PSBsZW4pCisJCQkJY29udGludWU7CisJCQlpZiAoIXBhdGNoLT5vbGRfbmFtZSAmJiAhcGF0Y2gtPm5ld19uYW1lKSB7CisJCQkJaWYgKCFwYXRjaC0+ZGVmX25hbWUpCisJCQkJCWRpZSgiZ2l0IGRpZmYgaGVhZGVyIGxhY2tzIGZpbGVuYW1lIGluZm9ybWF0aW9uIChsaW5lICVkKSIsIGxpbmVucik7CisJCQkJcGF0Y2gtPm9sZF9uYW1lID0gcGF0Y2gtPm5ld19uYW1lID0gcGF0Y2gtPmRlZl9uYW1lOworCQkJfQorCQkJKmhkcnNpemUgPSBnaXRfaGRyX2xlbjsKKwkJCXJldHVybiBvZmZzZXQ7CisJCX0KKworCQkvKiogLS0tIGZvbGxvd2VkIGJ5ICsrKyA/ICovCisJCWlmIChtZW1jbXAoIi0tLSAiLCBsaW5lLCAgNCkgfHwgbWVtY21wKCIrKysgIiwgbGluZSArIGxlbiwgNCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXZSBvbmx5IGFjY2VwdCB1bmlmaWVkIHBhdGNoZXMsIHNvIHdlIHdhbnQgaXQgdG8KKwkJICogYXQgbGVhc3QgaGF2ZSAiQEAgLWEsYiArYyxkIEBAXG4iLCB3aGljaCBpcyAxNCBjaGFycworCQkgKiBtaW5pbXVtCisJCSAqLworCQluZXh0bGVuID0gbGluZWxlbihsaW5lICsgbGVuLCBzaXplIC0gbGVuKTsKKwkJaWYgKHNpemUgPCBuZXh0bGVuICsgMTQgfHwgbWVtY21wKCJAQCAtIiwgbGluZSArIGxlbiArIG5leHRsZW4sIDQpKQorCQkJY29udGludWU7CisKKwkJLyogT2ssIHdlJ2xsIGNvbnNpZGVyIGl0IGEgcGF0Y2ggKi8KKwkJcGFyc2VfdHJhZGl0aW9uYWxfcGF0Y2gobGluZSwgbGluZStsZW4sIHBhdGNoKTsKKwkJKmhkcnNpemUgPSBsZW4gKyBuZXh0bGVuOworCQlsaW5lbnIgKz0gMjsKKwkJcmV0dXJuIG9mZnNldDsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKgorICogUGFyc2UgYSB1bmlmaWVkIGRpZmYuIE5vdGUgdGhhdCB0aGlzIHJlYWxseSBuZWVkcworICogdG8gcGFyc2UgZWFjaCBmcmFnbWVudCBzZXBhcmF0ZWx5LCBzaW5jZSB0aGUgb25seQorICogd2F5IHRvIGtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhICItLS0iIHRoYXQgaXMKKyAqIHBhcnQgb2YgYSBwYXRjaCwgYW5kIGEgIi0tLSIgdGhhdCBzdGFydHMgdGhlIG5leHQKKyAqIHBhdGNoIGlzIHRvIGxvb2sgYXQgdGhlIGxpbmUgY291bnRzLi4KKyAqLworc3RhdGljIGludCBwYXJzZV9mcmFnbWVudChjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gsIHN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnQpCit7CisJaW50IGFkZGVkLCBkZWxldGVkOworCWludCBsZW4gPSBsaW5lbGVuKGxpbmUsIHNpemUpLCBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBvbGRsaW5lcywgbmV3bGluZXM7CisJdW5zaWduZWQgbG9uZyBsZWFkaW5nLCB0cmFpbGluZzsKKworCW9mZnNldCA9IHBhcnNlX2ZyYWdtZW50X2hlYWRlcihsaW5lLCBsZW4sIGZyYWdtZW50KTsKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIC0xOworCW9sZGxpbmVzID0gZnJhZ21lbnQtPm9sZGxpbmVzOworCW5ld2xpbmVzID0gZnJhZ21lbnQtPm5ld2xpbmVzOworCWxlYWRpbmcgPSAwOworCXRyYWlsaW5nID0gMDsKKworCWlmIChwYXRjaC0+aXNfbmV3IDwgMCkgeworCQlwYXRjaC0+aXNfbmV3ID0gICFvbGRsaW5lczsKKwkJaWYgKCFvbGRsaW5lcykKKwkJCXBhdGNoLT5vbGRfbmFtZSA9IE5VTEw7CisJfQorCWlmIChwYXRjaC0+aXNfZGVsZXRlIDwgMCkgeworCQlwYXRjaC0+aXNfZGVsZXRlID0gIW5ld2xpbmVzOworCQlpZiAoIW5ld2xpbmVzKQorCQkJcGF0Y2gtPm5ld19uYW1lID0gTlVMTDsKKwl9CisKKwlpZiAocGF0Y2gtPmlzX25ldyAmJiBvbGRsaW5lcykKKwkJcmV0dXJuIGVycm9yKCJuZXcgZmlsZSBkZXBlbmRzIG9uIG9sZCBjb250ZW50cyIpOworCWlmIChwYXRjaC0+aXNfZGVsZXRlICE9ICFuZXdsaW5lcykgeworCQlpZiAobmV3bGluZXMpCisJCQlyZXR1cm4gZXJyb3IoImRlbGV0ZWQgZmlsZSBzdGlsbCBoYXMgY29udGVudHMiKTsKKwkJZnByaW50ZihzdGRlcnIsICIqKiB3YXJuaW5nOiBmaWxlICVzIGJlY29tZXMgZW1wdHkgYnV0IGlzIG5vdCBkZWxldGVkXG4iLCBwYXRjaC0+bmV3X25hbWUpOworCX0KKworCS8qIFBhcnNlIHRoZSB0aGluZy4uICovCisJbGluZSArPSBsZW47CisJc2l6ZSAtPSBsZW47CisJbGluZW5yKys7CisJYWRkZWQgPSBkZWxldGVkID0gMDsKKwlmb3IgKG9mZnNldCA9IGxlbjsgc2l6ZSA+IDA7IG9mZnNldCArPSBsZW4sIHNpemUgLT0gbGVuLCBsaW5lICs9IGxlbiwgbGluZW5yKyspIHsKKwkJaWYgKCFvbGRsaW5lcyAmJiAhbmV3bGluZXMpCisJCQlicmVhazsKKwkJbGVuID0gbGluZWxlbihsaW5lLCBzaXplKTsKKwkJaWYgKCFsZW4gfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJc3dpdGNoICgqbGluZSkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQljYXNlICcgJzoKKwkJCW9sZGxpbmVzLS07CisJCQluZXdsaW5lcy0tOworCQkJaWYgKCFkZWxldGVkICYmICFhZGRlZCkKKwkJCQlsZWFkaW5nKys7CisJCQl0cmFpbGluZysrOworCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJZGVsZXRlZCsrOworCQkJb2xkbGluZXMtLTsKKwkJCXRyYWlsaW5nID0gMDsKKwkJCWJyZWFrOworCQljYXNlICcrJzoKKwkJCS8qCisJCQkgKiBXZSBrbm93IGxlbiBpcyBhdCBsZWFzdCB0d28sIHNpbmNlIHdlIGhhdmUgYSAnKycgYW5kCisJCQkgKiB3ZSBjaGVja2VkIHRoYXQgdGhlIGxhc3QgY2hhcmFjdGVyIHdhcyBhICdcbicgYWJvdmUuCisJCQkgKiBUaGF0IGlzLCBhbiBhZGRpdGlvbiBvZiBhbiBlbXB0eSBsaW5lIHdvdWxkIGNoZWNrCisJCQkgKiB0aGUgJysnIGhlcmUuICBTbmVha3kuLi4KKwkJCSAqLworCQkJaWYgKChuZXdfd2hpdGVzcGFjZSAhPSBub3dhcm5fd2hpdGVzcGFjZSkgJiYKKwkJCSAgICBpc3NwYWNlKGxpbmVbbGVuLTJdKSkgeworCQkJCXdoaXRlc3BhY2VfZXJyb3IrKzsKKwkJCQlpZiAoc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyAmJgorCQkJCSAgICBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzIDwKKwkJCQkgICAgd2hpdGVzcGFjZV9lcnJvcikKKwkJCQkJOworCQkJCWVsc2UgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkFkZHMgdHJhaWxpbmcgd2hpdGVzcGFjZS5cbiVzOiVkOiUuKnNcbiIsCisJCQkJCQlwYXRjaF9pbnB1dF9maWxlLAorCQkJCQkJbGluZW5yLCBsZW4tMiwgbGluZSsxKTsKKwkJCQl9CisJCQl9CisJCQlhZGRlZCsrOworCQkJbmV3bGluZXMtLTsKKwkJCXRyYWlsaW5nID0gMDsKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgLyogV2UgYWxsb3cgIlwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZSIuIERlcGVuZGluZworICAgICAgICAgICAgICAgICAqIG9uIGxvY2FsZSBzZXR0aW5ncyB3aGVuIHRoZSBwYXRjaCB3YXMgcHJvZHVjZWQgd2UKKyAgICAgICAgICAgICAgICAgKiBkb24ndCBrbm93IHdoYXQgdGhpcyBsaW5lIGxvb2tzIGxpa2UuIFRoZSBvbmx5CisgICAgICAgICAgICAgICAgICogdGhpbmcgd2UgZG8ga25vdyBpcyB0aGF0IGl0IGJlZ2lucyB3aXRoICJcICIuCisJCSAqIENoZWNraW5nIGZvciAxMiBpcyBqdXN0IGZvciBzYW5pdHkgY2hlY2sgLS0gYW55CisJCSAqIGwxMG4gb2YgIlwgTm8gbmV3bGluZS4uLiIgaXMgYXQgbGVhc3QgdGhhdCBsb25nLgorCQkgKi8KKwkJY2FzZSAnXFwnOgorCQkJaWYgKGxlbiA8IDEyIHx8IG1lbWNtcChsaW5lLCAiXFwgIiwgMikpCisJCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG9sZGxpbmVzIHx8IG5ld2xpbmVzKQorCQlyZXR1cm4gLTE7CisJZnJhZ21lbnQtPmxlYWRpbmcgPSBsZWFkaW5nOworCWZyYWdtZW50LT50cmFpbGluZyA9IHRyYWlsaW5nOworCisJLyogSWYgYSBmcmFnbWVudCBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lLCB3ZSBmYWlsZWQgdG8gaW5jbHVkZQorCSAqIGl0IGluIHRoZSBhYm92ZSBsb29wIGJlY2F1c2Ugd2UgaGl0IG9sZGxpbmVzID09IG5ld2xpbmVzID09IDAKKwkgKiBiZWZvcmUgc2VlaW5nIGl0LgorCSAqLworCWlmICgxMiA8IHNpemUgJiYgIW1lbWNtcChsaW5lLCAiXFwgIiwgMikpCisJCW9mZnNldCArPSBsaW5lbGVuKGxpbmUsIHNpemUpOworCisJcGF0Y2gtPmxpbmVzX2FkZGVkICs9IGFkZGVkOworCXBhdGNoLT5saW5lc19kZWxldGVkICs9IGRlbGV0ZWQ7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBwYXJzZV9zaW5nbGVfcGF0Y2goY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgZnJhZ21lbnQgKipmcmFncCA9ICZwYXRjaC0+ZnJhZ21lbnRzOworCisJd2hpbGUgKHNpemUgPiA0ICYmICFtZW1jbXAobGluZSwgIkBAIC0iLCA0KSkgeworCQlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50OworCQlpbnQgbGVuOworCisJCWZyYWdtZW50ID0geGNhbGxvYygxLCBzaXplb2YoKmZyYWdtZW50KSk7CisJCWxlbiA9IHBhcnNlX2ZyYWdtZW50KGxpbmUsIHNpemUsIHBhdGNoLCBmcmFnbWVudCk7CisJCWlmIChsZW4gPD0gMCkKKwkJCWRpZSgiY29ycnVwdCBwYXRjaCBhdCBsaW5lICVkIiwgbGluZW5yKTsKKworCQlmcmFnbWVudC0+cGF0Y2ggPSBsaW5lOworCQlmcmFnbWVudC0+c2l6ZSA9IGxlbjsKKworCQkqZnJhZ3AgPSBmcmFnbWVudDsKKwkJZnJhZ3AgPSAmZnJhZ21lbnQtPm5leHQ7CisKKwkJb2Zmc2V0ICs9IGxlbjsKKwkJbGluZSArPSBsZW47CisJCXNpemUgLT0gbGVuOworCX0KKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIGludCBtZXRhZGF0YV9jaGFuZ2VzKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJcmV0dXJuCXBhdGNoLT5pc19yZW5hbWUgPiAwIHx8CisJCXBhdGNoLT5pc19jb3B5ID4gMCB8fAorCQlwYXRjaC0+aXNfbmV3ID4gMCB8fAorCQlwYXRjaC0+aXNfZGVsZXRlIHx8CisJCShwYXRjaC0+b2xkX21vZGUgJiYgcGF0Y2gtPm5ld19tb2RlICYmCisJCSBwYXRjaC0+b2xkX21vZGUgIT0gcGF0Y2gtPm5ld19tb2RlKTsKK30KKworc3RhdGljIGludCBwYXJzZV9iaW5hcnkoY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJLyogV2UgaGF2ZSByZWFkICJHSVQgYmluYXJ5IHBhdGNoXG4iOyB3aGF0IGZvbGxvd3MgaXMgYSBsaW5lCisJICogdGhhdCBzYXlzIHRoZSBwYXRjaCBtZXRob2QgKGN1cnJlbnRseSwgZWl0aGVyICJkZWZsYXRlZAorCSAqIGxpdGVyYWwiIG9yICJkZWZsYXRlZCBkZWx0YSIpIGFuZCB0aGUgbGVuZ3RoIG9mIGRhdGEgYmVmb3JlCisJICogZGVmbGF0aW5nOyBhIHNlcXVlbmNlIG9mICdsZW5ndGgtYnl0ZScgZm9sbG93ZWQgYnkgYmFzZS04NQorCSAqIGVuY29kZWQgZGF0YSBmb2xsb3dzLgorCSAqCisJICogRWFjaCA1LWJ5dGUgc2VxdWVuY2Ugb2YgYmFzZS04NSBlbmNvZGVzIHVwIHRvIDQgYnl0ZXMsCisJICogYW5kIHdlIHdvdWxkIGxpbWl0IHRoZSBwYXRjaCBsaW5lIHRvIDY2IGNoYXJhY3RlcnMsCisJICogc28gb25lIGxpbmUgY2FuIGZpdCB1cCB0byAxMyBncm91cHMgdGhhdCB3b3VsZCBkZWNvZGUKKwkgKiB0byA1MiBieXRlcyBtYXguICBUaGUgbGVuZ3RoIGJ5dGUgJ0EnLSdaJyBjb3JyZXNwb25kcworCSAqIHRvIDEtMjYgYnl0ZXMsIGFuZCAnYSctJ3onIGNvcnJlc3BvbmRzIHRvIDI3LTUyIGJ5dGVzLgorCSAqIFRoZSBlbmQgb2YgYmluYXJ5IGlzIHNpZ25hbGVkIHdpdGggYW4gZW1wdHkgbGluZS4KKwkgKi8KKwlpbnQgbGxlbiwgdXNlZDsKKwlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWdtZW50OworCWNoYXIgKmRhdGEgPSBOVUxMOworCisJcGF0Y2gtPmZyYWdtZW50cyA9IGZyYWdtZW50ID0geGNhbGxvYygxLCBzaXplb2YoKmZyYWdtZW50KSk7CisKKwkvKiBHcmFiIHRoZSB0eXBlIG9mIHBhdGNoICovCisJbGxlbiA9IGxpbmVsZW4oYnVmZmVyLCBzaXplKTsKKwl1c2VkID0gbGxlbjsKKwlsaW5lbnIrKzsKKworCWlmICghc3RybmNtcChidWZmZXIsICJkZWx0YSAiLCA2KSkgeworCQlwYXRjaC0+aXNfYmluYXJ5ID0gQklOQVJZX0RFTFRBX0RFRkxBVEVEOworCQlwYXRjaC0+ZGVmbGF0ZV9vcmlnbGVuID0gc3RydG91bChidWZmZXIgKyA2LCBOVUxMLCAxMCk7CisJfQorCWVsc2UgaWYgKCFzdHJuY21wKGJ1ZmZlciwgImxpdGVyYWwgIiwgOCkpIHsKKwkJcGF0Y2gtPmlzX2JpbmFyeSA9IEJJTkFSWV9MSVRFUkFMX0RFRkxBVEVEOworCQlwYXRjaC0+ZGVmbGF0ZV9vcmlnbGVuID0gc3RydG91bChidWZmZXIgKyA4LCBOVUxMLCAxMCk7CisJfQorCWVsc2UKKwkJcmV0dXJuIGVycm9yKCJ1bnJlY29nbml6ZWQgYmluYXJ5IHBhdGNoIGF0IGxpbmUgJWQ6ICUuKnMiLAorCQkJICAgICBsaW5lbnItMSwgbGxlbi0xLCBidWZmZXIpOworCWJ1ZmZlciArPSBsbGVuOworCXdoaWxlICgxKSB7CisJCWludCBieXRlX2xlbmd0aCwgbWF4X2J5dGVfbGVuZ3RoLCBuZXdzaXplOworCQlsbGVuID0gbGluZWxlbihidWZmZXIsIHNpemUpOworCQl1c2VkICs9IGxsZW47CisJCWxpbmVucisrOworCQlpZiAobGxlbiA9PSAxKQorCQkJYnJlYWs7CisJCS8qIE1pbmltdW0gbGluZSBpcyAiQTAwMDAwXG4iIHdoaWNoIGlzIDctYnl0ZSBsb25nLAorCQkgKiBhbmQgdGhlIGxpbmUgbGVuZ3RoIG11c3QgYmUgbXVsdGlwbGUgb2YgNSBwbHVzIDIuCisJCSAqLworCQlpZiAoKGxsZW4gPCA3KSB8fCAobGxlbi0yKSAlIDUpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCW1heF9ieXRlX2xlbmd0aCA9IChsbGVuIC0gMikgLyA1ICogNDsKKwkJYnl0ZV9sZW5ndGggPSAqYnVmZmVyOworCQlpZiAoJ0EnIDw9IGJ5dGVfbGVuZ3RoICYmIGJ5dGVfbGVuZ3RoIDw9ICdaJykKKwkJCWJ5dGVfbGVuZ3RoID0gYnl0ZV9sZW5ndGggLSAnQScgKyAxOworCQllbHNlIGlmICgnYScgPD0gYnl0ZV9sZW5ndGggJiYgYnl0ZV9sZW5ndGggPD0gJ3onKQorCQkJYnl0ZV9sZW5ndGggPSBieXRlX2xlbmd0aCAtICdhJyArIDI3OworCQllbHNlCisJCQlnb3RvIGNvcnJ1cHQ7CisJCS8qIGlmIHRoZSBpbnB1dCBsZW5ndGggd2FzIG5vdCBtdWx0aXBsZSBvZiA0LCB3ZSB3b3VsZAorCQkgKiBoYXZlIGZpbGxlciBhdCB0aGUgZW5kIGJ1dCB0aGUgZmlsbGVyIHNob3VsZCBuZXZlcgorCQkgKiBleGNlZWQgMyBieXRlcworCQkgKi8KKwkJaWYgKG1heF9ieXRlX2xlbmd0aCA8IGJ5dGVfbGVuZ3RoIHx8CisJCSAgICBieXRlX2xlbmd0aCA8PSBtYXhfYnl0ZV9sZW5ndGggLSA0KQorCQkJZ290byBjb3JydXB0OworCQluZXdzaXplID0gZnJhZ21lbnQtPnNpemUgKyBieXRlX2xlbmd0aDsKKwkJZGF0YSA9IHhyZWFsbG9jKGRhdGEsIG5ld3NpemUpOworCQlpZiAoZGVjb2RlXzg1KGRhdGEgKyBmcmFnbWVudC0+c2l6ZSwKKwkJCSAgICAgIGJ1ZmZlciArIDEsCisJCQkgICAgICBieXRlX2xlbmd0aCkpCisJCQlnb3RvIGNvcnJ1cHQ7CisJCWZyYWdtZW50LT5zaXplID0gbmV3c2l6ZTsKKwkJYnVmZmVyICs9IGxsZW47CisJCXNpemUgLT0gbGxlbjsKKwl9CisJZnJhZ21lbnQtPnBhdGNoID0gZGF0YTsKKwlyZXR1cm4gdXNlZDsKKyBjb3JydXB0OgorCXJldHVybiBlcnJvcigiY29ycnVwdCBiaW5hcnkgcGF0Y2ggYXQgbGluZSAlZDogJS4qcyIsCisJCSAgICAgbGluZW5yLTEsIGxsZW4tMSwgYnVmZmVyKTsKK30KKworc3RhdGljIGludCBwYXJzZV9jaHVuayhjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpbnQgaGRyc2l6ZSwgcGF0Y2hzaXplOworCWludCBvZmZzZXQgPSBmaW5kX2hlYWRlcihidWZmZXIsIHNpemUsICZoZHJzaXplLCBwYXRjaCk7CisKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIG9mZnNldDsKKworCXBhdGNoc2l6ZSA9IHBhcnNlX3NpbmdsZV9wYXRjaChidWZmZXIgKyBvZmZzZXQgKyBoZHJzaXplLCBzaXplIC0gb2Zmc2V0IC0gaGRyc2l6ZSwgcGF0Y2gpOworCisJaWYgKCFwYXRjaHNpemUpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmJpbmhkcltdID0geworCQkJIkJpbmFyeSBmaWxlcyAiLAorCQkJIkZpbGVzICIsCisJCQlOVUxMLAorCQl9OworCQlzdGF0aWMgY29uc3QgY2hhciBnaXRfYmluYXJ5W10gPSAiR0lUIGJpbmFyeSBwYXRjaFxuIjsKKwkJaW50IGk7CisJCWludCBoZCA9IGhkcnNpemUgKyBvZmZzZXQ7CisJCXVuc2lnbmVkIGxvbmcgbGxlbiA9IGxpbmVsZW4oYnVmZmVyICsgaGQsIHNpemUgLSBoZCk7CisKKwkJaWYgKGxsZW4gPT0gc2l6ZW9mKGdpdF9iaW5hcnkpIC0gMSAmJgorCQkgICAgIW1lbWNtcChnaXRfYmluYXJ5LCBidWZmZXIgKyBoZCwgbGxlbikpIHsKKwkJCWludCB1c2VkOworCQkJbGluZW5yKys7CisJCQl1c2VkID0gcGFyc2VfYmluYXJ5KGJ1ZmZlciArIGhkICsgbGxlbiwKKwkJCQkJICAgIHNpemUgLSBoZCAtIGxsZW4sIHBhdGNoKTsKKwkJCWlmICh1c2VkKQorCQkJCXBhdGNoc2l6ZSA9IHVzZWQgKyBsbGVuOworCQkJZWxzZQorCQkJCXBhdGNoc2l6ZSA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIW1lbWNtcCgiIGRpZmZlclxuIiwgYnVmZmVyICsgaGQgKyBsbGVuIC0gOCwgOCkpIHsKKwkJCWZvciAoaSA9IDA7IGJpbmhkcltpXTsgaSsrKSB7CisJCQkJaW50IGxlbiA9IHN0cmxlbihiaW5oZHJbaV0pOworCQkJCWlmIChsZW4gPCBzaXplIC0gaGQgJiYKKwkJCQkgICAgIW1lbWNtcChiaW5oZHJbaV0sIGJ1ZmZlciArIGhkLCBsZW4pKSB7CisJCQkJCWxpbmVucisrOworCQkJCQlwYXRjaC0+aXNfYmluYXJ5ID0gMTsKKwkJCQkJcGF0Y2hzaXplID0gbGxlbjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogRW1wdHkgcGF0Y2ggY2Fubm90IGJlIGFwcGxpZWQgaWY6CisJCSAqIC0gaXQgaXMgYSBiaW5hcnkgcGF0Y2ggYW5kIHdlIGRvIG5vdCBkbyBiaW5hcnlfcmVwbGFjZSwgb3IKKwkJICogLSB0ZXh0IHBhdGNoIHdpdGhvdXQgbWV0YWRhdGEgY2hhbmdlCisJCSAqLworCQlpZiAoKGFwcGx5IHx8IGNoZWNrKSAmJgorCQkgICAgKHBhdGNoLT5pc19iaW5hcnkKKwkJICAgICA/ICFhbGxvd19iaW5hcnlfcmVwbGFjZW1lbnQKKwkJICAgICA6ICFtZXRhZGF0YV9jaGFuZ2VzKHBhdGNoKSkpCisJCQlkaWUoInBhdGNoIHdpdGggb25seSBnYXJiYWdlIGF0IGxpbmUgJWQiLCBsaW5lbnIpOworCX0KKworCXJldHVybiBvZmZzZXQgKyBoZHJzaXplICsgcGF0Y2hzaXplOworfQorCisjZGVmaW5lIHN3YXAoYSxiKSBteXN3YXAoKGEpLChiKSxzaXplb2YoYSkpCisKKyNkZWZpbmUgbXlzd2FwKGEsIGIsIHNpemUpIGRvIHsJCVwKKwl1bnNpZ25lZCBjaGFyIG15dG1wW3NpemVdOwlcCisJbWVtY3B5KG15dG1wLCAmYSwgc2l6ZSk7CQlcCisJbWVtY3B5KCZhLCAmYiwgc2l6ZSk7CQlcCisJbWVtY3B5KCZiLCBteXRtcCwgc2l6ZSk7CQlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCByZXZlcnNlX3BhdGNoZXMoc3RydWN0IHBhdGNoICpwKQoreworCWZvciAoOyBwOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWcgPSBwLT5mcmFnbWVudHM7CisKKwkJc3dhcChwLT5uZXdfbmFtZSwgcC0+b2xkX25hbWUpOworCQlzd2FwKHAtPm5ld19tb2RlLCBwLT5vbGRfbW9kZSk7CisJCXN3YXAocC0+aXNfbmV3LCBwLT5pc19kZWxldGUpOworCQlzd2FwKHAtPmxpbmVzX2FkZGVkLCBwLT5saW5lc19kZWxldGVkKTsKKwkJc3dhcChwLT5vbGRfc2hhMV9wcmVmaXgsIHAtPm5ld19zaGExX3ByZWZpeCk7CisKKwkJZm9yICg7IGZyYWc7IGZyYWcgPSBmcmFnLT5uZXh0KSB7CisJCQlzd2FwKGZyYWctPm5ld3BvcywgZnJhZy0+b2xkcG9zKTsKKwkJCXN3YXAoZnJhZy0+bmV3bGluZXMsIGZyYWctPm9sZGxpbmVzKTsKKwkJfQorCQlwLT5pc19yZXZlcnNlID0gIXAtPmlzX3JldmVyc2U7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciBwbHVzZXNbXSA9ICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbnVzZXNbXT0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOworCitzdGF0aWMgdm9pZCBzaG93X3N0YXRzKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJY29uc3QgY2hhciAqcHJlZml4ID0gIiI7CisJY2hhciAqbmFtZSA9IHBhdGNoLT5uZXdfbmFtZTsKKwljaGFyICpxbmFtZSA9IE5VTEw7CisJaW50IGxlbiwgbWF4LCBhZGQsIGRlbCwgdG90YWw7CisKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSBwYXRjaC0+b2xkX25hbWU7CisKKwlpZiAoMCA8IChsZW4gPSBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApKSkgeworCQlxbmFtZSA9IHhtYWxsb2MobGVuICsgMSk7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgcW5hbWUsIE5VTEwsIDApOworCQluYW1lID0gcW5hbWU7CisJfQorCisJLyoKKwkgKiAic2NhbGUiIHRoZSBmaWxlbmFtZQorCSAqLworCWxlbiA9IHN0cmxlbihuYW1lKTsKKwltYXggPSBtYXhfbGVuOworCWlmIChtYXggPiA1MCkKKwkJbWF4ID0gNTA7CisJaWYgKGxlbiA+IG1heCkgeworCQljaGFyICpzbGFzaDsKKwkJcHJlZml4ID0gIi4uLiI7CisJCW1heCAtPSAzOworCQluYW1lICs9IGxlbiAtIG1heDsKKwkJc2xhc2ggPSBzdHJjaHIobmFtZSwgJy8nKTsKKwkJaWYgKHNsYXNoKQorCQkJbmFtZSA9IHNsYXNoOworCX0KKwlsZW4gPSBtYXg7CisKKwkvKgorCSAqIHNjYWxlIHRoZSBhZGQvZGVsZXRlCisJICovCisJbWF4ID0gbWF4X2NoYW5nZTsKKwlpZiAobWF4ICsgbGVuID4gNzApCisJCW1heCA9IDcwIC0gbGVuOworCisJYWRkID0gcGF0Y2gtPmxpbmVzX2FkZGVkOworCWRlbCA9IHBhdGNoLT5saW5lc19kZWxldGVkOworCXRvdGFsID0gYWRkICsgZGVsOworCisJaWYgKG1heF9jaGFuZ2UgPiAwKSB7CisJCXRvdGFsID0gKHRvdGFsICogbWF4ICsgbWF4X2NoYW5nZSAvIDIpIC8gbWF4X2NoYW5nZTsKKwkJYWRkID0gKGFkZCAqIG1heCArIG1heF9jaGFuZ2UgLyAyKSAvIG1heF9jaGFuZ2U7CisJCWRlbCA9IHRvdGFsIC0gYWRkOworCX0KKwlpZiAocGF0Y2gtPmlzX2JpbmFyeSkKKwkJcHJpbnRmKCIgJXMlLSpzIHwgIEJpblxuIiwgcHJlZml4LCBsZW4sIG5hbWUpOworCWVsc2UKKwkJcHJpbnRmKCIgJXMlLSpzIHwlNWQgJS4qcyUuKnNcbiIsIHByZWZpeCwKKwkJICAgICAgIGxlbiwgbmFtZSwgcGF0Y2gtPmxpbmVzX2FkZGVkICsgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQsCisJCSAgICAgICBhZGQsIHBsdXNlcywgZGVsLCBtaW51c2VzKTsKKwlpZiAocW5hbWUpCisJCWZyZWUocW5hbWUpOworfQorCitzdGF0aWMgaW50IHJlYWRfb2xkX2RhdGEoc3RydWN0IHN0YXQgKnN0LCBjb25zdCBjaGFyICpwYXRoLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgZmQ7CisJdW5zaWduZWQgbG9uZyBnb3Q7CisKKwlzd2l0Y2ggKHN0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGTE5LOgorCQlyZXR1cm4gcmVhZGxpbmsocGF0aCwgYnVmLCBzaXplKTsKKwljYXNlIFNfSUZSRUc6CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBvcGVuICVzIiwgcGF0aCk7CisJCWdvdCA9IDA7CisJCWZvciAoOzspIHsKKwkJCWludCByZXQgPSB4cmVhZChmZCwgKGNoYXIgKikgYnVmICsgZ290LCBzaXplIC0gZ290KTsKKwkJCWlmIChyZXQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWdvdCArPSByZXQ7CisJCX0KKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gZ290OworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIGludCBmaW5kX29mZnNldChjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqZnJhZ21lbnQsIHVuc2lnbmVkIGxvbmcgZnJhZ3NpemUsIGludCBsaW5lLCBpbnQgKmxpbmVzKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGJhY2t3YXJkcywgZm9yd2FyZHM7CisKKwlpZiAoZnJhZ3NpemUgPiBzaXplKQorCQlyZXR1cm4gLTE7CisKKwlzdGFydCA9IDA7CisJaWYgKGxpbmUgPiAxKSB7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwkJaSA9IGxpbmUtMTsKKwkJd2hpbGUgKG9mZnNldCArIGZyYWdzaXplIDw9IHNpemUpIHsKKwkJCWlmIChidWZbb2Zmc2V0KytdID09ICdcbicpIHsKKwkJCQlzdGFydCA9IG9mZnNldDsKKwkJCQlpZiAoIS0taSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBFeGFjdCBsaW5lIG51bWJlcj8gKi8KKwlpZiAoIW1lbWNtcChidWYgKyBzdGFydCwgZnJhZ21lbnQsIGZyYWdzaXplKSkKKwkJcmV0dXJuIHN0YXJ0OworCisJLyoKKwkgKiBUaGVyZSdzIHByb2JhYmx5IHNvbWUgc21hcnQgd2F5IHRvIGRvIHRoaXMsIGJ1dCBJJ2xsIGxlYXZlCisJICogdGhhdCB0byB0aGUgc21hcnQgYW5kIGJlYXV0aWZ1bCBwZW9wbGUuIEknbSBzaW1wbGUgYW5kIHN0dXBpZC4KKwkgKi8KKwliYWNrd2FyZHMgPSBzdGFydDsKKwlmb3J3YXJkcyA9IHN0YXJ0OworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgdHJ5OworCQlpbnQgbjsKKworCQkvKiAiYmFja3dhcmQiICovCisJCWlmIChpICYgMSkgeworCQkJaWYgKCFiYWNrd2FyZHMpIHsKKwkJCQlpZiAoZm9yd2FyZHMgKyBmcmFnc2l6ZSA+IHNpemUpCisJCQkJCWJyZWFrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZG8geworCQkJCS0tYmFja3dhcmRzOworCQkJfSB3aGlsZSAoYmFja3dhcmRzICYmIGJ1ZltiYWNrd2FyZHMtMV0gIT0gJ1xuJyk7CisJCQl0cnkgPSBiYWNrd2FyZHM7CisJCX0gZWxzZSB7CisJCQl3aGlsZSAoZm9yd2FyZHMgKyBmcmFnc2l6ZSA8PSBzaXplKSB7CisJCQkJaWYgKGJ1Zltmb3J3YXJkcysrXSA9PSAnXG4nKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXRyeSA9IGZvcndhcmRzOworCQl9CisKKwkJaWYgKHRyeSArIGZyYWdzaXplID4gc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKGJ1ZiArIHRyeSwgZnJhZ21lbnQsIGZyYWdzaXplKSkKKwkJCWNvbnRpbnVlOworCQluID0gKGkgPj4gMSkrMTsKKwkJaWYgKGkgJiAxKQorCQkJbiA9IC1uOworCQkqbGluZXMgPSBuOworCQlyZXR1cm4gdHJ5OworCX0KKworCS8qCisJICogV2Ugc2hvdWxkIHN0YXJ0IHNlYXJjaGluZyBmb3J3YXJkIGFuZCBiYWNrd2FyZC4KKwkgKi8KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9maXJzdF9saW5lKGNvbnN0IGNoYXIgKipyYnVmLCBpbnQgKnJzaXplKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9ICpyYnVmOworCWludCBzaXplID0gKnJzaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCW9mZnNldCA9IDA7CisJd2hpbGUgKG9mZnNldCA8PSBzaXplKSB7CisJCWlmIChidWZbb2Zmc2V0KytdID09ICdcbicpCisJCQlicmVhazsKKwl9CisJKnJzaXplID0gc2l6ZSAtIG9mZnNldDsKKwkqcmJ1ZiA9IGJ1ZiArIG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xhc3RfbGluZShjb25zdCBjaGFyICoqcmJ1ZiwgaW50ICpyc2l6ZSkKK3sKKwljb25zdCBjaGFyICpidWYgPSAqcmJ1ZjsKKwlpbnQgc2l6ZSA9ICpyc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlvZmZzZXQgPSBzaXplIC0gMTsKKwl3aGlsZSAob2Zmc2V0ID4gMCkgeworCQlpZiAoYnVmWy0tb2Zmc2V0XSA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCSpyc2l6ZSA9IG9mZnNldCArIDE7Cit9CisKK3N0cnVjdCBidWZmZXJfZGVzYyB7CisJY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFsbG9jOworfTsKKworc3RhdGljIGludCBhcHBseV9saW5lKGNoYXIgKm91dHB1dCwgY29uc3QgY2hhciAqcGF0Y2gsIGludCBwbGVuKQoreworCS8qIHBsZW4gaXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGNvcGllZCBmcm9tIHBhdGNoLAorCSAqIHN0YXJ0aW5nIGF0IHBhdGNoKzEgKHBhdGNoWzBdIGlzICcrJykuICBUeXBpY2FsbHkKKwkgKiBwYXRjaFtwbGVuXSBpcyAnXG4nLgorCSAqLworCWludCBhZGRfbmxfdG9fdGFpbCA9IDA7CisJaWYgKChuZXdfd2hpdGVzcGFjZSA9PSBzdHJpcF93aGl0ZXNwYWNlKSAmJgorCSAgICAxIDwgcGxlbiAmJiBpc3NwYWNlKHBhdGNoW3BsZW4tMV0pKSB7CisJCWlmIChwYXRjaFtwbGVuXSA9PSAnXG4nKQorCQkJYWRkX25sX3RvX3RhaWwgPSAxOworCQlwbGVuLS07CisJCXdoaWxlICgwIDwgcGxlbiAmJiBpc3NwYWNlKHBhdGNoW3BsZW5dKSkKKwkJCXBsZW4tLTsKKwkJYXBwbGllZF9hZnRlcl9zdHJpcHBpbmcrKzsKKwl9CisJbWVtY3B5KG91dHB1dCwgcGF0Y2ggKyAxLCBwbGVuKTsKKwlpZiAoYWRkX25sX3RvX3RhaWwpCisJCW91dHB1dFtwbGVuKytdID0gJ1xuJzsKKwlyZXR1cm4gcGxlbjsKK30KKworc3RhdGljIGludCBhcHBseV9vbmVfZnJhZ21lbnQoc3RydWN0IGJ1ZmZlcl9kZXNjICpkZXNjLCBzdHJ1Y3QgZnJhZ21lbnQgKmZyYWcsCisJaW50IHJldmVyc2UsIGludCBpbmFjY3VyYXRlX2VvZikKK3sKKwlpbnQgbWF0Y2hfYmVnaW5uaW5nLCBtYXRjaF9lbmQ7CisJY2hhciAqYnVmID0gZGVzYy0+YnVmZmVyOworCWNvbnN0IGNoYXIgKnBhdGNoID0gZnJhZy0+cGF0Y2g7CisJaW50IG9mZnNldCwgc2l6ZSA9IGZyYWctPnNpemU7CisJY2hhciAqb2xkID0geG1hbGxvYyhzaXplKTsKKwljaGFyICpuZXcgPSB4bWFsbG9jKHNpemUpOworCWNvbnN0IGNoYXIgKm9sZGxpbmVzLCAqbmV3bGluZXM7CisJaW50IG9sZHNpemUgPSAwLCBuZXdzaXplID0gMDsKKwl1bnNpZ25lZCBsb25nIGxlYWRpbmcsIHRyYWlsaW5nOworCWludCBwb3MsIGxpbmVzOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWNoYXIgZmlyc3Q7CisJCWludCBsZW4gPSBsaW5lbGVuKHBhdGNoLCBzaXplKTsKKwkJaW50IHBsZW47CisKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKworCQkvKgorCQkgKiAicGxlbiIgaXMgaG93IG11Y2ggb2YgdGhlIGxpbmUgd2Ugc2hvdWxkIHVzZSBmb3IKKwkJICogdGhlIGFjdHVhbCBwYXRjaCBkYXRhLiBOb3JtYWxseSB3ZSBqdXN0IHJlbW92ZSB0aGUKKwkJICogZmlyc3QgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLCBidXQgaWYgdGhlIGxpbmUgaXMKKwkJICogZm9sbG93ZWQgYnkgIlwgTm8gbmV3bGluZSIsIHRoZW4gd2UgYWxzbyByZW1vdmUgdGhlCisJCSAqIGxhc3Qgb25lICh3aGljaCBpcyB0aGUgbmV3bGluZSwgb2YgY291cnNlKS4KKwkJICovCisJCXBsZW4gPSBsZW4tMTsKKwkJaWYgKGxlbiA8IHNpemUgJiYgcGF0Y2hbbGVuXSA9PSAnXFwnKQorCQkJcGxlbi0tOworCQlmaXJzdCA9ICpwYXRjaDsKKwkJaWYgKHJldmVyc2UpIHsKKwkJCWlmIChmaXJzdCA9PSAnLScpCisJCQkJZmlyc3QgPSAnKyc7CisJCQllbHNlIGlmIChmaXJzdCA9PSAnKycpCisJCQkJZmlyc3QgPSAnLSc7CisJCX0KKwkJc3dpdGNoIChmaXJzdCkgeworCQljYXNlICcgJzoKKwkJY2FzZSAnLSc6CisJCQltZW1jcHkob2xkICsgb2xkc2l6ZSwgcGF0Y2ggKyAxLCBwbGVuKTsKKwkJCW9sZHNpemUgKz0gcGxlbjsKKwkJCWlmIChmaXJzdCA9PSAnLScpCisJCQkJYnJlYWs7CisJCS8qIEZhbGwtdGhyb3VnaCBmb3IgJyAnICovCisJCWNhc2UgJysnOgorCQkJaWYgKGZpcnN0ICE9ICcrJyB8fCAhbm9fYWRkKQorCQkJCW5ld3NpemUgKz0gYXBwbHlfbGluZShuZXcgKyBuZXdzaXplLCBwYXRjaCwKKwkJCQkJCSAgICAgIHBsZW4pOworCQkJYnJlYWs7CisJCWNhc2UgJ0AnOiBjYXNlICdcXCc6CisJCQkvKiBJZ25vcmUgaXQsIHdlIGFscmVhZHkgaGFuZGxlZCBpdCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJcGF0Y2ggKz0gbGVuOworCQlzaXplIC09IGxlbjsKKwl9CisKKwlpZiAoaW5hY2N1cmF0ZV9lb2YgJiYgb2xkc2l6ZSA+IDAgJiYgb2xkW29sZHNpemUgLSAxXSA9PSAnXG4nICYmCisJCQluZXdzaXplID4gMCAmJiBuZXdbbmV3c2l6ZSAtIDFdID09ICdcbicpIHsKKwkJb2xkc2l6ZS0tOworCQluZXdzaXplLS07CisJfQorCisJb2xkbGluZXMgPSBvbGQ7CisJbmV3bGluZXMgPSBuZXc7CisJbGVhZGluZyA9IGZyYWctPmxlYWRpbmc7CisJdHJhaWxpbmcgPSBmcmFnLT50cmFpbGluZzsKKworCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbGVhZGluZy90cmFpbGluZyBkYXRhIGluIHRoZSBwYXRjaCwKKwkgKiB3ZSB3YW50IGl0IHRvIG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBmaWxlLgorCSAqLworCW1hdGNoX2JlZ2lubmluZyA9ICFsZWFkaW5nICYmIChmcmFnLT5vbGRwb3MgPT0gMSk7CisJbWF0Y2hfZW5kID0gIXRyYWlsaW5nOworCisJbGluZXMgPSAwOworCXBvcyA9IGZyYWctPm5ld3BvczsKKwlmb3IgKDs7KSB7CisJCW9mZnNldCA9IGZpbmRfb2Zmc2V0KGJ1ZiwgZGVzYy0+c2l6ZSwgb2xkbGluZXMsIG9sZHNpemUsIHBvcywgJmxpbmVzKTsKKwkJaWYgKG1hdGNoX2VuZCAmJiBvZmZzZXQgKyBvbGRzaXplICE9IGRlc2MtPnNpemUpCisJCQlvZmZzZXQgPSAtMTsKKwkJaWYgKG1hdGNoX2JlZ2lubmluZyAmJiBvZmZzZXQpCisJCQlvZmZzZXQgPSAtMTsKKwkJaWYgKG9mZnNldCA+PSAwKSB7CisJCQlpbnQgZGlmZiA9IG5ld3NpemUgLSBvbGRzaXplOworCQkJdW5zaWduZWQgbG9uZyBzaXplID0gZGVzYy0+c2l6ZSArIGRpZmY7CisJCQl1bnNpZ25lZCBsb25nIGFsbG9jID0gZGVzYy0+YWxsb2M7CisKKwkJCS8qIFdhcm4gaWYgaXQgd2FzIG5lY2Vzc2FyeSB0byByZWR1Y2UgdGhlIG51bWJlcgorCQkJICogb2YgY29udGV4dCBsaW5lcy4KKwkJCSAqLworCQkJaWYgKChsZWFkaW5nICE9IGZyYWctPmxlYWRpbmcpIHx8ICh0cmFpbGluZyAhPSBmcmFnLT50cmFpbGluZykpCisJCQkJZnByaW50ZihzdGRlcnIsICJDb250ZXh0IHJlZHVjZWQgdG8gKCVsZC8lbGQpIHRvIGFwcGx5IGZyYWdtZW50IGF0ICVkXG4iLAorCQkJCQlsZWFkaW5nLCB0cmFpbGluZywgcG9zICsgbGluZXMpOworCisJCQlpZiAoc2l6ZSA+IGFsbG9jKSB7CisJCQkJYWxsb2MgPSBzaXplICsgODE5MjsKKwkJCQlkZXNjLT5hbGxvYyA9IGFsbG9jOworCQkJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgYWxsb2MpOworCQkJCWRlc2MtPmJ1ZmZlciA9IGJ1ZjsKKwkJCX0KKwkJCWRlc2MtPnNpemUgPSBzaXplOworCQkJbWVtbW92ZShidWYgKyBvZmZzZXQgKyBuZXdzaXplLCBidWYgKyBvZmZzZXQgKyBvbGRzaXplLCBzaXplIC0gb2Zmc2V0IC0gbmV3c2l6ZSk7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCBuZXdsaW5lcywgbmV3c2l6ZSk7CisJCQlvZmZzZXQgPSAwOworCisJCQlicmVhazsKKwkJfQorCisJCS8qIEFtIEkgYXQgbXkgY29udGV4dCBsaW1pdHM/ICovCisJCWlmICgobGVhZGluZyA8PSBwX2NvbnRleHQpICYmICh0cmFpbGluZyA8PSBwX2NvbnRleHQpKQorCQkJYnJlYWs7CisJCWlmIChtYXRjaF9iZWdpbm5pbmcgfHwgbWF0Y2hfZW5kKSB7CisJCQltYXRjaF9iZWdpbm5pbmcgPSBtYXRjaF9lbmQgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJLyogUmVkdWNlIHRoZSBudW1iZXIgb2YgY29udGV4dCBsaW5lcworCQkgKiBSZWR1Y2UgYm90aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBpZiB0aGV5IGFyZSBlcXVhbAorCQkgKiBvdGhlcndpc2UganVzdCByZWR1Y2UgdGhlIGxhcmdlciBjb250ZXh0LgorCQkgKi8KKwkJaWYgKGxlYWRpbmcgPj0gdHJhaWxpbmcpIHsKKwkJCXJlbW92ZV9maXJzdF9saW5lKCZvbGRsaW5lcywgJm9sZHNpemUpOworCQkJcmVtb3ZlX2ZpcnN0X2xpbmUoJm5ld2xpbmVzLCAmbmV3c2l6ZSk7CisJCQlwb3MtLTsKKwkJCWxlYWRpbmctLTsKKwkJfQorCQlpZiAodHJhaWxpbmcgPiBsZWFkaW5nKSB7CisJCQlyZW1vdmVfbGFzdF9saW5lKCZvbGRsaW5lcywgJm9sZHNpemUpOworCQkJcmVtb3ZlX2xhc3RfbGluZSgmbmV3bGluZXMsICZuZXdzaXplKTsKKwkJCXRyYWlsaW5nLS07CisJCX0KKwl9CisKKwlmcmVlKG9sZCk7CisJZnJlZShuZXcpOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBjaGFyICppbmZsYXRlX2l0KGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCXVuc2lnbmVkIGxvbmcgaW5mbGF0ZWRfc2l6ZSkKK3sKKwl6X3N0cmVhbSBzdHJlYW07CisJdm9pZCAqb3V0OworCWludCBzdDsKKworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisKKwlzdHJlYW0ubmV4dF9pbiA9ICh1bnNpZ25lZCBjaGFyICopZGF0YTsKKwlzdHJlYW0uYXZhaWxfaW4gPSBzaXplOworCXN0cmVhbS5uZXh0X291dCA9IG91dCA9IHhtYWxsb2MoaW5mbGF0ZWRfc2l6ZSk7CisJc3RyZWFtLmF2YWlsX291dCA9IGluZmxhdGVkX3NpemU7CisJaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJc3QgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKwlpZiAoKHN0ICE9IFpfU1RSRUFNX0VORCkgfHwgc3RyZWFtLnRvdGFsX291dCAhPSBpbmZsYXRlZF9zaXplKSB7CisJCWZyZWUob3V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfYmluYXJ5X2ZyYWdtZW50KHN0cnVjdCBidWZmZXJfZGVzYyAqZGVzYywgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwl1bnNpZ25lZCBsb25nIGRzdF9zaXplOworCXN0cnVjdCBmcmFnbWVudCAqZnJhZ21lbnQgPSBwYXRjaC0+ZnJhZ21lbnRzOworCXZvaWQgKmRhdGE7CisJdm9pZCAqcmVzdWx0OworCisJLyogQmluYXJ5IHBhdGNoIGlzIGlycmV2ZXJzaWJsZSAqLworCWlmIChwYXRjaC0+aXNfcmV2ZXJzZSkKKwkJcmV0dXJuIGVycm9yKCJjYW5ub3QgcmV2ZXJzZS1hcHBseSBhIGJpbmFyeSBwYXRjaCB0byAnJXMnIiwKKwkJCSAgICAgcGF0Y2gtPm5ld19uYW1lCisJCQkgICAgID8gcGF0Y2gtPm5ld19uYW1lIDogcGF0Y2gtPm9sZF9uYW1lKTsKKworCWRhdGEgPSBpbmZsYXRlX2l0KGZyYWdtZW50LT5wYXRjaCwgZnJhZ21lbnQtPnNpemUsCisJCQkgIHBhdGNoLT5kZWZsYXRlX29yaWdsZW4pOworCWlmICghZGF0YSkKKwkJcmV0dXJuIGVycm9yKCJjb3JydXB0IHBhdGNoIGRhdGEiKTsKKwlzd2l0Y2ggKHBhdGNoLT5pc19iaW5hcnkpIHsKKwljYXNlIEJJTkFSWV9ERUxUQV9ERUZMQVRFRDoKKwkJcmVzdWx0ID0gcGF0Y2hfZGVsdGEoZGVzYy0+YnVmZmVyLCBkZXNjLT5zaXplLAorCQkJCSAgICAgZGF0YSwKKwkJCQkgICAgIHBhdGNoLT5kZWZsYXRlX29yaWdsZW4sCisJCQkJICAgICAmZHN0X3NpemUpOworCQlmcmVlKGRlc2MtPmJ1ZmZlcik7CisJCWRlc2MtPmJ1ZmZlciA9IHJlc3VsdDsKKwkJZnJlZShkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBCSU5BUllfTElURVJBTF9ERUZMQVRFRDoKKwkJZnJlZShkZXNjLT5idWZmZXIpOworCQlkZXNjLT5idWZmZXIgPSBkYXRhOworCQlkc3Rfc2l6ZSA9IHBhdGNoLT5kZWZsYXRlX29yaWdsZW47CisJCWJyZWFrOworCX0KKwlpZiAoIWRlc2MtPmJ1ZmZlcikKKwkJcmV0dXJuIC0xOworCWRlc2MtPnNpemUgPSBkZXNjLT5hbGxvYyA9IGRzdF9zaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGx5X2JpbmFyeShzdHJ1Y3QgYnVmZmVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IHBhdGNoLT5vbGRfbmFtZSA/IHBhdGNoLT5vbGRfbmFtZSA6IHBhdGNoLT5uZXdfbmFtZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgaGRyWzUwXTsKKwlpbnQgaGRybGVuOworCisJaWYgKCFhbGxvd19iaW5hcnlfcmVwbGFjZW1lbnQpCisJCXJldHVybiBlcnJvcigiY2Fubm90IGFwcGx5IGJpbmFyeSBwYXRjaCB0byAnJXMnICIKKwkJCSAgICAgIndpdGhvdXQgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQiLAorCQkJICAgICBuYW1lKTsKKworCS8qIEZvciBzYWZldHksIHdlIHJlcXVpcmUgcGF0Y2ggaW5kZXggbGluZSB0byBjb250YWluCisJICogZnVsbCA0MC1ieXRlIHRleHR1YWwgU0hBMSBmb3Igb2xkIGFuZCBuZXcsIGF0IGxlYXN0IGZvciBub3cuCisJICovCisJaWYgKHN0cmxlbihwYXRjaC0+b2xkX3NoYTFfcHJlZml4KSAhPSA0MCB8fAorCSAgICBzdHJsZW4ocGF0Y2gtPm5ld19zaGExX3ByZWZpeCkgIT0gNDAgfHwKKwkgICAgZ2V0X3NoYTFfaGV4KHBhdGNoLT5vbGRfc2hhMV9wcmVmaXgsIHNoYTEpIHx8CisJICAgIGdldF9zaGExX2hleChwYXRjaC0+bmV3X3NoYTFfcHJlZml4LCBzaGExKSkKKwkJcmV0dXJuIGVycm9yKCJjYW5ub3QgYXBwbHkgYmluYXJ5IHBhdGNoIHRvICclcycgIgorCQkJICAgICAid2l0aG91dCBmdWxsIGluZGV4IGxpbmUiLCBuYW1lKTsKKworCWlmIChwYXRjaC0+b2xkX25hbWUpIHsKKwkJLyogU2VlIGlmIHRoZSBvbGQgb25lIG1hdGNoZXMgd2hhdCB0aGUgcGF0Y2gKKwkJICogYXBwbGllcyB0by4KKwkJICovCisJCXdyaXRlX3NoYTFfZmlsZV9wcmVwYXJlKGRlc2MtPmJ1ZmZlciwgZGVzYy0+c2l6ZSwKKwkJCQkJYmxvYl90eXBlLCBzaGExLCBoZHIsICZoZHJsZW4pOworCQlpZiAoc3RyY21wKHNoYTFfdG9faGV4KHNoYTEpLCBwYXRjaC0+b2xkX3NoYTFfcHJlZml4KSkKKwkJCXJldHVybiBlcnJvcigidGhlIHBhdGNoIGFwcGxpZXMgdG8gJyVzJyAoJXMpLCAiCisJCQkJICAgICAid2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlICIKKwkJCQkgICAgICJjdXJyZW50IGNvbnRlbnRzLiIsCisJCQkJICAgICBuYW1lLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCWVsc2UgeworCQkvKiBPdGhlcndpc2UsIHRoZSBvbGQgb25lIG11c3QgYmUgZW1wdHkuICovCisJCWlmIChkZXNjLT5zaXplKQorCQkJcmV0dXJuIGVycm9yKCJ0aGUgcGF0Y2ggYXBwbGllcyB0byBhbiBlbXB0eSAiCisJCQkJICAgICAiJyVzJyBidXQgaXQgaXMgbm90IGVtcHR5IiwgbmFtZSk7CisJfQorCisJZ2V0X3NoYTFfaGV4KHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgsIHNoYTEpOworCWlmICghbWVtY21wKHNoYTEsIG51bGxfc2hhMSwgMjApKSB7CisJCWZyZWUoZGVzYy0+YnVmZmVyKTsKKwkJZGVzYy0+YWxsb2MgPSBkZXNjLT5zaXplID0gMDsKKwkJZGVzYy0+YnVmZmVyID0gTlVMTDsKKwkJcmV0dXJuIDA7IC8qIGRlbGV0aW9uIHBhdGNoICovCisJfQorCisJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpIHsKKwkJLyogV2UgYWxyZWFkeSBoYXZlIHRoZSBwb3N0aW1hZ2UgKi8KKwkJY2hhciB0eXBlWzEwXTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCWZyZWUoZGVzYy0+YnVmZmVyKTsKKwkJZGVzYy0+YnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCQlpZiAoIWRlc2MtPmJ1ZmZlcikKKwkJCXJldHVybiBlcnJvcigidGhlIG5lY2Vzc2FyeSBwb3N0aW1hZ2UgJXMgZm9yICIKKwkJCQkgICAgICInJXMnIGNhbm5vdCBiZSByZWFkIiwKKwkJCQkgICAgIHBhdGNoLT5uZXdfc2hhMV9wcmVmaXgsIG5hbWUpOworCQlkZXNjLT5hbGxvYyA9IGRlc2MtPnNpemUgPSBzaXplOworCX0KKwllbHNlIHsKKwkJLyogV2UgaGF2ZSB2ZXJpZmllZCBkZXNjIG1hdGNoZXMgdGhlIHByZWltYWdlOworCQkgKiBhcHBseSB0aGUgcGF0Y2ggZGF0YSB0byBpdCwgd2hpY2ggaXMgc3RvcmVkCisJCSAqIGluIHRoZSBwYXRjaC0+ZnJhZ21lbnRzLT57cGF0Y2gsc2l6ZX0uCisJCSAqLworCQlpZiAoYXBwbHlfYmluYXJ5X2ZyYWdtZW50KGRlc2MsIHBhdGNoKSkKKwkJCXJldHVybiBlcnJvcigiYmluYXJ5IHBhdGNoIGRvZXMgbm90IGFwcGx5IHRvICclcyciLAorCQkJCSAgICAgbmFtZSk7CisKKwkJLyogdmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzICovCisJCXdyaXRlX3NoYTFfZmlsZV9wcmVwYXJlKGRlc2MtPmJ1ZmZlciwgZGVzYy0+c2l6ZSwgYmxvYl90eXBlLAorCQkJCQlzaGExLCBoZHIsICZoZHJsZW4pOworCQlpZiAoc3RyY21wKHNoYTFfdG9faGV4KHNoYTEpLCBwYXRjaC0+bmV3X3NoYTFfcHJlZml4KSkKKwkJCXJldHVybiBlcnJvcigiYmluYXJ5IHBhdGNoIHRvICclcycgY3JlYXRlcyBpbmNvcnJlY3QgcmVzdWx0IiwgbmFtZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfZnJhZ21lbnRzKHN0cnVjdCBidWZmZXJfZGVzYyAqZGVzYywgc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3QgZnJhZ21lbnQgKmZyYWcgPSBwYXRjaC0+ZnJhZ21lbnRzOworCWNvbnN0IGNoYXIgKm5hbWUgPSBwYXRjaC0+b2xkX25hbWUgPyBwYXRjaC0+b2xkX25hbWUgOiBwYXRjaC0+bmV3X25hbWU7CisKKwlpZiAocGF0Y2gtPmlzX2JpbmFyeSkKKwkJcmV0dXJuIGFwcGx5X2JpbmFyeShkZXNjLCBwYXRjaCk7CisKKwl3aGlsZSAoZnJhZykgeworCQlpZiAoYXBwbHlfb25lX2ZyYWdtZW50KGRlc2MsIGZyYWcsIHBhdGNoLT5pc19yZXZlcnNlLAorCQkJCQlwYXRjaC0+aW5hY2N1cmF0ZV9lb2YpIDwgMCkKKwkJCXJldHVybiBlcnJvcigicGF0Y2ggZmFpbGVkOiAlczolbGQiLAorCQkJCSAgICAgbmFtZSwgZnJhZy0+b2xkcG9zKTsKKwkJZnJhZyA9IGZyYWctPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGx5X2RhdGEoc3RydWN0IHBhdGNoICpwYXRjaCwgc3RydWN0IHN0YXQgKnN0LCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemUsIGFsbG9jOworCXN0cnVjdCBidWZmZXJfZGVzYyBkZXNjOworCisJc2l6ZSA9IDA7CisJYWxsb2MgPSAwOworCWJ1ZiA9IE5VTEw7CisJaWYgKGNhY2hlZCkgeworCQlpZiAoY2UpIHsKKwkJCWNoYXIgdHlwZVsyMF07CisJCQlidWYgPSByZWFkX3NoYTFfZmlsZShjZS0+c2hhMSwgdHlwZSwgJnNpemUpOworCQkJaWYgKCFidWYpCisJCQkJcmV0dXJuIGVycm9yKCJyZWFkIG9mICVzIGZhaWxlZCIsCisJCQkJCSAgICAgcGF0Y2gtPm9sZF9uYW1lKTsKKwkJCWFsbG9jID0gc2l6ZTsKKwkJfQorCX0KKwllbHNlIGlmIChwYXRjaC0+b2xkX25hbWUpIHsKKwkJc2l6ZSA9IHN0LT5zdF9zaXplOworCQlhbGxvYyA9IHNpemUgKyA4MTkyOworCQlidWYgPSB4bWFsbG9jKGFsbG9jKTsKKwkJaWYgKHJlYWRfb2xkX2RhdGEoc3QsIHBhdGNoLT5vbGRfbmFtZSwgYnVmLCBhbGxvYykgIT0gc2l6ZSkKKwkJCXJldHVybiBlcnJvcigicmVhZCBvZiAlcyBmYWlsZWQiLCBwYXRjaC0+b2xkX25hbWUpOworCX0KKworCWRlc2Muc2l6ZSA9IHNpemU7CisJZGVzYy5hbGxvYyA9IGFsbG9jOworCWRlc2MuYnVmZmVyID0gYnVmOworCWlmIChhcHBseV9mcmFnbWVudHMoJmRlc2MsIHBhdGNoKSA8IDApCisJCXJldHVybiAtMTsKKworCS8qIE5VTCB0ZXJtaW5hdGUgdGhlIHJlc3VsdCAqLworCWlmIChkZXNjLmFsbG9jIDw9IGRlc2Muc2l6ZSkKKwkJZGVzYy5idWZmZXIgPSB4cmVhbGxvYyhkZXNjLmJ1ZmZlciwgZGVzYy5zaXplICsgMSk7CisJZGVzYy5idWZmZXJbZGVzYy5zaXplXSA9IDA7CisKKwlwYXRjaC0+cmVzdWx0ID0gZGVzYy5idWZmZXI7CisJcGF0Y2gtPnJlc3VsdHNpemUgPSBkZXNjLnNpemU7CisKKwlpZiAocGF0Y2gtPmlzX2RlbGV0ZSAmJiBwYXRjaC0+cmVzdWx0c2l6ZSkKKwkJcmV0dXJuIGVycm9yKCJyZW1vdmFsIHBhdGNoIGxlYXZlcyBmaWxlIGNvbnRlbnRzIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19wYXRjaChzdHJ1Y3QgcGF0Y2ggKnBhdGNoLCBzdHJ1Y3QgcGF0Y2ggKnByZXZfcGF0Y2gpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqb2xkX25hbWUgPSBwYXRjaC0+b2xkX25hbWU7CisJY29uc3QgY2hhciAqbmV3X25hbWUgPSBwYXRjaC0+bmV3X25hbWU7CisJY29uc3QgY2hhciAqbmFtZSA9IG9sZF9uYW1lID8gb2xkX25hbWUgOiBuZXdfbmFtZTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gTlVMTDsKKwlpbnQgb2tfaWZfZXhpc3RzOworCisJaWYgKG9sZF9uYW1lKSB7CisJCWludCBjaGFuZ2VkID0gMDsKKwkJaW50IHN0YXRfcmV0ID0gMDsKKwkJdW5zaWduZWQgc3RfbW9kZSA9IDA7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdGF0X3JldCA9IGxzdGF0KG9sZF9uYW1lLCAmc3QpOworCQlpZiAoY2hlY2tfaW5kZXgpIHsKKwkJCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhvbGRfbmFtZSwgc3RybGVuKG9sZF9uYW1lKSk7CisJCQlpZiAocG9zIDwgMCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBleGlzdCBpbiBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChzdGF0X3JldCA8IDApIHsKKwkJCQlzdHJ1Y3QgY2hlY2tvdXQgY29zdGF0ZTsKKwkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG9sZF9uYW1lLAorCQkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCS8qIGNoZWNrb3V0ICovCisJCQkJY29zdGF0ZS5iYXNlX2RpciA9ICIiOworCQkJCWNvc3RhdGUuYmFzZV9kaXJfbGVuID0gMDsKKwkJCQljb3N0YXRlLmZvcmNlID0gMDsKKwkJCQljb3N0YXRlLnF1aWV0ID0gMDsKKwkJCQljb3N0YXRlLm5vdF9uZXcgPSAwOworCQkJCWNvc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisJCQkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLAorCQkJCQkJICAgJmNvc3RhdGUsCisJCQkJCQkgICBOVUxMKSB8fAorCQkJCSAgICBsc3RhdChvbGRfbmFtZSwgJnN0KSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKCFjYWNoZWQpCisJCQkJY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMSk7CisJCQlpZiAoY2hhbmdlZCkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiBkb2VzIG5vdCBtYXRjaCBpbmRleCIsCisJCQkJCSAgICAgb2xkX25hbWUpOworCQkJaWYgKGNhY2hlZCkKKwkJCQlzdF9tb2RlID0gbnRvaGwoY2UtPmNlX21vZGUpOworCQl9CisJCWVsc2UgaWYgKHN0YXRfcmV0IDwgMCkKKwkJCXJldHVybiBlcnJvcigiJXM6ICVzIiwgb2xkX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKCFjYWNoZWQpCisJCQlzdF9tb2RlID0gbnRvaGwoY3JlYXRlX2NlX21vZGUoc3Quc3RfbW9kZSkpOworCisJCWlmIChwYXRjaC0+aXNfbmV3IDwgMCkKKwkJCXBhdGNoLT5pc19uZXcgPSAwOworCQlpZiAoIXBhdGNoLT5vbGRfbW9kZSkKKwkJCXBhdGNoLT5vbGRfbW9kZSA9IHN0X21vZGU7CisJCWlmICgoc3RfbW9kZSBeIHBhdGNoLT5vbGRfbW9kZSkgJiBTX0lGTVQpCisJCQlyZXR1cm4gZXJyb3IoIiVzOiB3cm9uZyB0eXBlIiwgb2xkX25hbWUpOworCQlpZiAoc3RfbW9kZSAhPSBwYXRjaC0+b2xkX21vZGUpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICVzIGhhcyB0eXBlICVvLCBleHBlY3RlZCAlb1xuIiwKKwkJCQlvbGRfbmFtZSwgc3RfbW9kZSwgcGF0Y2gtPm9sZF9tb2RlKTsKKwl9CisKKwlpZiAobmV3X25hbWUgJiYgcHJldl9wYXRjaCAmJiBwcmV2X3BhdGNoLT5pc19kZWxldGUgJiYKKwkgICAgIXN0cmNtcChwcmV2X3BhdGNoLT5vbGRfbmFtZSwgbmV3X25hbWUpKQorCQkvKiBBIHR5cGUtY2hhbmdlIGRpZmYgaXMgYWx3YXlzIHNwbGl0IGludG8gYSBwYXRjaCB0bworCQkgKiBkZWxldGUgb2xkLCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHBhdGNoIHRvCisJCSAqIGNyZWF0ZSBuZXcgKHNlZSBkaWZmLmM6OnJ1bl9kaWZmKCkpOyBpbiBzdWNoIGEgY2FzZQorCQkgKiBpdCBpcyBPayB0aGF0IHRoZSBlbnRyeSB0byBiZSBkZWxldGVkIGJ5IHRoZQorCQkgKiBwcmV2aW91cyBwYXRjaCBpcyBzdGlsbCBpbiB0aGUgd29ya2luZyB0cmVlIGFuZCBpbgorCQkgKiB0aGUgaW5kZXguCisJCSAqLworCQlva19pZl9leGlzdHMgPSAxOworCWVsc2UKKwkJb2tfaWZfZXhpc3RzID0gMDsKKworCWlmIChuZXdfbmFtZSAmJiAocGF0Y2gtPmlzX25ldyB8IHBhdGNoLT5pc19yZW5hbWUgfCBwYXRjaC0+aXNfY29weSkpIHsKKwkJaWYgKGNoZWNrX2luZGV4ICYmCisJCSAgICBjYWNoZV9uYW1lX3BvcyhuZXdfbmFtZSwgc3RybGVuKG5ld19uYW1lKSkgPj0gMCAmJgorCQkgICAgIW9rX2lmX2V4aXN0cykKKwkJCXJldHVybiBlcnJvcigiJXM6IGFscmVhZHkgZXhpc3RzIGluIGluZGV4IiwgbmV3X25hbWUpOworCQlpZiAoIWNhY2hlZCkgeworCQkJc3RydWN0IHN0YXQgbnN0OworCQkJaWYgKCFsc3RhdChuZXdfbmFtZSwgJm5zdCkpIHsKKwkJCQlpZiAoU19JU0RJUihuc3Quc3RfbW9kZSkgfHwgb2tfaWZfZXhpc3RzKQorCQkJCQk7IC8qIG9rICovCisJCQkJZWxzZQorCQkJCQlyZXR1cm4gZXJyb3IoIiVzOiBhbHJlYWR5IGV4aXN0cyBpbiB3b3JraW5nIGRpcmVjdG9yeSIsIG5ld19uYW1lKTsKKwkJCX0KKwkJCWVsc2UgaWYgKChlcnJubyAhPSBFTk9FTlQpICYmIChlcnJubyAhPSBFTk9URElSKSkKKwkJCQlyZXR1cm4gZXJyb3IoIiVzOiAlcyIsIG5ld19uYW1lLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWlmICghcGF0Y2gtPm5ld19tb2RlKSB7CisJCQlpZiAocGF0Y2gtPmlzX25ldykKKwkJCQlwYXRjaC0+bmV3X21vZGUgPSBTX0lGUkVHIHwgMDY0NDsKKwkJCWVsc2UKKwkJCQlwYXRjaC0+bmV3X21vZGUgPSBwYXRjaC0+b2xkX21vZGU7CisJCX0KKwl9CisKKwlpZiAobmV3X25hbWUgJiYgb2xkX25hbWUpIHsKKwkJaW50IHNhbWUgPSAhc3RyY21wKG9sZF9uYW1lLCBuZXdfbmFtZSk7CisJCWlmICghcGF0Y2gtPm5ld19tb2RlKQorCQkJcGF0Y2gtPm5ld19tb2RlID0gcGF0Y2gtPm9sZF9tb2RlOworCQlpZiAoKHBhdGNoLT5vbGRfbW9kZSBeIHBhdGNoLT5uZXdfbW9kZSkgJiBTX0lGTVQpCisJCQlyZXR1cm4gZXJyb3IoIm5ldyBtb2RlICglbykgb2YgJXMgZG9lcyBub3QgbWF0Y2ggb2xkIG1vZGUgKCVvKSVzJXMiLAorCQkJCXBhdGNoLT5uZXdfbW9kZSwgbmV3X25hbWUsIHBhdGNoLT5vbGRfbW9kZSwKKwkJCQlzYW1lID8gIiIgOiAiIG9mICIsIHNhbWUgPyAiIiA6IG9sZF9uYW1lKTsKKwl9CisKKwlpZiAoYXBwbHlfZGF0YShwYXRjaCwgJnN0LCBjZSkgPCAwKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBwYXRjaCBkb2VzIG5vdCBhcHBseSIsIG5hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhdGNoX2xpc3Qoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3QgcGF0Y2ggKnByZXZfcGF0Y2ggPSBOVUxMOworCWludCBlcnJvciA9IDA7CisKKwlmb3IgKHByZXZfcGF0Y2ggPSBOVUxMOyBwYXRjaCA7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJZXJyb3IgfD0gY2hlY2tfcGF0Y2gocGF0Y2gsIHByZXZfcGF0Y2gpOworCQlwcmV2X3BhdGNoID0gcGF0Y2g7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfbnVsbF9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJcmV0dXJuICFtZW1jbXAoc2hhMSwgbnVsbF9zaGExLCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaW5kZXhfbGlzdChzdHJ1Y3QgcGF0Y2ggKmxpc3QpCit7CisJc3RydWN0IHBhdGNoICpwYXRjaDsKKworCS8qIE9uY2Ugd2Ugc3RhcnQgc3VwcG9ydGluZyB0aGUgcmV2ZXJzZSBwYXRjaCwgaXQgbWF5IGJlCisJICogd29ydGggc2hvd2luZyB0aGUgbmV3IHNoYTEgcHJlZml4LCBidXQgdW50aWwgdGhlbi4uLgorCSAqLworCWZvciAocGF0Y2ggPSBsaXN0OyBwYXRjaDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExX3B0cjsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQluYW1lID0gcGF0Y2gtPm9sZF9uYW1lID8gcGF0Y2gtPm9sZF9uYW1lIDogcGF0Y2gtPm5ld19uYW1lOworCQlpZiAocGF0Y2gtPmlzX25ldykKKwkJCXNoYTFfcHRyID0gbnVsbF9zaGExOworCQllbHNlIGlmIChnZXRfc2hhMShwYXRjaC0+b2xkX3NoYTFfcHJlZml4LCBzaGExKSkKKwkJCWRpZSgic2hhMSBpbmZvcm1hdGlvbiBpcyBsYWNraW5nIG9yIHVzZWxlc3MgKCVzKS4iLAorCQkJICAgIG5hbWUpOworCQllbHNlCisJCQlzaGExX3B0ciA9IHNoYTE7CisKKwkJcHJpbnRmKCIlMDZvICVzCSIscGF0Y2gtPm9sZF9tb2RlLCBzaGExX3RvX2hleChzaGExX3B0cikpOworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApKQorCQkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBzdGRvdXQsIDApOworCQllbHNlCisJCQlmcHV0cyhuYW1lLCBzdGRvdXQpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhdF9wYXRjaF9saXN0KHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGZpbGVzLCBhZGRzLCBkZWxzOworCisJZm9yIChmaWxlcyA9IGFkZHMgPSBkZWxzID0gMCA7IHBhdGNoIDsgcGF0Y2ggPSBwYXRjaC0+bmV4dCkgeworCQlmaWxlcysrOworCQlhZGRzICs9IHBhdGNoLT5saW5lc19hZGRlZDsKKwkJZGVscyArPSBwYXRjaC0+bGluZXNfZGVsZXRlZDsKKwkJc2hvd19zdGF0cyhwYXRjaCk7CisJfQorCisJcHJpbnRmKCIgJWQgZmlsZXMgY2hhbmdlZCwgJWQgaW5zZXJ0aW9ucygrKSwgJWQgZGVsZXRpb25zKC0pXG4iLCBmaWxlcywgYWRkcywgZGVscyk7Cit9CisKK3N0YXRpYyB2b2lkIG51bXN0YXRfcGF0Y2hfbGlzdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWZvciAoIDsgcGF0Y2g7IHBhdGNoID0gcGF0Y2gtPm5leHQpIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJbmFtZSA9IHBhdGNoLT5uZXdfbmFtZSA/IHBhdGNoLT5uZXdfbmFtZSA6IHBhdGNoLT5vbGRfbmFtZTsKKwkJcHJpbnRmKCIlZFx0JWRcdCIsIHBhdGNoLT5saW5lc19hZGRlZCwgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQpOworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBxdW90ZV9jX3N0eWxlKG5hbWUsIE5VTEwsIE5VTEwsIDApKQorCQkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBzdGRvdXQsIDApOworCQllbHNlCisJCQlmcHV0cyhuYW1lLCBzdGRvdXQpOworCQlwdXRjaGFyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlX21vZGVfbmFtZShjb25zdCBjaGFyICpuZXdkZWxldGUsIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChtb2RlKQorCQlwcmludGYoIiAlcyBtb2RlICUwNm8gJXNcbiIsIG5ld2RlbGV0ZSwgbW9kZSwgbmFtZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlc1xuIiwgbmV3ZGVsZXRlLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19tb2RlX2NoYW5nZShzdHJ1Y3QgcGF0Y2ggKnAsIGludCBzaG93X25hbWUpCit7CisJaWYgKHAtPm9sZF9tb2RlICYmIHAtPm5ld19tb2RlICYmIHAtPm9sZF9tb2RlICE9IHAtPm5ld19tb2RlKSB7CisJCWlmIChzaG93X25hbWUpCisJCQlwcmludGYoIiBtb2RlIGNoYW5nZSAlMDZvID0+ICUwNm8gJXNcbiIsCisJCQkgICAgICAgcC0+b2xkX21vZGUsIHAtPm5ld19tb2RlLCBwLT5uZXdfbmFtZSk7CisJCWVsc2UKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2b1xuIiwKKwkJCSAgICAgICBwLT5vbGRfbW9kZSwgcC0+bmV3X21vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19yZW5hbWVfY29weShzdHJ1Y3QgcGF0Y2ggKnApCit7CisJY29uc3QgY2hhciAqcmVuYW1lY29weSA9IHAtPmlzX3JlbmFtZSA/ICJyZW5hbWUiIDogImNvcHkiOworCWNvbnN0IGNoYXIgKm9sZCwgKm5ldzsKKworCS8qIEZpbmQgY29tbW9uIHByZWZpeCAqLworCW9sZCA9IHAtPm9sZF9uYW1lOworCW5ldyA9IHAtPm5ld19uYW1lOworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKnNsYXNoX29sZCwgKnNsYXNoX25ldzsKKwkJc2xhc2hfb2xkID0gc3RyY2hyKG9sZCwgJy8nKTsKKwkJc2xhc2hfbmV3ID0gc3RyY2hyKG5ldywgJy8nKTsKKwkJaWYgKCFzbGFzaF9vbGQgfHwKKwkJICAgICFzbGFzaF9uZXcgfHwKKwkJICAgIHNsYXNoX29sZCAtIG9sZCAhPSBzbGFzaF9uZXcgLSBuZXcgfHwKKwkJICAgIG1lbWNtcChvbGQsIG5ldywgc2xhc2hfbmV3IC0gbmV3KSkKKwkJCWJyZWFrOworCQlvbGQgPSBzbGFzaF9vbGQgKyAxOworCQluZXcgPSBzbGFzaF9uZXcgKyAxOworCX0KKwkvKiBwLT5vbGRfbmFtZSB0aHJ1IG9sZCBpcyB0aGUgY29tbW9uIHByZWZpeCwgYW5kIG9sZCBhbmQgbmV3CisJICogdGhyb3VnaCB0aGUgZW5kIG9mIG5hbWVzIGFyZSByZW5hbWVzCisJICovCisJaWYgKG9sZCAhPSBwLT5vbGRfbmFtZSkKKwkJcHJpbnRmKCIgJXMgJS4qc3slcyA9PiAlc30gKCVkJSUpXG4iLCByZW5hbWVjb3B5LAorCQkgICAgICAgKGludCkob2xkIC0gcC0+b2xkX25hbWUpLCBwLT5vbGRfbmFtZSwKKwkJICAgICAgIG9sZCwgbmV3LCBwLT5zY29yZSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlcyA9PiAlcyAoJWQlJSlcbiIsIHJlbmFtZWNvcHksCisJCSAgICAgICBwLT5vbGRfbmFtZSwgcC0+bmV3X25hbWUsIHAtPnNjb3JlKTsKKwlzaG93X21vZGVfY2hhbmdlKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBzdW1tYXJ5X3BhdGNoX2xpc3Qoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlzdHJ1Y3QgcGF0Y2ggKnA7CisKKwlmb3IgKHAgPSBwYXRjaDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmlzX25ldykKKwkJCXNob3dfZmlsZV9tb2RlX25hbWUoImNyZWF0ZSIsIHAtPm5ld19tb2RlLCBwLT5uZXdfbmFtZSk7CisJCWVsc2UgaWYgKHAtPmlzX2RlbGV0ZSkKKwkJCXNob3dfZmlsZV9tb2RlX25hbWUoImRlbGV0ZSIsIHAtPm9sZF9tb2RlLCBwLT5vbGRfbmFtZSk7CisJCWVsc2UgeworCQkJaWYgKHAtPmlzX3JlbmFtZSB8fCBwLT5pc19jb3B5KQorCQkJCXNob3dfcmVuYW1lX2NvcHkocCk7CisJCQllbHNlIHsKKwkJCQlpZiAocC0+c2NvcmUpIHsKKwkJCQkJcHJpbnRmKCIgcmV3cml0ZSAlcyAoJWQlJSlcbiIsCisJCQkJCSAgICAgICBwLT5uZXdfbmFtZSwgcC0+c2NvcmUpOworCQkJCQlzaG93X21vZGVfY2hhbmdlKHAsIDApOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXNob3dfbW9kZV9jaGFuZ2UocCwgMSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX3N0YXRzKHN0cnVjdCBwYXRjaCAqcGF0Y2gpCit7CisJaW50IGxpbmVzID0gcGF0Y2gtPmxpbmVzX2FkZGVkICsgcGF0Y2gtPmxpbmVzX2RlbGV0ZWQ7CisKKwlpZiAobGluZXMgPiBtYXhfY2hhbmdlKQorCQltYXhfY2hhbmdlID0gbGluZXM7CisJaWYgKHBhdGNoLT5vbGRfbmFtZSkgeworCQlpbnQgbGVuID0gcXVvdGVfY19zdHlsZShwYXRjaC0+b2xkX25hbWUsIE5VTEwsIE5VTEwsIDApOworCQlpZiAoIWxlbikKKwkJCWxlbiA9IHN0cmxlbihwYXRjaC0+b2xkX25hbWUpOworCQlpZiAobGVuID4gbWF4X2xlbikKKwkJCW1heF9sZW4gPSBsZW47CisJfQorCWlmIChwYXRjaC0+bmV3X25hbWUpIHsKKwkJaW50IGxlbiA9IHF1b3RlX2Nfc3R5bGUocGF0Y2gtPm5ld19uYW1lLCBOVUxMLCBOVUxMLCAwKTsKKwkJaWYgKCFsZW4pCisJCQlsZW4gPSBzdHJsZW4ocGF0Y2gtPm5ld19uYW1lKTsKKwkJaWYgKGxlbiA+IG1heF9sZW4pCisJCQltYXhfbGVuID0gbGVuOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpbGUoc3RydWN0IHBhdGNoICpwYXRjaCkKK3sKKwlpZiAod3JpdGVfaW5kZXgpIHsKKwkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0Y2gtPm9sZF9uYW1lKSA8IDApCisJCQlkaWUoInVuYWJsZSB0byByZW1vdmUgJXMgZnJvbSBpbmRleCIsIHBhdGNoLT5vbGRfbmFtZSk7CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRjaC0+b2xkX25hbWUpOworCX0KKwlpZiAoIWNhY2hlZCkKKwkJdW5saW5rKHBhdGNoLT5vbGRfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9pbmRleF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIG1vZGUsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJdW5zaWduZWQgY2Vfc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobmFtZWxlbik7CisKKwlpZiAoIXdyaXRlX2luZGV4KQorCQlyZXR1cm47CisKKwljZSA9IHhjYWxsb2MoMSwgY2Vfc2l6ZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBwYXRoLCBuYW1lbGVuKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWNlLT5jZV9mbGFncyA9IGh0b25zKG5hbWVsZW4pOworCWlmICghY2FjaGVkKSB7CisJCWlmIChsc3RhdChwYXRoLCAmc3QpIDwgMCkKKwkJCWRpZSgidW5hYmxlIHRvIHN0YXQgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwgcGF0aCk7CisJCWZpbGxfc3RhdF9jYWNoZV9pbmZvKGNlLCAmc3QpOworCX0KKwlpZiAod3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgYmxvYl90eXBlLCBjZS0+c2hhMSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgYmFja2luZyBzdG9yZSBmb3IgbmV3bHkgY3JlYXRlZCBmaWxlICVzIiwgcGF0aCk7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBhZGQgY2FjaGUgZW50cnkgZm9yICVzIiwgcGF0aCk7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBtb2RlLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgZmQ7CisKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJLyogQWx0aG91Z2ggYnVmOnNpemUgaXMgY291bnRlZCBzdHJpbmcsIGl0IGFsc28gaXMgTlVMCisJCSAqIHRlcm1pbmF0ZWQuCisJCSAqLworCQlyZXR1cm4gc3ltbGluayhidWYsIHBhdGgpOworCWZkID0gb3BlbihwYXRoLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIChtb2RlICYgMDEwMCkgPyAwNzc3IDogMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCXdoaWxlIChzaXplKSB7CisJCWludCB3cml0dGVuID0geHdyaXRlKGZkLCBidWYsIHNpemUpOworCQlpZiAod3JpdHRlbiA8IDApCisJCQlkaWUoIndyaXRpbmcgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoIXdyaXR0ZW4pCisJCQlkaWUoIm91dCBvZiBzcGFjZSB3cml0aW5nIGZpbGUgJXMiLCBwYXRoKTsKKwkJYnVmICs9IHdyaXR0ZW47CisJCXNpemUgLT0gd3JpdHRlbjsKKwl9CisJaWYgKGNsb3NlKGZkKSA8IDApCisJCWRpZSgiY2xvc2luZyBmaWxlICVzOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBvcHRpbWlzdGljYWxseSBhc3N1bWUgdGhhdCB0aGUgZGlyZWN0b3JpZXMgZXhpc3QsCisgKiB3aGljaCBpcyB0cnVlIDk5JSBvZiB0aGUgdGltZSBhbnl3YXkuIElmIHRoZXkgZG9uJ3QsCisgKiB3ZSBjcmVhdGUgdGhlbSBhbmQgdHJ5IGFnYWluLgorICovCitzdGF0aWMgdm9pZCBjcmVhdGVfb25lX2ZpbGUoY2hhciAqcGF0aCwgdW5zaWduZWQgbW9kZSwgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKGNhY2hlZCkKKwkJcmV0dXJuOworCWlmICghdHJ5X2NyZWF0ZV9maWxlKHBhdGgsIG1vZGUsIGJ1Ziwgc2l6ZSkpCisJCXJldHVybjsKKworCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJaWYgKHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMocGF0aCkpCisJCQlyZXR1cm47CisJCWlmICghdHJ5X2NyZWF0ZV9maWxlKHBhdGgsIG1vZGUsIGJ1Ziwgc2l6ZSkpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGVycm5vID09IEVFWElTVCB8fCBlcnJubyA9PSBFQUNDRVMpIHsKKwkJLyogV2UgbWF5IGJlIHRyeWluZyB0byBjcmVhdGUgYSBmaWxlIHdoZXJlIGEgZGlyZWN0b3J5CisJCSAqIHVzZWQgdG8gYmUuCisJCSAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJZXJybm8gPSAwOworCQlpZiAoIWxzdGF0KHBhdGgsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSAmJiAhcm1kaXIocGF0aCkpCisJCQllcnJubyA9IEVFWElTVDsKKwl9CisKKwlpZiAoZXJybm8gPT0gRUVYSVNUKSB7CisJCXVuc2lnbmVkIGludCBuciA9IGdldHBpZCgpOworCisJCWZvciAoOzspIHsKKwkJCWNvbnN0IGNoYXIgKm5ld3BhdGg7CisJCQluZXdwYXRoID0gbWtwYXRoKCIlc34ldSIsIHBhdGgsIG5yKTsKKwkJCWlmICghdHJ5X2NyZWF0ZV9maWxlKG5ld3BhdGgsIG1vZGUsIGJ1Ziwgc2l6ZSkpIHsKKwkJCQlpZiAoIXJlbmFtZShuZXdwYXRoLCBwYXRoKSkKKwkJCQkJcmV0dXJuOworCQkJCXVubGluayhuZXdwYXRoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlcnJubyAhPSBFRVhJU1QpCisJCQkJYnJlYWs7CisJCQkrK25yOworCQl9CisJfQorCWRpZSgidW5hYmxlIHRvIHdyaXRlIGZpbGUgJXMgbW9kZSAlbyIsIHBhdGgsIG1vZGUpOworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVfZmlsZShzdHJ1Y3QgcGF0Y2ggKnBhdGNoKQoreworCWNoYXIgKnBhdGggPSBwYXRjaC0+bmV3X25hbWU7CisJdW5zaWduZWQgbW9kZSA9IHBhdGNoLT5uZXdfbW9kZTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBwYXRjaC0+cmVzdWx0c2l6ZTsKKwljaGFyICpidWYgPSBwYXRjaC0+cmVzdWx0OworCisJaWYgKCFtb2RlKQorCQltb2RlID0gU19JRlJFRyB8IDA2NDQ7CisJY3JlYXRlX29uZV9maWxlKHBhdGgsIG1vZGUsIGJ1Ziwgc2l6ZSk7CisJYWRkX2luZGV4X2ZpbGUocGF0aCwgbW9kZSwgYnVmLCBzaXplKTsKKwljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7Cit9CisKKy8qIHBoYXNlIHplcm8gaXMgdG8gcmVtb3ZlLCBwaGFzZSBvbmUgaXMgdG8gY3JlYXRlICovCitzdGF0aWMgdm9pZCB3cml0ZV9vdXRfb25lX3Jlc3VsdChzdHJ1Y3QgcGF0Y2ggKnBhdGNoLCBpbnQgcGhhc2UpCit7CisJaWYgKHBhdGNoLT5pc19kZWxldGUgPiAwKSB7CisJCWlmIChwaGFzZSA9PSAwKQorCQkJcmVtb3ZlX2ZpbGUocGF0Y2gpOworCQlyZXR1cm47CisJfQorCWlmIChwYXRjaC0+aXNfbmV3ID4gMCB8fCBwYXRjaC0+aXNfY29weSkgeworCQlpZiAocGhhc2UgPT0gMSkKKwkJCWNyZWF0ZV9maWxlKHBhdGNoKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFJlbmFtZSBvciBtb2RpZmljYXRpb24gYm9pbHMgZG93biB0byB0aGUgc2FtZQorCSAqIHRoaW5nOiByZW1vdmUgdGhlIG9sZCwgd3JpdGUgdGhlIG5ldworCSAqLworCWlmIChwaGFzZSA9PSAwKQorCQlyZW1vdmVfZmlsZShwYXRjaCk7CisJaWYgKHBoYXNlID09IDEpCisJY3JlYXRlX2ZpbGUocGF0Y2gpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9vdXRfcmVzdWx0cyhzdHJ1Y3QgcGF0Y2ggKmxpc3QsIGludCBza2lwcGVkX3BhdGNoKQoreworCWludCBwaGFzZTsKKworCWlmICghbGlzdCAmJiAhc2tpcHBlZF9wYXRjaCkKKwkJZGllKCJObyBjaGFuZ2VzIik7CisKKwlmb3IgKHBoYXNlID0gMDsgcGhhc2UgPCAyOyBwaGFzZSsrKSB7CisJCXN0cnVjdCBwYXRjaCAqbCA9IGxpc3Q7CisJCXdoaWxlIChsKSB7CisJCQl3cml0ZV9vdXRfb25lX3Jlc3VsdChsLCBwaGFzZSk7CisJCQlsID0gbC0+bmV4dDsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBsb2NrX2ZpbGUgbG9ja19maWxlOworCitzdGF0aWMgc3RydWN0IGV4Y2x1ZGVzIHsKKwlzdHJ1Y3QgZXhjbHVkZXMgKm5leHQ7CisJY29uc3QgY2hhciAqcGF0aDsKK30gKmV4Y2x1ZGVzOworCitzdGF0aWMgaW50IHVzZV9wYXRjaChzdHJ1Y3QgcGF0Y2ggKnApCit7CisJY29uc3QgY2hhciAqcGF0aG5hbWUgPSBwLT5uZXdfbmFtZSA/IHAtPm5ld19uYW1lIDogcC0+b2xkX25hbWU7CisJc3RydWN0IGV4Y2x1ZGVzICp4ID0gZXhjbHVkZXM7CisJd2hpbGUgKHgpIHsKKwkJaWYgKGZubWF0Y2goeC0+cGF0aCwgcGF0aG5hbWUsIDApID09IDApCisJCQlyZXR1cm4gMDsKKwkJeCA9IHgtPm5leHQ7CisJfQorCWlmICgwIDwgcHJlZml4X2xlbmd0aCkgeworCQlpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRobmFtZSk7CisJCWlmIChwYXRobGVuIDw9IHByZWZpeF9sZW5ndGggfHwKKwkJICAgIG1lbWNtcChwcmVmaXgsIHBhdGhuYW1lLCBwcmVmaXhfbGVuZ3RoKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhcHBseV9wYXRjaChpbnQgZmQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQlpbnQgcmV2ZXJzZSwgaW50IGluYWNjdXJhdGVfZW9mKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOworCWNoYXIgKmJ1ZmZlciA9IHJlYWRfcGF0Y2hfZmlsZShmZCwgJnNpemUpOworCXN0cnVjdCBwYXRjaCAqbGlzdCA9IE5VTEwsICoqbGlzdHAgPSAmbGlzdDsKKwlpbnQgc2tpcHBlZF9wYXRjaCA9IDA7CisKKwlwYXRjaF9pbnB1dF9maWxlID0gZmlsZW5hbWU7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtMTsKKwlvZmZzZXQgPSAwOworCXdoaWxlIChzaXplID4gMCkgeworCQlzdHJ1Y3QgcGF0Y2ggKnBhdGNoOworCQlpbnQgbnI7CisKKwkJcGF0Y2ggPSB4Y2FsbG9jKDEsIHNpemVvZigqcGF0Y2gpKTsKKwkJcGF0Y2gtPmluYWNjdXJhdGVfZW9mID0gaW5hY2N1cmF0ZV9lb2Y7CisJCW5yID0gcGFyc2VfY2h1bmsoYnVmZmVyICsgb2Zmc2V0LCBzaXplLCBwYXRjaCk7CisJCWlmIChuciA8IDApCisJCQlicmVhazsKKwkJaWYgKHJldmVyc2UpCisJCQlyZXZlcnNlX3BhdGNoZXMocGF0Y2gpOworCQlpZiAodXNlX3BhdGNoKHBhdGNoKSkgeworCQkJcGF0Y2hfc3RhdHMocGF0Y2gpOworCQkJKmxpc3RwID0gcGF0Y2g7CisJCQlsaXN0cCA9ICZwYXRjaC0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCS8qIHBlcmhhcHMgZnJlZSBpdCBhIGJpdCBiZXR0ZXI/ICovCisJCQlmcmVlKHBhdGNoKTsKKwkJCXNraXBwZWRfcGF0Y2grKzsKKwkJfQorCQlvZmZzZXQgKz0gbnI7CisJCXNpemUgLT0gbnI7CisJfQorCisJaWYgKHdoaXRlc3BhY2VfZXJyb3IgJiYgKG5ld193aGl0ZXNwYWNlID09IGVycm9yX29uX3doaXRlc3BhY2UpKQorCQlhcHBseSA9IDA7CisKKwl3cml0ZV9pbmRleCA9IGNoZWNrX2luZGV4ICYmIGFwcGx5OworCWlmICh3cml0ZV9pbmRleCAmJiBuZXdmZCA8IDApCisJCW5ld2ZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmbG9ja19maWxlLAorCQkJCQkJICBnZXRfaW5kZXhfZmlsZSgpLCAxKTsKKwlpZiAoY2hlY2tfaW5kZXgpIHsKKwkJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCQlkaWUoInVuYWJsZSB0byByZWFkIGluZGV4IGZpbGUiKTsKKwl9CisKKwlpZiAoKGNoZWNrIHx8IGFwcGx5KSAmJiBjaGVja19wYXRjaF9saXN0KGxpc3QpIDwgMCkKKwkJZXhpdCgxKTsKKworCWlmIChhcHBseSkKKwkJd3JpdGVfb3V0X3Jlc3VsdHMobGlzdCwgc2tpcHBlZF9wYXRjaCk7CisKKwlpZiAoc2hvd19pbmRleF9pbmZvKQorCQlzaG93X2luZGV4X2xpc3QobGlzdCk7CisKKwlpZiAoZGlmZnN0YXQpCisJCXN0YXRfcGF0Y2hfbGlzdChsaXN0KTsKKworCWlmIChudW1zdGF0KQorCQludW1zdGF0X3BhdGNoX2xpc3QobGlzdCk7CisKKwlpZiAoc3VtbWFyeSkKKwkJc3VtbWFyeV9wYXRjaF9saXN0KGxpc3QpOworCisJZnJlZShidWZmZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpdF9hcHBseV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJhcHBseS53aGl0ZXNwYWNlIikpIHsKKwkJYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlID0gc3RyZHVwKHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKKworaW50IGNtZF9hcHBseShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgcmVhZF9zdGRpbiA9IDE7CisJaW50IHJldmVyc2UgPSAwOworCWludCBpbmFjY3VyYXRlX2VvZiA9IDA7CisKKwljb25zdCBjaGFyICp3aGl0ZXNwYWNlX29wdGlvbiA9IE5VTEw7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWNoYXIgKmVuZDsKKwkJaW50IGZkOworCisJCWlmICghc3RyY21wKGFyZywgIi0iKSkgeworCQkJYXBwbHlfcGF0Y2goMCwgIjxzdGRpbj4iLCByZXZlcnNlLCBpbmFjY3VyYXRlX2VvZik7CisJCQlyZWFkX3N0ZGluID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLWV4Y2x1ZGU9IiwgMTApKSB7CisJCQlzdHJ1Y3QgZXhjbHVkZXMgKnggPSB4bWFsbG9jKHNpemVvZigqeCkpOworCQkJeC0+cGF0aCA9IGFyZyArIDEwOworCQkJeC0+bmV4dCA9IGV4Y2x1ZGVzOworCQkJZXhjbHVkZXMgPSB4OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi1wIiwgMikpIHsKKwkJCXBfdmFsdWUgPSBhdG9pKGFyZyArIDIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1hZGQiKSkgeworCQkJbm9fYWRkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3RhdCIpKSB7CisJCQlhcHBseSA9IDA7CisJCQlkaWZmc3RhdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCIpIHx8CisJCSAgICAhc3RyY21wKGFyZywgIi0tYmluYXJ5IikpIHsKKwkJCWFsbG93X2JpbmFyeV9yZXBsYWNlbWVudCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLW51bXN0YXQiKSkgeworCQkJYXBwbHkgPSAwOworCQkJbnVtc3RhdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN1bW1hcnkiKSkgeworCQkJYXBwbHkgPSAwOworCQkJc3VtbWFyeSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWNoZWNrIikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCWNoZWNrID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5kZXgiKSkgeworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJY2hlY2tfaW5kZXggPSAxOworCQkJY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tYXBwbHkiKSkgeworCQkJYXBwbHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1pbmRleC1pbmZvIikpIHsKKwkJCWFwcGx5ID0gMDsKKwkJCXNob3dfaW5kZXhfaW5mbyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICIteiIpKSB7CisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItQyIsIDIpKSB7CisJCQlwX2NvbnRleHQgPSBzdHJ0b3VsKGFyZyArIDIsICZlbmQsIDApOworCQkJaWYgKCplbmQgIT0gJ1wwJykKKwkJCQlkaWUoInVucmVjb2duaXplZCBjb250ZXh0IGNvdW50ICclcyciLCBhcmcgKyAyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLXdoaXRlc3BhY2U9IiwgMTMpKSB7CisJCQl3aGl0ZXNwYWNlX29wdGlvbiA9IGFyZyArIDEzOworCQkJcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oYXJnICsgMTMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLVIiKSB8fCAhc3RyY21wKGFyZywgIi0tcmV2ZXJzZSIpKSB7CisJCQlyZXZlcnNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5hY2N1cmF0ZS1lb2YiKSkgeworCQkJaW5hY2N1cmF0ZV9lb2YgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2hlY2tfaW5kZXggJiYgcHJlZml4X2xlbmd0aCA8IDApIHsKKwkJCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwkJCXByZWZpeF9sZW5ndGggPSBwcmVmaXggPyBzdHJsZW4ocHJlZml4KSA6IDA7CisJCQlnaXRfY29uZmlnKGdpdF9hcHBseV9jb25maWcpOworCQkJaWYgKCF3aGl0ZXNwYWNlX29wdGlvbiAmJiBhcHBseV9kZWZhdWx0X3doaXRlc3BhY2UpCisJCQkJcGFyc2Vfd2hpdGVzcGFjZV9vcHRpb24oYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlKTsKKwkJfQorCQlpZiAoMCA8IHByZWZpeF9sZW5ndGgpCisJCQlhcmcgPSBwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBhcmcpOworCisJCWZkID0gb3BlbihhcmcsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXVzYWdlKGFwcGx5X3VzYWdlKTsKKwkJcmVhZF9zdGRpbiA9IDA7CisJCXNldF9kZWZhdWx0X3doaXRlc3BhY2VfbW9kZSh3aGl0ZXNwYWNlX29wdGlvbik7CisJCWFwcGx5X3BhdGNoKGZkLCBhcmcsIHJldmVyc2UsIGluYWNjdXJhdGVfZW9mKTsKKwkJY2xvc2UoZmQpOworCX0KKwlzZXRfZGVmYXVsdF93aGl0ZXNwYWNlX21vZGUod2hpdGVzcGFjZV9vcHRpb24pOworCWlmIChyZWFkX3N0ZGluKQorCQlhcHBseV9wYXRjaCgwLCAiPHN0ZGluPiIsIHJldmVyc2UsIGluYWNjdXJhdGVfZW9mKTsKKwlpZiAod2hpdGVzcGFjZV9lcnJvcikgeworCQlpZiAoc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyAmJgorCQkgICAgc3F1ZWxjaF93aGl0ZXNwYWNlX2Vycm9ycyA8IHdoaXRlc3BhY2VfZXJyb3IpIHsKKwkJCWludCBzcXVlbGNoZWQgPQorCQkJCXdoaXRlc3BhY2VfZXJyb3IgLSBzcXVlbGNoX3doaXRlc3BhY2VfZXJyb3JzOworCQkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBzcXVlbGNoZWQgJWQgd2hpdGVzcGFjZSBlcnJvciVzXG4iLAorCQkJCXNxdWVsY2hlZCwKKwkJCQlzcXVlbGNoZWQgPT0gMSA/ICIiIDogInMiKTsKKwkJfQorCQlpZiAobmV3X3doaXRlc3BhY2UgPT0gZXJyb3Jfb25fd2hpdGVzcGFjZSkKKwkJCWRpZSgiJWQgbGluZSVzIGFkZCVzIHRyYWlsaW5nIHdoaXRlc3BhY2VzLiIsCisJCQkgICAgd2hpdGVzcGFjZV9lcnJvciwKKwkJCSAgICB3aGl0ZXNwYWNlX2Vycm9yID09IDEgPyAiIiA6ICJzIiwKKwkJCSAgICB3aGl0ZXNwYWNlX2Vycm9yID09IDEgPyAicyIgOiAiIik7CisJCWlmIChhcHBsaWVkX2FmdGVyX3N0cmlwcGluZykKKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogJWQgbGluZSVzIGFwcGxpZWQgYWZ0ZXIiCisJCQkJIiBzdHJpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZXMuXG4iLAorCQkJCWFwcGxpZWRfYWZ0ZXJfc3RyaXBwaW5nLAorCQkJCWFwcGxpZWRfYWZ0ZXJfc3RyaXBwaW5nID09IDEgPyAiIiA6ICJzIik7CisJCWVsc2UgaWYgKHdoaXRlc3BhY2VfZXJyb3IpCisJCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICVkIGxpbmUlcyBhZGQlcyB0cmFpbGluZyIKKwkJCQkiIHdoaXRlc3BhY2VzLlxuIiwKKwkJCQl3aGl0ZXNwYWNlX2Vycm9yLAorCQkJCXdoaXRlc3BhY2VfZXJyb3IgPT0gMSA/ICIiIDogInMiLAorCQkJCXdoaXRlc3BhY2VfZXJyb3IgPT0gMSA/ICJzIiA6ICIiKTsKKwl9CisKKwlpZiAod3JpdGVfaW5kZXgpIHsKKwkJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkJICAgIGNsb3NlKG5ld2ZkKSB8fCBjb21taXRfbG9ja19maWxlKCZsb2NrX2ZpbGUpKQorCQkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY2F0LWZpbGUuYyBiL2J1aWx0aW4tY2F0LWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTRmYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jYXQtZmlsZS5jCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcihjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJbG9uZyByZXQgPSB4d3JpdGUoMSwgYnVmLCBzaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qIElnbm9yZSBlcGlwZSAqLworCQkJaWYgKGVycm5vID09IEVQSVBFKQorCQkJCWJyZWFrOworCQkJZGllKCJnaXQtY2F0LWZpbGU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICghcmV0KSB7CisJCQlkaWUoImdpdC1jYXQtZmlsZTogZGlzayBmdWxsPyIpOworCQl9CisJCXNpemUgLT0gcmV0OworCQlidWYgKz0gcmV0OworCX0KK30KKworc3RhdGljIGludCBwcHJpbnRfdGFnKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCS8qIHRoZSBwYXJzZXIgaW4gdGFnLmMgaXMgdXNlbGVzcyBoZXJlLiAqLworCWNvbnN0IGNoYXIgKmVuZHAgPSBidWYgKyBzaXplOworCWNvbnN0IGNoYXIgKmNwID0gYnVmOworCisJd2hpbGUgKGNwIDwgZW5kcCkgeworCQljaGFyIGMgPSAqY3ArKzsKKwkJaWYgKGMgIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQlpZiAoNyA8PSBlbmRwIC0gY3AgJiYgIW1lbWNtcCgidGFnZ2VyICIsIGNwLCA3KSkgeworCQkJY29uc3QgY2hhciAqdGFnZ2VyID0gY3A7CisKKwkJCS8qIEZvdW5kIHRoZSB0YWdnZXIgbGluZS4gIENvcHkgb3V0IHRoZSBjb250ZW50cworCQkJICogb2YgdGhlIGJ1ZmZlciBzbyBmYXIuCisJCQkgKi8KKwkJCWZsdXNoX2J1ZmZlcihidWYsIGNwIC0gYnVmKTsKKworCQkJLyoKKwkJCSAqIERvIHNvbWV0aGluZyBpbnRlbGxpZ2VudCwgbGlrZSBwcmV0dHktcHJpbnRpbmcKKwkJCSAqIHRoZSBkYXRlLgorCQkJICovCisJCQl3aGlsZSAoY3AgPCBlbmRwKSB7CisJCQkJaWYgKCpjcCsrID09ICdcbicpIHsKKwkJCQkJLyogdGFnZ2VyIHRvIGNwIGlzIGEgbGluZQorCQkJCQkgKiB0aGF0IGhhcyBpZGVudCBhbmQgdGltZS4KKwkJCQkJICovCisJCQkJCWNvbnN0IGNoYXIgKnNwID0gdGFnZ2VyOworCQkJCQljaGFyICplcDsKKwkJCQkJdW5zaWduZWQgbG9uZyBkYXRlOworCQkJCQlsb25nIHR6OworCQkJCQl3aGlsZSAoc3AgPCBjcCAmJiAqc3AgIT0gJz4nKQorCQkJCQkJc3ArKzsKKwkJCQkJaWYgKHNwID09IGNwKSB7CisJCQkJCQkvKiBnaXZlIHVwICovCisJCQkJCQlmbHVzaF9idWZmZXIodGFnZ2VyLAorCQkJCQkJCSAgICAgY3AgLSB0YWdnZXIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJd2hpbGUgKHNwIDwgY3AgJiYKKwkJCQkJICAgICAgICEoJzAnIDw9ICpzcCAmJiAqc3AgPD0gJzknKSkKKwkJCQkJCXNwKys7CisJCQkJCWZsdXNoX2J1ZmZlcih0YWdnZXIsIHNwIC0gdGFnZ2VyKTsKKwkJCQkJZGF0ZSA9IHN0cnRvdWwoc3AsICZlcCwgMTApOworCQkJCQl0eiA9IHN0cnRvbChlcCwgTlVMTCwgMTApOworCQkJCQlzcCA9IHNob3dfZGF0ZShkYXRlLCB0eik7CisJCQkJCWZsdXNoX2J1ZmZlcihzcCwgc3RybGVuKHNwKSk7CisJCQkJCXh3cml0ZSgxLCAiXG4iLCAxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNwIDwgZW5kcCAmJiAqY3AgPT0gJ1xuJykKKwkJCS8qIGVuZCBvZiBoZWFkZXIgKi8KKwkJCWJyZWFrOworCX0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGNvcGllZCBvdXQgdGhlIGhlYWRlciB1cCB0byB0aGUgZW5kIG9mCisJICogdGhlIHRhZ2dlciBsaW5lIGFuZCBjcCBwb2ludHMgYXQgb25lIHBhc3QgXG4uICBJdCBjb3VsZCBiZSB0aGUKKwkgKiBuZXh0IGhlYWRlciBsaW5lIGFmdGVyIHRoZSB0YWdnZXIgbGluZSwgb3IgaXQgY291bGQgYmUgYW5vdGhlcgorCSAqIFxuIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGUgaGVhZGVycy4gIFdlIG5lZWQgdG8gY29weSBvdXQgdGhlCisJICogcmVtYWluZGVyIGFzIGlzLgorCSAqLworCWlmIChjcCA8IGVuZHApCisJCWZsdXNoX2J1ZmZlcihjcCwgZW5kcCAtIGNwKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgdHlwZVsyMF07CisJdm9pZCAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgb3B0OworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCWlmIChhcmdjICE9IDMpCisJCXVzYWdlKCJnaXQtY2F0LWZpbGUgWy10fC1zfC1lfC1wfDx0eXBlPl0gPHNoYTE+Iik7CisJaWYgKGdldF9zaGExKGFyZ3ZbMl0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsyXSk7CisKKwlvcHQgPSAwOworCWlmICggYXJndlsxXVswXSA9PSAnLScgKSB7CisJCW9wdCA9IGFyZ3ZbMV1bMV07CisJCWlmICggIW9wdCB8fCBhcmd2WzFdWzJdICkKKwkJCW9wdCA9IC0xOyAvKiBOb3QgYSBzaW5nbGUgY2hhcmFjdGVyIG9wdGlvbiAqLworCX0KKworCWJ1ZiA9IE5VTEw7CisJc3dpdGNoIChvcHQpIHsKKwljYXNlICd0JzoKKwkJaWYgKCFzaGExX29iamVjdF9pbmZvKHNoYTEsIHR5cGUsIE5VTEwpKSB7CisJCQlwcmludGYoIiVzXG4iLCB0eXBlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSAncyc6CisJCWlmICghc2hhMV9vYmplY3RfaW5mbyhzaGExLCB0eXBlLCAmc2l6ZSkpIHsKKwkJCXByaW50ZigiJWx1XG4iLCBzaXplKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCisJY2FzZSAnZSc6CisJCXJldHVybiAhaGFzX3NoYTFfZmlsZShzaGExKTsKKworCWNhc2UgJ3AnOgorCQlpZiAoc2hhMV9vYmplY3RfaW5mbyhzaGExLCB0eXBlLCBOVUxMKSkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzJdKTsKKworCQkvKiBjdXN0b20gcHJldHR5LXByaW50IGhlcmUgKi8KKwkJaWYgKCFzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkKKwkJCXJldHVybiBjbWRfbHNfdHJlZSgyLCBhcmd2ICsgMSwgTlVMTCk7CisKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCQlpZiAoIWJ1ZikKKwkJCWRpZSgiQ2Fubm90IHJlYWQgb2JqZWN0ICVzIiwgYXJndlsyXSk7CisJCWlmICghc3RyY21wKHR5cGUsIHRhZ190eXBlKSkKKwkJCXJldHVybiBwcHJpbnRfdGFnKHNoYTEsIGJ1Ziwgc2l6ZSk7CisKKwkJLyogb3RoZXJ3aXNlIGp1c3Qgc3BpdCBvdXQgdGhlIGRhdGEgKi8KKwkJYnJlYWs7CisJY2FzZSAwOgorCQlidWYgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCBhcmd2WzFdLCAmc2l6ZSwgTlVMTCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGllKCJnaXQtY2F0LWZpbGU6IHVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlsxXSk7CisJfQorCisJaWYgKCFidWYpCisJCWRpZSgiZ2l0LWNhdC1maWxlICVzOiBiYWQgZmlsZSIsIGFyZ3ZbMl0pOworCisJZmx1c2hfYnVmZmVyKGJ1Ziwgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWNoZWNrLXJlZi1mb3JtYXQuYyBiL2J1aWx0aW4tY2hlY2stcmVmLWZvcm1hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDRiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWNoZWNrLXJlZi1mb3JtYXQuYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworaW50IGNtZF9jaGVja19yZWZfZm9ybWF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKCJnaXQtY2hlY2stcmVmLWZvcm1hdCByZWZuYW1lIik7CisJcmV0dXJuICEhY2hlY2tfcmVmX2Zvcm1hdChhcmd2WzFdKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY29tbWl0LXRyZWUuYyBiL2J1aWx0aW4tY29tbWl0LXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk4Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jb21taXQtdHJlZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjZGVmaW5lIEJMT0NLSU5HICgxdWwgPDwgMTQpCisKKy8qCisgKiBGSVhNRSEgU2hhcmUgdGhlIGNvZGUgd2l0aCAid3JpdGUtdHJlZS5jIgorICovCitzdGF0aWMgdm9pZCBpbml0X2J1ZmZlcihjaGFyICoqYnVmcCwgdW5zaWduZWQgaW50ICpzaXplcCkKK3sKKwljaGFyICpidWYgPSB4bWFsbG9jKEJMT0NLSU5HKTsKKwkqc2l6ZXAgPSAwOworCSpidWZwID0gYnVmOworfQorCitzdGF0aWMgdm9pZCBhZGRfYnVmZmVyKGNoYXIgKipidWZwLCB1bnNpZ25lZCBpbnQgKnNpemVwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIG9uZV9saW5lWzIwNDhdOworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgYWxsb2MsIHNpemUsIG5ld3NpemU7CisJY2hhciAqYnVmOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlsZW4gPSB2c25wcmludGYob25lX2xpbmUsIHNpemVvZihvbmVfbGluZSksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXNpemUgPSAqc2l6ZXA7CisJbmV3c2l6ZSA9IHNpemUgKyBsZW47CisJYWxsb2MgPSAoc2l6ZSArIDMyNzY3KSAmIH4zMjc2NzsKKwlidWYgPSAqYnVmcDsKKwlpZiAobmV3c2l6ZSA+IGFsbG9jKSB7CisJCWFsbG9jID0gKG5ld3NpemUgKyAzMjc2NykgJiB+MzI3Njc7CisJCWJ1ZiA9IHhyZWFsbG9jKGJ1ZiwgYWxsb2MpOworCQkqYnVmcCA9IGJ1ZjsKKwl9CisJKnNpemVwID0gbmV3c2l6ZTsKKwltZW1jcHkoYnVmICsgc2l6ZSwgb25lX2xpbmUsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3ZhbGlkKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmV4cGVjdCkKK3sKKwljaGFyIHR5cGVbMjBdOworCisJaWYgKHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgdHlwZSwgTlVMTCkpCisJCWRpZSgiJXMgaXMgbm90IGEgdmFsaWQgb2JqZWN0Iiwgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChleHBlY3QgJiYgc3RyY21wKHR5cGUsIGV4cGVjdCkpCisJCWRpZSgiJXMgaXMgbm90IGEgdmFsaWQgJyVzJyBvYmplY3QiLCBzaGExX3RvX2hleChzaGExKSwKKwkJICAgIGV4cGVjdCk7Cit9CisKKy8qCisgKiBIYXZpbmcgbW9yZSB0aGFuIHR3byBwYXJlbnRzIGlzIG5vdCBzdHJhbmdlIGF0IGFsbCwgYW5kIHRoaXMgaXMKKyAqIGhvdyBtdWx0aS13YXkgbWVyZ2VzIGFyZSByZXByZXNlbnRlZC4KKyAqLworI2RlZmluZSBNQVhQQVJFTlQgKDE2KQorc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFyZW50X3NoYTFbTUFYUEFSRU5UXVsyMF07CisKK3N0YXRpYyBjb25zdCBjaGFyIGNvbW1pdF90cmVlX3VzYWdlW10gPSAiZ2l0LWNvbW1pdC10cmVlIDxzaGExPiBbLXAgPHNoYTE+XSogPCBjaGFuZ2Vsb2ciOworCitzdGF0aWMgaW50IG5ld19wYXJlbnQoaW50IGlkeCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpzaGExID0gcGFyZW50X3NoYTFbaWR4XTsKKwlmb3IgKGkgPSAwOyBpIDwgaWR4OyBpKyspIHsKKwkJaWYgKCFtZW1jbXAocGFyZW50X3NoYTFbaV0sIHNoYTEsIDIwKSkgeworCQkJZXJyb3IoImR1cGxpY2F0ZSBwYXJlbnQgJXMgaWdub3JlZCIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitpbnQgY21kX2NvbW1pdF90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCWludCBwYXJlbnRzID0gMDsKKwl1bnNpZ25lZCBjaGFyIHRyZWVfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBjb21taXRfc2hhMVsyMF07CisJY2hhciBjb21tZW50WzEwMDBdOworCWNoYXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNldHVwX2lkZW50KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZShjb21taXRfdHJlZV91c2FnZSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHRyZWVfc2hhMSkpCisJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKworCWNoZWNrX3ZhbGlkKHRyZWVfc2hhMSwgdHJlZV90eXBlKTsKKwlmb3IgKGkgPSAyOyBpIDwgYXJnYzsgaSArPSAyKSB7CisJCWNvbnN0IGNoYXIgKmEsICpiOworCQlhID0gYXJndltpXTsgYiA9IGFyZ3ZbaSsxXTsKKwkJaWYgKCFiIHx8IHN0cmNtcChhLCAiLXAiKSkKKwkJCXVzYWdlKGNvbW1pdF90cmVlX3VzYWdlKTsKKwkJaWYgKGdldF9zaGExKGIsIHBhcmVudF9zaGExW3BhcmVudHNdKSkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBiKTsKKwkJY2hlY2tfdmFsaWQocGFyZW50X3NoYTFbcGFyZW50c10sIGNvbW1pdF90eXBlKTsKKwkJaWYgKG5ld19wYXJlbnQocGFyZW50cykpCisJCQlwYXJlbnRzKys7CisJfQorCWlmICghcGFyZW50cykKKwkJZnByaW50ZihzdGRlcnIsICJDb21taXR0aW5nIGluaXRpYWwgdHJlZSAlc1xuIiwgYXJndlsxXSk7CisKKwlpbml0X2J1ZmZlcigmYnVmZmVyLCAmc2l6ZSk7CisJYWRkX2J1ZmZlcigmYnVmZmVyLCAmc2l6ZSwgInRyZWUgJXNcbiIsIHNoYTFfdG9faGV4KHRyZWVfc2hhMSkpOworCisJLyoKKwkgKiBOT1RFISBUaGlzIG9yZGVyaW5nIG1lYW5zIHRoYXQgdGhlIHNhbWUgZXhhY3QgdHJlZSBtZXJnZWQgd2l0aCBhCisJICogZGlmZmVyZW50IG9yZGVyIG9mIHBhcmVudHMgd2lsbCBiZSBhIF9kaWZmZXJlbnRfIGNoYW5nZXNldCBldmVuCisJICogaWYgZXZlcnl0aGluZyBlbHNlIHN0YXlzIHRoZSBzYW1lLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBwYXJlbnRzOyBpKyspCisJCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJwYXJlbnQgJXNcbiIsIHNoYTFfdG9faGV4KHBhcmVudF9zaGExW2ldKSk7CisKKwkvKiBQZXJzb24vZGF0ZSBpbmZvcm1hdGlvbiAqLworCWFkZF9idWZmZXIoJmJ1ZmZlciwgJnNpemUsICJhdXRob3IgJXNcbiIsIGdpdF9hdXRob3JfaW5mbygxKSk7CisJYWRkX2J1ZmZlcigmYnVmZmVyLCAmc2l6ZSwgImNvbW1pdHRlciAlc1xuXG4iLCBnaXRfY29tbWl0dGVyX2luZm8oMSkpOworCisJLyogQW5kIGFkZCB0aGUgY29tbWVudCAqLworCXdoaWxlIChmZ2V0cyhjb21tZW50LCBzaXplb2YoY29tbWVudCksIHN0ZGluKSAhPSBOVUxMKQorCQlhZGRfYnVmZmVyKCZidWZmZXIsICZzaXplLCAiJXMiLCBjb21tZW50KTsKKworCWlmICghd3JpdGVfc2hhMV9maWxlKGJ1ZmZlciwgc2l6ZSwgY29tbWl0X3R5cGUsIGNvbW1pdF9zaGExKSkgeworCQlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChjb21taXRfc2hhMSkpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZQorCQlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tY291bnQuYyBiL2J1aWx0aW4tY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDM3MjlhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1jb3VudC5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQnVpbHRpbiAiZ2l0IGNvdW50LW9iamVjdHMiLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworICovCisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgY291bnRfb2JqZWN0c191c2FnZVtdID0gImdpdC1jb3VudC1vYmplY3RzIFstdl0iOworCitzdGF0aWMgdm9pZCBjb3VudF9vYmplY3RzKERJUiAqZCwgY2hhciAqcGF0aCwgaW50IGxlbiwgaW50IHZlcmJvc2UsCisJCQkgIHVuc2lnbmVkIGxvbmcgKmxvb3NlLAorCQkJICB1bnNpZ25lZCBsb25nICpsb29zZV9zaXplLAorCQkJICB1bnNpZ25lZCBsb25nICpwYWNrZWRfbG9vc2UsCisJCQkgIHVuc2lnbmVkIGxvbmcgKmdhcmJhZ2UpCit7CisJc3RydWN0IGRpcmVudCAqZW50OworCXdoaWxlICgoZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljaGFyIGhleFs0MV07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNvbnN0IGNoYXIgKmNwOworCQlpbnQgYmFkID0gMDsKKworCQlpZiAoKGVudC0+ZF9uYW1lWzBdID09ICcuJykgJiYKKwkJICAgIChlbnQtPmRfbmFtZVsxXSA9PSAwIHx8CisJCSAgICAgKChlbnQtPmRfbmFtZVsxXSA9PSAnLicpICYmIChlbnQtPmRfbmFtZVsyXSA9PSAwKSkpKQorCQkJY29udGludWU7CisJCWZvciAoY3AgPSBlbnQtPmRfbmFtZTsgKmNwOyBjcCsrKSB7CisJCQlpbnQgY2ggPSAqY3A7CisJCQlpZiAoKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpIHx8CisJCQkgICAgKCdhJyA8PSBjaCAmJiBjaCA8PSAnZicpKQorCQkJCWNvbnRpbnVlOworCQkJYmFkID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChjcCAtIGVudC0+ZF9uYW1lICE9IDM4KQorCQkJYmFkID0gMTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCW1lbWNweShwYXRoICsgbGVuICsgMywgZW50LT5kX25hbWUsIDM4KTsKKwkJCXBhdGhbbGVuICsgMl0gPSAnLyc7CisJCQlwYXRoW2xlbiArIDQxXSA9IDA7CisJCQlpZiAobHN0YXQocGF0aCwgJnN0KSB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCQliYWQgPSAxOworCQkJZWxzZQorCQkJCSgqbG9vc2Vfc2l6ZSkgKz0gc3Quc3RfYmxvY2tzOworCQl9CisJCWlmIChiYWQpIHsKKwkJCWlmICh2ZXJib3NlKSB7CisJCQkJZXJyb3IoImdhcmJhZ2UgZm91bmQ6ICUuKnMvJXMiLAorCQkJCSAgICAgIGxlbiArIDIsIHBhdGgsIGVudC0+ZF9uYW1lKTsKKwkJCQkoKmdhcmJhZ2UpKys7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkoKmxvb3NlKSsrOworCQlpZiAoIXZlcmJvc2UpCisJCQljb250aW51ZTsKKwkJbWVtY3B5KGhleCwgcGF0aCtsZW4sIDIpOworCQltZW1jcHkoaGV4KzIsIGVudC0+ZF9uYW1lLCAzOCk7CisJCWhleFs0MF0gPSAwOworCQlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkpCisJCQlkaWUoImludGVybmFsIGVycm9yIik7CisJCWlmIChoYXNfc2hhMV9wYWNrKHNoYTEpKQorCQkJKCpwYWNrZWRfbG9vc2UpKys7CisJfQorfQorCitpbnQgY21kX2NvdW50X29iamVjdHMoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgdmVyYm9zZSA9IDA7CisJY29uc3QgY2hhciAqb2JqZGlyID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwlpbnQgbGVuID0gc3RybGVuKG9iamRpcik7CisJY2hhciAqcGF0aCA9IHhtYWxsb2MobGVuICsgNTApOworCXVuc2lnbmVkIGxvbmcgbG9vc2UgPSAwLCBwYWNrZWQgPSAwLCBwYWNrZWRfbG9vc2UgPSAwLCBnYXJiYWdlID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvb3NlX3NpemUgPSAwOworCisJZm9yIChpID0gMTsgaSA8IGFjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXZbaV07CisJCWlmICgqYXJnICE9ICctJykKKwkJCWJyZWFrOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi12IikpCisJCQl2ZXJib3NlID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UoY291bnRfb2JqZWN0c191c2FnZSk7CisJfQorCisJLyogd2UgZG8gbm90IHRha2UgYXJndW1lbnRzIG90aGVyIHRoYW4gZmxhZ3MgZm9yIG5vdyAqLworCWlmIChpIDwgYWMpCisJCXVzYWdlKGNvdW50X29iamVjdHNfdXNhZ2UpOworCW1lbWNweShwYXRoLCBvYmpkaXIsIGxlbik7CisJaWYgKGxlbiAmJiBvYmpkaXJbbGVuLTFdICE9ICcvJykKKwkJcGF0aFtsZW4rK10gPSAnLyc7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCURJUiAqZDsKKwkJc3ByaW50ZihwYXRoICsgbGVuLCAiJTAyeCIsIGkpOworCQlkID0gb3BlbmRpcihwYXRoKTsKKwkJaWYgKCFkKQorCQkJY29udGludWU7CisJCWNvdW50X29iamVjdHMoZCwgcGF0aCwgbGVuLCB2ZXJib3NlLAorCQkJICAgICAgJmxvb3NlLCAmbG9vc2Vfc2l6ZSwgJnBhY2tlZF9sb29zZSwgJmdhcmJhZ2UpOworCQljbG9zZWRpcihkKTsKKwl9CisJaWYgKHZlcmJvc2UpIHsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJCWlmICghcGFja2VkX2dpdCkKKwkJCXByZXBhcmVfcGFja2VkX2dpdCgpOworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKCFwLT5wYWNrX2xvY2FsKQorCQkJCWNvbnRpbnVlOworCQkJcGFja2VkICs9IG51bV9wYWNrZWRfb2JqZWN0cyhwKTsKKwkJfQorCQlwcmludGYoImNvdW50OiAlbHVcbiIsIGxvb3NlKTsKKwkJcHJpbnRmKCJzaXplOiAlbHVcbiIsIGxvb3NlX3NpemUgLyAyKTsKKwkJcHJpbnRmKCJpbi1wYWNrOiAlbHVcbiIsIHBhY2tlZCk7CisJCXByaW50ZigicHJ1bmUtcGFja2FibGU6ICVsdVxuIiwgcGFja2VkX2xvb3NlKTsKKwkJcHJpbnRmKCJnYXJiYWdlOiAlbHVcbiIsIGdhcmJhZ2UpOworCX0KKwllbHNlCisJCXByaW50ZigiJWx1IG9iamVjdHMsICVsdSBraWxvYnl0ZXNcbiIsCisJCSAgICAgICBsb29zZSwgbG9vc2Vfc2l6ZSAvIDIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1kaWZmLWZpbGVzLmMgYi9idWlsdGluLWRpZmYtZmlsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzEzZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLWZpbGVzLmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX2ZpbGVzX3VzYWdlW10gPQorImdpdC1kaWZmLWZpbGVzIFstcV0gWy0wLy0xLzIvMyB8LWN8LS1jY10gWzxjb21tb24gZGlmZiBvcHRpb25zPl0gWzxwYXRoPi4uLl0iCitDT01NT05fRElGRl9PUFRJT05TX0hFTFA7CisKK2ludCBjbWRfZGlmZl9maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCWludCBzaWxlbnQgPSAwOworCisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7IC8qIG5vICJkaWZmIiBVSSBvcHRpb25zICovCisJcmV2LmFiYnJldiA9IDA7CisKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXYsIE5VTEwpOworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1iYXNlIikpCisJCQlyZXYubWF4X2NvdW50ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1vdXJzIikpCisJCQlyZXYubWF4X2NvdW50ID0gMjsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS10aGVpcnMiKSkKKwkJCXJldi5tYXhfY291bnQgPSAzOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItcSIpKQorCQkJc2lsZW50ID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UoZGlmZl9maWxlc191c2FnZSk7CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKwlpZiAoIXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBhcmUgTk8gcmV2aXNpb24gKGkuZS4gcGVuZGluZyBvYmplY3QpIHBhcmFtZXRlciwKKwkgKiByZXYubWF4X2NvdW50IGlzIHJlYXNvbmFibGUgKDAgPD0gbiA8PSAzKSwKKwkgKiB0aGVyZSBpcyBubyBvdGhlciByZXZpc2lvbiBmaWx0ZXJpbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAocmV2LnBlbmRpbmcubnIgfHwKKwkgICAgcmV2Lm1pbl9hZ2UgIT0gLTEgfHwgcmV2Lm1heF9hZ2UgIT0gLTEpCisJCXVzYWdlKGRpZmZfZmlsZXNfdXNhZ2UpOworCS8qCisJICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3YXJ0IC0gImRpZmYtZmlsZXMgLXMiIHVzZWQgdG8KKwkgKiBkZWZlYXQgdGhlIGNvbW1vbiBkaWZmIG9wdGlvbiAiLXMiIHdoaWNoIGFza2VkIGZvcgorCSAqIERJRkZfRk9STUFUX05PX09VVFBVVC4KKwkgKi8KKwlpZiAocmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9PSBESUZGX0ZPUk1BVF9OT19PVVRQVVQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisJcmV0dXJuIHJ1bl9kaWZmX2ZpbGVzKCZyZXYsIHNpbGVudCk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWRpZmYtaW5kZXguYyBiL2J1aWx0aW4tZGlmZi1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTNkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWRpZmYtaW5kZXguYwpAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGRpZmZfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtaW5kZXggWy1tXSBbLS1jYWNoZWRdICIKKyJbPGNvbW1vbiBkaWZmIG9wdGlvbnM+XSA8dHJlZS1pc2g+IFs8cGF0aD4uLi5dIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlpbnQgY2FjaGVkID0gMDsKKwlpbnQgaTsKKworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOyAvKiBubyAiZGlmZiIgVUkgb3B0aW9ucyAqLworCXJldi5hYmJyZXYgPSAwOworCisJYXJnYyA9IHNldHVwX3JldmlzaW9ucyhhcmdjLCBhcmd2LCAmcmV2LCBOVUxMKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCQkKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkKKwkJCWNhY2hlZCA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGRpZmZfY2FjaGVfdXNhZ2UpOworCX0KKwlpZiAoIXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQpCisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9SQVc7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmUgcmV2aXNpb24gKGkuZS4gcGVuZGluZyBvYmplY3QpLAorCSAqIGFuZCB0aGVyZSBpcyBubyByZXZpc2lvbiBmaWx0ZXJpbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAocmV2LnBlbmRpbmcubnIgIT0gMSB8fAorCSAgICByZXYubWF4X2NvdW50ICE9IC0xIHx8IHJldi5taW5fYWdlICE9IC0xIHx8IHJldi5tYXhfYWdlICE9IC0xKQorCQl1c2FnZShkaWZmX2NhY2hlX3VzYWdlKTsKKwlyZXR1cm4gcnVuX2RpZmZfaW5kZXgoJnJldiwgY2FjaGVkKTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGlmZi1zdGFnZXMuYyBiL2J1aWx0aW4tZGlmZi1zdGFnZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTYwZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLXN0YWdlcy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIHN0cnVjdCBkaWZmX29wdGlvbnMgZGlmZl9vcHRpb25zOworCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX3N0YWdlc191c2FnZVtdID0KKyJnaXQtZGlmZi1zdGFnZXMgWzxjb21tb24gZGlmZiBvcHRpb25zPl0gPHN0YWdlMT4gPHN0YWdlMj4gWzxwYXRoPi4uLl0iCitDT01NT05fRElGRl9PUFRJT05TX0hFTFA7CisKK3N0YXRpYyB2b2lkIGRpZmZfc3RhZ2VzKGludCBzdGFnZTEsIGludCBzdGFnZTIsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKGkgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgKnN0YWdlc1s0XSA9IHsgTlVMTCwgfTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpvbmUsICp0d287CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBsZW4sIHNraXA7CisKKwkJY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCXNraXAgPSAhY2VfcGF0aF9tYXRjaChjZSwgcGF0aHNwZWMpOworCQlsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJbmFtZSA9IGNlLT5uYW1lOworCQlmb3IgKDs7KSB7CisJCQlpbnQgc3RhZ2UgPSBjZV9zdGFnZShjZSk7CisJCQlzdGFnZXNbc3RhZ2VdID0gY2U7CisJCQlpZiAoYWN0aXZlX25yIDw9ICsraSkKKwkJCQlicmVhazsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW2ldOworCQkJaWYgKGNlX25hbWVsZW4oY2UpICE9IGxlbiB8fAorCQkJICAgIG1lbWNtcChuYW1lLCBjZS0+bmFtZSwgbGVuKSkKKwkJCQlicmVhazsKKwkJfQorCQlvbmUgPSBzdGFnZXNbc3RhZ2UxXTsKKwkJdHdvID0gc3RhZ2VzW3N0YWdlMl07CisKKwkJaWYgKHNraXAgfHwgKCFvbmUgJiYgIXR3bykpCisJCQljb250aW51ZTsKKwkJaWYgKCFvbmUpCisJCQlkaWZmX2FkZHJlbW92ZSgmZGlmZl9vcHRpb25zLCAnKycsIG50b2hsKHR3by0+Y2VfbW9kZSksCisJCQkJICAgICAgIHR3by0+c2hhMSwgbmFtZSwgTlVMTCk7CisJCWVsc2UgaWYgKCF0d28pCisJCQlkaWZmX2FkZHJlbW92ZSgmZGlmZl9vcHRpb25zLCAnLScsIG50b2hsKG9uZS0+Y2VfbW9kZSksCisJCQkJICAgICAgIG9uZS0+c2hhMSwgbmFtZSwgTlVMTCk7CisJCWVsc2UgaWYgKG1lbWNtcChvbmUtPnNoYTEsIHR3by0+c2hhMSwgMjApIHx8CisJCQkgKG9uZS0+Y2VfbW9kZSAhPSB0d28tPmNlX21vZGUpIHx8CisJCQkgZGlmZl9vcHRpb25zLmZpbmRfY29waWVzX2hhcmRlcikKKwkJCWRpZmZfY2hhbmdlKCZkaWZmX29wdGlvbnMsCisJCQkJICAgIG50b2hsKG9uZS0+Y2VfbW9kZSksIG50b2hsKHR3by0+Y2VfbW9kZSksCisJCQkJICAgIG9uZS0+c2hhMSwgdHdvLT5zaGExLCBuYW1lLCBOVUxMKTsKKwl9Cit9CisKK2ludCBjbWRfZGlmZl9zdGFnZXMoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgc3RhZ2UxLCBzdGFnZTI7CisJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gTlVMTDsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsgLyogbm8gImRpZmYiIFVJIG9wdGlvbnMgKi8KKwlyZWFkX2NhY2hlKCk7CisJZGlmZl9zZXR1cCgmZGlmZl9vcHRpb25zKTsKKwl3aGlsZSAoMSA8IGFjICYmIGF2WzFdWzBdID09ICctJykgeworCQljb25zdCBjaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXIiKSkKKwkJCTsgLyogYXMgdXN1YWwgKi8KKwkJZWxzZSB7CisJCQlpbnQgZGlmZl9vcHRfY250OworCQkJZGlmZl9vcHRfY250ID0gZGlmZl9vcHRfcGFyc2UoJmRpZmZfb3B0aW9ucywKKwkJCQkJCSAgICAgIGF2KzEsIGFjLTEpOworCQkJaWYgKGRpZmZfb3B0X2NudCA8IDApCisJCQkJdXNhZ2UoZGlmZl9zdGFnZXNfdXNhZ2UpOworCQkJZWxzZSBpZiAoZGlmZl9vcHRfY250KSB7CisJCQkJYXYgKz0gZGlmZl9vcHRfY250OworCQkJCWFjIC09IGRpZmZfb3B0X2NudDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQl1c2FnZShkaWZmX3N0YWdlc191c2FnZSk7CisJCX0KKwkJYWMtLTsgYXYrKzsKKwl9CisKKwlpZiAoIWRpZmZfb3B0aW9ucy5vdXRwdXRfZm9ybWF0KQorCQlkaWZmX29wdGlvbnMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKworCWlmIChhYyA8IDMgfHwKKwkgICAgc3NjYW5mKGF2WzFdLCAiJWQiLCAmc3RhZ2UxKSAhPSAxIHx8CisJICAgICEgKDAgPD0gc3RhZ2UxICYmIHN0YWdlMSA8PSAzKSB8fAorCSAgICBzc2NhbmYoYXZbMl0sICIlZCIsICZzdGFnZTIpICE9IDEgfHwKKwkgICAgISAoMCA8PSBzdGFnZTIgJiYgc3RhZ2UyIDw9IDMpKQorCQl1c2FnZShkaWZmX3N0YWdlc191c2FnZSk7CisKKwlhdiArPSAzOyAvKiBUaGUgcmVzdCBmcm9tIGF2WzBdIGFyZSBmb3IgcGF0aHMgcmVzdHJpY3Rpb24uICovCisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhdik7CisKKwlpZiAoZGlmZl9zZXR1cF9kb25lKCZkaWZmX29wdGlvbnMpIDwgMCkKKwkJdXNhZ2UoZGlmZl9zdGFnZXNfdXNhZ2UpOworCisJZGlmZl9zdGFnZXMoc3RhZ2UxLCBzdGFnZTIsIHBhdGhzcGVjKTsKKwlkaWZmY29yZV9zdGQoJmRpZmZfb3B0aW9ucyk7CisJZGlmZl9mbHVzaCgmZGlmZl9vcHRpb25zKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tZGlmZi10cmVlLmMgYi9idWlsdGluLWRpZmYtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0Y2IyZDdmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLXRyZWUuYwpAQCAtMCwwICsxLDEzNyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgc3RydWN0IHJldl9pbmZvIGxvZ190cmVlX29wdDsKKworc3RhdGljIGludCBkaWZmX3RyZWVfY29tbWl0X3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwlpZiAoIWNvbW1pdCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBsb2dfdHJlZV9jb21taXQoJmxvZ190cmVlX29wdCwgY29tbWl0KTsKK30KKworc3RhdGljIGludCBkaWZmX3RyZWVfc3RkaW4oY2hhciAqbGluZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJaWYgKCFsZW4gfHwgbGluZVtsZW4tMV0gIT0gJ1xuJykKKwkJcmV0dXJuIC0xOworCWxpbmVbbGVuLTFdID0gMDsKKwlpZiAoZ2V0X3NoYTFfaGV4KGxpbmUsIHNoYTEpKQorCQlyZXR1cm4gLTE7CisJY29tbWl0ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKwlpZiAoIWNvbW1pdCB8fCBwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJcmV0dXJuIC0xOworCWlmIChpc3NwYWNlKGxpbmVbNDBdKSAmJiAhZ2V0X3NoYTFfaGV4KGxpbmUrNDEsIHNoYTEpKSB7CisJCS8qIEdyYWZ0IHRoZSBmYWtlIHBhcmVudHMgbG9jYWxseSB0byB0aGUgY29tbWl0ICovCisJCWludCBwb3MgPSA0MTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICoqcHB0ciwgKnBhcmVudHM7CisKKwkJLyogRnJlZSB0aGUgcmVhbCBwYXJlbnQgbGlzdCAqLworCQlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7IHBhcmVudHM7ICkgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICp0bXAgPSBwYXJlbnRzLT5uZXh0OworCQkJZnJlZShwYXJlbnRzKTsKKwkJCXBhcmVudHMgPSB0bXA7CisJCX0KKwkJY29tbWl0LT5wYXJlbnRzID0gTlVMTDsKKwkJcHB0ciA9ICYoY29tbWl0LT5wYXJlbnRzKTsKKwkJd2hpbGUgKGxpbmVbcG9zXSAmJiAhZ2V0X3NoYTFfaGV4KGxpbmUgKyBwb3MsIHNoYTEpKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCQkJaWYgKHBhcmVudCkgeworCQkJCXBwdHIgPSAmY29tbWl0X2xpc3RfaW5zZXJ0KHBhcmVudCwgcHB0ciktPm5leHQ7CisJCQl9CisJCQlwb3MgKz0gNDE7CisJCX0KKwl9CisJcmV0dXJuIGxvZ190cmVlX2NvbW1pdCgmbG9nX3RyZWVfb3B0LCBjb21taXQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX3RyZWVfdXNhZ2VbXSA9CisiZ2l0LWRpZmYtdHJlZSBbLS1zdGRpbl0gWy1tXSBbLWNdIFstLWNjXSBbLXNdIFstdl0gWy0tcHJldHR5XSBbLXRdIFstcl0gWy0tcm9vdF0gIgorIls8Y29tbW9uIGRpZmYgb3B0aW9ucz5dIDx0cmVlLWlzaD4gWzx0cmVlLWlzaD5dIFs8cGF0aD4uLi5dXG4iCisiICAtciAgICAgICAgICAgIGRpZmYgcmVjdXJzaXZlbHlcbiIKKyIgIC0tcm9vdCAgICAgICAgaW5jbHVkZSB0aGUgaW5pdGlhbCBjb21taXQgYXMgZGlmZiBhZ2FpbnN0IC9kZXYvbnVsbFxuIgorQ09NTU9OX0RJRkZfT1BUSU9OU19IRUxQOworCitpbnQgY21kX2RpZmZfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbnJfc2hhMTsKKwljaGFyIGxpbmVbMTAwMF07CisJc3RydWN0IG9iamVjdCAqdHJlZTEsICp0cmVlMjsKKwlzdGF0aWMgc3RydWN0IHJldl9pbmZvICpvcHQgPSAmbG9nX3RyZWVfb3B0OworCWludCByZWFkX3N0ZGluID0gMDsKKworCWluaXRfcmV2aXNpb25zKG9wdCwgcHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7IC8qIG5vICJkaWZmIiBVSSBvcHRpb25zICovCisJbnJfc2hhMSA9IDA7CisJb3B0LT5hYmJyZXYgPSAwOworCW9wdC0+ZGlmZiA9IDE7CisJYXJnYyA9IHNldHVwX3JldmlzaW9ucyhhcmdjLCBhcmd2LCBvcHQsIE5VTEwpOworCisJd2hpbGUgKC0tYXJnYyA+IDApIHsKKwkJY29uc3QgY2hhciAqYXJnID0gKisrYXJndjsKKworCQlpZiAoIXN0cmNtcChhcmcsICItLXN0ZGluIikpIHsKKwkJCXJlYWRfc3RkaW4gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJdXNhZ2UoZGlmZl90cmVlX3VzYWdlKTsKKwl9CisKKwlpZiAoIW9wdC0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0KQorCQlvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1JBVzsKKworCS8qCisJICogTk9URSEgV2UgZXhwZWN0ICJhIF5iIiB0byBiZSBlcXVhbCB0byAiYS4uYiIsIHNvIHdlCisJICogcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIG9iamVjdHMgaWYgdGhlIHNlY29uZCBvbmUKKwkgKiBpcyBtYXJrZWQgVU5JTlRFUkVTVElORy4KKwkgKi8KKwlucl9zaGExID0gb3B0LT5wZW5kaW5nLm5yOworCXN3aXRjaCAobnJfc2hhMSkgeworCWNhc2UgMDoKKwkJaWYgKCFyZWFkX3N0ZGluKQorCQkJdXNhZ2UoZGlmZl90cmVlX3VzYWdlKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl0cmVlMSA9IG9wdC0+cGVuZGluZy5vYmplY3RzWzBdLml0ZW07CisJCWRpZmZfdHJlZV9jb21taXRfc2hhMSh0cmVlMS0+c2hhMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdHJlZTEgPSBvcHQtPnBlbmRpbmcub2JqZWN0c1swXS5pdGVtOworCQl0cmVlMiA9IG9wdC0+cGVuZGluZy5vYmplY3RzWzFdLml0ZW07CisJCWlmICh0cmVlMi0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICp0bXAgPSB0cmVlMjsKKwkJCXRyZWUyID0gdHJlZTE7CisJCQl0cmVlMSA9IHRtcDsKKwkJfQorCQlkaWZmX3RyZWVfc2hhMSh0cmVlMS0+c2hhMSwKKwkJCSAgICAgICB0cmVlMi0+c2hhMSwKKwkJCSAgICAgICAiIiwgJm9wdC0+ZGlmZm9wdCk7CisJCWxvZ190cmVlX2RpZmZfZmx1c2gob3B0KTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZWFkX3N0ZGluKQorCQlyZXR1cm4gMDsKKworCWlmIChvcHQtPmRpZmZvcHQuZGV0ZWN0X3JlbmFtZSkKKwkJb3B0LT5kaWZmb3B0LnNldHVwIHw9IChESUZGX1NFVFVQX1VTRV9TSVpFX0NBQ0hFIHwKKwkJCQkgICAgICAgRElGRl9TRVRVUF9VU0VfQ0FDSEUpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJCWlmIChnZXRfc2hhMV9oZXgobGluZSwgc2hhMSkpIHsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCQllbHNlCisJCQlkaWZmX3RyZWVfc3RkaW4obGluZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1kaWZmLmMgYi9idWlsdGluLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDkwZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1kaWZmLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiBCdWlsdGluICJnaXQgZGlmZiIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgInJldmlzaW9uLmgiCisjaW5jbHVkZSAibG9nLXRyZWUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8qIE5FRURTV09SSzogc3RydWN0IG9iamVjdCBoYXMgcGxhY2UgZm9yIG5hbWUgYnV0IHdlIF9kb18KKyAqIGtub3cgbW9kZSB3aGVuIHdlIGV4dHJhY3RlZCB0aGUgYmxvYiBvdXQgb2YgYSB0cmVlLCB3aGljaAorICogd2UgY3VycmVudGx5IGxvc2UuCisgKi8KK3N0cnVjdCBibG9iaW5mbyB7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9kaWZmX3VzYWdlW10gPQorImdpdC1kaWZmIDxvcHRpb25zPiA8cmV2PnswLDJ9IC0tIDxwYXRoPioiOworCitzdGF0aWMgaW50IGJ1aWx0aW5fZGlmZl9maWxlcyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgICAgICBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJaW50IHNpbGVudCA9IDA7CisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi0tYmFzZSIpKQorCQkJcmV2cy0+bWF4X2NvdW50ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW91cnMiKSkKKwkJCXJldnMtPm1heF9jb3VudCA9IDI7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS10aGVpcnMiKSkKKwkJCXJldnMtPm1heF9jb3VudCA9IDM7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXEiKSkKKwkJCXNpbGVudCA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCWFyZ3YrKzsgYXJnYy0tOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSBhcmUgTk8gcmV2aXNpb24gKGkuZS4gcGVuZGluZyBvYmplY3QpIHBhcmFtZXRlciwKKwkgKiBzcGVjaWZpZWQgcmV2Lm1heF9jb3VudCBpcyByZWFzb25hYmxlICgwIDw9IG4gPD0gMyksIGFuZAorCSAqIHRoZXJlIGlzIG5vIG90aGVyIHJldmlzaW9uIGZpbHRlcmluZyBwYXJhbWV0ZXIuCisJICovCisJaWYgKHJldnMtPnBlbmRpbmcubnIgfHwKKwkgICAgcmV2cy0+bWluX2FnZSAhPSAtMSB8fAorCSAgICByZXZzLT5tYXhfYWdlICE9IC0xIHx8CisJICAgIDMgPCByZXZzLT5tYXhfY291bnQpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJaWYgKHJldnMtPm1heF9jb3VudCA8IDAgJiYKKwkgICAgKHJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX1BBVENIKSkKKwkJcmV2cy0+Y29tYmluZV9tZXJnZXMgPSByZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAxOworCS8qCisJICogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3YXJ0IC0gImRpZmYtZmlsZXMgLXMiIHVzZWQgdG8KKwkgKiBkZWZlYXQgdGhlIGNvbW1vbiBkaWZmIG9wdGlvbiAiLXMiIHdoaWNoIGFza2VkIGZvcgorCSAqIERJRkZfRk9STUFUX05PX09VVFBVVC4KKwkgKi8KKwlpZiAocmV2cy0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID09IERJRkZfRk9STUFUX05PX09VVFBVVCkKKwkJcmV2cy0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCXJldHVybiBydW5fZGlmZl9maWxlcyhyZXZzLCBzaWxlbnQpOworfQorCitzdGF0aWMgdm9pZCBzdHVmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LAorCQkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJCSBjb25zdCBjaGFyICpvbGRfbmFtZSwKKwkJCSBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJaWYgKG1lbWNtcChudWxsX3NoYTEsIG9sZF9zaGExLCAyMCkgJiYKKwkgICAgbWVtY21wKG51bGxfc2hhMSwgbmV3X3NoYTEsIDIwKSAmJgorCSAgICAhbWVtY21wKG9sZF9zaGExLCBuZXdfc2hhMSwgMjApKQorCQlyZXR1cm47CisKKwlpZiAob3B0LT5yZXZlcnNlX2RpZmYpIHsKKwkJdW5zaWduZWQgdG1wOworCQljb25zdCB1bnNpZ25lZCBjaGFyICp0bXBfdTsKKwkJY29uc3QgY2hhciAqdG1wX2M7CisJCXRtcCA9IG9sZF9tb2RlOyBvbGRfbW9kZSA9IG5ld19tb2RlOyBuZXdfbW9kZSA9IHRtcDsKKwkJdG1wX3UgPSBvbGRfc2hhMTsgb2xkX3NoYTEgPSBuZXdfc2hhMTsgbmV3X3NoYTEgPSB0bXBfdTsKKwkJdG1wX2MgPSBvbGRfbmFtZTsgb2xkX25hbWUgPSBuZXdfbmFtZTsgbmV3X25hbWUgPSB0bXBfYzsKKwl9CisJb25lID0gYWxsb2NfZmlsZXNwZWMob2xkX25hbWUpOworCXR3byA9IGFsbG9jX2ZpbGVzcGVjKG5ld19uYW1lKTsKKwlmaWxsX2ZpbGVzcGVjKG9uZSwgb2xkX3NoYTEsIG9sZF9tb2RlKTsKKwlmaWxsX2ZpbGVzcGVjKHR3bywgbmV3X3NoYTEsIG5ld19tb2RlKTsKKworCS8qIE5FRURTV09SSzogc2hvdWxkbid0IHRoaXMgcGFydCBvZiBkaWZmb3B0Pz8/ICovCisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pOworfQorCitzdGF0aWMgaW50IGJ1aWx0aW5fZGlmZl9iX2Yoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCSAgICBzdHJ1Y3QgYmxvYmluZm8gKmJsb2IsCisJCQkgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKwkvKiBCbG9iIHZzIGZpbGUgaW4gdGhlIHdvcmtpbmcgdHJlZSovCisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwlpZiAobHN0YXQocGF0aCwgJnN0KSkKKwkJZGllKCInJXMnOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKCEoU19JU1JFRyhzdC5zdF9tb2RlKSB8fCBTX0lTTE5LKHN0LnN0X21vZGUpKSkKKwkJZGllKCInJXMnOiBub3QgYSByZWd1bGFyIGZpbGUgb3Igc3ltbGluayIsIHBhdGgpOworCXN0dWZmX2NoYW5nZSgmcmV2cy0+ZGlmZm9wdCwKKwkJICAgICBjYW5vbl9tb2RlKHN0LnN0X21vZGUpLCBjYW5vbl9tb2RlKHN0LnN0X21vZGUpLAorCQkgICAgIGJsb2JbMF0uc2hhMSwgbnVsbF9zaGExLAorCQkgICAgIHBhdGgsIHBhdGgpOworCWRpZmZjb3JlX3N0ZCgmcmV2cy0+ZGlmZm9wdCk7CisJZGlmZl9mbHVzaCgmcmV2cy0+ZGlmZm9wdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbHRpbl9kaWZmX2Jsb2JzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSAgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCSAgICAgIHN0cnVjdCBibG9iaW5mbyAqYmxvYikKK3sKKwl1bnNpZ25lZCBtb2RlID0gY2Fub25fbW9kZShTX0lGUkVHIHwgMDY0NCk7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwlzdHVmZl9jaGFuZ2UoJnJldnMtPmRpZmZvcHQsCisJCSAgICAgbW9kZSwgbW9kZSwKKwkJICAgICBibG9iWzBdLnNoYTEsIGJsb2JbMV0uc2hhMSwKKwkJICAgICBibG9iWzBdLm5hbWUsIGJsb2JbMV0ubmFtZSk7CisJZGlmZmNvcmVfc3RkKCZyZXZzLT5kaWZmb3B0KTsKKwlkaWZmX2ZsdXNoKCZyZXZzLT5kaWZmb3B0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfaW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICAgICAgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBjYWNoZWQgPSAwOworCXdoaWxlICgxIDwgYXJnYykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2WzFdOworCQlpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlZCIpKQorCQkJY2FjaGVkID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKwkJYXJndisrOyBhcmdjLS07CisJfQorCS8qCisJICogTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSByZXZpc2lvbiAoaS5lLiBwZW5kaW5nIG9iamVjdCksCisJICogYW5kIHRoZXJlIGlzIG5vIHJldmlzaW9uIGZpbHRlcmluZyBwYXJhbWV0ZXJzLgorCSAqLworCWlmIChyZXZzLT5wZW5kaW5nLm5yICE9IDEgfHwKKwkgICAgcmV2cy0+bWF4X2NvdW50ICE9IC0xIHx8IHJldnMtPm1pbl9hZ2UgIT0gLTEgfHwKKwkgICAgcmV2cy0+bWF4X2FnZSAhPSAtMSkKKwkJdXNhZ2UoYnVpbHRpbl9kaWZmX3VzYWdlKTsKKwlyZXR1cm4gcnVuX2RpZmZfaW5kZXgocmV2cywgY2FjaGVkKTsKK30KKworc3RhdGljIGludCBidWlsdGluX2RpZmZfdHJlZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkgICAgIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCSAgICAgc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZW50KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKihzaGExWzJdKTsKKwlpbnQgc3dhcCA9IDA7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwkvKiBXZSBzYXcgdHdvIHRyZWVzLCBlbnRbMF0gYW5kIGVudFsxXS4KKwkgKiBpZiBlbnRbMV0gaXMgdW5pbnRlcmVzdGluZywgdGhleSBhcmUgc3dhcHBlZAorCSAqLworCWlmIChlbnRbMV0uaXRlbS0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlzd2FwID0gMTsKKwlzaGExW3N3YXBdID0gZW50WzBdLml0ZW0tPnNoYTE7CisJc2hhMVsxLXN3YXBdID0gZW50WzFdLml0ZW0tPnNoYTE7CisJZGlmZl90cmVlX3NoYTEoc2hhMVswXSwgc2hhMVsxXSwgIiIsICZyZXZzLT5kaWZmb3B0KTsKKwlsb2dfdHJlZV9kaWZmX2ZsdXNoKHJldnMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWx0aW5fZGlmZl9jb21iaW5lZChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisJCQkJIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJCQkgc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqZW50LAorCQkJCSBpbnQgZW50cykKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICgqcGFyZW50KVsyMF07CisJaW50IGk7CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisKKwlpZiAoIXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyAmJiAhcmV2cy0+Y29tYmluZV9tZXJnZXMpCisJCXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IHJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwlwYXJlbnQgPSB4bWFsbG9jKGVudHMgKiBzaXplb2YoKnBhcmVudCkpOworCS8qIEFnYWluLCB0aGUgcmV2cyBhcmUgYWxsIHJldmVyc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZW50czsgaSsrKQorCQltZW1jcHkocGFyZW50ICsgaSwgZW50W2VudHMgLSAxIC0gaV0uaXRlbS0+c2hhMSwgMjApOworCWRpZmZfdHJlZV9jb21iaW5lZChwYXJlbnRbMF0sIHBhcmVudCArIDEsIGVudHMgLSAxLAorCQkJICAgcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCByZXZzKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBhZGRfaGVhZChzdHJ1Y3QgcmV2X2luZm8gKnJldnMpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJaWYgKGdldF9zaGExKCJIRUFEIiwgc2hhMSkpCisJCXJldHVybjsKKwlvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopCisJCXJldHVybjsKKwlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqLCAiSEVBRCIpOworfQorCitpbnQgY21kX2RpZmYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGk7CisJc3RydWN0IHJldl9pbmZvIHJldjsKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5X2VudHJ5IGVudFsxMDBdOworCWludCBlbnRzID0gMCwgYmxvYnMgPSAwLCBwYXRocyA9IDA7CisJY29uc3QgY2hhciAqcGF0aCA9IE5VTEw7CisJc3RydWN0IGJsb2JpbmZvIGJsb2JbMl07CisKKwkvKgorCSAqIFdlIGNvdWxkIGdldCBOIHRyZWUtaXNoIGluIHRoZSByZXYucGVuZGluZ19vYmplY3RzIGxpc3QuCisJICogQWxzbyB0aGVyZSBjb3VsZCBiZSBNIGJsb2JzIHRoZXJlLCBhbmQgUCBwYXRoc3BlY3MuCisJICoKKwkgKiBOPTAsIE09MDoKKwkgKgljYWNoZSB2cyBmaWxlcyAoZGlmZi1maWxlcykKKwkgKiBOPTAsIE09MjoKKwkgKiAgICAgIGNvbXBhcmUgdHdvIHJhbmRvbSBibG9icy4gIFAgbXVzdCBiZSB6ZXJvLgorCSAqIE49MCwgTT0xLCBQPTE6CisJICoJY29tcGFyZSBhIGJsb2Igd2l0aCBhIHdvcmtpbmcgdHJlZSBmaWxlLgorCSAqCisJICogTj0xLCBNPTA6CisJICogICAgICB0cmVlIHZzIGNhY2hlIChkaWZmLWluZGV4IC0tY2FjaGVkKQorCSAqCisJICogTj0yLCBNPTA6CisJICogICAgICB0cmVlIHZzIHRyZWUgKGRpZmYtdHJlZSkKKwkgKgorCSAqIE90aGVyIGNhc2VzIGFyZSBlcnJvcnMuCisJICovCisKKwlnaXRfY29uZmlnKGdpdF9kaWZmX3VpX2NvbmZpZyk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgJnJldiwgTlVMTCk7CisJaWYgKCFyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0KSB7CisJCXJldi5kaWZmb3B0Lm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJaWYgKGRpZmZfc2V0dXBfZG9uZSgmcmV2LmRpZmZvcHQpIDwgMCkKKwkJCWRpZSgiZGlmZl9zZXR1cF9kb25lIGZhaWxlZCIpOworCX0KKworCS8qIERvIHdlIGhhdmUgLS1jYWNoZWQgYW5kIG5vdCBoYXZlIGEgcGVuZGluZyBvYmplY3QsIHRoZW4KKwkgKiBkZWZhdWx0IHRvIEhFQUQgYnkgaGFuZC4gIEVlay4KKwkgKi8KKwlpZiAoIXJldi5wZW5kaW5nLm5yKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1jYWNoZWQiKSkgeworCQkJCWFkZF9oZWFkKCZyZXYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IHJldi5wZW5kaW5nLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqbGlzdCA9IHJldi5wZW5kaW5nLm9iamVjdHMraTsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gbGlzdC0+aXRlbTsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGxpc3QtPm5hbWU7CisJCWludCBmbGFncyA9IChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORyk7CisJCWlmICghb2JqLT5wYXJzZWQpCisJCQlvYmogPSBwYXJzZV9vYmplY3Qob2JqLT5zaGExKTsKKwkJb2JqID0gZGVyZWZfdGFnKG9iaiwgTlVMTCwgMCk7CisJCWlmICghb2JqKQorCQkJZGllKCJpbnZhbGlkIG9iamVjdCAnJXMnIGdpdmVuLiIsIG5hbWUpOworCQlpZiAob2JqLT50eXBlID09IE9CSl9DT01NSVQpCisJCQlvYmogPSAmKChzdHJ1Y3QgY29tbWl0ICopb2JqKS0+dHJlZS0+b2JqZWN0OworCQlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCQlpZiAoQVJSQVlfU0laRShlbnQpIDw9IGVudHMpCisJCQkJZGllKCJtb3JlIHRoYW4gJWQgdHJlZXMgZ2l2ZW46ICclcyciLAorCQkJCSAgICAoaW50KSBBUlJBWV9TSVpFKGVudCksIG5hbWUpOworCQkJb2JqLT5mbGFncyB8PSBmbGFnczsKKwkJCWVudFtlbnRzXS5pdGVtID0gb2JqOworCQkJZW50W2VudHNdLm5hbWUgPSBuYW1lOworCQkJZW50cysrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfQkxPQikgeworCQkJaWYgKDIgPD0gYmxvYnMpCisJCQkJZGllKCJtb3JlIHRoYW4gdHdvIGJsb2JzIGdpdmVuOiAnJXMnIiwgbmFtZSk7CisJCQltZW1jcHkoYmxvYltibG9ic10uc2hhMSwgb2JqLT5zaGExLCAyMCk7CisJCQlibG9iW2Jsb2JzXS5uYW1lID0gbmFtZTsKKwkJCWJsb2JzKys7CisJCQljb250aW51ZTsKKworCQl9CisJCWRpZSgidW5oYW5kbGVkIG9iamVjdCAnJXMnIGdpdmVuLiIsIG5hbWUpOworCX0KKwlpZiAocmV2LnBydW5lX2RhdGEpIHsKKwkJY29uc3QgY2hhciAqKnBhdGhzcGVjID0gcmV2LnBydW5lX2RhdGE7CisJCXdoaWxlICgqcGF0aHNwZWMpIHsKKwkJCWlmICghcGF0aCkKKwkJCQlwYXRoID0gKnBhdGhzcGVjOworCQkJcGF0aHMrKzsKKwkJCXBhdGhzcGVjKys7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdywgZG8gdGhlIGFyZ3VtZW50cyBsb29rIHJlYXNvbmFibGU/CisJICovCisJaWYgKCFlbnRzKSB7CisJCXN3aXRjaCAoYmxvYnMpIHsKKwkJY2FzZSAwOgorCQkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9maWxlcygmcmV2LCBhcmdjLCBhcmd2KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAocGF0aHMgIT0gMSkKKwkJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9iX2YoJnJldiwgYXJnYywgYXJndiwgYmxvYiwgcGF0aCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJaWYgKHBhdGhzKQorCQkJCXVzYWdlKGJ1aWx0aW5fZGlmZl91c2FnZSk7CisJCQlyZXR1cm4gYnVpbHRpbl9kaWZmX2Jsb2JzKCZyZXYsIGFyZ2MsIGFyZ3YsIGJsb2IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCQl9CisJfQorCWVsc2UgaWYgKGJsb2JzKQorCQl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworCWVsc2UgaWYgKGVudHMgPT0gMSkKKwkJcmV0dXJuIGJ1aWx0aW5fZGlmZl9pbmRleCgmcmV2LCBhcmdjLCBhcmd2KTsKKwllbHNlIGlmIChlbnRzID09IDIpCisJCXJldHVybiBidWlsdGluX2RpZmZfdHJlZSgmcmV2LCBhcmdjLCBhcmd2LCBlbnQpOworCWVsc2UgaWYgKChlbnRzID09IDMpICYmIChlbnRbMF0uaXRlbS0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkgeworCQkvKiBkaWZmIEEuLi5CIHdoZXJlIHRoZXJlIGlzIG9uZSBzYW5lIG1lcmdlIGJhc2UgYmV0d2VlbgorCQkgKiBBIGFuZCBCLiAgV2UgaGF2ZSBlbnRbMF0gPT0gbWVyZ2UtYmFzZSwgZW50WzFdID09IEEsCisJCSAqIGFuZCBlbnRbMl0gPT0gQi4gIFNob3cgZGlmZiBiZXR3ZWVuIHRoZSBiYXNlIGFuZCBCLgorCQkgKi8KKwkJZW50WzFdID0gZW50WzJdOworCQlyZXR1cm4gYnVpbHRpbl9kaWZmX3RyZWUoJnJldiwgYXJnYywgYXJndiwgZW50KTsKKwl9CisJZWxzZQorCQlyZXR1cm4gYnVpbHRpbl9kaWZmX2NvbWJpbmVkKCZyZXYsIGFyZ2MsIGFyZ3YsCisJCQkJCSAgICAgZW50LCBlbnRzKTsKKwl1c2FnZShidWlsdGluX2RpZmZfdXNhZ2UpOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1mbXQtbWVyZ2UtbXNnLmMgYi9idWlsdGluLWZtdC1tZXJnZS1tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODVlZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1mbXQtbWVyZ2UtbXNnLmMKQEAgLTAsMCArMSwzNjAgQEAKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJ0YWcuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9tZXJnZV9tc2dfdXNhZ2UgPQorCSJnaXQtZm10LW1lcmdlLW1zZyBbLS1zdW1tYXJ5XSBbLS1uby1zdW1tYXJ5XSBbLS1maWxlIDxmaWxlPl0iOworCitzdGF0aWMgaW50IG1lcmdlX3N1bW1hcnkgPSAwOworCitzdGF0aWMgaW50IGZtdF9tZXJnZV9tc2dfY29uZmlnKGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAoIm1lcmdlLnN1bW1hcnkiLCBrZXkpKQorCQltZXJnZV9zdW1tYXJ5ID0gZ2l0X2NvbmZpZ19ib29sKGtleSwgdmFsdWUpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbGlzdCB7CisJY2hhciAqKmxpc3Q7CisJdm9pZCAqKnBheWxvYWQ7CisJdW5zaWduZWQgbnIsIGFsbG9jOworfTsKKworc3RhdGljIHZvaWQgYXBwZW5kX3RvX2xpc3Qoc3RydWN0IGxpc3QgKmxpc3QsIGNoYXIgKnZhbHVlLCB2b2lkICpwYXlsb2FkKQoreworCWlmIChsaXN0LT5uciA9PSBsaXN0LT5hbGxvYykgeworCQlsaXN0LT5hbGxvYyArPSAzMjsKKwkJbGlzdC0+bGlzdCA9IHJlYWxsb2MobGlzdC0+bGlzdCwgc2l6ZW9mKGNoYXIgKikgKiBsaXN0LT5hbGxvYyk7CisJCWxpc3QtPnBheWxvYWQgPSByZWFsbG9jKGxpc3QtPnBheWxvYWQsCisJCQkJc2l6ZW9mKGNoYXIgKikgKiBsaXN0LT5hbGxvYyk7CisJfQorCWxpc3QtPnBheWxvYWRbbGlzdC0+bnJdID0gcGF5bG9hZDsKKwlsaXN0LT5saXN0W2xpc3QtPm5yKytdID0gdmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9pbl9saXN0KHN0cnVjdCBsaXN0ICpsaXN0LCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQlpZiAoIXN0cmNtcChsaXN0LT5saXN0W2ldLCB2YWx1ZSkpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9saXN0KHN0cnVjdCBsaXN0ICpsaXN0KQoreworCWludCBpOworCisJaWYgKGxpc3QtPmFsbG9jID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKSB7CisJCWZyZWUobGlzdC0+bGlzdFtpXSk7CisJCWlmIChsaXN0LT5wYXlsb2FkW2ldKQorCQkJZnJlZShsaXN0LT5wYXlsb2FkW2ldKTsKKwl9CisJZnJlZShsaXN0LT5saXN0KTsKKwlmcmVlKGxpc3QtPnBheWxvYWQpOworCWxpc3QtPm5yID0gbGlzdC0+YWxsb2MgPSAwOworfQorCitzdHJ1Y3Qgc3JjX2RhdGEgeworCXN0cnVjdCBsaXN0IGJyYW5jaCwgdGFnLCByX2JyYW5jaCwgZ2VuZXJpYzsKKwlpbnQgaGVhZF9zdGF0dXM7Cit9OworCitzdGF0aWMgc3RydWN0IGxpc3Qgc3JjcyA9IHsgTlVMTCwgTlVMTCwgMCwgMH07CitzdGF0aWMgc3RydWN0IGxpc3Qgb3JpZ2lucyA9IHsgTlVMTCwgTlVMTCwgMCwgMH07CisKK3N0YXRpYyBpbnQgaGFuZGxlX2xpbmUoY2hhciAqbGluZSkKK3sKKwlpbnQgaSwgbGVuID0gc3RybGVuKGxpbmUpOworCXVuc2lnbmVkIGNoYXIgKnNoYTE7CisJY2hhciAqc3JjLCAqb3JpZ2luOworCXN0cnVjdCBzcmNfZGF0YSAqc3JjX2RhdGE7CisJaW50IHB1bGxpbmdfaGVhZCA9IDA7CisKKwlpZiAobGVuIDwgNDMgfHwgbGluZVs0MF0gIT0gJ1x0JykKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXN0cm5jbXAobGluZSArIDQxLCAibm90LWZvci1tZXJnZSIsIDEzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGluZVs0MV0gIT0gJ1x0JykKKwkJcmV0dXJuIDI7CisKKwlsaW5lWzQwXSA9IDA7CisJc2hhMSA9IHhtYWxsb2MoMjApOworCWkgPSBnZXRfc2hhMShsaW5lLCBzaGExKTsKKwlsaW5lWzQwXSA9ICdcdCc7CisJaWYgKGkpCisJCXJldHVybiAzOworCisJaWYgKGxpbmVbbGVuIC0gMV0gPT0gJ1xuJykKKwkJbGluZVtsZW4gLSAxXSA9IDA7CisJbGluZSArPSA0MjsKKworCXNyYyA9IHN0cnN0cihsaW5lLCAiIG9mICIpOworCWlmIChzcmMpIHsKKwkJKnNyYyA9IDA7CisJCXNyYyArPSA0OworCQlwdWxsaW5nX2hlYWQgPSAwOworCX0gZWxzZSB7CisJCXNyYyA9IGxpbmU7CisJCXB1bGxpbmdfaGVhZCA9IDE7CisJfQorCisJaSA9IGZpbmRfaW5fbGlzdCgmc3Jjcywgc3JjKTsKKwlpZiAoaSA8IDApIHsKKwkJaSA9IHNyY3MubnI7CisJCWFwcGVuZF90b19saXN0KCZzcmNzLCBzdHJkdXAoc3JjKSwKKwkJCQl4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgc3JjX2RhdGEpKSk7CisJfQorCXNyY19kYXRhID0gc3Jjcy5wYXlsb2FkW2ldOworCisJaWYgKHB1bGxpbmdfaGVhZCkgeworCQlvcmlnaW4gPSBzdHJkdXAoc3JjKTsKKwkJc3JjX2RhdGEtPmhlYWRfc3RhdHVzIHw9IDE7CisJfSBlbHNlIGlmICghc3RybmNtcChsaW5lLCAiYnJhbmNoICIsIDcpKSB7CisJCW9yaWdpbiA9IHN0cmR1cChsaW5lICsgNyk7CisJCWFwcGVuZF90b19saXN0KCZzcmNfZGF0YS0+YnJhbmNoLCBvcmlnaW4sIE5VTEwpOworCQlzcmNfZGF0YS0+aGVhZF9zdGF0dXMgfD0gMjsKKwl9IGVsc2UgaWYgKCFzdHJuY21wKGxpbmUsICJ0YWcgIiwgNCkpIHsKKwkJb3JpZ2luID0gbGluZTsKKwkJYXBwZW5kX3RvX2xpc3QoJnNyY19kYXRhLT50YWcsIHN0cmR1cChvcmlnaW4gKyA0KSwgTlVMTCk7CisJCXNyY19kYXRhLT5oZWFkX3N0YXR1cyB8PSAyOworCX0gZWxzZSBpZiAoIXN0cm5jbXAobGluZSwgInJlbW90ZSBicmFuY2ggIiwgMTQpKSB7CisJCW9yaWdpbiA9IHN0cmR1cChsaW5lICsgMTQpOworCQlhcHBlbmRfdG9fbGlzdCgmc3JjX2RhdGEtPnJfYnJhbmNoLCBvcmlnaW4sIE5VTEwpOworCQlzcmNfZGF0YS0+aGVhZF9zdGF0dXMgfD0gMjsKKwl9IGVsc2UgeworCQlvcmlnaW4gPSBzdHJkdXAoc3JjKTsKKwkJYXBwZW5kX3RvX2xpc3QoJnNyY19kYXRhLT5nZW5lcmljLCBzdHJkdXAobGluZSksIE5VTEwpOworCQlzcmNfZGF0YS0+aGVhZF9zdGF0dXMgfD0gMjsKKwl9CisKKwlpZiAoIXN0cmNtcCgiLiIsIHNyYykgfHwgIXN0cmNtcChzcmMsIG9yaWdpbikpIHsKKwkJaW50IGxlbiA9IHN0cmxlbihvcmlnaW4pOworCQlpZiAob3JpZ2luWzBdID09ICdcJycgJiYgb3JpZ2luW2xlbiAtIDFdID09ICdcJycpIHsKKwkJCWNoYXIgKm5ld19vcmlnaW4gPSBtYWxsb2MobGVuIC0gMSk7CisJCQltZW1jcHkobmV3X29yaWdpbiwgb3JpZ2luICsgMSwgbGVuIC0gMik7CisJCQluZXdfb3JpZ2luW2xlbiAtIDFdID0gMDsKKwkJCW9yaWdpbiA9IG5ld19vcmlnaW47CisJCX0gZWxzZQorCQkJb3JpZ2luID0gc3RyZHVwKG9yaWdpbik7CisJfSBlbHNlIHsKKwkJY2hhciAqbmV3X29yaWdpbiA9IG1hbGxvYyhzdHJsZW4ob3JpZ2luKSArIHN0cmxlbihzcmMpICsgNSk7CisJCXNwcmludGYobmV3X29yaWdpbiwgIiVzIG9mICVzIiwgb3JpZ2luLCBzcmMpOworCQlvcmlnaW4gPSBuZXdfb3JpZ2luOworCX0KKwlhcHBlbmRfdG9fbGlzdCgmb3JpZ2lucywgb3JpZ2luLCBzaGExKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfam9pbmVkKGNvbnN0IGNoYXIgKnNpbmd1bGFyLCBjb25zdCBjaGFyICpwbHVyYWwsCisJCXN0cnVjdCBsaXN0ICpsaXN0KQoreworCWlmIChsaXN0LT5uciA9PSAwKQorCQlyZXR1cm47CisJaWYgKGxpc3QtPm5yID09IDEpIHsKKwkJcHJpbnRmKCIlcyVzIiwgc2luZ3VsYXIsIGxpc3QtPmxpc3RbMF0pOworCX0gZWxzZSB7CisJCWludCBpOworCQlwcmludGYoIiVzIiwgcGx1cmFsKTsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yIC0gMTsgaSsrKQorCQkJcHJpbnRmKCIlcyVzIiwgaSA+IDAgPyAiLCAiIDogIiIsIGxpc3QtPmxpc3RbaV0pOworCQlwcmludGYoIiBhbmQgJXMiLCBsaXN0LT5saXN0W2xpc3QtPm5yIC0gMV0pOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvcnRsb2coY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJc3RydWN0IGNvbW1pdCAqaGVhZCwgc3RydWN0IHJldl9pbmZvICpyZXYsIGludCBsaW1pdCkKK3sKKwlpbnQgaSwgY291bnQgPSAwOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0ICpicmFuY2g7CisJc3RydWN0IGxpc3Qgc3ViamVjdHMgPSB7IE5VTEwsIE5VTEwsIDAsIDAgfTsKKwlpbnQgZmxhZ3MgPSBVTklOVEVSRVNUSU5HIHwgVFJFRUNIQU5HRSB8IFNFRU4gfCBTSE9XTiB8IEFEREVEOworCisJYnJhbmNoID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgc2hhMV90b19oZXgoc2hhMSksIDQwKTsKKwlpZiAoIWJyYW5jaCB8fCBicmFuY2gtPnR5cGUgIT0gT0JKX0NPTU1JVCkKKwkJcmV0dXJuOworCisJc2V0dXBfcmV2aXNpb25zKDAsIE5VTEwsIHJldiwgTlVMTCk7CisJcmV2LT5pZ25vcmVfbWVyZ2VzID0gMTsKKwlhZGRfcGVuZGluZ19vYmplY3QocmV2LCBicmFuY2gsIG5hbWUpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXYsICZoZWFkLT5vYmplY3QsICJeSEVBRCIpOworCWhlYWQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCXByZXBhcmVfcmV2aXNpb25fd2FsayhyZXYpOworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKHJldikpICE9IE5VTEwpIHsKKwkJY2hhciAqb25lbGluZSwgKmJvbCwgKmVvbDsKKworCQkvKiBpZ25vcmUgbWVyZ2VzICovCisJCWlmIChjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KQorCQkJY29udGludWU7CisKKwkJY291bnQrKzsKKwkJaWYgKHN1YmplY3RzLm5yID4gbGltaXQpCisJCQljb250aW51ZTsKKworCQlib2wgPSBzdHJzdHIoY29tbWl0LT5idWZmZXIsICJcblxuIik7CisJCWlmICghYm9sKSB7CisJCQlhcHBlbmRfdG9fbGlzdCgmc3ViamVjdHMsIHN0cmR1cChzaGExX3RvX2hleCgKKwkJCQkJCQljb21taXQtPm9iamVjdC5zaGExKSksCisJCQkJCU5VTEwpOworCQkJY29udGludWU7CisJCX0KKworCQlib2wgKz0gMjsKKwkJZW9sID0gc3RyY2hyKGJvbCwgJ1xuJyk7CisKKwkJaWYgKGVvbCkgeworCQkJaW50IGxlbiA9IGVvbCAtIGJvbDsKKwkJCW9uZWxpbmUgPSBtYWxsb2MobGVuICsgMSk7CisJCQltZW1jcHkob25lbGluZSwgYm9sLCBsZW4pOworCQkJb25lbGluZVtsZW5dID0gMDsKKwkJfSBlbHNlCisJCQlvbmVsaW5lID0gc3RyZHVwKGJvbCk7CisJCWFwcGVuZF90b19saXN0KCZzdWJqZWN0cywgb25lbGluZSwgTlVMTCk7CisJfQorCisJaWYgKGNvdW50ID4gbGltaXQpCisJCXByaW50ZigiXG4qICVzOiAoJWQgY29tbWl0cylcbiIsIG5hbWUsIGNvdW50KTsKKwllbHNlCisJCXByaW50ZigiXG4qICVzOlxuIiwgbmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3ViamVjdHMubnI7IGkrKykKKwkJaWYgKGkgPj0gbGltaXQpCisJCQlwcmludGYoIiAgLi4uXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgICVzXG4iLCBzdWJqZWN0cy5saXN0W2ldKTsKKworCWNsZWFyX2NvbW1pdF9tYXJrcygoc3RydWN0IGNvbW1pdCAqKWJyYW5jaCwgZmxhZ3MpOworCWNsZWFyX2NvbW1pdF9tYXJrcyhoZWFkLCBmbGFncyk7CisJZnJlZV9jb21taXRfbGlzdChyZXYtPmNvbW1pdHMpOworCXJldi0+Y29tbWl0cyA9IE5VTEw7CisJcmV2LT5wZW5kaW5nLm5yID0gMDsKKworCWZyZWVfbGlzdCgmc3ViamVjdHMpOworfQorCitpbnQgY21kX2ZtdF9tZXJnZV9tc2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGxpbWl0ID0gMjAsIGkgPSAwOworCWNoYXIgbGluZVsxMDI0XTsKKwlGSUxFICppbiA9IHN0ZGluOworCWNvbnN0IGNoYXIgKnNlcCA9ICIiOworCXVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKKwljb25zdCBjaGFyICpoZWFkLCAqY3VycmVudF9icmFuY2g7CisKKwlnaXRfY29uZmlnKGZtdF9tZXJnZV9tc2dfY29uZmlnKTsKKworCXdoaWxlIChhcmdjID4gMSkgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1zdW1tYXJ5IikpCisJCQltZXJnZV9zdW1tYXJ5ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1uby1zdW1tYXJ5IikpCisJCQltZXJnZV9zdW1tYXJ5ID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLUYiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLWZpbGUiKSkgeworCQkJaWYgKGFyZ2MgPCAyKQorCQkJCWRpZSAoIldoaWNoIGZpbGU/Iik7CisJCQlpZiAoIXN0cmNtcChhcmd2WzJdLCAiLSIpKQorCQkJCWluID0gc3RkaW47CisJCQllbHNlIHsKKwkJCQlmY2xvc2UoaW4pOworCQkJCWluID0gZm9wZW4oYXJndlsyXSwgInIiKTsKKwkJCX0KKwkJCWFyZ2MtLTsgYXJndisrOworCQl9IGVsc2UKKwkJCWJyZWFrOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoYXJnYyA+IDEpCisJCXVzYWdlKGZtdF9tZXJnZV9tc2dfdXNhZ2UpOworCisJLyogZ2V0IGN1cnJlbnQgYnJhbmNoICovCisJaGVhZCA9IHN0cmR1cChnaXRfcGF0aCgiSEVBRCIpKTsKKwljdXJyZW50X2JyYW5jaCA9IHJlc29sdmVfcmVmKGhlYWQsIGhlYWRfc2hhMSwgMSk7CisJY3VycmVudF9icmFuY2ggKz0gc3RybGVuKGhlYWQpIC0gNDsKKwlmcmVlKChjaGFyICopaGVhZCk7CisJaWYgKCFzdHJuY21wKGN1cnJlbnRfYnJhbmNoLCAicmVmcy9oZWFkcy8iLCAxMSkpCisJCWN1cnJlbnRfYnJhbmNoICs9IDExOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CisJCWkrKzsKKwkJaWYgKGxpbmVbMF0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaGFuZGxlX2xpbmUobGluZSkpCisJCQlkaWUgKCJFcnJvciBpbiBsaW5lICVkOiAlcyIsIGksIGxpbmUpOworCX0KKworCXByaW50ZigiTWVyZ2UgIik7CisJZm9yIChpID0gMDsgaSA8IHNyY3MubnI7IGkrKykgeworCQlzdHJ1Y3Qgc3JjX2RhdGEgKnNyY19kYXRhID0gc3Jjcy5wYXlsb2FkW2ldOworCQljb25zdCBjaGFyICpzdWJzZXAgPSAiIjsKKworCQlwcmludGYoc2VwKTsKKwkJc2VwID0gIjsgIjsKKworCQlpZiAoc3JjX2RhdGEtPmhlYWRfc3RhdHVzID09IDEpIHsKKwkJCXByaW50ZihzcmNzLmxpc3RbaV0pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5oZWFkX3N0YXR1cyA9PSAzKSB7CisJCQlzdWJzZXAgPSAiLCAiOworCQkJcHJpbnRmKCJIRUFEIik7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5icmFuY2gubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJc3Vic2VwID0gIiwgIjsKKwkJCXByaW50X2pvaW5lZCgiYnJhbmNoICIsICJicmFuY2hlcyAiLCAmc3JjX2RhdGEtPmJyYW5jaCk7CisJCX0KKwkJaWYgKHNyY19kYXRhLT5yX2JyYW5jaC5ucikgeworCQkJcHJpbnRmKHN1YnNlcCk7CisJCQlzdWJzZXAgPSAiLCAiOworCQkJcHJpbnRfam9pbmVkKCJyZW1vdGUgYnJhbmNoICIsICJyZW1vdGUgYnJhbmNoZXMgIiwKKwkJCQkJJnNyY19kYXRhLT5yX2JyYW5jaCk7CisJCX0KKwkJaWYgKHNyY19kYXRhLT50YWcubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJc3Vic2VwID0gIiwgIjsKKwkJCXByaW50X2pvaW5lZCgidGFnICIsICJ0YWdzICIsICZzcmNfZGF0YS0+dGFnKTsKKwkJfQorCQlpZiAoc3JjX2RhdGEtPmdlbmVyaWMubnIpIHsKKwkJCXByaW50ZihzdWJzZXApOworCQkJcHJpbnRfam9pbmVkKCJjb21taXQgIiwgImNvbW1pdHMgIiwgJnNyY19kYXRhLT5nZW5lcmljKTsKKwkJfQorCQlpZiAoc3RyY21wKCIuIiwgc3Jjcy5saXN0W2ldKSkKKwkJCXByaW50ZigiIG9mICVzIiwgc3Jjcy5saXN0W2ldKTsKKwl9CisKKwlpZiAoIXN0cmNtcCgibWFzdGVyIiwgY3VycmVudF9icmFuY2gpKQorCQlwdXRjaGFyKCdcbicpOworCWVsc2UKKwkJcHJpbnRmKCIgaW50byAlc1xuIiwgY3VycmVudF9icmFuY2gpOworCisJaWYgKG1lcmdlX3N1bW1hcnkpIHsKKwkJc3RydWN0IGNvbW1pdCAqaGVhZDsKKwkJc3RydWN0IHJldl9pbmZvIHJldjsKKworCQloZWFkID0gbG9va3VwX2NvbW1pdChoZWFkX3NoYTEpOworCQlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCQlyZXYuY29tbWl0X2Zvcm1hdCA9IENNSVRfRk1UX09ORUxJTkU7CisJCXJldi5pZ25vcmVfbWVyZ2VzID0gMTsKKwkJcmV2LmxpbWl0ZWQgPSAxOworCisJCWZvciAoaSA9IDA7IGkgPCBvcmlnaW5zLm5yOyBpKyspCisJCQlzaG9ydGxvZyhvcmlnaW5zLmxpc3RbaV0sIG9yaWdpbnMucGF5bG9hZFtpXSwKKwkJCQkJaGVhZCwgJnJldiwgbGltaXQpOworCX0KKworCS8qIE5vIGNsZWFudXAgeWV0OyBpcyBzdGFuZGFsb25lIGFueXdheSAqLworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2J1aWx0aW4tZ3JlcC5jIGIvYnVpbHRpbi1ncmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiN2UwNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tZ3JlcC5jCkBAIC0wLDAgKzEsMTIwMCBAQAorLyoKKyAqIEJ1aWx0aW4gImdpdCBncmVwIgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlIDxyZWdleC5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisvKgorICogZ2l0IGdyZXAgcGF0aHNwZWNzIGFyZSBzb21ld2hhdCBkaWZmZXJlbnQgZnJvbSBkaWZmLXRyZWUgcGF0aHNwZWNzOworICogcGF0aG5hbWUgd2lsZGNhcmRzIGFyZSBhbGxvd2VkLgorICovCitzdGF0aWMgaW50IHBhdGhzcGVjX21hdGNoZXMoY29uc3QgY2hhciAqKnBhdGhzLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBuYW1lbGVuLCBpOworCWlmICghcGF0aHMgfHwgISpwYXRocykKKwkJcmV0dXJuIDE7CisJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlmb3IgKGkgPSAwOyBwYXRoc1tpXTsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoID0gcGF0aHNbaV07CisJCWludCBtYXRjaGxlbiA9IHN0cmxlbihtYXRjaCk7CisJCWNvbnN0IGNoYXIgKmNwLCAqbWV0YTsKKworCQlpZiAoIW1hdGNobGVuIHx8CisJCSAgICAoKG1hdGNobGVuIDw9IG5hbWVsZW4pICYmCisJCSAgICAgIXN0cm5jbXAobmFtZSwgbWF0Y2gsIG1hdGNobGVuKSAmJgorCQkgICAgIChtYXRjaFttYXRjaGxlbi0xXSA9PSAnLycgfHwKKwkJICAgICAgbmFtZVttYXRjaGxlbl0gPT0gJ1wwJyB8fCBuYW1lW21hdGNobGVuXSA9PSAnLycpKSkKKwkJCXJldHVybiAxOworCQlpZiAoIWZubWF0Y2gobWF0Y2gsIG5hbWUsIDApKQorCQkJcmV0dXJuIDE7CisJCWlmIChuYW1lW25hbWVsZW4tMV0gIT0gJy8nKQorCQkJY29udGludWU7CisKKwkJLyogV2UgYXJlIGJlaW5nIGFza2VkIGlmIHRoZSBkaXJlY3RvcnkgKCJuYW1lIikgaXMgd29ydGgKKwkJICogZGVzY2VuZGluZyBpbnRvLgorCQkgKgorCQkgKiBGaW5kIHRoZSBsb25nZXN0IGxlYWRpbmcgZGlyZWN0b3J5IG5hbWUgdGhhdCBkb2VzCisJCSAqIG5vdCBoYXZlIG1ldGFjaGFyYWN0ZXIgaW4gdGhlIHBhdGhzcGVjOyB0aGUgbmFtZQorCQkgKiB3ZSBhcmUgbG9va2luZyBhdCBtdXN0IG92ZXJsYXAgd2l0aCB0aGF0IGRpcmVjdG9yeS4KKwkJICovCisJCWZvciAoY3AgPSBtYXRjaCwgbWV0YSA9IE5VTEw7IGNwIC0gbWF0Y2ggPCBtYXRjaGxlbjsgY3ArKykgeworCQkJY2hhciBjaCA9ICpjcDsKKwkJCWlmIChjaCA9PSAnKicgfHwgY2ggPT0gJ1snIHx8IGNoID09ICc/JykgeworCQkJCW1ldGEgPSBjcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIW1ldGEpCisJCQltZXRhID0gY3A7IC8qIGZ1bGx5IGxpdGVyYWwgKi8KKworCQlpZiAobmFtZWxlbiA8PSBtZXRhIC0gbWF0Y2gpIHsKKwkJCS8qIExvb2tpbmcgYXQgIkRvY3VtZW50YXRpb24vIiBhbmQKKwkJCSAqIHRoZSBwYXR0ZXJuIHNheXMgIkRvY3VtZW50YXRpb24vaG93dG8vIiwgb3IKKwkJCSAqICJEb2N1bWVudGF0aW9uL2RpZmYqLnR4dCIuICBUaGUgbmFtZSB3ZQorCQkJICogaGF2ZSBzaG91bGQgbWF0Y2ggcHJlZml4LgorCQkJICovCisJCQlpZiAoIW1lbWNtcChtYXRjaCwgbmFtZSwgbmFtZWxlbikpCisJCQkJcmV0dXJuIDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtZXRhIC0gbWF0Y2ggPCBuYW1lbGVuKSB7CisJCQkvKiBMb29raW5nIGF0ICJEb2N1bWVudGF0aW9uL2hvd3RvLyIgYW5kCisJCQkgKiB0aGUgcGF0dGVybiBzYXlzICJEb2N1bWVudGF0aW9uL2gqIjsKKwkJCSAqIG1hdGNoIHVwIHRvICJEby4uLi9oIjsgdGhpcyBhdm9pZHMgZGVzY2VuZGluZworCQkJICogaW50byAiRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvIi4KKwkJCSAqLworCQkJaWYgKCFtZW1jbXAobWF0Y2gsIG5hbWUsIG1ldGEgLSBtYXRjaCkpCisJCQkJcmV0dXJuIDE7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworZW51bSBncmVwX3BhdF90b2tlbiB7CisJR1JFUF9QQVRURVJOLAorCUdSRVBfQU5ELAorCUdSRVBfT1BFTl9QQVJFTiwKKwlHUkVQX0NMT1NFX1BBUkVOLAorCUdSRVBfTk9ULAorCUdSRVBfT1IsCit9OworCitzdHJ1Y3QgZ3JlcF9wYXQgeworCXN0cnVjdCBncmVwX3BhdCAqbmV4dDsKKwljb25zdCBjaGFyICpvcmlnaW47CisJaW50IG5vOworCWVudW0gZ3JlcF9wYXRfdG9rZW4gdG9rZW47CisJY29uc3QgY2hhciAqcGF0dGVybjsKKwlyZWdleF90IHJlZ2V4cDsKK307CisKK2VudW0gZ3JlcF9leHByX25vZGUgeworCUdSRVBfTk9ERV9BVE9NLAorCUdSRVBfTk9ERV9OT1QsCisJR1JFUF9OT0RFX0FORCwKKwlHUkVQX05PREVfT1IsCit9OworCitzdHJ1Y3QgZ3JlcF9leHByIHsKKwllbnVtIGdyZXBfZXhwcl9ub2RlIG5vZGU7CisJdW5pb24geworCQlzdHJ1Y3QgZ3JlcF9wYXQgKmF0b207CisJCXN0cnVjdCBncmVwX2V4cHIgKnVuYXJ5OworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdyZXBfZXhwciAqbGVmdDsKKwkJCXN0cnVjdCBncmVwX2V4cHIgKnJpZ2h0OworCQl9IGJpbmFyeTsKKwl9IHU7Cit9OworCitzdHJ1Y3QgZ3JlcF9vcHQgeworCXN0cnVjdCBncmVwX3BhdCAqcGF0dGVybl9saXN0OworCXN0cnVjdCBncmVwX3BhdCAqKnBhdHRlcm5fdGFpbDsKKwlzdHJ1Y3QgZ3JlcF9leHByICpwYXR0ZXJuX2V4cHJlc3Npb247CisJcmVnZXhfdCByZWdleHA7CisJdW5zaWduZWQgbGluZW51bToxOworCXVuc2lnbmVkIGludmVydDoxOworCXVuc2lnbmVkIG5hbWVfb25seToxOworCXVuc2lnbmVkIHVubWF0Y2hfbmFtZV9vbmx5OjE7CisJdW5zaWduZWQgY291bnQ6MTsKKwl1bnNpZ25lZCB3b3JkX3JlZ2V4cDoxOworCXVuc2lnbmVkIGZpeGVkOjE7CisjZGVmaW5lIEdSRVBfQklOQVJZX0RFRkFVTFQJMAorI2RlZmluZSBHUkVQX0JJTkFSWV9OT01BVENICTEKKyNkZWZpbmUgR1JFUF9CSU5BUllfVEVYVAkyCisJdW5zaWduZWQgYmluYXJ5OjI7CisJdW5zaWduZWQgZXh0ZW5kZWQ6MTsKKwlpbnQgcmVnZmxhZ3M7CisJdW5zaWduZWQgcHJlX2NvbnRleHQ7CisJdW5zaWduZWQgcG9zdF9jb250ZXh0OworfTsKKworc3RhdGljIHZvaWQgYWRkX3BhdHRlcm4oc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKnBhdCwKKwkJCWNvbnN0IGNoYXIgKm9yaWdpbiwgaW50IG5vLCBlbnVtIGdyZXBfcGF0X3Rva2VuIHQpCit7CisJc3RydWN0IGdyZXBfcGF0ICpwID0geGNhbGxvYygxLCBzaXplb2YoKnApKTsKKwlwLT5wYXR0ZXJuID0gcGF0OworCXAtPm9yaWdpbiA9IG9yaWdpbjsKKwlwLT5ubyA9IG5vOworCXAtPnRva2VuID0gdDsKKwkqb3B0LT5wYXR0ZXJuX3RhaWwgPSBwOworCW9wdC0+cGF0dGVybl90YWlsID0gJnAtPm5leHQ7CisJcC0+bmV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBpbGVfcmVnZXhwKHN0cnVjdCBncmVwX3BhdCAqcCwgc3RydWN0IGdyZXBfb3B0ICpvcHQpCit7CisJaW50IGVyciA9IHJlZ2NvbXAoJnAtPnJlZ2V4cCwgcC0+cGF0dGVybiwgb3B0LT5yZWdmbGFncyk7CisJaWYgKGVycikgeworCQljaGFyIGVycmJ1ZlsxMDI0XTsKKwkJY2hhciB3aGVyZVsxMDI0XTsKKwkJaWYgKHAtPm5vKQorCQkJc3ByaW50Zih3aGVyZSwgIkluICclcycgYXQgJWQsICIsCisJCQkJcC0+b3JpZ2luLCBwLT5ubyk7CisJCWVsc2UgaWYgKHAtPm9yaWdpbikKKwkJCXNwcmludGYod2hlcmUsICIlcywgIiwgcC0+b3JpZ2luKTsKKwkJZWxzZQorCQkJd2hlcmVbMF0gPSAwOworCQlyZWdlcnJvcihlcnIsICZwLT5yZWdleHAsIGVycmJ1ZiwgMTAyNCk7CisJCXJlZ2ZyZWUoJnAtPnJlZ2V4cCk7CisJCWRpZSgiJXMnJXMnOiAlcyIsIHdoZXJlLCBwLT5wYXR0ZXJuLCBlcnJidWYpOworCX0KK30KKworI2lmIERFQlVHCitzdGF0aWMgaW5saW5lIHZvaWQgaW5kZW50KGludCBpbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgaW47IGkrKykgcHV0Y2hhcignICcpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3BhdHRlcm5fZXhwKHN0cnVjdCBncmVwX2V4cHIgKngsIGludCBpbikKK3sKKwlzd2l0Y2ggKHgtPm5vZGUpIHsKKwljYXNlIEdSRVBfTk9ERV9BVE9NOgorCQlpbmRlbnQoaW4pOworCQlwdXRzKHgtPnUuYXRvbS0+cGF0dGVybik7CisJCWJyZWFrOworCWNhc2UgR1JFUF9OT0RFX05PVDoKKwkJaW5kZW50KGluKTsKKwkJcHV0cygiLS1ub3QiKTsKKwkJZHVtcF9wYXR0ZXJuX2V4cCh4LT51LnVuYXJ5LCBpbisxKTsKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfQU5EOgorCQlkdW1wX3BhdHRlcm5fZXhwKHgtPnUuYmluYXJ5LmxlZnQsIGluKzEpOworCQlpbmRlbnQoaW4pOworCQlwdXRzKCItLWFuZCIpOworCQlkdW1wX3BhdHRlcm5fZXhwKHgtPnUuYmluYXJ5LnJpZ2h0LCBpbisxKTsKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfT1I6CisJCWR1bXBfcGF0dGVybl9leHAoeC0+dS5iaW5hcnkubGVmdCwgaW4rMSk7CisJCWluZGVudChpbik7CisJCXB1dHMoIi0tb3IiKTsKKwkJZHVtcF9wYXR0ZXJuX2V4cCh4LT51LmJpbmFyeS5yaWdodCwgaW4rMSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbG9va2luZ19hdChjb25zdCBjaGFyICptc2csIHN0cnVjdCBncmVwX3BhdCAqKmxpc3QpCit7CisJc3RydWN0IGdyZXBfcGF0ICpwID0gKmxpc3Q7CisJZnByaW50ZihzdGRlcnIsICIlczogbG9va2luZyBhdCAiLCBtc2cpOworCWlmICghcCkKKwkJZnByaW50ZihzdGRlcnIsICJlbXB0eVxuIik7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIjwlcz5cbiIsIHAtPnBhdHRlcm4pOworfQorI2Vsc2UKKyNkZWZpbmUgbG9va2luZ19hdChhLGIpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBncmVwX2V4cHIgKmNvbXBpbGVfcGF0dGVybl9leHByKHN0cnVjdCBncmVwX3BhdCAqKik7CitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX2F0b20oc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJc3RydWN0IGdyZXBfZXhwciAqeDsKKworCWxvb2tpbmdfYXQoImF0b20iLCBsaXN0KTsKKworCXAgPSAqbGlzdDsKKwlzd2l0Y2ggKHAtPnRva2VuKSB7CisJY2FzZSBHUkVQX1BBVFRFUk46IC8qIGF0b20gKi8KKwkJeCA9IHhjYWxsb2MoMSwgc2l6ZW9mIChzdHJ1Y3QgZ3JlcF9leHByKSk7CisJCXgtPm5vZGUgPSBHUkVQX05PREVfQVRPTTsKKwkJeC0+dS5hdG9tID0gcDsKKwkJKmxpc3QgPSBwLT5uZXh0OworCQlyZXR1cm4geDsKKwljYXNlIEdSRVBfT1BFTl9QQVJFTjoKKwkJKmxpc3QgPSBwLT5uZXh0OworCQl4ID0gY29tcGlsZV9wYXR0ZXJuX2V4cHIobGlzdCk7CisJCWlmICgheCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoISpsaXN0IHx8ICgqbGlzdCktPnRva2VuICE9IEdSRVBfQ0xPU0VfUEFSRU4pCisJCQlkaWUoInVubWF0Y2hlZCBwYXJlbnRoZXNpcyIpOworCQkqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisJCXJldHVybiB4OworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBncmVwX2V4cHIgKmNvbXBpbGVfcGF0dGVybl9ub3Qoc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJc3RydWN0IGdyZXBfZXhwciAqeDsKKworCWxvb2tpbmdfYXQoIm5vdCIsIGxpc3QpOworCisJcCA9ICpsaXN0OworCXN3aXRjaCAocC0+dG9rZW4pIHsKKwljYXNlIEdSRVBfTk9UOgorCQlpZiAoIXAtPm5leHQpCisJCQlkaWUoIi0tbm90IG5vdCBmb2xsb3dlZCBieSBwYXR0ZXJuIGV4cHJlc3Npb24iKTsKKwkJKmxpc3QgPSBwLT5uZXh0OworCQl4ID0geGNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBncmVwX2V4cHIpKTsKKwkJeC0+bm9kZSA9IEdSRVBfTk9ERV9OT1Q7CisJCXgtPnUudW5hcnkgPSBjb21waWxlX3BhdHRlcm5fbm90KGxpc3QpOworCQlpZiAoIXgtPnUudW5hcnkpCisJCQlkaWUoIi0tbm90IGZvbGxvd2VkIGJ5IG5vbiBwYXR0ZXJuIGV4cHJlc3Npb24iKTsKKwkJcmV0dXJuIHg7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGNvbXBpbGVfcGF0dGVybl9hdG9tKGxpc3QpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBncmVwX2V4cHIgKmNvbXBpbGVfcGF0dGVybl9hbmQoc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgZ3JlcF9wYXQgKnA7CisJc3RydWN0IGdyZXBfZXhwciAqeCwgKnksICp6OworCisJbG9va2luZ19hdCgiYW5kIiwgbGlzdCk7CisKKwl4ID0gY29tcGlsZV9wYXR0ZXJuX25vdChsaXN0KTsKKwlwID0gKmxpc3Q7CisJaWYgKHAgJiYgcC0+dG9rZW4gPT0gR1JFUF9BTkQpIHsKKwkJaWYgKCFwLT5uZXh0KQorCQkJZGllKCItLWFuZCBub3QgZm9sbG93ZWQgYnkgcGF0dGVybiBleHByZXNzaW9uIik7CisJCSpsaXN0ID0gcC0+bmV4dDsKKwkJeSA9IGNvbXBpbGVfcGF0dGVybl9hbmQobGlzdCk7CisJCWlmICgheSkKKwkJCWRpZSgiLS1hbmQgbm90IGZvbGxvd2VkIGJ5IHBhdHRlcm4gZXhwcmVzc2lvbiIpOworCQl6ID0geGNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBncmVwX2V4cHIpKTsKKwkJei0+bm9kZSA9IEdSRVBfTk9ERV9BTkQ7CisJCXotPnUuYmluYXJ5LmxlZnQgPSB4OworCQl6LT51LmJpbmFyeS5yaWdodCA9IHk7CisJCXJldHVybiB6OworCX0KKwlyZXR1cm4geDsKK30KKworc3RhdGljIHN0cnVjdCBncmVwX2V4cHIgKmNvbXBpbGVfcGF0dGVybl9vcihzdHJ1Y3QgZ3JlcF9wYXQgKipsaXN0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKwlzdHJ1Y3QgZ3JlcF9leHByICp4LCAqeSwgKno7CisKKwlsb29raW5nX2F0KCJvciIsIGxpc3QpOworCisJeCA9IGNvbXBpbGVfcGF0dGVybl9hbmQobGlzdCk7CisJcCA9ICpsaXN0OworCWlmICh4ICYmIHAgJiYgcC0+dG9rZW4gIT0gR1JFUF9DTE9TRV9QQVJFTikgeworCQl5ID0gY29tcGlsZV9wYXR0ZXJuX29yKGxpc3QpOworCQlpZiAoIXkpCisJCQlkaWUoIm5vdCBhIHBhdHRlcm4gZXhwcmVzc2lvbiAlcyIsIHAtPnBhdHRlcm4pOworCQl6ID0geGNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBncmVwX2V4cHIpKTsKKwkJei0+bm9kZSA9IEdSRVBfTk9ERV9PUjsKKwkJei0+dS5iaW5hcnkubGVmdCA9IHg7CisJCXotPnUuYmluYXJ5LnJpZ2h0ID0geTsKKwkJcmV0dXJuIHo7CisJfQorCXJldHVybiB4OworfQorCitzdGF0aWMgc3RydWN0IGdyZXBfZXhwciAqY29tcGlsZV9wYXR0ZXJuX2V4cHIoc3RydWN0IGdyZXBfcGF0ICoqbGlzdCkKK3sKKwlsb29raW5nX2F0KCJleHByIiwgbGlzdCk7CisKKwlyZXR1cm4gY29tcGlsZV9wYXR0ZXJuX29yKGxpc3QpOworfQorCitzdGF0aWMgdm9pZCBjb21waWxlX3BhdHRlcm5zKHN0cnVjdCBncmVwX29wdCAqb3B0KQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKworCS8qIEZpcnN0IGNvbXBpbGUgcmVnZXhwcyAqLworCWZvciAocCA9IG9wdC0+cGF0dGVybl9saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAocC0+dG9rZW4gPT0gR1JFUF9QQVRURVJOKQorCQkJY29tcGlsZV9yZWdleHAocCwgb3B0KTsKKwkJZWxzZQorCQkJb3B0LT5leHRlbmRlZCA9IDE7CisJfQorCisJaWYgKCFvcHQtPmV4dGVuZGVkKQorCQlyZXR1cm47CisKKwkvKiBUaGVuIGJ1bmRsZSB0aGVtIHVwIGluIGFuIGV4cHJlc3Npb24uCisJICogQSBjbGFzc2ljIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciB3b3VsZCBkby4KKwkgKi8KKwlwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7CisJb3B0LT5wYXR0ZXJuX2V4cHJlc3Npb24gPSBjb21waWxlX3BhdHRlcm5fZXhwcigmcCk7CisjaWYgREVCVUcKKwlkdW1wX3BhdHRlcm5fZXhwKG9wdC0+cGF0dGVybl9leHByZXNzaW9uLCAwKTsKKyNlbmRpZgorCWlmIChwKQorCQlkaWUoImluY29tcGxldGUgcGF0dGVybiBleHByZXNzaW9uOiAlcyIsIHAtPnBhdHRlcm4pOworfQorCitzdGF0aWMgY2hhciAqZW5kX29mX2xpbmUoY2hhciAqY3AsIHVuc2lnbmVkIGxvbmcgKmxlZnQpCit7CisJdW5zaWduZWQgbG9uZyBsID0gKmxlZnQ7CisJd2hpbGUgKGwgJiYgKmNwICE9ICdcbicpIHsKKwkJbC0tOworCQljcCsrOworCX0KKwkqbGVmdCA9IGw7CisJcmV0dXJuIGNwOworfQorCitzdGF0aWMgaW50IHdvcmRfY2hhcihjaGFyIGNoKQoreworCXJldHVybiBpc2FsbnVtKGNoKSB8fCBjaCA9PSAnXyc7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbGluZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqYm9sLCBjb25zdCBjaGFyICplb2wsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxubywgY2hhciBzaWduKQoreworCXByaW50ZigiJXMlYyIsIG5hbWUsIHNpZ24pOworCWlmIChvcHQtPmxpbmVudW0pCisJCXByaW50ZigiJWQlYyIsIGxubywgc2lnbik7CisJcHJpbnRmKCIlLipzXG4iLCAoaW50KShlb2wtYm9sKSwgYm9sKTsKK30KKworLyoKKyAqIE5FRURTV09SSzogc2hhcmUgY29kZSB3aXRoIGRpZmYuYworICovCisjZGVmaW5lIEZJUlNUX0ZFV19CWVRFUyA4MDAwCitzdGF0aWMgaW50IGJ1ZmZlcl9pc19iaW5hcnkoY29uc3QgY2hhciAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKEZJUlNUX0ZFV19CWVRFUyA8IHNpemUpCisJCXNpemUgPSBGSVJTVF9GRVdfQllURVM7CisJaWYgKG1lbWNocihwdHIsIDAsIHNpemUpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaXhtYXRjaChjb25zdCBjaGFyICpwYXR0ZXJuLCBjaGFyICpsaW5lLCByZWdtYXRjaF90ICptYXRjaCkKK3sKKwljaGFyICpoaXQgPSBzdHJzdHIobGluZSwgcGF0dGVybik7CisJaWYgKCFoaXQpIHsKKwkJbWF0Y2gtPnJtX3NvID0gbWF0Y2gtPnJtX2VvID0gLTE7CisJCXJldHVybiBSRUdfTk9NQVRDSDsKKwl9CisJZWxzZSB7CisJCW1hdGNoLT5ybV9zbyA9IGhpdCAtIGxpbmU7CisJCW1hdGNoLT5ybV9lbyA9IG1hdGNoLT5ybV9zbyArIHN0cmxlbihwYXR0ZXJuKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IG1hdGNoX29uZV9wYXR0ZXJuKHN0cnVjdCBncmVwX29wdCAqb3B0LCBzdHJ1Y3QgZ3JlcF9wYXQgKnAsIGNoYXIgKmJvbCwgY2hhciAqZW9sKQoreworCWludCBoaXQgPSAwOworCWludCBhdF90cnVlX2JvbCA9IDE7CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMTBdOworCisgYWdhaW46CisJaWYgKCFvcHQtPmZpeGVkKSB7CisJCXJlZ2V4X3QgKmV4cCA9ICZwLT5yZWdleHA7CisJCWhpdCA9ICFyZWdleGVjKGV4cCwgYm9sLCBBUlJBWV9TSVpFKHBtYXRjaCksCisJCQkgICAgICAgcG1hdGNoLCAwKTsKKwl9CisJZWxzZSB7CisJCWhpdCA9ICFmaXhtYXRjaChwLT5wYXR0ZXJuLCBib2wsIHBtYXRjaCk7CisJfQorCisJaWYgKGhpdCAmJiBvcHQtPndvcmRfcmVnZXhwKSB7CisJCWlmICgocG1hdGNoWzBdLnJtX3NvIDwgMCkgfHwKKwkJICAgIChlb2wgLSBib2wpIDw9IHBtYXRjaFswXS5ybV9zbyB8fAorCQkgICAgKHBtYXRjaFswXS5ybV9lbyA8IDApIHx8CisJCSAgICAoZW9sIC0gYm9sKSA8IHBtYXRjaFswXS5ybV9lbykKKwkJCWRpZSgicmVnZXhwIHJldHVybmVkIG5vbnNlbnNlIik7CisKKwkJLyogTWF0Y2ggYmVnaW5uaW5nIG11c3QgYmUgZWl0aGVyIGJlZ2lubmluZyBvZiB0aGUKKwkJICogbGluZSwgb3IgYXQgd29yZCBib3VuZGFyeSAoaS5lLiB0aGUgbGFzdCBjaGFyIG11c3QKKwkJICogbm90IGJlIGEgd29yZCBjaGFyKS4gIFNpbWlsYXJseSwgbWF0Y2ggZW5kIG11c3QgYmUKKwkJICogZWl0aGVyIGVuZCBvZiB0aGUgbGluZSwgb3IgYXQgd29yZCBib3VuZGFyeQorCQkgKiAoaS5lLiB0aGUgbmV4dCBjaGFyIG11c3Qgbm90IGJlIGEgd29yZCBjaGFyKS4KKwkJICovCisJCWlmICggKChwbWF0Y2hbMF0ucm1fc28gPT0gMCAmJiBhdF90cnVlX2JvbCkgfHwKKwkJICAgICAgIXdvcmRfY2hhcihib2xbcG1hdGNoWzBdLnJtX3NvLTFdKSkgJiYKKwkJICAgICAoKHBtYXRjaFswXS5ybV9lbyA9PSAoZW9sLWJvbCkpIHx8CisJCSAgICAgICF3b3JkX2NoYXIoYm9sW3BtYXRjaFswXS5ybV9lb10pKSApCisJCQk7CisJCWVsc2UKKwkJCWhpdCA9IDA7CisKKwkJaWYgKCFoaXQgJiYgcG1hdGNoWzBdLnJtX3NvICsgYm9sICsgMSA8IGVvbCkgeworCQkJLyogVGhlcmUgY291bGQgYmUgbW9yZSB0aGFuIG9uZSBtYXRjaCBvbiB0aGUKKwkJCSAqIGxpbmUsIGFuZCB0aGUgZmlyc3QgbWF0Y2ggbWlnaHQgbm90IGJlCisJCQkgKiBzdHJpY3Qgd29yZCBtYXRjaC4gIEJ1dCBsYXRlciBvbmVzIGNvdWxkIGJlIQorCQkJICovCisJCQlib2wgPSBwbWF0Y2hbMF0ucm1fc28gKyBib2wgKyAxOworCQkJYXRfdHJ1ZV9ib2wgPSAwOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IG1hdGNoX2V4cHJfZXZhbChzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwKKwkJCSAgIHN0cnVjdCBncmVwX2V4cHIgKngsCisJCQkgICBjaGFyICpib2wsIGNoYXIgKmVvbCkKK3sKKwlzd2l0Y2ggKHgtPm5vZGUpIHsKKwljYXNlIEdSRVBfTk9ERV9BVE9NOgorCQlyZXR1cm4gbWF0Y2hfb25lX3BhdHRlcm4ob3B0LCB4LT51LmF0b20sIGJvbCwgZW9sKTsKKwkJYnJlYWs7CisJY2FzZSBHUkVQX05PREVfTk9UOgorCQlyZXR1cm4gIW1hdGNoX2V4cHJfZXZhbChvcHQsIHgtPnUudW5hcnksIGJvbCwgZW9sKTsKKwljYXNlIEdSRVBfTk9ERV9BTkQ6CisJCXJldHVybiAobWF0Y2hfZXhwcl9ldmFsKG9wdCwgeC0+dS5iaW5hcnkubGVmdCwgYm9sLCBlb2wpICYmCisJCQltYXRjaF9leHByX2V2YWwob3B0LCB4LT51LmJpbmFyeS5yaWdodCwgYm9sLCBlb2wpKTsKKwljYXNlIEdSRVBfTk9ERV9PUjoKKwkJcmV0dXJuIChtYXRjaF9leHByX2V2YWwob3B0LCB4LT51LmJpbmFyeS5sZWZ0LCBib2wsIGVvbCkgfHwKKwkJCW1hdGNoX2V4cHJfZXZhbChvcHQsIHgtPnUuYmluYXJ5LnJpZ2h0LCBib2wsIGVvbCkpOworCX0KKwlkaWUoIlVuZXhwZWN0ZWQgbm9kZSB0eXBlIChpbnRlcm5hbCBlcnJvcikgJWRcbiIsIHgtPm5vZGUpOworfQorCitzdGF0aWMgaW50IG1hdGNoX2V4cHIoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNoYXIgKmJvbCwgY2hhciAqZW9sKQoreworCXN0cnVjdCBncmVwX2V4cHIgKnggPSBvcHQtPnBhdHRlcm5fZXhwcmVzc2lvbjsKKwlyZXR1cm4gbWF0Y2hfZXhwcl9ldmFsKG9wdCwgeCwgYm9sLCBlb2wpOworfQorCitzdGF0aWMgaW50IG1hdGNoX2xpbmUoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNoYXIgKmJvbCwgY2hhciAqZW9sKQoreworCXN0cnVjdCBncmVwX3BhdCAqcDsKKwlpZiAob3B0LT5leHRlbmRlZCkKKwkJcmV0dXJuIG1hdGNoX2V4cHIob3B0LCBib2wsIGVvbCk7CisJZm9yIChwID0gb3B0LT5wYXR0ZXJuX2xpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChtYXRjaF9vbmVfcGF0dGVybihvcHQsIHAsIGJvbCwgZW9sKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncmVwX2J1ZmZlcihzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWNoYXIgKmJvbCA9IGJ1ZjsKKwl1bnNpZ25lZCBsb25nIGxlZnQgPSBzaXplOworCXVuc2lnbmVkIGxubyA9IDE7CisJc3RydWN0IHByZV9jb250ZXh0X2xpbmUgeworCQljaGFyICpib2w7CisJCWNoYXIgKmVvbDsKKwl9ICpwcmV2ID0gTlVMTCwgKnBjbDsKKwl1bnNpZ25lZCBsYXN0X2hpdCA9IDA7CisJdW5zaWduZWQgbGFzdF9zaG93biA9IDA7CisJaW50IGJpbmFyeV9tYXRjaF9vbmx5ID0gMDsKKwljb25zdCBjaGFyICpodW5rX21hcmsgPSAiIjsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwlpZiAoYnVmZmVyX2lzX2JpbmFyeShidWYsIHNpemUpKSB7CisJCXN3aXRjaCAob3B0LT5iaW5hcnkpIHsKKwkJY2FzZSBHUkVQX0JJTkFSWV9ERUZBVUxUOgorCQkJYmluYXJ5X21hdGNoX29ubHkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgR1JFUF9CSU5BUllfTk9NQVRDSDoKKwkJCXJldHVybiAwOyAvKiBBc3N1bWUgdW5tYXRjaCAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChvcHQtPnByZV9jb250ZXh0KQorCQlwcmV2ID0geGNhbGxvYyhvcHQtPnByZV9jb250ZXh0LCBzaXplb2YoKnByZXYpKTsKKwlpZiAob3B0LT5wcmVfY29udGV4dCB8fCBvcHQtPnBvc3RfY29udGV4dCkKKwkJaHVua19tYXJrID0gIi0tXG4iOworCisJd2hpbGUgKGxlZnQpIHsKKwkJY2hhciAqZW9sLCBjaDsKKwkJaW50IGhpdCA9IDA7CisKKwkJZW9sID0gZW5kX29mX2xpbmUoYm9sLCAmbGVmdCk7CisJCWNoID0gKmVvbDsKKwkJKmVvbCA9IDA7CisKKwkJaGl0ID0gbWF0Y2hfbGluZShvcHQsIGJvbCwgZW9sKTsKKworCQkvKiAiZ3JlcCAtdiAtZSBmb28gLWUgYmxhIiBzaG91bGQgbGlzdCBsaW5lcworCQkgKiB0aGF0IGRvIG5vdCBoYXZlIGVpdGhlciwgc28gaW52ZXJzaW9uIHNob3VsZAorCQkgKiBiZSBkb25lIG91dHNpZGUuCisJCSAqLworCQlpZiAob3B0LT5pbnZlcnQpCisJCQloaXQgPSAhaGl0OworCQlpZiAob3B0LT51bm1hdGNoX25hbWVfb25seSkgeworCQkJaWYgKGhpdCkKKwkJCQlyZXR1cm4gMDsKKwkJCWdvdG8gbmV4dF9saW5lOworCQl9CisJCWlmIChoaXQpIHsKKwkJCWNvdW50Kys7CisJCQlpZiAoYmluYXJ5X21hdGNoX29ubHkpIHsKKwkJCQlwcmludGYoIkJpbmFyeSBmaWxlICVzIG1hdGNoZXNcbiIsIG5hbWUpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJaWYgKG9wdC0+bmFtZV9vbmx5KSB7CisJCQkJcHJpbnRmKCIlc1xuIiwgbmFtZSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQkvKiBIaXQgYXQgdGhpcyBsaW5lLiAgSWYgd2UgaGF2ZW4ndCBzaG93biB0aGUKKwkJCSAqIHByZS1jb250ZXh0IGxpbmVzLCB3ZSB3b3VsZCBuZWVkIHRvIHNob3cgdGhlbS4KKwkJCSAqIFdoZW4gYXNrZWQgdG8gZG8gImNvdW50IiwgdGhpcyBzdGlsbCBzaG93CisJCQkgKiB0aGUgY29udGV4dCB3aGljaCBpcyBub25zZW5zZSwgYnV0IHRoZSB1c2VyCisJCQkgKiBkZXNlcnZlcyB0byBnZXQgdGhhdCA7LSkuCisJCQkgKi8KKwkJCWlmIChvcHQtPnByZV9jb250ZXh0KSB7CisJCQkJdW5zaWduZWQgZnJvbTsKKwkJCQlpZiAob3B0LT5wcmVfY29udGV4dCA8IGxubykKKwkJCQkJZnJvbSA9IGxubyAtIG9wdC0+cHJlX2NvbnRleHQ7CisJCQkJZWxzZQorCQkJCQlmcm9tID0gMTsKKwkJCQlpZiAoZnJvbSA8PSBsYXN0X3Nob3duKQorCQkJCQlmcm9tID0gbGFzdF9zaG93biArIDE7CisJCQkJaWYgKGxhc3Rfc2hvd24gJiYgZnJvbSAhPSBsYXN0X3Nob3duICsgMSkKKwkJCQkJcHJpbnRmKGh1bmtfbWFyayk7CisJCQkJd2hpbGUgKGZyb20gPCBsbm8pIHsKKwkJCQkJcGNsID0gJnByZXZbbG5vLWZyb20tMV07CisJCQkJCXNob3dfbGluZShvcHQsIHBjbC0+Ym9sLCBwY2wtPmVvbCwKKwkJCQkJCSAgbmFtZSwgZnJvbSwgJy0nKTsKKwkJCQkJZnJvbSsrOworCQkJCX0KKwkJCQlsYXN0X3Nob3duID0gbG5vLTE7CisJCQl9CisJCQlpZiAobGFzdF9zaG93biAmJiBsbm8gIT0gbGFzdF9zaG93biArIDEpCisJCQkJcHJpbnRmKGh1bmtfbWFyayk7CisJCQlpZiAoIW9wdC0+Y291bnQpCisJCQkJc2hvd19saW5lKG9wdCwgYm9sLCBlb2wsIG5hbWUsIGxubywgJzonKTsKKwkJCWxhc3Rfc2hvd24gPSBsYXN0X2hpdCA9IGxubzsKKwkJfQorCQllbHNlIGlmIChsYXN0X2hpdCAmJgorCQkJIGxubyA8PSBsYXN0X2hpdCArIG9wdC0+cG9zdF9jb250ZXh0KSB7CisJCQkvKiBJZiB0aGUgbGFzdCBoaXQgaXMgd2l0aGluIHRoZSBwb3N0IGNvbnRleHQsCisJCQkgKiB3ZSBuZWVkIHRvIHNob3cgdGhpcyBsaW5lLgorCQkJICovCisJCQlpZiAobGFzdF9zaG93biAmJiBsbm8gIT0gbGFzdF9zaG93biArIDEpCisJCQkJcHJpbnRmKGh1bmtfbWFyayk7CisJCQlzaG93X2xpbmUob3B0LCBib2wsIGVvbCwgbmFtZSwgbG5vLCAnLScpOworCQkJbGFzdF9zaG93biA9IGxubzsKKwkJfQorCQlpZiAob3B0LT5wcmVfY29udGV4dCkgeworCQkJbWVtbW92ZShwcmV2KzEsIHByZXYsCisJCQkJKG9wdC0+cHJlX2NvbnRleHQtMSkgKiBzaXplb2YoKnByZXYpKTsKKwkJCXByZXYtPmJvbCA9IGJvbDsKKwkJCXByZXYtPmVvbCA9IGVvbDsKKwkJfQorCisJbmV4dF9saW5lOgorCQkqZW9sID0gY2g7CisJCWJvbCA9IGVvbCArIDE7CisJCWlmICghbGVmdCkKKwkJCWJyZWFrOworCQlsZWZ0LS07CisJCWxubysrOworCX0KKworCWlmIChvcHQtPnVubWF0Y2hfbmFtZV9vbmx5KSB7CisJCS8qIFdlIGRpZCBub3Qgc2VlIGFueSBoaXQsIHNvIHdlIHdhbnQgdG8gc2hvdyB0aGlzICovCisJCXByaW50ZigiJXNcbiIsIG5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBORUVEU1dPUks6CisJICogVGhlIHJlYWwgImdyZXAgLWMgZm9vICouYyIgZ2l2ZXMgbWFueSAiYmFyLmM6MCIgbGluZXMsCisJICogd2hpY2ggZmVlbHMgbW9zdGx5IHVzZWxlc3MgYnV0IHNvbWV0aW1lcyB1c2VmdWwuICBNYXliZQorCSAqIG1ha2UgaXQgYW5vdGhlciBvcHRpb24/ICBGb3Igbm93IHN1cHByZXNzIHRoZW0uCisJICovCisJaWYgKG9wdC0+Y291bnQgJiYgY291bnQpCisJCXByaW50ZigiJXM6JXVcbiIsIG5hbWUsIGNvdW50KTsKKwlyZXR1cm4gISFsYXN0X2hpdDsKK30KKworc3RhdGljIGludCBncmVwX3NoYTEoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWNoYXIgKmRhdGE7CisJY2hhciB0eXBlWzIwXTsKKwlpbnQgaGl0OworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKSB7CisJCWVycm9yKCInJXMnOiB1bmFibGUgdG8gcmVhZCAlcyIsIG5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJcmV0dXJuIDA7CisJfQorCWhpdCA9IGdyZXBfYnVmZmVyKG9wdCwgbmFtZSwgZGF0YSwgc2l6ZSk7CisJZnJlZShkYXRhKTsKKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IGdyZXBfZmlsZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGk7CisJY2hhciAqZGF0YTsKKwlpZiAobHN0YXQoZmlsZW5hbWUsICZzdCkgPCAwKSB7CisJZXJyX3JldDoKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWVycm9yKCInJXMnOiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdC5zdF9zaXplKQorCQlyZXR1cm4gMDsgLyogZW1wdHkgZmlsZSAtLSBubyBncmVwIGhpdCAqLworCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJcmV0dXJuIDA7CisJaSA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoaSA8IDApCisJCWdvdG8gZXJyX3JldDsKKwlkYXRhID0geG1hbGxvYyhzdC5zdF9zaXplICsgMSk7CisJaWYgKHN0LnN0X3NpemUgIT0geHJlYWQoaSwgZGF0YSwgc3Quc3Rfc2l6ZSkpIHsKKwkJZXJyb3IoIiclcyc6IHNob3J0IHJlYWQgJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoaSk7CisJCWZyZWUoZGF0YSk7CisJCXJldHVybiAwOworCX0KKwljbG9zZShpKTsKKwlpID0gZ3JlcF9idWZmZXIob3B0LCBmaWxlbmFtZSwgZGF0YSwgc3Quc3Rfc2l6ZSk7CisJZnJlZShkYXRhKTsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBleGVjX2dyZXAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZDsKKwlpbnQgc3RhdHVzOworCisJYXJndlthcmdjXSA9IE5VTEw7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gcGlkOworCWlmICghcGlkKSB7CisJCWV4ZWN2cCgiZ3JlcCIsIChjaGFyICoqKSBhcmd2KTsKKwkJZXhpdCgyNTUpOworCX0KKwl3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJaWYgKCFXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgTUFYQVJHUyAxMDAwCisjZGVmaW5lIEFSR0JVRiA0MDk2CisjZGVmaW5lIHB1c2hfYXJnKGEpIGRvIHsgXAorCWlmIChuciA8IE1BWEFSR1MpIGFyZ3ZbbnIrK10gPSAoYSk7IFwKKwllbHNlIGRpZSgibWF4aW11bSBudW1iZXIgb2YgYXJncyBleGNlZWRlZCIpOyBcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGludCBleHRlcm5hbF9ncmVwKHN0cnVjdCBncmVwX29wdCAqb3B0LCBjb25zdCBjaGFyICoqcGF0aHMsIGludCBjYWNoZWQpCit7CisJaW50IGksIG5yLCBhcmdjLCBoaXQsIGxlbiwgc3RhdHVzOworCWNvbnN0IGNoYXIgKmFyZ3ZbTUFYQVJHUysxXTsKKwljaGFyIHJhbmRhcmdbQVJHQlVGXTsKKwljaGFyICphcmdwdHIgPSByYW5kYXJnOworCXN0cnVjdCBncmVwX3BhdCAqcDsKKworCWlmIChvcHQtPmV4dGVuZGVkKQorCQlyZXR1cm4gLTE7CisJbGVuID0gbnIgPSAwOworCXB1c2hfYXJnKCJncmVwIik7CisJaWYgKG9wdC0+Zml4ZWQpCisJCXB1c2hfYXJnKCItRiIpOworCWlmIChvcHQtPmxpbmVudW0pCisJCXB1c2hfYXJnKCItbiIpOworCWlmIChvcHQtPnJlZ2ZsYWdzICYgUkVHX0VYVEVOREVEKQorCQlwdXNoX2FyZygiLUUiKTsKKwlpZiAob3B0LT5yZWdmbGFncyAmIFJFR19JQ0FTRSkKKwkJcHVzaF9hcmcoIi1pIik7CisJaWYgKG9wdC0+d29yZF9yZWdleHApCisJCXB1c2hfYXJnKCItdyIpOworCWlmIChvcHQtPm5hbWVfb25seSkKKwkJcHVzaF9hcmcoIi1sIik7CisJaWYgKG9wdC0+dW5tYXRjaF9uYW1lX29ubHkpCisJCXB1c2hfYXJnKCItTCIpOworCWlmIChvcHQtPmNvdW50KQorCQlwdXNoX2FyZygiLWMiKTsKKwlpZiAob3B0LT5wb3N0X2NvbnRleHQgfHwgb3B0LT5wcmVfY29udGV4dCkgeworCQlpZiAob3B0LT5wb3N0X2NvbnRleHQgIT0gb3B0LT5wcmVfY29udGV4dCkgeworCQkJaWYgKG9wdC0+cHJlX2NvbnRleHQpIHsKKwkJCQlwdXNoX2FyZygiLUIiKTsKKwkJCQlsZW4gKz0gc25wcmludGYoYXJncHRyLCBzaXplb2YocmFuZGFyZyktbGVuLAorCQkJCQkJIiV1Iiwgb3B0LT5wcmVfY29udGV4dCk7CisJCQkJaWYgKHNpemVvZihyYW5kYXJnKSA8PSBsZW4pCisJCQkJCWRpZSgibWF4aW11bSBsZW5ndGggb2YgYXJncyBleGNlZWRlZCIpOworCQkJCXB1c2hfYXJnKGFyZ3B0cik7CisJCQkJYXJncHRyICs9IGxlbjsKKwkJCX0KKwkJCWlmIChvcHQtPnBvc3RfY29udGV4dCkgeworCQkJCXB1c2hfYXJnKCItQSIpOworCQkJCWxlbiArPSBzbnByaW50ZihhcmdwdHIsIHNpemVvZihyYW5kYXJnKS1sZW4sCisJCQkJCQkiJXUiLCBvcHQtPnBvc3RfY29udGV4dCk7CisJCQkJaWYgKHNpemVvZihyYW5kYXJnKSA8PSBsZW4pCisJCQkJCWRpZSgibWF4aW11bSBsZW5ndGggb2YgYXJncyBleGNlZWRlZCIpOworCQkJCXB1c2hfYXJnKGFyZ3B0cik7CisJCQkJYXJncHRyICs9IGxlbjsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXB1c2hfYXJnKCItQyIpOworCQkJbGVuICs9IHNucHJpbnRmKGFyZ3B0ciwgc2l6ZW9mKHJhbmRhcmcpLWxlbiwKKwkJCQkJIiV1Iiwgb3B0LT5wb3N0X2NvbnRleHQpOworCQkJaWYgKHNpemVvZihyYW5kYXJnKSA8PSBsZW4pCisJCQkJZGllKCJtYXhpbXVtIGxlbmd0aCBvZiBhcmdzIGV4Y2VlZGVkIik7CisJCQlwdXNoX2FyZyhhcmdwdHIpOworCQkJYXJncHRyICs9IGxlbjsKKwkJfQorCX0KKwlmb3IgKHAgPSBvcHQtPnBhdHRlcm5fbGlzdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJcHVzaF9hcmcoIi1lIik7CisJCXB1c2hfYXJnKHAtPnBhdHRlcm4pOworCX0KKworCS8qCisJICogVG8gbWFrZSBzdXJlIHdlIGdldCB0aGUgaGVhZGVyIHByaW50ZWQgb3V0IHdoZW4gd2Ugd2FudCBpdCwKKwkgKiBhZGQgL2Rldi9udWxsIHRvIHRoZSBwYXRocyB0byBncmVwLiAgVGhpcyBpcyB1bm5lY2Vzc2FyeQorCSAqIChhbmQgd3JvbmcpIHdpdGggIi1sIiBvciAiLUwiLCB3aGljaCBhbHdheXMgcHJpbnQgb3V0IHRoZQorCSAqIG5hbWUgYW55d2F5LgorCSAqCisJICogR05VIGdyZXAgaGFzICItSCIsIGJ1dCB0aGlzIGlzIHBvcnRhYmxlLgorCSAqLworCWlmICghb3B0LT5uYW1lX29ubHkgJiYgIW9wdC0+dW5tYXRjaF9uYW1lX29ubHkpCisJCXB1c2hfYXJnKCIvZGV2L251bGwiKTsKKworCWhpdCA9IDA7CisJYXJnYyA9IG5yOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQljaGFyICpuYW1lOworCQlpZiAoY2Vfc3RhZ2UoY2UpIHx8ICFTX0lTUkVHKG50b2hsKGNlLT5jZV9tb2RlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFwYXRoc3BlY19tYXRjaGVzKHBhdGhzLCBjZS0+bmFtZSkpCisJCQljb250aW51ZTsKKwkJbmFtZSA9IGNlLT5uYW1lOworCQlpZiAobmFtZVswXSA9PSAnLScpIHsKKwkJCWludCBsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJCW5hbWUgPSB4bWFsbG9jKGxlbiArIDMpOworCQkJbWVtY3B5KG5hbWUsICIuLyIsIDIpOworCQkJbWVtY3B5KG5hbWUgKyAyLCBjZS0+bmFtZSwgbGVuICsgMSk7CisJCX0KKwkJYXJndlthcmdjKytdID0gbmFtZTsKKwkJaWYgKGFyZ2MgPCBNQVhBUkdTKQorCQkJY29udGludWU7CisJCXN0YXR1cyA9IGV4ZWNfZ3JlcChhcmdjLCBhcmd2KTsKKwkJaWYgKDAgPCBzdGF0dXMpCisJCQloaXQgPSAxOworCQlhcmdjID0gbnI7CisJfQorCWlmIChhcmdjID4gbnIpIHsKKwkJc3RhdHVzID0gZXhlY19ncmVwKGFyZ2MsIGFyZ3YpOworCQlpZiAoMCA8IHN0YXR1cykKKwkJCWhpdCA9IDE7CisJfQorCXJldHVybiBoaXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9jYWNoZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqKnBhdGhzLCBpbnQgY2FjaGVkKQoreworCWludCBoaXQgPSAwOworCWludCBucjsKKwlyZWFkX2NhY2hlKCk7CisKKyNpZmRlZiBfX3VuaXhfXworCS8qCisJICogVXNlIHRoZSBleHRlcm5hbCAiZ3JlcCIgY29tbWFuZCBmb3IgdGhlIGNhc2Ugd2hlcmUKKwkgKiB3ZSBncmVwIHRocm91Z2ggdGhlIGNoZWNrZWQtb3V0IGZpbGVzLiBJdCB0ZW5kcyB0bworCSAqIGJlIGEgbG90IG1vcmUgb3B0aW1pemVkCisJICovCisJaWYgKCFjYWNoZWQpIHsKKwkJaGl0ID0gZXh0ZXJuYWxfZ3JlcChvcHQsIHBhdGhzLCBjYWNoZWQpOworCQlpZiAoaGl0ID49IDApCisJCQlyZXR1cm4gaGl0OworCX0KKyNlbmRpZgorCisJZm9yIChuciA9IDA7IG5yIDwgYWN0aXZlX25yOyBucisrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbbnJdOworCQlpZiAoY2Vfc3RhZ2UoY2UpIHx8ICFTX0lTUkVHKG50b2hsKGNlLT5jZV9tb2RlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFwYXRoc3BlY19tYXRjaGVzKHBhdGhzLCBjZS0+bmFtZSkpCisJCQljb250aW51ZTsKKwkJaWYgKGNhY2hlZCkKKwkJCWhpdCB8PSBncmVwX3NoYTEob3B0LCBjZS0+c2hhMSwgY2UtPm5hbWUpOworCQllbHNlCisJCQloaXQgfD0gZ3JlcF9maWxlKG9wdCwgY2UtPm5hbWUpOworCX0KKwlyZXR1cm4gaGl0OworfQorCitzdGF0aWMgaW50IGdyZXBfdHJlZShzdHJ1Y3QgZ3JlcF9vcHQgKm9wdCwgY29uc3QgY2hhciAqKnBhdGhzLAorCQkgICAgIHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsCisJCSAgICAgY29uc3QgY2hhciAqdHJlZV9uYW1lLCBjb25zdCBjaGFyICpiYXNlKQoreworCWludCBsZW47CisJaW50IGhpdCA9IDA7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJY2hhciAqZG93bjsKKwljaGFyICpwYXRoX2J1ZiA9IHhtYWxsb2MoUEFUSF9NQVggKyBzdHJsZW4odHJlZV9uYW1lKSArIDEwMCk7CisKKwlpZiAodHJlZV9uYW1lWzBdKSB7CisJCWludCBvZmZzZXQgPSBzcHJpbnRmKHBhdGhfYnVmLCAiJXM6IiwgdHJlZV9uYW1lKTsKKwkJZG93biA9IHBhdGhfYnVmICsgb2Zmc2V0OworCQlzdHJjYXQoZG93biwgYmFzZSk7CisJfQorCWVsc2UgeworCQlkb3duID0gcGF0aF9idWY7CisJCXN0cmNweShkb3duLCBiYXNlKTsKKwl9CisJbGVuID0gc3RybGVuKHBhdGhfYnVmKTsKKworCXdoaWxlICh0cmVlX2VudHJ5KHRyZWUsICZlbnRyeSkpIHsKKwkJc3RyY3B5KHBhdGhfYnVmICsgbGVuLCBlbnRyeS5wYXRoKTsKKworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCS8qIE1hdGNoICJhYmMvIiBhZ2FpbnN0IHBhdGhzcGVjIHRvCisJCQkgKiBkZWNpZGUgaWYgd2Ugd2FudCB0byBkZXNjZW5kIGludG8gImFiYyIKKwkJCSAqIGRpcmVjdG9yeS4KKwkJCSAqLworCQkJc3RyY3B5KHBhdGhfYnVmICsgbGVuICsgZW50cnkucGF0aGxlbiwgIi8iKTsKKworCQlpZiAoIXBhdGhzcGVjX21hdGNoZXMocGF0aHMsIGRvd24pKQorCQkJOworCQllbHNlIGlmIChTX0lTUkVHKGVudHJ5Lm1vZGUpKQorCQkJaGl0IHw9IGdyZXBfc2hhMShvcHQsIGVudHJ5LnNoYTEsIHBhdGhfYnVmKTsKKwkJZWxzZSBpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJY2hhciB0eXBlWzIwXTsKKwkJCXN0cnVjdCB0cmVlX2Rlc2Mgc3ViOworCQkJdm9pZCAqZGF0YTsKKwkJCWRhdGEgPSByZWFkX3NoYTFfZmlsZShlbnRyeS5zaGExLCB0eXBlLCAmc3ViLnNpemUpOworCQkJaWYgKCFkYXRhKQorCQkJCWRpZSgidW5hYmxlIHRvIHJlYWQgdHJlZSAoJXMpIiwKKwkJCQkgICAgc2hhMV90b19oZXgoZW50cnkuc2hhMSkpOworCQkJc3ViLmJ1ZiA9IGRhdGE7CisJCQloaXQgfD0gZ3JlcF90cmVlKG9wdCwgcGF0aHMsICZzdWIsIHRyZWVfbmFtZSwgZG93bik7CisJCQlmcmVlKGRhdGEpOworCQl9CisJfQorCXJldHVybiBoaXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3JlcF9vYmplY3Qoc3RydWN0IGdyZXBfb3B0ICpvcHQsIGNvbnN0IGNoYXIgKipwYXRocywKKwkJICAgICAgIHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAob2JqLT50eXBlID09IE9CSl9CTE9CKQorCQlyZXR1cm4gZ3JlcF9zaGExKG9wdCwgb2JqLT5zaGExLCBuYW1lKTsKKwlpZiAob2JqLT50eXBlID09IE9CSl9DT01NSVQgfHwgb2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCXN0cnVjdCB0cmVlX2Rlc2MgdHJlZTsKKwkJdm9pZCAqZGF0YTsKKwkJaW50IGhpdDsKKwkJZGF0YSA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG9iai0+c2hhMSwgdHJlZV90eXBlLAorCQkJCQkJICAmdHJlZS5zaXplLCBOVUxMKTsKKwkJaWYgKCFkYXRhKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICglcykiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJdHJlZS5idWYgPSBkYXRhOworCQloaXQgPSBncmVwX3RyZWUob3B0LCBwYXRocywgJnRyZWUsIG5hbWUsICIiKTsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIGhpdDsKKwl9CisJZGllKCJ1bmFibGUgdG8gZ3JlcCBmcm9tIG9iamVjdCBvZiB0eXBlICVzIiwgdHlwZW5hbWUob2JqLT50eXBlKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGJ1aWx0aW5fZ3JlcF91c2FnZVtdID0KKyJnaXQtZ3JlcCA8b3B0aW9uPiogPHJldj4qIFstZV0gPHBhdHRlcm4+IFs8cGF0aD4uLi5dIjsKKworc3RhdGljIGNvbnN0IGNoYXIgZW1zZ19pbnZhbGlkX2NvbnRleHRfbGVuW10gPQorIiVzOiBpbnZhbGlkIGNvbnRleHQgbGVuZ3RoIGFyZ3VtZW50IjsKK3N0YXRpYyBjb25zdCBjaGFyIGVtc2dfbWlzc2luZ19jb250ZXh0X2xlbltdID0KKyJtaXNzaW5nIGNvbnRleHQgbGVuZ3RoIGFyZ3VtZW50IjsKK3N0YXRpYyBjb25zdCBjaGFyIGVtc2dfbWlzc2luZ19hcmd1bWVudFtdID0KKyJvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLSVzIjsKKworaW50IGNtZF9ncmVwKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBoaXQgPSAwOworCWludCBjYWNoZWQgPSAwOworCWludCBzZWVuX2Rhc2hkYXNoID0gMDsKKwlzdHJ1Y3QgZ3JlcF9vcHQgb3B0OworCXN0cnVjdCBvYmplY3RfYXJyYXkgbGlzdCA9IHsgMCwgMCwgTlVMTCB9OworCWNvbnN0IGNoYXIgKipwYXRocyA9IE5VTEw7CisJaW50IGk7CisKKwltZW1zZXQoJm9wdCwgMCwgc2l6ZW9mKG9wdCkpOworCW9wdC5wYXR0ZXJuX3RhaWwgPSAmb3B0LnBhdHRlcm5fbGlzdDsKKwlvcHQucmVnZmxhZ3MgPSBSRUdfTkVXTElORTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gLS0gdGhlbiB0aGUgcGF0aHMgbXVzdCBleGlzdCBpbiB0aGUgd29ya2luZworCSAqIHRyZWUuICBJZiB0aGVyZSBpcyBubyBleHBsaWNpdCBwYXR0ZXJuIHNwZWNpZmllZCB3aXRoIC1lIG9yCisJICogLWYsIHdlIHRha2UgdGhlIGZpcnN0IHVucmVjb2duaXplZCBub24gb3B0aW9uIHRvIGJlIHRoZQorCSAqIHBhdHRlcm4sIGJ1dCB0aGVuIHdoYXQgZm9sbG93cyBpdCBtdXN0IGJlIHplcm8gb3IgbW9yZQorCSAqIHZhbGlkIHJlZnMgdXAgdG8gdGhlIC0tIChpZiBleGlzdHMpLCBhbmQgdGhlbiBleGlzdGluZworCSAqIHBhdGhzLiAgSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgcGF0dGVybiwgdGhlbiB0aGUgZmlyc3QKKwkgKiB1bnJlY29nbml6ZWQgbm9uIG9wdGlvbiBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWZzIGxpc3QKKwkgKiB0aGF0IGNvbnRpbnVlcyB1cCB0byB0aGUgLS0gKGlmIGV4aXN0cyksIGFuZCB0aGVuIHBhdGhzLgorCSAqLworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWFyZ2MtLTsgYXJndisrOworCQlpZiAoIXN0cmNtcCgiLS1jYWNoZWQiLCBhcmcpKSB7CisJCQljYWNoZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1hIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS10ZXh0IiwgYXJnKSkgeworCQkJb3B0LmJpbmFyeSA9IEdSRVBfQklOQVJZX1RFWFQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLWkiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWlnbm9yZS1jYXNlIiwgYXJnKSkgeworCQkJb3B0LnJlZ2ZsYWdzIHw9IFJFR19JQ0FTRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItSSIsIGFyZykpIHsKKwkJCW9wdC5iaW5hcnkgPSBHUkVQX0JJTkFSWV9OT01BVENIOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1pbnZlcnQtbWF0Y2giLCBhcmcpKSB7CisJCQlvcHQuaW52ZXJ0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItRSIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tZXh0ZW5kZWQtcmVnZXhwIiwgYXJnKSkgeworCQkJb3B0LnJlZ2ZsYWdzIHw9IFJFR19FWFRFTkRFRDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItRiIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tZml4ZWQtc3RyaW5ncyIsIGFyZykpIHsKKwkJCW9wdC5maXhlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUciLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWJhc2ljLXJlZ2V4cCIsIGFyZykpIHsKKwkJCW9wdC5yZWdmbGFncyAmPSB+UkVHX0VYVEVOREVEOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1uIiwgYXJnKSkgeworCQkJb3B0LmxpbmVudW0gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1IIiwgYXJnKSkgeworCQkJLyogV2UgYWx3YXlzIHNob3cgdGhlIHBhdGhuYW1lLCBzbyB0aGlzCisJCQkgKiBpcyBhIG5vb3AuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItbCIsIGFyZykgfHwKKwkJICAgICFzdHJjbXAoIi0tZmlsZXMtd2l0aC1tYXRjaGVzIiwgYXJnKSkgeworCQkJb3B0Lm5hbWVfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLUwiLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLWZpbGVzLXdpdGhvdXQtbWF0Y2giLCBhcmcpKSB7CisJCQlvcHQudW5tYXRjaF9uYW1lX29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1jIiwgYXJnKSB8fAorCQkgICAgIXN0cmNtcCgiLS1jb3VudCIsIGFyZykpIHsKKwkJCW9wdC5jb3VudCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLXciLCBhcmcpIHx8CisJCSAgICAhc3RyY21wKCItLXdvcmQtcmVnZXhwIiwgYXJnKSkgeworCQkJb3B0LndvcmRfcmVnZXhwID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcCgiLUEiLCBhcmcsIDIpIHx8CisJCSAgICAhc3RybmNtcCgiLUIiLCBhcmcsIDIpIHx8CisJCSAgICAhc3RybmNtcCgiLUMiLCBhcmcsIDIpIHx8CisJCSAgICAoYXJnWzBdID09ICctJyAmJiAnMScgPD0gYXJnWzFdICYmIGFyZ1sxXSA8PSAnOScpKSB7CisJCQl1bnNpZ25lZCBudW07CisJCQljb25zdCBjaGFyICpzY2FuOworCQkJc3dpdGNoIChhcmdbMV0pIHsKKwkJCWNhc2UgJ0EnOiBjYXNlICdCJzogY2FzZSAnQyc6CisJCQkJaWYgKCFhcmdbMl0pIHsKKwkJCQkJaWYgKGFyZ2MgPD0gMSkKKwkJCQkJCWRpZShlbXNnX21pc3NpbmdfY29udGV4dF9sZW4pOworCQkJCQlzY2FuID0gKisrYXJndjsKKwkJCQkJYXJnYy0tOworCQkJCX0KKwkJCQllbHNlCisJCQkJCXNjYW4gPSBhcmcgKyAyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzY2FuID0gYXJnICsgMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzc2NhbmYoc2NhbiwgIiV1IiwgJm51bSkgIT0gMSkKKwkJCQlkaWUoZW1zZ19pbnZhbGlkX2NvbnRleHRfbGVuLCBzY2FuKTsKKwkJCXN3aXRjaCAoYXJnWzFdKSB7CisJCQljYXNlICdBJzoKKwkJCQlvcHQucG9zdF9jb250ZXh0ID0gbnVtOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCWNhc2UgJ0MnOgorCQkJCW9wdC5wb3N0X2NvbnRleHQgPSBudW07CisJCQljYXNlICdCJzoKKwkJCQlvcHQucHJlX2NvbnRleHQgPSBudW07CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiLWYiLCBhcmcpKSB7CisJCQlGSUxFICpwYXR0ZXJuczsKKwkJCWludCBsbm8gPSAwOworCQkJY2hhciBidWZbMTAyNF07CisJCQlpZiAoYXJnYyA8PSAxKQorCQkJCWRpZShlbXNnX21pc3NpbmdfYXJndW1lbnQsIGFyZyk7CisJCQlwYXR0ZXJucyA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CisJCQlpZiAoIXBhdHRlcm5zKQorCQkJCWRpZSgiJyVzJzogJXMiLCBhcmd2WzFdLCBzdHJlcnJvcihlcnJubykpOworCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHBhdHRlcm5zKSkgeworCQkJCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwkJCQlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQorCQkJCQlidWZbbGVuLTFdID0gMDsKKwkJCQkvKiBpZ25vcmUgZW1wdHkgbGluZSBsaWtlIGdyZXAgZG9lcyAqLworCQkJCWlmICghYnVmWzBdKQorCQkJCQljb250aW51ZTsKKwkJCQlhZGRfcGF0dGVybigmb3B0LCBzdHJkdXAoYnVmKSwgYXJndlsxXSwgKytsbm8sCisJCQkJCSAgICBHUkVQX1BBVFRFUk4pOworCQkJfQorCQkJZmNsb3NlKHBhdHRlcm5zKTsKKwkJCWFyZ3YrKzsKKwkJCWFyZ2MtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLW5vdCIsIGFyZykpIHsKKwkJCWFkZF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsIEdSRVBfTk9UKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLWFuZCIsIGFyZykpIHsKKwkJCWFkZF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsIEdSRVBfQU5EKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKCItLW9yIiwgYXJnKSkKKwkJCWNvbnRpbnVlOyAvKiBuby1vcCAqLworCQlpZiAoIXN0cmNtcCgiKCIsIGFyZykpIHsKKwkJCWFkZF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsIEdSRVBfT1BFTl9QQVJFTik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCgiKSIsIGFyZykpIHsKKwkJCWFkZF9wYXR0ZXJuKCZvcHQsIGFyZywgImNvbW1hbmQgbGluZSIsIDAsIEdSRVBfQ0xPU0VfUEFSRU4pOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoIi1lIiwgYXJnKSkgeworCQkJaWYgKDEgPCBhcmdjKSB7CisJCQkJYWRkX3BhdHRlcm4oJm9wdCwgYXJndlsxXSwgIi1lIG9wdGlvbiIsIDAsCisJCQkJCSAgICBHUkVQX1BBVFRFUk4pOworCQkJCWFyZ3YrKzsKKwkJCQlhcmdjLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlkaWUoZW1zZ19taXNzaW5nX2FyZ3VtZW50LCBhcmcpOworCQl9CisJCWlmICghc3RyY21wKCItLSIsIGFyZykpIHsKKwkJCS8qIGxhdGVyIHByb2Nlc3Npbmcgd2FudHMgdG8gaGF2ZSB0aGlzIGF0IGFyZ3ZbMV0gKi8KKwkJCWFyZ3YtLTsKKwkJCWFyZ2MrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICgqYXJnID09ICctJykKKwkJCXVzYWdlKGJ1aWx0aW5fZ3JlcF91c2FnZSk7CisKKwkJLyogRmlyc3QgdW5yZWNvZ25pemVkIG5vbi1vcHRpb24gdG9rZW4gKi8KKwkJaWYgKCFvcHQucGF0dGVybl9saXN0KSB7CisJCQlhZGRfcGF0dGVybigmb3B0LCBhcmcsICJjb21tYW5kIGxpbmUiLCAwLAorCQkJCSAgICBHUkVQX1BBVFRFUk4pOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBXZSBhcmUgbG9va2luZyBhdCB0aGUgZmlyc3QgcGF0aCBvciByZXY7CisJCQkgKiBpdCBpcyBmb3VuZCBhdCBhcmd2WzFdIGFmdGVyIGxlYXZpbmcgdGhlCisJCQkgKiBsb29wLgorCQkJICovCisJCQlhcmdjKys7IGFyZ3YtLTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFvcHQucGF0dGVybl9saXN0KQorCQlkaWUoIm5vIHBhdHRlcm4gZ2l2ZW4uIik7CisJaWYgKChvcHQucmVnZmxhZ3MgIT0gUkVHX05FV0xJTkUpICYmIG9wdC5maXhlZCkKKwkJZGllKCJjYW5ub3QgbWl4IC0tZml4ZWQtc3RyaW5ncyBhbmQgcmVnZXhwIik7CisJaWYgKCFvcHQuZml4ZWQpCisJCWNvbXBpbGVfcGF0dGVybnMoJm9wdCk7CisKKwkvKiBDaGVjayByZXZzIGFuZCB0aGVuIHBhdGhzICovCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkvKiBJcyBpdCBhIHJldj8gKi8KKwkJaWYgKCFnZXRfc2hhMShhcmcsIHNoYTEpKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCQlpZiAoIW9iamVjdCkKKwkJCQlkaWUoImJhZCBvYmplY3QgJXMiLCBhcmcpOworCQkJYWRkX29iamVjdF9hcnJheShvYmplY3QsIGFyZywgJmxpc3QpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJc2Vlbl9kYXNoZGFzaCA9IDE7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogVGhlIHJlc3QgYXJlIHBhdGhzICovCisJaWYgKCFzZWVuX2Rhc2hkYXNoKSB7CisJCWludCBqOworCQlmb3IgKGogPSBpOyBqIDwgYXJnYzsgaisrKQorCQkJdmVyaWZ5X2ZpbGVuYW1lKHByZWZpeCwgYXJndltqXSk7CisJfQorCisJaWYgKGkgPCBhcmdjKQorCQlwYXRocyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBpKTsKKwllbHNlIGlmIChwcmVmaXgpIHsKKwkJcGF0aHMgPSB4Y2FsbG9jKDIsIHNpemVvZihjb25zdCBjaGFyICopKTsKKwkJcGF0aHNbMF0gPSBwcmVmaXg7CisJCXBhdGhzWzFdID0gTlVMTDsKKwl9CisKKwlpZiAoIWxpc3QubnIpCisJCXJldHVybiAhZ3JlcF9jYWNoZSgmb3B0LCBwYXRocywgY2FjaGVkKTsKKworCWlmIChjYWNoZWQpCisJCWRpZSgiYm90aCAtLWNhY2hlZCBhbmQgdHJlZXMgYXJlIGdpdmVuLiIpOworCisJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpyZWFsX29iajsKKwkJcmVhbF9vYmogPSBkZXJlZl90YWcobGlzdC5vYmplY3RzW2ldLml0ZW0sIE5VTEwsIDApOworCQlpZiAoZ3JlcF9vYmplY3QoJm9wdCwgcGF0aHMsIHJlYWxfb2JqLCBsaXN0Lm9iamVjdHNbaV0ubmFtZSkpCisJCQloaXQgPSAxOworCX0KKwlyZXR1cm4gIWhpdDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4taGVscC5jIGIvYnVpbHRpbi1oZWxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NGNiOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4taGVscC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogYnVpbHRpbi1oZWxwLmMKKyAqCisgKiBCdWlsdGluIGhlbHAtcmVsYXRlZCBjb21tYW5kcyAoaGVscCwgdXNhZ2UsIHZlcnNpb24pCisgKi8KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgImNvbW1vbi1jbWRzLmgiCisKKworLyogbW9zdCBHVUkgdGVybWluYWxzIHNldCBDT0xVTU5TIChhbHRob3VnaCBzb21lIGRvbid0IGV4cG9ydCBpdCkgKi8KK3N0YXRpYyBpbnQgdGVybV9jb2x1bW5zKHZvaWQpCit7CisJY2hhciAqY29sX3N0cmluZyA9IGdldGVudigiQ09MVU1OUyIpOworCWludCBuX2NvbHMgPSAwOworCisJaWYgKGNvbF9zdHJpbmcgJiYgKG5fY29scyA9IGF0b2koY29sX3N0cmluZykpID4gMCkKKwkJcmV0dXJuIG5fY29sczsKKworI2lmZGVmIFRJT0NHV0lOU1oKKwl7CisJCXN0cnVjdCB3aW5zaXplIHdzOworCQlpZiAoIWlvY3RsKDEsIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJCWlmICh3cy53c19jb2wpCisJCQkJcmV0dXJuIHdzLndzX2NvbDsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIDgwOworfQorCitzdGF0aWMgdm9pZCBvb20odm9pZCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgImdpdDogb3V0IG9mIG1lbW9yeVxuIik7CisJZXhpdCgxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1wdXRfY2hhcihjaGFyIGMsIHVuc2lnbmVkIGludCBudW0pCit7CisJd2hpbGUobnVtLS0pCisJCXB1dGNoYXIoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY21kbmFtZSB7CisJc2l6ZV90IGxlbjsKKwljaGFyIG5hbWVbMV07Cit9ICoqY21kbmFtZTsKK3N0YXRpYyBpbnQgY21kbmFtZV9hbGxvYywgY21kbmFtZV9jbnQ7CisKK3N0YXRpYyB2b2lkIGFkZF9jbWRuYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RydWN0IGNtZG5hbWUgKmVudDsKKwlpZiAoY21kbmFtZV9hbGxvYyA8PSBjbWRuYW1lX2NudCkgeworCQljbWRuYW1lX2FsbG9jID0gY21kbmFtZV9hbGxvYyArIDIwMDsKKwkJY21kbmFtZSA9IHJlYWxsb2MoY21kbmFtZSwgY21kbmFtZV9hbGxvYyAqIHNpemVvZigqY21kbmFtZSkpOworCQlpZiAoIWNtZG5hbWUpCisJCQlvb20oKTsKKwl9CisJZW50ID0gbWFsbG9jKHNpemVvZigqZW50KSArIGxlbik7CisJaWYgKCFlbnQpCisJCW9vbSgpOworCWVudC0+bGVuID0gbGVuOworCW1lbWNweShlbnQtPm5hbWUsIG5hbWUsIGxlbik7CisJZW50LT5uYW1lW2xlbl0gPSAwOworCWNtZG5hbWVbY21kbmFtZV9jbnQrK10gPSBlbnQ7Cit9CisKK3N0YXRpYyBpbnQgY21kbmFtZV9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgY21kbmFtZSAqYSA9ICooc3RydWN0IGNtZG5hbWUgKiopYV87CisJc3RydWN0IGNtZG5hbWUgKmIgPSAqKHN0cnVjdCBjbWRuYW1lICoqKWJfOworCXJldHVybiBzdHJjbXAoYS0+bmFtZSwgYi0+bmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXR0eV9wcmludF9zdHJpbmdfbGlzdChzdHJ1Y3QgY21kbmFtZSAqKmNtZG5hbWUsIGludCBsb25nZXN0KQoreworCWludCBjb2xzID0gMSwgcm93czsKKwlpbnQgc3BhY2UgPSBsb25nZXN0ICsgMTsgLyogbWluIDEgU1AgYmV0d2VlbiB3b3JkcyAqLworCWludCBtYXhfY29scyA9IHRlcm1fY29sdW1ucygpIC0gMTsgLyogZG9uJ3QgcHJpbnQgKm9uKiB0aGUgZWRnZSAqLworCWludCBpLCBqOworCisJaWYgKHNwYWNlIDwgbWF4X2NvbHMpCisJCWNvbHMgPSBtYXhfY29scyAvIHNwYWNlOworCXJvd3MgPSAoY21kbmFtZV9jbnQgKyBjb2xzIC0gMSkgLyBjb2xzOworCisJcXNvcnQoY21kbmFtZSwgY21kbmFtZV9jbnQsIHNpemVvZigqY21kbmFtZSksIGNtZG5hbWVfY29tcGFyZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisJCXByaW50ZigiICAiKTsKKworCQlmb3IgKGogPSAwOyBqIDwgY29sczsgaisrKSB7CisJCQlpbnQgbiA9IGogKiByb3dzICsgaTsKKwkJCWludCBzaXplID0gc3BhY2U7CisJCQlpZiAobiA+PSBjbWRuYW1lX2NudCkKKwkJCQlicmVhazsKKwkJCWlmIChqID09IGNvbHMtMSB8fCBuICsgcm93cyA+PSBjbWRuYW1lX2NudCkKKwkJCQlzaXplID0gMTsKKwkJCXByaW50ZigiJS0qcyIsIHNpemUsIGNtZG5hbWVbbl0tPm5hbWUpOworCQl9CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBsaXN0X2NvbW1hbmRzKGNvbnN0IGNoYXIgKmV4ZWNfcGF0aCwgY29uc3QgY2hhciAqcGF0dGVybikKK3sKKwl1bnNpZ25lZCBpbnQgbG9uZ2VzdCA9IDA7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlpbnQgZGlybGVuOworCURJUiAqZGlyID0gb3BlbmRpcihleGVjX3BhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJnaXQ6ICclcyc6ICVzXG4iLCBleGVjX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJZGlybGVuID0gc3RybGVuKGV4ZWNfcGF0aCk7CisJaWYgKFBBVEhfTUFYIC0gMjAgPCBkaXJsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJnaXQ6IGluc2FuZWx5IGxvbmcgZXhlYy1wYXRoICclcydcbiIsCisJCQlleGVjX3BhdGgpOworCQlleGl0KDEpOworCX0KKworCW1lbWNweShwYXRoLCBleGVjX3BhdGgsIGRpcmxlbik7CisJcGF0aFtkaXJsZW4rK10gPSAnLyc7CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpbnQgZW50bGVuOworCisJCWlmIChzdHJuY21wKGRlLT5kX25hbWUsICJnaXQtIiwgNCkpCisJCQljb250aW51ZTsKKwkJc3RyY3B5KHBhdGgrZGlybGVuLCBkZS0+ZF9uYW1lKTsKKwkJaWYgKHN0YXQocGF0aCwgJnN0KSB8fCAvKiBzdGF0LCBub3QgbHN0YXQgKi8KKwkJICAgICFTX0lTUkVHKHN0LnN0X21vZGUpIHx8CisJCSAgICAhKHN0LnN0X21vZGUgJiBTX0lYVVNSKSkKKwkJCWNvbnRpbnVlOworCisJCWVudGxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJaWYgKGhhc19leHRlbnNpb24oZGUtPmRfbmFtZSwgIi5leGUiKSkKKwkJCWVudGxlbiAtPSA0OworCisJCWlmIChsb25nZXN0IDwgZW50bGVuKQorCQkJbG9uZ2VzdCA9IGVudGxlbjsKKworCQlhZGRfY21kbmFtZShkZS0+ZF9uYW1lICsgNCwgZW50bGVuLTQpOworCX0KKwljbG9zZWRpcihkaXIpOworCisJcHJpbnRmKCJnaXQgY29tbWFuZHMgYXZhaWxhYmxlIGluICclcydcbiIsIGV4ZWNfcGF0aCk7CisJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisJbXB1dF9jaGFyKCctJywgc3RybGVuKGV4ZWNfcGF0aCkpOworCXB1dGNoYXIoJ1xuJyk7CisJcHJldHR5X3ByaW50X3N0cmluZ19saXN0KGNtZG5hbWUsIGxvbmdlc3QgLSA0KTsKKwlwdXRjaGFyKCdcbicpOworfQorCitzdGF0aWMgdm9pZCBsaXN0X2NvbW1vbl9jbWRzX2hlbHAodm9pZCkKK3sKKwlpbnQgaSwgbG9uZ2VzdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tb25fY21kcyk7IGkrKykgeworCQlpZiAobG9uZ2VzdCA8IHN0cmxlbihjb21tb25fY21kc1tpXS5uYW1lKSkKKwkJCWxvbmdlc3QgPSBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSk7CisJfQorCisJcHV0cygiVGhlIG1vc3QgY29tbW9ubHkgdXNlZCBnaXQgY29tbWFuZHMgYXJlOiIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1vbl9jbWRzKTsgaSsrKSB7CisJCXByaW50ZigiICAgICVzIiwgY29tbW9uX2NtZHNbaV0ubmFtZSk7CisJCW1wdXRfY2hhcignICcsIGxvbmdlc3QgLSBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSkgKyA0KTsKKwkJcHV0cyhjb21tb25fY21kc1tpXS5oZWxwKTsKKwl9CisJcHV0cygiKHVzZSAnZ2l0IGhlbHAgLWEnIHRvIGdldCBhIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBnaXQgY29tbWFuZHMpIik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbWFuX3BhZ2UoY29uc3QgY2hhciAqZ2l0X2NtZCkKK3sKKwljb25zdCBjaGFyICpwYWdlOworCisJaWYgKCFzdHJuY21wKGdpdF9jbWQsICJnaXQiLCAzKSkKKwkJcGFnZSA9IGdpdF9jbWQ7CisJZWxzZSB7CisJCWludCBwYWdlX2xlbiA9IHN0cmxlbihnaXRfY21kKSArIDQ7CisJCWNoYXIgKnAgPSBtYWxsb2MocGFnZV9sZW4gKyAxKTsKKwkJc3RyY3B5KHAsICJnaXQtIik7CisJCXN0cmNweShwICsgNCwgZ2l0X2NtZCk7CisJCXBbcGFnZV9sZW5dID0gMDsKKwkJcGFnZSA9IHA7CisJfQorCisJZXhlY2xwKCJtYW4iLCAibWFuIiwgcGFnZSwgTlVMTCk7Cit9CisKK3ZvaWQgaGVscF91bmtub3duX2NtZChjb25zdCBjaGFyICpjbWQpCit7CisJcHJpbnRmKCJnaXQ6ICclcycgaXMgbm90IGEgZ2l0LWNvbW1hbmRcblxuIiwgY21kKTsKKwlsaXN0X2NvbW1vbl9jbWRzX2hlbHAoKTsKKwlleGl0KDEpOworfQorCitpbnQgY21kX3ZlcnNpb24oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcHJpbnRmKCJnaXQgdmVyc2lvbiAlc1xuIiwgZ2l0X3ZlcnNpb25fc3RyaW5nKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF9oZWxwKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKmhlbHBfY21kID0gYXJnYyA+IDEgPyBhcmd2WzFdIDogTlVMTDsKKwljb25zdCBjaGFyICpleGVjX3BhdGggPSBnaXRfZXhlY19wYXRoKCk7CisKKwlpZiAoIWhlbHBfY21kKSB7CisJCXByaW50ZigidXNhZ2U6ICVzXG5cbiIsIGdpdF91c2FnZV9zdHJpbmcpOworCQlsaXN0X2NvbW1vbl9jbWRzX2hlbHAoKTsKKwkJZXhpdCgxKTsKKwl9CisKKwllbHNlIGlmICghc3RyY21wKGhlbHBfY21kLCAiLS1hbGwiKSB8fCAhc3RyY21wKGhlbHBfY21kLCAiLWEiKSkgeworCQlwcmludGYoInVzYWdlOiAlc1xuXG4iLCBnaXRfdXNhZ2Vfc3RyaW5nKTsKKwkJaWYoZXhlY19wYXRoKQorCQkJbGlzdF9jb21tYW5kcyhleGVjX3BhdGgsICJnaXQtKiIpOworCQlleGl0KDEpOworCX0KKworCWVsc2UKKwkJc2hvd19tYW5fcGFnZShoZWxwX2NtZCk7CisKKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9idWlsdGluLWluaXQtZGIuYyBiL2J1aWx0aW4taW5pdC1kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODUwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWluaXQtZGIuYwpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaWZuZGVmIERFRkFVTFRfR0lUX1RFTVBMQVRFX0RJUgorI2RlZmluZSBERUZBVUxUX0dJVF9URU1QTEFURV9ESVIgIi91c3Ivc2hhcmUvZ2l0LWNvcmUvdGVtcGxhdGVzLyIKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzYWZlX2NyZWF0ZV9kaXIoY29uc3QgY2hhciAqZGlyLCBpbnQgc2hhcmUpCit7CisJaWYgKG1rZGlyKGRpciwgMDc3NykgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFRVhJU1QpIHsKKwkJCXBlcnJvcihkaXIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwllbHNlIGlmIChzaGFyZSAmJiBhZGp1c3Rfc2hhcmVkX3Blcm0oZGlyKSkKKwkJZGllKCJDb3VsZCBub3QgbWFrZSAlcyB3cml0YWJsZSBieSBncm91cFxuIiwgZGlyKTsKK30KKworc3RhdGljIGludCBjb3B5X2ZpbGUoY29uc3QgY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGludCBtb2RlKQoreworCWludCBmZGksIGZkbywgc3RhdHVzOworCisJbW9kZSA9IChtb2RlICYgMDExMSkgPyAwNzc3IDogMDY2NjsKKwlpZiAoKGZkaSA9IG9wZW4oc3JjLCBPX1JET05MWSkpIDwgMCkKKwkJcmV0dXJuIGZkaTsKKwlpZiAoKGZkbyA9IG9wZW4oZHN0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIG1vZGUpKSA8IDApIHsKKwkJY2xvc2UoZmRpKTsKKwkJcmV0dXJuIGZkbzsKKwl9CisJc3RhdHVzID0gY29weV9mZChmZGksIGZkbyk7CisJY2xvc2UoZmRvKTsKKworCWlmICghc3RhdHVzICYmIGFkanVzdF9zaGFyZWRfcGVybShkc3QpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3RlbXBsYXRlc18xKGNoYXIgKnBhdGgsIGludCBiYXNlbGVuLAorCQkJICAgICBjaGFyICp0ZW1wbGF0ZSwgaW50IHRlbXBsYXRlX2Jhc2VsZW4sCisJCQkgICAgIERJUiAqZGlyKQoreworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJLyogTm90ZTogaWYgIi5naXQvaG9va3MiIGZpbGUgZXhpc3RzIGluIHRoZSByZXBvc2l0b3J5IGJlaW5nCisJICogcmUtaW5pdGlhbGl6ZWQsIC9ldGMvY29yZS1naXQvdGVtcGxhdGVzL2hvb2tzL3VwZGF0ZSB3b3VsZAorCSAqIGNhdXNlIGdpdC1pbml0LWRiIHRvIGZhaWwgaGVyZS4gIEkgdGhpbmsgdGhpcyBpcyBzYW5lIGJ1dAorCSAqIGl0IG1lYW5zIHRoYXQgdGhlIHNldCBvZiB0ZW1wbGF0ZXMgd2Ugc2hpcCBieSBkZWZhdWx0LCBhbG9uZworCSAqIHdpdGggdGhlIHdheSB0aGUgbmFtZXNwYWNlIHVuZGVyIC5naXQvIGlzIG9yZ2FuaXplZCwgc2hvdWxkCisJICogYmUgcmVhbGx5IGNhcmVmdWxseSBjaG9zZW4uCisJICovCisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3RfZ2l0LCBzdF90ZW1wbGF0ZTsKKwkJaW50IG5hbWVsZW47CisJCWludCBleGlzdHMgPSAwOworCisJCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCQluYW1lbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQlpZiAoKFBBVEhfTUFYIDw9IGJhc2VsZW4gKyBuYW1lbGVuKSB8fAorCQkgICAgKFBBVEhfTUFYIDw9IHRlbXBsYXRlX2Jhc2VsZW4gKyBuYW1lbGVuKSkKKwkJCWRpZSgiaW5zYW5lbHkgbG9uZyB0ZW1wbGF0ZSBuYW1lICVzIiwgZGUtPmRfbmFtZSk7CisJCW1lbWNweShwYXRoICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbmFtZWxlbisxKTsKKwkJbWVtY3B5KHRlbXBsYXRlICsgdGVtcGxhdGVfYmFzZWxlbiwgZGUtPmRfbmFtZSwgbmFtZWxlbisxKTsKKwkJaWYgKGxzdGF0KHBhdGgsICZzdF9naXQpKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJCWRpZSgiY2Fubm90IHN0YXQgJXMiLCBwYXRoKTsKKwkJfQorCQllbHNlCisJCQlleGlzdHMgPSAxOworCisJCWlmIChsc3RhdCh0ZW1wbGF0ZSwgJnN0X3RlbXBsYXRlKSkKKwkJCWRpZSgiY2Fubm90IHN0YXQgdGVtcGxhdGUgJXMiLCB0ZW1wbGF0ZSk7CisKKwkJaWYgKFNfSVNESVIoc3RfdGVtcGxhdGUuc3RfbW9kZSkpIHsKKwkJCURJUiAqc3ViZGlyID0gb3BlbmRpcih0ZW1wbGF0ZSk7CisJCQlpbnQgYmFzZWxlbl9zdWIgPSBiYXNlbGVuICsgbmFtZWxlbjsKKwkJCWludCB0ZW1wbGF0ZV9iYXNlbGVuX3N1YiA9IHRlbXBsYXRlX2Jhc2VsZW4gKyBuYW1lbGVuOworCQkJaWYgKCFzdWJkaXIpCisJCQkJZGllKCJjYW5ub3Qgb3BlbmRpciAlcyIsIHRlbXBsYXRlKTsKKwkJCXBhdGhbYmFzZWxlbl9zdWIrK10gPQorCQkJCXRlbXBsYXRlW3RlbXBsYXRlX2Jhc2VsZW5fc3ViKytdID0gJy8nOworCQkJcGF0aFtiYXNlbGVuX3N1Yl0gPQorCQkJCXRlbXBsYXRlW3RlbXBsYXRlX2Jhc2VsZW5fc3ViXSA9IDA7CisJCQljb3B5X3RlbXBsYXRlc18xKHBhdGgsIGJhc2VsZW5fc3ViLAorCQkJCQkgdGVtcGxhdGUsIHRlbXBsYXRlX2Jhc2VsZW5fc3ViLAorCQkJCQkgc3ViZGlyKTsKKwkJCWNsb3NlZGlyKHN1YmRpcik7CisJCX0KKwkJZWxzZSBpZiAoZXhpc3RzKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKFNfSVNMTksoc3RfdGVtcGxhdGUuc3RfbW9kZSkpIHsKKwkJCWNoYXIgbG5rWzI1Nl07CisJCQlpbnQgbGVuOworCQkJbGVuID0gcmVhZGxpbmsodGVtcGxhdGUsIGxuaywgc2l6ZW9mKGxuaykpOworCQkJaWYgKGxlbiA8IDApCisJCQkJZGllKCJjYW5ub3QgcmVhZGxpbmsgJXMiLCB0ZW1wbGF0ZSk7CisJCQlpZiAoc2l6ZW9mKGxuaykgPD0gbGVuKQorCQkJCWRpZSgiaW5zYW5lbHkgbG9uZyBzeW1saW5rICVzIiwgdGVtcGxhdGUpOworCQkJbG5rW2xlbl0gPSAwOworCQkJaWYgKHN5bWxpbmsobG5rLCBwYXRoKSkKKwkJCQlkaWUoImNhbm5vdCBzeW1saW5rICVzICVzIiwgbG5rLCBwYXRoKTsKKwkJfQorCQllbHNlIGlmIChTX0lTUkVHKHN0X3RlbXBsYXRlLnN0X21vZGUpKSB7CisJCQlpZiAoY29weV9maWxlKHBhdGgsIHRlbXBsYXRlLCBzdF90ZW1wbGF0ZS5zdF9tb2RlKSkKKwkJCQlkaWUoImNhbm5vdCBjb3B5ICVzIHRvICVzIiwgdGVtcGxhdGUsIHBhdGgpOworCQl9CisJCWVsc2UKKwkJCWVycm9yKCJpZ25vcmluZyB0ZW1wbGF0ZSAlcyIsIHRlbXBsYXRlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfdGVtcGxhdGVzKGNvbnN0IGNoYXIgKmdpdF9kaXIsIGludCBsZW4sIGNvbnN0IGNoYXIgKnRlbXBsYXRlX2RpcikKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgdGVtcGxhdGVfcGF0aFtQQVRIX01BWF07CisJaW50IHRlbXBsYXRlX2xlbjsKKwlESVIgKmRpcjsKKworCWlmICghdGVtcGxhdGVfZGlyKQorCQl0ZW1wbGF0ZV9kaXIgPSBERUZBVUxUX0dJVF9URU1QTEFURV9ESVI7CisJc3RyY3B5KHRlbXBsYXRlX3BhdGgsIHRlbXBsYXRlX2Rpcik7CisJdGVtcGxhdGVfbGVuID0gc3RybGVuKHRlbXBsYXRlX3BhdGgpOworCWlmICh0ZW1wbGF0ZV9wYXRoW3RlbXBsYXRlX2xlbi0xXSAhPSAnLycpIHsKKwkJdGVtcGxhdGVfcGF0aFt0ZW1wbGF0ZV9sZW4rK10gPSAnLyc7CisJCXRlbXBsYXRlX3BhdGhbdGVtcGxhdGVfbGVuXSA9IDA7CisJfQorCWRpciA9IG9wZW5kaXIodGVtcGxhdGVfcGF0aCk7CisJaWYgKCFkaXIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiB0ZW1wbGF0ZXMgbm90IGZvdW5kICVzXG4iLAorCQkJdGVtcGxhdGVfZGlyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGF0IHRlbXBsYXRlIGlzIGZyb20gdGhlIGNvcnJlY3QgdmludGFnZSAqLworCXN0cmNweSh0ZW1wbGF0ZV9wYXRoICsgdGVtcGxhdGVfbGVuLCAiY29uZmlnIik7CisJcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiA9IDA7CisJZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbiwKKwkJCSAgICAgdGVtcGxhdGVfcGF0aCk7CisJdGVtcGxhdGVfcGF0aFt0ZW1wbGF0ZV9sZW5dID0gMDsKKworCWlmIChyZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uICYmCisJICAgIHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24gIT0gR0lUX1JFUE9fVkVSU0lPTikgeworCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IG5vdCBjb3B5aW5nIHRlbXBsYXRlcyBvZiAiCisJCQkiYSB3cm9uZyBmb3JtYXQgdmVyc2lvbiAlZCBmcm9tICclcydcbiIsCisJCQlyZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uLAorCQkJdGVtcGxhdGVfZGlyKTsKKwkJY2xvc2VkaXIoZGlyKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweShwYXRoLCBnaXRfZGlyLCBsZW4pOworCXBhdGhbbGVuXSA9IDA7CisJY29weV90ZW1wbGF0ZXNfMShwYXRoLCBsZW4sCisJCQkgdGVtcGxhdGVfcGF0aCwgdGVtcGxhdGVfbGVuLAorCQkJIGRpcik7CisJY2xvc2VkaXIoZGlyKTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2RlZmF1bHRfZmlsZXMoY29uc3QgY2hhciAqZ2l0X2RpciwgY29uc3QgY2hhciAqdGVtcGxhdGVfcGF0aCkKK3sKKwl1bnNpZ25lZCBsZW4gPSBzdHJsZW4oZ2l0X2Rpcik7CisJc3RhdGljIGNoYXIgcGF0aFtQQVRIX01BWF07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgc3RhdCBzdDE7CisJY2hhciByZXBvX3ZlcnNpb25fc3RyaW5nWzEwXTsKKworCWlmIChsZW4gPiBzaXplb2YocGF0aCktNTApCisJCWRpZSgiaW5zYW5lIGdpdCBkaXJlY3RvcnkgJXMiLCBnaXRfZGlyKTsKKwltZW1jcHkocGF0aCwgZ2l0X2RpciwgbGVuKTsKKworCWlmIChsZW4gJiYgcGF0aFtsZW4tMV0gIT0gJy8nKQorCQlwYXRoW2xlbisrXSA9ICcvJzsKKworCS8qCisJICogQ3JlYXRlIC5naXQvcmVmcy97aGVhZHMsdGFnc30KKwkgKi8KKwlzdHJjcHkocGF0aCArIGxlbiwgInJlZnMiKTsKKwlzYWZlX2NyZWF0ZV9kaXIocGF0aCwgMSk7CisJc3RyY3B5KHBhdGggKyBsZW4sICJyZWZzL2hlYWRzIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCXN0cmNweShwYXRoICsgbGVuLCAicmVmcy90YWdzIik7CisJc2FmZV9jcmVhdGVfZGlyKHBhdGgsIDEpOworCisJLyogRmlyc3QgY29weSB0aGUgdGVtcGxhdGVzIC0tIHdlIG1pZ2h0IGhhdmUgdGhlIGRlZmF1bHQKKwkgKiBjb25maWcgZmlsZSB0aGVyZSwgaW4gd2hpY2ggY2FzZSB3ZSB3b3VsZCB3YW50IHRvIHJlYWQKKwkgKiBmcm9tIGl0IGFmdGVyIGluc3RhbGxpbmcuCisJICovCisJcGF0aFtsZW5dID0gMDsKKwljb3B5X3RlbXBsYXRlcyhwYXRoLCBsZW4sIHRlbXBsYXRlX3BhdGgpOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJLyoKKwkgKiBXZSB3b3VsZCBoYXZlIGNyZWF0ZWQgdGhlIGFib3ZlIHVuZGVyIHVzZXIncyB1bWFzayAtLSB1bmRlcgorCSAqIHNoYXJlZC1yZXBvc2l0b3J5IHNldHRpbmdzLCB3ZSB3b3VsZCBuZWVkIHRvIGZpeCB0aGVtIHVwLgorCSAqLworCWlmIChzaGFyZWRfcmVwb3NpdG9yeSkgeworCQlwYXRoW2xlbl0gPSAwOworCQlhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCk7CisJCXN0cmNweShwYXRoICsgbGVuLCAicmVmcyIpOworCQlhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCk7CisJCXN0cmNweShwYXRoICsgbGVuLCAicmVmcy9oZWFkcyIpOworCQlhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCk7CisJCXN0cmNweShwYXRoICsgbGVuLCAicmVmcy90YWdzIik7CisJCWFkanVzdF9zaGFyZWRfcGVybShwYXRoKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSB0aGUgZGVmYXVsdCBzeW1saW5rIGZyb20gIi5naXQvSEVBRCIgdG8gdGhlICJtYXN0ZXIiCisJICogYnJhbmNoLCBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCisJICovCisJc3RyY3B5KHBhdGggKyBsZW4sICJIRUFEIik7CisJaWYgKHJlYWRfcmVmKHBhdGgsIHNoYTEpIDwgMCkgeworCQlpZiAoY3JlYXRlX3N5bXJlZihwYXRoLCAicmVmcy9oZWFkcy9tYXN0ZXIiKSA8IDApCisJCQlleGl0KDEpOworCX0KKworCS8qIFRoaXMgZm9yY2VzIGNyZWF0aW9uIG9mIG5ldyBjb25maWcgZmlsZSAqLworCXNwcmludGYocmVwb192ZXJzaW9uX3N0cmluZywgIiVkIiwgR0lUX1JFUE9fVkVSU0lPTik7CisJZ2l0X2NvbmZpZ19zZXQoImNvcmUucmVwb3NpdG9yeWZvcm1hdHZlcnNpb24iLCByZXBvX3ZlcnNpb25fc3RyaW5nKTsKKworCXBhdGhbbGVuXSA9IDA7CisJc3RyY3B5KHBhdGggKyBsZW4sICJjb25maWciKTsKKworCS8qIENoZWNrIGZpbGVtb2RlIHRydXN0YWJpbGl0eSAqLworCWlmICghbHN0YXQocGF0aCwgJnN0MSkpIHsKKwkJc3RydWN0IHN0YXQgc3QyOworCQlpbnQgZmlsZW1vZGUgPSAoIWNobW9kKHBhdGgsIHN0MS5zdF9tb2RlIF4gU19JWFVTUikgJiYKKwkJCQkhbHN0YXQocGF0aCwgJnN0MikgJiYKKwkJCQlzdDEuc3RfbW9kZSAhPSBzdDIuc3RfbW9kZSk7CisJCWdpdF9jb25maWdfc2V0KCJjb3JlLmZpbGVtb2RlIiwKKwkJCSAgICAgICBmaWxlbW9kZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgaW5pdF9kYl91c2FnZVtdID0KKyJnaXQtaW5pdC1kYiBbLS10ZW1wbGF0ZT08dGVtcGxhdGUtZGlyZWN0b3J5Pl0gWy0tc2hhcmVkXSI7CisKKy8qCisgKiBJZiB5b3Ugd2FudCB0bywgeW91IGNhbiBzaGFyZSB0aGUgREIgYXJlYSB3aXRoIGFueSBudW1iZXIgb2YgYnJhbmNoZXMuCisgKiBUaGF0IGhhcyBhZHZhbnRhZ2VzOiB5b3UgY2FuIHNhdmUgc3BhY2UgYnkgc2hhcmluZyBhbGwgdGhlIFNIQTEgb2JqZWN0cy4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtaWdodCBqdXN0IG1ha2UgbG9va3VwIHNsb3dlciBhbmQgbWVzc2llci4gWW91CisgKiBiZSB0aGUganVkZ2UuICBUaGUgZGVmYXVsdCBjYXNlIGlzIHRvIGhhdmUgb25lIERCIHBlciBtYW5hZ2VkIGRpcmVjdG9yeS4KKyAqLworaW50IGNtZF9pbml0X2RiKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKmdpdF9kaXI7CisJY29uc3QgY2hhciAqc2hhMV9kaXI7CisJY29uc3QgY2hhciAqdGVtcGxhdGVfZGlyID0gTlVMTDsKKwljaGFyICpwYXRoOworCWludCBsZW4sIGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tdGVtcGxhdGU9IiwgMTEpKQorCQkJdGVtcGxhdGVfZGlyID0gYXJnKzExOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc2hhcmVkIikpCisJCQlzaGFyZWRfcmVwb3NpdG9yeSA9IFBFUk1fR1JPVVA7CisJCWVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi0tc2hhcmVkPSIsIDkpKQorCQkJc2hhcmVkX3JlcG9zaXRvcnkgPSBnaXRfY29uZmlnX3Blcm0oImFyZyIsIGFyZys5KTsKKwkJZWxzZQorCQkJdXNhZ2UoaW5pdF9kYl91c2FnZSk7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgdGhlIGRlZmF1bHQgLmdpdCBkaXJlY3RvcnkgY29udGVudHMKKwkgKi8KKwlnaXRfZGlyID0gZ2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpOworCWlmICghZ2l0X2RpcikgeworCQlnaXRfZGlyID0gREVGQVVMVF9HSVRfRElSX0VOVklST05NRU5UOworCQlmcHJpbnRmKHN0ZGVyciwgImRlZmF1bHRpbmcgdG8gbG9jYWwgc3RvcmFnZSBhcmVhXG4iKTsKKwl9CisJc2FmZV9jcmVhdGVfZGlyKGdpdF9kaXIsIDApOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSByZXBvc2l0b3J5IHZlcnNpb24gaXMgcmlnaHQuCisJICogTm90ZSB0aGF0IGEgbmV3bHkgY3JlYXRlZCByZXBvc2l0b3J5IGRvZXMgbm90IGhhdmUKKwkgKiBjb25maWcgZmlsZSwgc28gdGhpcyB3aWxsIG5vdCBmYWlsLiAgV2hhdCB3ZSBhcmUgY2F0Y2hpbmcKKwkgKiBpcyBhbiBhdHRlbXB0IHRvIHJlaW5pdGlhbGl6ZSBuZXcgcmVwb3NpdG9yeSB3aXRoIGFuIG9sZCB0b29sLgorCSAqLworCWNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0KCk7CisKKwljcmVhdGVfZGVmYXVsdF9maWxlcyhnaXRfZGlyLCB0ZW1wbGF0ZV9kaXIpOworCisJLyoKKwkgKiBBbmQgc2V0IHVwIHRoZSBvYmplY3Qgc3RvcmUuCisJICovCisJc2hhMV9kaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCWxlbiA9IHN0cmxlbihzaGExX2Rpcik7CisJcGF0aCA9IHhtYWxsb2MobGVuICsgNDApOworCW1lbWNweShwYXRoLCBzaGExX2RpciwgbGVuKTsKKworCXNhZmVfY3JlYXRlX2RpcihzaGExX2RpciwgMSk7CisJc3RyY3B5KHBhdGgrbGVuLCAiL3BhY2siKTsKKwlzYWZlX2NyZWF0ZV9kaXIocGF0aCwgMSk7CisJc3RyY3B5KHBhdGgrbGVuLCAiL2luZm8iKTsKKwlzYWZlX2NyZWF0ZV9kaXIocGF0aCwgMSk7CisKKwlpZiAoc2hhcmVkX3JlcG9zaXRvcnkpIHsKKwkJY2hhciBidWZbMTBdOworCQkvKiBXZSBkbyBub3Qgc3BlbGwgImdyb3VwIiBhbmQgc3VjaCwgc28gdGhhdAorCQkgKiB0aGUgY29uZmlndXJhdGlvbiBjYW4gYmUgcmVhZCBieSBvbGRlciB2ZXJzaW9uCisJCSAqIG9mIGdpdC4KKwkJICovCisJCXNwcmludGYoYnVmLCAiJWQiLCBzaGFyZWRfcmVwb3NpdG9yeSk7CisJCWdpdF9jb25maWdfc2V0KCJjb3JlLnNoYXJlZHJlcG9zaXRvcnkiLCBidWYpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1sb2cuYyBiL2J1aWx0aW4tbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxY2YzYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbG9nLmMKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBCdWlsdGluICJnaXQgbG9nIiBhbmQgcmVsYXRlZCBjb21tYW5kcyAoc2hvdywgd2hhdGNoYW5nZWQpCisgKgorICogKEMpIENvcHlyaWdodCAyMDA2IExpbnVzIFRvcnZhbGRzCisgKgkJIDIwMDYgSnVuaW8gSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImxvZy10cmVlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisvKiB0aGlzIGlzIGluIGJ1aWx0aW4tZGlmZi5jICovCit2b2lkIGFkZF9oZWFkKHN0cnVjdCByZXZfaW5mbyAqcmV2cyk7CisKK3N0YXRpYyB2b2lkIGNtZF9sb2dfaW5pdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJICAgICAgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJcmV2LT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwlyZXYtPmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9ERUZBVUxUOworCXJldi0+dmVyYm9zZV9oZWFkZXIgPSAxOworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgcmV2LCAiSEVBRCIpOworCWlmIChyZXYtPmRpZmZvcHQucGlja2F4ZSB8fCByZXYtPmRpZmZvcHQuZmlsdGVyKQorCQlyZXYtPmFsd2F5c19zaG93X2hlYWRlciA9IDA7CisJaWYgKGFyZ2MgPiAxKQorCQlkaWUoInVucmVjb2duaXplZCBhcmd1bWVudDogJXMiLCBhcmd2WzFdKTsKK30KKworc3RhdGljIGludCBjbWRfbG9nX3dhbGsoc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKHJldik7CisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2KSkgIT0gTlVMTCkgeworCQlsb2dfdHJlZV9jb21taXQocmV2LCBjb21taXQpOworCQlmcmVlKGNvbW1pdC0+YnVmZmVyKTsKKwkJY29tbWl0LT5idWZmZXIgPSBOVUxMOworCQlmcmVlX2NvbW1pdF9saXN0KGNvbW1pdC0+cGFyZW50cyk7CisJCWNvbW1pdC0+cGFyZW50cyA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY21kX3doYXRjaGFuZ2VkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisKKwlnaXRfY29uZmlnKGdpdF9kaWZmX3VpX2NvbmZpZyk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlyZXYuZGlmZiA9IDE7CisJcmV2LmRpZmZvcHQucmVjdXJzaXZlID0gMTsKKwlyZXYuc2ltcGxpZnlfaGlzdG9yeSA9IDA7CisJY21kX2xvZ19pbml0KGFyZ2MsIGFyZ3YsIHByZWZpeCwgJnJldik7CisJaWYgKCFyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0KQorCQlyZXYuZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfUkFXOworCXJldHVybiBjbWRfbG9nX3dhbGsoJnJldik7Cit9CisKK2ludCBjbWRfc2hvdyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2OworCisJZ2l0X2NvbmZpZyhnaXRfZGlmZl91aV9jb25maWcpOworCWluaXRfcmV2aXNpb25zKCZyZXYsIHByZWZpeCk7CisJcmV2LmRpZmYgPSAxOworCXJldi5kaWZmb3B0LnJlY3Vyc2l2ZSA9IDE7CisJcmV2LmNvbWJpbmVfbWVyZ2VzID0gMTsKKwlyZXYuZGVuc2VfY29tYmluZWRfbWVyZ2VzID0gMTsKKwlyZXYuYWx3YXlzX3Nob3dfaGVhZGVyID0gMTsKKwlyZXYuaWdub3JlX21lcmdlcyA9IDA7CisJcmV2Lm5vX3dhbGsgPSAxOworCWNtZF9sb2dfaW5pdChhcmdjLCBhcmd2LCBwcmVmaXgsICZyZXYpOworCXJldHVybiBjbWRfbG9nX3dhbGsoJnJldik7Cit9CisKK2ludCBjbWRfbG9nKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCByZXZfaW5mbyByZXY7CisKKwlnaXRfY29uZmlnKGdpdF9kaWZmX3VpX2NvbmZpZyk7CisJaW5pdF9yZXZpc2lvbnMoJnJldiwgcHJlZml4KTsKKwlyZXYuYWx3YXlzX3Nob3dfaGVhZGVyID0gMTsKKwljbWRfbG9nX2luaXQoYXJnYywgYXJndiwgcHJlZml4LCAmcmV2KTsKKwlyZXR1cm4gY21kX2xvZ193YWxrKCZyZXYpOworfQorCitzdGF0aWMgaW50IGlzdGl0bGVjaGFyKGNoYXIgYykKK3sKKwlyZXR1cm4gKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8CisJCShjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnLicgfHwgYyA9PSAnXyc7Cit9CisKK3N0YXRpYyBjaGFyICpleHRyYV9oZWFkZXJzID0gTlVMTDsKK3N0YXRpYyBpbnQgZXh0cmFfaGVhZGVyc19zaXplID0gMDsKKworc3RhdGljIGludCBnaXRfZm9ybWF0X2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImZvcm1hdC5oZWFkZXJzIikpIHsKKwkJaW50IGxlbiA9IHN0cmxlbih2YWx1ZSk7CisJCWV4dHJhX2hlYWRlcnNfc2l6ZSArPSBsZW4gKyAxOworCQlleHRyYV9oZWFkZXJzID0gcmVhbGxvYyhleHRyYV9oZWFkZXJzLCBleHRyYV9oZWFkZXJzX3NpemUpOworCQlleHRyYV9oZWFkZXJzW2V4dHJhX2hlYWRlcnNfc2l6ZSAtIGxlbiAtIDFdID0gMDsKKwkJc3RyY2F0KGV4dHJhX2hlYWRlcnMsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImRpZmYuY29sb3IiKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGdpdF9kaWZmX3VpX2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworCitzdGF0aWMgRklMRSAqcmVhbHN0ZG91dCA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciAqb3V0cHV0X2RpcmVjdG9yeSA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHJlb3Blbl9zdGRvdXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgbnIsIGludCBrZWVwX3N1YmplY3QpCit7CisJY2hhciBmaWxlbmFtZVsxMDI0XTsKKwljaGFyICpzb2w7CisJaW50IGxlbiA9IDA7CisKKwlpZiAob3V0cHV0X2RpcmVjdG9yeSkgeworCQlzdHJsY3B5KGZpbGVuYW1lLCBvdXRwdXRfZGlyZWN0b3J5LCAxMDEwKTsKKwkJbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwkJaWYgKGZpbGVuYW1lW2xlbiAtIDFdICE9ICcvJykKKwkJCWZpbGVuYW1lW2xlbisrXSA9ICcvJzsKKwl9CisKKwlzcHJpbnRmKGZpbGVuYW1lICsgbGVuLCAiJTA0ZCIsIG5yKTsKKwlsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCisJc29sID0gc3Ryc3RyKGNvbW1pdC0+YnVmZmVyLCAiXG5cbiIpOworCWlmIChzb2wpIHsKKwkJaW50IGosIHNwYWNlID0gMTsKKworCQlzb2wgKz0gMjsKKwkJLyogc3RyaXAgW1BBVENIXSBvciBbUEFUQ0ggYmxhYmxhXSAqLworCQlpZiAoIWtlZXBfc3ViamVjdCAmJiAhc3RybmNtcChzb2wsICJbUEFUQ0giLCA2KSkgeworCQkJY2hhciAqZW9zID0gc3RyY2hyKHNvbCArIDYsICddJyk7CisJCQlpZiAoZW9zKSB7CisJCQkJd2hpbGUgKGlzc3BhY2UoKmVvcykpCisJCQkJCWVvcysrOworCQkJCXNvbCA9IGVvczsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IDA7IGxlbiA8IDEwMjQgLSA2ICYmIHNvbFtqXSAmJiBzb2xbal0gIT0gJ1xuJzsgaisrKSB7CisJCQlpZiAoaXN0aXRsZWNoYXIoc29sW2pdKSkgeworCQkJCWlmIChzcGFjZSkgeworCQkJCQlmaWxlbmFtZVtsZW4rK10gPSAnLSc7CisJCQkJCXNwYWNlID0gMDsKKwkJCQl9CisJCQkJZmlsZW5hbWVbbGVuKytdID0gc29sW2pdOworCQkJCWlmIChzb2xbal0gPT0gJy4nKQorCQkJCQl3aGlsZSAoc29sW2ogKyAxXSA9PSAnLicpCisJCQkJCQlqKys7CisJCQl9IGVsc2UKKwkJCQlzcGFjZSA9IDE7CisJCX0KKwkJd2hpbGUgKGZpbGVuYW1lW2xlbiAtIDFdID09ICcuJyB8fCBmaWxlbmFtZVtsZW4gLSAxXSA9PSAnLScpCisJCQlsZW4tLTsKKwl9CisJc3RyY3B5KGZpbGVuYW1lICsgbGVuLCAiLnR4dCIpOworCWZwcmludGYocmVhbHN0ZG91dCwgIiVzXG4iLCBmaWxlbmFtZSk7CisJZnJlb3BlbihmaWxlbmFtZSwgInciLCBzdGRvdXQpOworfQorCitzdGF0aWMgaW50IGdldF9wYXRjaF9pZChzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCXVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJZGlmZl90cmVlX3NoYTEoY29tbWl0LT5wYXJlbnRzLT5pdGVtLT5vYmplY3Quc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSwKKwkJCSIiLCBvcHRpb25zKTsKKwlkaWZmY29yZV9zdGQob3B0aW9ucyk7CisJcmV0dXJuIGRpZmZfZmx1c2hfcGF0Y2hfaWQob3B0aW9ucywgc2hhMSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wYXRjaF9pZHMoc3RydWN0IHJldl9pbmZvICpyZXYsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgcmV2X2luZm8gY2hlY2tfcmV2OworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3Qgb2JqZWN0ICpvMSwgKm8yOworCXVuc2lnbmVkIGZsYWdzMSwgZmxhZ3MyOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAocmV2LT5wZW5kaW5nLm5yICE9IDIpCisJCWRpZSgiTmVlZCBleGFjdGx5IG9uZSByYW5nZS4iKTsKKworCW8xID0gcmV2LT5wZW5kaW5nLm9iamVjdHNbMF0uaXRlbTsKKwlmbGFnczEgPSBvMS0+ZmxhZ3M7CisJbzIgPSByZXYtPnBlbmRpbmcub2JqZWN0c1sxXS5pdGVtOworCWZsYWdzMiA9IG8yLT5mbGFnczsKKworCWlmICgoZmxhZ3MxICYgVU5JTlRFUkVTVElORykgPT0gKGZsYWdzMiAmIFVOSU5URVJFU1RJTkcpKQorCQlkaWUoIk5vdCBhIHJhbmdlLiIpOworCisJZGlmZl9zZXR1cChvcHRpb25zKTsKKwlvcHRpb25zLT5yZWN1cnNpdmUgPSAxOworCWlmIChkaWZmX3NldHVwX2RvbmUob3B0aW9ucykgPCAwKQorCQlkaWUoImRpZmZfc2V0dXBfZG9uZSBmYWlsZWQiKTsKKworCS8qIGdpdmVuIGEgcmFuZ2UgYS4uYiBnZXQgYWxsIHBhdGNoIGlkcyBmb3IgYi4uYSAqLworCWluaXRfcmV2aXNpb25zKCZjaGVja19yZXYsIHByZWZpeCk7CisJbzEtPmZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJbzItPmZsYWdzIF49IFVOSU5URVJFU1RJTkc7CisJYWRkX3BlbmRpbmdfb2JqZWN0KCZjaGVja19yZXYsIG8xLCAibzEiKTsKKwlhZGRfcGVuZGluZ19vYmplY3QoJmNoZWNrX3JldiwgbzIsICJvMiIpOworCXByZXBhcmVfcmV2aXNpb25fd2FsaygmY2hlY2tfcmV2KTsKKworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKCZjaGVja19yZXYpKSAhPSBOVUxMKSB7CisJCS8qIGlnbm9yZSBtZXJnZXMgKi8KKwkJaWYgKGNvbW1pdC0+cGFyZW50cyAmJiBjb21taXQtPnBhcmVudHMtPm5leHQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWdldF9wYXRjaF9pZChjb21taXQsIG9wdGlvbnMsIHNoYTEpKQorCQkJY3JlYXRlZF9vYmplY3Qoc2hhMSwgeGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG9iamVjdCkpKTsKKwl9CisKKwkvKiByZXNldCBmb3IgbmV4dCByZXZpc2lvbiB3YWxrICovCisJY2xlYXJfY29tbWl0X21hcmtzKChzdHJ1Y3QgY29tbWl0ICopbzEsCisJCQlTRUVOIHwgVU5JTlRFUkVTVElORyB8IFNIT1dOIHwgQURERUQpOworCWNsZWFyX2NvbW1pdF9tYXJrcygoc3RydWN0IGNvbW1pdCAqKW8yLAorCQkJU0VFTiB8IFVOSU5URVJFU1RJTkcgfCBTSE9XTiB8IEFEREVEKTsKKwlvMS0+ZmxhZ3MgPSBmbGFnczE7CisJbzItPmZsYWdzID0gZmxhZ3MyOworfQorCitzdGF0aWMgdm9pZCBnZW5fbWVzc2FnZV9pZChjaGFyICpkZXN0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCBjaGFyICpiYXNlKQoreworCWNvbnN0IGNoYXIgKmNvbW1pdHRlciA9IGdpdF9jb21taXR0ZXJfaW5mbygxKTsKKwljb25zdCBjaGFyICplbWFpbF9zdGFydCA9IHN0cnJjaHIoY29tbWl0dGVyLCAnPCcpOworCWNvbnN0IGNoYXIgKmVtYWlsX2VuZCA9IHN0cnJjaHIoY29tbWl0dGVyLCAnPicpOworCWlmKCFlbWFpbF9zdGFydCB8fCAhZW1haWxfZW5kIHx8IGVtYWlsX3N0YXJ0ID4gZW1haWxfZW5kIC0gMSkKKwkJZGllKCJDb3VsZCBub3QgZXh0cmFjdCBlbWFpbCBmcm9tIGNvbW1pdHRlciBpZGVudGl0eS4iKTsKKwlzbnByaW50ZihkZXN0LCBsZW5ndGgsICIlcy4lbHUuZ2l0LiUuKnMiLCBiYXNlLAorCQkgKHVuc2lnbmVkIGxvbmcpIHRpbWUoTlVMTCksCisJCSAoaW50KShlbWFpbF9lbmQgLSBlbWFpbF9zdGFydCAtIDEpLCBlbWFpbF9zdGFydCArIDEpOworfQorCitpbnQgY21kX2Zvcm1hdF9wYXRjaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGNvbW1pdCAqKmxpc3QgPSBOVUxMOworCXN0cnVjdCByZXZfaW5mbyByZXY7CisJaW50IG5yID0gMCwgdG90YWwsIGksIGo7CisJaW50IHVzZV9zdGRvdXQgPSAwOworCWludCBudW1iZXJlZCA9IDA7CisJaW50IHN0YXJ0X251bWJlciA9IC0xOworCWludCBrZWVwX3N1YmplY3QgPSAwOworCWludCBpZ25vcmVfaWZfaW5fdXBzdHJlYW0gPSAwOworCWludCB0aHJlYWQgPSAwOworCWNvbnN0IGNoYXIgKmluX3JlcGx5X3RvID0gTlVMTDsKKwlzdHJ1Y3QgZGlmZl9vcHRpb25zIHBhdGNoX2lkX29wdHM7CisJY2hhciAqYWRkX3NpZ25vZmYgPSBOVUxMOworCWNoYXIgbWVzc2FnZV9pZFsxMDI0XTsKKwljaGFyIHJlZl9tZXNzYWdlX2lkWzEwMjRdOworCisJc2V0dXBfaWRlbnQoKTsKKwlnaXRfY29uZmlnKGdpdF9mb3JtYXRfY29uZmlnKTsKKwlpbml0X3JldmlzaW9ucygmcmV2LCBwcmVmaXgpOworCXJldi5jb21taXRfZm9ybWF0ID0gQ01JVF9GTVRfRU1BSUw7CisJcmV2LnZlcmJvc2VfaGVhZGVyID0gMTsKKwlyZXYuZGlmZiA9IDE7CisJcmV2LmNvbWJpbmVfbWVyZ2VzID0gMDsKKwlyZXYuaWdub3JlX21lcmdlcyA9IDE7CisJcmV2LmRpZmZvcHQubXNnX3NlcCA9ICIiOworCXJldi5kaWZmb3B0LnJlY3Vyc2l2ZSA9IDE7CisKKwlyZXYuZXh0cmFfaGVhZGVycyA9IGV4dHJhX2hlYWRlcnM7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBhcmd1bWVudHMgYmVmb3JlIHNldHVwX3JldmlzaW9ucygpLCBvciBzb21ldGhpbmcKKwkgKiBsaWtlICJnaXQgZm10LXBhdGNoIC1vIGExMjMgSEVBRF4uLiIgbWF5IGZhaWw7IGExMjMgaXMKKwkgKiBwb3NzaWJseSBhIHZhbGlkIFNIQTEuCisJICovCisJZm9yIChpID0gMSwgaiA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tc3Rkb3V0IikpCisJCQl1c2Vfc3Rkb3V0ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW4iKSB8fAorCQkJCSFzdHJjbXAoYXJndltpXSwgIi0tbnVtYmVyZWQiKSkKKwkJCW51bWJlcmVkID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi0tc3RhcnQtbnVtYmVyPSIsIDE1KSkKKwkJCXN0YXJ0X251bWJlciA9IHN0cnRvbChhcmd2W2ldICsgMTUsIE5VTEwsIDEwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zdGFydC1udW1iZXIiKSkgeworCQkJaSsrOworCQkJaWYgKGkgPT0gYXJnYykKKwkJCQlkaWUoIk5lZWQgYSBudW1iZXIgZm9yIC0tc3RhcnQtbnVtYmVyIik7CisJCQlzdGFydF9udW1iZXIgPSBzdHJ0b2woYXJndltpXSwgTlVMTCwgMTApOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1rIikgfHwKKwkJCQkhc3RyY21wKGFyZ3ZbaV0sICItLWtlZXAtc3ViamVjdCIpKSB7CisJCQlrZWVwX3N1YmplY3QgPSAxOworCQkJcmV2LnRvdGFsID0gLTE7CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1vdXRwdXQtZGlyZWN0b3J5IikgfHwKKwkJCSAhc3RyY21wKGFyZ3ZbaV0sICItbyIpKSB7CisJCQlpKys7CisJCQlpZiAoYXJnYyA8PSBpKQorCQkJCWRpZSgiV2hpY2ggZGlyZWN0b3J5PyIpOworCQkJaWYgKG91dHB1dF9kaXJlY3RvcnkpCisJCQkJZGllKCJUd28gb3V0cHV0IGRpcmVjdG9yaWVzPyIpOworCQkJb3V0cHV0X2RpcmVjdG9yeSA9IGFyZ3ZbaV07CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS1zaWdub2ZmIikgfHwKKwkJCSAhc3RyY21wKGFyZ3ZbaV0sICItcyIpKSB7CisJCQljb25zdCBjaGFyICpjb21taXR0ZXI7CisJCQljb25zdCBjaGFyICplbmRwb3M7CisJCQljb21taXR0ZXIgPSBnaXRfY29tbWl0dGVyX2luZm8oMSk7CisJCQllbmRwb3MgPSBzdHJjaHIoY29tbWl0dGVyLCAnPicpOworCQkJaWYgKCFlbmRwb3MpCisJCQkJZGllKCJib2dvcyBjb21taXR0ZXIgaW5mbyAlc1xuIiwgY29tbWl0dGVyKTsKKwkJCWFkZF9zaWdub2ZmID0geG1hbGxvYyhlbmRwb3MgLSBjb21taXR0ZXIgKyAyKTsKKwkJCW1lbWNweShhZGRfc2lnbm9mZiwgY29tbWl0dGVyLCBlbmRwb3MgLSBjb21taXR0ZXIgKyAxKTsKKwkJCWFkZF9zaWdub2ZmW2VuZHBvcyAtIGNvbW1pdHRlciArIDFdID0gMDsKKwkJfQorCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLWF0dGFjaCIpKQorCQkJcmV2Lm1pbWVfYm91bmRhcnkgPSBnaXRfdmVyc2lvbl9zdHJpbmc7CisJCWVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItLWF0dGFjaD0iLCA5KSkKKwkJCXJldi5taW1lX2JvdW5kYXJ5ID0gYXJndltpXSArIDk7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taWdub3JlLWlmLWluLXVwc3RyZWFtIikpCisJCQlpZ25vcmVfaWZfaW5fdXBzdHJlYW0gPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItLXRocmVhZCIpKQorCQkJdGhyZWFkID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi0taW4tcmVwbHktdG89IiwgMTQpKQorCQkJaW5fcmVwbHlfdG8gPSBhcmd2W2ldICsgMTQ7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taW4tcmVwbHktdG8iKSkgeworCQkJaSsrOworCQkJaWYgKGkgPT0gYXJnYykKKwkJCQlkaWUoIk5lZWQgYSBNZXNzYWdlLUlkIGZvciAtLWluLXJlcGx5LXRvIik7CisJCQlpbl9yZXBseV90byA9IGFyZ3ZbaV07CisJCX0KKwkJZWxzZQorCQkJYXJndltqKytdID0gYXJndltpXTsKKwl9CisJYXJnYyA9IGo7CisKKwlpZiAoc3RhcnRfbnVtYmVyIDwgMCkKKwkJc3RhcnRfbnVtYmVyID0gMTsKKwlpZiAobnVtYmVyZWQgJiYga2VlcF9zdWJqZWN0KQorCQlkaWUgKCItbiBhbmQgLWsgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iKTsKKworCWFyZ2MgPSBzZXR1cF9yZXZpc2lvbnMoYXJnYywgYXJndiwgJnJldiwgIkhFQUQiKTsKKwlpZiAoYXJnYyA+IDEpCisJCWRpZSAoInVucmVjb2duaXplZCBhcmd1bWVudDogJXMiLCBhcmd2WzFdKTsKKworCWlmICghcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJcmV2LmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX0RJRkZTVEFUIHwgRElGRl9GT1JNQVRfUEFUQ0g7CisKKwlpZiAob3V0cHV0X2RpcmVjdG9yeSkgeworCQlpZiAodXNlX3N0ZG91dCkKKwkJCWRpZSgic3RhbmRhcmQgb3V0cHV0LCBvciBkaXJlY3RvcnksIHdoaWNoIG9uZT8iKTsKKwkJaWYgKG1rZGlyKG91dHB1dF9kaXJlY3RvcnksIDA3NzcpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpCisJCQlkaWUoIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICVzIiwKKwkJCSAgICBvdXRwdXRfZGlyZWN0b3J5KTsKKwl9CisKKwlpZiAocmV2LnBlbmRpbmcubnIgPT0gMSkgeworCQlyZXYucGVuZGluZy5vYmplY3RzWzBdLml0ZW0tPmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCWFkZF9oZWFkKCZyZXYpOworCX0KKworCWlmIChpZ25vcmVfaWZfaW5fdXBzdHJlYW0pCisJCWdldF9wYXRjaF9pZHMoJnJldiwgJnBhdGNoX2lkX29wdHMsIHByZWZpeCk7CisKKwlpZiAoIXVzZV9zdGRvdXQpCisJCXJlYWxzdGRvdXQgPSBmZG9wZW4oZHVwKDEpLCAidyIpOworCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXYpOworCXdoaWxlICgoY29tbWl0ID0gZ2V0X3JldmlzaW9uKCZyZXYpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwkJLyogaWdub3JlIG1lcmdlcyAqLworCQlpZiAoY29tbWl0LT5wYXJlbnRzICYmIGNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpZ25vcmVfaWZfaW5fdXBzdHJlYW0gJiYKKwkJCQkhZ2V0X3BhdGNoX2lkKGNvbW1pdCwgJnBhdGNoX2lkX29wdHMsIHNoYTEpICYmCisJCQkJbG9va3VwX29iamVjdChzaGExKSkKKwkJCWNvbnRpbnVlOworCisJCW5yKys7CisJCWxpc3QgPSByZWFsbG9jKGxpc3QsIG5yICogc2l6ZW9mKGxpc3RbMF0pKTsKKwkJbGlzdFtuciAtIDFdID0gY29tbWl0OworCX0KKwl0b3RhbCA9IG5yOworCWlmIChudW1iZXJlZCkKKwkJcmV2LnRvdGFsID0gdG90YWwgKyBzdGFydF9udW1iZXIgLSAxOworCXJldi5hZGRfc2lnbm9mZiA9IGFkZF9zaWdub2ZmOworCXJldi5yZWZfbWVzc2FnZV9pZCA9IGluX3JlcGx5X3RvOworCXdoaWxlICgwIDw9IC0tbnIpIHsKKwkJaW50IHNob3duOworCQljb21taXQgPSBsaXN0W25yXTsKKwkJcmV2Lm5yID0gdG90YWwgLSBuciArIChzdGFydF9udW1iZXIgLSAxKTsKKwkJLyogTWFrZSB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IG1haWxzIHJlcGxpZXMgdG8gdGhlIGZpcnN0ICovCisJCWlmICh0aHJlYWQpIHsKKwkJCWlmIChuciA9PSAodG90YWwgLSAyKSkgeworCQkJCXN0cm5jcHkocmVmX21lc3NhZ2VfaWQsIG1lc3NhZ2VfaWQsCisJCQkJCXNpemVvZihyZWZfbWVzc2FnZV9pZCkpOworCQkJCXJlZl9tZXNzYWdlX2lkW3NpemVvZihyZWZfbWVzc2FnZV9pZCktMV09J1wwJzsKKwkJCQlyZXYucmVmX21lc3NhZ2VfaWQgPSByZWZfbWVzc2FnZV9pZDsKKwkJCX0KKwkJCWdlbl9tZXNzYWdlX2lkKG1lc3NhZ2VfaWQsIHNpemVvZihtZXNzYWdlX2lkKSwKKwkJCQkgICAgICAgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCQkJcmV2Lm1lc3NhZ2VfaWQgPSBtZXNzYWdlX2lkOworCQl9CisJCWlmICghdXNlX3N0ZG91dCkKKwkJCXJlb3Blbl9zdGRvdXQoY29tbWl0LCByZXYubnIsIGtlZXBfc3ViamVjdCk7CisJCXNob3duID0gbG9nX3RyZWVfY29tbWl0KCZyZXYsIGNvbW1pdCk7CisJCWZyZWUoY29tbWl0LT5idWZmZXIpOworCQljb21taXQtPmJ1ZmZlciA9IE5VTEw7CisKKwkJLyogV2UgcHV0IG9uZSBleHRyYSBibGFuayBsaW5lIGJldHdlZW4gZm9ybWF0dGVkCisJCSAqIHBhdGNoZXMgYW5kIHRoaXMgZmxhZyBpcyB1c2VkIGJ5IGxvZy10cmVlIGNvZGUKKwkJICogdG8gc2VlIGlmIGl0IG5lZWRzIHRvIGVtaXQgYSBMRiBiZWZvcmUgc2hvd2luZworCQkgKiB0aGUgbG9nOyB3aGVuIHVzaW5nIG9uZSBmaWxlIHBlciBwYXRjaCwgd2UgZG8KKwkJICogbm90IHdhbnQgdGhlIGV4dHJhIGJsYW5rIGxpbmUuCisJCSAqLworCQlpZiAoIXVzZV9zdGRvdXQpCisJCQlyZXYuc2hvd25fb25lID0gMDsKKwkJaWYgKHNob3duKSB7CisJCQlpZiAocmV2Lm1pbWVfYm91bmRhcnkpCisJCQkJcHJpbnRmKCJcbi0tJXMlcy0tXG5cblxuIiwKKwkJCQkgICAgICAgbWltZV9ib3VuZGFyeV9sZWFkZXIsCisJCQkJICAgICAgIHJldi5taW1lX2JvdW5kYXJ5KTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIi0tIFxuJXNcblxuIiwgZ2l0X3ZlcnNpb25fc3RyaW5nKTsKKwkJfQorCQlpZiAoIXVzZV9zdGRvdXQpCisJCQlmY2xvc2Uoc3Rkb3V0KTsKKwl9CisJZnJlZShsaXN0KTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1scy1maWxlcy5jIGIvYnVpbHRpbi1scy1maWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMzg2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxzLWZpbGVzLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBUaGlzIG1lcmdlcyB0aGUgZmlsZSBsaXN0aW5nIGluIHRoZSBkaXJlY3RvcnkgY2FjaGUgaW5kZXgKKyAqIHdpdGggdGhlIGFjdHVhbCB3b3JraW5nIGRpcmVjdG9yeSBsaXN0LCBhbmQgc2hvd3MgZGlmZmVyZW50CisgKiBjb21iaW5hdGlvbnMgb2YgdGhlIHR3by4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgaW50IGFiYnJldiA9IDA7CitzdGF0aWMgaW50IHNob3dfZGVsZXRlZCA9IDA7CitzdGF0aWMgaW50IHNob3dfY2FjaGVkID0gMDsKK3N0YXRpYyBpbnQgc2hvd19vdGhlcnMgPSAwOworc3RhdGljIGludCBzaG93X3N0YWdlID0gMDsKK3N0YXRpYyBpbnQgc2hvd191bm1lcmdlZCA9IDA7CitzdGF0aWMgaW50IHNob3dfbW9kaWZpZWQgPSAwOworc3RhdGljIGludCBzaG93X2tpbGxlZCA9IDA7CitzdGF0aWMgaW50IHNob3dfdmFsaWRfYml0ID0gMDsKK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdG9yID0gJ1xuJzsKKworc3RhdGljIGludCBwcmVmaXhfbGVuID0gMCwgcHJlZml4X29mZnNldCA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqKnBhdGhzcGVjID0gTlVMTDsKK3N0YXRpYyBpbnQgZXJyb3JfdW5tYXRjaCA9IDA7CitzdGF0aWMgY2hhciAqcHNfbWF0Y2hlZCA9IE5VTEw7CisKK3N0YXRpYyBjb25zdCBjaGFyICp0YWdfY2FjaGVkID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX3VubWVyZ2VkID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX3JlbW92ZWQgPSAiIjsKK3N0YXRpYyBjb25zdCBjaGFyICp0YWdfb3RoZXIgPSAiIjsKK3N0YXRpYyBjb25zdCBjaGFyICp0YWdfa2lsbGVkID0gIiI7CitzdGF0aWMgY29uc3QgY2hhciAqdGFnX21vZGlmaWVkID0gIiI7CisKKworLyoKKyAqIE1hdGNoIGEgcGF0aHNwZWMgYWdhaW5zdCBhIGZpbGVuYW1lLiBUaGUgZmlyc3QgImxlbiIgY2hhcmFjdGVycworICogYXJlIHRoZSBjb21tb24gcHJlZml4CisgKi8KK3N0YXRpYyBpbnQgbWF0Y2goY29uc3QgY2hhciAqKnNwZWMsIGNoYXIgKnBzX21hdGNoZWQsCisJCSBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICptOworCisJd2hpbGUgKChtID0gKnNwZWMrKykgIT0gTlVMTCkgeworCQlpbnQgbWF0Y2hsZW4gPSBzdHJsZW4obSArIGxlbik7CisKKwkJaWYgKCFtYXRjaGxlbikKKwkJCWdvdG8gbWF0Y2hlZDsKKwkJaWYgKCFzdHJuY21wKG0gKyBsZW4sIGZpbGVuYW1lICsgbGVuLCBtYXRjaGxlbikpIHsKKwkJCWlmIChtW2xlbiArIG1hdGNobGVuIC0gMV0gPT0gJy8nKQorCQkJCWdvdG8gbWF0Y2hlZDsKKwkJCXN3aXRjaCAoZmlsZW5hbWVbbGVuICsgbWF0Y2hsZW5dKSB7CisJCQljYXNlICcvJzogY2FzZSAnXDAnOgorCQkJCWdvdG8gbWF0Y2hlZDsKKwkJCX0KKwkJfQorCQlpZiAoIWZubWF0Y2gobSArIGxlbiwgZmlsZW5hbWUgKyBsZW4sIDApKQorCQkJZ290byBtYXRjaGVkOworCQlpZiAocHNfbWF0Y2hlZCkKKwkJCXBzX21hdGNoZWQrKzsKKwkJY29udGludWU7CisJbWF0Y2hlZDoKKwkJaWYgKHBzX21hdGNoZWQpCisJCQkqcHNfbWF0Y2hlZCA9IDE7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kaXJfZW50cnkoY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgZGlyX2VudHJ5ICplbnQpCit7CisJaW50IGxlbiA9IHByZWZpeF9sZW47CisJaW50IG9mZnNldCA9IHByZWZpeF9vZmZzZXQ7CisKKwlpZiAobGVuID49IGVudC0+bGVuKQorCQlkaWUoImdpdC1scy1maWxlczogaW50ZXJuYWwgZXJyb3IgLSBkaXJlY3RvcnkgZW50cnkgbm90IHN1cGVyc2V0IG9mIHByZWZpeCIpOworCisJaWYgKHBhdGhzcGVjICYmICFtYXRjaChwYXRoc3BlYywgcHNfbWF0Y2hlZCwgZW50LT5uYW1lLCBsZW4pKQorCQlyZXR1cm47CisKKwlmcHV0cyh0YWcsIHN0ZG91dCk7CisJd3JpdGVfbmFtZV9xdW90ZWQoIiIsIDAsIGVudC0+bmFtZSArIG9mZnNldCwgbGluZV90ZXJtaW5hdG9yLCBzdGRvdXQpOworCXB1dGNoYXIobGluZV90ZXJtaW5hdG9yKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19vdGhlcl9maWxlcyhzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBkaXItPm5yOyBpKyspIHsKKwkJLyogV2Ugc2hvdWxkIG5vdCBoYXZlIGEgbWF0Y2hpbmcgZW50cnksIGJ1dCB3ZQorCQkgKiBtYXkgaGF2ZSBhbiB1bm1lcmdlZCBlbnRyeSBmb3IgdGhpcyBwYXRoLgorCQkgKi8KKwkJc3RydWN0IGRpcl9lbnRyeSAqZW50ID0gZGlyLT5lbnRyaWVzW2ldOworCQlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MoZW50LT5uYW1lLCBlbnQtPmxlbik7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJCWlmICgwIDw9IHBvcykKKwkJCWRpZSgiYnVnIGluIHNob3ctb3RoZXItZmlsZXMiKTsKKwkJcG9zID0gLXBvcyAtIDE7CisJCWlmIChwb3MgPCBhY3RpdmVfbnIpIHsgCisJCQljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQkJaWYgKGNlX25hbWVsZW4oY2UpID09IGVudC0+bGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgZW50LT5uYW1lLCBlbnQtPmxlbikpCisJCQkJY29udGludWU7IC8qIFl1cCwgdGhpcyBvbmUgZXhpc3RzIHVubWVyZ2VkICovCisJCX0KKwkJc2hvd19kaXJfZW50cnkodGFnX290aGVyLCBlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hvd19raWxsZWRfZmlsZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaXJfZW50cnkgKmVudCA9IGRpci0+ZW50cmllc1tpXTsKKwkJY2hhciAqY3AsICpzcDsKKwkJaW50IHBvcywgbGVuLCBraWxsZWQgPSAwOworCisJCWZvciAoY3AgPSBlbnQtPm5hbWU7IGNwIC0gZW50LT5uYW1lIDwgZW50LT5sZW47IGNwID0gc3AgKyAxKSB7CisJCQlzcCA9IHN0cmNocihjcCwgJy8nKTsKKwkJCWlmICghc3ApIHsKKwkJCQkvKiBJZiBlbnQtPm5hbWUgaXMgcHJlZml4IG9mIGFuIGVudHJ5IGluIHRoZQorCQkJCSAqIGNhY2hlLCBpdCB3aWxsIGJlIGtpbGxlZC4KKwkJCQkgKi8KKwkJCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhlbnQtPm5hbWUsIGVudC0+bGVuKTsKKwkJCQlpZiAoMCA8PSBwb3MpCisJCQkJCWRpZSgiYnVnIGluIHNob3cta2lsbGVkLWZpbGVzIik7CisJCQkJcG9zID0gLXBvcyAtIDE7CisJCQkJd2hpbGUgKHBvcyA8IGFjdGl2ZV9uciAmJgorCQkJCSAgICAgICBjZV9zdGFnZShhY3RpdmVfY2FjaGVbcG9zXSkpCisJCQkJCXBvcysrOyAvKiBza2lwIHVubWVyZ2VkICovCisJCQkJaWYgKGFjdGl2ZV9uciA8PSBwb3MpCisJCQkJCWJyZWFrOworCQkJCS8qIHBvcyBwb2ludHMgYXQgYSBuYW1lIGltbWVkaWF0ZWx5IGFmdGVyCisJCQkJICogZW50LT5uYW1lIGluIHRoZSBjYWNoZS4gIERvZXMgaXQgZXhwZWN0CisJCQkJICogZW50LT5uYW1lIHRvIGJlIGEgZGlyZWN0b3J5PworCQkJCSAqLworCQkJCWxlbiA9IGNlX25hbWVsZW4oYWN0aXZlX2NhY2hlW3Bvc10pOworCQkJCWlmICgoZW50LT5sZW4gPCBsZW4pICYmCisJCQkJICAgICFzdHJuY21wKGFjdGl2ZV9jYWNoZVtwb3NdLT5uYW1lLAorCQkJCQkgICAgIGVudC0+bmFtZSwgZW50LT5sZW4pICYmCisJCQkJICAgIGFjdGl2ZV9jYWNoZVtwb3NdLT5uYW1lW2VudC0+bGVuXSA9PSAnLycpCisJCQkJCWtpbGxlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoMCA8PSBjYWNoZV9uYW1lX3BvcyhlbnQtPm5hbWUsIHNwIC0gZW50LT5uYW1lKSkgeworCQkJCS8qIElmIGFueSBvZiB0aGUgbGVhZGluZyBkaXJlY3RvcmllcyBpbgorCQkJCSAqIGVudC0+bmFtZSBpcyByZWdpc3RlcmVkIGluIHRoZSBjYWNoZSwKKwkJCQkgKiBlbnQtPm5hbWUgd2lsbCBiZSBraWxsZWQuCisJCQkJICovCisJCQkJa2lsbGVkID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoa2lsbGVkKQorCQkJc2hvd19kaXJfZW50cnkodGFnX2tpbGxlZCwgZGlyLT5lbnRyaWVzW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfY2VfZW50cnkoY29uc3QgY2hhciAqdGFnLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWludCBsZW4gPSBwcmVmaXhfbGVuOworCWludCBvZmZzZXQgPSBwcmVmaXhfb2Zmc2V0OworCisJaWYgKGxlbiA+PSBjZV9uYW1lbGVuKGNlKSkKKwkJZGllKCJnaXQtbHMtZmlsZXM6IGludGVybmFsIGVycm9yIC0gY2FjaGUgZW50cnkgbm90IHN1cGVyc2V0IG9mIHByZWZpeCIpOworCisJaWYgKHBhdGhzcGVjICYmICFtYXRjaChwYXRoc3BlYywgcHNfbWF0Y2hlZCwgY2UtPm5hbWUsIGxlbikpCisJCXJldHVybjsKKworCWlmICh0YWcgJiYgKnRhZyAmJiBzaG93X3ZhbGlkX2JpdCAmJgorCSAgICAoY2UtPmNlX2ZsYWdzICYgaHRvbnMoQ0VfVkFMSUQpKSkgeworCQlzdGF0aWMgY2hhciBhbHR0YWdbNF07CisJCW1lbWNweShhbHR0YWcsIHRhZywgMyk7CisJCWlmIChpc2FscGhhKHRhZ1swXSkpCisJCQlhbHR0YWdbMF0gPSB0b2xvd2VyKHRhZ1swXSk7CisJCWVsc2UgaWYgKHRhZ1swXSA9PSAnPycpCisJCQlhbHR0YWdbMF0gPSAnISc7CisJCWVsc2UgeworCQkJYWx0dGFnWzBdID0gJ3YnOworCQkJYWx0dGFnWzFdID0gdGFnWzBdOworCQkJYWx0dGFnWzJdID0gJyAnOworCQkJYWx0dGFnWzNdID0gMDsKKwkJfQorCQl0YWcgPSBhbHR0YWc7CisJfQorCisJaWYgKCFzaG93X3N0YWdlKSB7CisJCWZwdXRzKHRhZywgc3Rkb3V0KTsKKwkJd3JpdGVfbmFtZV9xdW90ZWQoIiIsIDAsIGNlLT5uYW1lICsgb2Zmc2V0LAorCQkJCSAgbGluZV90ZXJtaW5hdG9yLCBzdGRvdXQpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRvcik7CisJfQorCWVsc2UgeworCQlwcmludGYoIiVzJTA2byAlcyAlZFx0IiwKKwkJICAgICAgIHRhZywKKwkJICAgICAgIG50b2hsKGNlLT5jZV9tb2RlKSwKKwkJICAgICAgIGFiYnJldiA/IGZpbmRfdW5pcXVlX2FiYnJldihjZS0+c2hhMSxhYmJyZXYpCisJCQkJOiBzaGExX3RvX2hleChjZS0+c2hhMSksCisJCSAgICAgICBjZV9zdGFnZShjZSkpOworCQl3cml0ZV9uYW1lX3F1b3RlZCgiIiwgMCwgY2UtPm5hbWUgKyBvZmZzZXQsCisJCQkJICBsaW5lX3Rlcm1pbmF0b3IsIHN0ZG91dCk7CisJCXB1dGNoYXIobGluZV90ZXJtaW5hdG9yKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZmlsZXMoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpOworCisJLyogRm9yIGNhY2hlZC9kZWxldGVkIGZpbGVzIHdlIGRvbid0IG5lZWQgdG8gZXZlbiBkbyB0aGUgcmVhZGRpciAqLworCWlmIChzaG93X290aGVycyB8fCBzaG93X2tpbGxlZCkgeworCQljb25zdCBjaGFyICpwYXRoID0gIi4iLCAqYmFzZSA9ICIiOworCQlpbnQgYmFzZWxlbiA9IHByZWZpeF9sZW47CisKKwkJaWYgKGJhc2VsZW4pCisJCQlwYXRoID0gYmFzZSA9IHByZWZpeDsKKwkJcmVhZF9kaXJlY3RvcnkoZGlyLCBwYXRoLCBiYXNlLCBiYXNlbGVuKTsKKwkJaWYgKHNob3dfb3RoZXJzKQorCQkJc2hvd19vdGhlcl9maWxlcyhkaXIpOworCQlpZiAoc2hvd19raWxsZWQpCisJCQlzaG93X2tpbGxlZF9maWxlcyhkaXIpOworCX0KKwlpZiAoc2hvd19jYWNoZWQgfCBzaG93X3N0YWdlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJCWlmIChleGNsdWRlZChkaXIsIGNlLT5uYW1lKSAhPSBkaXItPnNob3dfaWdub3JlZCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzaG93X3VubWVyZ2VkICYmICFjZV9zdGFnZShjZSkpCisJCQkJY29udGludWU7CisJCQlzaG93X2NlX2VudHJ5KGNlX3N0YWdlKGNlKSA/IHRhZ191bm1lcmdlZCA6IHRhZ19jYWNoZWQsIGNlKTsKKwkJfQorCX0KKwlpZiAoc2hvd19kZWxldGVkIHwgc2hvd19tb2RpZmllZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCWludCBlcnI7CisJCQlpZiAoZXhjbHVkZWQoZGlyLCBjZS0+bmFtZSkgIT0gZGlyLT5zaG93X2lnbm9yZWQpCisJCQkJY29udGludWU7CisJCQllcnIgPSBsc3RhdChjZS0+bmFtZSwgJnN0KTsKKwkJCWlmIChzaG93X2RlbGV0ZWQgJiYgZXJyKQorCQkJCXNob3dfY2VfZW50cnkodGFnX3JlbW92ZWQsIGNlKTsKKwkJCWlmIChzaG93X21vZGlmaWVkICYmIGNlX21vZGlmaWVkKGNlLCAmc3QsIDApKQorCQkJCXNob3dfY2VfZW50cnkodGFnX21vZGlmaWVkLCBjZSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBQcnVuZSB0aGUgaW5kZXggdG8gb25seSBjb250YWluIHN0dWZmIHN0YXJ0aW5nIHdpdGggInByZWZpeCIKKyAqLworc3RhdGljIHZvaWQgcHJ1bmVfY2FjaGUoY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwcmVmaXgsIHByZWZpeF9sZW4pOworCXVuc2lnbmVkIGludCBmaXJzdCwgbGFzdDsKKworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zLTE7CisJYWN0aXZlX2NhY2hlICs9IHBvczsKKwlhY3RpdmVfbnIgLT0gcG9zOworCWZpcnN0ID0gMDsKKwlsYXN0ID0gYWN0aXZlX25yOworCXdoaWxlIChsYXN0ID4gZmlyc3QpIHsKKwkJaW50IG5leHQgPSAobGFzdCArIGZpcnN0KSA+PiAxOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW25leHRdOworCQlpZiAoIXN0cm5jbXAoY2UtPm5hbWUsIHByZWZpeCwgcHJlZml4X2xlbikpIHsKKwkJCWZpcnN0ID0gbmV4dCsxOworCQkJY29udGludWU7CisJCX0KKwkJbGFzdCA9IG5leHQ7CisJfQorCWFjdGl2ZV9uciA9IGxhc3Q7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJpZnlfcGF0aHNwZWMoY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKipwLCAqbiwgKnByZXY7CisJY2hhciAqcmVhbF9wcmVmaXg7CisJdW5zaWduZWQgbG9uZyBtYXg7CisKKwlwcmV2ID0gTlVMTDsKKwltYXggPSBQQVRIX01BWDsKKwlmb3IgKHAgPSBwYXRoc3BlYzsgKG4gPSAqcCkgIT0gTlVMTDsgcCsrKSB7CisJCWludCBpLCBsZW4gPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJCWNoYXIgYyA9IG5baV07CisJCQlpZiAocHJldiAmJiBwcmV2W2ldICE9IGMpCisJCQkJYnJlYWs7CisJCQlpZiAoIWMgfHwgYyA9PSAnKicgfHwgYyA9PSAnPycpCisJCQkJYnJlYWs7CisJCQlpZiAoYyA9PSAnLycpCisJCQkJbGVuID0gaSsxOworCQl9CisJCXByZXYgPSBuOworCQlpZiAobGVuIDwgbWF4KSB7CisJCQltYXggPSBsZW47CisJCQlpZiAoIW1heCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwcmVmaXhfb2Zmc2V0ID4gbWF4IHx8IG1lbWNtcChwcmV2LCBwcmVmaXgsIHByZWZpeF9vZmZzZXQpKQorCQlkaWUoImdpdC1scy1maWxlczogY2Fubm90IGdlbmVyYXRlIHJlbGF0aXZlIGZpbGVuYW1lcyBjb250YWluaW5nICcuLiciKTsKKworCXJlYWxfcHJlZml4ID0gTlVMTDsKKwlwcmVmaXhfbGVuID0gbWF4OworCWlmIChtYXgpIHsKKwkJcmVhbF9wcmVmaXggPSB4bWFsbG9jKG1heCArIDEpOworCQltZW1jcHkocmVhbF9wcmVmaXgsIHByZXYsIG1heCk7CisJCXJlYWxfcHJlZml4W21heF0gPSAwOworCX0KKwlyZXR1cm4gcmVhbF9wcmVmaXg7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGxzX2ZpbGVzX3VzYWdlW10gPQorCSJnaXQtbHMtZmlsZXMgWy16XSBbLXRdIFstdl0gKC0tW2NhY2hlZHxkZWxldGVkfG90aGVyc3xzdGFnZXx1bm1lcmdlZHxraWxsZWR8bW9kaWZpZWRdKSogIgorCSJbIC0taWdub3JlZCBdIFstLWV4Y2x1ZGU9PHBhdHRlcm4+XSBbLS1leGNsdWRlLWZyb209PGZpbGU+XSAiCisJIlsgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9PGZpbGVuYW1lPiBdIFstLWZ1bGwtbmFtZV0gWy0tYWJicmV2XSAiCisJIlstLV0gWzxmaWxlPl0qIjsKKworaW50IGNtZF9sc19maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwlpbnQgZXhjX2dpdmVuID0gMDsKKwlzdHJ1Y3QgZGlyX3N0cnVjdCBkaXI7CisKKwltZW1zZXQoJmRpciwgMCwgc2l6ZW9mKGRpcikpOworCWlmIChwcmVmaXgpCisJCXByZWZpeF9vZmZzZXQgPSBzdHJsZW4ocHJlZml4KTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXoiKSkgeworCQkJbGluZV90ZXJtaW5hdG9yID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi10IikgfHwgIXN0cmNtcChhcmcsICItdiIpKSB7CisJCQl0YWdfY2FjaGVkID0gIkggIjsKKwkJCXRhZ191bm1lcmdlZCA9ICJNICI7CisJCQl0YWdfcmVtb3ZlZCA9ICJSICI7CisJCQl0YWdfbW9kaWZpZWQgPSAiQyAiOworCQkJdGFnX290aGVyID0gIj8gIjsKKwkJCXRhZ19raWxsZWQgPSAiSyAiOworCQkJaWYgKGFyZ1sxXSA9PSAndicpCisJCQkJc2hvd192YWxpZF9iaXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWMiKSB8fCAhc3RyY21wKGFyZywgIi0tY2FjaGVkIikpIHsKKwkJCXNob3dfY2FjaGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1kIikgfHwgIXN0cmNtcChhcmcsICItLWRlbGV0ZWQiKSkgeworCQkJc2hvd19kZWxldGVkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1tIikgfHwgIXN0cmNtcChhcmcsICItLW1vZGlmaWVkIikpIHsKKwkJCXNob3dfbW9kaWZpZWQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW8iKSB8fCAhc3RyY21wKGFyZywgIi0tb3RoZXJzIikpIHsKKwkJCXNob3dfb3RoZXJzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1pIikgfHwgIXN0cmNtcChhcmcsICItLWlnbm9yZWQiKSkgeworCQkJZGlyLnNob3dfaWdub3JlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItcyIpIHx8ICFzdHJjbXAoYXJnLCAiLS1zdGFnZSIpKSB7CisJCQlzaG93X3N0YWdlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1rIikgfHwgIXN0cmNtcChhcmcsICItLWtpbGxlZCIpKSB7CisJCQlzaG93X2tpbGxlZCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWRpcmVjdG9yeSIpKSB7CisJCQlkaXIuc2hvd19vdGhlcl9kaXJlY3RvcmllcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLWVtcHR5LWRpcmVjdG9yeSIpKSB7CisJCQlkaXIuaGlkZV9lbXB0eV9kaXJlY3RvcmllcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItdSIpIHx8ICFzdHJjbXAoYXJnLCAiLS11bm1lcmdlZCIpKSB7CisJCQkvKiBUaGVyZSdzIG5vIHBvaW50IGluIHNob3dpbmcgdW5tZXJnZWQgdW5sZXNzCisJCQkgKiB5b3UgYWxzbyBzaG93IHRoZSBzdGFnZSBpbmZvcm1hdGlvbi4KKwkJCSAqLworCQkJc2hvd19zdGFnZSA9IDE7CisJCQlzaG93X3VubWVyZ2VkID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi14IikgJiYgaSsxIDwgYXJnYykgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWFkZF9leGNsdWRlKGFyZ3ZbKytpXSwgIiIsIDAsICZkaXIuZXhjbHVkZV9saXN0W0VYQ19DTURMXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1leGNsdWRlPSIsIDEwKSkgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWFkZF9leGNsdWRlKGFyZysxMCwgIiIsIDAsICZkaXIuZXhjbHVkZV9saXN0W0VYQ19DTURMXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItWCIpICYmIGkrMSA8IGFyZ2MpIHsKKwkJCWV4Y19naXZlbiA9IDE7CisJCQlhZGRfZXhjbHVkZXNfZnJvbV9maWxlKCZkaXIsIGFyZ3ZbKytpXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1leGNsdWRlLWZyb209IiwgMTUpKSB7CisJCQlleGNfZ2l2ZW4gPSAxOworCQkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZSgmZGlyLCBhcmcrMTUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PSIsIDI0KSkgeworCQkJZXhjX2dpdmVuID0gMTsKKwkJCWRpci5leGNsdWRlX3Blcl9kaXIgPSBhcmcgKyAyNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZnVsbC1uYW1lIikpIHsKKwkJCXByZWZpeF9vZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1lcnJvci11bm1hdGNoIikpIHsKKwkJCWVycm9yX3VubWF0Y2ggPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tYWJicmV2PSIsIDkpKSB7CisJCQlhYmJyZXYgPSBzdHJ0b3VsKGFyZys5LCBOVUxMLCAxMCk7CisJCQlpZiAoYWJicmV2ICYmIGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCWFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQkJZWxzZSBpZiAoYWJicmV2ID4gNDApCisJCQkJYWJicmV2ID0gNDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWFiYnJldiIpKSB7CisJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqYXJnID09ICctJykKKwkJCXVzYWdlKGxzX2ZpbGVzX3VzYWdlKTsKKwkJYnJlYWs7CisJfQorCisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2ICsgaSk7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgcGF0aHNwZWMgbWF0Y2hlcyB0aGUgcHJlZml4ICovCisJaWYgKHBhdGhzcGVjKQorCQlwcmVmaXggPSB2ZXJpZnlfcGF0aHNwZWMocHJlZml4KTsKKworCS8qIFRyZWF0IHVubWF0Y2hpbmcgcGF0aHNwZWMgZWxlbWVudHMgYXMgZXJyb3JzICovCisJaWYgKHBhdGhzcGVjICYmIGVycm9yX3VubWF0Y2gpIHsKKwkJaW50IG51bTsKKwkJZm9yIChudW0gPSAwOyBwYXRoc3BlY1tudW1dOyBudW0rKykKKwkJCTsKKwkJcHNfbWF0Y2hlZCA9IHhjYWxsb2MoMSwgbnVtKTsKKwl9CisKKwlpZiAoZGlyLnNob3dfaWdub3JlZCAmJiAhZXhjX2dpdmVuKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IC0taWdub3JlZCBuZWVkcyBzb21lIGV4Y2x1ZGUgcGF0dGVyblxuIiwKKwkJCWFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCS8qIFdpdGggbm8gZmxhZ3MsIHdlIGRlZmF1bHQgdG8gc2hvd2luZyB0aGUgY2FjaGVkIGZpbGVzICovCisJaWYgKCEoc2hvd19zdGFnZSB8IHNob3dfZGVsZXRlZCB8IHNob3dfb3RoZXJzIHwgc2hvd191bm1lcmdlZCB8CisJICAgICAgc2hvd19raWxsZWQgfCBzaG93X21vZGlmaWVkKSkKKwkJc2hvd19jYWNoZWQgPSAxOworCisJcmVhZF9jYWNoZSgpOworCWlmIChwcmVmaXgpCisJCXBydW5lX2NhY2hlKHByZWZpeCk7CisJc2hvd19maWxlcygmZGlyLCBwcmVmaXgpOworCisJaWYgKHBzX21hdGNoZWQpIHsKKwkJLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgYWxsIHBhdGhzcGVjIG1hdGNoZWQgb3RoZXJ3aXNlCisJCSAqIGl0IGlzIGFuIGVycm9yLgorCQkgKi8KKwkJaW50IG51bSwgZXJyb3JzID0gMDsKKwkJZm9yIChudW0gPSAwOyBwYXRoc3BlY1tudW1dOyBudW0rKykgeworCQkJaWYgKHBzX21hdGNoZWRbbnVtXSkKKwkJCQljb250aW51ZTsKKwkJCWVycm9yKCJwYXRoc3BlYyAnJXMnIGRpZCBub3QgbWF0Y2ggYW55LiIsCisJCQkgICAgICBwYXRoc3BlY1tudW1dICsgcHJlZml4X29mZnNldCk7CisJCQllcnJvcnMrKzsKKwkJfQorCQlyZXR1cm4gZXJyb3JzID8gMSA6IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLWxzLXRyZWUuYyBiL2J1aWx0aW4tbHMtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTE0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLWxzLXRyZWUuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKyNkZWZpbmUgTFNfVFJFRV9PTkxZIDIKKyNkZWZpbmUgTFNfU0hPV19UUkVFUyA0CisjZGVmaW5lIExTX05BTUVfT05MWSA4CitzdGF0aWMgaW50IGFiYnJldiA9IDA7CitzdGF0aWMgaW50IGxzX29wdGlvbnMgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKipwYXRoc3BlYzsKK3N0YXRpYyBpbnQgY2hvbXBfcHJlZml4ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3ByZWZpeDsKKworc3RhdGljIGNvbnN0IGNoYXIgbHNfdHJlZV91c2FnZVtdID0KKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstdF0gWy16XSBbLS1uYW1lLW9ubHldIFstLW5hbWUtc3RhdHVzXSBbLS1mdWxsLW5hbWVdIFstLWFiYnJldls9PG4+XV0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworCitzdGF0aWMgaW50IHNob3dfcmVjdXJzaXZlKGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLCBjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwljb25zdCBjaGFyICoqczsKKworCWlmIChsc19vcHRpb25zICYgTFNfUkVDVVJTSVZFKQorCQlyZXR1cm4gMTsKKworCXMgPSBwYXRoc3BlYzsKKwlpZiAoIXMpCisJCXJldHVybiAwOworCisJZm9yICg7OykgeworCQljb25zdCBjaGFyICpzcGVjID0gKnMrKzsKKwkJaW50IGxlbiwgc3BlY2xlbjsKKworCQlpZiAoIXNwZWMpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHN0cm5jbXAoYmFzZSwgc3BlYywgYmFzZWxlbikpCisJCQljb250aW51ZTsKKwkJbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwkJc3BlYyArPSBiYXNlbGVuOworCQlzcGVjbGVuID0gc3RybGVuKHNwZWMpOworCQlpZiAoc3BlY2xlbiA8PSBsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChwYXRobmFtZSwgc3BlYywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2hvd190cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuLAorCQkgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJY29uc3QgY2hhciAqdHlwZSA9IGJsb2JfdHlwZTsKKworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmIChzaG93X3JlY3Vyc2l2ZShiYXNlLCBiYXNlbGVuLCBwYXRobmFtZSkpIHsKKwkJCXJldHZhbCA9IFJFQURfVFJFRV9SRUNVUlNJVkU7CisJCQlpZiAoIShsc19vcHRpb25zICYgTFNfU0hPV19UUkVFUykpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQl0eXBlID0gdHJlZV90eXBlOworCX0KKwllbHNlIGlmIChsc19vcHRpb25zICYgTFNfVFJFRV9PTkxZKQorCQlyZXR1cm4gMDsKKworCWlmIChjaG9tcF9wcmVmaXggJiYKKwkgICAgKGJhc2VsZW4gPCBjaG9tcF9wcmVmaXggfHwgbWVtY21wKGxzX3RyZWVfcHJlZml4LCBiYXNlLCBjaG9tcF9wcmVmaXgpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShsc19vcHRpb25zICYgTFNfTkFNRV9PTkxZKSkKKwkJcHJpbnRmKCIlMDZvICVzICVzXHQiLCBtb2RlLCB0eXBlLAorCQkJCWFiYnJldiA/IGZpbmRfdW5pcXVlX2FiYnJldihzaGExLGFiYnJldikKKwkJCQkJOiBzaGExX3RvX2hleChzaGExKSk7CisJd3JpdGVfbmFtZV9xdW90ZWQoYmFzZSArIGNob21wX3ByZWZpeCwgYmFzZWxlbiAtIGNob21wX3ByZWZpeCwKKwkJCSAgcGF0aG5hbWUsCisJCQkgIGxpbmVfdGVybWluYXRpb24sIHN0ZG91dCk7CisJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0aW9uKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgY21kX2xzX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlsc190cmVlX3ByZWZpeCA9IHByZWZpeDsKKwlpZiAocHJlZml4ICYmICpwcmVmaXgpCisJCWNob21wX3ByZWZpeCA9IHN0cmxlbihwcmVmaXgpOworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlzd2l0Y2ggKGFyZ3ZbMV1bMV0pIHsKKwkJY2FzZSAneic6CisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWxzX29wdGlvbnMgfD0gTFNfUkVDVVJTSVZFOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJbHNfb3B0aW9ucyB8PSBMU19UUkVFX09OTFk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlsc19vcHRpb25zIHw9IExTX1NIT1dfVFJFRVM7CisJCQlicmVhazsKKwkJY2FzZSAnLSc6CisJCQlpZiAoIXN0cmNtcChhcmd2WzFdKzIsICJuYW1lLW9ubHkiKSB8fAorCQkJICAgICFzdHJjbXAoYXJndlsxXSsyLCAibmFtZS1zdGF0dXMiKSkgeworCQkJCWxzX29wdGlvbnMgfD0gTFNfTkFNRV9PTkxZOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJndlsxXSsyLCAiZnVsbC1uYW1lIikpIHsKKwkJCQljaG9tcF9wcmVmaXggPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZ3ZbMV0rMiwgImFiYnJldj0iLDcpKSB7CisJCQkJYWJicmV2ID0gc3RydG91bChhcmd2WzFdKzksIE5VTEwsIDEwKTsKKwkJCQlpZiAoYWJicmV2ICYmIGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCQlhYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJCQllbHNlIGlmIChhYmJyZXYgPiA0MCkKKwkJCQkJYWJicmV2ID0gNDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmd2WzFdKzIsICJhYmJyZXYiKSkgeworCQkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogb3RoZXJ3aXNlIGZhbGx0aHJ1ICovCisJCWRlZmF1bHQ6CisJCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKwkJfQorCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJLyogLWQgLXIgc2hvdWxkIGltcGx5IC10LCBidXQgLWQgYnkgaXRzZWxmIHNob3VsZCBub3QgaGF2ZSB0by4gKi8KKwlpZiAoIChMU19UUkVFX09OTFl8TFNfUkVDVVJTSVZFKSA9PQorCSAgICAoKExTX1RSRUVfT05MWXxMU19SRUNVUlNJVkUpICYgbHNfb3B0aW9ucykpCisJCWxzX29wdGlvbnMgfD0gTFNfU0hPV19UUkVFUzsKKworCWlmIChhcmdjIDwgMikKKwkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisKKwlwYXRoc3BlYyA9IGdldF9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyAyKTsKKwl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChzaGExKTsKKwlpZiAoIXRyZWUpCisJCWRpZSgibm90IGEgdHJlZSBvYmplY3QiKTsKKwlyZWFkX3RyZWVfcmVjdXJzaXZlKHRyZWUsICIiLCAwLCAwLCBwYXRoc3BlYywgc2hvd190cmVlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1tYWlsaW5mby5jIGIvYnVpbHRpbi1tYWlsaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTRmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLW1haWxpbmZvLmMKQEAgLTAsMCArMSw4NjIgQEAKKy8qCisgKiBBbm90aGVyIHN0dXBpZCBwcm9ncmFtLCB0aGlzIG9uZSBwYXJzaW5nIHRoZSBoZWFkZXJzIG9mIGFuCisgKiBlbWFpbCB0byBmaWd1cmUgb3V0IGF1dGhvcnNoaXAgYW5kIHN1YmplY3QKKyAqLworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpZm5kZWYgTk9fSUNPTlYKKyNpbmNsdWRlIDxpY29udi5oPgorI2VuZGlmCisjaW5jbHVkZSAiZ2l0LWNvbXBhdC11dGlsLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBGSUxFICpjbWl0bXNnLCAqcGF0Y2hmaWxlLCAqZmluLCAqZm91dDsKKworc3RhdGljIGludCBrZWVwX3N1YmplY3QgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKm1ldGFpbmZvX2NoYXJzZXQgPSBOVUxMOworc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKK3N0YXRpYyBjaGFyIGRhdGVbMTAwMF07CitzdGF0aWMgY2hhciBuYW1lWzEwMDBdOworc3RhdGljIGNoYXIgZW1haWxbMTAwMF07CitzdGF0aWMgY2hhciBzdWJqZWN0WzEwMDBdOworCitzdGF0aWMgZW51bSAgeworCVRFX0RPTlRDQVJFLCBURV9RUCwgVEVfQkFTRTY0LAorfSB0cmFuc2Zlcl9lbmNvZGluZzsKK3N0YXRpYyBjaGFyIGNoYXJzZXRbMjU2XTsKKworc3RhdGljIGNoYXIgbXVsdGlwYXJ0X2JvdW5kYXJ5WzEwMDBdOworc3RhdGljIGludCBtdWx0aXBhcnRfYm91bmRhcnlfbGVuOworc3RhdGljIGludCBwYXRjaF9saW5lcyA9IDA7CisKK3N0YXRpYyBjaGFyICpzYW5pdHlfY2hlY2soY2hhciAqbmFtZSwgY2hhciAqZW1haWwpCit7CisJaW50IGxlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobGVuIDwgMyB8fCBsZW4gPiA2MCkKKwkJcmV0dXJuIGVtYWlsOworCWlmIChzdHJjaHIobmFtZSwgJ0AnKSB8fCBzdHJjaHIobmFtZSwgJzwnKSB8fCBzdHJjaHIobmFtZSwgJz4nKSkKKwkJcmV0dXJuIGVtYWlsOworCXJldHVybiBuYW1lOworfQorCitzdGF0aWMgaW50IGJvZ3VzX2Zyb20oY2hhciAqbGluZSkKK3sKKwkvKiBKb2huIERvZSA8am9obmRvZT4gKi8KKwljaGFyICpicmEsICprZXQsICpkc3QsICpjcDsKKworCS8qIFRoaXMgaXMgZmFsbGJhY2ssIHNvIGRvIG5vdCBib3RoZXIgaWYgd2UgYWxyZWFkeSBoYXZlIGFuCisJICogZS1tYWlsIGFkZHJlc3MuCisJICovCisJaWYgKCplbWFpbCkKKwkJcmV0dXJuIDA7CisKKwlicmEgPSBzdHJjaHIobGluZSwgJzwnKTsKKwlpZiAoIWJyYSkKKwkJcmV0dXJuIDA7CisJa2V0ID0gc3RyY2hyKGJyYSwgJz4nKTsKKwlpZiAoIWtldCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGRzdCA9IGVtYWlsLCBjcCA9IGJyYSsxOyBjcCA8IGtldDsgKQorCQkqZHN0KysgPSAqY3ArKzsKKwkqZHN0ID0gMDsKKwlmb3IgKGNwID0gbGluZTsgaXNzcGFjZSgqY3ApOyBjcCsrKQorCQk7CisJZm9yIChicmEtLTsgaXNzcGFjZSgqYnJhKTsgYnJhLS0pCisJCSpicmEgPSAwOworCWNwID0gc2FuaXR5X2NoZWNrKGNwLCBlbWFpbCk7CisJc3RyY3B5KG5hbWUsIGNwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfZnJvbShjaGFyICppbl9saW5lKQoreworCWNoYXIgbGluZVsxMDAwXTsKKwljaGFyICphdDsKKwljaGFyICpkc3Q7CisKKwlzdHJjcHkobGluZSwgaW5fbGluZSk7CisJYXQgPSBzdHJjaHIobGluZSwgJ0AnKTsKKwlpZiAoIWF0KQorCQlyZXR1cm4gYm9ndXNfZnJvbShsaW5lKTsKKworCS8qCisJICogSWYgd2UgYWxyZWFkeSBoYXZlIG9uZSBlbWFpbCwgZG9uJ3QgdGFrZSBhbnkgY29uZnVzaW5nIGxpbmVzCisJICovCisJaWYgKCplbWFpbCAmJiBzdHJjaHIoYXQrMSwgJ0AnKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBQaWNrIHVwIHRoZSBzdHJpbmcgYXJvdW5kICdAJywgcG9zc2libHkgZGVsaW1pdGVkIHdpdGggPD4KKwkgKiBwYWlyOyB0aGF0IGlzIHRoZSBlbWFpbCBwYXJ0LiAgV2hpdGUgdGhlbSBvdXQgd2hpbGUgY29weWluZy4KKwkgKi8KKwl3aGlsZSAoYXQgPiBsaW5lKSB7CisJCWNoYXIgYyA9IGF0Wy0xXTsKKwkJaWYgKGlzc3BhY2UoYykpCisJCQlicmVhazsKKwkJaWYgKGMgPT0gJzwnKSB7CisJCQlhdFstMV0gPSAnICc7CisJCQlicmVhazsKKwkJfQorCQlhdC0tOworCX0KKwlkc3QgPSBlbWFpbDsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICphdDsKKwkJaWYgKCFjIHx8IGMgPT0gJz4nIHx8IGlzc3BhY2UoYykpIHsKKwkJCWlmIChjID09ICc+JykKKwkJCQkqYXQgPSAnICc7CisJCQlicmVhazsKKwkJfQorCQkqYXQrKyA9ICcgJzsKKwkJKmRzdCsrID0gYzsKKwl9CisJKmRzdCsrID0gMDsKKworCS8qIFRoZSByZW1haW5kZXIgaXMgbmFtZS4gIEl0IGNvdWxkIGJlICJKb2huIERvZSA8am9obi5kb2VAeHo+IgorCSAqIG9yICJqb2huLmRvZUB4eiAoSm9obiBEb2UpIiwgYnV0IHdlIGhhdmUgd2hpdGVkIG91dCB0aGUKKwkgKiBlbWFpbCBwYXJ0LCBzbyB0cmltIGZyb20gYm90aCBlbmRzLCBwb3NzaWJseSByZW1vdmluZworCSAqIHRoZSAoKSBwYWlyIGF0IHRoZSBlbmQuCisJICovCisJYXQgPSBsaW5lICsgc3RybGVuKGxpbmUpOworCXdoaWxlIChhdCA+IGxpbmUpIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKi0tYXQ7CisJCWlmICghaXNzcGFjZShjKSkgeworCQkJYXRbKGMgPT0gJyknKSA/IDAgOiAxXSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWF0ID0gbGluZTsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICphdDsKKwkJaWYgKCFjIHx8ICFpc3NwYWNlKGMpKSB7CisJCQlpZiAoYyA9PSAnKCcpCisJCQkJYXQrKzsKKwkJCWJyZWFrOworCQl9CisJCWF0Kys7CisJfQorCWF0ID0gc2FuaXR5X2NoZWNrKGF0LCBlbWFpbCk7CisJc3RyY3B5KG5hbWUsIGF0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfZGF0ZShjaGFyICpsaW5lKQoreworCXN0cmNweShkYXRlLCBsaW5lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfc3ViamVjdChjaGFyICpsaW5lKQoreworCXN0cmNweShzdWJqZWN0LCBsaW5lKTsKKwlyZXR1cm4gMDsKK30KKworLyogTk9URSBOT1RFIE5PVEUuICBXZSBkbyBub3QgY2xhaW0gd2UgZG8gZnVsbCBNSU1FLiAgV2UganVzdCBhdHRlbXB0CisgKiB0byBoYXZlIGVub3VnaCBoZXVyaXN0aWNzIHRvIGdyb2sgTUlNRSBlbmNvZGVkIHBhdGNoZXMgb2Z0ZW4gZm91bmQKKyAqIG9uIG91ciBtYWlsaW5nIGxpc3RzLiAgRm9yIGV4YW1wbGUsIHdlIGRvIG5vdCBldmVuIHRyZWF0IGhlYWRlciBsaW5lcworICogY2FzZSBpbnNlbnNpdGl2ZWx5LgorICovCisKK3N0YXRpYyBpbnQgc2x1cnBfYXR0cihjb25zdCBjaGFyICpsaW5lLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICphdHRyKQoreworCWNvbnN0IGNoYXIgKmVuZHMsICphcCA9IHN0cmNhc2VzdHIobGluZSwgbmFtZSk7CisJc2l6ZV90IHN6OworCisJaWYgKCFhcCkgeworCQkqYXR0ciA9IDA7CisJCXJldHVybiAwOworCX0KKwlhcCArPSBzdHJsZW4obmFtZSk7CisJaWYgKCphcCA9PSAnIicpIHsKKwkJYXArKzsKKwkJZW5kcyA9ICJcIiI7CisJfQorCWVsc2UKKwkJZW5kcyA9ICI7IFx0IjsKKwlzeiA9IHN0cmNzcG4oYXAsIGVuZHMpOworCW1lbWNweShhdHRyLCBhcCwgc3opOworCWF0dHJbc3pdID0gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBoYW5kbGVfc3ViY29udGVudF90eXBlKGNoYXIgKmxpbmUpCit7CisJLyogV2UgZG8gbm90IHdhbnQgdG8gbWVzcyB3aXRoIGJvdW5kYXJ5LiAgTm90ZSB0aGF0IHdlIGRvIG5vdAorCSAqIGhhbmRsZSBuZXN0ZWQgbXVsdGlwYXJ0LgorCSAqLworCWlmIChzdHJjYXNlc3RyKGxpbmUsICJib3VuZGFyeT0iKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBoYW5kbGluZyBuZXN0ZWQgbXVsdGlwYXJ0IG1lc3NhZ2UuXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJc2x1cnBfYXR0cihsaW5lLCAiY2hhcnNldD0iLCBjaGFyc2V0KTsKKwlpZiAoKmNoYXJzZXQpIHsKKwkJaW50IGksIGM7CisJCWZvciAoaSA9IDA7IChjID0gY2hhcnNldFtpXSkgIT0gMDsgaSsrKQorCQkJY2hhcnNldFtpXSA9IHRvbG93ZXIoYyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV9jb250ZW50X3R5cGUoY2hhciAqbGluZSkKK3sKKwkqbXVsdGlwYXJ0X2JvdW5kYXJ5ID0gMDsKKwlpZiAoc2x1cnBfYXR0cihsaW5lLCAiYm91bmRhcnk9IiwgbXVsdGlwYXJ0X2JvdW5kYXJ5ICsgMikpIHsKKwkJbWVtY3B5KG11bHRpcGFydF9ib3VuZGFyeSwgIi0tIiwgMik7CisJCW11bHRpcGFydF9ib3VuZGFyeV9sZW4gPSBzdHJsZW4obXVsdGlwYXJ0X2JvdW5kYXJ5KTsKKwl9CisJc2x1cnBfYXR0cihsaW5lLCAiY2hhcnNldD0iLCBjaGFyc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYW5kbGVfY29udGVudF90cmFuc2Zlcl9lbmNvZGluZyhjaGFyICpsaW5lKQoreworCWlmIChzdHJjYXNlc3RyKGxpbmUsICJiYXNlNjQiKSkKKwkJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9CQVNFNjQ7CisJZWxzZSBpZiAoc3RyY2FzZXN0cihsaW5lLCAicXVvdGVkLXByaW50YWJsZSIpKQorCQl0cmFuc2Zlcl9lbmNvZGluZyA9IFRFX1FQOworCWVsc2UKKwkJdHJhbnNmZXJfZW5jb2RpbmcgPSBURV9ET05UQ0FSRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19tdWx0aXBhcnRfYm91bmRhcnkoY29uc3QgY2hhciAqbGluZSkKK3sKKwlyZXR1cm4gKCFtZW1jbXAobGluZSwgbXVsdGlwYXJ0X2JvdW5kYXJ5LCBtdWx0aXBhcnRfYm91bmRhcnlfbGVuKSk7Cit9CisKK3N0YXRpYyBpbnQgZWF0c3BhY2UoY2hhciAqbGluZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCXdoaWxlIChsZW4gPiAwICYmIGlzc3BhY2UobGluZVtsZW4tMV0pKQorCQlsaW5lWy0tbGVuXSA9IDA7CisJcmV0dXJuIGxlbjsKK30KKworI2RlZmluZSBTRUVOX0ZST00gMDEKKyNkZWZpbmUgU0VFTl9EQVRFIDAyCisjZGVmaW5lIFNFRU5fU1VCSkVDVCAwNAorI2RlZmluZSBTRUVOX0JPR1VTX1VOSVhfRlJPTSAwMTAKKyNkZWZpbmUgU0VFTl9QUkVGSVggIDAyMAorCisvKiBGaXJzdCBsaW5lcyBvZiBib2R5IGNhbiBoYXZlIEZyb206LCBEYXRlOiwgYW5kIFN1YmplY3Q6IG9yIGVtcHR5ICovCitzdGF0aWMgdm9pZCBoYW5kbGVfaW5ib2R5X2hlYWRlcihpbnQgKnNlZW4sIGNoYXIgKmxpbmUpCit7CisJaWYgKCpzZWVuICYgU0VFTl9QUkVGSVgpCisJCXJldHVybjsKKwlpZiAoaXNzcGFjZSgqbGluZSkpIHsKKwkJY2hhciAqY3A7CisJCWZvciAoY3AgPSBsaW5lICsgMTsgKmNwOyBjcCsrKSB7CisJCQlpZiAoIWlzc3BhY2UoKmNwKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoISpjcCkKKwkJCXJldHVybjsKKwl9CisJaWYgKCFtZW1jbXAoIj5Gcm9tIiwgbGluZSwgNSkgJiYgaXNzcGFjZShsaW5lWzVdKSkgeworCQlpZiAoISgqc2VlbiAmIFNFRU5fQk9HVVNfVU5JWF9GUk9NKSkgeworCQkJKnNlZW4gfD0gU0VFTl9CT0dVU19VTklYX0ZST007CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKCFtZW1jbXAoIkZyb206IiwgbGluZSwgNSkgJiYgaXNzcGFjZShsaW5lWzVdKSkgeworCQlpZiAoISgqc2VlbiAmIFNFRU5fRlJPTSkgJiYgaGFuZGxlX2Zyb20obGluZSs2KSkgeworCQkJKnNlZW4gfD0gU0VFTl9GUk9NOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICghbWVtY21wKCJEYXRlOiIsIGxpbmUsIDUpICYmIGlzc3BhY2UobGluZVs1XSkpIHsKKwkJaWYgKCEoKnNlZW4gJiBTRUVOX0RBVEUpKSB7CisJCQloYW5kbGVfZGF0ZShsaW5lKzYpOworCQkJKnNlZW4gfD0gU0VFTl9EQVRFOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICghbWVtY21wKCJTdWJqZWN0OiIsIGxpbmUsIDgpICYmIGlzc3BhY2UobGluZVs4XSkpIHsKKwkJaWYgKCEoKnNlZW4gJiBTRUVOX1NVQkpFQ1QpKSB7CisJCQloYW5kbGVfc3ViamVjdChsaW5lKzkpOworCQkJKnNlZW4gfD0gU0VFTl9TVUJKRUNUOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmICghbWVtY21wKCJbUEFUQ0hdIiwgbGluZSwgNykgJiYgaXNzcGFjZShsaW5lWzddKSkgeworCQlpZiAoISgqc2VlbiAmIFNFRU5fU1VCSkVDVCkpIHsKKwkJCWhhbmRsZV9zdWJqZWN0KGxpbmUpOworCQkJKnNlZW4gfD0gU0VFTl9TVUJKRUNUOworCQkJcmV0dXJuOworCQl9CisJfQorCSpzZWVuIHw9IFNFRU5fUFJFRklYOworfQorCitzdGF0aWMgY2hhciAqY2xlYW51cF9zdWJqZWN0KGNoYXIgKnN1YmplY3QpCit7CisJaWYgKGtlZXBfc3ViamVjdCkKKwkJcmV0dXJuIHN1YmplY3Q7CisJZm9yICg7OykgeworCQljaGFyICpwOworCQlpbnQgbGVuLCByZW1vdmU7CisJCXN3aXRjaCAoKnN1YmplY3QpIHsKKwkJY2FzZSAncic6IGNhc2UgJ1InOgorCQkJaWYgKCFtZW1jbXAoImU6Iiwgc3ViamVjdCsxLCAyKSkgeworCQkJCXN1YmplY3QgKz0zOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyAnOiBjYXNlICdcdCc6IGNhc2UgJzonOgorCQkJc3ViamVjdCsrOworCQkJY29udGludWU7CisKKwkJY2FzZSAnWyc6CisJCQlwID0gc3RyY2hyKHN1YmplY3QsICddJyk7CisJCQlpZiAoIXApIHsKKwkJCQlzdWJqZWN0Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsZW4gPSBzdHJsZW4ocCk7CisJCQlyZW1vdmUgPSBwIC0gc3ViamVjdDsKKwkJCWlmIChyZW1vdmUgPD0gbGVuICoyKSB7CisJCQkJc3ViamVjdCA9IHArMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWVhdHNwYWNlKHN1YmplY3QpOworCQlyZXR1cm4gc3ViamVjdDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfc3BhY2UoY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl3aGlsZSAoKGMgPSAqYnVmKSAhPSAwKSB7CisJCWJ1ZisrOworCQlpZiAoaXNzcGFjZShjKSkgeworCQkJYnVmWy0xXSA9ICcgJzsKKwkJCWMgPSAqYnVmOworCQkJd2hpbGUgKGlzc3BhY2UoYykpIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQkJbWVtbW92ZShidWYsIGJ1ZisxLCBsZW4pOworCQkJCWMgPSAqYnVmOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfaGVhZGVyKGNoYXIgKml0KTsKK3R5cGVkZWYgaW50ICgqaGVhZGVyX2ZuX3QpKGNoYXIgKik7CitzdHJ1Y3QgaGVhZGVyX2RlZiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwloZWFkZXJfZm5fdCBmdW5jOworCWludCBuYW1lbGVuOworfTsKKworc3RhdGljIHZvaWQgY2hlY2tfaGVhZGVyKGNoYXIgKmxpbmUsIHN0cnVjdCBoZWFkZXJfZGVmICpoZWFkZXIpCit7CisJaW50IGk7CisKKwlpZiAoaGVhZGVyWzBdLm5hbWVsZW4gPD0gMCkgeworCQlmb3IgKGkgPSAwOyBoZWFkZXJbaV0ubmFtZTsgaSsrKQorCQkJaGVhZGVyW2ldLm5hbWVsZW4gPSBzdHJsZW4oaGVhZGVyW2ldLm5hbWUpOworCX0KKwlmb3IgKGkgPSAwOyBoZWFkZXJbaV0ubmFtZTsgaSsrKSB7CisJCWludCBsZW4gPSBoZWFkZXJbaV0ubmFtZWxlbjsKKwkJaWYgKCFzdHJuY2FzZWNtcChsaW5lLCBoZWFkZXJbaV0ubmFtZSwgbGVuKSAmJgorCQkgICAgbGluZVtsZW5dID09ICc6JyAmJiBpc3NwYWNlKGxpbmVbbGVuICsgMV0pKSB7CisJCQkvKiBVbndyYXAgaW5saW5lIEIgYW5kIFEgZW5jb2RpbmcsIGFuZCBvcHRpb25hbGx5CisJCQkgKiBub3JtYWxpemUgdGhlIG1ldGEgaW5mb3JtYXRpb24gdG8gdXRmOC4KKwkJCSAqLworCQkJZGVjb2RlX2hlYWRlcihsaW5lICsgbGVuICsgMik7CisJCQloZWFkZXJbaV0uZnVuYyhsaW5lICsgbGVuICsgMik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfc3ViaGVhZGVyX2xpbmUoY2hhciAqbGluZSkKK3sKKwlzdGF0aWMgc3RydWN0IGhlYWRlcl9kZWYgaGVhZGVyW10gPSB7CisJCXsgIkNvbnRlbnQtVHlwZSIsIGhhbmRsZV9zdWJjb250ZW50X3R5cGUgfSwKKwkJeyAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyIsCisJCSAgaGFuZGxlX2NvbnRlbnRfdHJhbnNmZXJfZW5jb2RpbmcgfSwKKwkJeyBOVUxMIH0sCisJfTsKKwljaGVja19oZWFkZXIobGluZSwgaGVhZGVyKTsKK30KK3N0YXRpYyB2b2lkIGNoZWNrX2hlYWRlcl9saW5lKGNoYXIgKmxpbmUpCit7CisJc3RhdGljIHN0cnVjdCBoZWFkZXJfZGVmIGhlYWRlcltdID0geworCQl7ICJGcm9tIiwgaGFuZGxlX2Zyb20gfSwKKwkJeyAiRGF0ZSIsIGhhbmRsZV9kYXRlIH0sCisJCXsgIlN1YmplY3QiLCBoYW5kbGVfc3ViamVjdCB9LAorCQl7ICJDb250ZW50LVR5cGUiLCBoYW5kbGVfY29udGVudF90eXBlIH0sCisJCXsgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciLAorCQkgIGhhbmRsZV9jb250ZW50X3RyYW5zZmVyX2VuY29kaW5nIH0sCisJCXsgTlVMTCB9LAorCX07CisJY2hlY2tfaGVhZGVyKGxpbmUsIGhlYWRlcik7Cit9CisKK3N0YXRpYyBpbnQgaXNfcmZjMjgyMl9oZWFkZXIoY2hhciAqbGluZSkKK3sKKwkvKgorCSAqIFRoZSBzZWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbG9vc2VzdCBwb3NzaWJsZQorCSAqIGZpZWxkIG5hbWUgaXMgIjMuNi44IE9wdGlvbmFsIGZpZWxkcyIuCisJICoKKwkgKiBvcHRpb25hbC1maWVsZCA9IGZpZWxkLW5hbWUgIjoiIHVuc3RydWN0dXJlZCBDUkxGCisJICogZmllbGQtbmFtZSA9IDEqZnRleHQKKwkgKiBmdGV4dCA9ICVkMzMtNTcgLyAlNTktMTI2CisJICovCisJaW50IGNoOworCWNoYXIgKmNwID0gbGluZTsKKwl3aGlsZSAoKGNoID0gKmNwKyspKSB7CisJCWlmIChjaCA9PSAnOicpCisJCQlyZXR1cm4gY3AgIT0gbGluZTsKKwkJaWYgKCgzMyA8PSBjaCAmJiBjaCA8PSA1NykgfHwKKwkJICAgICg1OSA8PSBjaCAmJiBjaCA8PSAxMjYpKQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX29uZV9oZWFkZXJfbGluZShjaGFyICpsaW5lLCBpbnQgc3osIEZJTEUgKmluKQoreworCWludCBvZnMgPSAwOworCXdoaWxlIChvZnMgPCBzeikgeworCQlpbnQgcGVlaywgbGVuOworCQlpZiAoZmdldHMobGluZSArIG9mcywgc3ogLSBvZnMsIGluKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWxlbiA9IGVhdHNwYWNlKGxpbmUgKyBvZnMpOworCQlpZiAoKGxlbiA9PSAwKSB8fCAhaXNfcmZjMjgyMl9oZWFkZXIobGluZSkpIHsKKwkJCS8qIFJlLWFkZCB0aGUgbmV3bGluZSAqLworCQkJbGluZVtvZnMgKyBsZW5dID0gJ1xuJzsKKwkJCWxpbmVbb2ZzICsgbGVuICsgMV0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwkJb2ZzICs9IGxlbjsKKwkJLyogWXVjaywgMjgyMiBoZWFkZXIgImZvbGRpbmciICovCisJCXBlZWsgPSBmZ2V0Yyhpbik7IHVuZ2V0YyhwZWVrLCBpbik7CisJCWlmIChwZWVrICE9ICcgJyAmJiBwZWVrICE9ICdcdCcpCisJCQlicmVhazsKKwl9CisJLyogQ291bnQgbWJveCBGcm9tIGhlYWRlcnMgYXMgaGVhZGVycyAqLworCWlmICghb2ZzICYmICghbWVtY21wKGxpbmUsICJGcm9tICIsIDUpIHx8ICFtZW1jbXAobGluZSwgIj5Gcm9tICIsIDYpKSkKKwkJb2ZzID0gMTsKKwlyZXR1cm4gb2ZzOworfQorCitzdGF0aWMgdW5zaWduZWQgaGV4dmFsKGludCBjKQoreworCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKKwkJcmV0dXJuIGMgLSAnMCc7CisJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorCQlyZXR1cm4gYyAtICdhJyArIDEwOworCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJcmV0dXJuIGMgLSAnQScgKyAxMDsKKwlyZXR1cm4gfjA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3Ffc2VnbWVudChjaGFyICppbiwgY2hhciAqb3QsIGNoYXIgKmVwLCBpbnQgcmZjMjA0NykKK3sKKwlpbnQgYzsKKwl3aGlsZSAoKGMgPSAqaW4rKykgIT0gMCAmJiAoaW4gPD0gZXApKSB7CisJCWlmIChjID09ICc9JykgeworCQkJaW50IGQgPSAqaW4rKzsKKwkJCWlmIChkID09ICdcbicgfHwgIWQpCisJCQkJYnJlYWs7IC8qIGRyb3AgdHJhaWxpbmcgbmV3bGluZSAqLworCQkJKm90KysgPSAoKGhleHZhbChkKSA8PCA0KSB8IGhleHZhbCgqaW4rKykpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJmYzIwNDcgJiYgYyA9PSAnXycpIC8qIHJmYzIwNDcgNC4yICgyKSAqLworCQkJYyA9IDB4MjA7CisJCSpvdCsrID0gYzsKKwl9CisJKm90ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYl9zZWdtZW50KGNoYXIgKmluLCBjaGFyICpvdCwgY2hhciAqZXApCit7CisJLyogRGVjb2RlIGluLi5lcCwgcG9zc2libHkgaW4tcGxhY2UgdG8gb3QgKi8KKwlpbnQgYywgcG9zID0gMCwgYWNjID0gMDsKKworCXdoaWxlICgoYyA9ICppbisrKSAhPSAwICYmIChpbiA8PSBlcCkpIHsKKwkJaWYgKGMgPT0gJysnKQorCQkJYyA9IDYyOworCQllbHNlIGlmIChjID09ICcvJykKKwkJCWMgPSA2MzsKKwkJZWxzZSBpZiAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpCisJCQljIC09ICdBJzsKKwkJZWxzZSBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpCisJCQljIC09ICdhJyAtIDI2OworCQllbHNlIGlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykKKwkJCWMgLT0gJzAnIC0gNTI7CisJCWVsc2UgaWYgKGMgPT0gJz0nKSB7CisJCQkvKiBwYWRkaW5nIGlzIGFsbW9zdCBsaWtlIChjID09IDApLCBleGNlcHQgd2UgZG8KKwkJCSAqIG5vdCBvdXRwdXQgTlVMIHJlc3VsdGluZyBvbmx5IGZyb20gaXQ7CisJCQkgKiBmb3Igbm93IHdlIGp1c3QgdHJ1c3QgdGhlIGRhdGEuCisJCQkgKi8KKwkJCWMgPSAwOworCQl9CisJCWVsc2UKKwkJCWNvbnRpbnVlOyAvKiBnYXJiYWdlICovCisJCXN3aXRjaCAocG9zKyspIHsKKwkJY2FzZSAwOgorCQkJYWNjID0gKGMgPDwgMik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJKm90KysgPSAoYWNjIHwgKGMgPj4gNCkpOworCQkJYWNjID0gKGMgJiAxNSkgPDwgNDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQkqb3QrKyA9IChhY2MgfCAoYyA+PiAyKSk7CisJCQlhY2MgPSAoYyAmIDMpIDw8IDY7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJKm90KysgPSAoYWNjIHwgYyk7CisJCQlhY2MgPSBwb3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJKm90ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29udmVydF90b191dGY4KGNoYXIgKmxpbmUsIGNoYXIgKmNoYXJzZXQpCit7CisjaWZuZGVmIE5PX0lDT05WCisJY2hhciAqaW4sICpvdXQ7CisJc2l6ZV90IGluc2l6ZSwgb3V0c2l6ZSwgbnJjOworCWNoYXIgb3V0YnVmWzQwOTZdOyAvKiBjaGVhdCAqLworCXN0YXRpYyBjaGFyIGxhdGluX29uZVtdID0gImxhdGluMSI7CisJY2hhciAqaW5wdXRfY2hhcnNldCA9ICpjaGFyc2V0ID8gY2hhcnNldCA6IGxhdGluX29uZTsKKwlpY29udl90IGNvbnYgPSBpY29udl9vcGVuKG1ldGFpbmZvX2NoYXJzZXQsIGlucHV0X2NoYXJzZXQpOworCisJaWYgKGNvbnYgPT0gKGljb252X3QpIC0xKSB7CisJCXN0YXRpYyBpbnQgd2FybmVkX2xhdGluMV9vbmNlID0gMDsKKwkJaWYgKGlucHV0X2NoYXJzZXQgIT0gbGF0aW5fb25lKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBjb252ZXJ0IGZyb20gJXMgdG8gJXNcbiIsCisJCQkJaW5wdXRfY2hhcnNldCwgbWV0YWluZm9fY2hhcnNldCk7CisJCQkqY2hhcnNldCA9IDA7CisJCX0KKwkJZWxzZSBpZiAoIXdhcm5lZF9sYXRpbjFfb25jZSkgeworCQkJd2FybmVkX2xhdGluMV9vbmNlID0gMTsKKwkJCWZwcmludGYoc3RkZXJyLCAidHJpZWQgdG8gY29udmVydCBmcm9tICVzIHRvICVzLCAiCisJCQkJImJ1dCB5b3VyIGljb252IGRvZXMgbm90IHdvcmsgd2l0aCBpdC5cbiIsCisJCQkJaW5wdXRfY2hhcnNldCwgbWV0YWluZm9fY2hhcnNldCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpbiA9IGxpbmU7CisJaW5zaXplID0gc3RybGVuKGluKTsKKwlvdXQgPSBvdXRidWY7CisJb3V0c2l6ZSA9IHNpemVvZihvdXRidWYpOworCW5yYyA9IGljb252KGNvbnYsICZpbiwgJmluc2l6ZSwgJm91dCwgJm91dHNpemUpOworCWljb252X2Nsb3NlKGNvbnYpOworCWlmIChucmMgPT0gKHNpemVfdCkgLTEpCisJCXJldHVybjsKKwkqb3V0ID0gMDsKKwlzdHJjcHkobGluZSwgb3V0YnVmKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGRlY29kZV9oZWFkZXJfYnEoY2hhciAqaXQpCit7CisJY2hhciAqaW4sICpvdXQsICplcCwgKmNwLCAqc3A7CisJY2hhciBvdXRidWZbMTAwMF07CisJaW50IHJmYzIwNDcgPSAwOworCisJaW4gPSBpdDsKKwlvdXQgPSBvdXRidWY7CisJd2hpbGUgKChlcCA9IHN0cnN0cihpbiwgIj0/IikpICE9IE5VTEwpIHsKKwkJaW50IHN6LCBlbmNvZGluZzsKKwkJY2hhciBjaGFyc2V0X3FbMjU2XSwgcGllY2VidWZbMjU2XTsKKwkJcmZjMjA0NyA9IDE7CisKKwkJaWYgKGluICE9IGVwKSB7CisJCQlzeiA9IGVwIC0gaW47CisJCQltZW1jcHkob3V0LCBpbiwgc3opOworCQkJb3V0ICs9IHN6OworCQkJaW4gKz0gc3o7CisJCX0KKwkJLyogRS5nLgorCQkgKiBlcCA6ICI9P2lzby0yMDIyLWpwP0I/R3lSLi4uPz0gZm9vIgorCQkgKiBlcCA6ICI9P0lTTy04ODU5LTE/UT9Gb289RkNiYXI/PSBiYXoiCisJCSAqLworCQllcCArPSAyOworCQljcCA9IHN0cmNocihlcCwgJz8nKTsKKwkJaWYgKCFjcCkKKwkJCXJldHVybiByZmMyMDQ3OyAvKiBubyBtdW5naW5nICovCisJCWZvciAoc3AgPSBlcDsgc3AgPCBjcDsgc3ArKykKKwkJCWNoYXJzZXRfcVtzcCAtIGVwXSA9IHRvbG93ZXIoKnNwKTsKKwkJY2hhcnNldF9xW2NwIC0gZXBdID0gMDsKKwkJZW5jb2RpbmcgPSBjcFsxXTsKKwkJaWYgKCFlbmNvZGluZyB8fCBjcFsyXSAhPSAnPycpCisJCQlyZXR1cm4gcmZjMjA0NzsgLyogbm8gbXVuZ2luZyAqLworCQllcCA9IHN0cnN0cihjcCArIDMsICI/PSIpOworCQlpZiAoIWVwKQorCQkJcmV0dXJuIHJmYzIwNDc7IC8qIG5vIG11bmdpbmcgKi8KKwkJc3dpdGNoICh0b2xvd2VyKGVuY29kaW5nKSkgeworCQlkZWZhdWx0OgorCQkJcmV0dXJuIHJmYzIwNDc7IC8qIG5vIG11bmdpbmcgKi8KKwkJY2FzZSAnYic6CisJCQlzeiA9IGRlY29kZV9iX3NlZ21lbnQoY3AgKyAzLCBwaWVjZWJ1ZiwgZXApOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJc3ogPSBkZWNvZGVfcV9zZWdtZW50KGNwICsgMywgcGllY2VidWYsIGVwLCAxKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzeiA8IDApCisJCQlyZXR1cm4gcmZjMjA0NzsKKwkJaWYgKG1ldGFpbmZvX2NoYXJzZXQpCisJCQljb252ZXJ0X3RvX3V0ZjgocGllY2VidWYsIGNoYXJzZXRfcSk7CisJCXN0cmNweShvdXQsIHBpZWNlYnVmKTsKKwkJb3V0ICs9IHN0cmxlbihvdXQpOworCQlpbiA9IGVwICsgMjsKKwl9CisJc3RyY3B5KG91dCwgaW4pOworCXN0cmNweShpdCwgb3V0YnVmKTsKKwlyZXR1cm4gcmZjMjA0NzsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2hlYWRlcihjaGFyICppdCkKK3sKKworCWlmIChkZWNvZGVfaGVhZGVyX2JxKGl0KSkKKwkJcmV0dXJuOworCS8qIG90aGVyd2lzZSAiaXQiIGlzIGEgc3RyYWlnaHQgY29weSBvZiB0aGUgaW5wdXQuCisJICogVGhpcyBjYW4gYmUgYmluYXJ5IGd1Y2sgYnV0IHRoZXJlIGlzIG5vIGNoYXJzZXQgc3BlY2lmaWVkLgorCSAqLworCWlmIChtZXRhaW5mb19jaGFyc2V0KQorCQljb252ZXJ0X3RvX3V0ZjgoaXQsICIiKTsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3RyYW5zZmVyX2VuY29kaW5nKGNoYXIgKmxpbmUpCit7CisJY2hhciAqZXA7CisKKwlzd2l0Y2ggKHRyYW5zZmVyX2VuY29kaW5nKSB7CisJY2FzZSBURV9RUDoKKwkJZXAgPSBsaW5lICsgc3RybGVuKGxpbmUpOworCQlkZWNvZGVfcV9zZWdtZW50KGxpbmUsIGxpbmUsIGVwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBURV9CQVNFNjQ6CisJCWVwID0gbGluZSArIHN0cmxlbihsaW5lKTsKKwkJZGVjb2RlX2Jfc2VnbWVudChsaW5lLCBsaW5lLCBlcCk7CisJCWJyZWFrOworCWNhc2UgVEVfRE9OVENBUkU6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2luZm8odm9pZCkKK3sKKwljaGFyICpzdWI7CisKKwlzdWIgPSBjbGVhbnVwX3N1YmplY3Qoc3ViamVjdCk7CisJY2xlYW51cF9zcGFjZShuYW1lKTsKKwljbGVhbnVwX3NwYWNlKGRhdGUpOworCWNsZWFudXBfc3BhY2UoZW1haWwpOworCWNsZWFudXBfc3BhY2Uoc3ViKTsKKworCWZwcmludGYoZm91dCwgIkF1dGhvcjogJXNcbkVtYWlsOiAlc1xuU3ViamVjdDogJXNcbkRhdGU6ICVzXG5cbiIsCisJICAgICAgIG5hbWUsIGVtYWlsLCBzdWIsIGRhdGUpOworfQorCisvKiBXZSBhcmUgaW5zaWRlIG1lc3NhZ2UgYm9keSBhbmQgaGF2ZSByZWFkIGxpbmVbXSBhbHJlYWR5LgorICogU3BpdCBvdXQgdGhlIGNvbW1pdCBsb2cuCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2NvbW1pdF9tc2coaW50ICpzZWVuKQoreworCWlmICghY21pdG1zZykKKwkJcmV0dXJuIDA7CisJZG8geworCQlpZiAoIW1lbWNtcCgiZGlmZiAtIiwgbGluZSwgNikgfHwKKwkJICAgICFtZW1jbXAoIi0tLSIsIGxpbmUsIDMpIHx8CisJCSAgICAhbWVtY21wKCJJbmRleDogIiwgbGluZSwgNykpCisJCQlicmVhazsKKwkJaWYgKChtdWx0aXBhcnRfYm91bmRhcnlbMF0gJiYgaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KGxpbmUpKSkgeworCQkJLyogV2UgY29tZSBoZXJlIHdoZW4gdGhlIGZpcnN0IHBhcnQgaGFkIG9ubHkKKwkJCSAqIHRoZSBjb21taXQgbWVzc2FnZSB3aXRob3V0IGFueSBwYXRjaC4gIFdlCisJCQkgKiBwcmV0ZW5kIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBsaW5lIHlldCwgYW5kCisJCQkgKiBnbyBiYWNrIHRvIHRoZSBsb29wLgorCQkJICovCisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIFVud3JhcCB0cmFuc2ZlciBlbmNvZGluZyBhbmQgb3B0aW9uYWxseQorCQkgKiBub3JtYWxpemUgdGhlIGxvZyBtZXNzYWdlIHRvIFVURi04LgorCQkgKi8KKwkJZGVjb2RlX3RyYW5zZmVyX2VuY29kaW5nKGxpbmUpOworCQlpZiAobWV0YWluZm9fY2hhcnNldCkKKwkJCWNvbnZlcnRfdG9fdXRmOChsaW5lLCBjaGFyc2V0KTsKKworCQloYW5kbGVfaW5ib2R5X2hlYWRlcihzZWVuLCBsaW5lKTsKKwkJaWYgKCEoKnNlZW4gJiBTRUVOX1BSRUZJWCkpCisJCQljb250aW51ZTsKKworCQlmcHV0cyhsaW5lLCBjbWl0bXNnKTsKKwl9IHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZpbikgIT0gTlVMTCk7CisJZmNsb3NlKGNtaXRtc2cpOworCWNtaXRtc2cgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKiBXZSBoYXZlIGRvbmUgdGhlIGNvbW1pdCBtZXNzYWdlIGFuZCBoYXZlIHRoZSBmaXJzdAorICogbGluZSBvZiB0aGUgcGF0Y2ggaW4gbGluZVtdLgorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfcGF0Y2godm9pZCkKK3sKKwlkbyB7CisJCWlmIChtdWx0aXBhcnRfYm91bmRhcnlbMF0gJiYgaXNfbXVsdGlwYXJ0X2JvdW5kYXJ5KGxpbmUpKQorCQkJYnJlYWs7CisJCS8qIE9ubHkgdW53cmFwIHRyYW5zZmVyIGVuY29kaW5nIGJ1dCBvdGhlcndpc2UgZG8gbm90CisJCSAqIGRvIGFueXRoaW5nLiAgV2UgZG8gKk5PVCogd2FudCBVVEYtOCBjb252ZXJzaW9uCisJCSAqIGhlcmU7IHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIHVzZXIgcGF5bG9hZC4KKwkJICovCisJCWRlY29kZV90cmFuc2Zlcl9lbmNvZGluZyhsaW5lKTsKKwkJZnB1dHMobGluZSwgcGF0Y2hmaWxlKTsKKwkJcGF0Y2hfbGluZXMrKzsKKwl9IHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZpbikgIT0gTlVMTCk7Cit9CisKKy8qIG11bHRpcGFydCBib3VuZGFyeSBhbmQgdHJhbnNmZXIgZW5jb2RpbmcgYXJlIHNldCB1cCBmb3IgdXMsIGFuZCB3ZQorICogYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN1YiBoZWFkZXIuICBkbyBlcXVpdmFsZW50IG9mIGhhbmRsZV9ib2R5IHVwCisgKiB0byB0aGUgbmV4dCBib3VuZGFyeSB3aXRob3V0IGNsb3NpbmcgcGF0Y2hmaWxlIC0tLSB3ZSB3aWxsIGV4cGVjdAorICogdGhhdCB0aGUgZmlyc3QgcGFydCB0byBjb250YWluIGNvbW1pdCBtZXNzYWdlIGFuZCBhIHBhdGNoLCBhbmQKKyAqIGhhbmRsZSBvdGhlciBwYXJ0cyBhcyBwdXJlIHBhdGNoZXMuCisgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX211bHRpcGFydF9vbmVfcGFydChpbnQgKnNlZW4pCit7CisJaW50IG4gPSAwOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZmluKSAhPSBOVUxMKSB7CisJYWdhaW46CisJCW4rKzsKKwkJaWYgKGlzX211bHRpcGFydF9ib3VuZGFyeShsaW5lKSkKKwkJCWJyZWFrOworCQlpZiAoaGFuZGxlX2NvbW1pdF9tc2coc2VlbikpCisJCQlnb3RvIGFnYWluOworCQloYW5kbGVfcGF0Y2goKTsKKwkJYnJlYWs7CisJfQorCWlmIChuID09IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX211bHRpcGFydF9ib2R5KHZvaWQpCit7CisJaW50IHNlZW4gPSAwOworCWludCBwYXJ0X251bSA9IDA7CisKKwkvKiBTa2lwIHVwIHRvIHRoZSBmaXJzdCBib3VuZGFyeSAqLworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZpbikgIT0gTlVMTCkKKwkJaWYgKGlzX211bHRpcGFydF9ib3VuZGFyeShsaW5lKSkgeworCQkJcGFydF9udW0gPSAxOworCQkJYnJlYWs7CisJCX0KKwlpZiAoIXBhcnRfbnVtKQorCQlyZXR1cm47CisJLyogV2UgYXJlIG9uIGJvdW5kYXJ5IGxpbmUuICBTdGFydCBzbHVycGluZyB0aGUgc3ViaGVhZC4gKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgaGRyID0gcmVhZF9vbmVfaGVhZGVyX2xpbmUobGluZSwgc2l6ZW9mKGxpbmUpLCBmaW4pOworCQlpZiAoIWhkcikgeworCQkJaWYgKGhhbmRsZV9tdWx0aXBhcnRfb25lX3BhcnQoJnNlZW4pIDwgMCkKKwkJCQlyZXR1cm47CisJCQkvKiBSZXNldCBwZXIgcGFydCBoZWFkZXJzICovCisJCQl0cmFuc2Zlcl9lbmNvZGluZyA9IFRFX0RPTlRDQVJFOworCQkJY2hhcnNldFswXSA9IDA7CisJCX0KKwkJZWxzZQorCQkJY2hlY2tfc3ViaGVhZGVyX2xpbmUobGluZSk7CisJfQorCWZjbG9zZShwYXRjaGZpbGUpOworCWlmICghcGF0Y2hfbGluZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBwYXRjaCBmb3VuZFxuIik7CisJCWV4aXQoMSk7CisJfQorfQorCisvKiBOb24gbXVsdGlwYXJ0IG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9ib2R5KHZvaWQpCit7CisJaW50IHNlZW4gPSAwOworCisJaGFuZGxlX2NvbW1pdF9tc2coJnNlZW4pOworCWhhbmRsZV9wYXRjaCgpOworCWZjbG9zZShwYXRjaGZpbGUpOworCWlmICghcGF0Y2hfbGluZXMpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBwYXRjaCBmb3VuZFxuIik7CisJCWV4aXQoMSk7CisJfQorfQorCitpbnQgbWFpbGluZm8oRklMRSAqaW4sIEZJTEUgKm91dCwgaW50IGtzLCBjb25zdCBjaGFyICplbmNvZGluZywKKwkgICAgIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqcGF0Y2gpCit7CisJa2VlcF9zdWJqZWN0ID0ga3M7CisJbWV0YWluZm9fY2hhcnNldCA9IGVuY29kaW5nOworCWZpbiA9IGluOworCWZvdXQgPSBvdXQ7CisKKwljbWl0bXNnID0gZm9wZW4obXNnLCAidyIpOworCWlmICghY21pdG1zZykgeworCQlwZXJyb3IobXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwYXRjaGZpbGUgPSBmb3BlbihwYXRjaCwgInciKTsKKwlpZiAoIXBhdGNoZmlsZSkgeworCQlwZXJyb3IocGF0Y2gpOworCQlmY2xvc2UoY21pdG1zZyk7CisJCXJldHVybiAtMTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJaW50IGhkciA9IHJlYWRfb25lX2hlYWRlcl9saW5lKGxpbmUsIHNpemVvZihsaW5lKSwgZmluKTsKKwkJaWYgKCFoZHIpIHsKKwkJCWlmIChtdWx0aXBhcnRfYm91bmRhcnlbMF0pCisJCQkJaGFuZGxlX211bHRpcGFydF9ib2R5KCk7CisJCQllbHNlCisJCQkJaGFuZGxlX2JvZHkoKTsKKwkJCWhhbmRsZV9pbmZvKCk7CisJCQlicmVhazsKKwkJfQorCQljaGVja19oZWFkZXJfbGluZShsaW5lKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbWFpbGluZm9fdXNhZ2VbXSA9CisJImdpdC1tYWlsaW5mbyBbLWtdIFstdSB8IC0tZW5jb2Rpbmc9PGVuY29kaW5nPl0gbXNnIHBhdGNoIDxtYWlsID5pbmZvIjsKKworaW50IGNtZF9tYWlsaW5mbyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwkvKiBORUVEU1dPUks6IG1pZ2h0IHdhbnQgdG8gZG8gdGhlIG9wdGlvbmFsIC5naXQvIGRpcmVjdG9yeQorCSAqIGRpc2NvdmVyeQorCSAqLworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXdoaWxlICgxIDwgYXJnYyAmJiBhcmd2WzFdWzBdID09ICctJykgeworCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLWsiKSkKKwkJCWtlZXBfc3ViamVjdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi11IikpCisJCQltZXRhaW5mb19jaGFyc2V0ID0gZ2l0X2NvbW1pdF9lbmNvZGluZzsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoYXJndlsxXSwgIi0tZW5jb2Rpbmc9IiwgMTEpKQorCQkJbWV0YWluZm9fY2hhcnNldCA9IGFyZ3ZbMV0gKyAxMTsKKwkJZWxzZQorCQkJdXNhZ2UobWFpbGluZm9fdXNhZ2UpOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoYXJnYyAhPSAzKQorCQl1c2FnZShtYWlsaW5mb191c2FnZSk7CisKKwlyZXR1cm4gISFtYWlsaW5mbyhzdGRpbiwgc3Rkb3V0LCBrZWVwX3N1YmplY3QsIG1ldGFpbmZvX2NoYXJzZXQsIGFyZ3ZbMV0sIGFyZ3ZbMl0pOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1tYWlsc3BsaXQuYyBiL2J1aWx0aW4tbWFpbHNwbGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhNjk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tbWFpbHNwbGl0LmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBUb3RhbGx5IGJyYWluZGFtYWdlZCBtYm94IHNwbGl0dGVyIHByb2dyYW0uCisgKgorICogSXQganVzdCBzcGxpdHMgYSBtYm94IGludG8gYSBsaXN0IG9mIGZpbGVzOiAiMDAwMSIgIjAwMDIiIC4uCisgKiBzbyB5b3UgY2FuIHByb2Nlc3MgdGhlbSBmdXJ0aGVyIGZyb20gdGhlcmUuCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZ2l0X21haWxzcGxpdF91c2FnZVtdID0KKyJnaXQtbWFpbHNwbGl0IFstZDxwcmVjPl0gWy1mPG4+XSBbLWJdIC1vPGRpcmVjdG9yeT4gPG1ib3g+Li4uIjsKKworc3RhdGljIGludCBpc19mcm9tX2xpbmUoY29uc3QgY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICpjb2xvbjsKKworCWlmIChsZW4gPCAyMCB8fCBtZW1jbXAoIkZyb20gIiwgbGluZSwgNSkpCisJCXJldHVybiAwOworCisJY29sb24gPSBsaW5lICsgbGVuIC0gMjsKKwlsaW5lICs9IDU7CisJZm9yICg7OykgeworCQlpZiAoY29sb24gPCBsaW5lKQorCQkJcmV0dXJuIDA7CisJCWlmICgqLS1jb2xvbiA9PSAnOicpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIWlzZGlnaXQoY29sb25bLTRdKSB8fAorCSAgICAhaXNkaWdpdChjb2xvblstMl0pIHx8CisJICAgICFpc2RpZ2l0KGNvbG9uWy0xXSkgfHwKKwkgICAgIWlzZGlnaXQoY29sb25bIDFdKSB8fAorCSAgICAhaXNkaWdpdChjb2xvblsgMl0pKQorCQlyZXR1cm4gMDsKKworCS8qIHllYXIgKi8KKwlpZiAoc3RydG9sKGNvbG9uKzMsIE5VTEwsIDEwKSA8PSA5MCkKKwkJcmV0dXJuIDA7CisKKwkvKiBPaywgY2xvc2UgZW5vdWdoICovCisJcmV0dXJuIDE7Cit9CisKKy8qIENvdWxkIGJlIGFzIHNtYWxsIGFzIDY0LCBlbm91Z2ggdG8gaG9sZCBhIFVuaXggIkZyb20gIiBsaW5lLiAqLworc3RhdGljIGNoYXIgYnVmWzQwOTZdOworCisvKiBDYWxsZWQgd2l0aCB0aGUgZmlyc3QgbGluZSAocG90ZW50aWFsbHkgcGFydGlhbCkKKyAqIGFscmVhZHkgaW4gYnVmW10gLS0gbm9ybWFsbHkgdGhhdCBzaG91bGQgYmVnaW4gd2l0aAorICogdGhlIFVuaXggIkZyb20gIiBsaW5lLiAgV3JpdGUgaXQgaW50byB0aGUgc3BlY2lmaWVkCisgKiBmaWxlLgorICovCitzdGF0aWMgaW50IHNwbGl0X29uZShGSUxFICptYm94LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgYWxsb3dfYmFyZSkKK3sKKwlGSUxFICpvdXRwdXQgPSBOVUxMOworCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwlpbnQgZmQ7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGlzX2JhcmUgPSAhaXNfZnJvbV9saW5lKGJ1ZiwgbGVuKTsKKworCWlmIChpc19iYXJlICYmICFhbGxvd19iYXJlKQorCQlnb3RvIGNvcnJ1cHQ7CisKKwlmZCA9IG9wZW4obmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoImNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzIiwgbmFtZSk7CisJb3V0cHV0ID0gZmRvcGVuKGZkLCAidyIpOworCisJLyogQ29weSBpdCBvdXQsIHdoaWxlIHNlYXJjaGluZyBmb3IgYSBsaW5lIHRoYXQgYmVnaW5zIHdpdGgKKwkgKiAiRnJvbSAiIGFuZCBoYXZpbmcgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhIGRhdGUgZm9ybWF0LgorCSAqLworCWZvciAoOzspIHsKKwkJaW50IGlzX3BhcnRpYWwgPSAoYnVmW2xlbi0xXSAhPSAnXG4nKTsKKworCQlpZiAoZnB1dHMoYnVmLCBvdXRwdXQpID09IEVPRikKKwkJCWRpZSgiY2Fubm90IHdyaXRlIG91dHB1dCIpOworCisJCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBtYm94KSA9PSBOVUxMKSB7CisJCQlpZiAoZmVvZihtYm94KSkgeworCQkJCXN0YXR1cyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkaWUoImNhbm5vdCByZWFkIG1ib3giKTsKKwkJfQorCQlsZW4gPSBzdHJsZW4oYnVmKTsKKwkJaWYgKCFpc19wYXJ0aWFsICYmICFpc19iYXJlICYmIGlzX2Zyb21fbGluZShidWYsIGxlbikpCisJCQlicmVhazsgLyogZG9uZSB3aXRoIG9uZSBtZXNzYWdlICovCisJfQorCWZjbG9zZShvdXRwdXQpOworCXJldHVybiBzdGF0dXM7CisKKyBjb3JydXB0OgorCWlmIChvdXRwdXQpCisJCWZjbG9zZShvdXRwdXQpOworCXVubGluayhuYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgImNvcnJ1cHQgbWFpbGJveFxuIik7CisJZXhpdCgxKTsKK30KKworaW50IHNwbGl0X21ib3goY29uc3QgY2hhciAqKm1ib3gsIGNvbnN0IGNoYXIgKmRpciwgaW50IGFsbG93X2JhcmUsIGludCBucl9wcmVjLCBpbnQgc2tpcCkKK3sKKwljaGFyICpuYW1lID0geG1hbGxvYyhzdHJsZW4oZGlyKSArIDIgKyAzICogc2l6ZW9mKHNraXApKTsKKwlpbnQgcmV0ID0gLTE7CisKKwl3aGlsZSAoKm1ib3gpIHsKKwkJY29uc3QgY2hhciAqZmlsZSA9ICptYm94Kys7CisJCUZJTEUgKmYgPSAhc3RyY21wKGZpbGUsICItIikgPyBzdGRpbiA6IGZvcGVuKGZpbGUsICJyIik7CisJCWludCBmaWxlX2RvbmUgPSAwOworCisJCWlmICggIWYgKSB7CisJCQllcnJvcigiY2Fubm90IG9wZW4gbWJveCAlcyIsIGZpbGUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgPT0gTlVMTCkgeworCQkJaWYgKGYgPT0gc3RkaW4pCisJCQkJYnJlYWs7IC8qIGVtcHR5IHN0ZGluIGlzIE9LICovCisJCQllcnJvcigiY2Fubm90IHJlYWQgbWJveCAlcyIsIGZpbGUpOworCQkJZ290byBvdXQ7CisJCX0KKworCQl3aGlsZSAoIWZpbGVfZG9uZSkgeworCQkJc3ByaW50ZihuYW1lLCAiJXMvJTAqZCIsIGRpciwgbnJfcHJlYywgKytza2lwKTsKKwkJCWZpbGVfZG9uZSA9IHNwbGl0X29uZShmLCBuYW1lLCBhbGxvd19iYXJlKTsKKwkJfQorCisJCWlmIChmICE9IHN0ZGluKQorCQkJZmNsb3NlKGYpOworCX0KKwlyZXQgPSBza2lwOworb3V0OgorCWZyZWUobmFtZSk7CisJcmV0dXJuIHJldDsKK30KK2ludCBjbWRfbWFpbHNwbGl0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBuciA9IDAsIG5yX3ByZWMgPSA0LCByZXQ7CisJaW50IGFsbG93X2JhcmUgPSAwOworCWNvbnN0IGNoYXIgKmRpciA9IE5VTEw7CisJY29uc3QgY2hhciAqKmFyZ3A7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN0ZGluX29ubHlbXSA9IHsgIi0iLCBOVUxMIH07CisKKwlmb3IgKGFyZ3AgPSBhcmd2KzE7ICphcmdwOyBhcmdwKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gKmFyZ3A7CisKKwkJaWYgKGFyZ1swXSAhPSAnLScpCisJCQlicmVhazsKKwkJLyogZG8gZmxhZ3MgaGVyZSAqLworCQlpZiAoIGFyZ1sxXSA9PSAnZCcgKSB7CisJCQlucl9wcmVjID0gc3RydG9sKGFyZysyLCBOVUxMLCAxMCk7CisJCQlpZiAobnJfcHJlYyA8IDMgfHwgMTAgPD0gbnJfcHJlYykKKwkJCQl1c2FnZShnaXRfbWFpbHNwbGl0X3VzYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKCBhcmdbMV0gPT0gJ2YnICkgeworCQkJbnIgPSBzdHJ0b2woYXJnKzIsIE5VTEwsIDEwKTsKKwkJfSBlbHNlIGlmICggYXJnWzFdID09ICdiJyAmJiAhYXJnWzJdICkgeworCQkJYWxsb3dfYmFyZSA9IDE7CisJCX0gZWxzZSBpZiAoIGFyZ1sxXSA9PSAnbycgJiYgYXJnWzJdICkgeworCQkJZGlyID0gYXJnKzI7CisJCX0gZWxzZSBpZiAoIGFyZ1sxXSA9PSAnLScgJiYgIWFyZ1syXSApIHsKKwkJCWFyZ3ArKzsJLyogLS0gbWFya3MgZW5kIG9mIG9wdGlvbnMgKi8KKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZGllKCJ1bmtub3duIG9wdGlvbjogJXMiLCBhcmcpOworCQl9CisJfQorCisJaWYgKCAhZGlyICkgeworCQkvKiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogaWYgbm8gLW8gc3BlY2lmaWVkLCBhY2NlcHQKKwkJICAgPG1ib3g+IDxkaXI+IG9yIGp1c3QgPGRpcj4gKi8KKwkJc3dpdGNoIChhcmdjIC0gKGFyZ3AtYXJndikpIHsKKwkJY2FzZSAxOgorCQkJZGlyID0gYXJncFswXTsKKwkJCWFyZ3AgPSBzdGRpbl9vbmx5OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0ZGluX29ubHlbMF0gPSBhcmdwWzBdOworCQkJZGlyID0gYXJncFsxXTsKKwkJCWFyZ3AgPSBzdGRpbl9vbmx5OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl1c2FnZShnaXRfbWFpbHNwbGl0X3VzYWdlKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5ldyB1c2FnZTogaWYgbm8gbW9yZSBhcmd1bWVudCwgcGFyc2Ugc3RkaW4gKi8KKwkJaWYgKCAhKmFyZ3AgKQorCQkJYXJncCA9IHN0ZGluX29ubHk7CisJfQorCisJcmV0ID0gc3BsaXRfbWJveChhcmdwLCBkaXIsIGFsbG93X2JhcmUsIG5yX3ByZWMsIG5yKTsKKwlpZiAocmV0ICE9IC0xKQorCQlwcmludGYoIiVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldCA9PSAtMTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tbXYuYyBiL2J1aWx0aW4tbXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzMxZjhkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1tdi5jCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogImdpdCBtdiIgYnVpbHRpbiBjb21tYW5kCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEpvaGFubmVzIFNjaGluZGVsaW4KKyAqLworI2luY2x1ZGUgPGZubWF0Y2guaD4KKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlICJwYXRoLWxpc3QuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9tdl91c2FnZVtdID0KKyJnaXQtbXYgWy1uXSBbLWZdICg8c291cmNlPiA8ZGVzdGluYXRpb24+IHwgWy1rXSA8c291cmNlPi4uLiA8ZGVzdGluYXRpb24+KSI7CisKK3N0YXRpYyBjb25zdCBjaGFyICoqY29weV9wYXRoc3BlYyhjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKipwYXRoc3BlYywKKwkJCQkgIGludCBjb3VudCwgaW50IGJhc2VfbmFtZSkKK3sKKwljb25zdCBjaGFyICoqcmVzdWx0ID0geG1hbGxvYygoY291bnQgKyAxKSAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKwltZW1jcHkocmVzdWx0LCBwYXRoc3BlYywgY291bnQgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CisJcmVzdWx0W2NvdW50XSA9IE5VTEw7CisJaWYgKGJhc2VfbmFtZSkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmxhc3Rfc2xhc2ggPSBzdHJyY2hyKHJlc3VsdFtpXSwgJy8nKTsKKwkJCWlmIChsYXN0X3NsYXNoKQorCQkJCXJlc3VsdFtpXSA9IGxhc3Rfc2xhc2ggKyAxOworCQl9CisJfQorCXJldHVybiBnZXRfcGF0aHNwZWMocHJlZml4LCByZXN1bHQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2xpc3QoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QpCit7CisJaWYgKGxpc3QtPm5yID4gMCkgeworCQlpbnQgaTsKKwkJcHJpbnRmKCIlcyIsIGxhYmVsKTsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJCQlwcmludGYoIiVzJXMiLCBpID4gMCA/ICIsICIgOiAiIiwgbGlzdC0+aXRlbXNbaV0ucGF0aCk7CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqYWRkX3NsYXNoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoKTsKKwlpZiAocGF0aFtsZW4gLSAxXSAhPSAnLycpIHsKKwkJY2hhciAqd2l0aF9zbGFzaCA9IHhtYWxsb2MobGVuICsgMik7CisJCW1lbWNweSh3aXRoX3NsYXNoLCBwYXRoLCBsZW4pOworCQl3aXRoX3NsYXNoW2xlbisrXSA9ICcvJzsKKwkJd2l0aF9zbGFzaFtsZW5dID0gMDsKKwkJcmV0dXJuIHdpdGhfc2xhc2g7CisJfQorCXJldHVybiBwYXRoOworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfbXYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIG5ld2ZkLCBjb3VudDsKKwlpbnQgdmVyYm9zZSA9IDAsIHNob3dfb25seSA9IDAsIGZvcmNlID0gMCwgaWdub3JlX2Vycm9ycyA9IDA7CisJY29uc3QgY2hhciAqKnNvdXJjZSwgKipkZXN0aW5hdGlvbiwgKipkZXN0X3BhdGg7CisJZW51bSB1cGRhdGVfbW9kZSB7IEJPVEggPSAwLCBXT1JLSU5HX0RJUkVDVE9SWSwgSU5ERVggfSAqbW9kZXM7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IHBhdGhfbGlzdCBvdmVyd3JpdHRlbiA9IHtOVUxMLCAwLCAwLCAwfTsKKwlzdHJ1Y3QgcGF0aF9saXN0IHNyY19mb3JfZHN0ID0ge05VTEwsIDAsIDAsIDB9OworCXN0cnVjdCBwYXRoX2xpc3QgYWRkZWQgPSB7TlVMTCwgMCwgMCwgMH07CisJc3RydWN0IHBhdGhfbGlzdCBkZWxldGVkID0ge05VTEwsIDAsIDAsIDB9OworCXN0cnVjdCBwYXRoX2xpc3QgY2hhbmdlZCA9IHtOVUxMLCAwLCAwLCAwfTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZSgmbG9ja19maWxlLCBnZXRfaW5kZXhfZmlsZSgpLCAxKTsKKwlpZiAocmVhZF9jYWNoZSgpIDwgMCkKKwkJZGllKCJpbmRleCBmaWxlIGNvcnJ1cHQiKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlpKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItbiIpKSB7CisJCQlzaG93X29ubHkgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWYiKSkgeworCQkJZm9yY2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWsiKSkgeworCQkJaWdub3JlX2Vycm9ycyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZShidWlsdGluX212X3VzYWdlKTsKKwl9CisJY291bnQgPSBhcmdjIC0gaSAtIDE7CisJaWYgKGNvdW50IDwgMSkKKwkJdXNhZ2UoYnVpbHRpbl9tdl91c2FnZSk7CisKKwlzb3VyY2UgPSBjb3B5X3BhdGhzcGVjKHByZWZpeCwgYXJndiArIGksIGNvdW50LCAwKTsKKwltb2RlcyA9IHhjYWxsb2MoY291bnQsIHNpemVvZihlbnVtIHVwZGF0ZV9tb2RlKSk7CisJZGVzdF9wYXRoID0gY29weV9wYXRoc3BlYyhwcmVmaXgsIGFyZ3YgKyBhcmdjIC0gMSwgMSwgMCk7CisKKwlpZiAoIWxzdGF0KGRlc3RfcGF0aFswXSwgJnN0KSAmJgorCQkJU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQlkZXN0X3BhdGhbMF0gPSBhZGRfc2xhc2goZGVzdF9wYXRoWzBdKTsKKwkJZGVzdGluYXRpb24gPSBjb3B5X3BhdGhzcGVjKGRlc3RfcGF0aFswXSwgYXJndiArIGksIGNvdW50LCAxKTsKKwl9IGVsc2UgeworCQlpZiAoY291bnQgIT0gMSkKKwkJCXVzYWdlKGJ1aWx0aW5fbXZfdXNhZ2UpOworCQlkZXN0aW5hdGlvbiA9IGRlc3RfcGF0aDsKKwl9CisKKwkvKiBDaGVja2luZyAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmJhZCA9IE5VTEw7CisKKwkJaWYgKHNob3dfb25seSkKKwkJCXByaW50ZigiQ2hlY2tpbmcgcmVuYW1lIG9mICclcycgdG8gJyVzJ1xuIiwKKwkJCQlzb3VyY2VbaV0sIGRlc3RpbmF0aW9uW2ldKTsKKworCQlpZiAobHN0YXQoc291cmNlW2ldLCAmc3QpIDwgMCkKKwkJCWJhZCA9ICJiYWQgc291cmNlIjsKKworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJY29uc3QgY2hhciAqZGlyID0gc291cmNlW2ldLCAqZGVzdF9kaXIgPSBkZXN0aW5hdGlvbltpXTsKKwkJCWludCBmaXJzdCwgbGFzdCwgbGVuID0gc3RybGVuKGRpcik7CisKKwkJCWlmIChsc3RhdChkZXN0X2RpciwgJnN0KSA9PSAwKSB7CisJCQkJYmFkID0gImNhbm5vdCBtb3ZlIGRpcmVjdG9yeSBvdmVyIGZpbGUiOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKworCQkJbW9kZXNbaV0gPSBXT1JLSU5HX0RJUkVDVE9SWTsKKworCQkJZmlyc3QgPSBjYWNoZV9uYW1lX3Bvcyhzb3VyY2VbaV0sIGxlbik7CisJCQlpZiAoZmlyc3QgPj0gMCkKKwkJCQlkaWUgKCJIdWg/ICVzLyBpcyBpbiBpbmRleD8iLCBkaXIpOworCisJCQlmaXJzdCA9IC0xIC0gZmlyc3Q7CisJCQlmb3IgKGxhc3QgPSBmaXJzdDsgbGFzdCA8IGFjdGl2ZV9ucjsgbGFzdCsrKSB7CisJCQkJY29uc3QgY2hhciAqcGF0aCA9IGFjdGl2ZV9jYWNoZVtsYXN0XS0+bmFtZTsKKwkJCQlpZiAoc3RybmNtcChwYXRoLCBkaXIsIGxlbikgfHwgcGF0aFtsZW5dICE9ICcvJykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChsYXN0IC0gZmlyc3QgPCAxKQorCQkJCWJhZCA9ICJzb3VyY2UgZGlyZWN0b3J5IGlzIGVtcHR5IjsKKwkJCWVsc2UgaWYgKCFiYWQpIHsKKwkJCQlpbnQgaiwgZHN0X2xlbiA9IHN0cmxlbihkZXN0X2Rpcik7CisKKwkJCQlpZiAobGFzdCAtIGZpcnN0ID4gMCkgeworCQkJCQlzb3VyY2UgPSByZWFsbG9jKHNvdXJjZSwKKwkJCQkJCQkoY291bnQgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoY2hhciAqKSk7CisJCQkJCWRlc3RpbmF0aW9uID0gcmVhbGxvYyhkZXN0aW5hdGlvbiwKKwkJCQkJCQkoY291bnQgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoY2hhciAqKSk7CisJCQkJCW1vZGVzID0gcmVhbGxvYyhtb2RlcywKKwkJCQkJCQkoY291bnQgKyBsYXN0IC0gZmlyc3QpCisJCQkJCQkJKiBzaXplb2YoZW51bSB1cGRhdGVfbW9kZSkpOworCQkJCX0KKworCQkJCWRlc3RfZGlyID0gYWRkX3NsYXNoKGRlc3RfZGlyKTsKKworCQkJCWZvciAoaiA9IDA7IGogPCBsYXN0IC0gZmlyc3Q7IGorKykgeworCQkJCQljb25zdCBjaGFyICpwYXRoID0KKwkJCQkJCWFjdGl2ZV9jYWNoZVtmaXJzdCArIGpdLT5uYW1lOworCQkJCQlzb3VyY2VbY291bnQgKyBqXSA9IHBhdGg7CisJCQkJCWRlc3RpbmF0aW9uW2NvdW50ICsgal0gPQorCQkJCQkJcHJlZml4X3BhdGgoZGVzdF9kaXIsIGRzdF9sZW4sCisJCQkJCQkJcGF0aCArIGxlbik7CisJCQkJCW1vZGVzW2NvdW50ICsgal0gPSBJTkRFWDsKKwkJCQl9CisJCQkJY291bnQgKz0gbGFzdCAtIGZpcnN0OworCQkJfQorCisJCQlnb3RvIG5leHQ7CisJCX0KKworCQlpZiAoIWJhZCAmJiBsc3RhdChkZXN0aW5hdGlvbltpXSwgJnN0KSA9PSAwKSB7CisJCQliYWQgPSAiZGVzdGluYXRpb24gZXhpc3RzIjsKKwkJCWlmIChmb3JjZSkgeworCQkJCS8qCisJCQkJICogb25seSBmaWxlcyBjYW4gb3ZlcndyaXRlIGVhY2ggb3RoZXI6CisJCQkJICogY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCisJCQkJICovCisJCQkJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiAlczsiCisJCQkJCQkJIiB3aWxsIG92ZXJ3cml0ZSFcbiIsCisJCQkJCQkJYmFkKTsKKwkJCQkJYmFkID0gTlVMTDsKKwkJCQkJcGF0aF9saXN0X2luc2VydChkZXN0aW5hdGlvbltpXSwKKwkJCQkJCQkmb3ZlcndyaXR0ZW4pOworCQkJCX0gZWxzZQorCQkJCQliYWQgPSAiQ2Fubm90IG92ZXJ3cml0ZSI7CisJCQl9CisJCX0KKworCQlpZiAoIWJhZCAmJgorCQkgICAgIXN0cm5jbXAoZGVzdGluYXRpb25baV0sIHNvdXJjZVtpXSwgc3RybGVuKHNvdXJjZVtpXSkpKQorCQkJYmFkID0gImNhbiBub3QgbW92ZSBkaXJlY3RvcnkgaW50byBpdHNlbGYiOworCisJCWlmICghYmFkICYmIGNhY2hlX25hbWVfcG9zKHNvdXJjZVtpXSwgc3RybGVuKHNvdXJjZVtpXSkpIDwgMCkKKwkJCWJhZCA9ICJub3QgdW5kZXIgdmVyc2lvbiBjb250cm9sIjsKKworCQlpZiAoIWJhZCkgeworCQkJaWYgKHBhdGhfbGlzdF9oYXNfcGF0aCgmc3JjX2Zvcl9kc3QsIGRlc3RpbmF0aW9uW2ldKSkKKwkJCQliYWQgPSAibXVsdGlwbGUgc291cmNlcyBmb3IgdGhlIHNhbWUgdGFyZ2V0IjsKKwkJCWVsc2UKKwkJCQlwYXRoX2xpc3RfaW5zZXJ0KGRlc3RpbmF0aW9uW2ldLCAmc3JjX2Zvcl9kc3QpOworCQl9CisKK25leHQ6CisJCWlmIChiYWQpIHsKKwkJCWlmIChpZ25vcmVfZXJyb3JzKSB7CisJCQkJaWYgKC0tY291bnQgPiAwKSB7CisJCQkJCW1lbW1vdmUoc291cmNlICsgaSwgc291cmNlICsgaSArIDEsCisJCQkJCQkoY291bnQgLSBpKSAqIHNpemVvZihjaGFyICopKTsKKwkJCQkJbWVtbW92ZShkZXN0aW5hdGlvbiArIGksCisJCQkJCQlkZXN0aW5hdGlvbiArIGkgKyAxLAorCQkJCQkJKGNvdW50IC0gaSkgKiBzaXplb2YoY2hhciAqKSk7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZGllICgiJXMsIHNvdXJjZT0lcywgZGVzdGluYXRpb249JXMiLAorCQkJCSAgICAgYmFkLCBzb3VyY2VbaV0sIGRlc3RpbmF0aW9uW2ldKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWlmIChzaG93X29ubHkgfHwgdmVyYm9zZSkKKwkJCXByaW50ZigiUmVuYW1pbmcgJXMgdG8gJXNcbiIsCisJCQkgICAgICAgc291cmNlW2ldLCBkZXN0aW5hdGlvbltpXSk7CisJCWlmICghc2hvd19vbmx5ICYmIG1vZGVzW2ldICE9IElOREVYICYmCisJCSAgICByZW5hbWUoc291cmNlW2ldLCBkZXN0aW5hdGlvbltpXSkgPCAwICYmCisJCSAgICAhaWdub3JlX2Vycm9ycykKKwkJCWRpZSAoInJlbmFtaW5nICVzIGZhaWxlZDogJXMiLAorCQkJICAgICBzb3VyY2VbaV0sIHN0cmVycm9yKGVycm5vKSk7CisKKwkJaWYgKG1vZGVzW2ldID09IFdPUktJTkdfRElSRUNUT1JZKQorCQkJY29udGludWU7CisKKwkJaWYgKGNhY2hlX25hbWVfcG9zKHNvdXJjZVtpXSwgc3RybGVuKHNvdXJjZVtpXSkpID49IDApIHsKKwkJCXBhdGhfbGlzdF9pbnNlcnQoc291cmNlW2ldLCAmZGVsZXRlZCk7CisKKwkJCS8qIGRlc3RpbmF0aW9uIGNhbiBiZSBhIGRpcmVjdG9yeSB3aXRoIDEgZmlsZSBpbnNpZGUgKi8KKwkJCWlmIChwYXRoX2xpc3RfaGFzX3BhdGgoJm92ZXJ3cml0dGVuLCBkZXN0aW5hdGlvbltpXSkpCisJCQkJcGF0aF9saXN0X2luc2VydChkZXN0aW5hdGlvbltpXSwgJmNoYW5nZWQpOworCQkJZWxzZQorCQkJCXBhdGhfbGlzdF9pbnNlcnQoZGVzdGluYXRpb25baV0sICZhZGRlZCk7CisJCX0gZWxzZQorCQkJcGF0aF9saXN0X2luc2VydChkZXN0aW5hdGlvbltpXSwgJmFkZGVkKTsKKwl9CisKKyAgICAgICAgaWYgKHNob3dfb25seSkgeworCQlzaG93X2xpc3QoIkNoYW5nZWQgIDogIiwgJmNoYW5nZWQpOworCQlzaG93X2xpc3QoIkFkZGluZyAgIDogIiwgJmFkZGVkKTsKKwkJc2hvd19saXN0KCJEZWxldGluZyA6ICIsICZkZWxldGVkKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY2hhbmdlZC5ucjsgaSsrKSB7CisJCQljb25zdCBjaGFyICpwYXRoID0gY2hhbmdlZC5pdGVtc1tpXS5wYXRoOworCQkJaW50IGkgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBzdHJsZW4ocGF0aCkpOworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKworCQkJaWYgKGkgPCAwKQorCQkJCWRpZSAoIkh1aD8gQ2FjaGUgZW50cnkgZm9yICVzIHVua25vd24/IiwgcGF0aCk7CisJCQlyZWZyZXNoX2NhY2hlX2VudHJ5KGNlLCAwKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBhZGRlZC5ucjsgaSsrKSB7CisJCQljb25zdCBjaGFyICpwYXRoID0gYWRkZWQuaXRlbXNbaV0ucGF0aDsKKwkJCWFkZF9maWxlX3RvX2luZGV4KHBhdGgsIHZlcmJvc2UpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGRlbGV0ZWQubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGRlbGV0ZWQuaXRlbXNbaV0ucGF0aDsKKwkJCXJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aCk7CisJCX0KKworCQlpZiAoYWN0aXZlX2NhY2hlX2NoYW5nZWQpIHsKKwkJCWlmICh3cml0ZV9jYWNoZShuZXdmZCwgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpIHx8CisJCQkgICAgY2xvc2UobmV3ZmQpIHx8CisJCQkgICAgY29tbWl0X2xvY2tfZmlsZSgmbG9ja19maWxlKSkKKwkJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXBydW5lLXBhY2tlZC5jIGIvYnVpbHRpbi1wcnVuZS1wYWNrZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RkOTRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wcnVuZS1wYWNrZWQuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHBydW5lX3BhY2tlZF91c2FnZVtdID0KKyJnaXQtcHJ1bmUtcGFja2VkIFstbl0iOworCitzdGF0aWMgaW50IGRyeXJ1bjsKKworc3RhdGljIHZvaWQgcHJ1bmVfZGlyKGludCBpLCBESVIgKmRpciwgY2hhciAqcGF0aG5hbWUsIGludCBsZW4pCit7CisJc3RydWN0IGRpcmVudCAqZGU7CisJY2hhciBoZXhbNDBdOworCisJc3ByaW50ZihoZXgsICIlMDJ4IiwgaSk7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlpZiAoc3RybGVuKGRlLT5kX25hbWUpICE9IDM4KQorCQkJY29udGludWU7CisJCW1lbWNweShoZXgrMiwgZGUtPmRfbmFtZSwgMzgpOworCQlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFoYXNfc2hhMV9wYWNrKHNoYTEpKQorCQkJY29udGludWU7CisJCW1lbWNweShwYXRobmFtZSArIGxlbiwgZGUtPmRfbmFtZSwgMzgpOworCQlpZiAoZHJ5cnVuKQorCQkJcHJpbnRmKCJybSAtZiAlc1xuIiwgcGF0aG5hbWUpOworCQllbHNlIGlmICh1bmxpbmsocGF0aG5hbWUpIDwgMCkKKwkJCWVycm9yKCJ1bmFibGUgdG8gdW5saW5rICVzIiwgcGF0aG5hbWUpOworCX0KKwlwYXRobmFtZVtsZW5dID0gMDsKKwlybWRpcihwYXRobmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBydW5lX3BhY2tlZF9vYmplY3RzKHZvaWQpCit7CisJaW50IGk7CisJc3RhdGljIGNoYXIgcGF0aG5hbWVbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKmRpciA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJaW50IGxlbiA9IHN0cmxlbihkaXIpOworCisJaWYgKGxlbiA+IFBBVEhfTUFYIC0gNDIpCisJCWRpZSgiaW1wb3NzaWJsZSBvYmplY3QgZGlyZWN0b3J5Iik7CisJbWVtY3B5KHBhdGhuYW1lLCBkaXIsIGxlbik7CisJaWYgKGxlbiAmJiBwYXRobmFtZVtsZW4tMV0gIT0gJy8nKQorCQlwYXRobmFtZVtsZW4rK10gPSAnLyc7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCURJUiAqZDsKKworCQlzcHJpbnRmKHBhdGhuYW1lICsgbGVuLCAiJTAyeC8iLCBpKTsKKwkJZCA9IG9wZW5kaXIocGF0aG5hbWUpOworCQlpZiAoIWQpCisJCQljb250aW51ZTsKKwkJcHJ1bmVfZGlyKGksIGQsIHBhdGhuYW1lLCBsZW4gKyAzKTsKKwkJY2xvc2VkaXIoZCk7CisJfQorfQorCitpbnQgY21kX3BydW5lX3BhY2tlZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi1uIikpCisJCQkJZHJ5cnVuID0gMTsKKwkJCWVsc2UKKwkJCQl1c2FnZShwcnVuZV9wYWNrZWRfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJLyogSGFuZGxlIGFyZ3VtZW50cyBoZXJlIC4uICovCisJCXVzYWdlKHBydW5lX3BhY2tlZF91c2FnZSk7CisJfQorCXN5bmMoKTsKKwlwcnVuZV9wYWNrZWRfb2JqZWN0cygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1wcnVuZS5jIGIvYnVpbHRpbi1wcnVuZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZWM3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXBydW5lLmMKQEAgLTAsMCArMSwyNTkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS10cmVlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHBydW5lX3VzYWdlW10gPSAiZ2l0LXBydW5lIFstbl0iOworc3RhdGljIGludCBzaG93X29ubHkgPSAwOworc3RhdGljIHN0cnVjdCByZXZfaW5mbyByZXZzOworCitzdGF0aWMgaW50IHBydW5lX29iamVjdChjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoc2hvd19vbmx5KSB7CisJCXByaW50Zigid291bGQgcHJ1bmUgJXMvJXNcbiIsIHBhdGgsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCXVubGluayhta3BhdGgoIiVzLyVzIiwgcGF0aCwgZmlsZW5hbWUpKTsKKwlybWRpcihwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcnVuZV9kaXIoaW50IGksIGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIpCisJCXJldHVybiAwOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyIG5hbWVbMTAwXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJaW50IGxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKworCQlzd2l0Y2ggKGxlbikgeworCQljYXNlIDI6CisJCQlpZiAoZGUtPmRfbmFtZVsxXSAhPSAnLicpCisJCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJykKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlIDM4OgorCQkJc3ByaW50ZihuYW1lLCAiJTAyeCIsIGkpOworCQkJbWVtY3B5KG5hbWUrMiwgZGUtPmRfbmFtZSwgbGVuKzEpOworCQkJaWYgKGdldF9zaGExX2hleChuYW1lLCBzaGExKSA8IDApCisJCQkJYnJlYWs7CisKKwkJCS8qCisJCQkgKiBEbyB3ZSBrbm93IGFib3V0IHRoaXMgb2JqZWN0PworCQkJICogSXQgbXVzdCBoYXZlIGJlZW4gcmVhY2hhYmxlCisJCQkgKi8KKwkJCWlmIChsb29rdXBfb2JqZWN0KHNoYTEpKQorCQkJCWNvbnRpbnVlOworCisJCQlwcnVuZV9vYmplY3QocGF0aCwgZGUtPmRfbmFtZSwgc2hhMSk7CisJCQljb250aW51ZTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBzaGExIGZpbGU6ICVzLyVzXG4iLCBwYXRoLCBkZS0+ZF9uYW1lKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJ1bmVfb2JqZWN0X2Rpcihjb25zdCBjaGFyICpwYXRoKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlzdGF0aWMgY2hhciBkaXJbNDA5Nl07CisJCXNwcmludGYoZGlyLCAiJXMvJTAyeCIsIHBhdGgsIGkpOworCQlwcnVuZV9kaXIoaSwgZGlyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfYmxvYihzdHJ1Y3QgYmxvYiAqYmxvYiwKKwkJCSBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmYmxvYi0+b2JqZWN0OworCisJaWYgKG9iai0+ZmxhZ3MgJiBTRUVOKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBTRUVOOworCS8qIE5vdGhpbmcgdG8gZG8sIHJlYWxseSAuLiBUaGUgYmxvYiBsb29rdXAgd2FzIHRoZSBpbXBvcnRhbnQgcGFydCAqLworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsCisJCQkgc3RydWN0IG9iamVjdF9hcnJheSAqcCwKKwkJCSBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gJnRyZWUtPm9iamVjdDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJc3RydWN0IG5hbWVfcGF0aCBtZTsKKworCWlmIChvYmotPmZsYWdzICYgU0VFTikKKwkJcmV0dXJuOworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwlpZiAocGFyc2VfdHJlZSh0cmVlKSA8IDApCisJCWRpZSgiYmFkIHRyZWUgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJbmFtZSA9IHN0cmR1cChuYW1lKTsKKwlhZGRfb2JqZWN0KG9iaiwgcCwgcGF0aCwgbmFtZSk7CisJbWUudXAgPSBwYXRoOworCW1lLmVsZW0gPSBuYW1lOworCW1lLmVsZW1fbGVuID0gc3RybGVuKG5hbWUpOworCisJZGVzYy5idWYgPSB0cmVlLT5idWZmZXI7CisJZGVzYy5zaXplID0gdHJlZS0+c2l6ZTsKKworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJcHJvY2Vzc190cmVlKGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLCBwLCAmbWUsIGVudHJ5LnBhdGgpOworCQllbHNlCisJCQlwcm9jZXNzX2Jsb2IobG9va3VwX2Jsb2IoZW50cnkuc2hhMSksIHAsICZtZSwgZW50cnkucGF0aCk7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3RhZyhzdHJ1Y3QgdGFnICp0YWcsIHN0cnVjdCBvYmplY3RfYXJyYXkgKnAsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gJnRhZy0+b2JqZWN0OworCXN0cnVjdCBuYW1lX3BhdGggbWU7CisKKwlpZiAob2JqLT5mbGFncyAmIFNFRU4pCisJCXJldHVybjsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisKKwltZS51cCA9IE5VTEw7CisJbWUuZWxlbSA9ICJ0YWc6LyI7CisJbWUuZWxlbV9sZW4gPSA1OworCisJaWYgKHBhcnNlX3RhZyh0YWcpIDwgMCkKKwkJZGllKCJiYWQgdGFnIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCWFkZF9vYmplY3QodGFnLT50YWdnZWQsIHAsIE5VTEwsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZCB3YWxrX2NvbW1pdF9saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9iamVjdF9hcnJheSBvYmplY3RzID0geyAwLCAwLCBOVUxMIH07CisKKwkvKiBXYWxrIGFsbCBjb21taXRzLCBwcm9jZXNzIHRoZWlyIHRyZWVzICovCisJd2hpbGUgKChjb21taXQgPSBnZXRfcmV2aXNpb24ocmV2cykpICE9IE5VTEwpCisJCXByb2Nlc3NfdHJlZShjb21taXQtPnRyZWUsICZvYmplY3RzLCBOVUxMLCAiIik7CisKKwkvKiBUaGVuIHdhbGsgYWxsIHRoZSBwZW5kaW5nIG9iamVjdHMsIHJlY3Vyc2l2ZWx5IHByb2Nlc3NpbmcgdGhlbSB0b28gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmV2cy0+cGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKnBlbmRpbmcgPSByZXZzLT5wZW5kaW5nLm9iamVjdHMgKyBpOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwZW5kaW5nLT5pdGVtOworCQljb25zdCBjaGFyICpuYW1lID0gcGVuZGluZy0+bmFtZTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCQlwcm9jZXNzX3RhZygoc3RydWN0IHRhZyAqKSBvYmosICZvYmplY3RzLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJCXByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmosICZvYmplY3RzLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCXByb2Nlc3NfYmxvYigoc3RydWN0IGJsb2IgKilvYmosICZvYmplY3RzLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgidW5rbm93biBwZW5kaW5nIG9iamVjdCAlcyAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgbmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IGFkZF9vbmVfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCWlmICghb2JqZWN0KQorCQlkaWUoImJhZCBvYmplY3QgcmVmOiAlczolcyIsIHBhdGgsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlhZGRfcGVuZGluZ19vYmplY3QoJnJldnMsIG9iamVjdCwgIiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfb25lX3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgdHJlZSAqdHJlZSA9IGxvb2t1cF90cmVlKHNoYTEpOworCWFkZF9wZW5kaW5nX29iamVjdCgmcmV2cywgJnRyZWUtPm9iamVjdCwgIiIpOworfQorCitzdGF0aWMgdm9pZCBhZGRfY2FjaGVfdHJlZShzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQpCit7CisJaW50IGk7CisKKwlpZiAoaXQtPmVudHJ5X2NvdW50ID49IDApCisJCWFkZF9vbmVfdHJlZShpdC0+c2hhMSk7CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspCisJCWFkZF9jYWNoZV90cmVlKGl0LT5kb3duW2ldLT5jYWNoZV90cmVlKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2NhY2hlX3JlZnModm9pZCkKK3sKKwlpbnQgaTsKKworCXJlYWRfY2FjaGUoKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJbG9va3VwX2Jsb2IoYWN0aXZlX2NhY2hlW2ldLT5zaGExKTsKKwkJLyoKKwkJICogV2UgY291bGQgYWRkIHRoZSBibG9icyB0byB0aGUgcGVuZGluZyBsaXN0LCBidXQgcXVpdGUKKwkJICogZnJhbmtseSwgd2UgZG9uJ3QgY2FyZS4gT25jZSB3ZSd2ZSBsb29rZWQgdGhlbSB1cCwgYW5kCisJCSAqIGFkZGVkIHRoZW0gYXMgb2JqZWN0cywgd2UndmUgcmVhbGx5IGRvbmUgZXZlcnl0aGluZworCQkgKiB0aGVyZSBpcyB0byBkbyBmb3IgYSBibG9iCisJCSAqLworCX0KKwlpZiAoYWN0aXZlX2NhY2hlX3RyZWUpCisJCWFkZF9jYWNoZV90cmVlKGFjdGl2ZV9jYWNoZV90cmVlKTsKK30KKworaW50IGNtZF9wcnVuZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJc2hvd19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXVzYWdlKHBydW5lX3VzYWdlKTsKKwl9CisKKwkvKgorCSAqIFNldCB1cCByZXZpc2lvbiBwYXJzaW5nLCBhbmQgbWFyayB1cyBhcyBiZWluZyBpbnRlcmVzdGVkCisJICogaW4gYWxsIG9iamVjdCB0eXBlcywgbm90IGp1c3QgY29tbWl0cy4KKwkgKi8KKwlpbml0X3JldmlzaW9ucygmcmV2cywgcHJlZml4KTsKKwlyZXZzLnRhZ19vYmplY3RzID0gMTsKKwlyZXZzLmJsb2Jfb2JqZWN0cyA9IDE7CisJcmV2cy50cmVlX29iamVjdHMgPSAxOworCisJLyogQWRkIGFsbCBleHRlcm5hbCByZWZzICovCisJZm9yX2VhY2hfcmVmKGFkZF9vbmVfcmVmKTsKKworCS8qIEFkZCBhbGwgcmVmcyBmcm9tIHRoZSBpbmRleCBmaWxlICovCisJYWRkX2NhY2hlX3JlZnMoKTsKKworCS8qCisJICogU2V0IHVwIHRoZSByZXZpc2lvbiB3YWxrIC0gdGhpcyB3aWxsIG1vdmUgYWxsIGNvbW1pdHMKKwkgKiBmcm9tIHRoZSBwZW5kaW5nIGxpc3QgdG8gdGhlIGNvbW1pdCB3YWxraW5nIGxpc3QuCisJICovCisJcHJlcGFyZV9yZXZpc2lvbl93YWxrKCZyZXZzKTsKKworCXdhbGtfY29tbWl0X2xpc3QoJnJldnMpOworCisJcHJ1bmVfb2JqZWN0X2RpcihnZXRfb2JqZWN0X2RpcmVjdG9yeSgpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1wdXNoLmMgYi9idWlsdGluLXB1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JjMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1wdXNoLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiAiZ2l0IHB1c2giCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworI2RlZmluZSBNQVhfVVJJICgxNikKKworc3RhdGljIGNvbnN0IGNoYXIgcHVzaF91c2FnZVtdID0gImdpdC1wdXNoIFstLWFsbF0gWy0tdGFnc10gWy1mIHwgLS1mb3JjZV0gPHJlcG9zaXRvcnk+IFs8cmVmc3BlYz4uLi5dIjsKKworc3RhdGljIGludCBhbGwgPSAwLCB0YWdzID0gMCwgZm9yY2UgPSAwLCB0aGluID0gMTsKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjdXRlID0gTlVMTDsKKworI2RlZmluZSBCVUZfU0laRSAoMjA4NCkKK3N0YXRpYyBjaGFyIGJ1ZmZlcltCVUZfU0laRV07CisKK3N0YXRpYyBjb25zdCBjaGFyICoqcmVmc3BlYyA9IE5VTEw7CitzdGF0aWMgaW50IHJlZnNwZWNfbnIgPSAwOworCitzdGF0aWMgdm9pZCBhZGRfcmVmc3BlYyhjb25zdCBjaGFyICpyZWYpCit7CisJaW50IG5yID0gcmVmc3BlY19uciArIDE7CisJcmVmc3BlYyA9IHhyZWFsbG9jKHJlZnNwZWMsIG5yICogc2l6ZW9mKGNoYXIgKikpOworCXJlZnNwZWNbbnItMV0gPSByZWY7CisJcmVmc3BlY19uciA9IG5yOworfQorCitzdGF0aWMgaW50IGV4cGFuZF9vbmVfcmVmKGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwkvKiBJZ25vcmUgdGhlICJyZWZzLyIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmbmFtZSAqLworCXJlZiArPSA1OworCisJaWYgKHN0cm5jbXAocmVmLCAidGFncy8iLCA1KSkKKwkJcmV0dXJuIDA7CisKKwlhZGRfcmVmc3BlYyhzdHJkdXAocmVmKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4cGFuZF9yZWZzcGVjcyh2b2lkKQoreworCWlmIChhbGwpIHsKKwkJaWYgKHJlZnNwZWNfbnIpCisJCQlkaWUoImNhbm5vdCBtaXggJy0tYWxsJyBhbmQgYSByZWZzcGVjIik7CisKKwkJLyoKKwkJICogTm8gbmVlZCB0byBleHBhbmQgIi0tYWxsIiAtIHdlJ2xsIGp1c3QgdXNlCisJCSAqIHRoZSAiLS1hbGwiIGZsYWcgdG8gc2VuZC1wYWNrCisJCSAqLworCQlyZXR1cm47CisJfQorCWlmICghdGFncykKKwkJcmV0dXJuOworCWZvcl9lYWNoX3JlZihleHBhbmRfb25lX3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9yZWZzcGVjcyhjb25zdCBjaGFyICoqcmVmcywgaW50IG5yKQoreworCWlmIChucikgeworCQlzaXplX3QgYnl0ZXMgPSBuciAqIHNpemVvZihjaGFyICopOworCisJCXJlZnNwZWMgPSB4cmVhbGxvYyhyZWZzcGVjLCBieXRlcyk7CisJCW1lbWNweShyZWZzcGVjLCByZWZzLCBieXRlcyk7CisJCXJlZnNwZWNfbnIgPSBucjsKKwl9CisJZXhwYW5kX3JlZnNwZWNzKCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlbW90ZXNfdXJpKGNvbnN0IGNoYXIgKnJlcG8sIGNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXSkKK3sKKwlpbnQgbiA9IDA7CisJRklMRSAqZiA9IGZvcGVuKGdpdF9wYXRoKCJyZW1vdGVzLyVzIiwgcmVwbyksICJyIik7CisJaW50IGhhc19leHBsaWNpdF9yZWZzcGVjID0gcmVmc3BlY19uciB8fCBhbGwgfHwgdGFnczsKKworCWlmICghZikKKwkJcmV0dXJuIC0xOworCXdoaWxlIChmZ2V0cyhidWZmZXIsIEJVRl9TSVpFLCBmKSkgeworCQlpbnQgaXNfcmVmc3BlYzsKKwkJY2hhciAqcywgKnA7CisKKwkJaWYgKCFzdHJuY21wKCJVUkw6ICIsIGJ1ZmZlciwgNSkpIHsKKwkJCWlzX3JlZnNwZWMgPSAwOworCQkJcyA9IGJ1ZmZlciArIDU7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAoIlB1c2g6ICIsIGJ1ZmZlciwgNikpIHsKKwkJCWlzX3JlZnNwZWMgPSAxOworCQkJcyA9IGJ1ZmZlciArIDY7CisJCX0gZWxzZQorCQkJY29udGludWU7CisKKwkJLyogUmVtb3ZlIHdoaXRlc3BhY2UgYXQgdGhlIGhlYWQuLiAqLworCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQlzKys7CisJCWlmICghKnMpCisJCQljb250aW51ZTsKKworCQkvKiAuLmFuZCBhdCB0aGUgZW5kICovCisJCXAgPSBzICsgc3RybGVuKHMpOworCQl3aGlsZSAoaXNzcGFjZShwWy0xXSkpCisJCQkqLS1wID0gMDsKKworCQlpZiAoIWlzX3JlZnNwZWMpIHsKKwkJCWlmIChuIDwgTUFYX1VSSSkKKwkJCQl1cmlbbisrXSA9IHN0cmR1cChzKTsKKwkJCWVsc2UKKwkJCQllcnJvcigibW9yZSB0aGFuICVkIFVSTCdzIHNwZWNpZmllZCwgaWdub3JpbmcgdGhlIHJlc3QiLCBNQVhfVVJJKTsKKwkJfQorCQllbHNlIGlmIChpc19yZWZzcGVjICYmICFoYXNfZXhwbGljaXRfcmVmc3BlYykKKwkJCWFkZF9yZWZzcGVjKHN0cmR1cChzKSk7CisJfQorCWZjbG9zZShmKTsKKwlpZiAoIW4pCisJCWRpZSgicmVtb3RlICclcycgaGFzIG5vIFVSTCIsIHJlcG8pOworCXJldHVybiBuOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqKmNvbmZpZ191cmk7CitzdGF0aWMgY29uc3QgY2hhciAqY29uZmlnX3JlcG87CitzdGF0aWMgaW50IGNvbmZpZ19yZXBvX2xlbjsKK3N0YXRpYyBpbnQgY29uZmlnX2N1cnJlbnRfdXJpOworc3RhdGljIGludCBjb25maWdfZ2V0X3JlZnNwZWNzOworCitzdGF0aWMgaW50IGdldF9yZW1vdGVfY29uZmlnKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJaWYgKCFzdHJuY21wKGtleSwgInJlbW90ZS4iLCA3KSAmJgorCSAgICAhc3RybmNtcChrZXkgKyA3LCBjb25maWdfcmVwbywgY29uZmlnX3JlcG9fbGVuKSkgeworCQlpZiAoIXN0cmNtcChrZXkgKyA3ICsgY29uZmlnX3JlcG9fbGVuLCAiLnVybCIpKSB7CisJCQlpZiAoY29uZmlnX2N1cnJlbnRfdXJpIDwgTUFYX1VSSSkKKwkJCQljb25maWdfdXJpW2NvbmZpZ19jdXJyZW50X3VyaSsrXSA9IHN0cmR1cCh2YWx1ZSk7CisJCQllbHNlCisJCQkJZXJyb3IoIm1vcmUgdGhhbiAlZCBVUkwncyBzcGVjaWZpZWQsIGlnbm9yaW5nIHRoZSByZXN0IiwgTUFYX1VSSSk7CisJCX0KKwkJZWxzZSBpZiAoY29uZmlnX2dldF9yZWZzcGVjcyAmJgorCQkJICFzdHJjbXAoa2V5ICsgNyArIGNvbmZpZ19yZXBvX2xlbiwgIi5wdXNoIikpCisJCQlhZGRfcmVmc3BlYyhzdHJkdXAodmFsdWUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbmZpZ19yZW1vdGVzX3VyaShjb25zdCBjaGFyICpyZXBvLCBjb25zdCBjaGFyICp1cmlbTUFYX1VSSV0pCit7CisJY29uZmlnX3JlcG9fbGVuID0gc3RybGVuKHJlcG8pOworCWNvbmZpZ19yZXBvID0gcmVwbzsKKwljb25maWdfY3VycmVudF91cmkgPSAwOworCWNvbmZpZ191cmkgPSB1cmk7CisJY29uZmlnX2dldF9yZWZzcGVjcyA9ICEocmVmc3BlY19uciB8fCBhbGwgfHwgdGFncyk7CisKKwlnaXRfY29uZmlnKGdldF9yZW1vdGVfY29uZmlnKTsKKwlyZXR1cm4gY29uZmlnX2N1cnJlbnRfdXJpOworfQorCitzdGF0aWMgaW50IGdldF9icmFuY2hlc191cmkoY29uc3QgY2hhciAqcmVwbywgY29uc3QgY2hhciAqdXJpW01BWF9VUkldKQoreworCWNvbnN0IGNoYXIgKnNsYXNoID0gc3RyY2hyKHJlcG8sICcvJyk7CisJaW50IG4gPSBzbGFzaCA/IHNsYXNoIC0gcmVwbyA6IDEwMDA7CisJRklMRSAqZiA9IGZvcGVuKGdpdF9wYXRoKCJicmFuY2hlcy8lLipzIiwgbiwgcmVwbyksICJyIik7CisJY2hhciAqcywgKnA7CisJaW50IGxlbjsKKworCWlmICghZikKKwkJcmV0dXJuIDA7CisJcyA9IGZnZXRzKGJ1ZmZlciwgQlVGX1NJWkUsIGYpOworCWZjbG9zZShmKTsKKwlpZiAoIXMpCisJCXJldHVybiAwOworCXdoaWxlIChpc3NwYWNlKCpzKSkKKwkJcysrOworCWlmICghKnMpCisJCXJldHVybiAwOworCXAgPSBzICsgc3RybGVuKHMpOworCXdoaWxlIChpc3NwYWNlKHBbLTFdKSkKKwkJKi0tcCA9IDA7CisJbGVuID0gcCAtIHM7CisJaWYgKHNsYXNoKQorCQlsZW4gKz0gc3RybGVuKHNsYXNoKTsKKwlwID0geG1hbGxvYyhsZW4gKyAxKTsKKwlzdHJjcHkocCwgcyk7CisJaWYgKHNsYXNoKQorCQlzdHJjYXQocCwgc2xhc2gpOworCXVyaVswXSA9IHA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkIHJlbW90ZXMgYW5kIGJyYW5jaGVzIGZpbGUsIGZpbGwgdGhlIHB1c2ggdGFyZ2V0IFVSSQorICogbGlzdC4gIElmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSByZWZzcGVjcywgcmVhZCBQdXNoOiBsaW5lcworICogdG8gc2V0IHVwIHRoZSAqcmVmc3BlYyBsaXN0IGFzIHdlbGwuCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBwdXNoIHRhcmdldCBVUklzCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9jb25maWcoY29uc3QgY2hhciAqcmVwbywgY29uc3QgY2hhciAqdXJpW01BWF9VUkldKQoreworCWludCBuOworCisJaWYgKCpyZXBvICE9ICcvJykgeworCQluID0gZ2V0X3JlbW90ZXNfdXJpKHJlcG8sIHVyaSk7CisJCWlmIChuID4gMCkKKwkJCXJldHVybiBuOworCisJCW4gPSBnZXRfY29uZmlnX3JlbW90ZXNfdXJpKHJlcG8sIHVyaSk7CisJCWlmIChuID4gMCkKKwkJCXJldHVybiBuOworCisJCW4gPSBnZXRfYnJhbmNoZXNfdXJpKHJlcG8sIHVyaSk7CisJCWlmIChuID4gMCkKKwkJCXJldHVybiBuOworCX0KKworCXVyaVswXSA9IHJlcG87CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZG9fcHVzaChjb25zdCBjaGFyICpyZXBvKQoreworCWNvbnN0IGNoYXIgKnVyaVtNQVhfVVJJXTsKKwlpbnQgaSwgbjsKKwlpbnQgY29tbW9uX2FyZ2M7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisJaW50IGFyZ2M7CisKKwluID0gcmVhZF9jb25maWcocmVwbywgdXJpKTsKKwlpZiAobiA8PSAwKQorCQlkaWUoImJhZCByZXBvc2l0b3J5ICclcyciLCByZXBvKTsKKworCWFyZ3YgPSB4bWFsbG9jKChyZWZzcGVjX25yICsgMTApICogc2l6ZW9mKGNoYXIgKikpOworCWFyZ3ZbMF0gPSAiZHVtbXktc2VuZC1wYWNrIjsKKwlhcmdjID0gMTsKKwlpZiAoYWxsKQorCQlhcmd2W2FyZ2MrK10gPSAiLS1hbGwiOworCWlmIChmb3JjZSkKKwkJYXJndlthcmdjKytdID0gIi0tZm9yY2UiOworCWlmIChleGVjdXRlKQorCQlhcmd2W2FyZ2MrK10gPSBleGVjdXRlOworCWNvbW1vbl9hcmdjID0gYXJnYzsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaW50IGVycm9yOworCQlpbnQgZGVzdF9hcmdjID0gY29tbW9uX2FyZ2M7CisJCWludCBkZXN0X3JlZnNwZWNfbnIgPSByZWZzcGVjX25yOworCQljb25zdCBjaGFyICoqZGVzdF9yZWZzcGVjID0gcmVmc3BlYzsKKwkJY29uc3QgY2hhciAqZGVzdCA9IHVyaVtpXTsKKwkJY29uc3QgY2hhciAqc2VuZGVyID0gImdpdC1zZW5kLXBhY2siOworCQlpZiAoIXN0cm5jbXAoZGVzdCwgImh0dHA6Ly8iLCA3KSB8fAorCQkgICAgIXN0cm5jbXAoZGVzdCwgImh0dHBzOi8vIiwgOCkpCisJCQlzZW5kZXIgPSAiZ2l0LWh0dHAtcHVzaCI7CisJCWVsc2UgaWYgKHRoaW4pCisJCQlhcmd2W2Rlc3RfYXJnYysrXSA9ICItLXRoaW4iOworCQlhcmd2WzBdID0gc2VuZGVyOworCQlhcmd2W2Rlc3RfYXJnYysrXSA9IGRlc3Q7CisJCXdoaWxlIChkZXN0X3JlZnNwZWNfbnItLSkKKwkJCWFyZ3ZbZGVzdF9hcmdjKytdID0gKmRlc3RfcmVmc3BlYysrOworCQlhcmd2W2Rlc3RfYXJnY10gPSBOVUxMOworCQllcnJvciA9IHJ1bl9jb21tYW5kX3YoYXJnYywgYXJndik7CisJCWlmICghZXJyb3IpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChlcnJvcikgeworCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfRk9SSzoKKwkJCWRpZSgidW5hYmxlIHRvIGZvcmsgZm9yICVzIiwgc2VuZGVyKTsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0VYRUM6CisJCQlkaWUoInVuYWJsZSB0byBleGVjICVzIiwgc2VuZGVyKTsKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSUQ6CisJCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDoKKwkJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfU0lHTkFMOgorCQljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQ6CisJCQlkaWUoIiVzIGRpZWQgd2l0aCBzdHJhbmdlIGVycm9yIiwgc2VuZGVyKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtZXJyb3I7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcHVzaChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpyZXBvID0gIm9yaWdpbiI7CS8qIGRlZmF1bHQgcmVwb3NpdG9yeSAqLworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmIChhcmdbMF0gIT0gJy0nKSB7CisJCQlyZXBvID0gYXJnOworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkgeworCQkJYWxsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKSB7CisJCQl0YWdzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tZm9yY2UiKSB8fCAhc3RyY21wKGFyZywgIi1mIikpIHsKKwkJCWZvcmNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGhpbiIpKSB7CisJCQl0aGluID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tbm8tdGhpbiIpKSB7CisJCQl0aGluID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RybmNtcChhcmcsICItLWV4ZWM9IiwgNykpIHsKKwkJCWV4ZWN1dGUgPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZShwdXNoX3VzYWdlKTsKKwl9CisJc2V0X3JlZnNwZWNzKGFyZ3YgKyBpLCBhcmdjIC0gaSk7CisJcmV0dXJuIGRvX3B1c2gocmVwbyk7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlYWQtdHJlZS5jIGIvYnVpbHRpbi1yZWFkLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWE3MDI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZWFkLXRyZWUuYwpAQCAtMCwwICsxLDEwMzkgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNkZWZpbmUgREJSVF9ERUJVRyAxCisKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGludCByZXNldCA9IDA7CitzdGF0aWMgaW50IG1lcmdlID0gMDsKK3N0YXRpYyBpbnQgdXBkYXRlID0gMDsKK3N0YXRpYyBpbnQgaW5kZXhfb25seSA9IDA7CitzdGF0aWMgaW50IG5vbnRyaXZpYWxfbWVyZ2UgPSAwOworc3RhdGljIGludCB0cml2aWFsX21lcmdlc19vbmx5ID0gMDsKK3N0YXRpYyBpbnQgYWdncmVzc2l2ZSA9IDA7CitzdGF0aWMgaW50IHZlcmJvc2VfdXBkYXRlID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcHJvZ3Jlc3NfdXBkYXRlID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpwcmVmaXggPSBOVUxMOworCitzdGF0aWMgaW50IGhlYWRfaWR4ID0gLTE7CitzdGF0aWMgaW50IG1lcmdlX3NpemUgPSAwOworCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICp0cmVlcyA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfZW50cnkgZGZfY29uZmxpY3RfZW50cnk7CisKK3N0cnVjdCB0cmVlX2VudHJ5X2xpc3QgeworCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKm5leHQ7CisJdW5zaWduZWQgZGlyZWN0b3J5IDogMTsKKwl1bnNpZ25lZCBleGVjdXRhYmxlIDogMTsKKwl1bnNpZ25lZCBzeW1saW5rIDogMTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7Cit9OworCitzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCBkZl9jb25mbGljdF9saXN0OworCit0eXBlZGVmIGludCAoKm1lcmdlX2ZuX3QpKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYyk7CisKK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpjcmVhdGVfdHJlZV9lbnRyeV9saXN0KHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBvbmU7CisJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICoqbGlzdF9wID0gJnJldDsKKworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJm9uZSkpIHsKKwkJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZW50cnk7CisKKwkJZW50cnkgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0KSk7CisJCWVudHJ5LT5uYW1lID0gb25lLnBhdGg7CisJCWVudHJ5LT5zaGExID0gb25lLnNoYTE7CisJCWVudHJ5LT5tb2RlID0gb25lLm1vZGU7CisJCWVudHJ5LT5kaXJlY3RvcnkgPSBTX0lTRElSKG9uZS5tb2RlKSAhPSAwOworCQllbnRyeS0+ZXhlY3V0YWJsZSA9IChvbmUubW9kZSAmIFNfSVhVU1IpICE9IDA7CisJCWVudHJ5LT5zeW1saW5rID0gU19JU0xOSyhvbmUubW9kZSkgIT0gMDsKKwkJZW50cnktPm5leHQgPSBOVUxMOworCisJCSpsaXN0X3AgPSBlbnRyeTsKKwkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVudGNtcChjb25zdCBjaGFyICpuYW1lMSwgaW50IGRpcjEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgZGlyMikKK3sKKwlpbnQgbGVuMSA9IHN0cmxlbihuYW1lMSk7CisJaW50IGxlbjIgPSBzdHJsZW4obmFtZTIpOworCWludCBsZW4gPSBsZW4xIDwgbGVuMiA/IGxlbjEgOiBsZW4yOworCWludCByZXQgPSBtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4pOworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJYzEgPSBuYW1lMVtsZW5dOworCWMyID0gbmFtZTJbbGVuXTsKKwlpZiAoIWMxICYmIGRpcjEpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgZGlyMikKKwkJYzIgPSAnLyc7CisJcmV0ID0gKGMxIDwgYzIpID8gLTEgOiAoYzEgPiBjMikgPyAxIDogMDsKKwlpZiAoYzEgJiYgYzIgJiYgIXJldCkKKwkJcmV0ID0gbGVuMSAtIGxlbjI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bnBhY2tfdHJlZXNfcmVjKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKipwb3NucywgaW50IGxlbiwKKwkJCSAgICBjb25zdCBjaGFyICpiYXNlLCBtZXJnZV9mbl90IGZuLCBpbnQgKmluZHBvcykKK3sKKwlpbnQgYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlpbnQgc3JjX3NpemUgPSBsZW4gKyAxOworCWRvIHsKKwkJaW50IGk7CisJCWNvbnN0IGNoYXIgKmZpcnN0OworCQlpbnQgZmlyc3RkaXIgPSAwOworCQlpbnQgcGF0aGxlbjsKKwkJdW5zaWduZWQgY2Vfc2l6ZTsKKwkJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqKnN1YnBvc25zOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmM7CisJCWludCBhbnlfZmlsZXMgPSAwOworCQlpbnQgYW55X2RpcnMgPSAwOworCQljaGFyICpjYWNoZV9uYW1lOworCQlpbnQgY2Vfc3RhZ2U7CisKKwkJLyogRmluZCB0aGUgZmlyc3QgbmFtZSBpbiB0aGUgaW5wdXQuICovCisKKwkJZmlyc3QgPSBOVUxMOworCQljYWNoZV9uYW1lID0gTlVMTDsKKworCQkvKiBDaGVjayB0aGUgY2FjaGUgKi8KKwkJaWYgKG1lcmdlICYmICppbmRwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCS8qIFRoaXMgaXMgYSBiaXQgdHJpY2t5OiAqLworCQkJLyogSWYgdGhlIGluZGV4IGhhcyBhIHN1YmRpcmVjdG9yeSAod2l0aAorCQkJICogY29udGVudHMpIGFzIHRoZSBmaXJzdCBuYW1lLCBpdCdsbCBnZXQgYQorCQkJICogZmlsZW5hbWUgbGlrZSAiZm9vL2JhciIuIEJ1dCB0aGF0J3MgYWZ0ZXIKKwkJCSAqICJmb28iLCBzbyB0aGUgZW50cnkgaW4gdHJlZXMgd2lsbCBnZXQKKwkJCSAqIGhhbmRsZWQgZmlyc3QsIGF0IHdoaWNoIHBvaW50IHdlJ2xsIGdvIGludG8KKwkJCSAqICJmb28iLCBhbmQgZGVhbCB3aXRoICJiYXIiIGZyb20gdGhlIGluZGV4LAorCQkJICogYmVjYXVzZSB0aGUgYmFzZSB3aWxsIGJlICJmb28vIi4gVGhlIG9ubHkKKwkJCSAqIHdheSB3ZSBjYW4gYWN0dWFsbHkgaGF2ZSAiZm9vL2JhciIgZmlyc3Qgb2YKKwkJCSAqIGFsbCB0aGUgdGhpbmdzIGlzIGlmIHRoZSB0cmVlcyBkb24ndAorCQkJICogY29udGFpbiAiZm9vIiBhdCBhbGwsIGluIHdoaWNoIGNhc2Ugd2UnbGwKKwkJCSAqIGhhbmRsZSAiZm9vL2JhciIgd2l0aG91dCBnb2luZyBpbnRvIHRoZQorCQkJICogZGlyZWN0b3J5LCBidXQgdGhhdCdzIGZpbmUgKGFuZCB3aWxsIHJldHVybgorCQkJICogYW4gZXJyb3IgYW55d2F5LCB3aXRoIHRoZSBhZGRlZCB1bmtub3duCisJCQkgKiBmaWxlIGNhc2UuCisJCQkgKi8KKworCQkJY2FjaGVfbmFtZSA9IGFjdGl2ZV9jYWNoZVsqaW5kcG9zXS0+bmFtZTsKKwkJCWlmIChzdHJsZW4oY2FjaGVfbmFtZSkgPiBiYXNlbGVuICYmCisJCQkgICAgIW1lbWNtcChjYWNoZV9uYW1lLCBiYXNlLCBiYXNlbGVuKSkgeworCQkJCWNhY2hlX25hbWUgKz0gYmFzZWxlbjsKKwkJCQlmaXJzdCA9IGNhY2hlX25hbWU7CisJCQl9IGVsc2UgeworCQkJCWNhY2hlX25hbWUgPSBOVUxMOworCQkJfQorCQl9CisKKyNpZiBEQlJUX0RFQlVHID4gMQorCQlpZiAoZmlyc3QpCisJCQlwcmludGYoImluZGV4ICVzXG4iLCBmaXJzdCk7CisjZW5kaWYKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoIXBvc25zW2ldIHx8IHBvc25zW2ldID09ICZkZl9jb25mbGljdF9saXN0KQorCQkJCWNvbnRpbnVlOworI2lmIERCUlRfREVCVUcgPiAxCisJCQlwcmludGYoIiVkICVzXG4iLCBpICsgMSwgcG9zbnNbaV0tPm5hbWUpOworI2VuZGlmCisJCQlpZiAoIWZpcnN0IHx8IGVudGNtcChmaXJzdCwgZmlyc3RkaXIsCisJCQkJCSAgICAgcG9zbnNbaV0tPm5hbWUsIAorCQkJCQkgICAgIHBvc25zW2ldLT5kaXJlY3RvcnkpID4gMCkgeworCQkJCWZpcnN0ID0gcG9zbnNbaV0tPm5hbWU7CisJCQkJZmlyc3RkaXIgPSBwb3Nuc1tpXS0+ZGlyZWN0b3J5OworCQkJfQorCQl9CisJCS8qIE5vIG5hbWUgbWVhbnMgd2UncmUgZG9uZSAqLworCQlpZiAoIWZpcnN0KQorCQkJcmV0dXJuIDA7CisKKwkJcGF0aGxlbiA9IHN0cmxlbihmaXJzdCk7CisJCWNlX3NpemUgPSBjYWNoZV9lbnRyeV9zaXplKGJhc2VsZW4gKyBwYXRobGVuKTsKKworCQlzcmMgPSB4Y2FsbG9jKHNyY19zaXplLCBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKworCQlzdWJwb3NucyA9IHhjYWxsb2MobGVuLCBzaXplb2Yoc3RydWN0IHRyZWVfbGlzdF9lbnRyeSAqKSk7CisKKwkJaWYgKGNhY2hlX25hbWUgJiYgIXN0cmNtcChjYWNoZV9uYW1lLCBmaXJzdCkpIHsKKwkJCWFueV9maWxlcyA9IDE7CisJCQlzcmNbMF0gPSBhY3RpdmVfY2FjaGVbKmluZHBvc107CisJCQlyZW1vdmVfY2FjaGVfZW50cnlfYXQoKmluZHBvcyk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwkJCWlmICghcG9zbnNbaV0gfHwKKwkJCSAgICAocG9zbnNbaV0gIT0gJmRmX2NvbmZsaWN0X2xpc3QgJiYKKwkJCSAgICAgc3RyY21wKGZpcnN0LCBwb3Nuc1tpXS0+bmFtZSkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChwb3Nuc1tpXSA9PSAmZGZfY29uZmxpY3RfbGlzdCkgeworCQkJCXNyY1tpICsgbWVyZ2VdID0gJmRmX2NvbmZsaWN0X2VudHJ5OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAocG9zbnNbaV0tPmRpcmVjdG9yeSkgeworCQkJCXN0cnVjdCB0cmVlICp0cmVlID0gbG9va3VwX3RyZWUocG9zbnNbaV0tPnNoYTEpOworCQkJCWFueV9kaXJzID0gMTsKKwkJCQlwYXJzZV90cmVlKHRyZWUpOworCQkJCXN1YnBvc25zW2ldID0gY3JlYXRlX3RyZWVfZW50cnlfbGlzdCh0cmVlKTsKKwkJCQlwb3Nuc1tpXSA9IHBvc25zW2ldLT5uZXh0OworCQkJCXNyY1tpICsgbWVyZ2VdID0gJmRmX2NvbmZsaWN0X2VudHJ5OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoIW1lcmdlKQorCQkJCWNlX3N0YWdlID0gMDsKKwkJCWVsc2UgaWYgKGkgKyAxIDwgaGVhZF9pZHgpCisJCQkJY2Vfc3RhZ2UgPSAxOworCQkJZWxzZSBpZiAoaSArIDEgPiBoZWFkX2lkeCkKKwkJCQljZV9zdGFnZSA9IDM7CisJCQllbHNlCisJCQkJY2Vfc3RhZ2UgPSAyOworCisJCQljZSA9IHhjYWxsb2MoMSwgY2Vfc2l6ZSk7CisJCQljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHBvc25zW2ldLT5tb2RlKTsKKwkJCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhiYXNlbGVuICsgcGF0aGxlbiwKKwkJCQkJCSAgICAgICBjZV9zdGFnZSk7CisJCQltZW1jcHkoY2UtPm5hbWUsIGJhc2UsIGJhc2VsZW4pOworCQkJbWVtY3B5KGNlLT5uYW1lICsgYmFzZWxlbiwgZmlyc3QsIHBhdGhsZW4gKyAxKTsKKworCQkJYW55X2ZpbGVzID0gMTsKKworCQkJbWVtY3B5KGNlLT5zaGExLCBwb3Nuc1tpXS0+c2hhMSwgMjApOworCQkJc3JjW2kgKyBtZXJnZV0gPSBjZTsKKwkJCXN1YnBvc25zW2ldID0gJmRmX2NvbmZsaWN0X2xpc3Q7CisJCQlwb3Nuc1tpXSA9IHBvc25zW2ldLT5uZXh0OworCQl9CisJCWlmIChhbnlfZmlsZXMpIHsKKwkJCWlmIChtZXJnZSkgeworCQkJCWludCByZXQ7CisKKyNpZiBEQlJUX0RFQlVHID4gMQorCQkJCXByaW50ZigiJXM6XG4iLCBmaXJzdCk7CisJCQkJZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspIHsKKwkJCQkJcHJpbnRmKCIgJWQgIiwgaSk7CisJCQkJCWlmIChzcmNbaV0pCisJCQkJCQlwcmludGYoIiVzXG4iLCBzaGExX3RvX2hleChzcmNbaV0tPnNoYTEpKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRmKCJcbiIpOworCQkJCX0KKyNlbmRpZgorCQkJCXJldCA9IGZuKHNyYyk7CisJCQkJCisjaWYgREJSVF9ERUJVRyA+IDEKKwkJCQlwcmludGYoIkFkZGVkICVkIGVudHJpZXNcbiIsIHJldCk7CisjZW5kaWYKKwkJCQkqaW5kcG9zICs9IHJldDsKKwkJCX0gZWxzZSB7CisJCQkJZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpKyspIHsKKwkJCQkJaWYgKHNyY1tpXSkgeworCQkJCQkJYWRkX2NhY2hlX2VudHJ5KHNyY1tpXSwgQUREX0NBQ0hFX09LX1RPX0FERHxBRERfQ0FDSEVfU0tJUF9ERkNIRUNLKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoYW55X2RpcnMpIHsKKwkJCWNoYXIgKm5ld2Jhc2UgPSB4bWFsbG9jKGJhc2VsZW4gKyAyICsgcGF0aGxlbik7CisJCQltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJCQltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4sIGZpcnN0LCBwYXRobGVuKTsKKwkJCW5ld2Jhc2VbYmFzZWxlbiArIHBhdGhsZW5dID0gJy8nOworCQkJbmV3YmFzZVtiYXNlbGVuICsgcGF0aGxlbiArIDFdID0gJ1wwJzsKKwkJCWlmICh1bnBhY2tfdHJlZXNfcmVjKHN1YnBvc25zLCBsZW4sIG5ld2Jhc2UsIGZuLAorCQkJCQkgICAgIGluZHBvcykpCisJCQkJcmV0dXJuIC0xOworCQkJZnJlZShuZXdiYXNlKTsKKwkJfQorCQlmcmVlKHN1YnBvc25zKTsKKwkJZnJlZShzcmMpOworCX0gd2hpbGUgKDEpOworfQorCitzdGF0aWMgdm9pZCByZWplY3RfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlkaWUoIkVudHJ5ICclcycgd291bGQgYmUgb3ZlcndyaXR0ZW4gYnkgbWVyZ2UuIENhbm5vdCBtZXJnZS4iLCAKKwkgICAgY2UtPm5hbWUpOworfQorCisvKiBVbmxpbmsgdGhlIGxhc3QgY29tcG9uZW50IGFuZCBhdHRlbXB0IHRvIHJlbW92ZSBsZWFkaW5nCisgKiBkaXJlY3RvcmllcywgaW4gY2FzZSB0aGlzIHVubGluayBpcyB0aGUgcmVtb3ZhbCBvZiB0aGUKKyAqIGxhc3QgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAtLSBlbXB0eSBkaXJlY3RvcmllcyBhcmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIHZvaWQgdW5saW5rX2VudHJ5KGNoYXIgKm5hbWUpCit7CisJY2hhciAqY3AsICpwcmV2OworCisJaWYgKHVubGluayhuYW1lKSkKKwkJcmV0dXJuOworCXByZXYgPSBOVUxMOworCXdoaWxlICgxKSB7CisJCWludCBzdGF0dXM7CisJCWNwID0gc3RycmNocihuYW1lLCAnLycpOworCQlpZiAocHJldikKKwkJCSpwcmV2ID0gJy8nOworCQlpZiAoIWNwKQorCQkJYnJlYWs7CisKKwkJKmNwID0gMDsKKwkJc3RhdHVzID0gcm1kaXIobmFtZSk7CisJCWlmIChzdGF0dXMpIHsKKwkJCSpjcCA9ICcvJzsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSBjcDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX2ludGVydmFsKGludCBzaWdudW0pCit7CisJcHJvZ3Jlc3NfdXBkYXRlID0gMTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcHJvZ3Jlc3Nfc2lnbmFsKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwlzdHJ1Y3QgaXRpbWVydmFsIHY7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gcHJvZ3Jlc3NfaW50ZXJ2YWw7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKworCXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMTsKKwl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCXYuaXRfdmFsdWUgPSB2Lml0X2ludGVydmFsOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGNoZWNrb3V0IHN0YXRlOworc3RhdGljIHZvaWQgY2hlY2tfdXBkYXRlcyhzdHJ1Y3QgY2FjaGVfZW50cnkgKipzcmMsIGludCBucikKK3sKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gaHRvbnMoQ0VfVVBEQVRFKTsKKwl1bnNpZ25lZCBsYXN0X3BlcmNlbnQgPSAyMDAsIGNudCA9IDAsIHRvdGFsID0gMDsKKworCWlmICh1cGRhdGUgJiYgdmVyYm9zZV91cGRhdGUpIHsKKwkJZm9yICh0b3RhbCA9IGNudCA9IDA7IGNudCA8IG5yOyBjbnQrKykgeworCQkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IHNyY1tjbnRdOworCQkJaWYgKCFjZS0+Y2VfbW9kZSB8fCBjZS0+Y2VfZmxhZ3MgJiBtYXNrKQorCQkJCXRvdGFsKys7CisJCX0KKworCQkvKiBEb24ndCBib3RoZXIgZG9pbmcgdGhpcyBmb3IgdmVyeSBzbWFsbCB1cGRhdGVzICovCisJCWlmICh0b3RhbCA8IDI1MCkKKwkJCXRvdGFsID0gMDsKKworCQlpZiAodG90YWwpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2hlY2tpbmcgZmlsZXMgb3V0Li4uXG4iKTsKKwkJCXNldHVwX3Byb2dyZXNzX3NpZ25hbCgpOworCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMTsKKwkJfQorCQljbnQgPSAwOworCX0KKworCXdoaWxlIChuci0tKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSAqc3JjKys7CisKKwkJaWYgKHRvdGFsKSB7CisJCQlpZiAoIWNlLT5jZV9tb2RlIHx8IGNlLT5jZV9mbGFncyAmIG1hc2spIHsKKwkJCQl1bnNpZ25lZCBwZXJjZW50OworCQkJCWNudCsrOworCQkJCXBlcmNlbnQgPSAoY250ICogMTAwKSAvIHRvdGFsOworCQkJCWlmIChwZXJjZW50ICE9IGxhc3RfcGVyY2VudCB8fAorCQkJCSAgICBwcm9ncmVzc191cGRhdGUpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsCisJCQkJCQlwZXJjZW50LCBjbnQsIHRvdGFsKTsKKwkJCQkJbGFzdF9wZXJjZW50ID0gcGVyY2VudDsKKwkJCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFjZS0+Y2VfbW9kZSkgeworCQkJaWYgKHVwZGF0ZSkKKwkJCQl1bmxpbmtfZW50cnkoY2UtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNlLT5jZV9mbGFncyAmIG1hc2spIHsKKwkJCWNlLT5jZV9mbGFncyAmPSB+bWFzazsKKwkJCWlmICh1cGRhdGUpCisJCQkJY2hlY2tvdXRfZW50cnkoY2UsICZzdGF0ZSwgTlVMTCk7CisJCX0KKwl9CisJaWYgKHRvdGFsKSB7CisJCXNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdW5wYWNrX3RyZWVzKG1lcmdlX2ZuX3QgZm4pCit7CisJaW50IGluZHBvcyA9IDA7CisJdW5zaWduZWQgbGVuID0gb2JqZWN0X2xpc3RfbGVuZ3RoKHRyZWVzKTsKKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICoqcG9zbnM7CisJaW50IGk7CisJc3RydWN0IG9iamVjdF9saXN0ICpwb3NuID0gdHJlZXM7CisJbWVyZ2Vfc2l6ZSA9IGxlbjsKKworCWlmIChsZW4pIHsKKwkJcG9zbnMgPSB4bWFsbG9jKGxlbiAqIHNpemVvZihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICopKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlwb3Nuc1tpXSA9IGNyZWF0ZV90cmVlX2VudHJ5X2xpc3QoKHN0cnVjdCB0cmVlICopIHBvc24tPml0ZW0pOworCQkJcG9zbiA9IHBvc24tPm5leHQ7CisJCX0KKwkJaWYgKHVucGFja190cmVlc19yZWMocG9zbnMsIGxlbiwgcHJlZml4ID8gcHJlZml4IDogIiIsCisJCQkJICAgICBmbiwgJmluZHBvcykpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHRyaXZpYWxfbWVyZ2VzX29ubHkgJiYgbm9udHJpdmlhbF9tZXJnZSkKKwkJZGllKCJNZXJnZSByZXF1aXJlcyBmaWxlLWxldmVsIG1lcmdpbmciKTsKKworCWNoZWNrX3VwZGF0ZXMoYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpc3RfdHJlZSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCB0cmVlICp0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChzaGExKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiAtMTsKKwlvYmplY3RfbGlzdF9hcHBlbmQoJnRyZWUtPm9iamVjdCwgJnRyZWVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYW1lKHN0cnVjdCBjYWNoZV9lbnRyeSAqYSwgc3RydWN0IGNhY2hlX2VudHJ5ICpiKQoreworCWlmICghIWEgIT0gISFiKQorCQlyZXR1cm4gMDsKKwlpZiAoIWEgJiYgIWIpCisJCXJldHVybiAxOworCXJldHVybiBhLT5jZV9tb2RlID09IGItPmNlX21vZGUgJiYgCisJCSFtZW1jbXAoYS0+c2hhMSwgYi0+c2hhMSwgMjApOworfQorCisKKy8qCisgKiBXaGVuIGEgQ0UgZ2V0cyB0dXJuZWQgaW50byBhbiB1bm1lcmdlZCBlbnRyeSwgd2UKKyAqIHdhbnQgaXQgdG8gYmUgdXAtdG8tZGF0ZQorICovCitzdGF0aWMgdm9pZCB2ZXJpZnlfdXB0b2RhdGUoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChpbmRleF9vbmx5IHx8IHJlc2V0KQorCQlyZXR1cm47CisKKwlpZiAoIWxzdGF0KGNlLT5uYW1lLCAmc3QpKSB7CisJCXVuc2lnbmVkIGNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDEpOworCQlpZiAoIWNoYW5nZWQpCisJCQlyZXR1cm47CisJCWVycm5vID0gMDsKKwl9CisJaWYgKHJlc2V0KSB7CisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9VUERBVEUpOworCQlyZXR1cm47CisJfQorCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCXJldHVybjsKKwlkaWUoIkVudHJ5ICclcycgbm90IHVwdG9kYXRlLiBDYW5ub3QgbWVyZ2UuIiwgY2UtPm5hbWUpOworfQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2NlX3BhdGgoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwlpZiAoY2UpCisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBjZS0+bmFtZSk7Cit9CisKKy8qCisgKiBXZSBkbyBub3Qgd2FudCB0byByZW1vdmUgb3Igb3ZlcndyaXRlIGEgd29ya2luZyB0cmVlIGZpbGUgdGhhdAorICogaXMgbm90IHRyYWNrZWQuCisgKi8KK3N0YXRpYyB2b2lkIHZlcmlmeV9hYnNlbnQoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYWN0aW9uKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGluZGV4X29ubHkgfHwgcmVzZXQgfHwgIXVwZGF0ZSkKKwkJcmV0dXJuOworCWlmICghbHN0YXQocGF0aCwgJnN0KSkKKwkJZGllKCJVbnRyYWNrZWQgd29ya2luZyB0cmVlIGZpbGUgJyVzJyAiCisJCSAgICAid291bGQgYmUgJXMgYnkgbWVyZ2UuIiwgcGF0aCwgYWN0aW9uKTsKK30KKworc3RhdGljIGludCBtZXJnZWRfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICptZXJnZSwgc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQpCit7CisJbWVyZ2UtPmNlX2ZsYWdzIHw9IGh0b25zKENFX1VQREFURSk7CisJaWYgKG9sZCkgeworCQkvKgorCQkgKiBTZWUgaWYgd2UgY2FuIHJlLXVzZSB0aGUgb2xkIENFIGRpcmVjdGx5PworCQkgKiBUaGF0IHdheSB3ZSBnZXQgdGhlIHVwdG9kYXRlIHN0YXQgaW5mby4KKwkJICoKKwkJICogVGhpcyBhbHNvIHJlbW92ZXMgdGhlIFVQREFURSBmbGFnIG9uCisJCSAqIGEgbWF0Y2guCisJCSAqLworCQlpZiAoc2FtZShvbGQsIG1lcmdlKSkgeworCQkJKm1lcmdlID0gKm9sZDsKKwkJfSBlbHNlIHsKKwkJCXZlcmlmeV91cHRvZGF0ZShvbGQpOworCQkJaW52YWxpZGF0ZV9jZV9wYXRoKG9sZCk7CisJCX0KKwl9CisJZWxzZSB7CisJCXZlcmlmeV9hYnNlbnQobWVyZ2UtPm5hbWUsICJvdmVyd3JpdHRlbiIpOworCQlpbnZhbGlkYXRlX2NlX3BhdGgobWVyZ2UpOworCX0KKworCW1lcmdlLT5jZV9mbGFncyAmPSB+aHRvbnMoQ0VfU1RBR0VNQVNLKTsKKwlhZGRfY2FjaGVfZW50cnkobWVyZ2UsIEFERF9DQUNIRV9PS19UT19BRER8QUREX0NBQ0hFX09LX1RPX1JFUExBQ0UpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlbGV0ZWRfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IGNhY2hlX2VudHJ5ICpvbGQpCit7CisJaWYgKG9sZCkKKwkJdmVyaWZ5X3VwdG9kYXRlKG9sZCk7CisJZWxzZQorCQl2ZXJpZnlfYWJzZW50KGNlLT5uYW1lLCAicmVtb3ZlZCIpOworCWNlLT5jZV9tb2RlID0gMDsKKwlhZGRfY2FjaGVfZW50cnkoY2UsIEFERF9DQUNIRV9PS19UT19BRER8QUREX0NBQ0hFX09LX1RPX1JFUExBQ0UpOworCWludmFsaWRhdGVfY2VfcGF0aChjZSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQga2VlcF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCk7CisJcmV0dXJuIDE7Cit9CisKKyNpZiBEQlJUX0RFQlVHCitzdGF0aWMgdm9pZCBzaG93X3N0YWdlX2VudHJ5KEZJTEUgKm8sCisJCQkgICAgIGNvbnN0IGNoYXIgKmxhYmVsLCBjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlKQoreworCWlmICghY2UpCisJCWZwcmludGYobywgIiVzIChtaXNzaW5nKVxuIiwgbGFiZWwpOworCWVsc2UKKwkJZnByaW50ZihvLCAiJXMlMDZvICVzICVkXHQlc1xuIiwKKwkJCWxhYmVsLAorCQkJbnRvaGwoY2UtPmNlX21vZGUpLAorCQkJc2hhMV90b19oZXgoY2UtPnNoYTEpLAorCQkJY2Vfc3RhZ2UoY2UpLAorCQkJY2UtPm5hbWUpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdGhyZWV3YXlfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3RhZ2VzKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqaW5kZXg7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpoZWFkOyAKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKnJlbW90ZSA9IHN0YWdlc1toZWFkX2lkeCArIDFdOworCWludCBjb3VudDsKKwlpbnQgaGVhZF9tYXRjaCA9IDA7CisJaW50IHJlbW90ZV9tYXRjaCA9IDA7CisJY29uc3QgY2hhciAqcGF0aCA9IE5VTEw7CisKKwlpbnQgZGZfY29uZmxpY3RfaGVhZCA9IDA7CisJaW50IGRmX2NvbmZsaWN0X3JlbW90ZSA9IDA7CisKKwlpbnQgYW55X2FuY19taXNzaW5nID0gMDsKKwlpbnQgbm9fYW5jX2V4aXN0cyA9IDE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgaGVhZF9pZHg7IGkrKykgeworCQlpZiAoIXN0YWdlc1tpXSkKKwkJCWFueV9hbmNfbWlzc2luZyA9IDE7CisJCWVsc2UgeworCQkJaWYgKCFwYXRoKQorCQkJCXBhdGggPSBzdGFnZXNbaV0tPm5hbWU7CisJCQlub19hbmNfZXhpc3RzID0gMDsKKwkJfQorCX0KKworCWluZGV4ID0gc3RhZ2VzWzBdOworCWhlYWQgPSBzdGFnZXNbaGVhZF9pZHhdOworCisJaWYgKGhlYWQgPT0gJmRmX2NvbmZsaWN0X2VudHJ5KSB7CisJCWRmX2NvbmZsaWN0X2hlYWQgPSAxOworCQloZWFkID0gTlVMTDsKKwl9CisKKwlpZiAocmVtb3RlID09ICZkZl9jb25mbGljdF9lbnRyeSkgeworCQlkZl9jb25mbGljdF9yZW1vdGUgPSAxOworCQlyZW1vdGUgPSBOVUxMOworCX0KKworCWlmICghcGF0aCAmJiBpbmRleCkKKwkJcGF0aCA9IGluZGV4LT5uYW1lOworCWlmICghcGF0aCAmJiBoZWFkKQorCQlwYXRoID0gaGVhZC0+bmFtZTsKKwlpZiAoIXBhdGggJiYgcmVtb3RlKQorCQlwYXRoID0gcmVtb3RlLT5uYW1lOworCisJLyogRmlyc3QsIGlmIHRoZXJlJ3MgYSAjMTYgc2l0dWF0aW9uLCBub3RlIHRoYXQgdG8gcHJldmVudCAjMTMKKwkgKiBhbmQgIzE0LgorCSAqLworCWlmICghc2FtZShyZW1vdGUsIGhlYWQpKSB7CisJCWZvciAoaSA9IDE7IGkgPCBoZWFkX2lkeDsgaSsrKSB7CisJCQlpZiAoc2FtZShzdGFnZXNbaV0sIGhlYWQpKSB7CisJCQkJaGVhZF9tYXRjaCA9IGk7CisJCQl9CisJCQlpZiAoc2FtZShzdGFnZXNbaV0sIHJlbW90ZSkpIHsKKwkJCQlyZW1vdGVfbWF0Y2ggPSBpOworCQkJfQorCQl9CisJfQorCisJLyogV2Ugc3RhcnQgd2l0aCBjYXNlcyB3aGVyZSB0aGUgaW5kZXggaXMgYWxsb3dlZCB0byBtYXRjaAorCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBoZWFkOiAjMTQoQUxUKSBhbmQgIzJBTFQsIHdoZXJlIGl0CisJICogaXMgcGVybWl0dGVkIHRvIG1hdGNoIHRoZSByZXN1bHQgaW5zdGVhZC4KKwkgKi8KKwkvKiAjMTQsICMxNEFMVCwgIzJBTFQgKi8KKwlpZiAocmVtb3RlICYmICFkZl9jb25mbGljdF9oZWFkICYmIGhlYWRfbWF0Y2ggJiYgIXJlbW90ZV9tYXRjaCkgeworCQlpZiAoaW5kZXggJiYgIXNhbWUoaW5kZXgsIHJlbW90ZSkgJiYgIXNhbWUoaW5kZXgsIGhlYWQpKQorCQkJcmVqZWN0X21lcmdlKGluZGV4KTsKKwkJcmV0dXJuIG1lcmdlZF9lbnRyeShyZW1vdGUsIGluZGV4KTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBoYXZlIGFuIGVudHJ5IGluIHRoZSBpbmRleCBjYWNoZSwgdGhlbiB3ZSB3YW50IHRvCisJICogbWFrZSBzdXJlIHRoYXQgaXQgbWF0Y2hlcyBoZWFkLgorCSAqLworCWlmIChpbmRleCAmJiAhc2FtZShpbmRleCwgaGVhZCkpIHsKKwkJcmVqZWN0X21lcmdlKGluZGV4KTsKKwl9CisKKwlpZiAoaGVhZCkgeworCQkvKiAjNUFMVCwgIzE1ICovCisJCWlmIChzYW1lKGhlYWQsIHJlbW90ZSkpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4KTsKKwkJLyogIzEzLCAjM0FMVCAqLworCQlpZiAoIWRmX2NvbmZsaWN0X3JlbW90ZSAmJiByZW1vdGVfbWF0Y2ggJiYgIWhlYWRfbWF0Y2gpCisJCQlyZXR1cm4gbWVyZ2VkX2VudHJ5KGhlYWQsIGluZGV4KTsKKwl9CisKKwkvKiAjMSAqLworCWlmICghaGVhZCAmJiAhcmVtb3RlICYmIGFueV9hbmNfbWlzc2luZykKKwkJcmV0dXJuIDA7CisKKwkvKiBVbmRlciB0aGUgbmV3ICJhZ2dyZXNzaXZlIiBydWxlLCB3ZSByZXNvbHZlIG1vc3RseSB0cml2aWFsCisJICogY2FzZXMgdGhhdCB3ZSBoaXN0b3JpY2FsbHkgaGFkIGdpdC1tZXJnZS1vbmUtZmlsZSByZXNvbHZlLgorCSAqLworCWlmIChhZ2dyZXNzaXZlKSB7CisJCWludCBoZWFkX2RlbGV0ZWQgPSAhaGVhZCAmJiAhZGZfY29uZmxpY3RfaGVhZDsKKwkJaW50IHJlbW90ZV9kZWxldGVkID0gIXJlbW90ZSAmJiAhZGZfY29uZmxpY3RfcmVtb3RlOworCQkvKgorCQkgKiBEZWxldGVkIGluIGJvdGguCisJCSAqIERlbGV0ZWQgaW4gb25lIGFuZCB1bmNoYW5nZWQgaW4gdGhlIG90aGVyLgorCQkgKi8KKwkJaWYgKChoZWFkX2RlbGV0ZWQgJiYgcmVtb3RlX2RlbGV0ZWQpIHx8CisJCSAgICAoaGVhZF9kZWxldGVkICYmIHJlbW90ZSAmJiByZW1vdGVfbWF0Y2gpIHx8CisJCSAgICAocmVtb3RlX2RlbGV0ZWQgJiYgaGVhZCAmJiBoZWFkX21hdGNoKSkgeworCQkJaWYgKGluZGV4KQorCQkJCXJldHVybiBkZWxldGVkX2VudHJ5KGluZGV4LCBpbmRleCk7CisJCQllbHNlIGlmIChwYXRoKQorCQkJCXZlcmlmeV9hYnNlbnQocGF0aCwgInJlbW92ZWQiKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIEFkZGVkIGluIGJvdGgsIGlkZW50aWNhbGx5LgorCQkgKi8KKwkJaWYgKG5vX2FuY19leGlzdHMgJiYgaGVhZCAmJiByZW1vdGUgJiYgc2FtZShoZWFkLCByZW1vdGUpKQorCQkJcmV0dXJuIG1lcmdlZF9lbnRyeShoZWFkLCBpbmRleCk7CisKKwl9CisKKwkvKiBCZWxvdyBhcmUgIm5vIG1lcmdlIiBjYXNlcywgd2hpY2ggcmVxdWlyZSB0aGF0IHRoZSBpbmRleCBiZQorCSAqIHVwLXRvLWRhdGUgdG8gYXZvaWQgdGhlIGZpbGVzIGdldHRpbmcgb3ZlcndyaXR0ZW4gd2l0aAorCSAqIGNvbmZsaWN0IHJlc29sdXRpb24gZmlsZXMuIAorCSAqLworCWlmIChpbmRleCkgeworCQl2ZXJpZnlfdXB0b2RhdGUoaW5kZXgpOworCX0KKwllbHNlIGlmIChwYXRoKQorCQl2ZXJpZnlfYWJzZW50KHBhdGgsICJvdmVyd3JpdHRlbiIpOworCisJbm9udHJpdmlhbF9tZXJnZSA9IDE7CisKKwkvKiAjMiwgIzMsICM0LCAjNiwgIzcsICM5LCAjMTEuICovCisJY291bnQgPSAwOworCWlmICghaGVhZF9tYXRjaCB8fCAhcmVtb3RlX21hdGNoKSB7CisJCWZvciAoaSA9IDE7IGkgPCBoZWFkX2lkeDsgaSsrKSB7CisJCQlpZiAoc3RhZ2VzW2ldKSB7CisJCQkJa2VlcF9lbnRyeShzdGFnZXNbaV0pOworCQkJCWNvdW50Kys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjaWYgREJSVF9ERUJVRworCWVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlYWQtdHJlZTogd2FybmluZyAjMTYgZGV0ZWN0ZWRcbiIpOworCQlzaG93X3N0YWdlX2VudHJ5KHN0ZGVyciwgImhlYWQgICAiLCBzdGFnZXNbaGVhZF9tYXRjaF0pOworCQlzaG93X3N0YWdlX2VudHJ5KHN0ZGVyciwgInJlbW90ZSAiLCBzdGFnZXNbcmVtb3RlX21hdGNoXSk7CisJfQorI2VuZGlmCisJaWYgKGhlYWQpIHsgY291bnQgKz0ga2VlcF9lbnRyeShoZWFkKTsgfQorCWlmIChyZW1vdGUpIHsgY291bnQgKz0ga2VlcF9lbnRyeShyZW1vdGUpOyB9CisJcmV0dXJuIGNvdW50OworfQorCisvKgorICogVHdvLXdheSBtZXJnZS4KKyAqCisgKiBUaGUgcnVsZSBpcyB0byAiY2FycnkgZm9yd2FyZCIgd2hhdCBpcyBpbiB0aGUgaW5kZXggd2l0aG91dCBsb3NpbmcKKyAqIGluZm9ybWF0aW9uIGFjcm9zcyBhICJmYXN0IGZvcndhcmQiLCBmYXZvcmluZyBhIHN1Y2Nlc3NmdWwgbWVyZ2UKKyAqIG92ZXIgYSBtZXJnZSBmYWlsdXJlIHdoZW4gaXQgbWFrZXMgc2Vuc2UuICBGb3IgZGV0YWlscyBvZiB0aGUKKyAqICJjYXJyeSBmb3J3YXJkIiBydWxlLCBwbGVhc2Ugc2VlIDxEb2N1bWVudGF0aW9uL2dpdC1yZWFkLXRyZWUudHh0Pi4KKyAqCisgKi8KK3N0YXRpYyBpbnQgdHdvd2F5X21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYykKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmN1cnJlbnQgPSBzcmNbMF07CisJc3RydWN0IGNhY2hlX2VudHJ5ICpvbGR0cmVlID0gc3JjWzFdLCAqbmV3dHJlZSA9IHNyY1syXTsKKworCWlmIChtZXJnZV9zaXplICE9IDIpCisJCXJldHVybiBlcnJvcigiQ2Fubm90IGRvIGEgdHdvd2F5IG1lcmdlIG9mICVkIHRyZWVzIiwKKwkJCSAgICAgbWVyZ2Vfc2l6ZSk7CisKKwlpZiAoY3VycmVudCkgeworCQlpZiAoKCFvbGR0cmVlICYmICFuZXd0cmVlKSB8fCAvKiA0IGFuZCA1ICovCisJCSAgICAoIW9sZHRyZWUgJiYgbmV3dHJlZSAmJgorCQkgICAgIHNhbWUoY3VycmVudCwgbmV3dHJlZSkpIHx8IC8qIDYgYW5kIDcgKi8KKwkJICAgIChvbGR0cmVlICYmIG5ld3RyZWUgJiYKKwkJICAgICBzYW1lKG9sZHRyZWUsIG5ld3RyZWUpKSB8fCAvKiAxNCBhbmQgMTUgKi8KKwkJICAgIChvbGR0cmVlICYmIG5ld3RyZWUgJiYKKwkJICAgICAhc2FtZShvbGR0cmVlLCBuZXd0cmVlKSAmJiAvKiAxOCBhbmQgMTkqLworCQkgICAgIHNhbWUoY3VycmVudCwgbmV3dHJlZSkpKSB7CisJCQlyZXR1cm4ga2VlcF9lbnRyeShjdXJyZW50KTsKKwkJfQorCQllbHNlIGlmIChvbGR0cmVlICYmICFuZXd0cmVlICYmIHNhbWUoY3VycmVudCwgb2xkdHJlZSkpIHsKKwkJCS8qIDEwIG9yIDExICovCisJCQlyZXR1cm4gZGVsZXRlZF9lbnRyeShvbGR0cmVlLCBjdXJyZW50KTsKKwkJfQorCQllbHNlIGlmIChvbGR0cmVlICYmIG5ld3RyZWUgJiYKKwkJCSBzYW1lKGN1cnJlbnQsIG9sZHRyZWUpICYmICFzYW1lKGN1cnJlbnQsIG5ld3RyZWUpKSB7CisJCQkvKiAyMCBvciAyMSAqLworCQkJcmV0dXJuIG1lcmdlZF9lbnRyeShuZXd0cmVlLCBjdXJyZW50KTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIGFsbCBvdGhlciBmYWlsdXJlcyAqLworCQkJaWYgKG9sZHRyZWUpCisJCQkJcmVqZWN0X21lcmdlKG9sZHRyZWUpOworCQkJaWYgKGN1cnJlbnQpCisJCQkJcmVqZWN0X21lcmdlKGN1cnJlbnQpOworCQkJaWYgKG5ld3RyZWUpCisJCQkJcmVqZWN0X21lcmdlKG5ld3RyZWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWVsc2UgaWYgKG5ld3RyZWUpCisJCXJldHVybiBtZXJnZWRfZW50cnkobmV3dHJlZSwgY3VycmVudCk7CisJZWxzZQorCQlyZXR1cm4gZGVsZXRlZF9lbnRyeShvbGR0cmVlLCBjdXJyZW50KTsKK30KKworLyoKKyAqIEJpbmQgbWVyZ2UuCisgKgorICogS2VlcCB0aGUgaW5kZXggZW50cmllcyBhdCBzdGFnZTAsIGNvbGxhcHNlIHN0YWdlMSBidXQgbWFrZSBzdXJlCisgKiBzdGFnZTAgZG9lcyBub3QgaGF2ZSBhbnl0aGluZyB0aGVyZS4KKyAqLworc3RhdGljIGludCBiaW5kX21lcmdlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKnNyYykKK3sKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCA9IHNyY1swXTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmEgPSBzcmNbMV07CisKKwlpZiAobWVyZ2Vfc2l6ZSAhPSAxKQorCQlyZXR1cm4gZXJyb3IoIkNhbm5vdCBkbyBhIGJpbmQgbWVyZ2Ugb2YgJWQgdHJlZXNcbiIsCisJCQkgICAgIG1lcmdlX3NpemUpOworCWlmIChhICYmIG9sZCkKKwkJZGllKCJFbnRyeSAnJXMnIG92ZXJsYXBzLiAgQ2Fubm90IGJpbmQuIiwgYS0+bmFtZSk7CisJaWYgKCFhKQorCQlyZXR1cm4ga2VlcF9lbnRyeShvbGQpOworCWVsc2UKKwkJcmV0dXJuIG1lcmdlZF9lbnRyeShhLCBOVUxMKTsKK30KKworLyoKKyAqIE9uZS13YXkgbWVyZ2UuCisgKgorICogVGhlIHJ1bGUgaXM6CisgKiAtIHRha2UgdGhlIHN0YXQgaW5mb3JtYXRpb24gZnJvbSBzdGFnZTAsIHRha2UgdGhlIGRhdGEgZnJvbSBzdGFnZTEKKyAqLworc3RhdGljIGludCBvbmV3YXlfbWVyZ2Uoc3RydWN0IGNhY2hlX2VudHJ5ICoqc3JjKQoreworCXN0cnVjdCBjYWNoZV9lbnRyeSAqb2xkID0gc3JjWzBdOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqYSA9IHNyY1sxXTsKKworCWlmIChtZXJnZV9zaXplICE9IDEpCisJCXJldHVybiBlcnJvcigiQ2Fubm90IGRvIGEgb25ld2F5IG1lcmdlIG9mICVkIHRyZWVzIiwKKwkJCSAgICAgbWVyZ2Vfc2l6ZSk7CisKKwlpZiAoIWEpCisJCXJldHVybiBkZWxldGVkX2VudHJ5KG9sZCwgb2xkKTsKKwlpZiAob2xkICYmIHNhbWUob2xkLCBhKSkgeworCQlpZiAocmVzZXQpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKGxzdGF0KG9sZC0+bmFtZSwgJnN0KSB8fAorCQkJICAgIGNlX21hdGNoX3N0YXQob2xkLCAmc3QsIDEpKQorCQkJCW9sZC0+Y2VfZmxhZ3MgfD0gaHRvbnMoQ0VfVVBEQVRFKTsKKwkJfQorCQlyZXR1cm4ga2VlcF9lbnRyeShvbGQpOworCX0KKwlyZXR1cm4gbWVyZ2VkX2VudHJ5KGEsIG9sZCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jYWNoZV91bm1lcmdlZCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqKmRzdDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmxhc3QgPSBOVUxMOworCisJcmVhZF9jYWNoZSgpOworCWRzdCA9IGFjdGl2ZV9jYWNoZTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKGNlX3N0YWdlKGNlKSkgeworCQkJaWYgKGxhc3QgJiYgIXN0cmNtcChjZS0+bmFtZSwgbGFzdC0+bmFtZSkpCisJCQkJY29udGludWU7CisJCQlpbnZhbGlkYXRlX2NlX3BhdGgoY2UpOworCQkJbGFzdCA9IGNlOworCQkJY2UtPmNlX21vZGUgPSAwOworCQkJY2UtPmNlX2ZsYWdzICY9IH5odG9ucyhDRV9TVEFHRU1BU0spOworCQl9CisJCSpkc3QrKyA9IGNlOworCX0KKwlhY3RpdmVfbnIgPSBkc3QgLSBhY3RpdmVfY2FjaGU7CisJcmV0dXJuICEhbGFzdDsKK30KKworc3RhdGljIHZvaWQgcHJpbWVfY2FjaGVfdHJlZV9yZWMoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBzdHJ1Y3QgdHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJaW50IGNudDsKKworCW1lbWNweShpdC0+c2hhMSwgdHJlZS0+b2JqZWN0LnNoYTEsIDIwKTsKKwlkZXNjLmJ1ZiA9IHRyZWUtPmJ1ZmZlcjsKKwlkZXNjLnNpemUgPSB0cmVlLT5zaXplOworCWNudCA9IDA7CisJd2hpbGUgKHRyZWVfZW50cnkoJmRlc2MsICZlbnRyeSkpIHsKKwkJaWYgKCFTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJY250Kys7CisJCWVsc2UgeworCQkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisJCQlzdHJ1Y3QgdHJlZSAqc3VidHJlZSA9IGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpOworCQkJaWYgKCFzdWJ0cmVlLT5vYmplY3QucGFyc2VkKQorCQkJCXBhcnNlX3RyZWUoc3VidHJlZSk7CisJCQlzdWIgPSBjYWNoZV90cmVlX3N1YihpdCwgZW50cnkucGF0aCk7CisJCQlzdWItPmNhY2hlX3RyZWUgPSBjYWNoZV90cmVlKCk7CisJCQlwcmltZV9jYWNoZV90cmVlX3JlYyhzdWItPmNhY2hlX3RyZWUsIHN1YnRyZWUpOworCQkJY250ICs9IHN1Yi0+Y2FjaGVfdHJlZS0+ZW50cnlfY291bnQ7CisJCX0KKwl9CisJaXQtPmVudHJ5X2NvdW50ID0gY250OworfQorCitzdGF0aWMgdm9pZCBwcmltZV9jYWNoZV90cmVlKHZvaWQpCit7CisJc3RydWN0IHRyZWUgKnRyZWUgPSAoc3RydWN0IHRyZWUgKil0cmVlcy0+aXRlbTsKKwlpZiAoIXRyZWUpCisJCXJldHVybjsKKwlhY3RpdmVfY2FjaGVfdHJlZSA9IGNhY2hlX3RyZWUoKTsKKwlwcmltZV9jYWNoZV90cmVlX3JlYyhhY3RpdmVfY2FjaGVfdHJlZSwgdHJlZSk7CisKK30KKworc3RhdGljIGNvbnN0IGNoYXIgcmVhZF90cmVlX3VzYWdlW10gPSAiZ2l0LXJlYWQtdHJlZSAoPHNoYT4gfCBbWy1tIFstLWFnZ3Jlc3NpdmVdIHwgLS1yZXNldCB8IC0tcHJlZml4PTxwcmVmaXg+XSBbLXUgfCAtaV1dIDxzaGExPiBbPHNoYTI+IFs8c2hhMz5dXSkiOworCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfcmVhZF90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqdW51c2VkX3ByZWZpeCkKK3sKKwlpbnQgaSwgbmV3ZmQsIHN0YWdlID0gMDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCW1lcmdlX2ZuX3QgZm4gPSBOVUxMOworCisJZGZfY29uZmxpY3RfbGlzdC5uZXh0ID0gJmRmX2NvbmZsaWN0X2xpc3Q7CisJc3RhdGUuYmFzZV9kaXIgPSAiIjsKKwlzdGF0ZS5mb3JjZSA9IDE7CisJc3RhdGUucXVpZXQgPSAxOworCXN0YXRlLnJlZnJlc2hfY2FjaGUgPSAxOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbmV3ZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZsb2NrX2ZpbGUsIGdldF9pbmRleF9maWxlKCksIDEpOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbWVyZ2UgPSAwOworCXJlc2V0ID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJLyogIi11IiBtZWFucyAidXBkYXRlIiwgbWVhbmluZyB0aGF0IGEgbWVyZ2Ugd2lsbCB1cGRhdGUKKwkJICogdGhlIHdvcmtpbmcgdHJlZS4KKwkJICovCisJCWlmICghc3RyY21wKGFyZywgIi11IikpIHsKKwkJCXVwZGF0ZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKGFyZywgIi12IikpIHsKKwkJCXZlcmJvc2VfdXBkYXRlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogIi1pIiBtZWFucyAiaW5kZXggb25seSIsIG1lYW5pbmcgdGhhdCBhIG1lcmdlIHdpbGwKKwkJICogbm90IGV2ZW4gbG9vayBhdCB0aGUgd29ya2luZyB0cmVlLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWkiKSkgeworCQkJaW5kZXhfb25seSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qICItLXByZWZpeD08c3ViZGlyZWN0b3J5Pi8iIG1lYW5zIGtlZXAgdGhlIGN1cnJlbnQgaW5kZXgKKwkJICogIGVudHJpZXMgYW5kIHB1dCB0aGUgZW50cmllcyBmcm9tIHRoZSB0cmVlIHVuZGVyIHRoZQorCQkgKiBnaXZlbiBzdWJkaXJlY3RvcnkuCisJCSAqLworCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1wcmVmaXg9IiwgOSkpIHsKKwkJCWlmIChzdGFnZSB8fCBtZXJnZSB8fCBwcmVmaXgpCisJCQkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKwkJCXByZWZpeCA9IGFyZyArIDk7CisJCQltZXJnZSA9IDE7CisJCQlzdGFnZSA9IDE7CisJCQlpZiAocmVhZF9jYWNoZV91bm1lcmdlZCgpKQorCQkJCWRpZSgieW91IG5lZWQgdG8gcmVzb2x2ZSB5b3VyIGN1cnJlbnQgaW5kZXggZmlyc3QiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVGhpcyBkaWZmZXJzIGZyb20gIi1tIiBpbiB0aGF0IHdlJ2xsIHNpbGVudGx5IGlnbm9yZQorCQkgKiB1bm1lcmdlZCBlbnRyaWVzIGFuZCBvdmVyd3JpdGUgd29ya2luZyB0cmVlIGZpbGVzIHRoYXQKKwkJICogY29ycmVzcG9uZCB0byB0aGVtLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZXNldCIpKSB7CisJCQlpZiAoc3RhZ2UgfHwgbWVyZ2UgfHwgcHJlZml4KQorCQkJCXVzYWdlKHJlYWRfdHJlZV91c2FnZSk7CisJCQlyZXNldCA9IDE7CisJCQltZXJnZSA9IDE7CisJCQlzdGFnZSA9IDE7CisJCQlyZWFkX2NhY2hlX3VubWVyZ2VkKCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKGFyZywgIi0tdHJpdmlhbCIpKSB7CisJCQl0cml2aWFsX21lcmdlc19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hZ2dyZXNzaXZlIikpIHsKKwkJCWFnZ3Jlc3NpdmUgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiAiLW0iIHN0YW5kcyBmb3IgIm1lcmdlIiwgbWVhbmluZyB3ZSBzdGFydCBpbiBzdGFnZSAxICovCisJCWlmICghc3RyY21wKGFyZywgIi1tIikpIHsKKwkJCWlmIChzdGFnZSB8fCBtZXJnZSB8fCBwcmVmaXgpCisJCQkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKwkJCWlmIChyZWFkX2NhY2hlX3VubWVyZ2VkKCkpCisJCQkJZGllKCJ5b3UgbmVlZCB0byByZXNvbHZlIHlvdXIgY3VycmVudCBpbmRleCBmaXJzdCIpOworCQkJc3RhZ2UgPSAxOworCQkJbWVyZ2UgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB1c2luZyAtdSBhbmQgLWkgYXQgdGhlIHNhbWUgdGltZSBtYWtlcyBubyBzZW5zZSAqLworCQlpZiAoMSA8IGluZGV4X29ubHkgKyB1cGRhdGUpCisJCQl1c2FnZShyZWFkX3RyZWVfdXNhZ2UpOworCisJCWlmIChnZXRfc2hhMShhcmcsIHNoYTEpKQorCQkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZyk7CisJCWlmIChsaXN0X3RyZWUoc2hhMSkgPCAwKQorCQkJZGllKCJmYWlsZWQgdG8gdW5wYWNrIHRyZWUgb2JqZWN0ICVzIiwgYXJnKTsKKwkJc3RhZ2UrKzsKKwl9CisJaWYgKCh1cGRhdGV8fGluZGV4X29ubHkpICYmICFtZXJnZSkKKwkJdXNhZ2UocmVhZF90cmVlX3VzYWdlKTsKKworCWlmIChwcmVmaXgpIHsKKwkJaW50IHBmeGxlbiA9IHN0cmxlbihwcmVmaXgpOworCQlpbnQgcG9zOworCQlpZiAocHJlZml4W3BmeGxlbi0xXSAhPSAnLycpCisJCQlkaWUoInByZWZpeCBtdXN0IGVuZCB3aXRoIC8iKTsKKwkJaWYgKHN0YWdlICE9IDIpCisJCQlkaWUoImJpbmRpbmcgbWVyZ2UgdGFrZXMgb25seSBvbmUgdHJlZSIpOworCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhwcmVmaXgsIHBmeGxlbik7CisJCWlmICgwIDw9IHBvcykKKwkJCWRpZSgiY29ycnVwdCBpbmRleCBmaWxlIik7CisJCXBvcyA9IC1wb3MtMTsKKwkJaWYgKHBvcyA8IGFjdGl2ZV9uciAmJgorCQkgICAgIXN0cm5jbXAoYWN0aXZlX2NhY2hlW3Bvc10tPm5hbWUsIHByZWZpeCwgcGZ4bGVuKSkKKwkJCWRpZSgic3ViZGlyZWN0b3J5ICclcycgYWxyZWFkeSBleGlzdHMuIiwgcHJlZml4KTsKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3MocHJlZml4LCBwZnhsZW4tMSk7CisJCWlmICgwIDw9IHBvcykKKwkJCWRpZSgiZmlsZSAnJS4qcycgYWxyZWFkeSBleGlzdHMuIiwgcGZ4bGVuLTEsIHByZWZpeCk7CisJfQorCisJaWYgKG1lcmdlKSB7CisJCWlmIChzdGFnZSA8IDIpCisJCQlkaWUoImp1c3QgaG93IGRvIHlvdSBleHBlY3QgbWUgdG8gbWVyZ2UgJWQgdHJlZXM/Iiwgc3RhZ2UtMSk7CisJCXN3aXRjaCAoc3RhZ2UgLSAxKSB7CisJCWNhc2UgMToKKwkJCWZuID0gcHJlZml4ID8gYmluZF9tZXJnZSA6IG9uZXdheV9tZXJnZTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlmbiA9IHR3b3dheV9tZXJnZTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCWRlZmF1bHQ6CisJCQlmbiA9IHRocmVld2F5X21lcmdlOworCQkJY2FjaGVfdHJlZV9mcmVlKCZhY3RpdmVfY2FjaGVfdHJlZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdGFnZSAtIDEgPj0gMykKKwkJCWhlYWRfaWR4ID0gc3RhZ2UgLSAyOworCQllbHNlCisJCQloZWFkX2lkeCA9IDE7CisJfQorCisJdW5wYWNrX3RyZWVzKGZuKTsKKworCS8qCisJICogV2hlbiByZWFkaW5nIG9ubHkgb25lIHRyZWUgKGVpdGhlciB0aGUgbW9zdCBiYXNpYyBmb3JtLAorCSAqICItbSBlbnQiIG9yICItLXJlc2V0IGVudCIgZm9ybSksIHdlIGNhbiBvYnRhaW4gYSBmdWxseQorCSAqIHZhbGlkIGNhY2hlLXRyZWUgYmVjYXVzZSB0aGUgaW5kZXggbXVzdCBtYXRjaCBleGFjdGx5CisJICogd2hhdCBjYW1lIGZyb20gdGhlIHRyZWUuCisJICovCisJaWYgKHRyZWVzICYmIHRyZWVzLT5pdGVtICYmICFwcmVmaXggJiYgKCFtZXJnZSB8fCAoc3RhZ2UgPT0gMikpKSB7CisJCWNhY2hlX3RyZWVfZnJlZSgmYWN0aXZlX2NhY2hlX3RyZWUpOworCQlwcmltZV9jYWNoZV90cmVlKCk7CisJfQorCisJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgY2xvc2UobmV3ZmQpIHx8IGNvbW1pdF9sb2NrX2ZpbGUoJmxvY2tfZmlsZSkpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIG5ldyBpbmRleCBmaWxlIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJlcG8tY29uZmlnLmMgYi9idWlsdGluLXJlcG8tY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyMWUyMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tcmVwby1jb25maWcuYwpAQCAtMCwwICsxLDIwMCBAQAorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF9jb25maWdfc2V0X3VzYWdlW10gPQorImdpdC1yZXBvLWNvbmZpZyBbIC0tYm9vbCB8IC0taW50IF0gWy0tZ2V0IHwgLS1nZXQtYWxsIHwgLS1nZXQtcmVnZXhwIHwgLS1yZXBsYWNlLWFsbCB8IC0tdW5zZXQgfCAtLXVuc2V0LWFsbF0gbmFtZSBbdmFsdWUgW3ZhbHVlX3JlZ2V4XV0gfCAtLWxpc3QiOworCitzdGF0aWMgY2hhcioga2V5ID0gTlVMTDsKK3N0YXRpYyByZWdleF90KiBrZXlfcmVnZXhwID0gTlVMTDsKK3N0YXRpYyByZWdleF90KiByZWdleHAgPSBOVUxMOworc3RhdGljIGludCBzaG93X2tleXMgPSAwOworc3RhdGljIGludCB1c2Vfa2V5X3JlZ2V4cCA9IDA7CitzdGF0aWMgaW50IGRvX2FsbCA9IDA7CitzdGF0aWMgaW50IGRvX25vdF9tYXRjaCA9IDA7CitzdGF0aWMgaW50IHNlZW4gPSAwOworc3RhdGljIGVudW0geyBUX1JBVywgVF9JTlQsIFRfQk9PTCB9IHR5cGUgPSBUX1JBVzsKKworc3RhdGljIGludCBzaG93X2FsbF9jb25maWcoY29uc3QgY2hhciAqa2V5XywgY29uc3QgY2hhciAqdmFsdWVfKQoreworCWlmICh2YWx1ZV8pCisJCXByaW50ZigiJXM9JXNcbiIsIGtleV8sIHZhbHVlXyk7CisJZWxzZQorCQlwcmludGYoIiVzXG4iLCBrZXlfKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaG93X2NvbmZpZyhjb25zdCBjaGFyKiBrZXlfLCBjb25zdCBjaGFyKiB2YWx1ZV8pCit7CisJY2hhciB2YWx1ZVsyNTZdOworCWNvbnN0IGNoYXIgKnZwdHIgPSB2YWx1ZTsKKwlpbnQgZHVwX2Vycm9yID0gMDsKKworCWlmICghdXNlX2tleV9yZWdleHAgJiYgc3RyY21wKGtleV8sIGtleSkpCisJCXJldHVybiAwOworCWlmICh1c2Vfa2V5X3JlZ2V4cCAmJiByZWdleGVjKGtleV9yZWdleHAsIGtleV8sIDAsIE5VTEwsIDApKQorCQlyZXR1cm4gMDsKKwlpZiAocmVnZXhwICE9IE5VTEwgJiYKKwkJCSAoZG9fbm90X21hdGNoIF4KKwkJCSAgcmVnZXhlYyhyZWdleHAsICh2YWx1ZV8/dmFsdWVfOiIiKSwgMCwgTlVMTCwgMCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChzaG93X2tleXMpCisJCXByaW50ZigiJXMgIiwga2V5Xyk7CisJaWYgKHNlZW4gJiYgIWRvX2FsbCkKKwkJZHVwX2Vycm9yID0gMTsKKwlpZiAodHlwZSA9PSBUX0lOVCkKKwkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgZ2l0X2NvbmZpZ19pbnQoa2V5XywgdmFsdWVfP3ZhbHVlXzoiIikpOworCWVsc2UgaWYgKHR5cGUgPT0gVF9CT09MKQorCQl2cHRyID0gZ2l0X2NvbmZpZ19ib29sKGtleV8sIHZhbHVlXykgPyAidHJ1ZSIgOiAiZmFsc2UiOworCWVsc2UKKwkJdnB0ciA9IHZhbHVlXz92YWx1ZV86IiI7CisJc2VlbisrOworCWlmIChkdXBfZXJyb3IpIHsKKwkJZXJyb3IoIk1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIHRoZSBrZXkgJXM6ICVzIiwKKwkJCQlrZXlfLCB2cHRyKTsKKwl9CisJZWxzZQorCQlwcmludGYoIiVzXG4iLCB2cHRyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF92YWx1ZShjb25zdCBjaGFyKiBrZXlfLCBjb25zdCBjaGFyKiByZWdleF8pCit7CisJaW50IHJldCA9IC0xOworCWNoYXIgKnRsOworCWNoYXIgKmdsb2JhbCA9IE5VTEwsICpyZXBvX2NvbmZpZyA9IE5VTEw7CisJY29uc3QgY2hhciAqbG9jYWw7CisKKwlsb2NhbCA9IGdldGVudigiR0lUX0NPTkZJRyIpOworCWlmICghbG9jYWwpIHsKKwkJY29uc3QgY2hhciAqaG9tZSA9IGdldGVudigiSE9NRSIpOworCQlsb2NhbCA9IGdldGVudigiR0lUX0NPTkZJR19MT0NBTCIpOworCQlpZiAoIWxvY2FsKQorCQkJbG9jYWwgPSByZXBvX2NvbmZpZyA9IHN0cmR1cChnaXRfcGF0aCgiY29uZmlnIikpOworCQlpZiAoaG9tZSkKKwkJCWdsb2JhbCA9IHN0cmR1cChta3BhdGgoIiVzLy5naXRjb25maWciLCBob21lKSk7CisJfQorCisJa2V5ID0gc3RyZHVwKGtleV8pOworCWZvciAodGw9a2V5K3N0cmxlbihrZXkpLTE7IHRsID49IGtleSAmJiAqdGwgIT0gJy4nOyAtLXRsKQorCQkqdGwgPSB0b2xvd2VyKCp0bCk7CisJZm9yICh0bD1rZXk7ICp0bCAmJiAqdGwgIT0gJy4nOyArK3RsKQorCQkqdGwgPSB0b2xvd2VyKCp0bCk7CisKKwlpZiAodXNlX2tleV9yZWdleHApIHsKKwkJa2V5X3JlZ2V4cCA9IChyZWdleF90KiltYWxsb2Moc2l6ZW9mKHJlZ2V4X3QpKTsKKwkJaWYgKHJlZ2NvbXAoa2V5X3JlZ2V4cCwga2V5LCBSRUdfRVhURU5ERUQpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQga2V5IHBhdHRlcm46ICVzXG4iLCBrZXlfKTsKKwkJCWdvdG8gZnJlZV9zdHJpbmdzOworCQl9CisJfQorCisJaWYgKHJlZ2V4XykgeworCQlpZiAocmVnZXhfWzBdID09ICchJykgeworCQkJZG9fbm90X21hdGNoID0gMTsKKwkJCXJlZ2V4XysrOworCQl9CisKKwkJcmVnZXhwID0gKHJlZ2V4X3QqKW1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQlpZiAocmVnY29tcChyZWdleHAsIHJlZ2V4XywgUkVHX0VYVEVOREVEKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhdHRlcm46ICVzXG4iLCByZWdleF8pOworCQkJZ290byBmcmVlX3N0cmluZ3M7CisJCX0KKwl9CisKKwlpZiAoZG9fYWxsICYmIGdsb2JhbCkKKwkJZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoc2hvd19jb25maWcsIGdsb2JhbCk7CisJZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoc2hvd19jb25maWcsIGxvY2FsKTsKKwlpZiAoIWRvX2FsbCAmJiAhc2VlbiAmJiBnbG9iYWwpCisJCWdpdF9jb25maWdfZnJvbV9maWxlKHNob3dfY29uZmlnLCBnbG9iYWwpOworCisJZnJlZShrZXkpOworCWlmIChyZWdleHApIHsKKwkJcmVnZnJlZShyZWdleHApOworCQlmcmVlKHJlZ2V4cCk7CisJfQorCisJaWYgKGRvX2FsbCkKKwkJcmV0ID0gIXNlZW47CisJZWxzZQorCQlyZXQgPSAgKHNlZW4gPT0gMSkgPyAwIDogMTsKKworZnJlZV9zdHJpbmdzOgorCWlmIChyZXBvX2NvbmZpZykKKwkJZnJlZShyZXBvX2NvbmZpZyk7CisJaWYgKGdsb2JhbCkKKwkJZnJlZShnbG9iYWwpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBjbWRfcmVwb19jb25maWcoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IG5vbmdpdCA9IDA7CisJc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoJm5vbmdpdCk7CisKKwl3aGlsZSAoMSA8IGFyZ2MpIHsKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0taW50IikpCisJCQl0eXBlID0gVF9JTlQ7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tYm9vbCIpKQorCQkJdHlwZSA9IFRfQk9PTDsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1saXN0IikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLWwiKSkKKwkJCXJldHVybiBnaXRfY29uZmlnKHNob3dfYWxsX2NvbmZpZyk7CisJCWVsc2UKKwkJCWJyZWFrOworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCXJldHVybiBnZXRfdmFsdWUoYXJndlsxXSwgTlVMTCk7CisJY2FzZSAzOgorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS11bnNldCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0KGFyZ3ZbMl0sIE5VTEwpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0LWFsbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIE5VTEwsIE5VTEwsIDEpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldCIpKQorCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBOVUxMKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtYWxsIikpIHsKKwkJCWRvX2FsbCA9IDE7CisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIE5VTEwpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0LXJlZ2V4cCIpKSB7CisJCQlzaG93X2tleXMgPSAxOworCQkJdXNlX2tleV9yZWdleHAgPSAxOworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgTlVMTCk7CisJCX0gZWxzZQorCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXQoYXJndlsxXSwgYXJndlsyXSk7CisJY2FzZSA0OgorCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS11bnNldCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIE5VTEwsIGFyZ3ZbM10sIDApOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLXVuc2V0LWFsbCIpKQorCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMl0sIE5VTEwsIGFyZ3ZbM10sIDEpOworCQllbHNlIGlmICghc3RyY21wKGFyZ3ZbMV0sICItLWdldCIpKQorCQkJcmV0dXJuIGdldF92YWx1ZShhcmd2WzJdLCBhcmd2WzNdKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1nZXQtYWxsIikpIHsKKwkJCWRvX2FsbCA9IDE7CisJCQlyZXR1cm4gZ2V0X3ZhbHVlKGFyZ3ZbMl0sIGFyZ3ZbM10pOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tZ2V0LXJlZ2V4cCIpKSB7CisJCQlzaG93X2tleXMgPSAxOworCQkJdXNlX2tleV9yZWdleHAgPSAxOworCQkJZG9fYWxsID0gMTsKKwkJCXJldHVybiBnZXRfdmFsdWUoYXJndlsyXSwgYXJndlszXSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLS1yZXBsYWNlLWFsbCIpKQorCisJCQlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoYXJndlsyXSwgYXJndlszXSwgTlVMTCwgMSk7CisJCWVsc2UKKworCQkJcmV0dXJuIGdpdF9jb25maWdfc2V0X211bHRpdmFyKGFyZ3ZbMV0sIGFyZ3ZbMl0sIGFyZ3ZbM10sIDApOworCWNhc2UgNToKKwkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0tcmVwbGFjZS1hbGwiKSkKKwkJCXJldHVybiBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihhcmd2WzJdLCBhcmd2WzNdLCBhcmd2WzRdLCAxKTsKKwljYXNlIDE6CisJZGVmYXVsdDoKKwkJdXNhZ2UoZ2l0X2NvbmZpZ19zZXRfdXNhZ2UpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tcmV2LWxpc3QuYyBiL2J1aWx0aW4tcmV2LWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGVlMTczCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZXYtbGlzdC5jCkBAIC0wLDAgKzEsMzcyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8qIGJpdHMgIzAtMTUgaW4gcmV2aXNpb24uaCAqLworCisjZGVmaW5lIENPVU5URUQJCSgxdTw8MTYpCisKK3N0YXRpYyBjb25zdCBjaGFyIHJldl9saXN0X3VzYWdlW10gPQorImdpdC1yZXYtbGlzdCBbT1BUSU9OXSA8Y29tbWl0LWlkPi4uLiBbIC0tIHBhdGhzLi4uIF1cbiIKKyIgIGxpbWl0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1tYXgtY291bnQ9bnJcbiIKKyIgICAgLS1tYXgtYWdlPWVwb2NoXG4iCisiICAgIC0tbWluLWFnZT1lcG9jaFxuIgorIiAgICAtLXNwYXJzZVxuIgorIiAgICAtLW5vLW1lcmdlc1xuIgorIiAgICAtLXJlbW92ZS1lbXB0eVxuIgorIiAgICAtLWFsbFxuIgorIiAgb3JkZXJpbmcgb3V0cHV0OlxuIgorIiAgICAtLXRvcG8tb3JkZXJcbiIKKyIgICAgLS1kYXRlLW9yZGVyXG4iCisiICBmb3JtYXR0aW5nIG91dHB1dDpcbiIKKyIgICAgLS1wYXJlbnRzXG4iCisiICAgIC0tb2JqZWN0cyB8IC0tb2JqZWN0cy1lZGdlXG4iCisiICAgIC0tdW5wYWNrZWRcbiIKKyIgICAgLS1oZWFkZXIgfCAtLXByZXR0eVxuIgorIiAgICAtLWFiYnJldj1uciB8IC0tbm8tYWJicmV2XG4iCisiICAgIC0tYWJicmV2LWNvbW1pdFxuIgorIiAgc3BlY2lhbCBwdXJwb3NlOlxuIgorIiAgICAtLWJpc2VjdCIKKzsKKworc3RhdGljIHN0cnVjdCByZXZfaW5mbyByZXZzOworCitzdGF0aWMgaW50IGJpc2VjdF9saXN0ID0gMDsKK3N0YXRpYyBpbnQgc2hvd190aW1lc3RhbXAgPSAwOworc3RhdGljIGludCBoZHJfdGVybWluYXRpb24gPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKmhlYWRlcl9wcmVmaXg7CisKK3N0YXRpYyB2b2lkIHNob3dfY29tbWl0KHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlpZiAoc2hvd190aW1lc3RhbXApCisJCXByaW50ZigiJWx1ICIsIGNvbW1pdC0+ZGF0ZSk7CisJaWYgKGhlYWRlcl9wcmVmaXgpCisJCWZwdXRzKGhlYWRlcl9wcmVmaXgsIHN0ZG91dCk7CisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCXB1dGNoYXIoJy0nKTsKKwlpZiAocmV2cy5hYmJyZXZfY29tbWl0ICYmIHJldnMuYWJicmV2KQorCQlmcHV0cyhmaW5kX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT5vYmplY3Quc2hhMSwgcmV2cy5hYmJyZXYpLAorCQkgICAgICBzdGRvdXQpOworCWVsc2UKKwkJZnB1dHMoc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSksIHN0ZG91dCk7CisJaWYgKHJldnMucGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvID0gJihwYXJlbnRzLT5pdGVtLT5vYmplY3QpOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJCQlpZiAoby0+ZmxhZ3MgJiBUTVBfTUFSSykKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiICVzIiwgc2hhMV90b19oZXgoby0+c2hhMSkpOworCQkJby0+ZmxhZ3MgfD0gVE1QX01BUks7CisJCX0KKwkJLyogVE1QX01BUksgaXMgYSBnZW5lcmFsIHB1cnBvc2UgZmxhZyB0aGF0IGNhbgorCQkgKiBiZSB1c2VkIGxvY2FsbHksIGJ1dCB0aGUgdXNlciBzaG91bGQgY2xlYW4KKwkJICogdGhpbmdzIHVwIGFmdGVyIGl0IGlzIGRvbmUgd2l0aCB0aGVtLgorCQkgKi8KKwkJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOworCQkgICAgIHBhcmVudHM7CisJCSAgICAgcGFyZW50cyA9IHBhcmVudHMtPm5leHQpCisJCQlwYXJlbnRzLT5pdGVtLT5vYmplY3QuZmxhZ3MgJj0gflRNUF9NQVJLOworCX0KKwlpZiAocmV2cy5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCXB1dGNoYXIoJyAnKTsKKwllbHNlCisJCXB1dGNoYXIoJ1xuJyk7CisKKwlpZiAocmV2cy52ZXJib3NlX2hlYWRlcikgeworCQlzdGF0aWMgY2hhciBwcmV0dHlfaGVhZGVyWzE2Mzg0XTsKKwkJcHJldHR5X3ByaW50X2NvbW1pdChyZXZzLmNvbW1pdF9mb3JtYXQsIGNvbW1pdCwgfjAsCisJCQkJICAgIHByZXR0eV9oZWFkZXIsIHNpemVvZihwcmV0dHlfaGVhZGVyKSwKKwkJCQkgICAgcmV2cy5hYmJyZXYsIE5VTEwsIE5VTEwpOworCQlwcmludGYoIiVzJWMiLCBwcmV0dHlfaGVhZGVyLCBoZHJfdGVybWluYXRpb24pOworCX0KKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoY29tbWl0LT5wYXJlbnRzKSB7CisJCWZyZWVfY29tbWl0X2xpc3QoY29tbWl0LT5wYXJlbnRzKTsKKwkJY29tbWl0LT5wYXJlbnRzID0gTlVMTDsKKwl9CisJaWYgKGNvbW1pdC0+YnVmZmVyKSB7CisJCWZyZWUoY29tbWl0LT5idWZmZXIpOworCQljb21taXQtPmJ1ZmZlciA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2Jsb2Ioc3RydWN0IGJsb2IgKmJsb2IsCisJCQkgc3RydWN0IG9iamVjdF9hcnJheSAqcCwKKwkJCSBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gJmJsb2ItPm9iamVjdDsKKworCWlmICghcmV2cy5ibG9iX29iamVjdHMpCisJCXJldHVybjsKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybjsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHN0cmR1cChuYW1lKTsKKwlhZGRfb2JqZWN0KG9iaiwgcCwgcGF0aCwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwKKwkJCSBzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQkJIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdHJlZS0+b2JqZWN0OworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgbmFtZV9wYXRoIG1lOworCisJaWYgKCFyZXZzLnRyZWVfb2JqZWN0cykKKwkJcmV0dXJuOworCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJcmV0dXJuOworCWlmIChwYXJzZV90cmVlKHRyZWUpIDwgMCkKKwkJZGllKCJiYWQgdHJlZSBvYmplY3QgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJbmFtZSA9IHN0cmR1cChuYW1lKTsKKwlhZGRfb2JqZWN0KG9iaiwgcCwgcGF0aCwgbmFtZSk7CisJbWUudXAgPSBwYXRoOworCW1lLmVsZW0gPSBuYW1lOworCW1lLmVsZW1fbGVuID0gc3RybGVuKG5hbWUpOworCisJZGVzYy5idWYgPSB0cmVlLT5idWZmZXI7CisJZGVzYy5zaXplID0gdHJlZS0+c2l6ZTsKKworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJcHJvY2Vzc190cmVlKGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLCBwLCAmbWUsIGVudHJ5LnBhdGgpOworCQllbHNlCisJCQlwcm9jZXNzX2Jsb2IobG9va3VwX2Jsb2IoZW50cnkuc2hhMSksIHAsICZtZSwgZW50cnkucGF0aCk7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzaG93X2NvbW1pdF9saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9iamVjdF9hcnJheSBvYmplY3RzID0geyAwLCAwLCBOVUxMIH07CisKKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbihyZXZzKSkgIT0gTlVMTCkgeworCQlwcm9jZXNzX3RyZWUoY29tbWl0LT50cmVlLCAmb2JqZWN0cywgTlVMTCwgIiIpOworCQlzaG93X2NvbW1pdChjb21taXQpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcmV2cy0+cGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKnBlbmRpbmcgPSByZXZzLT5wZW5kaW5nLm9iamVjdHMgKyBpOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwZW5kaW5nLT5pdGVtOworCQljb25zdCBjaGFyICpuYW1lID0gcGVuZGluZy0+bmFtZTsKKwkJaWYgKG9iai0+ZmxhZ3MgJiAoVU5JTlRFUkVTVElORyB8IFNFRU4pKQorCQkJY29udGludWU7CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1RBRykgeworCQkJb2JqLT5mbGFncyB8PSBTRUVOOworCQkJYWRkX29iamVjdF9hcnJheShvYmosIG5hbWUsICZvYmplY3RzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJCXByb2Nlc3NfdHJlZSgoc3RydWN0IHRyZWUgKilvYmosICZvYmplY3RzLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCXByb2Nlc3NfYmxvYigoc3RydWN0IGJsb2IgKilvYmosICZvYmplY3RzLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgidW5rbm93biBwZW5kaW5nIG9iamVjdCAlcyAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgbmFtZSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBvYmplY3RzLm5yOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqcCA9IG9iamVjdHMub2JqZWN0cyArIGk7CisKKwkJLyogQW4gb2JqZWN0IHdpdGggbmFtZSAiZm9vXG4wMDAwMDAwLi4uIiBjYW4gYmUgdXNlZCB0bworCQkgKiBjb25mdXNlIGRvd25zdHJlYW0gZ2l0LXBhY2stb2JqZWN0cyB2ZXJ5IGJhZGx5LgorCQkgKi8KKwkJY29uc3QgY2hhciAqZXAgPSBzdHJjaHIocC0+bmFtZSwgJ1xuJyk7CisJCWlmIChlcCkgeworCQkJcHJpbnRmKCIlcyAlLipzXG4iLCBzaGExX3RvX2hleChwLT5pdGVtLT5zaGExKSwKKwkJCSAgICAgICAoaW50KSAoZXAgLSBwLT5uYW1lKSwKKwkJCSAgICAgICBwLT5uYW1lKTsKKwkJfQorCQllbHNlCisJCQlwcmludGYoIiVzICVzXG4iLCBzaGExX3RvX2hleChwLT5pdGVtLT5zaGExKSwgcC0+bmFtZSk7CisJfQorfQorCisvKgorICogVGhpcyBpcyBhIHRydWx5IHN0dXBpZCBhbGdvcml0aG0sIGJ1dCBpdCdzIG9ubHkKKyAqIHVzZWQgZm9yIGJpc2VjdGlvbiwgYW5kIHdlIGp1c3QgZG9uJ3QgY2FyZSBlbm91Z2guCisgKgorICogV2UgY2FyZSBqdXN0IGJhcmVseSBlbm91Z2ggdG8gYXZvaWQgcmVjdXJzaW5nIGZvcgorICogbm9uLW1lcmdlIGVudHJpZXMuCisgKi8KK3N0YXRpYyBpbnQgY291bnRfZGlzdGFuY2Uoc3RydWN0IGNvbW1pdF9saXN0ICplbnRyeSkKK3sKKwlpbnQgbnIgPSAwOworCisJd2hpbGUgKGVudHJ5KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGVudHJ5LT5pdGVtOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBDT1VOVEVEKSkKKwkJCWJyZWFrOworCQlpZiAoIXJldnMucHJ1bmVfZm4gfHwgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVFJFRUNIQU5HRSkpCisJCQlucisrOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBDT1VOVEVEOworCQlwID0gY29tbWl0LT5wYXJlbnRzOworCQllbnRyeSA9IHA7CisJCWlmIChwKSB7CisJCQlwID0gcC0+bmV4dDsKKwkJCXdoaWxlIChwKSB7CisJCQkJbnIgKz0gY291bnRfZGlzdGFuY2UocCk7CisJCQkJcCA9IHAtPm5leHQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2Rpc3RhbmNlKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQljb21taXQtPm9iamVjdC5mbGFncyAmPSB+Q09VTlRFRDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpmaW5kX2Jpc2VjdGlvbihzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJaW50IG5yLCBjbG9zZXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcCwgKmJlc3Q7CisKKwluciA9IDA7CisJcCA9IGxpc3Q7CisJd2hpbGUgKHApIHsKKwkJaWYgKCFyZXZzLnBydW5lX2ZuIHx8IChwLT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBUUkVFQ0hBTkdFKSkKKwkJCW5yKys7CisJCXAgPSBwLT5uZXh0OworCX0KKwljbG9zZXN0ID0gMDsKKwliZXN0ID0gbGlzdDsKKworCWZvciAocCA9IGxpc3Q7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWludCBkaXN0YW5jZTsKKworCQlpZiAocmV2cy5wcnVuZV9mbiAmJiAhKHAtPml0ZW0tPm9iamVjdC5mbGFncyAmIFRSRUVDSEFOR0UpKQorCQkJY29udGludWU7CisKKwkJZGlzdGFuY2UgPSBjb3VudF9kaXN0YW5jZShwKTsKKwkJY2xlYXJfZGlzdGFuY2UobGlzdCk7CisJCWlmIChuciAtIGRpc3RhbmNlIDwgZGlzdGFuY2UpCisJCQlkaXN0YW5jZSA9IG5yIC0gZGlzdGFuY2U7CisJCWlmIChkaXN0YW5jZSA+IGNsb3Nlc3QpIHsKKwkJCWJlc3QgPSBwOworCQkJY2xvc2VzdCA9IGRpc3RhbmNlOworCQl9CisJfQorCWlmIChiZXN0KQorCQliZXN0LT5uZXh0ID0gTlVMTDsKKwlyZXR1cm4gYmVzdDsKK30KKworc3RhdGljIHZvaWQgbWFya19lZGdlX3BhcmVudHNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlpZiAoIShwYXJlbnQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY29udGludWU7CisJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKHBhcmVudC0+dHJlZSk7CisJCWlmIChyZXZzLmVkZ2VfaGludCAmJiAhKHBhcmVudC0+b2JqZWN0LmZsYWdzICYgU0hPV04pKSB7CisJCQlwYXJlbnQtPm9iamVjdC5mbGFncyB8PSBTSE9XTjsKKwkJCXByaW50ZigiLSVzXG4iLCBzaGExX3RvX2hleChwYXJlbnQtPm9iamVjdC5zaGExKSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfZWRnZXNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QpCit7CisJZm9yICggOyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKGNvbW1pdC0+dHJlZSk7CisJCQljb250aW51ZTsKKwkJfQorCQltYXJrX2VkZ2VfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJfQorfQorCitpbnQgY21kX3Jldl9saXN0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlpbnQgaTsKKworCWluaXRfcmV2aXNpb25zKCZyZXZzLCBwcmVmaXgpOworCXJldnMuYWJicmV2ID0gMDsKKwlyZXZzLmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9VTlNQRUNJRklFRDsKKwlhcmdjID0gc2V0dXBfcmV2aXNpb25zKGFyZ2MsIGFyZ3YsICZyZXZzLCBOVUxMKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1oZWFkZXIiKSkgeworCQkJcmV2cy52ZXJib3NlX2hlYWRlciA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXRpbWVzdGFtcCIpKSB7CisJCQlzaG93X3RpbWVzdGFtcCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWJpc2VjdCIpKSB7CisJCQliaXNlY3RfbGlzdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQl1c2FnZShyZXZfbGlzdF91c2FnZSk7CisKKwl9CisJaWYgKHJldnMuY29tbWl0X2Zvcm1hdCAhPSBDTUlUX0ZNVF9VTlNQRUNJRklFRCkgeworCQkvKiBUaGUgY29tbWFuZCBsaW5lIGhhcyBhIC0tcHJldHR5ICAqLworCQloZHJfdGVybWluYXRpb24gPSAnXG4nOworCQlpZiAocmV2cy5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCQloZWFkZXJfcHJlZml4ID0gIiI7CisJCWVsc2UKKwkJCWhlYWRlcl9wcmVmaXggPSAiY29tbWl0ICI7CisJfQorCWVsc2UgaWYgKHJldnMudmVyYm9zZV9oZWFkZXIpCisJCS8qIE9ubHkgLS1oZWFkZXIgd2FzIHNwZWNpZmllZCAqLworCQlyZXZzLmNvbW1pdF9mb3JtYXQgPSBDTUlUX0ZNVF9SQVc7CisKKwlsaXN0ID0gcmV2cy5jb21taXRzOworCisJaWYgKCghbGlzdCAmJgorCSAgICAgKCEocmV2cy50YWdfb2JqZWN0c3x8cmV2cy50cmVlX29iamVjdHN8fHJldnMuYmxvYl9vYmplY3RzKSAmJgorCSAgICAgICFyZXZzLnBlbmRpbmcubnIpKSB8fAorCSAgICByZXZzLmRpZmYpCisJCXVzYWdlKHJldl9saXN0X3VzYWdlKTsKKworCXNhdmVfY29tbWl0X2J1ZmZlciA9IHJldnMudmVyYm9zZV9oZWFkZXI7CisJdHJhY2tfb2JqZWN0X3JlZnMgPSAwOworCWlmIChiaXNlY3RfbGlzdCkKKwkJcmV2cy5saW1pdGVkID0gMTsKKworCXByZXBhcmVfcmV2aXNpb25fd2FsaygmcmV2cyk7CisJaWYgKHJldnMudHJlZV9vYmplY3RzKQorCQltYXJrX2VkZ2VzX3VuaW50ZXJlc3RpbmcocmV2cy5jb21taXRzKTsKKworCWlmIChiaXNlY3RfbGlzdCkKKwkJcmV2cy5jb21taXRzID0gZmluZF9iaXNlY3Rpb24ocmV2cy5jb21taXRzKTsKKworCXNob3dfY29tbWl0X2xpc3QoJnJldnMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9idWlsdGluLXJldi1wYXJzZS5jIGIvYnVpbHRpbi1yZXYtcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1yZXYtcGFyc2UuYwpAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIHJldi1wYXJzZS5jCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNkZWZpbmUgRE9fUkVWUwkJMQorI2RlZmluZSBET19OT1JFVgkyCisjZGVmaW5lIERPX0ZMQUdTCTQKKyNkZWZpbmUgRE9fTk9ORkxBR1MJOAorc3RhdGljIGludCBmaWx0ZXIgPSB+MDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRlZiA9IE5VTEw7CisKKyNkZWZpbmUgTk9STUFMIDAKKyNkZWZpbmUgUkVWRVJTRUQgMQorc3RhdGljIGludCBzaG93X3R5cGUgPSBOT1JNQUw7CitzdGF0aWMgaW50IHN5bWJvbGljID0gMDsKK3N0YXRpYyBpbnQgYWJicmV2ID0gMDsKK3N0YXRpYyBpbnQgb3V0cHV0X3NxID0gMDsKKworc3RhdGljIGludCByZXZzX2NvdW50ID0gMDsKKworLyoKKyAqIFNvbWUgYXJndW1lbnRzIGFyZSByZWxldmFudCAicmV2aXNpb24iIGFyZ3VtZW50cywKKyAqIG90aGVycyBhcmUgYWJvdXQgb3V0cHV0IGZvcm1hdCBvciBvdGhlciBkZXRhaWxzLgorICogVGhpcyBzb3J0cyBpdCBhbGwgb3V0LgorICovCitzdGF0aWMgaW50IGlzX3Jldl9hcmd1bWVudChjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnJldl9hcmdzW10gPSB7CisJCSItLWFsbCIsCisJCSItLWJpc2VjdCIsCisJCSItLWRlbnNlIiwKKwkJIi0tYnJhbmNoZXMiLAorCQkiLS1oZWFkZXIiLAorCQkiLS1tYXgtYWdlPSIsCisJCSItLW1heC1jb3VudD0iLAorCQkiLS1taW4tYWdlPSIsCisJCSItLW5vLW1lcmdlcyIsCisJCSItLW9iamVjdHMiLAorCQkiLS1vYmplY3RzLWVkZ2UiLAorCQkiLS1wYXJlbnRzIiwKKwkJIi0tcHJldHR5IiwKKwkJIi0tcmVtb3RlcyIsCisJCSItLXNwYXJzZSIsCisJCSItLXRhZ3MiLAorCQkiLS10b3BvLW9yZGVyIiwKKwkJIi0tZGF0ZS1vcmRlciIsCisJCSItLXVucGFja2VkIiwKKwkJTlVMTAorCX07CisJY29uc3QgY2hhciAqKnAgPSByZXZfYXJnczsKKworCS8qIGFjY2VwdCAtPGRpZ2l0PiwgbGlrZSB0cmFkaXRpb25hbCAiaGVhZCIgKi8KKwlpZiAoKCphcmcgPT0gJy0nKSAmJiBpc2RpZ2l0KGFyZ1sxXSkpCisJCXJldHVybiAxOworCisJZm9yICg7OykgeworCQljb25zdCBjaGFyICpzdHIgPSAqcCsrOworCQlpbnQgbGVuOworCQlpZiAoIXN0cikKKwkJCXJldHVybiAwOworCQlsZW4gPSBzdHJsZW4oc3RyKTsKKwkJaWYgKCFzdHJjbXAoYXJnLCBzdHIpIHx8CisJCSAgICAoc3RyW2xlbi0xXSA9PSAnPScgJiYgIXN0cm5jbXAoYXJnLCBzdHIsIGxlbikpKQorCQkJcmV0dXJuIDE7CisJfQorfQorCisvKiBPdXRwdXQgYXJndW1lbnQgYXMgYSBzdHJpbmcsIGVpdGhlciBTUSBvciBub3JtYWwgKi8KK3N0YXRpYyB2b2lkIHNob3coY29uc3QgY2hhciAqYXJnKQoreworCWlmIChvdXRwdXRfc3EpIHsKKwkJaW50IHNxID0gJ1wnJywgY2g7CisKKwkJcHV0Y2hhcihzcSk7CisJCXdoaWxlICgoY2ggPSAqYXJnKyspKSB7CisJCQlpZiAoY2ggPT0gc3EpCisJCQkJZnB1dHMoIidcXCciLCBzdGRvdXQpOworCQkJcHV0Y2hhcihjaCk7CisJCX0KKwkJcHV0Y2hhcihzcSk7CisJCXB1dGNoYXIoJyAnKTsKKwl9CisJZWxzZQorCQlwdXRzKGFyZyk7Cit9CisKKy8qIE91dHB1dCBhIHJldmlzaW9uLCBvbmx5IGlmIGZpbHRlciBhbGxvd3MgaXQgKi8KK3N0YXRpYyB2b2lkIHNob3dfcmV2KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghKGZpbHRlciAmIERPX1JFVlMpKQorCQlyZXR1cm47CisJZGVmID0gTlVMTDsKKwlyZXZzX2NvdW50Kys7CisKKwlpZiAodHlwZSAhPSBzaG93X3R5cGUpCisJCXB1dGNoYXIoJ14nKTsKKwlpZiAoc3ltYm9saWMgJiYgbmFtZSkKKwkJc2hvdyhuYW1lKTsKKwllbHNlIGlmIChhYmJyZXYpCisJCXNob3coZmluZF91bmlxdWVfYWJicmV2KHNoYTEsIGFiYnJldikpOworCWVsc2UKKwkJc2hvdyhzaGExX3RvX2hleChzaGExKSk7Cit9CisKKy8qIE91dHB1dCBhIGZsYWcsIG9ubHkgaWYgZmlsdGVyIGFsbG93cyBpdC4gKi8KK3N0YXRpYyBpbnQgc2hvd19mbGFnKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpZiAoIShmaWx0ZXIgJiBET19GTEFHUykpCisJCXJldHVybiAwOworCWlmIChmaWx0ZXIgJiAoaXNfcmV2X2FyZ3VtZW50KGFyZykgPyBET19SRVZTIDogRE9fTk9SRVYpKSB7CisJCXNob3coYXJnKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2RlZmF1bHQodm9pZCkKK3sKKwljb25zdCBjaGFyICpzID0gZGVmOworCisJaWYgKHMpIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCQlkZWYgPSBOVUxMOworCQlpZiAoIWdldF9zaGExKHMsIHNoYTEpKSB7CisJCQlzaG93X3JldihOT1JNQUwsIHNoYTEsIHMpOworCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHNob3dfcmVmZXJlbmNlKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc2hvd19yZXYoTk9STUFMLCBzaGExLCByZWZuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19kYXRlc3RyaW5nKGNvbnN0IGNoYXIgKmZsYWcsIGNvbnN0IGNoYXIgKmRhdGVzdHIpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEwMF07CisKKwkvKiBkYXRlIGhhbmRsaW5nIHJlcXVpcmVzIGJvdGggZmxhZ3MgYW5kIHJldnMgKi8KKwlpZiAoKGZpbHRlciAmIChET19GTEFHUyB8IERPX1JFVlMpKSAhPSAoRE9fRkxBR1MgfCBET19SRVZTKSkKKwkJcmV0dXJuOworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyVsdSIsIGZsYWcsIGFwcHJveGlkYXRlKGRhdGVzdHIpKTsKKwlzaG93KGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19maWxlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzaG93X2RlZmF1bHQoKTsKKwlpZiAoKGZpbHRlciAmIChET19OT05GTEFHU3xET19OT1JFVikpID09IChET19OT05GTEFHU3xET19OT1JFVikpIHsKKwkJc2hvdyhhcmcpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X2RpZmZlcmVuY2UoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKmRvdGRvdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgZW5kWzIwXTsKKwljb25zdCBjaGFyICpuZXh0OworCWNvbnN0IGNoYXIgKnRoaXM7CisJaW50IHN5bW1ldHJpYzsKKworCWlmICghKGRvdGRvdCA9IHN0cnN0cihhcmcsICIuLiIpKSkKKwkJcmV0dXJuIDA7CisJbmV4dCA9IGRvdGRvdCArIDI7CisJdGhpcyA9IGFyZzsKKwlzeW1tZXRyaWMgPSAoKm5leHQgPT0gJy4nKTsKKworCSpkb3Rkb3QgPSAwOworCW5leHQgKz0gc3ltbWV0cmljOworCisJaWYgKCEqbmV4dCkKKwkJbmV4dCA9ICJIRUFEIjsKKwlpZiAoZG90ZG90ID09IGFyZykKKwkJdGhpcyA9ICJIRUFEIjsKKwlpZiAoIWdldF9zaGExKHRoaXMsIHNoYTEpICYmICFnZXRfc2hhMShuZXh0LCBlbmQpKSB7CisJCXNob3dfcmV2KE5PUk1BTCwgZW5kLCBuZXh0KTsKKwkJc2hvd19yZXYoc3ltbWV0cmljID8gTk9STUFMIDogUkVWRVJTRUQsIHNoYTEsIHRoaXMpOworCQlpZiAoc3ltbWV0cmljKSB7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKmV4Y2x1ZGU7CisJCQlzdHJ1Y3QgY29tbWl0ICphLCAqYjsKKwkJCWEgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwkJCWIgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShlbmQpOworCQkJZXhjbHVkZSA9IGdldF9tZXJnZV9iYXNlcyhhLCBiLCAxKTsKKwkJCXdoaWxlIChleGNsdWRlKSB7CisJCQkJc3RydWN0IGNvbW1pdF9saXN0ICpuID0gZXhjbHVkZS0+bmV4dDsKKwkJCQlzaG93X3JldihSRVZFUlNFRCwKKwkJCQkJIGV4Y2x1ZGUtPml0ZW0tPm9iamVjdC5zaGExLE5VTEwpOworCQkJCWZyZWUoZXhjbHVkZSk7CisJCQkJZXhjbHVkZSA9IG47CisJCQl9CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCSpkb3Rkb3QgPSAnLic7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfcmV2X3BhcnNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBpLCBhc19pcyA9IDAsIHZlcmlmeSA9IDA7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoYXNfaXMpIHsKKwkJCWlmIChzaG93X2ZpbGUoYXJnKSAmJiBhc19pcyA8IDIpCisJCQkJdmVyaWZ5X2ZpbGVuYW1lKHByZWZpeCwgYXJnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywiLW4iKSkgeworCQkJaWYgKCsraSA+PSBhcmdjKQorCQkJCWRpZSgiLW4gcmVxdWlyZXMgYW4gYXJndW1lbnQiKTsKKwkJCWlmICgoZmlsdGVyICYgRE9fRkxBR1MpICYmIChmaWx0ZXIgJiBET19SRVZTKSkgeworCQkJCXNob3coYXJnKTsKKwkJCQlzaG93KGFyZ3ZbaV0pOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywiLW4iLDIpKSB7CisJCQlpZiAoKGZpbHRlciAmIERPX0ZMQUdTKSAmJiAoZmlsdGVyICYgRE9fUkVWUykpCisJCQkJc2hvdyhhcmcpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCQlhc19pcyA9IDI7CisJCQkJLyogUGFzcyBvbiB0aGUgIi0tIiBpZiB3ZSBzaG93IGFueXRoaW5nIGJ1dCBmaWxlcy4uICovCisJCQkJaWYgKGZpbHRlciAmIChET19GTEFHUyB8IERPX1JFVlMpKQorCQkJCQlzaG93X2ZpbGUoYXJnKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGVmYXVsdCIpKSB7CisJCQkJZGVmID0gYXJndltpKzFdOworCQkJCWkrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmV2cy1vbmx5IikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX05PUkVWOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1yZXZzIikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX1JFVlM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWZsYWdzIikpIHsKKwkJCQlmaWx0ZXIgJj0gfkRPX05PTkZMQUdTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1uby1mbGFncyIpKSB7CisJCQkJZmlsdGVyICY9IH5ET19GTEFHUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyaWZ5IikpIHsKKwkJCQlmaWx0ZXIgJj0gfihET19GTEFHU3xET19OT1JFVik7CisJCQkJdmVyaWZ5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tc2hvcnQiKSB8fAorCQkJICAgICFzdHJuY21wKGFyZywgIi0tc2hvcnQ9IiwgOCkpIHsKKwkJCQlmaWx0ZXIgJj0gfihET19GTEFHU3xET19OT1JFVik7CisJCQkJdmVyaWZ5ID0gMTsKKwkJCQlhYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCQlpZiAoYXJnWzddID09ICc9JykKKwkJCQkJYWJicmV2ID0gc3RydG91bChhcmcgKyA4LCBOVUxMLCAxMCk7CisJCQkJaWYgKGFiYnJldiA8IE1JTklNVU1fQUJCUkVWKQorCQkJCQlhYmJyZXYgPSBNSU5JTVVNX0FCQlJFVjsKKwkJCQllbHNlIGlmICg0MCA8PSBhYmJyZXYpCisJCQkJCWFiYnJldiA9IDQwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1zcSIpKSB7CisJCQkJb3V0cHV0X3NxID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm90IikpIHsKKwkJCQlzaG93X3R5cGUgXj0gUkVWRVJTRUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXN5bWJvbGljIikpIHsKKwkJCQlzeW1ib2xpYyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJZm9yX2VhY2hfcmVmKHNob3dfcmVmZXJlbmNlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYnJhbmNoZXMiKSkgeworCQkJCWZvcl9lYWNoX2JyYW5jaF9yZWYoc2hvd19yZWZlcmVuY2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS10YWdzIikpIHsKKwkJCQlmb3JfZWFjaF90YWdfcmVmKHNob3dfcmVmZXJlbmNlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcmVtb3RlcyIpKSB7CisJCQkJZm9yX2VhY2hfcmVtb3RlX3JlZihzaG93X3JlZmVyZW5jZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctcHJlZml4IikpIHsKKwkJCQlpZiAocHJlZml4KQorCQkJCQlwdXRzKHByZWZpeCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNob3ctY2R1cCIpKSB7CisJCQkJY29uc3QgY2hhciAqcGZ4ID0gcHJlZml4OworCQkJCXdoaWxlIChwZngpIHsKKwkJCQkJcGZ4ID0gc3RyY2hyKHBmeCwgJy8nKTsKKwkJCQkJaWYgKHBmeCkgeworCQkJCQkJcGZ4Kys7CisJCQkJCQlwcmludGYoIi4uLyIpOworCQkJCQl9CisJCQkJfQorCQkJCXB1dGNoYXIoJ1xuJyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWdpdC1kaXIiKSkgeworCQkJCWNvbnN0IGNoYXIgKmdpdGRpciA9IGdldGVudihHSVRfRElSX0VOVklST05NRU5UKTsKKwkJCQlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVhdOworCQkJCWlmIChnaXRkaXIpIHsKKwkJCQkJcHV0cyhnaXRkaXIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFwcmVmaXgpIHsKKwkJCQkJcHV0cygiLmdpdCIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKCFnZXRjd2QoY3dkLCBQQVRIX01BWCkpCisJCQkJCWRpZSgidW5hYmxlIHRvIGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCQkJcHJpbnRmKCIlcy8uZ2l0XG4iLCBjd2QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tc2luY2U9IiwgOCkpIHsKKwkJCQlzaG93X2RhdGVzdHJpbmcoIi0tbWF4LWFnZT0iLCBhcmcrOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1hZnRlcj0iLCA4KSkgeworCQkJCXNob3dfZGF0ZXN0cmluZygiLS1tYXgtYWdlPSIsIGFyZys4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLWJlZm9yZT0iLCA5KSkgeworCQkJCXNob3dfZGF0ZXN0cmluZygiLS1taW4tYWdlPSIsIGFyZys5KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLXVudGlsPSIsIDgpKSB7CisJCQkJc2hvd19kYXRlc3RyaW5nKCItLW1pbi1hZ2U9IiwgYXJnKzgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHNob3dfZmxhZyhhcmcpICYmIHZlcmlmeSkKKwkJCQlkaWUoIk5lZWRlZCBhIHNpbmdsZSByZXZpc2lvbiIpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBOb3QgYSBmbGFnIGFyZ3VtZW50ICovCisJCWlmICh0cnlfZGlmZmVyZW5jZShhcmcpKQorCQkJY29udGludWU7CisJCWlmICghZ2V0X3NoYTEoYXJnLCBzaGExKSkgeworCQkJc2hvd19yZXYoTk9STUFMLCBzaGExLCBhcmcpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCphcmcgPT0gJ14nICYmICFnZXRfc2hhMShhcmcrMSwgc2hhMSkpIHsKKwkJCXNob3dfcmV2KFJFVkVSU0VELCBzaGExLCBhcmcrMSk7CisJCQljb250aW51ZTsKKwkJfQorCQlhc19pcyA9IDE7CisJCWlmICghc2hvd19maWxlKGFyZykpCisJCQljb250aW51ZTsKKwkJaWYgKHZlcmlmeSkKKwkJCWRpZSgiTmVlZGVkIGEgc2luZ2xlIHJldmlzaW9uIik7CisJCXZlcmlmeV9maWxlbmFtZShwcmVmaXgsIGFyZyk7CisJfQorCXNob3dfZGVmYXVsdCgpOworCWlmICh2ZXJpZnkgJiYgcmV2c19jb3VudCAhPSAxKQorCQlkaWUoIk5lZWRlZCBhIHNpbmdsZSByZXZpc2lvbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1ybS5jIGIvYnVpbHRpbi1ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2Q4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXJtLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiAiZ2l0IHJtIiBidWlsdGluIGNvbW1hbmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzIDIwMDYKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9ybV91c2FnZVtdID0KKyJnaXQtcm0gWy1uXSBbLXZdIFstZl0gPGZpbGVwYXR0ZXJuPi4uLiI7CisKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBuciwgYWxsb2M7CisJY29uc3QgY2hhciAqKm5hbWU7Cit9IGxpc3Q7CisKK3N0YXRpYyB2b2lkIGFkZF9saXN0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKGxpc3QubnIgPj0gbGlzdC5hbGxvYykgeworCQlsaXN0LmFsbG9jID0gYWxsb2NfbnIobGlzdC5hbGxvYyk7CisJCWxpc3QubmFtZSA9IHhyZWFsbG9jKGxpc3QubmFtZSwgbGlzdC5hbGxvYyAqIHNpemVvZihjb25zdCBjaGFyICopKTsKKwl9CisJbGlzdC5uYW1lW2xpc3QubnIrK10gPSBuYW1lOworfQorCitzdGF0aWMgaW50IHJlbW92ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHJldDsKKwljaGFyICpzbGFzaDsKKworCXJldCA9IHVubGluayhuYW1lKTsKKwlpZiAoIXJldCAmJiAoc2xhc2ggPSBzdHJyY2hyKG5hbWUsICcvJykpKSB7CisJCWNoYXIgKm4gPSBzdHJkdXAobmFtZSk7CisJCWRvIHsKKwkJCW5bc2xhc2ggLSBuYW1lXSA9IDA7CisJCQluYW1lID0gbjsKKwkJfSB3aGlsZSAoIXJtZGlyKG5hbWUpICYmIChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBjbWRfcm0oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIG5ld2ZkOworCWludCB2ZXJib3NlID0gMCwgc2hvd19vbmx5ID0gMCwgZm9yY2UgPSAwOworCWNvbnN0IGNoYXIgKipwYXRoc3BlYzsKKwljaGFyICpzZWVuOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJbmV3ZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKCZsb2NrX2ZpbGUsIGdldF9pbmRleF9maWxlKCksIDEpOworCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgiaW5kZXggZmlsZSBjb3JydXB0Iik7CisKKwlmb3IgKGkgPSAxIDsgaSA8IGFyZ2MgOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyAhPSAnLScpCisJCQlicmVhazsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJc2hvd19vbmx5ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi12IikpIHsKKwkJCXZlcmJvc2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWYiKSkgeworCQkJZm9yY2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJdXNhZ2UoYnVpbHRpbl9ybV91c2FnZSk7CisJfQorCWlmIChhcmdjIDw9IGkpCisJCXVzYWdlKGJ1aWx0aW5fcm1fdXNhZ2UpOworCisJcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhcmd2ICsgaSk7CisJc2VlbiA9IE5VTEw7CisJZm9yIChpID0gMDsgcGF0aHNwZWNbaV0gOyBpKyspCisJCS8qIG5vdGhpbmcgKi87CisJc2VlbiA9IHhjYWxsb2MoaSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKCFtYXRjaF9wYXRoc3BlYyhwYXRoc3BlYywgY2UtPm5hbWUsIGNlX25hbWVsZW4oY2UpLCAwLCBzZWVuKSkKKwkJCWNvbnRpbnVlOworCQlhZGRfbGlzdChjZS0+bmFtZSk7CisJfQorCisJaWYgKHBhdGhzcGVjKSB7CisJCWNvbnN0IGNoYXIgKm1hdGNoOworCQlmb3IgKGkgPSAwOyAobWF0Y2ggPSBwYXRoc3BlY1tpXSkgIT0gTlVMTCA7IGkrKykgeworCQkJaWYgKCptYXRjaCAmJiAhc2VlbltpXSkKKwkJCQlkaWUoInBhdGhzcGVjICclcycgZGlkIG5vdCBtYXRjaCBhbnkgZmlsZXMiLCBtYXRjaCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEZpcnN0IHJlbW92ZSB0aGUgbmFtZXMgZnJvbSB0aGUgaW5kZXg6IHdlIHdvbid0IGNvbW1pdAorCSAqIHRoZSBpbmRleCB1bmxlc3MgYWxsIG9mIHRoZW0gc3VjY2VlZAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBsaXN0Lm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcGF0aCA9IGxpc3QubmFtZVtpXTsKKwkJcHJpbnRmKCJybSAnJXMnXG4iLCBwYXRoKTsKKworCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKSkKKwkJCWRpZSgiZ2l0LXJtOiB1bmFibGUgdG8gcmVtb3ZlICVzIiwgcGF0aCk7CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKwl9CisKKwlpZiAoc2hvd19vbmx5KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlbiwgaWYgd2UgdXNlZCAiLWYiLCByZW1vdmUgdGhlIGZpbGVuYW1lcyBmcm9tIHRoZQorCSAqIHdvcmtzcGFjZS4gSWYgd2UgZmFpbCB0byByZW1vdmUgdGhlIGZpcnN0IG9uZSwgd2UKKwkgKiBhYm9ydCB0aGUgImdpdCBybSIgKGJ1dCBvbmNlIHdlJ3ZlIHN1Y2Nlc3NmdWxseSByZW1vdmVkCisJICogYW55IGZpbGUgYXQgYWxsLCB3ZSdsbCBnbyBhaGVhZCBhbmQgY29tbWl0IHRvIGl0IGFsbDoKKwkgKiBieSB0aGVuIHdlJ3ZlIGFscmVhZHkgY29tbWl0dGVkIG91cnNlbHZlcyBhbmQgY2FuJ3QgZmFpbAorCSAqIGluIHRoZSBtaWRkbGUpCisJICovCisJaWYgKGZvcmNlKSB7CisJCWludCByZW1vdmVkID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGxpc3QubnI7IGkrKykgeworCQkJY29uc3QgY2hhciAqcGF0aCA9IGxpc3QubmFtZVtpXTsKKwkJCWlmICghcmVtb3ZlX2ZpbGUocGF0aCkpIHsKKwkJCQlyZW1vdmVkID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghcmVtb3ZlZCkKKwkJCQlkaWUoImdpdC1ybTogJXM6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KKworCWlmIChhY3RpdmVfY2FjaGVfY2hhbmdlZCkgeworCQlpZiAod3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKSB8fAorCQkgICAgY2xvc2UobmV3ZmQpIHx8IGNvbW1pdF9sb2NrX2ZpbGUoJmxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1zaG93LWJyYW5jaC5jIGIvYnVpbHRpbi1zaG93LWJyYW5jaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMWI4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXNob3ctYnJhbmNoLmMKQEAgLTAsMCArMSw3OTEgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBzaG93X2JyYW5jaF91c2FnZVtdID0KKyJnaXQtc2hvdy1icmFuY2ggWy0tc3BhcnNlXSBbLS1jdXJyZW50XSBbLS1hbGxdIFstLWhlYWRzXSBbLS10YWdzXSBbLS10b3BvLW9yZGVyXSBbLS1tb3JlPWNvdW50IHwgLS1saXN0IHwgLS1pbmRlcGVuZGVudCB8IC0tbWVyZ2UtYmFzZSBdIFstLXRvcGljc10gWzxyZWZzPi4uLl0iOworCitzdGF0aWMgaW50IGRlZmF1bHRfbnVtID0gMDsKK3N0YXRpYyBpbnQgZGVmYXVsdF9hbGxvYyA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqKmRlZmF1bHRfYXJnID0gTlVMTDsKKworI2RlZmluZSBVTklOVEVSRVNUSU5HCTAxCisKKyNkZWZpbmUgUkVWX1NISUZUCSAyCisjZGVmaW5lIE1BWF9SRVZTCShGTEFHX0JJVFMgLSBSRVZfU0hJRlQpIC8qIHNob3VsZCBub3QgZXhjZWVkIGJpdHNfcGVyX2ludCAtIFJFVl9TSElGVCAqLworCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCXJldHVybiBjb21taXQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqcG9wX29uZV9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdF9wKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3Q7CisJbGlzdCA9ICpsaXN0X3A7CisJY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkqbGlzdF9wID0gbGlzdC0+bmV4dDsKKwlmcmVlKGxpc3QpOworCXJldHVybiBjb21taXQ7Cit9CisKK3N0cnVjdCBjb21taXRfbmFtZSB7CisJY29uc3QgY2hhciAqaGVhZF9uYW1lOyAvKiB3aGljaCBoZWFkJ3MgYW5jZXN0b3I/ICovCisJaW50IGdlbmVyYXRpb247IC8qIGhvdyBtYW55IHBhcmVudHMgYXdheSBmcm9tIGhlYWRfbmFtZSAqLworfTsKKworLyogTmFtZSB0aGUgY29tbWl0IGFzIG50aCBnZW5lcmF0aW9uIGFuY2VzdG9yIG9mIGhlYWRfbmFtZTsKKyAqIHdlIGNvdW50IG9ubHkgdGhlIGZpcnN0LXBhcmVudCByZWxhdGlvbnNoaXAgZm9yIG5hbWluZyBwdXJwb3Nlcy4KKyAqLworc3RhdGljIHZvaWQgbmFtZV9jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBjb25zdCBjaGFyICpoZWFkX25hbWUsIGludCBudGgpCit7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lOworCWlmICghY29tbWl0LT51dGlsKQorCQljb21taXQtPnV0aWwgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWl0X25hbWUpKTsKKwluYW1lID0gY29tbWl0LT51dGlsOworCW5hbWUtPmhlYWRfbmFtZSA9IGhlYWRfbmFtZTsKKwluYW1lLT5nZW5lcmF0aW9uID0gbnRoOworfQorCisvKiBQYXJlbnQgaXMgdGhlIGZpcnN0IHBhcmVudCBvZiB0aGUgY29tbWl0LiAgV2UgbWF5IG5hbWUgaXQKKyAqIGFzIChuKzEpdGggZ2VuZXJhdGlvbiBhbmNlc3RvciBvZiB0aGUgc2FtZSBoZWFkX25hbWUgYXMKKyAqIGNvbW1pdCBpcyBudGggZ2VuZXJhdGlvbiBhbmNlc3RvciBvZiwgaWYgdGhhdCBnZW5lcmF0aW9uCisgKiBudW1iZXIgaXMgYmV0dGVyIHRoYW4gdGhlIG5hbWUgaXQgYWxyZWFkeSBoYXMuCisgKi8KK3N0YXRpYyB2b2lkIG5hbWVfcGFyZW50KHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqcGFyZW50KQoreworCXN0cnVjdCBjb21taXRfbmFtZSAqY29tbWl0X25hbWUgPSBjb21taXQtPnV0aWw7CisJc3RydWN0IGNvbW1pdF9uYW1lICpwYXJlbnRfbmFtZSA9IHBhcmVudC0+dXRpbDsKKwlpZiAoIWNvbW1pdF9uYW1lKQorCQlyZXR1cm47CisJaWYgKCFwYXJlbnRfbmFtZSB8fAorCSAgICBjb21taXRfbmFtZS0+Z2VuZXJhdGlvbiArIDEgPCBwYXJlbnRfbmFtZS0+Z2VuZXJhdGlvbikKKwkJbmFtZV9jb21taXQocGFyZW50LCBjb21taXRfbmFtZS0+aGVhZF9uYW1lLAorCQkJICAgIGNvbW1pdF9uYW1lLT5nZW5lcmF0aW9uICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgbmFtZV9maXJzdF9wYXJlbnRfY2hhaW4oc3RydWN0IGNvbW1pdCAqYykKK3sKKwlpbnQgaSA9IDA7CisJd2hpbGUgKGMpIHsKKwkJc3RydWN0IGNvbW1pdCAqcDsKKwkJaWYgKCFjLT51dGlsKQorCQkJYnJlYWs7CisJCWlmICghYy0+cGFyZW50cykKKwkJCWJyZWFrOworCQlwID0gYy0+cGFyZW50cy0+aXRlbTsKKwkJaWYgKCFwLT51dGlsKSB7CisJCQluYW1lX3BhcmVudChjLCBwKTsKKwkJCWkrKzsKKwkJfQorCQllbHNlCisJCQlicmVhazsKKwkJYyA9IHA7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZCBuYW1lX2NvbW1pdHMoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0LAorCQkJIHN0cnVjdCBjb21taXQgKipyZXYsCisJCQkgY2hhciAqKnJlZl9uYW1lLAorCQkJIGludCBudW1fcmV2KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqY2w7CisJc3RydWN0IGNvbW1pdCAqYzsKKwlpbnQgaTsKKworCS8qIEZpcnN0IGdpdmUgbmFtZXMgdG8gdGhlIGdpdmVuIGhlYWRzICovCisJZm9yIChjbCA9IGxpc3Q7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisJCWMgPSBjbC0+aXRlbTsKKwkJaWYgKGMtPnV0aWwpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykgeworCQkJaWYgKHJldltpXSA9PSBjKSB7CisJCQkJbmFtZV9jb21taXQoYywgcmVmX25hbWVbaV0sIDApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogVGhlbiBjb21taXRzIG9uIHRoZSBmaXJzdCBwYXJlbnQgYW5jZXN0cnkgY2hhaW4gKi8KKwlkbyB7CisJCWkgPSAwOworCQlmb3IgKGNsID0gbGlzdDsgY2w7IGNsID0gY2wtPm5leHQpIHsKKwkJCWkgKz0gbmFtZV9maXJzdF9wYXJlbnRfY2hhaW4oY2wtPml0ZW0pOworCQl9CisJfSB3aGlsZSAoaSk7CisKKwkvKiBGaW5hbGx5LCBhbnkgdW5uYW1lZCBjb21taXRzICovCisJZG8geworCQlpID0gMDsKKwkJZm9yIChjbCA9IGxpc3Q7IGNsOyBjbCA9IGNsLT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCQlzdHJ1Y3QgY29tbWl0X25hbWUgKm47CisJCQlpbnQgbnRoOworCQkJYyA9IGNsLT5pdGVtOworCQkJaWYgKCFjLT51dGlsKQorCQkJCWNvbnRpbnVlOworCQkJbiA9IGMtPnV0aWw7CisJCQlwYXJlbnRzID0gYy0+cGFyZW50czsKKwkJCW50aCA9IDA7CisJCQl3aGlsZSAocGFyZW50cykgeworCQkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJCWNoYXIgbmV3bmFtZVsxMDAwXSwgKmVuOworCQkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJCW50aCsrOworCQkJCWlmIChwLT51dGlsKQorCQkJCQljb250aW51ZTsKKwkJCQllbiA9IG5ld25hbWU7CisJCQkJc3dpdGNoIChuLT5nZW5lcmF0aW9uKSB7CisJCQkJY2FzZSAwOgorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiJXMiLCBuLT5oZWFkX25hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCWVuICs9IHNwcmludGYoZW4sICIlc14iLCBuLT5oZWFkX25hbWUpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQllbiArPSBzcHJpbnRmKGVuLCAiJXN+JWQiLAorCQkJCQkJbi0+aGVhZF9uYW1lLCBuLT5nZW5lcmF0aW9uKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChudGggPT0gMSkKKwkJCQkJZW4gKz0gc3ByaW50ZihlbiwgIl4iKTsKKwkJCQllbHNlCisJCQkJCWVuICs9IHNwcmludGYoZW4sICJeJWQiLCBudGgpOworCQkJCW5hbWVfY29tbWl0KHAsIHN0cmR1cChuZXduYW1lKSwgMCk7CisJCQkJaSsrOworCQkJCW5hbWVfZmlyc3RfcGFyZW50X2NoYWluKHApOworCQkJfQorCQl9CisJfSB3aGlsZSAoaSk7Cit9CisKK3N0YXRpYyBpbnQgbWFya19zZWVuKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdF9saXN0ICoqc2Vlbl9wKQoreworCWlmICghY29tbWl0LT5vYmplY3QuZmxhZ3MpIHsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KGNvbW1pdCwgc2Vlbl9wKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqb2luX3JldnMoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdF9wLAorCQkgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKipzZWVuX3AsCisJCSAgICAgIGludCBudW1fcmV2LCBpbnQgZXh0cmEpCit7CisJaW50IGFsbF9tYXNrID0gKCgxdSA8PCAoUkVWX1NISUZUICsgbnVtX3JldikpIC0gMSk7CisJaW50IGFsbF9yZXZzID0gYWxsX21hc2sgJiB+KCgxdSA8PCBSRVZfU0hJRlQpIC0gMSk7CisKKwl3aGlsZSAoKmxpc3RfcCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCWludCBzdGlsbF9pbnRlcmVzdGluZyA9ICEhaW50ZXJlc3RpbmcoKmxpc3RfcCk7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBvcF9vbmVfY29tbWl0KGxpc3RfcCk7CisJCWludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgYWxsX21hc2s7CisKKwkJaWYgKCFzdGlsbF9pbnRlcmVzdGluZyAmJiBleHRyYSA8PSAwKQorCQkJYnJlYWs7CisKKwkJbWFya19zZWVuKGNvbW1pdCwgc2Vlbl9wKTsKKwkJaWYgKChmbGFncyAmIGFsbF9yZXZzKSA9PSBhbGxfcmV2cykKKwkJCWZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJaW50IHRoaXNfZmxhZyA9IHAtPm9iamVjdC5mbGFnczsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJaWYgKCh0aGlzX2ZsYWcgJiBmbGFncykgPT0gZmxhZ3MpCisJCQkJY29udGludWU7CisJCQlpZiAoIXAtPm9iamVjdC5wYXJzZWQpCisJCQkJcGFyc2VfY29tbWl0KHApOworCQkJaWYgKG1hcmtfc2VlbihwLCBzZWVuX3ApICYmICFzdGlsbF9pbnRlcmVzdGluZykKKwkJCQlleHRyYS0tOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IGZsYWdzOworCQkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdF9wKTsKKwkJfQorCX0KKworCS8qCisJICogUG9zdHByb2Nlc3MgdG8gY29tcGxldGUgd2VsbC1wb2lzb25pbmcuCisJICoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWxsIHRoZSBjb21taXRzIHdlIGhhdmUgc2VlbiBpbgorCSAqIHNlZW5fcCBsaXN0LiAgTWFyayBhbnl0aGluZyB0aGF0IGNhbiBiZSByZWFjaGVkIGZyb20KKwkgKiB1bmludGVyZXN0aW5nIGNvbW1pdHMgbm90IGludGVyZXN0aW5nLgorCSAqLworCWZvciAoOzspIHsKKwkJaW50IGNoYW5nZWQgPSAwOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnM7CisJCWZvciAocyA9ICpzZWVuX3A7IHM7IHMgPSBzLT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjID0gcy0+aXRlbTsKKwkJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKworCQkJaWYgKCgoYy0+b2JqZWN0LmZsYWdzICYgYWxsX3JldnMpICE9IGFsbF9yZXZzKSAmJgorCQkJICAgICEoYy0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQkJY29udGludWU7CisKKwkJCS8qIFRoZSBjdXJyZW50IGNvbW1pdCBpcyBlaXRoZXIgYSBtZXJnZSBiYXNlIG9yCisJCQkgKiBhbHJlYWR5IHVuaW50ZXJlc3Rpbmcgb25lLiAgTWFyayBpdHMgcGFyZW50cworCQkJICogYXMgdW5pbnRlcmVzdGluZyBjb21taXRzIF9vbmx5XyBpZiB0aGV5IGFyZQorCQkJICogYWxyZWFkeSBwYXJzZWQuICBObyByZWFzb24gdG8gZmluZCBuZXcgb25lcworCQkJICogaGVyZS4KKwkJCSAqLworCQkJcGFyZW50cyA9IGMtPnBhcmVudHM7CisJCQl3aGlsZSAocGFyZW50cykgeworCQkJCXN0cnVjdCBjb21taXQgKnAgPSBwYXJlbnRzLT5pdGVtOworCQkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJCWlmICghKHAtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKSB7CisJCQkJCXAtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJCQljaGFuZ2VkID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFjaGFuZ2VkKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaG93X29uZV9jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgbm9fbmFtZSkKK3sKKwljaGFyIHByZXR0eVsyNTZdLCAqY3A7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lID0gY29tbWl0LT51dGlsOworCWlmIChjb21taXQtPm9iamVjdC5wYXJzZWQpCisJCXByZXR0eV9wcmludF9jb21taXQoQ01JVF9GTVRfT05FTElORSwgY29tbWl0LCB+MCwKKwkJCQkgICAgcHJldHR5LCBzaXplb2YocHJldHR5KSwgMCwgTlVMTCwgTlVMTCk7CisJZWxzZQorCQlzdHJjcHkocHJldHR5LCAiKHVuYXZhaWxhYmxlKSIpOworCWlmICghc3RybmNtcChwcmV0dHksICJbUEFUQ0hdICIsIDgpKQorCQljcCA9IHByZXR0eSArIDg7CisJZWxzZQorCQljcCA9IHByZXR0eTsKKworCWlmICghbm9fbmFtZSkgeworCQlpZiAobmFtZSAmJiBuYW1lLT5oZWFkX25hbWUpIHsKKwkJCXByaW50ZigiWyVzIiwgbmFtZS0+aGVhZF9uYW1lKTsKKwkJCWlmIChuYW1lLT5nZW5lcmF0aW9uKSB7CisJCQkJaWYgKG5hbWUtPmdlbmVyYXRpb24gPT0gMSkKKwkJCQkJcHJpbnRmKCJeIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIn4lZCIsIG5hbWUtPmdlbmVyYXRpb24pOworCQkJfQorCQkJcHJpbnRmKCJdICIpOworCQl9CisJCWVsc2UKKwkJCXByaW50ZigiWyVzXSAiLAorCQkJICAgICAgIGZpbmRfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCA3KSk7CisJfQorCXB1dHMoY3ApOworfQorCitzdGF0aWMgY2hhciAqcmVmX25hbWVbTUFYX1JFVlMgKyAxXTsKK3N0YXRpYyBpbnQgcmVmX25hbWVfY250OworCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9kaWdpdF9wcmVmaXgoY29uc3QgY2hhciAqcywgaW50ICp2KQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IHZlcjsKKwljaGFyIGNoOworCisJZm9yIChwID0gcywgdmVyID0gMDsKKwkgICAgICcwJyA8PSAoY2ggPSAqcCkgJiYgY2ggPD0gJzknOworCSAgICAgcCsrKQorCQl2ZXIgPSB2ZXIgKiAxMCArIGNoIC0gJzAnOworCSp2ID0gdmVyOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyBpbnQgdmVyc2lvbl9jbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgdmEsIHZiOworCisJCWEgPSBmaW5kX2RpZ2l0X3ByZWZpeChhLCAmdmEpOworCQliID0gZmluZF9kaWdpdF9wcmVmaXgoYiwgJnZiKTsKKwkJaWYgKHZhICE9IHZiKQorCQkJcmV0dXJuIHZhIC0gdmI7CisKKwkJd2hpbGUgKDEpIHsKKwkJCWludCBjYSA9ICphOworCQkJaW50IGNiID0gKmI7CisJCQlpZiAoJzAnIDw9IGNhICYmIGNhIDw9ICc5JykKKwkJCQljYSA9IDA7CisJCQlpZiAoJzAnIDw9IGNiICYmIGNiIDw9ICc5JykKKwkJCQljYiA9IDA7CisJCQlpZiAoY2EgIT0gY2IpCisJCQkJcmV0dXJuIGNhIC0gY2I7CisJCQlpZiAoIWNhKQorCQkJCWJyZWFrOworCQkJYSsrOworCQkJYisrOworCQl9CisJCWlmICghKmEgJiYgISpiKQorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGNvbXBhcmVfcmVmX25hbWUoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCWNvbnN0IGNoYXIgKiBjb25zdCphID0gYV8sICogY29uc3QqYiA9IGJfOworCXJldHVybiB2ZXJzaW9uX2NtcCgqYSwgKmIpOworfQorCitzdGF0aWMgdm9pZCBzb3J0X3JlZl9yYW5nZShpbnQgYm90dG9tLCBpbnQgdG9wKQoreworCXFzb3J0KHJlZl9uYW1lICsgYm90dG9tLCB0b3AgLSBib3R0b20sIHNpemVvZihyZWZfbmFtZVswXSksCisJICAgICAgY29tcGFyZV9yZWZfbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpbnQgaTsKKworCWlmICghY29tbWl0KQorCQlyZXR1cm4gMDsKKwkvKiBBdm9pZCBhZGRpbmcgdGhlIHNhbWUgdGhpbmcgdHdpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmVmX25hbWVfY250OyBpKyspCisJCWlmICghc3RyY21wKHJlZm5hbWUsIHJlZl9uYW1lW2ldKSkKKwkJCXJldHVybiAwOworCisJaWYgKE1BWF9SRVZTIDw9IHJlZl9uYW1lX2NudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGlnbm9yaW5nICVzOyAiCisJCQkiY2Fubm90IGhhbmRsZSBtb3JlIHRoYW4gJWQgcmVmc1xuIiwKKwkJCXJlZm5hbWUsIE1BWF9SRVZTKTsKKwkJcmV0dXJuIDA7CisJfQorCXJlZl9uYW1lW3JlZl9uYW1lX2NudCsrXSA9IHN0cmR1cChyZWZuYW1lKTsKKwlyZWZfbmFtZVtyZWZfbmFtZV9jbnRdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBlbmRfaGVhZF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcFsyMF07CisJaW50IG9mcyA9IDExOworCWlmIChzdHJuY21wKHJlZm5hbWUsICJyZWZzL2hlYWRzLyIsIG9mcykpCisJCXJldHVybiAwOworCS8qIElmIGJvdGggaGVhZHMvZm9vIGFuZCB0YWdzL2ZvbyBleGlzdHMsIGdldF9zaGExIHdvdWxkCisJICogZ2V0IGNvbmZ1c2VkLgorCSAqLworCWlmIChnZXRfc2hhMShyZWZuYW1lICsgb2ZzLCB0bXApIHx8IG1lbWNtcCh0bXAsIHNoYTEsIDIwKSkKKwkJb2ZzID0gNTsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lICsgb2ZzLCBzaGExKTsKK30KKworc3RhdGljIGludCBhcHBlbmRfdGFnX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmIChzdHJuY21wKHJlZm5hbWUsICJyZWZzL3RhZ3MvIiwgMTApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lICsgNSwgc2hhMSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYXRjaF9yZWZfcGF0dGVybiA9IE5VTEw7CitzdGF0aWMgaW50IG1hdGNoX3JlZl9zbGFzaCA9IDA7CitzdGF0aWMgaW50IGNvdW50X3NsYXNoKGNvbnN0IGNoYXIgKnMpCit7CisJaW50IGNudCA9IDA7CisJd2hpbGUgKCpzKQorCQlpZiAoKnMrKyA9PSAnLycpCisJCQljbnQrKzsKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IGFwcGVuZF9tYXRjaGluZ19yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwkvKiB3ZSB3YW50IHRvIGFsbG93IHBhdHRlcm4gaG9sZC88YXN0ZXJpc2s+IHRvIHNob3cgYWxsCisJICogYnJhbmNoZXMgdW5kZXIgcmVmcy9oZWFkcy9ob2xkLywgYW5kIHYwLjk5Ljk/IHRvIHNob3cKKwkgKiByZWZzL3RhZ3MvdjAuOTkuOWEgYW5kIGZyaWVuZHMuCisJICovCisJY29uc3QgY2hhciAqdGFpbDsKKwlpbnQgc2xhc2ggPSBjb3VudF9zbGFzaChyZWZuYW1lKTsKKwlmb3IgKHRhaWwgPSByZWZuYW1lOyAqdGFpbCAmJiBtYXRjaF9yZWZfc2xhc2ggPCBzbGFzaDsgKQorCQlpZiAoKnRhaWwrKyA9PSAnLycpCisJCQlzbGFzaC0tOworCWlmICghKnRhaWwpCisJCXJldHVybiAwOworCWlmIChmbm1hdGNoKG1hdGNoX3JlZl9wYXR0ZXJuLCB0YWlsLCAwKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFzdHJuY21wKCJyZWZzL2hlYWRzLyIsIHJlZm5hbWUsIDExKSkKKwkJcmV0dXJuIGFwcGVuZF9oZWFkX3JlZihyZWZuYW1lLCBzaGExKTsKKwlpZiAoIXN0cm5jbXAoInJlZnMvdGFncy8iLCByZWZuYW1lLCAxMCkpCisJCXJldHVybiBhcHBlbmRfdGFnX3JlZihyZWZuYW1lLCBzaGExKTsKKwlyZXR1cm4gYXBwZW5kX3JlZihyZWZuYW1lLCBzaGExKTsKK30KKworc3RhdGljIHZvaWQgc25hcmZfcmVmcyhpbnQgaGVhZCwgaW50IHRhZykKK3sKKwlpZiAoaGVhZCkgeworCQlpbnQgb3JpZ19jbnQgPSByZWZfbmFtZV9jbnQ7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfaGVhZF9yZWYpOworCQlzb3J0X3JlZl9yYW5nZShvcmlnX2NudCwgcmVmX25hbWVfY250KTsKKwl9CisJaWYgKHRhZykgeworCQlpbnQgb3JpZ19jbnQgPSByZWZfbmFtZV9jbnQ7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfdGFnX3JlZik7CisJCXNvcnRfcmVmX3JhbmdlKG9yaWdfY250LCByZWZfbmFtZV9jbnQpOworCX0KK30KKworc3RhdGljIGludCByZXZfaXNfaGVhZChjaGFyICpoZWFkX3BhdGgsIGludCBoZWFkbGVuLCBjaGFyICpuYW1lLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqaGVhZF9zaGExLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBuYW1lbGVuOworCWlmICgoIWhlYWRfcGF0aFswXSkgfHwKKwkgICAgKGhlYWRfc2hhMSAmJiBzaGExICYmIG1lbWNtcChoZWFkX3NoYTEsIHNoYTEsIDIwKSkpCisJCXJldHVybiAwOworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKChoZWFkbGVuIDwgbmFtZWxlbikgfHwKKwkgICAgbWVtY21wKGhlYWRfcGF0aCArIGhlYWRsZW4gLSBuYW1lbGVuLCBuYW1lLCBuYW1lbGVuKSkKKwkJcmV0dXJuIDA7CisJaWYgKGhlYWRsZW4gPT0gbmFtZWxlbiB8fAorCSAgICBoZWFkX3BhdGhbaGVhZGxlbiAtIG5hbWVsZW4gLSAxXSA9PSAnLycpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfbWVyZ2VfYmFzZShzdHJ1Y3QgY29tbWl0X2xpc3QgKnNlZW4sIGludCBudW1fcmV2KQoreworCWludCBhbGxfbWFzayA9ICgoMXUgPDwgKFJFVl9TSElGVCArIG51bV9yZXYpKSAtIDEpOworCWludCBhbGxfcmV2cyA9IGFsbF9tYXNrICYgfigoMXUgPDwgUkVWX1NISUZUKSAtIDEpOworCWludCBleGl0X3N0YXR1cyA9IDE7CisKKwl3aGlsZSAoc2VlbikgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwb3Bfb25lX2NvbW1pdCgmc2Vlbik7CisJCWludCBmbGFncyA9IGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgYWxsX21hc2s7CisJCWlmICghKGZsYWdzICYgVU5JTlRFUkVTVElORykgJiYKKwkJICAgICgoZmxhZ3MgJiBhbGxfcmV2cykgPT0gYWxsX3JldnMpKSB7CisJCQlwdXRzKHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwkJCWV4aXRfc3RhdHVzID0gMDsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCX0KKwl9CisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQorCitzdGF0aWMgaW50IHNob3dfaW5kZXBlbmRlbnQoc3RydWN0IGNvbW1pdCAqKnJldiwKKwkJCSAgICBpbnQgbnVtX3JldiwKKwkJCSAgICBjaGFyICoqcmVmX25hbWUsCisJCQkgICAgdW5zaWduZWQgaW50ICpyZXZfbWFzaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmV2OyBpKyspIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcmV2W2ldOworCQl1bnNpZ25lZCBpbnQgZmxhZyA9IHJldl9tYXNrW2ldOworCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyA9PSBmbGFnKQorCQkJcHV0cyhzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfb25lX3Jldihjb25zdCBjaGFyICphdikKK3sKKwl1bnNpZ25lZCBjaGFyIHJldmtleVsyMF07CisJaWYgKCFnZXRfc2hhMShhdiwgcmV2a2V5KSkgeworCQlhcHBlbmRfcmVmKGF2LCByZXZrZXkpOworCQlyZXR1cm47CisJfQorCWlmIChzdHJjaHIoYXYsICcqJykgfHwgc3RyY2hyKGF2LCAnPycpIHx8IHN0cmNocihhdiwgJ1snKSkgeworCQkvKiBnbG9iIHN0eWxlIG1hdGNoICovCisJCWludCBzYXZlZF9tYXRjaGVzID0gcmVmX25hbWVfY250OworCQltYXRjaF9yZWZfcGF0dGVybiA9IGF2OworCQltYXRjaF9yZWZfc2xhc2ggPSBjb3VudF9zbGFzaChhdik7CisJCWZvcl9lYWNoX3JlZihhcHBlbmRfbWF0Y2hpbmdfcmVmKTsKKwkJaWYgKHNhdmVkX21hdGNoZXMgPT0gcmVmX25hbWVfY250ICYmCisJCSAgICByZWZfbmFtZV9jbnQgPCBNQVhfUkVWUykKKwkJCWVycm9yKCJubyBtYXRjaGluZyByZWZzIHdpdGggJXMiLCBhdik7CisJCWlmIChzYXZlZF9tYXRjaGVzICsgMSA8IHJlZl9uYW1lX2NudCkKKwkJCXNvcnRfcmVmX3JhbmdlKHNhdmVkX21hdGNoZXMsIHJlZl9uYW1lX2NudCk7CisJCXJldHVybjsKKwl9CisJZGllKCJiYWQgc2hhMSByZWZlcmVuY2UgJXMiLCBhdik7Cit9CisKK3N0YXRpYyBpbnQgZ2l0X3Nob3dfYnJhbmNoX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgInNob3dicmFuY2guZGVmYXVsdCIpKSB7CisJCWlmIChkZWZhdWx0X2FsbG9jIDw9IGRlZmF1bHRfbnVtICsgMSkgeworCQkJZGVmYXVsdF9hbGxvYyA9IGRlZmF1bHRfYWxsb2MgKiAzIC8gMiArIDIwOworCQkJZGVmYXVsdF9hcmcgPSB4cmVhbGxvYyhkZWZhdWx0X2FyZywgc2l6ZW9mICpkZWZhdWx0X2FyZyAqIGRlZmF1bHRfYWxsb2MpOworCQl9CisJCWRlZmF1bHRfYXJnW2RlZmF1bHRfbnVtKytdID0gc3RyZHVwKHZhbHVlKTsKKwkJZGVmYXVsdF9hcmdbZGVmYXVsdF9udW1dID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBvbWl0X2luX2RlbnNlKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdCAqKnJldiwgaW50IG4pCit7CisJLyogSWYgdGhlIGNvbW1pdCBpcyB0aXAgb2YgdGhlIG5hbWVkIGJyYW5jaGVzLCBkbyBub3QKKwkgKiBvbWl0IGl0LgorCSAqIE90aGVyd2lzZSwgaWYgaXQgaXMgYSBtZXJnZSB0aGF0IGlzIHJlYWNoYWJsZSBmcm9tIG9ubHkgb25lCisJICogdGlwLCBpdCBpcyBub3QgdGhhdCBpbnRlcmVzdGluZy4KKwkgKi8KKwlpbnQgaSwgZmxhZywgY291bnQ7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKHJldltpXSA9PSBjb21taXQpCisJCQlyZXR1cm4gMDsKKwlmbGFnID0gY29tbWl0LT5vYmplY3QuZmxhZ3M7CisJZm9yIChpID0gY291bnQgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWlmIChmbGFnICYgKDF1IDw8IChpICsgUkVWX1NISUZUKSkpCisJCQljb3VudCsrOworCX0KKwlpZiAoY291bnQgPT0gMSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfc2hvd19icmFuY2goaW50IGFjLCBjb25zdCBjaGFyICoqYXYsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgY29tbWl0ICpyZXZbTUFYX1JFVlNdLCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IE5VTEwsICpzZWVuID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcmV2X21hc2tbTUFYX1JFVlNdOworCWludCBudW1fcmV2LCBpLCBleHRyYSA9IDA7CisJaW50IGFsbF9oZWFkcyA9IDAsIGFsbF90YWdzID0gMDsKKwlpbnQgYWxsX21hc2ssIGFsbF9yZXZzOworCWludCBsaWZvID0gMTsKKwljaGFyIGhlYWRfcGF0aFsxMjhdOworCWNvbnN0IGNoYXIgKmhlYWRfcGF0aF9wOworCWludCBoZWFkX3BhdGhfbGVuOworCXVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKKwlpbnQgbWVyZ2VfYmFzZSA9IDA7CisJaW50IGluZGVwZW5kZW50ID0gMDsKKwlpbnQgbm9fbmFtZSA9IDA7CisJaW50IHNoYTFfbmFtZSA9IDA7CisJaW50IHNob3duX21lcmdlX3BvaW50ID0gMDsKKwlpbnQgd2l0aF9jdXJyZW50X2JyYW5jaCA9IDA7CisJaW50IGhlYWRfYXQgPSAtMTsKKwlpbnQgdG9waWNzID0gMDsKKwlpbnQgZGVuc2UgPSAxOworCisJZ2l0X2NvbmZpZyhnaXRfc2hvd19icmFuY2hfY29uZmlnKTsKKworCS8qIElmIG5vdGhpbmcgaXMgc3BlY2lmaWVkLCB0cnkgdGhlIGRlZmF1bHQgZmlyc3QgKi8KKwlpZiAoYWMgPT0gMSAmJiBkZWZhdWx0X251bSkgeworCQlhYyA9IGRlZmF1bHRfbnVtICsgMTsKKwkJYXYgPSBkZWZhdWx0X2FyZyAtIDE7IC8qIGljazsgd2Ugd291bGQgbm90IGFkZHJlc3MgYXZbMF0gKi8KKwl9CisKKwl3aGlsZSAoMSA8IGFjICYmIGF2WzFdWzBdID09ICctJykgeworCQljb25zdCBjaGFyICphcmcgPSBhdlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJYWMtLTsgYXYrKzsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hbGwiKSkKKwkJCWFsbF9oZWFkcyA9IGFsbF90YWdzID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWhlYWRzIikpCisJCQlhbGxfaGVhZHMgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKQorCQkJYWxsX3RhZ3MgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbW9yZSIpKQorCQkJZXh0cmEgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tbGlzdCIpKQorCQkJZXh0cmEgPSAtMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5vLW5hbWUiKSkKKwkJCW5vX25hbWUgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tY3VycmVudCIpKQorCQkJd2l0aF9jdXJyZW50X2JyYW5jaCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1zaGExLW5hbWUiKSkKKwkJCXNoYTFfbmFtZSA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi0tbW9yZT0iLCA3KSkKKwkJCWV4dHJhID0gYXRvaShhcmcgKyA3KTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW1lcmdlLWJhc2UiKSkKKwkJCW1lcmdlX2Jhc2UgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0taW5kZXBlbmRlbnQiKSkKKwkJCWluZGVwZW5kZW50ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXRvcG8tb3JkZXIiKSkKKwkJCWxpZm8gPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tdG9waWNzIikpCisJCQl0b3BpY3MgPSAxOworCQllbHNlIGlmICghc3RyY21wKGFyZywgIi0tc3BhcnNlIikpCisJCQlkZW5zZSA9IDA7CisJCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1kYXRlLW9yZGVyIikpCisJCQlsaWZvID0gMDsKKwkJZWxzZQorCQkJdXNhZ2Uoc2hvd19icmFuY2hfdXNhZ2UpOworCQlhYy0tOyBhdisrOworCX0KKwlhYy0tOyBhdisrOworCisJLyogT25seSBvbmUgb2YgdGhlc2UgaXMgYWxsb3dlZCAqLworCWlmICgxIDwgaW5kZXBlbmRlbnQgKyBtZXJnZV9iYXNlICsgKGV4dHJhICE9IDApKQorCQl1c2FnZShzaG93X2JyYW5jaF91c2FnZSk7CisKKwkvKiBJZiBub3RoaW5nIGlzIHNwZWNpZmllZCwgc2hvdyBhbGwgYnJhbmNoZXMgYnkgZGVmYXVsdCAqLworCWlmIChhYyArIGFsbF9oZWFkcyArIGFsbF90YWdzID09IDApCisJCWFsbF9oZWFkcyA9IDE7CisKKwlpZiAoYWxsX2hlYWRzICsgYWxsX3RhZ3MpCisJCXNuYXJmX3JlZnMoYWxsX2hlYWRzLCBhbGxfdGFncyk7CisJd2hpbGUgKDAgPCBhYykgeworCQlhcHBlbmRfb25lX3JldigqYXYpOworCQlhYy0tOyBhdisrOworCX0KKworCWhlYWRfcGF0aF9wID0gcmVzb2x2ZV9yZWYoZ2l0X3BhdGgoIkhFQUQiKSwgaGVhZF9zaGExLCAxKTsKKwlpZiAoaGVhZF9wYXRoX3ApIHsKKwkJaGVhZF9wYXRoX2xlbiA9IHN0cmxlbihoZWFkX3BhdGhfcCk7CisJCW1lbWNweShoZWFkX3BhdGgsIGhlYWRfcGF0aF9wLCBoZWFkX3BhdGhfbGVuICsgMSk7CisJfQorCWVsc2UgeworCQloZWFkX3BhdGhfbGVuID0gMDsKKwkJaGVhZF9wYXRoWzBdID0gMDsKKwl9CisKKwlpZiAod2l0aF9jdXJyZW50X2JyYW5jaCAmJiBoZWFkX3BhdGhfcCkgeworCQlpbnQgaGFzX2hlYWQgPSAwOworCQlmb3IgKGkgPSAwOyAhaGFzX2hlYWQgJiYgaSA8IHJlZl9uYW1lX2NudDsgaSsrKSB7CisJCQkvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGFkZGluZyB0aGUgYnJhbmNoCisJCQkgKiBIRUFEIHBvaW50cyBhdC4KKwkJCSAqLworCQkJaWYgKHJldl9pc19oZWFkKGhlYWRfcGF0aCwKKwkJCQkJaGVhZF9wYXRoX2xlbiwKKwkJCQkJcmVmX25hbWVbaV0sCisJCQkJCWhlYWRfc2hhMSwgTlVMTCkpCisJCQkJaGFzX2hlYWQrKzsKKwkJfQorCQlpZiAoIWhhc19oZWFkKSB7CisJCQlpbnQgcGZ4bGVuID0gc3RybGVuKGdpdF9wYXRoKCJyZWZzL2hlYWRzLyIpKTsKKwkJCWFwcGVuZF9vbmVfcmV2KGhlYWRfcGF0aCArIHBmeGxlbik7CisJCX0KKwl9CisKKwlpZiAoIXJlZl9uYW1lX2NudCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHJldnMgdG8gYmUgc2hvd24uXG4iKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlmb3IgKG51bV9yZXYgPSAwOyByZWZfbmFtZVtudW1fcmV2XTsgbnVtX3JldisrKSB7CisJCXVuc2lnbmVkIGNoYXIgcmV2a2V5WzIwXTsKKwkJdW5zaWduZWQgaW50IGZsYWcgPSAxdSA8PCAobnVtX3JldiArIFJFVl9TSElGVCk7CisKKwkJaWYgKE1BWF9SRVZTIDw9IG51bV9yZXYpCisJCQlkaWUoImNhbm5vdCBoYW5kbGUgbW9yZSB0aGFuICVkIHJldnMuIiwgTUFYX1JFVlMpOworCQlpZiAoZ2V0X3NoYTEocmVmX25hbWVbbnVtX3Jldl0sIHJldmtleSkpCisJCQlkaWUoIiclcycgaXMgbm90IGEgdmFsaWQgcmVmLiIsIHJlZl9uYW1lW251bV9yZXZdKTsKKwkJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UocmV2a2V5KTsKKwkJaWYgKCFjb21taXQpCisJCQlkaWUoImNhbm5vdCBmaW5kIGNvbW1pdCAlcyAoJXMpIiwKKwkJCSAgICByZWZfbmFtZVtudW1fcmV2XSwgcmV2a2V5KTsKKwkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisJCW1hcmtfc2Vlbihjb21taXQsICZzZWVuKTsKKworCQkvKiByZXYjMCB1c2VzIGJpdCBSRVZfU0hJRlQsIHJldiMxIHVzZXMgYml0IFJFVl9TSElGVCsxLAorCQkgKiBhbmQgc28gb24uICBSRVZfU0hJRlQgYml0cyBmcm9tIGJpdCAwIGFyZSB1c2VkIGZvcgorCQkgKiBpbnRlcm5hbCBib29ra2VlcGluZy4KKwkJICovCisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IGZsYWc7CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyA9PSBmbGFnKQorCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmbGlzdCk7CisJCXJldltudW1fcmV2XSA9IGNvbW1pdDsKKwl9CisJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykKKwkJcmV2X21hc2tbaV0gPSByZXZbaV0tPm9iamVjdC5mbGFnczsKKworCWlmICgwIDw9IGV4dHJhKQorCQlqb2luX3JldnMoJmxpc3QsICZzZWVuLCBudW1fcmV2LCBleHRyYSk7CisKKwlzb3J0X2J5X2RhdGUoJnNlZW4pOworCisJaWYgKG1lcmdlX2Jhc2UpCisJCXJldHVybiBzaG93X21lcmdlX2Jhc2Uoc2VlbiwgbnVtX3Jldik7CisKKwlpZiAoaW5kZXBlbmRlbnQpCisJCXJldHVybiBzaG93X2luZGVwZW5kZW50KHJldiwgbnVtX3JldiwgcmVmX25hbWUsIHJldl9tYXNrKTsKKworCS8qIFNob3cgbGlzdDsgLS1tb3JlPS0xIG1lYW5zIGxpc3Qtb25seSAqLworCWlmICgxIDwgbnVtX3JldiB8fCBleHRyYSA8IDApIHsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykgeworCQkJaW50IGo7CisJCQlpbnQgaXNfaGVhZCA9IHJldl9pc19oZWFkKGhlYWRfcGF0aCwKKwkJCQkJCSAgaGVhZF9wYXRoX2xlbiwKKwkJCQkJCSAgcmVmX25hbWVbaV0sCisJCQkJCQkgIGhlYWRfc2hhMSwKKwkJCQkJCSAgcmV2W2ldLT5vYmplY3Quc2hhMSk7CisJCQlpZiAoZXh0cmEgPCAwKQorCQkJCXByaW50ZigiJWMgWyVzXSAiLAorCQkJCSAgICAgICBpc19oZWFkID8gJyonIDogJyAnLCByZWZfbmFtZVtpXSk7CisJCQllbHNlIHsKKwkJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCQlwdXRjaGFyKCcgJyk7CisJCQkJcHJpbnRmKCIlYyBbJXNdICIsCisJCQkJICAgICAgIGlzX2hlYWQgPyAnKicgOiAnIScsIHJlZl9uYW1lW2ldKTsKKwkJCX0KKwkJCS8qIGhlYWRlciBsaW5lcyBuZXZlciBuZWVkIG5hbWUgKi8KKwkJCXNob3dfb25lX2NvbW1pdChyZXZbaV0sIDEpOworCQkJaWYgKGlzX2hlYWQpCisJCQkJaGVhZF9hdCA9IGk7CisJCX0KKwkJaWYgKDAgPD0gZXh0cmEpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBudW1fcmV2OyBpKyspCisJCQkJcHV0Y2hhcignLScpOworCQkJcHV0Y2hhcignXG4nKTsKKwkJfQorCX0KKwlpZiAoZXh0cmEgPCAwKQorCQlleGl0KDApOworCisJLyogU29ydCB0b3BvbG9naWNhbGx5ICovCisJc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcigmc2VlbiwgbGlmbyk7CisKKwkvKiBHaXZlIG5hbWVzIHRvIGNvbW1pdHMgKi8KKwlpZiAoIXNoYTFfbmFtZSAmJiAhbm9fbmFtZSkKKwkJbmFtZV9jb21taXRzKHNlZW4sIHJldiwgcmVmX25hbWUsIG51bV9yZXYpOworCisJYWxsX21hc2sgPSAoKDF1IDw8IChSRVZfU0hJRlQgKyBudW1fcmV2KSkgLSAxKTsKKwlhbGxfcmV2cyA9IGFsbF9tYXNrICYgfigoMXUgPDwgUkVWX1NISUZUKSAtIDEpOworCisJd2hpbGUgKHNlZW4pIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gcG9wX29uZV9jb21taXQoJnNlZW4pOworCQlpbnQgdGhpc19mbGFnID0gY29tbWl0LT5vYmplY3QuZmxhZ3M7CisJCWludCBpc19tZXJnZV9wb2ludCA9ICgodGhpc19mbGFnICYgYWxsX3JldnMpID09IGFsbF9yZXZzKTsKKworCQlzaG93bl9tZXJnZV9wb2ludCB8PSBpc19tZXJnZV9wb2ludDsKKworCQlpZiAoMSA8IG51bV9yZXYpIHsKKwkJCWludCBpc19tZXJnZSA9ICEhKGNvbW1pdC0+cGFyZW50cyAmJgorCQkJCQkgIGNvbW1pdC0+cGFyZW50cy0+bmV4dCk7CisJCQlpZiAodG9waWNzICYmCisJCQkgICAgIWlzX21lcmdlX3BvaW50ICYmCisJCQkgICAgKHRoaXNfZmxhZyAmICgxdSA8PCBSRVZfU0hJRlQpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZW5zZSAmJiBpc19tZXJnZSAmJgorCQkJICAgIG9taXRfaW5fZGVuc2UoY29tbWl0LCByZXYsIG51bV9yZXYpKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChpID0gMDsgaSA8IG51bV9yZXY7IGkrKykgeworCQkJCWludCBtYXJrOworCQkJCWlmICghKHRoaXNfZmxhZyAmICgxdSA8PCAoaSArIFJFVl9TSElGVCkpKSkKKwkJCQkJbWFyayA9ICcgJzsKKwkJCQllbHNlIGlmIChpc19tZXJnZSkKKwkJCQkJbWFyayA9ICctJzsKKwkJCQllbHNlIGlmIChpID09IGhlYWRfYXQpCisJCQkJCW1hcmsgPSAnKic7CisJCQkJZWxzZQorCQkJCQltYXJrID0gJysnOworCQkJCXB1dGNoYXIobWFyayk7CisJCQl9CisJCQlwdXRjaGFyKCcgJyk7CisJCX0KKwkJc2hvd19vbmVfY29tbWl0KGNvbW1pdCwgbm9fbmFtZSk7CisKKwkJaWYgKHNob3duX21lcmdlX3BvaW50ICYmIC0tZXh0cmEgPCAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi1zdHJpcHNwYWNlLmMgYi9idWlsdGluLXN0cmlwc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWNjOTEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi1zdHJpcHNwYWNlLmMKQEAgLTAsMCArMSw2MSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJidWlsdGluLmgiCisKKy8qCisgKiBSZW1vdmUgZW1wdHkgbGluZXMgZnJvbSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQuCisgKgorICogVHVybiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBlbXB0eSBsaW5lcyBpbnRvIGp1c3Qgb25lCisgKiBlbXB0eSBsaW5lLiAgUmV0dXJuIHRydWUgaWYgaXQgaXMgYW4gaW5jb21wbGV0ZSBsaW5lLgorICovCitzdGF0aWMgaW50IGNsZWFudXAoY2hhciAqbGluZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKGxpbmUpOworCisJaWYgKGxlbiAmJiBsaW5lW2xlbi0xXSA9PSAnXG4nKSB7CisJCWlmIChsZW4gPT0gMSkKKwkJCXJldHVybiAwOworCQlkbyB7CisJCQl1bnNpZ25lZCBjaGFyIGMgPSBsaW5lW2xlbi0yXTsKKwkJCWlmICghaXNzcGFjZShjKSkKKwkJCQlicmVhazsKKwkJCWxpbmVbbGVuLTJdID0gJ1xuJzsKKwkJCWxlbi0tOworCQkJbGluZVtsZW5dID0gMDsKKwkJfSB3aGlsZSAobGVuID4gMSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBzdHJpcHNwYWNlKEZJTEUgKmluLCBGSUxFICpvdXQpCit7CisJaW50IGVtcHRpZXMgPSAtMTsKKwlpbnQgaW5jb21wbGV0ZSA9IDA7CisJY2hhciBsaW5lWzEwMjRdOworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CisJCWluY29tcGxldGUgPSBjbGVhbnVwKGxpbmUpOworCisJCS8qIE5vdCBqdXN0IGFuIGVtcHR5IGxpbmU/ICovCisJCWlmIChsaW5lWzBdICE9ICdcbicpIHsKKwkJCWlmIChlbXB0aWVzID4gMCkKKwkJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJZW1wdGllcyA9IDA7CisJCQlmcHV0cyhsaW5lLCBvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGVtcHRpZXMgPCAwKQorCQkJY29udGludWU7CisJCWVtcHRpZXMrKzsKKwl9CisJaWYgKGluY29tcGxldGUpCisJCWZwdXRjKCdcbicsIG91dCk7Cit9CisKK2ludCBjbWRfc3RyaXBzcGFjZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJpcHNwYWNlKHN0ZGluLCBzdGRvdXQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi10YXItdHJlZS5jIGIvYnVpbHRpbi10YXItdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTg5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsdGluLXRhci10cmVlLmMKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgUmVuZSBTY2hhcmZlCisgKi8KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKyNpbmNsdWRlICJ0YXIuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKworI2RlZmluZSBSRUNPUkRTSVpFCSg1MTIpCisjZGVmaW5lIEJMT0NLU0laRQkoUkVDT1JEU0laRSAqIDIwKQorCitzdGF0aWMgY29uc3QgY2hhciB0YXJfdHJlZV91c2FnZVtdID0KKyJnaXQtdGFyLXRyZWUgWy0tcmVtb3RlPTxyZXBvPl0gPGVudD4gW2Jhc2VkaXJdIjsKKworc3RhdGljIGNoYXIgYmxvY2tbQkxPQ0tTSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9mZnNldDsKKworc3RhdGljIHRpbWVfdCBhcmNoaXZlX3RpbWU7CitzdGF0aWMgaW50IHRhcl91bWFzazsKKworLyogdHJpZXMgaGFyZCB0byB3cml0ZSwgZWl0aGVyIHN1Y2NlZWRzIG9yIGRpZXMgaW4gdGhlIGF0dGVtcHQgKi8KK3N0YXRpYyB2b2lkIHJlbGlhYmxlX3dyaXRlKGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwljb25zdCBjaGFyICpidWYgPSBkYXRhOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCWxvbmcgcmV0ID0geHdyaXRlKDEsIGJ1Ziwgc2l6ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRVBJUEUpCisJCQkJZXhpdCgwKTsKKwkJCWRpZSgiZ2l0LXRhci10cmVlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSBpZiAoIXJldCkgeworCQkJZGllKCJnaXQtdGFyLXRyZWU6IGRpc2sgZnVsbD8iKTsKKwkJfQorCQlzaXplIC09IHJldDsKKwkJYnVmICs9IHJldDsKKwl9Cit9CisKKy8qIHdyaXRlcyBvdXQgdGhlIHdob2xlIGJsb2NrLCBidXQgb25seSBpZiBpdCBpcyBmdWxsICovCitzdGF0aWMgdm9pZCB3cml0ZV9pZl9uZWVkZWQodm9pZCkKK3sKKwlpZiAob2Zmc2V0ID09IEJMT0NLU0laRSkgeworCQlyZWxpYWJsZV93cml0ZShibG9jaywgQkxPQ0tTSVpFKTsKKwkJb2Zmc2V0ID0gMDsKKwl9Cit9CisKKy8qCisgKiBxdWV1ZXMgdXAgd3JpdGVzLCBzbyB0aGF0IGFsbCBvdXIgd3JpdGUoMikgY2FsbHMgd3JpdGUgZXhhY3RseSBvbmUKKyAqIGZ1bGwgYmxvY2s7IHBhZHMgd3JpdGVzIHRvIFJFQ09SRFNJWkUKKyAqLworc3RhdGljIHZvaWQgd3JpdGVfYmxvY2tlZChjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJY29uc3QgY2hhciAqYnVmID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRhaWw7CisKKwlpZiAob2Zmc2V0KSB7CisJCXVuc2lnbmVkIGxvbmcgY2h1bmsgPSBCTE9DS1NJWkUgLSBvZmZzZXQ7CisJCWlmIChzaXplIDwgY2h1bmspCisJCQljaHVuayA9IHNpemU7CisJCW1lbWNweShibG9jayArIG9mZnNldCwgYnVmLCBjaHVuayk7CisJCXNpemUgLT0gY2h1bms7CisJCW9mZnNldCArPSBjaHVuazsKKwkJYnVmICs9IGNodW5rOworCQl3cml0ZV9pZl9uZWVkZWQoKTsKKwl9CisJd2hpbGUgKHNpemUgPj0gQkxPQ0tTSVpFKSB7CisJCXJlbGlhYmxlX3dyaXRlKGJ1ZiwgQkxPQ0tTSVpFKTsKKwkJc2l6ZSAtPSBCTE9DS1NJWkU7CisJCWJ1ZiArPSBCTE9DS1NJWkU7CisJfQorCWlmIChzaXplKSB7CisJCW1lbWNweShibG9jayArIG9mZnNldCwgYnVmLCBzaXplKTsKKwkJb2Zmc2V0ICs9IHNpemU7CisJfQorCXRhaWwgPSBvZmZzZXQgJSBSRUNPUkRTSVpFOworCWlmICh0YWlsKSAgeworCQltZW1zZXQoYmxvY2sgKyBvZmZzZXQsIDAsIFJFQ09SRFNJWkUgLSB0YWlsKTsKKwkJb2Zmc2V0ICs9IFJFQ09SRFNJWkUgLSB0YWlsOworCX0KKwl3cml0ZV9pZl9uZWVkZWQoKTsKK30KKworLyoKKyAqIFRoZSBlbmQgb2YgdGFyIGFyY2hpdmVzIGlzIG1hcmtlZCBieSAyKjUxMiBudWwgYnl0ZXMgYW5kIGFmdGVyIHRoYXQKKyAqIGZvbGxvd3MgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIChpZiBhbnkpLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV90cmFpbGVyKHZvaWQpCit7CisJaW50IHRhaWwgPSBCTE9DS1NJWkUgLSBvZmZzZXQ7CisJbWVtc2V0KGJsb2NrICsgb2Zmc2V0LCAwLCB0YWlsKTsKKwlyZWxpYWJsZV93cml0ZShibG9jaywgQkxPQ0tTSVpFKTsKKwlpZiAodGFpbCA8IDIgKiBSRUNPUkRTSVpFKSB7CisJCW1lbXNldChibG9jaywgMCwgb2Zmc2V0KTsKKwkJcmVsaWFibGVfd3JpdGUoYmxvY2ssIEJMT0NLU0laRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdHJidWZfYXBwZW5kX3N0cmluZyhzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgc2xlbiA9IHN0cmxlbihzKTsKKwlpbnQgdG90YWwgPSBzYi0+bGVuICsgc2xlbjsKKwlpZiAodG90YWwgPiBzYi0+YWxsb2MpIHsKKwkJc2ItPmJ1ZiA9IHhyZWFsbG9jKHNiLT5idWYsIHRvdGFsKTsKKwkJc2ItPmFsbG9jID0gdG90YWw7CisJfQorCW1lbWNweShzYi0+YnVmICsgc2ItPmxlbiwgcywgc2xlbik7CisJc2ItPmxlbiA9IHRvdGFsOworfQorCisvKgorICogcGF4IGV4dGVuZGVkIGhlYWRlciByZWNvcmRzIGhhdmUgdGhlIGZvcm1hdCAiJXUgJXM9JXNcbiIuICAldSBjb250YWlucworICogdGhlIHNpemUgb2YgdGhlIHdob2xlIHN0cmluZyAoaW5jbHVkaW5nIHRoZSAldSksIHRoZSBmaXJzdCAlcyBpcyB0aGUKKyAqIGtleXdvcmQsIHRoZSBzZWNvbmQgb25lIGlzIHRoZSB2YWx1ZS4gIFRoaXMgZnVuY3Rpb24gY29uc3RydWN0cyBzdWNoIGEKKyAqIHN0cmluZyBhbmQgYXBwZW5kcyBpdCB0byBhIHN0cnVjdCBzdHJidWYuCisgKi8KK3N0YXRpYyB2b2lkIHN0cmJ1Zl9hcHBlbmRfZXh0X2hlYWRlcihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqa2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSwgdW5zaWduZWQgaW50IHZhbHVlbGVuKQoreworCWNoYXIgKnA7CisJaW50IGxlbiwgdG90YWwsIHRtcDsKKworCS8qICIldSAlcz0lc1xuIiAqLworCWxlbiA9IDEgKyAxICsgc3RybGVuKGtleXdvcmQpICsgMSArIHZhbHVlbGVuICsgMTsKKwlmb3IgKHRtcCA9IGxlbjsgdG1wID4gOTsgdG1wIC89IDEwKQorCQlsZW4rKzsKKworCXRvdGFsID0gc2ItPmxlbiArIGxlbjsKKwlpZiAodG90YWwgPiBzYi0+YWxsb2MpIHsKKwkJc2ItPmJ1ZiA9IHhyZWFsbG9jKHNiLT5idWYsIHRvdGFsKTsKKwkJc2ItPmFsbG9jID0gdG90YWw7CisJfQorCisJcCA9IHNiLT5idWY7CisJcCArPSBzcHJpbnRmKHAsICIldSAlcz0iLCBsZW4sIGtleXdvcmQpOworCW1lbWNweShwLCB2YWx1ZSwgdmFsdWVsZW4pOworCXAgKz0gdmFsdWVsZW47CisJKnAgPSAnXG4nOworCXNiLT5sZW4gPSB0b3RhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB1c3Rhcl9oZWFkZXJfY2hrc3VtKGNvbnN0IHN0cnVjdCB1c3Rhcl9oZWFkZXIgKmhlYWRlcikKK3sKKwljaGFyICpwID0gKGNoYXIgKiloZWFkZXI7CisJdW5zaWduZWQgaW50IGNoa3N1bSA9IDA7CisJd2hpbGUgKHAgPCBoZWFkZXItPmNoa3N1bSkKKwkJY2hrc3VtICs9ICpwKys7CisJY2hrc3VtICs9IHNpemVvZihoZWFkZXItPmNoa3N1bSkgKiAnICc7CisJcCArPSBzaXplb2YoaGVhZGVyLT5jaGtzdW0pOworCXdoaWxlIChwIDwgKGNoYXIgKiloZWFkZXIgKyBzaXplb2Yoc3RydWN0IHVzdGFyX2hlYWRlcikpCisJCWNoa3N1bSArPSAqcCsrOworCXJldHVybiBjaGtzdW07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BhdGhfcHJlZml4KGNvbnN0IHN0cnVjdCBzdHJidWYgKnBhdGgsIGludCBtYXhsZW4pCit7CisJaW50IGkgPSBwYXRoLT5sZW47CisJaWYgKGkgPiBtYXhsZW4pCisJCWkgPSBtYXhsZW47CisJZG8geworCQlpLS07CisJfSB3aGlsZSAoaSA+IDAgJiYgcGF0aC0+YnVmW2ldICE9ICcvJyk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBzdHJidWYgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHVzdGFyX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IHN0cmJ1ZiBleHRfaGVhZGVyOworCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKwlleHRfaGVhZGVyLmJ1ZiA9IE5VTEw7CisJZXh0X2hlYWRlci5sZW4gPSBleHRfaGVhZGVyLmFsbG9jID0gMDsKKworCWlmICghc2hhMSkgeworCQkqaGVhZGVyLnR5cGVmbGFnID0gVFlQRUZMQUdfR0xPQkFMX0hFQURFUjsKKwkJbW9kZSA9IDAxMDA2NjY7CisJCXN0cmNweShoZWFkZXIubmFtZSwgInBheF9nbG9iYWxfaGVhZGVyIik7CisJfSBlbHNlIGlmICghcGF0aCkgeworCQkqaGVhZGVyLnR5cGVmbGFnID0gVFlQRUZMQUdfRVhUX0hFQURFUjsKKwkJbW9kZSA9IDAxMDA2NjY7CisJCXNwcmludGYoaGVhZGVyLm5hbWUsICIlcy5wYXhoZWFkZXIiLCBzaGExX3RvX2hleChzaGExKSk7CisJfSBlbHNlIHsKKwkJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJCSpoZWFkZXIudHlwZWZsYWcgPSBUWVBFRkxBR19ESVI7CisJCQltb2RlID0gKG1vZGUgfCAwNzc3KSAmIH50YXJfdW1hc2s7CisJCX0gZWxzZSBpZiAoU19JU0xOSyhtb2RlKSkgeworCQkJKmhlYWRlci50eXBlZmxhZyA9IFRZUEVGTEFHX0xOSzsKKwkJCW1vZGUgfD0gMDc3NzsKKwkJfSBlbHNlIGlmIChTX0lTUkVHKG1vZGUpKSB7CisJCQkqaGVhZGVyLnR5cGVmbGFnID0gVFlQRUZMQUdfUkVHOworCQkJbW9kZSA9IChtb2RlIHwgKChtb2RlICYgMDEwMCkgPyAwNzc3IDogMDY2NikpICYgfnRhcl91bWFzazsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bnN1cHBvcnRlZCBmaWxlIG1vZGU6IDAlbyAoU0hBMTogJXMpIiwKKwkJCSAgICAgIG1vZGUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAocGF0aC0+bGVuID4gc2l6ZW9mKGhlYWRlci5uYW1lKSkgeworCQkJaW50IHBsZW4gPSBnZXRfcGF0aF9wcmVmaXgocGF0aCwgc2l6ZW9mKGhlYWRlci5wcmVmaXgpKTsKKwkJCWludCByZXN0ID0gcGF0aC0+bGVuIC0gcGxlbiAtIDE7CisJCQlpZiAocGxlbiA+IDAgJiYgcmVzdCA8PSBzaXplb2YoaGVhZGVyLm5hbWUpKSB7CisJCQkJbWVtY3B5KGhlYWRlci5wcmVmaXgsIHBhdGgtPmJ1ZiwgcGxlbik7CisJCQkJbWVtY3B5KGhlYWRlci5uYW1lLCBwYXRoLT5idWYgKyBwbGVuICsgMSwgcmVzdCk7CisJCQl9IGVsc2UgeworCQkJCXNwcmludGYoaGVhZGVyLm5hbWUsICIlcy5kYXRhIiwKKwkJCQkgICAgICAgIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJCQlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJwYXRoIiwKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC0+YnVmLCBwYXRoLT5sZW4pOworCQkJfQorCQl9IGVsc2UKKwkJCW1lbWNweShoZWFkZXIubmFtZSwgcGF0aC0+YnVmLCBwYXRoLT5sZW4pOworCX0KKworCWlmIChTX0lTTE5LKG1vZGUpICYmIGJ1ZmZlcikgeworCQlpZiAoc2l6ZSA+IHNpemVvZihoZWFkZXIubGlua25hbWUpKSB7CisJCQlzcHJpbnRmKGhlYWRlci5saW5rbmFtZSwgInNlZSAlcy5wYXhoZWFkZXIiLAorCQkJICAgICAgICBzaGExX3RvX2hleChzaGExKSk7CisJCQlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJsaW5rcGF0aCIsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKwkJfSBlbHNlCisJCQltZW1jcHkoaGVhZGVyLmxpbmtuYW1lLCBidWZmZXIsIHNpemUpOworCX0KKworCXNwcmludGYoaGVhZGVyLm1vZGUsICIlMDdvIiwgbW9kZSAmIDA3Nzc3KTsKKwlzcHJpbnRmKGhlYWRlci5zaXplLCAiJTAxMWxvIiwgU19JU1JFRyhtb2RlKSA/IHNpemUgOiAwKTsKKwlzcHJpbnRmKGhlYWRlci5tdGltZSwgIiUwMTFsbyIsIGFyY2hpdmVfdGltZSk7CisKKwkvKiBYWFg6IHNob3VsZCB3ZSBwcm92aWRlIG1vcmUgbWVhbmluZ2Z1bCBpbmZvIGhlcmU/ICovCisJc3ByaW50ZihoZWFkZXIudWlkLCAiJTA3byIsIDApOworCXNwcmludGYoaGVhZGVyLmdpZCwgIiUwN28iLCAwKTsKKwlzdHJsY3B5KGhlYWRlci51bmFtZSwgImdpdCIsIHNpemVvZihoZWFkZXIudW5hbWUpKTsKKwlzdHJsY3B5KGhlYWRlci5nbmFtZSwgImdpdCIsIHNpemVvZihoZWFkZXIuZ25hbWUpKTsKKwlzcHJpbnRmKGhlYWRlci5kZXZtYWpvciwgIiUwN28iLCAwKTsKKwlzcHJpbnRmKGhlYWRlci5kZXZtaW5vciwgIiUwN28iLCAwKTsKKworCW1lbWNweShoZWFkZXIubWFnaWMsICJ1c3RhciIsIDYpOworCW1lbWNweShoZWFkZXIudmVyc2lvbiwgIjAwIiwgMik7CisKKwlzcHJpbnRmKGhlYWRlci5jaGtzdW0sICIlMDdvIiwgdXN0YXJfaGVhZGVyX2Noa3N1bSgmaGVhZGVyKSk7CisKKwlpZiAoZXh0X2hlYWRlci5sZW4gPiAwKSB7CisJCXdyaXRlX2VudHJ5KHNoYTEsIE5VTEwsIDAsIGV4dF9oZWFkZXIuYnVmLCBleHRfaGVhZGVyLmxlbik7CisJCWZyZWUoZXh0X2hlYWRlci5idWYpOworCX0KKwl3cml0ZV9ibG9ja2VkKCZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKwlpZiAoU19JU1JFRyhtb2RlKSAmJiBidWZmZXIgJiYgc2l6ZSA+IDApCisJCXdyaXRlX2Jsb2NrZWQoYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZ2xvYmFsX2V4dGVuZGVkX2hlYWRlcihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdHJidWYgZXh0X2hlYWRlcjsKKwlleHRfaGVhZGVyLmJ1ZiA9IE5VTEw7CisJZXh0X2hlYWRlci5sZW4gPSBleHRfaGVhZGVyLmFsbG9jID0gMDsKKwlzdHJidWZfYXBwZW5kX2V4dF9oZWFkZXIoJmV4dF9oZWFkZXIsICJjb21tZW50Iiwgc2hhMV90b19oZXgoc2hhMSksIDQwKTsKKwl3cml0ZV9lbnRyeShOVUxMLCBOVUxMLCAwLCBleHRfaGVhZGVyLmJ1ZiwgZXh0X2hlYWRlci5sZW4pOworCWZyZWUoZXh0X2hlYWRlci5idWYpOworfQorCitzdGF0aWMgdm9pZCB0cmF2ZXJzZV90cmVlKHN0cnVjdCB0cmVlX2Rlc2MgKnRyZWUsIHN0cnVjdCBzdHJidWYgKnBhdGgpCit7CisJaW50IHBhdGhsZW4gPSBwYXRoLT5sZW47CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSh0cmVlLCAmZW50cnkpKSB7CisJCXZvaWQgKmVsdGJ1ZjsKKwkJY2hhciBlbHR0eXBlWzIwXTsKKwkJdW5zaWduZWQgbG9uZyBlbHRzaXplOworCisJCWVsdGJ1ZiA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LnNoYTEsIGVsdHR5cGUsICZlbHRzaXplKTsKKwkJaWYgKCFlbHRidWYpCisJCQlkaWUoImNhbm5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoZW50cnkuc2hhMSkpOworCisJCXBhdGgtPmxlbiA9IHBhdGhsZW47CisJCXN0cmJ1Zl9hcHBlbmRfc3RyaW5nKHBhdGgsIGVudHJ5LnBhdGgpOworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCXN0cmJ1Zl9hcHBlbmRfc3RyaW5nKHBhdGgsICIvIik7CisKKwkJd3JpdGVfZW50cnkoZW50cnkuc2hhMSwgcGF0aCwgZW50cnkubW9kZSwgZWx0YnVmLCBlbHRzaXplKTsKKworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJc3RydWN0IHRyZWVfZGVzYyBzdWJ0cmVlOworCQkJc3VidHJlZS5idWYgPSBlbHRidWY7CisJCQlzdWJ0cmVlLnNpemUgPSBlbHRzaXplOworCQkJdHJhdmVyc2VfdHJlZSgmc3VidHJlZSwgcGF0aCk7CisJCX0KKwkJZnJlZShlbHRidWYpOworCX0KK30KKworaW50IGdpdF90YXJfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAodmFyLCAidGFyLnVtYXNrIikpIHsKKwkJaWYgKCFzdHJjbXAodmFsdWUsICJ1c2VyIikpIHsKKwkJCXRhcl91bWFzayA9IHVtYXNrKDApOworCQkJdW1hc2sodGFyX3VtYXNrKTsKKwkJfSBlbHNlIHsKKwkJCXRhcl91bWFzayA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3RhcihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCB0cmVlX3NoYTFbMjBdOworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIHRyZWU7CisJc3RydWN0IHN0cmJ1ZiBjdXJyZW50X3BhdGg7CisJdm9pZCAqYnVmZmVyOworCisJY3VycmVudF9wYXRoLmJ1ZiA9IHhtYWxsb2MoUEFUSF9NQVgpOworCWN1cnJlbnRfcGF0aC5hbGxvYyA9IFBBVEhfTUFYOworCWN1cnJlbnRfcGF0aC5sZW4gPSBjdXJyZW50X3BhdGguZW9mID0gMDsKKworCWdpdF9jb25maWcoZ2l0X3Rhcl9jb25maWcpOworCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAzOgorCQlzdHJidWZfYXBwZW5kX3N0cmluZygmY3VycmVudF9wYXRoLCBhcmd2WzJdKTsKKwkJc3RyYnVmX2FwcGVuZF9zdHJpbmcoJmN1cnJlbnRfcGF0aCwgIi8iKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIDI6CisJCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSkKKwkJCWRpZSgiTm90IGEgdmFsaWQgb2JqZWN0IG5hbWUgJXMiLCBhcmd2WzFdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdXNhZ2UodGFyX3RyZWVfdXNhZ2UpOworCX0KKworCWNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpZiAoY29tbWl0KSB7CisJCXdyaXRlX2dsb2JhbF9leHRlbmRlZF9oZWFkZXIoY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCWFyY2hpdmVfdGltZSA9IGNvbW1pdC0+ZGF0ZTsKKwl9IGVsc2UKKwkJYXJjaGl2ZV90aW1lID0gdGltZShOVUxMKTsKKworCXRyZWUuYnVmID0gYnVmZmVyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgdHJlZV90eXBlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyZWUuc2l6ZSwgdHJlZV9zaGExKTsKKwlpZiAoIXRyZWUuYnVmKQorCQlkaWUoIm5vdCBhIHJlZmVyZW5jZSB0byBhIHRhZywgY29tbWl0IG9yIHRyZWUgb2JqZWN0OiAlcyIsCisJCSAgICBzaGExX3RvX2hleChzaGExKSk7CisKKwlpZiAoY3VycmVudF9wYXRoLmxlbiA+IDApCisJCXdyaXRlX2VudHJ5KHRyZWVfc2hhMSwgJmN1cnJlbnRfcGF0aCwgMDQwNzc3LCBOVUxMLCAwKTsKKwl0cmF2ZXJzZV90cmVlKCZ0cmVlLCAmY3VycmVudF9wYXRoKTsKKwl3cml0ZV90cmFpbGVyKCk7CisJZnJlZShidWZmZXIpOworCWZyZWUoY3VycmVudF9wYXRoLmJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjID0gImdpdC11cGxvYWQtdGFyIjsKKworc3RhdGljIGludCByZW1vdGVfdGFyKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmRbMl0sIHJldCwgbGVuOworCXBpZF90IHBpZDsKKwljaGFyIGJ1ZlsxMDI0XTsKKwljaGFyICp1cmw7CisKKwlpZiAoYXJnYyA8IDMgfHwgNCA8IGFyZ2MpCisJCXVzYWdlKHRhcl90cmVlX3VzYWdlKTsKKworCS8qIC0tcmVtb3RlPTxyZXBvPiAqLworCXVybCA9IHN0cmR1cChhcmd2WzFdKzkpOworCXBpZCA9IGdpdF9jb25uZWN0KGZkLCB1cmwsIGV4ZWMpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gMTsKKworCXBhY2tldF93cml0ZShmZFsxXSwgIndhbnQgJXNcbiIsIGFyZ3ZbMl0pOworCWlmIChhcmd2WzNdKQorCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJiYXNlICVzXG4iLCBhcmd2WzNdKTsKKwlwYWNrZXRfZmx1c2goZmRbMV0pOworCisJbGVuID0gcGFja2V0X3JlYWRfbGluZShmZFswXSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKCFsZW4pCisJCWRpZSgiZ2l0LXRhci10cmVlOiBleHBlY3RlZCBBQ0svTkFLLCBnb3QgRU9GIik7CisJaWYgKGJ1ZltsZW4tMV0gPT0gJ1xuJykKKwkJYnVmWy0tbGVuXSA9IDA7CisJaWYgKHN0cmNtcChidWYsICJBQ0siKSkgeworCQlpZiAoNSA8IGxlbiAmJiAhc3RybmNtcChidWYsICJOQUNLICIsIDUpKQorCQkJZGllKCJnaXQtdGFyLXRyZWU6IE5BQ0sgJXMiLCBidWYgKyA1KTsKKwkJZGllKCJnaXQtdGFyLXRyZWU6IHByb3RvY29sIGVycm9yIik7CisJfQorCS8qIGV4cGVjdCBhIGZsdXNoICovCisJbGVuID0gcGFja2V0X3JlYWRfbGluZShmZFswXSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKGxlbikKKwkJZGllKCJnaXQtdGFyLXRyZWU6IGV4cGVjdGVkIGEgZmx1c2giKTsKKworCS8qIE5vdywgc3RhcnQgcmVhZGluZyBmcm9tIGZkWzBdIGFuZCBzcGl0IGl0IG91dCB0byBzdGRvdXQgKi8KKwlyZXQgPSBjb3B5X2ZkKGZkWzBdLCAxKTsKKwljbG9zZShmZFswXSk7CisKKwlyZXQgfD0gZmluaXNoX2Nvbm5lY3QocGlkKTsKKwlyZXR1cm4gISFyZXQ7Cit9CisKK2ludCBjbWRfdGFyX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaWYgKGFyZ2MgPCAyKQorCQl1c2FnZSh0YXJfdHJlZV91c2FnZSk7CisJaWYgKCFzdHJuY21wKCItLXJlbW90ZT0iLCBhcmd2WzFdLCA5KSkKKwkJcmV0dXJuIHJlbW90ZV90YXIoYXJnYywgYXJndik7CisJcmV0dXJuIGdlbmVyYXRlX3RhcihhcmdjLCBhcmd2LCBwcmVmaXgpOworfQorCisvKiB1c3RhciBoZWFkZXIgKyBleHRlbmRlZCBnbG9iYWwgaGVhZGVyIGNvbnRlbnQgKi8KKyNkZWZpbmUgSEVBREVSU0laRSAoMiAqIFJFQ09SRFNJWkUpCisKK2ludCBjbWRfZ2V0X3Rhcl9jb21taXRfaWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY2hhciBidWZmZXJbSEVBREVSU0laRV07CisJc3RydWN0IHVzdGFyX2hlYWRlciAqaGVhZGVyID0gKHN0cnVjdCB1c3Rhcl9oZWFkZXIgKilidWZmZXI7CisJY2hhciAqY29udGVudCA9IGJ1ZmZlciArIFJFQ09SRFNJWkU7CisJc3NpemVfdCBuOworCisJbiA9IHhyZWFkKDAsIGJ1ZmZlciwgSEVBREVSU0laRSk7CisJaWYgKG4gPCBIRUFERVJTSVpFKQorCQlkaWUoImdpdC1nZXQtdGFyLWNvbW1pdC1pZDogcmVhZCBlcnJvciIpOworCWlmIChoZWFkZXItPnR5cGVmbGFnWzBdICE9ICdnJykKKwkJcmV0dXJuIDE7CisJaWYgKG1lbWNtcChjb250ZW50LCAiNTIgY29tbWVudD0iLCAxMSkpCisJCXJldHVybiAxOworCisJbiA9IHh3cml0ZSgxLCBjb250ZW50ICsgMTEsIDQxKTsKKwlpZiAobiA8IDQxKQorCQlkaWUoImdpdC1nZXQtdGFyLWNvbW1pdC1pZDogd3JpdGUgZXJyb3IiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYnVpbHRpbi11cGRhdGUtaW5kZXguYyBiL2J1aWx0aW4tdXBkYXRlLWluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1NTZmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdXBkYXRlLWluZGV4LmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworLyoKKyAqIERlZmF1bHQgdG8gbm90IGFsbG93aW5nIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZmlsZXMuIFRoZQorICogdG9vbCBkb2Vzbid0IGFjdHVhbGx5IGNhcmUsIGJ1dCB0aGlzIG1ha2VzIGl0IGhhcmRlciB0byBhZGQKKyAqIGZpbGVzIHRvIHRoZSByZXZpc2lvbiBjb250cm9sIGJ5IG1pc3Rha2UgYnkgZG9pbmcgc29tZXRoaW5nCisgKiBsaWtlICJnaXQtdXBkYXRlLWluZGV4ICoiIGFuZCBzdWRkZW5seSBoYXZpbmcgYWxsIHRoZSBvYmplY3QKKyAqIGZpbGVzIGJlIHJldmlzaW9uIGNvbnRyb2xsZWQuCisgKi8KK3N0YXRpYyBpbnQgYWxsb3dfYWRkOworc3RhdGljIGludCBhbGxvd19yZW1vdmU7CitzdGF0aWMgaW50IGFsbG93X3JlcGxhY2U7CitzdGF0aWMgaW50IGluZm9fb25seTsKK3N0YXRpYyBpbnQgZm9yY2VfcmVtb3ZlOworc3RhdGljIGludCB2ZXJib3NlOworc3RhdGljIGludCBtYXJrX3ZhbGlkX29ubHkgPSAwOworI2RlZmluZSBNQVJLX1ZBTElEIDEKKyNkZWZpbmUgVU5NQVJLX1ZBTElEIDIKKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdnA7CisKKwlpZiAoIXZlcmJvc2UpCisJCXJldHVybjsKKworCXZhX3N0YXJ0KHZwLCBmbXQpOworCXZwcmludGYoZm10LCB2cCk7CisJcHV0Y2hhcignXG4nKTsKKwl2YV9lbmQodnApOworfQorCitzdGF0aWMgaW50IG1hcmtfdmFsaWQoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihwYXRoKTsKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJaWYgKDAgPD0gcG9zKSB7CisJCXN3aXRjaCAobWFya192YWxpZF9vbmx5KSB7CisJCWNhc2UgTUFSS19WQUxJRDoKKwkJCWFjdGl2ZV9jYWNoZVtwb3NdLT5jZV9mbGFncyB8PSBodG9ucyhDRV9WQUxJRCk7CisJCQlicmVhazsKKwkJY2FzZSBVTk1BUktfVkFMSUQ6CisJCQlhY3RpdmVfY2FjaGVbcG9zXS0+Y2VfZmxhZ3MgJj0gfmh0b25zKENFX1ZBTElEKTsKKwkJCWJyZWFrOworCQl9CisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKwkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGFkZF9maWxlX3RvX2NhY2hlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHNpemUsIG5hbWVsZW4sIG9wdGlvbiwgc3RhdHVzOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlzdGF0dXMgPSBsc3RhdChwYXRoLCAmc3QpOworCisJLyogV2UgcHJvYmFibHkgd2FudCB0byBkbyB0aGlzIGluIHJlbW92ZV9maWxlX2Zyb21fY2FjaGUoKSBhbmQKKwkgKiBhZGRfY2FjaGVfZW50cnkoKSBpbnN0ZWFkLi4uCisJICovCisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCisJaWYgKHN0YXR1cyA8IDAgfHwgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkvKiBXaGVuIHdlIHVzZWQgdG8gaGF2ZSAicGF0aCIgYW5kIG5vdyB3ZSB3YW50IHRvIGFkZAorCQkgKiAicGF0aC9maWxlIiwgd2UgbmVlZCBhIHdheSB0byByZW1vdmUgInBhdGgiIGJlZm9yZQorCQkgKiBiZWluZyBhYmxlIHRvIGFkZCAicGF0aC9maWxlIi4gIEhvd2V2ZXIsCisJCSAqICJnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIHBhdGgiIHdvdWxkIG5vdCB3b3JrLgorCQkgKiAtLWZvcmNlLXJlbW92ZSBjYW4gYmUgdXNlZCBidXQgdGhpcyBpcyBtb3JlIHVzZXIKKwkJICogZnJpZW5kbHksIGVzcGVjaWFsbHkgc2luY2Ugd2UgY2FuIGRvIHRoZSBvcHBvc2l0ZQorCQkgKiBjYXNlIGp1c3QgZmluZSB3aXRob3V0IC0tZm9yY2UtcmVtb3ZlLgorCQkgKi8KKwkJaWYgKHN0YXR1cyA9PSAwIHx8IChlcnJubyA9PSBFTk9FTlQgfHwgZXJybm8gPT0gRU5PVERJUikpIHsKKwkJCWlmIChhbGxvd19yZW1vdmUpIHsKKwkJCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKSkKKwkJCQkJcmV0dXJuIGVycm9yKCIlczogY2Fubm90IHJlbW92ZSBmcm9tIHRoZSBpbmRleCIsCisJCQkJCSAgICAgICAgICAgICBwYXRoKTsKKwkJCQllbHNlCisJCQkJCXJldHVybiAwOworCQkJfSBlbHNlIGlmIChzdGF0dXMgPCAwKSB7CisJCQkJcmV0dXJuIGVycm9yKCIlczogZG9lcyBub3QgZXhpc3QgYW5kIC0tcmVtb3ZlIG5vdCBwYXNzZWQiLAorCQkJCSAgICAgICAgICAgICBwYXRoKTsKKwkJCX0KKwkJfQorCQlpZiAoMCA9PSBzdGF0dXMpCisJCQlyZXR1cm4gZXJyb3IoIiVzOiBpcyBhIGRpcmVjdG9yeSAtIGFkZCBmaWxlcyBpbnNpZGUgaW5zdGVhZCIsCisJCQkgICAgICAgICAgICAgcGF0aCk7CisJCWVsc2UKKwkJCXJldHVybiBlcnJvcigibHN0YXQoXCIlc1wiKTogJXMiLCBwYXRoLAorCQkJCSAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwluYW1lbGVuID0gc3RybGVuKHBhdGgpOworCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKG5hbWVsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIG5hbWVsZW4pOworCWNlLT5jZV9mbGFncyA9IGh0b25zKG5hbWVsZW4pOworCWZpbGxfc3RhdF9jYWNoZV9pbmZvKGNlLCAmc3QpOworCisJY2UtPmNlX21vZGUgPSBjcmVhdGVfY2VfbW9kZShzdC5zdF9tb2RlKTsKKwlpZiAoIXRydXN0X2V4ZWN1dGFibGVfYml0KSB7CisJCS8qIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGVudHJ5LCBwaWNrIHRoZSBtb2RlIGJpdHMKKwkJICogZnJvbSBpdC4KKwkJICovCisJCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBuYW1lbGVuKTsKKwkJaWYgKDAgPD0gcG9zKQorCQkJY2UtPmNlX21vZGUgPSBhY3RpdmVfY2FjaGVbcG9zXS0+Y2VfbW9kZTsKKwl9CisKKwlpZiAoaW5kZXhfcGF0aChjZS0+c2hhMSwgcGF0aCwgJnN0LCAhaW5mb19vbmx5KSkKKwkJcmV0dXJuIC0xOworCW9wdGlvbiA9IGFsbG93X2FkZCA/IEFERF9DQUNIRV9PS19UT19BREQgOiAwOworCW9wdGlvbiB8PSBhbGxvd19yZXBsYWNlID8gQUREX0NBQ0hFX09LX1RPX1JFUExBQ0UgOiAwOworCWlmIChhZGRfY2FjaGVfZW50cnkoY2UsIG9wdGlvbikpCisJCXJldHVybiBlcnJvcigiJXM6IGNhbm5vdCBhZGQgdG8gdGhlIGluZGV4IC0gbWlzc2luZyAtLWFkZCBvcHRpb24/IiwKKwkJCSAgICAgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2NhY2hlaW5mbyh1bnNpZ25lZCBpbnQgbW9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSBjb25zdCBjaGFyICpwYXRoLCBpbnQgc3RhZ2UpCit7CisJaW50IHNpemUsIGxlbiwgb3B0aW9uOworCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoIXZlcmlmeV9wYXRoKHBhdGgpKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisKKwltZW1jcHkoY2UtPnNoYTEsIHNoYTEsIDIwKTsKKwltZW1jcHkoY2UtPm5hbWUsIHBhdGgsIGxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKGxlbiwgc3RhZ2UpOworCWNlLT5jZV9tb2RlID0gY3JlYXRlX2NlX21vZGUobW9kZSk7CisJaWYgKGFzc3VtZV91bmNoYW5nZWQpCisJCWNlLT5jZV9mbGFncyB8PSBodG9ucyhDRV9WQUxJRCk7CisJb3B0aW9uID0gYWxsb3dfYWRkID8gQUREX0NBQ0hFX09LX1RPX0FERCA6IDA7CisJb3B0aW9uIHw9IGFsbG93X3JlcGxhY2UgPyBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRSA6IDA7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgb3B0aW9uKSkKKwkJcmV0dXJuIGVycm9yKCIlczogY2Fubm90IGFkZCB0byB0aGUgaW5kZXggLSBtaXNzaW5nIC0tYWRkIG9wdGlvbj8iLAorCQkJICAgICBwYXRoKTsKKwlyZXBvcnQoImFkZCAnJXMnIiwgcGF0aCk7CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaG1vZF9wYXRoKGludCBmbGlwLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwb3M7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCXBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIHN0cmxlbihwYXRoKSk7CisJaWYgKHBvcyA8IDApCisJCWdvdG8gZmFpbDsKKwljZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCW1vZGUgPSBudG9obChjZS0+Y2VfbW9kZSk7CisJaWYgKCFTX0lTUkVHKG1vZGUpKQorCQlnb3RvIGZhaWw7CisJc3dpdGNoIChmbGlwKSB7CisJY2FzZSAnKyc6CisJCWNlLT5jZV9tb2RlIHw9IGh0b25sKDAxMTEpOyBicmVhazsKKwljYXNlICctJzoKKwkJY2UtPmNlX21vZGUgJj0gaHRvbmwofjAxMTEpOyBicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGZhaWw7CisJfQorCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKwlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJcmVwb3J0KCJjaG1vZCAlY3ggJyVzJyIsIGZsaXAsIHBhdGgpOworCXJldHVybjsKKyBmYWlsOgorCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogY2Fubm90IGNobW9kICVjeCAnJXMnIiwgZmxpcCwgcGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9vbmUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcHJlZml4LCBpbnQgcHJlZml4X2xlbmd0aCkKK3sKKwljb25zdCBjaGFyICpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhfbGVuZ3RoLCBwYXRoKTsKKwlpZiAoIXZlcmlmeV9wYXRoKHApKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgcGF0aCAlc1xuIiwgcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmIChtYXJrX3ZhbGlkX29ubHkpIHsKKwkJaWYgKG1hcmtfdmFsaWQocCkpCisJCQlkaWUoIlVuYWJsZSB0byBtYXJrIGZpbGUgJXMiLCBwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGgpOworCisJaWYgKGZvcmNlX3JlbW92ZSkgeworCQlpZiAocmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwKSkKKwkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogdW5hYmxlIHRvIHJlbW92ZSAlcyIsIHBhdGgpOworCQlyZXBvcnQoInJlbW92ZSAnJXMnIiwgcGF0aCk7CisJCWdvdG8gZnJlZV9yZXR1cm47CisJfQorCWlmIChhZGRfZmlsZV90b19jYWNoZShwKSkKKwkJZGllKCJVbmFibGUgdG8gcHJvY2VzcyBmaWxlICVzIiwgcGF0aCk7CisJcmVwb3J0KCJhZGQgJyVzJyIsIHBhdGgpOworIGZyZWVfcmV0dXJuOgorCWlmIChwIDwgcGF0aCB8fCBwID4gcGF0aCArIHN0cmxlbihwYXRoKSkKKwkJZnJlZSgoY2hhciopcCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfaW5kZXhfaW5mbyhpbnQgbGluZV90ZXJtaW5hdGlvbikKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKwlzdHJidWZfaW5pdCgmYnVmKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpwdHIsICp0YWI7CisJCWNoYXIgKnBhdGhfbmFtZTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCWludCBzdGFnZTsKKworCQkvKiBUaGlzIHJlYWRzIGxpbmVzIGZvcm1hdHRlZCBpbiBvbmUgb2YgdGhyZWUgZm9ybWF0czoKKwkJICoKKwkJICogKDEpIG1vZGUgICAgICAgICBTUCBzaGExICAgICAgICAgIFRBQiBwYXRoCisJCSAqIFRoZSBmaXJzdCBmb3JtYXQgaXMgd2hhdCAiZ2l0LWFwcGx5IC0taW5kZXgtaW5mbyIKKwkJICogcmVwb3J0cywgYW5kIHVzZWQgdG8gcmVjb25zdHJ1Y3QgYSBwYXJ0aWFsIHRyZWUKKwkJICogdGhhdCBpcyB1c2VkIGZvciBwaG9ueSBtZXJnZSBiYXNlIHRyZWUgd2hlbiBmYWxsaW5nCisJCSAqIGJhY2sgb24gMy13YXkgbWVyZ2UuCisJCSAqCisJCSAqICgyKSBtb2RlIFNQIHR5cGUgU1Agc2hhMSAgICAgICAgICBUQUIgcGF0aAorCQkgKiBUaGUgc2Vjb25kIGZvcm1hdCBpcyB0byBzdHVmZiBnaXQtbHMtdHJlZSBvdXRwdXQKKwkJICogaW50byB0aGUgaW5kZXggZmlsZS4KKwkJICoKKwkJICogKDMpIG1vZGUgICAgICAgICBTUCBzaGExIFNQIHN0YWdlIFRBQiBwYXRoCisJCSAqIFRoaXMgZm9ybWF0IGlzIHRvIHB1dCBoaWdoZXIgb3JkZXIgc3RhZ2VzIGludG8gdGhlCisJCSAqIGluZGV4IGZpbGUgYW5kIG1hdGNoZXMgZ2l0LWxzLWZpbGVzIC0tc3RhZ2Ugb3V0cHV0LgorCQkgKi8KKwkJcmVhZF9saW5lKCZidWYsIHN0ZGluLCBsaW5lX3Rlcm1pbmF0aW9uKTsKKwkJaWYgKGJ1Zi5lb2YpCisJCQlicmVhazsKKworCQltb2RlID0gc3RydG91bChidWYuYnVmLCAmcHRyLCA4KTsKKwkJaWYgKHB0ciA9PSBidWYuYnVmIHx8ICpwdHIgIT0gJyAnKQorCQkJZ290byBiYWRfbGluZTsKKworCQl0YWIgPSBzdHJjaHIocHRyLCAnXHQnKTsKKwkJaWYgKCF0YWIgfHwgdGFiIC0gcHRyIDwgNDEpCisJCQlnb3RvIGJhZF9saW5lOworCisJCWlmICh0YWJbLTJdID09ICcgJyAmJiAnMCcgPD0gdGFiWy0xXSAmJiB0YWJbLTFdIDw9ICczJykgeworCQkJc3RhZ2UgPSB0YWJbLTFdIC0gJzAnOworCQkJcHRyID0gdGFiICsgMTsgLyogcG9pbnQgYXQgdGhlIGhlYWQgb2YgcGF0aCAqLworCQkJdGFiID0gdGFiIC0gMjsgLyogcG9pbnQgYXQgdGFpbCBvZiBzaGExICovCisJCX0KKwkJZWxzZSB7CisJCQlzdGFnZSA9IDA7CisJCQlwdHIgPSB0YWIgKyAxOyAvKiBwb2ludCBhdCB0aGUgaGVhZCBvZiBwYXRoICovCisJCX0KKworCQlpZiAoZ2V0X3NoYTFfaGV4KHRhYiAtIDQwLCBzaGExKSB8fCB0YWJbLTQxXSAhPSAnICcpCisJCQlnb3RvIGJhZF9saW5lOworCisJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIHB0clswXSA9PSAnIicpCisJCQlwYXRoX25hbWUgPSB1bnF1b3RlX2Nfc3R5bGUocHRyLCBOVUxMKTsKKwkJZWxzZQorCQkJcGF0aF9uYW1lID0gcHRyOworCisJCWlmICghdmVyaWZ5X3BhdGgocGF0aF9uYW1lKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJJZ25vcmluZyBwYXRoICVzXG4iLCBwYXRoX25hbWUpOworCQkJaWYgKHBhdGhfbmFtZSAhPSBwdHIpCisJCQkJZnJlZShwYXRoX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJY2FjaGVfdHJlZV9pbnZhbGlkYXRlX3BhdGgoYWN0aXZlX2NhY2hlX3RyZWUsIHBhdGhfbmFtZSk7CisKKwkJaWYgKCFtb2RlKSB7CisJCQkvKiBtb2RlID09IDAgbWVhbnMgdGhlcmUgaXMgbm8gc3VjaCBwYXRoIC0tIHJlbW92ZSAqLworCQkJaWYgKHJlbW92ZV9maWxlX2Zyb21fY2FjaGUocGF0aF9uYW1lKSkKKwkJCQlkaWUoImdpdC11cGRhdGUtaW5kZXg6IHVuYWJsZSB0byByZW1vdmUgJXMiLAorCQkJCSAgICBwdHIpOworCQl9CisJCWVsc2UgeworCQkJLyogbW9kZSAnICcgc2hhMSAnXHQnIG5hbWUKKwkJCSAqIHB0clstMV0gcG9pbnRzIGF0IHRhYiwKKwkJCSAqIHB0clstNDFdIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2Ygc2hhMQorCQkJICovCisJCQlwdHJbLTQyXSA9IHB0clstMV0gPSAwOworCQkJaWYgKGFkZF9jYWNoZWluZm8obW9kZSwgc2hhMSwgcGF0aF9uYW1lLCBzdGFnZSkpCisJCQkJZGllKCJnaXQtdXBkYXRlLWluZGV4OiB1bmFibGUgdG8gdXBkYXRlICVzIiwKKwkJCQkgICAgcGF0aF9uYW1lKTsKKwkJfQorCQlpZiAocGF0aF9uYW1lICE9IHB0cikKKwkJCWZyZWUocGF0aF9uYW1lKTsKKwkJY29udGludWU7CisKKwliYWRfbGluZToKKwkJZGllKCJtYWxmb3JtZWQgaW5kZXggaW5mbyAlcyIsIGJ1Zi5idWYpOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgdXBkYXRlX2luZGV4X3VzYWdlW10gPQorImdpdC11cGRhdGUtaW5kZXggWy1xXSBbLS1hZGRdIFstLXJlcGxhY2VdIFstLXJlbW92ZV0gWy0tdW5tZXJnZWRdIFstLXJlZnJlc2hdIFstLXJlYWxseS1yZWZyZXNoXSBbLS1jYWNoZWluZm9dIFstLWNobW9kPSgrfC0peF0gWy0tYXNzdW1lLXVuY2hhbmdlZF0gWy0taW5mby1vbmx5XSBbLS1mb3JjZS1yZW1vdmVdIFstLXN0ZGluXSBbLS1pbmRleC1pbmZvXSBbLS11bnJlc29sdmVdIFstLWFnYWluXSBbLS1pZ25vcmUtbWlzc2luZ10gWy16XSBbLS12ZXJib3NlXSBbLS1dIDxmaWxlPi4uLiI7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBtZXJnZV9oZWFkX3NoYTFbMjBdOworCitzdGF0aWMgc3RydWN0IGNhY2hlX2VudHJ5ICpyZWFkX29uZV9lbnQoY29uc3QgY2hhciAqd2hpY2gsCisJCQkJCXVuc2lnbmVkIGNoYXIgKmVudCwgY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJaW50IG5hbWVsZW4sIGludCBzdGFnZSkKK3sKKwl1bnNpZ25lZCBtb2RlOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHNpemU7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWlmIChnZXRfdHJlZV9lbnRyeShlbnQsIHBhdGgsIHNoYTEsICZtb2RlKSkgeworCQlpZiAod2hpY2gpCisJCQllcnJvcigiJXM6IG5vdCBpbiAlcyBicmFuY2guIiwgcGF0aCwgd2hpY2gpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG1vZGUgPT0gU19JRkRJUikgeworCQlpZiAod2hpY2gpCisJCQllcnJvcigiJXM6IG5vdCBhIGJsb2IgaW4gJXMgYnJhbmNoLiIsIHBhdGgsIHdoaWNoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNpemUgPSBjYWNoZV9lbnRyeV9zaXplKG5hbWVsZW4pOworCWNlID0geGNhbGxvYygxLCBzaXplKTsKKworCW1lbWNweShjZS0+c2hhMSwgc2hhMSwgMjApOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbik7CisJY2UtPmNlX2ZsYWdzID0gY3JlYXRlX2NlX2ZsYWdzKG5hbWVsZW4sIHN0YWdlKTsKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCXJldHVybiBjZTsKK30KKworc3RhdGljIGludCB1bnJlc29sdmVfb25lKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJaW50IHBvczsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlXzIgPSBOVUxMLCAqY2VfMyA9IE5VTEw7CisKKwkvKiBTZWUgaWYgdGhlcmUgaXMgc3VjaCBlbnRyeSBpbiB0aGUgaW5kZXguICovCisJcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgbmFtZWxlbik7CisJaWYgKHBvcyA8IDApIHsKKwkJLyogSWYgdGhlcmUgaXNuJ3QsIGVpdGhlciBpdCBpcyB1bm1lcmdlZCwgb3IKKwkJICogcmVzb2x2ZWQgYXMgInJlbW92ZWQiIGJ5IG1pc3Rha2UuICBXZSBkbyBub3QKKwkJICogd2FudCB0byBkbyBhbnl0aGluZyBpbiB0aGUgZm9ybWVyIGNhc2UuCisJCSAqLworCQlwb3MgPSAtcG9zLTE7CisJCWlmIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwkJCWlmIChjZV9uYW1lbGVuKGNlKSA9PSBuYW1lbGVuICYmCisJCQkgICAgIW1lbWNtcChjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBza2lwcGluZyBzdGlsbCB1bm1lcmdlZCBwYXRoLlxuIiwKKwkJCQkJcGF0aCk7CisJCQkJZ290byBmcmVlX3JldHVybjsKKwkJCX0KKwkJfQorCX0KKworCS8qIEdyYWIgYmxvYnMgZnJvbSBnaXZlbiBwYXRoIGZyb20gSEVBRCBhbmQgTUVSR0VfSEVBRCwKKwkgKiBzdHVmZiBIRUFEIHZlcnNpb24gaW4gc3RhZ2UgIzIsCisJICogc3R1ZmYgTUVSR0VfSEVBRCB2ZXJzaW9uIGluIHN0YWdlICMzLgorCSAqLworCWNlXzIgPSByZWFkX29uZV9lbnQoIm91ciIsIGhlYWRfc2hhMSwgcGF0aCwgbmFtZWxlbiwgMik7CisJY2VfMyA9IHJlYWRfb25lX2VudCgidGhlaXIiLCBtZXJnZV9oZWFkX3NoYTEsIHBhdGgsIG5hbWVsZW4sIDMpOworCisJaWYgKCFjZV8yIHx8ICFjZV8zKSB7CisJCXJldCA9IC0xOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKwlpZiAoIW1lbWNtcChjZV8yLT5zaGExLCBjZV8zLT5zaGExLCAyMCkgJiYKKwkgICAgY2VfMi0+Y2VfbW9kZSA9PSBjZV8zLT5jZV9tb2RlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGlkZW50aWNhbCBpbiBib3RoLCBza2lwcGluZy5cbiIsCisJCQlwYXRoKTsKKwkJZ290byBmcmVlX3JldHVybjsKKwl9CisKKwljYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChhY3RpdmVfY2FjaGVfdHJlZSwgcGF0aCk7CisJcmVtb3ZlX2ZpbGVfZnJvbV9jYWNoZShwYXRoKTsKKwlpZiAoYWRkX2NhY2hlX2VudHJ5KGNlXzIsIEFERF9DQUNIRV9PS19UT19BREQpKSB7CisJCWVycm9yKCIlczogY2Fubm90IGFkZCBvdXIgdmVyc2lvbiB0byB0aGUgaW5kZXguIiwgcGF0aCk7CisJCXJldCA9IC0xOworCQlnb3RvIGZyZWVfcmV0dXJuOworCX0KKwlpZiAoIWFkZF9jYWNoZV9lbnRyeShjZV8zLCBBRERfQ0FDSEVfT0tfVE9fQUREKSkKKwkJcmV0dXJuIDA7CisJZXJyb3IoIiVzOiBjYW5ub3QgYWRkIHRoZWlyIHZlcnNpb24gdG8gdGhlIGluZGV4LiIsIHBhdGgpOworCXJldCA9IC0xOworIGZyZWVfcmV0dXJuOgorCWZyZWUoY2VfMik7CisJZnJlZShjZV8zKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZWFkX2hlYWRfcG9pbnRlcnModm9pZCkKK3sKKwlpZiAocmVhZF9yZWYoZ2l0X3BhdGgoIkhFQUQiKSwgaGVhZF9zaGExKSkKKwkJZGllKCJObyBIRUFEIC0tIG5vIGluaXRpYWwgY29tbWl0IHlldD9cbiIpOworCWlmIChyZWFkX3JlZihnaXRfcGF0aCgiTUVSR0VfSEVBRCIpLCBtZXJnZV9oZWFkX3NoYTEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGluIHRoZSBtaWRkbGUgb2YgYSBtZXJnZS5cbiIpOworCQlleGl0KDApOworCX0KK30KKworc3RhdGljIGludCBkb191bnJlc29sdmUoaW50IGFjLCBjb25zdCBjaGFyICoqYXYsCisJCQljb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuZ3RoKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCisJLyogUmVhZCBIRUFEIGFuZCBNRVJHRV9IRUFEOyBpZiBNRVJHRV9IRUFEIGRvZXMgbm90IGV4aXN0LCB3ZQorCSAqIGFyZSBub3QgZG9pbmcgYSBtZXJnZSwgc28gZXhpdCB3aXRoIHN1Y2Nlc3Mgc3RhdHVzLgorCSAqLworCXJlYWRfaGVhZF9wb2ludGVycygpOworCisJZm9yIChpID0gMTsgaSA8IGFjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXZbaV07CisJCWNvbnN0IGNoYXIgKnAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGFyZyk7CisJCWVyciB8PSB1bnJlc29sdmVfb25lKHApOworCQlpZiAocCA8IGFyZyB8fCBwID4gYXJnICsgc3RybGVuKGFyZykpCisJCQlmcmVlKChjaGFyKilwKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19yZXVwZGF0ZShpbnQgYWMsIGNvbnN0IGNoYXIgKiphdiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHByZWZpeF9sZW5ndGgpCit7CisJLyogUmVhZCBIRUFEIGFuZCBydW4gdXBkYXRlLWluZGV4IG9uIHBhdGhzIHRoYXQgYXJlCisJICogbWVyZ2VkIGFuZCBhbHJlYWR5IGRpZmZlcmVudCBiZXR3ZWVuIGluZGV4IGFuZCBIRUFELgorCSAqLworCWludCBwb3M7CisJaW50IGhhc19oZWFkID0gMTsKKwljb25zdCBjaGFyICoqcGF0aHNwZWMgPSBnZXRfcGF0aHNwZWMocHJlZml4LCBhdiArIDEpOworCisJaWYgKHJlYWRfcmVmKGdpdF9wYXRoKCJIRUFEIiksIGhlYWRfc2hhMSkpCisJCS8qIElmIHRoZXJlIGlzIG5vIEhFQUQsIHRoYXQgbWVhbnMgaXQgaXMgYW4gaW5pdGlhbAorCQkgKiBjb21taXQuICBVcGRhdGUgZXZlcnl0aGluZyBpbiB0aGUgaW5kZXguCisJCSAqLworCQloYXNfaGVhZCA9IDA7CisgcmVkbzoKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGFjdGl2ZV9ucjsgcG9zKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCA9IE5VTEw7CisJCWludCBzYXZlX25yOworCisJCWlmIChjZV9zdGFnZShjZSkgfHwgIWNlX3BhdGhfbWF0Y2goY2UsIHBhdGhzcGVjKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaGFzX2hlYWQpCisJCQlvbGQgPSByZWFkX29uZV9lbnQoTlVMTCwgaGVhZF9zaGExLAorCQkJCQkgICBjZS0+bmFtZSwgY2VfbmFtZWxlbihjZSksIDApOworCQlpZiAob2xkICYmIGNlLT5jZV9tb2RlID09IG9sZC0+Y2VfbW9kZSAmJgorCQkgICAgIW1lbWNtcChjZS0+c2hhMSwgb2xkLT5zaGExLCAyMCkpIHsKKwkJCWZyZWUob2xkKTsKKwkJCWNvbnRpbnVlOyAvKiB1bmNoYW5nZWQgKi8KKwkJfQorCQkvKiBCZSBjYXJlZnVsLiAgVGhlIHdvcmtpbmcgdHJlZSBtYXkgbm90IGhhdmUgdGhlCisJCSAqIHBhdGggYW55bW9yZSwgaW4gd2hpY2ggY2FzZSwgdW5kZXIgJ2FsbG93X3JlbW92ZScsCisJCSAqIG9yIHdvcnNlIHlldCAnYWxsb3dfcmVwbGFjZScsIGFjdGl2ZV9uciBtYXkgZGVjcmVhc2UuCisJCSAqLworCQlzYXZlX25yID0gYWN0aXZlX25yOworCQl1cGRhdGVfb25lKGNlLT5uYW1lICsgcHJlZml4X2xlbmd0aCwgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKTsKKwkJaWYgKHNhdmVfbnIgIT0gYWN0aXZlX25yKQorCQkJZ290byByZWRvOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGNtZF91cGRhdGVfaW5kZXgoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGksIG5ld2ZkLCBlbnRyaWVzLCBoYXNfZXJyb3JzID0gMCwgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CisJaW50IGFsbG93X29wdGlvbnMgPSAxOworCWludCByZWFkX2Zyb21fc3RkaW4gPSAwOworCWludCBwcmVmaXhfbGVuZ3RoID0gcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwOworCWNoYXIgc2V0X2V4ZWN1dGFibGVfYml0ID0gMDsKKwl1bnNpZ25lZCBpbnQgcmVmcmVzaF9mbGFncyA9IDA7CisJc3RydWN0IGxvY2tfZmlsZSAqbG9ja19maWxlOworCisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJLyogV2UgY2FuJ3QgZnJlZSB0aGlzIG1lbW9yeSwgaXQgYmVjb21lcyBwYXJ0IG9mIGEgbGlua2VkIGxpc3QgcGFyc2VkIGF0ZXhpdCgpICovCisJbG9ja19maWxlID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSkpOworCisJbmV3ZmQgPSBob2xkX2xvY2tfZmlsZV9mb3JfdXBkYXRlKGxvY2tfZmlsZSwgZ2V0X2luZGV4X2ZpbGUoKSwgMSk7CisKKwllbnRyaWVzID0gcmVhZF9jYWNoZSgpOworCWlmIChlbnRyaWVzIDwgMCkKKwkJZGllKCJjYWNoZSBjb3JydXB0ZWQiKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhdGggPSBhcmd2W2ldOworCisJCWlmIChhbGxvd19vcHRpb25zICYmICpwYXRoID09ICctJykgeworCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tIikpIHsKKwkJCQlhbGxvd19vcHRpb25zID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItcSIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX1FVSUVUOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYWRkIikpIHsKKwkJCQlhbGxvd19hZGQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVwbGFjZSIpKSB7CisJCQkJYWxsb3dfcmVwbGFjZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1yZW1vdmUiKSkgeworCQkJCWFsbG93X3JlbW92ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS11bm1lcmdlZCIpKSB7CisJCQkJcmVmcmVzaF9mbGFncyB8PSBSRUZSRVNIX1VOTUVSR0VEOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVmcmVzaCIpKSB7CisJCQkJaGFzX2Vycm9ycyB8PSByZWZyZXNoX2NhY2hlKHJlZnJlc2hfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tcmVhbGx5LXJlZnJlc2giKSkgeworCQkJCWhhc19lcnJvcnMgfD0gcmVmcmVzaF9jYWNoZShSRUZSRVNIX1JFQUxMWSB8IHJlZnJlc2hfZmxhZ3MpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tY2FjaGVpbmZvIikpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQkJCXVuc2lnbmVkIGludCBtb2RlOworCisJCQkJaWYgKGkrMyA+PSBhcmdjKQorCQkJCQlkaWUoImdpdC11cGRhdGUtaW5kZXg6IC0tY2FjaGVpbmZvIDxtb2RlPiA8c2hhMT4gPHBhdGg+Iik7CisKKwkJCQlpZiAoKHNzY2FuZihhcmd2W2krMV0sICIlbyIsICZtb2RlKSAhPSAxKSB8fAorCQkJCSAgICBnZXRfc2hhMV9oZXgoYXJndltpKzJdLCBzaGExKSB8fAorCQkJCSAgICBhZGRfY2FjaGVpbmZvKG1vZGUsIHNoYTEsIGFyZ3ZbaSszXSwgMCkpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogLS1jYWNoZWluZm8iCisJCQkJCSAgICAiIGNhbm5vdCBhZGQgJXMiLCBhcmd2W2krM10pOworCQkJCWkgKz0gMzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWNobW9kPS14IikgfHwKKwkJCSAgICAhc3RyY21wKHBhdGgsICItLWNobW9kPSt4IikpIHsKKwkJCQlpZiAoYXJnYyA8PSBpKzEpCisJCQkJCWRpZSgiZ2l0LXVwZGF0ZS1pbmRleDogJXMgPHBhdGg+IiwgcGF0aCk7CisJCQkJc2V0X2V4ZWN1dGFibGVfYml0ID0gcGF0aFs4XTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWFzc3VtZS11bmNoYW5nZWQiKSkgeworCQkJCW1hcmtfdmFsaWRfb25seSA9IE1BUktfVkFMSUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1uby1hc3N1bWUtdW5jaGFuZ2VkIikpIHsKKwkJCQltYXJrX3ZhbGlkX29ubHkgPSBVTk1BUktfVkFMSUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1pbmZvLW9ubHkiKSkgeworCQkJCWluZm9fb25seSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS1mb3JjZS1yZW1vdmUiKSkgeworCQkJCWZvcmNlX3JlbW92ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLXoiKSkgeworCQkJCWxpbmVfdGVybWluYXRpb24gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tc3RkaW4iKSkgeworCQkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCQlkaWUoIi0tc3RkaW4gbXVzdCBiZSBhdCB0aGUgZW5kIik7CisJCQkJcmVhZF9mcm9tX3N0ZGluID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWluZGV4LWluZm8iKSkgeworCQkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCQlkaWUoIi0taW5kZXgtaW5mbyBtdXN0IGJlIGF0IHRoZSBlbmQiKTsKKwkJCQlhbGxvd19hZGQgPSBhbGxvd19yZXBsYWNlID0gYWxsb3dfcmVtb3ZlID0gMTsKKwkJCQlyZWFkX2luZGV4X2luZm8obGluZV90ZXJtaW5hdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS11bnJlc29sdmUiKSkgeworCQkJCWhhc19lcnJvcnMgPSBkb191bnJlc29sdmUoYXJnYyAtIGksIGFyZ3YgKyBpLAorCQkJCQkJCSAgcHJlZml4LCBwcmVmaXhfbGVuZ3RoKTsKKwkJCQlpZiAoaGFzX2Vycm9ycykKKwkJCQkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAwOworCQkJCWdvdG8gZmluaXNoOworCQkJfQorCQkJaWYgKCFzdHJjbXAocGF0aCwgIi0tYWdhaW4iKSkgeworCQkJCWhhc19lcnJvcnMgPSBkb19yZXVwZGF0ZShhcmdjIC0gaSwgYXJndiArIGksCisJCQkJCQkJIHByZWZpeCwgcHJlZml4X2xlbmd0aCk7CisJCQkJaWYgKGhhc19lcnJvcnMpCisJCQkJCWFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMDsKKwkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItLWlnbm9yZS1taXNzaW5nIikpIHsKKwkJCQlyZWZyZXNoX2ZsYWdzIHw9IFJFRlJFU0hfSUdOT1JFX01JU1NJTkc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChwYXRoLCAiLS12ZXJib3NlIikpIHsKKwkJCQl2ZXJib3NlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKHBhdGgsICItaCIpIHx8ICFzdHJjbXAocGF0aCwgIi0taGVscCIpKQorCQkJCXVzYWdlKHVwZGF0ZV9pbmRleF91c2FnZSk7CisJCQlkaWUoInVua25vd24gb3B0aW9uICVzIiwgcGF0aCk7CisJCX0KKwkJdXBkYXRlX29uZShwYXRoLCBwcmVmaXgsIHByZWZpeF9sZW5ndGgpOworCQlpZiAoc2V0X2V4ZWN1dGFibGVfYml0KQorCQkJY2htb2RfcGF0aChzZXRfZXhlY3V0YWJsZV9iaXQsIHBhdGgpOworCX0KKwlpZiAocmVhZF9mcm9tX3N0ZGluKSB7CisJCXN0cnVjdCBzdHJidWYgYnVmOworCQlzdHJidWZfaW5pdCgmYnVmKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWNoYXIgKnBhdGhfbmFtZTsKKwkJCWNvbnN0IGNoYXIgKnA7CisJCQlyZWFkX2xpbmUoJmJ1Ziwgc3RkaW4sIGxpbmVfdGVybWluYXRpb24pOworCQkJaWYgKGJ1Zi5lb2YpCisJCQkJYnJlYWs7CisJCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBidWYuYnVmWzBdID09ICciJykKKwkJCQlwYXRoX25hbWUgPSB1bnF1b3RlX2Nfc3R5bGUoYnVmLmJ1ZiwgTlVMTCk7CisJCQllbHNlCisJCQkJcGF0aF9uYW1lID0gYnVmLmJ1ZjsKKwkJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIHBhdGhfbmFtZSk7CisJCQl1cGRhdGVfb25lKHAsIE5VTEwsIDApOworCQkJaWYgKHNldF9leGVjdXRhYmxlX2JpdCkKKwkJCQljaG1vZF9wYXRoKHNldF9leGVjdXRhYmxlX2JpdCwgcCk7CisJCQlpZiAocCA8IHBhdGhfbmFtZSB8fCBwID4gcGF0aF9uYW1lICsgc3RybGVuKHBhdGhfbmFtZSkpCisJCQkJZnJlZSgoY2hhciopIHApOworCQkJaWYgKHBhdGhfbmFtZSAhPSBidWYuYnVmKQorCQkJCWZyZWUocGF0aF9uYW1lKTsKKwkJfQorCX0KKworIGZpbmlzaDoKKwlpZiAoYWN0aXZlX2NhY2hlX2NoYW5nZWQpIHsKKwkJaWYgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkJICAgIGNsb3NlKG5ld2ZkKSB8fCBjb21taXRfbG9ja19maWxlKGxvY2tfZmlsZSkpCisJCQlkaWUoIlVuYWJsZSB0byB3cml0ZSBuZXcgaW5kZXggZmlsZSIpOworCX0KKworCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrX2ZpbGUpOworCisJcmV0dXJuIGhhc19lcnJvcnMgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdXBkYXRlLXJlZi5jIGIvYnVpbHRpbi11cGRhdGUtcmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkNzE4MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdXBkYXRlLXJlZi5jCkBAIC0wLDAgKzEsNTkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGdpdF91cGRhdGVfcmVmX3VzYWdlW10gPQorImdpdC11cGRhdGUtcmVmIDxyZWZuYW1lPiA8dmFsdWU+IFs8b2xkdmFsPl0gWy1tIDxyZWFzb24+XSI7CisKK2ludCBjbWRfdXBkYXRlX3JlZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwljb25zdCBjaGFyICpyZWZuYW1lPU5VTEwsICp2YWx1ZT1OVUxMLCAqb2xkdmFsPU5VTEwsICptc2c9TlVMTDsKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgb2xkc2hhMVsyMF07CisJaW50IGk7CisKKwlzZXR1cF9pZGVudCgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoIi1tIiwgYXJndltpXSkpIHsKKwkJCWlmIChpKzEgPj0gYXJnYykKKwkJCQl1c2FnZShnaXRfdXBkYXRlX3JlZl91c2FnZSk7CisJCQltc2cgPSBhcmd2WysraV07CisJCQlpZiAoISptc2cpCisJCQkJZGllKCJSZWZ1c2luZyB0byBwZXJmb3JtIHVwZGF0ZSB3aXRoIGVtcHR5IG1lc3NhZ2UuIik7CisJCQlpZiAoc3RyY2hyKG1zZywgJ1xuJykpCisJCQkJZGllKCJSZWZ1c2luZyB0byBwZXJmb3JtIHVwZGF0ZSB3aXRoIFxcbiBpbiBtZXNzYWdlLiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZWZuYW1lKSB7CisJCQlyZWZuYW1lID0gYXJndltpXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdmFsdWUpIHsKKwkJCXZhbHVlID0gYXJndltpXTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghb2xkdmFsKSB7CisJCQlvbGR2YWwgPSBhcmd2W2ldOworCQkJY29udGludWU7CisJCX0KKwl9CisJaWYgKCFyZWZuYW1lIHx8ICF2YWx1ZSkKKwkJdXNhZ2UoZ2l0X3VwZGF0ZV9yZWZfdXNhZ2UpOworCisJaWYgKGdldF9zaGExKHZhbHVlLCBzaGExKSkKKwkJZGllKCIlczogbm90IGEgdmFsaWQgU0hBMSIsIHZhbHVlKTsKKwltZW1zZXQob2xkc2hhMSwgMCwgMjApOworCWlmIChvbGR2YWwgJiYgZ2V0X3NoYTEob2xkdmFsLCBvbGRzaGExKSkKKwkJZGllKCIlczogbm90IGEgdmFsaWQgb2xkIFNIQTEiLCBvbGR2YWwpOworCisJbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKHJlZm5hbWUsIG9sZHZhbCA/IG9sZHNoYTEgOiBOVUxMLCAwKTsKKwlpZiAoIWxvY2spCisJCXJldHVybiAxOworCWlmICh3cml0ZV9yZWZfc2hhMShsb2NrLCBzaGExLCBtc2cpIDwgMCkKKwkJcmV0dXJuIDE7CisKKwkvKiB3cml0ZV9yZWZfc2hhMSBhbHdheXMgdW5sb2NrcyB0aGUgcmVmLCBubyBuZWVkIHRvIGRvIGl0IGV4cGxpY2l0bHkgKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4tdXBsb2FkLXRhci5jIGIvYnVpbHRpbi11cGxvYWQtdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0MDFiYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4tdXBsb2FkLXRhci5jCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGt0LWxpbmUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgdXBsb2FkX3Rhcl91c2FnZVtdID0gImdpdC11cGxvYWQtdGFyIDxyZXBvPiI7CisKK3N0YXRpYyBpbnQgbmFrKGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlwYWNrZXRfd3JpdGUoMSwgIk5BQ0sgJXNcbiIsIHJlYXNvbik7CisJcGFja2V0X2ZsdXNoKDEpOworCXJldHVybiAxOworfQorCitpbnQgY21kX3VwbG9hZF90YXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpkaXIgPSBhcmd2WzFdOworCWNoYXIgYnVmWzgxOTJdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqYmFzZSA9IE5VTEw7CisJY2hhciBoZXhbNDFdOworCWludCBhYzsKKwljb25zdCBjaGFyICphdls0XTsKKworCWlmIChhcmdjICE9IDIpCisJCXVzYWdlKHVwbG9hZF90YXJfdXNhZ2UpOworCWlmIChzdHJsZW4oZGlyKSA8IHNpemVvZihidWYpLTEpCisJCXN0cmNweShidWYsIGRpcik7IC8qIGVudGVyLXJlcG8gc211ZGdlcyBpdHMgYXJndW1lbnQgKi8KKwllbHNlCisJCXBhY2tldF93cml0ZSgxLCAiTkFDSyBpbnNhbmVseSBsb25nIHJlcG9zaXRvcnkgbmFtZSAlc1xuIiwgZGlyKTsKKwlpZiAoIWVudGVyX3JlcG8oYnVmLCAwKSkgeworCQlwYWNrZXRfd3JpdGUoMSwgIk5BQ0sgbm90IGEgZ2l0IGFyY2hpdmUgJXNcbiIsIGRpcik7CisJCXBhY2tldF9mbHVzaCgxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAobGVuIDwgNSB8fCBzdHJuY21wKCJ3YW50ICIsIGJ1ZiwgNSkpCisJCXJldHVybiBuYWsoImV4cGVjdGVkIHdhbnQiKTsKKwlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQorCQlidWZbLS1sZW5dID0gMDsKKwlpZiAoZ2V0X3NoYTEoYnVmICsgNSwgc2hhMSkpCisJCXJldHVybiBuYWsoImV4cGVjdGVkIHNoYTEiKTsKKyAgICAgICAgc3RyY3B5KGhleCwgc2hhMV90b19oZXgoc2hhMSkpOworCisJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAobGVuKSB7CisJCWlmIChsZW4gPCA1IHx8IHN0cm5jbXAoImJhc2UgIiwgYnVmLCA1KSkKKwkJCXJldHVybiBuYWsoImV4cGVjdGVkIChvcHRpb25hbCkgYmFzZSIpOworCQlpZiAoYnVmW2xlbi0xXSA9PSAnXG4nKQorCQkJYnVmWy0tbGVuXSA9IDA7CisJCWJhc2UgPSBzdHJkdXAoYnVmICsgNSk7CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgYnVmLCBzaXplb2YoYnVmKSk7CisJfQorCWlmIChsZW4pCisJCXJldHVybiBuYWsoImV4cGVjdGVkIGZsdXNoIik7CisKKwlwYWNrZXRfd3JpdGUoMSwgIkFDS1xuIik7CisJcGFja2V0X2ZsdXNoKDEpOworCisJYWMgPSAwOworCWF2W2FjKytdID0gInRhci10cmVlIjsKKwlhdlthYysrXSA9IGhleDsKKwlpZiAoYmFzZSkKKwkJYXZbYWMrK10gPSBiYXNlOworCWF2W2FjKytdID0gTlVMTDsKKwlleGVjdl9naXRfY21kKGF2KTsKKwkvKiBzaG91bGQgaXQgcmV0dXJuIHRoYXQgaXMgYW4gZXJyb3IgKi8KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4td3JpdGUtdHJlZS5jIGIvYnVpbHRpbi13cml0ZS10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwNjE0OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWx0aW4td3JpdGUtdHJlZS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciB3cml0ZV90cmVlX3VzYWdlW10gPQorImdpdC13cml0ZS10cmVlIFstLW1pc3Npbmctb2tdIFstLXByZWZpeD08cHJlZml4Pi9dIjsKKworaW50IHdyaXRlX3RyZWUodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IG1pc3Npbmdfb2ssIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgZW50cmllcywgd2FzX3ZhbGlkLCBuZXdmZDsKKworCS8qIFdlIGNhbid0IGZyZWUgdGhpcyBtZW1vcnksIGl0IGJlY29tZXMgcGFydCBvZiBhIGxpbmtlZCBsaXN0IHBhcnNlZCBhdGV4aXQoKSAqLworCXN0cnVjdCBsb2NrX2ZpbGUgKmxvY2tfZmlsZSA9IHhjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBsb2NrX2ZpbGUpKTsKKworCW5ld2ZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZShsb2NrX2ZpbGUsIGdldF9pbmRleF9maWxlKCksIDApOworCisJZW50cmllcyA9IHJlYWRfY2FjaGUoKTsKKwlpZiAoZW50cmllcyA8IDApCisJCWRpZSgiZ2l0LXdyaXRlLXRyZWU6IGVycm9yIHJlYWRpbmcgY2FjaGUiKTsKKworCWlmICghYWN0aXZlX2NhY2hlX3RyZWUpCisJCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZSgpOworCisJd2FzX3ZhbGlkID0gY2FjaGVfdHJlZV9mdWxseV92YWxpZChhY3RpdmVfY2FjaGVfdHJlZSk7CisKKwlpZiAoIXdhc192YWxpZCkgeworCQlpZiAoY2FjaGVfdHJlZV91cGRhdGUoYWN0aXZlX2NhY2hlX3RyZWUsCisJCQkJICAgICAgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsCisJCQkJICAgICAgbWlzc2luZ19vaywgMCkgPCAwKQorCQkJZGllKCJnaXQtd3JpdGUtdHJlZTogZXJyb3IgYnVpbGRpbmcgdHJlZXMiKTsKKwkJaWYgKDAgPD0gbmV3ZmQpIHsKKwkJCWlmICghd3JpdGVfY2FjaGUobmV3ZmQsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yKQorCQkJCQkmJiAhY2xvc2UobmV3ZmQpKQorCQkJCWNvbW1pdF9sb2NrX2ZpbGUobG9ja19maWxlKTsKKwkJfQorCQkvKiBOb3QgYmVpbmcgYWJsZSB0byB3cml0ZSBpcyBmaW5lIC0tIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQKKwkJICogaW4gdXBkYXRpbmcgdGhlIGNhY2hlLXRyZWUgcGFydCwgYW5kIGlmIHRoZSBuZXh0IGNhbGxlcgorCQkgKiBlbmRzIHVwIHVzaW5nIHRoZSBvbGQgaW5kZXggd2l0aCB1bnVwZGF0ZWQgY2FjaGUtdHJlZSBwYXJ0CisJCSAqIGl0IG1pc3NlcyB0aGUgd29yayB3ZSBkaWQgaGVyZSwgYnV0IHRoYXQgaXMganVzdCBhCisJCSAqIHBlcmZvcm1hbmNlIHBlbmFsdHkgYW5kIG5vdCBhIGJpZyBkZWFsLgorCQkgKi8KKwl9CisKKwlpZiAocHJlZml4KSB7CisJCXN0cnVjdCBjYWNoZV90cmVlICpzdWJ0cmVlID0KKwkJCWNhY2hlX3RyZWVfZmluZChhY3RpdmVfY2FjaGVfdHJlZSwgcHJlZml4KTsKKwkJbWVtY3B5KHNoYTEsIHN1YnRyZWUtPnNoYTEsIDIwKTsKKwl9CisJZWxzZQorCQltZW1jcHkoc2hhMSwgYWN0aXZlX2NhY2hlX3RyZWUtPnNoYTEsIDIwKTsKKworCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrX2ZpbGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjbWRfd3JpdGVfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnVudXNlZF9wcmVmaXgpCit7CisJaW50IG1pc3Npbmdfb2sgPSAwLCByZXQ7CisJY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJd2hpbGUgKDEgPCBhcmdjKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMV07CisJCWlmICghc3RyY21wKGFyZywgIi0tbWlzc2luZy1vayIpKQorCQkJbWlzc2luZ19vayA9IDE7CisJCWVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi0tcHJlZml4PSIsIDkpKQorCQkJcHJlZml4ID0gYXJnICsgOTsKKwkJZWxzZQorCQkJdXNhZ2Uod3JpdGVfdHJlZV91c2FnZSk7CisJCWFyZ2MtLTsgYXJndisrOworCX0KKworCWlmIChhcmdjID4gMikKKwkJZGllKCJ0b28gbWFueSBvcHRpb25zIik7CisKKwlyZXQgPSB3cml0ZV90cmVlKHNoYTEsIG1pc3Npbmdfb2ssIHByZWZpeCk7CisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2J1aWx0aW4uaCBiL2J1aWx0aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmViY2FmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbHRpbi5oCkBAIC0wLDAgKzEsNjQgQEAKKyNpZm5kZWYgQlVJTFRJTl9ICisjZGVmaW5lIEJVSUxUSU5fSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworZXh0ZXJuIGNvbnN0IGNoYXIgZ2l0X3ZlcnNpb25fc3RyaW5nW107CitleHRlcm4gY29uc3QgY2hhciBnaXRfdXNhZ2Vfc3RyaW5nW107CisKK2V4dGVybiB2b2lkIGhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKTsKKworZXh0ZXJuIGludCBjbWRfaGVscChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF92ZXJzaW9uKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKKworZXh0ZXJuIGludCBjbWRfd2hhdGNoYW5nZWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfc2hvdyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9sb2coaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGlmZihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9mb3JtYXRfcGF0Y2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY291bnRfb2JqZWN0cyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKK2V4dGVybiBpbnQgY21kX3BydW5lKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3BydW5lX3BhY2tlZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKK2V4dGVybiBpbnQgY21kX3B1c2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZ3JlcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9ybShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9hZGQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmV2X2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY2hlY2tfcmVmX2Zvcm1hdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9pbml0X2RiKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3Rhcl90cmVlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3VwbG9hZF90YXIoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZ2V0X3Rhcl9jb21taXRfaWQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbHNfZmlsZXMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfbHNfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZWFkX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfY29tbWl0X3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfYXBwbHkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfc2hvd19icmFuY2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGlmZl9maWxlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9kaWZmX2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2RpZmZfc3RhZ2VzKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2RpZmZfdHJlZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9jYXRfZmlsZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZXZfcGFyc2UoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfdXBkYXRlX2luZGV4KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3VwZGF0ZV9yZWYoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZm10X21lcmdlX21zZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9tdihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9yZXBvX2NvbmZpZyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKK2V4dGVybiBpbnQgY21kX3dyaXRlX3RyZWUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCB3cml0ZV90cmVlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBtaXNzaW5nX29rLCBjb25zdCBjaGFyICpwcmVmaXgpOworCitleHRlcm4gaW50IGNtZF9tYWlsc3BsaXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBzcGxpdF9tYm94KGNvbnN0IGNoYXIgKiptYm94LCBjb25zdCBjaGFyICpkaXIsIGludCBhbGxvd19iYXJlLCBpbnQgbnJfcHJlYywgaW50IHNraXApOworCitleHRlcm4gaW50IGNtZF9tYWlsaW5mbyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IG1haWxpbmZvKEZJTEUgKmluLCBGSUxFICpvdXQsIGludCBrcywgY29uc3QgY2hhciAqZW5jb2RpbmcsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqcGF0Y2gpOworCitleHRlcm4gaW50IGNtZF9zdHJpcHNwYWNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiB2b2lkIHN0cmlwc3BhY2UoRklMRSAqaW4sIEZJTEUgKm91dCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NhY2hlLXRyZWUuYyBiL2NhY2hlLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY3ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvY2FjaGUtdHJlZS5jCkBAIC0wLDAgKzEsNTU3IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisjZGVmaW5lIERFQlVHIDAKKworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgY2FjaGVfdHJlZSkpOworCWl0LT5lbnRyeV9jb3VudCA9IC0xOworCXJldHVybiBpdDsKK30KKwordm9pZCBjYWNoZV90cmVlX2ZyZWUoc3RydWN0IGNhY2hlX3RyZWUgKippdF9wKQoreworCWludCBpOworCXN0cnVjdCBjYWNoZV90cmVlICppdCA9ICppdF9wOworCisJaWYgKCFpdCkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBpdC0+c3VidHJlZV9ucjsgaSsrKQorCQlpZiAoaXQtPmRvd25baV0pCisJCQljYWNoZV90cmVlX2ZyZWUoJml0LT5kb3duW2ldLT5jYWNoZV90cmVlKTsKKwlmcmVlKGl0LT5kb3duKTsKKwlmcmVlKGl0KTsKKwkqaXRfcCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc3VidHJlZV9uYW1lX2NtcChjb25zdCBjaGFyICpvbmUsIGludCBvbmVsZW4sCisJCQkgICAgY29uc3QgY2hhciAqdHdvLCBpbnQgdHdvbGVuKQoreworCWlmIChvbmVsZW4gPCB0d29sZW4pCisJCXJldHVybiAtMTsKKwlpZiAodHdvbGVuIDwgb25lbGVuKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gbWVtY21wKG9uZSwgdHdvLCBvbmVsZW4pOworfQorCitzdGF0aWMgaW50IHN1YnRyZWVfcG9zKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4pCit7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICoqZG93biA9IGl0LT5kb3duOworCWludCBsbywgaGk7CisJbG8gPSAwOworCWhpID0gaXQtPnN1YnRyZWVfbnI7CisJd2hpbGUgKGxvIDwgaGkpIHsKKwkJaW50IG1pID0gKGxvICsgaGkpIC8gMjsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICptZGwgPSBkb3duW21pXTsKKwkJaW50IGNtcCA9IHN1YnRyZWVfbmFtZV9jbXAocGF0aCwgcGF0aGxlbiwKKwkJCQkJICAgbWRsLT5uYW1lLCBtZGwtPm5hbWVsZW4pOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBtaTsKKwkJaWYgKGNtcCA8IDApCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9CisJcmV0dXJuIC1sby0xOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlX3RyZWVfc3ViICpmaW5kX3N1YnRyZWUoc3RydWN0IGNhY2hlX3RyZWUgKml0LAorCQkJCQkgICBjb25zdCBjaGFyICpwYXRoLAorCQkJCQkgICBpbnQgcGF0aGxlbiwKKwkJCQkJICAgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd247CisJaW50IHBvcyA9IHN1YnRyZWVfcG9zKGl0LCBwYXRoLCBwYXRobGVuKTsKKwlpZiAoMCA8PSBwb3MpCisJCXJldHVybiBpdC0+ZG93bltwb3NdOworCWlmICghY3JlYXRlKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IC1wb3MtMTsKKwlpZiAoaXQtPnN1YnRyZWVfYWxsb2MgPD0gaXQtPnN1YnRyZWVfbnIpIHsKKwkJaXQtPnN1YnRyZWVfYWxsb2MgPSBhbGxvY19ucihpdC0+c3VidHJlZV9hbGxvYyk7CisJCWl0LT5kb3duID0geHJlYWxsb2MoaXQtPmRvd24sIGl0LT5zdWJ0cmVlX2FsbG9jICoKKwkJCQkgICAgc2l6ZW9mKCppdC0+ZG93bikpOworCX0KKwlpdC0+c3VidHJlZV9ucisrOworCisJZG93biA9IHhtYWxsb2Moc2l6ZW9mKCpkb3duKSArIHBhdGhsZW4gKyAxKTsKKwlkb3duLT5jYWNoZV90cmVlID0gTlVMTDsKKwlkb3duLT5uYW1lbGVuID0gcGF0aGxlbjsKKwltZW1jcHkoZG93bi0+bmFtZSwgcGF0aCwgcGF0aGxlbik7CisJZG93bi0+bmFtZVtwYXRobGVuXSA9IDA7CisKKwlpZiAocG9zIDwgaXQtPnN1YnRyZWVfbnIpCisJCW1lbW1vdmUoaXQtPmRvd24gKyBwb3MgKyAxLAorCQkJaXQtPmRvd24gKyBwb3MsCisJCQlzaXplb2YoZG93bikgKiAoaXQtPnN1YnRyZWVfbnIgLSBwb3MgLSAxKSk7CisJaXQtPmRvd25bcG9zXSA9IGRvd247CisJcmV0dXJuIGRvd247Cit9CisKK3N0cnVjdCBjYWNoZV90cmVlX3N1YiAqY2FjaGVfdHJlZV9zdWIoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwYXRobGVuID0gc3RybGVuKHBhdGgpOworCXJldHVybiBmaW5kX3N1YnRyZWUoaXQsIHBhdGgsIHBhdGhsZW4sIDEpOworfQorCit2b2lkIGNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwkvKiBhL2IvYworCSAqID09PiBpbnZhbGlkYXRlIHNlbGYKKwkgKiA9PT4gZmluZCAiYSIsIGhhdmUgaXQgaW52YWxpZGF0ZSAiYi9jIgorCSAqIGEKKwkgKiA9PT4gaW52YWxpZGF0ZSBzZWxmCisJICogPT0+IGlmICJhIiBleGlzdHMgYXMgYSBzdWJ0cmVlLCByZW1vdmUgaXQuCisJICovCisJY29uc3QgY2hhciAqc2xhc2g7CisJaW50IG5hbWVsZW47CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpkb3duOworCisjaWYgREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgImNhY2hlLXRyZWUgaW52YWxpZGF0ZSA8JXM+XG4iLCBwYXRoKTsKKyNlbmRpZgorCisJaWYgKCFpdCkKKwkJcmV0dXJuOworCXNsYXNoID0gc3RyY2hyKHBhdGgsICcvJyk7CisJaXQtPmVudHJ5X2NvdW50ID0gLTE7CisJaWYgKCFzbGFzaCkgeworCQlpbnQgcG9zOworCQluYW1lbGVuID0gc3RybGVuKHBhdGgpOworCQlwb3MgPSBzdWJ0cmVlX3BvcyhpdCwgcGF0aCwgbmFtZWxlbik7CisJCWlmICgwIDw9IHBvcykgeworCQkJY2FjaGVfdHJlZV9mcmVlKCZpdC0+ZG93bltwb3NdLT5jYWNoZV90cmVlKTsKKwkJCWZyZWUoaXQtPmRvd25bcG9zXSk7CisJCQkvKiAwIDEgMiAzIDQgNQorCQkJICogICAgICAgXiAgICAgXnN1YnRyZWVfbnIgPSA2CisJCQkgKiAgICAgICBwb3MKKwkJCSAqIG1vdmUgNCBhbmQgNSB1cCBvbmUgcGxhY2UgKDIgZW50cmllcykKKwkJCSAqIDIgPSA2IC0gMyAtIDEgPSBzdWJ0cmVlX25yIC0gcG9zIC0gMQorCQkJICovCisJCQltZW1tb3ZlKGl0LT5kb3duK3BvcywgaXQtPmRvd24rcG9zKzEsCisJCQkJc2l6ZW9mKHN0cnVjdCBjYWNoZV90cmVlX3N1YiAqKSAqCisJCQkJKGl0LT5zdWJ0cmVlX25yIC0gcG9zIC0gMSkpOworCQkJaXQtPnN1YnRyZWVfbnItLTsKKwkJfQorCQlyZXR1cm47CisJfQorCW5hbWVsZW4gPSBzbGFzaCAtIHBhdGg7CisJZG93biA9IGZpbmRfc3VidHJlZShpdCwgcGF0aCwgbmFtZWxlbiwgMCk7CisJaWYgKGRvd24pCisJCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGRvd24tPmNhY2hlX3RyZWUsIHNsYXNoICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NhY2hlKHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLAorCQkJaW50IGVudHJpZXMpCit7CisJaW50IGksIGZ1bm55OworCisJLyogVmVyaWZ5IHRoYXQgdGhlIHRyZWUgaXMgbWVyZ2VkICovCisJZnVubnkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlpZiAoMTAgPCArK2Z1bm55KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIuLi5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZnByaW50ZihzdGRlcnIsICIlczogdW5tZXJnZWQgKCVzKVxuIiwKKwkJCQljZS0+bmFtZSwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwkJfQorCX0KKwlpZiAoZnVubnkpCisJCXJldHVybiAtMTsKKworCS8qIEFsc28gdmVyaWZ5IHRoYXQgdGhlIGNhY2hlIGRvZXMgbm90IGhhdmUgcGF0aCBhbmQgcGF0aC9maWxlCisJICogYXQgdGhlIHNhbWUgdGltZS4gIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgY2FjaGUgaGFzIG9ubHkKKwkgKiBzdGFnZSAwIGVudHJpZXMuCisJICovCisJZnVubnkgPSAwOworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzIC0gMTsgaSsrKSB7CisJCS8qIHBhdGgvZmlsZSBhbHdheXMgY29tZXMgYWZ0ZXIgcGF0aCBiZWNhdXNlIG9mIHRoZSB3YXkKKwkJICogdGhlIGNhY2hlIGlzIHNvcnRlZC4gIEFsc28gcGF0aCBjYW4gYXBwZWFyIG9ubHkgb25jZSwKKwkJICogd2hpY2ggbWVhbnMgY29uZmxpY3Rpbmcgb25lIHdvdWxkIGltbWVkaWF0ZWx5IGZvbGxvdy4KKwkJICovCisJCWNvbnN0IGNoYXIgKnRoaXNfbmFtZSA9IGNhY2hlW2ldLT5uYW1lOworCQljb25zdCBjaGFyICpuZXh0X25hbWUgPSBjYWNoZVtpKzFdLT5uYW1lOworCQlpbnQgdGhpc19sZW4gPSBzdHJsZW4odGhpc19uYW1lKTsKKwkJaWYgKHRoaXNfbGVuIDwgc3RybGVuKG5leHRfbmFtZSkgJiYKKwkJICAgIHN0cm5jbXAodGhpc19uYW1lLCBuZXh0X25hbWUsIHRoaXNfbGVuKSA9PSAwICYmCisJCSAgICBuZXh0X25hbWVbdGhpc19sZW5dID09ICcvJykgeworCQkJaWYgKDEwIDwgKytmdW5ueSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiLi4uXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZwcmludGYoc3RkZXJyLCAiWW91IGhhdmUgYm90aCAlcyBhbmQgJXNcbiIsCisJCQkJdGhpc19uYW1lLCBuZXh0X25hbWUpOworCQl9CisJfQorCWlmIChmdW5ueSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaXNjYXJkX3VudXNlZF9zdWJ0cmVlcyhzdHJ1Y3QgY2FjaGVfdHJlZSAqaXQpCit7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICoqZG93biA9IGl0LT5kb3duOworCWludCBuciA9IGl0LT5zdWJ0cmVlX25yOworCWludCBkc3QsIHNyYzsKKwlmb3IgKGRzdCA9IHNyYyA9IDA7IHNyYyA8IG5yOyBzcmMrKykgeworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnMgPSBkb3duW3NyY107CisJCWlmIChzLT51c2VkKQorCQkJZG93bltkc3QrK10gPSBzOworCQllbHNlIHsKKwkJCWNhY2hlX3RyZWVfZnJlZSgmcy0+Y2FjaGVfdHJlZSk7CisJCQlmcmVlKHMpOworCQkJaXQtPnN1YnRyZWVfbnItLTsKKwkJfQorCX0KK30KKworaW50IGNhY2hlX3RyZWVfZnVsbHlfdmFsaWQoc3RydWN0IGNhY2hlX3RyZWUgKml0KQoreworCWludCBpOworCWlmICghaXQpCisJCXJldHVybiAwOworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwIHx8ICFoYXNfc2hhMV9maWxlKGl0LT5zaGExKSkKKwkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IGl0LT5zdWJ0cmVlX25yOyBpKyspIHsKKwkJaWYgKCFjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKGl0LT5kb3duW2ldLT5jYWNoZV90cmVlKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB1cGRhdGVfb25lKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJICAgICAgc3RydWN0IGNhY2hlX2VudHJ5ICoqY2FjaGUsCisJCSAgICAgIGludCBlbnRyaWVzLAorCQkgICAgICBjb25zdCBjaGFyICpiYXNlLAorCQkgICAgICBpbnQgYmFzZWxlbiwKKwkJICAgICAgaW50IG1pc3Npbmdfb2ssCisJCSAgICAgIGludCBkcnlydW4pCit7CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY2hhciAqYnVmZmVyOworCWludCBpOworCisJaWYgKDAgPD0gaXQtPmVudHJ5X2NvdW50ICYmIGhhc19zaGExX2ZpbGUoaXQtPnNoYTEpKQorCQlyZXR1cm4gaXQtPmVudHJ5X2NvdW50OworCisJLyoKKwkgKiBXZSBmaXJzdCBzY2FuIGZvciBzdWJ0cmVlcyBhbmQgdXBkYXRlIHRoZW07IHdlIHN0YXJ0IGJ5CisJICogbWFya2luZyBleGlzdGluZyBzdWJ0cmVlcyAtLSB0aGUgb25lcyB0aGF0IGFyZSB1bm1hcmtlZAorCSAqIHNob3VsZCBub3QgYmUgaW4gdGhlIHJlc3VsdC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykKKwkJaXQtPmRvd25baV0tPnVzZWQgPSAwOworCisJLyoKKwkgKiBGaW5kIHRoZSBzdWJ0cmVlcyBhbmQgdXBkYXRlIHRoZW0uCisJICovCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gY2FjaGVbaV07CisJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqc3ViOworCQljb25zdCBjaGFyICpwYXRoLCAqc2xhc2g7CisJCWludCBwYXRobGVuLCBzdWJsZW4sIHN1YmNudDsKKworCQlwYXRoID0gY2UtPm5hbWU7CisJCXBhdGhsZW4gPSBjZV9uYW1lbGVuKGNlKTsKKwkJaWYgKHBhdGhsZW4gPD0gYmFzZWxlbiB8fCBtZW1jbXAoYmFzZSwgcGF0aCwgYmFzZWxlbikpCisJCQlicmVhazsgLyogYXQgdGhlIGVuZCBvZiB0aGlzIGxldmVsICovCisKKwkJc2xhc2ggPSBzdHJjaHIocGF0aCArIGJhc2VsZW4sICcvJyk7CisJCWlmICghc2xhc2gpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogYS9iYmIvYyAoYmFzZSA9IGEvLCBzbGFzaCA9IC9jKQorCQkgKiA9PT4KKwkJICogcGF0aCtiYXNlbGVuID0gYmJiL2MsIHN1YmxlbiA9IDMKKwkJICovCisJCXN1YmxlbiA9IHNsYXNoIC0gKHBhdGggKyBiYXNlbGVuKTsKKwkJc3ViID0gZmluZF9zdWJ0cmVlKGl0LCBwYXRoICsgYmFzZWxlbiwgc3VibGVuLCAxKTsKKwkJaWYgKCFzdWItPmNhY2hlX3RyZWUpCisJCQlzdWItPmNhY2hlX3RyZWUgPSBjYWNoZV90cmVlKCk7CisJCXN1YmNudCA9IHVwZGF0ZV9vbmUoc3ViLT5jYWNoZV90cmVlLAorCQkJCSAgICBjYWNoZSArIGksIGVudHJpZXMgLSBpLAorCQkJCSAgICBwYXRoLAorCQkJCSAgICBiYXNlbGVuICsgc3VibGVuICsgMSwKKwkJCQkgICAgbWlzc2luZ19vaywKKwkJCQkgICAgZHJ5cnVuKTsKKwkJaSArPSBzdWJjbnQgLSAxOworCQlzdWItPnVzZWQgPSAxOworCX0KKworCWRpc2NhcmRfdW51c2VkX3N1YnRyZWVzKGl0KTsKKworCS8qCisJICogVGhlbiB3cml0ZSBvdXQgdGhlIHRyZWUgb2JqZWN0IGZvciB0aGlzIGxldmVsLgorCSAqLworCXNpemUgPSA4MTkyOworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisJb2Zmc2V0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGNhY2hlW2ldOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKnN1YjsKKwkJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoOworCQlpbnQgcGF0aGxlbiwgZW50bGVuOworCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCQl1bnNpZ25lZCBtb2RlOworCisJCXBhdGggPSBjZS0+bmFtZTsKKwkJcGF0aGxlbiA9IGNlX25hbWVsZW4oY2UpOworCQlpZiAocGF0aGxlbiA8PSBiYXNlbGVuIHx8IG1lbWNtcChiYXNlLCBwYXRoLCBiYXNlbGVuKSkKKwkJCWJyZWFrOyAvKiBhdCB0aGUgZW5kIG9mIHRoaXMgbGV2ZWwgKi8KKworCQlzbGFzaCA9IHN0cmNocihwYXRoICsgYmFzZWxlbiwgJy8nKTsKKwkJaWYgKHNsYXNoKSB7CisJCQllbnRsZW4gPSBzbGFzaCAtIChwYXRoICsgYmFzZWxlbik7CisJCQlzdWIgPSBmaW5kX3N1YnRyZWUoaXQsIHBhdGggKyBiYXNlbGVuLCBlbnRsZW4sIDApOworCQkJaWYgKCFzdWIpCisJCQkJZGllKCJjYWNoZS10cmVlLmM6ICclLipzJyBpbiAnJXMnIG5vdCBmb3VuZCIsCisJCQkJICAgIGVudGxlbiwgcGF0aCArIGJhc2VsZW4sIHBhdGgpOworCQkJaSArPSBzdWItPmNhY2hlX3RyZWUtPmVudHJ5X2NvdW50IC0gMTsKKwkJCXNoYTEgPSBzdWItPmNhY2hlX3RyZWUtPnNoYTE7CisJCQltb2RlID0gU19JRkRJUjsKKwkJfQorCQllbHNlIHsKKwkJCXNoYTEgPSBjZS0+c2hhMTsKKwkJCW1vZGUgPSBudG9obChjZS0+Y2VfbW9kZSk7CisJCQllbnRsZW4gPSBwYXRobGVuIC0gYmFzZWxlbjsKKwkJfQorCQlpZiAoIW1pc3Npbmdfb2sgJiYgIWhhc19zaGExX2ZpbGUoc2hhMSkpCisJCQlyZXR1cm4gZXJyb3IoImludmFsaWQgb2JqZWN0ICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCisJCWlmICghY2UtPmNlX21vZGUpCisJCQljb250aW51ZTsgLyogZW50cnkgYmVpbmcgcmVtb3ZlZCAqLworCisJCWlmIChzaXplIDwgb2Zmc2V0ICsgZW50bGVuICsgMTAwKSB7CisJCQlzaXplID0gYWxsb2NfbnIob2Zmc2V0ICsgZW50bGVuICsgMTAwKTsKKwkJCWJ1ZmZlciA9IHhyZWFsbG9jKGJ1ZmZlciwgc2l6ZSk7CisJCX0KKwkJb2Zmc2V0ICs9IHNwcmludGYoYnVmZmVyICsgb2Zmc2V0LAorCQkJCSAgIiVvICUuKnMiLCBtb2RlLCBlbnRsZW4sIHBhdGggKyBiYXNlbGVuKTsKKwkJYnVmZmVyW29mZnNldCsrXSA9IDA7CisJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIHNoYTEsIDIwKTsKKwkJb2Zmc2V0ICs9IDIwOworCisjaWYgREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIHVwZGF0ZS1vbmUgJW8gJS4qc1xuIiwKKwkJCW1vZGUsIGVudGxlbiwgcGF0aCArIGJhc2VsZW4pOworI2VuZGlmCisJfQorCisJaWYgKGRyeXJ1bikgeworCQl1bnNpZ25lZCBjaGFyIGhkclsyMDBdOworCQlpbnQgaGRybGVuOworCQl3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShidWZmZXIsIG9mZnNldCwgdHJlZV90eXBlLCBpdC0+c2hhMSwKKwkJCQkJaGRyLCAmaGRybGVuKTsKKwl9CisJZWxzZQorCQl3cml0ZV9zaGExX2ZpbGUoYnVmZmVyLCBvZmZzZXQsIHRyZWVfdHlwZSwgaXQtPnNoYTEpOworCWZyZWUoYnVmZmVyKTsKKwlpdC0+ZW50cnlfY291bnQgPSBpOworI2lmIERFQlVHCisJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIHVwZGF0ZS1vbmUgKCVkIGVudCwgJWQgc3VidHJlZSkgJXNcbiIsCisJCWl0LT5lbnRyeV9jb3VudCwgaXQtPnN1YnRyZWVfbnIsCisJCXNoYTFfdG9faGV4KGl0LT5zaGExKSk7CisjZW5kaWYKKwlyZXR1cm4gaTsKK30KKworaW50IGNhY2hlX3RyZWVfdXBkYXRlKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJICAgICAgc3RydWN0IGNhY2hlX2VudHJ5ICoqY2FjaGUsCisJCSAgICAgIGludCBlbnRyaWVzLAorCQkgICAgICBpbnQgbWlzc2luZ19vaywKKwkJICAgICAgaW50IGRyeXJ1bikKK3sKKwlpbnQgaTsKKwlpID0gdmVyaWZ5X2NhY2hlKGNhY2hlLCBlbnRyaWVzKTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisJaSA9IHVwZGF0ZV9vbmUoaXQsIGNhY2hlLCBlbnRyaWVzLCAiIiwgMCwgbWlzc2luZ19vaywgZHJ5cnVuKTsKKwlpZiAoaSA8IDApCisJCXJldHVybiBpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqd3JpdGVfb25lKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJICAgICAgIGNoYXIgKnBhdGgsCisJCSAgICAgICBpbnQgcGF0aGxlbiwKKwkJICAgICAgIGNoYXIgKmJ1ZmZlciwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnNpemUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nICpvZmZzZXQpCit7CisJaW50IGk7CisKKwkvKiBPbmUgImNhY2hlLXRyZWUiIGVudHJ5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmc6CisJICogcGF0aCAoTlVMIHRlcm1pbmF0ZWQpCisJICogZW50cnlfY291bnQsIHN1YnRyZWVfbnIgKCIlZCAlZFxuIikKKwkgKiB0cmVlLXNoYTEgKG1pc3NpbmcgaWYgaW52YWxpZCkKKwkgKiBzdWJ0cmVlX25yICJjYWNoZS10cmVlIiBlbnRyaWVzIGZvciBzdWJ0cmVlcy4KKwkgKi8KKwlpZiAoKnNpemUgPCAqb2Zmc2V0ICsgcGF0aGxlbiArIDEwMCkgeworCQkqc2l6ZSA9IGFsbG9jX25yKCpvZmZzZXQgKyBwYXRobGVuICsgMTAwKTsKKwkJYnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLCAqc2l6ZSk7CisJfQorCSpvZmZzZXQgKz0gc3ByaW50ZihidWZmZXIgKyAqb2Zmc2V0LCAiJS4qcyVjJWQgJWRcbiIsCisJCQkgICBwYXRobGVuLCBwYXRoLCAwLAorCQkJICAgaXQtPmVudHJ5X2NvdW50LCBpdC0+c3VidHJlZV9ucik7CisKKyNpZiBERUJVRworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIDwlLipzPiAoJWQgZW50LCAlZCBzdWJ0cmVlKSAlc1xuIiwKKwkJCXBhdGhsZW4sIHBhdGgsIGl0LT5lbnRyeV9jb3VudCwgaXQtPnN1YnRyZWVfbnIsCisJCQlzaGExX3RvX2hleChpdC0+c2hhMSkpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJjYWNoZS10cmVlIDwlLipzPiAoJWQgc3VidHJlZSkgaW52YWxpZFxuIiwKKwkJCXBhdGhsZW4sIHBhdGgsIGl0LT5zdWJ0cmVlX25yKTsKKyNlbmRpZgorCisJaWYgKDAgPD0gaXQtPmVudHJ5X2NvdW50KSB7CisJCW1lbWNweShidWZmZXIgKyAqb2Zmc2V0LCBpdC0+c2hhMSwgMjApOworCQkqb2Zmc2V0ICs9IDIwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd24gPSBpdC0+ZG93bltpXTsKKwkJaWYgKGkpIHsKKwkJCXN0cnVjdCBjYWNoZV90cmVlX3N1YiAqcHJldiA9IGl0LT5kb3duW2ktMV07CisJCQlpZiAoc3VidHJlZV9uYW1lX2NtcChkb3duLT5uYW1lLCBkb3duLT5uYW1lbGVuLAorCQkJCQkgICAgIHByZXYtPm5hbWUsIHByZXYtPm5hbWVsZW4pIDw9IDApCisJCQkJZGllKCJmYXRhbCAtIHVuc29ydGVkIGNhY2hlIHN1YnRyZWUiKTsKKwkJfQorCQlidWZmZXIgPSB3cml0ZV9vbmUoZG93bi0+Y2FjaGVfdHJlZSwgZG93bi0+bmFtZSwgZG93bi0+bmFtZWxlbiwKKwkJCQkgICBidWZmZXIsIHNpemUsIG9mZnNldCk7CisJfQorCXJldHVybiBidWZmZXI7Cit9CisKK3ZvaWQgKmNhY2hlX3RyZWVfd3JpdGUoc3RydWN0IGNhY2hlX3RyZWUgKnJvb3QsIHVuc2lnbmVkIGxvbmcgKnNpemVfcCkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDgxOTI7CisJY2hhciAqYnVmZmVyID0geG1hbGxvYyhzaXplKTsKKworCSpzaXplX3AgPSAwOworCXBhdGhbMF0gPSAwOworCXJldHVybiB3cml0ZV9vbmUocm9vdCwgcGF0aCwgMCwgYnVmZmVyLCAmc2l6ZSwgc2l6ZV9wKTsKK30KKworc3RhdGljIHN0cnVjdCBjYWNoZV90cmVlICpyZWFkX29uZShjb25zdCBjaGFyICoqYnVmZmVyLCB1bnNpZ25lZCBsb25nICpzaXplX3ApCit7CisJY29uc3QgY2hhciAqYnVmID0gKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAqc2l6ZV9wOworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmVwOworCXN0cnVjdCBjYWNoZV90cmVlICppdDsKKwlpbnQgaSwgc3VidHJlZV9ucjsKKworCWl0ID0gTlVMTDsKKwkvKiBza2lwIG5hbWUsIGJ1dCBtYWtlIHN1cmUgbmFtZSBleGlzdHMgKi8KKwl3aGlsZSAoc2l6ZSAmJiAqYnVmKSB7CisJCXNpemUtLTsKKwkJYnVmKys7CisJfQorCWlmICghc2l6ZSkKKwkJZ290byBmcmVlX3JldHVybjsKKwlidWYrKzsgc2l6ZS0tOworCWl0ID0gY2FjaGVfdHJlZSgpOworCisJY3AgPSBidWY7CisJaXQtPmVudHJ5X2NvdW50ID0gc3RydG9sKGNwLCAmZXAsIDEwKTsKKwlpZiAoY3AgPT0gZXApCisJCWdvdG8gZnJlZV9yZXR1cm47CisJY3AgPSBlcDsKKwlzdWJ0cmVlX25yID0gc3RydG9sKGNwLCAmZXAsIDEwKTsKKwlpZiAoY3AgPT0gZXApCisJCWdvdG8gZnJlZV9yZXR1cm47CisJd2hpbGUgKHNpemUgJiYgKmJ1ZiAmJiAqYnVmICE9ICdcbicpIHsKKwkJc2l6ZS0tOworCQlidWYrKzsKKwl9CisJaWYgKCFzaXplKQorCQlnb3RvIGZyZWVfcmV0dXJuOworCWJ1ZisrOyBzaXplLS07CisJaWYgKDAgPD0gaXQtPmVudHJ5X2NvdW50KSB7CisJCWlmIChzaXplIDwgMjApCisJCQlnb3RvIGZyZWVfcmV0dXJuOworCQltZW1jcHkoaXQtPnNoYTEsIGJ1ZiwgMjApOworCQlidWYgKz0gMjA7CisJCXNpemUgLT0gMjA7CisJfQorCisjaWYgREVCVUcKKwlpZiAoMCA8PSBpdC0+ZW50cnlfY291bnQpCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JXM+ICglZCBlbnQsICVkIHN1YnRyZWUpICVzXG4iLAorCQkJKmJ1ZmZlciwgaXQtPmVudHJ5X2NvdW50LCBzdWJ0cmVlX25yLAorCQkJc2hhMV90b19oZXgoaXQtPnNoYTEpKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiY2FjaGUtdHJlZSA8JXM+ICglZCBzdWJ0cmVlcykgaW52YWxpZFxuIiwKKwkJCSpidWZmZXIsIHN1YnRyZWVfbnIpOworI2VuZGlmCisKKwkvKgorCSAqIEp1c3QgYSBoZXVyaXN0aWMgLS0gd2UgZG8gbm90IGFkZCBkaXJlY3RvcmllcyB0aGF0IG9mdGVuIGJ1dAorCSAqIHdlIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gZXh0ZW5kIGl0IGltbWVkaWF0ZWx5IHdoZW4gd2UgZG8sCisJICogaGVuY2UgKzIuCisJICovCisJaXQtPnN1YnRyZWVfYWxsb2MgPSBzdWJ0cmVlX25yICsgMjsKKwlpdC0+ZG93biA9IHhjYWxsb2MoaXQtPnN1YnRyZWVfYWxsb2MsIHNpemVvZihzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKikpOworCWZvciAoaSA9IDA7IGkgPCBzdWJ0cmVlX25yOyBpKyspIHsKKwkJLyogcmVhZCBlYWNoIHN1YnRyZWUgKi8KKwkJc3RydWN0IGNhY2hlX3RyZWUgKnN1YjsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWJ0cmVlOworCQljb25zdCBjaGFyICpuYW1lID0gYnVmOworCisJCXN1YiA9IHJlYWRfb25lKCZidWYsICZzaXplKTsKKwkJaWYgKCFzdWIpCisJCQlnb3RvIGZyZWVfcmV0dXJuOworCQlzdWJ0cmVlID0gY2FjaGVfdHJlZV9zdWIoaXQsIG5hbWUpOworCQlzdWJ0cmVlLT5jYWNoZV90cmVlID0gc3ViOworCX0KKwlpZiAoc3VidHJlZV9uciAhPSBpdC0+c3VidHJlZV9ucikKKwkJZGllKCJjYWNoZS10cmVlOiBpbnRlcm5hbCBlcnJvciIpOworCSpidWZmZXIgPSBidWY7CisJKnNpemVfcCA9IHNpemU7CisJcmV0dXJuIGl0OworCisgZnJlZV9yZXR1cm46CisJY2FjaGVfdHJlZV9mcmVlKCZpdCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX3JlYWQoY29uc3QgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKGJ1ZmZlclswXSkKKwkJcmV0dXJuIE5VTEw7IC8qIG5vdCB0aGUgd2hvbGUgdHJlZSAqLworCXJldHVybiByZWFkX29uZSgmYnVmZmVyLCAmc2l6ZSk7Cit9CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX2ZpbmQoc3RydWN0IGNhY2hlX3RyZWUgKml0LCBjb25zdCBjaGFyICpwYXRoKQoreworCXdoaWxlICgqcGF0aCkgeworCQljb25zdCBjaGFyICpzbGFzaDsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpzdWI7CisKKwkJc2xhc2ggPSBzdHJjaHIocGF0aCwgJy8nKTsKKwkJaWYgKCFzbGFzaCkKKwkJCXNsYXNoID0gcGF0aCArIHN0cmxlbihwYXRoKTsKKwkJLyogYmV0d2VlbiBwYXRoIGFuZCBzbGFzaCBpcyB0aGUgbmFtZSBvZiB0aGUKKwkJICogc3VidHJlZSB0byBsb29rIGZvci4KKwkJICovCisJCXN1YiA9IGZpbmRfc3VidHJlZShpdCwgcGF0aCwgc2xhc2ggLSBwYXRoLCAwKTsKKwkJaWYgKCFzdWIpCisJCQlyZXR1cm4gTlVMTDsKKwkJaXQgPSBzdWItPmNhY2hlX3RyZWU7CisJCWlmIChzbGFzaCkKKwkJCXdoaWxlICgqc2xhc2ggJiYgKnNsYXNoID09ICcvJykKKwkJCQlzbGFzaCsrOworCQlpZiAoIXNsYXNoIHx8ICEqc2xhc2gpCisJCQlyZXR1cm4gaXQ7IC8qIHByZWZpeCBlbmRlZCB3aXRoIHNsYXNoZXMgKi8KKwkJcGF0aCA9IHNsYXNoOworCX0KKwlyZXR1cm4gaXQ7Cit9CmRpZmYgLS1naXQgYS9jYWNoZS10cmVlLmggYi9jYWNoZS10cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5NDA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhY2hlLXRyZWUuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIENBQ0hFX1RSRUVfSAorI2RlZmluZSBDQUNIRV9UUkVFX0gKKworc3RydWN0IGNhY2hlX3RyZWU7CitzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgeworCXN0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlOworCWludCBuYW1lbGVuOworCWludCB1c2VkOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsKK307CisKK3N0cnVjdCBjYWNoZV90cmVlIHsKKwlpbnQgZW50cnlfY291bnQ7IC8qIG5lZ2F0aXZlIG1lYW5zICJpbnZhbGlkIiAqLworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHN1YnRyZWVfbnI7CisJaW50IHN1YnRyZWVfYWxsb2M7CisJc3RydWN0IGNhY2hlX3RyZWVfc3ViICoqZG93bjsKK307CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlKHZvaWQpOwordm9pZCBjYWNoZV90cmVlX2ZyZWUoc3RydWN0IGNhY2hlX3RyZWUgKiopOwordm9pZCBjYWNoZV90cmVlX2ludmFsaWRhdGVfcGF0aChzdHJ1Y3QgY2FjaGVfdHJlZSAqLCBjb25zdCBjaGFyICopOworc3RydWN0IGNhY2hlX3RyZWVfc3ViICpjYWNoZV90cmVlX3N1YihzdHJ1Y3QgY2FjaGVfdHJlZSAqLCBjb25zdCBjaGFyICopOworCit2b2lkICpjYWNoZV90cmVlX3dyaXRlKHN0cnVjdCBjYWNoZV90cmVlICpyb290LCB1bnNpZ25lZCBsb25nICpzaXplX3ApOworc3RydWN0IGNhY2hlX3RyZWUgKmNhY2hlX3RyZWVfcmVhZChjb25zdCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2ludCBjYWNoZV90cmVlX2Z1bGx5X3ZhbGlkKHN0cnVjdCBjYWNoZV90cmVlICopOworaW50IGNhY2hlX3RyZWVfdXBkYXRlKHN0cnVjdCBjYWNoZV90cmVlICosIHN0cnVjdCBjYWNoZV9lbnRyeSAqKiwgaW50LCBpbnQsIGludCk7CisKK3N0cnVjdCBjYWNoZV90cmVlICpjYWNoZV90cmVlX2ZpbmQoc3RydWN0IGNhY2hlX3RyZWUgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jYWNoZS5oIGIvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFiMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvY2FjaGUuaApAQCAtMCwwICsxLDQwNiBAQAorI2lmbmRlZiBDQUNIRV9ICisjZGVmaW5lIENBQ0hFX0gKKworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorCisjaW5jbHVkZSBTSEExX0hFQURFUgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2lmIFpMSUJfVkVSTlVNIDwgMHgxMjAwCisjZGVmaW5lIGRlZmxhdGVCb3VuZChjLHMpICAoKHMpICsgKCgocykgKyA3KSA+PiAzKSArICgoKHMpICsgNjMpID4+IDYpICsgMTEpCisjZW5kaWYKKworI2lmIGRlZmluZWQoRFRfVU5LTk9XTikgJiYgIWRlZmluZWQoTk9fRF9UWVBFX0lOX0RJUkVOVCkKKyNkZWZpbmUgRFRZUEUoZGUpCSgoZGUpLT5kX3R5cGUpCisjZWxzZQorI3VuZGVmIERUX1VOS05PV04KKyN1bmRlZiBEVF9ESVIKKyN1bmRlZiBEVF9SRUcKKyN1bmRlZiBEVF9MTksKKyNkZWZpbmUgRFRfVU5LTk9XTgkwCisjZGVmaW5lIERUX0RJUgkJMQorI2RlZmluZSBEVF9SRUcJCTIKKyNkZWZpbmUgRFRfTE5LCQkzCisjZGVmaW5lIERUWVBFKGRlKQlEVF9VTktOT1dOCisjZW5kaWYKKworLyoKKyAqIEludGVuc2l2ZSByZXNlYXJjaCBvdmVyIHRoZSBjb3Vyc2Ugb2YgbWFueSB5ZWFycyBoYXMgc2hvd24gdGhhdAorICogcG9ydCA5NDE4IGlzIHRvdGFsbHkgdW51c2VkIGJ5IGFueXRoaW5nIGVsc2UuIE9yCisgKgorICoJWW91ciBzZWFyY2ggLSAicG9ydCA5NDE4IiAtIGRpZCBub3QgbWF0Y2ggYW55IGRvY3VtZW50cy4KKyAqCisgKiBhcyB3d3cuZ29vZ2xlLmNvbSBwdXRzIGl0LgorICoKKyAqIFRoaXMgcG9ydCBoYXMgYmVlbiBwcm9wZXJseSBhc3NpZ25lZCBmb3IgZ2l0IHVzZSBieSBJQU5BOgorICogZ2l0IChBc3NpZ25lZC05NDE4KSBbSTA2LTA1MDcyOC0wMDAxXS4KKyAqCisgKglnaXQgIDk0MTgvdGNwICAgZ2l0IHBhY2sgdHJhbnNmZXIgc2VydmljZQorICoJZ2l0ICA5NDE4L3VkcCAgIGdpdCBwYWNrIHRyYW5zZmVyIHNlcnZpY2UKKyAqCisgKiB3aXRoIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4gYXMgdGhlIHBvaW50IG9mCisgKiBjb250YWN0LiBTZXB0ZW1iZXIgMjAwNS4KKyAqCisgKiBTZWUgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9wb3J0LW51bWJlcnMKKyAqLworI2RlZmluZSBERUZBVUxUX0dJVF9QT1JUIDk0MTgKKworLyoKKyAqIEJhc2ljIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGRpcmVjdG9yeSBjYWNoZQorICovCisKKyNkZWZpbmUgQ0FDSEVfU0lHTkFUVVJFIDB4NDQ0OTUyNDMJLyogIkRJUkMiICovCitzdHJ1Y3QgY2FjaGVfaGVhZGVyIHsKKwl1bnNpZ25lZCBpbnQgaGRyX3NpZ25hdHVyZTsKKwl1bnNpZ25lZCBpbnQgaGRyX3ZlcnNpb247CisJdW5zaWduZWQgaW50IGhkcl9lbnRyaWVzOworfTsKKworLyoKKyAqIFRoZSAiY2FjaGVfdGltZSIgaXMganVzdCB0aGUgbG93IDMyIGJpdHMgb2YgdGhlCisgKiB0aW1lLiBJdCBkb2Vzbid0IG1hdHRlciBpZiBpdCBvdmVyZmxvd3MgLSB3ZSBvbmx5CisgKiBjaGVjayBpdCBmb3IgZXF1YWxpdHkgaW4gdGhlIDMyIGJpdHMgd2Ugc2F2ZS4KKyAqLworc3RydWN0IGNhY2hlX3RpbWUgeworCXVuc2lnbmVkIGludCBzZWM7CisJdW5zaWduZWQgaW50IG5zZWM7Cit9OworCisvKgorICogZGV2L2luby91aWQvZ2lkL3NpemUgYXJlIGFsc28ganVzdCB0cmFja2VkIHRvIHRoZSBsb3cgMzIgYml0cworICogQWdhaW4gLSB0aGlzIGlzIGp1c3QgYSAodmVyeSBzdHJvbmcgaW4gcHJhY3RpY2UpIGhldXJpc3RpYyB0aGF0CisgKiB0aGUgaW5vZGUgaGFzbid0IGNoYW5nZWQuCisgKgorICogV2Ugc2F2ZSB0aGUgZmllbGRzIGluIGJpZy1lbmRpYW4gb3JkZXIgdG8gYWxsb3cgdXNpbmcgdGhlCisgKiBpbmRleCBmaWxlIG92ZXIgTkZTIHRyYW5zcGFyZW50bHkuCisgKi8KK3N0cnVjdCBjYWNoZV9lbnRyeSB7CisJc3RydWN0IGNhY2hlX3RpbWUgY2VfY3RpbWU7CisJc3RydWN0IGNhY2hlX3RpbWUgY2VfbXRpbWU7CisJdW5zaWduZWQgaW50IGNlX2RldjsKKwl1bnNpZ25lZCBpbnQgY2VfaW5vOworCXVuc2lnbmVkIGludCBjZV9tb2RlOworCXVuc2lnbmVkIGludCBjZV91aWQ7CisJdW5zaWduZWQgaW50IGNlX2dpZDsKKwl1bnNpZ25lZCBpbnQgY2Vfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIHNob3J0IGNlX2ZsYWdzOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworI2RlZmluZSBDRV9OQU1FTUFTSyAgKDB4MGZmZikKKyNkZWZpbmUgQ0VfU1RBR0VNQVNLICgweDMwMDApCisjZGVmaW5lIENFX1VQREFURSAgICAoMHg0MDAwKQorI2RlZmluZSBDRV9WQUxJRCAgICAgKDB4ODAwMCkKKyNkZWZpbmUgQ0VfU1RBR0VTSElGVCAxMgorCisjZGVmaW5lIGNyZWF0ZV9jZV9mbGFncyhsZW4sIHN0YWdlKSBodG9ucygobGVuKSB8ICgoc3RhZ2UpIDw8IENFX1NUQUdFU0hJRlQpKQorI2RlZmluZSBjZV9uYW1lbGVuKGNlKSAoQ0VfTkFNRU1BU0sgJiBudG9ocygoY2UpLT5jZV9mbGFncykpCisjZGVmaW5lIGNlX3NpemUoY2UpIGNhY2hlX2VudHJ5X3NpemUoY2VfbmFtZWxlbihjZSkpCisjZGVmaW5lIGNlX3N0YWdlKGNlKSAoKENFX1NUQUdFTUFTSyAmIG50b2hzKChjZSktPmNlX2ZsYWdzKSkgPj4gQ0VfU1RBR0VTSElGVCkKKworI2RlZmluZSBjZV9wZXJtaXNzaW9ucyhtb2RlKSAoKChtb2RlKSAmIDAxMDApID8gMDc1NSA6IDA2NDQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcmVhdGVfY2VfbW9kZSh1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJcmV0dXJuIGh0b25sKFNfSUZMTkspOworCXJldHVybiBodG9ubChTX0lGUkVHIHwgY2VfcGVybWlzc2lvbnMobW9kZSkpOworfQorI2RlZmluZSBjYW5vbl9tb2RlKG1vZGUpIFwKKwkoU19JU1JFRyhtb2RlKSA/IChTX0lGUkVHIHwgY2VfcGVybWlzc2lvbnMobW9kZSkpIDogXAorCVNfSVNMTksobW9kZSkgPyBTX0lGTE5LIDogU19JRkRJUikKKworI2RlZmluZSBjYWNoZV9lbnRyeV9zaXplKGxlbikgKChvZmZzZXRvZihzdHJ1Y3QgY2FjaGVfZW50cnksbmFtZSkgKyAobGVuKSArIDgpICYgfjcpCisKK2V4dGVybiBzdHJ1Y3QgY2FjaGVfZW50cnkgKiphY3RpdmVfY2FjaGU7CitleHRlcm4gdW5zaWduZWQgaW50IGFjdGl2ZV9uciwgYWN0aXZlX2FsbG9jLCBhY3RpdmVfY2FjaGVfY2hhbmdlZDsKK2V4dGVybiBzdHJ1Y3QgY2FjaGVfdHJlZSAqYWN0aXZlX2NhY2hlX3RyZWU7CitleHRlcm4gaW50IGNhY2hlX2Vycm5vOworCisjZGVmaW5lIEdJVF9ESVJfRU5WSVJPTk1FTlQgIkdJVF9ESVIiCisjZGVmaW5lIERFRkFVTFRfR0lUX0RJUl9FTlZJUk9OTUVOVCAiLmdpdCIKKyNkZWZpbmUgREJfRU5WSVJPTk1FTlQgIkdJVF9PQkpFQ1RfRElSRUNUT1JZIgorI2RlZmluZSBJTkRFWF9FTlZJUk9OTUVOVCAiR0lUX0lOREVYX0ZJTEUiCisjZGVmaW5lIEdSQUZUX0VOVklST05NRU5UICJHSVRfR1JBRlRfRklMRSIKKworZXh0ZXJuIGNoYXIgKmdldF9naXRfZGlyKHZvaWQpOworZXh0ZXJuIGNoYXIgKmdldF9vYmplY3RfZGlyZWN0b3J5KHZvaWQpOworZXh0ZXJuIGNoYXIgKmdldF9yZWZzX2RpcmVjdG9yeSh2b2lkKTsKK2V4dGVybiBjaGFyICpnZXRfaW5kZXhfZmlsZSh2b2lkKTsKK2V4dGVybiBjaGFyICpnZXRfZ3JhZnRfZmlsZSh2b2lkKTsKKworI2RlZmluZSBBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQgIkdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTIgorCitleHRlcm4gY29uc3QgY2hhciAqKmdldF9wYXRoc3BlYyhjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKipwYXRoc3BlYyk7CitleHRlcm4gY29uc3QgY2hhciAqc2V0dXBfZ2l0X2RpcmVjdG9yeV9nZW50bHkoaW50ICopOworZXh0ZXJuIGNvbnN0IGNoYXIgKnNldHVwX2dpdF9kaXJlY3Rvcnkodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4X3BhdGgoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgbGVuLCBjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXhfZmlsZW5hbWUoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgbGVuLCBjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiB2b2lkIHZlcmlmeV9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgdmVyaWZ5X25vbl9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZGVmaW5lIGFsbG9jX25yKHgpICgoKHgpKzE2KSozLzIpCisKKy8qIEluaXRpYWxpemUgYW5kIHVzZSB0aGUgY2FjaGUgaW5mb3JtYXRpb24gKi8KK2V4dGVybiBpbnQgcmVhZF9jYWNoZSh2b2lkKTsKK2V4dGVybiBpbnQgcmVhZF9jYWNoZV9mcm9tKGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIGludCB3cml0ZV9jYWNoZShpbnQgbmV3ZmQsIHN0cnVjdCBjYWNoZV9lbnRyeSAqKmNhY2hlLCBpbnQgZW50cmllcyk7CitleHRlcm4gaW50IHZlcmlmeV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIGludCBjYWNoZV9uYW1lX3Bvcyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZGVmaW5lIEFERF9DQUNIRV9PS19UT19BREQgMQkJLyogT2sgdG8gYWRkICovCisjZGVmaW5lIEFERF9DQUNIRV9PS19UT19SRVBMQUNFIDIJLyogT2sgdG8gcmVwbGFjZSBmaWxlL2RpcmVjdG9yeSAqLworI2RlZmluZSBBRERfQ0FDSEVfU0tJUF9ERkNIRUNLIDQJLyogT2sgdG8gc2tpcCBERiBjb25mbGljdCBjaGVja3MgKi8KK2V4dGVybiBpbnQgYWRkX2NhY2hlX2VudHJ5KHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIGludCBvcHRpb24pOworZXh0ZXJuIHN0cnVjdCBjYWNoZV9lbnRyeSAqcmVmcmVzaF9jYWNoZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcmVhbGx5KTsKK2V4dGVybiBpbnQgcmVtb3ZlX2NhY2hlX2VudHJ5X2F0KGludCBwb3MpOworZXh0ZXJuIGludCByZW1vdmVfZmlsZV9mcm9tX2NhY2hlKGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIGludCBhZGRfZmlsZV90b19pbmRleChjb25zdCBjaGFyICpwYXRoLCBpbnQgdmVyYm9zZSk7CitleHRlcm4gaW50IGNlX3NhbWVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYik7CitleHRlcm4gaW50IGNlX21hdGNoX3N0YXQoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0LCBpbnQpOworZXh0ZXJuIGludCBjZV9tb2RpZmllZChzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCk7CitleHRlcm4gaW50IGNlX3BhdGhfbWF0Y2goY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgY29uc3QgY2hhciAqKnBhdGhzcGVjKTsKK2V4dGVybiBpbnQgaW5kZXhfZmQodW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCB3cml0ZV9vYmplY3QsIGNvbnN0IGNoYXIgKnR5cGUpOworZXh0ZXJuIGludCByZWFkX3BpcGUoaW50IGZkLCBjaGFyKiogcmV0dXJuX2J1ZiwgdW5zaWduZWQgbG9uZyogcmV0dXJuX3NpemUpOworZXh0ZXJuIGludCBpbmRleF9waXBlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHdyaXRlX29iamVjdCk7CitleHRlcm4gaW50IGluZGV4X3BhdGgodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0KTsKK2V4dGVybiB2b2lkIGZpbGxfc3RhdF9jYWNoZV9pbmZvKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCk7CisKKyNkZWZpbmUgUkVGUkVTSF9SRUFMTFkJCTB4MDAwMQkvKiBpZ25vcmVfdmFsaWQgKi8KKyNkZWZpbmUgUkVGUkVTSF9VTk1FUkdFRAkweDAwMDIJLyogYWxsb3cgdW5tZXJnZWQgKi8KKyNkZWZpbmUgUkVGUkVTSF9RVUlFVAkJMHgwMDA0CS8qIGJlIHF1aWV0IGFib3V0IGl0ICovCisjZGVmaW5lIFJFRlJFU0hfSUdOT1JFX01JU1NJTkcJMHgwMDA4CS8qIGlnbm9yZSBub24tZXhpc3RlbnQgKi8KK2V4dGVybiBpbnQgcmVmcmVzaF9jYWNoZSh1bnNpZ25lZCBpbnQgZmxhZ3MpOworCitzdHJ1Y3QgbG9ja19maWxlIHsKKwlzdHJ1Y3QgbG9ja19maWxlICpuZXh0OworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworfTsKK2V4dGVybiBpbnQgaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZShzdHJ1Y3QgbG9ja19maWxlICosIGNvbnN0IGNoYXIgKnBhdGgsIGludCk7CitleHRlcm4gaW50IGNvbW1pdF9sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqKTsKK2V4dGVybiB2b2lkIHJvbGxiYWNrX2xvY2tfZmlsZShzdHJ1Y3QgbG9ja19maWxlICopOworCisvKiBFbnZpcm9ubWVudCBiaXRzIGZyb20gY29uZmlndXJhdGlvbiBtZWNoYW5pc20gKi8KK2V4dGVybiBpbnQgdXNlX2xlZ2FjeV9oZWFkZXJzOworZXh0ZXJuIGludCB0cnVzdF9leGVjdXRhYmxlX2JpdDsKK2V4dGVybiBpbnQgYXNzdW1lX3VuY2hhbmdlZDsKK2V4dGVybiBpbnQgcHJlZmVyX3N5bWxpbmtfcmVmczsKK2V4dGVybiBpbnQgbG9nX2FsbF9yZWZfdXBkYXRlczsKK2V4dGVybiBpbnQgd2Fybl9hbWJpZ3VvdXNfcmVmczsKK2V4dGVybiBpbnQgc2hhcmVkX3JlcG9zaXRvcnk7CitleHRlcm4gY29uc3QgY2hhciAqYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlOworZXh0ZXJuIGludCB6bGliX2NvbXByZXNzaW9uX2xldmVsOworCisjZGVmaW5lIEdJVF9SRVBPX1ZFUlNJT04gMAorZXh0ZXJuIGludCByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uOworZXh0ZXJuIGludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdCh2b2lkKTsKKworI2RlZmluZSBNVElNRV9DSEFOR0VECTB4MDAwMQorI2RlZmluZSBDVElNRV9DSEFOR0VECTB4MDAwMgorI2RlZmluZSBPV05FUl9DSEFOR0VECTB4MDAwNAorI2RlZmluZSBNT0RFX0NIQU5HRUQgICAgMHgwMDA4CisjZGVmaW5lIElOT0RFX0NIQU5HRUQgICAweDAwMTAKKyNkZWZpbmUgREFUQV9DSEFOR0VEICAgIDB4MDAyMAorI2RlZmluZSBUWVBFX0NIQU5HRUQgICAgMHgwMDQwCisKKy8qIFJldHVybiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGZpbGVuYW1lIG1hdGNoaW5nIHRoZSBzaGExIHNpZ25hdHVyZSAqLworZXh0ZXJuIGNoYXIgKm1rcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitleHRlcm4gY2hhciAqZ2l0X3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGNoYXIgKnNoYTFfZmlsZV9uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNoYXIgKnNoYTFfcGFja19uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNoYXIgKnNoYTFfcGFja19pbmRleF9uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmZpbmRfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQpOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgbnVsbF9zaGExWzIwXTsKKworaW50IGdpdF9ta3N0ZW1wKGNoYXIgKnBhdGgsIHNpemVfdCBuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSk7CisKK2VudW0gc2hhcmVkcmVwbyB7CisJUEVSTV9VTUFTSyA9IDAsCisJUEVSTV9HUk9VUCwKKwlQRVJNX0VWRVJZQk9EWQorfTsKK2ludCBnaXRfY29uZmlnX3Blcm0oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSk7CitpbnQgYWRqdXN0X3NoYXJlZF9wZXJtKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IHNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoY2hhciAqcGF0aCk7CitjaGFyICplbnRlcl9yZXBvKGNoYXIgKnBhdGgsIGludCBzdHJpY3QpOworCisvKiBSZWFkIGFuZCB1bnBhY2sgYSBzaGExIGZpbGUgaW50byBtZW1vcnksIHdyaXRlIG1lbW9yeSB0byBhIHNoYTEgZmlsZSAqLworZXh0ZXJuIGludCBzaGExX29iamVjdF9pbmZvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY2hhciAqLCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIHZvaWQgKiB1bnBhY2tfc2hhMV9maWxlKHZvaWQgKm1hcCwgdW5zaWduZWQgbG9uZyBtYXBzaXplLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplKTsKK2V4dGVybiB2b2lkICogcmVhZF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CitleHRlcm4gaW50IHdyaXRlX3NoYTFfZmlsZSh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBjb25zdCBjaGFyICp0eXBlLCB1bnNpZ25lZCBjaGFyICpyZXR1cm5fc2hhMSk7CitleHRlcm4gY2hhciAqd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUodm9pZCAqYnVmLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICAgICBjb25zdCBjaGFyICp0eXBlLAorCQkJCSAgICAgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmhkciwKKwkJCQkgICAgIGludCAqaGRybGVuKTsKKworZXh0ZXJuIGludCBjaGVja19zaGExX3NpZ25hdHVyZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqdHlwZSk7CisKK2V4dGVybiBpbnQgd3JpdGVfc2hhMV9mcm9tX2ZkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY2hhciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGJ1ZnNpemUsIHNpemVfdCAqYnVmcG9zbik7CitleHRlcm4gaW50IHdyaXRlX3NoYTFfdG9fZmQoaW50IGZkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgbW92ZV90ZW1wX3RvX2ZpbGUoY29uc3QgY2hhciAqdG1wZmlsZSwgY2hhciAqZmlsZW5hbWUpOworCitleHRlcm4gaW50IGhhc19zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CitleHRlcm4gaW50IGhhc19zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK2V4dGVybiBpbnQgaGFzX3BhY2tfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgaGFzX3BhY2tfaW5kZXgoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKy8qIENvbnZlcnQgdG8vZnJvbSBoZXgvc2hhMSByZXByZXNlbnRhdGlvbiAqLworI2RlZmluZSBNSU5JTVVNX0FCQlJFViA0CisjZGVmaW5lIERFRkFVTFRfQUJCUkVWIDcKKworZXh0ZXJuIGludCBnZXRfc2hhMShjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKnNoYTEpOworZXh0ZXJuIGludCBnZXRfc2hhMV9oZXgoY29uc3QgY2hhciAqaGV4LCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjaGFyICpzaGExX3RvX2hleChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsJLyogc3RhdGljIGJ1ZmZlciByZXN1bHQhICovCitleHRlcm4gaW50IHJlYWRfcmVmKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBjb25zdCBjaGFyICpyZXNvbHZlX3JlZihjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQpOworZXh0ZXJuIGludCBjcmVhdGVfc3ltcmVmKGNvbnN0IGNoYXIgKmdpdF9IRUFELCBjb25zdCBjaGFyICpyZWZzX2hlYWRzX21hc3Rlcik7CitleHRlcm4gaW50IHZhbGlkYXRlX3N5bXJlZihjb25zdCBjaGFyICpnaXRfSEVBRCk7CisKK2V4dGVybiBpbnQgYmFzZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBsZW4xLCBpbnQgbW9kZTEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgbGVuMiwgaW50IG1vZGUyKTsKK2V4dGVybiBpbnQgY2FjaGVfbmFtZV9jb21wYXJlKGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgbGVuMSwgY29uc3QgY2hhciAqbmFtZTIsIGludCBsZW4yKTsKKworZXh0ZXJuIHZvaWQgKnJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCWNvbnN0IGNoYXIgKnJlcXVpcmVkX3R5cGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnNpemUsCisJCQkJCXVuc2lnbmVkIGNoYXIgKnNoYTFfcmV0KTsKKworY29uc3QgY2hhciAqc2hvd19kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHRpbWV6b25lKTsKK2NvbnN0IGNoYXIgKnNob3dfcmZjMjgyMl9kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHRpbWV6b25lKTsKK2ludCBwYXJzZV9kYXRlKGNvbnN0IGNoYXIgKmRhdGUsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpOwordm9pZCBkYXRlc3RhbXAoY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSk7Cit1bnNpZ25lZCBsb25nIGFwcHJveGlkYXRlKGNvbnN0IGNoYXIgKik7CisKK2V4dGVybiBpbnQgc2V0dXBfaWRlbnQodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqZ2l0X2F1dGhvcl9pbmZvKGludCk7CitleHRlcm4gY29uc3QgY2hhciAqZ2l0X2NvbW1pdHRlcl9pbmZvKGludCk7CisKK3N0cnVjdCBjaGVja291dCB7CisJY29uc3QgY2hhciAqYmFzZV9kaXI7CisJaW50IGJhc2VfZGlyX2xlbjsKKwl1bnNpZ25lZCBmb3JjZToxLAorCQkgcXVpZXQ6MSwKKwkJIG5vdF9uZXc6MSwKKwkJIHJlZnJlc2hfY2FjaGU6MTsKK307CisKK2V4dGVybiBpbnQgY2hlY2tvdXRfZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IGNoZWNrb3V0ICpzdGF0ZSwgY2hhciAqdG9wYXRoKTsKKworZXh0ZXJuIHN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlIHsKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqbmV4dDsKKwljaGFyICpuYW1lOworCWNoYXIgYmFzZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfSAqYWx0X29kYl9saXN0OworZXh0ZXJuIHZvaWQgcHJlcGFyZV9hbHRfb2RiKHZvaWQpOworCitleHRlcm4gc3RydWN0IHBhY2tlZF9naXQgeworCXN0cnVjdCBwYWNrZWRfZ2l0ICpuZXh0OworCXVuc2lnbmVkIGxvbmcgaW5kZXhfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHBhY2tfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgKmluZGV4X2Jhc2U7CisJdm9pZCAqcGFja19iYXNlOworCXVuc2lnbmVkIGludCBwYWNrX2xhc3RfdXNlZDsKKwl1bnNpZ25lZCBpbnQgcGFja191c2VfY250OworCWludCBwYWNrX2xvY2FsOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJLyogc29tZXRoaW5nIGxpa2UgIi5naXQvb2JqZWN0cy9wYWNrL3h4eHh4LnBhY2siICovCisJY2hhciBwYWNrX25hbWVbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK30gKnBhY2tlZF9naXQ7CisKK3N0cnVjdCBwYWNrX2VudHJ5IHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IHBhY2tlZF9naXQgKnA7Cit9OworCitzdHJ1Y3QgcmVmIHsKKwlzdHJ1Y3QgcmVmICpuZXh0OworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgbmV3X3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgZm9yY2U7CisJc3RydWN0IHJlZiAqcGVlcl9yZWY7IC8qIHdoZW4gcmVuYW1pbmcgKi8KKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKKyNkZWZpbmUgUkVGX05PUk1BTAkoMXUgPDwgMCkKKyNkZWZpbmUgUkVGX0hFQURTCSgxdSA8PCAxKQorI2RlZmluZSBSRUZfVEFHUwkoMXUgPDwgMikKKworZXh0ZXJuIGludCBnaXRfY29ubmVjdChpbnQgZmRbMl0sIGNoYXIgKnVybCwgY29uc3QgY2hhciAqcHJvZyk7CitleHRlcm4gaW50IGZpbmlzaF9jb25uZWN0KHBpZF90IHBpZCk7CitleHRlcm4gaW50IHBhdGhfbWF0Y2goY29uc3QgY2hhciAqcGF0aCwgaW50IG5yLCBjaGFyICoqbWF0Y2gpOworZXh0ZXJuIGludCBtYXRjaF9yZWZzKHN0cnVjdCByZWYgKnNyYywgc3RydWN0IHJlZiAqZHN0LCBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLAorCQkgICAgICBpbnQgbnJfcmVmc3BlYywgY2hhciAqKnJlZnNwZWMsIGludCBhbGwpOworZXh0ZXJuIGludCBnZXRfYWNrKGludCBmZCwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpOworZXh0ZXJuIHN0cnVjdCByZWYgKipnZXRfcmVtb3RlX2hlYWRzKGludCBpbiwgc3RydWN0IHJlZiAqKmxpc3QsIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBzZXJ2ZXJfc3VwcG9ydHMoY29uc3QgY2hhciAqZmVhdHVyZSk7CisKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleF9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCQljaGFyICppZHhfcGF0aCk7CisKK2V4dGVybiB2b2lkIHByZXBhcmVfcGFja2VkX2dpdCh2b2lkKTsKK2V4dGVybiB2b2lkIGluc3RhbGxfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjayk7CisKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqZmluZF9zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgCisJCQkJCSBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja3MpOworCitleHRlcm4gaW50IHVzZV9wYWNrZWRfZ2l0KHN0cnVjdCBwYWNrZWRfZ2l0ICopOworZXh0ZXJuIHZvaWQgdW51c2VfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqKTsKK2V4dGVybiBzdHJ1Y3QgcGFja2VkX2dpdCAqYWRkX3BhY2tlZF9naXQoY2hhciAqLCBpbnQsIGludCk7CitleHRlcm4gaW50IG51bV9wYWNrZWRfb2JqZWN0cyhjb25zdCBzdHJ1Y3QgcGFja2VkX2dpdCAqcCk7CitleHRlcm4gaW50IG50aF9wYWNrZWRfb2JqZWN0X3NoYTEoY29uc3Qgc3RydWN0IHBhY2tlZF9naXQgKiwgaW50LCB1bnNpZ25lZCBjaGFyKik7CitleHRlcm4gaW50IGZpbmRfcGFja19lbnRyeV9vbmUoY29uc3QgdW5zaWduZWQgY2hhciAqLCBzdHJ1Y3QgcGFja19lbnRyeSAqLCBzdHJ1Y3QgcGFja2VkX2dpdCAqKTsKK2V4dGVybiB2b2lkICp1bnBhY2tfZW50cnlfZ2VudGx5KHN0cnVjdCBwYWNrX2VudHJ5ICosIGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKK2V4dGVybiB2b2lkIHBhY2tlZF9vYmplY3RfaW5mb19kZXRhaWwoc3RydWN0IHBhY2tfZW50cnkgKiwgY2hhciAqLCB1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGNoYXIgKik7CisKKy8qIER1bWIgc2VydmVycyBzdXBwb3J0ICovCitleHRlcm4gaW50IHVwZGF0ZV9zZXJ2ZXJfaW5mbyhpbnQpOworCit0eXBlZGVmIGludCAoKmNvbmZpZ19mbl90KShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IGdpdF9kZWZhdWx0X2NvbmZpZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IGdpdF9jb25maWdfZnJvbV9maWxlKGNvbmZpZ19mbl90IGZuLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnKGNvbmZpZ19mbl90IGZuKTsKK2V4dGVybiBpbnQgZ2l0X2NvbmZpZ19pbnQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX2Jvb2woY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBnaXRfY29uZmlnX3NldChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IGdpdF9jb25maWdfc2V0X211bHRpdmFyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IGNoZWNrX3JlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24oY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKKyNkZWZpbmUgTUFYX0dJVE5BTUUgKDEwMDApCitleHRlcm4gY2hhciBnaXRfZGVmYXVsdF9lbWFpbFtNQVhfR0lUTkFNRV07CitleHRlcm4gY2hhciBnaXRfZGVmYXVsdF9uYW1lW01BWF9HSVROQU1FXTsKKworI2RlZmluZSBNQVhfRU5DT0RJTkdfTEVOR1RIIDY0CitleHRlcm4gY2hhciBnaXRfY29tbWl0X2VuY29kaW5nW01BWF9FTkNPRElOR19MRU5HVEhdOworCitleHRlcm4gaW50IGNvcHlfZmQoaW50IGlmZCwgaW50IG9mZCk7CisKKy8qIEZpbmlzaCBvZmYgcGFjayB0cmFuc2ZlciByZWNlaXZpbmcgZW5kICovCitleHRlcm4gaW50IHJlY2VpdmVfdW5wYWNrX3BhY2soaW50IGZkWzJdLCBjb25zdCBjaGFyICptZSwgaW50IHF1aWV0LCBpbnQpOworZXh0ZXJuIGludCByZWNlaXZlX2tlZXBfcGFjayhpbnQgZmRbMl0sIGNvbnN0IGNoYXIgKm1lLCBpbnQgcXVpZXQsIGludCk7CisKKy8qIHBhZ2VyLmMgKi8KK2V4dGVybiB2b2lkIHNldHVwX3BhZ2VyKHZvaWQpOworZXh0ZXJuIGludCBwYWdlcl9pbl91c2U7CitleHRlcm4gaW50IHBhZ2VyX3VzZV9jb2xvcjsKKworLyogYmFzZTg1ICovCitpbnQgZGVjb2RlXzg1KGNoYXIgKmRzdCwgY2hhciAqbGluZSwgaW50IGxpbmVsZW4pOwordm9pZCBlbmNvZGVfODUoY2hhciAqYnVmLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgYnl0ZXMpOworCisvKiBhbGxvYy5jICovCitzdHJ1Y3QgYmxvYjsKK3N0cnVjdCB0cmVlOworc3RydWN0IGNvbW1pdDsKK3N0cnVjdCB0YWc7CitleHRlcm4gc3RydWN0IGJsb2IgKmFsbG9jX2Jsb2Jfbm9kZSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgdHJlZSAqYWxsb2NfdHJlZV9ub2RlKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBjb21taXQgKmFsbG9jX2NvbW1pdF9ub2RlKHZvaWQpOworZXh0ZXJuIHN0cnVjdCB0YWcgKmFsbG9jX3RhZ19ub2RlKHZvaWQpOworZXh0ZXJuIHZvaWQgYWxsb2NfcmVwb3J0KHZvaWQpOworCisjZW5kaWYgLyogQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvY2hlY2tvdXQtaW5kZXguYyBiL2NoZWNrb3V0LWluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiMWM0NAotLS0gL2Rldi9udWxsCisrKyBiL2NoZWNrb3V0LWluZGV4LmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDaGVjay1vdXQgZmlsZXMgZnJvbSB0aGUgImN1cnJlbnQgY2FjaGUgZGlyZWN0b3J5IgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBMaW51cyBUb3J2YWxkcworICoKKyAqIENhcmVmdWw6IG9yZGVyIG9mIGFyZ3VtZW50IGZsYWdzIGRvZXMgbWF0dGVyLiBGb3IgZXhhbXBsZSwKKyAqCisgKglnaXQtY2hlY2tvdXQtaW5kZXggLWEgLWYgZmlsZS5jCisgKgorICogV2lsbCBmaXJzdCBjaGVjayBvdXQgYWxsIGZpbGVzIGxpc3RlZCBpbiB0aGUgY2FjaGUgKGJ1dCBub3QKKyAqIG92ZXJ3cml0ZSBhbnkgb2xkIG9uZXMpLCBhbmQgdGhlbiBmb3JjZS1jaGVja291dCAiZmlsZS5jIiBhCisgKiBzZWNvbmQgdGltZSAoaWUgdGhhdCBvbmUgX3dpbGxfIG92ZXJ3cml0ZSBhbnkgb2xkIGNvbnRlbnRzCisgKiB3aXRoIHRoZSBzYW1lIGZpbGVuYW1lKS4KKyAqCisgKiBBbHNvLCBqdXN0IGRvaW5nICJnaXQtY2hlY2tvdXQtaW5kZXgiIGRvZXMgbm90aGluZy4gWW91IHByb2JhYmx5CisgKiBtZWFudCAiZ2l0LWNoZWNrb3V0LWluZGV4IC1hIi4gQW5kIGlmIHlvdSB3YW50IHRvIGZvcmNlIGl0LCB5b3UKKyAqIHdhbnQgImdpdC1jaGVja291dC1pbmRleCAtZiAtYSIuCisgKgorICogSW50dWl0aXZlbmVzcyBpcyBub3QgdGhlIGdvYWwgaGVyZS4gUmVwZWF0YWJpbGl0eSBpcy4gVGhlCisgKiByZWFzb24gZm9yIHRoZSAibm8gYXJndW1lbnRzIG1lYW5zIG5vIHdvcmsiIHRoaW5nIGlzIHRoYXQKKyAqIGZyb20gc2NyaXB0cyB5b3UgYXJlIHN1cHBvc2VkIHRvIGJlIGFibGUgdG8gZG8gdGhpbmdzIGxpa2UKKyAqCisgKglmaW5kIC4gLW5hbWUgJyouaCcgLXByaW50MCB8IHhhcmdzIC0wIGdpdC1jaGVja291dC1pbmRleCAtZiAtLQorICoKKyAqIG9yOgorICoKKyAqCWZpbmQgLiAtbmFtZSAnKi5oJyAtcHJpbnQwIHwgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC16IC0tc3RkaW4KKyAqCisgKiB3aGljaCB3aWxsIGZvcmNlIGFsbCBleGlzdGluZyAqLmggZmlsZXMgdG8gYmUgcmVwbGFjZWQgd2l0aAorICogdGhlaXIgY2FjaGVkIGNvcGllcy4gSWYgYW4gZW1wdHkgY29tbWFuZCBsaW5lIGltcGxpZWQgImFsbCIsCisgKiB0aGVuIHRoaXMgd291bGQgZm9yY2UtcmVmcmVzaCBldmVyeXRoaW5nIGluIHRoZSBjYWNoZSwgd2hpY2gKKyAqIHdhcyBub3QgdGhlIHBvaW50LgorICoKKyAqIE9oLCBhbmQgdGhlICItLSIgaXMganVzdCBhIGdvb2QgaWRlYSB3aGVuIHlvdSBrbm93IHRoZSByZXN0CisgKiB3aWxsIGJlIGZpbGVuYW1lcy4gSnVzdCBzbyB0aGF0IHlvdSB3b3VsZG4ndCBoYXZlIGEgZmlsZW5hbWUKKyAqIG9mICItYSIgY2F1c2luZyBwcm9ibGVtcyAobm90IHBvc3NpYmxlIGluIHRoZSBhYm92ZSBleGFtcGxlLAorICogYnV0IGdldCB1c2VkIHRvIGl0IGluIHNjcmlwdGluZyEpLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworI2RlZmluZSBDSEVDS09VVF9BTEwgNAorc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeDsKK3N0YXRpYyBpbnQgcHJlZml4X2xlbmd0aDsKK3N0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CitzdGF0aWMgaW50IGNoZWNrb3V0X3N0YWdlOyAvKiBkZWZhdWx0IHRvIGNoZWNrb3V0IHN0YWdlMCAqLworc3RhdGljIGludCB0b190ZW1wZmlsZTsKK3N0YXRpYyBjaGFyIHRvcGF0aFs0XVtNQVhQQVRITEVOKzFdOworCitzdGF0aWMgc3RydWN0IGNoZWNrb3V0IHN0YXRlOworCitzdGF0aWMgdm9pZCB3cml0ZV90ZW1wZmlsZV9yZWNvcmQgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlpZiAoQ0hFQ0tPVVRfQUxMID09IGNoZWNrb3V0X3N0YWdlKSB7CisJCWZvciAoaSA9IDE7IGkgPCA0OyBpKyspIHsKKwkJCWlmIChpID4gMSkKKwkJCQlwdXRjaGFyKCcgJyk7CisJCQlpZiAodG9wYXRoW2ldWzBdKQorCQkJCWZwdXRzKHRvcGF0aFtpXSwgc3Rkb3V0KTsKKwkJCWVsc2UKKwkJCQlwdXRjaGFyKCcuJyk7CisJCX0KKwl9IGVsc2UKKwkJZnB1dHModG9wYXRoW2NoZWNrb3V0X3N0YWdlXSwgc3Rkb3V0KTsKKworCXB1dGNoYXIoJ1x0Jyk7CisJd3JpdGVfbmFtZV9xdW90ZWQoIiIsIDAsIG5hbWUgKyBwcmVmaXhfbGVuZ3RoLAorCQlsaW5lX3Rlcm1pbmF0aW9uLCBzdGRvdXQpOworCXB1dGNoYXIobGluZV90ZXJtaW5hdGlvbik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXRvcGF0aFtpXVswXSA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGNoZWNrb3V0X2ZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MobmFtZSwgbmFtZWxlbik7CisJaW50IGhhc19zYW1lX25hbWUgPSAwOworCWludCBkaWRfY2hlY2tvdXQgPSAwOworCWludCBlcnJzID0gMDsKKworCWlmIChwb3MgPCAwKQorCQlwb3MgPSAtcG9zIC0gMTsKKworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlpZiAoY2VfbmFtZWxlbihjZSkgIT0gbmFtZWxlbiB8fAorCQkgICAgbWVtY21wKGNlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSkKKwkJCWJyZWFrOworCQloYXNfc2FtZV9uYW1lID0gMTsKKwkJcG9zKys7CisJCWlmIChjZV9zdGFnZShjZSkgIT0gY2hlY2tvdXRfc3RhZ2UKKwkJICAgICYmIChDSEVDS09VVF9BTEwgIT0gY2hlY2tvdXRfc3RhZ2UgfHwgIWNlX3N0YWdlKGNlKSkpCisJCQljb250aW51ZTsKKwkJZGlkX2NoZWNrb3V0ID0gMTsKKwkJaWYgKGNoZWNrb3V0X2VudHJ5KGNlLCAmc3RhdGUsCisJCSAgICB0b190ZW1wZmlsZSA/IHRvcGF0aFtjZV9zdGFnZShjZSldIDogTlVMTCkgPCAwKQorCQkJZXJycysrOworCX0KKworCWlmIChkaWRfY2hlY2tvdXQpIHsKKwkJaWYgKHRvX3RlbXBmaWxlKQorCQkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKG5hbWUpOworCQlyZXR1cm4gZXJycyA+IDAgPyAtMSA6IDA7CisJfQorCisJaWYgKCFzdGF0ZS5xdWlldCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1jaGVja291dC1pbmRleDogJXMgIiwgbmFtZSk7CisJCWlmICghaGFzX3NhbWVfbmFtZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiaXMgbm90IGluIHRoZSBjYWNoZSIpOworCQllbHNlIGlmIChjaGVja291dF9zdGFnZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9lcyBub3QgZXhpc3QgYXQgc3RhZ2UgJWQiLAorCQkJCWNoZWNrb3V0X3N0YWdlKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJpcyB1bm1lcmdlZCIpOworCQlmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tvdXRfYWxsKHZvaWQpCit7CisJaW50IGksIGVycnMgPSAwOworCXN0cnVjdCBjYWNoZV9lbnRyeSogbGFzdF9jZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yIDsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkgIT0gY2hlY2tvdXRfc3RhZ2UKKwkJICAgICYmIChDSEVDS09VVF9BTEwgIT0gY2hlY2tvdXRfc3RhZ2UgfHwgIWNlX3N0YWdlKGNlKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHByZWZpeCAmJiAqcHJlZml4ICYmCisJCSAgICAoY2VfbmFtZWxlbihjZSkgPD0gcHJlZml4X2xlbmd0aCB8fAorCQkgICAgIG1lbWNtcChwcmVmaXgsIGNlLT5uYW1lLCBwcmVmaXhfbGVuZ3RoKSkpCisJCQljb250aW51ZTsKKwkJaWYgKGxhc3RfY2UgJiYgdG9fdGVtcGZpbGUpIHsKKwkJCWlmIChjZV9uYW1lbGVuKGxhc3RfY2UpICE9IGNlX25hbWVsZW4oY2UpCisJCQkgICAgfHwgbWVtY21wKGxhc3RfY2UtPm5hbWUsIGNlLT5uYW1lLCBjZV9uYW1lbGVuKGNlKSkpCisJCQkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGxhc3RfY2UtPm5hbWUpOworCQl9CisJCWlmIChjaGVja291dF9lbnRyeShjZSwgJnN0YXRlLAorCQkgICAgdG9fdGVtcGZpbGUgPyB0b3BhdGhbY2Vfc3RhZ2UoY2UpXSA6IE5VTEwpIDwgMCkKKwkJCWVycnMrKzsKKwkJbGFzdF9jZSA9IGNlOworCX0KKwlpZiAobGFzdF9jZSAmJiB0b190ZW1wZmlsZSkKKwkJd3JpdGVfdGVtcGZpbGVfcmVjb3JkKGxhc3RfY2UtPm5hbWUpOworCWlmIChlcnJzKQorCQkvKiB3ZSBoYXZlIGFscmVhZHkgZG9uZSBvdXIgZXJyb3IgcmVwb3J0aW5nLgorCQkgKiBleGl0IHdpdGggdGhlIHNhbWUgY29kZSBhcyBkaWUoKS4KKwkJICovCisJCWV4aXQoMTI4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgY2hlY2tvdXRfY2FjaGVfdXNhZ2VbXSA9CisiZ2l0LWNoZWNrb3V0LWluZGV4IFstdV0gWy1xXSBbLWFdIFstZl0gWy1uXSBbLS1zdGFnZT1bMTIzXXxhbGxdIFstLXByZWZpeD08c3RyaW5nPl0gWy0tdGVtcF0gWy0tXSA8ZmlsZT4uLi4iOworCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSBsb2NrX2ZpbGU7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwlpbnQgbmV3ZmQgPSAtMTsKKwlpbnQgYWxsID0gMDsKKwlpbnQgcmVhZF9mcm9tX3N0ZGluID0gMDsKKworCXN0YXRlLmJhc2VfZGlyID0gIiI7CisJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlwcmVmaXhfbGVuZ3RoID0gcHJlZml4ID8gc3RybGVuKHByZWZpeCkgOiAwOworCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApIHsKKwkJZGllKCJpbnZhbGlkIGNhY2hlIik7CisJfQorCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi1hIikgfHwgIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQlhbGwgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWYiKSB8fCAhc3RyY21wKGFyZywgIi0tZm9yY2UiKSkgeworCQkJc3RhdGUuZm9yY2UgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXEiKSB8fCAhc3RyY21wKGFyZywgIi0tcXVpZXQiKSkgeworCQkJc3RhdGUucXVpZXQgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSB8fCAhc3RyY21wKGFyZywgIi0tbm8tY3JlYXRlIikpIHsKKwkJCXN0YXRlLm5vdF9uZXcgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXUiKSB8fCAhc3RyY21wKGFyZywgIi0taW5kZXgiKSkgeworCQkJc3RhdGUucmVmcmVzaF9jYWNoZSA9IDE7CisJCQlpZiAobmV3ZmQgPCAwKQorCQkJCW5ld2ZkID0gaG9sZF9sb2NrX2ZpbGVfZm9yX3VwZGF0ZQorCQkJCQkoJmxvY2tfZmlsZSwgZ2V0X2luZGV4X2ZpbGUoKSwgMSk7CisJCQlpZiAobmV3ZmQgPCAwKQorCQkJCWRpZSgiY2Fubm90IG9wZW4gaW5kZXgubG9jayBmaWxlLiIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLXoiKSkgeworCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0ZGluIikpIHsKKwkJCWlmIChpICE9IGFyZ2MgLSAxKQorCQkJCWRpZSgiLS1zdGRpbiBtdXN0IGJlIGF0IHRoZSBlbmQiKTsKKwkJCXJlYWRfZnJvbV9zdGRpbiA9IDE7CisJCQlpKys7IC8qIGRvIG5vdCBjb25zaWRlciBhcmcgYXMgYSBmaWxlIG5hbWUgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGVtcCIpKSB7CisJCQl0b190ZW1wZmlsZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1wcmVmaXg9IiwgOSkpIHsKKwkJCXN0YXRlLmJhc2VfZGlyID0gYXJnKzk7CisJCQlzdGF0ZS5iYXNlX2Rpcl9sZW4gPSBzdHJsZW4oc3RhdGUuYmFzZV9kaXIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tc3RhZ2U9IiwgOCkpIHsKKwkJCWlmICghc3RyY21wKGFyZyArIDgsICJhbGwiKSkgeworCQkJCXRvX3RlbXBmaWxlID0gMTsKKwkJCQljaGVja291dF9zdGFnZSA9IENIRUNLT1VUX0FMTDsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGNoID0gYXJnWzhdOworCQkJCWlmICgnMScgPD0gY2ggJiYgY2ggPD0gJzMnKQorCQkJCQljaGVja291dF9zdGFnZSA9IGFyZ1s4XSAtICcwJzsKKwkJCQllbHNlCisJCQkJCWRpZSgic3RhZ2Ugc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMyBvciBhbGwiKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChhcmdbMF0gPT0gJy0nKQorCQkJdXNhZ2UoY2hlY2tvdXRfY2FjaGVfdXNhZ2UpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdGUuYmFzZV9kaXJfbGVuIHx8IHRvX3RlbXBmaWxlKSB7CisJCS8qIHdoZW4gLS1wcmVmaXggaXMgc3BlY2lmaWVkIHdlIGRvIG5vdAorCQkgKiB3YW50IHRvIHVwZGF0ZSBjYWNoZS4KKwkJICovCisJCWlmIChzdGF0ZS5yZWZyZXNoX2NhY2hlKSB7CisJCQljbG9zZShuZXdmZCk7IG5ld2ZkID0gLTE7CisJCQlyb2xsYmFja19sb2NrX2ZpbGUoJmxvY2tfZmlsZSk7CisJCX0KKwkJc3RhdGUucmVmcmVzaF9jYWNoZSA9IDA7CisJfQorCisJLyogQ2hlY2sgb3V0IG5hbWVkIGZpbGVzIGZpcnN0ICovCisJZm9yICggOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWNvbnN0IGNoYXIgKnA7CisKKwkJaWYgKGFsbCkKKwkJCWRpZSgiZ2l0LWNoZWNrb3V0LWluZGV4OiBkb24ndCBtaXggJy0tYWxsJyBhbmQgZXhwbGljaXQgZmlsZW5hbWVzIik7CisJCWlmIChyZWFkX2Zyb21fc3RkaW4pCisJCQlkaWUoImdpdC1jaGVja291dC1pbmRleDogZG9uJ3QgbWl4ICctLXN0ZGluJyBhbmQgZXhwbGljaXQgZmlsZW5hbWVzIik7CisJCXAgPSBwcmVmaXhfcGF0aChwcmVmaXgsIHByZWZpeF9sZW5ndGgsIGFyZyk7CisJCWNoZWNrb3V0X2ZpbGUocCk7CisJCWlmIChwIDwgYXJnIHx8IHAgPiBhcmcgKyBzdHJsZW4oYXJnKSkKKwkJCWZyZWUoKGNoYXIqKXApOworCX0KKworCWlmIChyZWFkX2Zyb21fc3RkaW4pIHsKKwkJc3RydWN0IHN0cmJ1ZiBidWY7CisJCWlmIChhbGwpCisJCQlkaWUoImdpdC1jaGVja291dC1pbmRleDogZG9uJ3QgbWl4ICctLWFsbCcgYW5kICctLXN0ZGluJyIpOworCQlzdHJidWZfaW5pdCgmYnVmKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWNoYXIgKnBhdGhfbmFtZTsKKwkJCWNvbnN0IGNoYXIgKnA7CisKKwkJCXJlYWRfbGluZSgmYnVmLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbik7CisJCQlpZiAoYnVmLmVvZikKKwkJCQlicmVhazsKKwkJCWlmIChsaW5lX3Rlcm1pbmF0aW9uICYmIGJ1Zi5idWZbMF0gPT0gJyInKQorCQkJCXBhdGhfbmFtZSA9IHVucXVvdGVfY19zdHlsZShidWYuYnVmLCBOVUxMKTsKKwkJCWVsc2UKKwkJCQlwYXRoX25hbWUgPSBidWYuYnVmOworCQkJcCA9IHByZWZpeF9wYXRoKHByZWZpeCwgcHJlZml4X2xlbmd0aCwgcGF0aF9uYW1lKTsKKwkJCWNoZWNrb3V0X2ZpbGUocCk7CisJCQlpZiAocCA8IHBhdGhfbmFtZSB8fCBwID4gcGF0aF9uYW1lICsgc3RybGVuKHBhdGhfbmFtZSkpCisJCQkJZnJlZSgoY2hhciAqKXApOworCQkJaWYgKHBhdGhfbmFtZSAhPSBidWYuYnVmKQorCQkJCWZyZWUocGF0aF9uYW1lKTsKKwkJfQorCX0KKworCWlmIChhbGwpCisJCWNoZWNrb3V0X2FsbCgpOworCisJaWYgKDAgPD0gbmV3ZmQgJiYKKwkgICAgKHdyaXRlX2NhY2hlKG5ld2ZkLCBhY3RpdmVfY2FjaGUsIGFjdGl2ZV9ucikgfHwKKwkgICAgIGNsb3NlKG5ld2ZkKSB8fCBjb21taXRfbG9ja19maWxlKCZsb2NrX2ZpbGUpKSkKKwkJZGllKCJVbmFibGUgdG8gd3JpdGUgbmV3IGluZGV4IGZpbGUiKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbWJpbmUtZGlmZi5jIGIvY29tYmluZS1kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4YmFjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbWJpbmUtZGlmZi5jCkBAIC0wLDAgKzEsOTQxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorCitzdGF0aWMgaW50IHVuaW50ZXJlc3Rpbmcoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqaW50ZXJzZWN0X3BhdGhzKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqY3VyciwgaW50IG4sIGludCBudW1fcGFyZW50KQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcDsKKwlpbnQgaTsKKworCWlmICghbikgeworCQlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKmxpc3QgPSBOVUxMLCAqKnRhaWwgPSAmbGlzdDsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCWludCBsZW47CisJCQljb25zdCBjaGFyICpwYXRoOworCQkJaWYgKHVuaW50ZXJlc3RpbmcocS0+cXVldWVbaV0pKQorCQkJCWNvbnRpbnVlOworCQkJcGF0aCA9IHEtPnF1ZXVlW2ldLT50d28tPnBhdGg7CisJCQlsZW4gPSBzdHJsZW4ocGF0aCk7CisJCQlwID0geG1hbGxvYyhjb21iaW5lX2RpZmZfcGF0aF9zaXplKG51bV9wYXJlbnQsIGxlbikpOworCQkJcC0+cGF0aCA9IChjaGFyKikgJihwLT5wYXJlbnRbbnVtX3BhcmVudF0pOworCQkJbWVtY3B5KHAtPnBhdGgsIHBhdGgsIGxlbik7CisJCQlwLT5wYXRoW2xlbl0gPSAwOworCQkJcC0+bGVuID0gbGVuOworCQkJcC0+bmV4dCA9IE5VTEw7CisJCQltZW1zZXQocC0+cGFyZW50LCAwLAorCQkJICAgICAgIHNpemVvZihwLT5wYXJlbnRbMF0pICogbnVtX3BhcmVudCk7CisKKwkJCW1lbWNweShwLT5zaGExLCBxLT5xdWV1ZVtpXS0+dHdvLT5zaGExLCAyMCk7CisJCQlwLT5tb2RlID0gcS0+cXVldWVbaV0tPnR3by0+bW9kZTsKKwkJCW1lbWNweShwLT5wYXJlbnRbbl0uc2hhMSwgcS0+cXVldWVbaV0tPm9uZS0+c2hhMSwgMjApOworCQkJcC0+cGFyZW50W25dLm1vZGUgPSBxLT5xdWV1ZVtpXS0+b25lLT5tb2RlOworCQkJcC0+cGFyZW50W25dLnN0YXR1cyA9IHEtPnF1ZXVlW2ldLT5zdGF0dXM7CisJCQkqdGFpbCA9IHA7CisJCQl0YWlsID0gJnAtPm5leHQ7CisJCX0KKwkJcmV0dXJuIGxpc3Q7CisJfQorCisJZm9yIChwID0gY3VycjsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaW50IGZvdW5kID0gMDsKKwkJaWYgKCFwLT5sZW4pCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGg7CisJCQlpbnQgbGVuOworCisJCQlpZiAodW5pbnRlcmVzdGluZyhxLT5xdWV1ZVtpXSkpCisJCQkJY29udGludWU7CisJCQlwYXRoID0gcS0+cXVldWVbaV0tPnR3by0+cGF0aDsKKwkJCWxlbiA9IHN0cmxlbihwYXRoKTsKKwkJCWlmIChsZW4gPT0gcC0+bGVuICYmICFtZW1jbXAocGF0aCwgcC0+cGF0aCwgbGVuKSkgeworCQkJCWZvdW5kID0gMTsKKwkJCQltZW1jcHkocC0+cGFyZW50W25dLnNoYTEsCisJCQkJICAgICAgIHEtPnF1ZXVlW2ldLT5vbmUtPnNoYTEsIDIwKTsKKwkJCQlwLT5wYXJlbnRbbl0ubW9kZSA9IHEtPnF1ZXVlW2ldLT5vbmUtPm1vZGU7CisJCQkJcC0+cGFyZW50W25dLnN0YXR1cyA9IHEtPnF1ZXVlW2ldLT5zdGF0dXM7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFmb3VuZCkKKwkJCXAtPmxlbiA9IDA7CisJfQorCXJldHVybiBjdXJyOworfQorCisvKiBMaW5lcyBsb3N0IGZyb20gcGFyZW50ICovCitzdHJ1Y3QgbGxpbmUgeworCXN0cnVjdCBsbGluZSAqbmV4dDsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgcGFyZW50X21hcDsKKwljaGFyIGxpbmVbRkxFWF9BUlJBWV07Cit9OworCisvKiBMaW5lcyBzdXJ2aXZpbmcgaW4gdGhlIG1lcmdlIHJlc3VsdCAqLworc3RydWN0IHNsaW5lIHsKKwlzdHJ1Y3QgbGxpbmUgKmxvc3RfaGVhZCwgKipsb3N0X3RhaWw7CisJY2hhciAqYm9sOworCWludCBsZW47CisJLyogYml0IDAgdXAgdG8gKE4tMSkgYXJlIG9uIGlmIHRoZSBwYXJlbnQgaGFzIHRoaXMgbGluZSAoaS5lLgorCSAqIHdlIGRpZCBub3QgY2hhbmdlIGl0KS4KKwkgKiBiaXQgTiBpcyB1c2VkIGZvciAiaW50ZXJlc3RpbmciIGxpbmVzLCBpbmNsdWRpbmcgY29udGV4dC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJdW5zaWduZWQgbG9uZyAqcF9sbm87Cit9OworCitzdGF0aWMgY2hhciAqZ3JhYl9ibG9iKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJY2hhciAqYmxvYjsKKwljaGFyIHR5cGVbMjBdOworCWlmICghbWVtY21wKHNoYTEsIG51bGxfc2hhMSwgMjApKSB7CisJCS8qIGRlbGV0ZWQgYmxvYiAqLworCQkqc2l6ZSA9IDA7CisJCXJldHVybiB4Y2FsbG9jKDEsIDEpOworCX0KKwlibG9iID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgc2l6ZSk7CisJaWYgKHN0cmNtcCh0eXBlLCBibG9iX3R5cGUpKQorCQlkaWUoIm9iamVjdCAnJXMnIGlzIG5vdCBhIGJsb2IhIiwgc2hhMV90b19oZXgoc2hhMSkpOworCXJldHVybiBibG9iOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfbG9zdChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCBpbnQgbiwgY29uc3QgY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbGxpbmUgKmxsaW5lOworCXVuc2lnbmVkIGxvbmcgdGhpc19tYXNrID0gKDFVTDw8bik7CisJaWYgKGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxlbi0tOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiBzcXVhc2ggdGhpbmdzICovCisJaWYgKHNsaW5lLT5sb3N0X2hlYWQpIHsKKwkJc3RydWN0IGxsaW5lICpsYXN0X29uZSA9IE5VTEw7CisJCS8qIFdlIGNhbm5vdCBzcXVhc2ggaXQgd2l0aCBlYXJsaWVyIG9uZSAqLworCQlmb3IgKGxsaW5lID0gc2xpbmUtPmxvc3RfaGVhZDsKKwkJICAgICBsbGluZTsKKwkJICAgICBsbGluZSA9IGxsaW5lLT5uZXh0KQorCQkJaWYgKGxsaW5lLT5wYXJlbnRfbWFwICYgdGhpc19tYXNrKQorCQkJCWxhc3Rfb25lID0gbGxpbmU7CisJCWxsaW5lID0gbGFzdF9vbmUgPyBsYXN0X29uZS0+bmV4dCA6IHNsaW5lLT5sb3N0X2hlYWQ7CisJCXdoaWxlIChsbGluZSkgeworCQkJaWYgKGxsaW5lLT5sZW4gPT0gbGVuICYmCisJCQkgICAgIW1lbWNtcChsbGluZS0+bGluZSwgbGluZSwgbGVuKSkgeworCQkJCWxsaW5lLT5wYXJlbnRfbWFwIHw9IHRoaXNfbWFzazsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlsbGluZSA9IGxsaW5lLT5uZXh0OworCQl9CisJfQorCisJbGxpbmUgPSB4bWFsbG9jKHNpemVvZigqbGxpbmUpICsgbGVuICsgMSk7CisJbGxpbmUtPmxlbiA9IGxlbjsKKwlsbGluZS0+bmV4dCA9IE5VTEw7CisJbGxpbmUtPnBhcmVudF9tYXAgPSB0aGlzX21hc2s7CisJbWVtY3B5KGxsaW5lLT5saW5lLCBsaW5lLCBsZW4pOworCWxsaW5lLT5saW5lW2xlbl0gPSAwOworCSpzbGluZS0+bG9zdF90YWlsID0gbGxpbmU7CisJc2xpbmUtPmxvc3RfdGFpbCA9ICZsbGluZS0+bmV4dDsKK30KKworc3RydWN0IGNvbWJpbmVfZGlmZl9zdGF0ZSB7CisJc3RydWN0IHhkaWZmX2VtaXRfc3RhdGUgeG07CisKKwl1bnNpZ25lZCBpbnQgbG5vOworCWludCBvYiwgb24sIG5iLCBubjsKKwl1bnNpZ25lZCBsb25nIG5tYXNrOworCWludCBudW1fcGFyZW50OworCWludCBuOworCXN0cnVjdCBzbGluZSAqc2xpbmU7CisJc3RydWN0IHNsaW5lICpsb3N0X2J1Y2tldDsKK307CisKK3N0YXRpYyB2b2lkIGNvbnN1bWVfbGluZSh2b2lkICpzdGF0ZV8sIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBjb21iaW5lX2RpZmZfc3RhdGUgKnN0YXRlID0gc3RhdGVfOworCWlmICg1IDwgbGVuICYmICFtZW1jbXAoIkBAIC0iLCBsaW5lLCA0KSkgeworCQlpZiAocGFyc2VfaHVua19oZWFkZXIobGluZSwgbGVuLAorCQkJCSAgICAgICZzdGF0ZS0+b2IsICZzdGF0ZS0+b24sCisJCQkJICAgICAgJnN0YXRlLT5uYiwgJnN0YXRlLT5ubikpCisJCQlyZXR1cm47CisJCXN0YXRlLT5sbm8gPSBzdGF0ZS0+bmI7CisJCWlmICghc3RhdGUtPm5iKQorCQkJLyogQEAgLTEsMiArMCwwIEBAIHRvIHJlbW92ZSB0aGUKKwkJCSAqIGZpcnN0IHR3byBsaW5lcy4uLgorCQkJICovCisJCQlzdGF0ZS0+bmIgPSAxOworCQlpZiAoc3RhdGUtPm5uID09IDApCisJCQkvKiBAQCAtWCxZICtOLDAgQEAgcmVtb3ZlZCBZIGxpbmVzCisJCQkgKiB0aGF0IHdvdWxkIGhhdmUgY29tZSAqYWZ0ZXIqIGxpbmUgTgorCQkJICogaW4gdGhlIHJlc3VsdC4gIE91ciBsb3N0IGJ1Y2tldHMgaGFuZworCQkJICogdG8gdGhlIGxpbmUgYWZ0ZXIgdGhlIHJlbW92ZWQgbGluZXMsCisJCQkgKi8KKwkJCXN0YXRlLT5sb3N0X2J1Y2tldCA9ICZzdGF0ZS0+c2xpbmVbc3RhdGUtPm5iXTsKKwkJZWxzZQorCQkJc3RhdGUtPmxvc3RfYnVja2V0ID0gJnN0YXRlLT5zbGluZVtzdGF0ZS0+bmItMV07CisJCWlmICghc3RhdGUtPnNsaW5lW3N0YXRlLT5uYi0xXS5wX2xubykKKwkJCXN0YXRlLT5zbGluZVtzdGF0ZS0+bmItMV0ucF9sbm8gPQorCQkJCXhjYWxsb2Moc3RhdGUtPm51bV9wYXJlbnQsCisJCQkJCXNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCXN0YXRlLT5zbGluZVtzdGF0ZS0+bmItMV0ucF9sbm9bc3RhdGUtPm5dID0gc3RhdGUtPm9iOworCQlyZXR1cm47CisJfQorCWlmICghc3RhdGUtPmxvc3RfYnVja2V0KQorCQlyZXR1cm47IC8qIG5vdCBpbiBhbnkgaHVuayB5ZXQgKi8KKwlzd2l0Y2ggKGxpbmVbMF0pIHsKKwljYXNlICctJzoKKwkJYXBwZW5kX2xvc3Qoc3RhdGUtPmxvc3RfYnVja2V0LCBzdGF0ZS0+biwgbGluZSsxLCBsZW4tMSk7CisJCWJyZWFrOworCWNhc2UgJysnOgorCQlzdGF0ZS0+c2xpbmVbc3RhdGUtPmxuby0xXS5mbGFnIHw9IHN0YXRlLT5ubWFzazsKKwkJc3RhdGUtPmxubysrOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbWJpbmVfZGlmZihjb25zdCB1bnNpZ25lZCBjaGFyICpwYXJlbnQsIG1tZmlsZV90ICpyZXN1bHRfZmlsZSwKKwkJCSBzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBpbnQgY250LCBpbnQgbiwKKwkJCSBpbnQgbnVtX3BhcmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgcF9sbm8sIGxubzsKKwl1bnNpZ25lZCBsb25nIG5tYXNrID0gKDFVTCA8PCBuKTsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwltbWZpbGVfdCBwYXJlbnRfZmlsZTsKKwl4ZGVtaXRjYl90IGVjYjsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgc3o7CisKKwlpZiAoIWNudCkKKwkJcmV0dXJuOyAvKiByZXN1bHQgZGVsZXRlZCAqLworCisJcGFyZW50X2ZpbGUucHRyID0gZ3JhYl9ibG9iKHBhcmVudCwgJnN6KTsKKwlwYXJlbnRfZmlsZS5zaXplID0gc3o7CisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAwOworCXhlY2ZnLmZsYWdzID0gMDsKKwllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJZWNiLnByaXYgPSAmc3RhdGU7CisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mKHN0YXRlKSk7CisJc3RhdGUueG0uY29uc3VtZSA9IGNvbnN1bWVfbGluZTsKKwlzdGF0ZS5ubWFzayA9IG5tYXNrOworCXN0YXRlLnNsaW5lID0gc2xpbmU7CisJc3RhdGUubG5vID0gMTsKKwlzdGF0ZS5udW1fcGFyZW50ID0gbnVtX3BhcmVudDsKKwlzdGF0ZS5uID0gbjsKKworCXhkbF9kaWZmKCZwYXJlbnRfZmlsZSwgcmVzdWx0X2ZpbGUsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJZnJlZShwYXJlbnRfZmlsZS5wdHIpOworCisJLyogQXNzaWduIGxpbmUgbnVtYmVycyBmb3IgdGhpcyBwYXJlbnQuCisJICoKKwkgKiBzbGluZVtsbm9dLnBfbG5vW25dIHJlY29yZHMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyCisJICogKGNvdW50aW5nIGZyb20gMSkgZm9yIHBhcmVudCBOIGlmIHRoZSBmaW5hbCBodW5rIGRpc3BsYXkKKwkgKiBzdGFydGVkIGJ5IHNob3dpbmcgc2xpbmVbbG5vXSAocG9zc2libHkgc2hvd2luZyB0aGUgbG9zdAorCSAqIGxpbmVzIGF0dGFjaGVkIHRvIGl0IGZpcnN0KS4KKwkgKi8KKwlmb3IgKGxubyA9IDAsICBwX2xubyA9IDE7IGxubyA8PSBjbnQ7IGxubysrKSB7CisJCXN0cnVjdCBsbGluZSAqbGw7CisJCXNsaW5lW2xub10ucF9sbm9bbl0gPSBwX2xubzsKKworCQkvKiBIb3cgbWFueSBsaW5lcyB3b3VsZCB0aGlzIHNsaW5lIGFkdmFuY2UgdGhlIHBfbG5vPyAqLworCQlsbCA9IHNsaW5lW2xub10ubG9zdF9oZWFkOworCQl3aGlsZSAobGwpIHsKKwkJCWlmIChsbC0+cGFyZW50X21hcCAmIG5tYXNrKQorCQkJCXBfbG5vKys7IC8qICctJyBtZWFucyBwYXJlbnQgaGFkIGl0ICovCisJCQlsbCA9IGxsLT5uZXh0OworCQl9CisJCWlmIChsbm8gPCBjbnQgJiYgIShzbGluZVtsbm9dLmZsYWcgJiBubWFzaykpCisJCQlwX2xubysrOyAvKiBubyAnKycgbWVhbnMgcGFyZW50IGhhZCBpdCAqLworCX0KKwlzbGluZVtsbm9dLnBfbG5vW25dID0gcF9sbm87IC8qIHRyYWlsZXIgKi8KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udGV4dCA9IDM7CitzdGF0aWMgY2hhciBjb21iaW5lX21hcmtlciA9ICdAJzsKKworc3RhdGljIGludCBpbnRlcmVzdGluZyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGFsbF9tYXNrKQoreworCS8qIElmIHNvbWUgcGFyZW50cyBsb3N0IGxpbmVzIGhlcmUsIG9yIGlmIHdlIGhhdmUgYWRkZWQgdG8KKwkgKiBzb21lIHBhcmVudCwgaXQgaXMgaW50ZXJlc3RpbmcuCisJICovCisJcmV0dXJuICgoc2xpbmUtPmZsYWcgJiBhbGxfbWFzaykgfHwgc2xpbmUtPmxvc3RfaGVhZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFkanVzdF9odW5rX3RhaWwoc3RydWN0IHNsaW5lICpzbGluZSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFsbF9tYXNrLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgaHVua19iZWdpbiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGkpCit7CisJLyogaSBwb2ludHMgYXQgdGhlIGZpcnN0IHVuaW50ZXJlc3RpbmcgbGluZS4gIElmIHRoZSBsYXN0IGxpbmUKKwkgKiBvZiB0aGUgaHVuayB3YXMgaW50ZXJlc3Rpbmcgb25seSBiZWNhdXNlIGl0IGhhcyBzb21lCisJICogZGVsZXRpb24sIHRoZW4gaXQgaXMgbm90IGFsbCB0aGF0IGludGVyZXN0aW5nIGZvciB0aGUKKwkgKiBwdXJwb3NlIG9mIGdpdmluZyB0cmFpbGluZyBjb250ZXh0IGxpbmVzLiAgVGhpcyBpcyBiZWNhdXNlCisJICogd2Ugb3V0cHV0ICctJyBsaW5lIGFuZCB0aGVuIHVubW9kaWZpZWQgc2xpbmVbaS0xXSBpdHNlbGYgaW4KKwkgKiB0aGF0IGNhc2Ugd2hpY2ggZ2l2ZXMgdXMgb25lIGV4dHJhIGNvbnRleHQgbGluZS4KKwkgKi8KKwlpZiAoKGh1bmtfYmVnaW4gKyAxIDw9IGkpICYmICEoc2xpbmVbaS0xXS5mbGFnICYgYWxsX21hc2spKQorCQlpLS07CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZpbmRfbmV4dChzdHJ1Y3Qgc2xpbmUgKnNsaW5lLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWFyaywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGksCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjbnQsCisJCQkgICAgICAgaW50IGxvb2tfZm9yX3VuaW50ZXJlc3RpbmcpCit7CisJLyogV2UgaGF2ZSBleGFtaW5lZCB1cCB0byBpLTEgYW5kIGFyZSBhYm91dCB0byBsb29rIGF0IGkuCisJICogRmluZCBuZXh0IGludGVyZXN0aW5nIG9yIHVuaW50ZXJlc3RpbmcgbGluZS4gIEhlcmUsCisJICogImludGVyZXN0aW5nIiBkb2VzIG5vdCBtZWFuIGludGVyZXN0aW5nKCksIGJ1dCBtYXJrZWQgYnkKKwkgKiB0aGUgZ2l2ZV9jb250ZXh0KCkgZnVuY3Rpb24gYmVsb3cgKGkuZS4gaXQgaW5jbHVkZXMgY29udGV4dAorCSAqIGxpbmVzIHRoYXQgYXJlIG5vdCBpbnRlcmVzdGluZyB0byBpbnRlcmVzdGluZygpIGZ1bmN0aW9uCisJICogdGhhdCBhcmUgc3Vycm91bmRlZCBieSBpbnRlcmVzdGluZygpIG9uZXMuCisJICovCisJd2hpbGUgKGkgPD0gY250KQorCQlpZiAobG9va19mb3JfdW5pbnRlcmVzdGluZworCQkgICAgPyAhKHNsaW5lW2ldLmZsYWcgJiBtYXJrKQorCQkgICAgOiAoc2xpbmVbaV0uZmxhZyAmIG1hcmspKQorCQkJcmV0dXJuIGk7CisJCWVsc2UKKwkJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBnaXZlX2NvbnRleHQoc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsIGludCBudW1fcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcgYWxsX21hc2sgPSAoMVVMPDxudW1fcGFyZW50KSAtIDE7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gKDFVTDw8bnVtX3BhcmVudCk7CisJdW5zaWduZWQgbG9uZyBpOworCisJLyogVHdvIGdyb3VwcyBvZiBpbnRlcmVzdGluZyBsaW5lcyBtYXkgaGF2ZSBhIHNob3J0IGdhcCBvZgorCSAqIHVuaW50ZXJlc3RpbmcgbGluZXMuICBDb25uZWN0IHN1Y2ggZ3JvdXBzIHRvIGdpdmUgdGhlbSBhCisJICogYml0IG9mIGNvbnRleHQuCisJICoKKwkgKiBXZSBmaXJzdCBzdGFydCBmcm9tIHdoYXQgdGhlIGludGVyZXN0aW5nKCkgZnVuY3Rpb24gc2F5cywKKwkgKiBhbmQgbWFyayB0aGVtIHdpdGggIm1hcmsiLCBhbmQgcGFpbnQgY29udGV4dCBsaW5lcyB3aXRoIHRoZQorCSAqIG1hcmsuICBTbyBpbnRlcmVzdGluZygpIHdvdWxkIHN0aWxsIHNheSBmYWxzZSBmb3Igc3VjaCBjb250ZXh0CisJICogbGluZXMgYnV0IHRoZXkgYXJlIHRyZWF0ZWQgYXMgImludGVyZXN0aW5nIiBpbiB0aGUgZW5kLgorCSAqLworCWkgPSBmaW5kX25leHQoc2xpbmUsIG1hcmssIDAsIGNudCwgMCk7CisJaWYgKGNudCA8IGkpCisJCXJldHVybiAwOworCisJd2hpbGUgKGkgPD0gY250KSB7CisJCXVuc2lnbmVkIGxvbmcgaiA9IChjb250ZXh0IDwgaSkgPyAoaSAtIGNvbnRleHQpIDogMDsKKwkJdW5zaWduZWQgbG9uZyBrOworCisJCS8qIFBhaW50IGEgZmV3IGxpbmVzIGJlZm9yZSB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgbGluZS4gKi8KKwkJd2hpbGUgKGogPCBpKQorCQkJc2xpbmVbaisrXS5mbGFnIHw9IG1hcms7CisKKwlhZ2FpbjoKKwkJLyogd2Uga25vdyB1cCB0byBpIGlzIHRvIGJlIGluY2x1ZGVkLiAgd2hlcmUgZG9lcyB0aGUKKwkJICogbmV4dCB1bmludGVyZXN0aW5nIG9uZSBzdGFydD8KKwkJICovCisJCWogPSBmaW5kX25leHQoc2xpbmUsIG1hcmssIGksIGNudCwgMSk7CisJCWlmIChjbnQgPCBqKQorCQkJYnJlYWs7IC8qIHRoZSByZXN0IGFyZSBhbGwgaW50ZXJlc3RpbmcgKi8KKworCQkvKiBsb29rYWhlYWQgY29udGV4dCBsaW5lcyAqLworCQlrID0gZmluZF9uZXh0KHNsaW5lLCBtYXJrLCBqLCBjbnQsIDApOworCQlqID0gYWRqdXN0X2h1bmtfdGFpbChzbGluZSwgYWxsX21hc2ssIGksIGopOworCisJCWlmIChrIDwgaiArIGNvbnRleHQpIHsKKwkJCS8qIGsgaXMgaW50ZXJlc3RpbmcgYW5kIFtqLGspIGFyZSBub3QsIGJ1dAorCQkJICogcGFpbnQgdGhlbSBpbnRlcmVzdGluZyBiZWNhdXNlIHRoZSBnYXAgaXMgc21hbGwuCisJCQkgKi8KKwkJCXdoaWxlIChqIDwgaykKKwkJCQlzbGluZVtqKytdLmZsYWcgfD0gbWFyazsKKwkJCWkgPSBrOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCS8qIGogaXMgdGhlIGZpcnN0IHVuaW50ZXJlc3RpbmcgbGluZSBhbmQgdGhlcmUgaXMKKwkJICogbm8gb3ZlcmxhcCBiZXlvbmQgaXQgd2l0aGluIGNvbnRleHQgbGluZXMuICBQYWludAorCQkgKiB0aGUgdHJhaWxpbmcgZWRnZSBhIGJpdC4KKwkJICovCisJCWkgPSBrOworCQlrID0gKGogKyBjb250ZXh0IDwgY250KzEpID8gaiArIGNvbnRleHQgOiBjbnQrMTsKKwkJd2hpbGUgKGogPCBrKQorCQkJc2xpbmVbaisrXS5mbGFnIHw9IG1hcms7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1ha2VfaHVua3Moc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsCisJCSAgICAgICBpbnQgbnVtX3BhcmVudCwgaW50IGRlbnNlKQoreworCXVuc2lnbmVkIGxvbmcgYWxsX21hc2sgPSAoMVVMPDxudW1fcGFyZW50KSAtIDE7CisJdW5zaWduZWQgbG9uZyBtYXJrID0gKDFVTDw8bnVtX3BhcmVudCk7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBoYXNfaW50ZXJlc3RpbmcgPSAwOworCisJZm9yIChpID0gMDsgaSA8PSBjbnQ7IGkrKykgeworCQlpZiAoaW50ZXJlc3RpbmcoJnNsaW5lW2ldLCBhbGxfbWFzaykpCisJCQlzbGluZVtpXS5mbGFnIHw9IG1hcms7CisJCWVsc2UKKwkJCXNsaW5lW2ldLmZsYWcgJj0gfm1hcms7CisJfQorCWlmICghZGVuc2UpCisJCXJldHVybiBnaXZlX2NvbnRleHQoc2xpbmUsIGNudCwgbnVtX3BhcmVudCk7CisKKwkvKiBMb29rIGF0IGVhY2ggaHVuaywgYW5kIGlmIHdlIGhhdmUgY2hhbmdlcyBmcm9tIG9ubHkgb25lCisJICogcGFyZW50LCBvciB0aGUgY2hhbmdlcyBhcmUgdGhlIHNhbWUgZnJvbSBhbGwgYnV0IG9uZQorCSAqIHBhcmVudCwgbWFyayB0aGF0IHVuaW50ZXJlc3RpbmcuCisJICovCisJaSA9IDA7CisJd2hpbGUgKGkgPD0gY250KSB7CisJCXVuc2lnbmVkIGxvbmcgaiwgaHVua19iZWdpbiwgaHVua19lbmQ7CisJCXVuc2lnbmVkIGxvbmcgc2FtZV9kaWZmOworCQl3aGlsZSAoaSA8PSBjbnQgJiYgIShzbGluZVtpXS5mbGFnICYgbWFyaykpCisJCQlpKys7CisJCWlmIChjbnQgPCBpKQorCQkJYnJlYWs7IC8qIE5vIG1vcmUgaW50ZXJlc3RpbmcgaHVua3MgKi8KKwkJaHVua19iZWdpbiA9IGk7CisJCWZvciAoaiA9IGkgKyAxOyBqIDw9IGNudDsgaisrKSB7CisJCQlpZiAoIShzbGluZVtqXS5mbGFnICYgbWFyaykpIHsKKwkJCQkvKiBMb29rIGJleW9uZCB0aGUgZW5kIHRvIHNlZSBpZiB0aGVyZQorCQkJCSAqIGlzIGFuIGludGVyZXN0aW5nIGxpbmUgYWZ0ZXIgdGhpcworCQkJCSAqIGh1bmsgd2l0aGluIGNvbnRleHQgc3Bhbi4KKwkJCQkgKi8KKwkJCQl1bnNpZ25lZCBsb25nIGxhOyAvKiBsb29rYWhlYWQgKi8KKwkJCQlpbnQgY29udGluID0gMDsKKwkJCQlsYSA9IGFkanVzdF9odW5rX3RhaWwoc2xpbmUsIGFsbF9tYXNrLAorCQkJCQkJICAgICBodW5rX2JlZ2luLCBqKTsKKwkJCQlsYSA9IChsYSArIGNvbnRleHQgPCBjbnQgKyAxKSA/CisJCQkJCShsYSArIGNvbnRleHQpIDogY250ICsgMTsKKwkJCQl3aGlsZSAoaiA8PSAtLWxhKSB7CisJCQkJCWlmIChzbGluZVtsYV0uZmxhZyAmIG1hcmspIHsKKwkJCQkJCWNvbnRpbiA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIWNvbnRpbikKKwkJCQkJYnJlYWs7CisJCQkJaiA9IGxhOworCQkJfQorCQl9CisJCWh1bmtfZW5kID0gajsKKworCQkvKiBbaS4uaHVua19lbmQpIGFyZSBpbnRlcmVzdGluZy4gIE5vdyBpcyBpdCByZWFsbHkKKwkJICogaW50ZXJlc3Rpbmc/ICBXZSBjaGVjayBpZiB0aGVyZSBhcmUgb25seSB0d28gdmVyc2lvbnMKKwkJICogYW5kIHRoZSByZXN1bHQgbWF0Y2hlcyBvbmUgb2YgdGhlbS4gIFRoYXQgaXMsIHdlIGxvb2sKKwkJICogYXQ6CisJCSAqICAgKCspIGxpbmUsIHdoaWNoIHJlY29yZHMgbGluZXMgYWRkZWQgdG8gd2hpY2ggcGFyZW50czsKKwkJICogICAgICAgdGhpcyBsaW5lIGFwcGVhcnMgaW4gdGhlIHJlc3VsdC4KKwkJICogICAoLSkgbGluZSwgd2hpY2ggcmVjb3JkcyBmcm9tIHdoYXQgcGFyZW50cyB0aGUgbGluZQorCQkgKiAgICAgICB3YXMgcmVtb3ZlZDsgdGhpcyBsaW5lIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcmVzdWx0LgorCQkgKiB0aGVuIGNoZWNrIHRoZSBzZXQgb2YgcGFyZW50cyB0aGUgcmVzdWx0IGhhcyBkaWZmZXJlbmNlCisJCSAqIGZyb20sIGZyb20gYWxsIGxpbmVzLiAgSWYgdGhlcmUgYXJlIGxpbmVzIHRoYXQgaGFzCisJCSAqIGRpZmZlcmVudCBzZXQgb2YgcGFyZW50cyB0aGF0IHRoZSByZXN1bHQgaGFzIGRpZmZlcmVuY2VzCisJCSAqIGZyb20sIHRoYXQgbWVhbnMgd2UgaGF2ZSBtb3JlIHRoYW4gdHdvIHZlcnNpb25zLgorCQkgKgorCQkgKiBFdmVuIHdoZW4gd2UgaGF2ZSBvbmx5IHR3byB2ZXJzaW9ucywgaWYgdGhlIHJlc3VsdCBkb2VzCisJCSAqIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHBhcmVudHMsIHRoZSBpdCBzaG91bGQgYmUgY29uc2lkZXJlZAorCQkgKiBpbnRlcmVzdGluZy4gIEluIHN1Y2ggYSBjYXNlLCB3ZSB3b3VsZCBoYXZlIGFsbCAnKycgbGluZS4KKwkJICogQWZ0ZXIgcGFzc2luZyB0aGUgYWJvdmUgInR3byB2ZXJzaW9ucyIgdGVzdCwgdGhhdCB3b3VsZAorCQkgKiBhcHBlYXIgYXMgInRoZSBzYW1lIHNldCBvZiBwYXJlbnRzIiB0byBiZSAiYWxsIHBhcmVudHMiLgorCQkgKi8KKwkJc2FtZV9kaWZmID0gMDsKKwkJaGFzX2ludGVyZXN0aW5nID0gMDsKKwkJZm9yIChqID0gaTsgaiA8IGh1bmtfZW5kICYmICFoYXNfaW50ZXJlc3Rpbmc7IGorKykgeworCQkJdW5zaWduZWQgbG9uZyB0aGlzX2RpZmYgPSBzbGluZVtqXS5mbGFnICYgYWxsX21hc2s7CisJCQlzdHJ1Y3QgbGxpbmUgKmxsID0gc2xpbmVbal0ubG9zdF9oZWFkOworCQkJaWYgKHRoaXNfZGlmZikgeworCQkJCS8qIFRoaXMgaGFzIHNvbWUgY2hhbmdlcy4gIElzIGl0IHRoZQorCQkJCSAqIHNhbWUgYXMgb3RoZXJzPworCQkJCSAqLworCQkJCWlmICghc2FtZV9kaWZmKQorCQkJCQlzYW1lX2RpZmYgPSB0aGlzX2RpZmY7CisJCQkJZWxzZSBpZiAoc2FtZV9kaWZmICE9IHRoaXNfZGlmZikgeworCQkJCQloYXNfaW50ZXJlc3RpbmcgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQl3aGlsZSAobGwgJiYgIWhhc19pbnRlcmVzdGluZykgeworCQkJCS8qIExvc3QgdGhpcyBsaW5lIGZyb20gdGhlc2UgcGFyZW50czsKKwkJCQkgKiB3aG8gYXJlIHRoZXk/ICBBcmUgdGhleSB0aGUgc2FtZT8KKwkJCQkgKi8KKwkJCQl0aGlzX2RpZmYgPSBsbC0+cGFyZW50X21hcDsKKwkJCQlpZiAoIXNhbWVfZGlmZikKKwkJCQkJc2FtZV9kaWZmID0gdGhpc19kaWZmOworCQkJCWVsc2UgaWYgKHNhbWVfZGlmZiAhPSB0aGlzX2RpZmYpIHsKKwkJCQkJaGFzX2ludGVyZXN0aW5nID0gMTsKKwkJCQl9CisJCQkJbGwgPSBsbC0+bmV4dDsKKwkJCX0KKwkJfQorCisJCWlmICghaGFzX2ludGVyZXN0aW5nICYmIHNhbWVfZGlmZiAhPSBhbGxfbWFzaykgeworCQkJLyogVGhpcyBodW5rIGlzIG5vdCB0aGF0IGludGVyZXN0aW5nIGFmdGVyIGFsbCAqLworCQkJZm9yIChqID0gaHVua19iZWdpbjsgaiA8IGh1bmtfZW5kOyBqKyspCisJCQkJc2xpbmVbal0uZmxhZyAmPSB+bWFyazsKKwkJfQorCQlpID0gaHVua19lbmQ7CisJfQorCisJaGFzX2ludGVyZXN0aW5nID0gZ2l2ZV9jb250ZXh0KHNsaW5lLCBjbnQsIG51bV9wYXJlbnQpOworCXJldHVybiBoYXNfaW50ZXJlc3Rpbmc7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcGFyZW50X2xubyhzdHJ1Y3Qgc2xpbmUgKnNsaW5lLCB1bnNpZ25lZCBsb25nIGwwLCB1bnNpZ25lZCBsb25nIGwxLCBpbnQgbikKK3sKKwlsMCA9IHNsaW5lW2wwXS5wX2xub1tuXTsKKwlsMSA9IHNsaW5lW2wxXS5wX2xub1tuXTsKKwlwcmludGYoIiAtJWx1LCVsdSIsIGwwLCBsMS1sMCk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfc2xpbmUoc3RydWN0IHNsaW5lICpzbGluZSwgdW5zaWduZWQgbG9uZyBjbnQsIGludCBudW1fcGFyZW50LAorCQkgICAgICAgaW50IHVzZV9jb2xvcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hcmsgPSAoMVVMPDxudW1fcGFyZW50KTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGxubyA9IDA7CisJY29uc3QgY2hhciAqY19mcmFnID0gZGlmZl9nZXRfY29sb3IodXNlX2NvbG9yLCBESUZGX0ZSQUdJTkZPKTsKKwljb25zdCBjaGFyICpjX25ldyA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9GSUxFX05FVyk7CisJY29uc3QgY2hhciAqY19vbGQgPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfRklMRV9PTEQpOworCWNvbnN0IGNoYXIgKmNfcGxhaW4gPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfUExBSU4pOworCWNvbnN0IGNoYXIgKmNfcmVzZXQgPSBkaWZmX2dldF9jb2xvcih1c2VfY29sb3IsIERJRkZfUkVTRVQpOworCisJaWYgKCFjbnQpCisJCXJldHVybjsgLyogcmVzdWx0IGRlbGV0ZWQgKi8KKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzbGluZSAqc2wgPSAmc2xpbmVbbG5vXTsKKwkJdW5zaWduZWQgbG9uZyBodW5rX2VuZDsKKwkJdW5zaWduZWQgbG9uZyBybGluZXM7CisJCXdoaWxlIChsbm8gPD0gY250ICYmICEoc2xpbmVbbG5vXS5mbGFnICYgbWFyaykpCisJCQlsbm8rKzsKKwkJaWYgKGNudCA8IGxubykKKwkJCWJyZWFrOworCQllbHNlIHsKKwkJCWZvciAoaHVua19lbmQgPSBsbm8gKyAxOyBodW5rX2VuZCA8PSBjbnQ7IGh1bmtfZW5kKyspCisJCQkJaWYgKCEoc2xpbmVbaHVua19lbmRdLmZsYWcgJiBtYXJrKSkKKwkJCQkJYnJlYWs7CisJCX0KKwkJcmxpbmVzID0gaHVua19lbmQgLSBsbm87CisJCWlmIChjbnQgPCBodW5rX2VuZCkKKwkJCXJsaW5lcy0tOyAvKiBwb2ludGluZyBhdCB0aGUgbGFzdCBkZWxldGUgaHVuayAqLworCQlmcHV0cyhjX2ZyYWcsIHN0ZG91dCk7CisJCWZvciAoaSA9IDA7IGkgPD0gbnVtX3BhcmVudDsgaSsrKSBwdXRjaGFyKGNvbWJpbmVfbWFya2VyKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCXNob3dfcGFyZW50X2xubyhzbGluZSwgbG5vLCBodW5rX2VuZCwgaSk7CisJCXByaW50ZigiICslbHUsJWx1ICIsIGxubysxLCBybGluZXMpOworCQlmb3IgKGkgPSAwOyBpIDw9IG51bV9wYXJlbnQ7IGkrKykgcHV0Y2hhcihjb21iaW5lX21hcmtlcik7CisJCXByaW50ZigiJXNcbiIsIGNfcmVzZXQpOworCQl3aGlsZSAobG5vIDwgaHVua19lbmQpIHsKKwkJCXN0cnVjdCBsbGluZSAqbGw7CisJCQlpbnQgajsKKwkJCXVuc2lnbmVkIGxvbmcgcF9tYXNrOworCQkJc2wgPSAmc2xpbmVbbG5vKytdOworCQkJbGwgPSBzbC0+bG9zdF9oZWFkOworCQkJd2hpbGUgKGxsKSB7CisJCQkJZnB1dHMoY19vbGQsIHN0ZG91dCk7CisJCQkJZm9yIChqID0gMDsgaiA8IG51bV9wYXJlbnQ7IGorKykgeworCQkJCQlpZiAobGwtPnBhcmVudF9tYXAgJiAoMVVMPDxqKSkKKwkJCQkJCXB1dGNoYXIoJy0nKTsKKwkJCQkJZWxzZQorCQkJCQkJcHV0Y2hhcignICcpOworCQkJCX0KKwkJCQlwcmludGYoIiVzJXNcbiIsIGxsLT5saW5lLCBjX3Jlc2V0KTsKKwkJCQlsbCA9IGxsLT5uZXh0OworCQkJfQorCQkJaWYgKGNudCA8IGxubykKKwkJCQlicmVhazsKKwkJCXBfbWFzayA9IDE7CisJCQlpZiAoIShzbC0+ZmxhZyAmIChtYXJrLTEpKSkKKwkJCQlmcHV0cyhjX3BsYWluLCBzdGRvdXQpOworCQkJZWxzZQorCQkJCWZwdXRzKGNfbmV3LCBzdGRvdXQpOworCQkJZm9yIChqID0gMDsgaiA8IG51bV9wYXJlbnQ7IGorKykgeworCQkJCWlmIChwX21hc2sgJiBzbC0+ZmxhZykKKwkJCQkJcHV0Y2hhcignKycpOworCQkJCWVsc2UKKwkJCQkJcHV0Y2hhcignICcpOworCQkJCXBfbWFzayA8PD0gMTsKKwkJCX0KKwkJCXByaW50ZigiJS4qcyVzXG4iLCBzbC0+bGVuLCBzbC0+Ym9sLCBjX3Jlc2V0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmV1c2VfY29tYmluZV9kaWZmKHN0cnVjdCBzbGluZSAqc2xpbmUsIHVuc2lnbmVkIGxvbmcgY250LAorCQkJICAgICAgIGludCBpLCBpbnQgaikKK3sKKwkvKiBXZSBoYXZlIGFscmVhZHkgZXhhbWluZWQgcGFyZW50IGogYW5kIHdlIGtub3cgcGFyZW50IGkKKwkgKiBhbmQgcGFyZW50IGogYXJlIHRoZSBzYW1lLCBzbyByZXVzZSB0aGUgY29tYmluZWQgcmVzdWx0CisJICogb2YgcGFyZW50IGogZm9yIHBhcmVudCBpLgorCSAqLworCXVuc2lnbmVkIGxvbmcgbG5vLCBpbWFzaywgam1hc2s7CisJaW1hc2sgPSAoMVVMPDxpKTsKKwlqbWFzayA9ICgxVUw8PGopOworCisJZm9yIChsbm8gPSAwOyBsbm8gPD0gY250OyBsbm8rKykgeworCQlzdHJ1Y3QgbGxpbmUgKmxsID0gc2xpbmUtPmxvc3RfaGVhZDsKKwkJc2xpbmUtPnBfbG5vW2ldID0gc2xpbmUtPnBfbG5vW2pdOworCQl3aGlsZSAobGwpIHsKKwkJCWlmIChsbC0+cGFyZW50X21hcCAmIGptYXNrKQorCQkJCWxsLT5wYXJlbnRfbWFwIHw9IGltYXNrOworCQkJbGwgPSBsbC0+bmV4dDsKKwkJfQorCQlpZiAoc2xpbmUtPmZsYWcgJiBqbWFzaykKKwkJCXNsaW5lLT5mbGFnIHw9IGltYXNrOworCQlzbGluZSsrOworCX0KKwkvKiB0aGUgb3ZlcmFsbCBzaXplIG9mIHRoZSBmaWxlIChzbGluZVtjbnRdKSAqLworCXNsaW5lLT5wX2xub1tpXSA9IHNsaW5lLT5wX2xub1tqXTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9xdW90ZWRfcGF0aChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkgICAgIGNvbnN0IGNoYXIgKmNfbWV0YSwgY29uc3QgY2hhciAqY19yZXNldCkKK3sKKwlwcmludGYoIiVzJXMiLCBjX21ldGEsIHByZWZpeCk7CisJaWYgKHF1b3RlX2Nfc3R5bGUocGF0aCwgTlVMTCwgTlVMTCwgMCkpCisJCXF1b3RlX2Nfc3R5bGUocGF0aCwgTlVMTCwgc3Rkb3V0LCAwKTsKKwllbHNlCisJCXByaW50ZigiJXMiLCBwYXRoKTsKKwlwcmludGYoIiVzXG4iLCBjX3Jlc2V0KTsKK30KKworc3RhdGljIGludCBzaG93X3BhdGNoX2RpZmYoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICplbGVtLCBpbnQgbnVtX3BhcmVudCwKKwkJCSAgIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICpyZXYpCit7CisJc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0ID0gJnJldi0+ZGlmZm9wdDsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdF9zaXplLCBjbnQsIGxubzsKKwljaGFyICpyZXN1bHQsICpjcDsKKwlzdHJ1Y3Qgc2xpbmUgKnNsaW5lOyAvKiBzdXJ2aXZlZCBsaW5lcyAqLworCWludCBtb2RlX2RpZmZlcnMgPSAwOworCWludCBpLCBzaG93X2h1bmtzLCBzaG93bl9oZWFkZXIgPSAwOworCWludCB3b3JraW5nX3RyZWVfZmlsZSA9ICFtZW1jbXAoZWxlbS0+c2hhMSwgbnVsbF9zaGExLCAyMCk7CisJaW50IGFiYnJldiA9IG9wdC0+ZnVsbF9pbmRleCA/IDQwIDogREVGQVVMVF9BQkJSRVY7CisJbW1maWxlX3QgcmVzdWx0X2ZpbGU7CisKKwljb250ZXh0ID0gb3B0LT5jb250ZXh0OworCS8qIFJlYWQgdGhlIHJlc3VsdCBvZiBtZXJnZSBmaXJzdCAqLworCWlmICghd29ya2luZ190cmVlX2ZpbGUpCisJCXJlc3VsdCA9IGdyYWJfYmxvYihlbGVtLT5zaGExLCAmcmVzdWx0X3NpemUpOworCWVsc2UgeworCQkvKiBVc2VkIGJ5IGRpZmYtdHJlZSB0byByZWFkIGZyb20gdGhlIHdvcmtpbmcgdHJlZSAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGZkOworCQlpZiAoMCA8PSAoZmQgPSBvcGVuKGVsZW0tPnBhdGgsIE9fUkRPTkxZKSkgJiYKKwkJICAgICFmc3RhdChmZCwgJnN0KSkgeworCQkJaW50IGxlbiA9IHN0LnN0X3NpemU7CisJCQlpbnQgc3ogPSAwOworCisJCQllbGVtLT5tb2RlID0gY2Fub25fbW9kZShzdC5zdF9tb2RlKTsKKwkJCXJlc3VsdF9zaXplID0gbGVuOworCQkJcmVzdWx0ID0geG1hbGxvYyhsZW4gKyAxKTsKKwkJCXdoaWxlIChzeiA8IGxlbikgeworCQkJCWludCBkb25lID0geHJlYWQoZmQsIHJlc3VsdCtzeiwgbGVuLXN6KTsKKwkJCQlpZiAoZG9uZSA9PSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZG9uZSA8IDApCisJCQkJCWRpZSgicmVhZCBlcnJvciAnJXMnIiwgZWxlbS0+cGF0aCk7CisJCQkJc3ogKz0gZG9uZTsKKwkJCX0KKwkJCXJlc3VsdFtsZW5dID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCS8qIGRlbGV0ZWQgZmlsZSAqLworCQkJcmVzdWx0X3NpemUgPSAwOworCQkJZWxlbS0+bW9kZSA9IDA7CisJCQlyZXN1bHQgPSB4Y2FsbG9jKDEsIDEpOworCQl9CisJCWlmICgwIDw9IGZkKQorCQkJY2xvc2UoZmQpOworCX0KKworCWZvciAoY250ID0gMCwgY3AgPSByZXN1bHQ7IGNwIDwgcmVzdWx0ICsgcmVzdWx0X3NpemU7IGNwKyspIHsKKwkJaWYgKCpjcCA9PSAnXG4nKQorCQkJY250Kys7CisJfQorCWlmIChyZXN1bHRfc2l6ZSAmJiByZXN1bHRbcmVzdWx0X3NpemUtMV0gIT0gJ1xuJykKKwkJY250Kys7IC8qIGluY29tcGxldGUgbGluZSAqLworCisJc2xpbmUgPSB4Y2FsbG9jKGNudCsyLCBzaXplb2YoKnNsaW5lKSk7CisJc2xpbmVbMF0uYm9sID0gcmVzdWx0OworCWZvciAobG5vID0gMDsgbG5vIDw9IGNudCArIDE7IGxubysrKSB7CisJCXNsaW5lW2xub10ubG9zdF90YWlsID0gJnNsaW5lW2xub10ubG9zdF9oZWFkOworCQlzbGluZVtsbm9dLmZsYWcgPSAwOworCX0KKwlmb3IgKGxubyA9IDAsIGNwID0gcmVzdWx0OyBjcCA8IHJlc3VsdCArIHJlc3VsdF9zaXplOyBjcCsrKSB7CisJCWlmICgqY3AgPT0gJ1xuJykgeworCQkJc2xpbmVbbG5vXS5sZW4gPSBjcCAtIHNsaW5lW2xub10uYm9sOworCQkJbG5vKys7CisJCQlpZiAobG5vIDwgY250KQorCQkJCXNsaW5lW2xub10uYm9sID0gY3AgKyAxOworCQl9CisJfQorCWlmIChyZXN1bHRfc2l6ZSAmJiByZXN1bHRbcmVzdWx0X3NpemUtMV0gIT0gJ1xuJykKKwkJc2xpbmVbY250LTFdLmxlbiA9IHJlc3VsdF9zaXplIC0gKHNsaW5lW2NudC0xXS5ib2wgLSByZXN1bHQpOworCisJcmVzdWx0X2ZpbGUucHRyID0gcmVzdWx0OworCXJlc3VsdF9maWxlLnNpemUgPSByZXN1bHRfc2l6ZTsKKworCS8qIEV2ZW4gcF9sbm9bY250KzFdIGlzIHZhbGlkIC0tIHRoYXQgaXMgZm9yIHRoZSBlbmQgbGluZSBudW1iZXIKKwkgKiBmb3IgZGVsZXRpb24gaHVuayBhdCB0aGUgZW5kLgorCSAqLworCXNsaW5lWzBdLnBfbG5vID0geGNhbGxvYygoY250KzIpICogbnVtX3BhcmVudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlmb3IgKGxubyA9IDA7IGxubyA8PSBjbnQ7IGxubysrKQorCQlzbGluZVtsbm8rMV0ucF9sbm8gPSBzbGluZVtsbm9dLnBfbG5vICsgbnVtX3BhcmVudDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJaW50IGo7CisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCWlmICghbWVtY21wKGVsZW0tPnBhcmVudFtpXS5zaGExLAorCQkJCSAgICBlbGVtLT5wYXJlbnRbal0uc2hhMSwgMjApKSB7CisJCQkJcmV1c2VfY29tYmluZV9kaWZmKHNsaW5lLCBjbnQsIGksIGopOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpIDw9IGopCisJCQljb21iaW5lX2RpZmYoZWxlbS0+cGFyZW50W2ldLnNoYTEsICZyZXN1bHRfZmlsZSwgc2xpbmUsCisJCQkJICAgICBjbnQsIGksIG51bV9wYXJlbnQpOworCQlpZiAoZWxlbS0+cGFyZW50W2ldLm1vZGUgIT0gZWxlbS0+bW9kZSkKKwkJCW1vZGVfZGlmZmVycyA9IDE7CisJfQorCisJc2hvd19odW5rcyA9IG1ha2VfaHVua3Moc2xpbmUsIGNudCwgbnVtX3BhcmVudCwgZGVuc2UpOworCisJaWYgKHNob3dfaHVua3MgfHwgbW9kZV9kaWZmZXJzIHx8IHdvcmtpbmdfdHJlZV9maWxlKSB7CisJCWNvbnN0IGNoYXIgKmFiYjsKKwkJaW50IHVzZV9jb2xvciA9IG9wdC0+Y29sb3JfZGlmZjsKKwkJY29uc3QgY2hhciAqY19tZXRhID0gZGlmZl9nZXRfY29sb3IodXNlX2NvbG9yLCBESUZGX01FVEFJTkZPKTsKKwkJY29uc3QgY2hhciAqY19yZXNldCA9IGRpZmZfZ2V0X2NvbG9yKHVzZV9jb2xvciwgRElGRl9SRVNFVCk7CisKKwkJaWYgKHJldi0+bG9naW5mbykKKwkJCXNob3dfbG9nKHJldiwgb3B0LT5tc2dfc2VwKTsKKwkJZHVtcF9xdW90ZWRfcGF0aChkZW5zZSA/ICJkaWZmIC0tY2MgIiA6ICJkaWZmIC0tY29tYmluZWQgIiwKKwkJCQkgZWxlbS0+cGF0aCwgY19tZXRhLCBjX3Jlc2V0KTsKKwkJcHJpbnRmKCIlc2luZGV4ICIsIGNfbWV0YSk7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcGFyZW50OyBpKyspIHsKKwkJCWFiYiA9IGZpbmRfdW5pcXVlX2FiYnJldihlbGVtLT5wYXJlbnRbaV0uc2hhMSwKKwkJCQkJCSBhYmJyZXYpOworCQkJcHJpbnRmKCIlcyVzIiwgaSA/ICIsIiA6ICIiLCBhYmIpOworCQl9CisJCWFiYiA9IGZpbmRfdW5pcXVlX2FiYnJldihlbGVtLT5zaGExLCBhYmJyZXYpOworCQlwcmludGYoIi4uJXMlc1xuIiwgYWJiLCBjX3Jlc2V0KTsKKworCQlpZiAobW9kZV9kaWZmZXJzKSB7CisJCQlpbnQgYWRkZWQgPSAhIWVsZW0tPm1vZGU7CisJCQlmb3IgKGkgPSAwOyBhZGRlZCAmJiBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJCWlmIChlbGVtLT5wYXJlbnRbaV0uc3RhdHVzICE9CisJCQkJICAgIERJRkZfU1RBVFVTX0FEREVEKQorCQkJCQlhZGRlZCA9IDA7CisJCQlpZiAoYWRkZWQpCisJCQkJcHJpbnRmKCIlc25ldyBmaWxlIG1vZGUgJTA2byIsCisJCQkJICAgICAgIGNfbWV0YSwgZWxlbS0+bW9kZSk7CisJCQllbHNlIHsKKwkJCQlpZiAoIWVsZW0tPm1vZGUpCisJCQkJCXByaW50ZigiJXNkZWxldGVkIGZpbGUgIiwgY19tZXRhKTsKKwkJCQlwcmludGYoIm1vZGUgIik7CisJCQkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkJCQlwcmludGYoIiVzJTA2byIsIGkgPyAiLCIgOiAiIiwKKwkJCQkJICAgICAgIGVsZW0tPnBhcmVudFtpXS5tb2RlKTsKKwkJCQl9CisJCQkJaWYgKGVsZW0tPm1vZGUpCisJCQkJCXByaW50ZigiLi4lMDZvIiwgZWxlbS0+bW9kZSk7CisJCQl9CisJCQlwcmludGYoIiVzXG4iLCBjX3Jlc2V0KTsKKwkJfQorCQlkdW1wX3F1b3RlZF9wYXRoKCItLS0gYS8iLCBlbGVtLT5wYXRoLCBjX21ldGEsIGNfcmVzZXQpOworCQlkdW1wX3F1b3RlZF9wYXRoKCIrKysgYi8iLCBlbGVtLT5wYXRoLCBjX21ldGEsIGNfcmVzZXQpOworCQlkdW1wX3NsaW5lKHNsaW5lLCBjbnQsIG51bV9wYXJlbnQsIG9wdC0+Y29sb3JfZGlmZik7CisJfQorCWZyZWUocmVzdWx0KTsKKworCWZvciAobG5vID0gMDsgbG5vIDwgY250OyBsbm8rKykgeworCQlpZiAoc2xpbmVbbG5vXS5sb3N0X2hlYWQpIHsKKwkJCXN0cnVjdCBsbGluZSAqbGwgPSBzbGluZVtsbm9dLmxvc3RfaGVhZDsKKwkJCXdoaWxlIChsbCkgeworCQkJCXN0cnVjdCBsbGluZSAqdG1wID0gbGw7CisJCQkJbGwgPSBsbC0+bmV4dDsKKwkJCQlmcmVlKHRtcCk7CisJCQl9CisJCX0KKwl9CisJZnJlZShzbGluZVswXS5wX2xubyk7CisJZnJlZShzbGluZSk7CisJcmV0dXJuIHNob3duX2hlYWRlcjsKK30KKworI2RlZmluZSBDT0xPTlMgIjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6IgorCitzdGF0aWMgdm9pZCBzaG93X3Jhd19kaWZmKHN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqcCwgaW50IG51bV9wYXJlbnQsIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJaW50IGksIG9mZnNldDsKKwljb25zdCBjaGFyICpwcmVmaXg7CisJaW50IGxpbmVfdGVybWluYXRpb24sIGludGVyX25hbWVfdGVybWluYXRpb247CisKKwlsaW5lX3Rlcm1pbmF0aW9uID0gb3B0LT5saW5lX3Rlcm1pbmF0aW9uOworCWludGVyX25hbWVfdGVybWluYXRpb24gPSAnXHQnOworCWlmICghbGluZV90ZXJtaW5hdGlvbikKKwkJaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9IDA7CisKKwlpZiAocmV2LT5sb2dpbmZvKQorCQlzaG93X2xvZyhyZXYsIG9wdC0+bXNnX3NlcCk7CisKKwlpZiAob3B0LT5vdXRwdXRfZm9ybWF0ICYgRElGRl9GT1JNQVRfUkFXKSB7CisJCW9mZnNldCA9IHN0cmxlbihDT0xPTlMpIC0gbnVtX3BhcmVudDsKKwkJaWYgKG9mZnNldCA8IDApCisJCQlvZmZzZXQgPSAwOworCQlwcmVmaXggPSBDT0xPTlMgKyBvZmZzZXQ7CisKKwkJLyogU2hvdyB0aGUgbW9kZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkJcHJpbnRmKCIlcyUwNm8iLCBwcmVmaXgsIHAtPnBhcmVudFtpXS5tb2RlKTsKKwkJCXByZWZpeCA9ICIgIjsKKwkJfQorCQlwcmludGYoIiVzJTA2byIsIHByZWZpeCwgcC0+bW9kZSk7CisKKwkJLyogU2hvdyBzaGExJ3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykKKwkJCXByaW50ZigiICVzIiwgZGlmZl91bmlxdWVfYWJicmV2KHAtPnBhcmVudFtpXS5zaGExLAorCQkJCQkJCSBvcHQtPmFiYnJldikpOworCQlwcmludGYoIiAlcyAiLCBkaWZmX3VuaXF1ZV9hYmJyZXYocC0+c2hhMSwgb3B0LT5hYmJyZXYpKTsKKwl9CisKKwlpZiAob3B0LT5vdXRwdXRfZm9ybWF0ICYgKERJRkZfRk9STUFUX1JBVyB8IERJRkZfRk9STUFUX05BTUVfU1RBVFVTKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudDsgaSsrKQorCQkJcHV0Y2hhcihwLT5wYXJlbnRbaV0uc3RhdHVzKTsKKwkJcHV0Y2hhcihpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uKTsKKwl9CisKKwlpZiAobGluZV90ZXJtaW5hdGlvbikgeworCQlpZiAocXVvdGVfY19zdHlsZShwLT5wYXRoLCBOVUxMLCBOVUxMLCAwKSkKKwkJCXF1b3RlX2Nfc3R5bGUocC0+cGF0aCwgTlVMTCwgc3Rkb3V0LCAwKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlcyIsIHAtPnBhdGgpOworCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworCX0KKwllbHNlIHsKKwkJcHJpbnRmKCIlcyVjIiwgcC0+cGF0aCwgbGluZV90ZXJtaW5hdGlvbik7CisJfQorfQorCit2b2lkIHNob3dfY29tYmluZWRfZGlmZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnAsCisJCSAgICAgICBpbnQgbnVtX3BhcmVudCwKKwkJICAgICAgIGludCBkZW5zZSwKKwkJICAgICAgIHN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJaWYgKCFwLT5sZW4pCisJCXJldHVybjsKKwlpZiAob3B0LT5vdXRwdXRfZm9ybWF0ICYgKERJRkZfRk9STUFUX1JBVyB8CisJCQkJICBESUZGX0ZPUk1BVF9OQU1FIHwKKwkJCQkgIERJRkZfRk9STUFUX05BTUVfU1RBVFVTKSkgeworCQlzaG93X3Jhd19kaWZmKHAsIG51bV9wYXJlbnQsIHJldik7CisJfSBlbHNlIGlmIChvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9QQVRDSCkgeworCQlzaG93X3BhdGNoX2RpZmYocCwgbnVtX3BhcmVudCwgZGVuc2UsIHJldik7CisJfQorfQorCit2b2lkIGRpZmZfdHJlZV9jb21iaW5lZChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciBwYXJlbnRbXVsyMF0sCisJCQlpbnQgbnVtX3BhcmVudCwKKwkJCWludCBkZW5zZSwKKwkJCXN0cnVjdCByZXZfaW5mbyAqcmV2KQoreworCXN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCA9ICZyZXYtPmRpZmZvcHQ7CisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmb3B0czsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKnAsICpwYXRocyA9IE5VTEw7CisJaW50IGksIG51bV9wYXRocywgbmVlZHNlcCwgc2hvd19sb2dfZmlyc3Q7CisKKwlkaWZmb3B0cyA9ICpvcHQ7CisJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwlkaWZmb3B0cy5yZWN1cnNpdmUgPSAxOworCisJc2hvd19sb2dfZmlyc3QgPSAhIXJldi0+bG9naW5mbzsKKwluZWVkc2VwID0gMDsKKwkvKiBmaW5kIHNldCBvZiBwYXRocyB0aGF0IGV2ZXJ5Ym9keSB0b3VjaGVzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9wYXJlbnQ7IGkrKykgeworCQkvKiBzaG93IHN0YXQgYWdhaW5zdCB0aGUgZmlyc3QgcGFyZW50IGV2ZW4KKwkJICogd2hlbiBkb2luZyBjb21iaW5lZCBkaWZmLgorCQkgKi8KKwkJaWYgKGkgPT0gMCAmJiBvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9ESUZGU1RBVCkKKwkJCWRpZmZvcHRzLm91dHB1dF9mb3JtYXQgPSBESUZGX0ZPUk1BVF9ESUZGU1RBVDsKKwkJZWxzZQorCQkJZGlmZm9wdHMub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX05PX09VVFBVVDsKKwkJZGlmZl90cmVlX3NoYTEocGFyZW50W2ldLCBzaGExLCAiIiwgJmRpZmZvcHRzKTsKKwkJZGlmZmNvcmVfc3RkKCZkaWZmb3B0cyk7CisJCXBhdGhzID0gaW50ZXJzZWN0X3BhdGhzKHBhdGhzLCBpLCBudW1fcGFyZW50KTsKKworCQlpZiAoc2hvd19sb2dfZmlyc3QgJiYgaSA9PSAwKSB7CisJCQlzaG93X2xvZyhyZXYsIG9wdC0+bXNnX3NlcCk7CisJCQlpZiAocmV2LT52ZXJib3NlX2hlYWRlciAmJiBvcHQtPm91dHB1dF9mb3JtYXQpCisJCQkJcHV0Y2hhcihvcHQtPmxpbmVfdGVybWluYXRpb24pOworCQl9CisJCWRpZmZfZmx1c2goJmRpZmZvcHRzKTsKKwl9CisKKwkvKiBmaW5kIG91dCBzdXJ2aXZpbmcgcGF0aHMgKi8KKwlmb3IgKG51bV9wYXRocyA9IDAsIHAgPSBwYXRoczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKHAtPmxlbikKKwkJCW51bV9wYXRocysrOworCX0KKwlpZiAobnVtX3BhdGhzKSB7CisJCWlmIChvcHQtPm91dHB1dF9mb3JtYXQgJiAoRElGRl9GT1JNQVRfUkFXIHwKKwkJCQkJICBESUZGX0ZPUk1BVF9OQU1FIHwKKwkJCQkJICBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpIHsKKwkJCWZvciAocCA9IHBhdGhzOyBwOyBwID0gcC0+bmV4dCkgeworCQkJCWlmIChwLT5sZW4pCisJCQkJCXNob3dfcmF3X2RpZmYocCwgbnVtX3BhcmVudCwgcmV2KTsKKwkJCX0KKwkJCW5lZWRzZXAgPSAxOworCQl9CisJCWVsc2UgaWYgKG9wdC0+b3V0cHV0X2Zvcm1hdCAmIERJRkZfRk9STUFUX0RJRkZTVEFUKQorCQkJbmVlZHNlcCA9IDE7CisJCWlmIChvcHQtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9QQVRDSCkgeworCQkJaWYgKG5lZWRzZXApCisJCQkJcHV0Y2hhcihvcHQtPmxpbmVfdGVybWluYXRpb24pOworCQkJZm9yIChwID0gcGF0aHM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQkJaWYgKHAtPmxlbikKKwkJCQkJc2hvd19wYXRjaF9kaWZmKHAsIG51bV9wYXJlbnQsIGRlbnNlLAorCQkJCQkJCXJldik7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDbGVhbiB0aGluZ3MgdXAgKi8KKwl3aGlsZSAocGF0aHMpIHsKKwkJc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoICp0bXAgPSBwYXRoczsKKwkJcGF0aHMgPSBwYXRocy0+bmV4dDsKKwkJZnJlZSh0bXApOworCX0KK30KKwordm9pZCBkaWZmX3RyZWVfY29tYmluZWRfbWVyZ2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgICAgaW50IGRlbnNlLCBzdHJ1Y3QgcmV2X2luZm8gKnJldikKK3sKKwlpbnQgbnVtX3BhcmVudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICgqcGFyZW50KVsyMF07CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdChzaGExKTsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwkvKiBjb3VudCBwYXJlbnRzICovCisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzLCBudW1fcGFyZW50ID0gMDsKKwkgICAgIHBhcmVudHM7CisJICAgICBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCwgbnVtX3BhcmVudCsrKQorCQk7IC8qIG5vdGhpbmcgKi8KKworCXBhcmVudCA9IHhtYWxsb2MobnVtX3BhcmVudCAqIHNpemVvZigqcGFyZW50KSk7CisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzLCBudW1fcGFyZW50ID0gMDsKKwkgICAgIHBhcmVudHM7CisJICAgICBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCwgbnVtX3BhcmVudCsrKQorCQltZW1jcHkocGFyZW50ICsgbnVtX3BhcmVudCwgcGFyZW50cy0+aXRlbS0+b2JqZWN0LnNoYTEsIDIwKTsKKwlkaWZmX3RyZWVfY29tYmluZWQoc2hhMSwgcGFyZW50LCBudW1fcGFyZW50LCBkZW5zZSwgcmV2KTsKK30KZGlmZiAtLWdpdCBhL2NvbW1pdC5jIGIvY29tbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMGNhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbW1pdC5jCkBAIC0wLDAgKzEsMTAwMCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisKK2ludCBzYXZlX2NvbW1pdF9idWZmZXIgPSAxOworCitzdHJ1Y3Qgc29ydF9ub2RlCit7CisJLyoKKyAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGUgYXNzb2NpYXRlZCBjb21taXQKKyAgICAgICAgICogdGhhdCBhbHNvIG9jY3VyIGluIHRoZSBsaXN0IGJlaW5nIHNvcnRlZC4KKyAgICAgICAgICovCisJdW5zaWduZWQgaW50IGluZGVncmVlOworCisJLyoKKyAgICAgICAgICogcmVmZXJlbmNlIHRvIG9yaWdpbmFsIGxpc3QgaXRlbSB0aGF0IHdlIHdpbGwgcmUtdXNlCisgICAgICAgICAqIG9uIG91dHB1dC4KKyAgICAgICAgICovCisJc3RydWN0IGNvbW1pdF9saXN0ICogbGlzdF9pdGVtOworCit9OworCitjb25zdCBjaGFyICpjb21taXRfdHlwZSA9ICJjb21taXQiOworCitzdHJ1Y3QgY210X2ZtdF9tYXAgeworCWNvbnN0IGNoYXIgKm47CisJc2l6ZV90IGNtcF9sZW47CisJZW51bSBjbWl0X2ZtdCB2OworfSBjbXRfZm10c1tdID0geworCXsgInJhdyIsCTEsCUNNSVRfRk1UX1JBVyB9LAorCXsgIm1lZGl1bSIsCTEsCUNNSVRfRk1UX01FRElVTSB9LAorCXsgInNob3J0IiwJMSwJQ01JVF9GTVRfU0hPUlQgfSwKKwl7ICJlbWFpbCIsCTEsCUNNSVRfRk1UX0VNQUlMIH0sCisJeyAiZnVsbCIsCTUsCUNNSVRfRk1UX0ZVTEwgfSwKKwl7ICJmdWxsZXIiLAk1LAlDTUlUX0ZNVF9GVUxMRVIgfSwKKwl7ICJvbmVsaW5lIiwJMSwJQ01JVF9GTVRfT05FTElORSB9LAorfTsKKworZW51bSBjbWl0X2ZtdCBnZXRfY29tbWl0X2Zvcm1hdChjb25zdCBjaGFyICphcmcpCit7CisJaW50IGk7CisKKwlpZiAoIWFyZyB8fCAhKmFyZykKKwkJcmV0dXJuIENNSVRfRk1UX0RFRkFVTFQ7CisJaWYgKCphcmcgPT0gJz0nKQorCQlhcmcrKzsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbXRfZm10cyk7IGkrKykgeworCQlpZiAoIXN0cm5jbXAoYXJnLCBjbXRfZm10c1tpXS5uLCBjbXRfZm10c1tpXS5jbXBfbGVuKSkKKwkJCXJldHVybiBjbXRfZm10c1tpXS52OworCX0KKworCWRpZSgiaW52YWxpZCAtLXByZXR0eSBmb3JtYXQ6ICVzIiwgYXJnKTsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXQgKmNoZWNrX2NvbW1pdChzdHJ1Y3Qgb2JqZWN0ICpvYmosCisJCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkgICBpbnQgcXVpZXQpCit7CisJaWYgKG9iai0+dHlwZSAhPSBPQkpfQ09NTUlUKSB7CisJCWlmICghcXVpZXQpCisJCQllcnJvcigiT2JqZWN0ICVzIGlzIGEgJXMsIG5vdCBhIGNvbW1pdCIsCisJCQkgICAgICBzaGExX3RvX2hleChzaGExKSwgdHlwZW5hbWUob2JqLT50eXBlKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHN0cnVjdCBjb21taXQgKikgb2JqOworfQorCitzdHJ1Y3QgY29tbWl0ICpsb29rdXBfY29tbWl0X3JlZmVyZW5jZV9nZW50bHkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkJICAgICAgaW50IHF1aWV0KQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qoc2hhMSksIE5VTEwsIDApOworCisJaWYgKCFvYmopCisJCXJldHVybiBOVUxMOworCXJldHVybiBjaGVja19jb21taXQob2JqLCBzaGExLCBxdWlldCk7Cit9CisKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJcmV0dXJuIGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAwKTsKK30KKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJc3RydWN0IGNvbW1pdCAqcmV0ID0gYWxsb2NfY29tbWl0X25vZGUoKTsKKwkJY3JlYXRlZF9vYmplY3Qoc2hhMSwgJnJldC0+b2JqZWN0KTsKKwkJcmV0LT5vYmplY3QudHlwZSA9IE9CSl9DT01NSVQ7CisJCXJldHVybiByZXQ7CisJfQorCWlmICghb2JqLT50eXBlKQorCQlvYmotPnR5cGUgPSBPQkpfQ09NTUlUOworCXJldHVybiBjaGVja19jb21taXQob2JqLCBzaGExLCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFyc2VfY29tbWl0X2RhdGUoY29uc3QgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgZGF0ZTsKKworCWlmIChtZW1jbXAoYnVmLCAiYXV0aG9yIiwgNikpCisJCXJldHVybiAwOworCXdoaWxlICgqYnVmKysgIT0gJ1xuJykKKwkJLyogbmFkYSAqLzsKKwlpZiAobWVtY21wKGJ1ZiwgImNvbW1pdHRlciIsIDkpKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoKmJ1ZisrICE9ICc+JykKKwkJLyogbmFkYSAqLzsKKwlkYXRlID0gc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpZiAoZGF0ZSA9PSBVTE9OR19NQVgpCisJCWRhdGUgPSAwOworCXJldHVybiBkYXRlOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9ncmFmdCAqKmNvbW1pdF9ncmFmdDsKK3N0YXRpYyBpbnQgY29tbWl0X2dyYWZ0X2FsbG9jLCBjb21taXRfZ3JhZnRfbnI7CisKK3N0YXRpYyBpbnQgY29tbWl0X2dyYWZ0X3Bvcyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBsbywgaGk7CisJbG8gPSAwOworCWhpID0gY29tbWl0X2dyYWZ0X25yOworCXdoaWxlIChsbyA8IGhpKSB7CisJCWludCBtaSA9IChsbyArIGhpKSAvIDI7CisJCXN0cnVjdCBjb21taXRfZ3JhZnQgKmdyYWZ0ID0gY29tbWl0X2dyYWZ0W21pXTsKKwkJaW50IGNtcCA9IG1lbWNtcChzaGExLCBncmFmdC0+c2hhMSwgMjApOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBtaTsKKwkJaWYgKGNtcCA8IDApCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pICsgMTsKKwl9CisJcmV0dXJuIC1sbyAtIDE7Cit9CisKK2ludCByZWdpc3Rlcl9jb21taXRfZ3JhZnQoc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQsIGludCBpZ25vcmVfZHVwcykKK3sKKwlpbnQgcG9zID0gY29tbWl0X2dyYWZ0X3BvcyhncmFmdC0+c2hhMSk7CisJCisJaWYgKDAgPD0gcG9zKSB7CisJCWlmIChpZ25vcmVfZHVwcykKKwkJCWZyZWUoZ3JhZnQpOworCQllbHNlIHsKKwkJCWZyZWUoY29tbWl0X2dyYWZ0W3Bvc10pOworCQkJY29tbWl0X2dyYWZ0W3Bvc10gPSBncmFmdDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJcG9zID0gLXBvcyAtIDE7CisJaWYgKGNvbW1pdF9ncmFmdF9hbGxvYyA8PSArK2NvbW1pdF9ncmFmdF9ucikgeworCQljb21taXRfZ3JhZnRfYWxsb2MgPSBhbGxvY19ucihjb21taXRfZ3JhZnRfYWxsb2MpOworCQljb21taXRfZ3JhZnQgPSB4cmVhbGxvYyhjb21taXRfZ3JhZnQsCisJCQkJCXNpemVvZigqY29tbWl0X2dyYWZ0KSAqCisJCQkJCWNvbW1pdF9ncmFmdF9hbGxvYyk7CisJfQorCWlmIChwb3MgPCBjb21taXRfZ3JhZnRfbnIpCisJCW1lbW1vdmUoY29tbWl0X2dyYWZ0ICsgcG9zICsgMSwKKwkJCWNvbW1pdF9ncmFmdCArIHBvcywKKwkJCShjb21taXRfZ3JhZnRfbnIgLSBwb3MgLSAxKSAqCisJCQlzaXplb2YoKmNvbW1pdF9ncmFmdCkpOworCWNvbW1pdF9ncmFmdFtwb3NdID0gZ3JhZnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgKnJlYWRfZ3JhZnRfbGluZShjaGFyICpidWYsIGludCBsZW4pCit7CisJLyogVGhlIGZvcm1hdCBpcyBqdXN0ICJDb21taXQgUGFyZW50MSBQYXJlbnQyIC4uLlxuIiAqLworCWludCBpOworCXN0cnVjdCBjb21taXRfZ3JhZnQgKmdyYWZ0ID0gTlVMTDsKKworCWlmIChidWZbbGVuLTFdID09ICdcbicpCisJCWJ1ZlstLWxlbl0gPSAwOworCWlmIChidWZbMF0gPT0gJyMnIHx8IGJ1ZlswXSA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGxlbiArIDEpICUgNDEpIHsKKwliYWRfZ3JhZnRfZGF0YToKKwkJZXJyb3IoImJhZCBncmFmdCBkYXRhOiAlcyIsIGJ1Zik7CisJCWZyZWUoZ3JhZnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaSA9IChsZW4gKyAxKSAvIDQxIC0gMTsKKwlncmFmdCA9IHhtYWxsb2Moc2l6ZW9mKCpncmFmdCkgKyAyMCAqIGkpOworCWdyYWZ0LT5ucl9wYXJlbnQgPSBpOworCWlmIChnZXRfc2hhMV9oZXgoYnVmLCBncmFmdC0+c2hhMSkpCisJCWdvdG8gYmFkX2dyYWZ0X2RhdGE7CisJZm9yIChpID0gNDA7IGkgPCBsZW47IGkgKz0gNDEpIHsKKwkJaWYgKGJ1ZltpXSAhPSAnICcpCisJCQlnb3RvIGJhZF9ncmFmdF9kYXRhOworCQlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZiArIGkgKyAxLCBncmFmdC0+cGFyZW50W2kvNDFdKSkKKwkJCWdvdG8gYmFkX2dyYWZ0X2RhdGE7CisJfQorCXJldHVybiBncmFmdDsKK30KKworaW50IHJlYWRfZ3JhZnRfZmlsZShjb25zdCBjaGFyICpncmFmdF9maWxlKQoreworCUZJTEUgKmZwID0gZm9wZW4oZ3JhZnRfZmlsZSwgInIiKTsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQkvKiBUaGUgZm9ybWF0IGlzIGp1c3QgIkNvbW1pdCBQYXJlbnQxIFBhcmVudDIgLi4uXG4iICovCisJCWludCBsZW4gPSBzdHJsZW4oYnVmKTsKKwkJc3RydWN0IGNvbW1pdF9ncmFmdCAqZ3JhZnQgPSByZWFkX2dyYWZ0X2xpbmUoYnVmLCBsZW4pOworCQlpZiAoIWdyYWZ0KQorCQkJY29udGludWU7CisJCWlmIChyZWdpc3Rlcl9jb21taXRfZ3JhZnQoZ3JhZnQsIDEpKQorCQkJZXJyb3IoImR1cGxpY2F0ZSBncmFmdCBkYXRhOiAlcyIsIGJ1Zik7CisJfQorCWZjbG9zZShmcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfY29tbWl0X2dyYWZ0KHZvaWQpCit7CisJc3RhdGljIGludCBjb21taXRfZ3JhZnRfcHJlcGFyZWQ7CisJY2hhciAqZ3JhZnRfZmlsZTsKKworCWlmIChjb21taXRfZ3JhZnRfcHJlcGFyZWQpCisJCXJldHVybjsKKwlncmFmdF9maWxlID0gZ2V0X2dyYWZ0X2ZpbGUoKTsKKwlyZWFkX2dyYWZ0X2ZpbGUoZ3JhZnRfZmlsZSk7CisJY29tbWl0X2dyYWZ0X3ByZXBhcmVkID0gMTsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXRfZ3JhZnQgKmxvb2t1cF9jb21taXRfZ3JhZnQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcG9zOworCXByZXBhcmVfY29tbWl0X2dyYWZ0KCk7CisJcG9zID0gY29tbWl0X2dyYWZ0X3BvcyhzaGExKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNvbW1pdF9ncmFmdFtwb3NdOworfQorCitpbnQgcGFyc2VfY29tbWl0X2J1ZmZlcihzdHJ1Y3QgY29tbWl0ICppdGVtLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwljaGFyICp0YWlsID0gYnVmZmVyOworCWNoYXIgKmJ1ZnB0ciA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyIHBhcmVudFsyMF07CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHB0cjsKKwlzdHJ1Y3QgY29tbWl0X2dyYWZ0ICpncmFmdDsKKwl1bnNpZ25lZCBuX3JlZnMgPSAwOworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCXRhaWwgKz0gc2l6ZTsKKwlpZiAodGFpbCA8PSBidWZwdHIgKyA1IHx8IG1lbWNtcChidWZwdHIsICJ0cmVlICIsIDUpKQorCQlyZXR1cm4gZXJyb3IoImJvZ3VzIGNvbW1pdCBvYmplY3QgJXMiLCBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCWlmICh0YWlsIDw9IGJ1ZnB0ciArIDQ1IHx8IGdldF9zaGExX2hleChidWZwdHIgKyA1LCBwYXJlbnQpIDwgMCkKKwkJcmV0dXJuIGVycm9yKCJiYWQgdHJlZSBwb2ludGVyIGluIGNvbW1pdCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaXRlbS0+dHJlZSA9IGxvb2t1cF90cmVlKHBhcmVudCk7CisJaWYgKGl0ZW0tPnRyZWUpCisJCW5fcmVmcysrOworCWJ1ZnB0ciArPSA0NjsgLyogInRyZWUgIiArICJoZXggc2hhMSIgKyAiXG4iICovCisJcHB0ciA9ICZpdGVtLT5wYXJlbnRzOworCisJZ3JhZnQgPSBsb29rdXBfY29tbWl0X2dyYWZ0KGl0ZW0tPm9iamVjdC5zaGExKTsKKwl3aGlsZSAoYnVmcHRyICsgNDggPCB0YWlsICYmICFtZW1jbXAoYnVmcHRyLCAicGFyZW50ICIsIDcpKSB7CisJCXN0cnVjdCBjb21taXQgKm5ld19wYXJlbnQ7CisKKwkJaWYgKHRhaWwgPD0gYnVmcHRyICsgNDggfHwKKwkJICAgIGdldF9zaGExX2hleChidWZwdHIgKyA3LCBwYXJlbnQpIHx8CisJCSAgICBidWZwdHJbNDddICE9ICdcbicpCisJCQlyZXR1cm4gZXJyb3IoImJhZCBwYXJlbnRzIGluIGNvbW1pdCAlcyIsIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJCWJ1ZnB0ciArPSA0ODsKKwkJaWYgKGdyYWZ0KQorCQkJY29udGludWU7CisJCW5ld19wYXJlbnQgPSBsb29rdXBfY29tbWl0KHBhcmVudCk7CisJCWlmIChuZXdfcGFyZW50KSB7CisJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChuZXdfcGFyZW50LCBwcHRyKS0+bmV4dDsKKwkJCW5fcmVmcysrOworCQl9CisJfQorCWlmIChncmFmdCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGNvbW1pdCAqbmV3X3BhcmVudDsKKwkJZm9yIChpID0gMDsgaSA8IGdyYWZ0LT5ucl9wYXJlbnQ7IGkrKykgeworCQkJbmV3X3BhcmVudCA9IGxvb2t1cF9jb21taXQoZ3JhZnQtPnBhcmVudFtpXSk7CisJCQlpZiAoIW5ld19wYXJlbnQpCisJCQkJY29udGludWU7CisJCQlwcHRyID0gJmNvbW1pdF9saXN0X2luc2VydChuZXdfcGFyZW50LCBwcHRyKS0+bmV4dDsKKwkJCW5fcmVmcysrOworCQl9CisJfQorCWl0ZW0tPmRhdGUgPSBwYXJzZV9jb21taXRfZGF0ZShidWZwdHIpOworCisJaWYgKHRyYWNrX29iamVjdF9yZWZzKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnA7CisJCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyA9IGFsbG9jX29iamVjdF9yZWZzKG5fcmVmcyk7CisJCWlmIChpdGVtLT50cmVlKQorCQkJcmVmcy0+cmVmW2krK10gPSAmaXRlbS0+dHJlZS0+b2JqZWN0OworCQlmb3IgKHAgPSBpdGVtLT5wYXJlbnRzOyBwOyBwID0gcC0+bmV4dCkKKwkJCXJlZnMtPnJlZltpKytdID0gJnAtPml0ZW0tPm9iamVjdDsKKwkJc2V0X29iamVjdF9yZWZzKCZpdGVtLT5vYmplY3QsIHJlZnMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfY29tbWl0KHN0cnVjdCBjb21taXQgKml0ZW0pCit7CisJY2hhciB0eXBlWzIwXTsKKwl2b2lkICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQ7CisKKwlpZiAoaXRlbS0+b2JqZWN0LnBhcnNlZCkKKwkJcmV0dXJuIDA7CisJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoaXRlbS0+b2JqZWN0LnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaWYgKHN0cmNtcCh0eXBlLCBjb21taXRfdHlwZSkpIHsKKwkJZnJlZShidWZmZXIpOworCQlyZXR1cm4gZXJyb3IoIk9iamVjdCAlcyBub3QgYSBjb21taXQiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCX0KKwlyZXQgPSBwYXJzZV9jb21taXRfYnVmZmVyKGl0ZW0sIGJ1ZmZlciwgc2l6ZSk7CisJaWYgKHNhdmVfY29tbWl0X2J1ZmZlciAmJiAhcmV0KSB7CisJCWl0ZW0tPmJ1ZmZlciA9IGJ1ZmZlcjsKKwkJcmV0dXJuIDA7CisJfQorCWZyZWUoYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdF9saXN0X2luc2VydChzdHJ1Y3QgY29tbWl0ICppdGVtLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0X3ApCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpuZXdfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21taXRfbGlzdCkpOworCW5ld19saXN0LT5pdGVtID0gaXRlbTsKKwluZXdfbGlzdC0+bmV4dCA9ICpsaXN0X3A7CisJKmxpc3RfcCA9IG5ld19saXN0OworCXJldHVybiBuZXdfbGlzdDsKK30KKwordm9pZCBmcmVlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnRlbXAgPSBsaXN0OworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0cnVjdCBjb21taXRfbGlzdCAqIGluc2VydF9ieV9kYXRlKHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcHAgPSBsaXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwl3aGlsZSAoKHAgPSAqcHApICE9IE5VTEwpIHsKKwkJaWYgKHAtPml0ZW0tPmRhdGUgPCBpdGVtLT5kYXRlKSB7CisJCQlicmVhazsKKwkJfQorCQlwcCA9ICZwLT5uZXh0OworCX0KKwlyZXR1cm4gY29tbWl0X2xpc3RfaW5zZXJ0KGl0ZW0sIHBwKTsKK30KKworCQordm9pZCBzb3J0X2J5X2RhdGUoc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnJldCA9IE5VTEw7CisJd2hpbGUgKCpsaXN0KSB7CisJCWluc2VydF9ieV9kYXRlKCgqbGlzdCktPml0ZW0sICZyZXQpOworCQkqbGlzdCA9ICgqbGlzdCktPm5leHQ7CisJfQorCSpsaXN0ID0gcmV0OworfQorCitzdHJ1Y3QgY29tbWl0ICpwb3BfbW9zdF9yZWNlbnRfY29tbWl0KHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG1hcmspCit7CisJc3RydWN0IGNvbW1pdCAqcmV0ID0gKCpsaXN0KS0+aXRlbTsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHMgPSByZXQtPnBhcmVudHM7CisJc3RydWN0IGNvbW1pdF9saXN0ICpvbGQgPSAqbGlzdDsKKworCSpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKwlmcmVlKG9sZCk7CisKKwl3aGlsZSAocGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBwYXJlbnRzLT5pdGVtOworCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBtYXJrKSkgeworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gbWFyazsKKwkJCWluc2VydF9ieV9kYXRlKGNvbW1pdCwgbGlzdCk7CisJCX0KKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgY2xlYXJfY29tbWl0X21hcmtzKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgdW5zaWduZWQgaW50IG1hcmspCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJY29tbWl0LT5vYmplY3QuZmxhZ3MgJj0gfm1hcms7CisJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAocGFyZW50cykgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCisJCS8qIEhhdmUgd2UgYWxyZWFkeSBjbGVhcmVkIHRoaXM/ICovCisJCWlmIChtYXJrICYgcGFyZW50LT5vYmplY3QuZmxhZ3MpCisJCQljbGVhcl9jb21taXRfbWFya3MocGFyZW50LCBtYXJrKTsKKwkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQ7CisJfQorfQorCisvKgorICogR2VuZXJpYyBzdXBwb3J0IGZvciBwcmV0dHktcHJpbnRpbmcgdGhlIGhlYWRlcgorICovCitzdGF0aWMgaW50IGdldF9vbmVfbGluZShjb25zdCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCByZXQgPSAwOworCisJd2hpbGUgKGxlbi0tKSB7CisJCWNoYXIgYyA9ICptc2crKzsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisJCXJldCsrOworCQlpZiAoYyA9PSAnXG4nKQorCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfcmZjMjA0N19zcGVjaWFsKGNoYXIgY2gpCit7CisJcmV0dXJuICgoY2ggJiAweDgwKSB8fCAoY2ggPT0gJz0nKSB8fCAoY2ggPT0gJz8nKSB8fCAoY2ggPT0gJ18nKSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JmYzIwNDcoY2hhciAqYnVmLCBjb25zdCBjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWNoYXIgKmJwID0gYnVmOworCWludCBpLCBuZWVkcXVvdGU7CisJc3RhdGljIGNvbnN0IGNoYXIgcV91dGY4W10gPSAiPT91dGYtOD9xPyI7CisKKwlmb3IgKGkgPSBuZWVkcXVvdGUgPSAwOyAhbmVlZHF1b3RlICYmIGkgPCBsZW47IGkrKykgeworCQl1bnNpZ25lZCBjaCA9IGxpbmVbaV07CisJCWlmIChjaCAmIDB4ODApCisJCQluZWVkcXVvdGUrKzsKKwkJaWYgKChpICsgMSA8IGxlbikgJiYKKwkJICAgIChjaCA9PSAnPScgJiYgbGluZVtpKzFdID09ICc/JykpCisJCQluZWVkcXVvdGUrKzsKKwl9CisJaWYgKCFuZWVkcXVvdGUpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUuKnMiLCBsZW4sIGxpbmUpOworCisJbWVtY3B5KGJwLCBxX3V0ZjgsIHNpemVvZihxX3V0ZjgpLTEpOworCWJwICs9IHNpemVvZihxX3V0ZjgpLTE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoID0gbGluZVtpXSAmIDB4RkY7CisJCWlmIChpc19yZmMyMDQ3X3NwZWNpYWwoY2gpKSB7CisJCQlzcHJpbnRmKGJwLCAiPSUwMlgiLCBjaCk7CisJCQlicCArPSAzOworCQl9CisJCWVsc2UgaWYgKGNoID09ICcgJykKKwkJCSpicCsrID0gJ18nOworCQllbHNlCisJCQkqYnArKyA9IGNoOworCX0KKwltZW1jcHkoYnAsICI/PSIsIDIpOworCWJwICs9IDI7CisJcmV0dXJuIGJwIC0gYnVmOworfQorCitzdGF0aWMgaW50IGFkZF91c2VyX2luZm8oY29uc3QgY2hhciAqd2hhdCwgZW51bSBjbWl0X2ZtdCBmbXQsIGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqbGluZSkKK3sKKwljaGFyICpkYXRlOworCWludCBuYW1lbGVuOworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwlpbnQgdHosIHJldDsKKwljb25zdCBjaGFyICpmaWxsZXIgPSAiICAgICI7CisKKwlpZiAoZm10ID09IENNSVRfRk1UX09ORUxJTkUpCisJCXJldHVybiAwOworCWRhdGUgPSBzdHJjaHIobGluZSwgJz4nKTsKKwlpZiAoIWRhdGUpCisJCXJldHVybiAwOworCW5hbWVsZW4gPSArK2RhdGUgLSBsaW5lOworCXRpbWUgPSBzdHJ0b3VsKGRhdGUsICZkYXRlLCAxMCk7CisJdHogPSBzdHJ0b2woZGF0ZSwgTlVMTCwgMTApOworCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCkgeworCQljaGFyICpuYW1lX3RhaWwgPSBzdHJjaHIobGluZSwgJzwnKTsKKwkJaW50IGRpc3BsYXlfbmFtZV9sZW5ndGg7CisJCWlmICghbmFtZV90YWlsKQorCQkJcmV0dXJuIDA7CisJCXdoaWxlIChsaW5lIDwgbmFtZV90YWlsICYmIGlzc3BhY2UobmFtZV90YWlsWy0xXSkpCisJCQluYW1lX3RhaWwtLTsKKwkJZGlzcGxheV9uYW1lX2xlbmd0aCA9IG5hbWVfdGFpbCAtIGxpbmU7CisJCWZpbGxlciA9ICIiOworCQlzdHJjcHkoYnVmLCAiRnJvbTogIik7CisJCXJldCA9IHN0cmxlbihidWYpOworCQlyZXQgKz0gYWRkX3JmYzIwNDcoYnVmICsgcmV0LCBsaW5lLCBkaXNwbGF5X25hbWVfbGVuZ3RoKTsKKwkJbWVtY3B5KGJ1ZiArIHJldCwgbmFtZV90YWlsLCBuYW1lbGVuIC0gZGlzcGxheV9uYW1lX2xlbmd0aCk7CisJCXJldCArPSBuYW1lbGVuIC0gZGlzcGxheV9uYW1lX2xlbmd0aDsKKwkJYnVmW3JldCsrXSA9ICdcbic7CisJfQorCWVsc2UgeworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzOiAlLipzJS4qc1xuIiwgd2hhdCwKKwkJCSAgICAgIChmbXQgPT0gQ01JVF9GTVRfRlVMTEVSKSA/IDQgOiAwLAorCQkJICAgICAgZmlsbGVyLCBuYW1lbGVuLCBsaW5lKTsKKwl9CisJc3dpdGNoIChmbXQpIHsKKwljYXNlIENNSVRfRk1UX01FRElVTToKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiRGF0ZTogICAlc1xuIiwgc2hvd19kYXRlKHRpbWUsIHR6KSk7CisJCWJyZWFrOworCWNhc2UgQ01JVF9GTVRfRU1BSUw6CisJCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkRhdGU6ICVzXG4iLAorCQkJICAgICAgIHNob3dfcmZjMjgyMl9kYXRlKHRpbWUsIHR6KSk7CisJCWJyZWFrOworCWNhc2UgQ01JVF9GTVRfRlVMTEVSOgorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICIlc0RhdGU6ICVzXG4iLCB3aGF0LCBzaG93X2RhdGUodGltZSwgdHopKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm90aW4nICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzX2VtcHR5X2xpbmUoY29uc3QgY2hhciAqbGluZSwgaW50ICpsZW5fcCkKK3sKKwlpbnQgbGVuID0gKmxlbl9wOworCXdoaWxlIChsZW4gJiYgaXNzcGFjZShsaW5lW2xlbi0xXSkpCisJCWxlbi0tOworCSpsZW5fcCA9IGxlbjsKKwlyZXR1cm4gIWxlbjsKK30KKworc3RhdGljIGludCBhZGRfbWVyZ2VfaW5mbyhlbnVtIGNtaXRfZm10IGZtdCwgY2hhciAqYnVmLCBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsIGludCBhYmJyZXYpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnQgPSBjb21taXQtPnBhcmVudHM7CisJaW50IG9mZnNldDsKKworCWlmICgoZm10ID09IENNSVRfRk1UX09ORUxJTkUpIHx8IChmbXQgPT0gQ01JVF9GTVRfRU1BSUwpIHx8CisJICAgICFwYXJlbnQgfHwgIXBhcmVudC0+bmV4dCkKKwkJcmV0dXJuIDA7CisKKwlvZmZzZXQgPSBzcHJpbnRmKGJ1ZiwgIk1lcmdlOiIpOworCisJd2hpbGUgKHBhcmVudCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQljb25zdCBjaGFyICpoZXggPSBhYmJyZXYKKwkJCT8gZmluZF91bmlxdWVfYWJicmV2KHAtPm9iamVjdC5zaGExLCBhYmJyZXYpCisJCQk6IHNoYTFfdG9faGV4KHAtPm9iamVjdC5zaGExKTsKKwkJY29uc3QgY2hhciAqZG90cyA9IChhYmJyZXYgJiYgc3RybGVuKGhleCkgIT0gNDApID8gIi4uLiIgOiAiIjsKKwkJcGFyZW50ID0gcGFyZW50LT5uZXh0OworCisJCW9mZnNldCArPSBzcHJpbnRmKGJ1ZiArIG9mZnNldCwgIiAlcyVzIiwgaGV4LCBkb3RzKTsKKwl9CisJYnVmW29mZnNldCsrXSA9ICdcbic7CisJcmV0dXJuIG9mZnNldDsKK30KKwordW5zaWduZWQgbG9uZyBwcmV0dHlfcHJpbnRfY29tbWl0KGVudW0gY21pdF9mbXQgZm10LCBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHVuc2lnbmVkIGxvbmcgbGVuLCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc3BhY2UsIGludCBhYmJyZXYsIGNvbnN0IGNoYXIgKnN1YmplY3QsIGNvbnN0IGNoYXIgKmFmdGVyX3N1YmplY3QpCit7CisJaW50IGhkciA9IDEsIGJvZHkgPSAwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwlpbnQgaW5kZW50ID0gNDsKKwlpbnQgcGFyZW50c19zaG93biA9IDA7CisJY29uc3QgY2hhciAqbXNnID0gY29tbWl0LT5idWZmZXI7CisJaW50IHBsYWluX25vbl9hc2NpaSA9IDA7CisKKwlpZiAoZm10ID09IENNSVRfRk1UX09ORUxJTkUgfHwgZm10ID09IENNSVRfRk1UX0VNQUlMKQorCQlpbmRlbnQgPSAwOworCisJLyogQWZ0ZXItc3ViamVjdCBpcyB1c2VkIHRvIHBhc3MgaW4gQ29udGVudC1UeXBlOiBtdWx0aXBhcnQKKwkgKiBNSU1FIGhlYWRlcjsgaW4gdGhhdCBjYXNlIHdlIGRvIG5vdCBoYXZlIHRvIGRvIHRoZQorCSAqIHBsYWludGV4dCBjb250ZW50IHR5cGUgZXZlbiBpZiB0aGUgY29tbWl0IG1lc3NhZ2UgaGFzCisJICogbm9uIDctYml0IEFTQ0lJIGNoYXJhY3Rlci4gIE90aGVyd2lzZSwgY2hlY2sgaWYgd2UgbmVlZAorCSAqIHRvIHNheSB0aGlzIGlzIG5vdCBhIDctYml0IEFTQ0lJLgorCSAqLworCWlmIChmbXQgPT0gQ01JVF9GTVRfRU1BSUwgJiYgIWFmdGVyX3N1YmplY3QpIHsKKwkJaW50IGksIGNoLCBpbl9ib2R5OworCisJCWZvciAoaW5fYm9keSA9IGkgPSAwOyAoY2ggPSBtc2dbaV0pICYmIGkgPCBsZW47IGkrKykgeworCQkJaWYgKCFpbl9ib2R5KSB7CisJCQkJLyogYXV0aG9yIGNvdWxkIGJlIG5vbiA3LWJpdCBBU0NJSSBidXQKKwkJCQkgKiB0aGUgbG9nIG1heSBzbzsgc2tpcCBvdmVyIHRoZQorCQkJCSAqIGhlYWRlciBwYXJ0IGZpcnN0LgorCQkJCSAqLworCQkJCWlmIChjaCA9PSAnXG4nICYmCisJCQkJICAgIGkgKyAxIDwgbGVuICYmIG1zZ1tpKzFdID09ICdcbicpCisJCQkJCWluX2JvZHkgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoY2ggJiAweDgwKSB7CisJCQkJcGxhaW5fbm9uX2FzY2lpID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqbGluZSA9IG1zZzsKKwkJaW50IGxpbmVsZW4gPSBnZXRfb25lX2xpbmUobXNnLCBsZW4pOworCisJCWlmICghbGluZWxlbikKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdlIHdhbnQgc29tZSBzbG9wIGZvciBpbmRlbnRhdGlvbiBhbmQgYSBwb3NzaWJsZQorCQkgKiBmaW5hbCAiLi4uIi4gVGh1cyB0aGUgIisgMjAiLgorCQkgKi8KKwkJaWYgKG9mZnNldCArIGxpbmVsZW4gKyAyMCA+IHNwYWNlKSB7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCAiICAgIC4uLlxuIiwgOCk7CisJCQlvZmZzZXQgKz0gODsKKwkJCWJyZWFrOworCQl9CisKKwkJbXNnICs9IGxpbmVsZW47CisJCWxlbiAtPSBsaW5lbGVuOworCQlpZiAoaGRyKSB7CisJCQlpZiAobGluZWxlbiA9PSAxKSB7CisJCQkJaGRyID0gMDsKKwkJCQlpZiAoKGZtdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKSAmJiAhc3ViamVjdCkKKwkJCQkJYnVmW29mZnNldCsrXSA9ICdcbic7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZm10ID09IENNSVRfRk1UX1JBVykgeworCQkJCW1lbWNweShidWYgKyBvZmZzZXQsIGxpbmUsIGxpbmVsZW4pOworCQkJCW9mZnNldCArPSBsaW5lbGVuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFtZW1jbXAobGluZSwgInBhcmVudCAiLCA3KSkgeworCQkJCWlmIChsaW5lbGVuICE9IDQ4KQorCQkJCQlkaWUoImJhZCBwYXJlbnQgbGluZSBpbiBjb21taXQiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFwYXJlbnRzX3Nob3duKSB7CisJCQkJb2Zmc2V0ICs9IGFkZF9tZXJnZV9pbmZvKGZtdCwgYnVmICsgb2Zmc2V0LAorCQkJCQkJCSBjb21taXQsIGFiYnJldik7CisJCQkJcGFyZW50c19zaG93biA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogTUVESVVNID09IERFRkFVTFQgc2hvd3Mgb25seSBhdXRob3Igd2l0aCBkYXRlcy4KKwkJCSAqIEZVTEwgc2hvd3MgYm90aCBhdXRob3JzIGJ1dCBub3QgZGF0ZXMuCisJCQkgKiBGVUxMRVIgc2hvd3MgYm90aCBhdXRob3JzIGFuZCBkYXRlcy4KKwkJCSAqLworCQkJaWYgKCFtZW1jbXAobGluZSwgImF1dGhvciAiLCA3KSkKKwkJCQlvZmZzZXQgKz0gYWRkX3VzZXJfaW5mbygiQXV0aG9yIiwgZm10LAorCQkJCQkJCWJ1ZiArIG9mZnNldCwKKwkJCQkJCQlsaW5lICsgNyk7CisJCQlpZiAoIW1lbWNtcChsaW5lLCAiY29tbWl0dGVyICIsIDEwKSAmJgorCQkJICAgIChmbXQgPT0gQ01JVF9GTVRfRlVMTCB8fCBmbXQgPT0gQ01JVF9GTVRfRlVMTEVSKSkKKwkJCQlvZmZzZXQgKz0gYWRkX3VzZXJfaW5mbygiQ29tbWl0IiwgZm10LAorCQkJCQkJCWJ1ZiArIG9mZnNldCwKKwkJCQkJCQlsaW5lICsgMTApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN1YmplY3QpCisJCQlib2R5ID0gMTsKKworCQlpZiAoaXNfZW1wdHlfbGluZShsaW5lLCAmbGluZWxlbikpIHsKKwkJCWlmICghYm9keSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdWJqZWN0KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZtdCA9PSBDTUlUX0ZNVF9TSE9SVCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChzdWJqZWN0KSB7CisJCQlpbnQgc2xlbiA9IHN0cmxlbihzdWJqZWN0KTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQsIHN1YmplY3QsIHNsZW4pOworCQkJb2Zmc2V0ICs9IHNsZW47CisJCQlvZmZzZXQgKz0gYWRkX3JmYzIwNDcoYnVmICsgb2Zmc2V0LCBsaW5lLCBsaW5lbGVuKTsKKwkJfQorCQllbHNlIHsKKwkJCW1lbXNldChidWYgKyBvZmZzZXQsICcgJywgaW5kZW50KTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQgKyBpbmRlbnQsIGxpbmUsIGxpbmVsZW4pOworCQkJb2Zmc2V0ICs9IGxpbmVsZW4gKyBpbmRlbnQ7CisJCX0KKwkJYnVmW29mZnNldCsrXSA9ICdcbic7CisJCWlmIChmbXQgPT0gQ01JVF9GTVRfT05FTElORSkKKwkJCWJyZWFrOworCQlpZiAoc3ViamVjdCAmJiBwbGFpbl9ub25fYXNjaWkpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGhlYWRlcltdID0KKwkJCQkiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XG4iCisJCQkJIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiI7CisJCQltZW1jcHkoYnVmICsgb2Zmc2V0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpLTEpOworCQkJb2Zmc2V0ICs9IHNpemVvZihoZWFkZXIpLTE7CisJCX0KKwkJaWYgKGFmdGVyX3N1YmplY3QpIHsKKwkJCWludCBzbGVuID0gc3RybGVuKGFmdGVyX3N1YmplY3QpOworCQkJaWYgKHNsZW4gPiBzcGFjZSAtIG9mZnNldCAtIDEpCisJCQkJc2xlbiA9IHNwYWNlIC0gb2Zmc2V0IC0gMTsKKwkJCW1lbWNweShidWYgKyBvZmZzZXQsIGFmdGVyX3N1YmplY3QsIHNsZW4pOworCQkJb2Zmc2V0ICs9IHNsZW47CisJCQlhZnRlcl9zdWJqZWN0ID0gTlVMTDsKKwkJfQorCQlzdWJqZWN0ID0gTlVMTDsKKwl9CisJd2hpbGUgKG9mZnNldCAmJiBpc3NwYWNlKGJ1ZltvZmZzZXQtMV0pKQorCQlvZmZzZXQtLTsKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgYW4gRU9MTiBmb3IgdGhlIG5vbi1vbmVsaW5lIGNhc2UgKi8KKwlpZiAoZm10ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCWJ1ZltvZmZzZXQrK10gPSAnXG4nOworCS8qCisJICogbWFrZSBzdXJlIHRoZXJlIGlzIGFub3RoZXIgRU9MTiB0byBzZXBhcmF0ZSB0aGUgaGVhZGVycyBmcm9tIHdoYXRldmVyCisJICogYm9keSB0aGUgY2FsbGVyIGFwcGVuZHMgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHdyaXR0ZW4gYSBib2R5CisJICovCisJaWYgKGZtdCA9PSBDTUlUX0ZNVF9FTUFJTCAmJiAhYm9keSkKKwkJYnVmW29mZnNldCsrXSA9ICdcbic7CisJYnVmW29mZnNldF0gPSAnXDAnOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0cnVjdCBjb21taXQgKnBvcF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqc3RhY2spCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICp0b3AgPSAqc3RhY2s7CisJc3RydWN0IGNvbW1pdCAqaXRlbSA9IHRvcCA/IHRvcC0+aXRlbSA6IE5VTEw7CisKKwlpZiAodG9wKSB7CisJCSpzdGFjayA9IHRvcC0+bmV4dDsKKwkJZnJlZSh0b3ApOworCX0KKwlyZXR1cm4gaXRlbTsKK30KKworaW50IGNvdW50X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqIGNvbW1pdCkKK3sKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgc3RydWN0IGNvbW1pdF9saXN0ICogcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKyAgICAgICAgZm9yIChjb3VudD0wO3BhcmVudHM7IHBhcmVudHM9cGFyZW50cy0+bmV4dCxjb3VudCsrKQorICAgICAgICAgIDsKKyAgICAgICAgcmV0dXJuIGNvdW50OworfQorCit2b2lkIHRvcG9fc29ydF9kZWZhdWx0X3NldHRlcihzdHJ1Y3QgY29tbWl0ICpjLCB2b2lkICpkYXRhKQoreworCWMtPnV0aWwgPSBkYXRhOworfQorCit2b2lkICp0b3BvX3NvcnRfZGVmYXVsdF9nZXR0ZXIoc3RydWN0IGNvbW1pdCAqYykKK3sKKwlyZXR1cm4gYy0+dXRpbDsKK30KKworLyoKKyAqIFBlcmZvcm1zIGFuIGluLXBsYWNlIHRvcG9sb2dpY2FsIHNvcnQgb24gdGhlIGxpc3Qgc3VwcGxpZWQuCisgKi8KK3ZvaWQgc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcihzdHJ1Y3QgY29tbWl0X2xpc3QgKiogbGlzdCwgaW50IGxpZm8pCit7CisJc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbihsaXN0LCBsaWZvLCB0b3BvX3NvcnRfZGVmYXVsdF9zZXR0ZXIsCisJCQkJICAgICB0b3BvX3NvcnRfZGVmYXVsdF9nZXR0ZXIpOworfQorCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXJfZm4oc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvLAorCQkJCSAgdG9wb19zb3J0X3NldF9mbl90IHNldHRlciwKKwkJCQkgIHRvcG9fc29ydF9nZXRfZm5fdCBnZXR0ZXIpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICogbmV4dCA9ICpsaXN0OworCXN0cnVjdCBjb21taXRfbGlzdCAqIHdvcmsgPSBOVUxMLCAqKmluc2VydDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKiogcHB0ciA9IGxpc3Q7CisJc3RydWN0IHNvcnRfbm9kZSAqIG5vZGVzOworCXN0cnVjdCBzb3J0X25vZGUgKiBuZXh0X25vZGVzOworCWludCBjb3VudCA9IDA7CisKKwkvKiBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGxpc3QgKi8KKwl3aGlsZSAobmV4dCkgeworCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJY291bnQrKzsKKwl9CisJCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuOworCS8qIGFsbG9jYXRlIGFuIGFycmF5IHRvIGhlbHAgc29ydCB0aGUgbGlzdCAqLworCW5vZGVzID0geGNhbGxvYyhjb3VudCwgc2l6ZW9mKCpub2RlcykpOworCS8qIGxpbmsgdGhlIGxpc3QgdG8gdGhlIGFycmF5ICovCisJbmV4dF9ub2RlcyA9IG5vZGVzOworCW5leHQ9Kmxpc3Q7CisJd2hpbGUgKG5leHQpIHsKKwkJbmV4dF9ub2Rlcy0+bGlzdF9pdGVtID0gbmV4dDsKKwkJc2V0dGVyKG5leHQtPml0ZW0sIG5leHRfbm9kZXMpOworCQluZXh0X25vZGVzKys7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKwkvKiB1cGRhdGUgdGhlIGluZGVncmVlICovCisJbmV4dD0qbGlzdDsKKwl3aGlsZSAobmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKiBwYXJlbnRzID0gbmV4dC0+aXRlbS0+cGFyZW50czsKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCXN0cnVjdCBjb21taXQgKiBwYXJlbnQ9cGFyZW50cy0+aXRlbTsKKwkJCXN0cnVjdCBzb3J0X25vZGUgKiBwbiA9IChzdHJ1Y3Qgc29ydF9ub2RlICopIGdldHRlcihwYXJlbnQpOworCisJCQlpZiAocG4pCisJCQkJcG4tPmluZGVncmVlKys7CisJCQlwYXJlbnRzPXBhcmVudHMtPm5leHQ7CisJCX0KKwkJbmV4dD1uZXh0LT5uZXh0OworCX0KKwkvKiAKKyAgICAgICAgICogZmluZCB0aGUgdGlwcworICAgICAgICAgKgorICAgICAgICAgKiB0aXBzIGFyZSBub2RlcyBub3QgcmVhY2hhYmxlIGZyb20gYW55IG90aGVyIG5vZGUgaW4gdGhlIGxpc3QgCisgICAgICAgICAqIAorICAgICAgICAgKiB0aGUgdGlwcyBzZXJ2ZSBhcyBhIHN0YXJ0aW5nIHNldCBmb3IgdGhlIHdvcmsgcXVldWUuCisgICAgICAgICAqLworCW5leHQ9Kmxpc3Q7CisJaW5zZXJ0ID0gJndvcms7CisJd2hpbGUgKG5leHQpIHsKKwkJc3RydWN0IHNvcnRfbm9kZSAqIG5vZGUgPSAoc3RydWN0IHNvcnRfbm9kZSAqKSBnZXR0ZXIobmV4dC0+aXRlbSk7CisKKwkJaWYgKG5vZGUtPmluZGVncmVlID09IDApIHsKKwkJCWluc2VydCA9ICZjb21taXRfbGlzdF9pbnNlcnQobmV4dC0+aXRlbSwgaW5zZXJ0KS0+bmV4dDsKKwkJfQorCQluZXh0PW5leHQtPm5leHQ7CisJfQorCisJLyogcHJvY2VzcyB0aGUgbGlzdCBpbiB0b3BvbG9naWNhbCBvcmRlciAqLworCWlmICghbGlmbykKKwkJc29ydF9ieV9kYXRlKCZ3b3JrKTsKKwl3aGlsZSAod29yaykgeworCQlzdHJ1Y3QgY29tbWl0ICogd29ya19pdGVtID0gcG9wX2NvbW1pdCgmd29yayk7CisJCXN0cnVjdCBzb3J0X25vZGUgKiB3b3JrX25vZGUgPSAoc3RydWN0IHNvcnRfbm9kZSAqKSBnZXR0ZXIod29ya19pdGVtKTsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICogcGFyZW50cyA9IHdvcmtfaXRlbS0+cGFyZW50czsKKworCQl3aGlsZSAocGFyZW50cykgeworCQkJc3RydWN0IGNvbW1pdCAqIHBhcmVudD1wYXJlbnRzLT5pdGVtOworCQkJc3RydWN0IHNvcnRfbm9kZSAqIHBuID0gKHN0cnVjdCBzb3J0X25vZGUgKikgZ2V0dGVyKHBhcmVudCk7CisKKwkJCWlmIChwbikgeworCQkJCS8qCisJCQkJICogcGFyZW50cyBhcmUgb25seSBlbnF1ZXVlZCBmb3IgZW1pc3Npb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZW4gYWxsIHRoZWlyIGNoaWxkcmVuIGhhdmUgYmVlbiBlbWl0dGVkIHRoZXJlYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ3VhcmFudGVlaW5nIHRvcG9sb2dpY2FsIG9yZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCQlwbi0+aW5kZWdyZWUtLTsKKwkJCQlpZiAoIXBuLT5pbmRlZ3JlZSkgeworCQkJCQlpZiAoIWxpZm8pCisJCQkJCQlpbnNlcnRfYnlfZGF0ZShwYXJlbnQsICZ3b3JrKTsKKwkJCQkJZWxzZQorCQkJCQkJY29tbWl0X2xpc3RfaW5zZXJ0KHBhcmVudCwgJndvcmspOworCQkJCX0KKwkJCX0KKwkJCXBhcmVudHM9cGFyZW50cy0+bmV4dDsKKwkJfQorCQkvKgorICAgICAgICAgICAgICAgICAqIHdvcmtfaXRlbSBpcyBhIGNvbW1pdCBhbGwgb2Ygd2hvc2UgY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgKiBoYXZlIGFscmVhZHkgYmVlbiBlbWl0dGVkLiB3ZSBjYW4gZW1pdCBpdCBub3cuCisgICAgICAgICAgICAgICAgICovCisJCSpwcHRyID0gd29ya19ub2RlLT5saXN0X2l0ZW07CisJCXBwdHIgPSAmKCpwcHRyKS0+bmV4dDsKKwkJKnBwdHIgPSBOVUxMOworCQlzZXR0ZXIod29ya19pdGVtLCBOVUxMKTsKKwl9CisJZnJlZShub2Rlcyk7Cit9CisKKy8qIG1lcmdlLXJlYmFzZSBzdHVmZiAqLworCisvKiBiaXRzICMwLi43IGluIHJldmlzaW9uLmggKi8KKyNkZWZpbmUgUEFSRU5UMQkJKDF1PDwgOCkKKyNkZWZpbmUgUEFSRU5UMgkJKDF1PDwgOSkKKyNkZWZpbmUgU1RBTEUJCSgxdTw8MTApCisjZGVmaW5lIFJFU1VMVAkJKDF1PDwxMSkKKworc3RhdGljIHN0cnVjdCBjb21taXQgKmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgU1RBTEUpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIGNvbW1pdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tbWl0X2xpc3QgKm1lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKm9uZSwgc3RydWN0IGNvbW1pdCAqdHdvKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQgPSBOVUxMOworCisJaWYgKG9uZSA9PSB0d28pCisJCS8qIFdlIGRvIG5vdCBtYXJrIHRoaXMgZXZlbiB3aXRoIFJFU1VMVCBzbyB3ZSBkbyBub3QKKwkJICogaGF2ZSB0byBjbGVhbiBpdCB1cC4KKwkJICovCisJCXJldHVybiBjb21taXRfbGlzdF9pbnNlcnQob25lLCAmcmVzdWx0KTsKKworCXBhcnNlX2NvbW1pdChvbmUpOworCXBhcnNlX2NvbW1pdCh0d28pOworCisJb25lLT5vYmplY3QuZmxhZ3MgfD0gUEFSRU5UMTsKKwl0d28tPm9iamVjdC5mbGFncyB8PSBQQVJFTlQyOworCWluc2VydF9ieV9kYXRlKG9uZSwgJmxpc3QpOworCWluc2VydF9ieV9kYXRlKHR3bywgJmxpc3QpOworCisJd2hpbGUgKGludGVyZXN0aW5nKGxpc3QpKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKm47CisJCWludCBmbGFnczsKKworCQljb21taXQgPSBsaXN0LT5pdGVtOworCQluID0gbGlzdC0+bmV4dDsKKwkJZnJlZShsaXN0KTsKKwkJbGlzdCA9IG47CisKKwkJZmxhZ3MgPSBjb21taXQtPm9iamVjdC5mbGFncyAmIChQQVJFTlQxIHwgUEFSRU5UMiB8IFNUQUxFKTsKKwkJaWYgKGZsYWdzID09IChQQVJFTlQxIHwgUEFSRU5UMikpIHsKKwkJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgUkVTVUxUKSkgeworCQkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFJFU1VMVDsKKwkJCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZyZXN1bHQpOworCQkJfQorCQkJLyogTWFyayBwYXJlbnRzIG9mIGEgZm91bmQgbWVyZ2Ugc3RhbGUgKi8KKwkJCWZsYWdzIHw9IFNUQUxFOworCQl9CisJCXBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCXdoaWxlIChwYXJlbnRzKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50cy0+aXRlbTsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQkJaWYgKChwLT5vYmplY3QuZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3MpCisJCQkJY29udGludWU7CisJCQlwYXJzZV9jb21taXQocCk7CisJCQlwLT5vYmplY3QuZmxhZ3MgfD0gZmxhZ3M7CisJCQlpbnNlcnRfYnlfZGF0ZShwLCAmbGlzdCk7CisJCX0KKwl9CisKKwkvKiBDbGVhbiB1cCB0aGUgcmVzdWx0IHRvIHJlbW92ZSBzdGFsZSBvbmVzICovCisJbGlzdCA9IHJlc3VsdDsgcmVzdWx0ID0gTlVMTDsKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKm4gPSBsaXN0LT5uZXh0OworCQlpZiAoIShsaXN0LT5pdGVtLT5vYmplY3QuZmxhZ3MgJiBTVEFMRSkpCisJCQlpbnNlcnRfYnlfZGF0ZShsaXN0LT5pdGVtLCAmcmVzdWx0KTsKKwkJZnJlZShsaXN0KTsKKwkJbGlzdCA9IG47CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCBjb21taXRfbGlzdCAqZ2V0X21lcmdlX2Jhc2VzKHN0cnVjdCBjb21taXQgKm9uZSwKKwkJCQkgICAgc3RydWN0IGNvbW1pdCAqdHdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsZWFudXApCit7CisJY29uc3QgdW5zaWduZWQgYWxsX2ZsYWdzID0gKFBBUkVOVDEgfCBQQVJFTlQyIHwgU1RBTEUgfCBSRVNVTFQpOworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdDsKKwlzdHJ1Y3QgY29tbWl0ICoqcnNsdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnJlc3VsdDsKKwlpbnQgY250LCBpLCBqOworCisJcmVzdWx0ID0gbWVyZ2VfYmFzZXMob25lLCB0d28pOworCWlmIChvbmUgPT0gdHdvKQorCQlyZXR1cm4gcmVzdWx0OworCWlmICghcmVzdWx0IHx8ICFyZXN1bHQtPm5leHQpIHsKKwkJaWYgKGNsZWFudXApIHsKKwkJCWNsZWFyX2NvbW1pdF9tYXJrcyhvbmUsIGFsbF9mbGFncyk7CisJCQljbGVhcl9jb21taXRfbWFya3ModHdvLCBhbGxfZmxhZ3MpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyogVGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgKi8KKwljbnQgPSAwOworCWxpc3QgPSByZXN1bHQ7CisJd2hpbGUgKGxpc3QpIHsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWNudCsrOworCX0KKwlyc2x0ID0geGNhbGxvYyhjbnQsIHNpemVvZigqcnNsdCkpOworCWZvciAobGlzdCA9IHJlc3VsdCwgaSA9IDA7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KQorCQlyc2x0W2krK10gPSBsaXN0LT5pdGVtOworCWZyZWVfY29tbWl0X2xpc3QocmVzdWx0KTsKKworCWNsZWFyX2NvbW1pdF9tYXJrcyhvbmUsIGFsbF9mbGFncyk7CisJY2xlYXJfY29tbWl0X21hcmtzKHR3bywgYWxsX2ZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY250IC0gMTsgaSsrKSB7CisJCWZvciAoaiA9IGkrMTsgaiA8IGNudDsgaisrKSB7CisJCQlpZiAoIXJzbHRbaV0gfHwgIXJzbHRbal0pCisJCQkJY29udGludWU7CisJCQlyZXN1bHQgPSBtZXJnZV9iYXNlcyhyc2x0W2ldLCByc2x0W2pdKTsKKwkJCWNsZWFyX2NvbW1pdF9tYXJrcyhyc2x0W2ldLCBhbGxfZmxhZ3MpOworCQkJY2xlYXJfY29tbWl0X21hcmtzKHJzbHRbal0sIGFsbF9mbGFncyk7CisJCQlmb3IgKGxpc3QgPSByZXN1bHQ7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCQkJaWYgKHJzbHRbaV0gPT0gbGlzdC0+aXRlbSkKKwkJCQkJcnNsdFtpXSA9IE5VTEw7CisJCQkJaWYgKHJzbHRbal0gPT0gbGlzdC0+aXRlbSkKKwkJCQkJcnNsdFtqXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBTdXJ2aXZpbmcgb25lcyBpbiByc2x0W10gYXJlIHRoZSBpbmRlcGVuZGVudCByZXN1bHRzICovCisJcmVzdWx0ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJaWYgKHJzbHRbaV0pCisJCQlpbnNlcnRfYnlfZGF0ZShyc2x0W2ldLCAmcmVzdWx0KTsKKwl9CisJZnJlZShyc2x0KTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvY29tbWl0LmggYi9jb21taXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzllZDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29tbWl0LmgKQEAgLTAsMCArMSwxMTAgQEAKKyNpZm5kZWYgQ09NTUlUX0gKKyNkZWZpbmUgQ09NTUlUX0gKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworc3RydWN0IGNvbW1pdF9saXN0IHsKKwlzdHJ1Y3QgY29tbWl0ICppdGVtOworCXN0cnVjdCBjb21taXRfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBjb21taXQgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworCXZvaWQgKnV0aWw7CisJdW5zaWduZWQgbG9uZyBkYXRlOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwlzdHJ1Y3QgdHJlZSAqdHJlZTsKKwljaGFyICpidWZmZXI7Cit9OworCitleHRlcm4gaW50IHNhdmVfY29tbWl0X2J1ZmZlcjsKK2V4dGVybiBjb25zdCBjaGFyICpjb21taXRfdHlwZTsKKworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK3N0cnVjdCBjb21taXQgKmxvb2t1cF9jb21taXRfcmVmZXJlbmNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworc3RydWN0IGNvbW1pdCAqbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJCSAgICAgIGludCBxdWlldCk7CisKK2ludCBwYXJzZV9jb21taXRfYnVmZmVyKHN0cnVjdCBjb21taXQgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKKworaW50IHBhcnNlX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICppdGVtKTsKKworc3RydWN0IGNvbW1pdF9saXN0ICogY29tbWl0X2xpc3RfaW5zZXJ0KHN0cnVjdCBjb21taXQgKml0ZW0sIHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3RfcCk7CitzdHJ1Y3QgY29tbWl0X2xpc3QgKiBpbnNlcnRfYnlfZGF0ZShzdHJ1Y3QgY29tbWl0ICppdGVtLCBzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0KTsKKwordm9pZCBmcmVlX2NvbW1pdF9saXN0KHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCk7CisKK3ZvaWQgc29ydF9ieV9kYXRlKHN0cnVjdCBjb21taXRfbGlzdCAqKmxpc3QpOworCisvKiBDb21taXQgZm9ybWF0cyAqLworZW51bSBjbWl0X2ZtdCB7CisJQ01JVF9GTVRfUkFXLAorCUNNSVRfRk1UX01FRElVTSwKKwlDTUlUX0ZNVF9ERUZBVUxUID0gQ01JVF9GTVRfTUVESVVNLAorCUNNSVRfRk1UX1NIT1JULAorCUNNSVRfRk1UX0ZVTEwsCisJQ01JVF9GTVRfRlVMTEVSLAorCUNNSVRfRk1UX09ORUxJTkUsCisJQ01JVF9GTVRfRU1BSUwsCisKKwlDTUlUX0ZNVF9VTlNQRUNJRklFRCwKK307CisKK2V4dGVybiBlbnVtIGNtaXRfZm10IGdldF9jb21taXRfZm9ybWF0KGNvbnN0IGNoYXIgKmFyZyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwcmV0dHlfcHJpbnRfY29tbWl0KGVudW0gY21pdF9mbXQgZm10LCBjb25zdCBzdHJ1Y3QgY29tbWl0ICosIHVuc2lnbmVkIGxvbmcgbGVuLCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgc3BhY2UsIGludCBhYmJyZXYsIGNvbnN0IGNoYXIgKnN1YmplY3QsIGNvbnN0IGNoYXIgKmFmdGVyX3N1YmplY3QpOworCisvKiogUmVtb3ZlcyB0aGUgZmlyc3QgY29tbWl0IGZyb20gYSBsaXN0IHNvcnRlZCBieSBkYXRlLCBhbmQgYWRkcyBhbGwKKyAqIG9mIGl0cyBwYXJlbnRzLgorICoqLworc3RydWN0IGNvbW1pdCAqcG9wX21vc3RfcmVjZW50X2NvbW1pdChzdHJ1Y3QgY29tbWl0X2xpc3QgKipsaXN0LCAKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFyayk7CisKK3N0cnVjdCBjb21taXQgKnBvcF9jb21taXQoc3RydWN0IGNvbW1pdF9saXN0ICoqc3RhY2spOworCit2b2lkIGNsZWFyX2NvbW1pdF9tYXJrcyhzdHJ1Y3QgY29tbWl0ICpjb21taXQsIHVuc2lnbmVkIGludCBtYXJrKTsKKworaW50IGNvdW50X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqIGNvbW1pdCk7CisKKy8qCisgKiBQZXJmb3JtcyBhbiBpbi1wbGFjZSB0b3BvbG9naWNhbCBzb3J0IG9mIGxpc3Qgc3VwcGxpZWQuCisgKgorICogUHJlLWNvbmRpdGlvbnMgZm9yIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXI6CisgKiAgIGFsbCBjb21taXRzIGluIGlucHV0IGxpc3QgYW5kIGFsbCBwYXJlbnRzIG9mIHRob3NlCisgKiAgIGNvbW1pdHMgbXVzdCBoYXZlIG9iamVjdC51dGlsID09IE5VTEwKKyAqCisgKiBQcmUtY29uZGl0aW9ucyBmb3Igc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbjoKKyAqICAgYWxsIGNvbW1pdHMgaW4gaW5wdXQgbGlzdCBhbmQgYWxsIHBhcmVudHMgb2YgdGhvc2UKKyAqICAgY29tbWl0cyBtdXN0IGhhdmUgZ2V0dGVyKGNvbW1pdCkgPT0gTlVMTAorICoKKyAqIFBvc3QtY29uZGl0aW9uczoKKyAqICAgaW52YXJpYW50IG9mIHJlc3VsdGluZyBsaXN0IGlzOgorICogICAgICBhIHJlYWNoYWJsZSBmcm9tIGIgPT4gb3JkKGIpIDwgb3JkKGEpCisgKiAgIGluIGFkZGl0aW9uLCB3aGVuIGxpZm8gPT0gMCwgY29tbWl0cyBvbiBwYXJhbGxlbCB0cmFja3MgYXJlCisgKiAgIHNvcnRlZCBpbiB0aGUgZGF0ZXMgb3JkZXIuCisgKi8KKwordHlwZWRlZiB2b2lkICgqdG9wb19zb3J0X3NldF9mbl90KShzdHJ1Y3QgY29tbWl0Kiwgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQqICgqdG9wb19zb3J0X2dldF9mbl90KShzdHJ1Y3QgY29tbWl0Kik7CisKK3ZvaWQgdG9wb19zb3J0X2RlZmF1bHRfc2V0dGVyKHN0cnVjdCBjb21taXQgKmMsIHZvaWQgKmRhdGEpOwordm9pZCAqdG9wb19zb3J0X2RlZmF1bHRfZ2V0dGVyKHN0cnVjdCBjb21taXQgKmMpOworCit2b2lkIHNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXIoc3RydWN0IGNvbW1pdF9saXN0ICoqIGxpc3QsIGludCBsaWZvKTsKK3ZvaWQgc29ydF9pbl90b3BvbG9naWNhbF9vcmRlcl9mbihzdHJ1Y3QgY29tbWl0X2xpc3QgKiogbGlzdCwgaW50IGxpZm8sCisJCQkJICB0b3BvX3NvcnRfc2V0X2ZuX3Qgc2V0dGVyLAorCQkJCSAgdG9wb19zb3J0X2dldF9mbl90IGdldHRlcik7CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IG5yX3BhcmVudDsKKwl1bnNpZ25lZCBjaGFyIHBhcmVudFtGTEVYX0FSUkFZXVsyMF07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBjb21taXRfZ3JhZnQgKnJlYWRfZ3JhZnRfbGluZShjaGFyICpidWYsIGludCBsZW4pOworaW50IHJlZ2lzdGVyX2NvbW1pdF9ncmFmdChzdHJ1Y3QgY29tbWl0X2dyYWZ0ICosIGludCk7CitpbnQgcmVhZF9ncmFmdF9maWxlKGNvbnN0IGNoYXIgKmdyYWZ0X2ZpbGUpOworCitleHRlcm4gc3RydWN0IGNvbW1pdF9saXN0ICpnZXRfbWVyZ2VfYmFzZXMoc3RydWN0IGNvbW1pdCAqcmV2MSwgc3RydWN0IGNvbW1pdCAqcmV2MiwgaW50IGNsZWFudXApOworCisjZW5kaWYgLyogQ09NTUlUX0ggKi8KZGlmZiAtLWdpdCBhL2NvbXBhdC9pbmV0X250b3AuYyBiL2NvbXBhdC9pbmV0X250b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzhjMWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L2luZXRfbnRvcC5jCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk2LTE5OTkgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bS4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElOVEVSTkVUIFNPRlRXQVJFIENPTlNPUlRJVU0gRElTQ0xBSU1TCisgKiBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIElOVEVSTkVUIFNPRlRXQVJFCisgKiBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgorICogUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyAqIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUworICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBOU19JTkFERFJTWgorI2RlZmluZSBOU19JTkFERFJTWgk0CisjZW5kaWYKKyNpZm5kZWYgTlNfSU42QUREUlNaCisjZGVmaW5lIE5TX0lONkFERFJTWgkxNgorI2VuZGlmCisjaWZuZGVmIE5TX0lOVDE2U1oKKyNkZWZpbmUgTlNfSU5UMTZTWgkyCisjZW5kaWYKKworLyoKKyAqIFdBUk5JTkc6IERvbid0IGV2ZW4gY29uc2lkZXIgdHJ5aW5nIHRvIGNvbXBpbGUgdGhpcyBvbiBhIHN5c3RlbSB3aGVyZQorICogc2l6ZW9mKGludCkgPCA0LiAgc2l6ZW9mKGludCkgPiA0IGlzIGZpbmU7IGFsbCB0aGUgd29ybGQncyBub3QgYSBWQVguCisgKi8KKworLyogY29uc3QgY2hhciAqCisgKiBpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKQorICoJZm9ybWF0IGFuIElQdjQgYWRkcmVzcworICogcmV0dXJuOgorICoJYGRzdCcgKGFzIGEgY29uc3QpCisgKiBub3RlczoKKyAqCSgxKSB1c2VzIG5vIHN0YXRpY3MKKyAqCSgyKSB0YWtlcyBhIHVfY2hhciogbm90IGFuIGluX2FkZHIgYXMgaW5wdXQKKyAqIGF1dGhvcjoKKyAqCVBhdWwgVml4aWUsIDE5OTYuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK2luZXRfbnRvcDQoc3JjLCBkc3QsIHNpemUpCisJY29uc3QgdV9jaGFyICpzcmM7CisJY2hhciAqZHN0OworCXNpemVfdCBzaXplOworeworCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIiV1LiV1LiV1LiV1IjsKKwljaGFyIHRtcFtzaXplb2YgIjI1NS4yNTUuMjU1LjI1NSJdOworCWludCBucHJpbnRlZDsKKworCW5wcmludGVkID0gc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgZm10LCBzcmNbMF0sIHNyY1sxXSwgc3JjWzJdLCBzcmNbM10pOworCWlmIChucHJpbnRlZCA8IDApCisJCXJldHVybiAoTlVMTCk7CS8qIHdlIGFzc3VtZSAiZXJybm8iIHdhcyBzZXQgYnkgInNucHJpbnRmKCkiICovCisJaWYgKChzaXplX3QpbnByaW50ZWQgPiBzaXplKSB7CisJCWVycm5vID0gRU5PU1BDOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlzdHJjcHkoZHN0LCB0bXApOworCXJldHVybiAoZHN0KTsKK30KKworI2lmbmRlZiBOT19JUFY2CisvKiBjb25zdCBjaGFyICoKKyAqIGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpCisgKgljb252ZXJ0IElQdjYgYmluYXJ5IGFkZHJlc3MgaW50byBwcmVzZW50YXRpb24gKHByaW50YWJsZSkgZm9ybWF0CisgKiBhdXRob3I6CisgKglQYXVsIFZpeGllLCAxOTk2LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitpbmV0X250b3A2KHNyYywgZHN0LCBzaXplKQorCWNvbnN0IHVfY2hhciAqc3JjOworCWNoYXIgKmRzdDsKKwlzaXplX3Qgc2l6ZTsKK3sKKwkvKgorCSAqIE5vdGUgdGhhdCBpbnQzMl90IGFuZCBpbnQxNl90IG5lZWQgb25seSBiZSAiYXQgbGVhc3QiIGxhcmdlIGVub3VnaAorCSAqIHRvIGNvbnRhaW4gYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHNpemUuICBPbiBzb21lIHN5c3RlbXMsIGxpa2UKKwkgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KKwkgKiBLZWVwIHRoaXMgaW4gbWluZCBpZiB5b3UgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNvZGVkCisJICogdG8gdXNlIHBvaW50ZXIgb3ZlcmxheXMuICBBbGwgdGhlIHdvcmxkJ3Mgbm90IGEgVkFYLgorCSAqLworCWNoYXIgdG1wW3NpemVvZiAiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1Il0sICp0cDsKKwlzdHJ1Y3QgeyBpbnQgYmFzZSwgbGVuOyB9IGJlc3QsIGN1cjsKKwl1X2ludCB3b3Jkc1tOU19JTjZBRERSU1ogLyBOU19JTlQxNlNaXTsKKwlpbnQgaTsKKworCS8qCisJICogUHJlcHJvY2VzczoKKwkgKglDb3B5IHRoZSBpbnB1dCAoYnl0ZXdpc2UpIGFycmF5IGludG8gYSB3b3Jkd2lzZSBhcnJheS4KKwkgKglGaW5kIHRoZSBsb25nZXN0IHJ1biBvZiAweDAwJ3MgaW4gc3JjW10gZm9yIDo6IHNob3J0aGFuZGluZy4KKwkgKi8KKwltZW1zZXQod29yZHMsICdcMCcsIHNpemVvZiB3b3Jkcyk7CisJZm9yIChpID0gMDsgaSA8IE5TX0lONkFERFJTWjsgaSsrKQorCQl3b3Jkc1tpIC8gMl0gfD0gKHNyY1tpXSA8PCAoKDEgLSAoaSAlIDIpKSA8PCAzKSk7CisJYmVzdC5iYXNlID0gLTE7CisJY3VyLmJhc2UgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgKE5TX0lONkFERFJTWiAvIE5TX0lOVDE2U1opOyBpKyspIHsKKwkJaWYgKHdvcmRzW2ldID09IDApIHsKKwkJCWlmIChjdXIuYmFzZSA9PSAtMSkKKwkJCQljdXIuYmFzZSA9IGksIGN1ci5sZW4gPSAxOworCQkJZWxzZQorCQkJCWN1ci5sZW4rKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChjdXIuYmFzZSAhPSAtMSkgeworCQkJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQorCQkJCQliZXN0ID0gY3VyOworCQkJCWN1ci5iYXNlID0gLTE7CisJCQl9CisJCX0KKwl9CisJaWYgKGN1ci5iYXNlICE9IC0xKSB7CisJCWlmIChiZXN0LmJhc2UgPT0gLTEgfHwgY3VyLmxlbiA+IGJlc3QubGVuKQorCQkJYmVzdCA9IGN1cjsKKwl9CisJaWYgKGJlc3QuYmFzZSAhPSAtMSAmJiBiZXN0LmxlbiA8IDIpCisJCWJlc3QuYmFzZSA9IC0xOworCisJLyoKKwkgKiBGb3JtYXQgdGhlIHJlc3VsdC4KKwkgKi8KKwl0cCA9IHRtcDsKKwlmb3IgKGkgPSAwOyBpIDwgKE5TX0lONkFERFJTWiAvIE5TX0lOVDE2U1opOyBpKyspIHsKKwkJLyogQXJlIHdlIGluc2lkZSB0aGUgYmVzdCBydW4gb2YgMHgwMCdzPyAqLworCQlpZiAoYmVzdC5iYXNlICE9IC0xICYmIGkgPj0gYmVzdC5iYXNlICYmCisJCSAgICBpIDwgKGJlc3QuYmFzZSArIGJlc3QubGVuKSkgeworCQkJaWYgKGkgPT0gYmVzdC5iYXNlKQorCQkJCSp0cCsrID0gJzonOworCQkJY29udGludWU7CisJCX0KKwkJLyogQXJlIHdlIGZvbGxvd2luZyBhbiBpbml0aWFsIHJ1biBvZiAweDAwcyBvciBhbnkgcmVhbCBoZXg/ICovCisJCWlmIChpICE9IDApCisJCQkqdHArKyA9ICc6JzsKKwkJLyogSXMgdGhpcyBhZGRyZXNzIGFuIGVuY2Fwc3VsYXRlZCBJUHY0PyAqLworCQlpZiAoaSA9PSA2ICYmIGJlc3QuYmFzZSA9PSAwICYmCisJCSAgICAoYmVzdC5sZW4gPT0gNiB8fCAoYmVzdC5sZW4gPT0gNSAmJiB3b3Jkc1s1XSA9PSAweGZmZmYpKSkgeworCQkJaWYgKCFpbmV0X250b3A0KHNyYysxMiwgdHAsIHNpemVvZiB0bXAgLSAodHAgLSB0bXApKSkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQkJdHAgKz0gc3RybGVuKHRwKTsKKwkJCWJyZWFrOworCQl9CisJCXRwICs9IHNucHJpbnRmKHRwLCBzaXplb2YgdG1wIC0gKHRwIC0gdG1wKSwgIiV4Iiwgd29yZHNbaV0pOworCX0KKwkvKiBXYXMgaXQgYSB0cmFpbGluZyBydW4gb2YgMHgwMCdzPyAqLworCWlmIChiZXN0LmJhc2UgIT0gLTEgJiYgKGJlc3QuYmFzZSArIGJlc3QubGVuKSA9PQorCSAgICAoTlNfSU42QUREUlNaIC8gTlNfSU5UMTZTWikpCisJCSp0cCsrID0gJzonOworCSp0cCsrID0gJ1wwJzsKKworCS8qCisJICogQ2hlY2sgZm9yIG92ZXJmbG93LCBjb3B5LCBhbmQgd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoKHNpemVfdCkodHAgLSB0bXApID4gc2l6ZSkgeworCQllcnJubyA9IEVOT1NQQzsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJc3RyY3B5KGRzdCwgdG1wKTsKKwlyZXR1cm4gKGRzdCk7Cit9CisjZW5kaWYKKworLyogY2hhciAqCisgKiBpbmV0X250b3AoYWYsIHNyYywgZHN0LCBzaXplKQorICoJY29udmVydCBhIG5ldHdvcmsgZm9ybWF0IGFkZHJlc3MgdG8gcHJlc2VudGF0aW9uIGZvcm1hdC4KKyAqIHJldHVybjoKKyAqCXBvaW50ZXIgdG8gcHJlc2VudGF0aW9uIGZvcm1hdCBhZGRyZXNzIChgZHN0JyksIG9yIE5VTEwgKHNlZSBlcnJubykuCisgKiBhdXRob3I6CisgKglQYXVsIFZpeGllLCAxOTk2LgorICovCitjb25zdCBjaGFyICoKK2luZXRfbnRvcChhZiwgc3JjLCBkc3QsIHNpemUpCisJaW50IGFmOworCWNvbnN0IHZvaWQgKnNyYzsKKwljaGFyICpkc3Q7CisJc2l6ZV90IHNpemU7Cit7CisJc3dpdGNoIChhZikgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIChpbmV0X250b3A0KHNyYywgZHN0LCBzaXplKSk7CisjaWZuZGVmIE5PX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gKGluZXRfbnRvcDYoc3JjLCBkc3QsIHNpemUpKTsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWVycm5vID0gRUFGTk9TVVBQT1JUOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9jb21wYXQvbW1hcC5jIGIvY29tcGF0L21tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWNiMTIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L21tYXAuYwpAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIi4uL2dpdC1jb21wYXQtdXRpbC5oIgorCit2b2lkICpnaXRmYWtlbW1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCwgaW50IHByb3QgLCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KQoreworCWludCBuID0gMDsKKworCWlmIChzdGFydCAhPSBOVUxMIHx8ICEoZmxhZ3MgJiBNQVBfUFJJVkFURSkpCisJCWRpZSgiSW52YWxpZCB1c2FnZSBvZiBnaXRmYWtlbW1hcC4iKTsKKworCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gTUFQX0ZBSUxFRDsKKwl9CisKKwlzdGFydCA9IHhtYWxsb2MobGVuZ3RoKTsKKwlpZiAoc3RhcnQgPT0gTlVMTCkgeworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIE1BUF9GQUlMRUQ7CisJfQorCisJd2hpbGUgKG4gPCBsZW5ndGgpIHsKKwkJaW50IGNvdW50ID0gcmVhZChmZCwgc3RhcnQrbiwgbGVuZ3RoLW4pOworCisJCWlmIChjb3VudCA9PSAwKSB7CisJCQltZW1zZXQoc3RhcnQrbiwgMCwgbGVuZ3RoLW4pOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY291bnQgPCAwKSB7CisJCQlmcmVlKHN0YXJ0KTsKKwkJCWVycm5vID0gRUFDQ0VTOworCQkJcmV0dXJuIE1BUF9GQUlMRUQ7CisJCX0KKworCQluICs9IGNvdW50OworCX0KKworCXJldHVybiBzdGFydDsKK30KKworaW50IGdpdGZha2VtdW5tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgpCit7CisJZnJlZShzdGFydCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2NvbXBhdC9zZXRlbnYuYyBiL2NvbXBhdC9zZXRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q3Njc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3NldGVudi5jCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IGdpdHNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IHJlcGxhY2UpCit7CisJaW50IG91dDsKKwlzaXplX3QgbmFtZWxlbiwgdmFsdWVsZW47CisJY2hhciAqZW52c3RyOworCisJaWYgKCFuYW1lIHx8ICF2YWx1ZSkgcmV0dXJuIC0xOworCWlmICghcmVwbGFjZSkgeworCQljaGFyICpvbGR2YWwgPSBOVUxMOworCQlvbGR2YWwgPSBnZXRlbnYobmFtZSk7CisJCWlmIChvbGR2YWwpIHJldHVybiAwOworCX0KKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJdmFsdWVsZW4gPSBzdHJsZW4odmFsdWUpOworCWVudnN0ciA9IG1hbGxvYygobmFtZWxlbiArIHZhbHVlbGVuICsgMikpOworCWlmICghZW52c3RyKSByZXR1cm4gLTE7CisKKwltZW1jcHkoZW52c3RyLCBuYW1lLCBuYW1lbGVuKTsKKwllbnZzdHJbbmFtZWxlbl0gPSAnPSc7CisJbWVtY3B5KGVudnN0ciArIG5hbWVsZW4gKyAxLCB2YWx1ZSwgdmFsdWVsZW4pOworCWVudnN0cltuYW1lbGVuICsgdmFsdWVsZW4gKyAxXSA9IDA7CisKKwlvdXQgPSBwdXRlbnYoZW52c3RyKTsKKwkvKiBwdXRlbnYoMykgbWFrZXMgdGhlIGFyZ3VtZW50IHN0cmluZyBwYXJ0IG9mIHRoZSBlbnZpcm9ubWVudCwKKwkgKiBhbmQgY2hhbmdpbmcgdGhhdCBzdHJpbmcgbW9kaWZpZXMgdGhlIGVudmlyb25tZW50IC0tLSB3aGljaAorCSAqIG1lYW5zIHdlIGRvIG5vdCBvd24gdGhhdCBzdG9yYWdlIGFueW1vcmUuICBEbyBub3QgZnJlZQorCSAqIGVudnN0ci4KKwkgKi8KKworCXJldHVybiBvdXQ7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvc3RyY2FzZXN0ci5jIGIvY29tcGF0L3N0cmNhc2VzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg5NmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3N0cmNhc2VzdHIuYwpAQCAtMCwwICsxLDIyIEBACisjaW5jbHVkZSAiLi4vZ2l0LWNvbXBhdC11dGlsLmgiCisKK2NoYXIgKmdpdHN0cmNhc2VzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkKK3sKKwlpbnQgbmxlbiA9IHN0cmxlbihuZWVkbGUpOworCWludCBobGVuID0gc3RybGVuKGhheXN0YWNrKSAtIG5sZW4gKyAxOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGhsZW47IGkrKykgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IG5sZW47IGorKykgeworCQkJdW5zaWduZWQgY2hhciBjMSA9IGhheXN0YWNrW2kral07CisJCQl1bnNpZ25lZCBjaGFyIGMyID0gbmVlZGxlW2pdOworCQkJaWYgKHRvdXBwZXIoYzEpICE9IHRvdXBwZXIoYzIpKQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCQlyZXR1cm4gKGNoYXIgKikgaGF5c3RhY2sgKyBpOworCW5leHQ6CisJCTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9jb21wYXQvc3RybGNweS5jIGIvY29tcGF0L3N0cmxjcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY4NTZhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3N0cmxjcHkuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3NpemVfdCBnaXRzdHJsY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IHJldCA9IHN0cmxlbihzcmMpOworCisJaWYgKHNpemUpIHsKKwkJc2l6ZV90IGxlbiA9IChyZXQgPj0gc2l6ZSkgPyBzaXplIC0gMSA6IHJldDsKKwkJbWVtY3B5KGRlc3QsIHNyYywgbGVuKTsKKwkJZGVzdFtsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9zdWJwcm9jZXNzLnB5IGIvY29tcGF0L3N1YnByb2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3NGVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9zdWJwcm9jZXNzLnB5CkBAIC0wLDAgKzEsMTE0OSBAQAorIyBzdWJwcm9jZXNzIC0gU3VicHJvY2Vzc2VzIHdpdGggYWNjZXNzaWJsZSBJL08gc3RyZWFtcworIworIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1vZHVsZSwgc2VlIFBFUCAzMjQuCisjCisjIFRoaXMgbW9kdWxlIHNob3VsZCByZW1haW4gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjIsIHNlZSBQRVAgMjkxLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBieSBQZXRlciBBc3RyYW5kIDxhc3RyYW5kQGx5c2F0b3IubGl1LnNlPgorIworIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisjIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvMi40L2xpY2Vuc2UgZm9yIGxpY2Vuc2luZyBkZXRhaWxzLgorCityIiIic3VicHJvY2VzcyAtIFN1YnByb2Nlc3NlcyB3aXRoIGFjY2Vzc2libGUgSS9PIHN0cmVhbXMKKworVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBzcGF3biBwcm9jZXNzZXMsIGNvbm5lY3QgdG8gdGhlaXIKK2lucHV0L291dHB1dC9lcnJvciBwaXBlcywgYW5kIG9idGFpbiB0aGVpciByZXR1cm4gY29kZXMuICBUaGlzIG1vZHVsZQoraW50ZW5kcyB0byByZXBsYWNlIHNldmVyYWwgb3RoZXIsIG9sZGVyIG1vZHVsZXMgYW5kIGZ1bmN0aW9ucywgbGlrZToKKworb3Muc3lzdGVtCitvcy5zcGF3bioKK29zLnBvcGVuKgorcG9wZW4yLioKK2NvbW1hbmRzLioKKworSW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBzdWJwcm9jZXNzIG1vZHVsZSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZXNlCittb2R1bGVzIGFuZCBmdW5jdGlvbnMgY2FuIGJlIGZvdW5kIGJlbG93LgorCisKKworVXNpbmcgdGhlIHN1YnByb2Nlc3MgbW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgbW9kdWxlIGRlZmluZXMgb25lIGNsYXNzIGNhbGxlZCBQb3BlbjoKKworY2xhc3MgUG9wZW4oYXJncywgYnVmc2l6ZT0wLCBleGVjdXRhYmxlPU5vbmUsCisgICAgICAgICAgICBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsCisgICAgICAgICAgICBwcmVleGVjX2ZuPU5vbmUsIGNsb3NlX2Zkcz1GYWxzZSwgc2hlbGw9RmFsc2UsCisgICAgICAgICAgICBjd2Q9Tm9uZSwgZW52PU5vbmUsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSwKKyAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCk6CisKKworQXJndW1lbnRzIGFyZToKKworYXJncyBzaG91bGQgYmUgYSBzdHJpbmcsIG9yIGEgc2VxdWVuY2Ugb2YgcHJvZ3JhbSBhcmd1bWVudHMuICBUaGUKK3Byb2dyYW0gdG8gZXhlY3V0ZSBpcyBub3JtYWxseSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgYXJncyBzZXF1ZW5jZSBvcgorc3RyaW5nLCBidXQgY2FuIGJlIGV4cGxpY2l0bHkgc2V0IGJ5IHVzaW5nIHRoZSBleGVjdXRhYmxlIGFyZ3VtZW50LgorCitPbiBVTklYLCB3aXRoIHNoZWxsPUZhbHNlIChkZWZhdWx0KTogSW4gdGhpcyBjYXNlLCB0aGUgUG9wZW4gY2xhc3MKK3VzZXMgb3MuZXhlY3ZwKCkgdG8gZXhlY3V0ZSB0aGUgY2hpbGQgcHJvZ3JhbS4gIGFyZ3Mgc2hvdWxkIG5vcm1hbGx5CitiZSBhIHNlcXVlbmNlLiAgQSBzdHJpbmcgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2VxdWVuY2Ugd2l0aCB0aGUgc3RyaW5nCithcyB0aGUgb25seSBpdGVtICh0aGUgcHJvZ3JhbSB0byBleGVjdXRlKS4KKworT24gVU5JWCwgd2l0aCBzaGVsbD1UcnVlOiBJZiBhcmdzIGlzIGEgc3RyaW5nLCBpdCBzcGVjaWZpZXMgdGhlCitjb21tYW5kIHN0cmluZyB0byBleGVjdXRlIHRocm91Z2ggdGhlIHNoZWxsLiAgSWYgYXJncyBpcyBhIHNlcXVlbmNlLAordGhlIGZpcnN0IGl0ZW0gc3BlY2lmaWVzIHRoZSBjb21tYW5kIHN0cmluZywgYW5kIGFueSBhZGRpdGlvbmFsIGl0ZW1zCit3aWxsIGJlIHRyZWF0ZWQgYXMgYWRkaXRpb25hbCBzaGVsbCBhcmd1bWVudHMuCisKK09uIFdpbmRvd3M6IHRoZSBQb3BlbiBjbGFzcyB1c2VzIENyZWF0ZVByb2Nlc3MoKSB0byBleGVjdXRlIHRoZSBjaGlsZAorcHJvZ3JhbSwgd2hpY2ggb3BlcmF0ZXMgb24gc3RyaW5ncy4gIElmIGFyZ3MgaXMgYSBzZXF1ZW5jZSwgaXQgd2lsbCBiZQorY29udmVydGVkIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBsaXN0MmNtZGxpbmUgbWV0aG9kLiAgUGxlYXNlIG5vdGUgdGhhdAorbm90IGFsbCBNUyBXaW5kb3dzIGFwcGxpY2F0aW9ucyBpbnRlcnByZXQgdGhlIGNvbW1hbmQgbGluZSB0aGUgc2FtZQord2F5OiBUaGUgbGlzdDJjbWRsaW5lIGlzIGRlc2lnbmVkIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIHNhbWUKK3J1bGVzIGFzIHRoZSBNUyBDIHJ1bnRpbWUuCisKK2J1ZnNpemUsIGlmIGdpdmVuLCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudAordG8gdGhlIGJ1aWx0LWluIG9wZW4oKSBmdW5jdGlvbjogMCBtZWFucyB1bmJ1ZmZlcmVkLCAxIG1lYW5zIGxpbmUKK2J1ZmZlcmVkLCBhbnkgb3RoZXIgcG9zaXRpdmUgdmFsdWUgbWVhbnMgdXNlIGEgYnVmZmVyIG9mCisoYXBwcm94aW1hdGVseSkgdGhhdCBzaXplLiAgQSBuZWdhdGl2ZSBidWZzaXplIG1lYW5zIHRvIHVzZSB0aGUgc3lzdGVtCitkZWZhdWx0LCB3aGljaCB1c3VhbGx5IG1lYW5zIGZ1bGx5IGJ1ZmZlcmVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yCitidWZzaXplIGlzIDAgKHVuYnVmZmVyZWQpLgorCitzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgc3BlY2lmeSB0aGUgZXhlY3V0ZWQgcHJvZ3JhbXMnIHN0YW5kYXJkCitpbnB1dCwgc3RhbmRhcmQgb3V0cHV0IGFuZCBzdGFuZGFyZCBlcnJvciBmaWxlIGhhbmRsZXMsIHJlc3BlY3RpdmVseS4KK1ZhbGlkIHZhbHVlcyBhcmUgUElQRSwgYW4gZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yIChhIHBvc2l0aXZlCitpbnRlZ2VyKSwgYW4gZXhpc3RpbmcgZmlsZSBvYmplY3QsIGFuZCBOb25lLiAgUElQRSBpbmRpY2F0ZXMgdGhhdCBhCituZXcgcGlwZSB0byB0aGUgY2hpbGQgc2hvdWxkIGJlIGNyZWF0ZWQuICBXaXRoIE5vbmUsIG5vIHJlZGlyZWN0aW9uCit3aWxsIG9jY3VyOyB0aGUgY2hpbGQncyBmaWxlIGhhbmRsZXMgd2lsbCBiZSBpbmhlcml0ZWQgZnJvbSB0aGUKK3BhcmVudC4gIEFkZGl0aW9uYWxseSwgc3RkZXJyIGNhbiBiZSBTVERPVVQsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZQorc3RkZXJyIGRhdGEgZnJvbSB0aGUgYXBwbGljYXRpb25zIHNob3VsZCBiZSBjYXB0dXJlZCBpbnRvIHRoZSBzYW1lCitmaWxlIGhhbmRsZSBhcyBmb3Igc3Rkb3V0LgorCitJZiBwcmVleGVjX2ZuIGlzIHNldCB0byBhIGNhbGxhYmxlIG9iamVjdCwgdGhpcyBvYmplY3Qgd2lsbCBiZSBjYWxsZWQKK2luIHRoZSBjaGlsZCBwcm9jZXNzIGp1c3QgYmVmb3JlIHRoZSBjaGlsZCBpcyBleGVjdXRlZC4KKworSWYgY2xvc2VfZmRzIGlzIHRydWUsIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGV4Y2VwdCAwLCAxIGFuZCAyIHdpbGwgYmUKK2Nsb3NlZCBiZWZvcmUgdGhlIGNoaWxkIHByb2Nlc3MgaXMgZXhlY3V0ZWQuCisKK2lmIHNoZWxsIGlzIHRydWUsIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIHRocm91Z2ggdGhlCitzaGVsbC4KKworSWYgY3dkIGlzIG5vdCBOb25lLCB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkIHRvIGN3ZAorYmVmb3JlIHRoZSBjaGlsZCBpcyBleGVjdXRlZC4KKworSWYgZW52IGlzIG5vdCBOb25lLCBpdCBkZWZpbmVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBuZXcKK3Byb2Nlc3MuCisKK0lmIHVuaXZlcnNhbF9uZXdsaW5lcyBpcyB0cnVlLCB0aGUgZmlsZSBvYmplY3RzIHN0ZG91dCBhbmQgc3RkZXJyIGFyZQorb3BlbmVkIGFzIGEgdGV4dCBmaWxlcywgYnV0IGxpbmVzIG1heSBiZSB0ZXJtaW5hdGVkIGJ5IGFueSBvZiAnXG4nLAordGhlIFVuaXggZW5kLW9mLWxpbmUgY29udmVudGlvbiwgJ1xyJywgdGhlIE1hY2ludG9zaCBjb252ZW50aW9uIG9yCisnXHJcbicsIHRoZSBXaW5kb3dzIGNvbnZlbnRpb24uICBBbGwgb2YgdGhlc2UgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zCithcmUgc2VlbiBhcyAnXG4nIGJ5IHRoZSBQeXRob24gcHJvZ3JhbS4gIE5vdGU6IFRoaXMgZmVhdHVyZSBpcyBvbmx5CithdmFpbGFibGUgaWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGggdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCAodGhlCitkZWZhdWx0KS4gIEFsc28sIHRoZSBuZXdsaW5lcyBhdHRyaWJ1dGUgb2YgdGhlIGZpbGUgb2JqZWN0cyBzdGRvdXQsCitzdGRpbiBhbmQgc3RkZXJyIGFyZSBub3QgdXBkYXRlZCBieSB0aGUgY29tbXVuaWNhdGUoKSBtZXRob2QuCisKK1RoZSBzdGFydHVwaW5mbyBhbmQgY3JlYXRpb25mbGFncywgaWYgZ2l2ZW4sIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQordW5kZXJseWluZyBDcmVhdGVQcm9jZXNzKCkgZnVuY3Rpb24uICBUaGV5IGNhbiBzcGVjaWZ5IHRoaW5ncyBzdWNoIGFzCithcHBlYXJhbmNlIG9mIHRoZSBtYWluIHdpbmRvdyBhbmQgcHJpb3JpdHkgZm9yIHRoZSBuZXcgcHJvY2Vzcy4KKyhXaW5kb3dzIG9ubHkpCisKKworVGhpcyBtb2R1bGUgYWxzbyBkZWZpbmVzIHR3byBzaG9ydGN1dCBmdW5jdGlvbnM6CisKK2NhbGwoKmFyZ3MsICoqa3dhcmdzKToKKyAgICBSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUsIHRoZW4KKyAgICByZXR1cm4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICByZXRjb2RlID0gY2FsbChbImxzIiwgIi1sIl0pCisKKworRXhjZXB0aW9ucworLS0tLS0tLS0tLQorRXhjZXB0aW9ucyByYWlzZWQgaW4gdGhlIGNoaWxkIHByb2Nlc3MsIGJlZm9yZSB0aGUgbmV3IHByb2dyYW0gaGFzCitzdGFydGVkIHRvIGV4ZWN1dGUsIHdpbGwgYmUgcmUtcmFpc2VkIGluIHRoZSBwYXJlbnQuICBBZGRpdGlvbmFsbHksCit0aGUgZXhjZXB0aW9uIG9iamVjdCB3aWxsIGhhdmUgb25lIGV4dHJhIGF0dHJpYnV0ZSBjYWxsZWQKKydjaGlsZF90cmFjZWJhY2snLCB3aGljaCBpcyBhIHN0cmluZyBjb250YWluaW5nIHRyYWNlYmFjayBpbmZvcm1hdGlvbgorZnJvbSB0aGUgY2hpbGRzIHBvaW50IG9mIHZpZXcuCisKK1RoZSBtb3N0IGNvbW1vbiBleGNlcHRpb24gcmFpc2VkIGlzIE9TRXJyb3IuICBUaGlzIG9jY3VycywgZm9yCitleGFtcGxlLCB3aGVuIHRyeWluZyB0byBleGVjdXRlIGEgbm9uLWV4aXN0ZW50IGZpbGUuICBBcHBsaWNhdGlvbnMKK3Nob3VsZCBwcmVwYXJlIGZvciBPU0Vycm9ycy4KKworQSBWYWx1ZUVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIFBvcGVuIGlzIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzLgorCisKK1NlY3VyaXR5CistLS0tLS0tLQorVW5saWtlIHNvbWUgb3RoZXIgcG9wZW4gZnVuY3Rpb25zLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgbmV2ZXIgY2FsbAorL2Jpbi9zaCBpbXBsaWNpdGx5LiAgVGhpcyBtZWFucyB0aGF0IGFsbCBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgc2hlbGwKK21ldGFjaGFyYWN0ZXJzLCBjYW4gc2FmZWx5IGJlIHBhc3NlZCB0byBjaGlsZCBwcm9jZXNzZXMuCisKKworUG9wZW4gb2JqZWN0cworPT09PT09PT09PT09PQorSW5zdGFuY2VzIG9mIHRoZSBQb3BlbiBjbGFzcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworcG9sbCgpCisgICAgQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQorICAgIGF0dHJpYnV0ZS4KKword2FpdCgpCisgICAgV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byB0ZXJtaW5hdGUuICBSZXR1cm5zIHJldHVybmNvZGUgYXR0cmlidXRlLgorCitjb21tdW5pY2F0ZShpbnB1dD1Ob25lKQorICAgIEludGVyYWN0IHdpdGggcHJvY2VzczogU2VuZCBkYXRhIHRvIHN0ZGluLiAgUmVhZCBkYXRhIGZyb20gc3Rkb3V0CisgICAgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yIHByb2Nlc3MgdG8KKyAgICB0ZXJtaW5hdGUuICBUaGUgb3B0aW9uYWwgc3RkaW4gYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyaW5nIHRvIGJlCisgICAgc2VudCB0byB0aGUgY2hpbGQgcHJvY2Vzcywgb3IgTm9uZSwgaWYgbm8gZGF0YSBzaG91bGQgYmUgc2VudCB0bworICAgIHRoZSBjaGlsZC4KKworICAgIGNvbW11bmljYXRlKCkgcmV0dXJucyBhIHR1cGxlIChzdGRvdXQsIHN0ZGVycikuCisKKyAgICBOb3RlOiBUaGUgZGF0YSByZWFkIGlzIGJ1ZmZlcmVkIGluIG1lbW9yeSwgc28gZG8gbm90IHVzZSB0aGlzCisgICAgbWV0aG9kIGlmIHRoZSBkYXRhIHNpemUgaXMgbGFyZ2Ugb3IgdW5saW1pdGVkLgorCitUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGFsc28gYXZhaWxhYmxlOgorCitzdGRpbgorICAgIElmIHRoZSBzdGRpbiBhcmd1bWVudCBpcyBQSVBFLCB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZpbGUgb2JqZWN0CisgICAgdGhhdCBwcm92aWRlcyBpbnB1dCB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgaXQgaXMgTm9uZS4KKworc3Rkb3V0CisgICAgSWYgdGhlIHN0ZG91dCBhcmd1bWVudCBpcyBQSVBFLCB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZpbGUgb2JqZWN0CisgICAgdGhhdCBwcm92aWRlcyBvdXRwdXQgZnJvbSB0aGUgY2hpbGQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgaXQgaXMKKyAgICBOb25lLgorCitzdGRlcnIKKyAgICBJZiB0aGUgc3RkZXJyIGFyZ3VtZW50IGlzIFBJUEUsIHRoaXMgYXR0cmlidXRlIGlzIGZpbGUgb2JqZWN0IHRoYXQKKyAgICBwcm92aWRlcyBlcnJvciBvdXRwdXQgZnJvbSB0aGUgY2hpbGQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgaXQgaXMKKyAgICBOb25lLgorCitwaWQKKyAgICBUaGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KKworcmV0dXJuY29kZQorICAgIFRoZSBjaGlsZCByZXR1cm4gY29kZS4gIEEgTm9uZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvY2VzcworICAgIGhhc24ndCB0ZXJtaW5hdGVkIHlldC4gIEEgbmVnYXRpdmUgdmFsdWUgLU4gaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgY2hpbGQgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsIE4gKFVOSVggb25seSkuCisKKworUmVwbGFjaW5nIG9sZGVyIGZ1bmN0aW9ucyB3aXRoIHRoZSBzdWJwcm9jZXNzIG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW4gdGhpcyBzZWN0aW9uLCAiYSA9PT4gYiIgbWVhbnMgdGhhdCBiIGNhbiBiZSB1c2VkIGFzIGEgcmVwbGFjZW1lbnQKK2ZvciBhLgorCitOb3RlOiBBbGwgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiBmYWlsIChtb3JlIG9yIGxlc3MpIHNpbGVudGx5IGlmCit0aGUgZXhlY3V0ZWQgcHJvZ3JhbSBjYW5ub3QgYmUgZm91bmQ7IHRoaXMgbW9kdWxlIHJhaXNlcyBhbiBPU0Vycm9yCitleGNlcHRpb24uCisKK0luIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHdlIGFzc3VtZSB0aGF0IHRoZSBzdWJwcm9jZXNzIG1vZHVsZSBpcworaW1wb3J0ZWQgd2l0aCAiZnJvbSBzdWJwcm9jZXNzIGltcG9ydCAqIi4KKworCitSZXBsYWNpbmcgL2Jpbi9zaCBzaGVsbCBiYWNrcXVvdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorb3V0cHV0PWBteWNtZCBteWFyZ2AKKz09Pgorb3V0cHV0ID0gUG9wZW4oWyJteWNtZCIsICJteWFyZyJdLCBzdGRvdXQ9UElQRSkuY29tbXVuaWNhdGUoKVswXQorCisKK1JlcGxhY2luZyBzaGVsbCBwaXBlIGxpbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK291dHB1dD1gZG1lc2cgfCBncmVwIGhkYWAKKz09PgorcDEgPSBQb3BlbihbImRtZXNnIl0sIHN0ZG91dD1QSVBFKQorcDIgPSBQb3BlbihbImdyZXAiLCAiaGRhIl0sIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PVBJUEUpCitvdXRwdXQgPSBwMi5jb21tdW5pY2F0ZSgpWzBdCisKKworUmVwbGFjaW5nIG9zLnN5c3RlbSgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cyA9IG9zLnN5c3RlbSgibXljbWQiICsgIiBteWFyZyIpCis9PT4KK3AgPSBQb3BlbigibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCitzdHMgPSBvcy53YWl0cGlkKHAucGlkLCAwKQorCitOb3RlOgorCisqIENhbGxpbmcgdGhlIHByb2dyYW0gdGhyb3VnaCB0aGUgc2hlbGwgaXMgdXN1YWxseSBub3QgcmVxdWlyZWQuCisKKyogSXQncyBlYXNpZXIgdG8gbG9vayBhdCB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUgdGhhbiB0aGUKKyAgZXhpdHN0YXR1cy4KKworQSBtb3JlIHJlYWwtd29ybGQgZXhhbXBsZSB3b3VsZCBsb29rIGxpa2UgdGhpczoKKwordHJ5OgorICAgIHJldGNvZGUgPSBjYWxsKCJteWNtZCIgKyAiIG15YXJnIiwgc2hlbGw9VHJ1ZSkKKyAgICBpZiByZXRjb2RlIDwgMDoKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiQ2hpbGQgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsIiwgLXJldGNvZGUKKyAgICBlbHNlOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJDaGlsZCByZXR1cm5lZCIsIHJldGNvZGUKK2V4Y2VwdCBPU0Vycm9yLCBlOgorICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkV4ZWN1dGlvbiBmYWlsZWQ6IiwgZQorCisKK1JlcGxhY2luZyBvcy5zcGF3bioKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK1BfTk9XQUlUIGV4YW1wbGU6CisKK3BpZCA9IG9zLnNwYXdubHAob3MuUF9OT1dBSVQsICIvYmluL215Y21kIiwgIm15Y21kIiwgIm15YXJnIikKKz09PgorcGlkID0gUG9wZW4oWyIvYmluL215Y21kIiwgIm15YXJnIl0pLnBpZAorCisKK1BfV0FJVCBleGFtcGxlOgorCityZXRjb2RlID0gb3Muc3Bhd25scChvcy5QX1dBSVQsICIvYmluL215Y21kIiwgIm15Y21kIiwgIm15YXJnIikKKz09PgorcmV0Y29kZSA9IGNhbGwoWyIvYmluL215Y21kIiwgIm15YXJnIl0pCisKKworVmVjdG9yIGV4YW1wbGU6CisKK29zLnNwYXdudnAob3MuUF9OT1dBSVQsIHBhdGgsIGFyZ3MpCis9PT4KK1BvcGVuKFtwYXRoXSArIGFyZ3NbMTpdKQorCisKK0Vudmlyb25tZW50IGV4YW1wbGU6CisKK29zLnNwYXdubHBlKG9zLlBfTk9XQUlULCAiL2Jpbi9teWNtZCIsICJteWNtZCIsICJteWFyZyIsIGVudikKKz09PgorUG9wZW4oWyIvYmluL215Y21kIiwgIm15YXJnIl0sIGVudj17IlBBVEgiOiAiL3Vzci9iaW4ifSkKKworCitSZXBsYWNpbmcgb3MucG9wZW4qCistLS0tLS0tLS0tLS0tLS0tLS0tCitwaXBlID0gb3MucG9wZW4oY21kLCBtb2RlPSdyJywgYnVmc2l6ZSkKKz09PgorcGlwZSA9IFBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLCBzdGRvdXQ9UElQRSkuc3Rkb3V0CisKK3BpcGUgPSBvcy5wb3BlbihjbWQsIG1vZGU9J3cnLCBidWZzaXplKQorPT0+CitwaXBlID0gUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsIHN0ZGluPVBJUEUpLnN0ZGluCisKKworKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXQpID0gb3MucG9wZW4yKGNtZCwgbW9kZSwgYnVmc2l6ZSkKKz09PgorcCA9IFBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLAorICAgICAgICAgIHN0ZGluPVBJUEUsIHN0ZG91dD1QSVBFLCBjbG9zZV9mZHM9VHJ1ZSkKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0KSA9IChwLnN0ZGluLCBwLnN0ZG91dCkKKworCisoY2hpbGRfc3RkaW4sCisgY2hpbGRfc3Rkb3V0LAorIGNoaWxkX3N0ZGVycikgPSBvcy5wb3BlbjMoY21kLCBtb2RlLCBidWZzaXplKQorPT0+CitwID0gUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFLCBjbG9zZV9mZHM9VHJ1ZSkKKyhjaGlsZF9zdGRpbiwKKyBjaGlsZF9zdGRvdXQsCisgY2hpbGRfc3RkZXJyKSA9IChwLnN0ZGluLCBwLnN0ZG91dCwgcC5zdGRlcnIpCisKKworKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXRfYW5kX3N0ZGVycikgPSBvcy5wb3BlbjQoY21kLCBtb2RlLCBidWZzaXplKQorPT0+CitwID0gUG9wZW4oY21kLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIHN0ZGVycj1TVERPVVQsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXRfYW5kX3N0ZGVycikgPSAocC5zdGRpbiwgcC5zdGRvdXQpCisKKworUmVwbGFjaW5nIHBvcGVuMi4qCistLS0tLS0tLS0tLS0tLS0tLS0KK05vdGU6IElmIHRoZSBjbWQgYXJndW1lbnQgdG8gcG9wZW4yIGZ1bmN0aW9ucyBpcyBhIHN0cmluZywgdGhlIGNvbW1hbmQKK2lzIGV4ZWN1dGVkIHRocm91Z2ggL2Jpbi9zaC4gIElmIGl0IGlzIGEgbGlzdCwgdGhlIGNvbW1hbmQgaXMgZGlyZWN0bHkKK2V4ZWN1dGVkLgorCisoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSBwb3BlbjIucG9wZW4yKCJzb21lc3RyaW5nIiwgYnVmc2l6ZSwgbW9kZSkKKz09PgorcCA9IFBvcGVuKFsic29tZXN0cmluZyJdLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSAocC5zdGRvdXQsIHAuc3RkaW4pCisKKworKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gcG9wZW4yLnBvcGVuMihbIm15Y21kIiwgIm15YXJnIl0sIGJ1ZnNpemUsIG1vZGUpCis9PT4KK3AgPSBQb3BlbihbIm15Y21kIiwgIm15YXJnIl0sIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSAocC5zdGRvdXQsIHAuc3RkaW4pCisKK1RoZSBwb3BlbjIuUG9wZW4zIGFuZCBwb3BlbjMuUG9wZW40IGJhc2ljYWxseSB3b3JrcyBhcyBzdWJwcm9jZXNzLlBvcGVuLAorZXhjZXB0IHRoYXQ6CisKKyogc3VicHJvY2Vzcy5Qb3BlbiByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBleGVjdXRpb24gZmFpbHMKKyogdGhlIGNhcHR1cmVzdGRlcnIgYXJndW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RkZXJyIGFyZ3VtZW50LgorKiBzdGRpbj1QSVBFIGFuZCBzdGRvdXQ9UElQRSBtdXN0IGJlIHNwZWNpZmllZC4KKyogcG9wZW4yIGNsb3NlcyBhbGwgZmlsZWRlc2NyaXB0b3JzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgaGF2ZSB0byBzcGVjaWZ5CisgIGNsb3NlX2Zkcz1UcnVlIHdpdGggc3VicHJvY2Vzcy5Qb3Blbi4KKworCisiIiIKKworaW1wb3J0IHN5cworbXN3aW5kb3dzID0gKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiKQorCitpbXBvcnQgb3MKK2ltcG9ydCB0eXBlcworaW1wb3J0IHRyYWNlYmFjaworCitpZiBtc3dpbmRvd3M6CisgICAgaW1wb3J0IHRocmVhZGluZworICAgIGltcG9ydCBtc3ZjcnQKKyAgICBpZiAwOiAjIDwtLSBjaGFuZ2UgdGhpcyB0byB1c2UgcHl3aW4zMiBpbnN0ZWFkIG9mIHRoZSBfc3VicHJvY2VzcyBkcml2ZXIKKyAgICAgICAgaW1wb3J0IHB5d2ludHlwZXMKKyAgICAgICAgZnJvbSB3aW4zMmFwaSBpbXBvcnQgR2V0U3RkSGFuZGxlLCBTVERfSU5QVVRfSEFORExFLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURF9PVVRQVVRfSEFORExFLCBTVERfRVJST1JfSEFORExFCisgICAgICAgIGZyb20gd2luMzJhcGkgaW1wb3J0IEdldEN1cnJlbnRQcm9jZXNzLCBEdXBsaWNhdGVIYW5kbGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TW9kdWxlRmlsZU5hbWUsIEdldFZlcnNpb24KKyAgICAgICAgZnJvbSB3aW4zMmNvbiBpbXBvcnQgRFVQTElDQVRFX1NBTUVfQUNDRVNTLCBTV19ISURFCisgICAgICAgIGZyb20gd2luMzJwaXBlIGltcG9ydCBDcmVhdGVQaXBlCisgICAgICAgIGZyb20gd2luMzJwcm9jZXNzIGltcG9ydCBDcmVhdGVQcm9jZXNzLCBTVEFSVFVQSU5GTywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RXhpdENvZGVQcm9jZXNzLCBTVEFSVEZfVVNFU1RESEFORExFUywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlRGX1VTRVNIT1dXSU5ET1csIENSRUFURV9ORVdfQ09OU09MRQorICAgICAgICBmcm9tIHdpbjMyZXZlbnQgaW1wb3J0IFdhaXRGb3JTaW5nbGVPYmplY3QsIElORklOSVRFLCBXQUlUX09CSkVDVF8wCisgICAgZWxzZToKKyAgICAgICAgZnJvbSBfc3VicHJvY2VzcyBpbXBvcnQgKgorICAgICAgICBjbGFzcyBTVEFSVFVQSU5GTzoKKyAgICAgICAgICAgIGR3RmxhZ3MgPSAwCisgICAgICAgICAgICBoU3RkSW5wdXQgPSBOb25lCisgICAgICAgICAgICBoU3RkT3V0cHV0ID0gTm9uZQorICAgICAgICAgICAgaFN0ZEVycm9yID0gTm9uZQorICAgICAgICBjbGFzcyBweXdpbnR5cGVzOgorICAgICAgICAgICAgZXJyb3IgPSBJT0Vycm9yCitlbHNlOgorICAgIGltcG9ydCBzZWxlY3QKKyAgICBpbXBvcnQgZXJybm8KKyAgICBpbXBvcnQgZmNudGwKKyAgICBpbXBvcnQgcGlja2xlCisKK19fYWxsX18gPSBbIlBvcGVuIiwgIlBJUEUiLCAiU1RET1VUIiwgImNhbGwiXQorCit0cnk6CisgICAgTUFYRkQgPSBvcy5zeXNjb25mKCJTQ19PUEVOX01BWCIpCitleGNlcHQ6CisgICAgTUFYRkQgPSAyNTYKKworIyBUcnVlL0ZhbHNlIGRvZXMgbm90IGV4aXN0IG9uIDIuMi4wCit0cnk6CisgICAgRmFsc2UKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgRmFsc2UgPSAwCisgICAgVHJ1ZSA9IDEKKworX2FjdGl2ZSA9IFtdCisKK2RlZiBfY2xlYW51cCgpOgorICAgIGZvciBpbnN0IGluIF9hY3RpdmVbOl06CisgICAgICAgIGluc3QucG9sbCgpCisKK1BJUEUgPSAtMQorU1RET1VUID0gLTIKKworCitkZWYgY2FsbCgqYXJncywgKiprd2FyZ3MpOgorICAgICIiIlJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSwgdGhlbgorICAgIHJldHVybiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUuCisKKyAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBvcGVuIGNvbnN0cnVjdG9yLiAgRXhhbXBsZToKKworICAgIHJldGNvZGUgPSBjYWxsKFsibHMiLCAiLWwiXSkKKyAgICAiIiIKKyAgICByZXR1cm4gUG9wZW4oKmFyZ3MsICoqa3dhcmdzKS53YWl0KCkKKworCitkZWYgbGlzdDJjbWRsaW5lKHNlcSk6CisgICAgIiIiCisgICAgVHJhbnNsYXRlIGEgc2VxdWVuY2Ugb2YgYXJndW1lbnRzIGludG8gYSBjb21tYW5kIGxpbmUKKyAgICBzdHJpbmcsIHVzaW5nIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBNUyBDIHJ1bnRpbWU6CisKKyAgICAxKSBBcmd1bWVudHMgYXJlIGRlbGltaXRlZCBieSB3aGl0ZSBzcGFjZSwgd2hpY2ggaXMgZWl0aGVyIGEKKyAgICAgICBzcGFjZSBvciBhIHRhYi4KKworICAgIDIpIEEgc3RyaW5nIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBpcworICAgICAgIGludGVycHJldGVkIGFzIGEgc2luZ2xlIGFyZ3VtZW50LCByZWdhcmRsZXNzIG9mIHdoaXRlIHNwYWNlCisgICAgICAgY29udGFpbmVkIHdpdGhpbi4gIEEgcXVvdGVkIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQgaW4gYW4KKyAgICAgICBhcmd1bWVudC4KKworICAgIDMpIEEgZG91YmxlIHF1b3RhdGlvbiBtYXJrIHByZWNlZGVkIGJ5IGEgYmFja3NsYXNoIGlzCisgICAgICAgaW50ZXJwcmV0ZWQgYXMgYSBsaXRlcmFsIGRvdWJsZSBxdW90YXRpb24gbWFyay4KKworICAgIDQpIEJhY2tzbGFzaGVzIGFyZSBpbnRlcnByZXRlZCBsaXRlcmFsbHksIHVubGVzcyB0aGV5CisgICAgICAgaW1tZWRpYXRlbHkgcHJlY2VkZSBhIGRvdWJsZSBxdW90YXRpb24gbWFyay4KKworICAgIDUpIElmIGJhY2tzbGFzaGVzIGltbWVkaWF0ZWx5IHByZWNlZGUgYSBkb3VibGUgcXVvdGF0aW9uIG1hcmssCisgICAgICAgZXZlcnkgcGFpciBvZiBiYWNrc2xhc2hlcyBpcyBpbnRlcnByZXRlZCBhcyBhIGxpdGVyYWwKKyAgICAgICBiYWNrc2xhc2guICBJZiB0aGUgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGlzIG9kZCwgdGhlIGxhc3QKKyAgICAgICBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgYXMKKyAgICAgICBkZXNjcmliZWQgaW4gcnVsZSAzLgorICAgICIiIgorCisgICAgIyBTZWUKKyAgICAjIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy92Y2NlbG5nL2h0bS9wcm9nc18xMi5hc3AKKyAgICByZXN1bHQgPSBbXQorICAgIG5lZWRxdW90ZSA9IEZhbHNlCisgICAgZm9yIGFyZyBpbiBzZXE6CisgICAgICAgIGJzX2J1ZiA9IFtdCisKKyAgICAgICAgIyBBZGQgYSBzcGFjZSB0byBzZXBhcmF0ZSB0aGlzIGFyZ3VtZW50IGZyb20gdGhlIG90aGVycworICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJykKKworICAgICAgICBuZWVkcXVvdGUgPSAoIiAiIGluIGFyZykgb3IgKCJcdCIgaW4gYXJnKQorICAgICAgICBpZiBuZWVkcXVvdGU6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCciJykKKworICAgICAgICBmb3IgYyBpbiBhcmc6CisgICAgICAgICAgICBpZiBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgIyBEb24ndCBrbm93IGlmIHdlIG5lZWQgdG8gZG91YmxlIHlldC4KKyAgICAgICAgICAgICAgICBic19idWYuYXBwZW5kKGMpCisgICAgICAgICAgICBlbGlmIGMgPT0gJyInOgorICAgICAgICAgICAgICAgICMgRG91YmxlIGJhY2tzcGFjZXMuCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXFwnICogbGVuKGJzX2J1ZikqMikKKyAgICAgICAgICAgICAgICBic19idWYgPSBbXQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xcIicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm9ybWFsIGNoYXIKKyAgICAgICAgICAgICAgICBpZiBic19idWY6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoYnNfYnVmKQorICAgICAgICAgICAgICAgICAgICBic19idWYgPSBbXQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYykKKworICAgICAgICAjIEFkZCByZW1haW5pbmcgYmFja3NwYWNlcywgaWYgYW55LgorICAgICAgICBpZiBic19idWY6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKworICAgICAgICBpZiBuZWVkcXVvdGU6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyInKQorCisgICAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQorCisKK2NsYXNzIFBvcGVuKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9MCwgZXhlY3V0YWJsZT1Ob25lLAorICAgICAgICAgICAgICAgICBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsCisgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPUZhbHNlLCBzaGVsbD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCk6CisgICAgICAgICIiIkNyZWF0ZSBuZXcgUG9wZW4gaW5zdGFuY2UuIiIiCisgICAgICAgIF9jbGVhbnVwKCkKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShidWZzaXplLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImJ1ZnNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKworICAgICAgICBpZiBtc3dpbmRvd3M6CisgICAgICAgICAgICBpZiBwcmVleGVjX2ZuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInByZWV4ZWNfZm4gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybXMiKQorICAgICAgICAgICAgaWYgY2xvc2VfZmRzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNsb3NlX2ZkcyBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtcyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBPU0lYCisgICAgICAgICAgICBpZiBzdGFydHVwaW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdGFydHVwaW5mbyBpcyBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybXMiKQorICAgICAgICAgICAgaWYgY3JlYXRpb25mbGFncyAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNyZWF0aW9uZmxhZ3MgaXMgb25seSBzdXBwb3J0ZWQgb24gV2luZG93cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1zIikKKworICAgICAgICBzZWxmLnN0ZGluID0gTm9uZQorICAgICAgICBzZWxmLnN0ZG91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBOb25lCisgICAgICAgIHNlbGYucGlkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYudW5pdmVyc2FsX25ld2xpbmVzID0gdW5pdmVyc2FsX25ld2xpbmVzCisKKyAgICAgICAgIyBJbnB1dCBhbmQgb3V0cHV0IG9iamVjdHMuIFRoZSBnZW5lcmFsIHByaW5jaXBsZSBpcyBsaWtlCisgICAgICAgICMgdGhpczoKKyAgICAgICAgIworICAgICAgICAjIFBhcmVudCAgICAgICAgICAgICAgICAgICBDaGlsZAorICAgICAgICAjIC0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLQorICAgICAgICAjIHAyY3dyaXRlICAgLS0tc3RkaW4tLS0+ICBwMmNyZWFkCisgICAgICAgICMgYzJwcmVhZCAgICA8LS1zdGRvdXQtLS0gIGMycHdyaXRlCisgICAgICAgICMgZXJycmVhZCAgICA8LS1zdGRlcnItLS0gIGVycndyaXRlCisgICAgICAgICMKKyAgICAgICAgIyBPbiBQT1NJWCwgdGhlIGNoaWxkIG9iamVjdHMgYXJlIGZpbGUgZGVzY3JpcHRvcnMuICBPbgorICAgICAgICAjIFdpbmRvd3MsIHRoZXNlIGFyZSBXaW5kb3dzIGZpbGUgaGFuZGxlcy4gIFRoZSBwYXJlbnQgb2JqZWN0cworICAgICAgICAjIGFyZSBmaWxlIGRlc2NyaXB0b3JzIG9uIGJvdGggcGxhdGZvcm1zLiAgVGhlIHBhcmVudCBvYmplY3RzCisgICAgICAgICMgYXJlIE5vbmUgd2hlbiBub3QgdXNpbmcgUElQRXMuIFRoZSBjaGlsZCBvYmplY3RzIGFyZSBOb25lCisgICAgICAgICMgd2hlbiBub3QgcmVkaXJlY3RpbmcuCisKKyAgICAgICAgKHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkgPSBzZWxmLl9nZXRfaGFuZGxlcyhzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpCisKKyAgICAgICAgc2VsZi5fZXhlY3V0ZV9jaGlsZChhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLCBlbnYsIHVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpCisKKyAgICAgICAgaWYgcDJjd3JpdGU6CisgICAgICAgICAgICBzZWxmLnN0ZGluID0gb3MuZmRvcGVuKHAyY3dyaXRlLCAnd2InLCBidWZzaXplKQorICAgICAgICBpZiBjMnByZWFkOgorICAgICAgICAgICAgaWYgdW5pdmVyc2FsX25ld2xpbmVzOgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gb3MuZmRvcGVuKGMycHJlYWQsICdyVScsIGJ1ZnNpemUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gb3MuZmRvcGVuKGMycHJlYWQsICdyYicsIGJ1ZnNpemUpCisgICAgICAgIGlmIGVycnJlYWQ6CisgICAgICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBvcy5mZG9wZW4oZXJycmVhZCwgJ3JVJywgYnVmc2l6ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBvcy5mZG9wZW4oZXJycmVhZCwgJ3JiJywgYnVmc2l6ZSkKKworICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisKKyAgICBkZWYgX3RyYW5zbGF0ZV9uZXdsaW5lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHJcbiIsICJcbiIpCisgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyIiwgIlxuIikKKyAgICAgICAgcmV0dXJuIGRhdGEKKworCisgICAgaWYgbXN3aW5kb3dzOgorICAgICAgICAjCisgICAgICAgICMgV2luZG93cyBtZXRob2RzCisgICAgICAgICMKKyAgICAgICAgZGVmIF9nZXRfaGFuZGxlcyhzZWxmLCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpOgorICAgICAgICAgICAgIiIiQ29uc3RydWN0IGFuZCByZXR1cm4gdHVwbGUgd2l0aCBJTyBvYmplY3RzOgorICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsIGMycHJlYWQsIGMycHdyaXRlLCBlcnJyZWFkLCBlcnJ3cml0ZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpZiBzdGRpbiA9PSBOb25lIGFuZCBzdGRvdXQgPT0gTm9uZSBhbmQgc3RkZXJyID09IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lKQorCisgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IE5vbmUsIE5vbmUKKyAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gTm9uZSwgTm9uZQorICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUgPSBOb25lLCBOb25lCisKKyAgICAgICAgICAgIGlmIHN0ZGluID09IE5vbmU6CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKQorICAgICAgICAgICAgZWxpZiBzdGRpbiA9PSBQSVBFOgorICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgICAgICMgRGV0YWNoIGFuZCB0dXJuIGludG8gZmQKKyAgICAgICAgICAgICAgICBwMmN3cml0ZSA9IHAyY3dyaXRlLkRldGFjaCgpCisgICAgICAgICAgICAgICAgcDJjd3JpdGUgPSBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUocDJjd3JpdGUsIDApCisgICAgICAgICAgICBlbGlmIHR5cGUoc3RkaW4pID09IHR5cGVzLkludFR5cGU6CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGluKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgICAgICAgICBwMmNyZWFkID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3RkaW4uZmlsZW5vKCkpCisgICAgICAgICAgICBwMmNyZWFkID0gc2VsZi5fbWFrZV9pbmhlcml0YWJsZShwMmNyZWFkKQorCisgICAgICAgICAgICBpZiBzdGRvdXQgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSkKKyAgICAgICAgICAgIGVsaWYgc3Rkb3V0ID09IFBJUEU6CisgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBDcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICAgICAgIyBEZXRhY2ggYW5kIHR1cm4gaW50byBmZAorICAgICAgICAgICAgICAgIGMycHJlYWQgPSBjMnByZWFkLkRldGFjaCgpCisgICAgICAgICAgICAgICAgYzJwcmVhZCA9IG1zdmNydC5vcGVuX29zZmhhbmRsZShjMnByZWFkLCAwKQorICAgICAgICAgICAgZWxpZiB0eXBlKHN0ZG91dCkgPT0gdHlwZXMuSW50VHlwZToKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZG91dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRvdXQuZmlsZW5vKCkpCisgICAgICAgICAgICBjMnB3cml0ZSA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUoYzJwd3JpdGUpCisKKyAgICAgICAgICAgIGlmIHN0ZGVyciA9PSBOb25lOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpCisgICAgICAgICAgICBlbGlmIHN0ZGVyciA9PSBQSVBFOgorICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlID0gQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgICAgICMgRGV0YWNoIGFuZCB0dXJuIGludG8gZmQKKyAgICAgICAgICAgICAgICBlcnJyZWFkID0gZXJycmVhZC5EZXRhY2goKQorICAgICAgICAgICAgICAgIGVycnJlYWQgPSBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUoZXJycmVhZCwgMCkKKyAgICAgICAgICAgIGVsaWYgc3RkZXJyID09IFNURE9VVDoKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IGMycHdyaXRlCisgICAgICAgICAgICBlbGlmIHR5cGUoc3RkZXJyKSA9PSB0eXBlcy5JbnRUeXBlOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3RkZXJyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGVyci5maWxlbm8oKSkKKyAgICAgICAgICAgIGVycndyaXRlID0gc2VsZi5fbWFrZV9pbmhlcml0YWJsZShlcnJ3cml0ZSkKKworICAgICAgICAgICAgcmV0dXJuIChwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorCisKKyAgICAgICAgZGVmIF9tYWtlX2luaGVyaXRhYmxlKHNlbGYsIGhhbmRsZSk6CisgICAgICAgICAgICAiIiJSZXR1cm4gYSBkdXBsaWNhdGUgb2YgaGFuZGxlLCB3aGljaCBpcyBpbmhlcml0YWJsZSIiIgorICAgICAgICAgICAgcmV0dXJuIER1cGxpY2F0ZUhhbmRsZShHZXRDdXJyZW50UHJvY2VzcygpLCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykKKworCisgICAgICAgIGRlZiBfZmluZF93OXhwb3BlbihzZWxmKToKKyAgICAgICAgICAgICIiIkZpbmQgYW5kIHJldHVybiBhYnNvbHV0ZSBwYXRoIHRvIHc5eHBvcGVuLmV4ZSIiIgorICAgICAgICAgICAgdzl4cG9wZW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKEdldE1vZHVsZUZpbGVOYW1lKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3OXhwb3Blbi5leGUiKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHc5eHBvcGVuKToKKyAgICAgICAgICAgICAgICAjIEVlZWsgLSBmaWxlLW5vdC1mb3VuZCAtIHBvc3NpYmx5IGFuIGVtYmVkZGluZworICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIC0gc2VlIGlmIHdlIGNhbiBsb2NhdGUgaXQgaW4gc3lzLmV4ZWNfcHJlZml4CisgICAgICAgICAgICAgICAgdzl4cG9wZW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5leGVjX3ByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInc5eHBvcGVuLmV4ZSIpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHc5eHBvcGVuKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgbG9jYXRlIHc5eHBvcGVuLmV4ZSwgd2hpY2ggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRlZCBmb3IgUG9wZW4gdG8gd29yayB3aXRoIHlvdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoZWxsIG9yIHBsYXRmb3JtLiIpCisgICAgICAgICAgICByZXR1cm4gdzl4cG9wZW4KKworCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgcHJvZ3JhbSAoTVMgV2luZG93cyB2ZXJzaW9uKSIiIgorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhcmdzLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgYXJncyA9IGxpc3QyY21kbGluZShhcmdzKQorCisgICAgICAgICAgICAjIFByb2Nlc3Mgc3RhcnR1cCBkZXRhaWxzCisgICAgICAgICAgICBkZWZhdWx0X3N0YXJ0dXBpbmZvID0gU1RBUlRVUElORk8oKQorICAgICAgICAgICAgaWYgc3RhcnR1cGluZm8gPT0gTm9uZToKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mbyA9IGRlZmF1bHRfc3RhcnR1cGluZm8KKyAgICAgICAgICAgIGlmIG5vdCBOb25lIGluIChwMmNyZWFkLCBjMnB3cml0ZSwgZXJyd3JpdGUpOgorICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLmR3RmxhZ3MgfD0gU1RBUlRGX1VTRVNUREhBTkRMRVMKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5oU3RkSW5wdXQgPSBwMmNyZWFkCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uaFN0ZE91dHB1dCA9IGMycHdyaXRlCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uaFN0ZEVycm9yID0gZXJyd3JpdGUKKworICAgICAgICAgICAgaWYgc2hlbGw6CisgICAgICAgICAgICAgICAgZGVmYXVsdF9zdGFydHVwaW5mby5kd0ZsYWdzIHw9IFNUQVJURl9VU0VTSE9XV0lORE9XCisgICAgICAgICAgICAgICAgZGVmYXVsdF9zdGFydHVwaW5mby53U2hvd1dpbmRvdyA9IFNXX0hJREUKKyAgICAgICAgICAgICAgICBjb21zcGVjID0gb3MuZW52aXJvbi5nZXQoIkNPTVNQRUMiLCAiY21kLmV4ZSIpCisgICAgICAgICAgICAgICAgYXJncyA9IGNvbXNwZWMgKyAiIC9jICIgKyBhcmdzCisgICAgICAgICAgICAgICAgaWYgKEdldFZlcnNpb24oKSA+PSAweDgwMDAwMDAwTCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShjb21zcGVjKS5sb3dlcigpID09ICJjb21tYW5kLmNvbSIpOgorICAgICAgICAgICAgICAgICAgICAjIFdpbjl4LCBvciB1c2luZyBjb21tYW5kLmNvbSBvbiBOVC4gV2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGUgdzl4cG9wZW4gaW50ZXJtZWRpYXRlIHByb2dyYW0uIEZvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICMgaW5mb3JtYXRpb24sIHNlZSBLQiBRMTUwOTU2CisgICAgICAgICAgICAgICAgICAgICMgKGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDExMTA1MDg0MDAyL2h0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vc3VwcG9ydC9rYi9hcnRpY2xlcy9RMTUwLzkvNTYuYXNwKQorICAgICAgICAgICAgICAgICAgICB3OXhwb3BlbiA9IHNlbGYuX2ZpbmRfdzl4cG9wZW4oKQorICAgICAgICAgICAgICAgICAgICBhcmdzID0gJyIlcyIgJXMnICUgKHc5eHBvcGVuLCBhcmdzKQorICAgICAgICAgICAgICAgICAgICAjIE5vdCBwYXNzaW5nIENSRUFURV9ORVdfQ09OU09MRSBoYXMgYmVlbiBrbm93biB0bworICAgICAgICAgICAgICAgICAgICAjIGNhdXNlIHJhbmRvbSBmYWlsdXJlcyBvbiB3aW45eC4gIFNwZWNpZmljYWxseSBhCisgICAgICAgICAgICAgICAgICAgICMgZGlhbG9nOiAiWW91ciBwcm9ncmFtIGFjY2Vzc2VkIG1lbSBjdXJyZW50bHkgaW4KKyAgICAgICAgICAgICAgICAgICAgIyB1c2UgYXQgeHh4IiBhbmQgYSBob3BlZnVsIHdhcm5pbmcgYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICMgc3RhYmlsaXR5IG9mIHlvdXIgc3lzdGVtLiAgQ29zdCBpcyBDdHJsK0Mgd29udAorICAgICAgICAgICAgICAgICAgICAjIGtpbGwgY2hpbGRyZW4uCisgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uZmxhZ3MgfD0gQ1JFQVRFX05FV19DT05TT0xFCisKKyAgICAgICAgICAgICMgU3RhcnQgdGhlIHByb2Nlc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBocCwgaHQsIHBpZCwgdGlkID0gQ3JlYXRlUHJvY2VzcyhleGVjdXRhYmxlLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHNwZWNpYWwgc2VjdXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGluaGVyaXQgaGFuZGxlcyB0byBwYXNzIHN0ZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhhbmRsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvKQorICAgICAgICAgICAgZXhjZXB0IHB5d2ludHlwZXMuZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgIyBUcmFuc2xhdGUgcHl3aW50eXBlcy5lcnJvciB0byBXaW5kb3dzRXJyb3IsIHdoaWNoIGlzCisgICAgICAgICAgICAgICAgIyBhIHN1YmNsYXNzIG9mIE9TRXJyb3IuICBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseQorICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIGVycm5vIHVzaW5nIF9zeXNfZXJybGlzdCAob3Igc2ltbGlhciksIGJ1dAorICAgICAgICAgICAgICAgICMgaG93IGNhbiB0aGlzIGJlIGRvbmUgZnJvbSBQeXRob24/CisgICAgICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yKCplLmFyZ3MpCisKKyAgICAgICAgICAgICMgUmV0YWluIHRoZSBwcm9jZXNzIGhhbmRsZSwgYnV0IGNsb3NlIHRoZSB0aHJlYWQgaGFuZGxlCisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBocAorICAgICAgICAgICAgc2VsZi5waWQgPSBwaWQKKyAgICAgICAgICAgIGh0LkNsb3NlKCkKKworICAgICAgICAgICAgIyBDaGlsZCBpcyBsYXVuY2hlZC4gQ2xvc2UgdGhlIHBhcmVudCdzIGNvcHkgb2YgdGhvc2UgcGlwZQorICAgICAgICAgICAgIyBoYW5kbGVzIHRoYXQgb25seSB0aGUgY2hpbGQgc2hvdWxkIGhhdmUgb3Blbi4gIFlvdSBuZWVkCisgICAgICAgICAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIGhhbmRsZXMgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICMgb3V0cHV0IHBpcGUgYXJlIG1haW50YWluZWQgaW4gdGhpcyBwcm9jZXNzIG9yIGVsc2UgdGhlCisgICAgICAgICAgICAjIHBpcGUgd2lsbCBub3QgY2xvc2Ugd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBleGl0cyBhbmQgdGhlCisgICAgICAgICAgICAjIFJlYWRGaWxlIHdpbGwgaGFuZy4KKyAgICAgICAgICAgIGlmIHAyY3JlYWQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBwMmNyZWFkLkNsb3NlKCkKKyAgICAgICAgICAgIGlmIGMycHdyaXRlICE9IE5vbmU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUuQ2xvc2UoKQorICAgICAgICAgICAgaWYgZXJyd3JpdGUgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZS5DbG9zZSgpCisKKworICAgICAgICBkZWYgcG9sbChzZWxmKToKKyAgICAgICAgICAgICIiIkNoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBSZXR1cm5zIHJldHVybmNvZGUKKyAgICAgICAgICAgIGF0dHJpYnV0ZS4iIiIKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSA9PSBOb25lOgorICAgICAgICAgICAgICAgIGlmIFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VsZi5faGFuZGxlLCAwKSA9PSBXQUlUX09CSkVDVF8wOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBHZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQorICAgICAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisKKyAgICAgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgICAgICAiIiJXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlID09IE5vbmU6CisgICAgICAgICAgICAgICAgb2JqID0gV2FpdEZvclNpbmdsZU9iamVjdChzZWxmLl9oYW5kbGUsIElORklOSVRFKQorICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IEdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCisgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworCisgICAgICAgIGRlZiBfcmVhZGVydGhyZWFkKHNlbGYsIGZoLCBidWZmZXIpOgorICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChmaC5yZWFkKCkpCisKKworICAgICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgICAgICAiIiJJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tCisgICAgICAgICAgICBzdGRvdXQgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yCisgICAgICAgICAgICBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYQorICAgICAgICAgICAgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MsIG9yIE5vbmUsIGlmIG5vIGRhdGEKKyAgICAgICAgICAgIHNob3VsZCBiZSBzZW50IHRvIHRoZSBjaGlsZC4KKworICAgICAgICAgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4iIiIKKyAgICAgICAgICAgIHN0ZG91dCA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIHN0ZGVyciA9IE5vbmUgIyBSZXR1cm4KKworICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gW10KKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fcmVhZGVydGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYuc3Rkb3V0LCBzdGRvdXQpKQorICAgICAgICAgICAgICAgIHN0ZG91dF90aHJlYWQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICAgICAgc3Rkb3V0X3RocmVhZC5zdGFydCgpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzdGRlcnIgPSBbXQorICAgICAgICAgICAgICAgIHN0ZGVycl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXJ0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5zdGRlcnIsIHN0ZGVycikpCisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgICAgICBzdGRlcnJfdGhyZWFkLnN0YXJ0KCkKKworICAgICAgICAgICAgaWYgc2VsZi5zdGRpbjoKKyAgICAgICAgICAgICAgICBpZiBpbnB1dCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKGlucHV0KQorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkLmpvaW4oKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZC5qb2luKCkKKworICAgICAgICAgICAgIyBBbGwgZGF0YSBleGNoYW5nZWQuICBUcmFuc2xhdGUgbGlzdHMgaW50byBzdHJpbmdzLgorICAgICAgICAgICAgaWYgc3Rkb3V0ICE9IE5vbmU6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0WzBdCisgICAgICAgICAgICBpZiBzdGRlcnIgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBzdGRlcnIgPSBzdGRlcnJbMF0KKworICAgICAgICAgICAgIyBUcmFuc2xhdGUgbmV3bGluZXMsIGlmIHJlcXVlc3RlZC4gIFdlIGNhbm5vdCBsZXQgdGhlIGZpbGUKKyAgICAgICAgICAgICMgb2JqZWN0IGRvIHRoZSB0cmFuc2xhdGlvbjogSXQgaXMgYmFzZWQgb24gc3RkaW8sIHdoaWNoIGlzCisgICAgICAgICAgICAjIGltcG9zc2libGUgdG8gY29tYmluZSB3aXRoIHNlbGVjdCAodW5sZXNzIGZvcmNpbmcgbm8KKyAgICAgICAgICAgICMgYnVmZmVyaW5nKS4KKyAgICAgICAgICAgIGlmIHNlbGYudW5pdmVyc2FsX25ld2xpbmVzIGFuZCBoYXNhdHRyKG9wZW4sICduZXdsaW5lcycpOgorICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZG91dCkKKyAgICAgICAgICAgICAgICBpZiBzdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIHN0ZGVyciA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRlcnIpCisKKyAgICAgICAgICAgIHNlbGYud2FpdCgpCisgICAgICAgICAgICByZXR1cm4gKHN0ZG91dCwgc3RkZXJyKQorCisgICAgZWxzZToKKyAgICAgICAgIworICAgICAgICAjIFBPU0lYIG1ldGhvZHMKKyAgICAgICAgIworICAgICAgICBkZWYgX2dldF9oYW5kbGVzKHNlbGYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVycik6CisgICAgICAgICAgICAiIiJDb25zdHJ1Y3QgYW5kIHJldHVybiB0dXBsZSB3aXRoIElPIG9iamVjdHM6CisgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSwgYzJwcmVhZCwgYzJwd3JpdGUsIGVycnJlYWQsIGVycndyaXRlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gTm9uZSwgTm9uZQorICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBOb25lLCBOb25lCisgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IE5vbmUsIE5vbmUKKworICAgICAgICAgICAgaWYgc3RkaW4gPT0gTm9uZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHN0ZGluID09IFBJUEU6CisgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRpbikgPT0gdHlwZXMuSW50VHlwZToKKyAgICAgICAgICAgICAgICBwMmNyZWFkID0gc3RkaW4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IHN0ZGluLmZpbGVubygpCisKKyAgICAgICAgICAgIGlmIHN0ZG91dCA9PSBOb25lOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgc3Rkb3V0ID09IFBJUEU6CisgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRvdXQpID09IHR5cGVzLkludFR5cGU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBzdGRvdXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBzdGRvdXQuZmlsZW5vKCkKKworICAgICAgICAgICAgaWYgc3RkZXJyID09IE5vbmU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gUElQRToKKyAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gU1RET1VUOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gYzJwd3JpdGUKKyAgICAgICAgICAgIGVsaWYgdHlwZShzdGRlcnIpID09IHR5cGVzLkludFR5cGU6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBzdGRlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBzdGRlcnIuZmlsZW5vKCkKKworICAgICAgICAgICAgcmV0dXJuIChwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorCisKKyAgICAgICAgZGVmIF9zZXRfY2xvZXhlY19mbGFnKHNlbGYsIGZkKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbG9leGVjX2ZsYWcgPSBmY250bC5GRF9DTE9FWEVDCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgY2xvZXhlY19mbGFnID0gMQorCisgICAgICAgICAgICBvbGQgPSBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGRCkKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX1NFVEZELCBvbGQgfCBjbG9leGVjX2ZsYWcpCisKKworICAgICAgICBkZWYgX2Nsb3NlX2ZkcyhzZWxmLCBidXQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMywgTUFYRkQpOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gYnV0OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoaSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgcHJvZ3JhbSAoUE9TSVggdmVyc2lvbikiIiIKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgYXJncyA9IFthcmdzXQorCisgICAgICAgICAgICBpZiBzaGVsbDoKKyAgICAgICAgICAgICAgICBhcmdzID0gWyIvYmluL3NoIiwgIi1jIl0gKyBhcmdzCisKKyAgICAgICAgICAgIGlmIGV4ZWN1dGFibGUgPT0gTm9uZToKKyAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYXJnc1swXQorCisgICAgICAgICAgICAjIEZvciB0cmFuc2ZlcnJpbmcgcG9zc2libGUgZXhlYyBmYWlsdXJlIGZyb20gY2hpbGQgdG8gcGFyZW50CisgICAgICAgICAgICAjIFRoZSBmaXJzdCBjaGFyIHNwZWNpZmllcyB0aGUgZXhjZXB0aW9uIHR5cGU6IDAgbWVhbnMKKyAgICAgICAgICAgICMgT1NFcnJvciwgMSBtZWFucyBzb21lIG90aGVyIGVycm9yLgorICAgICAgICAgICAgZXJycGlwZV9yZWFkLCBlcnJwaXBlX3dyaXRlID0gb3MucGlwZSgpCisgICAgICAgICAgICBzZWxmLl9zZXRfY2xvZXhlY19mbGFnKGVycnBpcGVfd3JpdGUpCisKKyAgICAgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBzZWxmLnBpZCA9PSAwOgorICAgICAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgcGFyZW50J3MgcGlwZSBlbmRzCisgICAgICAgICAgICAgICAgICAgIGlmIHAyY3dyaXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjd3JpdGUpCisgICAgICAgICAgICAgICAgICAgIGlmIGMycHJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShjMnByZWFkKQorICAgICAgICAgICAgICAgICAgICBpZiBlcnJyZWFkOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycmVhZCkKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycGlwZV9yZWFkKQorCisgICAgICAgICAgICAgICAgICAgICMgRHVwIGZkcyBmb3IgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgaWYgcDJjcmVhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIocDJjcmVhZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5kdXAyKGMycHdyaXRlLCAxKQorICAgICAgICAgICAgICAgICAgICBpZiBlcnJ3cml0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIoZXJyd3JpdGUsIDIpCisKKyAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBwaXBlIGZkcy4gIE1ha2Ugc3VyZSB3ZSBkb2Vzbid0IGNsb3NlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICMgZmQgbW9yZSB0aGFuIG9uY2UuCisgICAgICAgICAgICAgICAgICAgIGlmIHAyY3JlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShwMmNyZWFkKQorICAgICAgICAgICAgICAgICAgICBpZiBjMnB3cml0ZSBhbmQgYzJwd3JpdGUgbm90IGluIChwMmNyZWFkLCk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShjMnB3cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgYW5kIGVycndyaXRlIG5vdCBpbiAocDJjcmVhZCwgYzJwd3JpdGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJyd3JpdGUpCisKKyAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBhbGwgb3RoZXIgZmRzLCBpZiBhc2tlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xvc2VfZmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2VfZmRzKGJ1dD1lcnJwaXBlX3dyaXRlKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGN3ZCAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQorCisgICAgICAgICAgICAgICAgICAgIGlmIHByZWV4ZWNfZm46CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseShwcmVleGVjX2ZuKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGVudiA9PSBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuZXhlY3ZwKGV4ZWN1dGFibGUsIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5leGVjdnBlKGV4ZWN1dGFibGUsIGFyZ3MsIGVudikKKworICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgICAgICAgICAjIFNhdmUgdGhlIHRyYWNlYmFjayBhbmQgYXR0YWNoIGl0IHRvIHRoZSBleGNlcHRpb24gb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIGV4Y19saW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGV4Y190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiKQorICAgICAgICAgICAgICAgICAgICBleGNfdmFsdWUuY2hpbGRfdHJhY2ViYWNrID0gJycuam9pbihleGNfbGluZXMpCisgICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGVycnBpcGVfd3JpdGUsIHBpY2tsZS5kdW1wcyhleGNfdmFsdWUpKQorCisgICAgICAgICAgICAgICAgIyBUaGlzIGV4aXRjb2RlIHdvbid0IGJlIHJlcG9ydGVkIHRvIGFwcGxpY2F0aW9ucywgc28gaXQKKyAgICAgICAgICAgICAgICAjIHJlYWxseSBkb2Vzbid0IG1hdHRlciB3aGF0IHdlIHJldHVybi4KKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgyNTUpCisKKyAgICAgICAgICAgICMgUGFyZW50CisgICAgICAgICAgICBvcy5jbG9zZShlcnJwaXBlX3dyaXRlKQorICAgICAgICAgICAgaWYgcDJjcmVhZCBhbmQgcDJjd3JpdGU6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjcmVhZCkKKyAgICAgICAgICAgIGlmIGMycHdyaXRlIGFuZCBjMnByZWFkOgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQorICAgICAgICAgICAgaWYgZXJyd3JpdGUgYW5kIGVycnJlYWQ6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJyd3JpdGUpCisKKyAgICAgICAgICAgICMgV2FpdCBmb3IgZXhlYyB0byBmYWlsIG9yIHN1Y2NlZWQ7IHBvc3NpYmx5IHJhaXNpbmcgZXhjZXB0aW9uCisgICAgICAgICAgICBkYXRhID0gb3MucmVhZChlcnJwaXBlX3JlYWQsIDEwNDg1NzYpICMgRXhjZXB0aW9ucyBsaW1pdGVkIHRvIDEgTUIKKyAgICAgICAgICAgIG9zLmNsb3NlKGVycnBpcGVfcmVhZCkKKyAgICAgICAgICAgIGlmIGRhdGEgIT0gIiI6CisgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICBjaGlsZF9leGNlcHRpb24gPSBwaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgICAgICAgICByYWlzZSBjaGlsZF9leGNlcHRpb24KKworCisgICAgICAgIGRlZiBfaGFuZGxlX2V4aXRzdGF0dXMoc2VsZiwgc3RzKToKKyAgICAgICAgICAgIGlmIG9zLldJRlNJR05BTEVEKHN0cyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gLW9zLldURVJNU0lHKHN0cykKKyAgICAgICAgICAgIGVsaWYgb3MuV0lGRVhJVEVEKHN0cyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gb3MuV0VYSVRTVEFUVVMoc3RzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlVua25vd24gY2hpbGQgZXhpdCBzdGF0dXMhIikKKworICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKKworCisgICAgICAgIGRlZiBwb2xsKHNlbGYpOgorICAgICAgICAgICAgIiIiQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlID09IE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworCisgICAgICAgIGRlZiB3YWl0KHNlbGYpOgorICAgICAgICAgICAgIiIiV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byB0ZXJtaW5hdGUuICBSZXR1cm5zIHJldHVybmNvZGUKKyAgICAgICAgICAgIGF0dHJpYnV0ZS4iIiIKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSA9PSBOb25lOgorICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfZXhpdHN0YXR1cyhzdHMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKworICAgICAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgICAgICAiIiJJbnRlcmFjdCB3aXRoIHByb2Nlc3M6IFNlbmQgZGF0YSB0byBzdGRpbi4gIFJlYWQgZGF0YSBmcm9tCisgICAgICAgICAgICBzdGRvdXQgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yCisgICAgICAgICAgICBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYQorICAgICAgICAgICAgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIGNoaWxkIHByb2Nlc3MsIG9yIE5vbmUsIGlmIG5vIGRhdGEKKyAgICAgICAgICAgIHNob3VsZCBiZSBzZW50IHRvIHRoZSBjaGlsZC4KKworICAgICAgICAgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4iIiIKKyAgICAgICAgICAgIHJlYWRfc2V0ID0gW10KKyAgICAgICAgICAgIHdyaXRlX3NldCA9IFtdCisgICAgICAgICAgICBzdGRvdXQgPSBOb25lICMgUmV0dXJuCisgICAgICAgICAgICBzdGRlcnIgPSBOb25lICMgUmV0dXJuCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgIyBGbHVzaCBzdGRpbyBidWZmZXIuICBUaGlzIG1pZ2h0IGJsb2NrLCBpZiB0aGUgdXNlciBoYXMKKyAgICAgICAgICAgICAgICAjIGJlZW4gd3JpdGluZyB0byAuc3RkaW4gaW4gYW4gdW5jb250cm9sbGVkIGZhc2hpb24uCisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICAgICAgaWYgaW5wdXQ6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NldC5hcHBlbmQoc2VsZi5zdGRpbikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHJlYWRfc2V0LmFwcGVuZChzZWxmLnN0ZG91dCkKKyAgICAgICAgICAgICAgICBzdGRvdXQgPSBbXQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgcmVhZF9zZXQuYXBwZW5kKHNlbGYuc3RkZXJyKQorICAgICAgICAgICAgICAgIHN0ZGVyciA9IFtdCisKKyAgICAgICAgICAgIHdoaWxlIHJlYWRfc2V0IG9yIHdyaXRlX3NldDoKKyAgICAgICAgICAgICAgICBybGlzdCwgd2xpc3QsIHhsaXN0ID0gc2VsZWN0LnNlbGVjdChyZWFkX3NldCwgd3JpdGVfc2V0LCBbXSkKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gaW4gd2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICMgV2hlbiBzZWxlY3QgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBmaWxlIGlzIHdyaXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAjIHdlIGNhbiB3cml0ZSB1cCB0byBQSVBFX0JVRiBieXRlcyB3aXRob3V0IHJpc2sKKyAgICAgICAgICAgICAgICAgICAgIyBibG9ja2luZy4gIFBPU0lYIGRlZmluZXMgUElQRV9CVUYgPj0gNTEyCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPSBvcy53cml0ZShzZWxmLnN0ZGluLmZpbGVubygpLCBpbnB1dFs6NTEyXSkKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dFtieXRlc193cml0dGVuOl0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9zZXQucmVtb3ZlKHNlbGYuc3RkaW4pCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dCBpbiBybGlzdDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG9zLnJlYWQoc2VsZi5zdGRvdXQuZmlsZW5vKCksIDEwMjQpCisgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NldC5yZW1vdmUoc2VsZi5zdGRvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dC5hcHBlbmQoZGF0YSkKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyIGluIHJsaXN0OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3MucmVhZChzZWxmLnN0ZGVyci5maWxlbm8oKSwgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc2V0LnJlbW92ZShzZWxmLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyLmFwcGVuZChkYXRhKQorCisgICAgICAgICAgICAjIEFsbCBkYXRhIGV4Y2hhbmdlZC4gIFRyYW5zbGF0ZSBsaXN0cyBpbnRvIHN0cmluZ3MuCisgICAgICAgICAgICBpZiBzdGRvdXQgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBzdGRvdXQgPSAnJy5qb2luKHN0ZG91dCkKKyAgICAgICAgICAgIGlmIHN0ZGVyciAhPSBOb25lOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9ICcnLmpvaW4oc3RkZXJyKQorCisgICAgICAgICAgICAjIFRyYW5zbGF0ZSBuZXdsaW5lcywgaWYgcmVxdWVzdGVkLiAgV2UgY2Fubm90IGxldCB0aGUgZmlsZQorICAgICAgICAgICAgIyBvYmplY3QgZG8gdGhlIHRyYW5zbGF0aW9uOiBJdCBpcyBiYXNlZCBvbiBzdGRpbywgd2hpY2ggaXMKKyAgICAgICAgICAgICMgaW1wb3NzaWJsZSB0byBjb21iaW5lIHdpdGggc2VsZWN0ICh1bmxlc3MgZm9yY2luZyBubworICAgICAgICAgICAgIyBidWZmZXJpbmcpLgorICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWxfbmV3bGluZXMgYW5kIGhhc2F0dHIob3BlbiwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3Rkb3V0KQorICAgICAgICAgICAgICAgIGlmIHN0ZGVycjoKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZGVycikKKworICAgICAgICAgICAgc2VsZi53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKworZGVmIF9kZW1vX3Bvc2l4KCk6CisgICAgIworICAgICMgRXhhbXBsZSAxOiBTaW1wbGUgcmVkaXJlY3Rpb246IEdldCBwcm9jZXNzIGxpc3QKKyAgICAjCisgICAgcGxpc3QgPSBQb3BlbihbInBzIl0sIHN0ZG91dD1QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCisgICAgcHJpbnQgIlByb2Nlc3MgbGlzdDoiCisgICAgcHJpbnQgcGxpc3QKKworICAgICMKKyAgICAjIEV4YW1wbGUgMjogQ2hhbmdlIHVpZCBiZWZvcmUgZXhlY3V0aW5nIGNoaWxkCisgICAgIworICAgIGlmIG9zLmdldHVpZCgpID09IDA6CisgICAgICAgIHAgPSBQb3BlbihbImlkIl0sIHByZWV4ZWNfZm49bGFtYmRhOiBvcy5zZXR1aWQoMTAwKSkKKyAgICAgICAgcC53YWl0KCkKKworICAgICMKKyAgICAjIEV4YW1wbGUgMzogQ29ubmVjdGluZyBzZXZlcmFsIHN1YnByb2Nlc3NlcworICAgICMKKyAgICBwcmludCAiTG9va2luZyBmb3IgJ2hkYScuLi4iCisgICAgcDEgPSBQb3BlbihbImRtZXNnIl0sIHN0ZG91dD1QSVBFKQorICAgIHAyID0gUG9wZW4oWyJncmVwIiwgImhkYSJdLCBzdGRpbj1wMS5zdGRvdXQsIHN0ZG91dD1QSVBFKQorICAgIHByaW50IHJlcHIocDIuY29tbXVuaWNhdGUoKVswXSkKKworICAgICMKKyAgICAjIEV4YW1wbGUgNDogQ2F0Y2ggZXhlY3V0aW9uIGVycm9yCisgICAgIworICAgIHByaW50CisgICAgcHJpbnQgIlRyeWluZyBhIHdlaXJkIGZpbGUuLi4iCisgICAgdHJ5OgorICAgICAgICBwcmludCBQb3BlbihbIi90aGlzL3BhdGgvZG9lcy9ub3QvZXhpc3QiXSkuY29tbXVuaWNhdGUoKQorICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgIHByaW50ICJUaGUgZmlsZSBkaWRuJ3QgZXhpc3QuICBJIHRob3VnaHQgc28uLi4iCisgICAgICAgICAgICBwcmludCAiQ2hpbGQgdHJhY2ViYWNrOiIKKyAgICAgICAgICAgIHByaW50IGUuY2hpbGRfdHJhY2ViYWNrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiRXJyb3IiLCBlLmVycm5vCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiR29zaC4gIE5vIGVycm9yLiIKKworCitkZWYgX2RlbW9fd2luZG93cygpOgorICAgICMKKyAgICAjIEV4YW1wbGUgMTogQ29ubmVjdGluZyBzZXZlcmFsIHN1YnByb2Nlc3NlcworICAgICMKKyAgICBwcmludCAiTG9va2luZyBmb3IgJ1BST01QVCcgaW4gc2V0IG91dHB1dC4uLiIKKyAgICBwMSA9IFBvcGVuKCJzZXQiLCBzdGRvdXQ9UElQRSwgc2hlbGw9VHJ1ZSkKKyAgICBwMiA9IFBvcGVuKCdmaW5kICJQUk9NUFQiJywgc3RkaW49cDEuc3Rkb3V0LCBzdGRvdXQ9UElQRSkKKyAgICBwcmludCByZXByKHAyLmNvbW11bmljYXRlKClbMF0pCisKKyAgICAjCisgICAgIyBFeGFtcGxlIDI6IFNpbXBsZSBleGVjdXRpb24gb2YgcHJvZ3JhbQorICAgICMKKyAgICBwcmludCAiRXhlY3V0aW5nIGNhbGMuLi4iCisgICAgcCA9IFBvcGVuKCJjYWxjIikKKyAgICBwLndhaXQoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgbXN3aW5kb3dzOgorICAgICAgICBfZGVtb193aW5kb3dzKCkKKyAgICBlbHNlOgorICAgICAgICBfZGVtb19wb3NpeCgpCmRpZmYgLS1naXQgYS9jb21wYXQvdW5zZXRlbnYuYyBiL2NvbXBhdC91bnNldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWU0ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvdW5zZXRlbnYuYwpAQCAtMCwwICsxLDI2IEBACisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgZ2l0dW5zZXRlbnYgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKKyAgICAgaW50IHNyYywgZHN0OworICAgICBzaXplX3Qgbm1sbjsKKworICAgICBubWxuID0gc3RybGVuKG5hbWUpOworCisgICAgIGZvciAoc3JjID0gZHN0ID0gMDsgZW52aXJvbltzcmNdOyArK3NyYykgeworCSAgc2l6ZV90IGVubG47CisJICBlbmxuID0gc3RybGVuKGVudmlyb25bc3JjXSk7CisJICBpZiAoZW5sbiA+IG5tbG4pIHsKKyAgICAgICAgICAgICAgIC8qIG1pZ2h0IG1hdGNoLCBhbmQgY2FuIHRlc3QgZm9yICc9JyBzYWZlbHkgKi8KKwkgICAgICAgaWYgKDAgPT0gc3RybmNtcCAoZW52aXJvbltzcmNdLCBuYW1lLCBubWxuKQorCQkgICAmJiAnPScgPT0gZW52aXJvbltzcmNdW25tbG5dKQorCQkgICAgLyogbWF0Y2hlcywgc28gc2tpcCAqLworCQkgICAgY29udGludWU7CisJICB9CisJICBlbnZpcm9uW2RzdF0gPSBlbnZpcm9uW3NyY107CisJICArK2RzdDsKKyAgICAgfQorICAgICBlbnZpcm9uW2RzdF0gPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvY29uZmlnLmMgYi9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIzNTYyCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlnLmMKQEAgLTAsMCArMSw3NDYgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEpvaGFubmVzIFNjaGluZGVsaW4sIDIwMDUKKyAqCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKKyNkZWZpbmUgTUFYTkFNRSAoMjU2KQorCitzdGF0aWMgRklMRSAqY29uZmlnX2ZpbGU7CitzdGF0aWMgY29uc3QgY2hhciAqY29uZmlnX2ZpbGVfbmFtZTsKK3N0YXRpYyBpbnQgY29uZmlnX2xpbmVucjsKK3N0YXRpYyBpbnQgZ2V0X25leHRfY2hhcih2b2lkKQoreworCWludCBjOworCUZJTEUgKmY7CisKKwljID0gJ1xuJzsKKwlpZiAoKGYgPSBjb25maWdfZmlsZSkgIT0gTlVMTCkgeworCQljID0gZmdldGMoZik7CisJCWlmIChjID09ICdccicpIHsKKwkJCS8qIERPUyBsaWtlIHN5c3RlbXMgKi8KKwkJCWMgPSBmZ2V0YyhmKTsKKwkJCWlmIChjICE9ICdcbicpIHsKKwkJCQl1bmdldGMoYywgZik7CisJCQkJYyA9ICdccic7CisJCQl9CisJCX0KKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWNvbmZpZ19saW5lbnIrKzsKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQljb25maWdfZmlsZSA9IE5VTEw7CisJCQljID0gJ1xuJzsKKwkJfQorCX0KKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGNoYXIgKnBhcnNlX3ZhbHVlKHZvaWQpCit7CisJc3RhdGljIGNoYXIgdmFsdWVbMTAyNF07CisJaW50IHF1b3RlID0gMCwgY29tbWVudCA9IDAsIGxlbiA9IDAsIHNwYWNlID0gMDsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChsZW4gPj0gc2l6ZW9mKHZhbHVlKSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAocXVvdGUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl2YWx1ZVtsZW5dID0gMDsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlpZiAoY29tbWVudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaXNzcGFjZShjKSAmJiAhcXVvdGUpIHsKKwkJCXNwYWNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcXVvdGUpIHsKKwkJCWlmIChjID09ICc7JyB8fCBjID09ICcjJykgeworCQkJCWNvbW1lbnQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChzcGFjZSkgeworCQkJaWYgKGxlbikKKwkJCQl2YWx1ZVtsZW4rK10gPSAnICc7CisJCQlzcGFjZSA9IDA7CisJCX0KKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXG4nOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSAndCc6CisJCQkJYyA9ICdcdCc7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQljID0gJ1xiJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWMgPSAnXG4nOworCQkJCWJyZWFrOworCQkJLyogU29tZSBjaGFyYWN0ZXJzIGVzY2FwZSBhcyB0aGVtc2VsdmVzICovCisJCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJCWJyZWFrOworCQkJLyogUmVqZWN0IHVua25vd24gZXNjYXBlIHNlcXVlbmNlcyAqLworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXZhbHVlW2xlbisrXSA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnIicpIHsKKwkJCXF1b3RlID0gMS1xdW90ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhbHVlW2xlbisrXSA9IGM7CisJfQorfQorCitzdGF0aWMgaW50IGdldF92YWx1ZShjb25maWdfZm5fdCBmbiwgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgYzsKKwljaGFyICp2YWx1ZTsKKworCS8qIEdldCB0aGUgZnVsbCBuYW1lICovCisJZm9yICg7OykgeworCQljID0gZ2V0X25leHRfY2hhcigpOworCQlpZiAoYyA9PSBFT0YpCisJCQlicmVhazsKKwkJaWYgKCFpc2FsbnVtKGMpKQorCQkJYnJlYWs7CisJCW5hbWVbbGVuKytdID0gdG9sb3dlcihjKTsKKwkJaWYgKGxlbiA+PSBNQVhOQU1FKQorCQkJcmV0dXJuIC0xOworCX0KKwluYW1lW2xlbl0gPSAwOworCXdoaWxlIChjID09ICcgJyB8fCBjID09ICdcdCcpCisJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisKKwl2YWx1ZSA9IE5VTEw7CisJaWYgKGMgIT0gJ1xuJykgeworCQlpZiAoYyAhPSAnPScpCisJCQlyZXR1cm4gLTE7CisJCXZhbHVlID0gcGFyc2VfdmFsdWUoKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGZuKG5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBnZXRfZXh0ZW5kZWRfYmFzZV92YXIoY2hhciAqbmFtZSwgaW50IGJhc2VsZW4sIGludCBjKQoreworCWRvIHsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwl9IHdoaWxlIChpc3NwYWNlKGMpKTsKKworCS8qIFdlIHJlcXVpcmUgdGhlIGZvcm1hdCB0byBiZSAnW2Jhc2UgImV4dGVuc2lvbiJdJyAqLworCWlmIChjICE9ICciJykKKwkJcmV0dXJuIC0xOworCW5hbWVbYmFzZWxlbisrXSA9ICcuJzsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjID09ICdcbicpCisJCQlyZXR1cm4gLTE7CisJCWlmIChjID09ICciJykKKwkJCWJyZWFrOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQljID0gZ2V0X25leHRfY2hhcigpOworCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJbmFtZVtiYXNlbGVuKytdID0gYzsKKwkJaWYgKGJhc2VsZW4gPiBNQVhOQU1FIC8gMikKKwkJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGaW5hbCAnXScgKi8KKwlpZiAoZ2V0X25leHRfY2hhcigpICE9ICddJykKKwkJcmV0dXJuIC0xOworCXJldHVybiBiYXNlbGVuOworfQorCitzdGF0aWMgaW50IGdldF9iYXNlX3ZhcihjaGFyICpuYW1lKQoreworCWludCBiYXNlbGVuID0gMDsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjID09IEVPRikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJ10nKQorCQkJcmV0dXJuIGJhc2VsZW47CisJCWlmIChpc3NwYWNlKGMpKQorCQkJcmV0dXJuIGdldF9leHRlbmRlZF9iYXNlX3ZhcihuYW1lLCBiYXNlbGVuLCBjKTsKKwkJaWYgKCFpc2FsbnVtKGMpICYmIGMgIT0gJy4nKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYmFzZWxlbiA+IE1BWE5BTUUgLyAyKQorCQkJcmV0dXJuIC0xOworCQluYW1lW2Jhc2VsZW4rK10gPSB0b2xvd2VyKGMpOworCX0KK30KKworc3RhdGljIGludCBnaXRfcGFyc2VfZmlsZShjb25maWdfZm5fdCBmbikKK3sKKwlpbnQgY29tbWVudCA9IDA7CisJaW50IGJhc2VsZW4gPSAwOworCXN0YXRpYyBjaGFyIHZhcltNQVhOQU1FXTsKKworCWZvciAoOzspIHsKKwkJaW50IGMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjID09ICdcbicpIHsKKwkJCS8qIEVPRj8gKi8KKwkJCWlmICghY29uZmlnX2ZpbGUpCisJCQkJcmV0dXJuIDA7CisJCQljb21tZW50ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb21tZW50IHx8IGlzc3BhY2UoYykpCisJCQljb250aW51ZTsKKwkJaWYgKGMgPT0gJyMnIHx8IGMgPT0gJzsnKSB7CisJCQljb21tZW50ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdbJykgeworCQkJYmFzZWxlbiA9IGdldF9iYXNlX3Zhcih2YXIpOworCQkJaWYgKGJhc2VsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCXZhcltiYXNlbGVuKytdID0gJy4nOworCQkJdmFyW2Jhc2VsZW5dID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaXNhbHBoYShjKSkKKwkJCWJyZWFrOworCQl2YXJbYmFzZWxlbl0gPSB0b2xvd2VyKGMpOworCQlpZiAoZ2V0X3ZhbHVlKGZuLCB2YXIsIGJhc2VsZW4rMSkgPCAwKQorCQkJYnJlYWs7CisJfQorCWRpZSgiYmFkIGNvbmZpZyBmaWxlIGxpbmUgJWQgaW4gJXMiLCBjb25maWdfbGluZW5yLCBjb25maWdfZmlsZV9uYW1lKTsKK30KKworaW50IGdpdF9jb25maWdfaW50KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJY2hhciAqZW5kOworCQlpbnQgdmFsID0gc3RydG9sKHZhbHVlLCAmZW5kLCAwKTsKKwkJaWYgKCEqZW5kKQorCQkJcmV0dXJuIHZhbDsKKwl9CisJZGllKCJiYWQgY29uZmlnIHZhbHVlIGZvciAnJXMnIGluICVzIiwgbmFtZSwgY29uZmlnX2ZpbGVfbmFtZSk7Cit9CisKK2ludCBnaXRfY29uZmlnX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIDE7CisJaWYgKCEqdmFsdWUpCisJCXJldHVybiAwOworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpKQorCQlyZXR1cm4gMTsKKwlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJmYWxzZSIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAibm8iKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGdpdF9jb25maWdfaW50KG5hbWUsIHZhbHVlKSAhPSAwOworfQorCitpbnQgZ2l0X2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJLyogVGhpcyBuZWVkcyBhIGJldHRlciBuYW1lICovCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5maWxlbW9kZSIpKSB7CisJCXRydXN0X2V4ZWN1dGFibGVfYml0ID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLmlnbm9yZXN0YXQiKSkgeworCQlhc3N1bWVfdW5jaGFuZ2VkID0gZ2l0X2NvbmZpZ19ib29sKHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJjb3JlLnByZWZlcnN5bWxpbmtyZWZzIikpIHsKKwkJcHJlZmVyX3N5bWxpbmtfcmVmcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5sb2dhbGxyZWZ1cGRhdGVzIikpIHsKKwkJbG9nX2FsbF9yZWZfdXBkYXRlcyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS53YXJuYW1iaWd1b3VzcmVmcyIpKSB7CisJCXdhcm5fYW1iaWd1b3VzX3JlZnMgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3RyY21wKHZhciwgImNvcmUubGVnYWN5aGVhZGVycyIpKSB7CisJCXVzZV9sZWdhY3lfaGVhZGVycyA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAiY29yZS5jb21wcmVzc2lvbiIpKSB7CisJCWludCBsZXZlbCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlpZiAobGV2ZWwgPT0gLTEpCisJCQlsZXZlbCA9IFpfREVGQVVMVF9DT01QUkVTU0lPTjsKKwkJZWxzZSBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gWl9CRVNUX0NPTVBSRVNTSU9OKQorCQkJZGllKCJiYWQgemxpYiBjb21wcmVzc2lvbiBsZXZlbCAlZCIsIGxldmVsKTsKKwkJemxpYl9jb21wcmVzc2lvbl9sZXZlbCA9IGxldmVsOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ1c2VyLm5hbWUiKSkgeworCQlzdHJsY3B5KGdpdF9kZWZhdWx0X25hbWUsIHZhbHVlLCBzaXplb2YoZ2l0X2RlZmF1bHRfbmFtZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJ1c2VyLmVtYWlsIikpIHsKKwkJc3RybGNweShnaXRfZGVmYXVsdF9lbWFpbCwgdmFsdWUsIHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXN0cmNtcCh2YXIsICJpMThuLmNvbW1pdGVuY29kaW5nIikpIHsKKwkJc3RybGNweShnaXRfY29tbWl0X2VuY29kaW5nLCB2YWx1ZSwgc2l6ZW9mKGdpdF9jb21taXRfZW5jb2RpbmcpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAodmFyLCAicGFnZXIuY29sb3IiKSkgeworCQlwYWdlcl91c2VfY29sb3IgPSBnaXRfY29uZmlnX2Jvb2wodmFyLHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQWRkIG90aGVyIGNvbmZpZyB2YXJpYWJsZXMgaGVyZSBhbmQgdG8gRG9jdW1lbnRhdGlvbi9jb25maWcudHh0LiAqLworCXJldHVybiAwOworfQorCitpbnQgZ2l0X2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQ7CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisJcmV0ID0gLTE7CisJaWYgKGYpIHsKKwkJY29uZmlnX2ZpbGUgPSBmOworCQljb25maWdfZmlsZV9uYW1lID0gZmlsZW5hbWU7CisJCWNvbmZpZ19saW5lbnIgPSAxOworCQlyZXQgPSBnaXRfcGFyc2VfZmlsZShmbik7CisJCWZjbG9zZShmKTsKKwkJY29uZmlnX2ZpbGVfbmFtZSA9IE5VTEw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBnaXRfY29uZmlnKGNvbmZpZ19mbl90IGZuKQoreworCWludCByZXQgPSAwOworCWNoYXIgKnJlcG9fY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyICpob21lID0gTlVMTCwgKmZpbGVuYW1lOworCisJLyogJEdJVF9DT05GSUcgbWFrZXMgZ2l0IHJlYWQgX29ubHlfIHRoZSBnaXZlbiBjb25maWcgZmlsZSwKKwkgKiAkR0lUX0NPTkZJR19MT0NBTCB3aWxsIG1ha2UgaXQgcHJvY2VzcyBpdCBpbiBhZGRpdGlvbiB0byB0aGUKKwkgKiBnbG9iYWwgY29uZmlnIGZpbGUsIHRoZSBzYW1lIHdheSBpdCB3b3VsZCB0aGUgcGVyLXJlcG9zaXRvcnkKKwkgKiBjb25maWcgZmlsZSBvdGhlcndpc2UuICovCisJZmlsZW5hbWUgPSBnZXRlbnYoIkdJVF9DT05GSUciKTsKKwlpZiAoIWZpbGVuYW1lKSB7CisJCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKKwkJZmlsZW5hbWUgPSBnZXRlbnYoIkdJVF9DT05GSUdfTE9DQUwiKTsKKwkJaWYgKCFmaWxlbmFtZSkKKwkJCWZpbGVuYW1lID0gcmVwb19jb25maWcgPSBzdHJkdXAoZ2l0X3BhdGgoImNvbmZpZyIpKTsKKwl9CisKKwlpZiAoaG9tZSkgeworCQljaGFyICp1c2VyX2NvbmZpZyA9IHN0cmR1cChta3BhdGgoIiVzLy5naXRjb25maWciLCBob21lKSk7CisJCWlmICghYWNjZXNzKHVzZXJfY29uZmlnLCBSX09LKSkKKwkJCXJldCA9IGdpdF9jb25maWdfZnJvbV9maWxlKGZuLCB1c2VyX2NvbmZpZyk7CisJCWZyZWUodXNlcl9jb25maWcpOworCX0KKworCXJldCArPSBnaXRfY29uZmlnX2Zyb21fZmlsZShmbiwgZmlsZW5hbWUpOworCWlmIChyZXBvX2NvbmZpZykKKwkJZnJlZShyZXBvX2NvbmZpZyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZpbmQgYWxsIHRoZSBzdHVmZiBmb3IgZ2l0X2NvbmZpZ19zZXQoKSBiZWxvdy4KKyAqLworCisjZGVmaW5lIE1BWF9NQVRDSEVTIDUxMgorCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgYmFzZWxlbjsKKwljaGFyKiBrZXk7CisJaW50IGRvX25vdF9tYXRjaDsKKwlyZWdleF90KiB2YWx1ZV9yZWdleDsKKwlpbnQgbXVsdGlfcmVwbGFjZTsKKwlvZmZfdCBvZmZzZXRbTUFYX01BVENIRVNdOworCWVudW0geyBTVEFSVCwgU0VDVElPTl9TRUVOLCBTRUNUSU9OX0VORF9TRUVOLCBLRVlfU0VFTiB9IHN0YXRlOworCWludCBzZWVuOworfSBzdG9yZTsKKworc3RhdGljIGludCBtYXRjaGVzKGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJcmV0dXJuICFzdHJjbXAoa2V5LCBzdG9yZS5rZXkpICYmCisJCShzdG9yZS52YWx1ZV9yZWdleCA9PSBOVUxMIHx8CisJCSAoc3RvcmUuZG9fbm90X21hdGNoIF4KKwkJICAhcmVnZXhlYyhzdG9yZS52YWx1ZV9yZWdleCwgdmFsdWUsIDAsIE5VTEwsIDApKSk7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfYXV4KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJc3dpdGNoIChzdG9yZS5zdGF0ZSkgeworCWNhc2UgS0VZX1NFRU46CisJCWlmIChtYXRjaGVzKGtleSwgdmFsdWUpKSB7CisJCQlpZiAoc3RvcmUuc2VlbiA9PSAxICYmIHN0b3JlLm11bHRpX3JlcGxhY2UgPT0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiV2FybmluZzogJXMgaGFzIG11bHRpcGxlIHZhbHVlc1xuIiwKKwkJCQkJa2V5KTsKKwkJCX0gZWxzZSBpZiAoc3RvcmUuc2VlbiA+PSBNQVhfTUFUQ0hFUykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgbWF0Y2hlc1xuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJCXN0b3JlLnNlZW4rKzsKKwkJfQorCQlicmVhazsKKwljYXNlIFNFQ1RJT05fU0VFTjoKKwkJaWYgKHN0cm5jbXAoa2V5LCBzdG9yZS5rZXksIHN0b3JlLmJhc2VsZW4rMSkpIHsKKwkJCXN0b3JlLnN0YXRlID0gU0VDVElPTl9FTkRfU0VFTjsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCS8qIGRvIG5vdCBpbmNyZW1lbnQgbWF0Y2hlczogdGhpcyBpcyBubyBtYXRjaCAqLworCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkvKiBmYWxsdGhydSAqLworCWNhc2UgU0VDVElPTl9FTkRfU0VFTjoKKwljYXNlIFNUQVJUOgorCQlpZiAobWF0Y2hlcyhrZXksIHZhbHVlKSkgeworCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJc3RvcmUuc3RhdGUgPSBLRVlfU0VFTjsKKwkJCXN0b3JlLnNlZW4rKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChzdHJyY2hyKGtleSwgJy4nKSAtIGtleSA9PSBzdG9yZS5iYXNlbGVuICYmCisJCQkgICAgICAhc3RybmNtcChrZXksIHN0b3JlLmtleSwgc3RvcmUuYmFzZWxlbikpIHsKKwkJCQkJc3RvcmUuc3RhdGUgPSBTRUNUSU9OX1NFRU47CisJCQkJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfd3JpdGVfc2VjdGlvbihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSkKK3sKKwljb25zdCBjaGFyICpkb3QgPSBzdHJjaHIoa2V5LCAnLicpOworCWludCBsZW4xID0gc3RvcmUuYmFzZWxlbiwgbGVuMiA9IC0xOworCisJZG90ID0gc3RyY2hyKGtleSwgJy4nKTsKKwlpZiAoZG90KSB7CisJCWludCBkb3RsZW4gPSBkb3QgLSBrZXk7CisJCWlmIChkb3RsZW4gPCBsZW4xKSB7CisJCQlsZW4yID0gbGVuMSAtIGRvdGxlbiAtIDE7CisJCQlsZW4xID0gZG90bGVuOworCQl9CisJfQorCisJd3JpdGUoZmQsICJbIiwgMSk7CisJd3JpdGUoZmQsIGtleSwgbGVuMSk7CisJaWYgKGxlbjIgPj0gMCkgeworCQl3cml0ZShmZCwgIiBcIiIsIDIpOworCQl3aGlsZSAoLS1sZW4yID49IDApIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICorK2RvdDsKKwkJCWlmIChjID09ICciJykKKwkJCQl3cml0ZShmZCwgIlxcIiwgMSk7CisJCQl3cml0ZShmZCwgJmMsIDEpOworCQl9CisJCXdyaXRlKGZkLCAiXCIiLCAxKTsKKwl9CisJd3JpdGUoZmQsICJdXG4iLCAyKTsKK30KKworc3RhdGljIHZvaWQgc3RvcmVfd3JpdGVfcGFpcihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpCit7CisJaW50IGk7CisKKwl3cml0ZShmZCwgIlx0IiwgMSk7CisJd3JpdGUoZmQsIGtleStzdG9yZS5iYXNlbGVuKzEsCisJCXN0cmxlbihrZXkrc3RvcmUuYmFzZWxlbisxKSk7CisJd3JpdGUoZmQsICIgPSAiLCAzKTsKKwlmb3IgKGkgPSAwOyB2YWx1ZVtpXTsgaSsrKQorCQlzd2l0Y2ggKHZhbHVlW2ldKSB7CisJCWNhc2UgJ1xuJzogd3JpdGUoZmQsICJcXG4iLCAyKTsgYnJlYWs7CisJCWNhc2UgJ1x0Jzogd3JpdGUoZmQsICJcXHQiLCAyKTsgYnJlYWs7CisJCWNhc2UgJyInOiBjYXNlICdcXCc6IHdyaXRlKGZkLCAiXFwiLCAxKTsKKwkJZGVmYXVsdDogd3JpdGUoZmQsIHZhbHVlK2ksIDEpOworCX0KKwl3cml0ZShmZCwgIlxuIiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9iZWdpbm5pbmdfb2ZfbGluZShjb25zdCBjaGFyKiBjb250ZW50cywgaW50IHNpemUsCisJaW50IG9mZnNldF8sIGludCogZm91bmRfYnJhY2tldCkKK3sKKwlpbnQgZXF1YWxfb2Zmc2V0ID0gc2l6ZSwgYnJhY2tldF9vZmZzZXQgPSBzaXplOworCWludCBvZmZzZXQ7CisKKwlmb3IgKG9mZnNldCA9IG9mZnNldF8tMjsgb2Zmc2V0ID4gMCAKKwkJCSYmIGNvbnRlbnRzW29mZnNldF0gIT0gJ1xuJzsgb2Zmc2V0LS0pCisJCXN3aXRjaCAoY29udGVudHNbb2Zmc2V0XSkgeworCQkJY2FzZSAnPSc6IGVxdWFsX29mZnNldCA9IG9mZnNldDsgYnJlYWs7CisJCQljYXNlICddJzogYnJhY2tldF9vZmZzZXQgPSBvZmZzZXQ7IGJyZWFrOworCQl9CisJaWYgKGJyYWNrZXRfb2Zmc2V0IDwgZXF1YWxfb2Zmc2V0KSB7CisJCSpmb3VuZF9icmFja2V0ID0gMTsKKwkJb2Zmc2V0ID0gYnJhY2tldF9vZmZzZXQrMTsKKwl9IGVsc2UKKwkJb2Zmc2V0Kys7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitpbnQgZ2l0X2NvbmZpZ19zZXQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlyZXR1cm4gZ2l0X2NvbmZpZ19zZXRfbXVsdGl2YXIoa2V5LCB2YWx1ZSwgTlVMTCwgMCk7Cit9CisKKy8qCisgKiBJZiB2YWx1ZT09TlVMTCwgdW5zZXQgaW4gKHJlbW92ZSBmcm9tKSBjb25maWcsCisgKiBpZiB2YWx1ZV9yZWdleCE9TlVMTCwgZGlzcmVnYXJkIGtleS92YWx1ZSBwYWlycyB3aGVyZSB2YWx1ZSBkb2VzIG5vdCBtYXRjaC4KKyAqIGlmIG11bHRpX3JlcGxhY2U9PTAsIG5vdGhpbmcsIG9yIG9ubHkgb25lIG1hdGNoaW5nIGtleS92YWx1ZSBpcyByZXBsYWNlZCwKKyAqICAgICBlbHNlIGFsbCBtYXRjaGluZyBrZXkvdmFsdWVzIChyZWdhcmRsZXNzIGhvdyBtYW55KSBhcmUgcmVtb3ZlZCwKKyAqICAgICBiZWZvcmUgdGhlIG5ldyBwYWlyIGlzIHdyaXR0ZW4uCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoaXM6CisgKgorICogLSBpdCBsb2NrcyB0aGUgY29uZmlnIGZpbGUgYnkgY3JlYXRpbmcgIi5naXQvY29uZmlnLmxvY2siCisgKgorICogLSBpdCB0aGVuIHBhcnNlcyB0aGUgY29uZmlnIHVzaW5nIHN0b3JlX2F1eCgpIGFzIHZhbGlkYXRvciB0byBmaW5kCisgKiAgIHRoZSBwb3NpdGlvbiBvbiB0aGUga2V5L3ZhbHVlIHBhaXIgdG8gcmVwbGFjZS4gSWYgaXQgaXMgdG8gYmUgdW5zZXQsCisgKiAgIGl0IG11c3QgYmUgZm91bmQgZXhhY3RseSBvbmNlLgorICoKKyAqIC0gdGhlIGNvbmZpZyBmaWxlIGlzIG1tYXAoKWVkIGFuZCB0aGUgcGFydCBiZWZvcmUgdGhlIG1hdGNoIChpZiBhbnkpIGlzCisgKiAgIHdyaXR0ZW4gdG8gdGhlIGxvY2sgZmlsZSwgdGhlbiB0aGUgY2hhbmdlZCBwYXJ0IGFuZCB0aGUgcmVzdC4KKyAqCisgKiAtIHRoZSBjb25maWcgZmlsZSBpcyByZW1vdmVkIGFuZCB0aGUgbG9jayBmaWxlIHJlbmFtZSgpZCB0byBpdC4KKyAqCisgKi8KK2ludCBnaXRfY29uZmlnX3NldF9tdWx0aXZhcihjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlLAorCWNvbnN0IGNoYXIqIHZhbHVlX3JlZ2V4LCBpbnQgbXVsdGlfcmVwbGFjZSkKK3sKKwlpbnQgaSwgZG90OworCWludCBmZCA9IC0xLCBpbl9mZDsKKwlpbnQgcmV0OworCWNoYXIqIGNvbmZpZ19maWxlbmFtZTsKKwljaGFyKiBsb2NrX2ZpbGU7CisJY29uc3QgY2hhciogbGFzdF9kb3QgPSBzdHJyY2hyKGtleSwgJy4nKTsKKworCWNvbmZpZ19maWxlbmFtZSA9IGdldGVudigiR0lUX0NPTkZJRyIpOworCWlmICghY29uZmlnX2ZpbGVuYW1lKSB7CisJCWNvbmZpZ19maWxlbmFtZSA9IGdldGVudigiR0lUX0NPTkZJR19MT0NBTCIpOworCQlpZiAoIWNvbmZpZ19maWxlbmFtZSkKKwkJCWNvbmZpZ19maWxlbmFtZSAgPSBnaXRfcGF0aCgiY29uZmlnIik7CisJfQorCWNvbmZpZ19maWxlbmFtZSA9IHN0cmR1cChjb25maWdfZmlsZW5hbWUpOworCWxvY2tfZmlsZSA9IHN0cmR1cChta3BhdGgoIiVzLmxvY2siLCBjb25maWdfZmlsZW5hbWUpKTsKKworCS8qCisJICogU2luY2UgImtleSIgYWN0dWFsbHkgY29udGFpbnMgdGhlIHNlY3Rpb24gbmFtZSBhbmQgdGhlIHJlYWwKKwkgKiBrZXkgbmFtZSBzZXBhcmF0ZWQgYnkgYSBkb3QsIHdlIGhhdmUgdG8ga25vdyB3aGVyZSB0aGUgZG90IGlzLgorCSAqLworCisJaWYgKGxhc3RfZG90ID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJrZXkgZG9lcyBub3QgY29udGFpbiBhIHNlY3Rpb246ICVzXG4iLCBrZXkpOworCQlyZXQgPSAyOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlzdG9yZS5iYXNlbGVuID0gbGFzdF9kb3QgLSBrZXk7CisKKwlzdG9yZS5tdWx0aV9yZXBsYWNlID0gbXVsdGlfcmVwbGFjZTsKKworCS8qCisJICogVmFsaWRhdGUgdGhlIGtleSBhbmQgd2hpbGUgYXQgaXQsIGxvd2VyIGNhc2UgaXQgZm9yIG1hdGNoaW5nLgorCSAqLworCXN0b3JlLmtleSA9IChjaGFyKiltYWxsb2Moc3RybGVuKGtleSkrMSk7CisJZG90ID0gMDsKKwlmb3IgKGkgPSAwOyBrZXlbaV07IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSBrZXlbaV07CisJCWlmIChjID09ICcuJykKKwkJCWRvdCA9IDE7CisJCS8qIExlYXZlIHRoZSBleHRlbmRlZCBiYXNlbmFtZSB1bnRvdWNoZWQuLiAqLworCQlpZiAoIWRvdCB8fCBpID4gc3RvcmUuYmFzZWxlbikgeworCQkJaWYgKCFpc2FsbnVtKGMpIHx8IChpID09IHN0b3JlLmJhc2VsZW4rMSAmJiAhaXNhbHBoYShjKSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQga2V5OiAlc1xuIiwga2V5KTsKKwkJCQlmcmVlKHN0b3JlLmtleSk7CisJCQkJcmV0ID0gMTsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQkJYyA9IHRvbG93ZXIoYyk7CisJCX0KKwkJc3RvcmUua2V5W2ldID0gYzsKKwl9CisJc3RvcmUua2V5W2ldID0gMDsKKworCS8qCisJICogVGhlIGxvY2tfZmlsZSBzZXJ2ZXMgYSBwdXJwb3NlIGluIGFkZGl0aW9uIHRvIGxvY2tpbmc6IHRoZSBuZXcKKwkgKiBjb250ZW50cyBvZiAuZ2l0L2NvbmZpZyB3aWxsIGJlIHdyaXR0ZW4gaW50byBpdC4KKwkgKi8KKwlmZCA9IG9wZW4obG9ja19maWxlLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCWlmIChmZCA8IDAgfHwgYWRqdXN0X3NoYXJlZF9wZXJtKGxvY2tfZmlsZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgbG9jayBjb25maWcgZmlsZVxuIik7CisJCWZyZWUoc3RvcmUua2V5KTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJLyoKKwkgKiBJZiAuZ2l0L2NvbmZpZyBkb2VzIG5vdCBleGlzdCB5ZXQsIHdyaXRlIGEgbWluaW1hbCB2ZXJzaW9uLgorCSAqLworCWluX2ZkID0gb3Blbihjb25maWdfZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIGluX2ZkIDwgMCApIHsKKwkJZnJlZShzdG9yZS5rZXkpOworCisJCWlmICggRU5PRU5UICE9IGVycm5vICkgeworCQkJZXJyb3IoIm9wZW5pbmcgJXM6ICVzIiwgY29uZmlnX2ZpbGVuYW1lLAorCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IDM7IC8qIHNhbWUgYXMgImludmFsaWQgY29uZmlnIGZpbGUiICovCisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCS8qIGlmIG5vdGhpbmcgdG8gdW5zZXQsIGVycm9yIG91dCAqLworCQlpZiAodmFsdWUgPT0gTlVMTCkgeworCQkJcmV0ID0gNTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQlzdG9yZS5rZXkgPSAoY2hhciopa2V5OworCQlzdG9yZV93cml0ZV9zZWN0aW9uKGZkLCBrZXkpOworCQlzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKTsKKwl9IGVsc2V7CisJCXN0cnVjdCBzdGF0IHN0OworCQljaGFyKiBjb250ZW50czsKKwkJaW50IGksIGNvcHlfYmVnaW4sIGNvcHlfZW5kLCBuZXdfbGluZSA9IDA7CisKKwkJaWYgKHZhbHVlX3JlZ2V4ID09IE5VTEwpCisJCQlzdG9yZS52YWx1ZV9yZWdleCA9IE5VTEw7CisJCWVsc2UgeworCQkJaWYgKHZhbHVlX3JlZ2V4WzBdID09ICchJykgeworCQkJCXN0b3JlLmRvX25vdF9tYXRjaCA9IDE7CisJCQkJdmFsdWVfcmVnZXgrKzsKKwkJCX0gZWxzZQorCQkJCXN0b3JlLmRvX25vdF9tYXRjaCA9IDA7CisKKwkJCXN0b3JlLnZhbHVlX3JlZ2V4ID0gKHJlZ2V4X3QqKW1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQkJaWYgKHJlZ2NvbXAoc3RvcmUudmFsdWVfcmVnZXgsIHZhbHVlX3JlZ2V4LAorCQkJCQlSRUdfRVhURU5ERUQpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBhdHRlcm46ICVzXG4iLAorCQkJCQl2YWx1ZV9yZWdleCk7CisJCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQkJcmV0ID0gNjsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQl9CisKKwkJc3RvcmUub2Zmc2V0WzBdID0gMDsKKwkJc3RvcmUuc3RhdGUgPSBTVEFSVDsKKwkJc3RvcmUuc2VlbiA9IDA7CisKKwkJLyoKKwkJICogQWZ0ZXIgdGhpcywgc3RvcmUub2Zmc2V0IHdpbGwgY29udGFpbiB0aGUgKmVuZCogb2Zmc2V0CisJCSAqIG9mIHRoZSBsYXN0IG1hdGNoLCBvciByZW1haW4gYXQgMCBpZiBubyBtYXRjaCB3YXMgZm91bmQuCisJCSAqIEFzIGEgc2lkZSBlZmZlY3QsIHdlIG1ha2Ugc3VyZSB0byB0cmFuc2Zvcm0gb25seSBhIHZhbGlkCisJCSAqIGV4aXN0aW5nIGNvbmZpZyBmaWxlLgorCQkgKi8KKwkJaWYgKGdpdF9jb25maWdfZnJvbV9maWxlKHN0b3JlX2F1eCwgY29uZmlnX2ZpbGVuYW1lKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGNvbmZpZyBmaWxlXG4iKTsKKwkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCWlmIChzdG9yZS52YWx1ZV9yZWdleCAhPSBOVUxMKSB7CisJCQkJcmVnZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQl9CisJCQlyZXQgPSAzOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWZyZWUoc3RvcmUua2V5KTsKKwkJaWYgKHN0b3JlLnZhbHVlX3JlZ2V4ICE9IE5VTEwpIHsKKwkJCXJlZ2ZyZWUoc3RvcmUudmFsdWVfcmVnZXgpOworCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCX0KKworCQkvKiBpZiBub3RoaW5nIHRvIHVuc2V0LCBvciB0b28gbWFueSBtYXRjaGVzLCBlcnJvciBvdXQgKi8KKwkJaWYgKChzdG9yZS5zZWVuID09IDAgJiYgdmFsdWUgPT0gTlVMTCkgfHwKKwkJCQkoc3RvcmUuc2VlbiA+IDEgJiYgbXVsdGlfcmVwbGFjZSA9PSAwKSkgeworCQkJcmV0ID0gNTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQlmc3RhdChpbl9mZCwgJnN0KTsKKwkJY29udGVudHMgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwKKwkJCU1BUF9QUklWQVRFLCBpbl9mZCwgMCk7CisJCWNsb3NlKGluX2ZkKTsKKworCQlpZiAoc3RvcmUuc2VlbiA9PSAwKQorCQkJc3RvcmUuc2VlbiA9IDE7CisKKwkJZm9yIChpID0gMCwgY29weV9iZWdpbiA9IDA7IGkgPCBzdG9yZS5zZWVuOyBpKyspIHsKKwkJCWlmIChzdG9yZS5vZmZzZXRbaV0gPT0gMCkgeworCQkJCXN0b3JlLm9mZnNldFtpXSA9IGNvcHlfZW5kID0gc3Quc3Rfc2l6ZTsKKwkJCX0gZWxzZSBpZiAoc3RvcmUuc3RhdGUgIT0gS0VZX1NFRU4pIHsKKwkJCQljb3B5X2VuZCA9IHN0b3JlLm9mZnNldFtpXTsKKwkJCX0gZWxzZQorCQkJCWNvcHlfZW5kID0gZmluZF9iZWdpbm5pbmdfb2ZfbGluZSgKKwkJCQkJY29udGVudHMsIHN0LnN0X3NpemUsCisJCQkJCXN0b3JlLm9mZnNldFtpXS0yLCAmbmV3X2xpbmUpOworCisJCQkvKiB3cml0ZSB0aGUgZmlyc3QgcGFydCBvZiB0aGUgY29uZmlnICovCisJCQlpZiAoY29weV9lbmQgPiBjb3B5X2JlZ2luKSB7CisJCQkJd3JpdGUoZmQsIGNvbnRlbnRzICsgY29weV9iZWdpbiwKKwkJCQljb3B5X2VuZCAtIGNvcHlfYmVnaW4pOworCQkJCWlmIChuZXdfbGluZSkKKwkJCQkJd3JpdGUoZmQsICJcbiIsIDEpOworCQkJfQorCQkJY29weV9iZWdpbiA9IHN0b3JlLm9mZnNldFtpXTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSBwYWlyICh2YWx1ZSA9PSBOVUxMIG1lYW5zIHVuc2V0KSAqLworCQlpZiAodmFsdWUgIT0gTlVMTCkgeworCQkJaWYgKHN0b3JlLnN0YXRlID09IFNUQVJUKQorCQkJCXN0b3JlX3dyaXRlX3NlY3Rpb24oZmQsIGtleSk7CisJCQlzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSByZXN0IG9mIHRoZSBjb25maWcgKi8KKwkJaWYgKGNvcHlfYmVnaW4gPCBzdC5zdF9zaXplKQorCQkJd3JpdGUoZmQsIGNvbnRlbnRzICsgY29weV9iZWdpbiwKKwkJCQlzdC5zdF9zaXplIC0gY29weV9iZWdpbik7CisKKwkJbXVubWFwKGNvbnRlbnRzLCBzdC5zdF9zaXplKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlbmFtZSk7CisJfQorCisJaWYgKHJlbmFtZShsb2NrX2ZpbGUsIGNvbmZpZ19maWxlbmFtZSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlbmFtZSB0aGUgbG9jayBmaWxlP1xuIik7CisJCXJldCA9IDQ7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcmV0ID0gMDsKKworb3V0X2ZyZWU6CisJaWYgKDAgPD0gZmQpCisJCWNsb3NlKGZkKTsKKwlpZiAoY29uZmlnX2ZpbGVuYW1lKQorCQlmcmVlKGNvbmZpZ19maWxlbmFtZSk7CisJaWYgKGxvY2tfZmlsZSkgeworCQl1bmxpbmsobG9ja19maWxlKTsKKwkJZnJlZShsb2NrX2ZpbGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKZGlmZiAtLWdpdCBhL2NvbmZpZy5tYWsuaW4gYi9jb25maWcubWFrLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjUwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWcubWFrLmluCkBAIC0wLDAgKzEsMjQgQEAKKyMgZ2l0IE1ha2VmaWxlIGNvbmZpZ3VyYXRpb24sIGluY2x1ZGVkIGluIG1haW4gTWFrZWZpbGUKKyMgQGNvbmZpZ3VyZV9pbnB1dEAKKworQ0MgPSBAQ0NACitBUiA9IEBBUkAKK1RBUiA9IEBUQVJACisjSU5TVEFMTCA9IEBJTlNUQUxMQAkJIyBuZWVkcyBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gc291cmNlcworCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitiaW5kaXIgPSBAYmluZGlyQAorI2dpdGV4ZWNkaXIgPSBAbGliZXhlY2RpckAvZ2l0LWNvcmUvCitkYXRhcm9vdGRpciA9IEBkYXRhcm9vdGRpckAKK3RlbXBsYXRlX2RpciA9IEBkYXRhZGlyQC9naXQtY29yZS90ZW1wbGF0ZXMvCitHSVRfUFlUSE9OX0RJUiA9IEBkYXRhZGlyQC9naXQtY29yZS9weXRob24KKworbWFuZGlyPUBtYW5kaXJACisKK3NyY2RpciA9IEBzcmNkaXJACitWUEFUSCA9IEBzcmNkaXJACisKK2V4cG9ydCBleGVjX3ByZWZpeCBtYW5kaXIKK2V4cG9ydCBzcmNkaXIgVlBBVEgKKwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZjc3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWd1cmUuYWMKQEAgLTAsMCArMSwxODMgQEAKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLSBBdXRvY29uZiAtKi0KKyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KKworQUNfUFJFUkVRKDIuNTkpCitBQ19JTklUKFtnaXRdLCBbMS40LjFdLCBbZ2l0QHZnZXIua2VybmVsLm9yZ10pCisKK0FDX0NPTkZJR19TUkNESVIoW2dpdC5jXSkKKworY29uZmlnX2ZpbGU9Y29uZmlnLm1hay5hdXRvZ2VuCitjb25maWdfYXBwZW5kPWNvbmZpZy5tYWsuYXBwZW5kCitjb25maWdfaW49Y29uZmlnLm1hay5pbgorCitlY2hvICIjICR7Y29uZmlnX2FwcGVuZH0uICBHZW5lcmF0ZWQgYnkgY29uZmlndXJlLiIgPiAiJHtjb25maWdfYXBwZW5kfSIKKworCisjIyBEZWZpbml0aW9ucyBvZiBtYWNyb3MKKyMgR0lUX0NPTkZfQVBQRU5EX0xJTkUoTElORSkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIExJTkUgdG8gZmlsZSAke2NvbmZpZ19hcHBlbmR9CitBQ19ERUZVTihbR0lUX0NPTkZfQVBQRU5EX0xJTkVdLAorW2VjaG8gIiQxIiA+PiAiJHtjb25maWdfYXBwZW5kfSJdKSMgR0lUX0NPTkZfQVBQRU5EX0xJTkUKKworCisjIyBDaGVja3MgZm9yIHByb2dyYW1zLgorQUNfTVNHX05PVElDRShbQ0hFQ0tTIGZvciBwcm9ncmFtc10pCisjCitBQ19QUk9HX0NDCisjQUNfUFJPR19JTlNUQUxMCQkjIG5lZWRzIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBzb3VyY2VzCitBQ19DSEVDS19UT09MKEFSLCBhciwgOikKK0FDX0NIRUNLX1BST0dTKFRBUiwgW2d0YXIgdGFyXSkKKyMKKyMgRGVmaW5lIE5PX1BZVEhPTiBpZiB5b3Ugd2FudCB0byBsb3NlIGFsbCBiZW5lZml0cyBvZiB0aGUgcmVjdXJzaXZlIG1lcmdlLgorCisKKyMjIENoZWNrcyBmb3IgbGlicmFyaWVzLgorQUNfTVNHX05PVElDRShbQ0hFQ0tTIGZvciBsaWJyYXJpZXNdKQorIworIyBEZWZpbmUgTk9fT1BFTlNTTCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiB5b3UgZG8gbm90IGhhdmUgT3BlblNTTC4KKyMgRGVmaW5lIE5FRURTX1NTTF9XSVRIX0NSWVBUTyBpZiB5b3UgbmVlZCAtbGNyeXB0byB3aXRoIC1sc3NsIChEYXJ3aW4pLgorQUNfQ0hFQ0tfTElCKFtzc2xdLCBbU0hBMV9Jbml0XSxbXSwKK1tBQ19DSEVDS19MSUIoW2NyeXB0b10sIFtTSEExX0lOSVRdLAorIFtHSVRfQ09ORl9BUFBFTkRfTElORShORUVEU19TU0xfV0lUSF9DUllQVE89WWVzUGxlYXNlKV0sCisgW0dJVF9DT05GX0FQUEVORF9MSU5FKE5PX09QRU5TU0w9WWVzUGxlYXNlKV0pXSkKKyMKKyMgRGVmaW5lIE5PX0NVUkwgaWYgeW91IGRvIG5vdCBoYXZlIGN1cmwgaW5zdGFsbGVkLiAgZ2l0LWh0dHAtcHVsbCBhbmQKKyMgZ2l0LWh0dHAtcHVzaCBhcmUgbm90IGJ1aWx0LCBhbmQgeW91IGNhbm5vdCB1c2UgaHR0cDovLyBhbmQgaHR0cHM6Ly8KKyMgdHJhbnNwb3J0cy4KK0FDX0NIRUNLX0xJQihbY3VybF0sIFtjdXJsX2dsb2JhbF9pbml0XSxbXSwKK1tHSVRfQ09ORl9BUFBFTkRfTElORShOT19DVVJMPVllc1BsZWFzZSldKQorIworIyBEZWZpbmUgTk9fRVhQQVQgaWYgeW91IGRvIG5vdCBoYXZlIGV4cGF0IGluc3RhbGxlZC4gIGdpdC1odHRwLXB1c2ggaXMKKyMgbm90IGJ1aWx0LCBhbmQgeW91IGNhbm5vdCBwdXNoIHVzaW5nIGh0dHA6Ly8gYW5kIGh0dHBzOi8vIHRyYW5zcG9ydHMuCitBQ19DSEVDS19MSUIoW2V4cGF0XSwgW1hNTF9QYXJzZXJDcmVhdGVdLFtdLAorW0dJVF9DT05GX0FQUEVORF9MSU5FKE5PX0VYUEFUPVllc1BsZWFzZSldKQorIworIyBEZWZpbmUgTkVFRFNfTElCSUNPTlYgaWYgbGlua2luZyB3aXRoIGxpYmMgaXMgbm90IGVub3VnaCAoRGFyd2luKS4KK0FDX0NIRUNLX0xJQihbY10sIFtpY29udl0sW10sCitbQUNfQ0hFQ0tfTElCKFtpY29udl0sW2ljb252XSwKKyBbR0lUX0NPTkZfQVBQRU5EX0xJTkUoTkVFRFNfTElCSUNPTlY9WWVzUGxlYXNlKV0sW10pXSkKKyMKKyMgRGVmaW5lIE5FRURTX1NPQ0tFVCBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChTdW5PUywKKyMgUGF0cmljayBNYXVyaXR6KS4KK0FDX0NIRUNLX0xJQihbY10sIFtzb2NrZXRdLFtdLAorW0FDX0NIRUNLX0xJQihbc29ja2V0XSxbc29ja2V0XSwKKyBbR0lUX0NPTkZfQVBQRU5EX0xJTkUoTkVFRFNfU09DS0VUPVllc1BsZWFzZSldLFtdKV0pCisKKworIyMgQ2hlY2tzIGZvciBoZWFkZXIgZmlsZXMuCisKKworIyMgQ2hlY2tzIGZvciB0eXBlZGVmcywgc3RydWN0dXJlcywgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcy4KK0FDX01TR19OT1RJQ0UoW0NIRUNLUyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMsIGFuZCBjb21waWxlciBjaGFyYWN0ZXJpc3RpY3NdKQorIworIyBEZWZpbmUgTk9fRF9JTk9fSU5fRElSRU5UIGlmIHlvdSBkb24ndCBoYXZlIGRfaW5vIGluIHlvdXIgc3RydWN0IGRpcmVudC4KK0FDX0NIRUNLX01FTUJFUihzdHJ1Y3QgZGlyZW50LmRfaW5vLFtdLAorW0dJVF9DT05GX0FQUEVORF9MSU5FKE5PX0RfSU5PX0lOX0RJUkVOVD1ZZXNQbGVhc2UpXSwKK1sjaW5jbHVkZSA8ZGlyZW50Lmg+XSkKKyMKKyMgRGVmaW5lIE5PX0RfVFlQRV9JTl9ESVJFTlQgaWYgeW91ciBwbGF0Zm9ybSBkZWZpbmVzIERUX1VOS05PV04gYnV0IGxhY2tzCisjIGRfdHlwZSBpbiBzdHJ1Y3QgZGlyZW50IChsYXRlc3QgQ3lnd2luIC0tIHdpbGwgYmUgZml4ZWQgc29vbmlzaCkuCitBQ19DSEVDS19NRU1CRVIoc3RydWN0IGRpcmVudC5kX3R5cGUsW10sCitbR0lUX0NPTkZfQVBQRU5EX0xJTkUoTk9fRF9UWVBFX0lOX0RJUkVOVD1ZZXNQbGVhc2UpXSwKK1sjaW5jbHVkZSA8ZGlyZW50Lmg+XSkKKyMKKyMgRGVmaW5lIE5PX1NPQ0tBRERSX1NUT1JBR0UgaWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIHN0cnVjdAorIyBzb2NrYWRkcl9zdG9yYWdlLgorQUNfQ0hFQ0tfVFlQRShzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSxbXSwKK1tHSVRfQ09ORl9BUFBFTkRfTElORShOT19TT0NLQUREUl9TVE9SQUdFPVllc1BsZWFzZSldLAorWyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+XSkKKworCisjIyBDaGVja3MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zLgorIyMgKGluIGRlZmF1bHQgQyBsaWJyYXJ5IGFuZCBsaWJyYXJpZXMgY2hlY2tlZCBieSBBQ19DSEVDS19MSUIpCitBQ19NU0dfTk9USUNFKFtDSEVDS1MgZm9yIGxpYnJhcnkgZnVuY3Rpb25zXSkKKyMKKyMgRGVmaW5lIE5PX1NUUkNBU0VTVFIgaWYgeW91IGRvbid0IGhhdmUgc3RyY2FzZXN0ci4KK0FDX0NIRUNLX0ZVTkMoc3RyY2FzZXN0cixbXSwKK1tHSVRfQ09ORl9BUFBFTkRfTElORShOT19TVFJDQVNFU1RSPVllc1BsZWFzZSldKQorIworIyBEZWZpbmUgTk9fU1RSTENQWSBpZiB5b3UgZG9uJ3QgaGF2ZSBzdHJsY3B5LgorQUNfQ0hFQ0tfRlVOQyhzdHJsY3B5LFtdLAorW0dJVF9DT05GX0FQUEVORF9MSU5FKE5PX1NUUkxDUFk9WWVzUGxlYXNlKV0pCisjCisjIERlZmluZSBOT19TRVRFTlYgaWYgeW91IGRvbid0IGhhdmUgc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCitBQ19DSEVDS19GVU5DKHNldGVudixbXSwKK1tHSVRfQ09ORl9BUFBFTkRfTElORShOT19TRVRFTlY9WWVzUGxlYXNlKV0pCisjCisjIERlZmluZSBOT19NTUFQIGlmIHlvdSB3YW50IHRvIGF2b2lkIG1tYXAuCisjCisjIERlZmluZSBOT19JUFY2IGlmIHlvdSBsYWNrIElQdjYgc3VwcG9ydCBhbmQgZ2V0YWRkcmluZm8oKS4KKyMKKyMgRGVmaW5lIE5PX0lDT05WIGlmIHlvdXIgbGliYyBkb2VzIG5vdCBwcm9wZXJseSBzdXBwb3J0IGljb252LgorCisKKyMjIE90aGVyIGNoZWNrcy4KKyMgRGVmaW5lIFVTRV9QSUMgaWYgeW91IG5lZWQgdGhlIG1haW4gZ2l0IG9iamVjdHMgdG8gYmUgYnVpbHQgd2l0aCAtZlBJQworIyBpbiBvcmRlciB0byBidWlsZCBhbmQgbGluayBwZXJsL0dpdC5zby4gIHg4Ni02NCBzZWVtcyB0byBuZWVkIHRoaXMuCisjCisjIERlZmluZSBOT19TWU1MSU5LX0hFQUQgaWYgeW91IG5ldmVyIHdhbnQgLmdpdC9IRUFEIHRvIGJlIGEgc3ltYm9saWMgbGluay4KKyMgRW5hYmxlIGl0IG9uIFdpbmRvd3MuICBCeSBkZWZhdWx0LCBzeW1yZWZzIGFyZSBzdGlsbCB1c2VkLgorIworIyBEZWZpbmUgV0lUSF9PV05fU1VCUFJPQ0VTU19QWSBpZiB5b3Ugd2FudCB0byB1c2Ugd2l0aCBweXRob24gMi4zLgorIworIyBEZWZpbmUgTk9fQUNDVVJBVEVfRElGRiBpZiB5b3VyIGRpZmYgcHJvZ3JhbSBhdCBsZWFzdCBzb21ldGltZXMgbWlzc2VzCisjIGEgbWlzc2luZyBuZXdsaW5lIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKKworIyMgU2l0ZSBjb25maWd1cmF0aW9uCisjIyAtLXdpdGgtUEFDS0FHRVs9QVJHXSBhbmQgLS13aXRob3V0LVBBQ0tBR0UKKyMgRGVmaW5lIE5PX1NWTl9URVNUUyBpZiB5b3Ugd2FudCB0byBza2lwIHRpbWUtY29uc3VtaW5nIFNWTiBpbnRlcm9wYWJpbGl0eQorIyB0ZXN0cy4gIFRoZXNlIHRlc3RzIHRha2UgdXAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGhlIHRvdGFsIHRlc3QgdGltZQorIyBidXQgYXJlIG5vdCBuZWVkZWQgdW5sZXNzIHlvdSBwbGFuIHRvIHRhbGsgdG8gU1ZOIHJlcG9zLgorIworIyBEZWZpbmUgTU9aSUxMQV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgY29taW5nIGZyb20gTW96aWxsYS4gSXQgaXMgR1BMJ2QgYW5kIHNob3VsZCBiZSBmYXN0CisjIG9uIG5vbi14ODYgYXJjaGl0ZWN0dXJlcyAoZS5nLiBQb3dlclBDKSwgd2hpbGUgdGhlIE9wZW5TU0wgdmVyc2lvbiAoZGVmYXVsdAorIyBjaG9pY2UpIGhhcyB2ZXJ5IGZhc3QgdmVyc2lvbiBvcHRpbWl6ZWQgZm9yIGk1ODYuCisjCisjIERlZmluZSBQUENfU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIG9wdGltaXplZCBmb3IgUG93ZXJQQy4KKyMKKyMgRGVmaW5lIEFSTV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBBUk0uCisjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBOT19DVVJMIGlmIHlvdSBkbyBub3QgaGF2ZSBjdXJsIGluc3RhbGxlZC4gIGdpdC1odHRwLXB1bGwgYW5kCisjIGdpdC1odHRwLXB1c2ggYXJlIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgdXNlIGh0dHA6Ly8gYW5kIGh0dHBzOi8vCisjIHRyYW5zcG9ydHMuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIE5PX0VYUEFUIGlmIHlvdSBkbyBub3QgaGF2ZSBleHBhdCBpbnN0YWxsZWQuICBnaXQtaHR0cC1wdXNoIGlzCisjIG5vdCBidWlsdCwgYW5kIHlvdSBjYW5ub3QgcHVzaCB1c2luZyBodHRwOi8vIGFuZCBodHRwczovLyB0cmFuc3BvcnRzLgorIworIyBEZWZpbmUgTk9fTU1BUCBpZiB5b3Ugd2FudCB0byBhdm9pZCBtbWFwLgorIworIyBEZWZpbmUgTk9fUFlUSE9OIGlmIHlvdSB3YW50IHRvIGxvb3NlIGFsbCBiZW5lZml0cyBvZiB0aGUgcmVjdXJzaXZlIG1lcmdlLgorIworIyMgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSBhbmQgLS1kaXNhYmxlLUZFQVRVUkUKKyMgRGVmaW5lIENPTExJU0lPTl9DSEVDSyBiZWxvdyBpZiB5b3UgYmVsaWV2ZSB0aGF0IFNIQTEncworIyAxNDYxNTAxNjM3MzMwOTAyOTE4MjAzNjg0ODMyNzE2MjgzMDE5NjU1OTMyNTQyOTc2IGhhc2hlcyBkbyBub3QgZ2l2ZSB5b3UKKyMgc3VmZmljaWVudCBndWFyYW50ZWUgdGhhdCBubyBjb2xsaXNpb25zIGJldHdlZW4gb2JqZWN0cyB3aWxsIGV2ZXIgaGFwcGVuLgorIworIyBEZWZpbmUgVVNFX05TRUMgYmVsb3cgaWYgeW91IHdhbnQgZ2l0IHRvIGNhcmUgYWJvdXQgc3ViLXNlY29uZCBmaWxlIG10aW1lcworIyBhbmQgY3RpbWVzLiBOb3RlIHRoYXQgeW91IG5lZWQgcmVjZW50IGdsaWJjIChhdCBsZWFzdCAyLjIuNCkgZm9yIHRoaXMsIGFuZAorIyBpdCB3aWxsIEJSRUFLIFlPVVIgTE9DQUwgRElGRlMhIHNob3ctZGlmZiBhbmQgYW55dGhpbmcgdXNpbmcgaXQgd2lsbCBsaWtlbHkKKyMgcmFuZG9tbHkgYnJlYWsgdW5sZXNzIHlvdXIgdW5kZXJseWluZyBmaWxlc3lzdGVtIHN1cHBvcnRzIHRob3NlIHN1Yi1zZWNvbmQKKyMgdGltZXMgKG15IGV4dDMgZG9lc24ndCkuCisjCisjIERlZmluZSBVU0VfU1RERVYgYmVsb3cgaWYgeW91IHdhbnQgZ2l0IHRvIGNhcmUgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlCisjIGNoYW5nZSBiZWluZyBjb25zaWRlcmVkIGFuIGlub2RlIGNoYW5nZSBmcm9tIHRoZSB1cGRhdGUtY2FjaGUgcGVyc3BlY3RpdmUuCisKKworIyMgT3V0cHV0IGZpbGVzCitBQ19DT05GSUdfRklMRVMoWyIke2NvbmZpZ19maWxlfSI6IiR7Y29uZmlnX2lufSI6IiR7Y29uZmlnX2FwcGVuZH0iXSkKK0FDX09VVFBVVAorCisKKyMjIENsZWFudXAKK3JtIC1mICIke2NvbmZpZ19hcHBlbmR9IgpkaWZmIC0tZ2l0IGEvY29ubmVjdC5jIGIvY29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MjJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0LmMKQEAgLTAsMCArMSw3NTAgQEAKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyBjaGFyICpzZXJ2ZXJfY2FwYWJpbGl0aWVzID0gTlVMTDsKKworc3RhdGljIGludCBjaGVja19yZWYoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICghZmxhZ3MpCisJCXJldHVybiAxOworCisJaWYgKGxlbiA+IDQ1IHx8IG1lbWNtcChuYW1lLCAicmVmcy8iLCA1KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTa2lwIHRoZSAicmVmcy8iIHBhcnQgKi8KKwluYW1lICs9IDU7CisJbGVuIC09IDU7CisKKwkvKiBSRUZfTk9STUFMIG1lYW5zIHRoYXQgd2UgZG9uJ3Qgd2FudCB0aGUgbWFnaWMgZmFrZSB0YWcgcmVmcyAqLworCWlmICgoZmxhZ3MgJiBSRUZfTk9STUFMKSAmJiBjaGVja19yZWZfZm9ybWF0KG5hbWUpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSRUZfSEVBRFMgbWVhbnMgdGhhdCB3ZSB3YW50IHJlZ3VsYXIgYnJhbmNoIGhlYWRzICovCisJaWYgKChmbGFncyAmIFJFRl9IRUFEUykgJiYgIW1lbWNtcChuYW1lLCAiaGVhZHMvIiwgNikpCisJCXJldHVybiAxOworCisJLyogUkVGX1RBR1MgbWVhbnMgdGhhdCB3ZSB3YW50IHRhZ3MgKi8KKwlpZiAoKGZsYWdzICYgUkVGX1RBR1MpICYmICFtZW1jbXAobmFtZSwgInRhZ3MvIiwgNSkpCisJCXJldHVybiAxOworCisJLyogQWxsIHR5cGUgYml0cyBjbGVhciBtZWFucyB0aGF0IHdlIGFyZSBvayB3aXRoIGFueXRoaW5nICovCisJcmV0dXJuICEoZmxhZ3MgJiB+UkVGX05PUk1BTCk7Cit9CisKKy8qCisgKiBSZWFkIGFsbCB0aGUgcmVmcyBmcm9tIHRoZSBvdGhlciBlbmQKKyAqLworc3RydWN0IHJlZiAqKmdldF9yZW1vdGVfaGVhZHMoaW50IGluLCBzdHJ1Y3QgcmVmICoqbGlzdCwKKwkJCSAgICAgIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoLAorCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCSpsaXN0ID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCByZWYgKnJlZjsKKwkJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJCXN0YXRpYyBjaGFyIGJ1ZmZlclsxMDAwXTsKKwkJY2hhciAqbmFtZTsKKwkJaW50IGxlbiwgbmFtZV9sZW47CisKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisJCWlmICghbGVuKQorCQkJYnJlYWs7CisJCWlmIChidWZmZXJbbGVuLTFdID09ICdcbicpCisJCQlidWZmZXJbLS1sZW5dID0gMDsKKworCQlpZiAobGVuIDwgNDIgfHwgZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgb2xkX3NoYTEpIHx8IGJ1ZmZlcls0MF0gIT0gJyAnKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgc2hhL3JlZiwgZ290ICclcyciLCBidWZmZXIpOworCQluYW1lID0gYnVmZmVyICsgNDE7CisKKwkJbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJCWlmIChsZW4gIT0gbmFtZV9sZW4gKyA0MSkgeworCQkJaWYgKHNlcnZlcl9jYXBhYmlsaXRpZXMpCisJCQkJZnJlZShzZXJ2ZXJfY2FwYWJpbGl0aWVzKTsKKwkJCXNlcnZlcl9jYXBhYmlsaXRpZXMgPSBzdHJkdXAobmFtZSArIG5hbWVfbGVuICsgMSk7CisJCX0KKworCQlpZiAoIWNoZWNrX3JlZihuYW1lLCBuYW1lX2xlbiwgZmxhZ3MpKQorCQkJY29udGludWU7CisJCWlmIChucl9tYXRjaCAmJiAhcGF0aF9tYXRjaChuYW1lLCBucl9tYXRjaCwgbWF0Y2gpKQorCQkJY29udGludWU7CisJCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpICsgbGVuIC0gNDApOworCQltZW1jcHkocmVmLT5vbGRfc2hhMSwgb2xkX3NoYTEsIDIwKTsKKwkJbWVtY3B5KHJlZi0+bmFtZSwgYnVmZmVyICsgNDEsIGxlbiAtIDQwKTsKKwkJKmxpc3QgPSByZWY7CisJCWxpc3QgPSAmcmVmLT5uZXh0OworCX0KKwlyZXR1cm4gbGlzdDsKK30KKworaW50IHNlcnZlcl9zdXBwb3J0cyhjb25zdCBjaGFyICpmZWF0dXJlKQoreworCXJldHVybiBzZXJ2ZXJfY2FwYWJpbGl0aWVzICYmCisJCXN0cnN0cihzZXJ2ZXJfY2FwYWJpbGl0aWVzLCBmZWF0dXJlKSAhPSBOVUxMOworfQorCitpbnQgZ2V0X2FjayhpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJaW50IGxlbiA9IHBhY2tldF9yZWFkX2xpbmUoZmQsIGxpbmUsIHNpemVvZihsaW5lKSk7CisKKwlpZiAoIWxlbikKKwkJZGllKCJnaXQtZmV0Y2gtcGFjazogZXhwZWN0ZWQgQUNLL05BSywgZ290IEVPRiIpOworCWlmIChsaW5lW2xlbi0xXSA9PSAnXG4nKQorCQlsaW5lWy0tbGVuXSA9IDA7CisJaWYgKCFzdHJjbXAobGluZSwgIk5BSyIpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXN0cm5jbXAobGluZSwgIkFDSyAiLCA0KSkgeworCQlpZiAoIWdldF9zaGExX2hleChsaW5lKzQsIHJlc3VsdF9zaGExKSkgeworCQkJaWYgKHN0cnN0cihsaW5lKzQ1LCAiY29udGludWUiKSkKKwkJCQlyZXR1cm4gMjsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWRpZSgiZ2l0LWZldGNoX3BhY2s6IGV4cGVjdGVkIEFDSy9OQUssIGdvdCAnJXMnIiwgbGluZSk7Cit9CisKK2ludCBwYXRoX21hdGNoKGNvbnN0IGNoYXIgKnBhdGgsIGludCBuciwgY2hhciAqKm1hdGNoKQoreworCWludCBpOworCWludCBwYXRobGVuID0gc3RybGVuKHBhdGgpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJY2hhciAqcyA9IG1hdGNoW2ldOworCQlpbnQgbGVuID0gc3RybGVuKHMpOworCisJCWlmICghbGVuIHx8IGxlbiA+IHBhdGhsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChwYXRoICsgcGF0aGxlbiAtIGxlbiwgcywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocGF0aGxlbiA+IGxlbiAmJiBwYXRoW3BhdGhsZW4gLSBsZW4gLSAxXSAhPSAnLycpCisJCQljb250aW51ZTsKKwkJKnMgPSAwOworCQlyZXR1cm4gKGkgKyAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCByZWZzcGVjIHsKKwljaGFyICpzcmM7CisJY2hhciAqZHN0OworCWNoYXIgZm9yY2U7Cit9OworCisvKgorICogQTpCIG1lYW5zIGZhc3QgZm9yd2FyZCByZW1vdGUgQiB3aXRoIGxvY2FsIEEuCisgKiArQTpCIG1lYW5zIG92ZXJ3cml0ZSByZW1vdGUgQiB3aXRoIGxvY2FsIEEuCisgKiArQSBpcyBhIHNob3J0aGFuZCBmb3IgK0E6QS4KKyAqIEEgaXMgYSBzaG9ydGhhbmQgZm9yIEE6QS4KKyAqLworc3RhdGljIHN0cnVjdCByZWZzcGVjICpwYXJzZV9yZWZfc3BlYyhpbnQgbnJfcmVmc3BlYywgY2hhciAqKnJlZnNwZWMpCit7CisJaW50IGk7CisJc3RydWN0IHJlZnNwZWMgKnJzID0geGNhbGxvYyhzaXplb2YoKnJzKSwgKG5yX3JlZnNwZWMgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3JlZnNwZWM7IGkrKykgeworCQljaGFyICpzcCwgKmRwLCAqZXA7CisJCXNwID0gcmVmc3BlY1tpXTsKKwkJaWYgKCpzcCA9PSAnKycpIHsKKwkJCXJzW2ldLmZvcmNlID0gMTsKKwkJCXNwKys7CisJCX0KKwkJZXAgPSBzdHJjaHIoc3AsICc6Jyk7CisJCWlmIChlcCkgeworCQkJZHAgPSBlcCArIDE7CisJCQkqZXAgPSAwOworCQl9CisJCWVsc2UKKwkJCWRwID0gc3A7CisJCXJzW2ldLnNyYyA9IHNwOworCQlyc1tpXS5kc3QgPSBkcDsKKwl9CisJcnNbbnJfcmVmc3BlY10uc3JjID0gcnNbbnJfcmVmc3BlY10uZHN0ID0gTlVMTDsKKwlyZXR1cm4gcnM7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfcmVmc3BlY19tYXRjaChjb25zdCBjaGFyICpwYXR0ZXJuLAorCQkJICAgICAgIHN0cnVjdCByZWYgKnJlZnMsCisJCQkgICAgICAgc3RydWN0IHJlZiAqKm1hdGNoZWRfcmVmKQoreworCWludCBtYXRjaDsKKwlpbnQgcGF0bGVuID0gc3RybGVuKHBhdHRlcm4pOworCisJZm9yIChtYXRjaCA9IDA7IHJlZnM7IHJlZnMgPSByZWZzLT5uZXh0KSB7CisJCWNoYXIgKm5hbWUgPSByZWZzLT5uYW1lOworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJaWYgKG5hbWVsZW4gPCBwYXRsZW4gfHwKKwkJICAgIG1lbWNtcChuYW1lICsgbmFtZWxlbiAtIHBhdGxlbiwgcGF0dGVybiwgcGF0bGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmFtZWxlbiAhPSBwYXRsZW4gJiYgbmFtZVtuYW1lbGVuIC0gcGF0bGVuIC0gMV0gIT0gJy8nKQorCQkJY29udGludWU7CisJCW1hdGNoKys7CisJCSptYXRjaGVkX3JlZiA9IHJlZnM7CisJfQorCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIHZvaWQgbGlua19kc3RfdGFpbChzdHJ1Y3QgcmVmICpyZWYsIHN0cnVjdCByZWYgKioqdGFpbCkKK3sKKwkqKnRhaWwgPSByZWY7CisJKnRhaWwgPSAmcmVmLT5uZXh0OworCSoqdGFpbCA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICp0cnlfZXhwbGljaXRfb2JqZWN0X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuOworCWlmIChnZXRfc2hhMShuYW1lLCBzaGExKSkKKwkJcmV0dXJuIE5VTEw7CisJbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJbWVtY3B5KHJlZi0+bmFtZSwgbmFtZSwgbGVuKTsKKwltZW1jcHkocmVmLT5uZXdfc2hhMSwgc2hhMSwgMjApOworCXJldHVybiByZWY7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfZXhwbGljaXRfcmVmcyhzdHJ1Y3QgcmVmICpzcmMsIHN0cnVjdCByZWYgKmRzdCwKKwkJCSAgICAgICBzdHJ1Y3QgcmVmICoqKmRzdF90YWlsLCBzdHJ1Y3QgcmVmc3BlYyAqcnMpCit7CisJaW50IGksIGVycnM7CisJZm9yIChpID0gZXJycyA9IDA7IHJzW2ldLnNyYzsgaSsrKSB7CisJCXN0cnVjdCByZWYgKm1hdGNoZWRfc3JjLCAqbWF0Y2hlZF9kc3Q7CisKKwkJbWF0Y2hlZF9zcmMgPSBtYXRjaGVkX2RzdCA9IE5VTEw7CisJCXN3aXRjaCAoY291bnRfcmVmc3BlY19tYXRjaChyc1tpXS5zcmMsIHNyYywgJm1hdGNoZWRfc3JjKSkgeworCQljYXNlIDE6CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJLyogVGhlIHNvdXJjZSBjb3VsZCBiZSBpbiB0aGUgZ2V0X3NoYTEoKSBmb3JtYXQKKwkJCSAqIG5vdCBhIHJlZmVyZW5jZSBuYW1lLgorCQkJICovCisJCQltYXRjaGVkX3NyYyA9IHRyeV9leHBsaWNpdF9vYmplY3RfbmFtZShyc1tpXS5zcmMpOworCQkJaWYgKG1hdGNoZWRfc3JjKQorCQkJCWJyZWFrOworCQkJZXJycyA9IDE7CisJCQllcnJvcigic3JjIHJlZnNwZWMgJXMgZG9lcyBub3QgbWF0Y2ggYW55LiIsCisJCQkgICAgICByc1tpXS5zcmMpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJzID0gMTsKKwkJCWVycm9yKCJzcmMgcmVmc3BlYyAlcyBtYXRjaGVzIG1vcmUgdGhhbiBvbmUuIiwKKwkJCSAgICAgIHJzW2ldLnNyYyk7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKGNvdW50X3JlZnNwZWNfbWF0Y2gocnNbaV0uZHN0LCBkc3QsICZtYXRjaGVkX2RzdCkpIHsKKwkJY2FzZSAxOgorCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWlmICghbWVtY21wKHJzW2ldLmRzdCwgInJlZnMvIiwgNSkpIHsKKwkJCQlpbnQgbGVuID0gc3RybGVuKHJzW2ldLmRzdCkgKyAxOworCQkJCW1hdGNoZWRfZHN0ID0geGNhbGxvYygxLCBzaXplb2YoKmRzdCkgKyBsZW4pOworCQkJCW1lbWNweShtYXRjaGVkX2RzdC0+bmFtZSwgcnNbaV0uZHN0LCBsZW4pOworCQkJCWxpbmtfZHN0X3RhaWwobWF0Y2hlZF9kc3QsIGRzdF90YWlsKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAocnNbaV0uc3JjLCByc1tpXS5kc3QpICYmCisJCQkJIG1hdGNoZWRfc3JjKSB7CisJCQkJLyogcHVzaGluZyAibWFzdGVyOm1hc3RlciIgd2hlbgorCQkJCSAqIHJlbW90ZSBkb2VzIG5vdCBoYXZlIG1hc3RlciB5ZXQuCisJCQkJICovCisJCQkJaW50IGxlbiA9IHN0cmxlbihtYXRjaGVkX3NyYy0+bmFtZSkgKyAxOworCQkJCW1hdGNoZWRfZHN0ID0geGNhbGxvYygxLCBzaXplb2YoKmRzdCkgKyBsZW4pOworCQkJCW1lbWNweShtYXRjaGVkX2RzdC0+bmFtZSwgbWF0Y2hlZF9zcmMtPm5hbWUsCisJCQkJICAgICAgIGxlbik7CisJCQkJbGlua19kc3RfdGFpbChtYXRjaGVkX2RzdCwgZHN0X3RhaWwpOworCQkJfQorCQkJZWxzZSB7CisJCQkJZXJycyA9IDE7CisJCQkJZXJyb3IoImRzdCByZWZzcGVjICVzIGRvZXMgbm90IG1hdGNoIGFueSAiCisJCQkJICAgICAgImV4aXN0aW5nIHJlZiBvbiB0aGUgcmVtb3RlIGFuZCBkb2VzICIKKwkJCQkgICAgICAibm90IHN0YXJ0IHdpdGggcmVmcy8uIiwgcnNbaV0uZHN0KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJycyA9IDE7CisJCQllcnJvcigiZHN0IHJlZnNwZWMgJXMgbWF0Y2hlcyBtb3JlIHRoYW4gb25lLiIsCisJCQkgICAgICByc1tpXS5kc3QpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGVycnMpCisJCQljb250aW51ZTsKKwkJaWYgKG1hdGNoZWRfZHN0LT5wZWVyX3JlZikgeworCQkJZXJycyA9IDE7CisJCQllcnJvcigiZHN0IHJlZiAlcyByZWNlaXZlcyBmcm9tIG1vcmUgdGhhbiBvbmUgc3JjLiIsCisJCQkgICAgICBtYXRjaGVkX2RzdC0+bmFtZSk7CisJCX0KKwkJZWxzZSB7CisJCQltYXRjaGVkX2RzdC0+cGVlcl9yZWYgPSBtYXRjaGVkX3NyYzsKKwkJCW1hdGNoZWRfZHN0LT5mb3JjZSA9IHJzW2ldLmZvcmNlOworCQl9CisJfQorCXJldHVybiAtZXJyczsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmZpbmRfcmVmX2J5X25hbWUoc3RydWN0IHJlZiAqbGlzdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlmb3IgKCA7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KQorCQlpZiAoIXN0cmNtcChsaXN0LT5uYW1lLCBuYW1lKSkKKwkJCXJldHVybiBsaXN0OworCXJldHVybiBOVUxMOworfQorCitpbnQgbWF0Y2hfcmVmcyhzdHJ1Y3QgcmVmICpzcmMsIHN0cnVjdCByZWYgKmRzdCwgc3RydWN0IHJlZiAqKipkc3RfdGFpbCwKKwkgICAgICAgaW50IG5yX3JlZnNwZWMsIGNoYXIgKipyZWZzcGVjLCBpbnQgYWxsKQoreworCXN0cnVjdCByZWZzcGVjICpycyA9IHBhcnNlX3JlZl9zcGVjKG5yX3JlZnNwZWMsIHJlZnNwZWMpOworCisJaWYgKG5yX3JlZnNwZWMpCisJCXJldHVybiBtYXRjaF9leHBsaWNpdF9yZWZzKHNyYywgZHN0LCBkc3RfdGFpbCwgcnMpOworCisJLyogcGljayB0aGUgcmVtYWluZGVyICovCisJZm9yICggOyBzcmM7IHNyYyA9IHNyYy0+bmV4dCkgeworCQlzdHJ1Y3QgcmVmICpkc3RfcGVlcjsKKwkJaWYgKHNyYy0+cGVlcl9yZWYpCisJCQljb250aW51ZTsKKwkJZHN0X3BlZXIgPSBmaW5kX3JlZl9ieV9uYW1lKGRzdCwgc3JjLT5uYW1lKTsKKwkJaWYgKChkc3RfcGVlciAmJiBkc3RfcGVlci0+cGVlcl9yZWYpIHx8ICghZHN0X3BlZXIgJiYgIWFsbCkpCisJCQljb250aW51ZTsKKwkJaWYgKCFkc3RfcGVlcikgeworCQkJLyogQ3JlYXRlIGEgbmV3IG9uZSBhbmQgbGluayBpdCAqLworCQkJaW50IGxlbiA9IHN0cmxlbihzcmMtPm5hbWUpICsgMTsKKwkJCWRzdF9wZWVyID0geGNhbGxvYygxLCBzaXplb2YoKmRzdF9wZWVyKSArIGxlbik7CisJCQltZW1jcHkoZHN0X3BlZXItPm5hbWUsIHNyYy0+bmFtZSwgbGVuKTsKKwkJCW1lbWNweShkc3RfcGVlci0+bmV3X3NoYTEsIHNyYy0+bmV3X3NoYTEsIDIwKTsKKwkJCWxpbmtfZHN0X3RhaWwoZHN0X3BlZXIsIGRzdF90YWlsKTsKKwkJfQorCQlkc3RfcGVlci0+cGVlcl9yZWYgPSBzcmM7CisJfQorCXJldHVybiAwOworfQorCitlbnVtIHByb3RvY29sIHsKKwlQUk9UT19MT0NBTCA9IDEsCisJUFJPVE9fU1NILAorCVBST1RPX0dJVCwKK307CisKK3N0YXRpYyBlbnVtIHByb3RvY29sIGdldF9wcm90b2NvbChjb25zdCBjaGFyICpuYW1lKQoreworCWlmICghc3RyY21wKG5hbWUsICJzc2giKSkKKwkJcmV0dXJuIFBST1RPX1NTSDsKKwlpZiAoIXN0cmNtcChuYW1lLCAiZ2l0IikpCisJCXJldHVybiBQUk9UT19HSVQ7CisJaWYgKCFzdHJjbXAobmFtZSwgImdpdCtzc2giKSkKKwkJcmV0dXJuIFBST1RPX1NTSDsKKwlpZiAoIXN0cmNtcChuYW1lLCAic3NoK2dpdCIpKQorCQlyZXR1cm4gUFJPVE9fU1NIOworCWRpZSgiSSBkb24ndCBoYW5kbGUgcHJvdG9jb2wgJyVzJyIsIG5hbWUpOworfQorCisjZGVmaW5lIFNUUl8ocykJIyBzCisjZGVmaW5lIFNUUihzKQlTVFJfKHMpCisKKyNpZm5kZWYgTk9fSVBWNgorCisvKgorICogUmV0dXJucyBhIGNvbm5lY3RlZCBzb2NrZXQoKSBmZCwgb3IgZWxzZSBkaWUoKXMuCisgKi8KK3N0YXRpYyBpbnQgZ2l0X3RjcF9jb25uZWN0X3NvY2soY2hhciAqaG9zdCkKK3sKKwlpbnQgc29ja2ZkID0gLTEsIHNhdmVkX2Vycm5vID0gMDsKKwljaGFyICpjb2xvbiwgKmVuZDsKKwljb25zdCBjaGFyICpwb3J0ID0gU1RSKERFRkFVTFRfR0lUX1BPUlQpOworCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpMCwgKmFpOworCWludCBnYWk7CisKKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworCQlpZiAoZW5kKSB7CisJCQkqZW5kID0gMDsKKwkJCWVuZCsrOworCQkJaG9zdCsrOworCQl9IGVsc2UKKwkJCWVuZCA9IGhvc3Q7CisJfSBlbHNlCisJCWVuZCA9IGhvc3Q7CisJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworCisJaWYgKGNvbG9uKSB7CisJCSpjb2xvbiA9IDA7CisJCXBvcnQgPSBjb2xvbiArIDE7CisJfQorCisJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworCisJZ2FpID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpOworCWlmIChnYWkpCisJCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihnYWkpKTsKKworCWZvciAoYWkwID0gYWk7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCXNvY2tmZCA9IHNvY2tldChhaS0+YWlfZmFtaWx5LAorCQkJCWFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKKwkJaWYgKHNvY2tmZCA8IDApIHsKKwkJCXNhdmVkX2Vycm5vID0gZXJybm87CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29ubmVjdChzb2NrZmQsIGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbikgPCAwKSB7CisJCQlzYXZlZF9lcnJubyA9IGVycm5vOworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCXNvY2tmZCA9IC0xOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJZnJlZWFkZHJpbmZvKGFpMCk7CisKKwlpZiAoc29ja2ZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCBhIHNvY2tldCAoJXMpIiwgc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKworCXJldHVybiBzb2NrZmQ7Cit9CisKKyNlbHNlIC8qIE5PX0lQVjYgKi8KKworLyoKKyAqIFJldHVybnMgYSBjb25uZWN0ZWQgc29ja2V0KCkgZmQsIG9yIGVsc2UgZGllKClzLgorICovCitzdGF0aWMgaW50IGdpdF90Y3BfY29ubmVjdF9zb2NrKGNoYXIgKmhvc3QpCit7CisJaW50IHNvY2tmZCA9IC0xLCBzYXZlZF9lcnJubyA9IDA7CisJY2hhciAqY29sb24sICplbmQ7CisJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKSwgKmVwOworCXN0cnVjdCBob3N0ZW50ICpoZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJY2hhciAqKmFwOworCXVuc2lnbmVkIGludCBucG9ydDsKKworCWlmIChob3N0WzBdID09ICdbJykgeworCQllbmQgPSBzdHJjaHIoaG9zdCArIDEsICddJyk7CisJCWlmIChlbmQpIHsKKwkJCSplbmQgPSAwOworCQkJZW5kKys7CisJCQlob3N0Kys7CisJCX0gZWxzZQorCQkJZW5kID0gaG9zdDsKKwl9IGVsc2UKKwkJZW5kID0gaG9zdDsKKwljb2xvbiA9IHN0cmNocihlbmQsICc6Jyk7CisKKwlpZiAoY29sb24pIHsKKwkJKmNvbG9uID0gMDsKKwkJcG9ydCA9IGNvbG9uICsgMTsKKwl9CisKKwloZSA9IGdldGhvc3RieW5hbWUoaG9zdCk7CisJaWYgKCFoZSkKKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgaHN0cmVycm9yKGhfZXJybm8pKTsKKwlucG9ydCA9IHN0cnRvdWwocG9ydCwgJmVwLCAxMCk7CisJaWYgKCBlcCA9PSBwb3J0IHx8ICplcCApIHsKKwkJLyogTm90IG51bWVyaWMgKi8KKwkJc3RydWN0IHNlcnZlbnQgKnNlID0gZ2V0c2VydmJ5bmFtZShwb3J0LCJ0Y3AiKTsKKwkJaWYgKCAhc2UgKQorCQkJZGllKCJVbmtub3duIHBvcnQgJXNcbiIsIHBvcnQpOworCQlucG9ydCA9IHNlLT5zX3BvcnQ7CisJfQorCisJZm9yIChhcCA9IGhlLT5oX2FkZHJfbGlzdDsgKmFwOyBhcCsrKSB7CisJCXNvY2tmZCA9IHNvY2tldChoZS0+aF9hZGRydHlwZSwgU09DS19TVFJFQU0sIDApOworCQlpZiAoc29ja2ZkIDwgMCkgeworCQkJc2F2ZWRfZXJybm8gPSBlcnJubzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mIHNhKTsKKwkJc2Euc2luX2ZhbWlseSA9IGhlLT5oX2FkZHJ0eXBlOworCQlzYS5zaW5fcG9ydCA9IGh0b25zKG5wb3J0KTsKKwkJbWVtY3B5KCZzYS5zaW5fYWRkciwgKmFwLCBoZS0+aF9sZW5ndGgpOworCisJCWlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mIHNhKSA8IDApIHsKKwkJCXNhdmVkX2Vycm5vID0gZXJybm87CisJCQljbG9zZShzb2NrZmQpOworCQkJc29ja2ZkID0gLTE7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoc29ja2ZkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCBhIHNvY2tldCAoJXMpIiwgc3RyZXJyb3Ioc2F2ZWRfZXJybm8pKTsKKworCXJldHVybiBzb2NrZmQ7Cit9CisKKyNlbmRpZiAvKiBOT19JUFY2ICovCisKKworc3RhdGljIHZvaWQgZ2l0X3RjcF9jb25uZWN0KGludCBmZFsyXSwgY2hhciAqaG9zdCkKK3sKKwlpbnQgc29ja2ZkID0gZ2l0X3RjcF9jb25uZWN0X3NvY2soaG9zdCk7CisKKwlmZFswXSA9IHNvY2tmZDsKKwlmZFsxXSA9IHNvY2tmZDsKK30KKworCitzdGF0aWMgY2hhciAqZ2l0X3Byb3h5X2NvbW1hbmQgPSBOVUxMOworc3RhdGljIGNvbnN0IGNoYXIgKnJob3N0X25hbWUgPSBOVUxMOworc3RhdGljIGludCByaG9zdF9sZW47CisKK3N0YXRpYyBpbnQgZ2l0X3Byb3h5X2NvbW1hbmRfb3B0aW9ucyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghc3RyY21wKHZhciwgImNvcmUuZ2l0cHJveHkiKSkgeworCQljb25zdCBjaGFyICpmb3JfcG9zOworCQlpbnQgbWF0Y2hsZW4gPSAtMTsKKwkJaW50IGhvc3RsZW47CisKKwkJaWYgKGdpdF9wcm94eV9jb21tYW5kKQorCQkJcmV0dXJuIDA7CisJCS8qIFtjb3JlXQorCQkgKiA7IyBtYXRjaGVzIHd3dy5rZXJuZWwub3JnIGFzIHdlbGwKKwkJICogZ2l0cHJveHkgPSBuZXRjYXR0ZXItMSBmb3Iga2VybmVsLm9yZworCQkgKiBnaXRwcm94eSA9IG5ldGNhdHRlci0yIGZvciBzYW1wbGUueHoKKwkJICogZ2l0cHJveHkgPSBuZXRjYXR0ZXItZGVmYXVsdAorCQkgKi8KKwkJZm9yX3BvcyA9IHN0cnN0cih2YWx1ZSwgIiBmb3IgIik7CisJCWlmICghZm9yX3BvcykKKwkJCS8qIG1hdGNoZXMgZXZlcnlib2R5ICovCisJCQltYXRjaGxlbiA9IHN0cmxlbih2YWx1ZSk7CisJCWVsc2UgeworCQkJaG9zdGxlbiA9IHN0cmxlbihmb3JfcG9zICsgNSk7CisJCQlpZiAocmhvc3RfbGVuIDwgaG9zdGxlbikKKwkJCQltYXRjaGxlbiA9IC0xOworCQkJZWxzZSBpZiAoIXN0cm5jbXAoZm9yX3BvcyArIDUsCisJCQkJCSAgcmhvc3RfbmFtZSArIHJob3N0X2xlbiAtIGhvc3RsZW4sCisJCQkJCSAgaG9zdGxlbikgJiYKKwkJCQkgKChyaG9zdF9sZW4gPT0gaG9zdGxlbikgfHwKKwkJCQkgIHJob3N0X25hbWVbcmhvc3RfbGVuIC0gaG9zdGxlbiAtMV0gPT0gJy4nKSkKKwkJCQltYXRjaGxlbiA9IGZvcl9wb3MgLSB2YWx1ZTsKKwkJCWVsc2UKKwkJCQltYXRjaGxlbiA9IC0xOworCQl9CisJCWlmICgwIDw9IG1hdGNobGVuKSB7CisJCQkvKiBjb3JlLmdpdHByb3h5ID0gbm9uZSBmb3Iga2VybmVsLm9yZyAqLworCQkJaWYgKG1hdGNobGVuID09IDQgJiYgCisJCQkgICAgIW1lbWNtcCh2YWx1ZSwgIm5vbmUiLCA0KSkKKwkJCQltYXRjaGxlbiA9IDA7CisJCQlnaXRfcHJveHlfY29tbWFuZCA9IHhtYWxsb2MobWF0Y2hsZW4gKyAxKTsKKwkJCW1lbWNweShnaXRfcHJveHlfY29tbWFuZCwgdmFsdWUsIG1hdGNobGVuKTsKKwkJCWdpdF9wcm94eV9jb21tYW5kW21hdGNobGVuXSA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdpdF9kZWZhdWx0X2NvbmZpZyh2YXIsIHZhbHVlKTsKK30KKworc3RhdGljIGludCBnaXRfdXNlX3Byb3h5KGNvbnN0IGNoYXIgKmhvc3QpCit7CisJcmhvc3RfbmFtZSA9IGhvc3Q7CisJcmhvc3RfbGVuID0gc3RybGVuKGhvc3QpOworCWdpdF9wcm94eV9jb21tYW5kID0gZ2V0ZW52KCJHSVRfUFJPWFlfQ09NTUFORCIpOworCWdpdF9jb25maWcoZ2l0X3Byb3h5X2NvbW1hbmRfb3B0aW9ucyk7CisJcmhvc3RfbmFtZSA9IE5VTEw7CisJcmV0dXJuIChnaXRfcHJveHlfY29tbWFuZCAmJiAqZ2l0X3Byb3h5X2NvbW1hbmQpOworfQorCitzdGF0aWMgdm9pZCBnaXRfcHJveHlfY29ubmVjdChpbnQgZmRbMl0sIGNoYXIgKmhvc3QpCit7CisJY29uc3QgY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKwljaGFyICpjb2xvbiwgKmVuZDsKKwlpbnQgcGlwZWZkWzJdWzJdOworCXBpZF90IHBpZDsKKworCWlmIChob3N0WzBdID09ICdbJykgeworCQllbmQgPSBzdHJjaHIoaG9zdCArIDEsICddJyk7CisJCWlmIChlbmQpIHsKKwkJCSplbmQgPSAwOworCQkJZW5kKys7CisJCQlob3N0Kys7CisJCX0gZWxzZQorCQkJZW5kID0gaG9zdDsKKwl9IGVsc2UKKwkJZW5kID0gaG9zdDsKKwljb2xvbiA9IHN0cmNocihlbmQsICc6Jyk7CisKKwlpZiAoY29sb24pIHsKKwkJKmNvbG9uID0gMDsKKwkJcG9ydCA9IGNvbG9uICsgMTsKKwl9CisKKwlpZiAocGlwZShwaXBlZmRbMF0pIDwgMCB8fCBwaXBlKHBpcGVmZFsxXSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgcGlwZSBwYWlyIGZvciBjb21tdW5pY2F0aW9uIik7CisJcGlkID0gZm9yaygpOworCWlmICghcGlkKSB7CisJCWR1cDIocGlwZWZkWzFdWzBdLCAwKTsKKwkJZHVwMihwaXBlZmRbMF1bMV0sIDEpOworCQljbG9zZShwaXBlZmRbMF1bMF0pOworCQljbG9zZShwaXBlZmRbMF1bMV0pOworCQljbG9zZShwaXBlZmRbMV1bMF0pOworCQljbG9zZShwaXBlZmRbMV1bMV0pOworCQlleGVjbHAoZ2l0X3Byb3h5X2NvbW1hbmQsIGdpdF9wcm94eV9jb21tYW5kLCBob3N0LCBwb3J0LCBOVUxMKTsKKwkJZGllKCJleGVjIGZhaWxlZCIpOworCX0KKwlpZiAocGlkIDwgMCkKKwkJZGllKCJmb3JrIGZhaWxlZCIpOworCWZkWzBdID0gcGlwZWZkWzBdWzBdOworCWZkWzFdID0gcGlwZWZkWzFdWzFdOworCWNsb3NlKHBpcGVmZFswXVsxXSk7CisJY2xvc2UocGlwZWZkWzFdWzBdKTsKK30KKworLyoKKyAqIFllYWgsIHllYWgsIGZpeG1lLiBOZWVkIHRvIHBhc3MgaW4gdGhlIGhlYWRzIGV0Yy4KKyAqLworaW50IGdpdF9jb25uZWN0KGludCBmZFsyXSwgY2hhciAqdXJsLCBjb25zdCBjaGFyICpwcm9nKQoreworCWNoYXIgY29tbWFuZFsxMDI0XTsKKwljaGFyICpob3N0LCAqcGF0aCA9IHVybDsKKwljaGFyICplbmQ7CisJaW50IGM7CisJaW50IHBpcGVmZFsyXVsyXTsKKwlwaWRfdCBwaWQ7CisJZW51bSBwcm90b2NvbCBwcm90b2NvbCA9IFBST1RPX0xPQ0FMOworCWludCBmcmVlX3BhdGggPSAwOworCisJLyogV2l0aG91dCB0aGlzIHdlIGNhbm5vdCByZWx5IG9uIHdhaXRwaWQoKSB0byB0ZWxsCisJICogd2hhdCBoYXBwZW5lZCB0byBvdXIgY2hpbGRyZW4uCisJICovCisJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCisJaG9zdCA9IHN0cnN0cih1cmwsICI6Ly8iKTsKKwlpZihob3N0KSB7CisJCSpob3N0ID0gJ1wwJzsKKwkJcHJvdG9jb2wgPSBnZXRfcHJvdG9jb2wodXJsKTsKKwkJaG9zdCArPSAzOworCQljID0gJy8nOworCX0gZWxzZSB7CisJCWhvc3QgPSB1cmw7CisJCWMgPSAnOic7CisJfQorCisJaWYgKGhvc3RbMF0gPT0gJ1snKSB7CisJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKwkJaWYgKGVuZCkgeworCQkJKmVuZCA9IDA7CisJCQllbmQrKzsKKwkJCWhvc3QrKzsKKwkJfSBlbHNlCisJCQllbmQgPSBob3N0OworCX0gZWxzZQorCQllbmQgPSBob3N0OworCisJcGF0aCA9IHN0cmNocihlbmQsIGMpOworCWlmIChjID09ICc6JykgeworCQlpZiAocGF0aCkgeworCQkJcHJvdG9jb2wgPSBQUk9UT19TU0g7CisJCQkqcGF0aCsrID0gJ1wwJzsKKwkJfSBlbHNlCisJCQlwYXRoID0gaG9zdDsKKwl9CisKKwlpZiAoIXBhdGggfHwgISpwYXRoKQorCQlkaWUoIk5vIHBhdGggc3BlY2lmaWVkLiBTZWUgJ21hbiBnaXQtcHVsbCcgZm9yIHZhbGlkIHVybCBzeW50YXgiKTsKKworCS8qCisJICogbnVsbC10ZXJtaW5hdGUgaG9zdG5hbWUgYW5kIHBvaW50IHBhdGggdG8gfiBmb3IgVVJMJ3MgbGlrZSB0aGlzOgorCSAqICAgIHNzaDovL2hvc3QueHovfnVzZXIvcmVwbworCSAqLworCWlmIChwcm90b2NvbCAhPSBQUk9UT19MT0NBTCAmJiBob3N0ICE9IHVybCkgeworCQljaGFyICpwdHIgPSBwYXRoOworCQlpZiAocGF0aFsxXSA9PSAnficpCisJCQlwYXRoKys7CisJCWVsc2UgeworCQkJcGF0aCA9IHN0cmR1cChwdHIpOworCQkJZnJlZV9wYXRoID0gMTsKKwkJfQorCisJCSpwdHIgPSAnXDAnOworCX0KKworCWlmIChwcm90b2NvbCA9PSBQUk9UT19HSVQpIHsKKwkJLyogVGhlc2UgdW5kZXJseWluZyBjb25uZWN0aW9uIGNvbW1hbmRzIGRpZSgpIGlmIHRoZXkKKwkJICogY2Fubm90IGNvbm5lY3QuCisJCSAqLworCQljaGFyICp0YXJnZXRfaG9zdCA9IHN0cmR1cChob3N0KTsKKwkJaWYgKGdpdF91c2VfcHJveHkoaG9zdCkpCisJCQlnaXRfcHJveHlfY29ubmVjdChmZCwgaG9zdCk7CisJCWVsc2UKKwkJCWdpdF90Y3BfY29ubmVjdChmZCwgaG9zdCk7CisJCS8qCisJCSAqIFNlcGFyYXRlIG9yaWdpbmFsIHByb3RvY29sIGNvbXBvbmVudHMgcHJvZyBhbmQgcGF0aAorCQkgKiBmcm9tIGV4dGVuZGVkIGNvbXBvbmVudHMgd2l0aCBhIE5VTCBieXRlLgorCQkgKi8KKwkJcGFja2V0X3dyaXRlKGZkWzFdLAorCQkJICAgICAiJXMgJXMlY2hvc3Q9JXMlYyIsCisJCQkgICAgIHByb2csIHBhdGgsIDAsCisJCQkgICAgIHRhcmdldF9ob3N0LCAwKTsKKwkJZnJlZSh0YXJnZXRfaG9zdCk7CisJCWlmIChmcmVlX3BhdGgpCisJCQlmcmVlKHBhdGgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGlwZShwaXBlZmRbMF0pIDwgMCB8fCBwaXBlKHBpcGVmZFsxXSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgcGlwZSBwYWlyIGZvciBjb21tdW5pY2F0aW9uIik7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBmb3JrIik7CisJaWYgKCFwaWQpIHsKKwkJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAiJXMgJXMiLCBwcm9nLAorCQkJIHNxX3F1b3RlKHBhdGgpKTsKKwkJZHVwMihwaXBlZmRbMV1bMF0sIDApOworCQlkdXAyKHBpcGVmZFswXVsxXSwgMSk7CisJCWNsb3NlKHBpcGVmZFswXVswXSk7CisJCWNsb3NlKHBpcGVmZFswXVsxXSk7CisJCWNsb3NlKHBpcGVmZFsxXVswXSk7CisJCWNsb3NlKHBpcGVmZFsxXVsxXSk7CisJCWlmIChwcm90b2NvbCA9PSBQUk9UT19TU0gpIHsKKwkJCWNvbnN0IGNoYXIgKnNzaCwgKnNzaF9iYXNlbmFtZTsKKwkJCXNzaCA9IGdldGVudigiR0lUX1NTSCIpOworCQkJaWYgKCFzc2gpIHNzaCA9ICJzc2giOworCQkJc3NoX2Jhc2VuYW1lID0gc3RycmNocihzc2gsICcvJyk7CisJCQlpZiAoIXNzaF9iYXNlbmFtZSkKKwkJCQlzc2hfYmFzZW5hbWUgPSBzc2g7CisJCQllbHNlCisJCQkJc3NoX2Jhc2VuYW1lKys7CisJCQlleGVjbHAoc3NoLCBzc2hfYmFzZW5hbWUsIGhvc3QsIGNvbW1hbmQsIE5VTEwpOworCQl9CisJCWVsc2UgeworCQkJdW5zZXRlbnYoQUxURVJOQVRFX0RCX0VOVklST05NRU5UKTsKKwkJCXVuc2V0ZW52KERCX0VOVklST05NRU5UKTsKKwkJCXVuc2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpOworCQkJdW5zZXRlbnYoR1JBRlRfRU5WSVJPTk1FTlQpOworCQkJdW5zZXRlbnYoSU5ERVhfRU5WSVJPTk1FTlQpOworCQkJZXhlY2xwKCJzaCIsICJzaCIsICItYyIsIGNvbW1hbmQsIE5VTEwpOworCQl9CisJCWRpZSgiZXhlYyBmYWlsZWQiKTsKKwl9CisJZmRbMF0gPSBwaXBlZmRbMF1bMF07CisJZmRbMV0gPSBwaXBlZmRbMV1bMV07CisJY2xvc2UocGlwZWZkWzBdWzFdKTsKKwljbG9zZShwaXBlZmRbMV1bMF0pOworCWlmIChmcmVlX3BhdGgpCisJCWZyZWUocGF0aCk7CisJcmV0dXJuIHBpZDsKK30KKworaW50IGZpbmlzaF9jb25uZWN0KHBpZF90IHBpZCkKK3sKKwlpbnQgcmV0OworCisJZm9yICg7OykgeworCQlyZXQgPSB3YWl0cGlkKHBpZCwgTlVMTCwgMCk7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SRUFETUUgYi9jb250cmliL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMwYTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SRUFETUUKQEAgLTAsMCArMSw0NCBAQAorQ29udHJpYnV0ZWQgU29mdHdhcmUKKworQWx0aG91Z2ggdGhlc2UgcGllY2VzIGFyZSBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgb2ZmaWNpYWwgZ2l0Citzb3VyY2UgdHJlZSwgdGhleSBhcmUgaW4gc29tZXdoYXQgZGlmZmVyZW50IHN0YXR1cy4gIFRoZQoraW50ZW50aW9uIGlzIHRvIGtlZXAgaW50ZXJlc3RpbmcgdG9vbHMgYXJvdW5kIGdpdCBoZXJlLCBtYXliZQorZXZlbiBleHBlcmltZW50YWwgb25lcywgdG8gZ2l2ZSB1c2VycyBhbiBlYXNpZXIgYWNjZXNzIHRvIHRoZW0sCithbmQgdG8gZ2l2ZSB0b29scyB3aWRlciBleHBvc3VyZSwgc28gdGhhdCB0aGV5IGNhbiBiZSBpbXByb3ZlZAorZmFzdGVyLgorCitJIGFtIG5vdCBleHBlY3RpbmcgdG8gdG91Y2ggdGhlc2UgbXlzZWxmIHRoYXQgbXVjaC4gIEFzIGZhciBhcworbXkgZGF5LXRvLWRheSBvcGVyYXRpb24gaXMgY29uY2VybmVkLCB0aGVzZSBzdWJkaXJlY3RvcmllcyBhcmUKK293bmVkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgcHJpbWFyeSBhdXRob3JzLiAgSSBhbSB3aWxsaW5nIHRvIGhlbHAKK2lmIHVzZXJzIG9mIHRoZXNlIGNvbXBvbmVudHMgYW5kIHRoZSBjb250cmliLyBzdWJ0cmVlICJvd25lcnMiCitoYXZlIHRlY2huaWNhbC9kZXNpZ24gaXNzdWVzIHRvIHJlc29sdmUsIGJ1dCB0aGUgaW5pdGlhdGl2ZSB0bworZml4IGFuZC9vciBlbmhhbmNlIHRoaW5ncyBfbXVzdF8gYmUgb24gdGhlIHNpZGUgb2YgdGhlIHN1YnRyZWUKK293bmVycy4gIElPVywgSSB3b24ndCBiZSBhY3RpdmVseSBsb29raW5nIGZvciBidWdzIGFuZCByb29tcyBmb3IKK2VuaGFuY2VtZW50cyBpbiB0aGVtIGFzIHRoZSBnaXQgbWFpbnRhaW5lciAtLSBJIG1heSBvbmx5IGRvIHNvCitqdXN0IGFzIG9uZSBvZiB0aGUgdXNlcnMgd2hlbiBJIHdhbnQgdG8gc2NyYXRjaCBteSBvd24gaXRjaC4gIElmCit5b3UgaGF2ZSBwYXRjaGVzIHRvIHRoaW5ncyBpbiBjb250cmliLyBhcmVhLCB0aGUgcGF0Y2ggc2hvdWxkIGJlCitmaXJzdCBzZW50IHRvIHRoZSBwcmltYXJ5IGF1dGhvciwgYW5kIHRoZW4gdGhlIHByaW1hcnkgYXV0aG9yCitzaG91bGQgYWNrIGFuZCBmb3J3YXJkIGl0IHRvIG1lIChnaXQgcHVsbCByZXF1ZXN0IGlzIG5pY2VyKS4KK1RoaXMgaXMgdGhlIHNhbWUgd2F5IGFzIGhvdyBJIGhhdmUgYmVlbiB0cmVhdGluZyBnaXRrLCBhbmQgdG8gYQorbGVzc2VyIGRlZ3JlZSB2YXJpb3VzIGZvcmVpZ24gU0NNIGludGVyZmFjZXMsIHNvIHlvdSBrbm93IHRoZQorZHJpbGwuCisKK0kgZXhwZWN0IHRoYXQgdGhpbmdzIHRoYXQgc3RhcnQgdGhlaXIgbGlmZSBpbiB0aGUgY29udHJpYi8gYXJlYQordG8gZ3JhZHVhdGUgb3V0IG9mIGNvbnRyaWIvIG9uY2UgdGhleSBtYXR1cmUsIGVpdGhlciBieSBiZWNvbWluZworcHJvamVjdHMgb24gdGhlaXIgb3duLCBvciBtb3ZpbmcgdG8gdGhlIHRvcGxldmVsIGRpcmVjdG9yeS4gIE9uCit0aGUgb3RoZXIgaGFuZCwgSSBleHBlY3QgSSdsbCBiZSBwcm9wb3NpbmcgcmVtb3ZhbCBvZiBkaXN1c2VkCithbmQgaW5hY3RpdmUgb25lcyBmcm9tIHRpbWUgdG8gdGltZS4KKworSWYgeW91IGhhdmUgbmV3IHRoaW5ncyB0byBhZGQgdG8gdGhpcyBhcmVhLCBwbGVhc2UgZmlyc3QgcHJvcG9zZQoraXQgb24gdGhlIGdpdCBtYWlsaW5nIGxpc3QsIGFuZCBhZnRlciBhIGxpc3QgZGlzY3Vzc2lvbiBwcm92ZXMKK3RoZXJlIGFyZSBzb21lIGdlbmVyYWwgaW50ZXJlc3RzIChpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIGEKK2xpc3Qtd2lkZSBjb25zZW5zdXMgZm9yIGEgdG9vbCB0YXJnZXRlZCB0byBhIHJlbGF0aXZlbHkgbmFycm93CithdWRpZW5jZSAtLSBmb3IgZXhhbXBsZSBJIGRvIG5vdCB3b3JrIHdpdGggcHJvamVjdHMgd2hvc2UKK3Vwc3RyZWFtIGlzIHN2biwgc28gSSBoYXZlIG5vIHVzZSBmb3IgZ2l0LXN2biBteXNlbGYsIGJ1dCBpdCBpcworb2YgZ2VuZXJhbCBpbnRlcmVzdCBmb3IgcGVvcGxlIHdobyBuZWVkIHRvIGludGVyb3BlcmF0ZSB3aXRoIFNWTgorcmVwb3NpdG9yaWVzIGluIGEgd2F5IGdpdC1zdm4gd29ya3MgYmV0dGVyIHRoYW4gZ2l0LXN2bmltcG9ydCksCitzdWJtaXQgYSBwYXRjaCB0byBjcmVhdGUgYSBzdWJkaXJlY3Rvcnkgb2YgY29udHJpYi8gYW5kIHB1dCB5b3VyCitzdHVmZiB0aGVyZS4KKworLWpjCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvY29sb3JkaWZmL1JFQURNRSBiL2NvbnRyaWIvY29sb3JkaWZmL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc4ZmRmCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb2xvcmRpZmYvUkVBRE1FCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBpcyAiY29sb3JkaWZmIiAoaHR0cDovL2NvbG9yZGlmZi5zb3VyY2Vmb3JnZS5uZXQvKSBieSBEYXZlCitFd2FydCA8ZGF2ZWVAc3VuZ2F0ZS5jby51az4sIG1vZGlmaWVkIHNwZWNpZmljYWxseSBmb3IgZ2l0LgpkaWZmIC0tZ2l0IGEvY29udHJpYi9jb2xvcmRpZmYvY29sb3JkaWZmLnBlcmwgYi9jb250cmliL2NvbG9yZGlmZi9jb2xvcmRpZmYucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NTY2YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9jb2xvcmRpZmYvY29sb3JkaWZmLnBlcmwKQEAgLTAsMCArMSwxOTYgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyAkSWQ6IGNvbG9yZGlmZi5wbCx2IDEuNC4yLjEwIDIwMDQvMDEvMDQgMTU6MDI6NTkgZGF2ZWV3YXJ0IEV4cCAkCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIENvbG9yRGlmZiAtIGEgd3JhcHBlci9yZXBsYWNtZW50IGZvciAnZGlmZicgcHJvZHVjaW5nICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgY29sb3VyZnVsIG91dHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIENvcHlyaWdodCAoQykyMDAyLTIwMDQgRGF2ZSBFd2FydCAoZGF2ZWVAc3VuZ2F0ZS5jby51aykgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgIworIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAjCisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICMKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICMKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgIworIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAjCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAjCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICMKKyMgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcoOmNvbmZpZyBwYXNzX3Rocm91Z2gpOwordXNlIElQQzo6T3BlbjI7CisKK215ICRhcHBfbmFtZSAgICAgPSAnY29sb3JkaWZmJzsKK215ICR2ZXJzaW9uICAgICAgPSAnMS4wLjQnOworbXkgJGF1dGhvciAgICAgICA9ICdEYXZlIEV3YXJ0JzsKK215ICRhdXRob3JfZW1haWwgPSAnZGF2ZWVAc3VuZ2F0ZS5jby51ayc7CitteSAkYXBwX3d3dyAgICAgID0gJ2h0dHA6Ly9jb2xvcmRpZmYuc291cmNlZm9yZ2UubmV0Lyc7CitteSAkY29weXJpZ2h0ICAgID0gJyhDKTIwMDItMjAwNCc7CitteSAkc2hvd19iYW5uZXIgID0gMTsKKworIyBBTlNJIHNlcXVlbmNlcyBmb3IgY29sb3VycworbXkgJWNvbG91cjsKKyRjb2xvdXJ7d2hpdGV9ICAgICAgID0gIlwwMzNbMTszN20iOworJGNvbG91cnt5ZWxsb3d9ICAgICAgPSAiXDAzM1sxOzMzbSI7CiskY29sb3Vye2dyZWVufSAgICAgICA9ICJcMDMzWzE7MzJtIjsKKyRjb2xvdXJ7Ymx1ZX0gICAgICAgID0gIlwwMzNbMTszNG0iOworJGNvbG91cntjeWFufSAgICAgICAgPSAiXDAzM1sxOzM2bSI7CiskY29sb3Vye3JlZH0gICAgICAgICA9ICJcMDMzWzE7MzFtIjsKKyRjb2xvdXJ7bWFnZW50YX0gICAgID0gIlwwMzNbMTszNW0iOworJGNvbG91cntibGFja30gICAgICAgPSAiXDAzM1sxOzMwbSI7CiskY29sb3Vye2Rhcmt3aGl0ZX0gICA9ICJcMDMzWzA7MzdtIjsKKyRjb2xvdXJ7ZGFya3llbGxvd30gID0gIlwwMzNbMDszM20iOworJGNvbG91cntkYXJrZ3JlZW59ICAgPSAiXDAzM1swOzMybSI7CiskY29sb3Vye2RhcmtibHVlfSAgICA9ICJcMDMzWzA7MzRtIjsKKyRjb2xvdXJ7ZGFya2N5YW59ICAgID0gIlwwMzNbMDszNm0iOworJGNvbG91cntkYXJrcmVkfSAgICAgPSAiXDAzM1swOzMxbSI7CiskY29sb3Vye2RhcmttYWdlbnRhfSA9ICJcMDMzWzA7MzVtIjsKKyRjb2xvdXJ7ZGFya2JsYWNrfSAgID0gIlwwMzNbMDszMG0iOworJGNvbG91cntPRkZ9ICAgICAgICAgPSAiXDAzM1swOzBtIjsKKworIyBEZWZhdWx0IGNvbG91cnMgaWYgL2V0Yy9jb2xvcmRpZmZyYyBvciB+Ly5jb2xvcmRpZmZyYyBkbyBub3QgZXhpc3QKK215ICRwbGFpbl90ZXh0ID0gJGNvbG91cntPRkZ9OworbXkgJGZpbGVfb2xkICAgPSAkY29sb3Vye3JlZH07CitteSAkZmlsZV9uZXcgICA9ICRjb2xvdXJ7Ymx1ZX07CitteSAkZGlmZl9zdHVmZiA9ICRjb2xvdXJ7bWFnZW50YX07CisKKyMgTG9jYXRpb25zIGZvciBwZXJzb25hbCBhbmQgc3lzdGVtLXdpZGUgY29sb3VyIGNvbmZpZ3VyYXRpb25zCitteSAkSE9NRSAgID0gJEVOVntIT01FfTsKK215ICRldGNkaXIgPSAnL2V0Yyc7CisKK215ICgkc2V0dGluZywgJHZhbHVlKTsKK215IEBjb25maWdfZmlsZXMgPSAoIiRldGNkaXIvY29sb3JkaWZmcmMiLCAiJEhPTUUvLmNvbG9yZGlmZnJjIik7CitteSAkY29uZmlnX2ZpbGU7CisKK2ZvcmVhY2ggJGNvbmZpZ19maWxlIChAY29uZmlnX2ZpbGVzKSB7CisgICAgaWYgKG9wZW4oQ09MT1JESUZGUkMsICI8JGNvbmZpZ19maWxlIikpIHsKKyAgICAgICAgd2hpbGUgKDxDT0xPUkRJRkZSQz4pIHsKKyAgICAgICAgICAgIGNob3A7CisgICAgICAgICAgICBuZXh0IGlmICgvXiMvIHx8IC9eJC8pOworICAgICAgICAgICAgcy9ccysvL2c7CisgICAgICAgICAgICAoJHNldHRpbmcsICR2YWx1ZSkgPSBzcGxpdCAoJz0nKTsKKyAgICAgICAgICAgIGlmICgkc2V0dGluZyBlcSAnYmFubmVyJykgeworICAgICAgICAgICAgICAgIGlmICgkdmFsdWUgZXEgJ25vJykgeworICAgICAgICAgICAgICAgICAgICAkc2hvd19iYW5uZXIgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRjb2xvdXJ7JHZhbHVlfSkgeworICAgICAgICAgICAgICAgIHByaW50ICJJbnZhbGlkIGNvbG91ciBzcGVjaWZpY2F0aW9uICgkdmFsdWUpIGluICRjb25maWdfZmlsZVxuIjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXR0aW5nIGVxICdwbGFpbicpIHsKKyAgICAgICAgICAgICAgICAkcGxhaW5fdGV4dCA9ICRjb2xvdXJ7JHZhbHVlfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgkc2V0dGluZyBlcSAnb2xkdGV4dCcpIHsKKyAgICAgICAgICAgICAgICAkZmlsZV9vbGQgPSAkY29sb3VyeyR2YWx1ZX07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoJHNldHRpbmcgZXEgJ25ld3RleHQnKSB7CisgICAgICAgICAgICAgICAgJGZpbGVfbmV3ID0gJGNvbG91cnskdmFsdWV9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCRzZXR0aW5nIGVxICdkaWZmc3R1ZmYnKSB7CisgICAgICAgICAgICAgICAgJGRpZmZfc3R1ZmYgPSAkY29sb3VyeyR2YWx1ZX07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludCAiVW5rbm93biBvcHRpb24gaW4gJGV0Y2Rpci9jb2xvcmRpZmZyYzogJHNldHRpbmdcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgQ09MT1JESUZGUkM7CisgICAgfQorfQorCisjIGNvbG9yZGlmZiBzcGVjaWZpYyBvcHRpb25zIGhlcmUuICBOZWVkIHRvIHByZS1kZWNsYXJlIGlmIHVzaW5nIHZhcmlhYmxlcworR2V0T3B0aW9ucygKKyAgICAibm8tYmFubmVyIiA9PiBzdWIgeyAkc2hvd19iYW5uZXIgPSAwIH0sCisgICAgInBsYWluLXRleHQ9cyIgPT4gXCZzZXRfY29sb3IsCisgICAgImZpbGUtb2xkPXMiICAgPT4gXCZzZXRfY29sb3IsCisgICAgImZpbGUtbmV3PXMiICAgPT4gXCZzZXRfY29sb3IsCisgICAgImRpZmYtc3R1ZmY9cyIgPT4gXCZzZXRfY29sb3IKKyk7CisKK2lmICgkc2hvd19iYW5uZXIgPT0gMSkgeworICAgIHByaW50IFNUREVSUiAiJGFwcF9uYW1lICR2ZXJzaW9uICgkYXBwX3d3dylcbiI7CisgICAgcHJpbnQgU1RERVJSICIkY29weXJpZ2h0ICRhdXRob3IsICRhdXRob3JfZW1haWxcblxuIjsKK30KKworaWYgKGRlZmluZWQgJEFSR1ZbMF0pIHsKKyAgICAjIE1vcmUgcmVsaWFibGUgd2F5IG9mIHB1bGxpbmcgaW4gYXJndW1lbnRzCisgICAgb3BlbjIoXCpJTlBVVFNUUkVBTSwgdW5kZWYsICJnaXQiLCAiZGlmZiIsIEBBUkdWKTsKK30KK2Vsc2UgeworICAgICpJTlBVVFNUUkVBTSA9IFwqU1RESU47Cit9CisKK215ICRyZWNvcmQ7CitteSAkbnJlY3MgICAgICAgICAgID0gMDsKK215ICRpbnNpZGVfZmlsZV9vbGQgPSAxOworbXkgJG5wYXJlbnRzICAgICAgICA9IHVuZGVmOworCit3aGlsZSAoPElOUFVUU1RSRUFNPikgeworICAgICRucmVjcysrOworICAgIGlmICgvXihcQFxAKykgLVstKzAtOSwgXSsgXDEvKSB7CisJICAgIHByaW50ICIkZGlmZl9zdHVmZiI7CisJICAgICRucGFyZW50cyA9IGxlbmd0aCgkMSkgLSAxOworICAgIH0KKyAgICBlbHNpZiAoL15kaWZmIC0vIHx8IC9eaW5kZXggLyB8fAorCSAgIC9eb2xkIG1vZGUgLyB8fCAvXm5ldyBtb2RlIC8gfHwKKwkgICAvXmRlbGV0ZWQgZmlsZSBtb2RlIC8gfHwgL15uZXcgZmlsZSBtb2RlIC8gfHwKKwkgICAvXnNpbWlsYXJpdHkgaW5kZXggLyB8fCAvXmRpc3NpbWlsYXJpdHkgaW5kZXggLyB8fAorCSAgIC9eY29weSBmcm9tIC8gfHwgL15jb3B5IHRvIC8gfHwKKwkgICAvXnJlbmFtZSBmcm9tIC8gfHwgL15yZW5hbWUgdG8gLykgeworCSAgICAkbnBhcmVudHMgPSB1bmRlZjsKKwkgICAgcHJpbnQgIiRkaWZmX3N0dWZmIjsKKyAgICB9CisgICAgZWxzaWYgKGRlZmluZWQgJG5wYXJlbnRzKSB7CisJICAgIGlmICgkbnBhcmVudHMgPT0gMSkgeworCQkgICAgaWYgKC9eXCsvKSB7CisJCQkgICAgcHJpbnQgJGZpbGVfbmV3OworCQkgICAgfQorCQkgICAgZWxzaWYgKC9eLS8pIHsKKwkJCSAgICBwcmludCAkZmlsZV9vbGQ7CisJCSAgICB9CisJCSAgICBlbHNlIHsKKwkJCSAgICBwcmludCAkcGxhaW5fdGV4dDsKKwkJICAgIH0KKwkgICAgfQorCSAgICBlbHNpZiAoL14geyRucGFyZW50c30vKSB7CisJCSAgICBwcmludCAiJHBsYWluX3RleHQiOworCSAgICB9CisJICAgIGVsc2lmICgvXlsrIF17JG5wYXJlbnRzfS8pIHsKKwkJICAgIHByaW50ICIkZmlsZV9uZXciOworCSAgICB9CisJICAgIGVsc2lmICgvXlstIF17JG5wYXJlbnRzfS8pIHsKKwkJICAgIHByaW50ICIkZmlsZV9vbGQiOworCSAgICB9CisJICAgIGVsc2UgeworCQkgICAgcHJpbnQgJHBsYWluX3RleHQ7CisJICAgIH0KKyAgICB9CisgICAgZWxzaWYgKC9eLS0tIC8gfHwgL15cK1wrXCsgLykgeworCSAgICBwcmludCAkZGlmZl9zdHVmZjsKKyAgICB9CisgICAgZWxzZSB7CisJICAgIHByaW50ICIkcGxhaW5fdGV4dCI7CisgICAgfQorICAgIHMvJC8kY29sb3Vye09GRn0vOworICAgIHByaW50ICIkXyI7Cit9CitjbG9zZSBJTlBVVFNUUkVBTTsKKworc3ViIHNldF9jb2xvciB7CisgICAgbXkgKCR0eXBlLCAkY29sb3IpID0gQF87CisKKyAgICAkdHlwZSA9fiBzLy0vXy87CisgICAgZXZhbCAiXCQkdHlwZSA9IFwkY29sb3VyeyRjb2xvcn0iOworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9lbWFjcy8uZ2l0aWdub3JlIGIvY29udHJpYi9lbWFjcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzFkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorKi5lbGMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZW1hY3MvTWFrZWZpbGUgYi9jb250cmliL2VtYWNzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDg0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMjIEJ1aWxkIGFuZCBpbnN0YWxsIHN0dWZmCisKK0VNQUNTID0gZW1hY3MKKworRUxDID0gZ2l0LmVsYyB2Yy1naXQuZWxjCitJTlNUQUxMID89IGluc3RhbGwKK0lOU1RBTExfRUxDID0gJChJTlNUQUxMKSAtbSA2NDQKK3ByZWZpeCA/PSAkKEhPTUUpCitlbWFjc2RpciA9ICQocHJlZml4KS9zaGFyZS9lbWFjcy9zaXRlLWxpc3AKKworYWxsOiAkKEVMQykKKworaW5zdGFsbDogYWxsCisJJChJTlNUQUxMKSAtZCAkKGVtYWNzZGlyKQorCSQoSU5TVEFMTF9FTEMpICQoRUxDKSAkKGVtYWNzZGlyKQorCislLmVsYzogJS5lbAorCSQoRU1BQ1MpIC0tYmF0Y2ggLS1ldmFsICcoYnl0ZS1jb21waWxlLWZpbGUgIiQ8IiknCisKK2NsZWFuOjsgcm0gLWYgJChFTEMpCmRpZmYgLS1naXQgYS9jb250cmliL2VtYWNzL2dpdC5lbCBiL2NvbnRyaWIvZW1hY3MvZ2l0LmVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZGU5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2VtYWNzL2dpdC5lbApAQCAtMCwwICsxLDEwNDggQEAKKzs7OyBnaXQuZWwgLS0tIEEgdXNlciBpbnRlcmZhY2UgZm9yIGdpdAorCis7OyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgQWxleGFuZHJlIEp1bGxpYXJkIDxqdWxsaWFyZEB3aW5laHEub3JnPgorCis7OyBWZXJzaW9uOiAxLjAKKworOzsgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKzs7IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCis7OyB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7Cis7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCis7OyB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCis7OyB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCis7OyBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOzsKKzs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworOzsgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorOzsgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKzs7IE1BIDAyMTExLTEzMDcgVVNBCisKKzs7OyBDb21tZW50YXJ5OgorCis7OyBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW50ZXJmYWNlIGZvciB0aGUgZ2l0IHZlcnNpb24gY29udHJvbAorOzsgc3lzdGVtLiBJdCBwcm92aWRlcyBlYXN5IGFjY2VzcyB0byB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgZ2l0Cis7OyBjb21tYW5kcy4gVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZhciBhcyBwb3NzaWJsZSBpZGVudGljYWwgdG8KKzs7IHRoYXQgb2YgdGhlIFBDTC1DVlMgbW9kZS4KKzs7Cis7OyBUbyBpbnN0YWxsOiBwdXQgdGhpcyBmaWxlIG9uIHRoZSBsb2FkLXBhdGggYW5kIHBsYWNlIHRoZSBmb2xsb3dpbmcKKzs7IGluIHlvdXIgLmVtYWNzIGZpbGU6Cis7OworOzsgICAgKHJlcXVpcmUgJ2dpdCkKKzs7Cis7OyBUbyBzdGFydDogYE0teCBnaXQtc3RhdHVzJworOzsKKzs7IFRPRE8KKzs7ICAtIHBvcnRhYmlsaXR5IHRvIFhFbWFjcworOzsgIC0gYmV0dGVyIGhhbmRsaW5nIG9mIHN1YnByb2Nlc3MgZXJyb3JzCis7OyAgLSBob29rIGludG8gZmlsZSBzYXZlIChhZnRlci1zYXZlLWhvb2spCis7OyAgLSBkaWZmIGFnYWluc3Qgb3RoZXIgYnJhbmNoCis7OyAgLSByZW5hbWluZyBmaWxlcyBmcm9tIHRoZSBzdGF0dXMgYnVmZmVyCis7OyAgLSBjcmVhdGluZyB0YWdzCis7OyAgLSBmZXRjaC9wdWxsCis7OyAgLSBzd2l0Y2hpbmcgYnJhbmNoZXMKKzs7ICAtIHJldmxpc3QgYnJvd3NlcgorOzsgIC0gZ2l0LXNob3ctYnJhbmNoIGJyb3dzZXIKKzs7ICAtIG1lbnVzCis7OworCisoZXZhbC13aGVuLWNvbXBpbGUgKHJlcXVpcmUgJ2NsKSkKKyhyZXF1aXJlICdld29jKQorCisKKzs7OzsgQ3VzdG9taXphdGlvbnMKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZncm91cCBnaXQgbmlsCisgICJBIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgZ2l0IHZlcnNpb25pbmcgc3lzdGVtLiIKKyAgOmdyb3VwICd0b29scykKKworKGRlZmN1c3RvbSBnaXQtY29tbWl0dGVyLW5hbWUgbmlsCisgICJVc2VyIG5hbWUgdG8gdXNlIGZvciBjb21taXRzLgorVGhlIGRlZmF1bHQgaXMgdG8gZmFsbCBiYWNrIHRvIHRoZSByZXBvc2l0b3J5IGNvbmZpZywKK3RoZW4gdG8gYGFkZC1sb2ctZnVsbC1uYW1lJyBhbmQgdGhlbiB0byBgdXNlci1mdWxsLW5hbWUnLiIKKyAgOmdyb3VwICdnaXQKKyAgOnR5cGUgJyhjaG9pY2UgKGNvbnN0IDp0YWcgIkRlZmF1bHQiIG5pbCkKKyAgICAgICAgICAgICAgICAgKHN0cmluZyA6dGFnICJOYW1lIikpKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXR0ZXItZW1haWwgbmlsCisgICJFbWFpbCBhZGRyZXNzIHRvIHVzZSBmb3IgY29tbWl0cy4KK1RoZSBkZWZhdWx0IGlzIHRvIGZhbGwgYmFjayB0byB0aGUgZ2l0IHJlcG9zaXRvcnkgY29uZmlnLAordGhlbiB0byBgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MnIGFuZCB0aGVuIHRvIGB1c2VyLW1haWwtYWRkcmVzcycuIgorICA6Z3JvdXAgJ2dpdAorICA6dHlwZSAnKGNob2ljZSAoY29uc3QgOnRhZyAiRGVmYXVsdCIgbmlsKQorICAgICAgICAgICAgICAgICAoc3RyaW5nIDp0YWcgIkVtYWlsIikpKQorCisoZGVmY3VzdG9tIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0gJ3V0Zi04CisgICJEZWZhdWx0IGNvZGluZyBzeXN0ZW0gZm9yIHRoZSBsb2cgbWVzc2FnZSBvZiBnaXQgY29tbWl0cy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdjb2Rpbmctc3lzdGVtKQorCisoZGVmY3VzdG9tIGdpdC1hcHBlbmQtc2lnbmVkLW9mZi1ieSBuaWwKKyAgIldoZXRoZXIgdG8gYXBwZW5kIGEgU2lnbmVkLW9mZi1ieSBsaW5lIHRvIHRoZSBjb21taXQgbWVzc2FnZSBiZWZvcmUgZWRpdGluZy4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdib29sZWFuKQorCisoZGVmY3VzdG9tIGdpdC1yZXVzZS1zdGF0dXMtYnVmZmVyIHQKKyAgIldoZXRoZXIgYGdpdC1zdGF0dXMnIHNob3VsZCB0cnkgdG8gcmV1c2UgYW4gZXhpc3RpbmcgYnVmZmVyCitpZiB0aGVyZSBpcyBhbHJlYWR5IG9uZSB0aGF0IGRpc3BsYXlzIHRoZSBzYW1lIGRpcmVjdG9yeS4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdib29sZWFuKQorCisoZGVmY3VzdG9tIGdpdC1wZXItZGlyLWlnbm9yZS1maWxlICIuZ2l0aWdub3JlIgorICAiTmFtZSBvZiB0aGUgcGVyLWRpcmVjdG9yeSBpZ25vcmUgZmlsZS4iCisgIDpncm91cCAnZ2l0CisgIDp0eXBlICdzdHJpbmcpCisKKworKGRlZmZhY2UgZ2l0LXN0YXR1cy1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJwdXJwbGUiKSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgdG8gaGlnaGxpZ2h0IGFkZGVkIGFuZCBtb2RpZmllZCBmaWxlcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtdW5tZXJnZWQtZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAicmVkIiA6Ym9sZCB0KSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgdG8gaGlnaGxpZ2h0IHVubWVyZ2VkIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC11bmtub3duLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImdvbGRlbnJvZCIgOmJvbGQgdCkpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCB1bmtub3duIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC11cHRvZGF0ZS1mYWNlCisgICcoKCgoY2xhc3MgY29sb3IpIChiYWNrZ3JvdW5kIGxpZ2h0KSkgKDpmb3JlZ3JvdW5kICJncmV5NjAiKSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgdG8gaGlnaGxpZ2h0IHVwLXRvLWRhdGUgZmlsZXMuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LWlnbm9yZWQtZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiZ3JleTYwIikpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIHRvIGhpZ2hsaWdodCBpZ25vcmVkIGZpbGVzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC1tYXJrLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgInJlZCIgOmJvbGQgdCkpKQorICAiR2l0IG1vZGUgZmFjZSB1c2VkIGZvciB0aGUgZmlsZSBtYXJrcy4iCisgIDpncm91cCAnZ2l0KQorCisoZGVmZmFjZSBnaXQtaGVhZGVyLWZhY2UKKyAgJygoKChjbGFzcyBjb2xvcikgKGJhY2tncm91bmQgbGlnaHQpKSAoOmZvcmVncm91bmQgImJsdWUiKSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgZm9yIGNvbW1pdCBoZWFkZXJzLiIKKyAgOmdyb3VwICdnaXQpCisKKyhkZWZmYWNlIGdpdC1zZXBhcmF0b3ItZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiYnJvd24iKSkpCisgICJHaXQgbW9kZSBmYWNlIHVzZWQgZm9yIGNvbW1pdCBzZXBhcmF0b3IuIgorICA6Z3JvdXAgJ2dpdCkKKworKGRlZmZhY2UgZ2l0LXBlcm1pc3Npb24tZmFjZQorICAnKCgoKGNsYXNzIGNvbG9yKSAoYmFja2dyb3VuZCBsaWdodCkpICg6Zm9yZWdyb3VuZCAiZ3JlZW4iIDpib2xkIHQpKSkKKyAgIkdpdCBtb2RlIGZhY2UgdXNlZCBmb3IgcGVybWlzc2lvbiBjaGFuZ2VzLiIKKyAgOmdyb3VwICdnaXQpCisKKworOzs7OyBVdGlsaXRpZXMKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZjb25zdCBnaXQtbG9nLW1zZy1zZXBhcmF0b3IgIi0tLSBsb2cgbWVzc2FnZSBmb2xsb3dzIHRoaXMgbGluZSAtLS0iKQorCisoZGVmdW4gZ2l0LWdldC1lbnYtc3RyaW5ncyAoZW52KQorICAiQnVpbGQgYSBsaXN0IG9mIE5BTUU9VkFMVUUgc3RyaW5ncyBmcm9tIGEgbGlzdCBvZiBlbnZpcm9ubWVudCBzdHJpbmdzLiIKKyAgKG1hcGNhciAobGFtYmRhIChlbnRyeSkgKGNvbmNhdCAoY2FyIGVudHJ5KSAiPSIgKGNkciBlbnRyeSkpKSBlbnYpKQorCisoZGVmdW4gZ2l0LWNhbGwtcHJvY2Vzcy1lbnYgKGJ1ZmZlciBlbnYgJnJlc3QgYXJncykKKyAgIldyYXBwZXIgZm9yIGNhbGwtcHJvY2VzcyB0aGF0IHNldHMgZW52aXJvbm1lbnQgc3RyaW5ncy4iCisgIChpZiBlbnYKKyAgICAgIChhcHBseSAjJ2NhbGwtcHJvY2VzcyAiZW52IiBuaWwgYnVmZmVyIG5pbAorICAgICAgICAgICAgIChhcHBlbmQgKGdpdC1nZXQtZW52LXN0cmluZ3MgZW52KSAobGlzdCAiZ2l0IikgYXJncykpCisgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBidWZmZXIgbmlsIGFyZ3MpKSkKKworKGRlZnVuIGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyAoZW52ICZyZXN0IGFyZ3MpCisgICJXcmFwcGVyIGZvciBjYWxsLXByb2Nlc3MgdGhhdCBzZXRzIGVudmlyb25tZW50IHN0cmluZ3MsCithbmQgcmV0dXJucyB0aGUgcHJvY2VzcyBvdXRwdXQgYXMgYSBzdHJpbmcuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChhbmQgKGVxIDAgKGFwcGx5ICMnIGdpdC1jYWxsLXByb2Nlc3MtZW52IHQgZW52IGFyZ3MpKQorICAgICAgICAgKGJ1ZmZlci1zdHJpbmcpKSkpCisKKyhkZWZ1biBnaXQtcnVuLXByb2Nlc3MtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIHByb2dyYW0gYXJncykKKyAgIlJ1biBhIGdpdCBwcm9jZXNzIHdpdGggYSBidWZmZXIgcmVnaW9uIGFzIGlucHV0LiIKKyAgKGxldCAoKG91dHB1dC1idWZmZXIgKGN1cnJlbnQtYnVmZmVyKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAoY2QgZGlyKQorICAgICAgKGFwcGx5ICMnY2FsbC1wcm9jZXNzLXJlZ2lvbiBzdGFydCBlbmQgcHJvZ3JhbQorICAgICAgICAgICAgIG5pbCAobGlzdCBvdXRwdXQtYnVmZmVyIG5pbCkgbmlsIGFyZ3MpKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtYnVmZmVyIChidWZmZXItbmFtZSAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQsIHNlbmRpbmcgdGhlIG91dHB1dCB0byBhIGJ1ZmZlciBuYW1lZCBCVUZGRVItTkFNRS4iCisgIChsZXQgKChkaXIgZGVmYXVsdC1kaXJlY3RvcnkpCisgICAgICAgIChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlIGJ1ZmZlci1uYW1lKSkpCisgICAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uIiAoY2FyIGFyZ3MpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgorICAgICAgKGxldCAoKGRlZmF1bHQtZGlyZWN0b3J5IGRpcikKKyAgICAgICAgICAgIChidWZmZXItcmVhZC1vbmx5IG5pbCkpCisgICAgICAgIChlcmFzZS1idWZmZXIpCisgICAgICAgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBuaWwgYXJncykpKQorICAgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLmRvbmUiIChjYXIgYXJncykpCisgICAgYnVmZmVyKSkKKworKGRlZnVuIGdpdC1ydW4tY29tbWFuZCAoYnVmZmVyIGVudiAmcmVzdCBhcmdzKQorICAobWVzc2FnZSAiUnVubmluZyBnaXQgJXMuLi4iIChjYXIgYXJncykpCisgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IGJ1ZmZlciBlbnYgYXJncykKKyAgKG1lc3NhZ2UgIlJ1bm5pbmcgZ2l0ICVzLi4uZG9uZSIgKGNhciBhcmdzKSkpCisKKyhkZWZ1biBnaXQtcnVuLWNvbW1hbmQtcmVnaW9uIChidWZmZXIgc3RhcnQgZW5kIGVudiAmcmVzdCBhcmdzKQorICAiUnVuIGEgZ2l0IGNvbW1hbmQgd2l0aCBzcGVjaWZpZWQgYnVmZmVyIHJlZ2lvbiBhcyBpbnB1dC4iCisgIChtZXNzYWdlICJSdW5uaW5nIGdpdCAlcy4uLiIgKGNhciBhcmdzKSkKKyAgKHVubGVzcyAoZXEgMCAoaWYgZW52CisgICAgICAgICAgICAgICAgICAgIChnaXQtcnVuLXByb2Nlc3MtcmVnaW9uCisgICAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJlbnYiCisgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChnaXQtZ2V0LWVudi1zdHJpbmdzIGVudikgKGxpc3QgImdpdCIpIGFyZ3MpKQorICAgICAgICAgICAgICAgICAgKGdpdC1ydW4tcHJvY2Vzcy1yZWdpb24KKyAgICAgICAgICAgICAgICAgICBidWZmZXIgc3RhcnQgZW5kICJnaXQiIGFyZ3MpKSkKKyAgICAoZXJyb3IgIkZhaWxlZCB0byBydW4gXCJnaXQgJXNcIjpcbiVzIiAobWFwY29uY2F0IChsYW1iZGEgKHgpIHgpIGFyZ3MgIiAiKSAoYnVmZmVyLXN0cmluZykpKQorICAobWVzc2FnZSAiUnVubmluZyBnaXQgJXMuLi5kb25lIiAoY2FyIGFyZ3MpKSkKKworKGRlZnVuIGdpdC1nZXQtc3RyaW5nLXNoYTEgKHN0cmluZykKKyAgIlJlYWQgYSBTSEExIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuIgorICAoYW5kIHN0cmluZworICAgICAgIChzdHJpbmctbWF0Y2ggIlswLTlhLWZdXFx7NDBcXH0iIHN0cmluZykKKyAgICAgICAobWF0Y2gtc3RyaW5nIDAgc3RyaW5nKSkpCisKKyhkZWZ1biBnaXQtZ2V0LWNvbW1pdHRlci1uYW1lICgpCisgICJSZXR1cm4gdGhlIG5hbWUgdG8gdXNlIGFzIEdJVF9DT01NSVRURVJfTkFNRS4iCisgIDsgY29waWVkIGZyb20gbG9nLWVkaXQKKyAgKG9yIGdpdC1jb21taXR0ZXItbmFtZQorICAgICAgKGdpdC1yZXBvLWNvbmZpZyAidXNlci5uYW1lIikKKyAgICAgIChhbmQgKGJvdW5kcCAnYWRkLWxvZy1mdWxsLW5hbWUpIGFkZC1sb2ctZnVsbC1uYW1lKQorICAgICAgKGFuZCAoZmJvdW5kcCAndXNlci1mdWxsLW5hbWUpICh1c2VyLWZ1bGwtbmFtZSkpCisgICAgICAoYW5kIChib3VuZHAgJ3VzZXItZnVsbC1uYW1lKSB1c2VyLWZ1bGwtbmFtZSkpKQorCisoZGVmdW4gZ2l0LWdldC1jb21taXR0ZXItZW1haWwgKCkKKyAgIlJldHVybiB0aGUgZW1haWwgYWRkcmVzcyB0byB1c2UgYXMgR0lUX0NPTU1JVFRFUl9FTUFJTC4iCisgIDsgY29waWVkIGZyb20gbG9nLWVkaXQKKyAgKG9yIGdpdC1jb21taXR0ZXItZW1haWwKKyAgICAgIChnaXQtcmVwby1jb25maWcgInVzZXIuZW1haWwiKQorICAgICAgKGFuZCAoYm91bmRwICdhZGQtbG9nLW1haWxpbmctYWRkcmVzcykgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MpCisgICAgICAoYW5kIChmYm91bmRwICd1c2VyLW1haWwtYWRkcmVzcykgKHVzZXItbWFpbC1hZGRyZXNzKSkKKyAgICAgIChhbmQgKGJvdW5kcCAndXNlci1tYWlsLWFkZHJlc3MpIHVzZXItbWFpbC1hZGRyZXNzKSkpCisKKyhkZWZ1biBnaXQtZXNjYXBlLWZpbGUtbmFtZSAobmFtZSkKKyAgIkVzY2FwZSBhIGZpbGUgbmFtZSBpZiBuZWNlc3NhcnkuIgorICAoaWYgKHN0cmluZy1tYXRjaCAiW1xuXHRcIlxcXSIgbmFtZSkKKyAgICAgIChjb25jYXQgIlwiIgorICAgICAgICAgICAgICAobWFwY29uY2F0IChsYW1iZGEgKGMpCisgICAgICAgICAgICAgICAgICAgKGNhc2UgYworICAgICAgICAgICAgICAgICAgICAgKD9cbiAiXFxuIikKKyAgICAgICAgICAgICAgICAgICAgICg/XHQgIlxcdCIpCisgICAgICAgICAgICAgICAgICAgICAoP1xcICJcXFxcIikKKyAgICAgICAgICAgICAgICAgICAgICg/XCIgIlxcXCIiKQorICAgICAgICAgICAgICAgICAgICAgKHQgKGNoYXItdG8tc3RyaW5nIGMpKSkpCisgICAgICAgICAgICAgICAgIG5hbWUgIiIpCisgICAgICAgICAgICAgICJcIiIpCisgICAgbmFtZSkpCisKKyhkZWZ1biBnaXQtZ2V0LXRvcC1kaXIgKGRpcikKKyAgIlJldHJpZXZlIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIGEgZ2l0IHRyZWUuIgorICAobGV0ICgoY2R1cCAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgc3RhbmRhcmQtb3V0cHV0CisgICAgICAgICAgICAgICAgICAoY2QgZGlyKQorICAgICAgICAgICAgICAgICAgKHVubGVzcyAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCB0IG5pbCAicmV2LXBhcnNlIiAiLS1zaG93LWNkdXAiKSkKKyAgICAgICAgICAgICAgICAgICAgKGVycm9yICJjYW5ub3QgZmluZCB0b3AtbGV2ZWwgZ2l0IHRyZWUgZm9yICVzLiIgZGlyKSkpKSkpCisgICAgKGV4cGFuZC1maWxlLW5hbWUgKGNvbmNhdCAoZmlsZS1uYW1lLWFzLWRpcmVjdG9yeSBkaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIChzcGxpdC1zdHJpbmcgY2R1cCAiXG4iKSkpKSkpCisKKztzdG9sZW4gZnJvbSBwY2wtY3ZzCisoZGVmdW4gZ2l0LWFwcGVuZC10by1pZ25vcmUgKGZpbGUpCisgICJBZGQgYSBmaWxlIG5hbWUgdG8gdGhlIGlnbm9yZSBmaWxlIGluIGl0cyBkaXJlY3RvcnkuIgorICAobGV0KiAoKGZ1bGxuYW1lIChleHBhbmQtZmlsZS1uYW1lIGZpbGUpKQorICAgICAgICAgKGRpciAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmdWxsbmFtZSkpCisgICAgICAgICAobmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBmdWxsbmFtZSkpCisgICAgICAgICAoaWdub3JlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZ2l0LXBlci1kaXItaWdub3JlLWZpbGUgZGlyKSkKKyAgICAgICAgIChjcmVhdGVkIChub3QgKGZpbGUtZXhpc3RzLXAgaWdub3JlLW5hbWUpKSkpCisgIChzYXZlLXdpbmRvdy1leGN1cnNpb24KKyAgICAoc2V0LWJ1ZmZlciAoZmluZC1maWxlLW5vc2VsZWN0IGlnbm9yZS1uYW1lKSkKKyAgICAoZ290by1jaGFyIChwb2ludC1tYXgpKQorICAgICh1bmxlc3MgKHplcm9wIChjdXJyZW50LWNvbHVtbikpIChpbnNlcnQgIlxuIikpCisgICAgKGluc2VydCAiLyIgbmFtZSAiXG4iKQorICAgIChzb3J0LWxpbmVzIG5pbCAocG9pbnQtbWluKSAocG9pbnQtbWF4KSkKKyAgICAoc2F2ZS1idWZmZXIpKQorICAod2hlbiBjcmVhdGVkCisgICAgKGdpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tYWRkIiAiLS0iIChmaWxlLXJlbGF0aXZlLW5hbWUgaWdub3JlLW5hbWUpKSkKKyAgKGdpdC1hZGQtc3RhdHVzLWZpbGUgKGlmIGNyZWF0ZWQgJ2FkZGVkICdtb2RpZmllZCkgKGZpbGUtcmVsYXRpdmUtbmFtZSBpZ25vcmUtbmFtZSkpKSkKKworCis7Ozs7IFdyYXBwZXJzIGZvciBiYXNpYyBnaXQgY29tbWFuZHMKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyhkZWZ1biBnaXQtcmV2LXBhcnNlIChyZXYpCisgICJQYXJzZSBhIHJldmlzaW9uIG5hbWUgYW5kIHJldHVybiBpdHMgU0hBMS4iCisgIChnaXQtZ2V0LXN0cmluZy1zaGExCisgICAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYtc3RyaW5nIG5pbCAicmV2LXBhcnNlIiByZXYpKSkKKworKGRlZnVuIGdpdC1yZXBvLWNvbmZpZyAoa2V5KQorICAiUmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgdG8gS0VZIGluIHRoZSBnaXQgcmVwb3NpdG9yeSBjb25maWcgZmlsZS4iCisgIChsZXQgKChzdHIgKGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyBuaWwgInJlcG8tY29uZmlnIiBrZXkpKSkKKyAgICAoYW5kIHN0ciAoY2FyIChzcGxpdC1zdHJpbmcgc3RyICJcbiIpKSkpKQorCisoZGVmdW4gZ2l0LXN5bWJvbGljLXJlZiAocmVmKQorICAiV3JhcHBlciBmb3IgdGhlIGdpdC1zeW1ib2xpYy1yZWYgY29tbWFuZC4iCisgIChsZXQgKChzdHIgKGdpdC1jYWxsLXByb2Nlc3MtZW52LXN0cmluZyBuaWwgInN5bWJvbGljLXJlZiIgcmVmKSkpCisgICAgKGFuZCBzdHIgKGNhciAoc3BsaXQtc3RyaW5nIHN0ciAiXG4iKSkpKSkKKworKGRlZnVuIGdpdC11cGRhdGUtcmVmIChyZWYgdmFsICZvcHRpb25hbCBvbGR2YWwpCisgICJVcGRhdGUgYSByZWZlcmVuY2UgYnkgY2FsbGluZyBnaXQtdXBkYXRlLXJlZi4iCisgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IG5pbCBuaWwgInVwZGF0ZS1yZWYiIHJlZiB2YWwgKGlmIG9sZHZhbCAobGlzdCBvbGR2YWwpKSkpCisKKyhkZWZ1biBnaXQtcmVhZC10cmVlICh0cmVlICZvcHRpb25hbCBpbmRleC1maWxlKQorICAiUmVhZCBhIHRyZWUgaW50byB0aGUgaW5kZXggZmlsZS4iCisgIChhcHBseSAjJ2dpdC1jYWxsLXByb2Nlc3MtZW52IG5pbAorICAgICAgICAgKGlmIGluZGV4LWZpbGUgYCgoIkdJVF9JTkRFWF9GSUxFIiAuICxpbmRleC1maWxlKSkgbmlsKQorICAgICAgICAgInJlYWQtdHJlZSIgKGlmIHRyZWUgKGxpc3QgdHJlZSkpKSkKKworKGRlZnVuIGdpdC13cml0ZS10cmVlICgmb3B0aW9uYWwgaW5kZXgtZmlsZSkKKyAgIkNhbGwgZ2l0LXdyaXRlLXRyZWUgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIHRyZWUgU0hBMSBhcyBhIHN0cmluZy4iCisgIChnaXQtZ2V0LXN0cmluZy1zaGExCisgICAoZ2l0LWNhbGwtcHJvY2Vzcy1lbnYtc3RyaW5nIChhbmQgaW5kZXgtZmlsZSBgKCgiR0lUX0lOREVYX0ZJTEUiIC4gLGluZGV4LWZpbGUpKSkgIndyaXRlLXRyZWUiKSkpCisKKyhkZWZ1biBnaXQtY29tbWl0LXRyZWUgKGJ1ZmZlciB0cmVlIGhlYWQpCisgICJDYWxsIGdpdC1jb21taXQtdHJlZSB3aXRoIGJ1ZmZlciBhcyBpbnB1dCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgY29tbWl0IFNIQTEuIgorICAobGV0ICgoYXV0aG9yLW5hbWUgKGdpdC1nZXQtY29tbWl0dGVyLW5hbWUpKQorICAgICAgICAoYXV0aG9yLWVtYWlsIChnaXQtZ2V0LWNvbW1pdHRlci1lbWFpbCkpCisgICAgICAgIGF1dGhvci1kYXRlIGxvZy1zdGFydCBsb2ctZW5kIGFyZ3MpCisgICAgKHdoZW4gaGVhZAorICAgICAgKHB1c2ggIi1wIiBhcmdzKQorICAgICAgKHB1c2ggaGVhZCBhcmdzKSkKKyAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKKyAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAoaWYKKyAgICAgICAgICAoc2V0cSBsb2ctc3RhcnQgKHJlLXNlYXJjaC1mb3J3YXJkIChjb25jYXQgIl4iIChyZWdleHAtcXVvdGUgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yKSAiXG4iKSBuaWwgdCkpCisgICAgICAgICAgKHNhdmUtcmVzdHJpY3Rpb24KKyAgICAgICAgICAgIChuYXJyb3ctdG8tcmVnaW9uIChwb2ludC1taW4pIGxvZy1zdGFydCkKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hlbiAocmUtc2VhcmNoLWZvcndhcmQgIl5BdXRob3I6ICtcXCguKj9cXCkgKjxcXCguKlxcKT4gKiQiIG5pbCB0KQorICAgICAgICAgICAgICAoc2V0cSBhdXRob3ItbmFtZSAobWF0Y2gtc3RyaW5nIDEpCisgICAgICAgICAgICAgICAgICAgIGF1dGhvci1lbWFpbCAobWF0Y2gtc3RyaW5nIDIpKSkKKyAgICAgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgICAgICAgICAgICAod2hlbiAocmUtc2VhcmNoLWZvcndhcmQgIl5EYXRlOiArXFwoLipcXCkkIiBuaWwgdCkKKyAgICAgICAgICAgICAgKHNldHEgYXV0aG9yLWRhdGUgKG1hdGNoLXN0cmluZyAxKSkpCisgICAgICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiXlBhcmVudDogK1xcKFswLTlhLWZdK1xcKSIgbmlsIHQpCisgICAgICAgICAgICAgICh1bmxlc3MgKHN0cmluZy1lcXVhbCBoZWFkIChtYXRjaC1zdHJpbmcgMSkpCisgICAgICAgICAgICAgICAgKHB1c2ggIi1wIiBhcmdzKQorICAgICAgICAgICAgICAgIChwdXNoIChtYXRjaC1zdHJpbmcgMSkgYXJncykpKSkKKyAgICAgICAgKHNldHEgbG9nLXN0YXJ0IChwb2ludC1taW4pKSkKKyAgICAgIChzZXRxIGxvZy1lbmQgKHBvaW50LW1heCkpKQorICAgIChnaXQtZ2V0LXN0cmluZy1zaGExCisgICAgICh3aXRoLW91dHB1dC10by1zdHJpbmcKKyAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKKyAgICAgICAgIChsZXQgKChjb2Rpbmctc3lzdGVtLWZvci13cml0ZSBnaXQtY29tbWl0cy1jb2Rpbmctc3lzdGVtKQorICAgICAgICAgICAgICAgKGVudiBgKCgiR0lUX0FVVEhPUl9OQU1FIiAuICxhdXRob3ItbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAoIkdJVF9BVVRIT1JfRU1BSUwiIC4gLGF1dGhvci1lbWFpbCkKKyAgICAgICAgICAgICAgICAgICAgICAoIkdJVF9DT01NSVRURVJfTkFNRSIgLiAsKGdpdC1nZXQtY29tbWl0dGVyLW5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICgiR0lUX0NPTU1JVFRFUl9FTUFJTCIgLiAsKGdpdC1nZXQtY29tbWl0dGVyLWVtYWlsKSkpKSkKKyAgICAgICAgICAgKHdoZW4gYXV0aG9yLWRhdGUgKHB1c2ggYCgiR0lUX0FVVEhPUl9EQVRFIiAuICxhdXRob3ItZGF0ZSkgZW52KSkKKyAgICAgICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLXJlZ2lvbgorICAgICAgICAgICAgICAgICAgYnVmZmVyIGxvZy1zdGFydCBsb2ctZW5kIGVudgorICAgICAgICAgICAgICAgICAgImNvbW1pdC10cmVlIiB0cmVlIChucmV2ZXJzZSBhcmdzKSkpKSkpKSkKKworKGRlZnVuIGdpdC1lbXB0eS1kYi1wICgpCisgICJDaGVjayBpZiB0aGUgZ2l0IGRiIGlzIGVtcHR5IChubyBjb21taXQgZG9uZSB5ZXQpLiIKKyAgKG5vdCAoZXEgMCAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBuaWwgbmlsICJyZXYtcGFyc2UiICItLXZlcmlmeSIgIkhFQUQiKSkpKQorCisoZGVmdW4gZ2l0LWdldC1tZXJnZS1oZWFkcyAoKQorICAiUmV0cmlldmUgdGhlIG1lcmdlIGhlYWRzIGZyb20gdGhlIE1FUkdFX0hFQUQgZmlsZSBpZiBwcmVzZW50LiIKKyAgKGxldCAoaGVhZHMpCisgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9NRVJHRV9IRUFEIikKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChpbnNlcnQtZmlsZS1jb250ZW50cyAiLmdpdC9NRVJHRV9IRUFEIiBuaWwgbmlsIG5pbCB0KQorICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJbMC05YS1mXVxcezQwXFx9IiBuaWwgdCkKKyAgICAgICAgICAocHVzaCAobWF0Y2gtc3RyaW5nIDApIGhlYWRzKSkpKQorICAgIChucmV2ZXJzZSBoZWFkcykpKQorCis7Ozs7IEZpbGUgaW5mbyBzdHJ1Y3R1cmUKKzs7OzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzsgZmlsZWluZm8gc3RydWN0dXJlIHN0b2xlbiBmcm9tIHBjbC1jdnMKKyhkZWZzdHJ1Y3QgKGdpdC1maWxlaW5mbworICAgICAgICAgICAgKDpjb3BpZXIgbmlsKQorICAgICAgICAgICAgKDpjb25zdHJ1Y3RvciBnaXQtY3JlYXRlLWZpbGVpbmZvIChzdGF0ZSBuYW1lICZvcHRpb25hbCBvbGQtcGVybSBuZXctcGVybSByZW5hbWUtc3RhdGUgb3JpZy1uYW1lIG1hcmtlZCkpCisgICAgICAgICAgICAoOmNvbmMtbmFtZSBnaXQtZmlsZWluZm8tPikpCisgIG1hcmtlZCAgICAgICAgICAgICAgOzsgdC9uaWwKKyAgc3RhdGUgICAgICAgICAgICAgICA7OyBjdXJyZW50IHN0YXRlCisgIG5hbWUgICAgICAgICAgICAgICAgOzsgZmlsZSBuYW1lCisgIG9sZC1wZXJtIG5ldy1wZXJtICAgOzsgcGVybWlzc2lvbiBmbGFncworICByZW5hbWUtc3RhdGUgICAgICAgIDs7IHJlbmFtZSBvciBjb3B5IHN0YXRlCisgIG9yaWctbmFtZSAgICAgICAgICAgOzsgb3JpZ2luYWwgbmFtZSBmb3IgcmVuYW1lcyBvciBjb3BpZXMKKyAgbmVlZHMtcmVmcmVzaCkgICAgICA7OyB3aGV0aGVyIGZpbGUgbmVlZHMgdG8gYmUgcmVmcmVzaGVkCisKKyhkZWZ2YXIgZ2l0LXN0YXR1cyBuaWwpCisKKyhkZWZ1biBnaXQtY2xlYXItc3RhdHVzIChzdGF0dXMpCisgICJSZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBzdGF0dXMgbGlzdC4iCisgIChld29jLWZpbHRlciBzdGF0dXMgKGxhbWJkYSAoaW5mbykgbmlsKSkpCisKKyhkZWZ1biBnaXQtc2V0LWZpbGVzLXN0YXRlIChmaWxlcyBzdGF0ZSkKKyAgIlNldCB0aGUgc3RhdGUgb2YgYSBsaXN0IG9mIGZpbGVzLiIKKyAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAodW5sZXNzIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSBzdGF0ZSkKKyAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pIHN0YXRlKQorICAgICAgKHNldGYgKGdpdC1maWxlaW5mby0+cmVuYW1lLXN0YXRlIGluZm8pIG5pbCkKKyAgICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm9yaWctbmFtZSBpbmZvKSBuaWwpCisgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pIHQpKSkpCisKKyhkZWZ1biBnaXQtc3RhdGUtY29kZSAoY29kZSkKKyAgIkNvbnZlcnQgZnJvbSBhIHN0cmluZyB0byBhIGFkZGVkL2RlbGV0ZWQvbW9kaWZpZWQgc3RhdGUuIgorICAoY2FzZSAoc3RyaW5nLXRvLWNoYXIgY29kZSkKKyAgICAoP00gJ21vZGlmaWVkKQorICAgICg/PyAndW5rbm93bikKKyAgICAoP0EgJ2FkZGVkKQorICAgICg/RCAnZGVsZXRlZCkKKyAgICAoP1UgJ3VubWVyZ2VkKQorICAgICh0IG5pbCkpKQorCisoZGVmdW4gZ2l0LXN0YXR1cy1jb2RlLWFzLXN0cmluZyAoY29kZSkKKyAgIkZvcm1hdCBhIGdpdCBzdGF0dXMgY29kZSBhcyBzdHJpbmcuIgorICAoY2FzZSBjb2RlCisgICAgKCdtb2RpZmllZCAocHJvcGVydGl6ZSAiTW9kaWZpZWQiICdmYWNlICdnaXQtc3RhdHVzLWZhY2UpKQorICAgICgndW5rbm93biAgKHByb3BlcnRpemUgIlVua25vd24gIiAnZmFjZSAnZ2l0LXVua25vd24tZmFjZSkpCisgICAgKCdhZGRlZCAgICAocHJvcGVydGl6ZSAiQWRkZWQgICAiICdmYWNlICdnaXQtc3RhdHVzLWZhY2UpKQorICAgICgnZGVsZXRlZCAgKHByb3BlcnRpemUgIkRlbGV0ZWQgIiAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKSkKKyAgICAoJ3VubWVyZ2VkIChwcm9wZXJ0aXplICJVbm1lcmdlZCIgJ2ZhY2UgJ2dpdC11bm1lcmdlZC1mYWNlKSkKKyAgICAoJ3VwdG9kYXRlIChwcm9wZXJ0aXplICJVcHRvZGF0ZSIgJ2ZhY2UgJ2dpdC11cHRvZGF0ZS1mYWNlKSkKKyAgICAoJ2lnbm9yZWQgIChwcm9wZXJ0aXplICJJZ25vcmVkICIgJ2ZhY2UgJ2dpdC1pZ25vcmVkLWZhY2UpKQorICAgICh0ICI/ICAgICAgICIpKSkKKworKGRlZnVuIGdpdC1yZW5hbWUtYXMtc3RyaW5nIChpbmZvKQorICAiUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvcHkgb3IgcmVuYW1lIGFzc29jaWF0ZWQgd2l0aCBJTkZPLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm9uZS4iCisgIChsZXQgKChzdGF0ZSAoZ2l0LWZpbGVpbmZvLT5yZW5hbWUtc3RhdGUgaW5mbykpKQorICAgIChpZiBzdGF0ZQorICAgICAgICAocHJvcGVydGl6ZQorICAgICAgICAgKGNvbmNhdCAiICAgKCIKKyAgICAgICAgICAgICAgICAgKGlmIChlcSBzdGF0ZSAnY29weSkgImNvcGllZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAoaWYgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pICdhZGRlZCkgInJlbmFtZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgInJlbmFtZWQgZnJvbSAiKSkKKyAgICAgICAgICAgICAgICAgKGdpdC1lc2NhcGUtZmlsZS1uYW1lIChnaXQtZmlsZWluZm8tPm9yaWctbmFtZSBpbmZvKSkKKyAgICAgICAgICAgICAgICAgIikiKSAnZmFjZSAnZ2l0LXN0YXR1cy1mYWNlKQorICAgICAgIiIpKSkKKworKGRlZnVuIGdpdC1wZXJtaXNzaW9ucy1hcy1zdHJpbmcgKG9sZC1wZXJtIG5ldy1wZXJtKQorICAiRm9ybWF0IGEgcGVybWlzc2lvbiBjaGFuZ2UgYXMgc3RyaW5nLiIKKyAgKHByb3BlcnRpemUKKyAgIChpZiAob3IgKG5vdCBvbGQtcGVybSkKKyAgICAgICAgICAgKG5vdCBuZXctcGVybSkKKyAgICAgICAgICAgKGVxIDAgKGxvZ2FuZCA/XDExMSAobG9neG9yIG9sZC1wZXJtIG5ldy1wZXJtKSkpKQorICAgICAgICIgICIKKyAgICAgKGlmIChlcSAwIChsb2dhbmQgP1wxMTEgb2xkLXBlcm0pKSAiK3giICIteCIpKQorICAnZmFjZSAnZ2l0LXBlcm1pc3Npb24tZmFjZSkpCisKKyhkZWZ1biBnaXQtZmlsZWluZm8tcHJldHR5cHJpbnQgKGluZm8pCisgICJQcmV0dHktcHJpbnRlciBmb3IgdGhlIGdpdC1maWxlaW5mbyBzdHJ1Y3R1cmUuIgorICAoaW5zZXJ0IChmb3JtYXQgIiAgICVzICVzICVzICAlcyVzIgorICAgICAgICAgICAgICAgICAgKGlmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSAocHJvcGVydGl6ZSAiKiIgJ2ZhY2UgJ2dpdC1tYXJrLWZhY2UpICIgIikKKyAgICAgICAgICAgICAgICAgIChnaXQtc3RhdHVzLWNvZGUtYXMtc3RyaW5nIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pKQorICAgICAgICAgICAgICAgICAgKGdpdC1wZXJtaXNzaW9ucy1hcy1zdHJpbmcgKGdpdC1maWxlaW5mby0+b2xkLXBlcm0gaW5mbykgKGdpdC1maWxlaW5mby0+bmV3LXBlcm0gaW5mbykpCisgICAgICAgICAgICAgICAgICAoZ2l0LWVzY2FwZS1maWxlLW5hbWUgKGdpdC1maWxlaW5mby0+bmFtZSBpbmZvKSkKKyAgICAgICAgICAgICAgICAgIChnaXQtcmVuYW1lLWFzLXN0cmluZyBpbmZvKSkpKQorCisoZGVmdW4gZ2l0LXBhcnNlLXN0YXR1cyAoc3RhdHVzKQorICAiUGFyc2UgdGhlIG91dHB1dCBvZiBnaXQtZGlmZi1pbmRleCBpbiB0aGUgY3VycmVudCBidWZmZXIuIgorICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkCisgICAgICAgICAgIjpcXChbMC03XVxcezZcXH1cXCkgXFwoWzAtN11cXHs2XFx9XFwpIFswLTlhLWZdXFx7NDBcXH0gWzAtOWEtZl1cXHs0MFxcfSBcXChcXChbQURNVV1cXClcMFxcKFteXDBdK1xcKVxcfFxcKFtDUl1cXClbMC05XSpcMFxcKFteXDBdK1xcKVwwXFwoW15cMF0rXFwpXFwpXDAiCisgICAgICAgICAgbmlsIHQgMSkKKyAgICAobGV0ICgob2xkLXBlcm0gKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAxKSA4KSkKKyAgICAgICAgICAobmV3LXBlcm0gKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAyKSA4KSkKKyAgICAgICAgICAoc3RhdGUgKG9yIChtYXRjaC1zdHJpbmcgNCkgKG1hdGNoLXN0cmluZyA2KSkpCisgICAgICAgICAgKG5hbWUgKG9yIChtYXRjaC1zdHJpbmcgNSkgKG1hdGNoLXN0cmluZyA3KSkpCisgICAgICAgICAgKG5ldy1uYW1lIChtYXRjaC1zdHJpbmcgOCkpKQorICAgICAgKGlmIG5ldy1uYW1lICA7IGNvcHkgb3IgcmVuYW1lCisgICAgICAgICAgKGlmIChlcSA/QyAoc3RyaW5nLXRvLWNoYXIgc3RhdGUpKQorICAgICAgICAgICAgICAoZXdvYy1lbnRlci1sYXN0IHN0YXR1cyAoZ2l0LWNyZWF0ZS1maWxlaW5mbyAnYWRkZWQgbmV3LW5hbWUgb2xkLXBlcm0gbmV3LXBlcm0gJ2NvcHkgbmFtZSkpCisgICAgICAgICAgICAoZXdvYy1lbnRlci1sYXN0IHN0YXR1cyAoZ2l0LWNyZWF0ZS1maWxlaW5mbyAnZGVsZXRlZCBuYW1lIDAgMCAncmVuYW1lIG5ldy1uYW1lKSkKKyAgICAgICAgICAgIChld29jLWVudGVyLWxhc3Qgc3RhdHVzIChnaXQtY3JlYXRlLWZpbGVpbmZvICdhZGRlZCBuZXctbmFtZSBvbGQtcGVybSBuZXctcGVybSAncmVuYW1lIG5hbWUpKSkKKyAgICAgICAgKGV3b2MtZW50ZXItbGFzdCBzdGF0dXMgKGdpdC1jcmVhdGUtZmlsZWluZm8gKGdpdC1zdGF0ZS1jb2RlIHN0YXRlKSBuYW1lIG9sZC1wZXJtIG5ldy1wZXJtKSkpKSkpCisKKyhkZWZ1biBnaXQtZmluZC1zdGF0dXMtZmlsZSAoc3RhdHVzIGZpbGUpCisgICJGaW5kIGEgZ2l2ZW4gZmlsZSBpbiB0aGUgc3RhdHVzIGV3b2MgYW5kIHJldHVybiBpdHMgbm9kZS4iCisgIChsZXQgKChub2RlIChld29jLW50aCBzdGF0dXMgMCkpKQorICAgICh3aGlsZSAoYW5kIG5vZGUgKG5vdCAoc3RyaW5nPSBmaWxlIChnaXQtZmlsZWluZm8tPm5hbWUgKGV3b2MtZGF0YSBub2RlKSkpKSkKKyAgICAgIChzZXRxIG5vZGUgKGV3b2MtbmV4dCBzdGF0dXMgbm9kZSkpKQorICAgIG5vZGUpKQorCisoZGVmdW4gZ2l0LXBhcnNlLWxzLWZpbGVzIChzdGF0dXMgZGVmYXVsdC1zdGF0ZSAmb3B0aW9uYWwgc2tpcC1leGlzdGluZykKKyAgIlBhcnNlIHRoZSBvdXRwdXQgb2YgZ2l0LWxzLWZpbGVzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4iCisgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCisgIChsZXQgKGluZm9saXN0KQorICAgICh3aGlsZSAocmUtc2VhcmNoLWZvcndhcmQgIlxcKFtITVJDSz9dXFwpIFxcKFteXDBdKlxcKVwwIiBuaWwgdCAxKQorICAgICAgKGxldCAoKHN0YXRlIChtYXRjaC1zdHJpbmcgMSkpCisgICAgICAgICAgICAobmFtZSAobWF0Y2gtc3RyaW5nIDIpKSkKKyAgICAgICAgKHVubGVzcyAoYW5kIHNraXAtZXhpc3RpbmcgKGdpdC1maW5kLXN0YXR1cy1maWxlIHN0YXR1cyBuYW1lKSkKKyAgICAgICAgICAocHVzaCAoZ2l0LWNyZWF0ZS1maWxlaW5mbyAob3IgKGdpdC1zdGF0ZS1jb2RlIHN0YXRlKSBkZWZhdWx0LXN0YXRlKSBuYW1lKSBpbmZvbGlzdCkpKSkKKyAgICAoZG9saXN0IChpbmZvIChucmV2ZXJzZSBpbmZvbGlzdCkpCisgICAgICAoZXdvYy1lbnRlci1sYXN0IHN0YXR1cyBpbmZvKSkpKQorCisoZGVmdW4gZ2l0LXBhcnNlLWxzLXVubWVyZ2VkIChzdGF0dXMpCisgICJQYXJzZSB0aGUgb3V0cHV0IG9mIGdpdC1scy1maWxlcyAtdSBpbiB0aGUgY3VycmVudCBidWZmZXIuIgorICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAobGV0IChmaWxlcykKKyAgICAod2hpbGUgKHJlLXNlYXJjaC1mb3J3YXJkICJbMC03XVxcezZcXH0gWzAtOWEtZl1cXHs0MFxcfSBbMTIzXVx0XFwoW15cMF0rXFwpXDAiIG5pbCB0KQorICAgICAgKGxldCAoKG5vZGUgKGdpdC1maW5kLXN0YXR1cy1maWxlIHN0YXR1cyAobWF0Y2gtc3RyaW5nIDEpKSkpCisgICAgICAgICh3aGVuIG5vZGUgKHB1c2ggKGV3b2MtZGF0YSBub2RlKSBmaWxlcykpKSkKKyAgICAoZ2l0LXNldC1maWxlcy1zdGF0ZSBmaWxlcyAndW5tZXJnZWQpKSkKKworKGRlZnVuIGdpdC1hZGQtc3RhdHVzLWZpbGUgKHN0YXRlIG5hbWUpCisgICJBZGQgYSBuZXcgZmlsZSB0byB0aGUgc3RhdHVzIGxpc3QgKGlmIG5vdCBleGlzdGluZyBhbHJlYWR5KSBhbmQgcmV0dXJuIGl0cyBub2RlLiIKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAob3IgKGdpdC1maW5kLXN0YXR1cy1maWxlIGdpdC1zdGF0dXMgbmFtZSkKKyAgICAgIChld29jLWVudGVyLWxhc3QgZ2l0LXN0YXR1cyAoZ2l0LWNyZWF0ZS1maWxlaW5mbyBzdGF0ZSBuYW1lKSkpKQorCisoZGVmdW4gZ2l0LW1hcmtlZC1maWxlcyAoKQorICAiUmV0dXJuIGEgbGlzdCBvZiBhbGwgbWFya2VkIGZpbGVzLCBvciBpZiBub25lIGEgbGlzdCBjb250YWluaW5nIGp1c3QgdGhlIGZpbGUgYXQgY3Vyc29yIHBvc2l0aW9uLiIKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAob3IgKGV3b2MtY29sbGVjdCBnaXQtc3RhdHVzIChsYW1iZGEgKGluZm8pIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSkpCisgICAgICAobGlzdCAoZXdvYy1kYXRhIChld29jLWxvY2F0ZSBnaXQtc3RhdHVzKSkpKSkKKworKGRlZnVuIGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgKCZyZXN0IHN0YXRlcykKKyAgIlJldHVybiBtYXJrZWQgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIHNwZWNpZmllZCBzdGF0ZXMuIgorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKQorICAgICAgICByZXN1bHQpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgICh3aGVuIChtZW1xIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pIHN0YXRlcykKKyAgICAgICAgKHB1c2ggaW5mbyByZXN1bHQpKSkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gZ2l0LXJlZnJlc2gtZmlsZXMgKCkKKyAgIlJlZnJlc2ggYWxsIGZpbGVzIHRoYXQgbmVlZCBpdCBhbmQgY2xlYXIgdGhlIG5lZWRzLXJlZnJlc2ggZmxhZy4iCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGV3b2MtbWFwCisgICAobGFtYmRhIChpbmZvKQorICAgICAobGV0ICgocmVmcmVzaCAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pKSkKKyAgICAgICAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5uZWVkcy1yZWZyZXNoIGluZm8pIG5pbCkKKyAgICAgICByZWZyZXNoKSkKKyAgIGdpdC1zdGF0dXMpCisgIDsgbW92ZSBiYWNrIHRvIGdvYWwgY29sdW1uCisgICh3aGVuIGdvYWwtY29sdW1uIChtb3ZlLXRvLWNvbHVtbiBnb2FsLWNvbHVtbikpKQorCisoZGVmdW4gZ2l0LXJlZnJlc2gtZXdvYy1oZiAoc3RhdHVzKQorICAiUmVmcmVzaCB0aGUgZXdvYyBoZWFkZXIgYW5kIGZvb3Rlci4iCisgIChsZXQgKChicmFuY2ggKGdpdC1zeW1ib2xpYy1yZWYgIkhFQUQiKSkKKyAgICAgICAgKGhlYWQgKGlmIChnaXQtZW1wdHktZGItcCkgIk5vdGhpbmcgY29tbWl0dGVkIHlldCIKKyAgICAgICAgICAgICAgICAoc3Vic3RyaW5nIChnaXQtcmV2LXBhcnNlICJIRUFEIikgMCAxMCkpKQorICAgICAgICAobWVyZ2UtaGVhZHMgKGdpdC1nZXQtbWVyZ2UtaGVhZHMpKSkKKyAgICAoZXdvYy1zZXQtaGYgc3RhdHVzCisgICAgICAgICAgICAgICAgIChmb3JtYXQgIkRpcmVjdG9yeTogICVzXG5CcmFuY2g6ICAgICAlc1xuSGVhZDogICAgICAgJXMlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQtZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmctbWF0Y2ggIl5yZWZzL2hlYWRzLyIgYnJhbmNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Vic3RyaW5nIGJyYW5jaCAobWF0Y2gtZW5kIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoKQorICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbWVyZ2UtaGVhZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAiXG5NZXJnaW5nOiAgICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNvbmNhdCAobGFtYmRhIChzdHIpIChzdWJzdHJpbmcgc3RyIDAgMTApKSBtZXJnZS1oZWFkcyAiICIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpKQorICAgICAgICAgICAgICAgICAoaWYgKGV3b2MtbnRoIHN0YXR1cyAwKSAiIiAiICAgIE5vIGNoYW5nZXMuIikpKSkKKworKGRlZnVuIGdpdC1nZXQtZmlsZW5hbWVzIChmaWxlcykKKyAgKG1hcGNhciAobGFtYmRhIChpbmZvKSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKSBmaWxlcykpCisKKyhkZWZ1biBnaXQtdXBkYXRlLWluZGV4IChpbmRleC1maWxlIGZpbGVzKQorICAiUnVuIGdpdC11cGRhdGUtaW5kZXggb24gYSBsaXN0IG9mIGZpbGVzLiIKKyAgKGxldCAoKGVudiAoYW5kIGluZGV4LWZpbGUgYCgoIkdJVF9JTkRFWF9GSUxFIiAuICxpbmRleC1maWxlKSkpKQorICAgICAgICBhZGRlZCBkZWxldGVkIG1vZGlmaWVkKQorICAgIChkb2xpc3QgKGluZm8gZmlsZXMpCisgICAgICAoY2FzZSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKQorICAgICAgICAoJ2FkZGVkIChwdXNoIGluZm8gYWRkZWQpKQorICAgICAgICAoJ2RlbGV0ZWQgKHB1c2ggaW5mbyBkZWxldGVkKSkKKyAgICAgICAgKCdtb2RpZmllZCAocHVzaCBpbmZvIG1vZGlmaWVkKSkpKQorICAgICh3aGVuIGFkZGVkCisgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIGVudiAidXBkYXRlLWluZGV4IiAiLS1hZGQiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGFkZGVkKSkpCisgICAgKHdoZW4gZGVsZXRlZAorICAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kIG5pbCBlbnYgInVwZGF0ZS1pbmRleCIgIi0tcmVtb3ZlIiAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBkZWxldGVkKSkpCisgICAgKHdoZW4gbW9kaWZpZWQKKyAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgZW52ICJ1cGRhdGUtaW5kZXgiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIG1vZGlmaWVkKSkpKSkKKworKGRlZnVuIGdpdC1kby1jb21taXQgKCkKKyAgIlBlcmZvcm0gdGhlIGFjdHVhbCBjb21taXQgdXNpbmcgdGhlIGN1cnJlbnQgYnVmZmVyIGFzIGxvZyBtZXNzYWdlLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoYnVmZmVyIChjdXJyZW50LWJ1ZmZlcikpCisgICAgICAgIChpbmRleC1maWxlIChtYWtlLXRlbXAtZmlsZSAiZ2l0aWR4IikpKQorICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAgIChpZiAoZ2l0LW1hcmtlZC1maWxlcy1zdGF0ZSAndW5tZXJnZWQpCisgICAgICAgICAgKG1lc3NhZ2UgIllvdSBjYW5ub3QgY29tbWl0IHVubWVyZ2VkIGZpbGVzLCByZXNvbHZlIHRoZW0gZmlyc3QuIikKKyAgICAgICAgKHVud2luZC1wcm90ZWN0CisgICAgICAgICAgICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpCisgICAgICAgICAgICAgICAgICBoZWFkIGhlYWQtdHJlZSkKKyAgICAgICAgICAgICAgKHVubGVzcyAoZ2l0LWVtcHR5LWRiLXApCisgICAgICAgICAgICAgICAgKHNldHEgaGVhZCAoZ2l0LXJldi1wYXJzZSAiSEVBRCIpCisgICAgICAgICAgICAgICAgICAgICAgaGVhZC10cmVlIChnaXQtcmV2LXBhcnNlICJIRUFEXnt0cmVlfSIpKSkKKyAgICAgICAgICAgICAgKGlmIGZpbGVzCisgICAgICAgICAgICAgICAgICAocHJvZ24KKyAgICAgICAgICAgICAgICAgICAgKGdpdC1yZWFkLXRyZWUgaGVhZC10cmVlIGluZGV4LWZpbGUpCisgICAgICAgICAgICAgICAgICAgIChnaXQtdXBkYXRlLWluZGV4IG5pbCBmaWxlcykgICAgICAgICA7dXBkYXRlIGJvdGggdGhlIGRlZmF1bHQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgKGdpdC11cGRhdGUtaW5kZXggaW5kZXgtZmlsZSBmaWxlcykgIDthbmQgdGhlIHRlbXBvcmFyeSBvbmUKKyAgICAgICAgICAgICAgICAgICAgKGxldCAoKHRyZWUgKGdpdC13cml0ZS10cmVlIGluZGV4LWZpbGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAoaWYgKG9yIChub3QgKHN0cmluZy1lcXVhbCB0cmVlIGhlYWQtdHJlZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeWVzLW9yLW5vLXAgIlRoZSB0cmVlIHdhcyBub3QgbW9kaWZpZWQsIGRvIHlvdSByZWFsbHkgd2FudCB0byBwZXJmb3JtIGFuIGVtcHR5IGNvbW1pdD8gIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgKChjb21taXQgKGdpdC1jb21taXQtdHJlZSBidWZmZXIgdHJlZSBoZWFkKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpdC11cGRhdGUtcmVmICJIRUFEIiBjb21taXQgaGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZGl0aW9uLWNhc2UgbmlsIChkZWxldGUtZmlsZSAiLmdpdC9NRVJHRV9IRUFEIikgKGVycm9yIG5pbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyIChlcmFzZS1idWZmZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICd1cHRvZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiAoZmlsZS1kaXJlY3RvcnktcCAiLmdpdC9yci1jYWNoZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJ1bi1jb21tYW5kIG5pbCBuaWwgInJlcmVyZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtcmVmcmVzaC1maWxlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LXJlZnJlc2gtZXdvYy1oZiBnaXQtc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlICJDb21taXR0ZWQgJXMuIiBjb21taXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIkNvbW1pdCBhYm9ydGVkLiIpKSkpCisgICAgICAgICAgICAgICAgKG1lc3NhZ2UgIk5vIGZpbGVzIHRvIGNvbW1pdC4iKSkpCisgICAgICAgICAgKGRlbGV0ZS1maWxlIGluZGV4LWZpbGUpKSkpKSkKKworCis7Ozs7IEludGVyYWN0aXZlIGZ1bmN0aW9ucworOzs7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKGRlZnVuIGdpdC1tYXJrLWZpbGUgKCkKKyAgIk1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSB0KQorICAgIChld29jLWludmFsaWRhdGUgZ2l0LXN0YXR1cyBwb3MpCisgICAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgMSkpKQorCisoZGVmdW4gZ2l0LXVubWFyay1maWxlICgpCisgICJVbm1hcmsgdGhlIGZpbGUgdGhhdCB0aGUgY3Vyc29yIGlzIG9uIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSBuaWwpCisgICAgKGV3b2MtaW52YWxpZGF0ZSBnaXQtc3RhdHVzIHBvcykKKyAgICAoZXdvYy1nb3RvLW5leHQgZ2l0LXN0YXR1cyAxKSkpCisKKyhkZWZ1biBnaXQtdW5tYXJrLWZpbGUtdXAgKCkKKyAgIlVubWFyayB0aGUgZmlsZSB0aGF0IHRoZSBjdXJzb3IgaXMgb24gYW5kIG1vdmUgdG8gdGhlIHByZXZpb3VzIG9uZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAobGV0KiAoKHBvcyAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpCisgICAgICAgICAoaW5mbyAoZXdvYy1kYXRhIHBvcykpKQorICAgIChzZXRmIChnaXQtZmlsZWluZm8tPm1hcmtlZCBpbmZvKSBuaWwpCisgICAgKGV3b2MtaW52YWxpZGF0ZSBnaXQtc3RhdHVzIHBvcykKKyAgICAoZXdvYy1nb3RvLXByZXYgZ2l0LXN0YXR1cyAxKSkpCisKKyhkZWZ1biBnaXQtbWFyay1hbGwgKCkKKyAgIk1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgdCkgdCkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC11bm1hcmstYWxsICgpCisgICJVbm1hcmsgYWxsIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChld29jLW1hcCAobGFtYmRhIChpbmZvKSAoc2V0ZiAoZ2l0LWZpbGVpbmZvLT5tYXJrZWQgaW5mbykgbmlsKSB0KSBnaXQtc3RhdHVzKQorICA7IG1vdmUgYmFjayB0byBnb2FsIGNvbHVtbiBhZnRlciBpbnZhbGlkYXRlCisgICh3aGVuIGdvYWwtY29sdW1uIChtb3ZlLXRvLWNvbHVtbiBnb2FsLWNvbHVtbikpKQorCisoZGVmdW4gZ2l0LXRvZ2dsZS1hbGwtbWFya3MgKCkKKyAgIlRvZ2dsZSBhbGwgZmlsZSBtYXJrcy4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1tYXAgKGxhbWJkYSAoaW5mbykgKHNldGYgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pIChub3QgKGdpdC1maWxlaW5mby0+bWFya2VkIGluZm8pKSkgdCkgZ2l0LXN0YXR1cykKKyAgOyBtb3ZlIGJhY2sgdG8gZ29hbCBjb2x1bW4gYWZ0ZXIgaW52YWxpZGF0ZQorICAod2hlbiBnb2FsLWNvbHVtbiAobW92ZS10by1jb2x1bW4gZ29hbC1jb2x1bW4pKSkKKworKGRlZnVuIGdpdC1uZXh0LWZpbGUgKCZvcHRpb25hbCBuKQorICAiTW92ZSB0aGUgc2VsZWN0aW9uIGRvd24gTiBmaWxlcy4iCisgIChpbnRlcmFjdGl2ZSAicCIpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGV3b2MtZ290by1uZXh0IGdpdC1zdGF0dXMgbikpCisKKyhkZWZ1biBnaXQtcHJldi1maWxlICgmb3B0aW9uYWwgbikKKyAgIk1vdmUgdGhlIHNlbGVjdGlvbiB1cCBOIGZpbGVzLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKHVubGVzcyBnaXQtc3RhdHVzIChlcnJvciAiTm90IGluIGdpdC1zdGF0dXMgYnVmZmVyLiIpKQorICAoZXdvYy1nb3RvLXByZXYgZ2l0LXN0YXR1cyBuKSkKKworKGRlZnVuIGdpdC1hZGQtZmlsZSAoKQorICAiQWRkIG1hcmtlZCBmaWxlKHMpIHRvIHRoZSBpbmRleCBjYWNoZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICd1bmtub3duKSkpCisgICAgKHVubGVzcyBmaWxlcworICAgICAgKHB1c2ggKGV3b2MtZGF0YQorICAgICAgICAgICAgIChnaXQtYWRkLXN0YXR1cy1maWxlICdhZGRlZCAoZmlsZS1yZWxhdGl2ZS1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1maWxlLW5hbWUgIkZpbGUgdG8gYWRkOiAiIG5pbCBuaWwgdCkpKSkKKyAgICAgICAgICAgIGZpbGVzKSkKKyAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1pbmZvLW9ubHkiICItLWFkZCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICdhZGRlZCkKKyAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpKSkKKworKGRlZnVuIGdpdC1pZ25vcmUtZmlsZSAoKQorICAiQWRkIG1hcmtlZCBmaWxlKHMpIHRvIHRoZSBpZ25vcmUgbGlzdC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzLXN0YXRlICd1bmtub3duKSkpCisgICAgKHVubGVzcyBmaWxlcworICAgICAgKHB1c2ggKGV3b2MtZGF0YQorICAgICAgICAgICAgIChnaXQtYWRkLXN0YXR1cy1maWxlICd1bmtub3duIChmaWxlLXJlbGF0aXZlLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWQtZmlsZS1uYW1lICJGaWxlIHRvIGlnbm9yZTogIiBuaWwgbmlsIHQpKSkpCisgICAgICAgICAgICBmaWxlcykpCisgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykgKGdpdC1hcHBlbmQtdG8taWdub3JlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpKQorICAgIChnaXQtc2V0LWZpbGVzLXN0YXRlIGZpbGVzICdpZ25vcmVkKQorICAgIChnaXQtcmVmcmVzaC1maWxlcykpKQorCisoZGVmdW4gZ2l0LXJlbW92ZS1maWxlICgpCisgICJSZW1vdmUgdGhlIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdtb2RpZmllZCAndW5rbm93biAndXB0b2RhdGUpKSkKKyAgICAodW5sZXNzIGZpbGVzCisgICAgICAocHVzaCAoZXdvYy1kYXRhCisgICAgICAgICAgICAgKGdpdC1hZGQtc3RhdHVzLWZpbGUgJ3Vua25vd24gKGZpbGUtcmVsYXRpdmUtbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVhZC1maWxlLW5hbWUgIkZpbGUgdG8gcmVtb3ZlOiAiIG5pbCBuaWwgdCkpKSkKKyAgICAgICAgICAgIGZpbGVzKSkKKyAgICAoaWYgKHllcy1vci1uby1wCisgICAgICAgICAoZm9ybWF0ICJSZW1vdmUgJWQgZmlsZSVzPyAiIChsZW5ndGggZmlsZXMpIChpZiAoPiAobGVuZ3RoIGZpbGVzKSAxKSAicyIgIiIpKSkKKyAgICAgICAgKHByb2duCisgICAgICAgICAgKGRvbGlzdCAoaW5mbyBmaWxlcykKKyAgICAgICAgICAgIChsZXQgKChuYW1lIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpKQorICAgICAgICAgICAgICAod2hlbiAoZmlsZS1leGlzdHMtcCBuYW1lKSAoZGVsZXRlLWZpbGUgbmFtZSkpKSkKKyAgICAgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1pbmZvLW9ubHkiICItLXJlbW92ZSIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgICAgICAgIDsgcmVtb3ZlIHVua25vd24gZmlsZXMgZnJvbSB0aGUgbGlzdCwgc2V0IHRoZSBvdGhlcnMgdG8gZGVsZXRlZAorICAgICAgICAgIChld29jLWZpbHRlciBnaXQtc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKGluZm8gZmlsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoYW5kIChtZW1xIGluZm8gZmlsZXMpIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSAndW5rbm93bikpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpCisgICAgICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ2RlbGV0ZWQpCisgICAgICAgICAgKGdpdC1yZWZyZXNoLWZpbGVzKQorICAgICAgICAgICh1bmxlc3MgKGV3b2MtbnRoIGdpdC1zdGF0dXMgMCkgIDsgcmVmcmVzaCBoZWFkZXIgaWYgbGlzdCBpcyBlbXB0eQorICAgICAgICAgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgZ2l0LXN0YXR1cykpKQorICAgICAgKG1lc3NhZ2UgIkFib3J0aW5nIikpKSkKKworKGRlZnVuIGdpdC1yZXZlcnQtZmlsZSAoKQorICAiUmV2ZXJ0IGNoYW5nZXMgdG8gdGhlIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMpKQorICAgICAgICBhZGRlZCBtb2RpZmllZCkKKyAgICAod2hlbiAoYW5kIGZpbGVzCisgICAgICAgICAgICAgICAoeWVzLW9yLW5vLXAKKyAgICAgICAgICAgICAgICAoZm9ybWF0ICJSZXZlcnQgJWQgZmlsZSVzPyAiIChsZW5ndGggZmlsZXMpIChpZiAoPiAobGVuZ3RoIGZpbGVzKSAxKSAicyIgIiIpKSkpCisgICAgICAoZG9saXN0IChpbmZvIGZpbGVzKQorICAgICAgICAoY2FzZSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKQorICAgICAgICAgICgnYWRkZWQgKHB1c2ggaW5mbyBhZGRlZCkpCisgICAgICAgICAgKCdkZWxldGVkIChwdXNoIGluZm8gbW9kaWZpZWQpKQorICAgICAgICAgICgndW5tZXJnZWQgKHB1c2ggaW5mbyBtb2RpZmllZCkpCisgICAgICAgICAgKCdtb2RpZmllZCAocHVzaCBpbmZvIG1vZGlmaWVkKSkpKQorICAgICAgKHdoZW4gYWRkZWQKKyAgICAgICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQgbmlsIG5pbCAidXBkYXRlLWluZGV4IiAiLS1mb3JjZS1yZW1vdmUiICItLSIgKGdpdC1nZXQtZmlsZW5hbWVzIGFkZGVkKSkKKyAgICAgICAgICAoZ2l0LXNldC1maWxlcy1zdGF0ZSBhZGRlZCAndW5rbm93bikpCisgICAgICAod2hlbiBtb2RpZmllZAorICAgICAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJjaGVja291dCIgIkhFQUQiIChnaXQtZ2V0LWZpbGVuYW1lcyBtb2RpZmllZCkpCisgICAgICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgbW9kaWZpZWQgJ3VwdG9kYXRlKSkKKyAgICAgIChnaXQtcmVmcmVzaC1maWxlcykpKSkKKworKGRlZnVuIGdpdC1yZXNvbHZlLWZpbGUgKCkKKyAgIlJlc29sdmUgY29uZmxpY3RzIGluIG1hcmtlZCBmaWxlKHMpLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0ICgoZmlsZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ3VubWVyZ2VkKSkpCisgICAgKHdoZW4gZmlsZXMKKyAgICAgIChhcHBseSAjJ2dpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKQorICAgICAgKGdpdC1zZXQtZmlsZXMtc3RhdGUgZmlsZXMgJ21vZGlmaWVkKQorICAgICAgKGdpdC1yZWZyZXNoLWZpbGVzKSkpKQorCisoZGVmdW4gZ2l0LXJlbW92ZS1oYW5kbGVkICgpCisgICJSZW1vdmUgaGFuZGxlZCBmaWxlcyBmcm9tIHRoZSBzdGF0dXMgbGlzdC4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGV3b2MtZmlsdGVyIGdpdC1zdGF0dXMKKyAgICAgICAgICAgICAgIChsYW1iZGEgKGluZm8pCisgICAgICAgICAgICAgICAgIChub3QgKG9yIChlcSAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSAnaWdub3JlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVxIChnaXQtZmlsZWluZm8tPnN0YXRlIGluZm8pICd1cHRvZGF0ZSkpKSkpCisgICh1bmxlc3MgKGV3b2MtbnRoIGdpdC1zdGF0dXMgMCkgIDsgcmVmcmVzaCBoZWFkZXIgaWYgbGlzdCBpcyBlbXB0eQorICAgIChnaXQtcmVmcmVzaC1ld29jLWhmIGdpdC1zdGF0dXMpKSkKKworKGRlZnVuIGdpdC1zZXR1cC1kaWZmLWJ1ZmZlciAoYnVmZmVyKQorICAiU2V0dXAgYSBidWZmZXIgZm9yIGRpc3BsYXlpbmcgYSBkaWZmLiIKKyAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgKGRpZmYtbW9kZSkKKyAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgIChzZXRxIGJ1ZmZlci1yZWFkLW9ubHkgdCkpCisgIChkaXNwbGF5LWJ1ZmZlciBidWZmZXIpCisgIChzaHJpbmstd2luZG93LWlmLWxhcmdlci10aGFuLWJ1ZmZlcikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlICgpCisgICJEaWZmIHRoZSBtYXJrZWQgZmlsZShzKSBhZ2FpbnN0IEhFQUQuIgorICAoaW50ZXJhY3RpdmUpCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtaW5kZXgiICItcCIgIi1NIiAiSEVBRCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1tZXJnZS1oZWFkIChhcmcpCisgICJEaWZmIHRoZSBtYXJrZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBmaXJzdCBtZXJnZSBoZWFkIChvciB0aGUgbnRoIG9uZSB3aXRoIGEgbnVtZXJpYyBwcmVmaXgpLiIKKyAgKGludGVyYWN0aXZlICJwIikKKyAgKGxldCAoKGZpbGVzIChnaXQtbWFya2VkLWZpbGVzKSkKKyAgICAgICAgKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkpCisgICAgKHVubGVzcyBtZXJnZS1oZWFkcyAoZXJyb3IgIk5vIG1lcmdlIGluIHByb2dyZXNzIikpCisgICAgKGdpdC1zZXR1cC1kaWZmLWJ1ZmZlcgorICAgICAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtYnVmZmVyICIqZ2l0LWRpZmYqIiAiZGlmZi1pbmRleCIgIi1wIiAiLU0iCisgICAgICAgICAgICAob3IgKG50aCAoMS0gYXJnKSBtZXJnZS1oZWFkcykgIkhFQUQiKSAiLS0iIChnaXQtZ2V0LWZpbGVuYW1lcyBmaWxlcykpKSkpCisKKyhkZWZ1biBnaXQtZGlmZi11bm1lcmdlZC1maWxlIChzdGFnZSkKKyAgIkRpZmYgdGhlIG1hcmtlZCB1bm1lcmdlZCBmaWxlKHMpIGFnYWluc3QgdGhlIHNwZWNpZmllZCBzdGFnZS4iCisgIChsZXQgKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpKQorICAgIChnaXQtc2V0dXAtZGlmZi1idWZmZXIKKyAgICAgKGFwcGx5ICMnZ2l0LXJ1bi1jb21tYW5kLWJ1ZmZlciAiKmdpdC1kaWZmKiIgImRpZmYtZmlsZXMiICItcCIgc3RhZ2UgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1iYXNlICgpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBjb21tb24gYmFzZSBmaWxlLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLTEiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtbWluZSAoKQorICAiRGlmZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykgYWdhaW5zdCBteSBwcmUtbWVyZ2UgdmVyc2lvbi4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGdpdC1kaWZmLXVubWVyZ2VkLWZpbGUgIi0yIikpCisKKyhkZWZ1biBnaXQtZGlmZi1maWxlLW90aGVyICgpCisgICJEaWZmIHRoZSBtYXJrZWQgdW5tZXJnZWQgZmlsZShzKSBhZ2FpbnN0IHRoZSBvdGhlcidzIHByZS1tZXJnZSB2ZXJzaW9uLiIKKyAgKGludGVyYWN0aXZlKQorICAoZ2l0LWRpZmYtdW5tZXJnZWQtZmlsZSAiLTMiKSkKKworKGRlZnVuIGdpdC1kaWZmLWZpbGUtY29tYmluZWQgKCkKKyAgIkRvIGEgY29tYmluZWQgZGlmZiBvZiB0aGUgbWFya2VkIHVubWVyZ2VkIGZpbGUocykuIgorICAoaW50ZXJhY3RpdmUpCisgIChnaXQtZGlmZi11bm1lcmdlZC1maWxlICItYyIpKQorCisoZGVmdW4gZ2l0LWRpZmYtZmlsZS1pZGlmZiAoKQorICAiUGVyZm9ybSBhbiBpbnRlcmFjdGl2ZSBkaWZmIG9uIHRoZSBjdXJyZW50IGZpbGUuIgorICAoaW50ZXJhY3RpdmUpCisgIChlcnJvciAiSW50ZXJhY3RpdmUgZGlmZnMgbm90IGltcGxlbWVudGVkIHlldC4iKSkKKworKGRlZnVuIGdpdC1sb2ctZmlsZSAoKQorICAiRGlzcGxheSBhIGxvZyBvZiBjaGFuZ2VzIHRvIHRoZSBtYXJrZWQgZmlsZShzKS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGxldCogKChmaWxlcyAoZ2l0LW1hcmtlZC1maWxlcykpCisgICAgICAgICAoY29kaW5nLXN5c3RlbS1mb3ItcmVhZCBnaXQtY29tbWl0cy1jb2Rpbmctc3lzdGVtKQorICAgICAgICAgKGJ1ZmZlciAoYXBwbHkgIydnaXQtcnVuLWNvbW1hbmQtYnVmZmVyICIqZ2l0LWxvZyoiICJyZXYtbGlzdCIgIi0tcHJldHR5IiAiSEVBRCIgIi0tIiAoZ2l0LWdldC1maWxlbmFtZXMgZmlsZXMpKSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICA7IChnaXQtbG9nLW1vZGUpICBGSVhNRTogaW1wbGVtZW50IGxvZyBtb2RlCisgICAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQorICAgICAgKHNldHEgYnVmZmVyLXJlYWQtb25seSB0KSkKKyAgICAoZGlzcGxheS1idWZmZXIgYnVmZmVyKSkpCisKKyhkZWZ1biBnaXQtbG9nLWVkaXQtZmlsZXMgKCkKKyAgIlJldHVybiBhIGxpc3Qgb2YgbWFya2VkIGZpbGVzIGZvciB1c2UgaW4gdGhlIGxvZy1lZGl0IGJ1ZmZlci4iCisgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGxvZy1lZGl0LXBhcmVudC1idWZmZXIKKyAgICAoZ2l0LWdldC1maWxlbmFtZXMgKGdpdC1tYXJrZWQtZmlsZXMtc3RhdGUgJ2FkZGVkICdkZWxldGVkICdtb2RpZmllZCkpKSkKKworKGRlZnVuIGdpdC1jb21taXQtZmlsZSAoKQorICAiQ29tbWl0IHRoZSBtYXJrZWQgZmlsZShzKSwgYXNraW5nIGZvciBhIGNvbW1pdCBtZXNzYWdlLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChidWZmZXIgKGdldC1idWZmZXItY3JlYXRlICIqZ2l0LWNvbW1pdCoiKSkKKyAgICAgICAgKG1lcmdlLWhlYWRzIChnaXQtZ2V0LW1lcmdlLWhlYWRzKSkKKyAgICAgICAgKGRpciBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgICAgICAgKHNpZ24tb2ZmIGdpdC1hcHBlbmQtc2lnbmVkLW9mZi1ieSkpCisgICAgKHdpdGgtY3VycmVudC1idWZmZXIgYnVmZmVyCisgICAgICAod2hlbiAoZXEgMCAoYnVmZmVyLXNpemUpKQorICAgICAgICAoY2QgZGlyKQorICAgICAgICAoZXJhc2UtYnVmZmVyKQorICAgICAgICAoaW5zZXJ0CisgICAgICAgICAocHJvcGVydGl6ZQorICAgICAgICAgIChmb3JtYXQgIkF1dGhvcjogJXMgPCVzPlxuJXMiCisgICAgICAgICAgICAgICAgICAoZ2l0LWdldC1jb21taXR0ZXItbmFtZSkgKGdpdC1nZXQtY29tbWl0dGVyLWVtYWlsKQorICAgICAgICAgICAgICAgICAgKGlmIG1lcmdlLWhlYWRzCisgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCAiUGFyZW50OiAlc1xuJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaXQtcmV2LXBhcnNlICJIRUFEIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXBjb25jYXQgKGxhbWJkYSAoc3RyKSAoY29uY2F0ICJQYXJlbnQ6ICIgc3RyKSkgbWVyZ2UtaGVhZHMgIlxuIikpCisgICAgICAgICAgICAgICAgICAgICIiKSkKKyAgICAgICAgICAnZmFjZSAnZ2l0LWhlYWRlci1mYWNlKQorICAgICAgICAgKHByb3BlcnRpemUgZ2l0LWxvZy1tc2ctc2VwYXJhdG9yICdmYWNlICdnaXQtc2VwYXJhdG9yLWZhY2UpCisgICAgICAgICAiXG4iKQorICAgICAgICAoY29uZCAoKGFuZCBtZXJnZS1oZWFkcyAoZmlsZS1yZWFkYWJsZS1wICIuZ2l0L01FUkdFX01TRyIpKQorICAgICAgICAgICAgICAgKGluc2VydC1maWxlLWNvbnRlbnRzICIuZ2l0L01FUkdFX01TRyIpKQorICAgICAgICAgICAgICAoc2lnbi1vZmYKKyAgICAgICAgICAgICAgIChpbnNlcnQgKGZvcm1hdCAiXG5cblNpZ25lZC1vZmYtYnk6ICVzIDwlcz5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2l0LWdldC1jb21taXR0ZXItbmFtZSkgKGdpdC1nZXQtY29tbWl0dGVyLWVtYWlsKSkpKSkpKQorICAgIChsZXQgKChsb2ctZWRpdC1mb250LWxvY2sta2V5d29yZHMKKyAgICAgICAgICAgYCgoIl5cXChBdXRob3I6XFx8RGF0ZTpcXHxQYXJlbnQ6XFx8U2lnbmVkLW9mZi1ieTpcXClcXCguKlxcKSIKKyAgICAgICAgICAgICAgKDEgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkKKyAgICAgICAgICAgICAgKDIgZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkpCisgICAgICAgICAgICAgKCwoY29uY2F0ICJeXFwoIiAocmVnZXhwLXF1b3RlIGdpdC1sb2ctbXNnLXNlcGFyYXRvcikgIlxcKSQiKQorICAgICAgICAgICAgICAoMSBmb250LWxvY2stY29tbWVudC1mYWNlKSkpKSkKKyAgICAgIChsb2ctZWRpdCAjJ2dpdC1kby1jb21taXQgbmlsICMnZ2l0LWxvZy1lZGl0LWZpbGVzIGJ1ZmZlcikpKSkKKworKGRlZnVuIGdpdC1maW5kLWZpbGUgKCkKKyAgIlZpc2l0IHRoZSBjdXJyZW50IGZpbGUgaW4gaXRzIG93biBidWZmZXIuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGluZm8gKGV3b2MtZGF0YSAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpKSkKKyAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHdoZW4gKGVxICd1bm1lcmdlZCAoZ2l0LWZpbGVpbmZvLT5zdGF0ZSBpbmZvKSkKKyAgICAgIChzbWVyZ2UtbW9kZSkpKSkKKworKGRlZnVuIGdpdC1maW5kLWZpbGUtaW1lcmdlICgpCisgICJWaXNpdCB0aGUgY3VycmVudCBmaWxlIGluIGludGVyYWN0aXZlIG1lcmdlIG1vZGUuIgorICAoaW50ZXJhY3RpdmUpCisgICh1bmxlc3MgZ2l0LXN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgKGxldCAoKGluZm8gKGV3b2MtZGF0YSAoZXdvYy1sb2NhdGUgZ2l0LXN0YXR1cykpKSkKKyAgICAoZmluZC1maWxlIChnaXQtZmlsZWluZm8tPm5hbWUgaW5mbykpCisgICAgKHNtZXJnZS1lZGlmZikpKQorCisoZGVmdW4gZ2l0LXZpZXctZmlsZSAoKQorICAiVmlldyB0aGUgY3VycmVudCBmaWxlIGluIGl0cyBvd24gYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAodW5sZXNzIGdpdC1zdGF0dXMgKGVycm9yICJOb3QgaW4gZ2l0LXN0YXR1cyBidWZmZXIuIikpCisgIChsZXQgKChpbmZvIChld29jLWRhdGEgKGV3b2MtbG9jYXRlIGdpdC1zdGF0dXMpKSkpCisgICAgKHZpZXctZmlsZSAoZ2l0LWZpbGVpbmZvLT5uYW1lIGluZm8pKSkpCisKKyhkZWZ1biBnaXQtcmVmcmVzaC1zdGF0dXMgKCkKKyAgIlJlZnJlc2ggdGhlIGdpdCBzdGF0dXMgYnVmZmVyLiIKKyAgKGludGVyYWN0aXZlKQorICAobGV0KiAoKHN0YXR1cyBnaXQtc3RhdHVzKQorICAgICAgICAgKHBvcyAoZXdvYy1sb2NhdGUgc3RhdHVzKSkKKyAgICAgICAgIChjdXItbmFtZSAoYW5kIHBvcyAoZ2l0LWZpbGVpbmZvLT5uYW1lIChld29jLWRhdGEgcG9zKSkpKSkKKyAgICAodW5sZXNzIHN0YXR1cyAoZXJyb3IgIk5vdCBpbiBnaXQtc3RhdHVzIGJ1ZmZlci4iKSkKKyAgICAoZ2l0LWNsZWFyLXN0YXR1cyBzdGF0dXMpCisgICAgKGdpdC1ydW4tY29tbWFuZCBuaWwgbmlsICJ1cGRhdGUtaW5kZXgiICItLWluZm8tb25seSIgIi0tcmVmcmVzaCIpCisgICAgKGlmIChnaXQtZW1wdHktZGItcCkKKyAgICAgICAgOyB3ZSBuZWVkIHNvbWUgc3BlY2lhbCBoYW5kbGluZyBmb3IgYW4gZW1wdHkgZGIKKyAgICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgICAoZ2l0LXJ1bi1jb21tYW5kIHQgbmlsICJscy1maWxlcyIgIi16IiAiLXQiICItYyIpCisgICAgICAgICAgKGdpdC1wYXJzZS1scy1maWxlcyBzdGF0dXMgJ2FkZGVkKSkKKyAgICAgICh3aXRoLXRlbXAtYnVmZmVyCisgICAgICAgIChnaXQtcnVuLWNvbW1hbmQgdCBuaWwgImRpZmYtaW5kZXgiICIteiIgIi1NIiAiSEVBRCIpCisgICAgICAgIChnaXQtcGFyc2Utc3RhdHVzIHN0YXR1cykpKQorICAgICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgICAgKGdpdC1ydW4tY29tbWFuZCB0IG5pbCAibHMtZmlsZXMiICIteiIgIi11IikKKyAgICAgICAgKGdpdC1wYXJzZS1scy11bm1lcmdlZCBzdGF0dXMpKQorICAgICAgKHdoZW4gKGZpbGUtcmVhZGFibGUtcCAiLmdpdC9pbmZvL2V4Y2x1ZGUiKQorICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgICAgIChnaXQtcnVuLWNvbW1hbmQgdCBuaWwgImxzLWZpbGVzIiAiLXoiICItdCIgIi1vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZXhjbHVkZS1mcm9tPS5naXQvaW5mby9leGNsdWRlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCAiLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9IiBnaXQtcGVyLWRpci1pZ25vcmUtZmlsZSkpCisgICAgICAgICAgKGdpdC1wYXJzZS1scy1maWxlcyBzdGF0dXMgJ3Vua25vd24pKSkKKyAgICAoZ2l0LXJlZnJlc2gtZmlsZXMpCisgICAgKGdpdC1yZWZyZXNoLWV3b2MtaGYgc3RhdHVzKQorICAgIDsgbW92ZSBwb2ludCB0byB0aGUgY3VycmVudCBmaWxlIG5hbWUgaWYgYW55CisgICAgKGxldCAoKG5vZGUgKGFuZCBjdXItbmFtZSAoZ2l0LWZpbmQtc3RhdHVzLWZpbGUgc3RhdHVzIGN1ci1uYW1lKSkpKQorICAgICAgKHdoZW4gbm9kZSAoZXdvYy1nb3RvLW5vZGUgc3RhdHVzIG5vZGUpKSkpKQorCisoZGVmdW4gZ2l0LXN0YXR1cy1xdWl0ICgpCisgICJRdWl0IGdpdC1zdGF0dXMgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGJ1cnktYnVmZmVyKSkKKworOzs7OyBNYWpvciBNb2RlCis7Ozs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisoZGVmdmFyIGdpdC1zdGF0dXMtbW9kZS1ob29rIG5pbAorICAiUnVuIGFmdGVyIGBnaXQtc3RhdHVzLW1vZGUnIGlzIHNldHVwLiIpCisKKyhkZWZ2YXIgZ2l0LXN0YXR1cy1tb2RlLW1hcCBuaWwKKyAgIktleW1hcCBmb3IgZ2l0IG1ham9yIG1vZGUuIikKKworKGRlZnZhciBnaXQtc3RhdHVzIG5pbAorICAiTGlzdCBvZiBhbGwgZmlsZXMgbWFuYWdlZCBieSB0aGUgZ2l0LXN0YXR1cyBtb2RlLiIpCisKKyh1bmxlc3MgZ2l0LXN0YXR1cy1tb2RlLW1hcAorICAobGV0ICgobWFwIChtYWtlLWtleW1hcCkpCisgICAgICAgIChkaWZmLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkpCisgICAgKHN1cHByZXNzLWtleW1hcCBtYXApCisgICAgKGRlZmluZS1rZXkgbWFwICI/IiAgICdnaXQtaGVscCkKKyAgICAoZGVmaW5lLWtleSBtYXAgImgiICAgJ2dpdC1oZWxwKQorICAgIChkZWZpbmUta2V5IG1hcCAiICIgICAnZ2l0LW5leHQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImEiICAgJ2dpdC1hZGQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImMiICAgJ2dpdC1jb21taXQtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImQiICAgIGRpZmYtbWFwKQorICAgIChkZWZpbmUta2V5IG1hcCAiPSIgICAnZ2l0LWRpZmYtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgImYiICAgJ2dpdC1maW5kLWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJcciIgICdnaXQtZmluZC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiZyIgICAnZ2l0LXJlZnJlc2gtc3RhdHVzKQorICAgIChkZWZpbmUta2V5IG1hcCAiaSIgICAnZ2l0LWlnbm9yZS1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAibCIgICAnZ2l0LWxvZy1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAibSIgICAnZ2l0LW1hcmstZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIk0iICAgJ2dpdC1tYXJrLWFsbCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIm4iICAgJ2dpdC1uZXh0LWZpbGUpCisgICAgKGRlZmluZS1rZXkgbWFwICJwIiAgICdnaXQtcHJldi1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAicSIgICAnZ2l0LXN0YXR1cy1xdWl0KQorICAgIChkZWZpbmUta2V5IG1hcCAiciIgICAnZ2l0LXJlbW92ZS1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiUiIgICAnZ2l0LXJlc29sdmUtZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlQiICAgJ2dpdC10b2dnbGUtYWxsLW1hcmtzKQorICAgIChkZWZpbmUta2V5IG1hcCAidSIgICAnZ2l0LXVubWFyay1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAiVSIgICAnZ2l0LXJldmVydC1maWxlKQorICAgIChkZWZpbmUta2V5IG1hcCAidiIgICAnZ2l0LXZpZXctZmlsZSkKKyAgICAoZGVmaW5lLWtleSBtYXAgIngiICAgJ2dpdC1yZW1vdmUtaGFuZGxlZCkKKyAgICAoZGVmaW5lLWtleSBtYXAgIlxDLT8iICdnaXQtdW5tYXJrLWZpbGUtdXApCisgICAgKGRlZmluZS1rZXkgbWFwICJcTS1cQy0/IiAnZ2l0LXVubWFyay1hbGwpCisgICAgOyB0aGUgZGlmZiBzdWJtYXAKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiYiIgJ2dpdC1kaWZmLWZpbGUtYmFzZSkKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiYyIgJ2dpdC1kaWZmLWZpbGUtY29tYmluZWQpCisgICAgKGRlZmluZS1rZXkgZGlmZi1tYXAgIj0iICdnaXQtZGlmZi1maWxlKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJlIiAnZ2l0LWRpZmYtZmlsZS1pZGlmZikKKyAgICAoZGVmaW5lLWtleSBkaWZmLW1hcCAiRSIgJ2dpdC1maW5kLWZpbGUtaW1lcmdlKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJoIiAnZ2l0LWRpZmYtZmlsZS1tZXJnZS1oZWFkKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJtIiAnZ2l0LWRpZmYtZmlsZS1taW5lKQorICAgIChkZWZpbmUta2V5IGRpZmYtbWFwICJvIiAnZ2l0LWRpZmYtZmlsZS1vdGhlcikKKyAgICAoc2V0cSBnaXQtc3RhdHVzLW1vZGUtbWFwIG1hcCkpKQorCis7OyBnaXQgbW9kZSBzaG91bGQgb25seSBydW4gaW4gdGhlICpnaXQgc3RhdHVzKiBidWZmZXIKKyhwdXQgJ2dpdC1zdGF0dXMtbW9kZSAnbW9kZS1jbGFzcyAnc3BlY2lhbCkKKworKGRlZnVuIGdpdC1zdGF0dXMtbW9kZSAoKQorICAiTWFqb3IgbW9kZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHaXQuCitDb21tYW5kczoKK1xce2dpdC1zdGF0dXMtbW9kZS1tYXB9IgorICAoa2lsbC1hbGwtbG9jYWwtdmFyaWFibGVzKQorICAoYnVmZmVyLWRpc2FibGUtdW5kbykKKyAgKHNldHEgbW9kZS1uYW1lICJnaXQgc3RhdHVzIgorICAgICAgICBtYWpvci1tb2RlICdnaXQtc3RhdHVzLW1vZGUKKyAgICAgICAgZ29hbC1jb2x1bW4gMTcKKyAgICAgICAgYnVmZmVyLXJlYWQtb25seSB0KQorICAodXNlLWxvY2FsLW1hcCBnaXQtc3RhdHVzLW1vZGUtbWFwKQorICAobGV0ICgoYnVmZmVyLXJlYWQtb25seSBuaWwpKQorICAgIChlcmFzZS1idWZmZXIpCisgIChsZXQgKChzdGF0dXMgKGV3b2MtY3JlYXRlICdnaXQtZmlsZWluZm8tcHJldHR5cHJpbnQgIiIgIiIpKSkKKyAgICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdnaXQtc3RhdHVzKSBzdGF0dXMpKQorICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5KSBkZWZhdWx0LWRpcmVjdG9yeSkKKyAgKHJ1bi1ob29rcyAnZ2l0LXN0YXR1cy1tb2RlLWhvb2spKSkKKworKGRlZnVuIGdpdC1maW5kLXN0YXR1cy1idWZmZXIgKGRpcikKKyAgIkZpbmQgdGhlIGdpdCBzdGF0dXMgYnVmZmVyIGhhbmRsaW5nIGEgc3BlY2lmaWVkIGRpcmVjdG9yeS4iCisgIChsZXQgKChsaXN0IChidWZmZXItbGlzdCkpCisgICAgICAgIChmdWxsZGlyIChleHBhbmQtZmlsZS1uYW1lIGRpcikpCisgICAgICAgIGZvdW5kKQorICAgICh3aGlsZSAoYW5kIGxpc3QgKG5vdCBmb3VuZCkpCisgICAgICAobGV0ICgoYnVmZmVyIChjYXIgbGlzdCkpKQorICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBidWZmZXIKKyAgICAgICAgICAod2hlbiAoYW5kIGxpc3QtYnVmZmVycy1kaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctZXF1YWwgZnVsbGRpciAoZXhwYW5kLWZpbGUtbmFtZSBsaXN0LWJ1ZmZlcnMtZGlyZWN0b3J5KSkKKyAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctbWF0Y2ggIlxcKmdpdC1zdGF0dXNcXCokIiAoYnVmZmVyLW5hbWUgYnVmZmVyKSkpCisgICAgICAgICAgICAoc2V0cSBmb3VuZCBidWZmZXIpKSkpCisgICAgICAoc2V0cSBsaXN0IChjZHIgbGlzdCkpKQorICAgIGZvdW5kKSkKKworKGRlZnVuIGdpdC1zdGF0dXMgKGRpcikKKyAgIkVudHJ5IHBvaW50IGludG8gZ2l0LXN0YXR1cyBtb2RlLiIKKyAgKGludGVyYWN0aXZlICJEU2VsZWN0IGRpcmVjdG9yeTogIikKKyAgKHNldHEgZGlyIChnaXQtZ2V0LXRvcC1kaXIgZGlyKSkKKyAgKGlmIChmaWxlLWRpcmVjdG9yeS1wIChjb25jYXQgKGZpbGUtbmFtZS1hcy1kaXJlY3RvcnkgZGlyKSAiLmdpdCIpKQorICAgICAgKGxldCAoKGJ1ZmZlciAob3IgKGFuZCBnaXQtcmV1c2Utc3RhdHVzLWJ1ZmZlciAoZ2l0LWZpbmQtc3RhdHVzLWJ1ZmZlciBkaXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgKGNyZWF0ZS1maWxlLWJ1ZmZlciAoZXhwYW5kLWZpbGUtbmFtZSAiKmdpdC1zdGF0dXMqIiBkaXIpKSkpKQorICAgICAgICAoc3dpdGNoLXRvLWJ1ZmZlciBidWZmZXIpCisgICAgICAgIChjZCBkaXIpCisgICAgICAgIChnaXQtc3RhdHVzLW1vZGUpCisgICAgICAgIChnaXQtcmVmcmVzaC1zdGF0dXMpCisgICAgICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpKQorICAgIChtZXNzYWdlICIlcyBpcyBub3QgYSBnaXQgd29ya2luZyB0cmVlLiIgZGlyKSkpCisKKyhkZWZ1biBnaXQtaGVscCAoKQorICAiRGlzcGxheSBoZWxwIGZvciBHaXQgbW9kZS4iCisgIChpbnRlcmFjdGl2ZSkKKyAgKGRlc2NyaWJlLWZ1bmN0aW9uICdnaXQtc3RhdHVzLW1vZGUpKQorCisocHJvdmlkZSAnZ2l0KQorOzs7IGdpdC5lbCBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZW1hY3MvdmMtZ2l0LmVsIGIvY29udHJpYi9lbWFjcy92Yy1naXQuZWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2ZWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZW1hY3MvdmMtZ2l0LmVsCkBAIC0wLDAgKzEsMTM2IEBACis7OzsgdmMtZ2l0LmVsIC0tLSBWQyBiYWNrZW5kIGZvciB0aGUgZ2l0IHZlcnNpb24gY29udHJvbCBzeXN0ZW0KKworOzsgQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhhbmRyZSBKdWxsaWFyZAorCis7OyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7OyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworOzsgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKzs7IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzsKKzs7IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKzs7IHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKzs7IHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKzs7IFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7OworOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCis7OyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCis7OyBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorOzsgTUEgMDIxMTEtMTMwNyBVU0EKKworOzs7IENvbW1lbnRhcnk6CisKKzs7IFRoaXMgZmlsZSBjb250YWlucyBhIFZDIGJhY2tlbmQgZm9yIHRoZSBnaXQgdmVyc2lvbiBjb250cm9sCis7OyBzeXN0ZW0uCis7OworOzsgVG8gaW5zdGFsbDogcHV0IHRoaXMgZmlsZSBvbiB0aGUgbG9hZC1wYXRoIGFuZCBhZGQgR0lUIHRvIHRoZSBsaXN0Cis7OyBvZiBzdXBwb3J0ZWQgYmFja2VuZHMgaW4gYHZjLWhhbmRsZWQtYmFja2VuZHMnLgorOzsKKzs7IFRPRE8KKzs7ICAtIGNoYW5nZWxvZyBnZW5lcmF0aW9uCis7OyAgLSB3b3JraW5nIHdpdGggcmV2aXNpb25zIG90aGVyIHRoYW4gSEVBRAorOzsKKworKGRlZnZhciBnaXQtY29tbWl0cy1jb2Rpbmctc3lzdGVtICd1dGYtOAorICAiRGVmYXVsdCBjb2Rpbmcgc3lzdGVtIGZvciBnaXQgY29tbWl0cy4iKQorCisoZGVmdW4gdmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgKGZpbGUgJnJlc3QgYXJncykKKyAgIlJ1biBhIGdpdCBjb21tYW5kIG9uIEZJTEUgYW5kIHJldHVybiBpdHMgb3V0cHV0IGFzIHN0cmluZy4iCisgIChsZXQqICgob2sgdCkKKyAgICAgICAgIChzdHIgKHdpdGgtb3V0cHV0LXRvLXN0cmluZworICAgICAgICAgICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIHN0YW5kYXJkLW91dHB1dAorICAgICAgICAgICAgICAgICAgKHVubGVzcyAoZXEgMCAoYXBwbHkgIydjYWxsLXByb2Nlc3MgImdpdCIgbmlsICcodCBuaWwpIG5pbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGVuZCBhcmdzIChsaXN0IChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpKSkpCisgICAgICAgICAgICAgICAgICAgIChzZXRxIG9rIG5pbCkpKSkpKQorICAgIChhbmQgb2sgc3RyKSkpCisKKyhkZWZ1biB2Yy1naXQtLXJ1bi1jb21tYW5kIChmaWxlICZyZXN0IGFyZ3MpCisgICJSdW4gYSBnaXQgY29tbWFuZCBvbiBGSUxFLCBkaXNjYXJkaW5nIGFueSBvdXRwdXQuIgorICAobGV0ICgobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKSkKKyAgICAoZXEgMCAoYXBwbHkgIydjYWxsLXByb2Nlc3MgImdpdCIgbmlsIChnZXQtYnVmZmVyICIqTWVzc2FnZXMiKSBuaWwgKGFwcGVuZCBhcmdzIChsaXN0IG5hbWUpKSkpKSkKKworKGRlZnVuIHZjLWdpdC1yZWdpc3RlcmVkIChmaWxlKQorICAiQ2hlY2sgd2hldGhlciBGSUxFIGlzIHJlZ2lzdGVyZWQgd2l0aCBnaXQuIgorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChsZXQqICgoZGlyIChmaWxlLW5hbWUtZGlyZWN0b3J5IGZpbGUpKQorICAgICAgICAgICAobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUgZGlyKSkpCisgICAgICAod2hlbiBkaXIgKGNkIGRpcikpCisgICAgICAoYW5kIChlcSAwIChjYWxsLXByb2Nlc3MgImdpdCIgbmlsICcodCBuaWwpIG5pbCAibHMtZmlsZXMiICItYyIgIi16IiAiLS0iIG5hbWUpKQorICAgICAgICAgICAobGV0ICgoc3RyIChidWZmZXItc3RyaW5nKSkpCisgICAgICAgICAgICAgKGFuZCAoPiAobGVuZ3RoIHN0cikgKGxlbmd0aCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgIChzdHJpbmc9IChzdWJzdHJpbmcgc3RyIDAgKDErIChsZW5ndGggbmFtZSkpKSAoY29uY2F0IG5hbWUgIlwwIikpKSkpKSkpCisKKyhkZWZ1biB2Yy1naXQtc3RhdGUgKGZpbGUpCisgICJnaXQtc3BlY2lmaWMgdmVyc2lvbiBvZiBgdmMtc3RhdGUnLiIKKyAgKGxldCAoKGRpZmYgKHZjLWdpdC0tcnVuLWNvbW1hbmQtc3RyaW5nIGZpbGUgImRpZmYtaW5kZXgiICIteiIgIkhFQUQiICItLSIpKSkKKyAgICAoaWYgKGFuZCBkaWZmIChzdHJpbmctbWF0Y2ggIjpbMC03XVxcezZcXH0gWzAtN11cXHs2XFx9IFswLTlhLWZdXFx7NDBcXH0gWzAtOWEtZl1cXHs0MFxcfSBbQURNVV1cMFteXDBdK1wwIiBkaWZmKSkKKyAgICAgICAgJ2VkaXRlZAorICAgICAgJ3VwLXRvLWRhdGUpKSkKKworKGRlZnVuIHZjLWdpdC13b3JrZmlsZS12ZXJzaW9uIChmaWxlKQorICAiZ2l0LXNwZWNpZmljIHZlcnNpb24gb2YgYHZjLXdvcmtmaWxlLXZlcnNpb24nLiIKKyAgKGxldCAoKHN0ciAod2l0aC1vdXRwdXQtdG8tc3RyaW5nCisgICAgICAgICAgICAgICAod2l0aC1jdXJyZW50LWJ1ZmZlciBzdGFuZGFyZC1vdXRwdXQKKyAgICAgICAgICAgICAgICAgKGNhbGwtcHJvY2VzcyAiZ2l0IiBuaWwgJyh0IG5pbCkgbmlsICJzeW1ib2xpYy1yZWYiICJIRUFEIikpKSkpCisgICAgKGlmIChzdHJpbmctbWF0Y2ggIl5cXChyZWZzL2hlYWRzL1xcKT9cXCguK1xcKSQiIHN0cikKKyAgICAgICAgKG1hdGNoLXN0cmluZyAyIHN0cikKKyAgICAgIHN0cikpKQorCisoZGVmdW4gdmMtZ2l0LXJldmVydCAoZmlsZSAmb3B0aW9uYWwgY29udGVudHMtZG9uZSkKKyAgIlJldmVydCBGSUxFIHRvIHRoZSB2ZXJzaW9uIHN0b3JlZCBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkuIgorICAoaWYgY29udGVudHMtZG9uZQorICAgICAgKHZjLWdpdC0tcnVuLWNvbW1hbmQgZmlsZSAidXBkYXRlLWluZGV4IiAiLS0iKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNoZWNrb3V0IiAiSEVBRCIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dC1tb2RlbCAoZmlsZSkKKyAgJ2ltcGxpY2l0KQorCisoZGVmdW4gdmMtZ2l0LXdvcmtmaWxlLXVuY2hhbmdlZC1wIChmaWxlKQorICAobGV0ICgoc2hhMSAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAiaGFzaC1vYmplY3QiICItLSIpKQorICAgICAgICAoaGVhZCAodmMtZ2l0LS1ydW4tY29tbWFuZC1zdHJpbmcgZmlsZSAibHMtdHJlZSIgIi16IiAiSEVBRCIgIi0tIikpKQorICAgIChhbmQgaGVhZAorICAgICAgICAgKHN0cmluZy1tYXRjaCAiWzAtN11cXHs2XFx9IGJsb2IgXFwoWzAtOWEtZl1cXHs0MFxcfVxcKVx0W15cMF0rXDAiIGhlYWQpCisgICAgICAgICAoc3RyaW5nPSAoY2FyIChzcGxpdC1zdHJpbmcgc2hhMSAiXG4iKSkgKG1hdGNoLXN0cmluZyAxIGhlYWQpKSkpKQorCisoZGVmdW4gdmMtZ2l0LXJlZ2lzdGVyIChmaWxlICZvcHRpb25hbCByZXYgY29tbWVudCkKKyAgIlJlZ2lzdGVyIEZJTEUgaW50byB0aGUgZ2l0IHZlcnNpb24tY29udHJvbCBzeXN0ZW0uIgorICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJ1cGRhdGUtaW5kZXgiICItLWFkZCIgIi0tIikpCisKKyhkZWZ1biB2Yy1naXQtcHJpbnQtbG9nIChmaWxlICZvcHRpb25hbCBidWZmZXIpCisgIChsZXQgKChuYW1lIChmaWxlLXJlbGF0aXZlLW5hbWUgZmlsZSkpCisgICAgICAgIChjb2Rpbmctc3lzdGVtLWZvci1yZWFkIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1kby1jb21tYW5kIGJ1ZmZlciAnYXN5bmMgImdpdCIgbmFtZSAicmV2LWxpc3QiICItLXByZXR0eSIgIkhFQUQiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1kaWZmIChmaWxlICZvcHRpb25hbCByZXYxIHJldjIgYnVmZmVyKQorICAobGV0ICgobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKQorICAgICAgICAoYnVmIChvciBidWZmZXIgIip2Yy1kaWZmKiIpKSkKKyAgICAoaWYgKGFuZCByZXYxIHJldjIpCisgICAgICAgICh2Yy1kby1jb21tYW5kIGJ1ZiAwICJnaXQiIG5hbWUgImRpZmYtdHJlZSIgIi1wIiByZXYxIHJldjIgIi0tIikKKyAgICAgICh2Yy1kby1jb21tYW5kIGJ1ZiAwICJnaXQiIG5hbWUgImRpZmYtaW5kZXgiICItcCIgKG9yIHJldjEgIkhFQUQiKSAiLS0iKSkKKyAgICA7IGdpdC1kaWZmLWluZGV4IGRvZXNuJ3Qgc2V0IGV4aXQgc3RhdHVzIGxpa2UgZGlmZiBkb2VzCisgICAgKGlmICh2Yy1naXQtd29ya2ZpbGUtdW5jaGFuZ2VkLXAgZmlsZSkgMCAxKSkpCisKKyhkZWZ1biB2Yy1naXQtY2hlY2tpbiAoZmlsZSByZXYgY29tbWVudCkKKyAgKGxldCAoKGNvZGluZy1zeXN0ZW0tZm9yLXdyaXRlIGdpdC1jb21taXRzLWNvZGluZy1zeXN0ZW0pKQorICAgICh2Yy1naXQtLXJ1bi1jb21tYW5kIGZpbGUgImNvbW1pdCIgIi1tIiBjb21tZW50ICItLW9ubHkiICItLSIpKSkKKworKGRlZnVuIHZjLWdpdC1jaGVja291dCAoZmlsZSAmb3B0aW9uYWwgZWRpdGFibGUgcmV2IGRlc3RmaWxlKQorICAodmMtZ2l0LS1ydW4tY29tbWFuZCBmaWxlICJjaGVja291dCIgKG9yIHJldiAiSEVBRCIpKSkKKworKGRlZnVuIHZjLWdpdC1hbm5vdGF0ZS1jb21tYW5kIChmaWxlIGJ1ZiAmb3B0aW9uYWwgcmV2KQorICA7IEZJWE1FOiByZXYgaXMgaWdub3JlZAorICAobGV0ICgobmFtZSAoZmlsZS1yZWxhdGl2ZS1uYW1lIGZpbGUpKSkKKyAgICAoY2FsbC1wcm9jZXNzICJnaXQiIG5pbCBidWYgbmlsICJhbm5vdGF0ZSIgbmFtZSkpKQorCisoZGVmdW4gdmMtZ2l0LWFubm90YXRlLXRpbWUgKCkKKyAgKGFuZCAocmUtc2VhcmNoLWZvcndhcmQgIlswLTlhLWZdK1x0KC4qXHRcXChbMC05XStcXCktXFwoWzAtOV0rXFwpLVxcKFswLTldK1xcKSBcXChbMC05XStcXCk6XFwoWzAtOV0rXFwpOlxcKFswLTldK1xcKSBcXChbLSswLTldK1xcKVx0WzAtOV0rKSIgbmlsIHQpCisgICAgICAgKHZjLWFubm90YXRlLWNvbnZlcnQtdGltZQorICAgICAgICAoYXBwbHkgIydlbmNvZGUtdGltZSAobWFwY2FyIChsYW1iZGEgKG1hdGNoKSAoc3RyaW5nLXRvLW51bWJlciAobWF0Y2gtc3RyaW5nIG1hdGNoKSkpICcoNiA1IDQgMyAyIDEgNykpKSkpKQorCis7OyBOb3QgcmVhbGx5IHVzZWZ1bCBzaW5jZSB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSByZXZpc2lvbiB5ZXQKKzs7KGRlZnVuIHZjLWFubm90YXRlLWV4dHJhY3QtcmV2aXNpb24tYXQtbGluZSAoKQorOzsgIChzYXZlLWV4Y3Vyc2lvbgorOzsgICAgKG1vdmUtYmVnaW5uaW5nLW9mLWxpbmUgMSkKKzs7ICAgIChhbmQgKGxvb2tpbmctYXQgIlswLTlhLWZdKyIpCis7OyAgICAgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMCkgKG1hdGNoLWVuZCAwKSkpKSkKKworKHByb3ZpZGUgJ3ZjLWdpdCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3IGIvY29udHJpYi9naXR2aWV3L2dpdHZpZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2I2YmRjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3CkBAIC0wLDAgKzEsMTAyOSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyIiIiBnaXR2aWV3CitHVUkgYnJvd3NlciBmb3IgZ2l0IHJlcG9zaXRvcnkKK1RoaXMgcHJvZ3JhbSBpcyBiYXNlZCBvbiBienJrIGJ5IFNjb3R0IEphbWVzIFJlbW5hbnQgPHNjb3R0QHVidW50dS5jb20+CisiIiIKK19fY29weXJpZ2h0X18gPSAiQ29weXJpZ2h0IChDKSAyMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuIgorX19hdXRob3JfXyAgICA9ICJBbmVlc2ggS3VtYXIgSy5WIDxhbmVlc2gua3VtYXJAaHAuY29tPiIKKworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBndGsKK2ltcG9ydCBweWd0aworaW1wb3J0IHBhbmdvCitpbXBvcnQgcmUKK2ltcG9ydCB0aW1lCitpbXBvcnQgZ29iamVjdAoraW1wb3J0IGNhaXJvCitpbXBvcnQgbWF0aAoraW1wb3J0IHN0cmluZworCit0cnk6CisgICAgaW1wb3J0IGd0a3NvdXJjZXZpZXcKKyAgICBoYXZlX2d0a3NvdXJjZXZpZXcgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaGF2ZV9ndGtzb3VyY2V2aWV3ID0gRmFsc2UKKyAgICBwcmludCAiUnVubmluZyB3aXRob3V0IGd0a3NvdXJjZXZpZXcgbW9kdWxlIgorCityZV9pZGVudCA9IHJlLmNvbXBpbGUoJyhhdXRob3J8Y29tbWl0dGVyKSAoP1A8aWRlbnQ+LiopICg/UDxlcG9jaD5cZCspICg/UDx0ej5bKy1dXGR7NH0pJykKKworZGVmIGxpc3RfdG9fc3RyaW5nKGFyZ3MsIHNraXApOgorCWNvdW50ID0gbGVuKGFyZ3MpCisJaSA9IHNraXAKKwlzdHJfYXJnPSIgIgorCXdoaWxlIChpIDwgY291bnQgKToKKwkJc3RyX2FyZyA9IHN0cl9hcmcgKyBhcmdzW2ldCisJCXN0cl9hcmcgPSBzdHJfYXJnICsgIiAiCisJCWkgPSBpKzEKKworCXJldHVybiBzdHJfYXJnCisKK2RlZiBzaG93X2RhdGUoZXBvY2gsIHR6KToKKwlzZWNzID0gZmxvYXQoZXBvY2gpCisJdHpzZWNzID0gZmxvYXQodHpbMTozXSkgKiAzNjAwCisJdHpzZWNzICs9IGZsb2F0KHR6WzM6NV0pICogNjAKKwlpZiAodHpbMF0gPT0gIisiKToKKwkJc2VjcyArPSB0enNlY3MKKwllbHNlOgorCQlzZWNzIC09IHR6c2VjcworCisJcmV0dXJuIHRpbWUuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIiwgdGltZS5nbXRpbWUoc2VjcykpCisKKworY2xhc3MgQ2VsbFJlbmRlcmVyR3JhcGgoZ3RrLkdlbmVyaWNDZWxsUmVuZGVyZXIpOgorCSIiIkNlbGwgcmVuZGVyZXIgZm9yIGRpcmVjdGVkIGdyYXBoLgorCisJVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY3VzdG9tIEd0a0NlbGxSZW5kZXJlciB0aGF0CisJZHJhd3MgcGFydCBvZiB0aGUgZGlyZWN0ZWQgZ3JhcGggYmFzZWQgb24gdGhlIGxpbmVzIHN1Z2dlc3RlZCBieSB0aGUgY29kZQorCWluIGdyYXBoLnB5LgorCisJQmVjYXVzZSB3ZSdyZSBzaGlueSwgd2UgdXNlIENhaXJvIHRvIGRvIHRoaXMsIGFuZCBiZWNhdXNlIHdlJ3JlIG5hdWdodHkKKwl3ZSBjaGVhdCBhbmQgZHJhdyBvdmVyIHRoZSBiaXRzIG9mIHRoZSBUcmVlVmlld0NvbHVtbiB0aGF0IGFyZSBzdXBwb3NlZCB0bworCWp1c3QgYmUgZm9yIHRoZSBiYWNrZ3JvdW5kLgorCisJUHJvcGVydGllczoKKwlub2RlICAgICAgICAgICAgICAoY29sdW1uLCBjb2xvdXIsIFsgbmFtZXMgXSkgdHVwbGUgdG8gZHJhdyByZXZpc2lvbiBub2RlLAorCWluX2xpbmVzICAgICAgICAgIChzdGFydCwgZW5kLCBjb2xvdXIpIHR1cGxlIGxpc3QgdG8gZHJhdyBpbndhcmQgbGluZXMsCisJb3V0X2xpbmVzICAgICAgICAgKHN0YXJ0LCBlbmQsIGNvbG91cikgdHVwbGUgbGlzdCB0byBkcmF3IG91dHdhcmQgbGluZXMuCisJIiIiCisKKwlfX2dwcm9wZXJ0aWVzX18gPSB7CisJIm5vZGUiOiAgICAgICAgICggZ29iamVjdC5UWVBFX1BZT0JKRUNULCAibm9kZSIsCisJCQkgICJyZXZpc2lvbiBub2RlIGluc3RydWN0aW9uIiwKKwkJCSAgZ29iamVjdC5QQVJBTV9XUklUQUJMRQorCQkJKSwKKwkiaW4tbGluZXMiOiAgICAgKCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsICJpbi1saW5lcyIsCisJCQkgICJpbnN0cnVjdGlvbnMgdG8gZHJhdyBsaW5lcyBpbnRvIHRoZSBjZWxsIiwKKwkJCSAgZ29iamVjdC5QQVJBTV9XUklUQUJMRQorCQkJKSwKKwkib3V0LWxpbmVzIjogICAgKCBnb2JqZWN0LlRZUEVfUFlPQkpFQ1QsICJvdXQtbGluZXMiLAorCQkJICAiaW5zdHJ1Y3Rpb25zIHRvIGRyYXcgbGluZXMgb3V0IG9mIHRoZSBjZWxsIiwKKwkJCSAgZ29iamVjdC5QQVJBTV9XUklUQUJMRQorCQkJKSwKKwl9CisKKwlkZWYgZG9fc2V0X3Byb3BlcnR5KHNlbGYsIHByb3BlcnR5LCB2YWx1ZSk6CisJCSIiIlNldCBwcm9wZXJ0aWVzIGZyb20gR09iamVjdCBwcm9wZXJ0aWVzLiIiIgorCQlpZiBwcm9wZXJ0eS5uYW1lID09ICJub2RlIjoKKwkJCXNlbGYubm9kZSA9IHZhbHVlCisJCWVsaWYgcHJvcGVydHkubmFtZSA9PSAiaW4tbGluZXMiOgorCQkJc2VsZi5pbl9saW5lcyA9IHZhbHVlCisJCWVsaWYgcHJvcGVydHkubmFtZSA9PSAib3V0LWxpbmVzIjoKKwkJCXNlbGYub3V0X2xpbmVzID0gdmFsdWUKKwkJZWxzZToKKwkJCXJhaXNlIEF0dHJpYnV0ZUVycm9yLCAibm8gc3VjaCBwcm9wZXJ0eTogJyVzJyIgJSBwcm9wZXJ0eS5uYW1lCisKKwlkZWYgYm94X3NpemUoc2VsZiwgd2lkZ2V0KToKKwkJIiIiQ2FsY3VsYXRlIGJveCBzaXplIGJhc2VkIG9uIHdpZGdldCdzIGZvbnQuCisKKwkJQ2FjaGUgdGhpcyBhcyBpdCdzIHByb2JhYmx5IGV4cGVuc2l2ZSB0byBnZXQuICBJdCBlbnN1cmVzIHRoYXQgd2UKKwkJZHJhdyB0aGUgZ3JhcGggYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlIHRleHQuCisJCSIiIgorCQl0cnk6CisJCQlyZXR1cm4gc2VsZi5fYm94X3NpemUKKwkJZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorCQkJcGFuZ29fY3R4ID0gd2lkZ2V0LmdldF9wYW5nb19jb250ZXh0KCkKKwkJCWZvbnRfZGVzYyA9IHdpZGdldC5nZXRfc3R5bGUoKS5mb250X2Rlc2MKKwkJCW1ldHJpY3MgPSBwYW5nb19jdHguZ2V0X21ldHJpY3MoZm9udF9kZXNjKQorCisJCQlhc2NlbnQgPSBwYW5nby5QSVhFTFMobWV0cmljcy5nZXRfYXNjZW50KCkpCisJCQlkZXNjZW50ID0gcGFuZ28uUElYRUxTKG1ldHJpY3MuZ2V0X2Rlc2NlbnQoKSkKKworCQkJc2VsZi5fYm94X3NpemUgPSBhc2NlbnQgKyBkZXNjZW50ICsgNgorCQkJcmV0dXJuIHNlbGYuX2JveF9zaXplCisKKwlkZWYgc2V0X2NvbG91cihzZWxmLCBjdHgsIGNvbG91ciwgYmcsIGZnKToKKwkJIiIiU2V0IHRoZSBjb250ZXh0IHNvdXJjZSBjb2xvdXIuCisKKwkJUGlja3MgYSBkaXN0aW5jdCBjb2xvdXIgYmFzZWQgb24gYW4gaW50ZXJuYWwgd2hlZWw7IHRoZSBiZworCQlwYXJhbWV0ZXIgcHJvdmlkZXMgdGhlIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSAnemVybycKKwkJY29sb3VycyBhbmQgdGhlIGZnIHBhcmFtZXRlciBwcm92aWRlcyB0aGUgbXVsdGlwbGllciB0aGF0IHNob3VsZCBiZQorCQlhcHBsaWVkIHRvIHRoZSBmb3JlZ3JvdW5kIGNvbG91cnMuCisJCSIiIgorCQljb2xvdXJzID0gWworCQkgICAgKCAxLjAsIDAuMCwgMC4wICksCisJCSAgICAoIDEuMCwgMS4wLCAwLjAgKSwKKwkJICAgICggMC4wLCAxLjAsIDAuMCApLAorCQkgICAgKCAwLjAsIDEuMCwgMS4wICksCisJCSAgICAoIDAuMCwgMC4wLCAxLjAgKSwKKwkJICAgICggMS4wLCAwLjAsIDEuMCApLAorCQkgICAgXQorCisJCWNvbG91ciAlPSBsZW4oY29sb3VycykKKwkJcmVkICAgPSAoY29sb3Vyc1tjb2xvdXJdWzBdICogZmcpIG9yIGJnCisJCWdyZWVuID0gKGNvbG91cnNbY29sb3VyXVsxXSAqIGZnKSBvciBiZworCQlibHVlICA9IChjb2xvdXJzW2NvbG91cl1bMl0gKiBmZykgb3IgYmcKKworCQljdHguc2V0X3NvdXJjZV9yZ2IocmVkLCBncmVlbiwgYmx1ZSkKKworCWRlZiBvbl9nZXRfc2l6ZShzZWxmLCB3aWRnZXQsIGNlbGxfYXJlYSk6CisJCSIiIlJldHVybiB0aGUgc2l6ZSB3ZSBuZWVkIGZvciB0aGlzIGNlbGwuCisKKwkJRWFjaCBjZWxsIGlzIGRyYXduIGluZGl2aWR1YWxseSBhbmQgaXMgb25seSBhcyB3aWRlIGFzIGl0IG5lZWRzCisJCXRvIGJlLCB3ZSBsZXQgdGhlIFRyZWVWaWV3Q29sdW1uIHRha2UgY2FyZSBvZiBtYWtpbmcgdGhlbSBhbGwKKwkJbGluZSB1cC4KKwkJIiIiCisJCWJveF9zaXplID0gc2VsZi5ib3hfc2l6ZSh3aWRnZXQpCisKKwkJY29scyA9IHNlbGYubm9kZVswXQorCQlmb3Igc3RhcnQsIGVuZCwgY29sb3VyIGluIHNlbGYuaW5fbGluZXMgKyBzZWxmLm91dF9saW5lczoKKwkJCWNvbHMgPSBpbnQobWF4KGNvbHMsIHN0YXJ0LCBlbmQpKQorCisJCShjb2x1bW4sIGNvbG91ciwgbmFtZXMpID0gc2VsZi5ub2RlCisJCW5hbWVzX2xlbiA9IDAKKwkJaWYgKGxlbihuYW1lcykgIT0gMCk6CisJCQlmb3IgaXRlbSBpbiBuYW1lczoKKwkJCQluYW1lc19sZW4gKz0gbGVuKGl0ZW0pCisKKwkJd2lkdGggPSBib3hfc2l6ZSAqIChjb2xzICsgMSApICsgbmFtZXNfbGVuCisJCWhlaWdodCA9IGJveF9zaXplCisKKwkJIyBGSVhNRSBJIGhhdmUgbm8gaWRlYSBob3cgdG8gdXNlIGNlbGxfYXJlYSBwcm9wZXJseQorCQlyZXR1cm4gKDAsIDAsIHdpZHRoLCBoZWlnaHQpCisKKwlkZWYgb25fcmVuZGVyKHNlbGYsIHdpbmRvdywgd2lkZ2V0LCBiZ19hcmVhLCBjZWxsX2FyZWEsIGV4cF9hcmVhLCBmbGFncyk6CisJCSIiIlJlbmRlciBhbiBpbmRpdmlkdWFsIGNlbGwuCisKKwkJRHJhd3MgdGhlIGNlbGwgY29udGVudHMgdXNpbmcgY2Fpcm8sIHRha2luZyBjYXJlIHRvIGNsaXAgd2hhdCB3ZQorCQlkbyB0byB3aXRoaW4gdGhlIGJhY2tncm91bmQgYXJlYSBzbyB3ZSBkb24ndCBkcmF3IG92ZXIgb3RoZXIgY2VsbHMuCisJCU5vdGUgdGhhdCB3ZSdyZSBhIGJpdCBuYXVnaHR5IHRoZXJlIGFuZCBzaG91bGQgcmVhbGx5IGJlIGRyYXdpbmcKKwkJaW4gdGhlIGNlbGxfYXJlYSAob3IgZXZlbiB0aGUgZXhwb3NlZCBhcmVhKSwgYnV0IHdlIGV4cGxpY2l0bHkgZG9uJ3QKKwkJd2FudCBhbnkgZ3V0dGVyLgorCisJCVdlIHRyeSBhbmQgYmUgYSBsaXR0bGUgY2xldmVyLCBpZiB0aGUgbGluZSB3ZSBuZWVkIHRvIGRyYXcgaXMgZ29pbmcKKwkJdG8gY3Jvc3Mgb3RoZXIgY29sdW1ucyB3ZSBhY3R1YWxseSBkcmF3IGl0IGFzIGluIHRoZSAuLS0tJyBzdHlsZQorCQlpbnN0ZWFkIG9mIGEgcHVyZSBkaWFnb25hbCAuLi4gdGhpcyByZWR1Y2VzIGNvbmZ1c2lvbiBieSBhbgorCQlpbmNyZWRpYmxlIGFtb3VudC4KKwkJIiIiCisJCWN0eCA9IHdpbmRvdy5jYWlyb19jcmVhdGUoKQorCQljdHgucmVjdGFuZ2xlKGJnX2FyZWEueCwgYmdfYXJlYS55LCBiZ19hcmVhLndpZHRoLCBiZ19hcmVhLmhlaWdodCkKKwkJY3R4LmNsaXAoKQorCisJCWJveF9zaXplID0gc2VsZi5ib3hfc2l6ZSh3aWRnZXQpCisKKwkJY3R4LnNldF9saW5lX3dpZHRoKGJveF9zaXplIC8gOCkKKwkJY3R4LnNldF9saW5lX2NhcChjYWlyby5MSU5FX0NBUF9TUVVBUkUpCisKKwkJIyBEcmF3IGxpbmVzIGludG8gdGhlIGNlbGwKKwkJZm9yIHN0YXJ0LCBlbmQsIGNvbG91ciBpbiBzZWxmLmluX2xpbmVzOgorCQkJY3R4Lm1vdmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIHN0YXJ0ICsgYm94X3NpemUgLyAyLAorCQkJCQliZ19hcmVhLnkgLSBiZ19hcmVhLmhlaWdodCAvIDIpCisKKwkJCWlmIHN0YXJ0IC0gZW5kID4gMToKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQsIGJnX2FyZWEueSkKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kICsgYm94X3NpemUsIGJnX2FyZWEueSkKKwkJCWVsaWYgc3RhcnQgLSBlbmQgPCAtMToKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQgKyBib3hfc2l6ZSwKKwkJCQkJCWJnX2FyZWEueSkKKwkJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kLCBiZ19hcmVhLnkpCisKKwkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQgKyBib3hfc2l6ZSAvIDIsCisJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0IC8gMikKKworCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNjUpCisJCQljdHguc3Ryb2tlKCkKKworCQkjIERyYXcgbGluZXMgb3V0IG9mIHRoZSBjZWxsCisJCWZvciBzdGFydCwgZW5kLCBjb2xvdXIgaW4gc2VsZi5vdXRfbGluZXM6CisJCQljdHgubW92ZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogc3RhcnQgKyBib3hfc2l6ZSAvIDIsCisJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0IC8gMikKKworCQkJaWYgc3RhcnQgLSBlbmQgPiAxOgorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBlbmQgKyBib3hfc2l6ZSwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCQkJZWxpZiBzdGFydCAtIGVuZCA8IC0xOgorCQkJCWN0eC5saW5lX3RvKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBzdGFydCArIGJveF9zaXplLAorCQkJCQkJYmdfYXJlYS55ICsgYmdfYXJlYS5oZWlnaHQpCisJCQkJY3R4LmxpbmVfdG8oY2VsbF9hcmVhLnggKyBib3hfc2l6ZSAqIGVuZCwKKwkJCQkJCWJnX2FyZWEueSArIGJnX2FyZWEuaGVpZ2h0KQorCisJCQljdHgubGluZV90byhjZWxsX2FyZWEueCArIGJveF9zaXplICogZW5kICsgYm94X3NpemUgLyAyLAorCQkJCQliZ19hcmVhLnkgKyBiZ19hcmVhLmhlaWdodCAvIDIgKyBiZ19hcmVhLmhlaWdodCkKKworCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNjUpCisJCQljdHguc3Ryb2tlKCkKKworCQkjIERyYXcgdGhlIHJldmlzaW9uIG5vZGUgaW4gdGhlIHJpZ2h0IGNvbHVtbgorCQkoY29sdW1uLCBjb2xvdXIsIG5hbWVzKSA9IHNlbGYubm9kZQorCQljdHguYXJjKGNlbGxfYXJlYS54ICsgYm94X3NpemUgKiBjb2x1bW4gKyBib3hfc2l6ZSAvIDIsCisJCQkJY2VsbF9hcmVhLnkgKyBjZWxsX2FyZWEuaGVpZ2h0IC8gMiwKKwkJCQlib3hfc2l6ZSAvIDQsIDAsIDIgKiBtYXRoLnBpKQorCisKKwkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNSkKKwkJY3R4LnN0cm9rZV9wcmVzZXJ2ZSgpCisKKwkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjUsIDEuMCkKKwkJY3R4LmZpbGxfcHJlc2VydmUoKQorCisJCWlmIChsZW4obmFtZXMpICE9IDApOgorCQkJbmFtZSA9ICIgIgorCQkJZm9yIGl0ZW0gaW4gbmFtZXM6CisJCQkJbmFtZSA9IG5hbWUgKyBpdGVtICsgIiAiCisKKwkJCWN0eC5zZXRfZm9udF9zaXplKDEzKQorCQkJaWYgKGZsYWdzICYgMSk6CisJCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjUsIDEuMCkKKwkJCWVsc2U6CisJCQkJc2VsZi5zZXRfY29sb3VyKGN0eCwgY29sb3VyLCAwLjAsIDAuNSkKKwkJCWN0eC5zaG93X3RleHQobmFtZSkKKworY2xhc3MgQ29tbWl0OgorCSIiIiBUaGlzIHJlcHJlc2VudCBhIGNvbW1pdCBvYmplY3Qgb2J0YWluZWQgYWZ0ZXIgcGFyc2luZyB0aGUgZ2l0LXJldi1saXN0CisJb3V0cHV0ICIiIgorCisJY2hpbGRyZW5fc2hhMSA9IHt9CisKKwlkZWYgX19pbml0X18oc2VsZiwgY29tbWl0X2xpbmVzKToKKwkJc2VsZi5tZXNzYWdlCQk9ICIiCisJCXNlbGYuYXV0aG9yCQk9ICIiCisJCXNlbGYuZGF0ZQkJPSAiIgorCQlzZWxmLmNvbW1pdHRlcgkJPSAiIgorCQlzZWxmLmNvbW1pdF9kYXRlCT0gIiIKKwkJc2VsZi5jb21taXRfc2hhMQk9ICIiCisJCXNlbGYucGFyZW50X3NoYTEJPSBbIF0KKwkJc2VsZi5wYXJzZV9jb21taXQoY29tbWl0X2xpbmVzKQorCisKKwlkZWYgcGFyc2VfY29tbWl0KHNlbGYsIGNvbW1pdF9saW5lcyk6CisKKwkJIyBGaXJzdCBsaW5lIGlzIHRoZSBzaGExIGxpbmVzCisJCWxpbmUgPSBzdHJpbmcuc3RyaXAoY29tbWl0X2xpbmVzWzBdKQorCQlzaGExID0gcmUuc3BsaXQoIiAiLCBsaW5lKQorCQlzZWxmLmNvbW1pdF9zaGExID0gc2hhMVswXQorCQlzZWxmLnBhcmVudF9zaGExID0gc2hhMVsxOl0KKworCQkjYnVpbGQgdGhlIGNoaWxkIGxpc3QKKwkJZm9yIHBhcmVudF9pZCBpbiBzZWxmLnBhcmVudF9zaGExOgorCQkJdHJ5OgorCQkJCUNvbW1pdC5jaGlsZHJlbl9zaGExW3BhcmVudF9pZF0uYXBwZW5kKHNlbGYuY29tbWl0X3NoYTEpCisJCQlleGNlcHQgS2V5RXJyb3I6CisJCQkJQ29tbWl0LmNoaWxkcmVuX3NoYTFbcGFyZW50X2lkXSA9IFtzZWxmLmNvbW1pdF9zaGExXQorCisJCSMgSUYgd2UgZG9uJ3QgaGF2ZSBwYXJlbnQKKwkJaWYgKGxlbihzZWxmLnBhcmVudF9zaGExKSA9PSAwKToKKwkJCXNlbGYucGFyZW50X3NoYTEgPSBbMF0KKworCQlmb3IgbGluZSBpbiBjb21taXRfbGluZXNbMTpdOgorCQkJbSA9IHJlLm1hdGNoKCJeICIsIGxpbmUpCisJCQlpZiAobSAhPSBOb25lKToKKwkJCQkjIEZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHVzZWQgZm9yIHNob3J0IGxvZworCQkJCWlmIHNlbGYubWVzc2FnZSA9PSAiIjoKKwkJCQkJc2VsZi5tZXNzYWdlID0gc3RyaW5nLnN0cmlwKGxpbmUpCisJCQkJY29udGludWUKKworCQkJbSA9IHJlLm1hdGNoKCJ0cmVlIiwgbGluZSkKKwkJCWlmIChtICE9IE5vbmUpOgorCQkJCWNvbnRpbnVlCisKKwkJCW0gPSByZS5tYXRjaCgicGFyZW50IiwgbGluZSkKKwkJCWlmIChtICE9IE5vbmUpOgorCQkJCWNvbnRpbnVlCisKKwkJCW0gPSByZV9pZGVudC5tYXRjaChsaW5lKQorCQkJaWYgKG0gIT0gTm9uZSk6CisJCQkJZGF0ZSA9IHNob3dfZGF0ZShtLmdyb3VwKCdlcG9jaCcpLCBtLmdyb3VwKCd0eicpKQorCQkJCWlmIG0uZ3JvdXAoMSkgPT0gImF1dGhvciI6CisJCQkJCXNlbGYuYXV0aG9yID0gbS5ncm91cCgnaWRlbnQnKQorCQkJCQlzZWxmLmRhdGUgPSBkYXRlCisJCQkJZWxpZiBtLmdyb3VwKDEpID09ICJjb21taXR0ZXIiOgorCQkJCQlzZWxmLmNvbW1pdHRlciA9IG0uZ3JvdXAoJ2lkZW50JykKKwkJCQkJc2VsZi5jb21taXRfZGF0ZSA9IGRhdGUKKworCQkJCWNvbnRpbnVlCisKKwlkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwgd2l0aF9kaWZmPTApOgorCQlpZiAod2l0aF9kaWZmID09IDEpOgorCQkJbWVzc2FnZSA9IHNlbGYuZGlmZl90cmVlKCkKKwkJZWxzZToKKwkJCWZwID0gb3MucG9wZW4oImdpdCBjYXQtZmlsZSBjb21taXQgIiArIHNlbGYuY29tbWl0X3NoYTEpCisJCQltZXNzYWdlID0gZnAucmVhZCgpCisJCQlmcC5jbG9zZSgpCisKKwkJcmV0dXJuIG1lc3NhZ2UKKworCWRlZiBkaWZmX3RyZWUoc2VsZik6CisJCWZwID0gb3MucG9wZW4oImdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1jYyAgLXYgLXAgLS1hbHdheXMgIiArICBzZWxmLmNvbW1pdF9zaGExKQorCQlkaWZmID0gZnAucmVhZCgpCisJCWZwLmNsb3NlKCkKKwkJcmV0dXJuIGRpZmYKKworY2xhc3MgRGlmZldpbmRvdzoKKwkiIiJEaWZmIHdpbmRvdy4KKwlUaGlzIG9iamVjdCByZXByZXNlbnRzIGFuZCBtYW5hZ2VzIGEgc2luZ2xlIHdpbmRvdyBjb250YWluaW5nIHRoZQorCWRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHJldmlzaW9ucyBvbiBhIGJyYW5jaC4KKwkiIiIKKworCWRlZiBfX2luaXRfXyhzZWxmKToKKwkJc2VsZi53aW5kb3cgPSBndGsuV2luZG93KGd0ay5XSU5ET1dfVE9QTEVWRUwpCisJCXNlbGYud2luZG93LnNldF9ib3JkZXJfd2lkdGgoMCkKKwkJc2VsZi53aW5kb3cuc2V0X3RpdGxlKCJHaXQgcmVwb3NpdG9yeSBicm93c2VyIGRpZmYgd2luZG93IikKKworCQkjIFVzZSB0d28gdGhpcmRzIG9mIHRoZSBzY3JlZW4gYnkgZGVmYXVsdAorCQlzY3JlZW4gPSBzZWxmLndpbmRvdy5nZXRfc2NyZWVuKCkKKwkJbW9uaXRvciA9IHNjcmVlbi5nZXRfbW9uaXRvcl9nZW9tZXRyeSgwKQorCQl3aWR0aCA9IGludChtb25pdG9yLndpZHRoICogMC42NikKKwkJaGVpZ2h0ID0gaW50KG1vbml0b3IuaGVpZ2h0ICogMC42NikKKwkJc2VsZi53aW5kb3cuc2V0X2RlZmF1bHRfc2l6ZSh3aWR0aCwgaGVpZ2h0KQorCisJCXNlbGYuY29uc3RydWN0KCkKKworCWRlZiBjb25zdHJ1Y3Qoc2VsZik6CisJCSIiIkNvbnN0cnVjdCB0aGUgd2luZG93IGNvbnRlbnRzLiIiIgorCQl2Ym94ID0gZ3RrLlZCb3goKQorCQlzZWxmLndpbmRvdy5hZGQodmJveCkKKwkJdmJveC5zaG93KCkKKworCQltZW51X2JhciA9IGd0ay5NZW51QmFyKCkKKwkJc2F2ZV9tZW51ID0gZ3RrLkltYWdlTWVudUl0ZW0oZ3RrLlNUT0NLX1NBVkUpCisJCXNhdmVfbWVudS5jb25uZWN0KCJhY3RpdmF0ZSIsIHNlbGYuc2F2ZV9tZW51X3Jlc3BvbnNlLCAic2F2ZSIpCisJCXNhdmVfbWVudS5zaG93KCkKKwkJbWVudV9iYXIuYXBwZW5kKHNhdmVfbWVudSkKKwkJdmJveC5wYWNrX3N0YXJ0KG1lbnVfYmFyLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJbWVudV9iYXIuc2hvdygpCisKKwkJc2Nyb2xsd2luID0gZ3RrLlNjcm9sbGVkV2luZG93KCkKKwkJc2Nyb2xsd2luLnNldF9wb2xpY3koZ3RrLlBPTElDWV9BVVRPTUFUSUMsIGd0ay5QT0xJQ1lfQVVUT01BVElDKQorCQlzY3JvbGx3aW4uc2V0X3NoYWRvd190eXBlKGd0ay5TSEFET1dfSU4pCisJCXZib3gucGFja19zdGFydChzY3JvbGx3aW4sIGV4cGFuZD1UcnVlLCBmaWxsPVRydWUpCisJCXNjcm9sbHdpbi5zaG93KCkKKworCQlpZiBoYXZlX2d0a3NvdXJjZXZpZXc6CisJCQlzZWxmLmJ1ZmZlciA9IGd0a3NvdXJjZXZpZXcuU291cmNlQnVmZmVyKCkKKwkJCXNsbSA9IGd0a3NvdXJjZXZpZXcuU291cmNlTGFuZ3VhZ2VzTWFuYWdlcigpCisJCQlnc2wgPSBzbG0uZ2V0X2xhbmd1YWdlX2Zyb21fbWltZV90eXBlKCJ0ZXh0L3gtcGF0Y2giKQorCQkJc2VsZi5idWZmZXIuc2V0X2hpZ2hsaWdodChUcnVlKQorCQkJc2VsZi5idWZmZXIuc2V0X2xhbmd1YWdlKGdzbCkKKwkJCXNvdXJjZXZpZXcgPSBndGtzb3VyY2V2aWV3LlNvdXJjZVZpZXcoc2VsZi5idWZmZXIpCisJCWVsc2U6CisJCQlzZWxmLmJ1ZmZlciA9IGd0ay5UZXh0QnVmZmVyKCkKKwkJCXNvdXJjZXZpZXcgPSBndGsuVGV4dFZpZXcoc2VsZi5idWZmZXIpCisKKwkJc291cmNldmlldy5zZXRfZWRpdGFibGUoRmFsc2UpCisJCXNvdXJjZXZpZXcubW9kaWZ5X2ZvbnQocGFuZ28uRm9udERlc2NyaXB0aW9uKCJNb25vc3BhY2UiKSkKKwkJc2Nyb2xsd2luLmFkZChzb3VyY2V2aWV3KQorCQlzb3VyY2V2aWV3LnNob3coKQorCisKKwlkZWYgc2V0X2RpZmYoc2VsZiwgY29tbWl0X3NoYTEsIHBhcmVudF9zaGExLCBlbmNvZGluZyk6CisJCSIiIlNldCB0aGUgZGlmZmVyZW5jZXMgc2hvd2VkIGJ5IHRoaXMgd2luZG93LgorCQlDb21wYXJlcyB0aGUgdHdvIHRyZWVzIGFuZCBwb3B1bGF0ZXMgdGhlIHdpbmRvdyB3aXRoIHRoZQorCQlkaWZmZXJlbmNlcy4KKwkJIiIiCisJCSMgRGlmZiB3aXRoIHRoZSBmaXJzdCBjb21taXQgb3IgdGhlIGxhc3QgY29tbWl0IHNob3dzIG5vdGhpbmcKKwkJaWYgKGNvbW1pdF9zaGExID09IDAgb3IgcGFyZW50X3NoYTEgPT0gMCApOgorCQkJcmV0dXJuCisKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IGRpZmYtdHJlZSAtcCAiICsgcGFyZW50X3NoYTEgKyAiICIgKyBjb21taXRfc2hhMSkKKwkJc2VsZi5idWZmZXIuc2V0X3RleHQodW5pY29kZShmcC5yZWFkKCksIGVuY29kaW5nKS5lbmNvZGUoJ3V0Zi04JykpCisJCWZwLmNsb3NlKCkKKwkJc2VsZi53aW5kb3cuc2hvdygpCisKKwlkZWYgc2F2ZV9tZW51X3Jlc3BvbnNlKHNlbGYsIHdpZGdldCwgc3RyaW5nKToKKwkJZGlhbG9nID0gZ3RrLkZpbGVDaG9vc2VyRGlhbG9nKCJTYXZlLi4iLCBOb25lLCBndGsuRklMRV9DSE9PU0VSX0FDVElPTl9TQVZFLAorCQkJCShndGsuU1RPQ0tfQ0FOQ0VMLCBndGsuUkVTUE9OU0VfQ0FOQ0VMLAorCQkJCQlndGsuU1RPQ0tfU0FWRSwgZ3RrLlJFU1BPTlNFX09LKSkKKwkJZGlhbG9nLnNldF9kZWZhdWx0X3Jlc3BvbnNlKGd0ay5SRVNQT05TRV9PSykKKwkJcmVzcG9uc2UgPSBkaWFsb2cucnVuKCkKKwkJaWYgcmVzcG9uc2UgPT0gZ3RrLlJFU1BPTlNFX09LOgorCQkJcGF0Y2hfYnVmZmVyID0gc2VsZi5idWZmZXIuZ2V0X3RleHQoc2VsZi5idWZmZXIuZ2V0X3N0YXJ0X2l0ZXIoKSwKKwkJCQkJc2VsZi5idWZmZXIuZ2V0X2VuZF9pdGVyKCkpCisJCQlmcCA9IG9wZW4oZGlhbG9nLmdldF9maWxlbmFtZSgpLCAidyIpCisJCQlmcC53cml0ZShwYXRjaF9idWZmZXIpCisJCQlmcC5jbG9zZSgpCisJCWRpYWxvZy5kZXN0cm95KCkKKworY2xhc3MgR2l0VmlldzoKKwkiIiIgVGhpcyBpcyB0aGUgbWFpbiBjbGFzcworCSIiIgorCXZlcnNpb24gPSAiMC44IgorCisJZGVmIF9faW5pdF9fKHNlbGYsIHdpdGhfZGlmZj0wKToKKwkJc2VsZi53aXRoX2RpZmYgPSB3aXRoX2RpZmYKKwkJc2VsZi53aW5kb3cgPQlndGsuV2luZG93KGd0ay5XSU5ET1dfVE9QTEVWRUwpCisJCXNlbGYud2luZG93LnNldF9ib3JkZXJfd2lkdGgoMCkKKwkJc2VsZi53aW5kb3cuc2V0X3RpdGxlKCJHaXQgcmVwb3NpdG9yeSBicm93c2VyIikKKworCQlzZWxmLmdldF9lbmNvZGluZygpCisJCXNlbGYuZ2V0X2J0X3NoYTEoKQorCisJCSMgVXNlIHRocmVlLXF1YXJ0ZXJzIG9mIHRoZSBzY3JlZW4gYnkgZGVmYXVsdAorCQlzY3JlZW4gPSBzZWxmLndpbmRvdy5nZXRfc2NyZWVuKCkKKwkJbW9uaXRvciA9IHNjcmVlbi5nZXRfbW9uaXRvcl9nZW9tZXRyeSgwKQorCQl3aWR0aCA9IGludChtb25pdG9yLndpZHRoICogMC43NSkKKwkJaGVpZ2h0ID0gaW50KG1vbml0b3IuaGVpZ2h0ICogMC43NSkKKwkJc2VsZi53aW5kb3cuc2V0X2RlZmF1bHRfc2l6ZSh3aWR0aCwgaGVpZ2h0KQorCisJCSMgRklYTUUgQW5keUZpdHohCisJCWljb24gPSBzZWxmLndpbmRvdy5yZW5kZXJfaWNvbihndGsuU1RPQ0tfSU5ERVgsIGd0ay5JQ09OX1NJWkVfQlVUVE9OKQorCQlzZWxmLndpbmRvdy5zZXRfaWNvbihpY29uKQorCisJCXNlbGYuYWNjZWxfZ3JvdXAgPSBndGsuQWNjZWxHcm91cCgpCisJCXNlbGYud2luZG93LmFkZF9hY2NlbF9ncm91cChzZWxmLmFjY2VsX2dyb3VwKQorCQlzZWxmLmFjY2VsX2dyb3VwLmNvbm5lY3RfZ3JvdXAoMHhmZmMyLCAwLCBndGsuQUNDRUxfTE9DS0VELCBzZWxmLnJlZnJlc2gpOworCQlzZWxmLmFjY2VsX2dyb3VwLmNvbm5lY3RfZ3JvdXAoMHhmZmMxLCAwLCBndGsuQUNDRUxfTE9DS0VELCBzZWxmLm1heGltaXplKTsKKwkJc2VsZi5hY2NlbF9ncm91cC5jb25uZWN0X2dyb3VwKDB4ZmZjOCwgMCwgZ3RrLkFDQ0VMX0xPQ0tFRCwgc2VsZi5mdWxsc2NyZWVuKTsKKwkJc2VsZi5hY2NlbF9ncm91cC5jb25uZWN0X2dyb3VwKDB4ZmZjOSwgMCwgZ3RrLkFDQ0VMX0xPQ0tFRCwgc2VsZi51bmZ1bGxzY3JlZW4pOworCisJCXNlbGYud2luZG93LmFkZChzZWxmLmNvbnN0cnVjdCgpKQorCisJZGVmIHJlZnJlc2goc2VsZiwgd2lkZ2V0LCBldmVudD1Ob25lLCAqYXJndW1lbnRzLCAqKmtleXdvcmRzKToKKwkJc2VsZi5nZXRfZW5jb2RpbmcoKQorCQlzZWxmLmdldF9idF9zaGExKCkKKwkJQ29tbWl0LmNoaWxkcmVuX3NoYTEgPSB7fQorCQlzZWxmLnNldF9icmFuY2goc3lzLmFyZ3Zbd2l0aG91dF9kaWZmOl0pCisJCXNlbGYud2luZG93LnNob3coKQorCQlyZXR1cm4gVHJ1ZQorCisJZGVmIG1heGltaXplKHNlbGYsIHdpZGdldCwgZXZlbnQ9Tm9uZSwgKmFyZ3VtZW50cywgKiprZXl3b3Jkcyk6CisJCXNlbGYud2luZG93Lm1heGltaXplKCkKKwkJcmV0dXJuIFRydWUKKworCWRlZiBmdWxsc2NyZWVuKHNlbGYsIHdpZGdldCwgZXZlbnQ9Tm9uZSwgKmFyZ3VtZW50cywgKiprZXl3b3Jkcyk6CisJCXNlbGYud2luZG93LmZ1bGxzY3JlZW4oKQorCQlyZXR1cm4gVHJ1ZQorCisJZGVmIHVuZnVsbHNjcmVlbihzZWxmLCB3aWRnZXQsIGV2ZW50PU5vbmUsICphcmd1bWVudHMsICoqa2V5d29yZHMpOgorCQlzZWxmLndpbmRvdy51bmZ1bGxzY3JlZW4oKQorCQlyZXR1cm4gVHJ1ZQorCisJZGVmIGdldF9idF9zaGExKHNlbGYpOgorCQkiIiIgVXBkYXRlIHRoZSBidF9zaGExIGRpY3Rpb25hcnkgd2l0aCB0aGUKKwkJcmVzcGVjdGl2ZSBzaGExIGRldGFpbHMgIiIiCisKKwkJc2VsZi5idF9zaGExID0geyB9CisJCWxzX3JlbW90ZSA9IHJlLmNvbXBpbGUoJ14oLns0MH0pXHRyZWZzLyhbXl5dKykoPzpcXF4oLi4pKT8kJyk7CisJCWZwID0gb3MucG9wZW4oJ2dpdCBscy1yZW1vdGUgIiR7R0lUX0RJUi0uZ2l0fSInKQorCQl3aGlsZSAxOgorCQkJbGluZSA9IHN0cmluZy5zdHJpcChmcC5yZWFkbGluZSgpKQorCQkJaWYgbGluZSA9PSAnJzoKKwkJCQlicmVhaworCQkJbSA9IGxzX3JlbW90ZS5tYXRjaChsaW5lKQorCQkJaWYgbm90IG06CisJCQkJY29udGludWUKKwkJCShzaGExLCBuYW1lKSA9IChtLmdyb3VwKDEpLCBtLmdyb3VwKDIpKQorCQkJaWYgbm90IHNlbGYuYnRfc2hhMS5oYXNfa2V5KHNoYTEpOgorCQkJCXNlbGYuYnRfc2hhMVtzaGExXSA9IFtdCisJCQlzZWxmLmJ0X3NoYTFbc2hhMV0uYXBwZW5kKG5hbWUpCisJCWZwLmNsb3NlKCkKKworCWRlZiBnZXRfZW5jb2Rpbmcoc2VsZik6CisJCWZwID0gb3MucG9wZW4oImdpdCByZXBvLWNvbmZpZyAtLWdldCBpMThuLmNvbW1pdGVuY29kaW5nIikKKwkJc2VsZi5lbmNvZGluZz1zdHJpbmcuc3RyaXAoZnAucmVhZGxpbmUoKSkKKwkJZnAuY2xvc2UoKQorCQlpZiAoc2VsZi5lbmNvZGluZyA9PSAiIik6CisJCQlzZWxmLmVuY29kaW5nID0gInV0Zi04IgorCisKKwlkZWYgY29uc3RydWN0KHNlbGYpOgorCQkiIiJDb25zdHJ1Y3QgdGhlIHdpbmRvdyBjb250ZW50cy4iIiIKKwkJdmJveCA9IGd0ay5WQm94KCkKKwkJcGFuZWQgPSBndGsuVlBhbmVkKCkKKwkJcGFuZWQucGFjazEoc2VsZi5jb25zdHJ1Y3RfdG9wKCksIHJlc2l6ZT1GYWxzZSwgc2hyaW5rPVRydWUpCisJCXBhbmVkLnBhY2syKHNlbGYuY29uc3RydWN0X2JvdHRvbSgpLCByZXNpemU9RmFsc2UsIHNocmluaz1UcnVlKQorCQltZW51X2JhciA9IGd0ay5NZW51QmFyKCkKKwkJbWVudV9iYXIuc2V0X3BhY2tfZGlyZWN0aW9uKGd0ay5QQUNLX0RJUkVDVElPTl9SVEwpCisJCWhlbHBfbWVudSA9IGd0ay5NZW51SXRlbSgiSGVscCIpCisJCW1lbnUgPSBndGsuTWVudSgpCisJCWFib3V0X21lbnUgPSBndGsuTWVudUl0ZW0oIkFib3V0IikKKwkJbWVudS5hcHBlbmQoYWJvdXRfbWVudSkKKwkJYWJvdXRfbWVudS5jb25uZWN0KCJhY3RpdmF0ZSIsIHNlbGYuYWJvdXRfbWVudV9yZXNwb25zZSwgImFib3V0IikKKwkJYWJvdXRfbWVudS5zaG93KCkKKwkJaGVscF9tZW51LnNldF9zdWJtZW51KG1lbnUpCisJCWhlbHBfbWVudS5zaG93KCkKKwkJbWVudV9iYXIuYXBwZW5kKGhlbHBfbWVudSkKKwkJbWVudV9iYXIuc2hvdygpCisJCXZib3gucGFja19zdGFydChtZW51X2JhciwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisJCXZib3gucGFja19zdGFydChwYW5lZCwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKwkJcGFuZWQuc2hvdygpCisJCXZib3guc2hvdygpCisJCXJldHVybiB2Ym94CisKKworCWRlZiBjb25zdHJ1Y3RfdG9wKHNlbGYpOgorCQkiIiJDb25zdHJ1Y3QgdGhlIHRvcC1oYWxmIG9mIHRoZSB3aW5kb3cuIiIiCisJCXZib3ggPSBndGsuVkJveChzcGFjaW5nPTYpCisJCXZib3guc2V0X2JvcmRlcl93aWR0aCgxMikKKwkJdmJveC5zaG93KCkKKworCisJCXNjcm9sbHdpbiA9IGd0ay5TY3JvbGxlZFdpbmRvdygpCisJCXNjcm9sbHdpbi5zZXRfcG9saWN5KGd0ay5QT0xJQ1lfQVVUT01BVElDLCBndGsuUE9MSUNZX0FVVE9NQVRJQykKKwkJc2Nyb2xsd2luLnNldF9zaGFkb3dfdHlwZShndGsuU0hBRE9XX0lOKQorCQl2Ym94LnBhY2tfc3RhcnQoc2Nyb2xsd2luLCBleHBhbmQ9VHJ1ZSwgZmlsbD1UcnVlKQorCQlzY3JvbGx3aW4uc2hvdygpCisKKwkJc2VsZi50cmVldmlldyA9IGd0ay5UcmVlVmlldygpCisJCXNlbGYudHJlZXZpZXcuc2V0X3J1bGVzX2hpbnQoVHJ1ZSkKKwkJc2VsZi50cmVldmlldy5zZXRfc2VhcmNoX2NvbHVtbig0KQorCQlzZWxmLnRyZWV2aWV3LmNvbm5lY3QoImN1cnNvci1jaGFuZ2VkIiwgc2VsZi5fdHJlZXZpZXdfY3Vyc29yX2NiKQorCQlzY3JvbGx3aW4uYWRkKHNlbGYudHJlZXZpZXcpCisJCXNlbGYudHJlZXZpZXcuc2hvdygpCisKKwkJY2VsbCA9IENlbGxSZW5kZXJlckdyYXBoKCkKKwkJY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCkKKwkJY29sdW1uLnNldF9yZXNpemFibGUoVHJ1ZSkKKwkJY29sdW1uLnBhY2tfc3RhcnQoY2VsbCwgZXhwYW5kPVRydWUpCisJCWNvbHVtbi5hZGRfYXR0cmlidXRlKGNlbGwsICJub2RlIiwgMSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgImluLWxpbmVzIiwgMikKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgIm91dC1saW5lcyIsIDMpCisJCXNlbGYudHJlZXZpZXcuYXBwZW5kX2NvbHVtbihjb2x1bW4pCisKKwkJY2VsbCA9IGd0ay5DZWxsUmVuZGVyZXJUZXh0KCkKKwkJY2VsbC5zZXRfcHJvcGVydHkoIndpZHRoLWNoYXJzIiwgNjUpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIk1lc3NhZ2UiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCA0KQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCWNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJ3aWR0aC1jaGFycyIsIDQwKQorCQljZWxsLnNldF9wcm9wZXJ0eSgiZWxsaXBzaXplIiwgcGFuZ28uRUxMSVBTSVpFX0VORCkKKwkJY29sdW1uID0gZ3RrLlRyZWVWaWV3Q29sdW1uKCJBdXRob3IiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCA1KQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCWNlbGwgPSBndGsuQ2VsbFJlbmRlcmVyVGV4dCgpCisJCWNlbGwuc2V0X3Byb3BlcnR5KCJlbGxpcHNpemUiLCBwYW5nby5FTExJUFNJWkVfRU5EKQorCQljb2x1bW4gPSBndGsuVHJlZVZpZXdDb2x1bW4oIkRhdGUiKQorCQljb2x1bW4uc2V0X3Jlc2l6YWJsZShUcnVlKQorCQljb2x1bW4ucGFja19zdGFydChjZWxsLCBleHBhbmQ9VHJ1ZSkKKwkJY29sdW1uLmFkZF9hdHRyaWJ1dGUoY2VsbCwgInRleHQiLCA2KQorCQlzZWxmLnRyZWV2aWV3LmFwcGVuZF9jb2x1bW4oY29sdW1uKQorCisJCXJldHVybiB2Ym94CisKKwlkZWYgYWJvdXRfbWVudV9yZXNwb25zZShzZWxmLCB3aWRnZXQsIHN0cmluZyk6CisJCWRpYWxvZyA9IGd0ay5BYm91dERpYWxvZygpCisJCWRpYWxvZy5zZXRfbmFtZSgiR2l0dmlldyIpCisJCWRpYWxvZy5zZXRfdmVyc2lvbihHaXRWaWV3LnZlcnNpb24pCisJCWRpYWxvZy5zZXRfYXV0aG9ycyhbIkFuZWVzaCBLdW1hciBLLlYgPGFuZWVzaC5rdW1hckBocC5jb20+Il0pCisJCWRpYWxvZy5zZXRfd2Vic2l0ZSgiaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0LyIpCisJCWRpYWxvZy5zZXRfY29weXJpZ2h0KCJVc2UgYW5kIGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSIpCisJCWRpYWxvZy5zZXRfd3JhcF9saWNlbnNlKFRydWUpCisJCWRpYWxvZy5ydW4oKQorCQlkaWFsb2cuZGVzdHJveSgpCisKKworCWRlZiBjb25zdHJ1Y3RfYm90dG9tKHNlbGYpOgorCQkiIiJDb25zdHJ1Y3QgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSB3aW5kb3cuIiIiCisJCXZib3ggPSBndGsuVkJveChGYWxzZSwgc3BhY2luZz02KQorCQl2Ym94LnNldF9ib3JkZXJfd2lkdGgoMTIpCisJCSh3aWR0aCwgaGVpZ2h0KSA9IHNlbGYud2luZG93LmdldF9zaXplKCkKKwkJdmJveC5zZXRfc2l6ZV9yZXF1ZXN0KHdpZHRoLCBpbnQoaGVpZ2h0IC8gMi41KSkKKwkJdmJveC5zaG93KCkKKworCQlzZWxmLnRhYmxlID0gZ3RrLlRhYmxlKHJvd3M9NCwgY29sdW1ucz00KQorCQlzZWxmLnRhYmxlLnNldF9yb3dfc3BhY2luZ3MoNikKKwkJc2VsZi50YWJsZS5zZXRfY29sX3NwYWNpbmdzKDYpCisJCXZib3gucGFja19zdGFydChzZWxmLnRhYmxlLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJc2VsZi50YWJsZS5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+UmV2aXNpb246PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDAsIDEsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJc2VsZi5yZXZpZF9sYWJlbCA9IGd0ay5MYWJlbCgpCisJCXNlbGYucmV2aWRfbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKwkJYWxpZ24uYWRkKHNlbGYucmV2aWRfbGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCAwLCAxLCBndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlzZWxmLnJldmlkX2xhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCWxhYmVsID0gZ3RrLkxhYmVsKCkKKwkJbGFiZWwuc2V0X21hcmt1cCgiPGI+Q29tbWl0dGVyOjwvYj4iKQorCQlhbGlnbi5hZGQobGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAwLCAxLCAxLCAyLCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCWxhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKworCQlhbGlnbiA9IGd0ay5BbGlnbm1lbnQoMC4wLCAwLjUpCisJCXNlbGYuY29tbWl0dGVyX2xhYmVsID0gZ3RrLkxhYmVsKCkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKwkJYWxpZ24uYWRkKHNlbGYuY29tbWl0dGVyX2xhYmVsKQorCQlzZWxmLnRhYmxlLmF0dGFjaChhbGlnbiwgMSwgMiwgMSwgMiwgZ3RrLkVYUEFORCB8IGd0ay5GSUxMLCBndGsuRklMTCkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJbGFiZWwgPSBndGsuTGFiZWwoKQorCQlsYWJlbC5zZXRfbWFya3VwKCI8Yj5UaW1lc3RhbXA6PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDIsIDMsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCisJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuNSkKKwkJc2VsZi50aW1lc3RhbXBfbGFiZWwgPSBndGsuTGFiZWwoKQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQlhbGlnbi5hZGQoc2VsZi50aW1lc3RhbXBfbGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCAyLCAzLCBndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbC5zaG93KCkKKwkJYWxpZ24uc2hvdygpCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlsYWJlbCA9IGd0ay5MYWJlbCgpCisJCWxhYmVsLnNldF9tYXJrdXAoIjxiPlBhcmVudHM6PC9iPiIpCisJCWFsaWduLmFkZChsYWJlbCkKKwkJc2VsZi50YWJsZS5hdHRhY2goYWxpZ24sIDAsIDEsIDMsIDQsIGd0ay5GSUxMLCBndGsuRklMTCkKKwkJbGFiZWwuc2hvdygpCisJCWFsaWduLnNob3coKQorCQlzZWxmLnBhcmVudHNfd2lkZ2V0cyA9IFtdCisKKwkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC41KQorCQlsYWJlbCA9IGd0ay5MYWJlbCgpCisJCWxhYmVsLnNldF9tYXJrdXAoIjxiPkNoaWxkcmVuOjwvYj4iKQorCQlhbGlnbi5hZGQobGFiZWwpCisJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAyLCAzLCAzLCA0LCBndGsuRklMTCwgZ3RrLkZJTEwpCisJCWxhYmVsLnNob3coKQorCQlhbGlnbi5zaG93KCkKKwkJc2VsZi5jaGlsZHJlbl93aWRnZXRzID0gW10KKworCQlzY3JvbGx3aW4gPSBndGsuU2Nyb2xsZWRXaW5kb3coKQorCQlzY3JvbGx3aW4uc2V0X3BvbGljeShndGsuUE9MSUNZX0FVVE9NQVRJQywgZ3RrLlBPTElDWV9BVVRPTUFUSUMpCisJCXNjcm9sbHdpbi5zZXRfc2hhZG93X3R5cGUoZ3RrLlNIQURPV19JTikKKwkJdmJveC5wYWNrX3N0YXJ0KHNjcm9sbHdpbiwgZXhwYW5kPVRydWUsIGZpbGw9VHJ1ZSkKKwkJc2Nyb2xsd2luLnNob3coKQorCisJCWlmIGhhdmVfZ3Rrc291cmNldmlldzoKKwkJCXNlbGYubWVzc2FnZV9idWZmZXIgPSBndGtzb3VyY2V2aWV3LlNvdXJjZUJ1ZmZlcigpCisJCQlzbG0gPSBndGtzb3VyY2V2aWV3LlNvdXJjZUxhbmd1YWdlc01hbmFnZXIoKQorCQkJZ3NsID0gc2xtLmdldF9sYW5ndWFnZV9mcm9tX21pbWVfdHlwZSgidGV4dC94LXBhdGNoIikKKwkJCXNlbGYubWVzc2FnZV9idWZmZXIuc2V0X2hpZ2hsaWdodChUcnVlKQorCQkJc2VsZi5tZXNzYWdlX2J1ZmZlci5zZXRfbGFuZ3VhZ2UoZ3NsKQorCQkJc291cmNldmlldyA9IGd0a3NvdXJjZXZpZXcuU291cmNlVmlldyhzZWxmLm1lc3NhZ2VfYnVmZmVyKQorCQllbHNlOgorCQkJc2VsZi5tZXNzYWdlX2J1ZmZlciA9IGd0ay5UZXh0QnVmZmVyKCkKKwkJCXNvdXJjZXZpZXcgPSBndGsuVGV4dFZpZXcoc2VsZi5tZXNzYWdlX2J1ZmZlcikKKworCQlzb3VyY2V2aWV3LnNldF9lZGl0YWJsZShGYWxzZSkKKwkJc291cmNldmlldy5tb2RpZnlfZm9udChwYW5nby5Gb250RGVzY3JpcHRpb24oIk1vbm9zcGFjZSIpKQorCQlzY3JvbGx3aW4uYWRkKHNvdXJjZXZpZXcpCisJCXNvdXJjZXZpZXcuc2hvdygpCisKKwkJcmV0dXJuIHZib3gKKworCWRlZiBfdHJlZXZpZXdfY3Vyc29yX2NiKHNlbGYsICphcmdzKToKKwkJIiIiQ2FsbGJhY2sgZm9yIHdoZW4gdGhlIHRyZWV2aWV3IGN1cnNvciBjaGFuZ2VzLiIiIgorCQkocGF0aCwgY29sKSA9IHNlbGYudHJlZXZpZXcuZ2V0X2N1cnNvcigpCisJCWNvbW1pdCA9IHNlbGYubW9kZWxbcGF0aF1bMF0KKworCQlpZiBjb21taXQuY29tbWl0dGVyIGlzIG5vdCBOb25lOgorCQkJY29tbWl0dGVyID0gY29tbWl0LmNvbW1pdHRlcgorCQkJdGltZXN0YW1wID0gY29tbWl0LmNvbW1pdF9kYXRlCisJCQltZXNzYWdlICAgPSAgY29tbWl0LmdldF9tZXNzYWdlKHNlbGYud2l0aF9kaWZmKQorCQkJcmV2aWRfbGFiZWwgPSBjb21taXQuY29tbWl0X3NoYTEKKwkJZWxzZToKKwkJCWNvbW1pdHRlciA9ICIiCisJCQl0aW1lc3RhbXAgPSAiIgorCQkJbWVzc2FnZSA9ICIiCisJCQlyZXZpZF9sYWJlbCA9ICIiCisKKwkJc2VsZi5yZXZpZF9sYWJlbC5zZXRfdGV4dChyZXZpZF9sYWJlbCkKKwkJc2VsZi5jb21taXR0ZXJfbGFiZWwuc2V0X3RleHQoY29tbWl0dGVyKQorCQlzZWxmLnRpbWVzdGFtcF9sYWJlbC5zZXRfdGV4dCh0aW1lc3RhbXApCisJCXNlbGYubWVzc2FnZV9idWZmZXIuc2V0X3RleHQodW5pY29kZShtZXNzYWdlLCBzZWxmLmVuY29kaW5nKS5lbmNvZGUoJ3V0Zi04JykpCisKKwkJZm9yIHdpZGdldCBpbiBzZWxmLnBhcmVudHNfd2lkZ2V0czoKKwkJCXNlbGYudGFibGUucmVtb3ZlKHdpZGdldCkKKworCQlzZWxmLnBhcmVudHNfd2lkZ2V0cyA9IFtdCisJCXNlbGYudGFibGUucmVzaXplKDQgKyBsZW4oY29tbWl0LnBhcmVudF9zaGExKSAtIDEsIDQpCisJCWZvciBpZHgsIHBhcmVudF9pZCBpbiBlbnVtZXJhdGUoY29tbWl0LnBhcmVudF9zaGExKToKKwkJCXNlbGYudGFibGUuc2V0X3Jvd19zcGFjaW5nKGlkeCArIDMsIDApCisKKwkJCWFsaWduID0gZ3RrLkFsaWdubWVudCgwLjAsIDAuMCkKKwkJCXNlbGYucGFyZW50c193aWRnZXRzLmFwcGVuZChhbGlnbikKKwkJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAxLCAyLCBpZHggKyAzLCBpZHggKyA0LAorCQkJCQlndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQkJYWxpZ24uc2hvdygpCisKKwkJCWhib3ggPSBndGsuSEJveChGYWxzZSwgMCkKKwkJCWFsaWduLmFkZChoYm94KQorCQkJaGJveC5zaG93KCkKKworCQkJbGFiZWwgPSBndGsuTGFiZWwocGFyZW50X2lkKQorCQkJbGFiZWwuc2V0X3NlbGVjdGFibGUoVHJ1ZSkKKwkJCWhib3gucGFja19zdGFydChsYWJlbCwgZXhwYW5kPUZhbHNlLCBmaWxsPVRydWUpCisJCQlsYWJlbC5zaG93KCkKKworCQkJaW1hZ2UgPSBndGsuSW1hZ2UoKQorCQkJaW1hZ2Uuc2V0X2Zyb21fc3RvY2soZ3RrLlNUT0NLX0pVTVBfVE8sIGd0ay5JQ09OX1NJWkVfTUVOVSkKKwkJCWltYWdlLnNob3coKQorCisJCQlidXR0b24gPSBndGsuQnV0dG9uKCkKKwkJCWJ1dHRvbi5hZGQoaW1hZ2UpCisJCQlidXR0b24uc2V0X3JlbGllZihndGsuUkVMSUVGX05PTkUpCisJCQlidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX2dvX2NsaWNrZWRfY2IsIHBhcmVudF9pZCkKKwkJCWhib3gucGFja19zdGFydChidXR0b24sIGV4cGFuZD1GYWxzZSwgZmlsbD1UcnVlKQorCQkJYnV0dG9uLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfRklORCwgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5zZXRfc2Vuc2l0aXZlKFRydWUpCisJCQlidXR0b24uY29ubmVjdCgiY2xpY2tlZCIsIHNlbGYuX3Nob3dfY2xpY2tlZF9jYiwKKwkJCQkJY29tbWl0LmNvbW1pdF9zaGExLCBwYXJlbnRfaWQsIHNlbGYuZW5jb2RpbmcpCisJCQloYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWJ1dHRvbi5zaG93KCkKKworCQkjIFBvcHVsYXRlIHdpdGggY2hpbGQgZGV0YWlscworCQlmb3Igd2lkZ2V0IGluIHNlbGYuY2hpbGRyZW5fd2lkZ2V0czoKKwkJCXNlbGYudGFibGUucmVtb3ZlKHdpZGdldCkKKworCQlzZWxmLmNoaWxkcmVuX3dpZGdldHMgPSBbXQorCQl0cnk6CisJCQljaGlsZF9zaGExID0gQ29tbWl0LmNoaWxkcmVuX3NoYTFbY29tbWl0LmNvbW1pdF9zaGExXQorCQlleGNlcHQgS2V5RXJyb3I6CisJCQkjIFdlIGRvbid0IGhhdmUgY2hpbGQKKwkJCWNoaWxkX3NoYTEgPSBbIDAgXQorCisJCWlmICggbGVuKGNoaWxkX3NoYTEpID4gbGVuKGNvbW1pdC5wYXJlbnRfc2hhMSkpOgorCQkJc2VsZi50YWJsZS5yZXNpemUoNCArIGxlbihjaGlsZF9zaGExKSAtIDEsIDQpCisKKwkJZm9yIGlkeCwgY2hpbGRfaWQgaW4gZW51bWVyYXRlKGNoaWxkX3NoYTEpOgorCQkJc2VsZi50YWJsZS5zZXRfcm93X3NwYWNpbmcoaWR4ICsgMywgMCkKKworCQkJYWxpZ24gPSBndGsuQWxpZ25tZW50KDAuMCwgMC4wKQorCQkJc2VsZi5jaGlsZHJlbl93aWRnZXRzLmFwcGVuZChhbGlnbikKKwkJCXNlbGYudGFibGUuYXR0YWNoKGFsaWduLCAzLCA0LCBpZHggKyAzLCBpZHggKyA0LAorCQkJCQlndGsuRVhQQU5EIHwgZ3RrLkZJTEwsIGd0ay5GSUxMKQorCQkJYWxpZ24uc2hvdygpCisKKwkJCWhib3ggPSBndGsuSEJveChGYWxzZSwgMCkKKwkJCWFsaWduLmFkZChoYm94KQorCQkJaGJveC5zaG93KCkKKworCQkJbGFiZWwgPSBndGsuTGFiZWwoY2hpbGRfaWQpCisJCQlsYWJlbC5zZXRfc2VsZWN0YWJsZShUcnVlKQorCQkJaGJveC5wYWNrX3N0YXJ0KGxhYmVsLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWxhYmVsLnNob3coKQorCisJCQlpbWFnZSA9IGd0ay5JbWFnZSgpCisJCQlpbWFnZS5zZXRfZnJvbV9zdG9jayhndGsuU1RPQ0tfSlVNUF9UTywgZ3RrLklDT05fU0laRV9NRU5VKQorCQkJaW1hZ2Uuc2hvdygpCisKKwkJCWJ1dHRvbiA9IGd0ay5CdXR0b24oKQorCQkJYnV0dG9uLmFkZChpbWFnZSkKKwkJCWJ1dHRvbi5zZXRfcmVsaWVmKGd0ay5SRUxJRUZfTk9ORSkKKwkJCWJ1dHRvbi5jb25uZWN0KCJjbGlja2VkIiwgc2VsZi5fZ29fY2xpY2tlZF9jYiwgY2hpbGRfaWQpCisJCQloYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWJ1dHRvbi5zaG93KCkKKworCQkJaW1hZ2UgPSBndGsuSW1hZ2UoKQorCQkJaW1hZ2Uuc2V0X2Zyb21fc3RvY2soZ3RrLlNUT0NLX0ZJTkQsIGd0ay5JQ09OX1NJWkVfTUVOVSkKKwkJCWltYWdlLnNob3coKQorCisJCQlidXR0b24gPSBndGsuQnV0dG9uKCkKKwkJCWJ1dHRvbi5hZGQoaW1hZ2UpCisJCQlidXR0b24uc2V0X3JlbGllZihndGsuUkVMSUVGX05PTkUpCisJCQlidXR0b24uc2V0X3NlbnNpdGl2ZShUcnVlKQorCQkJYnV0dG9uLmNvbm5lY3QoImNsaWNrZWQiLCBzZWxmLl9zaG93X2NsaWNrZWRfY2IsCisJCQkJCWNoaWxkX2lkLCBjb21taXQuY29tbWl0X3NoYTEsIHNlbGYuZW5jb2RpbmcpCisJCQloYm94LnBhY2tfc3RhcnQoYnV0dG9uLCBleHBhbmQ9RmFsc2UsIGZpbGw9VHJ1ZSkKKwkJCWJ1dHRvbi5zaG93KCkKKworCWRlZiBfZGVzdHJveV9jYihzZWxmLCB3aWRnZXQpOgorCQkiIiJDYWxsYmFjayBmb3Igd2hlbiBhIHdpbmRvdyB3ZSBtYW5hZ2UgaXMgZGVzdHJveWVkLiIiIgorCQlzZWxmLnF1aXQoKQorCisKKwlkZWYgcXVpdChzZWxmKToKKwkJIiIiU3RvcCB0aGUgR1RLKyBtYWluIGxvb3AuIiIiCisJCWd0ay5tYWluX3F1aXQoKQorCisJZGVmIHJ1bihzZWxmLCBhcmdzKToKKwkJc2VsZi5zZXRfYnJhbmNoKGFyZ3MpCisJCXNlbGYud2luZG93LmNvbm5lY3QoImRlc3Ryb3kiLCBzZWxmLl9kZXN0cm95X2NiKQorCQlzZWxmLndpbmRvdy5zaG93KCkKKwkJZ3RrLm1haW4oKQorCisJZGVmIHNldF9icmFuY2goc2VsZiwgYXJncyk6CisJCSIiIkZpbGwgaW4gZGlmZmVyZW50IHdpbmRvd3Mgd2l0aCBpbmZvIGZyb20gdGhlIHJlcG9zaXJvdHkiIiIKKwkJZnAgPSBvcy5wb3BlbigiZ2l0IHJldi1wYXJzZSAtLXNxIC0tZGVmYXVsdCBIRUFEICIgKyBsaXN0X3RvX3N0cmluZyhhcmdzLCAxKSkKKwkJZ2l0X3Jldl9saXN0X2NtZCA9IGZwLnJlYWQoKQorCQlmcC5jbG9zZSgpCisJCWZwID0gb3MucG9wZW4oImdpdCByZXYtbGlzdCAgLS1oZWFkZXIgLS10b3BvLW9yZGVyIC0tcGFyZW50cyAiICsgZ2l0X3Jldl9saXN0X2NtZCkKKwkJc2VsZi51cGRhdGVfd2luZG93KGZwKQorCisJZGVmIHVwZGF0ZV93aW5kb3coc2VsZiwgZnApOgorCQljb21taXRfbGluZXMgPSBbXQorCisJCXNlbGYubW9kZWwgPSBndGsuTGlzdFN0b3JlKGdvYmplY3QuVFlQRV9QWU9CSkVDVCwgZ29iamVjdC5UWVBFX1BZT0JKRUNULAorCQkJCWdvYmplY3QuVFlQRV9QWU9CSkVDVCwgZ29iamVjdC5UWVBFX1BZT0JKRUNULCBzdHIsIHN0ciwgc3RyKQorCisJCSMgdXNlZCBmb3IgY3Vyc29yIHBvc2l0aW9uaW5nCisJCXNlbGYuaW5kZXggPSB7fQorCisJCXNlbGYuY29sb3VycyA9IHt9CisJCXNlbGYubm9kZXBvcyA9IHt9CisJCXNlbGYuaW5jb21wbGV0ZV9saW5lID0ge30KKwkJc2VsZi5jb21taXRzID0gW10KKworCQlpbmRleCA9IDAKKwkJbGFzdF9jb2xvdXIgPSAwCisJCWxhc3Rfbm9kZXBvcyA9IC0xCisJCW91dF9saW5lID0gW10KKwkJaW5wdXRfbGluZSA9IGZwLnJlYWRsaW5lKCkKKwkJd2hpbGUgKGlucHV0X2xpbmUgIT0gIiIpOgorCQkJIyBUaGUgY29tbWl0IGhlYWRlciBlbmRzIHdpdGggJ1wwJworCQkJIyBUaGlzIE5VTEwgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIHNoYTEgb2YgdGhlCisJCQkjIG5leHQgY29tbWl0CisJCQlpZiAoaW5wdXRfbGluZVswXSAhPSAnXDAnKToKKwkJCQljb21taXRfbGluZXMuYXBwZW5kKGlucHV0X2xpbmUpCisJCQkJaW5wdXRfbGluZSA9IGZwLnJlYWRsaW5lKCkKKwkJCQljb250aW51ZTsKKworCQkJY29tbWl0ID0gQ29tbWl0KGNvbW1pdF9saW5lcykKKwkJCWlmIChjb21taXQgIT0gTm9uZSApOgorCQkJCXNlbGYuY29tbWl0cy5hcHBlbmQoY29tbWl0KQorCisJCQkjIFNraXAgdGhlICdcMAorCQkJY29tbWl0X2xpbmVzID0gW10KKwkJCWNvbW1pdF9saW5lcy5hcHBlbmQoaW5wdXRfbGluZVsxOl0pCisJCQlpbnB1dF9saW5lID0gZnAucmVhZGxpbmUoKQorCisJCWZwLmNsb3NlKCkKKworCQlmb3IgY29tbWl0IGluIHNlbGYuY29tbWl0czoKKwkJCShvdXRfbGluZSwgbGFzdF9jb2xvdXIsIGxhc3Rfbm9kZXBvcykgPSBzZWxmLmRyYXdfZ3JhcGgoY29tbWl0LAorCQkJCQkJCQkJCWluZGV4LCBvdXRfbGluZSwKKwkJCQkJCQkJCQlsYXN0X2NvbG91ciwKKwkJCQkJCQkJCQlsYXN0X25vZGVwb3MpCisJCQlzZWxmLmluZGV4W2NvbW1pdC5jb21taXRfc2hhMV0gPSBpbmRleAorCQkJaW5kZXggKz0gMQorCisJCXNlbGYudHJlZXZpZXcuc2V0X21vZGVsKHNlbGYubW9kZWwpCisJCXNlbGYudHJlZXZpZXcuc2hvdygpCisKKwlkZWYgZHJhd19ncmFwaChzZWxmLCBjb21taXQsIGluZGV4LCBvdXRfbGluZSwgbGFzdF9jb2xvdXIsIGxhc3Rfbm9kZXBvcyk6CisJCWluX2xpbmU9W10KKworCQkjICAgfCAgIC0+IG91dGxpbmUKKwkJIyAgIFgKKwkJIyAgIHxcICA8LSBpbmxpbmUKKworCQkjIFJlc2V0IG5vZGVwb3N0aW9uCisJCWlmIChsYXN0X25vZGVwb3MgPiA1KToKKwkJCWxhc3Rfbm9kZXBvcyA9IC0xCisKKwkJIyBBZGQgdGhlIGluY29tcGxldGUgbGluZXMgb2YgdGhlIGxhc3QgY2VsbCBpbiB0aGlzCisJCXRyeToKKwkJCWNvbG91ciA9IHNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCXNlbGYuY29sb3Vyc1tjb21taXQuY29tbWl0X3NoYTFdID0gbGFzdF9jb2xvdXIrMQorCQkJbGFzdF9jb2xvdXIgPSBzZWxmLmNvbG91cnNbY29tbWl0LmNvbW1pdF9zaGExXQorCQkJY29sb3VyID0gICBzZWxmLmNvbG91cnNbY29tbWl0LmNvbW1pdF9zaGExXQorCisJCXRyeToKKwkJCW5vZGVfcG9zID0gc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0gPSBsYXN0X25vZGVwb3MrMQorCQkJbGFzdF9ub2RlcG9zID0gc2VsZi5ub2RlcG9zW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJCW5vZGVfcG9zID0gIHNlbGYubm9kZXBvc1tjb21taXQuY29tbWl0X3NoYTFdCisKKwkJI1RoZSBmaXJzdCBwYXJlbnQgYWx3YXlzIGNvbnRpbnVlIG9uIHRoZSBzYW1lIGxpbmUKKwkJdHJ5OgorCQkJIyBjaGVjayB3ZSBhbHJlYXkgaGF2ZSB0aGUgdmFsdWUKKwkJCXRtcF9ub2RlX3BvcyA9IHNlbGYubm9kZXBvc1tjb21taXQucGFyZW50X3NoYTFbMF1dCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCXNlbGYuY29sb3Vyc1tjb21taXQucGFyZW50X3NoYTFbMF1dID0gY29sb3VyCisJCQlzZWxmLm5vZGVwb3NbY29tbWl0LnBhcmVudF9zaGExWzBdXSA9IG5vZGVfcG9zCisKKwkJZm9yIHNoYTEgaW4gc2VsZi5pbmNvbXBsZXRlX2xpbmUua2V5cygpOgorCQkJaWYgKHNoYTEgIT0gY29tbWl0LmNvbW1pdF9zaGExKToKKwkJCQlzZWxmLmRyYXdfaW5jb21wbGV0ZV9saW5lKHNoYTEsIG5vZGVfcG9zLAorCQkJCQkJb3V0X2xpbmUsIGluX2xpbmUsIGluZGV4KQorCQkJZWxzZToKKwkJCQlkZWwgc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV0KKworCisJCWZvciBwYXJlbnRfaWQgaW4gY29tbWl0LnBhcmVudF9zaGExOgorCQkJdHJ5OgorCQkJCXRtcF9ub2RlX3BvcyA9IHNlbGYubm9kZXBvc1twYXJlbnRfaWRdCisJCQlleGNlcHQgS2V5RXJyb3I6CisJCQkJc2VsZi5jb2xvdXJzW3BhcmVudF9pZF0gPSBsYXN0X2NvbG91cisxCisJCQkJbGFzdF9jb2xvdXIgPSBzZWxmLmNvbG91cnNbcGFyZW50X2lkXQorCQkJCXNlbGYubm9kZXBvc1twYXJlbnRfaWRdID0gbGFzdF9ub2RlcG9zKzEKKwkJCQlsYXN0X25vZGVwb3MgPSBzZWxmLm5vZGVwb3NbcGFyZW50X2lkXQorCisJCQlpbl9saW5lLmFwcGVuZCgobm9kZV9wb3MsIHNlbGYubm9kZXBvc1twYXJlbnRfaWRdLAorCQkJCQkJc2VsZi5jb2xvdXJzW3BhcmVudF9pZF0pKQorCQkJc2VsZi5hZGRfaW5jb21wbGV0ZV9saW5lKHBhcmVudF9pZCkKKworCQl0cnk6CisJCQlicmFuY2hfdGFnID0gc2VsZi5idF9zaGExW2NvbW1pdC5jb21taXRfc2hhMV0KKwkJZXhjZXB0IEtleUVycm9yOgorCQkJYnJhbmNoX3RhZyA9IFsgXQorCisKKwkJbm9kZSA9IChub2RlX3BvcywgY29sb3VyLCBicmFuY2hfdGFnKQorCisJCXNlbGYubW9kZWwuYXBwZW5kKFtjb21taXQsIG5vZGUsIG91dF9saW5lLCBpbl9saW5lLAorCQkJCWNvbW1pdC5tZXNzYWdlLCBjb21taXQuYXV0aG9yLCBjb21taXQuZGF0ZV0pCisKKwkJcmV0dXJuIChpbl9saW5lLCBsYXN0X2NvbG91ciwgbGFzdF9ub2RlcG9zKQorCisJZGVmIGFkZF9pbmNvbXBsZXRlX2xpbmUoc2VsZiwgc2hhMSk6CisJCXRyeToKKwkJCXNlbGYuaW5jb21wbGV0ZV9saW5lW3NoYTFdLmFwcGVuZChzZWxmLm5vZGVwb3Nbc2hhMV0pCisJCWV4Y2VwdCBLZXlFcnJvcjoKKwkJCXNlbGYuaW5jb21wbGV0ZV9saW5lW3NoYTFdID0gW3NlbGYubm9kZXBvc1tzaGExXV0KKworCWRlZiBkcmF3X2luY29tcGxldGVfbGluZShzZWxmLCBzaGExLCBub2RlX3Bvcywgb3V0X2xpbmUsIGluX2xpbmUsIGluZGV4KToKKwkJZm9yIGlkeCwgcG9zIGluIGVudW1lcmF0ZShzZWxmLmluY29tcGxldGVfbGluZVtzaGExXSk6CisJCQlpZihwb3MgPT0gbm9kZV9wb3MpOgorCQkJCSNyZW1vdmUgdGhlIHN0cmFpZ2h0IGxpbmUgYW5kIGFkZCBhIHNsYXNoCisJCQkJaWYgKChwb3MsIHBvcywgc2VsZi5jb2xvdXJzW3NoYTFdKSBpbiBvdXRfbGluZSk6CisJCQkJCW91dF9saW5lLnJlbW92ZSgocG9zLCBwb3MsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisJCQkJb3V0X2xpbmUuYXBwZW5kKChwb3MsIHBvcyswLjUsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisJCQkJc2VsZi5pbmNvbXBsZXRlX2xpbmVbc2hhMV1baWR4XSA9IHBvcyA9IHBvcyswLjUKKwkJCXRyeToKKwkJCQluZXh0X2NvbW1pdCA9IHNlbGYuY29tbWl0c1tpbmRleCsxXQorCQkJCWlmIChuZXh0X2NvbW1pdC5jb21taXRfc2hhMSA9PSBzaGExIGFuZCBwb3MgIT0gaW50KHBvcykpOgorCQkJCSMgam9pbiB0aGUgbGluZSBiYWNrIHRvIHRoZSBub2RlIHBvaW50CisJCQkJIyBUaGlzIG5lZWQgdG8gYmUgZG9uZSBvbmx5IGlmIHdlIG1vZGlmaWVkIGl0CisJCQkJCWluX2xpbmUuYXBwZW5kKChwb3MsIHBvcy0wLjUsIHNlbGYuY29sb3Vyc1tzaGExXSkpCisJCQkJCWNvbnRpbnVlOworCQkJZXhjZXB0IEluZGV4RXJyb3I6CisJCQkJcGFzcworCQkJaW5fbGluZS5hcHBlbmQoKHBvcywgcG9zLCBzZWxmLmNvbG91cnNbc2hhMV0pKQorCisKKwlkZWYgX2dvX2NsaWNrZWRfY2Ioc2VsZiwgd2lkZ2V0LCByZXZpZCk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIHRoZSBnbyBidXR0b24gZm9yIGEgcGFyZW50IGlzIGNsaWNrZWQuIiIiCisJCXRyeToKKwkJCXNlbGYudHJlZXZpZXcuc2V0X2N1cnNvcihzZWxmLmluZGV4W3JldmlkXSkKKwkJZXhjZXB0IEtleUVycm9yOgorCQkJZGlhbG9nID0gZ3RrLk1lc3NhZ2VEaWFsb2cocGFyZW50PU5vbmUsIGZsYWdzPTAsCisJCQkJCXR5cGU9Z3RrLk1FU1NBR0VfV0FSTklORywgYnV0dG9ucz1ndGsuQlVUVE9OU19DTE9TRSwKKwkJCQkJbWVzc2FnZV9mb3JtYXQ9Tm9uZSkKKwkJCWRpYWxvZy5zZXRfbWFya3VwKCJSZXZpc2lvbiA8Yj4lczwvYj4gbm90IHByZXNlbnQgaW4gdGhlIGxpc3QiICUgcmV2aWQpCisJCQkjIHJldmlkID09IDAgaXMgdGhlIHBhcmVudCBvZiB0aGUgZmlyc3QgY29tbWl0CisJCQlpZiAocmV2aWQgIT0gMCApOgorCQkJCWRpYWxvZy5mb3JtYXRfc2Vjb25kYXJ5X3RleHQoIlRyeSBydW5uaW5nIGdpdHZpZXcgd2l0aG91dCBhbnkgb3B0aW9ucyIpCisJCQlkaWFsb2cucnVuKCkKKwkJCWRpYWxvZy5kZXN0cm95KCkKKworCQlzZWxmLnRyZWV2aWV3LmdyYWJfZm9jdXMoKQorCisJZGVmIF9zaG93X2NsaWNrZWRfY2Ioc2VsZiwgd2lkZ2V0LCAgY29tbWl0X3NoYTEsIHBhcmVudF9zaGExLCBlbmNvZGluZyk6CisJCSIiIkNhbGxiYWNrIGZvciB3aGVuIHRoZSBzaG93IGJ1dHRvbiBmb3IgYSBwYXJlbnQgaXMgY2xpY2tlZC4iIiIKKwkJd2luZG93ID0gRGlmZldpbmRvdygpCisJCXdpbmRvdy5zZXRfZGlmZihjb21taXRfc2hhMSwgcGFyZW50X3NoYTEsIGVuY29kaW5nKQorCQlzZWxmLnRyZWV2aWV3LmdyYWJfZm9jdXMoKQorCit3aXRob3V0X2RpZmYgPSAwCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCisJaWYgKGxlbihzeXMuYXJndikgPiAxICk6CisJCWlmIChzeXMuYXJndlsxXSA9PSAiLS13aXRob3V0LWRpZmYiKToKKwkJCXdpdGhvdXRfZGlmZiA9IDEKKworCXZpZXcgPSBHaXRWaWV3KCB3aXRob3V0X2RpZmYgIT0gMSkKKwl2aWV3LnJ1bihzeXMuYXJndlt3aXRob3V0X2RpZmY6XSkKKworCmRpZmYgLS1naXQgYS9jb250cmliL2dpdHZpZXcvZ2l0dmlldy50eHQgYi9jb250cmliL2dpdHZpZXcvZ2l0dmlldy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNGRmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZ2l0dmlldy9naXR2aWV3LnR4dApAQCAtMCwwICsxLDQ2IEBACitnaXR2aWV3KDEpCis9PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dpdHZpZXcgLSBBIEdUSyBiYXNlZCByZXBvc2l0b3J5IGJyb3dzZXIgZm9yIGdpdAorCitTWU5PUFNJUworLS0tLS0tLS0KKydnaXR2aWV3JyAgW29wdGlvbnNdIFthcmdzXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tCisKK0RlcGVuZGVuY2llcworCisqIFB5dGhvbiAyLjQKKyogUHlHVEsgMi44IG9yIGxhdGVyCisqIFB5Q2Fpcm8gMS4wIG9yIGxhdGVyCisKK09QVElPTlMKKy0tLS0tLQorCS0td2l0aG91dC1kaWZmCisJCUlmIHRoZSB1c2VyIGRvZXNuJ3Qgd2FudCB0byBsaXN0IHRoZSBjb21taXQgZGlmZnMgaW4gdGhlIG1haW4gd2luZG93LiBUaGlzIG1heSBzcGVlZCB1cCB0aGUgcmVwb3NpdG9yeSBicm93c2luZy4KKworCTxhcmdzPgorCQlBbGwgdGhlIHZhbGlkIG9wdGlvbiBmb3IgZ2l0LXJldi1saXN0KDEpCisJS2V5IEJpbmRpbmdzOgorCUY0OgorCQlUbyBtYXhpbWl6ZSB0aGUgd2luZG93CisJRjU6CisJCVRvIHJlcmVhZCByZWZlcmVuY2VzLgorCUYxMToKKwkJRnVsbCBzY3JlZW4KKwlGMTI6CisJCUxlYXZlIGZ1bGwgc2NyZWVuCisKK0VYQU1QTEVTCistLS0tLS0KKwlnaXR2aWV3IHYyLjYuMTIuLiBpbmNsdWRlL3Njc2kgZHJpdmVycy9zY3NpCisJICBTaG93IGFzIHRoZSBjaGFuZ2VzIHNpbmNlIHZlcnNpb24gdjIuNi4xMiB0aGF0IGNoYW5nZWQgYW55IGZpbGUgaW4gdGhlIGluY2x1ZGUvc2NzaQorCSAgb3IgZHJpdmVycy9zY3NpIHN1YmRpcmVjdG9yaWVzCisKKwlnaXR2aWV3IC0tc2luY2U9Mi53ZWVrcy5hZ28KKwkgIFNob3cgdGhlIGNoYW5nZXMgZHVyaW5nIHRoZSBsYXN0IHR3byB3ZWVrcworCmRpZmYgLS1naXQgYS9jb250cmliL3JlbW90ZXMyY29uZmlnLnNoIGIvY29udHJpYi9yZW1vdGVzMmNvbmZpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTkwMWUyCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9yZW1vdGVzMmNvbmZpZy5zaApAQCAtMCwwICsxLDM1IEBACisjIS9iaW4vc2gKKworIyBVc2UgdGhpcyB0b29sIHRvIHJld3JpdGUgeW91ciAuZ2l0L3JlbW90ZXMvIGZpbGVzIGludG8gdGhlIGNvbmZpZy4KKworLiBnaXQtc2gtc2V0dXAKKworaWYgWyAtZCAiJEdJVF9ESVIiL3JlbW90ZXMgXTsgdGhlbgorCWVjaG8gIlJld3JpdGluZyAkR0lUX0RJUi9yZW1vdGVzIiA+JjIKKwllcnJvcj0wCisJIyByZXdyaXRlIGludG8gY29uZmlnCisJeworCQljZCAiJEdJVF9ESVIiL3JlbW90ZXMKKwkJbHMgfCB3aGlsZSByZWFkIGY7IGRvCisJCQluYW1lPSQoZWNobyAtbiAiJGYiIHwgdHIgLWMgIkEtWmEtejAtOSIgIi4iKQorCQkJc2VkIC1uIFwKKwkJCS1lICJzL15VUkw6IFwoLipcKSQvcmVtb3RlLiRuYW1lLnVybCBcMSAuL3AiIFwKKwkJCS1lICJzL15QdWxsOiBcKC4qXCkkL3JlbW90ZS4kbmFtZS5mZXRjaCBcMSBeJCAvcCIgXAorCQkJLWUgInMvXlB1c2g6IFwoLipcKSQvcmVtb3RlLiRuYW1lLnB1c2ggXDEgXiQgL3AiIFwKKwkJCTwgIiRmIgorCQlkb25lCisJCWVjaG8gZG9uZQorCX0gfCB3aGlsZSByZWFkIGtleSB2YWx1ZSByZWdleDsgZG8KKwkJY2FzZSAka2V5IGluCisJCWRvbmUpCisJCQlpZiBbICRlcnJvciA9IDAgXTsgdGhlbgorCQkJCW12ICIkR0lUX0RJUiIvcmVtb3RlcyAiJEdJVF9ESVIiL3JlbW90ZXMub2xkCisJCQlmaSA7OworCQkqKQorCQkJZWNobyAiZ2l0LXJlcG8tY29uZmlnICRrZXkgIiR2YWx1ZSIgJHJlZ2V4IgorCQkJZ2l0LXJlcG8tY29uZmlnICRrZXkgIiR2YWx1ZSIgJHJlZ2V4IHx8IGVycm9yPTEgOzsKKwkJZXNhYworCWRvbmUKK2ZpCisKKwpkaWZmIC0tZ2l0IGEvY29udmVydC1vYmplY3RzLmMgYi9jb252ZXJ0LW9iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjg3NzFlCi0tLSAvZGV2L251bGwKKysrIGIvY29udmVydC1vYmplY3RzLmMKQEAgLTAsMCArMSwzMzMgQEAKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA1MDAgLyogZ2xpYmMyIGFuZCBBSVggNS4zTCBuZWVkIHRoaXMgKi8KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCAxIC8qIEFJWCA1LjNMIG5lZWRzIHRoaXMgKi8KKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdHJ1Y3QgZW50cnkgeworCXVuc2lnbmVkIGNoYXIgb2xkX3NoYTFbMjBdOworCXVuc2lnbmVkIGNoYXIgbmV3X3NoYTFbMjBdOworCWludCBjb252ZXJ0ZWQ7Cit9OworCisjZGVmaW5lIE1BWE9CSkVDVFMgKDEwMDAwMDApCisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmNvbnZlcnRbTUFYT0JKRUNUU107CitzdGF0aWMgaW50IG5yX2NvbnZlcnQ7CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKiBjb252ZXJ0X2VudHJ5KHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCitzdGF0aWMgc3RydWN0IGVudHJ5ICppbnNlcnRfbmV3KHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBwb3MpCit7CisJc3RydWN0IGVudHJ5ICpuZXcgPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgZW50cnkpKTsKKwltZW1jcHkobmV3LT5vbGRfc2hhMSwgc2hhMSwgMjApOworCW1lbW1vdmUoY29udmVydCArIHBvcyArIDEsIGNvbnZlcnQgKyBwb3MsIChucl9jb252ZXJ0IC0gcG9zKSAqIHNpemVvZihzdHJ1Y3QgZW50cnkgKikpOworCWNvbnZlcnRbcG9zXSA9IG5ldzsKKwlucl9jb252ZXJ0Kys7CisJaWYgKG5yX2NvbnZlcnQgPT0gTUFYT0JKRUNUUykKKwkJZGllKCJ5b3UncmUga2lkZGluZyBtZSAtIGhpdCBtYXhpbXVtIG9iamVjdCBsaW1pdCIpOworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW50cnkgKmxvb2t1cF9lbnRyeSh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBsb3cgPSAwLCBoaWdoID0gbnJfY29udmVydDsKKworCXdoaWxlIChsb3cgPCBoaWdoKSB7CisJCWludCBuZXh0ID0gKGxvdyArIGhpZ2gpIC8gMjsKKwkJc3RydWN0IGVudHJ5ICpuID0gY29udmVydFtuZXh0XTsKKwkJaW50IGNtcCA9IG1lbWNtcChzaGExLCBuLT5vbGRfc2hhMSwgMjApOworCQlpZiAoIWNtcCkKKwkJCXJldHVybiBuOworCQlpZiAoY21wIDwgMCkgeworCQkJaGlnaCA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlsb3cgPSBuZXh0KzE7CisJfQorCXJldHVybiBpbnNlcnRfbmV3KHNoYTEsIGxvdyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfYmluYXJ5X3NoYTEodm9pZCAqYnVmZmVyKQoreworCXN0cnVjdCBlbnRyeSAqZW50cnkgPSBjb252ZXJ0X2VudHJ5KGJ1ZmZlcik7CisJbWVtY3B5KGJ1ZmZlciwgZW50cnktPm5ld19zaGExLCAyMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfYXNjaWlfc2hhMSh2b2lkICpidWZmZXIpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJaWYgKGdldF9zaGExX2hleChidWZmZXIsIHNoYTEpKQorCQlkaWUoImV4cGVjdGVkIHNoYTEsIGdvdCAnJXMnIiwgKGNoYXIqKSBidWZmZXIpOworCWVudHJ5ID0gY29udmVydF9lbnRyeShzaGExKTsKKwltZW1jcHkoYnVmZmVyLCBzaGExX3RvX2hleChlbnRyeS0+bmV3X3NoYTEpLCA0MCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29udmVydF9tb2RlKHVuc2lnbmVkIGludCBtb2RlKQoreworCXVuc2lnbmVkIGludCBuZXdtb2RlOworCisJbmV3bW9kZSA9IG1vZGUgJiBTX0lGTVQ7CisJaWYgKFNfSVNSRUcobW9kZSkpCisJCW5ld21vZGUgfD0gKG1vZGUgJiAwMTAwKSA/IDA3NTUgOiAwNjQ0OworCXJldHVybiBuZXdtb2RlOworfQorCitzdGF0aWMgaW50IHdyaXRlX3N1YmRpcmVjdG9yeSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCWNoYXIgKm5ldyA9IHhtYWxsb2Moc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBuZXdsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgdXNlZDsKKworCXVzZWQgPSAwOworCXdoaWxlIChzaXplKSB7CisJCWludCBsZW4gPSAyMSArIHN0cmxlbihidWZmZXIpOworCQljaGFyICpwYXRoID0gc3RyY2hyKGJ1ZmZlciwgJyAnKTsKKwkJdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJdW5zaWduZWQgaW50IG1vZGU7CisJCWNoYXIgKnNsYXNoLCAqb3JpZ3BhdGg7CisKKwkJaWYgKCFwYXRoIHx8IHNzY2FuZihidWZmZXIsICIlbyIsICZtb2RlKSAhPSAxKQorCQkJZGllKCJiYWQgdHJlZSBjb252ZXJzaW9uIik7CisJCW1vZGUgPSBjb252ZXJ0X21vZGUobW9kZSk7CisJCXBhdGgrKzsKKwkJaWYgKG1lbWNtcChwYXRoLCBiYXNlLCBiYXNlbGVuKSkKKwkJCWJyZWFrOworCQlvcmlncGF0aCA9IHBhdGg7CisJCXBhdGggKz0gYmFzZWxlbjsKKwkJc2xhc2ggPSBzdHJjaHIocGF0aCwgJy8nKTsKKwkJaWYgKCFzbGFzaCkgeworCQkJbmV3bGVuICs9IHNwcmludGYobmV3ICsgbmV3bGVuLCAiJW8gJXMiLCBtb2RlLCBwYXRoKTsKKwkJCW5ld1tuZXdsZW4rK10gPSAnXDAnOworCQkJbWVtY3B5KG5ldyArIG5ld2xlbiwgKGNoYXIgKikgYnVmZmVyICsgbGVuIC0gMjAsIDIwKTsKKwkJCW5ld2xlbiArPSAyMDsKKworCQkJdXNlZCArPSBsZW47CisJCQlzaXplIC09IGxlbjsKKwkJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIGxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbmV3bGVuICs9IHNwcmludGYobmV3ICsgbmV3bGVuLCAiJW8gJS4qcyIsIFNfSUZESVIsIChpbnQpKHNsYXNoIC0gcGF0aCksIHBhdGgpOworCQluZXdbbmV3bGVuKytdID0gMDsKKwkJc2hhMSA9ICh1bnNpZ25lZCBjaGFyICopKG5ldyArIG5ld2xlbik7CisJCW5ld2xlbiArPSAyMDsKKworCQlsZW4gPSB3cml0ZV9zdWJkaXJlY3RvcnkoYnVmZmVyLCBzaXplLCBvcmlncGF0aCwgc2xhc2gtb3JpZ3BhdGgrMSwgc2hhMSk7CisKKwkJdXNlZCArPSBsZW47CisJCXNpemUgLT0gbGVuOworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyBsZW47CisJfQorCisJd3JpdGVfc2hhMV9maWxlKG5ldywgbmV3bGVuLCB0cmVlX3R5cGUsIHJlc3VsdF9zaGExKTsKKwlmcmVlKG5ldyk7CisJcmV0dXJuIHVzZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfdHJlZSh2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0X3NoYTEpCit7CisJdm9pZCAqb3JpZ19idWZmZXIgPSBidWZmZXI7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NpemUgPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJaW50IGxlbiA9IDErc3RybGVuKGJ1ZmZlcik7CisKKwkJY29udmVydF9iaW5hcnlfc2hhMSgoY2hhciAqKSBidWZmZXIgKyBsZW4pOworCisJCWxlbiArPSAyMDsKKwkJaWYgKGxlbiA+IHNpemUpCisJCQlkaWUoImNvcnJ1cHQgdHJlZSBvYmplY3QiKTsKKwkJc2l6ZSAtPSBsZW47CisJCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIGxlbjsKKwl9CisKKwl3cml0ZV9zdWJkaXJlY3Rvcnkob3JpZ19idWZmZXIsIG9yaWdfc2l6ZSwgIiIsIDAsIHJlc3VsdF9zaGExKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFyc2Vfb2xkc3R5bGVfZGF0ZShjb25zdCBjaGFyICpidWYpCit7CisJY2hhciBjLCAqcDsKKwljaGFyIGJ1ZmZlclsxMDBdOworCXN0cnVjdCB0bSB0bTsKKwljb25zdCBjaGFyICpmb3JtYXRzW10gPSB7CisJCSIlYyIsCisJCSIlYSAlYiAlZCAlVCIsCisJCSIlWiIsCisJCSIlWSIsCisJCSIgJVkiLAorCQlOVUxMCisJfTsKKwkvKiBXZSBvbmx5IGV2ZXIgZGlkIHR3byB0aW1lem9uZXMgaW4gdGhlIGJhZCBvbGQgZm9ybWF0IC4uICovCisJY29uc3QgY2hhciAqdGltZXpvbmVzW10gPSB7CisJCSJQRFQiLCAiUFNUIiwgIkNFU1QiLCBOVUxMCisJfTsKKwljb25zdCBjaGFyICoqZm10ID0gZm9ybWF0czsKKworCXAgPSBidWZmZXI7CisJd2hpbGUgKGlzc3BhY2UoYyA9ICpidWYpKQorCQlidWYrKzsKKwl3aGlsZSAoKGMgPSAqYnVmKyspICE9ICdcbicpCisJCSpwKysgPSBjOworCSpwKysgPSAwOworCWJ1ZiA9IGJ1ZmZlcjsKKwltZW1zZXQoJnRtLCAwLCBzaXplb2YodG0pKTsKKwlkbyB7CisJCWNvbnN0IGNoYXIgKm5leHQgPSBzdHJwdGltZShidWYsICpmbXQsICZ0bSk7CisJCWlmIChuZXh0KSB7CisJCQlpZiAoISpuZXh0KQorCQkJCXJldHVybiBta3RpbWUoJnRtKTsKKwkJCWJ1ZiA9IG5leHQ7CisJCX0gZWxzZSB7CisJCQljb25zdCBjaGFyICoqcCA9IHRpbWV6b25lczsKKwkJCXdoaWxlIChpc3NwYWNlKCpidWYpKQorCQkJCWJ1ZisrOworCQkJd2hpbGUgKCpwKSB7CisJCQkJaWYgKCFtZW1jbXAoYnVmLCAqcCwgc3RybGVuKCpwKSkpIHsKKwkJCQkJYnVmICs9IHN0cmxlbigqcCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwKys7CisJCQl9CisJCX0KKwkJZm10Kys7CisJfSB3aGlsZSAoKmJ1ZiAmJiAqZm10KTsKKwlwcmludGYoImxlZnQ6ICVzXG4iLCBidWYpOworCXJldHVybiBta3RpbWUoJnRtKTsJCQkJCit9CisKK3N0YXRpYyBpbnQgY29udmVydF9kYXRlX2xpbmUoY2hhciAqZHN0LCB2b2lkICoqYnVmLCB1bnNpZ25lZCBsb25nICpzcCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAqc3A7CisJY2hhciAqbGluZSA9ICpidWY7CisJY2hhciAqbmV4dCA9IHN0cmNocihsaW5lLCAnXG4nKTsKKwljaGFyICpkYXRlID0gc3RyY2hyKGxpbmUsICc+Jyk7CisJaW50IGxlbjsKKworCWlmICghbmV4dCB8fCAhZGF0ZSkKKwkJZGllKCJtaXNzaW5nIG9yIGJhZCBhdXRob3IvY29tbWl0dGVyIGxpbmUgJXMiLCBsaW5lKTsKKwluZXh0Kys7IGRhdGUgKz0gMjsKKworCSpidWYgPSBuZXh0OworCSpzcCA9IHNpemUgLSAobmV4dCAtIGxpbmUpOworCisJbGVuID0gZGF0ZSAtIGxpbmU7CisJbWVtY3B5KGRzdCwgbGluZSwgbGVuKTsKKwlkc3QgKz0gbGVuOworCisJLyogSXMgaXQgYWxyZWFkeSBpbiBuZXcgZm9ybWF0PyAqLworCWlmIChpc2RpZ2l0KCpkYXRlKSkgeworCQlpbnQgZGF0ZWxlbiA9IG5leHQgLSBkYXRlOworCQltZW1jcHkoZHN0LCBkYXRlLCBkYXRlbGVuKTsKKwkJcmV0dXJuIGxlbiArIGRhdGVsZW47CisJfQorCisJLyoKKwkgKiBIYWNreSBoYWNreTogb25lIG9mIHRoZSBzcGFyc2Ugb2xkLXN0eWxlIGNvbW1pdHMgZG9lcyBub3QgaGF2ZQorCSAqIGFueSBkYXRlIGF0IGFsbCwgYnV0IHdlIGNhbiBmYWtlIGl0IGJ5IHVzaW5nIHRoZSBjb21taXR0ZXIgZGF0ZS4KKwkgKi8KKwlpZiAoKmRhdGUgPT0gJ1xuJyAmJiBzdHJjaHIobmV4dCwgJz4nKSkKKwkJZGF0ZSA9IHN0cmNocihuZXh0LCAnPicpKzI7CisKKwlyZXR1cm4gbGVuICsgc3ByaW50Zihkc3QsICIlbHUgLTA3MDBcbiIsIHBhcnNlX29sZHN0eWxlX2RhdGUoZGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X2RhdGUodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCWNoYXIgKm5ldyA9IHhtYWxsb2Moc2l6ZSArIDEwMCk7CisJdW5zaWduZWQgbG9uZyBuZXdsZW4gPSAwOworCisJLyogInRyZWUgPHNoYTE+XG4iICovCisJbWVtY3B5KG5ldyArIG5ld2xlbiwgYnVmZmVyLCA0Nik7CisJbmV3bGVuICs9IDQ2OworCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIDQ2OworCXNpemUgLT0gNDY7CisKKwkvKiAicGFyZW50IDxzaGExPlxuIiAqLworCXdoaWxlICghbWVtY21wKGJ1ZmZlciwgInBhcmVudCAiLCA3KSkgeworCQltZW1jcHkobmV3ICsgbmV3bGVuLCBidWZmZXIsIDQ4KTsKKwkJbmV3bGVuICs9IDQ4OworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyA0ODsKKwkJc2l6ZSAtPSA0ODsKKwl9CisKKwkvKiAiYXV0aG9yIHh5eiA8eHl6PiBkYXRlIiAqLworCW5ld2xlbiArPSBjb252ZXJ0X2RhdGVfbGluZShuZXcgKyBuZXdsZW4sICZidWZmZXIsICZzaXplKTsKKwkvKiAiY29tbWl0dGVyIHh5eiA8eHl6PiBkYXRlIiAqLworCW5ld2xlbiArPSBjb252ZXJ0X2RhdGVfbGluZShuZXcgKyBuZXdsZW4sICZidWZmZXIsICZzaXplKTsKKworCS8qIFJlc3QgKi8KKwltZW1jcHkobmV3ICsgbmV3bGVuLCBidWZmZXIsIHNpemUpOworCW5ld2xlbiArPSBzaXplOworCisJd3JpdGVfc2hhMV9maWxlKG5ldywgbmV3bGVuLCBjb21taXRfdHlwZSwgcmVzdWx0X3NoYTEpOworCWZyZWUobmV3KTsKK30KKworc3RhdGljIHZvaWQgY29udmVydF9jb21taXQodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExKQoreworCXZvaWQgKm9yaWdfYnVmZmVyID0gYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgb3JpZ19zaXplID0gc2l6ZTsKKworCWlmIChtZW1jbXAoYnVmZmVyLCAidHJlZSAiLCA1KSkKKwkJZGllKCJCYWQgY29tbWl0ICclcyciLCAoY2hhciopIGJ1ZmZlcik7CisJY29udmVydF9hc2NpaV9zaGExKChjaGFyICopIGJ1ZmZlciArIDUpOworCWJ1ZmZlciA9IChjaGFyICopIGJ1ZmZlciArIDQ2OyAgICAvKiAidHJlZSAiICsgImhleCBzaGExIiArICJcbiIgKi8KKwl3aGlsZSAoIW1lbWNtcChidWZmZXIsICJwYXJlbnQgIiwgNykpIHsKKwkJY29udmVydF9hc2NpaV9zaGExKChjaGFyICopIGJ1ZmZlciArIDcpOworCQlidWZmZXIgPSAoY2hhciAqKSBidWZmZXIgKyA0ODsKKwl9CisJY29udmVydF9kYXRlKG9yaWdfYnVmZmVyLCBvcmlnX3NpemUsIHJlc3VsdF9zaGExKTsKK30KKworc3RhdGljIHN0cnVjdCBlbnRyeSAqIGNvbnZlcnRfZW50cnkodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5ID0gbG9va3VwX2VudHJ5KHNoYTEpOworCWNoYXIgdHlwZVsyMF07CisJdm9pZCAqYnVmZmVyLCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlpZiAoZW50cnktPmNvbnZlcnRlZCkKKwkJcmV0dXJuIGVudHJ5OworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlkaWUoInVuYWJsZSB0byByZWFkIG9iamVjdCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisKKwlpZiAoIXN0cmNtcCh0eXBlLCBibG9iX3R5cGUpKSB7CisJCXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIHNpemUsIGJsb2JfdHlwZSwgZW50cnktPm5ld19zaGExKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkKKwkJY29udmVydF90cmVlKGJ1ZmZlciwgc2l6ZSwgZW50cnktPm5ld19zaGExKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsIGNvbW1pdF90eXBlKSkKKwkJY29udmVydF9jb21taXQoYnVmZmVyLCBzaXplLCBlbnRyeS0+bmV3X3NoYTEpOworCWVsc2UKKwkJZGllKCJ1bmtub3duIG9iamVjdCB0eXBlICclcycgaW4gJXMiLCB0eXBlLCBzaGExX3RvX2hleChzaGExKSk7CisJZW50cnktPmNvbnZlcnRlZCA9IDE7CisJZnJlZShidWZmZXIpOworCWZyZWUoZGF0YSk7CisJcmV0dXJuIGVudHJ5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgZW50cnkgKmVudHJ5OworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCisJaWYgKGFyZ2MgIT0gMikKKwkJdXNhZ2UoImdpdC1jb252ZXJ0LW9iamVjdHMgPHNoYTE+Iik7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisKKwllbnRyeSA9IGNvbnZlcnRfZW50cnkoc2hhMSk7CisJcHJpbnRmKCJuZXcgc2hhMTogJXNcbiIsIHNoYTFfdG9faGV4KGVudHJ5LT5uZXdfc2hhMSkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29weS5jIGIvY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3B5LmMKQEAgLTAsMCArMSwzOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBjb3B5X2ZkKGludCBpZmQsIGludCBvZmQpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IGxlbjsKKwkJY2hhciBidWZmZXJbODE5Ml07CisJCWNoYXIgKmJ1ZiA9IGJ1ZmZlcjsKKwkJbGVuID0geHJlYWQoaWZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKwkJaWYgKCFsZW4pCisJCQlicmVhazsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWludCByZWFkX2Vycm9yOworCQkJcmVhZF9lcnJvciA9IGVycm5vOworCQkJY2xvc2UoaWZkKTsKKwkJCXJldHVybiBlcnJvcigiY29weS1mZDogcmVhZCByZXR1cm5lZCAlcyIsCisJCQkJICAgICBzdHJlcnJvcihyZWFkX2Vycm9yKSk7CisJCX0KKwkJd2hpbGUgKGxlbikgeworCQkJaW50IHdyaXR0ZW4gPSB4d3JpdGUob2ZkLCBidWYsIGxlbik7CisJCQlpZiAod3JpdHRlbiA+IDApIHsKKwkJCQlidWYgKz0gd3JpdHRlbjsKKwkJCQlsZW4gLT0gd3JpdHRlbjsKKwkJCX0KKwkJCWVsc2UgaWYgKCF3cml0dGVuKSB7CisJCQkJY2xvc2UoaWZkKTsKKwkJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHdyaXRlIHJldHVybmVkIDAiKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xvc2UoaWZkKTsKKwkJCQlyZXR1cm4gZXJyb3IoImNvcHktZmQ6IHdyaXRlIHJldHVybmVkICVzIiwKKwkJCQkJICAgICBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQl9CisJfQorCWNsb3NlKGlmZCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2NzdW0tZmlsZS5jIGIvY3N1bS1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3YjQwZgotLS0gL2Rldi9udWxsCisrKyBiL2NzdW0tZmlsZS5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogY3N1bS1maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyAqCisgKiBTaW1wbGUgZmlsZSB3cml0ZSBpbmZyYXN0cnVjdHVyZSBmb3Igd3JpdGluZyBTSEExLXN1bW1lZAorICogZmlsZXMuIFVzZWZ1bCB3aGVuIHlvdSB3cml0ZSBhIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBiZQorICogYWJsZSB0byB2ZXJpZnkgaGFzbid0IGJlZW4gbWVzc2VkIHdpdGggYWZ0ZXJ3YXJkcy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisKK3N0YXRpYyBpbnQgc2hhMWZsdXNoKHN0cnVjdCBzaGExZmlsZSAqZiwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXZvaWQgKmJ1ZiA9IGYtPmJ1ZmZlcjsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IHh3cml0ZShmLT5mZCwgYnVmLCBjb3VudCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlidWYgPSAoY2hhciAqKSBidWYgKyByZXQ7CisJCQljb3VudCAtPSByZXQ7CisJCQlpZiAoY291bnQpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXJldCkKKwkJCWRpZSgic2hhMSBmaWxlICclcycgd3JpdGUgZXJyb3IuIE91dCBvZiBkaXNrc3BhY2UiLCBmLT5uYW1lKTsKKwkJZGllKCJzaGExIGZpbGUgJyVzJyB3cml0ZSBlcnJvciAoJXMpIiwgZi0+bmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CisKK2ludCBzaGExY2xvc2Uoc3RydWN0IHNoYTFmaWxlICpmLCB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGludCB1cGRhdGUpCit7CisJdW5zaWduZWQgb2Zmc2V0ID0gZi0+b2Zmc2V0OworCWlmIChvZmZzZXQpIHsKKwkJU0hBMV9VcGRhdGUoJmYtPmN0eCwgZi0+YnVmZmVyLCBvZmZzZXQpOworCQlzaGExZmx1c2goZiwgb2Zmc2V0KTsKKwl9CisJU0hBMV9GaW5hbChmLT5idWZmZXIsICZmLT5jdHgpOworCWlmIChyZXN1bHQpCisJCW1lbWNweShyZXN1bHQsIGYtPmJ1ZmZlciwgMjApOworCWlmICh1cGRhdGUpCisJCXNoYTFmbHVzaChmLCAyMCk7CisJaWYgKGNsb3NlKGYtPmZkKSkKKwkJZGllKCIlczogc2hhMSBmaWxlIGVycm9yIG9uIGNsb3NlICglcykiLCBmLT5uYW1lLCBzdHJlcnJvcihlcnJubykpOworCWZyZWUoZik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzaGExd3JpdGUoc3RydWN0IHNoYTFmaWxlICpmLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQpIHsKKwkJdW5zaWduZWQgb2Zmc2V0ID0gZi0+b2Zmc2V0OworCQl1bnNpZ25lZCBsZWZ0ID0gc2l6ZW9mKGYtPmJ1ZmZlcikgLSBvZmZzZXQ7CisJCXVuc2lnbmVkIG5yID0gY291bnQgPiBsZWZ0ID8gbGVmdCA6IGNvdW50OworCisJCW1lbWNweShmLT5idWZmZXIgKyBvZmZzZXQsIGJ1ZiwgbnIpOworCQljb3VudCAtPSBucjsKKwkJb2Zmc2V0ICs9IG5yOworCQlidWYgPSAoY2hhciAqKSBidWYgKyBucjsKKwkJbGVmdCAtPSBucjsKKwkJaWYgKCFsZWZ0KSB7CisJCQlTSEExX1VwZGF0ZSgmZi0+Y3R4LCBmLT5idWZmZXIsIG9mZnNldCk7CisJCQlzaGExZmx1c2goZiwgb2Zmc2V0KTsKKwkJCW9mZnNldCA9IDA7CisJCX0KKwkJZi0+b2Zmc2V0ID0gb2Zmc2V0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNoYTFmaWxlICpzaGExY3JlYXRlKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBzaGExZmlsZSAqZjsKKwl1bnNpZ25lZCBsZW47CisJdmFfbGlzdCBhcmc7CisJaW50IGZkOworCisJZiA9IHhtYWxsb2Moc2l6ZW9mKCpmKSk7CisKKwl2YV9zdGFydChhcmcsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKGYtPm5hbWUsIHNpemVvZihmLT5uYW1lKSwgZm10LCBhcmcpOworCXZhX2VuZChhcmcpOworCWlmIChsZW4gPj0gUEFUSF9NQVgpCisJCWRpZSgieW91IHdhc2NhbGx5IHdhYmJpdCwgeW91Iik7CisJZi0+bmFtZWxlbiA9IGxlbjsKKworCWZkID0gb3BlbihmLT5uYW1lLCBPX0NSRUFUIHwgT19FWENMIHwgT19XUk9OTFksIDA2NjYpOworCWlmIChmZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIG9wZW4gJXMgKCVzKSIsIGYtPm5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZi0+ZmQgPSBmZDsKKwlmLT5lcnJvciA9IDA7CisJZi0+b2Zmc2V0ID0gMDsKKwlTSEExX0luaXQoJmYtPmN0eCk7CisJcmV0dXJuIGY7Cit9CisKK3N0cnVjdCBzaGExZmlsZSAqc2hhMWZkKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2hhMWZpbGUgKmY7CisJdW5zaWduZWQgbGVuOworCisJZiA9IHhtYWxsb2Moc2l6ZW9mKCpmKSk7CisKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJZGllKCJ5b3Ugd2FzY2FsbHkgd2FiYml0LCB5b3UiKTsKKwlmLT5uYW1lbGVuID0gbGVuOworCW1lbWNweShmLT5uYW1lLCBuYW1lLCBsZW4rMSk7CisKKwlmLT5mZCA9IGZkOworCWYtPmVycm9yID0gMDsKKwlmLT5vZmZzZXQgPSAwOworCVNIQTFfSW5pdCgmZi0+Y3R4KTsKKwlyZXR1cm4gZjsKK30KKworaW50IHNoYTF3cml0ZV9jb21wcmVzc2VkKHN0cnVjdCBzaGExZmlsZSAqZiwgdm9pZCAqaW4sIHVuc2lnbmVkIGludCBzaXplKQoreworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBsb25nIG1heHNpemU7CisJdm9pZCAqb3V0OworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwltYXhzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIHNpemUpOworCW91dCA9IHhtYWxsb2MobWF4c2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X2luID0gaW47CisJc3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKworCXN0cmVhbS5uZXh0X291dCA9IG91dDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gbWF4c2l6ZTsKKworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKSA9PSBaX09LKQorCQkvKiBub3RoaW5nICovOworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisKKwlzaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlzaGExd3JpdGUoZiwgb3V0LCBzaXplKTsKKwlmcmVlKG91dCk7CisJcmV0dXJuIHNpemU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvY3N1bS1maWxlLmggYi9jc3VtLWZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQxYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY3N1bS1maWxlLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBDU1VNX0ZJTEVfSAorI2RlZmluZSBDU1VNX0ZJTEVfSAorCisvKiBBIFNIQTEtcHJvdGVjdGVkIGZpbGUgKi8KK3N0cnVjdCBzaGExZmlsZSB7CisJaW50IGZkLCBlcnJvcjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBuYW1lbGVuOworCVNIQV9DVFggY3R4OworCWNoYXIgbmFtZVtQQVRIX01BWF07CisJdW5zaWduZWQgY2hhciBidWZmZXJbODE5Ml07Cit9OworCitleHRlcm4gc3RydWN0IHNoYTFmaWxlICpzaGExZmQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBzdHJ1Y3Qgc2hhMWZpbGUgKnNoYTFjcmVhdGUoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGludCBzaGExY2xvc2Uoc3RydWN0IHNoYTFmaWxlICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKK2V4dGVybiBpbnQgc2hhMXdyaXRlKHN0cnVjdCBzaGExZmlsZSAqLCB2b2lkICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IHNoYTF3cml0ZV9jb21wcmVzc2VkKHN0cnVjdCBzaGExZmlsZSAqLCB2b2lkICosIHVuc2lnbmVkIGludCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY3R5cGUuYyBiL2N0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiZGZmYQotLS0gL2Rldi9udWxsCisrKyBiL2N0eXBlLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIFNhbmUgbG9jYWxlLWluZGVwZW5kZW50LCBBU0NJSSBjdHlwZS4KKyAqCisgKiBObyBzdXJwcmlzZXMsIGFuZCB3b3JrcyB3aXRoIHNpZ25lZCBhbmQgdW5zaWduZWQgY2hhcnMuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIFNTIEdJVF9TUEFDRQorI2RlZmluZSBBQSBHSVRfQUxQSEEKKyNkZWZpbmUgREQgR0lUX0RJR0lUCisKK3Vuc2lnbmVkIGNoYXIgc2FuZV9jdHlwZVsyNTZdID0geworCSAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIFNTLCBTUywgIDAsICAwLCBTUywgIDAsICAwLAkJLyogMC0xNSAqLworCSAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAkJLyogMTYtMTUgKi8KKwlTUywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDMyLTE1ICovCisJREQsIERELCBERCwgREQsIERELCBERCwgREQsIERELCBERCwgREQsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCQkvKiA0OC0xNSAqLworCSAwLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLAkJLyogNjQtMTUgKi8KKwlBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsICAwLCAgMCwgIDAsICAwLCAgMCwJCS8qIDgwLTE1ICovCisJIDAsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsCQkvKiA5Ni0xNSAqLworCUFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgQUEsIEFBLCBBQSwgIDAsICAwLCAgMCwgIDAsICAwLAkJLyogMTEyLTE1ICovCisJLyogTm90aGluZyBpbiB0aGUgMTI4Li4gcmFuZ2UgKi8KK307CisKZGlmZiAtLWdpdCBhL2RhZW1vbi5jIGIvZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwODM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2RhZW1vbi5jCkBAIC0wLDAgKzEsODM1IEBACisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCitzdGF0aWMgaW50IGxvZ19zeXNsb2c7CitzdGF0aWMgaW50IHZlcmJvc2U7CitzdGF0aWMgaW50IHJldXNlYWRkcjsKKworc3RhdGljIGNvbnN0IGNoYXIgZGFlbW9uX3VzYWdlW10gPQorImdpdC1kYWVtb24gWy0tdmVyYm9zZV0gWy0tc3lzbG9nXSBbLS1pbmV0ZCB8IC0tcG9ydD1uXSBbLS1leHBvcnQtYWxsXVxuIgorIiAgICAgICAgICAgWy0tdGltZW91dD1uXSBbLS1pbml0LXRpbWVvdXQ9bl0gWy0tc3RyaWN0LXBhdGhzXVxuIgorIiAgICAgICAgICAgWy0tYmFzZS1wYXRoPXBhdGhdIFstLXVzZXItcGF0aCB8IC0tdXNlci1wYXRoPXBhdGhdXG4iCisiICAgICAgICAgICBbLS1yZXVzZWFkZHJdIFstLWRldGFjaF0gWy0tcGlkLWZpbGU9ZmlsZV0gW2RpcmVjdG9yeS4uLl0iOworCisvKiBMaXN0IG9mIGFjY2VwdGFibGUgcGF0aG5hbWUgcHJlZml4ZXMgKi8KK3N0YXRpYyBjaGFyICoqb2tfcGF0aHMgPSBOVUxMOworc3RhdGljIGludCBzdHJpY3RfcGF0aHMgPSAwOworCisvKiBJZiB0aGlzIGlzIHNldCwgZ2l0LWRhZW1vbi1leHBvcnQtb2sgaXMgbm90IHJlcXVpcmVkICovCitzdGF0aWMgaW50IGV4cG9ydF9hbGxfdHJlZXMgPSAwOworCisvKiBUYWtlIGFsbCBwYXRocyByZWxhdGl2ZSB0byB0aGlzIG9uZSBpZiBub24tTlVMTCAqLworc3RhdGljIGNoYXIgKmJhc2VfcGF0aCA9IE5VTEw7CisKKy8qIElmIGRlZmluZWQsIH51c2VyIG5vdGF0aW9uIGlzIGFsbG93ZWQgYW5kIHRoZSBzdHJpbmcgaXMgaW5zZXJ0ZWQKKyAqIGFmdGVyIH51c2VyLy4gIEUuZy4gYSByZXF1ZXN0IHRvIGdpdDovL2hvc3QvfmFsaWNlL2Zyb3R6IHdvdWxkCisgKiBnbyB0byAvaG9tZS9hbGljZS9wdWJfZ2l0L2Zyb3R6IHdpdGggLS11c2VyLXBhdGg9cHViX2dpdC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnVzZXJfcGF0aCA9IE5VTEw7CisKKy8qIFRpbWVvdXQsIGFuZCBpbml0aWFsIHRpbWVvdXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltZW91dCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfdGltZW91dCA9IDA7CisKK3N0YXRpYyB2b2lkIGxvZ3JlcG9ydChpbnQgcHJpb3JpdHksIGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJLyogV2Ugc2hvdWxkIGRvIGEgc2luZ2xlIHdyaXRlIHNvIHRoYXQgaXQgaXMgYXRvbWljIGFuZCBvdXRwdXQKKwkgKiBvZiBzZXZlcmFsIHByb2Nlc3NlcyBkbyBub3QgZ2V0IGludGVybWluZ2xlZC4gKi8KKwljaGFyIGJ1ZlsxMDI0XTsKKwlpbnQgYnVmbGVuOworCWludCBtYXhsZW4sIG1zZ2xlbjsKKworCS8qIHNpemVvZihidWYpIHNob3VsZCBiZSBiaWcgZW5vdWdoIGZvciAiW3BpZF0gXG4iICovCisJYnVmbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlslbGRdICIsIChsb25nKSBnZXRwaWQoKSk7CisKKwltYXhsZW4gPSBzaXplb2YoYnVmKSAtIGJ1ZmxlbiAtIDE7IC8qIC0xIGZvciBvdXIgb3duIExGICovCisJbXNnbGVuID0gdnNucHJpbnRmKGJ1ZiArIGJ1ZmxlbiwgbWF4bGVuLCBlcnIsIHBhcmFtcyk7CisKKwlpZiAobG9nX3N5c2xvZykgeworCQlzeXNsb2cocHJpb3JpdHksICIlcyIsIGJ1Zik7CisJCXJldHVybjsKKwl9CisKKwkvKiBtYXhsZW4gY291bnRlZCBvdXIgb3duIExGIGJ1dCBhbHNvIGNvdW50cyBzcGFjZSBnaXZlbiB0bworCSAqIHZzbnByaW50ZiBmb3IgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQKKwkgKiB3ZSBoYXZlIHNwYWNlIGZvciBvdXIgb3duIExGIGFuZCBOVUwgYWZ0ZXIgdGhlICJtZWF0IiBvZiB0aGUKKwkgKiBtZXNzYWdlLCBzbyB0cnVuY2F0ZSBpdCBhdCBtYXhsZW4gLSAxLgorCSAqLworCWlmIChtc2dsZW4gPiBtYXhsZW4gLSAxKQorCQltc2dsZW4gPSBtYXhsZW4gLSAxOworCWVsc2UgaWYgKG1zZ2xlbiA8IDApCisJCW1zZ2xlbiA9IDA7IC8qIFByb3RlY3QgYWdhaW5zdCB3ZWlyZCByZXR1cm4gdmFsdWVzLiAqLworCWJ1ZmxlbiArPSBtc2dsZW47CisKKwlidWZbYnVmbGVuKytdID0gJ1xuJzsKKwlidWZbYnVmbGVuXSA9ICdcMCc7CisKKwl3cml0ZSgyLCBidWYsIGJ1Zmxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ2Vycm9yKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlsb2dyZXBvcnQoTE9HX0VSUiwgZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBsb2dpbmZvKGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCWlmICghdmVyYm9zZSkKKwkJcmV0dXJuOworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlsb2dyZXBvcnQoTE9HX0lORk8sIGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKK30KKworc3RhdGljIHZvaWQgTk9SRVRVUk4gZGFlbW9uX2RpZShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCWxvZ3JlcG9ydChMT0dfRVJSLCBlcnIsIHBhcmFtcyk7CisJZXhpdCgxKTsKK30KKworc3RhdGljIGludCBhdm9pZF9hbGlhcyhjaGFyICpwKQoreworCWludCBzbCwgbmRvdDsKKworCS8qIAorCSAqIFRoaXMgcmVzdXJyZWN0cyB0aGUgYmVsdHMgYW5kIHN1c3BlbmRlcnMgcGFyYW5vaWEgY2hlY2sgYnkgSFBBCisJICogZG9uZSBpbiA8NDM1NTYwRjcuNDA4MDAwNkB6eXRvci5jb20+IHRocmVhZCwgbm93IGVudGVyX3JlcG8oKQorCSAqIGRvZXMgbm90IGRvIGdldGN3ZCgpIGJhc2VkIHBhdGggY2Fub25pY2FsaXphdGlvbnMuCisJICoKKwkgKiBzbCBiZWNvbWVzIHRydWUgaW1tZWRpYXRlbHkgYWZ0ZXIgc2VlaW5nICcvJyBhbmQgY29udGludWVzIHRvCisJICogYmUgdHJ1ZSBhcyBsb25nIGFzIGRvdHMgY29udGludWUgYWZ0ZXIgdGhhdCB3aXRob3V0IGludGVydmVuaW5nCisJICogbm9uLWRvdCBjaGFyYWN0ZXIuCisJICovCisJaWYgKCFwIHx8ICgqcCAhPSAnLycgJiYgKnAgIT0gJ34nKSkKKwkJcmV0dXJuIC0xOworCXNsID0gMTsgbmRvdCA9IDA7CisJcCsrOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciBjaCA9ICpwKys7CisJCWlmIChzbCkgeworCQkJaWYgKGNoID09ICcuJykKKwkJCQluZG90Kys7CisJCQllbHNlIGlmIChjaCA9PSAnLycpIHsKKwkJCQlpZiAobmRvdCA8IDMpCisJCQkJCS8qIHJlamVjdCAvLywgLy4vIGFuZCAvLi4vICovCisJCQkJCXJldHVybiAtMTsKKwkJCQluZG90ID0gMDsKKwkJCX0KKwkJCWVsc2UgaWYgKGNoID09IDApIHsKKwkJCQlpZiAoMCA8IG5kb3QgJiYgbmRvdCA8IDMpCisJCQkJCS8qIHJlamVjdCAvLiQgYW5kIC8uLiQgKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZWxzZQorCQkJCXNsID0gbmRvdCA9IDA7CisJCX0KKwkJZWxzZSBpZiAoY2ggPT0gMCkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChjaCA9PSAnLycpIHsKKwkJCXNsID0gMTsKKwkJCW5kb3QgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqcGF0aF9vayhjaGFyICpkaXIpCit7CisJc3RhdGljIGNoYXIgcnBhdGhbUEFUSF9NQVhdOworCWNoYXIgKnBhdGg7CisKKwlpZiAoYXZvaWRfYWxpYXMoZGlyKSkgeworCQlsb2dlcnJvcigiJyVzJzogYWxpYXNlZCIsIGRpcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICgqZGlyID09ICd+JykgeworCQlpZiAoIXVzZXJfcGF0aCkgeworCQkJbG9nZXJyb3IoIiclcyc6IFVzZXItcGF0aCBub3QgYWxsb3dlZCIsIGRpcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoKnVzZXJfcGF0aCkgeworCQkJLyogR290IGVpdGhlciAifmFsaWNlIiBvciAifmFsaWNlL2ZvbyI7CisJCQkgKiByZXdyaXRlIHRoZW0gdG8gIn5hbGljZS8lcyIgb3IKKwkJCSAqICJ+YWxpY2UvJXMvZm9vIi4KKwkJCSAqLworCQkJaW50IG5hbWxlbiwgcmVzdGxlbiA9IHN0cmxlbihkaXIpOworCQkJY2hhciAqc2xhc2ggPSBzdHJjaHIoZGlyLCAnLycpOworCQkJaWYgKCFzbGFzaCkKKwkJCQlzbGFzaCA9IGRpciArIHJlc3RsZW47CisJCQluYW1sZW4gPSBzbGFzaCAtIGRpcjsKKwkJCXJlc3RsZW4gLT0gbmFtbGVuOworCQkJbG9naW5mbygidXNlcnBhdGggPCVzPiwgcmVxdWVzdCA8JXM+LCBuYW1sZW4gJWQsIHJlc3RsZW4gJWQsIHNsYXNoIDwlcz4iLCB1c2VyX3BhdGgsIGRpciwgbmFtbGVuLCByZXN0bGVuLCBzbGFzaCk7CisJCQlzbnByaW50ZihycGF0aCwgUEFUSF9NQVgsICIlLipzLyVzJS4qcyIsCisJCQkJIG5hbWxlbiwgZGlyLCB1c2VyX3BhdGgsIHJlc3RsZW4sIHNsYXNoKTsKKwkJCWRpciA9IHJwYXRoOworCQl9CisJfQorCWVsc2UgaWYgKGJhc2VfcGF0aCkgeworCQlpZiAoKmRpciAhPSAnLycpIHsKKwkJCS8qIEFsbG93IG9ubHkgYWJzb2x1dGUgKi8KKwkJCWxvZ2Vycm9yKCInJXMnOiBOb24tYWJzb2x1dGUgcGF0aCBkZW5pZWQgKGJhc2UtcGF0aCBhY3RpdmUpIiwgZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWVsc2UgeworCQkJc25wcmludGYocnBhdGgsIFBBVEhfTUFYLCAiJXMlcyIsIGJhc2VfcGF0aCwgZGlyKTsKKwkJCWRpciA9IHJwYXRoOworCQl9CisJfQorCisJcGF0aCA9IGVudGVyX3JlcG8oZGlyLCBzdHJpY3RfcGF0aHMpOworCisJaWYgKCFwYXRoKSB7CisJCWxvZ2Vycm9yKCInJXMnOiB1bmFibGUgdG8gY2hkaXIgb3Igbm90IGEgZ2l0IGFyY2hpdmUiLCBkaXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIG9rX3BhdGhzICYmICpva19wYXRocyApIHsKKwkJY2hhciAqKnBwOworCQlpbnQgcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKworCQkvKiBUaGUgdmFsaWRhdGlvbiBpcyBkb25lIG9uIHRoZSBwYXRocyBhZnRlciBlbnRlcl9yZXBvCisJCSAqIGFwcGVuZHMgb3B0aW9uYWwgey5naXQsLmdpdC8uZ2l0fSBhbmQgZnJpZW5kcywgYnV0IAorCQkgKiBpdCBkb2VzIG5vdCB1c2UgZ2V0Y3dkKCkuICBTbyBpZiB5b3VyIC9wdWIgaXMKKwkJICogYSBzeW1saW5rIHRvIC9tbnQvcHViLCB5b3UgY2FuIHdoaXRlbGlzdCAvcHViIGFuZAorCQkgKiBkbyBub3QgaGF2ZSB0byBzYXkgL21udC9wdWIuCisJCSAqIERvIG5vdCBzYXkgL3B1Yi8uCisJCSAqLworCQlmb3IgKCBwcCA9IG9rX3BhdGhzIDsgKnBwIDsgcHArKyApIHsKKwkJCWludCBsZW4gPSBzdHJsZW4oKnBwKTsKKwkJCWlmIChsZW4gPD0gcGF0aGxlbiAmJgorCQkJICAgICFtZW1jbXAoKnBwLCBwYXRoLCBsZW4pICYmCisJCQkgICAgKHBhdGhbbGVuXSA9PSAnXDAnIHx8CisJCQkgICAgICghc3RyaWN0X3BhdGhzICYmIHBhdGhbbGVuXSA9PSAnLycpKSkKKwkJCQlyZXR1cm4gcGF0aDsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyogYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KKwkJaWYgKCFzdHJpY3RfcGF0aHMpCisJCQlyZXR1cm4gcGF0aDsKKwl9CisKKwlsb2dlcnJvcigiJyVzJzogbm90IGluIHdoaXRlbGlzdCIsIHBhdGgpOworCXJldHVybiBOVUxMOwkJLyogRmFsbHRocm91Z2guIERlbnkgYnkgZGVmYXVsdCAqLworfQorCitzdGF0aWMgaW50IHVwbG9hZChjaGFyICpkaXIpCit7CisJLyogVGltZW91dCBhcyBzdHJpbmcgKi8KKwljaGFyIHRpbWVvdXRfYnVmWzY0XTsKKwljb25zdCBjaGFyICpwYXRoOworCisJbG9naW5mbygiUmVxdWVzdCBmb3IgJyVzJyIsIGRpcik7CisKKwlpZiAoIShwYXRoID0gcGF0aF9vayhkaXIpKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBTZWN1cml0eSBvbiB0aGUgY2hlYXAuCisJICoKKwkgKiBXZSB3YW50IGEgcmVhZGFibGUgSEVBRCwgdXNhYmxlICJvYmplY3RzIiBkaXJlY3RvcnksIGFuZAorCSAqIGEgImdpdC1kYWVtb24tZXhwb3J0LW9rIiBmbGFnIHRoYXQgc2F5cyB0aGF0IHRoZSBvdGhlciBzaWRlCisJICogaXMgb2sgd2l0aCB1cyBkb2luZyB0aGlzLgorCSAqCisJICogcGF0aF9vaygpIHVzZXMgZW50ZXJfcmVwbygpIGFuZCBkb2VzIHdoaXRlbGlzdCBjaGVja2luZy4KKwkgKiBXZSBvbmx5IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSByZXBvc2l0b3J5IGlzIGV4cG9ydGVkLgorCSAqLworCisJaWYgKCFleHBvcnRfYWxsX3RyZWVzICYmIGFjY2VzcygiZ2l0LWRhZW1vbi1leHBvcnQtb2siLCBGX09LKSkgeworCQlsb2dlcnJvcigiJyVzJzogcmVwb3NpdG9yeSBub3QgZXhwb3J0ZWQuIiwgcGF0aCk7CisJCWVycm5vID0gRUFDQ0VTOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiBXZSdsbCBpZ25vcmUgU0lHVEVSTSBmcm9tIG5vdyBvbiwgd2UgaGF2ZSBhCisJICogZ29vZCBjbGllbnQuCisJICovCisJc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pOworCisJc25wcmludGYodGltZW91dF9idWYsIHNpemVvZiB0aW1lb3V0X2J1ZiwgIi0tdGltZW91dD0ldSIsIHRpbWVvdXQpOworCisJLyogZ2l0LXVwbG9hZC1wYWNrIG9ubHkgZXZlciByZWFkcyBzdHVmZiwgc28gdGhpcyBpcyBzYWZlICovCisJZXhlY2xfZ2l0X2NtZCgidXBsb2FkLXBhY2siLCAiLS1zdHJpY3QiLCB0aW1lb3V0X2J1ZiwgIi4iLCBOVUxMKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZXhlY3V0ZShzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcGt0bGVuLCBsZW47CisKKwlpZiAoYWRkcikgeworCQljaGFyIGFkZHJidWZbMjU2XSA9ICIiOworCQlpbnQgcG9ydCA9IC0xOworCisJCWlmIChhZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgeworCQkJc3RydWN0IHNvY2thZGRyX2luICpzaW5fYWRkciA9ICh2b2lkICopIGFkZHI7CisJCQlpbmV0X250b3AoYWRkci0+c2FfZmFtaWx5LCAmc2luX2FkZHItPnNpbl9hZGRyLCBhZGRyYnVmLCBzaXplb2YoYWRkcmJ1ZikpOworCQkJcG9ydCA9IHNpbl9hZGRyLT5zaW5fcG9ydDsKKyNpZm5kZWYgTk9fSVBWNgorCQl9IGVsc2UgaWYgKGFkZHIgJiYgYWRkci0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42X2FkZHIgPSAodm9pZCAqKSBhZGRyOworCisJCQljaGFyICpidWYgPSBhZGRyYnVmOworCQkJKmJ1ZisrID0gJ1snOyAqYnVmID0gJ1wwJzsgLyogc3RwY3B5KCkgaXMgY29vbCAqLworCQkJaW5ldF9udG9wKEFGX0lORVQ2LCAmc2luNl9hZGRyLT5zaW42X2FkZHIsIGJ1Ziwgc2l6ZW9mKGFkZHJidWYpIC0gMSk7CisJCQlzdHJjYXQoYnVmLCAiXSIpOworCisJCQlwb3J0ID0gc2luNl9hZGRyLT5zaW42X3BvcnQ7CisjZW5kaWYKKwkJfQorCQlsb2dpbmZvKCJDb25uZWN0aW9uIGZyb20gJXM6JWQiLCBhZGRyYnVmLCBwb3J0KTsKKwl9CisKKwlhbGFybShpbml0X3RpbWVvdXQgPyBpbml0X3RpbWVvdXQgOiB0aW1lb3V0KTsKKwlwa3RsZW4gPSBwYWNrZXRfcmVhZF9saW5lKDAsIGxpbmUsIHNpemVvZihsaW5lKSk7CisJYWxhcm0oMCk7CisKKwlsZW4gPSBzdHJsZW4obGluZSk7CisJaWYgKHBrdGxlbiAhPSBsZW4pCisJCWxvZ2luZm8oIkV4dGVuZGVkIGF0dHJpYnV0ZXMgKCVkIGJ5dGVzKSBleGlzdCA8JS4qcz4iLAorCQkJKGludCkgcGt0bGVuIC0gbGVuLAorCQkJKGludCkgcGt0bGVuIC0gbGVuLCBsaW5lICsgbGVuICsgMSk7CisJaWYgKGxlbiAmJiBsaW5lW2xlbi0xXSA9PSAnXG4nKQorCQlsaW5lWy0tbGVuXSA9IDA7CisKKwlpZiAoIXN0cm5jbXAoImdpdC11cGxvYWQtcGFjayAiLCBsaW5lLCAxNikpCisJCXJldHVybiB1cGxvYWQobGluZSsxNik7CisKKwlsb2dlcnJvcigiUHJvdG9jb2wgZXJyb3I6ICclcyciLCBsaW5lKTsKKwlyZXR1cm4gLTE7Cit9CisKKworLyoKKyAqIFdlIGNvdW50IHNwYXduZWQvcmVhcGVkIHNlcGFyYXRlbHksIGp1c3QgdG8gYXZvaWQgYW55CisgKiByYWNlcyB3aGVuIHVwZGF0aW5nIHRoZW0gZnJvbSBzaWduYWxzLiBUaGUgU0lHQ0hMRCBoYW5kbGVyCisgKiB3aWxsIG9ubHkgdXBkYXRlIGNoaWxkcmVuX3JlYXBlZCwgYW5kIHRoZSBmb3JrIGxvZ2ljIHdpbGwKKyAqIG9ubHkgdXBkYXRlIGNoaWxkcmVuX3NwYXduZWQuCisgKgorICogTUFYX0NISUxEUkVOIHNob3VsZCBiZSBhIHBvd2VyLW9mLXR3byB0byBtYWtlIHRoZSBtb2R1bHVzCisgKiBvcGVyYXRpb24gY2hlYXAuIEl0IHNob3VsZCBhbHNvIGJlIGF0IGxlYXN0IHR3aWNlCisgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgd2Ugd2lsbCBldmVyIGFsbG93LgorICovCisjZGVmaW5lIE1BWF9DSElMRFJFTiAxMjgKKworc3RhdGljIGludCBtYXhfY29ubmVjdGlvbnMgPSAyNTsKKworLyogVGhlc2UgYXJlIHVwZGF0ZWQgYnkgdGhlIHNpZ25hbCBoYW5kbGVyICovCitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgaW50IGNoaWxkcmVuX3JlYXBlZCA9IDA7CitzdGF0aWMgcGlkX3QgZGVhZF9jaGlsZFtNQVhfQ0hJTERSRU5dOworCisvKiBUaGVzZSBhcmUgdXBkYXRlZCBieSB0aGUgbWFpbiBsb29wICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNoaWxkcmVuX3NwYXduZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjaGlsZHJlbl9kZWxldGVkID0gMDsKKworc3RhdGljIHN0cnVjdCBjaGlsZCB7CisJcGlkX3QgcGlkOworCWludCBhZGRybGVuOworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHJlc3M7Cit9IGxpdmVfY2hpbGRbTUFYX0NISUxEUkVOXTsKKworc3RhdGljIHZvaWQgYWRkX2NoaWxkKGludCBpZHgsIHBpZF90IHBpZCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKK3sKKwlsaXZlX2NoaWxkW2lkeF0ucGlkID0gcGlkOworCWxpdmVfY2hpbGRbaWR4XS5hZGRybGVuID0gYWRkcmxlbjsKKwltZW1jcHkoJmxpdmVfY2hpbGRbaWR4XS5hZGRyZXNzLCBhZGRyLCBhZGRybGVuKTsKK30KKworLyoKKyAqIFdhbGsgZnJvbSAiZGVsZXRlZCIgdG8gInNwYXduZWQiLCBhbmQgcmVtb3ZlIGNoaWxkICJwaWQiLgorICoKKyAqIFdlIG1vdmUgZXZlcnl0aGluZyB1cCBieSBvbmUsIHNpbmNlIHRoZSBuZXcgImRlbGV0ZWQiIHdpbGwKKyAqIGJlIG9uZSBoaWdoZXIuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9jaGlsZChwaWRfdCBwaWQsIHVuc2lnbmVkIGRlbGV0ZWQsIHVuc2lnbmVkIHNwYXduZWQpCit7CisJc3RydWN0IGNoaWxkIG47CisKKwlkZWxldGVkICU9IE1BWF9DSElMRFJFTjsKKwlzcGF3bmVkICU9IE1BWF9DSElMRFJFTjsKKwlpZiAobGl2ZV9jaGlsZFtkZWxldGVkXS5waWQgPT0gcGlkKSB7CisJCWxpdmVfY2hpbGRbZGVsZXRlZF0ucGlkID0gLTE7CisJCXJldHVybjsKKwl9CisJbiA9IGxpdmVfY2hpbGRbZGVsZXRlZF07CisJZm9yICg7OykgeworCQlzdHJ1Y3QgY2hpbGQgbTsKKwkJZGVsZXRlZCA9IChkZWxldGVkICsgMSkgJSBNQVhfQ0hJTERSRU47CisJCWlmIChkZWxldGVkID09IHNwYXduZWQpCisJCQlkaWUoImNvdWxkIG5vdCBmaW5kIGRlYWQgY2hpbGQgJWRcbiIsIHBpZCk7CisJCW0gPSBsaXZlX2NoaWxkW2RlbGV0ZWRdOworCQlsaXZlX2NoaWxkW2RlbGV0ZWRdID0gbjsKKwkJaWYgKG0ucGlkID09IHBpZCkKKwkJCXJldHVybjsKKwkJbiA9IG07CisJfQorfQorCisvKgorICogVGhpcyBnZXRzIGNhbGxlZCBpZiB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGdyb3dzCisgKiBwYXN0ICJtYXhfY29ubmVjdGlvbnMiLgorICoKKyAqIFdlIF9zaG91bGRfIHN0YXJ0IG9mZiBieSBzZWFyY2hpbmcgZm9yIGNvbm5lY3Rpb25zCisgKiBmcm9tIHRoZSBzYW1lIElQLCBhbmQgaWYgdGhlcmUgaXMgc29tZSBhZGRyZXNzIHd0aAorICogbXVsdGlwbGUgY29ubmVjdGlvbnMsIHdlIHNob3VsZCBraWxsIHRoYXQgZmlyc3QuCisgKgorICogQXMgaXQgaXMsIHdlIGp1c3QgInJhbmRvbWx5IiBraWxsIDI1JSBvZiB0aGUgY29ubmVjdGlvbnMsCisgKiBhbmQgb3VyIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9yIHN1Y2tzIHRvby4gSSBoYXZlIG5vCisgKiBzaGFtZS4KKyAqCisgKiBSZWFsbHksIHRoaXMgaXMganVzdCBhIHBsYWNlLWhvbGRlciBmb3IgYSBfcmVhbF8gYWxnb3JpdGhtLgorICovCitzdGF0aWMgdm9pZCBraWxsX3NvbWVfY2hpbGRyZW4oaW50IHNpZ25vLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3RvcCkKK3sKKwlzdGFydCAlPSBNQVhfQ0hJTERSRU47CisJc3RvcCAlPSBNQVhfQ0hJTERSRU47CisJd2hpbGUgKHN0YXJ0ICE9IHN0b3ApIHsKKwkJaWYgKCEoc3RhcnQgJiAzKSkKKwkJCWtpbGwobGl2ZV9jaGlsZFtzdGFydF0ucGlkLCBzaWdubyk7CisJCXN0YXJ0ID0gKHN0YXJ0ICsgMSkgJSBNQVhfQ0hJTERSRU47CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19tYXhfY29ubmVjdGlvbnModm9pZCkKK3sKKwlmb3IgKDs7KSB7CisJCWludCBhY3RpdmU7CisJCXVuc2lnbmVkIHNwYXduZWQsIHJlYXBlZCwgZGVsZXRlZDsKKworCQlzcGF3bmVkID0gY2hpbGRyZW5fc3Bhd25lZDsKKwkJcmVhcGVkID0gY2hpbGRyZW5fcmVhcGVkOworCQlkZWxldGVkID0gY2hpbGRyZW5fZGVsZXRlZDsKKworCQl3aGlsZSAoZGVsZXRlZCA8IHJlYXBlZCkgeworCQkJcGlkX3QgcGlkID0gZGVhZF9jaGlsZFtkZWxldGVkICUgTUFYX0NISUxEUkVOXTsKKwkJCXJlbW92ZV9jaGlsZChwaWQsIGRlbGV0ZWQsIHNwYXduZWQpOworCQkJZGVsZXRlZCsrOworCQl9CisJCWNoaWxkcmVuX2RlbGV0ZWQgPSBkZWxldGVkOworCisJCWFjdGl2ZSA9IHNwYXduZWQgLSBkZWxldGVkOworCQlpZiAoYWN0aXZlIDw9IG1heF9jb25uZWN0aW9ucykKKwkJCWJyZWFrOworCisJCS8qIEtpbGwgc29tZSB1bnN0YXJ0ZWQgY29ubmVjdGlvbnMgd2l0aCBTSUdURVJNICovCisJCWtpbGxfc29tZV9jaGlsZHJlbihTSUdURVJNLCBkZWxldGVkLCBzcGF3bmVkKTsKKwkJaWYgKGFjdGl2ZSA8PSBtYXhfY29ubmVjdGlvbnMgPDwgMSkKKwkJCWJyZWFrOworCisJCS8qIElmIHRoZSBTSUdURVJNIHRoaW5nIGlzbid0IGhlbHBpbmcgdXNlIFNJR0tJTEwgKi8KKwkJa2lsbF9zb21lX2NoaWxkcmVuKFNJR0tJTEwsIGRlbGV0ZWQsIHNwYXduZWQpOworCQlzbGVlcCgxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZShpbnQgaW5jb21pbmcsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4pCit7CisJcGlkX3QgcGlkID0gZm9yaygpOworCisJaWYgKHBpZCkgeworCQl1bnNpZ25lZCBpZHg7CisKKwkJY2xvc2UoaW5jb21pbmcpOworCQlpZiAocGlkIDwgMCkKKwkJCXJldHVybjsKKworCQlpZHggPSBjaGlsZHJlbl9zcGF3bmVkICUgTUFYX0NISUxEUkVOOworCQljaGlsZHJlbl9zcGF3bmVkKys7CisJCWFkZF9jaGlsZChpZHgsIHBpZCwgYWRkciwgYWRkcmxlbik7CisKKwkJY2hlY2tfbWF4X2Nvbm5lY3Rpb25zKCk7CisJCXJldHVybjsKKwl9CisKKwlkdXAyKGluY29taW5nLCAwKTsKKwlkdXAyKGluY29taW5nLCAxKTsKKwljbG9zZShpbmNvbWluZyk7CisKKwlleGl0KGV4ZWN1dGUoYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBjaGlsZF9oYW5kbGVyKGludCBzaWdubykKK3sKKwlmb3IgKDs7KSB7CisJCWludCBzdGF0dXM7CisJCXBpZF90IHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpOworCisJCWlmIChwaWQgPiAwKSB7CisJCQl1bnNpZ25lZCByZWFwZWQgPSBjaGlsZHJlbl9yZWFwZWQ7CisJCQlkZWFkX2NoaWxkW3JlYXBlZCAlIE1BWF9DSElMRFJFTl0gPSBwaWQ7CisJCQljaGlsZHJlbl9yZWFwZWQgPSByZWFwZWQgKyAxOworCQkJLyogWFhYOiBDdXN0b20gbG9nZ2luZywgc2luY2Ugd2UgZG9uJ3Qgd2FubmEgZ2V0cGlkKCkgKi8KKwkJCWlmICh2ZXJib3NlKSB7CisJCQkJY29uc3QgY2hhciAqZGVhZCA9ICIiOworCQkJCWlmICghV0lGRVhJVEVEKHN0YXR1cykgfHwgV0VYSVRTVEFUVVMoc3RhdHVzKSA+IDApCisJCQkJCWRlYWQgPSAiICh3aXRoIGVycm9yKSI7CisJCQkJaWYgKGxvZ19zeXNsb2cpCisJCQkJCXN5c2xvZyhMT0dfSU5GTywgIlslZF0gRGlzY29ubmVjdGVkJXMiLCBwaWQsIGRlYWQpOworCQkJCWVsc2UKKwkJCQkJZnByaW50ZihzdGRlcnIsICJbJWRdIERpc2Nvbm5lY3RlZCVzXG4iLCBwaWQsIGRlYWQpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNldF9yZXVzZV9hZGRyKGludCBzb2NrZmQpCit7CisJaW50IG9uID0gMTsKKworCWlmICghcmV1c2VhZGRyKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKwkJCSAgJm9uLCBzaXplb2Yob24pKTsKK30KKworI2lmbmRlZiBOT19JUFY2CisKK3N0YXRpYyBpbnQgc29ja3NldHVwKGludCBwb3J0LCBpbnQgKipzb2NrbGlzdF9wKQoreworCWludCBzb2NrbnVtID0gMCwgKnNvY2tsaXN0ID0gTlVMTDsKKwlpbnQgbWF4ZmQgPSAtMTsKKwljaGFyIHBidWZbTklfTUFYU0VSVl07CisKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICphaTAsICphaTsKKwlpbnQgZ2FpOworCisJc3ByaW50ZihwYnVmLCAiJWQiLCBwb3J0KTsKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50cy5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworCWhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKworCWdhaSA9IGdldGFkZHJpbmZvKE5VTEwsIHBidWYsICZoaW50cywgJmFpMCk7CisJaWYgKGdhaSkKKwkJZGllKCJnZXRhZGRyaW5mbygpIGZhaWxlZDogJXNcbiIsIGdhaV9zdHJlcnJvcihnYWkpKTsKKworCWZvciAoYWkgPSBhaTA7IGFpOyBhaSA9IGFpLT5haV9uZXh0KSB7CisJCWludCBzb2NrZmQ7CisJCWludCAqbmV3bGlzdDsKKworCQlzb2NrZmQgPSBzb2NrZXQoYWktPmFpX2ZhbWlseSwgYWktPmFpX3NvY2t0eXBlLCBhaS0+YWlfcHJvdG9jb2wpOworCQlpZiAoc29ja2ZkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc29ja2ZkID49IEZEX1NFVFNJWkUpIHsKKwkJCWVycm9yKCJ0b28gbGFyZ2Ugc29ja2V0IGRlc2NyaXB0b3IuIik7CisJCQljbG9zZShzb2NrZmQpOworCQkJY29udGludWU7CisJCX0KKworI2lmZGVmIElQVjZfVjZPTkxZCisJCWlmIChhaS0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlpbnQgb24gPSAxOworCQkJc2V0c29ja29wdChzb2NrZmQsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksCisJCQkJICAgJm9uLCBzaXplb2Yob24pKTsKKwkJCS8qIE5vdGU6IGVycm9yIGlzIG5vdCBmYXRhbCAqLworCQl9CisjZW5kaWYKKworCQlpZiAoc2V0X3JldXNlX2FkZHIoc29ja2ZkKSkgeworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGJpbmQoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworCQkJY2xvc2Uoc29ja2ZkKTsKKwkJCWNvbnRpbnVlOwkvKiBub3QgZmF0YWwgKi8KKwkJfQorCQlpZiAobGlzdGVuKHNvY2tmZCwgNSkgPCAwKSB7CisJCQljbG9zZShzb2NrZmQpOworCQkJY29udGludWU7CS8qIG5vdCBmYXRhbCAqLworCQl9CisKKwkJbmV3bGlzdCA9IHJlYWxsb2Moc29ja2xpc3QsIHNpemVvZihpbnQpICogKHNvY2tudW0gKyAxKSk7CisJCWlmICghbmV3bGlzdCkKKwkJCWRpZSgibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJc29ja2xpc3QgPSBuZXdsaXN0OworCQlzb2NrbGlzdFtzb2NrbnVtKytdID0gc29ja2ZkOworCisJCWlmIChtYXhmZCA8IHNvY2tmZCkKKwkJCW1heGZkID0gc29ja2ZkOworCX0KKworCWZyZWVhZGRyaW5mbyhhaTApOworCisJKnNvY2tsaXN0X3AgPSBzb2NrbGlzdDsKKwlyZXR1cm4gc29ja251bTsKK30KKworI2Vsc2UgLyogTk9fSVBWNiAqLworCitzdGF0aWMgaW50IHNvY2tzZXR1cChpbnQgcG9ydCwgaW50ICoqc29ja2xpc3RfcCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCWludCBzb2NrZmQ7CisKKwlzb2NrZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOworCWlmIChzb2NrZmQgPCAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Ygc2luKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworCXNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCisJaWYgKHNldF9yZXVzZV9hZGRyKHNvY2tmZCkpIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCBiaW5kKHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZiBzaW4pIDwgMCApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGxpc3Rlbihzb2NrZmQsIDUpIDwgMCkgeworCQljbG9zZShzb2NrZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkqc29ja2xpc3RfcCA9IHhtYWxsb2Moc2l6ZW9mKGludCkpOworCSoqc29ja2xpc3RfcCA9IHNvY2tmZDsKKwlyZXR1cm4gMTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgc2VydmljZV9sb29wKGludCBzb2NrbnVtLCBpbnQgKnNvY2tsaXN0KQoreworCXN0cnVjdCBwb2xsZmQgKnBmZDsKKwlpbnQgaTsKKworCXBmZCA9IHhjYWxsb2Moc29ja251bSwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBzb2NrbnVtOyBpKyspIHsKKwkJcGZkW2ldLmZkID0gc29ja2xpc3RbaV07CisJCXBmZFtpXS5ldmVudHMgPSBQT0xMSU47CisJfQorCisJc2lnbmFsKFNJR0NITEQsIGNoaWxkX2hhbmRsZXIpOworCisJZm9yICg7OykgeworCQlpbnQgaTsKKworCQlpZiAocG9sbChwZmQsIHNvY2tudW0sIC0xKSA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikgeworCQkJCWVycm9yKCJwb2xsIGZhaWxlZCwgcmVzdW1pbmc6ICVzIiwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCXNsZWVwKDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgc29ja251bTsgaSsrKSB7CisJCQlpZiAocGZkW2ldLnJldmVudHMgJiBQT0xMSU4pIHsKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzczsKKwkJCQl1bnNpZ25lZCBpbnQgc3NsZW4gPSBzaXplb2Yoc3MpOworCQkJCWludCBpbmNvbWluZyA9IGFjY2VwdChwZmRbaV0uZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3MsICZzc2xlbik7CisJCQkJaWYgKGluY29taW5nIDwgMCkgeworCQkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJCWNhc2UgRUFHQUlOOgorCQkJCQljYXNlIEVJTlRSOgorCQkJCQljYXNlIEVDT05OQUJPUlRFRDoKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkZWZhdWx0OgorCQkJCQkJZGllKCJhY2NlcHQgcmV0dXJuZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCQl9CisJCQkJfQorCQkJCWhhbmRsZShpbmNvbWluZywgKHN0cnVjdCBzb2NrYWRkciAqKSZzcywgc3NsZW4pOworCQkJfQorCQl9CisJfQorfQorCisvKiBpZiBhbnkgc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9yIGlzIG1pc3Npbmcgb3BlbiBpdCB0byAvZGV2L251bGwgKi8KK3N0YXRpYyB2b2lkIHNhbml0aXplX3N0ZGZkcyh2b2lkKQoreworCWludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUiwgMCk7CisJd2hpbGUgKGZkICE9IC0xICYmIGZkIDwgMikKKwkJZmQgPSBkdXAoZmQpOworCWlmIChmZCA9PSAtMSkKKwkJZGllKCJvcGVuIC9kZXYvbnVsbCBvciBkdXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGZkID4gMikKKwkJY2xvc2UoZmQpOworfQorCitzdGF0aWMgdm9pZCBkYWVtb25pemUodm9pZCkKK3sKKwlzd2l0Y2ggKGZvcmsoKSkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCWRpZSgiZm9yayBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZGVmYXVsdDoKKwkJCWV4aXQoMCk7CisJfQorCWlmIChzZXRzaWQoKSA9PSAtMSkKKwkJZGllKCJzZXRzaWQgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJY2xvc2UoMCk7CisJY2xvc2UoMSk7CisJY2xvc2UoMik7CisJc2FuaXRpemVfc3RkZmRzKCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX3BpZChjb25zdCBjaGFyICpwYXRoKQoreworCUZJTEUgKmYgPSBmb3BlbihwYXRoLCAidyIpOworCWlmICghZikKKwkJZGllKCJjYW5ub3Qgb3BlbiBwaWQgZmlsZSAlczogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworCWZwcmludGYoZiwgIiVkXG4iLCBnZXRwaWQoKSk7CisJZmNsb3NlKGYpOworfQorCitzdGF0aWMgaW50IHNlcnZlKGludCBwb3J0KQoreworCWludCBzb2NrbnVtLCAqc29ja2xpc3Q7CisKKwlzb2NrbnVtID0gc29ja3NldHVwKHBvcnQsICZzb2NrbGlzdCk7CisJaWYgKHNvY2tudW0gPT0gMCkKKwkJZGllKCJ1bmFibGUgdG8gYWxsb2NhdGUgYW55IGxpc3RlbiBzb2NrZXRzIG9uIHBvcnQgJXUiLCBwb3J0KTsKKworCXJldHVybiBzZXJ2aWNlX2xvb3Aoc29ja251bSwgc29ja2xpc3QpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHBvcnQgPSBERUZBVUxUX0dJVF9QT1JUOworCWludCBpbmV0ZF9tb2RlID0gMDsKKwljb25zdCBjaGFyICpwaWRfZmlsZSA9IE5VTEw7CisJaW50IGRldGFjaCA9IDA7CisJaW50IGk7CisKKwkvKiBXaXRob3V0IHRoaXMgd2UgY2Fubm90IHJlbHkgb24gd2FpdHBpZCgpIHRvIHRlbGwKKwkgKiB3aGF0IGhhcHBlbmVkIHRvIG91ciBjaGlsZHJlbi4KKwkgKi8KKwlzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tcG9ydD0iLCA3KSkgeworCQkJY2hhciAqZW5kOworCQkJdW5zaWduZWQgbG9uZyBuOworCQkJbiA9IHN0cnRvdWwoYXJnKzcsICZlbmQsIDApOworCQkJaWYgKGFyZ1s3XSAmJiAhKmVuZCkgeworCQkJCXBvcnQgPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0taW5ldGQiKSkgeworCQkJaW5ldGRfbW9kZSA9IDE7CisJCQlsb2dfc3lzbG9nID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tc3lzbG9nIikpIHsKKwkJCWxvZ19zeXNsb2cgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1leHBvcnQtYWxsIikpIHsKKwkJCWV4cG9ydF9hbGxfdHJlZXMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tdGltZW91dD0iLCAxMCkpIHsKKwkJCXRpbWVvdXQgPSBhdG9pKGFyZysxMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1pbml0LXRpbWVvdXQ9IiwgMTUpKSB7CisJCQlpbml0X3RpbWVvdXQgPSBhdG9pKGFyZysxNSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0cmljdC1wYXRocyIpKSB7CisJCQlzdHJpY3RfcGF0aHMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tYmFzZS1wYXRoPSIsIDEyKSkgeworCQkJYmFzZV9wYXRoID0gYXJnKzEyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZXVzZWFkZHIiKSkgeworCQkJcmV1c2VhZGRyID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdXNlci1wYXRoIikpIHsKKwkJCXVzZXJfcGF0aCA9ICIiOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJuY21wKGFyZywgIi0tdXNlci1wYXRoPSIsIDEyKSkgeworCQkJdXNlcl9wYXRoID0gYXJnICsgMTI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1waWQtZmlsZT0iLCAxMSkpIHsKKwkJCXBpZF9maWxlID0gYXJnICsgMTE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWRldGFjaCIpKSB7CisJCQlkZXRhY2ggPSAxOworCQkJbG9nX3N5c2xvZyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLSIpKSB7CisJCQlva19wYXRocyA9ICZhcmd2W2krMV07CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChhcmdbMF0gIT0gJy0nKSB7CisJCQlva19wYXRocyA9ICZhcmd2W2ldOworCQkJYnJlYWs7CisJCX0KKworCQl1c2FnZShkYWVtb25fdXNhZ2UpOworCX0KKworCWlmIChsb2dfc3lzbG9nKSB7CisJCW9wZW5sb2coImdpdC1kYWVtb24iLCAwLCBMT0dfREFFTU9OKTsKKwkJc2V0X2RpZV9yb3V0aW5lKGRhZW1vbl9kaWUpOworCX0KKworCWlmIChzdHJpY3RfcGF0aHMgJiYgKCFva19wYXRocyB8fCAhKm9rX3BhdGhzKSkKKwkJZGllKCJvcHRpb24gLS1zdHJpY3QtcGF0aHMgcmVxdWlyZXMgYSB3aGl0ZWxpc3QiKTsKKworCWlmIChpbmV0ZF9tb2RlKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOworCQlzdHJ1Y3Qgc29ja2FkZHIgKnBlZXIgPSAoc3RydWN0IHNvY2thZGRyICopJnNzOworCQlzb2NrbGVuX3Qgc2xlbiA9IHNpemVvZihzcyk7CisKKwkJZnJlb3BlbigiL2Rldi9udWxsIiwgInciLCBzdGRlcnIpOworCisJCWlmIChnZXRwZWVybmFtZSgwLCBwZWVyLCAmc2xlbikpCisJCQlwZWVyID0gTlVMTDsKKworCQlyZXR1cm4gZXhlY3V0ZShwZWVyKTsKKwl9CisKKwlpZiAoZGV0YWNoKQorCQlkYWVtb25pemUoKTsKKwllbHNlCisJCXNhbml0aXplX3N0ZGZkcygpOworCisJaWYgKHBpZF9maWxlKQorCQlzdG9yZV9waWQocGlkX2ZpbGUpOworCisJcmV0dXJuIHNlcnZlKHBvcnQpOworfQpkaWZmIC0tZ2l0IGEvZGF0ZS5jIGIvZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmUyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kYXRlLmMKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIHRpbWVfdCBteV9ta3RpbWUoc3RydWN0IHRtICp0bSkKK3sKKwlzdGF0aWMgY29uc3QgaW50IG1kYXlzW10gPSB7CisJICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CisJfTsKKwlpbnQgeWVhciA9IHRtLT50bV95ZWFyIC0gNzA7CisJaW50IG1vbnRoID0gdG0tPnRtX21vbjsKKwlpbnQgZGF5ID0gdG0tPnRtX21kYXk7CisKKwlpZiAoeWVhciA8IDAgfHwgeWVhciA+IDEyOSkgLyogYWxnbyBvbmx5IHdvcmtzIGZvciAxOTcwLTIwOTkgKi8KKwkJcmV0dXJuIC0xOworCWlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkgLyogYXJyYXkgYm91bmRzICovCisJCXJldHVybiAtMTsKKwlpZiAobW9udGggPCAyIHx8ICh5ZWFyICsgMikgJSA0KQorCQlkYXktLTsKKwlyZXR1cm4gKHllYXIgKiAzNjUgKyAoeWVhciArIDEpIC8gNCArIG1kYXlzW21vbnRoXSArIGRheSkgKiAyNCo2MCo2MFVMICsKKwkJdG0tPnRtX2hvdXIgKiA2MCo2MCArIHRtLT50bV9taW4gKiA2MCArIHRtLT50bV9zZWM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptb250aF9uYW1lc1tdID0geworCSJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKKwkiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqd2Vla2RheV9uYW1lc1tdID0geworCSJTdW5kYXlzIiwgIk1vbmRheXMiLCAiVHVlc2RheXMiLCAiV2VkbmVzZGF5cyIsICJUaHVyc2RheXMiLCAiRnJpZGF5cyIsICJTYXR1cmRheXMiCit9OworCisvKgorICogVGhlICJ0eiIgdGhpbmcgaXMgcGFzc2VkIGluIGFzIHRoaXMgc3RyYW5nZSAiZGVjaW1hbCBwYXJzZSBvZiB0eiIKKyAqIHRoaW5nLCB3aGljaCBtZWFucyB0aGF0IHR6IC0wMTAwIGlzIHBhc3NlZCBpbiBhcyB0aGUgaW50ZWdlciAtMTAwLAorICogZXZlbiB0aG91Z2ggaXQgbWVhbnMgInNpeHR5IG1pbnV0ZXMgb2ZmIgorICovCitzdGF0aWMgc3RydWN0IHRtICp0aW1lX3RvX3RtKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXRpbWVfdCB0OworCWludCBtaW51dGVzOworCisJbWludXRlcyA9IHR6IDwgMCA/IC10eiA6IHR6OworCW1pbnV0ZXMgPSAobWludXRlcyAvIDEwMCkqNjAgKyAobWludXRlcyAlIDEwMCk7CisJbWludXRlcyA9IHR6IDwgMCA/IC1taW51dGVzIDogbWludXRlczsKKwl0ID0gdGltZSArIG1pbnV0ZXMgKiA2MDsKKwlyZXR1cm4gZ210aW1lKCZ0KTsKK30KKworY29uc3QgY2hhciAqc2hvd19kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXN0cnVjdCB0bSAqdG07CisJc3RhdGljIGNoYXIgdGltZWJ1ZlsyMDBdOworCisJdG0gPSB0aW1lX3RvX3RtKHRpbWUsIHR6KTsKKwlpZiAoIXRtKQorCQlyZXR1cm4gTlVMTDsKKwlzcHJpbnRmKHRpbWVidWYsICIlLjNzICUuM3MgJWQgJTAyZDolMDJkOiUwMmQgJWQgJSswNWQiLAorCQl3ZWVrZGF5X25hbWVzW3RtLT50bV93ZGF5XSwKKwkJbW9udGhfbmFtZXNbdG0tPnRtX21vbl0sCisJCXRtLT50bV9tZGF5LAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywKKwkJdG0tPnRtX3llYXIgKyAxOTAwLCB0eik7CisJcmV0dXJuIHRpbWVidWY7Cit9CisKK2NvbnN0IGNoYXIgKnNob3dfcmZjMjgyMl9kYXRlKHVuc2lnbmVkIGxvbmcgdGltZSwgaW50IHR6KQoreworCXN0cnVjdCB0bSAqdG07CisJc3RhdGljIGNoYXIgdGltZWJ1ZlsyMDBdOworCisJdG0gPSB0aW1lX3RvX3RtKHRpbWUsIHR6KTsKKwlpZiAoIXRtKQorCQlyZXR1cm4gTlVMTDsKKwlzcHJpbnRmKHRpbWVidWYsICIlLjNzLCAlZCAlLjNzICVkICUwMmQ6JTAyZDolMDJkICUrMDVkIiwKKwkJd2Vla2RheV9uYW1lc1t0bS0+dG1fd2RheV0sIHRtLT50bV9tZGF5LAorCQltb250aF9uYW1lc1t0bS0+dG1fbW9uXSwgdG0tPnRtX3llYXIgKyAxOTAwLAorCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywgdHopOworCXJldHVybiB0aW1lYnVmOworfQorCisvKgorICogQ2hlY2sgdGhlc2UuIEFuZCBub3RlIGhvdyBpdCBkb2Vzbid0IGRvIHRoZSBzdW1tZXItdGltZSBjb252ZXJzaW9uLgorICoKKyAqIEluIG15IHdvcmxkLCBpdCdzIGFsd2F5cyBzdW1tZXIsIGFuZCB0aGluZ3MgYXJlIHByb2JhYmx5IGEgYml0IG9mZgorICogaW4gb3RoZXIgd2F5cyB0b28uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IG9mZnNldDsKKwlpbnQgZHN0OworfSB0aW1lem9uZV9uYW1lc1tdID0geworCXsgIklETFciLCAtMTIsIDAsIH0sCS8qIEludGVybmF0aW9uYWwgRGF0ZSBMaW5lIFdlc3QgKi8KKwl7ICJOVCIsICAgLTExLCAwLCB9LAkvKiBOb21lICovCisJeyAiQ0FUIiwgIC0xMCwgMCwgfSwJLyogQ2VudHJhbCBBbGFza2EgKi8KKwl7ICJIU1QiLCAgLTEwLCAwLCB9LAkvKiBIYXdhaWkgU3RhbmRhcmQgKi8KKwl7ICJIRFQiLCAgLTEwLCAxLCB9LAkvKiBIYXdhaWkgRGF5bGlnaHQgKi8KKwl7ICJZU1QiLCAgIC05LCAwLCB9LAkvKiBZdWtvbiBTdGFuZGFyZCAqLworCXsgIllEVCIsICAgLTksIDEsIH0sCS8qIFl1a29uIERheWxpZ2h0ICovCisJeyAiUFNUIiwgICAtOCwgMCwgfSwJLyogUGFjaWZpYyBTdGFuZGFyZCAqLworCXsgIlBEVCIsICAgLTgsIDEsIH0sCS8qIFBhY2lmaWMgRGF5bGlnaHQgKi8KKwl7ICJNU1QiLCAgIC03LCAwLCB9LAkvKiBNb3VudGFpbiBTdGFuZGFyZCAqLworCXsgIk1EVCIsICAgLTcsIDEsIH0sCS8qIE1vdW50YWluIERheWxpZ2h0ICovCisJeyAiQ1NUIiwgICAtNiwgMCwgfSwJLyogQ2VudHJhbCBTdGFuZGFyZCAqLworCXsgIkNEVCIsICAgLTYsIDEsIH0sCS8qIENlbnRyYWwgRGF5bGlnaHQgKi8KKwl7ICJFU1QiLCAgIC01LCAwLCB9LAkvKiBFYXN0ZXJuIFN0YW5kYXJkICovCisJeyAiRURUIiwgICAtNSwgMSwgfSwJLyogRWFzdGVybiBEYXlsaWdodCAqLworCXsgIkFTVCIsICAgLTMsIDAsIH0sCS8qIEF0bGFudGljIFN0YW5kYXJkICovCisJeyAiQURUIiwgICAtMywgMSwgfSwJLyogQXRsYW50aWMgRGF5bGlnaHQgKi8KKwl7ICJXQVQiLCAgIC0xLCAwLCB9LAkvKiBXZXN0IEFmcmljYSAqLworCisJeyAiR01UIiwgICAgMCwgMCwgfSwJLyogR3JlZW53aWNoIE1lYW4gKi8KKwl7ICJVVEMiLCAgICAwLCAwLCB9LAkvKiBVbml2ZXJzYWwgKENvb3JkaW5hdGVkKSAqLworCisJeyAiV0VUIiwgICAgMCwgMCwgfSwJLyogV2VzdGVybiBFdXJvcGVhbiAqLworCXsgIkJTVCIsICAgIDAsIDEsIH0sCS8qIEJyaXRpc2ggU3VtbWVyICovCisJeyAiQ0VUIiwgICArMSwgMCwgfSwJLyogQ2VudHJhbCBFdXJvcGVhbiAqLworCXsgIk1FVCIsICAgKzEsIDAsIH0sCS8qIE1pZGRsZSBFdXJvcGVhbiAqLworCXsgIk1FV1QiLCAgKzEsIDAsIH0sCS8qIE1pZGRsZSBFdXJvcGVhbiBXaW50ZXIgKi8KKwl7ICJNRVNUIiwgICsxLCAxLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiQ0VTVCIsICArMSwgMSwgfSwJLyogQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgKi8KKwl7ICJNRVNaIiwgICsxLCAxLCB9LAkvKiBNaWRkbGUgRXVyb3BlYW4gU3VtbWVyICovCisJeyAiRldUIiwgICArMSwgMCwgfSwJLyogRnJlbmNoIFdpbnRlciAqLworCXsgIkZTVCIsICAgKzEsIDEsIH0sCS8qIEZyZW5jaCBTdW1tZXIgKi8KKwl7ICJFRVQiLCAgICsyLCAwLCB9LAkvKiBFYXN0ZXJuIEV1cm9wZSwgVVNTUiBab25lIDEgKi8KKwl7ICJFRVNUIiwgICsyLCAxLCB9LAkvKiBFYXN0ZXJuIEV1cm9wZWFuIERheWxpZ2h0ICovCisJeyAiV0FTVCIsICArNywgMCwgfSwJLyogV2VzdCBBdXN0cmFsaWFuIFN0YW5kYXJkICovCisJeyAiV0FEVCIsICArNywgMSwgfSwJLyogV2VzdCBBdXN0cmFsaWFuIERheWxpZ2h0ICovCisJeyAiQ0NUIiwgICArOCwgMCwgfSwJLyogQ2hpbmEgQ29hc3QsIFVTU1IgWm9uZSA3ICovCisJeyAiSlNUIiwgICArOSwgMCwgfSwJLyogSmFwYW4gU3RhbmRhcmQsIFVTU1IgWm9uZSA4ICovCisJeyAiRUFTVCIsICsxMCwgMCwgfSwJLyogRWFzdGVybiBBdXN0cmFsaWFuIFN0YW5kYXJkICovCisJeyAiRUFEVCIsICsxMCwgMSwgfSwJLyogRWFzdGVybiBBdXN0cmFsaWFuIERheWxpZ2h0ICovCisJeyAiR1NUIiwgICsxMCwgMCwgfSwJLyogR3VhbSBTdGFuZGFyZCwgVVNTUiBab25lIDkgKi8KKwl7ICJOWlQiLCAgKzExLCAwLCB9LAkvKiBOZXcgWmVhbGFuZCAqLworCXsgIk5aU1QiLCArMTEsIDAsIH0sCS8qIE5ldyBaZWFsYW5kIFN0YW5kYXJkICovCisJeyAiTlpEVCIsICsxMSwgMSwgfSwJLyogTmV3IFplYWxhbmQgRGF5bGlnaHQgKi8KKwl7ICJJRExFIiwgKzEyLCAwLCB9LAkvKiBJbnRlcm5hdGlvbmFsIERhdGUgTGluZSBFYXN0ICovCit9OworCitzdGF0aWMgaW50IG1hdGNoX3N0cmluZyhjb25zdCBjaGFyICpkYXRlLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgKmRhdGU7IGRhdGUrKywgc3RyKyssIGkrKykgeworCQlpZiAoKmRhdGUgPT0gKnN0cikKKwkJCWNvbnRpbnVlOworCQlpZiAodG91cHBlcigqZGF0ZSkgPT0gdG91cHBlcigqc3RyKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWlzYWxudW0oKmRhdGUpKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBza2lwX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUpCit7CisJaW50IGkgPSAwOworCWRvIHsKKwkJaSsrOworCX0gd2hpbGUgKGlzYWxwaGEoZGF0ZVtpXSkpOworCXJldHVybiBpOworfQorCisvKgorKiBQYXJzZSBtb250aCwgd2Vla2RheSwgb3IgdGltZXpvbmUgbmFtZQorKi8KK3N0YXRpYyBpbnQgbWF0Y2hfYWxwaGEoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpvZmZzZXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgbW9udGhfbmFtZXNbaV0pOworCQlpZiAobWF0Y2ggPj0gMykgeworCQkJdG0tPnRtX21vbiA9IGk7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB3ZWVrZGF5X25hbWVzW2ldKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCXRtLT50bV93ZGF5ID0gaTsKKwkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRpbWV6b25lX25hbWVzKTsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCB0aW1lem9uZV9uYW1lc1tpXS5uYW1lKTsKKwkJaWYgKG1hdGNoID49IDMpIHsKKwkJCWludCBvZmYgPSB0aW1lem9uZV9uYW1lc1tpXS5vZmZzZXQ7CisKKwkJCS8qIFRoaXMgaXMgYm9ndXMsIGJ1dCB3ZSBsaWtlIHN1bW1lciAqLworCQkJb2ZmICs9IHRpbWV6b25lX25hbWVzW2ldLmRzdDsKKworCQkJLyogT25seSB1c2UgdGhlIHR6IG5hbWUgb2Zmc2V0IGlmIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgYmV0dGVyICovCisJCQlpZiAoKm9mZnNldCA9PSAtMSkKKwkJCQkqb2Zmc2V0ID0gNjAqb2ZmOworCisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJQTSIpID09IDIpIHsKKwkJaWYgKHRtLT50bV9ob3VyID4gMCAmJiB0bS0+dG1faG91ciA8IDEyKQorCQkJdG0tPnRtX2hvdXIgKz0gMTI7CisJCXJldHVybiAyOworCX0KKworCS8qIEJBRCBDUkFQICovCisJcmV0dXJuIHNraXBfYWxwaGEoZGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBzdHJ1Y3QgdG0gKm5vd190bSwgdGltZV90IG5vdywgc3RydWN0IHRtICp0bSkKK3sKKwlpZiAobW9udGggPiAwICYmIG1vbnRoIDwgMTMgJiYgZGF5ID4gMCAmJiBkYXkgPCAzMikgeworCQlzdHJ1Y3QgdG0gY2hlY2sgPSAqdG07CisJCXN0cnVjdCB0bSAqciA9IChub3dfdG0gPyAmY2hlY2sgOiB0bSk7CisJCXRpbWVfdCBzcGVjaWZpZWQ7CisKKwkJci0+dG1fbW9uID0gbW9udGggLSAxOworCQlyLT50bV9tZGF5ID0gZGF5OworCQlpZiAoeWVhciA9PSAtMSkgeworCQkJaWYgKCFub3dfdG0pCisJCQkJcmV0dXJuIDE7CisJCQlyLT50bV95ZWFyID0gbm93X3RtLT50bV95ZWFyOworCQl9CisJCWVsc2UgaWYgKHllYXIgPj0gMTk3MCAmJiB5ZWFyIDwgMjEwMCkKKwkJCXItPnRtX3llYXIgPSB5ZWFyIC0gMTkwMDsKKwkJZWxzZSBpZiAoeWVhciA+IDcwICYmIHllYXIgPCAxMDApCisJCQlyLT50bV95ZWFyID0geWVhcjsKKwkJZWxzZSBpZiAoeWVhciA8IDM4KQorCQkJci0+dG1feWVhciA9IHllYXIgKyAxMDA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCQlpZiAoIW5vd190bSkKKwkJCXJldHVybiAxOworCisJCXNwZWNpZmllZCA9IG15X21rdGltZShyKTsKKworCQkvKiBCZSBpdCBjb21taXQgdGltZSBvciBhdXRob3IgdGltZSwgaXQgZG9lcyBub3QgbWFrZQorCQkgKiBzZW5zZSB0byBzcGVjaWZ5IHRpbWVzdGFtcCB3YXkgaW50byB0aGUgZnV0dXJlLiAgTWFrZQorCQkgKiBzdXJlIGl0IGlzIG5vdCBsYXRlciB0aGFuIHRlbiBkYXlzIGZyb20gbm93Li4uCisJCSAqLworCQlpZiAobm93ICsgMTAqMjQqMzYwMCA8IHNwZWNpZmllZCkKKwkJCXJldHVybiAwOworCQl0bS0+dG1fbW9uID0gci0+dG1fbW9uOworCQl0bS0+dG1fbWRheSA9IHItPnRtX21kYXk7CisJCWlmICh5ZWFyICE9IC0xKQorCQkJdG0tPnRtX3llYXIgPSByLT50bV95ZWFyOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfbXVsdGlfbnVtYmVyKHVuc2lnbmVkIGxvbmcgbnVtLCBjaGFyIGMsIGNvbnN0IGNoYXIgKmRhdGUsIGNoYXIgKmVuZCwgc3RydWN0IHRtICp0bSkKK3sKKwl0aW1lX3Qgbm93OworCXN0cnVjdCB0bSBub3dfdG07CisJc3RydWN0IHRtICpyZWZ1c2VfZnV0dXJlOworCWxvbmcgbnVtMiwgbnVtMzsKKworCW51bTIgPSBzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKwludW0zID0gLTE7CisJaWYgKCplbmQgPT0gYyAmJiBpc2RpZ2l0KGVuZFsxXSkpCisJCW51bTMgPSBzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKworCS8qIFRpbWU/IERhdGU/ICovCisJc3dpdGNoIChjKSB7CisJY2FzZSAnOic6CisJCWlmIChudW0zIDwgMCkKKwkJCW51bTMgPSAwOworCQlpZiAobnVtIDwgMjUgJiYgbnVtMiA+PSAwICYmIG51bTIgPCA2MCAmJiBudW0zID49IDAgJiYgbnVtMyA8PSA2MCkgeworCQkJdG0tPnRtX2hvdXIgPSBudW07CisJCQl0bS0+dG1fbWluID0gbnVtMjsKKwkJCXRtLT50bV9zZWMgPSBudW0zOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlICctJzoKKwljYXNlICcvJzoKKwljYXNlICcuJzoKKwkJbm93ID0gdGltZShOVUxMKTsKKwkJcmVmdXNlX2Z1dHVyZSA9IE5VTEw7CisJCWlmIChnbXRpbWVfcigmbm93LCAmbm93X3RtKSkKKwkJCXJlZnVzZV9mdXR1cmUgPSAmbm93X3RtOworCisJCWlmIChudW0gPiA3MCkgeworCQkJLyogeXl5eS1tbS1kZD8gKi8KKwkJCWlmIChpc19kYXRlKG51bSwgbnVtMiwgbnVtMywgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQkJYnJlYWs7CisJCQkvKiB5eXl5LWRkLW1tPyAqLworCQkJaWYgKGlzX2RhdGUobnVtLCBudW0zLCBudW0yLCByZWZ1c2VfZnV0dXJlLCBub3csIHRtKSkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBPdXIgZWFzdGVybiBFdXJvcGVhbiBmcmllbmRzIHNheSBkZC5tbS55eVt5eV0KKwkJICogaXMgdGhlIG5vcm0gdGhlcmUsIHNvIGdpdmluZyBwcmVjZWRlbmNlIHRvCisJCSAqIG1tL2RkL3l5W3l5XSBmb3JtIG9ubHkgd2hlbiBzZXBhcmF0b3IgaXMgbm90ICcuJworCQkgKi8KKwkJaWYgKGMgIT0gJy4nICYmCisJCSAgICBpc19kYXRlKG51bTMsIG51bSwgbnVtMiwgcmVmdXNlX2Z1dHVyZSwgbm93LCB0bSkpCisJCQlicmVhazsKKwkJLyogRXVyb3BlYW4gZGQubW0ueXlbeXldIG9yIGZ1bm55IFVTIGRkL21tL3l5W3l5XSAqLworCQlpZiAoaXNfZGF0ZShudW0zLCBudW0yLCBudW0sIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJYnJlYWs7CisJCS8qIEZ1bm55IEV1cm9wZWFuIG1tLmRkLnl5ICovCisJCWlmIChjID09ICcuJyAmJgorCQkgICAgaXNfZGF0ZShudW0zLCBudW0sIG51bTIsIHJlZnVzZV9mdXR1cmUsIG5vdywgdG0pKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZW5kIC0gZGF0ZTsKK30KKworLyoKKyAqIFdlJ3ZlIHNlZW4gYSBkaWdpdC4gVGltZT8gWWVhcj8gRGF0ZT8gCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfZGlnaXQoY29uc3QgY2hhciAqZGF0ZSwgc3RydWN0IHRtICp0bSwgaW50ICpvZmZzZXQsIGludCAqdG1fZ210KQoreworCWludCBuOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIG51bTsKKworCW51bSA9IHN0cnRvdWwoZGF0ZSwgJmVuZCwgMTApOworCisJLyoKKwkgKiBTZWNvbmRzIHNpbmNlIDE5NzA/IFdlIHRyaWdnZXIgb24gdGhhdCBmb3IgYW55dGhpbmcgYWZ0ZXIgSmFuIDEsIDIwMDAKKwkgKi8KKwlpZiAobnVtID4gOTQ2Njg0ODAwKSB7CisJCXRpbWVfdCB0aW1lID0gbnVtOworCQlpZiAoZ210aW1lX3IoJnRpbWUsIHRtKSkgeworCQkJKnRtX2dtdCA9IDE7CisJCQlyZXR1cm4gZW5kIC0gZGF0ZTsKKwkJfQorCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHNwZWNpYWwgZm9ybWF0czogbnVtWy0uOi9dbnVtW3NhbWVdbnVtCisJICovCisJc3dpdGNoICgqZW5kKSB7CisJY2FzZSAnOic6CisJY2FzZSAnLic6CisJY2FzZSAnLyc6CisJY2FzZSAnLSc6CisJCWlmIChpc2RpZ2l0KGVuZFsxXSkpIHsKKwkJCWludCBtYXRjaCA9IG1hdGNoX211bHRpX251bWJlcihudW0sICplbmQsIGRhdGUsIGVuZCwgdG0pOworCQkJaWYgKG1hdGNoKQorCQkJCXJldHVybiBtYXRjaDsKKwkJfQorCX0KKworCS8qCisJICogTm9uZSBvZiB0aGUgc3BlY2lhbCBmb3JtYXRzPyBUcnkgdG8gZ3Vlc3Mgd2hhdAorCSAqIHRoZSBudW1iZXIgbWVhbnQuIFdlIHVzZSB0aGUgbnVtYmVyIG9mIGRpZ2l0cworCSAqIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkIGd1ZXNzLi4KKwkgKi8KKwluID0gMDsKKwlkbyB7CisJCW4rKzsKKwl9IHdoaWxlIChpc2RpZ2l0KGRhdGVbbl0pKTsKKworCS8qIEZvdXItZGlnaXQgeWVhciBvciBhIHRpbWV6b25lPyAqLworCWlmIChuID09IDQpIHsKKwkJaWYgKG51bSA8PSAxNDAwICYmICpvZmZzZXQgPT0gLTEpIHsKKwkJCXVuc2lnbmVkIGludCBtaW51dGVzID0gbnVtICUgMTAwOworCQkJdW5zaWduZWQgaW50IGhvdXJzID0gbnVtIC8gMTAwOworCQkJKm9mZnNldCA9IGhvdXJzKjYwICsgbWludXRlczsKKwkJfSBlbHNlIGlmIChudW0gPiAxOTAwICYmIG51bSA8IDIxMDApCisJCQl0bS0+dG1feWVhciA9IG51bSAtIDE5MDA7CisJCXJldHVybiBuOworCX0KKworCS8qCisJICogTk9URSEgV2Ugd2lsbCBnaXZlIHByZWNlZGVuY2UgdG8gZGF5LW9mLW1vbnRoIG92ZXIgbW9udGggb3IKKwkgKiB5ZWFyIG51bWJlcnMgaW4gdGhlIDEtMTIgcmFuZ2UuIFNvIDA1IGlzIGFsd2F5cyAibWRheSA1IiwKKwkgKiB1bmxlc3Mgd2UgYWxyZWFkeSBoYXZlIGEgbWRheS4uCisJICoKKwkgKiBJT1csIDAxIEFwciAwNSBwYXJzZXMgYXMgIkFwcmlsIDFzdCwgMjAwNSIuCisJICovCisJaWYgKG51bSA+IDAgJiYgbnVtIDwgMzIgJiYgdG0tPnRtX21kYXkgPCAwKSB7CisJCXRtLT50bV9tZGF5ID0gbnVtOworCQlyZXR1cm4gbjsKKwl9CisKKwkvKiBUd28tZGlnaXQgeWVhcj8gKi8KKwlpZiAobiA9PSAyICYmIHRtLT50bV95ZWFyIDwgMCkgeworCQlpZiAobnVtIDwgMTAgJiYgdG0tPnRtX21kYXkgPj0gMCkgeworCQkJdG0tPnRtX3llYXIgPSBudW0gKyAxMDA7CisJCQlyZXR1cm4gbjsKKwkJfQorCQlpZiAobnVtID49IDcwKSB7CisJCQl0bS0+dG1feWVhciA9IG51bTsKKwkJCXJldHVybiBuOworCQl9CisJfQorCisJaWYgKG51bSA+IDAgJiYgbnVtIDwgMzIpIHsKKwkJdG0tPnRtX21kYXkgPSBudW07CisJfSBlbHNlIGlmIChudW0gPiAxOTAwKSB7CisJCXRtLT50bV95ZWFyID0gbnVtIC0gMTkwMDsKKwl9IGVsc2UgaWYgKG51bSA+IDcwKSB7CisJCXRtLT50bV95ZWFyID0gbnVtOworCX0gZWxzZSBpZiAobnVtID4gMCAmJiBudW0gPCAxMykgeworCQl0bS0+dG1fbW9uID0gbnVtLTE7CisJfQorCQkKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBtYXRjaF90eihjb25zdCBjaGFyICpkYXRlLCBpbnQgKm9mZnApCit7CisJY2hhciAqZW5kOworCWludCBvZmZzZXQgPSBzdHJ0b3VsKGRhdGUrMSwgJmVuZCwgMTApOworCWludCBtaW4sIGhvdXI7CisJaW50IG4gPSBlbmQgLSBkYXRlIC0gMTsKKworCW1pbiA9IG9mZnNldCAlIDEwMDsKKwlob3VyID0gb2Zmc2V0IC8gMTAwOworCisJLyoKKwkgKiBEb24ndCBhY2NlcHQgYW55IHJhbmRvbSBjcmFwLi4gQXQgbGVhc3QgMyBkaWdpdHMsIGFuZAorCSAqIGEgdmFsaWQgbWludXRlLiBXZSBtaWdodCB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIG1pbnV0ZXMKKwkgKiBhcmUgZGl2aXNpYmxlIGJ5IDMwIG9yIHNvbWV0aGluZyB0b28uCisJICovCisJaWYgKG1pbiA8IDYwICYmIG4gPiAyKSB7CisJCW9mZnNldCA9IGhvdXIqNjArbWluOworCQlpZiAoKmRhdGUgPT0gJy0nKQorCQkJb2Zmc2V0ID0gLW9mZnNldDsKKworCQkqb2ZmcCA9IG9mZnNldDsKKwl9CisJcmV0dXJuIGVuZCAtIGRhdGU7Cit9CisKK3N0YXRpYyBpbnQgZGF0ZV9zdHJpbmcodW5zaWduZWQgbG9uZyBkYXRlLCBpbnQgb2Zmc2V0LCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IHNpZ24gPSAnKyc7CisKKwlpZiAob2Zmc2V0IDwgMCkgeworCQlvZmZzZXQgPSAtb2Zmc2V0OworCQlzaWduID0gJy0nOworCX0KKwlyZXR1cm4gc25wcmludGYoYnVmLCBsZW4sICIlbHUgJWMlMDJkJTAyZCIsIGRhdGUsIHNpZ24sIG9mZnNldCAvIDYwLCBvZmZzZXQgJSA2MCk7Cit9CisKKy8qIEdyLiBzdHJwdGltZSBpcyBjcmFwIGZvciB0aGlzOyBpdCBkb2Vzbid0IGhhdmUgYSB3YXkgdG8gcmVxdWlyZSBSRkMyODIyCisgICAoaS5lLiBFbmdsaXNoKSBkYXkvbW9udGggbmFtZXMsIGFuZCBpdCBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IHdpdGggJXouICovCitpbnQgcGFyc2VfZGF0ZShjb25zdCBjaGFyICpkYXRlLCBjaGFyICpyZXN1bHQsIGludCBtYXhsZW4pCit7CisJc3RydWN0IHRtIHRtOworCWludCBvZmZzZXQsIHRtX2dtdDsKKwl0aW1lX3QgdGhlbjsKKworCW1lbXNldCgmdG0sIDAsIHNpemVvZih0bSkpOworCXRtLnRtX3llYXIgPSAtMTsKKwl0bS50bV9tb24gPSAtMTsKKwl0bS50bV9tZGF5ID0gLTE7CisJdG0udG1faXNkc3QgPSAtMTsKKwlvZmZzZXQgPSAtMTsKKwl0bV9nbXQgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgbWF0Y2ggPSAwOworCQl1bnNpZ25lZCBjaGFyIGMgPSAqZGF0ZTsKKworCQkvKiBTdG9wIGF0IGVuZCBvZiBzdHJpbmcgb3IgbmV3bGluZSAqLworCQlpZiAoIWMgfHwgYyA9PSAnXG4nKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzYWxwaGEoYykpCisJCQltYXRjaCA9IG1hdGNoX2FscGhhKGRhdGUsICZ0bSwgJm9mZnNldCk7CisJCWVsc2UgaWYgKGlzZGlnaXQoYykpCisJCQltYXRjaCA9IG1hdGNoX2RpZ2l0KGRhdGUsICZ0bSwgJm9mZnNldCwgJnRtX2dtdCk7CisJCWVsc2UgaWYgKChjID09ICctJyB8fCBjID09ICcrJykgJiYgaXNkaWdpdChkYXRlWzFdKSkKKwkJCW1hdGNoID0gbWF0Y2hfdHooZGF0ZSwgJm9mZnNldCk7CisKKwkJaWYgKCFtYXRjaCkgeworCQkJLyogQkFEIENSQVAgKi8KKwkJCW1hdGNoID0gMTsKKwkJfQkKKworCQlkYXRlICs9IG1hdGNoOworCX0KKworCS8qIG1rdGltZSB1c2VzIGxvY2FsIHRpbWV6b25lICovCisJdGhlbiA9IG15X21rdGltZSgmdG0pOyAKKwlpZiAob2Zmc2V0ID09IC0xKQorCQlvZmZzZXQgPSAodGhlbiAtIG1rdGltZSgmdG0pKSAvIDYwOworCisJaWYgKHRoZW4gPT0gLTEpCisJCXJldHVybiAtMTsKKworCWlmICghdG1fZ210KQorCQl0aGVuIC09IG9mZnNldCAqIDYwOworCXJldHVybiBkYXRlX3N0cmluZyh0aGVuLCBvZmZzZXQsIHJlc3VsdCwgbWF4bGVuKTsKK30KKwordm9pZCBkYXRlc3RhbXAoY2hhciAqYnVmLCBpbnQgYnVmc2l6ZSkKK3sKKwl0aW1lX3Qgbm93OworCWludCBvZmZzZXQ7CisKKwl0aW1lKCZub3cpOworCisJb2Zmc2V0ID0gbXlfbWt0aW1lKGxvY2FsdGltZSgmbm93KSkgLSBub3c7CisJb2Zmc2V0IC89IDYwOworCisJZGF0ZV9zdHJpbmcobm93LCBvZmZzZXQsIGJ1ZiwgYnVmc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90bShzdHJ1Y3QgdG0gKnRtLCB1bnNpZ25lZCBsb25nIHNlYykKK3sKKwl0aW1lX3QgbiA9IG1rdGltZSh0bSkgLSBzZWM7CisJbG9jYWx0aW1lX3IoJm4sIHRtKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV95ZXN0ZXJkYXkoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJdXBkYXRlX3RtKHRtLCAyNCo2MCo2MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfdGltZShzdHJ1Y3QgdG0gKnRtLCBpbnQgaG91cikKK3sKKwlpZiAodG0tPnRtX2hvdXIgPCBob3VyKQorCQlkYXRlX3llc3RlcmRheSh0bSwgTlVMTCk7CisJdG0tPnRtX2hvdXIgPSBob3VyOworCXRtLT50bV9taW4gPSAwOworCXRtLT50bV9zZWMgPSAwOworfQorCitzdGF0aWMgdm9pZCBkYXRlX21pZG5pZ2h0KHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWRhdGVfdGltZSh0bSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdGVfbm9vbihzdHJ1Y3QgdG0gKnRtLCBpbnQgKm51bSkKK3sKKwlkYXRlX3RpbWUodG0sIDEyKTsKK30KKworc3RhdGljIHZvaWQgZGF0ZV90ZWEoc3RydWN0IHRtICp0bSwgaW50ICpudW0pCit7CisJZGF0ZV90aW1lKHRtLCAxNyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BlY2lhbCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICgqZm4pKHN0cnVjdCB0bSAqLCBpbnQgKik7Cit9IHNwZWNpYWxbXSA9IHsKKwl7ICJ5ZXN0ZXJkYXkiLCBkYXRlX3llc3RlcmRheSB9LAorCXsgIm5vb24iLCBkYXRlX25vb24gfSwKKwl7ICJtaWRuaWdodCIsIGRhdGVfbWlkbmlnaHQgfSwKKwl7ICJ0ZWEiLCBkYXRlX3RlYSB9LAorCXsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbnVtYmVyX25hbWVbXSA9IHsKKwkiemVybyIsICJvbmUiLCAidHdvIiwgInRocmVlIiwgImZvdXIiLAorCSJmaXZlIiwgInNpeCIsICJzZXZlbiIsICJlaWdodCIsICJuaW5lIiwgInRlbiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGVsZW4geworCWNvbnN0IGNoYXIgKnR5cGU7CisJaW50IGxlbmd0aDsKK30gdHlwZWxlbltdID0geworCXsgInNlY29uZHMiLCAxIH0sCisJeyAibWludXRlcyIsIDYwIH0sCisJeyAiaG91cnMiLCA2MCo2MCB9LAorCXsgImRheXMiLCAyNCo2MCo2MCB9LAorCXsgIndlZWtzIiwgNyoyNCo2MCo2MCB9LAorCXsgTlVMTCB9Cit9OwkKKworc3RhdGljIGNvbnN0IGNoYXIgKmFwcHJveGlkYXRlX2FscGhhKGNvbnN0IGNoYXIgKmRhdGUsIHN0cnVjdCB0bSAqdG0sIGludCAqbnVtKQoreworCWNvbnN0IHN0cnVjdCB0eXBlbGVuICp0bDsKKwljb25zdCBzdHJ1Y3Qgc3BlY2lhbCAqczsKKwljb25zdCBjaGFyICplbmQgPSBkYXRlOworCWludCBuID0gMSwgaTsKKworCXdoaWxlIChpc2FscGhhKCorK2VuZCkpCisJCW4rKzsKKworCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCWludCBtYXRjaCA9IG1hdGNoX3N0cmluZyhkYXRlLCBtb250aF9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQl0bS0+dG1fbW9uID0gaTsKKwkJCXJldHVybiBlbmQ7CisJCX0KKwl9CisKKwlmb3IgKHMgPSBzcGVjaWFsOyBzLT5uYW1lOyBzKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbihzLT5uYW1lKTsKKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCBzLT5uYW1lKSA9PSBsZW4pIHsKKwkJCXMtPmZuKHRtLCBudW0pOworCQkJcmV0dXJuIGVuZDsKKwkJfQorCX0KKworCWlmICghKm51bSkgeworCQlmb3IgKGkgPSAxOyBpIDwgMTE7IGkrKykgeworCQkJaW50IGxlbiA9IHN0cmxlbihudW1iZXJfbmFtZVtpXSk7CisJCQlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsIG51bWJlcl9uYW1lW2ldKSA9PSBsZW4pIHsKKwkJCQkqbnVtID0gaTsKKwkJCQlyZXR1cm4gZW5kOworCQkJfQorCQl9CisJCWlmIChtYXRjaF9zdHJpbmcoZGF0ZSwgImxhc3QiKSA9PSA0KQorCQkJKm51bSA9IDE7CisJCXJldHVybiBlbmQ7CisJfQorCisJdGwgPSB0eXBlbGVuOworCXdoaWxlICh0bC0+dHlwZSkgeworCQlpbnQgbGVuID0gc3RybGVuKHRsLT50eXBlKTsKKwkJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCB0bC0+dHlwZSkgPj0gbGVuLTEpIHsKKwkJCXVwZGF0ZV90bSh0bSwgdGwtPmxlbmd0aCAqICpudW0pOworCQkJKm51bSA9IDA7CisJCQlyZXR1cm4gZW5kOworCQl9CisJCXRsKys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpbnQgbWF0Y2ggPSBtYXRjaF9zdHJpbmcoZGF0ZSwgd2Vla2RheV9uYW1lc1tpXSk7CisJCWlmIChtYXRjaCA+PSAzKSB7CisJCQlpbnQgZGlmZiwgbiA9ICpudW0gLTE7CisJCQkqbnVtID0gMDsKKworCQkJZGlmZiA9IHRtLT50bV93ZGF5IC0gaTsKKwkJCWlmIChkaWZmIDw9IDApCisJCQkJbisrOworCQkJZGlmZiArPSA3Km47CisKKwkJCXVwZGF0ZV90bSh0bSwgZGlmZiAqIDI0ICogNjAgKiA2MCk7CisJCQlyZXR1cm4gZW5kOworCQl9CisJfQorCisJaWYgKG1hdGNoX3N0cmluZyhkYXRlLCAibW9udGhzIikgPj0gNSkgeworCQlpbnQgbiA9IHRtLT50bV9tb24gLSAqbnVtOworCQkqbnVtID0gMDsKKwkJd2hpbGUgKG4gPCAwKSB7CisJCQluICs9IDEyOworCQkJdG0tPnRtX3llYXItLTsKKwkJfQorCQl0bS0+dG1fbW9uID0gbjsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwlpZiAobWF0Y2hfc3RyaW5nKGRhdGUsICJ5ZWFycyIpID49IDQpIHsKKwkJdG0tPnRtX3llYXIgLT0gKm51bTsKKwkJKm51bSA9IDA7CisJCXJldHVybiBlbmQ7CisJfQorCisJcmV0dXJuIGVuZDsKK30KKwordW5zaWduZWQgbG9uZyBhcHByb3hpZGF0ZShjb25zdCBjaGFyICpkYXRlKQoreworCWludCBudW1iZXIgPSAwOworCXN0cnVjdCB0bSB0bSwgbm93OworCXN0cnVjdCB0aW1ldmFsIHR2OworCWNoYXIgYnVmZmVyWzUwXTsKKworCWlmIChwYXJzZV9kYXRlKGRhdGUsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpID4gMCkKKwkJcmV0dXJuIHN0cnRvdWwoYnVmZmVyLCBOVUxMLCAxMCk7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOworCW5vdyA9IHRtOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKmRhdGU7CisJCWlmICghYykKKwkJCWJyZWFrOworCQlkYXRlKys7CisJCWlmIChpc2RpZ2l0KGMpKSB7CisJCQljaGFyICplbmQ7CisJCQludW1iZXIgPSBzdHJ0b3VsKGRhdGUtMSwgJmVuZCwgMTApOworCQkJZGF0ZSA9IGVuZDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpc2FscGhhKGMpKQorCQkJZGF0ZSA9IGFwcHJveGlkYXRlX2FscGhhKGRhdGUtMSwgJnRtLCAmbnVtYmVyKTsKKwl9CisJaWYgKG51bWJlciA+IDAgJiYgbnVtYmVyIDwgMzIpCisJCXRtLnRtX21kYXkgPSBudW1iZXI7CisJaWYgKHRtLnRtX21vbiA+IG5vdy50bV9tb24gJiYgdG0udG1feWVhciA9PSBub3cudG1feWVhcikKKwkJdG0udG1feWVhci0tOworCXJldHVybiBta3RpbWUoJnRtKTsKK30KZGlmZiAtLWdpdCBhL2RlbHRhLmggYi9kZWx0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2Y4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWx0YS5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgREVMVEFfSAorI2RlZmluZSBERUxUQV9ICisKKy8qIG9wYXF1ZSBvYmplY3QgZm9yIGRlbHRhIGluZGV4ICovCitzdHJ1Y3QgZGVsdGFfaW5kZXg7CisKKy8qCisgKiBjcmVhdGVfZGVsdGFfaW5kZXg6IGNvbXB1dGUgaW5kZXggZGF0YSBmcm9tIGdpdmVuIGJ1ZmZlcgorICoKKyAqIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgZGVsdGFfaW5kZXggdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvCisgKiBzdWJzZXF1ZW50IGNyZWF0ZV9kZWx0YSgpIGNhbGxzLCBvciB0byBmcmVlX2RlbHRhX2luZGV4KCkuICBBIE5VTEwgcG9pbnRlcgorICogaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4gIFRoZSBnaXZlbiBidWZmZXIgbXVzdCBub3QgYmUgZnJlZWQgbm9yIGFsdGVyZWQKKyAqIGJlZm9yZSBmcmVlX2RlbHRhX2luZGV4KCkgaXMgY2FsbGVkLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgbXVzdCBiZSBmcmVlZAorICogdXNpbmcgZnJlZV9kZWx0YV9pbmRleCgpLgorICovCitleHRlcm4gc3RydWN0IGRlbHRhX2luZGV4ICoKK2NyZWF0ZV9kZWx0YV9pbmRleChjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgYnVmc2l6ZSk7CisKKy8qCisgKiBmcmVlX2RlbHRhX2luZGV4OiBmcmVlIHRoZSBpbmRleCBjcmVhdGVkIGJ5IGNyZWF0ZV9kZWx0YV9pbmRleCgpCisgKgorICogR2l2ZW4gcG9pbnRlciBtdXN0IGJlIHdoYXQgY3JlYXRlX2RlbHRhX2luZGV4KCkgcmV0dXJuZWQsIG9yIE5VTEwuCisgKi8KK2V4dGVybiB2b2lkIGZyZWVfZGVsdGFfaW5kZXgoc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCk7CisKKy8qCisgKiBjcmVhdGVfZGVsdGE6IGNyZWF0ZSBhIGRlbHRhIGZyb20gZ2l2ZW4gaW5kZXggZm9yIHRoZSBnaXZlbiBidWZmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgYnVmZmVycyB1c2luZworICogdGhlIHNhbWUgZGVsdGFfaW5kZXggcG9pbnRlci4gIElmIG1heF9kZWx0YV9zaXplIGlzIG5vbi16ZXJvIGFuZCB0aGUKKyAqIHJlc3VsdGluZyBkZWx0YSBpcyB0byBiZSBsYXJnZXIgdGhhbiBtYXhfZGVsdGFfc2l6ZSB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuCisgKiBPbiBzdWNjZXNzLCBhIG5vbi1OVUxMIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWx0YSBkYXRhIGlzCisgKiByZXR1cm5lZCBhbmQgKmRlbHRhX3NpemUgaXMgdXBkYXRlZCB3aXRoIGl0cyBzaXplLiAgVGhlIHJldHVybmVkIGJ1ZmZlcgorICogbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gdm9pZCAqCitjcmVhdGVfZGVsdGEoY29uc3Qgc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCwKKwkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBidWZzaXplLAorCSAgICAgdW5zaWduZWQgbG9uZyAqZGVsdGFfc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfc2l6ZSk7CisKKy8qCisgKiBkaWZmX2RlbHRhOiBjcmVhdGUgYSBkZWx0YSBmcm9tIHNvdXJjZSBidWZmZXIgdG8gdGFyZ2V0IGJ1ZmZlcgorICoKKyAqIElmIG1heF9kZWx0YV9zaXplIGlzIG5vbi16ZXJvIGFuZCB0aGUgcmVzdWx0aW5nIGRlbHRhIGlzIHRvIGJlIGxhcmdlcgorICogdGhhbiBtYXhfZGVsdGFfc2l6ZSB0aGVuIE5VTEwgaXMgcmV0dXJuZWQuICBPbiBzdWNjZXNzLCBhIG5vbi1OVUxMCisgKiBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsdGEgZGF0YSBpcyByZXR1cm5lZCBhbmQgKmRlbHRhX3NpemUgaXMKKyAqIHVwZGF0ZWQgd2l0aCBpdHMgc2l6ZS4gIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZGlmZl9kZWx0YShjb25zdCB2b2lkICpzcmNfYnVmLCB1bnNpZ25lZCBsb25nIHNyY19idWZzaXplLAorCSAgIGNvbnN0IHZvaWQgKnRyZ19idWYsIHVuc2lnbmVkIGxvbmcgdHJnX2J1ZnNpemUsCisJICAgdW5zaWduZWQgbG9uZyAqZGVsdGFfc2l6ZSwgdW5zaWduZWQgbG9uZyBtYXhfZGVsdGFfc2l6ZSkKK3sKKwlzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4ID0gY3JlYXRlX2RlbHRhX2luZGV4KHNyY19idWYsIHNyY19idWZzaXplKTsKKwlpZiAoaW5kZXgpIHsKKwkJdm9pZCAqZGVsdGEgPSBjcmVhdGVfZGVsdGEoaW5kZXgsIHRyZ19idWYsIHRyZ19idWZzaXplLAorCQkJCQkgICBkZWx0YV9zaXplLCBtYXhfZGVsdGFfc2l6ZSk7CisJCWZyZWVfZGVsdGFfaW5kZXgoaW5kZXgpOworCQlyZXR1cm4gZGVsdGE7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogcGF0Y2hfZGVsdGE6IHJlY3JlYXRlIHRhcmdldCBidWZmZXIgZ2l2ZW4gc291cmNlIGJ1ZmZlciBhbmQgZGVsdGEgZGF0YQorICoKKyAqIE9uIHN1Y2Nlc3MsIGEgbm9uLU5VTEwgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlciBpcyByZXR1cm5lZCBhbmQKKyAqICp0cmdfYnVmc2l6ZSBpcyB1cGRhdGVkIHdpdGggaXRzIHNpemUuICBPbiBmYWlsdXJlIGEgTlVMTCBwb2ludGVyIGlzCisgKiByZXR1cm5lZC4gIFRoZSByZXR1cm5lZCBidWZmZXIgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitleHRlcm4gdm9pZCAqcGF0Y2hfZGVsdGEoY29uc3Qgdm9pZCAqc3JjX2J1ZiwgdW5zaWduZWQgbG9uZyBzcmNfc2l6ZSwKKwkJCSBjb25zdCB2b2lkICpkZWx0YV9idWYsIHVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwKKwkJCSB1bnNpZ25lZCBsb25nICpkc3Rfc2l6ZSk7CisKKy8qIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBkZWx0YSBzaXplIGlzIDQgYnl0ZXMgKi8KKyNkZWZpbmUgREVMVEFfU0laRV9NSU4JNAorCisvKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCB0d2ljZSBvbiB0aGUgZGVsdGEgZGF0YSBidWZmZXIsIGZpcnN0IHRvIGdldCB0aGUKKyAqIGV4cGVjdGVkIHNvdXJjZSBidWZmZXIgc2l6ZSwgYW5kIGFnYWluIHRvIGdldCB0aGUgdGFyZ2V0IGJ1ZmZlciBzaXplLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RlbHRhX2hkcl9zaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipkYXRhcCwKKwkJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRvcCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhID0gKmRhdGFwOworCXVuc2lnbmVkIGNoYXIgY21kOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CisJaW50IGkgPSAwOworCWRvIHsKKwkJY21kID0gKmRhdGErKzsKKwkJc2l6ZSB8PSAoY21kICYgfjB4ODApIDw8IGk7CisJCWkgKz0gNzsKKwl9IHdoaWxlIChjbWQgJiAweDgwICYmIGRhdGEgPCB0b3ApOworCSpkYXRhcCA9IGRhdGE7CisJcmV0dXJuIHNpemU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVzY3JpYmUuYyBiL2Rlc2NyaWJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0Y2E4OQotLS0gL2Rldi9udWxsCisrKyBiL2Rlc2NyaWJlLmMKQEAgLTAsMCArMSwxNzMgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworI2RlZmluZSBTRUVOICgxdSA8PCAwKQorCitzdGF0aWMgY29uc3QgY2hhciBkZXNjcmliZV91c2FnZVtdID0KKyJnaXQtZGVzY3JpYmUgWy0tYWxsXSBbLS10YWdzXSBbLS1hYmJyZXY9PG4+XSA8Y29tbWl0dGlzaD4qIjsKKworc3RhdGljIGludCBhbGwgPSAwOwkvKiBEZWZhdWx0IHRvIGFubm90YXRlZCB0YWdzIG9ubHkgKi8KK3N0YXRpYyBpbnQgdGFncyA9IDA7CS8qIEJ1dCBhbGxvdyBhbnkgdGFncyBpZiAtLXRhZ3MgaXMgc3BlY2lmaWVkICovCisKK3N0YXRpYyBpbnQgYWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisKK3N0YXRpYyBpbnQgbmFtZXMgPSAwLCBhbGxvY3MgPSAwOworc3RhdGljIHN0cnVjdCBjb21taXRfbmFtZSB7CisJY29uc3Qgc3RydWN0IGNvbW1pdCAqY29tbWl0OworCWludCBwcmlvOyAvKiBhbm5vdGF0ZWQgdGFnID0gMiwgdGFnID0gMSwgaGVhZCA9IDAgKi8KKwljaGFyIHBhdGhbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK30gKipuYW1lX2FycmF5ID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBjb21taXRfbmFtZSAqbWF0Y2goc3RydWN0IGNvbW1pdCAqY21pdCkKK3sKKwlpbnQgaSA9IG5hbWVzOworCXN0cnVjdCBjb21taXRfbmFtZSAqKnAgPSBuYW1lX2FycmF5OworCisJd2hpbGUgKGktLSA+IDApIHsKKwkJc3RydWN0IGNvbW1pdF9uYW1lICpuID0gKnArKzsKKwkJaWYgKG4tPmNvbW1pdCA9PSBjbWl0KQorCQkJcmV0dXJuIG47CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhZGRfdG9fa25vd25fbmFtZXMoY29uc3QgY2hhciAqcGF0aCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCQkgICAgICAgaW50IHByaW8pCit7CisJaW50IGlkeDsKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpKzE7CisJc3RydWN0IGNvbW1pdF9uYW1lICpuYW1lID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1pdF9uYW1lKSArIGxlbik7CisKKwluYW1lLT5jb21taXQgPSBjb21taXQ7CisJbmFtZS0+cHJpbyA9IHByaW87IAorCW1lbWNweShuYW1lLT5wYXRoLCBwYXRoLCBsZW4pOworCWlkeCA9IG5hbWVzOworCWlmIChpZHggPj0gYWxsb2NzKSB7CisJCWFsbG9jcyA9IChpZHggKyA1MCkgKiAzIC8gMjsKKwkJbmFtZV9hcnJheSA9IHhyZWFsbG9jKG5hbWVfYXJyYXksIGFsbG9jcypzaXplb2YoKm5hbWVfYXJyYXkpKTsKKwl9CisJbmFtZV9hcnJheVtpZHhdID0gbmFtZTsKKwluYW1lcyA9ICsraWR4OworfQorCitzdGF0aWMgaW50IGdldF9uYW1lKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2VfZ2VudGx5KHNoYTEsIDEpOworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKwlpbnQgcHJpbzsKKworCWlmICghY29tbWl0KQorCQlyZXR1cm4gMDsKKwlvYmplY3QgPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJLyogSWYgLS1hbGwsIHRoZW4gYW55IHJlZnMgYXJlIHVzZWQuCisJICogSWYgLS10YWdzLCB0aGVuIGFueSB0YWdzIGFyZSB1c2VkLgorCSAqIE90aGVyd2lzZSBvbmx5IGFubm90YXRlZCB0YWdzIGFyZSB1c2VkLgorCSAqLworCWlmICghc3RybmNtcChwYXRoLCAicmVmcy90YWdzLyIsIDEwKSkgeworCQlpZiAob2JqZWN0LT50eXBlID09IE9CSl9UQUcpCisJCQlwcmlvID0gMjsKKwkJZWxzZQorCQkJcHJpbyA9IDE7CisJfQorCWVsc2UKKwkJcHJpbyA9IDA7CisKKwlpZiAoIWFsbCkgeworCQlpZiAoIXByaW8pCisJCQlyZXR1cm4gMDsKKwkJaWYgKCF0YWdzICYmIHByaW8gPCAyKQorCQkJcmV0dXJuIDA7CisJfQorCWFkZF90b19rbm93bl9uYW1lcyhhbGwgPyBwYXRoICsgNSA6IHBhdGggKyAxMCwgY29tbWl0LCBwcmlvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXJlX25hbWVzKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKmEgPSAqKHN0cnVjdCBjb21taXRfbmFtZSAqKilfYTsKKwlzdHJ1Y3QgY29tbWl0X25hbWUgKmIgPSAqKHN0cnVjdCBjb21taXRfbmFtZSAqKilfYjsKKwl1bnNpZ25lZCBsb25nIGFfZGF0ZSA9IGEtPmNvbW1pdC0+ZGF0ZTsKKwl1bnNpZ25lZCBsb25nIGJfZGF0ZSA9IGItPmNvbW1pdC0+ZGF0ZTsKKworCWlmIChhLT5wcmlvICE9IGItPnByaW8pCisJCXJldHVybiBiLT5wcmlvIC0gYS0+cHJpbzsKKwlyZXR1cm4gKGFfZGF0ZSA+IGJfZGF0ZSkgPyAtMSA6IChhX2RhdGUgPT0gYl9kYXRlKSA/IDAgOiAxOworfQorCitzdGF0aWMgdm9pZCBkZXNjcmliZShjb25zdCBjaGFyICphcmcsIGludCBsYXN0X29uZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBjb21taXQgKmNtaXQ7CisJc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0OworCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCXN0cnVjdCBjb21taXRfbmFtZSAqbjsKKworCWlmIChnZXRfc2hhMShhcmcsIHNoYTEpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJnKTsKKwljbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjbWl0KQorCQlkaWUoIiVzIGlzIG5vdCBhIHZhbGlkICclcycgb2JqZWN0IiwgYXJnLCBjb21taXRfdHlwZSk7CisKKwlpZiAoIWluaXRpYWxpemVkKSB7CisJCWluaXRpYWxpemVkID0gMTsKKwkJZm9yX2VhY2hfcmVmKGdldF9uYW1lKTsKKwkJcXNvcnQobmFtZV9hcnJheSwgbmFtZXMsIHNpemVvZigqbmFtZV9hcnJheSksIGNvbXBhcmVfbmFtZXMpOworCX0KKworCW4gPSBtYXRjaChjbWl0KTsKKwlpZiAobikgeworCQlwcmludGYoIiVzXG4iLCBuLT5wYXRoKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3QgPSBOVUxMOworCWNvbW1pdF9saXN0X2luc2VydChjbWl0LCAmbGlzdCk7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdCAqYyA9IHBvcF9tb3N0X3JlY2VudF9jb21taXQoJmxpc3QsIFNFRU4pOworCQluID0gbWF0Y2goYyk7CisJCWlmIChuKSB7CisJCQlwcmludGYoIiVzLWclc1xuIiwgbi0+cGF0aCwKKwkJCSAgICAgICBmaW5kX3VuaXF1ZV9hYmJyZXYoY21pdC0+b2JqZWN0LnNoYTEsIGFiYnJldikpOworCQkJaWYgKCFsYXN0X29uZSkKKwkJCQljbGVhcl9jb21taXRfbWFya3MoY21pdCwgU0VFTik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZGllKCJjYW5ub3QgZGVzY3JpYmUgJyVzJyIsIHNoYTFfdG9faGV4KGNtaXQtPm9iamVjdC5zaGExKSk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyAhPSAnLScpCisJCQlicmVhazsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKQorCQkJYWxsID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXRhZ3MiKSkKKwkJCXRhZ3MgPSAxOworCQllbHNlIGlmICghc3RybmNtcChhcmcsICItLWFiYnJldj0iLCA5KSkgeworCQkJYWJicmV2ID0gc3RydG91bChhcmcgKyA5LCBOVUxMLCAxMCk7CisJCQlpZiAoYWJicmV2IDwgTUlOSU1VTV9BQkJSRVYgfHwgNDAgPD0gYWJicmV2KQorCQkJCWFiYnJldiA9IERFRkFVTFRfQUJCUkVWOworCQl9CisJCWVsc2UKKwkJCXVzYWdlKGRlc2NyaWJlX3VzYWdlKTsKKwl9CisKKwlpZiAoaSA9PSBhcmdjKQorCQlkZXNjcmliZSgiSEVBRCIsIDEpOworCWVsc2UKKwkJd2hpbGUgKGkgPCBhcmdjKSB7CisJCQlkZXNjcmliZShhcmd2W2ldLCAoaSA9PSBhcmdjIC0gMSkpOworCQkJaSsrOworCQl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RpZmYtZGVsdGEuYyBiL2RpZmYtZGVsdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE5MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZGlmZi1kZWx0YS5jCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogZGlmZi1kZWx0YS5jOiBnZW5lcmF0ZSBhIGRlbHRhIGJldHdlZW4gdHdvIGJ1ZmZlcnMKKyAqCisgKiAgTWFueSBwYXJ0cyBvZiB0aGlzIGZpbGUgaGF2ZSBiZWVuIGxpZnRlZCBmcm9tIExpYlhEaWZmIHZlcnNpb24gMC4xMC4KKyAqICBodHRwOi8vd3d3LnhtYWlsc2VydmVyLm9yZy94ZGlmZi1saWIuaHRtbAorICoKKyAqICBMaWJYRGlmZiB3YXMgd3JpdHRlbiBieSBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAzCURhdmlkZSBMaWJlbnppCisgKgorICogIE1hbnkgbW9kcyBmb3IgR0lUIHVzYWdlIGJ5IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4sIChDKSAyMDA1LgorICoKKyAqICBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBVc2Ugb2YgdGhpcyB3aXRoaW4gZ2l0IGF1dG9tYXRpY2FsbHkgbWVhbnMgdGhhdCB0aGUgTEdQTAorICogIGxpY2Vuc2luZyBnZXRzIHR1cm5lZCBpbnRvIEdQTHYyIHdpdGhpbiB0aGlzIHByb2plY3QuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImRlbHRhLmgiCisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKworLyogbWF4aW11bSBoYXNoIGVudHJ5IGxpc3QgZm9yIHRoZSBzYW1lIGhhc2ggYnVja2V0ICovCisjZGVmaW5lIEhBU0hfTElNSVQgNjQKKworI2RlZmluZSBSQUJJTl9TSElGVCAyMworI2RlZmluZSBSQUJJTl9XSU5ET1cgMTYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBUWzI1Nl0gPSB7CisJMHgwMDAwMDAwMCwgMHhhYjU5YjRkMSwgMHg1NmIzNjlhMiwgMHhmZGVhZGQ3MywgMHgwNjNmNjc5NSwgMHhhZDY2ZDM0NCwKKwkweDUwOGMwZTM3LCAweGZiZDViYWU2LCAweDBjN2VjZjJhLCAweGE3Mjc3YmZiLCAweDVhY2RhNjg4LCAweGYxOTQxMjU5LAorCTB4MGE0MWE4YmYsIDB4YTExODFjNmUsIDB4NWNmMmMxMWQsIDB4ZjdhYjc1Y2MsIDB4MThmZDllNTQsIDB4YjNhNDJhODUsCisJMHg0ZTRlZjdmNiwgMHhlNTE3NDMyNywgMHgxZWMyZjljMSwgMHhiNTliNGQxMCwgMHg0ODcxOTA2MywgMHhlMzI4MjRiMiwKKwkweDE0ODM1MTdlLCAweGJmZGFlNWFmLCAweDQyMzAzOGRjLCAweGU5Njk4YzBkLCAweDEyYmMzNmViLCAweGI5ZTU4MjNhLAorCTB4NDQwZjVmNDksIDB4ZWY1NmViOTgsIDB4MzFmYjNjYTgsIDB4OWFhMjg4NzksIDB4Njc0ODU1MGEsIDB4Y2MxMWUxZGIsCisJMHgzN2M0NWIzZCwgMHg5YzlkZWZlYywgMHg2MTc3MzI5ZiwgMHhjYTJlODY0ZSwgMHgzZDg1ZjM4MiwgMHg5NmRjNDc1MywKKwkweDZiMzY5YTIwLCAweGMwNmYyZWYxLCAweDNiYmE5NDE3LCAweDkwZTMyMGM2LCAweDZkMDlmZGI1LCAweGM2NTA0OTY0LAorCTB4MjkwNmEyZmMsIDB4ODI1ZjE2MmQsIDB4N2ZiNWNiNWUsIDB4ZDRlYzdmOGYsIDB4MmYzOWM1NjksIDB4ODQ2MDcxYjgsCisJMHg3OThhYWNjYiwgMHhkMmQzMTgxYSwgMHgyNTc4NmRkNiwgMHg4ZTIxZDkwNywgMHg3M2NiMDQ3NCwgMHhkODkyYjBhNSwKKwkweDIzNDcwYTQzLCAweDg4MWViZTkyLCAweDc1ZjQ2M2UxLCAweGRlYWRkNzMwLCAweDYzZjY3OTUwLCAweGM4YWZjZDgxLAorCTB4MzU0NTEwZjIsIDB4OWUxY2E0MjMsIDB4NjVjOTFlYzUsIDB4Y2U5MGFhMTQsIDB4MzM3YTc3NjcsIDB4OTgyM2MzYjYsCisJMHg2Zjg4YjY3YSwgMHhjNGQxMDJhYiwgMHgzOTNiZGZkOCwgMHg5MjYyNmIwOSwgMHg2OWI3ZDFlZiwgMHhjMmVlNjUzZSwKKwkweDNmMDRiODRkLCAweDk0NWQwYzljLCAweDdiMGJlNzA0LCAweGQwNTI1M2Q1LCAweDJkYjg4ZWE2LCAweDg2ZTEzYTc3LAorCTB4N2QzNDgwOTEsIDB4ZDY2ZDM0NDAsIDB4MmI4N2U5MzMsIDB4ODBkZTVkZTIsIDB4Nzc3NTI4MmUsIDB4ZGMyYzljZmYsCisJMHgyMWM2NDE4YywgMHg4YTlmZjU1ZCwgMHg3MTRhNGZiYiwgMHhkYTEzZmI2YSwgMHgyN2Y5MjYxOSwgMHg4Y2EwOTJjOCwKKwkweDUyMGQ0NWY4LCAweGY5NTRmMTI5LCAweDA0YmUyYzVhLCAweGFmZTc5ODhiLCAweDU0MzIyMjZkLCAweGZmNmI5NmJjLAorCTB4MDI4MTRiY2YsIDB4YTlkOGZmMWUsIDB4NWU3MzhhZDIsIDB4ZjUyYTNlMDMsIDB4MDhjMGUzNzAsIDB4YTM5OTU3YTEsCisJMHg1ODRjZWQ0NywgMHhmMzE1NTk5NiwgMHgwZWZmODRlNSwgMHhhNWE2MzAzNCwgMHg0YWYwZGJhYywgMHhlMWE5NmY3ZCwKKwkweDFjNDNiMjBlLCAweGI3MWEwNmRmLCAweDRjY2ZiYzM5LCAweGU3OTYwOGU4LCAweDFhN2NkNTliLCAweGIxMjU2MTRhLAorCTB4NDY4ZTE0ODYsIDB4ZWRkN2EwNTcsIDB4MTAzZDdkMjQsIDB4YmI2NGM5ZjUsIDB4NDBiMTczMTMsIDB4ZWJlOGM3YzIsCisJMHgxNjAyMWFiMSwgMHhiZDViYWU2MCwgMHg2Y2I1NDY3MSwgMHhjN2VjZjJhMCwgMHgzYTA2MmZkMywgMHg5MTVmOWIwMiwKKwkweDZhOGEyMWU0LCAweGMxZDM5NTM1LCAweDNjMzk0ODQ2LCAweDk3NjBmYzk3LCAweDYwY2I4OTViLCAweGNiOTIzZDhhLAorCTB4MzY3OGUwZjksIDB4OWQyMTU0MjgsIDB4NjZmNGVlY2UsIDB4Y2RhZDVhMWYsIDB4MzA0Nzg3NmMsIDB4OWIxZTMzYmQsCisJMHg3NDQ4ZDgyNSwgMHhkZjExNmNmNCwgMHgyMmZiYjE4NywgMHg4OWEyMDU1NiwgMHg3Mjc3YmZiMCwgMHhkOTJlMGI2MSwKKwkweDI0YzRkNjEyLCAweDhmOWQ2MmMzLCAweDc4MzYxNzBmLCAweGQzNmZhM2RlLCAweDJlODU3ZWFkLCAweDg1ZGNjYTdjLAorCTB4N2UwOTcwOWEsIDB4ZDU1MGM0NGIsIDB4MjhiYTE5MzgsIDB4ODNlM2FkZTksIDB4NWQ0ZTdhZDksIDB4ZjYxN2NlMDgsCisJMHgwYmZkMTM3YiwgMHhhMGE0YTdhYSwgMHg1YjcxMWQ0YywgMHhmMDI4YTk5ZCwgMHgwZGMyNzRlZSwgMHhhNjliYzAzZiwKKwkweDUxMzBiNWYzLCAweGZhNjkwMTIyLCAweDA3ODNkYzUxLCAweGFjZGE2ODgwLCAweDU3MGZkMjY2LCAweGZjNTY2NmI3LAorCTB4MDFiY2JiYzQsIDB4YWFlNTBmMTUsIDB4NDViM2U0OGQsIDB4ZWVlYTUwNWMsIDB4MTMwMDhkMmYsIDB4Yjg1OTM5ZmUsCisJMHg0MzhjODMxOCwgMHhlOGQ1MzdjOSwgMHgxNTNmZWFiYSwgMHhiZTY2NWU2YiwgMHg0OWNkMmJhNywgMHhlMjk0OWY3NiwKKwkweDFmN2U0MjA1LCAweGI0MjdmNmQ0LCAweDRmZjI0YzMyLCAweGU0YWJmOGUzLCAweDE5NDEyNTkwLCAweGIyMTg5MTQxLAorCTB4MGY0MzNmMjEsIDB4YTQxYThiZjAsIDB4NTlmMDU2ODMsIDB4ZjJhOWUyNTIsIDB4MDk3YzU4YjQsIDB4YTIyNWVjNjUsCisJMHg1ZmNmMzExNiwgMHhmNDk2ODVjNywgMHgwMzNkZjAwYiwgMHhhODY0NDRkYSwgMHg1NThlOTlhOSwgMHhmZWQ3MmQ3OCwKKwkweDA1MDI5NzllLCAweGFlNWIyMzRmLCAweDUzYjFmZTNjLCAweGY4ZTg0YWVkLCAweDE3YmVhMTc1LCAweGJjZTcxNWE0LAorCTB4NDEwZGM4ZDcsIDB4ZWE1NDdjMDYsIDB4MTE4MWM2ZTAsIDB4YmFkODcyMzEsIDB4NDczMmFmNDIsIDB4ZWM2YjFiOTMsCisJMHgxYmMwNmU1ZiwgMHhiMDk5ZGE4ZSwgMHg0ZDczMDdmZCwgMHhlNjJhYjMyYywgMHgxZGZmMDljYSwgMHhiNmE2YmQxYiwKKwkweDRiNGM2MDY4LCAweGUwMTVkNGI5LCAweDNlYjgwMzg5LCAweDk1ZTFiNzU4LCAweDY4MGI2YTJiLCAweGMzNTJkZWZhLAorCTB4Mzg4NzY0MWMsIDB4OTNkZWQwY2QsIDB4NmUzNDBkYmUsIDB4YzU2ZGI5NmYsIDB4MzJjNmNjYTMsIDB4OTk5Zjc4NzIsCisJMHg2NDc1YTUwMSwgMHhjZjJjMTFkMCwgMHgzNGY5YWIzNiwgMHg5ZmEwMWZlNywgMHg2MjRhYzI5NCwgMHhjOTEzNzY0NSwKKwkweDI2NDU5ZGRkLCAweDhkMWMyOTBjLCAweDcwZjZmNDdmLCAweGRiYWY0MGFlLCAweDIwN2FmYTQ4LCAweDhiMjM0ZTk5LAorCTB4NzZjOTkzZWEsIDB4ZGQ5MDI3M2IsIDB4MmEzYjUyZjcsIDB4ODE2MmU2MjYsIDB4N2M4ODNiNTUsIDB4ZDdkMThmODQsCisJMHgyYzA0MzU2MiwgMHg4NzVkODFiMywgMHg3YWI3NWNjMCwgMHhkMWVlZTgxMQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBVWzI1Nl0gPSB7CisJMHgwMDAwMDAwMCwgMHg3ZWI1MjAwZCwgMHg1NjMzZjRjYiwgMHgyODg2ZDRjNiwgMHgwNzNlNWQ0NywgMHg3OThiN2Q0YSwKKwkweDUxMGRhOThjLCAweDJmYjg4OTgxLCAweDBlN2NiYThlLCAweDcwYzk5YTgzLCAweDU4NGY0ZTQ1LCAweDI2ZmE2ZTQ4LAorCTB4MDk0MmU3YzksIDB4NzdmN2M3YzQsIDB4NWY3MTEzMDIsIDB4MjFjNDMzMGYsIDB4MWNmOTc1MWMsIDB4NjI0YzU1MTEsCisJMHg0YWNhODFkNywgMHgzNDdmYTFkYSwgMHgxYmM3Mjg1YiwgMHg2NTcyMDg1NiwgMHg0ZGY0ZGM5MCwgMHgzMzQxZmM5ZCwKKwkweDEyODVjZjkyLCAweDZjMzBlZjlmLCAweDQ0YjYzYjU5LCAweDNhMDMxYjU0LCAweDE1YmI5MmQ1LCAweDZiMGViMmQ4LAorCTB4NDM4ODY2MWUsIDB4M2QzZDQ2MTMsIDB4MzlmMmVhMzgsIDB4NDc0N2NhMzUsIDB4NmZjMTFlZjMsIDB4MTE3NDNlZmUsCisJMHgzZWNjYjc3ZiwgMHg0MDc5OTc3MiwgMHg2OGZmNDNiNCwgMHgxNjRhNjNiOSwgMHgzNzhlNTBiNiwgMHg0OTNiNzBiYiwKKwkweDYxYmRhNDdkLCAweDFmMDg4NDcwLCAweDMwYjAwZGYxLCAweDRlMDUyZGZjLCAweDY2ODNmOTNhLCAweDE4MzZkOTM3LAorCTB4MjUwYjlmMjQsIDB4NWJiZWJmMjksIDB4NzMzODZiZWYsIDB4MGQ4ZDRiZTIsIDB4MjIzNWMyNjMsIDB4NWM4MGUyNmUsCisJMHg3NDA2MzZhOCwgMHgwYWIzMTZhNSwgMHgyYjc3MjVhYSwgMHg1NWMyMDVhNywgMHg3ZDQ0ZDE2MSwgMHgwM2YxZjE2YywKKwkweDJjNDk3OGVkLCAweDUyZmM1OGUwLCAweDdhN2E4YzI2LCAweDA0Y2ZhYzJiLCAweDczZTVkNDcwLCAweDBkNTBmNDdkLAorCTB4MjVkNjIwYmIsIDB4NWI2MzAwYjYsIDB4NzRkYjg5MzcsIDB4MGE2ZWE5M2EsIDB4MjJlODdkZmMsIDB4NWM1ZDVkZjEsCisJMHg3ZDk5NmVmZSwgMHgwMzJjNGVmMywgMHgyYmFhOWEzNSwgMHg1NTFmYmEzOCwgMHg3YWE3MzNiOSwgMHgwNDEyMTNiNCwKKwkweDJjOTRjNzcyLCAweDUyMjFlNzdmLCAweDZmMWNhMTZjLCAweDExYTk4MTYxLCAweDM5MmY1NWE3LCAweDQ3OWE3NWFhLAorCTB4NjgyMmZjMmIsIDB4MTY5N2RjMjYsIDB4M2UxMTA4ZTAsIDB4NDBhNDI4ZWQsIDB4NjE2MDFiZTIsIDB4MWZkNTNiZWYsCisJMHgzNzUzZWYyOSwgMHg0OWU2Y2YyNCwgMHg2NjVlNDZhNSwgMHgxOGViNjZhOCwgMHgzMDZkYjI2ZSwgMHg0ZWQ4OTI2MywKKwkweDRhMTczZTQ4LCAweDM0YTIxZTQ1LCAweDFjMjRjYTgzLCAweDYyOTFlYThlLCAweDRkMjk2MzBmLCAweDMzOWM0MzAyLAorCTB4MWIxYTk3YzQsIDB4NjVhZmI3YzksIDB4NDQ2Yjg0YzYsIDB4M2FkZWE0Y2IsIDB4MTI1ODcwMGQsIDB4NmNlZDUwMDAsCisJMHg0MzU1ZDk4MSwgMHgzZGUwZjk4YywgMHgxNTY2MmQ0YSwgMHg2YmQzMGQ0NywgMHg1NmVlNGI1NCwgMHgyODViNmI1OSwKKwkweDAwZGRiZjlmLCAweDdlNjg5ZjkyLCAweDUxZDAxNjEzLCAweDJmNjUzNjFlLCAweDA3ZTNlMmQ4LCAweDc5NTZjMmQ1LAorCTB4NTg5MmYxZGEsIDB4MjYyN2QxZDcsIDB4MGVhMTA1MTEsIDB4NzAxNDI1MWMsIDB4NWZhY2FjOWQsIDB4MjExOThjOTAsCisJMHgwOTlmNTg1NiwgMHg3NzJhNzg1YiwgMHg0YzkyMWMzMSwgMHgzMjI3M2MzYywgMHgxYWExZThmYSwgMHg2NDE0YzhmNywKKwkweDRiYWM0MTc2LCAweDM1MTk2MTdiLCAweDFkOWZiNWJkLCAweDYzMmE5NWIwLCAweDQyZWVhNmJmLCAweDNjNWI4NmIyLAorCTB4MTRkZDUyNzQsIDB4NmE2ODcyNzksIDB4NDVkMGZiZjgsIDB4M2I2NWRiZjUsIDB4MTNlMzBmMzMsIDB4NmQ1NjJmM2UsCisJMHg1MDZiNjkyZCwgMHgyZWRlNDkyMCwgMHgwNjU4OWRlNiwgMHg3OGVkYmRlYiwgMHg1NzU1MzQ2YSwgMHgyOWUwMTQ2NywKKwkweDAxNjZjMGExLCAweDdmZDNlMGFjLCAweDVlMTdkM2EzLCAweDIwYTJmM2FlLCAweDA4MjQyNzY4LCAweDc2OTEwNzY1LAorCTB4NTkyOThlZTQsIDB4Mjc5Y2FlZTksIDB4MGYxYTdhMmYsIDB4NzFhZjVhMjIsIDB4NzU2MGY2MDksIDB4MGJkNWQ2MDQsCisJMHgyMzUzMDJjMiwgMHg1ZGU2MjJjZiwgMHg3MjVlYWI0ZSwgMHgwY2ViOGI0MywgMHgyNDZkNWY4NSwgMHg1YWQ4N2Y4OCwKKwkweDdiMWM0Yzg3LCAweDA1YTk2YzhhLCAweDJkMmZiODRjLCAweDUzOWE5ODQxLCAweDdjMjIxMWMwLCAweDAyOTczMWNkLAorCTB4MmExMWU1MGIsIDB4NTRhNGM1MDYsIDB4Njk5OTgzMTUsIDB4MTcyY2EzMTgsIDB4M2ZhYTc3ZGUsIDB4NDExZjU3ZDMsCisJMHg2ZWE3ZGU1MiwgMHgxMDEyZmU1ZiwgMHgzODk0MmE5OSwgMHg0NjIxMGE5NCwgMHg2N2U1Mzk5YiwgMHgxOTUwMTk5NiwKKwkweDMxZDZjZDUwLCAweDRmNjNlZDVkLCAweDYwZGI2NGRjLCAweDFlNmU0NGQxLCAweDM2ZTg5MDE3LCAweDQ4NWRiMDFhLAorCTB4M2Y3N2M4NDEsIDB4NDFjMmU4NGMsIDB4Njk0NDNjOGEsIDB4MTdmMTFjODcsIDB4Mzg0OTk1MDYsIDB4NDZmY2I1MGIsCisJMHg2ZTdhNjFjZCwgMHgxMGNmNDFjMCwgMHgzMTBiNzJjZiwgMHg0ZmJlNTJjMiwgMHg2NzM4ODYwNCwgMHgxOThkYTYwOSwKKwkweDM2MzUyZjg4LCAweDQ4ODAwZjg1LCAweDYwMDZkYjQzLCAweDFlYjNmYjRlLCAweDIzOGViZDVkLCAweDVkM2I5ZDUwLAorCTB4NzViZDQ5OTYsIDB4MGIwODY5OWIsIDB4MjRiMGUwMWEsIDB4NWEwNWMwMTcsIDB4NzI4MzE0ZDEsIDB4MGMzNjM0ZGMsCisJMHgyZGYyMDdkMywgMHg1MzQ3MjdkZSwgMHg3YmMxZjMxOCwgMHgwNTc0ZDMxNSwgMHgyYWNjNWE5NCwgMHg1NDc5N2E5OSwKKwkweDdjZmZhZTVmLCAweDAyNGE4ZTUyLCAweDA2ODUyMjc5LCAweDc4MzAwMjc0LCAweDUwYjZkNmIyLCAweDJlMDNmNmJmLAorCTB4MDFiYjdmM2UsIDB4N2YwZTVmMzMsIDB4NTc4ODhiZjUsIDB4MjkzZGFiZjgsIDB4MDhmOTk4ZjcsIDB4NzY0Y2I4ZmEsCisJMHg1ZWNhNmMzYywgMHgyMDdmNGMzMSwgMHgwZmM3YzViMCwgMHg3MTcyZTViZCwgMHg1OWY0MzE3YiwgMHgyNzQxMTE3NiwKKwkweDFhN2M1NzY1LCAweDY0Yzk3NzY4LCAweDRjNGZhM2FlLCAweDMyZmE4M2EzLCAweDFkNDIwYTIyLCAweDYzZjcyYTJmLAorCTB4NGI3MWZlZTksIDB4MzVjNGRlZTQsIDB4MTQwMGVkZWIsIDB4NmFiNWNkZTYsIDB4NDIzMzE5MjAsIDB4M2M4NjM5MmQsCisJMHgxMzNlYjBhYywgMHg2ZDhiOTBhMSwgMHg0NTBkNDQ2NywgMHgzYmI4NjQ2YQorfTsKKworc3RydWN0IGluZGV4X2VudHJ5IHsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdHI7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgaW5kZXhfZW50cnkgKm5leHQ7Cit9OworCitzdHJ1Y3QgZGVsdGFfaW5kZXggeworCWNvbnN0IHZvaWQgKnNyY19idWY7CisJdW5zaWduZWQgbG9uZyBzcmNfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaGFzaF9tYXNrOworCXN0cnVjdCBpbmRleF9lbnRyeSAqaGFzaFtGTEVYX0FSUkFZXTsKK307CisKK3N0cnVjdCBkZWx0YV9pbmRleCAqIGNyZWF0ZV9kZWx0YV9pbmRleChjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgYnVmc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaHNpemUsIGhtYXNrLCBlbnRyaWVzLCBwcmV2X3ZhbCwgKmhhc2hfY291bnQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgKmJ1ZmZlciA9IGJ1ZjsKKwlzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4OworCXN0cnVjdCBpbmRleF9lbnRyeSAqZW50cnksICoqaGFzaDsKKwl2b2lkICptZW07CisJdW5zaWduZWQgbG9uZyBtZW1zaXplOworCisJaWYgKCFidWYgfHwgIWJ1ZnNpemUpCisJCXJldHVybiBOVUxMOworCisJLyogRGV0ZXJtaW5lIGluZGV4IGhhc2ggc2l6ZS4gIE5vdGUgdGhhdCBpbmRleGluZyBza2lwcyB0aGUKKwkgICBmaXJzdCBieXRlIHRvIGFsbG93IGZvciBvcHRpbWl6aW5nIHRoZSBSYWJpbidzIHBvbHlub21pYWwKKwkgICBpbml0aWFsaXphdGlvbiBpbiBjcmVhdGVfZGVsdGEoKS4gKi8KKwllbnRyaWVzID0gKGJ1ZnNpemUgLSAxKSAgLyBSQUJJTl9XSU5ET1c7CisJaHNpemUgPSBlbnRyaWVzIC8gNDsKKwlmb3IgKGkgPSA0OyAoMSA8PCBpKSA8IGhzaXplICYmIGkgPCAzMTsgaSsrKTsKKwloc2l6ZSA9IDEgPDwgaTsKKwlobWFzayA9IGhzaXplIC0gMTsKKworCS8qIGFsbG9jYXRlIGxvb2t1cCBpbmRleCAqLworCW1lbXNpemUgPSBzaXplb2YoKmluZGV4KSArCisJCSAgc2l6ZW9mKCpoYXNoKSAqIGhzaXplICsKKwkJICBzaXplb2YoKmVudHJ5KSAqIGVudHJpZXM7CisJbWVtID0gbWFsbG9jKG1lbXNpemUpOworCWlmICghbWVtKQorCQlyZXR1cm4gTlVMTDsKKwlpbmRleCA9IG1lbTsKKwltZW0gPSBpbmRleCArIDE7CisJaGFzaCA9IG1lbTsKKwltZW0gPSBoYXNoICsgaHNpemU7CisJZW50cnkgPSBtZW07CisKKwlpbmRleC0+c3JjX2J1ZiA9IGJ1ZjsKKwlpbmRleC0+c3JjX3NpemUgPSBidWZzaXplOworCWluZGV4LT5oYXNoX21hc2sgPSBobWFzazsKKwltZW1zZXQoaGFzaCwgMCwgaHNpemUgKiBzaXplb2YoKmhhc2gpKTsKKworCS8qIGFsbG9jYXRlIGFuIGFycmF5IHRvIGNvdW50IGhhc2ggZW50cmllcyAqLworCWhhc2hfY291bnQgPSBjYWxsb2MoaHNpemUsIHNpemVvZigqaGFzaF9jb3VudCkpOworCWlmICghaGFzaF9jb3VudCkgeworCQlmcmVlKGluZGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogdGhlbiBwb3B1bGF0ZSB0aGUgaW5kZXggKi8KKwlwcmV2X3ZhbCA9IH4wOworCWZvciAoZGF0YSA9IGJ1ZmZlciArIGVudHJpZXMgKiBSQUJJTl9XSU5ET1cgLSBSQUJJTl9XSU5ET1c7CisJICAgICBkYXRhID49IGJ1ZmZlcjsKKwkgICAgIGRhdGEgLT0gUkFCSU5fV0lORE9XKSB7CisJCXVuc2lnbmVkIGludCB2YWwgPSAwOworCQlmb3IgKGkgPSAxOyBpIDw9IFJBQklOX1dJTkRPVzsgaSsrKQorCQkJdmFsID0gKCh2YWwgPDwgOCkgfCBkYXRhW2ldKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJaWYgKHZhbCA9PSBwcmV2X3ZhbCkgeworCQkJLyoga2VlcCB0aGUgbG93ZXN0IG9mIGNvbnNlY3V0aXZlIGlkZW50aWNhbCBibG9ja3MgKi8KKwkJCWVudHJ5Wy0xXS5wdHIgPSBkYXRhICsgUkFCSU5fV0lORE9XOworCQl9IGVsc2UgeworCQkJcHJldl92YWwgPSB2YWw7CisJCQlpID0gdmFsICYgaG1hc2s7CisJCQllbnRyeS0+cHRyID0gZGF0YSArIFJBQklOX1dJTkRPVzsKKwkJCWVudHJ5LT52YWwgPSB2YWw7CisJCQllbnRyeS0+bmV4dCA9IGhhc2hbaV07CisJCQloYXNoW2ldID0gZW50cnkrKzsKKwkJCWhhc2hfY291bnRbaV0rKzsKKwkJfQorCX0KKworCS8qCisJICogRGV0ZXJtaW5lIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzYW1lIGhhc2gKKwkgKiBidWNrZXQuICBUaGlzIGd1YXJkcyB1cyBhZ2FpbnN0IHBhdGhvbG9naWNhbCBkYXRhIHNldHMgY2F1c2luZworCSAqIHJlYWxseSBiYWQgaGFzaCBkaXN0cmlidXRpb24gd2l0aCBtb3N0IGVudHJpZXMgaW4gdGhlIHNhbWUgaGFzaAorCSAqIGJ1Y2tldCB0aGF0IHdvdWxkIGJyaW5nIHVzIHRvIE8obSpuKSBjb21wdXRpbmcgY29zdHMgKG0gYW5kIG4KKwkgKiBjb3JyZXNwb25kaW5nIHRvIHJlZmVyZW5jZSBhbmQgdGFyZ2V0IGJ1ZmZlciBzaXplcykuCisJICoKKwkgKiBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgaGFzaCBidWNrZXRzIGhhcyBtb3JlIGVudHJpZXMgdGhhbgorCSAqIHdlJ3JlIHdpbGxpbmcgdG8gdGVzdC4gIE90aGVyd2lzZSB3ZSBjdWxsIHRoZSBlbnRyeSBsaXN0CisJICogdW5pZm9ybWx5IHRvIHN0aWxsIHByZXNlcnZlIGEgZ29vZCByZXBhcnRpdGlvbiBhY3Jvc3MKKwkgKiB0aGUgcmVmZXJlbmNlIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykgeworCQlpZiAoaGFzaF9jb3VudFtpXSA8IEhBU0hfTElNSVQpCisJCQljb250aW51ZTsKKwkJZW50cnkgPSBoYXNoW2ldOworCQlkbyB7CisJCQlzdHJ1Y3QgaW5kZXhfZW50cnkgKmtlZXAgPSBlbnRyeTsKKwkJCWludCBza2lwID0gaGFzaF9jb3VudFtpXSAvIEhBU0hfTElNSVQgLyAyOworCQkJZG8geworCQkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCQl9IHdoaWxlKC0tc2tpcCAmJiBlbnRyeSk7CisJCQlrZWVwLT5uZXh0ID0gZW50cnk7CisJCX0gd2hpbGUoZW50cnkpOworCX0KKwlmcmVlKGhhc2hfY291bnQpOworCisJcmV0dXJuIGluZGV4OworfQorCit2b2lkIGZyZWVfZGVsdGFfaW5kZXgoc3RydWN0IGRlbHRhX2luZGV4ICppbmRleCkKK3sKKwlmcmVlKGluZGV4KTsKK30KKworLyoKKyAqIFRoZSBtYXhpbXVtIHNpemUgZm9yIGFueSBvcGNvZGUgc2VxdWVuY2UsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBoZWFkZXIKKyAqIHBsdXMgUmFiaW4gd2luZG93IHBsdXMgYmlnZ2VzdCBjb3B5LgorICovCisjZGVmaW5lIE1BWF9PUF9TSVpFCSg1ICsgNSArIDEgKyBSQUJJTl9XSU5ET1cgKyA3KQorCit2b2lkICoKK2NyZWF0ZV9kZWx0YShjb25zdCBzdHJ1Y3QgZGVsdGFfaW5kZXggKmluZGV4LAorCSAgICAgY29uc3Qgdm9pZCAqdHJnX2J1ZiwgdW5zaWduZWQgbG9uZyB0cmdfc2l6ZSwKKwkgICAgIHVuc2lnbmVkIGxvbmcgKmRlbHRhX3NpemUsIHVuc2lnbmVkIGxvbmcgbWF4X3NpemUpCit7CisJdW5zaWduZWQgaW50IGksIG91dHBvcywgb3V0c2l6ZSwgdmFsOworCWludCBpbnNjbnQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcmVmX2RhdGEsICpyZWZfdG9wLCAqZGF0YSwgKnRvcDsKKwl1bnNpZ25lZCBjaGFyICpvdXQ7CisKKwlpZiAoIXRyZ19idWYgfHwgIXRyZ19zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCW91dHBvcyA9IDA7CisJb3V0c2l6ZSA9IDgxOTI7CisJaWYgKG1heF9zaXplICYmIG91dHNpemUgPj0gbWF4X3NpemUpCisJCW91dHNpemUgPSBtYXhfc2l6ZSArIE1BWF9PUF9TSVpFICsgMTsKKwlvdXQgPSBtYWxsb2Mob3V0c2l6ZSk7CisJaWYgKCFvdXQpCisJCXJldHVybiBOVUxMOworCisJLyogc3RvcmUgcmVmZXJlbmNlIGJ1ZmZlciBzaXplICovCisJaSA9IGluZGV4LT5zcmNfc2l6ZTsKKwl3aGlsZSAoaSA+PSAweDgwKSB7CisJCW91dFtvdXRwb3MrK10gPSBpIHwgMHg4MDsKKwkJaSA+Pj0gNzsKKwl9CisJb3V0W291dHBvcysrXSA9IGk7CisKKwkvKiBzdG9yZSB0YXJnZXQgYnVmZmVyIHNpemUgKi8KKwlpID0gdHJnX3NpemU7CisJd2hpbGUgKGkgPj0gMHg4MCkgeworCQlvdXRbb3V0cG9zKytdID0gaSB8IDB4ODA7CisJCWkgPj49IDc7CisJfQorCW91dFtvdXRwb3MrK10gPSBpOworCisJcmVmX2RhdGEgPSBpbmRleC0+c3JjX2J1ZjsKKwlyZWZfdG9wID0gcmVmX2RhdGEgKyBpbmRleC0+c3JjX3NpemU7CisJZGF0YSA9IHRyZ19idWY7CisJdG9wID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdHJnX2J1ZiArIHRyZ19zaXplOworCisJb3V0cG9zKys7CisJdmFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgUkFCSU5fV0lORE9XICYmIGRhdGEgPCB0b3A7IGkrKywgZGF0YSsrKSB7CisJCW91dFtvdXRwb3MrK10gPSAqZGF0YTsKKwkJdmFsID0gKCh2YWwgPDwgOCkgfCAqZGF0YSkgXiBUW3ZhbCA+PiBSQUJJTl9TSElGVF07CisJfQorCWluc2NudCA9IGk7CisKKwl3aGlsZSAoZGF0YSA8IHRvcCkgeworCQl1bnNpZ25lZCBpbnQgbW9mZiA9IDAsIG1zaXplID0gMDsKKwkJc3RydWN0IGluZGV4X2VudHJ5ICplbnRyeTsKKwkJdmFsIF49IFVbZGF0YVstUkFCSU5fV0lORE9XXV07CisJCXZhbCA9ICgodmFsIDw8IDgpIHwgKmRhdGEpIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQlpID0gdmFsICYgaW5kZXgtPmhhc2hfbWFzazsKKwkJZm9yIChlbnRyeSA9IGluZGV4LT5oYXNoW2ldOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dCkgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmVmID0gZW50cnktPnB0cjsKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9IGRhdGE7CisJCQl1bnNpZ25lZCBpbnQgcmVmX3NpemUgPSByZWZfdG9wIC0gcmVmOworCQkJaWYgKGVudHJ5LT52YWwgIT0gdmFsKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJlZl9zaXplID4gdG9wIC0gc3JjKQorCQkJCXJlZl9zaXplID0gdG9wIC0gc3JjOworCQkJaWYgKHJlZl9zaXplID4gMHgxMDAwMCkKKwkJCQlyZWZfc2l6ZSA9IDB4MTAwMDA7CisJCQlpZiAocmVmX3NpemUgPD0gbXNpemUpCisJCQkJYnJlYWs7CisJCQl3aGlsZSAocmVmX3NpemUtLSAmJiAqc3JjKysgPT0gKnJlZikKKwkJCQlyZWYrKzsKKwkJCWlmIChtc2l6ZSA8IHJlZiAtIGVudHJ5LT5wdHIpIHsKKwkJCQkvKiB0aGlzIGlzIG91ciBiZXN0IG1hdGNoIHNvIGZhciAqLworCQkJCW1zaXplID0gcmVmIC0gZW50cnktPnB0cjsKKwkJCQltb2ZmID0gZW50cnktPnB0ciAtIHJlZl9kYXRhOworCQkJfQorCQl9CisKKwkJaWYgKG1zaXplIDwgNCkgeworCQkJaWYgKCFpbnNjbnQpCisJCQkJb3V0cG9zKys7CisJCQlvdXRbb3V0cG9zKytdID0gKmRhdGErKzsKKwkJCWluc2NudCsrOworCQkJaWYgKGluc2NudCA9PSAweDdmKSB7CisJCQkJb3V0W291dHBvcyAtIGluc2NudCAtIDFdID0gaW5zY250OworCQkJCWluc2NudCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBjaGFyICpvcDsKKworCQkJaWYgKG1zaXplID49IFJBQklOX1dJTkRPVykgeworCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNrOworCQkJCXNrID0gZGF0YSArIG1zaXplIC0gUkFCSU5fV0lORE9XOworCQkJCXZhbCA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IFJBQklOX1dJTkRPVzsgaSsrKQorCQkJCQl2YWwgPSAoKHZhbCA8PCA4KSB8ICpzaysrKSBeIFRbdmFsID4+IFJBQklOX1NISUZUXTsKKwkJCX0gZWxzZSB7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2sgPSBkYXRhICsgMTsKKwkJCQlmb3IgKGkgPSAxOyBpIDwgbXNpemU7IGkrKykgeworCQkJCQl2YWwgXj0gVVtza1stUkFCSU5fV0lORE9XXV07CisJCQkJCXZhbCA9ICgodmFsIDw8IDgpIHwgKnNrKyspIF4gVFt2YWwgPj4gUkFCSU5fU0hJRlRdOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGluc2NudCkgeworCQkJCXdoaWxlIChtb2ZmICYmIHJlZl9kYXRhW21vZmYtMV0gPT0gZGF0YVstMV0pIHsKKwkJCQkJaWYgKG1zaXplID09IDB4MTAwMDApCisJCQkJCQlicmVhazsKKwkJCQkJLyogd2UgY2FuIG1hdGNoIG9uZSBieXRlIGJhY2sgKi8KKwkJCQkJbXNpemUrKzsKKwkJCQkJbW9mZi0tOworCQkJCQlkYXRhLS07CisJCQkJCW91dHBvcy0tOworCQkJCQlpZiAoLS1pbnNjbnQpCisJCQkJCQljb250aW51ZTsKKwkJCQkJb3V0cG9zLS07ICAvKiByZW1vdmUgY291bnQgc2xvdCAqLworCQkJCQlpbnNjbnQtLTsgIC8qIG1ha2UgaXQgLTEgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW91dFtvdXRwb3MgLSBpbnNjbnQgLSAxXSA9IGluc2NudDsKKwkJCQlpbnNjbnQgPSAwOworCQkJfQorCisJCQlkYXRhICs9IG1zaXplOworCQkJb3AgPSBvdXQgKyBvdXRwb3MrKzsKKwkJCWkgPSAweDgwOworCisJCQlpZiAobW9mZiAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1vZmY7IGkgfD0gMHgwMTsgfQorCQkJbW9mZiA+Pj0gODsKKwkJCWlmIChtb2ZmICYgMHhmZikgeyBvdXRbb3V0cG9zKytdID0gbW9mZjsgaSB8PSAweDAyOyB9CisJCQltb2ZmID4+PSA4OworCQkJaWYgKG1vZmYgJiAweGZmKSB7IG91dFtvdXRwb3MrK10gPSBtb2ZmOyBpIHw9IDB4MDQ7IH0KKwkJCW1vZmYgPj49IDg7CisJCQlpZiAobW9mZiAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1vZmY7IGkgfD0gMHgwODsgfQorCisJCQlpZiAobXNpemUgJiAweGZmKSB7IG91dFtvdXRwb3MrK10gPSBtc2l6ZTsgaSB8PSAweDEwOyB9CisJCQltc2l6ZSA+Pj0gODsKKwkJCWlmIChtc2l6ZSAmIDB4ZmYpIHsgb3V0W291dHBvcysrXSA9IG1zaXplOyBpIHw9IDB4MjA7IH0KKworCQkJKm9wID0gaTsKKwkJfQorCisJCWlmIChvdXRwb3MgPj0gb3V0c2l6ZSAtIE1BWF9PUF9TSVpFKSB7CisJCQl2b2lkICp0bXAgPSBvdXQ7CisJCQlvdXRzaXplID0gb3V0c2l6ZSAqIDMgLyAyOworCQkJaWYgKG1heF9zaXplICYmIG91dHNpemUgPj0gbWF4X3NpemUpCisJCQkJb3V0c2l6ZSA9IG1heF9zaXplICsgTUFYX09QX1NJWkUgKyAxOworCQkJaWYgKG1heF9zaXplICYmIG91dHBvcyA+IG1heF9zaXplKQorCQkJCWJyZWFrOworCQkJb3V0ID0gcmVhbGxvYyhvdXQsIG91dHNpemUpOworCQkJaWYgKCFvdXQpIHsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaW5zY250KQorCQlvdXRbb3V0cG9zIC0gaW5zY250IC0gMV0gPSBpbnNjbnQ7CisKKwlpZiAobWF4X3NpemUgJiYgb3V0cG9zID4gbWF4X3NpemUpIHsKKwkJZnJlZShvdXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqZGVsdGFfc2l6ZSA9IG91dHBvczsKKwlyZXR1cm4gb3V0OworfQpkaWZmIC0tZ2l0IGEvZGlmZi1saWIuYyBiL2RpZmYtbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE2YjVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYtbGliLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorCisvKgorICogZGlmZi1maWxlcworICovCisKK2ludCBydW5fZGlmZl9maWxlcyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBzaWxlbnRfb25fcmVtb3ZlZCkKK3sKKwlpbnQgZW50cmllcywgaTsKKwlpbnQgZGlmZl91bm1lcmdlZF9zdGFnZSA9IHJldnMtPm1heF9jb3VudDsKKworCWlmIChkaWZmX3VubWVyZ2VkX3N0YWdlIDwgMCkKKwkJZGlmZl91bm1lcmdlZF9zdGFnZSA9IDI7CisJZW50cmllcyA9IHJlYWRfY2FjaGUoKTsKKwlpZiAoZW50cmllcyA8IDApIHsKKwkJcGVycm9yKCJyZWFkX2NhY2hlIik7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJdW5zaWduZWQgaW50IG9sZG1vZGUsIG5ld21vZGU7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWludCBjaGFuZ2VkOworCisJCWlmICghY2VfcGF0aF9tYXRjaChjZSwgcmV2cy0+cHJ1bmVfZGF0YSkpCisJCQljb250aW51ZTsKKworCQlpZiAoY2Vfc3RhZ2UoY2UpKSB7CisJCQlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKmRwYXRoOworCQkJaW50IG51bV9jb21wYXJlX3N0YWdlcyA9IDA7CisJCQlzaXplX3QgcGF0aF9sZW47CisKKwkJCXBhdGhfbGVuID0gY2VfbmFtZWxlbihjZSk7CisKKwkJCWRwYXRoID0geG1hbGxvYyAoY29tYmluZV9kaWZmX3BhdGhfc2l6ZSAoNSwgcGF0aF9sZW4pKTsKKwkJCWRwYXRoLT5wYXRoID0gKGNoYXIgKikgJihkcGF0aC0+cGFyZW50WzVdKTsKKworCQkJZHBhdGgtPm5leHQgPSBOVUxMOworCQkJZHBhdGgtPmxlbiA9IHBhdGhfbGVuOworCQkJbWVtY3B5KGRwYXRoLT5wYXRoLCBjZS0+bmFtZSwgcGF0aF9sZW4pOworCQkJZHBhdGgtPnBhdGhbcGF0aF9sZW5dID0gJ1wwJzsKKwkJCWRwYXRoLT5tb2RlID0gMDsKKwkJCW1lbXNldChkcGF0aC0+c2hhMSwgMCwgMjApOworCQkJbWVtc2V0KCYoZHBhdGgtPnBhcmVudFswXSksIDAsCisJCQkJCXNpemVvZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhcmVudCkqNSk7CisKKwkJCXdoaWxlIChpIDwgZW50cmllcykgeworCQkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqbmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQkJCWludCBzdGFnZTsKKworCQkJCWlmIChzdHJjbXAoY2UtPm5hbWUsIG5jZS0+bmFtZSkpCisJCQkJCWJyZWFrOworCisJCQkJLyogU3RhZ2UgIzIgKG91cnMpIGlzIHRoZSBmaXJzdCBwYXJlbnQsCisJCQkJICogc3RhZ2UgIzMgKHRoZWlycykgaXMgdGhlIHNlY29uZC4KKwkJCQkgKi8KKwkJCQlzdGFnZSA9IGNlX3N0YWdlKG5jZSk7CisJCQkJaWYgKDIgPD0gc3RhZ2UpIHsKKwkJCQkJaW50IG1vZGUgPSBudG9obChuY2UtPmNlX21vZGUpOworCQkJCQludW1fY29tcGFyZV9zdGFnZXMrKzsKKwkJCQkJbWVtY3B5KGRwYXRoLT5wYXJlbnRbc3RhZ2UtMl0uc2hhMSwKKwkJCQkJICAgICAgIG5jZS0+c2hhMSwgMjApOworCQkJCQlkcGF0aC0+cGFyZW50W3N0YWdlLTJdLm1vZGUgPQorCQkJCQkJY2Fub25fbW9kZShtb2RlKTsKKwkJCQkJZHBhdGgtPnBhcmVudFtzdGFnZS0yXS5zdGF0dXMgPQorCQkJCQkJRElGRl9TVEFUVVNfTU9ESUZJRUQ7CisJCQkJfQorCisJCQkJLyogZGlmZiBhZ2FpbnN0IHRoZSBwcm9wZXIgdW5tZXJnZWQgc3RhZ2UgKi8KKwkJCQlpZiAoc3RhZ2UgPT0gZGlmZl91bm1lcmdlZF9zdGFnZSkKKwkJCQkJY2UgPSBuY2U7CisJCQkJaSsrOworCQkJfQorCQkJLyoKKwkJCSAqIENvbXBlbnNhdGUgZm9yIGxvb3AgdXBkYXRlCisJCQkgKi8KKwkJCWktLTsKKworCQkJaWYgKHJldnMtPmNvbWJpbmVfbWVyZ2VzICYmIG51bV9jb21wYXJlX3N0YWdlcyA9PSAyKSB7CisJCQkJc2hvd19jb21iaW5lZF9kaWZmKGRwYXRoLCAyLAorCQkJCQkJICAgcmV2cy0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLAorCQkJCQkJICAgcmV2cyk7CisJCQkJZnJlZShkcGF0aCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmcmVlKGRwYXRoKTsKKwkJCWRwYXRoID0gTlVMTDsKKworCQkJLyoKKwkJCSAqIFNob3cgdGhlIGRpZmYgZm9yIHRoZSAnY2UnIGlmIHdlIGZvdW5kIHRoZSBvbmUKKwkJCSAqIGZyb20gdGhlIGRlc2lyZWQgc3RhZ2UuCisJCQkgKi8KKwkJCWRpZmZfdW5tZXJnZSgmcmV2cy0+ZGlmZm9wdCwgY2UtPm5hbWUpOworCQkJaWYgKGNlX3N0YWdlKGNlKSAhPSBkaWZmX3VubWVyZ2VkX3N0YWdlKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKSB7CisJCQkJcGVycm9yKGNlLT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChzaWxlbnRfb25fcmVtb3ZlZCkKKwkJCQljb250aW51ZTsKKwkJCWRpZmZfYWRkcmVtb3ZlKCZyZXZzLT5kaWZmb3B0LCAnLScsIG50b2hsKGNlLT5jZV9tb2RlKSwKKwkJCQkgICAgICAgY2UtPnNoYTEsIGNlLT5uYW1lLCBOVUxMKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDApOworCQlpZiAoIWNoYW5nZWQgJiYgIXJldnMtPmRpZmZvcHQuZmluZF9jb3BpZXNfaGFyZGVyKQorCQkJY29udGludWU7CisJCW9sZG1vZGUgPSBudG9obChjZS0+Y2VfbW9kZSk7CisKKwkJbmV3bW9kZSA9IGNhbm9uX21vZGUoc3Quc3RfbW9kZSk7CisJCWlmICghdHJ1c3RfZXhlY3V0YWJsZV9iaXQgJiYKKwkJICAgIFNfSVNSRUcobmV3bW9kZSkgJiYgU19JU1JFRyhvbGRtb2RlKSAmJgorCQkgICAgKChuZXdtb2RlIF4gb2xkbW9kZSkgPT0gMDExMSkpCisJCQluZXdtb2RlID0gb2xkbW9kZTsKKwkJZGlmZl9jaGFuZ2UoJnJldnMtPmRpZmZvcHQsIG9sZG1vZGUsIG5ld21vZGUsCisJCQkgICAgY2UtPnNoYTEsIChjaGFuZ2VkID8gbnVsbF9zaGExIDogY2UtPnNoYTEpLAorCQkJICAgIGNlLT5uYW1lLCBOVUxMKTsKKworCX0KKwlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCXJldHVybiAwOworfQorCisvKgorICogZGlmZi1pbmRleAorICovCisKKy8qIEEgZmlsZSBlbnRyeSB3ZW50IGF3YXkgb3IgYXBwZWFyZWQgKi8KK3N0YXRpYyB2b2lkIGRpZmZfaW5kZXhfc2hvd19maWxlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCQkgY29uc3QgY2hhciAqcHJlZml4LAorCQkJCSBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLAorCQkJCSB1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlkaWZmX2FkZHJlbW92ZSgmcmV2cy0+ZGlmZm9wdCwgcHJlZml4WzBdLCBudG9obChtb2RlKSwKKwkJICAgICAgIHNoYTEsIGNlLT5uYW1lLCBOVUxMKTsKK30KKworc3RhdGljIGludCBnZXRfc3RhdF9kYXRhKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsCisJCQkgdW5zaWduZWQgY2hhciAqKnNoYTFwLAorCQkJIHVuc2lnbmVkIGludCAqbW9kZXAsCisJCQkgaW50IGNhY2hlZCwgaW50IG1hdGNoX21pc3NpbmcpCit7CisJdW5zaWduZWQgY2hhciAqc2hhMSA9IGNlLT5zaGExOworCXVuc2lnbmVkIGludCBtb2RlID0gY2UtPmNlX21vZGU7CisKKwlpZiAoIWNhY2hlZCkgeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBub19zaGExWzIwXTsKKwkJaW50IGNoYW5nZWQ7CisJCXN0cnVjdCBzdGF0IHN0OworCQlpZiAobHN0YXQoY2UtPm5hbWUsICZzdCkgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5PRU5UICYmIG1hdGNoX21pc3NpbmcpIHsKKwkJCQkqc2hhMXAgPSBzaGExOworCQkJCSptb2RlcCA9IG1vZGU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgMCk7CisJCWlmIChjaGFuZ2VkKSB7CisJCQltb2RlID0gY3JlYXRlX2NlX21vZGUoc3Quc3RfbW9kZSk7CisJCQlpZiAoIXRydXN0X2V4ZWN1dGFibGVfYml0ICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCQkJbW9kZSA9IGNlLT5jZV9tb2RlOworCQkJc2hhMSA9IG5vX3NoYTE7CisJCX0KKwl9CisKKwkqc2hhMXAgPSBzaGExOworCSptb2RlcCA9IG1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbmV3X2ZpbGUoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkJICBzdHJ1Y3QgY2FjaGVfZW50cnkgKm5ldywKKwkJCSAgaW50IGNhY2hlZCwgaW50IG1hdGNoX21pc3NpbmcpCit7CisJdW5zaWduZWQgY2hhciAqc2hhMTsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCS8qIE5ldyBmaWxlIGluIHRoZSBpbmRleDogaXQgbWlnaHQgYWN0dWFsbHkgYmUgZGlmZmVyZW50IGluCisJICogdGhlIHdvcmtpbmcgY29weS4KKwkgKi8KKwlpZiAoZ2V0X3N0YXRfZGF0YShuZXcsICZzaGExLCAmbW9kZSwgY2FjaGVkLCBtYXRjaF9taXNzaW5nKSA8IDApCisJCXJldHVybjsKKworCWRpZmZfaW5kZXhfc2hvd19maWxlKHJldnMsICIrIiwgbmV3LCBzaGExLCBtb2RlKTsKK30KKworc3RhdGljIGludCBzaG93X21vZGlmaWVkKHN0cnVjdCByZXZfaW5mbyAqcmV2cywKKwkJCSBzdHJ1Y3QgY2FjaGVfZW50cnkgKm9sZCwKKwkJCSBzdHJ1Y3QgY2FjaGVfZW50cnkgKm5ldywKKwkJCSBpbnQgcmVwb3J0X21pc3NpbmcsCisJCQkgaW50IGNhY2hlZCwgaW50IG1hdGNoX21pc3NpbmcpCit7CisJdW5zaWduZWQgaW50IG1vZGUsIG9sZG1vZGU7CisJdW5zaWduZWQgY2hhciAqc2hhMTsKKworCWlmIChnZXRfc3RhdF9kYXRhKG5ldywgJnNoYTEsICZtb2RlLCBjYWNoZWQsIG1hdGNoX21pc3NpbmcpIDwgMCkgeworCQlpZiAocmVwb3J0X21pc3NpbmcpCisJCQlkaWZmX2luZGV4X3Nob3dfZmlsZShyZXZzLCAiLSIsIG9sZCwKKwkJCQkJICAgICBvbGQtPnNoYTEsIG9sZC0+Y2VfbW9kZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlvbGRtb2RlID0gb2xkLT5jZV9tb2RlOworCWlmIChtb2RlID09IG9sZG1vZGUgJiYgIW1lbWNtcChzaGExLCBvbGQtPnNoYTEsIDIwKSAmJgorCSAgICAhcmV2cy0+ZGlmZm9wdC5maW5kX2NvcGllc19oYXJkZXIpCisJCXJldHVybiAwOworCisJbW9kZSA9IG50b2hsKG1vZGUpOworCW9sZG1vZGUgPSBudG9obChvbGRtb2RlKTsKKworCWRpZmZfY2hhbmdlKCZyZXZzLT5kaWZmb3B0LCBvbGRtb2RlLCBtb2RlLAorCQkgICAgb2xkLT5zaGExLCBzaGExLCBvbGQtPm5hbWUsIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpZmZfY2FjaGUoc3RydWN0IHJldl9pbmZvICpyZXZzLAorCQkgICAgICBzdHJ1Y3QgY2FjaGVfZW50cnkgKiphYywgaW50IGVudHJpZXMsCisJCSAgICAgIGNvbnN0IGNoYXIgKipwYXRoc3BlYywKKwkJICAgICAgaW50IGNhY2hlZCwgaW50IG1hdGNoX21pc3NpbmcpCit7CisJd2hpbGUgKGVudHJpZXMpIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9ICphYzsKKwkJaW50IHNhbWUgPSAoZW50cmllcyA+IDEpICYmIGNlX3NhbWVfbmFtZShjZSwgYWNbMV0pOworCisJCWlmICghY2VfcGF0aF9tYXRjaChjZSwgcGF0aHNwZWMpKQorCQkJZ290byBza2lwX2VudHJ5OworCisJCXN3aXRjaCAoY2Vfc3RhZ2UoY2UpKSB7CisJCWNhc2UgMDoKKwkJCS8qIE5vIHN0YWdlIDEgZW50cnk/IFRoYXQgbWVhbnMgaXQncyBhIG5ldyBmaWxlICovCisJCQlpZiAoIXNhbWUpIHsKKwkJCQlzaG93X25ld19maWxlKHJldnMsIGNlLCBjYWNoZWQsIG1hdGNoX21pc3NpbmcpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU2hvdyBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIGFuZCBuZXcgKi8KKwkJCXNob3dfbW9kaWZpZWQocmV2cyxhY1sxXSwgY2UsIDEsCisJCQkJICAgICAgY2FjaGVkLCBtYXRjaF9taXNzaW5nKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiBObyBzdGFnZSAzIChtZXJnZSkgZW50cnk/CisJCQkgKiBUaGF0IG1lYW5zIGl0J3MgYmVlbiBkZWxldGVkLgorCQkJICovCisJCQlpZiAoIXNhbWUpIHsKKwkJCQlkaWZmX2luZGV4X3Nob3dfZmlsZShyZXZzLCAiLSIsIGNlLAorCQkJCQkJICAgICBjZS0+c2hhMSwgY2UtPmNlX21vZGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogV2UgY29tZSBoZXJlIHdpdGggY2UgcG9pbnRpbmcgYXQgc3RhZ2UgMQorCQkJICogKG9yaWdpbmFsIHRyZWUpIGFuZCBhY1sxXSBwb2ludGluZyBhdCBzdGFnZQorCQkJICogMyAodW5tZXJnZWQpLiAgc2hvdy1tb2RpZmllZCB3aXRoCisJCQkgKiByZXBvcnQtbWlzc2luZyBzZXQgdG8gZmFsc2UgZG9lcyBub3Qgc2F5IHRoZQorCQkJICogZmlsZSBpcyBkZWxldGVkIGJ1dCByZXBvcnRzIHRydWUgaWYgd29yaworCQkJICogdHJlZSBkb2VzIG5vdCBoYXZlIGl0LCBpbiB3aGljaCBjYXNlIHdlCisJCQkgKiBmYWxsIHRocm91Z2ggdG8gcmVwb3J0IHRoZSB1bm1lcmdlZCBzdGF0ZS4KKwkJCSAqIE90aGVyd2lzZSwgd2Ugc2hvdyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbgorCQkJICogdGhlIG9yaWdpbmFsIHRyZWUgYW5kIHRoZSB3b3JrIHRyZWUuCisJCQkgKi8KKwkJCWlmICghY2FjaGVkICYmCisJCQkgICAgIXNob3dfbW9kaWZpZWQocmV2cywgY2UsIGFjWzFdLCAwLAorCQkJCQkgICBjYWNoZWQsIG1hdGNoX21pc3NpbmcpKQorCQkJCWJyZWFrOworCQkJLyogZmFsbHRocnUgKi8KKwkJY2FzZSAzOgorCQkJZGlmZl91bm1lcmdlKCZyZXZzLT5kaWZmb3B0LCBjZS0+bmFtZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGllKCJpbXBvc3NpYmxlIGNhY2hlIGVudHJ5IHN0YWdlIik7CisJCX0KKworc2tpcF9lbnRyeToKKwkJLyoKKwkJICogSWdub3JlIGFsbCB0aGUgZGlmZmVyZW50IHN0YWdlcyBmb3IgdGhpcyBmaWxlLAorCQkgKiB3ZSd2ZSBoYW5kbGVkIHRoZSByZWxldmFudCBjYXNlcyBub3cuCisJCSAqLworCQlkbyB7CisJCQlhYysrOworCQkJZW50cmllcy0tOworCQl9IHdoaWxlIChlbnRyaWVzICYmIGNlX3NhbWVfbmFtZShjZSwgYWNbMF0pKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHR1cm5zIGFsbCBtZXJnZSBlbnRyaWVzIGludG8gInN0YWdlIDMiLiBUaGF0IGd1YXJhbnRlZXMgdGhhdAorICogd2hlbiB3ZSByZWFkIGluIHRoZSBuZXcgdHJlZSAoaW50byAic3RhZ2UgMSIpLCB3ZSB3b24ndCBsb3NlIHNpZ2h0CisgKiBvZiB0aGUgZmFjdCB0aGF0IHdlIGhhZCB1bm1lcmdlZCBlbnRyaWVzLgorICovCitzdGF0aWMgdm9pZCBtYXJrX21lcmdlX2VudHJpZXModm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtpXTsKKwkJaWYgKCFjZV9zdGFnZShjZSkpCisJCQljb250aW51ZTsKKwkJY2UtPmNlX2ZsYWdzIHw9IGh0b25zKENFX1NUQUdFTUFTSyk7CisJfQorfQorCitpbnQgcnVuX2RpZmZfaW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgY2FjaGVkKQoreworCWludCByZXQ7CisJc3RydWN0IG9iamVjdCAqZW50OworCXN0cnVjdCB0cmVlICp0cmVlOworCWNvbnN0IGNoYXIgKnRyZWVfbmFtZTsKKwlpbnQgbWF0Y2hfbWlzc2luZyA9IDA7CisKKwkvKiAKKwkgKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdhcnQgLSAiZGlmZi1pbmRleCAtbSIgZG9lcworCSAqIG5vdCBtZWFuICJkbyBub3QgaWdub3JlIG1lcmdlcyIsIGJ1dCB0b3RhbGx5IGRpZmZlcmVudC4KKwkgKi8KKwlpZiAoIXJldnMtPmlnbm9yZV9tZXJnZXMpCisJCW1hdGNoX21pc3NpbmcgPSAxOworCisJaWYgKHJlYWRfY2FjaGUoKSA8IDApIHsKKwkJcGVycm9yKCJyZWFkX2NhY2hlIik7CisJCXJldHVybiAtMTsKKwl9CisJbWFya19tZXJnZV9lbnRyaWVzKCk7CisKKwllbnQgPSByZXZzLT5wZW5kaW5nLm9iamVjdHNbMF0uaXRlbTsKKwl0cmVlX25hbWUgPSByZXZzLT5wZW5kaW5nLm9iamVjdHNbMF0ubmFtZTsKKwl0cmVlID0gcGFyc2VfdHJlZV9pbmRpcmVjdChlbnQtPnNoYTEpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIGVycm9yKCJiYWQgdHJlZSBvYmplY3QgJXMiLCB0cmVlX25hbWUpOworCWlmIChyZWFkX3RyZWUodHJlZSwgMSwgcmV2cy0+cHJ1bmVfZGF0YSkpCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlYWQgdHJlZSBvYmplY3QgJXMiLCB0cmVlX25hbWUpOworCXJldCA9IGRpZmZfY2FjaGUocmV2cywgYWN0aXZlX2NhY2hlLCBhY3RpdmVfbnIsIHJldnMtPnBydW5lX2RhdGEsCisJCQkgY2FjaGVkLCBtYXRjaF9taXNzaW5nKTsKKwlkaWZmY29yZV9zdGQoJnJldnMtPmRpZmZvcHQpOworCWRpZmZfZmx1c2goJnJldnMtPmRpZmZvcHQpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kaWZmLmMgYi9kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiMTc4MQotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYuYwpAQCAtMCwwICsxLDI1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorI2luY2x1ZGUgImRlbHRhLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisKK3N0YXRpYyBpbnQgdXNlX3NpemVfY2FjaGU7CisKK3N0YXRpYyBpbnQgZGlmZl9kZXRlY3RfcmVuYW1lX2RlZmF1bHQgPSAwOworc3RhdGljIGludCBkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0ID0gLTE7CitzdGF0aWMgaW50IGRpZmZfdXNlX2NvbG9yX2RlZmF1bHQgPSAwOworCisvKiAiXDAzM1sxOzM4OzU7Mnh4OzQ4OzU7Mnh4bVwwIiBpcyAyMyBieXRlcyAqLworc3RhdGljIGNoYXIgZGlmZl9jb2xvcnNbXVsyNF0gPSB7CisJIlwwMzNbbSIsCS8qIHJlc2V0ICovCisJIiIsCQkvKiBub3JtYWwgKi8KKwkiXDAzM1sxbSIsCS8qIGJvbGQgKi8KKwkiXDAzM1szNm0iLAkvKiBjeWFuICovCisJIlwwMzNbMzFtIiwJLyogcmVkICovCisJIlwwMzNbMzJtIiwJLyogZ3JlZW4gKi8KKwkiXDAzM1szM20iCS8qIHllbGxvdyAqLworfTsKKworc3RhdGljIGludCBwYXJzZV9kaWZmX2NvbG9yX3Nsb3QoY29uc3QgY2hhciAqdmFyLCBpbnQgb2ZzKQoreworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAicGxhaW4iKSkKKwkJcmV0dXJuIERJRkZfUExBSU47CisJaWYgKCFzdHJjYXNlY21wKHZhcitvZnMsICJtZXRhIikpCisJCXJldHVybiBESUZGX01FVEFJTkZPOworCWlmICghc3RyY2FzZWNtcCh2YXIrb2ZzLCAiZnJhZyIpKQorCQlyZXR1cm4gRElGRl9GUkFHSU5GTzsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgIm9sZCIpKQorCQlyZXR1cm4gRElGRl9GSUxFX09MRDsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgIm5ldyIpKQorCQlyZXR1cm4gRElGRl9GSUxFX05FVzsKKwlpZiAoIXN0cmNhc2VjbXAodmFyK29mcywgImNvbW1pdCIpKQorCQlyZXR1cm4gRElGRl9DT01NSVQ7CisJZGllKCJiYWQgY29uZmlnIHZhcmlhYmxlICclcyciLCB2YXIpOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NvbG9yKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9uYW1lc1tdID0geworCQkibm9ybWFsIiwgImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLAorCQkiYmx1ZSIsICJtYWdlbnRhIiwgImN5YW4iLCAid2hpdGUiCisJfTsKKwljaGFyICplbmQ7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfbmFtZXMpOyBpKyspIHsKKwkJY29uc3QgY2hhciAqc3RyID0gY29sb3JfbmFtZXNbaV07CisJCWlmICghc3RybmNhc2VjbXAobmFtZSwgc3RyLCBsZW4pICYmICFzdHJbbGVuXSkKKwkJCXJldHVybiBpIC0gMTsKKwl9CisJaSA9IHN0cnRvbChuYW1lLCAmZW5kLCAxMCk7CisJaWYgKCpuYW1lICYmICEqZW5kICYmIGkgPj0gLTEgJiYgaSA8PSAyNTUpCisJCXJldHVybiBpOworCXJldHVybiAtMjsKK30KKworc3RhdGljIGludCBwYXJzZV9hdHRyKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RhdGljIGNvbnN0IGludCBhdHRyX3ZhbHVlc1tdID0geyAxLCAyLCA0LCA1LCA3IH07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHRyX25hbWVzW10gPSB7CisJCSJib2xkIiwgImRpbSIsICJ1bCIsICJibGluayIsICJyZXZlcnNlIgorCX07CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXR0cl9uYW1lcyk7IGkrKykgeworCQljb25zdCBjaGFyICpzdHIgPSBhdHRyX25hbWVzW2ldOworCQlpZiAoIXN0cm5jYXNlY21wKG5hbWUsIHN0ciwgbGVuKSAmJiAhc3RyW2xlbl0pCisJCQlyZXR1cm4gYXR0cl92YWx1ZXNbaV07CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZGlmZl9jb2xvcl92YWx1ZShjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqdmFyLCBjaGFyICpkc3QpCit7CisJY29uc3QgY2hhciAqcHRyID0gdmFsdWU7CisJaW50IGF0dHIgPSAtMTsKKwlpbnQgZmcgPSAtMjsKKwlpbnQgYmcgPSAtMjsKKworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInJlc2V0IikpIHsKKwkJc3RyY3B5KGRzdCwgIlwwMzNbbSIpOworCQlyZXR1cm47CisJfQorCisJLyogW2ZnIFtiZ11dIFthdHRyXSAqLworCXdoaWxlICgqcHRyKSB7CisJCWNvbnN0IGNoYXIgKndvcmQgPSBwdHI7CisJCWludCB2YWwsIGxlbiA9IDA7CisKKwkJd2hpbGUgKHdvcmRbbGVuXSAmJiAhaXNzcGFjZSh3b3JkW2xlbl0pKQorCQkJbGVuKys7CisKKwkJcHRyID0gd29yZCArIGxlbjsKKwkJd2hpbGUgKCpwdHIgJiYgaXNzcGFjZSgqcHRyKSkKKwkJCXB0cisrOworCisJCXZhbCA9IHBhcnNlX2NvbG9yKHdvcmQsIGxlbik7CisJCWlmICh2YWwgPj0gLTEpIHsKKwkJCWlmIChmZyA9PSAtMikgeworCQkJCWZnID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGJnID09IC0yKSB7CisJCQkJYmcgPSB2YWw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlnb3RvIGJhZDsKKwkJfQorCQl2YWwgPSBwYXJzZV9hdHRyKHdvcmQsIGxlbik7CisJCWlmICh2YWwgPCAwIHx8IGF0dHIgIT0gLTEpCisJCQlnb3RvIGJhZDsKKwkJYXR0ciA9IHZhbDsKKwl9CisKKwlpZiAoYXR0ciA+PSAwIHx8IGZnID49IDAgfHwgYmcgPj0gMCkgeworCQlpbnQgc2VwID0gMDsKKworCQkqZHN0KysgPSAnXDAzMyc7CisJCSpkc3QrKyA9ICdbJzsKKwkJaWYgKGF0dHIgPj0gMCkgeworCQkJKmRzdCsrID0gJzAnICsgYXR0cjsKKwkJCXNlcCsrOworCQl9CisJCWlmIChmZyA+PSAwKSB7CisJCQlpZiAoc2VwKyspCisJCQkJKmRzdCsrID0gJzsnOworCQkJaWYgKGZnIDwgOCkgeworCQkJCSpkc3QrKyA9ICczJzsKKwkJCQkqZHN0KysgPSAnMCcgKyBmZzsKKwkJCX0gZWxzZSB7CisJCQkJZHN0ICs9IHNwcmludGYoZHN0LCAiMzg7NTslZCIsIGZnKTsKKwkJCX0KKwkJfQorCQlpZiAoYmcgPj0gMCkgeworCQkJaWYgKHNlcCsrKQorCQkJCSpkc3QrKyA9ICc7JzsKKwkJCWlmIChiZyA8IDgpIHsKKwkJCQkqZHN0KysgPSAnNCc7CisJCQkJKmRzdCsrID0gJzAnICsgYmc7CisJCQl9IGVsc2UgeworCQkJCWRzdCArPSBzcHJpbnRmKGRzdCwgIjQ4OzU7JWQiLCBiZyk7CisJCQl9CisJCX0KKwkJKmRzdCsrID0gJ20nOworCX0KKwkqZHN0ID0gMDsKKwlyZXR1cm47CitiYWQ6CisJZGllKCJiYWQgY29uZmlnIHZhbHVlICclcycgZm9yIHZhcmlhYmxlICclcyciLCB2YWx1ZSwgdmFyKTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0byBnaXZlIFVJIGxheWVyIGRlZmF1bHRzLgorICogVGhlIGNvcmUtbGV2ZWwgY29tbWFuZHMgc3VjaCBhcyBnaXQtZGlmZi1maWxlcyBzaG91bGQKKyAqIG5ldmVyIGJlIGFmZmVjdGVkIGJ5IHRoZSBzZXR0aW5nIG9mIGRpZmYucmVuYW1lcworICogdGhlIHVzZXIgaGFwcGVucyB0byBoYXZlIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgKi8KK2ludCBnaXRfZGlmZl91aV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJkaWZmLnJlbmFtZWxpbWl0IikpIHsKKwkJZGlmZl9yZW5hbWVfbGltaXRfZGVmYXVsdCA9IGdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAiZGlmZi5jb2xvciIpKSB7CisJCWlmICghdmFsdWUpCisJCQlkaWZmX3VzZV9jb2xvcl9kZWZhdWx0ID0gMTsgLyogYm9vbCAqLworCQllbHNlIGlmICghc3RyY2FzZWNtcCh2YWx1ZSwgImF1dG8iKSkgeworCQkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IDA7CisJCQlpZiAoaXNhdHR5KDEpIHx8IChwYWdlcl9pbl91c2UgJiYgcGFnZXJfdXNlX2NvbG9yKSkgeworCQkJCWNoYXIgKnRlcm0gPSBnZXRlbnYoIlRFUk0iKTsKKwkJCQlpZiAodGVybSAmJiBzdHJjbXAodGVybSwgImR1bWIiKSkKKwkJCQkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IDE7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJuZXZlciIpKQorCQkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IDA7CisJCWVsc2UgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYWx3YXlzIikpCisJCQlkaWZmX3VzZV9jb2xvcl9kZWZhdWx0ID0gMTsKKwkJZWxzZQorCQkJZGlmZl91c2VfY29sb3JfZGVmYXVsdCA9IGdpdF9jb25maWdfYm9vbCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghc3RyY21wKHZhciwgImRpZmYucmVuYW1lcyIpKSB7CisJCWlmICghdmFsdWUpCisJCQlkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdCA9IERJRkZfREVURUNUX1JFTkFNRTsKKwkJZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJjb3BpZXMiKSB8fAorCQkJICFzdHJjYXNlY21wKHZhbHVlLCAiY29weSIpKQorCQkJZGlmZl9kZXRlY3RfcmVuYW1lX2RlZmF1bHQgPSBESUZGX0RFVEVDVF9DT1BZOworCQllbHNlIGlmIChnaXRfY29uZmlnX2Jvb2wodmFyLHZhbHVlKSkKKwkJCWRpZmZfZGV0ZWN0X3JlbmFtZV9kZWZhdWx0ID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJuY21wKHZhciwgImRpZmYuY29sb3IuIiwgMTEpKSB7CisJCWludCBzbG90ID0gcGFyc2VfZGlmZl9jb2xvcl9zbG90KHZhciwgMTEpOworCQlwYXJzZV9kaWZmX2NvbG9yX3ZhbHVlKHZhbHVlLCB2YXIsIGRpZmZfY29sb3JzW3Nsb3RdKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBnaXRfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBjaGFyICpxdW90ZV9vbmUoY29uc3QgY2hhciAqc3RyKQoreworCWludCBuZWVkbGVuOworCWNoYXIgKnhwOworCisJaWYgKCFzdHIpCisJCXJldHVybiBOVUxMOworCW5lZWRsZW4gPSBxdW90ZV9jX3N0eWxlKHN0ciwgTlVMTCwgTlVMTCwgMCk7CisJaWYgKCFuZWVkbGVuKQorCQlyZXR1cm4gc3RyZHVwKHN0cik7CisJeHAgPSB4bWFsbG9jKG5lZWRsZW4gKyAxKTsKKwlxdW90ZV9jX3N0eWxlKHN0ciwgeHAsIE5VTEwsIDApOworCXJldHVybiB4cDsKK30KKworc3RhdGljIGNoYXIgKnF1b3RlX3R3byhjb25zdCBjaGFyICpvbmUsIGNvbnN0IGNoYXIgKnR3bykKK3sKKwlpbnQgbmVlZF9vbmUgPSBxdW90ZV9jX3N0eWxlKG9uZSwgTlVMTCwgTlVMTCwgMSk7CisJaW50IG5lZWRfdHdvID0gcXVvdGVfY19zdHlsZSh0d28sIE5VTEwsIE5VTEwsIDEpOworCWNoYXIgKnhwOworCisJaWYgKG5lZWRfb25lICsgbmVlZF90d28pIHsKKwkJaWYgKCFuZWVkX29uZSkgbmVlZF9vbmUgPSBzdHJsZW4ob25lKTsKKwkJaWYgKCFuZWVkX3R3bykgbmVlZF9vbmUgPSBzdHJsZW4odHdvKTsKKworCQl4cCA9IHhtYWxsb2MobmVlZF9vbmUgKyBuZWVkX3R3byArIDMpOworCQl4cFswXSA9ICciJzsKKwkJcXVvdGVfY19zdHlsZShvbmUsIHhwICsgMSwgTlVMTCwgMSk7CisJCXF1b3RlX2Nfc3R5bGUodHdvLCB4cCArIG5lZWRfb25lICsgMSwgTlVMTCwgMSk7CisJCXN0cmNweSh4cCArIG5lZWRfb25lICsgbmVlZF90d28gKyAxLCAiXCIiKTsKKwkJcmV0dXJuIHhwOworCX0KKwluZWVkX29uZSA9IHN0cmxlbihvbmUpOworCW5lZWRfdHdvID0gc3RybGVuKHR3byk7CisJeHAgPSB4bWFsbG9jKG5lZWRfb25lICsgbmVlZF90d28gKyAxKTsKKwlzdHJjcHkoeHAsIG9uZSk7CisJc3RyY3B5KHhwICsgbmVlZF9vbmUsIHR3byk7CisJcmV0dXJuIHhwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZXJuYWxfZGlmZih2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpleHRlcm5hbF9kaWZmX2NtZCA9IE5VTEw7CisJc3RhdGljIGludCBkb25lX3ByZXBhcmluZyA9IDA7CisKKwlpZiAoZG9uZV9wcmVwYXJpbmcpCisJCXJldHVybiBleHRlcm5hbF9kaWZmX2NtZDsKKwlleHRlcm5hbF9kaWZmX2NtZCA9IGdldGVudigiR0lUX0VYVEVSTkFMX0RJRkYiKTsKKwlkb25lX3ByZXBhcmluZyA9IDE7CisJcmV0dXJuIGV4dGVybmFsX2RpZmZfY21kOworfQorCisjZGVmaW5lIFRFTVBGSUxFX1BBVEhfTEVOCQk1MAorCitzdGF0aWMgc3RydWN0IGRpZmZfdGVtcGZpbGUgeworCWNvbnN0IGNoYXIgKm5hbWU7IC8qIGZpbGVuYW1lIGV4dGVybmFsIGRpZmYgc2hvdWxkIHJlYWQgZnJvbSAqLworCWNoYXIgaGV4WzQxXTsKKwljaGFyIG1vZGVbMTBdOworCWNoYXIgdG1wX3BhdGhbVEVNUEZJTEVfUEFUSF9MRU5dOworfSBkaWZmX3RlbXBbMl07CisKK3N0YXRpYyBpbnQgY291bnRfbGluZXMoY29uc3QgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGNvdW50LCBjaCwgY29tcGxldGVseV9lbXB0eSA9IDEsIG5sX2p1c3Rfc2VlbiA9IDA7CisJY291bnQgPSAwOworCXdoaWxlICgwIDwgc2l6ZS0tKSB7CisJCWNoID0gKmRhdGErKzsKKwkJaWYgKGNoID09ICdcbicpIHsKKwkJCWNvdW50Kys7CisJCQlubF9qdXN0X3NlZW4gPSAxOworCQkJY29tcGxldGVseV9lbXB0eSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQlubF9qdXN0X3NlZW4gPSAwOworCQkJY29tcGxldGVseV9lbXB0eSA9IDA7CisJCX0KKwl9CisJaWYgKGNvbXBsZXRlbHlfZW1wdHkpCisJCXJldHVybiAwOworCWlmICghbmxfanVzdF9zZWVuKQorCQljb3VudCsrOyAvKiBubyB0cmFpbGluZyBuZXdsaW5lICovCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCBwcmludF9saW5lX2NvdW50KGludCBjb3VudCkKK3sKKwlzd2l0Y2ggKGNvdW50KSB7CisJY2FzZSAwOgorCQlwcmludGYoIjAsMCIpOworCQlicmVhazsKKwljYXNlIDE6CisJCXByaW50ZigiMSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIjEsJWQiLCBjb3VudCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgY29weV9maWxlKGludCBwcmVmaXgsIGNvbnN0IGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCWludCBjaCwgbmxfanVzdF9zZWVuID0gMTsKKwl3aGlsZSAoMCA8IHNpemUtLSkgeworCQljaCA9ICpkYXRhKys7CisJCWlmIChubF9qdXN0X3NlZW4pCisJCQlwdXRjaGFyKHByZWZpeCk7CisJCXB1dGNoYXIoY2gpOworCQlpZiAoY2ggPT0gJ1xuJykKKwkJCW5sX2p1c3Rfc2VlbiA9IDE7CisJCWVsc2UKKwkJCW5sX2p1c3Rfc2VlbiA9IDA7CisJfQorCWlmICghbmxfanVzdF9zZWVuKQorCQlwcmludGYoIlxuXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfcmV3cml0ZV9kaWZmKGNvbnN0IGNoYXIgKm5hbWVfYSwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWVfYiwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvKQoreworCWludCBsY19hLCBsY19iOworCWRpZmZfcG9wdWxhdGVfZmlsZXNwZWMob25lLCAwKTsKKwlkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHR3bywgMCk7CisJbGNfYSA9IGNvdW50X2xpbmVzKG9uZS0+ZGF0YSwgb25lLT5zaXplKTsKKwlsY19iID0gY291bnRfbGluZXModHdvLT5kYXRhLCB0d28tPnNpemUpOworCXByaW50ZigiLS0tICVzXG4rKysgJXNcbkBAIC0iLCBuYW1lX2EsIG5hbWVfYik7CisJcHJpbnRfbGluZV9jb3VudChsY19hKTsKKwlwcmludGYoIiArIik7CisJcHJpbnRfbGluZV9jb3VudChsY19iKTsKKwlwcmludGYoIiBAQFxuIik7CisJaWYgKGxjX2EpCisJCWNvcHlfZmlsZSgnLScsIG9uZS0+ZGF0YSwgb25lLT5zaXplKTsKKwlpZiAobGNfYikKKwkJY29weV9maWxlKCcrJywgdHdvLT5kYXRhLCB0d28tPnNpemUpOworfQorCitzdGF0aWMgaW50IGZpbGxfbW1maWxlKG1tZmlsZV90ICptZiwgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSkKK3sKKwlpZiAoIURJRkZfRklMRV9WQUxJRChvbmUpKSB7CisJCW1mLT5wdHIgPSAoY2hhciAqKSIiOyAvKiBkb2VzIG5vdCBtYXR0ZXIgKi8KKwkJbWYtPnNpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQlyZXR1cm4gLTE7CisJbWYtPnB0ciA9IG9uZS0+ZGF0YTsKKwltZi0+c2l6ZSA9IG9uZS0+c2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGVtaXRfY2FsbGJhY2sgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCWludCBucGFyZW50cywgY29sb3JfZGlmZjsKKwljb25zdCBjaGFyICoqbGFiZWxfcGF0aDsKK307CisKK2NvbnN0IGNoYXIgKmRpZmZfZ2V0X2NvbG9yKGludCBkaWZmX3VzZV9jb2xvciwgZW51bSBjb2xvcl9kaWZmIGl4KQoreworCWlmIChkaWZmX3VzZV9jb2xvcikKKwkJcmV0dXJuIGRpZmZfY29sb3JzW2l4XTsKKwlyZXR1cm4gIiI7Cit9CisKK3N0YXRpYyB2b2lkIGZuX291dF9jb25zdW1lKHZvaWQgKnByaXYsIGNoYXIgKmxpbmUsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWludCBpOworCXN0cnVjdCBlbWl0X2NhbGxiYWNrICplY2JkYXRhID0gcHJpdjsKKwljb25zdCBjaGFyICpzZXQgPSBkaWZmX2dldF9jb2xvcihlY2JkYXRhLT5jb2xvcl9kaWZmLCBESUZGX01FVEFJTkZPKTsKKwljb25zdCBjaGFyICpyZXNldCA9IGRpZmZfZ2V0X2NvbG9yKGVjYmRhdGEtPmNvbG9yX2RpZmYsIERJRkZfUkVTRVQpOworCisJaWYgKGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0pIHsKKwkJcHJpbnRmKCIlcy0tLSAlcyVzXG4iLCBzZXQsIGVjYmRhdGEtPmxhYmVsX3BhdGhbMF0sIHJlc2V0KTsKKwkJcHJpbnRmKCIlcysrKyAlcyVzXG4iLCBzZXQsIGVjYmRhdGEtPmxhYmVsX3BhdGhbMV0sIHJlc2V0KTsKKwkJZWNiZGF0YS0+bGFiZWxfcGF0aFswXSA9IGVjYmRhdGEtPmxhYmVsX3BhdGhbMV0gPSBOVUxMOworCX0KKworCS8qIFRoaXMgaXMgbm90IHJlYWxseSBuZWNlc3NhcnkgZm9yIG5vdyBiZWNhdXNlCisJICogdGhpcyBjb2RlcGF0aCBvbmx5IGRlYWxzIHdpdGggdHdvLXdheSBkaWZmcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIGxpbmVbaV0gPT0gJ0AnOyBpKyspCisJCTsKKwlpZiAoMiA8PSBpICYmIGkgPCBsZW4gJiYgbGluZVtpXSA9PSAnICcpIHsKKwkJZWNiZGF0YS0+bnBhcmVudHMgPSBpIC0gMTsKKwkJc2V0ID0gZGlmZl9nZXRfY29sb3IoZWNiZGF0YS0+Y29sb3JfZGlmZiwgRElGRl9GUkFHSU5GTyk7CisJfQorCWVsc2UgaWYgKGxlbiA8IGVjYmRhdGEtPm5wYXJlbnRzKQorCQlzZXQgPSByZXNldDsKKwllbHNlIHsKKwkJaW50IG5wYXJlbnRzID0gZWNiZGF0YS0+bnBhcmVudHM7CisJCWludCBjb2xvciA9IERJRkZfUExBSU47CisJCWZvciAoaSA9IDA7IGkgPCBucGFyZW50cyAmJiBsZW47IGkrKykgeworCQkJaWYgKGxpbmVbaV0gPT0gJy0nKQorCQkJCWNvbG9yID0gRElGRl9GSUxFX09MRDsKKwkJCWVsc2UgaWYgKGxpbmVbaV0gPT0gJysnKQorCQkJCWNvbG9yID0gRElGRl9GSUxFX05FVzsKKwkJfQorCQlzZXQgPSBkaWZmX2dldF9jb2xvcihlY2JkYXRhLT5jb2xvcl9kaWZmLCBjb2xvcik7CisJfQorCWlmIChsZW4gPiAwICYmIGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxlbi0tOworCWZwdXRzIChzZXQsIHN0ZG91dCk7CisJZndyaXRlIChsaW5lLCBsZW4sIDEsIHN0ZG91dCk7CisJcHV0cyAocmVzZXQpOworfQorCitzdGF0aWMgY2hhciAqcHByaW50X3JlbmFtZShjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiKQoreworCWNvbnN0IGNoYXIgKm9sZCA9IGE7CisJY29uc3QgY2hhciAqbmV3ID0gYjsKKwljaGFyICpuYW1lID0gTlVMTDsKKwlpbnQgcGZ4X2xlbmd0aCwgc2Z4X2xlbmd0aDsKKwlpbnQgbGVuX2EgPSBzdHJsZW4oYSk7CisJaW50IGxlbl9iID0gc3RybGVuKGIpOworCisJLyogRmluZCBjb21tb24gcHJlZml4ICovCisJcGZ4X2xlbmd0aCA9IDA7CisJd2hpbGUgKCpvbGQgJiYgKm5ldyAmJiAqb2xkID09ICpuZXcpIHsKKwkJaWYgKCpvbGQgPT0gJy8nKQorCQkJcGZ4X2xlbmd0aCA9IG9sZCAtIGEgKyAxOworCQlvbGQrKzsKKwkJbmV3Kys7CisJfQorCisJLyogRmluZCBjb21tb24gc3VmZml4ICovCisJb2xkID0gYSArIGxlbl9hOworCW5ldyA9IGIgKyBsZW5fYjsKKwlzZnhfbGVuZ3RoID0gMDsKKwl3aGlsZSAoYSA8PSBvbGQgJiYgYiA8PSBuZXcgJiYgKm9sZCA9PSAqbmV3KSB7CisJCWlmICgqb2xkID09ICcvJykKKwkJCXNmeF9sZW5ndGggPSBsZW5fYSAtIChvbGQgLSBhKTsKKwkJb2xkLS07CisJCW5ldy0tOworCX0KKworCS8qCisJICogcGZ4e21pZC1hID0+IG1pZC1ifXNmeAorCSAqIHtwZngtYSA9PiBwZngtYn1zZngKKwkgKiBwZnh7c2Z4LWEgPT4gc2Z4LWJ9CisJICogbmFtZS1hID0+IG5hbWUtYgorCSAqLworCWlmIChwZnhfbGVuZ3RoICsgc2Z4X2xlbmd0aCkgeworCQlpbnQgYV9taWRsZW4gPSBsZW5fYSAtIHBmeF9sZW5ndGggLSBzZnhfbGVuZ3RoOworCQlpbnQgYl9taWRsZW4gPSBsZW5fYiAtIHBmeF9sZW5ndGggLSBzZnhfbGVuZ3RoOworCQlpZiAoYV9taWRsZW4gPCAwKSBhX21pZGxlbiA9IDA7CisJCWlmIChiX21pZGxlbiA8IDApIGJfbWlkbGVuID0gMDsKKworCQluYW1lID0geG1hbGxvYyhwZnhfbGVuZ3RoICsgYV9taWRsZW4gKyBiX21pZGxlbiArIHNmeF9sZW5ndGggKyA3KTsKKwkJc3ByaW50ZihuYW1lLCAiJS4qc3slLipzID0+ICUuKnN9JXMiLAorCQkJcGZ4X2xlbmd0aCwgYSwKKwkJCWFfbWlkbGVuLCBhICsgcGZ4X2xlbmd0aCwKKwkJCWJfbWlkbGVuLCBiICsgcGZ4X2xlbmd0aCwKKwkJCWEgKyBsZW5fYSAtIHNmeF9sZW5ndGgpOworCX0KKwllbHNlIHsKKwkJbmFtZSA9IHhtYWxsb2MobGVuX2EgKyBsZW5fYiArIDUpOworCQlzcHJpbnRmKG5hbWUsICIlcyA9PiAlcyIsIGEsIGIpOworCX0KKwlyZXR1cm4gbmFtZTsKK30KKworc3RydWN0IGRpZmZzdGF0X3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCisJaW50IG5yOworCWludCBhbGxvYzsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSB7CisJCWNoYXIgKm5hbWU7CisJCXVuc2lnbmVkIGlzX3VubWVyZ2VkOjE7CisJCXVuc2lnbmVkIGlzX2JpbmFyeToxOworCQl1bnNpZ25lZCBpc19yZW5hbWVkOjE7CisJCXVuc2lnbmVkIGludCBhZGRlZCwgZGVsZXRlZDsKKwl9ICoqZmlsZXM7Cit9OworCitzdGF0aWMgc3RydWN0IGRpZmZzdGF0X2ZpbGUgKmRpZmZzdGF0X2FkZChzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQsCisJCQkJCSAgY29uc3QgY2hhciAqbmFtZV9hLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWVfYikKK3sKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqeDsKKwl4ID0geGNhbGxvYyhzaXplb2YgKCp4KSwgMSk7CisJaWYgKGRpZmZzdGF0LT5uciA9PSBkaWZmc3RhdC0+YWxsb2MpIHsKKwkJZGlmZnN0YXQtPmFsbG9jID0gYWxsb2NfbnIoZGlmZnN0YXQtPmFsbG9jKTsKKwkJZGlmZnN0YXQtPmZpbGVzID0geHJlYWxsb2MoZGlmZnN0YXQtPmZpbGVzLAorCQkJCWRpZmZzdGF0LT5hbGxvYyAqIHNpemVvZih4KSk7CisJfQorCWRpZmZzdGF0LT5maWxlc1tkaWZmc3RhdC0+bnIrK10gPSB4OworCWlmIChuYW1lX2IpIHsKKwkJeC0+bmFtZSA9IHBwcmludF9yZW5hbWUobmFtZV9hLCBuYW1lX2IpOworCQl4LT5pc19yZW5hbWVkID0gMTsKKwl9CisJZWxzZQorCQl4LT5uYW1lID0gc3RyZHVwKG5hbWVfYSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZzdGF0X2NvbnN1bWUodm9pZCAqcHJpdiwgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0ID0gcHJpdjsKKwlzdHJ1Y3QgZGlmZnN0YXRfZmlsZSAqeCA9IGRpZmZzdGF0LT5maWxlc1tkaWZmc3RhdC0+bnIgLSAxXTsKKworCWlmIChsaW5lWzBdID09ICcrJykKKwkJeC0+YWRkZWQrKzsKKwllbHNlIGlmIChsaW5lWzBdID09ICctJykKKwkJeC0+ZGVsZXRlZCsrOworfQorCitzdGF0aWMgY29uc3QgY2hhciBwbHVzZXNbXSA9ICIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIjsKK3N0YXRpYyBjb25zdCBjaGFyIG1pbnVzZXNbXT0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOworY29uc3QgY2hhciBtaW1lX2JvdW5kYXJ5X2xlYWRlcltdID0gIi0tLS0tLS0tLS0tLSI7CisKK3N0YXRpYyB2b2lkIHNob3dfc3RhdHMoc3RydWN0IGRpZmZzdGF0X3QqIGRhdGEpCit7CisJaW50IGksIGxlbiwgYWRkLCBkZWwsIHRvdGFsLCBhZGRzID0gMCwgZGVscyA9IDA7CisJaW50IG1heCwgbWF4X2NoYW5nZSA9IDAsIG1heF9sZW4gPSAwOworCWludCB0b3RhbF9maWxlcyA9IGRhdGEtPm5yOworCisJaWYgKGRhdGEtPm5yID09IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmc3RhdF9maWxlICpmaWxlID0gZGF0YS0+ZmlsZXNbaV07CisKKwkJbGVuID0gc3RybGVuKGZpbGUtPm5hbWUpOworCQlpZiAobWF4X2xlbiA8IGxlbikKKwkJCW1heF9sZW4gPSBsZW47CisKKwkJaWYgKGZpbGUtPmlzX2JpbmFyeSB8fCBmaWxlLT5pc191bm1lcmdlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF4X2NoYW5nZSA8IGZpbGUtPmFkZGVkICsgZmlsZS0+ZGVsZXRlZCkKKwkJCW1heF9jaGFuZ2UgPSBmaWxlLT5hZGRlZCArIGZpbGUtPmRlbGV0ZWQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcHJlZml4ID0gIiI7CisJCWNoYXIgKm5hbWUgPSBkYXRhLT5maWxlc1tpXS0+bmFtZTsKKwkJaW50IGFkZGVkID0gZGF0YS0+ZmlsZXNbaV0tPmFkZGVkOworCQlpbnQgZGVsZXRlZCA9IGRhdGEtPmZpbGVzW2ldLT5kZWxldGVkOworCisJCWlmICgwIDwgKGxlbiA9IHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCkpKSB7CisJCQljaGFyICpxbmFtZSA9IHhtYWxsb2MobGVuICsgMSk7CisJCQlxdW90ZV9jX3N0eWxlKG5hbWUsIHFuYW1lLCBOVUxMLCAwKTsKKwkJCWZyZWUobmFtZSk7CisJCQlkYXRhLT5maWxlc1tpXS0+bmFtZSA9IG5hbWUgPSBxbmFtZTsKKwkJfQorCisJCS8qCisJCSAqICJzY2FsZSIgdGhlIGZpbGVuYW1lCisJCSAqLworCQlsZW4gPSBzdHJsZW4obmFtZSk7CisJCW1heCA9IG1heF9sZW47CisJCWlmIChtYXggPiA1MCkKKwkJCW1heCA9IDUwOworCQlpZiAobGVuID4gbWF4KSB7CisJCQljaGFyICpzbGFzaDsKKwkJCXByZWZpeCA9ICIuLi4iOworCQkJbWF4IC09IDM7CisJCQluYW1lICs9IGxlbiAtIG1heDsKKwkJCXNsYXNoID0gc3RyY2hyKG5hbWUsICcvJyk7CisJCQlpZiAoc2xhc2gpCisJCQkJbmFtZSA9IHNsYXNoOworCQl9CisJCWxlbiA9IG1heDsKKworCQkvKgorCQkgKiBzY2FsZSB0aGUgYWRkL2RlbGV0ZQorCQkgKi8KKwkJbWF4ID0gbWF4X2NoYW5nZTsKKwkJaWYgKG1heCArIGxlbiA+IDcwKQorCQkJbWF4ID0gNzAgLSBsZW47CisKKwkJaWYgKGRhdGEtPmZpbGVzW2ldLT5pc19iaW5hcnkpIHsKKwkJCXByaW50ZigiICVzJS0qcyB8ICBCaW5cbiIsIHByZWZpeCwgbGVuLCBuYW1lKTsKKwkJCWdvdG8gZnJlZV9kaWZmc3RhdF9maWxlOworCQl9CisJCWVsc2UgaWYgKGRhdGEtPmZpbGVzW2ldLT5pc191bm1lcmdlZCkgeworCQkJcHJpbnRmKCIgJXMlLSpzIHwgIFVubWVyZ2VkXG4iLCBwcmVmaXgsIGxlbiwgbmFtZSk7CisJCQlnb3RvIGZyZWVfZGlmZnN0YXRfZmlsZTsKKwkJfQorCQllbHNlIGlmICghZGF0YS0+ZmlsZXNbaV0tPmlzX3JlbmFtZWQgJiYKKwkJCSAoYWRkZWQgKyBkZWxldGVkID09IDApKSB7CisJCQl0b3RhbF9maWxlcy0tOworCQkJZ290byBmcmVlX2RpZmZzdGF0X2ZpbGU7CisJCX0KKworCQlhZGQgPSBhZGRlZDsKKwkJZGVsID0gZGVsZXRlZDsKKwkJdG90YWwgPSBhZGQgKyBkZWw7CisJCWFkZHMgKz0gYWRkOworCQlkZWxzICs9IGRlbDsKKworCQlpZiAobWF4X2NoYW5nZSA+IDApIHsKKwkJCXRvdGFsID0gKHRvdGFsICogbWF4ICsgbWF4X2NoYW5nZSAvIDIpIC8gbWF4X2NoYW5nZTsKKwkJCWFkZCA9IChhZGQgKiBtYXggKyBtYXhfY2hhbmdlIC8gMikgLyBtYXhfY2hhbmdlOworCQkJZGVsID0gdG90YWwgLSBhZGQ7CisJCX0KKwkJcHJpbnRmKCIgJXMlLSpzIHwlNWQgJS4qcyUuKnNcbiIsIHByZWZpeCwKKwkJCQlsZW4sIG5hbWUsIGFkZGVkICsgZGVsZXRlZCwKKwkJCQlhZGQsIHBsdXNlcywgZGVsLCBtaW51c2VzKTsKKwlmcmVlX2RpZmZzdGF0X2ZpbGU6CisJCWZyZWUoZGF0YS0+ZmlsZXNbaV0tPm5hbWUpOworCQlmcmVlKGRhdGEtPmZpbGVzW2ldKTsKKwl9CisJZnJlZShkYXRhLT5maWxlcyk7CisJcHJpbnRmKCIgJWQgZmlsZXMgY2hhbmdlZCwgJWQgaW5zZXJ0aW9ucygrKSwgJWQgZGVsZXRpb25zKC0pXG4iLAorCQkJdG90YWxfZmlsZXMsIGFkZHMsIGRlbHMpOworfQorCitzdHJ1Y3QgY2hlY2tkaWZmX3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWludCBsaW5lbm87Cit9OworCitzdGF0aWMgdm9pZCBjaGVja2RpZmZfY29uc3VtZSh2b2lkICpwcml2LCBjaGFyICpsaW5lLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlzdHJ1Y3QgY2hlY2tkaWZmX3QgKmRhdGEgPSBwcml2OworCisJaWYgKGxpbmVbMF0gPT0gJysnKSB7CisJCWludCBpLCBzcGFjZXMgPSAwOworCisJCWRhdGEtPmxpbmVubysrOworCisJCS8qIGNoZWNrIHNwYWNlIGJlZm9yZSB0YWIgKi8KKwkJZm9yIChpID0gMTsgaSA8IGxlbiAmJiAobGluZVtpXSA9PSAnICcgfHwgbGluZVtpXSA9PSAnXHQnKTsgaSsrKQorCQkJaWYgKGxpbmVbaV0gPT0gJyAnKQorCQkJCXNwYWNlcysrOworCQlpZiAobGluZVtpIC0gMV0gPT0gJ1x0JyAmJiBzcGFjZXMpCisJCQlwcmludGYoIiVzOiVkOiBzcGFjZSBiZWZvcmUgdGFiOiUuKnNcbiIsCisJCQkJZGF0YS0+ZmlsZW5hbWUsIGRhdGEtPmxpbmVubywgKGludClsZW4sIGxpbmUpOworCisJCS8qIGNoZWNrIHdoaXRlIHNwYWNlIGF0IGxpbmUgZW5kICovCisJCWlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCQlsZW4tLTsKKwkJaWYgKGlzc3BhY2UobGluZVtsZW4gLSAxXSkpCisJCQlwcmludGYoIiVzOiVkOiB3aGl0ZSBzcGFjZSBhdCBlbmQ6ICUuKnNcbiIsCisJCQkJZGF0YS0+ZmlsZW5hbWUsIGRhdGEtPmxpbmVubywgKGludClsZW4sIGxpbmUpOworCX0gZWxzZSBpZiAobGluZVswXSA9PSAnICcpCisJCWRhdGEtPmxpbmVubysrOworCWVsc2UgaWYgKGxpbmVbMF0gPT0gJ0AnKSB7CisJCWNoYXIgKnBsdXMgPSBzdHJjaHIobGluZSwgJysnKTsKKwkJaWYgKHBsdXMpCisJCQlkYXRhLT5saW5lbm8gPSBzdHJ0b2wocGx1cywgTlVMTCwgMTApOworCQllbHNlCisJCQlkaWUoImludmFsaWQgZGlmZiIpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRlZmxhdGVfaXQoY2hhciAqZGF0YSwKKwkJCQkgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSB1bnNpZ25lZCBsb25nICpyZXN1bHRfc2l6ZSkKK3sKKwlpbnQgYm91bmQ7CisJdW5zaWduZWQgY2hhciAqZGVmbGF0ZWQ7CisJel9zdHJlYW0gc3RyZWFtOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwlib3VuZCA9IGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBzaXplKTsKKwlkZWZsYXRlZCA9IHhtYWxsb2MoYm91bmQpOworCXN0cmVhbS5uZXh0X291dCA9IGRlZmxhdGVkOworCXN0cmVhbS5hdmFpbF9vdXQgPSBib3VuZDsKKworCXN0cmVhbS5uZXh0X2luID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworCXN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCTsgLyogbm90aGluZyAqLworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisJKnJlc3VsdF9zaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlyZXR1cm4gZGVmbGF0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRfYmluYXJ5X2RpZmYobW1maWxlX3QgKm9uZSwgbW1maWxlX3QgKnR3bykKK3sKKwl2b2lkICpjcDsKKwl2b2lkICpkZWx0YTsKKwl2b2lkICpkZWZsYXRlZDsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgb3JpZ19zaXplOworCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGRlZmxhdGVfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZTsKKworCXByaW50ZigiR0lUIGJpbmFyeSBwYXRjaFxuIik7CisJLyogV2UgY291bGQgZG8gZGVmbGF0ZWQgZGVsdGEsIG9yIHdlIGNvdWxkIGRvIGp1c3QgZGVmbGF0ZWQgdHdvLAorCSAqIHdoaWNoZXZlciBpcyBzbWFsbGVyLgorCSAqLworCWRlbHRhID0gTlVMTDsKKwlkZWZsYXRlZCA9IGRlZmxhdGVfaXQodHdvLT5wdHIsIHR3by0+c2l6ZSwgJmRlZmxhdGVfc2l6ZSk7CisJaWYgKG9uZS0+c2l6ZSAmJiB0d28tPnNpemUpIHsKKwkJZGVsdGEgPSBkaWZmX2RlbHRhKG9uZS0+cHRyLCBvbmUtPnNpemUsCisJCQkJICAgdHdvLT5wdHIsIHR3by0+c2l6ZSwKKwkJCQkgICAmZGVsdGFfc2l6ZSwgZGVmbGF0ZV9zaXplKTsKKwkJaWYgKGRlbHRhKSB7CisJCQl2b2lkICp0b19mcmVlID0gZGVsdGE7CisJCQlvcmlnX3NpemUgPSBkZWx0YV9zaXplOworCQkJZGVsdGEgPSBkZWZsYXRlX2l0KGRlbHRhLCBkZWx0YV9zaXplLCAmZGVsdGFfc2l6ZSk7CisJCQlmcmVlKHRvX2ZyZWUpOworCQl9CisJfQorCisJaWYgKGRlbHRhICYmIGRlbHRhX3NpemUgPCBkZWZsYXRlX3NpemUpIHsKKwkJcHJpbnRmKCJkZWx0YSAlbHVcbiIsIG9yaWdfc2l6ZSk7CisJCWZyZWUoZGVmbGF0ZWQpOworCQlkYXRhID0gZGVsdGE7CisJCWRhdGFfc2l6ZSA9IGRlbHRhX3NpemU7CisJfQorCWVsc2UgeworCQlwcmludGYoImxpdGVyYWwgJWx1XG4iLCB0d28tPnNpemUpOworCQlmcmVlKGRlbHRhKTsKKwkJZGF0YSA9IGRlZmxhdGVkOworCQlkYXRhX3NpemUgPSBkZWZsYXRlX3NpemU7CisJfQorCisJLyogZW1pdCBkYXRhIGVuY29kZWQgaW4gYmFzZTg1ICovCisJY3AgPSBkYXRhOworCXdoaWxlIChkYXRhX3NpemUpIHsKKwkJaW50IGJ5dGVzID0gKDUyIDwgZGF0YV9zaXplKSA/IDUyIDogZGF0YV9zaXplOworCQljaGFyIGxpbmVbNzBdOworCQlkYXRhX3NpemUgLT0gYnl0ZXM7CisJCWlmIChieXRlcyA8PSAyNikKKwkJCWxpbmVbMF0gPSBieXRlcyArICdBJyAtIDE7CisJCWVsc2UKKwkJCWxpbmVbMF0gPSBieXRlcyAtIDI2ICsgJ2EnIC0gMTsKKwkJZW5jb2RlXzg1KGxpbmUgKyAxLCBjcCwgYnl0ZXMpOworCQljcCA9IChjaGFyICopIGNwICsgYnl0ZXM7CisJCXB1dHMobGluZSk7CisJfQorCXByaW50ZigiXG4iKTsKKwlmcmVlKGRhdGEpOworfQorCisjZGVmaW5lIEZJUlNUX0ZFV19CWVRFUyA4MDAwCitzdGF0aWMgaW50IG1tZmlsZV9pc19iaW5hcnkobW1maWxlX3QgKm1mKQoreworCWxvbmcgc3ogPSBtZi0+c2l6ZTsKKwlpZiAoRklSU1RfRkVXX0JZVEVTIDwgc3opCisJCXN6ID0gRklSU1RfRkVXX0JZVEVTOworCWlmIChtZW1jaHIobWYtPnB0ciwgMCwgc3opKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnVpbHRpbl9kaWZmKGNvbnN0IGNoYXIgKm5hbWVfYSwKKwkJCSBjb25zdCBjaGFyICpuYW1lX2IsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCSBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJIGNvbnN0IGNoYXIgKnhmcm1fbXNnLAorCQkJIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJbW1maWxlX3QgbWYxLCBtZjI7CisJY29uc3QgY2hhciAqbGJsWzJdOworCWNoYXIgKmFfb25lLCAqYl90d287CisJY29uc3QgY2hhciAqc2V0ID0gZGlmZl9nZXRfY29sb3Ioby0+Y29sb3JfZGlmZiwgRElGRl9NRVRBSU5GTyk7CisJY29uc3QgY2hhciAqcmVzZXQgPSBkaWZmX2dldF9jb2xvcihvLT5jb2xvcl9kaWZmLCBESUZGX1JFU0VUKTsKKworCWFfb25lID0gcXVvdGVfdHdvKCJhLyIsIG5hbWVfYSk7CisJYl90d28gPSBxdW90ZV90d28oImIvIiwgbmFtZV9iKTsKKwlsYmxbMF0gPSBESUZGX0ZJTEVfVkFMSUQob25lKSA/IGFfb25lIDogIi9kZXYvbnVsbCI7CisJbGJsWzFdID0gRElGRl9GSUxFX1ZBTElEKHR3bykgPyBiX3R3byA6ICIvZGV2L251bGwiOworCXByaW50ZigiJXNkaWZmIC0tZ2l0ICVzICVzJXNcbiIsIHNldCwgYV9vbmUsIGJfdHdvLCByZXNldCk7CisJaWYgKGxibFswXVswXSA9PSAnLycpIHsKKwkJLyogL2Rldi9udWxsICovCisJCXByaW50ZigiJXNuZXcgZmlsZSBtb2RlICUwNm8lc1xuIiwgc2V0LCB0d28tPm1vZGUsIHJlc2V0KTsKKwkJaWYgKHhmcm1fbXNnICYmIHhmcm1fbXNnWzBdKQorCQkJcHJpbnRmKCIlcyVzJXNcbiIsIHNldCwgeGZybV9tc2csIHJlc2V0KTsKKwl9CisJZWxzZSBpZiAobGJsWzFdWzBdID09ICcvJykgeworCQlwcmludGYoIiVzZGVsZXRlZCBmaWxlIG1vZGUgJTA2byVzXG4iLCBzZXQsIG9uZS0+bW9kZSwgcmVzZXQpOworCQlpZiAoeGZybV9tc2cgJiYgeGZybV9tc2dbMF0pCisJCQlwcmludGYoIiVzJXMlc1xuIiwgc2V0LCB4ZnJtX21zZywgcmVzZXQpOworCX0KKwllbHNlIHsKKwkJaWYgKG9uZS0+bW9kZSAhPSB0d28tPm1vZGUpIHsKKwkJCXByaW50ZigiJXNvbGQgbW9kZSAlMDZvJXNcbiIsIHNldCwgb25lLT5tb2RlLCByZXNldCk7CisJCQlwcmludGYoIiVzbmV3IG1vZGUgJTA2byVzXG4iLCBzZXQsIHR3by0+bW9kZSwgcmVzZXQpOworCQl9CisJCWlmICh4ZnJtX21zZyAmJiB4ZnJtX21zZ1swXSkKKwkJCXByaW50ZigiJXMlcyVzXG4iLCBzZXQsIHhmcm1fbXNnLCByZXNldCk7CisJCS8qCisJCSAqIHdlIGRvIG5vdCBydW4gZGlmZiBiZXR3ZWVuIGRpZmZlcmVudCBraW5kCisJCSAqIG9mIG9iamVjdHMuCisJCSAqLworCQlpZiAoKG9uZS0+bW9kZSBeIHR3by0+bW9kZSkgJiBTX0lGTVQpCisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJaWYgKGNvbXBsZXRlX3Jld3JpdGUpIHsKKwkJCWVtaXRfcmV3cml0ZV9kaWZmKG5hbWVfYSwgbmFtZV9iLCBvbmUsIHR3byk7CisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJfQorCX0KKworCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAoIW8tPnRleHQgJiYgKG1tZmlsZV9pc19iaW5hcnkoJm1mMSkgfHwgbW1maWxlX2lzX2JpbmFyeSgmbWYyKSkpIHsKKwkJLyogUXVpdGUgY29tbW9uIGNvbmZ1c2luZyBjYXNlICovCisJCWlmIChtZjEuc2l6ZSA9PSBtZjIuc2l6ZSAmJgorCQkgICAgIW1lbWNtcChtZjEucHRyLCBtZjIucHRyLCBtZjEuc2l6ZSkpCisJCQlnb3RvIGZyZWVfYWJfYW5kX3JldHVybjsKKwkJaWYgKG8tPmJpbmFyeSkKKwkJCWVtaXRfYmluYXJ5X2RpZmYoJm1mMSwgJm1mMik7CisJCWVsc2UKKwkJCXByaW50ZigiQmluYXJ5IGZpbGVzICVzIGFuZCAlcyBkaWZmZXJcbiIsCisJCQkgICAgICAgbGJsWzBdLCBsYmxbMV0pOworCX0KKwllbHNlIHsKKwkJLyogQ3JhenkgeGRsIGludGVyZmFjZXMuLiAqLworCQljb25zdCBjaGFyICpkaWZmb3B0cyA9IGdldGVudigiR0lUX0RJRkZfT1BUUyIpOworCQl4cHBhcmFtX3QgeHBwOworCQl4ZGVtaXRjb25mX3QgeGVjZmc7CisJCXhkZW1pdGNiX3QgZWNiOworCQlzdHJ1Y3QgZW1pdF9jYWxsYmFjayBlY2JkYXRhOworCisJCW1lbXNldCgmZWNiZGF0YSwgMCwgc2l6ZW9mKGVjYmRhdGEpKTsKKwkJZWNiZGF0YS5sYWJlbF9wYXRoID0gbGJsOworCQllY2JkYXRhLmNvbG9yX2RpZmYgPSBvLT5jb2xvcl9kaWZmOworCQl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMIHwgby0+eGRsX29wdHM7CisJCXhlY2ZnLmN0eGxlbiA9IG8tPmNvbnRleHQ7CisJCXhlY2ZnLmZsYWdzID0gWERMX0VNSVRfRlVOQ05BTUVTOworCQlpZiAoIWRpZmZvcHRzKQorCQkJOworCQllbHNlIGlmICghc3RybmNtcChkaWZmb3B0cywgIi0tdW5pZmllZD0iLCAxMCkpCisJCQl4ZWNmZy5jdHhsZW4gPSBzdHJ0b3VsKGRpZmZvcHRzICsgMTAsIE5VTEwsIDEwKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoZGlmZm9wdHMsICItdSIsIDIpKQorCQkJeGVjZmcuY3R4bGVuID0gc3RydG91bChkaWZmb3B0cyArIDIsIE5VTEwsIDEwKTsKKwkJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCQllY2IucHJpdiA9ICZlY2JkYXRhOworCQllY2JkYXRhLnhtLmNvbnN1bWUgPSBmbl9vdXRfY29uc3VtZTsKKwkJeGRsX2RpZmYoJm1mMSwgJm1mMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwl9CisKKyBmcmVlX2FiX2FuZF9yZXR1cm46CisJZnJlZShhX29uZSk7CisJZnJlZShiX3R3byk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBidWlsdGluX2RpZmZzdGF0KGNvbnN0IGNoYXIgKm5hbWVfYSwgY29uc3QgY2hhciAqbmFtZV9iLAorCQkJICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvLAorCQkJICAgICBzdHJ1Y3QgZGlmZnN0YXRfdCAqZGlmZnN0YXQsCisJCQkgICAgIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgICAgIGludCBjb21wbGV0ZV9yZXdyaXRlKQoreworCW1tZmlsZV90IG1mMSwgbWYyOworCXN0cnVjdCBkaWZmc3RhdF9maWxlICpkYXRhOworCisJZGF0YSA9IGRpZmZzdGF0X2FkZChkaWZmc3RhdCwgbmFtZV9hLCBuYW1lX2IpOworCisJaWYgKCFvbmUgfHwgIXR3bykgeworCQlkYXRhLT5pc191bm1lcmdlZCA9IDE7CisJCXJldHVybjsKKwl9CisJaWYgKGNvbXBsZXRlX3Jld3JpdGUpIHsKKwkJZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApOworCQlkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHR3bywgMCk7CisJCWRhdGEtPmRlbGV0ZWQgPSBjb3VudF9saW5lcyhvbmUtPmRhdGEsIG9uZS0+c2l6ZSk7CisJCWRhdGEtPmFkZGVkID0gY291bnRfbGluZXModHdvLT5kYXRhLCB0d28tPnNpemUpOworCQlyZXR1cm47CisJfQorCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAobW1maWxlX2lzX2JpbmFyeSgmbWYxKSB8fCBtbWZpbGVfaXNfYmluYXJ5KCZtZjIpKQorCQlkYXRhLT5pc19iaW5hcnkgPSAxOworCWVsc2UgeworCQkvKiBDcmF6eSB4ZGwgaW50ZXJmYWNlcy4uICovCisJCXhwcGFyYW1fdCB4cHA7CisJCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwkJeGRlbWl0Y2JfdCBlY2I7CisKKwkJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTCB8IG8tPnhkbF9vcHRzOworCQl4ZWNmZy5jdHhsZW4gPSAwOworCQl4ZWNmZy5mbGFncyA9IDA7CisJCWVjYi5vdXRmID0geGRpZmZfb3V0ZjsKKwkJZWNiLnByaXYgPSBkaWZmc3RhdDsKKwkJeGRsX2RpZmYoJm1mMSwgJm1mMiwgJnhwcCwgJnhlY2ZnLCAmZWNiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWx0aW5fY2hlY2tkaWZmKGNvbnN0IGNoYXIgKm5hbWVfYSwgY29uc3QgY2hhciAqbmFtZV9iLAorCQkJICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvKQoreworCW1tZmlsZV90IG1mMSwgbWYyOworCXN0cnVjdCBjaGVja2RpZmZfdCBkYXRhOworCisJaWYgKCF0d28pCisJCXJldHVybjsKKworCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKKwlkYXRhLnhtLmNvbnN1bWUgPSBjaGVja2RpZmZfY29uc3VtZTsKKwlkYXRhLmZpbGVuYW1lID0gbmFtZV9iID8gbmFtZV9iIDogbmFtZV9hOworCWRhdGEubGluZW5vID0gMDsKKworCWlmIChmaWxsX21tZmlsZSgmbWYxLCBvbmUpIDwgMCB8fCBmaWxsX21tZmlsZSgmbWYyLCB0d28pIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBmaWxlcyB0byBkaWZmIik7CisKKwlpZiAobW1maWxlX2lzX2JpbmFyeSgmbWYyKSkKKwkJcmV0dXJuOworCWVsc2UgeworCQkvKiBDcmF6eSB4ZGwgaW50ZXJmYWNlcy4uICovCisJCXhwcGFyYW1fdCB4cHA7CisJCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwkJeGRlbWl0Y2JfdCBlY2I7CisKKwkJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwkJeGVjZmcuY3R4bGVuID0gMDsKKwkJeGVjZmcuZmxhZ3MgPSAwOworCQllY2Iub3V0ZiA9IHhkaWZmX291dGY7CisJCWVjYi5wcml2ID0gJmRhdGE7CisJCXhkbF9kaWZmKCZtZjEsICZtZjIsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJfQorfQorCitzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqYWxsb2NfZmlsZXNwZWMoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihwYXRoKTsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3BlYyA9IHhtYWxsb2Moc2l6ZW9mKCpzcGVjKSArIG5hbWVsZW4gKyAxKTsKKworCW1lbXNldChzcGVjLCAwLCBzaXplb2YoKnNwZWMpKTsKKwlzcGVjLT5wYXRoID0gKGNoYXIgKikoc3BlYyArIDEpOworCW1lbWNweShzcGVjLT5wYXRoLCBwYXRoLCBuYW1lbGVuKzEpOworCXJldHVybiBzcGVjOworfQorCit2b2lkIGZpbGxfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNwZWMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgIHVuc2lnbmVkIHNob3J0IG1vZGUpCit7CisJaWYgKG1vZGUpIHsKKwkJc3BlYy0+bW9kZSA9IGNhbm9uX21vZGUobW9kZSk7CisJCW1lbWNweShzcGVjLT5zaGExLCBzaGExLCAyMCk7CisJCXNwZWMtPnNoYTFfdmFsaWQgPSAhIW1lbWNtcChzaGExLCBudWxsX3NoYTEsIDIwKTsKKwl9Cit9CisKKy8qCisgKiBHaXZlbiBhIG5hbWUgYW5kIHNoYTEgcGFpciwgaWYgdGhlIGRpcmNhY2hlIHRlbGxzIHVzIHRoZSBmaWxlIGluCisgKiB0aGUgd29yayB0cmVlIGhhcyB0aGF0IG9iamVjdCBjb250ZW50cywgcmV0dXJuIHRydWUsIHNvIHRoYXQKKyAqIHByZXBhcmVfdGVtcF9maWxlKCkgZG9lcyBub3QgaGF2ZSB0byBpbmZsYXRlIGFuZCBleHRyYWN0LgorICovCitzdGF0aWMgaW50IHdvcmtfdHJlZV9tYXRjaGVzKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgcG9zLCBsZW47CisKKwkvKiBXZSBkbyBub3QgcmVhZCB0aGUgY2FjaGUgb3Vyc2VsdmVzIGhlcmUsIGJlY2F1c2UgdGhlCisJICogYmVuY2htYXJrIHdpdGggbXkgcHJldmlvdXMgdmVyc2lvbiB0aGF0IGFsd2F5cyByZWFkcyBjYWNoZQorCSAqIHNob3dzIHRoYXQgaXQgbWFrZXMgdGhpbmdzIHdvcnNlIGZvciBkaWZmLXRyZWUgY29tcGFyaW5nCisJICogdHdvIGxpbnV4LTIuNiBrZXJuZWwgdHJlZXMgaW4gYW4gYWxyZWFkeSBjaGVja2VkIG91dCB3b3JrCisJICogdHJlZS4gIFRoaXMgaXMgYmVjYXVzZSBtb3N0IGRpZmYtdHJlZSBjb21wYXJpc29ucyBkZWFsIHdpdGgKKwkgKiBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIGZpbGVzLCB3aGlsZSByZWFkaW5nIHRoZSBjYWNoZSBpcworCSAqIGV4cGVuc2l2ZSBmb3IgYSBsYXJnZSBwcm9qZWN0LCBhbmQgaXRzIGNvc3Qgb3V0d2VpZ2hzIHRoZQorCSAqIHNhdmluZ3Mgd2UgZ2V0IGJ5IG5vdCBpbmZsYXRpbmcgdGhlIG9iamVjdCB0byBhIHRlbXBvcmFyeQorCSAqIGZpbGUuICBQcmFjdGljYWxseSwgdGhpcyBjb2RlIG9ubHkgaGVscHMgd2hlbiB3ZSBhcmUgdXNlZAorCSAqIGJ5IGRpZmYtY2FjaGUgLS1jYWNoZWQsIHdoaWNoIGRvZXMgcmVhZCB0aGUgY2FjaGUgYmVmb3JlCisJICogY2FsbGluZyB1cy4KKwkgKi8KKwlpZiAoIWFjdGl2ZV9jYWNoZSkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBzdHJsZW4obmFtZSk7CisJcG9zID0gY2FjaGVfbmFtZV9wb3MobmFtZSwgbGVuKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIDA7CisJY2UgPSBhY3RpdmVfY2FjaGVbcG9zXTsKKwlpZiAoKGxzdGF0KG5hbWUsICZzdCkgPCAwKSB8fAorCSAgICAhU19JU1JFRyhzdC5zdF9tb2RlKSB8fCAvKiBjYXJlZnVsISAqLworCSAgICBjZV9tYXRjaF9zdGF0KGNlLCAmc3QsIDApIHx8CisJICAgIG1lbWNtcChzaGExLCBjZS0+c2hhMSwgMjApKQorCQlyZXR1cm4gMDsKKwkvKiB3ZSByZXR1cm4gMSBvbmx5IHdoZW4gd2UgY2FuIHN0YXQsIGl0IGlzIGEgcmVndWxhciBmaWxlLAorCSAqIHN0YXQgaW5mb3JtYXRpb24gbWF0Y2hlcywgYW5kIHNoYTEgcmVjb3JkZWQgaW4gdGhlIGNhY2hlCisJICogbWF0Y2hlcy4gIEkuZS4gd2Uga25vdyB0aGUgZmlsZSBpbiB0aGUgd29yayB0cmVlIHJlYWxseSBpcworCSAqIHRoZSBzYW1lIGFzIHRoZSA8bmFtZSwgc2hhMT4gcGFpci4KKwkgKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBzaGExX3NpemVfY2FjaGUgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgbG9uZyBzaXplOworfSAqKnNoYTFfc2l6ZV9jYWNoZTsKK3N0YXRpYyBpbnQgc2hhMV9zaXplX2NhY2hlX25yLCBzaGExX3NpemVfY2FjaGVfYWxsb2M7CisKK3N0YXRpYyBzdHJ1Y3Qgc2hhMV9zaXplX2NhY2hlICpsb2NhdGVfc2l6ZV9jYWNoZSh1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJCQkJIGludCBmaW5kX29ubHksCisJCQkJCQkgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBmaXJzdCwgbGFzdDsKKwlzdHJ1Y3Qgc2hhMV9zaXplX2NhY2hlICplOworCisJZmlyc3QgPSAwOworCWxhc3QgPSBzaGExX3NpemVfY2FjaGVfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgY21wLCBuZXh0ID0gKGxhc3QgKyBmaXJzdCkgPj4gMTsKKwkJZSA9IHNoYTFfc2l6ZV9jYWNoZVtuZXh0XTsKKwkJY21wID0gbWVtY21wKGUtPnNoYTEsIHNoYTEsIDIwKTsKKwkJaWYgKCFjbXApCisJCQlyZXR1cm4gZTsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCS8qIG5vdCBmb3VuZCAqLworCWlmIChmaW5kX29ubHkpCisJCXJldHVybiBOVUxMOworCS8qIGluc2VydCB0byBtYWtlIGl0IGF0ICJmaXJzdCIgKi8KKwlpZiAoc2hhMV9zaXplX2NhY2hlX2FsbG9jIDw9IHNoYTFfc2l6ZV9jYWNoZV9ucikgeworCQlzaGExX3NpemVfY2FjaGVfYWxsb2MgPSBhbGxvY19ucihzaGExX3NpemVfY2FjaGVfYWxsb2MpOworCQlzaGExX3NpemVfY2FjaGUgPSB4cmVhbGxvYyhzaGExX3NpemVfY2FjaGUsCisJCQkJCSAgIHNoYTFfc2l6ZV9jYWNoZV9hbGxvYyAqCisJCQkJCSAgIHNpemVvZigqc2hhMV9zaXplX2NhY2hlKSk7CisJfQorCXNoYTFfc2l6ZV9jYWNoZV9ucisrOworCWlmIChmaXJzdCA8IHNoYTFfc2l6ZV9jYWNoZV9ucikKKwkJbWVtbW92ZShzaGExX3NpemVfY2FjaGUgKyBmaXJzdCArIDEsIHNoYTFfc2l6ZV9jYWNoZSArIGZpcnN0LAorCQkJKHNoYTFfc2l6ZV9jYWNoZV9uciAtIGZpcnN0IC0gMSkgKgorCQkJc2l6ZW9mKCpzaGExX3NpemVfY2FjaGUpKTsKKwllID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHNoYTFfc2l6ZV9jYWNoZSkpOworCXNoYTFfc2l6ZV9jYWNoZVtmaXJzdF0gPSBlOworCW1lbWNweShlLT5zaGExLCBzaGExLCAyMCk7CisJZS0+c2l6ZSA9IHNpemU7CisJcmV0dXJuIGU7Cit9CisKKy8qCisgKiBXaGlsZSBkb2luZyByZW5hbWUgZGV0ZWN0aW9uIGFuZCBwaWNrYXhlIG9wZXJhdGlvbiwgd2UgbWF5IG5lZWQgdG8KKyAqIGdyYWIgdGhlIGRhdGEgZm9yIHRoZSBibG9iIChvciBmaWxlKSBmb3Igb3VyIG93biBpbi1jb3JlIGNvbXBhcmlzb24uCisgKiBkaWZmX2ZpbGVzcGVjIGhhcyBkYXRhIGFuZCBzaXplIGZpZWxkcyBmb3IgdGhpcyBwdXJwb3NlLgorICovCitpbnQgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcywgaW50IHNpemVfb25seSkKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAoIURJRkZfRklMRV9WQUxJRChzKSkKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogYXNraW5nIHRvIHBvcHVsYXRlIGludmFsaWQgZmlsZS4iKTsKKwlpZiAoU19JU0RJUihzLT5tb2RlKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCF1c2Vfc2l6ZV9jYWNoZSkKKwkJc2l6ZV9vbmx5ID0gMDsKKworCWlmIChzLT5kYXRhKQorCQlyZXR1cm4gZXJyOworCWlmICghcy0+c2hhMV92YWxpZCB8fAorCSAgICB3b3JrX3RyZWVfbWF0Y2hlcyhzLT5wYXRoLCBzLT5zaGExKSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaW50IGZkOworCQlpZiAobHN0YXQocy0+cGF0aCwgJnN0KSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCWVycl9lbXB0eToKKwkJCQllcnIgPSAtMTsKKwkJCWVtcHR5OgorCQkJCXMtPmRhdGEgPSAoY2hhciAqKSIiOworCQkJCXMtPnNpemUgPSAwOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJcy0+c2l6ZSA9IHN0LnN0X3NpemU7CisJCWlmICghcy0+c2l6ZSkKKwkJCWdvdG8gZW1wdHk7CisJCWlmIChzaXplX29ubHkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQlzLT5kYXRhID0geG1hbGxvYyhzLT5zaXplKTsKKwkJCXMtPnNob3VsZF9mcmVlID0gMTsKKwkJCXJldCA9IHJlYWRsaW5rKHMtPnBhdGgsIHMtPmRhdGEsIHMtPnNpemUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlmcmVlKHMtPmRhdGEpOworCQkJCWdvdG8gZXJyX2VtcHR5OworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJZmQgPSBvcGVuKHMtPnBhdGgsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gZXJyX2VtcHR5OworCQlzLT5kYXRhID0gbW1hcChOVUxMLCBzLT5zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKHMtPmRhdGEgPT0gTUFQX0ZBSUxFRCkKKwkJCWdvdG8gZXJyX2VtcHR5OworCQlzLT5zaG91bGRfbXVubWFwID0gMTsKKwl9CisJZWxzZSB7CisJCWNoYXIgdHlwZVsyMF07CisJCXN0cnVjdCBzaGExX3NpemVfY2FjaGUgKmU7CisKKwkJaWYgKHNpemVfb25seSkgeworCQkJZSA9IGxvY2F0ZV9zaXplX2NhY2hlKHMtPnNoYTEsIDEsIDApOworCQkJaWYgKGUpIHsKKwkJCQlzLT5zaXplID0gZS0+c2l6ZTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghc2hhMV9vYmplY3RfaW5mbyhzLT5zaGExLCB0eXBlLCAmcy0+c2l6ZSkpCisJCQkJbG9jYXRlX3NpemVfY2FjaGUocy0+c2hhMSwgMCwgcy0+c2l6ZSk7CisJCX0KKwkJZWxzZSB7CisJCQlzLT5kYXRhID0gcmVhZF9zaGExX2ZpbGUocy0+c2hhMSwgdHlwZSwgJnMtPnNpemUpOworCQkJcy0+c2hvdWxkX2ZyZWUgPSAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzKQoreworCWlmIChzLT5zaG91bGRfZnJlZSkKKwkJZnJlZShzLT5kYXRhKTsKKwllbHNlIGlmIChzLT5zaG91bGRfbXVubWFwKQorCQltdW5tYXAocy0+ZGF0YSwgcy0+c2l6ZSk7CisJcy0+c2hvdWxkX2ZyZWUgPSBzLT5zaG91bGRfbXVubWFwID0gMDsKKwlzLT5kYXRhID0gTlVMTDsKKwlmcmVlKHMtPmNudF9kYXRhKTsKKwlzLT5jbnRfZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBfdGVtcF9ibG9iKHN0cnVjdCBkaWZmX3RlbXBmaWxlICp0ZW1wLAorCQkJICAgdm9pZCAqYmxvYiwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkgICBpbnQgbW9kZSkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IGdpdF9ta3N0ZW1wKHRlbXAtPnRtcF9wYXRoLCBURU1QRklMRV9QQVRIX0xFTiwgIi5kaWZmX1hYWFhYWCIpOworCWlmIChmZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGNyZWF0ZSB0ZW1wLWZpbGUiKTsKKwlpZiAod3JpdGUoZmQsIGJsb2IsIHNpemUpICE9IHNpemUpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHRlbXAtZmlsZSIpOworCWNsb3NlKGZkKTsKKwl0ZW1wLT5uYW1lID0gdGVtcC0+dG1wX3BhdGg7CisJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgoc2hhMSkpOworCXRlbXAtPmhleFs0MF0gPSAwOworCXNwcmludGYodGVtcC0+bW9kZSwgIiUwNm8iLCBtb2RlKTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV90ZW1wX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIHN0cnVjdCBkaWZmX3RlbXBmaWxlICp0ZW1wLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSkKK3sKKwlpZiAoIURJRkZfRklMRV9WQUxJRChvbmUpKSB7CisJbm90X2FfdmFsaWRfZmlsZToKKwkJLyogQSAnLScgZW50cnkgcHJvZHVjZXMgdGhpcyBmb3IgZmlsZS0yLCBhbmQKKwkJICogYSAnKycgZW50cnkgcHJvZHVjZXMgdGhpcyBmb3IgZmlsZS0xLgorCQkgKi8KKwkJdGVtcC0+bmFtZSA9ICIvZGV2L251bGwiOworCQlzdHJjcHkodGVtcC0+aGV4LCAiLiIpOworCQlzdHJjcHkodGVtcC0+bW9kZSwgIi4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghb25lLT5zaGExX3ZhbGlkIHx8CisJICAgIHdvcmtfdHJlZV9tYXRjaGVzKG5hbWUsIG9uZS0+c2hhMSkpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmIChsc3RhdChuYW1lLCAmc3QpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCQlnb3RvIG5vdF9hX3ZhbGlkX2ZpbGU7CisJCQlkaWUoInN0YXQoJXMpOiAlcyIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCWludCByZXQ7CisJCQljaGFyIGJ1ZltQQVRIX01BWCArIDFdOyAvKiBvdWdodCB0byBiZSBTWU1MSU5LX01BWCAqLworCQkJaWYgKHNpemVvZihidWYpIDw9IHN0LnN0X3NpemUpCisJCQkJZGllKCJzeW1saW5rIHRvbyBsb25nOiAlcyIsIG5hbWUpOworCQkJcmV0ID0gcmVhZGxpbmsobmFtZSwgYnVmLCBzdC5zdF9zaXplKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRpZSgicmVhZGxpbmsoJXMpIiwgbmFtZSk7CisJCQlwcmVwX3RlbXBfYmxvYih0ZW1wLCBidWYsIHN0LnN0X3NpemUsCisJCQkJICAgICAgIChvbmUtPnNoYTFfdmFsaWQgPworCQkJCQlvbmUtPnNoYTEgOiBudWxsX3NoYTEpLAorCQkJCSAgICAgICAob25lLT5zaGExX3ZhbGlkID8KKwkJCQkJb25lLT5tb2RlIDogU19JRkxOSykpOworCQl9CisJCWVsc2UgeworCQkJLyogd2UgY2FuIGJvcnJvdyBmcm9tIHRoZSBmaWxlIGluIHRoZSB3b3JrIHRyZWUgKi8KKwkJCXRlbXAtPm5hbWUgPSBuYW1lOworCQkJaWYgKCFvbmUtPnNoYTFfdmFsaWQpCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgobnVsbF9zaGExKSk7CisJCQllbHNlCisJCQkJc3RyY3B5KHRlbXAtPmhleCwgc2hhMV90b19oZXgob25lLT5zaGExKSk7CisJCQkvKiBFdmVuIHRob3VnaCB3ZSBtYXkgc29tZXRpbWVzIGJvcnJvdyB0aGUKKwkJCSAqIGNvbnRlbnRzIGZyb20gdGhlIHdvcmsgdHJlZSwgd2UgYWx3YXlzIHdhbnQKKwkJCSAqIG9uZS0+bW9kZS4gIG1vZGUgaXMgdHJ1c3R3b3J0aHkgZXZlbiB3aGVuCisJCQkgKiAhKG9uZS0+c2hhMV92YWxpZCksIGFzIGxvbmcgYXMKKwkJCSAqIERJRkZfRklMRV9WQUxJRChvbmUpLgorCQkJICovCisJCQlzcHJpbnRmKHRlbXAtPm1vZGUsICIlMDZvIiwgb25lLT5tb2RlKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWVsc2UgeworCQlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQkJZGllKCJjYW5ub3QgcmVhZCBkYXRhIGJsb2IgZm9yICVzIiwgb25lLT5wYXRoKTsKKwkJcHJlcF90ZW1wX2Jsb2IodGVtcCwgb25lLT5kYXRhLCBvbmUtPnNpemUsCisJCQkgICAgICAgb25lLT5zaGExLCBvbmUtPm1vZGUpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3RlbXBmaWxlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQlpZiAoZGlmZl90ZW1wW2ldLm5hbWUgPT0gZGlmZl90ZW1wW2ldLnRtcF9wYXRoKSB7CisJCQl1bmxpbmsoZGlmZl90ZW1wW2ldLm5hbWUpOworCQkJZGlmZl90ZW1wW2ldLm5hbWUgPSBOVUxMOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV90ZW1wZmlsZV9vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXJlbW92ZV90ZW1wZmlsZSgpOworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCXJhaXNlKHNpZ25vKTsKK30KKworc3RhdGljIGludCBzcGF3bl9wcm9nKGNvbnN0IGNoYXIgKnBnbSwgY29uc3QgY2hhciAqKmFyZykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1czsKKworCWZmbHVzaChOVUxMKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCWRpZSgidW5hYmxlIHRvIGZvcmsiKTsKKwlpZiAoIXBpZCkgeworCQlleGVjdnAocGdtLCAoY2hhciAqY29uc3QqKSBhcmcpOworCQlleGl0KDI1NSk7CisJfQorCisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJY29udGludWU7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBFYXJsaWVyIHdlIGRpZCBub3QgY2hlY2sgdGhlIGV4aXQgc3RhdHVzIGJlY2F1c2UKKwkgKiBkaWZmIGV4aXRzIG5vbi16ZXJvIGlmIGZpbGVzIGFyZSBkaWZmZXJlbnQsIGFuZAorCSAqIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBrbm93aW5nIHRoYXQuICBJdCB3YXMgYQorCSAqIG1pc3Rha2Ugd2hpY2ggbWFkZSBpdCBoYXJkZXIgdG8gcXVpdCBhIGRpZmYtKgorCSAqIHNlc3Npb24gdGhhdCB1c2VzIHRoZSBnaXQtYXBwbHktcGF0Y2gtc2NyaXB0IGFzCisJICogdGhlIEdJVF9FWFRFUk5BTF9ESUZGLiAgQSBjdXN0b20gR0lUX0VYVEVSTkFMX0RJRkYKKwkgKiBzaG91bGQgYWxzbyBleGl0IG5vbi16ZXJvIG9ubHkgd2hlbiBpdCB3YW50cyB0bworCSAqIGFib3J0IHRoZSBlbnRpcmUgZGlmZi0qIHNlc3Npb24uCisJICovCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmICFXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIEFuIGV4dGVybmFsIGRpZmYgY29tbWFuZCB0YWtlczoKKyAqCisgKiBkaWZmLWNtZCBuYW1lIGluZmlsZTEgaW5maWxlMS1zaGExIGluZmlsZTEtbW9kZSBcCisgKiAgICAgICAgICAgICAgIGluZmlsZTIgaW5maWxlMi1zaGExIGluZmlsZTItbW9kZSBbIHJlbmFtZS10byBdCisgKgorICovCitzdGF0aWMgdm9pZCBydW5fZXh0ZXJuYWxfZGlmZihjb25zdCBjaGFyICpwZ20sCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqb3RoZXIsCisJCQkgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICAgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnhmcm1fbXNnLAorCQkJICAgICAgaW50IGNvbXBsZXRlX3Jld3JpdGUpCit7CisJY29uc3QgY2hhciAqc3Bhd25fYXJnWzEwXTsKKwlzdHJ1Y3QgZGlmZl90ZW1wZmlsZSAqdGVtcCA9IGRpZmZfdGVtcDsKKwlpbnQgcmV0dmFsOworCXN0YXRpYyBpbnQgYXRleGl0X2Fza2VkID0gMDsKKwljb25zdCBjaGFyICpvdGhlcm5hbWU7CisJY29uc3QgY2hhciAqKmFyZyA9ICZzcGF3bl9hcmdbMF07CisKKwlvdGhlcm5hbWUgPSAob3RoZXI/IG90aGVyIDogbmFtZSk7CisJaWYgKG9uZSAmJiB0d28pIHsKKwkJcHJlcGFyZV90ZW1wX2ZpbGUobmFtZSwgJnRlbXBbMF0sIG9uZSk7CisJCXByZXBhcmVfdGVtcF9maWxlKG90aGVybmFtZSwgJnRlbXBbMV0sIHR3byk7CisJCWlmICghIGF0ZXhpdF9hc2tlZCAmJgorCQkgICAgKHRlbXBbMF0ubmFtZSA9PSB0ZW1wWzBdLnRtcF9wYXRoIHx8CisJCSAgICAgdGVtcFsxXS5uYW1lID09IHRlbXBbMV0udG1wX3BhdGgpKSB7CisJCQlhdGV4aXRfYXNrZWQgPSAxOworCQkJYXRleGl0KHJlbW92ZV90ZW1wZmlsZSk7CisJCX0KKwkJc2lnbmFsKFNJR0lOVCwgcmVtb3ZlX3RlbXBmaWxlX29uX3NpZ25hbCk7CisJfQorCisJaWYgKG9uZSAmJiB0d28pIHsKKwkJKmFyZysrID0gcGdtOworCQkqYXJnKysgPSBuYW1lOworCQkqYXJnKysgPSB0ZW1wWzBdLm5hbWU7CisJCSphcmcrKyA9IHRlbXBbMF0uaGV4OworCQkqYXJnKysgPSB0ZW1wWzBdLm1vZGU7CisJCSphcmcrKyA9IHRlbXBbMV0ubmFtZTsKKwkJKmFyZysrID0gdGVtcFsxXS5oZXg7CisJCSphcmcrKyA9IHRlbXBbMV0ubW9kZTsKKwkJaWYgKG90aGVyKSB7CisJCQkqYXJnKysgPSBvdGhlcjsKKwkJCSphcmcrKyA9IHhmcm1fbXNnOworCQl9CisJfSBlbHNlIHsKKwkJKmFyZysrID0gcGdtOworCQkqYXJnKysgPSBuYW1lOworCX0KKwkqYXJnID0gTlVMTDsKKwlyZXR2YWwgPSBzcGF3bl9wcm9nKHBnbSwgc3Bhd25fYXJnKTsKKwlyZW1vdmVfdGVtcGZpbGUoKTsKKwlpZiAocmV0dmFsKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXh0ZXJuYWwgZGlmZiBkaWVkLCBzdG9wcGluZyBhdCAlcy5cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgcnVuX2RpZmZfY21kKGNvbnN0IGNoYXIgKnBnbSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJIGNvbnN0IGNoYXIgKm90aGVyLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsCisJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bywKKwkJCSBjb25zdCBjaGFyICp4ZnJtX21zZywKKwkJCSBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvLAorCQkJIGludCBjb21wbGV0ZV9yZXdyaXRlKQoreworCWlmIChwZ20pIHsKKwkJcnVuX2V4dGVybmFsX2RpZmYocGdtLCBuYW1lLCBvdGhlciwgb25lLCB0d28sIHhmcm1fbXNnLAorCQkJCSAgY29tcGxldGVfcmV3cml0ZSk7CisJCXJldHVybjsKKwl9CisJaWYgKG9uZSAmJiB0d28pCisJCWJ1aWx0aW5fZGlmZihuYW1lLCBvdGhlciA/IG90aGVyIDogbmFtZSwKKwkJCSAgICAgb25lLCB0d28sIHhmcm1fbXNnLCBvLCBjb21wbGV0ZV9yZXdyaXRlKTsKKwllbHNlCisJCXByaW50ZigiKiBVbm1lcmdlZCBwYXRoICVzXG4iLCBuYW1lKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9maWxsX3NoYTFfaW5mbyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lKQoreworCWlmIChESUZGX0ZJTEVfVkFMSUQob25lKSkgeworCQlpZiAoIW9uZS0+c2hhMV92YWxpZCkgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQlpZiAobHN0YXQob25lLT5wYXRoLCAmc3QpIDwgMCkKKwkJCQlkaWUoInN0YXQgJXMiLCBvbmUtPnBhdGgpOworCQkJaWYgKGluZGV4X3BhdGgob25lLT5zaGExLCBvbmUtPnBhdGgsICZzdCwgMCkpCisJCQkJZGllKCJjYW5ub3QgaGFzaCAlc1xuIiwgb25lLT5wYXRoKTsKKwkJfQorCX0KKwllbHNlCisJCW1lbXNldChvbmUtPnNoYTEsIDAsIDIwKTsKK30KKworc3RhdGljIHZvaWQgcnVuX2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqcGdtID0gZXh0ZXJuYWxfZGlmZigpOworCWNoYXIgbXNnW1BBVEhfTUFYKjIrMzAwXSwgKnhmcm1fbXNnOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmU7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bzsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKm90aGVyOworCWNoYXIgKm5hbWVfbXVuZ2VkLCAqb3RoZXJfbXVuZ2VkOworCWludCBjb21wbGV0ZV9yZXdyaXRlID0gMDsKKwlpbnQgbGVuOworCisJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkgeworCQkvKiB1bm1lcmdlZCAqLworCQlydW5fZGlmZl9jbWQocGdtLCBwLT5vbmUtPnBhdGgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIG8sIDApOworCQlyZXR1cm47CisJfQorCisJbmFtZSA9IHAtPm9uZS0+cGF0aDsKKwlvdGhlciA9IChzdHJjbXAobmFtZSwgcC0+dHdvLT5wYXRoKSA/IHAtPnR3by0+cGF0aCA6IE5VTEwpOworCW5hbWVfbXVuZ2VkID0gcXVvdGVfb25lKG5hbWUpOworCW90aGVyX211bmdlZCA9IHF1b3RlX29uZShvdGhlcik7CisJb25lID0gcC0+b25lOyB0d28gPSBwLT50d287CisKKwlkaWZmX2ZpbGxfc2hhMV9pbmZvKG9uZSk7CisJZGlmZl9maWxsX3NoYTFfaW5mbyh0d28pOworCisJbGVuID0gMDsKKwlzd2l0Y2ggKHAtPnN0YXR1cykgeworCWNhc2UgRElGRl9TVEFUVVNfQ09QSUVEOgorCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkic2ltaWxhcml0eSBpbmRleCAlZCUlXG4iCisJCQkJImNvcHkgZnJvbSAlc1xuIgorCQkJCSJjb3B5IHRvICVzXG4iLAorCQkJCShpbnQpKDAuNSArIHAtPnNjb3JlICogMTAwLjAvTUFYX1NDT1JFKSwKKwkJCQluYW1lX211bmdlZCwgb3RoZXJfbXVuZ2VkKTsKKwkJYnJlYWs7CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkic2ltaWxhcml0eSBpbmRleCAlZCUlXG4iCisJCQkJInJlbmFtZSBmcm9tICVzXG4iCisJCQkJInJlbmFtZSB0byAlc1xuIiwKKwkJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSksCisJCQkJbmFtZV9tdW5nZWQsIG90aGVyX211bmdlZCk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfTU9ESUZJRUQ6CisJCWlmIChwLT5zY29yZSkgeworCQkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJCSJkaXNzaW1pbGFyaXR5IGluZGV4ICVkJSVcbiIsCisJCQkJCShpbnQpKDAuNSArIHAtPnNjb3JlICoKKwkJCQkJICAgICAgMTAwLjAvTUFYX1NDT1JFKSk7CisJCQljb21wbGV0ZV9yZXdyaXRlID0gMTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGx0aHJ1ICovCisJZGVmYXVsdDoKKwkJLyogbm90aGluZyAqLworCQk7CisJfQorCisJaWYgKG1lbWNtcChvbmUtPnNoYTEsIHR3by0+c2hhMSwgMjApKSB7CisJCWludCBhYmJyZXYgPSBvLT5mdWxsX2luZGV4ID8gNDAgOiBERUZBVUxUX0FCQlJFVjsKKworCQlsZW4gKz0gc25wcmludGYobXNnICsgbGVuLCBzaXplb2YobXNnKSAtIGxlbiwKKwkJCQkiaW5kZXggJS4qcy4uJS4qcyIsCisJCQkJYWJicmV2LCBzaGExX3RvX2hleChvbmUtPnNoYTEpLAorCQkJCWFiYnJldiwgc2hhMV90b19oZXgodHdvLT5zaGExKSk7CisJCWlmIChvbmUtPm1vZGUgPT0gdHdvLT5tb2RlKQorCQkJbGVuICs9IHNucHJpbnRmKG1zZyArIGxlbiwgc2l6ZW9mKG1zZykgLSBsZW4sCisJCQkJCSIgJTA2byIsIG9uZS0+bW9kZSk7CisJCWxlbiArPSBzbnByaW50Zihtc2cgKyBsZW4sIHNpemVvZihtc2cpIC0gbGVuLCAiXG4iKTsKKwl9CisKKwlpZiAobGVuKQorCQltc2dbLS1sZW5dID0gMDsKKwl4ZnJtX21zZyA9IGxlbiA/IG1zZyA6IE5VTEw7CisKKwlpZiAoIXBnbSAmJgorCSAgICBESUZGX0ZJTEVfVkFMSUQob25lKSAmJiBESUZGX0ZJTEVfVkFMSUQodHdvKSAmJgorCSAgICAoU19JRk1UICYgb25lLT5tb2RlKSAhPSAoU19JRk1UICYgdHdvLT5tb2RlKSkgeworCQkvKiBhIGZpbGVwYWlyIHRoYXQgY2hhbmdlcyBiZXR3ZWVuIGZpbGUgYW5kIHN5bWxpbmsKKwkJICogbmVlZHMgdG8gYmUgc3BsaXQgaW50byBkZWxldGlvbiBhbmQgY3JlYXRpb24uCisJCSAqLworCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqbnVsbCA9IGFsbG9jX2ZpbGVzcGVjKHR3by0+cGF0aCk7CisJCXJ1bl9kaWZmX2NtZChOVUxMLCBuYW1lLCBvdGhlciwgb25lLCBudWxsLCB4ZnJtX21zZywgbywgMCk7CisJCWZyZWUobnVsbCk7CisJCW51bGwgPSBhbGxvY19maWxlc3BlYyhvbmUtPnBhdGgpOworCQlydW5fZGlmZl9jbWQoTlVMTCwgbmFtZSwgb3RoZXIsIG51bGwsIHR3bywgeGZybV9tc2csIG8sIDApOworCQlmcmVlKG51bGwpOworCX0KKwllbHNlCisJCXJ1bl9kaWZmX2NtZChwZ20sIG5hbWUsIG90aGVyLCBvbmUsIHR3bywgeGZybV9tc2csIG8sCisJCQkgICAgIGNvbXBsZXRlX3Jld3JpdGUpOworCisJZnJlZShuYW1lX211bmdlZCk7CisJZnJlZShvdGhlcl9tdW5nZWQpOworfQorCitzdGF0aWMgdm9pZCBydW5fZGlmZnN0YXQoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0KQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqb3RoZXI7CisJaW50IGNvbXBsZXRlX3Jld3JpdGUgPSAwOworCisJaWYgKERJRkZfUEFJUl9VTk1FUkdFRChwKSkgeworCQkvKiB1bm1lcmdlZCAqLworCQlidWlsdGluX2RpZmZzdGF0KHAtPm9uZS0+cGF0aCwgTlVMTCwgTlVMTCwgTlVMTCwgZGlmZnN0YXQsIG8sIDApOworCQlyZXR1cm47CisJfQorCisJbmFtZSA9IHAtPm9uZS0+cGF0aDsKKwlvdGhlciA9IChzdHJjbXAobmFtZSwgcC0+dHdvLT5wYXRoKSA/IHAtPnR3by0+cGF0aCA6IE5VTEwpOworCisJZGlmZl9maWxsX3NoYTFfaW5mbyhwLT5vbmUpOworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+dHdvKTsKKworCWlmIChwLT5zdGF0dXMgPT0gRElGRl9TVEFUVVNfTU9ESUZJRUQgJiYgcC0+c2NvcmUpCisJCWNvbXBsZXRlX3Jld3JpdGUgPSAxOworCWJ1aWx0aW5fZGlmZnN0YXQobmFtZSwgb3RoZXIsIHAtPm9uZSwgcC0+dHdvLCBkaWZmc3RhdCwgbywgY29tcGxldGVfcmV3cml0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ1bl9jaGVja2RpZmYoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpvdGhlcjsKKworCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpIHsKKwkJLyogdW5tZXJnZWQgKi8KKwkJcmV0dXJuOworCX0KKworCW5hbWUgPSBwLT5vbmUtPnBhdGg7CisJb3RoZXIgPSAoc3RyY21wKG5hbWUsIHAtPnR3by0+cGF0aCkgPyBwLT50d28tPnBhdGggOiBOVUxMKTsKKworCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+b25lKTsKKwlkaWZmX2ZpbGxfc2hhMV9pbmZvKHAtPnR3byk7CisKKwlidWlsdGluX2NoZWNrZGlmZihuYW1lLCBvdGhlciwgcC0+b25lLCBwLT50d28pOworfQorCit2b2lkIGRpZmZfc2V0dXAoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwltZW1zZXQob3B0aW9ucywgMCwgc2l6ZW9mKCpvcHRpb25zKSk7CisJb3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiA9ICdcbic7CisJb3B0aW9ucy0+YnJlYWtfb3B0ID0gLTE7CisJb3B0aW9ucy0+cmVuYW1lX2xpbWl0ID0gLTE7CisJb3B0aW9ucy0+Y29udGV4dCA9IDM7CisJb3B0aW9ucy0+bXNnX3NlcCA9ICIiOworCisJb3B0aW9ucy0+Y2hhbmdlID0gZGlmZl9jaGFuZ2U7CisJb3B0aW9ucy0+YWRkX3JlbW92ZSA9IGRpZmZfYWRkcmVtb3ZlOworCW9wdGlvbnMtPmNvbG9yX2RpZmYgPSBkaWZmX3VzZV9jb2xvcl9kZWZhdWx0OworCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSBkaWZmX2RldGVjdF9yZW5hbWVfZGVmYXVsdDsKK30KKworaW50IGRpZmZfc2V0dXBfZG9uZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWlmIChvcHRpb25zLT5maW5kX2NvcGllc19oYXJkZXIpCisJCW9wdGlvbnMtPmRldGVjdF9yZW5hbWUgPSBESUZGX0RFVEVDVF9DT1BZOworCisJaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiAoRElGRl9GT1JNQVRfTkFNRSB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfTkFNRV9TVEFUVVMgfAorCQkJCSAgICAgIERJRkZfRk9STUFUX0NIRUNLRElGRiB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfTk9fT1VUUFVUKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAmPSB+KERJRkZfRk9STUFUX1JBVyB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8CisJCQkJCSAgICBESUZGX0ZPUk1BVF9TVU1NQVJZIHwKKwkJCQkJICAgIERJRkZfRk9STUFUX1BBVENIKTsKKworCS8qCisJICogVGhlc2UgY2FzZXMgYWx3YXlzIG5lZWQgcmVjdXJzaXZlOyB3ZSBkbyBub3QgZHJvcCBjYWxsZXItc3VwcGxpZWQKKwkgKiByZWN1cnNpdmUgYml0cyBmb3Igb3RoZXIgZm9ybWF0cyBoZXJlLgorCSAqLworCWlmIChvcHRpb25zLT5vdXRwdXRfZm9ybWF0ICYgKERJRkZfRk9STUFUX1BBVENIIHwKKwkJCQkgICAgICBESUZGX0ZPUk1BVF9ESUZGU1RBVCB8CisJCQkJICAgICAgRElGRl9GT1JNQVRfQ0hFQ0tESUZGKSkKKwkJb3B0aW9ucy0+cmVjdXJzaXZlID0gMTsKKwkvKgorCSAqIEFsc28gcGlja2F4ZSB3b3VsZCBub3Qgd29yayB2ZXJ5IHdlbGwgaWYgeW91IGRvIG5vdCBzYXkgcmVjdXJzaXZlCisJICovCisJaWYgKG9wdGlvbnMtPnBpY2theGUpCisJCW9wdGlvbnMtPnJlY3Vyc2l2ZSA9IDE7CisKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSAmJiBvcHRpb25zLT5yZW5hbWVfbGltaXQgPCAwKQorCQlvcHRpb25zLT5yZW5hbWVfbGltaXQgPSBkaWZmX3JlbmFtZV9saW1pdF9kZWZhdWx0OworCWlmIChvcHRpb25zLT5zZXR1cCAmIERJRkZfU0VUVVBfVVNFX0NBQ0hFKSB7CisJCWlmICghYWN0aXZlX2NhY2hlKQorCQkJLyogcmVhZC1jYWNoZSBkb2VzIG5vdCBkaWUgZXZlbiB3aGVuIGl0IGZhaWxzCisJCQkgKiBzbyBpdCBpcyBzYWZlIGZvciB1cyB0byBkbyB0aGlzIGhlcmUuICBBbHNvCisJCQkgKiBpdCBkb2VzIG5vdCBzbXVkZ2UgYWN0aXZlX2NhY2hlIG9yIGFjdGl2ZV9ucgorCQkJICogd2hlbiBpdCBmYWlscywgc28gd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQKKwkJCSAqIGNsZWFuaW5nIGl0IHVwIG91cnNlbHZlcyBlaXRoZXIuCisJCQkgKi8KKwkJCXJlYWRfY2FjaGUoKTsKKwl9CisJaWYgKG9wdGlvbnMtPnNldHVwICYgRElGRl9TRVRVUF9VU0VfU0laRV9DQUNIRSkKKwkJdXNlX3NpemVfY2FjaGUgPSAxOworCWlmIChvcHRpb25zLT5hYmJyZXYgPD0gMCB8fCA0MCA8IG9wdGlvbnMtPmFiYnJldikKKwkJb3B0aW9ucy0+YWJicmV2ID0gNDA7IC8qIGZ1bGwgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9hcmcoY29uc3QgY2hhciAqYXJnLCBpbnQgYXJnX3Nob3J0LCBjb25zdCBjaGFyICphcmdfbG9uZywgaW50ICp2YWwpCit7CisJY2hhciBjLCAqZXE7CisJaW50IGxlbjsKKworCWlmICgqYXJnICE9ICctJykKKwkJcmV0dXJuIDA7CisJYyA9ICorK2FyZzsKKwlpZiAoIWMpCisJCXJldHVybiAwOworCWlmIChjID09IGFyZ19zaG9ydCkgeworCQljID0gKisrYXJnOworCQlpZiAoIWMpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHZhbCAmJiBpc2RpZ2l0KGMpKSB7CisJCQljaGFyICplbmQ7CisJCQlpbnQgbiA9IHN0cnRvdWwoYXJnLCAmZW5kLCAxMCk7CisJCQlpZiAoKmVuZCkKKwkJCQlyZXR1cm4gMDsKKwkJCSp2YWwgPSBuOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmIChjICE9ICctJykKKwkJcmV0dXJuIDA7CisJYXJnKys7CisJZXEgPSBzdHJjaHIoYXJnLCAnPScpOworCWlmIChlcSkKKwkJbGVuID0gZXEgLSBhcmc7CisJZWxzZQorCQlsZW4gPSBzdHJsZW4oYXJnKTsKKwlpZiAoIWxlbiB8fCBzdHJuY21wKGFyZywgYXJnX2xvbmcsIGxlbikpCisJCXJldHVybiAwOworCWlmIChlcSkgeworCQlpbnQgbjsKKwkJY2hhciAqZW5kOworCQlpZiAoIWlzZGlnaXQoKisrZXEpKQorCQkJcmV0dXJuIDA7CisJCW4gPSBzdHJ0b3VsKGVxLCAmZW5kLCAxMCk7CisJCWlmICgqZW5kKQorCQkJcmV0dXJuIDA7CisJCSp2YWwgPSBuOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IGRpZmZfb3B0X3BhcnNlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKiphdiwgaW50IGFjKQoreworCWNvbnN0IGNoYXIgKmFyZyA9IGF2WzBdOworCWlmICghc3RyY21wKGFyZywgIi1wIikgfHwgIXN0cmNtcChhcmcsICItdSIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIOworCWVsc2UgaWYgKG9wdF9hcmcoYXJnLCAnVScsICJ1bmlmaWVkIiwgJm9wdGlvbnMtPmNvbnRleHQpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1yYXciKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9SQVc7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXBhdGNoLXdpdGgtcmF3IikpIHsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9QQVRDSCB8IERJRkZfRk9STUFUX1JBVzsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXN0YXQiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9ESUZGU1RBVDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tY2hlY2siKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9DSEVDS0RJRkY7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLXN1bW1hcnkiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9TVU1NQVJZOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1wYXRjaC13aXRoLXN0YXQiKSkgeworCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIIHwgRElGRl9GT1JNQVRfRElGRlNUQVQ7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXoiKSkKKwkJb3B0aW9ucy0+bGluZV90ZXJtaW5hdGlvbiA9IDA7CisJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLWwiLCAyKSkKKwkJb3B0aW9ucy0+cmVuYW1lX2xpbWl0ID0gc3RydG91bChhcmcrMiwgTlVMTCwgMTApOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1mdWxsLWluZGV4IikpCisJCW9wdGlvbnMtPmZ1bGxfaW5kZXggPSAxOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1iaW5hcnkiKSkgeworCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX1BBVENIOworCQlvcHRpb25zLT5mdWxsX2luZGV4ID0gb3B0aW9ucy0+YmluYXJ5ID0gMTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItYSIpIHx8ICFzdHJjbXAoYXJnLCAiLS10ZXh0IikpIHsKKwkJb3B0aW9ucy0+dGV4dCA9IDE7CisJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uYW1lLW9ubHkiKSkKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9OQU1FOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1uYW1lLXN0YXR1cyIpKQorCQlvcHRpb25zLT5vdXRwdXRfZm9ybWF0IHw9IERJRkZfRk9STUFUX05BTUVfU1RBVFVTOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLVIiKSkKKwkJb3B0aW9ucy0+cmV2ZXJzZV9kaWZmID0gMTsKKwllbHNlIGlmICghc3RybmNtcChhcmcsICItUyIsIDIpKQorCQlvcHRpb25zLT5waWNrYXhlID0gYXJnICsgMjsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1zIikpIHsKKwkJb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCB8PSBESUZGX0ZPUk1BVF9OT19PVVRQVVQ7CisJfQorCWVsc2UgaWYgKCFzdHJuY21wKGFyZywgIi1PIiwgMikpCisJCW9wdGlvbnMtPm9yZGVyZmlsZSA9IGFyZyArIDI7CisJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLS1kaWZmLWZpbHRlcj0iLCAxNCkpCisJCW9wdGlvbnMtPmZpbHRlciA9IGFyZyArIDE0OworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1waWNrYXhlLWFsbCIpKQorCQlvcHRpb25zLT5waWNrYXhlX29wdHMgPSBESUZGX1BJQ0tBWEVfQUxMOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1waWNrYXhlLXJlZ2V4IikpCisJCW9wdGlvbnMtPnBpY2theGVfb3B0cyA9IERJRkZfUElDS0FYRV9SRUdFWDsKKwllbHNlIGlmICghc3RybmNtcChhcmcsICItQiIsIDIpKSB7CisJCWlmICgob3B0aW9ucy0+YnJlYWtfb3B0ID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmICghc3RybmNtcChhcmcsICItTSIsIDIpKSB7CisJCWlmICgob3B0aW9ucy0+cmVuYW1lX3Njb3JlID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfUkVOQU1FOworCX0KKwllbHNlIGlmICghc3RybmNtcChhcmcsICItQyIsIDIpKSB7CisJCWlmICgob3B0aW9ucy0+cmVuYW1lX3Njb3JlID0KKwkJICAgICBkaWZmX3Njb3Jlb3B0X3BhcnNlKGFyZykpID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlvcHRpb25zLT5kZXRlY3RfcmVuYW1lID0gRElGRl9ERVRFQ1RfQ09QWTsKKwl9CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLWZpbmQtY29waWVzLWhhcmRlciIpKQorCQlvcHRpb25zLT5maW5kX2NvcGllc19oYXJkZXIgPSAxOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLS1hYmJyZXYiKSkKKwkJb3B0aW9ucy0+YWJicmV2ID0gREVGQVVMVF9BQkJSRVY7CisJZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiLS1hYmJyZXY9IiwgOSkpIHsKKwkJb3B0aW9ucy0+YWJicmV2ID0gc3RydG91bChhcmcgKyA5LCBOVUxMLCAxMCk7CisJCWlmIChvcHRpb25zLT5hYmJyZXYgPCBNSU5JTVVNX0FCQlJFVikKKwkJCW9wdGlvbnMtPmFiYnJldiA9IE1JTklNVU1fQUJCUkVWOworCQllbHNlIGlmICg0MCA8IG9wdGlvbnMtPmFiYnJldikKKwkJCW9wdGlvbnMtPmFiYnJldiA9IDQwOworCX0KKwllbHNlIGlmICghc3RyY21wKGFyZywgIi0tY29sb3IiKSkKKwkJb3B0aW9ucy0+Y29sb3JfZGlmZiA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5vLWNvbG9yIikpCisJCW9wdGlvbnMtPmNvbG9yX2RpZmYgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXciKSB8fCAhc3RyY21wKGFyZywgIi0taWdub3JlLWFsbC1zcGFjZSIpKQorCQlvcHRpb25zLT54ZGxfb3B0cyB8PSBYREZfSUdOT1JFX1dISVRFU1BBQ0U7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItYiIpIHx8ICFzdHJjbXAoYXJnLCAiLS1pZ25vcmUtc3BhY2UtY2hhbmdlIikpCisJCW9wdGlvbnMtPnhkbF9vcHRzIHw9IFhERl9JR05PUkVfV0hJVEVTUEFDRV9DSEFOR0U7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItLW5vLXJlbmFtZXMiKSkKKwkJb3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSA9IDA7CisJZWxzZQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9udW0oY29uc3QgY2hhciAqKmNwX3ApCit7CisJdW5zaWduZWQgbG9uZyBudW0sIHNjYWxlOworCWludCBjaCwgZG90OworCWNvbnN0IGNoYXIgKmNwID0gKmNwX3A7CisKKwludW0gPSAwOworCXNjYWxlID0gMTsKKwlkb3QgPSAwOworCWZvcig7OykgeworCQljaCA9ICpjcDsKKwkJaWYgKCAhZG90ICYmIGNoID09ICcuJyApIHsKKwkJCXNjYWxlID0gMTsKKwkJCWRvdCA9IDE7CisJCX0gZWxzZSBpZiAoIGNoID09ICclJyApIHsKKwkJCXNjYWxlID0gZG90ID8gc2NhbGUqMTAwIDogMTAwOworCQkJY3ArKzsJLyogJSBpcyBhbHdheXMgYXQgdGhlIGVuZCAqLworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoIGNoID49ICcwJyAmJiBjaCA8PSAnOScgKSB7CisJCQlpZiAoIHNjYWxlIDwgMTAwMDAwICkgeworCQkJCXNjYWxlICo9IDEwOworCQkJCW51bSA9IChudW0qMTApICsgKGNoLScwJyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCQljcCsrOworCX0KKwkqY3BfcCA9IGNwOworCisJLyogdXNlciBzYXlzIG51bSBkaXZpZGVkIGJ5IHNjYWxlIGFuZCB3ZSBzYXkgaW50ZXJuYWxseSB0aGF0CisJICogaXMgTUFYX1NDT1JFICogbnVtIC8gc2NhbGUuCisJICovCisJcmV0dXJuIChudW0gPj0gc2NhbGUpID8gTUFYX1NDT1JFIDogKE1BWF9TQ09SRSAqIG51bSAvIHNjYWxlKTsKK30KKworaW50IGRpZmZfc2NvcmVvcHRfcGFyc2UoY29uc3QgY2hhciAqb3B0KQoreworCWludCBvcHQxLCBvcHQyLCBjbWQ7CisKKwlpZiAoKm9wdCsrICE9ICctJykKKwkJcmV0dXJuIC0xOworCWNtZCA9ICpvcHQrKzsKKwlpZiAoY21kICE9ICdNJyAmJiBjbWQgIT0gJ0MnICYmIGNtZCAhPSAnQicpCisJCXJldHVybiAtMTsgLyogdGhhdCBpcyBub3QgYSAtTSwgLUMgbm9yIC1CIG9wdGlvbiAqLworCisJb3B0MSA9IHBhcnNlX251bSgmb3B0KTsKKwlpZiAoY21kICE9ICdCJykKKwkJb3B0MiA9IDA7CisJZWxzZSB7CisJCWlmICgqb3B0ID09IDApCisJCQlvcHQyID0gMDsKKwkJZWxzZSBpZiAoKm9wdCAhPSAnLycpCisJCQlyZXR1cm4gLTE7IC8qIHdlIGV4cGVjdCAtQjgwLzk5IG9yIC1CODAgKi8KKwkJZWxzZSB7CisJCQlvcHQrKzsKKwkJCW9wdDIgPSBwYXJzZV9udW0oJm9wdCk7CisJCX0KKwl9CisJaWYgKCpvcHQgIT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBvcHQxIHwgKG9wdDIgPDwgMTYpOworfQorCitzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgZGlmZl9xdWV1ZWRfZGlmZjsKKwordm9pZCBkaWZmX3Eoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxdWV1ZSwgc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRwKQoreworCWlmIChxdWV1ZS0+YWxsb2MgPD0gcXVldWUtPm5yKSB7CisJCXF1ZXVlLT5hbGxvYyA9IGFsbG9jX25yKHF1ZXVlLT5hbGxvYyk7CisJCXF1ZXVlLT5xdWV1ZSA9IHhyZWFsbG9jKHF1ZXVlLT5xdWV1ZSwKKwkJCQkJc2l6ZW9mKGRwKSAqIHF1ZXVlLT5hbGxvYyk7CisJfQorCXF1ZXVlLT5xdWV1ZVtxdWV1ZS0+bnIrK10gPSBkcDsKK30KKworc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRpZmZfcXVldWUoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxdWV1ZSwKKwkJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwKKwkJCQkgc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3bykKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqZHAgPSB4Y2FsbG9jKDEsIHNpemVvZigqZHApKTsKKwlkcC0+b25lID0gb25lOworCWRwLT50d28gPSB0d287CisJaWYgKHF1ZXVlKQorCQlkaWZmX3EocXVldWUsIGRwKTsKKwlyZXR1cm4gZHA7Cit9CisKK3ZvaWQgZGlmZl9mcmVlX2ZpbGVwYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHAtPm9uZSk7CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEocC0+dHdvKTsKKwlmcmVlKHAtPm9uZSk7CisJZnJlZShwLT50d28pOworCWZyZWUocCk7Cit9CisKKy8qIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gZmluZF91bmlxdWVfYWJicmV2KCkgaW4gdGhhdAorICogaXQgc3R1ZmZzIHRoZSByZXN1bHQgd2l0aCBkb3RzIGZvciBhbGlnbm1lbnQuCisgKi8KK2NvbnN0IGNoYXIgKmRpZmZfdW5pcXVlX2FiYnJldihjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgbGVuKQoreworCWludCBhYmJsZW47CisJY29uc3QgY2hhciAqYWJicmV2OworCWlmIChsZW4gPT0gNDApCisJCXJldHVybiBzaGExX3RvX2hleChzaGExKTsKKworCWFiYnJldiA9IGZpbmRfdW5pcXVlX2FiYnJldihzaGExLCBsZW4pOworCWlmICghYWJicmV2KQorCQlyZXR1cm4gc2hhMV90b19oZXgoc2hhMSk7CisJYWJibGVuID0gc3RybGVuKGFiYnJldik7CisJaWYgKGFiYmxlbiA8IDM3KSB7CisJCXN0YXRpYyBjaGFyIGhleFs0MV07CisJCWlmIChsZW4gPCBhYmJsZW4gJiYgYWJibGVuIDw9IGxlbiArIDIpCisJCQlzcHJpbnRmKGhleCwgIiVzJS4qcyIsIGFiYnJldiwgbGVuKzMtYWJibGVuLCAiLi4iKTsKKwkJZWxzZQorCQkJc3ByaW50ZihoZXgsICIlcy4uLiIsIGFiYnJldik7CisJCXJldHVybiBoZXg7CisJfQorCXJldHVybiBzaGExX3RvX2hleChzaGExKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9mbHVzaF9yYXcoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsCisJCQkgICBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWludCB0d29fcGF0aHM7CisJY2hhciBzdGF0dXNbMTBdOworCWludCBhYmJyZXYgPSBvcHRpb25zLT5hYmJyZXY7CisJY29uc3QgY2hhciAqcGF0aF9vbmUsICpwYXRoX3R3bzsKKwlpbnQgaW50ZXJfbmFtZV90ZXJtaW5hdGlvbiA9ICdcdCc7CisJaW50IGxpbmVfdGVybWluYXRpb24gPSBvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uOworCisJaWYgKCFsaW5lX3Rlcm1pbmF0aW9uKQorCQlpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uID0gMDsKKworCXBhdGhfb25lID0gcC0+b25lLT5wYXRoOworCXBhdGhfdHdvID0gcC0+dHdvLT5wYXRoOworCWlmIChsaW5lX3Rlcm1pbmF0aW9uKSB7CisJCXBhdGhfb25lID0gcXVvdGVfb25lKHBhdGhfb25lKTsKKwkJcGF0aF90d28gPSBxdW90ZV9vbmUocGF0aF90d28pOworCX0KKworCWlmIChwLT5zY29yZSkKKwkJc3ByaW50ZihzdGF0dXMsICIlYyUwM2QiLCBwLT5zdGF0dXMsCisJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSkpOworCWVsc2UgeworCQlzdGF0dXNbMF0gPSBwLT5zdGF0dXM7CisJCXN0YXR1c1sxXSA9IDA7CisJfQorCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19DT1BJRUQ6CisJY2FzZSBESUZGX1NUQVRVU19SRU5BTUVEOgorCQl0d29fcGF0aHMgPSAxOworCQlicmVhazsKKwljYXNlIERJRkZfU1RBVFVTX0FEREVEOgorCWNhc2UgRElGRl9TVEFUVVNfREVMRVRFRDoKKwkJdHdvX3BhdGhzID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHdvX3BhdGhzID0gMDsKKwkJYnJlYWs7CisJfQorCWlmICghKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpIHsKKwkJcHJpbnRmKCI6JTA2byAlMDZvICVzICIsCisJCSAgICAgICBwLT5vbmUtPm1vZGUsIHAtPnR3by0+bW9kZSwKKwkJICAgICAgIGRpZmZfdW5pcXVlX2FiYnJldihwLT5vbmUtPnNoYTEsIGFiYnJldikpOworCQlwcmludGYoIiVzICIsCisJCSAgICAgICBkaWZmX3VuaXF1ZV9hYmJyZXYocC0+dHdvLT5zaGExLCBhYmJyZXYpKTsKKwl9CisJcHJpbnRmKCIlcyVjJXMiLCBzdGF0dXMsIGludGVyX25hbWVfdGVybWluYXRpb24sIHBhdGhfb25lKTsKKwlpZiAodHdvX3BhdGhzKQorCQlwcmludGYoIiVjJXMiLCBpbnRlcl9uYW1lX3Rlcm1pbmF0aW9uLCBwYXRoX3R3byk7CisJcHV0Y2hhcihsaW5lX3Rlcm1pbmF0aW9uKTsKKwlpZiAocGF0aF9vbmUgIT0gcC0+b25lLT5wYXRoKQorCQlmcmVlKCh2b2lkKilwYXRoX29uZSk7CisJaWYgKHBhdGhfdHdvICE9IHAtPnR3by0+cGF0aCkKKwkJZnJlZSgodm9pZCopcGF0aF90d28pOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZsdXNoX25hbWUoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIGludCBsaW5lX3Rlcm1pbmF0aW9uKQoreworCWNoYXIgKnBhdGggPSBwLT50d28tPnBhdGg7CisKKwlpZiAobGluZV90ZXJtaW5hdGlvbikKKwkJcGF0aCA9IHF1b3RlX29uZShwLT50d28tPnBhdGgpOworCXByaW50ZigiJXMlYyIsIHBhdGgsIGxpbmVfdGVybWluYXRpb24pOworCWlmIChwLT50d28tPnBhdGggIT0gcGF0aCkKKwkJZnJlZShwYXRoKTsKK30KKworaW50IGRpZmZfdW5tb2RpZmllZF9wYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCS8qIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBzdHJpY3RlciB0aGFuIG5lY2Vzc2FyeSB0byBzdXBwb3J0CisJICogdGhlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCB0cmFuc2Zvcm1lcnMsIGJ1dCB0aGUgaWRlYSBpcyB0bworCSAqIGxldCB0cmFuc2Zvcm1lcnMgdG8gcHJvZHVjZSBkaWZmX2ZpbGVwYWlycyBhbnkgd2F5IHRoZXkgd2FudCwKKwkgKiBhbmQgZmlsdGVyIGFuZCBjbGVhbiB0aGVtIHVwIGhlcmUgYmVmb3JlIHByb2R1Y2luZyB0aGUgb3V0cHV0LgorCSAqLworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisKKwlpZiAoRElGRl9QQUlSX1VOTUVSR0VEKHApKQorCQlyZXR1cm4gMDsgLyogdW5tZXJnZWQgaXMgaW50ZXJlc3RpbmcgKi8KKworCW9uZSA9IHAtPm9uZTsKKwl0d28gPSBwLT50d287CisKKwkvKiBkZWxldGlvbiwgYWRkaXRpb24sIG1vZGUgb3IgdHlwZSBjaGFuZ2UKKwkgKiBhbmQgcmVuYW1lIGFyZSBhbGwgaW50ZXJlc3RpbmcuCisJICovCisJaWYgKERJRkZfRklMRV9WQUxJRChvbmUpICE9IERJRkZfRklMRV9WQUxJRCh0d28pIHx8CisJICAgIERJRkZfUEFJUl9NT0RFX0NIQU5HRUQocCkgfHwKKwkgICAgc3RyY21wKG9uZS0+cGF0aCwgdHdvLT5wYXRoKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBib3RoIGFyZSB2YWxpZCBhbmQgcG9pbnQgYXQgdGhlIHNhbWUgcGF0aC4gIHRoYXQgaXMsIHdlIGFyZQorCSAqIGRlYWxpbmcgd2l0aCBhIGNoYW5nZS4KKwkgKi8KKwlpZiAob25lLT5zaGExX3ZhbGlkICYmIHR3by0+c2hhMV92YWxpZCAmJgorCSAgICAhbWVtY21wKG9uZS0+c2hhMSwgdHdvLT5zaGExLCBzaXplb2Yob25lLT5zaGExKSkpCisJCXJldHVybiAxOyAvKiBubyBjaGFuZ2UgKi8KKwlpZiAoIW9uZS0+c2hhMV92YWxpZCAmJiAhdHdvLT5zaGExX3ZhbGlkKQorCQlyZXR1cm4gMTsgLyogYm90aCBsb29rIGF0IHRoZSBzYW1lIGZpbGUgb24gdGhlIGZpbGVzeXN0ZW0uICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpZmZfZmx1c2hfcGF0Y2goc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8pCit7CisJaWYgKGRpZmZfdW5tb2RpZmllZF9wYWlyKHApKQorCQlyZXR1cm47CisKKwlpZiAoKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIFNfSVNESVIocC0+b25lLT5tb2RlKSkgfHwKKwkgICAgKERJRkZfRklMRV9WQUxJRChwLT50d28pICYmIFNfSVNESVIocC0+dHdvLT5tb2RlKSkpCisJCXJldHVybjsgLyogbm8gdHJlZSBkaWZmcyBpbiBwYXRjaCBmb3JtYXQgKi8KKworCXJ1bl9kaWZmKHAsIG8pOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZsdXNoX3N0YXQoc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm8sCisJCQkgICAgc3RydWN0IGRpZmZzdGF0X3QgKmRpZmZzdGF0KQoreworCWlmIChkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJcmV0dXJuOworCisJaWYgKChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBTX0lTRElSKHAtPm9uZS0+bW9kZSkpIHx8CisJICAgIChESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSAmJiBTX0lTRElSKHAtPnR3by0+bW9kZSkpKQorCQlyZXR1cm47IC8qIG5vIHRyZWUgZGlmZnMgaW4gcGF0Y2ggZm9ybWF0ICovCisKKwlydW5fZGlmZnN0YXQocCwgbywgZGlmZnN0YXQpOworfQorCitzdGF0aWMgdm9pZCBkaWZmX2ZsdXNoX2NoZWNrZGlmZihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwKKwkJc3RydWN0IGRpZmZfb3B0aW9ucyAqbykKK3sKKwlpZiAoZGlmZl91bm1vZGlmaWVkX3BhaXIocCkpCisJCXJldHVybjsKKworCWlmICgoRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkgJiYgU19JU0RJUihwLT5vbmUtPm1vZGUpKSB8fAorCSAgICAoRElGRl9GSUxFX1ZBTElEKHAtPnR3bykgJiYgU19JU0RJUihwLT50d28tPm1vZGUpKSkKKwkJcmV0dXJuOyAvKiBubyB0cmVlIGRpZmZzIGluIHBhdGNoIGZvcm1hdCAqLworCisJcnVuX2NoZWNrZGlmZihwLCBvKTsKK30KKworaW50IGRpZmZfcXVldWVfaXNfZW1wdHkodm9pZCkKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJaWYgKCFkaWZmX3VubW9kaWZpZWRfcGFpcihxLT5xdWV1ZVtpXSkpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworI2lmIERJRkZfREVCVUcKK3ZvaWQgZGlmZl9kZWJ1Z19maWxlc3BlYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqcywgaW50IHgsIGNvbnN0IGNoYXIgKm9uZSkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInF1ZXVlWyVkXSAlcyAoJXMpICVzICUwNm8gJXNcbiIsCisJCXgsIG9uZSA/IG9uZSA6ICIiLAorCQlzLT5wYXRoLAorCQlESUZGX0ZJTEVfVkFMSUQocykgPyAidmFsaWQiIDogImludmFsaWQiLAorCQlzLT5tb2RlLAorCQlzLT5zaGExX3ZhbGlkID8gc2hhMV90b19oZXgocy0+c2hhMSkgOiAiIik7CisJZnByaW50ZihzdGRlcnIsICJxdWV1ZVslZF0gJXMgc2l6ZSAlbHUgZmxhZ3MgJWRcbiIsCisJCXgsIG9uZSA/IG9uZSA6ICIiLAorCQlzLT5zaXplLCBzLT54ZnJtX2ZsYWdzKTsKK30KKwordm9pZCBkaWZmX2RlYnVnX2ZpbGVwYWlyKGNvbnN0IHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCBpbnQgaSkKK3sKKwlkaWZmX2RlYnVnX2ZpbGVzcGVjKHAtPm9uZSwgaSwgIm9uZSIpOworCWRpZmZfZGVidWdfZmlsZXNwZWMocC0+dHdvLCBpLCAidHdvIik7CisJZnByaW50ZihzdGRlcnIsICJzY29yZSAlZCwgc3RhdHVzICVjIHN0YXlzICVkIGJyb2tlbiAlZFxuIiwKKwkJcC0+c2NvcmUsIHAtPnN0YXR1cyA/IHAtPnN0YXR1cyA6ICc/JywKKwkJcC0+c291cmNlX3N0YXlzLCBwLT5icm9rZW5fcGFpcik7Cit9CisKK3ZvaWQgZGlmZl9kZWJ1Z19xdWV1ZShjb25zdCBjaGFyICptc2csIHN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSkKK3sKKwlpbnQgaTsKKwlpZiAobXNnKQorCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpOworCWZwcmludGYoc3RkZXJyLCAicS0+bnIgPSAlZFxuIiwgcS0+bnIpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWRpZmZfZGVidWdfZmlsZXBhaXIocCwgaSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpZmZfcmVzb2x2ZV9yZW5hbWVfY29weSh2b2lkKQoreworCWludCBpLCBqOworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCAqcHA7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisKKwlkaWZmX2RlYnVnX3F1ZXVlKCJyZXNvbHZlLXJlbmFtZS1jb3B5IiwgcSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlwID0gcS0+cXVldWVbaV07CisJCXAtPnN0YXR1cyA9IDA7IC8qIHVuZGVjaWRlZCAqLworCQlpZiAoRElGRl9QQUlSX1VOTUVSR0VEKHApKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfVU5NRVJHRUQ7CisJCWVsc2UgaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkKKwkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX0FEREVEOworCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpCisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19ERUxFVEVEOworCQllbHNlIGlmIChESUZGX1BBSVJfVFlQRV9DSEFOR0VEKHApKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfVFlQRV9DSEFOR0VEOworCisJCS8qIGZyb20gdGhpcyBwb2ludCBvbiwgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhaXIKKwkJICogd2hvc2UgYm90aCBzaWRlcyBhcmUgdmFsaWQgYW5kIG9mIHRoZSBzYW1lIHR5cGUsIGkuZS4KKwkJICogZWl0aGVyIGluLXBsYWNlIGVkaXQgb3IgcmVuYW1lL2NvcHkgZWRpdC4KKwkJICovCisJCWVsc2UgaWYgKERJRkZfUEFJUl9SRU5BTUUocCkpIHsKKwkJCWlmIChwLT5zb3VyY2Vfc3RheXMpIHsKKwkJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19DT1BJRUQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBTZWUgaWYgdGhlcmUgaXMgc29tZSBvdGhlciBmaWxlcGFpciB0aGF0CisJCQkgKiBjb3BpZXMgZnJvbSB0aGUgc2FtZSBzb3VyY2UgYXMgdXMuICBJZiBzbworCQkJICogd2UgYXJlIGEgY29weS4gIE90aGVyd2lzZSB3ZSBhcmUgZWl0aGVyIGEKKwkJCSAqIGNvcHkgaWYgdGhlIHBhdGggc3RheXMsIG9yIGEgcmVuYW1lIGlmIGl0CisJCQkgKiBkb2VzIG5vdCwgYnV0IHdlIGFscmVhZHkgaGFuZGxlZCAic3RheXMiIGNhc2UuCisJCQkgKi8KKwkJCWZvciAoaiA9IGkgKyAxOyBqIDwgcS0+bnI7IGorKykgeworCQkJCXBwID0gcS0+cXVldWVbal07CisJCQkJaWYgKHN0cmNtcChwcC0+b25lLT5wYXRoLCBwLT5vbmUtPnBhdGgpKQorCQkJCQljb250aW51ZTsgLyogbm90IHVzICovCisJCQkJaWYgKCFESUZGX1BBSVJfUkVOQU1FKHBwKSkKKwkJCQkJY29udGludWU7IC8qIG5vdCBhIHJlbmFtZS9jb3B5ICovCisJCQkJLyogcHAgaXMgYSByZW5hbWUvY29weSBmcm9tIHRoZSBzYW1lIHNvdXJjZSAqLworCQkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX0NPUElFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghcC0+c3RhdHVzKQorCQkJCXAtPnN0YXR1cyA9IERJRkZfU1RBVFVTX1JFTkFNRUQ7CisJCX0KKwkJZWxzZSBpZiAobWVtY21wKHAtPm9uZS0+c2hhMSwgcC0+dHdvLT5zaGExLCAyMCkgfHwKKwkJCSBwLT5vbmUtPm1vZGUgIT0gcC0+dHdvLT5tb2RlKQorCQkJcC0+c3RhdHVzID0gRElGRl9TVEFUVVNfTU9ESUZJRUQ7CisJCWVsc2UgeworCQkJLyogVGhpcyBpcyBhICJuby1jaGFuZ2UiIGVudHJ5IGFuZCBzaG91bGQgbm90CisJCQkgKiBoYXBwZW4gYW55bW9yZSwgYnV0IHByZXBhcmUgZm9yIGJyb2tlbiBjYWxsZXJzLgorCQkJICovCisJCQllcnJvcigiZmVlZGluZyB1bm1vZGlmaWVkICVzIHRvIGRpZmZjb3JlIiwKKwkJCSAgICAgIHAtPm9uZS0+cGF0aCk7CisJCQlwLT5zdGF0dXMgPSBESUZGX1NUQVRVU19VTktOT1dOOworCQl9CisJfQorCWRpZmZfZGVidWdfcXVldWUoInJlc29sdmUtcmVuYW1lLWNvcHkgZG9uZSIsIHEpOworfQorCitzdGF0aWMgaW50IGNoZWNrX3BhaXJfc3RhdHVzKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCXN3aXRjaCAocC0+c3RhdHVzKSB7CisJY2FzZSBESUZGX1NUQVRVU19VTktOT1dOOgorCQlyZXR1cm4gMDsKKwljYXNlIDA6CisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gZGlmZi1yZXNvbHZlLXJlbmFtZS1jb3B5Iik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCitzdGF0aWMgdm9pZCBmbHVzaF9vbmVfcGFpcihzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCWludCBmbXQgPSBvcHQtPm91dHB1dF9mb3JtYXQ7CisKKwlpZiAoZm10ICYgRElGRl9GT1JNQVRfQ0hFQ0tESUZGKQorCQlkaWZmX2ZsdXNoX2NoZWNrZGlmZihwLCBvcHQpOworCWVsc2UgaWYgKGZtdCAmIChESUZGX0ZPUk1BVF9SQVcgfCBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUykpCisJCWRpZmZfZmx1c2hfcmF3KHAsIG9wdCk7CisJZWxzZSBpZiAoZm10ICYgRElGRl9GT1JNQVRfTkFNRSkKKwkJZGlmZl9mbHVzaF9uYW1lKHAsIG9wdC0+bGluZV90ZXJtaW5hdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZmlsZV9tb2RlX25hbWUoY29uc3QgY2hhciAqbmV3ZGVsZXRlLCBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZnMpCit7CisJaWYgKGZzLT5tb2RlKQorCQlwcmludGYoIiAlcyBtb2RlICUwNm8gJXNcbiIsIG5ld2RlbGV0ZSwgZnMtPm1vZGUsIGZzLT5wYXRoKTsKKwllbHNlCisJCXByaW50ZigiICVzICVzXG4iLCBuZXdkZWxldGUsIGZzLT5wYXRoKTsKK30KKworCitzdGF0aWMgdm9pZCBzaG93X21vZGVfY2hhbmdlKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLCBpbnQgc2hvd19uYW1lKQoreworCWlmIChwLT5vbmUtPm1vZGUgJiYgcC0+dHdvLT5tb2RlICYmIHAtPm9uZS0+bW9kZSAhPSBwLT50d28tPm1vZGUpIHsKKwkJaWYgKHNob3dfbmFtZSkKKwkJCXByaW50ZigiIG1vZGUgY2hhbmdlICUwNm8gPT4gJTA2byAlc1xuIiwKKwkJCSAgICAgICBwLT5vbmUtPm1vZGUsIHAtPnR3by0+bW9kZSwgcC0+dHdvLT5wYXRoKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgbW9kZSBjaGFuZ2UgJTA2byA9PiAlMDZvXG4iLAorCQkJICAgICAgIHAtPm9uZS0+bW9kZSwgcC0+dHdvLT5tb2RlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcmVuYW1lX2NvcHkoY29uc3QgY2hhciAqcmVuYW1lY29weSwgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnApCit7CisJY29uc3QgY2hhciAqb2xkLCAqbmV3OworCisJLyogRmluZCBjb21tb24gcHJlZml4ICovCisJb2xkID0gcC0+b25lLT5wYXRoOworCW5ldyA9IHAtPnR3by0+cGF0aDsKKwl3aGlsZSAoMSkgeworCQljb25zdCBjaGFyICpzbGFzaF9vbGQsICpzbGFzaF9uZXc7CisJCXNsYXNoX29sZCA9IHN0cmNocihvbGQsICcvJyk7CisJCXNsYXNoX25ldyA9IHN0cmNocihuZXcsICcvJyk7CisJCWlmICghc2xhc2hfb2xkIHx8CisJCSAgICAhc2xhc2hfbmV3IHx8CisJCSAgICBzbGFzaF9vbGQgLSBvbGQgIT0gc2xhc2hfbmV3IC0gbmV3IHx8CisJCSAgICBtZW1jbXAob2xkLCBuZXcsIHNsYXNoX25ldyAtIG5ldykpCisJCQlicmVhazsKKwkJb2xkID0gc2xhc2hfb2xkICsgMTsKKwkJbmV3ID0gc2xhc2hfbmV3ICsgMTsKKwl9CisJLyogcC0+b25lLT5wYXRoIHRocnUgb2xkIGlzIHRoZSBjb21tb24gcHJlZml4LCBhbmQgb2xkIGFuZCBuZXcKKwkgKiB0aHJvdWdoIHRoZSBlbmQgb2YgbmFtZXMgYXJlIHJlbmFtZXMKKwkgKi8KKwlpZiAob2xkICE9IHAtPm9uZS0+cGF0aCkKKwkJcHJpbnRmKCIgJXMgJS4qc3slcyA9PiAlc30gKCVkJSUpXG4iLCByZW5hbWVjb3B5LAorCQkgICAgICAgKGludCkob2xkIC0gcC0+b25lLT5wYXRoKSwgcC0+b25lLT5wYXRoLAorCQkgICAgICAgb2xkLCBuZXcsIChpbnQpKDAuNSArIHAtPnNjb3JlICogMTAwLjAvTUFYX1NDT1JFKSk7CisJZWxzZQorCQlwcmludGYoIiAlcyAlcyA9PiAlcyAoJWQlJSlcbiIsIHJlbmFtZWNvcHksCisJCSAgICAgICBwLT5vbmUtPnBhdGgsIHAtPnR3by0+cGF0aCwKKwkJICAgICAgIChpbnQpKDAuNSArIHAtPnNjb3JlICogMTAwLjAvTUFYX1NDT1JFKSk7CisJc2hvd19tb2RlX2NoYW5nZShwLCAwKTsKK30KKworc3RhdGljIHZvaWQgZGlmZl9zdW1tYXJ5KHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwKQoreworCXN3aXRjaChwLT5zdGF0dXMpIHsKKwljYXNlIERJRkZfU1RBVFVTX0RFTEVURUQ6CisJCXNob3dfZmlsZV9tb2RlX25hbWUoImRlbGV0ZSIsIHAtPm9uZSk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfQURERUQ6CisJCXNob3dfZmlsZV9tb2RlX25hbWUoImNyZWF0ZSIsIHAtPnR3byk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfQ09QSUVEOgorCQlzaG93X3JlbmFtZV9jb3B5KCJjb3B5IiwgcCk7CisJCWJyZWFrOworCWNhc2UgRElGRl9TVEFUVVNfUkVOQU1FRDoKKwkJc2hvd19yZW5hbWVfY29weSgicmVuYW1lIiwgcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChwLT5zY29yZSkgeworCQkJcHJpbnRmKCIgcmV3cml0ZSAlcyAoJWQlJSlcbiIsIHAtPnR3by0+cGF0aCwKKwkJCQkoaW50KSgwLjUgKyBwLT5zY29yZSAqIDEwMC4wL01BWF9TQ09SRSkpOworCQkJc2hvd19tb2RlX2NoYW5nZShwLCAwKTsKKwkJfSBlbHNlCXNob3dfbW9kZV9jaGFuZ2UocCwgMSk7CisJCWJyZWFrOworCX0KK30KKworc3RydWN0IHBhdGNoX2lkX3QgeworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHhtOworCVNIQV9DVFggKmN0eDsKKwlpbnQgcGF0Y2hsZW47Cit9OworCitzdGF0aWMgaW50IHJlbW92ZV9zcGFjZShjaGFyICpsaW5lLCBpbnQgbGVuKQoreworCWludCBpOworICAgICAgICBjaGFyICpkc3QgPSBsaW5lOworICAgICAgICB1bnNpZ25lZCBjaGFyIGM7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgICAgIGlmICghaXNzcGFjZSgoYyA9IGxpbmVbaV0pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IGM7CisKKyAgICAgICAgcmV0dXJuIGRzdCAtIGxpbmU7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX2lkX2NvbnN1bWUodm9pZCAqcHJpdiwgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IHBhdGNoX2lkX3QgKmRhdGEgPSBwcml2OworCWludCBuZXdfbGVuOworCisJLyogSWdub3JlIGxpbmUgbnVtYmVycyB3aGVuIGNvbXB1dGluZyB0aGUgU0hBMSBvZiB0aGUgcGF0Y2ggKi8KKwlpZiAoIXN0cm5jbXAobGluZSwgIkBAIC0iLCA0KSkKKwkJcmV0dXJuOworCisJbmV3X2xlbiA9IHJlbW92ZV9zcGFjZShsaW5lLCBsZW4pOworCisJU0hBMV9VcGRhdGUoZGF0YS0+Y3R4LCBsaW5lLCBuZXdfbGVuKTsKKwlkYXRhLT5wYXRjaGxlbiArPSBuZXdfbGVuOworfQorCisvKiByZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBhbmQgd3JpdGVzIHJlc3VsdCBpbnRvIHNoYTEgKi8KK3N0YXRpYyBpbnQgZGlmZl9nZXRfcGF0Y2hfaWQoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlpbnQgaTsKKwlTSEFfQ1RYIGN0eDsKKwlzdHJ1Y3QgcGF0Y2hfaWRfdCBkYXRhOworCWNoYXIgYnVmZmVyW1BBVEhfTUFYICogNCArIDIwXTsKKworCVNIQTFfSW5pdCgmY3R4KTsKKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcGF0Y2hfaWRfdCkpOworCWRhdGEuY3R4ID0gJmN0eDsKKwlkYXRhLnhtLmNvbnN1bWUgPSBwYXRjaF9pZF9jb25zdW1lOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJeHBwYXJhbV90IHhwcDsKKwkJeGRlbWl0Y29uZl90IHhlY2ZnOworCQl4ZGVtaXRjYl90IGVjYjsKKwkJbW1maWxlX3QgbWYxLCBtZjI7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWludCBsZW4xLCBsZW4yOworCisJCWlmIChwLT5zdGF0dXMgPT0gMCkKKwkJCXJldHVybiBlcnJvcigiaW50ZXJuYWwgZGlmZiBzdGF0dXMgZXJyb3IiKTsKKwkJaWYgKHAtPnN0YXR1cyA9PSBESUZGX1NUQVRVU19VTktOT1dOKQorCQkJY29udGludWU7CisJCWlmIChkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmIFNfSVNESVIocC0+b25lLT5tb2RlKSkgfHwKKwkJICAgIChESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSAmJiBTX0lTRElSKHAtPnR3by0+bW9kZSkpKQorCQkJY29udGludWU7CisJCWlmIChESUZGX1BBSVJfVU5NRVJHRUQocCkpCisJCQljb250aW51ZTsKKworCQlkaWZmX2ZpbGxfc2hhMV9pbmZvKHAtPm9uZSk7CisJCWRpZmZfZmlsbF9zaGExX2luZm8ocC0+dHdvKTsKKwkJaWYgKGZpbGxfbW1maWxlKCZtZjEsIHAtPm9uZSkgPCAwIHx8CisJCQkJZmlsbF9tbWZpbGUoJm1mMiwgcC0+dHdvKSA8IDApCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byByZWFkIGZpbGVzIHRvIGRpZmYiKTsKKworCQkvKiBNYXliZSBoYXNoIHAtPnR3bz8gaW50byB0aGUgcGF0Y2ggaWQ/ICovCisJCWlmIChtbWZpbGVfaXNfYmluYXJ5KCZtZjIpKQorCQkJY29udGludWU7CisKKwkJbGVuMSA9IHJlbW92ZV9zcGFjZShwLT5vbmUtPnBhdGgsIHN0cmxlbihwLT5vbmUtPnBhdGgpKTsKKwkJbGVuMiA9IHJlbW92ZV9zcGFjZShwLT50d28tPnBhdGgsIHN0cmxlbihwLT50d28tPnBhdGgpKTsKKwkJaWYgKHAtPm9uZS0+bW9kZSA9PSAwKQorCQkJbGVuMSA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCSJkaWZmLS1naXRhLyUuKnNiLyUuKnMiCisJCQkJCSJuZXdmaWxlbW9kZSUwNm8iCisJCQkJCSItLS0vZGV2L251bGwiCisJCQkJCSIrKytiLyUuKnMiLAorCQkJCQlsZW4xLCBwLT5vbmUtPnBhdGgsCisJCQkJCWxlbjIsIHAtPnR3by0+cGF0aCwKKwkJCQkJcC0+dHdvLT5tb2RlLAorCQkJCQlsZW4yLCBwLT50d28tPnBhdGgpOworCQllbHNlIGlmIChwLT50d28tPm1vZGUgPT0gMCkKKwkJCWxlbjEgPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkJCQkiZGlmZi0tZ2l0YS8lLipzYi8lLipzIgorCQkJCQkiZGVsZXRlZGZpbGVtb2RlJTA2byIKKwkJCQkJIi0tLWEvJS4qcyIKKwkJCQkJIisrKy9kZXYvbnVsbCIsCisJCQkJCWxlbjEsIHAtPm9uZS0+cGF0aCwKKwkJCQkJbGVuMiwgcC0+dHdvLT5wYXRoLAorCQkJCQlwLT5vbmUtPm1vZGUsCisJCQkJCWxlbjEsIHAtPm9uZS0+cGF0aCk7CisJCWVsc2UKKwkJCWxlbjEgPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorCQkJCQkiZGlmZi0tZ2l0YS8lLipzYi8lLipzIgorCQkJCQkiLS0tYS8lLipzIgorCQkJCQkiKysrYi8lLipzIiwKKwkJCQkJbGVuMSwgcC0+b25lLT5wYXRoLAorCQkJCQlsZW4yLCBwLT50d28tPnBhdGgsCisJCQkJCWxlbjEsIHAtPm9uZS0+cGF0aCwKKwkJCQkJbGVuMiwgcC0+dHdvLT5wYXRoKTsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgYnVmZmVyLCBsZW4xKTsKKworCQl4cHAuZmxhZ3MgPSBYREZfTkVFRF9NSU5JTUFMOworCQl4ZWNmZy5jdHhsZW4gPSAzOworCQl4ZWNmZy5mbGFncyA9IFhETF9FTUlUX0ZVTkNOQU1FUzsKKwkJZWNiLm91dGYgPSB4ZGlmZl9vdXRmOworCQllY2IucHJpdiA9ICZkYXRhOworCQl4ZGxfZGlmZigmbWYxLCAmbWYyLCAmeHBwLCAmeGVjZmcsICZlY2IpOworCX0KKworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWZmX2ZsdXNoX3BhdGNoX2lkKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJaW50IGk7CisJaW50IHJlc3VsdCA9IGRpZmZfZ2V0X3BhdGNoX2lkKG9wdGlvbnMsIHNoYTEpOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspCisJCWRpZmZfZnJlZV9maWxlcGFpcihxLT5xdWV1ZVtpXSk7CisKKwlmcmVlKHEtPnF1ZXVlKTsKKwlxLT5xdWV1ZSA9IE5VTEw7CisJcS0+bnIgPSBxLT5hbGxvYyA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGlzX3N1bW1hcnlfZW1wdHkoY29uc3Qgc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKworCQlzd2l0Y2ggKHAtPnN0YXR1cykgeworCQljYXNlIERJRkZfU1RBVFVTX0RFTEVURUQ6CisJCWNhc2UgRElGRl9TVEFUVVNfQURERUQ6CisJCWNhc2UgRElGRl9TVEFUVVNfQ09QSUVEOgorCQljYXNlIERJRkZfU1RBVFVTX1JFTkFNRUQ6CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCWlmIChwLT5zY29yZSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChwLT5vbmUtPm1vZGUgJiYgcC0+dHdvLT5tb2RlICYmCisJCQkgICAgcC0+b25lLT5tb2RlICE9IHAtPnR3by0+bW9kZSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAxOworfQorCit2b2lkIGRpZmZfZmx1c2goc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlpbnQgaSwgb3V0cHV0X2Zvcm1hdCA9IG9wdGlvbnMtPm91dHB1dF9mb3JtYXQ7CisJaW50IHNlcGFyYXRvciA9IDA7CisKKwkvKgorCSAqIE9yZGVyOiByYXcsIHN0YXQsIHN1bW1hcnksIHBhdGNoCisJICogb3I6ICAgIG5hbWUvbmFtZS1zdGF0dXMvY2hlY2tkaWZmIChvdGhlciBiaXRzIGNsZWFyKQorCSAqLworCWlmICghcS0+bnIpCisJCWdvdG8gZnJlZV9xdWV1ZTsKKworCWlmIChvdXRwdXRfZm9ybWF0ICYgKERJRkZfRk9STUFUX1JBVyB8CisJCQkgICAgIERJRkZfRk9STUFUX05BTUUgfAorCQkJICAgICBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUyB8CisJCQkgICAgIERJRkZfRk9STUFUX0NIRUNLRElGRikpIHsKKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCQlpZiAoY2hlY2tfcGFpcl9zdGF0dXMocCkpCisJCQkJZmx1c2hfb25lX3BhaXIocCwgb3B0aW9ucyk7CisJCX0KKwkJc2VwYXJhdG9yKys7CisJfQorCisJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9ESUZGU1RBVCkgeworCQlzdHJ1Y3QgZGlmZnN0YXRfdCBkaWZmc3RhdDsKKworCQltZW1zZXQoJmRpZmZzdGF0LCAwLCBzaXplb2Yoc3RydWN0IGRpZmZzdGF0X3QpKTsKKwkJZGlmZnN0YXQueG0uY29uc3VtZSA9IGRpZmZzdGF0X2NvbnN1bWU7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQkJaWYgKGNoZWNrX3BhaXJfc3RhdHVzKHApKQorCQkJCWRpZmZfZmx1c2hfc3RhdChwLCBvcHRpb25zLCAmZGlmZnN0YXQpOworCQl9CisJCXNob3dfc3RhdHMoJmRpZmZzdGF0KTsKKwkJc2VwYXJhdG9yKys7CisJfQorCisJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9TVU1NQVJZICYmICFpc19zdW1tYXJ5X2VtcHR5KHEpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJZGlmZl9zdW1tYXJ5KHEtPnF1ZXVlW2ldKTsKKwkJc2VwYXJhdG9yKys7CisJfQorCisJaWYgKG91dHB1dF9mb3JtYXQgJiBESUZGX0ZPUk1BVF9QQVRDSCkgeworCQlpZiAoc2VwYXJhdG9yKSB7CisJCQlpZiAob3B0aW9ucy0+c3RhdF9zZXApIHsKKwkJCQkvKiBhdHRhY2ggcGF0Y2ggaW5zdGVhZCBvZiBpbmxpbmUgKi8KKwkJCQlmcHV0cyhvcHRpb25zLT5zdGF0X3NlcCwgc3Rkb3V0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHV0Y2hhcihvcHRpb25zLT5saW5lX3Rlcm1pbmF0aW9uKTsKKwkJCX0KKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQkJaWYgKGNoZWNrX3BhaXJfc3RhdHVzKHApKQorCQkJCWRpZmZfZmx1c2hfcGF0Y2gocCwgb3B0aW9ucyk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykKKwkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKK2ZyZWVfcXVldWU6CisJZnJlZShxLT5xdWV1ZSk7CisJcS0+cXVldWUgPSBOVUxMOworCXEtPm5yID0gcS0+YWxsb2MgPSAwOworfQorCitzdGF0aWMgdm9pZCBkaWZmY29yZV9hcHBseV9maWx0ZXIoY29uc3QgY2hhciAqZmlsdGVyKQoreworCWludCBpOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCW91dHEucXVldWUgPSBOVUxMOworCW91dHEubnIgPSBvdXRxLmFsbG9jID0gMDsKKworCWlmICghZmlsdGVyKQorCQlyZXR1cm47CisKKwlpZiAoc3RyY2hyKGZpbHRlciwgRElGRl9TVEFUVVNfRklMVEVSX0FPTikpIHsKKwkJaW50IGZvdW5kOworCQlmb3IgKGkgPSBmb3VuZCA9IDA7ICFmb3VuZCAmJiBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWlmICgoKHAtPnN0YXR1cyA9PSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgKChwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX0ZJTFRFUl9CUk9LRU4pKSB8fAorCQkJICAgICAgKCFwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX01PRElGSUVEKSkpKSB8fAorCQkJICAgICgocC0+c3RhdHVzICE9IERJRkZfU1RBVFVTX01PRElGSUVEKSAmJgorCQkJICAgICBzdHJjaHIoZmlsdGVyLCBwLT5zdGF0dXMpKSkKKwkJCQlmb3VuZCsrOworCQl9CisJCWlmIChmb3VuZCkKKwkJCXJldHVybjsKKworCQkvKiBvdGhlcndpc2Ugd2Ugd2lsbCBjbGVhciB0aGUgd2hvbGUgcXVldWUKKwkJICogYnkgY29weWluZyB0aGUgZW1wdHkgb3V0cSBhdCB0aGUgZW5kIG9mIHRoaXMKKwkJICogZnVuY3Rpb24sIGJ1dCBmaXJzdCBjbGVhciB0aGUgY3VycmVudCBlbnRyaWVzCisJCSAqIGluIHRoZSBxdWV1ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKKwl9CisJZWxzZSB7CisJCS8qIE9ubHkgdGhlIG1hdGNoaW5nIG9uZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisKKwkJCWlmICgoKHAtPnN0YXR1cyA9PSBESUZGX1NUQVRVU19NT0RJRklFRCkgJiYKKwkJCSAgICAgKChwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX0ZJTFRFUl9CUk9LRU4pKSB8fAorCQkJICAgICAgKCFwLT5zY29yZSAmJgorCQkJICAgICAgIHN0cmNocihmaWx0ZXIsIERJRkZfU1RBVFVTX01PRElGSUVEKSkpKSB8fAorCQkJICAgICgocC0+c3RhdHVzICE9IERJRkZfU1RBVFVTX01PRElGSUVEKSAmJgorCQkJICAgICBzdHJjaHIoZmlsdGVyLCBwLT5zdGF0dXMpKSkKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQkJZWxzZQorCQkJCWRpZmZfZnJlZV9maWxlcGFpcihwKTsKKwkJfQorCX0KKwlmcmVlKHEtPnF1ZXVlKTsKKwkqcSA9IG91dHE7Cit9CisKK3ZvaWQgZGlmZmNvcmVfc3RkKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaWYgKG9wdGlvbnMtPmJyZWFrX29wdCAhPSAtMSkKKwkJZGlmZmNvcmVfYnJlYWsob3B0aW9ucy0+YnJlYWtfb3B0KTsKKwlpZiAob3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZSkKKwkJZGlmZmNvcmVfcmVuYW1lKG9wdGlvbnMpOworCWlmIChvcHRpb25zLT5icmVha19vcHQgIT0gLTEpCisJCWRpZmZjb3JlX21lcmdlX2Jyb2tlbigpOworCWlmIChvcHRpb25zLT5waWNrYXhlKQorCQlkaWZmY29yZV9waWNrYXhlKG9wdGlvbnMtPnBpY2theGUsIG9wdGlvbnMtPnBpY2theGVfb3B0cyk7CisJaWYgKG9wdGlvbnMtPm9yZGVyZmlsZSkKKwkJZGlmZmNvcmVfb3JkZXIob3B0aW9ucy0+b3JkZXJmaWxlKTsKKwlkaWZmX3Jlc29sdmVfcmVuYW1lX2NvcHkoKTsKKwlkaWZmY29yZV9hcHBseV9maWx0ZXIob3B0aW9ucy0+ZmlsdGVyKTsKK30KKworCit2b2lkIGRpZmZjb3JlX3N0ZF9ub19yZXNvbHZlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMpCit7CisJaWYgKG9wdGlvbnMtPnBpY2theGUpCisJCWRpZmZjb3JlX3BpY2theGUob3B0aW9ucy0+cGlja2F4ZSwgb3B0aW9ucy0+cGlja2F4ZV9vcHRzKTsKKwlpZiAob3B0aW9ucy0+b3JkZXJmaWxlKQorCQlkaWZmY29yZV9vcmRlcihvcHRpb25zLT5vcmRlcmZpbGUpOworCWRpZmZjb3JlX2FwcGx5X2ZpbHRlcihvcHRpb25zLT5maWx0ZXIpOworfQorCit2b2lkIGRpZmZfYWRkcmVtb3ZlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdGlvbnMsCisJCSAgICBpbnQgYWRkcmVtb3ZlLCB1bnNpZ25lZCBtb2RlLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJICAgIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciBjb25jYXRwYXRoW1BBVEhfTUFYXTsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvOworCisJLyogVGhpcyBtYXkgbG9vayBvZGQsIGJ1dCBpdCBpcyBhIHByZXBhcmF0aW9uIGZvcgorCSAqIGZlZWRpbmcgInRoZXJlIGFyZSB1bmNoYW5nZWQgZmlsZXMgd2hpY2ggc2hvdWxkCisJICogbm90IHByb2R1Y2UgZGlmZnMsIGJ1dCB3aGVuIHlvdSBhcmUgZG9pbmcgY29weQorCSAqIGRldGVjdGlvbiB5b3Ugd291bGQgbmVlZCB0aGVtLCBzbyBoZXJlIHRoZXkgYXJlIgorCSAqIGVudHJpZXMgdG8gdGhlIGRpZmYtY29yZS4gIFRoZXkgd2lsbCBiZSBwcmVmaXhlZAorCSAqIHdpdGggc29tZXRoaW5nIGxpa2UgJz0nIG9yICcqJyAoSSBoYXZlbid0IGRlY2lkZWQKKwkgKiB3aGljaCBidXQgc2hvdWxkIG5vdCBtYWtlIGFueSBkaWZmZXJlbmNlKS4KKwkgKiBGZWVkaW5nIHRoZSBzYW1lIG5ldyBhbmQgb2xkIHRvIGRpZmZfY2hhbmdlKCkgCisJICogYWxzbyBoYXMgdGhlIHNhbWUgZWZmZWN0LgorCSAqIEJlZm9yZSB0aGUgZmluYWwgb3V0cHV0IGhhcHBlbnMsIHRoZXkgYXJlIHBydW5lZCBhZnRlcgorCSAqIG1lcmdlZCBpbnRvIHJlbmFtZS9jb3B5IHBhaXJzIGFzIGFwcHJvcHJpYXRlLgorCSAqLworCWlmIChvcHRpb25zLT5yZXZlcnNlX2RpZmYpCisJCWFkZHJlbW92ZSA9IChhZGRyZW1vdmUgPT0gJysnID8gJy0nIDoKKwkJCSAgICAgYWRkcmVtb3ZlID09ICctJyA/ICcrJyA6IGFkZHJlbW92ZSk7CisKKwlpZiAoIXBhdGgpIHBhdGggPSAiIjsKKwlzcHJpbnRmKGNvbmNhdHBhdGgsICIlcyVzIiwgYmFzZSwgcGF0aCk7CisJb25lID0gYWxsb2NfZmlsZXNwZWMoY29uY2F0cGF0aCk7CisJdHdvID0gYWxsb2NfZmlsZXNwZWMoY29uY2F0cGF0aCk7CisKKwlpZiAoYWRkcmVtb3ZlICE9ICcrJykKKwkJZmlsbF9maWxlc3BlYyhvbmUsIHNoYTEsIG1vZGUpOworCWlmIChhZGRyZW1vdmUgIT0gJy0nKQorCQlmaWxsX2ZpbGVzcGVjKHR3bywgc2hhMSwgbW9kZSk7CisKKwlkaWZmX3F1ZXVlKCZkaWZmX3F1ZXVlZF9kaWZmLCBvbmUsIHR3byk7Cit9CisKK3ZvaWQgZGlmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCSBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKSAKK3sKKwljaGFyIGNvbmNhdHBhdGhbUEFUSF9NQVhdOworCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUsICp0d287CisKKwlpZiAob3B0aW9ucy0+cmV2ZXJzZV9kaWZmKSB7CisJCXVuc2lnbmVkIHRtcDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqdG1wX2M7CisJCXRtcCA9IG9sZF9tb2RlOyBvbGRfbW9kZSA9IG5ld19tb2RlOyBuZXdfbW9kZSA9IHRtcDsKKwkJdG1wX2MgPSBvbGRfc2hhMTsgb2xkX3NoYTEgPSBuZXdfc2hhMTsgbmV3X3NoYTEgPSB0bXBfYzsKKwl9CisJaWYgKCFwYXRoKSBwYXRoID0gIiI7CisJc3ByaW50Zihjb25jYXRwYXRoLCAiJXMlcyIsIGJhc2UsIHBhdGgpOworCW9uZSA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCXR3byA9IGFsbG9jX2ZpbGVzcGVjKGNvbmNhdHBhdGgpOworCWZpbGxfZmlsZXNwZWMob25lLCBvbGRfc2hhMSwgb2xkX21vZGUpOworCWZpbGxfZmlsZXNwZWModHdvLCBuZXdfc2hhMSwgbmV3X21vZGUpOworCisJZGlmZl9xdWV1ZSgmZGlmZl9xdWV1ZWRfZGlmZiwgb25lLCB0d28pOworfQorCit2b2lkIGRpZmZfdW5tZXJnZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSwgKnR3bzsKKwlvbmUgPSBhbGxvY19maWxlc3BlYyhwYXRoKTsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhwYXRoKTsKKwlkaWZmX3F1ZXVlKCZkaWZmX3F1ZXVlZF9kaWZmLCBvbmUsIHR3byk7Cit9CmRpZmYgLS1naXQgYS9kaWZmLmggYi9kaWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjZWQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2RpZmYuaApAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaWZuZGVmIERJRkZfSAorI2RlZmluZSBESUZGX0gKKworI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorCitzdHJ1Y3QgcmV2X2luZm87CitzdHJ1Y3QgZGlmZl9vcHRpb25zOworCit0eXBlZGVmIHZvaWQgKCpjaGFuZ2VfZm5fdCkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJIHVuc2lnbmVkIG9sZF9tb2RlLCB1bnNpZ25lZCBuZXdfbW9kZSwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3X3NoYTEsCisJCSBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKTsKKwordHlwZWRlZiB2b2lkICgqYWRkX3JlbW92ZV9mbl90KShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgICAgaW50IGFkZHJlbW92ZSwgdW5zaWduZWQgbW9kZSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCSAgICBjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKTsKKworI2RlZmluZSBESUZGX0ZPUk1BVF9SQVcJCTB4MDAwMQorI2RlZmluZSBESUZGX0ZPUk1BVF9ESUZGU1RBVAkweDAwMDIKKyNkZWZpbmUgRElGRl9GT1JNQVRfU1VNTUFSWQkweDAwMDQKKyNkZWZpbmUgRElGRl9GT1JNQVRfUEFUQ0gJMHgwMDA4CisKKy8qIFRoZXNlIG92ZXJyaWRlIGFsbCBhYm92ZSAqLworI2RlZmluZSBESUZGX0ZPUk1BVF9OQU1FCTB4MDAxMAorI2RlZmluZSBESUZGX0ZPUk1BVF9OQU1FX1NUQVRVUwkweDAwMjAKKyNkZWZpbmUgRElGRl9GT1JNQVRfQ0hFQ0tESUZGCTB4MDA0MAorCisvKiBTYW1lIGFzIG91dHB1dF9mb3JtYXQgPSAwIGJ1dCB3ZSBrbm93IHRoYXQgLXMgZmxhZyB3YXMgZ2l2ZW4KKyAqIGFuZCB3ZSBzaG91bGQgbm90IGdpdmUgZGVmYXVsdCB2YWx1ZSB0byBvdXRwdXRfZm9ybWF0LgorICovCisjZGVmaW5lIERJRkZfRk9STUFUX05PX09VVFBVVAkweDAwODAKKworc3RydWN0IGRpZmZfb3B0aW9ucyB7CisJY29uc3QgY2hhciAqZmlsdGVyOworCWNvbnN0IGNoYXIgKm9yZGVyZmlsZTsKKwljb25zdCBjaGFyICpwaWNrYXhlOworCXVuc2lnbmVkIHJlY3Vyc2l2ZToxLAorCQkgdHJlZV9pbl9yZWN1cnNpdmU6MSwKKwkJIGJpbmFyeToxLAorCQkgdGV4dDoxLAorCQkgZnVsbF9pbmRleDoxLAorCQkgc2lsZW50X29uX3JlbW92ZToxLAorCQkgZmluZF9jb3BpZXNfaGFyZGVyOjEsCisJCSBjb2xvcl9kaWZmOjE7CisJaW50IGNvbnRleHQ7CisJaW50IGJyZWFrX29wdDsKKwlpbnQgZGV0ZWN0X3JlbmFtZTsKKwlpbnQgbGluZV90ZXJtaW5hdGlvbjsKKwlpbnQgb3V0cHV0X2Zvcm1hdDsKKwlpbnQgcGlja2F4ZV9vcHRzOworCWludCByZW5hbWVfc2NvcmU7CisJaW50IHJldmVyc2VfZGlmZjsKKwlpbnQgcmVuYW1lX2xpbWl0OworCWludCBzZXR1cDsKKwlpbnQgYWJicmV2OworCWNvbnN0IGNoYXIgKm1zZ19zZXA7CisJY29uc3QgY2hhciAqc3RhdF9zZXA7CisJbG9uZyB4ZGxfb3B0czsKKworCWludCBucl9wYXRoczsKKwljb25zdCBjaGFyICoqcGF0aHM7CisJaW50ICpwYXRobGVuczsKKwljaGFuZ2VfZm5fdCBjaGFuZ2U7CisJYWRkX3JlbW92ZV9mbl90IGFkZF9yZW1vdmU7Cit9OworCitlbnVtIGNvbG9yX2RpZmYgeworCURJRkZfUkVTRVQgPSAwLAorCURJRkZfUExBSU4gPSAxLAorCURJRkZfTUVUQUlORk8gPSAyLAorCURJRkZfRlJBR0lORk8gPSAzLAorCURJRkZfRklMRV9PTEQgPSA0LAorCURJRkZfRklMRV9ORVcgPSA1LAorCURJRkZfQ09NTUlUID0gNiwKK307Citjb25zdCBjaGFyICpkaWZmX2dldF9jb2xvcihpbnQgZGlmZl91c2VfY29sb3IsIGVudW0gY29sb3JfZGlmZiBpeCk7CisKK2V4dGVybiBjb25zdCBjaGFyIG1pbWVfYm91bmRhcnlfbGVhZGVyW107CisKK2V4dGVybiB2b2lkIGRpZmZfdHJlZV9zZXR1cF9wYXRocyhjb25zdCBjaGFyICoqcGF0aHMsIHN0cnVjdCBkaWZmX29wdGlvbnMgKik7CitleHRlcm4gdm9pZCBkaWZmX3RyZWVfcmVsZWFzZV9wYXRocyhzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIGludCBkaWZmX3RyZWUoc3RydWN0IHRyZWVfZGVzYyAqdDEsIHN0cnVjdCB0cmVlX2Rlc2MgKnQyLAorCQkgICAgIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCk7CitleHRlcm4gaW50IGRpZmZfdHJlZV9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZCwgY29uc3QgdW5zaWduZWQgY2hhciAqbmV3LAorCQkJICBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpOworCitzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggeworCXN0cnVjdCBjb21iaW5lX2RpZmZfcGF0aCAqbmV4dDsKKwlpbnQgbGVuOworCWNoYXIgKnBhdGg7CisJdW5zaWduZWQgaW50IG1vZGU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3QgY29tYmluZV9kaWZmX3BhcmVudCB7CisJCWNoYXIgc3RhdHVzOworCQl1bnNpZ25lZCBpbnQgbW9kZTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl9IHBhcmVudFtGTEVYX0FSUkFZXTsKK307CisjZGVmaW5lIGNvbWJpbmVfZGlmZl9wYXRoX3NpemUobiwgbCkgXAorCShzaXplb2Yoc3RydWN0IGNvbWJpbmVfZGlmZl9wYXRoKSArIFwKKwkgc2l6ZW9mKHN0cnVjdCBjb21iaW5lX2RpZmZfcGFyZW50KSAqIChuKSArIChsKSArIDEpCisKK2V4dGVybiB2b2lkIHNob3dfY29tYmluZWRfZGlmZihzdHJ1Y3QgY29tYmluZV9kaWZmX3BhdGggKmVsZW0sIGludCBudW1fcGFyZW50LAorCQkJICAgICAgaW50IGRlbnNlLCBzdHJ1Y3QgcmV2X2luZm8gKik7CisKK2V4dGVybiB2b2lkIGRpZmZfdHJlZV9jb21iaW5lZChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCB1bnNpZ25lZCBjaGFyIHBhcmVudFtdWzIwXSwgaW50IG51bV9wYXJlbnQsIGludCBkZW5zZSwgc3RydWN0IHJldl9pbmZvICpyZXYpOworCitleHRlcm4gdm9pZCBkaWZmX3RyZWVfY29tYmluZWRfbWVyZ2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50LCBzdHJ1Y3QgcmV2X2luZm8gKik7CisKK2V4dGVybiB2b2lkIGRpZmZfYWRkcmVtb3ZlKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwKKwkJCSAgIGludCBhZGRyZW1vdmUsCisJCQkgICB1bnNpZ25lZCBtb2RlLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCSAgIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkgICBjb25zdCBjaGFyICpwYXRoKTsKKworZXh0ZXJuIHZvaWQgZGlmZl9jaGFuZ2Uoc3RydWN0IGRpZmZfb3B0aW9ucyAqLAorCQkJdW5zaWduZWQgbW9kZTEsIHVuc2lnbmVkIG1vZGUyLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTIsCisJCQljb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpwYXRoKTsKKworZXh0ZXJuIHZvaWQgZGlmZl91bm1lcmdlKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwKKwkJCSBjb25zdCBjaGFyICpwYXRoKTsKKworZXh0ZXJuIGludCBkaWZmX3Njb3Jlb3B0X3BhcnNlKGNvbnN0IGNoYXIgKm9wdCk7CisKKyNkZWZpbmUgRElGRl9TRVRVUF9SRVZFUlNFICAgICAgCTEKKyNkZWZpbmUgRElGRl9TRVRVUF9VU0VfQ0FDSEUJCTIKKyNkZWZpbmUgRElGRl9TRVRVUF9VU0VfU0laRV9DQUNIRQk0CisKK2V4dGVybiBpbnQgZ2l0X2RpZmZfdWlfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpOworZXh0ZXJuIHZvaWQgZGlmZl9zZXR1cChzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIGludCBkaWZmX29wdF9wYXJzZShzdHJ1Y3QgZGlmZl9vcHRpb25zICosIGNvbnN0IGNoYXIgKiosIGludCk7CitleHRlcm4gaW50IGRpZmZfc2V0dXBfZG9uZShzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworCisjZGVmaW5lIERJRkZfREVURUNUX1JFTkFNRQkxCisjZGVmaW5lIERJRkZfREVURUNUX0NPUFkJMgorCisjZGVmaW5lIERJRkZfUElDS0FYRV9BTEwJMQorI2RlZmluZSBESUZGX1BJQ0tBWEVfUkVHRVgJMgorCitleHRlcm4gdm9pZCBkaWZmY29yZV9zdGQoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKKworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfc3RkX25vX3Jlc29sdmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqKTsKKworI2RlZmluZSBDT01NT05fRElGRl9PUFRJT05TX0hFTFAgXAorIlxuY29tbW9uIGRpZmYgb3B0aW9uczpcbiIgXAorIiAgLXogICAgICAgICAgICBvdXRwdXQgZGlmZi1yYXcgd2l0aCBsaW5lcyB0ZXJtaW5hdGVkIHdpdGggTlVMLlxuIiBcCisiICAtcCAgICAgICAgICAgIG91dHB1dCBwYXRjaCBmb3JtYXQuXG4iIFwKKyIgIC11ICAgICAgICAgICAgc3lub255bSBmb3IgLXAuXG4iIFwKKyIgIC0tcGF0Y2gtd2l0aC1yYXdcbiIgXAorIiAgICAgICAgICAgICAgICBvdXRwdXQgYm90aCBhIHBhdGNoIGFuZCB0aGUgZGlmZi1yYXcgZm9ybWF0LlxuIiBcCisiICAtLXN0YXQgICAgICAgIHNob3cgZGlmZnN0YXQgaW5zdGVhZCBvZiBwYXRjaC5cbiIgXAorIiAgLS1wYXRjaC13aXRoLXN0YXRcbiIgXAorIiAgICAgICAgICAgICAgICBvdXRwdXQgYSBwYXRjaCBhbmQgcHJlcGVuZCBpdHMgZGlmZnN0YXQuXG4iIFwKKyIgIC0tbmFtZS1vbmx5ICAgc2hvdyBvbmx5IG5hbWVzIG9mIGNoYW5nZWQgZmlsZXMuXG4iIFwKKyIgIC0tbmFtZS1zdGF0dXMgc2hvdyBuYW1lcyBhbmQgc3RhdHVzIG9mIGNoYW5nZWQgZmlsZXMuXG4iIFwKKyIgIC0tZnVsbC1pbmRleCAgc2hvdyBmdWxsIG9iamVjdCBuYW1lIG9uIGluZGV4IGxpbmVzLlxuIiBcCisiICAtLWFiYnJldj08bj4gIGFiYnJldmlhdGUgb2JqZWN0IG5hbWVzIGluIGRpZmYtdHJlZSBoZWFkZXIgYW5kIGRpZmYtcmF3LlxuIiBcCisiICAtUiAgICAgICAgICAgIHN3YXAgaW5wdXQgZmlsZSBwYWlycy5cbiIgXAorIiAgLUIgICAgICAgICAgICBkZXRlY3QgY29tcGxldGUgcmV3cml0ZXMuXG4iIFwKKyIgIC1NICAgICAgICAgICAgZGV0ZWN0IHJlbmFtZXMuXG4iIFwKKyIgIC1DICAgICAgICAgICAgZGV0ZWN0IGNvcGllcy5cbiIgXAorIiAgLS1maW5kLWNvcGllcy1oYXJkZXJcbiIgXAorIiAgICAgICAgICAgICAgICB0cnkgdW5jaGFuZ2VkIGZpbGVzIGFzIGNhbmRpZGF0ZSBmb3IgY29weSBkZXRlY3Rpb24uXG4iIFwKKyIgIC1sPG4+ICAgICAgICAgbGltaXQgcmVuYW1lIGF0dGVtcHRzIHVwIHRvIDxuPiBwYXRocy5cbiIgXAorIiAgLU88ZmlsZT4gICAgICByZW9yZGVyIGRpZmZzIGFjY29yZGluZyB0byB0aGUgPGZpbGU+LlxuIiBcCisiICAtUzxzdHJpbmc+ICAgIGZpbmQgZmlsZXBhaXIgd2hvc2Ugb25seSBvbmUgc2lkZSBjb250YWlucyB0aGUgc3RyaW5nLlxuIiBcCisiICAtLXBpY2theGUtYWxsXG4iIFwKKyIgICAgICAgICAgICAgICAgc2hvdyBhbGwgZmlsZXMgZGlmZiB3aGVuIC1TIGlzIHVzZWQgYW5kIGhpdCBpcyBmb3VuZC5cbiIgXAorIiAgLWEgIC0tdGV4dCAgICB0cmVhdCBhbGwgZmlsZXMgYXMgdGV4dC5cbiIKKworZXh0ZXJuIGludCBkaWZmX3F1ZXVlX2lzX2VtcHR5KHZvaWQpOworZXh0ZXJuIHZvaWQgZGlmZl9mbHVzaChzdHJ1Y3QgZGlmZl9vcHRpb25zKik7CisKKy8qIGRpZmYtcmF3IHN0YXR1cyBsZXR0ZXJzICovCisjZGVmaW5lIERJRkZfU1RBVFVTX0FEREVECQknQScKKyNkZWZpbmUgRElGRl9TVEFUVVNfQ09QSUVECQknQycKKyNkZWZpbmUgRElGRl9TVEFUVVNfREVMRVRFRAkJJ0QnCisjZGVmaW5lIERJRkZfU1RBVFVTX01PRElGSUVECQknTScKKyNkZWZpbmUgRElGRl9TVEFUVVNfUkVOQU1FRAkJJ1InCisjZGVmaW5lIERJRkZfU1RBVFVTX1RZUEVfQ0hBTkdFRAknVCcKKyNkZWZpbmUgRElGRl9TVEFUVVNfVU5LTk9XTgkJJ1gnCisjZGVmaW5lIERJRkZfU1RBVFVTX1VOTUVSR0VECQknVScKKworLyogdGhlc2UgYXJlIG5vdCBkaWZmLXJhdyBzdGF0dXMgbGV0dGVycyBwcm9wZXIsIGJ1dCB1c2VkIGJ5CisgKiBkaWZmY29yZS1maWx0ZXIgaW5zbiB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zLgorICovCisjZGVmaW5lIERJRkZfU1RBVFVTX0ZJTFRFUl9BT04JCScqJworI2RlZmluZSBESUZGX1NUQVRVU19GSUxURVJfQlJPS0VOCSdCJworCitleHRlcm4gY29uc3QgY2hhciAqZGlmZl91bmlxdWVfYWJicmV2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKworZXh0ZXJuIGludCBydW5fZGlmZl9maWxlcyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGludCBzaWxlbnRfb25fcmVtb3ZlZCk7CisKK2V4dGVybiBpbnQgcnVuX2RpZmZfaW5kZXgoc3RydWN0IHJldl9pbmZvICpyZXZzLCBpbnQgY2FjaGVkKTsKKworZXh0ZXJuIGludCBkaWZmX2ZsdXNoX3BhdGNoX2lkKHN0cnVjdCBkaWZmX29wdGlvbnMgKiwgdW5zaWduZWQgY2hhciAqKTsKKworI2VuZGlmIC8qIERJRkZfSCAqLwpkaWZmIC0tZ2l0IGEvZGlmZmNvcmUtYnJlYWsuYyBiL2RpZmZjb3JlLWJyZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwZTE0YwotLS0gL2Rldi9udWxsCisrKyBiL2RpZmZjb3JlLWJyZWFrLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisKK3N0YXRpYyBpbnQgc2hvdWxkX2JyZWFrKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpzcmMsCisJCQlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJaW50IGJyZWFrX3Njb3JlLAorCQkJaW50ICptZXJnZV9zY29yZV9wKQoreworCS8qIGRzdCBpcyByZWNvcmRlZCBhcyBhIG1vZGlmaWNhdGlvbiBvZiBzcmMuICBBcmUgdGhleSBzbworCSAqIGRpZmZlcmVudCB0aGF0IHdlIGFyZSBiZXR0ZXIgb2ZmIHJlY29yZGluZyB0aGlzIGFzIGEgcGFpcgorCSAqIG9mIGRlbGV0ZSBhbmQgY3JlYXRlPworCSAqCisJICogVGhlcmUgYXJlIHR3byBjcml0ZXJpYSB1c2VkIGluIHRoaXMgYWxnb3JpdGhtLiAgRm9yIHRoZQorCSAqIHB1cnBvc2VzIG9mIGhlbHBpbmcgbGF0ZXIgcmVuYW1lL2NvcHksIHdlIHRha2UgYm90aCBkZWxldGUKKwkgKiBhbmQgaW5zZXJ0IGludG8gYWNjb3VudCBhbmQgZXN0aW1hdGUgdGhlIGFtb3VudCBvZiAiZWRpdCIuCisJICogSWYgdGhlIGVkaXQgaXMgdmVyeSBsYXJnZSwgd2UgYnJlYWsgdGhpcyBwYWlyIHNvIHRoYXQKKwkgKiByZW5hbWUvY29weSBjYW4gcGljayB0aGUgcGllY2VzIHVwIHRvIG1hdGNoIHdpdGggb3RoZXIKKwkgKiBmaWxlcy4KKwkgKgorCSAqIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSB3b3VsZCB3YW50IHRvIGlnbm9yZSBpbnNlcnRzIGZvciB0aGUKKwkgKiBwdXJlICJjb21wbGV0ZSByZXdyaXRlIiBkZXRlY3Rpb24uICBBcyBsb25nIGFzIG1vc3Qgb2YgdGhlCisJICogZXhpc3RpbmcgY29udGVudHMgd2VyZSByZW1vdmVkIGZyb20gdGhlIGZpbGUsIGl0IGlzIGEKKwkgKiBjb21wbGV0ZSByZXdyaXRlLCBhbmQgaWYgc2l6YWJsZSBjaHVuayBmcm9tIHRoZSBvcmlnaW5hbAorCSAqIHN0aWxsIHJlbWFpbnMgaW4gdGhlIHJlc3VsdCwgaXQgaXMgbm90IGEgcmV3cml0ZS4gIEl0IGRvZXMKKwkgKiBub3QgbWF0dGVyIGhvdyBtdWNoIG9yIGhvdyBsaXR0bGUgbmV3IG1hdGVyaWFsIGlzIGFkZGVkIHRvCisJICogdGhlIGZpbGUuCisJICoKKwkgKiBUaGUgc2NvcmUgd2UgbGVhdmUgZm9yIHN1Y2ggYSBicm9rZW4gZmlsZXBhaXIgdXNlcyB0aGUKKwkgKiBsYXR0ZXIgZGVmaW5pdGlvbiBzbyB0aGF0IGxhdGVyIGNsZWFuLXVwIHN0YWdlIGNhbiBmaW5kIHRoZQorCSAqIHBpZWNlcyB0aGF0IHNob3VsZCBub3QgaGF2ZSBiZWVuIGJyb2tlbiBhY2NvcmRpbmcgdG8gdGhlCisJICogbGF0dGVyIGRlZmluaXRpb24gYWZ0ZXIgcmVuYW1lL2NvcHkgcnVucywgYW5kIG1lcmdlIHRoZQorCSAqIGJyb2tlbiBwYWlyIHRoYXQgaGF2ZSBhIHNjb3JlIGxvd2VyIHRoYW4gZ2l2ZW4gY3JpdGVyaWEKKwkgKiBiYWNrIHRvZ2V0aGVyLiAgVGhlIGJyZWFrIG9wZXJhdGlvbiBpdHNlbGYgaGFwcGVucworCSAqIGFjY29yZGluZyB0byB0aGUgZm9ybWVyIGRlZmluaXRpb24uCisJICoKKwkgKiBUaGUgbWluaW11bV9lZGl0IHBhcmFtZXRlciB0ZWxscyB1cyB3aGVuIHRvIGJyZWFrICh0aGUKKwkgKiBhbW91bnQgb2YgImVkaXQiIHJlcXVpcmVkIGZvciB1cyB0byBjb25zaWRlciBicmVha2luZyB0aGUKKwkgKiBwYWlyKS4gIFdlIGxlYXZlIHRoZSBhbW91bnQgb2YgZGVsZXRpb24gaW4gKm1lcmdlX3Njb3JlX3AKKwkgKiB3aGVuIHdlIHJldHVybi4KKwkgKgorCSAqIFRoZSB2YWx1ZSB3ZSByZXR1cm4gaXMgMSBpZiB3ZSB3YW50IHRoZSBwYWlyIHRvIGJlIGJyb2tlbiwKKwkgKiBvciAwIGlmIHdlIGRvIG5vdC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUsIGJhc2Vfc2l6ZSwgc3JjX2NvcGllZCwgbGl0ZXJhbF9hZGRlZCwKKwkJc3JjX3JlbW92ZWQ7CisKKwkqbWVyZ2Vfc2NvcmVfcCA9IDA7IC8qIGFzc3VtZSBubyBkZWxldGlvbiAtLS0gImRvIG5vdCBicmVhayIKKwkJCSAgICAgKiBpcyB0aGUgZGVmYXVsdC4KKwkJCSAgICAgKi8KKworCWlmICghU19JU1JFRyhzcmMtPm1vZGUpIHx8ICFTX0lTUkVHKGRzdC0+bW9kZSkpCisJCXJldHVybiAwOyAvKiBsZWF2ZSBzeW1saW5rIHJlbmFtZSBhbG9uZSAqLworCisJaWYgKHNyYy0+c2hhMV92YWxpZCAmJiBkc3QtPnNoYTFfdmFsaWQgJiYKKwkgICAgIW1lbWNtcChzcmMtPnNoYTEsIGRzdC0+c2hhMSwgMjApKQorCQlyZXR1cm4gMDsgLyogdGhleSBhcmUgdGhlIHNhbWUgKi8KKworCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHNyYywgMCkgfHwgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhkc3QsIDApKQorCQlyZXR1cm4gMDsgLyogZXJyb3IgYnV0IGNhdWdodCBkb3duc3RyZWFtICovCisKKwliYXNlX3NpemUgPSAoKHNyYy0+c2l6ZSA8IGRzdC0+c2l6ZSkgPyBzcmMtPnNpemUgOiBkc3QtPnNpemUpOworCWlmIChiYXNlX3NpemUgPCBNSU5JTVVNX0JSRUFLX1NJWkUpCisJCXJldHVybiAwOyAvKiB3ZSBkbyBub3QgYnJlYWsgdG9vIHNtYWxsIGZpbGVwYWlyICovCisKKwlpZiAoZGlmZmNvcmVfY291bnRfY2hhbmdlcyhzcmMtPmRhdGEsIHNyYy0+c2l6ZSwKKwkJCQkgICBkc3QtPmRhdGEsIGRzdC0+c2l6ZSwKKwkJCQkgICBOVUxMLCBOVUxMLAorCQkJCSAgIDAsCisJCQkJICAgJnNyY19jb3BpZWQsICZsaXRlcmFsX2FkZGVkKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzYW5pdHkgKi8KKwlpZiAoc3JjLT5zaXplIDwgc3JjX2NvcGllZCkKKwkJc3JjX2NvcGllZCA9IHNyYy0+c2l6ZTsKKwlpZiAoZHN0LT5zaXplIDwgbGl0ZXJhbF9hZGRlZCArIHNyY19jb3BpZWQpIHsKKwkJaWYgKHNyY19jb3BpZWQgPCBkc3QtPnNpemUpCisJCQlsaXRlcmFsX2FkZGVkID0gZHN0LT5zaXplIC0gc3JjX2NvcGllZDsKKwkJZWxzZQorCQkJbGl0ZXJhbF9hZGRlZCA9IDA7CisJfQorCXNyY19yZW1vdmVkID0gc3JjLT5zaXplIC0gc3JjX2NvcGllZDsKKworCS8qIENvbXB1dGUgbWVyZ2Utc2NvcmUsIHdoaWNoIGlzICJob3cgbXVjaCBpcyByZW1vdmVkCisJICogZnJvbSB0aGUgc291cmNlIG1hdGVyaWFsIi4gIFRoZSBjbGVhbi11cCBzdGFnZSB3aWxsCisJICogbWVyZ2UgdGhlIHN1cnZpdmluZyBwYWlyIHRvZ2V0aGVyIGlmIHRoZSBzY29yZSBpcworCSAqIGxlc3MgdGhhbiB0aGUgbWluaW11bSwgYWZ0ZXIgcmVuYW1lL2NvcHkgcnVucy4KKwkgKi8KKwkqbWVyZ2Vfc2NvcmVfcCA9IHNyY19yZW1vdmVkICogTUFYX1NDT1JFIC8gc3JjLT5zaXplOworCisJLyogRXh0ZW50IG9mIGRhbWFnZSwgd2hpY2ggY291bnRzIGJvdGggaW5zZXJ0cyBhbmQKKwkgKiBkZWxldGVzLgorCSAqLworCWRlbHRhX3NpemUgPSBzcmNfcmVtb3ZlZCArIGxpdGVyYWxfYWRkZWQ7CisJaWYgKGRlbHRhX3NpemUgKiBNQVhfU0NPUkUgLyBiYXNlX3NpemUgPCBicmVha19zY29yZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB5b3UgcmVtb3ZlZCBhIGxvdCB3aXRob3V0IGFkZGluZyBuZXcgbWF0ZXJpYWwsIHRoYXQgaXMKKwkgKiBub3QgcmVhbGx5IGEgcmV3cml0ZS4KKwkgKi8KKwlpZiAoKHNyYy0+c2l6ZSAqIGJyZWFrX3Njb3JlIDwgc3JjX3JlbW92ZWQgKiBNQVhfU0NPUkUpICYmCisJICAgIChsaXRlcmFsX2FkZGVkICogMjAgPCBzcmNfcmVtb3ZlZCkgJiYKKwkgICAgKGxpdGVyYWxfYWRkZWQgKiAyMCA8IHNyY19jb3BpZWQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCit2b2lkIGRpZmZjb3JlX2JyZWFrKGludCBicmVha19zY29yZSkKK3sKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKnEgPSAmZGlmZl9xdWV1ZWRfZGlmZjsKKwlzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3Qgb3V0cTsKKworCS8qIFdoZW4gdGhlIGZpbGVwYWlyIGhhcyB0aGlzIG11Y2ggZWRpdCAoaW5zZXJ0IGFuZCBkZWxldGUpLAorCSAqIGl0IGlzIGZpcnN0IGNvbnNpZGVyZWQgdG8gYmUgYSByZXdyaXRlIGFuZCBicm9rZW4gaW50byBhCisJICogY3JlYXRlIGFuZCBkZWxldGUgZmlsZXBhaXIuICBUaGlzIGlzIHRvIGhlbHAgYnJlYWtpbmcgYQorCSAqIGZpbGUgdGhhdCBoYWQgdG9vIG11Y2ggbmV3IHN0dWZmIGFkZGVkLCBwb3NzaWJseSBmcm9tCisJICogbW92aW5nIGNvbnRlbnRzIGZyb20gYW5vdGhlciBmaWxlLCBzbyB0aGF0IHJlbmFtZS9jb3B5IGNhbgorCSAqIG1hdGNoIGl0IHdpdGggdGhlIG90aGVyIGZpbGUuCisJICoKKwkgKiBpbnQgYnJlYWtfc2NvcmU7IHdlIHJldXNlIGluY29taW5nIHBhcmFtZXRlciBmb3IgdGhpcy4KKwkgKi8KKworCS8qIEFmdGVyIGEgcGFpciBpcyBicm9rZW4gYWNjb3JkaW5nIHRvIGJyZWFrX3Njb3JlIGFuZAorCSAqIHN1YmplY3RlZCB0byByZW5hbWUvY29weSwgYm90aCBvZiB0aGVtIG1heSBzdXJ2aXZlIGludGFjdCwKKwkgKiBkdWUgdG8gbGFjayBvZiBzdWl0YWJsZSByZW5hbWUvY29weSBwZWVyLiAgT3IsIHRoZSBjYWxsZXIKKwkgKiBtYXkgYmUgY2FsbGluZyB1cyB3aXRob3V0IHVzaW5nIHJlbmFtZS9jb3B5LiAgV2hlbiB0aGF0CisJICogaGFwcGVucywgd2UgbWVyZ2UgdGhlIGJyb2tlbiBwaWVjZXMgYmFjayBpbnRvIG9uZQorCSAqIG1vZGlmaWNhdGlvbiB0b2dldGhlciBpZiB0aGUgcGFpciBkaWQgbm90IGhhdmUgbW9yZSB0aGFuCisJICogdGhpcyBtdWNoIGRlbGV0ZS4gIEZvciB0aGlzIGNvbXB1dGF0aW9uLCB3ZSBkbyBub3QgdGFrZQorCSAqIGluc2VydCBpbnRvIGFjY291bnQgYXQgYWxsLiAgSWYgeW91IHN0YXJ0IGZyb20gYSAxMDAtbGluZQorCSAqIGZpbGUgYW5kIGRlbGV0ZSA5NyBsaW5lcyBvZiBpdCwgaXQgZG9lcyBub3QgbWF0dGVyIGlmIHlvdQorCSAqIGFkZCAyNyBsaW5lcyB0byBpdCB0byBtYWtlIGEgbmV3IDMwLWxpbmUgZmlsZSBvciBpZiB5b3UgYWRkCisJICogOTk3IGxpbmVzIHRvIGl0IHRvIG1ha2UgYSAxMDAwLWxpbmUgZmlsZS4gIEVpdGhlciB3YXkgd2hhdAorCSAqIHlvdSBkaWQgd2FzIGEgcmV3cml0ZSBvZiA5NyUuICBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91CisJICogZGVsZXRlIDMgbGluZXMsIGtlZXBpbmcgOTcgbGluZXMgaW50YWN0LCBpdCBkb2VzIG5vdCBtYXR0ZXIKKwkgKiBpZiB5b3UgYWRkIDMgbGluZXMgdG8gaXQgdG8gbWFrZSBhIG5ldyAxMDAtbGluZSBmaWxlIG9yIGlmCisJICogeW91IGFkZCA5MDMgbGluZXMgdG8gaXQgdG8gbWFrZSBhIG5ldyAxMDAwLWxpbmUgZmlsZS4KKwkgKiBFaXRoZXIgd2F5IHlvdSBkaWQgYSBsb3Qgb2YgYWRkaXRpb25zIGFuZCBub3QgYSByZXdyaXRlLgorCSAqIFRoaXMgbWVyZ2UgaGFwcGVucyB0byBjYXRjaCB0aGUgbGF0dGVyIGNhc2UuICBBIG1lcmdlX3Njb3JlCisJICogb2YgODAlIHdvdWxkIGJlIGEgZ29vZCBkZWZhdWx0IHZhbHVlIChhIGJyb2tlbiBwYWlyIHRoYXQKKwkgKiBoYXMgc2NvcmUgbG93ZXIgdGhhbiBtZXJnZV9zY29yZSB3aWxsIGJlIG1lcmdlZCBiYWNrCisJICogdG9nZXRoZXIpLgorCSAqLworCWludCBtZXJnZV9zY29yZTsKKwlpbnQgaTsKKworCS8qIFNlZSBjb21tZW50IG9uIERFRkFVTFRfQlJFQUtfU0NPUkUgYW5kCisJICogREVGQVVMVF9NRVJHRV9TQ09SRSBpbiBkaWZmY29yZS5oCisJICovCisJbWVyZ2Vfc2NvcmUgPSAoYnJlYWtfc2NvcmUgPj4gMTYpICYgMHhGRkZGOworCWJyZWFrX3Njb3JlID0gKGJyZWFrX3Njb3JlICYgMHhGRkZGKTsKKworCWlmICghYnJlYWtfc2NvcmUpCisJCWJyZWFrX3Njb3JlID0gREVGQVVMVF9CUkVBS19TQ09SRTsKKwlpZiAoIW1lcmdlX3Njb3JlKQorCQltZXJnZV9zY29yZSA9IERFRkFVTFRfTUVSR0VfU0NPUkU7CisKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisJb3V0cS5xdWV1ZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlpbnQgc2NvcmU7CisKKwkJLyogV2UgZGVhbCBvbmx5IHdpdGggaW4tcGxhY2UgZWRpdCBvZiBub24gZGlyZWN0b3J5LgorCQkgKiBXZSBkbyBub3QgYnJlYWsgYW55dGhpbmcgZWxzZS4KKwkJICovCisJCWlmIChESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSAmJgorCQkgICAgIVNfSVNESVIocC0+b25lLT5tb2RlKSAmJiAhU19JU0RJUihwLT50d28tPm1vZGUpICYmCisJCSAgICAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcC0+dHdvLT5wYXRoKSkgeworCQkJaWYgKHNob3VsZF9icmVhayhwLT5vbmUsIHAtPnR3bywKKwkJCQkJIGJyZWFrX3Njb3JlLCAmc2NvcmUpKSB7CisJCQkJLyogU3BsaXQgdGhpcyBpbnRvIGRlbGV0ZSBhbmQgY3JlYXRlICovCisJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm51bGxfb25lLCAqbnVsbF90d287CisJCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmRwOworCisJCQkJLyogU2V0IHNjb3JlIHRvIDAgZm9yIHRoZSBwYWlyIHRoYXQKKwkJCQkgKiBuZWVkcyB0byBiZSBtZXJnZWQgYmFjayB0b2dldGhlcgorCQkJCSAqIHNob3VsZCB0aGV5IHN1cnZpdmUgcmVuYW1lL2NvcHkuCisJCQkJICogQWxzbyB3ZSBkbyBub3Qgd2FudCB0byBicmVhayB2ZXJ5CisJCQkJICogc21hbGwgZmlsZXMuCisJCQkJICovCisJCQkJaWYgKHNjb3JlIDwgbWVyZ2Vfc2NvcmUpCisJCQkJCXNjb3JlID0gMDsKKworCQkJCS8qIGRlbGV0aW9uIG9mIG9uZSAqLworCQkJCW51bGxfb25lID0gYWxsb2NfZmlsZXNwZWMocC0+b25lLT5wYXRoKTsKKwkJCQlkcCA9IGRpZmZfcXVldWUoJm91dHEsIHAtPm9uZSwgbnVsbF9vbmUpOworCQkJCWRwLT5zY29yZSA9IHNjb3JlOworCQkJCWRwLT5icm9rZW5fcGFpciA9IDE7CisKKwkJCQkvKiBjcmVhdGlvbiBvZiB0d28gKi8KKwkJCQludWxsX3R3byA9IGFsbG9jX2ZpbGVzcGVjKHAtPnR3by0+cGF0aCk7CisJCQkJZHAgPSBkaWZmX3F1ZXVlKCZvdXRxLCBudWxsX3R3bywgcC0+dHdvKTsKKwkJCQlkcC0+c2NvcmUgPSBzY29yZTsKKwkJCQlkcC0+YnJva2VuX3BhaXIgPSAxOworCisJCQkJZnJlZShwKTsgLyogbm90IGRpZmZfZnJlZV9maWxlcGFpcigpLCB3ZSBhcmUKKwkJCQkJICAqIHJldXNpbmcgb25lIGFuZCB0d28gaGVyZS4KKwkJCQkJICAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWRpZmZfcSgmb3V0cSwgcCk7CisJfQorCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbWVyZ2VfYnJva2VuKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwcCwKKwkJCSBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKm91dHEpCit7CisJLyogcCBhbmQgcHAgYXJlIGJyb2tlbiBwYWlycyB3ZSB3YW50IHRvIG1lcmdlICovCisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKmMgPSBwLCAqZCA9IHBwLCAqZHA7CisJaWYgKERJRkZfRklMRV9WQUxJRChwLT5vbmUpKSB7CisJCS8qIHRoaXMgbXVzdCBiZSBhIGRlbGV0ZSBoYWxmICovCisJCWQgPSBwOyBjID0gcHA7CisJfQorCS8qIFNhbml0eSBjaGVjayAqLworCWlmICghRElGRl9GSUxFX1ZBTElEKGQtPm9uZSkpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gbWVyZ2UgIzEiKTsKKwlpZiAoRElGRl9GSUxFX1ZBTElEKGQtPnR3bykpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gbWVyZ2UgIzIiKTsKKwlpZiAoRElGRl9GSUxFX1ZBTElEKGMtPm9uZSkpCisJCWRpZSgiaW50ZXJuYWwgZXJyb3IgaW4gbWVyZ2UgIzMiKTsKKwlpZiAoIURJRkZfRklMRV9WQUxJRChjLT50d28pKQorCQlkaWUoImludGVybmFsIGVycm9yIGluIG1lcmdlICM0Iik7CisKKwlkcCA9IGRpZmZfcXVldWUob3V0cSwgZC0+b25lLCBjLT50d28pOworCWRwLT5zY29yZSA9IHAtPnNjb3JlOworCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKGQtPnR3byk7CisJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEoYy0+b25lKTsKKwlmcmVlKGQpOworCWZyZWUoYyk7Cit9CisKK3ZvaWQgZGlmZmNvcmVfbWVyZ2VfYnJva2VuKHZvaWQpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisJaW50IGksIGo7CisKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisJb3V0cS5xdWV1ZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQlpZiAoIXApCisJCQkvKiB3ZSBhbHJlYWR5IG1lcmdlZCB0aGlzIHdpdGggaXRzIHBlZXIgKi8KKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwLT5icm9rZW5fcGFpciAmJgorCQkJICFzdHJjbXAocC0+b25lLT5wYXRoLCBwLT50d28tPnBhdGgpKSB7CisJCQkvKiBJZiB0aGUgcGVlciBhbHNvIHN1cnZpdmVkIHJlbmFtZS9jb3B5LCB0aGVuCisJCQkgKiB3ZSBtZXJnZSB0aGVtIGJhY2sgdG9nZXRoZXIuCisJCQkgKi8KKwkJCWZvciAoaiA9IGkgKyAxOyBqIDwgcS0+bnI7IGorKykgeworCQkJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwcCA9IHEtPnF1ZXVlW2pdOworCQkJCWlmIChwcC0+YnJva2VuX3BhaXIgJiYKKwkJCQkgICAgIXN0cmNtcChwcC0+b25lLT5wYXRoLCBwcC0+dHdvLT5wYXRoKSAmJgorCQkJCSAgICAhc3RyY21wKHAtPm9uZS0+cGF0aCwgcHAtPnR3by0+cGF0aCkpIHsKKwkJCQkJLyogUGVlciBzdXJ2aXZlZC4gIE1lcmdlIHRoZW0gKi8KKwkJCQkJbWVyZ2VfYnJva2VuKHAsIHBwLCAmb3V0cSk7CisJCQkJCXEtPnF1ZXVlW2pdID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHEtPm5yIDw9IGopCisJCQkJLyogVGhlIHBlZXIgZGlkIG5vdCBzdXJ2aXZlLCBzbyB3ZSBrZWVwCisJCQkJICogaXQgaW4gdGhlIG91dHB1dC4KKwkJCQkgKi8KKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQl9CisJCWVsc2UKKwkJCWRpZmZfcSgmb3V0cSwgcCk7CisJfQorCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLWRlbHRhLmMgYi9kaWZmY29yZS1kZWx0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMzhhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1kZWx0YS5jCkBAIC0wLDAgKzEsMjEzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworLyoKKyAqIElkZWEgaGVyZSBpcyB2ZXJ5IHNpbXBsZS4KKyAqCisgKiBXZSBoYXZlIHRvdGFsIG9mIChzei1OKzEpIE4tYnl0ZSBvdmVybGFwcGluZyBzZXF1ZW5jZXMgaW4gYnVmIHdob3NlCisgKiBzaXplIGlzIHN6LiAgSWYgdGhlIHNhbWUgTi1ieXRlIHNlcXVlbmNlIGFwcGVhcnMgaW4gYm90aCBzb3VyY2UgYW5kCisgKiBkZXN0aW5hdGlvbiwgd2Ugc2F5IHRoZSBieXRlIHRoYXQgc3RhcnRzIHRoYXQgc2VxdWVuY2UgaXMgc2hhcmVkCisgKiBiZXR3ZWVuIHRoZW0gKGkuZS4gY29waWVkIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uKS4KKyAqCisgKiBGb3IgZWFjaCBwb3NzaWJsZSBOLWJ5dGUgc2VxdWVuY2UsIGlmIHRoZSBzb3VyY2UgYnVmZmVyIGhhcyBtb3JlCisgKiBpbnN0YW5jZXMgb2YgaXQgdGhhbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB0aGF0IG1lYW5zIHRoZQorICogZGlmZmVyZW5jZSBhcmUgdGhlIG51bWJlciBvZiBieXRlcyBub3QgY29waWVkIGZyb20gc291cmNlIHRvCisgKiBkZXN0aW5hdGlvbi4gIElmIHRoZSBjb3VudHMgYXJlIHRoZSBzYW1lLCBldmVyeXRoaW5nIHdhcyBjb3BpZWQKKyAqIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uLiAgSWYgdGhlIGRlc3RpbmF0aW9uIGhhcyBtb3JlLAorICogZXZlcnl0aGluZyB3YXMgY29waWVkLCBhbmQgZGVzdGluYXRpb24gYWRkZWQgbW9yZS4KKyAqCisgKiBXZSBhcmUgZG9pbmcgYW4gYXBwcm94aW1hdGlvbiBzbyB3ZSBkbyBub3QgcmVhbGx5IGhhdmUgdG8gd2FzdGUKKyAqIG1lbW9yeSBieSBhY3R1YWxseSBzdG9yaW5nIHRoZSBzZXF1ZW5jZS4gIFdlIGp1c3QgaGFzaCB0aGVtIGludG8KKyAqIHNvbWV3aGVyZSBhcm91bmQgMl4xNiBoYXNoYnVja2V0cyBhbmQgY291bnQgdGhlIG9jY3VycmVuY2VzLgorICoKKyAqIFRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFyYml0cmFyaWx5IHNldCB0byA4IGZvciBub3cuCisgKi8KKworLyogV2lsZCBndWVzcyBhdCB0aGUgaW5pdGlhbCBoYXNoIHNpemUgKi8KKyNkZWZpbmUgSU5JVElBTF9IQVNIX1NJWkUgOQorCisvKiBXZSBsZWF2ZSBtb3JlIHJvb20gaW4gc21hbGxlciBoYXNoIGJ1dCBkbyBub3QgbGV0IGl0CisgKiBncm93IHRvIGhhdmUgdW51c2VkIGhvbGUgdG9vIG11Y2guCisgKi8KKyNkZWZpbmUgSU5JVElBTF9GUkVFKHN6X2xvZzIpICgoMTw8KHN6X2xvZzIpKSooc3pfbG9nMi0zKS8oc3pfbG9nMikpCisKKy8qIEEgcHJpbWUgcmF0aGVyIGNhcmVmdWxseSBjaG9zZW4gYmV0d2VlbiAyXjE2Li4yXjE3LCBzbyB0aGF0CisgKiBIQVNIQkFTRSA8IElOSVRJQUxfRlJFRSgxNykuICBXZSB3YW50IHRvIGtlZXAgdGhlIG1heGltdW0gaGFzaHRhYmxlCisgKiBzaXplIHVuZGVyIHRoZSBjdXJyZW50IDI8PDE3IG1heGltdW0sIHdoaWNoIGNhbiBob2xkIHRoaXMgbWFueQorICogZGlmZmVyZW50IHZhbHVlcyBiZWZvcmUgb3ZlcmZsb3dpbmcgdG8gaGFzaHRhYmxlIG9mIHNpemUgMjw8MTguCisgKi8KKyNkZWZpbmUgSEFTSEJBU0UgMTA3OTI3CisKK3N0cnVjdCBzcGFuaGFzaCB7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJdW5zaWduZWQgaW50IGNudDsKK307CitzdHJ1Y3Qgc3Bhbmhhc2hfdG9wIHsKKwlpbnQgYWxsb2NfbG9nMjsKKwlpbnQgZnJlZTsKKwlzdHJ1Y3Qgc3Bhbmhhc2ggZGF0YVtGTEVYX0FSUkFZXTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3Bhbmhhc2ggKnNwYW5oYXNoX2ZpbmQoc3RydWN0IHNwYW5oYXNoX3RvcCAqdG9wLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBoYXNodmFsKQoreworCWludCBzeiA9IDEgPDwgdG9wLT5hbGxvY19sb2cyOworCWludCBidWNrZXQgPSBoYXNodmFsICYgKHN6IC0gMSk7CisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IHNwYW5oYXNoICpoID0gJih0b3AtPmRhdGFbYnVja2V0KytdKTsKKwkJaWYgKCFoLT5jbnQpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGgtPmhhc2h2YWwgPT0gaGFzaHZhbCkKKwkJCXJldHVybiBoOworCQlpZiAoc3ogPD0gYnVja2V0KQorCQkJYnVja2V0ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICpzcGFuaGFzaF9yZWhhc2goc3RydWN0IHNwYW5oYXNoX3RvcCAqb3JpZykKK3sKKwlzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICpuZXc7CisJaW50IGk7CisJaW50IG9zeiA9IDEgPDwgb3JpZy0+YWxsb2NfbG9nMjsKKwlpbnQgc3ogPSBvc3ogPDwgMTsKKworCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpvcmlnKSArIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogc3opOworCW5ldy0+YWxsb2NfbG9nMiA9IG9yaWctPmFsbG9jX2xvZzIgKyAxOworCW5ldy0+ZnJlZSA9IElOSVRJQUxfRlJFRShuZXctPmFsbG9jX2xvZzIpOworCW1lbXNldChuZXctPmRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogc3opOworCWZvciAoaSA9IDA7IGkgPCBvc3o7IGkrKykgeworCQlzdHJ1Y3Qgc3Bhbmhhc2ggKm8gPSAmKG9yaWctPmRhdGFbaV0pOworCQlpbnQgYnVja2V0OworCQlpZiAoIW8tPmNudCkKKwkJCWNvbnRpbnVlOworCQlidWNrZXQgPSBvLT5oYXNodmFsICYgKHN6IC0gMSk7CisJCXdoaWxlICgxKSB7CisJCQlzdHJ1Y3Qgc3Bhbmhhc2ggKmggPSAmKG5ldy0+ZGF0YVtidWNrZXQrK10pOworCQkJaWYgKCFoLT5jbnQpIHsKKwkJCQloLT5oYXNodmFsID0gby0+aGFzaHZhbDsKKwkJCQloLT5jbnQgPSBvLT5jbnQ7CisJCQkJbmV3LT5mcmVlLS07CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3ogPD0gYnVja2V0KQorCQkJCWJ1Y2tldCA9IDA7CisJCX0KKwl9CisJZnJlZShvcmlnKTsKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoX3RvcCAqYWRkX3NwYW5oYXNoKHN0cnVjdCBzcGFuaGFzaF90b3AgKnRvcCwKKwkJCQkJIHVuc2lnbmVkIGludCBoYXNodmFsLCBpbnQgY250KQoreworCWludCBidWNrZXQsIGxpbTsKKwlzdHJ1Y3Qgc3Bhbmhhc2ggKmg7CisKKwlsaW0gPSAoMSA8PCB0b3AtPmFsbG9jX2xvZzIpOworCWJ1Y2tldCA9IGhhc2h2YWwgJiAobGltIC0gMSk7CisJd2hpbGUgKDEpIHsKKwkJaCA9ICYodG9wLT5kYXRhW2J1Y2tldCsrXSk7CisJCWlmICghaC0+Y250KSB7CisJCQloLT5oYXNodmFsID0gaGFzaHZhbDsKKwkJCWgtPmNudCA9IGNudDsKKwkJCXRvcC0+ZnJlZS0tOworCQkJaWYgKHRvcC0+ZnJlZSA8IDApCisJCQkJcmV0dXJuIHNwYW5oYXNoX3JlaGFzaCh0b3ApOworCQkJcmV0dXJuIHRvcDsKKwkJfQorCQlpZiAoaC0+aGFzaHZhbCA9PSBoYXNodmFsKSB7CisJCQloLT5jbnQgKz0gY250OworCQkJcmV0dXJuIHRvcDsKKwkJfQorCQlpZiAobGltIDw9IGJ1Y2tldCkKKwkJCWJ1Y2tldCA9IDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNwYW5oYXNoX3RvcCAqaGFzaF9jaGFycyh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBzeikKK3sKKwlpbnQgaSwgbjsKKwl1bnNpZ25lZCBpbnQgYWNjdW0xLCBhY2N1bTIsIGhhc2h2YWw7CisJc3RydWN0IHNwYW5oYXNoX3RvcCAqaGFzaDsKKworCWkgPSBJTklUSUFMX0hBU0hfU0laRTsKKwloYXNoID0geG1hbGxvYyhzaXplb2YoKmhhc2gpICsgc2l6ZW9mKHN0cnVjdCBzcGFuaGFzaCkgKiAoMTw8aSkpOworCWhhc2gtPmFsbG9jX2xvZzIgPSBpOworCWhhc2gtPmZyZWUgPSBJTklUSUFMX0ZSRUUoaSk7CisJbWVtc2V0KGhhc2gtPmRhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc3Bhbmhhc2gpICogKDE8PGkpKTsKKworCW4gPSAwOworCWFjY3VtMSA9IGFjY3VtMiA9IDA7CisJd2hpbGUgKHN6KSB7CisJCXVuc2lnbmVkIGludCBjID0gKmJ1ZisrOworCQl1bnNpZ25lZCBpbnQgb2xkXzEgPSBhY2N1bTE7CisJCXN6LS07CisJCWFjY3VtMSA9IChhY2N1bTEgPDwgNykgXiAoYWNjdW0yID4+IDI1KTsKKwkJYWNjdW0yID0gKGFjY3VtMiA8PCA3KSBeIChvbGRfMSA+PiAyNSk7CisJCWFjY3VtMSArPSBjOworCQlpZiAoKytuIDwgNjQgJiYgYyAhPSAnXG4nKQorCQkJY29udGludWU7CisJCWhhc2h2YWwgPSAoYWNjdW0xICsgYWNjdW0yICogMHg2MSkgJSBIQVNIQkFTRTsKKwkJaGFzaCA9IGFkZF9zcGFuaGFzaChoYXNoLCBoYXNodmFsLCBuKTsKKwkJbiA9IDA7CisJCWFjY3VtMSA9IGFjY3VtMiA9IDA7CisJfQorCXJldHVybiBoYXNoOworfQorCitpbnQgZGlmZmNvcmVfY291bnRfY2hhbmdlcyh2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUsCisJCQkgICB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgZHN0X3NpemUsCisJCQkgICB2b2lkICoqc3JjX2NvdW50X3AsCisJCQkgICB2b2lkICoqZHN0X2NvdW50X3AsCisJCQkgICB1bnNpZ25lZCBsb25nIGRlbHRhX2xpbWl0LAorCQkJICAgdW5zaWduZWQgbG9uZyAqc3JjX2NvcGllZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgKmxpdGVyYWxfYWRkZWQpCit7CisJaW50IGksIHNzejsKKwlzdHJ1Y3Qgc3Bhbmhhc2hfdG9wICpzcmNfY291bnQsICpkc3RfY291bnQ7CisJdW5zaWduZWQgbG9uZyBzYywgbGE7CisKKwlzcmNfY291bnQgPSBkc3RfY291bnQgPSBOVUxMOworCWlmIChzcmNfY291bnRfcCkKKwkJc3JjX2NvdW50ID0gKnNyY19jb3VudF9wOworCWlmICghc3JjX2NvdW50KSB7CisJCXNyY19jb3VudCA9IGhhc2hfY2hhcnMoc3JjLCBzcmNfc2l6ZSk7CisJCWlmIChzcmNfY291bnRfcCkKKwkJCSpzcmNfY291bnRfcCA9IHNyY19jb3VudDsKKwl9CisJaWYgKGRzdF9jb3VudF9wKQorCQlkc3RfY291bnQgPSAqZHN0X2NvdW50X3A7CisJaWYgKCFkc3RfY291bnQpIHsKKwkJZHN0X2NvdW50ID0gaGFzaF9jaGFycyhkc3QsIGRzdF9zaXplKTsKKwkJaWYgKGRzdF9jb3VudF9wKQorCQkJKmRzdF9jb3VudF9wID0gZHN0X2NvdW50OworCX0KKwlzYyA9IGxhID0gMDsKKworCXNzeiA9IDEgPDwgc3JjX2NvdW50LT5hbGxvY19sb2cyOworCWZvciAoaSA9IDA7IGkgPCBzc3o7IGkrKykgeworCQlzdHJ1Y3Qgc3Bhbmhhc2ggKnMgPSAmKHNyY19jb3VudC0+ZGF0YVtpXSk7CisJCXN0cnVjdCBzcGFuaGFzaCAqZDsKKwkJdW5zaWduZWQgZHN0X2NudCwgc3JjX2NudDsKKwkJaWYgKCFzLT5jbnQpCisJCQljb250aW51ZTsKKwkJc3JjX2NudCA9IHMtPmNudDsKKwkJZCA9IHNwYW5oYXNoX2ZpbmQoZHN0X2NvdW50LCBzLT5oYXNodmFsKTsKKwkJZHN0X2NudCA9IGQgPyBkLT5jbnQgOiAwOworCQlpZiAoc3JjX2NudCA8IGRzdF9jbnQpIHsKKwkJCWxhICs9IGRzdF9jbnQgLSBzcmNfY250OworCQkJc2MgKz0gc3JjX2NudDsKKwkJfQorCQllbHNlCisJCQlzYyArPSBkc3RfY250OworCX0KKworCWlmICghc3JjX2NvdW50X3ApCisJCWZyZWUoc3JjX2NvdW50KTsKKwlpZiAoIWRzdF9jb3VudF9wKQorCQlmcmVlKGRzdF9jb3VudCk7CisJKnNyY19jb3BpZWQgPSBzYzsKKwkqbGl0ZXJhbF9hZGRlZCA9IGxhOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGlmZmNvcmUtb3JkZXIuYyBiL2RpZmZjb3JlLW9yZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmNmRhNgotLS0gL2Rldi9udWxsCisrKyBiL2RpZmZjb3JlLW9yZGVyLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgImRpZmZjb3JlLmgiCisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorCitzdGF0aWMgY2hhciAqKm9yZGVyOworc3RhdGljIGludCBvcmRlcl9jbnQ7CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfb3JkZXIoY29uc3QgY2hhciAqb3JkZXJmaWxlKQoreworCWludCBmZCwgY250LCBwYXNzOworCXZvaWQgKm1hcDsKKwljaGFyICpjcCwgKmVuZHA7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAob3JkZXIpCisJCXJldHVybjsKKworCWZkID0gb3BlbihvcmRlcmZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisJaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJCXJldHVybjsKKwllbmRwID0gKGNoYXIgKikgbWFwICsgc3Quc3Rfc2l6ZTsKKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCWNudCA9IDA7CisJCWNwID0gbWFwOworCQl3aGlsZSAoY3AgPCBlbmRwKSB7CisJCQljaGFyICplcDsKKwkJCWZvciAoZXAgPSBjcDsgZXAgPCBlbmRwICYmICplcCAhPSAnXG4nOyBlcCsrKQorCQkJCTsKKwkJCS8qIGNwIHRvIGVwIGhhcyBvbmUgbGluZSAqLworCQkJaWYgKCpjcCA9PSAnXG4nIHx8ICpjcCA9PSAnIycpCisJCQkJOyAvKiBjb21tZW50ICovCisJCQllbHNlIGlmIChwYXNzID09IDApCisJCQkJY250Kys7CisJCQllbHNlIHsKKwkJCQlpZiAoKmVwID09ICdcbicpIHsKKwkJCQkJKmVwID0gMDsKKwkJCQkJb3JkZXJbY250XSA9IGNwOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJb3JkZXJbY250XSA9IHhtYWxsb2MoZXAtY3ArMSk7CisJCQkJCW1lbWNweShvcmRlcltjbnRdLCBjcCwgZXAtY3ApOworCQkJCQlvcmRlcltjbnRdW2VwLWNwXSA9IDA7CisJCQkJfQorCQkJCWNudCsrOworCQkJfQorCQkJaWYgKGVwIDwgZW5kcCkKKwkJCQllcCsrOworCQkJY3AgPSBlcDsKKwkJfQorCQlpZiAocGFzcyA9PSAwKSB7CisJCQlvcmRlcl9jbnQgPSBjbnQ7CisJCQlvcmRlciA9IHhtYWxsb2Moc2l6ZW9mKCpvcmRlcikgKiBjbnQpOworCQl9CisJfQorfQorCitzdHJ1Y3QgcGFpcl9vcmRlciB7CisJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnBhaXI7CisJaW50IG9yaWdfb3JkZXI7CisJaW50IG9yZGVyOworfTsKKworc3RhdGljIGludCBtYXRjaF9vcmRlcihjb25zdCBjaGFyICpwYXRoKQoreworCWludCBpOworCWNoYXIgcFtQQVRIX01BWF07CisKKwlmb3IgKGkgPSAwOyBpIDwgb3JkZXJfY250OyBpKyspIHsKKwkJc3RyY3B5KHAsIHBhdGgpOworCQl3aGlsZSAocFswXSkgeworCQkJY2hhciAqY3A7CisJCQlpZiAoIWZubWF0Y2gob3JkZXJbaV0sIHAsIDApKQorCQkJCXJldHVybiBpOworCQkJY3AgPSBzdHJyY2hyKHAsICcvJyk7CisJCQlpZiAoIWNwKQorCQkJCWJyZWFrOworCQkJKmNwID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gb3JkZXJfY250OworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfcGFpcl9vcmRlcihjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCit7CisJc3RydWN0IHBhaXJfb3JkZXIgY29uc3QgKmEsICpiOworCWEgPSAoc3RydWN0IHBhaXJfb3JkZXIgY29uc3QgKilhXzsKKwliID0gKHN0cnVjdCBwYWlyX29yZGVyIGNvbnN0ICopYl87CisJaWYgKGEtPm9yZGVyICE9IGItPm9yZGVyKQorCQlyZXR1cm4gYS0+b3JkZXIgLSBiLT5vcmRlcjsKKwlyZXR1cm4gYS0+b3JpZ19vcmRlciAtIGItPm9yaWdfb3JkZXI7Cit9CisKK3ZvaWQgZGlmZmNvcmVfb3JkZXIoY29uc3QgY2hhciAqb3JkZXJmaWxlKQoreworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBwYWlyX29yZGVyICpvOworCWludCBpOworCisJaWYgKCFxLT5ucikKKwkJcmV0dXJuOworCisJbyA9IHhtYWxsb2Moc2l6ZW9mKCpvKSAqIHEtPm5yKTsKKwlwcmVwYXJlX29yZGVyKG9yZGVyZmlsZSk7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJb1tpXS5wYWlyID0gcS0+cXVldWVbaV07CisJCW9baV0ub3JpZ19vcmRlciA9IGk7CisJCW9baV0ub3JkZXIgPSBtYXRjaF9vcmRlcihvW2ldLnBhaXItPnR3by0+cGF0aCk7CisJfQorCXFzb3J0KG8sIHEtPm5yLCBzaXplb2YoKm8pLCBjb21wYXJlX3BhaXJfb3JkZXIpOworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQlxLT5xdWV1ZVtpXSA9IG9baV0ucGFpcjsKKwlmcmVlKG8pOworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RpZmZjb3JlLXBpY2theGUuYyBiL2RpZmZjb3JlLXBpY2theGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmNjZTMxCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUtcGlja2F4ZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJkaWZmY29yZS5oIgorCisjaW5jbHVkZSA8cmVnZXguaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBjb250YWlucyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJICAgICBjb25zdCBjaGFyICpuZWVkbGUsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJICAgICByZWdleF90ICpyZWdleHApCit7CisJdW5zaWduZWQgaW50IGNudDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc3o7CisJY29uc3QgY2hhciAqZGF0YTsKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhvbmUsIDApKQorCQlyZXR1cm4gMDsKKworCXN6ID0gb25lLT5zaXplOworCWRhdGEgPSBvbmUtPmRhdGE7CisJY250ID0gMDsKKworCWlmIChyZWdleHApIHsKKwkJcmVnbWF0Y2hfdCByZWdtYXRjaDsKKwkJaW50IGZsYWdzID0gMDsKKworCQl3aGlsZSAoKmRhdGEgJiYgIXJlZ2V4ZWMocmVnZXhwLCBkYXRhLCAxLCAmcmVnbWF0Y2gsIGZsYWdzKSkgeworCQkJZmxhZ3MgfD0gUkVHX05PVEJPTDsKKwkJCWRhdGEgKz0gcmVnbWF0Y2gucm1fc287CisJCQlpZiAoKmRhdGEpIGRhdGErKzsKKwkJCWNudCsrOworCQl9CisKKwl9IGVsc2UgeyAvKiBDbGFzc2ljIGV4YWN0IHN0cmluZyBtYXRjaCAqLworCQkvKiBZZXMsIEkndmUgaGVhcmQgb2Ygc3Ryc3RyKCksIGJ1dCB0aGUgdGhpbmcgaXMgKmRhdGEgbWF5CisJCSAqIG5vdCBiZSBOVUwgdGVybWluYXRlZC4gIFN1ZSBtZS4KKwkJICovCisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0ICsgbGVuIDw9IHN6OyBvZmZzZXQrKykgeworCQkJLyogd2UgY291bnQgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIG5lZWRsZSAqLworCQkJaWYgKCFtZW1jbXAobmVlZGxlLCBkYXRhICsgb2Zmc2V0LCBsZW4pKSB7CisJCQkJb2Zmc2V0ICs9IGxlbiAtIDE7CisJCQkJY250Kys7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGNudDsKK30KKwordm9pZCBkaWZmY29yZV9waWNrYXhlKGNvbnN0IGNoYXIgKm5lZWRsZSwgaW50IG9wdHMpCit7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxID0gJmRpZmZfcXVldWVkX2RpZmY7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBzdHJsZW4obmVlZGxlKTsKKwlpbnQgaSwgaGFzX2NoYW5nZXM7CisJcmVnZXhfdCByZWdleCwgKnJlZ2V4cCA9IE5VTEw7CisJc3RydWN0IGRpZmZfcXVldWVfc3RydWN0IG91dHE7CisJb3V0cS5xdWV1ZSA9IE5VTEw7CisJb3V0cS5uciA9IG91dHEuYWxsb2MgPSAwOworCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfUkVHRVgpIHsKKwkJaW50IGVycjsKKwkJZXJyID0gcmVnY29tcCgmcmVnZXgsIG5lZWRsZSwgUkVHX0VYVEVOREVEIHwgUkVHX05FV0xJTkUpOworCQlpZiAoZXJyKSB7CisJCQkvKiBUaGUgUE9TSVguMiBwZW9wbGUgYXJlIHN1cmVseSBzaWNrICovCisJCQljaGFyIGVycmJ1ZlsxMDI0XTsKKwkJCXJlZ2Vycm9yKGVyciwgJnJlZ2V4LCBlcnJidWYsIDEwMjQpOworCQkJcmVnZnJlZSgmcmVnZXgpOworCQkJZGllKCJpbnZhbGlkIHBpY2theGUgcmVnZXg6ICVzIiwgZXJyYnVmKTsKKwkJfQorCQlyZWdleHAgPSAmcmVnZXg7CisJfQorCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfQUxMKSB7CisJCS8qIFNob3dpbmcgdGhlIHdob2xlIGNoYW5nZXNldCBpZiBuZWVkbGUgZXhpc3RzICovCisJCWZvciAoaSA9IGhhc19jaGFuZ2VzID0gMDsgIWhhc19jaGFuZ2VzICYmIGkgPCBxLT5ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgZGlmZl9maWxlcGFpciAqcCA9IHEtPnF1ZXVlW2ldOworCQkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkgeworCQkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpCisJCQkJCWNvbnRpbnVlOyAvKiBpZ25vcmUgdW5tZXJnZWQgKi8KKwkJCQkvKiBjcmVhdGVkICovCisJCQkJaWYgKGNvbnRhaW5zKHAtPnR3bywgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJCWhhc19jaGFuZ2VzKys7CisJCQl9CisJCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpIHsKKwkJCQlpZiAoY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQkJaGFzX2NoYW5nZXMrKzsKKwkJCX0KKwkJCWVsc2UgaWYgKCFkaWZmX3VubW9kaWZpZWRfcGFpcihwKSAmJgorCQkJCSBjb250YWlucyhwLT5vbmUsIG5lZWRsZSwgbGVuLCByZWdleHApICE9CisJCQkJIGNvbnRhaW5zKHAtPnR3bywgbmVlZGxlLCBsZW4sIHJlZ2V4cCkpCisJCQkJaGFzX2NoYW5nZXMrKzsKKwkJfQorCQlpZiAoaGFzX2NoYW5nZXMpCisJCQlyZXR1cm47IC8qIG5vdCBtdW5nZSB0aGUgcXVldWUgKi8KKworCQkvKiBvdGhlcndpc2Ugd2Ugd2lsbCBjbGVhciB0aGUgd2hvbGUgcXVldWUKKwkJICogYnkgY29weWluZyB0aGUgZW1wdHkgb3V0cSBhdCB0aGUgZW5kIG9mIHRoaXMKKwkJICogZnVuY3Rpb24sIGJ1dCBmaXJzdCBjbGVhciB0aGUgY3VycmVudCBlbnRyaWVzCisJCSAqIGluIHRoZSBxdWV1ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKQorCQkJZGlmZl9mcmVlX2ZpbGVwYWlyKHEtPnF1ZXVlW2ldKTsKKwl9CisJZWxzZSAKKwkJLyogU2hvd2luZyBvbmx5IHRoZSBmaWxlcGFpcnMgdGhhdCBoYXMgdGhlIG5lZWRsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgcS0+bnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJCWhhc19jaGFuZ2VzID0gMDsKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPm9uZSkpIHsKKwkJCQlpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKQorCQkJCQk7IC8qIGlnbm9yZSB1bm1lcmdlZCAqLworCQkJCS8qIGNyZWF0ZWQgKi8KKwkJCQllbHNlIGlmIChjb250YWlucyhwLT50d28sIG5lZWRsZSwgbGVuLCByZWdleHApKQorCQkJCQloYXNfY2hhbmdlcyA9IDE7CisJCQl9CisJCQllbHNlIGlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpIHsKKwkJCQlpZiAoY29udGFpbnMocC0+b25lLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQkJaGFzX2NoYW5nZXMgPSAxOworCQkJfQorCQkJZWxzZSBpZiAoIWRpZmZfdW5tb2RpZmllZF9wYWlyKHApICYmCisJCQkJIGNvbnRhaW5zKHAtPm9uZSwgbmVlZGxlLCBsZW4sIHJlZ2V4cCkgIT0KKwkJCQkgY29udGFpbnMocC0+dHdvLCBuZWVkbGUsIGxlbiwgcmVnZXhwKSkKKwkJCQloYXNfY2hhbmdlcyA9IDE7CisKKwkJCWlmIChoYXNfY2hhbmdlcykKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQkJZWxzZQorCQkJCWRpZmZfZnJlZV9maWxlcGFpcihwKTsKKwkJfQorCisJaWYgKG9wdHMgJiBESUZGX1BJQ0tBWEVfUkVHRVgpIHsKKwkJcmVnZnJlZSgmcmVnZXgpOworCX0KKworCWZyZWUocS0+cXVldWUpOworCSpxID0gb3V0cTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS1yZW5hbWUuYyBiL2RpZmZjb3JlLXJlbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzQ4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kaWZmY29yZS1yZW5hbWUuYwpAQCAtMCwwICsxLDQ2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAiZGlmZmNvcmUuaCIKKworLyogVGFibGUgb2YgcmVuYW1lL2NvcHkgZGVzdGluYXRpb25zICovCisKK3N0YXRpYyBzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0IHsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvOworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwYWlyOworfSAqcmVuYW1lX2RzdDsKK3N0YXRpYyBpbnQgcmVuYW1lX2RzdF9uciwgcmVuYW1lX2RzdF9hbGxvYzsKKworc3RhdGljIHN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmxvY2F0ZV9yZW5hbWVfZHN0KHN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28sCisJCQkJCQkgaW50IGluc2VydF9vaykKK3sKKwlpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IDA7CisJbGFzdCA9IHJlbmFtZV9kc3RfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgbmV4dCA9IChsYXN0ICsgZmlyc3QpID4+IDE7CisJCXN0cnVjdCBkaWZmX3JlbmFtZV9kc3QgKmRzdCA9ICYocmVuYW1lX2RzdFtuZXh0XSk7CisJCWludCBjbXAgPSBzdHJjbXAodHdvLT5wYXRoLCBkc3QtPnR3by0+cGF0aCk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIGRzdDsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCS8qIG5vdCBmb3VuZCAqLworCWlmICghaW5zZXJ0X29rKQorCQlyZXR1cm4gTlVMTDsKKwkvKiBpbnNlcnQgdG8gbWFrZSBpdCBhdCAiZmlyc3QiICovCisJaWYgKHJlbmFtZV9kc3RfYWxsb2MgPD0gcmVuYW1lX2RzdF9ucikgeworCQlyZW5hbWVfZHN0X2FsbG9jID0gYWxsb2NfbnIocmVuYW1lX2RzdF9hbGxvYyk7CisJCXJlbmFtZV9kc3QgPSB4cmVhbGxvYyhyZW5hbWVfZHN0LAorCQkJCSAgICAgIHJlbmFtZV9kc3RfYWxsb2MgKiBzaXplb2YoKnJlbmFtZV9kc3QpKTsKKwl9CisJcmVuYW1lX2RzdF9ucisrOworCWlmIChmaXJzdCA8IHJlbmFtZV9kc3RfbnIpCisJCW1lbW1vdmUocmVuYW1lX2RzdCArIGZpcnN0ICsgMSwgcmVuYW1lX2RzdCArIGZpcnN0LAorCQkJKHJlbmFtZV9kc3RfbnIgLSBmaXJzdCAtIDEpICogc2l6ZW9mKCpyZW5hbWVfZHN0KSk7CisJcmVuYW1lX2RzdFtmaXJzdF0udHdvID0gYWxsb2NfZmlsZXNwZWModHdvLT5wYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKHJlbmFtZV9kc3RbZmlyc3RdLnR3bywgdHdvLT5zaGExLCB0d28tPm1vZGUpOworCXJlbmFtZV9kc3RbZmlyc3RdLnBhaXIgPSBOVUxMOworCXJldHVybiAmKHJlbmFtZV9kc3RbZmlyc3RdKTsKK30KKworLyogVGFibGUgb2YgcmVuYW1lL2NvcHkgc3JjIGZpbGVzICovCitzdGF0aWMgc3RydWN0IGRpZmZfcmVuYW1lX3NyYyB7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZTsKKwl1bnNpZ25lZCBzaG9ydCBzY29yZTsgLyogdG8gcmVtZW1iZXIgdGhlIGJyZWFrIHNjb3JlICovCisJdW5zaWduZWQgc3JjX3BhdGhfbGVmdCA6IDE7Cit9ICpyZW5hbWVfc3JjOworc3RhdGljIGludCByZW5hbWVfc3JjX25yLCByZW5hbWVfc3JjX2FsbG9jOworCitzdGF0aWMgc3RydWN0IGRpZmZfcmVuYW1lX3NyYyAqcmVnaXN0ZXJfcmVuYW1lX3NyYyhzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLAorCQkJCQkJICAgaW50IHNyY19wYXRoX2xlZnQsCisJCQkJCQkgICB1bnNpZ25lZCBzaG9ydCBzY29yZSkKK3sKKwlpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IDA7CisJbGFzdCA9IHJlbmFtZV9zcmNfbnI7CisJd2hpbGUgKGxhc3QgPiBmaXJzdCkgeworCQlpbnQgbmV4dCA9IChsYXN0ICsgZmlyc3QpID4+IDE7CisJCXN0cnVjdCBkaWZmX3JlbmFtZV9zcmMgKnNyYyA9ICYocmVuYW1lX3NyY1tuZXh0XSk7CisJCWludCBjbXAgPSBzdHJjbXAob25lLT5wYXRoLCBzcmMtPm9uZS0+cGF0aCk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIHNyYzsKKwkJaWYgKGNtcCA8IDApIHsKKwkJCWxhc3QgPSBuZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZmlyc3QgPSBuZXh0KzE7CisJfQorCisJLyogaW5zZXJ0IHRvIG1ha2UgaXQgYXQgImZpcnN0IiAqLworCWlmIChyZW5hbWVfc3JjX2FsbG9jIDw9IHJlbmFtZV9zcmNfbnIpIHsKKwkJcmVuYW1lX3NyY19hbGxvYyA9IGFsbG9jX25yKHJlbmFtZV9zcmNfYWxsb2MpOworCQlyZW5hbWVfc3JjID0geHJlYWxsb2MocmVuYW1lX3NyYywKKwkJCQkgICAgICByZW5hbWVfc3JjX2FsbG9jICogc2l6ZW9mKCpyZW5hbWVfc3JjKSk7CisJfQorCXJlbmFtZV9zcmNfbnIrKzsKKwlpZiAoZmlyc3QgPCByZW5hbWVfc3JjX25yKQorCQltZW1tb3ZlKHJlbmFtZV9zcmMgKyBmaXJzdCArIDEsIHJlbmFtZV9zcmMgKyBmaXJzdCwKKwkJCShyZW5hbWVfc3JjX25yIC0gZmlyc3QgLSAxKSAqIHNpemVvZigqcmVuYW1lX3NyYykpOworCXJlbmFtZV9zcmNbZmlyc3RdLm9uZSA9IG9uZTsKKwlyZW5hbWVfc3JjW2ZpcnN0XS5zY29yZSA9IHNjb3JlOworCXJlbmFtZV9zcmNbZmlyc3RdLnNyY19wYXRoX2xlZnQgPSBzcmNfcGF0aF9sZWZ0OworCXJldHVybiAmKHJlbmFtZV9zcmNbZmlyc3RdKTsKK30KKworc3RhdGljIGludCBpc19leGFjdF9tYXRjaChzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqc3JjLAorCQkJICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJICBpbnQgY29udGVudHNfdG9vKQoreworCWlmIChzcmMtPnNoYTFfdmFsaWQgJiYgZHN0LT5zaGExX3ZhbGlkICYmCisJICAgICFtZW1jbXAoc3JjLT5zaGExLCBkc3QtPnNoYTEsIDIwKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFjb250ZW50c190b28pCisJCXJldHVybiAwOworCWlmIChkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKHNyYywgMSkgfHwgZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhkc3QsIDEpKQorCQlyZXR1cm4gMDsKKwlpZiAoc3JjLT5zaXplICE9IGRzdC0+c2l6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoc3JjLCAwKSB8fCBkaWZmX3BvcHVsYXRlX2ZpbGVzcGVjKGRzdCwgMCkpCisJCXJldHVybiAwOworCWlmIChzcmMtPnNpemUgPT0gZHN0LT5zaXplICYmCisJICAgICFtZW1jbXAoc3JjLT5kYXRhLCBkc3QtPmRhdGEsIHNyYy0+c2l6ZSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGlmZl9zY29yZSB7CisJaW50IHNyYzsgLyogaW5kZXggaW4gcmVuYW1lX3NyYyAqLworCWludCBkc3Q7IC8qIGluZGV4IGluIHJlbmFtZV9kc3QgKi8KKwlpbnQgc2NvcmU7Cit9OworCitzdGF0aWMgaW50IGVzdGltYXRlX3NpbWlsYXJpdHkoc3RydWN0IGRpZmZfZmlsZXNwZWMgKnNyYywKKwkJCSAgICAgICBzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqZHN0LAorCQkJICAgICAgIGludCBtaW5pbXVtX3Njb3JlKQoreworCS8qIHNyYyBwb2ludHMgYXQgYSBmaWxlIHRoYXQgZXhpc3RlZCBpbiB0aGUgb3JpZ2luYWwgdHJlZSAob3IKKwkgKiBvcHRpb25hbGx5IGEgZmlsZSBpbiB0aGUgZGVzdGluYXRpb24gdHJlZSkgYW5kIGRzdCBwb2ludHMKKwkgKiBhdCBhIG5ld2x5IGNyZWF0ZWQgZmlsZS4gIFRoZXkgbWF5IGJlIHF1aXRlIHNpbWlsYXIsIGluIHdoaWNoCisJICogY2FzZSB3ZSB3YW50IHRvIHNheSBzcmMgaXMgcmVuYW1lZCB0byBkc3Qgb3Igc3JjIGlzIGNvcGllZCBpbnRvCisJICogZHN0LCBhbmQgdGhlbiBzb21lIGVkaXQgaGFzIGJlZW4gYXBwbGllZCB0byBkc3QuCisJICoKKwkgKiBDb21wYXJlIHRoZW0gYW5kIHJldHVybiBob3cgc2ltaWxhciB0aGV5IGFyZSwgcmVwcmVzZW50aW5nCisJICogdGhlIHNjb3JlIGFzIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCBNQVhfU0NPUkUuCisJICoKKwkgKiBXaGVuIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLCBpdCBpcyBjb25zaWRlcmVkIGEgYmV0dGVyCisJICogbWF0Y2ggdGhhbiBhbnl0aGluZyBlbHNlOyB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QgZXZlbgorCSAqIGNhbGwgaW50byB0aGlzIGZ1bmN0aW9uIGluIHRoYXQgY2FzZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG1heF9zaXplLCBkZWx0YV9zaXplLCBiYXNlX3NpemUsIHNyY19jb3BpZWQsIGxpdGVyYWxfYWRkZWQ7CisJdW5zaWduZWQgbG9uZyBkZWx0YV9saW1pdDsKKwlpbnQgc2NvcmU7CisKKwkvKiBXZSBkZWFsIG9ubHkgd2l0aCByZWd1bGFyIGZpbGVzLiAgU3ltbGluayByZW5hbWVzIGFyZSBoYW5kbGVkCisJICogb25seSB3aGVuIHRoZXkgYXJlIGV4YWN0IG1hdGNoZXMgLS0tIGluIG90aGVyIHdvcmRzLCBubyBlZGl0cworCSAqIGFmdGVyIHJlbmFtaW5nLgorCSAqLworCWlmICghU19JU1JFRyhzcmMtPm1vZGUpIHx8ICFTX0lTUkVHKGRzdC0+bW9kZSkpCisJCXJldHVybiAwOworCisJbWF4X3NpemUgPSAoKHNyYy0+c2l6ZSA+IGRzdC0+c2l6ZSkgPyBzcmMtPnNpemUgOiBkc3QtPnNpemUpOworCWJhc2Vfc2l6ZSA9ICgoc3JjLT5zaXplIDwgZHN0LT5zaXplKSA/IHNyYy0+c2l6ZSA6IGRzdC0+c2l6ZSk7CisJZGVsdGFfc2l6ZSA9IG1heF9zaXplIC0gYmFzZV9zaXplOworCisJLyogV2Ugd291bGQgbm90IGNvbnNpZGVyIGVkaXRzIHRoYXQgY2hhbmdlIHRoZSBmaWxlIHNpemUgc28KKwkgKiBkcmFzdGljYWxseS4gIGRlbHRhX3NpemUgbXVzdCBiZSBzbWFsbGVyIHRoYW4KKwkgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpL01BWF9TQ09SRSAqIG1pbihzcmMtPnNpemUsIGRzdC0+c2l6ZSkuCisJICoKKwkgKiBOb3RlIHRoYXQgYmFzZV9zaXplID09IDAgY2FzZSBpcyBoYW5kbGVkIGhlcmUgYWxyZWFkeQorCSAqIGFuZCB0aGUgZmluYWwgc2NvcmUgY29tcHV0YXRpb24gYmVsb3cgd291bGQgbm90IGhhdmUgYQorCSAqIGRpdmlkZS1ieS16ZXJvIGlzc3VlLgorCSAqLworCWlmIChiYXNlX3NpemUgKiAoTUFYX1NDT1JFLW1pbmltdW1fc2NvcmUpIDwgZGVsdGFfc2l6ZSAqIE1BWF9TQ09SRSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGlmZl9wb3B1bGF0ZV9maWxlc3BlYyhzcmMsIDApIHx8IGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoZHN0LCAwKSkKKwkJcmV0dXJuIDA7IC8qIGVycm9yIGJ1dCBjYXVnaHQgZG93bnN0cmVhbSAqLworCisKKwlkZWx0YV9saW1pdCA9IGJhc2Vfc2l6ZSAqIChNQVhfU0NPUkUtbWluaW11bV9zY29yZSkgLyBNQVhfU0NPUkU7CisJaWYgKGRpZmZjb3JlX2NvdW50X2NoYW5nZXMoc3JjLT5kYXRhLCBzcmMtPnNpemUsCisJCQkJICAgZHN0LT5kYXRhLCBkc3QtPnNpemUsCisJCQkJICAgJnNyYy0+Y250X2RhdGEsICZkc3QtPmNudF9kYXRhLAorCQkJCSAgIGRlbHRhX2xpbWl0LAorCQkJCSAgICZzcmNfY29waWVkLCAmbGl0ZXJhbF9hZGRlZCkpCisJCXJldHVybiAwOworCisJLyogSG93IHNpbWlsYXIgYXJlIHRoZXk/CisJICogd2hhdCBwZXJjZW50YWdlIG9mIG1hdGVyaWFsIGluIGRzdCBhcmUgZnJvbSBzb3VyY2U/CisJICovCisJaWYgKCFkc3QtPnNpemUpCisJCXNjb3JlID0gMDsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwllbHNlCisJCXNjb3JlID0gc3JjX2NvcGllZCAqIE1BWF9TQ09SRSAvIG1heF9zaXplOworCXJldHVybiBzY29yZTsKK30KKworc3RhdGljIHZvaWQgcmVjb3JkX3JlbmFtZV9wYWlyKGludCBkc3RfaW5kZXgsIGludCBzcmNfaW5kZXgsIGludCBzY29yZSkKK3sKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqb25lLCAqdHdvLCAqc3JjLCAqZHN0OworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpkcDsKKworCWlmIChyZW5hbWVfZHN0W2RzdF9pbmRleF0ucGFpcikKKwkJZGllKCJpbnRlcm5hbCBlcnJvcjogZHN0IGFscmVhZHkgbWF0Y2hlZC4iKTsKKworCXNyYyA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5vbmU7CisJb25lID0gYWxsb2NfZmlsZXNwZWMoc3JjLT5wYXRoKTsKKwlmaWxsX2ZpbGVzcGVjKG9uZSwgc3JjLT5zaGExLCBzcmMtPm1vZGUpOworCisJZHN0ID0gcmVuYW1lX2RzdFtkc3RfaW5kZXhdLnR3bzsKKwl0d28gPSBhbGxvY19maWxlc3BlYyhkc3QtPnBhdGgpOworCWZpbGxfZmlsZXNwZWModHdvLCBkc3QtPnNoYTEsIGRzdC0+bW9kZSk7CisKKwlkcCA9IGRpZmZfcXVldWUoTlVMTCwgb25lLCB0d28pOworCWRwLT5yZW5hbWVkX3BhaXIgPSAxOworCWlmICghc3RyY21wKHNyYy0+cGF0aCwgZHN0LT5wYXRoKSkKKwkJZHAtPnNjb3JlID0gcmVuYW1lX3NyY1tzcmNfaW5kZXhdLnNjb3JlOworCWVsc2UKKwkJZHAtPnNjb3JlID0gc2NvcmU7CisJZHAtPnNvdXJjZV9zdGF5cyA9IHJlbmFtZV9zcmNbc3JjX2luZGV4XS5zcmNfcGF0aF9sZWZ0OworCXJlbmFtZV9kc3RbZHN0X2luZGV4XS5wYWlyID0gZHA7Cit9CisKKy8qCisgKiBXZSBzb3J0IHRoZSByZW5hbWUgc2ltaWxhcml0eSBtYXRyaXggd2l0aCB0aGUgc2NvcmUsIGluIGRlc2NlbmRpbmcKKyAqIG9yZGVyICh0aGUgbW9zdCBzaW1pbGFyIGZpcnN0KS4KKyAqLworc3RhdGljIGludCBzY29yZV9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwljb25zdCBzdHJ1Y3QgZGlmZl9zY29yZSAqYSA9IGFfLCAqYiA9IGJfOworCXJldHVybiBiLT5zY29yZSAtIGEtPnNjb3JlOworfQorCitzdGF0aWMgaW50IGNvbXB1dGVfc3RheXMoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICpxLAorCQkJIHN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaWYgKHN0cmNtcChvbmUtPnBhdGgsIHAtPnR3by0+cGF0aCkpCisJCQljb250aW51ZTsKKwkJaWYgKERJRkZfUEFJUl9SRU5BTUUocCkpIHsKKwkJCXJldHVybiAwOyAvKiBzb21ldGhpbmcgZWxzZSBpcyByZW5hbWVkIGludG8gdGhpcyAqLworCQl9CisJfQorCXJldHVybiAxOworfQorCit2b2lkIGRpZmZjb3JlX3JlbmFtZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zKQoreworCWludCBkZXRlY3RfcmVuYW1lID0gb3B0aW9ucy0+ZGV0ZWN0X3JlbmFtZTsKKwlpbnQgbWluaW11bV9zY29yZSA9IG9wdGlvbnMtPnJlbmFtZV9zY29yZTsKKwlpbnQgcmVuYW1lX2xpbWl0ID0gb3B0aW9ucy0+cmVuYW1lX2xpbWl0OworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCAqcSA9ICZkaWZmX3F1ZXVlZF9kaWZmOworCXN0cnVjdCBkaWZmX3F1ZXVlX3N0cnVjdCBvdXRxOworCXN0cnVjdCBkaWZmX3Njb3JlICpteDsKKwlpbnQgaSwgaiwgcmVuYW1lX2NvdW50LCBjb250ZW50c190b287CisJaW50IG51bV9jcmVhdGUsIG51bV9zcmMsIGRzdF9jbnQ7CisKKwlpZiAoIW1pbmltdW1fc2NvcmUpCisJCW1pbmltdW1fc2NvcmUgPSBERUZBVUxUX1JFTkFNRV9TQ09SRTsKKwlyZW5hbWVfY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSkKKwkJCWlmICghRElGRl9GSUxFX1ZBTElEKHAtPnR3bykpCisJCQkJY29udGludWU7IC8qIHVubWVyZ2VkICovCisJCQllbHNlCisJCQkJbG9jYXRlX3JlbmFtZV9kc3QocC0+dHdvLCAxKTsKKwkJZWxzZSBpZiAoIURJRkZfRklMRV9WQUxJRChwLT50d28pKSB7CisJCQkvKiBJZiB0aGUgc291cmNlIGlzIGEgYnJva2VuICJkZWxldGUiLCBhbmQKKwkJCSAqIHRoZXkgZGlkIG5vdCByZWFsbHkgd2FudCB0byBnZXQgYnJva2VuLAorCQkJICogdGhhdCBtZWFucyB0aGUgc291cmNlIGFjdHVhbGx5IHN0YXlzLgorCQkJICovCisJCQlpbnQgc3RheXMgPSAocC0+YnJva2VuX3BhaXIgJiYgIXAtPnNjb3JlKTsKKwkJCXJlZ2lzdGVyX3JlbmFtZV9zcmMocC0+b25lLCBzdGF5cywgcC0+c2NvcmUpOworCQl9CisJCWVsc2UgaWYgKGRldGVjdF9yZW5hbWUgPT0gRElGRl9ERVRFQ1RfQ09QWSkKKwkJCXJlZ2lzdGVyX3JlbmFtZV9zcmMocC0+b25lLCAxLCBwLT5zY29yZSk7CisJfQorCWlmIChyZW5hbWVfZHN0X25yID09IDAgfHwgcmVuYW1lX3NyY19uciA9PSAwIHx8CisJICAgICgwIDwgcmVuYW1lX2xpbWl0ICYmIHJlbmFtZV9saW1pdCA8IHJlbmFtZV9kc3RfbnIpKQorCQlnb3RvIGNsZWFudXA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KKworCS8qIFdlIHJlYWxseSB3YW50IHRvIGN1bGwgdGhlIGNhbmRpZGF0ZXMgbGlzdCBlYXJseQorCSAqIHdpdGggY2hlYXAgdGVzdHMgaW4gb3JkZXIgdG8gYXZvaWQgZG9pbmcgZGVsdGFzLgorCSAqIFRoZSBmaXJzdCByb3VuZCBtYXRjaGVzIHVwIHRoZSB1cC10by1kYXRlIGVudHJpZXMsCisJICogYW5kIHRoZW4gZHVyaW5nIHRoZSBzZWNvbmQgcm91bmQgd2UgdHJ5IHRvIG1hdGNoCisJICogY2FjaGUtZGlydHkgZW50cmllcyBhcyB3ZWxsLgorCSAqLworCWZvciAoY29udGVudHNfdG9vID0gMDsgY29udGVudHNfdG9vIDwgMjsgY29udGVudHNfdG9vKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHJlbmFtZV9kc3RfbnI7IGkrKykgeworCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKnR3byA9IHJlbmFtZV9kc3RbaV0udHdvOworCQkJaWYgKHJlbmFtZV9kc3RbaV0ucGFpcikKKwkJCQljb250aW51ZTsgLyogZGVhbHQgd2l0aCBhbiBlYXJsaWVyIHJvdW5kICovCisJCQlmb3IgKGogPSAwOyBqIDwgcmVuYW1lX3NyY19ucjsgaisrKSB7CisJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZSA9IHJlbmFtZV9zcmNbal0ub25lOworCQkJCWlmICghaXNfZXhhY3RfbWF0Y2gob25lLCB0d28sIGNvbnRlbnRzX3RvbykpCisJCQkJCWNvbnRpbnVlOworCQkJCXJlY29yZF9yZW5hbWVfcGFpcihpLCBqLCBNQVhfU0NPUkUpOworCQkJCXJlbmFtZV9jb3VudCsrOworCQkJCWJyZWFrOyAvKiB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgZW50cnkgKi8KKwkJCX0KKwkJfQorCX0KKworCS8qIEhhdmUgd2UgcnVuIG91dCB0aGUgY3JlYXRlZCBmaWxlIHBvb2w/ICBJZiBzbyB3ZSBjYW4gYXZvaWQKKwkgKiBkb2luZyB0aGUgZGVsdGEgbWF0cml4IGFsdG9nZXRoZXIuCisJICovCisJaWYgKHJlbmFtZV9jb3VudCA9PSByZW5hbWVfZHN0X25yKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAobWluaW11bV9zY29yZSA9PSBNQVhfU0NPUkUpCisJCWdvdG8gY2xlYW51cDsKKworCW51bV9jcmVhdGUgPSAocmVuYW1lX2RzdF9uciAtIHJlbmFtZV9jb3VudCk7CisJbnVtX3NyYyA9IHJlbmFtZV9zcmNfbnI7CisJbXggPSB4bWFsbG9jKHNpemVvZigqbXgpICogbnVtX2NyZWF0ZSAqIG51bV9zcmMpOworCWZvciAoZHN0X2NudCA9IGkgPSAwOyBpIDwgcmVuYW1lX2RzdF9ucjsgaSsrKSB7CisJCWludCBiYXNlID0gZHN0X2NudCAqIG51bV9zcmM7CisJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICp0d28gPSByZW5hbWVfZHN0W2ldLnR3bzsKKwkJaWYgKHJlbmFtZV9kc3RbaV0ucGFpcikKKwkJCWNvbnRpbnVlOyAvKiBkZWFsdCB3aXRoIGV4YWN0IG1hdGNoIGFscmVhZHkuICovCisJCWZvciAoaiA9IDA7IGogPCByZW5hbWVfc3JjX25yOyBqKyspIHsKKwkJCXN0cnVjdCBkaWZmX2ZpbGVzcGVjICpvbmUgPSByZW5hbWVfc3JjW2pdLm9uZTsKKwkJCXN0cnVjdCBkaWZmX3Njb3JlICptID0gJm14W2Jhc2Ural07CisJCQltLT5zcmMgPSBqOworCQkJbS0+ZHN0ID0gaTsKKwkJCW0tPnNjb3JlID0gZXN0aW1hdGVfc2ltaWxhcml0eShvbmUsIHR3bywKKwkJCQkJCSAgICAgICBtaW5pbXVtX3Njb3JlKTsKKwkJfQorCQkvKiBXZSBkbyBub3QgbmVlZCB0aGUgdGV4dCBhbnltb3JlICovCisJCWRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHR3byk7CisJCWRzdF9jbnQrKzsKKwl9CisJLyogY29zdCBtYXRyaXggc29ydGVkIGJ5IG1vc3QgdG8gbGVhc3Qgc2ltaWxhciBwYWlyICovCisJcXNvcnQobXgsIG51bV9jcmVhdGUgKiBudW1fc3JjLCBzaXplb2YoKm14KSwgc2NvcmVfY29tcGFyZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9jcmVhdGUgKiBudW1fc3JjOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfcmVuYW1lX2RzdCAqZHN0ID0gJnJlbmFtZV9kc3RbbXhbaV0uZHN0XTsKKwkJaWYgKGRzdC0+cGFpcikKKwkJCWNvbnRpbnVlOyAvKiBhbHJlYWR5IGRvbmUsIGVpdGhlciBleGFjdCBvciBmdXp6eS4gKi8KKwkJaWYgKG14W2ldLnNjb3JlIDwgbWluaW11bV9zY29yZSkKKwkJCWJyZWFrOyAvKiB0aGVyZSBpcyBubyBtb3JlIHVzYWJsZSBwYWlyLiAqLworCQlyZWNvcmRfcmVuYW1lX3BhaXIobXhbaV0uZHN0LCBteFtpXS5zcmMsIG14W2ldLnNjb3JlKTsKKwkJcmVuYW1lX2NvdW50Kys7CisJfQorCWZyZWUobXgpOworCisgY2xlYW51cDoKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGZvdW5kIHNvbWUgcmVuYW1lcyBhbmQgY29waWVzIGFuZCB0aGV5CisJICogYXJlIHJlY29yZGVkIGluIHJlbmFtZV9kc3QuICBUaGUgb3JpZ2luYWwgbGlzdCBpcyBzdGlsbCBpbiAqcS4KKwkgKi8KKwlvdXRxLnF1ZXVlID0gTlVMTDsKKwlvdXRxLm5yID0gb3V0cS5hbGxvYyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHEtPm5yOyBpKyspIHsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnAgPSBxLT5xdWV1ZVtpXTsKKwkJc3RydWN0IGRpZmZfZmlsZXBhaXIgKnBhaXJfdG9fZnJlZSA9IE5VTEw7CisKKwkJaWYgKCFESUZGX0ZJTEVfVkFMSUQocC0+b25lKSAmJiBESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkgeworCQkJLyoKKwkJCSAqIENyZWF0aW9uCisJCQkgKgorCQkJICogV2Ugd291bGQgb3V0cHV0IHRoaXMgY3JlYXRlIHJlY29yZCBpZiBpdCBoYXMKKwkJCSAqIG5vdCBiZWVuIHR1cm5lZCBpbnRvIGEgcmVuYW1lL2NvcHkgYWxyZWFkeS4KKwkJCSAqLworCQkJc3RydWN0IGRpZmZfcmVuYW1lX2RzdCAqZHN0ID0KKwkJCQlsb2NhdGVfcmVuYW1lX2RzdChwLT50d28sIDApOworCQkJaWYgKGRzdCAmJiBkc3QtPnBhaXIpIHsKKwkJCQlkaWZmX3EoJm91dHEsIGRzdC0+cGFpcik7CisJCQkJcGFpcl90b19mcmVlID0gcDsKKwkJCX0KKwkJCWVsc2UKKwkJCQkvKiBubyBtYXRjaGluZyByZW5hbWUvY29weSBzb3VyY2UsIHNvCisJCQkJICogcmVjb3JkIHRoaXMgYXMgYSBjcmVhdGlvbi4KKwkJCQkgKi8KKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQl9CisJCWVsc2UgaWYgKERJRkZfRklMRV9WQUxJRChwLT5vbmUpICYmICFESUZGX0ZJTEVfVkFMSUQocC0+dHdvKSkgeworCQkJLyoKKwkJCSAqIERlbGV0aW9uCisJCQkgKgorCQkJICogV2Ugd291bGQgb3V0cHV0IHRoaXMgZGVsZXRlIHJlY29yZCBpZjoKKwkJCSAqCisJCQkgKiAoMSkgdGhpcyBpcyBhIGJyb2tlbiBkZWxldGUgYW5kIHRoZSBjb3VudGVycGFydAorCQkJICogICAgIGJyb2tlbiBjcmVhdGUgcmVtYWlucyBpbiB0aGUgb3V0cHV0OyBvcgorCQkJICogKDIpIHRoaXMgaXMgbm90IGEgYnJva2VuIGRlbGV0ZSwgYW5kIHJlbmFtZV9kc3QKKwkJCSAqICAgICBkb2VzIG5vdCBoYXZlIGEgcmVuYW1lL2NvcHkgdG8gbW92ZSBwLT5vbmUtPnBhdGgKKwkJCSAqICAgICBvdXQgb2YgZXhpc3RlbmNlLgorCQkJICoKKwkJCSAqIE90aGVyd2lzZSwgdGhlIGNvdW50ZXJwYXJ0IGJyb2tlbiBjcmVhdGUKKwkJCSAqIGhhcyBiZWVuIHR1cm5lZCBpbnRvIGEgcmVuYW1lLWVkaXQ7IG9yCisJCQkgKiBkZWxldGUgZGlkIG5vdCBoYXZlIGEgbWF0Y2hpbmcgY3JlYXRlIHRvCisJCQkgKiBiZWdpbiB3aXRoLgorCQkJICovCisJCQlpZiAoRElGRl9QQUlSX0JST0tFTihwKSkgeworCQkJCS8qIGJyb2tlbiBkZWxldGUgKi8KKwkJCQlzdHJ1Y3QgZGlmZl9yZW5hbWVfZHN0ICpkc3QgPQorCQkJCQlsb2NhdGVfcmVuYW1lX2RzdChwLT5vbmUsIDApOworCQkJCWlmIChkc3QgJiYgZHN0LT5wYWlyKQorCQkJCQkvKiBjb3VudGVycGFydCBpcyBub3cgcmVuYW1lL2NvcHkgKi8KKwkJCQkJcGFpcl90b19mcmVlID0gcDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWZvciAoaiA9IDA7IGogPCByZW5hbWVfZHN0X25yOyBqKyspIHsKKwkJCQkJaWYgKCFyZW5hbWVfZHN0W2pdLnBhaXIpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKHN0cmNtcChyZW5hbWVfZHN0W2pdLnBhaXItPgorCQkJCQkJICAgb25lLT5wYXRoLAorCQkJCQkJICAgcC0+b25lLT5wYXRoKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGogPCByZW5hbWVfZHN0X25yKQorCQkJCQkvKiB0aGlzIHBhdGggcmVtYWlucyAqLworCQkJCQlwYWlyX3RvX2ZyZWUgPSBwOworCQkJfQorCisJCQlpZiAocGFpcl90b19mcmVlKQorCQkJCTsKKwkJCWVsc2UKKwkJCQlkaWZmX3EoJm91dHEsIHApOworCQl9CisJCWVsc2UgaWYgKCFkaWZmX3VubW9kaWZpZWRfcGFpcihwKSkKKwkJCS8qIGFsbCB0aGUgdXN1YWwgb25lcyBuZWVkIHRvIGJlIGtlcHQgKi8KKwkJCWRpZmZfcSgmb3V0cSwgcCk7CisJCWVsc2UKKwkJCS8qIG5vIG5lZWQgdG8ga2VlcCB1bm1vZGlmaWVkIHBhaXJzICovCisJCQlwYWlyX3RvX2ZyZWUgPSBwOworCisJCWlmIChwYWlyX3RvX2ZyZWUpCisJCQlkaWZmX2ZyZWVfZmlsZXBhaXIocGFpcl90b19mcmVlKTsKKwl9CisJZGlmZl9kZWJ1Z19xdWV1ZSgiZG9uZSBjb3B5aW5nIG9yaWdpbmFsIiwgJm91dHEpOworCisJZnJlZShxLT5xdWV1ZSk7CisJKnEgPSBvdXRxOworCWRpZmZfZGVidWdfcXVldWUoImRvbmUgY29sbGFwc2luZyIsIHEpOworCisJLyogV2UgbmVlZCB0byBzZWUgd2hpY2ggcmVuYW1lIHNvdXJjZSByZWFsbHkgc3RheXMgaGVyZTsKKwkgKiBlYXJsaWVyIHdlIG9ubHkgY2hlY2tlZCBpZiB0aGUgcGF0aCBpcyBsZWZ0IGluIHRoZSByZXN1bHQsCisJICogYnV0IGV2ZW4gaWYgYSBwYXRoIHJlbWFpbnMgaW4gdGhlIHJlc3VsdCwgaWYgdGhhdCBpcyBjb21pbmcKKwkgKiBmcm9tIGNvcHlpbmcgc29tZXRoaW5nIGVsc2Ugb24gdG9wIG9mIGl0LCB0aGVuIHRoZSBvcmlnaW5hbAorCSAqIHNvdXJjZSBpcyBsb3N0IGFuZCBkb2VzIG5vdCBzdGF5LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBxLT5ucjsgaSsrKSB7CisJCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICpwID0gcS0+cXVldWVbaV07CisJCWlmIChESUZGX1BBSVJfUkVOQU1FKHApICYmIHAtPnNvdXJjZV9zdGF5cykgeworCQkJLyogSWYgb25lIGFwcGVhcnMgYXMgdGhlIHRhcmdldCBvZiBhIHJlbmFtZS1jb3B5LAorCQkJICogdGhlbiBtYXJrIHAtPnNvdXJjZV9zdGF5cyA9IDA7IG90aGVyd2lzZQorCQkJICogbGVhdmUgaXQgYXMgaXMuCisJCQkgKi8KKwkJCXAtPnNvdXJjZV9zdGF5cyA9IGNvbXB1dGVfc3RheXMocSwgcC0+b25lKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCByZW5hbWVfZHN0X25yOyBpKyspIHsKKwkJZGlmZl9mcmVlX2ZpbGVzcGVjX2RhdGEocmVuYW1lX2RzdFtpXS50d28pOworCQlmcmVlKHJlbmFtZV9kc3RbaV0udHdvKTsKKwl9CisKKwlmcmVlKHJlbmFtZV9kc3QpOworCXJlbmFtZV9kc3QgPSBOVUxMOworCXJlbmFtZV9kc3RfbnIgPSByZW5hbWVfZHN0X2FsbG9jID0gMDsKKwlmcmVlKHJlbmFtZV9zcmMpOworCXJlbmFtZV9zcmMgPSBOVUxMOworCXJlbmFtZV9zcmNfbnIgPSByZW5hbWVfc3JjX2FsbG9jID0gMDsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kaWZmY29yZS5oIGIvZGlmZmNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ5YmMyCi0tLSAvZGV2L251bGwKKysrIGIvZGlmZmNvcmUuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKdW5pbyBDIEhhbWFubworICovCisjaWZuZGVmIF9ESUZGQ09SRV9IXworI2RlZmluZSBfRElGRkNPUkVfSF8KKworLyogVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlcm5hbCBiZXR3ZWVuIGRpZmYuYyBhbmQgaXRzIGRpZmYgdHJhbnNmb3JtZXJzCisgKiAoZS5nLiBkaWZmY29yZS1yZW5hbWUsIGRpZmZjb3JlLXBpY2theGUpLiAgTmV2ZXIgaW5jbHVkZSB0aGlzIGhlYWRlcgorICogaW4gYW55dGhpbmcgZWxzZS4KKyAqLworCisvKiBXZSBpbnRlcm5hbGx5IHVzZSB1bnNpZ25lZCBzaG9ydCBhcyB0aGUgc2NvcmUgdmFsdWUsCisgKiBhbmQgcmVseSBvbiBhbiBpbnQgY2FwYWJsZSB0byBob2xkIDMyLWJpdHMuICAtQiBjYW4gdGFrZQorICogLUJtZXJnZV9zY29yZS9icmVha19zY29yZSBmb3JtYXQgYW5kIHRoZSB0d28gc2NvcmVzIGFyZQorICogcGFzc2VkIGFyb3VuZCBpbiBvbmUgaW50IChoaWdoIDE2LWJpdCBmb3IgbWVyZ2UgYW5kIGxvdyAxNi1iaXQKKyAqIGZvciBicmVhaykuCisgKi8KKyNkZWZpbmUgTUFYX1NDT1JFIDYwMDAwLjAKKyNkZWZpbmUgREVGQVVMVF9SRU5BTUVfU0NPUkUgMzAwMDAgLyogcmVuYW1lL2NvcHkgc2ltaWxhcml0eSBtaW5pbXVtICg1MCUpICovCisjZGVmaW5lIERFRkFVTFRfQlJFQUtfU0NPUkUgIDMwMDAwIC8qIG1pbmltdW0gZm9yIGJyZWFrIHRvIGhhcHBlbiAoNTAlKSAqLworI2RlZmluZSBERUZBVUxUX01FUkdFX1NDT1JFICAzNjAwMCAvKiBtYXhpbXVtIGZvciBicmVhay1tZXJnZSB0byBoYXBwZW4gNjAlKSAqLworCisjZGVmaW5lIE1JTklNVU1fQlJFQUtfU0laRSAgICAgNDAwIC8qIGRvIG5vdCBicmVhayBhIGZpbGUgc21hbGxlciB0aGFuIHRoaXMgKi8KKworc3RydWN0IGRpZmZfZmlsZXNwZWMgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY2hhciAqcGF0aDsKKwl2b2lkICpkYXRhOworCXZvaWQgKmNudF9kYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgeGZybV9mbGFnczsJCSAvKiBmb3IgdXNlIGJ5IHRoZSB4ZnJtICovCisJdW5zaWduZWQgc2hvcnQgbW9kZTsJIC8qIGZpbGUgbW9kZSAqLworCXVuc2lnbmVkIHNoYTFfdmFsaWQgOiAxOyAvKiBpZiB0cnVlLCB1c2Ugc2hhMSBhbmQgdHJ1c3QgbW9kZTsKKwkJCQkgICogaWYgZmFsc2UsIHVzZSB0aGUgbmFtZSBhbmQgcmVhZCBmcm9tCisJCQkJICAqIHRoZSBmaWxlc3lzdGVtLgorCQkJCSAgKi8KKyNkZWZpbmUgRElGRl9GSUxFX1ZBTElEKHNwZWMpICgoKHNwZWMpLT5tb2RlKSAhPSAwKQorCXVuc2lnbmVkIHNob3VsZF9mcmVlIDogMTsgLyogZGF0YSBzaG91bGQgYmUgZnJlZSgpJ2VkICovCisJdW5zaWduZWQgc2hvdWxkX211bm1hcCA6IDE7IC8qIGRhdGEgc2hvdWxkIGJlIG11bm1hcCgpJ2VkICovCit9OworCitleHRlcm4gc3RydWN0IGRpZmZfZmlsZXNwZWMgKmFsbG9jX2ZpbGVzcGVjKGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBmaWxsX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwKKwkJCSAgdW5zaWduZWQgc2hvcnQpOworCitleHRlcm4gaW50IGRpZmZfcG9wdWxhdGVfZmlsZXNwZWMoc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwgaW50KTsKK2V4dGVybiB2b2lkIGRpZmZfZnJlZV9maWxlc3BlY19kYXRhKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICopOworCitzdHJ1Y3QgZGlmZl9maWxlcGFpciB7CisJc3RydWN0IGRpZmZfZmlsZXNwZWMgKm9uZTsKKwlzdHJ1Y3QgZGlmZl9maWxlc3BlYyAqdHdvOworCXVuc2lnbmVkIHNob3J0IGludCBzY29yZTsKKwljaGFyIHN0YXR1czsgLyogTSBDIFIgTiBEIFUgKHNlZSBEb2N1bWVudGF0aW9uL2RpZmYtZm9ybWF0LnR4dCkgKi8KKwl1bnNpZ25lZCBzb3VyY2Vfc3RheXMgOiAxOyAvKiBhbGwgb2YgUi9DIGFyZSBjb3BpZXMgKi8KKwl1bnNpZ25lZCBicm9rZW5fcGFpciA6IDE7CisJdW5zaWduZWQgcmVuYW1lZF9wYWlyIDogMTsKK307CisjZGVmaW5lIERJRkZfUEFJUl9VTk1FUkdFRChwKSBcCisJKCFESUZGX0ZJTEVfVkFMSUQoKHApLT5vbmUpICYmICFESUZGX0ZJTEVfVkFMSUQoKHApLT50d28pKQorCisjZGVmaW5lIERJRkZfUEFJUl9SRU5BTUUocCkgKChwKS0+cmVuYW1lZF9wYWlyKQorCisjZGVmaW5lIERJRkZfUEFJUl9CUk9LRU4ocCkgXAorCSggKCFESUZGX0ZJTEVfVkFMSUQoKHApLT5vbmUpICE9ICFESUZGX0ZJTEVfVkFMSUQoKHApLT50d28pKSAmJiBcCisJICAoKHApLT5icm9rZW5fcGFpciAhPSAwKSApCisKKyNkZWZpbmUgRElGRl9QQUlSX1RZUEVfQ0hBTkdFRChwKSBcCisJKChTX0lGTVQgJiAocCktPm9uZS0+bW9kZSkgIT0gKFNfSUZNVCAmIChwKS0+dHdvLT5tb2RlKSkKKworI2RlZmluZSBESUZGX1BBSVJfTU9ERV9DSEFOR0VEKHApICgocCktPm9uZS0+bW9kZSAhPSAocCktPnR3by0+bW9kZSkKKworZXh0ZXJuIHZvaWQgZGlmZl9mcmVlX2ZpbGVwYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICopOworCitleHRlcm4gaW50IGRpZmZfdW5tb2RpZmllZF9wYWlyKHN0cnVjdCBkaWZmX2ZpbGVwYWlyICopOworCitzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgeworCXN0cnVjdCBkaWZmX2ZpbGVwYWlyICoqcXVldWU7CisJaW50IGFsbG9jOworCWludCBucjsKK307CisKK2V4dGVybiBzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgZGlmZl9xdWV1ZWRfZGlmZjsKK2V4dGVybiBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqZGlmZl9xdWV1ZShzdHJ1Y3QgZGlmZl9xdWV1ZV9zdHJ1Y3QgKiwKKwkJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKiwKKwkJCQkJc3RydWN0IGRpZmZfZmlsZXNwZWMgKik7CitleHRlcm4gdm9pZCBkaWZmX3Eoc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICosIHN0cnVjdCBkaWZmX2ZpbGVwYWlyICopOworCitleHRlcm4gdm9pZCBkaWZmY29yZV9wYXRoc3BlYyhjb25zdCBjaGFyICoqcGF0aHNwZWMpOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfYnJlYWsoaW50KTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX3JlbmFtZShzdHJ1Y3QgZGlmZl9vcHRpb25zICopOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfbWVyZ2VfYnJva2VuKHZvaWQpOworZXh0ZXJuIHZvaWQgZGlmZmNvcmVfcGlja2F4ZShjb25zdCBjaGFyICpuZWVkbGUsIGludCBvcHRzKTsKK2V4dGVybiB2b2lkIGRpZmZjb3JlX29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyZmlsZSk7CisKKyNkZWZpbmUgRElGRl9ERUJVRyAwCisjaWYgRElGRl9ERUJVRwordm9pZCBkaWZmX2RlYnVnX2ZpbGVzcGVjKHN0cnVjdCBkaWZmX2ZpbGVzcGVjICosIGludCwgY29uc3QgY2hhciAqKTsKK3ZvaWQgZGlmZl9kZWJ1Z19maWxlcGFpcihjb25zdCBzdHJ1Y3QgZGlmZl9maWxlcGFpciAqLCBpbnQpOwordm9pZCBkaWZmX2RlYnVnX3F1ZXVlKGNvbnN0IGNoYXIgKiwgc3RydWN0IGRpZmZfcXVldWVfc3RydWN0ICopOworI2Vsc2UKKyNkZWZpbmUgZGlmZl9kZWJ1Z19maWxlc3BlYyhhLGIsYykgZG8ge30gd2hpbGUoMCkKKyNkZWZpbmUgZGlmZl9kZWJ1Z19maWxlcGFpcihhLGIpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGRpZmZfZGVidWdfcXVldWUoYSxiKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKK2V4dGVybiBpbnQgZGlmZmNvcmVfY291bnRfY2hhbmdlcyh2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgc3JjX3NpemUsCisJCQkJICB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgZHN0X3NpemUsCisJCQkJICB2b2lkICoqc3JjX2NvdW50X3AsCisJCQkJICB2b2lkICoqZHN0X2NvdW50X3AsCisJCQkJICB1bnNpZ25lZCBsb25nIGRlbHRhX2xpbWl0LAorCQkJCSAgdW5zaWduZWQgbG9uZyAqc3JjX2NvcGllZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKmxpdGVyYWxfYWRkZWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2Rpci5jIGIvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyZDA3NwotLS0gL2Rldi9udWxsCisrKyBiL2Rpci5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogVGhpcyBoYW5kbGVzIHJlY3Vyc2l2ZSBmaWxlbmFtZSBkZXRlY3Rpb24gd2l0aCBleGNsdWRlCisgKiBmaWxlcywgaW5kZXgga25vd2xlZGdlIGV0Yy4uCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNS0yMDA2CisgKgkJIEp1bmlvIEhhbWFubywgMjAwNS0yMDA2CisgKi8KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpci5oIgorCitpbnQgY29tbW9uX3ByZWZpeChjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqcGF0aCwgKnNsYXNoLCAqbmV4dDsKKwlpbnQgcHJlZml4OworCisJaWYgKCFwYXRoc3BlYykKKwkJcmV0dXJuIDA7CisKKwlwYXRoID0gKnBhdGhzcGVjOworCXNsYXNoID0gc3RycmNocihwYXRoLCAnLycpOworCWlmICghc2xhc2gpCisJCXJldHVybiAwOworCisJcHJlZml4ID0gc2xhc2ggLSBwYXRoICsgMTsKKwl3aGlsZSAoKG5leHQgPSAqKytwYXRoc3BlYykgIT0gTlVMTCkgeworCQlpbnQgbGVuID0gc3RybGVuKG5leHQpOworCQlpZiAobGVuID49IHByZWZpeCAmJiAhbWVtY21wKHBhdGgsIG5leHQsIGxlbikpCisJCQljb250aW51ZTsKKwkJZm9yICg7OykgeworCQkJaWYgKCFsZW4pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAobmV4dFstLWxlbl0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChwYXRoLCBuZXh0LCBsZW4rMSkpCisJCQkJY29udGludWU7CisJCQlwcmVmaXggPSBsZW4gKyAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHByZWZpeDsKK30KKworc3RhdGljIGludCBtYXRjaF9vbmUoY29uc3QgY2hhciAqbWF0Y2gsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWludCBtYXRjaGxlbjsKKworCS8qIElmIHRoZSBtYXRjaCB3YXMganVzdCB0aGUgcHJlZml4LCB3ZSBtYXRjaGVkICovCisJbWF0Y2hsZW4gPSBzdHJsZW4obWF0Y2gpOworCWlmICghbWF0Y2hsZW4pCisJCXJldHVybiAxOworCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBtYXRjaCB0aGUgbWF0Y2hzdHJpbmcgZXhhY3RseSwKKwkgKiB3ZSBuZWVkIHRvIG1hdGNoIGJ5IGZubWF0Y2gKKwkgKi8KKwlpZiAoc3RybmNtcChtYXRjaCwgbmFtZSwgbWF0Y2hsZW4pKQorCQlyZXR1cm4gIWZubWF0Y2gobWF0Y2gsIG5hbWUsIDApOworCisJLyoKKwkgKiBJZiB3ZSBkaWQgbWF0Y2ggdGhlIHN0cmluZyBleGFjdGx5LCB3ZSBzdGlsbAorCSAqIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaGFwcGVuZWQgb24gYSBwYXRoCisJICogY29tcG9uZW50IGJvdW5kYXJ5IChpZSBlaXRoZXIgdGhlIGxhc3QgY2hhcmFjdGVyCisJICogb2YgdGhlIG1hdGNoIHdhcyAnLycsIG9yIHRoZSBuZXh0IGNoYXJhY3RlciBvZgorCSAqIHRoZSBuYW1lIHdhcyAnLycgb3IgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKwkgKi8KKwlyZXR1cm4JbWF0Y2hbbWF0Y2hsZW4tMV0gPT0gJy8nIHx8CisJCW5hbWVbbWF0Y2hsZW5dID09ICcvJyB8fAorCQkhbmFtZVttYXRjaGxlbl07Cit9CisKK2ludCBtYXRjaF9wYXRoc3BlYyhjb25zdCBjaGFyICoqcGF0aHNwZWMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBpbnQgcHJlZml4LCBjaGFyICpzZWVuKQoreworCWludCByZXR2YWw7CisJY29uc3QgY2hhciAqbWF0Y2g7CisKKwluYW1lICs9IHByZWZpeDsKKwluYW1lbGVuIC09IHByZWZpeDsKKworCWZvciAocmV0dmFsID0gMDsgKG1hdGNoID0gKnBhdGhzcGVjKyspICE9IE5VTEw7IHNlZW4rKykgeworCQlpZiAocmV0dmFsICYgKnNlZW4pCisJCQljb250aW51ZTsKKwkJbWF0Y2ggKz0gcHJlZml4OworCQlpZiAobWF0Y2hfb25lKG1hdGNoLCBuYW1lLCBuYW1lbGVuKSkgeworCQkJcmV0dmFsID0gMTsKKwkJCSpzZWVuID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCit2b2lkIGFkZF9leGNsdWRlKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqYmFzZSwKKwkJIGludCBiYXNlbGVuLCBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCkKK3sKKwlzdHJ1Y3QgZXhjbHVkZSAqeCA9IHhtYWxsb2Moc2l6ZW9mICgqeCkpOworCisJeC0+cGF0dGVybiA9IHN0cmluZzsKKwl4LT5iYXNlID0gYmFzZTsKKwl4LT5iYXNlbGVuID0gYmFzZWxlbjsKKwlpZiAod2hpY2gtPm5yID09IHdoaWNoLT5hbGxvYykgeworCQl3aGljaC0+YWxsb2MgPSBhbGxvY19ucih3aGljaC0+YWxsb2MpOworCQl3aGljaC0+ZXhjbHVkZXMgPSByZWFsbG9jKHdoaWNoLT5leGNsdWRlcywKKwkJCQkJICB3aGljaC0+YWxsb2MgKiBzaXplb2YoeCkpOworCX0KKwl3aGljaC0+ZXhjbHVkZXNbd2hpY2gtPm5yKytdID0geDsKK30KKworc3RhdGljIGludCBhZGRfZXhjbHVkZXNfZnJvbV9maWxlXzEoY29uc3QgY2hhciAqZm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJhc2UsCisJCQkJICAgIGludCBiYXNlbGVuLAorCQkJCSAgICBzdHJ1Y3QgZXhjbHVkZV9saXN0ICp3aGljaCkKK3sKKwlpbnQgZmQsIGk7CisJbG9uZyBzaXplOworCWNoYXIgKmJ1ZiwgKmVudHJ5OworCisJZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBlcnI7CisJc2l6ZSA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisJaWYgKHNpemUgPCAwKQorCQlnb3RvIGVycjsKKwlsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCWlmIChzaXplID09IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisJYnVmID0geG1hbGxvYyhzaXplKzEpOworCWlmIChyZWFkKGZkLCBidWYsIHNpemUpICE9IHNpemUpCisJCWdvdG8gZXJyOworCWNsb3NlKGZkKTsKKworCWJ1ZltzaXplKytdID0gJ1xuJzsKKwllbnRyeSA9IGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChidWZbaV0gPT0gJ1xuJykgeworCQkJaWYgKGVudHJ5ICE9IGJ1ZiArIGkgJiYgZW50cnlbMF0gIT0gJyMnKSB7CisJCQkJYnVmW2kgLSAoaSAmJiBidWZbaS0xXSA9PSAnXHInKV0gPSAwOworCQkJCWFkZF9leGNsdWRlKGVudHJ5LCBiYXNlLCBiYXNlbGVuLCB3aGljaCk7CisJCQl9CisJCQllbnRyeSA9IGJ1ZiArIGkgKyAxOworCQl9CisJfQorCXJldHVybiAwOworCisgZXJyOgorCWlmICgwIDw9IGZkKQorCQljbG9zZShmZCk7CisJcmV0dXJuIC0xOworfQorCit2b2lkIGFkZF9leGNsdWRlc19mcm9tX2ZpbGUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqZm5hbWUpCit7CisJaWYgKGFkZF9leGNsdWRlc19mcm9tX2ZpbGVfMShmbmFtZSwgIiIsIDAsCisJCQkJICAgICAmZGlyLT5leGNsdWRlX2xpc3RbRVhDX0ZJTEVdKSA8IDApCisJCWRpZSgiY2Fubm90IHVzZSAlcyBhcyBhbiBleGNsdWRlIGZpbGUiLCBmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcHVzaF9leGNsdWRlX3Blcl9kaXJlY3Rvcnkoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJY2hhciBleGNsdWRlX2ZpbGVbUEFUSF9NQVhdOworCXN0cnVjdCBleGNsdWRlX2xpc3QgKmVsID0gJmRpci0+ZXhjbHVkZV9saXN0W0VYQ19ESVJTXTsKKwlpbnQgY3VycmVudF9uciA9IGVsLT5ucjsKKworCWlmIChkaXItPmV4Y2x1ZGVfcGVyX2RpcikgeworCQltZW1jcHkoZXhjbHVkZV9maWxlLCBiYXNlLCBiYXNlbGVuKTsKKwkJc3RyY3B5KGV4Y2x1ZGVfZmlsZSArIGJhc2VsZW4sIGRpci0+ZXhjbHVkZV9wZXJfZGlyKTsKKwkJYWRkX2V4Y2x1ZGVzX2Zyb21fZmlsZV8xKGV4Y2x1ZGVfZmlsZSwgYmFzZSwgYmFzZWxlbiwgZWwpOworCX0KKwlyZXR1cm4gY3VycmVudF9ucjsKK30KKworc3RhdGljIHZvaWQgcG9wX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBpbnQgc3RrKQoreworCXN0cnVjdCBleGNsdWRlX2xpc3QgKmVsID0gJmRpci0+ZXhjbHVkZV9saXN0W0VYQ19ESVJTXTsKKworCXdoaWxlIChzdGsgPCBlbC0+bnIpCisJCWZyZWUoZWwtPmV4Y2x1ZGVzWy0tZWwtPm5yXSk7Cit9CisKKy8qIFNjYW4gdGhlIGxpc3QgYW5kIGxldCB0aGUgbGFzdCBtYXRjaCBkZXRlcm1pbmVzIHRoZSBmYXRlLgorICogUmV0dXJuIDEgZm9yIGV4Y2x1ZGUsIDAgZm9yIGluY2x1ZGUgYW5kIC0xIGZvciB1bmRlY2lkZWQuCisgKi8KK3N0YXRpYyBpbnQgZXhjbHVkZWRfMShjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJICAgICAgaW50IHBhdGhsZW4sCisJCSAgICAgIHN0cnVjdCBleGNsdWRlX2xpc3QgKmVsKQoreworCWludCBpOworCisJaWYgKGVsLT5ucikgeworCQlmb3IgKGkgPSBlbC0+bnIgLSAxOyAwIDw9IGk7IGktLSkgeworCQkJc3RydWN0IGV4Y2x1ZGUgKnggPSBlbC0+ZXhjbHVkZXNbaV07CisJCQljb25zdCBjaGFyICpleGNsdWRlID0geC0+cGF0dGVybjsKKwkJCWludCB0b19leGNsdWRlID0gMTsKKworCQkJaWYgKCpleGNsdWRlID09ICchJykgeworCQkJCXRvX2V4Y2x1ZGUgPSAwOworCQkJCWV4Y2x1ZGUrKzsKKwkJCX0KKworCQkJaWYgKCFzdHJjaHIoZXhjbHVkZSwgJy8nKSkgeworCQkJCS8qIG1hdGNoIGJhc2VuYW1lICovCisJCQkJY29uc3QgY2hhciAqYmFzZW5hbWUgPSBzdHJyY2hyKHBhdGhuYW1lLCAnLycpOworCQkJCWJhc2VuYW1lID0gKGJhc2VuYW1lKSA/IGJhc2VuYW1lKzEgOiBwYXRobmFtZTsKKwkJCQlpZiAoZm5tYXRjaChleGNsdWRlLCBiYXNlbmFtZSwgMCkgPT0gMCkKKwkJCQkJcmV0dXJuIHRvX2V4Y2x1ZGU7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBtYXRjaCB3aXRoIEZOTV9QQVRITkFNRToKKwkJCQkgKiBleGNsdWRlIGhhcyBiYXNlIChiYXNlbGVuIGxvbmcpIGltcGxpY2l0bHkKKwkJCQkgKiBpbiBmcm9udCBvZiBpdC4KKwkJCQkgKi8KKwkJCQlpbnQgYmFzZWxlbiA9IHgtPmJhc2VsZW47CisJCQkJaWYgKCpleGNsdWRlID09ICcvJykKKwkJCQkJZXhjbHVkZSsrOworCisJCQkJaWYgKHBhdGhsZW4gPCBiYXNlbGVuIHx8CisJCQkJICAgIChiYXNlbGVuICYmIHBhdGhuYW1lW2Jhc2VsZW4tMV0gIT0gJy8nKSB8fAorCQkJCSAgICBzdHJuY21wKHBhdGhuYW1lLCB4LT5iYXNlLCBiYXNlbGVuKSkKKwkJCQkgICAgY29udGludWU7CisKKwkJCQlpZiAoZm5tYXRjaChleGNsdWRlLCBwYXRobmFtZStiYXNlbGVuLAorCQkJCQkgICAgRk5NX1BBVEhOQU1FKSA9PSAwKQorCQkJCQlyZXR1cm4gdG9fZXhjbHVkZTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7IC8qIHVuZGVjaWRlZCAqLworfQorCitpbnQgZXhjbHVkZWQoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJaW50IHBhdGhsZW4gPSBzdHJsZW4ocGF0aG5hbWUpOworCWludCBzdDsKKworCWZvciAoc3QgPSBFWENfQ01ETDsgc3QgPD0gRVhDX0ZJTEU7IHN0KyspIHsKKwkJc3dpdGNoIChleGNsdWRlZF8xKHBhdGhuYW1lLCBwYXRobGVuLCAmZGlyLT5leGNsdWRlX2xpc3Rbc3RdKSkgeworCQljYXNlIDA6CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAxOgorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9uYW1lKHN0cnVjdCBkaXJfc3RydWN0ICpkaXIsIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgbGVuKQoreworCXN0cnVjdCBkaXJfZW50cnkgKmVudDsKKworCWlmIChjYWNoZV9uYW1lX3BvcyhwYXRobmFtZSwgbGVuKSA+PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZGlyLT5uciA9PSBkaXItPmFsbG9jKSB7CisJCWludCBhbGxvYyA9IGFsbG9jX25yKGRpci0+YWxsb2MpOworCQlkaXItPmFsbG9jID0gYWxsb2M7CisJCWRpci0+ZW50cmllcyA9IHhyZWFsbG9jKGRpci0+ZW50cmllcywgYWxsb2Mqc2l6ZW9mKGVudCkpOworCX0KKwllbnQgPSB4bWFsbG9jKHNpemVvZigqZW50KSArIGxlbiArIDEpOworCWVudC0+bGVuID0gbGVuOworCW1lbWNweShlbnQtPm5hbWUsIHBhdGhuYW1lLCBsZW4pOworCWVudC0+bmFtZVtsZW5dID0gMDsKKwlkaXItPmVudHJpZXNbZGlyLT5ucisrXSA9IGVudDsKK30KKworc3RhdGljIGludCBkaXJfZXhpc3RzKGNvbnN0IGNoYXIgKmRpcm5hbWUsIGludCBsZW4pCit7CisJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKGRpcm5hbWUsIGxlbik7CisJaWYgKHBvcyA+PSAwKQorCQlyZXR1cm4gMTsKKwlwb3MgPSAtcG9zLTE7CisJaWYgKHBvcyA+PSBhY3RpdmVfbnIpIC8qIGNhbid0ICovCisJCXJldHVybiAwOworCXJldHVybiAhc3RybmNtcChhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZSwgZGlybmFtZSwgbGVuKTsKK30KKworLyoKKyAqIFJlYWQgYSBkaXJlY3RvcnkgdHJlZS4gV2UgY3VycmVudGx5IGlnbm9yZSBhbnl0aGluZyBidXQKKyAqIGRpcmVjdG9yaWVzLCByZWd1bGFyIGZpbGVzIGFuZCBzeW1saW5rcy4gVGhhdCdzIGJlY2F1c2UgZ2l0CisgKiBkb2Vzbid0IGhhbmRsZSB0aGVtIGF0IGFsbCB5ZXQuIE1heWJlIHRoYXQgd2lsbCBjaGFuZ2Ugc29tZQorICogZGF5LgorICoKKyAqIEFsc28sIHdlIGlnbm9yZSB0aGUgbmFtZSAiLmdpdCIgKGV2ZW4gaWYgaXQgaXMgbm90IGEgZGlyZWN0b3J5KS4KKyAqIFRoYXQgbGlrZWx5IHdpbGwgbm90IGNoYW5nZS4KKyAqLworc3RhdGljIGludCByZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoc3RydWN0IGRpcl9zdHJ1Y3QgKmRpciwgY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4pCit7CisJRElSICpmZGlyID0gb3BlbmRpcihwYXRoKTsKKwlpbnQgY29udGVudHMgPSAwOworCisJaWYgKGZkaXIpIHsKKwkJaW50IGV4Y2x1ZGVfc3RrOworCQlzdHJ1Y3QgZGlyZW50ICpkZTsKKwkJY2hhciBmdWxsbmFtZVtNQVhQQVRITEVOICsgMV07CisJCW1lbWNweShmdWxsbmFtZSwgYmFzZSwgYmFzZWxlbik7CisKKwkJZXhjbHVkZV9zdGsgPSBwdXNoX2V4Y2x1ZGVfcGVyX2RpcmVjdG9yeShkaXIsIGJhc2UsIGJhc2VsZW4pOworCisJCXdoaWxlICgoZGUgPSByZWFkZGlyKGZkaXIpKSAhPSBOVUxMKSB7CisJCQlpbnQgbGVuOworCisJCQlpZiAoKGRlLT5kX25hbWVbMF0gPT0gJy4nKSAmJgorCQkJICAgIChkZS0+ZF9uYW1lWzFdID09IDAgfHwKKwkJCSAgICAgIXN0cmNtcChkZS0+ZF9uYW1lICsgMSwgIi4iKSB8fAorCQkJICAgICAhc3RyY21wKGRlLT5kX25hbWUgKyAxLCAiZ2l0IikpKQorCQkJCWNvbnRpbnVlOworCQkJbGVuID0gc3RybGVuKGRlLT5kX25hbWUpOworCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiwgZGUtPmRfbmFtZSwgbGVuKzEpOworCQkJaWYgKGV4Y2x1ZGVkKGRpciwgZnVsbG5hbWUpICE9IGRpci0+c2hvd19pZ25vcmVkKSB7CisJCQkJaWYgKCFkaXItPnNob3dfaWdub3JlZCB8fCBEVFlQRShkZSkgIT0gRFRfRElSKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJc3dpdGNoIChEVFlQRShkZSkpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IHN1YmRpciwgcmV3aW5kX2Jhc2U7CisJCQlkZWZhdWx0OgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBEVF9VTktOT1dOOgorCQkJCWlmIChsc3RhdChmdWxsbmFtZSwgJnN0KSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKFNfSVNSRUcoc3Quc3RfbW9kZSkgfHwgU19JU0xOSyhzdC5zdF9tb2RlKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSBEVF9ESVI6CisJCQkJbWVtY3B5KGZ1bGxuYW1lICsgYmFzZWxlbiArIGxlbiwgIi8iLCAyKTsKKwkJCQlsZW4rKzsKKwkJCQlyZXdpbmRfYmFzZSA9IGRpci0+bnI7CisJCQkJc3ViZGlyID0gcmVhZF9kaXJlY3RvcnlfcmVjdXJzaXZlKGRpciwgZnVsbG5hbWUsIGZ1bGxuYW1lLAorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsZW4gKyBsZW4pOworCQkJCWlmIChkaXItPnNob3dfb3RoZXJfZGlyZWN0b3JpZXMgJiYKKwkJCQkgICAgKHN1YmRpciB8fCAhZGlyLT5oaWRlX2VtcHR5X2RpcmVjdG9yaWVzKSAmJgorCQkJCSAgICAhZGlyX2V4aXN0cyhmdWxsbmFtZSwgYmFzZWxlbiArIGxlbikpIHsKKwkJCQkJLyogUmV3aW5kIHRoZSByZWFkIHN1YmRpcmVjdG9yeSAqLworCQkJCQl3aGlsZSAoZGlyLT5uciA+IHJld2luZF9iYXNlKQorCQkJCQkJZnJlZShkaXItPmVudHJpZXNbLS1kaXItPm5yXSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb250ZW50cyArPSBzdWJkaXI7CisJCQkJY29udGludWU7CisJCQljYXNlIERUX1JFRzoKKwkJCWNhc2UgRFRfTE5LOgorCQkJCWJyZWFrOworCQkJfQorCQkJYWRkX25hbWUoZGlyLCBmdWxsbmFtZSwgYmFzZWxlbiArIGxlbik7CisJCQljb250ZW50cysrOworCQl9CisJCWNsb3NlZGlyKGZkaXIpOworCisJCXBvcF9leGNsdWRlX3Blcl9kaXJlY3RvcnkoZGlyLCBleGNsdWRlX3N0ayk7CisJfQorCisJcmV0dXJuIGNvbnRlbnRzOworfQorCitzdGF0aWMgaW50IGNtcF9uYW1lKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgZGlyX2VudHJ5ICplMSA9ICooY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqKilwMTsKKwljb25zdCBzdHJ1Y3QgZGlyX2VudHJ5ICplMiA9ICooY29uc3Qgc3RydWN0IGRpcl9lbnRyeSAqKilwMjsKKworCXJldHVybiBjYWNoZV9uYW1lX2NvbXBhcmUoZTEtPm5hbWUsIGUxLT5sZW4sCisJCQkJICBlMi0+bmFtZSwgZTItPmxlbik7Cit9CisKK2ludCByZWFkX2RpcmVjdG9yeShzdHJ1Y3QgZGlyX3N0cnVjdCAqZGlyLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbikKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSB0byBkbyB0aGUgcGVyLWRpcmVjdG9yeSBleGNsdWRlIGZvciBhbGwgdGhlCisJICogZGlyZWN0b3JpZXMgbGVhZGluZyB1cCB0byBvdXIgYmFzZS4KKwkgKi8KKwlpZiAoYmFzZWxlbikgeworCQlpZiAoZGlyLT5leGNsdWRlX3Blcl9kaXIpIHsKKwkJCWNoYXIgKnAsICpwcCA9IHhtYWxsb2MoYmFzZWxlbisxKTsKKwkJCW1lbWNweShwcCwgYmFzZSwgYmFzZWxlbisxKTsKKwkJCXAgPSBwcDsKKwkJCXdoaWxlICgxKSB7CisJCQkJY2hhciBzYXZlID0gKnA7CisJCQkJKnAgPSAwOworCQkJCXB1c2hfZXhjbHVkZV9wZXJfZGlyZWN0b3J5KGRpciwgcHAsIHAtcHApOworCQkJCSpwKysgPSBzYXZlOworCQkJCWlmICghc2F2ZSkKKwkJCQkJYnJlYWs7CisJCQkJcCA9IHN0cmNocihwLCAnLycpOworCQkJCWlmIChwKQorCQkJCQlwKys7CisJCQkJZWxzZQorCQkJCQlwID0gcHAgKyBiYXNlbGVuOworCQkJfQorCQkJZnJlZShwcCk7CisJCX0KKwl9CisKKwlyZWFkX2RpcmVjdG9yeV9yZWN1cnNpdmUoZGlyLCBwYXRoLCBiYXNlLCBiYXNlbGVuKTsKKwlxc29ydChkaXItPmVudHJpZXMsIGRpci0+bnIsIHNpemVvZihzdHJ1Y3QgZGlyX2VudHJ5ICopLCBjbXBfbmFtZSk7CisJcmV0dXJuIGRpci0+bnI7Cit9CmRpZmYgLS1naXQgYS9kaXIuaCBiL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTFiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kaXIuaApAQCAtMCwwICsxLDUxIEBACisjaWZuZGVmIERJUl9ICisjZGVmaW5lIERJUl9ICisKKy8qCisgKiBXZSBtYWludGFpbiB0aHJlZSBleGNsdWRlIHBhdHRlcm4gbGlzdHM6CisgKiBFWENfQ01ETCBsaXN0cyBwYXR0ZXJucyBleHBsaWNpdGx5IGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgKiBFWENfRElSUyBsaXN0cyBwYXR0ZXJucyBvYnRhaW5lZCBmcm9tIHBlci1kaXJlY3RvcnkgaWdub3JlIGZpbGVzLgorICogRVhDX0ZJTEUgbGlzdHMgcGF0dGVybnMgZnJvbSBmYWxsYmFjayBpZ25vcmUgZmlsZXMuCisgKi8KKyNkZWZpbmUgRVhDX0NNREwgMAorI2RlZmluZSBFWENfRElSUyAxCisjZGVmaW5lIEVYQ19GSUxFIDIKKworCitzdHJ1Y3QgZGlyX2VudHJ5IHsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RydWN0IGV4Y2x1ZGVfbGlzdCB7CisJaW50IG5yOworCWludCBhbGxvYzsKKwlzdHJ1Y3QgZXhjbHVkZSB7CisJCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJCWNvbnN0IGNoYXIgKmJhc2U7CisJCWludCBiYXNlbGVuOworCX0gKipleGNsdWRlczsKK307CisKK3N0cnVjdCBkaXJfc3RydWN0IHsKKwlpbnQgbnIsIGFsbG9jOworCXVuc2lnbmVkIGludCBzaG93X2lnbm9yZWQ6MSwKKwkJICAgICBzaG93X290aGVyX2RpcmVjdG9yaWVzOjEsCisJCSAgICAgaGlkZV9lbXB0eV9kaXJlY3RvcmllczoxOworCXN0cnVjdCBkaXJfZW50cnkgKiplbnRyaWVzOworCisJLyogRXhjbHVkZSBpbmZvICovCisJY29uc3QgY2hhciAqZXhjbHVkZV9wZXJfZGlyOworCXN0cnVjdCBleGNsdWRlX2xpc3QgZXhjbHVkZV9saXN0WzNdOworfTsKKworZXh0ZXJuIGludCBjb21tb25fcHJlZml4KGNvbnN0IGNoYXIgKipwYXRoc3BlYyk7CitleHRlcm4gaW50IG1hdGNoX3BhdGhzcGVjKGNvbnN0IGNoYXIgKipwYXRoc3BlYywgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGludCBwcmVmaXgsIGNoYXIgKnNlZW4pOworCitleHRlcm4gaW50IHJlYWRfZGlyZWN0b3J5KHN0cnVjdCBkaXJfc3RydWN0ICosIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmJhc2UsIGludCBiYXNlbGVuKTsKK2V4dGVybiBpbnQgZXhjbHVkZWQoc3RydWN0IGRpcl9zdHJ1Y3QgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIGFkZF9leGNsdWRlc19mcm9tX2ZpbGUoc3RydWN0IGRpcl9zdHJ1Y3QgKiwgY29uc3QgY2hhciAqZm5hbWUpOworZXh0ZXJuIHZvaWQgYWRkX2V4Y2x1ZGUoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpiYXNlLAorCQkJaW50IGJhc2VsZW4sIHN0cnVjdCBleGNsdWRlX2xpc3QgKndoaWNoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kdW1wLWNhY2hlLXRyZWUuYyBiL2R1bXAtY2FjaGUtdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2FmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9kdW1wLWNhY2hlLXRyZWUuYwpAQCAtMCwwICsxLDY0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorCisKK3N0YXRpYyB2b2lkIGR1bXBfb25lKHN0cnVjdCBjYWNoZV90cmVlICppdCwgY29uc3QgY2hhciAqcGZ4LCBjb25zdCBjaGFyICp4KQoreworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwKQorCQlwcmludGYoIiUtNDBzICVzJXMgKCVkIHN1YnRyZWVzKVxuIiwKKwkJICAgICAgICJpbnZhbGlkIiwgeCwgcGZ4LCBpdC0+c3VidHJlZV9ucik7CisJZWxzZQorCQlwcmludGYoIiVzICVzJXMgKCVkIGVudHJpZXMsICVkIHN1YnRyZWVzKVxuIiwKKwkJICAgICAgIHNoYTFfdG9faGV4KGl0LT5zaGExKSwgeCwgcGZ4LAorCQkgICAgICAgaXQtPmVudHJ5X2NvdW50LCBpdC0+c3VidHJlZV9ucik7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCwKKwkJCSAgIHN0cnVjdCBjYWNoZV90cmVlICpyZWYsCisJCQkgICBjb25zdCBjaGFyICpwZngpCit7CisJaW50IGk7CisJaW50IGVycnMgPSAwOworCisJaWYgKCFpdCB8fCAhcmVmKQorCQkvKiBtaXNzaW5nIGluIGVpdGhlciAqLworCQlyZXR1cm4gMDsKKworCWlmIChpdC0+ZW50cnlfY291bnQgPCAwKSB7CisJCWR1bXBfb25lKGl0LCBwZngsICIiKTsKKwkJZHVtcF9vbmUocmVmLCBwZngsICIjKHJlZikgIik7CisJCWlmIChpdC0+c3VidHJlZV9uciAhPSByZWYtPnN1YnRyZWVfbnIpCisJCQllcnJzID0gMTsKKwl9CisJZWxzZSB7CisJCWR1bXBfb25lKGl0LCBwZngsICIiKTsKKwkJaWYgKG1lbWNtcChpdC0+c2hhMSwgcmVmLT5zaGExLCAyMCkgfHwKKwkJICAgIHJlZi0+ZW50cnlfY291bnQgIT0gaXQtPmVudHJ5X2NvdW50IHx8CisJCSAgICByZWYtPnN1YnRyZWVfbnIgIT0gaXQtPnN1YnRyZWVfbnIpIHsKKwkJCWR1bXBfb25lKHJlZiwgcGZ4LCAiIyhyZWYpICIpOworCQkJZXJycyA9IDE7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykgeworCQljaGFyIHBhdGhbUEFUSF9NQVhdOworCQlzdHJ1Y3QgY2FjaGVfdHJlZV9zdWIgKmRvd24gPSBpdC0+ZG93bltpXTsKKwkJc3RydWN0IGNhY2hlX3RyZWVfc3ViICpyZHduOworCisJCXJkd24gPSBjYWNoZV90cmVlX3N1YihyZWYsIGRvd24tPm5hbWUpOworCQlzcHJpbnRmKHBhdGgsICIlcyUuKnMvIiwgcGZ4LCBkb3duLT5uYW1lbGVuLCBkb3duLT5uYW1lKTsKKwkJaWYgKGR1bXBfY2FjaGVfdHJlZShkb3duLT5jYWNoZV90cmVlLCByZHduLT5jYWNoZV90cmVlLCBwYXRoKSkKKwkJCWVycnMgPSAxOworCX0KKwlyZXR1cm4gZXJyczsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJc3RydWN0IGNhY2hlX3RyZWUgKmFub3RoZXIgPSBjYWNoZV90cmVlKCk7CisJaWYgKHJlYWRfY2FjaGUoKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgaW5kZXggZmlsZSIpOworCWNhY2hlX3RyZWVfdXBkYXRlKGFub3RoZXIsIGFjdGl2ZV9jYWNoZSwgYWN0aXZlX25yLCAwLCAxKTsKKwlyZXR1cm4gZHVtcF9jYWNoZV90cmVlKGFjdGl2ZV9jYWNoZV90cmVlLCBhbm90aGVyLCAiIik7Cit9CmRpZmYgLS1naXQgYS9lbnRyeS5jIGIvZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM3MjRmCi0tLSAvZGV2L251bGwKKysrIGIvZW50cnkuYwpAQCAtMCwwICsxLDE3NiBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgdm9pZCBjcmVhdGVfZGlyZWN0b3JpZXMoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGNoZWNrb3V0ICpzdGF0ZSkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MobGVuICsgMSk7CisJY29uc3QgY2hhciAqc2xhc2ggPSBwYXRoOworCisJd2hpbGUgKChzbGFzaCA9IHN0cmNocihzbGFzaCsxLCAnLycpKSAhPSBOVUxMKSB7CisJCWxlbiA9IHNsYXNoIC0gcGF0aDsKKwkJbWVtY3B5KGJ1ZiwgcGF0aCwgbGVuKTsKKwkJYnVmW2xlbl0gPSAwOworCQlpZiAobWtkaXIoYnVmLCAwNzc3KSkgeworCQkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJCXN0cnVjdCBzdGF0IHN0OworCQkJCWlmIChsZW4gPiBzdGF0ZS0+YmFzZV9kaXJfbGVuICYmIHN0YXRlLT5mb3JjZSAmJiAhdW5saW5rKGJ1ZikgJiYgIW1rZGlyKGJ1ZiwgMDc3NykpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICghc3RhdChidWYsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCQkJY29udGludWU7IC8qIG9rICovCisJCQl9CisJCQlkaWUoImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0ICVzIiwgYnVmKTsKKwkJfQorCX0KKwlmcmVlKGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9zdWJ0cmVlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCWNoYXIgcGF0aGJ1ZltQQVRIX01BWF07CisJY2hhciAqbmFtZTsKKwkKKwlpZiAoIWRpcikKKwkJZGllKCJjYW5ub3Qgb3BlbmRpciAlcyIsIHBhdGgpOworCXN0cmNweShwYXRoYnVmLCBwYXRoKTsKKwluYW1lID0gcGF0aGJ1ZiArIHN0cmxlbihwYXRoKTsKKwkqbmFtZSsrID0gJy8nOworCXdoaWxlICgoZGUgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWlmICgoZGUtPmRfbmFtZVswXSA9PSAnLicpICYmCisJCSAgICAoKGRlLT5kX25hbWVbMV0gPT0gMCkgfHwKKwkJICAgICAoKGRlLT5kX25hbWVbMV0gPT0gJy4nKSAmJiBkZS0+ZF9uYW1lWzJdID09IDApKSkKKwkJCWNvbnRpbnVlOworCQlzdHJjcHkobmFtZSwgZGUtPmRfbmFtZSk7CisJCWlmIChsc3RhdChwYXRoYnVmLCAmc3QpKQorCQkJZGllKCJjYW5ub3QgbHN0YXQgJXMiLCBwYXRoYnVmKTsKKwkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQlyZW1vdmVfc3VidHJlZShwYXRoYnVmKTsKKwkJZWxzZSBpZiAodW5saW5rKHBhdGhidWYpKQorCQkJZGllKCJjYW5ub3QgdW5saW5rICVzIiwgcGF0aGJ1Zik7CisJfQorCWNsb3NlZGlyKGRpcik7CisJaWYgKHJtZGlyKHBhdGgpKQorCQlkaWUoImNhbm5vdCBybWRpciAlcyIsIHBhdGgpOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBtb2RlKQoreworCW1vZGUgPSAobW9kZSAmIDAxMDApID8gMDc3NyA6IDA2NjY7CisJcmV0dXJuIG9wZW4ocGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCBtb2RlKTsKK30KKworc3RhdGljIGludCB3cml0ZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjaGFyICpwYXRoLCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBpbnQgdG9fdGVtcGZpbGUpCit7CisJaW50IGZkOworCXZvaWQgKm5ldzsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJbG9uZyB3cm90ZTsKKwljaGFyIHR5cGVbMjBdOworCisJbmV3ID0gcmVhZF9zaGExX2ZpbGUoY2UtPnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIW5ldyB8fCBzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkgeworCQlpZiAobmV3KQorCQkJZnJlZShuZXcpOworCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHJlYWQgc2hhMSBmaWxlIG9mICVzICglcykiLAorCQkJcGF0aCwgc2hhMV90b19oZXgoY2UtPnNoYTEpKTsKKwl9CisJc3dpdGNoIChudG9obChjZS0+Y2VfbW9kZSkgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJCWlmICh0b190ZW1wZmlsZSkgeworCQkJc3RyY3B5KHBhdGgsICIubWVyZ2VfZmlsZV9YWFhYWFgiKTsKKwkJCWZkID0gbWtzdGVtcChwYXRoKTsKKwkJfSBlbHNlCisJCQlmZCA9IGNyZWF0ZV9maWxlKHBhdGgsIG50b2hsKGNlLT5jZV9tb2RlKSk7CisJCWlmIChmZCA8IDApIHsKKwkJCWZyZWUobmV3KTsKKwkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlIGZpbGUgJXMgKCVzKSIsCisJCQkJcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQl3cm90ZSA9IHdyaXRlKGZkLCBuZXcsIHNpemUpOworCQljbG9zZShmZCk7CisJCWZyZWUobmV3KTsKKwkJaWYgKHdyb3RlICE9IHNpemUpCisJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHdyaXRlIGZpbGUgJXMiLCBwYXRoKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQlpZiAodG9fdGVtcGZpbGUpIHsKKwkJCXN0cmNweShwYXRoLCAiLm1lcmdlX2xpbmtfWFhYWFhYIik7CisJCQlmZCA9IG1rc3RlbXAocGF0aCk7CisJCQlpZiAoZmQgPCAwKSB7CisJCQkJZnJlZShuZXcpOworCQkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlICIKKwkJCQkJCSAiZmlsZSAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCXdyb3RlID0gd3JpdGUoZmQsIG5ldywgc2l6ZSk7CisJCQljbG9zZShmZCk7CisJCQlmcmVlKG5ldyk7CisJCQlpZiAod3JvdGUgIT0gc2l6ZSkKKwkJCQlyZXR1cm4gZXJyb3IoImdpdC1jaGVja291dC1pbmRleDogdW5hYmxlIHRvIHdyaXRlIGZpbGUgJXMiLAorCQkJCQlwYXRoKTsKKwkJfSBlbHNlIHsKKwkJCXdyb3RlID0gc3ltbGluayhuZXcsIHBhdGgpOworCQkJZnJlZShuZXcpOworCQkJaWYgKHdyb3RlKQorCQkJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmFibGUgdG8gY3JlYXRlICIKKwkJCQkJCSAic3ltbGluayAlcyAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcmVlKG5ldyk7CisJCXJldHVybiBlcnJvcigiZ2l0LWNoZWNrb3V0LWluZGV4OiB1bmtub3duIGZpbGUgbW9kZSBmb3IgJXMiLCBwYXRoKTsKKwl9CisKKwlpZiAoc3RhdGUtPnJlZnJlc2hfY2FjaGUpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWxzdGF0KGNlLT5uYW1lLCAmc3QpOworCQlmaWxsX3N0YXRfY2FjaGVfaW5mbyhjZSwgJnN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja291dF9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3QgY2hlY2tvdXQgKnN0YXRlLCBjaGFyICp0b3BhdGgpCit7CisJc3RhdGljIGNoYXIgcGF0aFtNQVhQQVRITEVOKzFdOworCXN0cnVjdCBzdGF0IHN0OworCWludCBsZW4gPSBzdGF0ZS0+YmFzZV9kaXJfbGVuOworCisJaWYgKHRvcGF0aCkKKwkJcmV0dXJuIHdyaXRlX2VudHJ5KGNlLCB0b3BhdGgsIHN0YXRlLCAxKTsKKworCW1lbWNweShwYXRoLCBzdGF0ZS0+YmFzZV9kaXIsIGxlbik7CisJc3RyY3B5KHBhdGggKyBsZW4sIGNlLT5uYW1lKTsKKworCWlmICghbHN0YXQocGF0aCwgJnN0KSkgeworCQl1bnNpZ25lZCBjaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgJnN0LCAxKTsKKwkJaWYgKCFjaGFuZ2VkKQorCQkJcmV0dXJuIDA7CisJCWlmICghc3RhdGUtPmZvcmNlKSB7CisJCQlpZiAoIXN0YXRlLT5xdWlldCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1jaGVja291dC1pbmRleDogJXMgYWxyZWFkeSBleGlzdHNcbiIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogV2UgdW5saW5rIHRoZSBvbGQgZmlsZSwgdG8gZ2V0IHRoZSBuZXcgb25lIHdpdGggdGhlCisJCSAqIHJpZ2h0IHBlcm1pc3Npb25zIChpbmNsdWRpbmcgdW1hc2ssIHdoaWNoIGlzIG5hc3R5CisJCSAqIHRvIGVtdWxhdGUgYnkgaGFuZCAtIG11Y2ggZWFzaWVyIHRvIGxldCB0aGUgc3lzdGVtCisJCSAqIGp1c3QgZG8gdGhlIHJpZ2h0IHRoaW5nKQorCQkgKi8KKwkJdW5saW5rKHBhdGgpOworCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJaWYgKCFzdGF0ZS0+Zm9yY2UpCisJCQkJcmV0dXJuIGVycm9yKCIlcyBpcyBhIGRpcmVjdG9yeSIsIHBhdGgpOworCQkJcmVtb3ZlX3N1YnRyZWUocGF0aCk7CisJCX0KKwl9IGVsc2UgaWYgKHN0YXRlLT5ub3RfbmV3KQorCQlyZXR1cm4gMDsKKwljcmVhdGVfZGlyZWN0b3JpZXMocGF0aCwgc3RhdGUpOworCXJldHVybiB3cml0ZV9lbnRyeShjZSwgcGF0aCwgc3RhdGUsIDApOworfQorCisKZGlmZiAtLWdpdCBhL2Vudmlyb25tZW50LmMgYi9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTYyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9lbnZpcm9ubWVudC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBXZSBwdXQgYWxsIHRoZSBnaXQgY29uZmlnIHZhcmlhYmxlcyBpbiB0aGlzIHNhbWUgb2JqZWN0CisgKiBmaWxlLCBzbyB0aGF0IHByb2dyYW1zIGNhbiBsaW5rIGFnYWluc3QgdGhlIGNvbmZpZyBwYXJzZXIKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIGxpbmsgYWdhaW5zdCBhbGwgdGhlIHJlc3Qgb2YgZ2l0LgorICoKKyAqIEluIHBhcnRpY3VsYXIsIG5vIG5lZWQgdG8gYnJpbmcgaW4gbGlieiBldGMgdW5sZXNzIG5lZWRlZCwKKyAqIGV2ZW4gaWYgeW91IG1pZ2h0IHdhbnQgdG8ga25vdyB3aGVyZSB0aGUgZ2l0IGRpcmVjdG9yeSBldGMKKyAqIGFyZS4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2NoYXIgZ2l0X2RlZmF1bHRfZW1haWxbTUFYX0dJVE5BTUVdOworY2hhciBnaXRfZGVmYXVsdF9uYW1lW01BWF9HSVROQU1FXTsKK2ludCB1c2VfbGVnYWN5X2hlYWRlcnMgPSAxOworaW50IHRydXN0X2V4ZWN1dGFibGVfYml0ID0gMTsKK2ludCBhc3N1bWVfdW5jaGFuZ2VkID0gMDsKK2ludCBwcmVmZXJfc3ltbGlua19yZWZzID0gMDsKK2ludCBsb2dfYWxsX3JlZl91cGRhdGVzID0gMDsKK2ludCB3YXJuX2FtYmlndW91c19yZWZzID0gMTsKK2ludCByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uID0gMDsKK2NoYXIgZ2l0X2NvbW1pdF9lbmNvZGluZ1tNQVhfRU5DT0RJTkdfTEVOR1RIXSA9ICJ1dGYtOCI7CitpbnQgc2hhcmVkX3JlcG9zaXRvcnkgPSBQRVJNX1VNQVNLOworY29uc3QgY2hhciAqYXBwbHlfZGVmYXVsdF93aGl0ZXNwYWNlID0gTlVMTDsKK2ludCB6bGliX2NvbXByZXNzaW9uX2xldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworaW50IHBhZ2VyX2luX3VzZTsKK2ludCBwYWdlcl91c2VfY29sb3IgPSAxOworCitzdGF0aWMgY2hhciAqZ2l0X2RpciwgKmdpdF9vYmplY3RfZGlyLCAqZ2l0X2luZGV4X2ZpbGUsICpnaXRfcmVmc19kaXIsCisJKmdpdF9ncmFmdF9maWxlOworc3RhdGljIHZvaWQgc2V0dXBfZ2l0X2Vudih2b2lkKQoreworCWdpdF9kaXIgPSBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZGlyKQorCQlnaXRfZGlyID0gREVGQVVMVF9HSVRfRElSX0VOVklST05NRU5UOworCWdpdF9vYmplY3RfZGlyID0gZ2V0ZW52KERCX0VOVklST05NRU5UKTsKKwlpZiAoIWdpdF9vYmplY3RfZGlyKSB7CisJCWdpdF9vYmplY3RfZGlyID0geG1hbGxvYyhzdHJsZW4oZ2l0X2RpcikgKyA5KTsKKwkJc3ByaW50ZihnaXRfb2JqZWN0X2RpciwgIiVzL29iamVjdHMiLCBnaXRfZGlyKTsKKwl9CisJZ2l0X3JlZnNfZGlyID0geG1hbGxvYyhzdHJsZW4oZ2l0X2RpcikgKyA2KTsKKwlzcHJpbnRmKGdpdF9yZWZzX2RpciwgIiVzL3JlZnMiLCBnaXRfZGlyKTsKKwlnaXRfaW5kZXhfZmlsZSA9IGdldGVudihJTkRFWF9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfaW5kZXhfZmlsZSkgeworCQlnaXRfaW5kZXhfZmlsZSA9IHhtYWxsb2Moc3RybGVuKGdpdF9kaXIpICsgNyk7CisJCXNwcmludGYoZ2l0X2luZGV4X2ZpbGUsICIlcy9pbmRleCIsIGdpdF9kaXIpOworCX0KKwlnaXRfZ3JhZnRfZmlsZSA9IGdldGVudihHUkFGVF9FTlZJUk9OTUVOVCk7CisJaWYgKCFnaXRfZ3JhZnRfZmlsZSkKKwkJZ2l0X2dyYWZ0X2ZpbGUgPSBzdHJkdXAoZ2l0X3BhdGgoImluZm8vZ3JhZnRzIikpOworfQorCitjaGFyICpnZXRfZ2l0X2Rpcih2b2lkKQoreworCWlmICghZ2l0X2RpcikKKwkJc2V0dXBfZ2l0X2VudigpOworCXJldHVybiBnaXRfZGlyOworfQorCitjaGFyICpnZXRfb2JqZWN0X2RpcmVjdG9yeSh2b2lkKQoreworCWlmICghZ2l0X29iamVjdF9kaXIpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X29iamVjdF9kaXI7Cit9CisKK2NoYXIgKmdldF9yZWZzX2RpcmVjdG9yeSh2b2lkKQoreworCWlmICghZ2l0X3JlZnNfZGlyKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9yZWZzX2RpcjsKK30KKworY2hhciAqZ2V0X2luZGV4X2ZpbGUodm9pZCkKK3sKKwlpZiAoIWdpdF9pbmRleF9maWxlKQorCQlzZXR1cF9naXRfZW52KCk7CisJcmV0dXJuIGdpdF9pbmRleF9maWxlOworfQorCitjaGFyICpnZXRfZ3JhZnRfZmlsZSh2b2lkKQoreworCWlmICghZ2l0X2dyYWZ0X2ZpbGUpCisJCXNldHVwX2dpdF9lbnYoKTsKKwlyZXR1cm4gZ2l0X2dyYWZ0X2ZpbGU7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZXhlY19jbWQuYyBiL2V4ZWNfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmNTFmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4ZWNfY21kLmMKQEAgLTAsMCArMSwxNDkgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKyNkZWZpbmUgTUFYX0FSR1MJMzIKKworZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworc3RhdGljIGNvbnN0IGNoYXIgKmJ1aWx0aW5fZXhlY19wYXRoID0gR0lUX0VYRUNfUEFUSDsKK3N0YXRpYyBjb25zdCBjaGFyICpjdXJyZW50X2V4ZWNfcGF0aCA9IE5VTEw7CisKK3ZvaWQgZ2l0X3NldF9leGVjX3BhdGgoY29uc3QgY2hhciAqZXhlY19wYXRoKQoreworCWN1cnJlbnRfZXhlY19wYXRoID0gZXhlY19wYXRoOworfQorCisKKy8qIFJldHVybnMgdGhlIGhpZ2hlc3QtcHJpb3JpdHksIGxvY2F0aW9uIHRvIGxvb2sgZm9yIGdpdCBwcm9ncmFtcy4gKi8KK2NvbnN0IGNoYXIgKmdpdF9leGVjX3BhdGgodm9pZCkKK3sKKwljb25zdCBjaGFyICplbnY7CisKKwlpZiAoY3VycmVudF9leGVjX3BhdGgpCisJCXJldHVybiBjdXJyZW50X2V4ZWNfcGF0aDsKKworCWVudiA9IGdldGVudigiR0lUX0VYRUNfUEFUSCIpOworCWlmIChlbnYgJiYgKmVudikgeworCQlyZXR1cm4gZW52OworCX0KKworCXJldHVybiBidWlsdGluX2V4ZWNfcGF0aDsKK30KKworCitpbnQgZXhlY3ZfZ2l0X2NtZChjb25zdCBjaGFyICoqYXJndikKK3sKKwljaGFyIGdpdF9jb21tYW5kW1BBVEhfTUFYICsgMV07CisJaW50IGk7CisJY29uc3QgY2hhciAqcGF0aHNbXSA9IHsgY3VycmVudF9leGVjX3BhdGgsCisJCQkJZ2V0ZW52KCJHSVRfRVhFQ19QQVRIIiksCisJCQkJYnVpbHRpbl9leGVjX3BhdGggfTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhdGhzKTsgKytpKSB7CisJCXNpemVfdCBsZW47CisJCWludCByYzsKKwkJY29uc3QgY2hhciAqZXhlY19kaXIgPSBwYXRoc1tpXTsKKwkJY29uc3QgY2hhciAqdG1wOworCisJCWlmICghZXhlY19kaXIgfHwgISpleGVjX2RpcikgY29udGludWU7CisKKwkJaWYgKCpleGVjX2RpciAhPSAnLycpIHsKKwkJCWlmICghZ2V0Y3dkKGdpdF9jb21tYW5kLCBzaXplb2YoZ2l0X2NvbW1hbmQpKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBjYW5ub3QgZGV0ZXJtaW5lICIKKwkJCQkJImN1cnJlbnQgZGlyZWN0b3J5OiAlc1xuIiwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWxlbiA9IHN0cmxlbihnaXRfY29tbWFuZCk7CisKKwkJCS8qIFRyaXZpYWwgY2xlYW51cCAqLworCQkJd2hpbGUgKCFzdHJuY21wKGV4ZWNfZGlyLCAiLi8iLCAyKSkgeworCQkJCWV4ZWNfZGlyICs9IDI7CisJCQkJd2hpbGUgKCpleGVjX2RpciA9PSAnLycpCisJCQkJCWV4ZWNfZGlyKys7CisJCQl9CisKKwkJCXJjID0gc25wcmludGYoZ2l0X2NvbW1hbmQgKyBsZW4sCisJCQkJICAgICAgc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbiwgIi8lcyIsCisJCQkJICAgICAgZXhlY19kaXIpOworCQkJaWYgKHJjIDwgMCB8fCByYyA+PSBzaXplb2YoZ2l0X2NvbW1hbmQpIC0gbGVuKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJnaXQ6IGNvbW1hbmQgbmFtZSBnaXZlbiAiCisJCQkJCSJpcyB0b28gbG9uZy5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0cmxlbihleGVjX2RpcikgKyAxID4gc2l6ZW9mKGdpdF9jb21tYW5kKSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0OiBjb21tYW5kIG5hbWUgZ2l2ZW4gIgorCQkJCQkiaXMgdG9vIGxvbmcuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0cmNweShnaXRfY29tbWFuZCwgZXhlY19kaXIpOworCQl9CisKKwkJbGVuID0gc3RybGVuKGdpdF9jb21tYW5kKTsKKwkJcmMgPSBzbnByaW50ZihnaXRfY29tbWFuZCArIGxlbiwgc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbiwKKwkJCSAgICAgICIvZ2l0LSVzIiwgYXJndlswXSk7CisJCWlmIChyYyA8IDAgfHwgcmMgPj0gc2l6ZW9mKGdpdF9jb21tYW5kKSAtIGxlbikgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJImdpdDogY29tbWFuZCBuYW1lIGdpdmVuIGlzIHRvbyBsb25nLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGFyZ3ZbMF0gbXVzdCBiZSB0aGUgZ2l0IGNvbW1hbmQsIGJ1dCB0aGUgYXJndiBhcnJheQorCQkgKiBiZWxvbmdzIHRvIHRoZSBjYWxsZXIsIGFuZCBteSBiZSByZXVzZWQgaW4KKwkJICogc3Vic2VxdWVudCBsb29wIGl0ZXJhdGlvbnMuIFNhdmUgYXJndlswXSBhbmQKKwkJICogcmVzdG9yZSBpdCBvbiBlcnJvci4KKwkJICovCisKKwkJdG1wID0gYXJndlswXTsKKwkJYXJndlswXSA9IGdpdF9jb21tYW5kOworCisJCWlmIChnZXRlbnYoIkdJVF9UUkFDRSIpKSB7CisJCQljb25zdCBjaGFyICoqcCA9IGFyZ3Y7CisJCQlmcHV0cygidHJhY2U6IGV4ZWM6Iiwgc3RkZXJyKTsKKwkJCXdoaWxlICgqcCkgeworCQkJCWZwdXRjKCcgJywgc3RkZXJyKTsKKwkJCQlzcV9xdW90ZV9wcmludChzdGRlcnIsICpwKTsKKwkJCQkrK3A7CisJCQl9CisJCQlwdXRjKCdcbicsIHN0ZGVycik7CisJCQlmZmx1c2goc3RkZXJyKTsKKwkJfQorCisJCS8qIGV4ZWN2ZSgpIGNhbiBvbmx5IGV2ZXIgcmV0dXJuIGlmIGl0IGZhaWxzICovCisJCWV4ZWN2ZShnaXRfY29tbWFuZCwgKGNoYXIgKiopYXJndiwgZW52aXJvbik7CisKKwkJaWYgKGdldGVudigiR0lUX1RSQUNFIikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAidHJhY2U6IGV4ZWMgZmFpbGVkOiAlc1xuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJZmZsdXNoKHN0ZGVycik7CisJCX0KKworCQlhcmd2WzBdID0gdG1wOworCX0KKwlyZXR1cm4gLTE7CisKK30KKworCitpbnQgZXhlY2xfZ2l0X2NtZChjb25zdCBjaGFyICpjbWQsLi4uKQoreworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbTUFYX0FSR1MgKyAxXTsKKwljb25zdCBjaGFyICphcmc7CisJdmFfbGlzdCBwYXJhbTsKKworCXZhX3N0YXJ0KHBhcmFtLCBjbWQpOworCWFyZ3ZbMF0gPSBjbWQ7CisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ2MgPCBNQVhfQVJHUykgeworCQlhcmcgPSBhcmd2W2FyZ2MrK10gPSB2YV9hcmcocGFyYW0sIGNoYXIgKik7CisJCWlmICghYXJnKQorCQkJYnJlYWs7CisJfQorCXZhX2VuZChwYXJhbSk7CisJaWYgKE1BWF9BUkdTIDw9IGFyZ2MpCisJCXJldHVybiBlcnJvcigidG9vIG1hbnkgYXJncyB0byBydW4gJXMiLCBjbWQpOworCisJYXJndlthcmdjXSA9IE5VTEw7CisJcmV0dXJuIGV4ZWN2X2dpdF9jbWQoYXJndik7Cit9CmRpZmYgLS1naXQgYS9leGVjX2NtZC5oIGIvZXhlY19jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODk2MjFmCi0tLSAvZGV2L251bGwKKysrIGIvZXhlY19jbWQuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9fR0lUX0VYRUNfQ01EX0hfCisjZGVmaW5lIF9fR0lUX0VYRUNfQ01EX0hfCisKK2V4dGVybiB2b2lkIGdpdF9zZXRfZXhlY19wYXRoKGNvbnN0IGNoYXIgKmV4ZWNfcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciogZ2l0X2V4ZWNfcGF0aCh2b2lkKTsKK2V4dGVybiBpbnQgZXhlY3ZfZ2l0X2NtZChjb25zdCBjaGFyICoqYXJndik7IC8qIE5VTEwgdGVybWluYXRlZCAqLworZXh0ZXJuIGludCBleGVjbF9naXRfY21kKGNvbnN0IGNoYXIgKmNtZCwgLi4uKTsKKworCisjZW5kaWYgLyogX19HSVRfRVhFQ19DTURfSF8gKi8KZGlmZiAtLWdpdCBhL2ZldGNoLWNsb25lLmMgYi9mZXRjaC1jbG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODRjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mZXRjaC1jbG9uZS5jCkBAIC0wLDAgKzEsMzAxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitzdGF0aWMgaW50IGZpbmlzaF9wYWNrKGNvbnN0IGNoYXIgKnBhY2tfdG1wX25hbWUsIGNvbnN0IGNoYXIgKm1lKQoreworCWludCBwaXBlX2ZkWzJdOworCXBpZF90IHBpZDsKKwljaGFyIGlkeFtQQVRIX01BWF07CisJY2hhciBmaW5hbFtQQVRIX01BWF07CisJY2hhciBoYXNoWzQxXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNoYXIgKmNwOworCWludCBlcnIgPSAwOworCisJaWYgKHBpcGUocGlwZV9mZCkgPCAwKQorCQlkaWUoIiVzOiB1bmFibGUgdG8gc2V0IHVwIHBpcGUiLCBtZSk7CisKKwlzdHJjcHkoaWR4LCBwYWNrX3RtcF9uYW1lKTsgLyogIi5naXQvb2JqZWN0cy9wYWNrLVhYWFhYWCIgKi8KKwljcCA9IHN0cnJjaHIoaWR4LCAnLycpOworCW1lbWNweShjcCwgIi9waWR4IiwgNSk7CisKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApCisJCWRpZSgiJXM6IHVuYWJsZSB0byBmb3JrIG9mZiBnaXQtaW5kZXgtcGFjayIsIG1lKTsKKwlpZiAoIXBpZCkgeworCQljbG9zZSgwKTsKKwkJZHVwMihwaXBlX2ZkWzFdLCAxKTsKKwkJY2xvc2UocGlwZV9mZFswXSk7CisJCWNsb3NlKHBpcGVfZmRbMV0pOworCQlleGVjbF9naXRfY21kKCJpbmRleC1wYWNrIiwgIi1vIiwgaWR4LCBwYWNrX3RtcF9uYW1lLCBOVUxMKTsKKwkJZXJyb3IoImNhbm5vdCBleGVjIGdpdC1pbmRleC1wYWNrIDwlcz4gPCVzPiIsCisJCSAgICAgIGlkeCwgcGFja190bXBfbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWNsb3NlKHBpcGVfZmRbMV0pOworCWlmIChyZWFkKHBpcGVfZmRbMF0sIGhhc2gsIDQwKSAhPSA0MCkgeworCQllcnJvcigiJXM6IHVuYWJsZSB0byByZWFkIGZyb20gZ2l0LWluZGV4LXBhY2siLCBtZSk7CisJCWVyciA9IDE7CisJfQorCWNsb3NlKHBpcGVfZmRbMF0pOworCisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzLCBjb2RlOworCQlpbnQgcmV0dmFsID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQllcnJvcigid2FpdHBpZCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGVycm9yX2RpZTsKKwkJfQorCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgeworCQkJaW50IHNpZyA9IFdURVJNU0lHKHN0YXR1cyk7CisJCQllcnJvcigiZ2l0LWluZGV4LXBhY2sgZGllZCBvZiBzaWduYWwgJWQiLCBzaWcpOworCQkJZ290byBlcnJvcl9kaWU7CisJCX0KKwkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworCQkJZXJyb3IoImdpdC1pbmRleC1wYWNrIGRpZWQgb2YgdW5uYXR1cmFsIGNhdXNlcyAlZCIsCisJCQkgICAgICBzdGF0dXMpOworCQkJZ290byBlcnJvcl9kaWU7CisJCX0KKwkJY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCWlmIChjb2RlKSB7CisJCQllcnJvcigiZ2l0LWluZGV4LXBhY2sgZGllZCB3aXRoIGVycm9yIGNvZGUgJWQiLCBjb2RlKTsKKwkJCWdvdG8gZXJyb3JfZGllOworCQl9CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yX2RpZTsKKwkJYnJlYWs7CisJfQorCWhhc2hbNDBdID0gMDsKKwlpZiAoZ2V0X3NoYTFfaGV4KGhhc2gsIHNoYTEpKSB7CisJCWVycm9yKCJnaXQtaW5kZXgtcGFjayByZXBvcnRlZCBub25zZW5zZSAnJXMnIiwgaGFzaCk7CisJCWdvdG8gZXJyb3JfZGllOworCX0KKwkvKiBOb3cgd2UgaGF2ZSBwYWNrIGluIHBhY2tfdG1wX25hbWVbXSwgYW5kCisJICogaWR4IGluIGlkeFtdOyByZW5hbWUgdGhlbSB0byB0aGVpciBmaW5hbCBuYW1lcy4KKwkgKi8KKwlzbnByaW50ZihmaW5hbCwgc2l6ZW9mKGZpbmFsKSwKKwkJICIlcy9wYWNrL3BhY2stJXMucGFjayIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIGhhc2gpOworCW1vdmVfdGVtcF90b19maWxlKHBhY2tfdG1wX25hbWUsIGZpbmFsKTsKKwljaG1vZChmaW5hbCwgMDQ0NCk7CisJc25wcmludGYoZmluYWwsIHNpemVvZihmaW5hbCksCisJCSAiJXMvcGFjay9wYWNrLSVzLmlkeCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCksIGhhc2gpOworCW1vdmVfdGVtcF90b19maWxlKGlkeCwgZmluYWwpOworCWNobW9kKGZpbmFsLCAwNDQ0KTsKKwlyZXR1cm4gMDsKKworIGVycm9yX2RpZToKKwl1bmxpbmsoaWR4KTsKKwl1bmxpbmsocGFja190bXBfbmFtZSk7CisJZXhpdCgxKTsKK30KKworc3RhdGljIHBpZF90IHNldHVwX3NpZGViYW5kKGludCBzaWRlYmFuZCwgY29uc3QgY2hhciAqbWUsIGludCBmZFsyXSwgaW50IHhkWzJdKQoreworCXBpZF90IHNpZGVfcGlkOworCisJaWYgKCFzaWRlYmFuZCkgeworCQlmZFswXSA9IHhkWzBdOworCQlmZFsxXSA9IHhkWzFdOworCQlyZXR1cm4gMDsKKwl9CisJLyogeGRbXSBpcyB0YWxraW5nIHdpdGggdXBsb2FkLXBhY2s7IHN1YnByb2Nlc3MgcmVhZHMgZnJvbQorCSAqIHhkWzBdLCBzcGl0cyBvdXQgYmFuZCMyIHRvIHN0ZGVyciwgYW5kIGZlZWRzIHVzIGJhbmQjMQorCSAqIHRocm91Z2ggb3VyIGZkWzBdLgorCSAqLworCWlmIChwaXBlKGZkKSA8IDApCisJCWRpZSgiJXM6IHVuYWJsZSB0byBzZXQgdXAgcGlwZSIsIG1lKTsKKwlzaWRlX3BpZCA9IGZvcmsoKTsKKwlpZiAoc2lkZV9waWQgPCAwKQorCQlkaWUoIiVzOiB1bmFibGUgdG8gZm9yayBvZmYgc2lkZWJhbmQgZGVtdWx0aXBsZXhlciIsIG1lKTsKKwlpZiAoIXNpZGVfcGlkKSB7CisJCS8qIHN1YnByb2Nlc3MgKi8KKwkJY2xvc2UoZmRbMF0pOworCQlpZiAoeGRbMF0gIT0geGRbMV0pCisJCQljbG9zZSh4ZFsxXSk7CisJCXdoaWxlICgxKSB7CisJCQljaGFyIGJ1ZlsxMDI0XTsKKwkJCWludCBsZW4gPSBwYWNrZXRfcmVhZF9saW5lKHhkWzBdLCBidWYsIHNpemVvZihidWYpKTsKKwkJCWlmIChsZW4gPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChsZW4gPCAxKQorCQkJCWRpZSgiJXM6IHByb3RvY29sIGVycm9yOiBubyBiYW5kIGRlc2lnbmF0b3IiLAorCQkJCSAgICBtZSk7CisJCQlsZW4tLTsKKwkJCXN3aXRjaCAoYnVmWzBdICYgMHhGRikgeworCQkJY2FzZSAzOgorCQkJCXNhZmVfd3JpdGUoMiwgInJlbW90ZTogIiwgOCk7CisJCQkJc2FmZV93cml0ZSgyLCBidWYrMSwgbGVuKTsKKwkJCQlzYWZlX3dyaXRlKDIsICJcbiIsIDEpOworCQkJCWV4aXQoMSk7CisJCQljYXNlIDI6CisJCQkJc2FmZV93cml0ZSgyLCAicmVtb3RlOiAiLCA4KTsKKwkJCQlzYWZlX3dyaXRlKDIsIGJ1ZisxLCBsZW4pOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxOgorCQkJCXNhZmVfd3JpdGUoZmRbMV0sIGJ1ZisxLCBsZW4pOworCQkJCWNvbnRpbnVlOworCQkJZGVmYXVsdDoKKwkJCQlkaWUoIiVzOiBwcm90b2NvbCBlcnJvcjogYmFkIGJhbmQgIyVkIiwKKwkJCQkgICAgbWUsIChidWZbMF0gJiAweEZGKSk7CisJCQl9CisJCX0KKwkJZXhpdCgwKTsKKwl9CisJY2xvc2UoeGRbMF0pOworCWNsb3NlKGZkWzFdKTsKKwlmZFsxXSA9IHhkWzFdOworCXJldHVybiBzaWRlX3BpZDsKK30KKworaW50IHJlY2VpdmVfdW5wYWNrX3BhY2soaW50IHhkWzJdLCBjb25zdCBjaGFyICptZSwgaW50IHF1aWV0LCBpbnQgc2lkZWJhbmQpCit7CisJaW50IHN0YXR1czsKKwlwaWRfdCBwaWQsIHNpZGVfcGlkOworCWludCBmZFsyXTsKKworCXNpZGVfcGlkID0gc2V0dXBfc2lkZWJhbmQoc2lkZWJhbmQsIG1lLCBmZCwgeGQpOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkKKwkJZGllKCIlczogdW5hYmxlIHRvIGZvcmsgb2ZmIGdpdC11bnBhY2stb2JqZWN0cyIsIG1lKTsKKwlpZiAoIXBpZCkgeworCQlkdXAyKGZkWzBdLCAwKTsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCWV4ZWNsX2dpdF9jbWQoInVucGFjay1vYmplY3RzIiwgcXVpZXQgPyAiLXEiIDogTlVMTCwgTlVMTCk7CisJCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGV4ZWMgZmFpbGVkIik7CisJfQorCWNsb3NlKGZkWzBdKTsKKwljbG9zZShmZFsxXSk7CisJd2hpbGUgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJZGllKCJ3YWl0aW5nIGZvciBnaXQtdW5wYWNrLW9iamVjdHM6ICVzIiwKKwkJCSAgICBzdHJlcnJvcihlcnJubykpOworCX0KKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKKwkJaW50IGNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlpZiAoY29kZSkKKwkJCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGRpZWQgd2l0aCBlcnJvciBjb2RlICVkIiwKKwkJCSAgICBjb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisJCWludCBzaWcgPSBXVEVSTVNJRyhzdGF0dXMpOworCQlkaWUoImdpdC11bnBhY2stb2JqZWN0cyBkaWVkIG9mIHNpZ25hbCAlZCIsIHNpZyk7CisJfQorCWRpZSgiZ2l0LXVucGFjay1vYmplY3RzIGRpZWQgb2YgdW5uYXR1cmFsIGNhdXNlcyAlZCIsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBXZSBhdmVyYWdlIG91dCB0aGUgZG93bmxvYWQgc3BlZWQgb3ZlciB0aGlzIG1hbnkgImV2ZW50cyIsIHdoZXJlCisgKiBhbiBldmVudCBpcyBhIG1pbmltdW0gb2YgYWJvdXQgaGFsZiBhIHNlY29uZC4gVGhhdCB3YXksIHdlIGdldAorICogYSByZWFzb25hYmx5IHN0YWJsZSBudW1iZXIuCisgKi8KKyNkZWZpbmUgTlJfQVZFUkFHRSAoNCkKKworLyoKKyAqIEEgImJpbmFyeSBtc2VjIiBpcyBhIHBvd2VyLW9mLXR3by1tc2VjLCBha2EgMS8xMDI0dGggb2YgYSBzZWNvbmQuCisgKiBLZWVwaW5nIHRoZSB0aW1lIGluIHRoYXQgZm9ybWF0IG1lYW5zIHRoYXQgImJ5dGVzIC8gbXNlY3MiIG1lYW5zCisgKiB0aGUgc2FtZSBhcyBrQi9zIChtb2R1bG8gcm91bmRpbmcpLgorICoKKyAqIDEwMDA1MTIgaXMgYSBtYWdpYyBudW1iZXIgKHVzZWNzIGluIGEgc2Vjb25kLCByb3VuZGVkIHVwIGJ5IGhhbGYKKyAqIG9mIDEwMjQsIHRvIG1ha2UgInJvdW5kaW5nIiBjb21lIG91dCByaWdodCA7KQorICovCisjZGVmaW5lIHVzZWNfdG9fYmluYXJ5bXNlYyh4KSAoKGludCkoeCkgLyAoMTAwMDUxMiA+PiAxMCkpCisKK2ludCByZWNlaXZlX2tlZXBfcGFjayhpbnQgeGRbMl0sIGNvbnN0IGNoYXIgKm1lLCBpbnQgcXVpZXQsIGludCBzaWRlYmFuZCkKK3sKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBvZmQsIGlmZCwgZmRbMl07CisJdW5zaWduZWQgbG9uZyB0b3RhbDsKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgcHJldl90djsKKwlzdHJ1Y3QgYXZlcmFnZSB7CisJCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CisJCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl9IGRvd25sb2FkW05SX0FWRVJBR0VdID0geyB7MCwgMH0sIH07CisJdW5zaWduZWQgbG9uZyBhdmdfYnl0ZXMsIGF2Z190aW1lOworCWludCBpZHggPSAwOworCisJc2V0dXBfc2lkZWJhbmQoc2lkZWJhbmQsIG1lLCBmZCwgeGQpOworCisJaWZkID0gZmRbMF07CisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLAorCQkgIiVzL3BhY2svdG1wLVhYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCW9mZCA9IG1rc3RlbXAodG1wZmlsZSk7CisJaWYgKG9mZCA8IDApCisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSAlcyIsIHRtcGZpbGUpOworCisJZ2V0dGltZW9mZGF5KCZwcmV2X3R2LCBOVUxMKTsKKwl0b3RhbCA9IDA7CisJYXZnX2J5dGVzID0gMDsKKwlhdmdfdGltZSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY2hhciBidWZbODE5Ml07CisJCXNzaXplX3Qgc3osIHdzeiwgcG9zOworCQlzeiA9IHJlYWQoaWZkLCBidWYsIHNpemVvZihidWYpKTsKKwkJaWYgKHN6ID09IDApCisJCQlicmVhazsKKwkJaWYgKHN6IDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikgeworCQkJCWVycm9yKCJlcnJvciByZWFkaW5nIHBhY2sgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJY2xvc2Uob2ZkKTsKKwkJCQl1bmxpbmsodG1wZmlsZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJc3ogPSAwOworCQl9CisJCXBvcyA9IDA7CisJCXdoaWxlIChwb3MgPCBzeikgeworCQkJd3N6ID0gd3JpdGUob2ZkLCBidWYgKyBwb3MsIHN6IC0gcG9zKTsKKwkJCWlmICh3c3ogPCAwKSB7CisJCQkJZXJyb3IoImVycm9yIHdyaXRpbmcgcGFjayAoJXMpIiwKKwkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCWNsb3NlKG9mZCk7CisJCQkJdW5saW5rKHRtcGZpbGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXBvcyArPSB3c3o7CisJCX0KKwkJdG90YWwgKz0gc3o7CisJCWlmICghcXVpZXQpIHsKKwkJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Q7CisJCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJCXVuc2lnbmVkIGxvbmcgZGlmZiA9IHRvdGFsIC0gbGFzdDsKKwkJCS8qIG5vdCByZWFsbHkgIm1zZWNzIiwgYnV0IGEgcG93ZXItb2YtdHdvIG1pbGxpc2VjICgxLzEwMjR0aCBvZiBhIHNlYykgKi8KKwkJCXVuc2lnbmVkIGxvbmcgbXNlY3M7CisKKwkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJbXNlY3MgPSB0di50dl9zZWMgLSBwcmV2X3R2LnR2X3NlYzsKKwkJCW1zZWNzIDw8PSAxMDsKKwkJCW1zZWNzICs9IHVzZWNfdG9fYmluYXJ5bXNlYyh0di50dl91c2VjIC0gcHJldl90di50dl91c2VjKTsKKworCQkJaWYgKG1zZWNzID4gNTAwKSB7CisJCQkJcHJldl90diA9IHR2OworCQkJCWxhc3QgPSB0b3RhbDsKKworCQkJCS8qIFVwZGF0ZSBhdmVyYWdlcyAuLiovCisJCQkJYXZnX2J5dGVzICs9IGRpZmY7CisJCQkJYXZnX3RpbWUgKz0gbXNlY3M7CisJCQkJYXZnX2J5dGVzIC09IGRvd25sb2FkW2lkeF0uYnl0ZXM7CisJCQkJYXZnX3RpbWUgLT0gZG93bmxvYWRbaWR4XS50aW1lOworCQkJCWRvd25sb2FkW2lkeF0uYnl0ZXMgPSBkaWZmOworCQkJCWRvd25sb2FkW2lkeF0udGltZSA9IG1zZWNzOworCQkJCWlkeCsrOworCQkJCWlmIChpZHggPj0gTlJfQVZFUkFHRSkKKwkJCQkJaWR4ID0gMDsKKworCQkJCWZwcmludGYoc3RkZXJyLCAiJTRsdS4lMDNsdU1CICAoJWx1IGtCL3MpICAgICAgXHIiLAorCQkJCQl0b3RhbCA+PiAyMCwKKwkJCQkJMTAwMCooKHRvdGFsID4+IDEwKSAmIDEwMjMpPj4xMCwKKwkJCQkJYXZnX2J5dGVzIC8gYXZnX3RpbWUgKTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZShvZmQpOworCXJldHVybiBmaW5pc2hfcGFjayh0bXBmaWxlLCBtZSk7Cit9CmRpZmYgLS1naXQgYS9mZXRjaC1wYWNrLmMgYi9mZXRjaC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4MjRkYgotLS0gL2Rldi9udWxsCisrKyBiL2ZldGNoLXBhY2suYwpAQCAtMCwwICsxLDUzOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisKK3N0YXRpYyBpbnQga2VlcF9wYWNrOworc3RhdGljIGludCBxdWlldDsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKK3N0YXRpYyBpbnQgZmV0Y2hfYWxsOworc3RhdGljIGNvbnN0IGNoYXIgZmV0Y2hfcGFja191c2FnZVtdID0KKyJnaXQtZmV0Y2gtcGFjayBbLS1hbGxdIFstcV0gWy12XSBbLWtdIFstLXRoaW5dIFstLWV4ZWM9dXBsb2FkLXBhY2tdIFtob3N0Ol1kaXJlY3RvcnkgPHJlZnM+Li4uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjID0gImdpdC11cGxvYWQtcGFjayI7CisKKyNkZWZpbmUgQ09NUExFVEUJKDFVIDw8IDApCisjZGVmaW5lIENPTU1PTgkJKDFVIDw8IDEpCisjZGVmaW5lIENPTU1PTl9SRUYJKDFVIDw8IDIpCisjZGVmaW5lIFNFRU4JCSgxVSA8PCAzKQorI2RlZmluZSBQT1BQRUQJCSgxVSA8PCA0KQorCisvKgorICogQWZ0ZXIgc2VuZGluZyB0aGlzIG1hbnkgImhhdmUicyBpZiB3ZSBkbyBub3QgZ2V0IGFueSBuZXcgQUNLICwgd2UKKyAqIGdpdmUgdXAgdHJhdmVyc2luZyBvdXIgaGlzdG9yeS4KKyAqLworI2RlZmluZSBNQVhfSU5fVkFJTiAyNTYKKworc3RhdGljIHN0cnVjdCBjb21taXRfbGlzdCAqcmV2X2xpc3QgPSBOVUxMOworc3RhdGljIGludCBub25fY29tbW9uX3JldnMgPSAwLCBtdWx0aV9hY2sgPSAwLCB1c2VfdGhpbl9wYWNrID0gMCwgdXNlX3NpZGViYW5kOworCitzdGF0aWMgdm9pZCByZXZfbGlzdF9wdXNoKHN0cnVjdCBjb21taXQgKmNvbW1pdCwgaW50IG1hcmspCit7CisJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBtYXJrKSkgeworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBtYXJrOworCisJCWlmICghKGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkpCisJCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKworCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZyZXZfbGlzdCk7CisKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKQorCQkJbm9uX2NvbW1vbl9yZXZzKys7CisJfQorfQorCitzdGF0aWMgaW50IHJldl9saXN0X2luc2VydF9yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gZGVyZWZfdGFnKHBhcnNlX29iamVjdChzaGExKSwgcGF0aCwgMCk7CisKKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9DT01NSVQpCisJCXJldl9saXN0X3B1c2goKHN0cnVjdCBjb21taXQgKilvLCBTRUVOKTsKKworCXJldHVybiAwOworfQorCisvKgorICAgVGhpcyBmdW5jdGlvbiBtYXJrcyBhIHJldiBhbmQgaXRzIGFuY2VzdG9ycyBhcyBjb21tb24uCisgICBJbiBzb21lIGNhc2VzLCBpdCBpcyBkZXNpcmFibGUgdG8gbWFyayBvbmx5IHRoZSBhbmNlc3RvcnMgKGZvciBleGFtcGxlCisgICB3aGVuIG9ubHkgdGhlIHNlcnZlciBkb2VzIG5vdCB5ZXQga25vdyB0aGF0IHRoZXkgYXJlIGNvbW1vbikuCisqLworCitzdGF0aWMgdm9pZCBtYXJrX2NvbW1vbihzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCWludCBhbmNlc3RvcnNfb25seSwgaW50IGRvbnRfcGFyc2UpCit7CisJaWYgKGNvbW1pdCAhPSBOVUxMICYmICEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pKSB7CisJCXN0cnVjdCBvYmplY3QgKm8gPSAoc3RydWN0IG9iamVjdCAqKWNvbW1pdDsKKworCQlpZiAoIWFuY2VzdG9yc19vbmx5KQorCQkJby0+ZmxhZ3MgfD0gQ09NTU9OOworCisJCWlmICghKG8tPmZsYWdzICYgU0VFTikpCisJCQlyZXZfbGlzdF9wdXNoKGNvbW1pdCwgU0VFTik7CisJCWVsc2UgeworCQkJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJCQlpZiAoIWFuY2VzdG9yc19vbmx5ICYmICEoby0+ZmxhZ3MgJiBQT1BQRUQpKQorCQkJCW5vbl9jb21tb25fcmV2cy0tOworCQkJaWYgKCFvLT5wYXJzZWQgJiYgIWRvbnRfcGFyc2UpCisJCQkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisKKwkJCWZvciAocGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJCQkJcGFyZW50czsKKwkJCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQpCisJCQkJbWFya19jb21tb24ocGFyZW50cy0+aXRlbSwgMCwgZG9udF9wYXJzZSk7CisJCX0KKwl9Cit9CisKKy8qCisgIEdldCB0aGUgbmV4dCByZXYgdG8gc2VuZCwgaWdub3JpbmcgdGhlIGNvbW1vbi4KKyovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyKiBnZXRfcmV2KHZvaWQpCit7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gTlVMTDsKKworCXdoaWxlIChjb21taXQgPT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgbWFyazsKKwkJc3RydWN0IGNvbW1pdF9saXN0KiBwYXJlbnRzOworCisJCWlmIChyZXZfbGlzdCA9PSBOVUxMIHx8IG5vbl9jb21tb25fcmV2cyA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJY29tbWl0ID0gcmV2X2xpc3QtPml0ZW07CisJCWlmICghKGNvbW1pdC0+b2JqZWN0LnBhcnNlZCkpCisJCQlwYXJzZV9jb21taXQoY29tbWl0KTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gUE9QUEVEOworCQlpZiAoIShjb21taXQtPm9iamVjdC5mbGFncyAmIENPTU1PTikpCisJCQlub25fY29tbW9uX3JldnMtLTsKKwkKKwkJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBDT01NT04pIHsKKwkJCS8qIGRvIG5vdCBzZW5kICJoYXZlIiwgYW5kIGlnbm9yZSBhbmNlc3RvcnMgKi8KKwkJCWNvbW1pdCA9IE5VTEw7CisJCQltYXJrID0gQ09NTU9OIHwgU0VFTjsKKwkJfSBlbHNlIGlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIENPTU1PTl9SRUYpCisJCQkvKiBzZW5kICJoYXZlIiwgYW5kIGlnbm9yZSBhbmNlc3RvcnMgKi8KKwkJCW1hcmsgPSBDT01NT04gfCBTRUVOOworCQllbHNlCisJCQkvKiBzZW5kICJoYXZlIiwgYWxzbyBmb3IgaXRzIGFuY2VzdG9ycyAqLworCQkJbWFyayA9IFNFRU47CisKKwkJd2hpbGUgKHBhcmVudHMpIHsKKwkJCWlmICghKHBhcmVudHMtPml0ZW0tPm9iamVjdC5mbGFncyAmIFNFRU4pKQorCQkJCXJldl9saXN0X3B1c2gocGFyZW50cy0+aXRlbSwgbWFyayk7CisJCQlpZiAobWFyayAmIENPTU1PTikKKwkJCQltYXJrX2NvbW1vbihwYXJlbnRzLT5pdGVtLCAxLCAwKTsKKwkJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQl9CisKKwkJcmV2X2xpc3QgPSByZXZfbGlzdC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gY29tbWl0LT5vYmplY3Quc2hhMTsKK30KKworc3RhdGljIGludCBmaW5kX2NvbW1vbihpbnQgZmRbMl0sIHVuc2lnbmVkIGNoYXIgKnJlc3VsdF9zaGExLAorCQkgICAgICAgc3RydWN0IHJlZiAqcmVmcykKK3sKKwlpbnQgZmV0Y2hpbmc7CisJaW50IGNvdW50ID0gMCwgZmx1c2hlcyA9IDAsIHJldHZhbDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExOworCXVuc2lnbmVkIGluX3ZhaW4gPSAwOworCWludCBnb3RfY29udGludWUgPSAwOworCisJZm9yX2VhY2hfcmVmKHJldl9saXN0X2luc2VydF9yZWYpOworCisJZmV0Y2hpbmcgPSAwOworCWZvciAoIDsgcmVmcyA7IHJlZnMgPSByZWZzLT5uZXh0KSB7CisJCXVuc2lnbmVkIGNoYXIgKnJlbW90ZSA9IHJlZnMtPm9sZF9zaGExOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJCS8qCisJCSAqIElmIHRoYXQgb2JqZWN0IGlzIGNvbXBsZXRlIChpLmUuIGl0IGlzIGFuIGFuY2VzdG9yIG9mIGEKKwkJICogbG9jYWwgcmVmKSwgd2UgdGVsbCB0aGVtIHdlIGhhdmUgaXQgYnV0IGRvIG5vdCBoYXZlIHRvCisJCSAqIHRlbGwgdGhlbSBhYm91dCBpdHMgYW5jZXN0b3JzLCB3aGljaCB0aGV5IGFscmVhZHkga25vdworCQkgKiBhYm91dC4KKwkJICoKKwkJICogV2UgdXNlIGxvb2t1cF9vYmplY3QgaGVyZSBiZWNhdXNlIHdlIGFyZSBvbmx5CisJCSAqIGludGVyZXN0ZWQgaW4gdGhlIGNhc2Ugd2UgKmtub3cqIHRoZSBvYmplY3QgaXMKKwkJICogcmVhY2hhYmxlIGFuZCB3ZSBoYXZlIGFscmVhZHkgc2Nhbm5lZCBpdC4KKwkJICovCisJCWlmICgoKG8gPSBsb29rdXBfb2JqZWN0KHJlbW90ZSkpICE9IE5VTEwpICYmCisJCQkJKG8tPmZsYWdzICYgQ09NUExFVEUpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZmV0Y2hpbmcpCisJCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJ3YW50ICVzJXMlcyVzXG4iLAorCQkJCSAgICAgc2hhMV90b19oZXgocmVtb3RlKSwKKwkJCQkgICAgIChtdWx0aV9hY2sgPyAiIG11bHRpX2FjayIgOiAiIiksCisJCQkJICAgICAodXNlX3NpZGViYW5kID8gIiBzaWRlLWJhbmQiIDogIiIpLAorCQkJCSAgICAgKHVzZV90aGluX3BhY2sgPyAiIHRoaW4tcGFjayIgOiAiIikpOworCQllbHNlCisJCQlwYWNrZXRfd3JpdGUoZmRbMV0sICJ3YW50ICVzXG4iLCBzaGExX3RvX2hleChyZW1vdGUpKTsKKwkJZmV0Y2hpbmcrKzsKKwl9CisJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwlpZiAoIWZldGNoaW5nKQorCQlyZXR1cm4gMTsKKworCWZsdXNoZXMgPSAwOworCXJldHZhbCA9IC0xOworCXdoaWxlICgoc2hhMSA9IGdldF9yZXYoKSkpIHsKKwkJcGFja2V0X3dyaXRlKGZkWzFdLCAiaGF2ZSAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiaGF2ZSAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQlpbl92YWluKys7CisJCWlmICghKDMxICYgKytjb3VudCkpIHsKKwkJCWludCBhY2s7CisKKwkJCXBhY2tldF9mbHVzaChmZFsxXSk7CisJCQlmbHVzaGVzKys7CisKKwkJCS8qCisJCQkgKiBXZSBrZWVwIG9uZSB3aW5kb3cgImFoZWFkIiBvZiB0aGUgb3RoZXIgc2lkZSwgYW5kCisJCQkgKiB3aWxsIHdhaXQgZm9yIGFuIEFDSyBvbmx5IG9uIHRoZSBuZXh0IG9uZQorCQkJICovCisJCQlpZiAoY291bnQgPT0gMzIpCisJCQkJY29udGludWU7CisKKwkJCWRvIHsKKwkJCQlhY2sgPSBnZXRfYWNrKGZkWzBdLCByZXN1bHRfc2hhMSk7CisJCQkJaWYgKHZlcmJvc2UgJiYgYWNrKQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgImdvdCBhY2sgJWQgJXNcbiIsIGFjaywKKwkJCQkJCQlzaGExX3RvX2hleChyZXN1bHRfc2hhMSkpOworCQkJCWlmIChhY2sgPT0gMSkgeworCQkJCQlmbHVzaGVzID0gMDsKKwkJCQkJbXVsdGlfYWNrID0gMDsKKwkJCQkJcmV0dmFsID0gMDsKKwkJCQkJZ290byBkb25lOworCQkJCX0gZWxzZSBpZiAoYWNrID09IDIpIHsKKwkJCQkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0KKwkJCQkJCWxvb2t1cF9jb21taXQocmVzdWx0X3NoYTEpOworCQkJCQltYXJrX2NvbW1vbihjb21taXQsIDAsIDEpOworCQkJCQlyZXR2YWwgPSAwOworCQkJCQlpbl92YWluID0gMDsKKwkJCQkJZ290X2NvbnRpbnVlID0gMTsKKwkJCQl9CisJCQl9IHdoaWxlIChhY2spOworCQkJZmx1c2hlcy0tOworCQkJaWYgKGdvdF9jb250aW51ZSAmJiBNQVhfSU5fVkFJTiA8IGluX3ZhaW4pIHsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJZnByaW50ZihzdGRlcnIsICJnaXZpbmcgdXBcbiIpOworCQkJCWJyZWFrOyAvKiBnaXZlIHVwICovCisJCQl9CisJCX0KKwl9Citkb25lOgorCXBhY2tldF93cml0ZShmZFsxXSwgImRvbmVcbiIpOworCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgImRvbmVcbiIpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQltdWx0aV9hY2sgPSAwOworCQlmbHVzaGVzKys7CisJfQorCXdoaWxlIChmbHVzaGVzIHx8IG11bHRpX2FjaykgeworCQlpbnQgYWNrID0gZ2V0X2FjayhmZFswXSwgcmVzdWx0X3NoYTEpOworCQlpZiAoYWNrKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdvdCBhY2sgKCVkKSAlc1xuIiwgYWNrLAorCQkJCQlzaGExX3RvX2hleChyZXN1bHRfc2hhMSkpOworCQkJaWYgKGFjayA9PSAxKQorCQkJCXJldHVybiAwOworCQkJbXVsdGlfYWNrID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZsdXNoZXMtLTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBjb21taXRfbGlzdCAqY29tcGxldGUgPSBOVUxMOworCitzdGF0aWMgaW50IG1hcmtfY29tcGxldGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCisJd2hpbGUgKG8gJiYgby0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCXN0cnVjdCB0YWcgKnQgPSAoc3RydWN0IHRhZyAqKSBvOworCQlpZiAoIXQtPnRhZ2dlZCkKKwkJCWJyZWFrOyAvKiBicm9rZW4gcmVwb3NpdG9yeSAqLworCQlvLT5mbGFncyB8PSBDT01QTEVURTsKKwkJbyA9IHBhcnNlX29iamVjdCh0LT50YWdnZWQtPnNoYTEpOworCX0KKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBDT01QTEVURTsKKwkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmY29tcGxldGUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWFya19yZWNlbnRfY29tcGxldGVfY29tbWl0cyh1bnNpZ25lZCBsb25nIGN1dG9mZikKK3sKKwl3aGlsZSAoY29tcGxldGUgJiYgY3V0b2ZmIDw9IGNvbXBsZXRlLT5pdGVtLT5kYXRlKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJNYXJraW5nICVzIGFzIGNvbXBsZXRlXG4iLAorCQkJCXNoYTFfdG9faGV4KGNvbXBsZXRlLT5pdGVtLT5vYmplY3Quc2hhMSkpOworCQlwb3BfbW9zdF9yZWNlbnRfY29tbWl0KCZjb21wbGV0ZSwgQ09NUExFVEUpOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX3JlZnMoc3RydWN0IHJlZiAqKnJlZnMsIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoKQoreworCXN0cnVjdCByZWYgKipyZXR1cm5fcmVmczsKKwlzdHJ1Y3QgcmVmICpuZXdsaXN0ID0gTlVMTDsKKwlzdHJ1Y3QgcmVmICoqbmV3dGFpbCA9ICZuZXdsaXN0OworCXN0cnVjdCByZWYgKnJlZiwgKm5leHQ7CisJc3RydWN0IHJlZiAqZmFzdGFycmF5WzMyXTsKKworCWlmIChucl9tYXRjaCAmJiAhZmV0Y2hfYWxsKSB7CisJCWlmIChBUlJBWV9TSVpFKGZhc3RhcnJheSkgPCBucl9tYXRjaCkKKwkJCXJldHVybl9yZWZzID0geGNhbGxvYyhucl9tYXRjaCwgc2l6ZW9mKHN0cnVjdCByZWYgKikpOworCQllbHNlIHsKKwkJCXJldHVybl9yZWZzID0gZmFzdGFycmF5OworCQkJbWVtc2V0KHJldHVybl9yZWZzLCAwLCBzaXplb2Yoc3RydWN0IHJlZiAqKSAqIG5yX21hdGNoKTsKKwkJfQorCX0KKwllbHNlCisJCXJldHVybl9yZWZzID0gTlVMTDsKKworCWZvciAocmVmID0gKnJlZnM7IHJlZjsgcmVmID0gbmV4dCkgeworCQluZXh0ID0gcmVmLT5uZXh0OworCQlpZiAoIW1lbWNtcChyZWYtPm5hbWUsICJyZWZzLyIsIDUpICYmCisJCSAgICBjaGVja19yZWZfZm9ybWF0KHJlZi0+bmFtZSArIDUpKQorCQkJOyAvKiB0cmFzaCAqLworCQllbHNlIGlmIChmZXRjaF9hbGwpIHsKKwkJCSpuZXd0YWlsID0gcmVmOworCQkJcmVmLT5uZXh0ID0gTlVMTDsKKwkJCW5ld3RhaWwgPSAmcmVmLT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZWxzZSB7CisJCQlpbnQgb3JkZXIgPSBwYXRoX21hdGNoKHJlZi0+bmFtZSwgbnJfbWF0Y2gsIG1hdGNoKTsKKwkJCWlmIChvcmRlcikgeworCQkJCXJldHVybl9yZWZzW29yZGVyLTFdID0gcmVmOworCQkJCWNvbnRpbnVlOyAvKiB3ZSB3aWxsIGxpbmsgaXQgbGF0ZXIgKi8KKwkJCX0KKwkJfQorCQlmcmVlKHJlZik7CisJfQorCisJaWYgKCFmZXRjaF9hbGwpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBucl9tYXRjaDsgaSsrKSB7CisJCQlyZWYgPSByZXR1cm5fcmVmc1tpXTsKKwkJCWlmIChyZWYpIHsKKwkJCQkqbmV3dGFpbCA9IHJlZjsKKwkJCQlyZWYtPm5leHQgPSBOVUxMOworCQkJCW5ld3RhaWwgPSAmcmVmLT5uZXh0OworCQkJfQorCQl9CisJCWlmIChyZXR1cm5fcmVmcyAhPSBmYXN0YXJyYXkpCisJCQlmcmVlKHJldHVybl9yZWZzKTsKKwl9CisJKnJlZnMgPSBuZXdsaXN0OworfQorCitzdGF0aWMgaW50IGV2ZXJ5dGhpbmdfbG9jYWwoc3RydWN0IHJlZiAqKnJlZnMsIGludCBucl9tYXRjaCwgY2hhciAqKm1hdGNoKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgY3V0b2ZmID0gMDsKKworCXRyYWNrX29iamVjdF9yZWZzID0gMDsKKwlzYXZlX2NvbW1pdF9idWZmZXIgPSAwOworCisJZm9yIChyZWYgPSAqcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqbzsKKworCQlvID0gcGFyc2Vfb2JqZWN0KHJlZi0+b2xkX3NoYTEpOworCQlpZiAoIW8pCisJCQljb250aW51ZTsKKworCQkvKiBXZSBhbHJlYWR5IGhhdmUgaXQgLS0gd2hpY2ggbWF5IG1lYW4gdGhhdCB3ZSB3ZXJlCisJCSAqIGluIHN5bmMgd2l0aCB0aGUgb3RoZXIgc2lkZSBhdCBzb21lIHRpbWUgYWZ0ZXIKKwkJICogdGhhdCAoaXQgaXMgT0sgaWYgd2UgZ3Vlc3Mgd3JvbmcgaGVyZSkuCisJCSAqLworCQlpZiAoby0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW87CisJCQlpZiAoIWN1dG9mZiB8fCBjdXRvZmYgPCBjb21taXQtPmRhdGUpCisJCQkJY3V0b2ZmID0gY29tbWl0LT5kYXRlOworCQl9CisJfQorCisJZm9yX2VhY2hfcmVmKG1hcmtfY29tcGxldGUpOworCWlmIChjdXRvZmYpCisJCW1hcmtfcmVjZW50X2NvbXBsZXRlX2NvbW1pdHMoY3V0b2ZmKTsKKworCS8qCisJICogTWFyayBhbGwgY29tcGxldGUgcmVtb3RlIHJlZnMgYXMgY29tbW9uIHJlZnMuCisJICogRG9uJ3QgbWFyayB0aGVtIGNvbW1vbiB5ZXQ7IHRoZSBzZXJ2ZXIgaGFzIHRvIGJlIHRvbGQgc28gZmlyc3QuCisJICovCisJZm9yIChyZWYgPSAqcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IGRlcmVmX3RhZyhsb29rdXBfb2JqZWN0KHJlZi0+b2xkX3NoYTEpLAorCQkJCQkgICAgIE5VTEwsIDApOworCisJCWlmICghbyB8fCBvLT50eXBlICE9IE9CSl9DT01NSVQgfHwgIShvLT5mbGFncyAmIENPTVBMRVRFKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG8tPmZsYWdzICYgU0VFTikpIHsKKwkJCXJldl9saXN0X3B1c2goKHN0cnVjdCBjb21taXQgKilvLCBDT01NT05fUkVGIHwgU0VFTik7CisKKwkJCW1hcmtfY29tbW9uKChzdHJ1Y3QgY29tbWl0ICopbywgMSwgMSk7CisJCX0KKwl9CisKKwlmaWx0ZXJfcmVmcyhyZWZzLCBucl9tYXRjaCwgbWF0Y2gpOworCisJZm9yIChyZXR2YWwgPSAxLCByZWYgPSAqcmVmczsgcmVmIDsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnJlbW90ZSA9IHJlZi0+b2xkX3NoYTE7CisJCXVuc2lnbmVkIGNoYXIgbG9jYWxbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJCW8gPSBsb29rdXBfb2JqZWN0KHJlbW90ZSk7CisJCWlmICghbyB8fCAhKG8tPmZsYWdzICYgQ09NUExFVEUpKSB7CisJCQlyZXR2YWwgPSAwOworCQkJaWYgKCF2ZXJib3NlKQorCQkJCWNvbnRpbnVlOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIndhbnQgJXMgKCVzKVxuIiwgc2hhMV90b19oZXgocmVtb3RlKSwKKwkJCQlyZWYtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKworCQltZW1jcHkocmVmLT5uZXdfc2hhMSwgbG9jYWwsIDIwKTsKKwkJaWYgKCF2ZXJib3NlKQorCQkJY29udGludWU7CisJCWZwcmludGYoc3RkZXJyLAorCQkJImFscmVhZHkgaGF2ZSAlcyAoJXMpXG4iLCBzaGExX3RvX2hleChyZW1vdGUpLAorCQkJcmVmLT5uYW1lKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBmZXRjaF9wYWNrKGludCBmZFsyXSwgaW50IG5yX21hdGNoLCBjaGFyICoqbWF0Y2gpCit7CisJc3RydWN0IHJlZiAqcmVmOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHN0YXR1czsKKworCWdldF9yZW1vdGVfaGVhZHMoZmRbMF0sICZyZWYsIDAsIE5VTEwsIDApOworCWlmIChzZXJ2ZXJfc3VwcG9ydHMoIm11bHRpX2FjayIpKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJTZXJ2ZXIgc3VwcG9ydHMgbXVsdGlfYWNrXG4iKTsKKwkJbXVsdGlfYWNrID0gMTsKKwl9CisJaWYgKHNlcnZlcl9zdXBwb3J0cygic2lkZS1iYW5kIikpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlNlcnZlciBzdXBwb3J0cyBzaWRlLWJhbmRcbiIpOworCQl1c2Vfc2lkZWJhbmQgPSAxOworCX0KKwlpZiAoIXJlZikgeworCQlwYWNrZXRfZmx1c2goZmRbMV0pOworCQlkaWUoIm5vIG1hdGNoaW5nIHJlbW90ZSBoZWFkIik7CisJfQorCWlmIChldmVyeXRoaW5nX2xvY2FsKCZyZWYsIG5yX21hdGNoLCBtYXRjaCkpIHsKKwkJcGFja2V0X2ZsdXNoKGZkWzFdKTsKKwkJZ290byBhbGxfZG9uZTsKKwl9CisJaWYgKGZpbmRfY29tbW9uKGZkLCBzaGExLCByZWYpIDwgMCkKKwkJaWYgKCFrZWVwX3BhY2spCisJCQkvKiBXaGVuIGNsb25pbmcsIGl0IGlzIG5vdCB1bnVzdWFsIHRvIGhhdmUKKwkJCSAqIG5vIGNvbW1vbiBjb21taXQuCisJCQkgKi8KKwkJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogbm8gY29tbW9uIGNvbW1pdHNcbiIpOworCisJaWYgKGtlZXBfcGFjaykKKwkJc3RhdHVzID0gcmVjZWl2ZV9rZWVwX3BhY2soZmQsICJnaXQtZmV0Y2gtcGFjayIsIHF1aWV0LCB1c2Vfc2lkZWJhbmQpOworCWVsc2UKKwkJc3RhdHVzID0gcmVjZWl2ZV91bnBhY2tfcGFjayhmZCwgImdpdC1mZXRjaC1wYWNrIiwgcXVpZXQsIHVzZV9zaWRlYmFuZCk7CisKKwlpZiAoc3RhdHVzKQorCQlkaWUoImdpdC1mZXRjaC1wYWNrOiBmZXRjaCBmYWlsZWQuIik7CisKKyBhbGxfZG9uZToKKwl3aGlsZSAocmVmKSB7CisJCXByaW50ZigiJXMgJXNcbiIsCisJCSAgICAgICBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSwgcmVmLT5uYW1lKTsKKwkJcmVmID0gcmVmLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCByZXQsIG5yX2hlYWRzOworCWNoYXIgKmRlc3QgPSBOVUxMLCAqKmhlYWRzOworCWludCBmZFsyXTsKKwlwaWRfdCBwaWQ7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlucl9oZWFkcyA9IDA7CisJaGVhZHMgPSBOVUxMOworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RybmNtcCgiLS1leGVjPSIsIGFyZywgNykpIHsKKwkJCQlleGVjID0gYXJnICsgNzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLXF1aWV0IiwgYXJnKSB8fCAhc3RyY21wKCItcSIsIGFyZykpIHsKKwkJCQlxdWlldCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1rZWVwIiwgYXJnKSB8fCAhc3RyY21wKCItayIsIGFyZykpIHsKKwkJCQlrZWVwX3BhY2sgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tdGhpbiIsIGFyZykpIHsKKwkJCQl1c2VfdGhpbl9wYWNrID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWFsbCIsIGFyZykpIHsKKwkJCQlmZXRjaF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi12IiwgYXJnKSkgeworCQkJCXZlcmJvc2UgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2UoZmV0Y2hfcGFja191c2FnZSk7CisJCX0KKwkJZGVzdCA9IGFyZzsKKwkJaGVhZHMgPSBhcmd2ICsgaSArIDE7CisJCW5yX2hlYWRzID0gYXJnYyAtIGkgLSAxOworCQlicmVhazsKKwl9CisJaWYgKCFkZXN0KQorCQl1c2FnZShmZXRjaF9wYWNrX3VzYWdlKTsKKwlpZiAoa2VlcF9wYWNrKQorCQl1c2VfdGhpbl9wYWNrID0gMDsKKwlwaWQgPSBnaXRfY29ubmVjdChmZCwgZGVzdCwgZXhlYyk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiAxOworCXJldCA9IGZldGNoX3BhY2soZmQsIG5yX2hlYWRzLCBoZWFkcyk7CisJY2xvc2UoZmRbMF0pOworCWNsb3NlKGZkWzFdKTsKKwlmaW5pc2hfY29ubmVjdChwaWQpOworCisJaWYgKCFyZXQgJiYgbnJfaGVhZHMpIHsKKwkJLyogSWYgdGhlIGhlYWRzIHRvIHB1bGwgd2VyZSBnaXZlbiwgd2Ugc2hvdWxkIGhhdmUKKwkJICogY29uc3VtZWQgYWxsIG9mIHRoZW0gYnkgbWF0Y2hpbmcgdGhlIHJlbW90ZS4KKwkJICogT3RoZXJ3aXNlLCAnZ2l0LWZldGNoIHJlbW90ZSBuby1zdWNoLXJlZicgd291bGQKKwkJICogc2lsZW50bHkgc3VjY2VlZCB3aXRob3V0IGlzc3VpbmcgYW4gZXJyb3IuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfaGVhZHM7IGkrKykKKwkJCWlmIChoZWFkc1tpXSAmJiBoZWFkc1tpXVswXSkgeworCQkJCWVycm9yKCJubyBzdWNoIHJlbW90ZSByZWYgJXMiLCBoZWFkc1tpXSk7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZmV0Y2guYyBiL2ZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViNmJmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZldGNoLmMKQEAgLTAsMCArMSwzMTYgQEAKKyNpbmNsdWRlICJmZXRjaC5oIgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAidHJlZS13YWxrLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJzdHJidWYuaCIKKworaW50IGdldF90cmVlID0gMDsKK2ludCBnZXRfaGlzdG9yeSA9IDA7CitpbnQgZ2V0X2FsbCA9IDA7CitpbnQgZ2V0X3ZlcmJvc2VseSA9IDA7CitpbnQgZ2V0X3JlY292ZXIgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgY3VycmVudF9jb21taXRfc2hhMVsyMF07CisKK3ZvaWQgcHVsbF9zYXkoY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpoZXgpIAoreworCWlmIChnZXRfdmVyYm9zZWx5KQorCQlmcHJpbnRmKHN0ZGVyciwgZm10LCBoZXgpOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfbWlzc2luZyhjb25zdCBjaGFyICp3aGF0LCBjb25zdCB1bnNpZ25lZCBjaGFyICptaXNzaW5nKQoreworCWNoYXIgbWlzc2luZ19oZXhbNDFdOworCisJc3RyY3B5KG1pc3NpbmdfaGV4LCBzaGExX3RvX2hleChtaXNzaW5nKSk7OworCWZwcmludGYoc3RkZXJyLAorCQkiQ2Fubm90IG9idGFpbiBuZWVkZWQgJXMgJXNcbndoaWxlIHByb2Nlc3NpbmcgY29tbWl0ICVzLlxuIiwKKwkJd2hhdCwgbWlzc2luZ19oZXgsIHNoYTFfdG9faGV4KGN1cnJlbnRfY29tbWl0X3NoYTEpKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzKHN0cnVjdCBvYmplY3QgKm9iaik7CisKK3N0YXRpYyBpbnQgcHJvY2Vzc190cmVlKHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKworCWlmIChwYXJzZV90cmVlKHRyZWUpKQorCQlyZXR1cm4gLTE7CisKKwlkZXNjLmJ1ZiA9IHRyZWUtPmJ1ZmZlcjsKKwlkZXNjLnNpemUgPSB0cmVlLT5zaXplOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IE5VTEw7CisKKwkJaWYgKFNfSVNESVIoZW50cnkubW9kZSkpIHsKKwkJCXN0cnVjdCB0cmVlICp0cmVlID0gbG9va3VwX3RyZWUoZW50cnkuc2hhMSk7CisJCQlpZiAodHJlZSkKKwkJCQlvYmogPSAmdHJlZS0+b2JqZWN0OworCQl9CisJCWVsc2UgeworCQkJc3RydWN0IGJsb2IgKmJsb2IgPSBsb29rdXBfYmxvYihlbnRyeS5zaGExKTsKKwkJCWlmIChibG9iKQorCQkJCW9iaiA9ICZibG9iLT5vYmplY3Q7CisJCX0KKwkJaWYgKCFvYmogfHwgcHJvY2VzcyhvYmopKQorCQkJcmV0dXJuIC0xOworCX0KKwlmcmVlKHRyZWUtPmJ1ZmZlcik7CisJdHJlZS0+YnVmZmVyID0gTlVMTDsKKwl0cmVlLT5zaXplID0gMDsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBDT01QTEVURQkoMVUgPDwgMCkKKyNkZWZpbmUgU0VFTgkJKDFVIDw8IDEpCisjZGVmaW5lIFRPX1NDQU4JCSgxVSA8PCAyKQorCitzdGF0aWMgc3RydWN0IGNvbW1pdF9saXN0ICpjb21wbGV0ZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21taXQoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCWlmIChwYXJzZV9jb21taXQoY29tbWl0KSkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKGNvbXBsZXRlICYmIGNvbXBsZXRlLT5pdGVtLT5kYXRlID49IGNvbW1pdC0+ZGF0ZSkgeworCQlwb3BfbW9zdF9yZWNlbnRfY29tbWl0KCZjb21wbGV0ZSwgQ09NUExFVEUpOworCX0KKworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIENPTVBMRVRFKQorCQlyZXR1cm4gMDsKKworCW1lbWNweShjdXJyZW50X2NvbW1pdF9zaGExLCBjb21taXQtPm9iamVjdC5zaGExLCAyMCk7CisKKwlwdWxsX3NheSgid2FsayAlc1xuIiwgc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSkpOworCisJaWYgKGdldF90cmVlKSB7CisJCWlmIChwcm9jZXNzKCZjb21taXQtPnRyZWUtPm9iamVjdCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghZ2V0X2FsbCkKKwkJCWdldF90cmVlID0gMDsKKwl9CisJaWYgKGdldF9oaXN0b3J5KSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwkJZm9yICg7IHBhcmVudHM7IHBhcmVudHMgPSBwYXJlbnRzLT5uZXh0KSB7CisJCQlpZiAocHJvY2VzcygmcGFyZW50cy0+aXRlbS0+b2JqZWN0KSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc190YWcoc3RydWN0IHRhZyAqdGFnKQoreworCWlmIChwYXJzZV90YWcodGFnKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwcm9jZXNzKHRhZy0+dGFnZ2VkKTsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqcHJvY2Vzc19xdWV1ZSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICoqcHJvY2Vzc19xdWV1ZV9lbmQgPSAmcHJvY2Vzc19xdWV1ZTsKKworc3RhdGljIGludCBwcm9jZXNzX29iamVjdChzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCWlmIChwcm9jZXNzX2NvbW1pdCgoc3RydWN0IGNvbW1pdCAqKW9iaikpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOworCX0KKwlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKSB7CisJCWlmIChwcm9jZXNzX3RyZWUoKHN0cnVjdCB0cmVlICopb2JqKSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChvYmotPnR5cGUgPT0gT0JKX1RBRykgeworCQlpZiAocHJvY2Vzc190YWcoKHN0cnVjdCB0YWcgKilvYmopKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHJlcXVpcmVtZW50cyAiCisJCSAgICAgIm9mIHR5cGUgJXMgZm9yICVzIiwKKwkJICAgICB0eXBlbmFtZShvYmotPnR5cGUpLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKK30KKworc3RhdGljIGludCBwcm9jZXNzKHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpZiAob2JqLT5mbGFncyAmIFNFRU4pCisJCXJldHVybiAwOworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKworCWlmIChoYXNfc2hhMV9maWxlKG9iai0+c2hhMSkpIHsKKwkJLyogV2UgYWxyZWFkeSBoYXZlIGl0LCBzbyB3ZSBzaG91bGQgc2NhbiBpdCBub3cuICovCisJCW9iai0+ZmxhZ3MgfD0gVE9fU0NBTjsKKwl9CisJZWxzZSB7CisJCWlmIChvYmotPmZsYWdzICYgQ09NUExFVEUpCisJCQlyZXR1cm4gMDsKKwkJcHJlZmV0Y2gob2JqLT5zaGExKTsKKwl9CisJCQorCW9iamVjdF9saXN0X2luc2VydChvYmosIHByb2Nlc3NfcXVldWVfZW5kKTsKKwlwcm9jZXNzX3F1ZXVlX2VuZCA9ICYoKnByb2Nlc3NfcXVldWVfZW5kKS0+bmV4dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb29wKHZvaWQpCit7CisJc3RydWN0IG9iamVjdF9saXN0ICplbGVtOworCisJd2hpbGUgKHByb2Nlc3NfcXVldWUpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gcHJvY2Vzc19xdWV1ZS0+aXRlbTsKKwkJZWxlbSA9IHByb2Nlc3NfcXVldWU7CisJCXByb2Nlc3NfcXVldWUgPSBlbGVtLT5uZXh0OworCQlmcmVlKGVsZW0pOworCQlpZiAoIXByb2Nlc3NfcXVldWUpCisJCQlwcm9jZXNzX3F1ZXVlX2VuZCA9ICZwcm9jZXNzX3F1ZXVlOworCisJCS8qIElmIHdlIGFyZSBub3Qgc2Nhbm5pbmcgdGhpcyBvYmplY3QsIHdlIHBsYWNlZCBpdCBpbgorCQkgKiB0aGUgcXVldWUgYmVjYXVzZSB3ZSBuZWVkZWQgdG8gZmV0Y2ggaXQgZmlyc3QuCisJCSAqLworCQlpZiAoISAob2JqLT5mbGFncyAmIFRPX1NDQU4pKSB7CisJCQlpZiAoZmV0Y2gob2JqLT5zaGExKSkgeworCQkJCXJlcG9ydF9taXNzaW5nKHR5cGVuYW1lKG9iai0+dHlwZSksIG9iai0+c2hhMSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCWlmICghb2JqLT50eXBlKQorCQkJcGFyc2Vfb2JqZWN0KG9iai0+c2hhMSk7CisJCWlmIChwcm9jZXNzX29iamVjdChvYmopKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlcnByZXRfdGFyZ2V0KGNoYXIgKnRhcmdldCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoIWdldF9zaGExX2hleCh0YXJnZXQsIHNoYTEpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWNoZWNrX3JlZl9mb3JtYXQodGFyZ2V0KSkgeworCQlpZiAoIWZldGNoX3JlZih0YXJnZXQsIHNoYTEpKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbWFya19jb21wbGV0ZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlX2dlbnRseShzaGExLCAxKTsKKwlpZiAoY29tbWl0KSB7CisJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IENPTVBMRVRFOworCQlpbnNlcnRfYnlfZGF0ZShjb21taXQsICZjb21wbGV0ZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcHVsbF90YXJnZXRzX3N0ZGluKGNoYXIgKioqdGFyZ2V0LCBjb25zdCBjaGFyICoqKndyaXRlX3JlZikKK3sKKwlpbnQgdGFyZ2V0cyA9IDAsIHRhcmdldHNfYWxsb2MgPSAwOworCXN0cnVjdCBzdHJidWYgYnVmOworCSp0YXJnZXQgPSBOVUxMOyAqd3JpdGVfcmVmID0gTlVMTDsKKwlzdHJidWZfaW5pdCgmYnVmKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpyZl9vbmUgPSBOVUxMOworCQljaGFyICp0Z19vbmU7CisKKwkJcmVhZF9saW5lKCZidWYsIHN0ZGluLCAnXG4nKTsKKwkJaWYgKGJ1Zi5lb2YpCisJCQlicmVhazsKKwkJdGdfb25lID0gYnVmLmJ1ZjsKKwkJcmZfb25lID0gc3RyY2hyKHRnX29uZSwgJ1x0Jyk7CisJCWlmIChyZl9vbmUpCisJCQkqcmZfb25lKysgPSAwOworCisJCWlmICh0YXJnZXRzID49IHRhcmdldHNfYWxsb2MpIHsKKwkJCXRhcmdldHNfYWxsb2MgPSB0YXJnZXRzX2FsbG9jID8gdGFyZ2V0c19hbGxvYyAqIDIgOiA2NDsKKwkJCSp0YXJnZXQgPSB4cmVhbGxvYygqdGFyZ2V0LCB0YXJnZXRzX2FsbG9jICogc2l6ZW9mKCoqdGFyZ2V0KSk7CisJCQkqd3JpdGVfcmVmID0geHJlYWxsb2MoKndyaXRlX3JlZiwgdGFyZ2V0c19hbGxvYyAqIHNpemVvZigqKndyaXRlX3JlZikpOworCQl9CisJCSgqdGFyZ2V0KVt0YXJnZXRzXSA9IHN0cmR1cCh0Z19vbmUpOworCQkoKndyaXRlX3JlZilbdGFyZ2V0c10gPSByZl9vbmUgPyBzdHJkdXAocmZfb25lKSA6IE5VTEw7CisJCXRhcmdldHMrKzsKKwl9CisJcmV0dXJuIHRhcmdldHM7Cit9CisKK3ZvaWQgcHVsbF90YXJnZXRzX2ZyZWUoaW50IHRhcmdldHMsIGNoYXIgKip0YXJnZXQsIGNvbnN0IGNoYXIgKip3cml0ZV9yZWYpCit7CisJd2hpbGUgKHRhcmdldHMtLSkgeworCQlmcmVlKHRhcmdldFt0YXJnZXRzXSk7CisJCWlmICh3cml0ZV9yZWYgJiYgd3JpdGVfcmVmW3RhcmdldHNdKQorCQkJZnJlZSgoY2hhciAqKSB3cml0ZV9yZWZbdGFyZ2V0c10pOworCX0KK30KKworaW50IHB1bGwoaW50IHRhcmdldHMsIGNoYXIgKip0YXJnZXQsIGNvbnN0IGNoYXIgKip3cml0ZV9yZWYsCisgICAgICAgICBjb25zdCBjaGFyICp3cml0ZV9yZWZfbG9nX2RldGFpbHMpCit7CisJc3RydWN0IHJlZl9sb2NrICoqbG9jayA9IHhjYWxsb2ModGFyZ2V0cywgc2l6ZW9mKHN0cnVjdCByZWZfbG9jayAqKSk7CisJdW5zaWduZWQgY2hhciAqc2hhMSA9IHhtYWxsb2ModGFyZ2V0cyAqIDIwKTsKKwljaGFyICptc2c7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXNhdmVfY29tbWl0X2J1ZmZlciA9IDA7CisJdHJhY2tfb2JqZWN0X3JlZnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHRhcmdldHM7IGkrKykgeworCQlpZiAoIXdyaXRlX3JlZiB8fCAhd3JpdGVfcmVmW2ldKQorCQkJY29udGludWU7CisKKwkJbG9ja1tpXSA9IGxvY2tfcmVmX3NoYTEod3JpdGVfcmVmW2ldLCBOVUxMLCAwKTsKKwkJaWYgKCFsb2NrW2ldKSB7CisJCQllcnJvcigiQ2FuJ3QgbG9jayByZWYgJXMiLCB3cml0ZV9yZWZbaV0pOworCQkJZ290byB1bmxvY2tfYW5kX2ZhaWw7CisJCX0KKwl9CisKKwlpZiAoIWdldF9yZWNvdmVyKQorCQlmb3JfZWFjaF9yZWYobWFya19jb21wbGV0ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0czsgaSsrKSB7CisJCWlmIChpbnRlcnByZXRfdGFyZ2V0KHRhcmdldFtpXSwgJnNoYTFbMjAgKiBpXSkpIHsKKwkJCWVycm9yKCJDb3VsZCBub3QgaW50ZXJwcmV0ICVzIGFzIHNvbWV0aGluZyB0byBwdWxsIiwgdGFyZ2V0W2ldKTsKKwkJCWdvdG8gdW5sb2NrX2FuZF9mYWlsOworCQl9CisJCWlmIChwcm9jZXNzKGxvb2t1cF91bmtub3duX29iamVjdCgmc2hhMVsyMCAqIGldKSkpCisJCQlnb3RvIHVubG9ja19hbmRfZmFpbDsKKwl9CisKKwlpZiAobG9vcCgpKQorCQlnb3RvIHVubG9ja19hbmRfZmFpbDsKKworCWlmICh3cml0ZV9yZWZfbG9nX2RldGFpbHMpIHsKKwkJbXNnID0geG1hbGxvYyhzdHJsZW4od3JpdGVfcmVmX2xvZ19kZXRhaWxzKSArIDEyKTsKKwkJc3ByaW50Zihtc2csICJmZXRjaCBmcm9tICVzIiwgd3JpdGVfcmVmX2xvZ19kZXRhaWxzKTsKKwl9IGVsc2UgeworCQltc2cgPSBOVUxMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0czsgaSsrKSB7CisJCWlmICghd3JpdGVfcmVmIHx8ICF3cml0ZV9yZWZbaV0pCisJCQljb250aW51ZTsKKwkJcmV0ID0gd3JpdGVfcmVmX3NoYTEobG9ja1tpXSwgJnNoYTFbMjAgKiBpXSwgbXNnID8gbXNnIDogImZldGNoICh1bmtub3duKSIpOworCQlsb2NrW2ldID0gTlVMTDsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5sb2NrX2FuZF9mYWlsOworCX0KKwlpZiAobXNnKQorCQlmcmVlKG1zZyk7CisKKwlyZXR1cm4gMDsKKworCit1bmxvY2tfYW5kX2ZhaWw6CisJZm9yIChpID0gMDsgaSA8IHRhcmdldHM7IGkrKykKKwkJaWYgKGxvY2tbaV0pCisJCQl1bmxvY2tfcmVmKGxvY2tbaV0pOworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2ZldGNoLmggYi9mZXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDhjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mZXRjaC5oCkBAIC0wLDAgKzEsNTQgQEAKKyNpZm5kZWYgUFVMTF9ICisjZGVmaW5lIFBVTExfSAorCisvKgorICogRmV0Y2ggb2JqZWN0IGdpdmVuIFNIQTEgZnJvbSB0aGUgcmVtb3RlLCBhbmQgc3RvcmUgaXQgbG9jYWxseSB1bmRlcgorICogR0lUX09CSkVDVF9ESVJFQ1RPUlkuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLiAgVG8gYmUKKyAqIHByb3ZpZGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uLgorICovCitleHRlcm4gaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKgorICogRmV0Y2ggdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHN0b3JlIGl0IGxvY2FsbHk7IGZldGNoKCkgd2lsbCBiZQorICogY2FsbGVkIGxhdGVyIHRvIGRldGVybWluZSBzdWNjZXNzLiBUbyBiZSBwcm92aWRlZCBieSB0aGUgcGFydGljdWxhcgorICogaW1wbGVtZW50YXRpb24uCisgKi8KK2V4dGVybiB2b2lkIHByZWZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCisvKgorICogRmV0Y2ggcmVmIChyZWxhdGl2ZSB0byAkR0lUX0RJUi9yZWZzKSBmcm9tIHRoZSByZW1vdGUsIGFuZCBzdG9yZQorICogdGhlIDIwLWJ5dGUgU0hBMSBpbiBzaGExLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4gIFRvCisgKiBiZSBwcm92aWRlZCBieSB0aGUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbi4KKyAqLworZXh0ZXJuIGludCBmZXRjaF9yZWYoY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworLyogU2V0IHRvIGZldGNoIHRoZSB0YXJnZXQgdHJlZS4gKi8KK2V4dGVybiBpbnQgZ2V0X3RyZWU7CisKKy8qIFNldCB0byBmZXRjaCB0aGUgY29tbWl0IGhpc3RvcnkuICovCitleHRlcm4gaW50IGdldF9oaXN0b3J5OworCisvKiBTZXQgdG8gZmV0Y2ggdGhlIHRyZWVzIGluIHRoZSBjb21taXQgaGlzdG9yeS4gKi8KK2V4dGVybiBpbnQgZ2V0X2FsbDsKKworLyogU2V0IHRvIGJlIHZlcmJvc2UgKi8KK2V4dGVybiBpbnQgZ2V0X3ZlcmJvc2VseTsKKworLyogU2V0IHRvIGNoZWNrIG9uIGFsbCByZWFjaGFibGUgb2JqZWN0cy4gKi8KK2V4dGVybiBpbnQgZ2V0X3JlY292ZXI7CisKKy8qIFJlcG9ydCB3aGF0IHdlIGdvdCB1bmRlciBnZXRfdmVyYm9zZWx5ICovCitleHRlcm4gdm9pZCBwdWxsX3NheShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKy8qIExvYWQgcHVsbCB0YXJnZXRzIGZyb20gc3RkaW4gKi8KK2V4dGVybiBpbnQgcHVsbF90YXJnZXRzX3N0ZGluKGNoYXIgKioqdGFyZ2V0LCBjb25zdCBjaGFyICoqKndyaXRlX3JlZik7CisKKy8qIEZyZWUgdXAgbG9hZGVkIHRhcmdldHMgKi8KK2V4dGVybiB2b2lkIHB1bGxfdGFyZ2V0c19mcmVlKGludCB0YXJnZXRzLCBjaGFyICoqdGFyZ2V0LCBjb25zdCBjaGFyICoqd3JpdGVfcmVmKTsKKworLyogSWYgd3JpdGVfcmVmIGlzIHNldCwgdGhlIHJlZiBmaWxlbmFtZSB0byB3cml0ZSB0aGUgdGFyZ2V0IHZhbHVlIHRvLiAqLworLyogSWYgd3JpdGVfcmVmX2xvZ19kZXRhaWxzIGlzIHNldCwgYWRkaXRpb25hbCB0ZXh0IHdpbGwgYXBwZWFyIGluIHRoZSByZWYgbG9nLiAqLworZXh0ZXJuIGludCBwdWxsKGludCB0YXJnZXRzLCBjaGFyICoqdGFyZ2V0LCBjb25zdCBjaGFyICoqd3JpdGVfcmVmLAorCQljb25zdCBjaGFyICp3cml0ZV9yZWZfbG9nX2RldGFpbHMpOworCisjZW5kaWYgLyogUFVMTF9IICovCmRpZmYgLS1naXQgYS9mc2NrLW9iamVjdHMuYyBiL2ZzY2stb2JqZWN0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNjdmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9mc2NrLW9iamVjdHMuYwpAQCAtMCwwICsxLDU5OSBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiY2FjaGUtdHJlZS5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorCisjZGVmaW5lIFJFQUNIQUJMRSAweDAwMDEKKyNkZWZpbmUgU0VFTiAgICAgIDB4MDAwMgorCitzdGF0aWMgaW50IHNob3dfcm9vdCA9IDA7CitzdGF0aWMgaW50IHNob3dfdGFncyA9IDA7CitzdGF0aWMgaW50IHNob3dfdW5yZWFjaGFibGUgPSAwOworc3RhdGljIGludCBjaGVja19mdWxsID0gMDsKK3N0YXRpYyBpbnQgY2hlY2tfc3RyaWN0ID0gMDsKK3N0YXRpYyBpbnQga2VlcF9jYWNoZV9vYmplY3RzID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYWRfc2hhMVsyMF07CisKKyNpZmRlZiBOT19EX0lOT19JTl9ESVJFTlQKKyNkZWZpbmUgU09SVF9ESVJFTlQgMAorI2RlZmluZSBESVJFTlRfU09SVF9ISU5UKGRlKSAwCisjZWxzZQorI2RlZmluZSBTT1JUX0RJUkVOVCAxCisjZGVmaW5lIERJUkVOVF9TT1JUX0hJTlQoZGUpICgoZGUpLT5kX2lubykKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvYmpyZXBvcnQoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCWZwcmludGYoc3RkZXJyLCAiJXMgaW4gJXMgJXM6ICIsCisJICAgICAgICBzZXZlcml0eSwgdHlwZW5hbWUob2JqLT50eXBlKSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJdmZwcmludGYoc3RkZXJyLCBlcnIsIHBhcmFtcyk7CisJZnB1dHMoIlxuIiwgc3RkZXJyKTsKK30KKworc3RhdGljIGludCBvYmplcnJvcihzdHJ1Y3Qgb2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKmVyciwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlvYmpyZXBvcnQob2JqLCAiZXJyb3IiLCBlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IG9iandhcm5pbmcoc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJb2JqcmVwb3J0KG9iaiwgIndhcm5pbmciLCBlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX2Nvbm5lY3Rpdml0eSh2b2lkKQoreworCWludCBpLCBtYXg7CisKKwkvKiBMb29rIHVwIGFsbCB0aGUgcmVxdWlyZW1lbnRzLCB3YXJuIGFib3V0IG1pc3Npbmcgb2JqZWN0cy4uICovCisJbWF4ID0gZ2V0X21heF9vYmplY3RfaW5kZXgoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IG9iamVjdF9yZWZzICpyZWZzOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBnZXRfaW5kZXhlZF9vYmplY3QoaSk7CisKKwkJaWYgKCFvYmopCisJCQljb250aW51ZTsKKworCQlpZiAoIW9iai0+cGFyc2VkKSB7CisJCQlpZiAoaGFzX3NoYTFfZmlsZShvYmotPnNoYTEpKQorCQkJCTsgLyogaXQgaXMgaW4gcGFjayAqLworCQkJZWxzZQorCQkJCXByaW50ZigibWlzc2luZyAlcyAlc1xuIiwKKwkJCQkgICAgICAgdHlwZW5hbWUob2JqLT50eXBlKSwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJlZnMgPSBsb29rdXBfb2JqZWN0X3JlZnMob2JqKTsKKwkJaWYgKHJlZnMpIHsKKwkJCXVuc2lnbmVkIGo7CisJCQlmb3IgKGogPSAwOyBqIDwgcmVmcy0+Y291bnQ7IGorKykgeworCQkJCXN0cnVjdCBvYmplY3QgKnJlZiA9IHJlZnMtPnJlZltqXTsKKwkJCQlpZiAocmVmLT5wYXJzZWQgfHwKKwkJCQkgICAgKGhhc19zaGExX2ZpbGUocmVmLT5zaGExKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXByaW50ZigiYnJva2VuIGxpbmsgZnJvbSAlN3MgJXNcbiIsCisJCQkJICAgICAgIHR5cGVuYW1lKG9iai0+dHlwZSksIHNoYTFfdG9faGV4KG9iai0+c2hhMSkpOworCQkJCXByaW50ZigiICAgICAgICAgICAgICB0byAlN3MgJXNcbiIsCisJCQkJICAgICAgIHR5cGVuYW1lKHJlZi0+dHlwZSksIHNoYTFfdG9faGV4KHJlZi0+c2hhMSkpOworCQkJfQorCQl9CisKKwkJaWYgKHNob3dfdW5yZWFjaGFibGUgJiYgIShvYmotPmZsYWdzICYgUkVBQ0hBQkxFKSkgeworCQkJcHJpbnRmKCJ1bnJlYWNoYWJsZSAlcyAlc1xuIiwKKwkJCSAgICAgICB0eXBlbmFtZShvYmotPnR5cGUpLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFvYmotPnVzZWQpIHsKKwkJCXByaW50ZigiZGFuZ2xpbmcgJXMgJXNcbiIsIHR5cGVuYW1lKG9iai0+dHlwZSksCisJCQkgICAgICAgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBUaGUgZW50cmllcyBpbiBhIHRyZWUgYXJlIG9yZGVyZWQgaW4gdGhlIF9wYXRoXyBvcmRlciwKKyAqIHdoaWNoIG1lYW5zIHRoYXQgYSBkaXJlY3RvcnkgZW50cnkgaXMgb3JkZXJlZCBieSBhZGRpbmcKKyAqIGEgc2xhc2ggdG8gdGhlIGVuZCBvZiBpdC4KKyAqCisgKiBTbyBhIGRpcmVjdG9yeSBjYWxsZWQgImEiIGlzIG9yZGVyZWQgX2FmdGVyXyBhIGZpbGUKKyAqIGNhbGxlZCAiYS5jIiwgYmVjYXVzZSAiYS8iIHNvcnRzIGFmdGVyICJhLmMiLgorICovCisjZGVmaW5lIFRSRUVfVU5PUkRFUkVEICgtMSkKKyNkZWZpbmUgVFJFRV9IQVNfRFVQUyAgKC0yKQorCitzdGF0aWMgaW50IHZlcmlmeV9vcmRlcmVkKHVuc2lnbmVkIG1vZGUxLCBjb25zdCBjaGFyICpuYW1lMSwgdW5zaWduZWQgbW9kZTIsIGNvbnN0IGNoYXIgKm5hbWUyKQoreworCWludCBsZW4xID0gc3RybGVuKG5hbWUxKTsKKwlpbnQgbGVuMiA9IHN0cmxlbihuYW1lMik7CisJaW50IGxlbiA9IGxlbjEgPCBsZW4yID8gbGVuMSA6IGxlbjI7CisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisJaW50IGNtcDsKKworCWNtcCA9IG1lbWNtcChuYW1lMSwgbmFtZTIsIGxlbik7CisJaWYgKGNtcCA8IDApCisJCXJldHVybiAwOworCWlmIChjbXAgPiAwKQorCQlyZXR1cm4gVFJFRV9VTk9SREVSRUQ7CisKKwkvKgorCSAqIE9rLCB0aGUgZmlyc3QgPGxlbj4gY2hhcmFjdGVycyBhcmUgdGhlIHNhbWUuCisJICogTm93IHdlIG5lZWQgdG8gb3JkZXIgdGhlIG5leHQgb25lLCBidXQgdHVybgorCSAqIGEgJ1wwJyBpbnRvIGEgJy8nIGZvciBhIGRpcmVjdG9yeSBlbnRyeS4KKwkgKi8KKwljMSA9IG5hbWUxW2xlbl07CisJYzIgPSBuYW1lMltsZW5dOworCWlmICghYzEgJiYgIWMyKQorCQkvKgorCQkgKiBnaXQtd3JpdGUtdHJlZSB1c2VkIHRvIHdyaXRlIG91dCBhIG5vbnNlbnNlIHRyZWUgdGhhdCBoYXMKKwkJICogZW50cmllcyB3aXRoIHRoZSBzYW1lIG5hbWUsIG9uZSBibG9iIGFuZCBvbmUgdHJlZS4gIE1ha2UKKwkJICogc3VyZSB3ZSBkbyBub3QgaGF2ZSBkdXBsaWNhdGUgZW50cmllcy4KKwkJICovCisJCXJldHVybiBUUkVFX0hBU19EVVBTOworCWlmICghYzEgJiYgU19JU0RJUihtb2RlMSkpCisJCWMxID0gJy8nOworCWlmICghYzIgJiYgU19JU0RJUihtb2RlMikpCisJCWMyID0gJy8nOworCXJldHVybiBjMSA8IGMyID8gMCA6IFRSRUVfVU5PUkRFUkVEOworfQorCitzdGF0aWMgaW50IGZzY2tfdHJlZShzdHJ1Y3QgdHJlZSAqaXRlbSkKK3sKKwlpbnQgcmV0dmFsOworCWludCBoYXNfZnVsbF9wYXRoID0gMDsKKwlpbnQgaGFzX3plcm9fcGFkID0gMDsKKwlpbnQgaGFzX2JhZF9tb2RlcyA9IDA7CisJaW50IGhhc19kdXBfZW50cmllcyA9IDA7CisJaW50IG5vdF9wcm9wZXJseV9zb3J0ZWQgPSAwOworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwl1bnNpZ25lZCBvX21vZGU7CisJY29uc3QgY2hhciAqb19uYW1lOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9fc2hhMTsKKworCWRlc2MuYnVmID0gaXRlbS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IGl0ZW0tPnNpemU7CisKKwlvX21vZGUgPSAwOworCW9fbmFtZSA9IE5VTEw7CisJb19zaGExID0gTlVMTDsKKwl3aGlsZSAoZGVzYy5zaXplKSB7CisJCXVuc2lnbmVkIG1vZGU7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTE7CisKKwkJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCgmZGVzYywgJm5hbWUsICZtb2RlKTsKKworCQlpZiAoc3RyY2hyKG5hbWUsICcvJykpCisJCQloYXNfZnVsbF9wYXRoID0gMTsKKwkJaGFzX3plcm9fcGFkIHw9ICooY2hhciAqKWRlc2MuYnVmID09ICcwJzsKKwkJdXBkYXRlX3RyZWVfZW50cnkoJmRlc2MpOworCisJCXN3aXRjaCAobW9kZSkgeworCQkvKgorCQkgKiBTdGFuZGFyZCBtb2Rlcy4uCisJCSAqLworCQljYXNlIFNfSUZSRUcgfCAwNzU1OgorCQljYXNlIFNfSUZSRUcgfCAwNjQ0OgorCQljYXNlIFNfSUZMTks6CisJCWNhc2UgU19JRkRJUjoKKwkJCWJyZWFrOworCQkvKgorCQkgKiBUaGlzIGlzIG5vbnN0YW5kYXJkLCBidXQgd2UgaGFkIGEgZmV3IG9mIHRoZXNlCisJCSAqIGVhcmx5IG9uIHdoZW4gd2UgaG9ub3JlZCB0aGUgZnVsbCBzZXQgb2YgbW9kZQorCQkgKiBiaXRzLi4KKwkJICovCisJCWNhc2UgU19JRlJFRyB8IDA2NjQ6CisJCQlpZiAoIWNoZWNrX3N0cmljdCkKKwkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWhhc19iYWRfbW9kZXMgPSAxOworCQl9CisKKwkJaWYgKG9fbmFtZSkgeworCQkJc3dpdGNoICh2ZXJpZnlfb3JkZXJlZChvX21vZGUsIG9fbmFtZSwgbW9kZSwgbmFtZSkpIHsKKwkJCWNhc2UgVFJFRV9VTk9SREVSRUQ6CisJCQkJbm90X3Byb3Blcmx5X3NvcnRlZCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIFRSRUVfSEFTX0RVUFM6CisJCQkJaGFzX2R1cF9lbnRyaWVzID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlvX21vZGUgPSBtb2RlOworCQlvX25hbWUgPSBuYW1lOworCQlvX3NoYTEgPSBzaGExOworCX0KKwlmcmVlKGl0ZW0tPmJ1ZmZlcik7CisJaXRlbS0+YnVmZmVyID0gTlVMTDsKKworCXJldHZhbCA9IDA7CisJaWYgKGhhc19mdWxsX3BhdGgpIHsKKwkJb2Jqd2FybmluZygmaXRlbS0+b2JqZWN0LCAiY29udGFpbnMgZnVsbCBwYXRobmFtZXMiKTsKKwl9CisJaWYgKGhhc196ZXJvX3BhZCkgeworCQlvYmp3YXJuaW5nKCZpdGVtLT5vYmplY3QsICJjb250YWlucyB6ZXJvLXBhZGRlZCBmaWxlIG1vZGVzIik7CisJfQorCWlmIChoYXNfYmFkX21vZGVzKSB7CisJCW9iandhcm5pbmcoJml0ZW0tPm9iamVjdCwgImNvbnRhaW5zIGJhZCBmaWxlIG1vZGVzIik7CisJfQorCWlmIChoYXNfZHVwX2VudHJpZXMpIHsKKwkJcmV0dmFsID0gb2JqZXJyb3IoJml0ZW0tPm9iamVjdCwgImNvbnRhaW5zIGR1cGxpY2F0ZSBmaWxlIGVudHJpZXMiKTsKKwl9CisJaWYgKG5vdF9wcm9wZXJseV9zb3J0ZWQpIHsKKwkJcmV0dmFsID0gb2JqZXJyb3IoJml0ZW0tPm9iamVjdCwgIm5vdCBwcm9wZXJseSBzb3J0ZWQiKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBmc2NrX2NvbW1pdChzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJY2hhciAqYnVmZmVyID0gY29tbWl0LT5idWZmZXI7CisJdW5zaWduZWQgY2hhciB0cmVlX3NoYTFbMjBdLCBzaGExWzIwXTsKKworCWlmIChtZW1jbXAoYnVmZmVyLCAidHJlZSAiLCA1KSkKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgZm9ybWF0IC0gZXhwZWN0ZWQgJ3RyZWUnIGxpbmUiKTsKKwlpZiAoZ2V0X3NoYTFfaGV4KGJ1ZmZlcis1LCB0cmVlX3NoYTEpIHx8IGJ1ZmZlcls0NV0gIT0gJ1xuJykKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgJ3RyZWUnIGxpbmUgZm9ybWF0IC0gYmFkIHNoYTEiKTsKKwlidWZmZXIgKz0gNDY7CisJd2hpbGUgKCFtZW1jbXAoYnVmZmVyLCAicGFyZW50ICIsIDcpKSB7CisJCWlmIChnZXRfc2hhMV9oZXgoYnVmZmVyKzcsIHNoYTEpIHx8IGJ1ZmZlcls0N10gIT0gJ1xuJykKKwkJCXJldHVybiBvYmplcnJvcigmY29tbWl0LT5vYmplY3QsICJpbnZhbGlkICdwYXJlbnQnIGxpbmUgZm9ybWF0IC0gYmFkIHNoYTEiKTsKKwkJYnVmZmVyICs9IDQ4OworCX0KKwlpZiAobWVtY21wKGJ1ZmZlciwgImF1dGhvciAiLCA3KSkKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImludmFsaWQgZm9ybWF0IC0gZXhwZWN0ZWQgJ2F1dGhvcicgbGluZSIpOworCWZyZWUoY29tbWl0LT5idWZmZXIpOworCWNvbW1pdC0+YnVmZmVyID0gTlVMTDsKKwlpZiAoIWNvbW1pdC0+dHJlZSkKKwkJcmV0dXJuIG9iamVycm9yKCZjb21taXQtPm9iamVjdCwgImNvdWxkIG5vdCBsb2FkIGNvbW1pdCdzIHRyZWUgJXMiLCB0cmVlX3NoYTEpOworCWlmICghY29tbWl0LT5wYXJlbnRzICYmIHNob3dfcm9vdCkKKwkJcHJpbnRmKCJyb290ICVzXG4iLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJaWYgKCFjb21taXQtPmRhdGUpCisJCXByaW50ZigiYmFkIGNvbW1pdCBkYXRlIGluICVzXG4iLCAKKwkJICAgICAgIHNoYTFfdG9faGV4KGNvbW1pdC0+b2JqZWN0LnNoYTEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2NrX3RhZyhzdHJ1Y3QgdGFnICp0YWcpCit7CisJc3RydWN0IG9iamVjdCAqdGFnZ2VkID0gdGFnLT50YWdnZWQ7CisKKwlpZiAoIXRhZ2dlZCkgeworCQlyZXR1cm4gb2JqZXJyb3IoJnRhZy0+b2JqZWN0LCAiY291bGQgbm90IGxvYWQgdGFnZ2VkIG9iamVjdCIpOworCX0KKwlpZiAoIXNob3dfdGFncykKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoInRhZ2dlZCAlcyAlcyIsIHR5cGVuYW1lKHRhZ2dlZC0+dHlwZSksIHNoYTFfdG9faGV4KHRhZ2dlZC0+c2hhMSkpOworCXByaW50ZigiICglcykgaW4gJXNcbiIsIHRhZy0+dGFnLCBzaGExX3RvX2hleCh0YWctPm9iamVjdC5zaGExKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19zaGExKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCWlmICghb2JqKQorCQlyZXR1cm4gZXJyb3IoIiVzOiBvYmplY3Qgbm90IGZvdW5kIiwgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChvYmotPmZsYWdzICYgU0VFTikKKwkJcmV0dXJuIDA7CisJb2JqLT5mbGFncyB8PSBTRUVOOworCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpCisJCXJldHVybiAwOworCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpCisJCXJldHVybiBmc2NrX3RyZWUoKHN0cnVjdCB0cmVlICopIG9iaik7CisJaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gZnNja19jb21taXQoKHN0cnVjdCBjb21taXQgKikgb2JqKTsKKwlpZiAob2JqLT50eXBlID09IE9CSl9UQUcpCisJCXJldHVybiBmc2NrX3RhZygoc3RydWN0IHRhZyAqKSBvYmopOworCS8qIEJ5IG5vdywgcGFyc2Vfb2JqZWN0KCkgd291bGQndmUgcmV0dXJuZWQgTlVMTCBpbnN0ZWFkLiAqLworCXJldHVybiBvYmplcnJvcihvYmosICJ1bmtub3duIHR5cGUgJyVkJyAoaW50ZXJuYWwgZnNjayBlcnJvcikiLCBvYmotPnR5cGUpOworfQorCisvKgorICogVGhpcyBpcyB0aGUgc29ydGluZyBjaHVuayBzaXplOiBtYWtlIGl0IHJlYXNvbmFibHkKKyAqIGJpZyBzbyB0aGF0IHdlIGNhbiBzb3J0IHdlbGwuLgorICovCisjZGVmaW5lIE1BWF9TSEExX0VOVFJJRVMgKDEwMjQpCisKK3N0cnVjdCBzaGExX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIGlubzsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBucjsKKwlzdHJ1Y3Qgc2hhMV9lbnRyeSAqZW50cnlbTUFYX1NIQTFfRU5UUklFU107Cit9IHNoYTFfbGlzdDsKKworc3RhdGljIGludCBpbm9fY29tcGFyZShjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJY29uc3Qgc3RydWN0IHNoYTFfZW50cnkgKmEgPSBfYSwgKmIgPSBfYjsKKwl1bnNpZ25lZCBsb25nIGlubzEgPSBhLT5pbm8sIGlubzIgPSBiLT5pbm87CisJcmV0dXJuIGlubzEgPCBpbm8yID8gLTEgOiBpbm8xID4gaW5vMiA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBmc2NrX3NoYTFfbGlzdCh2b2lkKQoreworCWludCBpLCBuciA9IHNoYTFfbGlzdC5ucjsKKworCWlmIChTT1JUX0RJUkVOVCkKKwkJcXNvcnQoc2hhMV9saXN0LmVudHJ5LCBuciwKKwkJICAgICAgc2l6ZW9mKHN0cnVjdCBzaGExX2VudHJ5ICopLCBpbm9fY29tcGFyZSk7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJc3RydWN0IHNoYTFfZW50cnkgKmVudHJ5ID0gc2hhMV9saXN0LmVudHJ5W2ldOworCQl1bnNpZ25lZCBjaGFyICpzaGExID0gZW50cnktPnNoYTE7CisKKwkJc2hhMV9saXN0LmVudHJ5W2ldID0gTlVMTDsKKwkJZnNja19zaGExKHNoYTEpOworCQlmcmVlKGVudHJ5KTsKKwl9CisJc2hhMV9saXN0Lm5yID0gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX3NoYTFfbGlzdCh1bnNpZ25lZCBjaGFyICpzaGExLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwlzdHJ1Y3Qgc2hhMV9lbnRyeSAqZW50cnkgPSB4bWFsbG9jKHNpemVvZigqZW50cnkpKTsKKwlpbnQgbnI7CisKKwllbnRyeS0+aW5vID0gaW5vOworCW1lbWNweShlbnRyeS0+c2hhMSwgc2hhMSwgMjApOworCW5yID0gc2hhMV9saXN0Lm5yOworCWlmIChuciA9PSBNQVhfU0hBMV9FTlRSSUVTKSB7CisJCWZzY2tfc2hhMV9saXN0KCk7CisJCW5yID0gMDsKKwl9CisJc2hhMV9saXN0LmVudHJ5W25yXSA9IGVudHJ5OworCXNoYTFfbGlzdC5uciA9ICsrbnI7Cit9CisKK3N0YXRpYyBpbnQgZnNja19kaXIoaW50IGksIGNoYXIgKnBhdGgpCit7CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCisJaWYgKCFkaXIpCisJCXJldHVybiAwOworCisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyIG5hbWVbMTAwXTsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJaW50IGxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKworCQlzd2l0Y2ggKGxlbikgeworCQljYXNlIDI6CisJCQlpZiAoZGUtPmRfbmFtZVsxXSAhPSAnLicpCisJCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmIChkZS0+ZF9uYW1lWzBdICE9ICcuJykKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlIDM4OgorCQkJc3ByaW50ZihuYW1lLCAiJTAyeCIsIGkpOworCQkJbWVtY3B5KG5hbWUrMiwgZGUtPmRfbmFtZSwgbGVuKzEpOworCQkJaWYgKGdldF9zaGExX2hleChuYW1lLCBzaGExKSA8IDApCisJCQkJYnJlYWs7CisJCQlhZGRfc2hhMV9saXN0KHNoYTEsIERJUkVOVF9TT1JUX0hJTlQoZGUpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiYmFkIHNoYTEgZmlsZTogJXMvJXNcbiIsIHBhdGgsIGRlLT5kX25hbWUpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlZmF1bHRfcmVmcyA9IDA7CisKK3N0YXRpYyBpbnQgZnNja19oYW5kbGVfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqOworCisJb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikgeworCQlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkgeworCQkJZGVmYXVsdF9yZWZzKys7CisJCQlyZXR1cm4gMDsgLyogaXQgaXMgaW4gYSBwYWNrICovCisJCX0KKwkJZXJyb3IoIiVzOiBpbnZhbGlkIHNoYTEgcG9pbnRlciAlcyIsIHJlZm5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJLyogV2UnbGwgY29udGludWUgd2l0aCB0aGUgcmVzdCBkZXNwaXRlIHRoZSBlcnJvci4uICovCisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0X3JlZnMrKzsKKwlvYmotPnVzZWQgPSAxOworCW1hcmtfcmVhY2hhYmxlKG9iaiwgUkVBQ0hBQkxFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RlZmF1bHRfaGVhZHModm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoZnNja19oYW5kbGVfcmVmKTsKKwlpZiAoIWRlZmF1bHRfcmVmcykKKwkJZGllKCJObyBkZWZhdWx0IHJlZmVyZW5jZXMiKTsKK30KKworc3RhdGljIHZvaWQgZnNja19vYmplY3RfZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0YXRpYyBjaGFyIGRpcls0MDk2XTsKKwkJc3ByaW50ZihkaXIsICIlcy8lMDJ4IiwgcGF0aCwgaSk7CisJCWZzY2tfZGlyKGksIGRpcik7CisJfQorCWZzY2tfc2hhMV9saXN0KCk7Cit9CisKK3N0YXRpYyBpbnQgZnNja19oZWFkX2xpbmsodm9pZCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWNvbnN0IGNoYXIgKmdpdF9IRUFEID0gc3RyZHVwKGdpdF9wYXRoKCJIRUFEIikpOworCWNvbnN0IGNoYXIgKmdpdF9yZWZzX2hlYWRzX21hc3RlciA9IHJlc29sdmVfcmVmKGdpdF9IRUFELCBzaGExLCAxKTsKKwlpbnQgcGZ4bGVuID0gc3RybGVuKGdpdF9IRUFEKSAtIDQ7IC8qIHN0cmlwIC4uLi8uZ2l0LyBwYXJ0ICovCisKKwlpZiAoIWdpdF9yZWZzX2hlYWRzX21hc3RlcikKKwkJcmV0dXJuIGVycm9yKCJIRUFEIGlzIG5vdCBhIHN5bWJvbGljIHJlZiIpOworCWlmIChzdHJuY21wKGdpdF9yZWZzX2hlYWRzX21hc3RlciArIHBmeGxlbiwgInJlZnMvaGVhZHMvIiwgMTEpKQorCQlyZXR1cm4gZXJyb3IoIkhFQUQgcG9pbnRzIHRvIHNvbWV0aGluZyBzdHJhbmdlICglcykiLAorCQkJICAgICBnaXRfcmVmc19oZWFkc19tYXN0ZXIgKyBwZnhsZW4pOworCWlmICghbWVtY21wKG51bGxfc2hhMSwgc2hhMSwgMjApKQorCQlyZXR1cm4gZXJyb3IoIkhFQUQ6IG5vdCBhIHZhbGlkIGdpdCBwb2ludGVyIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNja19jYWNoZV90cmVlKHN0cnVjdCBjYWNoZV90cmVlICppdCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCWlmICgwIDw9IGl0LT5lbnRyeV9jb3VudCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3QoaXQtPnNoYTEpOworCQlpZiAoIW9iaikgeworCQkJZXJyb3IoIiVzOiBpbnZhbGlkIHNoYTEgcG9pbnRlciBpbiBjYWNoZS10cmVlIiwKKwkJCSAgICAgIHNoYTFfdG9faGV4KGl0LT5zaGExKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQltYXJrX3JlYWNoYWJsZShvYmosIFJFQUNIQUJMRSk7CisJCW9iai0+dXNlZCA9IDE7CisJCWlmIChvYmotPnR5cGUgIT0gT0JKX1RSRUUpCisJCQllcnIgfD0gb2JqZXJyb3Iob2JqLCAibm9uLXRyZWUgaW4gY2FjaGUtdHJlZSIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaXQtPnN1YnRyZWVfbnI7IGkrKykKKwkJZXJyIHw9IGZzY2tfY2FjaGVfdHJlZShpdC0+ZG93bltpXS0+Y2FjaGVfdHJlZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCBoZWFkczsKKworCXRyYWNrX29iamVjdF9yZWZzID0gMTsKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS11bnJlYWNoYWJsZSIpKSB7CisJCQlzaG93X3VucmVhY2hhYmxlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tdGFncyIpKSB7CisJCQlzaG93X3RhZ3MgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yb290IikpIHsKKwkJCXNob3dfcm9vdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWNhY2hlIikpIHsKKwkJCWtlZXBfY2FjaGVfb2JqZWN0cyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLWZ1bGwiKSkgeworCQkJY2hlY2tfZnVsbCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChhcmcsICItLXN0cmljdCIpKSB7CisJCQljaGVja19zdHJpY3QgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCphcmcgPT0gJy0nKQorCQkJdXNhZ2UoImdpdC1mc2NrLW9iamVjdHMgWy0tdGFnc10gWy0tcm9vdF0gW1stLXVucmVhY2hhYmxlXSBbLS1jYWNoZV0gWy0tZnVsbF0gWy0tc3RyaWN0XSA8aGVhZC1zaGExPipdIik7CisJfQorCisJZnNja19oZWFkX2xpbmsoKTsKKwlmc2NrX29iamVjdF9kaXIoZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJaWYgKGNoZWNrX2Z1bGwpIHsKKwkJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnA7CisJCXByZXBhcmVfYWx0X29kYigpOworCQlmb3IgKGFsdCA9IGFsdF9vZGJfbGlzdDsgYWx0OyBhbHQgPSBhbHQtPm5leHQpIHsKKwkJCWNoYXIgbmFtZWJ1ZltQQVRIX01BWF07CisJCQlpbnQgbmFtZWxlbiA9IGFsdC0+bmFtZSAtIGFsdC0+YmFzZTsKKwkJCW1lbWNweShuYW1lYnVmLCBhbHQtPmJhc2UsIG5hbWVsZW4pOworCQkJbmFtZWJ1ZltuYW1lbGVuIC0gMV0gPSAwOworCQkJZnNja19vYmplY3RfZGlyKG5hbWVidWYpOworCQl9CisJCXByZXBhcmVfcGFja2VkX2dpdCgpOworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkKKwkJCS8qIHZlcmlmeSBnaXZlcyBlcnJvciBtZXNzYWdlcyBpdHNlbGYgKi8KKwkJCXZlcmlmeV9wYWNrKHAsIDApOworCisJCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpbnQgbnVtID0gbnVtX3BhY2tlZF9vYmplY3RzKHApOworCQkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCQludGhfcGFja2VkX29iamVjdF9zaGExKHAsIGksIHNoYTEpOworCQkJCWZzY2tfc2hhMShzaGExKTsKKwkJCX0KKwkJfQorCX0KKworCWhlYWRzID0gMDsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07IAorCisJCWlmICgqYXJnID09ICctJykKKwkJCWNvbnRpbnVlOworCisJCWlmICghZ2V0X3NoYTEoYXJnLCBoZWFkX3NoYTEpKSB7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBsb29rdXBfb2JqZWN0KGhlYWRfc2hhMSk7CisKKwkJCS8qIEVycm9yIGlzIHByaW50ZWQgYnkgbG9va3VwX29iamVjdCgpLiAqLworCQkJaWYgKCFvYmopCisJCQkJY29udGludWU7CisKKwkJCW9iai0+dXNlZCA9IDE7CisJCQltYXJrX3JlYWNoYWJsZShvYmosIFJFQUNIQUJMRSk7CisJCQloZWFkcysrOworCQkJY29udGludWU7CisJCX0KKwkJZXJyb3IoImludmFsaWQgcGFyYW1ldGVyOiBleHBlY3RlZCBzaGExLCBnb3QgJyVzJyIsIGFyZyk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSd2ZSBub3QgYmVlbiBnaXZlbiBhbnkgZXhwbGljaXQgaGVhZCBpbmZvcm1hdGlvbiwgZG8gdGhlCisJICogZGVmYXVsdCBvbmVzIGZyb20gLmdpdC9yZWZzLiBXZSBhbHNvIGNvbnNpZGVyIHRoZSBpbmRleCBmaWxlCisJICogaW4gdGhpcyBjYXNlIChpZSB0aGlzIGltcGxpZXMgLS1jYWNoZSkuCisJICovCisJaWYgKCFoZWFkcykgeworCQlnZXRfZGVmYXVsdF9oZWFkcygpOworCQlrZWVwX2NhY2hlX29iamVjdHMgPSAxOworCX0KKworCWlmIChrZWVwX2NhY2hlX29iamVjdHMpIHsKKwkJaW50IGk7CisJCXJlYWRfY2FjaGUoKTsKKwkJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCQlzdHJ1Y3QgYmxvYiAqYmxvYiA9IGxvb2t1cF9ibG9iKGFjdGl2ZV9jYWNoZVtpXS0+c2hhMSk7CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJCQlpZiAoIWJsb2IpCisJCQkJY29udGludWU7CisJCQlvYmogPSAmYmxvYi0+b2JqZWN0OworCQkJb2JqLT51c2VkID0gMTsKKwkJCW1hcmtfcmVhY2hhYmxlKG9iaiwgUkVBQ0hBQkxFKTsKKwkJfQorCQlpZiAoYWN0aXZlX2NhY2hlX3RyZWUpCisJCQlmc2NrX2NhY2hlX3RyZWUoYWN0aXZlX2NhY2hlX3RyZWUpOworCX0KKworCWNoZWNrX2Nvbm5lY3Rpdml0eSgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZ2VuZXJhdGUtY21kbGlzdC5zaCBiL2dlbmVyYXRlLWNtZGxpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWMxZWRhMgotLS0gL2Rldi9udWxsCisrKyBiL2dlbmVyYXRlLWNtZGxpc3Quc2gKQEAgLTAsMCArMSw1MSBAQAorIyEvYmluL3NoCisKK2VjaG8gIi8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5ICQwICovCitzdHJ1Y3QgY21kbmFtZV9oZWxwCit7CisgICAgY2hhciBuYW1lWzE2XTsKKyAgICBjaGFyIGhlbHBbNjRdOworfTsKKworc3RydWN0IGNtZG5hbWVfaGVscCBjb21tb25fY21kc1tdID0geyIKKworc29ydCA8PFxFT0YgfAorYWRkCithcHBseQorYmlzZWN0CiticmFuY2gKK2NoZWNrb3V0CitjaGVycnktcGljaworY2xvbmUKK2NvbW1pdAorZGlmZgorZmV0Y2gKK2dyZXAKK2luaXQtZGIKK2xvZworbWVyZ2UKK212CitwcnVuZQorcHVsbAorcHVzaAorcmViYXNlCityZXNldAorcmV2ZXJ0CitybQorc2hvdworc2hvdy1icmFuY2gKK3N0YXR1cwordGFnCit2ZXJpZnktdGFnCitFT0YKK3doaWxlIHJlYWQgY21kCitkbworICAgICBzZWQgLW4gJworICAgICAvTkFNRS8sL2dpdC0nIiRjbWQiJy9ICisgICAgICR7CisgICAgICAgICAgICB4CisgICAgICAgICAgICBzLy4qZ2l0LSciJGNtZCInIC0gXCguKlwpLyAgeyInIiRjbWQiJyIsICJcMSJ9LC8KKwkgICAgcAorICAgICB9JyAiRG9jdW1lbnRhdGlvbi9naXQtJGNtZC50eHQiCitkb25lCitlY2hvICJ9OyIKZGlmZiAtLWdpdCBhL2dpdC1hbS5zaCBiL2dpdC1hbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGFmNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWFtLnNoCkBAIC0wLDAgKzEsNDQzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEp1bmlvIEMgSGFtYW5vCisKK1VTQUdFPSdbLS1zaWdub2ZmXSBbLS1kb3Rlc3Q9PGRpcj5dIFstLXV0ZjhdIFstLWJpbmFyeV0gWy0tM3dheV0KKyAgWy0taW50ZXJhY3RpdmVdIFstLXdoaXRlc3BhY2U9PG9wdGlvbj5dIDxtYm94Pi4uLgorICBvciwgd2hlbiByZXN1bWluZyBbLS1za2lwIHwgLS1yZXNvbHZlZF0nCisuIGdpdC1zaC1zZXR1cAorCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKK3N0b3BfaGVyZSAoKSB7CisgICAgZWNobyAiJDEiID4iJGRvdGVzdC9uZXh0IgorICAgIGV4aXQgMQorfQorCitzdG9wX2hlcmVfdXNlcl9yZXNvbHZlICgpIHsKKyAgICBpZiBbIC1uICIkcmVzb2x2ZW1zZyIgXTsgdGhlbgorCSAgICBlY2hvICIkcmVzb2x2ZW1zZyIKKwkgICAgc3RvcF9oZXJlICQxCisgICAgZmkKKyAgICBjbWRsaW5lPSQoYmFzZW5hbWUgJDApCisgICAgaWYgdGVzdCAnJyAhPSAiJGludGVyYWN0aXZlIgorICAgIHRoZW4KKyAgICAgICAgY21kbGluZT0iJGNtZGxpbmUgLWkiCisgICAgZmkKKyAgICBpZiB0ZXN0ICcnICE9ICIkdGhyZWV3YXkiCisgICAgdGhlbgorICAgICAgICBjbWRsaW5lPSIkY21kbGluZSAtMyIKKyAgICBmaQorICAgIGlmIHRlc3QgJy5kb3Rlc3QnICE9ICIkZG90ZXN0IgorICAgIHRoZW4KKyAgICAgICAgY21kbGluZT0iJGNtZGxpbmUgLWQ9JGRvdGVzdCIKKyAgICBmaQorICAgIGVjaG8gIldoZW4geW91IGhhdmUgcmVzb2x2ZWQgdGhpcyBwcm9ibGVtIHJ1biBcIiRjbWRsaW5lIC0tcmVzb2x2ZWRcIi4iCisgICAgZWNobyAiSWYgeW91IHdvdWxkIHByZWZlciB0byBza2lwIHRoaXMgcGF0Y2gsIGluc3RlYWQgcnVuIFwiJGNtZGxpbmUgLS1za2lwXCIuIgorCisgICAgc3RvcF9oZXJlICQxCit9CisKK2dvX25leHQgKCkgeworCXJtIC1mICIkZG90ZXN0LyRtc2dudW0iICIkZG90ZXN0L21zZyIgIiRkb3Rlc3QvbXNnLWNsZWFuIiBcCisJCSIkZG90ZXN0L3BhdGNoIiAiJGRvdGVzdC9pbmZvIgorCWVjaG8gIiRuZXh0IiA+IiRkb3Rlc3QvbmV4dCIKKwl0aGlzPSRuZXh0Cit9CisKK2Nhbm5vdF9mYWxsYmFjayAoKSB7CisJZWNobyAiJDEiCisJZWNobyAiQ2Fubm90IGZhbGwgYmFjayB0byB0aHJlZS13YXkgbWVyZ2UuIgorCWV4aXQgMQorfQorCitmYWxsX2JhY2tfM3dheSAoKSB7CisgICAgT19PQkpFQ1Q9YGNkICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiICYmIHB3ZGAKKworICAgIHJtIC1mciAiJGRvdGVzdCIvcGF0Y2gtbWVyZ2UtKgorICAgIG1rZGlyICIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1kaXIiCisKKyAgICAjIEZpcnN0IHNlZSBpZiB0aGUgcGF0Y2ggcmVjb3JkcyB0aGUgaW5kZXggaW5mbyB0aGF0IHdlIGNhbiB1c2UuCisgICAgZ2l0LWFwcGx5IC16IC0taW5kZXgtaW5mbyAiJGRvdGVzdC9wYXRjaCIgXAorCT4iJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleC1pbmZvIiAmJgorICAgIEdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorICAgIGdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIDwiJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleC1pbmZvIiAmJgorICAgIEdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLXRtcC1pbmRleCIgXAorICAgIGdpdC13cml0ZS10cmVlID4iJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlKyIgfHwKKyAgICBjYW5ub3RfZmFsbGJhY2sgIlBhdGNoIGRvZXMgbm90IHJlY29yZCB1c2FibGUgaW5kZXggaW5mb3JtYXRpb24uIgorCisgICAgZWNobyBVc2luZyBpbmRleCBpbmZvIHRvIHJlY29uc3RydWN0IGEgYmFzZSB0cmVlLi4uCisgICAgaWYgR0lUX0lOREVYX0ZJTEU9IiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtdG1wLWluZGV4IiBcCisJZ2l0LWFwcGx5ICRiaW5hcnkgLS1jYWNoZWQgPCIkZG90ZXN0L3BhdGNoIgorICAgIHRoZW4KKwltdiAiJGRvdGVzdC9wYXRjaC1tZXJnZS1iYXNlKyIgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtYmFzZSIKKwltdiAiJGRvdGVzdC9wYXRjaC1tZXJnZS10bXAtaW5kZXgiICIkZG90ZXN0L3BhdGNoLW1lcmdlLWluZGV4IgorICAgIGVsc2UKKyAgICAgICAgY2Fubm90X2ZhbGxiYWNrICJEaWQgeW91IGhhbmQgZWRpdCB5b3VyIHBhdGNoPworSXQgZG9lcyBub3QgYXBwbHkgdG8gYmxvYnMgcmVjb3JkZWQgaW4gaXRzIGluZGV4LiIKKyAgICBmaQorCisgICAgdGVzdCAtZiAiJGRvdGVzdC9wYXRjaC1tZXJnZS1pbmRleCIgJiYKKyAgICBoaXNfdHJlZT0kKEdJVF9JTkRFWF9GSUxFPSIkZG90ZXN0L3BhdGNoLW1lcmdlLWluZGV4IiBnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBvcmlnX3RyZWU9JChjYXQgIiRkb3Rlc3QvcGF0Y2gtbWVyZ2UtYmFzZSIpICYmCisgICAgcm0gLWZyICIkZG90ZXN0Ii9wYXRjaC1tZXJnZS0qIHx8IGV4aXQgMQorCisgICAgZWNobyBGYWxsaW5nIGJhY2sgdG8gcGF0Y2hpbmcgYmFzZSBhbmQgMy13YXkgbWVyZ2UuLi4KKworICAgICMgVGhpcyBpcyBub3Qgc28gd3JvbmcuICBEZXBlbmRpbmcgb24gd2hpY2ggYmFzZSB3ZSBwaWNrZWQsCisgICAgIyBvcmlnX3RyZWUgbWF5IGJlIHdpbGRseSBkaWZmZXJlbnQgZnJvbSBvdXJzLCBidXQgaGlzX3RyZWUKKyAgICAjIGhhcyB0aGUgc2FtZSBzZXQgb2Ygd2lsZGx5IGRpZmZlcmVudCBjaGFuZ2VzIGluIHBhcnRzIHRoZQorICAgICMgcGF0Y2ggZGlkIG5vdCB0b3VjaCwgc28gcmVzb2x2ZSBlbmRzIHVwIGNhbmNlbGluZyB0aGVtLAorICAgICMgc2F5aW5nIHRoYXQgd2UgcmV2ZXJ0ZWQgYWxsIHRob3NlIGNoYW5nZXMuCisKKyAgICBnaXQtbWVyZ2UtcmVzb2x2ZSAkb3JpZ190cmVlIC0tIEhFQUQgJGhpc190cmVlIHx8IHsKKwkgICAgaWYgdGVzdCAtZCAiJEdJVF9ESVIvcnItY2FjaGUiCisJICAgIHRoZW4KKwkJZ2l0LXJlcmVyZQorCSAgICBmaQorCSAgICBlY2hvIEZhaWxlZCB0byBtZXJnZSBpbiB0aGUgY2hhbmdlcy4KKwkgICAgZXhpdCAxCisgICAgfQorfQorCitwcmVjPTQKK3Jsb2dhPWFtCitkb3Rlc3Q9LmRvdGVzdCBzaWduPSB1dGY4PSBrZWVwPSBza2lwPSBpbnRlcmFjdGl2ZT0gcmVzb2x2ZWQ9IGJpbmFyeT0gd3M9IHJlc29sdmVtc2c9CisKK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhazs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLWQ9KnwtLWQ9KnwtLWRvPSp8LS1kb3Q9KnwtLWRvdGU9KnwtLWRvdGVzPSp8LS1kb3Rlc3Q9KikKKwlkb3Rlc3Q9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYDsgc2hpZnQgOzsKKwktZHwtLWR8LS1kb3wtLWRvdHwtLWRvdGV8LS1kb3Rlc3wtLWRvdGVzdCkKKwljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYzsgc2hpZnQKKwlkb3Rlc3Q9IiQxIjsgc2hpZnQ7OworCisJLWl8LS1pfC0taW58LS1pbnR8LS1pbnRlfC0taW50ZXJ8LS1pbnRlcmF8LS1pbnRlcmFjfC0taW50ZXJhY3R8XAorCS0taW50ZXJhY3RpfC0taW50ZXJhY3RpdnwtLWludGVyYWN0aXZlKQorCWludGVyYWN0aXZlPXQ7IHNoaWZ0IDs7CisKKwktYnwtLWJ8LS1iaXwtLWJpbnwtLWJpbmF8LS1iaW5hcnwtLWJpbmFyeSkKKwliaW5hcnk9dDsgc2hpZnQgOzsKKworCS0zfC0tM3wtLTN3fC0tM3dhfC0tM3dheSkKKwl0aHJlZXdheT10OyBzaGlmdCA7OworCS1zfC0tc3wtLXNpfC0tc2lnfC0tc2lnbnwtLXNpZ25vfC0tc2lnbm9mfC0tc2lnbm9mZikKKwlzaWduPXQ7IHNoaWZ0IDs7CisJLXV8LS11fC0tdXR8LS11dGZ8LS11dGY4KQorCXV0Zjg9dDsgc2hpZnQgOzsKKwkta3wtLWt8LS1rZXwtLWtlZXwtLWtlZXApCisJa2VlcD10OyBzaGlmdCA7OworCisJLXJ8LS1yfC0tcmV8LS1yZXN8LS1yZXNvfC0tcmVzb2x8LS1yZXNvbHZ8LS1yZXNvbHZlfC0tcmVzb2x2ZWQpCisJcmVzb2x2ZWQ9dDsgc2hpZnQgOzsKKworCS0tc2t8LS1za2l8LS1za2lwKQorCXNraXA9dDsgc2hpZnQgOzsKKworCS0td2hpdGVzcGFjZT0qKQorCXdzPSQxOyBzaGlmdCA7OworCisJLS1yZXNvbHZlbXNnPSopCisJcmVzb2x2ZW1zZz0kKGVjaG8gIiQxIiB8IHNlZCAtZSAicy9eLS1yZXNvbHZlbXNnPS8vIik7IHNoaWZ0IDs7CisKKwktLXJlZmxvZy1hY3Rpb249KikKKwlybG9nYT1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgOyBzaGlmdCA7OworCisJLS0pCisJc2hpZnQ7IGJyZWFrIDs7CisJLSopCisJdXNhZ2UgOzsKKwkqKQorCWJyZWFrIDs7CisJZXNhYworZG9uZQorCisjIElmIHRoZSBkb3Rlc3QgZGlyZWN0b3J5IGV4aXN0cywgYnV0IHdlIGhhdmUgZmluaXNoZWQgYXBwbHlpbmcgYWxsIHRoZQorIyBwYXRjaGVzIGluIHRoZW0sIGNsZWFyIGl0IG91dC4KK2lmIHRlc3QgLWQgIiRkb3Rlc3QiICYmCisgICBsYXN0PSQoY2F0ICIkZG90ZXN0L2xhc3QiKSAmJgorICAgbmV4dD0kKGNhdCAiJGRvdGVzdC9uZXh0IikgJiYKKyAgIHRlc3QgJCMgIT0gMCAmJgorICAgdGVzdCAiJG5leHQiIC1ndCAiJGxhc3QiCit0aGVuCisgICBybSAtZnIgIiRkb3Rlc3QiCitmaQorCitpZiB0ZXN0IC1kICIkZG90ZXN0IgordGhlbgorCWlmIHRlc3QgIiwkIywiICE9ICIsMCwiIHx8ICEgdHR5IC1zCisJdGhlbgorCQlkaWUgInByZXZpb3VzIGRvdGVzdCBkaXJlY3RvcnkgJGRvdGVzdCBzdGlsbCBleGlzdHMgYnV0IG1ib3ggZ2l2ZW4uIgorCWZpCisJcmVzdW1lPXllcworZWxzZQorCSMgTWFrZSBzdXJlIHdlIGFyZSBub3QgZ2l2ZW4gLS1za2lwIG5vciAtLXJlc29sdmVkCisJdGVzdCAiLCRza2lwLCRyZXNvbHZlZCwiID0gLCwsIHx8CisJCWRpZSAiUmVzb2x2ZSBvcGVyYXRpb24gbm90IGluIHByb2dyZXNzLCB3ZSBhcmUgbm90IHJlc3VtaW5nLiIKKworCSMgU3RhcnQgYWZyZXNoLgorCW1rZGlyIC1wICIkZG90ZXN0IiB8fCBleGl0CisKKwlnaXQtbWFpbHNwbGl0IC1kIiRwcmVjIiAtbyIkZG90ZXN0IiAtYiAtLSAiJEAiID4gIiRkb3Rlc3QvbGFzdCIgfHwgIHsKKwkJcm0gLWZyICIkZG90ZXN0IgorCQlleGl0IDEKKwl9CisKKwkjIC1iLCAtcywgLXUsIC1rIGFuZCAtLXdoaXRlc3BhY2UgZmxhZ3MgYXJlIGtlcHQgZm9yIHRoZQorCSMgcmVzdW1pbmcgc2Vzc2lvbiBhZnRlciBhIHBhdGNoIGZhaWx1cmUuCisJIyAtMyBhbmQgLWkgY2FuIGFuZCBtdXN0IGJlIGdpdmVuIHdoZW4gcmVzdW1pbmcuCisJZWNobyAiJGJpbmFyeSIgPiIkZG90ZXN0L2JpbmFyeSIKKwllY2hvICIgJHdzIiA+IiRkb3Rlc3Qvd2hpdGVzcGFjZSIKKwllY2hvICIkc2lnbiIgPiIkZG90ZXN0L3NpZ24iCisJZWNobyAiJHV0ZjgiID4iJGRvdGVzdC91dGY4IgorCWVjaG8gIiRrZWVwIiA+IiRkb3Rlc3Qva2VlcCIKKwllY2hvIDEgPiIkZG90ZXN0L25leHQiCitmaQorCitjYXNlICIkcmVzb2x2ZWQiIGluCisnJykKKwlmaWxlcz0kKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1vbmx5IEhFQUQpIHx8IGV4aXQKKwlpZiBbICIkZmlsZXMiIF07IHRoZW4KKwkgICBlY2hvICJEaXJ0eSBpbmRleDogY2Fubm90IGFwcGx5IHBhdGNoZXMgKGRpcnR5OiAkZmlsZXMpIiA+JjIKKwkgICBleGl0IDEKKwlmaQorZXNhYworCitpZiB0ZXN0ICIkKGNhdCAiJGRvdGVzdC9iaW5hcnkiKSIgPSB0Cit0aGVuCisJYmluYXJ5PS0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50CitmaQoraWYgdGVzdCAiJChjYXQgIiRkb3Rlc3QvdXRmOCIpIiA9IHQKK3RoZW4KKwl1dGY4PS11CitmaQoraWYgdGVzdCAiJChjYXQgIiRkb3Rlc3Qva2VlcCIpIiA9IHQKK3RoZW4KKwlrZWVwPS1rCitmaQord3M9YGNhdCAiJGRvdGVzdC93aGl0ZXNwYWNlImAKK2lmIHRlc3QgIiQoY2F0ICIkZG90ZXN0L3NpZ24iKSIgPSB0Cit0aGVuCisJU0lHTk9GRj1gZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UIHwgc2VkIC1lICcKKwkJCXMvPi4qLz4vCisJCQlzL14vU2lnbmVkLW9mZi1ieTogLycKKwkJYAorZWxzZQorCVNJR05PRkY9CitmaQorCitsYXN0PWBjYXQgIiRkb3Rlc3QvbGFzdCJgCit0aGlzPWBjYXQgIiRkb3Rlc3QvbmV4dCJgCitpZiB0ZXN0ICIkc2tpcCIgPSB0Cit0aGVuCisJdGhpcz1gZXhwciAiJHRoaXMiICsgMWAKKwlyZXN1bWU9CitmaQorCitpZiB0ZXN0ICIkdGhpcyIgLWd0ICIkbGFzdCIKK3RoZW4KKwllY2hvIE5vdGhpbmcgdG8gZG8uCisJcm0gLWZyICIkZG90ZXN0IgorCWV4aXQKK2ZpCisKK3doaWxlIHRlc3QgIiR0aGlzIiAtbGUgIiRsYXN0IgorZG8KKwltc2dudW09YHByaW50ZiAiJTAke3ByZWN9ZCIgJHRoaXNgCisJbmV4dD1gZXhwciAiJHRoaXMiICsgMWAKKwl0ZXN0IC1mICIkZG90ZXN0LyRtc2dudW0iIHx8IHsKKwkJcmVzdW1lPQorCQlnb19uZXh0CisJCWNvbnRpbnVlCisJfQorCisJIyBJZiB3ZSBhcmUgbm90IHJlc3VtaW5nLCBwYXJzZSBhbmQgZXh0cmFjdCB0aGUgcGF0Y2ggaW5mb3JtYXRpb24KKwkjIGludG8gc2VwYXJhdGUgZmlsZXM6CisJIyAgLSBpbmZvIHJlY29yZHMgdGhlIGF1dGhvcnNoaXAgYW5kIHRpdGxlCisJIyAgLSBtc2cgaXMgdGhlIHJlc3Qgb2YgY29tbWl0IGxvZyBtZXNzYWdlCisJIyAgLSBwYXRjaCBpcyB0aGUgcGF0Y2ggYm9keS4KKwkjCisJIyBXaGVuIHdlIGFyZSByZXN1bWluZywgdGhlc2UgZmlsZXMgYXJlIGVpdGhlciBhbHJlYWR5IHByZXBhcmVkCisJIyBieSB0aGUgdXNlciwgb3IgdGhlIHVzZXIgY2FuIHRlbGwgdXMgdG8gZG8gc28gYnkgLS1yZXNvbHZlZCBmbGFnLgorCWNhc2UgIiRyZXN1bWUiIGluCisJJycpCisJCWdpdC1tYWlsaW5mbyAka2VlcCAkdXRmOCAiJGRvdGVzdC9tc2ciICIkZG90ZXN0L3BhdGNoIiBcCisJCQk8IiRkb3Rlc3QvJG1zZ251bSIgPiIkZG90ZXN0L2luZm8iIHx8CisJCQlzdG9wX2hlcmUgJHRoaXMKKwkJZ2l0LXN0cmlwc3BhY2UgPCAiJGRvdGVzdC9tc2ciID4gIiRkb3Rlc3QvbXNnLWNsZWFuIgorCQk7OworCWVzYWMKKworCUdJVF9BVVRIT1JfTkFNRT0iJChzZWQgLW4gJy9eQXV0aG9yLyBzL0F1dGhvcjogLy9wJyAiJGRvdGVzdC9pbmZvIikiCisJR0lUX0FVVEhPUl9FTUFJTD0iJChzZWQgLW4gJy9eRW1haWwvIHMvRW1haWw6IC8vcCcgIiRkb3Rlc3QvaW5mbyIpIgorCUdJVF9BVVRIT1JfREFURT0iJChzZWQgLW4gJy9eRGF0ZS8gcy9EYXRlOiAvL3AnICIkZG90ZXN0L2luZm8iKSIKKworCWlmIHRlc3QgLXogIiRHSVRfQVVUSE9SX0VNQUlMIgorCXRoZW4KKwkJZWNobyAiUGF0Y2ggZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGUtbWFpbCBhZGRyZXNzLiIKKwkJc3RvcF9oZXJlICR0aGlzCisJZmkKKworCWV4cG9ydCBHSVRfQVVUSE9SX05BTUUgR0lUX0FVVEhPUl9FTUFJTCBHSVRfQVVUSE9SX0RBVEUKKworCVNVQkpFQ1Q9IiQoc2VkIC1uICcvXlN1YmplY3QvIHMvU3ViamVjdDogLy9wJyAiJGRvdGVzdC9pbmZvIikiCisJY2FzZSAiJGtlZXBfc3ViamVjdCIgaW4gLWspICBTVUJKRUNUPSJbUEFUQ0hdICRTVUJKRUNUIiA7OyBlc2FjCisKKwljYXNlICIkcmVzdW1lIiBpbgorCScnKQorCSAgICBpZiB0ZXN0ICcnICE9ICIkU0lHTk9GRiIKKwkgICAgdGhlbgorCQlMQVNUX1NJR05FRF9PRkZfQlk9YAorCQkgICAgc2VkIC1uZSAnL15TaWduZWQtb2ZmLWJ5OiAvcCcgXAorCQkgICAgIiRkb3Rlc3QvbXNnLWNsZWFuIiB8CisJCSAgICB0YWlsIC1uIDEKKwkJYAorCQlBRERfU0lHTk9GRj1gCisJCSAgICB0ZXN0ICIkTEFTVF9TSUdORURfT0ZGX0JZIiA9ICIkU0lHTk9GRiIgfHwgeworCQkgICAgdGVzdCAnJyA9ICIkTEFTVF9TSUdORURfT0ZGX0JZIiAmJiBlY2hvCisJCSAgICBlY2hvICIkU0lHTk9GRiIKKwkJfWAKKwkgICAgZWxzZQorCQlBRERfU0lHTk9GRj0KKwkgICAgZmkKKwkgICAgeworCQllY2hvICIkU1VCSkVDVCIKKwkJaWYgdGVzdCAtcyAiJGRvdGVzdC9tc2ctY2xlYW4iCisJCXRoZW4KKwkJCWVjaG8KKwkJCWNhdCAiJGRvdGVzdC9tc2ctY2xlYW4iCisJCWZpCisJCWlmIHRlc3QgJycgIT0gIiRBRERfU0lHTk9GRiIKKwkJdGhlbgorCQkJZWNobyAiJEFERF9TSUdOT0ZGIgorCQlmaQorCSAgICB9ID4iJGRvdGVzdC9maW5hbC1jb21taXQiCisJICAgIDs7CisJKikKKwkJY2FzZSAiJHJlc29sdmVkJGludGVyYWN0aXZlIiBpbgorCQl0dCkKKwkJCSMgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIGludGVyYWN0aXZlIHZpZXcgb3B0aW9uLgorCQkJZ2l0LWRpZmYtaW5kZXggLXAgLS1jYWNoZWQgSEVBRCA+IiRkb3Rlc3QvcGF0Y2giCisJCQk7OworCQllc2FjCisJZXNhYworCisJcmVzdW1lPQorCWlmIHRlc3QgIiRpbnRlcmFjdGl2ZSIgPSB0CisJdGhlbgorCSAgICB0ZXN0IC10IDAgfHwKKwkgICAgZGllICJjYW5ub3QgYmUgaW50ZXJhY3RpdmUgd2l0aG91dCBzdGRpbiBjb25uZWN0ZWQgdG8gYSB0ZXJtaW5hbC4iCisJICAgIGFjdGlvbj1hZ2FpbgorCSAgICB3aGlsZSB0ZXN0ICIkYWN0aW9uIiA9IGFnYWluCisJICAgIGRvCisJCWVjaG8gIkNvbW1pdCBCb2R5IGlzOiIKKwkJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCWNhdCAiJGRvdGVzdC9maW5hbC1jb21taXQiCisJCWVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQlwcmludGYgIkFwcGx5PyBbeV1lcy9bbl1vL1tlXWRpdC9bdl1pZXcgcGF0Y2gvW2FdY2NlcHQgYWxsICIKKwkJcmVhZCByZXBseQorCQljYXNlICIkcmVwbHkiIGluCisJCVt5WV0qKSBhY3Rpb249eWVzIDs7CisJCVthQV0qKSBhY3Rpb249eWVzIGludGVyYWN0aXZlPSA7OworCQlbbk5dKikgYWN0aW9uPXNraXAgOzsKKwkJW2VFXSopICIke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0iICIkZG90ZXN0L2ZpbmFsLWNvbW1pdCIKKwkJICAgICAgIGFjdGlvbj1hZ2FpbiA7OworCQlbdlZdKikgYWN0aW9uPWFnYWluCisJCSAgICAgICBMRVNTPS1TICR7UEFHRVI6LWxlc3N9ICIkZG90ZXN0L3BhdGNoIiA7OworCQkqKSAgICAgYWN0aW9uPWFnYWluIDs7CisJCWVzYWMKKwkgICAgZG9uZQorCWVsc2UKKwkgICAgYWN0aW9uPXllcworCWZpCisKKwlpZiB0ZXN0ICRhY3Rpb24gPSBza2lwCisJdGhlbgorCQlnb19uZXh0CisJCWNvbnRpbnVlCisJZmkKKworCWlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9hcHBseXBhdGNoLW1zZworCXRoZW4KKwkJIiRHSVRfRElSIi9ob29rcy9hcHBseXBhdGNoLW1zZyAiJGRvdGVzdC9maW5hbC1jb21taXQiIHx8CisJCXN0b3BfaGVyZSAkdGhpcworCWZpCisKKwllY2hvCisJZWNobyAiQXBwbHlpbmcgJyRTVUJKRUNUJyIKKwllY2hvCisKKwljYXNlICIkcmVzb2x2ZWQiIGluCisJJycpCisJCWdpdC1hcHBseSAkYmluYXJ5IC0taW5kZXggJHdzICIkZG90ZXN0L3BhdGNoIgorCQlhcHBseV9zdGF0dXM9JD8KKwkJOzsKKwl0KQorCQkjIFJlc29sdmVkIG1lYW5zIHRoZSB1c2VyIGRpZCBhbGwgdGhlIGhhcmQgd29yaywgYW5kCisJCSMgd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55IHBhdGNoIGFwcGxpY2F0aW9uLiAgSnVzdAorCQkjIHRydXN0IHdoYXQgdGhlIHVzZXIgaGFzIGluIHRoZSBpbmRleCBmaWxlIGFuZCB0aGUKKwkJIyB3b3JraW5nIHRyZWUuCisJCXJlc29sdmVkPQorCQljaGFuZ2VkPSIkKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1vbmx5IEhFQUQpIgorCQlpZiB0ZXN0ICcnID0gIiRjaGFuZ2VkIgorCQl0aGVuCisJCQllY2hvICJObyBjaGFuZ2VzIC0gZGlkIHlvdSBmb3JnZXQgdXBkYXRlLWluZGV4PyIKKwkJCXN0b3BfaGVyZV91c2VyX3Jlc29sdmUgJHRoaXMKKwkJZmkKKwkJdW5tZXJnZWQ9JChnaXQtbHMtZmlsZXMgLXUpCisJCWlmIHRlc3QgLW4gIiR1bm1lcmdlZCIKKwkJdGhlbgorCQkJZWNobyAiWW91IHN0aWxsIGhhdmUgdW5tZXJnZWQgcGF0aHMgaW4geW91ciBpbmRleCIKKwkJCWVjaG8gImRpZCB5b3UgZm9yZ2V0IHVwZGF0ZS1pbmRleD8iCisJCQlzdG9wX2hlcmVfdXNlcl9yZXNvbHZlICR0aGlzCisJCWZpCisJCWFwcGx5X3N0YXR1cz0wCisJCTs7CisJZXNhYworCisJaWYgdGVzdCAkYXBwbHlfc3RhdHVzID0gMSAmJiB0ZXN0ICIkdGhyZWV3YXkiID0gdAorCXRoZW4KKwkJaWYgKGZhbGxfYmFja18zd2F5KQorCQl0aGVuCisJCSAgICAjIEFwcGx5aW5nIHRoZSBwYXRjaCB0byBhbiBlYXJsaWVyIHRyZWUgYW5kIG1lcmdpbmcgdGhlCisJCSAgICAjIHJlc3VsdCBtYXkgaGF2ZSBwcm9kdWNlZCB0aGUgc2FtZSB0cmVlIGFzIG91cnMuCisJCSAgICBjaGFuZ2VkPSIkKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1vbmx5IEhFQUQpIgorCQkgICAgaWYgdGVzdCAnJyA9ICIkY2hhbmdlZCIKKwkJICAgIHRoZW4KKwkJCSAgICBlY2hvIE5vIGNoYW5nZXMgLS0gUGF0Y2ggYWxyZWFkeSBhcHBsaWVkLgorCQkJICAgIGdvX25leHQKKwkJCSAgICBjb250aW51ZQorCQkgICAgZmkKKwkJICAgICMgY2xlYXIgYXBwbHlfc3RhdHVzIC0tIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IG1lcmdlZC4KKwkJICAgIGFwcGx5X3N0YXR1cz0wCisJCWZpCisJZmkKKwlpZiB0ZXN0ICRhcHBseV9zdGF0dXMgIT0gMAorCXRoZW4KKwkJZWNobyBQYXRjaCBmYWlsZWQgYXQgJG1zZ251bS4KKwkJc3RvcF9oZXJlX3VzZXJfcmVzb2x2ZSAkdGhpcworCWZpCisKKwlpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcHJlLWFwcGx5cGF0Y2gKKwl0aGVuCisJCSIkR0lUX0RJUiIvaG9va3MvcHJlLWFwcGx5cGF0Y2ggfHwgc3RvcF9oZXJlICR0aGlzCisJZmkKKworCXRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKwllY2hvIFdyb3RlIHRyZWUgJHRyZWUgJiYKKwlwYXJlbnQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJY29tbWl0PSQoZ2l0LWNvbW1pdC10cmVlICR0cmVlIC1wICRwYXJlbnQgPCIkZG90ZXN0L2ZpbmFsLWNvbW1pdCIpICYmCisJZWNobyBDb21taXR0ZWQ6ICRjb21taXQgJiYKKwlnaXQtdXBkYXRlLXJlZiAtbSAiJHJsb2dhOiAkU1VCSkVDVCIgSEVBRCAkY29tbWl0ICRwYXJlbnQgfHwKKwlzdG9wX2hlcmUgJHRoaXMKKworCWlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9wb3N0LWFwcGx5cGF0Y2gKKwl0aGVuCisJCSIkR0lUX0RJUiIvaG9va3MvcG9zdC1hcHBseXBhdGNoCisJZmkKKworCWdvX25leHQKK2RvbmUKKworcm0gLWZyICIkZG90ZXN0IgpkaWZmIC0tZ2l0IGEvZ2l0LWFubm90YXRlLnBlcmwgYi9naXQtYW5ub3RhdGUucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTVlZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWFubm90YXRlLnBlcmwKQEAgLTAsMCArMSw3MDggQEAKKyMhL3Vzci9iaW4vcGVybAorIyBDb3B5cmlnaHQgMjAwNiwgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKyMKKyMgR1BMIHYyIChTZWUgQ09QWUlORykKKyMKKyMgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorIyBhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cyBUb3J2YWxkcy4KKwordXNlIHdhcm5pbmdzOwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6Okxvbmc7Cit1c2UgUE9TSVggcXcoc3RyZnRpbWUgZ210aW1lKTsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKKworc3ViIHVzYWdlKCkgeworCXByaW50IFNUREVSUiAiVXNhZ2U6ICR7XGJhc2VuYW1lICQwfSBbLXNdIFstUyByZXZzLWZpbGVdIGZpbGUgWyByZXZpc2lvbiBdCisJLWwsIC0tbG9uZworCQkJU2hvdyBsb25nIHJldiAoRGVmYXVsdHMgb2ZmKQorCS10LCAtLXRpbWUKKwkJCVNob3cgcmF3IHRpbWVzdGFtcCAoRGVmYXVsdHMgb2ZmKQorCS1yLCAtLXJlbmFtZQorCQkJRm9sbG93IHJlbmFtZXMgKERlZmF1bHRzIG9uKS4KKwktUywgLS1yZXYtZmlsZSByZXZzLWZpbGUKKwkJCVVzZSByZXZzIGZyb20gcmV2cy1maWxlIGluc3RlYWQgb2YgY2FsbGluZyBnaXQtcmV2LWxpc3QKKwktaCwgLS1oZWxwCisJCQlUaGlzIG1lc3NhZ2UuCisiOworCisJZXhpdCgxKTsKK30KKworb3VyICgkaGVscCwgJGxvbmdyZXYsICRyZW5hbWUsICRyYXd0aW1lLCAkc3RhcnRpbmdfcmV2LCAkcmV2X2ZpbGUpID0gKDAsIDAsIDEpOworCitteSAkcmMgPSBHZXRPcHRpb25zKAkibG9uZ3xsIiA9PiBcJGxvbmdyZXYsCisJCQkidGltZXx0IiA9PiBcJHJhd3RpbWUsCisJCQkiaGVscHxoIiA9PiBcJGhlbHAsCisJCQkicmVuYW1lfHIiID0+IFwkcmVuYW1lLAorCQkJInJldi1maWxlfFM9cyIgPT4gXCRyZXZfZmlsZSk7CitpZiAoISRyYyBvciAkaGVscCBvciAhQEFSR1YpIHsKKwl1c2FnZSgpOworfQorCitteSAkZmlsZW5hbWUgPSBzaGlmdCBAQVJHVjsKK2lmIChAQVJHVikgeworCSRzdGFydGluZ19yZXYgPSBzaGlmdCBAQVJHVjsKK30KKworbXkgQHN0YWNrID0gKAorCXsKKwkJJ3JldicgPT4gZGVmaW5lZCAkc3RhcnRpbmdfcmV2ID8gJHN0YXJ0aW5nX3JldiA6ICJIRUFEIiwKKwkJJ2ZpbGVuYW1lJyA9PiAkZmlsZW5hbWUsCisJfSwKKyk7CisKK291ciBAZmlsZWxpbmVzID0gKCk7CisKK2lmIChkZWZpbmVkICRzdGFydGluZ19yZXYpIHsKKwlAZmlsZWxpbmVzID0gZ2l0X2NhdF9maWxlKCRzdGFydGluZ19yZXYsICRmaWxlbmFtZSk7Cit9IGVsc2UgeworCW9wZW4oRiwiPCIsJGZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZpbGVuYW1lOiAkISI7CisKKwl3aGlsZSg8Rj4pIHsKKwkJY2hvbXA7CisJCXB1c2ggQGZpbGVsaW5lcywgJF87CisJfQorCWNsb3NlKEYpOworCit9CisKK291ciAlcmV2czsKK291ciBAcmV2cXVldWU7CitvdXIgJGhlYWQ7CisKK215ICRyZXZzcHJvY2Vzc2VkID0gMDsKK3doaWxlIChteSAkYm91bmQgPSBwb3AgQHN0YWNrKSB7CisJbXkgQHJldmlzaW9ucyA9IGdpdF9yZXZfbGlzdCgkYm91bmQtPnsncmV2J30sICRib3VuZC0+eydmaWxlbmFtZSd9KTsKKwlmb3JlYWNoIG15ICRyZXZpbnN0IChAcmV2aXNpb25zKSB7CisJCW15ICgkcmV2LCBAcGFyZW50cykgPSBAJHJldmluc3Q7CisJCSRoZWFkIHx8PSAkcmV2OworCisJCWlmICghZGVmaW5lZCgkcmV2KSkgeworCQkJJHJldiA9ICIiOworCQl9CisJCSRyZXZzeyRyZXZ9eydmaWxlbmFtZSd9ID0gJGJvdW5kLT57J2ZpbGVuYW1lJ307CisJCWlmIChzY2FsYXIgQHBhcmVudHMgPiAwKSB7CisJCQkkcmV2c3skcmV2fXsncGFyZW50cyd9ID0gXEBwYXJlbnRzOworCQkJbmV4dDsKKwkJfQorCisJCWlmICghJHJlbmFtZSkgeworCQkJbmV4dDsKKwkJfQorCisJCW15ICRuZXdib3VuZCA9IGZpbmRfcGFyZW50X3JlbmFtZXMoJHJldiwgJGJvdW5kLT57J2ZpbGVuYW1lJ30pOworCQlpZiAoIGV4aXN0cyAkbmV3Ym91bmQtPnsnZmlsZW5hbWUnfSAmJiAkbmV3Ym91bmQtPnsnZmlsZW5hbWUnfSBuZSAkYm91bmQtPnsnZmlsZW5hbWUnfSkgeworCQkJcHVzaCBAc3RhY2ssICRuZXdib3VuZDsKKwkJCSRyZXZzeyRyZXZ9eydwYXJlbnRzJ30gPSBbJG5ld2JvdW5kLT57J3Jldid9XTsKKwkJfQorCX0KK30KK3B1c2ggQHJldnF1ZXVlLCAkaGVhZDsKK2luaXRfY2xhaW0oIGRlZmluZWQgJHN0YXJ0aW5nX3JldiA/ICRoZWFkIDogJ2RpcnR5Jyk7Cit1bmxlc3MgKGRlZmluZWQgJHN0YXJ0aW5nX3JldikgeworCW15ICRkaWZmID0gb3Blbl9waXBlKCJnaXQiLCJkaWZmIiwiSEVBRCIsICItLSIsJGZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBjYWxsIGdpdCBkaWZmIHRvIGNoZWNrIGZvciBkaXJ0eSBzdGF0ZTogJCEiOworCisJX2dpdF9kaWZmX3BhcnNlKCRkaWZmLCBbJGhlYWRdLCAiZGlydHkiLCAoCisJCQkJJ2F1dGhvcicgPT4gZ2l0dmFyX25hbWUoIkdJVF9BVVRIT1JfSURFTlQiKSwKKwkJCQknYXV0aG9yX2RhdGUnID0+IHNwcmludGYoIiVzICswMDAwIix0aW1lKCkpLAorCQkJCSkKKwkJCSk7CisJY2xvc2UoJGRpZmYpOworfQoraGFuZGxlX3JldigpOworCisKK215ICRpID0gMDsKK2ZvcmVhY2ggbXkgJGwgKEBmaWxlbGluZXMpIHsKKwlteSAoJG91dHB1dCwgJHJldiwgJGNvbW1pdHRlciwgJGRhdGUpOworCWlmIChyZWYgJGwgZXEgJ0FSUkFZJykgeworCQkoJG91dHB1dCwgJHJldiwgJGNvbW1pdHRlciwgJGRhdGUpID0gQCRsOworCQlpZiAoISRsb25ncmV2ICYmIGxlbmd0aCgkcmV2KSA+IDgpIHsKKwkJCSRyZXYgPSBzdWJzdHIoJHJldiwwLDgpOworCQl9CisJfSBlbHNlIHsKKwkJJG91dHB1dCA9ICRsOworCQkoJHJldiwgJGNvbW1pdHRlciwgJGRhdGUpID0gKCd1bmtub3duJywgJ3Vua25vd24nLCAndW5rbm93bicpOworCX0KKworCXByaW50ZigiJXNcdCglMTBzXHQlMTBzXHQlZCklc1xuIiwgJHJldiwgJGNvbW1pdHRlciwKKwkJZm9ybWF0X2RhdGUoJGRhdGUpLCArKyRpLCAkb3V0cHV0KTsKK30KKworc3ViIGluaXRfY2xhaW0geworCW15ICgkcmV2KSA9IEBfOworCWZvciAobXkgJGkgPSAwOyAkaSA8IEBmaWxlbGluZXM7ICRpKyspIHsKKwkJJGZpbGVsaW5lc1skaV0gPSBbICRmaWxlbGluZXNbJGldLCAnJywgJycsICcnLCAxXTsKKwkJCSMgbGluZSwKKwkJCSMgcmV2LAorCQkJIyBhdXRob3IsCisJCQkjIGRhdGUsCisJCQkjIDEgPC0tIGJlbG9uZ3MgdG8gdGhlIG9yaWdpbmFsIGZpbGUuCisJfQorCSRyZXZzeyRyZXZ9eydsaW5lcyd9ID0gXEBmaWxlbGluZXM7Cit9CisKKworc3ViIGhhbmRsZV9yZXYgeworCW15ICRyZXZzZWVuID0gMDsKKwlteSAlc2VlbjsKKwl3aGlsZSAobXkgJHJldiA9IHNoaWZ0IEByZXZxdWV1ZSkgeworCQluZXh0IGlmICRzZWVueyRyZXZ9Kys7CisKKwkJbXkgJXJldmluZm8gPSBnaXRfY29tbWl0X2luZm8oJHJldik7CisKKwkJaWYgKGV4aXN0cyAkcmV2c3skcmV2fXtwYXJlbnRzfSAmJgorCQkgICAgc2NhbGFyIEB7JHJldnN7JHJldn17cGFyZW50c319ICE9IDApIHsKKworCQkJZ2l0X2RpZmZfcGFyc2UoJHJldnN7JHJldn17J3BhcmVudHMnfSwgJHJldiwgJXJldmluZm8pOworCQkJcHVzaCBAcmV2cXVldWUsIEB7JHJldnN7JHJldn17J3BhcmVudHMnfX07CisKKwkJfSBlbHNlIHsKKwkJCSMgV2UgbXVzdCBiZSBhdCB0aGUgaW5pdGlhbCByZXYgaGVyZSwgc28gY2xhaW0gZXZlcnl0aGluZyB0aGF0IGlzIGxlZnQuCisJCQlmb3IgKG15ICRpID0gMDsgJGkgPCBAeyRyZXZzeyRyZXZ9e2xpbmVzfX07ICRpKyspIHsKKwkJCQlpZiAocmVmICR7JHJldnN7JHJldn17bGluZXN9fVskaV0gZXEgJycgfHwgJHskcmV2c3skcmV2fXtsaW5lc319WyRpXVsxXSBlcSAnJykgeworCQkJCQljbGFpbV9saW5lKCRpLCAkcmV2LCAkcmV2c3skcmV2fXtsaW5lc30sICVyZXZpbmZvKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKworc3ViIGdpdF9yZXZfbGlzdCB7CisJbXkgKCRyZXYsICRmaWxlKSA9IEBfOworCisJbXkgJHJldmxpc3Q7CisJaWYgKCRyZXZfZmlsZSkgeworCQlvcGVuKCRyZXZsaXN0LCAnPCcgLiAkcmV2X2ZpbGUpCisJCSAgICBvciBkaWUgIkZhaWxlZCB0byBvcGVuICRyZXZfZmlsZSA6ICQhIjsKKwl9IGVsc2UgeworCQkkcmV2bGlzdCA9IG9wZW5fcGlwZSgiZ2l0LXJldi1saXN0IiwiLS1wYXJlbnRzIiwiLS1yZW1vdmUtZW1wdHkiLCRyZXYsIi0tIiwkZmlsZSkKKwkJCW9yIGRpZSAiRmFpbGVkIHRvIGV4ZWMgZ2l0LXJldi1saXN0OiAkISI7CisJfQorCisJbXkgQHJldnM7CisJd2hpbGUobXkgJGxpbmUgPSA8JHJldmxpc3Q+KSB7CisJCWNob21wICRsaW5lOworCQlteSAoJHJldiwgQHBhcmVudHMpID0gc3BsaXQgL1xzKy8sICRsaW5lOworCQlwdXNoIEByZXZzLCBbICRyZXYsIEBwYXJlbnRzIF07CisJfQorCWNsb3NlKCRyZXZsaXN0KTsKKworCXByaW50ZigiMCByZXZzIGZvdW5kIGZvciByZXYgJXMgKCVzKVxuIiwgJHJldiwgJGZpbGUpIGlmIChAcmV2cyA9PSAwKTsKKwlyZXR1cm4gQHJldnM7Cit9CisKK3N1YiBmaW5kX3BhcmVudF9yZW5hbWVzIHsKKwlteSAoJHJldiwgJGZpbGUpID0gQF87CisKKwlteSAkcGF0Y2ggPSBvcGVuX3BpcGUoImdpdC1kaWZmLXRyZWUiLCAiLU01MCIsICItciIsIi0tbmFtZS1zdGF0dXMiLCAiLXoiLCIkcmV2IikKKwkJb3IgZGllICJGYWlsZWQgdG8gZXhlYyBnaXQtZGlmZjogJCEiOworCisJbG9jYWwgJC8gPSAiXDAiOworCW15ICVib3VuZDsKKwlteSAkanVuayA9IDwkcGF0Y2g+OworCXdoaWxlIChteSAkY2hhbmdlID0gPCRwYXRjaD4pIHsKKwkJY2hvbXAgJGNoYW5nZTsKKwkJbXkgJGZpbGVuYW1lID0gPCRwYXRjaD47CisJCWlmICghZGVmaW5lZCAkZmlsZW5hbWUpIHsKKwkJCW5leHQ7CisJCX0KKwkJY2hvbXAgJGZpbGVuYW1lOworCisJCWlmICgkY2hhbmdlID1+IG0vXltBTURdJC8gKSB7CisJCQluZXh0OworCQl9IGVsc2lmICgkY2hhbmdlID1+IG0vXlIvICkgeworCQkJbXkgJG9sZGZpbGVuYW1lID0gJGZpbGVuYW1lOworCQkJJGZpbGVuYW1lID0gPCRwYXRjaD47CisJCQljaG9tcCAkZmlsZW5hbWU7CisJCQlpZiAoICRmaWxlIGVxICRmaWxlbmFtZSApIHsKKwkJCQlteSAkcGFyZW50ID0gZ2l0X2ZpbmRfcGFyZW50KCRyZXYsICRvbGRmaWxlbmFtZSk7CisJCQkJQGJvdW5keydyZXYnLCdmaWxlbmFtZSd9ID0gKCRwYXJlbnQsICRvbGRmaWxlbmFtZSk7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCX0KKwljbG9zZSgkcGF0Y2gpOworCisJcmV0dXJuIFwlYm91bmQ7Cit9CisKKworc3ViIGdpdF9maW5kX3BhcmVudCB7CisJbXkgKCRyZXYsICRmaWxlbmFtZSkgPSBAXzsKKworCW15ICRyZXZwYXJlbnQgPSBvcGVuX3BpcGUoImdpdC1yZXYtbGlzdCIsIi0tcmVtb3ZlLWVtcHR5IiwgIi0tcGFyZW50cyIsIi0tbWF4LWNvdW50PTEiLCIkcmV2IiwiLS0iLCRmaWxlbmFtZSkKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbiBnaXQtcmV2LWxpc3QgdG8gZmluZCBhIHNpbmdsZSBwYXJlbnQ6ICQhIjsKKworCW15ICRwYXJlbnRsaW5lID0gPCRyZXZwYXJlbnQ+OworCWNob21wICRwYXJlbnRsaW5lOworCW15ICgkcmV2Zm91bmQsJHBhcmVudCkgPSBzcGxpdCBtL1xzKy8sICRwYXJlbnRsaW5lOworCisJY2xvc2UoJHJldnBhcmVudCk7CisKKwlyZXR1cm4gJHBhcmVudDsKK30KKworc3ViIGdpdF9maW5kX2FsbF9wYXJlbnRzIHsKKwlteSAoJHJldikgPSBAXzsKKworCW15ICRyZXZwYXJlbnQgPSBvcGVuX3BpcGUoImdpdC1yZXYtbGlzdCIsIi0tcmVtb3ZlLWVtcHR5IiwgIi0tcGFyZW50cyIsIi0tbWF4LWNvdW50PTEiLCIkcmV2IikKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbiBnaXQtcmV2LWxpc3QgdG8gZmluZCBhIHNpbmdsZSBwYXJlbnQ6ICQhIjsKKworCW15ICRwYXJlbnRsaW5lID0gPCRyZXZwYXJlbnQ+OworCWNob21wICRwYXJlbnRsaW5lOworCW15ICgkb3JpZ3JldiwgQHBhcmVudHMpID0gc3BsaXQgbS9ccysvLCAkcGFyZW50bGluZTsKKworCWNsb3NlKCRyZXZwYXJlbnQpOworCisJcmV0dXJuIEBwYXJlbnRzOworfQorCitzdWIgZ2l0X21lcmdlX2Jhc2UgeworCW15ICgkcmV2MSwgJHJldjIpID0gQF87CisKKwlteSAkbWIgPSBvcGVuX3BpcGUoImdpdC1tZXJnZS1iYXNlIiwgJHJldjEsICRyZXYyKQorCSAgICAgICAgb3IgZGllICJGYWlsZWQgdG8gb3BlbiBnaXQtbWVyZ2UtYmFzZTogJCEiOworCisJbXkgJGJhc2UgPSA8JG1iPjsKKwljaG9tcCAkYmFzZTsKKworCWNsb3NlKCRtYik7CisKKwlyZXR1cm4gJGJhc2U7Cit9CisKKyMgQ29uc3RydWN0IGEgc2V0IG9mIHBzZXVkbyBwYXJlbnRzIHRoYXQgYXJlIGluIHRoZSBzYW1lIG9yZGVyLAorIyBhbmQgdGhlIHNhbWUgcXVhbnRpdHkgYXMgdGhlIHJlYWwgcGFyZW50cywKKyMgYnV0IHdob3NlIFNIQTFzIGFyZSBhcyBzaW1pbGFyIHRvIHRoZSBsb2dpY2FsIHBhcmVudHMKKyMgYXMgcG9zc2libGUuCitzdWIgZ2V0X3BzZXVkb19wYXJlbnRzIHsKKwlteSAoJGFsbCwgJGZha2UpID0gQF87CisKKwlteSBAYWxsID0gQCRhbGw7CisJbXkgQGZha2UgPSBAJGZha2U7CisKKwlteSBAcHNldWRvOworCisJbXkgJWZha2UgPSBtYXAgeyRfID0+IDF9IEBmYWtlOworCW15ICVzZWVuZmFrZTsKKworCW15ICRmYWtlaWR4ID0gMDsKKwlmb3JlYWNoIG15ICRwIChAYWxsKSB7CisJCWlmIChleGlzdHMgJGZha2V7JHB9KSB7CisJCQlpZiAoJGZha2VbJGZha2VpZHhdIG5lICRwKSB7CisJCQkJZGllIHNwcmludGYoInBhcmVudCBtaXNtYXRjaDogJXMgIT0gJXNcbmFsbDolc1xuZmFrZTolc1xuIiwKKwkJCQkJICAgICRmYWtlWyRmYWtlaWR4XSwgJHAsCisJCQkJCSAgICBqb2luKCIsICIsIEBhbGwpLAorCQkJCQkgICAgam9pbigiLCAiLCBAZmFrZSksCisJCQkJCSAgICk7CisJCQl9CisKKwkJCXB1c2ggQHBzZXVkbywgJHA7CisJCQkkZmFrZWlkeCsrOworCQkJJHNlZW5mYWtleyRwfSsrOworCisJCX0gZWxzZSB7CisJCQlteSAkYmFzZSA9IGdpdF9tZXJnZV9iYXNlKCRmYWtlWyRmYWtlaWR4XSwgJHApOworCQkJaWYgKCRiYXNlIG5lICRmYWtlWyRmYWtlaWR4XSkgeworCQkJCWRpZSBzcHJpbnRmKCJSZXN1bHQgb2YgbWVyZ2UtYmFzZSBkb2Vzbid0IG1hdGNoIGZha2U6ICVzLCVzICE9ICVzXG4iLAorCQkJCSAgICAgICAkZmFrZVskZmFrZWlkeF0sICRwLCAkYmFzZSk7CisJCQl9CisKKwkJCSMgVGhlIGRldGFpbHMgb2YgaG93IHdlIHBhcnNlIHRoZSBkaWZmcworCQkJIyBtZWFuIHRoYXQgd2UgY2Fubm90IGhhdmUgYSBkdXBsaWNhdGUKKwkJCSMgcmV2aXNpb24gaW4gdGhlIGxpc3QsIHNvIGlmIHdlJ3ZlIGFscmVhZHkKKwkJCSMgc2VlbiB0aGUgcmV2aXNpb24gd2Ugd291bGQgbm9ybWFsbHkgYWRkLCBqdXN0IHVzZQorCQkJIyB0aGUgYWN0dWFsIHJldmlzaW9uLgorCQkJaWYgKCRzZWVuZmFrZXskYmFzZX0pIHsKKwkJCQlwdXNoIEBwc2V1ZG8sICRwOworCQkJfSBlbHNlIHsKKwkJCQlwdXNoIEBwc2V1ZG8sICRiYXNlOworCQkJCSRzZWVuZmFrZXskYmFzZX0rKzsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBAcHNldWRvOworfQorCisKKyMgR2V0IGEgZGlmZiBiZXR3ZWVuIHRoZSBjdXJyZW50IHJldmlzaW9uIGFuZCBhIHBhcmVudC4KKyMgUmVjb3JkIHRoZSBjb21taXQgaW5mb3JtYXRpb24gdGhhdCByZXN1bHRzLgorc3ViIGdpdF9kaWZmX3BhcnNlIHsKKwlteSAoJHBhcmVudHMsICRyZXYsICVyZXZpbmZvKSA9IEBfOworCisJbXkgQHBzZXVkb19wYXJlbnRzOworCW15IEBjb21tYW5kID0gKCJnaXQtZGlmZi10cmVlIik7CisJbXkgJHJldmlzaW9uX3NwZWM7CisKKwlpZiAoc2NhbGFyIEAkcGFyZW50cyA9PSAxKSB7CisKKwkJJHJldmlzaW9uX3NwZWMgPSBqb2luKCIuLiIsICRwYXJlbnRzLT5bMF0sICRyZXYpOworCQlAcHNldWRvX3BhcmVudHMgPSBAJHBhcmVudHM7CisJfSBlbHNlIHsKKwkJbXkgQGFsbF9wYXJlbnRzID0gZ2l0X2ZpbmRfYWxsX3BhcmVudHMoJHJldik7CisKKwkJaWYgKEBhbGxfcGFyZW50cyAhPSAgQCRwYXJlbnRzKSB7CisJCQlAcHNldWRvX3BhcmVudHMgPSBnZXRfcHNldWRvX3BhcmVudHMoXEBhbGxfcGFyZW50cywgJHBhcmVudHMpOworCQl9IGVsc2UgeworCQkJQHBzZXVkb19wYXJlbnRzID0gQCRwYXJlbnRzOworCQl9CisKKwkJJHJldmlzaW9uX3NwZWMgPSAkcmV2OworCQlwdXNoIEBjb21tYW5kLCAiLWMiOworCX0KKworCW15IEBmaWxlbmFtZXMgPSAoICRyZXZzeyRyZXZ9eydmaWxlbmFtZSd9ICk7CisKKwlmb3JlYWNoIG15ICRwYXJlbnQgKEAkcGFyZW50cykgeworCQlwdXNoIEBmaWxlbmFtZXMsICRyZXZzeyRwYXJlbnR9eydmaWxlbmFtZSd9OworCX0KKworCXB1c2ggQGNvbW1hbmQsICItcCIsICItTSIsICRyZXZpc2lvbl9zcGVjLCAiLS0iLCBAZmlsZW5hbWVzOworCisKKwlteSAkZGlmZiA9IG9wZW5fcGlwZSggQGNvbW1hbmQgKQorCQlvciBkaWUgIkZhaWxlZCB0byBjYWxsIGdpdC1kaWZmIGZvciBhbm5vdGF0aW9uOiAkISI7CisKKwlfZ2l0X2RpZmZfcGFyc2UoJGRpZmYsIFxAcHNldWRvX3BhcmVudHMsICRyZXYsICVyZXZpbmZvKTsKKworCWNsb3NlKCRkaWZmKTsKK30KKworc3ViIF9naXRfZGlmZl9wYXJzZSB7CisJbXkgKCRkaWZmLCAkcGFyZW50cywgJHJldiwgJXJldmluZm8pID0gQF87CisKKwlteSAkcmkgPSAwOworCisJbXkgJHNsaW5lcyA9ICRyZXZzeyRyZXZ9eydsaW5lcyd9OworCW15ICglcGxpbmVzLCAlcGkpOworCisJbXkgJGdvdGhlYWRlciA9IDA7CisJbXkgKCRyZW1zdGFydCk7CisJbXkgJHBhcmVudF9jb3VudCA9IEAkcGFyZW50czsKKworCW15ICRkaWZmX2hlYWRlcl9yZWdleHAgPSAiXkAiOworCSRkaWZmX2hlYWRlcl9yZWdleHAgLj0gIkAiIHggQCRwYXJlbnRzOworCSRkaWZmX2hlYWRlcl9yZWdleHAgLj0gJyAtXGQrLFxkKycgeCBAJHBhcmVudHM7CisJJGRpZmZfaGVhZGVyX3JlZ2V4cCAuPSAnIFwrKFxkKyksXGQrJzsKKwkkZGlmZl9oZWFkZXJfcmVnZXhwIC49ICIgIiAuICgiQCIgeCBAJHBhcmVudHMpOworCisJbXkgJWNsYWltX3JlZ2V4cHM7CisJbXkgJGFsbHBhcmVudHBsdXMgPSAnXicgLiAnXFwrJyB4IEAkcGFyZW50cyAuICcoLiopJCc7CisKKwl7CisJCW15ICRpID0gMDsKKwkJZm9yZWFjaCBteSAkcGFyZW50IChAJHBhcmVudHMpIHsKKworCQkJJHBpeyRwYXJlbnR9ID0gMDsKKwkJCW15ICRyID0gJ14nIC4gJy4nIHggQCRwYXJlbnRzIC4gJyguKikkJzsKKwkJCW15ICRwID0gJHI7CisJCQlzdWJzdHIoJHAsJGkrMSwgMSkgPSAnXFwrJzsKKworCQkJbXkgJG0gPSAkcjsKKwkJCXN1YnN0cigkbSwkaSsxLCAxKSA9ICctJzsKKworCQkJJGNsYWltX3JlZ2V4cHN7JHBhcmVudH17cGx1c30gPSAkcDsKKwkJCSRjbGFpbV9yZWdleHBzeyRwYXJlbnR9e21pbnVzfSA9ICRtOworCisJCQkkcGxpbmVzeyRwYXJlbnR9ID0gW107CisKKwkJCSRpKys7CisJCX0KKwl9CisKKwlESUZGOgorCXdoaWxlKDwkZGlmZj4pIHsKKwkJY2hvbXA7CisJCSNwcmludGYoIiVkOiVzOlxuIiwgJGdvdGhlYWRlciwgJF8pOworCQlpZiAobS8kZGlmZl9oZWFkZXJfcmVnZXhwLykgeworCQkJJHJlbXN0YXJ0ID0gJDEgLSAxOworCQkJIyAoMC1iYXNlZCBhcnJheXMpCisKKwkJCSRnb3RoZWFkZXIgPSAxOworCisJCQlmb3JlYWNoIG15ICRwYXJlbnQgKEAkcGFyZW50cykgeworCQkJCWZvciAobXkgJGkgPSAkcmk7ICRpIDwgJHJlbXN0YXJ0OyAkaSsrKSB7CisJCQkJCSRwbGluZXN7JHBhcmVudH1bJHBpeyRwYXJlbnR9KytdID0gJHNsaW5lcy0+WyRpXTsKKwkJCQl9CisJCQl9CisJCQkkcmkgPSAkcmVtc3RhcnQ7CisKKwkJCW5leHQgRElGRjsKKworCQl9IGVsc2lmICghJGdvdGhlYWRlcikgeworCQkJIyBTa2lwIG92ZXIgdGhlIGxlYWRpbi4KKwkJCW5leHQgRElGRjsKKwkJfQorCisJCWlmIChtL15cXC8pIHsKKwkJCTsKKwkJCSMgU2tpcCBcTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZS4KKwkJCSMgQnV0IHRoaXMgY2FuIGJlIGludGVybmF0aW9uYWxpemVkLCBzbyBvbmx5IGxvb2sKKwkJCSMgZm9yIGFuIGluaXRpYWwgXAorCisJCX0gZWxzZSB7CisJCQlteSAlY2xhaW1zID0gKCk7CisJCQlteSAkbmVnY2xhaW0gPSAwOworCQkJbXkgJGFsbGNsYWltZWQgPSAwOworCQkJbXkgJGxpbmU7CisKKwkJCWlmIChtLyRhbGxwYXJlbnRwbHVzLykgeworCQkJCWNsYWltX2xpbmUoJHJpLCAkcmV2LCAkc2xpbmVzLCAlcmV2aW5mbyk7CisJCQkJJGFsbGNsYWltZWQgPSAxOworCisJCQl9CisKKwkJCVBBUkVOVDoKKwkJCWZvcmVhY2ggbXkgJHBhcmVudCAoa2V5cyAlY2xhaW1fcmVnZXhwcykgeworCQkJCW15ICRtID0gJGNsYWltX3JlZ2V4cHN7JHBhcmVudH17bWludXN9OworCQkJCW15ICRwID0gJGNsYWltX3JlZ2V4cHN7JHBhcmVudH17cGx1c307CisKKwkJCQlpZiAobS8kbS8pIHsKKwkJCQkJJGxpbmUgPSAkMTsKKwkJCQkJJHBsaW5lc3skcGFyZW50fVskcGl7JHBhcmVudH0rK10gPSBbICRsaW5lLCAnJywgJycsICcnLCAwIF07CisJCQkJCSRuZWdjbGFpbSsrOworCisJCQkJfSBlbHNpZiAobS8kcC8pIHsKKwkJCQkJJGxpbmUgPSAkMTsKKwkJCQkJaWYgKGdldF9saW5lKCRzbGluZXMsICRyaSkgZXEgJGxpbmUpIHsKKwkJCQkJCSMgRm91bmQgYSBtYXRjaCwgY2xhaW0KKwkJCQkJCSRjbGFpbXN7JHBhcmVudH0rKzsKKworCQkJCQl9IGVsc2UgeworCQkJCQkJZGllIHNwcmludGYoIlN5bmMgZXJyb3I6ICVkXG58JXNcbnwlc1xuJXMgPT4gJXNcbiIsCisJCQkJCQkJCSRyaSwgJGxpbmUsCisJCQkJCQkJCWdldF9saW5lKCRzbGluZXMsICRyaSksCisJCQkJCQkJCSRyZXYsICRwYXJlbnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoJWNsYWltcykgeworCQkJCWZvcmVhY2ggbXkgJHBhcmVudCAoQCRwYXJlbnRzKSB7CisJCQkJCW5leHQgaWYgJGNsYWltc3skcGFyZW50fSB8fCAkYWxsY2xhaW1lZDsKKwkJCQkJJHBsaW5lc3skcGFyZW50fVskcGl7JHBhcmVudH0rK10gPSAkc2xpbmVzLT5bJHJpXTsKKwkJCQkJICAgICNbICRsaW5lLCAnJywgJycsICcnLCAwIF07CisJCQkJfQorCQkJCSRyaSsrOworCisJCQl9IGVsc2lmICgkbmVnY2xhaW0pIHsKKwkJCQluZXh0IERJRkY7CisKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN1YnN0cigkXyxzY2FsYXIgQCRwYXJlbnRzKSBuZSBnZXRfbGluZSgkc2xpbmVzLCRyaSkgKSB7CisJCQkJICAgICAgICBmb3JlYWNoIG15ICRwYXJlbnQgKEAkcGFyZW50cykgeworCQkJCQkJcHJpbnRmKCJwYXJlbnQgJXMgaXMgb24gbGluZSAlZFxuIiwgJHBhcmVudCwgJHBpeyRwYXJlbnR9KTsKKwkJCQkJfQorCisJCQkJCW15IEBjb250ZXh0OworCQkJCQlmb3IgKG15ICRpID0gLTI7ICRpIDwgMjsgJGkrKykgeworCQkJCQkJcHVzaCBAY29udGV4dCwgZ2V0X2xpbmUoJHNsaW5lcywgJHJpICsgJGkpOworCQkJCQl9CisJCQkJCW15ICRjb250ZXh0ID0gam9pbigiXG4iLCBAY29udGV4dCk7CisKKwkJCQkJbXkgJGp1c3RsaW5lID0gc3Vic3RyKCRfLCBzY2FsYXIgQCRwYXJlbnRzKTsKKwkJCQkJZGllIHNwcmludGYoIkxpbmUgJWQsIGRvZXMgbm90IG1hdGNoOlxufCVzfFxufCVzfFxuJXNcbiIsCisJCQkJCQkgICAgJHJpLAorCQkJCQkJICAgICRqdXN0bGluZSwKKwkJCQkJCSAgICAkY29udGV4dCk7CisJCQkJfQorCQkJCWZvcmVhY2ggbXkgJHBhcmVudCAoQCRwYXJlbnRzKSB7CisJCQkJCSRwbGluZXN7JHBhcmVudH1bJHBpeyRwYXJlbnR9KytdID0gJHNsaW5lcy0+WyRyaV07CisJCQkJfQorCQkJCSRyaSsrOworCQkJfQorCQl9CisJfQorCisJZm9yIChteSAkaSA9ICRyaTsgJGkgPCBAeyRzbGluZXN9IDsgJGkrKykgeworCQlmb3JlYWNoIG15ICRwYXJlbnQgKEAkcGFyZW50cykgeworCQkJcHVzaCBAeyRwbGluZXN7JHBhcmVudH19LCAkc2xpbmVzLT5bJHJpXTsKKwkJfQorCQkkcmkrKzsKKwl9CisKKwlmb3JlYWNoIG15ICRwYXJlbnQgKEAkcGFyZW50cykgeworCQkkcmV2c3skcGFyZW50fXtsaW5lc30gPSAkcGxpbmVzeyRwYXJlbnR9OworCX0KKworCXJldHVybjsKK30KKworc3ViIGdldF9saW5lIHsKKwlteSAoJGxpbmVzLCAkaW5kZXgpID0gQF87CisKKwlyZXR1cm4gcmVmICRsaW5lcy0+WyRpbmRleF0gbmUgJycgPyAkbGluZXMtPlskaW5kZXhdWzBdIDogJGxpbmVzLT5bJGluZGV4XTsKK30KKworc3ViIGdpdF9jYXRfZmlsZSB7CisJbXkgKCRyZXYsICRmaWxlbmFtZSkgPSBAXzsKKwlyZXR1cm4gKCkgdW5sZXNzIGRlZmluZWQgJHJldiAmJiBkZWZpbmVkICRmaWxlbmFtZTsKKworCW15ICRibG9iID0gZ2l0X2xzX3RyZWUoJHJldiwgJGZpbGVuYW1lKTsKKwlkaWUgIkZhaWxlZCB0byBmaW5kIGEgYmxvYiBmb3IgJGZpbGVuYW1lIGluIHJldiAkcmV2XG4iIGlmICFkZWZpbmVkICRibG9iOworCisJbXkgJGNhdGZpbGUgPSBvcGVuX3BpcGUoImdpdCIsImNhdC1maWxlIiwgImJsb2IiLCAkYmxvYikKKwkJb3IgZGllICJGYWlsZWQgdG8gZ2l0LWNhdC1maWxlIGJsb2IgJGJsb2IgKHJldiAkcmV2LCBmaWxlICRmaWxlbmFtZSk6ICIgLiAkITsKKworCW15IEBsaW5lczsKKwl3aGlsZSg8JGNhdGZpbGU+KSB7CisJCWNob21wOworCQlwdXNoIEBsaW5lcywgJF87CisJfQorCWNsb3NlKCRjYXRmaWxlKTsKKworCXJldHVybiBAbGluZXM7Cit9CisKK3N1YiBnaXRfbHNfdHJlZSB7CisJbXkgKCRyZXYsICRmaWxlbmFtZSkgPSBAXzsKKworCW15ICRsc3RyZWUgPSBvcGVuX3BpcGUoImdpdCIsImxzLXRyZWUiLCRyZXYsJGZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBjYWxsIGdpdCBscy10cmVlOiAkISI7CisKKwlteSAoJG1vZGUsICR0eXBlLCAkYmxvYiwgJHRmaWxlbmFtZSk7CisJd2hpbGUoPCRsc3RyZWU+KSB7CisJCWNob21wOworCQkoJG1vZGUsICR0eXBlLCAkYmxvYiwgJHRmaWxlbmFtZSkgPSBzcGxpdCgvXHMrLywgJF8sIDQpOworCQlsYXN0IGlmICgkdGZpbGVuYW1lIGVxICRmaWxlbmFtZSk7CisJfQorCWNsb3NlKCRsc3RyZWUpOworCisJcmV0dXJuICRibG9iIGlmICgkdGZpbGVuYW1lIGVxICRmaWxlbmFtZSk7CisJZGllICJnaXQtbHMtdHJlZSBmYWlsZWQgdG8gZmluZCBibG9iIGZvciAkZmlsZW5hbWUiOworCit9CisKKworCitzdWIgY2xhaW1fbGluZSB7CisJbXkgKCRmbG9mZnNldCwgJHJldiwgJGxpbmVzLCAlcmV2aW5mbykgPSBAXzsKKwlteSAkb2xpbmUgPSBnZXRfbGluZSgkbGluZXMsICRmbG9mZnNldCk7CisJQHskbGluZXMtPlskZmxvZmZzZXRdfSA9ICggJG9saW5lLCAkcmV2LAorCQkkcmV2aW5mb3snYXV0aG9yJ30sICRyZXZpbmZveydhdXRob3JfZGF0ZSd9ICk7CisJI3ByaW50ZigiQ2xhaW1pbmcgbGluZSAlZCB3aXRoIHJldiAlczogJyVzJ1xuIiwKKwkjCQkkZmxvZmZzZXQsICRyZXYsICRvbGluZSkgaWYgMTsKK30KKworc3ViIGdpdF9jb21taXRfaW5mbyB7CisJbXkgKCRyZXYpID0gQF87CisJbXkgJGNvbW1pdCA9IG9wZW5fcGlwZSgiZ2l0LWNhdC1maWxlIiwgImNvbW1pdCIsICRyZXYpCisJCW9yIGRpZSAiRmFpbGVkIHRvIGNhbGwgZ2l0LWNhdC1maWxlOiAkISI7CisKKwlteSAlaW5mbzsKKwl3aGlsZSg8JGNvbW1pdD4pIHsKKwkJY2hvbXA7CisJCWxhc3QgaWYgKGxlbmd0aCAkXyA9PSAwKTsKKworCQlpZiAobS9eYXV0aG9yICguKikgPCguKik+ICguKikkLykgeworCQkJJGluZm97J2F1dGhvcid9ID0gJDE7CisJCQkkaW5mb3snYXV0aG9yX2VtYWlsJ30gPSAkMjsKKwkJCSRpbmZveydhdXRob3JfZGF0ZSd9ID0gJDM7CisJCX0gZWxzaWYgKG0vXmNvbW1pdHRlciAoLiopIDwoLiopPiAoLiopJC8pIHsKKwkJCSRpbmZveydjb21taXR0ZXInfSA9ICQxOworCQkJJGluZm97J2NvbW1pdHRlcl9lbWFpbCd9ID0gJDI7CisJCQkkaW5mb3snY29tbWl0dGVyX2RhdGUnfSA9ICQzOworCQl9CisJfQorCWNsb3NlKCRjb21taXQpOworCisJcmV0dXJuICVpbmZvOworfQorCitzdWIgZm9ybWF0X2RhdGUgeworCWlmICgkcmF3dGltZSkgeworCQlyZXR1cm4gJF9bMF07CisJfQorCW15ICgkdGltZXN0YW1wLCAkdGltZXpvbmUpID0gc3BsaXQoJyAnLCAkX1swXSk7CisJbXkgJG1pbnV0ZXMgPSBhYnMoJHRpbWV6b25lKTsKKwkkbWludXRlcyA9IGludCgkbWludXRlcyAvIDEwMCkgKiA2MCArICgkbWludXRlcyAlIDEwMCk7CisJaWYgKCR0aW1lem9uZSA8IDApIHsKKwkgICAgJG1pbnV0ZXMgPSAtJG1pbnV0ZXM7CisJfQorCW15ICR0ID0gJHRpbWVzdGFtcCArICRtaW51dGVzICogNjA7CisJcmV0dXJuIHN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyAiIC4gJHRpbWV6b25lLCBnbXRpbWUoJHQpKTsKK30KKworIyBDb3BpZWQgZnJvbSBnaXQtc2VuZC1lbWFpbC5wZXJsIC0gV2UgbmVlZCBhIEdpdC5wbSBtb2R1bGUuLgorc3ViIGdpdHZhciB7CisgICAgbXkgKCR2YXIpID0gQF87CisgICAgbXkgJGZoOworICAgIG15ICRwaWQgPSBvcGVuKCRmaCwgJy18Jyk7CisgICAgZGllICIkISIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKyAgICBpZiAoISRwaWQpIHsKKwlleGVjKCdnaXQtdmFyJywgJHZhcikgb3IgZGllICIkISI7CisgICAgfQorICAgIG15ICgkdmFsKSA9IDwkZmg+OworICAgIGNsb3NlICRmaCBvciBkaWUgIiQhIjsKKyAgICBjaG9tcCgkdmFsKTsKKyAgICByZXR1cm4gJHZhbDsKK30KKworc3ViIGdpdHZhcl9uYW1lIHsKKyAgICBteSAoJG5hbWUpID0gQF87CisgICAgbXkgJHZhbCA9IGdpdHZhcigkbmFtZSk7CisgICAgbXkgQGZpZWxkID0gc3BsaXQoL1xzKy8sICR2YWwpOworICAgIHJldHVybiBqb2luKCcgJywgQGZpZWxkWzAuLi4oQGZpZWxkLTQpXSk7Cit9CisKK3N1YiBvcGVuX3BpcGUgeworCWlmICgkXk8gZXEgJyMjSU5TRVJUX0FDVElWRVNUQVRFX1NUUklOR19IRVJFIyMnKSB7CisJCXJldHVybiBvcGVuX3BpcGVfYWN0aXZlc3RhdGUoQF8pOworCX0gZWxzZSB7CisJCXJldHVybiBvcGVuX3BpcGVfbm9ybWFsKEBfKTsKKwl9Cit9CisKK3N1YiBvcGVuX3BpcGVfYWN0aXZlc3RhdGUgeworCXRpZSAqZmgsICJHaXQ6OkFjdGl2ZVN0YXRlUGlwZSIsIEBfOworCXJldHVybiAqZmg7Cit9CisKK3N1YiBvcGVuX3BpcGVfbm9ybWFsIHsKKwlteSAoQGV4ZWNsaXN0KSA9IEBfOworCisJbXkgJHBpZCA9IG9wZW4gbXkgJGtpZCwgIi18IjsKKwlkZWZpbmVkICRwaWQgb3IgZGllICJDYW5ub3QgZm9yazogJCEiOworCisJdW5sZXNzICgkcGlkKSB7CisJCWV4ZWMgQGV4ZWNsaXN0OworCQlkaWUgIkNhbm5vdCBleGVjIEBleGVjbGlzdDogJCEiOworCX0KKworCXJldHVybiAka2lkOworfQorCitwYWNrYWdlIEdpdDo6QWN0aXZlU3RhdGVQaXBlOwordXNlIHN0cmljdDsKKworc3ViIFRJRUhBTkRMRSB7CisJbXkgKCRjbGFzcywgQHBhcmFtcykgPSBAXzsKKwlteSAkY21kbGluZSA9IGpvaW4gIiAiLCBAcGFyYW1zOworCW15ICBAZGF0YSA9IHF4eyRjbWRsaW5lfTsKKwlibGVzcyB7IGkgPT4gMCwgZGF0YSA9PiBcQGRhdGEgfSwgJGNsYXNzOworfQorCitzdWIgUkVBRExJTkUgeworCW15ICRzZWxmID0gc2hpZnQ7CisJaWYgKCRzZWxmLT57aX0gPj0gc2NhbGFyIEB7JHNlbGYtPntkYXRhfX0pIHsKKwkJcmV0dXJuIHVuZGVmOworCX0KKwlyZXR1cm4gJHNlbGYtPnsnZGF0YSd9LT5bICRzZWxmLT57aX0rKyBdOworfQorCitzdWIgQ0xPU0UgeworCW15ICRzZWxmID0gc2hpZnQ7CisJZGVsZXRlICRzZWxmLT57ZGF0YX07CisJZGVsZXRlICRzZWxmLT57aX07Cit9CisKK3N1YiBFT0YgeworCW15ICRzZWxmID0gc2hpZnQ7CisJcmV0dXJuICgkc2VsZi0+e2l9ID49IHNjYWxhciBAeyRzZWxmLT57ZGF0YX19KTsKK30KZGlmZiAtLWdpdCBhL2dpdC1hcHBseW1ib3guc2ggYi9naXQtYXBwbHltYm94LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1NjlmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYXBwbHltYm94LnNoCkBAIC0wLDAgKzEsMTE2IEBACisjIS9iaW4vc2gKKyMjCisjIyAiZG90ZXN0IiBpcyBteSBzdHVwaWQgbmFtZSBmb3IgbXkgcGF0Y2gtYXBwbGljYXRpb24gc2NyaXB0LCB3aGljaAorIyMgSSBuZXZlciBnb3QgYXJvdW5kIHRvIHJlbmFtaW5nIGFmdGVyIEkgdGVzdGVkIGl0LiBXZSdyZSBub3cgb24gdGhlCisjIyBzZWNvbmQgZ2VuZXJhdGlvbiBvZiBzY3JpcHRzLCBzdGlsbCBjYWxsZWQgImRvdGVzdCIuCisjIworIyMgVXBkYXRlOiBSeWFuIEFuZGVyc29uIGZpbmFsbHkgc2hhbWVkIG1lIGludG8gbmFtaW5nIHRoaXMgImFwcGx5bWJveCIuCisjIworIyMgWW91IGdpdmUgaXQgYSBtYm94LWZvcm1hdCBjb2xsZWN0aW9uIG9mIGVtYWlscywgYW5kIGl0IHdpbGwgdHJ5IHRvCisjIyBhcHBseSB0aGVtIHRvIHRoZSBrZXJuZWwgdXNpbmcgImFwcGx5cGF0Y2giCisjIworIyMgVGhlIHBhdGNoIGFwcGxpY2F0aW9uIG1heSBmYWlsIGluIHRoZSBtaWRkbGUuICBJbiB3aGljaCBjYXNlOgorIyMgKDEpIGxvb2sgYXQgLmRvdGVzdC9wYXRjaCBhbmQgZml4IGl0IHVwIHRvIGFwcGx5CisjIyAoMikgcmUtcnVuIGFwcGx5bWJveCB3aXRoIC1jIC5kb3Rlc3QvbXNnLW51bWJlciBmb3IgdGhlIGN1cnJlbnQgb25lLgorIyMgUGF5IGEgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIGNvbW1pdCBsb2cgbWVzc2FnZSBpZiB5b3UgZG8gdGhpcyBhbmQKKyMjIHVzZSBhIFNpZ25vZmZfZmlsZSwgYmVjYXVzZSBhcHBseXBhdGNoIHdhbnRzIHRvIGFwcGVuZCB0aGUgc2lnbi1vZmYKKyMjIG1lc3NhZ2UgdG8gbXNnLWNsZWFuIGV2ZXJ5IHRpbWUgaXQgaXMgcnVuLgorIyMKKyMjIGdpdC1hbSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgbmV3ZXIgYW5kIGJldHRlciB0b29sIGZvciB0aGlzIGpvYi4KKworVVNBR0U9J1stdV0gWy1rXSBbLXFdIFstbV0gKC1jIC5kb3Rlc3QvPG51bT4gfCBtYm94KSBbc2lnbm9mZl0nCisuIGdpdC1zaC1zZXR1cAorCitnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKK2tlZXBfc3ViamVjdD0gcXVlcnlfYXBwbHk9IGNvbnRpbnVlPSB1dGY4PSByZXN1bWU9dAord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLXUpCXV0Zjg9LXUgOzsKKwktaykJa2VlcF9zdWJqZWN0PS1rIDs7CisJLXEpCXF1ZXJ5X2FwcGx5PXQgOzsKKwktYykJY29udGludWU9IiQyIjsgcmVzdW1lPWY7IHNoaWZ0IDs7CisJLW0pCWZhbGxfYmFja18zd2F5PXQgOzsKKwktKikJdXNhZ2UgOzsKKwkqKQlicmVhayA7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitjYXNlICIkY29udGludWUiIGluCisnJykKKwlybSAtcmYgLmRvdGVzdAorCW1rZGlyIC5kb3Rlc3QKKwludW1fbXNncz0kKGdpdC1tYWlsc3BsaXQgIiQxIiAuZG90ZXN0KSB8fCBleGl0IDEKKwllY2hvICIkbnVtX21zZ3MgcGF0Y2goZXMpIHRvIHByb2Nlc3MuIgorCXNoaWZ0Citlc2FjCisKK2ZpbGVzPSQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLW9ubHkgSEVBRCkgfHwgZXhpdAoraWYgWyAiJGZpbGVzIiBdOyB0aGVuCisgICBlY2hvICJEaXJ0eSBpbmRleDogY2Fubm90IGFwcGx5IHBhdGNoZXMgKGRpcnR5OiAkZmlsZXMpIiA+JjIKKyAgIGV4aXQgMQorZmkKKworY2FzZSAiJHF1ZXJ5X2FwcGx5IiBpbgordCkJdG91Y2ggLmRvdGVzdC8ucXVlcnlfYXBwbHkKK2VzYWMKK2Nhc2UgIiRmYWxsX2JhY2tfM3dheSIgaW4KK3QpCTogPi5kb3Rlc3QvLjN3YXkKK2VzYWMKK2Nhc2UgIiRrZWVwX3N1YmplY3QiIGluCistaykJOiA+LmRvdGVzdC8ua2VlcF9zdWJqZWN0Citlc2FjCisKK3NpZ25vZmY9IiQxIgorc2V0IHggLmRvdGVzdC8wKgorc2hpZnQKK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhazs7IGVzYWMKK2RvCisgICAgaT0iJDEiIAorICAgIGNhc2UgIiRyZXN1bWUsJGNvbnRpbnVlIiBpbgorICAgIGYsJGkpCXJlc3VtZT10OzsKKyAgICBmLCopCXNoaWZ0CisJCWNvbnRpbnVlOzsKKyAgICAqKQorCSAgICBnaXQtbWFpbGluZm8gJGtlZXBfc3ViamVjdCAkdXRmOCBcCisJCS5kb3Rlc3QvbXNnIC5kb3Rlc3QvcGF0Y2ggPCRpID4uZG90ZXN0L2luZm8gfHwgZXhpdCAxCisJICAgIGdpdC1zdHJpcHNwYWNlIDwgLmRvdGVzdC9tc2cgPiAuZG90ZXN0L21zZy1jbGVhbgorCSAgICA7OworICAgIGVzYWMKKyAgICB3aGlsZSA6OyAjIGZvciBmaXhpbmcgdXAgYW5kIHJldHJ5CisgICAgZG8KKwlnaXQtYXBwbHlwYXRjaCAuZG90ZXN0L21zZy1jbGVhbiAuZG90ZXN0L3BhdGNoIC5kb3Rlc3QvaW5mbyAiJHNpZ25vZmYiCisJY2FzZSAiJD8iIGluCisJMCkKKwkJIyBSZW1vdmUgdGhlIGNsZWFubHkgYXBwbGllZCBvbmUgdG8gcmVkdWNlIGNsdXR0ZXIuCisJCXJtIC1mIC5kb3Rlc3QvJGkKKwkJOzsKKwkyKQorCQkjIDIgaXMgYSBzcGVjaWFsIGV4aXQgY29kZSBmcm9tIGFwcGx5cGF0Y2ggdG8gaW5kaWNhdGUgdGhhdAorCSAgICAJIyB0aGUgcGF0Y2ggd2Fzbid0IGFwcGxpZWQsIGJ1dCBjb250aW51ZSBhbnl3YXkgCisJCTs7CisJKikKKwkJcmV0PSQ/CisJCWlmIHRlc3QgLWYgLmRvdGVzdC8ucXVlcnlfYXBwbHkKKwkJdGhlbgorCQkJZWNobyA+JjIgIiogUGF0Y2ggZmFpbGVkLiIKKwkJCWVjaG8gPiYyICIqIFlvdSBjb3VsZCBmaXggaXQgdXAgaW4geW91ciBlZGl0b3IgYW5kIgorCQkJZWNobyA+JjIgIiAgcmV0cnkuICBJZiB5b3Ugd2FudCB0byBkbyBzbywgc2F5IHllcyBoZXJlIgorCQkJZWNobyA+JjIgIiAgQUZURVIgZml4aW5nIC5kb3Rlc3QvcGF0Y2ggdXAuIgorCQkJZWNobyA+JjIgLW4gIlJldHJ5IFt5L05dPyAiCisJCQlyZWFkIHllc25vCisJCQljYXNlICIkeWVzbm8iIGluCisJCQlbWXldKikKKwkJCQljb250aW51ZSA7OworCQkgICAgICAgIGVzYWMKKwkJZmkKKwkJZXhpdCAkcmV0CisJZXNhYworCWJyZWFrCisgICAgZG9uZQorICAgIHNoaWZ0Citkb25lCisjIHJldHVybiB0byBwcmlzdGluZQorcm0gLWZyIC5kb3Rlc3QKZGlmZiAtLWdpdCBhL2dpdC1hcHBseXBhdGNoLnNoIGIvZ2l0LWFwcGx5cGF0Y2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGRmMmFlZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1hcHBseXBhdGNoLnNoCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMjCisjIyBhcHBseXBhdGNoIHRha2VzIGZvdXIgZmlsZSBhcmd1bWVudHMsIGFuZCB1c2VzIHRob3NlIHRvCisjIyBhcHBseSB0aGUgdW5wYWNrZWQgcGF0Y2ggKHN1cnByaXNlIHN1cnByaXNlKSB0aGF0IHRoZXkKKyMjIHJlcHJlc2VudCB0byB0aGUgY3VycmVudCB0cmVlLgorIyMKKyMjIFRoZSBhcmd1bWVudHMgYXJlOgorIyMJJDEgLSBmaWxlIHdpdGggY29tbWl0IG1lc3NhZ2UKKyMjCSQyIC0gZmlsZSB3aXRoIHRoZSBhY3R1YWwgcGF0Y2gKKyMjCSQzIC0gImluZm8iIGZpbGUgd2l0aCBBdXRob3IsIGVtYWlsIGFuZCBzdWJqZWN0CisjIwkkNCAtIG9wdGlvbmFsIGZpbGUgY29udGFpbmluZyBzaWdub2ZmIHRvIGFkZAorIyMKKworVVNBR0U9Jzxtc2c+IDxwYXRjaD4gPGluZm8+IFs8c2lnbm9mZj5dJworLiBnaXQtc2gtc2V0dXAKKworY2FzZSAiJCMiIGluIDN8NCkgOzsgKikgdXNhZ2UgOzsgZXNhYworCitmaW5hbD0uZG90ZXN0L2ZpbmFsLWNvbW1pdAorIyMKKyMjIElmIHRoaXMgZmlsZSBleGlzdHMsIHdlIGFzayBiZWZvcmUgYXBwbHlpbmcKKyMjCitxdWVyeV9hcHBseT0uZG90ZXN0Ly5xdWVyeV9hcHBseQorCisjIyBXZSBkbyBub3QgbXVuZ2UgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHRvbyBtdWNoCisjIyBpZiB0aGlzIGZpbGUgZXhpc3RzLgora2VlcF9zdWJqZWN0PS5kb3Rlc3QvLmtlZXBfc3ViamVjdAorCisjIyBXZSBkbyBub3QgYXR0ZW1wdCB0aGUgMy13YXkgbWVyZ2UgZmFsbGJhY2sgdW5sZXNzIHRoaXMgZmlsZSBleGlzdHMuCitmYWxsX2JhY2tfM3dheT0uZG90ZXN0Ly4zd2F5CisKK01TR0ZJTEU9JDEKK1BBVENIRklMRT0kMgorSU5GTz0kMworU0lHTk9GRj0kNAorRURJVD0ke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0KKworZXhwb3J0IEdJVF9BVVRIT1JfTkFNRT0iJChzZWQgLW4gJy9eQXV0aG9yLyBzL0F1dGhvcjogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkKHNlZCAtbiAnL15FbWFpbC8gcy9FbWFpbDogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBHSVRfQVVUSE9SX0RBVEU9IiQoc2VkIC1uICcvXkRhdGUvIHMvRGF0ZTogLy9wJyAiJElORk8iKSIKK2V4cG9ydCBTVUJKRUNUPSIkKHNlZCAtbiAnL15TdWJqZWN0LyBzL1N1YmplY3Q6IC8vcCcgIiRJTkZPIikiCisKK2lmIHRlc3QgJycgIT0gIiRTSUdOT0ZGIgordGhlbgorCWlmIHRlc3QgLWYgIiRTSUdOT0ZGIgorCXRoZW4KKwkJU0lHTk9GRj1gY2F0ICIkU0lHTk9GRiJgIHx8IGV4aXQKKwllbGlmIGNhc2UgIiRTSUdOT0ZGIiBpbiB5ZXMgfCB0cnVlIHwgbWUgfCBwbGVhc2UpIDogOzsgKikgZmFsc2UgOzsgZXNhYworCXRoZW4KKwkJU0lHTk9GRj1gZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UIHwgc2VkIC1lICcKKwkJCQlzLz4uKi8+LworCQkJCXMvXi9TaWduZWQtb2ZmLWJ5OiAvJworCQlgCisJZWxzZQorCQlTSUdOT0ZGPQorCWZpCisJaWYgdGVzdCAnJyAhPSAiJFNJR05PRkYiCisJdGhlbgorCQlMQVNUX1NJR05FRF9PRkZfQlk9YAorCQkJc2VkIC1uZSAnL15TaWduZWQtb2ZmLWJ5OiAvcCcgIiRNU0dGSUxFIiB8CisJCQl0YWlsIC1uIDEKKwkJYAorCQl0ZXN0ICIkTEFTVF9TSUdORURfT0ZGX0JZIiA9ICIkU0lHTk9GRiIgfHwgeworCQkgICAgdGVzdCAnJyA9ICIkTEFTVF9TSUdORURfT0ZGX0JZIiAmJiBlY2hvCisJCSAgICBlY2hvICIkU0lHTk9GRiIKKwkJfSA+PiIkTVNHRklMRSIKKwlmaQorZmkKKworcGF0Y2hfaGVhZGVyPQordGVzdCAtZiAiJGtlZXBfc3ViamVjdCIgfHwgcGF0Y2hfaGVhZGVyPSdbUEFUQ0hdICcKKworeworCWVjaG8gIiRwYXRjaF9oZWFkZXIkU1VCSkVDVCIKKwlpZiB0ZXN0IC1zICIkTVNHRklMRSIKKwl0aGVuCisJCWVjaG8KKwkJY2F0ICIkTVNHRklMRSIKKwlmaQorfSA+IiRmaW5hbCIKKworaW50ZXJhY3RpdmU9eWVzCit0ZXN0IC1mICIkcXVlcnlfYXBwbHkiIHx8IGludGVyYWN0aXZlPW5vCisKK3doaWxlIFsgIiRpbnRlcmFjdGl2ZSIgPSB5ZXMgXTsgZG8KKwllY2hvICJDb21taXQgQm9keSBpczoiCisJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJY2F0ICIkZmluYWwiCisJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJcHJpbnRmICJBcHBseT8gW3ldZXMvW25dby9bZV1kaXQvW2FdY2NlcHQgYWxsICIKKwlyZWFkIHJlcGx5CisJY2FzZSAiJHJlcGx5IiBpbgorCQl5fFkpIGludGVyYWN0aXZlPW5vOzsKKwkJbnxOKSBleGl0IDI7OwkjIHNwZWNpYWwgdmFsdWUgdG8gdGVsbCBkb3Rlc3QgdG8ga2VlcCBnb2luZworCQllfEUpICIkRURJVCIgIiRmaW5hbCI7OworCQlhfEEpIHJtIC1mICIkcXVlcnlfYXBwbHkiCisJCSAgICAgaW50ZXJhY3RpdmU9bm8gOzsKKwllc2FjCitkb25lCisKK2lmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9hcHBseXBhdGNoLW1zZwordGhlbgorCSIkR0lUX0RJUiIvaG9va3MvYXBwbHlwYXRjaC1tc2cgIiRmaW5hbCIgfHwgZXhpdAorZmkKKworZWNobworZWNobyBBcHBseWluZyAiJyRTVUJKRUNUJyIKK2VjaG8KKworZ2l0LWFwcGx5IC0taW5kZXggIiRQQVRDSEZJTEUiIHx8IHsKKworCSMgZ2l0LWFwcGx5IGV4aXRzIHdpdGggc3RhdHVzIDEgd2hlbiB0aGUgcGF0Y2ggZG9lcyBub3QgYXBwbHksCisJIyBidXQgaXQgZGllKClzIHdpdGggb3RoZXIgZmFpbHVyZXMsIG1vc3Qgbm90YWJseSB1cG9uIGNvcnJ1cHQKKwkjIHBhdGNoLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGVyZSBpcyBubyBwb2ludCB0byB0cnkgYXBwbHlpbmcKKwkjIGl0IHRvIGFub3RoZXIgdHJlZSBhbmQgZG8gMy13YXkgbWVyZ2UuCisJdGVzdCAkPyA9IDEgfHwgZXhpdCAxCisKKwl0ZXN0IC1mICIkZmFsbF9iYWNrXzN3YXkiIHx8IGV4aXQgMQorCisJIyBIZXJlIGlmIHdlIGtub3cgd2hpY2ggcmV2aXNpb24gdGhlIHBhdGNoIGFwcGxpZXMgdG8sCisJIyB3ZSBjcmVhdGUgYSB0ZW1wb3Jhcnkgd29ya2luZyB0cmVlIGFuZCBpbmRleCwgYXBwbHkgdGhlCisJIyBwYXRjaCwgYW5kIGF0dGVtcHQgMy13YXkgbWVyZ2Ugd2l0aCB0aGUgcmVzdWx0aW5nIHRyZWUuCisKKwlPX09CSkVDVD1gY2QgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIgJiYgcHdkYAorCXJtIC1mciAucGF0Y2gtbWVyZ2UtKgorCisJaWYgZ2l0LWFwcGx5IC16IC0taW5kZXgtaW5mbyAiJFBBVENIRklMRSIgXAorCQk+LnBhdGNoLW1lcmdlLWluZGV4LWluZm8gMj4vZGV2L251bGwgJiYKKwkJR0lUX0lOREVYX0ZJTEU9LnBhdGNoLW1lcmdlLXRtcC1pbmRleCBcCisJCWdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvIDwucGF0Y2gtbWVyZ2UtaW5kZXgtaW5mbyAmJgorCQlHSVRfSU5ERVhfRklMRT0ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IFwKKwkJZ2l0LXdyaXRlLXRyZWUgPi5wYXRjaC1tZXJnZS10bXAtYmFzZSAmJgorCQkoCisJCQlta2RpciAucGF0Y2gtbWVyZ2UtdG1wLWRpciAmJgorCQkJY2QgLnBhdGNoLW1lcmdlLXRtcC1kaXIgJiYKKwkJCUdJVF9JTkRFWF9GSUxFPSIuLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IiBcCisJCQlHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJE9fT0JKRUNUIiBcCisJCQlnaXQtYXBwbHkgJGJpbmFyeSAtLWluZGV4CisJCSkgPCIkUEFUQ0hGSUxFIgorCXRoZW4KKwkJZWNobyBVc2luZyBpbmRleCBpbmZvIHRvIHJlY29uc3RydWN0IGEgYmFzZSB0cmVlLi4uCisJCW12IC5wYXRjaC1tZXJnZS10bXAtYmFzZSAucGF0Y2gtbWVyZ2UtYmFzZQorCQltdiAucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IC5wYXRjaC1tZXJnZS1pbmRleAorCWVsc2UKKwkoCisJCU49MTAKKworCQkjIE90aGVyd2lzZSwgdHJ5IG5lYXJieSB0cmVlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFwcGx5IHRoZQorCQkjIHBhdGNoLgorCQlnaXQtcmV2LWxpc3QgLS1tYXgtY291bnQ9JE4gSEVBRAorCisJCSMgb3IgaG9waW5nIHRoZSBwYXRjaCBpcyBhZ2FpbnN0IGtub3duIHRhZ3MuLi4KKwkJZ2l0LWxzLXJlbW90ZSAtLXRhZ3MgLgorCSkgfAorCSAgICB3aGlsZSByZWFkIGJhc2UganVuaworCSAgICBkbworCQkjIFRyeSBpdCBpZiB3ZSBoYXZlIGl0IGFzIGEgdHJlZS4KKwkJZ2l0LWNhdC1maWxlIHRyZWUgIiRiYXNlIiA+L2Rldi9udWxsIDI+JjEgfHwgY29udGludWUKKworCQlybSAtZnIgLnBhdGNoLW1lcmdlLXRtcC0qICYmCisJCW1rZGlyIC5wYXRjaC1tZXJnZS10bXAtZGlyIHx8IGJyZWFrCisJCSgKKwkJCWNkIC5wYXRjaC1tZXJnZS10bXAtZGlyICYmCisJCQlHSVRfSU5ERVhfRklMRT0uLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4ICYmCisJCQlHSVRfT0JKRUNUX0RJUkVDVE9SWT0iJE9fT0JKRUNUIiAmJgorCQkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFIEdJVF9PQkpFQ1RfRElSRUNUT1JZICYmCisJCQlnaXQtcmVhZC10cmVlICIkYmFzZSIgJiYKKwkJCWdpdC1hcHBseSAtLWluZGV4ICYmCisJCQltdiAuLi8ucGF0Y2gtbWVyZ2UtdG1wLWluZGV4IC4uLy5wYXRjaC1tZXJnZS1pbmRleCAmJgorCQkJZWNobyAiJGJhc2UiID4uLi8ucGF0Y2gtbWVyZ2UtYmFzZQorCQkpIDwiJFBBVENIRklMRSIgIDI+L2Rldi9udWxsICYmIGJyZWFrCisJICAgIGRvbmUKKwlmaQorCisJdGVzdCAtZiAucGF0Y2gtbWVyZ2UtaW5kZXggJiYKKwloaXNfdHJlZT0kKEdJVF9JTkRFWF9GSUxFPS5wYXRjaC1tZXJnZS1pbmRleCBnaXQtd3JpdGUtdHJlZSkgJiYKKwlvcmlnX3RyZWU9JChjYXQgLnBhdGNoLW1lcmdlLWJhc2UpICYmCisJcm0gLWZyIC5wYXRjaC1tZXJnZS0qIHx8IGV4aXQgMQorCisJZWNobyBGYWxsaW5nIGJhY2sgdG8gcGF0Y2hpbmcgYmFzZSBhbmQgMy13YXkgbWVyZ2UgdXNpbmcgJG9yaWdfdHJlZS4uLgorCisJIyBUaGlzIGlzIG5vdCBzbyB3cm9uZy4gIERlcGVuZGluZyBvbiB3aGljaCBiYXNlIHdlIHBpY2tlZCwKKwkjIG9yaWdfdHJlZSBtYXkgYmUgd2lsZGx5IGRpZmZlcmVudCBmcm9tIG91cnMsIGJ1dCBoaXNfdHJlZQorCSMgaGFzIHRoZSBzYW1lIHNldCBvZiB3aWxkbHkgZGlmZmVyZW50IGNoYW5nZXMgaW4gcGFydHMgdGhlCisJIyBwYXRjaCBkaWQgbm90IHRvdWNoLCBzbyByZXNvbHZlIGVuZHMgdXAgY2FuY2VsaW5nIHRoZW0sCisJIyBzYXlpbmcgdGhhdCB3ZSByZXZlcnRlZCBhbGwgdGhvc2UgY2hhbmdlcy4KKworCWlmIGdpdC1tZXJnZS1yZXNvbHZlICRvcmlnX3RyZWUgLS0gSEVBRCAkaGlzX3RyZWUKKwl0aGVuCisJCWVjaG8gRG9uZS4KKwllbHNlCisJCWVjaG8gRmFpbGVkIHRvIG1lcmdlIGluIHRoZSBjaGFuZ2VzLgorCQlleGl0IDEKKwlmaQorfQorCitpZiB0ZXN0IC14ICIkR0lUX0RJUiIvaG9va3MvcHJlLWFwcGx5cGF0Y2gKK3RoZW4KKwkiJEdJVF9ESVIiL2hvb2tzL3ByZS1hcHBseXBhdGNoIHx8IGV4aXQKK2ZpCisKK3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgfHwgZXhpdCAxCitlY2hvIFdyb3RlIHRyZWUgJHRyZWUKK3BhcmVudD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkgJiYKK2NvbW1pdD0kKGdpdC1jb21taXQtdHJlZSAkdHJlZSAtcCAkcGFyZW50IDwiJGZpbmFsIikgfHwgZXhpdCAxCitlY2hvIENvbW1pdHRlZDogJGNvbW1pdAorZ2l0LXVwZGF0ZS1yZWYgLW0gImFwcGx5cGF0Y2g6ICRTVUJKRUNUIiBIRUFEICRjb21taXQgJHBhcmVudCB8fCBleGl0CisKK2lmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9wb3N0LWFwcGx5cGF0Y2gKK3RoZW4KKwkiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtYXBwbHlwYXRjaAorZmkKZGlmZiAtLWdpdCBhL2dpdC1hcmNoaW1wb3J0LnBlcmwgYi9naXQtYXJjaGltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkYTYwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYXJjaGltcG9ydC5wZXJsCkBAIC0wLDAgKzEsMTA2OCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDUsIE1hcnRpbiBMYW5naG9mZi4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBUaGUgYmFzaWMgaWRlYSBpcyB0byB3YWxrIHRoZSBvdXRwdXQgb2YgdGxhIGFicm93c2UsIAorIyBmZXRjaCB0aGUgY2hhbmdlc2V0cyBhbmQgYXBwbHkgdGhlbS4gCisjCisKKz1oZWFkMSBJbnZvY2F0aW9uCisKKyAgICBnaXQtYXJjaGltcG9ydCBbIC1oIF0gWyAtdiBdIFsgLW8gXSBbIC1hIF0gWyAtZiBdIFsgLVQgXSAKKyAgICAJWyAtRCBkZXB0aF0gWyAtdCB0ZW1wZGlyIF0gPGFyY2hpdmU+LzxicmFuY2g+IFsgPGFyY2hpdmU+LzxicmFuY2g+IF0KKworSW1wb3J0cyBhIHByb2plY3QgZnJvbSBvbmUgb3IgbW9yZSBBcmNoIHJlcG9zaXRvcmllcy4gSXQgd2lsbCBmb2xsb3cgYnJhbmNoZXMKK2FuZCByZXBvc2l0b3JpZXMgd2l0aGluIHRoZSBuYW1lc3BhY2VzIGRlZmluZWQgYnkgdGhlIDxhcmNoaXZlL2JyYW5jaD4KK3BhcmFtZXRlcnMgc3VwcGxpZWQuIElmIGl0IGNhbm5vdCBmaW5kIHRoZSByZW1vdGUgYnJhbmNoIGEgbWVyZ2UgY29tZXMgZnJvbQoraXQgd2lsbCBqdXN0IGltcG9ydCBpdCBhcyBhIHJlZ3VsYXIgY29tbWl0LiBJZiBpdCBjYW4gZmluZCBpdCwgaXQgd2lsbCBtYXJrIGl0IAorYXMgYSBtZXJnZSB3aGVuZXZlciBwb3NzaWJsZS4KKworU2VlIG1hbiAoMSkgZ2l0LWFyY2hpbXBvcnQgZm9yIG1vcmUgZGV0YWlscy4KKworPWhlYWQxIFRPRE8KKworIC0gY3JlYXRlIHRhZyBvYmplY3RzIGluc3RlYWQgb2YgcmVmIHRhZ3MKKyAtIGF1ZGl0IHNoZWxsLWVzY2FwaW5nIG9mIGZpbGVuYW1lcworIC0gaGlkZSBvdXIgcHJpdmF0ZSB0YWdzIHNvbWV3aGVyZSBzbWFydGVyCisgLSBmaW5kIGEgd2F5IHRvIG1ha2UgImNhdCAqcGF0Y2hlcyB8IHBhdGNoIiBzYWZlIGV2ZW4gd2hlbiBwYXRjaGZpbGVzIGFyZSBtaXNzaW5nIG5ld2xpbmVzICAKKyAtIHNvcnQgYW5kIGFwcGx5IHBhdGNoZXMgYnkgZ3JhcGhpbmcgYW5jZXN0cnkgcmVsYXRpb25zIGluc3RlYWQgb2YganVzdAorICAgcmVseWluZyBpbiBkYXRlcyBzdXBwbGllZCBpbiB0aGUgY2hhbmdlc2V0IGl0c2VsZi4KKyAgIHRsYSBhbmNlc3RyeS1ncmFwaCAtbSBjb3VsZCBiZSBoZWxwZnVsIGhlcmUuLi4KKworPWhlYWQxIERldmVsIHRyaWNrcworCitBZGQgcHJpbnQgaW4gZnJvbnQgb2YgdGhlIHNoZWxsIGNvbW1hbmRzIGludm9rZWQgdmlhIGJhY2t0aWNrcy4gCisKKz1oZWFkMSBEZXZlbCBOb3RlcworCitUaGVyZSBhcmUgc2V2ZXJhbCBwbGFjZXMgd2hlcmUgQXJjaCBhbmQgZ2l0IHRlcm1pbm9sb2d5IGFyZSBpbnRlcm1peGVkCithbmQgcG90ZW50aWFsbHkgY29uZnVzZWQuCisKK1RoZSBub3Rpb24gb2YgYSAiYnJhbmNoIiBpbiBnaXQgaXMgYXBwcm94aW1hdGVseSBlcXVpdmFsZW50IHRvCithICJhcmNoaXZlL2NhdGVnb3J5LS1icmFuY2gtLXZlcnNpb24iIGluIEFyY2guICBBbHNvLCBpdCBzaG91bGQgYmUgbm90ZWQKK3RoYXQgdGhlICItLWJyYW5jaCIgcG9ydGlvbiBvZiAiYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLS12ZXJzaW9uIiBpcyByZWFsbHkKK29wdGlvbmFsIGluIEFyY2ggYWx0aG91Z2ggbm90IG1hbnkgcGVvcGxlIChub3IgdG9vbHMhKSBzZWVtIHRvIGtub3cgdGhpcy4KK1RoaXMgbWVhbnMgdGhhdCAiYXJjaGl2ZS9jYXRlZ29yeS0tdmVyc2lvbiIgaXMgYWxzbyBhIHZhbGlkICJicmFuY2giCitpbiBnaXQgdGVybXMuCisKK1dlIGFsd2F5cyByZWZlciB0byBBcmNoIG5hbWVzIGJ5IHRoZWlyIGZ1bGx5IHF1YWxpZmllZCB2YXJpYW50ICh3aGljaAorbWVhbnMgdGhlICJhcmNoaXZlIiBuYW1lIGlzIHByZWZpeGVkLgorCitGb3IgcGVvcGxlIHVuZmFtaWxpYXIgd2l0aCBBcmNoLCBhbiAiYXJjaGl2ZSIgaXMgdGhlIHRlcm0gZm9yICJyZXBvc2l0b3J5IiwKK2FuZCBjYW4gY29udGFpbiBtdWx0aXBsZSwgdW5yZWxhdGVkIGJyYW5jaGVzLgorCis9Y3V0CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZGlyKTsKK3VzZSBGaWxlOjpQYXRoIHF3KG1rcGF0aCBybXRyZWUpOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3KGJhc2VuYW1lIGRpcm5hbWUpOwordXNlIERhdGE6OkR1bXBlciBxdy8gRHVtcGVyIC87Cit1c2UgSVBDOjpPcGVuMjsKKworJFNJR3snUElQRSd9PSJJR05PUkUiOworJEVOVnsnVFonfT0iVVRDIjsKKworbXkgJGdpdF9kaXIgPSAkRU5WeyJHSVRfRElSIn0gfHwgIi5naXQiOworJEVOVnsiR0lUX0RJUiJ9ID0gJGdpdF9kaXI7CitteSAkcHRhZ19kaXIgPSAiJGdpdF9kaXIvYXJjaGltcG9ydC90YWdzIjsKKworb3VyKCRvcHRfaCwkb3B0X2YsJG9wdF92LCRvcHRfVCwkb3B0X3QsJG9wdF9ELCRvcHRfYSwkb3B0X28pOworCitzdWIgdXNhZ2UoKSB7CisgICAgcHJpbnQgU1RERVJSIDw8RU5EOworVXNhZ2U6ICR7XGJhc2VuYW1lICQwfSAgICAgIyBmZXRjaC91cGRhdGUgR0lUIGZyb20gQXJjaAorICAgICAgIFsgLWggXSBbIC12IF0gWyAtbyBdIFsgLWEgXSBbIC1mIF0gWyAtVCBdIFsgLUQgZGVwdGggXSBbIC10IHRlbXBkaXIgXQorICAgICAgIHJlcG9zaXRvcnkvYXJjaC1icmFuY2ggWyByZXBvc2l0b3J5L2FyY2gtYnJhbmNoXSAuLi4KK0VORAorICAgIGV4aXQoMSk7Cit9CisKK2dldG9wdHMoImZUaHZhdDpEOiIpIG9yIHVzYWdlKCk7Cit1c2FnZSBpZiAkb3B0X2g7CisKK0BBUkdWID49IDEgb3IgdXNhZ2UoKTsKKyMgJGFyY2hfYnJhbmNoZXM6CisjIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgga2V5czoKKyMgICA9MSAtIEFyY2ggdmVyc2lvbiAvIGdpdCAnYnJhbmNoJyBkZXRlY3RlZCB2aWEgYWJyb3dzZSBvbiBhIGxpbWl0CisjICAgPjEgLSBBcmNoIHZlcnNpb24gLyBnaXQgJ2JyYW5jaCcgb2YgYW4gYXV4aWxpYXJ5IGJyYW5jaCB3ZSd2ZSBtZXJnZWQKK215ICVhcmNoX2JyYW5jaGVzID0gbWFwIHsgJF8gPT4gMSB9IEBBUkdWOworCiskRU5WeydUTVBESVInfSA9ICRvcHRfdCBpZiAkb3B0X3Q7ICMgJEVOVntUTVBESVJ9IHdpbGwgYWZmZWN0IHRlbXBkaXIoKSBjYWxsczoKK215ICR0bXAgPSB0ZW1wZGlyKCdnaXQtYXJjaGltcG9ydC1YWFhYWFgnLCBUTVBESVIgPT4gMSwgQ0xFQU5VUCA9PiAxKTsKKyRvcHRfdiAmJiBwcmludCAiKyBVc2luZyAkdG1wIGFzIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiI7CisKK215ICVyZWFjaGFibGUgPSAoKTsgICAgICAgICAgICAgIyBBcmNoIHJlcG9zaXRvcmllcyB3ZSBjYW4gYWNjZXNzCitteSAldW5yZWFjaGFibGUgPSAoKTsgICAgICAgICAgICMgQXJjaCByZXBvc2l0b3JpZXMgd2UgY2FuJ3QgYWNjZXNzIDo8CitteSBAcHNldHMgID0gKCk7ICAgICAgICAgICAgICAgICMgdGhlIGNvbGxlY3Rpb24KK215ICVwc2V0cyAgPSAoKTsgICAgICAgICAgICAgICAgIyB0aGUgY29sbGVjdGlvbiwgYnkgbmFtZQorbXkgJXN0YXRzICA9ICgJCQkjIFRyYWNrIHdoaWNoIHN0cmF0ZWd5IHdlIHVzZWQgdG8gaW1wb3J0OgorCWdldF90YWcgPT4gMCwgcmVwbGF5ID0+IDAsIGdldF9uZXcgPT4gMCwgZ2V0X2RlbHRhID0+IDAsCisgICAgICAgIHNpbXBsZV9jaGFuZ2VzZXQgPT4gMCwgaW1wb3J0X29yX3RhZyA9PiAwCispOworCitteSAlcnB0YWdzID0gKCk7ICAgICAgICAgICAgICAgICMgbXkgcmV2ZXJzZSBwcml2YXRlIHRhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byBtYXAgYSBTSEExIHRvIGEgY29tbWl0aWQKK215ICRUTEEgPSAkRU5WeydBUkNIX0NMSUVOVCd9IHx8ICd0bGEnOworCitzdWIgZG9fYWJyb3dzZSB7CisgICAgbXkgJHN0YWdlID0gc2hpZnQ7CisgICAgd2hpbGUgKG15ICgkbGltaXQsICRsZXZlbCkgPSBlYWNoICVhcmNoX2JyYW5jaGVzKSB7CisgICAgICAgIG5leHQgdW5sZXNzICRsZXZlbCA9PSAkc3RhZ2U7CisgICAgICAgIAorCW9wZW4gQUJST1dTRSwgIiRUTEEgYWJyb3dzZSAtZmtEIC0tbWVyZ2VzICRsaW1pdCB8IiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZGllICJQcm9ibGVtcyB3aXRoIHRsYSBhYnJvd3NlOiAkISI7CisgICAgCisgICAgICAgIG15ICVwcyAgICAgICAgPSAoKTsgICAgICAgICAjIHRoZSBjdXJyZW50IG9uZQorICAgICAgICBteSAkbGFzdHNlZW4gID0gJyc7CisgICAgCisgICAgICAgIHdoaWxlICg8QUJST1dTRT4pIHsKKyAgICAgICAgICAgIGNob21wOworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpcnN0IHJlY29yZCBwYWRkZWQgdyA4IHNwYWNlcworICAgICAgICAgICAgaWYgKHMvXlxzezh9XGIvLykgeworICAgICAgICAgICAgICAgIG15ICgkaWQsICR0eXBlKSA9IHNwbGl0KG0vXHMrLywgJF8sIDIpOworCisgICAgICAgICAgICAgICAgbXkgJWxhc3RfcHM7CisgICAgICAgICAgICAgICAgIyBzdG9yZSB0aGUgcmVjb3JkIHdlIGp1c3QgY2FwdHVyZWQKKyAgICAgICAgICAgICAgICBpZiAoJXBzICYmICFleGlzdHMgJHBzZXRzeyAkcHN7aWR9IH0pIHsKKyAgICAgICAgICAgICAgICAgICAgJWxhc3RfcHMgPSAlcHM7ICMgYnJlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgICAgICBwdXNoIChAcHNldHMsIFwlbGFzdF9wcyk7CisgICAgICAgICAgICAgICAgICAgICRwc2V0c3sgJGxhc3RfcHN7aWR9IH0gPSBcJWxhc3RfcHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG15ICRicmFuY2ggPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRpZCk7CisgICAgICAgICAgICAgICAgJXBzID0gKCBpZCA9PiAkaWQsIGJyYW5jaCA9PiAkYnJhbmNoICk7CisgICAgICAgICAgICAgICAgaWYgKCVsYXN0X3BzICYmICgkbGFzdF9wc3ticmFuY2h9IGVxICRicmFuY2gpKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3twYXJlbnRfaWR9ID0gJGxhc3RfcHN7aWR9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAkYXJjaF9icmFuY2hlc3skYnJhbmNofSA9IDE7CisgICAgICAgICAgICAgICAgJGxhc3RzZWVuID0gJ2lkJzsKKworICAgICAgICAgICAgICAgICMgZGVhbCB3aXRoIHR5cGVzIChzaG91bGQgd29yayB3aXRoIGJheiBvciB0bGEpOgorICAgICAgICAgICAgICAgIGlmICgkdHlwZSA9fiBtL1woLipjaGFuZ2VzZXRcKS8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze3R5cGV9ID0gJ3MnOworICAgICAgICAgICAgICAgIH0gZWxzaWYgKCR0eXBlID1+IC9cKC4qaW1wb3J0XCkvKSB7CisgICAgICAgICAgICAgICAgICAgICRwc3t0eXBlfSA9ICdpJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkdHlwZSA9fiBtL1wodGFnLio/KFxTK1xAXFMrKS4qP1wpLykgeworICAgICAgICAgICAgICAgICAgICAkcHN7dHlwZX0gPSAndCc7CisgICAgICAgICAgICAgICAgICAgICMgcmVhZCB3aGljaCByZXZpc2lvbiB3ZSd2ZSB0YWdnZWQgd2hlbiB3ZSBwYXJzZSB0aGUgbG9nCisgICAgICAgICAgICAgICAgICAgICRwc3t0YWd9ICA9ICQxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgICAgICB3YXJuICJVbmtub3duIHR5cGUgJHR5cGUiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICRhcmNoX2JyYW5jaGVzeyRicmFuY2h9ID0gMTsKKyAgICAgICAgICAgICAgICAkbGFzdHNlZW4gPSAnaWQnOworICAgICAgICAgICAgfSBlbHNpZiAocy9eXHN7MTB9Ly8pIHsgCisgICAgICAgICAgICAgICAgIyAxMCBsZWFkaW5nIHNwYWNlcyBvciBtb3JlIAorICAgICAgICAgICAgICAgICMgaW5kaWNhdGUgY29tbWl0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBkYXRlCisgICAgICAgICAgICAgICAgaWYgKCRsYXN0c2VlbiBlcSAnaWQnICYmIG0vXihcZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGQpLyl7CisgICAgICAgICAgICAgICAgICAgICRwc3tkYXRlfSAgID0gJDE7CisgICAgICAgICAgICAgICAgICAgICRsYXN0c2VlbiA9ICdkYXRlJzsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICgkXyBlcSAnbWVyZ2VzIGluOicpIHsKKyAgICAgICAgICAgICAgICAgICAgJHBze21lcmdlc30gPSBbXTsKKyAgICAgICAgICAgICAgICAgICAgJGxhc3RzZWVuID0gJ21lcmdlcyc7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoJGxhc3RzZWVuIGVxICdtZXJnZXMnICYmIHMvXlxzezJ9Ly8pIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGlkID0gJF87CisgICAgICAgICAgICAgICAgICAgIHB1c2ggKEB7JHBze21lcmdlc319LCAkaWQpOworICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAjIGFnZ3Jlc3NpdmUgYnJhbmNoIGZpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgIGlmICgkb3B0X0QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRicmFuY2ggPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkcmVwbyA9IGV4dHJhY3RfcmVwb25hbWUoJGJyYW5jaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmNoaXZlX3JlYWNoYWJsZSgkcmVwbykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlZmluZWQgJGFyY2hfYnJhbmNoZXN7JGJyYW5jaH0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYXJjaF9icmFuY2hlc3skYnJhbmNofSA9ICRzdGFnZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB3YXJuICJtb3JlIG1ldGFkYXRhIGFmdGVyIG1lcmdlcyE/OiAkX1xuIiB1bmxlc3MgL15ccyokLzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoJXBzICYmICFleGlzdHMgJHBzZXRzeyAkcHN7aWR9IH0pIHsKKyAgICAgICAgICAgIG15ICV0ZW1wID0gJXBzOyAgICAgICAgICMgYnJlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgaWYgKEBwc2V0cyAmJiAkcHNldHNbJCNwc2V0c117YnJhbmNofSBlcSAkcHN7YnJhbmNofSkgeworICAgICAgICAgICAgICAgICR0ZW1we3BhcmVudF9pZH0gPSAkcHNldHNbJCNwc2V0c117aWR9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaCAoQHBzZXRzLCBcJXRlbXApOyAgCisgICAgICAgICAgICAkcHNldHN7ICR0ZW1we2lkfSB9ID0gXCV0ZW1wOworICAgICAgICB9ICAgIAorICAgICAgICAKKyAgICAgICAgY2xvc2UgQUJST1dTRSBvciBkaWUgIiRUTEEgYWJyb3dzZSBmYWlsZWQgb24gJGxpbWl0XG4iOworICAgIH0KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlbmQgZm9yZWFjaCAkcm9vdAorCitkb19hYnJvd3NlKDEpOworbXkgJGRlcHRoID0gMjsKKyRvcHRfRCB8fD0gMDsKK3doaWxlICgkZGVwdGggPD0gJG9wdF9EKSB7CisgICAgZG9fYWJyb3dzZSgkZGVwdGgpOworICAgICRkZXB0aCsrOworfQorCisjIyBPcmRlciBwYXRjaGVzIGJ5IHRpbWUKKyMgRklYTUUgc2VlIGlmIHdlIGNhbiBmaW5kIGEgbW9yZSBvcHRpbWFsIHdheSB0byBkbyB0aGlzIGJ5IGdyYXBoaW5nCisjIHRoZSBhbmNlc3RyeSBkYXRhIGFuZCB3YWxraW5nIGl0LCB0aGF0IHdheSB3ZSB3b24ndCBoYXZlIHRvIHJlbHkgb24KKyMgY2xpZW50LXN1cHBsaWVkIGRhdGVzCitAcHNldHMgPSBzb3J0IHskYS0+e2RhdGV9LiRiLT57aWR9IGNtcCAkYi0+e2RhdGV9LiRiLT57aWR9fSBAcHNldHM7CisKKyNwcmludCBEdW1wZXIgXEBwc2V0czsKKworIyMKKyMjIFRPRE8gY2xlYW51cCBpcnJlbGV2YW50IHBhdGNoZXMKKyMjICAgICAgYW5kIHB1dCBhbiBpbml0aWFsIGltcG9ydAorIyMgICAgICBvciBhIGZ1bGwgdGFnCitteSAkaW1wb3J0ID0gMDsKK3VubGVzcyAoLWQgJGdpdF9kaXIpIHsgIyBpbml0aWFsIGltcG9ydAorICAgIGlmICgkcHNldHNbMF17dHlwZX0gZXEgJ2knIHx8ICRwc2V0c1swXXt0eXBlfSBlcSAndCcpIHsKKyAgICAgICAgcHJpbnQgIlN0YXJ0aW5nIGltcG9ydCBmcm9tICRwc2V0c1swXXtpZH1cbiI7CisJYGdpdC1pbml0LWRiYDsKKwlkaWUgJCEgaWYgJD87CisJJGltcG9ydCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJOZWVkIHRvIHN0YXJ0IGZyb20gYW4gaW1wb3J0IG9yIGEgdGFnIC0tIGNhbm5vdCB1c2UgJHBzZXRzWzBde2lkfSI7CisgICAgfQorfSBlbHNlIHsgICAgIyBwcm9ncmVzc2luZyBhbiBpbXBvcnQKKyAgICAjIGxvYWQgdGhlIHJwdGFncworICAgIG9wZW5kaXIoRElSLCAkcHRhZ19kaXIpCisJfHwgZGllICJjYW4ndCBvcGVuZGlyOiAkISI7CisgICAgd2hpbGUgKG15ICRmaWxlID0gcmVhZGRpcihESVIpKSB7CisgICAgICAgICMgc2tpcCBub24taW50ZXJlc3RpbmctZmlsZXMKKyAgICAgICAgbmV4dCB1bmxlc3MgLWYgIiRwdGFnX2Rpci8kZmlsZSI7CisgICAKKyAgICAgICAgIyBjb252ZXJ0IGZpcnN0ICctLScgdG8gJy8nIGZyb20gb2xkIGdpdC1hcmNoaW1wb3J0IHRvIHVzZQorICAgICAgICAjIGFzIGFuIGFyY2hpdmVuYW1lL2MtLWItLXYgcHJpdmF0ZSB0YWcKKyAgICAgICAgaWYgKCRmaWxlICF+IG0hLCEpIHsKKyAgICAgICAgICAgIG15ICRvbGRmaWxlID0gJGZpbGU7CisgICAgICAgICAgICAkZmlsZSA9fiBzIS0tISwhOworICAgICAgICAgICAgcHJpbnQgU1RERVJSICJjb252ZXJ0aW5nIG9sZCB0YWcgJG9sZGZpbGUgdG8gJGZpbGVcbiI7CisgICAgICAgICAgICByZW5hbWUoIiRwdGFnX2Rpci8kb2xkZmlsZSIsICIkcHRhZ19kaXIvJGZpbGUiKSBvciBkaWUgJCE7CisgICAgICAgIH0KKwlteSAkc2hhID0gcHRhZygkZmlsZSk7CisJY2hvbXAgJHNoYTsKKwkkcnB0YWdzeyRzaGF9ID0gJGZpbGU7CisgICAgfQorICAgIGNsb3NlZGlyIERJUjsKK30KKworIyBwcm9jZXNzIHBhdGNoc2V0cworIyBleHRyYWN0IHRoZSBBcmNoIHJlcG9zaXRvcnkgbmFtZSAoQXJjaCAiYXJjaGl2ZSIgaW4gQXJjaC1zcGVhaykKK3N1YiBleHRyYWN0X3JlcG9uYW1lIHsKKyAgICBteSAkZnFfY3ZiciA9IHNoaWZ0OyAjIGFyY2hpdmVuYW1lL1tbW1tjYXRlZ29yeV1icmFuY2hddmVyc2lvbl1yZXZpc2lvbl0KKyAgICByZXR1cm4gKHNwbGl0KC9cLy8sICRmcV9jdmJyKSlbMF07Cit9CisgCitzdWIgZXh0cmFjdF92ZXJzaW9ubmFtZSB7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICAkbmFtZSA9fiBzLy0tKD86cGF0Y2h8dmVyc2lvbig/OmZpeCk/fGJhc2UpLVxkKyQvLzsKKyAgICByZXR1cm4gJG5hbWU7Cit9CisKKyMgY29udmVydCBhIGZ1bGx5LXF1YWxpZmllZCByZXZpc2lvbiBvciB2ZXJzaW9uIHRvIGEgdW5pcXVlIGRpcm5hbWU6CisjICAgbm9ybWFscGVyc29uQHloYnQubmV0LTA1L21wZC0tdWNsaW51eC0tMS0tcGF0Y2gtMiAKKyMgYmVjb21lczogbm9ybWFscGVyc29uQHloYnQubmV0LTA1LG1wZC0tdWNsaW51eC0tMQorIworIyB0aGUgZ2l0IG5vdGlvbiBvZiBhIGJyYW5jaCBpcyBjbG9zZXIgdG8KKyMgYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLS12ZXJzaW9uIHRoYW4gYXJjaGl2ZS9jYXRlZ29yeS0tYnJhbmNoLCBzbyB3ZQorIyB1c2UgdGhpcyB0byBjb252ZXJ0IHRvIGdpdCBicmFuY2ggbmFtZXMuCisjIEFsc28sIGtlZXAgYXJjaGl2ZSBuYW1lcyBidXQgcmVwbGFjZSAnLycgd2l0aCAnLCcgc2luY2UgaXQgd29uJ3QgcmVxdWlyZQorIyBzdWJkaXJlY3RvcmllcywgYW5kIGlzIHNhZmVyIHRoYW4gc3dhcHBpbmcgJy0tJyB3aGljaCBjb3VsZCBjb25mdXNlCisjIHJldmVyc2UtbWFwcGluZyB3aGVuIGRlYWxpbmcgd2l0aCBiYXN0YXJkIGJyYW5jaGVzIHRoYXQKKyMgYXJlIGp1c3QgYXJjaGl2ZS9jYXRlZ29yeS0tdmVyc2lvbiAgKG5vIC0tYnJhbmNoKQorc3ViIHRyZWVfZGlybmFtZSB7CisgICAgbXkgJHJldmlzaW9uID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBleHRyYWN0X3ZlcnNpb25uYW1lKCRyZXZpc2lvbik7CisgICAgJG5hbWUgPX4gcyMvIywjOworICAgIHJldHVybiAkbmFtZTsKK30KKworIyBvbGQgdmVyc2lvbnMgb2YgZ2l0LWFyY2hpbXBvcnQganVzdCB1c2UgdGhlIDxjYXRlZ29yeS0tYnJhbmNoPiBwYXJ0Ogorc3ViIG9sZF9zdHlsZV9icmFuY2huYW1lIHsKKyAgICBteSAkaWQgPSBzaGlmdDsKKyAgICBteSAkcmV0ID0gc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwncGFyc2UtcGFja2FnZS1uYW1lJywnLXAnLCRpZCk7CisgICAgY2hvbXAgJHJldDsKKyAgICByZXR1cm4gJHJldDsKK30KKworKmdpdF9icmFuY2huYW1lID0gJG9wdF9vID8gKm9sZF9zdHlsZV9icmFuY2huYW1lIDogKnRyZWVfZGlybmFtZTsKKworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGUgeworICAgIG15ICRwcyA9IHNoaWZ0OworICAgIAorICAgICMgc3dpdGNoIHRvIHRoYXQgYnJhbmNoIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IGluIHRoYXQgYnJhbmNoOgorICAgIGlmICgtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0JywnLWYnLCRwcy0+e2JyYW5jaH0pID09IDAgb3IgZGllICIkISAkP1xuIjsKKworICAgICAgICMgcmVtb3ZlIGFueSBvbGQgc3R1ZmYgdGhhdCBnb3QgbGVmdG92ZXI6CisgICAgICAgbXkgJHJtID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1scy1maWxlcycsJy0tb3RoZXJzJywnLXonKTsKKyAgICAgICBybXRyZWUoc3BsaXQoL1wwLywkcm0pKSBpZiAkcm07CisgICAgfQorICAgIAorICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgbXkgJGRpciA9IHN5bmNfdG9fcHMoJHBzKTsKKyAgICAjIHJlYWQgdGhlIG5ldyBsb2cgZW50cnk6CisgICAgbXkgQGNvbW1pdGxvZyA9IHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2NhdC1sb2cnLCctZCcsJGRpciwkcHMtPntpZH0pOworICAgIGRpZSAiRXJyb3IgaW4gY2F0LWxvZzogJCEiIGlmICQ/OworICAgIGNob21wIEBjb21taXRsb2c7CisKKyAgICAjIGdyYWIgdmFyaWFibGVzIHdlIHdhbnQgZnJvbSB0aGUgbG9nLCBuZXcgZmllbGRzIGdldCBhZGRlZCB0byAkcHM6CisgICAgIyAoYXV0aG9yLCBkYXRlLCBlbWFpbCwgc3VtbWFyeSwgbWVzc2FnZSBib2R5IC4uLikKKyAgICBwYXJzZWxvZygkcHMsIFxAY29tbWl0bG9nKTsKKworICAgIGlmICgkcHMtPntpZH0gPX4gLy0tYmFzZS0wJC8gJiYgJHBzLT57aWR9IG5lICRwc2V0c1swXXtpZH0pIHsKKyAgICAgICAgIyB0aGlzIHNob3VsZCB3b3JrIHdoZW4gaW1wb3J0aW5nIGNvbnRpbnVhdGlvbnMgCisgICAgICAgIGlmICgkcHMtPnt0YWd9ICYmIChteSAkYnJhbmNocG9pbnQgPSBldmFsIHsgcHRhZygkcHMtPnt0YWd9KSB9KSkgeworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJy1mJywnLWInLCRwcy0+e2JyYW5jaH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJyYW5jaHBvaW50KSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgcmVtb3ZlIGFueSBvbGQgc3R1ZmYgdGhhdCBnb3QgbGVmdG92ZXI6CisgICAgICAgICAgICBteSAkcm0gPSBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWxzLWZpbGVzJywnLS1vdGhlcnMnLCcteicpOworICAgICAgICAgICAgcm10cmVlKHNwbGl0KC9cMC8sJHJtKSkgaWYgJHJtOworCisgICAgICAgICAgICAjIElmIHdlIHRydXN0IEFyY2ggd2l0aCB0aGUgZmFjdCB0aGF0IHRoaXMgaXMganVzdCAKKyAgICAgICAgICAgICMgYSB0YWcsIGFuZCBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHN0YXRlIG9mIHRoZSB0cmVlCisgICAgICAgICAgICAjIHRoZW4gd2UganVzdCB0YWcgYW5kIG1vdmUgb24KKyAgICAgICAgICAgIHRhZygkcHMtPntpZH0sICRicmFuY2hwb2ludCk7CisgICAgICAgICAgICBwdGFnKCRwcy0+e2lkfSwgJGJyYW5jaHBvaW50KTsKKyAgICAgICAgICAgIHByaW50ICIgKiBUYWdnZWQgJHBzLT57aWR9IGF0ICRicmFuY2hwb2ludFxuIjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2FybiAiVGFnZ2luZyBmcm9tIHVua25vd24gaWQgdW5zdXBwb3J0ZWRcbiIgaWYgJHBzLT57dGFnfTsKKyAgICAgICAgfQorICAgICAgICAjIGFsbG93IG11bHRpcGxlIGJhc2VzL2ltcG9ydHMgaGVyZSBzaW5jZSBBcmNoIHN1cHBvcnRzIGNoZXJyeS1waWNrcworICAgICAgICAjIGZyb20gdW5yZWxhdGVkIHRyZWVzCisgICAgfSAKKyAgICAKKyAgICAjIHVwZGF0ZSB0aGUgaW5kZXggd2l0aCBhbGwgdGhlIGNoYW5nZXMgd2UgZ290CisgICAgc3lzdGVtKCdnaXQtZGlmZi1maWxlcyAtLW5hbWUtb25seSAteiB8ICcuCisgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgIHN5c3RlbSgnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC16IHwgJy4KKyAgICAgICAgICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC16IC0tc3RkaW4nKSA9PSAwIG9yIGRpZSAiJCEgJD9cbiI7CisgICAgcmV0dXJuIDE7Cit9CisKKyMgdGhlIG5hdGl2ZSBjaGFuZ2VzZXQgcHJvY2Vzc2luZyBzdHJhdGVneS4gIFRoaXMgaXMgdmVyeSBmYXN0LCBidXQKKyMgZG9lcyBub3QgaGFuZGxlIHBlcm1pc3Npb25zIG9yIGFueSByZW5hbWVzIGludm9sdmluZyBkaXJlY3Rvcmllcworc3ViIHByb2Nlc3NfcGF0Y2hzZXRfZmFzdCB7CisgICAgbXkgJHBzID0gc2hpZnQ7CisgICAgIyAKKyAgICAjIGNyZWF0ZSB0aGUgYnJhbmNoIGlmIG5lZWRlZAorICAgICMKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knICYmICEkaW1wb3J0KSB7CisgICAgICAgIGRpZSAiU2hvdWxkIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgJ0luaXRpYWwgaW1wb3J0JyBwZXIgR0lUIGltcG9ydDogJHBzLT57aWR9IjsKKyAgICB9CisKKyAgICB1bmxlc3MgKCRpbXBvcnQpIHsgIyBza2lwIGZvciBpbXBvcnQKKyAgICAgICAgaWYgKCAtZSAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgIyB3ZSBrbm93IGFib3V0IHRoaXMgYnJhbmNoCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJHBzLT57YnJhbmNofSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG5ldyBicmFuY2ghIHdlIG5lZWQgdG8gdmVyaWZ5IGEgZmV3IHRoaW5ncworICAgICAgICAgICAgZGllICJCcmFuY2ggb24gYSBub24tdGFnISIgdW5sZXNzICRwcy0+e3R5cGV9IGVxICd0JzsKKyAgICAgICAgICAgIG15ICRicmFuY2hwb2ludCA9IHB0YWcoJHBzLT57dGFnfSk7CisgICAgICAgICAgICBkaWUgIlRhZ2dpbmcgZnJvbSB1bmtub3duIGlkIHVuc3VwcG9ydGVkOiAkcHMtPnt0YWd9IiAKKyAgICAgICAgICAgICAgICB1bmxlc3MgJGJyYW5jaHBvaW50OworICAgICAgICAgICAgCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgd2UgYXJlIHN1cHBvc2VkIHRvIGJyYW5jaCBmcm9tCisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dCcsJy1iJywkcHMtPnticmFuY2h9LCRicmFuY2hwb2ludCk7CisKKyAgICAgICAgICAgICMgSWYgd2UgdHJ1c3QgQXJjaCB3aXRoIHRoZSBmYWN0IHRoYXQgdGhpcyBpcyBqdXN0IAorICAgICAgICAgICAgIyBhIHRhZywgYW5kIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhlIHRyZWUKKyAgICAgICAgICAgICMgdGhlbiB3ZSBqdXN0IHRhZyBhbmQgbW92ZSBvbgorICAgICAgICAgICAgdGFnKCRwcy0+e2lkfSwgJGJyYW5jaHBvaW50KTsKKyAgICAgICAgICAgIHB0YWcoJHBzLT57aWR9LCAkYnJhbmNocG9pbnQpOworICAgICAgICAgICAgcHJpbnQgIiAqIFRhZ2dlZCAkcHMtPntpZH0gYXQgJGJyYW5jaHBvaW50XG4iOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gCisgICAgICAgIGRpZSAkISBpZiAkPzsKKyAgICB9IAorCisgICAgIworICAgICMgQXBwbHkgdGhlIGltcG9ydC9jaGFuZ2VzZXQvbWVyZ2UgaW50byB0aGUgd29ya2luZyB0cmVlCisgICAgIyAKKyAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ2knIHx8ICRwcy0+e3R5cGV9IGVxICd0JykgeworICAgICAgICBhcHBseV9pbXBvcnQoJHBzKSBvciBkaWUgJCE7CisgICAgICAgICRzdGF0c3tpbXBvcnRfb3JfdGFnfSsrOworICAgICAgICAkaW1wb3J0PTA7CisgICAgfSBlbHNpZiAoJHBzLT57dHlwZX0gZXEgJ3MnKSB7CisgICAgICAgIGFwcGx5X2NzZXQoJHBzKTsKKyAgICAgICAgJHN0YXRze3NpbXBsZV9jaGFuZ2VzZXR9Kys7CisgICAgfQorCisgICAgIworICAgICMgcHJlcGFyZSB1cGRhdGUgZ2l0J3MgaW5kZXgsIGJhc2VkIG9uIHdoYXQgYXJjaCBrbm93cworICAgICMgYWJvdXQgdGhlIHBzZXQsIHJlc29sdmUgcGFyZW50cywgZXRjCisgICAgIworICAgIAorICAgIG15IEBjb21taXRsb2cgPSBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdjYXQtYXJjaGl2ZS1sb2cnLCRwcy0+e2lkfSk7IAorICAgIGRpZSAiRXJyb3IgaW4gY2F0LWFyY2hpdmUtbG9nOiAkISIgaWYgJD87CisgICAgICAgIAorICAgIHBhcnNlbG9nKCRwcyxcQGNvbW1pdGxvZyk7CisKKyAgICAjIGltcG9ydHMgZG9uJ3QgZ2l2ZSB1cyBnb29kIGluZm8KKyAgICAjIG9uIGFkZGVkIGZpbGVzLiBTaGFtZSBvbiB0aGVtCisgICAgaWYgKCRwcy0+e3R5cGV9IGVxICdpJyB8fCAkcHMtPnt0eXBlfSBlcSAndCcpIHsKKyAgICAgICAgc3lzdGVtKCdnaXQtbHMtZmlsZXMgLS1kZWxldGVkIC16IHwgJy4KKyAgICAgICAgICAgICAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluJykgPT0gMCBvciBkaWUgIiQhICQ/XG4iOworICAgICAgICBzeXN0ZW0oJ2dpdC1scy1maWxlcyAtLW90aGVycyAteiB8ICcuCisgICAgICAgICAgICAgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgLXogLS1zdGRpbicpID09IDAgb3IgZGllICIkISAkP1xuIjsKKyAgICB9CisKKyAgICAjIFRPRE86IGhhbmRsZSByZW1vdmVkX2RpcmVjdG9yaWVzIGFuZCByZW5hbWVkX2RpcmVjdG9yaWVzOgorCisgICAgaWYgKG15ICRkZWwgPSAkcHMtPntyZW1vdmVkX2ZpbGVzfSkgeworICAgICAgICB1bmxpbmsgQCRkZWw7CisgICAgICAgIHdoaWxlIChAJGRlbCkgeworICAgICAgICAgICAgbXkgQHNsaWNlID0gc3BsaWNlKEAkZGVsLCAwLCAxMDApOworICAgICAgICAgICAgc3lzdGVtKCdnaXQtdXBkYXRlLWluZGV4JywnLS1yZW1vdmUnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChteSAkcmVuID0gJHBzLT57cmVuYW1lZF9maWxlc30pIHsgICAgICAgICAgICAgICAgIyByZW5hbWVkCisgICAgICAgIGlmIChAJHJlbiAlIDIpIHsKKyAgICAgICAgICAgIGRpZSAiT2RkIG51bWJlciBvZiBlbnRyaWVzIGluIHJlbmFtZSE/IjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKEAkcmVuKSB7CisgICAgICAgICAgICBteSAkZnJvbSA9IHNoaWZ0IEAkcmVuOworICAgICAgICAgICAgbXkgJHRvICAgPSBzaGlmdCBAJHJlbjsgICAgICAgICAgIAorCisgICAgICAgICAgICB1bmxlc3MgKC1kIGRpcm5hbWUoJHRvKSkgeworICAgICAgICAgICAgICAgIG1rcGF0aChkaXJuYW1lKCR0bykpOyAjIHdpbGwgZGllIG9uIGVycgorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBwcmludCAibW92aW5nICRmcm9tICR0byI7CisgICAgICAgICAgICByZW5hbWUoJGZyb20sICR0bykgb3IgZGllICJFcnJvciByZW5hbWluZyAnJGZyb20nICckdG8nOiAkIVxuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tcmVtb3ZlJywnLS0nLCRmcm9tKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlOiAkISAkP1xuIjsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LXVwZGF0ZS1pbmRleCcsJy0tYWRkJywnLS0nLCR0bykgPT0gMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgaW4gZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZDogJCEgJD9cbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobXkgJGFkZCA9ICRwcy0+e25ld19maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkYWRkKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRhZGQsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLWFkZCcsJy0tJyxAc2xpY2UpID09IDAgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVycm9yIGluIGdpdC11cGRhdGUtaW5kZXggLS1hZGQ6ICQhICQ/XG4iOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG15ICRtb2QgPSAkcHMtPnttb2RpZmllZF9maWxlc30pIHsKKyAgICAgICAgd2hpbGUgKEAkbW9kKSB7CisgICAgICAgICAgICBteSBAc2xpY2UgPSBzcGxpY2UoQCRtb2QsIDAsIDEwMCk7CisgICAgICAgICAgICBzeXN0ZW0oJ2dpdC11cGRhdGUtaW5kZXgnLCctLScsQHNsaWNlKSA9PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFcnJvciBpbiBnaXQtdXBkYXRlLWluZGV4OiAkISAkP1xuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsgIyB3ZSBzdWNjZXNzZnVsbHkgYXBwbGllZCB0aGUgY2hhbmdlc2V0Cit9CisKK2lmICgkb3B0X2YpIHsKKyAgICBwcmludCAiV2lsbCBpbXBvcnQgcGF0Y2hzZXRzIHVzaW5nIHRoZSBmYXN0IHN0cmF0ZWd5XG4iLAorICAgICAgICAgICAgIlJlbmFtZWQgZGlyZWN0b3JpZXMgYW5kIHBlcm1pc3Npb24gY2hhbmdlcyB3aWxsIGJlIG1pc3NlZFxuIjsKKyAgICAqcHJvY2Vzc19wYXRjaHNldCA9ICpwcm9jZXNzX3BhdGNoc2V0X2Zhc3Q7Cit9IGVsc2UgeworICAgIHByaW50ICJVc2luZyB0aGUgZGVmYXVsdCAoYWNjdXJhdGUpIGltcG9ydCBzdHJhdGVneS5cbiIsCisgICAgICAgICAgICAiVGhpbmdzIG1heSBiZSBhIGJpdCBzbG93XG4iOworICAgICpwcm9jZXNzX3BhdGNoc2V0ID0gKnByb2Nlc3NfcGF0Y2hzZXRfYWNjdXJhdGU7Cit9CisgICAgCitmb3JlYWNoIG15ICRwcyAoQHBzZXRzKSB7CisgICAgIyBwcm9jZXNzIHBhdGNoc2V0cworICAgICRwcy0+e2JyYW5jaH0gPSBnaXRfYnJhbmNobmFtZSgkcHMtPntpZH0pOworCisgICAgIworICAgICMgZW5zdXJlIHdlIGhhdmUgYSBjbGVhbiBzdGF0ZSAKKyAgICAjIAorICAgIGlmIChteSAkZGlydHkgPSBgZ2l0LWRpZmYtZmlsZXNgKSB7CisgICAgICAgIGRpZSAiVW5jbGVhbiB0cmVlIHdoZW4gYWJvdXQgdG8gcHJvY2VzcyAkcHMtPntpZH0gIiAuCisgICAgICAgICAgICAiIC0gZGlkIHdlIGZhaWwgdG8gY29tbWl0IGNsZWFubHkgYmVmb3JlP1xuJGRpcnR5IjsKKyAgICB9CisgICAgZGllICQhIGlmICQ/OworICAgIAorICAgICMKKyAgICAjIHNraXAgY29tbWl0cyBhbHJlYWR5IGluIHJlcG8KKyAgICAjCisgICAgaWYgKHB0YWcoJHBzLT57aWR9KSkgeworICAgICAgJG9wdF92ICYmIHByaW50ICIgKiBTa2lwcGluZyBhbHJlYWR5IGltcG9ydGVkOiAkcHMtPntpZH1cbiI7CisgICAgICBuZXh0OworICAgIH0KKworICAgIHByaW50ICIgKiBTdGFydGluZyB0byB3b3JrIG9uICRwcy0+e2lkfVxuIjsKKworICAgIHByb2Nlc3NfcGF0Y2hzZXQoJHBzKSBvciBuZXh0OworCisgICAgIyB3YXJuICJlcnJvcnMgd2hlbiBydW5uaW5nIGdpdC11cGRhdGUtaW5kZXghICQhIjsKKyAgICBteSAkdHJlZSA9IGBnaXQtd3JpdGUtdHJlZWA7CisgICAgZGllICJjYW5ub3Qgd3JpdGUgdHJlZSAkISIgaWYgJD87CisgICAgY2hvbXAgJHRyZWU7CisgICAgCisgICAgIworICAgICMgV2hvJ3MgeW91ciBkYWRkeT8KKyAgICAjCisgICAgbXkgQHBhcjsKKyAgICBpZiAoIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iKSB7CisgICAgICAgIGlmIChvcGVuIEhFQUQsICI8IiwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kcHMtPnticmFuY2h9IikgeworICAgICAgICAgICAgbXkgJHAgPSA8SEVBRD47CisgICAgICAgICAgICBjbG9zZSBIRUFEOworICAgICAgICAgICAgY2hvbXAgJHA7CisgICAgICAgICAgICBwdXNoIEBwYXIsICctcCcsICRwOworICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgIGlmICgkcHMtPnt0eXBlfSBlcSAncycpIHsKKyAgICAgICAgICAgICAgICB3YXJuICJDb3VsZCBub3QgZmluZCB0aGUgcmlnaHQgaGVhZCBmb3IgdGhlIGJyYW5jaCAkcHMtPnticmFuY2h9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoJHBzLT57bWVyZ2VzfSkgeworICAgICAgICBwdXNoIEBwYXIsIGZpbmRfcGFyZW50cygkcHMpOworICAgIH0KKworICAgICMgICAgCisgICAgIyBDb21taXQsIHRhZyBhbmQgY2xlYW4gc3RhdGUKKyAgICAjCisgICAgJEVOVntUWn0gICAgICAgICAgICAgICAgICA9ICdHTVQnOworICAgICRFTlZ7R0lUX0FVVEhPUl9OQU1FfSAgICAgPSAkcHMtPnthdXRob3J9OworICAgICRFTlZ7R0lUX0FVVEhPUl9FTUFJTH0gICAgPSAkcHMtPntlbWFpbH07CisgICAgJEVOVntHSVRfQVVUSE9SX0RBVEV9ICAgICA9ICRwcy0+e2RhdGV9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9OQU1FfSAgPSAkcHMtPnthdXRob3J9OworICAgICRFTlZ7R0lUX0NPTU1JVFRFUl9FTUFJTH0gPSAkcHMtPntlbWFpbH07CisgICAgJEVOVntHSVRfQ09NTUlUVEVSX0RBVEV9ICA9ICRwcy0+e2RhdGV9OworCisgICAgbXkgJHBpZCA9IG9wZW4yKCpSRUFERVIsICpXUklURVIsJ2dpdC1jb21taXQtdHJlZScsJHRyZWUsQHBhcikgCisgICAgICAgIG9yIGRpZSAkITsKKyAgICBwcmludCBXUklURVIgJHBzLT57c3VtbWFyeX0sIlxuIjsKKyAgICBwcmludCBXUklURVIgJHBzLT57bWVzc2FnZX0sIlxuIjsKKyAgICAKKyAgICAjIG1ha2UgaXQgZWFzeSB0byBiYWNrdHJhY2sgYW5kIGZpZ3VyZSBvdXQgd2hpY2ggQXJjaCByZXZpc2lvbiB0aGlzIHdhczoKKyAgICBwcmludCBXUklURVIgJ2dpdC1hcmNoaW1wb3J0LWlkOiAnLCRwcy0+e2lkfSwiXG4iOworICAgIAorICAgIGNsb3NlIFdSSVRFUjsKKyAgICBteSAkY29tbWl0aWQgPSA8UkVBREVSPjsgICAgIyByZWFkCisgICAgY2hvbXAgJGNvbW1pdGlkOworICAgIGNsb3NlIFJFQURFUjsKKyAgICB3YWl0cGlkICRwaWQsMDsgICAgICAgICAgICAgIyBjbG9zZTsKKworICAgIGlmIChsZW5ndGggJGNvbW1pdGlkICE9IDQwKSB7CisgICAgICAgIGRpZSAiU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgY29tbWl0ISAkISAkY29tbWl0aWQiOworICAgIH0KKyAgICAjCisgICAgIyBVcGRhdGUgdGhlIGJyYW5jaAorICAgICMgCisgICAgb3BlbiAgSEVBRCwgIj4iLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRwcy0+e2JyYW5jaH0iOworICAgIHByaW50IEhFQUQgJGNvbW1pdGlkOworICAgIGNsb3NlIEhFQUQ7CisgICAgc3lzdGVtKCdnaXQtdXBkYXRlLXJlZicsICdIRUFEJywgIiRwcy0+e2JyYW5jaH0iKTsKKworICAgICMgdGFnIGFjY29yZGluZ2x5CisgICAgcHRhZygkcHMtPntpZH0sICRjb21taXRpZCk7ICMgcHJpdmF0ZSB0YWcKKyAgICBpZiAoJG9wdF9UIHx8ICRwcy0+e3R5cGV9IGVxICd0JyB8fCAkcHMtPnt0eXBlfSBlcSAnaScpIHsKKyAgICAgICAgdGFnKCRwcy0+e2lkfSwgJGNvbW1pdGlkKTsKKyAgICB9CisgICAgcHJpbnQgIiAqIENvbW1pdHRlZCAkcHMtPntpZH1cbiI7CisgICAgcHJpbnQgIiAgICsgdHJlZSAgICR0cmVlXG4iOworICAgIHByaW50ICIgICArIGNvbW1pdCAkY29tbWl0aWRcbiI7CisgICAgJG9wdF92ICYmIHByaW50ICIgICArIGNvbW1pdCBkYXRlIGlzICAkcHMtPntkYXRlfSBcbiI7CisgICAgJG9wdF92ICYmIHByaW50ICIgICArIHBhcmVudHM6ICAiLGpvaW4oJyAnLEBwYXIpLCJcbiI7Cit9CisKK2lmICgkb3B0X3YpIHsKKyAgICBmb3JlYWNoIChzb3J0IGtleXMgJXN0YXRzKSB7CisgICAgICAgIHByaW50IiAkXzogJHN0YXRzeyRffVxuIjsKKyAgICB9Cit9CitleGl0IDA7CisKKyMgdXNlZCBieSB0aGUgYWNjdXJhdGUgc3RyYXRlZ3k6CitzdWIgc3luY190b19wcyB7CisgICAgbXkgJHBzID0gc2hpZnQ7CisgICAgbXkgJHRyZWVfZGlyID0gJHRtcC4nLycudHJlZV9kaXJuYW1lKCRwcy0+e2lkfSk7CisgICAgCisgICAgJG9wdF92ICYmIHByaW50ICJzeW5jX3RvX3BzKCRwcy0+e2lkfSkgbWV0aG9kOiAiOworCisgICAgaWYgKC1kICR0cmVlX2RpcikgeworICAgICAgICBpZiAoJHBzLT57dHlwZX0gZXEgJ3QnKSB7CisJICAgICRvcHRfdiAmJiBwcmludCAiZ2V0ICh0YWcpXG4iOworICAgICAgICAgICAgIyBsb29rcyBsaWtlIGEgdGFnLW9ubHkgb3IgKHdvcnNlLCkgYSBtaXhlZCB0YWdzL2NoYW5nZXNldCBicmFuY2gsCisgICAgICAgICAgICAjIGNhbid0IHJlbHkgb24gcmVwbGF5IHRvIHdvcmsgY29ycmVjdGx5IG9uIHRoZXNlCisgICAgICAgICAgICBybXRyZWUoJHRyZWVfZGlyKTsKKyAgICAgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldCcsJy0tbm8tcHJpc3RpbmUnLCRwcy0+e2lkfSwkdHJlZV9kaXIpOworICAgICAgICAgICAgJHN0YXRze2dldF90YWd9Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXkgJHRyZWVfaWQgPSBhcmNoX3RyZWVfaWQoJHRyZWVfZGlyKTsKKyAgICAgICAgICAgICAgICBpZiAoJHBzLT57cGFyZW50X2lkfSAmJiAoJHBzLT57cGFyZW50X2lkfSBlcSAkdHJlZV9pZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgY29tbW9uIGNhc2UgKGhvcGVmdWxseSkKKwkJICAgICRvcHRfdiAmJiBwcmludCAicmVwbGF5XG4iOworICAgICAgICAgICAgICAgICAgICBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdyZXBsYXknLCctZCcsJHRyZWVfZGlyLCRwcy0+e2lkfSk7CisgICAgICAgICAgICAgICAgICAgICRzdGF0c3tyZXBsYXl9Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIyBnZXR0aW5nIG9uZSB0cmVlIGlzIHVzdWFsbHkgZmFzdGVyIHRoYW4gZ2V0dGluZyB0d28gdHJlZXMKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgYXBwbHlpbmcgdGhlIGRlbHRhIC4uLgorICAgICAgICAgICAgICAgICAgICBybXRyZWUoJHRyZWVfZGlyKTsKKwkJICAgICRvcHRfdiAmJiBwcmludCAiYXBwbHktZGVsdGFcbiI7CisgICAgICAgICAgICAgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldCcsJy0tbm8tcHJpc3RpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcy0+e2lkfSwkdHJlZV9kaXIpOworICAgICAgICAgICAgICAgICAgICAkc3RhdHN7Z2V0X2RlbHRhfSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICMgbmV3IGJyYW5jaCB3b3JrCisgICAgICAgICRvcHRfdiAmJiBwcmludCAiZ2V0IChuZXcgdHJlZSlcbiI7CisgICAgICAgIHNhZmVfcGlwZV9jYXB0dXJlKCRUTEEsJ2dldCcsJy0tbm8tcHJpc3RpbmUnLCRwcy0+e2lkfSwkdHJlZV9kaXIpOworICAgICAgICAkc3RhdHN7Z2V0X25ld30rKzsKKyAgICB9CisgICAKKyAgICAjIGFkZGVkIC1JIGZsYWcgdG8gcnN5bmMgc2luY2Ugd2UncmUgZ29pbmcgdG8gZmFzdCEgQUlFRUVFRSEhISEKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1kZWxldGUnLCctLWV4Y2x1ZGUnLCRnaXRfZGlyLAorIyAgICAgICAgICAgICAgICctLWV4Y2x1ZGUnLCcuYXJjaC1pbnZlbnRvcnknLAorICAgICAgICAgICAgICAgICctLWV4Y2x1ZGUnLCcuYXJjaC1pZHMnLCctLWV4Y2x1ZGUnLCd7YXJjaH0nLAorICAgICAgICAgICAgICAgICctLWV4Y2x1ZGUnLCcrKicsJy0tZXhjbHVkZScsJywqJywKKyAgICAgICAgICAgICAgICAiJHRyZWVfZGlyLyIsJy4vJykgPT0gMCBvciBkaWUgIkNhbm5vdCByc3luYyAkdHJlZV9kaXI6ICQhICQ/IjsKKyAgICByZXR1cm4gJHRyZWVfZGlyOworfQorCitzdWIgYXBwbHlfaW1wb3J0IHsKKyAgICBteSAkcHMgPSBzaGlmdDsKKyAgICBteSAkYm5hbWUgPSBnaXRfYnJhbmNobmFtZSgkcHMtPntpZH0pOworCisgICAgbWtwYXRoKCR0bXApOworCisgICAgc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnZ2V0JywnLXMnLCctLW5vLXByaXN0aW5lJywkcHMtPntpZH0sIiR0bXAvaW1wb3J0Iik7CisgICAgZGllICJDYW5ub3QgZ2V0IGltcG9ydDogJCEiIGlmICQ/OyAgICAKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1kZWxldGUnLCAnLS1leGNsdWRlJywkZ2l0X2RpciwKKwkJJy0tZXhjbHVkZScsJy5hcmNoLWlkcycsJy0tZXhjbHVkZScsJ3thcmNofScsCisJCSIkdG1wL2ltcG9ydC8iLCAnLi8nKTsKKyAgICBkaWUgIkNhbm5vdCByc3luYyBpbXBvcnQ6JCEiIGlmICQ/OworICAgIAorICAgIHJtdHJlZSgiJHRtcC9pbXBvcnQiKTsKKyAgICBkaWUgIkNhbm5vdCByZW1vdmUgdGVtcGRpcjogJCEiIGlmICQ/OworICAgIAorCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBhcHBseV9jc2V0IHsKKyAgICBteSAkcHMgPSBzaGlmdDsKKworICAgIG1rcGF0aCgkdG1wKTsKKworICAgICMgZ2V0IHRoZSBjaGFuZ2VzZXQKKyAgICBzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdnZXQtY2hhbmdlc2V0JywkcHMtPntpZH0sIiR0bXAvY2hhbmdlc2V0Iik7CisgICAgZGllICJDYW5ub3QgZ2V0IGNoYW5nZXNldDogJCEiIGlmICQ/OworICAgIAorICAgICMgYXBwbHkgcGF0Y2hlcworICAgIGlmIChgZmluZCAkdG1wL2NoYW5nZXNldC9wYXRjaGVzIC10eXBlIGYgLW5hbWUgJyoucGF0Y2gnYCkgeworICAgICAgICAjIHRoaXMgY2FuIGJlIHNwZWQgdXAgY29uc2lkZXJhYmx5IGJ5IGRvaW5nCisgICAgICAgICMgICAgKGZpbmQgfCB4YXJncyBjYXQpIHwgcGF0Y2gKKyAgICAgICAgIyBidXQgdGhhdCBjYW4gZ2V0IG11Y2tlZCB1cCBieSBwYXRjaGVzCisgICAgICAgICMgd2l0aCBtaXNzaW5nIHRyYWlsaW5nIG5ld2xpbmVzIG9yIHRoZSBzdGFuZGFyZCAKKyAgICAgICAgIyAnbWlzc2luZyBuZXdsaW5lJyBmbGFnIGluIHRoZSBwYXRjaCAtIHBvc3NpYmx5CisgICAgICAgICMgcHJvZHVjZWQgd2l0aCBhbiBvbGQvYnVnZ3kgZGlmZi4KKyAgICAgICAgIyBzbG93IGFuZCBzYWZlLCB3ZSBpbnZva2UgcGF0Y2ggb25jZSBwZXIgcGF0Y2hmaWxlCisgICAgICAgIGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5wYXRjaCcgLXByaW50MCB8IGdyZXAgLXp2ICd7YXJjaH0nIHwgeGFyZ3MgLWlGSUxFIC0wIC0tbm8tcnVuLWlmLWVtcHR5IHBhdGNoIC1wMSAtLWZvcndhcmQgLWlGSUxFYDsKKyAgICAgICAgZGllICJQcm9ibGVtIGFwcGx5aW5nIHBhdGNoZXMhICQhIiBpZiAkPzsKKyAgICB9CisKKyAgICAjIGFwcGx5IGNoYW5nZWQgYmluYXJ5IGZpbGVzCisgICAgaWYgKG15IEBtb2RpZmllZCA9IGBmaW5kICR0bXAvY2hhbmdlc2V0L3BhdGNoZXMgLXR5cGUgZiAtbmFtZSAnKi5tb2RpZmllZCdgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJG1vZCAoQG1vZGlmaWVkKSB7CisgICAgICAgICAgICBjaG9tcCAkbW9kOworICAgICAgICAgICAgbXkgJG9yaWcgPSAkbW9kOworICAgICAgICAgICAgJG9yaWcgPX4gcy9cLm1vZGlmaWVkJC8vOyAjIGxhenkKKyAgICAgICAgICAgICRvcmlnID1+IHMhXlxRJHRtcFxFL2NoYW5nZXNldC9wYXRjaGVzLyEhOworICAgICAgICAgICAgI3ByaW50ICJyc3luYyAtcCAnJG1vZCcgJyRvcmlnJyI7CisgICAgICAgICAgICBzeXN0ZW0oJ3JzeW5jJywnLXAnLCRtb2QsIi4vJG9yaWciKTsKKyAgICAgICAgICAgIGRpZSAiUHJvYmxlbSBhcHBseWluZyBiaW5hcnkgY2hhbmdlcyEgJCEiIGlmICQ/OworICAgICAgICB9CisgICAgfQorCisgICAgIyBicmluZyBpbiBuZXcgZmlsZXMKKyAgICBzeXN0ZW0oJ3JzeW5jJywnLWFJJywnLS1leGNsdWRlJywkZ2l0X2RpciwKKyAgICAJCSctLWV4Y2x1ZGUnLCcuYXJjaC1pZHMnLAorCQknLS1leGNsdWRlJywgJ3thcmNofScsCisJCSIkdG1wL2NoYW5nZXNldC9uZXctZmlsZXMtYXJjaGl2ZS8iLCcuLycpOworCisgICAgIyBkZWxldGVkIGZpbGVzIGFyZSBoaW50ZWQgZnJvbSB0aGUgY29tbWl0bG9nIHByb2Nlc3NpbmcKKworICAgIHJtdHJlZSgiJHRtcC9jaGFuZ2VzZXQiKTsKK30KKworCisjID1mb3IgcmVmZXJlbmNlCisjIG5vdGVzOiAqLWZpbGVzLy1kaXJlY3RvcmllcyBrZXlzIGNhbm5vdCBoYXZlIHNwYWNlcywgdGhleSdyZSBhbHdheXMKKyMgcGlrYS1lc2NhcGVkLiAgRXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgbmV3bGluZQorIyBBIGxvZyBlbnRyeSBsb29rcyBsaWtlOgorIyBSZXZpc2lvbjogbW9vZGxlLW9yZy0tbW9vZGxlLS0xLjMuMy0tcGF0Y2gtMTUKKyMgQXJjaGl2ZTogYXJjaC1lZHVmb3JnZUBjYXRhbHlzdC5uZXQubnotLTIwMDQKKyMgQ3JlYXRvcjogUGVubnkgTGVhY2ggPHBlbm55QGNhdGFseXN0Lm5ldC5uej4KKyMgRGF0ZTogV2VkIE1heSAyNSAxNDoxNTozNCBOWlNUIDIwMDUKKyMgU3RhbmRhcmQtZGF0ZTogMjAwNS0wNS0yNSAwMjoxNTozNCBHTVQKKyMgTmV3LWZpbGVzOiBsYW5nL2RlLy5hcmNoLWlkcy9ibG9ja19nbG9zc2FyeV9yYW5kb20ucGhwLmlkCisjICAgICBsYW5nL2RlLy5hcmNoLWlkcy9ibG9ja19odG1sLnBocC5pZAorIyBOZXctZGlyZWN0b3JpZXM6IGxhbmcvZGUvaGVscC9xdWVzdGlvbm5haXJlCisjICAgICBsYW5nL2RlL2hlbHAvcXVlc3Rpb25uYWlyZS8uYXJjaC1pZHMKKyMgUmVuYW1lZC1maWxlczogLmFyY2gtaWRzL2RiX3NlYXJzLnNxbC5pZCBkYi8uYXJjaC1pZHMvZGJfc2VhcnMuc3FsLmlkCisjICAgIGRiX3NlYXJzLnNxbCBkYi9kYl9zZWFycy5zcWwKKyMgUmVtb3ZlZC1maWxlczogbGFuZy9iZS9kb2NzLy5hcmNoLWlkcy9yZWxlYXNlLmh0bWwuaWQKKyMgICAgIGxhbmcvYmUvZG9jcy8uYXJjaC1pZHMvcmVsZWFzZW9sZC5odG1sLmlkCisjIE1vZGlmaWVkLWZpbGVzOiBhZG1pbi9jcm9uLnBocCBhZG1pbi9kZWxldGUucGhwCisjICAgICBhZG1pbi9lZGl0b3IuaHRtbCBiYWNrdXAvbGliLnBocCBiYWNrdXAvcmVzdG9yZS5waHAKKyMgTmV3LXBhdGNoZXM6IGFyY2gtZWR1Zm9yZ2VAY2F0YWx5c3QubmV0Lm56LS0yMDA0L21vb2RsZS1vcmctLW1vb2RsZS0tMS4zLjMtLXBhdGNoLTE1CisjIFN1bW1hcnk6IFVwZGF0aW5nIHRvIGxhdGVzdCBmcm9tIE1PT0RMRV8xNF9TVEFCTEUgKDEuNC41KykKKyMgICBzdW1tYXJ5IGNhbiBiZSBtdWx0aWxpbmUgd2l0aCBhIGxlYWRpbmcgc3BhY2UganVzdCBsaWtlIHRoZSBhYm92ZSBmaWVsZHMKKyMgS2V5d29yZHM6CisjCisjIFVwZGF0aW5nIHlhZGRhIHRhZGRhIHRhZGRhIG1hZGRhCitzdWIgcGFyc2Vsb2cgeworICAgIG15ICgkcHMsICRsb2cpID0gQF87CisgICAgbXkgJGtleSA9IHVuZGVmOworCisgICAgIyBoZWFkZXJzIHdlIHdhbnQgdGhhdCBjb250YWluIGZpbGVuYW1lczoKKyAgICBteSAld2FudF9oZWFkZXJzID0gKAorICAgICAgICBuZXdfZmlsZXMgPT4gMSwKKyAgICAgICAgbW9kaWZpZWRfZmlsZXMgPT4gMSwKKyAgICAgICAgcmVuYW1lZF9maWxlcyA9PiAxLAorICAgICAgICByZW5hbWVkX2RpcmVjdG9yaWVzID0+IDEsCisgICAgICAgIHJlbW92ZWRfZmlsZXMgPT4gMSwKKyAgICAgICAgcmVtb3ZlZF9kaXJlY3RvcmllcyA9PiAxLAorICAgICk7CisgICAgCisgICAgY2hvbXAgKEAkbG9nKTsKKyAgICB3aGlsZSAoJF8gPSBzaGlmdCBAJGxvZykgeworICAgICAgICBpZiAoL15Db250aW51YXRpb24tb2Y6XHMqKC4qKS8pIHsKKyAgICAgICAgICAgICRwcy0+e3RhZ30gPSAkMTsKKyAgICAgICAgICAgICRrZXkgPSB1bmRlZjsKKyAgICAgICAgfSBlbHNpZiAoL15TdW1tYXJ5OlxzKiguKikkLyApIHsKKyAgICAgICAgICAgICMgc3VtbWFyeSBjYW4gYmUgbXVsdGlsaW5lIGFzIGxvbmcgYXMgaXQgaGFzIGEgbGVhZGluZyBzcGFjZQorICAgICAgICAgICAgJHBzLT57c3VtbWFyeX0gPSBbICQxIF07CisgICAgICAgICAgICAka2V5ID0gJ3N1bW1hcnknOworICAgICAgICB9IGVsc2lmICgvXkNyZWF0b3I6ICguKilccyo8KFteXD5dKyk+LykgeworICAgICAgICAgICAgJHBzLT57YXV0aG9yfSA9ICQxOworICAgICAgICAgICAgJHBzLT57ZW1haWx9ID0gJDI7CisgICAgICAgICAgICAka2V5ID0gdW5kZWY7CisgICAgICAgICMgYW55ICotZmlsZXMgb3IgKi1kaXJlY3RvcmllcyBjYW4gYmUgcmVhZCBoZXJlOgorICAgICAgICB9IGVsc2lmICgvXihbQS1aXVthLXpcLV0rKTpccyooLiopJC8pIHsKKyAgICAgICAgICAgIG15ICR2YWwgPSAkMjsKKyAgICAgICAgICAgICRrZXkgPSBsYyAkMTsKKyAgICAgICAgICAgICRrZXkgPX4gdHIvLS9fLzsgIyB0b28gbGF6eSB0byBxdW90ZSA6UAorICAgICAgICAgICAgaWYgKCR3YW50X2hlYWRlcnN7JGtleX0pIHsKKyAgICAgICAgICAgICAgICBwdXNoIEB7JHBzLT57JGtleX19LCBzcGxpdCgvXHMrLywgJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRrZXkgPSB1bmRlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNpZiAoL14kLykgeworICAgICAgICAgICAgbGFzdDsgIyByZW1haW5kZXIgb2YgQCRsb2cgdGhhdCBkaWRuJ3QgZ2V0IHNoaWZ0ZWQgb2ZmIGlzIG1lc3NhZ2UKKyAgICAgICAgfSBlbHNpZiAoJGtleSkgeworICAgICAgICAgICAgaWYgKC9eXHMrKC4qKSQvKSB7CisgICAgICAgICAgICAgICAgaWYgKCRrZXkgZXEgJ3N1bW1hcnknKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskcHMtPnska2V5fX0sICQxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICMgZmlsZXMvZGlyZWN0b3JpZXM6CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskcHMtPnska2V5fX0sIHNwbGl0KC9ccysvLCAkMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAka2V5ID0gdW5kZWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAKKyAgICAjIHBvc3QtcHJvY2Vzc2luZzoKKyAgICAkcHMtPntzdW1tYXJ5fSA9IGpvaW4oIlxuIixAeyRwcy0+e3N1bW1hcnl9fSkuIlxuIjsKKyAgICAkcHMtPnttZXNzYWdlfSA9IGpvaW4oIlxuIixAJGxvZyk7CisgICAgCisgICAgIyBza2lwIEFyY2ggY29udHJvbCBmaWxlcywgdW5lc2NhcGUgcGlrYS1lc2NhcGVkIGZpbGVzCisgICAgZm9yZWFjaCBteSAkayAoa2V5cyAld2FudF9oZWFkZXJzKSB7CisgICAgICAgIG5leHQgdW5sZXNzIChkZWZpbmVkICRwcy0+eyRrfSk7CisgICAgICAgIG15IEB0bXAgPSAoKTsKKyAgICAgICAgZm9yZWFjaCBteSAkdCAoQHskcHMtPnska319KSB7CisgICAgICAgICAgIG5leHQgdW5sZXNzIGxlbmd0aCAoJHQpOworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXHthcmNoXH0vITsKKyAgICAgICAgICAgbmV4dCBpZiAkdCA9fiBtIVwuYXJjaC1pZHMvITsKKyAgICAgICAgICAgIyBzaG91bGQgd2Ugc2tpcCB0aGlzPworICAgICAgICAgICBuZXh0IGlmICR0ID1+IG0hXC5hcmNoLWludmVudG9yeSQhOworICAgICAgICAgICAjIHRsYSBjYXQtYXJjaGl2ZS1sb2cgd2lsbCBnaXZlIHVzIGZpbGVuYW1lcyB3aXRoIHNwYWNlcyBhcyBmaWxlXChzcCluYW1lIC0gd2h5PworICAgICAgICAgICAjIHdlIGNhbiBhc3N1bWUgdGhhdCBhbnkgZmlsZW5hbWUgd2l0aCBcIGluZGljYXRlcyBzb21lIHBpa2EgZXNjYXBpbmcgdGhhdCB3ZSB3YW50IHRvIGdldCByaWQgb2YuCisgICAgICAgICAgIGlmICgkdCA9fiAvXFwvICl7CisgICAgICAgICAgICAgICAkdCA9IChzYWZlX3BpcGVfY2FwdHVyZSgkVExBLCdlc2NhcGUnLCctLXVuZXNjYXBlZCcsJHQpKVswXTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBwdXNoIEB0bXAsICR0OworICAgICAgICB9CisgICAgICAgICRwcy0+eyRrfSA9IFxAdG1wOworICAgIH0KK30KKworIyB3cml0ZS9yZWFkIGEgdGFnCitzdWIgdGFnIHsKKyAgICBteSAoJHRhZywgJGNvbW1pdCkgPSBAXzsKKyAKKyAgICBpZiAoJG9wdF9vKSB7CisgICAgICAgICR0YWcgPX4gc3wvfC0tfGc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBkb24ndCB1c2Ugc3ViZGlycyBmb3IgdGFncyB5ZXQsIGl0IGNvdWxkIHNjcmV3IHVwIG90aGVyIHBvcmNlbGFpbnMKKyAgICAgICAgJHRhZyA9fiBzfC98LHxnOworICAgIH0KKyAgICAKKyAgICBpZiAoJGNvbW1pdCkgeworICAgICAgICBvcGVuKEMsIj4iLCIkZ2l0X2Rpci9yZWZzL3RhZ3MvJHRhZyIpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnICR0YWc6ICQhXG4iOworICAgICAgICBwcmludCBDICIkY29tbWl0XG4iCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIGNsb3NlKEMpCisgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIHByaW50ICIgKiBDcmVhdGVkIHRhZyAnJHRhZycgb24gJyRjb21taXQnXG4iIGlmICRvcHRfdjsKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgIyByZWFkCisgICAgICAgIG9wZW4oQywiPCIsIiRnaXRfZGlyL3JlZnMvdGFncy8kdGFnIikKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICAkY29tbWl0ID0gPEM+OworICAgICAgICBjaG9tcCAkY29tbWl0OworICAgICAgICBkaWUgIkVycm9yIHJlYWRpbmcgdGFnICR0YWc6ICQhXG4iIHVubGVzcyBsZW5ndGggJGNvbW1pdCA9PSA0MDsKKyAgICAgICAgY2xvc2UoQykKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHJlYWQgdGFnICR0YWc6ICQhXG4iOworICAgICAgICByZXR1cm4gJGNvbW1pdDsKKyAgICB9Cit9CisKKyMgd3JpdGUvcmVhZCBhIHByaXZhdGUgdGFnCisjIHJlYWRzIGZhaWwgc29mdGx5IGlmIHRoZSB0YWcgaXNuJ3QgdGhlcmUKK3N1YiBwdGFnIHsKKyAgICBteSAoJHRhZywgJGNvbW1pdCkgPSBAXzsKKworICAgICMgZG9uJ3QgdXNlIHN1YmRpcnMgZm9yIHRhZ3MgeWV0LCBpdCBjb3VsZCBzY3JldyB1cCBvdGhlciBwb3JjZWxhaW5zCisgICAgJHRhZyA9fiBzfC98LHxnOyAKKyAgICAKKyAgICBteSAkdGFnX2ZpbGUgPSAiJHB0YWdfZGlyLyR0YWciOworICAgIG15ICR0YWdfYnJhbmNoX2RpciA9IGRpcm5hbWUoJHRhZ19maWxlKTsKKyAgICBta3BhdGgoJHRhZ19icmFuY2hfZGlyKSB1bmxlc3MgKC1kICR0YWdfYnJhbmNoX2Rpcik7CisKKyAgICBpZiAoJGNvbW1pdCkgeyAgICAgICAgICAgICAgIyB3cml0ZQorICAgICAgICBvcGVuKEMsIj4iLCR0YWdfZmlsZSkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgIHByaW50IEMgIiRjb21taXRcbiIKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHdyaXRlIHRhZyAkdGFnOiAkIVxuIjsKKyAgICAgICAgY2xvc2UoQykKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IHdyaXRlIHRhZyAkdGFnOiAkIVxuIjsKKwkkcnB0YWdzeyRjb21taXR9ID0gJHRhZyAKKwkgICAgdW5sZXNzICR0YWcgPX4gbS8tLWJhc2UtMCQvOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAjIHJlYWQKKyAgICAgICAgIyBpZiB0aGUgdGFnIGlzbid0IHRoZXJlLCByZXR1cm4gMAorICAgICAgICB1bmxlc3MgKCAtcyAkdGFnX2ZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG9wZW4oQywiPCIsJHRhZ19maWxlKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgcmVhZCB0YWcgJHRhZzogJCFcbiI7CisgICAgICAgICRjb21taXQgPSA8Qz47CisgICAgICAgIGNob21wICRjb21taXQ7CisgICAgICAgIGRpZSAiRXJyb3IgcmVhZGluZyB0YWcgJHRhZzogJCFcbiIgdW5sZXNzIGxlbmd0aCAkY29tbWl0ID09IDQwOworICAgICAgICBjbG9zZShDKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3QgcmVhZCB0YWcgJHRhZzogJCFcbiI7CisJdW5sZXNzIChkZWZpbmVkICRycHRhZ3N7JGNvbW1pdH0pIHsKKwkgICAgJHJwdGFnc3skY29tbWl0fSA9ICR0YWc7CisJfQorICAgICAgICByZXR1cm4gJGNvbW1pdDsKKyAgICB9Cit9CisKK3N1YiBmaW5kX3BhcmVudHMgeworICAgICMKKyAgICAjIElkZW50aWZ5IHdoYXQgYnJhbmNoZXMgYXJlIG1lcmdpbmcgaW50byBtZQorICAgICMgYW5kIHdoZXRoZXIgd2UgYXJlIGZ1bGx5IG1lcmdlZAorICAgICMgZ2l0LW1lcmdlLWJhc2UgPGhlYWRzaGE+IDxoZWFkc2hhPiBzaG91bGQgdGVsbAorICAgICMgbWUgd2hhdCB0aGUgYmFzZSBvZiB0aGUgbWVyZ2Ugc2hvdWxkIGJlIAorICAgICMKKyAgICBteSAkcHMgPSBzaGlmdDsKKworICAgIG15ICVicmFuY2hlczsgIyBob2xkcyBhbiBhcnJheXJlZiBwZXIgYnJhbmNoCisgICAgICAgICAgICAgICAgICAjIHRoZSBhcnJheXJlZiBjb250YWlucyBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICMgbWVyZ2VkIHBhdGNoZXMgYmV0d2VlbiB0aGUgYmFzZQorICAgICAgICAgICAgICAgICAgIyBvZiB0aGUgbWVyZ2UgYW5kIHRoZSBjdXJyZW50IGhlYWQKKworICAgIG15IEBwYXJlbnRzOyAgIyBwYXJlbnRzIGZvdW5kIGZvciB0aGlzIGNvbW1pdAorCisgICAgIyBzaW1wbGUgbG9vcCB0byBzcGxpdCB0aGUgbWVyZ2VzCisgICAgIyBwZXIgYnJhbmNoCisgICAgZm9yZWFjaCBteSAkbWVyZ2UgKEB7JHBzLT57bWVyZ2VzfX0pIHsKKwlteSAkYnJhbmNoID0gZ2l0X2JyYW5jaG5hbWUoJG1lcmdlKTsKKwl1bmxlc3MgKGRlZmluZWQgJGJyYW5jaGVzeyRicmFuY2h9ICl7CisJICAgICRicmFuY2hlc3skYnJhbmNofSA9IFtdOworCX0KKwlwdXNoIEB7JGJyYW5jaGVzeyRicmFuY2h9fSwgJG1lcmdlOworICAgIH0KKworICAgICMKKyAgICAjIGZvcmVhY2ggYnJhbmNoIGZpbmQgYSBtZXJnZSBiYXNlIGFuZCB3YWxrIGl0IHRvIHRoZSAKKyAgICAjIGhlYWQgd2hlcmUgd2UgYXJlLCBjb2xsZWN0aW5nIHRoZSBtZXJnZWQgcGF0Y2hzZXRzIHRoYXQKKyAgICAjIEFyY2ggaGFzIHJlY29yZGVkLiBLZWVwIHRoYXQgaW4gQGhhdmUKKyAgICAjIENvbXBhcmUgdGhhdCB3aXRoIHRoZSBjb21taXRzIG9uIHRoZSBvdGhlciBicmFuY2gKKyAgICAjIGJldHdlZW4gbWVyZ2UtYmFzZSBhbmQgdGhlIHRpcCBvZiB0aGUgYnJhbmNoIChAbmVlZCkKKyAgICAjIGFuZCBzZWUgaWYgd2UgaGF2ZSBhIHNlcmllcyBvZiBjb25zZWN1dGl2ZSBwYXRjaGVzCisgICAgIyBzdGFydGluZyBmcm9tIHRoZSBtZXJnZSBiYXNlLiBUaGUgdGlwIG9mIHRoZSBzZXJpZXMKKyAgICAjIG9mIGNvbnNlY3V0aXZlIHBhdGNoZXMgbWVyZ2VkIGlzIG91ciBuZXcgcGFyZW50IGZvciAKKyAgICAjIHRoYXQgYnJhbmNoLgorICAgICMKKyAgICBmb3JlYWNoIG15ICRicmFuY2ggKGtleXMgJWJyYW5jaGVzKSB7CisKKwkjIGNoZWNrIHRoYXQgd2UgYWN0dWFsbHkga25vdyBhYm91dCB0aGUgYnJhbmNoCisJbmV4dCB1bmxlc3MgLWUgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJGJyYW5jaCI7CisKKwlteSAkbWVyZ2ViYXNlID0gYGdpdC1tZXJnZS1iYXNlICRicmFuY2ggJHBzLT57YnJhbmNofWA7CisgCWlmICgkPykgeyAKKyAJICAgICMgRG9uJ3QgZGllIGhlcmUsIEFyY2ggc3VwcG9ydHMgb25lLXdheSBjaGVycnktcGlja2luZworIAkgICAgIyBiZXR3ZWVuIGJyYW5jaGVzIHdpdGggbm8gY29tbW9uIGJhc2UgKG9yIGFueSByZWxhdGlvbnNoaXAKKyAJICAgICMgYXQgYWxsIGJlZm9yZWhhbmQpCisgCSAgICB3YXJuICJDYW5ub3QgZmluZCBtZXJnZSBiYXNlIGZvciAkYnJhbmNoIGFuZCAkcHMtPnticmFuY2h9IjsKKyAJICAgIG5leHQ7CisgCX0KKwljaG9tcCAkbWVyZ2ViYXNlOworCisJIyBub3cgd2FsayB1cCB0byB0aGUgbWVyZ2Vwb2ludCBjb2xsZWN0aW5nIHdoYXQgcGF0Y2hlcyB3ZSBoYXZlCisJbXkgJGJyYW5jaHRpcCA9IGdpdF9yZXZfcGFyc2UoJHBzLT57YnJhbmNofSk7CisJbXkgQGFuY2VzdG9ycyA9IGBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICRicmFuY2h0aXAgXiRtZXJnZWJhc2VgOworCW15ICVoYXZlOyAjIGNvbGxlY3RlZCBtZXJnZXMgdGhpcyBicmFuY2ggaGFzCisJZm9yZWFjaCBteSAkbWVyZ2UgKEB7JHBzLT57bWVyZ2VzfX0pIHsKKwkgICAgJGhhdmV7JG1lcmdlfSA9IDE7CisJfQorCW15ICVhbmNlc3RvcnNoYXZlOworCWZvcmVhY2ggbXkgJHBhciAoQGFuY2VzdG9ycykgeworCSAgICAkcGFyID0gY29tbWl0aWQycHNldCgkcGFyKTsKKwkgICAgaWYgKGRlZmluZWQgJHBhci0+e21lcmdlc30pIHsKKwkJZm9yZWFjaCBteSAkbWVyZ2UgKEB7JHBhci0+e21lcmdlc319KSB7CisJCSAgICAkYW5jZXN0b3JzaGF2ZXskbWVyZ2V9PTE7CisJCX0KKwkgICAgfQorCX0KKwkjIHByaW50ICIrKysrIE1lcmdlcyBpbiAkcHMtPntpZH0gYXJlLi4uLlxuIjsKKwkjIG15IEBoYXZlID0gc29ydCBrZXlzICVoYXZlOwlwcmludCBEdW1wZXIoXEBoYXZlKTsKKworCSMgbWVyZ2Ugd2hhdCB3ZSBoYXZlIHdpdGggd2hhdCBhbmNlc3RvcnMgaGF2ZQorCSVoYXZlID0gKCVoYXZlLCAlYW5jZXN0b3JzaGF2ZSk7CisKKwkjIHNlZSB3aGF0IHRoZSByZW1vdGUgYnJhbmNoIGhhcyAtIHRoZXNlIGFyZSB0aGUgbWVyZ2VzIHdlIAorCSMgd2lsbCB3YW50IHRvIGhhdmUgaW4gYSBjb25zZWN1dGl2ZSBzZXJpZXMgZnJvbSB0aGUgbWVyZ2ViYXNlCisJbXkgJG90aGVyYnJhbmNodGlwID0gZ2l0X3Jldl9wYXJzZSgkYnJhbmNoKTsKKwlteSBAbmVlZHJhdyA9IGBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICRvdGhlcmJyYW5jaHRpcCBeJG1lcmdlYmFzZWA7CisJbXkgQG5lZWQ7CisJZm9yZWFjaCBteSAkbmVlZHBzIChAbmVlZHJhdykgeyAJIyBnZXQgdGhlIHBzZXRzCisJICAgICRuZWVkcHMgPSBjb21taXRpZDJwc2V0KCRuZWVkcHMpOworCSAgICAjIGdpdC1yZXYtbGlzdCB3aWxsIGFsc28KKwkgICAgIyBsaXN0IGNvbW1pdHMgbWVyZ2VkIGluIHZpYSBlYXJsaWVyIAorCSAgICAjIG1lcmdlcy4gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb21taXRzCisJICAgICMgZnJvbSB0aGUgYnJhbmNoIHdlJ3JlIGxvb2tpbmcgYXQKKwkgICAgaWYgKCRicmFuY2ggZXEgJG5lZWRwcy0+e2JyYW5jaH0pIHsKKwkJcHVzaCBAbmVlZCwgJG5lZWRwcy0+e2lkfTsKKwkgICAgfQorCX0KKworCSMgcHJpbnQgIisrKysgTWVyZ2VzIGZyb20gJGJyYW5jaCB3ZSB3YW50IGFyZS4uLi5cbiI7CisJIyBwcmludCBEdW1wZXIoXEBuZWVkKTsKKworCW15ICRuZXdwYXJlbnQ7CisJd2hpbGUgKG15ICRuZWVkZWRfY29tbWl0ID0gcG9wIEBuZWVkKSB7CisJICAgIGlmICgkaGF2ZXskbmVlZGVkX2NvbW1pdH0pIHsKKwkJJG5ld3BhcmVudCA9ICRuZWVkZWRfY29tbWl0OworCSAgICB9IGVsc2UgeworCQlsYXN0OyAjIGJyZWFrIG91dCBvZiB0aGUgd2hpbGUKKwkgICAgfQorCX0KKwlpZiAoJG5ld3BhcmVudCkgeworCSAgICBwdXNoIEBwYXJlbnRzLCAkbmV3cGFyZW50OworCX0KKworCisgICAgfSAjIGVuZCBmb3JlYWNoIGJyYW5jaAorCisgICAgIyBwcnVuZSByZWR1bmRhbnQgcGFyZW50cworICAgIG15ICVwYXJlbnRzOworICAgIGZvcmVhY2ggbXkgJHAgKEBwYXJlbnRzKSB7CisJJHBhcmVudHN7JHB9ID0gMTsKKyAgICB9CisgICAgZm9yZWFjaCBteSAkcCAoQHBhcmVudHMpIHsKKwluZXh0IHVubGVzcyBleGlzdHMgJHBzZXRzeyRwfXttZXJnZXN9OworCW5leHQgdW5sZXNzIHJlZiAgICAkcHNldHN7JHB9e21lcmdlc307CisJbXkgQG1lcmdlcyA9IEB7JHBzZXRzeyRwfXttZXJnZXN9fTsKKwlmb3JlYWNoIG15ICRtZXJnZSAoQG1lcmdlcykgeworCSAgICBpZiAoJHBhcmVudHN7JG1lcmdlfSkgeyAKKwkJZGVsZXRlICRwYXJlbnRzeyRtZXJnZX07CisJICAgIH0KKwl9CisgICAgfQorCisgICAgQHBhcmVudHMgPSAoKTsKKyAgICBmb3JlYWNoIChrZXlzICVwYXJlbnRzKSB7CisgICAgICAgIHB1c2ggQHBhcmVudHMsICctcCcsIHB0YWcoJF8pOworICAgIH0KKyAgICByZXR1cm4gQHBhcmVudHM7Cit9CisKK3N1YiBnaXRfcmV2X3BhcnNlIHsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICR2YWwgID0gYGdpdC1yZXYtcGFyc2UgJG5hbWVgOworICAgIGRpZSAiRXJyb3I6IGdpdC1yZXYtcGFyc2UgJG5hbWUiIGlmICQ/OworICAgIGNob21wICR2YWw7CisgICAgcmV0dXJuICR2YWw7Cit9CisKKyMgcmVzb2x2ZSBhIFNIQTEgdG8gYSBrbm93biBwYXRjaHNldAorc3ViIGNvbW1pdGlkMnBzZXQgeworICAgIG15ICRjb21taXRpZCA9IHNoaWZ0OworICAgIGNob21wICRjb21taXRpZDsKKyAgICBteSAkbmFtZSA9ICRycHRhZ3N7JGNvbW1pdGlkfSAKKwl8fCBkaWUgIkNhbm5vdCBmaW5kIHJldmVyc2UgdGFnIG1hcHBpbmcgZm9yICRjb21taXRpZCI7CisgICAgJG5hbWUgPX4gc3wsfC98OworICAgIG15ICRwcyAgID0gJHBzZXRzeyRuYW1lfSAKKwl8fCAocHJpbnQgRHVtcGVyKHNvcnQga2V5cyAlcHNldHMpKSAmJiBkaWUgIkNhbm5vdCBmaW5kIHBhdGNoc2V0IGZvciAkbmFtZSI7CisgICAgcmV0dXJuICRwczsKK30KKworCisjIGFuIGFsdGVybmF0aXZlIHRvIGBjb21tYW5kYCB0aGF0IGFsbG93cyBpbnB1dCB0byBiZSBwYXNzZWQgYXMgYW4gYXJyYXkKKyMgdG8gd29yayBhcm91bmQgc2hlbGwgcHJvYmxlbXMgd2l0aCB3ZWlyZCBjaGFyYWN0ZXJzIGluIGFyZ3VtZW50cworc3ViIHNhZmVfcGlwZV9jYXB0dXJlIHsKKyAgICBteSBAb3V0cHV0OworICAgIGlmIChteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCcpIHsKKyAgICAgICAgQG91dHB1dCA9ICg8JGNoaWxkPik7CisgICAgICAgIGNsb3NlICRjaGlsZCBvciBkaWUgam9pbignICcsQF8pLiI6ICQhICQ/IjsKKyAgICB9IGVsc2UgeworCWV4ZWMoQF8pIG9yIGRpZSAiJCEgJD8iOyAjIGV4ZWMoKSBjYW4gZmFpbCB0aGUgZXhlY3V0YWJsZSBjYW4ndCBiZSBmb3VuZAorICAgIH0KKyAgICByZXR1cm4gd2FudGFycmF5ID8gQG91dHB1dCA6IGpvaW4oJycsQG91dHB1dCk7Cit9CisKKyMgYHRsYSBsb2dzIC1yZiAtZCA8ZGlyPiB8IGhlYWQgLW4xYCBvciBgYmF6IHRyZWUtaWQgPGRpcj5gCitzdWIgYXJjaF90cmVlX2lkIHsKKyAgICBteSAkZGlyID0gc2hpZnQ7CisgICAgY2hvbXAoIG15ICRyZXQgPSAoc2FmZV9waXBlX2NhcHR1cmUoJFRMQSwnbG9ncycsJy1yZicsJy1kJywkZGlyKSlbMF0gKTsKKyAgICByZXR1cm4gJHJldDsKK30KKworc3ViIGFyY2hpdmVfcmVhY2hhYmxlIHsKKyAgICBteSAkYXJjaGl2ZSA9IHNoaWZ0OworICAgIHJldHVybiAxIGlmICRyZWFjaGFibGV7JGFyY2hpdmV9OworICAgIHJldHVybiAwIGlmICR1bnJlYWNoYWJsZXskYXJjaGl2ZX07CisgICAgCisgICAgaWYgKHN5c3RlbSAiJFRMQSB3aGVyZWlzLWFyY2hpdmUgJGFyY2hpdmUgPi9kZXYvbnVsbCIpIHsKKyAgICAgICAgaWYgKCRvcHRfYSAmJiAoc3lzdGVtKCRUTEEsJ3JlZ2lzdGVyLWFyY2hpdmUnLAorICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbWlycm9ycy5zb3VyY2Vjb250cm9sLm5ldC8kYXJjaGl2ZSIpID09IDApKSB7CisgICAgICAgICAgICAkcmVhY2hhYmxleyRhcmNoaXZlfSA9IDE7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBwcmludCBTVERFUlIgIkFyY2hpdmUgaXMgdW5yZWFjaGFibGU6ICRhcmNoaXZlXG4iOworICAgICAgICAkdW5yZWFjaGFibGV7JGFyY2hpdmV9ID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHJlYWNoYWJsZXskYXJjaGl2ZX0gPSAxOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2dpdC1iaXNlY3Quc2ggYi9naXQtYmlzZWN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2YThkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtYmlzZWN0LnNoCkBAIC0wLDAgKzEsMjQ4IEBACisjIS9iaW4vc2gKKworVVNBR0U9J1tzdGFydHxiYWR8Z29vZHxuZXh0fHJlc2V0fHZpc3VhbGl6ZV0nCitMT05HX1VTQUdFPSdnaXQgYmlzZWN0IHN0YXJ0IFs8cGF0aHNwZWM+XQlyZXNldCBiaXNlY3Qgc3RhdGUgYW5kIHN0YXJ0IGJpc2VjdGlvbi4KK2dpdCBiaXNlY3QgYmFkIFs8cmV2Pl0JCW1hcmsgPHJldj4gYSBrbm93bi1iYWQgcmV2aXNpb24uCitnaXQgYmlzZWN0IGdvb2QgWzxyZXY+Li4uXQltYXJrIDxyZXY+Li4uIGtub3duLWdvb2QgcmV2aXNpb25zLgorZ2l0IGJpc2VjdCBuZXh0CQkJZmluZCBuZXh0IGJpc2VjdGlvbiB0byB0ZXN0IGFuZCBjaGVjayBpdCBvdXQuCitnaXQgYmlzZWN0IHJlc2V0IFs8YnJhbmNoPl0JZmluaXNoIGJpc2VjdGlvbiBzZWFyY2ggYW5kIGdvIGJhY2sgdG8gYnJhbmNoLgorZ2l0IGJpc2VjdCB2aXN1YWxpemUgICAgICAgICAgICBzaG93IGJpc2VjdCBzdGF0dXMgaW4gZ2l0ay4KK2dpdCBiaXNlY3QgcmVwbGF5IDxsb2dmaWxlPglyZXBsYXkgYmlzZWN0aW9uIGxvZworZ2l0IGJpc2VjdCBsb2cJCQlzaG93IGJpc2VjdCBsb2cuJworCisuIGdpdC1zaC1zZXR1cAorCitzcSgpIHsKKwlAQFBFUkxAQCAtZSAnCisJCWZvciAoQEFSR1YpIHsKKwkJCXMvJ1wnJy8nXCdcXFxcXCdcJycvZzsKKwkJCXByaW50ICIgJ1wnJyRfJ1wnJyI7CisJCX0KKwkJcHJpbnQgIlxuIjsKKwknICIkQCIKK30KKworYmlzZWN0X2F1dG9zdGFydCgpIHsKKwl0ZXN0IC1kICIkR0lUX0RJUi9yZWZzL2Jpc2VjdCIgfHwgeworCQllY2hvID4mMiAnWW91IG5lZWQgdG8gc3RhcnQgYnkgImdpdCBiaXNlY3Qgc3RhcnQiJworCQlpZiB0ZXN0IC10IDAKKwkJdGhlbgorCQkJZWNobyA+JjIgLW4gJ0RvIHlvdSB3YW50IG1lIHRvIGRvIGl0IGZvciB5b3UgW1kvbl0/ICcKKwkJCXJlYWQgeWVzbm8KKwkJCWNhc2UgIiR5ZXNubyIgaW4KKwkJCVtObl0qKQorCQkJCWV4aXQgOzsKKwkJCWVzYWMKKwkJCWJpc2VjdF9zdGFydAorCQllbHNlCisJCQlleGl0IDEKKwkJZmkKKwl9Cit9CisKK2Jpc2VjdF9zdGFydCgpIHsKKwkjCisJIyBWZXJpZnkgSEVBRC4gSWYgd2Ugd2VyZSBiaXNlY3RpbmcgYmVmb3JlIHRoaXMsIHJlc2V0IHRvIHRoZQorCSMgdG9wLW9mLWxpbmUgbWFzdGVyIGZpcnN0IQorCSMKKwloZWFkPSQoR0lUX0RJUj0iJEdJVF9ESVIiIGdpdC1zeW1ib2xpYy1yZWYgSEVBRCkgfHwKKwlkaWUgIkJhZCBIRUFEIC0gSSBuZWVkIGEgc3ltYm9saWMgcmVmIgorCWNhc2UgIiRoZWFkIiBpbgorCXJlZnMvaGVhZHMvYmlzZWN0KikKKwkJaWYgWyAtcyAiJEdJVF9ESVIvaGVhZC1uYW1lIiBdOyB0aGVuCisJCSAgICBicmFuY2g9YGNhdCAiJEdJVF9ESVIvaGVhZC1uYW1lImAKKwkJZWxzZQorCQkgICAgYnJhbmNoPW1hc3RlcgorCSAgICAgICAgZmkKKwkJZ2l0IGNoZWNrb3V0ICRicmFuY2ggfHwgZXhpdAorCQk7OworCXJlZnMvaGVhZHMvKikKKwkJWyAtcyAiJEdJVF9ESVIvaGVhZC1uYW1lIiBdICYmIGRpZSAid29uJ3QgYmlzZWN0IG9uIHNlZWtlZCB0cmVlIgorCQllY2hvICIkaGVhZCIgfCBzZWQgJ3MjXnJlZnMvaGVhZHMvIyMnID4iJEdJVF9ESVIvaGVhZC1uYW1lIgorCQk7OworCSopCisJCWRpZSAiQmFkIEhFQUQgLSBzdHJhbmdlIHN5bWJvbGljIHJlZiIKKwkJOzsKKwllc2FjCisKKwkjCisJIyBHZXQgcmlkIG9mIGFueSBvbGQgYmlzZWN0IHN0YXRlCisJIworCXJtIC1mICIkR0lUX0RJUi9yZWZzL2hlYWRzL2Jpc2VjdCIKKwlybSAtcmYgIiRHSVRfRElSL3JlZnMvYmlzZWN0LyIKKwlta2RpciAiJEdJVF9ESVIvcmVmcy9iaXNlY3QiCisJeworCSAgICBwcmludGYgImdpdC1iaXNlY3Qgc3RhcnQiCisJICAgIHNxICIkQCIKKwl9ID4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwlzcSAiJEAiID4iJEdJVF9ESVIvQklTRUNUX05BTUVTIgorfQorCitiaXNlY3RfYmFkKCkgeworCWJpc2VjdF9hdXRvc3RhcnQKKwljYXNlICIkIyIgaW4KKwkwKQorCQlyZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpIDs7CisJMSkKKwkJcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiKSA7OworCSopCisJCXVzYWdlIDs7CisJZXNhYyB8fCBleGl0CisJZWNobyAiJHJldiIgPiIkR0lUX0RJUi9yZWZzL2Jpc2VjdC9iYWQiCisJZWNobyAiIyBiYWQ6ICIkKGdpdC1zaG93LWJyYW5jaCAkcmV2KSA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCWVjaG8gImdpdC1iaXNlY3QgYmFkICRyZXYiID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJYmlzZWN0X2F1dG9fbmV4dAorfQorCitiaXNlY3RfZ29vZCgpIHsKKwliaXNlY3RfYXV0b3N0YXJ0CisgICAgICAgIGNhc2UgIiQjIiBpbgorCTApICAgIHJldnM9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpIHx8IGV4aXQgOzsKKwkqKSAgICByZXZzPSQoZ2l0LXJldi1wYXJzZSAtLXJldnMtb25seSAtLW5vLWZsYWdzICIkQCIpICYmCisJCXRlc3QgJycgIT0gIiRyZXZzIiB8fCBkaWUgIkJhZCByZXYgaW5wdXQ6ICRAIiA7OworCWVzYWMKKwlmb3IgcmV2IGluICRyZXZzCisJZG8KKwkJcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHJldiIpIHx8IGV4aXQKKwkJZWNobyAiJHJldiIgPiIkR0lUX0RJUi9yZWZzL2Jpc2VjdC9nb29kLSRyZXYiCisJCWVjaG8gIiMgZ29vZDogIiQoZ2l0LXNob3ctYnJhbmNoICRyZXYpID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJCWVjaG8gImdpdC1iaXNlY3QgZ29vZCAkcmV2IiA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCWRvbmUKKwliaXNlY3RfYXV0b19uZXh0Cit9CisKK2Jpc2VjdF9uZXh0X2NoZWNrKCkgeworCW5leHRfb2s9bm8KKyAgICAgICAgdGVzdCAtZiAiJEdJVF9ESVIvcmVmcy9iaXNlY3QvYmFkIiAmJgorCWNhc2UgIiQoY2QgIiRHSVRfRElSIiAmJiBlY2hvIHJlZnMvYmlzZWN0L2dvb2QtKikiIGluCisJcmVmcy9iaXNlY3QvZ29vZC1cKikgOzsKKwkqKSBuZXh0X29rPXllcyA7OworCWVzYWMKKwljYXNlICIkbmV4dF9vaywkMSIgaW4KKwlubywpIGZhbHNlIDs7CisJbm8sZmFpbCkKKwkgICAgZWNobyA+JjIgJ1lvdSBuZWVkIHRvIGdpdmUgbWUgYXQgbGVhc3Qgb25lIGdvb2QgYW5kIG9uZSBiYWQgcmV2aXNpb25zLicKKwkgICAgZXhpdCAxIDs7CisJKikKKwkgICAgdHJ1ZSA7OworCWVzYWMKK30KKworYmlzZWN0X2F1dG9fbmV4dCgpIHsKKwliaXNlY3RfbmV4dF9jaGVjayAmJiBiaXNlY3RfbmV4dCB8fCA6Cit9CisKK2Jpc2VjdF9uZXh0KCkgeworICAgICAgICBjYXNlICIkIyIgaW4gMCkgOzsgKikgdXNhZ2UgOzsgZXNhYworCWJpc2VjdF9hdXRvc3RhcnQKKwliaXNlY3RfbmV4dF9jaGVjayBmYWlsCisJYmFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSByZWZzL2Jpc2VjdC9iYWQpICYmCisJZ29vZD0kKGdpdC1yZXYtcGFyc2UgLS1zcSAtLXJldnMtb25seSAtLW5vdCBcCisJCSQoY2QgIiRHSVRfRElSIiAmJiBscyByZWZzL2Jpc2VjdC9nb29kLSopKSAmJgorCXJldj0kKGV2YWwgImdpdC1yZXYtbGlzdCAtLWJpc2VjdCAkZ29vZCAkYmFkIC0tICQoY2F0ICRHSVRfRElSL0JJU0VDVF9OQU1FUykiKSB8fCBleGl0CisJaWYgWyAteiAiJHJldiIgXTsgdGhlbgorCSAgICBlY2hvICIkYmFkIHdhcyBib3RoIGdvb2QgYW5kIGJhZCIKKwkgICAgZXhpdCAxCisJZmkKKwlpZiBbICIkcmV2IiA9ICIkYmFkIiBdOyB0aGVuCisJICAgIGVjaG8gIiRyZXYgaXMgZmlyc3QgYmFkIGNvbW1pdCIKKwkgICAgZ2l0LWRpZmYtdHJlZSAtLXByZXR0eSAkcmV2CisJICAgIGV4aXQgMAorCWZpCisJbnI9JChldmFsICJnaXQtcmV2LWxpc3QgJHJldiAkZ29vZCAtLSAkKGNhdCAkR0lUX0RJUi9CSVNFQ1RfTkFNRVMpIiB8IHdjIC1sKSB8fCBleGl0CisJZWNobyAiQmlzZWN0aW5nOiAkbnIgcmV2aXNpb25zIGxlZnQgdG8gdGVzdCBhZnRlciB0aGlzIgorCWVjaG8gIiRyZXYiID4gIiRHSVRfRElSL3JlZnMvaGVhZHMvbmV3LWJpc2VjdCIKKwlnaXQgY2hlY2tvdXQgbmV3LWJpc2VjdCB8fCBleGl0CisJbXYgIiRHSVRfRElSL3JlZnMvaGVhZHMvbmV3LWJpc2VjdCIgIiRHSVRfRElSL3JlZnMvaGVhZHMvYmlzZWN0IiAmJgorCUdJVF9ESVI9IiRHSVRfRElSIiBnaXQtc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy9iaXNlY3QKKwlnaXQtc2hvdy1icmFuY2ggIiRyZXYiCit9CisKK2Jpc2VjdF92aXN1YWxpemUoKSB7CisJYmlzZWN0X25leHRfY2hlY2sgZmFpbAorCW5vdD1gY2QgIiRHSVRfRElSL3JlZnMiICYmIGVjaG8gYmlzZWN0L2dvb2QtKmAKKwlldmFsIGdpdGsgYmlzZWN0L2JhZCAtLW5vdCAkbm90IC0tICQoY2F0ICIkR0lUX0RJUi9CSVNFQ1RfTkFNRVMiKQorfQorCitiaXNlY3RfcmVzZXQoKSB7CisJY2FzZSAiJCMiIGluCisJMCkgaWYgWyAtcyAiJEdJVF9ESVIvaGVhZC1uYW1lIiBdOyB0aGVuCisJICAgICAgIGJyYW5jaD1gY2F0ICIkR0lUX0RJUi9oZWFkLW5hbWUiYAorCSAgIGVsc2UKKwkgICAgICAgYnJhbmNoPW1hc3RlcgorCSAgIGZpIDs7CisJMSkgdGVzdCAtZiAiJEdJVF9ESVIvcmVmcy9oZWFkcy8kMSIgfHwgeworCSAgICAgICBlY2hvID4mMiAiJDEgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIGJyYW5jaCIKKwkgICAgICAgZXhpdCAxCisJICAgfQorCSAgIGJyYW5jaD0iJDEiIDs7CisgICAgICAgICopCisJICAgIHVzYWdlIDs7CisJZXNhYworCWdpdCBjaGVja291dCAiJGJyYW5jaCIgJiYKKwlybSAtZnIgIiRHSVRfRElSL3JlZnMvYmlzZWN0IgorCXJtIC1mICIkR0lUX0RJUi9yZWZzL2hlYWRzL2Jpc2VjdCIgIiRHSVRfRElSL2hlYWQtbmFtZSIKKwlybSAtZiAiJEdJVF9ESVIvQklTRUNUX0xPRyIKKwlybSAtZiAiJEdJVF9ESVIvQklTRUNUX05BTUVTIgorfQorCitiaXNlY3RfcmVwbGF5ICgpIHsKKwl0ZXN0IC1yICIkMSIgfHwgeworCQllY2hvID4mMiAiY2Fubm90IHJlYWQgJDEgZm9yIHJlcGxheWluZyIKKwkJZXhpdCAxCisJfQorCWJpc2VjdF9yZXNldAorCXdoaWxlIHJlYWQgYmlzZWN0IGNvbW1hbmQgcmV2CisJZG8KKwkJdGVzdCAiJGJpc2VjdCIgPSAiZ2l0LWJpc2VjdCIgfHwgY29udGludWUKKwkJY2FzZSAiJGNvbW1hbmQiIGluCisJCXN0YXJ0KQorCQkJY21kPSJiaXNlY3Rfc3RhcnQgJHJldiIKKwkJCWV2YWwgIiRjbWQiCisJCQk7OworCQlnb29kKQorCQkJZWNobyAiJHJldiIgPiIkR0lUX0RJUi9yZWZzL2Jpc2VjdC9nb29kLSRyZXYiCisJCQllY2hvICIjIGdvb2Q6ICIkKGdpdC1zaG93LWJyYW5jaCAkcmV2KSA+PiIkR0lUX0RJUi9CSVNFQ1RfTE9HIgorCQkJZWNobyAiZ2l0LWJpc2VjdCBnb29kICRyZXYiID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJCQk7OworCQliYWQpCisJCQllY2hvICIkcmV2IiA+IiRHSVRfRElSL3JlZnMvYmlzZWN0L2JhZCIKKwkJCWVjaG8gIiMgYmFkOiAiJChnaXQtc2hvdy1icmFuY2ggJHJldikgPj4iJEdJVF9ESVIvQklTRUNUX0xPRyIKKwkJCWVjaG8gImdpdC1iaXNlY3QgYmFkICRyZXYiID4+IiRHSVRfRElSL0JJU0VDVF9MT0ciCisJCQk7OworCQkqKQorCQkJZWNobyA+JjIgIj8/IHdoYXQgYXJlIHlvdSB0YWxraW5nIGFib3V0PyIKKwkJCWV4aXQgMSA7OworCQllc2FjCisJZG9uZSA8IiQxIgorCWJpc2VjdF9hdXRvX25leHQKK30KKworY2FzZSAiJCMiIGluCiswKQorICAgIHVzYWdlIDs7CisqKQorICAgIGNtZD0iJDEiCisgICAgc2hpZnQKKyAgICBjYXNlICIkY21kIiBpbgorICAgIHN0YXJ0KQorICAgICAgICBiaXNlY3Rfc3RhcnQgIiRAIiA7OworICAgIGJhZCkKKyAgICAgICAgYmlzZWN0X2JhZCAiJEAiIDs7CisgICAgZ29vZCkKKyAgICAgICAgYmlzZWN0X2dvb2QgIiRAIiA7OworICAgIG5leHQpCisgICAgICAgICMgTm90IHN1cmUgd2Ugd2FudCAibmV4dCIgYXQgdGhlIFVJIGxldmVsIGFueW1vcmUuCisgICAgICAgIGJpc2VjdF9uZXh0ICIkQCIgOzsKKyAgICB2aXN1YWxpemUpCisJYmlzZWN0X3Zpc3VhbGl6ZSAiJEAiIDs7CisgICAgcmVzZXQpCisgICAgICAgIGJpc2VjdF9yZXNldCAiJEAiIDs7CisgICAgcmVwbGF5KQorCWJpc2VjdF9yZXBsYXkgIiRAIiA7OworICAgIGxvZykKKwljYXQgIiRHSVRfRElSL0JJU0VDVF9MT0ciIDs7CisgICAgKikKKyAgICAgICAgdXNhZ2UgOzsKKyAgICBlc2FjCitlc2FjCmRpZmYgLS1naXQgYS9naXQtYnJhbmNoLnNoIGIvZ2l0LWJyYW5jaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMDUwMWVjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWJyYW5jaC5zaApAQCAtMCwwICsxLDEzMCBAQAorIyEvYmluL3NoCisKK1VTQUdFPSdbLWxdIFsoLWQgfCAtRCkgPGJyYW5jaG5hbWU+XSB8IFtbLWZdIDxicmFuY2huYW1lPiBbPHN0YXJ0LXBvaW50Pl1dIHwgLXInCitMT05HX1VTQUdFPSdJZiBubyBhcmd1bWVudHMsIHNob3cgYXZhaWxhYmxlIGJyYW5jaGVzIGFuZCBtYXJrIGN1cnJlbnQgYnJhbmNoIHdpdGggYSBzdGFyLgorSWYgb25lIGFyZ3VtZW50LCBjcmVhdGUgYSBuZXcgYnJhbmNoIDxicmFuY2huYW1lPiBiYXNlZCBvZmYgb2YgY3VycmVudCBIRUFELgorSWYgdHdvIGFyZ3VtZW50cywgY3JlYXRlIGEgbmV3IGJyYW5jaCA8YnJhbmNobmFtZT4gYmFzZWQgb2ZmIG9mIDxzdGFydC1wb2ludD4uJworCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK2hlYWRyZWY9JChnaXQtc3ltYm9saWMtcmVmIEhFQUQgfCBzZWQgLWUgJ3N8XnJlZnMvaGVhZHMvfHwnKQorCitkZWxldGVfYnJhbmNoICgpIHsKKyAgICBvcHRpb249IiQxIgorICAgIHNoaWZ0CisgICAgZm9yIGJyYW5jaF9uYW1lCisgICAgZG8KKwljYXNlICIsJGhlYWRyZWYsIiBpbgorCSIsJGJyYW5jaF9uYW1lLCIpCisJICAgIGRpZSAiQ2Fubm90IGRlbGV0ZSB0aGUgYnJhbmNoIHlvdSBhcmUgb24uIiA7OworCSwsKQorCSAgICBkaWUgIldoYXQgYnJhbmNoIGFyZSB5b3Ugb24gYW55d2F5PyIgOzsKKwllc2FjCisJYnJhbmNoPSQoY2F0ICIkR0lUX0RJUi9yZWZzL2hlYWRzLyRicmFuY2hfbmFtZSIpICYmCisJICAgIGJyYW5jaD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRicmFuY2heMCIpIHx8CisJCWRpZSAiU2VyaW91c2x5LCB3aGF0IGJyYW5jaCBhcmUgeW91IHRhbGtpbmcgYWJvdXQ/IgorCWNhc2UgIiRvcHRpb24iIGluCisJLUQpCisJICAgIDs7CisJKikKKwkgICAgbWJzPSQoZ2l0LW1lcmdlLWJhc2UgLWEgIiRicmFuY2giIEhFQUQgfCB0ciAnXDAxMicgJyAnKQorCSAgICBjYXNlICIgJG1icyAiIGluCisJICAgIConICckYnJhbmNoJyAnKikKKwkJIyB0aGUgbWVyZ2UgYmFzZSBvZiBicmFuY2ggYW5kIEhFQUQgY29udGFpbnMgYnJhbmNoIC0tCisJCSMgd2hpY2ggbWVhbnMgdGhhdCB0aGUgSEVBRCBjb250YWlucyBldmVyeXRoaW5nIGluIGJvdGguCisJCTs7CisJICAgICopCisJCWVjaG8gPiYyICJUaGUgYnJhbmNoICckYnJhbmNoX25hbWUnIGlzIG5vdCBhIHN0cmljdCBzdWJzZXQgb2YgeW91ciBjdXJyZW50IEhFQUQuCitJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGl0LCBydW4gJ2dpdCBicmFuY2ggLUQgJGJyYW5jaF9uYW1lJy4iCisJCWV4aXQgMQorCQk7OworCSAgICBlc2FjCisJICAgIDs7CisJZXNhYworCXJtIC1mICIkR0lUX0RJUi9sb2dzL3JlZnMvaGVhZHMvJGJyYW5jaF9uYW1lIgorCXJtIC1mICIkR0lUX0RJUi9yZWZzL2hlYWRzLyRicmFuY2hfbmFtZSIKKwllY2hvICJEZWxldGVkIGJyYW5jaCAkYnJhbmNoX25hbWUuIgorICAgIGRvbmUKKyAgICBleGl0IDAKK30KKworbHNfcmVtb3RlX2JyYW5jaGVzICgpIHsKKyAgICBnaXQtcmV2LXBhcnNlIC0tc3ltYm9saWMgLS1hbGwgfAorICAgIHNlZCAtbmUgJ3N8XnJlZnMvXChyZW1vdGVzL1wpfFwxfHAnIHwKKyAgICBzb3J0Cit9CisKK2ZvcmNlPQorY3JlYXRlX2xvZz0KK3doaWxlIGNhc2UgIiQjLCQxIiBpbiAwLCopIGJyZWFrIDs7ICosLSopIDs7ICopIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLWQgfCAtRCkKKwkJZGVsZXRlX2JyYW5jaCAiJEAiCisJCWV4aXQKKwkJOzsKKwktcikKKwkJbHNfcmVtb3RlX2JyYW5jaGVzCisJCWV4aXQKKwkJOzsKKwktZikKKwkJZm9yY2U9IiQxIgorCQk7OworCS1sKQorCQljcmVhdGVfbG9nPSJ5ZXMiCisJCTs7CisJLS0pCisJCXNoaWZ0CisJCWJyZWFrCisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK2Nhc2UgIiQjIiBpbgorMCkKKwlnaXQtcmV2LXBhcnNlIC0tc3ltYm9saWMgLS1icmFuY2hlcyB8CisJc29ydCB8CisJd2hpbGUgcmVhZCByZWYKKwlkbworCQlpZiB0ZXN0ICIkaGVhZHJlZiIgPSAiJHJlZiIKKwkJdGhlbgorCQkJcGZ4PScqJworCQllbHNlCisJCQlwZng9JyAnCisJCWZpCisJCWVjaG8gIiRwZnggJHJlZiIKKwlkb25lCisJZXhpdCAwIDs7CisxKQorCWhlYWQ9SEVBRCA7OworMikKKwloZWFkPSIkMl4wIiA7OworZXNhYworYnJhbmNobmFtZT0iJDEiCisKK3Jldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRoZWFkIikgfHwgZXhpdAorCitnaXQtY2hlY2stcmVmLWZvcm1hdCAiaGVhZHMvJGJyYW5jaG5hbWUiIHx8CisJZGllICJ3ZSBkbyBub3QgbGlrZSAnJGJyYW5jaG5hbWUnIGFzIGEgYnJhbmNoIG5hbWUuIgorCitpZiBbIC1lICIkR0lUX0RJUi9yZWZzL2hlYWRzLyRicmFuY2huYW1lIiBdCit0aGVuCisJaWYgdGVzdCAnJyA9ICIkZm9yY2UiCisJdGhlbgorCQlkaWUgIiRicmFuY2huYW1lIGFscmVhZHkgZXhpc3RzLiIKKwllbGlmIHRlc3QgIiRicmFuY2huYW1lIiA9ICIkaGVhZHJlZiIKKwl0aGVuCisJCWRpZSAiY2Fubm90IGZvcmNlLXVwZGF0ZSB0aGUgY3VycmVudCBicmFuY2guIgorCWZpCitmaQoraWYgdGVzdCAiJGNyZWF0ZV9sb2ciID0gJ3llcycKK3RoZW4KKwlta2RpciAtcCAkKGRpcm5hbWUgIiRHSVRfRElSL2xvZ3MvcmVmcy9oZWFkcy8kYnJhbmNobmFtZSIpCisJdG91Y2ggIiRHSVRfRElSL2xvZ3MvcmVmcy9oZWFkcy8kYnJhbmNobmFtZSIKK2ZpCitnaXQgdXBkYXRlLXJlZiAtbSAiYnJhbmNoOiBDcmVhdGVkIGZyb20gJGhlYWQiICJyZWZzL2hlYWRzLyRicmFuY2huYW1lIiAkcmV2CmRpZmYgLS1naXQgYS9naXQtY2hlY2tvdXQuc2ggYi9naXQtY2hlY2tvdXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTgwYTllOAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jaGVja291dC5zaApAQCAtMCwwICsxLDIxMyBAQAorIyEvYmluL3NoCisKK1VTQUdFPSdbLWZdIFstYiA8bmV3X2JyYW5jaD5dIFstbV0gWzxicmFuY2g+XSBbPHBhdGhzPi4uLl0nCitTVUJESVJFQ1RPUllfT0s9U29tZXRpbWVzCisuIGdpdC1zaC1zZXR1cAorCitvbGQ9JChnaXQtcmV2LXBhcnNlIEhFQUQpCitvbGRfbmFtZT1IRUFECituZXc9CituZXdfbmFtZT0KK2ZvcmNlPQorYnJhbmNoPQorbmV3YnJhbmNoPQorbmV3YnJhbmNoX2xvZz0KK21lcmdlPQord2hpbGUgWyAiJCMiICE9ICIwIiBdOyBkbworICAgIGFyZz0iJDEiCisgICAgc2hpZnQKKyAgICBjYXNlICIkYXJnIiBpbgorCSItYiIpCisJCW5ld2JyYW5jaD0iJDEiCisJCXNoaWZ0CisJCVsgLXogIiRuZXdicmFuY2giIF0gJiYKKwkJCWRpZSAiZ2l0IGNoZWNrb3V0OiAtYiBuZWVkcyBhIGJyYW5jaCBuYW1lIgorCQlbIC1lICIkR0lUX0RJUi9yZWZzL2hlYWRzLyRuZXdicmFuY2giIF0gJiYKKwkJCWRpZSAiZ2l0IGNoZWNrb3V0OiBicmFuY2ggJG5ld2JyYW5jaCBhbHJlYWR5IGV4aXN0cyIKKwkJZ2l0LWNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyRuZXdicmFuY2giIHx8CisJCQlkaWUgImdpdCBjaGVja291dDogd2UgZG8gbm90IGxpa2UgJyRuZXdicmFuY2gnIGFzIGEgYnJhbmNoIG5hbWUuIgorCQk7OworCSItbCIpCisJCW5ld2JyYW5jaF9sb2c9MQorCQk7OworCSItZiIpCisJCWZvcmNlPTEKKwkJOzsKKwktbSkKKwkJbWVyZ2U9MQorCQk7OworCS0tKQorCQlicmVhaworCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWlmIHJldj0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRhcmdeMCIgMj4vZGV2L251bGwpCisJCXRoZW4KKwkJCWlmIFsgLXogIiRyZXYiIF07IHRoZW4KKwkJCQllY2hvICJ1bmtub3duIGZsYWcgJGFyZyIKKwkJCQlleGl0IDEKKwkJCWZpCisJCQluZXc9IiRyZXYiCisJCQluZXdfbmFtZT0iJGFyZ14wIgorCQkJaWYgWyAtZiAiJEdJVF9ESVIvcmVmcy9oZWFkcy8kYXJnIiBdOyB0aGVuCisJCQkJYnJhbmNoPSIkYXJnIgorCQkJZmkKKwkJZWxpZiByZXY9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkYXJnXnt0cmVlfSIgMj4vZGV2L251bGwpCisJCXRoZW4KKwkJCSMgY2hlY2tpbmcgb3V0IHNlbGVjdGVkIHBhdGhzIGZyb20gYSB0cmVlLWlzaC4KKwkJCW5ldz0iJHJldiIKKwkJCW5ld19uYW1lPSIkYXJnXnt0cmVlfSIKKwkJCWJyYW5jaD0KKwkJZWxzZQorCQkJbmV3PQorCQkJbmV3X25hbWU9CisJCQlicmFuY2g9CisJCQlzZXQgeCAiJGFyZyIgIiRAIgorCQkJc2hpZnQKKwkJZmkKKwkJY2FzZSAiJDEiIGluCisJCS0tKQorCQkJc2hpZnQgOzsKKwkJZXNhYworCQlicmVhaworCQk7OworICAgIGVzYWMKK2RvbmUKKworIyBUaGUgYmVoYXZpb3VyIG9mIHRoZSBjb21tYW5kIHdpdGggYW5kIHdpdGhvdXQgZXhwbGljaXQgcGF0aAorIyBwYXJhbWV0ZXJzIGlzIHF1aXRlIGRpZmZlcmVudC4KKyMKKyMgV2l0aG91dCBwYXRocywgd2UgYXJlIGNoZWNraW5nIG91dCBldmVyeXRoaW5nIGluIHRoZSB3b3JrIHRyZWUsCisjIHBvc3NpYmx5IHN3aXRjaGluZyBicmFuY2hlcy4gIFRoaXMgaXMgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW91ci4KKyMKKyMgV2l0aCBwYXRocywgd2UgYXJlIF9uZXZlcl8gc3dpdGNoaW5nIGJyYW5jaCwgYnV0IGNoZWNraW5nIG91dAorIyB0aGUgbmFtZWQgcGF0aHMgZnJvbSBlaXRoZXIgaW5kZXggKHdoZW4gbm8gcmV2IGlzIGdpdmVuKSwKKyMgb3IgdGhlIG5hbWVkIHRyZWUtaXNoICh3aGVuIHJldiBpcyBnaXZlbikuCisKK2lmIHRlc3QgIiQjIiAtZ2UgMQordGhlbgorCWhpbnQ9CisJaWYgdGVzdCAiJCMiIC1lcSAxCisJdGhlbgorCQloaW50PSIKK0RpZCB5b3UgaW50ZW5kIHRvIGNoZWNrb3V0ICckQCcgd2hpY2ggY2FuIG5vdCBiZSByZXNvbHZlZCBhcyBjb21taXQ/IgorCWZpCisJaWYgdGVzdCAnJyAhPSAiJG5ld2JyYW5jaCRmb3JjZSRtZXJnZSIKKwl0aGVuCisJCWRpZSAiZ2l0IGNoZWNrb3V0OiB1cGRhdGluZyBwYXRocyBpcyBpbmNvbXBhdGlibGUgd2l0aCBzd2l0Y2hpbmcgYnJhbmNoZXMvZm9yY2luZyRoaW50IgorCWZpCisJaWYgdGVzdCAnJyAhPSAiJG5ldyIKKwl0aGVuCisJCSMgZnJvbSBhIHNwZWNpZmljIHRyZWUtaXNoOyBub3RlIHRoYXQgdGhpcyBpcyBmb3IKKwkJIyByZXNjdWluZyBwYXRocyBhbmQgaXMgbmV2ZXIgbWVhbnQgdG8gcmVtb3ZlIHdoYXQKKwkJIyBpcyBub3QgaW4gdGhlIG5hbWVkIHRyZWUtaXNoLgorCQlnaXQtbHMtdHJlZSAtLWZ1bGwtbmFtZSAtciAiJG5ldyIgIiRAIiB8CisJCWdpdC11cGRhdGUtaW5kZXggLS1pbmRleC1pbmZvIHx8IGV4aXQgJD8KKwlmaQorCWdpdC1jaGVja291dC1pbmRleCAtZiAtdSAtLSAiJEAiCisJZXhpdCAkPworZWxzZQorCSMgTWFrZSBzdXJlIHdlIGRpZCBub3QgZmFsbCBiYWNrIG9uICRhcmdee3RyZWV9IGNvZGVwYXRoCisJIyBzaW5jZSB3ZSBhcmUgbm90IGNoZWNraW5nIG91dCBmcm9tIGFuIGFyYml0cmFyeSB0cmVlLWlzaCwKKwkjIGJ1dCBzd2l0Y2hpbmcgYnJhbmNoZXMuCisJaWYgdGVzdCAnJyAhPSAiJG5ldyIKKwl0aGVuCisJCWdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRuZXdee2NvbW1pdH0iID4vZGV2L251bGwgMj4mMSB8fAorCQlkaWUgIkNhbm5vdCBzd2l0Y2ggYnJhbmNoIHRvIGEgbm9uLWNvbW1pdC4iCisJZmkKK2ZpCisKKyMgV2UgYXJlIHN3aXRjaGluZyBicmFuY2hlcyBhbmQgY2hlY2tpbmcgb3V0IHRyZWVzLCBzbworIyB3ZSAqTkVFRCogdG8gYmUgYXQgdGhlIHRvcGxldmVsLgorY2R1cD0kKGdpdC1yZXYtcGFyc2UgLS1zaG93LWNkdXApCitpZiB0ZXN0ICEgLXogIiRjZHVwIgordGhlbgorCWNkICIkY2R1cCIKK2ZpCisKK1sgLXogIiRuZXciIF0gJiYgbmV3PSRvbGQgJiYgbmV3X25hbWU9IiRvbGRfbmFtZSIKKworIyBJZiB3ZSBkb24ndCBoYXZlIGFuIG9sZCBicmFuY2ggdGhhdCB3ZSdyZSBzd2l0Y2hpbmcgdG8sCisjIGFuZCB3ZSBkb24ndCBoYXZlIGEgbmV3IGJyYW5jaCBuYW1lIGZvciB0aGUgdGFyZ2V0IHdlCisjIGFyZSBzd2l0Y2hpbmcgdG8sIHRoZW4gd2UnZCBiZXR0ZXIganVzdCBiZSBjaGVja2luZyBvdXQKKyMgd2hhdCB3ZSBhbHJlYWR5IGhhZAorCitbIC16ICIkYnJhbmNoJG5ld2JyYW5jaCIgXSAmJgorCVsgIiRuZXciICE9ICIkb2xkIiBdICYmCisJZGllICJnaXQgY2hlY2tvdXQ6IHRvIGNoZWNrb3V0IHRoZSByZXF1ZXN0ZWQgY29tbWl0IHlvdSBuZWVkIHRvIHNwZWNpZnkgCisgICAgICAgICAgICAgIGEgbmFtZSBmb3IgYSBuZXcgYnJhbmNoIHdoaWNoIGlzIGNyZWF0ZWQgYW5kIHN3aXRjaGVkIHRvIgorCitpZiBbICIkZm9yY2UiIF0KK3RoZW4KKyAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJG5ldworZWxzZQorICAgIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwKKyAgICBtZXJnZV9lcnJvcj0kKGdpdC1yZWFkLXRyZWUgLW0gLXUgJG9sZCAkbmV3IDI+JjEpIHx8ICgKKwljYXNlICIkbWVyZ2UiIGluCisJJycpCisJCWVjaG8gPiYyICIkbWVyZ2VfZXJyb3IiCisJCWV4aXQgMSA7OworCWVzYWMKKworCSMgTWF0Y2ggdGhlIGluZGV4IHRvIHRoZSB3b3JraW5nIHRyZWUsIGFuZCBkbyBhIHRocmVlLXdheS4KKyAgICAJZ2l0IGRpZmYtZmlsZXMgLS1uYW1lLW9ubHkgfCBnaXQgdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tc3RkaW4gJiYKKwl3b3JrPWBnaXQgd3JpdGUtdHJlZWAgJiYKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgLXUgJG5ldyAmJgorCWdpdCByZWFkLXRyZWUgLW0gLXUgLS1hZ2dyZXNzaXZlICRvbGQgJG5ldyAkd29yayB8fCBleGl0CisKKwlpZiByZXN1bHQ9YGdpdCB3cml0ZS10cmVlIDI+L2Rldi9udWxsYAorCXRoZW4KKwkgICAgZWNobyA+JjIgIlRyaXZpYWxseSBhdXRvbWVyZ2VkLiIKKwllbHNlCisJICAgIGdpdCBtZXJnZS1pbmRleCAtbyBnaXQtbWVyZ2Utb25lLWZpbGUgLWEKKwlmaQorCisJIyBEbyBub3QgcmVnaXN0ZXIgdGhlIGNsZWFubHkgbWVyZ2VkIHBhdGhzIGluIHRoZSBpbmRleCB5ZXQuCisJIyB0aGlzIGlzIG5vdCBhIHJlYWwgbWVyZ2UgYmVmb3JlIGNvbW1pdHRpbmcsIGJ1dCBqdXN0IGNhcnJ5aW5nCisJIyB0aGUgd29ya2luZyB0cmVlIGNoYW5nZXMgYWxvbmcuCisJdW5tZXJnZWQ9YGdpdCBscy1maWxlcyAtdWAKKwlnaXQgcmVhZC10cmVlIC0tcmVzZXQgJG5ldworCWNhc2UgIiR1bm1lcmdlZCIgaW4KKwknJykJOzsKKwkqKQorCQkoCisJCQl6NDA9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCQkJZWNobyAiJHVubWVyZ2VkIiB8CisJCQlzZWQgLWUgJ3MvXlswLTddKiBbMC05YS1mXSogLyciMCAkejQwIC8iCisJCQllY2hvICIkdW5tZXJnZWQiCisJCSkgfCBnaXQgdXBkYXRlLWluZGV4IC0taW5kZXgtaW5mbworCQk7OworCWVzYWMKKwlleGl0IDAKKyAgICApCisgICAgc2F2ZWRfZXJyPSQ/CisgICAgaWYgdGVzdCAiJHNhdmVkX2VyciIgPSAwCisgICAgdGhlbgorCXRlc3QgIiRuZXciID0gIiRvbGQiIHx8IGdpdCBkaWZmLWluZGV4IC0tbmFtZS1zdGF0dXMgIiRuZXciCisgICAgZmkKKyAgICAoZXhpdCAkc2F2ZWRfZXJyKQorZmkKKworIyAKKyMgU3dpdGNoIHRoZSBIRUFEIHBvaW50ZXIgdG8gdGhlIG5ldyBicmFuY2ggaWYgd2UKKyMgY2hlY2tlZCBvdXQgYSBicmFuY2ggaGVhZCwgYW5kIHJlbW92ZSBhbnkgcG90ZW50aWFsCisjIG9sZCBNRVJHRV9IRUFEJ3MgKHN1YnNlcXVlbnQgY29tbWl0cyB3aWxsIGNsZWFybHkgbm90CisjIGJlIGJhc2VkIG9uIHRoZW0sIHNpbmNlIHdlIHJlLXNldCB0aGUgaW5kZXgpCisjCitpZiBbICIkPyIgLWVxIDAgXTsgdGhlbgorCWlmIFsgIiRuZXdicmFuY2giIF07IHRoZW4KKwkJaWYgWyAiJG5ld2JyYW5jaF9sb2ciIF07IHRoZW4KKwkJCW1rZGlyIC1wICQoZGlybmFtZSAiJEdJVF9ESVIvbG9ncy9yZWZzL2hlYWRzLyRuZXdicmFuY2giKQorCQkJdG91Y2ggIiRHSVRfRElSL2xvZ3MvcmVmcy9oZWFkcy8kbmV3YnJhbmNoIgorCQlmaQorCQlnaXQtdXBkYXRlLXJlZiAtbSAiY2hlY2tvdXQ6IENyZWF0ZWQgZnJvbSAkbmV3X25hbWUiICJyZWZzL2hlYWRzLyRuZXdicmFuY2giICRuZXcgfHwgZXhpdAorCQlicmFuY2g9IiRuZXdicmFuY2giCisJZmkKKwlbICIkYnJhbmNoIiBdICYmCisJR0lUX0RJUj0iJEdJVF9ESVIiIGdpdC1zeW1ib2xpYy1yZWYgSEVBRCAicmVmcy9oZWFkcy8kYnJhbmNoIgorCXJtIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIgorZWxzZQorCWV4aXQgMQorZmkKZGlmZiAtLWdpdCBhL2dpdC1jaGVycnkuc2ggYi9naXQtY2hlcnJ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwZTg4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY2hlcnJ5LnNoCkBAIC0wLDAgKzEsOTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8uCisjCisKK1VTQUdFPSdbLXZdIDx1cHN0cmVhbT4gWzxoZWFkPl0gWzxsaW1pdD5dJworTE9OR19VU0FHRT0nICAgICAgICAgICAgIF9fKl9fKl9fKl9fKl9fPiA8dXBzdHJlYW0+CisgICAgICAgICAgICAvCisgIGZvcmstcG9pbnQKKyAgICAgICAgICAgIFxfXytfXytfXytfXytfXytfXytfXytfXz4gPGhlYWQ+CisKK0VhY2ggY29tbWl0IGJldHdlZW4gdGhlIGZvcmstcG9pbnQgKG9yIDxsaW1pdD4gaWYgZ2l2ZW4pIGFuZCA8aGVhZD4gaXMKK2V4YW1pbmVkLCBhbmQgY29tcGFyZWQgYWdhaW5zdCB0aGUgY2hhbmdlIGVhY2ggY29tbWl0IGJldHdlZW4gdGhlCitmb3JrLXBvaW50IGFuZCA8dXBzdHJlYW0+IGludHJvZHVjZXMuICBJZiB0aGUgY2hhbmdlIHNlZW1zIHRvIGJlIGluCit0aGUgdXBzdHJlYW0sIGl0IGlzIHNob3duIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgd2l0aCBwcmVmaXggIisiLgorT3RoZXJ3aXNlIGl0IGlzIHNob3duIHdpdGggcHJlZml4ICItIi4nCisuIGdpdC1zaC1zZXR1cAorCitjYXNlICIkMSIgaW4gLXYpIHZlcmJvc2U9dDsgc2hpZnQgOzsgZXNhYyAKKworY2FzZSAiJCMsJDEiIGluCisxLCouLiopCisgICAgdXBzdHJlYW09JChleHByICJ6JDEiIDogJ3pcKC4qXClcLlwuJykgb3Vycz0kKGV4cHIgInokMSIgOiAnLipcLlwuXCguKlwpJCcpCisgICAgc2V0IHggIiR1cHN0cmVhbSIgIiRvdXJzIgorICAgIHNoaWZ0IDs7Citlc2FjCisKK2Nhc2UgIiQjIiBpbgorMSkgdXBzdHJlYW09YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxImAgJiYKKyAgIG91cnM9YGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGAgfHwgZXhpdAorICAgbGltaXQ9IiR1cHN0cmVhbSIKKyAgIDs7CisyKSB1cHN0cmVhbT1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiYCAmJgorICAgb3Vycz1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDIiYCB8fCBleGl0CisgICBsaW1pdD0iJHVwc3RyZWFtIgorICAgOzsKKzMpIHVwc3RyZWFtPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMSJgICYmCisgICBvdXJzPWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkMiJgICYmCisgICBsaW1pdD1gZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDMiYCB8fCBleGl0CisgICA7OworKikgdXNhZ2UgOzsKK2VzYWMKKworIyBOb3RlIHRoYXQgdGhlc2UgbGlzdCBjb21taXRzIGluIHJldmVyc2Ugb3JkZXI7CisjIG5vdCB0aGF0IHRoZSBvcmRlciBpbiBpbnVwIG1hdHRlcnMuLi4KK2ludXA9YGdpdC1yZXYtbGlzdCBeJG91cnMgJHVwc3RyZWFtYCAmJgorb3Vycz1gZ2l0LXJldi1saXN0ICRvdXJzIF4kbGltaXRgIHx8IGV4aXQKKwordG1wPS5jaGVycnktdG1wJCQKK3BhdGNoPSR0bXAtcGF0Y2gKK21rZGlyICRwYXRjaAordHJhcCAicm0gLXJmICR0bXAtKiIgMCAxIDIgMyAxNQorCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKKworZm9yIGMgaW4gJGludXAKK2RvCisJZ2l0LWRpZmYtdHJlZSAtcCAkYworZG9uZSB8IGdpdC1wYXRjaC1pZCB8Cit3aGlsZSByZWFkIGlkIG5hbWUKK2RvCisJZWNobyAkbmFtZSA+PiRwYXRjaC8kaWQKK2RvbmUKKworTEY9JworJworCitPPQorZm9yIGMgaW4gJG91cnMKK2RvCisJc2V0IHggYGdpdC1kaWZmLXRyZWUgLXAgJGMgfCBnaXQtcGF0Y2gtaWRgCisJaWYgdGVzdCAiJDIiICE9ICIiCisJdGhlbgorCQlpZiB0ZXN0IC1mICIkcGF0Y2gvJDIiCisJCXRoZW4KKwkJCXNpZ249LQorCQllbHNlCisJCQlzaWduPSsKKwkJZmkKKwkJY2FzZSAiJHZlcmJvc2UiIGluCisJCXQpCisJCQljPSQoZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgLS1tYXgtY291bnQ9MSAkYykKKwkJZXNhYworCQljYXNlICIkTyIgaW4KKwkJJycpCU89IiRzaWduICRjIiA7OworCQkqKQlPPSIkc2lnbiAkYyRMRiRPIiA7OworCQllc2FjCisJZmkKK2RvbmUKK2Nhc2UgIiRPIiBpbgorJycpIDs7CisqKSAgZWNobyAiJE8iIDs7Citlc2FjCmRpZmYgLS1naXQgYS9naXQtY2xlYW4uc2ggYi9naXQtY2xlYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzgzNDMyMwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jbGVhbi5zaApAQCAtMCwwICsxLDg5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgUGF2ZWwgUm9za2luCisjCisKK1VTQUdFPSJbLWRdIFstbl0gWy1xXSBbLXggfCAtWF0gWy0tXSA8cGF0aHM+Li4uIgorTE9OR19VU0FHRT0nQ2xlYW4gdW50cmFja2VkIGZpbGVzIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CisJLWQJcmVtb3ZlIGRpcmVjdG9yaWVzIGFzIHdlbGwKKwktbiAJZG9uJ1wnJ3QgcmVtb3ZlIGFueXRoaW5nLCBqdXN0IHNob3cgd2hhdCB3b3VsZCBiZSBkb25lCisJLXEJYmUgcXVpZXQsIG9ubHkgcmVwb3J0IGVycm9ycworCS14CXJlbW92ZSBpZ25vcmVkIGZpbGVzIGFzIHdlbGwKKwktWAlyZW1vdmUgb25seSBpZ25vcmVkIGZpbGVzCitXaGVuIG9wdGlvbmFsIDxwYXRocz4uLi4gYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIHBhdGhzCithZmZlY3RlZCBhcmUgZnVydGhlciBsaW1pdGVkIHRvIHRob3NlIHRoYXQgbWF0Y2ggdGhlbS4nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorCitpZ25vcmVkPQoraWdub3JlZG9ubHk9CitjbGVhbmRpcj0KK3F1aWV0PQorcm1mPSJybSAtZiAtLSIKK3JtcmY9InJtIC1yZiAtLSIKK3JtX3JlZnVzZT0iZWNobyBOb3QgcmVtb3ZpbmciCitlY2hvMT0iZWNobyIKKword2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLWQpCisJCWNsZWFuZGlyPTEKKwkJOzsKKwktbikKKwkJcXVpZXQ9MQorCQlybWY9ImVjaG8gV291bGQgcmVtb3ZlIgorCQlybXJmPSJlY2hvIFdvdWxkIHJlbW92ZSIKKwkJcm1fcmVmdXNlPSJlY2hvIFdvdWxkIG5vdCByZW1vdmUiCisJCWVjaG8xPSI6IgorCQk7OworCS1xKQorCQlxdWlldD0xCisJCTs7CisJLXgpCisJCWlnbm9yZWQ9MQorCQk7OworCS1YKQorCQlpZ25vcmVkb25seT0xCisJCTs7CisJLS0pCisJCXNoaWZ0CisJCWJyZWFrCisJCTs7CisJLSopCisJCXVzYWdlCisJCTs7CisJKikKKwkJYnJlYWsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworY2FzZSAiJGlnbm9yZWQsJGlnbm9yZWRvbmx5IiBpbgorCTEsMSkgdXNhZ2U7OworZXNhYworCitpZiBbIC16ICIkaWdub3JlZCIgXTsgdGhlbgorCWV4Y2w9Ii0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUiCisJaWYgWyAtZiAiJEdJVF9ESVIvaW5mby9leGNsdWRlIiBdOyB0aGVuCisJCWV4Y2xfaW5mbz0iLS1leGNsdWRlLWZyb209JEdJVF9ESVIvaW5mby9leGNsdWRlIgorCWZpCisJaWYgWyAiJGlnbm9yZWRvbmx5IiBdOyB0aGVuCisJCWV4Y2w9IiRleGNsIC0taWdub3JlZCIKKwlmaQorZmkKKworZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIC0tZGlyZWN0b3J5ICRleGNsICR7ZXhjbF9pbmZvOisiJGV4Y2xfaW5mbyJ9IC0tICIkQCIgfAord2hpbGUgcmVhZCAtciBmaWxlOyBkbworCWlmIFsgLWQgIiRmaWxlIiAtYSAhIC1MICIkZmlsZSIgXTsgdGhlbgorCQlpZiBbIC16ICIkY2xlYW5kaXIiIF07IHRoZW4KKwkJCSRybV9yZWZ1c2UgIiRmaWxlIgorCQkJY29udGludWUKKwkJZmkKKwkJJGVjaG8xICJSZW1vdmluZyAkZmlsZSIKKwkJJHJtcmYgIiRmaWxlIgorCWVsc2UKKwkJJGVjaG8xICJSZW1vdmluZyAkZmlsZSIKKwkJJHJtZiAiJGZpbGUiCisJZmkKK2RvbmUKZGlmZiAtLWdpdCBhL2dpdC1jbG9uZS5zaCBiL2dpdC1jbG9uZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MDYwYmRhCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWNsb25lLnNoCkBAIC0wLDAgKzEsNDE5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1LCBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDUsIEp1bmlvIEMgSGFtYW5vCisjIAorIyBDbG9uZSBhIHJlcG9zaXRvcnkgaW50byBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdGhhdCBkb2VzIG5vdCB5ZXQgZXhpc3QuCisKKyMgU2VlIGdpdC1zaC1zZXR1cCB3aHkuCit1bnNldCBDRFBBVEgKKwordXNhZ2UoKSB7CisJZWNobyA+JjIgIlVzYWdlOiAkMCBbLS10ZW1wbGF0ZT08dGVtcGxhdGVfZGlyZWN0b3J5Pl0gWy0tdXNlLXNlcGFyYXRlLXJlbW90ZV0gWy0tcmVmZXJlbmNlIDxyZWZlcmVuY2UtcmVwbz5dIFstLWJhcmVdIFstbCBbLXNdXSBbLXFdIFstdSA8dXBsb2FkLXBhY2s+XSBbLS1vcmlnaW4gPG5hbWU+XSBbLW5dIDxyZXBvPiBbPGRpcj5dIgorCWV4aXQgMQorfQorCitnZXRfcmVwb19iYXNlKCkgeworCShjZCAiJDEiICYmIChjZCAuZ2l0IDsgcHdkKSkgMj4gL2Rldi9udWxsCit9CisKK2lmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgXTsgdGhlbgorICAgIGN1cmxfZXh0cmFfYXJncz0iLWsiCitmaQorCitodHRwX2ZldGNoICgpIHsKKwkjICQxID0gUmVtb3RlLCAkMiA9IExvY2FsCisJY3VybCAtbnNmTCAkY3VybF9leHRyYV9hcmdzICIkMSIgPiIkMiIKK30KKworY2xvbmVfZHVtYl9odHRwICgpIHsKKwkjICQxIC0gcmVtb3RlLCAkMiAtIGxvY2FsCisJY2QgIiQyIiAmJgorCWNsb25lX3RtcD0iJEdJVF9ESVIvY2xvbmUtdG1wIiAmJgorCW1rZGlyIC1wICIkY2xvbmVfdG1wIiB8fCBleGl0IDEKKwlodHRwX2ZldGNoICIkMS9pbmZvL3JlZnMiICIkY2xvbmVfdG1wL3JlZnMiIHx8IHsKKwkJZWNobyA+JjIgIkNhbm5vdCBnZXQgcmVtb3RlIHJlcG9zaXRvcnkgaW5mb3JtYXRpb24uCitQZXJoYXBzIGdpdC11cGRhdGUtc2VydmVyLWluZm8gbmVlZHMgdG8gYmUgcnVuIHRoZXJlPyIKKwkJZXhpdCAxOworCX0KKwl3aGlsZSByZWFkIHNoYTEgcmVmbmFtZQorCWRvCisJCW5hbWU9YGV4cHIgInokcmVmbmFtZSIgOiAnenJlZnMvXCguKlwpJ2AgJiYKKwkJY2FzZSAiJG5hbWUiIGluCisJCSpeKikJY29udGludWU7OworCQllc2FjCisJCWlmIHRlc3QgLW4gIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiAmJgorCQkgICBicmFuY2hfbmFtZT1gZXhwciAieiRuYW1lIiA6ICd6aGVhZHMvXCguKlwpJ2AKKwkJdGhlbgorCQkJdG5hbWU9InJlbW90ZXMvJG9yaWdpbi8kYnJhbmNoX25hbWUiCisJCWVsc2UKKwkJCXRuYW1lPSRuYW1lCisJCWZpCisJCWdpdC1odHRwLWZldGNoIC12IC1hIC13ICIkdG5hbWUiICIkbmFtZSIgIiQxLyIgfHwgZXhpdCAxCisJZG9uZSA8IiRjbG9uZV90bXAvcmVmcyIKKwlybSAtZnIgIiRjbG9uZV90bXAiCisJaHR0cF9mZXRjaCAiJDEvSEVBRCIgIiRHSVRfRElSL1JFTU9URV9IRUFEIiB8fAorCXJtIC1mICIkR0lUX0RJUi9SRU1PVEVfSEVBRCIKK30KKworIyBSZWFkIGdpdC1mZXRjaC1wYWNrIC1rIG91dHB1dCBhbmQgc3RvcmUgdGhlIHJlbW90ZSBicmFuY2hlcy4KK2NvcHlfcmVmcz0nCit1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGgpOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3KGRpcm5hbWUpOworbXkgJGdpdF9kaXIgPSAkQVJHVlswXTsKK215ICR1c2Vfc2VwYXJhdGVfcmVtb3RlID0gJEFSR1ZbMV07CitteSAkb3JpZ2luID0gJEFSR1ZbMl07CisKK215ICRicmFuY2hfdG9wID0gKCR1c2Vfc2VwYXJhdGVfcmVtb3RlID8gInJlbW90ZXMvJG9yaWdpbiIgOiAiaGVhZHMiKTsKK215ICR0YWdfdG9wID0gInRhZ3MiOworCitzdWIgc3RvcmUgeworCW15ICgkc2hhMSwgJG5hbWUsICR0b3ApID0gQF87CisJJG5hbWUgPSAiJGdpdF9kaXIvcmVmcy8kdG9wLyRuYW1lIjsKKwlta3BhdGgoZGlybmFtZSgkbmFtZSkpOworCW9wZW4gTywgIj4iLCAiJG5hbWUiOworCXByaW50IE8gIiRzaGExXG4iOworCWNsb3NlIE87Cit9CisKK29wZW4gRkgsICI8IiwgIiRnaXRfZGlyL0NMT05FX0hFQUQiOword2hpbGUgKDxGSD4pIHsKKwlteSAoJHNoYTEsICRuYW1lKSA9IC9eKFswLTlhLWZdezQwfSlccyguKikkLzsKKwluZXh0IGlmICgkbmFtZSA9fiAvXF5cMTczLyk7CisJaWYgKCRuYW1lIGVxICJIRUFEIikgeworCQlvcGVuIE8sICI+IiwgIiRnaXRfZGlyL1JFTU9URV9IRUFEIjsKKwkJcHJpbnQgTyAiJHNoYTFcbiI7CisJCWNsb3NlIE87CisJCW5leHQ7CisJfQorCWlmICgkbmFtZSA9fiBzL15yZWZzXC9oZWFkc1wvLy8pIHsKKwkJc3RvcmUoJHNoYTEsICRuYW1lLCAkYnJhbmNoX3RvcCk7CisJCW5leHQ7CisJfQorCWlmICgkbmFtZSA9fiBzL15yZWZzXC90YWdzXC8vLykgeworCQlzdG9yZSgkc2hhMSwgJG5hbWUsICR0YWdfdG9wKTsKKwkJbmV4dDsKKwl9Cit9CitjbG9zZSBGSDsKKycKKworcXVpZXQ9Citsb2NhbD1ubwordXNlX2xvY2FsPW5vCitsb2NhbF9zaGFyZWQ9bm8KK3Vuc2V0IHRlbXBsYXRlCitub19jaGVja291dD0KK3VwbG9hZF9wYWNrPQorYmFyZT0KK3JlZmVyZW5jZT0KK29yaWdpbj0KK29yaWdpbl9vdmVycmlkZT0KK3VzZV9zZXBhcmF0ZV9yZW1vdGU9Cit3aGlsZQorCWNhc2UgIiQjLCQxIiBpbgorCTAsKikgYnJlYWsgOzsKKwkqLC1ufCosLS1ub3wqLC0tbm8tfCosLS1uby1jfCosLS1uby1jaHwqLC0tbm8tY2hlfCosLS1uby1jaGVjfFwKKwkqLC0tbm8tY2hlY2t8KiwtLW5vLWNoZWNrb3wqLC0tbm8tY2hlY2tvdXwqLC0tbm8tY2hlY2tvdXQpCisJICBub19jaGVja291dD15ZXMgOzsKKwkqLC0tbmF8KiwtLW5ha3wqLC0tbmFrZXwqLC0tbmFrZWR8XAorCSosLWJ8KiwtLWJ8KiwtLWJhfCosLS1iYXJ8KiwtLWJhcmUpIGJhcmU9eWVzIDs7CisJKiwtbHwqLC0tbHwqLC0tbG98KiwtLWxvY3wqLC0tbG9jYXwqLC0tbG9jYWwpIHVzZV9sb2NhbD15ZXMgOzsKKyAgICAgICAgKiwtc3wqLC0tc3wqLC0tc2h8KiwtLXNoYXwqLC0tc2hhcnwqLC0tc2hhcmV8KiwtLXNoYXJlZCkgCisgICAgICAgICAgbG9jYWxfc2hhcmVkPXllczsgdXNlX2xvY2FsPXllcyA7OworCTEsLS10ZW1wbGF0ZSkgdXNhZ2UgOzsKKwkqLC0tdGVtcGxhdGUpCisJCXNoaWZ0OyB0ZW1wbGF0ZT0iLS10ZW1wbGF0ZT0kMSIgOzsKKwkqLC0tdGVtcGxhdGU9KikKKwkgIHRlbXBsYXRlPSIkMSIgOzsKKwkqLC1xfCosLS1xdWlldCkgcXVpZXQ9LXEgOzsKKwkqLC0tdXNlLXNlcGFyYXRlLXJlbW90ZSkKKwkJdXNlX3NlcGFyYXRlX3JlbW90ZT10IDs7CisJMSwtLXJlZmVyZW5jZSkgdXNhZ2UgOzsKKwkqLC0tcmVmZXJlbmNlKQorCQlzaGlmdDsgcmVmZXJlbmNlPSIkMSIgOzsKKwkqLC0tcmVmZXJlbmNlPSopCisJCXJlZmVyZW5jZT1gZXhwciAieiQxIiA6ICd6LS1yZWZlcmVuY2U9XCguKlwpJ2AgOzsKKwkqLC1vfCosLS1vcnwqLC0tb3JpfCosLS1vcmlnfCosLS1vcmlnaXwqLC0tb3JpZ2luKQorCQljYXNlICIkMiIgaW4KKwkJJycpCisJCSAgICB1c2FnZSA7OworCQkqLyopCisJCSAgICBlY2hvID4mMiAiJyQyJyBpcyBub3Qgc3VpdGFibGUgZm9yIGFuIG9yaWdpbiBuYW1lIgorCQkgICAgZXhpdCAxCisJCWVzYWMKKwkJZ2l0LWNoZWNrLXJlZi1mb3JtYXQgImhlYWRzLyQyIiB8fCB7CisJCSAgICBlY2hvID4mMiAiJyQyJyBpcyBub3Qgc3VpdGFibGUgZm9yIGEgYnJhbmNoIG5hbWUiCisJCSAgICBleGl0IDEKKwkJfQorCQl0ZXN0IC16ICIkb3JpZ2luX292ZXJyaWRlIiB8fCB7CisJCSAgICBlY2hvID4mMiAiRG8gbm90IGdpdmUgbW9yZSB0aGFuIG9uZSAtLW9yaWdpbiBvcHRpb25zLiIKKwkJICAgIGV4aXQgMQorCQl9CisJCW9yaWdpbl9vdmVycmlkZT15ZXMKKwkJb3JpZ2luPSIkMiI7IHNoaWZ0CisJCTs7CisJMSwtdXwxLC0tdXBsb2FkLXBhY2spIHVzYWdlIDs7CisJKiwtdXwqLC0tdXBsb2FkLXBhY2spCisJCXNoaWZ0CisJCXVwbG9hZF9wYWNrPSItLWV4ZWM9JDEiIDs7CisJKiwtKikgdXNhZ2UgOzsKKwkqKSBicmVhayA7OworCWVzYWMKK2RvCisJc2hpZnQKK2RvbmUKKworcmVwbz0iJDEiCitpZiB0ZXN0IC16ICIkcmVwbyIKK3RoZW4KKyAgICBlY2hvID4mMiAneW91IG11c3Qgc3BlY2lmeSBhIHJlcG9zaXRvcnkgdG8gY2xvbmUuJworICAgIGV4aXQgMQorZmkKKworIyAtLWJhcmUgaW1wbGllcyAtLW5vLWNoZWNrb3V0CitpZiB0ZXN0IHllcyA9ICIkYmFyZSIKK3RoZW4KKwlpZiB0ZXN0IHllcyA9ICIkb3JpZ2luX292ZXJyaWRlIgorCXRoZW4KKwkJZWNobyA+JjIgJy0tYmFyZSBhbmQgLS1vcmlnaW4gJG9yaWdpbiBvcHRpb25zIGFyZSBpbmNvbXBhdGlibGUuJworCQlleGl0IDEKKwlmaQorCWlmIHRlc3QgdCA9ICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIKKwl0aGVuCisJCWVjaG8gPiYyICctLWJhcmUgYW5kIC0tdXNlLXNlcGFyYXRlLXJlbW90ZSBvcHRpb25zIGFyZSBpbmNvbXBhdGlibGUuJworCQlleGl0IDEKKwlmaQorCW5vX2NoZWNrb3V0PXllcworZmkKKworaWYgdGVzdCAteiAiJG9yaWdpbiIKK3RoZW4KKwlvcmlnaW49b3JpZ2luCitmaQorCisjIFR1cm4gdGhlIHNvdXJjZSBpbnRvIGFuIGFic29sdXRlIHBhdGggaWYKKyMgaXQgaXMgbG9jYWwKK2lmIGJhc2U9JChnZXRfcmVwb19iYXNlICIkcmVwbyIpOyB0aGVuCisJcmVwbz0iJGJhc2UiCisJbG9jYWw9eWVzCitmaQorCitkaXI9IiQyIgorIyBUcnkgdXNpbmcgImh1bWFuaXNoIiBwYXJ0IG9mIHNvdXJjZSByZXBvIGlmIHVzZXIgZGlkbid0IHNwZWNpZnkgb25lCitbIC16ICIkZGlyIiBdICYmIGRpcj0kKGVjaG8gIiRyZXBvIiB8IHNlZCAtZSAnc3wvJHx8JyAtZSAnc3w6Ki8qXC5naXQkfHwnIC1lICdzfC4qWy86XXx8ZycpCitbIC1lICIkZGlyIiBdICYmIGVjaG8gIiRkaXIgYWxyZWFkeSBleGlzdHMuIiAmJiB1c2FnZQorbWtkaXIgLXAgIiRkaXIiICYmCitEPSQoY2QgIiRkaXIiICYmIHB3ZCkgJiYKK3RyYXAgJ2Vycj0kPzsgY2QgLi47IHJtIC1yZiAiJEQiOyBleGl0ICRlcnInIDAKK2Nhc2UgIiRiYXJlIiBpbgoreWVzKQorCUdJVF9ESVI9IiREIiA7OworKikKKwlHSVRfRElSPSIkRC8uZ2l0IiA7OworZXNhYyAmJiBleHBvcnQgR0lUX0RJUiAmJiBnaXQtaW5pdC1kYiAke3RlbXBsYXRlKyIkdGVtcGxhdGUifSB8fCB1c2FnZQorCitpZiB0ZXN0IC1uICIkcmVmZXJlbmNlIgordGhlbgorCWlmIHRlc3QgLWQgIiRyZWZlcmVuY2UiCisJdGhlbgorCQlpZiB0ZXN0IC1kICIkcmVmZXJlbmNlLy5naXQvb2JqZWN0cyIKKwkJdGhlbgorCQkJcmVmZXJlbmNlPSIkcmVmZXJlbmNlLy5naXQiCisJCWZpCisJCXJlZmVyZW5jZT0kKGNkICIkcmVmZXJlbmNlIiAmJiBwd2QpCisJCWVjaG8gIiRyZWZlcmVuY2Uvb2JqZWN0cyIgPiIkR0lUX0RJUi9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIKKwkJKGNkICIkcmVmZXJlbmNlIiAmJiB0YXIgY2YgLSByZWZzKSB8CisJCShjZCAiJEdJVF9ESVIvcmVmcyIgJiYKKwkJIG1rZGlyIHJlZmVyZW5jZS10bXAgJiYKKwkJIGNkIHJlZmVyZW5jZS10bXAgJiYKKwkJIHRhciB4ZiAtKQorCWVsc2UKKwkJZWNobyA+JjIgIiRyZWZlcmVuY2U6IG5vdCBhIGxvY2FsIGRpcmVjdG9yeS4iICYmIHVzYWdlCisJZmkKK2ZpCisKK3JtIC1mICIkR0lUX0RJUi9DTE9ORV9IRUFEIgorCisjIFdlIGRvIGxvY2FsIG1hZ2ljIG9ubHkgd2hlbiB0aGUgdXNlciB0ZWxscyB1cyB0by4KK2Nhc2UgIiRsb2NhbCwkdXNlX2xvY2FsIiBpbgoreWVzLHllcykKKwkoIGNkICIkcmVwby9vYmplY3RzIiApIHx8IHsKKwkJZWNobyA+JjIgIi1sIGZsYWcgc2VlbiBidXQgJHJlcG8gaXMgbm90IGxvY2FsLiIKKwkJZXhpdCAxCisJfQorCisJY2FzZSAiJGxvY2FsX3NoYXJlZCIgaW4KKwlubykKKwkgICAgIyBTZWUgaWYgd2UgY2FuIGhhcmRsaW5rIGFuZCBkcm9wICJsIiBpZiBub3QuCisJICAgIHNhbXBsZV9maWxlPSQoY2QgIiRyZXBvIiAmJiBcCisJCQkgIGZpbmQgb2JqZWN0cyAtdHlwZSBmIC1wcmludCB8IHNlZCAtZSAxcSkKKworCSAgICAjIG9iamVjdHMgZGlyZWN0b3J5IHNob3VsZCBub3QgYmUgZW1wdHkgc2luY2Ugd2UgYXJlIGNsb25pbmchCisJICAgIHRlc3QgLWYgIiRyZXBvLyRzYW1wbGVfZmlsZSIgfHwgZXhpdAorCisJICAgIGw9CisJICAgIGlmIGxuICIkcmVwby8kc2FtcGxlX2ZpbGUiICIkR0lUX0RJUi9vYmplY3RzL3NhbXBsZSIgMj4vZGV2L251bGwKKwkgICAgdGhlbgorCQkgICAgbD1sCisJICAgIGZpICYmCisJICAgIHJtIC1mICIkR0lUX0RJUi9vYmplY3RzL3NhbXBsZSIgJiYKKwkgICAgY2QgIiRyZXBvIiAmJgorCSAgICBmaW5kIG9iamVjdHMgLWRlcHRoIC1wcmludCB8IGNwaW8gLXB1bWQkbCAiJEdJVF9ESVIvIiB8fCBleGl0IDEKKwkgICAgOzsKKwl5ZXMpCisJICAgIG1rZGlyIC1wICIkR0lUX0RJUi9vYmplY3RzL2luZm8iCisJICAgIGVjaG8gIiRyZXBvL29iamVjdHMiID4+ICIkR0lUX0RJUi9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIKKwkgICAgOzsKKwllc2FjCisJZ2l0LWxzLXJlbW90ZSAiJHJlcG8iID4iJEdJVF9ESVIvQ0xPTkVfSEVBRCIgfHwgZXhpdCAxCisJOzsKKyopCisJY2FzZSAiJHJlcG8iIGluCisJcnN5bmM6Ly8qKQorCQlyc3luYyAkcXVpZXQgLWF2IC0taWdub3JlLWV4aXN0aW5nICBcCisJCQktLWV4Y2x1ZGUgaW5mbyAiJHJlcG8vb2JqZWN0cy8iICIkR0lUX0RJUi9vYmplY3RzLyIgfHwKKwkJZXhpdAorCQkjIExvb2sgYXQgb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgZm9yIHJzeW5jIC0tIGh0dHAgd2lsbAorCQkjIHN1cHBvcnQgaXQgbmF0aXZlbHkgYW5kIGdpdCBuYXRpdmUgb25lcyB3aWxsIGRvIGl0IG9uIHRoZQorCQkjIHJlbW90ZSBlbmQuICBOb3QgaGF2aW5nIHRoYXQgZmlsZSBpcyBub3QgYSBjcmltZS4KKwkJcnN5bmMgLXEgIiRyZXBvL29iamVjdHMvaW5mby9hbHRlcm5hdGVzIiBcCisJCQkiJEdJVF9ESVIvVE1QX0FMVCIgMj4vZGV2L251bGwgfHwKKwkJCXJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCQlpZiB0ZXN0IC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCQl0aGVuCisJCSAgICAoIGNkICIkRCIgJiYKKwkJICAgICAgLiBnaXQtcGFyc2UtcmVtb3RlICYmCisJCSAgICAgIHJlc29sdmVfYWx0ZXJuYXRlcyAiJHJlcG8iIDwiJEdJVF9ESVIvVE1QX0FMVCIgKSB8CisJCSAgICB3aGlsZSByZWFkIGFsdAorCQkgICAgZG8KKwkJCWNhc2UgIiRhbHQiIGluICdiYWQgYWx0ZXJuYXRlOiAnKikgZGllICIkYWx0Ijs7IGVzYWMKKwkJCWNhc2UgIiRxdWlldCIgaW4KKwkJCScnKQllY2hvID4mMiAiR2V0dGluZyBhbHRlcm5hdGU6ICRhbHQiIDs7CisJCQllc2FjCisJCQlyc3luYyAkcXVpZXQgLWF2IC0taWdub3JlLWV4aXN0aW5nICBcCisJCQkgICAgLS1leGNsdWRlIGluZm8gIiRhbHQiICIkR0lUX0RJUi9vYmplY3RzIiB8fCBleGl0CisJCSAgICBkb25lCisJCSAgICBybSAtZiAiJEdJVF9ESVIvVE1QX0FMVCIKKwkJZmkKKwkJZ2l0LWxzLXJlbW90ZSAiJHJlcG8iID4iJEdJVF9ESVIvQ0xPTkVfSEVBRCIgfHwgZXhpdCAxCisJCTs7CisJaHR0cHM6Ly8qfGh0dHA6Ly8qKQorCQlpZiB0ZXN0IC16ICJAQE5PX0NVUkxAQCIKKwkJdGhlbgorCQkJY2xvbmVfZHVtYl9odHRwICIkcmVwbyIgIiREIgorCQllbHNlCisJCQllY2hvID4mMiAiaHR0cCB0cmFuc3BvcnQgbm90IHN1cHBvcnRlZCwgcmVidWlsZCBHaXQgd2l0aCBjdXJsIHN1cHBvcnQiCisJCQlleGl0IDEKKwkJZmkKKwkJOzsKKwkqKQorCQljZCAiJEQiICYmIGNhc2UgIiR1cGxvYWRfcGFjayIgaW4KKwkJJycpIGdpdC1mZXRjaC1wYWNrIC0tYWxsIC1rICRxdWlldCAiJHJlcG8iIDs7CisJCSopIGdpdC1mZXRjaC1wYWNrIC0tYWxsIC1rICRxdWlldCAiJHVwbG9hZF9wYWNrIiAiJHJlcG8iIDs7CisJCWVzYWMgPiIkR0lUX0RJUi9DTE9ORV9IRUFEIiB8fCB7CisJCQllY2hvID4mMiAiZmV0Y2gtcGFjayBmcm9tICckcmVwbycgZmFpbGVkLiIKKwkJCWV4aXQgMQorCQl9CisJCTs7CisJZXNhYworCTs7Citlc2FjCit0ZXN0IC1kICIkR0lUX0RJUi9yZWZzL3JlZmVyZW5jZS10bXAiICYmIHJtIC1mciAiJEdJVF9ESVIvcmVmcy9yZWZlcmVuY2UtdG1wIgorCitpZiB0ZXN0IC1mICIkR0lUX0RJUi9DTE9ORV9IRUFEIgordGhlbgorCSMgUmVhZCBnaXQtZmV0Y2gtcGFjayAtayBvdXRwdXQgYW5kIHN0b3JlIHRoZSByZW1vdGUgYnJhbmNoZXMuCisJQEBQRVJMQEAgLWUgIiRjb3B5X3JlZnMiICIkR0lUX0RJUiIgIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiAiJG9yaWdpbiIgfHwKKwlleGl0CitmaQorCitjZCAiJEQiIHx8IGV4aXQKKworaWYgdGVzdCAteiAiJGJhcmUiICYmIHRlc3QgLWYgIiRHSVRfRElSL1JFTU9URV9IRUFEIgordGhlbgorCSMgRmlndXJlIG91dCB3aGljaCByZW1vdGUgYnJhbmNoIEhFQUQgcG9pbnRzIGF0LgorCWNhc2UgIiR1c2Vfc2VwYXJhdGVfcmVtb3RlIiBpbgorCScnKQlyZW1vdGVfdG9wPXJlZnMvaGVhZHMgOzsKKwkqKQlyZW1vdGVfdG9wPSJyZWZzL3JlbW90ZXMvJG9yaWdpbiIgOzsKKwllc2FjCisKKwloZWFkX3NoYTE9YGNhdCAiJEdJVF9ESVIvUkVNT1RFX0hFQUQiYAorCWNhc2UgIiRoZWFkX3NoYTEiIGluCisJJ3JlZjogcmVmcy8nKikKKwkJIyBVaC1vaCwgdGhlIHJlbW90ZSB0b2xkIHVzIChodHRwIHRyYW5zcG9ydCBkb25lIGFnYWluc3QKKwkJIyBuZXcgc3R5bGUgcmVwb3NpdG9yeSB3aXRoIGEgc3ltcmVmIEhFQUQpLgorCQkjIElkZWFsbHkgd2Ugc2hvdWxkIHNraXAgdGhlIGd1ZXNzd29yayBidXQgZm9yIG5vdworCQkjIG9wdCBmb3IgbWluaW11bSBjaGFuZ2UuCisJCWhlYWRfc2hhMT1gZXhwciAieiRoZWFkX3NoYTEiIDogJ3pyZWY6IHJlZnMvaGVhZHMvXCguKlwpJ2AKKwkJaGVhZF9zaGExPWBjYXQgIiRHSVRfRElSLyRyZW1vdGVfdG9wLyRoZWFkX3NoYTEiYAorCQk7OworCWVzYWMKKworCSMgVGhlIG5hbWUgdW5kZXIgJHJlbW90ZV90b3AgdGhlIHJlbW90ZSBIRUFEIHNlZW1zIHRvIHBvaW50IGF0LgorCWhlYWRfcG9pbnRzX2F0PSQoCisJCSgKKwkJCWVjaG8gIm1hc3RlciIKKwkJCWNkICIkR0lUX0RJUi8kcmVtb3RlX3RvcCIgJiYKKwkJCWZpbmQgLiAtdHlwZSBmIC1wcmludCB8IHNlZCAtZSAncy9eXC5cLy8vJworCQkpIHwgKAorCQlkb25lPWYKKwkJd2hpbGUgcmVhZCBuYW1lCisJCWRvCisJCQl0ZXN0IHQgPSAkZG9uZSAmJiBjb250aW51ZQorCQkJYnJhbmNoX3RpcD1gY2F0ICIkR0lUX0RJUi8kcmVtb3RlX3RvcC8kbmFtZSJgCisJCQlpZiB0ZXN0ICIkaGVhZF9zaGExIiA9ICIkYnJhbmNoX3RpcCIKKwkJCXRoZW4KKwkJCQllY2hvICIkbmFtZSIKKwkJCQlkb25lPXQKKwkJCWZpCisJCWRvbmUKKwkJKQorCSkKKworCSMgV3JpdGUgb3V0IHJlbW90ZXMvJG9yaWdpbiBmaWxlLCBhbmQgdXBkYXRlIG91ciAiJGhlYWRfcG9pbnRzX2F0Ii4KKwljYXNlICIkaGVhZF9wb2ludHNfYXQiIGluCisJPyopCisJCW1rZGlyIC1wICIkR0lUX0RJUi9yZW1vdGVzIiAmJgorCQlnaXQtc3ltYm9saWMtcmVmIEhFQUQgInJlZnMvaGVhZHMvJGhlYWRfcG9pbnRzX2F0IiAmJgorCQljYXNlICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIgaW4KKwkJdCkJb3JpZ2luX3RyYWNrPSIkcmVtb3RlX3RvcC8kaGVhZF9wb2ludHNfYXQiCisJCQlnaXQtdXBkYXRlLXJlZiBIRUFEICIkaGVhZF9zaGExIiA7OworCQkqKQlvcmlnaW5fdHJhY2s9IiRyZW1vdGVfdG9wLyRvcmlnaW4iCisJCQlnaXQtdXBkYXRlLXJlZiAicmVmcy9oZWFkcy8kb3JpZ2luIiAiJGhlYWRfc2hhMSIgOzsKKwkJZXNhYyAmJgorCQllY2hvID4iJEdJVF9ESVIvcmVtb3Rlcy8kb3JpZ2luIiBcCisJCSJVUkw6ICRyZXBvCitQdWxsOiByZWZzL2hlYWRzLyRoZWFkX3BvaW50c19hdDokb3JpZ2luX3RyYWNrIiAmJgorCQkoY2QgIiRHSVRfRElSLyRyZW1vdGVfdG9wIiAmJiBmaW5kIC4gLXR5cGUgZiAtcHJpbnQpIHwKKwkJd2hpbGUgcmVhZCBkb3RzbHJlZgorCQlkbworCQkJbmFtZT1gZXhwciAiJGRvdHNscmVmIiA6ICcuL1woLipcKSdgCisJCQlpZiB0ZXN0ICJ6JGhlYWRfcG9pbnRzX2F0IiA9ICJ6JG5hbWUiCisJCQl0aGVuCisJCQkJY29udGludWUKKwkJCWZpCisJCQlpZiB0ZXN0ICIkdXNlX3NlcGFyYXRlX3JlbW90ZSIgPSAnJyAmJgorCQkJICAgdGVzdCAieiRvcmlnaW4iID0gInokbmFtZSIKKwkJCXRoZW4KKwkJCQljb250aW51ZQorCQkJZmkKKwkJCWVjaG8gIlB1bGw6IHJlZnMvaGVhZHMvJHtuYW1lfTokcmVtb3RlX3RvcC8ke25hbWV9IgorCQlkb25lID4+IiRHSVRfRElSL3JlbW90ZXMvJG9yaWdpbiIgJiYKKwkJY2FzZSAiJHVzZV9zZXBhcmF0ZV9yZW1vdGUiIGluCisJCXQpCisJCQlybSAtZiAicmVmcy9yZW1vdGVzLyRvcmlnaW4vSEVBRCIKKwkJCWdpdC1zeW1ib2xpYy1yZWYgInJlZnMvcmVtb3Rlcy8kb3JpZ2luL0hFQUQiIFwKKwkJCQkicmVmcy9yZW1vdGVzLyRvcmlnaW4vJGhlYWRfcG9pbnRzX2F0IgorCQllc2FjCisJZXNhYworCisJY2FzZSAiJG5vX2NoZWNrb3V0IiBpbgorCScnKQorCQlnaXQtcmVhZC10cmVlIC1tIC11IC12IEhFQUQgSEVBRAorCWVzYWMKK2ZpCitybSAtZiAiJEdJVF9ESVIvQ0xPTkVfSEVBRCIgIiRHSVRfRElSL1JFTU9URV9IRUFEIgorCit0cmFwIC0gMAorCmRpZmYgLS1naXQgYS9naXQtY29tbWl0LnNoIGIvZ2l0LWNvbW1pdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40Y2YzZmFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWNvbW1pdC5zaApAQCAtMCwwICsxLDc0OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKworVVNBR0U9J1stYV0gWy1zXSBbLXZdIFstLW5vLXZlcmlmeV0gWy1tIDxtZXNzYWdlPiB8IC1GIDxsb2dmaWxlPiB8ICgtQ3wtYykgPGNvbW1pdD5dIFstdV0gWy0tYW1lbmRdIFstZV0gWy0tYXV0aG9yIDxhdXRob3I+XSBbWy1pIHwgLW9dIDxwYXRoPi4uLl0nCitTVUJESVJFQ1RPUllfT0s9WWVzCisuIGdpdC1zaC1zZXR1cAorCitnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgPi9kZXYvbnVsbCAyPiYxIHx8IGluaXRpYWxfY29tbWl0PXQKK2JyYW5jaD0kKEdJVF9ESVI9IiRHSVRfRElSIiBnaXQtc3ltYm9saWMtcmVmIEhFQUQpCisKK2Nhc2UgIiQwIiBpbgorKnN0YXR1cykKKwlzdGF0dXNfb25seT10CisJdW5tZXJnZWRfb2tfaWZfc3RhdHVzPS0tdW5tZXJnZWQgOzsKKypjb21taXQpCisJc3RhdHVzX29ubHk9CisJdW5tZXJnZWRfb2tfaWZfc3RhdHVzPSA7OworZXNhYworCityZWZ1c2VfcGFydGlhbCAoKSB7CisJZWNobyA+JjIgIiQxIgorCWVjaG8gPiYyICJZb3UgbWlnaHQgaGF2ZSBtZWFudCB0byBzYXkgJ2dpdCBjb21taXQgLWkgcGF0aHMuLi4nLCBwZXJoYXBzPyIKKwlleGl0IDEKK30KKworVEhJU19JTkRFWD0iJEdJVF9ESVIvaW5kZXgiCitORVhUX0lOREVYPSIkR0lUX0RJUi9uZXh0LWluZGV4JCQiCitybSAtZiAiJE5FWFRfSU5ERVgiCitzYXZlX2luZGV4ICgpIHsKKwljcCAtcCAiJFRISVNfSU5ERVgiICIkTkVYVF9JTkRFWCIKK30KKworcmVwb3J0ICgpIHsKKyAgaGVhZGVyPSIjCisjICQxOgorIyAgICgkMikKKyMKKyIKKyAgdHJhaWxlcj0iIgorICB3aGlsZSByZWFkIHN0YXR1cyBuYW1lIG5ld25hbWUKKyAgZG8KKyAgICBwcmludGYgJyVzJyAiJGhlYWRlciIKKyAgICBoZWFkZXI9IiIKKyAgICB0cmFpbGVyPSIjCisiCisgICAgY2FzZSAiJHN0YXR1cyIgaW4KKyAgICBNICkgZWNobyAiIwltb2RpZmllZDogJG5hbWUiOzsKKyAgICBEKikgZWNobyAiIwlkZWxldGVkOiAgJG5hbWUiOzsKKyAgICBUICkgZWNobyAiIwl0eXBlY2hhbmdlOiAkbmFtZSI7OworICAgIEMqKSBlY2hvICIjCWNvcGllZDogJG5hbWUgLT4gJG5ld25hbWUiOzsKKyAgICBSKikgZWNobyAiIwlyZW5hbWVkOiAkbmFtZSAtPiAkbmV3bmFtZSI7OworICAgIEEqKSBlY2hvICIjCW5ldyBmaWxlOiAkbmFtZSI7OworICAgIFUgKSBlY2hvICIjCXVubWVyZ2VkOiAkbmFtZSI7OworICAgIGVzYWMKKyAgZG9uZQorICBwcmludGYgJyVzJyAiJHRyYWlsZXIiCisgIFsgIiRoZWFkZXIiIF0KK30KKworcnVuX3N0YXR1cyAoKSB7CisgICAgKAorCSMgV2UgYWx3YXlzIHNob3cgc3RhdHVzIGZvciB0aGUgd2hvbGUgdHJlZS4KKwljZCAiJFRPUCIKKworCUlTX0lOSVRJQUw9IiRpbml0aWFsX2NvbW1pdCIKKwlSRUZFUkVOQ0U9SEVBRAorCWNhc2UgIiRhbWVuZCIgaW4KKwl0KQorCQkjIElmIHdlIGFyZSBhbWVuZGluZyB0aGUgaW5pdGlhbCBjb21taXQsIHRoZXJlCisJCSMgaXMgbm8gSEVBRF4xLgorCQlpZiBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJIRUFEXjEiID4vZGV2L251bGwgMj4mMQorCQl0aGVuCisJCQlSRUZFUkVOQ0U9IkhFQUReMSIKKwkJCUlTX0lOSVRJQUw9CisJCWVsc2UKKwkJCUlTX0lOSVRJQUw9dAorCQlmaQorCQk7OworCWVzYWMKKworCSMgSWYgVE1QX0lOREVYIGlzIGRlZmluZWQsIHRoYXQgbWVhbnMgd2UgYXJlIGRvaW5nCisJIyAiLS1vbmx5IiBwYXJ0aWFsIGNvbW1pdCwgYW5kIHRoYXQgaW5kZXggZmlsZSBpcyB1c2VkCisJIyB0byBidWlsZCB0aGUgdHJlZSBmb3IgdGhlIGNvbW1pdC4gIE90aGVyd2lzZSwgaWYKKwkjIE5FWFRfSU5ERVggZXhpc3RzLCB0aGF0IGlzIHRoZSBpbmRleCBmaWxlIHVzZWQgdG8KKwkjIG1ha2UgdGhlIGNvbW1pdC4gIE90aGVyd2lzZSB3ZSBhcmUgdXNpbmcgYXMtaXMgY29tbWl0CisJIyBzbyB0aGUgcmVndWxhciBpbmRleCBmaWxlIGlzIHdoYXQgd2UgdXNlIHRvIGNvbXBhcmUuCisJaWYgdGVzdCAnJyAhPSAiJFRNUF9JTkRFWCIKKwl0aGVuCisJICAgIEdJVF9JTkRFWF9GSUxFPSIkVE1QX0lOREVYIgorCSAgICBleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwllbGlmIHRlc3QgLWYgIiRORVhUX0lOREVYIgorCXRoZW4KKwkgICAgR0lUX0lOREVYX0ZJTEU9IiRORVhUX0lOREVYIgorCSAgICBleHBvcnQgR0lUX0lOREVYX0ZJTEUKKwlmaQorCisJY2FzZSAiJGJyYW5jaCIgaW4KKwlyZWZzL2hlYWRzL21hc3RlcikgOzsKKwkqKSAgZWNobyAiIyBPbiBicmFuY2ggJGJyYW5jaCIgOzsKKwllc2FjCisKKwlpZiB0ZXN0IC16ICIkSVNfSU5JVElBTCIKKwl0aGVuCisJICAgIGdpdC1kaWZmLWluZGV4IC1NIC0tY2FjaGVkIC0tbmFtZS1zdGF0dXMgXAorCQktLWRpZmYtZmlsdGVyPU1EVENSQSAkUkVGRVJFTkNFIHwKKwkgICAgc2VkIC1lICcKKwkJICAgIHMvXFwvXFxcXC9nCisJCSAgICBzLyAvXFwgL2cKKwkgICAgJyB8CisJICAgIHJlcG9ydCAiVXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iICJ3aWxsIGNvbW1pdCIKKwkgICAgY29tbWl0dGFibGU9IiQ/IgorCWVsc2UKKwkgICAgZWNobyAnIworIyBJbml0aWFsIGNvbW1pdAorIycKKwkgICAgZ2l0LWxzLWZpbGVzIHwKKwkgICAgc2VkIC1lICcKKwkJICAgIHMvXFwvXFxcXC9nCisJCSAgICBzLyAvXFwgL2cKKwkJICAgIHMvXi9BIC8KKwkgICAgJyB8CisJICAgIHJlcG9ydCAiVXBkYXRlZCBidXQgbm90IGNoZWNrZWQgaW4iICJ3aWxsIGNvbW1pdCIKKworCSAgICBjb21taXR0YWJsZT0iJD8iCisJZmkKKworCWdpdC1kaWZmLWZpbGVzICAtLW5hbWUtc3RhdHVzIHwKKwlzZWQgLWUgJworCQlzL1xcL1xcXFwvZworCQlzLyAvXFwgL2cKKwknIHwKKwlyZXBvcnQgIkNoYW5nZWQgYnV0IG5vdCB1cGRhdGVkIiBcCisJICAgICJ1c2UgZ2l0LXVwZGF0ZS1pbmRleCB0byBtYXJrIGZvciBjb21taXQiCisKKyAgICAgICAgb3B0aW9uPSIiCisgICAgICAgIGlmIHRlc3QgLXogIiR1bnRyYWNrZWRfZmlsZXMiOyB0aGVuCisgICAgICAgICAgICBvcHRpb249Ii0tZGlyZWN0b3J5IC0tbm8tZW1wdHktZGlyZWN0b3J5IgorICAgICAgICBmaQorCWhkcl9zaG93bj0KKwlpZiB0ZXN0IC1mICIkR0lUX0RJUi9pbmZvL2V4Y2x1ZGUiCisJdGhlbgorCSAgICBnaXQtbHMtZmlsZXMgLS1vdGhlcnMgJG9wdGlvbiBcCisJCS0tZXhjbHVkZS1mcm9tPSIkR0lUX0RJUi9pbmZvL2V4Y2x1ZGUiIFwKKwkJLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZQorCWVsc2UKKwkgICAgZ2l0LWxzLWZpbGVzIC0tb3RoZXJzICRvcHRpb24gXAorCQktLWV4Y2x1ZGUtcGVyLWRpcmVjdG9yeT0uZ2l0aWdub3JlCisJZmkgfAorCXdoaWxlIHJlYWQgbGluZTsgZG8KKwkgICAgaWYgWyAteiAiJGhkcl9zaG93biIgXTsgdGhlbgorCQllY2hvICcjJworCQllY2hvICcjIFVudHJhY2tlZCBmaWxlczonCisJCWVjaG8gJyMgICAodXNlICJnaXQgYWRkIiB0byBhZGQgdG8gY29tbWl0KScKKwkJZWNobyAnIycKKwkJaGRyX3Nob3duPTEKKwkgICAgZmkKKwkgICAgZWNobyAiIwkkbGluZSIKKwlkb25lCisKKwlpZiB0ZXN0IC1uICIkdmVyYm9zZSIgLWEgLXogIiRJU19JTklUSUFMIgorCXRoZW4KKwkgICAgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLU0gLXAgLS1kaWZmLWZpbHRlcj1NRFRDUkEgJFJFRkVSRU5DRQorCWZpCisJY2FzZSAiJGNvbW1pdHRhYmxlIiBpbgorCTApCisJCWNhc2UgIiRhbWVuZCIgaW4KKwkJdCkKKwkJCWVjaG8gIiMgTm8gY2hhbmdlcyIgOzsKKwkJKikKKwkJCWVjaG8gIm5vdGhpbmcgdG8gY29tbWl0IiA7OworCQllc2FjCisJCWV4aXQgMSA7OworCWVzYWMKKwlleGl0IDAKKyAgICApCit9CisKK3RyYXAgJworCXRlc3QgLXogIiRUTVBfSU5ERVgiIHx8IHsKKwkJdGVzdCAtZiAiJFRNUF9JTkRFWCIgJiYgcm0gLWYgIiRUTVBfSU5ERVgiCisJfQorCXJtIC1mICIkTkVYVF9JTkRFWCIKKycgMAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbW1hbmQgbGluZSBhcmd1bWVudCBwYXJzaW5nIGFuZCBzYW5pdHkgY2hlY2tpbmcKKworYWxsPQorYWxzbz0KK29ubHk9Citsb2dmaWxlPQordXNlX2NvbW1pdD0KK2FtZW5kPQorZWRpdF9mbGFnPQorbm9fZWRpdD0KK2xvZ19naXZlbj0KK2xvZ19tZXNzYWdlPQordmVyaWZ5PXQKK3ZlcmJvc2U9CitzaWdub2ZmPQorZm9yY2VfYXV0aG9yPQorb25seV9pbmNsdWRlX2Fzc3VtZWQ9Cit1bnRyYWNrZWRfZmlsZXM9Cit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWs7OyBlc2FjCitkbworICBjYXNlICIkMSIgaW4KKyAgLUZ8LS1GfC1mfC0tZnwtLWZpfC0tZmlsfC0tZmlsZSkKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgbm9fZWRpdD10CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIGxvZ2ZpbGU9IiQxIgorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1GKnwtZiopCisgICAgICBub19lZGl0PXQKKyAgICAgIGxvZ19naXZlbj10JGxvZ19naXZlbgorICAgICAgbG9nZmlsZT1gZXhwciAieiQxIiA6ICd6LVtGZl1cKC4qXCknYAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC0tRj0qfC0tZj0qfC0tZmk9KnwtLWZpbD0qfC0tZmlsZT0qKQorICAgICAgbm9fZWRpdD10CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIGxvZ2ZpbGU9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1hfC0tYXwtLWFsfC0tYWxsKQorICAgICAgYWxsPXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLWF1PSp8LS1hdXQ9KnwtLWF1dGg9KnwtLWF1dGhvPSp8LS1hdXRob3I9KikKKyAgICAgIGZvcmNlX2F1dGhvcj1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgCisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLS1hdXwtLWF1dHwtLWF1dGh8LS1hdXRob3wtLWF1dGhvcikKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgZm9yY2VfYXV0aG9yPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtZXwtLWV8LS1lZHwtLWVkaXwtLWVkaXQpCisgICAgICBlZGl0X2ZsYWc9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1pfC0taXwtLWlufC0taW5jfC0taW5jbHwtLWluY2x1fC0taW5jbHVkfC0taW5jbHVkZSkKKyAgICAgIGFsc289dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1vfC0tb3wtLW9ufC0tb25sfC0tb25seSkKKyAgICAgIG9ubHk9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1tfC0tbXwtLW1lfC0tbWVzfC0tbWVzc3wtLW1lc3NhfC0tbWVzc2FnfC0tbWVzc2FnZSkKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgbG9nX2dpdmVuPW0kbG9nX2dpdmVuCisgICAgICBpZiB0ZXN0ICIkbG9nX21lc3NhZ2UiID0gJycKKyAgICAgIHRoZW4KKyAgICAgICAgICBsb2dfbWVzc2FnZT0iJDEiCisgICAgICBlbHNlCisgICAgICAgICAgbG9nX21lc3NhZ2U9IiRsb2dfbWVzc2FnZQorCiskMSIKKyAgICAgIGZpCisgICAgICBub19lZGl0PXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtbSopCisgICAgICBsb2dfZ2l2ZW49bSRsb2dfZ2l2ZW4KKyAgICAgIGlmIHRlc3QgIiRsb2dfbWVzc2FnZSIgPSAnJworICAgICAgdGhlbgorICAgICAgICAgIGxvZ19tZXNzYWdlPWBleHByICJ6JDEiIDogJ3otbVwoLipcKSdgCisgICAgICBlbHNlCisgICAgICAgICAgbG9nX21lc3NhZ2U9IiRsb2dfbWVzc2FnZQorCitgZXhwciAieiQxIiA6ICd6LW1cKC4qXCknYCIKKyAgICAgIGZpCisgICAgICBub19lZGl0PXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLW09KnwtLW1lPSp8LS1tZXM9KnwtLW1lc3M9KnwtLW1lc3NhPSp8LS1tZXNzYWc9KnwtLW1lc3NhZ2U9KikKKyAgICAgIGxvZ19naXZlbj1tJGxvZ19naXZlbgorICAgICAgaWYgdGVzdCAiJGxvZ19tZXNzYWdlIiA9ICcnCisgICAgICB0aGVuCisgICAgICAgICAgbG9nX21lc3NhZ2U9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYAorICAgICAgZWxzZQorICAgICAgICAgIGxvZ19tZXNzYWdlPSIkbG9nX21lc3NhZ2UKKworYGV4cHIgInokMSIgOiAnenEtW149XSo9XCguKlwpJ2AiCisgICAgICBmaQorICAgICAgbm9fZWRpdD10CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLW58LS1ufC0tbm98LS1uby18LS1uby12fC0tbm8tdmV8LS1uby12ZXJ8LS1uby12ZXJpfC0tbm8tdmVyaWZ8LS1uby12ZXJpZnkpCisgICAgICB2ZXJpZnk9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLS1hfC0tYW18LS1hbWV8LS1hbWVufC0tYW1lbmQpCisgICAgICBhbWVuZD10CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9SEVBRAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC1jKQorICAgICAgY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKyAgICAgIHNoaWZ0CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9IiQxIgorICAgICAgbm9fZWRpdD0KKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLXJlZT0qfC0tcmVlZD0qfC0tcmVlZGk9KnwtLXJlZWRpdD0qfC0tcmVlZGl0LT0qfC0tcmVlZGl0LW09KnxcCisgIC0tcmVlZGl0LW1lPSp8LS1yZWVkaXQtbWVzPSp8LS1yZWVkaXQtbWVzcz0qfC0tcmVlZGl0LW1lc3NhPSp8XAorICAtLXJlZWRpdC1tZXNzYWc9KnwtLXJlZWRpdC1tZXNzYWdlPSopCisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYAorICAgICAgbm9fZWRpdD0KKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLXJlZXwtLXJlZWR8LS1yZWVkaXwtLXJlZWRpdHwtLXJlZWRpdC18LS1yZWVkaXQtbXwtLXJlZWRpdC1tZXxcCisgIC0tcmVlZGl0LW1lc3wtLXJlZWRpdC1tZXNzfC0tcmVlZGl0LW1lc3NhfC0tcmVlZGl0LW1lc3NhZ3wtLXJlZWRpdC1tZXNzYWdlKQorICAgICAgY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKyAgICAgIHNoaWZ0CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9IiQxIgorICAgICAgbm9fZWRpdD0KKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtQykKKyAgICAgIGNhc2UgIiQjIiBpbiAxKSB1c2FnZSA7OyBlc2FjCisgICAgICBzaGlmdAorICAgICAgbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisgICAgICB1c2VfY29tbWl0PSIkMSIKKyAgICAgIG5vX2VkaXQ9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC0tcmV1PSp8LS1yZXVzPSp8LS1yZXVzZT0qfC0tcmV1c2UtPSp8LS1yZXVzZS1tPSp8LS1yZXVzZS1tZT0qfFwKKyAgLS1yZXVzZS1tZXM9KnwtLXJldXNlLW1lc3M9KnwtLXJldXNlLW1lc3NhPSp8LS1yZXVzZS1tZXNzYWc9KnxcCisgIC0tcmV1c2UtbWVzc2FnZT0qKQorICAgICAgbG9nX2dpdmVuPXQkbG9nX2dpdmVuCisgICAgICB1c2VfY29tbWl0PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AKKyAgICAgIG5vX2VkaXQ9dAorICAgICAgc2hpZnQKKyAgICAgIDs7CisgIC0tcmV1fC0tcmV1c3wtLXJldXNlfC0tcmV1c2UtfC0tcmV1c2UtbXwtLXJldXNlLW1lfC0tcmV1c2UtbWVzfFwKKyAgLS1yZXVzZS1tZXNzfC0tcmV1c2UtbWVzc2F8LS1yZXVzZS1tZXNzYWd8LS1yZXVzZS1tZXNzYWdlKQorICAgICAgY2FzZSAiJCMiIGluIDEpIHVzYWdlIDs7IGVzYWMKKyAgICAgIHNoaWZ0CisgICAgICBsb2dfZ2l2ZW49dCRsb2dfZ2l2ZW4KKyAgICAgIHVzZV9jb21taXQ9IiQxIgorICAgICAgbm9fZWRpdD10CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLXN8LS1zfC0tc2l8LS1zaWd8LS1zaWdufC0tc2lnbm98LS1zaWdub2Z8LS1zaWdub2ZmKQorICAgICAgc2lnbm9mZj10CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLXZ8LS12fC0tdmV8LS12ZXJ8LS12ZXJifC0tdmVyYm98LS12ZXJib3N8LS12ZXJib3NlKQorICAgICAgdmVyYm9zZT10CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgLXV8LS11fC0tdW58LS11bnR8LS11bnRyfC0tdW50cmF8LS11bnRyYWN8LS11bnRyYWNrfC0tdW50cmFja2V8LS11bnRyYWNrZWR8XAorICAtLXVudHJhY2tlZC18LS11bnRyYWNrZWQtZnwtLXVudHJhY2tlZC1maXwtLXVudHJhY2tlZC1maWx8LS11bnRyYWNrZWQtZmlsZXxcCisgIC0tdW50cmFja2VkLWZpbGVzKQorICAgICAgdW50cmFja2VkX2ZpbGVzPXQKKyAgICAgIHNoaWZ0CisgICAgICA7OworICAtLSkKKyAgICAgIHNoaWZ0CisgICAgICBicmVhaworICAgICAgOzsKKyAgLSopCisgICAgICB1c2FnZQorICAgICAgOzsKKyAgKikKKyAgICAgIGJyZWFrCisgICAgICA7OworICBlc2FjCitkb25lCitjYXNlICIkZWRpdF9mbGFnIiBpbiB0KSBub19lZGl0PSA7OyBlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU2FuaXR5IGNoZWNrIG9wdGlvbnMKKworY2FzZSAiJGFtZW5kLCRpbml0aWFsX2NvbW1pdCIgaW4KK3QsdCkKKyAgZGllICJZb3UgZG8gbm90IGhhdmUgYW55dGhpbmcgdG8gYW1lbmQuIiA7OwordCwpCisgIGlmIFsgLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiIF07IHRoZW4KKyAgICBkaWUgIllvdSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIG1lcmdlIC0tIGNhbm5vdCBhbWVuZC4iCisgIGZpIDs7Citlc2FjCisKK2Nhc2UgIiRsb2dfZ2l2ZW4iIGluCit0dCopCisgIGRpZSAiT25seSBvbmUgb2YgLWMvLUMvLUYgY2FuIGJlIHVzZWQuIiA7OworKnRtKnwqbXQqKQorICBkaWUgIk9wdGlvbiAtbSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtYy8tQy8tRi4iIDs7Citlc2FjCisKK2Nhc2UgIiQjLCRhbHNvLCRvbmx5LCRhbWVuZCIgaW4KKyosdCx0LCopCisgIGRpZSAiT25seSBvbmUgb2YgLS1pbmNsdWRlLy0tb25seSBjYW4gYmUgdXNlZC4iIDs7CiswLHQsLCogfCAwLCx0LCkKKyAgZGllICJObyBwYXRocyB3aXRoIC0taW5jbHVkZS8tLW9ubHkgZG9lcyBub3QgbWFrZSBzZW5zZS4iIDs7CiswLCx0LHQpCisgIG9ubHlfaW5jbHVkZV9hc3N1bWVkPSIjIENsZXZlci4uLiBhbWVuZGluZyB0aGUgbGFzdCBvbmUgd2l0aCBkaXJ0eSBpbmRleC4iIDs7CiswLCwsKikKKyAgOzsKKyosLCwqKQorICBvbmx5X2luY2x1ZGVfYXNzdW1lZD0iIyBFeHBsaWNpdCBwYXRocyBzcGVjaWZpZWQgd2l0aG91dCAtaSBub3IgLW87IGFzc3VtaW5nIC0tb25seSBwYXRocy4uLiIKKyAgYWxzbz0KKyAgOzsKK2VzYWMKK3Vuc2V0IG9ubHkKK2Nhc2UgIiRhbGwsJGFsc28sJCMiIGluCit0LHQsKikKKwlkaWUgIkNhbm5vdCB1c2UgLWEgYW5kIC1pIGF0IHRoZSBzYW1lIHRpbWUuIiA7OwordCwsWzEtOV0qKQorCWRpZSAiUGF0aHMgd2l0aCAtYSBkb2VzIG5vdCBtYWtlIHNlbnNlLiIgOzsKKyx0LDApCisJZGllICJObyBwYXRocyB3aXRoIC1pIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIiA7OworZXNhYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFByZXBhcmUgaW5kZXggdG8gaGF2ZSBhIHRyZWUgdG8gYmUgY29tbWl0dGVkCisKK1RPUD1gZ2l0LXJldi1wYXJzZSAtLXNob3ctY2R1cGAKK2lmIHRlc3QgLXogIiRUT1AiCit0aGVuCisJVE9QPS4vCitmaQorCitjYXNlICIkYWxsLCRhbHNvIiBpbgordCwpCisJc2F2ZV9pbmRleCAmJgorCSgKKwkJY2QgIiRUT1AiCisJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFCisJCWdpdC1kaWZmLWZpbGVzIC0tbmFtZS1vbmx5IC16IHwKKwkJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSAteiAtLXN0ZGluCisJKQorCTs7CissdCkKKwlzYXZlX2luZGV4ICYmCisJZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCAtLSAiJEAiID4vZGV2L251bGwgfHwgZXhpdAorCisJZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHkgLXogLS0gIiRAIiAgfAorCSgKKwkJY2QgIiRUT1AiCisJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFCisJCWdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLXogLS1zdGRpbgorCSkKKwk7OworLCkKKwljYXNlICIkIyIgaW4KKwkwKQorCSAgICA7OyAjIGNvbW1pdCBhcy1pcworCSopCisJICAgIGlmIHRlc3QgLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiCisJICAgIHRoZW4KKwkJcmVmdXNlX3BhcnRpYWwgIkNhbm5vdCBkbyBhIHBhcnRpYWwgY29tbWl0IGR1cmluZyBhIG1lcmdlLiIKKwkgICAgZmkKKwkgICAgVE1QX0lOREVYPSIkR0lUX0RJUi90bXAtaW5kZXgkJCIKKwkgICAgaWYgdGVzdCAteiAiJGluaXRpYWxfY29tbWl0IgorCSAgICB0aGVuCisJCSMgbWFrZSBzdXJlIGluZGV4IGlzIGNsZWFuIGF0IHRoZSBzcGVjaWZpZWQgcGF0aHMsIG9yCisJCSMgdGhleSBhcmUgYWRkaXRpb25zLgorCQlkaXJ0eV9pbl9pbmRleD1gZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLXN0YXR1cyBcCisJCQktLWRpZmYtZmlsdGVyPURNVFUgSEVBRCAtLSAiJEAiYAorCQl0ZXN0IC16ICIkZGlydHlfaW5faW5kZXgiIHx8CisJCXJlZnVzZV9wYXJ0aWFsICJEaWZmZXJlbnQgaW4gaW5kZXggYW5kIHRoZSBsYXN0IGNvbW1pdDoKKyRkaXJ0eV9pbl9pbmRleCIKKwkgICAgZmkKKwkgICAgY29tbWl0X29ubHk9YGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggLS0gIiRAImAgfHwgZXhpdAorCisJICAgICMgQnVpbGQgdGhlIHRlbXBvcmFyeSBpbmRleCBhbmQgdXBkYXRlIHRoZSByZWFsIGluZGV4CisJICAgICMgdGhlIHNhbWUgd2F5LgorCSAgICBpZiB0ZXN0IC16ICIkaW5pdGlhbF9jb21taXQiCisJICAgIHRoZW4KKwkJY3AgIiRUSElTX0lOREVYIiAiJFRNUF9JTkRFWCIKKwkJR0lUX0lOREVYX0ZJTEU9IiRUTVBfSU5ERVgiIGdpdC1yZWFkLXRyZWUgLW0gSEVBRAorCSAgICBlbHNlCisJCSAgICBybSAtZiAiJFRNUF9JTkRFWCIKKwkgICAgZmkgfHwgZXhpdAorCisJICAgIGVjaG8gIiRjb21taXRfb25seSIgfAorCSAgICBHSVRfSU5ERVhfRklMRT0iJFRNUF9JTkRFWCIgXAorCSAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIC0tc3RkaW4gJiYKKworCSAgICBzYXZlX2luZGV4ICYmCisJICAgIGVjaG8gIiRjb21taXRfb25seSIgfAorCSAgICAoCisJCUdJVF9JTkRFWF9GSUxFPSIkTkVYVF9JTkRFWCIKKwkJZXhwb3J0IEdJVF9JTkRFWF9GSUxFCisJCWdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLS1zdGRpbgorCSAgICApIHx8IGV4aXQKKwkgICAgOzsKKwllc2FjCisJOzsKK2VzYWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBJZiB3ZSBkbyBhcy1pcyBjb21taXQsIHRoZSBpbmRleCBmaWxlIHdpbGwgYmUgVEhJU19JTkRFWCwKKyMgb3RoZXJ3aXNlIE5FWFRfSU5ERVggYWZ0ZXIgd2UgbWFrZSB0aGlzIGNvbW1pdC4gIFdlIGxlYXZlCisjIHRoZSBpbmRleCBhcyBpcyBpZiB3ZSBhYm9ydC4KKworaWYgdGVzdCAtZiAiJE5FWFRfSU5ERVgiCit0aGVuCisJVVNFX0lOREVYPSIkTkVYVF9JTkRFWCIKK2Vsc2UKKwlVU0VfSU5ERVg9IiRUSElTX0lOREVYIgorZmkKKworR0lUX0lOREVYX0ZJTEU9IiRVU0VfSU5ERVgiIFwKKyAgICBnaXQtdXBkYXRlLWluZGV4IC1xICR1bm1lcmdlZF9va19pZl9zdGF0dXMgLS1yZWZyZXNoIHx8IGV4aXQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBJZiB0aGUgcmVxdWVzdCBpcyBzdGF0dXMsIGp1c3Qgc2hvdyBpdCBhbmQgZXhpdC4KKworY2FzZSAiJDAiIGluCisqc3RhdHVzKQorCXJ1bl9zdGF0dXMKKwlleGl0ICQ/Citlc2FjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR3JhYiBjb21taXQgbWVzc2FnZSwgd3JpdGUgb3V0IHRyZWUgYW5kIG1ha2UgY29tbWl0LgorCitpZiB0ZXN0IHQgPSAiJHZlcmlmeSIgJiYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3ByZS1jb21taXQKK3RoZW4KKwlpZiB0ZXN0ICIkVE1QX0lOREVYIgorCXRoZW4KKwkJR0lUX0lOREVYX0ZJTEU9IiRUTVBfSU5ERVgiICIkR0lUX0RJUiIvaG9va3MvcHJlLWNvbW1pdAorCWVsc2UKKwkJR0lUX0lOREVYX0ZJTEU9IiRVU0VfSU5ERVgiICIkR0lUX0RJUiIvaG9va3MvcHJlLWNvbW1pdAorCWZpIHx8IGV4aXQKK2ZpCisKK2lmIHRlc3QgIiRsb2dfbWVzc2FnZSIgIT0gJycKK3RoZW4KKwllY2hvICIkbG9nX21lc3NhZ2UiCitlbGlmIHRlc3QgIiRsb2dmaWxlIiAhPSAiIgordGhlbgorCWlmIHRlc3QgIiRsb2dmaWxlIiA9IC0KKwl0aGVuCisJCXRlc3QgLXQgMCAmJgorCQllY2hvID4mMiAiKHJlYWRpbmcgbG9nIG1lc3NhZ2UgZnJvbSBzdGFuZGFyZCBpbnB1dCkiCisJCWNhdAorCWVsc2UKKwkJY2F0IDwiJGxvZ2ZpbGUiCisJZmkKK2VsaWYgdGVzdCAiJHVzZV9jb21taXQiICE9ICIiCit0aGVuCisJZ2l0LWNhdC1maWxlIGNvbW1pdCAiJHVzZV9jb21taXQiIHwgc2VkIC1lICcxLC9eJC9kJworZWxpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiAmJiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9NU0ciCit0aGVuCisJY2F0ICIkR0lUX0RJUi9NRVJHRV9NU0ciCitlbGlmIHRlc3QgLWYgIiRHSVRfRElSL1NRVUFTSF9NU0ciCit0aGVuCisJY2F0ICIkR0lUX0RJUi9TUVVBU0hfTVNHIgorZmkgfCBnaXQtc3RyaXBzcGFjZSA+IiRHSVRfRElSIi9DT01NSVRfRURJVE1TRworCitjYXNlICIkc2lnbm9mZiIgaW4KK3QpCisJeworCQllY2hvCisJCWdpdC12YXIgR0lUX0NPTU1JVFRFUl9JREVOVCB8IHNlZCAtZSAnCisJCQlzLz4uKi8+LworCQkJcy9eL1NpZ25lZC1vZmYtYnk6IC8KKwkJJworCX0gPj4iJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCisJOzsKK2VzYWMKKworaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgJiYgdGVzdCAteiAiJG5vX2VkaXQiOyB0aGVuCisJZWNobyAiIyIKKwllY2hvICIjIEl0IGxvb2tzIGxpa2UgeW91IG1heSBiZSBjb21taXR0aW5nIGEgTUVSR0UuIgorCWVjaG8gIiMgSWYgdGhpcyBpcyBub3QgY29ycmVjdCwgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZSIKKwllY2hvICIjCSRHSVRfRElSL01FUkdFX0hFQUQiCisJZWNobyAiIyBhbmQgdHJ5IGFnYWluIgorCWVjaG8gIiMiCitmaSA+PiIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKKworIyBBdXRob3IKK2lmIHRlc3QgJycgIT0gIiRmb3JjZV9hdXRob3IiCit0aGVuCisJR0lUX0FVVEhPUl9OQU1FPWBleHByICJ6JGZvcmNlX2F1dGhvciIgOiAnelwoLipbXiBdXCkgKjwuKidgICYmCisJR0lUX0FVVEhPUl9FTUFJTD1gZXhwciAieiRmb3JjZV9hdXRob3IiIDogJy4qXCg8LipcKSdgICYmCisJdGVzdCAnJyAhPSAiJEdJVF9BVVRIT1JfTkFNRSIgJiYKKwl0ZXN0ICcnICE9ICIkR0lUX0FVVEhPUl9FTUFJTCIgfHwKKwlkaWUgIm1hbGZvcm1lZCAtLWF1dGhvciBwYXJhbWV0ZXIiCisJZXhwb3J0IEdJVF9BVVRIT1JfTkFNRSBHSVRfQVVUSE9SX0VNQUlMCitlbGlmIHRlc3QgJycgIT0gIiR1c2VfY29tbWl0IgordGhlbgorCXBpY2tfYXV0aG9yX3NjcmlwdD0nCisJL15hdXRob3IgL3sKKwkJcy8nXCcnLydcJydcXCdcJ1wnJy9nCisJCWgKKwkJcy9eYXV0aG9yIFwoW148XSpcKSA8W14+XSo+IC4qJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX05BTUU9J1wnJyYnXCcnL3AKKworCQlnCisJCXMvXmF1dGhvciBbXjxdKiA8XChbXj5dKlwpPiAuKiQvXDEvCisJCXMvJ1wnJy8nXCcnXCdcJ1wnJy9nCisJCXMvLiovR0lUX0FVVEhPUl9FTUFJTD0nXCcnJidcJycvcAorCisJCWcKKwkJcy9eYXV0aG9yIFtePF0qIDxbXj5dKj4gXCguKlwpJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX0RBVEU9J1wnJyYnXCcnL3AKKworCQlxCisJfQorCScKKwlzZXRfYXV0aG9yX2Vudj1gZ2l0LWNhdC1maWxlIGNvbW1pdCAiJHVzZV9jb21taXQiIHwKKwlMQU5HPUMgTENfQUxMPUMgc2VkIC1uZSAiJHBpY2tfYXV0aG9yX3NjcmlwdCJgCisJZXZhbCAiJHNldF9hdXRob3JfZW52IgorCWV4cG9ydCBHSVRfQVVUSE9SX05BTUUKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTAorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEUKK2ZpCisKK1BBUkVOVFM9Ii1wIEhFQUQiCitpZiB0ZXN0IC16ICIkaW5pdGlhbF9jb21taXQiCit0aGVuCisJcmxvZ2E9J2NvbW1pdCcKKwlpZiBbIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiBdOyB0aGVuCisJCXJsb2dhPSdjb21taXQgKG1lcmdlKScKKwkJUEFSRU5UUz0iLXAgSEVBRCAiYHNlZCAtZSAncy9eLy1wIC8nICIkR0lUX0RJUi9NRVJHRV9IRUFEImAKKwllbGlmIHRlc3QgLW4gIiRhbWVuZCI7IHRoZW4KKwkJcmxvZ2E9J2NvbW1pdCAoYW1lbmQpJworCQlQQVJFTlRTPSQoZ2l0LWNhdC1maWxlIGNvbW1pdCBIRUFEIHwKKwkJCXNlZCAtbiAtZSAnL14kL3EnIC1lICdzL15wYXJlbnQgLy1wIC9wJykKKwlmaQorCWN1cnJlbnQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCitlbHNlCisJaWYgWyAteiAiJChnaXQtbHMtZmlsZXMpIiBdOyB0aGVuCisJCWVjaG8gPiYyIE5vdGhpbmcgdG8gY29tbWl0CisJCWV4aXQgMQorCWZpCisJUEFSRU5UUz0iIgorCWN1cnJlbnQ9CisJcmxvZ2E9J2NvbW1pdCAoaW5pdGlhbCknCitmaQorCitpZiB0ZXN0IC16ICIkbm9fZWRpdCIKK3RoZW4KKwl7CisJCWVjaG8gIiIKKwkJZWNobyAiIyBQbGVhc2UgZW50ZXIgdGhlIGNvbW1pdCBtZXNzYWdlIGZvciB5b3VyIGNoYW5nZXMuIgorCQllY2hvICIjIChDb21tZW50IGxpbmVzIHN0YXJ0aW5nIHdpdGggJyMnIHdpbGwgbm90IGJlIGluY2x1ZGVkKSIKKwkJdGVzdCAteiAiJG9ubHlfaW5jbHVkZV9hc3N1bWVkIiB8fCBlY2hvICIkb25seV9pbmNsdWRlX2Fzc3VtZWQiCisJCXJ1bl9zdGF0dXMKKwl9ID4+IiRHSVRfRElSIi9DT01NSVRfRURJVE1TRworZWxzZQorCSMgd2UgbmVlZCB0byBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb21taXQKKwlydW5fc3RhdHVzID4vZGV2L251bGwgCitmaQoraWYgWyAiJD8iICE9ICIwIiAtYSAhIC1mICIkR0lUX0RJUi9NRVJHRV9IRUFEIiAtYSAteiAiJGFtZW5kIiBdCit0aGVuCisJcm0gLWYgIiRHSVRfRElSL0NPTU1JVF9FRElUTVNHIiAiJEdJVF9ESVIvU1FVQVNIX01TRyIKKwlydW5fc3RhdHVzCisJZXhpdCAxCitmaQorCitjYXNlICIkbm9fZWRpdCIgaW4KKycnKQorCWNhc2UgIiR7VklTVUFMOi0kRURJVE9SfSwkVEVSTSIgaW4KKwksZHVtYikKKwkJZWNobyA+JjIgIlRlcm1pbmFsIGlzIGR1bWIgYnV0IG5vIFZJU1VBTCBub3IgRURJVE9SIGRlZmluZWQuIgorCQllY2hvID4mMiAiUGxlYXNlIHN1cHBseSB0aGUgY29tbWl0IGxvZyBtZXNzYWdlIHVzaW5nIGVpdGhlciIKKwkJZWNobyA+JjIgIi1tIG9yIC1GIG9wdGlvbi4gIEEgYm9pbGVycGxhdGUgbG9nIG1lc3NhZ2UgaGFzIgorCQllY2hvID4mMiAiYmVlbiBwcmVwYXJlZCBpbiAkR0lUX0RJUi9DT01NSVRfRURJVE1TRyIKKwkJZXhpdCAxCisJCTs7CisJZXNhYworCWdpdC12YXIgR0lUX0FVVEhPUl9JREVOVCA+IC9kZXYvbnVsbCAgfHwgZGllCisJZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4gL2Rldi9udWxsICB8fCBkaWUKKwkke1ZJU1VBTDotJHtFRElUT1I6LXZpfX0gIiRHSVRfRElSL0NPTU1JVF9FRElUTVNHIgorCTs7Citlc2FjCisKK2Nhc2UgIiR2ZXJpZnkiIGluCit0KQorCWlmIHRlc3QgLXggIiRHSVRfRElSIi9ob29rcy9jb21taXQtbXNnCisJdGhlbgorCQkiJEdJVF9ESVIiL2hvb2tzL2NvbW1pdC1tc2cgIiRHSVRfRElSIi9DT01NSVRfRURJVE1TRyB8fCBleGl0CisJZmkKK2VzYWMKKworaWYgdGVzdCAteiAiJG5vX2VkaXQiCit0aGVuCisgICAgc2VkIC1lICcKKyAgICAgICAgL15kaWZmIC0tZ2l0IGFcLy4qL3sKKwkgICAgcy8vLworCSAgICBxCisJfQorCS9eIy9kCisgICAgJyAiJEdJVF9ESVIiL0NPTU1JVF9FRElUTVNHCitlbHNlCisgICAgY2F0ICIkR0lUX0RJUiIvQ09NTUlUX0VESVRNU0cKK2ZpIHwKK2dpdC1zdHJpcHNwYWNlID4iJEdJVF9ESVIiL0NPTU1JVF9NU0cKKworaWYgY250PWBncmVwIC12IC1pICdeU2lnbmVkLW9mZi1ieScgIiRHSVRfRElSIi9DT01NSVRfTVNHIHwKKwlnaXQtc3RyaXBzcGFjZSB8CisJd2MgLWxgICYmCisgICB0ZXN0IDAgLWx0ICRjbnQKK3RoZW4KKwlpZiB0ZXN0IC16ICIkVE1QX0lOREVYIgorCXRoZW4KKwkJdHJlZT0kKEdJVF9JTkRFWF9GSUxFPSIkVVNFX0lOREVYIiBnaXQtd3JpdGUtdHJlZSkKKwllbHNlCisJCXRyZWU9JChHSVRfSU5ERVhfRklMRT0iJFRNUF9JTkRFWCIgZ2l0LXdyaXRlLXRyZWUpICYmCisJCXJtIC1mICIkVE1QX0lOREVYIgorCWZpICYmCisJY29tbWl0PSQoY2F0ICIkR0lUX0RJUiIvQ09NTUlUX01TRyB8IGdpdC1jb21taXQtdHJlZSAkdHJlZSAkUEFSRU5UUykgJiYKKwlybG9nbT0kKHNlZCAtZSAxcSAiJEdJVF9ESVIiL0NPTU1JVF9NU0cpICYmCisJZ2l0LXVwZGF0ZS1yZWYgLW0gIiRybG9nYTogJHJsb2dtIiBIRUFEICRjb21taXQgJGN1cnJlbnQgJiYKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgJiYKKwlpZiB0ZXN0IC1mICIkTkVYVF9JTkRFWCIKKwl0aGVuCisJCW12ICIkTkVYVF9JTkRFWCIgIiRUSElTX0lOREVYIgorCWVsc2UKKwkJOiA7IyBoYXBweQorCWZpCitlbHNlCisJZWNobyA+JjIgIiogbm8gY29tbWl0IG1lc3NhZ2U/ICBhYm9ydGluZyBjb21taXQuIgorCWZhbHNlCitmaQorcmV0PSIkPyIKK3JtIC1mICIkR0lUX0RJUi9DT01NSVRfTVNHIiAiJEdJVF9ESVIvQ09NTUlUX0VESVRNU0ciICIkR0lUX0RJUi9TUVVBU0hfTVNHIgoraWYgdGVzdCAtZCAiJEdJVF9ESVIvcnItY2FjaGUiCit0aGVuCisJZ2l0LXJlcmVyZQorZmkKKworaWYgdGVzdCAteCAiJEdJVF9ESVIiL2hvb2tzL3Bvc3QtY29tbWl0ICYmIHRlc3QgIiRyZXQiID0gMAordGhlbgorCSIkR0lUX0RJUiIvaG9va3MvcG9zdC1jb21taXQKK2ZpCitleGl0ICIkcmV0IgpkaWZmIC0tZ2l0IGEvZ2l0LWNvbXBhdC11dGlsLmggYi9naXQtY29tcGF0LXV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUxODk1NAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1jb21wYXQtdXRpbC5oCkBAIC0wLDAgKzEsMTc4IEBACisjaWZuZGVmIEdJVF9DT01QQVRfVVRJTF9ICisjZGVmaW5lIEdJVF9DT01QQVRfVVRJTF9ICisKKyNpZm5kZWYgRkxFWF9BUlJBWQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA8IDMpCisjZGVmaW5lIEZMRVhfQVJSQVkgMAorI2Vsc2UKKyNkZWZpbmUgRkxFWF9BUlJBWSAvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQorI2Vsc2UKKyNkZWZpbmUgTk9SRVRVUk4KKyNpZm5kZWYgX19hdHRyaWJ1dGVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYKKyNlbmRpZgorCisvKiBHZW5lcmFsIGhlbHBlciBmdW5jdGlvbnMgKi8KK2V4dGVybiB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk47CitleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqZXJyLCAuLi4pIE5PUkVUVVJOIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIGludCBlcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK2V4dGVybiB2b2lkIHNldF91c2FnZV9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIpIE5PUkVUVVJOKTsKK2V4dGVybiB2b2lkIHNldF9kaWVfcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgTk9SRVRVUk4pOworZXh0ZXJuIHZvaWQgc2V0X2Vycm9yX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpKTsKKworI2lmZGVmIE5PX01NQVAKKworI2lmbmRlZiBQUk9UX1JFQUQKKyNkZWZpbmUgUFJPVF9SRUFEIDEKKyNkZWZpbmUgUFJPVF9XUklURSAyCisjZGVmaW5lIE1BUF9QUklWQVRFIDEKKyNkZWZpbmUgTUFQX0ZBSUxFRCAoKHZvaWQqKS0xKQorI2VuZGlmCisKKyNkZWZpbmUgbW1hcCBnaXRmYWtlbW1hcAorI2RlZmluZSBtdW5tYXAgZ2l0ZmFrZW11bm1hcAorZXh0ZXJuIHZvaWQgKmdpdGZha2VtbWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBpbnQgcHJvdCAsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpOworZXh0ZXJuIGludCBnaXRmYWtlbXVubWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoKTsKKworI2Vsc2UgLyogTk9fTU1BUCAqLworCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2VuZGlmIC8qIE5PX01NQVAgKi8KKworI2lmZGVmIE5PX1NFVEVOVgorI2RlZmluZSBzZXRlbnYgZ2l0c2V0ZW52CitleHRlcm4gaW50IGdpdHNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKyNlbmRpZgorCisjaWZkZWYgTk9fVU5TRVRFTlYKKyNkZWZpbmUgdW5zZXRlbnYgZ2l0dW5zZXRlbnYKK2V4dGVybiB2b2lkIGdpdHVuc2V0ZW52KGNvbnN0IGNoYXIgKik7CisjZW5kaWYKKworI2lmZGVmIE5PX1NUUkNBU0VTVFIKKyNkZWZpbmUgc3RyY2FzZXN0ciBnaXRzdHJjYXNlc3RyCitleHRlcm4gY2hhciAqZ2l0c3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fU1RSTENQWQorI2RlZmluZSBzdHJsY3B5IGdpdHN0cmxjcHkKK2V4dGVybiBzaXplX3QgZ2l0c3RybGNweShjaGFyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0ID0gbWFsbG9jKHNpemUpOworCWlmICghcmV0ICYmICFzaXplKQorCQlyZXQgPSBtYWxsb2MoMSk7CisJaWYgKCFyZXQpCisJCWRpZSgiT3V0IG9mIG1lbW9yeSwgbWFsbG9jIGZhaWxlZCIpOworI2lmZGVmIFhNQUxMT0NfUE9JU09OCisJbWVtc2V0KHJldCwgMHhBNSwgc2l6ZSk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnhyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0ID0gcmVhbGxvYyhwdHIsIHNpemUpOworCWlmICghcmV0ICYmICFzaXplKQorCQlyZXQgPSByZWFsbG9jKHB0ciwgMSk7CisJaWYgKCFyZXQpCisJCWRpZSgiT3V0IG9mIG1lbW9yeSwgcmVhbGxvYyBmYWlsZWQiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnhjYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpyZXQgPSBjYWxsb2Mobm1lbWIsIHNpemUpOworCWlmICghcmV0ICYmICghbm1lbWIgfHwgIXNpemUpKQorCQlyZXQgPSBjYWxsb2MoMSwgMSk7CisJaWYgKCFyZXQpCisJCWRpZSgiT3V0IG9mIG1lbW9yeSwgY2FsbG9jIGZhaWxlZCIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IG5yOworCXdoaWxlICgxKSB7CisJCW5yID0gcmVhZChmZCwgYnVmLCBsZW4pOworCQlpZiAoKG5yIDwgMCkgJiYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG5yOworCX0KK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHh3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IG5yOworCXdoaWxlICgxKSB7CisJCW5yID0gd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKwkJaWYgKChuciA8IDApICYmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRUlOVFIpKQorCQkJY29udGludWU7CisJCXJldHVybiBucjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhhc19leHRlbnNpb24oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4dCkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlzaXplX3QgZXh0bGVuID0gc3RybGVuKGV4dCk7CisJcmV0dXJuIGxlbiA+IGV4dGxlbiAmJiAhbWVtY21wKGZpbGVuYW1lICsgbGVuIC0gZXh0bGVuLCBleHQsIGV4dGxlbik7Cit9CisKKy8qIFNhbmUgY3R5cGUgLSBubyBsb2NhbGUsIGFuZCB3b3JrcyB3aXRoIHNpZ25lZCBjaGFycyAqLworI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiB0b2xvd2VyCisjdW5kZWYgdG91cHBlcgorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2FuZV9jdHlwZVsyNTZdOworI2RlZmluZSBHSVRfU1BBQ0UgMHgwMQorI2RlZmluZSBHSVRfRElHSVQgMHgwMgorI2RlZmluZSBHSVRfQUxQSEEgMHgwNAorI2RlZmluZSBzYW5lX2lzdGVzdCh4LG1hc2spICgoc2FuZV9jdHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgKG1hc2spKSAhPSAwKQorI2RlZmluZSBpc3NwYWNlKHgpIHNhbmVfaXN0ZXN0KHgsR0lUX1NQQUNFKQorI2RlZmluZSBpc2RpZ2l0KHgpIHNhbmVfaXN0ZXN0KHgsR0lUX0RJR0lUKQorI2RlZmluZSBpc2FscGhhKHgpIHNhbmVfaXN0ZXN0KHgsR0lUX0FMUEhBKQorI2RlZmluZSBpc2FsbnVtKHgpIHNhbmVfaXN0ZXN0KHgsR0lUX0FMUEhBIHwgR0lUX0RJR0lUKQorI2RlZmluZSB0b2xvd2VyKHgpIHNhbmVfY2FzZSgodW5zaWduZWQgY2hhcikoeCksIDB4MjApCisjZGVmaW5lIHRvdXBwZXIoeCkgc2FuZV9jYXNlKCh1bnNpZ25lZCBjaGFyKSh4KSwgMCkKKworc3RhdGljIGlubGluZSBpbnQgc2FuZV9jYXNlKGludCB4LCBpbnQgaGlnaCkKK3sKKwlpZiAoc2FuZV9pc3Rlc3QoeCwgR0lUX0FMUEhBKSkKKwkJeCA9ICh4ICYgfjB4MjApIHwgaGlnaDsKKwlyZXR1cm4geDsKK30KKworI2lmbmRlZiBNQVhQQVRITEVOCisjZGVmaW5lIE1BWFBBVEhMRU4gMjU2CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsIGIvZ2l0LWN2c2V4cG9ydGNvbW1pdC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk5YjNkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY3ZzZXhwb3J0Y29tbWl0LnBlcmwKQEAgLTAsMCArMSwzMTQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIEtub3duIGxpbWl0YXRpb25zOgorIyAtIGNhbm5vdCBhZGQgb3IgcmVtb3ZlIGJpbmFyeSBmaWxlcworIyAtIGRvZXMgbm90IHByb3BhZ2F0ZSBwZXJtaXNzaW9ucworIyAtIHRlbGxzICJyZWFkeSBmb3IgY29tbWl0IiBldmVuIHdoZW4gdGhpbmdzIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQKKyMgICAoZWcgYWRkaXRpb24gb2YgYSBiaW5hcnkgZmlsZSkKKwordXNlIHN0cmljdDsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBkaXIpOwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBGaWxlOjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKKwordW5sZXNzICgkRU5We0dJVF9ESVJ9ICYmIC1yICRFTlZ7R0lUX0RJUn0peworICAgIGRpZSAiR0lUX0RJUiBpcyBub3QgZGVmaW5lZCBvciBpcyB1bnJlYWRhYmxlIjsKK30KKworb3VyICgkb3B0X2gsICRvcHRfcCwgJG9wdF92LCAkb3B0X2MsICRvcHRfZiwgJG9wdF9hLCAkb3B0X20gKTsKKworZ2V0b3B0cygnaHB2Y2ZhbTonKTsKKworJG9wdF9oICYmIHVzYWdlKCk7CisKK2RpZSAiTmVlZCBhdCBsZWFzdCBvbmUgY29tbWl0IGlkZW50aWZpZXIhIiB1bmxlc3MgQEFSR1Y7CisKKyMgc2V0dXAgYSB0ZW1wZGlyCitvdXIgKCR0bXBkaXIsICR0bXBkaXJuYW1lKSA9IHRlbXBkaXIoJ2dpdC1jdnNhcHBseWNvbW1pdC1YWFhYWFgnLAorCQkJCSAgICAgVE1QRElSID0+IDEsCisJCQkJICAgICBDTEVBTlVQID0+IDEpOworCisjIHJlc29sdmUgdGFyZ2V0IGNvbW1pdAorbXkgJGNvbW1pdDsKKyRjb21taXQgPSBwb3AgQEFSR1Y7CiskY29tbWl0ID0gc2FmZV9waXBlX2NhcHR1cmUoJ2dpdC1yZXYtcGFyc2UnLCAnLS12ZXJpZnknLCAiJGNvbW1pdF4wIik7CitjaG9tcCAkY29tbWl0OworaWYgKCQ/KSB7CisgICAgZGllICJUaGUgY29tbWl0IHJlZmVyZW5jZSAkY29tbWl0IGRpZCBub3QgcmVzb2x2ZSEiOworfQorCisjIHJlc29sdmUgd2hhdCBwYXJlbnQgd2Ugd2FudAorbXkgJHBhcmVudDsKK2lmIChAQVJHVikgeworICAgICRwYXJlbnQgPSBwb3AgQEFSR1Y7CisgICAgJHBhcmVudCA9ICBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LXJldi1wYXJzZScsICctLXZlcmlmeScsICIkcGFyZW50XjAiKTsKKyAgICBjaG9tcCAkcGFyZW50OworICAgIGlmICgkPykgeworCWRpZSAiVGhlIHBhcmVudCByZWZlcmVuY2UgZGlkIG5vdCByZXNvbHZlISI7CisgICAgfQorfQorCisjIGZpbmQgcGFyZW50cyBmcm9tIHRoZSBjb21taXQgaXRzZWxmCitteSBAY29tbWl0ICA9IHNhZmVfcGlwZV9jYXB0dXJlKCdnaXQtY2F0LWZpbGUnLCAnY29tbWl0JywgJGNvbW1pdCk7CitteSBAcGFyZW50czsKK215ICRjb21taXR0ZXI7CitteSAkYXV0aG9yOworbXkgJHN0YWdlID0gJ2hlYWRlcnMnOyAjIGhlYWRlcnMsIG1zZworbXkgJHRpdGxlOworbXkgJG1zZyA9ICcnOworCitmb3JlYWNoIG15ICRsaW5lIChAY29tbWl0KSB7CisgICAgY2hvbXAgJGxpbmU7CisgICAgaWYgKCRzdGFnZSBlcSAnaGVhZGVycycgJiYgJGxpbmUgZXEgJycpIHsKKwkkc3RhZ2UgPSAnbXNnJzsKKwluZXh0OworICAgIH0KKworICAgIGlmICgkc3RhZ2UgZXEgJ2hlYWRlcnMnKSB7CisJaWYgKCRsaW5lID1+IG0vXnBhcmVudCAoXHd7NDB9KSQvKSB7ICMgZm91bmQgYSBwYXJlbnQKKwkgICAgcHVzaCBAcGFyZW50cywgJDE7CisJfSBlbHNpZiAoJGxpbmUgPX4gbS9eYXV0aG9yICguKykgXGQrIFwrXGQrJC8pIHsKKwkgICAgJGF1dGhvciA9ICQxOworCX0gZWxzaWYgKCRsaW5lID1+IG0vXmNvbW1pdHRlciAoLispIFxkKyBcK1xkKyQvKSB7CisJICAgICRjb21taXR0ZXIgPSAkMTsKKwl9CisgICAgfSBlbHNlIHsKKwkkbXNnIC49ICRsaW5lIC4gIlxuIjsKKwl1bmxlc3MgKCR0aXRsZSkgeworCSAgICAkdGl0bGUgPSAkbGluZTsKKwl9CisgICAgfQorfQorCitpZiAoJHBhcmVudCkgeworICAgIG15ICRmb3VuZDsKKyAgICAjIGRvdWJsZSBjaGVjayB0aGF0IGl0J3MgYSB2YWxpZCBwYXJlbnQKKyAgICBmb3JlYWNoIG15ICRwIChAcGFyZW50cykgeworCWlmICgkcCBlcSAkcGFyZW50KSB7CisJICAgICRmb3VuZCA9IDE7CisJICAgIGxhc3Q7CisJfTsgIyBmb3VuZCBpdAorICAgIH0KKyAgICBkaWUgIkRpZCBub3QgZmluZCAkcGFyZW50IGluIHRoZSBwYXJlbnRzIGZvciB0aGlzIGNvbW1pdCEiIGlmICEkZm91bmQ7Cit9IGVsc2UgeyAjIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgZnJvbSB0aGUgY21kbGluZS4uLgorICAgIGlmIChAcGFyZW50cyA9PSAxKSB7ICMgaXQncyBzYWZlIHRvIGdldCBpdCBmcm9tIHRoZSBjb21taXQKKwkkcGFyZW50ID0gJHBhcmVudHNbMF07CisgICAgfSBlbHNlIHsgIyBvciBwZXJoYXBzIG5vdCEKKwlkaWUgIlRoaXMgY29tbWl0IGhhcyBtb3JlIHRoYW4gb25lIHBhcmVudCAtLSBwbGVhc2UgbmFtZSB0aGUgcGFyZW50IHlvdSB3YW50IHRvIHVzZSBleHBsaWNpdGx5IjsKKyAgICB9Cit9CisKKyRvcHRfdiAmJiBwcmludCAiQXBwbHlpbmcgdG8gQ1ZTIGNvbW1pdCAkY29tbWl0IGZyb20gcGFyZW50ICRwYXJlbnRcbiI7CisKKyMgZ3JhYiB0aGUgY29tbWl0IG1lc3NhZ2UKK29wZW4oTVNHLCAiPi5tc2ciKSBvciBkaWUgIkNhbm5vdCBvcGVuIC5tc2cgZm9yIHdyaXRpbmciOworaWYgKCRvcHRfbSkgeworICAgIHByaW50IE1TRyAkb3B0X207Cit9CitwcmludCBNU0cgJG1zZzsKK2lmICgkb3B0X2EpIHsKKyAgICBwcmludCBNU0cgIlxuXG5BdXRob3I6ICRhdXRob3JcbiI7CisgICAgaWYgKCRhdXRob3IgbmUgJGNvbW1pdHRlcikgeworCXByaW50IE1TRyAiQ29tbWl0dGVyOiAkY29tbWl0dGVyXG4iOworICAgIH0KK30KK2Nsb3NlIE1TRzsKKworbXkgKEBhZmlsZXMsIEBkZmlsZXMsIEBtZmlsZXMsIEBkaXJzKTsKK215IEBmaWxlcyA9IHNhZmVfcGlwZV9jYXB0dXJlKCdnaXQtZGlmZi10cmVlJywgJy1yJywgJHBhcmVudCwgJGNvbW1pdCk7CisjcHJpbnQgQGZpbGVzOworJD8gJiYgZGllICJFcnJvciBpbiBnaXQtZGlmZi10cmVlIjsKK2ZvcmVhY2ggbXkgJGYgKEBmaWxlcykgeworICAgIGNob21wICRmOworICAgIG15IEBmaWVsZHMgPSBzcGxpdChtIVxzKyEsICRmKTsKKyAgICBpZiAoJGZpZWxkc1s0XSBlcSAnQScpIHsKKyAgICAgICAgbXkgJHBhdGggPSAkZmllbGRzWzVdOworCXB1c2ggQGFmaWxlcywgJHBhdGg7CisgICAgICAgICMgYWRkIGFueSBuZWVkZWQgcGFyZW50IGRpcmVjdG9yaWVzCisJJHBhdGggPSBkaXJuYW1lICRwYXRoOworCXdoaWxlICghLWQgJHBhdGggYW5kICEgZ3JlcCB7ICRfIGVxICRwYXRoIH0gQGRpcnMpIHsKKwkgICAgdW5zaGlmdCBAZGlycywgJHBhdGg7CisJICAgICRwYXRoID0gZGlybmFtZSAkcGF0aDsKKwl9CisgICAgfQorICAgIGlmICgkZmllbGRzWzRdIGVxICdNJykgeworCXB1c2ggQG1maWxlcywgJGZpZWxkc1s1XTsKKyAgICB9CisgICAgaWYgKCRmaWVsZHNbNF0gZXEgJ1InKSB7CisJcHVzaCBAZGZpbGVzLCAkZmllbGRzWzVdOworICAgIH0KK30KKyRvcHRfdiAmJiBwcmludCAiVGhlIGNvbW1pdCBhZmZlY3RzOlxuICI7Ciskb3B0X3YgJiYgcHJpbnQgam9pbiAoIlxuICIsIEBhZmlsZXMsQG1maWxlcyxAZGZpbGVzKSAuICJcblxuIjsKK3VuZGVmIEBmaWxlczsgIyBkb24ndCBuZWVkIGl0IGFueW1vcmUKKworIyBjaGVjayB0aGF0IHRoZSBmaWxlcyBhcmUgY2xlYW4gYW5kIHVwIHRvIGRhdGUgYWNjb3JkaW5nIHRvIGN2cworbXkgJGRpcnR5OworZm9yZWFjaCBteSAkZCAoQGRpcnMpIHsKKyAgICBpZiAoLWUgJGQpIHsKKwkkZGlydHkgPSAxOworCXdhcm4gIiRkIGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5IVxuIjsKKyAgICB9Cit9Citmb3JlYWNoIG15ICRmIChAYWZpbGVzKSB7CisgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gb25seSBvbmUgdmFsdWUKKyAgICBteSBAc3RhdHVzID0gZ3JlcChtL15GaWxlLywgIHNhZmVfcGlwZV9jYXB0dXJlKCdjdnMnLCAnLXEnLCAnc3RhdHVzJyAsJGYpKTsKKyAgICBpZiAoQHN0YXR1cyA+IDEpIHsgd2FybiAnU3RyYW5nZSEgY3ZzIHN0YXR1cyByZXR1cm5lZCBtb3JlIHRoYW4gb25lIGxpbmU/J307CisgICAgaWYgKC1kIGRpcm5hbWUgJGYgYW5kICRzdGF0dXNbMF0gIX4gbS9TdGF0dXM6IFVua25vd24kLworCWFuZCAkc3RhdHVzWzBdICF+IG0vXkZpbGU6IG5vIGZpbGUgLykgeworIAkkZGlydHkgPSAxOworCXdhcm4gIkZpbGUgJGYgaXMgYWxyZWFkeSBrbm93biBpbiB5b3VyIENWUyBjaGVja291dCAtLSBwZXJoYXBzIGl0IGhhcyBiZWVuIGFkZGVkIGJ5IGFub3RoZXIgdXNlci4gT3IgdGhpcyBtYXkgaW5kaWNhdGUgdGhhdCBpdCBleGlzdHMgb24gYSBkaWZmZXJlbnQgYnJhbmNoLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB1c2UgLWYgdG8gZm9yY2UgdGhlIG1lcmdlLlxuIjsKKwl3YXJuICJTdGF0dXMgd2FzOiAkc3RhdHVzWzBdXG4iOworICAgIH0KK30KK2ZvcmVhY2ggbXkgJGYgKEBtZmlsZXMsIEBkZmlsZXMpIHsKKyAgICAjIFRPRE86d2UgbmVlZCB0byBoYW5kbGUgcmVtb3ZlZCBpbiBjdnMKKyAgICBteSBAc3RhdHVzID0gZ3JlcChtL15GaWxlLywgIHNhZmVfcGlwZV9jYXB0dXJlKCdjdnMnLCAnLXEnLCAnc3RhdHVzJyAsJGYpKTsKKyAgICBpZiAoQHN0YXR1cyA+IDEpIHsgd2FybiAnU3RyYW5nZSEgY3ZzIHN0YXR1cyByZXR1cm5lZCBtb3JlIHRoYW4gb25lIGxpbmU/J307CisgICAgdW5sZXNzICgkc3RhdHVzWzBdID1+IG0vU3RhdHVzOiBVcC10by1kYXRlJC8pIHsKKwkkZGlydHkgPSAxOworCXdhcm4gIkZpbGUgJGYgbm90IHVwIHRvIGRhdGUgaW4geW91ciBDVlMgY2hlY2tvdXQhXG4iOworICAgIH0KK30KK2lmICgkZGlydHkpIHsKKyAgICBpZiAoJG9wdF9mKSB7CXdhcm4gIlRoZSB0cmVlIGlzIG5vdCBjbGVhbiAtLSBmb3JjZWQgbWVyZ2VcbiI7CisJJGRpcnR5ID0gMDsKKyAgICB9IGVsc2UgeworCWRpZSAiRXhpdGluZzogeW91ciBDVlMgdHJlZSBpcyBub3QgY2xlYW4gZm9yIHRoaXMgbWVyZ2UuIjsKKyAgICB9Cit9CisKKyMjIworIyMjIE5PVEU6IGlmIHlvdSBhcmUgcGxhbm5pbmcgdG8gZGllKCkgcGFzdCB0aGlzIHBvaW50CisjIyMgICAgICAgeW91IE1VU1QgY2FsbCBjbGVhbnVwY3ZzKEBmaWxlcykgYmVmb3JlIGRpZSgpCisjIyMKKworCitwcmludCAiQ3JlYXRpbmcgbmV3IGRpcmVjdG9yaWVzXG4iOworZm9yZWFjaCBteSAkZCAoQGRpcnMpIHsKKyAgICB1bmxlc3MgKG1rZGlyICRkKSB7CisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBta2RpciAkZDogJCEiOworCSRkaXJ0eSA9IDE7CisgICAgfQorICAgIGBjdnMgYWRkICRkYDsKKyAgICBpZiAoJD8pIHsKKwkkZGlydHkgPSAxOworCXdhcm4gIkZhaWxlZCB0byBjdnMgYWRkIGRpcmVjdG9yeSAkZCAtLSB5b3UgbWF5IG5lZWQgdG8gZG8gaXQgbWFudWFsbHkiOworICAgIH0KK30KKworcHJpbnQgIidQYXRjaGluZycgYmluYXJ5IGZpbGVzXG4iOworCitteSBAYmZpbGVzID0gZ3JlcChtL15CaW5hcnkvLCBzYWZlX3BpcGVfY2FwdHVyZSgnZ2l0LWRpZmYtdHJlZScsICctcCcsICRwYXJlbnQsICRjb21taXQpKTsKK0BiZmlsZXMgPSBtYXAgeyBjaG9tcCB9IEBiZmlsZXM7Citmb3JlYWNoIG15ICRmIChAYmZpbGVzKSB7CisgICAgIyBjaGVjayB0aGF0IHRoZSBmaWxlIGluIGN2cyBtYXRjaGVzIHRoZSAib2xkIiBmaWxlCisgICAgIyBleHRyYWN0IHRoZSBmaWxlIHRvICR0bXBkaXIgYW5kIGNvbXBhcmUgd2l0aCBjbXAKKyAgICBteSAkdHJlZSA9IHNhZmVfcGlwZV9jYXB0dXJlKCdnaXQtcmV2LXBhcnNlJywgIiRwYXJlbnRee3RyZWV9Iik7CisgICAgY2hvbXAgJHRyZWU7CisgICAgbXkgJGJsb2IgPSBgZ2l0LWxzLXRyZWUgJHRyZWUgIiRmIiB8IGN1dCAtZiAxIHwgY3V0IC1kICcgJyAtZiAzYDsKKyAgICBjaG9tcCAkYmxvYjsKKyAgICBgZ2l0LWNhdC1maWxlIGJsb2IgJGJsb2IgPiAkdG1wZGlyL2Jsb2JgOworICAgIGlmIChzeXN0ZW0oJ2NtcCcsICctcycsICRmLCAiJHRtcGRpci9ibG9iIikpIHsKKwl3YXJuICJCaW5hcnkgZmlsZSAkZiBpbiBDVlMgZG9lcyBub3QgbWF0Y2ggcGFyZW50LlxuIjsKKwkkZGlydHkgPSAxOworCW5leHQ7CisgICAgfQorCisgICAgIyByZXBsYWNlIHdpdGggdGhlIG5ldyBmaWxlCisgICAgIGBnaXQtY2F0LWZpbGUgYmxvYiAkYmxvYiA+ICRmYDsKKworICAgICMgVE9ETzogc29tZXRoaW5nIHNtYXJ0IHdpdGggZmlsZSBtb2RlcworCit9CitpZiAoJGRpcnR5KSB7CisgICAgY2xlYW51cGN2cyhAZmlsZXMpOworICAgIGRpZSAiRXhpdGluZzogQmluYXJ5IGZpbGVzIGluIENWUyBkbyBub3QgbWF0Y2ggcGFyZW50IjsKK30KKworIyMgYXBwbHkgbm9uLWJpbmFyeSBjaGFuZ2VzCitteSAkZnV6eiA9ICRvcHRfcCA/IDAgOiAyOworCitwcmludCAiUGF0Y2hpbmcgbm9uLWJpbmFyeSBmaWxlc1xuIjsKK3ByaW50IGAoZ2l0LWRpZmYtdHJlZSAtcCAkcGFyZW50IC1wICRjb21taXQgfCBwYXRjaCAtcDEgLUYgJGZ1enogKSAyPiYxYDsKKworbXkgJGRpcnR5cGF0Y2ggPSAwOworaWYgKCgkPyA+PiA4KSA9PSAyKSB7CisgICAgY2xlYW51cGN2cyhAZmlsZXMpOworICAgIGRpZSAiRXhpdGluZzogUGF0Y2ggcmVwb3J0ZWQgc2VyaW91cyB0cm91YmxlIC0tIHlvdSB3aWxsIGhhdmUgdG8gYXBwbHkgdGhpcyBwYXRjaCBtYW51YWxseSI7Cit9IGVsc2lmICgoJD8gPj4gOCkgPT0gMSkgeyAjIHNvbWUgaHVua3MgZmFpbGVkIHRvIGFwcGx5CisgICAgJGRpcnR5cGF0Y2ggPSAxOworfQorCitmb3JlYWNoIG15ICRmIChAYWZpbGVzKSB7CisgICAgc3lzdGVtKCdjdnMnLCAnYWRkJywgJGYpOworICAgIGlmICgkPykgeworCSRkaXJ0eSA9IDE7CisJd2FybiAiRmFpbGVkIHRvIGN2cyBhZGQgJGYgLS0geW91IG1heSBuZWVkIHRvIGRvIGl0IG1hbnVhbGx5IjsKKyAgICB9Cit9CisKK2ZvcmVhY2ggbXkgJGYgKEBkZmlsZXMpIHsKKyAgICBzeXN0ZW0oJ2N2cycsICdybScsICctZicsICRmKTsKKyAgICBpZiAoJD8pIHsKKwkkZGlydHkgPSAxOworCXdhcm4gIkZhaWxlZCB0byBjdnMgcm0gLWYgJGYgLS0geW91IG1heSBuZWVkIHRvIGRvIGl0IG1hbnVhbGx5IjsKKyAgICB9Cit9CisKK3ByaW50ICJDb21taXQgdG8gQ1ZTXG4iOworcHJpbnQgIlBhdGNoOiAkdGl0bGVcbiI7CitteSAkY29tbWl0ZmlsZXMgPSBqb2luKCcgJywgQGFmaWxlcywgQG1maWxlcywgQGRmaWxlcyk7CitteSAkY21kID0gImN2cyBjb21taXQgLUYgLm1zZyAkY29tbWl0ZmlsZXMiOworCitpZiAoJGRpcnR5cGF0Y2gpIHsKKyAgICBwcmludCAiTk9URTogT25lIG9yIG1vcmUgaHVua3MgZmFpbGVkIHRvIGFwcGx5IGNsZWFubHkuXG4iOworICAgIHByaW50ICJSZXNvbHZlIHRoZSBjb25mbGljdHMgYW5kIHRoZW4gY29tbWl0IHVzaW5nOlxuIjsKKyAgICBwcmludCAiXG4gICAgJGNtZFxuXG4iOworICAgIGV4aXQoMSk7Cit9CisKKworaWYgKCRvcHRfYykgeworICAgIHByaW50ICJBdXRvY29tbWl0XG4gICRjbWRcbiI7CisgICAgcHJpbnQgc2FmZV9waXBlX2NhcHR1cmUoJ2N2cycsICdjb21taXQnLCAnLUYnLCAnLm1zZycsIEBhZmlsZXMsIEBtZmlsZXMsIEBkZmlsZXMpOworICAgIGlmICgkPykgeworCWNsZWFudXBjdnMoQGZpbGVzKTsKKwlkaWUgIkV4aXRpbmc6IFRoZSBjb21taXQgZGlkIG5vdCBzdWNjZWVkIjsKKyAgICB9CisgICAgcHJpbnQgIkNvbW1pdHRlZCBzdWNjZXNzZnVsbHkgdG8gQ1ZTXG4iOworfSBlbHNlIHsKKyAgICBwcmludCAiUmVhZHkgZm9yIHlvdSB0byBjb21taXQsIGp1c3QgcnVuOlxuXG4gICAkY21kXG4iOworfQorc3ViIHVzYWdlIHsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogR0lUX0RJUj0vcGF0aC90by8uZ2l0ICR7XGJhc2VuYW1lICQwfSBbLWhdIFstcF0gWy12XSBbLWNdIFstZl0gWy1tIG1zZ3ByZWZpeF0gWyBwYXJlbnQgXSBjb21taXQKK0VORAorCWV4aXQoMSk7Cit9CisKKyMgZW5zdXJlIGN2cyBpcyBjbGVhbiBiZWZvcmUgd2UgZGllCitzdWIgY2xlYW51cGN2cyB7CisgICAgbXkgQGZpbGVzID0gQF87CisgICAgZm9yZWFjaCBteSAkZiAoQGZpbGVzKSB7CisJc3lzdGVtKCdjdnMnLCAnLXEnLCAndXBkYXRlJywgJy1DJywgJGYpOworCWlmICgkPykgeworCSAgICB3YXJuICJXYXJuaW5nISBGYWlsZWQgdG8gY2xlYW51cCBzdGF0ZSBvZiAkZlxuIjsKKwl9CisgICAgfQorfQorCisjIEFuIGFsdGVybmF0aXZlIHRvIGBjb21tYW5kYCB0aGF0IGFsbG93cyBpbnB1dCB0byBiZSBwYXNzZWQgYXMgYW4gYXJyYXkKKyMgdG8gd29yayBhcm91bmQgc2hlbGwgcHJvYmxlbXMgd2l0aCB3ZWlyZCBjaGFyYWN0ZXJzIGluIGFyZ3VtZW50cworIyBpZiB0aGUgZXhlYyByZXR1cm5zIG5vbi16ZXJvIHdlIGRpZQorc3ViIHNhZmVfcGlwZV9jYXB0dXJlIHsKKyAgICBteSBAb3V0cHV0OworICAgIGlmIChteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCcpIHsKKwlAb3V0cHV0ID0gKDwkY2hpbGQ+KTsKKwljbG9zZSAkY2hpbGQgb3IgZGllIGpvaW4oJyAnLEBfKS4iOiAkISAkPyI7CisgICAgfSBlbHNlIHsKKwlleGVjKEBfKSBvciBkaWUgIiQhICQ/IjsgIyBleGVjKCkgY2FuIGZhaWwgdGhlIGV4ZWN1dGFibGUgY2FuJ3QgYmUgZm91bmQKKyAgICB9CisgICAgcmV0dXJuIHdhbnRhcnJheSA/IEBvdXRwdXQgOiBqb2luKCcnLEBvdXRwdXQpOworfQpkaWZmIC0tZ2l0IGEvZ2l0LWN2c2ltcG9ydC5wZXJsIGIvZ2l0LWN2c2ltcG9ydC5wZXJsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1YTAwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtY3ZzaW1wb3J0LnBlcmwKQEAgLTAsMCArMSw5MjQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIFRoaXMgdG9vbCBpcyBjb3B5cmlnaHQgKGMpIDIwMDUsIE1hdHRoaWFzIFVybGljaHMuCisjIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHbnUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMKKyMgVGhlIGJhc2ljIGlkZWEgaXMgdG8gYWdncmVnYXRlIENWUyBjaGVjay1pbnMgaW50byByZWxhdGVkIGNoYW5nZXMuCisjIEZvcnR1bmF0ZWx5LCAiY3ZzcHMiIGRvZXMgdGhhdCBmb3IgdXM7IGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvIHBhcnNlCisjIGl0cyBvdXRwdXQuCisjCisjIENoZWNraW5nIG91dCB0aGUgZmlsZXMgaXMgZG9uZSBieSBhIHNpbmdsZSBsb25nLXJ1bm5pbmcgQ1ZTIGNvbm5lY3Rpb24KKyMgLyBzZXJ2ZXIgcHJvY2Vzcy4KKyMKKyMgVGhlIGhlYWQgcmV2aXNpb24gaXMgb24gYnJhbmNoICJvcmlnaW4iIGJ5IGRlZmF1bHQuCisjIFlvdSBjYW4gY2hhbmdlIHRoYXQgd2l0aCB0aGUgJy1vJyBvcHRpb24uCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgR2V0b3B0OjpTdGQ7Cit1c2UgRmlsZTo6U3BlYzsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBmaWxlIHRtcG5hbSk7Cit1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGgpOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3KGJhc2VuYW1lIGRpcm5hbWUpOwordXNlIFRpbWU6OkxvY2FsOwordXNlIElPOjpTb2NrZXQ7Cit1c2UgSU86OlBpcGU7Cit1c2UgUE9TSVggcXcoc3RyZnRpbWUgZHVwMiBFTk9FTlQpOwordXNlIElQQzo6T3BlbjI7CisKKyRTSUd7J1BJUEUnfT0iSUdOT1JFIjsKKyRFTlZ7J1RaJ309IlVUQyI7CisKK291cigkb3B0X2gsJG9wdF9vLCRvcHRfdiwkb3B0X2ssJG9wdF91LCRvcHRfZCwkb3B0X3AsJG9wdF9DLCRvcHRfeiwkb3B0X2ksJG9wdF9QLCAkb3B0X3MsJG9wdF9tLCRvcHRfTSwkb3B0X0EsJG9wdF9TLCRvcHRfTCk7CitteSAoJWNvbnZfYXV0aG9yX25hbWUsICVjb252X2F1dGhvcl9lbWFpbCk7CisKK3N1YiB1c2FnZSgpIHsKKwlwcmludCBTVERFUlIgPDxFTkQ7CitVc2FnZTogJHtcYmFzZW5hbWUgJDB9ICAgICAjIGZldGNoL3VwZGF0ZSBHSVQgZnJvbSBDVlMKKyAgICAgICBbLW8gYnJhbmNoLWZvci1IRUFEXSBbLWhdIFstdl0gWy1kIENWU1JPT1RdIFstQSBhdXRob3ItY29udi1maWxlXQorICAgICAgIFstcCBvcHRzLWZvci1jdnNwc10gWy1DIEdJVF9yZXBvc2l0b3J5XSBbLXogZnV6el0gWy1pXSBbLWtdIFstdV0KKyAgICAgICBbLXMgc3Vic3RdIFstbV0gWy1NIHJlZ2V4XSBbLVMgcmVnZXhdIFtDVlNfbW9kdWxlXQorRU5ECisJZXhpdCgxKTsKK30KKworc3ViIHJlYWRfYXV0aG9yX2luZm8oJCkgeworCW15ICgkZmlsZSkgPSBAXzsKKwlteSAkdXNlcjsKKwlvcGVuIG15ICRmLCAnPCcsICIkZmlsZSIgb3IgZGllKCJGYWlsZWQgdG8gb3BlbiAkZmlsZTogJCFcbiIpOworCisJd2hpbGUgKDwkZj4pIHsKKwkJIyBFeHBlY3RlZCBmb3JtYXQgaXMgdGhpczoKKwkJIyAgIGV4b249QW5kcmVhcyBFcmljc3NvbiA8YWVAb3A1LnNlPgorCQlpZiAobS9eKFxTKz8pXHMqPVxzKiguKz8pXHMqPCguKyk+XHMqJC8pIHsKKwkJCSR1c2VyID0gJDE7CisJCQkkY29udl9hdXRob3JfbmFtZXskdXNlcn0gPSAkMjsKKwkJCSRjb252X2F1dGhvcl9lbWFpbHskdXNlcn0gPSAkMzsKKwkJfQorCQkjIEhvd2V2ZXIsIHdlIGFsc28gcmVhZCBmcm9tIENWU1JPT1QvdXNlcnMgZm9ybWF0CisJCSMgdG8gZWFzZSBtaWdyYXRpb24uCisJCWVsc2lmICgvXihcdyspOihbJyJdPykoLis/KVwyXHMqJC8pIHsKKwkJCW15ICRtYXBwZWQ7CisJCQkoJHVzZXIsICRtYXBwZWQpID0gKCQxLCAkMyk7CisJCQlpZiAoJG1hcHBlZCA9fiAvXlxzKiguKj8pXHMqPCguKik+XHMqJC8pIHsKKwkJCQkkY29udl9hdXRob3JfbmFtZXskdXNlcn0gPSAkMTsKKwkJCQkkY29udl9hdXRob3JfZW1haWx7JHVzZXJ9ID0gJDI7CisJCQl9CisJCQllbHNpZiAoJG1hcHBlZCA9fiAvXjw/KC4qKT4/JC8pIHsKKwkJCQkkY29udl9hdXRob3JfbmFtZXskdXNlcn0gPSAkdXNlcjsKKwkJCQkkY29udl9hdXRob3JfZW1haWx7JHVzZXJ9ID0gJDE7CisJCQl9CisJCX0KKwkJIyBORUVEU1dPUks6IE1heWJlIHdhcm4gb24gdW5yZWNvZ25pemVkIGxpbmVzPworCX0KKwljbG9zZSAoJGYpOworfQorCitzdWIgd3JpdGVfYXV0aG9yX2luZm8oJCkgeworCW15ICgkZmlsZSkgPSBAXzsKKwlvcGVuIG15ICRmLCAnPicsICRmaWxlIG9yCisJICBkaWUoIkZhaWxlZCB0byBvcGVuICRmaWxlIGZvciB3cml0aW5nOiAkISIpOworCisJZm9yZWFjaCAoa2V5cyAlY29udl9hdXRob3JfbmFtZSkgeworCQlwcmludCAkZiAiJF89JGNvbnZfYXV0aG9yX25hbWV7JF99IDwkY29udl9hdXRob3JfZW1haWx7JF99PlxuIjsKKwl9CisJY2xvc2UgKCRmKTsKK30KKworZ2V0b3B0cygiaGl2bWt1bzpkOnA6Qzp6OnM6TTpQOkE6UzpMOiIpIG9yIHVzYWdlKCk7Cit1c2FnZSBpZiAkb3B0X2g7CisKK0BBUkdWIDw9IDEgb3IgdXNhZ2UoKTsKKworaWYoJG9wdF9kKSB7CisJJEVOVnsiQ1ZTUk9PVCJ9ID0gJG9wdF9kOworfSBlbHNpZigtZiAnQ1ZTL1Jvb3QnKSB7CisJb3BlbiBteSAkZiwgJzwnLCAnQ1ZTL1Jvb3QnIG9yIGRpZSAnRmFpbGVkIHRvIG9wZW4gQ1ZTL1Jvb3QnOworCSRvcHRfZCA9IDwkZj47CisJY2hvbXAgJG9wdF9kOworCWNsb3NlICRmOworCSRFTlZ7IkNWU1JPT1QifSA9ICRvcHRfZDsKK30gZWxzaWYoJEVOVnsiQ1ZTUk9PVCJ9KSB7CisJJG9wdF9kID0gJEVOVnsiQ1ZTUk9PVCJ9OworfSBlbHNlIHsKKwlkaWUgIkNWU1JPT1QgbmVlZHMgdG8gYmUgc2V0IjsKK30KKyRvcHRfbyB8fD0gIm9yaWdpbiI7Ciskb3B0X3MgfHw9ICItIjsKK215ICRnaXRfdHJlZSA9ICRvcHRfQzsKKyRnaXRfdHJlZSB8fD0gIi4iOworCitteSAkY3ZzX3RyZWU7CitpZiAoJCNBUkdWID09IDApIHsKKwkkY3ZzX3RyZWUgPSAkQVJHVlswXTsKK30gZWxzaWYgKC1mICdDVlMvUmVwb3NpdG9yeScpIHsKKwlvcGVuIG15ICRmLCAnPCcsICdDVlMvUmVwb3NpdG9yeScgb3IgCisJICAgIGRpZSAnRmFpbGVkIHRvIG9wZW4gQ1ZTL1JlcG9zaXRvcnknOworCSRjdnNfdHJlZSA9IDwkZj47CisJY2hvbXAgJGN2c190cmVlOworCWNsb3NlICRmOworfSBlbHNlIHsKKwl1c2FnZSgpOworfQorCitvdXIgQG1lcmdlcnggPSAoKTsKK2lmICgkb3B0X20pIHsKKwlAbWVyZ2VyeCA9ICggcXIvXFcoPzpmcm9tfG9mfG1lcmdlfG1lcmdpbmd8bWVyZ2VkKSAoXHcrKS9pICk7Cit9CitpZiAoJG9wdF9NKSB7CisJcHVzaCAoQG1lcmdlcngsIHFyLyRvcHRfTS8pOworfQorCitzZWxlY3QoU1RERVJSKTsgJHw9MTsgc2VsZWN0KFNURE9VVCk7CisKKworcGFja2FnZSBDVlNjb25uOworIyBCYXNpYyBDVlMgZGlhbG9nLgorIyBXZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gY29ubmVjdGluZyBhbmQgZG93bmxvYWRpbmcsIHNvIC4uLgorCit1c2UgRmlsZTo6U3BlYzsKK3VzZSBGaWxlOjpUZW1wIHF3KHRlbXBmaWxlKTsKK3VzZSBQT1NJWCBxdyhzdHJmdGltZSBkdXAyKTsKKworc3ViIG5ldyB7CisJbXkoJHdoYXQsJHJlcG8sJHN1YmRpcikgPSBAXzsKKwkkd2hhdD1yZWYoJHdoYXQpIGlmIHJlZigkd2hhdCk7CisKKwlteSAkc2VsZiA9IHt9OworCSRzZWxmLT57J2J1ZmZlcid9ID0gIiI7CisJYmxlc3MoJHNlbGYsJHdoYXQpOworCisJJHJlcG8gPX4gcyMvKyQjIzsKKwkkc2VsZi0+eydmdWxscmVwJ30gPSAkcmVwbzsKKwkkc2VsZi0+Y29ubigpOworCisJJHNlbGYtPnsnc3ViZGlyJ30gPSAkc3ViZGlyOworCSRzZWxmLT57J2xpbmVzJ30gPSB1bmRlZjsKKworCXJldHVybiAkc2VsZjsKK30KKworc3ViIGNvbm4geworCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHJlcG8gPSAkc2VsZi0+eydmdWxscmVwJ307CisJaWYoJHJlcG8gPX4gcy9eOnBzZXJ2ZXI6KD86KC4qPykoPzo6KC4qPykpP0ApPyhbXjpcL10qKSg/OjooXGQqKSk/Ly8pIHsKKwkJbXkoJHVzZXIsJHBhc3MsJHNlcnYsJHBvcnQpID0gKCQxLCQyLCQzLCQ0KTsKKwkJJHVzZXI9ImFub255bW91cyIgdW5sZXNzIGRlZmluZWQgJHVzZXI7CisJCW15ICRycjIgPSAiLSI7CisJCXVubGVzcygkcG9ydCkgeworCQkJJHJyMiA9ICI6cHNlcnZlcjokdXNlclxAJHNlcnY6JHJlcG8iOworCQkJJHBvcnQ9MjQwMTsKKwkJfQorCQlteSAkcnIgPSAiOnBzZXJ2ZXI6JHVzZXJcQCRzZXJ2OiRwb3J0JHJlcG8iOworCisJCXVubGVzcygkcGFzcykgeworCQkJb3BlbihILCRFTlZ7J0hPTUUnfS4iLy5jdnNwYXNzIikgYW5kIGRvIHsKKwkJCQkjIDpwc2VydmVyOmN2c0BtZWEudG10LnRlbGUuZmk6L2N2c3Jvb3Qvem1haWxlciBBaDxaCisJCQkJd2hpbGUoPEg+KSB7CisJCQkJCWNob21wOworCQkJCQlzL15cL1xkK1xzKy8vOworCQkJCQlteSAoJHcsJHApID0gc3BsaXQoL1xzLywkXywyKTsKKwkJCQkJaWYoJHcgZXEgJHJyIG9yICR3IGVxICRycjIpIHsKKwkJCQkJCSRwYXNzID0gJHA7CisJCQkJCQlsYXN0OworCQkJCQl9CisJCQkJfQorCQkJfTsKKwkJfQorCQkkcGFzcz0iQSIgdW5sZXNzICRwYXNzOworCisJCW15ICRzID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJIb3N0ID0+ICRzZXJ2LCBQZWVyUG9ydCA9PiAkcG9ydCk7CisJCWRpZSAiU29ja2V0IHRvICRzZXJ2OiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkczsKKwkJJHMtPndyaXRlKCJCRUdJTiBBVVRIIFJFUVVFU1RcbiRyZXBvXG4kdXNlclxuJHBhc3NcbkVORCBBVVRIIFJFUVVFU1RcbiIpCisJCQlvciBkaWUgIldyaXRlIHRvICRzZXJ2OiAkIVxuIjsKKwkJJHMtPmZsdXNoKCk7CisKKwkJbXkgJHJlcCA9IDwkcz47CisKKwkJaWYoJHJlcCBuZSAiSSBMT1ZFIFlPVVxuIikgeworCQkJJHJlcD0iPHVua25vd24+IiB1bmxlc3MgJHJlcDsKKwkJCWRpZSAiQXV0aFJlcGx5OiAkcmVwXG4iOworCQl9CisJCSRzZWxmLT57J3NvY2tldG8nfSA9ICRzOworCQkkc2VsZi0+eydzb2NrZXRpJ30gPSAkczsKKwl9IGVsc2UgeyAjIGxvY2FsIG9yIGV4dDogRm9yayBvZmYgb3VyIG93biBjdnMgc2VydmVyLgorCQlteSAkcHIgPSBJTzo6UGlwZS0+bmV3KCk7CisJCW15ICRwdyA9IElPOjpQaXBlLT5uZXcoKTsKKwkJbXkgJHBpZCA9IGZvcmsoKTsKKwkJZGllICJGb3JrOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQlteSAkY3ZzID0gJ2N2cyc7CisJCSRjdnMgPSAkRU5We0NWU19TRVJWRVJ9IGlmIGV4aXN0cyAkRU5We0NWU19TRVJWRVJ9OworCQlteSAkcnNoID0gJ3JzaCc7CisJCSRyc2ggPSAkRU5We0NWU19SU0h9IGlmIGV4aXN0cyAkRU5We0NWU19SU0h9OworCisJCW15IEBjdnMgPSAoJGN2cywgJ3NlcnZlcicpOworCQlteSAoJGxvY2FsLCAkdXNlciwgJGhvc3QpOworCQkkbG9jYWwgPSAkcmVwbyA9fiBzLzpsb2NhbDovLzsKKwkJaWYgKCEkbG9jYWwpIHsKKwkJICAgICRyZXBvID1+IHMvOmV4dDovLzsKKwkJICAgICRsb2NhbCA9ICEoJHJlcG8gPX4gcy9eKD86KFteXEA6XSspXEApPyhbXjpdKyk6Ly8pOworCQkgICAgKCR1c2VyLCAkaG9zdCkgPSAoJDEsICQyKTsKKwkJfQorCQlpZiAoISRsb2NhbCkgeworCQkgICAgaWYgKCR1c2VyKSB7CisJCQl1bnNoaWZ0IEBjdnMsICRyc2gsICctbCcsICR1c2VyLCAkaG9zdDsKKwkJICAgIH0gZWxzZSB7CisJCQl1bnNoaWZ0IEBjdnMsICRyc2gsICRob3N0OworCQkgICAgfQorCQl9CisKKwkJdW5sZXNzKCRwaWQpIHsKKwkJCSRwci0+d3JpdGVyKCk7CisJCQkkcHctPnJlYWRlcigpOworCQkJZHVwMigkcHctPmZpbGVubygpLDApOworCQkJZHVwMigkcHItPmZpbGVubygpLDEpOworCQkJJHByLT5jbG9zZSgpOworCQkJJHB3LT5jbG9zZSgpOworCQkJZXhlYyhAY3ZzKTsKKwkJfQorCQkkcHctPndyaXRlcigpOworCQkkcHItPnJlYWRlcigpOworCQkkc2VsZi0+eydzb2NrZXRvJ30gPSAkcHc7CisJCSRzZWxmLT57J3NvY2tldGknfSA9ICRwcjsKKwl9CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiUm9vdCAkcmVwb1xuIik7CisKKwkjIFRyaWFsIGFuZCBlcnJvciBzYXlzIHRoYXQgdGhpcyBwcm9iYWJseSBpcyB0aGUgbWluaW11bSBzZXQKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJWYWxpZC1yZXNwb25zZXMgb2sgZXJyb3IgVmFsaWQtcmVxdWVzdHMgTW9kZSBNIE1iaW5hcnkgRSBDaGVja2VkLWluIENyZWF0ZWQgVXBkYXRlZCBNZXJnZWQgUmVtb3ZlZFxuIik7CisKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJ2YWxpZC1yZXF1ZXN0c1xuIik7CisJJHNlbGYtPnsnc29ja2V0byd9LT5mbHVzaCgpOworCisJY2hvbXAobXkgJHJlcD0kc2VsZi0+cmVhZGxpbmUoKSk7CisJaWYoJHJlcCAhfiBzL15WYWxpZC1yZXF1ZXN0c1xzKi8vKSB7CisJCSRyZXA9Ijx1bmtub3duPiIgdW5sZXNzICRyZXA7CisJCWRpZSAiRXhwZWN0ZWQgVmFsaWQtcmVxdWVzdHMgZnJvbSBzZXJ2ZXIsIGJ1dCBnb3Q6ICRyZXBcbiI7CisJfQorCWNob21wKG15ICRyZXM9JHNlbGYtPnJlYWRsaW5lKCkpOworCWRpZSAidmFsaWRSZXBseTogJHJlc1xuIiBpZiAkcmVzIG5lICJvayI7CisKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJVc2VVbmNoYW5nZWRcbiIpIGlmICRyZXAgPX4gL1xiVXNlVW5jaGFuZ2VkXGIvOworCSRzZWxmLT57J3JlcG8nfSA9ICRyZXBvOworfQorCitzdWIgcmVhZGxpbmUgeworCW15KCRzZWxmKSA9IEBfOworCXJldHVybiAkc2VsZi0+eydzb2NrZXRpJ30tPmdldGxpbmUoKTsKK30KKworc3ViIF9maWxlIHsKKwkjIFJlcXVlc3QgYSBmaWxlIHdpdGggYSBnaXZlbiByZXZpc2lvbi4KKwkjIFRyaWFsIGFuZCBlcnJvciBzYXlzIHRoaXMgaXMgYSBnb29kIHdheSB0byBkbyBpdC4gOi0vCisJbXkoJHNlbGYsJGZuLCRyZXYpID0gQF87CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgLU5cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJBcmd1bWVudCAtUFxuIikgb3IgcmV0dXJuIHVuZGVmOworCSMgLWtrOiBMaW51cycgdmVyc2lvbiBkb2Vzbid0IHVzZSBpdCAtIGRlZmF1bHRzIHRvIG9mZgorCWlmICgkb3B0X2spIHsKKwkgICAgJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgLWtrXG4iKSBvciByZXR1cm4gdW5kZWY7CisJfQorCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC1yXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgJHJldlxuIikgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIkFyZ3VtZW50IC0tXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiQXJndW1lbnQgJHNlbGYtPnsnc3ViZGlyJ30vJGZuXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiRGlyZWN0b3J5IC5cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCIkc2VsZi0+eydyZXBvJ31cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkjICRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlN0aWNreSBUMS4wXG4iKSBvciByZXR1cm4gdW5kZWY7CisJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiY29cbiIpIG9yIHJldHVybiB1bmRlZjsKKwkkc2VsZi0+eydzb2NrZXRvJ30tPmZsdXNoKCkgb3IgcmV0dXJuIHVuZGVmOworCSRzZWxmLT57J2xpbmVzJ30gPSAwOworCXJldHVybiAxOworfQorc3ViIF9saW5lIHsKKwkjIFJlYWQgYSBsaW5lIGZyb20gdGhlIHNlcnZlci4KKwkjIC4uLiBleGNlcHQgdGhhdCAnbGluZScgbWF5IGJlIGFuIGVudGlyZSBmaWxlLiA7LSkKKwlteSgkc2VsZiwgJGZoKSA9IEBfOworCWRpZSAiTm90IGluIGxpbmVzIiB1bmxlc3MgZGVmaW5lZCAkc2VsZi0+eydsaW5lcyd9OworCisJbXkgJGxpbmU7CisJbXkgJHJlcz0wOworCXdoaWxlKGRlZmluZWQoJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKSkpIHsKKwkJIyBNIFUgZ251cGctY3ZzLXJlcC9BVVRIT1JTCisJCSMgVXBkYXRlZCBnbnVwZy1jdnMtcmVwLworCQkjIC9kYXRlbi9zcmMvcnN5bmMvZ251cGctY3ZzLXJlcC9BVVRIT1JTCisJCSMgL0FVVEhPUlMvMS4xLy8vVDEuMQorCQkjIHU9cncsZz1ydyxvPXJ3CisJCSMgMAorCQkjIG9rCisKKwkJaWYoJGxpbmUgPX4gcy9eKD86Q3JlYXRlZHxVcGRhdGVkKSAvLykgeworCQkJJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgIyBwYXRoCisJCQkkbGluZSA9ICRzZWxmLT5yZWFkbGluZSgpOyAjIEVudHJpZXMgbGluZQorCQkJbXkgJG1vZGUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgY2hvbXAgJG1vZGU7CisJCQkkc2VsZi0+eydtb2RlJ30gPSAkbW9kZTsKKwkJCWRlZmluZWQgKG15ICRjbnQgPSAkc2VsZi0+cmVhZGxpbmUoKSkKKwkJCQlvciBkaWUgIkVPRiBmcm9tIHNlcnZlciBhZnRlciAnQ2hhbmdlZCdcbiI7CisJCQljaG9tcCAkY250OworCQkJZGllICJEdWg6IEZpbGVzaXplICRjbnQiIGlmICRjbnQgIX4gL15cZCskLzsKKwkJCSRsaW5lPSIiOworCQkJJHJlcyA9ICRzZWxmLT5fZmV0Y2hmaWxlKCRmaCwgJGNudCk7CisJCX0gZWxzaWYoJGxpbmUgPX4gcy9eIC8vKSB7CisJCQlwcmludCAkZmggJGxpbmU7CisJCQkkcmVzICs9IGxlbmd0aCgkbGluZSk7CisJCX0gZWxzaWYoJGxpbmUgPX4gL15NXGIvKSB7CisJCQkjIG91dHB1dCwgZG8gbm90aGluZworCQl9IGVsc2lmKCRsaW5lID1+IC9eTWJpbmFyeVxiLykgeworCQkJbXkgJGNudDsKKwkJCWRpZSAiRU9GIGZyb20gc2VydmVyIGFmdGVyICdNYmluYXJ5JyIgdW5sZXNzIGRlZmluZWQgKCRjbnQgPSAkc2VsZi0+cmVhZGxpbmUoKSk7CisJCQljaG9tcCAkY250OworCQkJZGllICJEdWg6IE1iaW5hcnkgJGNudCIgaWYgJGNudCAhfiAvXlxkKyQvIG9yICRjbnQ8MTsKKwkJCSRsaW5lPSIiOworCQkJJHJlcyArPSAkc2VsZi0+X2ZldGNoZmlsZSgkZmgsICRjbnQpOworCQl9IGVsc2UgeworCQkJY2hvbXAgJGxpbmU7CisJCQlpZigkbGluZSBlcSAib2siKSB7CisJCQkJIyBwcmludCBTVERFUlIgIlM6IG9rICgiLmxlbmd0aCgkcmVzKS4iKVxuIjsKKwkJCQlyZXR1cm4gJHJlczsKKwkJCX0gZWxzaWYoJGxpbmUgPX4gcy9eRSAvLykgeworCQkJCSMgcHJpbnQgU1RERVJSICJTOiAkbGluZVxuIjsKKwkJCX0gZWxzaWYoJGxpbmUgPX4gL14oUmVtb3ZlLWVudHJ5fFJlbW92ZWQpIC9pKSB7CisJCQkJJGxpbmUgPSAkc2VsZi0+cmVhZGxpbmUoKTsgIyBmaWxlbmFtZQorCQkJCSRsaW5lID0gJHNlbGYtPnJlYWRsaW5lKCk7ICMgT0sKKwkJCQljaG9tcCAkbGluZTsKKwkJCQlkaWUgIlVua25vd246ICRsaW5lIiBpZiAkbGluZSBuZSAib2siOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZSB7CisJCQkJZGllICJVbmtub3duOiAkbGluZVxuIjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gdW5kZWY7Cit9CitzdWIgZmlsZSB7CisJbXkoJHNlbGYsJGZuLCRyZXYpID0gQF87CisJbXkgJHJlczsKKworCW15ICgkZmgsICRuYW1lKSA9IHRlbXBmaWxlKCdnaXRjdnMuWFhYWFhYJywgCisJCSAgICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCksIFVOTElOSyA9PiAxKTsKKworCSRzZWxmLT5fZmlsZSgkZm4sJHJldikgYW5kICRyZXMgPSAkc2VsZi0+X2xpbmUoJGZoKTsKKworCWlmICghZGVmaW5lZCAkcmVzKSB7CisJICAgIHByaW50IFNUREVSUiAiU2VydmVyIGhhcyBnb25lIGF3YXkgd2hpbGUgZmV0Y2hpbmcgJGZuICRyZXYsIHJldHJ5aW5nLi4uXG4iOworCSAgICB0cnVuY2F0ZSAkZmgsIDA7CisJICAgICRzZWxmLT5jb25uKCk7CisJICAgICRzZWxmLT5fZmlsZSgkZm4sJHJldikgb3IgZGllICJObyBmaWxlIGNvbW1hbmQgc2VuZCI7CisJICAgICRyZXMgPSAkc2VsZi0+X2xpbmUoJGZoKTsKKwkgICAgZGllICJSZXRyeSBmYWlsZWQiIHVubGVzcyBkZWZpbmVkICRyZXM7CisJfQorCWNsb3NlICgkZmgpOworCisJcmV0dXJuICgkbmFtZSwgJHJlcyk7Cit9CitzdWIgX2ZldGNoZmlsZSB7CisJbXkgKCRzZWxmLCAkZmgsICRjbnQpID0gQF87CisJbXkgJHJlcyA9IDA7CisJbXkgJGJ1ZnNpemUgPSAxMDI0ICogMTAyNDsKKwl3aGlsZSgkY250KSB7CisJICAgIGlmICgkYnVmc2l6ZSA+ICRjbnQpIHsKKwkJJGJ1ZnNpemUgPSAkY250OworCSAgICB9CisJICAgIG15ICRidWY7CisJICAgIG15ICRudW0gPSAkc2VsZi0+eydzb2NrZXRpJ30tPnJlYWQoJGJ1ZiwkYnVmc2l6ZSk7CisJICAgIGRpZSAiU2VydmVyOiBGaWxlc2l6ZSAkY250OiAkbnVtOiAkIVxuIiBpZiBub3QgZGVmaW5lZCAkbnVtIG9yICRudW08PTA7CisJICAgIHByaW50ICRmaCAkYnVmOworCSAgICAkcmVzICs9ICRudW07CisJICAgICRjbnQgLT0gJG51bTsKKwl9CisJcmV0dXJuICRyZXM7Cit9CisKKworcGFja2FnZSBtYWluOworCitteSAkY3ZzID0gQ1ZTY29ubi0+bmV3KCRvcHRfZCwgJGN2c190cmVlKTsKKworCitzdWIgcGRhdGUoJCkgeworCW15KCRkKSA9IEBfOworCW0jKFxkezIsNH0pLyhcZFxkKS8oXGRcZClccyhcZFxkKTooXGRcZCkoPzo6KFxkXGQpKT8jCisJCW9yIGRpZSAiVW5wYXJzZWFibGUgZGF0ZTogJGRcbiI7CisJbXkgJHk9JDE7ICR5LT0xOTAwIGlmICR5PjE5MDA7CisJcmV0dXJuIHRpbWVnbSgkNnx8MCwkNSwkNCwkMywkMi0xLCR5KTsKK30KKworc3ViIHBtb2RlKCQpIHsKKwlteSgkbW9kZSkgPSBAXzsKKwlteSAkbSA9IDA7CisJbXkgJG1tID0gMDsKKwlteSAkdW0gPSAwOworCWZvciBteSAkeChzcGxpdCgvLywkbW9kZSkpIHsKKwkJaWYoJHggZXEgIiwiKSB7CisJCQkkbSB8PSAkbW0mJHVtOworCQkJJG1tID0gMDsKKwkJCSR1bSA9IDA7CisJCX0gZWxzaWYoJHggZXEgInUiKSB7ICR1bSB8PSAwNzAwOworCQl9IGVsc2lmKCR4IGVxICJnIikgeyAkdW0gfD0gMDA3MDsKKwkJfSBlbHNpZigkeCBlcSAibyIpIHsgJHVtIHw9IDAwMDc7CisJCX0gZWxzaWYoJHggZXEgInIiKSB7ICRtbSB8PSAwNDQ0OworCQl9IGVsc2lmKCR4IGVxICJ3IikgeyAkbW0gfD0gMDIyMjsKKwkJfSBlbHNpZigkeCBlcSAieCIpIHsgJG1tIHw9IDAxMTE7CisJCX0gZWxzaWYoJHggZXEgIj0iKSB7ICMgZG8gbm90aGluZworCQl9IGVsc2UgeyBkaWUgIlVua25vd24gbW9kZTogJG1vZGVcbiI7CisJCX0KKwl9CisJJG0gfD0gJG1tJiR1bTsKKwlyZXR1cm4gJG07Cit9CisKK3N1YiBnZXR3ZCgpIHsKKwlteSAkcHdkID0gYHB3ZGA7CisJY2hvbXAgJHB3ZDsKKwlyZXR1cm4gJHB3ZDsKK30KKworc3ViIGlzX3NoYTEgeworCW15ICRzID0gc2hpZnQ7CisJcmV0dXJuICRzID1+IC9eW2EtZjAtOV17NDB9JC87Cit9CisKK3N1YiBnZXRfaGVhZHJlZiAoJCQpIHsKKyAgICBteSAkbmFtZSAgICA9IHNoaWZ0OworICAgIG15ICRnaXRfZGlyID0gc2hpZnQ7IAorICAgIAorICAgIG15ICRmID0gIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG5hbWUiOworICAgIGlmKG9wZW4obXkgJGZoLCAkZikpIHsKKwkgICAgY2hvbXAobXkgJHIgPSA8JGZoPik7CisJICAgIGlzX3NoYTEoJHIpIG9yIGRpZSAiQ2Fubm90IGdldCBoZWFkIGlkIGZvciAkbmFtZSAoJHIpOiAkISI7CisJICAgIHJldHVybiAkcjsKKyAgICB9CisgICAgZGllICJ1bmFibGUgdG8gb3BlbiAkZjogJCEiIHVubGVzcyAkISA9PSBQT1NJWDo6RU5PRU5UOworICAgIHJldHVybiB1bmRlZjsKK30KKworLWQgJGdpdF90cmVlCisJb3IgbWtkaXIoJGdpdF90cmVlLDA3NzcpCisJb3IgZGllICJDb3VsZCBub3QgY3JlYXRlICRnaXRfdHJlZTogJCEiOworY2hkaXIoJGdpdF90cmVlKTsKKworbXkgJGxhc3RfYnJhbmNoID0gIiI7CitteSAkb3JpZ19icmFuY2ggPSAiIjsKK215ICVicmFuY2hfZGF0ZTsKK215ICR0aXBfYXRfc3RhcnQgPSB1bmRlZjsKKworbXkgJGdpdF9kaXIgPSAkRU5WeyJHSVRfRElSIn0gfHwgIi5naXQiOworJGdpdF9kaXIgPSBnZXR3ZCgpLiIvIi4kZ2l0X2RpciB1bmxlc3MgJGdpdF9kaXIgPX4gbSNeLyM7CiskRU5WeyJHSVRfRElSIn0gPSAkZ2l0X2RpcjsKK215ICRvcmlnX2dpdF9pbmRleDsKKyRvcmlnX2dpdF9pbmRleCA9ICRFTlZ7R0lUX0lOREVYX0ZJTEV9IGlmIGV4aXN0cyAkRU5We0dJVF9JTkRFWF9GSUxFfTsKKworbXkgJWluZGV4OyAjIGhvbGRzIGZpbGVuYW1lcyBvZiBvbmUgaW5kZXggcGVyIGJyYW5jaAorCit1bmxlc3MoLWQgJGdpdF9kaXIpIHsKKwlzeXN0ZW0oImdpdC1pbml0LWRiIik7CisJZGllICJDYW5ub3QgaW5pdCB0aGUgR0lUIGRiIGF0ICRnaXRfdHJlZTogJD9cbiIgaWYgJD87CisJc3lzdGVtKCJnaXQtcmVhZC10cmVlIik7CisJZGllICJDYW5ub3QgaW5pdCBhbiBlbXB0eSB0cmVlOiAkP1xuIiBpZiAkPzsKKworCSRsYXN0X2JyYW5jaCA9ICRvcHRfbzsKKwkkb3JpZ19icmFuY2ggPSAiIjsKK30gZWxzZSB7CisJLWYgIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG9wdF9vIgorCQlvciBkaWUgIkJyYW5jaCAnJG9wdF9vJyBkb2VzIG5vdCBleGlzdC5cbiIuCisJCSAgICAgICAiRWl0aGVyIHVzZSB0aGUgY29ycmVjdCAnLW8gYnJhbmNoJyBvcHRpb24sXG4iLgorCQkgICAgICAgIm9yIGltcG9ydCB0byBhIG5ldyByZXBvc2l0b3J5LlxuIjsKKworCW9wZW4oRiwgImdpdC1zeW1ib2xpYy1yZWYgSEVBRCB8Iikgb3IKKwkJZGllICJDYW5ub3QgcnVuIGdpdC1zeW1ib2xpYy1yZWY6ICQhXG4iOworCWNob21wICgkbGFzdF9icmFuY2ggPSA8Rj4pOworCSRsYXN0X2JyYW5jaCA9IGJhc2VuYW1lKCRsYXN0X2JyYW5jaCk7CisJY2xvc2UoRik7CisJdW5sZXNzKCRsYXN0X2JyYW5jaCkgeworCQl3YXJuICJDYW5ub3QgcmVhZCB0aGUgbGFzdCBicmFuY2ggbmFtZTogJCEgLS0gYXNzdW1pbmcgJ21hc3RlcidcbiI7CisJCSRsYXN0X2JyYW5jaCA9ICJtYXN0ZXIiOworCX0KKwkkb3JpZ19icmFuY2ggPSAkbGFzdF9icmFuY2g7CisJJHRpcF9hdF9zdGFydCA9IGBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQURgOworCisJIyBHZXQgdGhlIGxhc3QgaW1wb3J0IHRpbWVzdGFtcHMKKwlvcGVuZGlyKEQsIiRnaXRfZGlyL3JlZnMvaGVhZHMiKTsKKwl3aGlsZShkZWZpbmVkKG15ICRoZWFkID0gcmVhZGRpcihEKSkpIHsKKwkJbmV4dCBpZiAkaGVhZCA9fiAvXlwuLzsKKwkJb3BlbihGLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRoZWFkIikKKwkJCW9yIGRpZSAiQmFkIGhlYWQgYnJhbmNoOiAkaGVhZDogJCFcbiI7CisJCWNob21wKG15ICRmdGFnID0gPEY+KTsKKwkJY2xvc2UoRik7CisJCW9wZW4oRiwiZ2l0LWNhdC1maWxlIGNvbW1pdCAkZnRhZyB8Iik7CisJCXdoaWxlKDxGPikgeworCQkJbmV4dCB1bmxlc3MgL15hdXRob3Jccy4qXHMoXGQrKVxzWy0rXVxkezR9JC87CisJCQkkYnJhbmNoX2RhdGV7JGhlYWR9ID0gJDE7CisJCQlsYXN0OworCQl9CisJCWNsb3NlKEYpOworCX0KKwljbG9zZWRpcihEKTsKK30KKworLWQgJGdpdF9kaXIKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgZ2l0IHN1YmRpciAoJGdpdF9kaXIpLlxuIjsKKworIyBub3cgd2UgcmVhZCAoYW5kIHBvc3NpYmx5IHNhdmUpIGF1dGhvci1pbmZvIGFzIHdlbGwKKy1mICIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIgYW5kCisgIHJlYWRfYXV0aG9yX2luZm8oIiRnaXRfZGlyL2N2cy1hdXRob3JzIik7CitpZiAoJG9wdF9BKSB7CisJcmVhZF9hdXRob3JfaW5mbygkb3B0X0EpOworCXdyaXRlX2F1dGhvcl9pbmZvKCIkZ2l0X2Rpci9jdnMtYXV0aG9ycyIpOworfQorCisKKyMKKyMgcnVuIGN2c3BzIGludG8gYSBmaWxlIHVubGVzcyB3ZSBhcmUgZ2V0dGluZworIyBpdCBwYXNzZWQgYXMgYSBmaWxlIHZpYSAkb3B0X1AKKyMKK3VubGVzcyAoJG9wdF9QKSB7CisJcHJpbnQgIlJ1bm5pbmcgY3ZzcHMuLi5cbiIgaWYgJG9wdF92OworCW15ICRwaWQgPSBvcGVuKENWU1BTLCItfCIpOworCWRpZSAiQ2Fubm90IGZvcms6ICQhXG4iIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJdW5sZXNzKCRwaWQpIHsKKwkJbXkgQG9wdDsKKwkJQG9wdCA9IHNwbGl0KC8sLywkb3B0X3ApIGlmIGRlZmluZWQgJG9wdF9wOworCQl1bnNoaWZ0IEBvcHQsICcteicsICRvcHRfeiBpZiBkZWZpbmVkICRvcHRfejsKKwkJdW5zaGlmdCBAb3B0LCAnLXEnICAgICAgICAgdW5sZXNzIGRlZmluZWQgJG9wdF92OworCQl1bmxlc3MgKGRlZmluZWQoJG9wdF9wKSAmJiAkb3B0X3AgPX4gbS8tLW5vLWN2cy1kaXJlY3QvKSB7CisJCQlwdXNoIEBvcHQsICctLWN2cy1kaXJlY3QnOworCQl9CisJCWV4ZWMoImN2c3BzIiwiLS1ub3JjIixAb3B0LCItdSIsIi1BIiwnLS1yb290Jywkb3B0X2QsJGN2c190cmVlKTsKKwkJZGllICJDb3VsZCBub3Qgc3RhcnQgY3ZzcHM6ICQhXG4iOworCX0KKwlteSAoJGN2c3BzZmgsICRjdnNwc2ZpbGUpID0gdGVtcGZpbGUoJ2dpdFhYWFhYWCcsIFNVRkZJWCA9PiAnLmN2c3BzJywKKwkJCQkJICAgICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCkpOworCXdoaWxlICg8Q1ZTUFM+KSB7CisJICAgIHByaW50ICRjdnNwc2ZoICRfOworCX0KKwljbG9zZSBDVlNQUzsKKwljbG9zZSAkY3ZzcHNmaDsKKwkkb3B0X1AgPSAkY3ZzcHNmaWxlOworfQorCisKK29wZW4oQ1ZTLCAiPCRvcHRfUCIpIG9yIGRpZSAkITsKKworIyMgY3ZzcHMgb3V0cHV0OgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI1BhdGNoU2V0IDMxNAorI0RhdGU6IDE5OTkvMDkvMTggMTM6MDM6NTkKKyNBdXRob3I6IHdrb2NoCisjQnJhbmNoOiBTVEFCTEUtQlJBTkNILTEtMAorI0FuY2VzdG9yIGJyYW5jaDogSEVBRAorI1RhZzogKG5vbmUpCisjTG9nOgorIyAgICBTZWUgQ2hhbmdlTG9nOiBTYXQgU2VwIDE4IDEzOjAzOjI4IENFU1QgMTk5OSAgV2VybmVyIEtvY2gKKyNNZW1iZXJzOgorIwlSRUFETUU6MS41Ny0+MS41Ny4yLjEKKyMJVkVSU0lPTjoxLjk2LT4xLjk2LjIuMQorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitteSAkc3RhdGUgPSAwOworCitzdWIgdXBkYXRlX2luZGV4IChcQFxAKSB7CisJbXkgJG9sZCA9IHNoaWZ0OworCW15ICRuZXcgPSBzaGlmdDsKKwlvcGVuKG15ICRmaCwgJ3wtJywgcXcoZ2l0LXVwZGF0ZS1pbmRleCAteiAtLWluZGV4LWluZm8pKQorCQlvciBkaWUgInVuYWJsZSB0byBvcGVuIGdpdC11cGRhdGUtaW5kZXg6ICQhIjsKKwlwcmludCAkZmgKKwkJKG1hcCB7ICIwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcdCRfXDAiIH0KKwkJCUAkb2xkKSwKKwkJKG1hcCB7ICcxMDAnIC4gc3ByaW50ZignJW8nLCAkXy0+WzBdKSAuICIgJF8tPlsxXVx0JF8tPlsyXVwwIiB9CisJCQlAJG5ldykKKwkJb3IgZGllICJ1bmFibGUgdG8gd3JpdGUgdG8gZ2l0LXVwZGF0ZS1pbmRleDogJCEiOworCWNsb3NlICRmaAorCQlvciBkaWUgInVuYWJsZSB0byB3cml0ZSB0byBnaXQtdXBkYXRlLWluZGV4OiAkISI7CisJJD8gYW5kIGRpZSAiZ2l0LXVwZGF0ZS1pbmRleCByZXBvcnRlZCBlcnJvcjogJD8iOworfQorCitzdWIgd3JpdGVfdHJlZSAoKSB7CisJb3BlbihteSAkZmgsICctfCcsIHF3KGdpdC13cml0ZS10cmVlKSkKKwkJb3IgZGllICJ1bmFibGUgdG8gb3BlbiBnaXQtd3JpdGUtdHJlZTogJCEiOworCWNob21wKG15ICR0cmVlID0gPCRmaD4pOworCWlzX3NoYTEoJHRyZWUpCisJCW9yIGRpZSAiQ2Fubm90IGdldCB0cmVlIGlkICgkdHJlZSk6ICQhIjsKKwljbG9zZSgkZmgpCisJCW9yIGRpZSAiRXJyb3IgcnVubmluZyBnaXQtd3JpdGUtdHJlZTogJD9cbiI7CisJcHJpbnQgIlRyZWUgSUQgJHRyZWVcbiIgaWYgJG9wdF92OworCXJldHVybiAkdHJlZTsKK30KKworbXkoJHBhdGNoc2V0LCRkYXRlLCRhdXRob3JfbmFtZSwkYXV0aG9yX2VtYWlsLCRicmFuY2gsJGFuY2VzdG9yLCR0YWcsJGxvZ21zZyk7CitteShAb2xkLEBuZXcsQHNraXBwZWQsJWlnbm9yZWJyYW5jaCk7CisKKyMgY29tbWl0cyB0aGF0IGN2c3BzIGNhbm5vdCBwbGFjZSBhbnl3aGVyZS4uLgorJGlnbm9yZWJyYW5jaHsnI0NWU1BTX05PX0JSQU5DSCd9ID0gMTsKKworc3ViIGNvbW1pdCB7CisJaWYgKCRicmFuY2ggZXEgJG9wdF9vICYmICEkaW5kZXh7YnJhbmNofSAmJiAhZ2V0X2hlYWRyZWYoJGJyYW5jaCwgJGdpdF9kaXIpKSB7CisJICAgICMgbG9va3MgbGlrZSBhbiBpbml0aWFsIGNvbW1pdAorCSAgICAjIHVzZSB0aGUgaW5kZXggcHJpbWVkIGJ5IGdpdC1pbml0LWRiCisJICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJy5naXQvaW5kZXgnOworCSAgICAkaW5kZXh7JGJyYW5jaH0gPSAnLmdpdC9pbmRleCc7CisJfSBlbHNlIHsKKwkgICAgIyB1c2UgYW4gaW5kZXggcGVyIGJyYW5jaCB0byBzcGVlZCB1cAorCSAgICAjIGltcG9ydHMgb2YgcHJvamVjdHMgd2l0aCBtYW55IGJyYW5jaGVzCisJICAgIHVubGVzcyAoJGluZGV4eyRicmFuY2h9KSB7CisJCSRpbmRleHskYnJhbmNofSA9IHRtcG5hbSgpOworCQkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRpbmRleHskYnJhbmNofTsKKwkJaWYgKCRhbmNlc3RvcikgeworCQkgICAgc3lzdGVtKCJnaXQtcmVhZC10cmVlIiwgJGFuY2VzdG9yKTsKKwkJfSBlbHNlIHsKKwkJICAgIHN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIsICRicmFuY2gpOworCQl9CisJCWRpZSAicmVhZC10cmVlIGZhaWxlZDogJD9cbiIgaWYgJD87CisJICAgIH0KKwl9CisgICAgICAgICRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJGluZGV4eyRicmFuY2h9OworCisJdXBkYXRlX2luZGV4KEBvbGQsIEBuZXcpOworCUBvbGQgPSBAbmV3ID0gKCk7CisJbXkgJHRyZWUgPSB3cml0ZV90cmVlKCk7CisJbXkgJHBhcmVudCA9IGdldF9oZWFkcmVmKCRsYXN0X2JyYW5jaCwgJGdpdF9kaXIpOworCXByaW50ICJQYXJlbnQgSUQgIiAuICgkcGFyZW50ID8gJHBhcmVudCA6ICIoZW1wdHkpIikgLiAiXG4iIGlmICRvcHRfdjsKKworCW15IEBjb21taXRfYXJnczsKKwlwdXNoIEBjb21taXRfYXJncywgKCItcCIsICRwYXJlbnQpIGlmICRwYXJlbnQ7CisKKwkjIGxvb3NlIGRldGVjdGlvbiBvZiBtZXJnZXMKKwkjIGJhc2VkIG9uIHRoZSBjb21taXQgbXNnCisJZm9yZWFjaCBteSAkcnggKEBtZXJnZXJ4KSB7CisJCW5leHQgdW5sZXNzICRsb2dtc2cgPX4gJHJ4ICYmICQxOworCQlteSAkbXBhcmVudCA9ICQxIGVxICdIRUFEJyA/ICRvcHRfbyA6ICQxOworCQlpZihteSAkc2hhMSA9IGdldF9oZWFkcmVmKCRtcGFyZW50LCAkZ2l0X2RpcikpIHsKKwkJCXB1c2ggQGNvbW1pdF9hcmdzLCAnLXAnLCAkbXBhcmVudDsKKwkJCXByaW50ICJNZXJnZSBwYXJlbnQgYnJhbmNoOiAkbXBhcmVudFxuIiBpZiAkb3B0X3Y7CisJCX0KKwl9CisKKwlteSAkY29tbWl0X2RhdGUgPSBzdHJmdGltZSgiKzAwMDAgJVktJW0tJWQgJUg6JU06JVMiLGdtdGltZSgkZGF0ZSkpOworCSRFTlZ7R0lUX0FVVEhPUl9OQU1FfSA9ICRhdXRob3JfbmFtZTsKKwkkRU5We0dJVF9BVVRIT1JfRU1BSUx9ID0gJGF1dGhvcl9lbWFpbDsKKwkkRU5We0dJVF9BVVRIT1JfREFURX0gPSAkY29tbWl0X2RhdGU7CisJJEVOVntHSVRfQ09NTUlUVEVSX05BTUV9ID0gJGF1dGhvcl9uYW1lOworCSRFTlZ7R0lUX0NPTU1JVFRFUl9FTUFJTH0gPSAkYXV0aG9yX2VtYWlsOworCSRFTlZ7R0lUX0NPTU1JVFRFUl9EQVRFfSA9ICRjb21taXRfZGF0ZTsKKwlteSAkcGlkID0gb3BlbjIobXkgJGNvbW1pdF9yZWFkLCBteSAkY29tbWl0X3dyaXRlLAorCQknZ2l0LWNvbW1pdC10cmVlJywgJHRyZWUsIEBjb21taXRfYXJncyk7CisKKwkjIGNvbXBhdGliaWxpdHkgd2l0aCBnaXQyY3ZzCisJc3Vic3RyKCRsb2dtc2csMzI3NjcpID0gIiIgaWYgbGVuZ3RoKCRsb2dtc2cpID4gMzI3Njc7CisJJGxvZ21zZyA9fiBzL1tcc1xuXStcei8vOworCisJaWYgKEBza2lwcGVkKSB7CisJICAgICRsb2dtc2cgLj0gIlxuXG5cblNLSVBQRUQ6XG5cdCI7CisJICAgICRsb2dtc2cgLj0gam9pbigiXG5cdCIsIEBza2lwcGVkKSAuICJcbiI7CisJICAgIEBza2lwcGVkID0gKCk7CisJfQorCisJcHJpbnQoJGNvbW1pdF93cml0ZSAiJGxvZ21zZ1xuIikgJiYgY2xvc2UoJGNvbW1pdF93cml0ZSkKKwkJb3IgZGllICJFcnJvciB3cml0aW5nIHRvIGdpdC1jb21taXQtdHJlZTogJCFcbiI7CisKKwlwcmludCAiQ29tbWl0dGVkIHBhdGNoICRwYXRjaHNldCAoJGJyYW5jaCAkY29tbWl0X2RhdGUpXG4iIGlmICRvcHRfdjsKKwljaG9tcChteSAkY2lkID0gPCRjb21taXRfcmVhZD4pOworCWlzX3NoYTEoJGNpZCkgb3IgZGllICJDYW5ub3QgZ2V0IGNvbW1pdCBpZCAoJGNpZCk6ICQhXG4iOworCXByaW50ICJDb21taXQgSUQgJGNpZFxuIiBpZiAkb3B0X3Y7CisJY2xvc2UoJGNvbW1pdF9yZWFkKTsKKworCXdhaXRwaWQoJHBpZCwwKTsKKwlkaWUgIkVycm9yIHJ1bm5pbmcgZ2l0LWNvbW1pdC10cmVlOiAkP1xuIiBpZiAkPzsKKworCXN5c3RlbSgiZ2l0LXVwZGF0ZS1yZWYgcmVmcy9oZWFkcy8kYnJhbmNoICRjaWQiKSA9PSAwCisJCW9yIGRpZSAiQ2Fubm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoIGZvciB1cGRhdGU6ICQhXG4iOworCisJaWYoJHRhZykgeworCQlteSgkaW4sICRvdXQpID0gKCcnLCcnKTsKKwkgICAgICAgIG15KCR4dGFnKSA9ICR0YWc7CisJCSR4dGFnID1+IHMvXHMrXCpcKi4qJC8vOyAjIFJlbW92ZSBzdHVmZiBsaWtlICoqIElOVkFMSUQgKiogYW5kICoqIEZVTktZICoqCisJCSR4dGFnID1+IHRyL18vXC4vIGlmICggJG9wdF91ICk7CisJCSR4dGFnID1+IHMvW1wvXS8kb3B0X3MvZzsKKwkJCisJCW15ICRwaWQgPSBvcGVuMigkaW4sICRvdXQsICdnaXQtbWt0YWcnKTsKKwkJcHJpbnQgJG91dCAib2JqZWN0ICRjaWRcbiIuCisJCSAgICAidHlwZSBjb21taXRcbiIuCisJCSAgICAidGFnICR4dGFnXG4iLgorCQkgICAgInRhZ2dlciAkYXV0aG9yX25hbWUgPCRhdXRob3JfZW1haWw+XG4iCisJCSAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnIG9iamVjdCAkeHRhZzogJCFcbiI7CisJCWNsb3NlKCRvdXQpCisJCSAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgdGFnIG9iamVjdCAkeHRhZzogJCFcbiI7CisKKwkJbXkgJHRhZ29iaiA9IDwkaW4+OworCQljaG9tcCAkdGFnb2JqOworCisJCWlmICggIWNsb3NlKCRpbikgb3Igd2FpdHBpZCgkcGlkLCAwKSAhPSAkcGlkIG9yCisJCSAgICAgJD8gIT0gMCBvciAkdGFnb2JqICF+IC9eWzAxMjM0NTY3ODlhYmNkZWZdezQwfSQvICkgeworCQkgICAgZGllICJDYW5ub3QgY3JlYXRlIHRhZyBvYmplY3QgJHh0YWc6ICQhXG4iOworCSAgICAgICAgfQorCQkKKworCQlvcGVuKEMsIj4kZ2l0X2Rpci9yZWZzL3RhZ3MvJHh0YWciKQorCQkJb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyAkeHRhZzogJCFcbiI7CisJCXByaW50IEMgIiR0YWdvYmpcbiIKKwkJCW9yIGRpZSAiQ2Fubm90IHdyaXRlIHRhZyAkeHRhZzogJCFcbiI7CisJCWNsb3NlKEMpCisJCQlvciBkaWUgIkNhbm5vdCB3cml0ZSB0YWcgJHh0YWc6ICQhXG4iOworCisJCXByaW50ICJDcmVhdGVkIHRhZyAnJHh0YWcnIG9uICckYnJhbmNoJ1xuIiBpZiAkb3B0X3Y7CisJfQorfTsKKworbXkgJGNvbW1pdGNvdW50ID0gMTsKK3doaWxlKDxDVlM+KSB7CisJY2hvbXA7CisJaWYoJHN0YXRlID09IDAgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYoJHN0YXRlID09IDApIHsKKwkJJHN0YXRlID0gMTsKKwkJcmVkbzsKKwl9IGVsc2lmKCgkc3RhdGU9PTAgb3IgJHN0YXRlPT0xKSBhbmQgcy9eUGF0Y2hTZXRccysvLykgeworCQkkcGF0Y2hzZXQgPSAwKyRfOworCQkkc3RhdGU9MjsKKwl9IGVsc2lmKCRzdGF0ZSA9PSAyIGFuZCBzL15EYXRlOlxzKy8vKSB7CisJCSRkYXRlID0gcGRhdGUoJF8pOworCQl1bmxlc3MoJGRhdGUpIHsKKwkJCXByaW50IFNUREVSUiAiQ291bGQgbm90IHBhcnNlIGRhdGU6ICRfXG4iOworCQkJJHN0YXRlPTA7CisJCQluZXh0OworCQl9CisJCSRzdGF0ZT0zOworCX0gZWxzaWYoJHN0YXRlID09IDMgYW5kIHMvXkF1dGhvcjpccysvLykgeworCQlzL1xzKyQvLzsKKwkJaWYgKC9eKC4qPylccys8KC4qKT4vKSB7CisJCSAgICAoJGF1dGhvcl9uYW1lLCAkYXV0aG9yX2VtYWlsKSA9ICgkMSwgJDIpOworCQl9IGVsc2lmICgkY29udl9hdXRob3JfbmFtZXskX30pIHsKKwkJCSRhdXRob3JfbmFtZSA9ICRjb252X2F1dGhvcl9uYW1leyRffTsKKwkJCSRhdXRob3JfZW1haWwgPSAkY29udl9hdXRob3JfZW1haWx7JF99OworCQl9IGVsc2UgeworCQkgICAgJGF1dGhvcl9uYW1lID0gJGF1dGhvcl9lbWFpbCA9ICRfOworCQl9CisJCSRzdGF0ZSA9IDQ7CisJfSBlbHNpZigkc3RhdGUgPT0gNCBhbmQgcy9eQnJhbmNoOlxzKy8vKSB7CisJCXMvXHMrJC8vOworCQlzL1tcL10vJG9wdF9zL2c7CisJCSRicmFuY2ggPSAkXzsKKwkJJHN0YXRlID0gNTsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA1IGFuZCBzL15BbmNlc3RvciBicmFuY2g6XHMrLy8pIHsKKwkJcy9ccyskLy87CisJCSRhbmNlc3RvciA9ICRfOworCQkkYW5jZXN0b3IgPSAkb3B0X28gaWYgJGFuY2VzdG9yIGVxICJIRUFEIjsKKwkJJHN0YXRlID0gNjsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA1KSB7CisJCSRhbmNlc3RvciA9IHVuZGVmOworCQkkc3RhdGUgPSA2OworCQlyZWRvOworCX0gZWxzaWYoJHN0YXRlID09IDYgYW5kIHMvXlRhZzpccysvLykgeworCQlzL1xzKyQvLzsKKwkJaWYoJF8gZXEgIihub25lKSIpIHsKKwkJCSR0YWcgPSB1bmRlZjsKKwkJfSBlbHNlIHsKKwkJCSR0YWcgPSAkXzsKKwkJfQorCQkkc3RhdGUgPSA3OworCX0gZWxzaWYoJHN0YXRlID09IDcgYW5kIC9eTG9nOi8pIHsKKwkJJGxvZ21zZyA9ICIiOworCQkkc3RhdGUgPSA4OworCX0gZWxzaWYoJHN0YXRlID09IDggYW5kIC9eTWVtYmVyczovKSB7CisJCSRicmFuY2ggPSAkb3B0X28gaWYgJGJyYW5jaCBlcSAiSEVBRCI7CisJCWlmKGRlZmluZWQgJGJyYW5jaF9kYXRleyRicmFuY2h9IGFuZCAkYnJhbmNoX2RhdGV7JGJyYW5jaH0gPj0gJGRhdGUpIHsKKwkJCSMgc2tpcAorCQkJcHJpbnQgInNraXAgcGF0Y2hzZXQgJHBhdGNoc2V0OiAkZGF0ZSBiZWZvcmUgJGJyYW5jaF9kYXRleyRicmFuY2h9XG4iIGlmICRvcHRfdjsKKwkJCSRzdGF0ZSA9IDExOworCQkJbmV4dDsKKwkJfQorCQlpZiAoZXhpc3RzICRpZ25vcmVicmFuY2h7JGJyYW5jaH0pIHsKKwkJCXByaW50IFNUREVSUiAiU2tpcHBpbmcgJGJyYW5jaFxuIjsKKwkJCSRzdGF0ZSA9IDExOworCQkJbmV4dDsKKwkJfQorCQlpZigkYW5jZXN0b3IpIHsKKwkJCWlmKCRhbmNlc3RvciBlcSAkYnJhbmNoKSB7CisJCQkJcHJpbnQgU1RERVJSICJCcmFuY2ggJGJyYW5jaCBlcnJvbmVvdXNseSBzdGVtcyBmcm9tIGl0c2VsZiAtLSBjaGFuZ2VkIGFuY2VzdG9yIHRvICRvcHRfb1xuIjsKKwkJCQkkYW5jZXN0b3IgPSAkb3B0X287CisJCQl9CisJCQlpZigtZiAiJGdpdF9kaXIvcmVmcy9oZWFkcy8kYnJhbmNoIikgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRicmFuY2ggYWxyZWFkeSBleGlzdHMhXG4iOworCQkJCSRzdGF0ZT0xMTsKKwkJCQluZXh0OworCQkJfQorCQkJdW5sZXNzKG9wZW4oSCwiJGdpdF9kaXIvcmVmcy9oZWFkcy8kYW5jZXN0b3IiKSkgeworCQkJCXByaW50IFNUREVSUiAiQnJhbmNoICRhbmNlc3RvciBkb2VzIG5vdCBleGlzdCFcbiI7CisJCQkJJGlnbm9yZWJyYW5jaHskYnJhbmNofSA9IDE7CisJCQkJJHN0YXRlPTExOworCQkJCW5leHQ7CisJCQl9CisJCQljaG9tcChteSAkaWQgPSA8SD4pOworCQkJY2xvc2UoSCk7CisJCQl1bmxlc3Mob3BlbihILCI+ICRnaXRfZGlyL3JlZnMvaGVhZHMvJGJyYW5jaCIpKSB7CisJCQkJcHJpbnQgU1RERVJSICJDb3VsZCBub3QgY3JlYXRlIGJyYW5jaCAkYnJhbmNoOiAkIVxuIjsKKwkJCQkkaWdub3JlYnJhbmNoeyRicmFuY2h9ID0gMTsKKwkJCQkkc3RhdGU9MTE7CisJCQkJbmV4dDsKKwkJCX0KKwkJCXByaW50IEggIiRpZFxuIgorCQkJCW9yIGRpZSAiQ291bGQgbm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoOiAkISI7CisJCQljbG9zZShIKQorCQkJCW9yIGRpZSAiQ291bGQgbm90IHdyaXRlIGJyYW5jaCAkYnJhbmNoOiAkISI7CisJCX0KKwkJJGxhc3RfYnJhbmNoID0gJGJyYW5jaCBpZiAkYnJhbmNoIG5lICRsYXN0X2JyYW5jaDsKKwkJJHN0YXRlID0gOTsKKwl9IGVsc2lmKCRzdGF0ZSA9PSA4KSB7CisJCSRsb2dtc2cgLj0gIiRfXG4iOworCX0gZWxzaWYoJHN0YXRlID09IDkgYW5kIC9eXHMrKC4rPyk6KElOSVRJQUx8XGQrKD86XC5cZCspKyktPihcZCsoPzpcLlxkKykrKVxzKiQvKSB7CisjCVZFUlNJT046MS45Ni0+MS45Ni4yLjEKKwkJbXkgJGluaXQgPSAoJDIgZXEgIklOSVRJQUwiKTsKKwkJbXkgJGZuID0gJDE7CisJCW15ICRyZXYgPSAkMzsKKwkJJGZuID1+IHMjXi8rIyM7CisJCWlmICgkb3B0X1MgJiYgJGZuID1+IG0vJG9wdF9TLykgeworCQkgICAgcHJpbnQgIlNLSVBQSU5HICRmbiB2ICRyZXZcbiI7CisJCSAgICBwdXNoKEBza2lwcGVkLCAkZm4pOworCQkgICAgbmV4dDsKKwkJfQorCQlwcmludCAiRmV0Y2hpbmcgJGZuICAgdiAkcmV2XG4iIGlmICRvcHRfdjsKKwkJbXkgKCR0bXBuYW1lLCAkc2l6ZSkgPSAkY3ZzLT5maWxlKCRmbiwkcmV2KTsKKwkJaWYoJHNpemUgPT0gLTEpIHsKKwkJCXB1c2goQG9sZCwkZm4pOworCQkJcHJpbnQgIkRyb3AgJGZuXG4iIGlmICRvcHRfdjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICIiLigkaW5pdCA/ICJOZXciIDogIlVwZGF0ZSIpLiIgJGZuOiAkc2l6ZSBieXRlc1xuIiBpZiAkb3B0X3Y7CisJCQlteSAkcGlkID0gb3BlbihteSAkRiwgJy18Jyk7CisJCQlkaWUgJCEgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJCWlmICghJHBpZCkgeworCQkJICAgIGV4ZWMoImdpdC1oYXNoLW9iamVjdCIsICItdyIsICR0bXBuYW1lKQorCQkJCW9yIGRpZSAiQ2Fubm90IGNyZWF0ZSBvYmplY3Q6ICQhXG4iOworCQkJfQorCQkJbXkgJHNoYSA9IDwkRj47CisJCQljaG9tcCAkc2hhOworCQkJY2xvc2UgJEY7CisJCQlteSAkbW9kZSA9IHBtb2RlKCRjdnMtPnsnbW9kZSd9KTsKKwkJCXB1c2goQG5ldyxbJG1vZGUsICRzaGEsICRmbl0pOyAjIG1heSBiZSByZXN1cnJlY3RlZCEKKwkJfQorCQl1bmxpbmsoJHRtcG5hbWUpOworCX0gZWxzaWYoJHN0YXRlID09IDkgYW5kIC9eXHMrKC4rPyk6XGQrKD86XC5cZCspKy0+KFxkKyg/OlwuXGQrKSspXChERUFEXClccyokLykgeworCQlteSAkZm4gPSAkMTsKKwkJJGZuID1+IHMjXi8rIyM7CisJCXB1c2goQG9sZCwkZm4pOworCQlwcmludCAiRGVsZXRlICRmblxuIiBpZiAkb3B0X3Y7CisJfSBlbHNpZigkc3RhdGUgPT0gOSBhbmQgL15ccyokLykgeworCQkkc3RhdGUgPSAxMDsKKwl9IGVsc2lmKCgkc3RhdGUgPT0gOSBvciAkc3RhdGUgPT0gMTApIGFuZCAvXi0rJC8pIHsKKwkJJGNvbW1pdGNvdW50Kys7CisJCWlmICgkb3B0X0wgJiYgJGNvbW1pdGNvdW50ID4gJG9wdF9MKSB7CisJCQlsYXN0OworCQl9CisJCWNvbW1pdCgpOworCQlpZiAoKCRjb21taXRjb3VudCAmIDEwMjMpID09IDApIHsKKwkJCXN5c3RlbSgiZ2l0IHJlcGFjayAtYSAtZCIpOworCQl9CisJCSRzdGF0ZSA9IDE7CisJfSBlbHNpZigkc3RhdGUgPT0gMTEgYW5kIC9eLSskLykgeworCQkkc3RhdGUgPSAxOworCX0gZWxzaWYoL14tKyQvKSB7ICMgZW5kIG9mIHVua25vd24tbGluZSBwcm9jZXNzaW5nCisJCSRzdGF0ZSA9IDE7CisJfSBlbHNpZigkc3RhdGUgIT0gMTEpIHsgIyBpZ25vcmUgc3R1ZmYgd2hlbiBza2lwcGluZworCQlwcmludCAiKiBVTktOT1dOIExJTkUgKiAkX1xuIjsKKwl9Cit9Citjb21taXQoKSBpZiAkYnJhbmNoIGFuZCAkc3RhdGUgIT0gMTE7CisKK2ZvcmVhY2ggbXkgJGdpdF9pbmRleCAodmFsdWVzICVpbmRleCkgeworICAgIGlmICgkZ2l0X2luZGV4IG5lICcuZ2l0L2luZGV4JykgeworCXVubGluaygkZ2l0X2luZGV4KTsKKyAgICB9Cit9CisKK2lmIChkZWZpbmVkICRvcmlnX2dpdF9pbmRleCkgeworCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJG9yaWdfZ2l0X2luZGV4OworfSBlbHNlIHsKKwlkZWxldGUgJEVOVntHSVRfSU5ERVhfRklMRX07Cit9CisKKyMgTm93IHN3aXRjaCBiYWNrIHRvIHRoZSBicmFuY2ggd2Ugd2VyZSBpbiBiZWZvcmUgYWxsIG9mIHRoaXMgaGFwcGVuZWQKK2lmKCRvcmlnX2JyYW5jaCkgeworCXByaW50ICJET05FLlxuIiBpZiAkb3B0X3Y7CisJaWYgKCRvcHRfaSkgeworCQlleGl0IDA7CisJfQorCW15ICR0aXBfYXRfZW5kID0gYGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRGA7CisJaWYgKCR0aXBfYXRfc3RhcnQgbmUgJHRpcF9hdF9lbmQpIHsKKwkJZm9yICgkdGlwX2F0X3N0YXJ0LCAkdGlwX2F0X2VuZCkgeyBjaG9tcDsgfQorCQlwcmludCAiRmV0Y2hlZCBpbnRvIHRoZSBjdXJyZW50IGJyYW5jaC5cbiIgaWYgJG9wdF92OworCQlzeXN0ZW0ocXcoZ2l0LXJlYWQtdHJlZSAtdSAtbSksCisJCSAgICAgICAkdGlwX2F0X3N0YXJ0LCAkdGlwX2F0X2VuZCk7CisJCWRpZSAiRmFzdC1mb3J3YXJkIHVwZGF0ZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KKwllbHNlIHsKKwkJc3lzdGVtKHF3KGdpdC1tZXJnZSBjdnNpbXBvcnQgSEVBRCksICJyZWZzL2hlYWRzLyRvcHRfbyIpOworCQlkaWUgIkNvdWxkIG5vdCBtZXJnZSAkb3B0X28gaW50byB0aGUgY3VycmVudCBicmFuY2guXG4iIGlmICQ/OworCX0KK30gZWxzZSB7CisJJG9yaWdfYnJhbmNoID0gIm1hc3RlciI7CisJcHJpbnQgIkRPTkU7IGNyZWF0aW5nICRvcmlnX2JyYW5jaCBicmFuY2hcbiIgaWYgJG9wdF92OworCXN5c3RlbSgiZ2l0LXVwZGF0ZS1yZWYiLCAicmVmcy9oZWFkcy9tYXN0ZXIiLCAicmVmcy9oZWFkcy8kb3B0X28iKQorCQl1bmxlc3MgLWYgIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIjsKKwlzeXN0ZW0oJ2dpdC11cGRhdGUtcmVmJywgJ0hFQUQnLCAiJG9yaWdfYnJhbmNoIik7CisJdW5sZXNzICgkb3B0X2kpIHsKKwkJc3lzdGVtKCdnaXQgY2hlY2tvdXQnKTsKKwkJZGllICJjaGVja291dCBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KK30KZGlmZiAtLWdpdCBhL2dpdC1jdnNzZXJ2ZXIucGVybCBiL2dpdC1jdnNzZXJ2ZXIucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTMwZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWN2c3NlcnZlci5wZXJsCkBAIC0wLDAgKzEsMjczNyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMjIyMKKyMjIyMgVGhpcyBhcHBsaWNhdGlvbiBpcyBhIENWUyBlbXVsYXRpb24gbGF5ZXIgZm9yIGdpdC4KKyMjIyMgSXQgaXMgaW50ZW5kZWQgZm9yIGNsaWVudHMgdG8gY29ubmVjdCBvdmVyIFNTSC4KKyMjIyMgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCisjIyMjCisjIyMjIENvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKyMjIyMKKyMjIyMgQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIyAgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisjIyMjCisjIyMjCisjIyMjIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMjIyMKKyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZjbnRsOwordXNlIEZpbGU6OlRlbXAgcXcvdGVtcGRpciB0ZW1wZmlsZS87Cit1c2UgRmlsZTo6QmFzZW5hbWU7CisKK215ICRsb2cgPSBHSVRDVlM6OmxvZy0+bmV3KCk7CitteSAkY2ZnOworCitteSAkREFURV9MSVNUID0geworICAgIEphbiA9PiAiMDEiLAorICAgIEZlYiA9PiAiMDIiLAorICAgIE1hciA9PiAiMDMiLAorICAgIEFwciA9PiAiMDQiLAorICAgIE1heSA9PiAiMDUiLAorICAgIEp1biA9PiAiMDYiLAorICAgIEp1bCA9PiAiMDciLAorICAgIEF1ZyA9PiAiMDgiLAorICAgIFNlcCA9PiAiMDkiLAorICAgIE9jdCA9PiAiMTAiLAorICAgIE5vdiA9PiAiMTEiLAorICAgIERlYyA9PiAiMTIiLAorfTsKKworIyBFbmFibGUgYXV0b2ZsdXNoIGZvciBTVERPVVQgKG90aGVyd2lzZSB0aGUgd2hvbGUgdGhpbmcgZmFsbHMgYXBhcnQpCiskfCA9IDE7CisKKyMjIyMgRGVmaW5pdGlvbiBhbmQgbWFwcGluZ3Mgb2YgZnVuY3Rpb25zICMjIyMKKworbXkgJG1ldGhvZHMgPSB7CisgICAgJ1Jvb3QnICAgICAgICAgICAgPT4gXCZyZXFfUm9vdCwKKyAgICAnVmFsaWQtcmVzcG9uc2VzJyA9PiBcJnJlcV9WYWxpZHJlc3BvbnNlcywKKyAgICAndmFsaWQtcmVxdWVzdHMnICA9PiBcJnJlcV92YWxpZHJlcXVlc3RzLAorICAgICdEaXJlY3RvcnknICAgICAgID0+IFwmcmVxX0RpcmVjdG9yeSwKKyAgICAnRW50cnknICAgICAgICAgICA9PiBcJnJlcV9FbnRyeSwKKyAgICAnTW9kaWZpZWQnICAgICAgICA9PiBcJnJlcV9Nb2RpZmllZCwKKyAgICAnVW5jaGFuZ2VkJyAgICAgICA9PiBcJnJlcV9VbmNoYW5nZWQsCisgICAgJ1F1ZXN0aW9uYWJsZScgICAgPT4gXCZyZXFfUXVlc3Rpb25hYmxlLAorICAgICdBcmd1bWVudCcgICAgICAgID0+IFwmcmVxX0FyZ3VtZW50LAorICAgICdBcmd1bWVudHgnICAgICAgID0+IFwmcmVxX0FyZ3VtZW50LAorICAgICdleHBhbmQtbW9kdWxlcycgID0+IFwmcmVxX2V4cGFuZG1vZHVsZXMsCisgICAgJ2FkZCcgICAgICAgICAgICAgPT4gXCZyZXFfYWRkLAorICAgICdyZW1vdmUnICAgICAgICAgID0+IFwmcmVxX3JlbW92ZSwKKyAgICAnY28nICAgICAgICAgICAgICA9PiBcJnJlcV9jbywKKyAgICAndXBkYXRlJyAgICAgICAgICA9PiBcJnJlcV91cGRhdGUsCisgICAgJ2NpJyAgICAgICAgICAgICAgPT4gXCZyZXFfY2ksCisgICAgJ2RpZmYnICAgICAgICAgICAgPT4gXCZyZXFfZGlmZiwKKyAgICAnbG9nJyAgICAgICAgICAgICA9PiBcJnJlcV9sb2csCisgICAgJ3Jsb2cnICAgICAgICAgICAgPT4gXCZyZXFfbG9nLAorICAgICd0YWcnICAgICAgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorICAgICdzdGF0dXMnICAgICAgICAgID0+IFwmcmVxX3N0YXR1cywKKyAgICAnYWRtaW4nICAgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnaGlzdG9yeScgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnd2F0Y2hlcnMnICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnZWRpdG9ycycgICAgICAgICA9PiBcJnJlcV9DQVRDSEFMTCwKKyAgICAnYW5ub3RhdGUnICAgICAgICA9PiBcJnJlcV9hbm5vdGF0ZSwKKyAgICAnR2xvYmFsX29wdGlvbicgICA9PiBcJnJlcV9HbG9iYWxvcHRpb24sCisgICAgIydhbm5vdGF0ZScgICAgICAgID0+IFwmcmVxX0NBVENIQUxMLAorfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgJHN0YXRlIGhvbGRzIGFsbCB0aGUgYml0cyBvZiBpbmZvcm1hdGlvbiB0aGUgY2xpZW50cyBzZW5kcyB1cyB0aGF0IGNvdWxkCisjIHBvdGVudGlhbGx5IGJlIHVzZWZ1bCB3aGVuIGl0IGNvbWVzIHRvIGFjdHVhbGx5IF9kb2luZ18gc29tZXRoaW5nLgorbXkgJHN0YXRlID0geyBwcmVwZW5kZGlyID0+ICcnIH07CiskbG9nLT5pbmZvKCItLS0tLS0tLS0tLS0tLS0gU1RBUlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworbXkgJFRFTVBfRElSID0gdGVtcGRpciggQ0xFQU5VUCA9PiAxICk7CiskbG9nLT5kZWJ1ZygiVGVtcG9yYXJ5IGRpcmVjdG9yeSBpcyAnJFRFTVBfRElSJyIpOworCisjIGlmIHdlIGFyZSBjYWxsZWQgd2l0aCBhIHBzZXJ2ZXIgYXJndW1lbnQsCisjIGRlYWwgd2l0aCB0aGUgYXV0aGVudGljYXRpb24gY2F0IGJlZm9yZSBlbnRlcmluZyB0aGUKKyMgbWFpbiBsb29wCitpZiAoQEFSR1YgJiYgJEFSR1ZbMF0gZXEgJ3BzZXJ2ZXInKSB7CisgICAgbXkgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsKKyAgICB1bmxlc3MoICRsaW5lIGVxICdCRUdJTiBBVVRIIFJFUVVFU1QnKSB7CisgICAgICAgZGllICJFIERvIG5vdCB1bmRlcnN0YW5kICRsaW5lIC0gZXhwZWN0aW5nIEJFR0lOIEFVVEggUkVRVUVTVFxuIjsKKyAgICB9CisgICAgJGxpbmUgPSA8U1RESU4+OyBjaG9tcCAkbGluZTsKKyAgICByZXFfUm9vdCgncm9vdCcsICRsaW5lKSAjIHJldXNlIFJvb3QKKyAgICAgICBvciBkaWUgIkUgSW52YWxpZCByb290ICRsaW5lIFxuIjsKKyAgICAkbGluZSA9IDxTVERJTj47IGNob21wICRsaW5lOworICAgIHVubGVzcyAoJGxpbmUgZXEgJ2Fub255bW91cycpIHsKKyAgICAgICBwcmludCAiRSBPbmx5IGFub255bW91cyB1c2VyIGFsbG93ZWQgdmlhIHBzZXJ2ZXJcbiI7CisgICAgICAgcHJpbnQgIkkgSEFURSBZT1VcbiI7CisgICAgfQorICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7ICAgICMgdmFsaWRhdGUgdGhlIHBhc3N3b3JkPworICAgICRsaW5lID0gPFNURElOPjsgY2hvbXAgJGxpbmU7CisgICAgdW5sZXNzICgkbGluZSBlcSAnRU5EIEFVVEggUkVRVUVTVCcpIHsKKyAgICAgICBkaWUgIkUgRG8gbm90IHVuZGVyc3RhbmQgJGxpbmUgLS0gZXhwZWN0aW5nIEVORCBBVVRIIFJFUVVFU1RcbiI7CisgICAgfQorICAgIHByaW50ICJJIExPVkUgWU9VXG4iOworICAgICMgYW5kIG5vdyBiYWNrIHRvIG91ciByZWd1bGFyIHByb2dyYW1tZS4uLgorfQorCisjIEtlZXAgZ29pbmcgdW50aWwgdGhlIGNsaWVudCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24KK3doaWxlICg8U1RESU4+KQoreworICAgIGNob21wOworCisgICAgIyBDaGVjayB0byBzZWUgaWYgd2UndmUgc2VlbiB0aGlzIG1ldGhvZCwgYW5kIGNhbGwgYXBwcm9wcmlhdGUgZnVuY3Rpb24uCisgICAgaWYgKCAvXihbXHctXSspKD86XHMrKC4qKSk/JC8gYW5kIGRlZmluZWQoJG1ldGhvZHMtPnskMX0pICkKKyAgICB7CisgICAgICAgICMgdXNlIHRoZSAkbWV0aG9kcyBoYXNoIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIHN1YiBmb3IgdGhpcyBjb21tYW5kCisgICAgICAgICMkbG9nLT5pbmZvKCJNZXRob2QgOiAkMSIpOworICAgICAgICAmeyRtZXRob2RzLT57JDF9fSgkMSwkMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIyBsb2cgZmF0YWwgYmVjYXVzZSB3ZSBkb24ndCB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24uIElmIHRoaXMgaGFwcGVucworICAgICAgICAjIHdlJ3JlIGZhaXJseSBzY3Jld2VkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgY2xpZW50IGlzIGV4cGVjdGluZworICAgICAgICAjIGEgcmVzcG9uc2UuIElmIGl0IGlzLCB0aGUgY2xpZW50IHdpbGwgaGFuZywgd2UnbGwgaGFuZywgYW5kIHRoZSB3aG9sZQorICAgICAgICAjIHRoaW5nIHdpbGwgYmUgY3VzdGFyZC4KKyAgICAgICAgJGxvZy0+ZmF0YWwoIkRvbid0IHVuZGVyc3RhbmQgY29tbWFuZCAkX1xuIik7CisgICAgICAgIGRpZSgiVW5rbm93biBjb21tYW5kICRfIik7CisgICAgfQorfQorCiskbG9nLT5kZWJ1ZygiUHJvY2Vzc2luZyB0aW1lIDogdXNlcj0iIC4gKHRpbWVzKVswXSAuICIgc3lzdGVtPSIgLiAodGltZXMpWzFdKTsKKyRsb2ctPmluZm8oIi0tLS0tLS0tLS0tLS0tLSBGSU5JU0ggLS0tLS0tLS0tLS0tLS0tLS0iKTsKKworIyBNYWdpYyBjYXRjaGFsbCBtZXRob2QuCisjICAgIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IHdpbGwgaGFuZGxlIGFsbCBjb21tYW5kcyB3ZSBoYXZlbid0IHlldAorIyAgICBpbXBsZW1lbnRlZC4gSXQgc2ltcGx5IHNlbmRzIGEgd2FybmluZyB0byB0aGUgbG9nIGZpbGUgaW5kaWNhdGluZyBhCisjICAgIGNvbW1hbmQgdGhhdCBoYXNuJ3QgYmVlbiBpbXBsZW1lbnRlZCBoYXMgYmVlbiBpbnZva2VkLgorc3ViIHJlcV9DQVRDSEFMTAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPndhcm4oIlVuaGFuZGxlZCBjb21tYW5kIDogcmVxXyRjbWQgOiAkZGF0YSIpOworfQorCisKKyMgUm9vdCBwYXRobmFtZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUZWxsIHRoZSBzZXJ2ZXIgd2hpY2ggQ1ZTUk9PVCB0byB1c2UuIE5vdGUgdGhhdAorIyAgICAgcGF0aG5hbWUgaXMgYSBsb2NhbCBkaXJlY3RvcnkgYW5kIG5vdCBhIGZ1bGx5IHF1YWxpZmllZCBDVlNST09UIHZhcmlhYmxlLgorIyAgICAgcGF0aG5hbWUgbXVzdCBhbHJlYWR5IGV4aXN0OyBpZiBjcmVhdGluZyBhIG5ldyByb290LCB1c2UgdGhlIGluaXQKKyMgICAgIHJlcXVlc3QsIG5vdCBSb290LiBwYXRobmFtZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyLAorIyAgICAgaG93IHRvIGFjY2VzcyB0aGUgc2VydmVyLCBldGMuOyBieSB0aGUgdGltZSB0aGUgQ1ZTIHByb3RvY29sIGlzIGluIHVzZSwKKyMgICAgIGNvbm5lY3Rpb24sIGF1dGhlbnRpY2F0aW9uLCBldGMuLCBhcmUgYWxyZWFkeSB0YWtlbiBjYXJlIG9mLiBUaGUgUm9vdAorIyAgICAgcmVxdWVzdCBtdXN0IGJlIHNlbnQgb25seSBvbmNlLCBhbmQgaXQgbXVzdCBiZSBzZW50IGJlZm9yZSBhbnkgcmVxdWVzdHMKKyMgICAgIG90aGVyIHRoYW4gVmFsaWQtcmVzcG9uc2VzLCB2YWxpZC1yZXF1ZXN0cywgVXNlVW5jaGFuZ2VkLCBTZXQgb3IgaW5pdC4KK3N1YiByZXFfUm9vdAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPmRlYnVnKCJyZXFfUm9vdCA6ICRkYXRhIik7CisKKyAgICAkc3RhdGUtPntDVlNST09UfSA9ICRkYXRhOworCisgICAgJEVOVntHSVRfRElSfSA9ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8iOworICAgIHVubGVzcyAoLWQgJEVOVntHSVRfRElSfSAmJiAtZSAkRU5We0dJVF9ESVJ9LidIRUFEJykgeworICAgICAgIHByaW50ICJFICRFTlZ7R0lUX0RJUn0gZG9lcyBub3Qgc2VlbSB0byBiZSBhIHZhbGlkIEdJVCByZXBvc2l0b3J5XG4iOworICAgICAgICBwcmludCAiRSBcbiI7CisgICAgICAgIHByaW50ICJlcnJvciAxICRFTlZ7R0lUX0RJUn0gaXMgbm90IGEgdmFsaWQgcmVwb3NpdG9yeVxuIjsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBteSBAZ2l0dmFycyA9IGBnaXQtcmVwby1jb25maWcgLWxgOworICAgIGlmICgkPykgeworICAgICAgIHByaW50ICJFIHByb2JsZW1zIGV4ZWN1dGluZyBnaXQtcmVwby1jb25maWcgb24gdGhlIHNlcnZlciAtLSB0aGlzIGlzIG5vdCBhIGdpdCByZXBvc2l0b3J5IG9yIHRoZSBQQVRIIGlzIG5vdCBzZXQgY29ycmVjdGx5LlxuIjsKKyAgICAgICAgcHJpbnQgIkUgXG4iOworICAgICAgICBwcmludCAiZXJyb3IgMSAtIHByb2JsZW0gZXhlY3V0aW5nIGdpdC1yZXBvLWNvbmZpZ1xuIjsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBnaXR2YXJzICkKKyAgICB7CisgICAgICAgIG5leHQgdW5sZXNzICggJGxpbmUgPX4gL14oLio/KVwuKC4qPyk9KC4qKSQvICk7CisgICAgICAgICRjZmctPnskMX17JDJ9ID0gJDM7CisgICAgfQorCisgICAgdW5sZXNzICggZGVmaW5lZCAoICRjZmctPntnaXRjdnN9e2VuYWJsZWR9ICkgYW5kICRjZmctPntnaXRjdnN9e2VuYWJsZWR9ID1+IC9eXHMqKDF8dHJ1ZXx5ZXMpXHMqJC9pICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIEdJVENWUyBlbXVsYXRpb24gbmVlZHMgdG8gYmUgZW5hYmxlZCBvbiB0aGlzIHJlcG9cbiI7CisgICAgICAgIHByaW50ICJFIHRoZSByZXBvIGNvbmZpZyBmaWxlIG5lZWRzIGEgW2dpdGN2c10gc2VjdGlvbiBhZGRlZCwgYW5kIHRoZSBwYXJhbWV0ZXIgJ2VuYWJsZWQnIHNldCB0byAxXG4iOworICAgICAgICBwcmludCAiRSBcbiI7CisgICAgICAgIHByaW50ICJlcnJvciAxIEdJVENWUyBlbXVsYXRpb24gZGlzYWJsZWRcbiI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggZGVmaW5lZCAoICRjZmctPntnaXRjdnN9e2xvZ2ZpbGV9ICkgKQorICAgIHsKKyAgICAgICAgJGxvZy0+c2V0ZmlsZSgkY2ZnLT57Z2l0Y3ZzfXtsb2dmaWxlfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGxvZy0+bm9maWxlKCk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKyMgR2xvYmFsX29wdGlvbiBvcHRpb24gXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVHJhbnNtaXQgb25lIG9mIHRoZSBnbG9iYWwgb3B0aW9ucyBgLXEnLCBgLVEnLAorIyAgICAgYC1sJywgYC10JywgYC1yJywgb3IgYC1uJy4gb3B0aW9uIG11c3QgYmUgb25lIG9mIHRob3NlIHN0cmluZ3MsIG5vCisjICAgICB2YXJpYXRpb25zIChzdWNoIGFzIGNvbWJpbmluZyBvZiBvcHRpb25zKSBhcmUgYWxsb3dlZC4gRm9yIGdyYWNlZnVsCisjICAgICBoYW5kbGluZyBvZiB2YWxpZC1yZXF1ZXN0cywgaXQgaXMgcHJvYmFibHkgYmV0dGVyIHRvIG1ha2UgbmV3IGdsb2JhbAorIyAgICAgb3B0aW9ucyBzZXBhcmF0ZSByZXF1ZXN0cywgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGFkZCB0aGVtIHRvIHRoaXMKKyMgICAgIHJlcXVlc3QuCitzdWIgcmVxX0dsb2JhbG9wdGlvbgoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworICAgICRsb2ctPmRlYnVnKCJyZXFfR2xvYmFsb3B0aW9uIDogJGRhdGEiKTsKKyAgICAkc3RhdGUtPntnbG9iYWxvcHRpb25zfXskZGF0YX0gPSAxOworfQorCisjIFZhbGlkLXJlc3BvbnNlcyByZXF1ZXN0LWxpc3QgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyIHdoYXQgcmVzcG9uc2VzIHRoZSBjbGllbnQgd2lsbAorIyAgICAgYWNjZXB0LiByZXF1ZXN0LWxpc3QgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiB0b2tlbnMuCitzdWIgcmVxX1ZhbGlkcmVzcG9uc2VzCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisgICAgJGxvZy0+ZGVidWcoInJlcV9WYWxpZHJlc3BvbnNlcyA6ICRkYXRhIik7CisKKyAgICAjIFRPRE8gOiByZS1lbmFibGUgdGhpcywgY3VycmVudGx5IGl0J3Mgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwKKyAgICAjJHN0YXRlLT57dmFsaWRyZXNwb25zZXN9ID0gWyBzcGxpdCAvXHMrLywgJGRhdGEgXTsKK30KKworIyB2YWxpZC1yZXF1ZXN0cyBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gQXNrIHRoZSBzZXJ2ZXIgdG8gc2VuZCBiYWNrIGEgVmFsaWQtcmVxdWVzdHMKKyMgICAgIHJlc3BvbnNlLgorc3ViIHJlcV92YWxpZHJlcXVlc3RzCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX3ZhbGlkcmVxdWVzdHMiKTsKKworICAgICRsb2ctPmRlYnVnKCJTRU5EIDogVmFsaWQtcmVxdWVzdHMgIiAuIGpvaW4oIiAiLGtleXMgJSRtZXRob2RzKSk7CisgICAgJGxvZy0+ZGVidWcoIlNFTkQgOiBvayIpOworCisgICAgcHJpbnQgIlZhbGlkLXJlcXVlc3RzICIgLiBqb2luKCIgIixrZXlzICUkbWV0aG9kcykgLiAiXG4iOworICAgIHByaW50ICJva1xuIjsKK30KKworIyBEaXJlY3RvcnkgbG9jYWwtZGlyZWN0b3J5IFxuCisjICAgICBBZGRpdGlvbmFsIGRhdGE6IHJlcG9zaXRvcnkgXG4uIFJlc3BvbnNlIGV4cGVjdGVkOiBuby4gVGVsbCB0aGUgc2VydmVyCisjICAgICB3aGF0IGRpcmVjdG9yeSB0byB1c2UuIFRoZSByZXBvc2l0b3J5IHNob3VsZCBiZSBhIGRpcmVjdG9yeSBuYW1lIGZyb20gYQorIyAgICAgcHJldmlvdXMgc2VydmVyIHJlc3BvbnNlLiBOb3RlIHRoYXQgdGhpcyBib3RoIGdpdmVzIGEgZGVmYXVsdCBmb3IgRW50cnkKKyMgICAgIGFuZCBNb2RpZmllZCBhbmQgYWxzbyBmb3IgY2kgYW5kIHRoZSBvdGhlciBjb21tYW5kczsgbm9ybWFsIHVzYWdlIGlzIHRvCisjICAgICBzZW5kIERpcmVjdG9yeSBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlcmUgd2lsbCBiZSBhbiBFbnRyeSBvcgorIyAgICAgTW9kaWZpZWQsIGFuZCB0aGVuIGEgZmluYWwgRGlyZWN0b3J5IGZvciB0aGUgb3JpZ2luYWwgZGlyZWN0b3J5LCB0aGVuIHRoZQorIyAgICAgY29tbWFuZC4gVGhlIGxvY2FsLWRpcmVjdG9yeSBpcyByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIGF0IHdoaWNoIHRoZQorIyAgICAgY29tbWFuZCBpcyBvY2N1cnJpbmcgKGkuZS4gdGhlIGxhc3QgRGlyZWN0b3J5IHdoaWNoIGlzIHNlbnQgYmVmb3JlIHRoZQorIyAgICAgY29tbWFuZCk7IHRvIGluZGljYXRlIHRoYXQgdG9wIGxldmVsLCBgLicgc2hvdWxkIGJlIHNlbnQgZm9yCisjICAgICBsb2NhbC1kaXJlY3RvcnkuCitzdWIgcmVxX0RpcmVjdG9yeQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgbXkgJHJlcG9zaXRvcnkgPSA8U1RESU4+OworICAgIGNob21wICRyZXBvc2l0b3J5OworCisKKyAgICAkc3RhdGUtPntsb2NhbGRpcn0gPSAkZGF0YTsKKyAgICAkc3RhdGUtPntyZXBvc2l0b3J5fSA9ICRyZXBvc2l0b3J5OworICAgICRzdGF0ZS0+e3BhdGh9ID0gJHJlcG9zaXRvcnk7CisgICAgJHN0YXRlLT57cGF0aH0gPX4gcy9eJHN0YXRlLT57Q1ZTUk9PVH1cLy8vOworICAgICRzdGF0ZS0+e21vZHVsZX0gPSAkMSBpZiAoJHN0YXRlLT57cGF0aH0gPX4gcy9eKC4qPykoXC98JCkvLyk7CisgICAgJHN0YXRlLT57cGF0aH0gLj0gIi8iIGlmICggJHN0YXRlLT57cGF0aH0gPX4gL1xTLyApOworCisgICAgJHN0YXRlLT57ZGlyZWN0b3J5fSA9ICRzdGF0ZS0+e2xvY2FsZGlyfTsKKyAgICAkc3RhdGUtPntkaXJlY3Rvcnl9ID0gIiIgaWYgKCAkc3RhdGUtPntkaXJlY3Rvcnl9IGVxICIuIiApOworICAgICRzdGF0ZS0+e2RpcmVjdG9yeX0gLj0gIi8iIGlmICggJHN0YXRlLT57ZGlyZWN0b3J5fSA9fiAvXFMvICk7CisKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCRzdGF0ZS0+e3ByZXBlbmRkaXJ9KSBhbmQgJHN0YXRlLT57bG9jYWxkaXJ9IGVxICIuIiBhbmQgJHN0YXRlLT57cGF0aH0gPX4gL1xTLyApCisgICAgeworICAgICAgICAkbG9nLT5pbmZvKCJTZXR0aW5nIHByZXBlbmQgdG8gJyRzdGF0ZS0+e3BhdGh9JyIpOworICAgICAgICAkc3RhdGUtPntwcmVwZW5kZGlyfSA9ICRzdGF0ZS0+e3BhdGh9OworICAgICAgICBmb3JlYWNoIG15ICRlbnRyeSAoIGtleXMgJXskc3RhdGUtPntlbnRyaWVzfX0gKQorICAgICAgICB7CisgICAgICAgICAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntwcmVwZW5kZGlyfSAuICRlbnRyeX0gPSAkc3RhdGUtPntlbnRyaWVzfXskZW50cnl9OworICAgICAgICAgICAgZGVsZXRlICRzdGF0ZS0+e2VudHJpZXN9eyRlbnRyeX07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntwcmVwZW5kZGlyfSApICkKKyAgICB7CisgICAgICAgICRsb2ctPmRlYnVnKCJQcmVwZW5kaW5nICckc3RhdGUtPntwcmVwZW5kZGlyfScgdG8gc3RhdGV8ZGlyZWN0b3J5Iik7CisgICAgICAgICRzdGF0ZS0+e2RpcmVjdG9yeX0gPSAkc3RhdGUtPntwcmVwZW5kZGlyfSAuICRzdGF0ZS0+e2RpcmVjdG9yeX0KKyAgICB9CisgICAgJGxvZy0+ZGVidWcoInJlcV9EaXJlY3RvcnkgOiBsb2NhbGRpcj0kZGF0YSByZXBvc2l0b3J5PSRyZXBvc2l0b3J5IHBhdGg9JHN0YXRlLT57cGF0aH0gZGlyZWN0b3J5PSRzdGF0ZS0+e2RpcmVjdG9yeX0gbW9kdWxlPSRzdGF0ZS0+e21vZHVsZX0iKTsKK30KKworIyBFbnRyeSBlbnRyeS1saW5lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFRlbGwgdGhlIHNlcnZlciB3aGF0IHZlcnNpb24gb2YgYSBmaWxlIGlzIG9uIHRoZQorIyAgICAgbG9jYWwgbWFjaGluZS4gVGhlIG5hbWUgaW4gZW50cnktbGluZSBpcyBhIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQorIyAgICAgbW9zdCByZWNlbnRseSBzcGVjaWZpZWQgd2l0aCBEaXJlY3RvcnkuIElmIHRoZSB1c2VyIGlzIG9wZXJhdGluZyBvbiBvbmx5CisjICAgICBzb21lIGZpbGVzIGluIGEgZGlyZWN0b3J5LCBFbnRyeSByZXF1ZXN0cyBmb3Igb25seSB0aG9zZSBmaWxlcyBuZWVkIGJlCisjICAgICBpbmNsdWRlZC4gSWYgYW4gRW50cnkgcmVxdWVzdCBpcyBzZW50IHdpdGhvdXQgTW9kaWZpZWQsIElzLW1vZGlmaWVkLCBvcgorIyAgICAgVW5jaGFuZ2VkLCBpdCBtZWFucyB0aGUgZmlsZSBpcyBsb3N0IChkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya2luZworIyAgICAgZGlyZWN0b3J5KS4gSWYgYm90aCBFbnRyeSBhbmQgb25lIG9mIE1vZGlmaWVkLCBJcy1tb2RpZmllZCwgb3IgVW5jaGFuZ2VkCisjICAgICBhcmUgc2VudCBmb3IgdGhlIHNhbWUgZmlsZSwgRW50cnkgbXVzdCBiZSBzZW50IGZpcnN0LiBGb3IgYSBnaXZlbiBmaWxlLAorIyAgICAgb25lIGNhbiBzZW5kIE1vZGlmaWVkLCBJcy1tb2RpZmllZCwgb3IgVW5jaGFuZ2VkLCBidXQgbm90IG1vcmUgdGhhbiBvbmUKKyMgICAgIG9mIHRoZXNlIHRocmVlLgorc3ViIHJlcV9FbnRyeQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgIyRsb2ctPmRlYnVnKCJyZXFfRW50cnkgOiAkZGF0YSIpOworCisgICAgbXkgQGRhdGEgPSBzcGxpdCgvXC8vLCAkZGF0YSk7CisKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhWzFdfSA9IHsKKyAgICAgICAgcmV2aXNpb24gICAgPT4gJGRhdGFbMl0sCisgICAgICAgIGNvbmZsaWN0ICAgID0+ICRkYXRhWzNdLAorICAgICAgICBvcHRpb25zICAgICA9PiAkZGF0YVs0XSwKKyAgICAgICAgdGFnX29yX2RhdGUgPT4gJGRhdGFbNV0sCisgICAgfTsKKworICAgICRsb2ctPmluZm8oIlJlY2VpdmVkIGVudHJ5IGxpbmUgJyRkYXRhJyA9PiAnIiAuICRzdGF0ZS0+e2RpcmVjdG9yeX0gLiAkZGF0YVsxXSAuICInIik7Cit9CisKKyMgUXVlc3Rpb25hYmxlIGZpbGVuYW1lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIEFkZGl0aW9uYWwgZGF0YTogbm8uIFRlbGwgdGhlIHNlcnZlciB0byBjaGVjaworIyAgICAgd2hldGhlciBmaWxlbmFtZSBzaG91bGQgYmUgaWdub3JlZCwgYW5kIGlmIG5vdCwgbmV4dCB0aW1lIHRoZSBzZXJ2ZXIKKyMgICAgIHNlbmRzIHJlc3BvbnNlcywgc2VuZCAoaW4gYSBNIHJlc3BvbnNlKSBgPycgZm9sbG93ZWQgYnkgdGhlIGRpcmVjdG9yeSBhbmQKKyMgICAgIGZpbGVuYW1lLiBmaWxlbmFtZSBtdXN0IG5vdCBjb250YWluIGAvJzsgaXQgbmVlZHMgdG8gYmUgYSBmaWxlIGluIHRoZQorIyAgICAgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBtb3N0IHJlY2VudCBEaXJlY3RvcnkgcmVxdWVzdC4KK3N1YiByZXFfUXVlc3Rpb25hYmxlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX1F1ZXN0aW9uYWJsZSA6ICRkYXRhIik7CisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17cXVlc3Rpb25hYmxlfSA9IDE7Cit9CisKKyMgYWRkIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBBZGQgYSBmaWxlIG9yIGRpcmVjdG9yeS4gVGhpcyB1c2VzIGFueSBwcmV2aW91cworIyAgICAgQXJndW1lbnQsIERpcmVjdG9yeSwgRW50cnksIG9yIE1vZGlmaWVkIHJlcXVlc3RzLCBpZiB0aGV5IGhhdmUgYmVlbiBzZW50LgorIyAgICAgVGhlIGxhc3QgRGlyZWN0b3J5IHNlbnQgc3BlY2lmaWVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhdCB0aGUgdGltZSBvZgorIyAgICAgdGhlIG9wZXJhdGlvbi4gVG8gYWRkIGEgZGlyZWN0b3J5LCBzZW5kIHRoZSBkaXJlY3RvcnkgdG8gYmUgYWRkZWQgdXNpbmcKKyMgICAgIERpcmVjdG9yeSBhbmQgQXJndW1lbnQgcmVxdWVzdHMuCitzdWIgcmVxX2FkZAoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImFkZCIpOworCisgICAgbXkgJGFkZGNvdW50ID0gMDsKKworICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICB1bmxlc3MgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IG5vdGhpbmcga25vd24gYWJvdXQgYCRmaWxlbmFtZSdcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisgICAgICAgICMgVE9ETyA6IGNoZWNrIHdlJ3JlIG5vdCBzcXVhc2hpbmcgYW4gYWxyZWFkeSBleGlzdGluZyBmaWxlCisgICAgICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgYWRkOiBgJGZpbGVuYW1lJyBoYXMgYWxyZWFkeSBiZWVuIGVudGVyZWRcbiI7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwgMSk7CisKKyAgICAgICAgcHJpbnQgIkUgY3ZzIGFkZDogc2NoZWR1bGluZyBmaWxlIGAkZmlsZW5hbWUnIGZvciBhZGRpdGlvblxuIjsKKworICAgICAgICBwcmludCAiQ2hlY2tlZC1pbiAkZGlycGFydFxuIjsKKyAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIi8kZmlsZXBhcnQvMC8vL1xuIjsKKworICAgICAgICAkYWRkY291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoICRhZGRjb3VudCA9PSAxICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IHVzZSBgY3ZzIGNvbW1pdCcgdG8gYWRkIHRoaXMgZmlsZSBwZXJtYW5lbnRseVxuIjsKKyAgICB9CisgICAgZWxzaWYgKCAkYWRkY291bnQgPiAxICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGN2cyBhZGQ6IHVzZSBgY3ZzIGNvbW1pdCcgdG8gYWRkIHRoZXNlIGZpbGVzIHBlcm1hbmVudGx5XG4iOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworIyByZW1vdmUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIFJlbW92ZSBhIGZpbGUuIFRoaXMgdXNlcyBhbnkgcHJldmlvdXMgQXJndW1lbnQsCisjICAgICBEaXJlY3RvcnksIEVudHJ5LCBvciBNb2RpZmllZCByZXF1ZXN0cywgaWYgdGhleSBoYXZlIGJlZW4gc2VudC4gVGhlIGxhc3QKKyMgICAgIERpcmVjdG9yeSBzZW50IHNwZWNpZmllcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYXQgdGhlIHRpbWUgb2YgdGhlCisjICAgICBvcGVyYXRpb24uIE5vdGUgdGhhdCB0aGlzIHJlcXVlc3QgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdG8gdGhlCisjICAgICByZXBvc2l0b3J5OyB0aGUgb25seSBlZmZlY3Qgb2YgYSBzdWNjZXNzZnVsIHJlbW92ZSByZXF1ZXN0IGlzIHRvIHN1cHBseQorIyAgICAgdGhlIGNsaWVudCB3aXRoIGEgbmV3IGVudHJpZXMgbGluZSBjb250YWluaW5nIGAtJyB0byBpbmRpY2F0ZSBhIHJlbW92ZWQKKyMgICAgIGZpbGUuIEluIGZhY3QsIHRoZSBjbGllbnQgcHJvYmFibHkgY291bGQgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiB3aXRob3V0CisjICAgICBjb250YWN0aW5nIHRoZSBzZXJ2ZXIsIGFsdGhvdWdoIHVzaW5nIHJlbW92ZSBtYXkgY2F1c2UgdGhlIHNlcnZlciB0bworIyAgICAgcGVyZm9ybSBhIGZldyBtb3JlIGNoZWNrcy4gVGhlIGNsaWVudCBzZW5kcyBhIHN1YnNlcXVlbnQgY2kgcmVxdWVzdCB0bworIyAgICAgYWN0dWFsbHkgcmVjb3JkIHRoZSByZW1vdmFsIGluIHRoZSByZXBvc2l0b3J5Lgorc3ViIHJlcV9yZW1vdmUKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJyZW1vdmUiKTsKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjJGxvZy0+ZGVidWcoImFkZCBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICBteSAkcm1jb3VudCA9IDA7CisKKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9ICkgb3IgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBmaWxlIGAkZmlsZW5hbWUnIHN0aWxsIGluIHdvcmtpbmcgZGlyZWN0b3J5XG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIG15ICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkd3JldiApICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogbm90aGluZyBrbm93biBhYm91dCBgJGZpbGVuYW1lJ1xuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlZmluZWQoJHdyZXYpIGFuZCAkd3JldiA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiRSBjdnMgcmVtb3ZlOiBmaWxlIGAkZmlsZW5hbWUnIGFscmVhZHkgc2NoZWR1bGVkIGZvciByZW1vdmFsXG4iOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHVubGVzcyAoICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259ICkKKyAgICAgICAgeworICAgICAgICAgICAgIyBUT0RPIDogbm90IHN1cmUgaWYgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UgaXMgcXVpdGUgY29ycmVjdC4KKyAgICAgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IFVwIHRvIGRhdGUgY2hlY2sgZmFpbGVkIGZvciBgJGZpbGVuYW1lJ1xuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworCisgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsIDEpOworCisgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IHNjaGVkdWxpbmcgYCRmaWxlbmFtZScgZm9yIHJlbW92YWxcbiI7CisKKyAgICAgICAgcHJpbnQgIkNoZWNrZWQtaW4gJGRpcnBhcnRcbiI7CisgICAgICAgIHByaW50ICIkZmlsZW5hbWVcbiI7CisgICAgICAgIHByaW50ICIvJGZpbGVwYXJ0Ly0xLiR3cmV2Ly8vXG4iOworCisgICAgICAgICRybWNvdW50Kys7CisgICAgfQorCisgICAgaWYgKCAkcm1jb3VudCA9PSAxICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGN2cyByZW1vdmU6IHVzZSBgY3ZzIGNvbW1pdCcgdG8gcmVtb3ZlIHRoaXMgZmlsZSBwZXJtYW5lbnRseVxuIjsKKyAgICB9CisgICAgZWxzaWYgKCAkcm1jb3VudCA+IDEgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIHJlbW92ZTogdXNlIGBjdnMgY29tbWl0JyB0byByZW1vdmUgdGhlc2UgZmlsZXMgcGVybWFuZW50bHlcbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCisjIE1vZGlmaWVkIGZpbGVuYW1lIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIEFkZGl0aW9uYWwgZGF0YTogbW9kZSwgXG4sIGZpbGUgdHJhbnNtaXNzaW9uLiBTZW5kCisjICAgICB0aGUgc2VydmVyIGEgY29weSBvZiBvbmUgbG9jYWxseSBtb2RpZmllZCBmaWxlLiBmaWxlbmFtZSBpcyBhIGZpbGUgd2l0aGluCisjICAgICB0aGUgbW9zdCByZWNlbnQgZGlyZWN0b3J5IHNlbnQgd2l0aCBEaXJlY3Rvcnk7IGl0IG11c3Qgbm90IGNvbnRhaW4gYC8nLgorIyAgICAgSWYgdGhlIHVzZXIgaXMgb3BlcmF0aW5nIG9uIG9ubHkgc29tZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSwgb25seSB0aG9zZQorIyAgICAgZmlsZXMgbmVlZCB0byBiZSBpbmNsdWRlZC4gVGhpcyBjYW4gYWxzbyBiZSBzZW50IHdpdGhvdXQgRW50cnksIGlmIHRoZXJlCisjICAgICBpcyBubyBlbnRyeSBmb3IgdGhlIGZpbGUuCitzdWIgcmVxX01vZGlmaWVkCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBteSAkbW9kZSA9IDxTVERJTj47CisgICAgY2hvbXAgJG1vZGU7CisgICAgbXkgJHNpemUgPSA8U1RESU4+OworICAgIGNob21wICRzaXplOworCisgICAgIyBHcmFiIGNvbmZpZyBpbmZvcm1hdGlvbgorICAgIG15ICRibG9ja3NpemUgPSA4MTkyOworICAgIG15ICRieXRlc2xlZnQgPSAkc2l6ZTsKKyAgICBteSAkdG1wOworCisgICAgIyBHZXQgYSBmaWxlaGFuZGxlL25hbWUgdG8gd3JpdGUgaXQgdG8KKyAgICBteSAoICRmaCwgJGZpbGVuYW1lICkgPSB0ZW1wZmlsZSggRElSID0+ICRURU1QX0RJUiApOworCisgICAgIyBMb29wIG92ZXIgZmlsZSBkYXRhIHdyaXRpbmcgb3V0IHRvIHRlbXBvcmFyeSBmaWxlLgorICAgIHdoaWxlICggJGJ5dGVzbGVmdCApCisgICAgeworICAgICAgICAkYmxvY2tzaXplID0gJGJ5dGVzbGVmdCBpZiAoICRieXRlc2xlZnQgPCAkYmxvY2tzaXplICk7CisgICAgICAgIHJlYWQgU1RESU4sICR0bXAsICRibG9ja3NpemU7CisgICAgICAgIHByaW50ICRmaCAkdG1wOworICAgICAgICAkYnl0ZXNsZWZ0IC09ICRibG9ja3NpemU7CisgICAgfQorCisgICAgY2xvc2UgJGZoOworCisgICAgIyBFbnN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgc2Vuc2libGUgZm9yIHRoZSBmaWxlIG1vZGUKKyAgICBpZiAoICRtb2RlID1+IC91PShcdyspLyApCisgICAgeworICAgICAgICAkbW9kZSA9ICQxOworICAgIH0gZWxzZSB7CisgICAgICAgICRtb2RlID0gInJ3IjsKKyAgICB9CisKKyAgICAjIFNhdmUgdGhlIGZpbGUgZGF0YSBpbiAkc3RhdGUKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXttb2RpZmllZF9maWxlbmFtZX0gPSAkZmlsZW5hbWU7CisgICAgJHN0YXRlLT57ZW50cmllc317JHN0YXRlLT57ZGlyZWN0b3J5fS4kZGF0YX17bW9kaWZpZWRfbW9kZX0gPSAkbW9kZTsKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXttb2RpZmllZF9oYXNofSA9IGBnaXQtaGFzaC1vYmplY3QgJGZpbGVuYW1lYDsKKyAgICAkc3RhdGUtPntlbnRyaWVzfXskc3RhdGUtPntkaXJlY3Rvcnl9LiRkYXRhfXttb2RpZmllZF9oYXNofSA9fiBzL1xzLiokLy9zOworCisgICAgIyRsb2ctPmRlYnVnKCJyZXFfTW9kaWZpZWQgOiBmaWxlPSRkYXRhIG1vZGU9JG1vZGUgc2l6ZT0kc2l6ZSIpOworfQorCisjIFVuY2hhbmdlZCBmaWxlbmFtZSBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IG5vLiBUZWxsIHRoZSBzZXJ2ZXIgdGhhdCBmaWxlbmFtZSBoYXMgbm90IGJlZW4KKyMgICAgIG1vZGlmaWVkIGluIHRoZSBjaGVja2VkIG91dCBkaXJlY3RvcnkuIFRoZSBmaWxlbmFtZSBpcyBhIGZpbGUgd2l0aGluIHRoZQorIyAgICAgbW9zdCByZWNlbnQgZGlyZWN0b3J5IHNlbnQgd2l0aCBEaXJlY3Rvcnk7IGl0IG11c3Qgbm90IGNvbnRhaW4gYC8nLgorc3ViIHJlcV9VbmNoYW5nZWQKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICRzdGF0ZS0+e2VudHJpZXN9eyRzdGF0ZS0+e2RpcmVjdG9yeX0uJGRhdGF9e3VuY2hhbmdlZH0gPSAxOworCisgICAgIyRsb2ctPmRlYnVnKCJyZXFfVW5jaGFuZ2VkIDogJGRhdGEiKTsKK30KKworIyBBcmd1bWVudCB0ZXh0IFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIFNhdmUgYXJndW1lbnQgZm9yIHVzZSBpbiBhIHN1YnNlcXVlbnQgY29tbWFuZC4KKyMgICAgIEFyZ3VtZW50cyBhY2N1bXVsYXRlIHVudGlsIGFuIGFyZ3VtZW50LXVzaW5nIGNvbW1hbmQgaXMgZ2l2ZW4sIGF0IHdoaWNoCisjICAgICBwb2ludCB0aGV5IGFyZSBmb3Jnb3R0ZW4uCisjIEFyZ3VtZW50eCB0ZXh0IFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogbm8uIEFwcGVuZCBcbiBmb2xsb3dlZCBieSB0ZXh0IHRvIHRoZSBjdXJyZW50IGFyZ3VtZW50CisjICAgICBiZWluZyBzYXZlZC4KK3N1YiByZXFfQXJndW1lbnQKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgICMgQXJndW1lbnR4IG1lYW5zOiBhcHBlbmQgdG8gbGFzdCBBcmd1bWVudCAod2l0aCBhIG5ld2xpbmUgaW4gZnJvbnQpCisKKyAgICAkbG9nLT5kZWJ1ZygiJGNtZCA6ICRkYXRhIik7CisKKyAgICBpZiAoICRjbWQgZXEgJ0FyZ3VtZW50eCcpIHsKKyAgICAgICAgJHskc3RhdGUtPnthcmd1bWVudHN9fVskI3skc3RhdGUtPnthcmd1bWVudHN9fV0gLj0gIlxuIiAuICRkYXRhOworICAgIH0gZWxzZSB7CisgICAgICAgIHB1c2ggQHskc3RhdGUtPnthcmd1bWVudHN9fSwgJGRhdGE7CisgICAgfQorfQorCisjIGV4cGFuZC1tb2R1bGVzIFxuCisjICAgICBSZXNwb25zZSBleHBlY3RlZDogeWVzLiBFeHBhbmQgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIHNwZWNpZmllZCBpbiB0aGUKKyMgICAgIGFyZ3VtZW50cy4gUmV0dXJucyB0aGUgZGF0YSBpbiBNb2R1bGUtZXhwYW5zaW9uIHJlc3BvbnNlcy4gTm90ZSB0aGF0IHRoZQorIyAgICAgc2VydmVyIGNhbiBhc3N1bWUgdGhhdCB0aGlzIGlzIGNoZWNrb3V0IG9yIGV4cG9ydCwgbm90IHJ0YWcgb3IgcmRpZmY7IHRoZQorIyAgICAgbGF0dGVyIGRvIG5vdCBhY2Nlc3MgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCB0aHVzIGhhdmUgbm8gbmVlZCB0bworIyAgICAgZXhwYW5kIG1vZHVsZXMgb24gdGhlIGNsaWVudCBzaWRlLiBFeHBhbmQgbWF5IG5vdCBiZSB0aGUgYmVzdCB3b3JkIGZvcgorIyAgICAgd2hhdCB0aGlzIHJlcXVlc3QgZG9lcy4gSXQgZG9lcyBub3QgbmVjZXNzYXJpbHkgdGVsbCB5b3UgYWxsIHRoZSBmaWxlcworIyAgICAgY29udGFpbmVkIGluIGEgbW9kdWxlLCBmb3IgZXhhbXBsZS4gQmFzaWNhbGx5IGl0IGlzIGEgd2F5IG9mIHRlbGxpbmcgeW91CisjICAgICB3aGljaCB3b3JraW5nIGRpcmVjdG9yaWVzIHRoZSBzZXJ2ZXIgbmVlZHMgdG8ga25vdyBhYm91dCBpbiBvcmRlciB0bworIyAgICAgaGFuZGxlIGEgY2hlY2tvdXQgb2YgdGhlIHNwZWNpZmllZCBtb2R1bGVzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGF0IHRoZQorIyAgICAgc2VydmVyIGhhcyBhIG1vZHVsZSBkZWZpbmVkIGJ5CisjICAgYWxpYXNtb2R1bGUgLWEgMWRpcgorIyAgICAgVGhhdCBpcywgb25lIGNhbiBjaGVjayBvdXQgYWxpYXNtb2R1bGUgYW5kIGl0IHdpbGwgdGFrZSAxZGlyIGluIHRoZQorIyAgICAgcmVwb3NpdG9yeSBhbmQgY2hlY2sgaXQgb3V0IHRvIDFkaXIgaW4gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LiBOb3cgc3VwcG9zZQorIyAgICAgdGhlIGNsaWVudCBhbHJlYWR5IGhhcyB0aGlzIG1vZHVsZSBjaGVja2VkIG91dCBhbmQgaXMgcGxhbm5pbmcgb24gdXNpbmcKKyMgICAgIHRoZSBjbyByZXF1ZXN0IHRvIHVwZGF0ZSBpdC4gV2l0aG91dCB1c2luZyBleHBhbmQtbW9kdWxlcywgdGhlIGNsaWVudAorIyAgICAgd291bGQgaGF2ZSB0d28gYmFkIGNob2ljZXM6IGl0IGNvdWxkIGVpdGhlciBzZW5kIGluZm9ybWF0aW9uIGFib3V0IGFsbAorIyAgICAgd29ya2luZyBkaXJlY3RvcmllcyB1bmRlciB0aGUgY3VycmVudCBkaXJlY3RvcnksIHdoaWNoIGNvdWxkIGJlCisjICAgICB1bm5lY2Vzc2FyaWx5IHNsb3csIG9yIGl0IGNvdWxkIGJlIGlnbm9yYW50IG9mIHRoZSBmYWN0IHRoYXQgYWxpYXNtb2R1bGUKKyMgICAgIHN0YW5kcyBmb3IgMWRpciwgYW5kIG5lZ2xlY3QgdG8gc2VuZCBpbmZvcm1hdGlvbiBmb3IgMWRpciwgd2hpY2ggd291bGQKKyMgICAgIGxlYWQgdG8gaW5jb3JyZWN0IG9wZXJhdGlvbi4gV2l0aCBleHBhbmQtbW9kdWxlcywgdGhlIGNsaWVudCB3b3VsZCBmaXJzdAorIyAgICAgYXNrIGZvciB0aGUgbW9kdWxlIHRvIGJlIGV4cGFuZGVkOgorc3ViIHJlcV9leHBhbmRtb2R1bGVzCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgpOworCisgICAgJGxvZy0+ZGVidWcoInJlcV9leHBhbmRtb2R1bGVzIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkgKTsKKworICAgIHVubGVzcyAoIHJlZiAkc3RhdGUtPnthcmd1bWVudHN9IGVxICJBUlJBWSIgKQorICAgIHsKKyAgICAgICAgcHJpbnQgIm9rXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkbW9kdWxlICggQHskc3RhdGUtPnthcmd1bWVudHN9fSApCisgICAgeworICAgICAgICAkbG9nLT5kZWJ1ZygiU0VORCA6IE1vZHVsZS1leHBhbnNpb24gJG1vZHVsZSIpOworICAgICAgICBwcmludCAiTW9kdWxlLWV4cGFuc2lvbiAkbW9kdWxlXG4iOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKKyAgICBzdGF0ZWNsZWFudXAoKTsKK30KKworIyBjbyBcbgorIyAgICAgUmVzcG9uc2UgZXhwZWN0ZWQ6IHllcy4gR2V0IGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkuIFRoaXMgdXNlcyBhbnkKKyMgICAgIHByZXZpb3VzIEFyZ3VtZW50LCBEaXJlY3RvcnksIEVudHJ5LCBvciBNb2RpZmllZCByZXF1ZXN0cywgaWYgdGhleSBoYXZlCisjICAgICBiZWVuIHNlbnQuIEFyZ3VtZW50cyB0byB0aGlzIGNvbW1hbmQgYXJlIG1vZHVsZSBuYW1lczsgdGhlIGNsaWVudCBjYW5ub3QKKyMgICAgIGtub3cgd2hhdCBkaXJlY3RvcmllcyB0aGV5IGNvcnJlc3BvbmQgdG8gZXhjZXB0IGJ5ICgxKSBqdXN0IHNlbmRpbmcgdGhlCisjICAgICBjbyByZXF1ZXN0LCBhbmQgdGhlbiBzZWVpbmcgd2hhdCBkaXJlY3RvcnkgbmFtZXMgdGhlIHNlcnZlciBzZW5kcyBiYWNrIGluCisjICAgICBpdHMgcmVzcG9uc2VzLCBhbmQgKDIpIHRoZSBleHBhbmQtbW9kdWxlcyByZXF1ZXN0Lgorc3ViIHJlcV9jbworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImNvIik7CisKKyAgICBteSAkbW9kdWxlID0gJHN0YXRlLT57YXJnc31bMF07CisgICAgbXkgJGNoZWNrb3V0X3BhdGggPSAkbW9kdWxlOworCisgICAgIyB1c2UgdGhlIHVzZXIgc3BlY2lmaWVkIGRpcmVjdG9yeSBpZiB3ZSdyZSBnaXZlbiBpdAorICAgICRjaGVja291dF9wYXRoID0gJHN0YXRlLT57b3B0fXtkfSBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17ZH0gKSApOworCisgICAgJGxvZy0+ZGVidWcoInJlcV9jbyA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApICk7CisKKyAgICAkbG9nLT5pbmZvKCJDaGVja2luZyBvdXQgbW9kdWxlICckbW9kdWxlJyAoJHN0YXRlLT57Q1ZTUk9PVH0pIHRvICckY2hlY2tvdXRfcGF0aCciKTsKKworICAgICRFTlZ7R0lUX0RJUn0gPSAkc3RhdGUtPntDVlNST09UfSAuICIvIjsKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkbW9kdWxlLCAkbG9nKTsKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAkY2hlY2tvdXRfcGF0aCA9fiBzfC8kfHw7ICMgZ2V0IHJpZCBvZiB0cmFpbGluZyBzbGFzaGVzCisKKyAgICAjIEVjbGlwc2Ugc2VlbXMgdG8gbmVlZCB0aGUgQ2xlYXItc3RpY2t5IGNvbW1hbmQKKyAgICAjIHRvIHByZXBhcmUgdGhlICdFbnRyaWVzJyBmaWxlIGZvciB0aGUgbmV3IGRpcmVjdG9yeS4KKyAgICBwcmludCAiQ2xlYXItc3RpY2t5ICRjaGVja291dF9wYXRoL1xuIjsKKyAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS9cbiI7CisgICAgcHJpbnQgIkNsZWFyLXN0YXRpYy1kaXJlY3RvcnkgJGNoZWNrb3V0X3BhdGgvXG4iOworICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kbW9kdWxlL1xuIjsKKyAgICBwcmludCAiQ2xlYXItc3RpY2t5ICRjaGVja291dF9wYXRoL1xuIjsgIyB5ZXMsIHR3aWNlCisgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvXG4iOworICAgIHByaW50ICJUZW1wbGF0ZSAkY2hlY2tvdXRfcGF0aC9cbiI7CisgICAgcHJpbnQgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRtb2R1bGUvXG4iOworICAgIHByaW50ICIwXG4iOworCisgICAgIyBpbnN0cnVjdCB0aGUgY2xpZW50IHRoYXQgd2UncmUgY2hlY2tpbmcgb3V0IHRvICRjaGVja291dF9wYXRoCisgICAgcHJpbnQgIkUgY3ZzIGNoZWNrb3V0OiBVcGRhdGluZyAkY2hlY2tvdXRfcGF0aFxuIjsKKworICAgIG15ICVzZWVuZGlycyA9ICgpOworICAgIG15ICRsYXN0ZGlyID0nJzsKKworICAgICMgcmVjdXJzaXZlCisgICAgc3ViIHByZXBkaXIgeworICAgICAgIG15ICgkZGlyLCAkcmVwb2RpciwgJHJlbW90ZWRpciwgJHNlZW5kaXJzKSA9IEBfOworICAgICAgIG15ICRwYXJlbnQgPSBkaXJuYW1lKCRkaXIpOworICAgICAgICRkaXIgICAgICAgPX4gc3wvKyR8fDsKKyAgICAgICAkcmVwb2RpciAgID1+IHN8LyskfHw7CisgICAgICAgJHJlbW90ZWRpciA9fiBzfC8rJHx8OworICAgICAgICRwYXJlbnQgICAgPX4gc3wvKyR8fDsKKyAgICAgICAkbG9nLT5kZWJ1ZygiYW5ub3VuY2VkaXIgJGRpciwgJHJlcG9kaXIsICRyZW1vdGVkaXIiICk7CisKKyAgICAgICBpZiAoJHBhcmVudCBlcSAnLicgfHwgJHBhcmVudCBlcSAnLi8nKSB7CisgICAgICAgICAgICRwYXJlbnQgPSAnJzsKKyAgICAgICB9CisgICAgICAgIyByZWN1cnNlIHRvIGFubm91bmNlIHVuc2VlbiBwYXJlbnRzIGZpcnN0CisgICAgICAgaWYgKGxlbmd0aCgkcGFyZW50KSAmJiAhZXhpc3RzKCRzZWVuZGlycy0+eyRwYXJlbnR9KSkgeworICAgICAgICAgICBwcmVwZGlyKCRwYXJlbnQsICRyZXBvZGlyLCAkcmVtb3RlZGlyLCAkc2VlbmRpcnMpOworICAgICAgIH0KKyAgICAgICAjIEFubm91bmNlIHRoYXQgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSBhdCB0aGUgcGFyZW50IGxldmVsCisgICAgICAgaWYgKCRwYXJlbnQpIHsKKyAgICAgICAgICAgcHJpbnQgIkUgY3ZzIGNoZWNrb3V0OiBVcGRhdGluZyAkcmVtb3RlZGlyLyRwYXJlbnRcbiI7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgcHJpbnQgIkUgY3ZzIGNoZWNrb3V0OiBVcGRhdGluZyAkcmVtb3RlZGlyXG4iOworICAgICAgIH0KKyAgICAgICBwcmludCAiQ2xlYXItc3RpY2t5ICRyZW1vdGVkaXIvJHBhcmVudC9cbiI7CisgICAgICAgcHJpbnQgIiRyZXBvZGlyLyRwYXJlbnQvXG4iOworCisgICAgICAgcHJpbnQgIkNsZWFyLXN0YXRpYy1kaXJlY3RvcnkgJHJlbW90ZWRpci8kZGlyL1xuIjsKKyAgICAgICBwcmludCAiJHJlcG9kaXIvJGRpci9cbiI7CisgICAgICAgcHJpbnQgIkNsZWFyLXN0aWNreSAkcmVtb3RlZGlyLyRwYXJlbnQvXG4iOyAjIHllcywgdHdpY2UKKyAgICAgICBwcmludCAiJHJlcG9kaXIvJHBhcmVudC9cbiI7CisgICAgICAgcHJpbnQgIlRlbXBsYXRlICRyZW1vdGVkaXIvJGRpci9cbiI7CisgICAgICAgcHJpbnQgIiRyZXBvZGlyLyRkaXIvXG4iOworICAgICAgIHByaW50ICIwXG4iOworCisgICAgICAgJHNlZW5kaXJzLT57JGRpcn0gPSAxOworICAgIH0KKworICAgIGZvcmVhY2ggbXkgJGdpdCAoIEB7JHVwZGF0ZXItPmdldGhlYWR9ICkKKyAgICB7CisgICAgICAgICMgRG9uJ3Qgd2FudCB0byBjaGVjayBvdXQgZGVsZXRlZCBmaWxlcworICAgICAgICBuZXh0IGlmICggJGdpdC0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgKTsKKworICAgICAgICAoICRnaXQtPntuYW1lfSwgJGdpdC0+e2Rpcn0gKSA9IGZpbGVuYW1lc3BsaXQoJGdpdC0+e25hbWV9KTsKKworICAgICAgIGlmIChsZW5ndGgoJGdpdC0+e2Rpcn0pICYmICRnaXQtPntkaXJ9IG5lICcuLycKKyAgICAgICAgICAgJiYgJGdpdC0+e2Rpcn0gbmUgJGxhc3RkaXIgKSB7CisgICAgICAgICAgIHVubGVzcyAoZXhpc3RzKCRzZWVuZGlyc3skZ2l0LT57ZGlyfX0pKSB7CisgICAgICAgICAgICAgICBwcmVwZGlyKCRnaXQtPntkaXJ9LCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS8iLAorICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2tvdXRfcGF0aCwgXCVzZWVuZGlycyk7CisgICAgICAgICAgICAgICAkbGFzdGRpciA9ICRnaXQtPntkaXJ9OworICAgICAgICAgICAgICAgJHNlZW5kaXJzeyRnaXQtPntkaXJ9fSA9IDE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcHJpbnQgIkUgY3ZzIGNoZWNrb3V0OiBVcGRhdGluZyAvJGNoZWNrb3V0X3BhdGgvJGdpdC0+e2Rpcn1cbiI7CisgICAgICAgfQorCisgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhpcyBmaWxlCisgICAgICAgIHByaW50ICJNb2QtdGltZSAkZ2l0LT57bW9kaWZpZWR9XG4iOworCisgICAgICAgICMgcHJpbnQgc29tZSBpbmZvcm1hdGlvbiB0byB0aGUgY2xpZW50CisgICAgICAgIGlmICggZGVmaW5lZCAoICRnaXQtPntkaXJ9ICkgYW5kICRnaXQtPntkaXJ9IG5lICIuLyIgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiTSBVICRjaGVja291dF9wYXRoLyRnaXQtPntkaXJ9JGdpdC0+e25hbWV9XG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnQgIk0gVSAkY2hlY2tvdXRfcGF0aC8kZ2l0LT57bmFtZX1cbiI7CisgICAgICAgIH0KKworICAgICAgICMgaW5zdHJ1Y3QgY2xpZW50IHdlJ3JlIHNlbmRpbmcgYSBmaWxlIHRvIHB1dCBpbiB0aGlzIHBhdGgKKyAgICAgICBwcmludCAiQ3JlYXRlZCAkY2hlY2tvdXRfcGF0aC8iIC4gKCBkZWZpbmVkICggJGdpdC0+e2Rpcn0gKSBhbmQgJGdpdC0+e2Rpcn0gbmUgIi4vIiA/ICRnaXQtPntkaXJ9IC4gIi8iIDogIiIgKSAuICJcbiI7CisKKyAgICAgICBwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJG1vZHVsZS8iIC4gKCBkZWZpbmVkICggJGdpdC0+e2Rpcn0gKSBhbmQgJGdpdC0+e2Rpcn0gbmUgIi4vIiA/ICRnaXQtPntkaXJ9IC4gIi8iIDogIiIgKSAuICIkZ2l0LT57bmFtZX1cbiI7CisKKyAgICAgICAgIyB0aGlzIGlzIGFuICJlbnRyaWVzIiBsaW5lCisgICAgICAgIHByaW50ICIvJGdpdC0+e25hbWV9LzEuJGdpdC0+e3JldmlzaW9ufS8vL1xuIjsKKyAgICAgICAgIyBwZXJtaXNzaW9ucworICAgICAgICBwcmludCAidT0kZ2l0LT57bW9kZX0sZz0kZ2l0LT57bW9kZX0sbz0kZ2l0LT57bW9kZX1cbiI7CisKKyAgICAgICAgIyB0cmFuc21pdCBmaWxlCisgICAgICAgIHRyYW5zbWl0ZmlsZSgkZ2l0LT57ZmlsZWhhc2h9KTsKKyAgICB9CisKKyAgICBwcmludCAib2tcbiI7CisKKyAgICBzdGF0ZWNsZWFudXAoKTsKK30KKworIyB1cGRhdGUgXG4KKyMgICAgIFJlc3BvbnNlIGV4cGVjdGVkOiB5ZXMuIEFjdHVhbGx5IGRvIGEgY3ZzIHVwZGF0ZSBjb21tYW5kLiBUaGlzIHVzZXMgYW55CisjICAgICBwcmV2aW91cyBBcmd1bWVudCwgRGlyZWN0b3J5LCBFbnRyeSwgb3IgTW9kaWZpZWQgcmVxdWVzdHMsIGlmIHRoZXkgaGF2ZQorIyAgICAgYmVlbiBzZW50LiBUaGUgbGFzdCBEaXJlY3Rvcnkgc2VudCBzcGVjaWZpZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGF0IHRoZQorIyAgICAgdGltZSBvZiB0aGUgb3BlcmF0aW9uLiBUaGUgLUkgb3B0aW9uIGlzIG5vdCB1c2VkLS1maWxlcyB3aGljaCB0aGUgY2xpZW50CisjICAgICBjYW4gZGVjaWRlIHdoZXRoZXIgdG8gaWdub3JlIGFyZSBub3QgbWVudGlvbmVkIGFuZCB0aGUgY2xpZW50IHNlbmRzIHRoZQorIyAgICAgUXVlc3Rpb25hYmxlIHJlcXVlc3QgZm9yIG90aGVycy4KK3N1YiByZXFfdXBkYXRlCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX3VwZGF0ZSA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKworICAgIGFyZ3NwbGl0KCJ1cGRhdGUiKTsKKworICAgICMKKyAgICAjIEl0IG1heSBqdXN0IGJlIGEgY2xpZW50IGV4cGxvcmluZyB0aGUgYXZhaWxhYmxlIGhlYWRzL21vZHVsZXMKKyAgICAjIGluIHRoYXQgY2FzZSwgbGlzdCB0aGVtIGFzIHRvcCBsZXZlbCBkaXJlY3RvcmllcyBhbmQgbGVhdmUgaXQKKyAgICAjIGF0IHRoYXQuIEVjbGlwc2UgdXNlcyB0aGlzIHRlY2huaXF1ZSB0byBvZmZlciB5b3UgYSBsaXN0IG9mCisgICAgIyBwcm9qZWN0cyAoaGVhZHMgaW4gdGhpcyBjYXNlKSB0byBjaGVja291dC4KKyAgICAjCisgICAgaWYgKCRzdGF0ZS0+e21vZHVsZX0gZXEgJycpIHsKKyAgICAgICAgcHJpbnQgIkUgY3ZzIHVwZGF0ZTogVXBkYXRpbmcgLlxuIjsKKwlvcGVuZGlyIEhFQURTLCAkc3RhdGUtPntDVlNST09UfSAuICcvcmVmcy9oZWFkcyc7CisJd2hpbGUgKG15ICRoZWFkID0gcmVhZGRpcihIRUFEUykpIHsKKwkgICAgaWYgKC1mICRzdGF0ZS0+e0NWU1JPT1R9IC4gJy9yZWZzL2hlYWRzLycgLiAkaGVhZCkgeworCSAgICAgICAgcHJpbnQgIkUgY3ZzIHVwZGF0ZTogTmV3IGRpcmVjdG9yeSBgJGhlYWQnXG4iOworCSAgICB9CisJfQorCWNsb3NlZGlyIEhFQURTOworCXByaW50ICJva1xuIjsKKwlyZXR1cm4gMTsKKyAgICB9CisKKworICAgICMgR3JhYiBhIGhhbmRsZSB0byB0aGUgU1FMaXRlIGRiIGFuZCBkbyBhbnkgbmVjZXNzYXJ5IHVwZGF0ZXMKKyAgICBteSAkdXBkYXRlciA9IEdJVENWUzo6dXBkYXRlci0+bmV3KCRzdGF0ZS0+e0NWU1JPT1R9LCAkc3RhdGUtPnttb2R1bGV9LCAkbG9nKTsKKworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMkbG9nLT5kZWJ1ZygidXBkYXRlIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICAkbG9nLT5kZWJ1ZygiUHJvY2Vzc2luZyBmaWxlICRmaWxlbmFtZSIpOworCisgICAgICAgICMgaWYgd2UgaGF2ZSBhIC1DIHdlIHNob3VsZCBwcmV0ZW5kIHdlIG5ldmVyIHNhdyBtb2RpZmllZCBzdHVmZgorICAgICAgICBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17Q30gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGV0ZSAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9OworICAgICAgICAgICAgZGVsZXRlICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9OworICAgICAgICAgICAgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIG15ICRtZXRhOworICAgICAgICBpZiAoIGRlZmluZWQoJHN0YXRlLT57b3B0fXtyfSkgYW5kICRzdGF0ZS0+e29wdH17cn0gPX4gL14xXC4oXGQrKS8gKQorICAgICAgICB7CisgICAgICAgICAgICAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgbmV4dCB1bmxlc3MgKCAkbWV0YS0+e3JldmlzaW9ufSApOworCisgICAgICAgIG15ICRvbGRtZXRhID0gJG1ldGE7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgICMgSWYgdGhlIHdvcmtpbmcgY29weSBpcyBhbiBvbGQgcmV2aXNpb24sIGxldHMgZ2V0IHRoYXQgdmVyc2lvbiB0b28gZm9yIGNvbXBhcmlzb24uCisgICAgICAgIGlmICggZGVmaW5lZCgkd3JldikgYW5kICR3cmV2ICE9ICRtZXRhLT57cmV2aXNpb259ICkKKyAgICAgICAgeworICAgICAgICAgICAgJG9sZG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgfQorCisgICAgICAgICMkbG9nLT5kZWJ1ZygiVGFyZ2V0IHJldmlzaW9uIGlzICRtZXRhLT57cmV2aXNpb259LCBjdXJyZW50IHdvcmtpbmcgcmV2aXNpb24gaXMgJHdyZXYiKTsKKworICAgICAgICAjIEZpbGVzIGFyZSB1cCB0byBkYXRlIGlmIHRoZSB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uLAorICAgICAgICAjIGFuZCB0aGUgd29ya2luZyBjb3B5IGlzIHVubW9kaWZpZWQgX2FuZF8gdGhlIHVzZXIgaGFzbid0IHNwZWNpZmllZCAtQworICAgICAgICBuZXh0IGlmICggZGVmaW5lZCAoICR3cmV2ICkKKyAgICAgICAgICAgICAgICAgIGFuZCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KQorICAgICAgICAgICAgICAgICAgYW5kICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259CisgICAgICAgICAgICAgICAgICBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9CisgICAgICAgICAgICAgICAgICBhbmQgbm90IGV4aXN0cyAoICRzdGF0ZS0+e29wdH17Q30gKSApOworCisgICAgICAgICMgSWYgdGhlIHdvcmtpbmcgY29weSBhbmQgcmVwbyBjb3B5IGhhdmUgdGhlIHNhbWUgcmV2aXNpb24sCisgICAgICAgICMgYnV0IHRoZSB3b3JraW5nIGNvcHkgaXMgbW9kaWZpZWQsIHRlbGwgdGhlIGNsaWVudCBpdCdzIG1vZGlmaWVkCisgICAgICAgIGlmICggZGVmaW5lZCAoICR3cmV2ICkKKyAgICAgICAgICAgICBhbmQgZGVmaW5lZCgkbWV0YS0+e3JldmlzaW9ufSkKKyAgICAgICAgICAgICBhbmQgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0KKyAgICAgICAgICAgICBhbmQgbm90IGV4aXN0cyAoICRzdGF0ZS0+e29wdH17Q30gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIlRlbGwgdGhlIGNsaWVudCB0aGUgZmlsZSBpcyBtb2RpZmllZCIpOworICAgICAgICAgICAgcHJpbnQgIk1UIHRleHQgVVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCBmbmFtZSAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICRtZXRhLT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiApCisgICAgICAgIHsKKyAgICAgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUsMSk7CisKKyAgICAgICAgICAgICRsb2ctPmluZm8oIlJlbW92aW5nICckZmlsZW5hbWUnIGZyb20gd29ya2luZyBjb3B5IChubyBsb25nZXIgaW4gdGhlIHJlcG8pIik7CisKKyAgICAgICAgICAgIHByaW50ICJFIGN2cyB1cGRhdGU6IGAkZmlsZW5hbWUnIGlzIG5vIGxvbmdlciBpbiB0aGUgcmVwb3NpdG9yeVxuIjsKKyAgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBhY3R1YWxseSBfRE9fIHRoZSB1cGRhdGUgaWYgLW4gc3BlY2lmaWVkCisgICAgICAgICAgICB1bmxlc3MgKCAkc3RhdGUtPntnbG9iYWxvcHRpb25zfXstbn0gKSB7CisJCXByaW50ICJSZW1vdmVkICRkaXJwYXJ0XG4iOworCQlwcmludCAiJGZpbGVwYXJ0XG4iOworCSAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCBub3QgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gKQorCQlvciAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9IGVxICRvbGRtZXRhLT57ZmlsZWhhc2h9ICkKKyAgICAgICAgeworICAgICAgICAgICAgJGxvZy0+aW5mbygiVXBkYXRpbmcgJyRmaWxlbmFtZSciKTsKKyAgICAgICAgICAgICMgbm9ybWFsIHVwZGF0ZSwganVzdCBzZW5kIHRoZSBuZXcgcmV2aXNpb24gKGVpdGhlciBVPVVwZGF0ZSwgb3IgQT1BZGQsIG9yIFI9UmVtb3ZlKQorICAgICAgICAgICAgcHJpbnQgIk1UICt1cGRhdGVkXG4iOworICAgICAgICAgICAgcHJpbnQgIk1UIHRleHQgVVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCBmbmFtZSAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBwcmludCAiTVQgbmV3bGluZVxuIjsKKyAgICAgICAgICAgIHByaW50ICJNVCAtdXBkYXRlZFxuIjsKKworICAgICAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRmaWxlbmFtZSwxKTsKKworCSAgICAjIERvbid0IHdhbnQgdG8gYWN0dWFsbHkgX0RPXyB0aGUgdXBkYXRlIGlmIC1uIHNwZWNpZmllZAorCSAgICB1bmxlc3MgKCAkc3RhdGUtPntnbG9iYWxvcHRpb25zfXstbn0gKQorCSAgICB7CisJCWlmICggZGVmaW5lZCAoICR3cmV2ICkgKQorCQl7CisJCSAgICAjIGluc3RydWN0IGNsaWVudCB3ZSdyZSBzZW5kaW5nIGEgZmlsZSB0byBwdXQgaW4gdGhpcyBwYXRoIGFzIGEgcmVwbGFjZW1lbnQKKwkJICAgIHByaW50ICJVcGRhdGUtZXhpc3RpbmcgJGRpcnBhcnRcbiI7CisJCSAgICAkbG9nLT5kZWJ1ZygiVXBkYXRpbmcgZXhpc3RpbmcgZmlsZSAnVXBkYXRlLWV4aXN0aW5nICRkaXJwYXJ0JyIpOworCQl9IGVsc2UgeworCQkgICAgIyBpbnN0cnVjdCBjbGllbnQgd2UncmUgc2VuZGluZyBhIGZpbGUgdG8gcHV0IGluIHRoaXMgcGF0aCBhcyBhIG5ldyBmaWxlCisJCSAgICBwcmludCAiQ2xlYXItc3RhdGljLWRpcmVjdG9yeSAkZGlycGFydFxuIjsKKwkJICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRkaXJwYXJ0XG4iOworCQkgICAgcHJpbnQgIkNsZWFyLXN0aWNreSAkZGlycGFydFxuIjsKKwkJICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRkaXJwYXJ0XG4iOworCisJCSAgICAkbG9nLT5kZWJ1ZygiQ3JlYXRpbmcgbmV3IGZpbGUgJ0NyZWF0ZWQgJGRpcnBhcnQnIik7CisJCSAgICBwcmludCAiQ3JlYXRlZCAkZGlycGFydFxuIjsKKwkJfQorCQlwcmludCAkc3RhdGUtPntDVlNST09UfSAuICIvJHN0YXRlLT57bW9kdWxlfS8kZmlsZW5hbWVcbiI7CisKKwkJIyB0aGlzIGlzIGFuICJlbnRyaWVzIiBsaW5lCisJCSRsb2ctPmRlYnVnKCIvJGZpbGVwYXJ0LzEuJG1ldGEtPntyZXZpc2lvbn0vLy8iKTsKKwkJcHJpbnQgIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8vL1xuIjsKKworCQkjIHBlcm1pc3Npb25zCisJCSRsb2ctPmRlYnVnKCJTRU5EIDogdT0kbWV0YS0+e21vZGV9LGc9JG1ldGEtPnttb2RlfSxvPSRtZXRhLT57bW9kZX0iKTsKKwkJcHJpbnQgInU9JG1ldGEtPnttb2RlfSxnPSRtZXRhLT57bW9kZX0sbz0kbWV0YS0+e21vZGV9XG4iOworCisJCSMgdHJhbnNtaXQgZmlsZQorCQl0cmFuc21pdGZpbGUoJG1ldGEtPntmaWxlaGFzaH0pOworCSAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJVcGRhdGluZyAnJGZpbGVuYW1lJyIpOworICAgICAgICAgICAgbXkgKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICkgPSBmaWxlbmFtZXNwbGl0KCRtZXRhLT57bmFtZX0sMSk7CisKKyAgICAgICAgICAgIG15ICRkaXIgPSB0ZW1wZGlyKCBESVIgPT4gJFRFTVBfRElSLCBDTEVBTlVQID0+IDEgKSAuICIvIjsKKworICAgICAgICAgICAgY2hkaXIgJGRpcjsKKyAgICAgICAgICAgIG15ICRmaWxlX2xvY2FsID0gJGZpbGVwYXJ0IC4gIi5taW5lIjsKKyAgICAgICAgICAgIHN5c3RlbSgibG4iLCItcyIsJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX0sICRmaWxlX2xvY2FsKTsKKyAgICAgICAgICAgIG15ICRmaWxlX29sZCA9ICRmaWxlcGFydCAuICIuIiAuICRvbGRtZXRhLT57cmV2aXNpb259OworICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRvbGRtZXRhLT57ZmlsZWhhc2h9LCAkZmlsZV9vbGQpOworICAgICAgICAgICAgbXkgJGZpbGVfbmV3ID0gJGZpbGVwYXJ0IC4gIi4iIC4gJG1ldGEtPntyZXZpc2lvbn07CisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG1ldGEtPntmaWxlaGFzaH0sICRmaWxlX25ldyk7CisKKyAgICAgICAgICAgICMgd2UgbmVlZCB0byBtZXJnZSB3aXRoIHRoZSBsb2NhbCBjaGFuZ2VzICggTT1zdWNjZXNzZnVsIG1lcmdlLCBDPWNvbmZsaWN0IG1lcmdlICkKKyAgICAgICAgICAgICRsb2ctPmluZm8oIk1lcmdpbmcgJGZpbGVfbG9jYWwsICRmaWxlX29sZCwgJGZpbGVfbmV3Iik7CisKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJUZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBtZXJnZSBpcyAkZGlyIik7CisKKyAgICAgICAgICAgIG15ICRyZXR1cm4gPSBzeXN0ZW0oIm1lcmdlIiwgJGZpbGVfbG9jYWwsICRmaWxlX29sZCwgJGZpbGVfbmV3KTsKKyAgICAgICAgICAgICRyZXR1cm4gPj49IDg7CisKKyAgICAgICAgICAgIGlmICggJHJldHVybiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkbG9nLT5pbmZvKCJNZXJnZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgICAgICAgICAgcHJpbnQgIk0gTSAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoIlVwZGF0ZS1leGlzdGluZyAkZGlycGFydCIpOworCisgICAgICAgICAgICAgICAgIyBEb24ndCB3YW50IHRvIGFjdHVhbGx5IF9ET18gdGhlIHVwZGF0ZSBpZiAtbiBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICB1bmxlc3MgKCAkc3RhdGUtPntnbG9iYWxvcHRpb25zfXstbn0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlVwZGF0ZS1leGlzdGluZyAkZGlycGFydFxuIjsKKyAgICAgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICAgICAgJGxvZy0+ZGVidWcoIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8vLyIpOworICAgICAgICAgICAgICAgICAgICBwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8vXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHJldHVybiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkbG9nLT5pbmZvKCJNZXJnZWQgd2l0aCBjb25mbGljdHMiKTsKKyAgICAgICAgICAgICAgICBwcmludCAiTSBDICRmaWxlbmFtZVxuIjsKKworICAgICAgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBhY3R1YWxseSBfRE9fIHRoZSB1cGRhdGUgaWYgLW4gc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgdW5sZXNzICggJHN0YXRlLT57Z2xvYmFsb3B0aW9uc317LW59ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJVcGRhdGUtZXhpc3RpbmcgJGRpcnBhcnRcbiI7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICRzdGF0ZS0+e0NWU1JPT1R9IC4gIi8kc3RhdGUtPnttb2R1bGV9LyRmaWxlbmFtZVxuIjsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIi8kZmlsZXBhcnQvMS4kbWV0YS0+e3JldmlzaW9ufS8rLy9cbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRsb2ctPndhcm4oIk1lcmdlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBhY3R1YWxseSBfRE9fIHRoZSB1cGRhdGUgaWYgLW4gc3BlY2lmaWVkCisgICAgICAgICAgICB1bmxlc3MgKCAkc3RhdGUtPntnbG9iYWxvcHRpb25zfXstbn0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICMgcGVybWlzc2lvbnMKKyAgICAgICAgICAgICAgICAkbG9nLT5kZWJ1ZygiU0VORCA6IHU9JG1ldGEtPnttb2RlfSxnPSRtZXRhLT57bW9kZX0sbz0kbWV0YS0+e21vZGV9Iik7CisgICAgICAgICAgICAgICAgcHJpbnQgInU9JG1ldGEtPnttb2RlfSxnPSRtZXRhLT57bW9kZX0sbz0kbWV0YS0+e21vZGV9XG4iOworCisgICAgICAgICAgICAgICAgIyB0cmFuc21pdCBmaWxlLCBmb3JtYXQgaXMgc2luZ2xlIGludGVnZXIgb24gYSBsaW5lIGJ5IGl0c2VsZiAoZmlsZQorICAgICAgICAgICAgICAgICMgc2l6ZSkgZm9sbG93ZWQgYnkgdGhlIGZpbGUgY29udGVudHMKKyAgICAgICAgICAgICAgICAjIFRPRE8gOiB3ZSBzaG91bGQgY29weSBmaWxlcyBpbiBibG9ja3MKKyAgICAgICAgICAgICAgICBteSAkZGF0YSA9IGBjYXQgJGZpbGVfbG9jYWxgOworICAgICAgICAgICAgICAgICRsb2ctPmRlYnVnKCJGaWxlIHNpemUgOiAiIC4gbGVuZ3RoKCRkYXRhKSk7CisgICAgICAgICAgICAgICAgcHJpbnQgbGVuZ3RoKCRkYXRhKSAuICJcbiI7CisgICAgICAgICAgICAgICAgcHJpbnQgJGRhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoZGlyICIvIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX2NpCit7CisgICAgbXkgKCAkY21kLCAkZGF0YSApID0gQF87CisKKyAgICBhcmdzcGxpdCgiY2kiKTsKKworICAgICMkbG9nLT5kZWJ1ZygiU3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgJGxvZy0+aW5mbygicmVxX2NpIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworCisgICAgaWYgKCBAQVJHViAmJiAkQVJHVlswXSBlcSAncHNlcnZlcicpCisgICAgeworICAgICAgICBwcmludCAiZXJyb3IgMSBwc2VydmVyIGFjY2VzcyBjYW5ub3QgY29tbWl0XG4iOworICAgICAgICBleGl0OworICAgIH0KKworICAgIGlmICggLWUgJHN0YXRlLT57Q1ZTUk9PVH0gLiAiL2luZGV4IiApCisgICAgeworICAgICAgICAkbG9nLT53YXJuKCJmaWxlICdpbmRleCcgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGdpdCByZXBvc2l0b3J5Iik7CisgICAgICAgIHByaW50ICJlcnJvciAxIEluZGV4IGFscmVhZHkgZXhpc3RzIGluIGdpdCByZXBvXG4iOworICAgICAgICBleGl0OworICAgIH0KKworICAgIG15ICRsb2NrZmlsZSA9ICIkc3RhdGUtPntDVlNST09UfS9yZWZzL2hlYWRzLyRzdGF0ZS0+e21vZHVsZX0ubG9jayI7CisgICAgdW5sZXNzICggc3lzb3BlbihMT0NLRklMRSwkbG9ja2ZpbGUsT19FWENMfE9fQ1JFQVR8T19XUk9OTFkpICkKKyAgICB7CisgICAgICAgICRsb2ctPndhcm4oImxvY2tmaWxlICckbG9ja2ZpbGUnIGFscmVhZHkgZXhpc3RzLCBwbGVhc2UgdHJ5IGFnYWluIik7CisgICAgICAgIHByaW50ICJlcnJvciAxIExvY2sgZmlsZSAnJGxvY2tmaWxlJyBhbHJlYWR5IGV4aXN0cywgcGxlYXNlIHRyeSBhZ2FpblxuIjsKKyAgICAgICAgZXhpdDsKKyAgICB9CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIgKCBESVIgPT4gJFRFTVBfRElSICk7CisgICAgbXkgKCB1bmRlZiwgJGZpbGVfaW5kZXggKSA9IHRlbXBmaWxlICggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgJGxvZy0+aW5mbygiTG9jayBzdWNjZXNzZnVsLCBiYXNpbmcgY29tbWl0IG9uICckdG1wZGlyJywgaW5kZXggZmlsZSBpcyAnJGZpbGVfaW5kZXgnIik7CisKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHN0YXRlLT57Q1ZTUk9PVH0gLiAiLyI7CisgICAgJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkZmlsZV9pbmRleDsKKworICAgIGNoZGlyICR0bXBkaXI7CisKKyAgICAjIHBvcHVsYXRlIHRoZSB0ZW1wb3JhcnkgaW5kZXggYmFzZWQKKyAgICBzeXN0ZW0oImdpdC1yZWFkLXRyZWUiLCAkc3RhdGUtPnttb2R1bGV9KTsKKyAgICB1bmxlc3MgKCQ/ID09IDApCisgICAgeworCWRpZSAiRXJyb3IgcnVubmluZyBnaXQtcmVhZC10cmVlICRzdGF0ZS0+e21vZHVsZX0gJGZpbGVfaW5kZXggJCEiOworICAgIH0KKyAgICAkbG9nLT5pbmZvKCJDcmVhdGVkIGluZGV4ICckZmlsZV9pbmRleCcgd2l0aCBmb3IgaGVhZCAkc3RhdGUtPnttb2R1bGV9IC0gZXhpdCBzdGF0dXMgJD8iKTsKKworCisgICAgbXkgQGNvbW1pdHRlZGZpbGVzID0gKCk7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgIG15ICRjb21taXR0ZWRmaWxlID0gJGZpbGVuYW1lOworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIG5leHQgdW5sZXNzICggZXhpc3RzICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9IG9yIG5vdCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3VuY2hhbmdlZH0gKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICggJGZpbGVwYXJ0LCAkZGlycGFydCApID0gZmlsZW5hbWVzcGxpdCgkZmlsZW5hbWUpOworCisgICAgICAgICMgZG8gYSBjaGVja291dCBvZiB0aGUgZmlsZSBpZiBpdCBwYXJ0IG9mIHRoaXMgdHJlZQorICAgICAgICBpZiAoJHdyZXYpIHsKKyAgICAgICAgICAgIHN5c3RlbSgnZ2l0LWNoZWNrb3V0LWluZGV4JywgJy1mJywgJy11JywgJGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHVubGVzcyAoJD8gPT0gMCkgeworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3IgcnVubmluZyBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgJGZpbGVuYW1lIDogJCEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbXkgJGFkZGZsYWcgPSAwOworICAgICAgICBteSAkcm1mbGFnID0gMDsKKyAgICAgICAgJHJtZmxhZyA9IDEgaWYgKCBkZWZpbmVkKCR3cmV2KSBhbmQgJHdyZXYgPCAwICk7CisgICAgICAgICRhZGRmbGFnID0gMSB1bmxlc3MgKCAtZSAkZmlsZW5hbWUgKTsKKworICAgICAgICAjIERvIHVwIHRvIGRhdGUgY2hlY2tpbmcKKyAgICAgICAgdW5sZXNzICggJGFkZGZsYWcgb3IgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0gb3IgKCAkcm1mbGFnIGFuZCAtJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICMgZmFpbCBldmVyeXRoaW5nIGlmIGFuIHVwIHRvIGRhdGUgY2hlY2sgZmFpbHMKKyAgICAgICAgICAgIHByaW50ICJlcnJvciAxIFVwIHRvIGRhdGUgY2hlY2sgZmFpbGVkIGZvciAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBjbG9zZSBMT0NLRklMRTsKKyAgICAgICAgICAgIHVubGluaygkbG9ja2ZpbGUpOworICAgICAgICAgICAgY2hkaXIgIi8iOworICAgICAgICAgICAgZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1c2ggQGNvbW1pdHRlZGZpbGVzLCAkY29tbWl0dGVkZmlsZTsKKyAgICAgICAgJGxvZy0+aW5mbygiQ29tbWl0dGluZyAkZmlsZW5hbWUiKTsKKworICAgICAgICBzeXN0ZW0oIm1rZGlyIiwiLXAiLCRkaXJwYXJ0KSB1bmxlc3MgKCAtZCAkZGlycGFydCApOworCisgICAgICAgIHVubGVzcyAoICRybWZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5kZWJ1ZygicmVuYW1lICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICRmaWxlbmFtZSIpOworICAgICAgICAgICAgcmVuYW1lICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9LCRmaWxlbmFtZTsKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgbW9kZXMgdG8gcmVtb3ZlCisgICAgICAgICAgICBteSAkaW52bW9kZSA9ICIiOworICAgICAgICAgICAgZm9yZWFjaCAoIHF3IChyIHcgeCkgKSB7ICRpbnZtb2RlIC49ICRfIHVubGVzcyAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfbW9kZX0gPX4gLyRfLyApOyB9CisKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJjaG1vZCB1KyIgLiAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9IC4gIi0iIC4gJGludm1vZGUgLiAiICRmaWxlbmFtZSIpOworICAgICAgICAgICAgc3lzdGVtKCJjaG1vZCIsInUrIiAuICAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX21vZGV9IC4gIi0iIC4gJGludm1vZGUsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICRybWZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAkbG9nLT5pbmZvKCJSZW1vdmluZyBmaWxlICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICB1bmxpbmsoJGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHN5c3RlbSgiZ2l0LXVwZGF0ZS1pbmRleCIsICItLXJlbW92ZSIsICRmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkYWRkZmxhZyApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmluZm8oIkFkZGluZyBmaWxlICckZmlsZW5hbWUnIik7CisgICAgICAgICAgICBzeXN0ZW0oImdpdC11cGRhdGUtaW5kZXgiLCAiLS1hZGQiLCAkZmlsZW5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGxvZy0+aW5mbygiVXBkYXRpbmcgZmlsZSAnJGZpbGVuYW1lJyIpOworICAgICAgICAgICAgc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwgJGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVubGVzcyAoIHNjYWxhcihAY29tbWl0dGVkZmlsZXMpID4gMCApCisgICAgeworICAgICAgICBwcmludCAiRSBObyBmaWxlcyB0byBjb21taXRcbiI7CisgICAgICAgIHByaW50ICJva1xuIjsKKyAgICAgICAgY2xvc2UgTE9DS0ZJTEU7CisgICAgICAgIHVubGluaygkbG9ja2ZpbGUpOworICAgICAgICBjaGRpciAiLyI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBteSAkdHJlZWhhc2ggPSBgZ2l0LXdyaXRlLXRyZWVgOworICAgIG15ICRwYXJlbnRoYXNoID0gYGNhdCAkRU5We0dJVF9ESVJ9cmVmcy9oZWFkcy8kc3RhdGUtPnttb2R1bGV9YDsKKyAgICBjaG9tcCAkdHJlZWhhc2g7CisgICAgY2hvbXAgJHBhcmVudGhhc2g7CisKKyAgICAkbG9nLT5kZWJ1ZygiVHJlZWhhc2ggOiAkdHJlZWhhc2gsIFBhcmVudGhhc2ggOiAkcGFyZW50aGFzaCIpOworCisgICAgIyB3cml0ZSBvdXIgY29tbWl0IG1lc3NhZ2Ugb3V0IGlmIHdlIGhhdmUgb25lIC4uLgorICAgIG15ICggJG1zZ19maCwgJG1zZ19maWxlbmFtZSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIgKTsKKyAgICBwcmludCAkbXNnX2ZoICRzdGF0ZS0+e29wdH17bX07IyBpZiAoIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17bX0gKSApOworICAgIHByaW50ICRtc2dfZmggIlxuXG52aWEgZ2l0LUNWUyBlbXVsYXRvclxuIjsKKyAgICBjbG9zZSAkbXNnX2ZoOworCisgICAgbXkgJGNvbW1pdGhhc2ggPSBgZ2l0LWNvbW1pdC10cmVlICR0cmVlaGFzaCAtcCAkcGFyZW50aGFzaCA8ICRtc2dfZmlsZW5hbWVgOworICAgICRsb2ctPmluZm8oIkNvbW1pdCBoYXNoIDogJGNvbW1pdGhhc2giKTsKKworICAgIHVubGVzcyAoICRjb21taXRoYXNoID1+IC9bYS16QS1aMC05XXs0MH0vICkKKyAgICB7CisgICAgICAgICRsb2ctPndhcm4oIkNvbW1pdCBmYWlsZWQgKEludmFsaWQgY29tbWl0IGhhc2gpIik7CisgICAgICAgIHByaW50ICJlcnJvciAxIENvbW1pdCBmYWlsZWQgKHVua25vd24gcmVhc29uKVxuIjsKKyAgICAgICAgY2xvc2UgTE9DS0ZJTEU7CisgICAgICAgIHVubGluaygkbG9ja2ZpbGUpOworICAgICAgICBjaGRpciAiLyI7CisgICAgICAgIGV4aXQ7CisgICAgfQorCisgICAgcHJpbnQgTE9DS0ZJTEUgJGNvbW1pdGhhc2g7CisKKyAgICAkdXBkYXRlci0+dXBkYXRlKCk7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEBjb21taXR0ZWRmaWxlcyApCisgICAgeworICAgICAgICAkZmlsZW5hbWUgPSBmaWxlY2xlYW51cCgkZmlsZW5hbWUpOworCisgICAgICAgIG15ICRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9IGZpbGVuYW1lc3BsaXQoJGZpbGVuYW1lLCAxKTsKKworICAgICAgICAkbG9nLT5kZWJ1ZygiQ2hlY2tlZC1pbiAkZGlycGFydCA6ICRmaWxlbmFtZSIpOworCisgICAgICAgIGlmICggJG1ldGEtPntmaWxlaGFzaH0gZXEgImRlbGV0ZWQiICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIlJlbW92ZS1lbnRyeSAkZGlycGFydFxuIjsKKyAgICAgICAgICAgIHByaW50ICIkZmlsZW5hbWVcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiQ2hlY2tlZC1pbiAkZGlycGFydFxuIjsKKyAgICAgICAgICAgIHByaW50ICIkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICBwcmludCAiLyRmaWxlcGFydC8xLiRtZXRhLT57cmV2aXNpb259Ly8vXG4iOworICAgICAgICB9CisgICAgfQorCisgICAgY2xvc2UgTE9DS0ZJTEU7CisgICAgbXkgJHJlZmZpbGUgPSAiJEVOVntHSVRfRElSfXJlZnMvaGVhZHMvJHN0YXRlLT57bW9kdWxlfSI7CisgICAgdW5saW5rKCRyZWZmaWxlKTsKKyAgICByZW5hbWUoJGxvY2tmaWxlLCAkcmVmZmlsZSk7CisgICAgY2hkaXIgIi8iOworCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX3N0YXR1cworeworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoInN0YXR1cyIpOworCisgICAgJGxvZy0+aW5mbygicmVxX3N0YXR1cyA6ICIgLiAoIGRlZmluZWQoJGRhdGEpID8gJGRhdGEgOiAiW05VTExdIiApKTsKKyAgICAjJGxvZy0+ZGVidWcoInN0YXR1cyBzdGF0ZSA6ICIgLiBEdW1wZXIoJHN0YXRlKSk7CisKKyAgICAjIEdyYWIgYSBoYW5kbGUgdG8gdGhlIFNRTGl0ZSBkYiBhbmQgZG8gYW55IG5lY2Vzc2FyeSB1cGRhdGVzCisgICAgbXkgJHVwZGF0ZXIgPSBHSVRDVlM6OnVwZGF0ZXItPm5ldygkc3RhdGUtPntDVlNST09UfSwgJHN0YXRlLT57bW9kdWxlfSwgJGxvZyk7CisgICAgJHVwZGF0ZXItPnVwZGF0ZSgpOworCisgICAgIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGF0IGZpbGVzIHdlIHNob3VsZCBiZSBwcm92aWRpbmcgc3RhdHVzIG9uIC4uLgorICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisgICAgICAgIG15ICRvbGRtZXRhID0gJG1ldGE7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgICMgSWYgdGhlIHdvcmtpbmcgY29weSBpcyBhbiBvbGQgcmV2aXNpb24sIGxldHMgZ2V0IHRoYXQgdmVyc2lvbiB0b28gZm9yIGNvbXBhcmlzb24uCisgICAgICAgIGlmICggZGVmaW5lZCgkd3JldikgYW5kICR3cmV2ICE9ICRtZXRhLT57cmV2aXNpb259ICkKKyAgICAgICAgeworICAgICAgICAgICAgJG9sZG1ldGEgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgfQorCisgICAgICAgICMgVE9ETyA6IEFsbCBwb3NzaWJsZSBzdGF0dXNlcyBhcmVuJ3QgeWV0IGltcGxlbWVudGVkCisgICAgICAgIG15ICRzdGF0dXM7CisgICAgICAgICMgRmlsZXMgYXJlIHVwIHRvIGRhdGUgaWYgdGhlIHdvcmtpbmcgY29weSBhbmQgcmVwbyBjb3B5IGhhdmUgdGhlIHNhbWUgcmV2aXNpb24sIGFuZCB0aGUgd29ya2luZyBjb3B5IGlzIHVubW9kaWZpZWQKKyAgICAgICAgJHN0YXR1cyA9ICJVcC10by1kYXRlIiBpZiAoIGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkKCRtZXRhLT57cmV2aXNpb259KSBhbmQgJHdyZXYgPT0gJG1ldGEtPntyZXZpc2lvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17dW5jaGFuZ2VkfSBhbmQgKCBub3QgZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17Y29uZmxpY3R9ICkgb3IgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gIX4gL15cKz0vICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG1ldGEtPntmaWxlaGFzaH0gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgIyBOZWVkIGNoZWNrb3V0IGlmIHRoZSB3b3JraW5nIGNvcHkgaGFzIGFuIG9sZGVyIHJldmlzaW9uIHRoYW4gdGhlIHJlcG8gY29weSwgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZAorICAgICAgICAkc3RhdHVzIHx8PSAiTmVlZHMgQ2hlY2tvdXQiIGlmICggZGVmaW5lZCAoICR3cmV2ICkgYW5kIGRlZmluZWQgKCAkbWV0YS0+e3JldmlzaW9ufSApIGFuZCAkbWV0YS0+e3JldmlzaW9ufSA+ICR3cmV2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICggZGVmaW5lZCgkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2hhc2h9KSBhbmQgJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSBlcSAkb2xkbWV0YS0+e2ZpbGVoYXNofSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgICAgICMgTmVlZCBjaGVja291dCBpZiBpdCBleGlzdHMgaW4gdGhlIHJlcG8gYnV0IGRvZXNuJ3QgaGF2ZSBhIHdvcmtpbmcgY29weQorICAgICAgICAkc3RhdHVzIHx8PSAiTmVlZHMgQ2hlY2tvdXQiIGlmICggbm90IGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSApOworCisgICAgICAgICMgTG9jYWxseSBtb2RpZmllZCBpZiB3b3JraW5nIGNvcHkgYW5kIHJlcG8gY29weSBoYXZlIHRoZSBzYW1lIHJldmlzaW9uIGJ1dCB0aGVyZSBhcmUgbG9jYWwgY2hhbmdlcworICAgICAgICAkc3RhdHVzIHx8PSAiTG9jYWxseSBNb2RpZmllZCIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCgkbWV0YS0+e3JldmlzaW9ufSkgYW5kICR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259IGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApOworCisgICAgICAgICMgTmVlZHMgTWVyZ2UgaWYgd29ya2luZyBjb3B5IHJldmlzaW9uIGlzIGxlc3MgdGhhbiByZXBvIGNvcHkgYW5kIHRoZXJlIGFyZSBsb2NhbCBjaGFuZ2VzCisgICAgICAgICRzdGF0dXMgfHw9ICJOZWVkcyBNZXJnZSIgaWYgKCBkZWZpbmVkICggJHdyZXYgKSBhbmQgZGVmaW5lZCAoICRtZXRhLT57cmV2aXNpb259ICkgYW5kICRtZXRhLT57cmV2aXNpb259ID4gJHdyZXYgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfZmlsZW5hbWV9ICk7CisKKyAgICAgICAgJHN0YXR1cyB8fD0gIkxvY2FsbHkgQWRkZWQiIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ICkgYW5kIG5vdCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSApOworICAgICAgICAkc3RhdHVzIHx8PSAiTG9jYWxseSBSZW1vdmVkIiBpZiAoIGRlZmluZWQgKCAkd3JldiApIGFuZCBkZWZpbmVkICggJG1ldGEtPntyZXZpc2lvbn0gKSBhbmQgLSR3cmV2ID09ICRtZXRhLT57cmV2aXNpb259ICk7CisgICAgICAgICRzdGF0dXMgfHw9ICJVbnJlc29sdmVkIENvbmZsaWN0IiBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSApIGFuZCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSA9fiAvXlwrPS8gKTsKKyAgICAgICAgJHN0YXR1cyB8fD0gIkZpbGUgaGFkIGNvbmZsaWN0cyBvbiBtZXJnZSIgaWYgKCAwICk7CisKKyAgICAgICAgJHN0YXR1cyB8fD0gIlVua25vd24iOworCisgICAgICAgIHByaW50ICJNID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7CisgICAgICAgIHByaW50ICJNIEZpbGU6ICRmaWxlbmFtZVx0U3RhdHVzOiAkc3RhdHVzXG4iOworICAgICAgICBpZiAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtyZXZpc2lvbn0pICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIk0gV29ya2luZyByZXZpc2lvbjpcdCIgLiAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e3JldmlzaW9ufSAuICJcbiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiTSBXb3JraW5nIHJldmlzaW9uOlx0Tm8gZW50cnkgZm9yICRmaWxlbmFtZVxuIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGRlZmluZWQoJG1ldGEtPntyZXZpc2lvbn0pICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnQgIk0gUmVwb3NpdG9yeSByZXZpc2lvbjpcdDEuIiAuICRtZXRhLT57cmV2aXNpb259IC4gIlx0JHN0YXRlLT57cmVwb3NpdG9yeX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgICAgICBwcmludCAiTSBTdGlja3kgVGFnOlx0XHQobm9uZSlcbiI7CisgICAgICAgICAgICBwcmludCAiTSBTdGlja3kgRGF0ZTpcdFx0KG5vbmUpXG4iOworICAgICAgICAgICAgcHJpbnQgIk0gU3RpY2t5IE9wdGlvbnM6XHRcdChub25lKVxuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICJNIFJlcG9zaXRvcnkgcmV2aXNpb246XHRObyByZXZpc2lvbiBjb250cm9sIGZpbGVcbiI7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIk1cbiI7CisgICAgfQorCisgICAgcHJpbnQgIm9rXG4iOworfQorCitzdWIgcmVxX2RpZmYKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJkaWZmIik7CisKKyAgICAkbG9nLT5kZWJ1ZygicmVxX2RpZmYgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisgICAgIyRsb2ctPmRlYnVnKCJzdGF0dXMgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgbXkgKCRyZXZpc2lvbjEsICRyZXZpc2lvbjIpOworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e29wdH17cn0gKSBhbmQgcmVmICRzdGF0ZS0+e29wdH17cn0gZXEgIkFSUkFZIiApCisgICAgeworICAgICAgICAkcmV2aXNpb24xID0gJHN0YXRlLT57b3B0fXtyfVswXTsKKyAgICAgICAgJHJldmlzaW9uMiA9ICRzdGF0ZS0+e29wdH17cn1bMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHJldmlzaW9uMSA9ICRzdGF0ZS0+e29wdH17cn07CisgICAgfQorCisgICAgJHJldmlzaW9uMSA9fiBzL14xXC4vLyBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24xICkgKTsKKyAgICAkcmV2aXNpb24yID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjIgKSApOworCisgICAgJGxvZy0+ZGVidWcoIkRpZmZpbmcgcmV2aXNpb25zICIgLiAoIGRlZmluZWQoJHJldmlzaW9uMSkgPyAkcmV2aXNpb24xIDogIltOVUxMXSIgKSAuICIgYW5kICIgLiAoIGRlZmluZWQoJHJldmlzaW9uMikgPyAkcmV2aXNpb24yIDogIltOVUxMXSIgKSApOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIHN0YXR1cyBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgKCAkZmgsICRmaWxlMSwgJGZpbGUyLCAkbWV0YTEsICRtZXRhMiwgJGZpbGVkaWZmICk7CisKKyAgICAgICAgbXkgJHdyZXYgPSByZXZwYXJzZSgkZmlsZW5hbWUpOworCisgICAgICAgICMgV2UgbmVlZCBfc29tZXRoaW5nXyB0byBkaWZmIGFnYWluc3QKKyAgICAgICAgbmV4dCB1bmxlc3MgKCBkZWZpbmVkICggJHdyZXYgKSApOworCisgICAgICAgICMgaWYgd2UgaGF2ZSBhIC1yIHN3aXRjaCwgdXNlIGl0CisgICAgICAgIGlmICggZGVmaW5lZCAoICRyZXZpc2lvbjEgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGExID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkcmV2aXNpb24xKTsKKyAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTEgKSBhbmQgJG1ldGExLT57ZmlsZWhhc2h9IG5lICJkZWxldGVkIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgRmlsZSAkZmlsZW5hbWUgYXQgcmV2aXNpb24gMS4kcmV2aXNpb24xIGRvZXNuJ3QgZXhpc3RcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTEtPntmaWxlaGFzaH0sICRmaWxlMSk7CisgICAgICAgIH0KKyAgICAgICAgIyBvdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIHdvcmtpbmcgY29weSByZXZpc2lvbgorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICggdW5kZWYsICRmaWxlMSApID0gdGVtcGZpbGUoIERJUiA9PiAkVEVNUF9ESVIsIE9QRU4gPT4gMCApOworICAgICAgICAgICAgJG1ldGExID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lLCAkd3Jldik7CisgICAgICAgICAgICB0cmFuc21pdGZpbGUoJG1ldGExLT57ZmlsZWhhc2h9LCAkZmlsZTEpOworICAgICAgICB9CisKKyAgICAgICAgIyBpZiB3ZSBoYXZlIGEgc2Vjb25kIC1yIHN3aXRjaCwgdXNlIGl0IHRvbworICAgICAgICBpZiAoIGRlZmluZWQgKCAkcmV2aXNpb24yICkgKQorICAgICAgICB7CisgICAgICAgICAgICAoIHVuZGVmLCAkZmlsZTIgKSA9IHRlbXBmaWxlKCBESVIgPT4gJFRFTVBfRElSLCBPUEVOID0+IDAgKTsKKyAgICAgICAgICAgICRtZXRhMiA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSwgJHJldmlzaW9uMik7CisKKyAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTIgKSBhbmQgJG1ldGEyLT57ZmlsZWhhc2h9IG5lICJkZWxldGVkIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnQgIkUgRmlsZSAkZmlsZW5hbWUgYXQgcmV2aXNpb24gMS4kcmV2aXNpb24yIGRvZXNuJ3QgZXhpc3RcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJhbnNtaXRmaWxlKCRtZXRhMi0+e2ZpbGVoYXNofSwgJGZpbGUyKTsKKyAgICAgICAgfQorICAgICAgICAjIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgd29ya2luZyBjb3B5CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgJGZpbGUyID0gJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9maWxlbmFtZX07CisgICAgICAgIH0KKworICAgICAgICAjIGlmIHdlIGhhdmUgYmVlbiBnaXZlbiAtciwgYW5kIHdlIGRvbid0IGhhdmUgYSAkZmlsZTIgeWV0LCBsZXRzIGdldCBvbmUKKyAgICAgICAgaWYgKCBkZWZpbmVkICggJHJldmlzaW9uMSApIGFuZCBub3QgZGVmaW5lZCAoICRmaWxlMiApICkKKyAgICAgICAgeworICAgICAgICAgICAgKCB1bmRlZiwgJGZpbGUyICkgPSB0ZW1wZmlsZSggRElSID0+ICRURU1QX0RJUiwgT1BFTiA9PiAwICk7CisgICAgICAgICAgICAkbWV0YTIgPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICR3cmV2KTsKKyAgICAgICAgICAgIHRyYW5zbWl0ZmlsZSgkbWV0YTItPntmaWxlaGFzaH0sICRmaWxlMik7CisgICAgICAgIH0KKworICAgICAgICAjIFdlIG5lZWQgdG8gaGF2ZSByZXRyaWV2ZWQgc29tZXRoaW5nIHVzZWZ1bAorICAgICAgICBuZXh0IHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YTEgKSApOworCisgICAgICAgICMgRmlsZXMgdG8gZGF0ZSBpZiB0aGUgd29ya2luZyBjb3B5IGFuZCByZXBvIGNvcHkgaGF2ZSB0aGUgc2FtZSByZXZpc2lvbiwgYW5kIHRoZSB3b3JraW5nIGNvcHkgaXMgdW5tb2RpZmllZAorICAgICAgICBuZXh0IGlmICggbm90IGRlZmluZWQgKCAkbWV0YTIgKSBhbmQgJHdyZXYgPT0gJG1ldGExLT57cmV2aXNpb259CisgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAoICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXt1bmNoYW5nZWR9IGFuZCAoIG5vdCBkZWZpbmVkICggJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXtjb25mbGljdH0gKSBvciAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e2NvbmZsaWN0fSAhfiAvXlwrPS8gKSApCisgICAgICAgICAgICAgICAgICAgICBvciAoIGRlZmluZWQoJHN0YXRlLT57ZW50cmllc317JGZpbGVuYW1lfXttb2RpZmllZF9oYXNofSkgYW5kICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17bW9kaWZpZWRfaGFzaH0gZXEgJG1ldGExLT57ZmlsZWhhc2h9ICkgKQorICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAjIEFwcGFyZW50bHkgd2Ugb25seSBzaG93IGRpZmZzIGZvciBsb2NhbGx5IG1vZGlmaWVkIGZpbGVzCisgICAgICAgIG5leHQgdW5sZXNzICggZGVmaW5lZCgkbWV0YTIpIG9yIGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZW5hbWV9e21vZGlmaWVkX2ZpbGVuYW1lfSApICk7CisKKyAgICAgICAgcHJpbnQgIk0gSW5kZXg6ICRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIk0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICAgICAgcHJpbnQgIk0gUkNTIGZpbGU6ICRzdGF0ZS0+e0NWU1JPT1R9LyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgIHByaW50ICJNIHJldHJpZXZpbmcgcmV2aXNpb24gMS4kbWV0YTEtPntyZXZpc2lvbn1cbiIgaWYgKCBkZWZpbmVkICggJG1ldGExICkgKTsKKyAgICAgICAgcHJpbnQgIk0gcmV0cmlldmluZyByZXZpc2lvbiAxLiRtZXRhMi0+e3JldmlzaW9ufVxuIiBpZiAoIGRlZmluZWQgKCAkbWV0YTIgKSApOworICAgICAgICBwcmludCAiTSBkaWZmICI7CisgICAgICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMgJXskc3RhdGUtPntvcHR9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggcmVmICRzdGF0ZS0+e29wdH17JG9wdH0gZXEgIkFSUkFZIiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKCBAeyRzdGF0ZS0+e29wdH17JG9wdH19ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ICItJG9wdCAkdmFsdWUgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ICItJG9wdCAiOworICAgICAgICAgICAgICAgIHByaW50ICIkc3RhdGUtPntvcHR9eyRvcHR9ICIgaWYgKCBkZWZpbmVkICggJHN0YXRlLT57b3B0fXskb3B0fSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIiRmaWxlbmFtZVxuIjsKKworICAgICAgICAkbG9nLT5pbmZvKCJEaWZmaW5nICRmaWxlbmFtZSAtciAkbWV0YTEtPntyZXZpc2lvbn0gLXIgIiAuICggJG1ldGEyLT57cmV2aXNpb259IG9yICJ3b3JraW5nY29weSIgKSk7CisKKyAgICAgICAgKCAkZmgsICRmaWxlZGlmZiApID0gdGVtcGZpbGUgKCBESVIgPT4gJFRFTVBfRElSICk7CisKKyAgICAgICAgaWYgKCBleGlzdHMgJHN0YXRlLT57b3B0fXt1fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5c3RlbSgiZGlmZiAtdSAtTCAnJGZpbGVuYW1lIHJldmlzaW9uIDEuJG1ldGExLT57cmV2aXNpb259JyAtTCAnJGZpbGVuYW1lICIgLiAoIGRlZmluZWQoJG1ldGEyLT57cmV2aXNpb259KSA/ICJyZXZpc2lvbiAxLiRtZXRhMi0+e3JldmlzaW9ufSIgOiAid29ya2luZyBjb3B5IiApIC4gIicgJGZpbGUxICRmaWxlMiA+ICRmaWxlZGlmZiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3lzdGVtKCJkaWZmICRmaWxlMSAkZmlsZTIgPiAkZmlsZWRpZmYiKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICggPCRmaD4gKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiTSAkXyI7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UgJGZoOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9sb2cKK3sKKyAgICBteSAoICRjbWQsICRkYXRhICkgPSBAXzsKKworICAgIGFyZ3NwbGl0KCJsb2ciKTsKKworICAgICRsb2ctPmRlYnVnKCJyZXFfbG9nIDogIiAuICggZGVmaW5lZCgkZGF0YSkgPyAkZGF0YSA6ICJbTlVMTF0iICkpOworICAgICMkbG9nLT5kZWJ1ZygibG9nIHN0YXRlIDogIiAuIER1bXBlcigkc3RhdGUpKTsKKworICAgIG15ICggJG1pbnJldiwgJG1heHJldiApOworICAgIGlmICggZGVmaW5lZCAoICRzdGF0ZS0+e29wdH17cn0gKSBhbmQgJHN0YXRlLT57b3B0fXtyfSA9fiAvKFtcZC5dKyk/KDo6PykoW1xkLl0rKT8vICkKKyAgICB7CisgICAgICAgIG15ICRjb250cm9sID0gJDI7CisgICAgICAgICRtaW5yZXYgPSAkMTsKKyAgICAgICAgJG1heHJldiA9ICQzOworICAgICAgICAkbWlucmV2ID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRtaW5yZXYgKSApOworICAgICAgICAkbWF4cmV2ID1+IHMvXjFcLi8vIGlmICggZGVmaW5lZCAoICRtYXhyZXYgKSApOworICAgICAgICAkbWlucmV2KysgaWYgKCBkZWZpbmVkKCRtaW5yZXYpIGFuZCAkY29udHJvbCBlcSAiOjoiICk7CisgICAgfQorCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIHN0YXR1cyBvbiAuLi4KKyAgICBhcmdzZnJvbWRpcigkdXBkYXRlcik7CisKKyAgICAjIGZvcmVhY2ggZmlsZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAuLi4KKyAgICBmb3JlYWNoIG15ICRmaWxlbmFtZSAoIEB7JHN0YXRlLT57YXJnc319ICkKKyAgICB7CisgICAgICAgICRmaWxlbmFtZSA9IGZpbGVjbGVhbnVwKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbXkgJGhlYWRtZXRhID0gJHVwZGF0ZXItPmdldG1ldGEoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkcmV2aXNpb25zID0gJHVwZGF0ZXItPmdldGxvZygkZmlsZW5hbWUpOworICAgICAgICBteSAkdG90YWxyZXZpc2lvbnMgPSBzY2FsYXIoQCRyZXZpc2lvbnMpOworCisgICAgICAgIGlmICggZGVmaW5lZCAoICRtaW5yZXYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJSZW1vdmluZyByZXZpc2lvbnMgbGVzcyB0aGFuICRtaW5yZXYiKTsKKyAgICAgICAgICAgIHdoaWxlICggc2NhbGFyKEAkcmV2aXNpb25zKSA+IDAgYW5kICRyZXZpc2lvbnMtPlstMV17cmV2aXNpb259IDwgJG1pbnJldiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9wIEAkcmV2aXNpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICggZGVmaW5lZCAoICRtYXhyZXYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICRsb2ctPmRlYnVnKCJSZW1vdmluZyByZXZpc2lvbnMgZ3JlYXRlciB0aGFuICRtYXhyZXYiKTsKKyAgICAgICAgICAgIHdoaWxlICggc2NhbGFyKEAkcmV2aXNpb25zKSA+IDAgYW5kICRyZXZpc2lvbnMtPlswXXtyZXZpc2lvbn0gPiAkbWF4cmV2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaGlmdCBAJHJldmlzaW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5leHQgdW5sZXNzICggc2NhbGFyKEAkcmV2aXNpb25zKSApOworCisgICAgICAgIHByaW50ICJNIFxuIjsKKyAgICAgICAgcHJpbnQgIk0gUkNTIGZpbGU6ICRzdGF0ZS0+e0NWU1JPT1R9LyRzdGF0ZS0+e21vZHVsZX0vJGZpbGVuYW1lLHZcbiI7CisgICAgICAgIHByaW50ICJNIFdvcmtpbmcgZmlsZTogJGZpbGVuYW1lXG4iOworICAgICAgICBwcmludCAiTSBoZWFkOiAxLiRoZWFkbWV0YS0+e3JldmlzaW9ufVxuIjsKKyAgICAgICAgcHJpbnQgIk0gYnJhbmNoOlxuIjsKKyAgICAgICAgcHJpbnQgIk0gbG9ja3M6IHN0cmljdFxuIjsKKyAgICAgICAgcHJpbnQgIk0gYWNjZXNzIGxpc3Q6XG4iOworICAgICAgICBwcmludCAiTSBzeW1ib2xpYyBuYW1lczpcbiI7CisgICAgICAgIHByaW50ICJNIGtleXdvcmQgc3Vic3RpdHV0aW9uOiBrdlxuIjsKKyAgICAgICAgcHJpbnQgIk0gdG90YWwgcmV2aXNpb25zOiAkdG90YWxyZXZpc2lvbnM7XHRzZWxlY3RlZCByZXZpc2lvbnM6ICIgLiBzY2FsYXIoQCRyZXZpc2lvbnMpIC4gIlxuIjsKKyAgICAgICAgcHJpbnQgIk0gZGVzY3JpcHRpb246XG4iOworCisgICAgICAgIGZvcmVhY2ggbXkgJHJldmlzaW9uICggQCRyZXZpc2lvbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCAiTSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOworICAgICAgICAgICAgcHJpbnQgIk0gcmV2aXNpb24gMS4kcmV2aXNpb24tPntyZXZpc2lvbn1cbiI7CisgICAgICAgICAgICAjIHJlZm9ybWF0IHRoZSBkYXRlIGZvciBsb2cgb3V0cHV0CisgICAgICAgICAgICAkcmV2aXNpb24tPnttb2RpZmllZH0gPSBzcHJpbnRmKCclMDRkLyUwMmQvJTAyZCAlcycsICQzLCAkREFURV9MSVNULT57JDJ9LCAkMSwgJDQgKSBpZiAoICRyZXZpc2lvbi0+e21vZGlmaWVkfSA9fiAvKFxkKylccysoXHcrKVxzKyhcZCspXHMrKFxTKykvIGFuZCBkZWZpbmVkKCREQVRFX0xJU1QtPnskMn0pICk7CisgICAgICAgICAgICAkcmV2aXNpb24tPnthdXRob3J9ID1+IHMvXHMrLiovLzsKKyAgICAgICAgICAgICRyZXZpc2lvbi0+e2F1dGhvcn0gPX4gcy9eKC57OH0pLiovJDEvOworICAgICAgICAgICAgcHJpbnQgIk0gZGF0ZTogJHJldmlzaW9uLT57bW9kaWZpZWR9OyAgYXV0aG9yOiAkcmV2aXNpb24tPnthdXRob3J9OyAgc3RhdGU6ICIgLiAoICRyZXZpc2lvbi0+e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgPyAiZGVhZCIgOiAiRXhwIiApIC4gIjsgIGxpbmVzOiArMiAtM1xuIjsKKyAgICAgICAgICAgIG15ICRjb21taXRtZXNzYWdlID0gJHVwZGF0ZXItPmNvbW1pdG1lc3NhZ2UoJHJldmlzaW9uLT57Y29tbWl0aGFzaH0pOworICAgICAgICAgICAgJGNvbW1pdG1lc3NhZ2UgPX4gcy9eL00gL21nOworICAgICAgICAgICAgcHJpbnQgJGNvbW1pdG1lc3NhZ2UgLiAiXG4iOworICAgICAgICB9CisgICAgICAgIHByaW50ICJNID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOworICAgIH0KKworICAgIHByaW50ICJva1xuIjsKK30KKworc3ViIHJlcV9hbm5vdGF0ZQoreworICAgIG15ICggJGNtZCwgJGRhdGEgKSA9IEBfOworCisgICAgYXJnc3BsaXQoImFubm90YXRlIik7CisKKyAgICAkbG9nLT5pbmZvKCJyZXFfYW5ub3RhdGUgOiAiIC4gKCBkZWZpbmVkKCRkYXRhKSA/ICRkYXRhIDogIltOVUxMXSIgKSk7CisgICAgIyRsb2ctPmRlYnVnKCJzdGF0dXMgc3RhdGUgOiAiIC4gRHVtcGVyKCRzdGF0ZSkpOworCisgICAgIyBHcmFiIGEgaGFuZGxlIHRvIHRoZSBTUUxpdGUgZGIgYW5kIGRvIGFueSBuZWNlc3NhcnkgdXBkYXRlcworICAgIG15ICR1cGRhdGVyID0gR0lUQ1ZTOjp1cGRhdGVyLT5uZXcoJHN0YXRlLT57Q1ZTUk9PVH0sICRzdGF0ZS0+e21vZHVsZX0sICRsb2cpOworICAgICR1cGRhdGVyLT51cGRhdGUoKTsKKworICAgICMgaWYgbm8gZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gd29yayBvdXQgd2hhdCBmaWxlcyB3ZSBzaG91bGQgYmUgcHJvdmlkaW5nIGFubm90YXRlIG9uIC4uLgorICAgIGFyZ3Nmcm9tZGlyKCR1cGRhdGVyKTsKKworICAgICMgd2UnbGwgbmVlZCBhIHRlbXBvcmFyeSBjaGVja291dCBkaXIKKyAgICBteSAkdG1wZGlyID0gdGVtcGRpciAoIERJUiA9PiAkVEVNUF9ESVIgKTsKKyAgICBteSAoIHVuZGVmLCAkZmlsZV9pbmRleCApID0gdGVtcGZpbGUgKCBESVIgPT4gJFRFTVBfRElSLCBPUEVOID0+IDAgKTsKKyAgICAkbG9nLT5pbmZvKCJUZW1wIGNoZWNrb3V0ZGlyIGNyZWF0aW9uIHN1Y2Nlc3NmdWwsIGJhc2luZyBhbm5vdGF0ZSBzZXNzaW9uIHdvcmsgb24gJyR0bXBkaXInLCBpbmRleCBmaWxlIGlzICckZmlsZV9pbmRleCciKTsKKworICAgICRFTlZ7R0lUX0RJUn0gPSAkc3RhdGUtPntDVlNST09UfSAuICIvIjsKKyAgICAkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRmaWxlX2luZGV4OworCisgICAgY2hkaXIgJHRtcGRpcjsKKworICAgICMgZm9yZWFjaCBmaWxlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIC4uLgorICAgIGZvcmVhY2ggbXkgJGZpbGVuYW1lICggQHskc3RhdGUtPnthcmdzfX0gKQorICAgIHsKKyAgICAgICAgJGZpbGVuYW1lID0gZmlsZWNsZWFudXAoJGZpbGVuYW1lKTsKKworICAgICAgICBteSAkbWV0YSA9ICR1cGRhdGVyLT5nZXRtZXRhKCRmaWxlbmFtZSk7CisKKyAgICAgICAgbmV4dCB1bmxlc3MgKCAkbWV0YS0+e3JldmlzaW9ufSApOworCisJIyBnZXQgYWxsIHRoZSBjb21taXRzIHRoYXQgdGhpcyBmaWxlIHdhcyBpbgorCSMgaW4gZGVuc2UgZm9ybWF0IC0tIGFrYSBza2lwIGRlYWQgcmV2aXNpb25zCisgICAgICAgIG15ICRyZXZpc2lvbnMgICA9ICR1cGRhdGVyLT5nZXRoaXN0b3J5ZGVuc2UoJGZpbGVuYW1lKTsKKwlteSAkbGFzdHNlZW5pbiAgPSAkcmV2aXNpb25zLT5bMF1bMl07CisKKwkjIHBvcHVsYXRlIHRoZSB0ZW1wb3JhcnkgaW5kZXggYmFzZWQgb24gdGhlIGxhdGVzdCBjb21taXQgd2VyZSB3ZSBzYXcKKwkjIHRoZSBmaWxlIC0tIGJ1dCBkbyBpdCBjaGVhcGx5IHdpdGhvdXQgY2hlY2tpbmcgb3V0IGFueSBmaWxlcworCSMgVE9ETzogaWYgd2UgZ290IGEgcmV2aXNpb24gZnJvbSB0aGUgY2xpZW50LCB1c2UgdGhhdCBpbnN0ZWFkCisJIyB0byBsb29rIHVwIHRoZSBjb21taXRoYXNoIGluIHNxbGl0ZSAoc3RpbGwgZ29vZCB0byBkZWZhdWx0IHRvCisJIyB0aGUgY3VycmVudCBoZWFkIGFzIHdlIGRvIG5vdykKKwlzeXN0ZW0oImdpdC1yZWFkLXRyZWUiLCAkbGFzdHNlZW5pbik7CisJdW5sZXNzICgkPyA9PSAwKQorCXsKKwkgICAgZGllICJFcnJvciBydW5uaW5nIGdpdC1yZWFkLXRyZWUgJGxhc3RzZWVuaW4gJGZpbGVfaW5kZXggJCEiOworCX0KKwkkbG9nLT5pbmZvKCJDcmVhdGVkIGluZGV4ICckZmlsZV9pbmRleCcgd2l0aCBjb21taXQgJGxhc3RzZWVuaW4gLSBleGl0IHN0YXR1cyAkPyIpOworCisgICAgICAgICMgZG8gYSBjaGVja291dCBvZiB0aGUgZmlsZQorICAgICAgICBzeXN0ZW0oJ2dpdC1jaGVja291dC1pbmRleCcsICctZicsICctdScsICRmaWxlbmFtZSk7CisgICAgICAgIHVubGVzcyAoJD8gPT0gMCkgeworICAgICAgICAgICAgZGllICJFcnJvciBydW5uaW5nIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAkZmlsZW5hbWUgOiAkISI7CisgICAgICAgIH0KKworICAgICAgICAkbG9nLT5pbmZvKCJBbm5vdGF0ZSAkZmlsZW5hbWUiKTsKKworICAgICAgICAjIFByZXBhcmUgYSBmaWxlIHdpdGggdGhlIGNvbW1pdHMgZnJvbSB0aGUgbGluZWFyaXplZAorICAgICAgICAjIGhpc3RvcnkgdGhhdCBhbm5vdGF0ZSBzaG91bGQga25vdyBhYm91dC4gVGhpcyBwcmV2ZW50cworICAgICAgICAjIGdpdC1qc2Fubm90YXRlIHRlbGxpbmcgdXMgYWJvdXQgY29tbWl0cyB3ZSBhcmUgaGlkaW5nCisgICAgICAgICMgZnJvbSB0aGUgY2xpZW50LgorCisgICAgICAgIG9wZW4oQU5OT1RBVEVISU5UUywgIj4kdG1wZGlyLy5hbm5vdGF0ZV9oaW50cyIpIG9yIGRpZSAiRXJyb3Igb3BlbmluZyA+ICR0bXBkaXIvLmFubm90YXRlX2hpbnRzICQhIjsKKyAgICAgICAgZm9yIChteSAkaT0wOyAkaSA8IEAkcmV2aXNpb25zOyAkaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludCBBTk5PVEFURUhJTlRTICRyZXZpc2lvbnMtPlskaV1bMl07CisgICAgICAgICAgICBpZiAoJGkrMSA8IEAkcmV2aXNpb25zKSB7ICMgaGF2ZSB3ZSBnb3QgYSBwYXJlbnQ/CisgICAgICAgICAgICAgICAgcHJpbnQgQU5OT1RBVEVISU5UUyAnICcgLiAkcmV2aXNpb25zLT5bJGkrMV1bMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludCBBTk5PVEFURUhJTlRTICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBwcmludCBBTk5PVEFURUhJTlRTICJcbiI7CisgICAgICAgIGNsb3NlIEFOTk9UQVRFSElOVFM7CisKKyAgICAgICAgbXkgJGFubm90YXRlY21kID0gJ2dpdC1hbm5vdGF0ZSc7CisgICAgICAgIG9wZW4oQU5OT1RBVEUsICItfCIsICRhbm5vdGF0ZWNtZCwgJy1sJywgJy1TJywgIiR0bXBkaXIvLmFubm90YXRlX2hpbnRzIiwgJGZpbGVuYW1lKQorCSAgICBvciBkaWUgIkVycm9yIGludm9raW5nICRhbm5vdGF0ZWNtZCAtbCAtUyAkdG1wZGlyLy5hbm5vdGF0ZV9oaW50cyAkZmlsZW5hbWUgOiAkISI7CisgICAgICAgIG15ICRtZXRhZGF0YSA9IHt9OworICAgICAgICBwcmludCAiRSBBbm5vdGF0aW9ucyBmb3IgJGZpbGVuYW1lXG4iOworICAgICAgICBwcmludCAiRSAqKioqKioqKioqKioqKipcbiI7CisgICAgICAgIHdoaWxlICggPEFOTk9UQVRFPiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtL14oW2EtekEtWjAtOV17NDB9KVx0XChbXlwpXSpcKSguKikkL2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXkgJGNvbW1pdGhhc2ggPSAkMTsKKyAgICAgICAgICAgICAgICBteSAkZGF0YSA9ICQyOworICAgICAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQgKCAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH0gKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH0gPSAkdXBkYXRlci0+Z2V0bWV0YSgkZmlsZW5hbWUsICRjb21taXRoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgJG1ldGFkYXRhLT57JGNvbW1pdGhhc2h9e2F1dGhvcn0gPX4gcy9ccysuKi8vOworICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17YXV0aG9yfSA9fiBzL14oLns4fSkuKi8kMS87CisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXttb2RpZmllZH0gPSBzcHJpbnRmKCIlMDJkLSVzLSUwMmQiLCAkMSwgJDIsICQzKSBpZiAoICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXttb2RpZmllZH0gPX4gL14oXGQrKVxzKFx3Kylcc1xkXGQoXGRcZCkvICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiTSAxLiUtNWQgICAgICAoJS04cyAlMTBzKTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXtyZXZpc2lvbn0sCisgICAgICAgICAgICAgICAgICAgICRtZXRhZGF0YS0+eyRjb21taXRoYXNofXthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAkbWV0YWRhdGEtPnskY29tbWl0aGFzaH17bW9kaWZpZWR9LAorICAgICAgICAgICAgICAgICAgICAkZGF0YQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsb2ctPndhcm4oIkVycm9yIGluIGFubm90YXRlIG91dHB1dCEgTElORTogJF8iKTsKKyAgICAgICAgICAgICAgICBwcmludCAiRSBBbm5vdGF0ZSBlcnJvciBcbiI7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZSBBTk5PVEFURTsKKyAgICB9CisKKyAgICAjIGRvbmU7IGdldCBvdXQgb2YgdGhlIHRlbXBkaXIKKyAgICBjaGRpciAiLyI7CisKKyAgICBwcmludCAib2tcbiI7CisKK30KKworIyBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgc3RhdGUtPnthcmd1bWVudHN9IGFycmF5IGFuZCBwcm9kdWNlcyB0d28gbmV3IGFycmF5cy4KKyMgVGhlIGZpcnN0IGlzICRzdGF0ZS0+e2FyZ3N9IHdoaWNoIGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSAnLS0nIGFyZ3VtZW50LCBhbmQKKyMgdGhlIHNlY29uZCBpcyAkc3RhdGUtPntmaWxlc30gd2hpY2ggaXMgZXZlcnl0aGluZyBhZnRlciBpdC4KK3N1YiBhcmdzcGxpdAoreworICAgIHJldHVybiB1bmxlc3MoIGRlZmluZWQoJHN0YXRlLT57YXJndW1lbnRzfSkgYW5kIHJlZiAkc3RhdGUtPnthcmd1bWVudHN9IGVxICJBUlJBWSIgKTsKKworICAgIG15ICR0eXBlID0gc2hpZnQ7CisKKyAgICAkc3RhdGUtPnthcmdzfSA9IFtdOworICAgICRzdGF0ZS0+e2ZpbGVzfSA9IFtdOworICAgICRzdGF0ZS0+e29wdH0gPSB7fTsKKworICAgIGlmICggZGVmaW5lZCgkdHlwZSkgKQorICAgIHsKKyAgICAgICAgbXkgJG9wdCA9IHt9OworICAgICAgICAkb3B0ID0geyBBID0+IDAsIE4gPT4gMCwgUCA9PiAwLCBSID0+IDAsIGMgPT4gMCwgZiA9PiAwLCBsID0+IDAsIG4gPT4gMCwgcCA9PiAwLCBzID0+IDAsIHIgPT4gMSwgRCA9PiAxLCBkID0+IDEsIGsgPT4gMSwgaiA9PiAxLCB9IGlmICggJHR5cGUgZXEgImNvIiApOworICAgICAgICAkb3B0ID0geyB2ID0+IDAsIGwgPT4gMCwgUiA9PiAwIH0gaWYgKCAkdHlwZSBlcSAic3RhdHVzIiApOworICAgICAgICAkb3B0ID0geyBBID0+IDAsIFAgPT4gMCwgQyA9PiAwLCBkID0+IDAsIGYgPT4gMCwgbCA9PiAwLCBSID0+IDAsIHAgPT4gMCwgayA9PiAxLCByID0+IDEsIEQgPT4gMSwgaiA9PiAxLCBJID0+IDEsIFcgPT4gMSB9IGlmICggJHR5cGUgZXEgInVwZGF0ZSIgKTsKKyAgICAgICAgJG9wdCA9IHsgbCA9PiAwLCBSID0+IDAsIGsgPT4gMSwgRCA9PiAxLCBEID0+IDEsIHIgPT4gMiB9IGlmICggJHR5cGUgZXEgImRpZmYiICk7CisgICAgICAgICRvcHQgPSB7IGMgPT4gMCwgUiA9PiAwLCBsID0+IDAsIGYgPT4gMCwgRiA9PiAxLCBtID0+IDEsIHIgPT4gMSB9IGlmICggJHR5cGUgZXEgImNpIiApOworICAgICAgICAkb3B0ID0geyBrID0+IDEsIG0gPT4gMSB9IGlmICggJHR5cGUgZXEgImFkZCIgKTsKKyAgICAgICAgJG9wdCA9IHsgZiA9PiAwLCBsID0+IDAsIFIgPT4gMCB9IGlmICggJHR5cGUgZXEgInJlbW92ZSIgKTsKKyAgICAgICAgJG9wdCA9IHsgbCA9PiAwLCBiID0+IDAsIGggPT4gMCwgUiA9PiAwLCB0ID0+IDAsIE4gPT4gMCwgUyA9PiAwLCByID0+IDEsIGQgPT4gMSwgcyA9PiAxLCB3ID0+IDEgfSBpZiAoICR0eXBlIGVxICJsb2ciICk7CisKKworICAgICAgICB3aGlsZSAoIHNjYWxhciAoIEB7JHN0YXRlLT57YXJndW1lbnRzfX0gKSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkYXJnID0gc2hpZnQgQHskc3RhdGUtPnthcmd1bWVudHN9fTsKKworICAgICAgICAgICAgbmV4dCBpZiAoICRhcmcgZXEgIi0tIiApOworICAgICAgICAgICAgbmV4dCB1bmxlc3MgKCAkYXJnID1+IC9cUy8gKTsKKworICAgICAgICAgICAgIyBpZiB0aGUgYXJndW1lbnQgbG9va3MgbGlrZSBhIHN3aXRjaAorICAgICAgICAgICAgaWYgKCAkYXJnID1+IC9eLShcdykoLiopLyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIyBpZiBpdCdzIGEgc3dpdGNoIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQKKyAgICAgICAgICAgICAgICBpZiAoICRvcHQtPnskMX0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGlzIHN3aXRjaCBoYXMgYWxyZWFkeSBiZWVuIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgIGlmICggJG9wdC0+eyQxfSA+IDEgYW5kIGV4aXN0cyAoICRzdGF0ZS0+e29wdH17JDF9ICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGUtPntvcHR9eyQxfSA9IFsgJHN0YXRlLT57b3B0fXskMX0gXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoKCQyKSA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPntvcHR9eyQxfX0sJDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPntvcHR9eyQxfX0sIHNoaWZ0IEB7JHN0YXRlLT57YXJndW1lbnRzfX07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZXJlJ3MgZXh0cmEgZGF0YSBpbiB0aGUgYXJnLCB1c2UgdGhhdCBhcyB0aGUgYXJndW1lbnQgZm9yIHRoZSBzd2l0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbGVuZ3RoKCQyKSA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS0+e29wdH17JDF9ID0gJDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZS0+e29wdH17JDF9ID0gc2hpZnQgQHskc3RhdGUtPnthcmd1bWVudHN9fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRzdGF0ZS0+e29wdH17JDF9ID0gdW5kZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPnthcmdzfX0sICRhcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXkgJG1vZGUgPSAwOworCisgICAgICAgIGZvcmVhY2ggbXkgJHZhbHVlICggQHskc3RhdGUtPnthcmd1bWVudHN9fSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggJHZhbHVlIGVxICItLSIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICRtb2RlKys7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPnthcmdzfX0sICR2YWx1ZSBpZiAoICRtb2RlID09IDAgKTsKKyAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPntmaWxlc319LCAkdmFsdWUgaWYgKCAkbW9kZSA9PSAxICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgVGhpcyBtZXRob2QgdXNlcyAkc3RhdGUtPntkaXJlY3Rvcnl9IHRvIHBvcHVsYXRlICRzdGF0ZS0+e2FyZ3N9IHdpdGggYSBsaXN0IG9mIGZpbGVuYW1lcworc3ViIGFyZ3Nmcm9tZGlyCit7CisgICAgbXkgJHVwZGF0ZXIgPSBzaGlmdDsKKworICAgICRzdGF0ZS0+e2FyZ3N9ID0gW10gaWYgKCBzY2FsYXIoQHskc3RhdGUtPnthcmdzfX0pID09IDEgYW5kICRzdGF0ZS0+e2FyZ3N9WzBdIGVxICIuIiApOworCisgICAgcmV0dXJuIGlmICggc2NhbGFyICggQHskc3RhdGUtPnthcmdzfX0gKSA+IDEgKTsKKworICAgIGlmICggc2NhbGFyKEB7JHN0YXRlLT57YXJnc319KSA9PSAxICkKKyAgICB7CisgICAgICAgIG15ICRhcmcgPSAkc3RhdGUtPnthcmdzfVswXTsKKyAgICAgICAgJGFyZyAuPSAkc3RhdGUtPntwcmVwZW5kZGlyfSBpZiAoIGRlZmluZWQgKCAkc3RhdGUtPntwcmVwZW5kZGlyfSApICk7CisKKyAgICAgICAgJGxvZy0+aW5mbygiT25seSBvbmUgYXJnIHNwZWNpZmllZCwgY2hlY2tpbmcgZm9yIGRpcmVjdG9yeSBleHBhbnNpb24gb24gJyRhcmcnIik7CisKKyAgICAgICAgZm9yZWFjaCBteSAkZmlsZSAoIEB7JHVwZGF0ZXItPmdldGhlYWR9ICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCBpZiAoICRmaWxlLT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiBhbmQgbm90IGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZS0+e25hbWV9fSApICk7CisgICAgICAgICAgICBuZXh0IHVubGVzcyAoICRmaWxlLT57bmFtZX0gPX4gL14kYXJnXC8vIG9yICRmaWxlLT57bmFtZX0gZXEgJGFyZyAgKTsKKyAgICAgICAgICAgIHB1c2ggQHskc3RhdGUtPnthcmdzfX0sICRmaWxlLT57bmFtZX07CisgICAgICAgIH0KKworICAgICAgICBzaGlmdCBAeyRzdGF0ZS0+e2FyZ3N9fSBpZiAoIHNjYWxhcihAeyRzdGF0ZS0+e2FyZ3N9fSkgPiAxICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJGxvZy0+aW5mbygiT25seSBvbmUgYXJnIHNwZWNpZmllZCwgcG9wdWxhdGluZyBmaWxlIGxpc3QgYXV0b21hdGljYWxseSIpOworCisgICAgICAgICRzdGF0ZS0+e2FyZ3N9ID0gW107CisKKyAgICAgICAgZm9yZWFjaCBteSAkZmlsZSAoIEB7JHVwZGF0ZXItPmdldGhlYWR9ICkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCBpZiAoICRmaWxlLT57ZmlsZWhhc2h9IGVxICJkZWxldGVkIiBhbmQgbm90IGRlZmluZWQgKCAkc3RhdGUtPntlbnRyaWVzfXskZmlsZS0+e25hbWV9fSApICk7CisgICAgICAgICAgICBuZXh0IHVubGVzcyAoICRmaWxlLT57bmFtZX0gPX4gcy9eJHN0YXRlLT57cHJlcGVuZGRpcn0vLyApOworICAgICAgICAgICAgcHVzaCBAeyRzdGF0ZS0+e2FyZ3N9fSwgJGZpbGUtPntuYW1lfTsKKyAgICAgICAgfQorICAgIH0KK30KKworIyBUaGlzIG1ldGhvZCBjbGVhbnMgdXAgdGhlICRzdGF0ZSB2YXJpYWJsZSBhZnRlciBhIGNvbW1hbmQgdGhhdCB1c2VzIGFyZ3VtZW50cyBoYXMgcnVuCitzdWIgc3RhdGVjbGVhbnVwCit7CisgICAgJHN0YXRlLT57ZmlsZXN9ID0gW107CisgICAgJHN0YXRlLT57YXJnc30gPSBbXTsKKyAgICAkc3RhdGUtPnthcmd1bWVudHN9ID0gW107CisgICAgJHN0YXRlLT57ZW50cmllc30gPSB7fTsKK30KKworc3ViIHJldnBhcnNlCit7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ICkgKTsKKworICAgIHJldHVybiAkMSBpZiAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ID1+IC9eMVwuKFxkKykvICk7CisgICAgcmV0dXJuIC0kMSBpZiAoICRzdGF0ZS0+e2VudHJpZXN9eyRmaWxlbmFtZX17cmV2aXNpb259ID1+IC9eLTFcLihcZCspLyApOworCisgICAgcmV0dXJuIHVuZGVmOworfQorCisjIFRoaXMgbWV0aG9kIHRha2VzIGEgZmlsZSBoYXNoIGFuZCBkb2VzIGEgQ1ZTICJmaWxlIHRyYW5zZmVyIiB3aGljaCB0cmFuc21pdHMgdGhlCisjIHNpemUgb2YgdGhlIGZpbGUsIGFuZCB0aGVuIHRoZSBmaWxlIGNvbnRlbnRzLgorIyBJZiBhIHNlY29uZCBhcmd1bWVudCAkdGFyZ2V0ZmlsZSBpcyBnaXZlbiwgdGhlIGZpbGUgaXMgaW5zdGVhZCB3cml0dGVuIG91dCB0bworIyBhIGZpbGUgYnkgdGhlIG5hbWUgb2YgJHRhcmdldGZpbGUKK3N1YiB0cmFuc21pdGZpbGUKK3sKKyAgICBteSAkZmlsZWhhc2ggPSBzaGlmdDsKKyAgICBteSAkdGFyZ2V0ZmlsZSA9IHNoaWZ0OworCisgICAgaWYgKCBkZWZpbmVkICggJGZpbGVoYXNoICkgYW5kICRmaWxlaGFzaCBlcSAiZGVsZXRlZCIgKQorICAgIHsKKyAgICAgICAgJGxvZy0+d2FybigiZmlsZWhhc2ggaXMgJ2RlbGV0ZWQnIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkaWUgIk5lZWQgZmlsZWhhc2giIHVubGVzcyAoIGRlZmluZWQgKCAkZmlsZWhhc2ggKSBhbmQgJGZpbGVoYXNoID1+IC9eW2EtekEtWjAtOV17NDB9JC8gKTsKKworICAgIG15ICR0eXBlID0gYGdpdC1jYXQtZmlsZSAtdCAkZmlsZWhhc2hgOworICAgIGNob21wICR0eXBlOworCisgICAgZGllICggIkludmFsaWQgdHlwZSAnJHR5cGUnIChleHBlY3RlZCAnYmxvYicpIiApIHVubGVzcyAoIGRlZmluZWQgKCAkdHlwZSApIGFuZCAkdHlwZSBlcSAiYmxvYiIgKTsKKworICAgIG15ICRzaXplID0gYGdpdC1jYXQtZmlsZSAtcyAkZmlsZWhhc2hgOworICAgIGNob21wICRzaXplOworCisgICAgJGxvZy0+ZGVidWcoInRyYW5zbWl0ZmlsZSgkZmlsZWhhc2gpIHNpemU9JHNpemUsIHR5cGU9JHR5cGUiKTsKKworICAgIGlmICggb3BlbiBteSAkZmgsICctfCcsICJnaXQtY2F0LWZpbGUiLCAiYmxvYiIsICRmaWxlaGFzaCApCisgICAgeworICAgICAgICBpZiAoIGRlZmluZWQgKCAkdGFyZ2V0ZmlsZSApICkKKyAgICAgICAgeworICAgICAgICAgICAgb3BlbiBORVdGSUxFLCAiPiIsICR0YXJnZXRmaWxlIG9yIGRpZSgiQ291bGRuJ3Qgb3BlbiAnJHRhcmdldGZpbGUnIGZvciB3cml0aW5nIDogJCEiKTsKKyAgICAgICAgICAgIHByaW50IE5FV0ZJTEUgJF8gd2hpbGUgKCA8JGZoPiApOworICAgICAgICAgICAgY2xvc2UgTkVXRklMRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ICIkc2l6ZVxuIjsKKyAgICAgICAgICAgIHByaW50IHdoaWxlICggPCRmaD4gKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZSAkZmggb3IgZGllICgiQ291bGRuJ3QgY2xvc2UgZmlsZWhhbmRsZSBmb3IgdHJhbnNtaXRmaWxlKCkiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaWUoIkNvdWxkbid0IGV4ZWN1dGUgZ2l0LWNhdC1maWxlIik7CisgICAgfQorfQorCisjIFRoaXMgbWV0aG9kIHRha2VzIGEgZmlsZSBuYW1lLCBhbmQgcmV0dXJucyAoICRkaXJwYXJ0LCAkZmlsZXBhcnQgKSB3aGljaAorIyByZWZlcnMgdG8gdGhlIGRpcmVjdG9yeSBwb3J0aW9uIGFuZCB0aGUgZmlsZSBwb3J0aW9uIG9mIHRoZSBmaWxlbmFtZQorIyByZXNwZWN0aXZlbHkKK3N1YiBmaWxlbmFtZXNwbGl0Cit7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisgICAgbXkgJGZpeGZvcmxvY2FsZGlyID0gc2hpZnQ7CisKKyAgICBteSAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9ICggJGZpbGVuYW1lLCAiLiIgKTsKKyAgICAoICRmaWxlcGFydCwgJGRpcnBhcnQgKSA9ICggJDIsICQxICkgaWYgKCAkZmlsZW5hbWUgPX4gLyguKilcLyguKikvICk7CisgICAgJGRpcnBhcnQgLj0gIi8iOworCisgICAgaWYgKCAkZml4Zm9ybG9jYWxkaXIgKQorICAgIHsKKyAgICAgICAgJGRpcnBhcnQgPX4gcy9eJHN0YXRlLT57cHJlcGVuZGRpcn0vLzsKKyAgICB9CisKKyAgICByZXR1cm4gKCAkZmlsZXBhcnQsICRkaXJwYXJ0ICk7Cit9CisKK3N1YiBmaWxlY2xlYW51cAoreworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyhkZWZpbmVkKCRmaWxlbmFtZSkpOworICAgIGlmICggJGZpbGVuYW1lID1+IC9eXC8vICkKKyAgICB7CisgICAgICAgIHByaW50ICJFIGFic29sdXRlIGZpbGVuYW1lcyAnJGZpbGVuYW1lJyBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlclxuIjsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworICAgICRmaWxlbmFtZSA9fiBzL15cLlwvLy9nOworICAgICRmaWxlbmFtZSA9ICRzdGF0ZS0+e3ByZXBlbmRkaXJ9IC4gJGZpbGVuYW1lOworICAgIHJldHVybiAkZmlsZW5hbWU7Cit9CisKK3BhY2thZ2UgR0lUQ1ZTOjpsb2c7CisKKyMjIyMKKyMjIyMgQ29weXJpZ2h0IFRoZSBPcGVuIFVuaXZlcnNpdHkgVUsgLSAyMDA2LgorIyMjIworIyMjIyBBdXRob3JzOiBNYXJ0eW4gU21pdGggICAgPG1hcnR5bkBjYXRhbHlzdC5uZXQubno+CisjIyMjICAgICAgICAgIE1hcnRpbiBMYW5naG9mZiA8bWFydGluQGNhdGFseXN0Lm5ldC5uej4KKyMjIyMKKyMjIyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworPWhlYWQxIE5BTUUKKworR0lUQ1ZTOjpsb2cKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIHZlcnkgY3J1ZGUgbG9nZ2luZyB3aXRoIGEgc2ltaWxhciBpbnRlcmZhY2UgdG8KK0xvZzo6TG9nNHBlcmwKKworPWhlYWQxIE1FVEhPRFMKKworPWN1dAorCis9aGVhZDIgbmV3CisKK0NyZWF0ZXMgYSBuZXcgbG9nIG9iamVjdCwgb3B0aW9uYWxseSB5b3UgY2FuIHNwZWNpZnkgYSBmaWxlbmFtZSBoZXJlIHRvCitpbmRpY2F0ZSB0aGUgZmlsZSB0byBsb2cgdG8uIElmIG5vIGxvZyBmaWxlIGlzIHNwZWNpZmllZCwgeW91IGNhbiBzcGVjaWZ5IG9uZQorbGF0ZXIgd2l0aCBtZXRob2Qgc2V0ZmlsZSwgb3IgaW5kaWNhdGUgeW91IG5vIGxvbmdlciB3YW50IGxvZ2dpbmcgd2l0aCBtZXRob2QKK25vZmlsZS4KKworVW50aWwgb25lIG9mIHRoZXNlIG1ldGhvZHMgaXMgY2FsbGVkLCBhbGwgbG9nIGNhbGxzIHdpbGwgYnVmZmVyIG1lc3NhZ2VzIHJlYWR5Cit0byB3cml0ZSBvdXQuCisKKz1jdXQKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIG15ICRzZWxmID0ge307CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworCisgICAgaWYgKCBkZWZpbmVkICggJGZpbGVuYW1lICkgKQorICAgIHsKKyAgICAgICAgb3BlbiAkc2VsZi0+e2ZofSwgIj4+IiwgJGZpbGVuYW1lIG9yIGRpZSgiQ291bGRuJ3Qgb3BlbiAnJGZpbGVuYW1lJyBmb3Igd3JpdGluZyA6ICQhIik7CisgICAgfQorCisgICAgcmV0dXJuICRzZWxmOworfQorCis9aGVhZDIgc2V0ZmlsZQorCitUaGlzIG1ldGhvZHMgdGFrZXMgYSBmaWxlbmFtZSwgYW5kIGF0dGVtcHRzIHRvIG9wZW4gdGhhdCBmaWxlIGFzIHRoZSBsb2cgZmlsZS4KK0lmIHN1Y2Nlc3NmdWwsIGFsbCBidWZmZXJlZCBkYXRhIGlzIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLCBhbmQgYW55IGZ1cnRoZXIKK2xvZ2dpbmcgaXMgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgZmlsZS4KKworPWN1dAorc3ViIHNldGZpbGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgaWYgKCBkZWZpbmVkICggJGZpbGVuYW1lICkgKQorICAgIHsKKyAgICAgICAgb3BlbiAkc2VsZi0+e2ZofSwgIj4+IiwgJGZpbGVuYW1lIG9yIGRpZSgiQ291bGRuJ3Qgb3BlbiAnJGZpbGVuYW1lJyBmb3Igd3JpdGluZyA6ICQhIik7CisgICAgfQorCisgICAgcmV0dXJuIHVubGVzcyAoIGRlZmluZWQgKCAkc2VsZi0+e2J1ZmZlcn0gKSBhbmQgcmVmICRzZWxmLT57YnVmZmVyfSBlcSAiQVJSQVkiICk7CisKKyAgICB3aGlsZSAoIG15ICRsaW5lID0gc2hpZnQgQHskc2VsZi0+e2J1ZmZlcn19ICkKKyAgICB7CisgICAgICAgIHByaW50IHskc2VsZi0+e2ZofX0gJGxpbmU7CisgICAgfQorfQorCis9aGVhZDIgbm9maWxlCisKK1RoaXMgbWV0aG9kIGluZGljYXRlcyBubyBsb2dnaW5nIGlzIGdvaW5nIHRvIGJlIHVzZWQuIEl0IGZsdXNoZXMgYW55IGVudHJpZXMgaW4KK3RoZSBpbnRlcm5hbCBidWZmZXIsIGFuZCBzZXRzIGEgZmxhZyB0byBlbnN1cmUgbm8gZnVydGhlciBkYXRhIGlzIHB1dCB0aGVyZS4KKworPWN1dAorc3ViIG5vZmlsZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e25vbG9nfSA9IDE7CisKKyAgICByZXR1cm4gdW5sZXNzICggZGVmaW5lZCAoICRzZWxmLT57YnVmZmVyfSApIGFuZCByZWYgJHNlbGYtPntidWZmZXJ9IGVxICJBUlJBWSIgKTsKKworICAgICRzZWxmLT57YnVmZmVyfSA9IFtdOworfQorCis9aGVhZDIgX2xvZ29wZW4KKworSW50ZXJuYWwgbWV0aG9kLiBSZXR1cm5zIHRydWUgaWYgdGhlIGxvZyBmaWxlIGlzIG9wZW4sIGZhbHNlIG90aGVyd2lzZS4KKworPWN1dAorc3ViIF9sb2dvcGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAxIGlmICggZGVmaW5lZCAoICRzZWxmLT57Zmh9ICkgYW5kIHJlZiAkc2VsZi0+e2ZofSBlcSAiR0xPQiIgKTsKKyAgICByZXR1cm4gMDsKK30KKworPWhlYWQyIGRlYnVnIGluZm8gd2FybiBmYXRhbAorCitUaGVzZSBmb3VyIG1ldGhvZHMgYXJlIHdyYXBwZXJzIHRvIF9sb2cuIFRoZXkgcHJvdmlkZSB0aGUgYWN0dWFsIGludGVyZmFjZSBmb3IKK2xvZ2dpbmcgZGF0YS4KKworPWN1dAorc3ViIGRlYnVnIHsgbXkgJHNlbGYgPSBzaGlmdDsgJHNlbGYtPl9sb2coImRlYnVnIiwgQF8pOyB9CitzdWIgaW5mbyAgeyBteSAkc2VsZiA9IHNoaWZ0OyAkc2VsZi0+X2xvZygiaW5mbyIgLCBAXyk7IH0KK3N1YiB3YXJuICB7IG15ICRzZWxmID0gc2hpZnQ7ICRzZWxmLT5fbG9nKCJ3YXJuIiAsIEBfKTsgfQorc3ViIGZhdGFsIHsgbXkgJHNlbGYgPSBzaGlmdDsgJHNlbGYtPl9sb2coImZhdGFsIiwgQF8pOyB9CisKKz1oZWFkMiBfbG9nCisKK1RoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIGNhbGxlZCBieSB0aGUgbG9nZ2luZyBmdW5jdGlvbnMuIEl0IGdlbmVyYXRlcyBhCit0aW1lc3RhbXAgYW5kIHB1c2hlcyB0aGUgbG9nZ2VkIGxpbmUgZWl0aGVyIHRvIGZpbGUsIG9yIGludGVybmFsIGJ1ZmZlci4KKworPWN1dAorc3ViIF9sb2cKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRsZXZlbCA9IHNoaWZ0OworCisgICAgcmV0dXJuIGlmICggJHNlbGYtPntub2xvZ30gKTsKKworICAgIG15IEB0aW1lID0gbG9jYWx0aW1lOworICAgIG15ICR0aW1lc3RyaW5nID0gc3ByaW50ZigiJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCA6ICUtNXMiLAorICAgICAgICAkdGltZVs1XSArIDE5MDAsCisgICAgICAgICR0aW1lWzRdICsgMSwKKyAgICAgICAgJHRpbWVbM10sCisgICAgICAgICR0aW1lWzJdLAorICAgICAgICAkdGltZVsxXSwKKyAgICAgICAgJHRpbWVbMF0sCisgICAgICAgIHVjICRsZXZlbCwKKyAgICApOworCisgICAgaWYgKCAkc2VsZi0+X2xvZ29wZW4gKQorICAgIHsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57Zmh9fSAkdGltZXN0cmluZyAuICIgLSAiIC4gam9pbigiICIsQF8pIC4gIlxuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBwdXNoIEB7JHNlbGYtPntidWZmZXJ9fSwgJHRpbWVzdHJpbmcgLiAiIC0gIiAuIGpvaW4oIiAiLEBfKSAuICJcbiI7CisgICAgfQorfQorCis9aGVhZDIgREVTVFJPWQorCitUaGlzIG1ldGhvZCBzaW1wbHkgY2xvc2VzIHRoZSBmaWxlIGhhbmRsZSBpZiBvbmUgaXMgb3BlbgorCis9Y3V0CitzdWIgREVTVFJPWQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoICRzZWxmLT5fbG9nb3BlbiApCisgICAgeworICAgICAgICBjbG9zZSAkc2VsZi0+e2ZofTsKKyAgICB9Cit9CisKK3BhY2thZ2UgR0lUQ1ZTOjp1cGRhdGVyOworCisjIyMjCisjIyMjIENvcHlyaWdodCBUaGUgT3BlbiBVbml2ZXJzaXR5IFVLIC0gMjAwNi4KKyMjIyMKKyMjIyMgQXV0aG9yczogTWFydHluIFNtaXRoICAgIDxtYXJ0eW5AY2F0YWx5c3QubmV0Lm56PgorIyMjIyAgICAgICAgICBNYXJ0aW4gTGFuZ2hvZmYgPG1hcnRpbkBjYXRhbHlzdC5uZXQubno+CisjIyMjCisjIyMjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgREJJOworCis9aGVhZDEgTUVUSE9EUworCis9Y3V0CisKKz1oZWFkMiBuZXcKKworPWN1dAorc3ViIG5ldworeworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRjb25maWcgPSBzaGlmdDsKKyAgICBteSAkbW9kdWxlID0gc2hpZnQ7CisgICAgbXkgJGxvZyA9IHNoaWZ0OworCisgICAgZGllICJOZWVkIHRvIHNwZWNpZnkgYSBnaXQgcmVwb3NpdG9yeSIgdW5sZXNzICggZGVmaW5lZCgkY29uZmlnKSBhbmQgLWQgJGNvbmZpZyApOworICAgIGRpZSAiTmVlZCB0byBzcGVjaWZ5IGEgbW9kdWxlIiB1bmxlc3MgKCBkZWZpbmVkKCRtb2R1bGUpICk7CisKKyAgICAkY2xhc3MgPSByZWYoJGNsYXNzKSB8fCAkY2xhc3M7CisKKyAgICBteSAkc2VsZiA9IHt9OworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKworICAgICRzZWxmLT57ZGJkaXJ9ID0gJGNvbmZpZyAuICIvIjsKKyAgICBkaWUgIkRhdGFiYXNlIGRpciAnJHNlbGYtPntkYmRpcn0nIGlzbid0IGEgZGlyZWN0b3J5IiB1bmxlc3MgKCBkZWZpbmVkKCRzZWxmLT57ZGJkaXJ9KSBhbmQgLWQgJHNlbGYtPntkYmRpcn0gKTsKKworICAgICRzZWxmLT57bW9kdWxlfSA9ICRtb2R1bGU7CisgICAgJHNlbGYtPntmaWxlfSA9ICRzZWxmLT57ZGJkaXJ9IC4gIi9naXRjdnMuJG1vZHVsZS5zcWxpdGUiOworCisgICAgJHNlbGYtPntnaXRfcGF0aH0gPSAkY29uZmlnIC4gIi8iOworCisgICAgJHNlbGYtPntsb2d9ID0gJGxvZzsKKworICAgIGRpZSAiR2l0IHJlcG8gJyRzZWxmLT57Z2l0X3BhdGh9JyBkb2Vzbid0IGV4aXN0IiB1bmxlc3MgKCAtZCAkc2VsZi0+e2dpdF9wYXRofSApOworCisgICAgJHNlbGYtPntkYmh9ID0gREJJLT5jb25uZWN0KCJkYmk6U1FMaXRlOmRibmFtZT0iIC4gJHNlbGYtPntmaWxlfSwiIiwiIik7CisKKyAgICAkc2VsZi0+e3RhYmxlc30gPSB7fTsKKyAgICBmb3JlYWNoIG15ICR0YWJsZSAoICRzZWxmLT57ZGJofS0+dGFibGVzICkKKyAgICB7CisgICAgICAgICR0YWJsZSA9fiBzL14iLy87CisgICAgICAgICR0YWJsZSA9fiBzLyIkLy87CisgICAgICAgICRzZWxmLT57dGFibGVzfXskdGFibGV9ID0gMTsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdCB0aGUgcmV2aXNpb24gdGFibGUgaWYgcmVxdWlyZWQKKyAgICB1bmxlc3MgKCAkc2VsZi0+e3RhYmxlc317cmV2aXNpb259ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIHJldmlzaW9uICgKKyAgICAgICAgICAgICAgICBuYW1lICAgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgcmV2aXNpb24gICBJTlRFR0VSIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGZpbGVoYXNoICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBjb21taXRoYXNoIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgYXV0aG9yICAgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGlmaWVkICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBtb2RlICAgICAgIFRFWFQgTk9UIE5VTEwKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgfQorCisgICAgIyBDb25zdHJ1Y3QgdGhlIHJldmlzaW9uIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9e2hlYWR9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIGhlYWQgKAorICAgICAgICAgICAgICAgIG5hbWUgICAgICAgVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICByZXZpc2lvbiAgIElOVEVHRVIgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgZmlsZWhhc2ggICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggVEVYVCBOT1QgTlVMTCwKKyAgICAgICAgICAgICAgICBhdXRob3IgICAgIFRFWFQgTk9UIE5VTEwsCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgICBURVhUIE5PVCBOVUxMLAorICAgICAgICAgICAgICAgIG1vZGUgICAgICAgVEVYVCBOT1QgTlVMTAorICAgICAgICAgICAgKQorICAgICAgICAiKTsKKyAgICB9CisKKyAgICAjIENvbnN0cnVjdCB0aGUgcHJvcGVydGllcyB0YWJsZSBpZiByZXF1aXJlZAorICAgIHVubGVzcyAoICRzZWxmLT57dGFibGVzfXtwcm9wZXJ0aWVzfSApCisgICAgeworICAgICAgICAkc2VsZi0+e2RiaH0tPmRvKCIKKyAgICAgICAgICAgIENSRUFURSBUQUJMRSBwcm9wZXJ0aWVzICgKKyAgICAgICAgICAgICAgICBrZXkgICAgICAgIFRFWFQgTk9UIE5VTEwgUFJJTUFSWSBLRVksCisgICAgICAgICAgICAgICAgdmFsdWUgICAgICBURVhUCisgICAgICAgICAgICApCisgICAgICAgICIpOworICAgIH0KKworICAgICMgQ29uc3RydWN0IHRoZSBjb21taXRtc2dzIHRhYmxlIGlmIHJlcXVpcmVkCisgICAgdW5sZXNzICggJHNlbGYtPnt0YWJsZXN9e2NvbW1pdG1zZ3N9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57ZGJofS0+ZG8oIgorICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIGNvbW1pdG1zZ3MgKAorICAgICAgICAgICAgICAgIGtleSAgICAgICAgVEVYVCBOT1QgTlVMTCBQUklNQVJZIEtFWSwKKyAgICAgICAgICAgICAgICB2YWx1ZSAgICAgIFRFWFQKKyAgICAgICAgICAgICkKKyAgICAgICAgIik7CisgICAgfQorCisgICAgcmV0dXJuICRzZWxmOworfQorCis9aGVhZDIgdXBkYXRlCisKKz1jdXQKK3N1YiB1cGRhdGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBmaXJzdCBsZXRzIGdldCB0aGUgY29tbWl0IGxpc3QKKyAgICAkRU5We0dJVF9ESVJ9ID0gJHNlbGYtPntnaXRfcGF0aH07CisKKyAgICBteSAkY29tbWl0aW5mbyA9IGBnaXQtY2F0LWZpbGUgY29tbWl0ICRzZWxmLT57bW9kdWxlfSAyPiYxYDsKKyAgICB1bmxlc3MgKCAkY29tbWl0aW5mbyA9fiAvdHJlZVxzK1thLXpBLVowLTldezQwfS8gKQorICAgIHsKKyAgICAgICAgZGllKCJJbnZhbGlkIG1vZHVsZSAnJHNlbGYtPnttb2R1bGV9JyIpOworICAgIH0KKworCisgICAgbXkgJGdpdF9sb2c7CisgICAgbXkgJGxhc3Rjb21taXQgPSAkc2VsZi0+X2dldF9wcm9wKCJsYXN0X2NvbW1pdCIpOworCisgICAgIyBTdGFydCBleGNsdXNpdmUgbG9jayBoZXJlLi4uCisgICAgJHNlbGYtPntkYmh9LT5iZWdpbl93b3JrKCkgb3IgZGllICJDYW5ub3QgbG9jayBkYXRhYmFzZSBmb3IgQkVHSU4iOworCisgICAgIyBUT0RPOiBsb2cgcHJvY2Vzc2luZyBpcyBtZW1vcnkgYm91bmQKKyAgICAjIGlmIHdlIGNhbiBwYXJzZSBpbnRvIGEgMm5kIGZpbGUgdGhhdCBpcyBpbiByZXZlcnNlIG9yZGVyCisgICAgIyB3ZSBjYW4gcHJvYmFibHkgZG8gc29tZXRoaW5nIHJlYWxseSBlZmZpY2llbnQKKyAgICBteSBAZ2l0X2xvZ19wYXJhbXMgPSAoJy0tcHJldHR5JywgJy0tcGFyZW50cycsICctLXRvcG8tb3JkZXInKTsKKworICAgIGlmIChkZWZpbmVkICRsYXN0Y29tbWl0KSB7CisgICAgICAgIHB1c2ggQGdpdF9sb2dfcGFyYW1zLCAiJGxhc3Rjb21taXQuLiRzZWxmLT57bW9kdWxlfSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHVzaCBAZ2l0X2xvZ19wYXJhbXMsICRzZWxmLT57bW9kdWxlfTsKKyAgICB9CisgICAgIyBnaXQtcmV2LWxpc3QgaXMgdGhlIGJhY2tlbmQgLyBwbHVtYmluZyB2ZXJzaW9uIG9mIGdpdC1sb2cKKyAgICBvcGVuKEdJVExPRywgJy18JywgJ2dpdC1yZXYtbGlzdCcsIEBnaXRfbG9nX3BhcmFtcykgb3IgZGllICJDYW5ub3QgY2FsbCBnaXQtcmV2LWxpc3Q6ICQhIjsKKworICAgIG15IEBjb21taXRzOworCisgICAgbXkgJWNvbW1pdCA9ICgpOworCisgICAgd2hpbGUgKCA8R0lUTE9HPiApCisgICAgeworICAgICAgICBjaG9tcDsKKyAgICAgICAgaWYgKG0vXmNvbW1pdFxzKyguKikkLykgeworICAgICAgICAgICAgIyBvbiBeY29tbWl0IGxpbmVzIHB1dCB0aGUganVzdCBzZWVuIGNvbW1pdCBpbiB0aGUgc3RhY2sKKyAgICAgICAgICAgICMgYW5kIHByaW1lIHRoaW5ncyBmb3IgdGhlIG5leHQgb25lCisgICAgICAgICAgICBpZiAoa2V5cyAlY29tbWl0KSB7CisgICAgICAgICAgICAgICAgbXkgJWNvcHkgPSAlY29tbWl0OworICAgICAgICAgICAgICAgIHVuc2hpZnQgQGNvbW1pdHMsIFwlY29weTsKKyAgICAgICAgICAgICAgICAlY29tbWl0ID0gKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBteSBAcGFyZW50cyA9IHNwbGl0KG0vXHMrLywgJDEpOworICAgICAgICAgICAgJGNvbW1pdHtoYXNofSA9IHNoaWZ0IEBwYXJlbnRzOworICAgICAgICAgICAgJGNvbW1pdHtwYXJlbnRzfSA9IFxAcGFyZW50czsKKyAgICAgICAgfSBlbHNpZiAobS9eKFx3Kz8pOlxzKyguKikkLyAmJiAhZXhpc3RzKCRjb21taXR7bWVzc2FnZX0pKSB7CisgICAgICAgICAgICAjIG9uIHJmYzgyMi1saWtlIGxpbmVzIHNlZW4gYmVmb3JlIHdlIHNlZSBhbnkgbWVzc2FnZSwKKyAgICAgICAgICAgICMgbG93ZXJjYXNlIHRoZSBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSBoYXNoIGFzIGtleS12YWx1ZQorICAgICAgICAgICAgJGNvbW1pdHtsYygkMSl9ID0gJDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAjIG1lc3NhZ2UgbGluZXMgLSBza2lwIGluaXRpYWwgZW1wdHkgbGluZQorICAgICAgICAgICAgIyBhbmQgdHJpbSB3aGl0ZXNwYWNlCisgICAgICAgICAgICBpZiAoIWV4aXN0cygkY29tbWl0e21lc3NhZ2V9KSAmJiBtL15ccyokLykgeworICAgICAgICAgICAgICAgICMgZGVmaW5lIGl0IHRvIG1hcmsgdGhlIGVuZCBvZiBoZWFkZXJzCisgICAgICAgICAgICAgICAgJGNvbW1pdHttZXNzYWdlfSA9ICcnOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzL15ccysvLzsgcy9ccyskLy87ICMgdHJpbSB3cworICAgICAgICAgICAgJGNvbW1pdHttZXNzYWdlfSAuPSAkXyAuICJcbiI7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xvc2UgR0lUTE9HOworCisgICAgdW5zaGlmdCBAY29tbWl0cywgXCVjb21taXQgaWYgKCBrZXlzICVjb21taXQgKTsKKworICAgICMgTm93IGFsbCB0aGUgY29tbWl0cyBhcmUgaW4gdGhlIEBjb21taXRzIGJ1Y2tldAorICAgICMgb3JkZXJlZCBieSB0aW1lIERFU0MuIGZvciBlYWNoIGNvbW1pdCB0aGF0IG5lZWRzIHByb2Nlc3NpbmcsCisgICAgIyBkZXRlcm1pbmUgd2hldGhlciBpdCdzIGZvbGxvd2luZyB0aGUgbGFzdCBoZWFkIHdlJ3ZlIHNlZW4gb3IgaWYKKyAgICAjIGl0J3Mgb24gaXRzIG93biBicmFuY2gsIGdyYWIgYSBmaWxlIGxpc3QsIGFuZCBhZGQgd2hhdGV2ZXIncyBjaGFuZ2VkCisgICAgIyBOT1RFOiAkbGFzdGNvbW1pdCByZWZlcnMgdG8gdGhlIGxhc3QgY29tbWl0IGZyb20gcHJldmlvdXMgcnVuCisgICAgIyAgICAgICAkbGFzdHBpY2tlZCBpcyB0aGUgbGFzdCBjb21taXQgd2UgcGlja2VkIGluIHRoaXMgcnVuCisgICAgbXkgJGxhc3RwaWNrZWQ7CisgICAgbXkgJGhlYWQgPSB7fTsKKyAgICBpZiAoZGVmaW5lZCAkbGFzdGNvbW1pdCkgeworICAgICAgICAkbGFzdHBpY2tlZCA9ICRsYXN0Y29tbWl0OworICAgIH0KKworICAgIG15ICRjb21taXR0b3RhbCA9IHNjYWxhcihAY29tbWl0cyk7CisgICAgbXkgJGNvbW1pdGNvdW50ID0gMDsKKworICAgICMgTG9hZCB0aGUgaGVhZCB0YWJsZSBpbnRvICRoZWFkIChmb3IgY2FjaGVkIGxvb2t1cHMgZHVyaW5nIHRoZSB1cGRhdGUgcHJvY2VzcykKKyAgICBmb3JlYWNoIG15ICRmaWxlICggQHskc2VsZi0+Z2V0aGVhZCgpfSApCisgICAgeworICAgICAgICAkaGVhZC0+eyRmaWxlLT57bmFtZX19ID0gJGZpbGU7CisgICAgfQorCisgICAgZm9yZWFjaCBteSAkY29tbWl0ICggQGNvbW1pdHMgKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntsb2d9LT5kZWJ1ZygiR0lUQ1ZTOjp1cGRhdGVyIC0gUHJvY2Vzc2luZyBjb21taXQgJGNvbW1pdC0+e2hhc2h9ICgiIC4gKCsrJGNvbW1pdGNvdW50KSAuICIgb2YgJGNvbW1pdHRvdGFsKSIpOworICAgICAgICBpZiAoZGVmaW5lZCAkbGFzdHBpY2tlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpbl9hcnJheSgkbGFzdHBpY2tlZCwgQHskY29tbWl0LT57cGFyZW50c319KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIHNraXAsIHdlJ2xsIHNlZSB0aGlzIGRlbHRhCisgICAgICAgICAgICAgICAgIyBhcyBwYXJ0IG9mIGEgbWVyZ2UgbGF0ZXIKKyAgICAgICAgICAgICAgICAjIHdhcm4gInNraXBwaW5nIG9mZi10cmFjayAgJGNvbW1pdC0+e2hhc2h9XG4iOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9IGVsc2lmIChAeyRjb21taXQtPntwYXJlbnRzfX0gPiAxKSB7CisgICAgICAgICAgICAgICAgIyBpdCBpcyBhIG1lcmdlIGNvbW1pdCwgZm9yIGVhY2ggcGFyZW50IHRoYXQgaXMKKyAgICAgICAgICAgICAgICAjIG5vdCAkbGFzdHBpY2tlZCwgc2VlIGlmIHdlIGNhbiBnZXQgYSBsb2cKKyAgICAgICAgICAgICAgICAjIGZyb20gdGhlIG1lcmdlLWJhc2UgdG8gdGhhdCBwYXJlbnQgdG8gcHV0IGl0CisgICAgICAgICAgICAgICAgIyBpbiB0aGUgbWVzc2FnZSBhcyBhIG1lcmdlIHN1bW1hcnkuCisgICAgICAgICAgICAgICAgbXkgQHBhcmVudHMgPSBAeyRjb21taXQtPntwYXJlbnRzfX07CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcGFyZW50IChAcGFyZW50cykgeworICAgICAgICAgICAgICAgICAgICAjIGdpdC1tZXJnZS1iYXNlIGNhbiBwb3RlbnRpYWxseSAoYnV0IHJhcmVseSkgdGhyb3cKKyAgICAgICAgICAgICAgICAgICAgIyBzZXZlcmFsIGNhbmRpZGF0ZSBtZXJnZSBiYXNlcy4gbGV0J3MgYXNzdW1lCisgICAgICAgICAgICAgICAgICAgICMgdGhhdCB0aGUgZmlyc3Qgb25lIGlzIHRoZSBiZXN0IG9uZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXJlbnQgZXEgJGxhc3RwaWNrZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3BlbiBteSAkcCwgJ2dpdC1tZXJnZS1iYXNlICcuICRsYXN0cGlja2VkIC4gJyAnCisgICAgICAgICAgICAgICAgICAgIC4gJHBhcmVudCAuICd8JzsKKyAgICAgICAgICAgICAgICAgICAgbXkgQG91dHB1dCA9ICg8JHA+KTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UgJHA7CisgICAgICAgICAgICAgICAgICAgIG15ICRiYXNlID0gam9pbignJywgQG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgIGNob21wICRiYXNlOworICAgICAgICAgICAgICAgICAgICBpZiAoJGJhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15IEBtZXJnZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50ICJ3YW50IHRvIGxvZyBiZXR3ZWVuICAkYmFzZSAkcGFyZW50IFxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oR0lUTE9HLCAnLXwnLCAnZ2l0LWxvZycsICIkYmFzZS4uJHBhcmVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICBvciBkaWUgIkNhbm5vdCBjYWxsIGdpdC1sb2c6ICQhIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRtZXJnZWRoYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDxHSVRMT0c+KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRtZXJnZWRoYXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtL15jb21taXRccysoLispJC8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZXJnZWRoYXNoID0gJDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBncmFiIHRoZSBmaXJzdCBsaW5lIHRoYXQgbG9va3Mgbm9uLXJmYzgyMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFrYSBoYXMgY29udGVudCBhZnRlciBsZWFkaW5nIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtL15ccysoXFMuKikkLykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHRpdGxlID0gJDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGl0bGUgPSBzdWJzdHIoJHRpdGxlLDAsMTAwKTsgIyB0cnVuY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGlmdCBAbWVyZ2VkLCAiJG1lcmdlZGhhc2ggJHRpdGxlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmICRtZXJnZWRoYXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgR0lUTE9HOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEBtZXJnZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tbWl0LT57bWVyZ2Vtc2d9ID0gJGNvbW1pdC0+e21lc3NhZ2V9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gLj0gIlxuU3VtbWFyeSBvZiBtZXJnZWQgY29tbWl0czpcblxuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRzdW1tYXJ5IChAbWVyZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gLj0gIlx0JHN1bW1hcnlcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21taXQtPnttZXJnZW1zZ30gLj0gIlxuXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgIk1lc3NhZ2UgZm9yICRjb21taXQtPntoYXNofSBcbiRjb21taXQtPnttZXJnZW1zZ30iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBjb252ZXJ0IHRoZSBkYXRlIHRvIENWUy1oYXBweSBmb3JtYXQKKyAgICAgICAgJGNvbW1pdC0+e2RhdGV9ID0gIiQyICQxICQ0ICQzICQ1IiBpZiAoICRjb21taXQtPntkYXRlfSA9fiAvXlx3K1xzKyhcdyspXHMrKFxkKylccysoXGQrOlxkKzpcZCspXHMrKFxkKylccysoWystXVxkKykkLyApOworCisgICAgICAgIGlmICggZGVmaW5lZCAoICRsYXN0cGlja2VkICkgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkZmlsZXBpcGUgPSBvcGVuKEZJTEVMSVNULCAnLXwnLCAnZ2l0LWRpZmYtdHJlZScsICctcicsICRsYXN0cGlja2VkLCAkY29tbWl0LT57aGFzaH0pIG9yIGRpZSgiQ2Fubm90IGNhbGwgZ2l0LWRpZmYtdHJlZSA6ICQhIik7CisgICAgICAgICAgICB3aGlsZSAoIDxGSUxFTElTVD4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVubGVzcyAoIC9eOlxkezZ9XHMrXGR7M30oXGQpXGR7Mn1ccytbYS16QS1aMC05XXs0MH1ccysoW2EtekEtWjAtOV17NDB9KVxzKyhcdylccysoLiopJC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgcHJvY2VzcyBnaXQtZGlmZi10cmVlIGxpbmUgOiAkXyIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgJGxvZy0+ZGVidWcoIkZpbGUgbW9kZT0kMSwgaGFzaD0kMiwgY2hhbmdlPSQzLCBuYW1lPSQ0Iik7CisKKyAgICAgICAgICAgICAgICBteSAkZ2l0X3Blcm1zID0gIiI7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyAuPSAiciIgaWYgKCAkMSAmIDQgKTsKKyAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ3IiBpZiAoICQxICYgMiApOworICAgICAgICAgICAgICAgICRnaXRfcGVybXMgLj0gIngiIGlmICggJDEgJiAxICk7CisgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyA9ICJydyIgaWYgKCAkZ2l0X3Blcm1zIGVxICIiICk7CisKKyAgICAgICAgICAgICAgICBpZiAoICQzIGVxICJEIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIkRFTEVURSAgICQ0Iik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JDR9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRoZWFkLT57JDR9e3JldmlzaW9ufSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAiZGVsZXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21taXRoYXNoID0+ICRjb21taXQtPntoYXNofSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0+ICRjb21taXQtPntkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvciA9PiAkY29tbWl0LT57YXV0aG9yfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT4gJGdpdF9wZXJtcywKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPmluc2VydF9yZXYoJDQsICRoZWFkLT57JDR9e3JldmlzaW9ufSwgJDIsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJDMgZXEgIk0iICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICMkbG9nLT5kZWJ1ZygiTU9ESUZJRUQgJDQiKTsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskNH0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0+ICQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb24gPT4gJGhlYWQtPnskNH17cmV2aXNpb259ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICQyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0aGFzaCA9PiAkY29tbWl0LT57aGFzaH0sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9PiAkY29tbWl0LT57ZGF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3IgPT4gJGNvbW1pdC0+e2F1dGhvcn0sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0+ICRnaXRfcGVybXMsCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5pbnNlcnRfcmV2KCQ0LCAkaGVhZC0+eyQ0fXtyZXZpc2lvbn0sICQyLCAkY29tbWl0LT57aGFzaH0sICRjb21taXQtPntkYXRlfSwgJGNvbW1pdC0+e2F1dGhvcn0sICRnaXRfcGVybXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICQzIGVxICJBIiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAjJGxvZy0+ZGVidWcoIkFEREVEICAgICQ0Iik7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JDR9ID0geworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9PiAkNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlaGFzaCA9PiAkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+aW5zZXJ0X3JldigkNCwgJGhlYWQtPnskNH17cmV2aXNpb259LCAkMiwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkZ2l0X3Blcm1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvZy0+d2FybigiVU5LTk9XTiBGSUxFIENIQU5HRSBtb2RlPSQxLCBoYXNoPSQyLCBjaGFuZ2U9JDMsIG5hbWU9JDQiKTsKKyAgICAgICAgICAgICAgICAgICAgZGllOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsb3NlIEZJTEVMSVNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIyB0aGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGZpbGVzIHJlbW92ZWQgZnJvbSB0aGUgcmVwbworICAgICAgICAgICAgbXkgJHNlZW5fZmlsZXMgPSB7fTsKKworICAgICAgICAgICAgbXkgJGZpbGVwaXBlID0gb3BlbihGSUxFTElTVCwgJy18JywgJ2dpdC1scy10cmVlJywgJy1yJywgJGNvbW1pdC0+e2hhc2h9KSBvciBkaWUoIkNhbm5vdCBjYWxsIGdpdC1scy10cmVlIDogJCEiKTsKKyAgICAgICAgICAgIHdoaWxlICggPEZJTEVMSVNUPiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5sZXNzICggL14oXGQrKVxzKyhcdyspXHMrKFthLXpBLVowLTldKylccysoLiopJC9vICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgcHJvY2VzcyBnaXQtbHMtdHJlZSBsaW5lIDogJF8iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteSAoICRnaXRfcGVybXMsICRnaXRfdHlwZSwgJGdpdF9oYXNoLCAkZ2l0X2ZpbGVuYW1lICkgPSAoICQxLCAkMiwgJDMsICQ0ICk7CisKKyAgICAgICAgICAgICAgICAkc2Vlbl9maWxlcy0+eyRnaXRfZmlsZW5hbWV9ID0gMTsKKworICAgICAgICAgICAgICAgIG15ICggJG9sZGhhc2gsICRvbGRyZXZpc2lvbiwgJG9sZG1vZGUgKSA9ICgKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfXtmaWxlaGFzaH0sCisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGdpdF9maWxlbmFtZX17cmV2aXNpb259LAorICAgICAgICAgICAgICAgICAgICAkaGVhZC0+eyRnaXRfZmlsZW5hbWV9e21vZGV9CisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIGlmICggJGdpdF9wZXJtcyA9fiAvXlxkXGRcZChcZClcZFxkL28gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGdpdF9wZXJtcyA9ICIiOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJyIiBpZiAoICQxICYgNCApOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ3IiBpZiAoICQxICYgMiApOworICAgICAgICAgICAgICAgICAgICAkZ2l0X3Blcm1zIC49ICJ4IiBpZiAoICQxICYgMSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRnaXRfcGVybXMgPSAicnciOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgdW5sZXNzIHRoZSBmaWxlIGV4aXN0cyB3aXRoIHRoZSBzYW1lIGhhc2gsIHdlIG5lZWQgdG8gdXBkYXRlIGl0IC4uLgorICAgICAgICAgICAgICAgIHVubGVzcyAoIGRlZmluZWQoJG9sZGhhc2gpIGFuZCAkb2xkaGFzaCBlcSAkZ2l0X2hhc2ggYW5kIGRlZmluZWQoJG9sZG1vZGUpIGFuZCAkb2xkbW9kZSBlcSAkZ2l0X3Blcm1zICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG15ICRuZXdyZXZpc2lvbiA9ICggJG9sZHJldmlzaW9uIG9yIDAgKSArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZ2l0X2ZpbGVuYW1lfSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT4gJGdpdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uID0+ICRuZXdyZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVoYXNoID0+ICRnaXRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdGhhc2ggPT4gJGNvbW1pdC0+e2hhc2h9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPT4gJGNvbW1pdC0+e2RhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yID0+ICRjb21taXQtPnthdXRob3J9LAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PiAkZ2l0X3Blcm1zLAorICAgICAgICAgICAgICAgICAgICB9OworCisKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPmluc2VydF9yZXYoJGdpdF9maWxlbmFtZSwgJG5ld3JldmlzaW9uLCAkZ2l0X2hhc2gsICRjb21taXQtPntoYXNofSwgJGNvbW1pdC0+e2RhdGV9LCAkY29tbWl0LT57YXV0aG9yfSwgJGdpdF9wZXJtcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xvc2UgRklMRUxJU1Q7CisKKyAgICAgICAgICAgICMgRGV0ZWN0IGRlbGV0ZWQgZmlsZXMKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzICUkaGVhZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdW5sZXNzICggZXhpc3RzICRzZWVuX2ZpbGVzLT57JGZpbGV9IG9yICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSBlcSAiZGVsZXRlZCIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17cmV2aXNpb259Kys7CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSA9ICJkZWxldGVkIjsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17Y29tbWl0aGFzaH0gPSAkY29tbWl0LT57aGFzaH07CisgICAgICAgICAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGlmaWVkfSA9ICRjb21taXQtPntkYXRlfTsKKyAgICAgICAgICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17YXV0aG9yfSA9ICRjb21taXQtPnthdXRob3J9OworCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5pbnNlcnRfcmV2KCRmaWxlLCAkaGVhZC0+eyRmaWxlfXtyZXZpc2lvbn0sICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSwgJGNvbW1pdC0+e2hhc2h9LCAkY29tbWl0LT57ZGF0ZX0sICRjb21taXQtPnthdXRob3J9LCAkaGVhZC0+eyRmaWxlfXttb2RlfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBFTkQgOiAiRGV0ZWN0IGRlbGV0ZWQgZmlsZXMiCisgICAgICAgIH0KKworCisgICAgICAgIGlmIChleGlzdHMgJGNvbW1pdC0+e21lcmdlbXNnfSkKKyAgICAgICAgeworICAgICAgICAgICAgJHNlbGYtPmluc2VydF9tZXJnZWxvZygkY29tbWl0LT57aGFzaH0sICRjb21taXQtPnttZXJnZW1zZ30pOworICAgICAgICB9CisKKyAgICAgICAgJGxhc3RwaWNrZWQgPSAkY29tbWl0LT57aGFzaH07CisKKyAgICAgICAgJHNlbGYtPl9zZXRfcHJvcCgibGFzdF9jb21taXQiLCAkY29tbWl0LT57aGFzaH0pOworICAgIH0KKworICAgICRzZWxmLT5kZWxldGVfaGVhZCgpOworICAgIGZvcmVhY2ggbXkgJGZpbGUgKCBrZXlzICUkaGVhZCApCisgICAgeworICAgICAgICAkc2VsZi0+aW5zZXJ0X2hlYWQoCisgICAgICAgICAgICAkZmlsZSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e3JldmlzaW9ufSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2ZpbGVoYXNofSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e2NvbW1pdGhhc2h9LAorICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17bW9kaWZpZWR9LAorICAgICAgICAgICAgJGhlYWQtPnskZmlsZX17YXV0aG9yfSwKKyAgICAgICAgICAgICRoZWFkLT57JGZpbGV9e21vZGV9LAorICAgICAgICApOworICAgIH0KKyAgICAjIGludmFsaWRhdGUgdGhlIGdldGhlYWQgY2FjaGUKKyAgICAkc2VsZi0+e2dldGhlYWRfY2FjaGV9ID0gdW5kZWY7CisKKworICAgICMgRW5kaW5nIGV4Y2x1c2l2ZSBsb2NrIGhlcmUKKyAgICAkc2VsZi0+e2RiaH0tPmNvbW1pdCgpIG9yIGRpZSAiRmFpbGVkIHRvIGNvbW1pdCBjaGFuZ2VzIHRvIFNRTGl0ZSI7Cit9CisKK3N1YiBpbnNlcnRfcmV2Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICRmaWxlaGFzaCA9IHNoaWZ0OworICAgIG15ICRjb21taXRoYXNoID0gc2hpZnQ7CisgICAgbXkgJG1vZGlmaWVkID0gc2hpZnQ7CisgICAgbXkgJGF1dGhvciA9IHNoaWZ0OworICAgIG15ICRtb2RlID0gc2hpZnQ7CisKKyAgICBteSAkaW5zZXJ0X3JldiA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIklOU0VSVCBJTlRPIHJldmlzaW9uIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfcmV2LT5leGVjdXRlKCRuYW1lLCAkcmV2aXNpb24sICRmaWxlaGFzaCwgJGNvbW1pdGhhc2gsICRtb2RpZmllZCwgJGF1dGhvciwgJG1vZGUpOworfQorCitzdWIgaW5zZXJ0X21lcmdlbG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAka2V5ID0gc2hpZnQ7CisgICAgbXkgJHZhbHVlID0gc2hpZnQ7CisKKyAgICBteSAkaW5zZXJ0X21lcmdlbG9nID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiSU5TRVJUIElOVE8gY29tbWl0bXNncyAoa2V5LCB2YWx1ZSkgVkFMVUVTICg/LD8pIix7fSwxKTsKKyAgICAkaW5zZXJ0X21lcmdlbG9nLT5leGVjdXRlKCRrZXksICR2YWx1ZSk7Cit9CisKK3N1YiBkZWxldGVfaGVhZAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkZGVsZXRlX2hlYWQgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJERUxFVEUgRlJPTSBoZWFkIix7fSwxKTsKKyAgICAkZGVsZXRlX2hlYWQtPmV4ZWN1dGUoKTsKK30KKworc3ViIGluc2VydF9oZWFkCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRyZXZpc2lvbiA9IHNoaWZ0OworICAgIG15ICRmaWxlaGFzaCA9IHNoaWZ0OworICAgIG15ICRjb21taXRoYXNoID0gc2hpZnQ7CisgICAgbXkgJG1vZGlmaWVkID0gc2hpZnQ7CisgICAgbXkgJGF1dGhvciA9IHNoaWZ0OworICAgIG15ICRtb2RlID0gc2hpZnQ7CisKKyAgICBteSAkaW5zZXJ0X2hlYWQgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyBoZWFkIChuYW1lLCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2gsIG1vZGlmaWVkLCBhdXRob3IsIG1vZGUpIFZBTFVFUyAoPyw/LD8sPyw/LD8sPykiLHt9LDEpOworICAgICRpbnNlcnRfaGVhZC0+ZXhlY3V0ZSgkbmFtZSwgJHJldmlzaW9uLCAkZmlsZWhhc2gsICRjb21taXRoYXNoLCAkbW9kaWZpZWQsICRhdXRob3IsICRtb2RlKTsKK30KKworc3ViIF9oZWFkcmV2Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCBmaWxlaGFzaCwgcmV2aXNpb24sIG1vZGUgRlJPTSBoZWFkIFdIRVJFIG5hbWU9PyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisgICAgbXkgKCAkaGFzaCwgJHJldmlzaW9uLCAkbW9kZSApID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19hcnJheTsKKworICAgIHJldHVybiAoICRoYXNoLCAkcmV2aXNpb24sICRtb2RlICk7Cit9CisKK3N1YiBfZ2V0X3Byb3AKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRrZXkgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCB2YWx1ZSBGUk9NIHByb3BlcnRpZXMgV0hFUkUga2V5PT8iLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgka2V5KTsKKyAgICBteSAoICR2YWx1ZSApID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19hcnJheTsKKworICAgIHJldHVybiAkdmFsdWU7Cit9CisKK3N1YiBfc2V0X3Byb3AKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRrZXkgPSBzaGlmdDsKKyAgICBteSAkdmFsdWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlVQREFURSBwcm9wZXJ0aWVzIFNFVCB2YWx1ZT0/IFdIRVJFIGtleT0/Iix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJHZhbHVlLCAka2V5KTsKKworICAgIHVubGVzcyAoICRkYl9xdWVyeS0+cm93cyApCisgICAgeworICAgICAgICAkZGJfcXVlcnkgPSAkc2VsZi0+e2RiaH0tPnByZXBhcmVfY2FjaGVkKCJJTlNFUlQgSU5UTyBwcm9wZXJ0aWVzIChrZXksIHZhbHVlKSBWQUxVRVMgKD8sPykiLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGtleSwgJHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHZhbHVlOworfQorCis9aGVhZDIgZ2V0aGVhZAorCis9Y3V0CisKK3N1YiBnZXRoZWFkCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2dldGhlYWRfY2FjaGV9IGlmICggZGVmaW5lZCAoICRzZWxmLT57Z2V0aGVhZF9jYWNoZX0gKSApOworCisgICAgbXkgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIG5hbWUsIGZpbGVoYXNoLCBtb2RlLCByZXZpc2lvbiwgbW9kaWZpZWQsIGNvbW1pdGhhc2gsIGF1dGhvciBGUk9NIGhlYWQgT1JERVIgQlkgbmFtZSBBU0MiLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgpOworCisgICAgbXkgJHRyZWUgPSBbXTsKKyAgICB3aGlsZSAoIG15ICRmaWxlID0gJGRiX3F1ZXJ5LT5mZXRjaHJvd19oYXNocmVmICkKKyAgICB7CisgICAgICAgIHB1c2ggQCR0cmVlLCAkZmlsZTsKKyAgICB9CisKKyAgICAkc2VsZi0+e2dldGhlYWRfY2FjaGV9ID0gJHRyZWU7CisKKyAgICByZXR1cm4gJHRyZWU7Cit9CisKKz1oZWFkMiBnZXRsb2cKKworPWN1dAorCitzdWIgZ2V0bG9nCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworICAgIG15ICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCBuYW1lLCBmaWxlaGFzaCwgYXV0aG9yLCBtb2RlLCByZXZpc2lvbiwgbW9kaWZpZWQsIGNvbW1pdGhhc2ggRlJPTSByZXZpc2lvbiBXSEVSRSBuYW1lPT8gT1JERVIgQlkgcmV2aXNpb24gREVTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisKKyAgICBteSAkdHJlZSA9IFtdOworICAgIHdoaWxlICggbXkgJGZpbGUgPSAkZGJfcXVlcnktPmZldGNocm93X2hhc2hyZWYgKQorICAgIHsKKyAgICAgICAgcHVzaCBAJHRyZWUsICRmaWxlOworICAgIH0KKworICAgIHJldHVybiAkdHJlZTsKK30KKworPWhlYWQyIGdldG1ldGEKKworVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZpbGVuYW1lICh3aXRoIHBhdGgpIGFyZ3VtZW50IGFuZCByZXR1cm5zIGEgaGFzaHJlZiBvZgorbWV0YWRhdGEgZm9yIHRoYXQgZmlsZS4KKworPWN1dAorCitzdWIgZ2V0bWV0YQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisgICAgbXkgJHJldmlzaW9uID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnk7CisgICAgaWYgKCBkZWZpbmVkKCRyZXZpc2lvbikgYW5kICRyZXZpc2lvbiA9fiAvXlxkKyQvICkKKyAgICB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gcmV2aXNpb24gV0hFUkUgbmFtZT0/IEFORCByZXZpc2lvbj0/Iix7fSwxKTsKKyAgICAgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSwgJHJldmlzaW9uKTsKKyAgICB9CisgICAgZWxzaWYgKCBkZWZpbmVkKCRyZXZpc2lvbikgYW5kICRyZXZpc2lvbiA9fiAvXlthLXpBLVowLTldezQwfSQvICkKKyAgICB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gcmV2aXNpb24gV0hFUkUgbmFtZT0/IEFORCBjb21taXRoYXNoPT8iLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lLCAkcmV2aXNpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCAqIEZST00gaGVhZCBXSEVSRSBuYW1lPT8iLHt9LDEpOworICAgICAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gJGRiX3F1ZXJ5LT5mZXRjaHJvd19oYXNocmVmOworfQorCis9aGVhZDIgY29tbWl0bWVzc2FnZQorCit0aGlzIGZ1bmN0aW9uIHRha2VzIGEgY29tbWl0aGFzaCBhbmQgcmV0dXJucyB0aGUgY29tbWl0IG1lc3NhZ2UgZm9yIHRoYXQgY29tbWl0CisKKz1jdXQKK3N1YiBjb21taXRtZXNzYWdlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkY29tbWl0aGFzaCA9IHNoaWZ0OworCisgICAgZGllKCJOZWVkIGNvbW1pdGhhc2giKSB1bmxlc3MgKCBkZWZpbmVkKCRjb21taXRoYXNoKSBhbmQgJGNvbW1pdGhhc2ggPX4gL15bYS16QS1aMC05XXs0MH0kLyApOworCisgICAgbXkgJGRiX3F1ZXJ5OworICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCB2YWx1ZSBGUk9NIGNvbW1pdG1zZ3MgV0hFUkUga2V5PT8iLHt9LDEpOworICAgICRkYl9xdWVyeS0+ZXhlY3V0ZSgkY29tbWl0aGFzaCk7CisKKyAgICBteSAoICRtZXNzYWdlICkgPSAkZGJfcXVlcnktPmZldGNocm93X2FycmF5OworCisgICAgaWYgKCBkZWZpbmVkICggJG1lc3NhZ2UgKSApCisgICAgeworICAgICAgICAkbWVzc2FnZSAuPSAiICIgaWYgKCAkbWVzc2FnZSA9fiAvXG4kLyApOworICAgICAgICByZXR1cm4gJG1lc3NhZ2U7CisgICAgfQorCisgICAgbXkgQGxpbmVzID0gc2FmZV9waXBlX2NhcHR1cmUoImdpdC1jYXQtZmlsZSIsICJjb21taXQiLCAkY29tbWl0aGFzaCk7CisgICAgc2hpZnQgQGxpbmVzIHdoaWxlICggJGxpbmVzWzBdID1+IC9cUy8gKTsKKyAgICAkbWVzc2FnZSA9IGpvaW4oIiIsQGxpbmVzKTsKKyAgICAkbWVzc2FnZSAuPSAiICIgaWYgKCAkbWVzc2FnZSA9fiAvXG4kLyApOworICAgIHJldHVybiAkbWVzc2FnZTsKK30KKworPWhlYWQyIGdldGhpc3RvcnkKKworVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZpbGVuYW1lICh3aXRoIHBhdGgpIGFyZ3VtZW50IGFuZCByZXR1cm5zIGFuIGFycmF5b2ZhcnJheXMKK2NvbnRhaW5pbmcgcmV2aXNpb24sZmlsZWhhc2gsY29tbWl0aGFzaCBvcmRlcmVkIGJ5IHJldmlzaW9uIGRlc2NlbmRpbmcKKworPWN1dAorc3ViIGdldGhpc3RvcnkKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OworCisgICAgbXkgJGRiX3F1ZXJ5OworICAgICRkYl9xdWVyeSA9ICRzZWxmLT57ZGJofS0+cHJlcGFyZV9jYWNoZWQoIlNFTEVDVCByZXZpc2lvbiwgZmlsZWhhc2gsIGNvbW1pdGhhc2ggRlJPTSByZXZpc2lvbiBXSEVSRSBuYW1lPT8gT1JERVIgQlkgcmV2aXNpb24gREVTQyIse30sMSk7CisgICAgJGRiX3F1ZXJ5LT5leGVjdXRlKCRmaWxlbmFtZSk7CisKKyAgICByZXR1cm4gJGRiX3F1ZXJ5LT5mZXRjaGFsbF9hcnJheXJlZjsKK30KKworPWhlYWQyIGdldGhpc3RvcnlkZW5zZQorCitUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZmlsZW5hbWUgKHdpdGggcGF0aCkgYXJndW1lbnQgYW5kIHJldHVybnMgYW4gYXJyYXlvZmFycmF5cworY29udGFpbmluZyByZXZpc2lvbixmaWxlaGFzaCxjb21taXRoYXNoIG9yZGVyZWQgYnkgcmV2aXNpb24gZGVzY2VuZGluZy4KKworVGhpcyB2ZXJzaW9uIG9mIGdldGhpc3Rvcnkgc2tpcHMgZGVsZXRlZCBlbnRyaWVzIC0tIHNvIGl0IGlzIHVzZWZ1bCBmb3IgYW5ub3RhdGUuCitUaGUgJ2RlbnNlJyBwYXJ0IGlzIGEgcmVmZXJlbmNlIHRvIGEgJy0tZGVuc2UnIG9wdGlvbiBhdmFpbGFibGUgZm9yIGdpdC1yZXYtbGlzdAorYW5kIG90aGVyIGdpdCB0b29scyB0aGF0IGRlcGVuZCBvbiBpdC4KKworPWN1dAorc3ViIGdldGhpc3RvcnlkZW5zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkZGJfcXVlcnk7CisgICAgJGRiX3F1ZXJ5ID0gJHNlbGYtPntkYmh9LT5wcmVwYXJlX2NhY2hlZCgiU0VMRUNUIHJldmlzaW9uLCBmaWxlaGFzaCwgY29tbWl0aGFzaCBGUk9NIHJldmlzaW9uIFdIRVJFIG5hbWU9PyBBTkQgZmlsZWhhc2ghPSdkZWxldGVkJyBPUkRFUiBCWSByZXZpc2lvbiBERVNDIix7fSwxKTsKKyAgICAkZGJfcXVlcnktPmV4ZWN1dGUoJGZpbGVuYW1lKTsKKworICAgIHJldHVybiAkZGJfcXVlcnktPmZldGNoYWxsX2FycmF5cmVmOworfQorCis9aGVhZDIgaW5fYXJyYXkoKQorCitmcm9tIEFycmF5OjpQQVQgLSBtaW1pY3MgdGhlIGluX2FycmF5KCkgZnVuY3Rpb24KK2ZvdW5kIGluIFBIUC4gWXVjayBidXQgd29ya3MgZm9yIHNtYWxsIGFycmF5cy4KKworPWN1dAorc3ViIGluX2FycmF5Cit7CisgICAgbXkgKCRjaGVjaywgQGFycmF5KSA9IEBfOworICAgIG15ICRyZXR2YWwgPSAwOworICAgIGZvcmVhY2ggbXkgJHRlc3QgKEBhcnJheSl7CisgICAgICAgIGlmKCRjaGVjayBlcSAkdGVzdCl7CisgICAgICAgICAgICAkcmV0dmFsID0gIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICRyZXR2YWw7Cit9CisKKz1oZWFkMiBzYWZlX3BpcGVfY2FwdHVyZQorCithbiBhbHRlcm5hdGl2ZSB0byBgY29tbWFuZGAgdGhhdCBhbGxvd3MgaW5wdXQgdG8gYmUgcGFzc2VkIGFzIGFuIGFycmF5Cit0byB3b3JrIGFyb3VuZCBzaGVsbCBwcm9ibGVtcyB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgaW4gYXJndW1lbnRzCisKKz1jdXQKK3N1YiBzYWZlX3BpcGVfY2FwdHVyZSB7CisKKyAgICBteSBAb3V0cHV0OworCisgICAgaWYgKG15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JykgeworICAgICAgICBAb3V0cHV0ID0gKDwkY2hpbGQ+KTsKKyAgICAgICAgY2xvc2UgJGNoaWxkIG9yIGRpZSBqb2luKCcgJyxAXykuIjogJCEgJD8iOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4ZWMoQF8pIG9yIGRpZSAiJCEgJD8iOyAjIGV4ZWMoKSBjYW4gZmFpbCB0aGUgZXhlY3V0YWJsZSBjYW4ndCBiZSBmb3VuZAorICAgIH0KKyAgICByZXR1cm4gd2FudGFycmF5ID8gQG91dHB1dCA6IGpvaW4oJycsQG91dHB1dCk7Cit9CisKKworMTsKZGlmZiAtLWdpdCBhL2dpdC1mZXRjaC5zaCBiL2dpdC1mZXRjaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMmVlYmVlCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LWZldGNoLnNoCkBAIC0wLDAgKzEsNDQ4IEBACisjIS9iaW4vc2gKKyMKKworVVNBR0U9JzxmZXRjaC1vcHRpb25zPiA8cmVwb3NpdG9yeT4gPHJlZnNwZWM+Li4uJworLiBnaXQtc2gtc2V0dXAKKy4gZ2l0LXBhcnNlLXJlbW90ZQorX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCisKK0xGPScKKycKK0lGUz0iJExGIgorCitybG9nYT1mZXRjaAorbm9fdGFncz0KK3RhZ3M9CithcHBlbmQ9Citmb3JjZT0KK3ZlcmJvc2U9Cit1cGRhdGVfaGVhZF9vaz0KK2V4ZWM9Cit1cGxvYWRfcGFjaz0KK2tlZXA9LS10aGluCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktYXwtLWF8LS1hcHwtLWFwcHwtLWFwcGV8LS1hcHBlbnwtLWFwcGVuZCkKKwkJYXBwZW5kPXQKKwkJOzsKKwktLXVwbHwtLXVwbG98LS11cGxvYXwtLXVwbG9hZHwtLXVwbG9hZC18LS11cGxvYWQtcHxcCisJLS11cGxvYWQtcGF8LS11cGxvYWQtcGFjfC0tdXBsb2FkLXBhY2spCisJCXNoaWZ0CisJCWV4ZWM9Ii0tZXhlYz0kMSIgCisJCXVwbG9hZF9wYWNrPSItdSAkMSIKKwkJOzsKKwktZnwtLWZ8LS1mb3wtLWZvcnwtLWZvcmN8LS1mb3JjZSkKKwkJZm9yY2U9dAorCQk7OworCS10fC0tdHwtLXRhfC0tdGFnfC0tdGFncykKKwkJdGFncz10CisJCTs7CisJLW58LS1ufC0tbm98LS1uby18LS1uby10fC0tbm8tdGF8LS1uby10YWd8LS1uby10YWdzKQorCQlub190YWdzPXQKKwkJOzsKKwktdXwtLXV8LS11cHwtLXVwZHwtLXVwZGF8LS11cGRhdHwtLXVwZGF0ZXwtLXVwZGF0ZS18LS11cGRhdGUtaHxcCisJLS11cGRhdGUtaGV8LS11cGRhdGUtaGVhfC0tdXBkYXRlLWhlYWR8LS11cGRhdGUtaGVhZC18XAorCS0tdXBkYXRlLWhlYWQtb3wtLXVwZGF0ZS1oZWFkLW9rKQorCQl1cGRhdGVfaGVhZF9vaz10CisJCTs7CisJLXZ8LS12ZXJib3NlKQorCQl2ZXJib3NlPVllcworCQk7OworCS1rfC0ta3wtLWtlfC0ta2VlfC0ta2VlcCkKKwkJa2VlcD0tLWtlZXAKKwkJOzsKKwktLXJlZmxvZy1hY3Rpb249KikKKwkJcmxvZ2E9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYAorCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK2Nhc2UgIiQjIiBpbgorMCkKKwl0ZXN0IC1mICIkR0lUX0RJUi9icmFuY2hlcy9vcmlnaW4iIHx8CisJCXRlc3QgLWYgIiRHSVRfRElSL3JlbW90ZXMvb3JpZ2luIiB8fAorCQkJZ2l0LXJlcG8tY29uZmlnIC0tZ2V0IHJlbW90ZS5vcmlnaW4udXJsID4vZGV2L251bGwgfHwKKwkJCQlkaWUgIldoZXJlIGRvIHlvdSB3YW50IHRvIGZldGNoIGZyb20gdG9kYXk/IgorCXNldCBvcmlnaW4gOzsKK2VzYWMKKworcmVtb3RlX25pY2s9IiQxIgorcmVtb3RlPSQoZ2V0X3JlbW90ZV91cmwgIiRAIikKK3JlZnM9CitycmVmPQorcnN5bmNfc2x1cnBlZF9vYmplY3RzPQorCitybG9nYT0iJHJsb2dhICRyZW1vdGVfbmljayIKK3Rlc3QgIiRyZW1vdGVfbmljayIgPSAiJHJlbW90ZSIgfHwgcmxvZ2E9IiRybG9nYSAkcmVtb3RlIgorCitpZiB0ZXN0ICIiID0gIiRhcHBlbmQiCit0aGVuCisJOiA+IiRHSVRfRElSL0ZFVENIX0hFQUQiCitmaQorCithcHBlbmRfZmV0Y2hfaGVhZCAoKSB7CisgICAgaGVhZF89IiQxIgorICAgIHJlbW90ZV89IiQyIgorICAgIHJlbW90ZV9uYW1lXz0iJDMiCisgICAgcmVtb3RlX25pY2tfPSIkNCIKKyAgICBsb2NhbF9uYW1lXz0iJDUiCisgICAgY2FzZSAiJDYiIGluCisgICAgdCkgbm90X2Zvcl9tZXJnZV89J25vdC1mb3ItbWVyZ2UnIDs7CisgICAgJycpIG5vdF9mb3JfbWVyZ2VfPSA7OworICAgIGVzYWMKKworICAgICMgcmVtb3RlLW5pY2sgaXMgdGhlIFVSTCBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIChvciBhIHNob3J0aGFuZCkKKyAgICAjIHJlbW90ZS1uYW1lIGlzIHRoZSAkR0lUX0RJUiByZWxhdGl2ZSByZWZzLyBwYXRoIHdlIGNvbXB1dGVkCisgICAgIyBmb3IgdGhpcyByZWZzcGVjLgorCisgICAgIyB0aGUgJG5vdGVfIHZhcmlhYmxlIHdpbGwgYmUgZmVkIHRvIGdpdC1mbXQtbWVyZ2UtbXNnIGZvciBmdXJ0aGVyCisgICAgIyBwcm9jZXNzaW5nLgorICAgIGNhc2UgIiRyZW1vdGVfbmFtZV8iIGluCisgICAgSEVBRCkKKwlub3RlXz0gOzsKKyAgICByZWZzL2hlYWRzLyopCisJbm90ZV89IiQoZXhwciAiJHJlbW90ZV9uYW1lXyIgOiAncmVmcy9oZWFkcy9cKC4qXCknKSIKKwlub3RlXz0iYnJhbmNoICckbm90ZV8nIG9mICIgOzsKKyAgICByZWZzL3RhZ3MvKikKKwlub3RlXz0iJChleHByICIkcmVtb3RlX25hbWVfIiA6ICdyZWZzL3RhZ3MvXCguKlwpJykiCisJbm90ZV89InRhZyAnJG5vdGVfJyBvZiAiIDs7CisgICAgcmVmcy9yZW1vdGVzLyopCisJbm90ZV89IiQoZXhwciAiJHJlbW90ZV9uYW1lXyIgOiAncmVmcy9yZW1vdGVzL1woLipcKScpIgorCW5vdGVfPSJyZW1vdGUgYnJhbmNoICckbm90ZV8nIG9mICIgOzsKKyAgICAqKQorCW5vdGVfPSIkcmVtb3RlX25hbWUgb2YgIiA7OworICAgIGVzYWMKKyAgICByZW1vdGVfMV89JChleHByICJ6JHJlbW90ZV8iIDogJ3pcKC4qXClcLmdpdC8qJCcpICYmCisJcmVtb3RlXz0iJHJlbW90ZV8xXyIKKyAgICBub3RlXz0iJG5vdGVfJHJlbW90ZV8iCisKKyAgICAjIDIuNi4xMS10cmVlIHRhZyB3b3VsZCBub3QgYmUgaGFwcHkgdG8gYmUgZmVkIHRvIHJlc29sdmUuCisgICAgaWYgZ2l0LWNhdC1maWxlIGNvbW1pdCAiJGhlYWRfIiA+L2Rldi9udWxsIDI+JjEKKyAgICB0aGVuCisJaGVhZGNfPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJGhlYWRfXjAiKSB8fCBleGl0CisJZWNobyAiJGhlYWRjXwkkbm90X2Zvcl9tZXJnZV8JJG5vdGVfIiA+PiIkR0lUX0RJUi9GRVRDSF9IRUFEIgorCVsgIiR2ZXJib3NlIiBdICYmIGVjaG8gPiYyICIqIGNvbW1pdHRpc2g6ICRoZWFkXyIKKwlbICIkdmVyYm9zZSIgXSAmJiBlY2hvID4mMiAiICAkbm90ZV8iCisgICAgZWxzZQorCWVjaG8gIiRoZWFkXwlub3QtZm9yLW1lcmdlCSRub3RlXyIgPj4iJEdJVF9ESVIvRkVUQ0hfSEVBRCIKKwlbICIkdmVyYm9zZSIgXSAmJiBlY2hvID4mMiAiKiBub24tY29tbWl0OiAkaGVhZF8iCisJWyAiJHZlcmJvc2UiIF0gJiYgZWNobyA+JjIgIiAgJG5vdGVfIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGxvY2FsX25hbWVfIiAhPSAiIgorICAgIHRoZW4KKwkjIFdlIGFyZSBzdG9yaW5nIHRoZSBoZWFkIGxvY2FsbHkuICBNYWtlIHN1cmUgdGhhdCBpdCBpcworCSMgYSBmYXN0IGZvcndhcmQgKGFrYSAicmV2ZXJzZSBwdXNoIikuCisJZmFzdF9mb3J3YXJkX2xvY2FsICIkbG9jYWxfbmFtZV8iICIkaGVhZF8iICIkbm90ZV8iCisgICAgZmkKK30KKworZmFzdF9mb3J3YXJkX2xvY2FsICgpIHsKKyAgICBta2RpciAtcCAiJChkaXJuYW1lICIkR0lUX0RJUi8kMSIpIgorICAgIGNhc2UgIiQxIiBpbgorICAgIHJlZnMvdGFncy8qKQorCSMgVGFncyBuZWVkIG5vdCBiZSBwb2ludGluZyBhdCBjb21taXRzIHNvIHRoZXJlCisJIyBpcyBubyB3YXkgdG8gZ3VhcmFudGVlICJmYXN0LWZvcndhcmQiIGFueXdheS4KKwlpZiB0ZXN0IC1mICIkR0lUX0RJUi8kMSIKKwl0aGVuCisJCWlmIG5vd189JChjYXQgIiRHSVRfRElSLyQxIikgJiYgdGVzdCAiJG5vd18iID0gIiQyIgorCQl0aGVuCisJCQlbICIkdmVyYm9zZSIgXSAmJiBlY2hvID4mMiAiKiAkMTogc2FtZSBhcyAkMyIgfHw6CisJCWVsc2UKKwkJCWVjaG8gPiYyICIqICQxOiB1cGRhdGluZyB3aXRoICQzIgorCQkJZ2l0LXVwZGF0ZS1yZWYgLW0gIiRybG9nYTogdXBkYXRpbmcgdGFnIiAiJDEiICIkMiIKKwkJZmkKKwllbHNlCisJCWVjaG8gPiYyICIqICQxOiBzdG9yaW5nICQzIgorCQlnaXQtdXBkYXRlLXJlZiAtbSAiJHJsb2dhOiBzdG9yaW5nIHRhZyIgIiQxIiAiJDIiCisJZmkKKwk7OworCisgICAgcmVmcy9oZWFkcy8qIHwgcmVmcy9yZW1vdGVzLyopCisJIyAkMSBpcyB0aGUgcmVmIGJlaW5nIHVwZGF0ZWQuCisJIyAkMiBpcyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcmVmLgorCWxvY2FsPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDFeMCIgMj4vZGV2L251bGwpCisJaWYgdGVzdCAiJGxvY2FsIgorCXRoZW4KKwkgICAgIyBSZXF1aXJlIGZhc3QtZm9yd2FyZC4KKwkgICAgbWI9JChnaXQtbWVyZ2UtYmFzZSAiJGxvY2FsIiAiJDIiKSAmJgorCSAgICBjYXNlICIkMiwkbWIiIGluCisJICAgICRsb2NhbCwqKQorCSAgICAgICAgaWYgdGVzdCAtbiAiJHZlcmJvc2UiCisJCXRoZW4KKwkJCWVjaG8gPiYyICIqICQxOiBzYW1lIGFzICQzIgorCQlmaQorCQk7OworCSAgICAqLCRsb2NhbCkKKwkJZWNobyA+JjIgIiogJDE6IGZhc3QgZm9yd2FyZCB0byAkMyIKKwkJZWNobyA+JjIgIiAgZnJvbSAkbG9jYWwgdG8gJDIiCisJCWdpdC11cGRhdGUtcmVmIC1tICIkcmxvZ2E6IGZhc3QtZm9yd2FyZCIgIiQxIiAiJDIiICIkbG9jYWwiCisJCTs7CisJICAgICopCisJCWZhbHNlCisJCTs7CisJICAgIGVzYWMgfHwgeworCQllY2hvID4mMiAiKiAkMTogZG9lcyBub3QgZmFzdCBmb3J3YXJkIHRvICQzOyIKKwkJY2FzZSAiLCRmb3JjZSwkc2luZ2xlX2ZvcmNlLCIgaW4KKwkJKix0LCopCisJCQllY2hvID4mMiAiICBmb3JjaW5nIHVwZGF0ZS4iCisJCQlnaXQtdXBkYXRlLXJlZiAtbSAiJHJsb2dhOiBmb3JjZWQtdXBkYXRlIiAiJDEiICIkMiIgIiRsb2NhbCIKKwkJCTs7CisJCSopCisJCQllY2hvID4mMiAiICBub3QgdXBkYXRpbmcuIgorCQkJZXhpdCAxCisJCQk7OworCQllc2FjCisJICAgIH0KKwllbHNlCisJICAgIGVjaG8gPiYyICIqICQxOiBzdG9yaW5nICQzIgorCSAgICBnaXQtdXBkYXRlLXJlZiAtbSAiJHJsb2dhOiBzdG9yaW5nIGhlYWQiICIkMSIgIiQyIgorCWZpCisJOzsKKyAgICBlc2FjCit9CisKK2Nhc2UgIiR1cGRhdGVfaGVhZF9vayIgaW4KKycnKQorCW9yaWdfaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCAyPi9kZXYvbnVsbCkKKwk7OworZXNhYworCisjIElmIC0tdGFncyAoYW5kIGxhdGVyIC0taGVhZHMgb3IgLS1hbGwpIGlzIHNwZWNpZmllZCwgdGhlbiB3ZSBhcmUKKyMgbm90IHRhbGtpbmcgYWJvdXQgZGVmYXVsdHMgc3RvcmVkIGluIFB1bGw6IGxpbmUgb2YgcmVtb3RlcyBvcgorIyBicmFuY2hlcyBmaWxlLCBhbmQganVzdCBmZXRjaCB0aG9zZSBhbmQgcmVmc3BlY3MgZXhwbGljaXRseSBnaXZlbi4KKyMgT3RoZXJ3aXNlIHdlIGRvIHdoYXQgd2UgYWx3YXlzIGRpZC4KKworcmVmbGlzdD0kKGdldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2ggIiRAIikKK2lmIHRlc3QgIiR0YWdzIgordGhlbgorCXRhZ2xpc3Q9YElGUz0iCSIgJiYKKwkJICAoCisJCQlnaXQtbHMtcmVtb3RlICR1cGxvYWRfcGFjayAtLXRhZ3MgIiRyZW1vdGUiIHx8CisJCQllY2hvIGZhaWwgb3VjaAorCQkgICkgfAorCSAgICAgICAgICB3aGlsZSByZWFkIHNoYTEgbmFtZQorCQkgIGRvCisJCQljYXNlICIkc2hhMSIgaW4KKwkJCWZhaWwpCisJCQkJZXhpdCAxCisJCQllc2FjCisJCQljYXNlICIkbmFtZSIgaW4KKwkJCSpeKikgY29udGludWUgOzsKKwkJCWVzYWMKKwkJICAJaWYgZ2l0LWNoZWNrLXJlZi1mb3JtYXQgIiRuYW1lIgorCQkJdGhlbgorCQkJICAgIGVjaG8gIi4ke25hbWV9OiR7bmFtZX0iCisJCQllbHNlCisJCQkgICAgZWNobyA+JjIgIndhcm5pbmc6IHRhZyAke25hbWV9IGlnbm9yZWQiCisJCQlmaQorCQkgIGRvbmVgIHx8IGV4aXQKKwlpZiB0ZXN0ICIkIyIgLWd0IDEKKwl0aGVuCisJCSMgcmVtb3RlIFVSTCBwbHVzIGV4cGxpY2l0IHJlZnNwZWNzOyB3ZSBuZWVkIHRvIG1lcmdlIHRoZW0uCisJCXJlZmxpc3Q9IiRyZWZsaXN0JExGJHRhZ2xpc3QiCisJZWxzZQorCQkjIE5vIGV4cGxpY2l0IHJlZnNwZWNzOyBmZXRjaCB0YWdzIG9ubHkuCisJCXJlZmxpc3Q9JHRhZ2xpc3QKKwlmaQorZmkKKworZmV0Y2hfbWFpbiAoKSB7CisgIHJlZmxpc3Q9IiQxIgorICByZWZzPQorCisgIGZvciByZWYgaW4gJHJlZmxpc3QKKyAgZG8KKyAgICAgIHJlZnM9IiRyZWZzJExGJHJlZiIKKworICAgICAgIyBUaGVzZSBhcmUgcmVsYXRpdmUgcGF0aCBmcm9tICRHSVRfRElSLCB0eXBpY2FsbHkgc3RhcnRpbmcgYXQgcmVmcy8KKyAgICAgICMgYnV0IG1heSBiZSBIRUFECisgICAgICBpZiBleHByICJ6JHJlZiIgOiAnelwuJyA+L2Rldi9udWxsCisgICAgICB0aGVuCisJICBub3RfZm9yX21lcmdlPXQKKwkgIHJlZj0kKGV4cHIgInokcmVmIiA6ICd6XC5cKC4qXCknKQorICAgICAgZWxzZQorCSAgbm90X2Zvcl9tZXJnZT0KKyAgICAgIGZpCisgICAgICBpZiBleHByICJ6JHJlZiIgOiAneisnID4vZGV2L251bGwKKyAgICAgIHRoZW4KKwkgIHNpbmdsZV9mb3JjZT10CisJICByZWY9JChleHByICJ6JHJlZiIgOiAneitcKC4qXCknKQorICAgICAgZWxzZQorCSAgc2luZ2xlX2ZvcmNlPQorICAgICAgZmkKKyAgICAgIHJlbW90ZV9uYW1lPSQoZXhwciAieiRyZWYiIDogJ3pcKFteOl0qXCk6JykKKyAgICAgIGxvY2FsX25hbWU9JChleHByICJ6JHJlZiIgOiAnelteOl0qOlwoLipcKScpCisKKyAgICAgIHJyZWY9IiRycmVmJExGJHJlbW90ZV9uYW1lIgorCisgICAgICAjIFRoZXJlIGFyZSB0cmFuc3BvcnRzIHRoYXQgY2FuIGZldGNoIG9ubHkgb25lIGhlYWQgYXQgYSB0aW1lLi4uCisgICAgICBjYXNlICIkcmVtb3RlIiBpbgorICAgICAgaHR0cDovLyogfCBodHRwczovLyopCisJICBpZiBbIC1uICIkR0lUX1NTTF9OT19WRVJJRlkiIF07IHRoZW4KKwkgICAgICBjdXJsX2V4dHJhX2FyZ3M9Ii1rIgorCSAgZmkKKwkgIG1heF9kZXB0aD01CisJICBkZXB0aD0wCisJICBoZWFkPSJyZWY6ICRyZW1vdGVfbmFtZSIKKwkgIHdoaWxlIChleHByICJ6JGhlYWQiIDogInpyZWY6IiAmJiBleHByICRkZXB0aCBcPCAkbWF4X2RlcHRoKSA+L2Rldi9udWxsCisJICBkbworCSAgICByZW1vdGVfbmFtZV9xdW90ZWQ9JChAQFBFUkxAQCAtZSAnCisJICAgICAgbXkgJHUgPSAkQVJHVlswXTsKKyAgICAgICAgICAgICAgJHUgPX4gcy9ecmVmOlxzKi8vOworCSAgICAgICR1ID1+IHN7KFteLWEtekEtWjAtOS8uXSl9e3NwcmludGYiJSUlMDJ4IixvcmQoJDEpfWVnOworCSAgICAgIHByaW50ICIkdSI7CisJICAnICIkaGVhZCIpCisJICAgIGhlYWQ9JChjdXJsIC1uc2ZMICRjdXJsX2V4dHJhX2FyZ3MgIiRyZW1vdGUvJHJlbW90ZV9uYW1lX3F1b3RlZCIpCisJICAgIGRlcHRoPSQoIGV4cHIgXCggJGRlcHRoICsgMSBcKSApCisJICBkb25lCisJICBleHByICJ6JGhlYWQiIDogInokX3g0MFwkIiA+L2Rldi9udWxsIHx8CisJICAgICAgZGllICJGYWlsZWQgdG8gZmV0Y2ggJHJlbW90ZV9uYW1lIGZyb20gJHJlbW90ZSIKKwkgIGVjaG8gPiYyIEZldGNoaW5nICIkcmVtb3RlX25hbWUgZnJvbSAkcmVtb3RlIiB1c2luZyBodHRwCisJICBnaXQtaHR0cC1mZXRjaCAtdiAtYSAiJGhlYWQiICIkcmVtb3RlLyIgfHwgZXhpdAorCSAgOzsKKyAgICAgIHJzeW5jOi8vKikKKwkgIFRNUF9IRUFEPSIkR0lUX0RJUi9UTVBfSEVBRCIKKwkgIHJzeW5jIC1MIC1xICIkcmVtb3RlLyRyZW1vdGVfbmFtZSIgIiRUTVBfSEVBRCIgfHwgZXhpdCAxCisJICBoZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBUTVBfSEVBRCkKKwkgIHJtIC1mICIkVE1QX0hFQUQiCisJICB0ZXN0ICIkcnN5bmNfc2x1cnBlZF9vYmplY3RzIiB8fCB7CisJICAgICAgcnN5bmMgLWF2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAiJHJlbW90ZS9vYmplY3RzLyIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWS8iIHx8IGV4aXQKKworCSAgICAgICMgTG9vayBhdCBvYmplY3RzL2luZm8vYWx0ZXJuYXRlcyBmb3IgcnN5bmMgLS0gaHR0cCB3aWxsCisJICAgICAgIyBzdXBwb3J0IGl0IG5hdGl2ZWx5IGFuZCBnaXQgbmF0aXZlIG9uZXMgd2lsbCBkbyBpdCBvbgorCSAgICAgICMgdGhlIHJlbW90ZSBlbmQuICBOb3QgaGF2aW5nIHRoYXQgZmlsZSBpcyBub3QgYSBjcmltZS4KKwkgICAgICByc3luYyAtcSAiJHJlbW90ZS9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIgXAorCQkgICIkR0lUX0RJUi9UTVBfQUxUIiAyPi9kZXYvbnVsbCB8fAorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGlmIHRlc3QgLWYgIiRHSVRfRElSL1RNUF9BTFQiCisJICAgICAgdGhlbgorCQkgIHJlc29sdmVfYWx0ZXJuYXRlcyAiJHJlbW90ZSIgPCIkR0lUX0RJUi9UTVBfQUxUIiB8CisJCSAgd2hpbGUgcmVhZCBhbHQKKwkJICBkbworCQkgICAgICBjYXNlICIkYWx0IiBpbiAnYmFkIGFsdGVybmF0ZTogJyopIGRpZSAiJGFsdCI7OyBlc2FjCisJCSAgICAgIGVjaG8gPiYyICJHZXR0aW5nIGFsdGVybmF0ZTogJGFsdCIKKwkJICAgICAgcnN5bmMgLWF2IC0taWdub3JlLWV4aXN0aW5nIC0tZXhjbHVkZSBpbmZvIFwKKwkJICAgICAgIiRhbHQiICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkvIiB8fCBleGl0CisJCSAgZG9uZQorCQkgIHJtIC1mICIkR0lUX0RJUi9UTVBfQUxUIgorCSAgICAgIGZpCisJICAgICAgcnN5bmNfc2x1cnBlZF9vYmplY3RzPXQKKwkgIH0KKwkgIDs7CisgICAgICAqKQorCSAgIyBXZSB3aWxsIGRvIGdpdCBuYXRpdmUgdHJhbnNwb3J0IHdpdGgganVzdCBvbmUgY2FsbCBsYXRlci4KKwkgIGNvbnRpbnVlIDs7CisgICAgICBlc2FjCisKKyAgICAgIGFwcGVuZF9mZXRjaF9oZWFkICIkaGVhZCIgIiRyZW1vdGUiIFwKKwkgICIkcmVtb3RlX25hbWUiICIkcmVtb3RlX25pY2siICIkbG9jYWxfbmFtZSIgIiRub3RfZm9yX21lcmdlIgorCisgIGRvbmUKKworICBjYXNlICIkcmVtb3RlIiBpbgorICBodHRwOi8vKiB8IGh0dHBzOi8vKiB8IHJzeW5jOi8vKiApCisgICAgICA7OyAjIHdlIGFyZSBhbHJlYWR5IGRvbmUuCisgICopCisgICAgKCA6IHN1YnNoZWxsIGJlY2F1c2Ugd2UgbXVjayB3aXRoIElGUworICAgICAgSUZTPSIgCSRMRiIKKyAgICAgICgKKwkgIGdpdC1mZXRjaC1wYWNrICRleGVjICRrZWVwICIkcmVtb3RlIiAkcnJlZiB8fCBlY2hvIGZhaWxlZCAiJHJlbW90ZSIKKyAgICAgICkgfAorICAgICAgd2hpbGUgcmVhZCBzaGExIHJlbW90ZV9uYW1lCisgICAgICBkbworCSAgY2FzZSAiJHNoYTEiIGluCisJICBmYWlsZWQpCisJCSAgZWNobyA+JjIgIkZldGNoIGZhaWx1cmU6ICRyZW1vdGUiCisJCSAgZXhpdCAxIDs7CisJICBlc2FjCisJICBmb3VuZD0KKwkgIHNpbmdsZV9mb3JjZT0KKwkgIGZvciByZWYgaW4gJHJlZnMKKwkgIGRvCisJICAgICAgY2FzZSAiJHJlZiIgaW4KKwkgICAgICArJHJlbW90ZV9uYW1lOiopCisJCSAgc2luZ2xlX2ZvcmNlPXQKKwkJICBub3RfZm9yX21lcmdlPQorCQkgIGZvdW5kPSIkcmVmIgorCQkgIGJyZWFrIDs7CisJICAgICAgLiskcmVtb3RlX25hbWU6KikKKwkJICBzaW5nbGVfZm9yY2U9dAorCQkgIG5vdF9mb3JfbWVyZ2U9dAorCQkgIGZvdW5kPSIkcmVmIgorCQkgIGJyZWFrIDs7CisJICAgICAgLiRyZW1vdGVfbmFtZToqKQorCQkgIG5vdF9mb3JfbWVyZ2U9dAorCQkgIGZvdW5kPSIkcmVmIgorCQkgIGJyZWFrIDs7CisJICAgICAgJHJlbW90ZV9uYW1lOiopCisJCSAgbm90X2Zvcl9tZXJnZT0KKwkJICBmb3VuZD0iJHJlZiIKKwkJICBicmVhayA7OworCSAgICAgIGVzYWMKKwkgIGRvbmUKKwkgIGxvY2FsX25hbWU9JChleHByICJ6JGZvdW5kIiA6ICd6W146XSo6XCguKlwpJykKKwkgIGFwcGVuZF9mZXRjaF9oZWFkICIkc2hhMSIgIiRyZW1vdGUiIFwKKwkJICAiJHJlbW90ZV9uYW1lIiAiJHJlbW90ZV9uaWNrIiAiJGxvY2FsX25hbWUiICIkbm90X2Zvcl9tZXJnZSIKKyAgICAgIGRvbmUKKyAgICApIHx8IGV4aXQgOzsKKyAgZXNhYworCit9CisKK2ZldGNoX21haW4gIiRyZWZsaXN0IgorCisjIGF1dG9tYXRlZCB0YWcgZm9sbG93aW5nCitjYXNlICIkbm9fdGFncyR0YWdzIiBpbgorJycpCisJY2FzZSAiJHJlZmxpc3QiIGluCisJKjpyZWZzLyopCisJCSMgZWZmZWN0aXZlIG9ubHkgd2hlbiB3ZSBhcmUgZm9sbG93aW5nIHJlbW90ZSBicmFuY2gKKwkJIyB1c2luZyBsb2NhbCB0cmFja2luZyBicmFuY2guCisJCXRhZ2xpc3Q9JChJRlM9IiAiICYmCisJCWdpdC1scy1yZW1vdGUgJHVwbG9hZF9wYWNrIC0tdGFncyAiJHJlbW90ZSIgfAorCQlzZWQgLW5lICdzfF5cKFswLTlhLWZdKlwpWyAJXVwocmVmcy90YWdzLy4qXClee30kfFwxIFwyfHAnIHwKKwkJd2hpbGUgcmVhZCBzaGExIG5hbWUKKwkJZG8KKwkJCXRlc3QgLWYgIiRHSVRfRElSLyRuYW1lIiAmJiBjb250aW51ZQorCQkJZ2l0LWNoZWNrLXJlZi1mb3JtYXQgIiRuYW1lIiB8fCB7CisJCQkJZWNobyA+JjIgIndhcm5pbmc6IHRhZyAke25hbWV9IGlnbm9yZWQiCisJCQkJY29udGludWUKKwkJCX0KKwkJCWdpdC1jYXQtZmlsZSAtdCAiJHNoYTEiID4vZGV2L251bGwgMj4mMSB8fCBjb250aW51ZQorCQkJZWNobyA+JjIgIkF1dG8tZm9sbG93aW5nICRuYW1lIgorCQkJZWNobyAiLiR7bmFtZX06JHtuYW1lfSIKKwkJZG9uZSkKKwllc2FjCisJY2FzZSAiJHRhZ2xpc3QiIGluCisJJycpIDs7CisJPyopCisJCWZldGNoX21haW4gIiR0YWdsaXN0IiA7OworCWVzYWMKK2VzYWMKKworIyBJZiB0aGUgb3JpZ2luYWwgaGVhZCB3YXMgZW1wdHkgKGkuZS4gbm8gIm1hc3RlciIgeWV0KSwgb3IKKyMgaWYgd2Ugd2VyZSB0b2xkIG5vdCB0byB3b3JyeSwgd2UgZG8gbm90IGhhdmUgdG8gY2hlY2suCitjYXNlICIsJHVwZGF0ZV9oZWFkX29rLCRvcmlnX2hlYWQsIiBpbgorKiwsIHwgdCwqICkKKwk7OworKikKKwljdXJyX2hlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGwpCisJaWYgdGVzdCAiJGN1cnJfaGVhZCIgIT0gIiRvcmlnX2hlYWQiCisJdGhlbgorCSAgICBnaXQtdXBkYXRlLXJlZiBcCisJCQktbSAiJHJsb2dhOiBVbmRvaW5nIGluY29ycmVjdGx5IGZldGNoZWQgSEVBRC4iIFwKKwkJCUhFQUQgIiRvcmlnX2hlYWQiCisJCWRpZSAiQ2Fubm90IGZldGNoIGludG8gdGhlIGN1cnJlbnQgYnJhbmNoLiIKKwlmaQorCTs7Citlc2FjCmRpZmYgLS1naXQgYS9naXQtaW5zdGF3ZWIuc2ggYi9naXQtaW5zdGF3ZWIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTZjZDM1MQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1pbnN0YXdlYi5zaApAQCAtMCwwICsxLDI0MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKK1VTQUdFPSdbLS1zdGFydF0gWy0tc3RvcF0gWy0tcmVzdGFydF0KKyAgWy0tbG9jYWxdIFstLWh0dHBkPTxodHRwZD5dIFstLXBvcnQ9PHBvcnQ+XSBbLS1icm93c2VyPTxicm93c2VyPl0KKyAgWy0tbW9kdWxlLXBhdGg9PHBhdGg+IChmb3IgQXBhY2hlMiBvbmx5KV0nCisKKy4gZ2l0LXNoLXNldHVwCisKK2Nhc2UgIiRHSVRfRElSIiBpbgorLyopCisJZnFnaXRkaXI9IiRHSVRfRElSIiA7OworKikKKwlmcWdpdGRpcj0iJFBXRC8kR0lUX0RJUiIgOzsKK2VzYWMKKworbG9jYWw9ImBnaXQgcmVwby1jb25maWcgLS1ib29sIC0tZ2V0IGluc3Rhd2ViLmxvY2FsYCIKK2h0dHBkPSJgZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGluc3Rhd2ViLmh0dHBkYCIKK2Jyb3dzZXI9ImBnaXQgcmVwby1jb25maWcgLS1nZXQgaW5zdGF3ZWIuYnJvd3NlcmAiCitwb3J0PWBnaXQgcmVwby1jb25maWcgLS1nZXQgaW5zdGF3ZWIucG9ydGAKK21vZHVsZV9wYXRoPSJgZ2l0IHJlcG8tY29uZmlnIC0tZ2V0IGluc3Rhd2ViLm1vZHVsZXBhdGhgIgorCitjb25mPSRHSVRfRElSL2dpdHdlYi9odHRwZC5jb25mCisKKyMgRGVmYXVsdHM6CisKKyMgaWYgaW5zdGFsbGVkLCBpdCBkb2Vzbid0IG5lZWQgZnVydGhlciBjb25maWd1cmF0aW9uIChtb2R1bGVfcGF0aCkKK3Rlc3QgLXogIiRodHRwZCIgJiYgaHR0cGQ9J2xpZ2h0dHBkIC1mJworCisjIHByb2JhYmx5IHRoZSBtb3N0IHBvcHVsYXIgYnJvd3NlciBhbW9uZyBnaXR3ZWIgdXNlcnMKK3Rlc3QgLXogIiRicm93c2VyIiAmJiBicm93c2VyPSdmaXJlZm94JworCisjIGFueSB1bnRha2VuIGxvY2FsIHBvcnQgd2lsbCBkby4uLgordGVzdCAteiAiJHBvcnQiICYmIHBvcnQ9MTIzNAorCitzdGFydF9odHRwZCAoKSB7CisJaHR0cGRfb25seT0iYGVjaG8gJGh0dHBkIHwgY3V0IC1mMSAtZCcgJ2AiCisJaWYgdGVzdCAiYGV4cHIgaW5kZXggJGh0dHBkX29ubHkgL2AiIC1lcSAnMScgfHwgXAorCQkJCXdoaWNoICRodHRwZF9vbmx5ID4vZGV2L251bGwKKwl0aGVuCisJCSRodHRwZCAkZnFnaXRkaXIvZ2l0d2ViL2h0dHBkLmNvbmYKKwllbHNlCisJCSMgbWFueSBodHRwZHMgYXJlIGluc3RhbGxlZCBpbiAvdXNyL3NiaW4gb3IgL3Vzci9sb2NhbC9zYmluCisJCSMgdGhlc2UgZGF5cyBhbmQgdGhvc2UgYXJlIG5vdCBpbiBtb3N0IHVzZXJzICRQQVRIcworCQlmb3IgaSBpbiAvdXNyL2xvY2FsL3NiaW4gL3Vzci9zYmluCisJCWRvCisJCQlpZiB0ZXN0IC14ICIkaS8kaHR0cGRfb25seSIKKwkJCXRoZW4KKwkJCQkjIGRvbid0IHF1b3RlICRodHRwZCwgdGhlcmUgY2FuIGJlCisJCQkJIyBhcmd1bWVudHMgdG8gaXQgKC1mKQorCQkJCSRpLyRodHRwZCAiJGZxZ2l0ZGlyL2dpdHdlYi9odHRwZC5jb25mIgorCQkJCXJldHVybgorCQkJZmkKKwkJZG9uZQorCWZpCisJaWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJCWVjaG8gIkNvdWxkIG5vdCBleGVjdXRlIGh0dHAgZGFlbW9uICRodHRwZC4iCisJCWV4aXQgMQorCWZpCit9CisKK3N0b3BfaHR0cGQgKCkgeworCXRlc3QgLWYgIiRmcWdpdGRpci9waWQiICYmIGtpbGwgYGNhdCAiJGZxZ2l0ZGlyL3BpZCJgCit9CisKK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS0tc3RvcHxzdG9wKQorCQlzdG9wX2h0dHBkCisJCWV4aXQgMAorCQk7OworCS0tc3RhcnR8c3RhcnQpCisJCXN0YXJ0X2h0dHBkCisJCWV4aXQgMAorCQk7OworCS0tcmVzdGFydHxyZXN0YXJ0KQorCQlzdG9wX2h0dHBkCisJCXN0YXJ0X2h0dHBkCisJCWV4aXQgMAorCQk7OworCS0tbG9jYWx8LWwpCisJCWxvY2FsPXRydWUKKwkJOzsKKwktZHwtLWh0dHBkfC0taHR0cGQ9KikKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJaHR0cGQ9YGV4cHIgIiQxIiA6ICctW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCWh0dHBkPSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJOzsKKwktYnwtLWJyb3dzZXJ8LS1icm93c2VyPSopCisJCWNhc2UgIiQjLCQxIiBpbgorCQkqLCo9KikKKwkJCWJyb3dzZXI9YGV4cHIgIiQxIiA6ICctW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCWJyb3dzZXI9IiQyIgorCQkJc2hpZnQgOzsKKwkJZXNhYworCQk7OworCS1wfC0tcG9ydHwtLXBvcnQ9KikKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJcG9ydD1gZXhwciAiJDEiIDogJy1bXj1dKj1cKC4qXCknYCA7OworCQkxLCopCisJCQl1c2FnZSA7OworCQkqKQorCQkJcG9ydD0iJDIiCisJCQlzaGlmdCA7OworCQllc2FjCisJCTs7CisJLW18LS1tb2R1bGUtcGF0aD0qfC0tbW9kdWxlLXBhdGgpCisJCWNhc2UgIiQjLCQxIiBpbgorCQkqLCo9KikKKwkJCW1vZHVsZV9wYXRoPWBleHByICIkMSIgOiAnLVtePV0qPVwoLipcKSdgIDs7CisJCTEsKikKKwkJCXVzYWdlIDs7CisJCSopCisJCQltb2R1bGVfcGF0aD0iJDIiCisJCQlzaGlmdCA7OworCQllc2FjCisJCTs7CisJKikKKwkJdXNhZ2UKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworbWtkaXIgLXAgIiRHSVRfRElSL2dpdHdlYi90bXAiCitHSVRfRVhFQ19QQVRIPSJgZ2l0IC0tZXhlYy1wYXRoYCIKK0dJVF9ESVI9IiRmcWdpdGRpciIKK2V4cG9ydCBHSVRfRVhFQ19QQVRIIEdJVF9ESVIKKworCitsaWdodHRwZF9jb25mICgpIHsKKwljYXQgPiAiJGNvbmYiIDw8RU9GCitzZXJ2ZXIuZG9jdW1lbnQtcm9vdCA9ICIkZnFnaXRkaXIvZ2l0d2ViIgorc2VydmVyLnBvcnQgPSAkcG9ydAorc2VydmVyLm1vZHVsZXMgPSAoICJtb2RfY2dpIiApCitzZXJ2ZXIuaW5kZXhmaWxlcyA9ICggImdpdHdlYi5jZ2kiICkKK3NlcnZlci5waWQtZmlsZSA9ICIkZnFnaXRkaXIvcGlkIgorY2dpLmFzc2lnbiA9ICggIi5jZ2kiID0+ICIiICkKK21pbWV0eXBlLmFzc2lnbiA9ICggIi5jc3MiID0+ICJ0ZXh0L2NzcyIgKQorRU9GCisJdGVzdCAiJGxvY2FsIiA9IHRydWUgJiYgZWNobyAnc2VydmVyLmJpbmQgPSAiMTI3LjAuMC4xIicgPj4gIiRjb25mIgorfQorCithcGFjaGUyX2NvbmYgKCkgeworCXRlc3QgLXogIiRtb2R1bGVfcGF0aCIgJiYgbW9kdWxlX3BhdGg9L3Vzci9saWIvYXBhY2hlMi9tb2R1bGVzCisJbWtkaXIgLXAgIiRHSVRfRElSL2dpdHdlYi9sb2dzIgorCWJpbmQ9CisJdGVzdCAiJGxvY2FsIiA9IHRydWUgJiYgYmluZD0nMTI3LjAuMC4xOicKKwllY2hvICd0ZXh0L2NzcyBjc3MnID4gJGZxZ2l0ZGlyL21pbWUudHlwZXMKKwljYXQgPiAiJGNvbmYiIDw8RU9GCitTZXJ2ZXJSb290ICIkZnFnaXRkaXIvZ2l0d2ViIgorRG9jdW1lbnRSb290ICIkZnFnaXRkaXIvZ2l0d2ViIgorUGlkRmlsZSAiJGZxZ2l0ZGlyL3BpZCIKK0xpc3RlbiAkYmluZCRwb3J0CitUeXBlc0NvbmZpZyAkZnFnaXRkaXIvbWltZS50eXBlcworRGlyZWN0b3J5SW5kZXggZ2l0d2ViLmNnaQorRU9GCisKKwkjIGNoZWNrIHRvIHNlZSBpZiBEZW5uaXMgU3Rvc2JlcmcncyBtb2RfcGVybCBjb21wYXRpYmlsaXR5IHBhdGNoCisJIyAoPDIwMDYwNjIxMTMwNzA4LkdjYmM2ZTVjQGxlb25vdi5zdG9zYmVyZy5uZXQ+KSBoYXMgYmVlbiBhcHBsaWVkCisJaWYgdGVzdCAtZiAiJG1vZHVsZV9wYXRoL21vZF9wZXJsLnNvIiAmJiBncmVwICdeb3VyICRnaXRiaW4nIFwKKwkJCQkiJEdJVF9ESVIvZ2l0d2ViL2dpdHdlYi5jZ2kiID4vZGV2L251bGwKKwl0aGVuCisJCSMgZmF2b3IgbW9kX3BlcmwgaWYgYXZhaWxhYmxlCisJCWNhdCA+PiAiJGNvbmYiIDw8RU9GCitMb2FkTW9kdWxlIHBlcmxfbW9kdWxlICRtb2R1bGVfcGF0aC9tb2RfcGVybC5zbworUGVybFBhc3NFbnYgR0lUX0RJUgorUGVybFBhc3NFbnYgR0lUX0VYRUNfRElSCis8TG9jYXRpb24gL2dpdHdlYi5jZ2k+CisJU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorCVBlcmxSZXNwb25zZUhhbmRsZXIgTW9kUGVybDo6UmVnaXN0cnkKKwlQZXJsT3B0aW9ucyArUGFyc2VIZWFkZXJzCisJT3B0aW9ucyArRXhlY0NHSQorPC9Mb2NhdGlvbj4KK0VPRgorCWVsc2UKKwkJIyBwbGFpbi1vbGQgQ0dJCisJCWxpc3RfbW9kcz1gZWNobyAiJGh0dHBkIiB8IHNlZCAicy8tZiQvLWwvImAKKwkJJGxpc3RfbW9kcyB8IGdyZXAgJ21vZF9jZ2lcLmMnID4vZGV2L251bGwgMj4mMSB8fCBcCisJCWVjaG8gIkxvYWRNb2R1bGUgY2dpX21vZHVsZSAkbW9kdWxlX3BhdGgvbW9kX2NnaS5zbyIgPj4gIiRjb25mIgorCQljYXQgPj4gIiRjb25mIiA8PEVPRgorQWRkSGFuZGxlciBjZ2ktc2NyaXB0IC5jZ2kKKzxMb2NhdGlvbiAvZ2l0d2ViLmNnaT4KKwlPcHRpb25zICtFeGVjQ0dJCis8L0xvY2F0aW9uPgorRU9GCisJZmkKK30KKworc2NyaXB0PScKK3MjXlwobXlcfG91clwpICRwcm9qZWN0cm9vdCA9LiojXDEgJHByb2plY3Ryb290ID0gIidgZGlybmFtZSAkZnFnaXRkaXJgJyI7IworcyNcKG15XHxvdXJcKSAkZ2l0YmluID0uKiNcMSAkZ2l0YmluID0gIickR0lUX0VYRUNfUEFUSCciOyMKK3MjXChteVx8b3VyXCkgJHByb2plY3RzX2xpc3QgPS4qI1wxICRwcm9qZWN0c19saXN0ID0gJHByb2plY3Ryb290OyMKK3MjXChteVx8b3VyXCkgJGdpdF90ZW1wID0uKiNcMSAkZ2l0X3RlbXAgPSAiJyRmcWdpdGRpci9naXR3ZWIvdG1wJyI7IycKKworZ2l0d2ViX2NnaSAoKSB7CisJY2F0ID4gIiQxLnRtcCIgPDxcRU9GR0lUV0VCCitAQEdJVFdFQl9DR0lAQAorRU9GR0lUV0VCCisJc2VkICIkc2NyaXB0IiAiJDEudG1wIiAgPiAiJDEiCisJY2htb2QgK3ggIiQxIgorCXJtIC1mICIkMS50bXAiCit9CisKK2dpdHdlYl9jc3MgKCkgeworCWNhdCA+ICIkMSIgPDxcRU9GR0lUV0VCCitAQEdJVFdFQl9DU1NAQAorRU9GR0lUV0VCCit9CisKK2dpdHdlYl9jZ2kgJEdJVF9ESVIvZ2l0d2ViL2dpdHdlYi5jZ2kKK2dpdHdlYl9jc3MgJEdJVF9ESVIvZ2l0d2ViL2dpdHdlYi5jc3MKKworY2FzZSAiJGh0dHBkIiBpbgorKmxpZ2h0dHBkKikKKwlsaWdodHRwZF9jb25mCisJOzsKKyphcGFjaGUyKikKKwlhcGFjaGUyX2NvbmYKKwk7OworKikKKwllY2hvICJVbmtub3duIGh0dHBkIHNwZWNpZmllZDogJGh0dHBkIgorCWV4aXQgMQorCTs7Citlc2FjCisKK3N0YXJ0X2h0dHBkCit0ZXN0IC16ICIkYnJvd3NlciIgJiYgYnJvd3Nlcj1lY2hvCit1cmw9aHR0cDovLzEyNy4wLjAuMTokcG9ydAorJGJyb3dzZXIgJHVybCB8fCBlY2hvICR1cmwKZGlmZiAtLWdpdCBhL2dpdC1sb3N0LWZvdW5kLnNoIGIvZ2l0LWxvc3QtZm91bmQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjkyOGYyYwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1sb3N0LWZvdW5kLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nJworU1VCRElSRUNUT1JZX09LPSdZZXMnCisuIGdpdC1zaC1zZXR1cAorCitpZiBbICIkIyIgIT0gIjAiIF0KK3RoZW4KKyAgICB1c2FnZQorZmkKKworbGFmPSIkR0lUX0RJUi9sb3N0LWZvdW5kIgorcm0gLWZyICIkbGFmIiAmJiBta2RpciAtcCAiJGxhZi9jb21taXQiICIkbGFmL290aGVyIiB8fCBleGl0CisKK2dpdCBmc2NrLW9iamVjdHMgLS1mdWxsIHwKK3doaWxlIHJlYWQgZGFuZ2xpbmcgdHlwZSBzaGExCitkbworCWNhc2UgIiRkYW5nbGluZyIgaW4KKwlkYW5nbGluZykKKwkJaWYgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHNoYTFeMCIgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCQl0aGVuCisJCQlkaXI9IiRsYWYvY29tbWl0IgorCQkJZ2l0LXNob3ctYnJhbmNoICIkc2hhMSIKKwkJZWxzZQorCQkJZGlyPSIkbGFmL290aGVyIgorCQlmaQorCQllY2hvICIkc2hhMSIgPiIkZGlyLyRzaGExIgorCQk7OworCWVzYWMKK2RvbmUKZGlmZiAtLWdpdCBhL2dpdC1scy1yZW1vdGUuc2ggYi9naXQtbHMtcmVtb3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmZGNhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbHMtcmVtb3RlLnNoCkBAIC0wLDAgKzEsMTI4IEBACisjIS9iaW4vc2gKKyMKKwordXNhZ2UgKCkgeworICAgIGVjaG8gPiYyICJ1c2FnZTogJDAgWy0taGVhZHNdIFstLXRhZ3NdIFstdXwtLXVwbG9hZC1wYWNrIDx1cGxvYWQtcGFjaz5dIgorICAgIGVjaG8gPiYyICIgICAgICAgICAgPHJlcG9zaXRvcnk+IDxyZWZzPi4uLiIKKyAgICBleGl0IDE7Cit9CisKK2RpZSAoKSB7CisgICAgZWNobyA+JjIgIiQqIgorICAgIGV4aXQgMQorfQorCitleGVjPQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrOzsgZXNhYworZG8KKyAgY2FzZSAiJDEiIGluCisgIC1ofC0taHwtLWhlfC0taGVhfC0taGVhZHwtLWhlYWRzKQorICBoZWFkcz1oZWFkczsgc2hpZnQgOzsKKyAgLXR8LS10fC0tdGF8LS10YWd8LS10YWdzKQorICB0YWdzPXRhZ3M7IHNoaWZ0IDs7CisgIC11fC0tdXwtLXVwfC0tdXBsfC0tdXBsb2F8LS11cGxvYWR8LS11cGxvYWQtfC0tdXBsb2FkLXB8LS11cGxvYWQtcGF8XAorICAtLXVwbG9hZC1wYWN8LS11cGxvYWQtcGFjaykKKwlzaGlmdAorCWV4ZWM9Ii0tZXhlYz0kMSIKKwlzaGlmdDs7CisgIC0tKQorICBzaGlmdDsgYnJlYWsgOzsKKyAgLSopCisgIHVzYWdlIDs7CisgICopCisgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAiJCMiIGluIDApIHVzYWdlIDs7IGVzYWMKKworY2FzZSAiLCRoZWFkcywkdGFncywiIGluCissLCwpIGhlYWRzPWhlYWRzIHRhZ3M9dGFncyBvdGhlcj1vdGhlciA7OworZXNhYworCisuIGdpdC1wYXJzZS1yZW1vdGUKK3BlZWtfcmVwbz0iJChnZXRfcmVtb3RlX3VybCAiJEAiKSIKK3NoaWZ0CisKK3RtcD0ubHMtcmVtb3RlLSQkCit0cmFwICJybSAtZnIgJHRtcC0qIiAwIDEgMiAzIDE1Cit0bXBkaXI9JHRtcC1kCisKK2Nhc2UgIiRwZWVrX3JlcG8iIGluCitodHRwOi8vKiB8IGh0dHBzOi8vKiApCisgICAgICAgIGlmIFsgLW4gIiRHSVRfU1NMX05PX1ZFUklGWSIgXTsgdGhlbgorICAgICAgICAgICAgY3VybF9leHRyYV9hcmdzPSItayIKKyAgICAgICAgZmkKKwljdXJsIC1uc2YgJGN1cmxfZXh0cmFfYXJncyAtLWhlYWRlciAiUHJhZ21hOiBuby1jYWNoZSIgIiRwZWVrX3JlcG8vaW5mby9yZWZzIiB8fAorCQllY2hvICJmYWlsZWQJc2x1cnBpbmciCisJOzsKKworcnN5bmM6Ly8qICkKKwlta2RpciAkdG1wZGlyICYmCisJcnN5bmMgLXJscSAiJHBlZWtfcmVwby9IRUFEIiAkdG1wZGlyICYmCisJcnN5bmMgLXJxICIkcGVla19yZXBvL3JlZnMiICR0bXBkaXIgfHwgeworCQllY2hvICJmYWlsZWQJc2x1cnBpbmciCisJCWV4aXQKKwl9CisJaGVhZD0kKGNhdCAiJHRtcGRpci9IRUFEIikgJiYKKwljYXNlICIkaGVhZCIgaW4KKwlyZWY6JyAnKikKKwkJaGVhZD0kKGV4cHIgInokaGVhZCIgOiAnenJlZjogXCguKlwpJykgJiYKKwkJaGVhZD0kKGNhdCAiJHRtcGRpci8kaGVhZCIpIHx8IGV4aXQKKwllc2FjICYmCisJZWNobyAiJGhlYWQJSEVBRCIKKwkoY2QgJHRtcGRpciAmJiBmaW5kIHJlZnMgLXR5cGUgZikgfAorCXdoaWxlIHJlYWQgcGF0aAorCWRvCisJCWNhdCAiJHRtcGRpci8kcGF0aCIgfCB0ciAtZCAnXDAxMicKKwkJZWNobyAiCSRwYXRoIgorCWRvbmUgJiYKKwlybSAtZnIgJHRtcGRpcgorCTs7CisKKyogKQorCWdpdC1wZWVrLXJlbW90ZSAkZXhlYyAiJHBlZWtfcmVwbyIgfHwKKwkJZWNobyAiZmFpbGVkCXNsdXJwaW5nIgorCTs7Citlc2FjIHwKK3NvcnQgLXQgJwknIC1rIDIgfAord2hpbGUgcmVhZCBzaGExIHBhdGgKK2RvCisJY2FzZSAiJHNoYTEiIGluCisJZmFpbGVkKQorCQlkaWUgIkZhaWxlZCB0byBmaW5kIHJlbW90ZSByZWZzIgorCWVzYWMKKwljYXNlICIkcGF0aCIgaW4KKwlyZWZzL2hlYWRzLyopCisJCWdyb3VwPWhlYWRzIDs7CisJcmVmcy90YWdzLyopCisJCWdyb3VwPXRhZ3MgOzsKKwkqKQorCQlncm91cD1vdGhlciA7OworCWVzYWMKKwljYXNlICIsJGhlYWRzLCR0YWdzLCRvdGhlciwiIGluCisJKiwkZ3JvdXAsKikKKwkJOzsKKwkqKQorCQljb250aW51ZTs7CisJZXNhYworCWNhc2UgIiQjIiBpbgorCTApCisJCW1hdGNoPXllcyA7OworCSopCisJCW1hdGNoPW5vCisJCWZvciBwYXQKKwkJZG8KKwkJCWNhc2UgIi8kcGF0aCIgaW4KKwkJCSovJHBhdCApCisJCQkJbWF0Y2g9eWVzCisJCQkJYnJlYWsgOzsKKwkJCWVzYWMKKwkJZG9uZQorCWVzYWMKKwljYXNlICIkbWF0Y2giIGluCisJbm8pCisJCWNvbnRpbnVlIDs7CisJZXNhYworCWVjaG8gIiRzaGExCSRwYXRoIgorZG9uZQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLW9jdG9wdXMuc2ggYi9naXQtbWVyZ2Utb2N0b3B1cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjNmNDczCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLW9jdG9wdXMuc2gKQEAgLTAsMCArMSwxMTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgUmVzb2x2ZSB0d28gb3IgbW9yZSB0cmVlcy4KKyMKKworTEY9JworJworCitkaWUgKCkgeworICAgIGVjaG8gPiYyICIkKiIKKyAgICBleGl0IDEKK30KKworIyBUaGUgZmlyc3QgcGFyYW1ldGVycyB1cCB0byAtLSBhcmUgbWVyZ2UgYmFzZXM7IHRoZSByZXN0IGFyZSBoZWFkcy4KK2Jhc2VzPSBoZWFkPSByZW1vdGVzPSBzZXBfc2Vlbj0KK2ZvciBhcmcKK2RvCisJY2FzZSAiLCRzZXBfc2VlbiwkaGVhZCwkYXJnLCIgaW4KKwkqLC0tLCkKKwkJc2VwX3NlZW49eWVzCisJCTs7CisJLHllcywsKikKKwkJaGVhZD0kYXJnCisJCTs7CisJLHllcywqKQorCQlyZW1vdGVzPSIkcmVtb3RlcyRhcmcgIgorCQk7OworCSopCisJCWJhc2VzPSIkYmFzZXMkYXJnICIKKwkJOzsKKwllc2FjCitkb25lCisKKyMgUmVqZWN0IGlmIHRoaXMgaXMgbm90IGFuIE9jdG9wdXMgLS0gcmVzb2x2ZSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorY2FzZSAiJHJlbW90ZXMiIGluCis/KicgJz8qKQorCTs7CisqKQorCWV4aXQgMiA7OworZXNhYworCisjIE1SQyBpcyB0aGUgY3VycmVudCAibWVyZ2UgcmVmZXJlbmNlIGNvbW1pdCIKKyMgTVJUIGlzIHRoZSBjdXJyZW50ICJtZXJnZSByZXN1bHQgdHJlZSIKKworTVJDPSRoZWFkIE1TRz0gUEFSRU5UPSItcCAkaGVhZCIKK01SVD0kKGdpdC13cml0ZS10cmVlKQorQ05UPTEgOyMgY291bnRpbmcgb3VyIGhlYWQKK05PTl9GRl9NRVJHRT0wCitPQ1RPUFVTX0ZBSUxVUkU9MAorZm9yIFNIQTEgaW4gJHJlbW90ZXMKK2RvCisJY2FzZSAiJE9DVE9QVVNfRkFJTFVSRSIgaW4KKwkxKQorCQkjIFdlIGFsbG93IG9ubHkgbGFzdCBvbmUgdG8gaGF2ZSBhIGhhbmQtcmVzb2x2YWJsZQorCQkjIGNvbmZsaWN0cy4gIExhc3Qgcm91bmQgZmFpbGVkIGFuZCB3ZSBzdGlsbCBoYWQKKwkJIyBhIGhlYWQgdG8gbWVyZ2UuCisJCWVjaG8gIkF1dG9tYXRlZCBtZXJnZSBkaWQgbm90IHdvcmsuIgorCQllY2hvICJTaG91bGQgbm90IGJlIGRvaW5nIGFuIE9jdG9wdXMuIgorCQlleGl0IDIKKwllc2FjCisKKwljb21tb249JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCAkTVJDICRTSEExKSB8fAorCQlkaWUgIlVuYWJsZSB0byBmaW5kIGNvbW1vbiBjb21taXQgd2l0aCAkU0hBMSIKKworCWNhc2UgIiRMRiRjb21tb24kTEYiIGluCisJKiIkTEYkU0hBMSRMRiIqKQorCQllY2hvICJBbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCAkU0hBMSIKKwkJY29udGludWUKKwkJOzsKKwllc2FjCisKKwlDTlQ9YGV4cHIgJENOVCArIDFgCisJUEFSRU5UPSIkUEFSRU5UIC1wICRTSEExIgorCisJaWYgdGVzdCAiJGNvbW1vbiwkTk9OX0ZGX01FUkdFIiA9ICIkTVJDLDAiCisJdGhlbgorCQkjIFRoZSBmaXJzdCBoZWFkIGJlaW5nIG1lcmdlZCB3YXMgYSBmYXN0LWZvcndhcmQuCisJCSMgQWR2YW5jZSBNUkMgdG8gdGhlIGhlYWQgYmVpbmcgbWVyZ2VkLCBhbmQgdXNlIHRoYXQKKwkJIyB0cmVlIGFzIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IG9mIHRoZSBtZXJnZS4KKwkJIyBXZSBzdGlsbCBuZWVkIHRvIGNvdW50IHRoaXMgYXMgcGFydCBvZiB0aGUgcGFyZW50IHNldC4KKworCQllY2hvICJGYXN0IGZvcndhcmRpbmcgdG86ICRTSEExIgorCQlnaXQtcmVhZC10cmVlIC11IC1tICRoZWFkICRTSEExIHx8IGV4aXQKKwkJTVJDPSRTSEExIE1SVD0kKGdpdC13cml0ZS10cmVlKQorCQljb250aW51ZQorCWZpCisKKwlOT05fRkZfTUVSR0U9MQorCisJZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZSB3aXRoICRTSEExIgorCWdpdC1yZWFkLXRyZWUgLXUgLW0gLS1hZ2dyZXNzaXZlICAkY29tbW9uICRNUlQgJFNIQTEgfHwgZXhpdCAyCisJbmV4dD0kKGdpdC13cml0ZS10cmVlIDI+L2Rldi9udWxsKQorCWlmIHRlc3QgJD8gLW5lIDAKKwl0aGVuCisJCWVjaG8gIlNpbXBsZSBtZXJnZSBkaWQgbm90IHdvcmssIHRyeWluZyBhdXRvbWF0aWMgbWVyZ2UuIgorCQlnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hIHx8CisJCU9DVE9QVVNfRkFJTFVSRT0xCisJCW5leHQ9JChnaXQtd3JpdGUtdHJlZSAyPi9kZXYvbnVsbCkKKwlmaQorCisJIyBXZSBoYXZlIG1lcmdlZCB0aGUgb3RoZXIgYnJhbmNoIHN1Y2Nlc3NmdWxseS4gIElkZWFsbHkKKwkjIHdlIGNvdWxkIGltcGxlbWVudCBPUidlZCBoZWFkcyBpbiBtZXJnZS1iYXNlLCBhbmQga2VlcAorCSMgYSBsaXN0IG9mIGNvbW1pdHMgd2UgaGF2ZSBtZXJnZWQgc28gZmFyIGluIE1SQyB0byBmZWVkCisJIyB0aGVtIHRvIG1lcmdlLWJhc2UsIGJ1dCB3ZSBhcHByb3hpbWF0ZSBpdCBieSBrZWVwIHVzaW5nCisJIyB0aGUgY3VycmVudCBNUkMuICBXZSB1c2VkIHRvIHVwZGF0ZSBpdCB0byAkY29tbW9uLCB3aGljaAorCSMgd2FzIGluY29ycmVjdGx5IGRvaW5nIEFORCdlZCBtZXJnZS1iYXNlIGhlcmUsIHdoaWNoIHdhcworCSMgdW5uZWVkZWQuCisKKwlNUlQ9JG5leHQKK2RvbmUKKworZXhpdCAiJE9DVE9QVVNfRkFJTFVSRSIKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1vbmUtZmlsZS5zaCBiL2dpdC1tZXJnZS1vbmUtZmlsZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYmE0YjBjCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLW9uZS1maWxlLnNoCkBAIC0wLDAgKzEsMTIwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSBMaW51cyBUb3J2YWxkcywgMjAwNQorIworIyBUaGlzIGlzIHRoZSBnaXQgcGVyLWZpbGUgbWVyZ2Ugc2NyaXB0LCBjYWxsZWQgd2l0aAorIworIyAgICQxIC0gb3JpZ2luYWwgZmlsZSBTSEExIChvciBlbXB0eSkKKyMgICAkMiAtIGZpbGUgaW4gYnJhbmNoMSBTSEExIChvciBlbXB0eSkKKyMgICAkMyAtIGZpbGUgaW4gYnJhbmNoMiBTSEExIChvciBlbXB0eSkKKyMgICAkNCAtIHBhdGhuYW1lIGluIHJlcG9zaXRvcnkKKyMgICAkNSAtIG9yaWdpbmFsIGZpbGUgbW9kZSAob3IgZW1wdHkpCisjICAgJDYgLSBmaWxlIGluIGJyYW5jaDEgbW9kZSAob3IgZW1wdHkpCisjICAgJDcgLSBmaWxlIGluIGJyYW5jaDIgbW9kZSAob3IgZW1wdHkpCisjCisjIEhhbmRsZSBzb21lIHRyaXZpYWwgY2FzZXMuLiBUaGUgX3JlYWxseV8gdHJpdmlhbCBjYXNlcyBoYXZlCisjIGJlZW4gaGFuZGxlZCBhbHJlYWR5IGJ5IGdpdC1yZWFkLXRyZWUsIGJ1dCB0aGF0IG9uZSBkb2Vzbid0CisjIGRvIGFueSBtZXJnZXMgdGhhdCBtaWdodCBjaGFuZ2UgdGhlIHRyZWUgbGF5b3V0LgorCitjYXNlICIkezE6LS59JHsyOi0ufSR7MzotLn0iIGluCisjCisjIERlbGV0ZWQgaW4gYm90aCBvciBkZWxldGVkIGluIG9uZSBhbmQgdW5jaGFuZ2VkIGluIHRoZSBvdGhlcgorIworIiQxLi4iIHwgIiQxLiQxIiB8ICIkMSQxLiIpCisJaWYgWyAiJDIiIF07IHRoZW4KKwkJZWNobyAiUmVtb3ZpbmcgJDQiCisJZmkKKwlpZiB0ZXN0IC1mICIkNCI7IHRoZW4KKwkJcm0gLWYgLS0gIiQ0IiAmJgorCQlybWRpciAtcCAiJChleHByICJ6JDQiIDogJ3pcKC4qXCkvJykiIDI+L2Rldi9udWxsIHx8IDoKKwlmaSAmJgorCQlleGVjIGdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgLS0gIiQ0IgorCTs7CisKKyMKKyMgQWRkZWQgaW4gb25lLgorIworIi4kMi4iIHwgIi4uJDMiICkKKwllY2hvICJBZGRpbmcgJDQiCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLWNhY2hlaW5mbyAiJDYkNyIgIiQyJDMiICIkNCIgJiYKKwkJZXhlYyBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLS0gIiQ0IgorCTs7CisKKyMKKyMgQWRkZWQgaW4gYm90aCwgaWRlbnRpY2FsbHkgKGNoZWNrIGZvciBzYW1lIHBlcm1pc3Npb25zKS4KKyMKKyIuJDMkMiIpCisJaWYgWyAiJDYiICE9ICIkNyIgXTsgdGhlbgorCQllY2hvICJFUlJPUjogRmlsZSAkNCBhZGRlZCBpZGVudGljYWxseSBpbiBib3RoIGJyYW5jaGVzLCIKKwkJZWNobyAiRVJST1I6IGJ1dCBwZXJtaXNzaW9ucyBjb25mbGljdCAkNi0+JDcuIgorCQlleGl0IDEKKwlmaQorCWVjaG8gIkFkZGluZyAkNCIKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tY2FjaGVpbmZvICIkNiIgIiQyIiAiJDQiICYmCisJCWV4ZWMgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC0tICIkNCIKKwk7OworCisjCisjIE1vZGlmaWVkIGluIGJvdGgsIGJ1dCBkaWZmZXJlbnRseS4KKyMKKyIkMSQyJDMiIHwgIi4kMiQzIikKKworCWNhc2UgIiwkNiwkNywiIGluCisJKiwxMjAwMDAsKikKKwkJZWNobyAiRVJST1I6ICQ0OiBOb3QgbWVyZ2luZyBzeW1ib2xpYyBsaW5rIGNoYW5nZXMuIgorCQlleGl0IDEKKwkJOzsKKwllc2FjCisKKwlzcmMyPWBnaXQtdW5wYWNrLWZpbGUgJDNgCisJY2FzZSAiJDEiIGluCisJJycpCisJCWVjaG8gIkFkZGVkICQ0IGluIGJvdGgsIGJ1dCBkaWZmZXJlbnRseS4iCisJCSMgVGhpcyBleHRyYWN0cyBPVVIgZmlsZSBpbiAkb3JpZywgYW5kIHVzZXMgZ2l0LWFwcGx5IHRvCisJCSMgcmVtb3ZlIGxpbmVzIHRoYXQgYXJlIHVuaXF1ZSB0byBvdXJzLgorCQlvcmlnPWBnaXQtdW5wYWNrLWZpbGUgJDJgCisJCXN6MD1gd2MgLWMgPCIkb3JpZyJgCisJCWRpZmYgLXUgLUxhLyRvcmlnIC1MYi8kb3JpZyAkb3JpZyAkc3JjMiB8IGdpdC1hcHBseSAtLW5vLWFkZCAKKwkJc3oxPWB3YyAtYyA8IiRvcmlnImAKKworCQkjIElmIHdlIGRvIG5vdCBoYXZlIGVub3VnaCBjb21tb24gbWF0ZXJpYWwsIGl0IGlzIG5vdAorCQkjIHdvcnRoIHRyeWluZyB0d28tZmlsZSBtZXJnZSB1c2luZyBjb21tb24gc3Vic2VjdGlvbnMuCisJCWV4cHIgIiRzejAiIFw8ICIkc3oxIiBcKiAyID4vZGV2L251bGwgfHwgOiA+JG9yaWcKKwkJOzsKKwkqKQorCQllY2hvICJBdXRvLW1lcmdpbmcgJDQiCisJCW9yaWc9YGdpdC11bnBhY2stZmlsZSAkMWAKKwkJOzsKKwllc2FjCisKKwkjIEJlIGNhcmVmdWwgZm9yIGZ1bm55IGZpbGVuYW1lIHN1Y2ggYXMgIi1MIiBpbiAiJDQiLCB3aGljaAorCSMgd291bGQgY29uZnVzZSAibWVyZ2UiIGdyZWF0bHkuCisJc3JjMT1gZ2l0LXVucGFjay1maWxlICQyYAorCW1lcmdlICIkc3JjMSIgIiRvcmlnIiAiJHNyYzIiCisJcmV0PSQ/CisKKwkjIENyZWF0ZSB0aGUgd29ya2luZyB0cmVlIGZpbGUsIHVzaW5nICJvdXIgdHJlZSIgdmVyc2lvbiBmcm9tIHRoZQorCSMgaW5kZXgsIGFuZCB0aGVuIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlIG1lcmdlLgorCWdpdC1jaGVja291dC1pbmRleCAtZiAtLXN0YWdlPTIgLS0gIiQ0IiAmJiBjYXQgIiRzcmMxIiA+IiQ0IgorCXJtIC1mIC0tICIkb3JpZyIgIiRzcmMxIiAiJHNyYzIiCisKKwlpZiBbICIkNiIgIT0gIiQ3IiBdOyB0aGVuCisJCWVjaG8gIkVSUk9SOiBQZXJtaXNzaW9ucyBjb25mbGljdDogJDUtPiQ2LCQ3LiIKKwkJcmV0PTEKKwlmaQorCWlmIFsgIiQxIiA9ICcnIF07IHRoZW4KKwkJcmV0PTEKKwlmaQorCisJaWYgWyAkcmV0IC1uZSAwIF07IHRoZW4KKwkJZWNobyAiRVJST1I6IE1lcmdlIGNvbmZsaWN0IGluICQ0IgorCQlleGl0IDEKKwlmaQorCWV4ZWMgZ2l0LXVwZGF0ZS1pbmRleCAtLSAiJDQiCisJOzsKKworKikKKwllY2hvICJFUlJPUjogJDQ6IE5vdCBoYW5kbGluZyBjYXNlICQxIC0+ICQyIC0+ICQzIgorCTs7Citlc2FjCitleGl0IDEKZGlmZiAtLWdpdCBhL2dpdC1tZXJnZS1vdXJzLnNoIGIvZ2l0LW1lcmdlLW91cnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGYzZDA1MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1vdXJzLnNoCkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKyMgUHJldGVuZCB3ZSByZXNvbHZlZCB0aGUgaGVhZHMsIGJ1dCBkZWNsYXJlIG91ciB0cmVlIHRydW1wcyBldmVyeWJvZHkgZWxzZS4KKyMKKworIyBXZSBuZWVkIHRvIGV4aXQgd2l0aCAyIGlmIHRoZSBpbmRleCBkb2VzIG5vdCBtYXRjaCBvdXIgSEVBRCB0cmVlLAorIyBiZWNhdXNlIHRoZSBjdXJyZW50IGluZGV4IGlzIHdoYXQgd2Ugd2lsbCBiZSBjb21taXR0aW5nIGFzIHRoZQorIyBtZXJnZSByZXN1bHQuCisKK3Rlc3QgIiQoZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgLS1uYW1lLXN0YXR1cyBIRUFEKSIgPSAiIiB8fCBleGl0IDIKKworZXhpdCAwCmRpZmYgLS1naXQgYS9naXQtbWVyZ2UtcmVjdXJzaXZlLnB5IGIvZ2l0LW1lcmdlLXJlY3Vyc2l2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MDM5NDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LW1lcmdlLXJlY3Vyc2l2ZS5weQpAQCAtMCwwICsxLDk0NCBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEZyZWRyaWsgS3VpdmluZW4KKyMKKworaW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCcnJ0BAR0lUX1BZVEhPTl9QQVRIQEAnJycpCisKK2ltcG9ydCBtYXRoLCByYW5kb20sIG9zLCByZSwgc2lnbmFsLCB0ZW1wZmlsZSwgc3RhdCwgZXJybm8sIHRyYWNlYmFjaworZnJvbSBoZWFwcSBpbXBvcnQgaGVhcHB1c2gsIGhlYXBwb3AKK2Zyb20gc2V0cyBpbXBvcnQgU2V0CisKK2Zyb20gZ2l0TWVyZ2VDb21tb24gaW1wb3J0ICoKKworb3V0cHV0SW5kZW50ID0gMAorZGVmIG91dHB1dCgqYXJncyk6CisgICAgc3lzLnN0ZG91dC53cml0ZSgnICAnKm91dHB1dEluZGVudCkKKyAgICBwcmludExpc3QoYXJncykKKworb3JpZ2luYWxJbmRleEZpbGUgPSBvcy5lbnZpcm9uLmdldCgnR0lUX0lOREVYX0ZJTEUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uLmdldCgnR0lUX0RJUicsICcuZ2l0JykgKyAnL2luZGV4JykKK3RlbXBvcmFyeUluZGV4RmlsZSA9IG9zLmVudmlyb24uZ2V0KCdHSVRfRElSJywgJy5naXQnKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICcvbWVyZ2UtcmVjdXJzaXZlLXRtcC1pbmRleCcKK2RlZiBzZXR1cEluZGV4KHRlbXBvcmFyeSk6CisgICAgdHJ5OgorICAgICAgICBvcy51bmxpbmsodGVtcG9yYXJ5SW5kZXhGaWxlKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBwYXNzCisgICAgaWYgdGVtcG9yYXJ5OgorICAgICAgICBuZXdJbmRleCA9IHRlbXBvcmFyeUluZGV4RmlsZQorICAgIGVsc2U6CisgICAgICAgIG5ld0luZGV4ID0gb3JpZ2luYWxJbmRleEZpbGUKKyAgICBvcy5lbnZpcm9uWydHSVRfSU5ERVhfRklMRSddID0gbmV3SW5kZXgKKworIyBUaGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIHdoaWNoIGlzIHVzZWQgaW4gYSBudW1iZXIgb2YgcGxhY2VzIGJ1dAorIyBvbmx5IHdyaXR0ZW4gdG8gaW4gdGhlICdtZXJnZScgZnVuY3Rpb24uCisKKyMgY2FjaGVPbmx5ID09IFRydWUgID0+IERvbid0IGxlYXZlIGFueSBub24tc3RhZ2UgMCBlbnRyaWVzIGluIHRoZSBjYWNoZSBhbmQKKyMgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IHVwZGF0ZSB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisjICAgICAgICAgICAgICBGYWxzZSA9PiBMZWF2ZSB1bm1lcmdlZCBlbnRyaWVzIGluIHRoZSBjYWNoZSBhbmQgdXBkYXRlCisjICAgICAgICAgICAgICAgICAgICAgICB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisKK2NhY2hlT25seSA9IEZhbHNlCisKKyMgVGhlIGVudHJ5IHBvaW50IHRvIHRoZSBtZXJnZSBjb2RlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgbWVyZ2UoaDEsIGgyLCBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUsIGdyYXBoLCBjYWxsRGVwdGg9MCwgYW5jZXN0b3I9Tm9uZSk6CisgICAgJycnTWVyZ2UgdGhlIGNvbW1pdHMgaDEgYW5kIGgyLCByZXR1cm4gdGhlIHJlc3VsdGluZyB2aXJ0dWFsCisgICAgY29tbWl0IG9iamVjdCBhbmQgYSBmbGFnIGluZGljYXRpbmcgdGhlIGNsZWFubmVzcyBvZiB0aGUgbWVyZ2UuJycnCisgICAgYXNzZXJ0KGlzaW5zdGFuY2UoaDEsIENvbW1pdCkgYW5kIGlzaW5zdGFuY2UoaDIsIENvbW1pdCkpCisKKyAgICBnbG9iYWwgb3V0cHV0SW5kZW50CisKKyAgICBvdXRwdXQoJ01lcmdpbmc6JykKKyAgICBvdXRwdXQoaDEpCisgICAgb3V0cHV0KGgyKQorICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCisgICAgaWYgYW5jZXN0b3I6CisgICAgICAgIGNhID0gW2FuY2VzdG9yXQorICAgIGVsc2U6CisgICAgICAgIGFzc2VydChpc2luc3RhbmNlKGdyYXBoLCBHcmFwaCkpCisgICAgICAgIGNhID0gZ2V0Q29tbW9uQW5jZXN0b3JzKGdyYXBoLCBoMSwgaDIpCisgICAgb3V0cHV0KCdmb3VuZCcsIGxlbihjYSksICdjb21tb24gYW5jZXN0b3Iocyk6JykKKyAgICBmb3IgeCBpbiBjYToKKyAgICAgICAgb3V0cHV0KHgpCisgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisKKyAgICBtZXJnZWRDQSA9IGNhWzBdCisgICAgZm9yIGggaW4gY2FbMTpdOgorICAgICAgICBvdXRwdXRJbmRlbnQgPSBjYWxsRGVwdGgrMQorICAgICAgICBbbWVyZ2VkQ0EsIGR1bW15XSA9IG1lcmdlKG1lcmdlZENBLCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUZW1wb3JhcnkgbWVyZ2UgYnJhbmNoIDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUZW1wb3JhcnkgbWVyZ2UgYnJhbmNoIDInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLCBjYWxsRGVwdGgrMSkKKyAgICAgICAgb3V0cHV0SW5kZW50ID0gY2FsbERlcHRoCisgICAgICAgIGFzc2VydChpc2luc3RhbmNlKG1lcmdlZENBLCBDb21taXQpKQorCisgICAgZ2xvYmFsIGNhY2hlT25seQorICAgIGlmIGNhbGxEZXB0aCA9PSAwOgorICAgICAgICBzZXR1cEluZGV4KEZhbHNlKQorICAgICAgICBjYWNoZU9ubHkgPSBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIHNldHVwSW5kZXgoVHJ1ZSkKKyAgICAgICAgcnVuUHJvZ3JhbShbJ2dpdC1yZWFkLXRyZWUnLCBoMS50cmVlKCldKQorICAgICAgICBjYWNoZU9ubHkgPSBUcnVlCisKKyAgICBbc2hhUmVzLCBjbGVhbl0gPSBtZXJnZVRyZWVzKGgxLnRyZWUoKSwgaDIudHJlZSgpLCBtZXJnZWRDQS50cmVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUpCisKKyAgICBpZiBncmFwaCBhbmQgKGNsZWFuIG9yIGNhY2hlT25seSk6CisgICAgICAgIHJlcyA9IENvbW1pdChOb25lLCBbaDEsIGgyXSwgdHJlZT1zaGFSZXMpCisgICAgICAgIGdyYXBoLmFkZE5vZGUocmVzKQorICAgIGVsc2U6CisgICAgICAgIHJlcyA9IE5vbmUKKworICAgIHJldHVybiBbcmVzLCBjbGVhbl0KKworZ2V0RmlsZXNSRSA9IHJlLmNvbXBpbGUocideKFswLTddKykgKFxTKykgKFswLTlhLWZdezQwfSlcdCguKikkJywgcmUuUykKK2RlZiBnZXRGaWxlc0FuZERpcnModHJlZSk6CisgICAgZmlsZXMgPSBTZXQoKQorICAgIGRpcnMgPSBTZXQoKQorICAgIG91dCA9IHJ1blByb2dyYW0oWydnaXQtbHMtdHJlZScsICctcicsICcteicsICctdCcsIHRyZWVdKQorICAgIGZvciBsIGluIG91dC5zcGxpdCgnXDAnKToKKyAgICAgICAgbSA9IGdldEZpbGVzUkUubWF0Y2gobCkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoMikgPT0gJ3RyZWUnOgorICAgICAgICAgICAgICAgIGRpcnMuYWRkKG0uZ3JvdXAoNCkpCisgICAgICAgICAgICBlbGlmIG0uZ3JvdXAoMikgPT0gJ2Jsb2InOgorICAgICAgICAgICAgICAgIGZpbGVzLmFkZChtLmdyb3VwKDQpKQorCisgICAgcmV0dXJuIFtmaWxlcywgZGlyc10KKworIyBUaG9zZSB0d28gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgdXNlZCBpbiBhIG51bWJlciBvZiBwbGFjZXMgYnV0IG9ubHkKKyMgd3JpdHRlbiB0byBpbiAnbWVyZ2VUcmVlcycgYW5kICd1bmlxdWVQYXRoJy4gVGhleSBrZWVwIHRyYWNrIG9mCisjIGV2ZXJ5IGZpbGUgYW5kIGRpcmVjdG9yeSBpbiB0aGUgdHdvIGJyYW5jaGVzIHRoYXQgYXJlIGFib3V0IHRvIGJlCisjIG1lcmdlZC4KK2N1cnJlbnRGaWxlU2V0ID0gTm9uZQorY3VycmVudERpcmVjdG9yeVNldCA9IE5vbmUKKworZGVmIG1lcmdlVHJlZXMoaGVhZCwgbWVyZ2UsIGNvbW1vbiwgYnJhbmNoMU5hbWUsIGJyYW5jaDJOYW1lKToKKyAgICAnJydNZXJnZSB0aGUgdHJlZXMgJ2hlYWQnIGFuZCAnbWVyZ2UnIHdpdGggdGhlIGNvbW1vbiBhbmNlc3RvcgorICAgICdjb21tb24nLiBUaGUgbmFtZSBvZiB0aGUgaGVhZCBicmFuY2ggaXMgJ2JyYW5jaDFOYW1lJyBhbmQgdGhlIG5hbWUgb2YKKyAgICB0aGUgbWVyZ2UgYnJhbmNoIGlzICdicmFuY2gyTmFtZScuIFJldHVybiBhIHR1cGxlICh0cmVlLCBjbGVhbk1lcmdlKQorICAgIHdoZXJlIHRyZWUgaXMgdGhlIHJlc3VsdGluZyB0cmVlIGFuZCBjbGVhbk1lcmdlIGlzIFRydWUgaWZmIHRoZQorICAgIG1lcmdlIHdhcyBjbGVhbi4nJycKKyAgICAKKyAgICBhc3NlcnQoaXNTaGEoaGVhZCkgYW5kIGlzU2hhKG1lcmdlKSBhbmQgaXNTaGEoY29tbW9uKSkKKworICAgIGlmIGNvbW1vbiA9PSBtZXJnZToKKyAgICAgICAgb3V0cHV0KCdBbHJlYWR5IHVwdG9kYXRlIScpCisgICAgICAgIHJldHVybiBbaGVhZCwgVHJ1ZV0KKworICAgIGlmIGNhY2hlT25seToKKyAgICAgICAgdXBkYXRlQXJnID0gJy1pJworICAgIGVsc2U6CisgICAgICAgIHVwZGF0ZUFyZyA9ICctdScKKworICAgIFtvdXQsIGNvZGVdID0gcnVuUHJvZ3JhbShbJ2dpdC1yZWFkLXRyZWUnLCB1cGRhdGVBcmcsICctbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiwgaGVhZCwgbWVyZ2VdLCByZXR1cm5Db2RlID0gVHJ1ZSkKKyAgICBpZiBjb2RlICE9IDA6CisgICAgICAgIGRpZSgnZ2l0LXJlYWQtdHJlZTonLCBvdXQpCisKKyAgICBbdHJlZSwgY29kZV0gPSBydW5Qcm9ncmFtKCdnaXQtd3JpdGUtdHJlZScsIHJldHVybkNvZGU9VHJ1ZSkKKyAgICB0cmVlID0gdHJlZS5yc3RyaXAoKQorICAgIGlmIGNvZGUgIT0gMDoKKyAgICAgICAgZ2xvYmFsIGN1cnJlbnRGaWxlU2V0LCBjdXJyZW50RGlyZWN0b3J5U2V0CisgICAgICAgIFtjdXJyZW50RmlsZVNldCwgY3VycmVudERpcmVjdG9yeVNldF0gPSBnZXRGaWxlc0FuZERpcnMoaGVhZCkKKyAgICAgICAgW2ZpbGVzTSwgZGlyc01dID0gZ2V0RmlsZXNBbmREaXJzKG1lcmdlKQorICAgICAgICBjdXJyZW50RmlsZVNldC51bmlvbl91cGRhdGUoZmlsZXNNKQorICAgICAgICBjdXJyZW50RGlyZWN0b3J5U2V0LnVuaW9uX3VwZGF0ZShkaXJzTSkKKworICAgICAgICBlbnRyaWVzID0gdW5tZXJnZWRDYWNoZUVudHJpZXMoKQorICAgICAgICByZW5hbWVzSGVhZCA9ICBnZXRSZW5hbWVzKGhlYWQsIGNvbW1vbiwgaGVhZCwgbWVyZ2UsIGVudHJpZXMpCisgICAgICAgIHJlbmFtZXNNZXJnZSA9IGdldFJlbmFtZXMobWVyZ2UsIGNvbW1vbiwgaGVhZCwgbWVyZ2UsIGVudHJpZXMpCisKKyAgICAgICAgY2xlYW5NZXJnZSA9IHByb2Nlc3NSZW5hbWVzKHJlbmFtZXNIZWFkLCByZW5hbWVzTWVyZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUpCisgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgaWYgZW50cnkucHJvY2Vzc2VkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgcHJvY2Vzc0VudHJ5KGVudHJ5LCBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUpOgorICAgICAgICAgICAgICAgIGNsZWFuTWVyZ2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIAorICAgICAgICBpZiBjbGVhbk1lcmdlIG9yIGNhY2hlT25seToKKyAgICAgICAgICAgIHRyZWUgPSBydW5Qcm9ncmFtKCdnaXQtd3JpdGUtdHJlZScpLnJzdHJpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cmVlID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGNsZWFuTWVyZ2UgPSBUcnVlCisKKyAgICByZXR1cm4gW3RyZWUsIGNsZWFuTWVyZ2VdCisKKyMgTG93IGxldmVsIGZpbGUgbWVyZ2luZywgdXBkYXRlIGFuZCByZW1vdmFsCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgbWVyZ2VGaWxlKG9QYXRoLCBvU2hhLCBvTW9kZSwgYVBhdGgsIGFTaGEsIGFNb2RlLCBiUGF0aCwgYlNoYSwgYk1vZGUsCisgICAgICAgICAgICAgIGJyYW5jaDFOYW1lLCBicmFuY2gyTmFtZSk6CisKKyAgICBtZXJnZSA9IEZhbHNlCisgICAgY2xlYW4gPSBUcnVlCisKKyAgICBpZiBzdGF0LlNfSUZNVChhTW9kZSkgIT0gc3RhdC5TX0lGTVQoYk1vZGUpOgorICAgICAgICBjbGVhbiA9IEZhbHNlCisgICAgICAgIGlmIHN0YXQuU19JU1JFRyhhTW9kZSk6CisgICAgICAgICAgICBtb2RlID0gYU1vZGUKKyAgICAgICAgICAgIHNoYSA9IGFTaGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZGUgPSBiTW9kZQorICAgICAgICAgICAgc2hhID0gYlNoYQorICAgIGVsc2U6CisgICAgICAgIGlmIGFTaGEgIT0gb1NoYSBhbmQgYlNoYSAhPSBvU2hhOgorICAgICAgICAgICAgbWVyZ2UgPSBUcnVlCisKKyAgICAgICAgaWYgYU1vZGUgPT0gb01vZGU6CisgICAgICAgICAgICBtb2RlID0gYk1vZGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZGUgPSBhTW9kZQorCisgICAgICAgIGlmIGFTaGEgPT0gb1NoYToKKyAgICAgICAgICAgIHNoYSA9IGJTaGEKKyAgICAgICAgZWxpZiBiU2hhID09IG9TaGE6CisgICAgICAgICAgICBzaGEgPSBhU2hhCisgICAgICAgIGVsaWYgc3RhdC5TX0lTUkVHKGFNb2RlKToKKyAgICAgICAgICAgIGFzc2VydChzdGF0LlNfSVNSRUcoYk1vZGUpKQorCisgICAgICAgICAgICBvcmlnID0gcnVuUHJvZ3JhbShbJ2dpdC11bnBhY2stZmlsZScsIG9TaGFdKS5yc3RyaXAoKQorICAgICAgICAgICAgc3JjMSA9IHJ1blByb2dyYW0oWydnaXQtdW5wYWNrLWZpbGUnLCBhU2hhXSkucnN0cmlwKCkKKyAgICAgICAgICAgIHNyYzIgPSBydW5Qcm9ncmFtKFsnZ2l0LXVucGFjay1maWxlJywgYlNoYV0pLnJzdHJpcCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgW291dCwgY29kZV0gPSBydW5Qcm9ncmFtKFsnbWVyZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1MJywgYnJhbmNoMU5hbWUgKyAnLycgKyBhUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctTCcsICdvcmlnLycgKyBvUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctTCcsIGJyYW5jaDJOYW1lICsgJy8nICsgYlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBvcmlnLCBzcmMyXSwgcmV0dXJuQ29kZT1UcnVlKQorICAgICAgICAgICAgZXhjZXB0IFByb2dyYW1FcnJvciwgZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIGUKKyAgICAgICAgICAgICAgICBkaWUoIkZhaWxlZCB0byBleGVjdXRlICdtZXJnZScuIG1lcmdlKDEpIGlzIHVzZWQgYXMgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgImZpbGUtbGV2ZWwgbWVyZ2UgdG9vbC4gSXMgJ21lcmdlJyBpbiB5b3VyIHBhdGg/IikKKworICAgICAgICAgICAgc2hhID0gcnVuUHJvZ3JhbShbJ2dpdC1oYXNoLW9iamVjdCcsICctdCcsICdibG9iJywgJy13JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFdKS5yc3RyaXAoKQorCisgICAgICAgICAgICBvcy51bmxpbmsob3JpZykKKyAgICAgICAgICAgIG9zLnVubGluayhzcmMxKQorICAgICAgICAgICAgb3MudW5saW5rKHNyYzIpCisKKyAgICAgICAgICAgIGNsZWFuID0gKGNvZGUgPT0gMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydChzdGF0LlNfSVNMTksoYU1vZGUpIGFuZCBzdGF0LlNfSVNMTksoYk1vZGUpKQorICAgICAgICAgICAgc2hhID0gYVNoYQorCisgICAgICAgICAgICBpZiBhU2hhICE9IGJTaGE6CisgICAgICAgICAgICAgICAgY2xlYW4gPSBGYWxzZQorCisgICAgcmV0dXJuIFtzaGEsIG1vZGUsIGNsZWFuLCBtZXJnZV0KKworZGVmIHVwZGF0ZUZpbGUoY2xlYW4sIHNoYSwgbW9kZSwgcGF0aCk6CisgICAgdXBkYXRlQ2FjaGUgPSBjYWNoZU9ubHkgb3IgY2xlYW4KKyAgICB1cGRhdGVXZCA9IG5vdCBjYWNoZU9ubHkKKworICAgIHJldHVybiB1cGRhdGVGaWxlRXh0KHNoYSwgbW9kZSwgcGF0aCwgdXBkYXRlQ2FjaGUsIHVwZGF0ZVdkKQorCitkZWYgdXBkYXRlRmlsZUV4dChzaGEsIG1vZGUsIHBhdGgsIHVwZGF0ZUNhY2hlLCB1cGRhdGVXZCk6CisgICAgaWYgY2FjaGVPbmx5OgorICAgICAgICB1cGRhdGVXZCA9IEZhbHNlCisKKyAgICBpZiB1cGRhdGVXZDoKKyAgICAgICAgcGF0aENvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKDEsIGxlbihwYXRoQ29tcG9uZW50cykpOgorICAgICAgICAgICAgcCA9ICcvJy5qb2luKHBhdGhDb21wb25lbnRzWzA6eF0pCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjcmVhdGVEaXIgPSBub3Qgc3RhdC5TX0lTRElSKG9zLmxzdGF0KHApLnN0X21vZGUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBjcmVhdGVEaXIgPSBUcnVlCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIGNyZWF0ZURpcjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLm1rZGlyKHApCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGRpZSgiQ291bGRuJ3QgY3JlYXRlIGRpcmVjdG9yeSIsIHAsIGUuc3RyZXJyb3IpCisKKyAgICAgICAgcHJvZyA9IFsnZ2l0LWNhdC1maWxlJywgJ2Jsb2InLCBzaGFdCisgICAgICAgIGlmIHN0YXQuU19JU1JFRyhtb2RlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIG1vZGUgJiAwMTAwOgorICAgICAgICAgICAgICAgIG1vZGUgPSAwNzc3CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1vZGUgPSAwNjY2CisgICAgICAgICAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19XUk9OTFkgfCBvcy5PX1RSVU5DIHwgb3MuT19DUkVBVCwgbW9kZSkKKyAgICAgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHByb2csIHN0ZG91dD1mZCkKKyAgICAgICAgICAgIHByb2Mud2FpdCgpCisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNMTksobW9kZSk6CisgICAgICAgICAgICBsaW5rVGFyZ2V0ID0gcnVuUHJvZ3JhbShwcm9nKQorICAgICAgICAgICAgb3Muc3ltbGluayhsaW5rVGFyZ2V0LCBwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0KEZhbHNlKQorCisgICAgaWYgdXBkYXRlV2QgYW5kIHVwZGF0ZUNhY2hlOgorICAgICAgICBydW5Qcm9ncmFtKFsnZ2l0LXVwZGF0ZS1pbmRleCcsICctLWFkZCcsICctLScsIHBhdGhdKQorICAgIGVsaWYgdXBkYXRlQ2FjaGU6CisgICAgICAgIHJ1blByb2dyYW0oWydnaXQtdXBkYXRlLWluZGV4JywgJy0tYWRkJywgJy0tY2FjaGVpbmZvJywKKyAgICAgICAgICAgICAgICAgICAgJzAlbycgJSBtb2RlLCBzaGEsIHBhdGhdKQorCitkZWYgc2V0SW5kZXhTdGFnZXMocGF0aCwKKyAgICAgICAgICAgICAgICAgICBvU0hBMSwgb01vZGUsCisgICAgICAgICAgICAgICAgICAgYVNIQTEsIGFNb2RlLAorICAgICAgICAgICAgICAgICAgIGJTSEExLCBiTW9kZSwKKyAgICAgICAgICAgICAgICAgICBjbGVhcj1UcnVlKToKKyAgICBpc3RyaW5nID0gW10KKyAgICBpZiBjbGVhcjoKKyAgICAgICAgaXN0cmluZy5hcHBlbmQoIjAgIiArICgiMCIgKiA0MCkgKyAiXHQiICsgcGF0aCArICJcMCIpCisgICAgaWYgb01vZGU6CisgICAgICAgIGlzdHJpbmcuYXBwZW5kKCIlbyAlcyAlZFx0JXNcMCIgJSAob01vZGUsIG9TSEExLCAxLCBwYXRoKSkKKyAgICBpZiBhTW9kZToKKyAgICAgICAgaXN0cmluZy5hcHBlbmQoIiVvICVzICVkXHQlc1wwIiAlIChhTW9kZSwgYVNIQTEsIDIsIHBhdGgpKQorICAgIGlmIGJNb2RlOgorICAgICAgICBpc3RyaW5nLmFwcGVuZCgiJW8gJXMgJWRcdCVzXDAiICUgKGJNb2RlLCBiU0hBMSwgMywgcGF0aCkpCisKKyAgICBydW5Qcm9ncmFtKFsnZ2l0LXVwZGF0ZS1pbmRleCcsICcteicsICctLWluZGV4LWluZm8nXSwKKyAgICAgICAgICAgICAgIGlucHV0PSIiLmpvaW4oaXN0cmluZykpCisKK2RlZiByZW1vdmVGaWxlKGNsZWFuLCBwYXRoKToKKyAgICB1cGRhdGVDYWNoZSA9IGNhY2hlT25seSBvciBjbGVhbgorICAgIHVwZGF0ZVdkID0gbm90IGNhY2hlT25seQorCisgICAgaWYgdXBkYXRlQ2FjaGU6CisgICAgICAgIHJ1blByb2dyYW0oWydnaXQtdXBkYXRlLWluZGV4JywgJy0tZm9yY2UtcmVtb3ZlJywgJy0tJywgcGF0aF0pCisKKyAgICBpZiB1cGRhdGVXZDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQgYW5kIGUuZXJybm8gIT0gZXJybm8uRUlTRElSOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZWRpcnMob3MucGF0aC5kaXJuYW1lKHBhdGgpKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworZGVmIHVuaXF1ZVBhdGgocGF0aCwgYnJhbmNoKToKKyAgICBkZWYgZmlsZUV4aXN0cyhwYXRoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubHN0YXQocGF0aCkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBicmFuY2ggPSBicmFuY2gucmVwbGFjZSgnLycsICdfJykKKyAgICBuZXdQYXRoID0gcGF0aCArICd+JyArIGJyYW5jaAorICAgIHN1ZmZpeCA9IDAKKyAgICB3aGlsZSBuZXdQYXRoIGluIGN1cnJlbnRGaWxlU2V0IG9yIFwKKyAgICAgICAgICBuZXdQYXRoIGluIGN1cnJlbnREaXJlY3RvcnlTZXQgIG9yIFwKKyAgICAgICAgICBmaWxlRXhpc3RzKG5ld1BhdGgpOgorICAgICAgICBzdWZmaXggKz0gMQorICAgICAgICBuZXdQYXRoID0gcGF0aCArICd+JyArIGJyYW5jaCArICdfJyArIHN0cihzdWZmaXgpCisgICAgY3VycmVudEZpbGVTZXQuYWRkKG5ld1BhdGgpCisgICAgcmV0dXJuIG5ld1BhdGgKKworIyBDYWNoZSBlbnRyeSBtYW5hZ2VtZW50CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQ2FjaGVFbnRyeToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgIGNsYXNzIFN0YWdlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuc2hhMSA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSBOb25lCisKKyAgICAgICAgICAgICMgVXNlZCBmb3IgZGVidWdnaW5nIG9ubHkKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubW9kZSAhPSBOb25lOgorICAgICAgICAgICAgICAgICAgICBtID0gJzAlbycgJSBzZWxmLm1vZGUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtID0gJ05vbmUnCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNoYTE6CisgICAgICAgICAgICAgICAgICAgIHNoYTEgPSBzZWxmLnNoYTEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzaGExID0gJ05vbmUnCisgICAgICAgICAgICAgICAgcmV0dXJuICdzaGExOiAnICsgc2hhMSArICcgbW9kZTogJyArIG0KKyAgICAgICAgCisgICAgICAgIHNlbGYuc3RhZ2VzID0gW1N0YWdlKCksIFN0YWdlKCksIFN0YWdlKCksIFN0YWdlKCldCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5wcm9jZXNzZWQgPSBGYWxzZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAncGF0aDogJyArIHNlbGYucGF0aCArICcgc3RhZ2VzOiAnICsgcmVwcihbc3RyKHgpIGZvciB4IGluIHNlbGYuc3RhZ2VzXSkKKworY2xhc3MgQ2FjaGVFbnRyeUNvbnRhaW5lcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZW50cmllcyA9IHt9CisKKyAgICBkZWYgYWRkKHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi5lbnRyaWVzW2VudHJ5LnBhdGhdID0gZW50cnkKKworICAgIGRlZiBnZXQoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmLmVudHJpZXMuZ2V0KHBhdGgpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVudHJpZXMuaXRlcnZhbHVlcygpCisgICAgCit1bm1lcmdlZFJFID0gcmUuY29tcGlsZShyJ14oWzAtN10rKSAoWzAtOWEtZl17NDB9KSAoWzEtM10pXHQoLiopJCcsIHJlLlMpCitkZWYgdW5tZXJnZWRDYWNoZUVudHJpZXMoKToKKyAgICAnJydDcmVhdGUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZmlsZSBuYW1lcyB0byBDYWNoZUVudHJ5CisgICAgb2JqZWN0cy4gVGhlIGRpY3Rpb25hcnkgY29udGFpbnMgb25lIGVudHJ5IGZvciBldmVyeSBwYXRoIHdpdGggYQorICAgIG5vbi16ZXJvIHN0YWdlIGVudHJ5LicnJworCisgICAgbGluZXMgPSBydW5Qcm9ncmFtKFsnZ2l0LWxzLWZpbGVzJywgJy16JywgJy0tdW5tZXJnZWQnXSkuc3BsaXQoJ1wwJykKKyAgICBsaW5lcy5wb3AoKQorCisgICAgcmVzID0gQ2FjaGVFbnRyeUNvbnRhaW5lcigpCisgICAgZm9yIGwgaW4gbGluZXM6CisgICAgICAgIG0gPSB1bm1lcmdlZFJFLm1hdGNoKGwpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBtb2RlID0gaW50KG0uZ3JvdXAoMSksIDgpCisgICAgICAgICAgICBzaGExID0gbS5ncm91cCgyKQorICAgICAgICAgICAgc3RhZ2UgPSBpbnQobS5ncm91cCgzKSkKKyAgICAgICAgICAgIHBhdGggPSBtLmdyb3VwKDQpCisKKyAgICAgICAgICAgIGUgPSByZXMuZ2V0KHBhdGgpCisgICAgICAgICAgICBpZiBub3QgZToKKyAgICAgICAgICAgICAgICBlID0gQ2FjaGVFbnRyeShwYXRoKQorICAgICAgICAgICAgICAgIHJlcy5hZGQoZSkKKworICAgICAgICAgICAgZS5zdGFnZXNbc3RhZ2VdLm1vZGUgPSBtb2RlCisgICAgICAgICAgICBlLnN0YWdlc1tzdGFnZV0uc2hhMSA9IHNoYTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpZSgnRXJyb3I6IE1lcmdlIHByb2dyYW0gZmFpbGVkOiBVbmV4cGVjdGVkIG91dHB1dCBmcm9tJywKKyAgICAgICAgICAgICAgICAnZ2l0LWxzLWZpbGVzOicsIGwpCisgICAgcmV0dXJuIHJlcworCitsc1RyZWVSRSA9IHJlLmNvbXBpbGUocideKFswLTddKykgKFxTKykgKFswLTlhLWZdezQwfSlcdCguKilcbiQnLCByZS5TKQorZGVmIGdldENhY2hlRW50cnkocGF0aCwgb3JpZ1RyZWUsIGFUcmVlLCBiVHJlZSk6CisgICAgJycnUmV0dXJucyBhIENhY2hlRW50cnkgb2JqZWN0IHdoaWNoIGRvZXNuJ3QgaGF2ZSB0byBjb3JyZXNwb25kIHRvCisgICAgYSByZWFsIGNhY2hlIGVudHJ5IGluIEdpdCdzIGluZGV4LicnJworICAgIAorICAgIGRlZiBwYXJzZShvdXQpOgorICAgICAgICBpZiBvdXQgPT0gJyc6CisgICAgICAgICAgICByZXR1cm4gW05vbmUsIE5vbmVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtID0gbHNUcmVlUkUubWF0Y2gob3V0KQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgZGllKCdVbmV4cGVjdGVkIG91dHB1dCBmcm9tIGdpdC1scy10cmVlOicsIG91dCkKKyAgICAgICAgICAgIGVsaWYgbS5ncm91cCgyKSA9PSAnYmxvYic6CisgICAgICAgICAgICAgICAgcmV0dXJuIFttLmdyb3VwKDMpLCBpbnQobS5ncm91cCgxKSwgOCldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBbTm9uZSwgTm9uZV0KKworICAgIHJlcyA9IENhY2hlRW50cnkocGF0aCkKKworICAgIFtvU2hhLCBvTW9kZV0gPSBwYXJzZShydW5Qcm9ncmFtKFsnZ2l0LWxzLXRyZWUnLCBvcmlnVHJlZSwgJy0tJywgcGF0aF0pKQorICAgIFthU2hhLCBhTW9kZV0gPSBwYXJzZShydW5Qcm9ncmFtKFsnZ2l0LWxzLXRyZWUnLCBhVHJlZSwgJy0tJywgcGF0aF0pKQorICAgIFtiU2hhLCBiTW9kZV0gPSBwYXJzZShydW5Qcm9ncmFtKFsnZ2l0LWxzLXRyZWUnLCBiVHJlZSwgJy0tJywgcGF0aF0pKQorCisgICAgcmVzLnN0YWdlc1sxXS5zaGExID0gb1NoYQorICAgIHJlcy5zdGFnZXNbMV0ubW9kZSA9IG9Nb2RlCisgICAgcmVzLnN0YWdlc1syXS5zaGExID0gYVNoYQorICAgIHJlcy5zdGFnZXNbMl0ubW9kZSA9IGFNb2RlCisgICAgcmVzLnN0YWdlc1szXS5zaGExID0gYlNoYQorICAgIHJlcy5zdGFnZXNbM10ubW9kZSA9IGJNb2RlCisKKyAgICByZXR1cm4gcmVzCisKKyMgUmVuYW1lIGRldGVjdGlvbiBhbmQgaGFuZGxpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVuYW1lRW50cnk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHNyYywgc3JjU2hhLCBzcmNNb2RlLCBzcmNDYWNoZUVudHJ5LAorICAgICAgICAgICAgICAgICBkc3QsIGRzdFNoYSwgZHN0TW9kZSwgZHN0Q2FjaGVFbnRyeSwKKyAgICAgICAgICAgICAgICAgc2NvcmUpOgorICAgICAgICBzZWxmLnNyY05hbWUgPSBzcmMKKyAgICAgICAgc2VsZi5zcmNTaGEgPSBzcmNTaGEKKyAgICAgICAgc2VsZi5zcmNNb2RlID0gc3JjTW9kZQorICAgICAgICBzZWxmLnNyY0NhY2hlRW50cnkgPSBzcmNDYWNoZUVudHJ5CisgICAgICAgIHNlbGYuZHN0TmFtZSA9IGRzdAorICAgICAgICBzZWxmLmRzdFNoYSA9IGRzdFNoYQorICAgICAgICBzZWxmLmRzdE1vZGUgPSBkc3RNb2RlCisgICAgICAgIHNlbGYuZHN0Q2FjaGVFbnRyeSA9IGRzdENhY2hlRW50cnkKKyAgICAgICAgc2VsZi5zY29yZSA9IHNjb3JlCisKKyAgICAgICAgc2VsZi5wcm9jZXNzZWQgPSBGYWxzZQorCitjbGFzcyBSZW5hbWVFbnRyeUNvbnRhaW5lcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZW50cmllc1NyYyA9IHt9CisgICAgICAgIHNlbGYuZW50cmllc0RzdCA9IHt9CisKKyAgICBkZWYgYWRkKHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi5lbnRyaWVzU3JjW2VudHJ5LnNyY05hbWVdID0gZW50cnkKKyAgICAgICAgc2VsZi5lbnRyaWVzRHN0W2VudHJ5LmRzdE5hbWVdID0gZW50cnkKKworICAgIGRlZiBnZXRTcmMoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVybiBzZWxmLmVudHJpZXNTcmMuZ2V0KHBhdGgpCisKKyAgICBkZWYgZ2V0RHN0KHNlbGYsIHBhdGgpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRyaWVzRHN0LmdldChwYXRoKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRyaWVzU3JjLml0ZXJ2YWx1ZXMoKQorCitwYXJzZURpZmZSZW5hbWVzUkUgPSByZS5jb21waWxlKCdeOihbMC03XSspIChbMC03XSspIChbMC05YS1mXXs0MH0pIChbMC05YS1mXXs0MH0pIFIoWzAtOV0qKSQnKQorZGVmIGdldFJlbmFtZXModHJlZSwgb1RyZWUsIGFUcmVlLCBiVHJlZSwgY2FjaGVFbnRyaWVzKToKKyAgICAnJydHZXQgaW5mb3JtYXRpb24gb2YgYWxsIHJlbmFtZXMgd2hpY2ggb2NjdXJlZCBiZXR3ZWVuICdvVHJlZScgYW5kCisgICAgJ3RyZWUnLiBXZSBuZWVkIHRoZSB0aHJlZSB0cmVlcyBpbiB0aGUgbWVyZ2UgKCdvVHJlZScsICdhVHJlZScgYW5kCisgICAgJ2JUcmVlJykgdG8gYmUgYWJsZSB0byBhc3NvY2lhdGUgdGhlIGNvcnJlY3QgY2FjaGUgZW50cmllcyB3aXRoCisgICAgdGhlIHJlbmFtZSBpbmZvcm1hdGlvbi4gJ3RyZWUnIGlzIGFsd2F5cyBlcXVhbCB0byBlaXRoZXIgYVRyZWUgb3IgYlRyZWUuJycnCisKKyAgICBhc3NlcnQodHJlZSA9PSBhVHJlZSBvciB0cmVlID09IGJUcmVlKQorICAgIGlucCA9IHJ1blByb2dyYW0oWydnaXQtZGlmZi10cmVlJywgJy1NJywgJy0tZGlmZi1maWx0ZXI9UicsICctcicsCisgICAgICAgICAgICAgICAgICAgICAgJy16Jywgb1RyZWUsIHRyZWVdKQorCisgICAgcmV0ID0gUmVuYW1lRW50cnlDb250YWluZXIoKQorICAgIHRyeToKKyAgICAgICAgcmVjcyA9IGlucC5zcGxpdCgiXDAiKQorICAgICAgICByZWNzLnBvcCgpICMgcmVtb3ZlIGxhc3QgZW50cnkgKHdoaWNoIGlzICcnKQorICAgICAgICBpdCA9IHJlY3MuX19pdGVyX18oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgcmVjID0gaXQubmV4dCgpCisgICAgICAgICAgICBtID0gcGFyc2VEaWZmUmVuYW1lc1JFLm1hdGNoKHJlYykKKworICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgZGllKCdVbmV4cGVjdGVkIG91dHB1dCBmcm9tIGdpdC1kaWZmLXRyZWU6JywgcmVjKQorCisgICAgICAgICAgICBzcmNNb2RlID0gaW50KG0uZ3JvdXAoMSksIDgpCisgICAgICAgICAgICBkc3RNb2RlID0gaW50KG0uZ3JvdXAoMiksIDgpCisgICAgICAgICAgICBzcmNTaGEgPSBtLmdyb3VwKDMpCisgICAgICAgICAgICBkc3RTaGEgPSBtLmdyb3VwKDQpCisgICAgICAgICAgICBzY29yZSA9IG0uZ3JvdXAoNSkKKyAgICAgICAgICAgIHNyYyA9IGl0Lm5leHQoKQorICAgICAgICAgICAgZHN0ID0gaXQubmV4dCgpCisKKyAgICAgICAgICAgIHNyY0NhY2hlRW50cnkgPSBjYWNoZUVudHJpZXMuZ2V0KHNyYykKKyAgICAgICAgICAgIGlmIG5vdCBzcmNDYWNoZUVudHJ5OgorICAgICAgICAgICAgICAgIHNyY0NhY2hlRW50cnkgPSBnZXRDYWNoZUVudHJ5KHNyYywgb1RyZWUsIGFUcmVlLCBiVHJlZSkKKyAgICAgICAgICAgICAgICBjYWNoZUVudHJpZXMuYWRkKHNyY0NhY2hlRW50cnkpCisKKyAgICAgICAgICAgIGRzdENhY2hlRW50cnkgPSBjYWNoZUVudHJpZXMuZ2V0KGRzdCkKKyAgICAgICAgICAgIGlmIG5vdCBkc3RDYWNoZUVudHJ5OgorICAgICAgICAgICAgICAgIGRzdENhY2hlRW50cnkgPSBnZXRDYWNoZUVudHJ5KGRzdCwgb1RyZWUsIGFUcmVlLCBiVHJlZSkKKyAgICAgICAgICAgICAgICBjYWNoZUVudHJpZXMuYWRkKGRzdENhY2hlRW50cnkpCisKKyAgICAgICAgICAgIHJldC5hZGQoUmVuYW1lRW50cnkoc3JjLCBzcmNTaGEsIHNyY01vZGUsIHNyY0NhY2hlRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0U2hhLCBkc3RNb2RlLCBkc3RDYWNoZUVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSkpCisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcmV0CisKK2RlZiBmbXRSZW5hbWUoc3JjLCBkc3QpOgorICAgIHNyY1BhdGggPSBzcmMuc3BsaXQoJy8nKQorICAgIGRzdFBhdGggPSBkc3Quc3BsaXQoJy8nKQorICAgIHBhdGggPSBbXQorICAgIGVuZEluZGV4ID0gbWluKGxlbihzcmNQYXRoKSwgbGVuKGRzdFBhdGgpKSAtIDEKKyAgICBmb3IgeCBpbiByYW5nZSgwLCBlbmRJbmRleCk6CisgICAgICAgIGlmIHNyY1BhdGhbeF0gPT0gZHN0UGF0aFt4XToKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKHNyY1BhdGhbeF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmRJbmRleCA9IHgKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICBpZiBsZW4ocGF0aCkgPiAwOgorICAgICAgICByZXR1cm4gJy8nLmpvaW4ocGF0aCkgKyBcCisgICAgICAgICAgICAgICAnL3snICsgJy8nLmpvaW4oc3JjUGF0aFtlbmRJbmRleDpdKSArICcgPT4gJyArIFwKKyAgICAgICAgICAgICAgICcvJy5qb2luKGRzdFBhdGhbZW5kSW5kZXg6XSkgKyAnfScKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gc3JjICsgJyA9PiAnICsgZHN0CisKK2RlZiBwcm9jZXNzUmVuYW1lcyhyZW5hbWVzQSwgcmVuYW1lc0IsIGJyYW5jaE5hbWVBLCBicmFuY2hOYW1lQik6CisgICAgc3JjTmFtZXMgPSBTZXQoKQorICAgIGZvciB4IGluIHJlbmFtZXNBOgorICAgICAgICBzcmNOYW1lcy5hZGQoeC5zcmNOYW1lKQorICAgIGZvciB4IGluIHJlbmFtZXNCOgorICAgICAgICBzcmNOYW1lcy5hZGQoeC5zcmNOYW1lKQorCisgICAgY2xlYW5NZXJnZSA9IFRydWUKKyAgICBmb3IgcGF0aCBpbiBzcmNOYW1lczoKKyAgICAgICAgaWYgcmVuYW1lc0EuZ2V0U3JjKHBhdGgpOgorICAgICAgICAgICAgcmVuYW1lczEgPSByZW5hbWVzQQorICAgICAgICAgICAgcmVuYW1lczIgPSByZW5hbWVzQgorICAgICAgICAgICAgYnJhbmNoTmFtZTEgPSBicmFuY2hOYW1lQQorICAgICAgICAgICAgYnJhbmNoTmFtZTIgPSBicmFuY2hOYW1lQgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVuYW1lczEgPSByZW5hbWVzQgorICAgICAgICAgICAgcmVuYW1lczIgPSByZW5hbWVzQQorICAgICAgICAgICAgYnJhbmNoTmFtZTEgPSBicmFuY2hOYW1lQgorICAgICAgICAgICAgYnJhbmNoTmFtZTIgPSBicmFuY2hOYW1lQQorICAgICAgICAKKyAgICAgICAgcmVuMSA9IHJlbmFtZXMxLmdldFNyYyhwYXRoKQorICAgICAgICByZW4yID0gcmVuYW1lczIuZ2V0U3JjKHBhdGgpCisKKyAgICAgICAgcmVuMS5kc3RDYWNoZUVudHJ5LnByb2Nlc3NlZCA9IFRydWUKKyAgICAgICAgcmVuMS5zcmNDYWNoZUVudHJ5LnByb2Nlc3NlZCA9IFRydWUKKworICAgICAgICBpZiByZW4xLnByb2Nlc3NlZDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgcmVuMS5wcm9jZXNzZWQgPSBUcnVlCisKKyAgICAgICAgaWYgcmVuMjoKKyAgICAgICAgICAgICMgUmVuYW1lZCBpbiAxIGFuZCByZW5hbWVkIGluIDIKKyAgICAgICAgICAgIGFzc2VydChyZW4xLnNyY05hbWUgPT0gcmVuMi5zcmNOYW1lKQorICAgICAgICAgICAgcmVuMi5kc3RDYWNoZUVudHJ5LnByb2Nlc3NlZCA9IFRydWUKKyAgICAgICAgICAgIHJlbjIucHJvY2Vzc2VkID0gVHJ1ZQorCisgICAgICAgICAgICBpZiByZW4xLmRzdE5hbWUgIT0gcmVuMi5kc3ROYW1lOgorICAgICAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKHJlbmFtZS9yZW5hbWUpOiBSZW5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgICBmbXRSZW5hbWUocGF0aCwgcmVuMS5kc3ROYW1lKSwgJ2luIGJyYW5jaCcsIGJyYW5jaE5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAncmVuYW1lJywgZm10UmVuYW1lKHBhdGgsIHJlbjIuZHN0TmFtZSksICdpbicsCisgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgIGNsZWFuTWVyZ2UgPSBGYWxzZQorCisgICAgICAgICAgICAgICAgaWYgcmVuMS5kc3ROYW1lIGluIGN1cnJlbnREaXJlY3RvcnlTZXQ6CisgICAgICAgICAgICAgICAgICAgIGRzdE5hbWUxID0gdW5pcXVlUGF0aChyZW4xLmRzdE5hbWUsIGJyYW5jaE5hbWUxKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXQocmVuMS5kc3ROYW1lLCAnaXMgYSBkaXJlY3RvcnkgaW4nLCBicmFuY2hOYW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRpbmcgYXMnLCBkc3ROYW1lMSwgJ2luc3RlYWQuJykKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRmlsZShGYWxzZSwgcmVuMS5kc3ROYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRzdE5hbWUxID0gcmVuMS5kc3ROYW1lCisKKyAgICAgICAgICAgICAgICBpZiByZW4yLmRzdE5hbWUgaW4gY3VycmVudERpcmVjdG9yeVNldDoKKyAgICAgICAgICAgICAgICAgICAgZHN0TmFtZTIgPSB1bmlxdWVQYXRoKHJlbjIuZHN0TmFtZSwgYnJhbmNoTmFtZTIpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dChyZW4yLmRzdE5hbWUsICdpcyBhIGRpcmVjdG9yeSBpbicsIGJyYW5jaE5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGluZyBhcycsIGRzdE5hbWUyLCAnaW5zdGVhZC4nKQorICAgICAgICAgICAgICAgICAgICByZW1vdmVGaWxlKEZhbHNlLCByZW4yLmRzdE5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZHN0TmFtZTIgPSByZW4yLmRzdE5hbWUKKyAgICAgICAgICAgICAgICBzZXRJbmRleFN0YWdlcyhkc3ROYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjEuZHN0U2hhLCByZW4xLmRzdE1vZGUsCisJCQkgICAgICAgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzZXRJbmRleFN0YWdlcyhkc3ROYW1lMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuMi5kc3RTaGEsIHJlbjIuZHN0TW9kZSkKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZW1vdmVGaWxlKFRydWUsIHJlbjEuc3JjTmFtZSkKKworICAgICAgICAgICAgICAgIFtyZXNTaGEsIHJlc01vZGUsIGNsZWFuLCBtZXJnZV0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VGaWxlKHJlbjEuc3JjTmFtZSwgcmVuMS5zcmNTaGEsIHJlbjEuc3JjTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuMS5kc3ROYW1lLCByZW4xLmRzdFNoYSwgcmVuMS5kc3RNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW4yLmRzdE5hbWUsIHJlbjIuZHN0U2hhLCByZW4yLmRzdE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaE5hbWUxLCBicmFuY2hOYW1lMikKKworICAgICAgICAgICAgICAgIGlmIG1lcmdlIG9yIG5vdCBjbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCdSZW5hbWluZycsIGZtdFJlbmFtZShwYXRoLCByZW4xLmRzdE5hbWUpKQorCisgICAgICAgICAgICAgICAgaWYgbWVyZ2U6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCgnQXV0by1tZXJnaW5nJywgcmVuMS5kc3ROYW1lKQorCisgICAgICAgICAgICAgICAgaWYgbm90IGNsZWFuOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChjb250ZW50KTogbWVyZ2UgY29uZmxpY3QgaW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuMS5kc3ROYW1lKQorICAgICAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKworICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2FjaGVPbmx5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5kZXhTdGFnZXMocmVuMS5kc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuMS5zcmNTaGEsIHJlbjEuc3JjTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjEuZHN0U2hhLCByZW4xLmRzdE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW4yLmRzdFNoYSwgcmVuMi5kc3RNb2RlKQorCisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZShjbGVhbiwgcmVzU2hhLCByZXNNb2RlLCByZW4xLmRzdE5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZW1vdmVGaWxlKFRydWUsIHJlbjEuc3JjTmFtZSkKKworICAgICAgICAgICAgIyBSZW5hbWVkIGluIDEsIG1heWJlIGNoYW5nZWQgaW4gMgorICAgICAgICAgICAgaWYgcmVuYW1lc0EgPT0gcmVuYW1lczE6CisgICAgICAgICAgICAgICAgc3RhZ2UgPSAzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YWdlID0gMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc3JjU2hhT3RoZXJCcmFuY2ggID0gcmVuMS5zcmNDYWNoZUVudHJ5LnN0YWdlc1tzdGFnZV0uc2hhMQorICAgICAgICAgICAgc3JjTW9kZU90aGVyQnJhbmNoID0gcmVuMS5zcmNDYWNoZUVudHJ5LnN0YWdlc1tzdGFnZV0ubW9kZQorCisgICAgICAgICAgICBkc3RTaGFPdGhlckJyYW5jaCAgPSByZW4xLmRzdENhY2hlRW50cnkuc3RhZ2VzW3N0YWdlXS5zaGExCisgICAgICAgICAgICBkc3RNb2RlT3RoZXJCcmFuY2ggPSByZW4xLmRzdENhY2hlRW50cnkuc3RhZ2VzW3N0YWdlXS5tb2RlCisKKyAgICAgICAgICAgIHRyeU1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgcmVuMS5kc3ROYW1lIGluIGN1cnJlbnREaXJlY3RvcnlTZXQ6CisgICAgICAgICAgICAgICAgbmV3UGF0aCA9IHVuaXF1ZVBhdGgocmVuMS5kc3ROYW1lLCBicmFuY2hOYW1lMSkKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChyZW5hbWUvZGlyZWN0b3J5KTogUmVuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgZm10UmVuYW1lKHJlbjEuc3JjTmFtZSwgcmVuMS5kc3ROYW1lKSwgJ2luJywgYnJhbmNoTmFtZTEsCisgICAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RvcnknLCByZW4xLmRzdE5hbWUsICdhZGRlZCBpbicsIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgIG91dHB1dCgnUmVuYW1pbmcnLCByZW4xLnNyY05hbWUsICd0bycsIG5ld1BhdGgsICdpbnN0ZWFkJykKKyAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgICAgICByZW1vdmVGaWxlKEZhbHNlLCByZW4xLmRzdE5hbWUpCisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgcmVuMS5kc3RTaGEsIHJlbjEuZHN0TW9kZSwgbmV3UGF0aCkKKyAgICAgICAgICAgIGVsaWYgc3JjU2hhT3RoZXJCcmFuY2ggPT0gTm9uZToKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChyZW5hbWUvZGVsZXRlKTogUmVuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgZm10UmVuYW1lKHJlbjEuc3JjTmFtZSwgcmVuMS5kc3ROYW1lKSwgJ2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoTmFtZTEsICdhbmQgZGVsZXRlZCBpbicsIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgIGNsZWFuTWVyZ2UgPSBGYWxzZQorICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGUoRmFsc2UsIHJlbjEuZHN0U2hhLCByZW4xLmRzdE1vZGUsIHJlbjEuZHN0TmFtZSkKKyAgICAgICAgICAgIGVsaWYgZHN0U2hhT3RoZXJCcmFuY2g6CisgICAgICAgICAgICAgICAgbmV3UGF0aCA9IHVuaXF1ZVBhdGgocmVuMS5kc3ROYW1lLCBicmFuY2hOYW1lMikKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChyZW5hbWUvYWRkKTogUmVuYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgZm10UmVuYW1lKHJlbjEuc3JjTmFtZSwgcmVuMS5kc3ROYW1lKSwgJ2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoTmFtZTEgKyAnLicsIHJlbjEuZHN0TmFtZSwgJ2FkZGVkIGluJywgYnJhbmNoTmFtZTIpCisgICAgICAgICAgICAgICAgb3V0cHV0KCdBZGRpbmcgYXMnLCBuZXdQYXRoLCAnaW5zdGVhZCcpCisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZShGYWxzZSwgZHN0U2hhT3RoZXJCcmFuY2gsIGRzdE1vZGVPdGhlckJyYW5jaCwgbmV3UGF0aCkKKyAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgICAgICB0cnlNZXJnZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgcmVuYW1lczIuZ2V0RHN0KHJlbjEuZHN0TmFtZSk6CisgICAgICAgICAgICAgICAgZHN0MiA9IHJlbmFtZXMyLmdldERzdChyZW4xLmRzdE5hbWUpCisgICAgICAgICAgICAgICAgbmV3UGF0aDEgPSB1bmlxdWVQYXRoKHJlbjEuZHN0TmFtZSwgYnJhbmNoTmFtZTEpCisgICAgICAgICAgICAgICAgbmV3UGF0aDIgPSB1bmlxdWVQYXRoKGRzdDIuZHN0TmFtZSwgYnJhbmNoTmFtZTIpCisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAocmVuYW1lL3JlbmFtZSk6IFJlbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgIGZtdFJlbmFtZShyZW4xLnNyY05hbWUsIHJlbjEuZHN0TmFtZSksICdpbicsCisgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaE5hbWUxKycuIFJlbmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgIGZtdFJlbmFtZShkc3QyLnNyY05hbWUsIGRzdDIuZHN0TmFtZSksICdpbicsIGJyYW5jaE5hbWUyKQorICAgICAgICAgICAgICAgIG91dHB1dCgnUmVuYW1pbmcnLCByZW4xLnNyY05hbWUsICd0bycsIG5ld1BhdGgxLCAnYW5kJywKKyAgICAgICAgICAgICAgICAgICAgICAgZHN0Mi5zcmNOYW1lLCAndG8nLCBuZXdQYXRoMiwgJ2luc3RlYWQnKQorICAgICAgICAgICAgICAgIHJlbW92ZUZpbGUoRmFsc2UsIHJlbjEuZHN0TmFtZSkKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCByZW4xLmRzdFNoYSwgcmVuMS5kc3RNb2RlLCBuZXdQYXRoMSkKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBkc3QyLmRzdFNoYSwgZHN0Mi5kc3RNb2RlLCBuZXdQYXRoMikKKyAgICAgICAgICAgICAgICBkc3QyLnByb2Nlc3NlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5TWVyZ2UgPSBUcnVlCisKKyAgICAgICAgICAgIGlmIHRyeU1lcmdlOgorCisgICAgICAgICAgICAgICAgb05hbWUsIG9TSEExLCBvTW9kZSA9IHJlbjEuc3JjTmFtZSwgcmVuMS5zcmNTaGEsIHJlbjEuc3JjTW9kZQorICAgICAgICAgICAgICAgIGFOYW1lLCBiTmFtZSA9IHJlbjEuZHN0TmFtZSwgcmVuMS5zcmNOYW1lCisgICAgICAgICAgICAgICAgYVNIQTEsIGJTSEExID0gcmVuMS5kc3RTaGEsIHNyY1NoYU90aGVyQnJhbmNoCisgICAgICAgICAgICAgICAgYU1vZGUsIGJNb2RlID0gcmVuMS5kc3RNb2RlLCBzcmNNb2RlT3RoZXJCcmFuY2gKKyAgICAgICAgICAgICAgICBhQnJhbmNoLCBiQnJhbmNoID0gYnJhbmNoTmFtZTEsIGJyYW5jaE5hbWUyCisKKyAgICAgICAgICAgICAgICBpZiByZW5hbWVzQSAhPSByZW5hbWVzMToKKyAgICAgICAgICAgICAgICAgICAgYU5hbWUsIGJOYW1lID0gYk5hbWUsIGFOYW1lCisgICAgICAgICAgICAgICAgICAgIGFTSEExLCBiU0hBMSA9IGJTSEExLCBhU0hBMQorICAgICAgICAgICAgICAgICAgICBhTW9kZSwgYk1vZGUgPSBiTW9kZSwgYU1vZGUKKyAgICAgICAgICAgICAgICAgICAgYUJyYW5jaCwgYkJyYW5jaCA9IGJCcmFuY2gsIGFCcmFuY2gKKworICAgICAgICAgICAgICAgIFtyZXNTaGEsIHJlc01vZGUsIGNsZWFuLCBtZXJnZV0gPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VGaWxlKG9OYW1lLCBvU0hBMSwgb01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lLCBhU0hBMSwgYU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJOYW1lLCBiU0hBMSwgYk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFCcmFuY2gsIGJCcmFuY2gpOworCisgICAgICAgICAgICAgICAgaWYgbWVyZ2Ugb3Igbm90IGNsZWFuOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQoJ1JlbmFtaW5nJywgZm10UmVuYW1lKHJlbjEuc3JjTmFtZSwgcmVuMS5kc3ROYW1lKSkKKworICAgICAgICAgICAgICAgIGlmIG1lcmdlOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQoJ0F1dG8tbWVyZ2luZycsIHJlbjEuZHN0TmFtZSkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBjbGVhbjoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAocmVuYW1lL21vZGlmeSk6IE1lcmdlIGNvbmZsaWN0IGluJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbjEuZHN0TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNhY2hlT25seToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEluZGV4U3RhZ2VzKHJlbjEuZHN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9TSEExLCBvTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFTSEExLCBhTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTSEExLCBiTW9kZSkKKworICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGUoY2xlYW4sIHJlc1NoYSwgcmVzTW9kZSwgcmVuMS5kc3ROYW1lKQorCisgICAgcmV0dXJuIGNsZWFuTWVyZ2UKKworIyBQZXIgZW50cnkgbWVyZ2UgZnVuY3Rpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBwcm9jZXNzRW50cnkoZW50cnksIGJyYW5jaDFOYW1lLCBicmFuY2gyTmFtZSk6CisgICAgJycnTWVyZ2Ugb25lIGNhY2hlIGVudHJ5LicnJworCisgICAgZGVidWcoJ3Byb2Nlc3NpbmcnLCBlbnRyeS5wYXRoLCAnY2xlYW4gY2FjaGU6JywgY2FjaGVPbmx5KQorCisgICAgY2xlYW5NZXJnZSA9IFRydWUKKworICAgIHBhdGggPSBlbnRyeS5wYXRoCisgICAgb1NoYSA9IGVudHJ5LnN0YWdlc1sxXS5zaGExCisgICAgb01vZGUgPSBlbnRyeS5zdGFnZXNbMV0ubW9kZQorICAgIGFTaGEgPSBlbnRyeS5zdGFnZXNbMl0uc2hhMQorICAgIGFNb2RlID0gZW50cnkuc3RhZ2VzWzJdLm1vZGUKKyAgICBiU2hhID0gZW50cnkuc3RhZ2VzWzNdLnNoYTEKKyAgICBiTW9kZSA9IGVudHJ5LnN0YWdlc1szXS5tb2RlCisKKyAgICBhc3NlcnQob1NoYSA9PSBOb25lIG9yIGlzU2hhKG9TaGEpKQorICAgIGFzc2VydChhU2hhID09IE5vbmUgb3IgaXNTaGEoYVNoYSkpCisgICAgYXNzZXJ0KGJTaGEgPT0gTm9uZSBvciBpc1NoYShiU2hhKSkKKworICAgIGFzc2VydChvTW9kZSA9PSBOb25lIG9yIHR5cGUob01vZGUpIGlzIGludCkKKyAgICBhc3NlcnQoYU1vZGUgPT0gTm9uZSBvciB0eXBlKGFNb2RlKSBpcyBpbnQpCisgICAgYXNzZXJ0KGJNb2RlID09IE5vbmUgb3IgdHlwZShiTW9kZSkgaXMgaW50KQorCisgICAgaWYgKG9TaGEgYW5kIChub3QgYVNoYSBvciBub3QgYlNoYSkpOgorICAgICMKKyAgICAjIENhc2UgQTogRGVsZXRlZCBpbiBvbmUKKyAgICAjCisgICAgICAgIGlmIChub3QgYVNoYSAgICAgYW5kIG5vdCBiU2hhKSBvciBcCisgICAgICAgICAgIChhU2hhID09IG9TaGEgYW5kIG5vdCBiU2hhKSBvciBcCisgICAgICAgICAgIChub3QgYVNoYSAgICAgYW5kIGJTaGEgPT0gb1NoYSk6CisgICAgIyBEZWxldGVkIGluIGJvdGggb3IgZGVsZXRlZCBpbiBvbmUgYW5kIHVuY2hhbmdlZCBpbiB0aGUgb3RoZXIKKyAgICAgICAgICAgIGlmIGFTaGE6CisgICAgICAgICAgICAgICAgb3V0cHV0KCdSZW1vdmluZycsIHBhdGgpCisgICAgICAgICAgICByZW1vdmVGaWxlKFRydWUsIHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgIyBEZWxldGVkIGluIG9uZSBhbmQgY2hhbmdlZCBpbiB0aGUgb3RoZXIKKyAgICAgICAgICAgIGNsZWFuTWVyZ2UgPSBGYWxzZQorICAgICAgICAgICAgaWYgbm90IGFTaGE6CisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVCAoZGVsZXRlL21vZGlmeSk6JywgcGF0aCwgJ2RlbGV0ZWQgaW4nLAorICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gxTmFtZSwgJ2FuZCBtb2RpZmllZCBpbicsIGJyYW5jaDJOYW1lICsgJy4nLAorICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbicsIGJyYW5jaDJOYW1lLCAnb2YnLCBwYXRoLCAnbGVmdCBpbiB0cmVlLicpCisgICAgICAgICAgICAgICAgbW9kZSA9IGJNb2RlCisgICAgICAgICAgICAgICAgc2hhID0gYlNoYQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdXRwdXQoJ0NPTkZMSUNUIChtb2RpZnkvZGVsZXRlKTonLCBwYXRoLCAnZGVsZXRlZCBpbicsCisgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaDJOYW1lLCAnYW5kIG1vZGlmaWVkIGluJywgYnJhbmNoMU5hbWUgKyAnLicsCisgICAgICAgICAgICAgICAgICAgICAgICdWZXJzaW9uJywgYnJhbmNoMU5hbWUsICdvZicsIHBhdGgsICdsZWZ0IGluIHRyZWUuJykKKyAgICAgICAgICAgICAgICBtb2RlID0gYU1vZGUKKyAgICAgICAgICAgICAgICBzaGEgPSBhU2hhCisKKyAgICAgICAgICAgIHVwZGF0ZUZpbGUoRmFsc2UsIHNoYSwgbW9kZSwgcGF0aCkKKworICAgIGVsaWYgKG5vdCBvU2hhIGFuZCBhU2hhICAgICBhbmQgbm90IGJTaGEpIG9yIFwKKyAgICAgICAgIChub3Qgb1NoYSBhbmQgbm90IGFTaGEgYW5kIGJTaGEpOgorICAgICMKKyAgICAjIENhc2UgQjogQWRkZWQgaW4gb25lLgorICAgICMKKyAgICAgICAgaWYgYVNoYToKKyAgICAgICAgICAgIGFkZEJyYW5jaCA9IGJyYW5jaDFOYW1lCisgICAgICAgICAgICBvdGhlckJyYW5jaCA9IGJyYW5jaDJOYW1lCisgICAgICAgICAgICBtb2RlID0gYU1vZGUKKyAgICAgICAgICAgIHNoYSA9IGFTaGEKKyAgICAgICAgICAgIGNvbmYgPSAnZmlsZS9kaXJlY3RvcnknCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhZGRCcmFuY2ggPSBicmFuY2gyTmFtZQorICAgICAgICAgICAgb3RoZXJCcmFuY2ggPSBicmFuY2gxTmFtZQorICAgICAgICAgICAgbW9kZSA9IGJNb2RlCisgICAgICAgICAgICBzaGEgPSBiU2hhCisgICAgICAgICAgICBjb25mID0gJ2RpcmVjdG9yeS9maWxlJworICAgIAorICAgICAgICBpZiBwYXRoIGluIGN1cnJlbnREaXJlY3RvcnlTZXQ6CisgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgIG5ld1BhdGggPSB1bmlxdWVQYXRoKHBhdGgsIGFkZEJyYW5jaCkKKyAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKCcgKyBjb25mICsgJyk6JywKKyAgICAgICAgICAgICAgICAgICAnVGhlcmUgaXMgYSBkaXJlY3Rvcnkgd2l0aCBuYW1lJywgcGF0aCwgJ2luJywKKyAgICAgICAgICAgICAgICAgICBvdGhlckJyYW5jaCArICcuIEFkZGluZycsIHBhdGgsICdhcycsIG5ld1BhdGgpCisKKyAgICAgICAgICAgIHJlbW92ZUZpbGUoRmFsc2UsIHBhdGgpCisgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBzaGEsIG1vZGUsIG5ld1BhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQoJ0FkZGluZycsIHBhdGgpCisgICAgICAgICAgICB1cGRhdGVGaWxlKFRydWUsIHNoYSwgbW9kZSwgcGF0aCkKKyAgICAKKyAgICBlbGlmIG5vdCBvU2hhIGFuZCBhU2hhIGFuZCBiU2hhOgorICAgICMKKyAgICAjIENhc2UgQzogQWRkZWQgaW4gYm90aCAoY2hlY2sgZm9yIHNhbWUgcGVybWlzc2lvbnMpLgorICAgICMKKyAgICAgICAgaWYgYVNoYSA9PSBiU2hhOgorICAgICAgICAgICAgaWYgYU1vZGUgIT0gYk1vZGU6CisgICAgICAgICAgICAgICAgY2xlYW5NZXJnZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgb3V0cHV0KCdDT05GTElDVDogRmlsZScsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZCBpZGVudGljYWxseSBpbiBib3RoIGJyYW5jaGVzLCBidXQgcGVybWlzc2lvbnMnLAorICAgICAgICAgICAgICAgICAgICAgICAnY29uZmxpY3QnLCAnMCVvJyAlIGFNb2RlLCAnLT4nLCAnMCVvJyAlIGJNb2RlKQorICAgICAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1Q6IGFkZGluZyB3aXRoIHBlcm1pc3Npb246JywgJzAlbycgJSBhTW9kZSkKKworICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGUoRmFsc2UsIGFTaGEsIGFNb2RlLCBwYXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGJ5IGdpdC1yZWFkLXRyZWUKKyAgICAgICAgICAgICAgICBhc3NlcnQoRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgIG5ld1BhdGgxID0gdW5pcXVlUGF0aChwYXRoLCBicmFuY2gxTmFtZSkKKyAgICAgICAgICAgIG5ld1BhdGgyID0gdW5pcXVlUGF0aChwYXRoLCBicmFuY2gyTmFtZSkKKyAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKGFkZC9hZGQpOiBGaWxlJywgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAnYWRkZWQgbm9uLWlkZW50aWNhbGx5IGluIGJvdGggYnJhbmNoZXMuIEFkZGluZyBhcycsCisgICAgICAgICAgICAgICAgICAgbmV3UGF0aDEsICdhbmQnLCBuZXdQYXRoMiwgJ2luc3RlYWQuJykKKyAgICAgICAgICAgIHJlbW92ZUZpbGUoRmFsc2UsIHBhdGgpCisgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBhU2hhLCBhTW9kZSwgbmV3UGF0aDEpCisgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBiU2hhLCBiTW9kZSwgbmV3UGF0aDIpCisKKyAgICBlbGlmIG9TaGEgYW5kIGFTaGEgYW5kIGJTaGE6CisgICAgIworICAgICMgY2FzZSBEOiBNb2RpZmllZCBpbiBib3RoLCBidXQgZGlmZmVyZW50bHkuCisgICAgIworICAgICAgICBvdXRwdXQoJ0F1dG8tbWVyZ2luZycsIHBhdGgpCisgICAgICAgIFtzaGEsIG1vZGUsIGNsZWFuLCBkdW1teV0gPSBcCisgICAgICAgICAgICAgIG1lcmdlRmlsZShwYXRoLCBvU2hhLCBvTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGFTaGEsIGFNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgYlNoYSwgYk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBicmFuY2gxTmFtZSwgYnJhbmNoMk5hbWUpCisgICAgICAgIGlmIGNsZWFuOgorICAgICAgICAgICAgdXBkYXRlRmlsZShUcnVlLCBzaGEsIG1vZGUsIHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbGVhbk1lcmdlID0gRmFsc2UKKyAgICAgICAgICAgIG91dHB1dCgnQ09ORkxJQ1QgKGNvbnRlbnQpOiBNZXJnZSBjb25mbGljdCBpbicsIHBhdGgpCisKKyAgICAgICAgICAgIGlmIGNhY2hlT25seToKKyAgICAgICAgICAgICAgICB1cGRhdGVGaWxlKEZhbHNlLCBzaGEsIG1vZGUsIHBhdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVwZGF0ZUZpbGVFeHQoc2hhLCBtb2RlLCBwYXRoLCB1cGRhdGVDYWNoZT1GYWxzZSwgdXBkYXRlV2Q9VHJ1ZSkKKyAgICBlbHNlOgorICAgICAgICBkaWUoIkVSUk9SOiBGYXRhbCBtZXJnZSBmYWlsdXJlLCBzaG91bGRuJ3QgaGFwcGVuLiIpCisKKyAgICByZXR1cm4gY2xlYW5NZXJnZQorCitkZWYgdXNhZ2UoKToKKyAgICBkaWUoJ1VzYWdlOicsIHN5cy5hcmd2WzBdLCAnIDxiYXNlPi4uLiAtLSA8aGVhZD4gPHJlbW90ZT4uLicpCisKKyMgbWFpbiBlbnRyeSBwb2ludCBhcyBtZXJnZSBzdHJhdGVneSBtb2R1bGUKKyMgVGhlIGZpcnN0IHBhcmFtZXRlcnMgdXAgdG8gLS0gYXJlIG1lcmdlIGJhc2VzLCBhbmQgdGhlIHJlc3QgYXJlIGhlYWRzLgorCitpZiBsZW4oc3lzLmFyZ3YpIDwgNDoKKyAgICB1c2FnZSgpCisKK2Jhc2VzID0gW10KK2ZvciBuZXh0QXJnIGluIHhyYW5nZSgxLCBsZW4oc3lzLmFyZ3YpKToKKyAgICBpZiBzeXMuYXJndltuZXh0QXJnXSA9PSAnLS0nOgorICAgICAgICBpZiBsZW4oc3lzLmFyZ3YpICE9IG5leHRBcmcgKyAzOgorICAgICAgICAgICAgZGllKCdOb3QgaGFuZGxpbmcgYW55dGhpbmcgb3RoZXIgdGhhbiB0d28gaGVhZHMgbWVyZ2UuJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaDEgPSBmaXJzdEJyYW5jaCA9IHN5cy5hcmd2W25leHRBcmcgKyAxXQorICAgICAgICAgICAgaDIgPSBzZWNvbmRCcmFuY2ggPSBzeXMuYXJndltuZXh0QXJnICsgMl0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgYmFzZXMuYXBwZW5kKHN5cy5hcmd2W25leHRBcmddKQorCitwcmludCAnTWVyZ2luZycsIGgxLCAnd2l0aCcsIGgyCisKK3RyeToKKyAgICBoMSA9IHJ1blByb2dyYW0oWydnaXQtcmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgaDEgKyAnXjAnXSkucnN0cmlwKCkKKyAgICBoMiA9IHJ1blByb2dyYW0oWydnaXQtcmV2LXBhcnNlJywgJy0tdmVyaWZ5JywgaDIgKyAnXjAnXSkucnN0cmlwKCkKKworICAgIGlmIGxlbihiYXNlcykgPT0gMToKKyAgICAgICAgYmFzZSA9IHJ1blByb2dyYW0oWydnaXQtcmV2LXBhcnNlJywgJy0tdmVyaWZ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VzWzBdICsgJ14wJ10pLnJzdHJpcCgpCisgICAgICAgIGFuY2VzdG9yID0gQ29tbWl0KGJhc2UsIE5vbmUpCisgICAgICAgIFtkdW1teSwgY2xlYW5dID0gbWVyZ2UoQ29tbWl0KGgxLCBOb25lKSwgQ29tbWl0KGgyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEJyYW5jaCwgc2Vjb25kQnJhbmNoLCBOb25lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yKQorICAgIGVsc2U6CisgICAgICAgIGdyYXBoID0gYnVpbGRHcmFwaChbaDEsIGgyXSkKKyAgICAgICAgW2R1bW15LCBjbGVhbl0gPSBtZXJnZShncmFwaC5zaGFNYXBbaDFdLCBncmFwaC5zaGFNYXBbaDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QnJhbmNoLCBzZWNvbmRCcmFuY2gsIGdyYXBoKQorCisgICAgcHJpbnQgJycKK2V4Y2VwdDoKKyAgICBpZiBpc2luc3RhbmNlKHN5cy5leGNfaW5mbygpWzFdLCBTeXN0ZW1FeGl0KToKKyAgICAgICAgcmFpc2UKKyAgICBlbHNlOgorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKE5vbmUsIHN5cy5zdGRlcnIpCisgICAgICAgIHN5cy5leGl0KDIpCisKK2lmIGNsZWFuOgorICAgIHN5cy5leGl0KDApCitlbHNlOgorICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9naXQtbWVyZ2UtcmVzb2x2ZS5zaCBiL2dpdC1tZXJnZS1yZXNvbHZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhOGVmMjEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtbWVyZ2UtcmVzb2x2ZS5zaApAQCAtMCwwICsxLDU0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IExpbnVzIFRvcnZhbGRzCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworIyBSZXNvbHZlIHR3byB0cmVlcywgdXNpbmcgZW5oYW5jZCBtdWx0aS1iYXNlIHJlYWQtdHJlZS4KKworIyBUaGUgZmlyc3QgcGFyYW1ldGVycyB1cCB0byAtLSBhcmUgbWVyZ2UgYmFzZXM7IHRoZSByZXN0IGFyZSBoZWFkcy4KK2Jhc2VzPSBoZWFkPSByZW1vdGVzPSBzZXBfc2Vlbj0KK2ZvciBhcmcKK2RvCisJY2FzZSAiLCRzZXBfc2VlbiwkaGVhZCwkYXJnLCIgaW4KKwkqLC0tLCkKKwkJc2VwX3NlZW49eWVzCisJCTs7CisJLHllcywsKikKKwkJaGVhZD0kYXJnCisJCTs7CisJLHllcywqKQorCQlyZW1vdGVzPSIkcmVtb3RlcyRhcmcgIgorCQk7OworCSopCisJCWJhc2VzPSIkYmFzZXMkYXJnICIKKwkJOzsKKwllc2FjCitkb25lCisKKyMgR2l2ZSB1cCBpZiB3ZSBhcmUgZ2l2ZW4gbW9yZSB0aGFuIHR3byByZW1vdGVzIC0tIG5vdCBoYW5kbGluZyBvY3RvcHVzLgorY2FzZSAiJHJlbW90ZXMiIGluCis/KicgJz8qKQorCWV4aXQgMiA7OworZXNhYworCisjIEdpdmUgdXAgaWYgdGhpcyBpcyBhIGJhc2VsZXNzIG1lcmdlLgoraWYgdGVzdCAnJyA9ICIkYmFzZXMiCit0aGVuCisJZXhpdCAyCitmaQorCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0LXJlYWQtdHJlZSAtdSAtbSAtLWFnZ3Jlc3NpdmUgJGJhc2VzICRoZWFkICRyZW1vdGVzIHx8IGV4aXQgMgorZWNobyAiVHJ5aW5nIHNpbXBsZSBtZXJnZS4iCitpZiByZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlICAyPi9kZXYvbnVsbCkKK3RoZW4KKwlleGl0IDAKK2Vsc2UKKwllY2hvICJTaW1wbGUgbWVyZ2UgZmFpbGVkLCB0cnlpbmcgQXV0b21hdGljIG1lcmdlLiIKKwlpZiBnaXQtbWVyZ2UtaW5kZXggLW8gZ2l0LW1lcmdlLW9uZS1maWxlIC1hCisJdGhlbgorCQlleGl0IDAKKwllbHNlCisJCWV4aXQgMQorCWZpCitmaQpkaWZmIC0tZ2l0IGEvZ2l0LW1lcmdlLXN0dXBpZC5zaCBiL2dpdC1tZXJnZS1zdHVwaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGZhZWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS1zdHVwaWQuc2gKQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworIyBSZXNvbHZlIHR3byB0cmVlcywgJ3N0dXBpZCBtZXJnZScuCisKKyMgVGhlIGZpcnN0IHBhcmFtZXRlcnMgdXAgdG8gLS0gYXJlIG1lcmdlIGJhc2VzOyB0aGUgcmVzdCBhcmUgaGVhZHMuCitiYXNlcz0gaGVhZD0gcmVtb3Rlcz0gc2VwX3NlZW49Citmb3IgYXJnCitkbworCWNhc2UgIiwkc2VwX3NlZW4sJGhlYWQsJGFyZywiIGluCisJKiwtLSwpCisJCXNlcF9zZWVuPXllcworCQk7OworCSx5ZXMsLCopCisJCWhlYWQ9JGFyZworCQk7OworCSx5ZXMsKikKKwkJcmVtb3Rlcz0iJHJlbW90ZXMkYXJnICIKKwkJOzsKKwkqKQorCQliYXNlcz0iJGJhc2VzJGFyZyAiCisJCTs7CisJZXNhYworZG9uZQorCisjIEdpdmUgdXAgaWYgd2UgYXJlIGdpdmVuIG1vcmUgdGhhbiB0d28gcmVtb3RlcyAtLSBub3QgaGFuZGxpbmcgb2N0b3B1cy4KK2Nhc2UgIiRyZW1vdGVzIiBpbgorPyonICc/KikKKwlleGl0IDIgOzsKK2VzYWMKKworIyBGaW5kIGFuIG9wdGltdW0gbWVyZ2UgYmFzZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBjYW5kaWRhdGVzLgorY2FzZSAiJGJhc2VzIiBpbgorPyonICc/KikKKwllY2hvICJUcnlpbmcgdG8gZmluZCB0aGUgb3B0aW11bSBtZXJnZSBiYXNlLiIKKwlHPS50bXAtaW5kZXgkJAorCWJlc3Q9CisJYmVzdF9jbnQ9LTEKKwlmb3IgYyBpbiAkYmFzZXMKKwlkbworCQlybSAtZiAkRworCQlHSVRfSU5ERVhfRklMRT0kRyBnaXQtcmVhZC10cmVlIC1tICRjICRoZWFkICRyZW1vdGVzIFwKKwkJCSAyPi9kZXYvbnVsbCB8fAljb250aW51ZQorCQkjIENvdW50IHRoZSBwYXRocyB0aGF0IGFyZSB1bm1lcmdlZC4KKwkJY250PWBHSVRfSU5ERVhfRklMRT0kRyBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZCB8IHdjIC1sYAorCQlpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkJdGhlbgorCQkJYmVzdD0kYworCQkJYmVzdF9jbnQ9JGNudAorCQkJaWYgdGVzdCAiJGJlc3RfY250IiAtZXEgMAorCQkJdGhlbgorCQkJCSMgQ2Fubm90IGRvIGFueSBiZXR0ZXIgdGhhbiBhbGwgdHJpdmlhbCBtZXJnZS4KKwkJCQlicmVhaworCQkJZmkKKwkJZmkKKwlkb25lCisJcm0gLWYgJEcKKwljb21tb249IiRiZXN0IgorCTs7CisqKQorCWNvbW1vbj0iJGJhc2VzIgorCTs7Citlc2FjCisKK2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCitnaXQtcmVhZC10cmVlIC11IC1tICRjb21tb24gJGhlYWQgJHJlbW90ZXMgfHwgZXhpdCAyCitlY2hvICJUcnlpbmcgc2ltcGxlIG1lcmdlLiIKK2lmIHJlc3VsdF90cmVlPSQoZ2l0LXdyaXRlLXRyZWUgIDI+L2Rldi9udWxsKQordGhlbgorCWV4aXQgMAorZWxzZQorCWVjaG8gIlNpbXBsZSBtZXJnZSBmYWlsZWQsIHRyeWluZyBBdXRvbWF0aWMgbWVyZ2UuIgorCWlmIGdpdC1tZXJnZS1pbmRleCAtbyBnaXQtbWVyZ2Utb25lLWZpbGUgLWEKKwl0aGVuCisJCWV4aXQgMAorCWVsc2UKKwkJZXhpdCAxCisJZmkKK2ZpCmRpZmYgLS1naXQgYS9naXQtbWVyZ2Uuc2ggYi9naXQtbWVyZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTljZmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1tZXJnZS5zaApAQCAtMCwwICsxLDM4MyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCitVU0FHRT0nWy1uXSBbLS1uby1jb21taXRdIFstLXNxdWFzaF0gWy1zIDxzdHJhdGVneT5dLi4uIDxtZXJnZS1tZXNzYWdlPiA8aGVhZD4gPHJlbW90ZT4rJworLiBnaXQtc2gtc2V0dXAKKworTEY9JworJworCithbGxfc3RyYXRlZ2llcz0ncmVjdXJzaXZlIG9jdG9wdXMgcmVzb2x2ZSBzdHVwaWQgb3VycycKK2RlZmF1bHRfdHdvaGVhZF9zdHJhdGVnaWVzPSdyZWN1cnNpdmUnCitkZWZhdWx0X29jdG9wdXNfc3RyYXRlZ2llcz0nb2N0b3B1cycKK25vX3RyaXZpYWxfbWVyZ2Vfc3RyYXRlZ2llcz0nb3VycycKK3VzZV9zdHJhdGVnaWVzPQorCitpbmRleF9tZXJnZT10CitpZiB0ZXN0ICJAQE5PX1BZVEhPTkBAIjsgdGhlbgorCWFsbF9zdHJhdGVnaWVzPSdyZXNvbHZlIG9jdG9wdXMgc3R1cGlkIG91cnMnCisJZGVmYXVsdF90d29oZWFkX3N0cmF0ZWdpZXM9J3Jlc29sdmUnCitmaQorCitkcm9wc2F2ZSgpIHsKKwlybSAtZiAtLSAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgIiRHSVRfRElSL01FUkdFX01TRyIgXAorCQkgIiRHSVRfRElSL01FUkdFX1NBVkUiIHx8IGV4aXQgMQorfQorCitzYXZlc3RhdGUoKSB7CisJIyBTdGFzaCBhd2F5IGFueSBsb2NhbCBtb2RpZmljYXRpb25zLgorCWdpdC1kaWZmLWluZGV4IC16IC0tbmFtZS1vbmx5ICRoZWFkIHwKKwljcGlvIC0wIC1vID4iJEdJVF9ESVIvTUVSR0VfU0FWRSIKK30KKworcmVzdG9yZXN0YXRlKCkgeworICAgICAgICBpZiB0ZXN0IC1mICIkR0lUX0RJUi9NRVJHRV9TQVZFIgorCXRoZW4KKwkJZ2l0IHJlc2V0IC0taGFyZCAkaGVhZAorCQljcGlvIC1pdXYgPCIkR0lUX0RJUi9NRVJHRV9TQVZFIgorCQlnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+L2Rldi9udWxsCisJZmkKK30KKworZmluaXNoX3VwX3RvX2RhdGUgKCkgeworCWNhc2UgIiRzcXVhc2giIGluCisJdCkKKwkJZWNobyAiJDEgKG5vdGhpbmcgdG8gc3F1YXNoKSIgOzsKKwknJykKKwkJZWNobyAiJDEiIDs7CisJZXNhYworCWRyb3BzYXZlCit9CisKK3NxdWFzaF9tZXNzYWdlICgpIHsKKwllY2hvIFNxdWFzaGVkIGNvbW1pdCBvZiB0aGUgZm9sbG93aW5nOgorCWVjaG8KKwlnaXQtbG9nIC0tbm8tbWVyZ2VzIF4iJGhlYWQiICRyZW1vdGUKK30KKworZmluaXNoICgpIHsKKwlpZiB0ZXN0ICcnID0gIiQyIgorCXRoZW4KKwkJcmxvZ209IiRybG9nYSIKKwllbHNlCisJCWVjaG8gIiQyIgorCQlybG9nbT0iJHJsb2dhOiAkMiIKKwlmaQorCWNhc2UgIiRzcXVhc2giIGluCisJdCkKKwkJZWNobyAiU3F1YXNoIGNvbW1pdCAtLSBub3QgdXBkYXRpbmcgSEVBRCIKKwkJc3F1YXNoX21lc3NhZ2UgPiIkR0lUX0RJUi9TUVVBU0hfTVNHIgorCQk7OworCScnKQorCQljYXNlICIkbWVyZ2VfbXNnIiBpbgorCQknJykKKwkJCWVjaG8gIk5vIG1lcmdlIG1lc3NhZ2UgLS0gbm90IHVwZGF0aW5nIEhFQUQiCisJCQk7OworCQkqKQorCQkJZ2l0LXVwZGF0ZS1yZWYgLW0gIiRybG9nbSIgSEVBRCAiJDEiICIkaGVhZCIgfHwgZXhpdCAxCisJCQk7OworCQllc2FjCisJCTs7CisJZXNhYworCWNhc2UgIiQxIiBpbgorCScnKQorCQk7OworCT8qKQorCQljYXNlICIkbm9fc3VtbWFyeSIgaW4KKwkJJycpCisJCQlnaXQtZGlmZi10cmVlIC0tc3RhdCAtLXN1bW1hcnkgLU0gIiRoZWFkIiAiJDEiCisJCQk7OworCQllc2FjCisJCTs7CisJZXNhYworfQorCitybG9nYT0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1ufC0tbnwtLW5vfC0tbm8tfC0tbm8tc3wtLW5vLXN1fC0tbm8tc3VtfC0tbm8tc3VtbXxcCisJCS0tbm8tc3VtbWF8LS1uby1zdW1tYXJ8LS1uby1zdW1tYXJ5KQorCQlub19zdW1tYXJ5PXQgOzsKKwktLXNxfC0tc3F1fC0tc3F1YXwtLXNxdWFzfC0tc3F1YXNoKQorCQlzcXVhc2g9dCBub19jb21taXQ9dCA7OworCS0tbm8tY3wtLW5vLWNvfC0tbm8tY29tfC0tbm8tY29tbXwtLW5vLWNvbW1pfC0tbm8tY29tbWl0KQorCQlub19jb21taXQ9dCA7OworCS1zPSp8LS1zPSp8LS1zdD0qfC0tc3RyPSp8LS1zdHJhPSp8LS1zdHJhdD0qfC0tc3RyYXRlPSp8XAorCQktLXN0cmF0ZWc9KnwtLXN0cmF0ZWd5PSp8XAorCS1zfC0tc3wtLXN0fC0tc3RyfC0tc3RyYXwtLXN0cmF0fC0tc3RyYXRlfC0tc3RyYXRlZ3wtLXN0cmF0ZWd5KQorCQljYXNlICIkIywkMSIgaW4KKwkJKiwqPSopCisJCQlzdHJhdGVneT1gZXhwciAieiQxIiA6ICd6LVtePV0qPVwoLipcKSdgIDs7CisJCTEsKikKKwkJCXVzYWdlIDs7CisJCSopCisJCQlzdHJhdGVneT0iJDIiCisJCQlzaGlmdCA7OworCQllc2FjCisJCWNhc2UgIiAkYWxsX3N0cmF0ZWdpZXMgIiBpbgorCQkqIiAkc3RyYXRlZ3kgIiopCisJCQl1c2Vfc3RyYXRlZ2llcz0iJHVzZV9zdHJhdGVnaWVzJHN0cmF0ZWd5ICIgOzsKKwkJKikKKwkJCWRpZSAiYXZhaWxhYmxlIHN0cmF0ZWdpZXMgYXJlOiAkYWxsX3N0cmF0ZWdpZXMiIDs7CisJCWVzYWMKKwkJOzsKKwktLXJlZmxvZy1hY3Rpb249KikKKwkJcmxvZ2E9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYAorCQk7OworCS0qKQl1c2FnZSA7OworCSopCWJyZWFrIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK21lcmdlX21zZz0iJDEiCitzaGlmdAoraGVhZF9hcmc9IiQxIgoraGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxIl4wKSB8fCB1c2FnZQorc2hpZnQKKworIyBBbGwgdGhlIHJlc3QgYXJlIHJlbW90ZSBoZWFkcwordGVzdCAiJCMiID0gMCAmJiB1c2FnZSA7IyB3ZSBuZWVkIGF0IGxlYXN0IG9uZSByZW1vdGUgaGVhZC4KK3Rlc3QgIiRybG9nYSIgPSAnJyAmJiBybG9nYT0ibWVyZ2U6ICRAIgorCityZW1vdGVoZWFkcz0KK2ZvciByZW1vdGUKK2RvCisJcmVtb3RlaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiRyZW1vdGUiXjApIHx8CisJICAgIGRpZSAiJHJlbW90ZSAtIG5vdCBzb21ldGhpbmcgd2UgY2FuIG1lcmdlIgorCXJlbW90ZWhlYWRzPSIke3JlbW90ZWhlYWRzfSRyZW1vdGVoZWFkICIKK2RvbmUKK3NldCB4ICRyZW1vdGVoZWFkcyA7IHNoaWZ0CisKK2Nhc2UgIiR1c2Vfc3RyYXRlZ2llcyIgaW4KKycnKQorCWNhc2UgIiQjIiBpbgorCTEpCisJCXVzZV9zdHJhdGVnaWVzPSIkZGVmYXVsdF90d29oZWFkX3N0cmF0ZWdpZXMiIDs7CisJKikKKwkJdXNlX3N0cmF0ZWdpZXM9IiRkZWZhdWx0X29jdG9wdXNfc3RyYXRlZ2llcyIgOzsKKwllc2FjCisJOzsKK2VzYWMKKworZm9yIHMgaW4gJHVzZV9zdHJhdGVnaWVzCitkbworCWNhc2UgIiAkcyAiIGluCisJKiIgJG5vX3RyaXZpYWxfbWVyZ2Vfc3RyYXRlZ2llcyAiKikKKwkJaW5kZXhfbWVyZ2U9ZgorCQlicmVhaworCQk7OworCWVzYWMKK2RvbmUKKworY2FzZSAiJCMiIGluCisxKQorCWNvbW1vbj0kKGdpdC1tZXJnZS1iYXNlIC0tYWxsICRoZWFkICIkQCIpCisJOzsKKyopCisJY29tbW9uPSQoZ2l0LXNob3ctYnJhbmNoIC0tbWVyZ2UtYmFzZSAkaGVhZCAiJEAiKQorCTs7Citlc2FjCitlY2hvICIkaGVhZCIgPiIkR0lUX0RJUi9PUklHX0hFQUQiCisKK2Nhc2UgIiRpbmRleF9tZXJnZSwkIywkY29tbW9uLCRub19jb21taXQiIGluCitmLCopCisJIyBXZSd2ZSBiZWVuIHRvbGQgbm90IHRvIHRyeSBhbnl0aGluZyBjbGV2ZXIuICBTa2lwIHRvIHJlYWwgbWVyZ2UuCisJOzsKKz8sKiwnJywqKQorCSMgTm8gY29tbW9uIGFuY2VzdG9ycyBmb3VuZC4gV2UgbmVlZCBhIHJlYWwgbWVyZ2UuCisJOzsKKz8sMSwiJDEiLCopCisJIyBJZiBoZWFkIGNhbiByZWFjaCBhbGwgdGhlIG1lcmdlIHRoZW4gd2UgYXJlIHVwIHRvIGRhdGUuCisJIyBidXQgZmlyc3QgdGhlIG1vc3QgY29tbW9uIGNhc2Ugb2YgbWVyZ2luZyBvbmUgcmVtb3RlLgorCWZpbmlzaF91cF90b19kYXRlICJBbHJlYWR5IHVwLXRvLWRhdGUuIgorCWV4aXQgMAorCTs7Cis/LDEsIiRoZWFkIiwqKQorCSMgQWdhaW4gdGhlIG1vc3QgY29tbW9uIGNhc2Ugb2YgbWVyZ2luZyBvbmUgcmVtb3RlLgorCWVjaG8gIlVwZGF0aW5nIGZyb20gJGhlYWQgdG8gJDEiCisJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggMj4vZGV2L251bGwKKwluZXdfaGVhZD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQxXjAiKSAmJgorCWdpdC1yZWFkLXRyZWUgLXUgLXYgLW0gJGhlYWQgIiRuZXdfaGVhZCIgJiYKKwlmaW5pc2ggIiRuZXdfaGVhZCIgIkZhc3QgZm9yd2FyZCIKKwlkcm9wc2F2ZQorCWV4aXQgMAorCTs7Cis/LDEsPyoiJExGIj8qLCopCisJIyBXZSBhcmUgbm90IGRvaW5nIG9jdG9wdXMgYW5kIG5vdCBmYXN0IGZvcndhcmQuICBOZWVkIGEKKwkjIHJlYWwgbWVyZ2UuCisJOzsKKz8sMSwqLCkKKwkjIFdlIGFyZSBub3QgZG9pbmcgb2N0b3B1cywgbm90IGZhc3QgZm9yd2FyZCwgYW5kIGhhdmUgb25seQorCSMgb25lIGNvbW1vbi4gIFNlZSBpZiBpdCBpcyByZWFsbHkgdHJpdmlhbC4KKwlnaXQgdmFyIEdJVF9DT01NSVRURVJfSURFTlQgPi9kZXYvbnVsbCB8fCBleGl0CisKKwllY2hvICJUcnlpbmcgcmVhbGx5IHRyaXZpYWwgaW4taW5kZXggbWVyZ2UuLi4iCisJZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggMj4vZGV2L251bGwKKwlpZiBnaXQtcmVhZC10cmVlIC0tdHJpdmlhbCAtbSAtdSAtdiAkY29tbW9uICRoZWFkICIkMSIgJiYKKwkgICByZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlKQorCXRoZW4KKwkgICAgZWNobyAiV29uZGVyZnVsLiIKKwkgICAgcmVzdWx0X2NvbW1pdD0kKAorCSAgICAgICAgZWNobyAiJG1lcmdlX21zZyIgfAorCSAgICAgICAgZ2l0LWNvbW1pdC10cmVlICRyZXN1bHRfdHJlZSAtcCBIRUFEIC1wICIkMSIKKwkgICAgKSB8fCBleGl0CisJICAgIGZpbmlzaCAiJHJlc3VsdF9jb21taXQiICJJbi1pbmRleCBtZXJnZSIKKwkgICAgZHJvcHNhdmUKKwkgICAgZXhpdCAwCisJZmkKKwllY2hvICJOb3BlLiIKKwk7OworKikKKwkjIEFuIG9jdG9wdXMuICBJZiB3ZSBjYW4gcmVhY2ggYWxsIHRoZSByZW1vdGUgd2UgYXJlIHVwIHRvIGRhdGUuCisJdXBfdG9fZGF0ZT10CisJZm9yIHJlbW90ZQorCWRvCisJCWNvbW1vbl9vbmU9JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCAkaGVhZCAkcmVtb3RlKQorCQlpZiB0ZXN0ICIkY29tbW9uX29uZSIgIT0gIiRyZW1vdGUiCisJCXRoZW4KKwkJCXVwX3RvX2RhdGU9ZgorCQkJYnJlYWsKKwkJZmkKKwlkb25lCisJaWYgdGVzdCAiJHVwX3RvX2RhdGUiID0gdAorCXRoZW4KKwkJZmluaXNoX3VwX3RvX2RhdGUgIkFscmVhZHkgdXAtdG8tZGF0ZS4gWWVlYWghIgorCQlleGl0IDAKKwlmaQorCTs7Citlc2FjCisKKyMgV2UgYXJlIGdvaW5nIHRvIG1ha2UgYSBuZXcgY29tbWl0LgorZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCisjIEF0IHRoaXMgcG9pbnQsIHdlIG5lZWQgYSByZWFsIG1lcmdlLiAgTm8gbWF0dGVyIHdoYXQgc3RyYXRlZ3kKKyMgd2UgdXNlLCBpdCB3b3VsZCBvcGVyYXRlIG9uIHRoZSBpbmRleCwgcG9zc2libHkgYWZmZWN0aW5nIHRoZQorIyB3b3JraW5nIHRyZWUsIGFuZCB3aGVuIHJlc29sdmVkIGNsZWFubHksIGhhdmUgdGhlIGRlc2lyZWQgdHJlZQorIyBpbiB0aGUgaW5kZXggLS0gdGhpcyBtZWFucyB0aGF0IHRoZSBpbmRleCBtdXN0IGJlIGluIHN5bmMgd2l0aAorIyB0aGUgJGhlYWQgY29tbWl0LiAgVGhlIHN0cmF0ZWdpZXMgYXJlIHJlc3BvbnNpYmxlIHRvIGVuc3VyZSB0aGlzLgorCitjYXNlICIkdXNlX3N0cmF0ZWdpZXMiIGluCis/KicgJz8qKQorICAgICMgU3Rhc2ggYXdheSB0aGUgbG9jYWwgY2hhbmdlcyBzbyB0aGF0IHdlIGNhbiB0cnkgbW9yZSB0aGFuIG9uZS4KKyAgICBzYXZlc3RhdGUKKyAgICBzaW5nbGVfc3RyYXRlZ3k9bm8KKyAgICA7OworKikKKyAgICBybSAtZiAiJEdJVF9ESVIvTUVSR0VfU0FWRSIKKyAgICBzaW5nbGVfc3RyYXRlZ3k9eWVzCisgICAgOzsKK2VzYWMKKworcmVzdWx0X3RyZWU9IGJlc3RfY250PS0xIGJlc3Rfc3RyYXRlZ3k9IHd0X3N0cmF0ZWd5PQorbWVyZ2Vfd2FzX29rPQorZm9yIHN0cmF0ZWd5IGluICR1c2Vfc3RyYXRlZ2llcworZG8KKyAgICB0ZXN0ICIkd3Rfc3RyYXRlZ3kiID0gJycgfHwgeworCWVjaG8gIlJld2luZGluZyB0aGUgdHJlZSB0byBwcmlzdGluZS4uLiIKKwlyZXN0b3Jlc3RhdGUKKyAgICB9CisgICAgY2FzZSAiJHNpbmdsZV9zdHJhdGVneSIgaW4KKyAgICBubykKKwllY2hvICJUcnlpbmcgbWVyZ2Ugc3RyYXRlZ3kgJHN0cmF0ZWd5Li4uIgorCTs7CisgICAgZXNhYworCisgICAgIyBSZW1lbWJlciB3aGljaCBzdHJhdGVneSBsZWZ0IHRoZSBzdGF0ZSBpbiB0aGUgd29ya2luZyB0cmVlCisgICAgd3Rfc3RyYXRlZ3k9JHN0cmF0ZWd5CisKKyAgICBnaXQtbWVyZ2UtJHN0cmF0ZWd5ICRjb21tb24gLS0gIiRoZWFkX2FyZyIgIiRAIgorICAgIGV4aXQ9JD8KKyAgICBpZiB0ZXN0ICIkbm9fY29tbWl0IiA9IHQgJiYgdGVzdCAiJGV4aXQiID0gMAorICAgIHRoZW4KKyAgICAgICAgbWVyZ2Vfd2FzX29rPXQKKwlleGl0PTEgOyMgcHJldGVuZCBpdCBsZWZ0IGNvbmZsaWN0cy4KKyAgICBmaQorCisgICAgdGVzdCAiJGV4aXQiID0gMCB8fCB7CisKKwkjIFRoZSBiYWNrZW5kIGV4aXRzIHdpdGggMSB3aGVuIGNvbmZsaWN0cyBhcmUgbGVmdCB0byBiZSByZXNvbHZlZCwKKwkjIHdpdGggMiB3aGVuIGl0IGRvZXMgbm90IGhhbmRsZSB0aGUgZ2l2ZW4gbWVyZ2UgYXQgYWxsLgorCisJaWYgdGVzdCAiJGV4aXQiIC1lcSAxCisJdGhlbgorCSAgICBjbnQ9YHsKKwkJZ2l0LWRpZmYtZmlsZXMgLS1uYW1lLW9ubHkKKwkJZ2l0LWxzLWZpbGVzIC0tdW5tZXJnZWQKKwkgICAgfSB8IHdjIC1sYAorCSAgICBpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkgICAgdGhlbgorCQliZXN0X3N0cmF0ZWd5PSRzdHJhdGVneQorCQliZXN0X2NudD0kY250CisJICAgIGZpCisJZmkKKwljb250aW51ZQorICAgIH0KKworICAgICMgQXV0b21lcmdlIHN1Y2NlZWRlZC4KKyAgICByZXN1bHRfdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJiBicmVhaworZG9uZQorCisjIElmIHdlIGhhdmUgYSByZXN1bHRpbmcgdHJlZSwgdGhhdCBtZWFucyB0aGUgc3RyYXRlZ3kgbW9kdWxlCisjIGF1dG8gcmVzb2x2ZWQgdGhlIG1lcmdlIGNsZWFubHkuCitpZiB0ZXN0ICcnICE9ICIkcmVzdWx0X3RyZWUiCit0aGVuCisgICAgcGFyZW50cz0kKGdpdC1zaG93LWJyYW5jaCAtLWluZGVwZW5kZW50ICIkaGVhZCIgIiRAIiB8IHNlZCAtZSAncy9eLy1wIC8nKQorICAgIHJlc3VsdF9jb21taXQ9JChlY2hvICIkbWVyZ2VfbXNnIiB8IGdpdC1jb21taXQtdHJlZSAkcmVzdWx0X3RyZWUgJHBhcmVudHMpIHx8IGV4aXQKKyAgICBmaW5pc2ggIiRyZXN1bHRfY29tbWl0IiAiTWVyZ2UgbWFkZSBieSAkd3Rfc3RyYXRlZ3kuIgorICAgIGRyb3BzYXZlCisgICAgZXhpdCAwCitmaQorCisjIFBpY2sgdGhlIHJlc3VsdCBmcm9tIHRoZSBiZXN0IHN0cmF0ZWd5IGFuZCBoYXZlIHRoZSB1c2VyIGZpeCBpdCB1cC4KK2Nhc2UgIiRiZXN0X3N0cmF0ZWd5IiBpbgorJycpCisJcmVzdG9yZXN0YXRlCisJZWNobyA+JjIgIk5vIG1lcmdlIHN0cmF0ZWd5IGhhbmRsZWQgdGhlIG1lcmdlLiIKKwlleGl0IDIKKwk7OworIiR3dF9zdHJhdGVneSIpCisJIyBXZSBhbHJlYWR5IGhhdmUgaXRzIHJlc3VsdCBpbiB0aGUgd29ya2luZyB0cmVlLgorCTs7CisqKQorCWVjaG8gIlJld2luZGluZyB0aGUgdHJlZSB0byBwcmlzdGluZS4uLiIKKwlyZXN0b3Jlc3RhdGUKKwllY2hvICJVc2luZyB0aGUgJGJlc3Rfc3RyYXRlZ3kgdG8gcHJlcGFyZSByZXNvbHZpbmcgYnkgaGFuZC4iCisJZ2l0LW1lcmdlLSRiZXN0X3N0cmF0ZWd5ICRjb21tb24gLS0gIiRoZWFkX2FyZyIgIiRAIgorCTs7Citlc2FjCisKK2lmIHRlc3QgIiRzcXVhc2giID0gdAordGhlbgorCWZpbmlzaAorZWxzZQorCWZvciByZW1vdGUKKwlkbworCQllY2hvICRyZW1vdGUKKwlkb25lID4iJEdJVF9ESVIvTUVSR0VfSEVBRCIKKwllY2hvICIkbWVyZ2VfbXNnIiA+IiRHSVRfRElSL01FUkdFX01TRyIKK2ZpCisKK2lmIHRlc3QgIiRtZXJnZV93YXNfb2siID0gdAordGhlbgorCWVjaG8gPiYyIFwKKwkiQXV0b21hdGljIG1lcmdlIHdlbnQgd2VsbDsgc3RvcHBlZCBiZWZvcmUgY29tbWl0dGluZyBhcyByZXF1ZXN0ZWQiCisJZXhpdCAwCitlbHNlCisJeworCSAgICBlY2hvICcKK0NvbmZsaWN0czoKKycKKwkJZ2l0IGxzLWZpbGVzIC0tdW5tZXJnZWQgfAorCQlzZWQgLWUgJ3MvXlteCV0qCS8JLycgfAorCQl1bmlxCisJfSA+PiIkR0lUX0RJUi9NRVJHRV9NU0ciCisJaWYgdGVzdCAtZCAiJEdJVF9ESVIvcnItY2FjaGUiCisJdGhlbgorCQlnaXQtcmVyZXJlCisJZmkKKwlkaWUgIkF1dG9tYXRpYyBtZXJnZSBmYWlsZWQ7IGZpeCBjb25mbGljdHMgYW5kIHRoZW4gY29tbWl0IHRoZSByZXN1bHQuIgorZmkKZGlmZiAtLWdpdCBhL2dpdC1wNGltcG9ydC5weSBiL2dpdC1wNGltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg5NDFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXA0aW1wb3J0LnB5CkBAIC0wLDAgKzEsMzYxIEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBUaGlzIHRvb2wgaXMgY29weXJpZ2h0IChjKSAyMDA2LCBTZWFuIEVzdGFicm9va3MuCisjIEl0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHbnUgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KKyMKKyMgSW1wb3J0IFBlcmZvcmNlIGJyYW5jaGVzIGludG8gR2l0IHJlcG9zaXRvcmllcy4KKyMgQ2hlY2tpbmcgb3V0IHRoZSBmaWxlcyBpcyBkb25lIGJ5IGNhbGxpbmcgdGhlIHN0YW5kYXJkIHA0CisjIGNsaWVudCB3aGljaCB5b3UgbXVzdCBoYXZlIHByb3Blcmx5IGNvbmZpZ3VyZWQgeW91cnNlbGYKKyMKKworaW1wb3J0IG1hcnNoYWwKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBnZXRvcHQKKworZnJvbSBzaWduYWwgaW1wb3J0IHNpZ25hbCwgXAorICAgU0lHUElQRSwgU0lHSU5ULCBTSUdfREZMLCBcCisgICBkZWZhdWx0X2ludF9oYW5kbGVyCisKK3NpZ25hbChTSUdQSVBFLCBTSUdfREZMKQorcyA9IHNpZ25hbChTSUdJTlQsIFNJR19ERkwpCitpZiBzICE9IGRlZmF1bHRfaW50X2hhbmRsZXI6CisgICBzaWduYWwoU0lHSU5ULCBzKQorCitkZWYgZGllKG1zZywgKmFyZ3MpOgorICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgIG1zZyA9ICIlcyAlcyIgJSAobXNnLCBhKQorICAgIHByaW50ICJnaXQtcDRpbXBvcnQgZmF0YWwgZXJyb3I6IiwgbXNnCisgICAgc3lzLmV4aXQoMSkKKworZGVmIHVzYWdlKCk6CisgICAgcHJpbnQgIlVTQUdFOiBnaXQtcDRpbXBvcnQgWy1xfC12XSAgWy0tYXV0aG9ycz08ZmlsZT5dICBbLXQgPHRpbWV6b25lPl0gIFsvL3A0cmVwby9wYXRoIDxicmFuY2g+XSIKKyAgICBzeXMuZXhpdCgxKQorCit2ZXJib3NpdHkgPSAxCitsb2dmaWxlID0gIi9kZXYvbnVsbCIKK2lnbm9yZV93YXJuaW5ncyA9IEZhbHNlCitzdGl0Y2ggPSAwCit0YWdhbGwgPSBUcnVlCisKK2RlZiByZXBvcnQobGV2ZWwsIG1zZywgKmFyZ3MpOgorICAgIGdsb2JhbCB2ZXJib3NpdHkKKyAgICBnbG9iYWwgbG9nZmlsZQorICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgIG1zZyA9ICIlcyAlcyIgJSAobXNnLCBhKQorICAgIGZkID0gb3Blbihsb2dmaWxlLCAiYSIpCisgICAgZmQud3JpdGVsaW5lcyhtc2cpCisgICAgZmQuY2xvc2UoKQorICAgIGlmIGxldmVsIDw9IHZlcmJvc2l0eToKKyAgICAgICAgcHJpbnQgbXNnCisKK2NsYXNzIHA0X2NvbW1hbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9yZXBvcGF0aCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdsb2JhbCBsb2dmaWxlCisgICAgICAgICAgICBzZWxmLnVzZXJsaXN0ID0ge30KKyAgICAgICAgICAgIGlmIF9yZXBvcGF0aFstMV0gPT0gJy8nOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3BhdGggPSBfcmVwb3BhdGhbOi0xXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9wYXRoID0gX3JlcG9wYXRoCisgICAgICAgICAgICBpZiBzZWxmLnJlcG9wYXRoWy00Ol0gIT0gIi8uLi4iOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3BhdGg9ICIlcy8uLi4iICUgc2VsZi5yZXBvcGF0aAorICAgICAgICAgICAgZj1vcy5wb3BlbigncDQgLVYgMj4+JXMnJWxvZ2ZpbGUsICdyYicpCisgICAgICAgICAgICBhID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgaWYgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBkaWUoIkNvdWxkIG5vdCBmaW5kIHRoZSBcInA0XCIgY29tbWFuZCIpCisKKyAgICBkZWYgcDQoc2VsZiwgY21kLCAqYXJncyk6CisgICAgICAgIGdsb2JhbCBsb2dmaWxlCisgICAgICAgIGNtZCA9ICIlcyAlcyIgJSAoY21kLCAnICcuam9pbihhcmdzKSkKKyAgICAgICAgcmVwb3J0KDIsICJQNDoiLCBjbWQpCisgICAgICAgIGY9b3MucG9wZW4oJ3A0IC1HICVzIDI+PiVzJyAlIChjbWQsbG9nZmlsZSksICdyYicpCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQobWFyc2hhbC5sb2FkKGYpKQorICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5yZXQgPSBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGxpc3QKKworICAgIGRlZiBzeW5jKHNlbGYsIGlkLCBmb3JjZT1GYWxzZSwgdHJpY2s9RmFsc2UsIHRlc3Q9RmFsc2UpOgorICAgICAgICBpZiBmb3JjZToKKyAgICAgICAgICAgIHJldCA9IHNlbGYucDQoInN5bmMgLWYgJXNAJXMiJShzZWxmLnJlcG9wYXRoLCBpZCkpWzBdCisgICAgICAgIGVsaWYgdHJpY2s6CisgICAgICAgICAgICByZXQgPSBzZWxmLnA0KCJzeW5jIC1rICVzQCVzIiUoc2VsZi5yZXBvcGF0aCwgaWQpKVswXQorICAgICAgICBlbGlmIHRlc3Q6CisgICAgICAgICAgICByZXQgPSBzZWxmLnA0KCJzeW5jIC1uICVzQCVzIiUoc2VsZi5yZXBvcGF0aCwgaWQpKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0ID0gc2VsZi5wNCgic3luYyAgICAlc0AlcyIlKHNlbGYucmVwb3BhdGgsIGlkKSlbMF0KKyAgICAgICAgaWYgcmV0Wydjb2RlJ10gPT0gImVycm9yIjoKKyAgICAgICAgICAgICBkYXRhID0gcmV0WydkYXRhJ10udXBwZXIoKQorICAgICAgICAgICAgIGlmIGRhdGEuZmluZCgnVklFVycpID4gMDoKKyAgICAgICAgICAgICAgICAgZGllKCJQZXJmb3JjZSByZXBvcnRzICVzIGlzIG5vdCBpbiBjbGllbnQgdmlldyIlIHNlbGYucmVwb3BhdGgpCisgICAgICAgICAgICAgZWxpZiBkYXRhLmZpbmQoJ1VQLVRPLURBVEUnKSA8IDA6CisgICAgICAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IHN5bmMgZmlsZXMgZnJvbSBwZXJmb3JjZSIsIHNlbGYucmVwb3BhdGgpCisKKyAgICBkZWYgY2hhbmdlcyhzZWxmLCBzaW5jZT0wKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgcmVjIGluIHNlbGYucDQoImNoYW5nZXMgJXNAJXMsI2hlYWQiICUgKHNlbGYucmVwb3BhdGgsIHNpbmNlKzEpKToKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChyZWNbJ2NoYW5nZSddKQorICAgICAgICAgICAgbGlzdC5yZXZlcnNlKCkKKyAgICAgICAgICAgIHJldHVybiBsaXN0CisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIGF1dGhvcnMoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmPW9wZW4oZmlsZW5hbWUpCisgICAgICAgIGZvciBsIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgICAgICBzZWxmLnVzZXJsaXN0W2xbOmwuZmluZCgnPScpXS5yc3RyaXAoKV0gPSBcCisgICAgICAgICAgICAgICAgICAgIChsW2wuZmluZCgnPScpKzE6bC5maW5kKCc8JyldLnJzdHJpcCgpLGxbbC5maW5kKCc8JykrMTpsLmZpbmQoJz4nKV0pCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmb3IgZixlIGluIHNlbGYudXNlcmxpc3QuaXRlbXMoKToKKyAgICAgICAgICAgICAgICByZXBvcnQoMiwgZiwgIjoiLCBlWzBdLCAiICA8IiwgZVsxXSwgIj4iKQorCisgICAgZGVmIF9nZXRfdXNlcihzZWxmLCBpZCk6CisgICAgICAgIGlmIG5vdCBzZWxmLnVzZXJsaXN0Lmhhc19rZXkoaWQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVzZXIgPSBzZWxmLnA0KCJ1c2VycyIsIGlkKVswXQorICAgICAgICAgICAgICAgIHNlbGYudXNlcmxpc3RbaWRdID0gKHVzZXJbJ0Z1bGxOYW1lJ10sIHVzZXJbJ0VtYWlsJ10pCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi51c2VybGlzdFtpZF0gPSAoaWQsICIiKQorICAgICAgICByZXR1cm4gc2VsZi51c2VybGlzdFtpZF0KKworICAgIGRlZiBfZm9ybWF0X2RhdGUoc2VsZiwgdGlja3MpOgorICAgICAgICBzeW1ib2w9JysnCisgICAgICAgIG5hbWUgPSB0aW1lLnR6bmFtZVswXQorICAgICAgICBvZmZzZXQgPSB0aW1lLnRpbWV6b25lCisgICAgICAgIGlmIHRpY2tzWzhdOgorICAgICAgICAgICAgbmFtZSA9IHRpbWUudHpuYW1lWzFdCisgICAgICAgICAgICBvZmZzZXQgPSB0aW1lLmFsdHpvbmUKKyAgICAgICAgaWYgb2Zmc2V0IDwgMDoKKyAgICAgICAgICAgIG9mZnNldCAqPSAtMQorICAgICAgICAgICAgc3ltYm9sID0gJy0nCisgICAgICAgIGxvY2FsbyA9ICIlcyUwMmQlMDJkICVzIiAlIChzeW1ib2wsIG9mZnNldCAvIDM2MDAsIG9mZnNldCAlIDM2MDAsIG5hbWUpCisgICAgICAgIHRpY2tzbyA9IHRpbWUuc3RyZnRpbWUoIiVhICViICVkICVIOiVNOiVTICVZIiwgdGlja3MpCisgICAgICAgIHJldHVybiAiJXMgJXMiICUgKHRpY2tzbywgbG9jYWxvKQorCisgICAgZGVmIHdoZXJlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wNCgid2hlcmUgJXMiICUgc2VsZi5yZXBvcGF0aClbLTFdWydwYXRoJ10KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgZGVzY3JpYmUoc2VsZiwgbnVtKToKKyAgICAgICAgZGVzYyA9IHNlbGYucDQoImRlc2NyaWJlIC1zIiwgbnVtKVswXQorICAgICAgICBzZWxmLm1zZyA9IGRlc2NbJ2Rlc2MnXQorICAgICAgICBzZWxmLmF1dGhvciwgc2VsZi5lbWFpbCA9IHNlbGYuX2dldF91c2VyKGRlc2NbJ3VzZXInXSkKKyAgICAgICAgc2VsZi5kYXRlID0gc2VsZi5fZm9ybWF0X2RhdGUodGltZS5sb2NhbHRpbWUobG9uZyhkZXNjWyd0aW1lJ10pKSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgZ2l0X2NvbW1hbmQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBzZWxmLmdpdCgiLS12ZXJzaW9uIilbMF1bMTI6XS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBkaWUoIkNvdWxkIG5vdCBmaW5kIHRoZSBcImdpdFwiIGNvbW1hbmQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmdpdGRpciA9IHNlbGYuZ2V0X3NpbmdsZSgicmV2LXBhcnNlIC0tZ2l0LWRpciIpCisgICAgICAgICAgICByZXBvcnQoMiwgImdkaXI6Iiwgc2VsZi5naXRkaXIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiTm90IGEgZ2l0IHJlcG9zaXRvcnkuLi4gZGlkIHlvdSBmb3JnZXQgdG8gXCJnaXQgaW5pdC1kYlwiID8iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNkdXAgPSBzZWxmLmdldF9zaW5nbGUoInJldi1wYXJzZSAtLXNob3ctY2R1cCIpCisgICAgICAgICAgICBpZiBzZWxmLmNkdXAgIT0gIiI6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5jZHVwKQorICAgICAgICAgICAgc2VsZi50b3BkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgcmVwb3J0KDIsICJ0b3BkaXI6Iiwgc2VsZi50b3BkaXIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IGZpbmQgdG9wIGdpdCBkaXJlY3RvcnkiKQorCisgICAgZGVmIGdpdChzZWxmLCBjbWQpOgorICAgICAgICBnbG9iYWwgbG9nZmlsZQorICAgICAgICByZXBvcnQoMiwgIkdJVDoiLCBjbWQpCisgICAgICAgIGY9b3MucG9wZW4oJ2dpdCAlcyAyPj4lcycgJSAoY21kLGxvZ2ZpbGUpLCAncmInKQorICAgICAgICByPWYucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5yZXQgPSBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBnZXRfc2luZ2xlKHNlbGYsIGNtZCk6CisgICAgICAgIHJldHVybiBzZWxmLmdpdChjbWQpWzBdLnJzdHJpcCgpCisKKyAgICBkZWYgY3VycmVudF9icmFuY2goc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RpdCA9IHNlbGYuZ2l0KCJyZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCIpWzBdCisgICAgICAgICAgICByZXR1cm4gc2VsZi5naXQoInN5bWJvbGljLXJlZiBIRUFEIilbMF1bMTE6XS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldF9jb25maWcoc2VsZiwgdmFyaWFibGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5naXQoInJlcG8tY29uZmlnIC0tZ2V0ICVzIiAlIHZhcmlhYmxlKVswXS5yc3RyaXAoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHNldF9jb25maWcoc2VsZiwgdmFyaWFibGUsIHZhbHVlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5naXQoInJlcG8tY29uZmlnICVzICVzIiUodmFyaWFibGUsIHZhbHVlKSApCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGRpZSgiQ291bGQgbm90IHNldCAlcyB0byAiICUgdmFyaWFibGUsIHZhbHVlKQorCisgICAgZGVmIG1ha2VfdGFnKHNlbGYsIG5hbWUsIGhlYWQpOgorICAgICAgICBzZWxmLmdpdCgidGFnIC1mICVzICVzIiUobmFtZSxoZWFkKSkKKworICAgIGRlZiB0b3BfY2hhbmdlKHNlbGYsIGJyYW5jaCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGE9c2VsZi5nZXRfc2luZ2xlKCJuYW1lLXJldiAtLXRhZ3MgcmVmcy9oZWFkcy8lcyIgJSBicmFuY2gpCisgICAgICAgICAgICBsb2MgPSBhLmZpbmQoJyB0YWdzLycpICsgNgorICAgICAgICAgICAgaWYgYVtsb2M6bG9jKzNdICE9ICJwNC8iOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZXR1cm4gaW50KGFbbG9jKzM6XVs6LTJdKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIHVwZGF0ZV9pbmRleChzZWxmKToKKyAgICAgICAgc2VsZi5naXQoImxzLWZpbGVzIC1tIC1kIC1vIC16IHwgZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSAteiAtLXN0ZGluIikKKworICAgIGRlZiBjaGVja291dChzZWxmLCBicmFuY2gpOgorICAgICAgICBzZWxmLmdpdCgiY2hlY2tvdXQgJXMiICUgYnJhbmNoKQorCisgICAgZGVmIHJlcG9pbnRfaGVhZChzZWxmLCBicmFuY2gpOgorICAgICAgICBzZWxmLmdpdCgic3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy8lcyIgJSBicmFuY2gpCisKKyAgICBkZWYgcmVtb3ZlX2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLmdpdCgibHMtZmlsZXMgfCB4YXJncyBybSIpCisKKyAgICBkZWYgY2xlYW5fZGlyZWN0b3JpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZ2l0KCJjbGVhbiAtZCIpCisKKyAgICBkZWYgZnJlc2hfYnJhbmNoKHNlbGYsIGJyYW5jaCk6CisgICAgICAgIHJlcG9ydCgxLCAiQ3JlYXRpbmcgbmV3IGJyYW5jaCIsIGJyYW5jaCkKKyAgICAgICAgc2VsZi5naXQoImxzLWZpbGVzIHwgeGFyZ3Mgcm0iKQorICAgICAgICBvcy5yZW1vdmUoIi5naXQvaW5kZXgiKQorICAgICAgICBzZWxmLnJlcG9pbnRfaGVhZChicmFuY2gpCisgICAgICAgIHNlbGYuZ2l0KCJjbGVhbiAtZCIpCisKKyAgICBkZWYgYmFzZWRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudG9wZGlyCisKKyAgICBkZWYgY29tbWl0KHNlbGYsIGF1dGhvciwgZW1haWwsIGRhdGUsIG1zZywgaWQpOgorICAgICAgICBzZWxmLnVwZGF0ZV9pbmRleCgpCisgICAgICAgIGZkPW9wZW4oIi5tc2ciLCAidyIpCisgICAgICAgIGZkLndyaXRlbGluZXMobXNnKQorICAgICAgICBmZC5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2VsZi5nZXRfc2luZ2xlKCJyZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCIpCisgICAgICAgICAgICAgICAgaGVhZCA9ICItcCBIRUFEIgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgY3VycmVudCA9ICIiCisgICAgICAgICAgICAgICAgaGVhZCA9ICIiCisgICAgICAgIHRyZWUgPSBzZWxmLmdldF9zaW5nbGUoIndyaXRlLXRyZWUiKQorICAgICAgICBmb3IgcixsIGluIFsoJ0RBVEUnLGRhdGUpLCgnTkFNRScsYXV0aG9yKSwoJ0VNQUlMJyxlbWFpbCldOgorICAgICAgICAgICAgb3MuZW52aXJvblsnR0lUX0FVVEhPUl8lcyclcl0gPSBsCisgICAgICAgICAgICBvcy5lbnZpcm9uWydHSVRfQ09NTUlUVEVSXyVzJyVyXSA9IGwKKyAgICAgICAgY29tbWl0ID0gc2VsZi5nZXRfc2luZ2xlKCJjb21taXQtdHJlZSAlcyAlcyA8IC5tc2ciICUgKHRyZWUsaGVhZCkpCisgICAgICAgIG9zLnJlbW92ZSgiLm1zZyIpCisgICAgICAgIHNlbGYubWFrZV90YWcoInA0LyVzIiVpZCwgY29tbWl0KQorICAgICAgICBzZWxmLmdpdCgidXBkYXRlLXJlZiBIRUFEICVzICVzIiAlIChjb21taXQsIGN1cnJlbnQpICkKKwordHJ5OgorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgInFodnQ6IiwKKyAgICAgICAgICAgIFsiYXV0aG9ycz0iLCJoZWxwIiwic3RpdGNoPSIsInRpbWV6b25lPSIsImxvZz0iLCJpZ25vcmUiLCJub3RhZ3MiXSkKK2V4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisgICAgdXNhZ2UoKQorCitmb3IgbywgYSBpbiBvcHRzOgorICAgIGlmIG8gPT0gIi1xIjoKKyAgICAgICAgdmVyYm9zaXR5ID0gMAorICAgIGlmIG8gPT0gIi12IjoKKyAgICAgICAgdmVyYm9zaXR5ICs9IDEKKyAgICBpZiBvIGluICgiLS1sb2ciKToKKyAgICAgICAgbG9nZmlsZSA9IGEKKyAgICBpZiBvIGluICgiLS1ub3RhZ3MiKToKKyAgICAgICAgdGFnYWxsID0gRmFsc2UKKyAgICBpZiBvIGluICgiLWgiLCAiLS1oZWxwIik6CisgICAgICAgIHVzYWdlKCkKKyAgICBpZiBvIGluICgiLS1pZ25vcmUiKToKKyAgICAgICAgaWdub3JlX3dhcm5pbmdzID0gVHJ1ZQorCitnaXQgPSBnaXRfY29tbWFuZCgpCiticmFuY2g9Z2l0LmN1cnJlbnRfYnJhbmNoKCkKKworZm9yIG8sIGEgaW4gb3B0czoKKyAgICBpZiBvIGluICgiLXQiLCAiLS10aW1lem9uZSIpOgorICAgICAgICBnaXQuc2V0X2NvbmZpZygicGVyZm9yY2UudGltZXpvbmUiLCBhKQorICAgIGlmIG8gaW4gKCItLXN0aXRjaCIpOgorICAgICAgICBnaXQuc2V0X2NvbmZpZygicGVyZm9yY2UuJXMucGF0aCIgJSBicmFuY2gsIGEpCisgICAgICAgIHN0aXRjaCA9IDEKKworaWYgbGVuKGFyZ3MpID09IDI6CisgICAgYnJhbmNoID0gYXJnc1sxXQorICAgIGdpdC5jaGVja291dChicmFuY2gpCisgICAgaWYgYnJhbmNoID09IGdpdC5jdXJyZW50X2JyYW5jaCgpOgorICAgICAgICBkaWUoIkJyYW5jaCAlcyBhbHJlYWR5IGV4aXN0cyEiICUgYnJhbmNoKQorICAgIHJlcG9ydCgxLCAiU2V0dGluZyBwZXJmb3JjZSB0byAiLCBhcmdzWzBdKQorICAgIGdpdC5zZXRfY29uZmlnKCJwZXJmb3JjZS4lcy5wYXRoIiAlIGJyYW5jaCwgYXJnc1swXSkKK2VsaWYgbGVuKGFyZ3MpICE9IDA6CisgICAgZGllKCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSBwZXJmb3JjZSAvL2RlcG90L3BhdGggYW5kIGdpdCBicmFuY2giKQorCitwNHBhdGggPSBnaXQuZ2V0X2NvbmZpZygicGVyZm9yY2UuJXMucGF0aCIgJSBicmFuY2gpCitpZiBwNHBhdGggPT0gTm9uZToKKyAgICBkaWUoIkRvIG5vdCBrbm93IFBlcmZvcmNlIC8vZGVwb3QvcGF0aCBmb3IgZ2l0IGJyYW5jaCIsIGJyYW5jaCkKKworcDQgPSBwNF9jb21tYW5kKHA0cGF0aCkKKworZm9yIG8sIGEgaW4gb3B0czoKKyAgICBpZiBvIGluICgiLWEiLCAiLS1hdXRob3JzIik6CisgICAgICAgIHA0LmF1dGhvcnMoYSkKKworbG9jYWxkaXIgPSBnaXQuYmFzZWRpcigpCitpZiBwNC53aGVyZSgpWzpsZW4obG9jYWxkaXIpXSAhPSBsb2NhbGRpcjoKKyAgICByZXBvcnQoMSwgIioqV0FSTklORyoqIEFwcGVhcnMgcDQgY2xpZW50IGlzIG1pc2NvbmZpZ3VyZWQiKQorICAgIHJlcG9ydCgxLCAiICAgZm9yIHN5bmMgZnJvbSAlcyB0byAlcyIgJSAocDQucmVwb3BhdGgsIGxvY2FsZGlyKSkKKyAgICBpZiBpZ25vcmVfd2FybmluZ3MgIT0gVHJ1ZToKKyAgICAgICAgZGllKCJSZWNvbmZpZ3VyZSBvciB1c2UgXCItLWlnbm9yZVwiIG9uIGNvbW1hbmQgbGluZSIpCisKK2lmIHN0aXRjaCA9PSAwOgorICAgIHRvcCA9IGdpdC50b3BfY2hhbmdlKGJyYW5jaCkKK2Vsc2U6CisgICAgdG9wID0gMAorY2hhbmdlcyA9IHA0LmNoYW5nZXModG9wKQorY291bnQgPSBsZW4oY2hhbmdlcykKK2lmIGNvdW50ID09IDA6CisgICAgcmVwb3J0KDEsICJBbHJlYWR5IHVwIHRvIGRhdGUuLi4iKQorICAgIHN5cy5leGl0KDApCisKK3B0eiA9IGdpdC5nZXRfY29uZmlnKCJwZXJmb3JjZS50aW1lem9uZSIpCitpZiBwdHo6CisgICAgcmVwb3J0KDEsICJTZXR0aW5nIHRpbWV6b25lIHRvIiwgcHR6KQorICAgIG9zLmVudmlyb25bJ1RaJ10gPSBwdHoKKyAgICB0aW1lLnR6c2V0KCkKKworaWYgc3RpdGNoID09IDE6CisgICAgZ2l0LnJlbW92ZV9maWxlcygpCisgICAgZ2l0LmNsZWFuX2RpcmVjdG9yaWVzKCkKKyAgICBwNC5zeW5jKGNoYW5nZXNbMF0sIGZvcmNlPVRydWUpCitlbGlmIHRvcCA9PSAwIGFuZCBicmFuY2ggIT0gZ2l0LmN1cnJlbnRfYnJhbmNoKCk6CisgICAgcDQuc3luYyhjaGFuZ2VzWzBdLCB0ZXN0PVRydWUpCisgICAgcmVwb3J0KDEsICJDcmVhdGluZyBuZXcgaW5pdGlhbCBjb21taXQiKTsKKyAgICBnaXQuZnJlc2hfYnJhbmNoKGJyYW5jaCkKKyAgICBwNC5zeW5jKGNoYW5nZXNbMF0sIGZvcmNlPVRydWUpCitlbHNlOgorICAgIHA0LnN5bmMoY2hhbmdlc1swXSwgdHJpY2s9VHJ1ZSkKKworcmVwb3J0KDEsICJwcm9jZXNzaW5nICVzIGNoYW5nZXMgZnJvbSBwNCAoJXMpIHRvIGdpdCAoJXMpIiAlIChjb3VudCwgcDQucmVwb3BhdGgsIGJyYW5jaCkpCitmb3IgaWQgaW4gY2hhbmdlczoKKyAgICByZXBvcnQoMSwgIkltcG9ydGluZyBjaGFuZ2VzZXQiLCBpZCkKKyAgICBjaGFuZ2UgPSBwNC5kZXNjcmliZShpZCkKKyAgICBwNC5zeW5jKGlkKQorICAgIGlmIHRhZ2FsbCA6CisgICAgICAgICAgICBnaXQuY29tbWl0KGNoYW5nZS5hdXRob3IsIGNoYW5nZS5lbWFpbCwgY2hhbmdlLmRhdGUsIGNoYW5nZS5tc2csIGlkKQorICAgIGVsc2U6CisgICAgICAgICAgICBnaXQuY29tbWl0KGNoYW5nZS5hdXRob3IsIGNoYW5nZS5lbWFpbCwgY2hhbmdlLmRhdGUsIGNoYW5nZS5tc2csICJpbXBvcnQiKQorICAgIGlmIHN0aXRjaCA9PSAxOgorICAgICAgICBnaXQuY2xlYW5fZGlyZWN0b3JpZXMoKQorICAgICAgICBzdGl0Y2ggPSAwCisKZGlmZiAtLWdpdCBhL2dpdC1wYXJzZS1yZW1vdGUuc2ggYi9naXQtcGFyc2UtcmVtb3RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4N2YwODgKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcGFyc2UtcmVtb3RlLnNoCkBAIC0wLDAgKzEsMjExIEBACisjIS9iaW4vc2gKKworIyBnaXQtbHMtcmVtb3RlIGNvdWxkIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgYSBnaXQgbWFuYWdlZCByZXBvc2l0b3J5OworIyB0aGlzIHdvdWxkIGZhaWwgaW4gdGhhdCBjYXNlIGFuZCB3b3VsZCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgorR0lUX0RJUj0kKGdpdC1yZXYtcGFyc2UgLS1naXQtZGlyIDI+L2Rldi9udWxsKSB8fCA6OworCitnZXRfZGF0YV9zb3VyY2UgKCkgeworCWNhc2UgIiQxIiBpbgorCSovKikKKwkJIyBOb3Qgc28gZmFzdC4JVGhpcyBjb3VsZCBiZSB0aGUgcGFydGlhbCBVUkwgc2hvcnRoYW5kLi4uCisJCXRva2VuPSQoZXhwciAieiQxIiA6ICd6XChbXi9dKlwpLycpCisJCXJlbWFpbmRlcj0kKGV4cHIgInokMSIgOiAnelteL10qL1woLipcKScpCisJCWlmIHRlc3QgIiQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0ICJyZW1vdGUuJHRva2VuLnVybCIpIgorCQl0aGVuCisJCQllY2hvIGNvbmZpZy1wYXJ0aWFsCisJCWVsaWYgdGVzdCAtZiAiJEdJVF9ESVIvYnJhbmNoZXMvJHRva2VuIgorCQl0aGVuCisJCQllY2hvIGJyYW5jaGVzLXBhcnRpYWwKKwkJZWxzZQorCQkJZWNobyAnJworCQlmaQorCQk7OworCSopCisJCWlmIHRlc3QgIiQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0ICJyZW1vdGUuJDEudXJsIikiCisJCXRoZW4KKwkJCWVjaG8gY29uZmlnCisJCWVsaWYgdGVzdCAtZiAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIKKwkJdGhlbgorCQkJZWNobyByZW1vdGVzCisJCWVsaWYgdGVzdCAtZiAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiCisJCXRoZW4KKwkJCWVjaG8gYnJhbmNoZXMKKwkJZWxzZQorCQkJZWNobyAnJworCQlmaSA7OworCWVzYWMKK30KKworZ2V0X3JlbW90ZV91cmwgKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCScnKQorCQllY2hvICIkMSIgOzsKKwljb25maWctcGFydGlhbCkKKwkJdG9rZW49JChleHByICJ6JDEiIDogJ3pcKFteL10qXCkvJykKKwkJcmVtYWluZGVyPSQoZXhwciAieiQxIiA6ICd6W14vXSovXCguKlwpJykKKwkJdXJsPSQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0ICJyZW1vdGUuJHRva2VuLnVybCIpCisJCWVjaG8gIiR1cmwvJHJlbWFpbmRlciIKKwkJOzsKKwljb25maWcpCisJCWdpdC1yZXBvLWNvbmZpZyAtLWdldCAicmVtb3RlLiQxLnVybCIKKwkJOzsKKwlyZW1vdGVzKQorCQlzZWQgLW5lICcvXlVSTDogKi97CisJCQlzLy8vcAorCQkJcQorCQl9JyAiJEdJVF9ESVIvcmVtb3Rlcy8kMSIgOzsKKwlicmFuY2hlcykKKwkJc2VkIC1lICdzLyMuKi8vJyAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiIDs7CisJYnJhbmNoZXMtcGFydGlhbCkKKwkJdG9rZW49JChleHByICJ6JDEiIDogJ3pcKFteL10qXCkvJykKKwkJcmVtYWluZGVyPSQoZXhwciAieiQxIiA6ICd6W14vXSovXCguKlwpJykKKwkJdXJsPSQoc2VkIC1lICdzLyMuKi8vJyAiJEdJVF9ESVIvYnJhbmNoZXMvJHRva2VuIikKKwkJZWNobyAiJHVybC8kcmVtYWluZGVyIgorCQk7OworCSopCisJCWRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtdXJsICQxIiA7OworCWVzYWMKK30KKworZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX3B1c2ggKCkgeworCWRhdGFfc291cmNlPSQoZ2V0X2RhdGFfc291cmNlICIkMSIpCisJY2FzZSAiJGRhdGFfc291cmNlIiBpbgorCScnIHwgY29uZmlnLXBhcnRpYWwgfCBicmFuY2hlcyB8IGJyYW5jaGVzLXBhcnRpYWwpCisJCTs7ICMgbm8gZGVmYXVsdCBwdXNoIG1hcHBpbmcsIGp1c3Qgc2VuZCBtYXRjaGluZyByZWZzLgorCWNvbmZpZykKKwkJZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LWFsbCAicmVtb3RlLiQxLnB1c2giIDs7CisJcmVtb3RlcykKKwkJc2VkIC1uZSAnL15QdXNoOiAqL3sKKwkJCXMvLy9wCisJCX0nICIkR0lUX0RJUi9yZW1vdGVzLyQxIiA7OworCSopCisJCWRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtZGVmYXVsdC1yZWYtZm9yLXB1c2ggJDEiIDs7CisJZXNhYworfQorCisjIFN1YnJvdXRpbmUgdG8gY2Fub25pY2FsaXplIHJlbW90ZTpsb2NhbCBub3RhdGlvbi4KK2Nhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggKCkgeworCSMgTGVhdmUgb25seSB0aGUgZmlyc3Qgb25lIGFsb25lOyBhZGQgcHJlZml4IC4gdG8gdGhlIHJlc3QKKwkjIHRvIHByZXZlbnQgdGhlIHNlY29uZGFyeSBicmFuY2hlcyB0byBiZSBtZXJnZWQgYnkgZGVmYXVsdC4KKwlkb3RfcHJlZml4PQorCWZvciByZWYKKwlkbworCQlmb3JjZT0KKwkJY2FzZSAiJHJlZiIgaW4KKwkJKyopCisJCQlyZWY9JChleHByICJ6JHJlZiIgOiAneitcKC4qXCknKQorCQkJZm9yY2U9KworCQkJOzsKKwkJZXNhYworCQlleHByICJ6JHJlZiIgOiAnei4qOicgPi9kZXYvbnVsbCB8fCByZWY9IiR7cmVmfToiCisJCXJlbW90ZT0kKGV4cHIgInokcmVmIiA6ICd6XChbXjpdKlwpOicpCisJCWxvY2FsPSQoZXhwciAieiRyZWYiIDogJ3pbXjpdKjpcKC4qXCknKQorCQljYXNlICIkcmVtb3RlIiBpbgorCQknJykgcmVtb3RlPUhFQUQgOzsKKwkJcmVmcy9oZWFkcy8qIHwgcmVmcy90YWdzLyogfCByZWZzL3JlbW90ZXMvKikgOzsKKwkJaGVhZHMvKiB8IHRhZ3MvKiB8IHJlbW90ZXMvKiApIHJlbW90ZT0icmVmcy8kcmVtb3RlIiA7OworCQkqKSByZW1vdGU9InJlZnMvaGVhZHMvJHJlbW90ZSIgOzsKKwkJZXNhYworCQljYXNlICIkbG9jYWwiIGluCisJCScnKSBsb2NhbD0gOzsKKwkJcmVmcy9oZWFkcy8qIHwgcmVmcy90YWdzLyogfCByZWZzL3JlbW90ZXMvKikgOzsKKwkJaGVhZHMvKiB8IHRhZ3MvKiB8IHJlbW90ZXMvKiApIGxvY2FsPSJyZWZzLyRsb2NhbCIgOzsKKwkJKikgbG9jYWw9InJlZnMvaGVhZHMvJGxvY2FsIiA7OworCQllc2FjCisKKwkJaWYgbG9jYWxfcmVmX25hbWU9JChleHByICJ6JGxvY2FsIiA6ICd6cmVmcy9cKC4qXCknKQorCQl0aGVuCisJCSAgIGdpdC1jaGVjay1yZWYtZm9ybWF0ICIkbG9jYWxfcmVmX25hbWUiIHx8CisJCSAgIGRpZSAiKiByZWZ1c2luZyB0byBjcmVhdGUgZnVubnkgcmVmICckbG9jYWxfcmVmX25hbWUnIGxvY2FsbHkiCisJCWZpCisJCWVjaG8gIiR7ZG90X3ByZWZpeH0ke2ZvcmNlfSR7cmVtb3RlfToke2xvY2FsfSIKKwkJZG90X3ByZWZpeD0uCisJZG9uZQorfQorCisjIFJldHVybnMgbGlzdCBvZiBzcmM6IChubyBzdG9yZSksIG9yIHNyYzpkc3QgKHN0b3JlKQorZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX2ZldGNoICgpIHsKKwlkYXRhX3NvdXJjZT0kKGdldF9kYXRhX3NvdXJjZSAiJDEiKQorCWNhc2UgIiRkYXRhX3NvdXJjZSIgaW4KKwknJyB8IGNvbmZpZy1wYXJ0aWFsIHwgYnJhbmNoZXMtcGFydGlhbCkKKwkJZWNobyAiSEVBRDoiIDs7CisJY29uZmlnKQorCQljYW5vbl9yZWZzX2xpc3RfZm9yX2ZldGNoIFwKKwkJCSQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LWFsbCAicmVtb3RlLiQxLmZldGNoIikgOzsKKwlicmFuY2hlcykKKwkJcmVtb3RlX2JyYW5jaD0kKHNlZCAtbmUgJy8jL3MvLiojLy9wJyAiJEdJVF9ESVIvYnJhbmNoZXMvJDEiKQorCQljYXNlICIkcmVtb3RlX2JyYW5jaCIgaW4gJycpIHJlbW90ZV9icmFuY2g9bWFzdGVyIDs7IGVzYWMKKwkJZWNobyAicmVmcy9oZWFkcy8ke3JlbW90ZV9icmFuY2h9OnJlZnMvaGVhZHMvJDEiCisJCTs7CisJcmVtb3RlcykKKwkJIyBUaGlzIHByZWZpeGVzIHRoZSBzZWNvbmQgYW5kIGxhdGVyIGRlZmF1bHQgcmVmc3BlY3MKKwkJIyB3aXRoIGEgJy4nLCB0byBzaWduYWwgZ2l0LWZldGNoIHRvIG1hcmsgdGhlbQorCQkjIG5vdC1mb3ItbWVyZ2UuCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggJChzZWQgLW5lICcvXlB1bGw6ICoveworCQkJCQkJcy8vL3AKKwkJCQkJfScgIiRHSVRfRElSL3JlbW90ZXMvJDEiKQorCQk7OworCSopCisJCWRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtZGVmYXVsdC1yZWYtZm9yLXB1c2ggJDEiIDs7CisJZXNhYworfQorCitnZXRfcmVtb3RlX3JlZnNfZm9yX3B1c2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItcHVzaC4iIDs7CisJMSkgZ2V0X3JlbW90ZV9kZWZhdWx0X3JlZnNfZm9yX3B1c2ggIiRAIiA7OworCSopIHNoaWZ0OyBlY2hvICIkQCIgOzsKKwllc2FjCit9CisKK2dldF9yZW1vdGVfcmVmc19mb3JfZmV0Y2ggKCkgeworCWNhc2UgIiQjIiBpbgorCTApCisJICAgIGRpZSAiaW50ZXJuYWwgZXJyb3I6IGdldC1yZW1vdGUtcmVmcy1mb3ItZmV0Y2guIiA7OworCTEpCisJICAgIGdldF9yZW1vdGVfZGVmYXVsdF9yZWZzX2Zvcl9mZXRjaCAiJEAiIDs7CisJKikKKwkgICAgc2hpZnQKKwkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkgICAgZm9yIHJlZgorCSAgICBkbworCQlpZiB0ZXN0ICIkdGFnX2p1c3Rfc2VlbiIKKwkJdGhlbgorCQkgICAgZWNobyAicmVmcy90YWdzLyR7cmVmfTpyZWZzL3RhZ3MvJHtyZWZ9IgorCQkgICAgdGFnX2p1c3Rfc2Vlbj0KKwkJICAgIGNvbnRpbnVlCisJCWVsc2UKKwkJICAgIGNhc2UgIiRyZWYiIGluCisJCSAgICB0YWcpCisJCQl0YWdfanVzdF9zZWVuPXllcworCQkJY29udGludWUKKwkJCTs7CisJCSAgICBlc2FjCisJCWZpCisJCWNhbm9uX3JlZnNfbGlzdF9mb3JfZmV0Y2ggIiRyZWYiCisJICAgIGRvbmUKKwkgICAgOzsKKwllc2FjCit9CisKK3Jlc29sdmVfYWx0ZXJuYXRlcyAoKSB7CisJIyBvcmlnaW5hbCBVUkwgKHh4eC5naXQpCisJdG9wXz1gZXhwciAieiQxIiA6ICd6XChbXjpdKjovKlteL10qXCkvJ2AKKwl3aGlsZSByZWFkIHBhdGgKKwlkbworCQljYXNlICIkcGF0aCIgaW4KKwkJXCMqIHwgJycpCisJCQljb250aW51ZSA7OworCQkvKikKKwkJCWVjaG8gIiR0b3BfJHBhdGgvIiA7OworCQkuLi8qKQorCQkJIyByZWxhdGl2ZSAtLSB1Z2x5IGJ1dCBzZWVtcyB0byB3b3JrLgorCQkJZWNobyAiJDEvb2JqZWN0cy8kcGF0aC8iIDs7CisJCSopCisJCQkjIGV4aXQgY29kZSBtYXkgbm90IGJlIGNhdWdodCBieSB0aGUgcmVhZGVyLgorCQkJZWNobyAiYmFkIGFsdGVybmF0ZTogJHBhdGgiCisJCQlleGl0IDEgOzsKKwkJZXNhYworCWRvbmUKK30KZGlmZiAtLWdpdCBhL2dpdC1wdWxsLnNoIGIvZ2l0LXB1bGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjM4MDQzNwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1wdWxsLnNoCkBAIC0wLDAgKzEsMTA3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisjIEZldGNoIG9uZSBvciBtb3JlIHJlbW90ZSByZWZzIGFuZCBtZXJnZSBpdC90aGVtIGludG8gdGhlIGN1cnJlbnQgSEVBRC4KKworVVNBR0U9J1stbiB8IC0tbm8tc3VtbWFyeV0gWy0tbm8tY29tbWl0XSBbLXMgc3RyYXRlZ3ldLi4uIFs8ZmV0Y2gtb3B0aW9ucz5dIDxyZXBvPiA8aGVhZD4uLi4nCitMT05HX1VTQUdFPSdGZXRjaCBvbmUgb3IgbW9yZSByZW1vdGUgcmVmcyBhbmQgbWVyZ2UgaXQvdGhlbSBpbnRvIHRoZSBjdXJyZW50IEhFQUQuJworLiBnaXQtc2gtc2V0dXAKKworc3RyYXRlZ3lfYXJncz0gbm9fc3VtbWFyeT0gbm9fY29tbWl0PSBzcXVhc2g9Cit3aGlsZSBjYXNlICIkIywkMSIgaW4gMCkgYnJlYWsgOzsgKiwtKikgOzsgKikgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktbnwtLW58LS1ub3wtLW5vLXwtLW5vLXN8LS1uby1zdXwtLW5vLXN1bXwtLW5vLXN1bW18XAorCQktLW5vLXN1bW1hfC0tbm8tc3VtbWFyfC0tbm8tc3VtbWFyeSkKKwkJbm9fc3VtbWFyeT0tbiA7OworCS0tbm8tY3wtLW5vLWNvfC0tbm8tY29tfC0tbm8tY29tbXwtLW5vLWNvbW1pfC0tbm8tY29tbWl0KQorCQlub19jb21taXQ9LS1uby1jb21taXQgOzsKKwktLXNxfC0tc3F1fC0tc3F1YXwtLXNxdWFzfC0tc3F1YXNoKQorCQlzcXVhc2g9LS1zcXVhc2ggOzsKKwktcz0qfC0tcz0qfC0tc3Q9KnwtLXN0cj0qfC0tc3RyYT0qfC0tc3RyYXQ9KnwtLXN0cmF0ZT0qfFwKKwkJLS1zdHJhdGVnPSp8LS1zdHJhdGVneT0qfFwKKwktc3wtLXN8LS1zdHwtLXN0cnwtLXN0cmF8LS1zdHJhdHwtLXN0cmF0ZXwtLXN0cmF0ZWd8LS1zdHJhdGVneSkKKwkJY2FzZSAiJCMsJDEiIGluCisJCSosKj0qKQorCQkJc3RyYXRlZ3k9YGV4cHIgInokMSIgOiAnei1bXj1dKj1cKC4qXCknYCA7OworCQkxLCopCisJCQl1c2FnZSA7OworCQkqKQorCQkJc3RyYXRlZ3k9IiQyIgorCQkJc2hpZnQgOzsKKwkJZXNhYworCQlzdHJhdGVneV9hcmdzPSIke3N0cmF0ZWd5X2FyZ3N9LXMgJHN0cmF0ZWd5ICIKKwkJOzsKKwktaHwtLWh8LS1oZXwtLWhlbHwtLWhlbHApCisJCXVzYWdlCisJCTs7CisJLSopCisJCSMgUGFzcyB0aHJ1IGFueXRoaW5nIHRoYXQgaXMgbWVhbnQgZm9yIGZldGNoLgorCQlicmVhaworCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQorCitvcmlnX2hlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpIHx8IGRpZSAiUHVsbGluZyBpbnRvIGEgYmxhY2sgaG9sZT8iCitnaXQtZmV0Y2ggLS11cGRhdGUtaGVhZC1vayAtLXJlZmxvZy1hY3Rpb249cHVsbCAiJEAiIHx8IGV4aXQgMQorCitjdXJyX2hlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpCitpZiB0ZXN0ICIkY3Vycl9oZWFkIiAhPSAiJG9yaWdfaGVhZCIKK3RoZW4KKwkjIFRoZSBmZXRjaCBpbnZvbHZlZCB1cGRhdGluZyB0aGUgY3VycmVudCBicmFuY2guCisKKwkjIFRoZSB3b3JraW5nIHRyZWUgYW5kIHRoZSBpbmRleCBmaWxlIGlzIHN0aWxsIGJhc2VkIG9uIHRoZQorCSMgJG9yaWdfaGVhZCBjb21taXQsIGJ1dCB3ZSBhcmUgbWVyZ2luZyBpbnRvICRjdXJyX2hlYWQuCisJIyBGaXJzdCB1cGRhdGUgdGhlIHdvcmtpbmcgdHJlZSB0byBtYXRjaCAkY3Vycl9oZWFkLgorCisJZWNobyA+JjIgIldhcm5pbmc6IGZldGNoIHVwZGF0ZWQgdGhlIGN1cnJlbnQgYnJhbmNoIGhlYWQuIgorCWVjaG8gPiYyICJXYXJuaW5nOiBmYXN0IGZvcndhcmRpbmcgeW91ciB3b3JraW5nIHRyZWUgZnJvbSIKKwllY2hvID4mMiAiV2FybmluZzogJG9yaWdfaGVhZCBjb21taXQuIgorCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIDI+L2Rldi9udWxsCisJZ2l0LXJlYWQtdHJlZSAtdSAtbSAiJG9yaWdfaGVhZCIgIiRjdXJyX2hlYWQiIHx8CisJCWRpZSAnQ2Fubm90IGZhc3QtZm9yd2FyZCB5b3VyIHdvcmtpbmcgdHJlZS4KK0FmdGVyIG1ha2luZyBzdXJlIHRoYXQgeW91IHNhdmVkIGFueXRoaW5nIHByZWNpb3VzIGZyb20KKyQgZ2l0IGRpZmYgJyRvcmlnX2hlYWQnCitvdXRwdXQsIHJ1bgorJCBnaXQgcmVzZXQgLS1oYXJkCit0byByZWNvdmVyLicKKworZmkKKworbWVyZ2VfaGVhZD0kKHNlZCAtZSAnLwlub3QtZm9yLW1lcmdlCS9kJyBcCisJLWUgJ3MvCS4qLy8nICIkR0lUX0RJUiIvRkVUQ0hfSEVBRCB8IFwKKwl0ciAnXDAxMicgJyAnKQorCitjYXNlICIkbWVyZ2VfaGVhZCIgaW4KKycnKQorCWVjaG8gPiYyICJObyBjaGFuZ2VzLiIKKwlleGl0IDAKKwk7OworPyonICc/KikKKwl2YXI9YGdpdC1yZXBvLWNvbmZpZyAtLWdldCBwdWxsLm9jdG9wdXNgCisJaWYgdGVzdCAtbiAiJHZhciIKKwl0aGVuCisJCXN0cmF0ZWd5X2RlZmF1bHRfYXJncz0iLXMgJHZhciIKKwlmaQorCTs7CisqKQorCXZhcj1gZ2l0LXJlcG8tY29uZmlnIC0tZ2V0IHB1bGwudHdvaGVhZGAKKwlpZiB0ZXN0IC1uICIkdmFyIgorICAgICAgICB0aGVuCisJCXN0cmF0ZWd5X2RlZmF1bHRfYXJncz0iLXMgJHZhciIKKwlmaQorCTs7Citlc2FjCisKK2Nhc2UgIiRzdHJhdGVneV9hcmdzIiBpbgorJycpCisJc3RyYXRlZ3lfYXJncz0kc3RyYXRlZ3lfZGVmYXVsdF9hcmdzCisJOzsKK2VzYWMKKworbWVyZ2VfbmFtZT0kKGdpdC1mbXQtbWVyZ2UtbXNnIDwiJEdJVF9ESVIvRkVUQ0hfSEVBRCIpIHx8IGV4aXQKK2dpdC1tZXJnZSAiLS1yZWZsb2ctYWN0aW9uPXB1bGwgJCoiIFwKKwkkbm9fc3VtbWFyeSAkbm9fY29tbWl0ICRzcXVhc2ggJHN0cmF0ZWd5X2FyZ3MgXAorCSIkbWVyZ2VfbmFtZSIgSEVBRCAkbWVyZ2VfaGVhZApkaWZmIC0tZ2l0IGEvZ2l0LXF1aWx0aW1wb3J0LnNoIGIvZ2l0LXF1aWx0aW1wb3J0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwMTM1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcXVpbHRpbXBvcnQuc2gKQEAgLTAsMCArMSwxMTggQEAKKyMhL2Jpbi9zaAorVVNBR0U9Jy0tZHJ5LXJ1biAtLWF1dGhvciA8YXV0aG9yPiAtLXBhdGNoZXMgPC9wYXRoL3RvL3F1aWx0L3BhdGNoL2RpcmVjdG9yeT4nCitTVUJESVJFQ1RPUllfT049WWVzCisuIGdpdC1zaC1zZXR1cAorCitkcnlfcnVuPSIiCitxdWlsdF9hdXRob3I9IiIKK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhazs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLS1hdT0qfC0tYXV0PSp8LS1hdXRoPSp8LS1hdXRobz0qfC0tYXV0aG9yPSopCisJCXF1aWx0X2F1dGhvcj0kKGV4cHIgInokMSIgOiAnei1bXj1dKlwoLipcKScpCisJCXNoaWZ0CisJCTs7CisKKwktLWF1fC0tYXV0fC0tYXV0aHwtLWF1dGhvfC0tYXV0aG9yKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlxdWlsdF9hdXRob3I9IiQxIgorCQlzaGlmdAorCQk7OworCisJLS1kcnktcnVuKQorCQlzaGlmdAorCQlkcnlfcnVuPTEKKwkJOzsKKworCS0tcGE9KnwtLXBhdD0qfC0tcGF0Yz0qfC0tcGF0Y2g9KnwtLXBhdGNoZT0qfC0tcGF0Y2hlcz0qKQorCQlRVUlMVF9QQVRDSEVTPSQoZXhwciAieiQxIiA6ICd6LVtePV0qXCguKlwpJykKKwkJc2hpZnQKKwkJOzsKKworCS0tcGF8LS1wYXR8LS1wYXRjfC0tcGF0Y2h8LS1wYXRjaGV8LS1wYXRjaGVzKQorCQljYXNlICIkIyIgaW4gMSkgdXNhZ2UgOzsgZXNhYworCQlzaGlmdAorCQlRVUlMVF9QQVRDSEVTPSIkMSIKKwkJc2hpZnQKKwkJOzsKKworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworZG9uZQorCisjIFF1aWx0IEF1dGhvcgoraWYgWyAtbiAiJHF1aWx0X2F1dGhvciIgXSA7IHRoZW4KKwlxdWlsdF9hdXRob3JfbmFtZT0kKGV4cHIgInokcXVpbHRfYXV0aG9yIiA6ICd6XCguKlteIF1cKSAqPC4qJykgJiYKKwlxdWlsdF9hdXRob3JfZW1haWw9JChleHByICJ6JHF1aWx0X2F1dGhvciIgOiAnLio8XChbXj5dKlwpJykgJiYKKwl0ZXN0ICcnICE9ICIkcXVpbHRfYXV0aG9yX25hbWUiICYmCisJdGVzdCAnJyAhPSAiJHF1aWx0X2F1dGhvcl9lbWFpbCIgfHwKKwlkaWUgIm1hbGZvcm1lZCAtLWF1dGhvciBwYXJhbWV0ZXIiCitmaQorCisjIFF1aWx0IHBhdGNoIGRpcmVjdG9yeQorOiAke1FVSUxUX1BBVENIRVM6PXBhdGNoZXN9CitpZiAhIFsgLWQgIiRRVUlMVF9QQVRDSEVTIiBdIDsgdGhlbgorCWVjaG8gIlRoZSBcIiRRVUlMVF9QQVRDSEVTXCIgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiIKKwlleGl0IDEKK2ZpCisKKyMgVGVtcG9yYXkgZGlyZWN0b3JpZXMKK3RtcF9kaXI9LmRvdGVzdAordG1wX21zZz0iJHRtcF9kaXIvbXNnIgordG1wX3BhdGNoPSIkdG1wX2Rpci9wYXRjaCIKK3RtcF9pbmZvPSIkdG1wX2Rpci9pbmZvIgorCisKKyMgRmluZCB0aGUgaW50aWFsIGNvbW1pdAorY29tbWl0PSQoZ2l0LXJldi1wYXJzZSBIRUFEKQorCitta2RpciAkdG1wX2RpciB8fCBleGl0IDIKK2ZvciBwYXRjaF9uYW1lIGluICQoY2F0ICIkUVVJTFRfUEFUQ0hFUy9zZXJpZXMiIHwgZ3JlcCAtdiAnXiMnKTsgZG8KKwllY2hvICRwYXRjaF9uYW1lCisJKGNhdCAkUVVJTFRfUEFUQ0hFUy8kcGF0Y2hfbmFtZSB8IGdpdC1tYWlsaW5mbyAiJHRtcF9tc2ciICIkdG1wX3BhdGNoIiA+ICIkdG1wX2luZm8iKSB8fCBleGl0IDMKKworCSMgUGFyc2UgdGhlIGF1dGhvciBpbmZvcm1hdGlvbgorCWV4cG9ydCBHSVRfQVVUSE9SX05BTUU9JChzZWQgLW5lICdzL0F1dGhvcjogLy9wJyAiJHRtcF9pbmZvIikKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0kKHNlZCAtbmUgJ3MvRW1haWw6IC8vcCcgIiR0bXBfaW5mbyIpCisJd2hpbGUgdGVzdCAteiAiJEdJVF9BVVRIT1JfRU1BSUwiICYmIHRlc3QgLXogIiRHSVRfQVVUSE9SX05BTUUiIDsgZG8KKwkJaWYgWyAtbiAiJHF1aWx0X2F1dGhvciIgXSA7IHRoZW4KKwkJCUdJVF9BVVRIT1JfTkFNRT0iJHF1aWx0X2F1dGhvcl9uYW1lIjsKKwkJCUdJVF9BVVRIT1JfRU1BSUw9IiRxdWlsdF9hdXRob3JfZW1haWwiOworCQllbGlmIFsgLW4gIiRkcnlfcnVuIiBdOyB0aGVuCisJCQllY2hvICJObyBhdXRob3IgZm91bmQgaW4gJHBhdGNoX25hbWUiID4mMjsKKwkJCUdJVF9BVVRIT1JfTkFNRT0iZHJ5LXJ1bi1ub3QtZm91bmQiOworCQkJR0lUX0FVVEhPUl9FTUFJTD0iZHJ5LXJ1bi1ub3QtZm91bmQiOworCQllbHNlCisJCQllY2hvICJObyBhdXRob3IgZm91bmQgaW4gJHBhdGNoX25hbWUiID4mMjsKKwkJCWVjaG8gIi0tLSIKKwkJCWNhdCAkdG1wX21zZworCQkJZWNobyAtbiAiQXV0aG9yOiAiOworCQkJcmVhZCBwYXRjaF9hdXRob3IKKworCQkJZWNobyAiJHBhdGNoX2F1dGhvciIKKworCQkJcGF0Y2hfYXV0aG9yX25hbWU9JChleHByICJ6JHBhdGNoX2F1dGhvciIgOiAnelwoLipbXiBdXCkgKjwuKicpICYmCisJCQlwYXRjaF9hdXRob3JfZW1haWw9JChleHByICJ6JHBhdGNoX2F1dGhvciIgOiAnLio8XChbXj5dKlwpJykgJiYKKwkJCXRlc3QgJycgIT0gIiRwYXRjaF9hdXRob3JfbmFtZSIgJiYKKwkJCXRlc3QgJycgIT0gIiRwYXRjaF9hdXRob3JfZW1haWwiICYmCisJCQlHSVRfQVVUSE9SX05BTUU9IiRwYXRjaF9hdXRob3JfbmFtZSIgJiYKKwkJCUdJVF9BVVRIT1JfRU1BSUw9IiRwYXRjaF9hdXRob3JfZW1haWwiCisJCWZpCisJZG9uZQorCWV4cG9ydCBHSVRfQVVUSE9SX0RBVEU9JChzZWQgLW5lICdzL0RhdGU6IC8vcCcgIiR0bXBfaW5mbyIpCisJZXhwb3J0IFNVQkpFQ1Q9JChzZWQgLW5lICdzL1N1YmplY3Q6IC8vcCcgIiR0bXBfaW5mbyIpCisJaWYgWyAteiAiJFNVQkpFQ1QiIF0gOyB0aGVuCisJCVNVQkpFQ1Q9JChlY2hvICRwYXRjaF9uYW1lIHwgc2VkIC1lICdzLy5wYXRjaCQvLycpCisJZmkKKworCWlmIFsgLXogIiRkcnlfcnVuIiBdIDsgdGhlbgorCQlnaXQtYXBwbHkgLS1pbmRleCAtQzEgIiR0bXBfcGF0Y2giICYmCisJCXRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKwkJY29tbWl0PSQoKGVjaG8gIiRTVUJKRUNUIjsgZWNobzsgY2F0ICIkdG1wX21zZyIpIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlIC1wICRjb21taXQpICYmCisJCWdpdC11cGRhdGUtcmVmIC1tICJxdWlsdGltcG9ydDogJHBhdGNoX25hbWUiIEhFQUQgJGNvbW1pdCB8fCBleGl0IDQKKwlmaQorZG9uZQorcm0gLXJmICR0bXBfZGlyIHx8IGV4aXQgNQpkaWZmIC0tZ2l0IGEvZ2l0LXJlYmFzZS5zaCBiL2dpdC1yZWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2QzYTVkMAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZWJhc2Uuc2gKQEAgLTAsMCArMSwzMzIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8uCisjCisKK1VTQUdFPSdbLS1vbnRvIDxuZXdiYXNlPl0gPHVwc3RyZWFtPiBbPGJyYW5jaD5dJworTE9OR19VU0FHRT0nZ2l0LXJlYmFzZSByZXBsYWNlcyA8YnJhbmNoPiB3aXRoIGEgbmV3IGJyYW5jaCBvZiB0aGUKK3NhbWUgbmFtZS4gIFdoZW4gdGhlIC0tb250byBvcHRpb24gaXMgcHJvdmlkZWQgdGhlIG5ldyBicmFuY2ggc3RhcnRzCitvdXQgd2l0aCBhIEhFQUQgZXF1YWwgdG8gPG5ld2Jhc2U+LCBvdGhlcndpc2UgaXQgaXMgZXF1YWwgdG8gPHVwc3RyZWFtPgorSXQgdGhlbiBhdHRlbXB0cyB0byBjcmVhdGUgYSBuZXcgY29tbWl0IGZvciBlYWNoIGNvbW1pdCBmcm9tIHRoZSBvcmlnaW5hbAorPGJyYW5jaD4gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgPHVwc3RyZWFtPiBicmFuY2guCisKK0l0IGlzIHBvc3NpYmxlIHRoYXQgYSBtZXJnZSBmYWlsdXJlIHdpbGwgcHJldmVudCB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZworY29tcGxldGVseSBhdXRvbWF0aWMuICBZb3Ugd2lsbCBoYXZlIHRvIHJlc29sdmUgYW55IHN1Y2ggbWVyZ2UgZmFpbHVyZQorYW5kIHJ1biBnaXQgcmViYXNlIC0tY29udGludWUuICBBbm90aGVyIG9wdGlvbiBpcyB0byBieXBhc3MgdGhlIGNvbW1pdAordGhhdCBjYXVzZWQgdGhlIG1lcmdlIGZhaWx1cmUgd2l0aCBnaXQgcmViYXNlIC0tc2tpcC4gIFRvIHJlc3RvcmUgdGhlCitvcmlnaW5hbCA8YnJhbmNoPiBhbmQgcmVtb3ZlIHRoZSAuZG90ZXN0IHdvcmtpbmcgZmlsZXMsIHVzZSB0aGUgY29tbWFuZAorZ2l0IHJlYmFzZSAtLWFib3J0IGluc3RlYWQuCisKK05vdGUgdGhhdCBpZiA8YnJhbmNoPiBpcyBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZQorY3VycmVudGx5IGNoZWNrZWQgb3V0IGJyYW5jaCBpcyB1c2VkLiAgWW91IG11c3QgYmUgaW4gdGhlIHRvcAorZGlyZWN0b3J5IG9mIHlvdXIgcHJvamVjdCB0byBzdGFydCAob3IgY29udGludWUpIGEgcmViYXNlLgorCitFeGFtcGxlOiAgICAgICBnaXQtcmViYXNlIG1hc3Rlcn4xIHRvcGljCisKKyAgICAgICAgQS0tLUItLS1DIHRvcGljICAgICAgICAgICAgICAgICAgIEEnXCcnLS1CJ1wnJy0tQydcJycgdG9waWMKKyAgICAgICAvICAgICAgICAgICAgICAgICAgIC0tPiAgICAgICAgICAgLworICBELS0tRS0tLUYtLS1HIG1hc3RlciAgICAgICAgICBELS0tRS0tLUYtLS1HIG1hc3RlcgorJworLiBnaXQtc2gtc2V0dXAKKworUkVTT0xWRU1TRz0iCitXaGVuIHlvdSBoYXZlIHJlc29sdmVkIHRoaXMgcHJvYmxlbSBydW4gXCJnaXQgcmViYXNlIC0tY29udGludWVcIi4KK0lmIHlvdSB3b3VsZCBwcmVmZXIgdG8gc2tpcCB0aGlzIHBhdGNoLCBpbnN0ZWFkIHJ1biBcImdpdCByZWJhc2UgLS1za2lwXCIuCitUbyByZXN0b3JlIHRoZSBvcmlnaW5hbCBicmFuY2ggYW5kIHN0b3AgcmViYXNpbmcgcnVuIFwiZ2l0IHJlYmFzZSAtLWFib3J0XCIuCisiCit1bnNldCBuZXdiYXNlCitzdHJhdGVneT1yZWN1cnNpdmUKK2RvX21lcmdlPQorZG90ZXN0PSRHSVRfRElSLy5kb3Rlc3QtbWVyZ2UKK3ByZWM9NAorCitjb250aW51ZV9tZXJnZSAoKSB7CisJdGVzdCAtbiAiJHByZXZfaGVhZCIgfHwgZGllICJwcmV2X2hlYWQgbXVzdCBiZSBkZWZpbmVkIgorCXRlc3QgLWQgIiRkb3Rlc3QiIHx8IGRpZSAiJGRvdGVzdCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QiCisKKwl1bm1lcmdlZD0kKGdpdC1scy1maWxlcyAtdSkKKwlpZiB0ZXN0IC1uICIkdW5tZXJnZWQiCisJdGhlbgorCQllY2hvICJZb3Ugc3RpbGwgaGF2ZSB1bm1lcmdlZCBwYXRocyBpbiB5b3VyIGluZGV4IgorCQllY2hvICJkaWQgeW91IGZvcmdldCB1cGRhdGUtaW5kZXg/IgorCQlkaWUgIiRSRVNPTFZFTVNHIgorCWZpCisKKwlpZiB0ZXN0IC1uICJgZ2l0LWRpZmYtaW5kZXggSEVBRGAiCisJdGhlbgorCQlpZiAhIGdpdC1jb21taXQgLUMgImBjYXQgJGRvdGVzdC9jdXJyZW50YCIKKwkJdGhlbgorCQkJZWNobyAiQ29tbWl0IGZhaWxlZCwgcGxlYXNlIGRvIG5vdCBjYWxsIFwiZ2l0IGNvbW1pdFwiIgorCQkJZWNobyAiZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiAiCisJCQlkaWUgIiRSRVNPTFZFTVNHIgorCQlmaQorCQlwcmludGYgIkNvbW1pdHRlZDogJTAke3ByZWN9ZCIgJG1zZ251bQorCWVsc2UKKwkJcHJpbnRmICJBbHJlYWR5IGFwcGxpZWQ6ICUwJHtwcmVjfWQiICRtc2dudW0KKwlmaQorCWVjaG8gJyAnYGdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIC0xIEhFQUQgfCBcCisJCQkJc2VkICdzL15bYS1mMC05XVwrIC8vJ2AKKworCXByZXZfaGVhZD1gZ2l0LXJldi1wYXJzZSBIRUFEXjBgCisJIyBzYXZlIHRoZSByZXN1bHRpbmcgY29tbWl0IHNvIHdlIGNhbiByZWFkLXRyZWUgb24gaXQgbGF0ZXIKKwllY2hvICIkcHJldl9oZWFkIiA+ICIkZG90ZXN0L3ByZXZfaGVhZCIKKworCSMgb250byB0aGUgbmV4dCBwYXRjaDoKKwltc2dudW09JCgoJG1zZ251bSArIDEpKQorCWVjaG8gIiRtc2dudW0iID4iJGRvdGVzdC9tc2dudW0iCit9CisKK2NhbGxfbWVyZ2UgKCkgeworCWNtdD0iJChjYXQgJGRvdGVzdC9jbXQuJDEpIgorCWVjaG8gIiRjbXQiID4gIiRkb3Rlc3QvY3VycmVudCIKKwlnaXQtbWVyZ2UtJHN0cmF0ZWd5ICIkY210XiIgLS0gSEVBRCAiJGNtdCIKKwlydj0kPworCWNhc2UgIiRydiIgaW4KKwkwKQorCQlyZXR1cm4KKwkJOzsKKwkxKQorCQl0ZXN0IC1kICIkR0lUX0RJUi9yci1jYWNoZSIgJiYgZ2l0LXJlcmVyZQorCQlkaWUgIiRSRVNPTFZFTVNHIgorCQk7OworCTIpCisJCWVjaG8gIlN0cmF0ZWd5OiAkcnYgJHN0cmF0ZWd5IGZhaWxlZCwgdHJ5IGFub3RoZXIiIDE+JjIKKwkJZGllICIkUkVTT0xWRU1TRyIKKwkJOzsKKwkqKQorCQlkaWUgIlVua25vd24gZXhpdCBjb2RlICgkcnYpIGZyb20gY29tbWFuZDoiIFwKKwkJCSJnaXQtbWVyZ2UtJHN0cmF0ZWd5ICRjbXReIC0tIEhFQUQgJGNtdCIKKwkJOzsKKwllc2FjCit9CisKK2ZpbmlzaF9yYl9tZXJnZSAoKSB7CisJcm0gLXIgIiRkb3Rlc3QiCisJZWNobyAiQWxsIGRvbmUuIgorfQorCit3aGlsZSBjYXNlICIkIyIgaW4gMCkgYnJlYWsgOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktLWNvbnRpbnVlKQorCQlkaWZmPSQoZ2l0LWRpZmYtZmlsZXMpCisJCWNhc2UgIiRkaWZmIiBpbgorCQk/KikJZWNobyAiWW91IG11c3QgZWRpdCBhbGwgbWVyZ2UgY29uZmxpY3RzIGFuZCB0aGVuIgorCQkJZWNobyAibWFyayB0aGVtIGFzIHJlc29sdmVkIHVzaW5nIGdpdCB1cGRhdGUtaW5kZXgiCisJCQlleGl0IDEKKwkJCTs7CisJCWVzYWMKKwkJaWYgdGVzdCAtZCAiJGRvdGVzdCIKKwkJdGhlbgorCQkJcHJldl9oZWFkPSJgY2F0ICRkb3Rlc3QvcHJldl9oZWFkYCIKKwkJCWVuZD0iYGNhdCAkZG90ZXN0L2VuZGAiCisJCQltc2dudW09ImBjYXQgJGRvdGVzdC9tc2dudW1gIgorCQkJb250bz0iYGNhdCAkZG90ZXN0L29udG9gIgorCQkJY29udGludWVfbWVyZ2UKKwkJCXdoaWxlIHRlc3QgIiRtc2dudW0iIC1sZSAiJGVuZCIKKwkJCWRvCisJCQkJY2FsbF9tZXJnZSAiJG1zZ251bSIKKwkJCQljb250aW51ZV9tZXJnZQorCQkJZG9uZQorCQkJZmluaXNoX3JiX21lcmdlCisJCQlleGl0CisJCWZpCisJCWdpdCBhbSAtLXJlc29sdmVkIC0tM3dheSAtLXJlc29sdmVtc2c9IiRSRVNPTFZFTVNHIiBcCisJCQktLXJlZmxvZy1hY3Rpb249cmViYXNlCisJCWV4aXQKKwkJOzsKKwktLXNraXApCisJCWlmIHRlc3QgLWQgIiRkb3Rlc3QiCisJCXRoZW4KKwkJCXByZXZfaGVhZD0iYGNhdCAkZG90ZXN0L3ByZXZfaGVhZGAiCisJCQllbmQ9ImBjYXQgJGRvdGVzdC9lbmRgIgorCQkJbXNnbnVtPSJgY2F0ICRkb3Rlc3QvbXNnbnVtYCIKKwkJCW1zZ251bT0kKCgkbXNnbnVtICsgMSkpCisJCQlvbnRvPSJgY2F0ICRkb3Rlc3Qvb250b2AiCisJCQl3aGlsZSB0ZXN0ICIkbXNnbnVtIiAtbGUgIiRlbmQiCisJCQlkbworCQkJCWNhbGxfbWVyZ2UgIiRtc2dudW0iCisJCQkJY29udGludWVfbWVyZ2UKKwkJCWRvbmUKKwkJCWZpbmlzaF9yYl9tZXJnZQorCQkJZXhpdAorCQlmaQorCQlnaXQgYW0gLTMgLS1za2lwIC0tcmVzb2x2ZW1zZz0iJFJFU09MVkVNU0ciIFwKKwkJCS0tcmVmbG9nLWFjdGlvbj1yZWJhc2UKKwkJZXhpdAorCQk7OworCS0tYWJvcnQpCisJCWlmIHRlc3QgLWQgIiRkb3Rlc3QiCisJCXRoZW4KKwkJCXJtIC1yICIkZG90ZXN0IgorCQllbGlmIHRlc3QgLWQgLmRvdGVzdAorCQl0aGVuCisJCQlybSAtciAuZG90ZXN0CisJCWVsc2UKKwkJCWRpZSAiTm8gcmViYXNlIGluIHByb2dyZXNzPyIKKwkJZmkKKwkJZ2l0IHJlc2V0IC0taGFyZCBPUklHX0hFQUQKKwkJZXhpdAorCQk7OworCS0tb250bykKKwkJdGVzdCAyIC1sZSAiJCMiIHx8IHVzYWdlCisJCW5ld2Jhc2U9IiQyIgorCQlzaGlmdAorCQk7OworCS1NfC1tfC0tbXwtLW1lfC0tbWVyfC0tbWVyZ3wtLW1lcmdlKQorCQlkb19tZXJnZT10CisJCTs7CisJLXM9KnwtLXM9KnwtLXN0PSp8LS1zdHI9KnwtLXN0cmE9KnwtLXN0cmF0PSp8LS1zdHJhdGU9KnxcCisJCS0tc3RyYXRlZz0qfC0tc3RyYXRlZ3k9KnxcCisJLXN8LS1zfC0tc3R8LS1zdHJ8LS1zdHJhfC0tc3RyYXR8LS1zdHJhdGV8LS1zdHJhdGVnfC0tc3RyYXRlZ3kpCisJCWNhc2UgIiQjLCQxIiBpbgorCQkqLCo9KikKKwkJCXN0cmF0ZWd5PWBleHByICJ6JDEiIDogJ3otW149XSo9XCguKlwpJ2AgOzsKKwkJMSwqKQorCQkJdXNhZ2UgOzsKKwkJKikKKwkJCXN0cmF0ZWd5PSIkMiIKKwkJCXNoaWZ0IDs7CisJCWVzYWMKKwkJZG9fbWVyZ2U9dAorCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKKyMgTWFrZSBzdXJlIHdlIGRvIG5vdCBoYXZlIC5kb3Rlc3QKK2lmIHRlc3QgLXogIiRkb19tZXJnZSIKK3RoZW4KKwlpZiBta2RpciAuZG90ZXN0CisJdGhlbgorCQlybWRpciAuZG90ZXN0CisJZWxzZQorCQllY2hvID4mMiAnCitJdCBzZWVtcyB0aGF0IEkgY2Fubm90IGNyZWF0ZSBhIC5kb3Rlc3QgZGlyZWN0b3J5LCBhbmQgSSB3b25kZXIgaWYgeW91CithcmUgaW4gdGhlIG1pZGRsZSBvZiBwYXRjaCBhcHBsaWNhdGlvbiBvciBhbm90aGVyIHJlYmFzZS4gIElmIHRoYXQgaXMgbm90Cit0aGUgY2FzZSwgcGxlYXNlIHJtIC1mciAuZG90ZXN0IGFuZCBydW4gbWUgYWdhaW4uICBJIGFtIHN0b3BwaW5nIGluIGNhc2UKK3lvdSBzdGlsbCBoYXZlIHNvbWV0aGluZyB2YWx1YWJsZSB0aGVyZS4nCisJCWV4aXQgMQorCWZpCitlbHNlCisJaWYgdGVzdCAtZCAiJGRvdGVzdCIKKwl0aGVuCisJCWRpZSAicHJldmlvdXMgZG90ZXN0IGRpcmVjdG9yeSAkZG90ZXN0IHN0aWxsIGV4aXN0cy4iIFwKKwkJCSd0cnkgZ2l0LXJlYmFzZSA8IC0tY29udGludWUgfCAtLWFib3J0ID4nCisJZmkKK2ZpCisKKyMgVGhlIHRyZWUgbXVzdCBiZSByZWFsbHkgcmVhbGx5IGNsZWFuLgorZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggfHwgZXhpdAorZGlmZj0kKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1zdGF0dXMgLXIgSEVBRCkKK2Nhc2UgIiRkaWZmIiBpbgorPyopCWVjaG8gIiRkaWZmIgorCWV4aXQgMQorCTs7Citlc2FjCisKKyMgVGhlIHVwc3RyZWFtIGhlYWQgbXVzdCBiZSBnaXZlbi4gIE1ha2Ugc3VyZSBpdCBpcyB2YWxpZC4KK3Vwc3RyZWFtX25hbWU9IiQxIgordXBzdHJlYW09YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgIiR7dXBzdHJlYW1fbmFtZX1eMCJgIHx8CisgICAgZGllICJpbnZhbGlkIHVwc3RyZWFtICR1cHN0cmVhbV9uYW1lIgorCisjIElmIGEgaG9vayBleGlzdHMsIGdpdmUgaXQgYSBjaGFuY2UgdG8gaW50ZXJydXB0CitpZiB0ZXN0IC14ICIkR0lUX0RJUi9ob29rcy9wcmUtcmViYXNlIgordGhlbgorCSIkR0lUX0RJUi9ob29rcy9wcmUtcmViYXNlIiAkezErIiRAIn0gfHwgeworCQllY2hvID4mMiAiVGhlIHByZS1yZWJhc2UgaG9vayByZWZ1c2VkIHRvIHJlYmFzZS4iCisJCWV4aXQgMQorCX0KK2ZpCisKKyMgSWYgdGhlIGJyYW5jaCB0byByZWJhc2UgaXMgZ2l2ZW4sIGZpcnN0IHN3aXRjaCB0byBpdC4KK2Nhc2UgIiQjIiBpbgorMikKKwlicmFuY2hfbmFtZT0iJDIiCisJZ2l0LWNoZWNrb3V0ICIkMiIgfHwgdXNhZ2UKKwk7OworKikKKwlicmFuY2hfbmFtZT1gZ2l0IHN5bWJvbGljLXJlZiBIRUFEYCB8fCBkaWUgIk5vIGN1cnJlbnQgYnJhbmNoIgorCWJyYW5jaF9uYW1lPWBleHByICJ6JGJyYW5jaF9uYW1lIiA6ICd6cmVmcy9oZWFkcy9cKC4qXCknYAorCTs7Citlc2FjCiticmFuY2g9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIke2JyYW5jaF9uYW1lfV4wIikgfHwgZXhpdAorCisjIE1ha2Ugc3VyZSB0aGUgYnJhbmNoIHRvIHJlYmFzZSBvbnRvIGlzIHZhbGlkLgorb250b19uYW1lPSR7bmV3YmFzZS0iJHVwc3RyZWFtX25hbWUifQorb250bz0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiR7b250b19uYW1lfV4wIikgfHwgZXhpdAorCisjIE5vdyB3ZSBhcmUgcmViYXNpbmcgY29tbWl0cyAkdXBzdHJlYW0uLiRicmFuY2ggb24gdG9wIG9mICRvbnRvCisKKyMgQ2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgYmFzZWQgb24gJG9udG8sIGJ1dCB0aGlzIHNob3VsZCBiZQorIyBkb25lIG9ubHkgd2hlbiB1cHN0cmVhbSBhbmQgb250byBhcmUgdGhlIHNhbWUuCittYj0kKGdpdC1tZXJnZS1iYXNlICIkb250byIgIiRicmFuY2giKQoraWYgdGVzdCAiJHVwc3RyZWFtIiA9ICIkb250byIgJiYgdGVzdCAiJG1iIiA9ICIkb250byIKK3RoZW4KKwllY2hvID4mMiAiQ3VycmVudCBicmFuY2ggJGJyYW5jaF9uYW1lIGlzIHVwIHRvIGRhdGUuIgorCWV4aXQgMAorZmkKKworIyBSZXdpbmQgdGhlIGhlYWQgdG8gIiRvbnRvIjsgdGhpcyBzYXZlcyBvdXIgY3VycmVudCBoZWFkIGluIE9SSUdfSEVBRC4KK2dpdC1yZXNldCAtLWhhcmQgIiRvbnRvIgorCisjIElmIHRoZSAkb250byBpcyBhIHByb3BlciBkZXNjZW5kYW50IG9mIHRoZSB0aXAgb2YgdGhlIGJyYW5jaCwgdGhlbgorIyB3ZSBqdXN0IGZhc3QgZm9yd2FyZGVkLgoraWYgdGVzdCAiJG1iIiA9ICIkYnJhbmNoIgordGhlbgorCWVjaG8gPiYyICJGYXN0LWZvcndhcmRlZCAkYnJhbmNoX25hbWUgdG8gJG9udG9fbmFtZS4iCisJZXhpdCAwCitmaQorCitpZiB0ZXN0IC16ICIkZG9fbWVyZ2UiCit0aGVuCisJZ2l0LWZvcm1hdC1wYXRjaCAtayAtLXN0ZG91dCAtLWZ1bGwtaW5kZXggIiR1cHN0cmVhbSIuLk9SSUdfSEVBRCB8CisJZ2l0IGFtIC0tYmluYXJ5IC0zIC1rIC0tcmVzb2x2ZW1zZz0iJFJFU09MVkVNU0ciIFwKKwkJLS1yZWZsb2ctYWN0aW9uPXJlYmFzZQorCWV4aXQgJD8KK2ZpCisKK2lmIHRlc3QgIkBATk9fUFlUSE9OQEAiICYmIHRlc3QgIiRzdHJhdGVneSIgPSAicmVjdXJzaXZlIgordGhlbgorCWRpZSAnVGhlIHJlY3Vyc2l2ZSBtZXJnZSBzdHJhdGVneSBjdXJyZW50bHkgcmVsaWVzIG9uIFB5dGhvbiwKK3doaWNoIHRoaXMgaW5zdGFsbGF0aW9uIG9mIGdpdCB3YXMgbm90IGNvbmZpZ3VyZWQgd2l0aC4gIFBsZWFzZSBjb25zaWRlcgorYSBkaWZmZXJlbnQgbWVyZ2Ugc3RyYXRlZ3kgKGUuZy4gb2N0b3B1cywgcmVzb2x2ZSwgc3R1cGlkLCBvdXJzKQorb3IgaW5zdGFsbCBQeXRob24gYW5kIGdpdCB3aXRoIFB5dGhvbiBzdXBwb3J0LicKKworZmkKKworIyBzdGFydCBkb2luZyBhIHJlYmFzZSB3aXRoIGdpdC1tZXJnZQorIyB0aGlzIGlzIHJlbmFtZS1hd2FyZSBpZiB0aGUgcmVjdXJzaXZlIChkZWZhdWx0KSBzdHJhdGVneSBpcyB1c2VkCisKK21rZGlyIC1wICIkZG90ZXN0IgorZWNobyAiJG9udG8iID4gIiRkb3Rlc3Qvb250byIKK3ByZXZfaGVhZD1gZ2l0LXJldi1wYXJzZSBIRUFEXjBgCitlY2hvICIkcHJldl9oZWFkIiA+ICIkZG90ZXN0L3ByZXZfaGVhZCIKKworbXNnbnVtPTAKK2ZvciBjbXQgaW4gYGdpdC1yZXYtbGlzdCAtLW5vLW1lcmdlcyAiJHVwc3RyZWFtIi4uT1JJR19IRUFEIFwKKwkJCXwgQEBQRVJMQEAgLWUgJ3ByaW50IHJldmVyc2UgPD4nYAorZG8KKwltc2dudW09JCgoJG1zZ251bSArIDEpKQorCWVjaG8gIiRjbXQiID4gIiRkb3Rlc3QvY210LiRtc2dudW0iCitkb25lCisKK2VjaG8gMSA+IiRkb3Rlc3QvbXNnbnVtIgorZWNobyAkbXNnbnVtID4iJGRvdGVzdC9lbmQiCisKK2VuZD0kbXNnbnVtCittc2dudW09MQorCit3aGlsZSB0ZXN0ICIkbXNnbnVtIiAtbGUgIiRlbmQiCitkbworCWNhbGxfbWVyZ2UgIiRtc2dudW0iCisJY29udGludWVfbWVyZ2UKK2RvbmUKKworZmluaXNoX3JiX21lcmdlCmRpZmYgLS1naXQgYS9naXQtcmVsaW5rLnBlcmwgYi9naXQtcmVsaW5rLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjZiNGY2YQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZWxpbmsucGVybApAQCAtMCwwICsxLDE3MyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIyBDb3B5cmlnaHQgMjAwNSwgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKyMgRGlzdHJpYnV0aW9uIHBlcm1pdHRlZCB1bmRlciB0aGUgR1BMIHYyLCBhcyBkaXN0cmlidXRlZAorIyBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBMYXRlciB2ZXJzaW9ucyBvZiB0aGUgR1BMIGF0IHRoZSBkaXNjcmV0aW9uIG9mIExpbnVzIFRvcnZhbGRzCisjCisjIFNjYW4gdHdvIGdpdCBvYmplY3QtdHJlZXMsIGFuZCBoYXJkbGluayBhbnkgY29tbW9uIG9iamVjdHMgYmV0d2VlbiB0aGVtLgorCit1c2UgNS4wMDY7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIEdldG9wdDo6TG9uZzsKKworc3ViIGdldF9jYW5vbmljYWxfZm9ybSgkKTsKK3N1YiBkb19zY2FuX2RpcmVjdG9yeSgkJCQpOworc3ViIGNvbXBhcmVfdHdvX2ZpbGVzKCQkKTsKK3N1YiB1c2FnZSgpOworc3ViIGxpbmtfdHdvX2ZpbGVzKCQkKTsKKworIyBzdGF0cworbXkgJHRvdGFsX2xpbmtlZCA9IDA7CitteSAkdG90YWxfYWxyZWFkeSA9IDA7CitteSAoJGxpbmtlZCwkYWxyZWFkeSk7CisKK215ICRmYWlsX29uX2RpZmZlcmVudF9zaXplcyA9IDA7CitteSAkaGVscCA9IDA7CitHZXRPcHRpb25zKCJzYWZlIiA9PiBcJGZhaWxfb25fZGlmZmVyZW50X3NpemVzLAorCSAgICJoZWxwIiA9PiBcJGhlbHApOworCit1c2FnZSgpIGlmICRoZWxwOworCitteSAoQGRpcnMpID0gQEFSR1Y7CisKK3VzYWdlKCkgaWYgKCFkZWZpbmVkICRkaXJzWzBdIHx8ICFkZWZpbmVkICRkaXJzWzFdKTsKKworJF8gPSBnZXRfY2Fub25pY2FsX2Zvcm0oJF8pIGZvcmVhY2ggKEBkaXJzKTsKKworbXkgJG1hc3Rlcl9kaXIgPSBwb3AgQGRpcnM7CisKK29wZW5kaXIoRCwkbWFzdGVyX2RpciAuICJvYmplY3RzLyIpCisJb3IgZGllICJGYWlsZWQgdG8gb3BlbiAkbWFzdGVyX2Rpci9vYmplY3RzLyA6ICQhIjsKKworbXkgQGhhc2hkaXJzID0gZ3JlcCAhL15cLnsxLDJ9JC8sIHJlYWRkaXIoRCk7CisKK2ZvcmVhY2ggbXkgJHJlcG8gKEBkaXJzKSB7CisJJGxpbmtlZCA9IDA7CisJJGFscmVhZHkgPSAwOworCXByaW50ZigiU2VhcmNoaW5nICclcycgYW5kICclcycgZm9yIGNvbW1vbiBvYmplY3RzIGFuZCBoYXJkbGlua2luZyB0aGVtLi4uXG4iLAorCQkkbWFzdGVyX2RpciwkcmVwbyk7CisKKwlmb3JlYWNoIG15ICRoYXNoZGlyIChAaGFzaGRpcnMpIHsKKwkJZG9fc2Nhbl9kaXJlY3RvcnkoJG1hc3Rlcl9kaXIsICRoYXNoZGlyLCAkcmVwbyk7CisJfQorCisJcHJpbnRmKCJMaW5rZWQgJWQgZmlsZXMsICVkIHdlcmUgYWxyZWFkeSBsaW5rZWQuXG4iLCRsaW5rZWQsICRhbHJlYWR5KTsKKworCSR0b3RhbF9saW5rZWQgKz0gJGxpbmtlZDsKKwkkdG90YWxfYWxyZWFkeSArPSAkYWxyZWFkeTsKK30KKworcHJpbnRmKCJUb3RhbHM6IExpbmtlZCAlZCBmaWxlcywgJWQgd2VyZSBhbHJlYWR5IGxpbmtlZC5cbiIsCisJJHRvdGFsX2xpbmtlZCwgJHRvdGFsX2FscmVhZHkpOworCisKK3N1YiBkb19zY2FuX2RpcmVjdG9yeSgkJCQpIHsKKwlteSAoJHNyY2RpciwgJHN1YmRpciwgJGRzdGRpcikgPSBAXzsKKworCW15ICRzZnVsbGRpciA9IHNwcmludGYoIiVzb2JqZWN0cy8lcy8iLCRzcmNkaXIsJHN1YmRpcik7CisJbXkgJGRmdWxsZGlyID0gc3ByaW50ZigiJXNvYmplY3RzLyVzLyIsJGRzdGRpciwkc3ViZGlyKTsKKworCW9wZW5kaXIoUywkc2Z1bGxkaXIpCisJCW9yIGRpZSAiRmFpbGVkIHRvIG9wZW5kaXIgJHNmdWxsZGlyOiAkISI7CisKKwlmb3JlYWNoIG15ICRmaWxlIChncmVwKCEvXC57MSwyfSQvLCByZWFkZGlyKFMpKSkgeworCQlteSAkc2ZpbGVuYW1lID0gJHNmdWxsZGlyIC4gJGZpbGU7CisJCW15ICRkZmlsZW5hbWUgPSAkZGZ1bGxkaXIgLiAkZmlsZTsKKworCQljb21wYXJlX3R3b19maWxlcygkc2ZpbGVuYW1lLCRkZmlsZW5hbWUpOworCisJfQorCWNsb3NlZGlyKFMpOworfQorCitzdWIgY29tcGFyZV90d29fZmlsZXMoJCQpIHsKKwlteSAoJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSkgPSBAXzsKKworCSMgUGVybCdzIHN0YXQgcmV0dXJucyByZWxldmFudCBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOgorCSMgMCA9IGRldiBudW1iZXIKKwkjIDEgPSBpbm9kZSBudW1iZXIKKwkjIDcgPSBzaXplCisJbXkgQHNzdGF0aW5mbyA9IHN0YXQoJHNmaWxlbmFtZSk7CisJbXkgQGRzdGF0aW5mbyA9IHN0YXQoJGRmaWxlbmFtZSk7CisKKwlpZiAoQHNzdGF0aW5mbyA9PSAwICYmIEBkc3RhdGluZm8gPT0gMCkgeworCQlkaWUgc3ByaW50ZigiU3RhdCBvZiBib3RoICVzIGFuZCAlcyBmYWlsZWQ6ICVzXG4iLCRzZmlsZW5hbWUsICRkZmlsZW5hbWUsICQhKTsKKworCX0gZWxzaWYgKEBkc3RhdGluZm8gPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCAoJHNzdGF0aW5mb1swXSA9PSAkZHN0YXRpbmZvWzBdKSAmJgorCSAgICAgKCRzc3RhdGluZm9bMV0gIT0gJGRzdGF0aW5mb1sxXSkpIHsKKwkJaWYgKCRzc3RhdGluZm9bN10gPT0gJGRzdGF0aW5mb1s3XSkgeworCQkJbGlua190d29fZmlsZXMoJHNmaWxlbmFtZSwgJGRmaWxlbmFtZSk7CisKKwkJfSBlbHNlIHsKKwkJCW15ICRlcnIgPSBzcHJpbnRmKCJFUlJPUjogRmlsZSBzaXplcyBhcmUgbm90IHRoZSBzYW1lLCBjYW5ub3QgcmVsaW5rICVzIHRvICVzLlxuIiwKKwkJCQkkc2ZpbGVuYW1lLCAkZGZpbGVuYW1lKTsKKwkJCWlmICgkZmFpbF9vbl9kaWZmZXJlbnRfc2l6ZXMpIHsKKwkJCQlkaWUgJGVycjsKKwkJCX0gZWxzZSB7CisJCQkJd2FybiAkZXJyOworCQkJfQorCQl9CisKKwl9IGVsc2lmICggKCRzc3RhdGluZm9bMF0gPT0gJGRzdGF0aW5mb1swXSkgJiYKKwkgICAgICgkc3N0YXRpbmZvWzFdID09ICRkc3RhdGluZm9bMV0pKSB7CisJCSRhbHJlYWR5Kys7CisJfQorfQorCitzdWIgZ2V0X2Nhbm9uaWNhbF9mb3JtKCQpIHsKKwlteSAkZGlyID0gc2hpZnQ7CisJbXkgJG9yaWdpbmFsID0gJGRpcjsKKworCWRpZSAiJGRpciBpcyBub3QgYSBkaXJlY3RvcnkuIiB1bmxlc3MgLWQgJGRpcjsKKworCSRkaXIgLj0gIi8iIHVubGVzcyAkZGlyID1+IG0jLyQjOworCSRkaXIgLj0gIi5naXQvIiB1bmxlc3MgJGRpciA9fiBtI1wuZ2l0LyQjOworCisJZGllICIkb3JpZ2luYWwgZG9lcyBub3QgaGF2ZSBhIC5naXQvIHN1YmRpcmVjdG9yeS5cbiIgdW5sZXNzIC1kICRkaXI7CisKKwlyZXR1cm4gJGRpcjsKK30KKworc3ViIGxpbmtfdHdvX2ZpbGVzKCQkKSB7CisJbXkgKCRzZmlsZW5hbWUsICRkZmlsZW5hbWUpID0gQF87CisJbXkgJHRtcGRuYW1lID0gc3ByaW50ZigiJXMub2xkIiwkZGZpbGVuYW1lKTsKKwlyZW5hbWUoJGRmaWxlbmFtZSwkdG1wZG5hbWUpCisJCW9yIGRpZSBzcHJpbnRmKCJGYWlsdXJlIHJlbmFtaW5nICVzIHRvICVzOiAlcyIsCisJCQkkZGZpbGVuYW1lLCAkdG1wZG5hbWUsICQhKTsKKworCWlmICghIGxpbmsoJHNmaWxlbmFtZSwkZGZpbGVuYW1lKSkgeworCQlteSAkZmFpbHR4dCA9ICIiOworCQl1bmxlc3MgKHJlbmFtZSgkdG1wZG5hbWUsJGRmaWxlbmFtZSkpIHsKKwkJCSRmYWlsdHh0ID0gc3ByaW50ZigKKwkJCQkiR2l0IFJlcG9zaXRvcnkgY29udGFpbmluZyAlcyBpcyBwcm9iYWJseSBjb3JydXB0ZWQsICIgLgorCQkJCSJwbGVhc2UgY29weSAnJXMnIHRvICclcycgdG8gZml4LlxuIiwKKwkJCQkkdG1wZG5hbWUsICRkZmlsZW5hbWUpOworCQl9CisKKwkJZGllIHNwcmludGYoIkZhaWxlZCB0byBsaW5rICVzIHRvICVzOiAlc1xuJXMiIC4KKwkJCSRzZmlsZW5hbWUsICRkZmlsZW5hbWUsCisJCQkkISwgJGRmaWxlbmFtZSwgJGZhaWx0eHQpOworCX0KKworCXVubGluaygkdG1wZG5hbWUpCisJCW9yIGRpZSBzcHJpbnRmKCJVbmxpbmsgb2YgJXMgZmFpbGVkOiAlc1xuIiwKKwkJCSRkZmlsZW5hbWUsICQhKTsKKworCSRsaW5rZWQrKzsKK30KKworCitzdWIgdXNhZ2UoKSB7CisJcHJpbnQoIlVzYWdlOiAkMCBbLS1zYWZlXSA8ZGlyPiBbPGRpcj4gLi4uXSA8bWFzdGVyX2Rpcj4gXG4iKTsKKwlwcmludCgiQWxsIGRpcmVjdG9yaWVzIHNob3VsZCBjb250YWluIGEgLmdpdC9vYmplY3RzLyBzdWJkaXJlY3RvcnkuXG4iKTsKKwlwcmludCgiT3B0aW9uc1xuIik7CisJcHJpbnQoIlx0LS1zYWZlXHQiIC4KKwkJIlN0b3BzIGlmIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUgaGFzaCBleGlzdCBidXQgIiAuCisJCSJoYXZlIGRpZmZlcmVudCBzaXplcy4gIERlZmF1bHQgaXMgdG8gd2FybiBhbmQgY29udGludWUuXG4iKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvZ2l0LXJlcGFjay5zaCBiL2dpdC1yZXBhY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWRhOTJmYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXBhY2suc2gKQEAgLTAsMCArMSwxMDIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyMKKworVVNBR0U9J1stYV0gWy1kXSBbLWZdIFstbF0gWy1uXSBbLXFdJworLiBnaXQtc2gtc2V0dXAKKworbm9fdXBkYXRlX2luZm89IGFsbF9pbnRvX29uZT0gcmVtb3ZlX3JlZHVuZGFudD0KK2xvY2FsPSBxdWlldD0gbm9fcmV1c2VfZGVsdGE9IGV4dHJhPQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisJY2FzZSAiJDEiIGluCisJLW4pCW5vX3VwZGF0ZV9pbmZvPXQgOzsKKwktYSkJYWxsX2ludG9fb25lPXQgOzsKKwktZCkJcmVtb3ZlX3JlZHVuZGFudD10IDs7CisJLXEpCXF1aWV0PS1xIDs7CisJLWYpCW5vX3JldXNlX2RlbHRhPS0tbm8tcmV1c2UtZGVsdGEgOzsKKwktbCkJbG9jYWw9LS1sb2NhbCA7OworCS0td2luZG93PSopIGV4dHJhPSIkZXh0cmEgJDEiIDs7CisJLS1kZXB0aD0qKSBleHRyYT0iJGV4dHJhICQxIiA7OworCSopCXVzYWdlIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK3JtIC1mIC50bXAtcGFjay0qCitQQUNLRElSPSIkR0lUX09CSkVDVF9ESVJFQ1RPUlkvcGFjayIKKworIyBUaGVyZSB3aWxsIGJlIG1vcmUgcmVwYWNraW5nIHN0cmF0ZWdpZXMgdG8gY29tZS4uLgorY2FzZSAiLCRhbGxfaW50b19vbmUsIiBpbgorLCwpCisJcmV2X2xpc3Q9Jy0tdW5wYWNrZWQnCisJcGFja19vYmplY3RzPSctLWluY3JlbWVudGFsJworCTs7CissdCwpCisJcmV2X2xpc3Q9CisJcGFja19vYmplY3RzPQorCisJIyBSZWR1bmRhbmN5IGNoZWNrIGluIGFsbC1pbnRvLW9uZSBjYXNlIGlzIHRyaXZpYWwuCisJZXhpc3Rpbmc9YGNkICIkUEFDS0RJUiIgJiYgXAorCSAgICBmaW5kIC4gLXR5cGUgZiBcKCAtbmFtZSAnKi5wYWNrJyAtbyAtbmFtZSAnKi5pZHgnIFwpIC1wcmludGAKKwk7OworZXNhYworcGFja19vYmplY3RzPSIkcGFja19vYmplY3RzICRsb2NhbCAkcXVpZXQgJG5vX3JldXNlX2RlbHRhJGV4dHJhIgorbmFtZT0kKCB7IGdpdC1yZXYtbGlzdCAtLW9iamVjdHMgLS1hbGwgJHJldl9saXN0IHx8CisJICBlY2hvICJnaXQtcmV2LWxpc3QgZGllZCB3aXRoIGV4aXQgY29kZSAkPyIKKwl9IHwKKwlnaXQtcGFjay1vYmplY3RzIC0tbm9uLWVtcHR5ICRwYWNrX29iamVjdHMgLnRtcC1wYWNrKSB8fAorCWV4aXQgMQoraWYgWyAteiAiJG5hbWUiIF07IHRoZW4KKwllY2hvIE5vdGhpbmcgbmV3IHRvIHBhY2suCitlbHNlCisJaWYgdGVzdCAiJHF1aWV0IiAhPSAnLXEnOyB0aGVuCisJICAgIGVjaG8gIlBhY2sgcGFjay0kbmFtZSBjcmVhdGVkLiIKKwlmaQorCW1rZGlyIC1wICIkUEFDS0RJUiIgfHwgZXhpdAorCisJZm9yIHNmeCBpbiBwYWNrIGlkeAorCWRvCisJCWlmIHRlc3QgLWYgIiRQQUNLRElSL3BhY2stJG5hbWUuJHNmeCIKKwkJdGhlbgorCQkJbXYgLWYgIiRQQUNLRElSL3BhY2stJG5hbWUuJHNmeCIgXAorCQkJCSIkUEFDS0RJUi9vbGQtcGFjay0kbmFtZS4kc2Z4IgorCQlmaQorCWRvbmUgJiYKKwltdiAtZiAudG1wLXBhY2stJG5hbWUucGFjayAiJFBBQ0tESVIvcGFjay0kbmFtZS5wYWNrIiAmJgorCW12IC1mIC50bXAtcGFjay0kbmFtZS5pZHggICIkUEFDS0RJUi9wYWNrLSRuYW1lLmlkeCIgJiYKKwl0ZXN0IC1mICIkUEFDS0RJUi9wYWNrLSRuYW1lLnBhY2siICYmCisJdGVzdCAtZiAiJFBBQ0tESVIvcGFjay0kbmFtZS5pZHgiIHx8IHsKKwkJZWNobyA+JjIgIkNvdWxkbid0IHJlcGxhY2UgdGhlIGV4aXN0aW5nIHBhY2sgd2l0aCB1cGRhdGVkIG9uZS4iCisJCWVjaG8gPiYyICJUaGUgb3JpZ2luYWwgc2V0IG9mIHBhY2tzIGhhdmUgYmVlbiBzYXZlZCBhcyIKKwkJZWNobyA+JjIgIm9sZC1wYWNrLSRuYW1lLntwYWNrLGlkeH0gaW4gJFBBQ0tESVIuIgorCQlleGl0IDEKKwl9CisJcm0gLWYgIiRQQUNLRElSL29sZC1wYWNrLSRuYW1lLnBhY2siICIkUEFDS0RJUi9vbGQtcGFjay0kbmFtZS5pZHgiCitmaQorCitpZiB0ZXN0ICIkcmVtb3ZlX3JlZHVuZGFudCIgPSB0Cit0aGVuCisJIyBXZSBrbm93ICRleGlzdGluZyBhcmUgYWxsIHJlZHVuZGFudCBvbmx5IHdoZW4KKwkjIGFsbC1pbnRvLW9uZSBpcyB1c2VkLgorCWlmIHRlc3QgIiRhbGxfaW50b19vbmUiICE9ICcnICYmIHRlc3QgIiRleGlzdGluZyIgIT0gJycKKwl0aGVuCisJCXN5bmMKKwkJKCBjZCAiJFBBQ0tESVIiICYmCisJCSAgZm9yIGUgaW4gJGV4aXN0aW5nCisJCSAgZG8KKwkJCWNhc2UgIiRlIiBpbgorCQkJLi9wYWNrLSRuYW1lLnBhY2sgfCAuL3BhY2stJG5hbWUuaWR4KSA7OworCQkJKikJcm0gLWYgJGUgOzsKKwkJCWVzYWMKKwkJICBkb25lCisJCSkKKwlmaQorCWdpdC1wcnVuZS1wYWNrZWQKK2ZpCisKK2Nhc2UgIiRub191cGRhdGVfaW5mbyIgaW4KK3QpIDogOzsKKyopIGdpdC11cGRhdGUtc2VydmVyLWluZm8gOzsKK2VzYWMKZGlmZiAtLWdpdCBhL2dpdC1yZXF1ZXN0LXB1bGwuc2ggYi9naXQtcmVxdWVzdC1wdWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzMTllMzUKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVxdWVzdC1wdWxsLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaCAtZQorIyBDb3B5cmlnaHQgMjAwNSwgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKyMKKyMgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorIyBhdCB0aGUgZGlzY3JldGlvbiBvZiBMaW51cyBUb3J2YWxkcy4KKworVVNBR0U9Jzxjb21taXQ+IDx1cmw+IFs8aGVhZD5dJworTE9OR19VU0FHRT0nU3VtbWFyaXplcyB0aGUgY2hhbmdlcyBzaW5jZSA8Y29tbWl0PiB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LAorYW5kIGluY2x1ZGVzIDx1cmw+IGluIHRoZSBtZXNzYWdlIGdlbmVyYXRlZC4nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK3JldmlzaW9uPSQxCit1cmw9JDIKK2hlYWQ9JHszLUhFQUR9CisKK1sgIiRyZXZpc2lvbiIgXSB8fCB1c2FnZQorWyAiJHVybCIgXSB8fCB1c2FnZQorCitiYXNlcmV2PWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkcmV2aXNpb24iXjBgICYmCitoZWFkcmV2PWBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkaGVhZCJeMGAgfHwgZXhpdAorCitlY2hvICJUaGUgZm9sbG93aW5nIGNoYW5nZXMgc2luY2UgY29tbWl0ICRiYXNlcmV2OiIKK2dpdCBsb2cgLS1tYXgtY291bnQ9MSAtLXByZXR0eT1zaG9ydCAiJGJhc2VyZXYiIHwKK2dpdC1zaG9ydGxvZyB8IHNlZCAtZSAncy9eXCguXCkvICBcMS8nCisKK2VjaG8gImFyZSBmb3VuZCBpbiB0aGUgZ2l0IHJlcG9zaXRvcnkgYXQ6IiAKK2VjaG8KK2VjaG8gIiAgJHVybCIKK2VjaG8KKworZ2l0IGxvZyAgJGJhc2VyZXYuLiRoZWFkcmV2IHwgZ2l0LXNob3J0bG9nIDsKK2dpdCBkaWZmIC0tc3RhdCAtLXN1bW1hcnkgJGJhc2VyZXYuLiRoZWFkcmV2CmRpZmYgLS1naXQgYS9naXQtcmVyZXJlLnBlcmwgYi9naXQtcmVyZXJlLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDM2NjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXJlcmUucGVybApAQCAtMCwwICsxLDIyNyBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFJFdXNlIFJFY29yZGVkIFJFc29sdmUuICBUaGlzIHRvb2wgcmVjb3JkcyBhIGNvbmZsaWN0ZWQgYXV0b21lcmdlCisjIHJlc3VsdCBhbmQgaXRzIGhhbmQgcmVzb2x1dGlvbiwgYW5kIGhlbHBzIHRvIHJlc29sdmUgZnV0dXJlCisjIGF1dG9tZXJnZSB0aGF0IHJlc3VsdHMgaW4gdGhlIHNhbWUgY29uZmxpY3QuCisjCisjIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIGNyZWF0ZSBhIGRpcmVjdG9yeSAncnItY2FjaGUnIHVuZGVyIHlvdXIKKyMgLmdpdC8gZGlyZWN0b3J5LgorCit1c2UgRGlnZXN0OwordXNlIEZpbGU6OlBhdGg7Cit1c2UgRmlsZTo6Q29weTsKKworbXkgJGdpdF9kaXIgPSAkOjpFTlZ7R0lUX0RJUn0gfHwgIi5naXQiOworbXkgJHJyX2RpciA9ICIkZ2l0X2Rpci9yci1jYWNoZSI7CitteSAkbWVyZ2VfcnIgPSAiJGdpdF9kaXIvcnItY2FjaGUvTUVSR0VfUlIiOworCitteSAlbWVyZ2VfcnIgPSAoKTsKKworc3ViIHJlYWRfcnIgeworCWlmICghLWYgJG1lcmdlX3JyKSB7CisJCSVtZXJnZV9yciA9ICgpOworCQlyZXR1cm47CisJfQorCW15ICRpbjsKKwlsb2NhbCAkLyA9ICJcMCI7CisJb3BlbiAkaW4sICI8JG1lcmdlX3JyIiBvciBkaWUgIiQhOiAkbWVyZ2VfcnIiOworCXdoaWxlICg8JGluPikgeworCQljaG9tcDsKKwkJbXkgKCRuYW1lLCAkcGF0aCkgPSAvXihbMC05YS1mXXs0MH0pXHQoLiopJC9zOworCQkkbWVyZ2VfcnJ7JHBhdGh9ID0gJG5hbWU7CisJfQorCWNsb3NlICRpbjsKK30KKworc3ViIHdyaXRlX3JyIHsKKwlteSAkb3V0OworCW9wZW4gJG91dCwgIj4kbWVyZ2VfcnIiIG9yIGRpZSAiJCE6ICRtZXJnZV9yciI7CisJZm9yIG15ICRwYXRoIChzb3J0IGtleXMgJW1lcmdlX3JyKSB7CisJCW15ICRuYW1lID0gJG1lcmdlX3JyeyRwYXRofTsKKwkJcHJpbnQgJG91dCAiJG5hbWVcdCRwYXRoXDAiOworCX0KKwljbG9zZSAkb3V0OworfQorCitzdWIgY29tcHV0ZV9jb25mbGljdF9uYW1lIHsKKwlteSAoJHBhdGgpID0gQF87CisJbXkgQHNpZGUgPSAoKTsKKwlteSAkaW47CisJb3BlbiAkaW4sICI8JHBhdGgiICBvciBkaWUgIiQhOiAkcGF0aCI7CisKKwlteSAkc2hhMSA9IERpZ2VzdC0+bmV3KCJTSEEtMSIpOworCW15ICRodW5rID0gMDsKKwl3aGlsZSAoPCRpbj4pIHsKKwkJaWYgKC9ePDw8PDw8PCAuKi8pIHsKKwkJCSRodW5rKys7CisJCQlAc2lkZSA9IChbXSwgdW5kZWYpOworCQl9CisJCWVsc2lmICgvXj09PT09PT0kLykgeworCQkJJHNpZGVbMV0gPSBbXTsKKwkJfQorCQllbHNpZiAoL14+Pj4+Pj4+IC4qLykgeworCQkJbXkgKCRvbmUsICR0d28pOworCQkJJG9uZSA9IGpvaW4oJycsIEB7JHNpZGVbMF19KTsKKwkJCSR0d28gPSBqb2luKCcnLCBAeyRzaWRlWzFdfSk7CisJCQlpZiAoJHR3byBsZSAkb25lKSB7CisJCQkJKCRvbmUsICR0d28pID0gKCR0d28sICRvbmUpOworCQkJfQorCQkJJHNoYTEtPmFkZCgkb25lKTsKKwkJCSRzaGExLT5hZGQoIlwwIik7CisJCQkkc2hhMS0+YWRkKCR0d28pOworCQkJJHNoYTEtPmFkZCgiXDAiKTsKKwkJCUBzaWRlID0gKCk7CisJCX0KKwkJZWxzaWYgKEBzaWRlID09IDApIHsKKwkJCW5leHQ7CisJCX0KKwkJZWxzaWYgKGRlZmluZWQgJHNpZGVbMV0pIHsKKwkJCXB1c2ggQHskc2lkZVsxXX0sICRfOworCQl9CisJCWVsc2UgeworCQkJcHVzaCBAeyRzaWRlWzBdfSwgJF87CisJCX0KKwl9CisJY2xvc2UgJGluOworCXJldHVybiAoJHNoYTEtPmhleGRpZ2VzdCwgJGh1bmspOworfQorCitzdWIgcmVjb3JkX3ByZWltYWdlIHsKKwlteSAoJHBhdGgsICRuYW1lKSA9IEBfOworCW15IEBzaWRlID0gKCk7CisJbXkgKCRpbiwgJG91dCk7CisJb3BlbiAkaW4sICI8JHBhdGgiICBvciBkaWUgIiQhOiAkcGF0aCI7CisJb3BlbiAkb3V0LCAiPiRuYW1lIiBvciBkaWUgIiQhOiAkbmFtZSI7CisKKwl3aGlsZSAoPCRpbj4pIHsKKwkJaWYgKC9ePDw8PDw8PCAuKi8pIHsKKwkJCUBzaWRlID0gKFtdLCB1bmRlZik7CisJCX0KKwkJZWxzaWYgKC9ePT09PT09PSQvKSB7CisJCQkkc2lkZVsxXSA9IFtdOworCQl9CisJCWVsc2lmICgvXj4+Pj4+Pj4gLiovKSB7CisJCQlteSAoJG9uZSwgJHR3byk7CisJCQkkb25lID0gam9pbignJywgQHskc2lkZVswXX0pOworCQkJJHR3byA9IGpvaW4oJycsIEB7JHNpZGVbMV19KTsKKwkJCWlmICgkdHdvIGxlICRvbmUpIHsKKwkJCQkoJG9uZSwgJHR3bykgPSAoJHR3bywgJG9uZSk7CisJCQl9CisJCQlwcmludCAkb3V0ICI8PDw8PDw8XG4iOworCQkJcHJpbnQgJG91dCAkb25lOworCQkJcHJpbnQgJG91dCAiPT09PT09PVxuIjsKKwkJCXByaW50ICRvdXQgJHR3bzsKKwkJCXByaW50ICRvdXQgIj4+Pj4+Pj5cbiI7CisJCQlAc2lkZSA9ICgpOworCQl9CisJCWVsc2lmIChAc2lkZSA9PSAwKSB7CisJCQlwcmludCAkb3V0ICRfOworCQl9CisJCWVsc2lmIChkZWZpbmVkICRzaWRlWzFdKSB7CisJCQlwdXNoIEB7JHNpZGVbMV19LCAkXzsKKwkJfQorCQllbHNlIHsKKwkJCXB1c2ggQHskc2lkZVswXX0sICRfOworCQl9CisJfQorCWNsb3NlICRvdXQ7CisJY2xvc2UgJGluOworfQorCitzdWIgZmluZF9jb25mbGljdCB7CisJbXkgJGluOworCWxvY2FsICQvID0gIlwwIjsKKwlteSAkcGlkID0gb3BlbigkaW4sICctfCcpOworCWRpZSAiJCEiIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJaWYgKCEkcGlkKSB7CisJCWV4ZWMocXcoZ2l0IGxzLWZpbGVzIC16IC11KSkgb3IgZGllICIkITogbHMtZmlsZXMiOworCX0KKwlteSAlcGF0aCA9ICgpOworCW15IEBwYXRoID0gKCk7CisJd2hpbGUgKDwkaW4+KSB7CisJCWNob21wOworCQlteSAoJG1vZGUsICRzaGExLCAkc3RhZ2UsICRwYXRoKSA9CisJCSAgICAvXihbMC03XSspIChbMC05YS1mXXs0MH0pIChbMTIzXSlcdCguKikkL3M7CisJCSRwYXRoeyRwYXRofSB8PSAoMSA8PCAkc3RhZ2UpOworCX0KKwljbG9zZSAkaW47CisJd2hpbGUgKG15ICgkcGF0aCwgJHN0YXR1cykgPSBlYWNoICVwYXRoKSB7CisJCWlmICgkc3RhdHVzID09IDE0KSB7IHB1c2ggQHBhdGgsICRwYXRoOyB9CisJfQorCXJldHVybiBAcGF0aDsKK30KKworc3ViIG1lcmdlIHsKKwlteSAoJG5hbWUsICRwYXRoKSA9IEBfOworCXJlY29yZF9wcmVpbWFnZSgkcGF0aCwgIiRycl9kaXIvJG5hbWUvdGhpc2ltYWdlIik7CisJdW5sZXNzIChzeXN0ZW0oJ21lcmdlJywgbWFwIHsgIiRycl9kaXIvJG5hbWUvJHtffWltYWdlIiB9CisJCSAgICAgICBxdyh0aGlzIHByZSBwb3N0KSkpIHsKKwkJbXkgJGluOworCQlvcGVuICRpbiwgIjwkcnJfZGlyLyRuYW1lL3RoaXNpbWFnZSIgb3IKKwkJICAgIGRpZSAiJCE6ICRuYW1lL3RoaXNpbWFnZSI7CisJCW15ICRvdXQ7CisJCW9wZW4gJG91dCwgIj4kcGF0aCIgb3IgZGllICIkITogJHBhdGgiOworCQl3aGlsZSAoPCRpbj4pIHsgcHJpbnQgJG91dCAkXzsgfQorCQljbG9zZSAkaW47CisJCWNsb3NlICRvdXQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLWQgIiRycl9kaXIiIHx8IGV4aXQoMCk7CisKK3JlYWRfcnIoKTsKK215ICVjb25mbGljdCA9IG1hcCB7ICRfID0+IDEgfSBmaW5kX2NvbmZsaWN0KCk7CisKKyMgTUVSR0VfUlIgcmVjb3JkcyBwYXRocyB3aXRoIGNvbmZsaWN0cyBpbW1lZGlhdGVseSBhZnRlciBtZXJnZQorIyBmYWlsZWQuICBTb21lIG9mIHRoZSBjb25mbGljdGVkIHBhdGhzIG1pZ2h0IGhhdmUgYmVlbiBoYW5kIHJlc29sdmVkCisjIGluIHRoZSB3b3JraW5nIHRyZWUgc2luY2UgdGhlbiwgYnV0IHRoZSBpbml0aWFsIHJ1biB3b3VsZCBjYXRjaCBhbGwKKyMgYW5kIHJlZ2lzdGVyIHRoZWlyIHByZWltYWdlcy4KKworZm9yIG15ICRwYXRoIChrZXlzICVjb25mbGljdCkgeworCSMgVGhpcyBwYXRoIGhhcyBjb25mbGljdC4gIElmIGl0IGlzIG5vdCByZWNvcmRlZCB5ZXQsCisJIyByZWNvcmQgdGhlIHByZS1pbWFnZS4KKwlpZiAoIWV4aXN0cyAkbWVyZ2VfcnJ7JHBhdGh9KSB7CisJCW15ICgkbmFtZSwgJGh1bmspID0gY29tcHV0ZV9jb25mbGljdF9uYW1lKCRwYXRoKTsKKwkJbmV4dCB1bmxlc3MgKCRodW5rKTsKKwkJJG1lcmdlX3JyeyRwYXRofSA9ICRuYW1lOworCQlpZiAoISAtZCAiJHJyX2Rpci8kbmFtZSIpIHsKKwkJCW1rcGF0aCgiJHJyX2Rpci8kbmFtZSIsIDAsIDA3NzcpOworCQkJcHJpbnQgU1RERVJSICJSZWNvcmRlZCBwcmVpbWFnZSBmb3IgJyRwYXRoJ1xuIjsKKwkJCXJlY29yZF9wcmVpbWFnZSgkcGF0aCwgIiRycl9kaXIvJG5hbWUvcHJlaW1hZ2UiKTsKKwkJfQorCX0KK30KKworIyBOb3cgc29tZSBvZiB0aGUgcGF0aHMgdGhhdCBoYWQgY29uZmxpY3RzIGVhcmxpZXIgbWlnaHQgaGF2ZSBiZWVuCisjIGhhbmQgcmVzb2x2ZWQuICBPdGhlcnMgbWF5IGJlIHNpbWlsYXIgdG8gYSBjb25mbGljdCBhbHJlYWR5IHRoYXQKKyMgd2FzIHJlc29sdmVkIGJlZm9yZS4KKworZm9yIG15ICRwYXRoIChrZXlzICVtZXJnZV9ycikgeworCW15ICRuYW1lID0gJG1lcmdlX3JyeyRwYXRofTsKKworCSMgV2UgY291bGQgcmVzb2x2ZSB0aGlzIGF1dG9tYXRpY2FsbHkgaWYgd2UgaGF2ZSBpbWFnZXMuCisJaWYgKC1mICIkcnJfZGlyLyRuYW1lL3ByZWltYWdlIiAmJgorCSAgICAtZiAiJHJyX2Rpci8kbmFtZS9wb3N0aW1hZ2UiKSB7CisJCWlmIChtZXJnZSgkbmFtZSwgJHBhdGgpKSB7CisJCQlwcmludCBTVERFUlIgIlJlc29sdmVkICckcGF0aCcgdXNpbmcgcHJldmlvdXMgcmVzb2x1dGlvbi5cbiI7CisJCQkjIFRoZW4gd2UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhpcyBwYXRoCisJCQkjIGFueW1vcmUuCisJCQlkZWxldGUgJG1lcmdlX3JyeyRwYXRofTsKKwkJCW5leHQ7CisJCX0KKwl9CisKKwkjIExldCdzIHNlZSBpZiB3ZSBoYXZlIHJlc29sdmVkIGl0LgorCSh1bmRlZiwgbXkgJGh1bmspID0gY29tcHV0ZV9jb25mbGljdF9uYW1lKCRwYXRoKTsKKwluZXh0IGlmICgkaHVuayk7CisKKwlwcmludCBTVERFUlIgIlJlY29yZGVkIHJlc29sdXRpb24gZm9yICckcGF0aCcuXG4iOworCWNvcHkoJHBhdGgsICIkcnJfZGlyLyRuYW1lL3Bvc3RpbWFnZSIpOworCSMgQW5kIHdlIGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgcGF0aCBhbnltb3JlLgorCWRlbGV0ZSAkbWVyZ2VfcnJ7JHBhdGh9OworfQorCisjIFdyaXRlIG91dCB0aGUgcmVzdC4KK3dyaXRlX3JyKCk7CmRpZmYgLS1naXQgYS9naXQtcmVzZXQuc2ggYi9naXQtcmVzZXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZmYzhjZQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXNldC5zaApAQCAtMCwwICsxLDcxIEBACisjIS9iaW4vc2gKKworVVNBR0U9J1stLW1peGVkIHwgLS1zb2Z0IHwgLS1oYXJkXSAgWzxjb21taXQtaXNoPl0nCisuIGdpdC1zaC1zZXR1cAorCit0bXA9JHtHSVRfRElSfS9yZXNldC4kJAordHJhcCAncm0gLWYgJHRtcC0qJyAwIDEgMiAzIDE1CisKK3VwZGF0ZT0KK3Jlc2V0X3R5cGU9LS1taXhlZAorY2FzZSAiJDEiIGluCistLW1peGVkIHwgLS1zb2Z0IHwgLS1oYXJkKQorCXJlc2V0X3R5cGU9IiQxIgorCXNoaWZ0CisJOzsKKy0qKQorICAgICAgICB1c2FnZSA7OworZXNhYworCitjYXNlICQjIGluCiswKSByZXY9SEVBRCA7OworMSkgcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiKSB8fCBleGl0IDs7CisqKSB1c2FnZSA7OworZXNhYworcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAkcmV2XjApIHx8IGV4aXQKKworIyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBzZXQgb2YgcGF0aHMgdGhhdCBfY291bGRfIGJlIGxlZnQKKyMgYmVoaW5kIGJlZm9yZSBhIGhhcmQgcmVzZXQsIHNvIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGVtLgoraWYgdGVzdCAiJHJlc2V0X3R5cGUiID0gIi0taGFyZCIKK3RoZW4KKwl1cGRhdGU9LXUKK2ZpCisKKyMgU29mdCByZXNldCBkb2VzIG5vdCB0b3VjaCB0aGUgaW5kZXggZmlsZSBub3IgdGhlIHdvcmtpbmcgdHJlZQorIyBhdCBhbGwsIGJ1dCByZXF1aXJlcyB0aGVtIGluIGEgZ29vZCBvcmRlci4gIE90aGVyIHJlc2V0cyByZXNldAorIyB0aGUgaW5kZXggZmlsZSB0byB0aGUgdHJlZSBvYmplY3Qgd2UgYXJlIHN3aXRjaGluZyB0by4KK2lmIHRlc3QgIiRyZXNldF90eXBlIiA9ICItLXNvZnQiCit0aGVuCisJaWYgdGVzdCAtZiAiJEdJVF9ESVIvTUVSR0VfSEVBRCIgfHwKKwkgICB0ZXN0ICIiICE9ICIkKGdpdC1scy1maWxlcyAtLXVubWVyZ2VkKSIKKwl0aGVuCisJCWRpZSAiQ2Fubm90IGRvIGEgc29mdCByZXNldCBpbiB0aGUgbWlkZGxlIG9mIGEgbWVyZ2UuIgorCWZpCitlbHNlCisJZ2l0LXJlYWQtdHJlZSAtLXJlc2V0ICR1cGRhdGUgIiRyZXYiIHx8IGV4aXQKK2ZpCisKKyMgQW55IHJlc2V0cyB1cGRhdGUgSEVBRCB0byB0aGUgaGVhZCBiZWluZyBzd2l0Y2hlZCB0by4KK2lmIG9yaWc9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQgMj4vZGV2L251bGwpCit0aGVuCisJZWNobyAiJG9yaWciID4iJEdJVF9ESVIvT1JJR19IRUFEIgorZWxzZQorCXJtIC1mICIkR0lUX0RJUi9PUklHX0hFQUQiCitmaQorZ2l0LXVwZGF0ZS1yZWYgLW0gInJlc2V0ICRyZXNldF90eXBlICQqIiBIRUFEICIkcmV2IgordXBkYXRlX3JlZl9zdGF0dXM9JD8KKworY2FzZSAiJHJlc2V0X3R5cGUiIGluCistLWhhcmQgKQorCTs7ICMgTm90aGluZyBlbHNlIHRvIGRvCistLXNvZnQgKQorCTs7ICMgTm90aGluZyBlbHNlIHRvIGRvCistLW1peGVkICkKKwkjIFJlcG9ydCB3aGF0IGhhcyBub3QgYmVlbiB1cGRhdGVkLgorCWdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoCisJOzsKK2VzYWMKKworcm0gLWYgIiRHSVRfRElSL01FUkdFX0hFQUQiICIkR0lUX0RJUi9yci1jYWNoZS9NRVJHRV9SUiIgIiRHSVRfRElSL1NRVUFTSF9NU0ciCisKK2V4aXQgJHVwZGF0ZV9yZWZfc3RhdHVzCmRpZmYgLS1naXQgYS9naXQtcmVzb2x2ZS5zaCBiL2dpdC1yZXNvbHZlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3YmM2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9naXQtcmVzb2x2ZS5zaApAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworIworIyBSZXNvbHZlIHR3byB0cmVlcy4KKyMKKworVVNBR0U9JzxoZWFkPiA8cmVtb3RlPiA8bWVyZ2UtbWVzc2FnZT4nCisuIGdpdC1zaC1zZXR1cAorCitkcm9waGVhZHMoKSB7CisJcm0gLWYgLS0gIiRHSVRfRElSL01FUkdFX0hFQUQiIFwKKwkJIiRHSVRfRElSL0xBU1RfTUVSR0UiIHx8IGV4aXQgMQorfQorCitoZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJDEiXjApICYmCittZXJnZT0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIiQyIl4wKSAmJgorbWVyZ2VfbmFtZT0iJDIiICYmCittZXJnZV9tc2c9IiQzIiB8fCB1c2FnZQorCisjCisjIFRoZSByZW1vdGUgbmFtZSBpcyBqdXN0IHVzZWQgZm9yIHRoZSBtZXNzYWdlLAorIyBidXQgd2UgZG8gd2FudCBpdC4KKyMKK2lmIFsgLXogIiRoZWFkIiAtbyAteiAiJG1lcmdlIiAtbyAteiAiJG1lcmdlX21zZyIgXTsgdGhlbgorCXVzYWdlCitmaQorCitkcm9waGVhZHMKK2VjaG8gJGhlYWQgPiAiJEdJVF9ESVIiL09SSUdfSEVBRAorZWNobyAkbWVyZ2UgPiAiJEdJVF9ESVIiL0xBU1RfTUVSR0UKKworY29tbW9uPSQoZ2l0LW1lcmdlLWJhc2UgJGhlYWQgJG1lcmdlKQoraWYgWyAteiAiJGNvbW1vbiIgXTsgdGhlbgorCWRpZSAiVW5hYmxlIHRvIGZpbmQgY29tbW9uIGNvbW1pdCBiZXR3ZWVuIiAkbWVyZ2UgJGhlYWQKK2ZpCisKK2Nhc2UgIiRjb21tb24iIGluCisiJG1lcmdlIikKKwllY2hvICJBbHJlYWR5IHVwLXRvLWRhdGUuIFllZWFoISIKKwlkcm9waGVhZHMKKwlleGl0IDAKKwk7OworIiRoZWFkIikKKwllY2hvICJVcGRhdGluZyBmcm9tICRoZWFkIHRvICRtZXJnZSIKKwlnaXQtcmVhZC10cmVlIC11IC1tICRoZWFkICRtZXJnZSB8fCBleGl0IDEKKwlnaXQtdXBkYXRlLXJlZiAtbSAicmVzb2x2ZSAkbWVyZ2VfbmFtZTogRmFzdCBmb3J3YXJkIiBcCisJCUhFQUQgIiRtZXJnZSIgIiRoZWFkIgorCWdpdC1kaWZmLXRyZWUgLXAgJGhlYWQgJG1lcmdlIHwgZ2l0LWFwcGx5IC0tc3RhdAorCWRyb3BoZWFkcworCWV4aXQgMAorCTs7Citlc2FjCisKKyMgV2UgYXJlIGdvaW5nIHRvIG1ha2UgYSBuZXcgY29tbWl0LgorZ2l0IHZhciBHSVRfQ09NTUlUVEVSX0lERU5UID4vZGV2L251bGwgfHwgZXhpdAorCisjIEZpbmQgYW4gb3B0aW11bSBtZXJnZSBiYXNlIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNhbmRpZGF0ZXMuCitMRj0nCisnCitjb21tb249JChnaXQtbWVyZ2UtYmFzZSAtYSAkaGVhZCAkbWVyZ2UpCitjYXNlICIkY29tbW9uIiBpbgorPyoiJExGIj8qKQorCWVjaG8gIlRyeWluZyB0byBmaW5kIHRoZSBvcHRpbXVtIG1lcmdlIGJhc2UuIgorCUc9LnRtcC1pbmRleCQkCisJYmVzdD0KKwliZXN0X2NudD0tMQorCWZvciBjIGluICRjb21tb24KKwlkbworCQlybSAtZiAkRworCQlHSVRfSU5ERVhfRklMRT0kRyBnaXQtcmVhZC10cmVlIC1tICRjICRoZWFkICRtZXJnZSBcCisJCQkyPi9kZXYvbnVsbCB8fCBjb250aW51ZQorCQkjIENvdW50IHRoZSBwYXRocyB0aGF0IGFyZSB1bm1lcmdlZC4KKwkJY250PWBHSVRfSU5ERVhfRklMRT0kRyBnaXQtbHMtZmlsZXMgLS11bm1lcmdlZCB8IHdjIC1sYAorCQlpZiB0ZXN0ICRiZXN0X2NudCAtbGUgMCAtbyAkY250IC1sZSAkYmVzdF9jbnQKKwkJdGhlbgorCQkJYmVzdD0kYworCQkJYmVzdF9jbnQ9JGNudAorCQkJaWYgdGVzdCAiJGJlc3RfY250IiAtZXEgMAorCQkJdGhlbgorCQkJCSMgQ2Fubm90IGRvIGFueSBiZXR0ZXIgdGhhbiBhbGwgdHJpdmlhbCBtZXJnZS4KKwkJCQlicmVhaworCQkJZmkKKwkJZmkKKwlkb25lCisJcm0gLWYgJEcKKwljb21tb249IiRiZXN0IgorZXNhYworCitlY2hvICJUcnlpbmcgdG8gbWVyZ2UgJG1lcmdlIGludG8gJGhlYWQgdXNpbmcgJGNvbW1vbi4iCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCAyPi9kZXYvbnVsbAorZ2l0LXJlYWQtdHJlZSAtdSAtbSAkY29tbW9uICRoZWFkICRtZXJnZSB8fCBleGl0IDEKK3Jlc3VsdF90cmVlPSQoZ2l0LXdyaXRlLXRyZWUgIDI+IC9kZXYvbnVsbCkKK2lmIFsgJD8gLW5lIDAgXTsgdGhlbgorCWVjaG8gIlNpbXBsZSBtZXJnZSBmYWlsZWQsIHRyeWluZyBBdXRvbWF0aWMgbWVyZ2UiCisJZ2l0LW1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYQorCWlmIFsgJD8gLW5lIDAgXTsgdGhlbgorCQllY2hvICRtZXJnZSA+ICIkR0lUX0RJUiIvTUVSR0VfSEVBRAorCQlkaWUgIkF1dG9tYXRpYyBtZXJnZSBmYWlsZWQsIGZpeCB1cCBieSBoYW5kIgorCWZpCisJcmVzdWx0X3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgfHwgZXhpdCAxCitmaQorcmVzdWx0X2NvbW1pdD0kKGVjaG8gIiRtZXJnZV9tc2ciIHwgZ2l0LWNvbW1pdC10cmVlICRyZXN1bHRfdHJlZSAtcCAkaGVhZCAtcCAkbWVyZ2UpCitlY2hvICJDb21taXR0ZWQgbWVyZ2UgJHJlc3VsdF9jb21taXQiCitnaXQtdXBkYXRlLXJlZiAtbSAicmVzb2x2ZSAkbWVyZ2VfbmFtZTogSW4taW5kZXggbWVyZ2UiIFwKKwlIRUFEICIkcmVzdWx0X2NvbW1pdCIgIiRoZWFkIgorZ2l0LWRpZmYtdHJlZSAtcCAkaGVhZCAkcmVzdWx0X2NvbW1pdCB8IGdpdC1hcHBseSAtLXN0YXQKK2Ryb3BoZWFkcwpkaWZmIC0tZ2l0IGEvZ2l0LXJldmVydC5zaCBiL2dpdC1yZXZlcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmJmMzVkMQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1yZXZlcnQuc2gKQEAgLTAsMCArMSwxNzAgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK2Nhc2UgIiQwIiBpbgorKi1yZXZlcnQqICkKKwl0ZXN0IC10IDAgJiYgZWRpdD0tZQorCW1lPXJldmVydAorCVVTQUdFPSdbLS1lZGl0IHwgLS1uby1lZGl0XSBbLW5dIDxjb21taXQtaXNoPicgOzsKKyotY2hlcnJ5LXBpY2sqICkKKwllZGl0PQorCW1lPWNoZXJyeS1waWNrCisJVVNBR0U9J1stLWVkaXRdIFstbl0gWy1yXSA8Y29tbWl0LWlzaD4nICA7OworKiApCisJZGllICJXaGF0IGFyZSB5b3UgdGFsa2luZyBhYm91dD8iIDs7Citlc2FjCisuIGdpdC1zaC1zZXR1cAorCitub19jb21taXQ9IHJlcGxheT0KK3doaWxlIGNhc2UgIiQjIiBpbiAwKSBicmVhayA7OyBlc2FjCitkbworCWNhc2UgIiQxIiBpbgorCS1ufC0tbnwtLW5vfC0tbm8tfC0tbm8tY3wtLW5vLWNvfC0tbm8tY29tfC0tbm8tY29tbXxcCisJICAgIC0tbm8tY29tbWl8LS1uby1jb21taXQpCisJCW5vX2NvbW1pdD10CisJCTs7CisJLWV8LS1lfC0tZWR8LS1lZGl8LS1lZGl0KQorCQllZGl0PS1lCisJCTs7CisJLS1ufC0tbm98LS1uby18LS1uby1lfC0tbm8tZWR8LS1uby1lZGl8LS1uby1lZGl0KQorCQllZGl0PQorCQk7OworCS1yfC0tcnwtLXJlfC0tcmVwfC0tcmVwbHwtLXJlcGxhfC0tcmVwbGF5KQorCQlyZXBsYXk9dAorCQk7OworCS0qKQorCQl1c2FnZQorCQk7OworCSopCisJCWJyZWFrCisJCTs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK3Rlc3QgIiRtZSwkcmVwbGF5IiA9ICJyZXZlcnQsdCIgJiYgdXNhZ2UKKworY2FzZSAiJG5vX2NvbW1pdCIgaW4KK3QpCisJIyBXZSBkbyBub3QgaW50ZW5kIHRvIGNvbW1pdCBpbW1lZGlhdGVseS4gIFdlIGp1c3Qgd2FudCB0bworCSMgbWVyZ2UgdGhlIGRpZmZlcmVuY2VzIGluLgorCWhlYWQ9JChnaXQtd3JpdGUtdHJlZSkgfHwKKwkJZGllICJZb3VyIGluZGV4IGZpbGUgaXMgdW5tZXJnZWQuIgorCTs7CisqKQorCWhlYWQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpIHx8CisJCWRpZSAiWW91IGRvIG5vdCBoYXZlIGEgdmFsaWQgSEVBRCIKKwlmaWxlcz0kKGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkIC0tbmFtZS1vbmx5ICRoZWFkKSB8fCBleGl0CisJaWYgWyAiJGZpbGVzIiBdOyB0aGVuCisJCWRpZSAiRGlydHkgaW5kZXg6IGNhbm5vdCAkbWUgKGRpcnR5OiAkZmlsZXMpIgorCWZpCisJOzsKK2VzYWMKKworcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJEAiKSAmJgorY29tbWl0PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJHJldl4wIikgfHwKKwlkaWUgIk5vdCBhIHNpbmdsZSBjb21taXQgJEAiCitwcmV2PSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAiJGNvbW1pdF4xIiAyPi9kZXYvbnVsbCkgfHwKKwlkaWUgIkNhbm5vdCBydW4gJG1lIGEgcm9vdCBjb21taXQiCitnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICIkY29tbWl0XjIiID4vZGV2L251bGwgMj4mMSAmJgorCWRpZSAiQ2Fubm90IHJ1biAkbWUgYSBtdWx0aS1wYXJlbnQgY29tbWl0LiIKKworIyAiY29tbWl0IiBpcyBhbiBleGlzdGluZyBjb21taXQuICBXZSB3b3VsZCB3YW50IHRvIGFwcGx5CisjIHRoZSBkaWZmZXJlbmNlIGl0IGludHJvZHVjZXMgc2luY2UgaXRzIGZpcnN0IHBhcmVudCAicHJldiIKKyMgb24gdG9wIG9mIHRoZSBjdXJyZW50IEhFQUQgaWYgd2UgYXJlIGNoZXJyeS1waWNrLiAgT3IgdGhlCisjIHJldmVyc2Ugb2YgaXQgaWYgd2UgYXJlIHJldmVydC4KKworY2FzZSAiJG1lIiBpbgorcmV2ZXJ0KQorCWdpdC1yZXYtbGlzdCAtLXByZXR0eT1vbmVsaW5lIC0tbWF4LWNvdW50PTEgJGNvbW1pdCB8CisJc2VkIC1lICcKKwkJcy9eW14gXSogL1JldmVydCAiLworCQlzLyQvIi8nCisJZWNobworCWVjaG8gIlRoaXMgcmV2ZXJ0cyBjb21taXQgJGNvbW1pdC4iCisJdGVzdCAiJHJldiIgPSAiJGNvbW1pdCIgfHwKKwllY2hvICIob3JpZ2luYWwgJ2dpdCByZXZlcnQnIGFyZ3VtZW50czogJEApIgorCWJhc2U9JGNvbW1pdCBuZXh0PSRwcmV2CisJOzsKKworY2hlcnJ5LXBpY2spCisJcGlja19hdXRob3Jfc2NyaXB0PScKKwkvXmF1dGhvciAveworCQlzLydcJycvJ1wnJ1xcJ1wnXCcnL2cKKwkJaAorCQlzL15hdXRob3IgXChbXjxdKlwpIDxbXj5dKj4gLiokL1wxLworCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQlzLy4qL0dJVF9BVVRIT1JfTkFNRT0nXCcnJidcJycvcAorCisJCWcKKwkJcy9eYXV0aG9yIFtePF0qIDxcKFtePl0qXCk+IC4qJC9cMS8KKwkJcy8nXCcnLydcJydcJ1wnXCcnL2cKKwkJcy8uKi9HSVRfQVVUSE9SX0VNQUlMPSdcJycmJ1wnJy9wCisKKwkJZworCQlzL15hdXRob3IgW148XSogPFtePl0qPiBcKC4qXCkkL1wxLworCQlzLydcJycvJ1wnJ1wnXCdcJycvZworCQlzLy4qL0dJVF9BVVRIT1JfREFURT0nXCcnJidcJycvcAorCisJCXEKKwl9JworCXNldF9hdXRob3JfZW52PWBnaXQtY2F0LWZpbGUgY29tbWl0ICIkY29tbWl0IiB8CisJTEFORz1DIExDX0FMTD1DIHNlZCAtbmUgIiRwaWNrX2F1dGhvcl9zY3JpcHQiYAorCWV2YWwgIiRzZXRfYXV0aG9yX2VudiIKKwlleHBvcnQgR0lUX0FVVEhPUl9OQU1FCisJZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUwKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFCisKKwlnaXQtY2F0LWZpbGUgY29tbWl0ICRjb21taXQgfCBzZWQgLWUgJzEsL14kL2QnCisJY2FzZSAiJHJlcGxheSIgaW4KKwknJykKKwkJZWNobyAiKGNoZXJyeSBwaWNrZWQgZnJvbSAkY29tbWl0IGNvbW1pdCkiCisJCXRlc3QgIiRyZXYiID0gIiRjb21taXQiIHx8CisJCWVjaG8gIihvcmlnaW5hbCAnZ2l0IGNoZXJyeS1waWNrJyBhcmd1bWVudHM6ICRAKSIKKwkJOzsKKwllc2FjCisJYmFzZT0kcHJldiBuZXh0PSRjb21taXQKKwk7OworCitlc2FjID4ubXNnCisKKyMgVGhpcyB0aHJlZSB3YXkgbWVyZ2UgaXMgYW4gaW50ZXJlc3Rpbmcgb25lLiAgV2UgYXJlIGF0CisjICRoZWFkLCBhbmQgd291bGQgd2FudCB0byBhcHBseSB0aGUgY2hhbmdlIGJldHdlZW4gJGNvbW1pdAorIyBhbmQgJHByZXYgb24gdG9wIG9mIHVzICh3aGVuIHJldmVydGluZyksIG9yIHRoZSBjaGFuZ2UgYmV0d2VlbgorIyAkcHJldiBhbmQgJGNvbW1pdCBvbiB0b3Agb2YgdXMgKHdoZW4gY2hlcnJ5LXBpY2tpbmcgb3IgcmVwbGF5aW5nKS4KKworZWNobyA+JjIgIkZpcnN0IHRyeWluZyBzaW1wbGUgbWVyZ2Ugc3RyYXRlZ3kgdG8gJG1lLiIKK2dpdC1yZWFkLXRyZWUgLW0gLXUgLS1hZ2dyZXNzaXZlICRiYXNlICRoZWFkICRuZXh0ICYmCityZXN1bHQ9JChnaXQtd3JpdGUtdHJlZSAyPi9kZXYvbnVsbCkgfHwgeworICAgIGVjaG8gPiYyICJTaW1wbGUgJG1lIGZhaWxzOyB0cnlpbmcgQXV0b21hdGljICRtZS4iCisgICAgZ2l0LW1lcmdlLWluZGV4IC1vIGdpdC1tZXJnZS1vbmUtZmlsZSAtYSB8fCB7CisJICAgIGVjaG8gPiYyICJBdXRvbWF0aWMgJG1lIGZhaWxlZC4gIEFmdGVyIHJlc29sdmluZyB0aGUgY29uZmxpY3RzLCIKKwkgICAgZWNobyA+JjIgIm1hcmsgdGhlIGNvcnJlY3RlZCBwYXRocyB3aXRoICdnaXQtdXBkYXRlLWluZGV4IDxwYXRocz4nIgorCSAgICBlY2hvID4mMiAiYW5kIGNvbW1pdCB3aXRoICdnaXQgY29tbWl0IC1GIC5tc2cnIgorCSAgICBjYXNlICIkbWUiIGluCisJICAgIGNoZXJyeS1waWNrKQorCQllY2hvID4mMiAiWW91IG1heSBjaG9vc2UgdG8gdXNlIHRoZSBmb2xsb3dpbmcgd2hlbiBtYWtpbmciCisJCWVjaG8gPiYyICJ0aGUgY29tbWl0OiIKKwkJZWNobyA+JjIgIiRzZXRfYXV0aG9yX2VudiIKKwkgICAgZXNhYworCSAgICBleGl0IDEKKyAgICB9CisgICAgcmVzdWx0PSQoZ2l0LXdyaXRlLXRyZWUpIHx8IGV4aXQKK30KK2VjaG8gPiYyICJGaW5pc2hlZCBvbmUgJG1lLiIKKworIyBJZiB3ZSBhcmUgY2hlcnJ5LXBpY2ssIGFuZCBpZiB0aGUgbWVyZ2UgZGlkIG5vdCByZXN1bHQgaW4KKyMgaGFuZC1lZGl0aW5nLCB3ZSB3aWxsIGhpdCB0aGlzIGNvbW1pdCBhbmQgaW5oZXJpdCB0aGUgb3JpZ2luYWwKKyMgYXV0aG9yIGRhdGUgYW5kIG5hbWUuCisjIElmIHdlIGFyZSByZXZlcnQsIG9yIGlmIG91ciBjaGVycnktcGljayByZXN1bHRzIGluIGEgaGFuZCBtZXJnZSwKKyMgd2UgaGFkIGJldHRlciBzYXkgdGhhdCB0aGUgY3VycmVudCB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0LgorCitjYXNlICIkbm9fY29tbWl0IiBpbgorJycpCisJZ2l0LWNvbW1pdCAtbiAtRiAubXNnICRlZGl0CisJcm0gLWYgLm1zZworCTs7Citlc2FjCmRpZmYgLS1naXQgYS9naXQtc2VuZC1lbWFpbC5wZXJsIGIvZ2l0LXNlbmQtZW1haWwucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hODNjN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXNlbmQtZW1haWwucGVybApAQCAtMCwwICsxLDYwMCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIENvcHlyaWdodCAyMDAyLDIwMDUgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyMgQ29weXJpZ2h0IDIwMDUgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKyMKKyMgR1BMIHYyIChTZWUgQ09QWUlORykKKyMKKyMgUG9ydGVkIHRvIHN1cHBvcnQgZ2l0ICJtYm94IiBmb3JtYXQgZmlsZXMgYnkgUnlhbiBBbmRlcnNvbiA8cnlhbkBtaWNob25saW5lLmNvbT4KKyMKKyMgU2VuZHMgYSBjb2xsZWN0aW9uIG9mIGVtYWlscyB0byB0aGUgZ2l2ZW4gZW1haWwgYWRkcmVzc2VzLCBkaXN0dXJiaW5nbHkgZmFzdC4KKyMKKyMgU3VwcG9ydHMgdHdvIGZvcm1hdHM6CisjIDEuIG1ib3ggZm9ybWF0IGZpbGVzIChpZ25vcmluZyBtb3N0IGhlYWRlcnMgYW5kIE1JTUUgZm9ybWF0dGluZyAtIHRoaXMgaXMgZGVzaWduZWQgZm9yIHNlbmRpbmcgcGF0Y2hlcykKKyMgMi4gVGhlIG9yaWdpbmFsIGZvcm1hdCBzdXBwb3J0IGJ5IEdyZWcncyBzY3JpcHQ6CisjICAgIGZpcnN0IGxpbmUgb2YgdGhlIG1lc3NhZ2UgaXMgd2hvIHRvIENDLAorIyAgICBhbmQgc2Vjb25kIGxpbmUgaXMgdGhlIHN1YmplY3Qgb2YgdGhlIG1lc3NhZ2UuCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgVGVybTo6UmVhZExpbmU7Cit1c2UgR2V0b3B0OjpMb25nOwordXNlIERhdGE6OkR1bXBlcjsKKworcGFja2FnZSBGYWtlVGVybTsKK3N1YiBuZXcgeworCW15ICgkY2xhc3MsICRyZWFzb24pID0gQF87CisJcmV0dXJuIGJsZXNzIFwkcmVhc29uLCBzaGlmdDsKK30KK3N1YiByZWFkbGluZSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlkaWUgIkNhbm5vdCB1c2UgcmVhZGxpbmUgb24gRmFrZVRlcm06ICQkc2VsZiI7Cit9CitwYWNrYWdlIG1haW47CisKKyMgbW9zdCBtYWlsIHNlcnZlcnMgZ2VuZXJhdGUgdGhlIERhdGU6IGhlYWRlciwgYnV0IG5vdCBhbGwuLi4KK3N1YiBmb3JtYXRfMjgyMl90aW1lIHsKKwlteSAoJHRpbWUpID0gQF87CisJbXkgQGxvY2FsdG0gPSBsb2NhbHRpbWUoJHRpbWUpOworCW15IEBnbXR0bSA9IGdtdGltZSgkdGltZSk7CisJbXkgJGxvY2FsbWluID0gJGxvY2FsdG1bMV0gKyAkbG9jYWx0bVsyXSAqIDYwOworCW15ICRnbXRtaW4gPSAkZ210dG1bMV0gKyAkZ210dG1bMl0gKiA2MDsKKwlpZiAoJGxvY2FsdG1bMF0gIT0gJGdtdHRtWzBdKSB7CisJCWRpZSAibG9jYWwgem9uZSBkaWZmZXJzIGZyb20gR01UIGJ5IGEgbm9uLW1pbnV0ZSBpbnRlcnZhbFxuIjsKKwl9CisJaWYgKCgoJGdtdHRtWzZdICsgMSkgJSA3KSA9PSAkbG9jYWx0bVs2XSkgeworCQkkbG9jYWxtaW4gKz0gMTQ0MDsKKwl9IGVsc2lmICgoKCRnbXR0bVs2XSAtIDEpICUgNykgPT0gJGxvY2FsdG1bNl0pIHsKKwkJJGxvY2FsbWluIC09IDE0NDA7CisJfSBlbHNpZiAoJGdtdHRtWzZdICE9ICRsb2NhbHRtWzZdKSB7CisJCWRpZSAibG9jYWwgdGltZSBvZmZzZXQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDI0IGhvdXJzXG4iOworCX0KKwlteSAkb2Zmc2V0ID0gJGxvY2FsbWluIC0gJGdtdG1pbjsKKwlteSAkb2ZmaG91ciA9ICRvZmZzZXQgLyA2MDsKKwlteSAkb2ZmbWluID0gYWJzKCRvZmZzZXQgJSA2MCk7CisJaWYgKGFicygkb2ZmaG91cikgPj0gMjQpIHsKKwkJZGllICgibG9jYWwgdGltZSBvZmZzZXQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDI0IGhvdXJzXG4iKTsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZigiJXMsICUyZCAlcyAlZCAlMDJkOiUwMmQ6JTAyZCAlcyUwMmQlMDJkIiwKKwkJICAgICAgIHF3KFN1biBNb24gVHVlIFdlZCBUaHUgRnJpIFNhdClbJGxvY2FsdG1bNl1dLAorCQkgICAgICAgJGxvY2FsdG1bM10sCisJCSAgICAgICBxdyhKYW4gRmViIE1hciBBcHIgTWF5IEp1bgorCQkJICBKdWwgQXVnIFNlcCBPY3QgTm92IERlYylbJGxvY2FsdG1bNF1dLAorCQkgICAgICAgJGxvY2FsdG1bNV0rMTkwMCwKKwkJICAgICAgICRsb2NhbHRtWzJdLAorCQkgICAgICAgJGxvY2FsdG1bMV0sCisJCSAgICAgICAkbG9jYWx0bVswXSwKKwkJICAgICAgICgkb2Zmc2V0ID49IDApID8gJysnIDogJy0nLAorCQkgICAgICAgYWJzKCRvZmZob3VyKSwKKwkJICAgICAgICRvZmZtaW4sCisJCSAgICAgICApOworfQorCitteSAkaGF2ZV9lbWFpbF92YWxpZCA9IGV2YWwgeyByZXF1aXJlIEVtYWlsOjpWYWxpZDsgMSB9OworbXkgJHNtdHA7CisKK3N1YiB1bmlxdWVfZW1haWxfbGlzdChAKTsKK3N1YiBjbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKKworIyBDb25zdGFudHMgKGVzc2VudGlhbGx5KQorbXkgJGNvbXBvc2VfZmlsZW5hbWUgPSAiLm1zZy4kJCI7CisKKyMgVmFyaWFibGVzIHdlIGZpbGwgaW4gYXV0b21hdGljYWxseSwgb3IgdmlhIHByb21wdGluZzoKK215IChAdG8sQGNjLEBpbml0aWFsX2NjLEBiY2NsaXN0LAorCSRpbml0aWFsX3JlcGx5X3RvLCRpbml0aWFsX3N1YmplY3QsQGZpbGVzLCRmcm9tLCRjb21wb3NlLCR0aW1lKTsKKworIyBCZWhhdmlvciBtb2RpZmljYXRpb24gdmFyaWFibGVzCitteSAoJGNoYWluX3JlcGx5X3RvLCAkcXVpZXQsICRzdXBwcmVzc19mcm9tLCAkbm9fc2lnbmVkX29mZl9jYykgPSAoMSwgMCwgMCwgMCk7CitteSAkc210cF9zZXJ2ZXI7CisKKyMgRXhhbXBsZSByZXBseSB0bzoKKyMkaW5pdGlhbF9yZXBseV90byA9ICcnOyAjPDIwMDUwMjAzMTczMjA4LkdBMjM5NjRAZm9vYmFyLmNvbT4nOworCitteSAkdGVybSA9IGV2YWwgeworCW5ldyBUZXJtOjpSZWFkTGluZSAnZ2l0LXNlbmQtZW1haWwnOworfTsKK2lmICgkQCkgeworCSR0ZXJtID0gbmV3IEZha2VUZXJtICIkQDogZ29pbmcgbm9uLWludGVyYWN0aXZlIjsKK30KKworIyBCZWdpbiBieSBhY2N1bXVsYXRpbmcgYWxsIHRoZSB2YXJpYWJsZXMgKGRlZmluZWQgYWJvdmUpLCB0aGF0IHdlIHdpbGwgZW5kIHVwCisjIG5lZWRpbmcsIGZpcnN0LCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6CisKK215ICRyYyA9IEdldE9wdGlvbnMoImZyb209cyIgPT4gXCRmcm9tLAorICAgICAgICAgICAgICAgICAgICAiaW4tcmVwbHktdG89cyIgPT4gXCRpbml0aWFsX3JlcGx5X3RvLAorCQkgICAgInN1YmplY3Q9cyIgPT4gXCRpbml0aWFsX3N1YmplY3QsCisJCSAgICAidG89cyIgPT4gXEB0bywKKwkJICAgICJjYz1zIiA9PiBcQGluaXRpYWxfY2MsCisJCSAgICAiYmNjPXMiID0+IFxAYmNjbGlzdCwKKwkJICAgICJjaGFpbi1yZXBseS10byEiID0+IFwkY2hhaW5fcmVwbHlfdG8sCisJCSAgICAic210cC1zZXJ2ZXI9cyIgPT4gXCRzbXRwX3NlcnZlciwKKwkJICAgICJjb21wb3NlIiA9PiBcJGNvbXBvc2UsCisJCSAgICAicXVpZXQiID0+IFwkcXVpZXQsCisJCSAgICAic3VwcHJlc3MtZnJvbSIgPT4gXCRzdXBwcmVzc19mcm9tLAorCQkgICAgIm5vLXNpZ25lZC1vZmYtY2N8bm8tc2lnbmVkLW9mZi1ieS1jYyIgPT4gXCRub19zaWduZWRfb2ZmX2NjLAorCSApOworCisjIFZlcmlmeSB0aGUgdXNlciBpbnB1dAorCitmb3JlYWNoIG15ICRlbnRyeSAoQHRvKSB7CisJZGllICJDb21tYSBpbiAtLXRvIGVudHJ5OiAkZW50cnknXG4iIHVubGVzcyAkZW50cnkgIX4gbS8sLzsKK30KKworZm9yZWFjaCBteSAkZW50cnkgKEBpbml0aWFsX2NjKSB7CisJZGllICJDb21tYSBpbiAtLWNjIGVudHJ5OiAkZW50cnknXG4iIHVubGVzcyAkZW50cnkgIX4gbS8sLzsKK30KKworZm9yZWFjaCBteSAkZW50cnkgKEBiY2NsaXN0KSB7CisJZGllICJDb21tYSBpbiAtLWJjY2xpc3QgZW50cnk6ICRlbnRyeSdcbiIgdW5sZXNzICRlbnRyeSAhfiBtLywvOworfQorCisjIE5vdywgbGV0J3MgZmlsbCBhbnkgdGhhdCBhcmVuJ3Qgc2V0IGluIHdpdGggZGVmYXVsdHM6CisKK3N1YiBnaXR2YXIgeworICAgIG15ICgkdmFyKSA9IEBfOworICAgIG15ICRmaDsKKyAgICBteSAkcGlkID0gb3BlbigkZmgsICctfCcpOworICAgIGRpZSAiJCEiIHVubGVzcyBkZWZpbmVkICRwaWQ7CisgICAgaWYgKCEkcGlkKSB7CisJZXhlYygnZ2l0LXZhcicsICR2YXIpIG9yIGRpZSAiJCEiOworICAgIH0KKyAgICBteSAoJHZhbCkgPSA8JGZoPjsKKyAgICBjbG9zZSAkZmggb3IgZGllICIkISI7CisgICAgY2hvbXAoJHZhbCk7CisgICAgcmV0dXJuICR2YWw7Cit9CisKK3N1YiBnaXR2YXJfaWRlbnQgeworICAgIG15ICgkbmFtZSkgPSBAXzsKKyAgICBteSAkdmFsID0gZ2l0dmFyKCRuYW1lKTsKKyAgICBteSBAZmllbGQgPSBzcGxpdCgvXHMrLywgJHZhbCk7CisgICAgcmV0dXJuIGpvaW4oJyAnLCBAZmllbGRbMC4uLihAZmllbGQtMyldKTsKK30KKworbXkgKCRhdXRob3IpID0gZ2l0dmFyX2lkZW50KCdHSVRfQVVUSE9SX0lERU5UJyk7CitteSAoJGNvbW1pdHRlcikgPSBnaXR2YXJfaWRlbnQoJ0dJVF9DT01NSVRURVJfSURFTlQnKTsKKworbXkgJWFsaWFzZXM7CitjaG9tcChteSBAYWxpYXNfZmlsZXMgPSBgZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LWFsbCBzZW5kZW1haWwuYWxpYXNlc2ZpbGVgKTsKK2Nob21wKG15ICRhbGlhc2ZpbGV0eXBlID0gYGdpdC1yZXBvLWNvbmZpZyBzZW5kZW1haWwuYWxpYXNmaWxldHlwZWApOworbXkgJXBhcnNlX2FsaWFzID0gKAorCSMgbXVsdGlsaW5lIGZvcm1hdHMgY2FuIGJlIHN1cHBvcnRlZCBpbiB0aGUgZnV0dXJlCisJbXV0dCA9PiBzdWIgeyBteSAkZmggPSBzaGlmdDsgd2hpbGUgKDwkZmg+KSB7CisJCWlmICgvXmFsaWFzXHMrKFxTKylccysoLiopJC8pIHsKKwkJCW15ICgkYWxpYXMsICRhZGRyKSA9ICgkMSwgJDIpOworCQkJJGFkZHIgPX4gcy8jLiokLy87ICMgbXV0dCBhbGxvd3MgIyBjb21tZW50cworCQkJICMgY29tbWFzIGRlbGltaXQgbXVsdGlwbGUgYWRkcmVzc2VzCisJCQkkYWxpYXNlc3skYWxpYXN9ID0gWyBzcGxpdCgvXHMqLFxzKi8sICRhZGRyKSBdOworCQl9fX0sCisJbWFpbHJjID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9eYWxpYXNccysoXFMrKVxzKyguKikkLykgeworCQkJIyBzcGFjZXMgZGVsaW1pdCBtdWx0aXBsZSBhZGRyZXNzZXMKKwkJCSRhbGlhc2VzeyQxfSA9IFsgc3BsaXQoL1xzKy8sICQyKSBdOworCQl9fX0sCisJcGluZSA9PiBzdWIgeyBteSAkZmggPSBzaGlmdDsgd2hpbGUgKDwkZmg+KSB7CisJCWlmICgvXihcUyspXHMrKC4qKSQvKSB7CisJCQkkYWxpYXNlc3skMX0gPSBbIHNwbGl0KC9ccyosXHMqLywgJDIpIF07CisJCX19fSwKKwlnbnVzID0+IHN1YiB7IG15ICRmaCA9IHNoaWZ0OyB3aGlsZSAoPCRmaD4pIHsKKwkJaWYgKC9cKGRlZmluZS1tYWlsLWFsaWFzXHMrIihcUys/KSJccysiKFxTKz8pIlwpLykgeworCQkJJGFsaWFzZXN7JDF9ID0gWyAkMiBdOworCQl9fX0KKyk7CisKK2lmIChAYWxpYXNfZmlsZXMgJiYgZGVmaW5lZCAkcGFyc2VfYWxpYXN7JGFsaWFzZmlsZXR5cGV9KSB7CisJZm9yZWFjaCBteSAkZmlsZSAoQGFsaWFzX2ZpbGVzKSB7CisJCW9wZW4gbXkgJGZoLCAnPCcsICRmaWxlIG9yIGRpZSAib3BlbmluZyAkZmlsZTogJCFcbiI7CisJCSRwYXJzZV9hbGlhc3skYWxpYXNmaWxldHlwZX0tPigkZmgpOworCQljbG9zZSAkZmg7CisJfQorfQorCitteSAkcHJvbXB0aW5nID0gMDsKK2lmICghZGVmaW5lZCAkZnJvbSkgeworCSRmcm9tID0gJGF1dGhvciB8fCAkY29tbWl0dGVyOworCWRvIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIldobyBzaG91bGQgdGhlIGVtYWlscyBhcHBlYXIgdG8gYmUgZnJvbT8gIiwKKwkJCSRmcm9tKTsKKwl9IHdoaWxlICghZGVmaW5lZCAkXyk7CisKKwkkZnJvbSA9ICRfOworCXByaW50ICJFbWFpbHMgd2lsbCBiZSBzZW50IGZyb206ICIsICRmcm9tLCAiXG4iOworCSRwcm9tcHRpbmcrKzsKK30KKworaWYgKCFAdG8pIHsKKwlkbyB7CisJCSRfID0gJHRlcm0tPnJlYWRsaW5lKCJXaG8gc2hvdWxkIHRoZSBlbWFpbHMgYmUgc2VudCB0bz8gIiwKKwkJCQkiIik7CisJfSB3aGlsZSAoIWRlZmluZWQgJF8pOworCW15ICR0byA9ICRfOworCXB1c2ggQHRvLCBzcGxpdCAvLC8sICR0bzsKKwkkcHJvbXB0aW5nKys7Cit9CisKK3N1YiBleHBhbmRfYWxpYXNlcyB7CisJbXkgQGN1ciA9IEBfOworCW15IEBsYXN0OworCWRvIHsKKwkJQGxhc3QgPSBAY3VyOworCQlAY3VyID0gbWFwIHsgJGFsaWFzZXN7JF99ID8gQHskYWxpYXNlc3skX319IDogJF8gfSBAbGFzdDsKKwl9IHdoaWxlIChqb2luKCcsJyxAY3VyKSBuZSBqb2luKCcsJyxAbGFzdCkpOworCXJldHVybiBAY3VyOworfQorCitAdG8gPSBleHBhbmRfYWxpYXNlcyhAdG8pOworQGluaXRpYWxfY2MgPSBleHBhbmRfYWxpYXNlcyhAaW5pdGlhbF9jYyk7CitAYmNjbGlzdCA9IGV4cGFuZF9hbGlhc2VzKEBiY2NsaXN0KTsKKworaWYgKCFkZWZpbmVkICRpbml0aWFsX3N1YmplY3QgJiYgJGNvbXBvc2UpIHsKKwlkbyB7CisJCSRfID0gJHRlcm0tPnJlYWRsaW5lKCJXaGF0IHN1YmplY3Qgc2hvdWxkIHRoZSBlbWFpbHMgc3RhcnQgd2l0aD8gIiwKKwkJCSRpbml0aWFsX3N1YmplY3QpOworCX0gd2hpbGUgKCFkZWZpbmVkICRfKTsKKwkkaW5pdGlhbF9zdWJqZWN0ID0gJF87CisJJHByb21wdGluZysrOworfQorCitpZiAoIWRlZmluZWQgJGluaXRpYWxfcmVwbHlfdG8gJiYgJHByb21wdGluZykgeworCWRvIHsKKwkJJF89ICR0ZXJtLT5yZWFkbGluZSgiTWVzc2FnZS1JRCB0byBiZSB1c2VkIGFzIEluLVJlcGx5LVRvIGZvciB0aGUgZmlyc3QgZW1haWw/ICIsCisJCQkkaW5pdGlhbF9yZXBseV90byk7CisJfSB3aGlsZSAoIWRlZmluZWQgJF8pOworCisJJGluaXRpYWxfcmVwbHlfdG8gPSAkXzsKKwkkaW5pdGlhbF9yZXBseV90byA9fiBzLyheXHMrfFxzKyQpLy9nOworfQorCitpZiAoISRzbXRwX3NlcnZlcikgeworCWZvcmVhY2ggKHF3KCAvdXNyL3NiaW4vc2VuZG1haWwgL3Vzci9saWIvc2VuZG1haWwgKSkgeworCQlpZiAoLXggJF8pIHsKKwkJCSRzbXRwX3NlcnZlciA9ICRfOworCQkJbGFzdDsKKwkJfQorCX0KKwkkc210cF9zZXJ2ZXIgfHw9ICdsb2NhbGhvc3QnOyAjIGNvdWxkIGJlIDEyNy4wLjAuMSwgdG9vLi4uICpzaHJ1ZyoKK30KKworaWYgKCRjb21wb3NlKSB7CisJIyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlY3VyZSwgYnV0IHdlIHdpbGwgbWFrZSBhIHNtYWxsCisJIyBlZmZvcnQgdG8gaGF2ZSBpdCBiZSB1bmlxdWUKKwlvcGVuKEMsIj4iLCRjb21wb3NlX2ZpbGVuYW1lKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZvciB3cml0aW5nICRjb21wb3NlX2ZpbGVuYW1lOiAkISI7CisJcHJpbnQgQyAiRnJvbSAkZnJvbSAjIFRoaXMgbGluZSBpcyBpZ25vcmVkLlxuIjsKKwlwcmludGYgQyAiU3ViamVjdDogJXNcblxuIiwgJGluaXRpYWxfc3ViamVjdDsKKwlwcmludGYgQyA8PEVPVDsKK0dJVDogUGxlYXNlIGVudGVyIHlvdXIgZW1haWwgYmVsb3cuCitHSVQ6IExpbmVzIGJlZ2lubmluZyBpbiAiR0lUOiAiIHdpbGwgYmUgcmVtb3ZlZC4KK0dJVDogQ29uc2lkZXIgaW5jbHVkaW5nIGFuIG92ZXJhbGwgZGlmZnN0YXQgb3IgdGFibGUgb2YgY29udGVudHMKK0dJVDogZm9yIHRoZSBwYXRjaCB5b3UgYXJlIHdyaXRpbmcuCisKK0VPVAorCWNsb3NlKEMpOworCisJbXkgJGVkaXRvciA9ICRFTlZ7RURJVE9SfTsKKwkkZWRpdG9yID0gJ3ZpJyB1bmxlc3MgZGVmaW5lZCAkZWRpdG9yOworCXN5c3RlbSgkZWRpdG9yLCAkY29tcG9zZV9maWxlbmFtZSk7CisKKwlvcGVuKEMyLCI+IiwkY29tcG9zZV9maWxlbmFtZSAuICIuZmluYWwiKQorCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuICRjb21wb3NlX2ZpbGVuYW1lLmZpbmFsIDogIiAuICQhOworCisJb3BlbihDLCI8IiwkY29tcG9zZV9maWxlbmFtZSkKKwkJb3IgZGllICJGYWlsZWQgdG8gb3BlbiAkY29tcG9zZV9maWxlbmFtZSA6ICIgLiAkITsKKworCXdoaWxlKDxDPikgeworCQluZXh0IGlmIG0vXkdJVDogLzsKKwkJcHJpbnQgQzIgJF87CisJfQorCWNsb3NlKEMpOworCWNsb3NlKEMyKTsKKworCWRvIHsKKwkJJF8gPSAkdGVybS0+cmVhZGxpbmUoIlNlbmQgdGhpcyBlbWFpbD8gKHl8bikgIik7CisJfSB3aGlsZSAoIWRlZmluZWQgJF8pOworCisJaWYgKHVjIHN1YnN0cigkXywwLDEpIG5lICdZJykgeworCQljbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlAZmlsZXMgPSAoJGNvbXBvc2VfZmlsZW5hbWUgLiAiLmZpbmFsIik7Cit9CisKKworIyBOb3cgdGhhdCBhbGwgdGhlIGRlZmF1bHRzIGFyZSBzZXQsIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgbGluZQorIyBhcmd1bWVudHMgYW5kIGNvbGxlY3QgdXAgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQuCitmb3IgbXkgJGYgKEBBUkdWKSB7CisJaWYgKC1kICRmKSB7CisJCW9wZW5kaXIoREgsJGYpCisJCQlvciBkaWUgIkZhaWxlZCB0byBvcGVuZGlyICRmOiAkISI7CisKKwkJcHVzaCBAZmlsZXMsIGdyZXAgeyAtZiAkXyB9IG1hcCB7ICskZiAuICIvIiAuICRfIH0KKwkJCQlzb3J0IHJlYWRkaXIoREgpOworCisJfSBlbHNpZiAoLWYgJGYpIHsKKwkJcHVzaCBAZmlsZXMsICRmOworCisJfSBlbHNlIHsKKwkJcHJpbnQgU1RERVJSICJTa2lwcGluZyAkZiAtIG5vdCBmb3VuZC5cbiI7CisJfQorfQorCitpZiAoQGZpbGVzKSB7CisJdW5sZXNzICgkcXVpZXQpIHsKKwkJcHJpbnQgJF8sIlxuIiBmb3IgKEBmaWxlcyk7CisJfQorfSBlbHNlIHsKKwlwcmludCA8PEVPVDsKK2dpdC1zZW5kLWVtYWlsIFtvcHRpb25zXSA8ZmlsZSB8IGRpcmVjdG9yeT4gWy4uLiBmaWxlIHwgZGlyZWN0b3J5IF0KK09wdGlvbnM6CisgICAtLWZyb20gICAgICAgICBTcGVjaWZ5IHRoZSAiRnJvbToiIGxpbmUgb2YgdGhlIGVtYWlsIHRvIGJlIHNlbnQuCisKKyAgIC0tdG8gICAgICAgICAgIFNwZWNpZnkgdGhlIHByaW1hcnkgIlRvOiIgbGluZSBvZiB0aGUgZW1haWwuCisKKyAgIC0tY2MgICAgICAgICAgIFNwZWNpZnkgYW4gaW5pdGlhbCAiQ2M6IiBsaXN0IGZvciB0aGUgZW50aXJlIHNlcmllcworICAgICAgICAgICAgICAgICAgb2YgZW1haWxzLgorCisgICAtLWJjYyAgICAgICAgICBTcGVjaWZ5IGEgbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgdGhhdCBzaG91bGQgYmUgQmNjOgorCQkgIG9uIGFsbCB0aGUgZW1haWxzLgorCisgICAtLWNvbXBvc2UgICAgICBVc2UgXCRFRElUT1IgdG8gZWRpdCBhbiBpbnRyb2R1Y3RvcnkgbWVzc2FnZSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICBwYXRjaCBzZXJpZXMuCisKKyAgIC0tc3ViamVjdCAgICAgIFNwZWNpZnkgdGhlIGluaXRpYWwgIlN1YmplY3Q6IiBsaW5lLgorICAgICAgICAgICAgICAgICAgT25seSBuZWNlc3NhcnkgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlCisJCSAgaXMgbm90IHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworICAgLS1pbi1yZXBseS10byAgU3BlY2lmeSB0aGUgZmlyc3QgIkluLVJlcGx5LVRvOiIgaGVhZGVyIGxpbmUuCisgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgaWYgLS1jb21wb3NlIGlzIGFsc28gc2V0LiAgSWYgLS1jb21wb3NlIGlzIG5vdAorCQkgIHNldCwgdGhpcyB3aWxsIGJlIHByb21wdGVkIGZvci4KKworICAgLS1jaGFpbi1yZXBseS10byBJZiBzZXQsIHRoZSByZXBsaWVzIHdpbGwgYWxsIGJlIHRvIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgZW1haWwgc2VudCwgcmF0aGVyIHRoYW4gdG8gdGhlIGZpcnN0IGVtYWlsIHNlbnQuCisgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBvbi4KKworICAgLS1uby1zaWduZWQtb2ZmLWNjIFN1cHByZXNzIHRoZSBhdXRvbWF0aWMgYWRkaXRpb24gb2YgZW1haWwgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgIHRoYXQgYXBwZWFyIGluIGEgU2lnbmVkLW9mZi1ieTogbGluZSwgdG8gdGhlIGNjOiBsaXN0LgorCQkgTm90ZTogVXNpbmcgdGhpcyBvcHRpb24gaXMgbm90IHJlY29tbWVuZGVkLgorCisgICAtLXNtdHAtc2VydmVyICBJZiBzZXQsIHNwZWNpZmllcyB0aGUgb3V0Z29pbmcgU01UUCBzZXJ2ZXIgdG8gdXNlLgorICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gbG9jYWxob3N0LgorCisgIC0tc3VwcHJlc3MtZnJvbSBTdXBwcmVzcyBzZW5kaW5nIGVtYWlscyB0byB5b3Vyc2VsZiBpZiB5b3VyIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgIGFwcGVhcnMgaW4gYSBGcm9tOiBsaW5lLgorCisgICAtLXF1aWV0CU1ha2UgZ2l0LXNlbmQtZW1haWwgbGVzcyB2ZXJib3NlLiAgT25lIGxpbmUgcGVyIGVtYWlsIHNob3VsZCBiZQorCQlhbGwgdGhhdCBpcyBvdXRwdXQuCisKK0Vycm9yOiBQbGVhc2Ugc3BlY2lmeSBhIGZpbGUgb3IgYSBkaXJlY3Rvcnkgb24gdGhlIGNvbW1hbmQgbGluZS4KK0VPVAorCWV4aXQoMSk7Cit9CisKKyMgVmFyaWFibGVzIHdlIHNldCBhcyBwYXJ0IG9mIHRoZSBsb29wIG92ZXIgZmlsZXMKK291ciAoJG1lc3NhZ2VfaWQsICRjYywgJW1haWwsICRzdWJqZWN0LCAkcmVwbHlfdG8sICRyZWZlcmVuY2VzLCAkbWVzc2FnZSk7CisKK3N1YiBleHRyYWN0X3ZhbGlkX2FkZHJlc3MgeworCW15ICRhZGRyZXNzID0gc2hpZnQ7CisJbXkgJGxvY2FsX3BhcnRfcmVnZXhwID0gJ1tePD4iXHNAXSsnOworCW15ICRkb21haW5fcmVnZXhwID0gJ1teLjw+IlxzQF0rKD86XC5bXi48PiJcc0BdKykrJzsKKworCSMgY2hlY2sgZm9yIGEgbG9jYWwgYWRkcmVzczoKKwlyZXR1cm4gJGFkZHJlc3MgaWYgKCRhZGRyZXNzID1+IC9eKCRsb2NhbF9wYXJ0X3JlZ2V4cCkkLyk7CisKKwlpZiAoJGhhdmVfZW1haWxfdmFsaWQpIHsKKwkJcmV0dXJuIHNjYWxhciBFbWFpbDo6VmFsaWQtPmFkZHJlc3MoJGFkZHJlc3MpOworCX0gZWxzZSB7CisJCSMgbGVzcyByb2J1c3QvY29ycmVjdCB0aGFuIHRoZSBtb25zdGVyIHJlZ2V4cCBpbiBFbWFpbDo6VmFsaWQsCisJCSMgYnV0IHN0aWxsIGRvZXMgYSA5OSUgam9iLCBhbmQgb25lIGxlc3MgZGVwZW5kZW5jeQorCQkkYWRkcmVzcyA9fiAvKCRsb2NhbF9wYXJ0X3JlZ2V4cFxAJGRvbWFpbl9yZWdleHApLzsKKwkJcmV0dXJuICQxOworCX0KK30KKworIyBVc3VhbGx5IGRvbid0IG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nIGJlbG93IGhlcmUuCisKKyMgd2UgbWFrZSBhICJmYWtlIiBtZXNzYWdlIGlkIGJ5IHRha2luZyB0aGUgY3VycmVudCBudW1iZXIKKyMgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgYmVnaW5uaW5nIG9mIFVuaXggdGltZSBhbmQgdGFja2luZyBvbgorIyBhIHJhbmRvbSBudW1iZXIgdG8gdGhlIGVuZCwgaW4gY2FzZSB3ZSBhcmUgY2FsbGVkIHF1aWNrZXIgdGhhbgorIyAxIHNlY29uZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHdlcmUgY2FsbGVkLgorCisjIFdlJ2xsIHNldHVwIGEgdGVtcGxhdGUgZm9yIHRoZSBtZXNzYWdlIGlkLCB1c2luZyB0aGUgImZyb20iIGFkZHJlc3M6CitteSAkbWVzc2FnZV9pZF9mcm9tID0gZXh0cmFjdF92YWxpZF9hZGRyZXNzKCRmcm9tKTsKK215ICRtZXNzYWdlX2lkX3RlbXBsYXRlID0gIjwlcy1naXQtc2VuZC1lbWFpbC0kbWVzc2FnZV9pZF9mcm9tPiI7CisKK3N1YiBtYWtlX21lc3NhZ2VfaWQKK3sKKwlteSAkZGF0ZSA9IHRpbWU7CisJbXkgJHBzZXVkb19yYW5kID0gaW50IChyYW5kKDQyMDApKTsKKwkkbWVzc2FnZV9pZCA9IHNwcmludGYgJG1lc3NhZ2VfaWRfdGVtcGxhdGUsICIkZGF0ZSRwc2V1ZG9fcmFuZCI7CisJI3ByaW50ICJuZXcgbWVzc2FnZSBpZCA9ICRtZXNzYWdlX2lkXG4iOyAjIFdhcyB1c2VmdWwgZm9yIGRlYnVnZ2luZworfQorCisKKworJGNjID0gIiI7CiskdGltZSA9IHRpbWUgLSBzY2FsYXIgJCNmaWxlczsKKworc3ViIHNlbmRfbWVzc2FnZQoreworCW15IEByZWNpcGllbnRzID0gdW5pcXVlX2VtYWlsX2xpc3QoQHRvKTsKKwlteSAkdG8gPSBqb2luICgiLFxuXHQiLCBAcmVjaXBpZW50cyk7CisJQHJlY2lwaWVudHMgPSB1bmlxdWVfZW1haWxfbGlzdChAcmVjaXBpZW50cyxAY2MsQGJjY2xpc3QpOworCW15ICRkYXRlID0gZm9ybWF0XzI4MjJfdGltZSgkdGltZSsrKTsKKwlteSAkZ2l0dmVyc2lvbiA9ICdAQEdJVF9WRVJTSU9OQEAnOworCWlmICgkZ2l0dmVyc2lvbiA9fiBtLy4uR0lUX1ZFUlNJT04uLi8pIHsKKwkgICAgJGdpdHZlcnNpb24gPSBgZ2l0IC0tdmVyc2lvbmA7CisJICAgIGNob21wICRnaXR2ZXJzaW9uOworCSAgICAjIGtlZXAgb25seSB3aGF0J3MgYWZ0ZXIgdGhlIGxhc3Qgc3BhY2UKKwkgICAgJGdpdHZlcnNpb24gPX4gcy9eLiogLy87CisJfQorCisJbXkgJGhlYWRlciA9ICJGcm9tOiAkZnJvbQorVG86ICR0bworQ2M6ICRjYworU3ViamVjdDogJHN1YmplY3QKK0RhdGU6ICRkYXRlCitNZXNzYWdlLUlkOiAkbWVzc2FnZV9pZAorWC1NYWlsZXI6IGdpdC1zZW5kLWVtYWlsICRnaXR2ZXJzaW9uCisiOworCWlmICgkcmVwbHlfdG8pIHsKKworCQkkaGVhZGVyIC49ICJJbi1SZXBseS1UbzogJHJlcGx5X3RvXG4iOworCQkkaGVhZGVyIC49ICJSZWZlcmVuY2VzOiAkcmVmZXJlbmNlc1xuIjsKKwl9CisKKwlpZiAoJHNtdHBfc2VydmVyID1+IG0jXi8jKSB7CisJCW15ICRwaWQgPSBvcGVuIG15ICRzbSwgJ3wtJzsKKwkJZGVmaW5lZCAkcGlkIG9yIGRpZSAkITsKKwkJaWYgKCEkcGlkKSB7CisJCQlleGVjKCRzbXRwX3NlcnZlciwnLWknLAorCQkJICAgICBtYXAgeyBleHRyYWN0X3ZhbGlkX2FkZHJlc3MoJF8pIH0KKwkJCSAgICAgQHJlY2lwaWVudHMpIG9yIGRpZSAkITsKKwkJfQorCQlwcmludCAkc20gIiRoZWFkZXJcbiRtZXNzYWdlIjsKKwkJY2xvc2UgJHNtIG9yIGRpZSAkPzsKKwl9IGVsc2UgeworCQlyZXF1aXJlIE5ldDo6U01UUDsKKwkJJHNtdHAgfHw9IE5ldDo6U01UUC0+bmV3KCAkc210cF9zZXJ2ZXIgKTsKKwkJJHNtdHAtPm1haWwoICRmcm9tICkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+dG8oIEByZWNpcGllbnRzICkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+ZGF0YSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCSRzbXRwLT5kYXRhc2VuZCgiJGhlYWRlclxuJG1lc3NhZ2UiKSBvciBkaWUgJHNtdHAtPm1lc3NhZ2U7CisJCSRzbXRwLT5kYXRhZW5kKCkgb3IgZGllICRzbXRwLT5tZXNzYWdlOworCQkkc210cC0+b2sgb3IgZGllICJGYWlsZWQgdG8gc2VuZCAkc3ViamVjdFxuIi4kc210cC0+bWVzc2FnZTsKKwl9CisJaWYgKCRxdWlldCkgeworCQlwcmludGYgIlNlbnQgJXNcbiIsICRzdWJqZWN0OworCX0gZWxzZSB7CisJCXByaW50ICJPSy4gTG9nIHNheXM6XG5EYXRlOiAkZGF0ZVxuIjsKKwkJaWYgKCRzbXRwKSB7CisJCQlwcmludCAiU2VydmVyOiAkc210cF9zZXJ2ZXJcbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiU2VuZG1haWw6ICRzbXRwX3NlcnZlclxuIjsKKwkJfQorCQlwcmludCAiRnJvbTogJGZyb21cblN1YmplY3Q6ICRzdWJqZWN0XG5DYzogJGNjXG5UbzogJHRvXG5cbiI7CisJCWlmICgkc210cCkgeworCQkJcHJpbnQgIlJlc3VsdDogIiwgJHNtdHAtPmNvZGUsICcgJywKKwkJCQkoJHNtdHAtPm1lc3NhZ2UgPX4gL1xuKFteXG5dK1xuKSQvcyksICJcbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiUmVzdWx0OiBPS1xuIjsKKwkJfQorCX0KK30KKworJHJlcGx5X3RvID0gJGluaXRpYWxfcmVwbHlfdG87CiskcmVmZXJlbmNlcyA9ICRpbml0aWFsX3JlcGx5X3RvIHx8ICcnOworbWFrZV9tZXNzYWdlX2lkKCk7Ciskc3ViamVjdCA9ICRpbml0aWFsX3N1YmplY3Q7CisKK2ZvcmVhY2ggbXkgJHQgKEBmaWxlcykgeworCW9wZW4oRiwiPCIsJHQpIG9yIGRpZSAiY2FuJ3Qgb3BlbiBmaWxlICR0IjsKKworCW15ICRhdXRob3Jfbm90X3NlbmRlciA9IHVuZGVmOworCUBjYyA9IEBpbml0aWFsX2NjOworCW15ICRmb3VuZF9tYm94ID0gMDsKKwlteSAkaGVhZGVyX2RvbmUgPSAwOworCSRtZXNzYWdlID0gIiI7CisJd2hpbGUoPEY+KSB7CisJCWlmICghJGhlYWRlcl9kb25lKSB7CisJCQkkZm91bmRfbWJveCA9IDEsIG5leHQgaWYgKC9eRnJvbSAvKTsKKwkJCWNob21wOworCisJCQlpZiAoJGZvdW5kX21ib3gpIHsKKwkJCQlpZiAoL15TdWJqZWN0OlxzKyguKikkLykgeworCQkJCQkkc3ViamVjdCA9ICQxOworCisJCQkJfSBlbHNpZiAoL14oQ2N8RnJvbSk6XHMrKC4qKSQvKSB7CisJCQkJCWlmICgkMiBlcSAkZnJvbSkgeworCQkJCQkJbmV4dCBpZiAoJHN1cHByZXNzX2Zyb20pOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJJGF1dGhvcl9ub3Rfc2VuZGVyID0gJDI7CisJCQkJCX0KKwkJCQkJcHJpbnRmKCIobWJveCkgQWRkaW5nIGNjOiAlcyBmcm9tIGxpbmUgJyVzJ1xuIiwKKwkJCQkJCSQyLCAkXykgdW5sZXNzICRxdWlldDsKKwkJCQkJcHVzaCBAY2MsICQyOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQkjIEluIHRoZSB0cmFkaXRpb25hbAorCQkJCSMgInNlbmQgbG90cyBvZiBlbWFpbCIgZm9ybWF0LAorCQkJCSMgbGluZSAxID0gY2MKKwkJCQkjIGxpbmUgMiA9IHN1YmplY3QKKwkJCQkjIFNvIGxldCdzIHN1cHBvcnQgdGhhdCwgdG9vLgorCQkJCWlmIChAY2MgPT0gMCkgeworCQkJCQlwcmludGYoIihub24tbWJveCkgQWRkaW5nIGNjOiAlcyBmcm9tIGxpbmUgJyVzJ1xuIiwKKwkJCQkJCSRfLCAkXykgdW5sZXNzICRxdWlldDsKKworCQkJCQlwdXNoIEBjYywgJF87CisKKwkJCQl9IGVsc2lmICghZGVmaW5lZCAkc3ViamVjdCkgeworCQkJCQkkc3ViamVjdCA9ICRfOworCQkJCX0KKwkJCX0KKworCQkJIyBBIHdoaXRlc3BhY2UgbGluZSB3aWxsIHRlcm1pbmF0ZSB0aGUgaGVhZGVycworCQkJaWYgKG0vXlxzKiQvKSB7CisJCQkJJGhlYWRlcl9kb25lID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSRtZXNzYWdlIC49ICAkXzsKKwkJCWlmICgvXlNpZ25lZC1vZmYtYnk6ICguKikkL2kgJiYgISRub19zaWduZWRfb2ZmX2NjKSB7CisJCQkJbXkgJGMgPSAkMTsKKwkJCQljaG9tcCAkYzsKKwkJCQlwdXNoIEBjYywgJGM7CisJCQkJcHJpbnRmKCIoc29iKSBBZGRpbmcgY2M6ICVzIGZyb20gbGluZSAnJXMnXG4iLAorCQkJCQkkYywgJF8pIHVubGVzcyAkcXVpZXQ7CisJCQl9CisJCX0KKwl9CisJY2xvc2UgRjsKKwlpZiAoZGVmaW5lZCAkYXV0aG9yX25vdF9zZW5kZXIpIHsKKwkJJG1lc3NhZ2UgPSAiRnJvbTogJGF1dGhvcl9ub3Rfc2VuZGVyXG5cbiRtZXNzYWdlIjsKKwl9CisKKwkkY2MgPSBqb2luKCIsICIsIHVuaXF1ZV9lbWFpbF9saXN0KEBjYykpOworCisJc2VuZF9tZXNzYWdlKCk7CisKKwkjIHNldCB1cCBmb3IgdGhlIG5leHQgbWVzc2FnZQorCWlmICgkY2hhaW5fcmVwbHlfdG8gfHwgbGVuZ3RoKCRyZXBseV90bykgPT0gMCkgeworCQkkcmVwbHlfdG8gPSAkbWVzc2FnZV9pZDsKKwkJaWYgKGxlbmd0aCAkcmVmZXJlbmNlcyA+IDApIHsKKwkJCSRyZWZlcmVuY2VzIC49ICIgJG1lc3NhZ2VfaWQiOworCQl9IGVsc2UgeworCQkJJHJlZmVyZW5jZXMgPSAiJG1lc3NhZ2VfaWQiOworCQl9CisJfQorCW1ha2VfbWVzc2FnZV9pZCgpOworfQorCitpZiAoJGNvbXBvc2UpIHsKKwljbGVhbnVwX2NvbXBvc2VfZmlsZXMoKTsKK30KKworc3ViIGNsZWFudXBfY29tcG9zZV9maWxlcygpIHsKKwl1bmxpbmsoJGNvbXBvc2VfZmlsZW5hbWUsICRjb21wb3NlX2ZpbGVuYW1lIC4gIi5maW5hbCIpOworCit9CisKKyRzbXRwLT5xdWl0IGlmICRzbXRwOworCitzdWIgdW5pcXVlX2VtYWlsX2xpc3QoQCkgeworCW15ICVzZWVuOworCW15IEBlbWFpbHM7CisKKwlmb3JlYWNoIG15ICRlbnRyeSAoQF8pIHsKKwkJaWYgKG15ICRjbGVhbiA9IGV4dHJhY3RfdmFsaWRfYWRkcmVzcygkZW50cnkpKSB7CisJCQkkc2VlbnskY2xlYW59IHx8PSAwOworCQkJbmV4dCBpZiAkc2VlbnskY2xlYW59Kys7CisJCQlwdXNoIEBlbWFpbHMsICRlbnRyeTsKKwkJfSBlbHNlIHsKKwkJCXByaW50IFNUREVSUiAiVzogdW5hYmxlIHRvIGV4dHJhY3QgYSB2YWxpZCBhZGRyZXNzIiwKKwkJCQkJIiBmcm9tOiAkZW50cnlcbiI7CisJCX0KKwl9CisJcmV0dXJuIEBlbWFpbHM7Cit9CmRpZmYgLS1naXQgYS9naXQtc2gtc2V0dXAuc2ggYi9naXQtc2gtc2V0dXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDJmOWIxYwotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zaC1zZXR1cC5zaApAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKyMKKyMgVGhpcyBpcyBpbmNsdWRlZCBpbiBjb21tYW5kcyB0aGF0IGVpdGhlciBoYXZlIHRvIGJlIHJ1biBmcm9tIHRoZSB0b3BsZXZlbAorIyBvZiB0aGUgcmVwb3NpdG9yeSwgb3Igd2l0aCBHSVRfRElSIGVudmlyb25tZW50IHZhcmlhYmxlIHByb3Blcmx5LgorIyBJZiB0aGUgR0lUX0RJUiBkb2VzIG5vdCBsb29rIGxpa2UgdGhlIHJpZ2h0IGNvcnJlY3QgZ2l0LXJlcG9zaXRvcnksCisjIGl0IGRpZXMuCisKKyMgSGF2aW5nIHRoaXMgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB3b3VsZCBicmVhayBzY3JpcHRzIGJlY2F1c2UKKyMgeW91IHdvdWxkIGNhdXNlICJjZCIgdG8gYmUgYmUgdGFrZW4gdG8gdW5leHBlY3RlZCBwbGFjZXMuICBJZiB5b3UKKyMgbGlrZSBDRFBBVEgsIGRlZmluZSBpdCBmb3IgeW91ciBpbnRlcmFjdGl2ZSBzaGVsbCBzZXNzaW9ucyB3aXRob3V0CisjIGV4cG9ydGluZyBpdC4KK3Vuc2V0IENEUEFUSAorCitkaWUoKSB7CisJZWNobyA+JjIgIiRAIgorCWV4aXQgMQorfQorCit1c2FnZSgpIHsKKwlkaWUgIlVzYWdlOiAkMCAkVVNBR0UiCit9CisKK2lmIFsgLXogIiRMT05HX1VTQUdFIiBdCit0aGVuCisJTE9OR19VU0FHRT0iVXNhZ2U6ICQwICRVU0FHRSIKK2Vsc2UKKwlMT05HX1VTQUdFPSJVc2FnZTogJDAgJFVTQUdFCisKKyRMT05HX1VTQUdFIgorZmkKKworY2FzZSAiJDEiIGluCisJLWh8LS1ofC0taGV8LS1oZWx8LS1oZWxwKQorCWVjaG8gIiRMT05HX1VTQUdFIgorCWV4aXQKK2VzYWMKKworIyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgdmFsaWQgcmVwb3NpdG9yeSBvZiBhIHZpbnRhZ2Ugd2UgdW5kZXJzdGFuZC4KK2lmIFsgLXogIiRTVUJESVJFQ1RPUllfT0siIF0KK3RoZW4KKwk6ICR7R0lUX0RJUj0uZ2l0fQorCUdJVF9ESVI9JChHSVRfRElSPSIkR0lUX0RJUiIgZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXIpIHx8IGV4aXQKK2Vsc2UKKwlHSVRfRElSPSQoZ2l0LXJldi1wYXJzZSAtLWdpdC1kaXIpIHx8IGV4aXQKK2ZpCis6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiRHSVRfRElSL29iamVjdHMifQpkaWZmIC0tZ2l0IGEvZ2l0LXNob3J0bG9nLnBlcmwgYi9naXQtc2hvcnRsb2cucGVybApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYjE0ZjgzCi0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXNob3J0bG9nLnBlcmwKQEAgLTAsMCArMSwyMDAgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OworCitteSAoJW1haWxtYXApOworbXkgKCVlbWFpbCk7CitteSAoJW1hcCk7CitteSAkcHN0YXRlID0gMTsKK215ICRuX3JlY29yZHMgPSAwOworbXkgJG5fb3V0cHV0ID0gMDsKKworc3ViIHNob3J0bG9nX2VudHJ5KCQkKSB7CisJbXkgKCRuYW1lLCAkZGVzYykgPSBAXzsKKwlteSAka2V5ID0gJG5hbWU7CisKKwkkZGVzYyA9fiBzIy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvIy8uLi4vI2c7CisJJGRlc2MgPX4gcyNcW1BBVENIXF0gIyNnOworCisJIyBzdG9yZSBkZXNjcmlwdGlvbiBpbiBhcnJheSwgaW4gZW1haWwtPntkZXNjIGxpc3R9IG1hcAorCWlmIChleGlzdHMgJG1hcHska2V5fSkgeworCQkjIGdyYWIgcmVmCisJCW15ICRvYmogPSAkbWFweyRrZXl9OworCisJCSMgYWRkIGRlc2MgdG8gYXJyYXkKKwkJcHVzaChAJG9iaiwgJGRlc2MpOworCX0gZWxzZSB7CisJCSMgY3JlYXRlIG5ldyBhcnJheSwgY29udGFpbmluZyAxIGl0ZW0KKwkJbXkgQGFyciA9ICgkZGVzYyk7CisKKwkJIyBzdG9yZSByZWYgdG8gYXJyYXkKKwkJJG1hcHska2V5fSA9IFxAYXJyOworCX0KK30KKworIyBzb3J0IGNvbXBhcmlzb24gZnVuY3Rpb24KK3N1YiBieV9uYW1lKCQkKSB7CisJbXkgKCRhLCAkYikgPSBAXzsKKworCXVjKCRhKSBjbXAgdWMoJGIpOworfQorCitzdWIgc2hvcnRsb2dfb3V0cHV0IHsKKwlteSAoJG9iaiwgJGtleSwgJGRlc2MpOworCisJZm9yZWFjaCAka2V5IChzb3J0IGJ5X25hbWUga2V5cyAlbWFwKSB7CisJCSMgb3V0cHV0IGF1dGhvcgorCQlwcmludGYgIiVzOlxuIiwgJGtleTsKKworCQkjIG91dHB1dCBhdXRob3IncyAxLWxpbmUgc3VtbWFyaWVzCisJCSRvYmogPSAkbWFweyRrZXl9OworCQlmb3JlYWNoICRkZXNjIChyZXZlcnNlIEAkb2JqKSB7CisJCQlwcmludCAiICAkZGVzY1xuIjsKKwkJCSRuX291dHB1dCsrOworCQl9CisKKwkJIyBibGFuayBsaW5lIHNlcGFyYXRpbmcgYXV0aG9yIGZyb20gbmV4dCBhdXRob3IKKwkJcHJpbnQgIlxuIjsKKwl9Cit9CisKK3N1YiBjaGFuZ2Vsb2dfaW5wdXQgeworCW15ICgkYXV0aG9yLCAkZGVzYyk7CisKKwl3aGlsZSAoPD4pIHsKKwkJIyBnZXQgYXV0aG9yIGFuZCBlbWFpbAorCQlpZiAoJHBzdGF0ZSA9PSAxKSB7CisJCQlteSAoJGVtYWlsKTsKKworCQkJbmV4dCB1bmxlc3MgL15bQWFddXRob3I6P1xzKiguKj8pXHMqPCguKik+LzsKKworCQkJJG5fcmVjb3JkcysrOworCisJCQkkYXV0aG9yID0gJDE7CisJCQkkZW1haWwgPSAkMjsKKwkJCSRkZXNjID0gdW5kZWY7CisKKwkJCSMgY3NldCBhdXRob3IgZml4dXBzCisJCQlpZiAoZXhpc3RzICRtYWlsbWFweyRlbWFpbH0pIHsKKwkJCQkkYXV0aG9yID0gJG1haWxtYXB7JGVtYWlsfTsKKwkJCX0gZWxzaWYgKGV4aXN0cyAkbWFpbG1hcHskYXV0aG9yfSkgeworCQkJCSRhdXRob3IgPSAkbWFpbG1hcHskYXV0aG9yfTsKKwkJCX0gZWxzaWYgKCEkYXV0aG9yKSB7CisJCQkJJGF1dGhvciA9ICRlbWFpbDsKKwkJCX0KKwkJCSRlbWFpbHskYXV0aG9yfXskZW1haWx9Kys7CisJCQkkcHN0YXRlKys7CisJCX0KKworCQkjIHNraXAgdG8gYmxhbmsgbGluZQorCQllbHNpZiAoJHBzdGF0ZSA9PSAyKSB7CisJCQluZXh0IHVubGVzcyAvXlxzKiQvOworCQkJJHBzdGF0ZSsrOworCQl9CisKKwkJIyBza2lwIHRvIG5vbi1ibGFuayBsaW5lCisJCWVsc2lmICgkcHN0YXRlID09IDMpIHsKKwkJCW5leHQgdW5sZXNzIC9eXHMqPyguKikvOworCisJCQkjIHNraXAgbGluZXMgdGhhdCBhcmUgb2J2aW91c2x5IG5vdAorCQkJIyBhIDEtbGluZSBjc2V0IGRlc2NyaXB0aW9uCisJCQluZXh0IGlmIC9eXHMqRnJvbTogLzsKKworCQkJY2hvbXA7CisJCQkkZGVzYyA9ICQxOworCisJCQkmc2hvcnRsb2dfZW50cnkoJGF1dGhvciwgJGRlc2MpOworCisJCQkkcHN0YXRlID0gMTsKKwkJfQorCQorCQllbHNlIHsKKwkJCWRpZSAiaW52YWxpZCBwYXJzZSBzdGF0ZSAkcHN0YXRlIjsKKwkJfQorCX0KK30KKworc3ViIHJlYWRfbWFpbG1hcCB7CisJbXkgKCRmaCwgJG1haWxtYXApID0gQF87CisJd2hpbGUgKDwkZmg+KSB7CisJCWNob21wOworCQlpZiAoL14oW14jXS4qPylccyo8KC4qKT4vKSB7CisJCQkkbWFpbG1hcC0+eyQyfSA9ICQxOworCQl9CisJfQorfQorCitzdWIgc2V0dXBfbWFpbG1hcCB7CisJcmVhZF9tYWlsbWFwKFwqREFUQSwgXCVtYWlsbWFwKTsKKwlpZiAoLWYgJy5tYWlsbWFwJykgeworCQlteSAkZmggPSB1bmRlZjsKKwkJb3BlbiAkZmgsICc8JywgJy5tYWlsbWFwJzsKKwkJcmVhZF9tYWlsbWFwKCRmaCwgXCVtYWlsbWFwKTsKKwkJY2xvc2UgJGZoOworCX0KK30KKworc3ViIGZpbmFsaXplIHsKKwkjcHJpbnQgIlxuJG5fcmVjb3JkcyByZWNvcmRzIHBhcnNlZC5cbiI7CisKKwlpZiAoJG5fcmVjb3JkcyAhPSAkbl9vdXRwdXQpIHsKKwkJZGllICJwYXJzZSBlcnJvcjogaW5wdXQgcmVjb3JkcyAhPSBvdXRwdXQgcmVjb3Jkc1xuIjsKKwl9CisJaWYgKDApIHsKKwkJZm9yIG15ICRhdXRob3IgKHNvcnQga2V5cyAlZW1haWwpIHsKKwkJCW15ICRlID0gJGVtYWlseyRhdXRob3J9OworCQkJZm9yIG15ICRlbWFpbCAoc29ydCBrZXlzICUkZSkgeworCQkJCXByaW50IFNUREVSUiAiJGF1dGhvciA8JGVtYWlsPlxuIjsKKwkJCX0KKwkJfQorCX0KK30KKworJnNldHVwX21haWxtYXA7CismY2hhbmdlbG9nX2lucHV0OworJnNob3J0bG9nX291dHB1dDsKKyZmaW5hbGl6ZTsKK2V4aXQoMCk7CisKKworX19EQVRBX18KKyMKKyMgRXZlbiB3aXRoIGdpdCwgd2UgZG9uJ3QgYWx3YXlzIGhhdmUgbmFtZSB0cmFuc2xhdGlvbnMuCisjIFNvIGhhdmUgYW4gZW1haWwtPnJlYWwgbmFtZSB0YWJsZSB0byB0cmFuc2xhdGUgdGhlCisjIChob3BlZnVsbHkgZmV3KSBtaXNzaW5nIG5hbWVzCisjCitBZHJpYW4gQnVuayA8YnVua0BzdHVzdGEuZGU+CitBbmRyZWFzIEhlcnJtYW5uIDxhaGVycm1hbkBkZS5pYm0uY29tPgorQW5kcmV3IE1vcnRvbiA8YWtwbUBvc2RsLm9yZz4KK0FuZHJldyBWYXNxdWV6IDxhbmRyZXcudmFzcXVlekBxbG9naWMuY29tPgorQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBsc3QuZGU+CitDb3JleSBNaW55YXJkIDxtaW55YXJkQGFjbS5vcmc+CitEYXZpZCBXb29kaG91c2UgPGR3bXcyQHNoaW55Ym9vay5pbmZyYWRlYWQub3JnPgorRG9tZW4gUHVuY2VyIDxkb21lbkBjb2Rlcm9jay5vcmc+CitEb3VnbGFzIEdpbGJlcnQgPGRvdWdnQHRvcnF1ZS5uZXQ+CitFZCBMIENhc2hpbiA8ZWNhc2hpbkBjb3JhaWQuY29tPgorRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4KK0ZlbGl4IE1vZWxsZXIgPGZlbGl4QGRlcmtsZWNrcy5kZT4KK0ZyYW5rIFphZ28gPGZ6YWdvQHN5c3RlbWZhYnJpY3dvcmtzLmNvbT4KK0dyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CitKYW1lcyBCb3R0b21sZXkgPGplamJAbXVsZ3JhdmUuKG5vbmUpPgorSmFtZXMgQm90dG9tbGV5IDxqZWpiQHRpdGFuaWMuaWwuc3RlZWxleWUuY29tPgorSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcHJldHplbC55eXoudXM+CitKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgorS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorTWl0ZXNoIHNoYWggPG1zaGFoQHRlamEuY29tPgorTW9ydGVuIFdlbGluZGVyIDx0ZXJyYUBnbm9tZS5vcmc+CitNb3J0ZW4gV2VsaW5kZXIgPHdlbGluZGVyQGFuZW1vbmUucmVudGVjLmNvbT4KK01vcnRlbiBXZWxpbmRlciA8d2VsaW5kZXJAZGFydGVyLnJlbnRlYy5jb20+CitNb3J0ZW4gV2VsaW5kZXIgPHdlbGluZGVyQHRyb2xsLmNvbT4KK05ndXllbiBBbmggUXV5bmggPGFxdXluaEBnbWFpbC5jb20+CitQYW9sbyAnQmxhaXNvcmJsYWRlJyBHaWFycnVzc28gPGJsYWlzb3JibGFkZUB5YWhvby5pdD4KK1BldGVyIEEgSm9uc3NvbiA8cGpAbHVkZC5sdHUuc2U+CitSYWxmIFdpbGRlbmh1ZXMgPFJhbGYuV2lsZGVuaHVlc0BnbXguZGU+CitSdWRvbGYgTWFyZWsgPFIuTWFyZWtAc2guY3Z1dC5jej4KK1J1aSBTYXJhaXZhIDxybXBzQGpvZWwuaXN0LnV0bC5wdD4KK1NhY2hpbiBQIFNhbnQgPHNzYW50QGluLmlibS5jb20+CitTYW50dHUgSHlya2sbLEF2GyhCIDxzYW50dHUuaHlya2tvQGdtYWlsLmNvbT4KK1NpbW9uIEtlbGxleSA8c2ltb25AdGhla2VsbGV5cy5vcmcudWs+CitUZWp1biBIZW8gPGh0ZWp1bkBnbWFpbC5jb20+CitUb255IEx1Y2sgPHRvbnkubHVja0BpbnRlbC5jb20+CmRpZmYgLS1naXQgYS9naXQtc3ZuLnBlcmwgYi9naXQtc3ZuLnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGQ1OGJiOQotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zdm4ucGVybApAQCAtMCwwICsxLDMzNTAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMgQ29weXJpZ2h0IChDKSAyMDA2LCBFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4KKyMgTGljZW5zZTogR1BMIHYyIG9yIGxhdGVyCit1c2Ugd2FybmluZ3M7Cit1c2Ugc3RyaWN0OwordXNlIHZhcnMgcXcvCSRBVVRIT1IgJFZFUlNJT04KKwkJJFNWTl9VUkwgJFNWTl9JTkZPICRTVk5fV0MgJFNWTl9VVUlECisJCSRHSVRfU1ZOX0lOREVYICRHSVRfU1ZOCisJCSRHSVRfRElSICRHSVRfU1ZOX0RJUiAkUkVWREIvOworJEFVVEhPUiA9ICdFcmljIFdvbmcgPG5vcm1hbHBlcnNvbkB5aGJ0Lm5ldD4nOworJFZFUlNJT04gPSAnQEBHSVRfVkVSU0lPTkBAJzsKKwordXNlIEN3ZCBxdy9hYnNfcGF0aC87CiskR0lUX0RJUiA9IGFic19wYXRoKCRFTlZ7R0lUX0RJUn0gfHwgJy5naXQnKTsKKyRFTlZ7R0lUX0RJUn0gPSAkR0lUX0RJUjsKKworbXkgJExDX0FMTCA9ICRFTlZ7TENfQUxMfTsKK215ICRUWiA9ICRFTlZ7VFp9OworIyBtYWtlIHN1cmUgdGhlIHN2biBiaW5hcnkgZ2l2ZXMgY29uc2lzdGVudCBvdXRwdXQgYmV0d2VlbiBsb2NhbGVzIGFuZCBUWnM6CiskRU5We1RafSA9ICdVVEMnOworJEVOVntMQ19BTEx9ID0gJ0MnOworJHwgPSAxOyAjIHVuYnVmZmVyIFNURE9VVAorCisjIElmIFNWTjo6IGxpYnJhcnkgc3VwcG9ydCBpcyBhZGRlZCwgcGxlYXNlIG1ha2UgdGhlIGRlcGVuZGVuY2llcworIyBvcHRpb25hbCBhbmQgcHJlc2VydmUgdGhlIGNhcGFiaWxpdHkgdG8gdXNlIHRoZSBjb21tYW5kLWxpbmUgY2xpZW50LgorIyB1c2UgZXZhbCB7IHJlcXVpcmUgU1ZOOjouLi4gfSB0byBtYWtlIGl0IGxhenkgbG9hZAorIyBXZSBkb24ndCB1c2UgYW55IG1vZHVsZXMgbm90IGluIHRoZSBzdGFuZGFyZCBQZXJsIGRpc3RyaWJ1dGlvbjoKK3VzZSBDYXJwIHF3L2Nyb2FrLzsKK3VzZSBJTzo6RmlsZSBxdy8vOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3L2Rpcm5hbWUgYmFzZW5hbWUvOwordXNlIEZpbGU6OlBhdGggcXcvbWtwYXRoLzsKK3VzZSBHZXRvcHQ6OkxvbmcgcXcvOmNvbmZpZyBnbnVfZ2V0b3B0IG5vX2lnbm9yZV9jYXNlIGF1dG9fYWJicmV2IHBhc3NfdGhyb3VnaC87Cit1c2UgRmlsZTo6U3BlYyBxdy8vOwordXNlIEZpbGU6OkNvcHkgcXcvY29weS87Cit1c2UgUE9TSVggcXcvc3RyZnRpbWUvOwordXNlIElQQzo6T3BlbjM7Cit1c2UgTWVtb2l6ZTsKK21lbW9pemUoJ3JldmlzaW9uc19lcScpOworbWVtb2l6ZSgnY210X21ldGFkYXRhJyk7CittZW1vaXplKCdnZXRfY29tbWl0X3RpbWUnKTsKKworbXkgKCRTVk5fUEFUSCwgJFNWTiwgJFNWTl9MT0csICRfdXNlX2xpYik7CiskX3VzZV9saWIgPSAxIHVubGVzcyAkRU5We0dJVF9TVk5fTk9fTElCfTsKK2xpYnN2bl9sb2FkKCk7CitteSAkX29wdGltaXplX2NvbW1pdHMgPSAxIHVubGVzcyAkRU5We0dJVF9TVk5fTk9fT1BUSU1JWkVfQ09NTUlUU307CitteSAkc2hhMSA9IHFyL1thLWZcZF17NDB9LzsKK215ICRzaGExX3Nob3J0ID0gcXIvW2EtZlxkXXs0LDQwfS87CitteSAoJF9yZXZpc2lvbiwkX3N0ZGluLCRfbm9faWdub3JlX2V4dCwkX25vX3N0b3BfY29weSwkX2hlbHAsJF9ybWRpciwkX2VkaXQsCisJJF9maW5kX2NvcGllc19oYXJkZXIsICRfbCwgJF9jcF9zaW1pbGFyaXR5LCAkX2NwX3JlbW90ZSwKKwkkX3JlcGFjaywgJF9yZXBhY2tfbnIsICRfcmVwYWNrX2ZsYWdzLCAkX3EsCisJJF9tZXNzYWdlLCAkX2ZpbGUsICRfZm9sbG93X3BhcmVudCwgJF9ub19tZXRhZGF0YSwKKwkkX3RlbXBsYXRlLCAkX3NoYXJlZCwgJF9ub19kZWZhdWx0X3JlZ2V4LCAkX25vX2dyYWZ0X2NvcHksCisJJF9saW1pdCwgJF92ZXJib3NlLCAkX2luY3JlbWVudGFsLCAkX29uZWxpbmUsICRfbF9mbXQsICRfc2hvd19jb21taXQsCisJJF92ZXJzaW9uLCAkX3VwZ3JhZGUsICRfYXV0aG9ycywgJF9icmFuY2hfYWxsX3JlZnMsIEBfb3B0X20pOworbXkgKEBfYnJhbmNoX2Zyb20sICV0cmVlX21hcCwgJXVzZXJzLCAlcnVzZXJzLCAlZXF1aXYpOworbXkgKCRfc3ZuX2NvX3VybF9yZXZzLCAkX3N2bl9wZ19wZWdfcmV2cyk7CitteSBAcmVwb19wYXRoX3NwbGl0X2NhY2hlOworCitteSAlZmNfb3B0cyA9ICggJ25vLWlnbm9yZS1leHRlcm5hbHMnID0+IFwkX25vX2lnbm9yZV9leHQsCisJCSdicmFuY2h8Yj1zJyA9PiBcQF9icmFuY2hfZnJvbSwKKwkJJ2ZvbGxvdy1wYXJlbnR8Zm9sbG93JyA9PiBcJF9mb2xsb3dfcGFyZW50LAorCQknYnJhbmNoLWFsbC1yZWZzfEInID0+IFwkX2JyYW5jaF9hbGxfcmVmcywKKwkJJ2F1dGhvcnMtZmlsZXxBPXMnID0+IFwkX2F1dGhvcnMsCisJCSdyZXBhY2s6aScgPT4gXCRfcmVwYWNrLAorCQknbm8tbWV0YWRhdGEnID0+IFwkX25vX21ldGFkYXRhLAorCQkncXVpZXR8cScgPT4gXCRfcSwKKwkJJ3JlcGFjay1mbGFnc3xyZXBhY2stYXJnc3xyZXBhY2stb3B0cz1zJyA9PiBcJF9yZXBhY2tfZmxhZ3MpOworCitteSAoJF90cnVuaywgJF90YWdzLCAkX2JyYW5jaGVzKTsKK215ICVtdWx0aV9vcHRzID0gKCAndHJ1bmt8VD1zJyA9PiBcJF90cnVuaywKKwkJJ3RhZ3N8dD1zJyA9PiBcJF90YWdzLAorCQknYnJhbmNoZXN8Yj1zJyA9PiBcJF9icmFuY2hlcyApOworbXkgJWluaXRfb3B0cyA9ICggJ3RlbXBsYXRlPXMnID0+IFwkX3RlbXBsYXRlLCAnc2hhcmVkJyA9PiBcJF9zaGFyZWQgKTsKK215ICVjbXRfb3B0cyA9ICggJ2VkaXR8ZScgPT4gXCRfZWRpdCwKKwkJJ3JtZGlyJyA9PiBcJF9ybWRpciwKKwkJJ2ZpbmQtY29waWVzLWhhcmRlcicgPT4gXCRfZmluZF9jb3BpZXNfaGFyZGVyLAorCQknbD1pJyA9PiBcJF9sLAorCQknY29weS1zaW1pbGFyaXR5fEM9aSc9PiBcJF9jcF9zaW1pbGFyaXR5CispOworCitteSAlY21kID0gKAorCWZldGNoID0+IFsgXCZmZXRjaCwgIkRvd25sb2FkIG5ldyByZXZpc2lvbnMgZnJvbSBTVk4iLAorCQkJeyAncmV2aXNpb258cj1zJyA9PiBcJF9yZXZpc2lvbiwgJWZjX29wdHMgfSBdLAorCWluaXQgPT4gWyBcJmluaXQsICJJbml0aWFsaXplIGEgcmVwbyBmb3IgdHJhY2tpbmciIC4KKwkJCSAgIiAocmVxdWlyZXMgVVJMIGFyZ3VtZW50KSIsCisJCQkgIFwlaW5pdF9vcHRzIF0sCisJY29tbWl0ID0+IFsgXCZjb21taXQsICJDb21taXQgZ2l0IHJldmlzaW9ucyB0byBTVk4iLAorCQkJewknc3RkaW58JyA9PiBcJF9zdGRpbiwgJWNtdF9vcHRzLCAlZmNfb3B0cywgfSBdLAorCSdzaG93LWlnbm9yZScgPT4gWyBcJnNob3dfaWdub3JlLCAiU2hvdyBzdm46aWdub3JlIGxpc3RpbmdzIiwKKwkJCXsgJ3JldmlzaW9ufHI9aScgPT4gXCRfcmV2aXNpb24gfSBdLAorCXJlYnVpbGQgPT4gWyBcJnJlYnVpbGQsICJSZWJ1aWxkIGdpdC1zdm4gbWV0YWRhdGEgKGFmdGVyIGdpdCBjbG9uZSkiLAorCQkJeyAnbm8taWdub3JlLWV4dGVybmFscycgPT4gXCRfbm9faWdub3JlX2V4dCwKKwkJCSAgJ2NvcHktcmVtb3RlfHJlbW90ZT1zJyA9PiBcJF9jcF9yZW1vdGUsCisJCQkgICd1cGdyYWRlJyA9PiBcJF91cGdyYWRlIH0gXSwKKwknZ3JhZnQtYnJhbmNoZXMnID0+IFsgXCZncmFmdF9icmFuY2hlcywKKwkJCSdEZXRlY3QgbWVyZ2VzL2JyYW5jaGVzIGZyb20gYWxyZWFkeSBpbXBvcnRlZCBoaXN0b3J5JywKKwkJCXsgJ21lcmdlLXJ4fG0nID0+IFxAX29wdF9tLAorCQkJICAnYnJhbmNofGI9cycgPT4gXEBfYnJhbmNoX2Zyb20sCisJCQkgICdicmFuY2gtYWxsLXJlZnN8QicgPT4gXCRfYnJhbmNoX2FsbF9yZWZzLAorCQkJICAnbm8tZGVmYXVsdC1yZWdleCcgPT4gXCRfbm9fZGVmYXVsdF9yZWdleCwKKwkJCSAgJ25vLWdyYWZ0LWNvcHknID0+IFwkX25vX2dyYWZ0X2NvcHkgfSBdLAorCSdtdWx0aS1pbml0JyA9PiBbIFwmbXVsdGlfaW5pdCwKKwkJCSdJbml0aWFsaXplIG11bHRpcGxlIHRyZWVzIChsaWtlIGdpdC1zdm5pbXBvcnQpJywKKwkJCXsgJW11bHRpX29wdHMsICVmY19vcHRzIH0gXSwKKwknbXVsdGktZmV0Y2gnID0+IFsgXCZtdWx0aV9mZXRjaCwKKwkJCSdGZXRjaCBtdWx0aXBsZSB0cmVlcyAobGlrZSBnaXQtc3ZuaW1wb3J0KScsCisJCQlcJWZjX29wdHMgXSwKKwknbG9nJyA9PiBbIFwmc2hvd19sb2csICdTaG93IGNvbW1pdCBsb2dzJywKKwkJCXsgJ2xpbWl0PWknID0+IFwkX2xpbWl0LAorCQkJICAncmV2aXNpb258cj1zJyA9PiBcJF9yZXZpc2lvbiwKKwkJCSAgJ3ZlcmJvc2V8dicgPT4gXCRfdmVyYm9zZSwKKwkJCSAgJ2luY3JlbWVudGFsJyA9PiBcJF9pbmNyZW1lbnRhbCwKKwkJCSAgJ29uZWxpbmUnID0+IFwkX29uZWxpbmUsCisJCQkgICdzaG93LWNvbW1pdCcgPT4gXCRfc2hvd19jb21taXQsCisJCQkgICdhdXRob3JzLWZpbGV8QT1zJyA9PiBcJF9hdXRob3JzLAorCQkJfSBdLAorCSdjb21taXQtZGlmZicgPT4gWyBcJmNvbW1pdF9kaWZmLCAnQ29tbWl0IGEgZGlmZiBiZXR3ZWVuIHR3byB0cmVlcycsCisJCQl7ICdtZXNzYWdlfG09cycgPT4gXCRfbWVzc2FnZSwKKwkJCSAgJ2ZpbGV8Rj1zJyA9PiBcJF9maWxlLAorCQkJJWNtdF9vcHRzIH0gXSwKKyk7CisKK215ICRjbWQ7Citmb3IgKG15ICRpID0gMDsgJGkgPCBAQVJHVjsgJGkrKykgeworCWlmIChkZWZpbmVkICRjbWR7JEFSR1ZbJGldfSkgeworCQkkY21kID0gJEFSR1ZbJGldOworCQlzcGxpY2UgQEFSR1YsICRpLCAxOworCQlsYXN0OworCX0KK307CisKK215ICVvcHRzID0gJXskY21keyRjbWR9LT5bMl19IGlmIChkZWZpbmVkICRjbWQpOworCityZWFkX3JlcG9fY29uZmlnKFwlb3B0cyk7CitteSAkcnYgPSBHZXRPcHRpb25zKCVvcHRzLCAnaGVscHxIfGgnID0+IFwkX2hlbHAsCisJCQkJJ3ZlcnNpb258VicgPT4gXCRfdmVyc2lvbiwKKwkJCQknaWR8aT1zJyA9PiBcJEdJVF9TVk4pOworZXhpdCAxIGlmICghJHJ2ICYmICRjbWQgbmUgJ2xvZycpOworCitzZXRfZGVmYXVsdF92YWxzKCk7Cit1c2FnZSgwKSBpZiAkX2hlbHA7Cit2ZXJzaW9uKCkgaWYgJF92ZXJzaW9uOwordXNhZ2UoMSkgdW5sZXNzIGRlZmluZWQgJGNtZDsKK2luaXRfdmFycygpOworbG9hZF9hdXRob3JzKCkgaWYgJF9hdXRob3JzOworbG9hZF9hbGxfcmVmcygpIGlmICRfYnJhbmNoX2FsbF9yZWZzOworc3ZuX2NvbXBhdF9jaGVjaygpIHVubGVzcyAkX3VzZV9saWI7CittaWdyYXRpb25fY2hlY2soKSB1bmxlc3MgJGNtZCA9fiAvXig/OmluaXR8cmVidWlsZHxtdWx0aS1pbml0fGNvbW1pdC1kaWZmKSQvOworJGNtZHskY21kfS0+WzBdLT4oQEFSR1YpOworZXhpdCAwOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBwcmltYXJ5IGZ1bmN0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgdXNhZ2UgeworCW15ICRleGl0ID0gc2hpZnQgfHwgMDsKKwlteSAkZmQgPSAkZXhpdCA/IFwqU1RERVJSIDogXCpTVERPVVQ7CisJcHJpbnQgJGZkIDw8IiI7CitnaXQtc3ZuIC0gYmlkaXJlY3Rpb25hbCBvcGVyYXRpb25zIGJldHdlZW4gYSBzaW5nbGUgU3VidmVyc2lvbiB0cmVlIGFuZCBnaXQKK1VzYWdlOiAkMCA8Y29tbWFuZD4gW29wdGlvbnNdIFthcmd1bWVudHNdXG4KKworCXByaW50ICRmZCAiQXZhaWxhYmxlIGNvbW1hbmRzOlxuIiB1bmxlc3MgJGNtZDsKKworCWZvcmVhY2ggKHNvcnQga2V5cyAlY21kKSB7CisJCW5leHQgaWYgJGNtZCAmJiAkY21kIG5lICRfOworCQlwcmludCAkZmQgJyAgJyxwYWNrKCdBMTMnLCRfKSwkY21keyRffS0+WzFdLCJcbiI7CisJCWZvcmVhY2ggKGtleXMgJXskY21keyRffS0+WzJdfSkgeworCQkJIyBwcmludHMgb3V0IGFyZ3VtZW50cyBhcyB0aGV5IHNob3VsZCBiZSBwYXNzZWQ6CisJCQlteSAkeCA9IHMjWzo9XXMkIyMgPyAnPGFyZz4nIDogcyNbOj1daSQjIyA/ICc8bnVtPicgOiAnJzsKKwkJCXByaW50ICRmZCAnICcgeCAxNywgam9pbignLCAnLCBtYXAgeyBsZW5ndGggJF8gPiAxID8KKwkJCQkJCQkiLS0kXyIgOiAiLSRfIiB9CisJCQkJCQlzcGxpdCAvXHwvLCRfKSwiICR4XG4iOworCQl9CisJfQorCXByaW50ICRmZCA8PCIiOworXG5HSVRfU1ZOX0lEIG1heSBiZSBzZXQgaW4gdGhlIGVudmlyb25tZW50IG9yIHZpYSB0aGUgLS1pZC8taSBzd2l0Y2ggdG8gYW4KK2FyYml0cmFyeSBpZGVudGlmaWVyIGlmIHlvdSdyZSB0cmFja2luZyBtdWx0aXBsZSBTVk4gYnJhbmNoZXMvcmVwb3NpdG9yaWVzIGluCitvbmUgZ2l0IHJlcG9zaXRvcnkgYW5kIHdhbnQgdG8ga2VlcCB0aGVtIHNlcGFyYXRlLiAgU2VlIGdpdC1zdm4oMSkgZm9yIG1vcmUKK2luZm9ybWF0aW9uLgorCisJZXhpdCAkZXhpdDsKK30KKworc3ViIHZlcnNpb24geworCXByaW50ICJnaXQtc3ZuIHZlcnNpb24gJFZFUlNJT05cbiI7CisJZXhpdCAwOworfQorCitzdWIgcmVidWlsZCB7CisJaWYgKHF1aWV0X3J1bihxdy9naXQtcmV2LXBhcnNlIC0tdmVyaWZ5LywicmVmcy9yZW1vdGVzLyRHSVRfU1ZOXjAiKSkgeworCQljb3B5X3JlbW90ZV9yZWYoKTsKKwl9CisJJFNWTl9VUkwgPSBzaGlmdCBvciB1bmRlZjsKKwlteSAkbmV3ZXN0X3JldiA9IDA7CisJaWYgKCRfdXBncmFkZSkgeworCQlzeXMoJ2dpdC11cGRhdGUtcmVmJywicmVmcy9yZW1vdGVzLyRHSVRfU1ZOIiwiJEdJVF9TVk4tSEVBRCIpOworCX0gZWxzZSB7CisJCWNoZWNrX3VwZ3JhZGVfbmVlZGVkKCk7CisJfQorCisJbXkgJHBpZCA9IG9wZW4obXkgJHJldl9saXN0LCctfCcpOworCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwlpZiAoJHBpZCA9PSAwKSB7CisJCWV4ZWMoImdpdC1yZXYtbGlzdCIsInJlZnMvcmVtb3Rlcy8kR0lUX1NWTiIpIG9yIGNyb2FrICQhOworCX0KKwlteSAkbGF0ZXN0OworCXdoaWxlICg8JHJldl9saXN0PikgeworCQljaG9tcDsKKwkJbXkgJGMgPSAkXzsKKwkJY3JvYWsgIk5vbi1TSEExOiAkY1xuIiB1bmxlc3MgJGMgPX4gL14kc2hhMSQvbzsKKwkJbXkgQGNvbW1pdCA9IGdyZXAoL15naXQtc3ZuLWlkOiAvLGBnaXQtY2F0LWZpbGUgY29tbWl0ICRjYCk7CisJCW5leHQgaWYgKCFAY29tbWl0KTsgIyBza2lwIG1lcmdlcworCQlteSAoJHVybCwgJHJldiwgJHV1aWQpID0gZXh0cmFjdF9tZXRhZGF0YSgkY29tbWl0WyQjY29tbWl0XSk7CisJCWlmICghJHJldiB8fCAhJHV1aWQpIHsKKwkJCWNyb2FrICJVbmFibGUgdG8gZXh0cmFjdCByZXZpc2lvbiBvciBVVUlEIGZyb20gIiwKKwkJCQkiJGMsICRjb21taXRbJCNjb21taXRdXG4iOworCQl9CisKKwkJIyBpZiB3ZSBtZXJnZWQgb3Igb3RoZXJ3aXNlIHN0YXJ0ZWQgZWxzZXdoZXJlLCB0aGlzIGlzCisJCSMgaG93IHdlIGJyZWFrIG91dCBvZiBpdAorCQluZXh0IGlmIChkZWZpbmVkICRTVk5fVVVJRCAmJiAoJHV1aWQgbmUgJFNWTl9VVUlEKSk7CisJCW5leHQgaWYgKGRlZmluZWQgJFNWTl9VUkwgJiYgZGVmaW5lZCAkdXJsICYmICgkdXJsIG5lICRTVk5fVVJMKSk7CisKKwkJdW5sZXNzIChkZWZpbmVkICRsYXRlc3QpIHsKKwkJCWlmICghJFNWTl9VUkwgJiYgISR1cmwpIHsKKwkJCQljcm9hayAiU1ZOIHJlcG9zaXRvcnkgbG9jYXRpb24gcmVxdWlyZWQ6ICR1cmxcbiI7CisJCQl9CisJCQkkU1ZOX1VSTCB8fD0gJHVybDsKKwkJCSRTVk5fVVVJRCB8fD0gJHV1aWQ7CisJCQlzZXR1cF9naXRfc3ZuKCk7CisJCQkkbGF0ZXN0ID0gJHJldjsKKwkJfQorCQlyZXZkYl9zZXQoJFJFVkRCLCAkcmV2LCAkYyk7CisJCXByaW50ICJyJHJldiA9ICRjXG4iOworCQkkbmV3ZXN0X3JldiA9ICRyZXYgaWYgKCRyZXYgPiAkbmV3ZXN0X3Jldik7CisJfQorCWNsb3NlICRyZXZfbGlzdCBvciBjcm9hayAkPzsKKworCWdvdG8gb3V0IGlmICRfdXNlX2xpYjsKKwlpZiAoIWNoZGlyICRTVk5fV0MpIHsKKwkJc3ZuX2NtZF9jaGVja291dCgkU1ZOX1VSTCwgJGxhdGVzdCwgJFNWTl9XQyk7CisJCWNoZGlyICRTVk5fV0Mgb3IgY3JvYWsgJCE7CisJfQorCisJJHBpZCA9IGZvcms7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCWlmICgkcGlkID09IDApIHsKKwkJbXkgQHN2bl91cCA9IHF3KHN2biB1cCk7CisJCXB1c2ggQHN2bl91cCwgJy0taWdub3JlLWV4dGVybmFscycgdW5sZXNzICRfbm9faWdub3JlX2V4dDsKKwkJc3lzKEBzdm5fdXAsIi1yJG5ld2VzdF9yZXYiKTsKKwkJJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkR0lUX1NWTl9JTkRFWDsKKwkJaW5kZXhfY2hhbmdlcygpOworCQlleGVjKCdnaXQtd3JpdGUtdHJlZScpIG9yIGNyb2FrICQhOworCX0KKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgJD8gaWYgJD87CitvdXQ6CisJaWYgKCRfdXBncmFkZSkgeworCQlwcmludCBTVERFUlIgPDwiIjsKK0tlZXBpbmcgZGVwcmVjYXRlZCByZWZzL2hlYWQvJEdJVF9TVk4tSEVBRCBmb3Igbm93LiAgUGxlYXNlIHJlbW92ZSBpdAord2hlbiB5b3UgaGF2ZSB1cGdyYWRlZCB5b3VyIHRvb2xzIGFuZCBoYWJpdHMgdG8gdXNlIHJlZnMvcmVtb3Rlcy8kR0lUX1NWTgorCisJfQorfQorCitzdWIgaW5pdCB7CisJbXkgJHVybCA9IHNoaWZ0IG9yIGRpZSAiU1ZOIHJlcG9zaXRvcnkgbG9jYXRpb24gcmVxdWlyZWQgIiAuCisJCQkJImFzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50XG4iOworCSR1cmwgPX4gcyEvKyQhITsgIyBzdHJpcCB0cmFpbGluZyBzbGFzaAorCisJaWYgKG15ICRyZXBvX3BhdGggPSBzaGlmdCkgeworCQl1bmxlc3MgKC1kICRyZXBvX3BhdGgpIHsKKwkJCW1rcGF0aChbJHJlcG9fcGF0aF0pOworCQl9CisJCSRHSVRfRElSID0gJEVOVntHSVRfRElSfSA9ICRyZXBvX3BhdGggLiAiLy5naXQiOworCQlpbml0X3ZhcnMoKTsKKwl9CisKKwkkU1ZOX1VSTCA9ICR1cmw7CisJdW5sZXNzICgtZCAkR0lUX0RJUikgeworCQlteSBAaW5pdF9kYiA9ICgnZ2l0LWluaXQtZGInKTsKKwkJcHVzaCBAaW5pdF9kYiwgIi0tdGVtcGxhdGU9JF90ZW1wbGF0ZSIgaWYgZGVmaW5lZCAkX3RlbXBsYXRlOworCQlwdXNoIEBpbml0X2RiLCAiLS1zaGFyZWQiIGlmIGRlZmluZWQgJF9zaGFyZWQ7CisJCXN5cyhAaW5pdF9kYik7CisJfQorCXNldHVwX2dpdF9zdm4oKTsKK30KKworc3ViIGZldGNoIHsKKwljaGVja191cGdyYWRlX25lZWRlZCgpOworCSRTVk5fVVJMIHx8PSBmaWxlX3RvX3MoIiRHSVRfU1ZOX0RJUi9pbmZvL3VybCIpOworCW15ICRyZXQgPSAkX3VzZV9saWIgPyBmZXRjaF9saWIoQF8pIDogZmV0Y2hfY21kKEBfKTsKKwlpZiAoJHJldC0+e2NvbW1pdH0gJiYgcXVpZXRfcnVuKHF3KGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkKKwkJCQkJCXJlZnMvaGVhZHMvbWFzdGVyXjApKSkgeworCQlzeXMocXcoZ2l0LXVwZGF0ZS1yZWYgcmVmcy9oZWFkcy9tYXN0ZXIpLCRyZXQtPntjb21taXR9KTsKKwl9CisJcmV0dXJuICRyZXQ7Cit9CisKK3N1YiBmZXRjaF9jbWQgeworCW15IChAcGFyZW50cykgPSBAXzsKKwlteSBAbG9nX2FyZ3MgPSAtZCAkU1ZOX1dDID8gKCRTVk5fV0MpIDogKCRTVk5fVVJMKTsKKwl1bmxlc3MgKCRfcmV2aXNpb24pIHsKKwkJJF9yZXZpc2lvbiA9IC1kICRTVk5fV0MgPyAnQkFTRTpIRUFEJyA6ICcwOkhFQUQnOworCX0KKwlwdXNoIEBsb2dfYXJncywgIi1yJF9yZXZpc2lvbiI7CisJcHVzaCBAbG9nX2FyZ3MsICctLXN0b3Atb24tY29weScgdW5sZXNzICRfbm9fc3RvcF9jb3B5OworCisJbXkgJHN2bl9sb2cgPSBzdm5fbG9nX3JhdyhAbG9nX2FyZ3MpOworCisJbXkgJGJhc2UgPSBuZXh0X2xvZ19lbnRyeSgkc3ZuX2xvZykgb3IgY3JvYWsgIk5vIGJhc2UgcmV2aXNpb24hXG4iOworCSMgZG9uJ3QgbmVlZCBsYXN0X3JldmlzaW9uIGZyb20gZ3JhYl9iYXNlX3JldigpIGJlY2F1c2UKKwkjIHVzZXIgY291bGQndmUgc3BlY2lmaWVkIGEgZGlmZmVyZW50IHJldmlzaW9uIHRvIHNraXAgKHRoZXkKKwkjIGRpZG4ndCB3YW50IHRvIGltcG9ydCBjZXJ0YWluIHJldmlzaW9ucyBpbnRvIGdpdCBmb3Igd2hhdGV2ZXIKKwkjIHJlYXNvbiwgc28gdHJ1c3QgJGJhc2UtPntyZXZpc2lvbn0gaW5zdGVhZC4KKwlteSAodW5kZWYsICRsYXN0X2NvbW1pdCkgPSBzdm5fZ3JhYl9iYXNlX3JldigpOworCXVubGVzcyAoLWQgJFNWTl9XQykgeworCQlzdm5fY21kX2NoZWNrb3V0KCRTVk5fVVJMLCRiYXNlLT57cmV2aXNpb259LCRTVk5fV0MpOworCQljaGRpciAkU1ZOX1dDIG9yIGNyb2FrICQhOworCQlyZWFkX3V1aWQoKTsKKwkJJGxhc3RfY29tbWl0ID0gZ2l0X2NvbW1pdCgkYmFzZSwgQHBhcmVudHMpOworCQlhc3NlcnRfdHJlZSgkbGFzdF9jb21taXQpOworCX0gZWxzZSB7CisJCWNoZGlyICRTVk5fV0Mgb3IgY3JvYWsgJCE7CisJCXJlYWRfdXVpZCgpOworCQkjIGxvb2tzIGxpa2UgYSB1c2VyIG1hbnVhbGx5IGNwJ2QgYW5kIHN2biBzd2l0Y2gnZWQKKwkJdW5sZXNzICgkbGFzdF9jb21taXQpIHsKKwkJCXN5cyhxdy9zdm4gcmV2ZXJ0IC1SIC4vKTsKKwkJCWFzc2VydF9zdm5fd2NfY2xlYW4oJGJhc2UtPntyZXZpc2lvbn0pOworCQkJJGxhc3RfY29tbWl0ID0gZ2l0X2NvbW1pdCgkYmFzZSwgQHBhcmVudHMpOworCQkJYXNzZXJ0X3RyZWUoJGxhc3RfY29tbWl0KTsKKwkJfQorCX0KKwlteSBAc3ZuX3VwID0gcXcoc3ZuIHVwKTsKKwlwdXNoIEBzdm5fdXAsICctLWlnbm9yZS1leHRlcm5hbHMnIHVubGVzcyAkX25vX2lnbm9yZV9leHQ7CisJbXkgJGxhc3QgPSAkYmFzZTsKKwl3aGlsZSAobXkgJGxvZ19tc2cgPSBuZXh0X2xvZ19lbnRyeSgkc3ZuX2xvZykpIHsKKwkJaWYgKCRsYXN0LT57cmV2aXNpb259ID49ICRsb2dfbXNnLT57cmV2aXNpb259KSB7CisJCQljcm9hayAiT3V0IG9mIG9yZGVyOiBsYXN0ID49IGN1cnJlbnQ6ICIsCisJCQkJIiRsYXN0LT57cmV2aXNpb259ID49ICRsb2dfbXNnLT57cmV2aXNpb259XG4iOworCQl9CisJCSMgUmV2ZXJ0IGlzIG5lZWRlZCBmb3IgY2FzZXMgbGlrZToKKwkJIyBodHRwczovL3N2bi5tdXNpY3BkLm9yZy9KYW1taW5nL3RydW5rIChyMTY2OjE2NyksIGJ1dAorCQkjIEkgY2FuJ3Qgc2VlbSB0byByZXByb2R1Y2Ugc29tZXRoaW5nIGxpa2UgdGhhdCBvbiBhIHRlc3QuLi4KKwkJc3lzKHF3L3N2biByZXZlcnQgLVIgLi8pOworCQlhc3NlcnRfc3ZuX3djX2NsZWFuKCRsYXN0LT57cmV2aXNpb259KTsKKwkJc3lzKEBzdm5fdXAsIi1yJGxvZ19tc2ctPntyZXZpc2lvbn0iKTsKKwkJJGxhc3RfY29tbWl0ID0gZ2l0X2NvbW1pdCgkbG9nX21zZywgJGxhc3RfY29tbWl0LCBAcGFyZW50cyk7CisJCSRsYXN0ID0gJGxvZ19tc2c7CisJfQorCWNsb3NlICRzdm5fbG9nLT57Zmh9OworCSRsYXN0LT57Y29tbWl0fSA9ICRsYXN0X2NvbW1pdDsKKwlyZXR1cm4gJGxhc3Q7Cit9CisKK3N1YiBmZXRjaF9saWIgeworCW15IChAcGFyZW50cykgPSBAXzsKKwkkU1ZOX1VSTCB8fD0gZmlsZV90b19zKCIkR0lUX1NWTl9ESVIvaW5mby91cmwiKTsKKwlteSAkcmVwbzsKKwkoJHJlcG8sICRTVk5fUEFUSCkgPSByZXBvX3BhdGhfc3BsaXQoJFNWTl9VUkwpOworCSRTVk5fTE9HIHx8PSBsaWJzdm5fY29ubmVjdCgkcmVwbyk7CisJJFNWTiB8fD0gbGlic3ZuX2Nvbm5lY3QoJHJlcG8pOworCW15ICgkbGFzdF9yZXYsICRsYXN0X2NvbW1pdCkgPSBzdm5fZ3JhYl9iYXNlX3JldigpOworCW15ICgkYmFzZSwgJGhlYWQpID0gbGlic3ZuX3BhcnNlX3JldmlzaW9uKCRsYXN0X3Jldik7CisJaWYgKCRiYXNlID4gJGhlYWQpIHsKKwkJcmV0dXJuIHsgcmV2aXNpb24gPT4gJGxhc3RfcmV2LCBjb21taXQgPT4gJGxhc3RfY29tbWl0IH0KKwl9CisJbXkgJGluZGV4ID0gc2V0X2luZGV4KCRHSVRfU1ZOX0lOREVYKTsKKworCSMgbGltaXQgb3Vyc2VsdmVzIGFuZCBhbHNvIGZvcmsoKSBzaW5jZSBnZXRfbG9nIHdvbid0IHJlbGVhc2UgbWVtb3J5CisJIyBhZnRlciBwcm9jZXNzaW5nIGEgcmV2aXNpb24gYW5kIFNWTiBzdHVmZiBzZWVtcyB0byBsZWFrCisJbXkgJGluYyA9IDEwMDA7CisJbXkgKCRtaW4sICRtYXgpID0gKCRiYXNlLCAkaGVhZCA8ICRiYXNlKyRpbmMgPyAkaGVhZCA6ICRiYXNlKyRpbmMpOworCXJlYWRfdXVpZCgpOworCWlmIChkZWZpbmVkICRsYXN0X2NvbW1pdCkgeworCQl1bmxlc3MgKC1lICRHSVRfU1ZOX0lOREVYKSB7CisJCQlzeXMocXcvZ2l0LXJlYWQtdHJlZS8sICRsYXN0X2NvbW1pdCk7CisJCX0KKwkJY2hvbXAgKG15ICR4ID0gYGdpdC13cml0ZS10cmVlYCk7CisJCW15ICgkeSkgPSAoYGdpdC1jYXQtZmlsZSBjb21taXQgJGxhc3RfY29tbWl0YAorCQkJCQkJCT1+IC9edHJlZSAoJHNoYTEpL20pOworCQlpZiAoJHkgbmUgJHgpIHsKKwkJCXVubGluayAkR0lUX1NWTl9JTkRFWCBvciBjcm9hayAkITsKKwkJCXN5cyhxdy9naXQtcmVhZC10cmVlLywgJGxhc3RfY29tbWl0KTsKKwkJfQorCQljaG9tcCAoJHggPSBgZ2l0LXdyaXRlLXRyZWVgKTsKKwkJaWYgKCR5IG5lICR4KSB7CisJCQlwcmludCBTVERFUlIgInRyZWVzICgkbGFzdF9jb21taXQpICR5ICE9ICR4XG4iLAorCQkJCSAiU29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZy4uLlxuIjsKKwkJfQorCX0KKwl3aGlsZSAoMSkgeworCQkjIGZvcmssIGJlY2F1c2UgdXNpbmcgU1ZOOjpQb29sIHdpdGggZ2V0X2xvZygpIHN0aWxsIGRvZXNuJ3QKKwkJIyBzZWVtIHRvIGhlbHAgZW5vdWdoIHRvIGtlZXAgbWVtb3J5IHVzYWdlIGRvd24uCisJCWRlZmluZWQobXkgJHBpZCA9IGZvcmspIG9yIGNyb2FrICQhOworCQlpZiAoISRwaWQpIHsKKwkJCSRTVk46OkVycm9yOjpoYW5kbGVyID0gXCZsaWJzdm5fc2tpcF91bmtub3duX3JldnM7CisKKwkJCSMgWWVzIEknbSBwZXJmZWN0bHkgYXdhcmUgdGhhdCB0aGUgZm91cnRoIGFyZ3VtZW50CisJCQkjIGJlbG93IGlzIHRoZSBsaW1pdCByZXZpc2lvbnMgbnVtYmVyLiAgVW5mb3J0dW5hdGVseQorCQkJIyBwZXJmb3JtYW5jZSBzdWNrcyB3aXRoIGl0IGVuYWJsZWQsIHNvIGl0J3MgbXVjaAorCQkJIyBmYXN0ZXIgdG8gZmV0Y2ggcmV2aXNpb24gcmFuZ2VzIGluc3RlYWQgb2YgcmVseWluZworCQkJIyBvbiB0aGUgbGltaXRlci4KKwkJCWxpYnN2bl9nZXRfbG9nKCRTVk5fTE9HLCAnLycuJFNWTl9QQVRILAorCQkJCQkkbWluLCAkbWF4LCAwLCAxLCAxLAorCQkJCXN1YiB7CisJCQkJCW15ICRsb2dfbXNnOworCQkJCQlpZiAoJGxhc3RfY29tbWl0KSB7CisJCQkJCQkkbG9nX21zZyA9IGxpYnN2bl9mZXRjaCgKKwkJCQkJCQkkbGFzdF9jb21taXQsIEBfKTsKKwkJCQkJCSRsYXN0X2NvbW1pdCA9IGdpdF9jb21taXQoCisJCQkJCQkJJGxvZ19tc2csCisJCQkJCQkJJGxhc3RfY29tbWl0LAorCQkJCQkJCUBwYXJlbnRzKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSRsb2dfbXNnID0gbGlic3ZuX25ld190cmVlKEBfKTsKKwkJCQkJCSRsYXN0X2NvbW1pdCA9IGdpdF9jb21taXQoCisJCQkJCQkJJGxvZ19tc2csIEBwYXJlbnRzKTsKKwkJCQkJfQorCQkJCX0pOworCQkJZXhpdCAwOworCQl9CisJCXdhaXRwaWQgJHBpZCwgMDsKKwkJY3JvYWsgJD8gaWYgJD87CisJCSgkbGFzdF9yZXYsICRsYXN0X2NvbW1pdCkgPSBzdm5fZ3JhYl9iYXNlX3JldigpOworCQlsYXN0IGlmICgkbWF4ID49ICRoZWFkKTsKKwkJJG1pbiA9ICRtYXggKyAxOworCQkkbWF4ICs9ICRpbmM7CisJCSRtYXggPSAkaGVhZCBpZiAoJG1heCA+ICRoZWFkKTsKKwl9CisJcmVzdG9yZV9pbmRleCgkaW5kZXgpOworCXJldHVybiB7IHJldmlzaW9uID0+ICRsYXN0X3JldiwgY29tbWl0ID0+ICRsYXN0X2NvbW1pdCB9OworfQorCitzdWIgY29tbWl0IHsKKwlteSAoQGNvbW1pdHMpID0gQF87CisJY2hlY2tfdXBncmFkZV9uZWVkZWQoKTsKKwlpZiAoJF9zdGRpbiB8fCAhQGNvbW1pdHMpIHsKKwkJcHJpbnQgIlJlYWRpbmcgZnJvbSBzdGRpbi4uLlxuIjsKKwkJQGNvbW1pdHMgPSAoKTsKKwkJd2hpbGUgKDxTVERJTj4pIHsKKwkJCWlmICgvXGIoJHNoYTFfc2hvcnQpXGIvbykgeworCQkJCXVuc2hpZnQgQGNvbW1pdHMsICQxOworCQkJfQorCQl9CisJfQorCW15IEByZXZzOworCWZvcmVhY2ggbXkgJGMgKEBjb21taXRzKSB7CisJCWNob21wKG15IEB0bXAgPSBzYWZlX3F4KCdnaXQtcmV2LXBhcnNlJywkYykpOworCQlpZiAoc2NhbGFyIEB0bXAgPT0gMSkgeworCQkJcHVzaCBAcmV2cywgJHRtcFswXTsKKwkJfSBlbHNpZiAoc2NhbGFyIEB0bXAgPiAxKSB7CisJCQlwdXNoIEByZXZzLCByZXZlcnNlIChzYWZlX3F4KCdnaXQtcmV2LWxpc3QnLEB0bXApKTsKKwkJfSBlbHNlIHsKKwkJCWRpZSAiRmFpbGVkIHRvIHJldi1wYXJzZSAkY1xuIjsKKwkJfQorCX0KKwljaG9tcCBAcmV2czsKKwkkX3VzZV9saWIgPyBjb21taXRfbGliKEByZXZzKSA6IGNvbW1pdF9jbWQoQHJldnMpOworCXByaW50ICJEb25lIGNvbW1pdHRpbmcgIixzY2FsYXIgQHJldnMsIiByZXZpc2lvbnMgdG8gU1ZOXG4iOworfQorCitzdWIgY29tbWl0X2NtZCB7CisJbXkgKEByZXZzKSA9IEBfOworCisJY2hkaXIgJFNWTl9XQyBvciBjcm9hayAiVW5hYmxlIHRvIGNoZGlyICRTVk5fV0M6ICQhXG4iOworCW15ICRpbmZvID0gc3ZuX2luZm8oJy4nKTsKKwlteSAkZmV0Y2hlZCA9IGZldGNoKCk7CisJaWYgKCRpbmZvLT57UmV2aXNpb259ICE9ICRmZXRjaGVkLT57cmV2aXNpb259KSB7CisJCXByaW50IFNUREVSUiAiVGhlcmUgYXJlIG5ldyByZXZpc2lvbnMgdGhhdCB3ZXJlIGZldGNoZWQgIiwKKwkJCQkiYW5kIG5lZWQgdG8gYmUgbWVyZ2VkIChvciBhY2tub3dsZWRnZWQpICIsCisJCQkJImJlZm9yZSBjb21taXR0aW5nLlxuIjsKKwkJZXhpdCAxOworCX0KKwkkaW5mbyA9IHN2bl9pbmZvKCcuJyk7CisJcmVhZF91dWlkKCRpbmZvKTsKKwlteSAkbGFzdCA9ICRmZXRjaGVkOworCWZvcmVhY2ggbXkgJGMgKEByZXZzKSB7CisJCW15ICRtb2RzID0gc3ZuX2NoZWNrb3V0X3RyZWUoJGxhc3QsICRjKTsKKwkJaWYgKHNjYWxhciBAJG1vZHMgPT0gMCkgeworCQkJcHJpbnQgIlNraXBwaW5nLCBubyBjaGFuZ2VzIGRldGVjdGVkXG4iOworCQkJbmV4dDsKKwkJfQorCQkkbGFzdCA9IHN2bl9jb21taXRfdHJlZSgkbGFzdCwgJGMpOworCX0KK30KKworc3ViIGNvbW1pdF9saWIgeworCW15IChAcmV2cykgPSBAXzsKKwlteSAoJHJfbGFzdCwgJGNtdF9sYXN0KSA9IHN2bl9ncmFiX2Jhc2VfcmV2KCk7CisJZGVmaW5lZCAkcl9sYXN0IG9yIGRpZSAiTXVzdCBoYXZlIGFuIGV4aXN0aW5nIHJldmlzaW9uIHRvIGNvbW1pdFxuIjsKKwlteSAkZmV0Y2hlZCA9IGZldGNoKCk7CisJaWYgKCRyX2xhc3QgIT0gJGZldGNoZWQtPntyZXZpc2lvbn0pIHsKKwkJcHJpbnQgU1RERVJSICJUaGVyZSBhcmUgbmV3IHJldmlzaW9ucyB0aGF0IHdlcmUgZmV0Y2hlZCAiLAorCQkJCSJhbmQgbmVlZCB0byBiZSBtZXJnZWQgKG9yIGFja25vd2xlZGdlZCkgIiwKKwkJCQkiYmVmb3JlIGNvbW1pdHRpbmcuXG4iLAorCQkJCSJsYXN0IHJldjogJHJfbGFzdFxuIiwKKwkJCQkiIGN1cnJlbnQ6ICRmZXRjaGVkLT57cmV2aXNpb259XG4iOworCQlleGl0IDE7CisJfQorCXJlYWRfdXVpZCgpOworCW15IEBsb2NrID0gJFNWTjo6Q29yZTo6VkVSU0lPTiBnZSAnMS4yLjAnID8gKHVuZGVmLCAwKSA6ICgpOworCW15ICRjb21taXRfbXNnID0gIiRHSVRfU1ZOX0RJUi8uc3ZuLWNvbW1pdC50bXAuJCQiOworCisJc2V0X3N2bl9jb21taXRfZW52KCk7CisJZm9yZWFjaCBteSAkYyAoQHJldnMpIHsKKwkJbXkgJGxvZ19tc2cgPSBnZXRfY29tbWl0X21lc3NhZ2UoJGMsICRjb21taXRfbXNnKTsKKworCQkjIGZvcmsgZm9yIGVhY2ggY29tbWl0IGJlY2F1c2UgdGhlcmUncyBhIG1lbW9yeSBsZWFrIEkKKwkJIyBjYW4ndCB0cmFjayBkb3duLi4uIChpdCdzIHByb2JhYmx5IGluIHRoZSBTVk4gY29kZSkKKwkJZGVmaW5lZChteSAkcGlkID0gb3BlbiBteSAkZmgsICctfCcpIG9yIGNyb2FrICQhOworCQlpZiAoISRwaWQpIHsKKwkJCW15ICRlZCA9IFNWTjo6R2l0OjpFZGl0b3ItPm5ldygKKwkJCQkJewlyID0+ICRyX2xhc3QsCisJCQkJCQlyYSA9PiAkU1ZOLAorCQkJCQkJYyA9PiAkYywKKwkJCQkJCXN2bl9wYXRoID0+ICRTVk5fUEFUSAorCQkJCQl9LAorCQkJCQkkU1ZOLT5nZXRfY29tbWl0X2VkaXRvcigKKwkJCQkJCSRsb2dfbXNnLT57bXNnfSwKKwkJCQkJCXN1YiB7CisJCQkJCQkJbGlic3ZuX2NvbW1pdF9jYigKKwkJCQkJCQkJQF8sICRjLAorCQkJCQkJCQkkbG9nX21zZy0+e21zZ30sCisJCQkJCQkJCSRyX2xhc3QsCisJCQkJCQkJCSRjbXRfbGFzdCkKKwkJCQkJCX0sCisJCQkJCQlAbG9jaykKKwkJCQkJKTsKKwkJCW15ICRtb2RzID0gbGlic3ZuX2NoZWNrb3V0X3RyZWUoJGNtdF9sYXN0LCAkYywgJGVkKTsKKwkJCWlmIChAJG1vZHMgPT0gMCkgeworCQkJCXByaW50ICJObyBjaGFuZ2VzXG5yJHJfbGFzdCA9ICRjbXRfbGFzdFxuIjsKKwkJCQkkZWQtPmFib3J0X2VkaXQ7CisJCQl9IGVsc2UgeworCQkJCSRlZC0+Y2xvc2VfZWRpdDsKKwkJCX0KKwkJCWV4aXQgMDsKKwkJfQorCQlteSAoJHJfbmV3LCAkY210X25ldywgJG5vKTsKKwkJd2hpbGUgKDwkZmg+KSB7CisJCQlwcmludCAkXzsKKwkJCWNob21wOworCQkJaWYgKC9ecihcZCspID0gKCRzaGExKSQvbykgeworCQkJCSgkcl9uZXcsICRjbXRfbmV3KSA9ICgkMSwgJDIpOworCQkJfSBlbHNpZiAoJF8gZXEgJ05vIGNoYW5nZXMnKSB7CisJCQkJJG5vID0gMTsKKwkJCX0KKwkJfQorCQljbG9zZSAkZmggb3IgY3JvYWsgJD87CisJCWlmICghIGRlZmluZWQgJHJfbmV3ICYmICEgZGVmaW5lZCAkY210X25ldykgeworCQkJdW5sZXNzICgkbm8pIHsKKwkJCQlkaWUgIkZhaWxlZCB0byBwYXJzZSByZXZpc2lvbiBpbmZvcm1hdGlvblxuIjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSgkcl9sYXN0LCAkY210X2xhc3QpID0gKCRyX25ldywgJGNtdF9uZXcpOworCQl9CisJfQorCSRFTlZ7TENfQUxMfSA9ICdDJzsKKwl1bmxpbmsgJGNvbW1pdF9tc2c7Cit9CisKK3N1YiBzaG93X2lnbm9yZSB7CisJJFNWTl9VUkwgfHw9IGZpbGVfdG9fcygiJEdJVF9TVk5fRElSL2luZm8vdXJsIik7CisJJF91c2VfbGliID8gc2hvd19pZ25vcmVfbGliKCkgOiBzaG93X2lnbm9yZV9jbWQoKTsKK30KKworc3ViIHNob3dfaWdub3JlX2NtZCB7CisJcmVxdWlyZSBGaWxlOjpGaW5kIG9yIGRpZSAkITsKKwlpZiAoZGVmaW5lZCAkX3JldmlzaW9uKSB7CisJCWRpZSAiLXIvLS1yZXZpc2lvbiBvcHRpb24gZG9lc24ndCB3b3JrIHVubGVzcyB0aGUgUGVybCBTVk4gIiwKKwkJCSJsaWJyYXJpZXMgYXJlIHVzZWRcbiI7CisJfQorCWNoZGlyICRTVk5fV0Mgb3IgY3JvYWsgJCE7CisJbXkgJWlnbjsKKwlGaWxlOjpGaW5kOjpmaW5kKHt3YW50ZWQ9PnN1YntpZihsc3RhdCAkXyAmJiAtZCBfICYmIC1kICIkXy8uc3ZuIil7CisJCXMjXlwuLyMjOworCQlAeyRpZ257JF99fSA9IHN2bl9wcm9wZ2V0X2Jhc2UoJ3N2bjppZ25vcmUnLCAkXyk7CisJCX19LCBub19jaGRpcj0+MX0sJy4nKTsKKworCXByaW50ICJcbiMgL1xuIjsKKwlmb3JlYWNoIChAeyRpZ257Jy4nfX0pIHsgcHJpbnQgJy8nLCRfIGlmIC9cUy8gfQorCWRlbGV0ZSAkaWdueycuJ307CisJZm9yZWFjaCBteSAkaSAoc29ydCBrZXlzICVpZ24pIHsKKwkJcHJpbnQgIlxuIyAiLCRpLCJcbiI7CisJCWZvcmVhY2ggKEB7JGlnbnskaX19KSB7IHByaW50ICcvJywkaSwnLycsJF8gaWYgL1xTLyB9CisJfQorfQorCitzdWIgc2hvd19pZ25vcmVfbGliIHsKKwlteSAkcmVwbzsKKwkoJHJlcG8sICRTVk5fUEFUSCkgPSByZXBvX3BhdGhfc3BsaXQoJFNWTl9VUkwpOworCSRTVk4gfHw9IGxpYnN2bl9jb25uZWN0KCRyZXBvKTsKKwlteSAkciA9IGRlZmluZWQgJF9yZXZpc2lvbiA/ICRfcmV2aXNpb24gOiAkU1ZOLT5nZXRfbGF0ZXN0X3Jldm51bTsKKwlsaWJzdm5fdHJhdmVyc2VfaWdub3JlKFwqU1RET1VULCAkU1ZOX1BBVEgsICRyKTsKK30KKworc3ViIGdyYWZ0X2JyYW5jaGVzIHsKKwlteSAkZ3JfZmlsZSA9ICIkR0lUX0RJUi9pbmZvL2dyYWZ0cyI7CisJbXkgKCRncmFmdHMsICRjb21tZW50cykgPSByZWFkX2dyYWZ0cygkZ3JfZmlsZSk7CisJbXkgJGdyX3NoYTE7CisKKwlpZiAoJSRncmFmdHMpIHsKKwkJIyB0ZW1wb3JhcmlseSBkaXNhYmxlIG91ciBncmFmdHMgZmlsZSB0byBtYWtlIHRoaXMgaWRlbXBvdGVudAorCQljaG9tcCgkZ3Jfc2hhMSA9IHNhZmVfcXgocXcvZ2l0LWhhc2gtb2JqZWN0IC13LywkZ3JfZmlsZSkpOworCQlyZW5hbWUgJGdyX2ZpbGUsICIkZ3JfZmlsZX4kZ3Jfc2hhMSIgb3IgY3JvYWsgJCE7CisJfQorCisJbXkgJGxfbWFwID0gcmVhZF91cmxfcGF0aHMoKTsKKwlteSBAcmUgPSBtYXAgeyBxci8kXy9pcyB9IEBfb3B0X20gaWYgQF9vcHRfbTsKKwl1bmxlc3MgKCRfbm9fZGVmYXVsdF9yZWdleCkgeworCQlwdXNoIEByZSwgKHFyL1xiKD86bWVyZ2V8bWVyZ2luZ3xtZXJnZWQpXHMrd2l0aFxzKyhbXHdcLlwtXSspL2ksCisJCQlxci9cYig/Om1lcmdlfG1lcmdpbmd8bWVyZ2VkKVxzKyhbXHdcLlwtXSspL2ksCisJCQlxci9cYig/OmZyb218b2YpXHMrKFtcd1wuXC1dKykvaSApOworCX0KKwlmb3JlYWNoIG15ICR1IChrZXlzICUkbF9tYXApIHsKKwkJaWYgKEByZSkgeworCQkJZm9yZWFjaCBteSAkcCAoa2V5cyAleyRsX21hcC0+eyR1fX0pIHsKKwkJCQlncmFmdF9tZXJnZV9tc2coJGdyYWZ0cywkbF9tYXAsJHUsJHAsQHJlKTsKKwkJCX0KKwkJfQorCQl1bmxlc3MgKCRfbm9fZ3JhZnRfY29weSkgeworCQkJaWYgKCRfdXNlX2xpYikgeworCQkJCWdyYWZ0X2ZpbGVfY29weV9saWIoJGdyYWZ0cywkbF9tYXAsJHUpOworCQkJfSBlbHNlIHsKKwkJCQlncmFmdF9maWxlX2NvcHlfY21kKCRncmFmdHMsJGxfbWFwLCR1KTsKKwkJCX0KKwkJfQorCX0KKwlncmFmdF90cmVlX2pvaW5zKCRncmFmdHMpOworCisJd3JpdGVfZ3JhZnRzKCRncmFmdHMsICRjb21tZW50cywgJGdyX2ZpbGUpOworCXVubGluayAiJGdyX2ZpbGV+JGdyX3NoYTEiIGlmICRncl9zaGExOworfQorCitzdWIgbXVsdGlfaW5pdCB7CisJbXkgJHVybCA9IHNoaWZ0OworCSRfdHJ1bmsgfHw9ICd0cnVuayc7CisJJF90cnVuayA9fiBzIy8rJCMjOworCSR1cmwgPX4gcyMvKyQjIyBpZiAkdXJsOworCWlmICgkX3RydW5rICF+IG0jXlthLXpcK10rOi8vIykgeworCQkkX3RydW5rID0gJy8nIC4gJF90cnVuayBpZiAoJF90cnVuayAhfiBtI14vIyk7CisJCXVubGVzcyAoJHVybCkgeworCQkJcHJpbnQgU1RERVJSICJFOiAnJF90cnVuaycgaXMgbm90IGEgY29tcGxldGUgVVJMICIsCisJCQkJImFuZCBhIHNlcGFyYXRlIFVSTCBpcyBub3Qgc3BlY2lmaWVkXG4iOworCQkJZXhpdCAxOworCQl9CisJCSRfdHJ1bmsgPSAkdXJsIC4gJF90cnVuazsKKwl9CisJaWYgKCRHSVRfU1ZOIGVxICdnaXQtc3ZuJykgeworCQlwcmludCAiR0lUX1NWTl9JRCBzZXQgdG8gJ3RydW5rJyBmb3IgJF90cnVua1xuIjsKKwkJJEdJVF9TVk4gPSAkRU5We0dJVF9TVk5fSUR9ID0gJ3RydW5rJzsKKwl9CisJaW5pdF92YXJzKCk7CisJaW5pdCgkX3RydW5rKTsKKwljb21wbGV0ZV91cmxfbHNfaW5pdCgkdXJsLCAkX2JyYW5jaGVzLCAnLS1icmFuY2hlcy8tYicsICcnKTsKKwljb21wbGV0ZV91cmxfbHNfaW5pdCgkdXJsLCAkX3RhZ3MsICctLXRhZ3MvLXQnLCAndGFncy8nKTsKK30KKworc3ViIG11bHRpX2ZldGNoIHsKKwkjIHRyeSB0byBkbyB0cnVuayBmaXJzdCwgc2luY2UgYnJhbmNoZXMvdGFncworCSMgbWF5IGJlIGRlc2NlbmRlZCBmcm9tIGl0LgorCWlmICgtZSAiJEdJVF9ESVIvc3ZuL3RydW5rL2luZm8vdXJsIikgeworCQlmZXRjaF9jaGlsZF9pZCgndHJ1bmsnLCBAXyk7CisJfQorCXJlY19mZXRjaCgnJywgIiRHSVRfRElSL3N2biIsIEBfKTsKK30KKworc3ViIHNob3dfbG9nIHsKKwlteSAoQGFyZ3MpID0gQF87CisJbXkgKCRyX21pbiwgJHJfbWF4KTsKKwlteSAkcl9sYXN0ID0gLTE7ICMgcHJldmVudCBkdXBlcworCXJsb2FkX2F1dGhvcnMoKSBpZiAkX2F1dGhvcnM7CisJaWYgKGRlZmluZWQgJFRaKSB7CisJCSRFTlZ7VFp9ID0gJFRaOworCX0gZWxzZSB7CisJCWRlbGV0ZSAkRU5We1RafTsKKwl9CisJaWYgKGRlZmluZWQgJF9yZXZpc2lvbikgeworCQlpZiAoJF9yZXZpc2lvbiA9fiAvXihcZCspOihcZCspJC8pIHsKKwkJCSgkcl9taW4sICRyX21heCkgPSAoJDEsICQyKTsKKwkJfSBlbHNpZiAoJF9yZXZpc2lvbiA9fiAvXlxkKyQvKSB7CisJCQkkcl9taW4gPSAkcl9tYXggPSAkX3JldmlzaW9uOworCQl9IGVsc2UgeworCQkJcHJpbnQgU1RERVJSICItciRfcmV2aXNpb24gaXMgbm90IHN1cHBvcnRlZCwgdXNlICIsCisJCQkJInN0YW5kYXJkIFwnZ2l0IGxvZ1wnIGFyZ3VtZW50cyBpbnN0ZWFkXG4iOworCQkJZXhpdCAxOworCQl9CisJfQorCisJbXkgJHBpZCA9IG9wZW4obXkgJGxvZywnLXwnKTsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisJaWYgKCEkcGlkKSB7CisJCWV4ZWMoZ2l0X3N2bl9sb2dfY21kKCRyX21pbiwkcl9tYXgpLCBAYXJncykgb3IgY3JvYWsgJCE7CisJfQorCXNldHVwX3BhZ2VyKCk7CisJbXkgKEBrLCAkYywgJGQpOworCisJd2hpbGUgKDwkbG9nPikgeworCQlpZiAoL15jb21taXQgKCRzaGExX3Nob3J0KS9vKSB7CisJCQlteSAkY210ID0gJDE7CisJCQlpZiAoJGMgJiYgY210X3Nob3dhYmxlKCRjKSAmJiAkYy0+e3J9ICE9ICRyX2xhc3QpIHsKKwkJCQkkcl9sYXN0ID0gJGMtPntyfTsKKwkJCQlwcm9jZXNzX2NvbW1pdCgkYywgJHJfbWluLCAkcl9tYXgsIFxAaykgb3IKKwkJCQkJCQkJZ290byBvdXQ7CisJCQl9CisJCQkkZCA9IHVuZGVmOworCQkJJGMgPSB7IGMgPT4gJGNtdCB9OworCQl9IGVsc2lmICgvXmF1dGhvciAoLispIChcZCspIChbXC1cK10/XGQrKSQvKSB7CisJCQlnZXRfYXV0aG9yX2luZm8oJGMsICQxLCAkMiwgJDMpOworCQl9IGVsc2lmICgvXig/OnRyZWV8cGFyZW50fGNvbW1pdHRlcikgLykgeworCQkJIyBpZ25vcmUKKwkJfSBlbHNpZiAoL146XGR7Nn0gXGR7Nn0gJHNoYTFfc2hvcnQvbykgeworCQkJcHVzaCBAeyRjLT57cmF3fX0sICRfOworCQl9IGVsc2lmICgvXmRpZmYgLykgeworCQkJJGQgPSAxOworCQkJcHVzaCBAeyRjLT57ZGlmZn19LCAkXzsKKwkJfSBlbHNpZiAoJGQpIHsKKwkJCXB1c2ggQHskYy0+e2RpZmZ9fSwgJF87CisJCX0gZWxzaWYgKC9eICAgIChnaXQtc3ZuLWlkOi4rKSQvKSB7CisJCQkodW5kZWYsICRjLT57cn0sIHVuZGVmKSA9IGV4dHJhY3RfbWV0YWRhdGEoJDEpOworCQl9IGVsc2lmIChzL14gICAgLy8pIHsKKwkJCXB1c2ggQHskYy0+e2x9fSwgJF87CisJCX0KKwl9CisJaWYgKCRjICYmIGRlZmluZWQgJGMtPntyfSAmJiAkYy0+e3J9ICE9ICRyX2xhc3QpIHsKKwkJJHJfbGFzdCA9ICRjLT57cn07CisJCXByb2Nlc3NfY29tbWl0KCRjLCAkcl9taW4sICRyX21heCwgXEBrKTsKKwl9CisJaWYgKEBrKSB7CisJCW15ICRzd2FwID0gJHJfbWF4OworCQkkcl9tYXggPSAkcl9taW47CisJCSRyX21pbiA9ICRzd2FwOworCQlwcm9jZXNzX2NvbW1pdCgkXywgJHJfbWluLCAkcl9tYXgpIGZvcmVhY2ggcmV2ZXJzZSBAazsKKwl9CitvdXQ6CisJY2xvc2UgJGxvZzsKKwlwcmludCAnLScgeDcyLCJcbiIgdW5sZXNzICRfaW5jcmVtZW50YWwgfHwgJF9vbmVsaW5lOworfQorCitzdWIgY29tbWl0X2RpZmZfdXNhZ2UgeworCXByaW50IFNUREVSUiAiVXNhZ2U6ICQwIGNvbW1pdC1kaWZmIDx0cmVlLWlzaD4gPHRyZWUtaXNoPiBbPFVSTD5dXG4iOworCWV4aXQgMQorfQorCitzdWIgY29tbWl0X2RpZmYgeworCWlmICghJF91c2VfbGliKSB7CisJCXByaW50IFNUREVSUiAiY29tbWl0LWRpZmYgbXVzdCBiZSB1c2VkIHdpdGggU1ZOIGxpYnJhcmllc1xuIjsKKwkJZXhpdCAxOworCX0KKwlteSAkdGEgPSBzaGlmdCBvciBjb21taXRfZGlmZl91c2FnZSgpOworCW15ICR0YiA9IHNoaWZ0IG9yIGNvbW1pdF9kaWZmX3VzYWdlKCk7CisJaWYgKCFldmFsIHsgJFNWTl9VUkwgPSBzaGlmdCB8fCBmaWxlX3RvX3MoIiRHSVRfU1ZOX0RJUi9pbmZvL3VybCIpIH0pIHsKKwkJcHJpbnQgU1RERVJSICJOZWVkZWQgVVJMIG9yIHVzYWJsZSBnaXQtc3ZuIGlkIGNvbW1hbmQtbGluZVxuIjsKKwkJY29tbWl0X2RpZmZfdXNhZ2UoKTsKKwl9CisJaWYgKGRlZmluZWQgJF9tZXNzYWdlICYmIGRlZmluZWQgJF9maWxlKSB7CisJCXByaW50IFNUREVSUiAiQm90aCAtLW1lc3NhZ2UvLW0gYW5kIC0tZmlsZS8tRiBzcGVjaWZpZWQgIiwKKwkJCQkiZm9yIHRoZSBjb21taXQgbWVzc2FnZS5cbiIsCisJCQkJIkkgaGF2ZSBubyBpZGVhIHdoYXQgeW91IG1lYW5cbiI7CisJCWV4aXQgMTsKKwl9CisJaWYgKGRlZmluZWQgJF9maWxlKSB7CisJCSRfbWVzc2FnZSA9IGZpbGVfdG9fcygkX2ZpbGUpOworCX0gZWxzZSB7CisJCSRfbWVzc2FnZSB8fD0gZ2V0X2NvbW1pdF9tZXNzYWdlKCR0YiwKKwkJCQkJIiRHSVRfRElSLy5zdm4tY29tbWl0LnRtcC4kJCIpLT57bXNnfTsKKwl9CisJbXkgJHJlcG87CisJKCRyZXBvLCAkU1ZOX1BBVEgpID0gcmVwb19wYXRoX3NwbGl0KCRTVk5fVVJMKTsKKwkkU1ZOX0xPRyB8fD0gbGlic3ZuX2Nvbm5lY3QoJHJlcG8pOworCSRTVk4gfHw9IGxpYnN2bl9jb25uZWN0KCRyZXBvKTsKKwlteSBAbG9jayA9ICRTVk46OkNvcmU6OlZFUlNJT04gZ2UgJzEuMi4wJyA/ICh1bmRlZiwgMCkgOiAoKTsKKwlteSAkZWQgPSBTVk46OkdpdDo6RWRpdG9yLT5uZXcoewlyID0+ICRTVk4tPmdldF9sYXRlc3RfcmV2bnVtLAorCQkJCQkJcmEgPT4gJFNWTiwgYyA9PiAkdGIsCisJCQkJCQlzdm5fcGF0aCA9PiAkU1ZOX1BBVEgKKwkJCQkJfSwKKwkJCQkkU1ZOLT5nZXRfY29tbWl0X2VkaXRvcigkX21lc3NhZ2UsCisJCQkJCXN1YiB7cHJpbnQgIkNvbW1pdHRlZCAkX1swXVxuIn0sQGxvY2spCisJCQkJKTsKKwlteSAkbW9kcyA9IGxpYnN2bl9jaGVja291dF90cmVlKCR0YSwgJHRiLCAkZWQpOworCWlmIChAJG1vZHMgPT0gMCkgeworCQlwcmludCAiTm8gY2hhbmdlc1xuJHRhID09ICR0YlxuIjsKKwkJJGVkLT5hYm9ydF9lZGl0OworCX0gZWxzZSB7CisJCSRlZC0+Y2xvc2VfZWRpdDsKKwl9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyB1dGlsaXR5IGZ1bmN0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiBjbXRfc2hvd2FibGUgeworCW15ICgkYykgPSBAXzsKKwlyZXR1cm4gMSBpZiBkZWZpbmVkICRjLT57cn07CisJaWYgKCRjLT57bH0gJiYgJGMtPntsfS0+Wy0xXSBlcSAiLi4uXG4iICYmCisJCQkJJGMtPnthX3Jhd30gPX4gL1xAKFthLWZcZFwtXSspPiQvKSB7CisJCW15IEBtc2cgPSBzYWZlX3F4KHF3L2dpdC1jYXQtZmlsZSBjb21taXQvLCAkYy0+e2N9KTsKKwkJc2hpZnQgQG1zZyB3aGlsZSAoJG1zZ1swXSBuZSAiXG4iKTsKKwkJc2hpZnQgQG1zZzsKKwkJQHskYy0+e2x9fSA9IGdyZXAgIS9eZ2l0LXN2bi1pZDogLywgQG1zZzsKKworCQkodW5kZWYsICRjLT57cn0sIHVuZGVmKSA9IGV4dHJhY3RfbWV0YWRhdGEoCisJCQkJKGdyZXAoL15naXQtc3ZuLWlkOiAvLCBAbXNnKSlbLTFdKTsKKwl9CisJcmV0dXJuIGRlZmluZWQgJGMtPntyfTsKK30KKworc3ViIGdpdF9zdm5fbG9nX2NtZCB7CisJbXkgKCRyX21pbiwgJHJfbWF4KSA9IEBfOworCW15IEBjbWQgPSAocXcvZ2l0LWxvZyAtLWFiYnJldi1jb21taXQgLS1wcmV0dHk9cmF3CisJCQktLWRlZmF1bHQvLCAicmVmcy9yZW1vdGVzLyRHSVRfU1ZOIik7CisJcHVzaCBAY21kLCAnLS1zdW1tYXJ5JyBpZiAkX3ZlcmJvc2U7CisJcmV0dXJuIEBjbWQgdW5sZXNzIGRlZmluZWQgJHJfbWF4OworCWlmICgkcl9tYXggPT0gJHJfbWluKSB7CisJCXB1c2ggQGNtZCwgJy0tbWF4LWNvdW50PTEnOworCQlpZiAobXkgJGMgPSByZXZkYl9nZXQoJFJFVkRCLCAkcl9tYXgpKSB7CisJCQlwdXNoIEBjbWQsICRjOworCQl9CisJfSBlbHNlIHsKKwkJbXkgKCRjX21pbiwgJGNfbWF4KTsKKwkJJGNfbWF4ID0gcmV2ZGJfZ2V0KCRSRVZEQiwgJHJfbWF4KTsKKwkJJGNfbWluID0gcmV2ZGJfZ2V0KCRSRVZEQiwgJHJfbWluKTsKKwkJaWYgKCRjX21pbiAmJiAkY19tYXgpIHsKKwkJCWlmICgkcl9tYXggPiAkcl9tYXgpIHsKKwkJCQlwdXNoIEBjbWQsICIkY19taW4uLiRjX21heCI7CisJCQl9IGVsc2UgeworCQkJCXB1c2ggQGNtZCwgIiRjX21heC4uJGNfbWluIjsKKwkJCX0KKwkJfSBlbHNpZiAoJHJfbWF4ID4gJHJfbWluKSB7CisJCQlwdXNoIEBjbWQsICRjX21heDsKKwkJfSBlbHNlIHsKKwkJCXB1c2ggQGNtZCwgJGNfbWluOworCQl9CisJfQorCXJldHVybiBAY21kOworfQorCitzdWIgZmV0Y2hfY2hpbGRfaWQgeworCW15ICRpZCA9IHNoaWZ0OworCXByaW50ICJGZXRjaGluZyAkaWRcbiI7CisJbXkgJHJlZiA9ICIkR0lUX0RJUi9yZWZzL3JlbW90ZXMvJGlkIjsKKwlkZWZpbmVkKG15ICRwaWQgPSBvcGVuIG15ICRmaCwgJy18Jykgb3IgY3JvYWsgJCE7CisJaWYgKCEkcGlkKSB7CisJCSRfcmVwYWNrID0gdW5kZWY7CisJCSRHSVRfU1ZOID0gJEVOVntHSVRfU1ZOX0lEfSA9ICRpZDsKKwkJaW5pdF92YXJzKCk7CisJCWZldGNoKEBfKTsKKwkJZXhpdCAwOworCX0KKwl3aGlsZSAoPCRmaD4pIHsKKwkJcHJpbnQgJF87CisJCWNoZWNrX3JlcGFjaygpIGlmICgvXnJcZCsgPSAkc2hhMS8pOworCX0KKwljbG9zZSAkZmggb3IgY3JvYWsgJD87Cit9CisKK3N1YiByZWNfZmV0Y2ggeworCW15ICgkcGZ4LCAkcCwgQGFyZ3MpID0gQF87CisJbXkgQGRpcjsKKwlmb3JlYWNoIChzb3J0IDwkcC8qPikgeworCQlpZiAoLXIgIiRfL2luZm8vdXJsIikgeworCQkJJHBmeCAuPSAnLycgaWYgJHBmeCAmJiAkcGZ4ICF+IG0hLyQhOworCQkJbXkgJGlkID0gJHBmeCAuIGJhc2VuYW1lICRfOworCQkJbmV4dCBpZiAkaWQgZXEgJ3RydW5rJzsKKwkJCWZldGNoX2NoaWxkX2lkKCRpZCwgQGFyZ3MpOworCQl9IGVsc2lmICgtZCAkXykgeworCQkJcHVzaCBAZGlyLCAkXzsKKwkJfQorCX0KKwlmb3JlYWNoIChAZGlyKSB7CisJCW15ICR4ID0gJF87CisJCSR4ID1+IHMhXlxRJEdJVF9ESVJcRS9zdm4vISE7CisJCXJlY19mZXRjaCgkeCwgJF8pOworCX0KK30KKworc3ViIGNvbXBsZXRlX3VybF9sc19pbml0IHsKKwlteSAoJHVybCwgJHZhciwgJHN3aXRjaCwgJHBmeCkgPSBAXzsKKwl1bmxlc3MgKCR2YXIpIHsKKwkJcHJpbnQgU1RERVJSICJXOiAkc3dpdGNoIG5vdCBzcGVjaWZpZWRcbiI7CisJCXJldHVybjsKKwl9CisJJHZhciA9fiBzIy8rJCMjOworCWlmICgkdmFyICF+IG0jXlthLXpcK10rOi8vIykgeworCQkkdmFyID0gJy8nIC4gJHZhciBpZiAoJHZhciAhfiBtI14vIyk7CisJCXVubGVzcyAoJHVybCkgeworCQkJcHJpbnQgU1RERVJSICJFOiAnJHZhcicgaXMgbm90IGEgY29tcGxldGUgVVJMICIsCisJCQkJImFuZCBhIHNlcGFyYXRlIFVSTCBpcyBub3Qgc3BlY2lmaWVkXG4iOworCQkJZXhpdCAxOworCQl9CisJCSR2YXIgPSAkdXJsIC4gJHZhcjsKKwl9CisJY2hvbXAobXkgQGxzID0gJF91c2VfbGliID8gbGlic3ZuX2xzX2Z1bGx1cmwoJHZhcikKKwkJCQk6IHNhZmVfcXgocXcvc3ZuIGxzIC0tbm9uLWludGVyYWN0aXZlLywgJHZhcikpOworCW15ICRvbGQgPSAkR0lUX1NWTjsKKwlkZWZpbmVkKG15ICRwaWQgPSBmb3JrKSBvciBjcm9hayAkITsKKwlpZiAoISRwaWQpIHsKKwkJZm9yZWFjaCBteSAkdSAobWFwIHsgIiR2YXIvJF8iIH0gKGdyZXAgbSEvJCEsIEBscykpIHsKKwkJCSR1ID1+IHMjLyskIyM7CisJCQlpZiAoJHUgIX4gbSFcUSR2YXJcRS8oLispJCEpIHsKKwkJCQlwcmludCBTVERFUlIgIlc6IFVucmVjb2duaXplZCBVUkw6ICR1XG4iOworCQkJCWRpZSAiVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXG4iOworCQkJfQorCQkJbXkgJGlkID0gJHBmeC4kMTsKKwkJCXByaW50ICJpbml0ICR1ID0+ICRpZFxuIjsKKwkJCSRHSVRfU1ZOID0gJEVOVntHSVRfU1ZOX0lEfSA9ICRpZDsKKwkJCWluaXRfdmFycygpOworCQkJaW5pdCgkdSk7CisJCX0KKwkJZXhpdCAwOworCX0KKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgJD8gaWYgJD87Cit9CisKK3N1YiBjb21tb25fcHJlZml4IHsKKwlteSAkcGF0aHMgPSBzaGlmdDsKKwlteSAlY29tbW9uOworCWZvcmVhY2ggKEAkcGF0aHMpIHsKKwkJbXkgQHRtcCA9IHNwbGl0IG0jLyMsICRfOworCQlteSAkcCA9ICcnOworCQl3aGlsZSAobXkgJHggPSBzaGlmdCBAdG1wKSB7CisJCQkkcCAuPSAiLyR4IjsKKwkJCSRjb21tb257JHB9IHx8PSAwOworCQkJJGNvbW1vbnskcH0rKzsKKwkJfQorCX0KKwlmb3JlYWNoIChzb3J0IHtsZW5ndGggJGIgPD0+IGxlbmd0aCAkYX0ga2V5cyAlY29tbW9uKSB7CisJCWlmICgkY29tbW9ueyRffSA9PSBAJHBhdGhzKSB7CisJCQlyZXR1cm4gJF87CisJCX0KKwl9CisJcmV0dXJuICcnOworfQorCisjIGdyYWZ0cyBzZXQgaGVyZSBhcmUgJ3N0cm9uZ2VyJyBpbiB0aGF0IHRoZXkncmUgYmFzZWQgb24gYWN0dWFsIHRyZWUKKyMgbWF0Y2hlcywgYW5kIHdvbid0IGJlIGRlbGV0ZWQgZnJvbSBtZXJnZS1iYXNlIGNoZWNraW5nIGluIHdyaXRlX2dyYWZ0cygpCitzdWIgZ3JhZnRfdHJlZV9qb2lucyB7CisJbXkgJGdyYWZ0cyA9IHNoaWZ0OworCW1hcF90cmVlX2pvaW5zKCkgaWYgKEBfYnJhbmNoX2Zyb20gJiYgISV0cmVlX21hcCk7CisJcmV0dXJuIHVubGVzcyAldHJlZV9tYXA7CisKKwlnaXRfc3ZuX2VhY2goc3ViIHsKKwkJbXkgJGkgPSBzaGlmdDsKKwkJZGVmaW5lZChteSAkcGlkID0gb3BlbiBteSAkZmgsICctfCcpIG9yIGNyb2FrICQhOworCQlpZiAoISRwaWQpIHsKKwkJCWV4ZWMgcXcvZ2l0LXJldi1saXN0IC0tcHJldHR5PXJhdy8sCisJCQkJCSJyZWZzL3JlbW90ZXMvJGkiIG9yIGNyb2FrICQhOworCQl9CisJCXdoaWxlICg8JGZoPikgeworCQkJbmV4dCB1bmxlc3MgL15jb21taXQgKCRzaGExKSQvbzsKKwkJCW15ICRjID0gJDE7CisJCQlteSAoJHQpID0gKDwkZmg+ID1+IC9edHJlZSAoJHNoYTEpJC9vKTsKKwkJCW5leHQgdW5sZXNzICR0cmVlX21hcHskdH07CisKKwkJCW15ICRsOworCQkJZG8geworCQkJCSRsID0gcmVhZGxpbmUgJGZoOworCQkJfSB1bnRpbCAoJGwgPX4gL15jb21taXR0ZXIgKD86LispIChcZCspIChbXC1cK10/XGQrKSQvKTsKKworCQkJbXkgKCRzLCAkdHopID0gKCQxLCAkMik7CisJCQlpZiAoJHR6ID1+IHMvXlwrLy8pIHsKKwkJCQkkcyArPSB0el90b19zX29mZnNldCgkdHopOworCQkJfSBlbHNpZiAoJHR6ID1+IHMvXlwtLy8pIHsKKwkJCQkkcyAtPSB0el90b19zX29mZnNldCgkdHopOworCQkJfQorCisJCQlteSAoJHVybF9hLCAkcl9hLCAkdXVpZF9hKSA9IGNtdF9tZXRhZGF0YSgkYyk7CisKKwkJCWZvcmVhY2ggbXkgJHAgKEB7JHRyZWVfbWFweyR0fX0pIHsKKwkJCQluZXh0IGlmICRwIGVxICRjOworCQkJCW15ICRtYiA9IGV2YWwgeworCQkJCQlzYWZlX3F4KCdnaXQtbWVyZ2UtYmFzZScsICRjLCAkcCkKKwkJCQl9OworCQkJCW5leHQgdW5sZXNzICgkQCB8fCAkPyk7CisJCQkJaWYgKGRlZmluZWQgJHJfYSkgeworCQkJCQkjIHNlZSBpZiBTVk4gc2F5cyBpdCdzIGEgcmVsYXRpdmUKKwkJCQkJbXkgKCR1cmxfYiwgJHJfYiwgJHV1aWRfYikgPQorCQkJCQkJCWNtdF9tZXRhZGF0YSgkcCk7CisJCQkJCW5leHQgaWYgKGRlZmluZWQgJHVybF9iICYmCisJCQkJCQkJZGVmaW5lZCAkdXJsX2EgJiYKKwkJCQkJCQkoJHVybF9hIGVxICR1cmxfYikgJiYKKwkJCQkJCQkoJHV1aWRfYSBlcSAkdXVpZF9iKSk7CisJCQkJCWlmICgkdXVpZF9hIGVxICR1dWlkX2IpIHsKKwkJCQkJCWlmICgkcl9iIDwgJHJfYSkgeworCQkJCQkJCSRncmFmdHMtPnskY30tPnskcH0gPSAyOworCQkJCQkJCW5leHQ7CisJCQkJCQl9IGVsc2lmICgkcl9iID4gJHJfYSkgeworCQkJCQkJCSRncmFmdHMtPnskcH0tPnskY30gPSAyOworCQkJCQkJCW5leHQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJbXkgJGN0ID0gZ2V0X2NvbW1pdF90aW1lKCRwKTsKKwkJCQlpZiAoJGN0IDwgJHMpIHsKKwkJCQkJJGdyYWZ0cy0+eyRjfS0+eyRwfSA9IDI7CisJCQkJfSBlbHNpZiAoJGN0ID4gJHMpIHsKKwkJCQkJJGdyYWZ0cy0+eyRwfS0+eyRjfSA9IDI7CisJCQkJfQorCQkJCSMgd2hhdCBzaG91bGQgd2UgZG8gd2hlbiAkY3QgPT0gJHMgPworCQkJfQorCQl9CisJCWNsb3NlICRmaCBvciBjcm9hayAkPzsKKwl9KTsKK30KKworIyB0aGlzIGlzbid0IGZ1bmt5LWZpbGVuYW1lIHNhZmUsIGJ1dCBnb29kIGVub3VnaCBmb3Igbm93Li4uCitzdWIgZ3JhZnRfZmlsZV9jb3B5X2NtZCB7CisJbXkgKCRncmFmdHMsICRsX21hcCwgJHUpID0gQF87CisJbXkgJHBhdGhzID0gJGxfbWFwLT57JHV9OworCW15ICRwZnggPSBjb21tb25fcHJlZml4KFtrZXlzICUkcGF0aHNdKTsKKwkkU1ZOX1VSTCB8fD0gJHUuJHBmeDsKKwlteSAkcGlkID0gb3BlbiBteSAkZmgsICctfCc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCXVubGVzcyAoJHBpZCkgeworCQlteSBAZXhlYyA9IHF3L3N2biBsb2cgLXYvOworCQlwdXNoIEBleGVjLCAiLXIkX3JldmlzaW9uIiBpZiBkZWZpbmVkICRfcmV2aXNpb247CisJCWV4ZWMgQGV4ZWMsICR1LiRwZnggb3IgY3JvYWsgJCE7CisJfQorCW15ICgkciwgJG1wKSA9ICh1bmRlZiwgdW5kZWYpOworCXdoaWxlICg8JGZoPikgeworCQljaG9tcDsKKwkJaWYgKC9eXC17NzJ9JC8pIHsKKwkJCSRtcCA9ICRyID0gdW5kZWY7CisJCX0gZWxzaWYgKC9ecihcZCspIFx8IC8pIHsKKwkJCSRyID0gJDEgdW5sZXNzIGRlZmluZWQgJHI7CisJCX0gZWxzaWYgKC9eQ2hhbmdlZCBwYXRoczovKSB7CisJCQkkbXAgPSAxOworCQl9IGVsc2lmICgkbXAgJiYgbSNeICAgW0FSXSAvKFxTLio/KSBcKGZyb20gLyhcUys/KTooXGQrKVwpJCMpIHsKKwkJCW15ICgkcDEsICRwMCwgJHIwKSA9ICgkMSwgJDIsICQzKTsKKwkJCW15ICRjID0gZmluZF9ncmFmdF9wYXRoX2NvbW1pdCgkcGF0aHMsICRwMSwgJHIpOworCQkJbmV4dCB1bmxlc3MgJGM7CisJCQlmaW5kX2dyYWZ0X3BhdGhfcGFyZW50cygkZ3JhZnRzLCAkcGF0aHMsICRjLCAkcDAsICRyMCk7CisJCX0KKwl9Cit9CisKK3N1YiBncmFmdF9maWxlX2NvcHlfbGliIHsKKwlteSAoJGdyYWZ0cywgJGxfbWFwLCAkdSkgPSBAXzsKKwlteSAkdHJlZV9wYXRocyA9ICRsX21hcC0+eyR1fTsKKwlteSAkcGZ4ID0gY29tbW9uX3ByZWZpeChba2V5cyAlJHRyZWVfcGF0aHNdKTsKKwlteSAoJHJlcG8sICRwYXRoKSA9IHJlcG9fcGF0aF9zcGxpdCgkdS4kcGZ4KTsKKwkkU1ZOX0xPRyB8fD0gbGlic3ZuX2Nvbm5lY3QoJHJlcG8pOworCSRTVk4gfHw9IGxpYnN2bl9jb25uZWN0KCRyZXBvKTsKKworCW15ICgkYmFzZSwgJGhlYWQpID0gbGlic3ZuX3BhcnNlX3JldmlzaW9uKCk7CisJbXkgJGluYyA9IDEwMDA7CisJbXkgKCRtaW4sICRtYXgpID0gKCRiYXNlLCAkaGVhZCA8ICRiYXNlKyRpbmMgPyAkaGVhZCA6ICRiYXNlKyRpbmMpOworCW15ICRlaCA9ICRTVk46OkVycm9yOjpoYW5kbGVyOworCSRTVk46OkVycm9yOjpoYW5kbGVyID0gXCZsaWJzdm5fc2tpcF91bmtub3duX3JldnM7CisJd2hpbGUgKDEpIHsKKwkJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKwkJbGlic3ZuX2dldF9sb2coJFNWTl9MT0csICIvJHBhdGgiLCAkbWluLCAkbWF4LCAwLCAxLCAxLAorCQkJc3ViIHsKKwkJCQlsaWJzdm5fZ3JhZnRfZmlsZV9jb3BpZXMoJGdyYWZ0cywgJHRyZWVfcGF0aHMsCisJCQkJCQkJJHBhdGgsIEBfKTsKKwkJCX0sICRwb29sKTsKKwkJJHBvb2wtPmNsZWFyOworCQlsYXN0IGlmICgkbWF4ID49ICRoZWFkKTsKKwkJJG1pbiA9ICRtYXggKyAxOworCQkkbWF4ICs9ICRpbmM7CisJCSRtYXggPSAkaGVhZCBpZiAoJG1heCA+ICRoZWFkKTsKKwl9CisJJFNWTjo6RXJyb3I6OmhhbmRsZXIgPSAkZWg7Cit9CisKK3N1YiBwcm9jZXNzX21lcmdlX21zZ19tYXRjaGVzIHsKKwlteSAoJGdyYWZ0cywgJGxfbWFwLCAkdSwgJHAsICRjLCBAbWF0Y2hlcykgPSBAXzsKKwlteSAoQHN0cm9uZywgQHdlYWspOworCWZvcmVhY2ggKEBtYXRjaGVzKSB7CisJCSMgbWVyZ2luZyB3aXRoIG91cnNlbHZlcyBpcyBub3QgaW50ZXJlc3RpbmcKKwkJbmV4dCBpZiAkXyBlcSAkcDsKKwkJaWYgKCRsX21hcC0+eyR1fS0+eyRffSkgeworCQkJcHVzaCBAc3Ryb25nLCAkXzsKKwkJfSBlbHNlIHsKKwkJCXB1c2ggQHdlYWssICRfOworCQl9CisJfQorCWZvcmVhY2ggbXkgJHcgKEB3ZWFrKSB7CisJCWxhc3QgaWYgQHN0cm9uZzsKKwkJIyBubyBleGFjdCBtYXRjaCwgdXNlIGJyYW5jaCBuYW1lIGFzIHJlZ2V4cC4KKwkJbXkgJHJlID0gcXIvXFEkd1xFL2k7CisJCWZvcmVhY2ggKGtleXMgJXskbF9tYXAtPnskdX19KSB7CisJCQlpZiAoLyRyZS8pIHsKKwkJCQlwdXNoIEBzdHJvbmcsICRsX21hcC0+eyR1fS0+eyRffTsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCWxhc3QgaWYgQHN0cm9uZzsKKwkJJHcgPSBiYXNlbmFtZSgkdyk7CisJCSRyZSA9IHFyL1xRJHdcRS9pOworCQlmb3JlYWNoIChrZXlzICV7JGxfbWFwLT57JHV9fSkgeworCQkJaWYgKC8kcmUvKSB7CisJCQkJcHVzaCBAc3Ryb25nLCAkbF9tYXAtPnskdX0tPnskX307CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCX0KKwlteSAoJHJldikgPSAoJGMtPnttfSA9fiAvXmdpdC1zdm4taWQ6XHMoPzpcUys/KVxAKFxkKykKKwkJCQkJXHMoPzpbYS1mXGRcLV0rKSQveHNtKTsKKwl1bmxlc3MgKGRlZmluZWQgJHJldikgeworCQkoJHJldikgPSAoJGMtPnttfSA9fi9eZ2l0LXN2bi1pZDpccyhcZCspCisJCQkJCVxAKD86W2EtZlxkXC1dKykveHNtKTsKKwkJcmV0dXJuIHVubGVzcyBkZWZpbmVkICRyZXY7CisJfQorCWZvcmVhY2ggbXkgJG0gKEBzdHJvbmcpIHsKKwkJbXkgKCRyMCwgJHMwKSA9IGZpbmRfcmV2X2JlZm9yZSgkcmV2LCAkbSwgMSk7CisJCSRncmFmdHMtPnskYy0+e2N9fS0+eyRzMH0gPSAxIGlmIGRlZmluZWQgJHMwOworCX0KK30KKworc3ViIGdyYWZ0X21lcmdlX21zZyB7CisJbXkgKCRncmFmdHMsICRsX21hcCwgJHUsICRwLCBAcmUpID0gQF87CisKKwlteSAkeCA9ICRsX21hcC0+eyR1fS0+eyRwfTsKKwlteSAkcmwgPSByZXZfbGlzdF9yYXcoJHgpOworCXdoaWxlIChteSAkYyA9IG5leHRfcmV2X2xpc3RfZW50cnkoJHJsKSkgeworCQlmb3JlYWNoIG15ICRyZSAoQHJlKSB7CisJCQlteSAoQGJyKSA9ICgkYy0+e219ID1+IC8kcmUvZyk7CisJCQluZXh0IHVubGVzcyBAYnI7CisJCQlwcm9jZXNzX21lcmdlX21zZ19tYXRjaGVzKCRncmFmdHMsJGxfbWFwLCR1LCRwLCRjLEBicik7CisJCX0KKwl9Cit9CisKK3N1YiByZWFkX3V1aWQgeworCXJldHVybiBpZiAkU1ZOX1VVSUQ7CisJaWYgKCRfdXNlX2xpYikgeworCQlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCQkkU1ZOX1VVSUQgPSAkU1ZOLT5nZXRfdXVpZCgkcG9vbCk7CisJCSRwb29sLT5jbGVhcjsKKwl9IGVsc2UgeworCQlteSAkaW5mbyA9IHNoaWZ0IHx8IHN2bl9pbmZvKCcuJyk7CisJCSRTVk5fVVVJRCA9ICRpbmZvLT57J1JlcG9zaXRvcnkgVVVJRCd9IG9yCisJCQkJCWNyb2FrICJSZXBvc2l0b3J5IFVVSUQgdW5yZWFkYWJsZVxuIjsKKwl9Cit9CisKK3N1YiBxdWlldF9ydW4geworCW15ICRwaWQgPSBmb3JrOworCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwlpZiAoISRwaWQpIHsKKwkJb3BlbiBteSAkbnVsbCwgJz4nLCAnL2Rldi9udWxsJyBvciBjcm9hayAkITsKKwkJb3BlbiBTVERFUlIsICc+JicsICRudWxsIG9yIGNyb2FrICQhOworCQlvcGVuIFNURE9VVCwgJz4mJywgJG51bGwgb3IgY3JvYWsgJCE7CisJCWV4ZWMgQF8gb3IgY3JvYWsgJCE7CisJfQorCXdhaXRwaWQgJHBpZCwgMDsKKwlyZXR1cm4gJD87Cit9CisKK3N1YiByZXBvX3BhdGhfc3BsaXQgeworCW15ICRmdWxsX3VybCA9IHNoaWZ0OworCSRmdWxsX3VybCA9fiBzIy8rJCMjOworCisJZm9yZWFjaCAoQHJlcG9fcGF0aF9zcGxpdF9jYWNoZSkgeworCQlpZiAoJGZ1bGxfdXJsID1+IHMjJF8jIykgeworCQkJbXkgJHUgPSAkMTsKKwkJCSRmdWxsX3VybCA9fiBzI14vKyMjOworCQkJcmV0dXJuICgkdSwgJGZ1bGxfdXJsKTsKKwkJfQorCX0KKworCWlmICgkX3VzZV9saWIpIHsKKwkJbXkgJHRtcCA9IGxpYnN2bl9jb25uZWN0KCRmdWxsX3VybCk7CisJCW15ICR1cmwgPSAkdG1wLT5nZXRfcmVwb3Nfcm9vdDsKKwkJJGZ1bGxfdXJsID1+IHMjXlxRJHVybFxFLyojIzsKKwkJcHVzaCBAcmVwb19wYXRoX3NwbGl0X2NhY2hlLCBxci9eKFxRJHVybFxFKS87CisJCXJldHVybiAoJHVybCwgJGZ1bGxfdXJsKTsKKwl9IGVsc2UgeworCQlteSAoJHVybCwgJHBhdGgpID0gKCRmdWxsX3VybCA9fiBtIV4oW2EtelwrXSs6Ly9bXi9dKikoLiopJCFpKTsKKwkJJHBhdGggPX4gcyNeLysjIzsKKwkJbXkgQHBhdGhzID0gc3BsaXQobSMvKyMsICRwYXRoKTsKKwkJd2hpbGUgKHF1aWV0X3J1bihxdy9zdm4gbHMgLS1ub24taW50ZXJhY3RpdmUvLCAkdXJsKSkgeworCQkJbXkgJG4gPSBzaGlmdCBAcGF0aHMgfHwgbGFzdDsKKwkJCSR1cmwgLj0gIi8kbiI7CisJCX0KKwkJcHVzaCBAcmVwb19wYXRoX3NwbGl0X2NhY2hlLCBxci9eKFxRJHVybFxFKS87CisJCSRwYXRoID0gam9pbignLycsQHBhdGhzKTsKKwkJcmV0dXJuICgkdXJsLCAkcGF0aCk7CisJfQorfQorCitzdWIgc2V0dXBfZ2l0X3N2biB7CisJZGVmaW5lZCAkU1ZOX1VSTCBvciBjcm9hayAiU1ZOIHJlcG9zaXRvcnkgbG9jYXRpb24gcmVxdWlyZWRcbiI7CisJdW5sZXNzICgtZCAkR0lUX0RJUikgeworCQljcm9hayAiR0lUX0RJUj0kR0lUX0RJUiBkb2VzIG5vdCBleGlzdCFcbiI7CisJfQorCW1rcGF0aChbJEdJVF9TVk5fRElSXSk7CisJbWtwYXRoKFsiJEdJVF9TVk5fRElSL2luZm8iXSk7CisJb3BlbiBteSAkZmgsICc+PicsJFJFVkRCIG9yIGNyb2FrICQhOworCWNsb3NlICRmaDsKKwlzX3RvX2ZpbGUoJFNWTl9VUkwsIiRHSVRfU1ZOX0RJUi9pbmZvL3VybCIpOworCit9CisKK3N1YiBhc3NlcnRfc3ZuX3djX2NsZWFuIHsKKwlyZXR1cm4gaWYgJF91c2VfbGliOworCW15ICgkc3ZuX3JldikgPSBAXzsKKwljcm9hayAiJHN2bl9yZXYgaXMgbm90IGFuIGludGVnZXIhXG4iIHVubGVzcyAoJHN2bl9yZXYgPX4gL15cZCskLyk7CisJbXkgJGxjciA9IHN2bl9pbmZvKCcuJyktPnsnTGFzdCBDaGFuZ2VkIFJldid9OworCWlmICgkc3ZuX3JldiAhPSAkbGNyKSB7CisJCXByaW50IFNUREVSUiAiQ2hlY2tpbmcgZm9yIGNvcHktdHJlZSAuLi4gIjsKKwkJbXkgQGRpZmYgPSBncmVwKC9eSW5kZXg6IC8sKHNhZmVfcXgocXcoc3ZuIGRpZmYpLAorCQkJCQkJIi1yJGxjcjokc3ZuX3JldiIpKSk7CisJCWlmIChAZGlmZikgeworCQkJY3JvYWsgIk5vcGUhICBFeHBlY3RlZCByJHN2bl9yZXYsIGdvdCByJGxjclxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50IFNUREVSUiAiT0shXG4iOworCQl9CisJfQorCW15IEBzdGF0dXMgPSBncmVwKCEvXlBlcmZvcm1pbmcgc3RhdHVzIG9uIGV4dGVybmFsLywoYHN2biBzdGF0dXNgKSk7CisJQHN0YXR1cyA9IGdyZXAoIS9eXHMqJC8sQHN0YXR1cyk7CisJaWYgKHNjYWxhciBAc3RhdHVzKSB7CisJCXByaW50IFNUREVSUiAiVHJlZSAoJFNWTl9XQykgaXMgbm90IGNsZWFuOlxuIjsKKwkJcHJpbnQgU1RERVJSICRfIGZvcmVhY2ggQHN0YXR1czsKKwkJY3JvYWs7CisJfQorfQorCitzdWIgZ2V0X3RyZWVfZnJvbV90cmVlaXNoIHsKKwlteSAoJHRyZWVpc2gpID0gQF87CisJY3JvYWsgIk5vdCBhIHNoYTE6ICR0cmVlaXNoXG4iIHVubGVzcyAkdHJlZWlzaCA9fiAvXiRzaGExJC9vOworCWNob21wKG15ICR0eXBlID0gYGdpdC1jYXQtZmlsZSAtdCAkdHJlZWlzaGApOworCW15ICRleHBlY3RlZDsKKwl3aGlsZSAoJHR5cGUgZXEgJ3RhZycpIHsKKwkJY2hvbXAoKCR0cmVlaXNoLCAkdHlwZSkgPSBgZ2l0LWNhdC1maWxlIHRhZyAkdHJlZWlzaGApOworCX0KKwlpZiAoJHR5cGUgZXEgJ2NvbW1pdCcpIHsKKwkJJGV4cGVjdGVkID0gKGdyZXAgL150cmVlIC8sYGdpdC1jYXQtZmlsZSBjb21taXQgJHRyZWVpc2hgKVswXTsKKwkJKCRleHBlY3RlZCkgPSAoJGV4cGVjdGVkID1+IC9edHJlZSAoJHNoYTEpJC8pOworCQlkaWUgIlVuYWJsZSB0byBnZXQgdHJlZSBmcm9tICR0cmVlaXNoXG4iIHVubGVzcyAkZXhwZWN0ZWQ7CisJfSBlbHNpZiAoJHR5cGUgZXEgJ3RyZWUnKSB7CisJCSRleHBlY3RlZCA9ICR0cmVlaXNoOworCX0gZWxzZSB7CisJCWRpZSAiJHRyZWVpc2ggaXMgYSAkdHlwZSwgZXhwZWN0ZWQgdHJlZSwgdGFnIG9yIGNvbW1pdFxuIjsKKwl9CisJcmV0dXJuICRleHBlY3RlZDsKK30KKworc3ViIGFzc2VydF90cmVlIHsKKwlyZXR1cm4gaWYgJF91c2VfbGliOworCW15ICgkdHJlZWlzaCkgPSBAXzsKKwlteSAkZXhwZWN0ZWQgPSBnZXRfdHJlZV9mcm9tX3RyZWVpc2goJHRyZWVpc2gpOworCisJbXkgJHRtcGluZGV4ID0gJEdJVF9TVk5fSU5ERVguJy5hc3NlcnQtdG1wJzsKKwlpZiAoLWUgJHRtcGluZGV4KSB7CisJCXVubGluayAkdG1waW5kZXggb3IgY3JvYWsgJCE7CisJfQorCW15ICRvbGRfaW5kZXggPSBzZXRfaW5kZXgoJHRtcGluZGV4KTsKKwlpbmRleF9jaGFuZ2VzKDEpOworCWNob21wKG15ICR0cmVlID0gYGdpdC13cml0ZS10cmVlYCk7CisJcmVzdG9yZV9pbmRleCgkb2xkX2luZGV4KTsKKwlpZiAoJHRyZWUgbmUgJGV4cGVjdGVkKSB7CisJCWNyb2FrICJUcmVlIG1pc21hdGNoLCBHb3Q6ICR0cmVlLCBFeHBlY3RlZDogJGV4cGVjdGVkXG4iOworCX0KKwl1bmxpbmsgJHRtcGluZGV4OworfQorCitzdWIgcGFyc2VfZGlmZl90cmVlIHsKKwlteSAkZGlmZl9maCA9IHNoaWZ0OworCWxvY2FsICQvID0gIlwwIjsKKwlteSAkc3RhdGUgPSAnbWV0YSc7CisJbXkgQG1vZHM7CisJd2hpbGUgKDwkZGlmZl9maD4pIHsKKwkJY2hvbXAgJF87ICMgdGhpcyBnZXRzIHJpZCBvZiB0aGUgdHJhaWxpbmcgIlwwIgorCQlpZiAoJHN0YXRlIGVxICdtZXRhJyAmJiAvXjooXGR7Nn0pXHMoXGR7Nn0pXHMKKwkJCQkJJHNoYTFccygkc2hhMSlccyhbTVRDUkFEXSlcZCokL3hvKSB7CisJCQlwdXNoIEBtb2RzLCB7CW1vZGVfYSA9PiAkMSwgbW9kZV9iID0+ICQyLAorCQkJCQlzaGExX2IgPT4gJDMsIGNoZyA9PiAkNCB9OworCQkJaWYgKCQ0ID1+IC9eKD86Q3xSKSQvKSB7CisJCQkJJHN0YXRlID0gJ2ZpbGVfYSc7CisJCQl9IGVsc2UgeworCQkJCSRzdGF0ZSA9ICdmaWxlX2InOworCQkJfQorCQl9IGVsc2lmICgkc3RhdGUgZXEgJ2ZpbGVfYScpIHsKKwkJCW15ICR4ID0gJG1vZHNbJCNtb2RzXSBvciBjcm9hayAiRW1wdHkgYXJyYXlcbiI7CisJCQlpZiAoJHgtPntjaGd9ICF+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCSR4LT57ZmlsZV9hfSA9ICRfOworCQkJJHN0YXRlID0gJ2ZpbGVfYic7CisJCX0gZWxzaWYgKCRzdGF0ZSBlcSAnZmlsZV9iJykgeworCQkJbXkgJHggPSAkbW9kc1skI21vZHNdIG9yIGNyb2FrICJFbXB0eSBhcnJheVxuIjsKKwkJCWlmIChleGlzdHMgJHgtPntmaWxlX2F9ICYmICR4LT57Y2hnfSAhfiAvXig/OkN8UikkLykgeworCQkJCWNyb2FrICJFcnJvciBwYXJzaW5nICRfLCAkeC0+e2NoZ31cbiI7CisJCQl9CisJCQlpZiAoIWV4aXN0cyAkeC0+e2ZpbGVfYX0gJiYgJHgtPntjaGd9ID1+IC9eKD86Q3xSKSQvKSB7CisJCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF8sICR4LT57Y2hnfVxuIjsKKwkJCX0KKwkJCSR4LT57ZmlsZV9ifSA9ICRfOworCQkJJHN0YXRlID0gJ21ldGEnOworCQl9IGVsc2UgeworCQkJY3JvYWsgIkVycm9yIHBhcnNpbmcgJF9cbiI7CisJCX0KKwl9CisJY2xvc2UgJGRpZmZfZmggb3IgY3JvYWsgJD87CisKKwlyZXR1cm4gXEBtb2RzOworfQorCitzdWIgc3ZuX2NoZWNrX3Byb3BfZXhlY3V0YWJsZSB7CisJbXkgJG0gPSBzaGlmdDsKKwlyZXR1cm4gaWYgLWwgJG0tPntmaWxlX2J9OworCWlmICgkbS0+e21vZGVfYn0gPX4gLzc1NSQvKSB7CisJCWNobW9kKCgwNzU1ICZ+IHVtYXNrKSwkbS0+e2ZpbGVfYn0pIG9yIGNyb2FrICQhOworCQlpZiAoJG0tPnttb2RlX2F9ICF+IC83NTUkLykgeworCQkJc3lzKHF3KHN2biBwcm9wc2V0IHN2bjpleGVjdXRhYmxlIDEpLCAkbS0+e2ZpbGVfYn0pOworCQl9CisJCS14ICRtLT57ZmlsZV9ifSBvciBjcm9hayAiJG0tPntmaWxlX2J9IGlzIG5vdCBleGVjdXRhYmxlIVxuIjsKKwl9IGVsc2lmICgkbS0+e21vZGVfYn0gIX4gLzc1NSQvICYmICRtLT57bW9kZV9hfSA9fiAvNzU1JC8pIHsKKwkJc3lzKHF3KHN2biBwcm9wZGVsIHN2bjpleGVjdXRhYmxlKSwgJG0tPntmaWxlX2J9KTsKKwkJY2htb2QoKDA2NDQgJn4gdW1hc2spLCRtLT57ZmlsZV9ifSkgb3IgY3JvYWsgJCE7CisJCS14ICRtLT57ZmlsZV9ifSBhbmQgY3JvYWsgIiRtLT57ZmlsZV9ifSBpcyBleGVjdXRhYmxlIVxuIjsKKwl9Cit9CisKK3N1YiBzdm5fZW5zdXJlX3BhcmVudF9wYXRoIHsKKwlteSAkZGlyX2IgPSBkaXJuYW1lKHNoaWZ0KTsKKwlzdm5fZW5zdXJlX3BhcmVudF9wYXRoKCRkaXJfYikgaWYgKCRkaXJfYiBuZSBGaWxlOjpTcGVjLT5jdXJkaXIpOworCW1rcGF0aChbJGRpcl9iXSkgdW5sZXNzICgtZCAkZGlyX2IpOworCXN5cyhxdyhzdm4gYWRkIC1OKSwgJGRpcl9iKSB1bmxlc3MgKC1kICIkZGlyX2IvLnN2biIpOworfQorCitzdWIgcHJlY29tbWl0X2NoZWNrIHsKKwlteSAkbW9kcyA9IHNoaWZ0OworCW15ICglcm1fZmlsZSwgJXJtZGlyX2NoZWNrLCAlYWRkZWRfY2hlY2spOworCisJbXkgJW8gPSAoIEQgPT4gMCwgUiA9PiAxLCBDID0+IDIsIEEgPT4gMywgTSA9PiAzLCBUID0+IDMgKTsKKwlmb3JlYWNoIG15ICRtIChzb3J0IHsgJG97JGEtPntjaGd9fSA8PT4gJG97JGItPntjaGd9fSB9IEAkbW9kcykgeworCQlpZiAoJG0tPntjaGd9IGVxICdSJykgeworCQkJaWYgKC1kICRtLT57ZmlsZV9ifSkgeworCQkJCWVycl9kaXJfdG9fZmlsZSgiJG0tPntmaWxlX2F9ID0+ICRtLT57ZmlsZV9ifSIpOworCQkJfQorCQkJIyBkaXIvJGZpbGUgPT4gZGlyL2ZpbGUvJGZpbGUKKwkJCW15ICRkaXJuYW1lID0gZGlybmFtZSgkbS0+e2ZpbGVfYn0pOworCQkJd2hpbGUgKCRkaXJuYW1lIG5lIEZpbGU6OlNwZWMtPmN1cmRpcikgeworCQkJCWlmICgkZGlybmFtZSBuZSAkbS0+e2ZpbGVfYX0pIHsKKwkJCQkJJGRpcm5hbWUgPSBkaXJuYW1lKCRkaXJuYW1lKTsKKwkJCQkJbmV4dDsKKwkJCQl9CisJCQkJZXJyX2ZpbGVfdG9fZGlyKCIkbS0+e2ZpbGVfYX0gPT4gJG0tPntmaWxlX2J9Iik7CisJCQl9CisJCQkjIGJhei96enogPT4gYmF6IChiYXogaXMgYSBmaWxlKQorCQkJJGRpcm5hbWUgPSBkaXJuYW1lKCRtLT57ZmlsZV9hfSk7CisJCQl3aGlsZSAoJGRpcm5hbWUgbmUgRmlsZTo6U3BlYy0+Y3VyZGlyKSB7CisJCQkJaWYgKCRkaXJuYW1lIG5lICRtLT57ZmlsZV9ifSkgeworCQkJCQkkZGlybmFtZSA9IGRpcm5hbWUoJGRpcm5hbWUpOworCQkJCQluZXh0OworCQkJCX0KKwkJCQllcnJfZGlyX3RvX2ZpbGUoIiRtLT57ZmlsZV9hfSA9PiAkbS0+e2ZpbGVfYn0iKTsKKwkJCX0KKwkJfQorCQlpZiAoJG0tPntjaGd9ID1+IC9eKER8UikkLykgeworCQkJbXkgJHQgPSAkMSBlcSAnRCcgPyAnZmlsZV9iJyA6ICdmaWxlX2EnOworCQkJJHJtX2ZpbGV7ICRtLT57JHR9IH0gPSAxOworCQkJbXkgJGRpcm5hbWUgPSBkaXJuYW1lKCAkbS0+eyR0fSApOworCQkJbXkgJGJhc2VuYW1lID0gYmFzZW5hbWUoICRtLT57JHR9ICk7CisJCQkkcm1kaXJfY2hlY2t7JGRpcm5hbWV9LT57JGJhc2VuYW1lfSA9IDE7CisJCX0gZWxzaWYgKCRtLT57Y2hnfSA9fiAvXig/OkF8QykkLykgeworCQkJaWYgKC1kICRtLT57ZmlsZV9ifSkgeworCQkJCWVycl9kaXJfdG9fZmlsZSgkbS0+e2ZpbGVfYn0pOworCQkJfQorCQkJbXkgJGRpcm5hbWUgPSBkaXJuYW1lKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCW15ICRiYXNlbmFtZSA9IGJhc2VuYW1lKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCSRhZGRlZF9jaGVja3skZGlybmFtZX0tPnskYmFzZW5hbWV9ID0gMTsKKwkJCXdoaWxlICgkZGlybmFtZSBuZSBGaWxlOjpTcGVjLT5jdXJkaXIpIHsKKwkJCQlpZiAoJHJtX2ZpbGV7JGRpcm5hbWV9KSB7CisJCQkJCWVycl9maWxlX3RvX2RpcigkbS0+e2ZpbGVfYn0pOworCQkJCX0KKwkJCQkkZGlybmFtZSA9IGRpcm5hbWUgJGRpcm5hbWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIChcJXJtZGlyX2NoZWNrLCBcJWFkZGVkX2NoZWNrKTsKKworCXN1YiBlcnJfZGlyX3RvX2ZpbGUgeworCQlteSAkZmlsZSA9IHNoaWZ0OworCQlwcmludCBTVERFUlIgIk5vZGUgY2hhbmdlIGZyb20gZGlyZWN0b3J5IHRvIGZpbGUgIiwKKwkJCQkiaXMgbm90IHN1cHBvcnRlZCBieSBTdWJ2ZXJzaW9uOiAiLCRmaWxlLCJcbiI7CisJCWV4aXQgMTsKKwl9CisJc3ViIGVycl9maWxlX3RvX2RpciB7CisJCW15ICRmaWxlID0gc2hpZnQ7CisJCXByaW50IFNUREVSUiAiTm9kZSBjaGFuZ2UgZnJvbSBmaWxlIHRvIGRpcmVjdG9yeSAiLAorCQkJCSJpcyBub3Qgc3VwcG9ydGVkIGJ5IFN1YnZlcnNpb246ICIsJGZpbGUsIlxuIjsKKwkJZXhpdCAxOworCX0KK30KKworCitzdWIgZ2V0X2RpZmYgeworCW15ICgkZnJvbSwgJHRyZWVpc2gpID0gQF87CisJYXNzZXJ0X3RyZWUoJGZyb20pOworCXByaW50ICJkaWZmLXRyZWUgJGZyb20gJHRyZWVpc2hcbiI7CisJbXkgJHBpZCA9IG9wZW4gbXkgJGRpZmZfZmgsICctfCc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCWlmICgkcGlkID09IDApIHsKKwkJbXkgQGRpZmZfdHJlZSA9IHF3KGdpdC1kaWZmLXRyZWUgLXogLXIpOworCQlpZiAoJF9jcF9zaW1pbGFyaXR5KSB7CisJCQlwdXNoIEBkaWZmX3RyZWUsICItQyRfY3Bfc2ltaWxhcml0eSI7CisJCX0gZWxzZSB7CisJCQlwdXNoIEBkaWZmX3RyZWUsICctQyc7CisJCX0KKwkJcHVzaCBAZGlmZl90cmVlLCAnLS1maW5kLWNvcGllcy1oYXJkZXInIGlmICRfZmluZF9jb3BpZXNfaGFyZGVyOworCQlwdXNoIEBkaWZmX3RyZWUsICItbCRfbCIgaWYgZGVmaW5lZCAkX2w7CisJCWV4ZWMoQGRpZmZfdHJlZSwgJGZyb20sICR0cmVlaXNoKSBvciBjcm9hayAkITsKKwl9CisJcmV0dXJuIHBhcnNlX2RpZmZfdHJlZSgkZGlmZl9maCk7Cit9CisKK3N1YiBzdm5fY2hlY2tvdXRfdHJlZSB7CisJbXkgKCRmcm9tLCAkdHJlZWlzaCkgPSBAXzsKKwlteSAkbW9kcyA9IGdldF9kaWZmKCRmcm9tLT57Y29tbWl0fSwgJHRyZWVpc2gpOworCXJldHVybiAkbW9kcyB1bmxlc3MgKHNjYWxhciBAJG1vZHMpOworCW15ICgkcm0sICRhZGQpID0gcHJlY29tbWl0X2NoZWNrKCRtb2RzKTsKKworCW15ICVvID0gKCBEID0+IDEsIFIgPT4gMCwgQyA9PiAtMSwgQSA9PiAzLCBNID0+IDMsIFQgPT4gMyApOworCWZvcmVhY2ggbXkgJG0gKHNvcnQgeyAkb3skYS0+e2NoZ319IDw9PiAkb3skYi0+e2NoZ319IH0gQCRtb2RzKSB7CisJCWlmICgkbS0+e2NoZ30gZXEgJ0MnKSB7CisJCQlzdm5fZW5zdXJlX3BhcmVudF9wYXRoKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCXN5cyhxdyhzdm4gY3ApLAkJJG0tPntmaWxlX2F9LCAkbS0+e2ZpbGVfYn0pOworCQkJYXBwbHlfbW9kX2xpbmVfYmxvYigkbSk7CisJCQlzdm5fY2hlY2tfcHJvcF9leGVjdXRhYmxlKCRtKTsKKwkJfSBlbHNpZiAoJG0tPntjaGd9IGVxICdEJykgeworCQkJc3lzKHF3KHN2biBybSAtLWZvcmNlKSwgJG0tPntmaWxlX2J9KTsKKwkJfSBlbHNpZiAoJG0tPntjaGd9IGVxICdSJykgeworCQkJc3ZuX2Vuc3VyZV9wYXJlbnRfcGF0aCggJG0tPntmaWxlX2J9ICk7CisJCQlzeXMocXcoc3ZuIG12IC0tZm9yY2UpLCAkbS0+e2ZpbGVfYX0sICRtLT57ZmlsZV9ifSk7CisJCQlhcHBseV9tb2RfbGluZV9ibG9iKCRtKTsKKwkJCXN2bl9jaGVja19wcm9wX2V4ZWN1dGFibGUoJG0pOworCQl9IGVsc2lmICgkbS0+e2NoZ30gZXEgJ00nKSB7CisJCQlhcHBseV9tb2RfbGluZV9ibG9iKCRtKTsKKwkJCXN2bl9jaGVja19wcm9wX2V4ZWN1dGFibGUoJG0pOworCQl9IGVsc2lmICgkbS0+e2NoZ30gZXEgJ1QnKSB7CisJCQlzeXMocXcoc3ZuIHJtIC0tZm9yY2UpLCRtLT57ZmlsZV9ifSk7CisJCQlhcHBseV9tb2RfbGluZV9ibG9iKCRtKTsKKwkJCXN5cyhxdyhzdm4gYWRkKSwgJG0tPntmaWxlX2J9KTsKKwkJCXN2bl9jaGVja19wcm9wX2V4ZWN1dGFibGUoJG0pOworCQl9IGVsc2lmICgkbS0+e2NoZ30gZXEgJ0EnKSB7CisJCQlzdm5fZW5zdXJlX3BhcmVudF9wYXRoKCAkbS0+e2ZpbGVfYn0gKTsKKwkJCWFwcGx5X21vZF9saW5lX2Jsb2IoJG0pOworCQkJc3lzKHF3KHN2biBhZGQpLCAkbS0+e2ZpbGVfYn0pOworCQkJc3ZuX2NoZWNrX3Byb3BfZXhlY3V0YWJsZSgkbSk7CisJCX0gZWxzZSB7CisJCQljcm9hayAiSW52YWxpZCBjaGc6ICRtLT57Y2hnfVxuIjsKKwkJfQorCX0KKworCWFzc2VydF90cmVlKCR0cmVlaXNoKTsKKwlpZiAoJF9ybWRpcikgeyAjIHJlbW92ZSBlbXB0eSBkaXJlY3RvcmllcworCQloYW5kbGVfcm1kaXIoJHJtLCAkYWRkKTsKKwl9CisJYXNzZXJ0X3RyZWUoJHRyZWVpc2gpOworCXJldHVybiAkbW9kczsKK30KKworc3ViIGxpYnN2bl9jaGVja291dF90cmVlIHsKKwlteSAoJGZyb20sICR0cmVlaXNoLCAkZWQpID0gQF87CisJbXkgJG1vZHMgPSBnZXRfZGlmZigkZnJvbSwgJHRyZWVpc2gpOworCXJldHVybiAkbW9kcyB1bmxlc3MgKHNjYWxhciBAJG1vZHMpOworCW15ICVvID0gKCBEID0+IDEsIFIgPT4gMCwgQyA9PiAtMSwgQSA9PiAzLCBNID0+IDMsIFQgPT4gMyApOworCWZvcmVhY2ggbXkgJG0gKHNvcnQgeyAkb3skYS0+e2NoZ319IDw9PiAkb3skYi0+e2NoZ319IH0gQCRtb2RzKSB7CisJCW15ICRmID0gJG0tPntjaGd9OworCQlpZiAoZGVmaW5lZCAkb3skZn0pIHsKKwkJCSRlZC0+JGYoJG0sICRfcSk7CisJCX0gZWxzZSB7CisJCQljcm9hayAiSW52YWxpZCBjaGFuZ2UgdHlwZTogJGZcbiI7CisJCX0KKwl9CisJJGVkLT5ybWRpcnMoJF9xKSBpZiAkX3JtZGlyOworCXJldHVybiAkbW9kczsKK30KKworIyBzdm4gbHMgZG9lc24ndCB3b3JrIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudCB3b3JraW5nIHRyZWUsIGJ1dCB3aGF0J3MKKyMgaW4gdGhlIHJlcG9zaXRvcnkuICBUaGVyZSdzIG5vdCBldmVuIGFuIG9wdGlvbiBmb3IgaXQuLi4gKnNpZ2gqCisjIChhZGRlZCBmaWxlcyBkb24ndCBzaG93IHVwIGFuZCByZW1vdmVkIGZpbGVzIHJlbWFpbiBpbiB0aGUgbHMgbGlzdGluZykKK3N1YiBzdm5fbHNfY3VycmVudCB7CisJbXkgKCRkaXIsICRybSwgJGFkZCkgPSBAXzsKKwljaG9tcChteSBAbHMgPSBzYWZlX3F4KCdzdm4nLCdscycsJGRpcikpOworCW15IEByZXQgPSAoKTsKKwlmb3JlYWNoIChAbHMpIHsKKwkJcyMvJCMjOyAjIHRyYWlsaW5nIHNsYXNoZXMgYXJlIGV2aWwKKwkJcHVzaCBAcmV0LCAkXyB1bmxlc3MgJHJtLT57JGRpcn0tPnskX307CisJfQorCWlmIChleGlzdHMgJGFkZC0+eyRkaXJ9KSB7CisJCXB1c2ggQHJldCwga2V5cyAleyRhZGQtPnskZGlyfX07CisJfQorCXJldHVybiBcQHJldDsKK30KKworc3ViIGhhbmRsZV9ybWRpciB7CisJbXkgKCRybSwgJGFkZCkgPSBAXzsKKworCWZvcmVhY2ggbXkgJGRpciAoc29ydCB7bGVuZ3RoICRiIDw9PiBsZW5ndGggJGF9IGtleXMgJSRybSkgeworCQlteSAkbHMgPSBzdm5fbHNfY3VycmVudCgkZGlyLCAkcm0sICRhZGQpOworCQluZXh0IGlmIChzY2FsYXIgQCRscyk7CisJCXN5cyhxdyhzdm4gcm0gLS1mb3JjZSksJGRpcik7CisKKwkJbXkgJGRuID0gZGlybmFtZSAkZGlyOworCQkkcm0tPnsgJGRuIH0tPnsgYmFzZW5hbWUgJGRpciB9ID0gMTsKKwkJJGxzID0gc3ZuX2xzX2N1cnJlbnQoJGRuLCAkcm0sICRhZGQpOworCQl3aGlsZSAoc2NhbGFyIEAkbHMgPT0gMCAmJiAkZG4gbmUgRmlsZTo6U3BlYy0+Y3VyZGlyKSB7CisJCQlzeXMocXcoc3ZuIHJtIC0tZm9yY2UpLCRkbik7CisJCQkkZGlyID0gYmFzZW5hbWUgJGRuOworCQkJJGRuID0gZGlybmFtZSAkZG47CisJCQkkcm0tPnsgJGRuIH0tPnsgJGRpciB9ID0gMTsKKwkJCSRscyA9IHN2bl9sc19jdXJyZW50KCRkbiwgJHJtLCAkYWRkKTsKKwkJfQorCX0KK30KKworc3ViIGdldF9jb21taXRfbWVzc2FnZSB7CisJbXkgKCRjb21taXQsICRjb21taXRfbXNnKSA9IChAXyk7CisJbXkgJWxvZ19tc2cgPSAoIG1zZyA9PiAnJyApOworCW9wZW4gbXkgJG1zZywgJz4nLCAkY29tbWl0X21zZyBvciBjcm9hayAkITsKKworCWNob21wKG15ICR0eXBlID0gYGdpdC1jYXQtZmlsZSAtdCAkY29tbWl0YCk7CisJaWYgKCR0eXBlIGVxICdjb21taXQnIHx8ICR0eXBlIGVxICd0YWcnKSB7CisJCW15ICRwaWQgPSBvcGVuIG15ICRtc2dfZmgsICctfCc7CisJCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKworCQlpZiAoJHBpZCA9PSAwKSB7CisJCQlleGVjKCdnaXQtY2F0LWZpbGUnLCAkdHlwZSwgJGNvbW1pdCkgb3IgY3JvYWsgJCE7CisJCX0KKwkJbXkgJGluX21zZyA9IDA7CisJCXdoaWxlICg8JG1zZ19maD4pIHsKKwkJCWlmICghJGluX21zZykgeworCQkJCSRpbl9tc2cgPSAxIGlmICgvXlxzKiQvKTsKKwkJCX0gZWxzaWYgKC9eZ2l0LXN2bi1pZDogLykgeworCQkJCSMgc2tpcCB0aGlzLCB3ZSByZWdlbmVyYXRlIHRoZSBjb3JyZWN0IG9uZQorCQkJCSMgb24gcmUtZmV0Y2ggYW55d2F5cworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAkbXNnICRfIG9yIGNyb2FrICQhOworCQkJfQorCQl9CisJCWNsb3NlICRtc2dfZmggb3IgY3JvYWsgJD87CisJfQorCWNsb3NlICRtc2cgb3IgY3JvYWsgJCE7CisKKwlpZiAoJF9lZGl0IHx8ICgkdHlwZSBlcSAndHJlZScpKSB7CisJCW15ICRlZGl0b3IgPSAkRU5We1ZJU1VBTH0gfHwgJEVOVntFRElUT1J9IHx8ICd2aSc7CisJCXN5c3RlbSgkZWRpdG9yLCAkY29tbWl0X21zZyk7CisJfQorCisJIyBmaWxlX3RvX3MgcmVtb3ZlcyBhbGwgdHJhaWxpbmcgbmV3bGluZXMsIHNvIGp1c3QgdXNlIGNob21wKCkgaGVyZToKKwlvcGVuICRtc2csICc8JywgJGNvbW1pdF9tc2cgb3IgY3JvYWsgJCE7CisJeyBsb2NhbCAkLzsgY2hvbXAoJGxvZ19tc2d7bXNnfSA9IDwkbXNnPik7IH0KKwljbG9zZSAkbXNnIG9yIGNyb2FrICQhOworCisJcmV0dXJuIFwlbG9nX21zZzsKK30KKworc3ViIHNldF9zdm5fY29tbWl0X2VudiB7CisJaWYgKGRlZmluZWQgJExDX0FMTCkgeworCQkkRU5We0xDX0FMTH0gPSAkTENfQUxMOworCX0gZWxzZSB7CisJCWRlbGV0ZSAkRU5We0xDX0FMTH07CisJfQorfQorCitzdWIgc3ZuX2NvbW1pdF90cmVlIHsKKwlteSAoJGxhc3QsICRjb21taXQpID0gQF87CisJbXkgJGNvbW1pdF9tc2cgPSAiJEdJVF9TVk5fRElSLy5zdm4tY29tbWl0LnRtcC4kJCI7CisJbXkgJGxvZ19tc2cgPSBnZXRfY29tbWl0X21lc3NhZ2UoJGNvbW1pdCwgJGNvbW1pdF9tc2cpOworCW15ICgkb25lbGluZSkgPSAoJGxvZ19tc2ctPnttc2d9ID1+IC8oW15cblxyXSspLyk7CisJcHJpbnQgIkNvbW1pdHRpbmcgJGNvbW1pdDogJG9uZWxpbmVcbiI7CisKKwlzZXRfc3ZuX2NvbW1pdF9lbnYoKTsKKwlteSBAY2lfb3V0cHV0ID0gc2FmZV9xeChxdyhzdm4gY29tbWl0IC1GKSwkY29tbWl0X21zZyk7CisJJEVOVntMQ19BTEx9ID0gJ0MnOworCXVubGluayAkY29tbWl0X21zZzsKKwlteSAoJGNvbW1pdHRlZCkgPSAoJGNpX291dHB1dFskI2NpX291dHB1dF0gPX4gLyhcZCspLyk7CisJaWYgKCFkZWZpbmVkICRjb21taXR0ZWQpIHsKKwkJbXkgJG91dCA9IGpvaW4oIlxuIixAY2lfb3V0cHV0KTsKKwkJcHJpbnQgU1RERVJSICJXOiBUcm91YmxlIHBhcnNpbmcgXGBzdm4gY29tbWl0JyBvdXRwdXQ6XG5cbiIsCisJCQkJJG91dCwgIlxuXG5Bc3N1bWluZyBFbmdsaXNoIGxvY2FsZS4uLiI7CisJCSgkY29tbWl0dGVkKSA9ICgkb3V0ID1+IC9eQ29tbWl0dGVkIHJldmlzaW9uIFxkK1wuL3NtKTsKKwkJZGVmaW5lZCAkY29tbWl0dGVkIG9yIGRpZSAiIEZBSUxFRCFcbiIsCisJCQkiQ29tbWl0IG91dHB1dCBmYWlsZWQgdG8gcGFyc2UgY29tbWl0dGVkIHJldmlzaW9uIVxuIiwKKwkJcHJpbnQgU1RERVJSICIgT0tcbiI7CisJfQorCisJbXkgQHN2bl91cCA9IHF3KHN2biB1cCk7CisJcHVzaCBAc3ZuX3VwLCAnLS1pZ25vcmUtZXh0ZXJuYWxzJyB1bmxlc3MgJF9ub19pZ25vcmVfZXh0OworCWlmICgkX29wdGltaXplX2NvbW1pdHMgJiYgKCRjb21taXR0ZWQgPT0gKCRsYXN0LT57cmV2aXNpb259ICsgMSkpKSB7CisJCXB1c2ggQHN2bl91cCwgIi1yJGNvbW1pdHRlZCI7CisJCXN5cyhAc3ZuX3VwKTsKKwkJbXkgJGluZm8gPSBzdm5faW5mbygnLicpOworCQlteSAkZGF0ZSA9ICRpbmZvLT57J0xhc3QgQ2hhbmdlZCBEYXRlJ30gb3IgZGllICJNaXNzaW5nIGRhdGVcbiI7CisJCWlmICgkaW5mby0+eydMYXN0IENoYW5nZWQgUmV2J30gIT0gJGNvbW1pdHRlZCkgeworCQkJY3JvYWsgIiRpbmZvLT57J0xhc3QgQ2hhbmdlZCBSZXYnfSAhPSAkY29tbWl0dGVkXG4iCisJCX0KKwkJbXkgKCRZLCRtLCRkLCRILCRNLCRTLCR0eikgPSAoJGRhdGUgPX4KKwkJCQkJLyhcZHs0fSlcLShcZFxkKVwtKFxkXGQpXHMKKwkJCQkJIChcZFxkKVw6KFxkXGQpXDooXGRcZClccyhbXC1cK11cZCspL3gpCisJCQkJCSBvciBjcm9hayAiRmFpbGVkIHRvIHBhcnNlIGRhdGU6ICRkYXRlXG4iOworCQkkbG9nX21zZy0+e2RhdGV9ID0gIiR0eiAkWS0kbS0kZCAkSDokTTokUyI7CisJCSRsb2dfbXNnLT57YXV0aG9yfSA9ICRpbmZvLT57J0xhc3QgQ2hhbmdlZCBBdXRob3InfTsKKwkJJGxvZ19tc2ctPntyZXZpc2lvbn0gPSAkY29tbWl0dGVkOworCQkkbG9nX21zZy0+e21zZ30gLj0gIlxuIjsKKwkJJGxvZ19tc2ctPntwYXJlbnRzfSA9IFsgJGxhc3QtPntjb21taXR9IF07CisJCSRsb2dfbXNnLT57Y29tbWl0fSA9IGdpdF9jb21taXQoJGxvZ19tc2csICRjb21taXQpOworCQlyZXR1cm4gJGxvZ19tc2c7CisJfQorCSMgcmVzeW5jIGltbWVkaWF0ZWx5CisJcHVzaCBAc3ZuX3VwLCAiLXIkbGFzdC0+e3JldmlzaW9ufSI7CisJc3lzKEBzdm5fdXApOworCXJldHVybiBmZXRjaCgiJGNvbW1pdHRlZD0kY29tbWl0Iik7Cit9CisKK3N1YiByZXZfbGlzdF9yYXcgeworCW15IChAYXJncykgPSBAXzsKKwlteSAkcGlkID0gb3BlbiBteSAkZmgsICctfCc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCWlmICghJHBpZCkgeworCQlleGVjKHF3L2dpdC1yZXYtbGlzdCAtLXByZXR0eT1yYXcvLCBAYXJncykgb3IgY3JvYWsgJCE7CisJfQorCXJldHVybiB7IGZoID0+ICRmaCwgdCA9PiB7IH0gfTsKK30KKworc3ViIG5leHRfcmV2X2xpc3RfZW50cnkgeworCW15ICRybCA9IHNoaWZ0OworCW15ICRmaCA9ICRybC0+e2ZofTsKKwlteSAkeCA9ICRybC0+e3R9OworCXdoaWxlICg8JGZoPikgeworCQlpZiAoL15jb21taXQgKCRzaGExKSQvbykgeworCQkJaWYgKCR4LT57Y30pIHsKKwkJCQkkcmwtPnt0fSA9IHsgYyA9PiAkMSB9OworCQkJCXJldHVybiAkeDsKKwkJCX0gZWxzZSB7CisJCQkJJHgtPntjfSA9ICQxOworCQkJfQorCQl9IGVsc2lmICgvXnBhcmVudCAoJHNoYTEpJC9vKSB7CisJCQkkeC0+e3B9LT57JDF9ID0gMTsKKwkJfSBlbHNpZiAocy9eICAgIC8vKSB7CisJCQkkeC0+e219IHx8PSAnJzsKKwkJCSR4LT57bX0gLj0gJF87CisJCX0KKwl9CisJcmV0dXJuICgkeCAhPSAkcmwtPnt0fSkgPyAkeCA6IHVuZGVmOworfQorCisjIHJlYWQgdGhlIGVudGlyZSBsb2cgaW50byBhIHRlbXBvcmFyeSBmaWxlICh3aGljaCBpcyByZW1vdmVkIEFTQVApCisjIGFuZCBzdG9yZSB0aGUgZmlsZSBoYW5kbGUgKyBwYXJzZXIgc3RhdGUKK3N1YiBzdm5fbG9nX3JhdyB7CisJbXkgKEBsb2dfYXJncykgPSBAXzsKKwlteSAkbG9nX2ZoID0gSU86OkZpbGUtPm5ld190bXBmaWxlIG9yIGNyb2FrICQhOworCW15ICRwaWQgPSBmb3JrOworCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwlpZiAoISRwaWQpIHsKKwkJb3BlbiBTVERPVVQsICc+JicsICRsb2dfZmggb3IgY3JvYWsgJCE7CisJCWV4ZWMgKHF3KHN2biBsb2cpLCBAbG9nX2FyZ3MpIG9yIGNyb2FrICQhCisJfQorCXdhaXRwaWQgJHBpZCwgMDsKKwljcm9hayAkPyBpZiAkPzsKKwlzZWVrICRsb2dfZmgsIDAsIDAgb3IgY3JvYWsgJCE7CisJcmV0dXJuIHsgc3RhdGUgPT4gJ3NlcCcsIGZoID0+ICRsb2dfZmggfTsKK30KKworc3ViIG5leHRfbG9nX2VudHJ5IHsKKwlteSAkbG9nID0gc2hpZnQ7ICMgcmV0dmFsIG9mIHN2bl9sb2dfcmF3KCkKKwlteSAkcmV0ID0gdW5kZWY7CisJbXkgJGZoID0gJGxvZy0+e2ZofTsKKworCXdoaWxlICg8JGZoPikgeworCQljaG9tcDsKKwkJaWYgKC9eXC17NzJ9JC8pIHsKKwkJCWlmICgkbG9nLT57c3RhdGV9IGVxICdtc2cnKSB7CisJCQkJaWYgKCRyZXQtPntsaW5lc30pIHsKKwkJCQkJJHJldC0+e21zZ30gLj0gJF8uIlxuIjsKKwkJCQkJdW5sZXNzKC0tJHJldC0+e2xpbmVzfSkgeworCQkJCQkJJGxvZy0+e3N0YXRlfSA9ICdzZXAnOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJY3JvYWsgIkxvZyBwYXJzZSBlcnJvciBhdDogJF9cbiIsCisJCQkJCQkkcmV0LT57cmV2aXNpb259LAorCQkJCQkJIlxuIjsKKwkJCQl9CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkbG9nLT57c3RhdGV9IG5lICdzZXAnKSB7CisJCQkJY3JvYWsgIkxvZyBwYXJzZSBlcnJvciBhdDogJF9cbiIsCisJCQkJCSJzdGF0ZTogJGxvZy0+e3N0YXRlfVxuIiwKKwkJCQkJJHJldC0+e3JldmlzaW9ufSwKKwkJCQkJIlxuIjsKKwkJCX0KKwkJCSRsb2ctPntzdGF0ZX0gPSAncmV2JzsKKworCQkJIyBpZiB3ZSBoYXZlIGFuIGVtcHR5IGxvZyBtZXNzYWdlLCBwdXQgc29tZXRoaW5nIHRoZXJlOgorCQkJaWYgKCRyZXQpIHsKKwkJCQkkcmV0LT57bXNnfSB8fD0gIlxuIjsKKwkJCQlkZWxldGUgJHJldC0+e2xpbmVzfTsKKwkJCQlyZXR1cm4gJHJldDsKKwkJCX0KKwkJCW5leHQ7CisJCX0KKwkJaWYgKCRsb2ctPntzdGF0ZX0gZXEgJ3JldicgJiYgcy9ecihcZCspXHMqXHxccyovLykgeworCQkJbXkgJHJldiA9ICQxOworCQkJbXkgKCRhdXRob3IsICRkYXRlLCAkbGluZXMpID0gc3BsaXQoL1xzKlx8XHMqLywgJF8sIDMpOworCQkJKCRsaW5lcykgPSAoJGxpbmVzID1+IC8oXGQrKS8pOworCQkJbXkgKCRZLCRtLCRkLCRILCRNLCRTLCR0eikgPSAoJGRhdGUgPX4KKwkJCQkJLyhcZHs0fSlcLShcZFxkKVwtKFxkXGQpXHMKKwkJCQkJIChcZFxkKVw6KFxkXGQpXDooXGRcZClccyhbXC1cK11cZCspL3gpCisJCQkJCSBvciBjcm9hayAiRmFpbGVkIHRvIHBhcnNlIGRhdGU6ICRkYXRlXG4iOworCQkJJHJldCA9IHsJcmV2aXNpb24gPT4gJHJldiwKKwkJCQkJZGF0ZSA9PiAiJHR6ICRZLSRtLSRkICRIOiRNOiRTIiwKKwkJCQkJYXV0aG9yID0+ICRhdXRob3IsCisJCQkJCWxpbmVzID0+ICRsaW5lcywKKwkJCQkJbXNnID0+ICcnIH07CisJCQlpZiAoZGVmaW5lZCAkX2F1dGhvcnMgJiYgISBkZWZpbmVkICR1c2Vyc3skYXV0aG9yfSkgeworCQkJCWRpZSAiQXV0aG9yOiAkYXV0aG9yIG5vdCBkZWZpbmVkIGluICIsCisJCQkJCQkiJF9hdXRob3JzIGZpbGVcbiI7CisJCQl9CisJCQkkbG9nLT57c3RhdGV9ID0gJ21zZ19zdGFydCc7CisJCQluZXh0OworCQl9CisJCSMgc2tpcCB0aGUgZmlyc3QgYmxhbmsgbGluZSBvZiB0aGUgbWVzc2FnZToKKwkJaWYgKCRsb2ctPntzdGF0ZX0gZXEgJ21zZ19zdGFydCcgJiYgL14kLykgeworCQkJJGxvZy0+e3N0YXRlfSA9ICdtc2cnOworCQl9IGVsc2lmICgkbG9nLT57c3RhdGV9IGVxICdtc2cnKSB7CisJCQlpZiAoJHJldC0+e2xpbmVzfSkgeworCQkJCSRyZXQtPnttc2d9IC49ICRfLiJcbiI7CisJCQkJdW5sZXNzICgtLSRyZXQtPntsaW5lc30pIHsKKwkJCQkJJGxvZy0+e3N0YXRlfSA9ICdzZXAnOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY3JvYWsgIkxvZyBwYXJzZSBlcnJvciBhdDogJF9cbiIsCisJCQkJCSRyZXQtPntyZXZpc2lvbn0sIlxuIjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gJHJldDsKK30KKworc3ViIHN2bl9pbmZvIHsKKwlteSAkdXJsID0gc2hpZnQgfHwgJFNWTl9VUkw7CisKKwlteSAkcGlkID0gb3BlbiBteSAkaW5mb19maCwgJy18JzsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisKKwlpZiAoJHBpZCA9PSAwKSB7CisJCWV4ZWMocXcoc3ZuIGluZm8pLCR1cmwpIG9yIGNyb2FrICQhOworCX0KKworCW15ICRyZXQgPSB7fTsKKwkjIG9ubHkgc2luZ2xlLWxpbmVzIHNlZW0gdG8gZXhpc3QgaW4gc3ZuIGluZm8gb3V0cHV0CisJd2hpbGUgKDwkaW5mb19maD4pIHsKKwkJY2hvbXAgJF87CisJCWlmIChtI14oW146XSspXHMqOlxzKihcUy4qKSQjKSB7CisJCQkkcmV0LT57JDF9ID0gJDI7CisJCQlwdXNoIEB7JHJldC0+ey1vcmRlcn19LCAkMTsKKwkJfQorCX0KKwljbG9zZSAkaW5mb19maCBvciBjcm9hayAkPzsKKwlyZXR1cm4gJHJldDsKK30KKworc3ViIHN5cyB7IHN5c3RlbShAXykgPT0gMCBvciBjcm9hayAkPyB9CisKK3N1YiBkb191cGRhdGVfaW5kZXggeworCW15ICgkel9jbWQsICRjbWQsICRub190ZXh0X2Jhc2UpID0gQF87CisKKwlteSAkeiA9IG9wZW4gbXkgJHAsICctfCc7CisJZGVmaW5lZCAkeiBvciBjcm9hayAkITsKKwl1bmxlc3MgKCR6KSB7IGV4ZWMgQCR6X2NtZCBvciBjcm9hayAkISB9CisKKwlteSAkcGlkID0gb3BlbiBteSAkdWksICd8LSc7CisJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCXVubGVzcyAoJHBpZCkgeworCQlleGVjKCdnaXQtdXBkYXRlLWluZGV4JywiLS0kY21kIiwnLXonLCctLXN0ZGluJykgb3IgY3JvYWsgJCE7CisJfQorCWxvY2FsICQvID0gIlwwIjsKKwl3aGlsZSAobXkgJHggPSA8JHA+KSB7CisJCWNob21wICR4OworCQlpZiAoISRub190ZXh0X2Jhc2UgJiYgbHN0YXQgJHggJiYgISAtbCBfICYmCisJCQkJc3ZuX3Byb3BnZXRfYmFzZSgnc3ZuOmtleXdvcmRzJywgJHgpKSB7CisJCQlteSAkbW9kZSA9IC14IF8gPyAwNzU1IDogMDY0NDsKKwkJCW15ICgkdiwkZCwkZikgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoJHgpOworCQkJbXkgJHRiID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkZCwgJy5zdm4nLCAndG1wJywKKwkJCQkJCSd0ZXh0LWJhc2UnLCIkZi5zdm4tYmFzZSIpOworCQkJJHRiID1+IHMjXi8jIzsKKwkJCXVubGVzcyAoLWYgJHRiKSB7CisJCQkJJHRiID0gRmlsZTo6U3BlYy0+Y2F0ZmlsZSgkZCwgJy5zdm4nLAorCQkJCQkJJ3RleHQtYmFzZScsIiRmLnN2bi1iYXNlIik7CisJCQkJJHRiID1+IHMjXi8jIzsKKwkJCX0KKwkJCW15IEBzID0gc3RhdCgkeCk7CisJCQl1bmxpbmsgJHggb3IgY3JvYWsgJCE7CisJCQljb3B5KCR0YiwgJHgpOworCQkJY2htb2QoKCRtb2RlICZ+IHVtYXNrKSwgJHgpIG9yIGNyb2FrICQhOworCQkJdXRpbWUgJHNbOF0sICRzWzldLCAkeDsKKwkJfQorCQlwcmludCAkdWkgJHgsIlwwIjsKKwl9CisJY2xvc2UgJHVpIG9yIGNyb2FrICQ/OworfQorCitzdWIgaW5kZXhfY2hhbmdlcyB7CisJcmV0dXJuIGlmICRfdXNlX2xpYjsKKworCWlmICghLWYgIiRHSVRfU1ZOX0RJUi9pbmZvL2V4Y2x1ZGUiKSB7CisJCW9wZW4gbXkgJGZkLCAnPj4nLCAiJEdJVF9TVk5fRElSL2luZm8vZXhjbHVkZSIgb3IgY3JvYWsgJCE7CisJCXByaW50ICRmZCAnLnN2bicsIlxuIjsKKwkJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCX0KKwlteSAkbm9fdGV4dF9iYXNlID0gc2hpZnQ7CisJZG9fdXBkYXRlX2luZGV4KFtxdy9naXQtZGlmZi1maWxlcyAtLW5hbWUtb25seSAtei9dLAorCQkJJ3JlbW92ZScsCisJCQkkbm9fdGV4dF9iYXNlKTsKKwlkb191cGRhdGVfaW5kZXgoW3F3L2dpdC1scy1maWxlcyAteiAtLW90aGVycy8sCisJCQkJIi0tZXhjbHVkZS1mcm9tPSRHSVRfU1ZOX0RJUi9pbmZvL2V4Y2x1ZGUiXSwKKwkJCSdhZGQnLAorCQkJJG5vX3RleHRfYmFzZSk7Cit9CisKK3N1YiBzX3RvX2ZpbGUgeworCW15ICgkc3RyLCAkZmlsZSwgJG1vZGUpID0gQF87CisJb3BlbiBteSAkZmQsJz4nLCRmaWxlIG9yIGNyb2FrICQhOworCXByaW50ICRmZCAkc3RyLCJcbiIgb3IgY3JvYWsgJCE7CisJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCWNobW9kICgkbW9kZSAmfiB1bWFzaywgJGZpbGUpIGlmIChkZWZpbmVkICRtb2RlKTsKK30KKworc3ViIGZpbGVfdG9fcyB7CisJbXkgJGZpbGUgPSBzaGlmdDsKKwlvcGVuIG15ICRmZCwnPCcsJGZpbGUgb3IgY3JvYWsgIiQhOiBmaWxlOiAkZmlsZVxuIjsKKwlsb2NhbCAkLzsKKwlteSAkcmV0ID0gPCRmZD47CisJY2xvc2UgJGZkIG9yIGNyb2FrICQhOworCSRyZXQgPX4gcy9ccyokLy9zOworCXJldHVybiAkcmV0OworfQorCitzdWIgYXNzZXJ0X3JldmlzaW9uX3Vua25vd24geworCW15ICRyID0gc2hpZnQ7CisJaWYgKG15ICRjID0gcmV2ZGJfZ2V0KCRSRVZEQiwgJHIpKSB7CisJCWNyb2FrICIkciA9ICRjIGFscmVhZHkgZXhpc3RzISBXaHkgYXJlIHdlIHJlZmV0Y2hpbmcgaXQ/IjsKKwl9Cit9CisKK3N1YiB0cmVlc19lcSB7CisJbXkgKCR4LCAkeSkgPSBAXzsKKwlteSBAeCA9IHNhZmVfcXgoJ2dpdC1jYXQtZmlsZScsJ2NvbW1pdCcsJHgpOworCW15IEB5ID0gc2FmZV9xeCgnZ2l0LWNhdC1maWxlJywnY29tbWl0JywkeSk7CisJaWYgKCgkeVswXSBuZSAkeFswXSkgfHwgJHhbMF0gIX4gL150cmVlICRzaGExXG4kLworCQkJCXx8ICR5WzBdICF+IC9edHJlZSAkc2hhMVxuJC8pIHsKKwkJcHJpbnQgU1RERVJSICJUcmVlcyBub3QgZXF1YWw6ICR5WzBdICE9ICR4WzBdXG4iOworCQlyZXR1cm4gMAorCX0KKwlyZXR1cm4gMTsKK30KKworc3ViIGdpdF9jb21taXQgeworCW15ICgkbG9nX21zZywgQHBhcmVudHMpID0gQF87CisJYXNzZXJ0X3JldmlzaW9uX3Vua25vd24oJGxvZ19tc2ctPntyZXZpc2lvbn0pOworCW1hcF90cmVlX2pvaW5zKCkgaWYgKEBfYnJhbmNoX2Zyb20gJiYgISV0cmVlX21hcCk7CisKKwlteSAoQHRtcF9wYXJlbnRzLCBAZXhlY19wYXJlbnRzLCAlc2Vlbl9wYXJlbnQpOworCWlmIChteSAkbHBhcmVudHMgPSAkbG9nX21zZy0+e3BhcmVudHN9KSB7CisJCUB0bXBfcGFyZW50cyA9IEAkbHBhcmVudHMKKwl9CisJIyBjb21taXQgcGFyZW50cyBjYW4gYmUgY29uZGl0aW9uYWxseSBib3VuZCB0byBhIHBhcnRpY3VsYXIKKwkjIHN2biByZXZpc2lvbiB2aWE6ICJzdm5fcmV2bm89Y29tbWl0X3NoYTEiLCBmaWx0ZXIgdGhlbSBvdXQgaGVyZToKKwlmb3JlYWNoIG15ICRwIChAcGFyZW50cykgeworCQluZXh0IHVubGVzcyBkZWZpbmVkICRwOworCQlpZiAoJHAgPX4gL14oXGQrKT0oJHNoYTFfc2hvcnQpJC9vKSB7CisJCQlpZiAoJDEgPT0gJGxvZ19tc2ctPntyZXZpc2lvbn0pIHsKKwkJCQlwdXNoIEB0bXBfcGFyZW50cywgJDI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwdXNoIEB0bXBfcGFyZW50cywgJHAgaWYgJHAgPX4gLyRzaGExX3Nob3J0L287CisJCX0KKwl9CisJbXkgJHRyZWUgPSAkbG9nX21zZy0+e3RyZWV9OworCWlmICghZGVmaW5lZCAkdHJlZSkgeworCQlteSAkaW5kZXggPSBzZXRfaW5kZXgoJEdJVF9TVk5fSU5ERVgpOworCQlpbmRleF9jaGFuZ2VzKCk7CisJCWNob21wKCR0cmVlID0gYGdpdC13cml0ZS10cmVlYCk7CisJCWNyb2FrICQ/IGlmICQ/OworCQlyZXN0b3JlX2luZGV4KCRpbmRleCk7CisJfQorCisJIyBqdXN0IGluIGNhc2Ugd2UgY2xvYmJlciB0aGUgZXhpc3RpbmcgcmVmLCB3ZSBzdGlsbCB3YW50IHRoYXQgcmVmCisJIyBhcyBvdXIgcGFyZW50OgorCWlmIChteSAkY3VyID0gZXZhbCB7IGZpbGVfdG9fcygiJEdJVF9ESVIvcmVmcy9yZW1vdGVzLyRHSVRfU1ZOIikgfSkgeworCQlwdXNoIEB0bXBfcGFyZW50cywgJGN1cjsKKwl9CisKKwlpZiAoZXhpc3RzICR0cmVlX21hcHskdHJlZX0pIHsKKwkJZm9yZWFjaCBteSAkcCAoQHskdHJlZV9tYXB7JHRyZWV9fSkgeworCQkJbXkgJHNraXA7CisJCQlmb3JlYWNoIChAdG1wX3BhcmVudHMpIHsKKwkJCQkjIHNlZSBpZiBhIGNvbW1vbiBwYXJlbnQgaXMgZm91bmQKKwkJCQlteSAkbWIgPSBldmFsIHsKKwkJCQkJc2FmZV9xeCgnZ2l0LW1lcmdlLWJhc2UnLCAkXywgJHApCisJCQkJfTsKKwkJCQluZXh0IGlmICgkQCB8fCAkPyk7CisJCQkJJHNraXAgPSAxOworCQkJCWxhc3Q7CisJCQl9CisJCQluZXh0IGlmICRza2lwOworCQkJbXkgKCR1cmxfcCwgJHJfcCwgJHV1aWRfcCkgPSBjbXRfbWV0YWRhdGEoJHApOworCQkJbmV4dCBpZiAoKCRTVk5fVVVJRCBlcSAkdXVpZF9wKSAmJgorCQkJCQkJKCRsb2dfbXNnLT57cmV2aXNpb259ID4gJHJfcCkpOworCQkJbmV4dCBpZiAoZGVmaW5lZCAkdXJsX3AgJiYgZGVmaW5lZCAkU1ZOX1VSTCAmJgorCQkJCQkJKCRTVk5fVVVJRCBlcSAkdXVpZF9wKSAmJgorCQkJCQkJKCR1cmxfcCBlcSAkU1ZOX1VSTCkpOworCQkJcHVzaCBAdG1wX3BhcmVudHMsICRwOworCQl9CisJfQorCWZvcmVhY2ggKEB0bXBfcGFyZW50cykgeworCQluZXh0IGlmICRzZWVuX3BhcmVudHskX307CisJCSRzZWVuX3BhcmVudHskX30gPSAxOworCQlwdXNoIEBleGVjX3BhcmVudHMsICRfOworCQkjIE1BWFBBUkVOVCBpcyBkZWZpbmVkIHRvIDE2IGluIGNvbW1pdC10cmVlLmM6CisJCWxhc3QgaWYgQGV4ZWNfcGFyZW50cyA+IDE2OworCX0KKworCXNldF9jb21taXRfZW52KCRsb2dfbXNnKTsKKwlteSBAZXhlYyA9ICgnZ2l0LWNvbW1pdC10cmVlJywgJHRyZWUpOworCXB1c2ggQGV4ZWMsICctcCcsICRfICBmb3JlYWNoIEBleGVjX3BhcmVudHM7CisJZGVmaW5lZChteSAkcGlkID0gb3BlbjMobXkgJG1zZ19maCwgbXkgJG91dF9maCwgJz4mU1RERVJSJywgQGV4ZWMpKQorCQkJCQkJCQlvciBjcm9hayAkITsKKwlwcmludCAkbXNnX2ZoICRsb2dfbXNnLT57bXNnfSBvciBjcm9hayAkITsKKwl1bmxlc3MgKCRfbm9fbWV0YWRhdGEpIHsKKwkJcHJpbnQgJG1zZ19maCAiXG5naXQtc3ZuLWlkOiAkU1ZOX1VSTFxAJGxvZ19tc2ctPntyZXZpc2lvbn0iLAorCQkJCQkiICRTVk5fVVVJRFxuIiBvciBjcm9hayAkITsKKwl9CisJJG1zZ19maC0+Zmx1c2ggPT0gMCBvciBjcm9hayAkITsKKwljbG9zZSAkbXNnX2ZoIG9yIGNyb2FrICQhOworCWNob21wKG15ICRjb21taXQgPSBkbyB7IGxvY2FsICQvOyA8JG91dF9maD4gfSk7CisJY2xvc2UgJG91dF9maCBvciBjcm9hayAkITsKKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgJD8gaWYgJD87CisJaWYgKCRjb21taXQgIX4gL14kc2hhMSQvbykgeworCQlkaWUgIkZhaWxlZCB0byBjb21taXQsIGludmFsaWQgc2hhMTogJGNvbW1pdFxuIjsKKwl9CisJc3lzKCdnaXQtdXBkYXRlLXJlZicsInJlZnMvcmVtb3Rlcy8kR0lUX1NWTiIsJGNvbW1pdCk7CisJcmV2ZGJfc2V0KCRSRVZEQiwgJGxvZ19tc2ctPntyZXZpc2lvbn0sICRjb21taXQpOworCisJIyB0aGlzIG91dHB1dCBpcyByZWFkIHZpYSBwaXBlLCBkbyBub3QgY2hhbmdlOgorCXByaW50ICJyJGxvZ19tc2ctPntyZXZpc2lvbn0gPSAkY29tbWl0XG4iOworCWNoZWNrX3JlcGFjaygpOworCXJldHVybiAkY29tbWl0OworfQorCitzdWIgY2hlY2tfcmVwYWNrIHsKKwlpZiAoJF9yZXBhY2sgJiYgKC0tJF9yZXBhY2tfbnIgPT0gMCkpIHsKKwkJJF9yZXBhY2tfbnIgPSAkX3JlcGFjazsKKwkJc3lzKCJnaXQgcmVwYWNrICRfcmVwYWNrX2ZsYWdzIik7CisJfQorfQorCitzdWIgc2V0X2NvbW1pdF9lbnYgeworCW15ICgkbG9nX21zZykgPSBAXzsKKwlteSAkYXV0aG9yID0gJGxvZ19tc2ctPnthdXRob3J9OworCWlmICghZGVmaW5lZCAkYXV0aG9yIHx8IGxlbmd0aCAkYXV0aG9yID09IDApIHsKKwkJJGF1dGhvciA9ICcobm8gYXV0aG9yKSc7CisJfQorCW15ICgkbmFtZSwkZW1haWwpID0gZGVmaW5lZCAkdXNlcnN7JGF1dGhvcn0gPyAgQHskdXNlcnN7JGF1dGhvcn19CisJCQkJOiAoJGF1dGhvciwiJGF1dGhvclxAJFNWTl9VVUlEIik7CisJJEVOVntHSVRfQVVUSE9SX05BTUV9ID0gJEVOVntHSVRfQ09NTUlUVEVSX05BTUV9ID0gJG5hbWU7CisJJEVOVntHSVRfQVVUSE9SX0VNQUlMfSA9ICRFTlZ7R0lUX0NPTU1JVFRFUl9FTUFJTH0gPSAkZW1haWw7CisJJEVOVntHSVRfQVVUSE9SX0RBVEV9ID0gJEVOVntHSVRfQ09NTUlUVEVSX0RBVEV9ID0gJGxvZ19tc2ctPntkYXRlfTsKK30KKworc3ViIGFwcGx5X21vZF9saW5lX2Jsb2IgeworCW15ICRtID0gc2hpZnQ7CisJaWYgKCRtLT57bW9kZV9ifSA9fiAvXjEyMC8pIHsKKwkJYmxvYl90b19zeW1saW5rKCRtLT57c2hhMV9ifSwgJG0tPntmaWxlX2J9KTsKKwl9IGVsc2UgeworCQlibG9iX3RvX2ZpbGUoJG0tPntzaGExX2J9LCAkbS0+e2ZpbGVfYn0pOworCX0KK30KKworc3ViIGJsb2JfdG9fc3ltbGluayB7CisJbXkgKCRibG9iLCAkbGluaykgPSBAXzsKKwlkZWZpbmVkICRsaW5rIG9yIGNyb2FrICJcJGxpbmsgbm90IGRlZmluZWQhXG4iOworCWNyb2FrICJOb3QgYSBzaGExOiAkYmxvYlxuIiB1bmxlc3MgJGJsb2IgPX4gL14kc2hhMSQvbzsKKwlpZiAoLWwgJGxpbmsgfHwgLWYgXykgeworCQl1bmxpbmsgJGxpbmsgb3IgY3JvYWsgJCE7CisJfQorCisJbXkgJGRlc3QgPSBgZ2l0LWNhdC1maWxlIGJsb2IgJGJsb2JgOyAjIG5vIG5ld2xpbmUsIHNvIG5vIGNob21wCisJc3ltbGluayAkZGVzdCwgJGxpbmsgb3IgY3JvYWsgJCE7Cit9CisKK3N1YiBibG9iX3RvX2ZpbGUgeworCW15ICgkYmxvYiwgJGZpbGUpID0gQF87CisJZGVmaW5lZCAkZmlsZSBvciBjcm9hayAiXCRmaWxlIG5vdCBkZWZpbmVkIVxuIjsKKwljcm9hayAiTm90IGEgc2hhMTogJGJsb2JcbiIgdW5sZXNzICRibG9iID1+IC9eJHNoYTEkL287CisJaWYgKC1sICRmaWxlIHx8IC1mIF8pIHsKKwkJdW5saW5rICRmaWxlIG9yIGNyb2FrICQhOworCX0KKworCW9wZW4gbXkgJGJsb2JfZmgsICc+JywgJGZpbGUgb3IgY3JvYWsgIiQhOiAkZmlsZVxuIjsKKwlteSAkcGlkID0gZm9yazsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisKKwlpZiAoJHBpZCA9PSAwKSB7CisJCW9wZW4gU1RET1VULCAnPiYnLCAkYmxvYl9maCBvciBjcm9hayAkITsKKwkJZXhlYygnZ2l0LWNhdC1maWxlJywnYmxvYicsJGJsb2IpIG9yIGNyb2FrICQhOworCX0KKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgJD8gaWYgJD87CisKKwljbG9zZSAkYmxvYl9maCBvciBjcm9hayAkITsKK30KKworc3ViIHNhZmVfcXggeworCW15ICRwaWQgPSBvcGVuIG15ICRjaGlsZCwgJy18JzsKKwlkZWZpbmVkICRwaWQgb3IgY3JvYWsgJCE7CisJaWYgKCRwaWQgPT0gMCkgeworCQlleGVjKEBfKSBvciBjcm9hayAkITsKKwl9CisJbXkgQHJldCA9ICg8JGNoaWxkPik7CisJY2xvc2UgJGNoaWxkIG9yIGNyb2FrICQ/OworCWRpZSAkPyBpZiAkPzsgIyBqdXN0IGluIGNhc2UgY2xvc2UgZGlkbid0IGVycm9yIG91dAorCXJldHVybiB3YW50YXJyYXkgPyBAcmV0IDogam9pbignJyxAcmV0KTsKK30KKworc3ViIHN2bl9jb21wYXRfY2hlY2sgeworCWlmICgkX2ZvbGxvd19wYXJlbnQpIHsKKwkJcHJpbnQgU1RERVJSICdFOiAtLWZvbGxvdy1wYXJlbnQgZnVuY3Rpb25hbGl0eSBpcyBvbmx5ICcsCisJCQkJImF2YWlsYWJsZSB3aGVuIFNWTiBsaWJyYXJpZXMgYXJlIHVzZWRcbiI7CisJCWV4aXQgMTsKKwl9CisJbXkgQGNvX2hlbHAgPSBzYWZlX3F4KHF3KHN2biBjbyAtaCkpOworCXVubGVzcyAoZ3JlcCAvaWdub3JlLWV4dGVybmFscy8sQGNvX2hlbHApIHsKKwkJcHJpbnQgU1RERVJSICJXOiBJbnN0YWxsZWQgc3ZuIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCAiLAorCQkJCSItLWlnbm9yZS1leHRlcm5hbHNcbiI7CisJCSRfbm9faWdub3JlX2V4dCA9IDE7CisJfQorCWlmIChncmVwIC91c2FnZTogY2hlY2tvdXQgVVJMXFtcQFJFVlxdLyxAY29faGVscCkgeworCQkkX3N2bl9jb191cmxfcmV2cyA9IDE7CisJfQorCWlmIChncmVwIC9cW1RBUkdFVFxbXEBSRVZcXVwuXC5cLlxdLywgYHN2biBwcm9wZ2V0IC1oYCkgeworCQkkX3N2bl9wZ19wZWdfcmV2cyA9IDE7CisJfQorCisJIyBJIHJlYWxseSwgcmVhbGx5IGhvcGUgbm9ib2R5IGhpdHMgdGhpcy4uLgorCXVubGVzcyAoZ3JlcCAvc3RvcC1vbi1jb3B5LywgKHNhZmVfcXgocXcoc3ZuIGxvZyAtaCkpKSkgeworCQlwcmludCBTVERFUlIgPDwnJzsKK1c6IFRoZSBpbnN0YWxsZWQgc3ZuIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgLS1zdG9wLW9uLWNvcHkgZmxhZyBpbgorICAgdGhlIGxvZyBjb21tYW5kLgorICAgTGV0cyBob3BlIHRoZSBkaXJlY3RvcnkgeW91J3JlIHRyYWNraW5nIGlzIG5vdCBhIGJyYW5jaCBvciB0YWcKKyAgIGFuZCB3YXMgbmV2ZXIgbW92ZWQgd2l0aGluIHRoZSByZXBvc2l0b3J5Li4uCisKKwkJJF9ub19zdG9wX2NvcHkgPSAxOworCX0KK30KKworIyAqc2lnaCosIG5ldyB2ZXJzaW9ucyBvZiBzdm4gd29uJ3QgaG9ub3IgLXI8cmV2PiB3aXRob3V0IFVSTEA8cmV2PiwKKyMgKGFuZCB0aGV5IHdvbid0IGhvbm9yIFVSTEA8cmV2PiB3aXRob3V0IC1yPHJldj4sIHRvbyEpCitzdWIgc3ZuX2NtZF9jaGVja291dCB7CisJbXkgKCR1cmwsICRyZXYsICRkaXIpID0gQF87CisJbXkgQGNtZCA9ICgnc3ZuJywnY28nLCAiLXIkcmV2Iik7CisJcHVzaCBAY21kLCAnLS1pZ25vcmUtZXh0ZXJuYWxzJyB1bmxlc3MgJF9ub19pZ25vcmVfZXh0OworCSR1cmwgLj0gIlxAJHJldiIgaWYgJF9zdm5fY29fdXJsX3JldnM7CisJc3lzKEBjbWQsICR1cmwsICRkaXIpOworfQorCitzdWIgY2hlY2tfdXBncmFkZV9uZWVkZWQgeworCWlmICghLXIgJFJFVkRCKSB7CisJCS1kICRHSVRfU1ZOX0RJUiBvciBta3BhdGgoWyRHSVRfU1ZOX0RJUl0pOworCQlvcGVuIG15ICRmaCwgJz4+JywkUkVWREIgb3IgY3JvYWsgJCE7CisJCWNsb3NlICRmaDsKKwl9CisJbXkgJG9sZCA9IGV2YWwgeworCQlteSAkcGlkID0gb3BlbiBteSAkY2hpbGQsICctfCc7CisJCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwkJaWYgKCRwaWQgPT0gMCkgeworCQkJY2xvc2UgU1RERVJSOworCQkJZXhlYygnZ2l0LXJldi1wYXJzZScsIiRHSVRfU1ZOLUhFQUQiKSBvciBjcm9hayAkITsKKwkJfQorCQlteSBAcmV0ID0gKDwkY2hpbGQ+KTsKKwkJY2xvc2UgJGNoaWxkIG9yIGNyb2FrICQ/OworCQlkaWUgJD8gaWYgJD87ICMganVzdCBpbiBjYXNlIGNsb3NlIGRpZG4ndCBlcnJvciBvdXQKKwkJcmV0dXJuIHdhbnRhcnJheSA/IEByZXQgOiBqb2luKCcnLEByZXQpOworCX07CisJcmV0dXJuIHVubGVzcyAkb2xkOworCW15ICRoZWFkID0gZXZhbCB7IHNhZmVfcXgoJ2dpdC1yZXYtcGFyc2UnLCJyZWZzL3JlbW90ZXMvJEdJVF9TVk4iKSB9OworCWlmICgkQCB8fCAhJGhlYWQpIHsKKwkJcHJpbnQgU1RERVJSICJQbGVhc2UgcnVuOiAkMCByZWJ1aWxkIC0tdXBncmFkZVxuIjsKKwkJZXhpdCAxOworCX0KK30KKworIyBmaWxscyAldHJlZV9tYXAgd2l0aCBhIHJldmVyc2UgbWFwcGluZyBvZiB0cmVlcyB0byBjb21taXRzLiAgVXNlZnVsCisjIGZvciBmaW5kaW5nIHBhcmVudHMgdG8gY29tbWl0IG9uLgorc3ViIG1hcF90cmVlX2pvaW5zIHsKKwlteSAlc2VlbjsKKwlmb3JlYWNoIG15ICRiciAoQF9icmFuY2hfZnJvbSkgeworCQlteSAkcGlkID0gb3BlbiBteSAkcGlwZSwgJy18JzsKKwkJZGVmaW5lZCAkcGlkIG9yIGNyb2FrICQhOworCQlpZiAoJHBpZCA9PSAwKSB7CisJCQlleGVjKHF3KGdpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgLS1wcmV0dHk9cmF3KSwgJGJyKQorCQkJCQkJCQlvciBjcm9hayAkITsKKwkJfQorCQl3aGlsZSAoPCRwaXBlPikgeworCQkJaWYgKC9eY29tbWl0ICgkc2hhMSkkL28pIHsKKwkJCQlteSAkY29tbWl0ID0gJDE7CisKKwkJCQkjIGlmIHdlJ3ZlIHNlZW4gYSBjb21taXQsCisJCQkJIyB3ZSd2ZSBzZWVuIGl0cyBwYXJlbnRzCisJCQkJbGFzdCBpZiAkc2VlbnskY29tbWl0fTsKKwkJCQlteSAoJHRyZWUpID0gKDwkcGlwZT4gPX4gL150cmVlICgkc2hhMSkkL28pOworCQkJCXVubGVzcyAoZGVmaW5lZCAkdHJlZSkgeworCQkJCQlkaWUgIkZhaWxlZCB0byBwYXJzZSBjb21taXQgJGNvbW1pdFxuIjsKKwkJCQl9CisJCQkJcHVzaCBAeyR0cmVlX21hcHskdHJlZX19LCAkY29tbWl0OworCQkJCSRzZWVueyRjb21taXR9ID0gMTsKKwkJCX0KKwkJfQorCQljbG9zZSAkcGlwZTsgIyB3ZSBjb3VsZCBiZSBicmVha2luZyB0aGUgcGlwZSBlYXJseQorCX0KK30KKworc3ViIGxvYWRfYWxsX3JlZnMgeworCWlmIChAX2JyYW5jaF9mcm9tKSB7CisJCXByaW50IFNUREVSUiAnLS1icmFuY2h8LWIgcGFyYW1ldGVycyBhcmUgaWdub3JlZCB3aGVuICcsCisJCQkiLS1icmFuY2gtYWxsLXJlZnN8LUIgaXMgcGFzc2VkXG4iOworCX0KKworCSMgZG9uJ3Qgd29ycnkgYWJvdXQgcmV2LWxpc3Qgb24gbm9uLWNvbW1pdCBvYmplY3RzL3RhZ3MsCisJIyBpdCBzaG91bGRuJ3QgYmxvdyB1cCBpZiBhIHJlZiBpcyBhIGJsb2Igb3IgdHJlZS4uLgorCWNob21wKEBfYnJhbmNoX2Zyb20gPSBgZ2l0LXJldi1wYXJzZSAtLXN5bWJvbGljIC0tYWxsYCk7Cit9CisKKyMgJzxzdm4gdXNlcm5hbWU+ID0gcmVhbC1uYW1lIDxlbWFpbCBhZGRyZXNzPicgbWFwcGluZyBiYXNlZCBvbiBnaXQtc3ZuaW1wb3J0Ogorc3ViIGxvYWRfYXV0aG9ycyB7CisJb3BlbiBteSAkYXV0aG9ycywgJzwnLCAkX2F1dGhvcnMgb3IgZGllICJDYW4ndCBvcGVuICRfYXV0aG9ycyAkIVxuIjsKKwl3aGlsZSAoPCRhdXRob3JzPikgeworCQljaG9tcDsKKwkJbmV4dCB1bmxlc3MgL14oXFMrPylccyo9XHMqKC4rPylccyo8KC4rKT5ccyokLzsKKwkJbXkgKCR1c2VyLCAkbmFtZSwgJGVtYWlsKSA9ICgkMSwgJDIsICQzKTsKKwkJJHVzZXJzeyR1c2VyfSA9IFskbmFtZSwgJGVtYWlsXTsKKwl9CisJY2xvc2UgJGF1dGhvcnMgb3IgY3JvYWsgJCE7Cit9CisKK3N1YiBybG9hZF9hdXRob3JzIHsKKwlvcGVuIG15ICRhdXRob3JzLCAnPCcsICRfYXV0aG9ycyBvciBkaWUgIkNhbid0IG9wZW4gJF9hdXRob3JzICQhXG4iOworCXdoaWxlICg8JGF1dGhvcnM+KSB7CisJCWNob21wOworCQluZXh0IHVubGVzcyAvXihcUys/KVxzKj1ccyooLis/KVxzKjwoLispPlxzKiQvOworCQlteSAoJHVzZXIsICRuYW1lLCAkZW1haWwpID0gKCQxLCAkMiwgJDMpOworCQkkcnVzZXJzeyIkbmFtZSA8JGVtYWlsPiJ9ID0gJHVzZXI7CisJfQorCWNsb3NlICRhdXRob3JzIG9yIGNyb2FrICQhOworfQorCitzdWIgc3ZuX3Byb3BnZXRfYmFzZSB7CisJbXkgKCRwLCAkZikgPSBAXzsKKwkkZiAuPSAnQEJBU0UnIGlmICRfc3ZuX3BnX3BlZ19yZXZzOworCXJldHVybiBzYWZlX3F4KHF3L3N2biBwcm9wZ2V0LywgJHAsICRmKTsKK30KKworc3ViIGdpdF9zdm5fZWFjaCB7CisJbXkgJHN1YiA9IHNoaWZ0OworCWZvcmVhY2ggKGBnaXQtcmV2LXBhcnNlIC0tc3ltYm9saWMgLS1hbGxgKSB7CisJCW5leHQgdW5sZXNzIHMjXnJlZnMvcmVtb3Rlcy8jIzsKKwkJY2hvbXAgJF87CisJCW5leHQgdW5sZXNzIC1mICIkR0lUX0RJUi9zdm4vJF8vaW5mby91cmwiOworCQkmJHN1YigkXyk7CisJfQorfQorCitzdWIgbWlncmF0ZV9yZXZkYiB7CisJZ2l0X3N2bl9lYWNoKHN1YiB7CisJCW15ICRpZCA9IHNoaWZ0OworCQlkZWZpbmVkKG15ICRwaWQgPSBmb3JrKSBvciBjcm9hayAkITsKKwkJaWYgKCEkcGlkKSB7CisJCQkkR0lUX1NWTiA9ICRFTlZ7R0lUX1NWTl9JRH0gPSAkaWQ7CisJCQlpbml0X3ZhcnMoKTsKKwkJCWV4aXQgMCBpZiAtciAkUkVWREI7CisJCQlwcmludCAiVXBncmFkaW5nIHN2biA9PiBnaXQgbWFwcGluZy4uLlxuIjsKKwkJCS1kICRHSVRfU1ZOX0RJUiBvciBta3BhdGgoWyRHSVRfU1ZOX0RJUl0pOworCQkJb3BlbiBteSAkZmgsICc+PicsJFJFVkRCIG9yIGNyb2FrICQhOworCQkJY2xvc2UgJGZoOworCQkJcmVidWlsZCgpOworCQkJcHJpbnQgIkRvbmUgdXBncmFkaW5nLiBZb3UgbWF5IG5vdyBkZWxldGUgdGhlICIsCisJCQkJImRlcHJlY2F0ZWQgJEdJVF9TVk5fRElSL3JldnMgZGlyZWN0b3J5XG4iOworCQkJZXhpdCAwOworCQl9CisJCXdhaXRwaWQgJHBpZCwgMDsKKwkJY3JvYWsgJD8gaWYgJD87CisJfSk7Cit9CisKK3N1YiBtaWdyYXRpb25fY2hlY2sgeworCW1pZ3JhdGVfcmV2ZGIoKSB1bmxlc3MgKC1lICRSRVZEQik7CisJcmV0dXJuIGlmICgtZCAiJEdJVF9ESVIvc3ZuIiB8fCAhLWQgJEdJVF9ESVIpOworCXByaW50ICJVcGdyYWRpbmcgcmVwb3NpdG9yeS4uLlxuIjsKKwl1bmxlc3MgKC1kICIkR0lUX0RJUi9zdm4iKSB7CisJCW1rZGlyICIkR0lUX0RJUi9zdm4iIG9yIGNyb2FrICQhOworCX0KKwlwcmludCAiRGF0YSBmcm9tIGEgcHJldmlvdXMgdmVyc2lvbiBvZiBnaXQtc3ZuIGV4aXN0cywgYnV0XG5cdCIsCisJCQkJIiRHSVRfU1ZOX0RJUlxuXHQocmVxdWlyZWQgZm9yIHRoaXMgdmVyc2lvbiAiLAorCQkJCSIoJFZFUlNJT04pIG9mIGdpdC1zdm4pIGRvZXMgbm90LlxuIjsKKworCWZvcmVhY2ggbXkgJHggKGBnaXQtcmV2LXBhcnNlIC0tc3ltYm9saWMgLS1hbGxgKSB7CisJCW5leHQgdW5sZXNzICR4ID1+IHMjXnJlZnMvcmVtb3Rlcy8jIzsKKwkJY2hvbXAgJHg7CisJCW5leHQgdW5sZXNzIC1mICIkR0lUX0RJUi8keC9pbmZvL3VybCI7CisJCW15ICR1ID0gZXZhbCB7IGZpbGVfdG9fcygiJEdJVF9ESVIvJHgvaW5mby91cmwiKSB9OworCQluZXh0IHVubGVzcyAkdTsKKwkJbXkgJGRuID0gZGlybmFtZSgiJEdJVF9ESVIvc3ZuLyR4Iik7CisJCW1rcGF0aChbJGRuXSkgdW5sZXNzIC1kICRkbjsKKwkJcmVuYW1lICIkR0lUX0RJUi8keCIsICIkR0lUX0RJUi9zdm4vJHgiIG9yIGNyb2FrICIkITogJHgiOworCX0KKwltaWdyYXRlX3JldmRiKCkgaWYgKC1kICRHSVRfU1ZOX0RJUiAmJiAhLXcgJFJFVkRCKTsKKwlwcmludCAiRG9uZSB1cGdyYWRpbmcuXG4iOworfQorCitzdWIgZmluZF9yZXZfYmVmb3JlIHsKKwlteSAoJHIsICRpZCwgJGVxX29rKSA9IEBfOworCW15ICRmID0gIiRHSVRfRElSL3N2bi8kaWQvLnJldl9kYiI7CisJcmV0dXJuICh1bmRlZix1bmRlZikgdW5sZXNzIC1yICRmOworCS0tJHIgdW5sZXNzICRlcV9vazsKKwl3aGlsZSAoJHIgPiAwKSB7CisJCWlmIChteSAkYyA9IHJldmRiX2dldCgkZiwgJHIpKSB7CisJCQlyZXR1cm4gKCRyLCAkYyk7CisJCX0KKwkJLS0kcjsKKwl9CisJcmV0dXJuICh1bmRlZiwgdW5kZWYpOworfQorCitzdWIgaW5pdF92YXJzIHsKKwkkR0lUX1NWTiB8fD0gJEVOVntHSVRfU1ZOX0lEfSB8fCAnZ2l0LXN2bic7CisJJEdJVF9TVk5fRElSID0gIiRHSVRfRElSL3N2bi8kR0lUX1NWTiI7CisJJFJFVkRCID0gIiRHSVRfU1ZOX0RJUi8ucmV2X2RiIjsKKwkkR0lUX1NWTl9JTkRFWCA9ICIkR0lUX1NWTl9ESVIvaW5kZXgiOworCSRTVk5fVVJMID0gdW5kZWY7CisJJFNWTl9XQyA9ICIkR0lUX1NWTl9ESVIvdHJlZSI7CisJJXRyZWVfbWFwID0gKCk7Cit9CisKKyMgY29udmVydCBHZXRPcHQ6Okxvbmcgc3BlY3MgZm9yIHVzZSBieSBnaXQtcmVwby1jb25maWcKK3N1YiByZWFkX3JlcG9fY29uZmlnIHsKKwlyZXR1cm4gdW5sZXNzIC1kICRHSVRfRElSOworCW15ICRvcHRzID0gc2hpZnQ7CisJZm9yZWFjaCBteSAkbyAoa2V5cyAlJG9wdHMpIHsKKwkJbXkgJHYgPSAkb3B0cy0+eyRvfTsKKwkJbXkgKCRrZXkpID0gKCRvID1+IC9eKFthLXpcLV0rKS8pOworCQkka2V5ID1+IHMvLS8vZzsKKwkJbXkgJGFyZyA9ICdnaXQtcmVwby1jb25maWcnOworCQkkYXJnIC49ICcgLS1pbnQnIGlmICgkbyA9fiAvWzo9XWkkLyk7CisJCSRhcmcgLj0gJyAtLWJvb2wnIGlmICgkbyAhfiAvWzo9XVtzZmldJC8pOworCQlpZiAocmVmICR2IGVxICdBUlJBWScpIHsKKwkJCWNob21wKG15IEB0bXAgPSBgJGFyZyAtLWdldC1hbGwgc3ZuLiRrZXlgKTsKKwkJCUAkdiA9IEB0bXAgaWYgQHRtcDsKKwkJfSBlbHNlIHsKKwkJCWNob21wKG15ICR0bXAgPSBgJGFyZyAtLWdldCBzdm4uJGtleWApOworCQkJaWYgKCR0bXAgJiYgISgkYXJnID1+IC8gLS1ib29sIC8gJiYgJHRtcCBlcSAnZmFsc2UnKSkgeworCQkJCSQkdiA9ICR0bXA7CisJCQl9CisJCX0KKwl9Cit9CisKK3N1YiBzZXRfZGVmYXVsdF92YWxzIHsKKwlpZiAoZGVmaW5lZCAkX3JlcGFjaykgeworCQkkX3JlcGFjayA9IDEwMDAgaWYgKCRfcmVwYWNrIDw9IDApOworCQkkX3JlcGFja19uciA9ICRfcmVwYWNrOworCQkkX3JlcGFja19mbGFncyB8fD0gJy1kJzsKKwl9Cit9CisKK3N1YiByZWFkX2dyYWZ0cyB7CisJbXkgJGdyX2ZpbGUgPSBzaGlmdDsKKwlteSAoJGdyYWZ0cywgJGNvbW1lbnRzKSA9ICh7fSwge30pOworCWlmIChvcGVuIG15ICRmaCwgJzwnLCAkZ3JfZmlsZSkgeworCQlteSBAdG1wOworCQl3aGlsZSAoPCRmaD4pIHsKKwkJCWlmICgvXigkc2hhMSlccysvKSB7CisJCQkJbXkgJGMgPSAkMTsKKwkJCQlpZiAoQHRtcCkgeworCQkJCQlAeyRjb21tZW50cy0+eyRjfX0gPSBAdG1wOworCQkJCQlAdG1wID0gKCk7CisJCQkJfQorCQkJCWZvcmVhY2ggbXkgJHAgKHNwbGl0IC9ccysvLCAkXykgeworCQkJCQkkZ3JhZnRzLT57JGN9LT57JHB9ID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXB1c2ggQHRtcCwgJF87CisJCQl9CisJCX0KKwkJY2xvc2UgJGZoIG9yIGNyb2FrICQhOworCQlAeyRjb21tZW50cy0+eydFTkQnfX0gPSBAdG1wIGlmIEB0bXA7CisJfQorCXJldHVybiAoJGdyYWZ0cywgJGNvbW1lbnRzKTsKK30KKworc3ViIHdyaXRlX2dyYWZ0cyB7CisJbXkgKCRncmFmdHMsICRjb21tZW50cywgJGdyX2ZpbGUpID0gQF87CisKKwlvcGVuIG15ICRmaCwgJz4nLCAkZ3JfZmlsZSBvciBjcm9hayAkITsKKwlmb3JlYWNoIG15ICRjIChzb3J0IGtleXMgJSRncmFmdHMpIHsKKwkJaWYgKCRjb21tZW50cy0+eyRjfSkgeworCQkJcHJpbnQgJGZoICRfIGZvcmVhY2ggQHskY29tbWVudHMtPnskY319OworCQl9CisJCW15ICRwID0gJGdyYWZ0cy0+eyRjfTsKKwkJbXkgJXg7ICMgcmVhbCBwYXJlbnRzCisJCWRlbGV0ZSAkcC0+eyRjfTsgIyBjb21taXRzIGFyZSBub3Qgc2VsZi1yZXByb2R1Y2luZy4uLgorCQlteSAkcGlkID0gb3BlbiBteSAkY2gsICctfCc7CisJCWRlZmluZWQgJHBpZCBvciBjcm9hayAkITsKKwkJaWYgKCEkcGlkKSB7CisJCQlleGVjKHF3L2dpdC1jYXQtZmlsZSBjb21taXQvLCAkYykgb3IgY3JvYWsgJCE7CisJCX0KKwkJd2hpbGUgKDwkY2g+KSB7CisJCQlpZiAoL15wYXJlbnQgKCRzaGExKS8pIHsKKwkJCQkkeHskMX0gPSAkcC0+eyQxfSA9IDE7CisJCQl9IGVsc2UgeworCQkJCWxhc3QgdW5sZXNzIC9eXFMvOworCQkJfQorCQl9CisJCWNsb3NlICRjaDsgIyBicmVha2luZyB0aGUgcGlwZQorCisJCSMgaWYgcmVhbCBwYXJlbnRzIGFyZSB0aGUgb25seSBvbmVzIGluIHRoZSBncmFmdHMsIGRyb3AgaXQKKwkJbmV4dCBpZiBqb2luKCcgJyxzb3J0IGtleXMgJSRwKSBlcSBqb2luKCcgJyxzb3J0IGtleXMgJXgpOworCisJCW15IChAaXAsIEBqcCwgJG1iKTsKKwkJbXkgJWRlbCA9ICV4OworCQlAaXAgPSBAanAgPSBrZXlzICUkcDsKKwkJZm9yZWFjaCBteSAkaSAoQGlwKSB7CisJCQluZXh0IGlmICRkZWx7JGl9IHx8ICRwLT57JGl9ID09IDI7CisJCQlmb3JlYWNoIG15ICRqIChAanApIHsKKwkJCQluZXh0IGlmICRpIGVxICRqIHx8ICRkZWx7JGp9IHx8ICRwLT57JGp9ID09IDI7CisJCQkJJG1iID0gZXZhbCB7IHNhZmVfcXgoJ2dpdC1tZXJnZS1iYXNlJywkaSwkaikgfTsKKwkJCQluZXh0IHVubGVzcyAkbWI7CisJCQkJY2hvbXAgJG1iOworCQkJCW5leHQgaWYgJHh7JG1ifTsKKwkJCQlpZiAoJG1iIGVxICRqKSB7CisJCQkJCWRlbGV0ZSAkcC0+eyRpfTsKKwkJCQkJJGRlbHskaX0gPSAxOworCQkJCX0gZWxzaWYgKCRtYiBlcSAkaSkgeworCQkJCQlkZWxldGUgJHAtPnskan07CisJCQkJCSRkZWx7JGp9ID0gMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkjIGlmIHJlYWwgcGFyZW50cyBhcmUgdGhlIG9ubHkgb25lcyBpbiB0aGUgZ3JhZnRzLCBkcm9wIGl0CisJCW5leHQgaWYgam9pbignICcsc29ydCBrZXlzICUkcCkgZXEgam9pbignICcsc29ydCBrZXlzICV4KTsKKworCQlwcmludCAkZmggJGMsICcgJywgam9pbignICcsIHNvcnQga2V5cyAlJHApLCJcbiI7CisJfQorCWlmICgkY29tbWVudHMtPnsnRU5EJ30pIHsKKwkJcHJpbnQgJGZoICRfIGZvcmVhY2ggQHskY29tbWVudHMtPnsnRU5EJ319OworCX0KKwljbG9zZSAkZmggb3IgY3JvYWsgJCE7Cit9CisKK3N1YiByZWFkX3VybF9wYXRoc19hbGwgeworCW15ICgkbF9tYXAsICRwZngsICRwKSA9IEBfOworCW15IEBkaXI7CisJZm9yZWFjaCAoPCRwLyo+KSB7CisJCWlmICgtciAiJF8vaW5mby91cmwiKSB7CisJCQkkcGZ4IC49ICcvJyBpZiAkcGZ4ICYmICRwZnggIX4gbSEvJCE7CisJCQlteSAkaWQgPSAkcGZ4IC4gYmFzZW5hbWUgJF87CisJCQlteSAkdXJsID0gZmlsZV90b19zKCIkXy9pbmZvL3VybCIpOworCQkJbXkgKCR1LCAkcCkgPSByZXBvX3BhdGhfc3BsaXQoJHVybCk7CisJCQkkbF9tYXAtPnskdX0tPnskcH0gPSAkaWQ7CisJCX0gZWxzaWYgKC1kICRfKSB7CisJCQlwdXNoIEBkaXIsICRfOworCQl9CisJfQorCWZvcmVhY2ggKEBkaXIpIHsKKwkJbXkgJHggPSAkXzsKKwkJJHggPX4gcyFeXFEkR0lUX0RJUlxFL3N2bi8hIW87CisJCXJlYWRfdXJsX3BhdGhzX2FsbCgkbF9tYXAsICR4LCAkXyk7CisJfQorfQorCisjIHRoaXMgb25lIG9ubHkgZ2V0cyBpZHMgdGhhdCBoYXZlIGJlZW4gaW1wb3J0ZWQsIG5vdCBuZXcgb25lcworc3ViIHJlYWRfdXJsX3BhdGhzIHsKKwlteSAkbF9tYXAgPSB7fTsKKwlnaXRfc3ZuX2VhY2goc3ViIHsgbXkgJHggPSBzaGlmdDsKKwkJCW15ICR1cmwgPSBmaWxlX3RvX3MoIiRHSVRfRElSL3N2bi8keC9pbmZvL3VybCIpOworCQkJbXkgKCR1LCAkcCkgPSByZXBvX3BhdGhfc3BsaXQoJHVybCk7CisJCQkkbF9tYXAtPnskdX0tPnskcH0gPSAkeDsKKwkJCX0pOworCXJldHVybiAkbF9tYXA7Cit9CisKK3N1YiBleHRyYWN0X21ldGFkYXRhIHsKKwlteSAkaWQgPSBzaGlmdCBvciByZXR1cm4gKHVuZGVmLCB1bmRlZiwgdW5kZWYpOworCW15ICgkdXJsLCAkcmV2LCAkdXVpZCkgPSAoJGlkID1+IC9eZ2l0LXN2bi1pZDpccyhcUys/KVxAKFxkKykKKwkJCQkJCQlccyhbYS1mXGRcLV0rKSQveCk7CisJaWYgKCEkcmV2IHx8ICEkdXVpZCB8fCAhJHVybCkgeworCQkjIHNvbWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9zaXRvcmllcyBJIG1hZGUgaGFkCisJCSMgaWRlbnRpZmllcnMgbGlrZSB0aGlzOgorCQkoJHJldiwgJHV1aWQpID0gKCRpZCA9fi9eZ2l0LXN2bi1pZDpccyhcZCspXEAoW2EtZlxkXC1dKykvKTsKKwl9CisJcmV0dXJuICgkdXJsLCAkcmV2LCAkdXVpZCk7Cit9CisKK3N1YiBjbXRfbWV0YWRhdGEgeworCXJldHVybiBleHRyYWN0X21ldGFkYXRhKChncmVwKC9eZ2l0LXN2bi1pZDogLywKKwkJc2FmZV9xeChxdy9naXQtY2F0LWZpbGUgY29tbWl0Lywgc2hpZnQpKSlbLTFdKTsKK30KKworc3ViIGdldF9jb21taXRfdGltZSB7CisJbXkgJGNtdCA9IHNoaWZ0OworCWRlZmluZWQobXkgJHBpZCA9IG9wZW4gbXkgJGZoLCAnLXwnKSBvciBjcm9hayAkITsKKwlpZiAoISRwaWQpIHsKKwkJZXhlYyBxdy9naXQtcmV2LWxpc3QgLS1wcmV0dHk9cmF3IC1uMS8sICRjbXQgb3IgY3JvYWsgJCE7CisJfQorCXdoaWxlICg8JGZoPikgeworCQkvXmNvbW1pdHRlclxzKD86LispIChcZCspIChbXC1cK10/XGQrKSQvIG9yIG5leHQ7CisJCW15ICgkcywgJHR6KSA9ICgkMSwgJDIpOworCQlpZiAoJHR6ID1+IHMvXlwrLy8pIHsKKwkJCSRzICs9IHR6X3RvX3Nfb2Zmc2V0KCR0eik7CisJCX0gZWxzaWYgKCR0eiA9fiBzL15cLS8vKSB7CisJCQkkcyAtPSB0el90b19zX29mZnNldCgkdHopOworCQl9CisJCWNsb3NlICRmaDsKKwkJcmV0dXJuICRzOworCX0KKwlkaWUgIkNhbid0IGdldCBjb21taXQgdGltZSBmb3IgY29tbWl0OiAkY210XG4iOworfQorCitzdWIgdHpfdG9fc19vZmZzZXQgeworCW15ICgkdHopID0gQF87CisJJHR6ID1+IHMvKFxkXGQpJC8vOworCXJldHVybiAoJDEgKiA2MCkgKyAoJHR6ICogMzYwMCk7Cit9CisKK3N1YiBzZXR1cF9wYWdlciB7ICMgdHJhbnNsYXRlZCB0byBQZXJsIGZyb20gcGFnZXIuYworCXJldHVybiB1bmxlc3MgKC10ICpTVERPVVQpOworCW15ICRwYWdlciA9ICRFTlZ7UEFHRVJ9OworCWlmICghZGVmaW5lZCAkcGFnZXIpIHsKKwkJJHBhZ2VyID0gJ2xlc3MnOworCX0gZWxzaWYgKGxlbmd0aCAkcGFnZXIgPT0gMCB8fCAkcGFnZXIgZXEgJ2NhdCcpIHsKKwkJcmV0dXJuOworCX0KKwlwaXBlIG15ICRyZmQsIG15ICR3ZmQgb3IgcmV0dXJuOworCWRlZmluZWQobXkgJHBpZCA9IGZvcmspIG9yIGNyb2FrICQhOworCWlmICghJHBpZCkgeworCQlvcGVuIFNURE9VVCwgJz4mJywgJHdmZCBvciBjcm9hayAkITsKKwkJcmV0dXJuOworCX0KKwlvcGVuIFNURElOLCAnPCYnLCAkcmZkIG9yIGNyb2FrICQhOworCSRFTlZ7TEVTU30gfHw9ICctUyc7CisJZXhlYyAkcGFnZXIgb3IgY3JvYWsgIkNhbid0IHJ1biBwYWdlcjogJCFcbiI7OworfQorCitzdWIgZ2V0X2F1dGhvcl9pbmZvIHsKKwlteSAoJGRlc3QsICRhdXRob3IsICR0LCAkdHopID0gQF87CisJJGF1dGhvciA9fiBzLyg/Ol5ccyp8XHMqJCkvL2c7CisJJGRlc3QtPnthX3Jhd30gPSAkYXV0aG9yOworCW15ICRfYTsKKwlpZiAoJF9hdXRob3JzKSB7CisJCSRfYSA9ICRydXNlcnN7JGF1dGhvcn0gfHwgdW5kZWY7CisJfQorCWlmICghJF9hKSB7CisJCSgkX2EpID0gKCRhdXRob3IgPX4gLzwoW14+XSspXEBbXj5dKz4kLyk7CisJfQorCSRkZXN0LT57dH0gPSAkdDsKKwkkZGVzdC0+e3R6fSA9ICR0ejsKKwkkZGVzdC0+e2F9ID0gJF9hOworCSMgRGF0ZTo6UGFyc2UgaXNuJ3QgaW4gdGhlIHN0YW5kYXJkIFBlcmwgZGlzdHJvIDooCisJaWYgKCR0eiA9fiBzL15cKy8vKSB7CisJCSR0ICs9IHR6X3RvX3Nfb2Zmc2V0KCR0eik7CisJfSBlbHNpZiAoJHR6ID1+IHMvXlwtLy8pIHsKKwkJJHQgLT0gdHpfdG9fc19vZmZzZXQoJHR6KTsKKwl9CisJJGRlc3QtPnt0X3V0Y30gPSAkdDsKK30KKworc3ViIHByb2Nlc3NfY29tbWl0IHsKKwlteSAoJGMsICRyX21pbiwgJHJfbWF4LCAkZGVmZXIpID0gQF87CisJaWYgKGRlZmluZWQgJHJfbWluICYmIGRlZmluZWQgJHJfbWF4KSB7CisJCWlmICgkcl9taW4gPT0gJGMtPntyfSAmJiAkcl9taW4gPT0gJHJfbWF4KSB7CisJCQlzaG93X2NvbW1pdCgkYyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMSBpZiAkcl9taW4gPT0gJHJfbWF4OworCQlpZiAoJHJfbWluIDwgJHJfbWF4KSB7CisJCQkjIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgcHJpbnQgb3JkZXIKKwkJCXJldHVybiAwIGlmIChkZWZpbmVkICRfbGltaXQgJiYgLS0kX2xpbWl0IDwgMCk7CisJCQlwdXNoIEAkZGVmZXIsICRjOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKCRyX21pbiAhPSAkcl9tYXgpIHsKKwkJCXJldHVybiAxIGlmICgkcl9taW4gPCAkYy0+e3J9KTsKKwkJCXJldHVybiAxIGlmICgkcl9tYXggPiAkYy0+e3J9KTsKKwkJfQorCX0KKwlyZXR1cm4gMCBpZiAoZGVmaW5lZCAkX2xpbWl0ICYmIC0tJF9saW1pdCA8IDApOworCXNob3dfY29tbWl0KCRjKTsKKwlyZXR1cm4gMTsKK30KKworc3ViIHNob3dfY29tbWl0IHsKKwlteSAkYyA9IHNoaWZ0OworCWlmICgkX29uZWxpbmUpIHsKKwkJbXkgJHggPSAiXG4iOworCQlpZiAobXkgJGwgPSAkYy0+e2x9KSB7CisJCQl3aGlsZSAoJGwtPlswXSA9fiAvXlxzKiQvKSB7IHNoaWZ0IEAkbCB9CisJCQkkeCA9ICRsLT5bMF07CisJCX0KKwkJJF9sX2ZtdCB8fD0gJ0EnIC4gbGVuZ3RoKCRjLT57cn0pOworCQlwcmludCAncicscGFjaygkX2xfZm10LCAkYy0+e3J9KSwnIHwgJzsKKwkJcHJpbnQgIiRjLT57Y30gfCAiIGlmICRfc2hvd19jb21taXQ7CisJCXByaW50ICR4OworCX0gZWxzZSB7CisJCXNob3dfY29tbWl0X25vcm1hbCgkYyk7CisJfQorfQorCitzdWIgc2hvd19jb21taXRfbm9ybWFsIHsKKwlteSAoJGMpID0gQF87CisJcHJpbnQgJy0nIHg3MiwgIlxuciRjLT57cn0gfCAiOworCXByaW50ICIkYy0+e2N9IHwgIiBpZiAkX3Nob3dfY29tbWl0OworCXByaW50ICIkYy0+e2F9IHwgIiwgc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTICV6ICglYSwgJWQgJWIgJVkpIiwKKwkJCQkgbG9jYWx0aW1lKCRjLT57dF91dGN9KSksICcgfCAnOworCW15ICRucl9saW5lID0gMDsKKworCWlmIChteSAkbCA9ICRjLT57bH0pIHsKKwkJd2hpbGUgKCRsLT5bJCMkbF0gZXEgIlxuIiAmJiAkbC0+WygkIyRsIC0gMSldIGVxICJcbiIpIHsKKwkJCXBvcCBAJGw7CisJCX0KKwkJJG5yX2xpbmUgPSBzY2FsYXIgQCRsOworCQlpZiAoISRucl9saW5lKSB7CisJCQlwcmludCAiMSBsaW5lXG5cblxuIjsKKwkJfSBlbHNlIHsKKwkJCWlmICgkbnJfbGluZSA9PSAxKSB7CisJCQkJJG5yX2xpbmUgPSAnMSBsaW5lJzsKKwkJCX0gZWxzZSB7CisJCQkJJG5yX2xpbmUgLj0gJyBsaW5lcyc7CisJCQl9CisJCQlwcmludCAkbnJfbGluZSwgIlxuXG4iOworCQkJcHJpbnQgJF8gZm9yZWFjaCBAJGw7CisJCX0KKwl9IGVsc2UgeworCQlwcmludCAiMSBsaW5lXG5cbiI7CisKKwl9CisJZm9yZWFjaCBteSAkeCAocXcvcmF3IGRpZmYvKSB7CisJCWlmICgkYy0+eyR4fSkgeworCQkJcHJpbnQgIlxuIjsKKwkJCXByaW50ICRfIGZvcmVhY2ggQHskYy0+eyR4fX0KKwkJfQorCX0KK30KKworc3ViIGxpYnN2bl9sb2FkIHsKKwlyZXR1cm4gdW5sZXNzICRfdXNlX2xpYjsKKwkkX3VzZV9saWIgPSBldmFsIHsKKwkJcmVxdWlyZSBTVk46OkNvcmU7CisJCWlmICgkU1ZOOjpDb3JlOjpWRVJTSU9OIGx0ICcxLjEuMCcpIHsKKwkJCWRpZSAiTmVlZCBTVk46OkNvcmUgMS4xLjAgb3IgYmV0dGVyICIsCisJCQkJCSIoZ290ICRTVk46OkNvcmU6OlZFUlNJT04pICIsCisJCQkJCSJGYWxsaW5nIGJhY2sgdG8gY29tbWFuZC1saW5lIHN2blxuIjsKKwkJfQorCQlyZXF1aXJlIFNWTjo6UmE7CisJCXJlcXVpcmUgU1ZOOjpEZWx0YTsKKwkJcHVzaCBAU1ZOOjpHaXQ6OkVkaXRvcjo6SVNBLCAnU1ZOOjpEZWx0YTo6RWRpdG9yJzsKKwkJbXkgJGtpbGxfc3R1cGlkX3dhcm5pbmdzID0gJFNWTjo6Tm9kZTo6bm9uZS4kU1ZOOjpOb2RlOjpmaWxlLgorCQkJCQkkU1ZOOjpOb2RlOjpkaXIuJFNWTjo6Tm9kZTo6dW5rbm93bi4KKwkJCQkJJFNWTjo6Tm9kZTo6bm9uZS4kU1ZOOjpOb2RlOjpmaWxlLgorCQkJCQkkU1ZOOjpOb2RlOjpkaXIuJFNWTjo6Tm9kZTo6dW5rbm93bjsKKwkJMTsKKwl9OworfQorCitzdWIgbGlic3ZuX2Nvbm5lY3QgeworCW15ICgkdXJsKSA9IEBfOworCW15ICRhdXRoID0gU1ZOOjpDb3JlOjphdXRoX29wZW4oW1NWTjo6Q2xpZW50OjpnZXRfc2ltcGxlX3Byb3ZpZGVyKCksCisJCQkgIFNWTjo6Q2xpZW50OjpnZXRfc3NsX3NlcnZlcl90cnVzdF9maWxlX3Byb3ZpZGVyKCksCisJCQkgIFNWTjo6Q2xpZW50OjpnZXRfdXNlcm5hbWVfcHJvdmlkZXIoKV0pOworCW15ICRzID0gZXZhbCB7IFNWTjo6UmEtPm5ldyh1cmwgPT4gJHVybCwgYXV0aCA9PiAkYXV0aCkgfTsKKwlyZXR1cm4gJHM7Cit9CisKK3N1YiBsaWJzdm5fZ2V0X2ZpbGUgeworCW15ICgkZ3VpLCAkZiwgJHJldikgPSBAXzsKKwlteSAkcCA9ICRmOworCWlmIChsZW5ndGggJFNWTl9QQVRIID4gMCkgeworCQlyZXR1cm4gdW5sZXNzICgkcCA9fiBzI15cUSRTVk5fUEFUSFxFLyMjKTsKKwl9CisKKwlteSAoJGhhc2gsICRwaWQsICRpbiwgJG91dCk7CisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldzsKKwlkZWZpbmVkKCRwaWQgPSBvcGVuMygkaW4sICRvdXQsICc+JlNUREVSUicsCisJCQkJcXcvZ2l0LWhhc2gtb2JqZWN0IC13IC0tc3RkaW4vKSkgb3IgY3JvYWsgJCE7CisJIyByZWRpcmVjdCBTVERPVVQgZm9yIFNWTiAxLjEueCBjb21wYXRpYmlsaXR5CisJb3BlbiBteSAkc3Rkb3V0LCAnPiYnLCBcKlNURE9VVCBvciBjcm9hayAkITsKKwlvcGVuIFNURE9VVCwgJz4mJywgJGluIG9yIGNyb2FrICQhOworCW15ICgkciwgJHByb3BzKSA9ICRTVk4tPmdldF9maWxlKCRmLCAkcmV2LCBcKlNURE9VVCwgJHBvb2wpOworCSRpbi0+Zmx1c2ggPT0gMCBvciBjcm9hayAkITsKKwlvcGVuIFNURE9VVCwgJz4mJywgJHN0ZG91dCBvciBjcm9hayAkITsKKwljbG9zZSAkaW4gb3IgY3JvYWsgJCE7CisJY2xvc2UgJHN0ZG91dCBvciBjcm9hayAkITsKKwkkcG9vbC0+Y2xlYXI7CisJY2hvbXAoJGhhc2ggPSBkbyB7IGxvY2FsICQvOyA8JG91dD4gfSk7CisJY2xvc2UgJG91dCBvciBjcm9hayAkITsKKwl3YWl0cGlkICRwaWQsIDA7CisJJGhhc2ggPX4gL14kc2hhMSQvbyBvciBkaWUgIm5vdCBhIHNoYTE6ICRoYXNoXG4iOworCisJbXkgJG1vZGUgPSBleGlzdHMgJHByb3BzLT57J3N2bjpleGVjdXRhYmxlJ30gPyAnMTAwNzU1JyA6ICcxMDA2NDQnOworCWlmIChleGlzdHMgJHByb3BzLT57J3N2bjpzcGVjaWFsJ30pIHsKKwkJJG1vZGUgPSAnMTIwMDAwJzsKKwkJbXkgJGxpbmsgPSBgZ2l0LWNhdC1maWxlIGJsb2IgJGhhc2hgOworCQkkbGluayA9fiBzL15saW5rIC8vIG9yIGRpZSAic3ZuOnNwZWNpYWwgZmlsZSB3aXRoIGNvbnRlbnRzOiA8IiwKKwkJCQkJCSRsaW5rLCAiPiBpcyBub3QgdW5kZXJzdG9vZFxuIjsKKwkJZGVmaW5lZCgkcGlkID0gb3BlbjMoJGluLCAkb3V0LCAnPiZTVERFUlInLAorCQkJCXF3L2dpdC1oYXNoLW9iamVjdCAtdyAtLXN0ZGluLykpIG9yIGNyb2FrICQhOworCQlwcmludCAkaW4gJGxpbms7CisJCSRpbi0+Zmx1c2ggPT0gMCBvciBjcm9hayAkITsKKwkJY2xvc2UgJGluIG9yIGNyb2FrICQhOworCQljaG9tcCgkaGFzaCA9IGRvIHsgbG9jYWwgJC87IDwkb3V0PiB9KTsKKwkJY2xvc2UgJG91dCBvciBjcm9hayAkITsKKwkJd2FpdHBpZCAkcGlkLCAwOworCQkkaGFzaCA9fiAvXiRzaGExJC9vIG9yIGRpZSAibm90IGEgc2hhMTogJGhhc2hcbiI7CisJfQorCXByaW50ICRndWkgJG1vZGUsJyAnLCRoYXNoLCJcdCIsJHAsIlwwIiBvciBjcm9hayAkITsKK30KKworc3ViIGxpYnN2bl9sb2dfZW50cnkgeworCW15ICgkcmV2LCAkYXV0aG9yLCAkZGF0ZSwgJG1zZywgJHBhcmVudHMpID0gQF87CisJbXkgKCRZLCRtLCRkLCRILCRNLCRTKSA9ICgkZGF0ZSA9fiAvXihcZHs0fSlcLShcZFxkKVwtKFxkXGQpVAorCQkJCQkgKFxkXGQpXDooXGRcZClcOihcZFxkKS5cZCtaJC94KQorCQkJCW9yIGRpZSAiVW5hYmxlIHRvIHBhcnNlIGRhdGU6ICRkYXRlXG4iOworCWlmIChkZWZpbmVkICRfYXV0aG9ycyAmJiAhIGRlZmluZWQgJHVzZXJzeyRhdXRob3J9KSB7CisJCWRpZSAiQXV0aG9yOiAkYXV0aG9yIG5vdCBkZWZpbmVkIGluICRfYXV0aG9ycyBmaWxlXG4iOworCX0KKwkkbXNnID0gJycgaWYgKCRyZXYgPT0gMCAmJiAhZGVmaW5lZCAkbXNnKTsKKwlyZXR1cm4geyByZXZpc2lvbiA9PiAkcmV2LCBkYXRlID0+ICIrMDAwMCAkWS0kbS0kZCAkSDokTTokUyIsCisJCWF1dGhvciA9PiAkYXV0aG9yLCBtc2cgPT4gJG1zZy4iXG4iLCBwYXJlbnRzID0+ICRwYXJlbnRzIHx8IFtdIH0KK30KKworc3ViIHByb2Nlc3Nfcm0geworCW15ICgkZ3VpLCAkbGFzdF9jb21taXQsICRmKSA9IEBfOworCSRmID1+IHMjXlxRJFNWTl9QQVRIXEUvPyMjIG9yIHJldHVybjsKKwkjIHJlbW92ZSBlbnRpcmUgZGlyZWN0b3JpZXMuCisJaWYgKHNhZmVfcXgoJ2dpdC1scy10cmVlJywkbGFzdF9jb21taXQsJy0tJywkZikgPX4gL14wNDAwMDAgdHJlZS8pIHsKKwkJZGVmaW5lZChteSAkcGlkID0gb3BlbiBteSAkbHMsICctfCcpIG9yIGNyb2FrICQhOworCQlpZiAoISRwaWQpIHsKKwkJCWV4ZWMocXcvZ2l0LWxzLXRyZWUgLXIgLS1uYW1lLW9ubHkgLXovLAorCQkJCSRsYXN0X2NvbW1pdCwnLS0nLCRmKSBvciBjcm9hayAkITsKKwkJfQorCQlsb2NhbCAkLyA9ICJcMCI7CisJCXdoaWxlICg8JGxzPikgeworCQkJcHJpbnQgJGd1aSAnMCAnLDAgeCA0MCwiXHQiLCRfIG9yIGNyb2FrICQhOworCQl9CisJCWNsb3NlICRscyBvciBjcm9hayAkPzsKKwl9IGVsc2UgeworCQlwcmludCAkZ3VpICcwICcsMCB4IDQwLCJcdCIsJGYsIlwwIiBvciBjcm9hayAkITsKKwl9Cit9CisKK3N1YiBsaWJzdm5fZmV0Y2ggeworCW15ICgkbGFzdF9jb21taXQsICRwYXRocywgJHJldiwgJGF1dGhvciwgJGRhdGUsICRtc2cpID0gQF87CisJb3BlbiBteSAkZ3VpLCAnfCBnaXQtdXBkYXRlLWluZGV4IC16IC0taW5kZXgtaW5mbycgb3IgY3JvYWsgJCE7CisJbXkgQGFtcjsKKwlmb3JlYWNoIG15ICRmIChrZXlzICUkcGF0aHMpIHsKKwkJbXkgJG0gPSAkcGF0aHMtPnskZn0tPmFjdGlvbigpOworCQkkZiA9fiBzI14vKyMjOworCQlpZiAoJG0gPX4gL15bRFJdJC8pIHsKKwkJCXByaW50ICJcdCRtXHQkZlxuIiB1bmxlc3MgJF9xOworCQkJcHJvY2Vzc19ybSgkZ3VpLCAkbGFzdF9jb21taXQsICRmKTsKKwkJCW5leHQgaWYgJG0gZXEgJ0QnOworCQkJIyAnUicgY2FuIGJlIGZpbGUgcmVwbGFjZW1lbnRzLCB0b28sIHJpZ2h0PworCQl9CisJCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJCW15ICR0ID0gJFNWTi0+Y2hlY2tfcGF0aCgkZiwgJHJldiwgJHBvb2wpOworCQlpZiAoJHQgPT0gJFNWTjo6Tm9kZTo6ZmlsZSkgeworCQkJaWYgKCRtID1+IC9eW0FNUl0kLykgeworCQkJCXB1c2ggQGFtciwgWyAkbSwgJGYgXTsKKwkJCX0gZWxzZSB7CisJCQkJZGllICJVbnJlY29nbml6ZWQgYWN0aW9uOiAkbSwgKCRmIHIkcmV2KVxuIjsKKwkJCX0KKwkJfSBlbHNpZiAoJHQgPT0gJFNWTjo6Tm9kZTo6ZGlyICYmICRtID1+IC9eW0FSXSQvKSB7CisJCQlteSBAdHJhdmVyc2VkID0gKCk7CisJCQlsaWJzdm5fdHJhdmVyc2UoJGd1aSwgJycsICRmLCAkcmV2LCBcQHRyYXZlcnNlZCk7CisJCQlmb3JlYWNoIChAdHJhdmVyc2VkKSB7CisJCQkJcHVzaCBAYW1yLCBbICRtLCAkXyBdCisJCQl9CisJCX0KKwkJJHBvb2wtPmNsZWFyOworCX0KKwlmb3JlYWNoIChAYW1yKSB7CisJCXByaW50ICJcdCRfLT5bMF1cdCRfLT5bMV1cbiIgdW5sZXNzICRfcTsKKwkJbGlic3ZuX2dldF9maWxlKCRndWksICRfLT5bMV0sICRyZXYpCisJfQorCWNsb3NlICRndWkgb3IgY3JvYWsgJD87CisJcmV0dXJuIGxpYnN2bl9sb2dfZW50cnkoJHJldiwgJGF1dGhvciwgJGRhdGUsICRtc2csIFskbGFzdF9jb21taXRdKTsKK30KKworc3ViIHN2bl9ncmFiX2Jhc2VfcmV2IHsKKwlkZWZpbmVkKG15ICRwaWQgPSBvcGVuIG15ICRmaCwgJy18Jykgb3IgY3JvYWsgJCE7CisJaWYgKCEkcGlkKSB7CisJCW9wZW4gbXkgJG51bGwsICc+JywgJy9kZXYvbnVsbCcgb3IgY3JvYWsgJCE7CisJCW9wZW4gU1RERVJSLCAnPiYnLCAkbnVsbCBvciBjcm9hayAkITsKKwkJZXhlYyBxdy9naXQtcmV2LXBhcnNlIC0tdmVyaWZ5LywicmVmcy9yZW1vdGVzLyRHSVRfU1ZOXjAiCisJCQkJCQkJCW9yIGNyb2FrICQhOworCX0KKwljaG9tcChteSAkYyA9IGRvIHsgbG9jYWwgJC87IDwkZmg+IH0pOworCWNsb3NlICRmaDsKKwlpZiAoZGVmaW5lZCAkYyAmJiBsZW5ndGggJGMpIHsKKwkJbXkgKCR1cmwsICRyZXYsICR1dWlkKSA9IGNtdF9tZXRhZGF0YSgkYyk7CisJCXJldHVybiAoJHJldiwgJGMpIGlmIGRlZmluZWQgJHJldjsKKwl9CisJaWYgKCRfbm9fbWV0YWRhdGEpIHsKKwkJbXkgJG9mZnNldCA9IC00MTsgIyBmcm9tIHRhaWwKKwkJbXkgJHJsOworCQlvcGVuIG15ICRmaCwgJzwnLCAkUkVWREIgb3IKKwkJCWRpZSAiLS1uby1tZXRhZGF0YSBzcGVjaWZpZWQgYW5kICRSRVZEQiBub3QgcmVhZGFibGVcbiI7CisJCXNlZWsgJGZoLCAkb2Zmc2V0LCAyOworCQkkcmwgPSByZWFkbGluZSAkZmg7CisJCWRlZmluZWQgJHJsIG9yIHJldHVybiAodW5kZWYsIHVuZGVmKTsKKwkJY2hvbXAgJHJsOworCQl3aGlsZSAoJGMgbmUgJHJsICYmIHRlbGwgJGZoICE9IDApIHsKKwkJCSRvZmZzZXQgLT0gNDE7CisJCQlzZWVrICRmaCwgJG9mZnNldCwgMjsKKwkJCSRybCA9IHJlYWRsaW5lICRmaDsKKwkJCWRlZmluZWQgJHJsIG9yIHJldHVybiAodW5kZWYsIHVuZGVmKTsKKwkJCWNob21wICRybDsKKwkJfQorCQlteSAkcmV2ID0gdGVsbCAkZmg7CisJCWNyb2FrICQhIGlmICgkcmV2IDwgLTEpOworCQkkcmV2ID0gICgkcmV2IC0gNDEpIC8gNDE7CisJCWNsb3NlICRmaCBvciBjcm9hayAkITsKKwkJcmV0dXJuICgkcmV2LCAkYyk7CisJfQorCXJldHVybiAodW5kZWYsIHVuZGVmKTsKK30KKworc3ViIGxpYnN2bl9wYXJzZV9yZXZpc2lvbiB7CisJbXkgJGJhc2UgPSBzaGlmdDsKKwlteSAkaGVhZCA9ICRTVk4tPmdldF9sYXRlc3RfcmV2bnVtKCk7CisJaWYgKCFkZWZpbmVkICRfcmV2aXNpb24gfHwgJF9yZXZpc2lvbiBlcSAnQkFTRTpIRUFEJykgeworCQlyZXR1cm4gKCRiYXNlICsgMSwgJGhlYWQpIGlmIChkZWZpbmVkICRiYXNlKTsKKwkJcmV0dXJuICgwLCAkaGVhZCk7CisJfQorCXJldHVybiAoJDEsICQyKSBpZiAoJF9yZXZpc2lvbiA9fiAvXihcZCspOihcZCspJC8pOworCXJldHVybiAoJF9yZXZpc2lvbiwgJF9yZXZpc2lvbikgaWYgKCRfcmV2aXNpb24gPX4gL15cZCskLyk7CisJaWYgKCRfcmV2aXNpb24gPX4gL15CQVNFOihcZCspJC8pIHsKKwkJcmV0dXJuICgkYmFzZSArIDEsICQxKSBpZiAoZGVmaW5lZCAkYmFzZSk7CisJCXJldHVybiAoMCwgJGhlYWQpOworCX0KKwlyZXR1cm4gKCQxLCAkaGVhZCkgaWYgKCRfcmV2aXNpb24gPX4gL14oXGQrKTpIRUFEJC8pOworCWRpZSAicmV2aXNpb24gYXJndW1lbnQ6ICRfcmV2aXNpb24gbm90IHVuZGVyc3Rvb2QgYnkgZ2l0LXN2blxuIiwKKwkJIlRyeSB1c2luZyB0aGUgY29tbWFuZC1saW5lIHN2biBjbGllbnQgaW5zdGVhZFxuIjsKK30KKworc3ViIGxpYnN2bl90cmF2ZXJzZSB7CisJbXkgKCRndWksICRwZngsICRwYXRoLCAkcmV2LCAkZmlsZXMpID0gQF87CisJbXkgJGN3ZCA9ICIkcGZ4LyRwYXRoIjsKKwlteSAkcG9vbCA9IFNWTjo6UG9vbC0+bmV3OworCSRjd2QgPX4gcyNeLysjI2c7CisJbXkgKCRkaXJlbnQsICRyLCAkcHJvcHMpID0gJFNWTi0+Z2V0X2RpcigkY3dkLCAkcmV2LCAkcG9vbCk7CisJZm9yZWFjaCBteSAkZCAoa2V5cyAlJGRpcmVudCkgeworCQlteSAkdCA9ICRkaXJlbnQtPnskZH0tPmtpbmQ7CisJCWlmICgkdCA9PSAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJCWxpYnN2bl90cmF2ZXJzZSgkZ3VpLCAkY3dkLCAkZCwgJHJldiwgJGZpbGVzKTsKKwkJfSBlbHNpZiAoJHQgPT0gJFNWTjo6Tm9kZTo6ZmlsZSkgeworCQkJbXkgJGZpbGUgPSAiJGN3ZC8kZCI7CisJCQlpZiAoZGVmaW5lZCAkZmlsZXMpIHsKKwkJCQlwdXNoIEAkZmlsZXMsICRmaWxlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiXHRBXHQkZmlsZVxuIiB1bmxlc3MgJF9xOworCQkJCWxpYnN2bl9nZXRfZmlsZSgkZ3VpLCAkZmlsZSwgJHJldik7CisJCQl9CisJCX0KKwl9CisJJHBvb2wtPmNsZWFyOworfQorCitzdWIgbGlic3ZuX3RyYXZlcnNlX2lnbm9yZSB7CisJbXkgKCRmaCwgJHBhdGgsICRyKSA9IEBfOworCSRwYXRoID1+IHMjXi8rIyNnOworCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJbXkgKCRkaXJlbnQsIHVuZGVmLCAkcHJvcHMpID0gJFNWTi0+Z2V0X2RpcigkcGF0aCwgJHIsICRwb29sKTsKKwlteSAkcCA9ICRwYXRoOworCSRwID1+IHMjXlxRJFNWTl9QQVRIXEUvPyMjOworCXByaW50ICRmaCBsZW5ndGggJHAgPyAiXG4jICRwXG4iIDogIlxuIyAvXG4iOworCWlmIChteSAkcyA9ICRwcm9wcy0+eydzdm46aWdub3JlJ30pIHsKKwkJJHMgPX4gcy9bXHJcbl0rL1xuL2c7CisJCWNob21wICRzOworCQlpZiAobGVuZ3RoICRwID09IDApIHsKKwkJCSRzID1+IHMjXG4jXG4vJHAjZzsKKwkJCXByaW50ICRmaCAiLyRzXG4iOworCQl9IGVsc2UgeworCQkJJHMgPX4gcyNcbiNcbi8kcC8jZzsKKwkJCXByaW50ICRmaCAiLyRwLyRzXG4iOworCQl9CisJfQorCWZvcmVhY2ggKHNvcnQga2V5cyAlJGRpcmVudCkgeworCQluZXh0IGlmICRkaXJlbnQtPnskX30tPmtpbmQgIT0gJFNWTjo6Tm9kZTo6ZGlyOworCQlsaWJzdm5fdHJhdmVyc2VfaWdub3JlKCRmaCwgIiRwYXRoLyRfIiwgJHIpOworCX0KKwkkcG9vbC0+Y2xlYXI7Cit9CisKK3N1YiByZXZpc2lvbnNfZXEgeworCW15ICgkcGF0aCwgJHIwLCAkcjEpID0gQF87CisJcmV0dXJuIDEgaWYgJHIwID09ICRyMTsKKwlteSAkbnIgPSAwOworCWlmICgkX3VzZV9saWIpIHsKKwkJIyBzaG91bGQgYmUgT0sgdG8gdXNlIFBvb2wgaGVyZSAocjEgLSByMCkgc2hvdWxkIGJlIHNtYWxsCisJCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJCWxpYnN2bl9nZXRfbG9nKCRTVk4sICIvJHBhdGgiLCAkcjAsICRyMSwKKwkJCQkwLCAxLCAxLCBzdWIgeyRucisrfSwgJHBvb2wpOworCQkkcG9vbC0+Y2xlYXI7CisJfSBlbHNlIHsKKwkJbXkgKCR1cmwsIHVuZGVmKSA9IHJlcG9fcGF0aF9zcGxpdCgkU1ZOX1VSTCk7CisJCW15ICRzdm5fbG9nID0gc3ZuX2xvZ19yYXcoIiR1cmwvJHBhdGgiLCItciRyMDokcjEiKTsKKwkJd2hpbGUgKG5leHRfbG9nX2VudHJ5KCRzdm5fbG9nKSkgeyAkbnIrKyB9CisJCWNsb3NlICRzdm5fbG9nLT57Zmh9OworCX0KKwlyZXR1cm4gMCBpZiAoJG5yID4gMSk7CisJcmV0dXJuIDE7Cit9CisKK3N1YiBsaWJzdm5fZmluZF9wYXJlbnRfYnJhbmNoIHsKKwlteSAoJHBhdGhzLCAkcmV2LCAkYXV0aG9yLCAkZGF0ZSwgJG1zZykgPSBAXzsKKwlteSAkc3ZuX3BhdGggPSAnLycuJFNWTl9QQVRIOworCisJIyBsb29rIGZvciBhIHBhcmVudCBmcm9tIGFub3RoZXIgYnJhbmNoOgorCW15ICRpID0gJHBhdGhzLT57JHN2bl9wYXRofSBvciByZXR1cm47CisJbXkgJGJyYW5jaF9mcm9tID0gJGktPmNvcHlmcm9tX3BhdGggb3IgcmV0dXJuOworCW15ICRyID0gJGktPmNvcHlmcm9tX3JldjsKKwlwcmludCBTVERFUlIgICJGb3VuZCBwb3NzaWJsZSBicmFuY2ggcG9pbnQ6ICIsCisJCQkJIiRicmFuY2hfZnJvbSA9PiAkc3ZuX3BhdGgsICRyXG4iOworCSRicmFuY2hfZnJvbSA9fiBzI14vIyM7CisJbXkgJGxfbWFwID0ge307CisJcmVhZF91cmxfcGF0aHNfYWxsKCRsX21hcCwgJycsICIkR0lUX0RJUi9zdm4iKTsKKwlteSAkdXJsID0gJFNWTi0+e3VybH07CisJZGVmaW5lZCAkbF9tYXAtPnskdXJsfSBvciByZXR1cm47CisJbXkgJGlkID0gJGxfbWFwLT57JHVybH0tPnskYnJhbmNoX2Zyb219OworCWlmICghZGVmaW5lZCAkaWQgJiYgJF9mb2xsb3dfcGFyZW50KSB7CisJCXByaW50IFNUREVSUiAiRm9sbG93aW5nIHBhcmVudDogJGJyYW5jaF9mcm9tXEAkclxuIjsKKwkJIyBhdXRvIGNyZWF0ZSBhIG5ldyBicmFuY2ggYW5kIGZvbGxvdyBpdAorCQkkaWQgPSBiYXNlbmFtZSgkYnJhbmNoX2Zyb20pOworCQkkaWQgLj0gJ0AnLiRyIGlmIC1yICIkR0lUX0RJUi9zdm4vJGlkIjsKKwkJd2hpbGUgKC1yICIkR0lUX0RJUi9zdm4vJGlkIikgeworCQkJIyBqdXN0IGdyb3cgYSB0YWlsIGlmIHdlJ3JlIG5vdCB1bmlxdWUgZW5vdWdoIDp4CisJCQkkaWQgLj0gJy0nOworCQl9CisJfQorCXJldHVybiB1bmxlc3MgZGVmaW5lZCAkaWQ7CisKKwlteSAoJHIwLCAkcGFyZW50KSA9IGZpbmRfcmV2X2JlZm9yZSgkciwkaWQsMSk7CisJaWYgKCRfZm9sbG93X3BhcmVudCAmJiAoIWRlZmluZWQgJHIwIHx8ICFkZWZpbmVkICRwYXJlbnQpKSB7CisJCWRlZmluZWQobXkgJHBpZCA9IGZvcmspIG9yIGNyb2FrICQhOworCQlpZiAoISRwaWQpIHsKKwkJCSRHSVRfU1ZOID0gJEVOVntHSVRfU1ZOX0lEfSA9ICRpZDsKKwkJCWluaXRfdmFycygpOworCQkJJFNWTl9VUkwgPSAiJHVybC8kYnJhbmNoX2Zyb20iOworCQkJJFNWTl9MT0cgPSAkU1ZOID0gdW5kZWY7CisJCQlzZXR1cF9naXRfc3ZuKCk7CisJCQkjIHdlIGNhbid0IGFzc3VtZSBTVk5fVVJMIGV4aXN0cyBhdCByKzE6CisJCQkkX3JldmlzaW9uID0gIjA6JHIiOworCQkJZmV0Y2hfbGliKCk7CisJCQlleGl0IDA7CisJCX0KKwkJd2FpdHBpZCAkcGlkLCAwOworCQljcm9hayAkPyBpZiAkPzsKKwkJKCRyMCwgJHBhcmVudCkgPSBmaW5kX3Jldl9iZWZvcmUoJHIsJGlkLDEpOworCX0KKwlyZXR1cm4gdW5sZXNzIChkZWZpbmVkICRyMCAmJiBkZWZpbmVkICRwYXJlbnQpOworCWlmIChyZXZpc2lvbnNfZXEoJGJyYW5jaF9mcm9tLCAkcjAsICRyKSkgeworCQl1bmxpbmsgJEdJVF9TVk5fSU5ERVg7CisJCXByaW50IFNUREVSUiAiRm91bmQgYnJhbmNoIHBhcmVudDogKCRHSVRfU1ZOKSAkcGFyZW50XG4iOworCQlzeXMocXcvZ2l0LXJlYWQtdHJlZS8sICRwYXJlbnQpOworCQlyZXR1cm4gbGlic3ZuX2ZldGNoKCRwYXJlbnQsICRwYXRocywgJHJldiwKKwkJCQkJJGF1dGhvciwgJGRhdGUsICRtc2cpOworCX0KKwlwcmludCBTVERFUlIgIk5vcGUsIGJyYW5jaCBwb2ludCBub3QgaW1wb3J0ZWQgb3IgdW5rbm93blxuIjsKKwlyZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBsaWJzdm5fZ2V0X2xvZyB7CisJbXkgKCRyYSwgQGFyZ3MpID0gQF87CisJaWYgKCRTVk46OkNvcmU6OlZFUlNJT04gbGUgJzEuMi4wJykgeworCQlzcGxpY2UoQGFyZ3MsIDMsIDEpOworCX0KKwkkcmEtPmdldF9sb2coQGFyZ3MpOworfQorCitzdWIgbGlic3ZuX25ld190cmVlIHsKKwlpZiAobXkgJGxvZ19lbnRyeSA9IGxpYnN2bl9maW5kX3BhcmVudF9icmFuY2goQF8pKSB7CisJCXJldHVybiAkbG9nX2VudHJ5OworCX0KKwlteSAoJHBhdGhzLCAkcmV2LCAkYXV0aG9yLCAkZGF0ZSwgJG1zZykgPSBAXzsKKwlvcGVuIG15ICRndWksICd8IGdpdC11cGRhdGUtaW5kZXggLXogLS1pbmRleC1pbmZvJyBvciBjcm9hayAkITsKKwlsaWJzdm5fdHJhdmVyc2UoJGd1aSwgJycsICRTVk5fUEFUSCwgJHJldik7CisJY2xvc2UgJGd1aSBvciBjcm9hayAkPzsKKwlyZXR1cm4gbGlic3ZuX2xvZ19lbnRyeSgkcmV2LCAkYXV0aG9yLCAkZGF0ZSwgJG1zZyk7Cit9CisKK3N1YiBmaW5kX2dyYWZ0X3BhdGhfY29tbWl0IHsKKwlteSAoJHRyZWVfcGF0aHMsICRwMSwgJHIxKSA9IEBfOworCWZvcmVhY2ggbXkgJHggKGtleXMgJSR0cmVlX3BhdGhzKSB7CisJCW5leHQgdW5sZXNzICgkcDEgPX4gL15cUSR4XEUvKTsKKwkJbXkgJGkgPSAkdHJlZV9wYXRocy0+eyR4fTsKKwkJbXkgKCRyMCwgJHBhcmVudCkgPSBmaW5kX3Jldl9iZWZvcmUoJHIxLCRpLDEpOworCQlyZXR1cm4gJHBhcmVudCBpZiAoZGVmaW5lZCAkcjAgJiYgJHIwID09ICRyMSk7CisJCXByaW50IFNUREVSUiAiciRyMSBvZiAkaSBub3QgaW1wb3J0ZWRcbiI7CisJCW5leHQ7CisJfQorCXJldHVybiB1bmRlZjsKK30KKworc3ViIGZpbmRfZ3JhZnRfcGF0aF9wYXJlbnRzIHsKKwlteSAoJGdyYWZ0cywgJHRyZWVfcGF0aHMsICRjLCAkcDAsICRyMCkgPSBAXzsKKwlmb3JlYWNoIG15ICR4IChrZXlzICUkdHJlZV9wYXRocykgeworCQluZXh0IHVubGVzcyAoJHAwID1+IC9eXFEkeFxFLyk7CisJCW15ICRpID0gJHRyZWVfcGF0aHMtPnskeH07CisJCW15ICgkciwgJHBhcmVudCkgPSBmaW5kX3Jldl9iZWZvcmUoJHIwLCAkaSwgMSk7CisJCWlmIChkZWZpbmVkICRyICYmIGRlZmluZWQgJHBhcmVudCAmJiByZXZpc2lvbnNfZXEoJHgsJHIsJHIwKSkgeworCQkJbXkgKCR1cmxfYiwgdW5kZWYsICR1dWlkX2IpID0gY210X21ldGFkYXRhKCRjKTsKKwkJCW15ICgkdXJsX2EsIHVuZGVmLCAkdXVpZF9hKSA9IGNtdF9tZXRhZGF0YSgkcGFyZW50KTsKKwkJCW5leHQgaWYgKCR1cmxfYSAmJiAkdXJsX2IgJiYgJHVybF9hIGVxICR1cmxfYiAmJgorCQkJCQkJCSR1dWlkX2IgZXEgJHV1aWRfYSk7CisJCQkkZ3JhZnRzLT57JGN9LT57JHBhcmVudH0gPSAxOworCQl9CisJfQorfQorCitzdWIgbGlic3ZuX2dyYWZ0X2ZpbGVfY29waWVzIHsKKwlteSAoJGdyYWZ0cywgJHRyZWVfcGF0aHMsICRwYXRoLCAkcGF0aHMsICRyZXYpID0gQF87CisJZm9yZWFjaCAoa2V5cyAlJHBhdGhzKSB7CisJCW15ICRpID0gJHBhdGhzLT57JF99OworCQlteSAoJG0sICRwMCwgJHIwKSA9ICgkaS0+YWN0aW9uLCAkaS0+Y29weWZyb21fcGF0aCwKKwkJCQkJJGktPmNvcHlmcm9tX3Jldik7CisJCW5leHQgdW5sZXNzIChkZWZpbmVkICRwMCAmJiBkZWZpbmVkICRyMCk7CisKKwkJbXkgJHAxID0gJF87CisJCSRwMSA9fiBzI14vIyM7CisJCSRwMCA9fiBzI14vIyM7CisJCW15ICRjID0gZmluZF9ncmFmdF9wYXRoX2NvbW1pdCgkdHJlZV9wYXRocywgJHAxLCAkcmV2KTsKKwkJbmV4dCB1bmxlc3MgJGM7CisJCWZpbmRfZ3JhZnRfcGF0aF9wYXJlbnRzKCRncmFmdHMsICR0cmVlX3BhdGhzLCAkYywgJHAwLCAkcjApOworCX0KK30KKworc3ViIHNldF9pbmRleCB7CisJbXkgJG9sZCA9ICRFTlZ7R0lUX0lOREVYX0ZJTEV9OworCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gc2hpZnQ7CisJcmV0dXJuICRvbGQ7Cit9CisKK3N1YiByZXN0b3JlX2luZGV4IHsKKwlteSAoJG9sZCkgPSBAXzsKKwlpZiAoZGVmaW5lZCAkb2xkKSB7CisJCSRFTlZ7R0lUX0lOREVYX0ZJTEV9ID0gJG9sZDsKKwl9IGVsc2UgeworCQlkZWxldGUgJEVOVntHSVRfSU5ERVhfRklMRX07CisJfQorfQorCitzdWIgbGlic3ZuX2NvbW1pdF9jYiB7CisJbXkgKCRyZXYsICRkYXRlLCAkY29tbWl0dGVyLCAkYywgJG1zZywgJHJfbGFzdCwgJGNtdF9sYXN0KSA9IEBfOworCWlmICgkX29wdGltaXplX2NvbW1pdHMgJiYgJHJldiA9PSAoJHJfbGFzdCArIDEpKSB7CisJCW15ICRsb2cgPSBsaWJzdm5fbG9nX2VudHJ5KCRyZXYsJGNvbW1pdHRlciwkZGF0ZSwkbXNnKTsKKwkJJGxvZy0+e3RyZWV9ID0gZ2V0X3RyZWVfZnJvbV90cmVlaXNoKCRjKTsKKwkJbXkgJGNtdCA9IGdpdF9jb21taXQoJGxvZywgJGNtdF9sYXN0LCAkYyk7CisJCW15IEBkaWZmID0gc2FmZV9xeCgnZ2l0LWRpZmYtdHJlZScsICRjbXQsICRjKTsKKwkJaWYgKEBkaWZmKSB7CisJCQlwcmludCBTVERFUlIgIlRyZWVzIGRpZmZlcjogJGNtdCAkY1xuIiwKKwkJCQkJam9pbignJyxAZGlmZiksIlxuIjsKKwkJCWV4aXQgMTsKKwkJfQorCX0gZWxzZSB7CisJCWZldGNoKCIkcmV2PSRjIik7CisJfQorfQorCitzdWIgbGlic3ZuX2xzX2Z1bGx1cmwgeworCW15ICRmdWxsdXJsID0gc2hpZnQ7CisJbXkgKCRyZXBvLCAkcGF0aCkgPSByZXBvX3BhdGhfc3BsaXQoJGZ1bGx1cmwpOworCSRTVk4gfHw9IGxpYnN2bl9jb25uZWN0KCRyZXBvKTsKKwlteSBAcmV0OworCW15ICRwb29sID0gU1ZOOjpQb29sLT5uZXc7CisJbXkgKCRkaXJlbnQsIHVuZGVmLCB1bmRlZikgPSAkU1ZOLT5nZXRfZGlyKCRwYXRoLAorCQkJCQkJJFNWTi0+Z2V0X2xhdGVzdF9yZXZudW0sICRwb29sKTsKKwlmb3JlYWNoIG15ICRkIChrZXlzICUkZGlyZW50KSB7CisJCWlmICgkZGlyZW50LT57JGR9LT5raW5kID09ICRTVk46Ok5vZGU6OmRpcikgeworCQkJcHVzaCBAcmV0LCAiJGQvIjsgIyBhZGQgJy8nIGZvciBjb21wYXQgd2l0aCBjbGkgc3ZuCisJCX0KKwl9CisJJHBvb2wtPmNsZWFyOworCXJldHVybiBAcmV0OworfQorCisKK3N1YiBsaWJzdm5fc2tpcF91bmtub3duX3JldnMgeworCW15ICRlcnIgPSBzaGlmdDsKKwlteSAkZXJybm8gPSAkZXJyLT5hcHJfZXJyKCk7CisJIyBNYXliZSB0aGUgYnJhbmNoIHdlJ3JlIHRyYWNraW5nIGRpZG4ndAorCSMgZXhpc3Qgd2hlbiB0aGUgcmVwbyBzdGFydGVkLCBzbyBpdCdzCisJIyBub3QgYW4gZXJyb3IgaWYgaXQgZG9lc24ndCwganVzdCBjb250aW51ZQorCSMKKwkjIFdvbmRlcmZ1bGx5IGNvbnNpc3RlbnQgbGlicmFyeSwgZWg/CisJIyAxNjAwMTMgLSBzdm46Ly8gYW5kIGZpbGU6Ly8KKwkjIDE3NTAwMiAtIGh0dHAocyk6Ly8KKwkjICAgTW9yZSBjb2RlcyBtYXkgYmUgZGlzY292ZXJlZCBsYXRlci4uLgorCWlmICgkZXJybm8gPT0gMTc1MDAyIHx8ICRlcnJubyA9PSAxNjAwMTMpIHsKKwkJcmV0dXJuOworCX0KKwljcm9hayAiRXJyb3IgZnJvbSBTVk4sICgkZXJybm8pOiAiLCAkZXJyLT5leHBhbmRlZF9tZXNzYWdlLCJcbiI7Cit9OworCisjIFRpZTo6RmlsZSBzZWVtcyB0byBiZSBwcm9uZSB0byBvZmZzZXQgZXJyb3JzIGlmIHJldmlzaW9ucyBnZXQgc3BhcnNlLAorIyBpdCdzIG5vdCB0aGF0IGZhc3QsIGVpdGhlci4gIFRpZTo6RmlsZSBpcyBhbHNvIG5vdCBpbiBQZXJsIDUuNi4gIFNvCisjIG9uZSBvZiBteSBmYXZvcml0ZSBtb2R1bGVzIGlzIG91dCA6PCAgTmV4dCB1cCB3b3VsZCBiZSBvbmUgb2YgdGhlIERCTQorIyBtb2R1bGVzLCBidXQgSSdtIG5vdCBzdXJlIHdoaWNoIGlzIG1vc3QgcG9ydGFibGUuLi4gIFNvIEknbGwganVzdAorIyBnbyB3aXRoIHNvbWV0aGluZyB0aGF0J3MgcGxhaW4tdGV4dCwgYnV0IHN0aWxsIGNhcGFibGUgb2YKKyMgYmVpbmcgcmFuZG9tbHkgYWNjZXNzZWQuICBTbyBoZXJlJ3MgbXkgdWx0cmEtc2ltcGxlIGZpeGVkLXdpZHRoCisjIGRhdGFiYXNlLiAgQWxsIHJlY29yZHMgYXJlIDQwIGNoYXJhY3RlcnMgKyAiXG4iLCBzbyBpdCdzIGVhc3kgdG8gc2VlaworIyB0byBhIHJldmlzaW9uOiAoNDEgKiByZXYpIGlzIHRoZSBieXRlIG9mZnNldC4KKyMgQSByZWNvcmQgb2YgNDAgMHMgZGVub3RlcyBhbiBlbXB0eSByZXZpc2lvbi4KKyMgQW5kIHllcywgaXQncyBzdGlsbCBwcmV0dHkgZmFzdCAoZmFzdGVyIHRoYW4gVGllOjpGaWxlKS4KK3N1YiByZXZkYl9zZXQgeworCW15ICgkZmlsZSwgJHJldiwgJGNvbW1pdCkgPSBAXzsKKwlsZW5ndGggJGNvbW1pdCA9PSA0MCBvciBjcm9hayAiYXJnMyBtdXN0IGJlIGEgZnVsbCBTSEExIGhleHN1bVxuIjsKKwlvcGVuIG15ICRmaCwgJys8JywgJGZpbGUgb3IgY3JvYWsgJCE7CisJbXkgJG9mZnNldCA9ICRyZXYgKiA0MTsKKwkjIGFzc3VtZSB0aGF0IGFwcGVuZCBpcyB0aGUgY29tbW9uIGNhc2U6CisJc2VlayAkZmgsIDAsIDIgb3IgY3JvYWsgJCE7CisJbXkgJHBvcyA9IHRlbGwgJGZoOworCWlmICgkcG9zIDwgJG9mZnNldCkgeworCQlwcmludCAkZmggKCgnMCcgeCA0MCksIlxuIikgeCAoKCRvZmZzZXQgLSAkcG9zKSAvIDQxKTsKKwl9CisJc2VlayAkZmgsICRvZmZzZXQsIDAgb3IgY3JvYWsgJCE7CisJcHJpbnQgJGZoICRjb21taXQsIlxuIjsKKwljbG9zZSAkZmggb3IgY3JvYWsgJCE7Cit9CisKK3N1YiByZXZkYl9nZXQgeworCW15ICgkZmlsZSwgJHJldikgPSBAXzsKKwlteSAkcmV0OworCW15ICRvZmZzZXQgPSAkcmV2ICogNDE7CisJb3BlbiBteSAkZmgsICc8JywgJGZpbGUgb3IgY3JvYWsgJCE7CisJc2VlayAkZmgsICRvZmZzZXQsIDA7CisJaWYgKHRlbGwgJGZoID09ICRvZmZzZXQpIHsKKwkJJHJldCA9IHJlYWRsaW5lICRmaDsKKwkJaWYgKGRlZmluZWQgJHJldCkgeworCQkJY2hvbXAgJHJldDsKKwkJCSRyZXQgPSB1bmRlZiBpZiAoJHJldCA9fiAvXjB7NDB9JC8pOworCQl9CisJfQorCWNsb3NlICRmaCBvciBjcm9hayAkITsKKwlyZXR1cm4gJHJldDsKK30KKworc3ViIGNvcHlfcmVtb3RlX3JlZiB7CisJbXkgJG9yaWdpbiA9ICRfY3BfcmVtb3RlID8gJF9jcF9yZW1vdGUgOiAnb3JpZ2luJzsKKwlteSAkcmVmID0gInJlZnMvcmVtb3Rlcy8kR0lUX1NWTiI7CisJaWYgKHNhZmVfcXgoJ2dpdC1scy1yZW1vdGUnLCAkb3JpZ2luLCAkcmVmKSkgeworCQlzeXMocXcvZ2l0IGZldGNoLywgJG9yaWdpbiwgIiRyZWY6JHJlZiIpOworCX0gZWxzZSB7CisJCWRpZSAiVW5hYmxlIHRvIGZpbmQgcmVtb3RlIHJlZmVyZW5jZTogIiwKKwkJCQkicmVmcy9yZW1vdGVzLyRHSVRfU1ZOIG9uICRvcmlnaW5cbiI7CisJfQorfQorCitwYWNrYWdlIFNWTjo6R2l0OjpFZGl0b3I7Cit1c2UgdmFycyBxdy9ASVNBLzsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgQ2FycCBxdy9jcm9hay87Cit1c2UgSU86OkZpbGU7CisKK3N1YiBuZXcgeworCW15ICRjbGFzcyA9IHNoaWZ0OworCW15ICRnaXRfc3ZuID0gc2hpZnQ7CisJbXkgJHNlbGYgPSBTVk46OkRlbHRhOjpFZGl0b3ItPm5ldyhAXyk7CisJYmxlc3MgJHNlbGYsICRjbGFzczsKKwlmb3JlYWNoIChxdy9zdm5fcGF0aCBjIHIgcmEgLykgeworCQlkaWUgIiRfIHJlcXVpcmVkIVxuIiB1bmxlc3MgKGRlZmluZWQgJGdpdF9zdm4tPnskX30pOworCQkkc2VsZi0+eyRffSA9ICRnaXRfc3ZuLT57JF99OworCX0KKwkkc2VsZi0+e3Bvb2x9ID0gU1ZOOjpQb29sLT5uZXc7CisJJHNlbGYtPntiYXR9ID0geyAnJyA9PiAkc2VsZi0+b3Blbl9yb290KCRzZWxmLT57cn0sICRzZWxmLT57cG9vbH0pIH07CisJJHNlbGYtPntybX0gPSB7IH07CisJcmVxdWlyZSBEaWdlc3Q6Ok1ENTsKKwlyZXR1cm4gJHNlbGY7Cit9CisKK3N1YiBzcGxpdF9wYXRoIHsKKwlyZXR1cm4gKCRfWzBdID1+IG0jXiguKj8pLz8oW14vXSspJCMpOworfQorCitzdWIgcmVwb19wYXRoIHsKKwkoZGVmaW5lZCAkX1sxXSAmJiBsZW5ndGggJF9bMV0pID8gIiRfWzBdLT57c3ZuX3BhdGh9LyRfWzFdIgorCQkJCQk6ICRfWzBdLT57c3ZuX3BhdGh9Cit9CisKK3N1YiB1cmxfcGF0aCB7CisJbXkgKCRzZWxmLCAkcGF0aCkgPSBAXzsKKwkkc2VsZi0+e3JhfS0+e3VybH0gLiAnLycgLiAkc2VsZi0+cmVwb19wYXRoKCRwYXRoKTsKK30KKworc3ViIHJtZGlycyB7CisJbXkgKCRzZWxmLCAkcSkgPSBAXzsKKwlteSAkcm0gPSAkc2VsZi0+e3JtfTsKKwlkZWxldGUgJHJtLT57Jyd9OyAjIHdlIG5ldmVyIGRlbGV0ZSB0aGUgdXJsIHdlJ3JlIHRyYWNraW5nCisJcmV0dXJuIHVubGVzcyAlJHJtOworCisJZm9yZWFjaCAoa2V5cyAlJHJtKSB7CisJCW15IEBkID0gc3BsaXQgbSMvIywgJF87CisJCW15ICRjID0gc2hpZnQgQGQ7CisJCSRybS0+eyRjfSA9IDE7CisJCXdoaWxlIChAZCkgeworCQkJJGMgLj0gJy8nIC4gc2hpZnQgQGQ7CisJCQkkcm0tPnskY30gPSAxOworCQl9CisJfQorCWRlbGV0ZSAkcm0tPnskc2VsZi0+e3N2bl9wYXRofX07CisJZGVsZXRlICRybS0+eycnfTsgIyB3ZSBuZXZlciBkZWxldGUgdGhlIHVybCB3ZSdyZSB0cmFja2luZworCXJldHVybiB1bmxlc3MgJSRybTsKKworCWRlZmluZWQobXkgJHBpZCA9IG9wZW4gbXkgJGZoLCctfCcpIG9yIGNyb2FrICQhOworCWlmICghJHBpZCkgeworCQlleGVjIHF3L2dpdC1scy10cmVlIC0tbmFtZS1vbmx5IC1yIC16LywgJHNlbGYtPntjfSBvciBjcm9hayAkITsKKwl9CisJbG9jYWwgJC8gPSAiXDAiOworCW15IEBzdm5fcGF0aCA9IHNwbGl0IG0jLyMsICRzZWxmLT57c3ZuX3BhdGh9OworCXdoaWxlICg8JGZoPikgeworCQljaG9tcDsKKwkJbXkgQGRuID0gKEBzdm5fcGF0aCwgKHNwbGl0IG0jLyMsICRfKSk7CisJCXdoaWxlIChwb3AgQGRuKSB7CisJCQlkZWxldGUgJHJtLT57am9pbiAnLycsIEBkbn07CisJCX0KKwkJdW5sZXNzICglJHJtKSB7CisJCQljbG9zZSAkZmg7CisJCQlyZXR1cm47CisJCX0KKwl9CisJY2xvc2UgJGZoOworCisJbXkgKCRyLCAkcCwgJGJhdCkgPSAoJHNlbGYtPntyfSwgJHNlbGYtPntwb29sfSwgJHNlbGYtPntiYXR9KTsKKwlmb3JlYWNoIG15ICRkIChzb3J0IHsgJGIgPX4gdHIjLyMvIyA8PT4gJGEgPX4gdHIjLyMvIyB9IGtleXMgJSRybSkgeworCQkkc2VsZi0+Y2xvc2VfZGlyZWN0b3J5KCRiYXQtPnskZH0sICRwKTsKKwkJbXkgKCRkbikgPSAoJGQgPX4gbSNeKC4qPykvPyg/OlteL10rKSQjKTsKKwkJcHJpbnQgIlx0RCtcdC8kZC9cbiIgdW5sZXNzICRxOworCQkkc2VsZi0+U1VQRVI6OmRlbGV0ZV9lbnRyeSgkZCwgJHIsICRiYXQtPnskZG59LCAkcCk7CisJCWRlbGV0ZSAkYmF0LT57JGR9OworCX0KK30KKworc3ViIG9wZW5fb3JfYWRkX2RpciB7CisJbXkgKCRzZWxmLCAkZnVsbF9wYXRoLCAkYmF0b24pID0gQF87CisJbXkgJHAgPSBTVk46OlBvb2wtPm5ldzsKKwlteSAkdCA9ICRzZWxmLT57cmF9LT5jaGVja19wYXRoKCRmdWxsX3BhdGgsICRzZWxmLT57cn0sICRwKTsKKwkkcC0+Y2xlYXI7CisJaWYgKCR0ID09ICRTVk46Ok5vZGU6Om5vbmUpIHsKKwkJcmV0dXJuICRzZWxmLT5hZGRfZGlyZWN0b3J5KCRmdWxsX3BhdGgsICRiYXRvbiwKKwkJCQkJCXVuZGVmLCAtMSwgJHNlbGYtPntwb29sfSk7CisJfSBlbHNpZiAoJHQgPT0gJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCXJldHVybiAkc2VsZi0+b3Blbl9kaXJlY3RvcnkoJGZ1bGxfcGF0aCwgJGJhdG9uLAorCQkJCQkJJHNlbGYtPntyfSwgJHNlbGYtPntwb29sfSk7CisJfQorCXByaW50IFNUREVSUiAiJGZ1bGxfcGF0aCBhbHJlYWR5IGV4aXN0cyBpbiByZXBvc2l0b3J5IGF0ICIsCisJCSJyJHNlbGYtPntyfSBhbmQgaXQgaXMgbm90IGEgZGlyZWN0b3J5ICgiLAorCQkoJHQgPT0gJFNWTjo6Tm9kZTo6ZmlsZSA/ICdmaWxlJyA6ICd1bmtub3duJyksIi8kdClcbiI7CisJZXhpdCAxOworfQorCitzdWIgZW5zdXJlX3BhdGggeworCW15ICgkc2VsZiwgJHBhdGgpID0gQF87CisJbXkgJGJhdCA9ICRzZWxmLT57YmF0fTsKKwkkcGF0aCA9ICRzZWxmLT5yZXBvX3BhdGgoJHBhdGgpOworCXJldHVybiAkYmF0LT57Jyd9IHVubGVzcyAobGVuZ3RoICRwYXRoKTsKKwlteSBAcCA9IHNwbGl0IG0jLysjLCAkcGF0aDsKKwlteSAkYyA9IHNoaWZ0IEBwOworCSRiYXQtPnskY30gfHw9ICRzZWxmLT5vcGVuX29yX2FkZF9kaXIoJGMsICRiYXQtPnsnJ30pOworCXdoaWxlIChAcCkgeworCQlteSAkYzAgPSAkYzsKKwkJJGMgLj0gJy8nIC4gc2hpZnQgQHA7CisJCSRiYXQtPnskY30gfHw9ICRzZWxmLT5vcGVuX29yX2FkZF9kaXIoJGMsICRiYXQtPnskYzB9KTsKKwl9CisJcmV0dXJuICRiYXQtPnskY307Cit9CisKK3N1YiBBIHsKKwlteSAoJHNlbGYsICRtLCAkcSkgPSBAXzsKKwlteSAoJGRpciwgJGZpbGUpID0gc3BsaXRfcGF0aCgkbS0+e2ZpbGVfYn0pOworCW15ICRwYmF0ID0gJHNlbGYtPmVuc3VyZV9wYXRoKCRkaXIpOworCW15ICRmYmF0ID0gJHNlbGYtPmFkZF9maWxlKCRzZWxmLT5yZXBvX3BhdGgoJG0tPntmaWxlX2J9KSwgJHBiYXQsCisJCQkJCXVuZGVmLCAtMSk7CisJcHJpbnQgIlx0QVx0JG0tPntmaWxlX2J9XG4iIHVubGVzcyAkcTsKKwkkc2VsZi0+Y2hnX2ZpbGUoJGZiYXQsICRtKTsKKwkkc2VsZi0+Y2xvc2VfZmlsZSgkZmJhdCx1bmRlZiwkc2VsZi0+e3Bvb2x9KTsKK30KKworc3ViIEMgeworCW15ICgkc2VsZiwgJG0sICRxKSA9IEBfOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRtLT57ZmlsZV9ifSk7CisJbXkgJHBiYXQgPSAkc2VsZi0+ZW5zdXJlX3BhdGgoJGRpcik7CisJbXkgJGZiYXQgPSAkc2VsZi0+YWRkX2ZpbGUoJHNlbGYtPnJlcG9fcGF0aCgkbS0+e2ZpbGVfYn0pLCAkcGJhdCwKKwkJCQkkc2VsZi0+dXJsX3BhdGgoJG0tPntmaWxlX2F9KSwgJHNlbGYtPntyfSk7CisJcHJpbnQgIlx0Q1x0JG0tPntmaWxlX2F9ID0+ICRtLT57ZmlsZV9ifVxuIiB1bmxlc3MgJHE7CisJJHNlbGYtPmNoZ19maWxlKCRmYmF0LCAkbSk7CisJJHNlbGYtPmNsb3NlX2ZpbGUoJGZiYXQsdW5kZWYsJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBkZWxldGVfZW50cnkgeworCW15ICgkc2VsZiwgJHBhdGgsICRwYmF0KSA9IEBfOworCW15ICRycGF0aCA9ICRzZWxmLT5yZXBvX3BhdGgoJHBhdGgpOworCW15ICgkZGlyLCAkZmlsZSkgPSBzcGxpdF9wYXRoKCRycGF0aCk7CisJJHNlbGYtPntybX0tPnskZGlyfSA9IDE7CisJJHNlbGYtPlNVUEVSOjpkZWxldGVfZW50cnkoJHJwYXRoLCAkc2VsZi0+e3J9LCAkcGJhdCwgJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBSIHsKKwlteSAoJHNlbGYsICRtLCAkcSkgPSBAXzsKKwlteSAoJGRpciwgJGZpbGUpID0gc3BsaXRfcGF0aCgkbS0+e2ZpbGVfYn0pOworCW15ICRwYmF0ID0gJHNlbGYtPmVuc3VyZV9wYXRoKCRkaXIpOworCW15ICRmYmF0ID0gJHNlbGYtPmFkZF9maWxlKCRzZWxmLT5yZXBvX3BhdGgoJG0tPntmaWxlX2J9KSwgJHBiYXQsCisJCQkJJHNlbGYtPnVybF9wYXRoKCRtLT57ZmlsZV9hfSksICRzZWxmLT57cn0pOworCXByaW50ICJcdFJcdCRtLT57ZmlsZV9hfSA9PiAkbS0+e2ZpbGVfYn1cbiIgdW5sZXNzICRxOworCSRzZWxmLT5jaGdfZmlsZSgkZmJhdCwgJG0pOworCSRzZWxmLT5jbG9zZV9maWxlKCRmYmF0LHVuZGVmLCRzZWxmLT57cG9vbH0pOworCisJKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2F9KTsKKwkkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwkkc2VsZi0+ZGVsZXRlX2VudHJ5KCRtLT57ZmlsZV9hfSwgJHBiYXQpOworfQorCitzdWIgTSB7CisJbXkgKCRzZWxmLCAkbSwgJHEpID0gQF87CisJbXkgKCRkaXIsICRmaWxlKSA9IHNwbGl0X3BhdGgoJG0tPntmaWxlX2J9KTsKKwlteSAkcGJhdCA9ICRzZWxmLT5lbnN1cmVfcGF0aCgkZGlyKTsKKwlteSAkZmJhdCA9ICRzZWxmLT5vcGVuX2ZpbGUoJHNlbGYtPnJlcG9fcGF0aCgkbS0+e2ZpbGVfYn0pLAorCQkJCSRwYmF0LCRzZWxmLT57cn0sJHNlbGYtPntwb29sfSk7CisJcHJpbnQgIlx0JG0tPntjaGd9XHQkbS0+e2ZpbGVfYn1cbiIgdW5sZXNzICRxOworCSRzZWxmLT5jaGdfZmlsZSgkZmJhdCwgJG0pOworCSRzZWxmLT5jbG9zZV9maWxlKCRmYmF0LHVuZGVmLCRzZWxmLT57cG9vbH0pOworfQorCitzdWIgVCB7IHNoaWZ0LT5NKEBfKSB9CisKK3N1YiBjaGFuZ2VfZmlsZV9wcm9wIHsKKwlteSAoJHNlbGYsICRmYmF0LCAkcG5hbWUsICRwdmFsKSA9IEBfOworCSRzZWxmLT5TVVBFUjo6Y2hhbmdlX2ZpbGVfcHJvcCgkZmJhdCwgJHBuYW1lLCAkcHZhbCwgJHNlbGYtPntwb29sfSk7Cit9CisKK3N1YiBjaGdfZmlsZSB7CisJbXkgKCRzZWxmLCAkZmJhdCwgJG0pID0gQF87CisJaWYgKCRtLT57bW9kZV9ifSA9fiAvNzU1JC8gJiYgJG0tPnttb2RlX2F9ICF+IC83NTUkLykgeworCQkkc2VsZi0+Y2hhbmdlX2ZpbGVfcHJvcCgkZmJhdCwnc3ZuOmV4ZWN1dGFibGUnLCcqJyk7CisJfSBlbHNpZiAoJG0tPnttb2RlX2J9ICF+IC83NTUkLyAmJiAkbS0+e21vZGVfYX0gPX4gLzc1NSQvKSB7CisJCSRzZWxmLT5jaGFuZ2VfZmlsZV9wcm9wKCRmYmF0LCdzdm46ZXhlY3V0YWJsZScsdW5kZWYpOworCX0KKwlteSAkZmggPSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUgb3IgY3JvYWsgJCE7CisJaWYgKCRtLT57bW9kZV9ifSA9fiAvXjEyMC8pIHsKKwkJcHJpbnQgJGZoICdsaW5rICcgb3IgY3JvYWsgJCE7CisJCSRzZWxmLT5jaGFuZ2VfZmlsZV9wcm9wKCRmYmF0LCdzdm46c3BlY2lhbCcsJyonKTsKKwl9IGVsc2lmICgkbS0+e21vZGVfYX0gPX4gL14xMjAvICYmICRtLT57bW9kZV9ifSAhfiAvXjEyMC8pIHsKKwkJJHNlbGYtPmNoYW5nZV9maWxlX3Byb3AoJGZiYXQsJ3N2bjpzcGVjaWFsJyx1bmRlZik7CisJfQorCWRlZmluZWQobXkgJHBpZCA9IGZvcmspIG9yIGNyb2FrICQhOworCWlmICghJHBpZCkgeworCQlvcGVuIFNURE9VVCwgJz4mJywgJGZoIG9yIGNyb2FrICQhOworCQlleGVjIHF3L2dpdC1jYXQtZmlsZSBibG9iLywgJG0tPntzaGExX2J9IG9yIGNyb2FrICQhOworCX0KKwl3YWl0cGlkICRwaWQsIDA7CisJY3JvYWsgJD8gaWYgJD87CisJJGZoLT5mbHVzaCA9PSAwIG9yIGNyb2FrICQhOworCXNlZWsgJGZoLCAwLCAwIG9yIGNyb2FrICQhOworCisJbXkgJG1kNSA9IERpZ2VzdDo6TUQ1LT5uZXc7CisJJG1kNS0+YWRkZmlsZSgkZmgpIG9yIGNyb2FrICQhOworCXNlZWsgJGZoLCAwLCAwIG9yIGNyb2FrICQhOworCisJbXkgJGV4cCA9ICRtZDUtPmhleGRpZ2VzdDsKKwlteSAkYXRkID0gJHNlbGYtPmFwcGx5X3RleHRkZWx0YSgkZmJhdCwgdW5kZWYsICRzZWxmLT57cG9vbH0pOworCW15ICRnb3QgPSBTVk46OlR4RGVsdGE6OnNlbmRfc3RyZWFtKCRmaCwgQCRhdGQsICRzZWxmLT57cG9vbH0pOworCWRpZSAiQ2hlY2tzdW0gbWlzbWF0Y2hcbmV4cGVjdGVkOiAkZXhwXG5nb3Q6ICRnb3RcbiIgaWYgKCRnb3QgbmUgJGV4cCk7CisKKwljbG9zZSAkZmggb3IgY3JvYWsgJCE7Cit9CisKK3N1YiBEIHsKKwlteSAoJHNlbGYsICRtLCAkcSkgPSBAXzsKKwlteSAoJGRpciwgJGZpbGUpID0gc3BsaXRfcGF0aCgkbS0+e2ZpbGVfYn0pOworCW15ICRwYmF0ID0gJHNlbGYtPmVuc3VyZV9wYXRoKCRkaXIpOworCXByaW50ICJcdERcdCRtLT57ZmlsZV9ifVxuIiB1bmxlc3MgJHE7CisJJHNlbGYtPmRlbGV0ZV9lbnRyeSgkbS0+e2ZpbGVfYn0sICRwYmF0KTsKK30KKworc3ViIGNsb3NlX2VkaXQgeworCW15ICgkc2VsZikgPSBAXzsKKwlteSAoJHAsJGJhdCkgPSAoJHNlbGYtPntwb29sfSwgJHNlbGYtPntiYXR9KTsKKwlmb3JlYWNoIChzb3J0IHsgJGIgPX4gdHIjLyMvIyA8PT4gJGEgPX4gdHIjLyMvIyB9IGtleXMgJSRiYXQpIHsKKwkJJHNlbGYtPmNsb3NlX2RpcmVjdG9yeSgkYmF0LT57JF99LCAkcCk7CisJfQorCSRzZWxmLT5TVVBFUjo6Y2xvc2VfZWRpdCgkcCk7CisJJHAtPmNsZWFyOworfQorCitzdWIgYWJvcnRfZWRpdCB7CisJbXkgKCRzZWxmKSA9IEBfOworCSRzZWxmLT5TVVBFUjo6YWJvcnRfZWRpdCgkc2VsZi0+e3Bvb2x9KTsKKwkkc2VsZi0+e3Bvb2x9LT5jbGVhcjsKK30KKworX19FTkRfXworCitEYXRhIHN0cnVjdHVyZXM6CisKKyRzdm5fbG9nIGhhc2hyZWYgKGFzIHJldHVybmVkIGJ5IHN2bl9sb2dfcmF3KQoreworCWZoID0+IGZpbGUgaGFuZGxlIG9mIHRoZSBsb2cgZmlsZSwKKwlzdGF0ZSA9PiBzdGF0ZSBvZiB0aGUgbG9nIGZpbGUgcGFyc2VyIChzZXAvbXNnL3Jldi9tc2dfc3RhcnQuLi4pCit9CisKKyRsb2dfbXNnIGhhc2hyZWYgYXMgcmV0dXJuZWQgYnkgbmV4dF9sb2dfZW50cnkoJHN2bl9sb2cpCit7CisJbXNnID0+ICd3aGl0ZXNwYWNlLWZvcm1hdHRlZCBsb2cgZW50cnkKKycsCQkJCQkJIyB0cmFpbGluZyBuZXdsaW5lIGlzIHByZXNlcnZlZAorCXJldmlzaW9uID0+ICc4JywJCQkjIGludGVnZXIKKwlkYXRlID0+ICcyMDA0LTAyLTI0VDE3OjAxOjQ0LjEwODM0NVonLAkjIGNvbW1pdCBkYXRlCisJYXV0aG9yID0+ICdjb21taXR0ZXIgbmFtZScKK307CisKKworQG1vZHMgPSBhcnJheSBvZiBkaWZmLWluZGV4IGxpbmUgaGFzaGVzLCBlYWNoIGVsZW1lbnQgcmVwcmVzZW50cyBvbmUgbGluZQorCW9mIGRpZmYtaW5kZXggb3V0cHV0CisKK2RpZmYtaW5kZXggbGluZSAoJG0gaGFzaCkKK3sKKwltb2RlX2EgPT4gZmlyc3QgY29sdW1uIG9mIGRpZmYtaW5kZXggb3V0cHV0LCBubyBsZWFkaW5nICc6JywKKwltb2RlX2IgPT4gc2Vjb25kIGNvbHVtbiBvZiBkaWZmLWluZGV4IG91dHB1dCwKKwlzaGExX2IgPT4gc2hhMXN1bSBvZiB0aGUgZmluYWwgYmxvYiwKKwljaGcgPT4gY2hhbmdlIHR5cGUgW01DUkFEVF0sCisJZmlsZV9hID0+IG9yaWdpbmFsIGZpbGUgbmFtZSBvZiBhIGZpbGUgKGlmZiBjaGcgaXMgJ0MnIG9yICdSJykKKwlmaWxlX2IgPT4gbmV3L2N1cnJlbnQgZmlsZSBuYW1lIG9mIGEgZmlsZSAoYW55IGNoZykKK30KKzsKKworIyByZXR2YWwgb2YgcmVhZF91cmxfcGF0aHN7LF9hbGx9KCk7CiskbF9tYXAgPSB7CisJIyByZXBvc2l0b3J5IHJvb3QgdXJsCisJJ2h0dHBzOi8vc3ZuLm11c2ljcGQub3JnJyA9PiB7CisJCSMgcmVwb3NpdG9yeSBwYXRoIAkJIyBHSVRfU1ZOX0lECisJCSdtcGQvdHJ1bmsnCQk9PgkndHJ1bmsnLAorCQknbXBkL3RhZ3MvMC4xMS41Jwk9PgkndGFncy8wLjExLjUnLAorCX0sCit9CisKK05vdGVzOgorCUkgZG9uJ3QgdHJ1c3QgdGhlIGVhY2goKSBmdW5jdGlvbiBvbiB1bmxlc3MgSSBjcmVhdGVkICVoYXNoIG15c2VsZgorCWJlY2F1c2UgdGhlIGludGVybmFsIGl0ZXJhdG9yIG1heSBub3QgaGF2ZSBzdGFydGVkIGF0IGJhc2UuCmRpZmYgLS1naXQgYS9naXQtc3ZuaW1wb3J0LnBlcmwgYi9naXQtc3ZuaW1wb3J0LnBlcmwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjZkYzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2dpdC1zdm5pbXBvcnQucGVybApAQCAtMCwwICsxLDkyNCBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKKyMgVGhpcyB0b29sIGlzIGNvcHlyaWdodCAoYykgMjAwNSwgTWF0dGhpYXMgVXJsaWNocy4KKyMgSXQgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdudSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorIworIyBUaGUgYmFzaWMgaWRlYSBpcyB0byBwdWxsIGFuZCBhbmFseXplIFNWTiBjaGFuZ2VzLgorIworIyBDaGVja2luZyBvdXQgdGhlIGZpbGVzIGlzIGRvbmUgYnkgYSBzaW5nbGUgbG9uZy1ydW5uaW5nIFNWTiBjb25uZWN0aW9uLgorIworIyBUaGUgaGVhZCByZXZpc2lvbiBpcyBvbiBicmFuY2ggIm9yaWdpbiIgYnkgZGVmYXVsdC4KKyMgWW91IGNhbiBjaGFuZ2UgdGhhdCB3aXRoIHRoZSAnLW8nIG9wdGlvbi4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBHZXRvcHQ6OlN0ZDsKK3VzZSBGaWxlOjpDb3B5OwordXNlIEZpbGU6OlNwZWM7Cit1c2UgRmlsZTo6VGVtcCBxdyh0ZW1wZmlsZSk7Cit1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGgpOwordXNlIEZpbGU6OkJhc2VuYW1lIHF3KGJhc2VuYW1lIGRpcm5hbWUpOwordXNlIFRpbWU6OkxvY2FsOwordXNlIElPOjpQaXBlOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIpOwordXNlIElQQzo6T3BlbjI7Cit1c2UgU1ZOOjpDb3JlOwordXNlIFNWTjo6UmE7CisKK2RpZSAiTmVlZCBTVk46Q29yZSAxLjIuMSBvciBiZXR0ZXIiIGlmICRTVk46OkNvcmU6OlZFUlNJT04gbHQgIjEuMi4xIjsKKworJFNJR3snUElQRSd9PSJJR05PUkUiOworJEVOVnsnVFonfT0iVVRDIjsKKworb3VyKCRvcHRfaCwkb3B0X28sJG9wdF92LCRvcHRfdSwkb3B0X0MsJG9wdF9pLCRvcHRfbSwkb3B0X00sJG9wdF90LCRvcHRfVCwKKyAgICAkb3B0X2IsJG9wdF9yLCRvcHRfSSwkb3B0X0EsJG9wdF9zLCRvcHRfbCwkb3B0X2QsJG9wdF9EKTsKKworc3ViIHVzYWdlKCkgeworCXByaW50IFNUREVSUiA8PEVORDsKK1VzYWdlOiAke1xiYXNlbmFtZSAkMH0gICAgICMgZmV0Y2gvdXBkYXRlIEdJVCBmcm9tIFNWTgorICAgICAgIFstbyBicmFuY2gtZm9yLUhFQURdIFstaF0gWy12XSBbLWwgbWF4X3Jldl0KKyAgICAgICBbLUMgR0lUX3JlcG9zaXRvcnldIFstdCB0YWduYW1lXSBbLVQgdHJ1bmtuYW1lXSBbLWIgYnJhbmNobmFtZV0KKyAgICAgICBbLWR8LURdIFstaV0gWy11XSBbLXJdIFstSSBpZ25vcmVmaWxlbmFtZV0gWy1zIHN0YXJ0X2NoZ10KKyAgICAgICBbLW1dIFstTSByZWdleF0gWy1BIGF1dGhvcl9maWxlXSBbU1ZOX1VSTF0KK0VORAorCWV4aXQoMSk7Cit9CisKK2dldG9wdHMoIkE6YjpDOmREaGlJOmw6bU06bzpyczp0OlQ6dXYiKSBvciB1c2FnZSgpOwordXNhZ2UgaWYgJG9wdF9oOworCitteSAkdGFnX25hbWUgPSAkb3B0X3QgfHwgInRhZ3MiOworbXkgJHRydW5rX25hbWUgPSAkb3B0X1QgfHwgInRydW5rIjsKK215ICRicmFuY2hfbmFtZSA9ICRvcHRfYiB8fCAiYnJhbmNoZXMiOworCitAQVJHViA9PSAxIG9yIEBBUkdWID09IDIgb3IgdXNhZ2UoKTsKKworJG9wdF9vIHx8PSAib3JpZ2luIjsKKyRvcHRfcyB8fD0gMTsKK215ICRnaXRfdHJlZSA9ICRvcHRfQzsKKyRnaXRfdHJlZSB8fD0gIi4iOworCitteSAkc3ZuX3VybCA9ICRBUkdWWzBdOworbXkgJHN2bl9kaXIgPSAkQVJHVlsxXTsKKworb3VyIEBtZXJnZXJ4ID0gKCk7CitpZiAoJG9wdF9tKSB7CisJbXkgJGJyYW5jaF9lc2MgPSBxdW90ZW1ldGEgKCRicmFuY2hfbmFtZSk7CisJbXkgJHRydW5rX2VzYyAgPSBxdW90ZW1ldGEgKCR0cnVua19uYW1lKTsKKwlAbWVyZ2VyeCA9CisJKAorCQlxciFcYig/Om1lcmcoPzplZD98aW5nKSlcYi4qP1xiKCg/Oig/PD0kYnJhbmNoX2VzYy8pW1x3XC5cLV0rKXwoPzokdHJ1bmtfZXNjKSlcYiFpLAorCQlxciFcYig/OmZyb218b2YpXFcrKCg/Oig/PD0kYnJhbmNoX2VzYy8pW1x3XC5cLV0rKXwoPzokdHJ1bmtfZXNjKSlcYiFpLAorCQlxciFcYig/OmZyb218b2YpXFcrKD86dGhlICk/KFtcd1wuXC1dKylbLVxzXWJyYW5jaFxiIWkKKwkpOworfQoraWYgKCRvcHRfTSkgeworCXVuc2hpZnQgKEBtZXJnZXJ4LCBxci8kb3B0X00vKTsKK30KKworIyBBYnNvbHV0aXplIGZpbGVuYW1lIG5vdywgc2luY2Ugd2Ugd2lsbCBoYXZlIGNoZGlyJ2VkIGJ5IHRoZSB0aW1lIHdlCisjIGdldCBhcm91bmQgdG8gb3BlbmluZyBpdC4KKyRvcHRfQSA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoJG9wdF9BKSBpZiAkb3B0X0E7CisKK291ciAldXNlcnMgPSAoKTsKK291ciAkdXNlcnNfZmlsZSA9IHVuZGVmOworc3ViIHJlYWRfdXNlcnMoJCkgeworCSR1c2Vyc19maWxlID0gRmlsZTo6U3BlYy0+cmVsMmFicyhAXyk7CisJZGllICJDYW5ub3Qgb3BlbiAkdXNlcnNfZmlsZVxuIiB1bmxlc3MgLWYgJHVzZXJzX2ZpbGU7CisJb3BlbihteSAkYXV0aG9ycywkdXNlcnNfZmlsZSk7CisJd2hpbGUoPCRhdXRob3JzPikgeworCQljaG9tcDsKKwkJbmV4dCB1bmxlc3MgL14oXFMrPylccyo9XHMqKC4rPylccyo8KC4rKT5ccyokLzsKKwkJKG15ICR1c2VyLG15ICRuYW1lLG15ICRlbWFpbCkgPSAoJDEsJDIsJDMpOworCQkkdXNlcnN7JHVzZXJ9ID0gWyRuYW1lLCRlbWFpbF07CisJfQorCWNsb3NlKCRhdXRob3JzKTsKK30KKworc2VsZWN0KFNUREVSUik7ICR8PTE7IHNlbGVjdChTVERPVVQpOworCisKK3BhY2thZ2UgU1ZOY29ubjsKKyMgQmFzaWMgU1ZOIGNvbm5lY3Rpb24uCisjIFdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBjb25uZWN0aW5nIGFuZCBkb3dubG9hZGluZywgc28gLi4uCisKK3VzZSBGaWxlOjpTcGVjOwordXNlIEZpbGU6OlRlbXAgcXcodGVtcGZpbGUpOwordXNlIFBPU0lYIHF3KHN0cmZ0aW1lIGR1cDIpOwordXNlIEZjbnRsIHF3KFNFRUtfU0VUKTsKKworc3ViIG5ldyB7CisJbXkoJHdoYXQsJHJlcG8pID0gQF87CisJJHdoYXQ9cmVmKCR3aGF0KSBpZiByZWYoJHdoYXQpOworCisJbXkgJHNlbGYgPSB7fTsKKwkkc2VsZi0+eydidWZmZXInfSA9ICIiOworCWJsZXNzKCRzZWxmLCR3aGF0KTsKKworCSRyZXBvID1+IHMjLyskIyM7CisJJHNlbGYtPnsnZnVsbHJlcCd9ID0gJHJlcG87CisJJHNlbGYtPmNvbm4oKTsKKworCXJldHVybiAkc2VsZjsKK30KKworc3ViIGNvbm4geworCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHJlcG8gPSAkc2VsZi0+eydmdWxscmVwJ307CisJbXkgJGF1dGggPSBTVk46OkNvcmU6OmF1dGhfb3BlbiAoW1NWTjo6Q2xpZW50OjpnZXRfc2ltcGxlX3Byb3ZpZGVyLAorCQkJICBTVk46OkNsaWVudDo6Z2V0X3NzbF9zZXJ2ZXJfdHJ1c3RfZmlsZV9wcm92aWRlciwKKwkJCSAgU1ZOOjpDbGllbnQ6OmdldF91c2VybmFtZV9wcm92aWRlcl0pOworCW15ICRzID0gU1ZOOjpSYS0+bmV3KHVybCA9PiAkcmVwbywgYXV0aCA9PiAkYXV0aCk7CisJZGllICJTVk4gY29ubmVjdGlvbiB0byAkcmVwbzogJCFcbiIgdW5sZXNzIGRlZmluZWQgJHM7CisJJHNlbGYtPnsnc3ZuJ30gPSAkczsKKwkkc2VsZi0+eydyZXBvJ30gPSAkcmVwbzsKKwkkc2VsZi0+eydtYXhyZXYnfSA9ICRzLT5nZXRfbGF0ZXN0X3Jldm51bSgpOworfQorCitzdWIgZmlsZSB7CisJbXkoJHNlbGYsJHBhdGgsJHJldikgPSBAXzsKKworCW15ICgkZmgsICRuYW1lKSA9IHRlbXBmaWxlKCdnaXRzdm4uWFhYWFhYJywKKwkJICAgIERJUiA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSwgVU5MSU5LID0+IDEpOworCisJcHJpbnQgIi4uLiAkcmV2ICRwYXRoIC4uLlxuIiBpZiAkb3B0X3Y7CisJbXkgKHVuZGVmLCAkcHJvcGVydGllcyk7CisJbXkgJHBvb2wgPSBTVk46OlBvb2wtPm5ldygpOworCWV2YWwgeyAodW5kZWYsICRwcm9wZXJ0aWVzKQorCQkgICA9ICRzZWxmLT57J3N2bid9LT5nZXRfZmlsZSgkcGF0aCwkcmV2LCRmaCwkcG9vbCk7IH07CisJJHBvb2wtPmNsZWFyOworCWlmKCRAKSB7CisJCXJldHVybiB1bmRlZiBpZiAkQCA9fiAvQXR0ZW1wdGVkIHRvIGdldCBjaGVja3N1bS87CisJCWRpZSAkQDsKKwl9CisJbXkgJG1vZGU7CisJaWYgKGV4aXN0cyAkcHJvcGVydGllcy0+eydzdm46ZXhlY3V0YWJsZSd9KSB7CisJCSRtb2RlID0gJzEwMDc1NSc7CisJfSBlbHNpZiAoZXhpc3RzICRwcm9wZXJ0aWVzLT57J3N2bjpzcGVjaWFsJ30pIHsKKwkJbXkgKCRzcGVjaWFsX2NvbnRlbnQsICRmaWxlc2l6ZSk7CisJCSRmaWxlc2l6ZSA9IHRlbGwgJGZoOworCQlzZWVrICRmaCwgMCwgU0VFS19TRVQ7CisJCXJlYWQgJGZoLCAkc3BlY2lhbF9jb250ZW50LCAkZmlsZXNpemU7CisJCWlmICgkc3BlY2lhbF9jb250ZW50ID1+IHMvXmxpbmsgLy8pIHsKKwkJCSRtb2RlID0gJzEyMDAwMCc7CisJCQlzZWVrICRmaCwgMCwgU0VFS19TRVQ7CisJCQl0cnVuY2F0ZSAkZmgsIDA7CisJCQlwcmludCAkZmggJHNwZWNpYWxfY29udGVudDsKKwkJfSBlbHNlIHsKKwkJCWRpZSAidW5leHBlY3RlZCBzdm46c3BlY2lhbCBmaWxlIGVuY291bnRlcmVkIjsKKwkJfQorCX0gZWxzZSB7CisJCSRtb2RlID0gJzEwMDY0NCc7CisJfQorCWNsb3NlICgkZmgpOworCisJcmV0dXJuICgkbmFtZSwgJG1vZGUpOworfQorCitzdWIgaWdub3JlIHsKKwlteSgkc2VsZiwkcGF0aCwkcmV2KSA9IEBfOworCisJcHJpbnQgIi4uLiAkcmV2ICRwYXRoIC4uLlxuIiBpZiAkb3B0X3Y7CisJbXkgKHVuZGVmLHVuZGVmLCRwcm9wZXJ0aWVzKQorCSAgICA9ICRzZWxmLT57J3N2bid9LT5nZXRfZGlyKCRwYXRoLCRyZXYsdW5kZWYpOworCWlmIChleGlzdHMgJHByb3BlcnRpZXMtPnsnc3ZuOmlnbm9yZSd9KSB7CisJCW15ICgkZmgsICRuYW1lKSA9IHRlbXBmaWxlKCdnaXRzdm4uWFhYWFhYJywKKwkJCQkJICAgRElSID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLAorCQkJCQkgICBVTkxJTksgPT4gMSk7CisJCXByaW50ICRmaCAkcHJvcGVydGllcy0+eydzdm46aWdub3JlJ307CisJCWNsb3NlKCRmaCk7CisJCXJldHVybiAkbmFtZTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdW5kZWY7CisJfQorfQorCitwYWNrYWdlIG1haW47Cit1c2UgVVJJOworCitvdXIgJHN2biA9ICRzdm5fdXJsOworJHN2biAuPSAiLyRzdm5fZGlyIiBpZiBkZWZpbmVkICRzdm5fZGlyOworbXkgJHN2bjIgPSBTVk5jb25uLT5uZXcoJHN2bik7Ciskc3ZuID0gU1ZOY29ubi0+bmV3KCRzdm4pOworCitteSAkbHdwX3VhOworaWYoJG9wdF9kIG9yICRvcHRfRCkgeworCSRzdm5fdXJsID0gVVJJLT5uZXcoJHN2bl91cmwpLT5jYW5vbmljYWw7CisJaWYoJG9wdF9EKSB7CisJCSRzdm5fZGlyID1+IHMjLyokIy8jOworCX0gZWxzZSB7CisJCSRzdm5fZGlyID0gIiI7CisJfQorCWlmICgkc3ZuX3VybC0+c2NoZW1lIGVxICJodHRwIikgeworCQl1c2UgTFdQOjpVc2VyQWdlbnQ7CisJCSRsd3BfdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KGtlZXBfYWxpdmUgPT4gMSwgcmVxdWVzdHNfcmVkaXJlY3RhYmxlID0+IFtdKTsKKwl9IGVsc2UgeworCQlwcmludCBTVERFUlIgIldhcm5pbmc6IG5vdCBIVFRQOyB0dXJuaW5nIG9mZiBkaXJlY3QgZmlsZSBhY2Nlc3NcbiI7CisJCSRvcHRfZD0wOworCX0KK30KKworc3ViIHBkYXRlKCQpIHsKKwlteSgkZCkgPSBAXzsKKwkkZCA9fiBtIyhcZFxkXGRcZCktKFxkXGQpLShcZFxkKVQoXGRcZCk6KFxkXGQpOihcZFxkKSMKKwkJb3IgZGllICJVbnBhcnNlYWJsZSBkYXRlOiAkZFxuIjsKKwlteSAkeT0kMTsgJHktPTE5MDAgaWYgJHk+MTkwMDsKKwlyZXR1cm4gdGltZWdtKCQ2fHwwLCQ1LCQ0LCQzLCQyLTEsJHkpOworfQorCitzdWIgZ2V0d2QoKSB7CisJbXkgJHB3ZCA9IGBwd2RgOworCWNob21wICRwd2Q7CisJcmV0dXJuICRwd2Q7Cit9CisKKworc3ViIGdldF9oZWFkcmVmKCQkKSB7CisgICAgbXkgJG5hbWUgICAgPSBzaGlmdDsKKyAgICBteSAkZ2l0X2RpciA9IHNoaWZ0OworICAgIG15ICRzaGE7CisKKyAgICBpZiAob3BlbihDLCIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRuYW1lIikpIHsKKwljaG9tcCgkc2hhID0gPEM+KTsKKwljbG9zZShDKTsKKwlsZW5ndGgoJHNoYSkgPT0gNDAKKwkgICAgb3IgZGllICJDYW5ub3QgZ2V0IGhlYWQgaWQgZm9yICRuYW1lICgkc2hhKTogJCFcbiI7CisgICAgfQorICAgIHJldHVybiAkc2hhOworfQorCisKKy1kICRnaXRfdHJlZQorCW9yIG1rZGlyKCRnaXRfdHJlZSwwNzc3KQorCW9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSAkZ2l0X3RyZWU6ICQhIjsKK2NoZGlyKCRnaXRfdHJlZSk7CisKK215ICRvcmlnX2JyYW5jaCA9ICIiOworbXkgJGZvcndhcmRfbWFzdGVyID0gMDsKK215ICVicmFuY2hlczsKKworbXkgJGdpdF9kaXIgPSAkRU5WeyJHSVRfRElSIn0gfHwgIi5naXQiOworJGdpdF9kaXIgPSBnZXR3ZCgpLiIvIi4kZ2l0X2RpciB1bmxlc3MgJGdpdF9kaXIgPX4gbSNeLyM7CiskRU5WeyJHSVRfRElSIn0gPSAkZ2l0X2RpcjsKK215ICRvcmlnX2dpdF9pbmRleDsKKyRvcmlnX2dpdF9pbmRleCA9ICRFTlZ7R0lUX0lOREVYX0ZJTEV9IGlmIGV4aXN0cyAkRU5We0dJVF9JTkRFWF9GSUxFfTsKK215ICgkZ2l0X2loLCAkZ2l0X2luZGV4KSA9IHRlbXBmaWxlKCdnaXRYWFhYWFgnLCBTVUZGSVggPT4gJy5pZHgnLAorCQkJCSAgICBESVIgPT4gRmlsZTo6U3BlYy0+dG1wZGlyKCkpOworY2xvc2UgKCRnaXRfaWgpOworJEVOVntHSVRfSU5ERVhfRklMRX0gPSAkZ2l0X2luZGV4OworbXkgJG1heG51bSA9IDA7CitteSAkbGFzdF9yZXYgPSAiIjsKK215ICRsYXN0X2JyYW5jaDsKK215ICRjdXJyZW50X3JldiA9ICRvcHRfcyB8fCAxOwordW5sZXNzKC1kICRnaXRfZGlyKSB7CisJc3lzdGVtKCJnaXQtaW5pdC1kYiIpOworCWRpZSAiQ2Fubm90IGluaXQgdGhlIEdJVCBkYiBhdCAkZ2l0X3RyZWU6ICQ/XG4iIGlmICQ/OworCXN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIpOworCWRpZSAiQ2Fubm90IGluaXQgYW4gZW1wdHkgdHJlZTogJD9cbiIgaWYgJD87CisKKwkkbGFzdF9icmFuY2ggPSAkb3B0X287CisJJG9yaWdfYnJhbmNoID0gIiI7Cit9IGVsc2UgeworCS1mICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIKKwkJb3IgZGllICJCcmFuY2ggJyRvcHRfbycgZG9lcyBub3QgZXhpc3QuXG4iLgorCQkgICAgICAgIkVpdGhlciB1c2UgdGhlIGNvcnJlY3QgJy1vIGJyYW5jaCcgb3B0aW9uLFxuIi4KKwkJICAgICAgICJvciBpbXBvcnQgdG8gYSBuZXcgcmVwb3NpdG9yeS5cbiI7CisKKwktZiAiJGdpdF9kaXIvc3ZuMmdpdCIKKwkJb3IgZGllICInJGdpdF9kaXIvc3ZuMmdpdCcgZG9lcyBub3QgZXhpc3QuXG4iLgorCQkgICAgICAgIllvdSBuZWVkIHRoYXQgZmlsZSBmb3IgaW5jcmVtZW50YWwgaW1wb3J0cy5cbiI7CisJb3BlbihGLCAiZ2l0LXN5bWJvbGljLXJlZiBIRUFEIHwiKSBvcgorCQlkaWUgIkNhbm5vdCBydW4gZ2l0LXN5bWJvbGljLXJlZjogJCFcbiI7CisJY2hvbXAgKCRsYXN0X2JyYW5jaCA9IDxGPik7CisJJGxhc3RfYnJhbmNoID0gYmFzZW5hbWUoJGxhc3RfYnJhbmNoKTsKKwljbG9zZShGKTsKKwl1bmxlc3MoJGxhc3RfYnJhbmNoKSB7CisJCXdhcm4gIkNhbm5vdCByZWFkIHRoZSBsYXN0IGJyYW5jaCBuYW1lOiAkISAtLSBhc3N1bWluZyAnbWFzdGVyJ1xuIjsKKwkJJGxhc3RfYnJhbmNoID0gIm1hc3RlciI7CisJfQorCSRvcmlnX2JyYW5jaCA9ICRsYXN0X2JyYW5jaDsKKwkkbGFzdF9yZXYgPSBnZXRfaGVhZHJlZigkb3JpZ19icmFuY2gsICRnaXRfZGlyKTsKKwlpZiAoLWYgIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpIHsKKwkJZGllIDw8RU9NOworU1ZOMkdJVF9IRUFEIGV4aXN0cy4KK01ha2Ugc3VyZSB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IGNvcnJlc3BvbmRzIHRvIEhFQUQgYW5kIHJlbW92ZSBTVk4yR0lUX0hFQUQuCitZb3UgbWF5IG5lZWQgdG8gcnVuCisKKyAgICBnaXQtcmVhZC10cmVlIC1tIC11IFNWTjJHSVRfSEVBRCBIRUFECitFT00KKwl9CisJc3lzdGVtKCdjcCcsICIkZ2l0X2Rpci9IRUFEIiwgIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpOworCisJJGZvcndhcmRfbWFzdGVyID0KKwkgICAgJG9wdF9vIG5lICdtYXN0ZXInICYmIC1mICIkZ2l0X2Rpci9yZWZzL2hlYWRzL21hc3RlciIgJiYKKwkgICAgc3lzdGVtKCdjbXAnLCAnLXMnLCAiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiLAorCQkJCSIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRvcHRfbyIpID09IDA7CisKKwkjIHBvcHVsYXRlIGluZGV4CisJc3lzdGVtKCdnaXQtcmVhZC10cmVlJywgJGxhc3RfcmV2KTsKKwlkaWUgInJlYWQtdHJlZSBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCisJIyBHZXQgdGhlIGxhc3QgaW1wb3J0IHRpbWVzdGFtcHMKKwlvcGVuIG15ICRCLCI8IiwgIiRnaXRfZGlyL3N2bjJnaXQiOworCXdoaWxlKDwkQj4pIHsKKwkJY2hvbXA7CisJCW15KCRudW0sJGJyYW5jaCwkcmVmKSA9IHNwbGl0OworCQkkYnJhbmNoZXN7JGJyYW5jaH17JG51bX0gPSAkcmVmOworCQkkYnJhbmNoZXN7JGJyYW5jaH17IkxBU1QifSA9ICRyZWY7CisJCSRjdXJyZW50X3JldiA9ICRudW0rMSBpZiAkY3VycmVudF9yZXYgPD0gJG51bTsKKwl9CisJY2xvc2UoJEIpOworfQorLWQgJGdpdF9kaXIKKwlvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgZ2l0IHN1YmRpciAoJGdpdF9kaXIpLlxuIjsKKworbXkgJGRlZmF1bHRfYXV0aG9ycyA9ICIkZ2l0X2Rpci9zdm4tYXV0aG9ycyI7CitpZiAoJG9wdF9BKSB7CisJcmVhZF91c2Vycygkb3B0X0EpOworCWNvcHkoJG9wdF9BLCRkZWZhdWx0X2F1dGhvcnMpIG9yIGRpZSAiQ29weSBmYWlsZWQ6ICQhIjsKK30gZWxzZSB7CisJcmVhZF91c2VycygkZGVmYXVsdF9hdXRob3JzKSBpZiAtZiAkZGVmYXVsdF9hdXRob3JzOworfQorCitvcGVuIEJSQU5DSEVTLCI+PiIsICIkZ2l0X2Rpci9zdm4yZ2l0IjsKKworc3ViIG5vZGVfa2luZCgkJCQpIHsKKwlteSAoJGJyYW5jaCwgJHBhdGgsICRyZXZpc2lvbikgPSBAXzsKKwlteSAkcG9vbD1TVk46OlBvb2wtPm5ldzsKKwlteSAka2luZCA9ICRzdm4tPnsnc3ZuJ30tPmNoZWNrX3BhdGgocmV2ZXJ0X3NwbGl0X3BhdGgoJGJyYW5jaCwkcGF0aCksJHJldmlzaW9uLCRwb29sKTsKKwkkcG9vbC0+Y2xlYXI7CisJcmV0dXJuICRraW5kOworfQorCitzdWIgcmV2ZXJ0X3NwbGl0X3BhdGgoJCQpIHsKKwlteSgkYnJhbmNoLCRwYXRoKSA9IEBfOworCisJbXkgJHN2bnBhdGg7CisJJHBhdGggPSAiIiBpZiAkcGF0aCBlcSAiLyI7ICMgdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IC4uLgorCWlmKCRicmFuY2ggZXEgIi8iKSB7CisJCSRzdm5wYXRoID0gIiR0cnVua19uYW1lLyRwYXRoIjsKKwl9IGVsc2lmKCRicmFuY2ggPX4gbSNeLyMpIHsKKwkJJHN2bnBhdGggPSAiJHRhZ19uYW1lJGJyYW5jaC8kcGF0aCI7CisJfSBlbHNlIHsKKwkJJHN2bnBhdGggPSAiJGJyYW5jaF9uYW1lLyRicmFuY2gvJHBhdGgiOworCX0KKworCSRzdm5wYXRoID1+IHMjLyskIyM7CisJcmV0dXJuICRzdm5wYXRoOworfQorCitzdWIgZ2V0X2ZpbGUoJCQkKSB7CisJbXkoJHJldiwkYnJhbmNoLCRwYXRoKSA9IEBfOworCisJbXkgJHN2bnBhdGggPSByZXZlcnRfc3BsaXRfcGF0aCgkYnJhbmNoLCRwYXRoKTsKKworCSMgbm93IGdldCBpdAorCW15ICgkbmFtZSwkbW9kZSk7CisJaWYoJG9wdF9kKSB7CisJCW15KCRyZXEsJHJlcyk7CisKKwkJIyAvc3ZuLyFzdm4vYmMvMi9kamFuZ28vdHJ1bmsvZGphbmdvLWRvY3MvYnVpbGQucHkKKwkJbXkgJHVybD0kc3ZuX3VybC0+Y2xvbmUoKTsKKwkJJHVybC0+cGF0aCgkdXJsLT5wYXRoLiIvIXN2bi9iYy8kcmV2LyRzdm5fZGlyJHN2bnBhdGgiKTsKKwkJcHJpbnQgIi4uLiAkcGF0aC4uLlxuIiBpZiAkb3B0X3Y7CisJCSRyZXEgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoR0VUID0+ICR1cmwpOworCQkkcmVzID0gJGx3cF91YS0+cmVxdWVzdCgkcmVxKTsKKwkJaWYgKCRyZXMtPmlzX3N1Y2Nlc3MpIHsKKwkJCW15ICRmaDsKKwkJCSgkZmgsICRuYW1lKSA9IHRlbXBmaWxlKCdnaXRzdm4uWFhYWFhYJywKKwkJCURJUiA9PiBGaWxlOjpTcGVjLT50bXBkaXIoKSwgVU5MSU5LID0+IDEpOworCQkJcHJpbnQgJGZoICRyZXMtPmNvbnRlbnQ7CisJCQljbG9zZSgkZmgpIG9yIGRpZSAiQ291bGQgbm90IHdyaXRlICRuYW1lOiAkIVxuIjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB1bmRlZiBpZiAkcmVzLT5jb2RlID09IDMwMTsgIyBkaXJlY3Rvcnk/CisJCQlkaWUgJHJlcy0+c3RhdHVzX2xpbmUuIiBhdCAkdXJsXG4iOworCQl9CisJCSRtb2RlID0gJzA2NDQnOyAjIGNhbid0IG9idGFpbiBtb2RlIHZpYSBkaXJlY3QgaHR0cCByZXF1ZXN0PworCX0gZWxzZSB7CisJCSgkbmFtZSwkbW9kZSkgPSAkc3ZuLT5maWxlKCIkc3ZucGF0aCIsJHJldik7CisJCXJldHVybiB1bmRlZiB1bmxlc3MgZGVmaW5lZCAkbmFtZTsKKwl9CisKKwlteSAkcGlkID0gb3BlbihteSAkRiwgJy18Jyk7CisJZGllICQhIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJaWYgKCEkcGlkKSB7CisJICAgIGV4ZWMoImdpdC1oYXNoLW9iamVjdCIsICItdyIsICRuYW1lKQorCQlvciBkaWUgIkNhbm5vdCBjcmVhdGUgb2JqZWN0OiAkIVxuIjsKKwl9CisJbXkgJHNoYSA9IDwkRj47CisJY2hvbXAgJHNoYTsKKwljbG9zZSAkRjsKKwl1bmxpbmsgJG5hbWU7CisJcmV0dXJuIFskbW9kZSwgJHNoYSwgJHBhdGhdOworfQorCitzdWIgZ2V0X2lnbm9yZSgkJCQkJCkgeworCW15KCRuZXcsJG9sZCwkcmV2LCRicmFuY2gsJHBhdGgpID0gQF87CisKKwlyZXR1cm4gdW5sZXNzICRvcHRfSTsKKwlteSAkc3ZucGF0aCA9IHJldmVydF9zcGxpdF9wYXRoKCRicmFuY2gsJHBhdGgpOworCW15ICRuYW1lID0gJHN2bi0+aWdub3JlKCIkc3ZucGF0aCIsJHJldik7CisJaWYgKCRwYXRoIGVxICcvJykgeworCQkkcGF0aCA9ICRvcHRfSTsKKwl9IGVsc2UgeworCQkkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoJHBhdGgsJG9wdF9JKTsKKwl9CisJaWYgKGRlZmluZWQgJG5hbWUpIHsKKwkJbXkgJHBpZCA9IG9wZW4obXkgJEYsICctfCcpOworCQlkaWUgJCEgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJaWYgKCEkcGlkKSB7CisJCQlleGVjKCJnaXQtaGFzaC1vYmplY3QiLCAiLXciLCAkbmFtZSkKKwkJCSAgICBvciBkaWUgIkNhbm5vdCBjcmVhdGUgb2JqZWN0OiAkIVxuIjsKKwkJfQorCQlteSAkc2hhID0gPCRGPjsKKwkJY2hvbXAgJHNoYTsKKwkJY2xvc2UgJEY7CisJCXVubGluayAkbmFtZTsKKwkJcHVzaChAJG5ldyxbJzA2NDQnLCRzaGEsJHBhdGhdKTsKKwl9IGVsc2UgeworCQlwdXNoKEAkb2xkLCRwYXRoKTsKKwl9Cit9CisKK3N1YiBzcGxpdF9wYXRoKCQkKSB7CisJbXkoJHJldiwkcGF0aCkgPSBAXzsKKwlteSAkYnJhbmNoOworCisJaWYoJHBhdGggPX4gcyNeL1xRJHRhZ19uYW1lXEUvKFteL10rKS8/IyMpIHsKKwkJJGJyYW5jaCA9ICIvJDEiOworCX0gZWxzaWYoJHBhdGggPX4gcyNeL1xRJHRydW5rX25hbWVcRS8/IyMpIHsKKwkJJGJyYW5jaCA9ICIvIjsKKwl9IGVsc2lmKCRwYXRoID1+IHMjXi9cUSRicmFuY2hfbmFtZVxFLyhbXi9dKykvPyMjKSB7CisJCSRicmFuY2ggPSAkMTsKKwl9IGVsc2UgeworCQlteSAlbm9fZXJyb3IgPSAoCisJCQkiLyIgPT4gMSwKKwkJCSIvJHRhZ19uYW1lIiA9PiAxLAorCQkJIi8kYnJhbmNoX25hbWUiID0+IDEKKwkJKTsKKwkJcHJpbnQgU1RERVJSICIkcmV2OiBVbnJlY29nbml6ZWQgcGF0aDogJHBhdGhcbiIgdW5sZXNzIChkZWZpbmVkICRub19lcnJvcnskcGF0aH0pOworCQlyZXR1cm4gKCkKKwl9CisJJHBhdGggPSAiLyIgaWYgJHBhdGggZXEgIiI7CisJcmV0dXJuICgkYnJhbmNoLCRwYXRoKTsKK30KKworc3ViIGJyYW5jaF9yZXYoJCQpIHsKKworCW15ICgkc3JjYnJhbmNoLCR1cHRvcmV2KSA9IEBfOworCisJbXkgJGJicmFuY2hlcyA9ICRicmFuY2hlc3skc3JjYnJhbmNofTsKKwlteSBAcmV2cyA9IHJldmVyc2Ugc29ydCB7ICgkYSBlcSAnTEFTVCcgPyAwIDogJGEpIDw9PiAoJGIgZXEgJ0xBU1QnID8gMCA6ICRiKSB9IGtleXMgJSRiYnJhbmNoZXM7CisJbXkgJHRoZXJldjsKKwlmb3JlYWNoIG15ICRhcmV2KEByZXZzKSB7CisJCW5leHQgaWYgICgkYXJldiBlcSAnTEFTVCcpOworCQlpZiAoJGFyZXYgPD0gJHVwdG9yZXYpIHsKKwkJCSR0aGVyZXYgPSAkYXJldjsKKwkJCWxhc3Q7CisJCX0KKwl9CisJcmV0dXJuICR0aGVyZXY7Cit9CisKK3N1YiBjb3B5X3BhdGgoJCQkJCQkJCQpIHsKKwkjIFNvbWVib2R5IGNvcGllZCBhIHdob2xlIHN1YmRpcmVjdG9yeS4KKwkjIFdlIG5lZWQgdG8gZmluZCB0aGUgaW5kZXggZW50cmllcyBmcm9tIHRoZSBvbGQgdmVyc2lvbiB3aGljaCB0aGUKKwkjIFNWTiBsb2cgZW50cnkgcG9pbnRzIHRvLCBhbmQgYWRkIHRoZW0gdG8gdGhlIG5ldyBwbGFjZS4KKworCW15KCRuZXdyZXYsJG5ld2JyYW5jaCwkcGF0aCwkb2xkcGF0aCwkcmV2LCRub2RlX2tpbmQsJG5ldywkcGFyZW50cykgPSBAXzsKKworCW15KCRzcmNicmFuY2gsJHNyY3BhdGgpID0gc3BsaXRfcGF0aCgkcmV2LCRvbGRwYXRoKTsKKwl1bmxlc3MoZGVmaW5lZCAkc3JjYnJhbmNoKSB7CisJCXByaW50ICJQYXRoIG5vdCBmb3VuZCB3aGVuIGNvcHlpbmcgZnJvbSAkb2xkcGF0aCBAICRyZXZcbiI7CisJCXJldHVybjsKKwl9CisJbXkgJHRoZXJldiA9IGJyYW5jaF9yZXYoJHNyY2JyYW5jaCwgJHJldik7CisJbXkgJGdpdHJldiA9ICRicmFuY2hlc3skc3JjYnJhbmNofXskdGhlcmV2fTsKKwl1bmxlc3MoJGdpdHJldikgeworCQlwcmludCBTVERFUlIgIiRuZXdyZXY6JG5ld2JyYW5jaDogY291bGQgbm90IGZpbmQgJG9sZHBhdGggXEAgJHJldlxuIjsKKwkJcmV0dXJuOworCX0KKwlpZiAoJHNyY2JyYW5jaCBuZSAkbmV3YnJhbmNoKSB7CisJCXB1c2goQCRwYXJlbnRzLCAkYnJhbmNoZXN7JHNyY2JyYW5jaH17J0xBU1QnfSk7CisJfQorCXByaW50ICIkbmV3cmV2OiRuZXdicmFuY2g6JHBhdGg6IGNvcHlpbmcgZnJvbSAkc3JjYnJhbmNoOiRzcmNwYXRoIEAgJHJldlxuIiBpZiAkb3B0X3Y7CisJaWYgKCRub2RlX2tpbmQgZXEgJFNWTjo6Tm9kZTo6ZGlyKSB7CisJCQkkc3JjcGF0aCA9fiBzIy8qJCMvIzsKKwl9CisJCisJbXkgJHBpZCA9IG9wZW4gbXkgJGYsJy18JzsKKwlkaWUgJCEgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwlpZiAoISRwaWQpIHsKKwkJZXhlYygiZ2l0LWxzLXRyZWUiLCItciIsIi16IiwkZ2l0cmV2LCRzcmNwYXRoKQorCQkJb3IgZGllICQhOworCX0KKwlsb2NhbCAkLyA9ICJcMCI7CisJd2hpbGUoPCRmPikgeworCQljaG9tcDsKKwkJbXkoJG0sJHApID0gc3BsaXQoL1x0LywkXywyKTsKKwkJbXkoJG1vZGUsJHR5cGUsJHNoYTEpID0gc3BsaXQoLyAvLCRtKTsKKwkJbmV4dCBpZiAkdHlwZSBuZSAiYmxvYiI7CisJCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmRpcikgeworCQkJJHAgPSAkcGF0aCAuIHN1YnN0cigkcCxsZW5ndGgoJHNyY3BhdGgpLTEpOworCQl9IGVsc2UgeworCQkJJHAgPSAkcGF0aDsKKwkJfQorCQlwdXNoKEAkbmV3LFskbW9kZSwkc2hhMSwkcF0pOwkKKwl9CisJY2xvc2UoJGYpIG9yCisJCXByaW50IFNUREVSUiAiJG5ld3JldjokbmV3YnJhbmNoOiBjb3VsZCBub3QgbGlzdCBmaWxlcyBpbiAkb2xkcGF0aCBcQCAkcmV2XG4iOworfQorCitzdWIgY29tbWl0IHsKKwlteSgkYnJhbmNoLCAkY2hhbmdlZF9wYXRocywgJHJldmlzaW9uLCAkYXV0aG9yLCAkZGF0ZSwgJG1lc3NhZ2UpID0gQF87CisJbXkoJGF1dGhvcl9uYW1lLCRhdXRob3JfZW1haWwsJGRlc3QpOworCW15KEBvbGQsQG5ldyxAcGFyZW50cyk7CisKKwlpZiAobm90IGRlZmluZWQgJGF1dGhvciBvciAkYXV0aG9yIGVxICIiKSB7CisJCSRhdXRob3JfbmFtZSA9ICRhdXRob3JfZW1haWwgPSAidW5rbm93biI7CisJfSBlbHNpZiAoZGVmaW5lZCAkdXNlcnNfZmlsZSkgeworCQlkaWUgIlVzZXIgJGF1dGhvciBpcyBub3QgbGlzdGVkIGluICR1c2Vyc19maWxlXG4iCisJCSAgICB1bmxlc3MgZXhpc3RzICR1c2Vyc3skYXV0aG9yfTsKKwkJKCRhdXRob3JfbmFtZSwkYXV0aG9yX2VtYWlsKSA9IEB7JHVzZXJzeyRhdXRob3J9fTsKKwl9IGVsc2lmICgkYXV0aG9yID1+IC9eKC4qPylccys8KC4qKT4kLykgeworCQkoJGF1dGhvcl9uYW1lLCAkYXV0aG9yX2VtYWlsKSA9ICgkMSwgJDIpOworCX0gZWxzZSB7CisJCSRhdXRob3IgPX4gcy9ePCguKik+JC8kMS87CisJCSRhdXRob3JfbmFtZSA9ICRhdXRob3JfZW1haWwgPSAkYXV0aG9yOworCX0KKwkkZGF0ZSA9IHBkYXRlKCRkYXRlKTsKKworCW15ICR0YWc7CisJbXkgJHBhcmVudDsKKwlpZigkYnJhbmNoIGVxICIvIikgeyAjIHRydW5rCisJCSRwYXJlbnQgPSAkb3B0X287CisJfSBlbHNpZigkYnJhbmNoID1+IG0jXi8oLispIykgeyAjIHRhZworCQkkdGFnID0gMTsKKwkJJHBhcmVudCA9ICQxOworCX0gZWxzZSB7ICMgIm5vcm1hbCIgYnJhbmNoCisJCSMgbm90aGluZyB0byBkbworCQkkcGFyZW50ID0gJGJyYW5jaDsKKwl9CisJJGRlc3QgPSAkcGFyZW50OworCisJbXkgJHByZXYgPSAkY2hhbmdlZF9wYXRocy0+eyIvIn07CisJaWYoJHByZXYgYW5kICRwcmV2LT5bMF0gZXEgIkEiKSB7CisJCWRlbGV0ZSAkY2hhbmdlZF9wYXRocy0+eyIvIn07CisJCW15ICRvbGRwYXRoID0gJHByZXYtPlsxXTsKKwkJbXkgJHJldjsKKwkJaWYoZGVmaW5lZCAkb2xkcGF0aCkgeworCQkJbXkgJHA7CisJCQkoJHBhcmVudCwkcCkgPSBzcGxpdF9wYXRoKCRyZXZpc2lvbiwkb2xkcGF0aCk7CisJCQlpZigkcGFyZW50IGVxICIvIikgeworCQkJCSRwYXJlbnQgPSAkb3B0X287CisJCQl9IGVsc2UgeworCQkJCSRwYXJlbnQgPX4gcyNeLyMjOyAjIGlmIGl0J3MgYSB0YWcKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSRwYXJlbnQgPSB1bmRlZjsKKwkJfQorCX0KKworCW15ICRyZXY7CisJaWYoJHJldmlzaW9uID4gJG9wdF9zIGFuZCBkZWZpbmVkICRwYXJlbnQpIHsKKwkJb3BlbihILCJnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICRwYXJlbnQgfCIpOworCQkkcmV2ID0gPEg+OworCQljbG9zZShIKSBvciBkbyB7CisJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogY2Fubm90IGZpbmQgY29tbWl0ICckcGFyZW50JyFcbiI7CisJCQlyZXR1cm47CisJCX07CisJCWNob3AgJHJldjsKKwkJaWYobGVuZ3RoKCRyZXYpICE9IDQwKSB7CisJCQlwcmludCBTVERFUlIgIiRyZXZpc2lvbjogY2Fubm90IGZpbmQgY29tbWl0ICckcGFyZW50JyFcbiI7CisJCQlyZXR1cm47CisJCX0KKwkJJHJldiA9ICRicmFuY2hlc3soJHBhcmVudCBlcSAkb3B0X28pID8gIi8iIDogJHBhcmVudH17IkxBU1QifTsKKwkJaWYoJHJldmlzaW9uICE9ICRvcHRfcyBhbmQgbm90ICRyZXYpIHsKKwkJCXByaW50IFNUREVSUiAiJHJldmlzaW9uOiBkbyBub3Qga25vdyBhbmNlc3RvciBmb3IgJyRwYXJlbnQnIVxuIjsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCSRyZXYgPSB1bmRlZjsKKwl9CisKKyMJaWYoJHByZXYgYW5kICRwcmV2LT5bMF0gZXEgIkEiKSB7CisjCQlpZihub3QgJHRhZykgeworIwkJCXVubGVzcyhvcGVuKEgsIj4gJGdpdF9kaXIvcmVmcy9oZWFkcy8kYnJhbmNoIikpIHsKKyMJCQkJcHJpbnQgU1RERVJSICIkcmV2aXNpb246IENvdWxkIG5vdCBjcmVhdGUgYnJhbmNoICRicmFuY2g6ICQhXG4iOworIwkJCQkkc3RhdGU9MTE7CisjCQkJCW5leHQ7CisjCQkJfQorIwkJCXByaW50IEggIiRyZXZcbiIKKyMJCQkJb3IgZGllICJDb3VsZCBub3Qgd3JpdGUgYnJhbmNoICRicmFuY2g6ICQhIjsKKyMJCQljbG9zZShIKQorIwkJCQlvciBkaWUgIkNvdWxkIG5vdCB3cml0ZSBicmFuY2ggJGJyYW5jaDogJCEiOworIwkJfQorIwl9CisJaWYobm90IGRlZmluZWQgJHJldikgeworCQl1bmxpbmsoJGdpdF9pbmRleCk7CisJfSBlbHNpZiAoJHJldiBuZSAkbGFzdF9yZXYpIHsKKwkJcHJpbnQgIlN3aXRjaGluZyBmcm9tICRsYXN0X3JldiB0byAkcmV2ICgkYnJhbmNoKVxuIiBpZiAkb3B0X3Y7CisJCXN5c3RlbSgiZ2l0LXJlYWQtdHJlZSIsICRyZXYpOworCQlkaWUgInJlYWQtdHJlZSBmYWlsZWQgZm9yICRyZXY6ICQ/XG4iIGlmICQ/OworCQkkbGFzdF9yZXYgPSAkcmV2OworCX0KKworCXB1c2ggKEBwYXJlbnRzLCAkcmV2KSBpZiBkZWZpbmVkICRyZXY7CisKKwlteSAkY2lkOworCWlmKCR0YWcgYW5kIG5vdCAlJGNoYW5nZWRfcGF0aHMpIHsKKwkJJGNpZCA9ICRyZXY7CisJfSBlbHNlIHsKKwkJbXkgQHBhdGhzID0gc29ydCBrZXlzICUkY2hhbmdlZF9wYXRoczsKKwkJZm9yZWFjaCBteSAkcGF0aChAcGF0aHMpIHsKKwkJCW15ICRhY3Rpb24gPSAkY2hhbmdlZF9wYXRocy0+eyRwYXRofTsKKworCQkJaWYgKCRhY3Rpb24tPlswXSBlcSAiUiIpIHsKKwkJCQkjIHJlZmVyIHRvIGEgZmlsZS90cmVlIGluIGFuIGVhcmxpZXIgY29tbWl0CisJCQkJcHVzaChAb2xkLCRwYXRoKTsgIyByZW1vdmUgYW55IG9sZCBzdHVmZgorCQkJfQorCQkJaWYoKCRhY3Rpb24tPlswXSBlcSAiQSIpIHx8ICgkYWN0aW9uLT5bMF0gZXEgIlIiKSkgeworCQkJCW15ICRub2RlX2tpbmQgPSBub2RlX2tpbmQoJGJyYW5jaCwkcGF0aCwkcmV2aXNpb24pOworCQkJCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmZpbGUpIHsKKwkJCQkJbXkgJGYgPSBnZXRfZmlsZSgkcmV2aXNpb24sJGJyYW5jaCwkcGF0aCk7CisJCQkJCWlmICgkZikgeworCQkJCQkJcHVzaChAbmV3LCRmKSBpZiAkZjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW15ICRvcGF0aCA9ICRhY3Rpb24tPlszXTsKKwkJCQkJCXByaW50IFNUREVSUiAiJHJldmlzaW9uOiAkYnJhbmNoOiBjb3VsZCBub3QgZmV0Y2ggJyRvcGF0aCdcbiI7CisJCQkJCX0KKwkJCQl9IGVsc2lmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmRpcikgeworCQkJCQlpZigkYWN0aW9uLT5bMV0pIHsKKwkJCQkJCWNvcHlfcGF0aCgkcmV2aXNpb24sICRicmFuY2gsCisJCQkJCQkJICAkcGF0aCwgJGFjdGlvbi0+WzFdLAorCQkJCQkJCSAgJGFjdGlvbi0+WzJdLCAkbm9kZV9raW5kLAorCQkJCQkJCSAgXEBuZXcsIFxAcGFyZW50cyk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlnZXRfaWdub3JlKFxAbmV3LCBcQG9sZCwgJHJldmlzaW9uLAorCQkJCQkJCSAgICRicmFuY2gsICRwYXRoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzaWYgKCRhY3Rpb24tPlswXSBlcSAiRCIpIHsKKwkJCQlwdXNoKEBvbGQsJHBhdGgpOworCQkJfSBlbHNpZiAoJGFjdGlvbi0+WzBdIGVxICJNIikgeworCQkJCW15ICRub2RlX2tpbmQgPSBub2RlX2tpbmQoJGJyYW5jaCwkcGF0aCwkcmV2aXNpb24pOworCQkJCWlmICgkbm9kZV9raW5kIGVxICRTVk46Ok5vZGU6OmZpbGUpIHsKKwkJCQkJbXkgJGYgPSBnZXRfZmlsZSgkcmV2aXNpb24sJGJyYW5jaCwkcGF0aCk7CisJCQkJCXB1c2goQG5ldywkZikgaWYgJGY7CisJCQkJfSBlbHNpZiAoJG5vZGVfa2luZCBlcSAkU1ZOOjpOb2RlOjpkaXIpIHsKKwkJCQkJZ2V0X2lnbm9yZShcQG5ldywgXEBvbGQsICRyZXZpc2lvbiwKKwkJCQkJCSAgICRicmFuY2gsJHBhdGgpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZGllICIkcmV2aXNpb246IHVua25vd24gYWN0aW9uICciLiRhY3Rpb24tPlswXS4iJyBmb3IgJHBhdGhcbiI7CisJCQl9CisJCX0KKworCQl3aGlsZShAb2xkKSB7CisJCQlteSBAbzE7CisJCQlpZihAb2xkID4gNTUpIHsKKwkJCQlAbzEgPSBzcGxpY2UoQG9sZCwwLDUwKTsKKwkJCX0gZWxzZSB7CisJCQkJQG8xID0gQG9sZDsKKwkJCQlAb2xkID0gKCk7CisJCQl9CisJCQlteSAkcGlkID0gb3BlbiBteSAkRiwgIi18IjsKKwkJCWRpZSAiJCEiIHVubGVzcyBkZWZpbmVkICRwaWQ7CisJCQlpZiAoISRwaWQpIHsKKwkJCQlleGVjKCJnaXQtbHMtZmlsZXMiLCAiLXoiLCBAbzEpIG9yIGRpZSAkITsKKwkJCX0KKwkJCUBvMSA9ICgpOworCQkJbG9jYWwgJC8gPSAiXDAiOworCQkJd2hpbGUoPCRGPikgeworCQkJCWNob21wOworCQkJCXB1c2goQG8xLCRfKTsKKwkJCX0KKwkJCWNsb3NlKCRGKTsKKworCQkJd2hpbGUoQG8xKSB7CisJCQkJbXkgQG8yOworCQkJCWlmKEBvMSA+IDU1KSB7CisJCQkJCUBvMiA9IHNwbGljZShAbzEsMCw1MCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJQG8yID0gQG8xOworCQkJCQlAbzEgPSAoKTsKKwkJCQl9CisJCQkJc3lzdGVtKCJnaXQtdXBkYXRlLWluZGV4IiwiLS1mb3JjZS1yZW1vdmUiLCItLSIsQG8yKTsKKwkJCQlkaWUgIkNhbm5vdCByZW1vdmUgZmlsZXM6ICQ/XG4iIGlmICQ/OworCQkJfQorCQl9CisJCXdoaWxlKEBuZXcpIHsKKwkJCW15IEBuMjsKKwkJCWlmKEBuZXcgPiAxMikgeworCQkJCUBuMiA9IHNwbGljZShAbmV3LDAsMTApOworCQkJfSBlbHNlIHsKKwkJCQlAbjIgPSBAbmV3OworCQkJCUBuZXcgPSAoKTsKKwkJCX0KKwkJCXN5c3RlbSgiZ2l0LXVwZGF0ZS1pbmRleCIsIi0tYWRkIiwKKwkJCQkobWFwIHsgKCctLWNhY2hlaW5mbycsIEAkXykgfSBAbjIpKTsKKwkJCWRpZSAiQ2Fubm90IGFkZCBmaWxlczogJD9cbiIgaWYgJD87CisJCX0KKworCQlteSAkcGlkID0gb3BlbihDLCItfCIpOworCQlkaWUgIkNhbm5vdCBmb3JrOiAkISIgdW5sZXNzIGRlZmluZWQgJHBpZDsKKwkJdW5sZXNzKCRwaWQpIHsKKwkJCWV4ZWMoImdpdC13cml0ZS10cmVlIik7CisJCQlkaWUgIkNhbm5vdCBleGVjIGdpdC13cml0ZS10cmVlOiAkIVxuIjsKKwkJfQorCQljaG9tcChteSAkdHJlZSA9IDxDPik7CisJCWxlbmd0aCgkdHJlZSkgPT0gNDAKKwkJCW9yIGRpZSAiQ2Fubm90IGdldCB0cmVlIGlkICgkdHJlZSk6ICQhXG4iOworCQljbG9zZShDKQorCQkJb3IgZGllICJFcnJvciBydW5uaW5nIGdpdC13cml0ZS10cmVlOiAkP1xuIjsKKwkJcHJpbnQgIlRyZWUgSUQgJHRyZWVcbiIgaWYgJG9wdF92OworCisJCW15ICRwciA9IElPOjpQaXBlLT5uZXcoKSBvciBkaWUgIkNhbm5vdCBvcGVuIHBpcGU6ICQhXG4iOworCQlteSAkcHcgPSBJTzo6UGlwZS0+bmV3KCkgb3IgZGllICJDYW5ub3Qgb3BlbiBwaXBlOiAkIVxuIjsKKwkJJHBpZCA9IGZvcmsoKTsKKwkJZGllICJGb3JrOiAkIVxuIiB1bmxlc3MgZGVmaW5lZCAkcGlkOworCQl1bmxlc3MoJHBpZCkgeworCQkJJHByLT53cml0ZXIoKTsKKwkJCSRwdy0+cmVhZGVyKCk7CisJCQlvcGVuKE9VVCwiPiZTVERPVVQiKTsKKwkJCWR1cDIoJHB3LT5maWxlbm8oKSwwKTsKKwkJCWR1cDIoJHByLT5maWxlbm8oKSwxKTsKKwkJCSRwci0+Y2xvc2UoKTsKKwkJCSRwdy0+Y2xvc2UoKTsKKworCQkJbXkgQHBhciA9ICgpOworCisJCQkjIGxvb3NlIGRldGVjdGlvbiBvZiBtZXJnZXMKKwkJCSMgYmFzZWQgb24gdGhlIGNvbW1pdCBtc2cKKwkJCWZvcmVhY2ggbXkgJHJ4IChAbWVyZ2VyeCkgeworCQkJCWlmICgkbWVzc2FnZSA9fiAkcngpIHsKKwkJCQkJbXkgJG1wYXJlbnQgPSAkMTsKKwkJCQkJaWYgKCRtcGFyZW50IGVxICdIRUFEJykgeyAkbXBhcmVudCA9ICRvcHRfbyB9OworCQkJCQlpZiAoIC1lICIkZ2l0X2Rpci9yZWZzL2hlYWRzLyRtcGFyZW50IikgeworCQkJCQkJJG1wYXJlbnQgPSBnZXRfaGVhZHJlZigkbXBhcmVudCwgJGdpdF9kaXIpOworCQkJCQkJcHVzaCAoQHBhcmVudHMsICRtcGFyZW50KTsKKwkJCQkJCXByaW50IE9VVCAiTWVyZ2UgcGFyZW50IGJyYW5jaDogJG1wYXJlbnRcbiIgaWYgJG9wdF92OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJbXkgJXNlZW5fcGFyZW50cyA9ICgpOworCQkJbXkgQHVuaXF1ZV9wYXJlbnRzID0gZ3JlcCB7ICEgJHNlZW5fcGFyZW50c3skX30gKysgfSBAcGFyZW50czsKKwkJCWZvcmVhY2ggbXkgJGJwYXJlbnQgKEB1bmlxdWVfcGFyZW50cykgeworCQkJCXB1c2ggQHBhciwgJy1wJywgJGJwYXJlbnQ7CisJCQkJcHJpbnQgT1VUICJNZXJnZSBwYXJlbnQgYnJhbmNoOiAkYnBhcmVudFxuIiBpZiAkb3B0X3Y7CisJCQl9CisKKwkJCWV4ZWMoImVudiIsCisJCQkJIkdJVF9BVVRIT1JfTkFNRT0kYXV0aG9yX25hbWUiLAorCQkJCSJHSVRfQVVUSE9SX0VNQUlMPSRhdXRob3JfZW1haWwiLAorCQkJCSJHSVRfQVVUSE9SX0RBVEU9Ii5zdHJmdGltZSgiKzAwMDAgJVktJW0tJWQgJUg6JU06JVMiLGdtdGltZSgkZGF0ZSkpLAorCQkJCSJHSVRfQ09NTUlUVEVSX05BTUU9JGF1dGhvcl9uYW1lIiwKKwkJCQkiR0lUX0NPTU1JVFRFUl9FTUFJTD0kYXV0aG9yX2VtYWlsIiwKKwkJCQkiR0lUX0NPTU1JVFRFUl9EQVRFPSIuc3RyZnRpbWUoIiswMDAwICVZLSVtLSVkICVIOiVNOiVTIixnbXRpbWUoJGRhdGUpKSwKKwkJCQkiZ2l0LWNvbW1pdC10cmVlIiwgJHRyZWUsQHBhcik7CisJCQlkaWUgIkNhbm5vdCBleGVjIGdpdC1jb21taXQtdHJlZTogJCFcbiI7CisJCX0KKwkJJHB3LT53cml0ZXIoKTsKKwkJJHByLT5yZWFkZXIoKTsKKworCQkkbWVzc2FnZSA9fiBzL1tcc1xuXStcei8vOworCQkkbWVzc2FnZSA9ICJyJHJldmlzaW9uOiAkbWVzc2FnZSIgaWYgJG9wdF9yOworCisJCXByaW50ICRwdyAiJG1lc3NhZ2VcbiIKKwkJCW9yIGRpZSAiRXJyb3Igd3JpdGluZyB0byBnaXQtY29tbWl0LXRyZWU6ICQhXG4iOworCQkkcHctPmNsb3NlKCk7CisKKwkJcHJpbnQgIkNvbW1pdHRlZCBjaGFuZ2UgJHJldmlzaW9uOiRicmFuY2ggIi5zdHJmdGltZSgiJVktJW0tJWQgJUg6JU06JVMiLGdtdGltZSgkZGF0ZSkpLiIpXG4iIGlmICRvcHRfdjsKKwkJY2hvbXAoJGNpZCA9IDwkcHI+KTsKKwkJbGVuZ3RoKCRjaWQpID09IDQwCisJCQlvciBkaWUgIkNhbm5vdCBnZXQgY29tbWl0IGlkICgkY2lkKTogJCFcbiI7CisJCXByaW50ICJDb21taXQgSUQgJGNpZFxuIiBpZiAkb3B0X3Y7CisJCSRwci0+Y2xvc2UoKTsKKworCQl3YWl0cGlkKCRwaWQsMCk7CisJCWRpZSAiRXJyb3IgcnVubmluZyBnaXQtY29tbWl0LXRyZWU6ICQ/XG4iIGlmICQ/OworCX0KKworCWlmIChub3QgZGVmaW5lZCAkY2lkKSB7CisJCSRjaWQgPSAkYnJhbmNoZXN7Ii8ifXsiTEFTVCJ9OworCX0KKworCWlmKG5vdCBkZWZpbmVkICRkZXN0KSB7CisJCXByaW50ICIuLi4gbm8ga25vd24gcGFyZW50XG4iIGlmICRvcHRfdjsKKwl9IGVsc2lmKG5vdCAkdGFnKSB7CisJCXByaW50ICJXcml0aW5nIHRvIHJlZnMvaGVhZHMvJGRlc3RcbiIgaWYgJG9wdF92OworCQlvcGVuKEMsIj4kZ2l0X2Rpci9yZWZzL2hlYWRzLyRkZXN0IikgYW5kCisJCXByaW50IEMgKCIkY2lkXG4iKSBhbmQKKwkJY2xvc2UoQykKKwkJCW9yIGRpZSAiQ2Fubm90IHdyaXRlIGJyYW5jaCAkZGVzdCBmb3IgdXBkYXRlOiAkIVxuIjsKKwl9CisKKwlpZigkdGFnKSB7CisJCW15KCRpbiwgJG91dCkgPSAoJycsJycpOworCQkkbGFzdF9yZXYgPSAiLSIgaWYgJSRjaGFuZ2VkX3BhdGhzOworCQkjIHRoZSB0YWcgd2FzICdjb21wbGV4JywgaS5lLiBkaWQgbm90IHJlZmVyIHRvIGEgInJlYWwiIHJldmlzaW9uCisKKwkJJGRlc3QgPX4gdHIvXy9cLi8gaWYgJG9wdF91OworCQkkYnJhbmNoID0gJGRlc3Q7CisKKwkJbXkgJHBpZCA9IG9wZW4yKCRpbiwgJG91dCwgJ2dpdC1ta3RhZycpOworCQlwcmludCAkb3V0ICgib2JqZWN0ICRjaWRcbiIuCisJCSAgICAidHlwZSBjb21taXRcbiIuCisJCSAgICAidGFnICRkZXN0XG4iLgorCQkgICAgInRhZ2dlciAkYXV0aG9yX25hbWUgPCRhdXRob3JfZW1haWw+XG4iKSBhbmQKKwkJY2xvc2UoJG91dCkKKwkJICAgIG9yIGRpZSAiQ2Fubm90IGNyZWF0ZSB0YWcgb2JqZWN0ICRkZXN0OiAkIVxuIjsKKworCQlteSAkdGFnb2JqID0gPCRpbj47CisJCWNob21wICR0YWdvYmo7CisKKwkJaWYgKCAhY2xvc2UoJGluKSBvciB3YWl0cGlkKCRwaWQsIDApICE9ICRwaWQgb3IKKwkJCQkkPyAhPSAwIG9yICR0YWdvYmogIX4gL15bMDEyMzQ1Njc4OWFiY2RlZl17NDB9JC8gKSB7CisJCQlkaWUgIkNhbm5vdCBjcmVhdGUgdGFnIG9iamVjdCAkZGVzdDogJCFcbiI7CisJCX0KKworCQlvcGVuKEMsIj4kZ2l0X2Rpci9yZWZzL3RhZ3MvJGRlc3QiKSBhbmQKKwkJcHJpbnQgQyAoIiR0YWdvYmpcbiIpIGFuZAorCQljbG9zZShDKQorCQkJb3IgZGllICJDYW5ub3QgY3JlYXRlIHRhZyAkYnJhbmNoOiAkIVxuIjsKKworCQlwcmludCAiQ3JlYXRlZCB0YWcgJyRkZXN0JyBvbiAnJGJyYW5jaCdcbiIgaWYgJG9wdF92OworCX0KKwkkYnJhbmNoZXN7JGJyYW5jaH17IkxBU1QifSA9ICRjaWQ7CisJJGJyYW5jaGVzeyRicmFuY2h9eyRyZXZpc2lvbn0gPSAkY2lkOworCSRsYXN0X3JldiA9ICRjaWQ7CisJcHJpbnQgQlJBTkNIRVMgIiRyZXZpc2lvbiAkYnJhbmNoICRjaWRcbiI7CisJcHJpbnQgIkRPTkU6ICRyZXZpc2lvbiAkZGVzdCAkY2lkXG4iIGlmICRvcHRfdjsKK30KKworc3ViIGNvbW1pdF9hbGwgeworCSMgUmVjdXJzaXZlIHVzZSBvZiB0aGUgU1ZOIGNvbm5lY3Rpb24gZG9lcyBub3Qgd29yaworCWxvY2FsICRzdm4gPSAkc3ZuMjsKKworCW15ICgkY2hhbmdlZF9wYXRocywgJHJldmlzaW9uLCAkYXV0aG9yLCAkZGF0ZSwgJG1lc3NhZ2UsICRwb29sKSA9IEBfOworCW15ICVwOworCXdoaWxlKG15KCRwYXRoLCRhY3Rpb24pID0gZWFjaCAlJGNoYW5nZWRfcGF0aHMpIHsKKwkJJHB7JHBhdGh9ID0gWyAkYWN0aW9uLT5hY3Rpb24sJGFjdGlvbi0+Y29weWZyb21fcGF0aCwgJGFjdGlvbi0+Y29weWZyb21fcmV2LCAkcGF0aCBdOworCX0KKwkkY2hhbmdlZF9wYXRocyA9IFwlcDsKKworCW15ICVkb25lOworCW15IEBjb2w7CisJbXkgJHByZWY7CisJbXkgJGJyYW5jaDsKKworCXdoaWxlKG15KCRwYXRoLCRhY3Rpb24pID0gZWFjaCAlJGNoYW5nZWRfcGF0aHMpIHsKKwkJKCRicmFuY2gsJHBhdGgpID0gc3BsaXRfcGF0aCgkcmV2aXNpb24sJHBhdGgpOworCQluZXh0IGlmIG5vdCBkZWZpbmVkICRicmFuY2g7CisJCSRkb25leyRicmFuY2h9eyRwYXRofSA9ICRhY3Rpb247CisJfQorCXdoaWxlKCgkYnJhbmNoLCRjaGFuZ2VkX3BhdGhzKSA9IGVhY2ggJWRvbmUpIHsKKwkJY29tbWl0KCRicmFuY2gsICRjaGFuZ2VkX3BhdGhzLCAkcmV2aXNpb24sICRhdXRob3IsICRkYXRlLCAkbWVzc2FnZSk7CisJfQorfQorCiskb3B0X2wgPSAkc3ZuLT57J21heHJldid9IGlmIG5vdCBkZWZpbmVkICRvcHRfbCBvciAkb3B0X2wgPiAkc3ZuLT57J21heHJldid9OworCitpZiAoJG9wdF9sIDwgJGN1cnJlbnRfcmV2KSB7CisgICAgcHJpbnQgIlVwIHRvIGRhdGU6IG5vIG5ldyByZXZpc2lvbnMgdG8gZmV0Y2ghXG4iIGlmICRvcHRfdjsKKyAgICB1bmxpbmsoIiRnaXRfZGlyL1NWTjJHSVRfSEVBRCIpOworICAgIGV4aXQ7Cit9CisKK3ByaW50ICJGZXRjaGluZyBmcm9tICRjdXJyZW50X3JldiB0byAkb3B0X2wgLi4uXG4iIGlmICRvcHRfdjsKKworbXkgJHBvb2w9U1ZOOjpQb29sLT5uZXc7Ciskc3ZuLT57J3N2bid9LT5nZXRfbG9nKCIvIiwkY3VycmVudF9yZXYsJG9wdF9sLDAsMSwxLFwmY29tbWl0X2FsbCwkcG9vbCk7CiskcG9vbC0+Y2xlYXI7CisKKwordW5saW5rKCRnaXRfaW5kZXgpOworCitpZiAoZGVmaW5lZCAkb3JpZ19naXRfaW5kZXgpIHsKKwkkRU5We0dJVF9JTkRFWF9GSUxFfSA9ICRvcmlnX2dpdF9pbmRleDsKK30gZWxzZSB7CisJZGVsZXRlICRFTlZ7R0lUX0lOREVYX0ZJTEV9OworfQorCisjIE5vdyBzd2l0Y2ggYmFjayB0byB0aGUgYnJhbmNoIHdlIHdlcmUgaW4gYmVmb3JlIGFsbCBvZiB0aGlzIGhhcHBlbmVkCitpZigkb3JpZ19icmFuY2gpIHsKKwlwcmludCAiRE9ORVxuIiBpZiAkb3B0X3YgYW5kIChub3QgZGVmaW5lZCAkb3B0X2wgb3IgJG9wdF9sID4gMCk7CisJc3lzdGVtKCJjcCIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG9wdF9vIiwiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiKQorCQlpZiAkZm9yd2FyZF9tYXN0ZXI7CisJdW5sZXNzICgkb3B0X2kpIHsKKwkJc3lzdGVtKCdnaXQtcmVhZC10cmVlJywgJy1tJywgJy11JywgJ1NWTjJHSVRfSEVBRCcsICdIRUFEJyk7CisJCWRpZSAicmVhZC10cmVlIGZhaWxlZDogJD9cbiIgaWYgJD87CisJfQorfSBlbHNlIHsKKwkkb3JpZ19icmFuY2ggPSAibWFzdGVyIjsKKwlwcmludCAiRE9ORTsgY3JlYXRpbmcgJG9yaWdfYnJhbmNoIGJyYW5jaFxuIiBpZiAkb3B0X3YgYW5kIChub3QgZGVmaW5lZCAkb3B0X2wgb3IgJG9wdF9sID4gMCk7CisJc3lzdGVtKCJjcCIsIiRnaXRfZGlyL3JlZnMvaGVhZHMvJG9wdF9vIiwiJGdpdF9kaXIvcmVmcy9oZWFkcy9tYXN0ZXIiKQorCQl1bmxlc3MgLWYgIiRnaXRfZGlyL3JlZnMvaGVhZHMvbWFzdGVyIjsKKwlzeXN0ZW0oJ2dpdC11cGRhdGUtcmVmJywgJ0hFQUQnLCAiJG9yaWdfYnJhbmNoIik7CisJdW5sZXNzICgkb3B0X2kpIHsKKwkJc3lzdGVtKCdnaXQgY2hlY2tvdXQnKTsKKwkJZGllICJjaGVja291dCBmYWlsZWQ6ICQ/XG4iIGlmICQ/OworCX0KK30KK3VubGluaygiJGdpdF9kaXIvU1ZOMkdJVF9IRUFEIik7CitjbG9zZShCUkFOQ0hFUyk7CmRpZmYgLS1naXQgYS9naXQtdGFnLnNoIGIvZ2l0LXRhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGFmYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LXRhZy5zaApAQCAtMCwwICsxLDExMiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoYykgMjAwNSBMaW51cyBUb3J2YWxkcworCitVU0FHRT0nLWwgWzxwYXR0ZXJuPl0gfCBbLWEgfCAtcyB8IC11IDxrZXktaWQ+XSBbLWYgfCAtZF0gWy1tIDxtc2c+XSA8dGFnbmFtZT4gWzxoZWFkPl0nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK2Fubm90YXRlPQorc2lnbmVkPQorZm9yY2U9CittZXNzYWdlPQordXNlcm5hbWU9CitsaXN0PQord2hpbGUgY2FzZSAiJCMiIGluIDApIGJyZWFrIDs7IGVzYWMKK2RvCisgICAgY2FzZSAiJDEiIGluCisgICAgLWEpCisJYW5ub3RhdGU9MQorCTs7CisgICAgLXMpCisJYW5ub3RhdGU9MQorCXNpZ25lZD0xCisJOzsKKyAgICAtZikKKwlmb3JjZT0xCisJOzsKKyAgICAtbCkKKwljYXNlICIkIyIgaW4KKwkxKQorCQlzZXQgeCAuIDs7CisJZXNhYworCXNoaWZ0CisJZ2l0IHJldi1wYXJzZSAtLXN5bWJvbGljIC0tdGFncyB8IHNvcnQgfCBncmVwICIkQCIKKwlleGl0ICQ/CisJOzsKKyAgICAtbSkKKyAgICAJYW5ub3RhdGU9MQorCXNoaWZ0CisJbWVzc2FnZT0iJDEiCisJOzsKKyAgICAtdSkKKwlhbm5vdGF0ZT0xCisJc2lnbmVkPTEKKwlzaGlmdAorCXVzZXJuYW1lPSIkMSIKKwk7OworICAgIC1kKQorICAgIAlzaGlmdAorCXRhZ19uYW1lPSIkMSIKKwlybSAiJEdJVF9ESVIvcmVmcy90YWdzLyR0YWdfbmFtZSIgJiYgXAorCSAgICAgICAgZWNobyAiRGVsZXRlZCB0YWcgJHRhZ19uYW1lLiIKKwlleGl0ICQ/CisJOzsKKyAgICAtKikKKyAgICAgICAgdXNhZ2UKKwk7OworICAgICopCisJYnJlYWsKKwk7OworICAgIGVzYWMKKyAgICBzaGlmdAorZG9uZQorCituYW1lPSIkMSIKK1sgIiRuYW1lIiBdIHx8IHVzYWdlCitpZiBbIC1lICIkR0lUX0RJUi9yZWZzL3RhZ3MvJG5hbWUiIC1hIC16ICIkZm9yY2UiIF07IHRoZW4KKyAgICBkaWUgInRhZyAnJG5hbWUnIGFscmVhZHkgZXhpc3RzIgorZmkKK3NoaWZ0CitnaXQtY2hlY2stcmVmLWZvcm1hdCAidGFncy8kbmFtZSIgfHwKKwlkaWUgIndlIGRvIG5vdCBsaWtlICckbmFtZScgYXMgYSB0YWcgbmFtZS4iCisKK29iamVjdD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgLS1kZWZhdWx0IEhFQUQgIiRAIikgfHwgZXhpdCAxCit0eXBlPSQoZ2l0LWNhdC1maWxlIC10ICRvYmplY3QpIHx8IGV4aXQgMQordGFnZ2VyPSQoZ2l0LXZhciBHSVRfQ09NTUlUVEVSX0lERU5UKSB8fCBleGl0IDEKKzogJHt1c2VybmFtZTo9JChleHByICJ6JHRhZ2dlciIgOiAnelwoLio+XCknKX0KKwordHJhcCAncm0gLWYgIiRHSVRfRElSIi9UQUdfVE1QKiAiJEdJVF9ESVIiL1RBR19GSU5BTE1TRyAiJEdJVF9ESVIiL1RBR19FRElUTVNHJyAwCisKK2lmIFsgIiRhbm5vdGF0ZSIgXTsgdGhlbgorICAgIGlmIFsgLXogIiRtZXNzYWdlIiBdOyB0aGVuCisgICAgICAgICggZWNobyAiIyIKKyAgICAgICAgICBlY2hvICIjIFdyaXRlIGEgdGFnIG1lc3NhZ2UiCisgICAgICAgICAgZWNobyAiIyIgKSA+ICIkR0lUX0RJUiIvVEFHX0VESVRNU0cKKyAgICAgICAgJHtWSVNVQUw6LSR7RURJVE9SOi12aX19ICIkR0lUX0RJUiIvVEFHX0VESVRNU0cgfHwgZXhpdAorICAgIGVsc2UKKyAgICAgICAgZWNobyAiJG1lc3NhZ2UiID4iJEdJVF9ESVIiL1RBR19FRElUTVNHCisgICAgZmkKKworICAgIGdyZXAgLXYgJ14jJyA8IiRHSVRfRElSIi9UQUdfRURJVE1TRyB8CisgICAgZ2l0LXN0cmlwc3BhY2UgPiIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHCisKKyAgICBbIC1zICIkR0lUX0RJUiIvVEFHX0ZJTkFMTVNHIF0gfHwgeworCWVjaG8gPiYyICJObyB0YWcgbWVzc2FnZT8iCisJZXhpdCAxCisgICAgfQorCisgICAgKCBwcmludGYgJ29iamVjdCAlc1xudHlwZSAlc1xudGFnICVzXG50YWdnZXIgJXNcblxuJyBcCisJIiRvYmplY3QiICIkdHlwZSIgIiRuYW1lIiAiJHRhZ2dlciI7CisgICAgICBjYXQgIiRHSVRfRElSIi9UQUdfRklOQUxNU0cgKSA+IiRHSVRfRElSIi9UQUdfVE1QCisgICAgcm0gLWYgIiRHSVRfRElSIi9UQUdfVE1QLmFzYyAiJEdJVF9ESVIiL1RBR19GSU5BTE1TRworICAgIGlmIFsgIiRzaWduZWQiIF07IHRoZW4KKwlncGcgLWJzYSAtdSAiJHVzZXJuYW1lIiAiJEdJVF9ESVIiL1RBR19UTVAgJiYKKwljYXQgIiRHSVRfRElSIi9UQUdfVE1QLmFzYyA+PiIkR0lUX0RJUiIvVEFHX1RNUCB8fAorCWRpZSAiZmFpbGVkIHRvIHNpZ24gdGhlIHRhZyB3aXRoIEdQRy4iCisgICAgZmkKKyAgICBvYmplY3Q9JChnaXQtbWt0YWcgPCAiJEdJVF9ESVIiL1RBR19UTVApCitmaQorCitsZWFkaW5nPWBleHByICJyZWZzL3RhZ3MvJG5hbWUiIDogJ1woLipcKS8nYCAmJgorbWtkaXIgLXAgIiRHSVRfRElSLyRsZWFkaW5nIiAmJgorZWNobyAkb2JqZWN0ID4gIiRHSVRfRElSL3JlZnMvdGFncy8kbmFtZSIKZGlmZiAtLWdpdCBhL2dpdC12ZXJpZnktdGFnLnNoIGIvZ2l0LXZlcmlmeS10YWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzZmMTcxYgotLS0gL2Rldi9udWxsCisrKyBiL2dpdC12ZXJpZnktdGFnLnNoCkBAIC0wLDAgKzEsNDIgQEAKKyMhL2Jpbi9zaAorCitVU0FHRT0nPHRhZz4nCitTVUJESVJFQ1RPUllfT0s9J1llcycKKy4gZ2l0LXNoLXNldHVwCisKK3ZlcmJvc2U9Cit3aGlsZSBjYXNlICQjIGluIDApIGJyZWFrOzsgZXNhYworZG8KKwljYXNlICIkMSIgaW4KKwktdnwtLXZ8LS12ZXwtLXZlcnwtLXZlcmJ8LS12ZXJib3wtLXZlcmJvc3wtLXZlcmJvc2UpCisJCXZlcmJvc2U9dCA7OworCSopCisJCWJyZWFrIDs7CisJZXNhYworCXNoaWZ0Citkb25lCisKK2lmIFsgIiQjIiAhPSAiMSIgXQordGhlbgorCXVzYWdlCitmaQorCit0eXBlPSIkKGdpdC1jYXQtZmlsZSAtdCAiJDEiIDI+L2Rldi9udWxsKSIgfHwKKwlkaWUgIiQxOiBubyBzdWNoIG9iamVjdC4iCisKK3Rlc3QgIiR0eXBlIiA9IHRhZyB8fAorCWRpZSAiJDE6IGNhbm5vdCB2ZXJpZnkgYSBub24tdGFnIG9iamVjdCBvZiB0eXBlICR0eXBlLiIKKworY2FzZSAiJHZlcmJvc2UiIGluCit0KQorCWdpdC1jYXQtZmlsZSAtcCAiJDEiIHwKKwlzZWQgLW4gLWUgJy9eLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0vcScgLWUgcAorCTs7Citlc2FjCisKK2dpdC1jYXQtZmlsZSB0YWcgIiQxIiA+IiRHSVRfRElSLy50bXAtdnRhZyIgfHwgZXhpdCAxCitjYXQgIiRHSVRfRElSLy50bXAtdnRhZyIgfAorc2VkICcvLS0tLS1CRUdJTiBQR1AvUScgfAorZ3BnIC0tdmVyaWZ5ICIkR0lUX0RJUi8udG1wLXZ0YWciIC0gfHwgZXhpdCAxCitybSAtZiAiJEdJVF9ESVIvLnRtcC12dGFnIgorCmRpZmYgLS1naXQgYS9naXQuYyBiL2dpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YmExNGEKLS0tIC9kZXYvbnVsbAorKysgYi9naXQuYwpAQCAtMCwwICsxLDM4OSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCitjb25zdCBjaGFyIGdpdF91c2FnZV9zdHJpbmdbXSA9CisJImdpdCBbLS12ZXJzaW9uXSBbLS1leGVjLXBhdGhbPUdJVF9FWEVDX1BBVEhdXSBbLS1oZWxwXSBDT01NQU5EIFsgQVJHUyBdIjsKKworc3RhdGljIHZvaWQgcHJlcGVuZF90b19wYXRoKGNvbnN0IGNoYXIgKmRpciwgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICpvbGRfcGF0aCA9IGdldGVudigiUEFUSCIpOworCWNoYXIgKnBhdGg7CisJaW50IHBhdGhfbGVuID0gbGVuOworCisJaWYgKCFvbGRfcGF0aCkKKwkJb2xkX3BhdGggPSAiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpbiI7CisKKwlwYXRoX2xlbiA9IGxlbiArIHN0cmxlbihvbGRfcGF0aCkgKyAxOworCisJcGF0aCA9IG1hbGxvYyhwYXRoX2xlbiArIDEpOworCisJbWVtY3B5KHBhdGgsIGRpciwgbGVuKTsKKwlwYXRoW2xlbl0gPSAnOic7CisJbWVtY3B5KHBhdGggKyBsZW4gKyAxLCBvbGRfcGF0aCwgcGF0aF9sZW4gLSBsZW4pOworCisJc2V0ZW52KCJQQVRIIiwgcGF0aCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX29wdGlvbnMoY29uc3QgY2hhcioqKiBhcmd2LCBpbnQqIGFyZ2MpCit7CisJaW50IGhhbmRsZWQgPSAwOworCisJd2hpbGUgKCphcmdjID4gMCkgeworCQljb25zdCBjaGFyICpjbWQgPSAoKmFyZ3YpWzBdOworCQlpZiAoY21kWzBdICE9ICctJykKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIEZvciBsZWdhY3kgcmVhc29ucywgdGhlICJ2ZXJzaW9uIiBhbmQgImhlbHAiCisJCSAqIGNvbW1hbmRzIGNhbiBiZSB3cml0dGVuIHdpdGggIi0tIiBwcmVwZW5kZWQKKwkJICogdG8gbWFrZSB0aGVtIGxvb2sgbGlrZSBmbGFncy4KKwkJICovCisJCWlmICghc3RyY21wKGNtZCwgIi0taGVscCIpIHx8ICFzdHJjbXAoY21kLCAiLS12ZXJzaW9uIikpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBDaGVjayByZW1haW5pbmcgZmxhZ3MuCisJCSAqLworCQlpZiAoIXN0cm5jbXAoY21kLCAiLS1leGVjLXBhdGgiLCAxMSkpIHsKKwkJCWNtZCArPSAxMTsKKwkJCWlmICgqY21kID09ICc9JykKKwkJCQlnaXRfc2V0X2V4ZWNfcGF0aChjbWQgKyAxKTsKKwkJCWVsc2UgeworCQkJCXB1dHMoZ2l0X2V4ZWNfcGF0aCgpKTsKKwkJCQlleGl0KDApOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLXAiKSB8fCAhc3RyY21wKGNtZCwgIi0tcGFnaW5hdGUiKSkgeworCQkJc2V0dXBfcGFnZXIoKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0tZ2l0LWRpciIpKSB7CisJCQlpZiAoKmFyZ2MgPCAxKQorCQkJCXJldHVybiAtMTsKKwkJCXNldGVudigiR0lUX0RJUiIsICgqYXJndilbMV0sIDEpOworCQkJKCphcmd2KSsrOworCQkJKCphcmdjKS0tOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKGNtZCwgIi0tZ2l0LWRpcj0iLCAxMCkpIHsKKwkJCXNldGVudigiR0lUX0RJUiIsIGNtZCArIDEwLCAxKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0tYmFyZSIpKSB7CisJCQlzdGF0aWMgY2hhciBnaXRfZGlyWzEwMjRdOworCQkJc2V0ZW52KCJHSVRfRElSIiwgZ2V0Y3dkKGdpdF9kaXIsIDEwMjQpLCAxKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBjbWQpOworCQkJdXNhZ2UoZ2l0X3VzYWdlX3N0cmluZyk7CisJCX0KKworCQkoKmFyZ3YpKys7CisJCSgqYXJnYyktLTsKKwkJaGFuZGxlZCsrOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFsaWFzX2NvbW1hbmQ7CitzdGF0aWMgY2hhciAqYWxpYXNfc3RyaW5nID0gTlVMTDsKKworc3RhdGljIGludCBnaXRfYWxpYXNfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJuY21wKHZhciwgImFsaWFzLiIsIDYpICYmICFzdHJjbXAodmFyICsgNiwgYWxpYXNfY29tbWFuZCkpIHsKKwkJYWxpYXNfc3RyaW5nID0gc3RyZHVwKHZhbHVlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BsaXRfY21kbGluZShjaGFyICpjbWRsaW5lLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IHNyYywgZHN0LCBjb3VudCA9IDAsIHNpemUgPSAxNjsKKwljaGFyIHF1b3RlZCA9IDA7CisKKwkqYXJndiA9IG1hbGxvYyhzaXplb2YoY2hhciopICogc2l6ZSk7CisKKwkvKiBzcGxpdCBhbGlhc19zdHJpbmcgKi8KKwkoKmFyZ3YpW2NvdW50KytdID0gY21kbGluZTsKKwlmb3IgKHNyYyA9IGRzdCA9IDA7IGNtZGxpbmVbc3JjXTspIHsKKwkJY2hhciBjID0gY21kbGluZVtzcmNdOworCQlpZiAoIXF1b3RlZCAmJiBpc3NwYWNlKGMpKSB7CisJCQljbWRsaW5lW2RzdCsrXSA9IDA7CisJCQl3aGlsZSAoY21kbGluZVsrK3NyY10KKwkJCQkJJiYgaXNzcGFjZShjbWRsaW5lW3NyY10pKQorCQkJCTsgLyogc2tpcCAqLworCQkJaWYgKGNvdW50ID49IHNpemUpIHsKKwkJCQlzaXplICs9IDE2OworCQkJCSphcmd2ID0gcmVhbGxvYygqYXJndiwgc2l6ZW9mKGNoYXIqKSAqIHNpemUpOworCQkJfQorCQkJKCphcmd2KVtjb3VudCsrXSA9IGNtZGxpbmUgKyBkc3Q7CisJCX0gZWxzZSBpZighcXVvdGVkICYmIChjID09ICdcJycgfHwgYyA9PSAnIicpKSB7CisJCQlxdW90ZWQgPSBjOworCQkJc3JjKys7CisJCX0gZWxzZSBpZiAoYyA9PSBxdW90ZWQpIHsKKwkJCXF1b3RlZCA9IDA7CisJCQlzcmMrKzsKKwkJfSBlbHNlIHsKKwkJCWlmIChjID09ICdcXCcgJiYgcXVvdGVkICE9ICdcJycpIHsKKwkJCQlzcmMrKzsKKwkJCQljID0gY21kbGluZVtzcmNdOworCQkJCWlmICghYykgeworCQkJCQlmcmVlKCphcmd2KTsKKwkJCQkJKmFyZ3YgPSBOVUxMOworCQkJCQlyZXR1cm4gZXJyb3IoImNtZGxpbmUgZW5kcyB3aXRoIFxcIik7CisJCQkJfQorCQkJfQorCQkJY21kbGluZVtkc3QrK10gPSBjOworCQkJc3JjKys7CisJCX0KKwl9CisKKwljbWRsaW5lW2RzdF0gPSAwOworCisJaWYgKHF1b3RlZCkgeworCQlmcmVlKCphcmd2KTsKKwkJKmFyZ3YgPSBOVUxMOworCQlyZXR1cm4gZXJyb3IoInVuY2xvc2VkIHF1b3RlIik7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGhhbmRsZV9hbGlhcyhpbnQgKmFyZ2NwLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IG5vbmdpdCA9IDAsIHJldCA9IDAsIHNhdmVkX2Vycm5vID0gZXJybm87CisJY29uc3QgY2hhciAqc3ViZGlyOworCWludCBjb3VudCwgb3B0aW9uX2NvdW50OworCWNvbnN0IGNoYXIqKiBuZXdfYXJndjsKKworCXN1YmRpciA9IHNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KCZub25naXQpOworCisJYWxpYXNfY29tbWFuZCA9ICgqYXJndilbMF07CisJZ2l0X2NvbmZpZyhnaXRfYWxpYXNfY29uZmlnKTsKKwlpZiAoYWxpYXNfc3RyaW5nKSB7CisJCWNvdW50ID0gc3BsaXRfY21kbGluZShhbGlhc19zdHJpbmcsICZuZXdfYXJndik7CisJCW9wdGlvbl9jb3VudCA9IGhhbmRsZV9vcHRpb25zKCZuZXdfYXJndiwgJmNvdW50KTsKKwkJbWVtbW92ZShuZXdfYXJndiAtIG9wdGlvbl9jb3VudCwgbmV3X2FyZ3YsCisJCQkJY291bnQgKiBzaXplb2YoY2hhciAqKSk7CisJCW5ld19hcmd2IC09IG9wdGlvbl9jb3VudDsKKworCQlpZiAoY291bnQgPCAxKQorCQkJZGllKCJlbXB0eSBhbGlhcyBmb3IgJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQlpZiAoIXN0cmNtcChhbGlhc19jb21tYW5kLCBuZXdfYXJndlswXSkpCisJCQlkaWUoInJlY3Vyc2l2ZSBhbGlhczogJXMiLCBhbGlhc19jb21tYW5kKTsKKworCQlpZiAoZ2V0ZW52KCJHSVRfVFJBQ0UiKSkgeworCQkJaW50IGk7CisJCQlmcHJpbnRmKHN0ZGVyciwgInRyYWNlOiBhbGlhcyBleHBhbnNpb246ICVzID0+IiwKKwkJCQlhbGlhc19jb21tYW5kKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCQkJZnB1dGMoJyAnLCBzdGRlcnIpOworCQkJCXNxX3F1b3RlX3ByaW50KHN0ZGVyciwgbmV3X2FyZ3ZbaV0pOworCQkJfQorCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCWZmbHVzaChzdGRlcnIpOworCQl9CisKKwkJbmV3X2FyZ3YgPSByZWFsbG9jKG5ld19hcmd2LCBzaXplb2YoY2hhciopICoKKwkJCQkgICAoY291bnQgKyAqYXJnY3AgKyAxKSk7CisJCS8qIGluc2VydCBhZnRlciBjb21tYW5kIG5hbWUgKi8KKwkJbWVtY3B5KG5ld19hcmd2ICsgY291bnQsICphcmd2ICsgMSwgc2l6ZW9mKGNoYXIqKSAqICphcmdjcCk7CisJCW5ld19hcmd2W2NvdW50KyphcmdjcF0gPSBOVUxMOworCisJCSphcmd2ID0gbmV3X2FyZ3Y7CisJCSphcmdjcCArPSBjb3VudCAtIDE7CisKKwkJcmV0ID0gMTsKKwl9CisKKwlpZiAoc3ViZGlyKQorCQljaGRpcihzdWJkaXIpOworCisJZXJybm8gPSBzYXZlZF9lcnJubzsKKworCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIgZ2l0X3ZlcnNpb25fc3RyaW5nW10gPSBHSVRfVkVSU0lPTjsKKworI2RlZmluZSBORUVEU19QUkVGSVggMQorI2RlZmluZSBVU0VfUEFHRVIgMgorCitzdGF0aWMgdm9pZCBoYW5kbGVfaW50ZXJuYWxfY29tbWFuZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworCWNvbnN0IGNoYXIgKmNtZCA9IGFyZ3ZbMF07CisJc3RhdGljIHN0cnVjdCBjbWRfc3RydWN0IHsKKwkJY29uc3QgY2hhciAqY21kOworCQlpbnQgKCpmbikoaW50LCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICopOworCQlpbnQgb3B0aW9uOworCX0gY29tbWFuZHNbXSA9IHsKKwkJeyAidmVyc2lvbiIsIGNtZF92ZXJzaW9uIH0sCisJCXsgImhlbHAiLCBjbWRfaGVscCB9LAorCQl7ICJsb2ciLCBjbWRfbG9nLCBORUVEU19QUkVGSVggfCBVU0VfUEFHRVIgfSwKKwkJeyAid2hhdGNoYW5nZWQiLCBjbWRfd2hhdGNoYW5nZWQsIE5FRURTX1BSRUZJWCB8IFVTRV9QQUdFUiB9LAorCQl7ICJzaG93IiwgY21kX3Nob3csIE5FRURTX1BSRUZJWCB8IFVTRV9QQUdFUiB9LAorCQl7ICJwdXNoIiwgY21kX3B1c2gsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJmb3JtYXQtcGF0Y2giLCBjbWRfZm9ybWF0X3BhdGNoLCBORUVEU19QUkVGSVggfSwKKwkJeyAiY291bnQtb2JqZWN0cyIsIGNtZF9jb3VudF9vYmplY3RzIH0sCisJCXsgImRpZmYiLCBjbWRfZGlmZiwgTkVFRFNfUFJFRklYIH0sCisJCXsgImdyZXAiLCBjbWRfZ3JlcCwgTkVFRFNfUFJFRklYIH0sCisJCXsgInJtIiwgY21kX3JtLCBORUVEU19QUkVGSVggfSwKKwkJeyAiYWRkIiwgY21kX2FkZCwgTkVFRFNfUFJFRklYIH0sCisJCXsgInJldi1saXN0IiwgY21kX3Jldl9saXN0LCBORUVEU19QUkVGSVggfSwKKwkJeyAiaW5pdC1kYiIsIGNtZF9pbml0X2RiIH0sCisJCXsgImdldC10YXItY29tbWl0LWlkIiwgY21kX2dldF90YXJfY29tbWl0X2lkIH0sCisJCXsgInVwbG9hZC10YXIiLCBjbWRfdXBsb2FkX3RhciB9LAorCQl7ICJjaGVjay1yZWYtZm9ybWF0IiwgY21kX2NoZWNrX3JlZl9mb3JtYXQgfSwKKwkJeyAibHMtZmlsZXMiLCBjbWRfbHNfZmlsZXMsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJscy10cmVlIiwgY21kX2xzX3RyZWUsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJ0YXItdHJlZSIsIGNtZF90YXJfdHJlZSwgTkVFRFNfUFJFRklYIH0sCisJCXsgInJlYWQtdHJlZSIsIGNtZF9yZWFkX3RyZWUsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJjb21taXQtdHJlZSIsIGNtZF9jb21taXRfdHJlZSwgTkVFRFNfUFJFRklYIH0sCisJCXsgImFwcGx5IiwgY21kX2FwcGx5IH0sCisJCXsgInNob3ctYnJhbmNoIiwgY21kX3Nob3dfYnJhbmNoLCBORUVEU19QUkVGSVggfSwKKwkJeyAiZGlmZi1maWxlcyIsIGNtZF9kaWZmX2ZpbGVzLCBORUVEU19QUkVGSVggfSwKKwkJeyAiZGlmZi1pbmRleCIsIGNtZF9kaWZmX2luZGV4LCBORUVEU19QUkVGSVggfSwKKwkJeyAiZGlmZi1zdGFnZXMiLCBjbWRfZGlmZl9zdGFnZXMsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJkaWZmLXRyZWUiLCBjbWRfZGlmZl90cmVlLCBORUVEU19QUkVGSVggfSwKKwkJeyAiY2F0LWZpbGUiLCBjbWRfY2F0X2ZpbGUsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJyZXYtcGFyc2UiLCBjbWRfcmV2X3BhcnNlLCBORUVEU19QUkVGSVggfSwKKwkJeyAid3JpdGUtdHJlZSIsIGNtZF93cml0ZV90cmVlLCBORUVEU19QUkVGSVggfSwKKwkJeyAibWFpbHNwbGl0IiwgY21kX21haWxzcGxpdCB9LAorCQl7ICJtYWlsaW5mbyIsIGNtZF9tYWlsaW5mbyB9LAorCQl7ICJzdHJpcHNwYWNlIiwgY21kX3N0cmlwc3BhY2UgfSwKKwkJeyAidXBkYXRlLWluZGV4IiwgY21kX3VwZGF0ZV9pbmRleCwgTkVFRFNfUFJFRklYIH0sCisJCXsgInVwZGF0ZS1yZWYiLCBjbWRfdXBkYXRlX3JlZiwgTkVFRFNfUFJFRklYIH0sCisJCXsgImZtdC1tZXJnZS1tc2ciLCBjbWRfZm10X21lcmdlX21zZywgTkVFRFNfUFJFRklYIH0sCisJCXsgInBydW5lIiwgY21kX3BydW5lLCBORUVEU19QUkVGSVggfSwKKwkJeyAibXYiLCBjbWRfbXYsIE5FRURTX1BSRUZJWCB9LAorCQl7ICJwcnVuZS1wYWNrZWQiLCBjbWRfcHJ1bmVfcGFja2VkLCBORUVEU19QUkVGSVggfSwKKwkJeyAicmVwby1jb25maWciLCBjbWRfcmVwb19jb25maWcgfSwKKwl9OworCWludCBpOworCisJLyogVHVybiAiZ2l0IGNtZCAtLWhlbHAiIGludG8gImdpdCBoZWxwIGNtZCIgKi8KKwlpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpIHsKKwkJYXJndlsxXSA9IGFyZ3ZbMF07CisJCWFyZ3ZbMF0gPSBjbWQgPSAiaGVscCI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbWFuZHMpOyBpKyspIHsKKwkJc3RydWN0IGNtZF9zdHJ1Y3QgKnAgPSBjb21tYW5kcytpOworCQljb25zdCBjaGFyICpwcmVmaXg7CisJCWlmIChzdHJjbXAocC0+Y21kLCBjbWQpKQorCQkJY29udGludWU7CisKKwkJcHJlZml4ID0gTlVMTDsKKwkJaWYgKHAtPm9wdGlvbiAmIE5FRURTX1BSRUZJWCkKKwkJCXByZWZpeCA9IHNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwkJaWYgKHAtPm9wdGlvbiAmIFVTRV9QQUdFUikKKwkJCXNldHVwX3BhZ2VyKCk7CisJCWlmIChnZXRlbnYoIkdJVF9UUkFDRSIpKSB7CisJCQlpbnQgaTsKKwkJCWZwcmludGYoc3RkZXJyLCAidHJhY2U6IGJ1aWx0LWluOiBnaXQiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKKwkJCQlmcHV0YygnICcsIHN0ZGVycik7CisJCQkJc3FfcXVvdGVfcHJpbnQoc3RkZXJyLCBhcmd2W2ldKTsKKwkJCX0KKwkJCXB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCWZmbHVzaChzdGRlcnIpOworCQl9CisKKwkJZXhpdChwLT5mbihhcmdjLCBhcmd2LCBwcmVmaXgpKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCit7CisJY29uc3QgY2hhciAqY21kID0gYXJndlswXTsKKwljaGFyICpzbGFzaCA9IHN0cnJjaHIoY21kLCAnLycpOworCWNvbnN0IGNoYXIgKmV4ZWNfcGF0aCA9IE5VTEw7CisJaW50IGRvbmVfYWxpYXMgPSAwOworCisJLyoKKwkgKiBUYWtlIHRoZSBiYXNlbmFtZSBvZiBhcmd2WzBdIGFzIHRoZSBjb21tYW5kCisJICogbmFtZSwgYW5kIHRoZSBkaXJuYW1lIGFzIHRoZSBkZWZhdWx0IGV4ZWNfcGF0aAorCSAqIGlmIGl0J3MgYW4gYWJzb2x1dGUgcGF0aCBhbmQgd2UgZG9uJ3QgaGF2ZQorCSAqIGFueXRoaW5nIGJldHRlci4KKwkgKi8KKwlpZiAoc2xhc2gpIHsKKwkJKnNsYXNoKysgPSAwOworCQlpZiAoKmNtZCA9PSAnLycpCisJCQlleGVjX3BhdGggPSBjbWQ7CisJCWNtZCA9IHNsYXNoOworCX0KKworCS8qCisJICogImdpdC14eHh4IiBpcyB0aGUgc2FtZSBhcyAiZ2l0IHh4eHgiLCBidXQgd2Ugb2J2aW91c2x5OgorCSAqCisJICogIC0gY2Fubm90IHRha2UgZmxhZ3MgaW4gYmV0d2VlbiB0aGUgImdpdCIgYW5kIHRoZSAieHh4eCIuCisJICogIC0gY2Fubm90IGV4ZWN1dGUgaXQgZXh0ZXJuYWxseSAoc2luY2UgaXQgd291bGQganVzdCBkbworCSAqICAgIHRoZSBzYW1lIHRoaW5nIG92ZXIgYWdhaW4pCisJICoKKwkgKiBTbyB3ZSBqdXN0IGRpcmVjdGx5IGNhbGwgdGhlIGludGVybmFsIGNvbW1hbmQgaGFuZGxlciwgYW5kCisJICogZGllIGlmIHRoYXQgb25lIGNhbm5vdCBoYW5kbGUgaXQuCisJICovCisJaWYgKCFzdHJuY21wKGNtZCwgImdpdC0iLCA0KSkgeworCQljbWQgKz0gNDsKKwkJYXJndlswXSA9IGNtZDsKKwkJaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoYXJnYywgYXJndiwgZW52cCk7CisJCWRpZSgiY2Fubm90IGhhbmRsZSAlcyBpbnRlcm5hbGx5IiwgY21kKTsKKwl9CisKKwkvKiBMb29rIGZvciBmbGFncy4uICovCisJYXJndisrOworCWFyZ2MtLTsKKwloYW5kbGVfb3B0aW9ucygmYXJndiwgJmFyZ2MpOworCWlmIChhcmdjID4gMCkgeworCQlpZiAoIXN0cm5jbXAoYXJndlswXSwgIi0tIiwgMikpCisJCQlhcmd2WzBdICs9IDI7CisJfSBlbHNlIHsKKwkJLyogRGVmYXVsdCBjb21tYW5kOiAiaGVscCIgKi8KKwkJYXJndlswXSA9ICJoZWxwIjsKKwkJYXJnYyA9IDE7CisJfQorCWNtZCA9IGFyZ3ZbMF07CisKKwkvKgorCSAqIFdlIHNlYXJjaCBmb3IgZ2l0IGNvbW1hbmRzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisJICogIC0gZ2l0X2V4ZWNfcGF0aCgpCisJICogIC0gdGhlIHBhdGggb2YgdGhlICJnaXQiIGNvbW1hbmQgaWYgd2UgY291bGQgZmluZCBpdAorCSAqICAgIGluICQwCisJICogIC0gdGhlIHJlZ3VsYXIgUEFUSC4KKwkgKi8KKwlpZiAoZXhlY19wYXRoKQorCQlwcmVwZW5kX3RvX3BhdGgoZXhlY19wYXRoLCBzdHJsZW4oZXhlY19wYXRoKSk7CisJZXhlY19wYXRoID0gZ2l0X2V4ZWNfcGF0aCgpOworCXByZXBlbmRfdG9fcGF0aChleGVjX3BhdGgsIHN0cmxlbihleGVjX3BhdGgpKTsKKworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiBpdCdzIGFuIGludGVybmFsIGNvbW1hbmQgKi8KKwkJaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoYXJnYywgYXJndiwgZW52cCk7CisKKwkJLyogLi4gdGhlbiB0cnkgdGhlIGV4dGVybmFsIG9uZXMgKi8KKwkJZXhlY3ZfZ2l0X2NtZChhcmd2KTsKKworCQkvKiBJdCBjb3VsZCBiZSBhbiBhbGlhcyAtLSB0aGlzIHdvcmtzIGFyb3VuZCB0aGUgaW5zYW5pdHkKKwkJICogb2Ygb3ZlcnJpZGluZyAiZ2l0IGxvZyIgd2l0aCAiZ2l0IHNob3ciIGJ5IGhhdmluZworCQkgKiBhbGlhcy5sb2cgPSBzaG93CisJCSAqLworCQlpZiAoZG9uZV9hbGlhcyB8fCAhaGFuZGxlX2FsaWFzKCZhcmdjLCAmYXJndikpCisJCQlicmVhazsKKwkJZG9uZV9hbGlhcyA9IDE7CisJfQorCisJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJaGVscF91bmtub3duX2NtZChjbWQpOworCisJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcnVuIGNvbW1hbmQgJyVzJzogJXNcbiIsCisJCWNtZCwgc3RyZXJyb3IoZXJybm8pKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZ2l0LnNwZWMuaW4gYi9naXQuc3BlYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NkMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0LnNwZWMuaW4KQEAgLTAsMCArMSwxODggQEAKKyMgUGFzcyAtLXdpdGhvdXQgZG9jcyB0byBycG1idWlsZCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZG9jdW1lbnRhdGlvbgorTmFtZTogCQlnaXQKK1ZlcnNpb246IAlAQFZFUlNJT05AQAorUmVsZWFzZTogCTElez9kaXN0fQorU3VtbWFyeTogIAlHaXQgY29yZSBhbmQgdG9vbHMKK0xpY2Vuc2U6IAlHUEwKK0dyb3VwOiAJCURldmVsb3BtZW50L1Rvb2xzCitVUkw6IAkJaHR0cDovL2tlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvCitTb3VyY2U6IAlodHRwOi8va2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC8le25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CitCdWlsZFJlcXVpcmVzOgl6bGliLWRldmVsID49IDEuMiwgb3BlbnNzbC1kZXZlbCwgY3VybC1kZXZlbCwgZXhwYXQtZGV2ZWwgICV7IT9fd2l0aG91dF9kb2NzOiwgeG1sdG8sIGFzY2lpZG9jID4gNi4wLjN9CitCdWlsZFJvb3Q6CSV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LXJvb3QtJSgle19faWRfdX0gLW4pCitSZXF1aXJlczoJZ2l0LWNvcmUsIGdpdC1zdm4sIGdpdC1jdnMsIGdpdC1hcmNoLCBnaXQtZW1haWwsIGdpdGsKKworJWRlc2NyaXB0aW9uCitUaGlzIGlzIGEgc3R1cGlkIChidXQgZXh0cmVtZWx5IGZhc3QpIGRpcmVjdG9yeSBjb250ZW50IG1hbmFnZXIuICBJdAorZG9lc24ndCBkbyBhIHdob2xlIGxvdCwgYnV0IHdoYXQgaXQgX2RvZXNfIGRvIGlzIHRyYWNrIGRpcmVjdG9yeQorY29udGVudHMgZWZmaWNpZW50bHkuIEl0IGlzIGludGVuZGVkIHRvIGJlIHRoZSBiYXNlIG9mIGFuIGVmZmljaWVudCwKK2Rpc3RyaWJ1dGVkIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQgc3lzdGVtLiBUaGlzIHBhY2thZ2UgaW5jbHVkZXMKK3J1ZGltZW50YXJ5IHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBTQ00sIGJ1dCB5b3Ugc2hvdWxkIGxvb2sKK2Vsc2V3aGVyZSBmb3IgdG9vbHMgZm9yIG9yZGluYXJ5IGh1bWFucyBsYXllcmVkIG9uIHRvcCBvZiB0aGlzLgorCitUaGlzIGlzIGEgZHVtbXkgcGFja2FnZSB3aGljaCBicmluZ3MgaW4gYWxsIHN1YnBhY2thZ2VzLgorCislcGFja2FnZSBjb3JlCitTdW1tYXJ5OglDb3JlIGdpdCB0b29scworR3JvdXA6CQlEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6CXpsaWIgPj0gMS4yLCByc3luYywgcmNzLCBjdXJsLCBsZXNzLCBvcGVuc3NoLWNsaWVudHMsIHB5dGhvbiA+PSAyLjMsIGV4cGF0CislZGVzY3JpcHRpb24gY29yZQorVGhpcyBpcyBhIHN0dXBpZCAoYnV0IGV4dHJlbWVseSBmYXN0KSBkaXJlY3RvcnkgY29udGVudCBtYW5hZ2VyLiAgSXQKK2RvZXNuJ3QgZG8gYSB3aG9sZSBsb3QsIGJ1dCB3aGF0IGl0IF9kb2VzXyBkbyBpcyB0cmFjayBkaXJlY3RvcnkKK2NvbnRlbnRzIGVmZmljaWVudGx5LiBJdCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgYmFzZSBvZiBhbiBlZmZpY2llbnQsCitkaXN0cmlidXRlZCBzb3VyY2UgY29kZSBtYW5hZ2VtZW50IHN5c3RlbS4gVGhpcyBwYWNrYWdlIGluY2x1ZGVzCitydWRpbWVudGFyeSB0b29scyB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgU0NNLCBidXQgeW91IHNob3VsZCBsb29rCitlbHNld2hlcmUgZm9yIHRvb2xzIGZvciBvcmRpbmFyeSBodW1hbnMgbGF5ZXJlZCBvbiB0b3Agb2YgdGhpcy4KKworVGhlc2UgYXJlIHRoZSBjb3JlIHRvb2xzIHdpdGggbWluaW1hbCBkZXBlbmRlbmNpZXMuCisKKyVwYWNrYWdlIHN2bgorU3VtbWFyeTogICAgICAgIEdpdCB0b29scyBmb3IgaW1wb3J0aW5nIFN1YnZlcnNpb24gcmVwb3NpdG9yaWVzCitHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOiAgICAgICBnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgc3VidmVyc2lvbgorJWRlc2NyaXB0aW9uIHN2bgorR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgU3VidmVyc2lvbiByZXBvc2l0b3JpZXMuCisKKyVwYWNrYWdlIGN2cworU3VtbWFyeTogICAgICAgIEdpdCB0b29scyBmb3IgaW1wb3J0aW5nIENWUyByZXBvc2l0b3JpZXMKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCBjdnMsIGN2c3BzCislZGVzY3JpcHRpb24gY3ZzCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBDVlMgcmVwb3NpdG9yaWVzLgorCislcGFja2FnZSBhcmNoCitTdW1tYXJ5OiAgICAgICAgR2l0IHRvb2xzIGZvciBpbXBvcnRpbmcgQXJjaCByZXBvc2l0b3JpZXMKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6ICAgICAgIGdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9LCB0bGEKKyVkZXNjcmlwdGlvbiBhcmNoCitHaXQgdG9vbHMgZm9yIGltcG9ydGluZyBBcmNoIHJlcG9zaXRvcmllcy4KKworJXBhY2thZ2UgZW1haWwKK1N1bW1hcnk6ICAgICAgICBHaXQgdG9vbHMgZm9yIHNlbmRpbmcgZW1haWwKK0dyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9Ub29scworUmVxdWlyZXM6CWdpdC1jb3JlID0gJXt2ZXJzaW9ufS0le3JlbGVhc2V9IAorJWRlc2NyaXB0aW9uIGVtYWlsCitHaXQgdG9vbHMgZm9yIHNlbmRpbmcgZW1haWwuCisKKyVwYWNrYWdlIC1uIGdpdGsKK1N1bW1hcnk6ICAgICAgICBHaXQgcmV2aXNpb24gdHJlZSB2aXN1YWxpc2VyICgnZ2l0aycpCitHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvVG9vbHMKK1JlcXVpcmVzOiAgICAgICBnaXQtY29yZSA9ICV7dmVyc2lvbn0tJXtyZWxlYXNlfSwgdGsgPj0gOC40CislZGVzY3JpcHRpb24gLW4gZ2l0aworR2l0IHJldmlzaW9uIHRyZWUgdmlzdWFsaXNlciAoJ2dpdGsnKQorCislcHJlcAorJXNldHVwIC1xCisKKyVidWlsZAorbWFrZSAle19zbXBfbWZsYWdzfSBDRkxBR1M9IiRSUE1fT1BUX0ZMQUdTIiBXSVRIX09XTl9TVUJQUk9DRVNTX1BZPVllc1BsZWFzZSBcCisgICAgIHByZWZpeD0le19wcmVmaXh9IGFsbCAleyE/X3dpdGhvdXRfZG9jczogZG9jfQorCislaW5zdGFsbAorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorbWFrZSAle19zbXBfbWZsYWdzfSBERVNURElSPSRSUE1fQlVJTERfUk9PVCBXSVRIX09XTl9TVUJQUk9DRVNTX1BZPVllc1BsZWFzZSBcCisgICAgIHByZWZpeD0le19wcmVmaXh9IG1hbmRpcj0le19tYW5kaXJ9IFwKKyAgICAgaW5zdGFsbCAleyE/X3dpdGhvdXRfZG9jczogaW5zdGFsbC1kb2N9CisKKyhmaW5kICRSUE1fQlVJTERfUk9PVCV7X2JpbmRpcn0gLXR5cGUgZiB8IGdyZXAgLXZFICJhcmNofHN2bnxjdnN8ZW1haWx8Z2l0ayIgfCBzZWQgLWUgc0BeJFJQTV9CVUlMRF9ST09UQEApICAgICAgICAgICAgICAgPiBiaW4tbWFuLWRvYy1maWxlcworJWlmICV7IT9fd2l0aG91dF9kb2NzOjF9MAorKGZpbmQgJFJQTV9CVUlMRF9ST09UJXtfbWFuZGlyfSAkUlBNX0JVSUxEX1JPT1QvRG9jdW1lbnRhdGlvbiAtdHlwZSBmIHwgZ3JlcCAtdkUgImFyY2h8c3ZufGdpdC1jdnN8ZW1haWx8Z2l0ayIgfCBzZWQgLWUgc0BeJFJQTV9CVUlMRF9ST09UQEAgLWUgJ3MvJC8qLycgKSA+PiBiaW4tbWFuLWRvYy1maWxlcworJWVuZGlmCisKKyVjbGVhbgorcm0gLXJmICRSUE1fQlVJTERfUk9PVAorCislZmlsZXMKKyMgVGhlc2UgYXJlIG5vIGZpbGVzIGluIHRoZSByb290IHBhY2thZ2UKKworJWZpbGVzIHN2bgorJWRlZmF0dHIoLSxyb290LHJvb3QpCisle19iaW5kaXJ9Lypzdm4qCislZG9jIERvY3VtZW50YXRpb24vKnN2bioudHh0CisleyE/X3dpdGhvdXRfZG9jczogJXtfbWFuZGlyfS9tYW4xLypzdm4qLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qc3ZuKi5odG1sIH0KKworJWZpbGVzIGN2cworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLnR4dAorJXtfYmluZGlyfS8qY3ZzKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qY3ZzKi4xKn0KKyV7IT9fd2l0aG91dF9kb2NzOiAlZG9jIERvY3VtZW50YXRpb24vKmdpdC1jdnMqLmh0bWwgfQorCislZmlsZXMgYXJjaAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmFyY2gqLnR4dAorJXtfYmluZGlyfS8qYXJjaCoKKyV7IT9fd2l0aG91dF9kb2NzOiAle19tYW5kaXJ9L21hbjEvKmFyY2gqLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qYXJjaCouaHRtbCB9CisKKyVmaWxlcyBlbWFpbAorJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmVtYWlsKi50eHQKKyV7X2JpbmRpcn0vKmVtYWlsKgorJXshP193aXRob3V0X2RvY3M6ICV7X21hbmRpcn0vbWFuMS8qZW1haWwqLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qZW1haWwqLmh0bWwgfQorCislZmlsZXMgLW4gZ2l0aworJWRlZmF0dHIoLSxyb290LHJvb3QpCislZG9jIERvY3VtZW50YXRpb24vKmdpdGsqLnR4dAorJXtfYmluZGlyfS8qZ2l0ayoKKyV7IT9fd2l0aG91dF9kb2NzOiAle19tYW5kaXJ9L21hbjEvKmdpdGsqLjEqfQorJXshP193aXRob3V0X2RvY3M6ICVkb2MgRG9jdW1lbnRhdGlvbi8qZ2l0ayouaHRtbCB9CisKKyVmaWxlcyBjb3JlIC1mIGJpbi1tYW4tZG9jLWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyV7X2RhdGFkaXJ9L2dpdC1jb3JlLworJWRvYyBSRUFETUUgQ09QWUlORyBEb2N1bWVudGF0aW9uLyoudHh0CisleyE/X3dpdGhvdXRfZG9jczogJWRvYyBEb2N1bWVudGF0aW9uLyouaHRtbCB9CisKKyVjaGFuZ2Vsb2cKKyogTW9uIE5vdiAxNCAyMDA1IEguIFBldGVyIEFudmluIDxocGFAenl0b3IuY29tPiAwLjk5LjlqLTEKKy0gQ2hhbmdlIHN1YnBhY2thZ2UgbmFtZXMgdG8gZ2l0LTxuYW1lPiBpbnN0ZWFkIG9mIGdpdC1jb3JlLTxuYW1lPgorLSBDcmVhdGUgZW1wdHkgcm9vdCBwYWNrYWdlIHdoaWNoIGJyaW5ncyBpbiBhbGwgc3VicGFja2FnZXMKKy0gUmVuYW1lIGdpdC10ayAtPiBnaXRrCisKKyogVGh1IE5vdiAxMCAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXN3QG9zZGwub3JnPiAwLjk5LjlnLTEKKy0gemxpYiBkZXBlbmRlbmN5IGZpeAorLSBNaW5vciBjbGVhbnVwcyBmcm9tIHNwbGl0CistIE1vdmUgYXJjaCBpbXBvcnQgdG8gc2VwYXJhdGUgcGFja2FnZSBhcyB3ZWxsCisKKyogVHVlIFNlcCAyNyAyMDA1IEppbSBSYWRmb3JkIDxyYWRmb3JkQGJsYWNrYmVhbi5vcmc+CistIE1vdmUgcHJvZ3JhbXMgd2l0aCBub24tc3RhbmRhcmQgZGVwZW5kZW5jaWVzIChzdm4sIGN2cywgZW1haWwpCisgIGludG8gc2VwYXJhdGUgcGFja2FnZXMKKworKiBUdWUgU2VwIDI3IDIwMDUgSC4gUGV0ZXIgQW52aW4gPGhwYUB6eXRvci5jb20+CistIHBhcmFsbGVsaXplIGJ1aWxkCistIENPUFRTIC0+IENGTEFHUworCisqIEZyaSBTZXAgMTYgMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4gMC45OS42LTEKKy0gdXBkYXRlIHRvIDAuOTkuNgorCisqIEZyaSBTZXAgMTYgMjAwNSBIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KKy0gTGludXMgbm90aWNlZCB0aGF0IGxlc3MgaXMgcmVxdWlyZWQsIGFkZGVkIHRvIHRoZSBkZXBlbmRlbmNpZXMKKworKiBTdW4gU2VwIDExIDIwMDUgSG9yc3QgSC4gdm9uIEJyYW5kIDx2b25icmFuZEBpbmYudXRmc20uY2w+CistIFVwZGF0ZWQgZGVwZW5kZW5jaWVzCistIERvbid0IGFzc3VtZSBtYW5wYWdlcyBhcmUgZ3ppcHBlZAorCisqIFRodSBBdWcgMTggMjAwNSBDaHJpcyBXcmlnaHQgPGNocmlzd0Bvc2RsLm9yZz4gMC45OS40LTQKKy0gZHJvcCBzaF91dGlscywgc2gtdXRpbHMsIGRpZmZ1dGlscywgbWt0ZW1wLCBhbmQgb3BlbnNzbCBSZXF1aXJlcworLSB1c2UgUlBNX09QVF9GTEFHUyBpbiBzcGVjIGZpbGUsIGRyb3AgcGF0Y2gwCisKKyogV2VkIEF1ZyAxNyAyMDA1IFRvbSAic3BvdCIgQ2FsbGF3YXkgPHRjYWxsYXdhQHJlZGhhdC5jb20+IDAuOTkuNC0zCistIHVzZSBkaXN0IHRhZyB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYnJhbmNoZXMKKy0gdXNlIHJwbSBvcHRmbGFncyBieSBkZWZhdWx0IChwYXRjaDApCistIG93biAle19kYXRhZGlyfS9naXQtY29yZS8KKworKiBNb24gQXVnIDE1IDIwMDUgQ2hyaXMgV3JpZ2h0IDxjaHJpc3dAb3NkbC5vcmc+CistIHVwZGF0ZSBzcGVjIGZpbGUgdG8gZml4IEJ1aWxkcm9vdCwgUmVxdWlyZXMsIGFuZCBkcm9wIFZlbmRvcgorCisqIFN1biBBdWcgMDcgMjAwNSBIb3JzdCBILiB2b24gQnJhbmQgPHZvbmJyYW5kQGluZi51dGZzbS5jbD4KKy0gUmVkaWQgdGhlIGRlc2NyaXB0aW9uCistIEN1dCBvdmVybG9uZyBtYWtlIGxpbmUsIGxvb3NlbmVkIGNoYW5nZWxvZyBhIGJpdAorLSBJIHRoaW5rIEp1bmlvIChvciBwZXJoYXBzIE9TREw/KSBzaG91bGQgYmUgdmVuZG9yLi4uCisKKyogVGh1IEp1bCAxNCAyMDA1IEVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CistIEFkZCB0aGUgbWFuIHBhZ2VzLCBhbmQgdGhlIC0td2l0aG91dCBkb2NzIGJ1aWxkIG9wdGlvbgorCisqIFdlZCBKdWwgNyAyMDA1IENocmlzIFdyaWdodCA8Y2hyaXNAb3NkbC5vcmc+CistIGluaXRpYWwgZ2l0IHNwZWMgZmlsZQpkaWZmIC0tZ2l0IGEvZ2l0TWVyZ2VDb21tb24ucHkgYi9naXRNZXJnZUNvbW1vbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJmOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0TWVyZ2VDb21tb24ucHkKQEAgLTAsMCArMSwyNzUgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEZyZWRyaWsgS3VpdmluZW4KKyMKKworaW1wb3J0IHN5cywgcmUsIG9zLCB0cmFjZWJhY2sKK2Zyb20gc2V0cyBpbXBvcnQgU2V0CisKK2RlZiBkaWUoKmFyZ3MpOgorICAgIHByaW50TGlzdChhcmdzLCBzeXMuc3RkZXJyKQorICAgIHN5cy5leGl0KDIpCisKK2RlZiBwcmludExpc3QobGlzdCwgZmlsZT1zeXMuc3Rkb3V0KToKKyAgICBmb3IgeCBpbiBsaXN0OgorICAgICAgICBmaWxlLndyaXRlKHN0cih4KSkKKyAgICAgICAgZmlsZS53cml0ZSgnICcpCisgICAgZmlsZS53cml0ZSgnXG4nKQorCitpbXBvcnQgc3VicHJvY2VzcworCisjIERlYnVnZ2luZyBtYWNoaW5lcnkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLQorCitERUJVRyA9IDAKK2Z1bmN0aW9uc1RvRGVidWcgPSBTZXQoKQorCitkZWYgYWRkRGVidWcoZnVuYyk6CisgICAgaWYgdHlwZShmdW5jKSA9PSBzdHI6CisgICAgICAgIGZ1bmN0aW9uc1RvRGVidWcuYWRkKGZ1bmMpCisgICAgZWxzZToKKyAgICAgICAgZnVuY3Rpb25zVG9EZWJ1Zy5hZGQoZnVuYy5mdW5jX25hbWUpCisKK2RlZiBkZWJ1ZygqYXJncyk6CisgICAgaWYgREVCVUc6CisgICAgICAgIGZ1bmNOYW1lID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2soKVstMl1bMl0KKyAgICAgICAgaWYgZnVuY05hbWUgaW4gZnVuY3Rpb25zVG9EZWJ1ZzoKKyAgICAgICAgICAgIHByaW50TGlzdChhcmdzKQorCisjIFByb2dyYW0gZXhlY3V0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFByb2dyYW1FcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9nU3RyLCBlcnJvcik6CisgICAgICAgIHNlbGYucHJvZ1N0ciA9IHByb2dTdHIKKyAgICAgICAgc2VsZi5lcnJvciA9IGVycm9yCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvZ1N0ciArICc6ICcgKyBzZWxmLmVycm9yCisKK2FkZERlYnVnKCdydW5Qcm9ncmFtJykKK2RlZiBydW5Qcm9ncmFtKHByb2csIGlucHV0PU5vbmUsIHJldHVybkNvZGU9RmFsc2UsIGVudj1Ob25lLCBwaXBlT3V0cHV0PVRydWUpOgorICAgIGRlYnVnKCdydW5Qcm9ncmFtIHByb2c6Jywgc3RyKHByb2cpLCAnaW5wdXQ6Jywgc3RyKGlucHV0KSkKKyAgICBpZiB0eXBlKHByb2cpIGlzIHN0cjoKKyAgICAgICAgcHJvZ1N0ciA9IHByb2cKKyAgICBlbHNlOgorICAgICAgICBwcm9nU3RyID0gJyAnLmpvaW4ocHJvZykKKyAgICAKKyAgICB0cnk6CisgICAgICAgIGlmIHBpcGVPdXRwdXQ6CisgICAgICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlNURE9VVAorICAgICAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGRlcnIgPSBOb25lCisgICAgICAgICAgICBzdGRvdXQgPSBOb25lCisgICAgICAgIHBvcCA9IHN1YnByb2Nlc3MuUG9wZW4ocHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbCA9IHR5cGUocHJvZykgaXMgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PWVudikKKyAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgZGVidWcoJ3N0cmVycm9yOicsIGUuc3RyZXJyb3IpCisgICAgICAgIHJhaXNlIFByb2dyYW1FcnJvcihwcm9nU3RyLCBlLnN0cmVycm9yKQorCisgICAgaWYgaW5wdXQgIT0gTm9uZToKKyAgICAgICAgcG9wLnN0ZGluLndyaXRlKGlucHV0KQorICAgIHBvcC5zdGRpbi5jbG9zZSgpCisKKyAgICBpZiBwaXBlT3V0cHV0OgorICAgICAgICBvdXQgPSBwb3Auc3Rkb3V0LnJlYWQoKQorICAgIGVsc2U6CisgICAgICAgIG91dCA9ICcnCisKKyAgICBjb2RlID0gcG9wLndhaXQoKQorICAgIGlmIHJldHVybkNvZGU6CisgICAgICAgIHJldCA9IFtvdXQsIGNvZGVdCisgICAgZWxzZToKKyAgICAgICAgcmV0ID0gb3V0CisgICAgaWYgY29kZSAhPSAwIGFuZCBub3QgcmV0dXJuQ29kZToKKyAgICAgICAgZGVidWcoJ2Vycm9yIG91dHB1dDonLCBvdXQpCisgICAgICAgIGRlYnVnKCdwcm9nOicsIHByb2cpCisgICAgICAgIHJhaXNlIFByb2dyYW1FcnJvcihwcm9nU3RyLCBvdXQpCisjICAgIGRlYnVnKCdvdXRwdXQ6Jywgb3V0LnJlcGxhY2UoJ1wwJywgJ1xuJykpCisgICAgcmV0dXJuIHJldAorCisjIENvZGUgZm9yIGNvbXB1dGluZyBjb21tb24gYW5jZXN0b3JzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2N1cnJlbnRJZCA9IDAKK2RlZiBnZXRVbmlxdWVJZCgpOgorICAgIGdsb2JhbCBjdXJyZW50SWQKKyAgICBjdXJyZW50SWQgKz0gMQorICAgIHJldHVybiBjdXJyZW50SWQKKworIyBUaGUgJ3ZpcnR1YWwnIGNvbW1pdCBvYmplY3RzIGhhdmUgU0hBcyB3aGljaCBhcmUgaW50ZWdlcnMKK3NoYVJFID0gcmUuY29tcGlsZSgnXlswLTlhLWZdezQwfSQnKQorZGVmIGlzU2hhKG9iaik6CisgICAgcmV0dXJuICh0eXBlKG9iaikgaXMgc3RyIGFuZCBib29sKHNoYVJFLm1hdGNoKG9iaikpKSBvciBcCisgICAgICAgICAgICh0eXBlKG9iaikgaXMgaW50IGFuZCBvYmogPj0gMSkKKworY2xhc3MgQ29tbWl0KG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydwYXJlbnRzJywgJ2ZpcnN0TGluZU1zZycsICdjaGlsZHJlbicsICdfdHJlZScsICdzaGEnLAorICAgICAgICAgICAgICAgICAndmlydHVhbCddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2hhLCBwYXJlbnRzLCB0cmVlPU5vbmUpOgorICAgICAgICBzZWxmLnBhcmVudHMgPSBwYXJlbnRzCisgICAgICAgIHNlbGYuZmlyc3RMaW5lTXNnID0gTm9uZQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KKworICAgICAgICBpZiB0cmVlOgorICAgICAgICAgICAgdHJlZSA9IHRyZWUucnN0cmlwKCkKKyAgICAgICAgICAgIGFzc2VydChpc1NoYSh0cmVlKSkKKyAgICAgICAgc2VsZi5fdHJlZSA9IHRyZWUKKworICAgICAgICBpZiBub3Qgc2hhOgorICAgICAgICAgICAgc2VsZi5zaGEgPSBnZXRVbmlxdWVJZCgpCisgICAgICAgICAgICBzZWxmLnZpcnR1YWwgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmZpcnN0TGluZU1zZyA9ICd2aXJ0dWFsIGNvbW1pdCcKKyAgICAgICAgICAgIGFzc2VydChpc1NoYSh0cmVlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmlydHVhbCA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLnNoYSA9IHNoYS5yc3RyaXAoKQorICAgICAgICBhc3NlcnQoaXNTaGEoc2VsZi5zaGEpKQorCisgICAgZGVmIHRyZWUoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0SW5mbygpCisgICAgICAgIGFzc2VydChzZWxmLl90cmVlICE9IE5vbmUpCisgICAgICAgIHJldHVybiBzZWxmLl90cmVlCisKKyAgICBkZWYgc2hvcnRJbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmdldEluZm8oKQorICAgICAgICByZXR1cm4gc3RyKHNlbGYuc2hhKSArICcgJyArIHNlbGYuZmlyc3RMaW5lTXNnCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hvcnRJbmZvKCkKKworICAgIGRlZiBnZXRJbmZvKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZpcnR1YWwgb3Igc2VsZi5maXJzdExpbmVNc2cgIT0gTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5mbyA9IHJ1blByb2dyYW0oWydnaXQtY2F0LWZpbGUnLCAnY29tbWl0Jywgc2VsZi5zaGFdKQorICAgICAgICAgICAgaW5mbyA9IGluZm8uc3BsaXQoJ1xuJykKKyAgICAgICAgICAgIG1zZyA9IEZhbHNlCisgICAgICAgICAgICBmb3IgbCBpbiBpbmZvOgorICAgICAgICAgICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdExpbmVNc2cgPSBsCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbC5zdGFydHN3aXRoKCd0cmVlJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90cmVlID0gbFs1Ol0ucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBsID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gVHJ1ZQorCitjbGFzcyBHcmFwaDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29tbWl0cyA9IFtdCisgICAgICAgIHNlbGYuc2hhTWFwID0ge30KKworICAgIGRlZiBhZGROb2RlKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShub2RlLCBDb21taXQpKQorICAgICAgICBzZWxmLnNoYU1hcFtub2RlLnNoYV0gPSBub2RlCisgICAgICAgIHNlbGYuY29tbWl0cy5hcHBlbmQobm9kZSkKKyAgICAgICAgZm9yIHAgaW4gbm9kZS5wYXJlbnRzOgorICAgICAgICAgICAgcC5jaGlsZHJlbi5hcHBlbmQobm9kZSkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiByZWFjaGFibGVOb2RlcyhzZWxmLCBuMSwgbjIpOgorICAgICAgICByZXMgPSB7fQorICAgICAgICBkZWYgdHJhdmVyc2Uobik6CisgICAgICAgICAgICByZXNbbl0gPSBUcnVlCisgICAgICAgICAgICBmb3IgcCBpbiBuLnBhcmVudHM6CisgICAgICAgICAgICAgICAgdHJhdmVyc2UocCkKKworICAgICAgICB0cmF2ZXJzZShuMSkKKyAgICAgICAgdHJhdmVyc2UobjIpCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiBmaXhQYXJlbnRzKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgwLCBsZW4obm9kZS5wYXJlbnRzKSk6CisgICAgICAgICAgICBub2RlLnBhcmVudHNbeF0gPSBzZWxmLnNoYU1hcFtub2RlLnBhcmVudHNbeF1dCisKKyMgYWRkRGVidWcoJ2J1aWxkR3JhcGgnKQorZGVmIGJ1aWxkR3JhcGgoaGVhZHMpOgorICAgIGRlYnVnKCdidWlsZEdyYXBoIGhlYWRzOicsIGhlYWRzKQorICAgIGZvciBoIGluIGhlYWRzOgorICAgICAgICBhc3NlcnQoaXNTaGEoaCkpCisKKyAgICBnID0gR3JhcGgoKQorCisgICAgb3V0ID0gcnVuUHJvZ3JhbShbJ2dpdC1yZXYtbGlzdCcsICctLXBhcmVudHMnXSArIGhlYWRzKQorICAgIGZvciBsIGluIG91dC5zcGxpdCgnXG4nKToKKyAgICAgICAgaWYgbCA9PSAnJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHNoYXMgPSBsLnNwbGl0KCcgJykKKworICAgICAgICAjIFRoaXMgaXMgYSBoYWNrLCB3ZSB0ZW1wb3JhcmlseSB1c2UgdGhlICdwYXJlbnRzJyBhdHRyaWJ1dGUKKyAgICAgICAgIyB0byBjb250YWluIGEgbGlzdCBvZiBTSEExOnMuIFRoZXkgYXJlIGxhdGVyIHJlcGxhY2VkIGJ5IHByb3BlcgorICAgICAgICAjIENvbW1pdCBvYmplY3RzLgorICAgICAgICBjID0gQ29tbWl0KHNoYXNbMF0sIHNoYXNbMTpdKQorCisgICAgICAgIGcuY29tbWl0cy5hcHBlbmQoYykKKyAgICAgICAgZy5zaGFNYXBbYy5zaGFdID0gYworCisgICAgZm9yIGMgaW4gZy5jb21taXRzOgorICAgICAgICBnLmZpeFBhcmVudHMoYykKKworICAgIGZvciBjIGluIGcuY29tbWl0czoKKyAgICAgICAgZm9yIHAgaW4gYy5wYXJlbnRzOgorICAgICAgICAgICAgcC5jaGlsZHJlbi5hcHBlbmQoYykKKyAgICByZXR1cm4gZworCisjIFdyaXRlIHRoZSBlbXB0eSB0cmVlIHRvIHRoZSBvYmplY3QgZGF0YWJhc2UgYW5kIHJldHVybiBpdHMgU0hBMQorZGVmIHdyaXRlRW1wdHlUcmVlKCk6CisgICAgdG1wSW5kZXggPSBvcy5lbnZpcm9uLmdldCgnR0lUX0RJUicsICcuZ2l0JykgKyAnL21lcmdlLXRtcC1pbmRleCcKKyAgICBkZWYgZGVsVG1wSW5kZXgoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHRtcEluZGV4KQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBkZWxUbXBJbmRleCgpCisgICAgbmV3RW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICBuZXdFbnZbJ0dJVF9JTkRFWF9GSUxFJ10gPSB0bXBJbmRleAorICAgIHJlcyA9IHJ1blByb2dyYW0oWydnaXQtd3JpdGUtdHJlZSddLCBlbnY9bmV3RW52KS5yc3RyaXAoKQorICAgIGRlbFRtcEluZGV4KCkKKyAgICByZXR1cm4gcmVzCisKK2RlZiBhZGRDb21tb25Sb290KGdyYXBoKToKKyAgICByb290cyA9IFtdCisgICAgZm9yIGMgaW4gZ3JhcGguY29tbWl0czoKKyAgICAgICAgaWYgbGVuKGMucGFyZW50cykgPT0gMDoKKyAgICAgICAgICAgIHJvb3RzLmFwcGVuZChjKQorCisgICAgc3VwZXJSb290ID0gQ29tbWl0KHNoYT1Ob25lLCBwYXJlbnRzPVtdLCB0cmVlPXdyaXRlRW1wdHlUcmVlKCkpCisgICAgZ3JhcGguYWRkTm9kZShzdXBlclJvb3QpCisgICAgZm9yIHIgaW4gcm9vdHM6CisgICAgICAgIHIucGFyZW50cyA9IFtzdXBlclJvb3RdCisgICAgc3VwZXJSb290LmNoaWxkcmVuID0gcm9vdHMKKyAgICByZXR1cm4gc3VwZXJSb290CisKK2RlZiBnZXRDb21tb25BbmNlc3RvcnMoZ3JhcGgsIGNvbW1pdDEsIGNvbW1pdDIpOgorICAgICcnJ0ZpbmQgdGhlIGNvbW1vbiBhbmNlc3RvcnMgZm9yIGNvbW1pdDEgYW5kIGNvbW1pdDInJycKKyAgICBhc3NlcnQoaXNpbnN0YW5jZShjb21taXQxLCBDb21taXQpIGFuZCBpc2luc3RhbmNlKGNvbW1pdDIsIENvbW1pdCkpCisKKyAgICBkZWYgdHJhdmVyc2Uoc3RhcnQsIHNldCk6CisgICAgICAgIHN0YWNrID0gW3N0YXJ0XQorICAgICAgICB3aGlsZSBsZW4oc3RhY2spID4gMDoKKyAgICAgICAgICAgIGVsID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgIHNldC5hZGQoZWwpCisgICAgICAgICAgICBmb3IgcCBpbiBlbC5wYXJlbnRzOgorICAgICAgICAgICAgICAgIGlmIHAgbm90IGluIHNldDoKKyAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKHApCisgICAgaDFTZXQgPSBTZXQoKQorICAgIGgyU2V0ID0gU2V0KCkKKyAgICB0cmF2ZXJzZShjb21taXQxLCBoMVNldCkKKyAgICB0cmF2ZXJzZShjb21taXQyLCBoMlNldCkKKyAgICBzaGFyZWQgPSBoMVNldC5pbnRlcnNlY3Rpb24oaDJTZXQpCisKKyAgICBpZiBsZW4oc2hhcmVkKSA9PSAwOgorICAgICAgICBzaGFyZWQgPSBbYWRkQ29tbW9uUm9vdChncmFwaCldCisgICAgICAgIAorICAgIHJlcyA9IFNldCgpCisKKyAgICBmb3IgcyBpbiBzaGFyZWQ6CisgICAgICAgIGlmIGxlbihbYyBmb3IgYyBpbiBzLmNoaWxkcmVuIGlmIGMgaW4gc2hhcmVkXSkgPT0gMDoKKyAgICAgICAgICAgIHJlcy5hZGQocykKKyAgICByZXR1cm4gbGlzdChyZXMpCmRpZmYgLS1naXQgYS9naXRrIGIvZ2l0awppbmRleCA3ZDU0MGMxLi5hOTJhYjAwIDEwMDc1NQotLS0gYS9naXRrCisrKyBiL2dpdGsKQEAgLTQ5MzQsNyArNDkzNCw3IEBACiAKIHByb2MgcmVkcmF3dGFncyB7aWR9IHsKICAgICBnbG9iYWwgY2FudiBsaW5laHRhZyBjb21taXRyb3cgaWRwb3Mgc2VsZWN0ZWRsaW5lIGN1cnZpZXcKLSAgICBnbG9iYWwgbWFpbmZvbnQKKyAgICBnbG9iYWwgbWFpbmZvbnQgY2FudnhtYXgKIAogICAgIGlmIHshW2luZm8gZXhpc3RzIGNvbW1pdHJvdygkY3VydmlldywkaWQpXX0gcmV0dXJuCiAgICAgZHJhd2NtaXRyb3cgJGNvbW1pdHJvdygkY3VydmlldywkaWQpCmRpZmYgLS1naXQgYS9naXR3ZWIvUkVBRE1FIGIvZ2l0d2ViL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY3Mjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2l0d2ViL1JFQURNRQpAQCAtMCwwICsxLDkgQEAKK0dJVCB3ZWIgSW50ZXJmYWNlCisKK1RoZSBvbmUgd29ya2luZyBvbjoKKyAgaHR0cDovL3d3dy5rZXJuZWwub3JnL2dpdC8KKworRnJvbSB0aGUgZ2l0IHZlcnNpb24gMS40LjAgZ2l0d2ViIGlzIGJ1bmRsZWQgd2l0aCBnaXQuCisKK0FueSBjb21tZW50L3F1ZXN0aW9uL2NvbmNlcm4gdG86CisgIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KZGlmZiAtLWdpdCBhL2dpdHdlYi9naXR3ZWIuY2dpIGIvZ2l0d2ViL2dpdHdlYi5jZ2kKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTVmY2E2MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi9naXR3ZWIuY2dpCkBAIC0wLDAgKzEsMjY5NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgZ2l0d2ViIC0gc2ltcGxlIHdlYiBpbnRlcmZhY2UgdG8gdHJhY2sgY2hhbmdlcyBpbiBnaXQgcmVwb3NpdG9yaWVzCisjCisjIChDKSAyMDA1LTIwMDYsIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyMgKEMpIDIwMDUsIENocmlzdGlhbiBHaWVya2UKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIENHSSBxdyg6c3RhbmRhcmQgOmVzY2FwZUhUTUwgLW5vc3RpY2t5KTsKK3VzZSBDR0k6OlV0aWwgcXcodW5lc2NhcGUpOwordXNlIENHSTo6Q2FycCBxdyhmYXRhbHNUb0Jyb3dzZXIpOwordXNlIEVuY29kZTsKK3VzZSBGY250bCAnOm1vZGUnOworYmlubW9kZSBTVERPVVQsICc6dXRmOCc7CisKK291ciAkY2dpID0gbmV3IENHSTsKK291ciAkdmVyc2lvbiA9ICIyNjciOworb3VyICRteV91cmwgPSAkY2dpLT51cmwoKTsKK291ciAkbXlfdXJpID0gJGNnaS0+dXJsKC1hYnNvbHV0ZSA9PiAxKTsKK291ciAkcnNzX2xpbmsgPSAiIjsKKworIyBjb3JlIGdpdCBleGVjdXRhYmxlIHRvIHVzZQorIyB0aGlzIGNhbiBqdXN0IGJlICJnaXQiIGlmIHlvdXIgd2Vic2VydmVyIGhhcyBhIHNlbnNpYmxlIFBBVEgKK291ciAkR0lUID0gIi91c3IvYmluL2dpdCI7CisKKyMgYWJzb2x1dGUgZnMtcGF0aCB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgcHJvamVjdCBwYXRoCisjb3VyICRwcm9qZWN0cm9vdCA9ICIvcHViL3NjbSI7CitvdXIgJHByb2plY3Ryb290ID0gIi9ob21lL2theS9wdWJsaWNfaHRtbC9wdWIvc2NtIjsKKworIyB2ZXJzaW9uIG9mIHRoZSBjb3JlIGdpdCBiaW5hcnkKK291ciAkZ2l0X3ZlcnNpb24gPSBxeCgkR0lUIC0tdmVyc2lvbikgPX4gbS9naXQgdmVyc2lvbiAoLiopJC8gPyAkMSA6ICJ1bmtub3duIjsKKworIyBsb2NhdGlvbiBmb3IgdGVtcG9yYXJ5IGZpbGVzIG5lZWRlZCBmb3IgZGlmZnMKK291ciAkZ2l0X3RlbXAgPSAiL3RtcC9naXR3ZWIiOworaWYgKCEgLWQgJGdpdF90ZW1wKSB7CisgICAgbWtkaXIoJGdpdF90ZW1wLCAwNzAwKSB8fCBkaWVfZXJyb3IoIkNvdWxkbid0IG1rZGlyICRnaXRfdGVtcCIpOworfQorCisjIHRhcmdldCBvZiB0aGUgaG9tZSBsaW5rIG9uIHRvcCBvZiBhbGwgcGFnZXMKK291ciAkaG9tZV9saW5rID0gJG15X3VyaTsKKworIyBuYW1lIG9mIHlvdXIgc2l0ZSBvciBvcmdhbml6YXRpb24gdG8gYXBwZWFyIGluIHBhZ2UgdGl0bGVzCisjIHJlcGxhY2UgdGhpcyB3aXRoIHNvbWV0aGluZyBtb3JlIGRlc2NyaXB0aXZlIGZvciBjbGVhcmVyIGJvb2ttYXJrcworb3VyICRzaXRlX25hbWUgPSAkRU5WeydTRVJWRVJfTkFNRSd9IHx8ICJVbnRpdGxlZCI7CisKKyMgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgaG9tZSBwYWdlCitvdXIgJGhvbWVfdGV4dCA9ICJpbmRleHRleHQuaHRtbCI7CisKKyMgVVJJIG9mIGRlZmF1bHQgc3R5bGVzaGVldAorb3VyICRzdHlsZXNoZWV0ID0gImdpdHdlYi5jc3MiOworCisjIHNvdXJjZSBvZiBwcm9qZWN0cyBsaXN0Cisjb3VyICRwcm9qZWN0c19saXN0ID0gJHByb2plY3Ryb290Oworb3VyICRwcm9qZWN0c19saXN0ID0gImluZGV4L2luZGV4LmF1eCI7CisKKyMgZGVmYXVsdCBibG9iX3BsYWluIG1pbWV0eXBlIGFuZCBkZWZhdWx0IGNoYXJzZXQgZm9yIHRleHQvcGxhaW4gYmxvYgorb3VyICRkZWZhdWx0X2Jsb2JfcGxhaW5fbWltZXR5cGUgPSAndGV4dC9wbGFpbic7CitvdXIgJGRlZmF1bHRfdGV4dF9wbGFpbl9jaGFyc2V0ICA9IHVuZGVmOworCisjIGZpbGUgdG8gdXNlIGZvciBndWVzc2luZyBNSU1FIHR5cGVzIGJlZm9yZSB0cnlpbmcgL2V0Yy9taW1lLnR5cGVzCisjIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudCBnaXQgcmVwb3NpdG9yeSkKK291ciAkbWltZXR5cGVzX2ZpbGUgPSB1bmRlZjsKKworIyBpbnB1dCB2YWxpZGF0aW9uIGFuZCBkaXNwYXRjaAorb3VyICRhY3Rpb24gPSAkY2dpLT5wYXJhbSgnYScpOworaWYgKGRlZmluZWQgJGFjdGlvbikgeworCWlmICgkYWN0aW9uID1+IG0vW14wLTlhLXpBLVpcLlwtX10vKSB7CisJCXVuZGVmICRhY3Rpb247CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgYWN0aW9uIHBhcmFtZXRlci4iKTsKKwl9CisJaWYgKCRhY3Rpb24gZXEgImdpdC1sb2dvLnBuZyIpIHsKKwkJZ2l0X2xvZ28oKTsKKwkJZXhpdDsKKwl9IGVsc2lmICgkYWN0aW9uIGVxICJvcG1sIikgeworCQlnaXRfb3BtbCgpOworCQlleGl0OworCX0KK30KKworb3VyICRvcmRlciA9ICRjZ2ktPnBhcmFtKCdvJyk7CitpZiAoZGVmaW5lZCAkb3JkZXIpIHsKKwlpZiAoJG9yZGVyID1+IG0vW14wLTlhLXpBLVpfXS8pIHsKKwkJdW5kZWYgJG9yZGVyOworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIG9yZGVyIHBhcmFtZXRlci4iKTsKKwl9Cit9CisKK291ciAkcHJvamVjdCA9ICgkY2dpLT5wYXJhbSgncCcpIHx8ICRFTlZ7J1BBVEhfSU5GTyd9KTsKK2lmIChkZWZpbmVkICRwcm9qZWN0KSB7CisJJHByb2plY3QgPX4gc3xeL3x8OyAkcHJvamVjdCA9fiBzfC8kfHw7CisJJHByb2plY3QgPSB2YWxpZGF0ZV9pbnB1dCgkcHJvamVjdCk7CisJaWYgKCFkZWZpbmVkKCRwcm9qZWN0KSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIHByb2plY3QgcGFyYW1ldGVyLiIpOworCX0KKwlpZiAoISgtZCAiJHByb2plY3Ryb290LyRwcm9qZWN0IikpIHsKKwkJdW5kZWYgJHByb2plY3Q7CisJCWRpZV9lcnJvcih1bmRlZiwgIk5vIHN1Y2ggZGlyZWN0b3J5LiIpOworCX0KKwlpZiAoISgtZSAiJHByb2plY3Ryb290LyRwcm9qZWN0L0hFQUQiKSkgeworCQl1bmRlZiAkcHJvamVjdDsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gc3VjaCBwcm9qZWN0LiIpOworCX0KKwkkcnNzX2xpbmsgPSAiPGxpbmsgcmVsPVwiYWx0ZXJuYXRlXCIgdGl0bGU9XCIiIC4gZXNjX3BhcmFtKCRwcm9qZWN0KSAuICIgbG9nXCIgaHJlZj1cIiIgLgorCQkgICAgIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXJzcyIpIC4gIlwiIHR5cGU9XCJhcHBsaWNhdGlvbi9yc3MreG1sXCIvPiI7CisJJEVOVnsnR0lUX0RJUid9ID0gIiRwcm9qZWN0cm9vdC8kcHJvamVjdCI7Cit9IGVsc2UgeworCWdpdF9wcm9qZWN0X2xpc3QoKTsKKwlleGl0OworfQorCitvdXIgJGZpbGVfbmFtZSA9ICRjZ2ktPnBhcmFtKCdmJyk7CitpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisJJGZpbGVfbmFtZSA9IHZhbGlkYXRlX2lucHV0KCRmaWxlX25hbWUpOworCWlmICghZGVmaW5lZCgkZmlsZV9uYW1lKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGZpbGUgcGFyYW1ldGVyLiIpOworCX0KK30KKworb3VyICRoYXNoID0gJGNnaS0+cGFyYW0oJ2gnKTsKK2lmIChkZWZpbmVkICRoYXNoKSB7CisJJGhhc2ggPSB2YWxpZGF0ZV9pbnB1dCgkaGFzaCk7CisJaWYgKCFkZWZpbmVkKCRoYXNoKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGhhc2ggcGFyYW1ldGVyLiIpOworCX0KK30KKworb3VyICRoYXNoX3BhcmVudCA9ICRjZ2ktPnBhcmFtKCdocCcpOworaWYgKGRlZmluZWQgJGhhc2hfcGFyZW50KSB7CisJJGhhc2hfcGFyZW50ID0gdmFsaWRhdGVfaW5wdXQoJGhhc2hfcGFyZW50KTsKKwlpZiAoIWRlZmluZWQoJGhhc2hfcGFyZW50KSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGhhc2ggcGFyZW50IHBhcmFtZXRlci4iKTsKKwl9Cit9CisKK291ciAkaGFzaF9iYXNlID0gJGNnaS0+cGFyYW0oJ2hiJyk7CitpZiAoZGVmaW5lZCAkaGFzaF9iYXNlKSB7CisJJGhhc2hfYmFzZSA9IHZhbGlkYXRlX2lucHV0KCRoYXNoX2Jhc2UpOworCWlmICghZGVmaW5lZCgkaGFzaF9iYXNlKSkgeworCQlkaWVfZXJyb3IodW5kZWYsICJJbnZhbGlkIGhhc2ggYmFzZSBwYXJhbWV0ZXIuIik7CisJfQorfQorCitvdXIgJHBhZ2UgPSAkY2dpLT5wYXJhbSgncGcnKTsKK2lmIChkZWZpbmVkICRwYWdlKSB7CisJaWYgKCRwYWdlID1+IG0vW14wLTldJC8pIHsKKwkJdW5kZWYgJHBhZ2U7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgcGFnZSBwYXJhbWV0ZXIuIik7CisJfQorfQorCitvdXIgJHNlYXJjaHRleHQgPSAkY2dpLT5wYXJhbSgncycpOworaWYgKGRlZmluZWQgJHNlYXJjaHRleHQpIHsKKwlpZiAoJHNlYXJjaHRleHQgPX4gbS9bXmEtekEtWjAtOV9cLlwvXC1cK1w6XEAgXS8pIHsKKwkJdW5kZWYgJHNlYXJjaHRleHQ7CisJCWRpZV9lcnJvcih1bmRlZiwgIkludmFsaWQgc2VhcmNoIHBhcmFtZXRlci4iKTsKKwl9CisJJHNlYXJjaHRleHQgPSBxdW90ZW1ldGEgJHNlYXJjaHRleHQ7Cit9CisKK3N1YiB2YWxpZGF0ZV9pbnB1dCB7CisJbXkgJGlucHV0ID0gc2hpZnQ7CisKKwlpZiAoJGlucHV0ID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCXJldHVybiAkaW5wdXQ7CisJfQorCWlmICgkaW5wdXQgPX4gbS8oXnxcLykofFwufFwuXC4pKCR8XC8pLykgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCWlmICgkaW5wdXQgPX4gbS9bXmEtekEtWjAtOV9ceDgwLVx4ZmZcIFx0XC5cL1wtXCtcI1x+XCVdLykgeworCQlyZXR1cm4gdW5kZWY7CisJfQorCXJldHVybiAkaW5wdXQ7Cit9CisKK2lmICghZGVmaW5lZCAkYWN0aW9uIHx8ICRhY3Rpb24gZXEgInN1bW1hcnkiKSB7CisJZ2l0X3N1bW1hcnkoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiaGVhZHMiKSB7CisJZ2l0X2hlYWRzKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgInRhZ3MiKSB7CisJZ2l0X3RhZ3MoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiYmxvYiIpIHsKKwlnaXRfYmxvYigpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJibG9iX3BsYWluIikgeworCWdpdF9ibG9iX3BsYWluKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgInRyZWUiKSB7CisJZ2l0X3RyZWUoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAicnNzIikgeworCWdpdF9yc3MoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiY29tbWl0IikgeworCWdpdF9jb21taXQoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAibG9nIikgeworCWdpdF9sb2coKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiYmxvYmRpZmYiKSB7CisJZ2l0X2Jsb2JkaWZmKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgImJsb2JkaWZmX3BsYWluIikgeworCWdpdF9ibG9iZGlmZl9wbGFpbigpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJjb21taXRkaWZmIikgeworCWdpdF9jb21taXRkaWZmKCk7CisJZXhpdDsKK30gZWxzaWYgKCRhY3Rpb24gZXEgImNvbW1pdGRpZmZfcGxhaW4iKSB7CisJZ2l0X2NvbW1pdGRpZmZfcGxhaW4oKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiaGlzdG9yeSIpIHsKKwlnaXRfaGlzdG9yeSgpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJzZWFyY2giKSB7CisJZ2l0X3NlYXJjaCgpOworCWV4aXQ7Cit9IGVsc2lmICgkYWN0aW9uIGVxICJzaG9ydGxvZyIpIHsKKwlnaXRfc2hvcnRsb2coKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAidGFnIikgeworCWdpdF90YWcoKTsKKwlleGl0OworfSBlbHNpZiAoJGFjdGlvbiBlcSAiYmxhbWUiKSB7CisJZ2l0X2JsYW1lMigpOworCWV4aXQ7Cit9IGVsc2UgeworCXVuZGVmICRhY3Rpb247CisJZGllX2Vycm9yKHVuZGVmLCAiVW5rbm93biBhY3Rpb24uIik7CisJZXhpdDsKK30KKworIyBxdW90ZSB1bnNhZmUgY2hhcnMsIGJ1dCBrZWVwIHRoZSBzbGFzaCwgZXZlbiB3aGVuIGl0J3Mgbm90CisjIGNvcnJlY3QsIGJ1dCBxdW90ZWQgc2xhc2hlcyBsb29rIHRvbyBob3JyaWJsZSBpbiBib29rbWFya3MKK3N1YiBlc2NfcGFyYW0geworCW15ICRzdHIgPSBzaGlmdDsKKwkkc3RyID1+IHMvKFteQS1aYS16MC05XC1fLn4oKTtcLzs/OkAmPV0pL3NwcmludGYoIiUlJTAyWCIsIG9yZCgkMSkpL2VnOworCSRzdHIgPX4gcy9cKy8lMkIvZzsKKwkkc3RyID1+IHMvIC9cKy9nOworCXJldHVybiAkc3RyOworfQorCisjIHJlcGxhY2UgaW52YWxpZCB1dGY4IGNoYXJhY3RlciB3aXRoIFNVQlNUSVRVVElPTiBzZXF1ZW5jZQorc3ViIGVzY19odG1sIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJJHN0ciA9IGRlY29kZSgidXRmOCIsICRzdHIsIEVuY29kZTo6RkJfREVGQVVMVCk7CisJJHN0ciA9IGVzY2FwZUhUTUwoJHN0cik7CisJcmV0dXJuICRzdHI7Cit9CisKKyMgZ2l0IG1heSByZXR1cm4gcXVvdGVkIGFuZCBlc2NhcGVkIGZpbGVuYW1lcworc3ViIHVucXVvdGUgeworCW15ICRzdHIgPSBzaGlmdDsKKwlpZiAoJHN0ciA9fiBtL14iKC4qKSIkLykgeworCQkkc3RyID0gJDE7CisJCSRzdHIgPX4gcy9cXChbMC03XXsxLDN9KS9jaHIob2N0KCQxKSkvZWc7CisJfQorCXJldHVybiAkc3RyOworfQorCisjIENTUyBjbGFzcyBmb3IgZ2l2ZW4gYWdlIHZhbHVlIChpbiBzZWNvbmRzKQorc3ViIGFnZV9jbGFzcyB7CisJbXkgJGFnZSA9IHNoaWZ0OworCisJaWYgKCRhZ2UgPCA2MCo2MCoyKSB7CisJCXJldHVybiAiYWdlMCI7CisJfSBlbHNpZiAoJGFnZSA8IDYwKjYwKjI0KjIpIHsKKwkJcmV0dXJuICJhZ2UxIjsKKwl9IGVsc2UgeworCQlyZXR1cm4gImFnZTIiOworCX0KK30KKworc3ViIGdpdF9oZWFkZXJfaHRtbCB7CisJbXkgJHN0YXR1cyA9IHNoaWZ0IHx8ICIyMDAgT0siOworCW15ICRleHBpcmVzID0gc2hpZnQ7CisKKwlteSAkdGl0bGUgPSAiJHNpdGVfbmFtZSBnaXQiOworCWlmIChkZWZpbmVkICRwcm9qZWN0KSB7CisJCSR0aXRsZSAuPSAiIC0gJHByb2plY3QiOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQkkdGl0bGUgLj0gIi8kYWN0aW9uIjsKKwkJCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJCQkkdGl0bGUgLj0gIiAtICRmaWxlX25hbWUiOworCQkJCWlmICgkYWN0aW9uIGVxICJ0cmVlIiAmJiAkZmlsZV9uYW1lICF+IG18LyR8KSB7CisJCQkJCSR0aXRsZSAuPSAiLyI7CisJCQkJfQorCQkJfQorCQl9CisJfQorCW15ICRjb250ZW50X3R5cGU7CisJIyByZXF1aXJlIGV4cGxpY2l0IHN1cHBvcnQgZnJvbSB0aGUgVUEgaWYgd2UgYXJlIHRvIHNlbmQgdGhlIHBhZ2UgYXMKKwkjICdhcHBsaWNhdGlvbi94aHRtbCt4bWwnLCBvdGhlcndpc2Ugc2VuZCBpdCBhcyBwbGFpbiBvbGQgJ3RleHQvaHRtbCcuCisJIyB3ZSBoYXZlIHRvIGRvIHRoaXMgYmVjYXVzZSBNU0lFIHNvbWV0aW1lcyBnbG9icyAnKi8qJywgcHJldGVuZGluZyB0bworCSMgc3VwcG9ydCB4aHRtbCt4bWwgYnV0IGNob2tpbmcgd2hlbiBpdCBnZXRzIHdoYXQgaXQgYXNrZWQgZm9yLgorCWlmICgkY2dpLT5odHRwKCdIVFRQX0FDQ0VQVCcpID1+IG0vKCx8O3xcc3xeKWFwcGxpY2F0aW9uXC94aHRtbFwreG1sKCx8O3xcc3wkKS8gJiYgJGNnaS0+QWNjZXB0KCdhcHBsaWNhdGlvbi94aHRtbCt4bWwnKSAhPSAwKSB7CisJCSRjb250ZW50X3R5cGUgPSAnYXBwbGljYXRpb24veGh0bWwreG1sJzsKKwl9IGVsc2UgeworCQkkY29udGVudF90eXBlID0gJ3RleHQvaHRtbCc7CisJfQorCXByaW50ICRjZ2ktPmhlYWRlcigtdHlwZT0+JGNvbnRlbnRfdHlwZSwgIC1jaGFyc2V0ID0+ICd1dGYtOCcsIC1zdGF0dXM9PiAkc3RhdHVzLCAtZXhwaXJlcyA9PiAkZXhwaXJlcyk7CisJcHJpbnQgPDxFT0Y7Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbi1VUyIgbGFuZz0iZW4tVVMiPgorPCEtLSBnaXQgd2ViIGludGVyZmFjZSB2JHZlcnNpb24sIChDKSAyMDA1LTIwMDYsIEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc1xAdnJmeS5vcmc+LCBDaHJpc3RpYW4gR2llcmtlIC0tPgorPCEtLSBnaXQgY29yZSBiaW5hcmllcyB2ZXJzaW9uICRnaXRfdmVyc2lvbiAtLT4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSIkY29udGVudF90eXBlOyBjaGFyc2V0PXV0Zi04Ii8+Cis8bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9ImluZGV4LCBub2ZvbGxvdyIvPgorPHRpdGxlPiR0aXRsZTwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIkc3R5bGVzaGVldCIvPgorJHJzc19saW5rCis8L2hlYWQ+Cis8Ym9keT4KK0VPRgorCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9oZWFkZXJcIj5cbiIgLgorCSAgICAgICI8YSBocmVmPVwiaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvXCIgdGl0bGU9XCJnaXQgZG9jdW1lbnRhdGlvblwiPiIgLgorCSAgICAgICI8aW1nIHNyYz1cIiRteV91cmk/IiAuIGVzY19wYXJhbSgiYT1naXQtbG9nby5wbmciKSAuICJcIiB3aWR0aD1cIjcyXCIgaGVpZ2h0PVwiMjdcIiBhbHQ9XCJnaXRcIiBzdHlsZT1cImZsb2F0OnJpZ2h0OyBib3JkZXItd2lkdGg6MHB4O1wiLz4iIC4KKwkgICAgICAiPC9hPlxuIjsKKwlwcmludCAkY2dpLT5hKHstaHJlZiA9PiBlc2NfcGFyYW0oJGhvbWVfbGluayl9LCAicHJvamVjdHMiKSAuICIgLyAiOworCWlmIChkZWZpbmVkICRwcm9qZWN0KSB7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCBlc2NfaHRtbCgkcHJvamVjdCkpOworCQlpZiAoZGVmaW5lZCAkYWN0aW9uKSB7CisJCQlwcmludCAiIC8gJGFjdGlvbiI7CisJCX0KKwkJcHJpbnQgIlxuIjsKKwkJaWYgKCFkZWZpbmVkICRzZWFyY2h0ZXh0KSB7CisJCQkkc2VhcmNodGV4dCA9ICIiOworCQl9CisJCW15ICRzZWFyY2hfaGFzaDsKKwkJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSkgeworCQkJJHNlYXJjaF9oYXNoID0gJGhhc2hfYmFzZTsKKwkJfSBlbHNpZiAoZGVmaW5lZCAkaGFzaCkgeworCQkJJHNlYXJjaF9oYXNoID0gJGhhc2g7CisJCX0gZWxzZSB7CisJCQkkc2VhcmNoX2hhc2ggPSAiSEVBRCI7CisJCX0KKwkJJGNnaS0+cGFyYW0oImEiLCAic2VhcmNoIik7CisJCSRjZ2ktPnBhcmFtKCJoIiwgJHNlYXJjaF9oYXNoKTsKKwkJcHJpbnQgJGNnaS0+c3RhcnRmb3JtKC1tZXRob2QgPT4gImdldCIsIC1hY3Rpb24gPT4gJG15X3VyaSkgLgorCQkgICAgICAiPGRpdiBjbGFzcz1cInNlYXJjaFwiPlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAicCIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAiYSIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPmhpZGRlbigtbmFtZSA9PiAiaCIpIC4gIlxuIiAuCisJCSAgICAgICRjZ2ktPnRleHRmaWVsZCgtbmFtZSA9PiAicyIsIC12YWx1ZSA9PiAkc2VhcmNodGV4dCkgLiAiXG4iIC4KKwkJICAgICAgIjwvZGl2PiIgLgorCQkgICAgICAkY2dpLT5lbmRfZm9ybSgpIC4gIlxuIjsKKwl9CisJcHJpbnQgIjwvZGl2PlxuIjsKK30KKworc3ViIGdpdF9mb290ZXJfaHRtbCB7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2Zvb3RlclwiPlxuIjsKKwlpZiAoZGVmaW5lZCAkcHJvamVjdCkgeworCQlteSAkZGVzY3IgPSBnaXRfcmVhZF9kZXNjcmlwdGlvbigkcHJvamVjdCk7CisJCWlmIChkZWZpbmVkICRkZXNjcikgeworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2Zvb3Rlcl90ZXh0XCI+IiAuIGVzY19odG1sKCRkZXNjcikgLiAiPC9kaXY+XG4iOworCQl9CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1yc3MiKSwgLWNsYXNzID0+ICJyc3NfbG9nbyJ9LCAiUlNTIikgLiAiXG4iOworCX0gZWxzZSB7CisJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oImE9b3BtbCIpLCAtY2xhc3MgPT4gInJzc19sb2dvIn0sICJPUE1MIikgLiAiXG4iOworCX0KKwlwcmludCAiPC9kaXY+XG4iIC4KKwkgICAgICAiPC9ib2R5PlxuIiAuCisJICAgICAgIjwvaHRtbD4iOworfQorCitzdWIgZGllX2Vycm9yIHsKKwlteSAkc3RhdHVzID0gc2hpZnQgfHwgIjQwMyBGb3JiaWRkZW4iOworCW15ICRlcnJvciA9IHNoaWZ0IHx8ICJNYWxmb3JtZWQgcXVlcnksIGZpbGUgbWlzc2luZyBvciBwZXJtaXNzaW9uIGRlbmllZCI7CisKKwlnaXRfaGVhZGVyX2h0bWwoJHN0YXR1cyk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiIgLgorCSAgICAgICI8YnIvPjxici8+XG4iIC4KKwkgICAgICAiJHN0YXR1cyAtICRlcnJvclxuIiAuCisJICAgICAgIjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworCWV4aXQ7Cit9CisKK3N1YiBnaXRfZ2V0X3R5cGUgeworCW15ICRoYXNoID0gc2hpZnQ7CisKKwlvcGVuIG15ICRmZCwgIi18IiwgIiRHSVQgY2F0LWZpbGUgLXQgJGhhc2giIG9yIHJldHVybjsKKwlteSAkdHlwZSA9IDwkZmQ+OworCWNsb3NlICRmZCBvciByZXR1cm47CisJY2hvbXAgJHR5cGU7CisJcmV0dXJuICR0eXBlOworfQorCitzdWIgZ2l0X3JlYWRfaGVhZCB7CisJbXkgJHByb2plY3QgPSBzaGlmdDsKKwlteSAkb0VOViA9ICRFTlZ7J0dJVF9ESVInfTsKKwlteSAkcmV0dmFsID0gdW5kZWY7CisJJEVOVnsnR0lUX0RJUid9ID0gIiRwcm9qZWN0cm9vdC8kcHJvamVjdCI7CisJaWYgKG9wZW4gbXkgJGZkLCAiLXwiLCAkR0lULCAicmV2LXBhcnNlIiwgIi0tdmVyaWZ5IiwgIkhFQUQiKSB7CisJCW15ICRoZWFkID0gPCRmZD47CisJCWNsb3NlICRmZDsKKwkJaWYgKGRlZmluZWQgJGhlYWQgJiYgJGhlYWQgPX4gL14oWzAtOWEtZkEtRl17NDB9KSQvKSB7CisJCQkkcmV0dmFsID0gJDE7CisJCX0KKwl9CisJaWYgKGRlZmluZWQgJG9FTlYpIHsKKwkJJEVOVnsnR0lUX0RJUid9ID0gJG9FTlY7CisJfQorCXJldHVybiAkcmV0dmFsOworfQorCitzdWIgZ2l0X3JlYWRfaGFzaCB7CisJbXkgJHBhdGggPSBzaGlmdDsKKworCW9wZW4gbXkgJGZkLCAiJHByb2plY3Ryb290LyRwYXRoIiBvciByZXR1cm4gdW5kZWY7CisJbXkgJGhlYWQgPSA8JGZkPjsKKwljbG9zZSAkZmQ7CisJY2hvbXAgJGhlYWQ7CisJaWYgKCRoZWFkID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCXJldHVybiAkaGVhZDsKKwl9Cit9CisKK3N1YiBnaXRfcmVhZF9kZXNjcmlwdGlvbiB7CisJbXkgJHBhdGggPSBzaGlmdDsKKworCW9wZW4gbXkgJGZkLCAiJHByb2plY3Ryb290LyRwYXRoL2Rlc2NyaXB0aW9uIiBvciByZXR1cm4gdW5kZWY7CisJbXkgJGRlc2NyID0gPCRmZD47CisJY2xvc2UgJGZkOworCWNob21wICRkZXNjcjsKKwlyZXR1cm4gJGRlc2NyOworfQorCitzdWIgZ2l0X3JlYWRfdGFnIHsKKwlteSAkdGFnX2lkID0gc2hpZnQ7CisJbXkgJXRhZzsKKwlteSBAY29tbWVudDsKKworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCBjYXQtZmlsZSB0YWcgJHRhZ19pZCIgb3IgcmV0dXJuOworCSR0YWd7J2lkJ30gPSAkdGFnX2lkOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWNob21wICRsaW5lOworCQlpZiAoJGxpbmUgPX4gbS9eb2JqZWN0IChbMC05YS1mQS1GXXs0MH0pJC8pIHsKKwkJCSR0YWd7J29iamVjdCd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXnR5cGUgKC4rKSQvKSB7CisJCQkkdGFneyd0eXBlJ30gPSAkMTsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS9edGFnICguKykkLykgeworCQkJJHRhZ3snbmFtZSd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXnRhZ2dlciAoLiopIChbMC05XSspICguKikkLykgeworCQkJJHRhZ3snYXV0aG9yJ30gPSAkMTsKKwkJCSR0YWd7J2Vwb2NoJ30gPSAkMjsKKwkJCSR0YWd7J3R6J30gPSAkMzsKKwkJfSBlbHNpZiAoJGxpbmUgPX4gbS8tLUJFR0lOLykgeworCQkJcHVzaCBAY29tbWVudCwgJGxpbmU7CisJCQlsYXN0OworCQl9IGVsc2lmICgkbGluZSBlcSAiIikgeworCQkJbGFzdDsKKwkJfQorCX0KKwlwdXNoIEBjb21tZW50LCA8JGZkPjsKKwkkdGFneydjb21tZW50J30gPSBcQGNvbW1lbnQ7CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwlpZiAoIWRlZmluZWQgJHRhZ3snbmFtZSd9KSB7CisJCXJldHVybgorCX07CisJcmV0dXJuICV0YWcKK30KKworc3ViIGFnZV9zdHJpbmcgeworCW15ICRhZ2UgPSBzaGlmdDsKKwlteSAkYWdlX3N0cjsKKworCWlmICgkYWdlID4gNjAqNjAqMjQqMzY1KjIpIHsKKwkJJGFnZV9zdHIgPSAoaW50ICRhZ2UvNjAvNjAvMjQvMzY1KTsKKwkJJGFnZV9zdHIgLj0gIiB5ZWFycyBhZ28iOworCX0gZWxzaWYgKCRhZ2UgPiA2MCo2MCoyNCooMzY1LzEyKSoyKSB7CisJCSRhZ2Vfc3RyID0gaW50ICRhZ2UvNjAvNjAvMjQvKDM2NS8xMik7CisJCSRhZ2Vfc3RyIC49ICIgbW9udGhzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjYwKjI0KjcqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwLzI0Lzc7CisJCSRhZ2Vfc3RyIC49ICIgd2Vla3MgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqNjAqMjQqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwLzI0OworCQkkYWdlX3N0ciAuPSAiIGRheXMgYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gNjAqNjAqMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlLzYwLzYwOworCQkkYWdlX3N0ciAuPSAiIGhvdXJzIGFnbyI7CisJfSBlbHNpZiAoJGFnZSA+IDYwKjIpIHsKKwkJJGFnZV9zdHIgPSBpbnQgJGFnZS82MDsKKwkJJGFnZV9zdHIgLj0gIiBtaW4gYWdvIjsKKwl9IGVsc2lmICgkYWdlID4gMikgeworCQkkYWdlX3N0ciA9IGludCAkYWdlOworCQkkYWdlX3N0ciAuPSAiIHNlYyBhZ28iOworCX0gZWxzZSB7CisJCSRhZ2Vfc3RyIC49ICIgcmlnaHQgbm93IjsKKwl9CisJcmV0dXJuICRhZ2Vfc3RyOworfQorCitzdWIgZ2l0X3JlYWRfY29tbWl0IHsKKwlteSAkY29tbWl0X2lkID0gc2hpZnQ7CisJbXkgJGNvbW1pdF90ZXh0ID0gc2hpZnQ7CisKKwlteSBAY29tbWl0X2xpbmVzOworCW15ICVjbzsKKworCWlmIChkZWZpbmVkICRjb21taXRfdGV4dCkgeworCQlAY29tbWl0X2xpbmVzID0gQCRjb21taXRfdGV4dDsKKwl9IGVsc2UgeworCQkkLyA9ICJcMCI7CisJCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCByZXYtbGlzdCAtLWhlYWRlciAtLXBhcmVudHMgLS1tYXgtY291bnQ9MSAkY29tbWl0X2lkIiBvciByZXR1cm47CisJCUBjb21taXRfbGluZXMgPSBzcGxpdCAnXG4nLCA8JGZkPjsKKwkJY2xvc2UgJGZkIG9yIHJldHVybjsKKwkJJC8gPSAiXG4iOworCQlwb3AgQGNvbW1pdF9saW5lczsKKwl9CisJbXkgJGhlYWRlciA9IHNoaWZ0IEBjb21taXRfbGluZXM7CisJaWYgKCEoJGhlYWRlciA9fiBtL15bMC05YS1mQS1GXXs0MH0vKSkgeworCQlyZXR1cm47CisJfQorCSgkY297J2lkJ30sIG15IEBwYXJlbnRzKSA9IHNwbGl0ICcgJywgJGhlYWRlcjsKKwkkY297J3BhcmVudHMnfSA9IFxAcGFyZW50czsKKwkkY297J3BhcmVudCd9ID0gJHBhcmVudHNbMF07CisJd2hpbGUgKG15ICRsaW5lID0gc2hpZnQgQGNvbW1pdF9saW5lcykgeworCQlsYXN0IGlmICRsaW5lIGVxICJcbiI7CisJCWlmICgkbGluZSA9fiBtL150cmVlIChbMC05YS1mQS1GXXs0MH0pJC8pIHsKKwkJCSRjb3sndHJlZSd9ID0gJDE7CisJCX0gZWxzaWYgKCRsaW5lID1+IG0vXmF1dGhvciAoLiopIChbMC05XSspICguKikkLykgeworCQkJJGNveydhdXRob3InfSA9ICQxOworCQkJJGNveydhdXRob3JfZXBvY2gnfSA9ICQyOworCQkJJGNveydhdXRob3JfdHonfSA9ICQzOworCQkJaWYgKCRjb3snYXV0aG9yJ30gPX4gbS9eKFtePF0rKSA8LykgeworCQkJCSRjb3snYXV0aG9yX25hbWUnfSA9ICQxOworCQkJfSBlbHNlIHsKKwkJCQkkY297J2F1dGhvcl9uYW1lJ30gPSAkY297J2F1dGhvcid9OworCQkJfQorCQl9IGVsc2lmICgkbGluZSA9fiBtL15jb21taXR0ZXIgKC4qKSAoWzAtOV0rKSAoLiopJC8pIHsKKwkJCSRjb3snY29tbWl0dGVyJ30gPSAkMTsKKwkJCSRjb3snY29tbWl0dGVyX2Vwb2NoJ30gPSAkMjsKKwkJCSRjb3snY29tbWl0dGVyX3R6J30gPSAkMzsKKwkJCSRjb3snY29tbWl0dGVyX25hbWUnfSA9ICRjb3snY29tbWl0dGVyJ307CisJCQkkY297J2NvbW1pdHRlcl9uYW1lJ30gPX4gcy8gPC4qLy87CisJCX0KKwl9CisJaWYgKCFkZWZpbmVkICRjb3sndHJlZSd9KSB7CisJCXJldHVybjsKKwl9OworCisJZm9yZWFjaCBteSAkdGl0bGUgKEBjb21taXRfbGluZXMpIHsKKwkJJHRpdGxlID1+IHMvXiAgICAvLzsKKwkJaWYgKCR0aXRsZSBuZSAiIikgeworCQkJJGNveyd0aXRsZSd9ID0gY2hvcF9zdHIoJHRpdGxlLCA4MCwgNSk7CisJCQkjIHJlbW92ZSBsZWFkaW5nIHN0dWZmIG9mIG1lcmdlcyB0byBtYWtlIHRoZSBpbnRlcmVzdGluZyBwYXJ0IHZpc2libGUKKwkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJJHRpdGxlID1+IHMvXkF1dG9tYXRpYyAvLzsKKwkJCQkkdGl0bGUgPX4gcy9ebWVyZ2UgKG9mfHdpdGgpIC9NZXJnZSAuLi4gL2k7CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMvKGh0dHB8cnN5bmMpOlwvXC8vLzsKKwkJCQl9CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMvKG1hc3Rlcnx3d3d8cnN5bmMpXC4vLzsKKwkJCQl9CisJCQkJaWYgKGxlbmd0aCgkdGl0bGUpID4gNTApIHsKKwkJCQkJJHRpdGxlID1+IHMva2VybmVsLm9yZzo/Ly87CisJCQkJfQorCQkJCWlmIChsZW5ndGgoJHRpdGxlKSA+IDUwKSB7CisJCQkJCSR0aXRsZSA9fiBzL1wvcHViXC9zY20vLzsKKwkJCQl9CisJCQl9CisJCQkkY297J3RpdGxlX3Nob3J0J30gPSBjaG9wX3N0cigkdGl0bGUsIDUwLCA1KTsKKwkJCWxhc3Q7CisJCX0KKwl9CisJIyByZW1vdmUgYWRkZWQgc3BhY2VzCisJZm9yZWFjaCBteSAkbGluZSAoQGNvbW1pdF9saW5lcykgeworCQkkbGluZSA9fiBzL14gICAgLy87CisJfQorCSRjb3snY29tbWVudCd9ID0gXEBjb21taXRfbGluZXM7CisKKwlteSAkYWdlID0gdGltZSAtICRjb3snY29tbWl0dGVyX2Vwb2NoJ307CisJJGNveydhZ2UnfSA9ICRhZ2U7CisJJGNveydhZ2Vfc3RyaW5nJ30gPSBhZ2Vfc3RyaW5nKCRhZ2UpOworCW15ICgkc2VjLCAkbWluLCAkaG91ciwgJG1kYXksICRtb24sICR5ZWFyLCAkd2RheSwgJHlkYXkpID0gZ210aW1lKCRjb3snY29tbWl0dGVyX2Vwb2NoJ30pOworCWlmICgkYWdlID4gNjAqNjAqMjQqNyoyKSB7CisJCSRjb3snYWdlX3N0cmluZ19kYXRlJ30gPSBzcHJpbnRmICIlNGktJTAydS0lMDJpIiwgMTkwMCArICR5ZWFyLCAkbW9uKzEsICRtZGF5OworCQkkY297J2FnZV9zdHJpbmdfYWdlJ30gPSAkY297J2FnZV9zdHJpbmcnfTsKKwl9IGVsc2UgeworCQkkY297J2FnZV9zdHJpbmdfZGF0ZSd9ID0gJGNveydhZ2Vfc3RyaW5nJ307CisJCSRjb3snYWdlX3N0cmluZ19hZ2UnfSA9IHNwcmludGYgIiU0aS0lMDJ1LSUwMmkiLCAxOTAwICsgJHllYXIsICRtb24rMSwgJG1kYXk7CisJfQorCXJldHVybiAlY287Cit9CisKK3N1YiBnaXRfZGlmZl9wcmludCB7CisJbXkgJGZyb20gPSBzaGlmdDsKKwlteSAkZnJvbV9uYW1lID0gc2hpZnQ7CisJbXkgJHRvID0gc2hpZnQ7CisJbXkgJHRvX25hbWUgPSBzaGlmdDsKKwlteSAkZm9ybWF0ID0gc2hpZnQgfHwgImh0bWwiOworCisJbXkgJGZyb21fdG1wID0gIi9kZXYvbnVsbCI7CisJbXkgJHRvX3RtcCA9ICIvZGV2L251bGwiOworCW15ICRwaWQgPSAkJDsKKworCSMgY3JlYXRlIHRtcCBmcm9tLWZpbGUKKwlpZiAoZGVmaW5lZCAkZnJvbSkgeworCQkkZnJvbV90bXAgPSAiJGdpdF90ZW1wL2dpdHdlYl8iIC4gJCQgLiAiX2Zyb20iOworCQlvcGVuIG15ICRmZDIsICI+ICRmcm9tX3RtcCI7CisJCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCBjYXQtZmlsZSBibG9iICRmcm9tIjsKKwkJbXkgQGZpbGUgPSA8JGZkPjsKKwkJcHJpbnQgJGZkMiBAZmlsZTsKKwkJY2xvc2UgJGZkMjsKKwkJY2xvc2UgJGZkOworCX0KKworCSMgY3JlYXRlIHRtcCB0by1maWxlCisJaWYgKGRlZmluZWQgJHRvKSB7CisJCSR0b190bXAgPSAiJGdpdF90ZW1wL2dpdHdlYl8iIC4gJCQgLiAiX3RvIjsKKwkJb3BlbiBteSAkZmQyLCAiPiAkdG9fdG1wIjsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkR0lUIGNhdC1maWxlIGJsb2IgJHRvIjsKKwkJbXkgQGZpbGUgPSA8JGZkPjsKKwkJcHJpbnQgJGZkMiBAZmlsZTsKKwkJY2xvc2UgJGZkMjsKKwkJY2xvc2UgJGZkOworCX0KKworCW9wZW4gbXkgJGZkLCAiLXwiLCAiL3Vzci9iaW4vZGlmZiAtdSAtcCAtTCBcJyRmcm9tX25hbWVcJyAtTCBcJyR0b19uYW1lXCcgJGZyb21fdG1wICR0b190bXAiOworCWlmICgkZm9ybWF0IGVxICJwbGFpbiIpIHsKKwkJdW5kZWYgJC87CisJCXByaW50IDwkZmQ+OworCQkkLyA9ICJcbiI7CisJfSBlbHNlIHsKKwkJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJCWNob21wKCRsaW5lKTsKKwkJCW15ICRjaGFyID0gc3Vic3RyKCRsaW5lLCAwLCAxKTsKKwkJCW15ICRkaWZmX2NsYXNzID0gIiI7CisJCQlpZiAoJGNoYXIgZXEgJysnKSB7CisJCQkJJGRpZmZfY2xhc3MgPSAiIGFkZCI7CisJCQl9IGVsc2lmICgkY2hhciBlcSAiLSIpIHsKKwkJCQkkZGlmZl9jbGFzcyA9ICIgcmVtIjsKKwkJCX0gZWxzaWYgKCRjaGFyIGVxICJAIikgeworCQkJCSRkaWZmX2NsYXNzID0gIiBjaHVua19oZWFkZXIiOworCQkJfSBlbHNpZiAoJGNoYXIgZXEgIlxcIikgeworCQkJCSMgc2tpcCBlcnJvcnMKKwkJCQluZXh0OworCQkJfQorCQkJd2hpbGUgKChteSAkcG9zID0gaW5kZXgoJGxpbmUsICJcdCIpKSAhPSAtMSkgeworCQkJCWlmIChteSAkY291bnQgPSAoOCAtICgoJHBvcy0xKSAlIDgpKSkgeworCQkJCQlteSAkc3BhY2VzID0gJyAnIHggJGNvdW50OworCQkJCQkkbGluZSA9fiBzL1x0LyRzcGFjZXMvOworCQkJCX0KKwkJCX0KKwkJCXByaW50ICI8ZGl2IGNsYXNzPVwiZGlmZiRkaWZmX2NsYXNzXCI+IiAuIGVzY19odG1sKCRsaW5lKSAuICI8L2Rpdj5cbiI7CisJCX0KKwl9CisJY2xvc2UgJGZkOworCisJaWYgKGRlZmluZWQgJGZyb20pIHsKKwkJdW5saW5rKCRmcm9tX3RtcCk7CisJfQorCWlmIChkZWZpbmVkICR0bykgeworCQl1bmxpbmsoJHRvX3RtcCk7CisJfQorfQorCitzdWIgbW9kZV9zdHIgeworCW15ICRtb2RlID0gb2N0IHNoaWZ0OworCisJaWYgKFNfSVNESVIoJG1vZGUgJiBTX0lGTVQpKSB7CisJCXJldHVybiAnZHJ3eHIteHIteCc7CisJfSBlbHNpZiAoU19JU0xOSygkbW9kZSkpIHsKKwkJcmV0dXJuICdscnd4cnd4cnd4JzsKKwl9IGVsc2lmIChTX0lTUkVHKCRtb2RlKSkgeworCQkjIGdpdCBjYXJlcyBvbmx5IGFib3V0IHRoZSBleGVjdXRhYmxlIGJpdAorCQlpZiAoJG1vZGUgJiBTX0lYVVNSKSB7CisJCQlyZXR1cm4gJy1yd3hyLXhyLXgnOworCQl9IGVsc2UgeworCQkJcmV0dXJuICctcnctci0tci0tJzsKKwkJfTsKKwl9IGVsc2UgeworCQlyZXR1cm4gJy0tLS0tLS0tLS0nOworCX0KK30KKworc3ViIGNob3Bfc3RyIHsKKwlteSAkc3RyID0gc2hpZnQ7CisJbXkgJGxlbiA9IHNoaWZ0OworCW15ICRhZGRfbGVuID0gc2hpZnQgfHwgMTA7CisKKwkjIGFsbG93IG9ubHkgJGxlbiBjaGFycywgYnV0IGRvbid0IGN1dCBhIHdvcmQgaWYgaXQgd291bGQgZml0IGluICRhZGRfbGVuCisJIyBpZiBpdCBkb2Vzbid0IGZpdCwgY3V0IGl0IGlmIGl0J3Mgc3RpbGwgbG9uZ2VyIHRoYW4gdGhlIGRvdHMgd2Ugd291bGQgYWRkCisJJHN0ciA9fiBtL14oLnswLCRsZW59W14gXC9cLV86XC5AXXswLCRhZGRfbGVufSkoLiopLzsKKwlteSAkYm9keSA9ICQxOworCW15ICR0YWlsID0gJDI7CisJaWYgKGxlbmd0aCgkdGFpbCkgPiA0KSB7CisJCSR0YWlsID0gIiAuLi4iOworCX0KKwlyZXR1cm4gIiRib2R5JHRhaWwiOworfQorCitzdWIgZmlsZV90eXBlIHsKKwlteSAkbW9kZSA9IG9jdCBzaGlmdDsKKworCWlmIChTX0lTRElSKCRtb2RlICYgU19JRk1UKSkgeworCQlyZXR1cm4gImRpcmVjdG9yeSI7CisJfSBlbHNpZiAoU19JU0xOSygkbW9kZSkpIHsKKwkJcmV0dXJuICJzeW1saW5rIjsKKwl9IGVsc2lmIChTX0lTUkVHKCRtb2RlKSkgeworCQlyZXR1cm4gImZpbGUiOworCX0gZWxzZSB7CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCitzdWIgZm9ybWF0X2xvZ19saW5lX2h0bWwgeworCW15ICRsaW5lID0gc2hpZnQ7CisKKwkkbGluZSA9IGVzY19odG1sKCRsaW5lKTsKKwkkbGluZSA9fiBzLyAvJm5ic3A7L2c7CisJaWYgKCRsaW5lID1+IG0vKFswLTlhLWZBLUZdezQwfSkvKSB7CisJCW15ICRoYXNoX3RleHQgPSAkMTsKKwkJaWYgKGdpdF9nZXRfdHlwZSgkaGFzaF90ZXh0KSBlcSAiY29tbWl0IikgeworCQkJbXkgJGxpbmsgPSAkY2dpLT5hKHstY2xhc3MgPT4gInRleHQiLCAtaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2hfdGV4dCIpfSwgJGhhc2hfdGV4dCk7CisJCQkkbGluZSA9fiBzLyRoYXNoX3RleHQvJGxpbmsvOworCQl9CisJfQorCXJldHVybiAkbGluZTsKK30KKworc3ViIGRhdGVfc3RyIHsKKwlteSAkZXBvY2ggPSBzaGlmdDsKKwlteSAkdHogPSBzaGlmdCB8fCAiLTAwMDAiOworCisJbXkgJWRhdGU7CisJbXkgQG1vbnRocyA9ICgiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKTsKKwlteSBAZGF5cyA9ICgiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Iik7CisJbXkgKCRzZWMsICRtaW4sICRob3VyLCAkbWRheSwgJG1vbiwgJHllYXIsICR3ZGF5LCAkeWRheSkgPSBnbXRpbWUoJGVwb2NoKTsKKwkkZGF0ZXsnaG91cid9ID0gJGhvdXI7CisJJGRhdGV7J21pbnV0ZSd9ID0gJG1pbjsKKwkkZGF0ZXsnbWRheSd9ID0gJG1kYXk7CisJJGRhdGV7J2RheSd9ID0gJGRheXNbJHdkYXldOworCSRkYXRleydtb250aCd9ID0gJG1vbnRoc1skbW9uXTsKKwkkZGF0ZXsncmZjMjgyMid9ID0gc3ByaW50ZiAiJXMsICVkICVzICU0ZCAlMDJkOiUwMmQ6JTAyZCArMDAwMCIsICRkYXlzWyR3ZGF5XSwgJG1kYXksICRtb250aHNbJG1vbl0sIDE5MDArJHllYXIsICRob3VyICwkbWluLCAkc2VjOworCSRkYXRleydtZGF5LXRpbWUnfSA9IHNwcmludGYgIiVkICVzICUwMmQ6JTAyZCIsICRtZGF5LCAkbW9udGhzWyRtb25dLCAkaG91ciAsJG1pbjsKKworCSR0eiA9fiBtL14oWytcLV1bMC05XVswLTldKShbMC05XVswLTldKSQvOworCW15ICRsb2NhbCA9ICRlcG9jaCArICgoaW50ICQxICsgKCQyLzYwKSkgKiAzNjAwKTsKKwkoJHNlYywgJG1pbiwgJGhvdXIsICRtZGF5LCAkbW9uLCAkeWVhciwgJHdkYXksICR5ZGF5KSA9IGdtdGltZSgkbG9jYWwpOworCSRkYXRleydob3VyX2xvY2FsJ30gPSAkaG91cjsKKwkkZGF0ZXsnbWludXRlX2xvY2FsJ30gPSAkbWluOworCSRkYXRleyd0el9sb2NhbCd9ID0gJHR6OworCXJldHVybiAlZGF0ZTsKK30KKworIyBnaXQtbG9nbyAoY2FjaGVkIGluIGJyb3dzZXIgZm9yIG9uZSBkYXkpCitzdWIgZ2l0X2xvZ28geworCWJpbm1vZGUgU1RET1VULCAnOnJhdyc7CisJcHJpbnQgJGNnaS0+aGVhZGVyKC10eXBlID0+ICdpbWFnZS9wbmcnLCAtZXhwaXJlcyA9PiAnKzFkJyk7CisJIyBjYXQgZ2l0LWxvZ28ucG5nIHwgaGV4ZHVtcCAtZSAnMTYvMSAiICUwMngiICAiXG4iJyB8IHNlZCAncy8gL1xceC9nJworCXByaW50CSJceDg5XHg1MFx4NGVceDQ3XHgwZFx4MGFceDFhXHgwYVx4MDBceDAwXHgwMFx4MGRceDQ5XHg0OFx4NDRceDUyIiAuCisJCSJceDAwXHgwMFx4MDBceDQ4XHgwMFx4MDBceDAwXHgxYlx4MDRceDAzXHgwMFx4MDBceDAwXHgyZFx4ZDlceGQ0IiAuCisJCSJceDJkXHgwMFx4MDBceDAwXHgxOFx4NTBceDRjXHg1NFx4NDVceGZmXHhmZlx4ZmZceDYwXHg2MFx4NWRceGIwIiAuCisJCSJceGFmXHhhYVx4MDBceDgwXHgwMFx4Y2VceGNkXHhjN1x4YzBceDAwXHgwMFx4ZThceGU4XHhlNlx4ZjdceGY3IiAuCisJCSJceGY2XHg5NVx4MGNceGE3XHg0N1x4MDBceDAwXHgwMFx4NzNceDQ5XHg0NFx4NDFceDU0XHgyOFx4Y2ZceDYzIiAuCisJCSJceDQ4XHg2N1x4MjBceDA0XHg0YVx4NWNceDE4XHgwYVx4MDhceDJhXHg2Mlx4NTNceDYxXHgyMFx4MDJceDA4IiAuCisJCSJceDBkXHg2OVx4NDVceGFjXHhhMVx4YTFceDAxXHgzMFx4MGNceDkzXHg2MFx4MzZceDI2XHg1Mlx4OTFceGIxIiAuCisJCSJceDAxXHgxMVx4ZDZceGUxXHg1NVx4NjRceDZjXHg2Y1x4Y2NceDZjXHg2Y1x4MGNceGEyXHgwY1x4NzBceDJhIiAuCisJCSJceDYyXHgwNlx4MmFceGMxXHg2Mlx4MWRceGIzXHgwMVx4MDJceDUzXHhhNFx4MDhceGU4XHgwMFx4MDNceDE4IiAuCisJCSJceDI2XHg1Nlx4MTFceGQ0XHhlMVx4MjBceDk3XHgxYlx4ZTBceGI0XHgwZVx4MzVceDI0XHg3MVx4MjlceDgyIiAuCisJCSJceDk5XHgzMFx4YjhceDkzXHgwYVx4MTFceGI5XHg0NVx4ODhceGMxXHg4ZFx4YTBceGEyXHg0NFx4MjFceDA2IiAuCisJCSJceDI3XHg0MVx4ODJceDQwXHg4NVx4YzFceDQ1XHg4OVx4MjBceDcwXHgwMVx4MDBceGE0XHgzZFx4MjFceGM1IiAuCisJCSJceDEyXHgxY1x4OWFceGZlXHgwMFx4MDBceDAwXHgwMFx4NDlceDQ1XHg0ZVx4NDRceGFlXHg0Mlx4NjBceDgyIjsKK30KKworc3ViIGdldF9maWxlX293bmVyIHsKKwlteSAkcGF0aCA9IHNoaWZ0OworCisJbXkgKCRkZXYsICRpbm8sICRtb2RlLCAkbmxpbmssICRzdF91aWQsICRzdF9naWQsICRyZGV2LCAkc2l6ZSkgPSBzdGF0KCRwYXRoKTsKKwlteSAoJG5hbWUsICRwYXNzd2QsICR1aWQsICRnaWQsICRxdW90YSwgJGNvbW1lbnQsICRnY29zLCAkZGlyLCAkc2hlbGwpID0gZ2V0cHd1aWQoJHN0X3VpZCk7CisJaWYgKCFkZWZpbmVkICRnY29zKSB7CisJCXJldHVybiB1bmRlZjsKKwl9CisJbXkgJG93bmVyID0gJGdjb3M7CisJJG93bmVyID1+IHMvWyw7XS4qJC8vOworCXJldHVybiBkZWNvZGUoInV0ZjgiLCAkb3duZXIsIEVuY29kZTo6RkJfREVGQVVMVCk7Cit9CisKK3N1YiBnaXRfcmVhZF9wcm9qZWN0cyB7CisJbXkgQGxpc3Q7CisKKwlpZiAoLWQgJHByb2plY3RzX2xpc3QpIHsKKwkJIyBzZWFyY2ggaW4gZGlyZWN0b3J5CisJCW15ICRkaXIgPSAkcHJvamVjdHNfbGlzdDsKKwkJb3BlbmRpciBteSAoJGRoKSwgJGRpciBvciByZXR1cm4gdW5kZWY7CisJCXdoaWxlIChteSAkZGlyID0gcmVhZGRpcigkZGgpKSB7CisJCQlpZiAoLWUgIiRwcm9qZWN0cm9vdC8kZGlyL0hFQUQiKSB7CisJCQkJbXkgJHByID0geworCQkJCQlwYXRoID0+ICRkaXIsCisJCQkJfTsKKwkJCQlwdXNoIEBsaXN0LCAkcHIKKwkJCX0KKwkJfQorCQljbG9zZWRpcigkZGgpOworCX0gZWxzaWYgKC1mICRwcm9qZWN0c19saXN0KSB7CisJCSMgcmVhZCBmcm9tIGZpbGUodXJsLWVuY29kZWQpOgorCQkjICdnaXQlMkZnaXQuZ2l0IExpbnVzK1RvcnZhbGRzJworCQkjICdsaWJzJTJGa2xpYmMlMkZrbGliYy5naXQgSC4rUGV0ZXIrQW52aW4nCisJCSMgJ2xpbnV4JTJGaG90cGx1ZyUyRnVkZXYuZ2l0IEdyZWcrS3JvYWgtSGFydG1hbicKKwkJb3BlbiBteSAoJGZkKSwgJHByb2plY3RzX2xpc3Qgb3IgcmV0dXJuIHVuZGVmOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQlteSAoJHBhdGgsICRvd25lcikgPSBzcGxpdCAnICcsICRsaW5lOworCQkJJHBhdGggPSB1bmVzY2FwZSgkcGF0aCk7CisJCQkkb3duZXIgPSB1bmVzY2FwZSgkb3duZXIpOworCQkJaWYgKCFkZWZpbmVkICRwYXRoKSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgtZSAiJHByb2plY3Ryb290LyRwYXRoL0hFQUQiKSB7CisJCQkJbXkgJHByID0geworCQkJCQlwYXRoID0+ICRwYXRoLAorCQkJCQlvd25lciA9PiBkZWNvZGUoInV0ZjgiLCAkb3duZXIsIEVuY29kZTo6RkJfREVGQVVMVCksCisJCQkJfTsKKwkJCQlwdXNoIEBsaXN0LCAkcHIKKwkJCX0KKwkJfQorCQljbG9zZSAkZmQ7CisJfQorCUBsaXN0ID0gc29ydCB7JGEtPnsncGF0aCd9IGNtcCAkYi0+eydwYXRoJ319IEBsaXN0OworCXJldHVybiBAbGlzdDsKK30KKworc3ViIGdpdF9nZXRfcHJvamVjdF9jb25maWcgeworCW15ICRrZXkgPSBzaGlmdDsKKworCXJldHVybiB1bmxlc3MgKCRrZXkpOworCSRrZXkgPX4gcy9eZ2l0d2ViXC4vLzsKKwlyZXR1cm4gaWYgKCRrZXkgPX4gbS9cVy8pOworCisJbXkgJHZhbCA9IHF4KCRHSVQgcmVwby1jb25maWcgLS1nZXQgZ2l0d2ViLiRrZXkpOworCXJldHVybiAoJHZhbCk7Cit9CisKK3N1YiBnaXRfZ2V0X3Byb2plY3RfY29uZmlnX2Jvb2wgeworCW15ICR2YWwgPSBnaXRfZ2V0X3Byb2plY3RfY29uZmlnIChAXyk7CisJaWYgKCR2YWwgYW5kICR2YWwgPX4gbS90cnVlfHllc3xvbi8pIHsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dXJuOyAjIGltcGxpY2l0IGZhbHNlCit9CisKK3N1YiBnaXRfcHJvamVjdF9saXN0IHsKKwlteSBAbGlzdCA9IGdpdF9yZWFkX3Byb2plY3RzKCk7CisJbXkgQHByb2plY3RzOworCWlmICghQGxpc3QpIHsKKwkJZGllX2Vycm9yKHVuZGVmLCAiTm8gcHJvamVjdCBmb3VuZC4iKTsKKwl9CisJZm9yZWFjaCBteSAkcHIgKEBsaXN0KSB7CisJCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHItPnsncGF0aCd9KTsKKwkJaWYgKCFkZWZpbmVkICRoZWFkKSB7CisJCQluZXh0OworCQl9CisJCSRFTlZ7J0dJVF9ESVInfSA9ICIkcHJvamVjdHJvb3QvJHByLT57J3BhdGgnfSI7CisJCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGVhZCk7CisJCWlmICghJWNvKSB7CisJCQluZXh0OworCQl9CisJCSRwci0+eydjb21taXQnfSA9IFwlY287CisJCWlmICghZGVmaW5lZCAkcHItPnsnZGVzY3InfSkgeworCQkJbXkgJGRlc2NyID0gZ2l0X3JlYWRfZGVzY3JpcHRpb24oJHByLT57J3BhdGgnfSkgfHwgIiI7CisJCQkkcHItPnsnZGVzY3InfSA9IGNob3Bfc3RyKCRkZXNjciwgMjUsIDUpOworCQl9CisJCWlmICghZGVmaW5lZCAkcHItPnsnb3duZXInfSkgeworCQkJJHByLT57J293bmVyJ30gPSBnZXRfZmlsZV9vd25lcigiJHByb2plY3Ryb290LyRwci0+eydwYXRoJ30iKSB8fCAiIjsKKwkJfQorCQlwdXNoIEBwcm9qZWN0cywgJHByOworCX0KKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlpZiAoLWYgJGhvbWVfdGV4dCkgeworCQlwcmludCAiPGRpdiBjbGFzcz1cImluZGV4X2luY2x1ZGVcIj5cbiI7CisJCW9wZW4gKG15ICRmZCwgJGhvbWVfdGV4dCk7CisJCXByaW50IDwkZmQ+OworCQljbG9zZSAkZmQ7CisJCXByaW50ICI8L2Rpdj5cbiI7CisJfQorCXByaW50ICI8dGFibGUgY2xhc3M9XCJwcm9qZWN0X2xpc3RcIj5cbiIgLgorCSAgICAgICI8dHI+XG4iOworCWlmICghZGVmaW5lZCgkb3JkZXIpIHx8IChkZWZpbmVkKCRvcmRlcikgJiYgKCRvcmRlciBlcSAicHJvamVjdCIpKSkgeworCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydwYXRoJ30gY21wICRiLT57J3BhdGgnfX0gQHByb2plY3RzOworCQlwcmludCAiPHRoPlByb2plY3Q8L3RoPlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAiPHRoPiIgLiAkY2dpLT5hKHstY2xhc3MgPT4gImhlYWRlciIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oIm89cHJvamVjdCIpfSwgIlByb2plY3QiKSAuICI8L3RoPlxuIjsKKwl9CisJaWYgKGRlZmluZWQoJG9yZGVyKSAmJiAoJG9yZGVyIGVxICJkZXNjciIpKSB7CisJCUBwcm9qZWN0cyA9IHNvcnQgeyRhLT57J2Rlc2NyJ30gY21wICRiLT57J2Rlc2NyJ319IEBwcm9qZWN0czsKKwkJcHJpbnQgIjx0aD5EZXNjcmlwdGlvbjwvdGg+XG4iOworCX0gZWxzZSB7CisJCXByaW50ICI8dGg+IiAuICRjZ2ktPmEoey1jbGFzcyA9PiAiaGVhZGVyIiwgLWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgibz1kZXNjciIpfSwgIkRlc2NyaXB0aW9uIikgLiAiPC90aD5cbiI7CisJfQorCWlmIChkZWZpbmVkKCRvcmRlcikgJiYgKCRvcmRlciBlcSAib3duZXIiKSkgeworCQlAcHJvamVjdHMgPSBzb3J0IHskYS0+eydvd25lcid9IGNtcCAkYi0+eydvd25lcid9fSBAcHJvamVjdHM7CisJCXByaW50ICI8dGg+T3duZXI8L3RoPlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAiPHRoPiIgLiAkY2dpLT5hKHstY2xhc3MgPT4gImhlYWRlciIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oIm89b3duZXIiKX0sICJPd25lciIpIC4gIjwvdGg+XG4iOworCX0KKwlpZiAoZGVmaW5lZCgkb3JkZXIpICYmICgkb3JkZXIgZXEgImFnZSIpKSB7CisJCUBwcm9qZWN0cyA9IHNvcnQgeyRhLT57J2NvbW1pdCd9eydhZ2UnfSA8PT4gJGItPnsnY29tbWl0J317J2FnZSd9fSBAcHJvamVjdHM7CisJCXByaW50ICI8dGg+TGFzdCBDaGFuZ2U8L3RoPlxuIjsKKwl9IGVsc2UgeworCQlwcmludCAiPHRoPiIgLiAkY2dpLT5hKHstY2xhc3MgPT4gImhlYWRlciIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oIm89YWdlIil9LCAiTGFzdCBDaGFuZ2UiKSAuICI8L3RoPlxuIjsKKwl9CisJcHJpbnQgIjx0aD48L3RoPlxuIiAuCisJICAgICAgIjwvdHI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWZvcmVhY2ggbXkgJHByIChAcHJvamVjdHMpIHsKKwkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJkYXJrXCI+XG4iOworCQl9IGVsc2UgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQl9CisJCSRhbHRlcm5hdGUgXj0gMTsKKwkJcHJpbnQgIjx0ZD4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHItPnsncGF0aCd9O2E9c3VtbWFyeSIpLCAtY2xhc3MgPT4gImxpc3QifSwgZXNjX2h0bWwoJHByLT57J3BhdGgnfSkpIC4gIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD4kcHItPnsnZGVzY3InfTwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZD48aT4iIC4gY2hvcF9zdHIoJHByLT57J293bmVyJ30sIDE1KSAuICI8L2k+PC90ZD5cbiI7CisJCXByaW50ICI8dGQgY2xhc3M9XCIiLiBhZ2VfY2xhc3MoJHByLT57J2NvbW1pdCd9eydhZ2UnfSkgLiAiXCI+IiAuICRwci0+eydjb21taXQnfXsnYWdlX3N0cmluZyd9IC4gIjwvdGQ+XG4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHItPnsncGF0aCd9O2E9c3VtbWFyeSIpfSwgInN1bW1hcnkiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHItPnsncGF0aCd9O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwci0+eydwYXRoJ307YT1sb2ciKX0sICJsb2ciKSAuCisJCSAgICAgICI8L3RkPlxuIiAuCisJCSAgICAgICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgcmVhZF9pbmZvX3JlZiB7CisJbXkgJHR5cGUgPSBzaGlmdCB8fCAiIjsKKwlteSAlcmVmczsKKwkjIDVkYzAxYzU5NWU2YzZlYzljY2RhNGY2ZjY5YzEzMWMwZGQ5NDVmOGMJcmVmcy90YWdzL3YyLjYuMTEKKwkjIGMzOWFlMDdmMzkzODA2Y2NmNDA2ZWY5NjZlOWExNWFmYzQzY2MzNmEJcmVmcy90YWdzL3YyLjYuMTFee30KKwlvcGVuIG15ICRmZCwgIiRwcm9qZWN0cm9vdC8kcHJvamVjdC9pbmZvL3JlZnMiIG9yIHJldHVybjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQljaG9tcCgkbGluZSk7CisJCWlmICgkbGluZSA9fiBtL14oWzAtOWEtZkEtRl17NDB9KVx0LiokdHlwZVwvKFteXF5dKykvKSB7CisJCQlpZiAoZGVmaW5lZCAkcmVmc3skMX0pIHsKKwkJCQkkcmVmc3skMX0gLj0gIiAvICQyIjsKKwkJCX0gZWxzZSB7CisJCQkJJHJlZnN7JDF9ID0gJDI7CisJCQl9CisJCX0KKwl9CisJY2xvc2UgJGZkIG9yIHJldHVybjsKKwlyZXR1cm4gXCVyZWZzOworfQorCitzdWIgZ2l0X3JlYWRfcmVmcyB7CisJbXkgJHJlZl9kaXIgPSBzaGlmdDsKKwlteSBAcmVmbGlzdDsKKworCW15IEByZWZzOworCW9wZW5kaXIgbXkgJGRoLCAiJHByb2plY3Ryb290LyRwcm9qZWN0LyRyZWZfZGlyIjsKKwl3aGlsZSAobXkgJGRpciA9IHJlYWRkaXIoJGRoKSkgeworCQlpZiAoJGRpciA9fiBtL15cLi8pIHsKKwkJCW5leHQ7CisJCX0KKwkJaWYgKC1kICIkcHJvamVjdHJvb3QvJHByb2plY3QvJHJlZl9kaXIvJGRpciIpIHsKKwkJCW9wZW5kaXIgbXkgJGRoMiwgIiRwcm9qZWN0cm9vdC8kcHJvamVjdC8kcmVmX2Rpci8kZGlyIjsKKwkJCW15IEBzdWJkaXJzID0gZ3JlcCAhbS9eXC4vLCByZWFkZGlyICRkaDI7CisJCQljbG9zZWRpcigkZGgyKTsKKwkJCWZvcmVhY2ggbXkgJHN1YmRpciAoQHN1YmRpcnMpIHsKKwkJCQlwdXNoIEByZWZzLCAiJGRpci8kc3ViZGlyIgorCQkJfQorCQkJbmV4dDsKKwkJfQorCQlwdXNoIEByZWZzLCAkZGlyOworCX0KKwljbG9zZWRpcigkZGgpOworCWZvcmVhY2ggbXkgJHJlZl9maWxlIChAcmVmcykgeworCQlteSAkcmVmX2lkID0gZ2l0X3JlYWRfaGFzaCgiJHByb2plY3QvJHJlZl9kaXIvJHJlZl9maWxlIik7CisJCW15ICR0eXBlID0gZ2l0X2dldF90eXBlKCRyZWZfaWQpIHx8IG5leHQ7CisJCW15ICVyZWZfaXRlbTsKKwkJbXkgJWNvOworCQkkcmVmX2l0ZW17J3R5cGUnfSA9ICR0eXBlOworCQkkcmVmX2l0ZW17J2lkJ30gPSAkcmVmX2lkOworCQkkcmVmX2l0ZW17J2Vwb2NoJ30gPSAwOworCQkkcmVmX2l0ZW17J2FnZSd9ID0gInVua25vd24iOworCQlpZiAoJHR5cGUgZXEgInRhZyIpIHsKKwkJCW15ICV0YWcgPSBnaXRfcmVhZF90YWcoJHJlZl9pZCk7CisJCQkkcmVmX2l0ZW17J2NvbW1lbnQnfSA9ICR0YWd7J2NvbW1lbnQnfTsKKwkJCWlmICgkdGFneyd0eXBlJ30gZXEgImNvbW1pdCIpIHsKKwkJCQklY28gPSBnaXRfcmVhZF9jb21taXQoJHRhZ3snb2JqZWN0J30pOworCQkJCSRyZWZfaXRlbXsnZXBvY2gnfSA9ICRjb3snY29tbWl0dGVyX2Vwb2NoJ307CisJCQkJJHJlZl9pdGVteydhZ2UnfSA9ICRjb3snYWdlX3N0cmluZyd9OworCQkJfSBlbHNpZiAoZGVmaW5lZCgkdGFneydlcG9jaCd9KSkgeworCQkJCW15ICRhZ2UgPSB0aW1lIC0gJHRhZ3snZXBvY2gnfTsKKwkJCQkkcmVmX2l0ZW17J2Vwb2NoJ30gPSAkdGFneydlcG9jaCd9OworCQkJCSRyZWZfaXRlbXsnYWdlJ30gPSBhZ2Vfc3RyaW5nKCRhZ2UpOworCQkJfQorCQkJJHJlZl9pdGVteydyZWZ0eXBlJ30gPSAkdGFneyd0eXBlJ307CisJCQkkcmVmX2l0ZW17J25hbWUnfSA9ICR0YWd7J25hbWUnfTsKKwkJCSRyZWZfaXRlbXsncmVmaWQnfSA9ICR0YWd7J29iamVjdCd9OworCQl9IGVsc2lmICgkdHlwZSBlcSAiY29tbWl0Iil7CisJCQklY28gPSBnaXRfcmVhZF9jb21taXQoJHJlZl9pZCk7CisJCQkkcmVmX2l0ZW17J3JlZnR5cGUnfSA9ICJjb21taXQiOworCQkJJHJlZl9pdGVteyduYW1lJ30gPSAkcmVmX2ZpbGU7CisJCQkkcmVmX2l0ZW17J3RpdGxlJ30gPSAkY297J3RpdGxlJ307CisJCQkkcmVmX2l0ZW17J3JlZmlkJ30gPSAkcmVmX2lkOworCQkJJHJlZl9pdGVteydlcG9jaCd9ID0gJGNveydjb21taXR0ZXJfZXBvY2gnfTsKKwkJCSRyZWZfaXRlbXsnYWdlJ30gPSAkY297J2FnZV9zdHJpbmcnfTsKKwkJfQorCisJCXB1c2ggQHJlZmxpc3QsIFwlcmVmX2l0ZW07CisJfQorCSMgc29ydCB0YWdzIGJ5IGFnZQorCUByZWZsaXN0ID0gc29ydCB7JGItPnsnZXBvY2gnfSA8PT4gJGEtPnsnZXBvY2gnfX0gQHJlZmxpc3Q7CisJcmV0dXJuIFxAcmVmbGlzdDsKK30KKworc3ViIGdpdF9zdW1tYXJ5IHsKKwlteSAkZGVzY3IgPSBnaXRfcmVhZF9kZXNjcmlwdGlvbigkcHJvamVjdCkgfHwgIm5vbmUiOworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoZWFkKTsKKwlteSAlY2QgPSBkYXRlX3N0cigkY297J2NvbW1pdHRlcl9lcG9jaCd9LCAkY297J2NvbW1pdHRlcl90eid9KTsKKworCW15ICRvd25lcjsKKwlpZiAoLWYgJHByb2plY3RzX2xpc3QpIHsKKwkJb3BlbiAobXkgJGZkICwgJHByb2plY3RzX2xpc3QpOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJY2hvbXAgJGxpbmU7CisJCQlteSAoJHByLCAkb3cpID0gc3BsaXQgJyAnLCAkbGluZTsKKwkJCSRwciA9IHVuZXNjYXBlKCRwcik7CisJCQkkb3cgPSB1bmVzY2FwZSgkb3cpOworCQkJaWYgKCRwciBlcSAkcHJvamVjdCkgeworCQkJCSRvd25lciA9IGRlY29kZSgidXRmOCIsICRvdywgRW5jb2RlOjpGQl9ERUZBVUxUKTsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCWNsb3NlICRmZDsKKwl9CisJaWYgKCFkZWZpbmVkICRvd25lcikgeworCQkkb3duZXIgPSBnZXRfZmlsZV9vd25lcigiJHByb2plY3Ryb290LyRwcm9qZWN0Iik7CisJfQorCisJbXkgJHJlZnMgPSByZWFkX2luZm9fcmVmKCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgInN1bW1hcnkiLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoZWFkIil9LCAiY29tbWl0IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGVhZCIpfSwgImNvbW1pdGRpZmYiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZSIpfSwgInRyZWUiKSAuCisJICAgICAgIjxici8+PGJyLz5cbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZVwiPiZuYnNwOzwvZGl2PlxuIjsKKwlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIiAuCisJICAgICAgIjx0cj48dGQ+ZGVzY3JpcHRpb248L3RkPjx0ZD4iIC4gZXNjX2h0bWwoJGRlc2NyKSAuICI8L3RkPjwvdHI+XG4iIC4KKwkgICAgICAiPHRyPjx0ZD5vd25lcjwvdGQ+PHRkPiRvd25lcjwvdGQ+PC90cj5cbiIgLgorCSAgICAgICI8dHI+PHRkPmxhc3QgY2hhbmdlPC90ZD48dGQ+JGNkeydyZmMyODIyJ308L3RkPjwvdHI+XG4iIC4KKwkgICAgICAiPC90YWJsZT5cbiI7CisJb3BlbiBteSAkZmQsICItfCIsICIkR0lUIHJldi1saXN0IC0tbWF4LWNvdW50PTE3ICIgLiBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KSBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQHJldmxpc3QpID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJY2xvc2UgJGZkOworCXByaW50ICI8ZGl2PlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIiksIC1jbGFzcyA9PiAidGl0bGUifSwgInNob3J0bG9nIikgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJbXkgJGkgPSAxNjsKKwlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMDsKKwlmb3JlYWNoIG15ICRjb21taXQgKEByZXZsaXN0KSB7CisJCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkY29tbWl0KTsKKwkJbXkgJWFkID0gZGF0ZV9zdHIoJGNveydhdXRob3JfZXBvY2gnfSk7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCWlmICgkaS0tID4gMCkgeworCQkJbXkgJHJlZiA9ICIiOworCQkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJCSRyZWYgPSAiIDxzcGFuIGNsYXNzPVwidGFnXCI+IiAuIGVzY19odG1sKCRyZWZzLT57JGNvbW1pdH0pIC4gIjwvc3Bhbj4iOworCQkJfQorCQkJcHJpbnQgIjx0ZD48aT4kY297J2FnZV9zdHJpbmcnfTwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPjxpPiIgLiBlc2NfaHRtbChjaG9wX3N0cigkY297J2F1dGhvcl9uYW1lJ30sIDEwKSkgLiAiPC9pPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+IjsKKwkJCWlmIChsZW5ndGgoJGNveyd0aXRsZV9zaG9ydCd9KSA8IGxlbmd0aCgkY297J3RpdGxlJ30pKSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSwgLWNsYXNzID0+ICJsaXN0IiwgLXRpdGxlID0+ICIkY297J3RpdGxlJ30ifSwKKwkJCQkgICAgICAiPGI+IiAuIGVzY19odG1sKCRjb3sndGl0bGVfc2hvcnQnfSkgLiAiJHJlZjwvYj4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSwgLWNsYXNzID0+ICJsaXN0In0sCisJCQkJICAgICAgIjxiPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4gIiRyZWY8L2I+Iik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0Iil9LCAiY29tbWl0IikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRjb21taXQiKX0sICJjb21taXRkaWZmIikgLgorCQkJICAgICAgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8L3RyPiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRkPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICIuLi4iKSAuICI8L3RkPlxuIiAuCisJCQkiPC90cj4iOworCQkJbGFzdDsKKwkJfQorCX0KKwlwcmludCAiPC90YWJsZVxuPiI7CisKKwlteSAkdGFnbGlzdCA9IGdpdF9yZWFkX3JlZnMoInJlZnMvdGFncyIpOworCWlmIChkZWZpbmVkIEAkdGFnbGlzdCkgeworCQlwcmludCAiPGRpdj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dGFncyIpLCAtY2xhc3MgPT4gInRpdGxlIn0sICJ0YWdzIikgLgorCQkgICAgICAiPC9kaXY+XG4iOworCQlteSAkaSA9IDE2OworCQlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwkJbXkgJGFsdGVybmF0ZSA9IDA7CisJCWZvcmVhY2ggbXkgJGVudHJ5IChAJHRhZ2xpc3QpIHsKKwkJCW15ICV0YWcgPSAlJGVudHJ5OworCQkJbXkgJGNvbW1lbnRfbGluZXMgPSAkdGFneydjb21tZW50J307CisJCQlteSAkY29tbWVudCA9IHNoaWZ0IEAkY29tbWVudF9saW5lczsKKwkJCWlmIChkZWZpbmVkKCRjb21tZW50KSkgeworCQkJCSRjb21tZW50ID0gY2hvcF9zdHIoJGNvbW1lbnQsIDMwLCA1KTsKKwkJCX0KKwkJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJCX0KKwkJCSRhbHRlcm5hdGUgXj0gMTsKKwkJCWlmICgkaS0tID4gMCkgeworCQkJCXByaW50ICI8dGQ+PGk+JHRhZ3snYWdlJ308L2k+PC90ZD5cbiIgLgorCQkJCSAgICAgICI8dGQ+IiAuCisJCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPSR0YWd7J3JlZnR5cGUnfTtoPSR0YWd7J3JlZmlkJ30iKSwgLWNsYXNzID0+ICJsaXN0In0sCisJCQkJICAgICAgIjxiPiIgLiBlc2NfaHRtbCgkdGFneyduYW1lJ30pIC4gIjwvYj4iKSAuCisJCQkJICAgICAgIjwvdGQ+XG4iIC4KKwkJCQkgICAgICAiPHRkPiI7CisJCQkJaWYgKGRlZmluZWQoJGNvbW1lbnQpKSB7CisJCQkJICAgICAgcHJpbnQgJGNnaS0+YSh7LWNsYXNzID0+ICJsaXN0IiwgLWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRhZztoPSR0YWd7J2lkJ30iKX0sIGVzY19odG1sKCRjb21tZW50KSk7CisJCQkJfQorCQkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJCWlmICgkdGFneyd0eXBlJ30gZXEgInRhZyIpIHsKKwkJCQkgICAgICBwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dGFnO2g9JHRhZ3snaWQnfSIpfSwgInRhZyIpIC4gIiB8ICI7CisJCQkJfQorCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT0kdGFneydyZWZ0eXBlJ307aD0kdGFneydyZWZpZCd9Iil9LCAkdGFneydyZWZ0eXBlJ30pOworCQkJCWlmICgkdGFneydyZWZ0eXBlJ30gZXEgImNvbW1pdCIpIHsKKwkJCQkgICAgICBwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSR0YWd7J25hbWUnfSIpfSwgInNob3J0bG9nIikgLgorCQkJCQkgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nO2g9JHRhZ3sncmVmaWQnfSIpfSwgImxvZyIpOworCQkJCX0KKwkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCSAgICAgICI8L3RyPiI7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICI8dGQ+IiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10YWdzIil9LCAiLi4uIikgLiAiPC90ZD5cbiIgLgorCQkJCSI8L3RyPiI7CisJCQkJbGFzdDsKKwkJCX0KKwkJfQorCQlwcmludCAiPC90YWJsZVxuPiI7CisJfQorCisJbXkgJGhlYWRsaXN0ID0gZ2l0X3JlYWRfcmVmcygicmVmcy9oZWFkcyIpOworCWlmIChkZWZpbmVkIEAkaGVhZGxpc3QpIHsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWhlYWRzIiksIC1jbGFzcyA9PiAidGl0bGUifSwgImhlYWRzIikgLgorCQkgICAgICAiPC9kaXY+XG4iOworCQlteSAkaSA9IDE2OworCQlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwkJbXkgJGFsdGVybmF0ZSA9IDA7CisJCWZvcmVhY2ggbXkgJGVudHJ5IChAJGhlYWRsaXN0KSB7CisJCQlteSAldGFnID0gJSRlbnRyeTsKKwkJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJCX0KKwkJCSRhbHRlcm5hdGUgXj0gMTsKKwkJCWlmICgkaS0tID4gMCkgeworCQkJCXByaW50ICI8dGQ+PGk+JHRhZ3snYWdlJ308L2k+PC90ZD5cbiIgLgorCQkJCSAgICAgICI8dGQ+IiAuCisJCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9IiksIC1jbGFzcyA9PiAibGlzdCJ9LAorCQkJCSAgICAgICI8Yj4iIC4gZXNjX2h0bWwoJHRhZ3snbmFtZSd9KSAuICI8L2I+IikgLgorCQkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2c7aD0kdGFneyduYW1lJ30iKX0sICJzaG9ydGxvZyIpIC4KKwkJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kdGFneyduYW1lJ30iKX0sICJsb2ciKSAuCisJCQkJICAgICAgIjwvdGQ+XG4iIC4KKwkJCQkgICAgICAiPC90cj4iOworCQkJfSBlbHNlIHsKKwkJCQlwcmludCAiPHRkPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9aGVhZHMiKX0sICIuLi4iKSAuICI8L3RkPlxuIiAuCisJCQkJIjwvdHI+IjsKKwkJCQlsYXN0OworCQkJfQorCQl9CisJCXByaW50ICI8L3RhYmxlXG4+IjsKKwl9CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfcHJpbnRfcGFnZV9wYXRoIHsKKwlteSAkbmFtZSA9IHNoaWZ0OworCW15ICR0eXBlID0gc2hpZnQ7CisKKwlpZiAoIWRlZmluZWQgJG5hbWUpIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX3BhdGhcIj48Yj4vPC9iPjwvZGl2PlxuIjsKKwl9IGVsc2lmICgkdHlwZSA9fiAiYmxvYiIpIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX3BhdGhcIj48Yj4iIC4KKwkJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iX3BsYWluO2Y9JGZpbGVfbmFtZSIpfSwgZXNjX2h0bWwoJG5hbWUpKSAuICI8L2I+PGJyLz48L2Rpdj5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX3BhdGhcIj48Yj4iIC4gZXNjX2h0bWwoJG5hbWUpIC4gIjwvYj48YnIvPjwvZGl2PlxuIjsKKwl9Cit9CisKK3N1YiBnaXRfdGFnIHsKKwlteSAkaGVhZCA9IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZyIpfSwgInNob3J0bG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWxvZyIpfSwgImxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGVhZCIpfSwgImNvbW1pdCIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhlYWQiKX0sICJjb21taXRkaWZmIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aGI9JGhlYWQiKX0sICJ0cmVlIikgLiAiPGJyLz5cbiIgLgorCSAgICAgICI8YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlteSAldGFnID0gZ2l0X3JlYWRfdGFnKCRoYXNoKTsKKwlwcmludCAiPGRpdj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpLCAtY2xhc3MgPT4gInRpdGxlIn0sIGVzY19odG1sKCR0YWd7J25hbWUnfSkpIC4gIlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiIgLgorCSAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iIC4KKwkgICAgICAiPHRyPlxuIiAuCisJICAgICAgIjx0ZD5vYmplY3Q8L3RkPlxuIiAuCisJICAgICAgIjx0ZD4iIC4gJGNnaS0+YSh7LWNsYXNzID0+ICJsaXN0IiwgLWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPSR0YWd7J3R5cGUnfTtoPSR0YWd7J29iamVjdCd9Iil9LCAkdGFneydvYmplY3QnfSkgLiAiPC90ZD5cbiIgLgorCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT0kdGFneyd0eXBlJ307aD0kdGFneydvYmplY3QnfSIpfSwgJHRhZ3sndHlwZSd9KSAuICI8L3RkPlxuIiAuCisJICAgICAgIjwvdHI+XG4iOworCWlmIChkZWZpbmVkKCR0YWd7J2F1dGhvcid9KSkgeworCQlteSAlYWQgPSBkYXRlX3N0cigkdGFneydlcG9jaCd9LCAkdGFneyd0eid9KTsKKwkJcHJpbnQgIjx0cj48dGQ+YXV0aG9yPC90ZD48dGQ+IiAuIGVzY19odG1sKCR0YWd7J2F1dGhvcid9KSAuICI8L3RkPjwvdHI+XG4iOworCQlwcmludCAiPHRyPjx0ZD48L3RkPjx0ZD4iIC4gJGFkeydyZmMyODIyJ30gLiBzcHJpbnRmKCIgKCUwMmQ6JTAyZCAlcykiLCAkYWR7J2hvdXJfbG9jYWwnfSwgJGFkeydtaW51dGVfbG9jYWwnfSwgJGFkeyd0el9sb2NhbCd9KSAuICI8L3RkPjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cblxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPiI7CisJbXkgJGNvbW1lbnQgPSAkdGFneydjb21tZW50J307CisJZm9yZWFjaCBteSAkbGluZSAoQCRjb21tZW50KSB7CisJCXByaW50IGVzY19odG1sKCRsaW5lKSAuICI8YnIvPlxuIjsKKwl9CisJcHJpbnQgIjwvZGl2PlxuIjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9ibGFtZTIgeworCW15ICRmZDsKKwlteSAkZnR5cGU7CisJZGllX2Vycm9yKHVuZGVmLCAiUGVybWlzc2lvbiBkZW5pZWQuIikgaWYgKCFnaXRfZ2V0X3Byb2plY3RfY29uZmlnX2Jvb2wgKCdibGFtZScpKTsKKwlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiRmlsZSBuYW1lIG5vdCBkZWZpbmVkIikgaWYgKCEkZmlsZV9uYW1lKTsKKwkkaGFzaF9iYXNlIHx8PSBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KTsKKwlkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGNvbW1pdCBmYWlsZWQiKSB1bmxlc3MgKCRoYXNoX2Jhc2UpOworCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaF9iYXNlKQorCQlvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGNvbW1pdCBmYWlsZWQiKTsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkaGFzaF9iYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpCisJCQlvciBkaWVfZXJyb3IodW5kZWYsICJFcnJvciBsb29raW5nIHVwIGZpbGUiKTsKKwl9CisJJGZ0eXBlID0gZ2l0X2dldF90eXBlKCRoYXNoKTsKKwlpZiAoJGZ0eXBlICF+ICJibG9iIikgeworCQlkaWVfZXJyb3IoIjQwMCBCYWQgUmVxdWVzdCIsICJvYmplY3QgaXMgbm90IGEgYmxvYiIpOworCX0KKwlvcGVuICgkZmQsICItfCIsICRHSVQsICJibGFtZSIsICctbCcsICRmaWxlX25hbWUsICRoYXNoX2Jhc2UpCisJCW9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZmFpbGVkIik7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkJIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkJIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCQkiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIil9LCAiY29tbWl0IikgLgorCQkiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaF9iYXNlIil9LCAidHJlZSIpIC4gIjxici8+XG4iOworCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGhhc2g7aGI9JGhhc2hfYmFzZTtmPSRmaWxlX25hbWUiKX0sICJibG9iIikgLgorCQkiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibGFtZTtmPSRmaWxlX25hbWUiKX0sICJoZWFkIikgLiAiPGJyLz5cbiI7CisJcHJpbnQgIjwvZGl2PlxuIi4KKwkJIjxkaXY+IiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSkgLgorCQkiPC9kaXY+XG4iOworCWdpdF9wcmludF9wYWdlX3BhdGgoJGZpbGVfbmFtZSwgJGZ0eXBlKTsKKwlteSBAcmV2X2NvbG9yID0gKHF3KGxpZ2h0IGRhcmspKTsKKwlteSAkbnVtX2NvbG9ycyA9IHNjYWxhcihAcmV2X2NvbG9yKTsKKwlteSAkY3VycmVudF9jb2xvciA9IDA7CisJbXkgJGxhc3RfcmV2OworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCXByaW50ICI8dGFibGUgY2xhc3M9XCJibGFtZVwiPlxuIjsKKwlwcmludCAiPHRyPjx0aD5Db21taXQ8L3RoPjx0aD5MaW5lPC90aD48dGg+RGF0YTwvdGg+PC90cj5cbiI7CisJd2hpbGUgKDwkZmQ+KSB7CisJCS9eKFswLTlhLWZBLUZdezQwfSkuKj8oXGQrKVwpXHN7MX0oXHMqLiopLzsKKwkJbXkgJGZ1bGxfcmV2ID0gJDE7CisJCW15ICRyZXYgPSBzdWJzdHIoJGZ1bGxfcmV2LCAwLCA4KTsKKwkJbXkgJGxpbmVubyA9ICQyOworCQlteSAkZGF0YSA9ICQzOworCisJCWlmICghZGVmaW5lZCAkbGFzdF9yZXYpIHsKKwkJCSRsYXN0X3JldiA9ICRmdWxsX3JldjsKKwkJfSBlbHNpZiAoJGxhc3RfcmV2IG5lICRmdWxsX3JldikgeworCQkJJGxhc3RfcmV2ID0gJGZ1bGxfcmV2OworCQkJJGN1cnJlbnRfY29sb3IgPSArKyRjdXJyZW50X2NvbG9yICUgJG51bV9jb2xvcnM7CisJCX0KKwkJcHJpbnQgIjx0ciBjbGFzcz1cIiRyZXZfY29sb3JbJGN1cnJlbnRfY29sb3JdXCI+XG4iOworCQlwcmludCAiPHRkIGNsYXNzPVwic2hhMVwiPiIgLgorCQkJJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRmdWxsX3JldjtmPSRmaWxlX25hbWUiKX0sIGVzY19odG1sKCRyZXYpKSAuICI8L3RkPlxuIjsKKwkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpbmVuclwiPjxhIGlkPVwibCRsaW5lbm9cIiBocmVmPVwiI2wkbGluZW5vXCIgY2xhc3M9XCJsaW5lbnJcIj4iIC4gZXNjX2h0bWwoJGxpbmVubykgLiAiPC9hPjwvdGQ+XG4iOworCQlwcmludCAiPHRkIGNsYXNzPVwicHJlXCI+IiAuIGVzY19odG1sKCRkYXRhKSAuICI8L3RkPlxuIjsKKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJcHJpbnQgIjwvZGl2PiI7CisJY2xvc2UgJGZkIG9yIHByaW50ICJSZWFkaW5nIGJsb2IgZmFpbGVkXG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2JsYW1lIHsKKwlteSAkZmQ7CisJZGllX2Vycm9yKCc0MDMgUGVybWlzc2lvbiBkZW5pZWQnLCAiUGVybWlzc2lvbiBkZW5pZWQuIikgaWYgKCFnaXRfZ2V0X3Byb2plY3RfY29uZmlnX2Jvb2wgKCdibGFtZScpKTsKKwlkaWVfZXJyb3IoJzQwNCBOb3QgRm91bmQnLCAiV2hhdCBmaWxlIHdpbGwgaXQgYmUsIG1hc3Rlcj8iKSBpZiAoISRmaWxlX25hbWUpOworCSRoYXNoX2Jhc2UgfHw9IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworCWRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgY29tbWl0IGZhaWxlZC4iKSB1bmxlc3MgKCRoYXNoX2Jhc2UpOworCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaF9iYXNlKQorCQlvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGNvbW1pdCBmYWlsZWQuIik7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSwgImJsb2IiKQorCQkJb3IgZGllX2Vycm9yKHVuZGVmLCAiRXJyb3IgbG9va3VwIGZpbGUuIik7CisJfQorCW9wZW4gKCRmZCwgIi18IiwgJEdJVCwgImFubm90YXRlIiwgJy1sJywgJy10JywgJy1yJywgJGZpbGVfbmFtZSwgJGhhc2hfYmFzZSkKKwkJb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBmYWlsZWQuIik7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkJIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkJIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCQkiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIil9LCAiY29tbWl0IikgLgorCQkiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaF9iYXNlIil9LCAidHJlZSIpIC4gIjxici8+XG4iOworCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGhhc2g7aGI9JGhhc2hfYmFzZTtmPSRmaWxlX25hbWUiKX0sICJibG9iIikgLgorCQkiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibGFtZTtmPSRmaWxlX25hbWUiKX0sICJoZWFkIikgLiAiPGJyLz5cbiI7CisJcHJpbnQgIjwvZGl2PlxuIi4KKwkJIjxkaXY+IiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSkgLgorCQkiPC9kaXY+XG4iOworCWdpdF9wcmludF9wYWdlX3BhdGgoJGZpbGVfbmFtZSk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisJcHJpbnQgPDxIVE1MOworPHRhYmxlIGNsYXNzPSJibGFtZSI+CisgIDx0cj4KKyAgICA8dGg+Q29tbWl0PC90aD4KKyAgICA8dGg+QWdlPC90aD4KKyAgICA8dGg+QXV0aG9yPC90aD4KKyAgICA8dGg+TGluZTwvdGg+CisgICAgPHRoPkRhdGE8L3RoPgorICA8L3RyPgorSFRNTAorCW15IEBsaW5lX2NsYXNzID0gKHF3KGxpZ2h0IGRhcmspKTsKKwlteSAkbGluZV9jbGFzc19sZW4gPSBzY2FsYXIgKEBsaW5lX2NsYXNzKTsKKwlteSAkbGluZV9jbGFzc19udW0gPSAkI2xpbmVfY2xhc3M7CisJd2hpbGUgKG15ICRsaW5lID0gPCRmZD4pIHsKKwkJbXkgJGxvbmdfcmV2OworCQlteSAkc2hvcnRfcmV2OworCQlteSAkYXV0aG9yOworCQlteSAkdGltZTsKKwkJbXkgJGxpbmVubzsKKwkJbXkgJGRhdGE7CisJCW15ICRhZ2U7CisJCW15ICRhZ2Vfc3RyOworCQlteSAkYWdlX2NsYXNzOworCisJCWNob21wICRsaW5lOworCQkkbGluZV9jbGFzc19udW0gPSAoJGxpbmVfY2xhc3NfbnVtICsgMSkgJSAkbGluZV9jbGFzc19sZW47CisKKwkJaWYgKCRsaW5lID1+IG0vXihbMC05YS1mQS1GXXs0MH0pXHRcKFxzKihbXlx0XSspXHQoXGQrKSBcK1xkXGRcZFxkXHQoXGQrKVwpKC4qKSQvKSB7CisJCQkkbG9uZ19yZXYgPSAkMTsKKwkJCSRhdXRob3IgICA9ICQyOworCQkJJHRpbWUgICAgID0gJDM7CisJCQkkbGluZW5vICAgPSAkNDsKKwkJCSRkYXRhICAgICA9ICQ1OworCQl9IGVsc2UgeworCQkJcHJpbnQgcXEoICA8dHI+PHRkIGNvbHNwYW49IjUiIGNsYXNzPSJlcnJvciI+VW5hYmxlIHRvIHBhcnNlOiAkbGluZTwvdGQ+PC90cj5cbik7CisJCQluZXh0OworCQl9CisJCSRzaG9ydF9yZXYgID0gc3Vic3RyICgkbG9uZ19yZXYsIDAsIDgpOworCQkkYWdlICAgICAgICA9IHRpbWUgKCkgLSAkdGltZTsKKwkJJGFnZV9zdHIgICAgPSBhZ2Vfc3RyaW5nICgkYWdlKTsKKwkJJGFnZV9zdHIgICAgPX4gcy8gLyZuYnNwOy9nOworCQkkYWdlX2NsYXNzICA9IGFnZV9jbGFzcygkYWdlKTsKKwkJJGF1dGhvciAgICAgPSBlc2NfaHRtbCAoJGF1dGhvcik7CisJCSRhdXRob3IgICAgID1+IHMvIC8mbmJzcDsvZzsKKwkJIyBlc2NhcGUgdGFicworCQl3aGlsZSAoKG15ICRwb3MgPSBpbmRleCgkZGF0YSwgIlx0IikpICE9IC0xKSB7CisJCQlpZiAobXkgJGNvdW50ID0gKDggLSAoJHBvcyAlIDgpKSkgeworCQkJCW15ICRzcGFjZXMgPSAnICcgeCAkY291bnQ7CisJCQkJJGRhdGEgPX4gcy9cdC8kc3BhY2VzLzsKKwkJCX0KKwkJfQorCQkkZGF0YSA9IGVzY19odG1sICgkZGF0YSk7CisKKwkJcHJpbnQgPDxIVE1MOworICA8dHIgY2xhc3M9IiRsaW5lX2NsYXNzWyRsaW5lX2NsYXNzX251bV0iPgorICAgIDx0ZCBjbGFzcz0ic2hhMSI+PGEgaHJlZj0iJG15X3VyaT8ke1xlc2NfcGFyYW0gKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGxvbmdfcmV2Iil9IiBjbGFzcz0idGV4dCI+JHNob3J0X3Jldi4uPC9hPjwvdGQ+CisgICAgPHRkIGNsYXNzPSIkYWdlX2NsYXNzIj4kYWdlX3N0cjwvdGQ+CisgICAgPHRkPiRhdXRob3I8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGluZW5yIj48YSBpZD0iJGxpbmVubyIgaHJlZj0iIyRsaW5lbm8iIGNsYXNzPSJsaW5lbnIiPiRsaW5lbm88L2E+PC90ZD4KKyAgICA8dGQgY2xhc3M9InByZSI+JGRhdGE8L3RkPgorICA8L3RyPgorSFRNTAorCX0gIyB3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikKKwlwcmludCAiPC90YWJsZT5cblxuIjsKKwljbG9zZSAkZmQgb3IgcHJpbnQgIlJlYWRpbmcgYmxvYiBmYWlsZWQuXG4iOworCXByaW50ICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3RhZ3MgeworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoZWFkIil9LCAiY29tbWl0IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGVhZCIpfSwgImNvbW1pdGRpZmYiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoYj0kaGVhZCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIiAuCisJICAgICAgIjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCW15ICR0YWdsaXN0ID0gZ2l0X3JlYWRfcmVmcygicmVmcy90YWdzIik7CisJcHJpbnQgIjxkaXY+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpLCAtY2xhc3MgPT4gInRpdGxlIn0sICImbmJzcDsiKSAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPHRhYmxlIGNlbGxzcGFjaW5nPVwiMFwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMDsKKwlpZiAoZGVmaW5lZCBAJHRhZ2xpc3QpIHsKKwkJZm9yZWFjaCBteSAkZW50cnkgKEAkdGFnbGlzdCkgeworCQkJbXkgJXRhZyA9ICUkZW50cnk7CisJCQlteSAkY29tbWVudF9saW5lcyA9ICR0YWd7J2NvbW1lbnQnfTsKKwkJCW15ICRjb21tZW50ID0gc2hpZnQgQCRjb21tZW50X2xpbmVzOworCQkJaWYgKGRlZmluZWQoJGNvbW1lbnQpKSB7CisJCQkJJGNvbW1lbnQgPSBjaG9wX3N0cigkY29tbWVudCwgMzAsIDUpOworCQkJfQorCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJfQorCQkJJGFsdGVybmF0ZSBePSAxOworCQkJcHJpbnQgIjx0ZD48aT4kdGFneydhZ2UnfTwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPSR0YWd7J3JlZnR5cGUnfTtoPSR0YWd7J3JlZmlkJ30iKSwgLWNsYXNzID0+ICJsaXN0In0sCisJCQkgICAgICAiPGI+IiAuIGVzY19odG1sKCR0YWd7J25hbWUnfSkgLiAiPC9iPiIpIC4KKwkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiI7CisJCQlpZiAoZGVmaW5lZCgkY29tbWVudCkpIHsKKwkJCSAgICAgIHByaW50ICRjZ2ktPmEoey1jbGFzcyA9PiAibGlzdCIsIC1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10YWc7aD0kdGFneydpZCd9Iil9LCAkY29tbWVudCk7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJaWYgKCR0YWd7J3R5cGUnfSBlcSAidGFnIikgeworCQkJICAgICAgcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRhZztoPSR0YWd7J2lkJ30iKX0sICJ0YWciKSAuICIgfCAiOworCQkJfQorCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPSR0YWd7J3JlZnR5cGUnfTtoPSR0YWd7J3JlZmlkJ30iKX0sICR0YWd7J3JlZnR5cGUnfSk7CisJCQlpZiAoJHRhZ3sncmVmdHlwZSd9IGVxICJjb21taXQiKSB7CisJCQkgICAgICBwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSR0YWd7J25hbWUnfSIpfSwgInNob3J0bG9nIikgLgorCQkJCSAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kdGFneydyZWZpZCd9Iil9LCAibG9nIik7CisJCQl9CisJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJICAgICAgIjwvdHI+IjsKKwkJfQorCX0KKwlwcmludCAiPC90YWJsZVxuPiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfaGVhZHMgeworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoZWFkIil9LCAiY29tbWl0IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGVhZCIpfSwgImNvbW1pdGRpZmYiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoYj0kaGVhZCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIiAuCisJICAgICAgIjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCW15ICR0YWdsaXN0ID0gZ2l0X3JlYWRfcmVmcygicmVmcy9oZWFkcyIpOworCXByaW50ICI8ZGl2PlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCAiJm5ic3A7IikgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjx0YWJsZSBjZWxsc3BhY2luZz1cIjBcIj5cbiI7CisJbXkgJGFsdGVybmF0ZSA9IDA7CisJaWYgKGRlZmluZWQgQCR0YWdsaXN0KSB7CisJCWZvcmVhY2ggbXkgJGVudHJ5IChAJHRhZ2xpc3QpIHsKKwkJCW15ICV0YWcgPSAlJGVudHJ5OworCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJfQorCQkJJGFsdGVybmF0ZSBePSAxOworCQkJcHJpbnQgIjx0ZD48aT4kdGFneydhZ2UnfTwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9IiksIC1jbGFzcyA9PiAibGlzdCJ9LCAiPGI+IiAuIGVzY19odG1sKCR0YWd7J25hbWUnfSkgLiAiPC9iPiIpIC4KKwkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JHRhZ3snbmFtZSd9Iil9LCAic2hvcnRsb2ciKSAuCisJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kdGFneyduYW1lJ30iKX0sICJsb2ciKSAuCisJCQkgICAgICAiPC90ZD5cbiIgLgorCQkJICAgICAgIjwvdHI+IjsKKwkJfQorCX0KKwlwcmludCAiPC90YWJsZVxuPiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfZ2V0X2hhc2hfYnlfcGF0aCB7CisJbXkgJGJhc2UgPSBzaGlmdDsKKwlteSAkcGF0aCA9IHNoaWZ0IHx8IHJldHVybiB1bmRlZjsKKworCW15ICR0cmVlID0gJGJhc2U7CisJbXkgQHBhcnRzID0gc3BsaXQgJy8nLCAkcGF0aDsKKwl3aGlsZSAobXkgJHBhcnQgPSBzaGlmdCBAcGFydHMpIHsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkR0lUIGxzLXRyZWUgJHRyZWUiIG9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZ2l0LWxzLXRyZWUgZmFpbGVkLiIpOworCQlteSAoQGVudHJpZXMpID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJCWNsb3NlICRmZCBvciByZXR1cm4gdW5kZWY7CisJCWZvcmVhY2ggbXkgJGxpbmUgKEBlbnRyaWVzKSB7CisJCQkjJzEwMDY0NAlibG9iCTBmYTNmM2E2NmZiNmExMzdmNmVjMmMxOTM1MWVkNGQ4MDcwNzBmZmEJcGFuaWMuYycKKwkJCSRsaW5lID1+IG0vXihbMC05XSspICguKykgKFswLTlhLWZBLUZdezQwfSlcdCguKykkLzsKKwkJCW15ICR0X21vZGUgPSAkMTsKKwkJCW15ICR0X3R5cGUgPSAkMjsKKwkJCW15ICR0X2hhc2ggPSAkMzsKKwkJCW15ICR0X25hbWUgPSB2YWxpZGF0ZV9pbnB1dCh1bnF1b3RlKCQ0KSk7CisJCQlpZiAoJHRfbmFtZSBlcSAkcGFydCkgeworCQkJCWlmICghKEBwYXJ0cykpIHsKKwkJCQkJcmV0dXJuICR0X2hhc2g7CisJCQkJfQorCQkJCWlmICgkdF90eXBlIGVxICJ0cmVlIikgeworCQkJCQkkdHJlZSA9ICR0X2hhc2g7CisJCQkJfQorCQkJCWxhc3Q7CisJCQl9CisJCX0KKwl9Cit9CisKK3N1YiBtaW1ldHlwZV9ndWVzc19maWxlIHsKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKwlteSAkbWltZW1hcCA9IHNoaWZ0OworCS1yICRtaW1lbWFwIG9yIHJldHVybiB1bmRlZjsKKworCW15ICVtaW1lbWFwOworCW9wZW4oTUlNRSwgJG1pbWVtYXApIG9yIHJldHVybiB1bmRlZjsKKwl3aGlsZSAoPE1JTUU+KSB7CisJCW15ICgkbWltZSwgJGV4dHMpID0gc3BsaXQoL1x0Ky8pOworCQlteSBAZXh0cyA9IHNwbGl0KC9ccysvLCAkZXh0cyk7CisJCWZvcmVhY2ggbXkgJGV4dCAoQGV4dHMpIHsKKwkJCSRtaW1lbWFweyRleHR9ID0gJG1pbWU7CisJCX0KKwl9CisJY2xvc2UoTUlNRSk7CisKKwkkZmlsZW5hbWUgPX4gL1wuKC4qPykkLzsKKwlyZXR1cm4gJG1pbWVtYXB7JDF9OworfQorCitzdWIgbWltZXR5cGVfZ3Vlc3MgeworCW15ICRmaWxlbmFtZSA9IHNoaWZ0OworCW15ICRtaW1lOworCSRmaWxlbmFtZSA9fiAvXC4vIG9yIHJldHVybiB1bmRlZjsKKworCWlmICgkbWltZXR5cGVzX2ZpbGUpIHsKKwkJbXkgJGZpbGUgPSAkbWltZXR5cGVzX2ZpbGU7CisJCSMkZmlsZSA9fiBtI14vIyBvciAkZmlsZSA9ICIkcHJvamVjdHJvb3QvJHBhdGgvJGZpbGUiOworCQkkbWltZSA9IG1pbWV0eXBlX2d1ZXNzX2ZpbGUoJGZpbGVuYW1lLCAkZmlsZSk7CisJfQorCSRtaW1lIHx8PSBtaW1ldHlwZV9ndWVzc19maWxlKCRmaWxlbmFtZSwgJy9ldGMvbWltZS50eXBlcycpOworCXJldHVybiAkbWltZTsKK30KKworc3ViIGdpdF9ibG9iX3BsYWluX21pbWV0eXBlIHsKKwlteSAkZmQgPSBzaGlmdDsKKwlteSAkZmlsZW5hbWUgPSBzaGlmdDsKKworCWlmICgkZmlsZW5hbWUpIHsKKwkJbXkgJG1pbWUgPSBtaW1ldHlwZV9ndWVzcygkZmlsZW5hbWUpOworCQkkbWltZSBhbmQgcmV0dXJuICRtaW1lOworCX0KKworCSMganVzdCBpbiBjYXNlCisJcmV0dXJuICRkZWZhdWx0X2Jsb2JfcGxhaW5fbWltZXR5cGUgdW5sZXNzICRmZDsKKworCWlmICgtVCAkZmQpIHsKKwkJcmV0dXJuICd0ZXh0L3BsYWluJyAuCisJCSAgICAgICAoJGRlZmF1bHRfdGV4dF9wbGFpbl9jaGFyc2V0ID8gJzsgY2hhcnNldD0nLiRkZWZhdWx0X3RleHRfcGxhaW5fY2hhcnNldCA6ICcnKTsKKwl9IGVsc2lmICghICRmaWxlbmFtZSkgeworCQlyZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7CisJfSBlbHNpZiAoJGZpbGVuYW1lID1+IG0vXC5wbmckL2kpIHsKKwkJcmV0dXJuICdpbWFnZS9wbmcnOworCX0gZWxzaWYgKCRmaWxlbmFtZSA9fiBtL1wuZ2lmJC9pKSB7CisJCXJldHVybiAnaW1hZ2UvZ2lmJzsKKwl9IGVsc2lmICgkZmlsZW5hbWUgPX4gbS9cLmpwZT9nJC9pKSB7CisJCXJldHVybiAnaW1hZ2UvanBlZyc7CisJfSBlbHNlIHsKKwkJcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nOworCX0KK30KKworc3ViIGdpdF9ibG9iX3BsYWluIHsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAkZmlsZV9uYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSAkYmFzZSA9ICRoYXNoX2Jhc2UgfHwgZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkaGFzaCA9IGdpdF9nZXRfaGFzaF9ieV9wYXRoKCRiYXNlLCAkZmlsZV9uYW1lLCAiYmxvYiIpIHx8IGRpZV9lcnJvcih1bmRlZiwgIkVycm9yIGxvb2t1cCBmaWxlLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWVfZXJyb3IodW5kZWYsICJObyBmaWxlIG5hbWUgZGVmaW5lZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlteSAkdHlwZSA9IHNoaWZ0OworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCBjYXQtZmlsZSBibG9iICRoYXNoIiBvciBkaWVfZXJyb3IoIkNvdWxkbid0IGNhdCAkZmlsZV9uYW1lLCAkaGFzaCIpOworCisJJHR5cGUgfHw9IGdpdF9ibG9iX3BsYWluX21pbWV0eXBlKCRmZCwgJGZpbGVfbmFtZSk7CisKKwkjIHNhdmUgYXMgZmlsZW5hbWUsIGV2ZW4gd2hlbiBubyAkZmlsZV9uYW1lIGlzIGdpdmVuCisJbXkgJHNhdmVfYXMgPSAiJGhhc2giOworCWlmIChkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJHNhdmVfYXMgPSAkZmlsZV9uYW1lOworCX0gZWxzaWYgKCR0eXBlID1+IG0vXnRleHRcLy8pIHsKKwkJJHNhdmVfYXMgLj0gJy50eHQnOworCX0KKworCXByaW50ICRjZ2ktPmhlYWRlcigtdHlwZSA9PiAiJHR5cGUiLCAnLWNvbnRlbnQtZGlzcG9zaXRpb24nID0+ICJpbmxpbmU7IGZpbGVuYW1lPVwiJHNhdmVfYXNcIiIpOworCXVuZGVmICQvOworCWJpbm1vZGUgU1RET1VULCAnOnJhdyc7CisJcHJpbnQgPCRmZD47CisJYmlubW9kZSBTVERPVVQsICc6dXRmOCc7ICMgYXMgc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgZ2l0d2ViLmNnaQorCSQvID0gIlxuIjsKKwljbG9zZSAkZmQ7Cit9CisKK3N1YiBnaXRfYmxvYiB7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGJhc2UgPSAkaGFzaF9iYXNlIHx8IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkYmFzZSwgJGZpbGVfbmFtZSwgImJsb2IiKSB8fCBkaWVfZXJyb3IodW5kZWYsICJFcnJvciBsb29rdXAgZmlsZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGllX2Vycm9yKHVuZGVmLCAiTm8gZmlsZSBuYW1lIGRlZmluZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJbXkgJGhhdmVfYmxhbWUgPSBnaXRfZ2V0X3Byb2plY3RfY29uZmlnX2Jvb2wgKCdibGFtZScpOworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCBjYXQtZmlsZSBibG9iICRoYXNoIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAkbWltZXR5cGUgPSBnaXRfYmxvYl9wbGFpbl9taW1ldHlwZSgkZmQsICRmaWxlX25hbWUpOworCWlmICgkbWltZXR5cGUgIX4gbS9edGV4dFwvLykgeworCQljbG9zZSAkZmQ7CisJCXJldHVybiBnaXRfYmxvYl9wbGFpbigkbWltZXR5cGUpOworCX0KKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlpZiAoZGVmaW5lZCAkaGFzaF9iYXNlICYmIChteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2hfYmFzZSkpKSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpfSwgInN1bW1hcnkiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWxvZyIpfSwgImxvZyIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdCIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoX2Jhc2UiKX0sICJjb21taXRkaWZmIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGhhc2hfYmFzZSIpfSwgInRyZWUiKSAuICI8YnIvPlxuIjsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJaWYgKCRoYXZlX2JsYW1lKSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsYW1lO2g9JGhhc2g7aGI9JGhhc2hfYmFzZTtmPSRmaWxlX25hbWUiKX0sICJibGFtZSIpIC4gICIgfCAiOworCQkJfQorCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2JfcGxhaW47aD0kaGFzaDtmPSRmaWxlX25hbWUiKX0sICJwbGFpbiIpIC4KKwkJCSIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aGI9SEVBRDtmPSRmaWxlX25hbWUiKX0sICJoZWFkIikgLiAiPGJyLz5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYl9wbGFpbjtoPSRoYXNoIil9LCAicGxhaW4iKSAuICI8YnIvPlxuIjsKKwkJfQorCQlwcmludCAiPC9kaXY+XG4iLgorCQkgICAgICAgIjxkaXY+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSkgLgorCQkgICAgICAiPC9kaXY+XG4iOworCX0gZWxzZSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCQkgICAgICAiPGJyLz48YnIvPjwvZGl2PlxuIiAuCisJCSAgICAgICI8ZGl2IGNsYXNzPVwidGl0bGVcIj4kaGFzaDwvZGl2PlxuIjsKKwl9CisJZ2l0X3ByaW50X3BhZ2VfcGF0aCgkZmlsZV9uYW1lLCAiYmxvYiIpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCW15ICRucjsKKwl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQljaG9tcCAkbGluZTsKKwkJJG5yKys7CisJCXdoaWxlICgobXkgJHBvcyA9IGluZGV4KCRsaW5lLCAiXHQiKSkgIT0gLTEpIHsKKwkJCWlmIChteSAkY291bnQgPSAoOCAtICgkcG9zICUgOCkpKSB7CisJCQkJbXkgJHNwYWNlcyA9ICcgJyB4ICRjb3VudDsKKwkJCQkkbGluZSA9fiBzL1x0LyRzcGFjZXMvOworCQkJfQorCQl9CisJCXByaW50ZiAiPGRpdiBjbGFzcz1cInByZVwiPjxhIGlkPVwibCVpXCIgaHJlZj1cIiNsJWlcIiBjbGFzcz1cImxpbmVuclwiPiU0aTwvYT4gJXM8L2Rpdj5cbiIsICRuciwgJG5yLCAkbnIsIGVzY19odG1sKCRsaW5lKTsKKwl9CisJY2xvc2UgJGZkIG9yIHByaW50ICJSZWFkaW5nIGJsb2IgZmFpbGVkLlxuIjsKKwlwcmludCAiPC9kaXY+IjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF90cmVlIHsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KTsKKwkJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkJbXkgJGJhc2UgPSAkaGFzaF9iYXNlIHx8ICRoYXNoOworCQkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkYmFzZSwgJGZpbGVfbmFtZSwgInRyZWUiKTsKKwkJfQorCQlpZiAoIWRlZmluZWQgJGhhc2hfYmFzZSkgeworCQkJJGhhc2hfYmFzZSA9ICRoYXNoOworCQl9CisJfQorCSQvID0gIlwwIjsKKwlvcGVuIG15ICRmZCwgIi18IiwgIiRHSVQgbHMtdHJlZSAteiAkaGFzaCIgb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBnaXQtbHMtdHJlZSBmYWlsZWQuIik7CisJY2hvbXAgKG15IChAZW50cmllcykgPSA8JGZkPik7CisJY2xvc2UgJGZkIG9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgdHJlZSBmYWlsZWQuIik7CisJJC8gPSAiXG4iOworCisJbXkgJHJlZnMgPSByZWFkX2luZm9fcmVmKCk7CisJbXkgJHJlZiA9ICIiOworCWlmIChkZWZpbmVkICRyZWZzLT57JGhhc2hfYmFzZX0pIHsKKwkJJHJlZiA9ICIgPHNwYW4gY2xhc3M9XCJ0YWdcIj4iIC4gZXNjX2h0bWwoJHJlZnMtPnskaGFzaF9iYXNlfSkgLiAiPC9zcGFuPiI7CisJfQorCWdpdF9oZWFkZXJfaHRtbCgpOworCW15ICRiYXNlX2tleSA9ICIiOworCW15ICRiYXNlID0gIiI7CisJaWYgKGRlZmluZWQgJGhhc2hfYmFzZSAmJiAobXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoYXNoX2Jhc2UpKSkgeworCQkkYmFzZV9rZXkgPSAiO2hiPSRoYXNoX2Jhc2UiOworCQlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSRoYXNoX2Jhc2UiKX0sICJzaG9ydGxvZyIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nO2g9JGhhc2hfYmFzZSIpfSwgImxvZyIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdCIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoX2Jhc2UiKX0sICJjb21taXRkaWZmIikgLgorCQkgICAgICAiIHwgdHJlZSIgLgorCQkgICAgICAiPGJyLz48YnIvPlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiI7CisJCXByaW50ICI8ZGl2PlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYpIC4gIlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiI7CisJfSBlbHNlIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIjsKKwkJcHJpbnQgIjxici8+PGJyLz48L2Rpdj5cbiI7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwidGl0bGVcIj4kaGFzaDwvZGl2PlxuIjsKKwl9CisJaWYgKGRlZmluZWQgJGZpbGVfbmFtZSkgeworCQkkYmFzZSA9IGVzY19odG1sKCIkZmlsZV9uYW1lLyIpOworCX0KKwlnaXRfcHJpbnRfcGFnZV9wYXRoKCRmaWxlX25hbWUpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWZvcmVhY2ggbXkgJGxpbmUgKEBlbnRyaWVzKSB7CisJCSMnMTAwNjQ0CWJsb2IJMGZhM2YzYTY2ZmI2YTEzN2Y2ZWMyYzE5MzUxZWQ0ZDgwNzA3MGZmYQlwYW5pYy5jJworCQkkbGluZSA9fiBtL14oWzAtOV0rKSAoLispIChbMC05YS1mQS1GXXs0MH0pXHQoLispJC87CisJCW15ICR0X21vZGUgPSAkMTsKKwkJbXkgJHRfdHlwZSA9ICQyOworCQlteSAkdF9oYXNoID0gJDM7CisJCW15ICR0X25hbWUgPSB2YWxpZGF0ZV9pbnB1dCgkNCk7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCXByaW50ICI8dGQgY2xhc3M9XCJtb2RlXCI+IiAuIG1vZGVfc3RyKCR0X21vZGUpIC4gIjwvdGQ+XG4iOworCQlpZiAoJHRfdHlwZSBlcSAiYmxvYiIpIHsKKwkJCXByaW50ICI8dGQgY2xhc3M9XCJsaXN0XCI+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0X2hhc2gkYmFzZV9rZXk7Zj0kYmFzZSR0X25hbWUiKSwgLWNsYXNzID0+ICJsaXN0In0sIGVzY19odG1sKCR0X25hbWUpKSAuCisJCQkgICAgICAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JHRfaGFzaCRiYXNlX2tleTtmPSRiYXNlJHRfbmFtZSIpfSwgImJsb2IiKSAuCisjCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxhbWU7aD0kdF9oYXNoJGJhc2Vfa2V5O2Y9JGJhc2UkdF9uYW1lIil9LCAiYmxhbWUiKSAuCisJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1oaXN0b3J5O2g9JHRfaGFzaDtoYj0kaGFzaF9iYXNlO2Y9JGJhc2UkdF9uYW1lIil9LCAiaGlzdG9yeSIpIC4KKwkJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2JfcGxhaW47aD0kdF9oYXNoO2Y9JGJhc2UkdF9uYW1lIil9LCAicmF3IikgLgorCQkJICAgICAgIjwvdGQ+XG4iOworCQl9IGVsc2lmICgkdF90eXBlIGVxICJ0cmVlIikgeworCQkJcHJpbnQgIjx0ZCBjbGFzcz1cImxpc3RcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JHRfaGFzaCRiYXNlX2tleTtmPSRiYXNlJHRfbmFtZSIpfSwgZXNjX2h0bWwoJHRfbmFtZSkpIC4KKwkJCSAgICAgICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kdF9oYXNoJGJhc2Vfa2V5O2Y9JGJhc2UkdF9uYW1lIil9LCAidHJlZSIpIC4KKwkJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWhpc3Rvcnk7aGI9JGhhc2hfYmFzZTtmPSRiYXNlJHRfbmFtZSIpfSwgImhpc3RvcnkiKSAuCisJCQkgICAgICAiPC90ZD5cbiI7CisJCX0KKwkJcHJpbnQgIjwvdHI+XG4iOworCX0KKwlwcmludCAiPC90YWJsZT5cbiIgLgorCSAgICAgICI8L2Rpdj4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3JzcyB7CisJIyBodHRwOi8vd3d3Lm5vdGVzdGlwcy5jb20vODAyNTZCM0EwMDdGMjY5Mi8xL05BTU81UDlVUFEKKwlvcGVuIG15ICRmZCwgIi18IiwgIiRHSVQgcmV2LWxpc3QgLS1tYXgtY291bnQ9MTUwICIgLiBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KSBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQHJldmxpc3QpID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJY2xvc2UgJGZkIG9yIGRpZV9lcnJvcih1bmRlZiwgIlJlYWRpbmcgcmV2LWxpc3QgZmFpbGVkLiIpOworCXByaW50ICRjZ2ktPmhlYWRlcigtdHlwZSA9PiAndGV4dC94bWwnLCAtY2hhcnNldCA9PiAndXRmLTgnKTsKKwlwcmludCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+XG4iLgorCSAgICAgICI8cnNzIHZlcnNpb249XCIyLjBcIiB4bWxuczpjb250ZW50PVwiaHR0cDovL3B1cmwub3JnL3Jzcy8xLjAvbW9kdWxlcy9jb250ZW50L1wiPlxuIjsKKwlwcmludCAiPGNoYW5uZWw+XG4iOworCXByaW50ICI8dGl0bGU+JHByb2plY3Q8L3RpdGxlPlxuIi4KKwkgICAgICAiPGxpbms+IiAuIGVzY19odG1sKCIkbXlfdXJsP3A9JHByb2plY3Q7YT1zdW1tYXJ5IikgLiAiPC9saW5rPlxuIi4KKwkgICAgICAiPGRlc2NyaXB0aW9uPiRwcm9qZWN0IGxvZzwvZGVzY3JpcHRpb24+XG4iLgorCSAgICAgICI8bGFuZ3VhZ2U+ZW48L2xhbmd1YWdlPlxuIjsKKworCWZvciAobXkgJGkgPSAwOyAkaSA8PSAkI3Jldmxpc3Q7ICRpKyspIHsKKwkJbXkgJGNvbW1pdCA9ICRyZXZsaXN0WyRpXTsKKwkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRjb21taXQpOworCQkjIHdlIHJlYWQgMTUwLCB3ZSBhbHdheXMgc2hvdyAzMCBhbmQgdGhlIG9uZXMgbW9yZSByZWNlbnQgdGhhbiA0OCBob3VycworCQlpZiAoKCRpID49IDIwKSAmJiAoKHRpbWUgLSAkY297J2NvbW1pdHRlcl9lcG9jaCd9KSA+IDQ4KjYwKjYwKSkgeworCQkJbGFzdDsKKwkJfQorCQlteSAlY2QgPSBkYXRlX3N0cigkY297J2NvbW1pdHRlcl9lcG9jaCd9KTsKKwkJb3BlbiAkZmQsICItfCIsICIkR0lUIGRpZmYtdHJlZSAtciAkY297J3BhcmVudCd9ICRjb3snaWQnfSIgb3IgbmV4dDsKKwkJbXkgQGRpZmZ0cmVlID0gbWFwIHsgY2hvbXA7ICRfIH0gPCRmZD47CisJCWNsb3NlICRmZCBvciBuZXh0OworCQlwcmludCAiPGl0ZW0+XG4iIC4KKwkJICAgICAgIjx0aXRsZT4iIC4KKwkJICAgICAgc3ByaW50ZigiJWQgJXMgJTAyZDolMDJkIiwgJGNkeydtZGF5J30sICRjZHsnbW9udGgnfSwgJGNkeydob3VyJ30sICRjZHsnbWludXRlJ30pIC4gIiAtICIgLiBlc2NfaHRtbCgkY297J3RpdGxlJ30pIC4KKwkJICAgICAgIjwvdGl0bGU+XG4iIC4KKwkJICAgICAgIjxhdXRob3I+IiAuIGVzY19odG1sKCRjb3snYXV0aG9yJ30pIC4gIjwvYXV0aG9yPlxuIiAuCisJCSAgICAgICI8cHViRGF0ZT4kY2R7J3JmYzI4MjInfTwvcHViRGF0ZT5cbiIgLgorCQkgICAgICAiPGd1aWQgaXNQZXJtYUxpbms9XCJ0cnVlXCI+IiAuIGVzY19odG1sKCIkbXlfdXJsP3A9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0IikgLiAiPC9ndWlkPlxuIiAuCisJCSAgICAgICI8bGluaz4iIC4gZXNjX2h0bWwoIiRteV91cmw/cD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSAuICI8L2xpbms+XG4iIC4KKwkJICAgICAgIjxkZXNjcmlwdGlvbj4iIC4gZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICI8L2Rlc2NyaXB0aW9uPlxuIiAuCisJCSAgICAgICI8Y29udGVudDplbmNvZGVkPiIgLgorCQkgICAgICAiPCFbQ0RBVEFbXG4iOworCQlteSAkY29tbWVudCA9ICRjb3snY29tbWVudCd9OworCQlmb3JlYWNoIG15ICRsaW5lIChAJGNvbW1lbnQpIHsKKwkJCSRsaW5lID0gZGVjb2RlKCJ1dGY4IiwgJGxpbmUsIEVuY29kZTo6RkJfREVGQVVMVCk7CisJCQlwcmludCAiJGxpbmU8YnIvPlxuIjsKKwkJfQorCQlwcmludCAiPGJyLz5cbiI7CisJCWZvcmVhY2ggbXkgJGxpbmUgKEBkaWZmdHJlZSkgeworCQkJaWYgKCEoJGxpbmUgPX4gbS9eOihbMC03XXs2fSkgKFswLTddezZ9KSAoWzAtOWEtZkEtRl17NDB9KSAoWzAtOWEtZkEtRl17NDB9KSAoLikoWzAtOV17MCwzfSlcdCguKikkLykpIHsKKwkJCQluZXh0OworCQkJfQorCQkJbXkgJGZpbGUgPSB2YWxpZGF0ZV9pbnB1dCh1bnF1b3RlKCQ3KSk7CisJCQkkZmlsZSA9IGRlY29kZSgidXRmOCIsICRmaWxlLCBFbmNvZGU6OkZCX0RFRkFVTFQpOworCQkJcHJpbnQgIiRmaWxlPGJyLz5cbiI7CisJCX0KKwkJcHJpbnQgIl1dPlxuIiAuCisJCSAgICAgICI8L2NvbnRlbnQ6ZW5jb2RlZD5cbiIgLgorCQkgICAgICAiPC9pdGVtPlxuIjsKKwl9CisJcHJpbnQgIjwvY2hhbm5lbD48L3Jzcz4iOworfQorCitzdWIgZ2l0X29wbWwgeworCW15IEBsaXN0ID0gZ2l0X3JlYWRfcHJvamVjdHMoKTsKKworCXByaW50ICRjZ2ktPmhlYWRlcigtdHlwZSA9PiAndGV4dC94bWwnLCAtY2hhcnNldCA9PiAndXRmLTgnKTsKKwlwcmludCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIj8+XG4iLgorCSAgICAgICI8b3BtbCB2ZXJzaW9uPVwiMS4wXCI+XG4iLgorCSAgICAgICI8aGVhZD4iLgorCSAgICAgICIgIDx0aXRsZT4kc2l0ZV9uYW1lIEdpdCBPUE1MIEV4cG9ydDwvdGl0bGU+XG4iLgorCSAgICAgICI8L2hlYWQ+XG4iLgorCSAgICAgICI8Ym9keT5cbiIuCisJICAgICAgIjxvdXRsaW5lIHRleHQ9XCJnaXQgUlNTIGZlZWRzXCI+XG4iOworCisJZm9yZWFjaCBteSAkcHIgKEBsaXN0KSB7CisJCW15ICVwcm9qID0gJSRwcjsKKwkJbXkgJGhlYWQgPSBnaXRfcmVhZF9oZWFkKCRwcm9qeydwYXRoJ30pOworCQlpZiAoIWRlZmluZWQgJGhlYWQpIHsKKwkJCW5leHQ7CisJCX0KKwkJJEVOVnsnR0lUX0RJUid9ID0gIiRwcm9qZWN0cm9vdC8kcHJvansncGF0aCd9IjsKKwkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoZWFkKTsKKwkJaWYgKCElY28pIHsKKwkJCW5leHQ7CisJCX0KKworCQlteSAkcGF0aCA9IGVzY19odG1sKGNob3Bfc3RyKCRwcm9qeydwYXRoJ30sIDI1LCA1KSk7CisJCW15ICRyc3MgID0gIiRteV91cmw/cD0kcHJvansncGF0aCd9O2E9cnNzIjsKKwkJbXkgJGh0bWwgPSAiJG15X3VybD9wPSRwcm9qeydwYXRoJ307YT1zdW1tYXJ5IjsKKwkJcHJpbnQgIjxvdXRsaW5lIHR5cGU9XCJyc3NcIiB0ZXh0PVwiJHBhdGhcIiB0aXRsZT1cIiRwYXRoXCIgeG1sVXJsPVwiJHJzc1wiIGh0bWxVcmw9XCIkaHRtbFwiLz5cbiI7CisJfQorCXByaW50ICI8L291dGxpbmU+XG4iLgorCSAgICAgICI8L2JvZHk+XG4iLgorCSAgICAgICI8L29wbWw+XG4iOworfQorCitzdWIgZ2l0X2xvZyB7CisJbXkgJGhlYWQgPSBnaXRfcmVhZF9oZWFkKCRwcm9qZWN0KTsKKwlpZiAoIWRlZmluZWQgJGhhc2gpIHsKKwkJJGhhc2ggPSAkaGVhZDsKKwl9CisJaWYgKCFkZWZpbmVkICRwYWdlKSB7CisJCSRwYWdlID0gMDsKKwl9CisJbXkgJHJlZnMgPSByZWFkX2luZm9fcmVmKCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIjsKKwlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeSIpfSwgInN1bW1hcnkiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2c7aD0kaGFzaCIpfSwgInNob3J0bG9nIikgLgorCSAgICAgICIgfCBsb2ciIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpfSwgImNvbW1pdCIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2giKX0sICJjb21taXRkaWZmIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kaGFzaDtoYj0kaGFzaCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIjsKKworCW15ICRsaW1pdCA9IHNwcmludGYoIi0tbWF4LWNvdW50PSVpIiwgKDEwMCAqICgkcGFnZSsxKSkpOworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCByZXYtbGlzdCAkbGltaXQgJGhhc2giIG9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZmFpbGVkLiIpOworCW15IChAcmV2bGlzdCkgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwljbG9zZSAkZmQ7CisKKwlpZiAoJGhhc2ggbmUgJGhlYWQgfHwgJHBhZ2UpIHsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWxvZyIpfSwgIkhFQUQiKTsKKwl9IGVsc2UgeworCQlwcmludCAiSEVBRCI7CisJfQorCWlmICgkcGFnZSA+IDApIHsKKwkJcHJpbnQgIiAmc2RvdDsgIiAuCisJCSRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaDtwZz0iIC4gKCRwYWdlLTEpKSwgLWFjY2Vzc2tleSA9PiAicCIsIC10aXRsZSA9PiAiQWx0LXAifSwgInByZXYiKTsKKwl9IGVsc2UgeworCQlwcmludCAiICZzZG90OyBwcmV2IjsKKwl9CisJaWYgKCQjcmV2bGlzdCA+PSAoMTAwICogKCRwYWdlKzEpLTEpKSB7CisJCXByaW50ICIgJnNkb3Q7ICIgLgorCQkkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nO2g9JGhhc2g7cGc9IiAuICgkcGFnZSsxKSksIC1hY2Nlc3NrZXkgPT4gIm4iLCAtdGl0bGUgPT4gIkFsdC1uIn0sICJuZXh0Iik7CisJfSBlbHNlIHsKKwkJcHJpbnQgIiAmc2RvdDsgbmV4dCI7CisJfQorCXByaW50ICI8YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlpZiAoIUByZXZsaXN0KSB7CisJCXByaW50ICI8ZGl2PlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5IiksIC1jbGFzcyA9PiAidGl0bGUifSwgIiZuYnNwOyIpIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKwkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoYXNoKTsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj4gTGFzdCBjaGFuZ2UgJGNveydhZ2Vfc3RyaW5nJ30uPGJyLz48YnIvPjwvZGl2PlxuIjsKKwl9CisJZm9yIChteSAkaSA9ICgkcGFnZSAqIDEwMCk7ICRpIDw9ICQjcmV2bGlzdDsgJGkrKykgeworCQlteSAkY29tbWl0ID0gJHJldmxpc3RbJGldOworCQlteSAkcmVmID0gIiI7CisJCWlmIChkZWZpbmVkICRyZWZzLT57JGNvbW1pdH0pIHsKKwkJCSRyZWYgPSAiIDxzcGFuIGNsYXNzPVwidGFnXCI+IiAuIGVzY19odG1sKCRyZWZzLT57JGNvbW1pdH0pIC4gIjwvc3Bhbj4iOworCQl9CisJCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkY29tbWl0KTsKKwkJbmV4dCBpZiAhJWNvOworCQlteSAlYWQgPSBkYXRlX3N0cigkY297J2F1dGhvcl9lcG9jaCd9KTsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb21taXQiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LAorCQkgICAgICAiPHNwYW4gY2xhc3M9XCJhZ2VcIj4kY297J2FnZV9zdHJpbmcnfTwvc3Bhbj4iIC4gZXNjX2h0bWwoJGNveyd0aXRsZSd9KSAuICRyZWYpIC4gIlxuIjsKKwkJcHJpbnQgIjwvZGl2PlxuIjsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJ0aXRsZV90ZXh0XCI+XG4iIC4KKwkJICAgICAgIjxkaXYgY2xhc3M9XCJsb2dfbGlua1wiPlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0Iil9LCAiY29tbWl0IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGNvbW1pdCIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSAgICAgICI8YnIvPlxuIiAuCisJCSAgICAgICI8L2Rpdj5cbiIgLgorCQkgICAgICAiPGk+IiAuIGVzY19odG1sKCRjb3snYXV0aG9yX25hbWUnfSkgLiAgIiBbJGFkeydyZmMyODIyJ31dPC9pPjxici8+XG4iIC4KKwkJICAgICAgIjwvZGl2PlxuIiAuCisJCSAgICAgICI8ZGl2IGNsYXNzPVwibG9nX2JvZHlcIj5cbiI7CisJCW15ICRjb21tZW50ID0gJGNveydjb21tZW50J307CisJCW15ICRlbXB0eSA9IDA7CisJCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgeworCQkJaWYgKCRsaW5lID1+IG0vXiAqKHNpZ25lZFsgXC1db2ZmWyBcLV1ieVsgOl18YWNrZWRbIFwtXWJ5WyA6XXxjY1sgOl0pL2kpIHsKKwkJCQluZXh0OworCQkJfQorCQkJaWYgKCRsaW5lIGVxICIiKSB7CisJCQkJaWYgKCRlbXB0eSkgeworCQkJCQluZXh0OworCQkJCX0KKwkJCQkkZW1wdHkgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkkZW1wdHkgPSAwOworCQkJfQorCQkJcHJpbnQgZm9ybWF0X2xvZ19saW5lX2h0bWwoJGxpbmUpIC4gIjxici8+XG4iOworCQl9CisJCWlmICghJGVtcHR5KSB7CisJCQlwcmludCAiPGJyLz5cbiI7CisJCX0KKwkJcHJpbnQgIjwvZGl2PlxuIjsKKwl9CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfY29tbWl0IHsKKwlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2gpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdC4iKTsKKwl9CisJbXkgJWFkID0gZGF0ZV9zdHIoJGNveydhdXRob3JfZXBvY2gnfSwgJGNveydhdXRob3JfdHonfSk7CisJbXkgJWNkID0gZGF0ZV9zdHIoJGNveydjb21taXR0ZXJfZXBvY2gnfSwgJGNveydjb21taXR0ZXJfdHonfSk7CisKKwlteSBAZGlmZnRyZWU7CisJbXkgJHJvb3QgPSAiIjsKKwlteSAkcGFyZW50ID0gJGNveydwYXJlbnQnfTsKKwlpZiAoIWRlZmluZWQgJHBhcmVudCkgeworCQkkcm9vdCA9ICIgLS1yb290IjsKKwkJJHBhcmVudCA9ICIiOworCX0KKwlvcGVuIG15ICRmZCwgIi18IiwgIiRHSVQgZGlmZi10cmVlIC1yIC1NICRyb290ICRwYXJlbnQgJGhhc2giIG9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZmFpbGVkLiIpOworCUBkaWZmdHJlZSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGRpZmYtdHJlZSBmYWlsZWQuIik7CisKKwkjIG5vbi10ZXh0dWFsIGhhc2ggaWQncyBjYW4gYmUgY2FjaGVkCisJbXkgJGV4cGlyZXM7CisJaWYgKCRoYXNoID1+IG0vXlswLTlhLWZBLUZdezQwfSQvKSB7CisJCSRleHBpcmVzID0gIisxZCI7CisJfQorCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigpOworCW15ICRyZWYgPSAiIjsKKwlpZiAoZGVmaW5lZCAkcmVmcy0+eyRjb3snaWQnfX0pIHsKKwkJJHJlZiA9ICIgPHNwYW4gY2xhc3M9XCJ0YWdcIj4iIC4gZXNjX2h0bWwoJHJlZnMtPnskY297J2lkJ319KSAuICI8L3NwYW4+IjsKKwl9CisJZ2l0X2hlYWRlcl9odG1sKHVuZGVmLCAkZXhwaXJlcyk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2giKX0sICJzaG9ydGxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaCIpfSwgImxvZyIpIC4KKwkgICAgICAiIHwgY29tbWl0IjsKKwlpZiAoZGVmaW5lZCAkY297J3BhcmVudCd9KSB7CisJCXByaW50ICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaCIpfSwgImNvbW1pdGRpZmYiKTsKKwl9CisJcHJpbnQgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRoYXNoIil9LCAidHJlZSIpIC4gIlxuIiAuCisJCSI8YnIvPlxuIjsKKwlpZiAoZGVmaW5lZCAkZmlsZV9uYW1lICYmIGRlZmluZWQgJGNveydwYXJlbnQnfSkgeworCQlteSAkcGFyZW50ID0gJGNveydwYXJlbnQnfTsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsYW1lO2hiPSRwYXJlbnQ7Zj0kZmlsZV9uYW1lIil9LCAiYmxhbWUiKSAuICJcbiI7CisJfQorCXByaW50ICI8YnIvPjwvZGl2PlxuIjsKKworCWlmIChkZWZpbmVkICRjb3sncGFyZW50J30pIHsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaCIpLCAtY2xhc3MgPT4gInRpdGxlIn0sIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAkcmVmKSAuICJcbiIgLgorCQkgICAgICAiPC9kaXY+XG4iOworCX0gZWxzZSB7CisJCXByaW50ICI8ZGl2PlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGhhc2giKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCBlc2NfaHRtbCgkY297J3RpdGxlJ30pKSAuICJcbiIgLgorCQkgICAgICAiPC9kaXY+XG4iOworCX0KKwlwcmludCAiPGRpdiBjbGFzcz1cInRpdGxlX3RleHRcIj5cbiIgLgorCSAgICAgICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCXByaW50ICI8dHI+PHRkPmF1dGhvcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkY297J2F1dGhvcid9KSAuICI8L3RkPjwvdHI+XG4iLgorCSAgICAgICI8dHI+IiAuCisJICAgICAgIjx0ZD48L3RkPjx0ZD4gJGFkeydyZmMyODIyJ30iOworCWlmICgkYWR7J2hvdXJfbG9jYWwnfSA8IDYpIHsKKwkJcHJpbnRmKCIgKDxzcGFuIGNsYXNzPVwiYXRuaWdodFwiPiUwMmQ6JTAyZDwvc3Bhbj4gJXMpIiwgJGFkeydob3VyX2xvY2FsJ30sICRhZHsnbWludXRlX2xvY2FsJ30sICRhZHsndHpfbG9jYWwnfSk7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCIgKCUwMmQ6JTAyZCAlcykiLCAkYWR7J2hvdXJfbG9jYWwnfSwgJGFkeydtaW51dGVfbG9jYWwnfSwgJGFkeyd0el9sb2NhbCd9KTsKKwl9CisJcHJpbnQgIjwvdGQ+IiAuCisJICAgICAgIjwvdHI+XG4iOworCXByaW50ICI8dHI+PHRkPmNvbW1pdHRlcjwvdGQ+PHRkPiIgLiBlc2NfaHRtbCgkY297J2NvbW1pdHRlcid9KSAuICI8L3RkPjwvdHI+XG4iOworCXByaW50ICI8dHI+PHRkPjwvdGQ+PHRkPiAkY2R7J3JmYzI4MjInfSIgLiBzcHJpbnRmKCIgKCUwMmQ6JTAyZCAlcykiLCAkY2R7J2hvdXJfbG9jYWwnfSwgJGNkeydtaW51dGVfbG9jYWwnfSwgJGNkeyd0el9sb2NhbCd9KSAuICI8L3RkPjwvdHI+XG4iOworCXByaW50ICI8dHI+PHRkPmNvbW1pdDwvdGQ+PHRkIGNsYXNzPVwic2hhMVwiPiRjb3snaWQnfTwvdGQ+PC90cj5cbiI7CisJcHJpbnQgIjx0cj4iIC4KKwkgICAgICAiPHRkPnRyZWU8L3RkPiIgLgorCSAgICAgICI8dGQgY2xhc3M9XCJzaGExXCI+IiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaCIpLCBjbGFzcyA9PiAibGlzdCJ9LCAkY297J3RyZWUnfSkgLgorCSAgICAgICI8L3RkPiIgLgorCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGhhc2giKX0sICJ0cmVlIikgLgorCSAgICAgICI8L3RkPiIgLgorCSAgICAgICI8L3RyPlxuIjsKKwlteSAkcGFyZW50cyA9ICRjb3sncGFyZW50cyd9OworCWZvcmVhY2ggbXkgJHBhciAoQCRwYXJlbnRzKSB7CisJCXByaW50ICI8dHI+IiAuCisJCSAgICAgICI8dGQ+cGFyZW50PC90ZD4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cInNoYTFcIj4iIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRwYXIiKSwgY2xhc3MgPT4gImxpc3QifSwgJHBhcikgLiAiPC90ZD4iIC4KKwkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRwYXIiKX0sICJjb21taXQiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaDtocD0kcGFyIil9LCAiY29tbWl0ZGlmZiIpIC4KKwkJICAgICAgIjwvdGQ+IiAuCisJCSAgICAgICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+Ii4KKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9ib2R5XCI+XG4iOworCW15ICRjb21tZW50ID0gJGNveydjb21tZW50J307CisJbXkgJGVtcHR5ID0gMDsKKwlteSAkc2lnbmVkID0gMDsKKwlmb3JlYWNoIG15ICRsaW5lIChAJGNvbW1lbnQpIHsKKwkJIyBwcmludCBvbmx5IG9uZSBlbXB0eSBsaW5lCisJCWlmICgkbGluZSBlcSAiIikgeworCQkJaWYgKCRlbXB0eSB8fCAkc2lnbmVkKSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCSRlbXB0eSA9IDE7CisJCX0gZWxzZSB7CisJCQkkZW1wdHkgPSAwOworCQl9CisJCWlmICgkbGluZSA9fiBtL14gKihzaWduZWRbIFwtXW9mZlsgXC1dYnlbIDpdfGFja2VkWyBcLV1ieVsgOl18Y2NbIDpdKS9pKSB7CisJCQkkc2lnbmVkID0gMTsKKwkJCXByaW50ICI8c3BhbiBjbGFzcz1cInNpZ25vZmZcIj4iIC4gZXNjX2h0bWwoJGxpbmUpIC4gIjwvc3Bhbj48YnIvPlxuIjsKKwkJfSBlbHNlIHsKKwkJCSRzaWduZWQgPSAwOworCQkJcHJpbnQgZm9ybWF0X2xvZ19saW5lX2h0bWwoJGxpbmUpIC4gIjxici8+XG4iOworCQl9CisJfQorCXByaW50ICI8L2Rpdj5cbiI7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJsaXN0X2hlYWRcIj5cbiI7CisJaWYgKCQjZGlmZnRyZWUgPiAxMCkgeworCQlwcmludCgoJCNkaWZmdHJlZSArIDEpIC4gIiBmaWxlcyBjaGFuZ2VkOlxuIik7CisJfQorCXByaW50ICI8L2Rpdj5cbiI7CisJcHJpbnQgIjx0YWJsZSBjbGFzcz1cImRpZmZfdHJlZVwiPlxuIjsKKwlteSAkYWx0ZXJuYXRlID0gMDsKKwlmb3JlYWNoIG15ICRsaW5lIChAZGlmZnRyZWUpIHsKKwkJIyAnOjEwMDY0NCAxMDA2NDQgMDNiMjE4MjYwZTk5Yjc4YzZkZjBlZDM3OGU1OWVkOTIwNWNjYzk2ZCAzYjkzZDVlN2NjN2Y3ZGQ0ZWJlZDEzYTVjYzFhNGFkOTc2ZmM5NGQ4IE0gICAgICBscy1maWxlcy5jJworCQkjICc6MTAwNjQ0IDEwMDY0NCA3ZjkyODE5ODUwODY5NzFkMzg3N2FjYTI3NzA0ZjJhYWY5YzQ0OGNlIGJjMTkwZWJjNzFiYmQ5MjNmMmI3MjhlNTA1NDA4ZjVlNTRiZDA3M2EgTSAgICAgIHJldi10cmVlLmMnCisJCWlmICghKCRsaW5lID1+IG0vXjooWzAtN117Nn0pIChbMC03XXs2fSkgKFswLTlhLWZBLUZdezQwfSkgKFswLTlhLWZBLUZdezQwfSkgKC4pKFswLTldezAsM30pXHQoLiopJC8pKSB7CisJCQluZXh0OworCQl9CisJCW15ICRmcm9tX21vZGUgPSAkMTsKKwkJbXkgJHRvX21vZGUgPSAkMjsKKwkJbXkgJGZyb21faWQgPSAkMzsKKwkJbXkgJHRvX2lkID0gJDQ7CisJCW15ICRzdGF0dXMgPSAkNTsKKwkJbXkgJHNpbWlsYXJpdHkgPSAkNjsKKwkJbXkgJGZpbGUgPSB2YWxpZGF0ZV9pbnB1dCh1bnF1b3RlKCQ3KSk7CisJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJfQorCQkkYWx0ZXJuYXRlIF49IDE7CisJCWlmICgkc3RhdHVzIGVxICJBIikgeworCQkJbXkgJG1vZGVfY2huZyA9ICIiOworCQkJaWYgKFNfSVNSRUcob2N0ICR0b19tb2RlKSkgeworCQkJCSRtb2RlX2NobmcgPSBzcHJpbnRmKCIgd2l0aCBtb2RlOiAlMDRvIiwgKG9jdCAkdG9fbW9kZSkgJiAwNzc3KTsKKwkJCX0KKwkJCXByaW50ICI8dGQ+IiAuCisJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSR0b19pZDtoYj0kaGFzaDtmPSRmaWxlIiksIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfaHRtbCgkZmlsZSkpIC4gIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+PHNwYW4gY2xhc3M9XCJmaWxlX3N0YXR1cyBuZXdcIj5bbmV3ICIgLiBmaWxlX3R5cGUoJHRvX21vZGUpIC4gIiRtb2RlX2NobmddPC9zcGFuPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JHRvX2lkO2hiPSRoYXNoO2Y9JGZpbGUiKX0sICJibG9iIikgLiAiPC90ZD5cbiI7CisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIkQiKSB7CisJCQlwcmludCAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kZnJvbV9pZDtoYj0kaGFzaDtmPSRmaWxlIiksIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfaHRtbCgkZmlsZSkpIC4gIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+PHNwYW4gY2xhc3M9XCJmaWxlX3N0YXR1cyBkZWxldGVkXCI+W2RlbGV0ZWQgIiAuIGZpbGVfdHlwZSgkZnJvbV9tb2RlKS4gIl08L3NwYW4+PC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGZyb21faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgImJsb2IiKSAuCisJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1oaXN0b3J5O2hiPSRoYXNoO2Y9JGZpbGUiKX0sICJoaXN0b3J5IikgLgorCQkJICAgICAgIjwvdGQ+XG4iCisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIk0iIHx8ICRzdGF0dXMgZXEgIlQiKSB7CisJCQlteSAkbW9kZV9jaG5nZSA9ICIiOworCQkJaWYgKCRmcm9tX21vZGUgIT0gJHRvX21vZGUpIHsKKwkJCQkkbW9kZV9jaG5nZSA9ICIgPHNwYW4gY2xhc3M9XCJmaWxlX3N0YXR1cyBtb2RlX2NobmdlXCI+W2NoYW5nZWQiOworCQkJCWlmICgoKG9jdCAkZnJvbV9tb2RlKSAmIFNfSUZNVCkgIT0gKChvY3QgJHRvX21vZGUpICYgU19JRk1UKSkgeworCQkJCQkkbW9kZV9jaG5nZSAuPSAiIGZyb20gIiAuIGZpbGVfdHlwZSgkZnJvbV9tb2RlKSAuICIgdG8gIiAuIGZpbGVfdHlwZSgkdG9fbW9kZSk7CisJCQkJfQorCQkJCWlmICgoKG9jdCAkZnJvbV9tb2RlKSAmIDA3NzcpICE9ICgob2N0ICR0b19tb2RlKSAmIDA3NzcpKSB7CisJCQkJCWlmIChTX0lTUkVHKCRmcm9tX21vZGUpICYmIFNfSVNSRUcoJHRvX21vZGUpKSB7CisJCQkJCQkkbW9kZV9jaG5nZSAuPSBzcHJpbnRmKCIgbW9kZTogJTA0by0+JTA0byIsIChvY3QgJGZyb21fbW9kZSkgJiAwNzc3LCAob2N0ICR0b19tb2RlKSAmIDA3NzcpOworCQkJCQl9IGVsc2lmIChTX0lTUkVHKCR0b19tb2RlKSkgeworCQkJCQkJJG1vZGVfY2huZ2UgLj0gc3ByaW50ZigiIG1vZGU6ICUwNG8iLCAob2N0ICR0b19tb2RlKSAmIDA3NzcpOworCQkJCQl9CisJCQkJfQorCQkJCSRtb2RlX2NobmdlIC49ICJdPC9zcGFuPlxuIjsKKwkJCX0KKwkJCXByaW50ICI8dGQ+IjsKKwkJCWlmICgkdG9faWQgbmUgJGZyb21faWQpIHsKKwkJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYmRpZmY7aD0kdG9faWQ7aHA9JGZyb21faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpLCAtY2xhc3MgPT4gImxpc3QifSwgZXNjX2h0bWwoJGZpbGUpKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpLCAtY2xhc3MgPT4gImxpc3QifSwgZXNjX2h0bWwoJGZpbGUpKTsKKwkJCX0KKwkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiRtb2RlX2NobmdlPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iOworCQkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgImJsb2IiKTsKKwkJCWlmICgkdG9faWQgbmUgJGZyb21faWQpIHsKKwkJCQlwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iZGlmZjtoPSR0b19pZDtocD0kZnJvbV9pZDtoYj0kaGFzaDtmPSRmaWxlIil9LCAiZGlmZiIpOworCQkJfQorCQkJcHJpbnQgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9aGlzdG9yeTtoYj0kaGFzaDtmPSRmaWxlIil9LCAiaGlzdG9yeSIpIC4gIlxuIjsKKwkJCXByaW50ICI8L3RkPlxuIjsKKwkJfSBlbHNpZiAoJHN0YXR1cyBlcSAiUiIpIHsKKwkJCW15ICgkZnJvbV9maWxlLCAkdG9fZmlsZSkgPSBzcGxpdCAiXHQiLCAkZmlsZTsKKwkJCW15ICRtb2RlX2NobmcgPSAiIjsKKwkJCWlmICgkZnJvbV9tb2RlICE9ICR0b19tb2RlKSB7CisJCQkJJG1vZGVfY2huZyA9IHNwcmludGYoIiwgbW9kZTogJTA0byIsIChvY3QgJHRvX21vZGUpICYgMDc3Nyk7CisJCQl9CisJCQlwcmludCAiPHRkPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kdG9fZmlsZSIpLCAtY2xhc3MgPT4gImxpc3QifSwgZXNjX2h0bWwoJHRvX2ZpbGUpKSAuICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPjxzcGFuIGNsYXNzPVwiZmlsZV9zdGF0dXMgbW92ZWRcIj5bbW92ZWQgZnJvbSAiIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGZyb21faWQ7aGI9JGhhc2g7Zj0kZnJvbV9maWxlIiksIC1jbGFzcyA9PiAibGlzdCJ9LCBlc2NfaHRtbCgkZnJvbV9maWxlKSkgLgorCQkJICAgICAgIiB3aXRoICIgLiAoaW50ICRzaW1pbGFyaXR5KSAuICIlIHNpbWlsYXJpdHkkbW9kZV9jaG5nXTwvc3Bhbj48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kdG9fZmlsZSIpfSwgImJsb2IiKTsKKwkJCWlmICgkdG9faWQgbmUgJGZyb21faWQpIHsKKwkJCQlwcmludCAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iZGlmZjtoPSR0b19pZDtocD0kZnJvbV9pZDtoYj0kaGFzaDtmPSR0b19maWxlIil9LCAiZGlmZiIpOworCQkJfQorCQkJcHJpbnQgIjwvdGQ+XG4iOworCQl9CisJCXByaW50ICI8L3RyPlxuIjsKKwl9CisJcHJpbnQgIjwvdGFibGU+XG4iOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X2Jsb2JkaWZmIHsKKwlta2RpcigkZ2l0X3RlbXAsIDA3MDApOworCWdpdF9oZWFkZXJfaHRtbCgpOworCWlmIChkZWZpbmVkICRoYXNoX2Jhc2UgJiYgKG15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaF9iYXNlKSkpIHsKKwkJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c2hvcnRsb2ciKX0sICJzaG9ydGxvZyIpIC4KKwkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIil9LCAiY29tbWl0IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2hfYmFzZSIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaF9iYXNlIil9LCAidHJlZSIpIC4KKwkJICAgICAgIjxici8+XG4iOworCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYmRpZmZfcGxhaW47aD0kaGFzaDtocD0kaGFzaF9wYXJlbnQiKX0sICJwbGFpbiIpIC4KKwkJICAgICAgIjwvZGl2PlxuIjsKKwkJcHJpbnQgIjxkaXY+XG4iIC4KKwkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoX2Jhc2UiKSwgLWNsYXNzID0+ICJ0aXRsZSJ9LCBlc2NfaHRtbCgkY297J3RpdGxlJ30pKSAuICJcbiIgLgorCQkgICAgICAiPC9kaXY+XG4iOworCX0gZWxzZSB7CisJCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCQkgICAgICAiPGJyLz48YnIvPjwvZGl2PlxuIiAuCisJCSAgICAgICI8ZGl2IGNsYXNzPVwidGl0bGVcIj4kaGFzaCB2cyAkaGFzaF9wYXJlbnQ8L2Rpdj5cbiI7CisJfQorCWdpdF9wcmludF9wYWdlX3BhdGgoJGZpbGVfbmFtZSwgImJsb2IiKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfYm9keVwiPlxuIiAuCisJICAgICAgIjxkaXYgY2xhc3M9XCJkaWZmX2luZm9cIj5ibG9iOiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGhhc2hfcGFyZW50O2hiPSRoYXNoX2Jhc2U7Zj0kZmlsZV9uYW1lIil9LCAkaGFzaF9wYXJlbnQpIC4KKwkgICAgICAiIC0+IGJsb2I6IiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kaGFzaDtoYj0kaGFzaF9iYXNlO2Y9JGZpbGVfbmFtZSIpfSwgJGhhc2gpIC4KKwkgICAgICAiPC9kaXY+XG4iOworCWdpdF9kaWZmX3ByaW50KCRoYXNoX3BhcmVudCwgJGZpbGVfbmFtZSB8fCAkaGFzaF9wYXJlbnQsICRoYXNoLCAkZmlsZV9uYW1lIHx8ICRoYXNoKTsKKwlwcmludCAiPC9kaXY+IjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9ibG9iZGlmZl9wbGFpbiB7CisJbWtkaXIoJGdpdF90ZW1wLCAwNzAwKTsKKwlwcmludCAkY2dpLT5oZWFkZXIoLXR5cGUgPT4gInRleHQvcGxhaW4iLCAtY2hhcnNldCA9PiAndXRmLTgnKTsKKwlnaXRfZGlmZl9wcmludCgkaGFzaF9wYXJlbnQsICRmaWxlX25hbWUgfHwgJGhhc2hfcGFyZW50LCAkaGFzaCwgJGZpbGVfbmFtZSB8fCAkaGFzaCwgInBsYWluIik7Cit9CisKK3N1YiBnaXRfY29tbWl0ZGlmZiB7CisJbWtkaXIoJGdpdF90ZW1wLCAwNzAwKTsKKwlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2gpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdC4iKTsKKwl9CisJaWYgKCFkZWZpbmVkICRoYXNoX3BhcmVudCkgeworCQkkaGFzaF9wYXJlbnQgPSAkY297J3BhcmVudCd9OworCX0KKwlvcGVuIG15ICRmZCwgIi18IiwgIiRHSVQgZGlmZi10cmVlIC1yICRoYXNoX3BhcmVudCAkaGFzaCIgb3IgZGllX2Vycm9yKHVuZGVmLCAiT3BlbiBmYWlsZWQuIik7CisJbXkgKEBkaWZmdHJlZSkgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwljbG9zZSAkZmQgb3IgZGllX2Vycm9yKHVuZGVmLCAiUmVhZGluZyBkaWZmLXRyZWUgZmFpbGVkLiIpOworCisJIyBub24tdGV4dHVhbCBoYXNoIGlkJ3MgY2FuIGJlIGNhY2hlZAorCW15ICRleHBpcmVzOworCWlmICgkaGFzaCA9fiBtL15bMC05YS1mQS1GXXs0MH0kLykgeworCQkkZXhwaXJlcyA9ICIrMWQiOworCX0KKwlteSAkcmVmcyA9IHJlYWRfaW5mb19yZWYoKTsKKwlteSAkcmVmID0gIiI7CisJaWYgKGRlZmluZWQgJHJlZnMtPnskY297J2lkJ319KSB7CisJCSRyZWYgPSAiIDxzcGFuIGNsYXNzPVwidGFnXCI+IiAuIGVzY19odG1sKCRyZWZzLT57JGNveydpZCd9fSkgLiAiPC9zcGFuPiI7CisJfQorCWdpdF9oZWFkZXJfaHRtbCh1bmRlZiwgJGV4cGlyZXMpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSRoYXNoIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nO2g9JGhhc2giKX0sICJsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGhhc2giKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8IGNvbW1pdGRpZmYiIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGhhc2giKX0sICJ0cmVlIikgLiAiPGJyLz5cbiI7CisJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmZfcGxhaW47aD0kaGFzaDtocD0kaGFzaF9wYXJlbnQiKX0sICJwbGFpbiIpIC4gIlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpLCAtY2xhc3MgPT4gInRpdGxlIn0sIGVzY19odG1sKCRjb3sndGl0bGUnfSkgLiAkcmVmKSAuICJcbiIgLgorCSAgICAgICI8L2Rpdj5cbiI7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX2JvZHlcIj5cbiI7CisJbXkgJGNvbW1lbnQgPSAkY297J2NvbW1lbnQnfTsKKwlteSAkZW1wdHkgPSAwOworCW15ICRzaWduZWQgPSAwOworCW15IEBsb2cgPSBAJGNvbW1lbnQ7CisJIyByZW1vdmUgZmlyc3QgYW5kIGVtcHR5IGxpbmVzIGFmdGVyIHRoYXQKKwlzaGlmdCBAbG9nOworCXdoaWxlIChkZWZpbmVkICRsb2dbMF0gJiYgJGxvZ1swXSBlcSAiIikgeworCQlzaGlmdCBAbG9nOworCX0KKwlmb3JlYWNoIG15ICRsaW5lIChAbG9nKSB7CisJCWlmICgkbGluZSA9fiBtL14gKihzaWduZWRbIFwtXW9mZlsgXC1dYnlbIDpdfGFja2VkWyBcLV1ieVsgOl18Y2NbIDpdKS9pKSB7CisJCQluZXh0OworCQl9CisJCWlmICgkbGluZSBlcSAiIikgeworCQkJaWYgKCRlbXB0eSkgeworCQkJCW5leHQ7CisJCQl9CisJCQkkZW1wdHkgPSAxOworCQl9IGVsc2UgeworCQkJJGVtcHR5ID0gMDsKKwkJfQorCQlwcmludCBmb3JtYXRfbG9nX2xpbmVfaHRtbCgkbGluZSkgLiAiPGJyLz5cbiI7CisJfQorCXByaW50ICI8YnIvPlxuIjsKKwlmb3JlYWNoIG15ICRsaW5lIChAZGlmZnRyZWUpIHsKKwkJIyAnOjEwMDY0NCAxMDA2NDQgMDNiMjE4MjYwZTk5Yjc4YzZkZjBlZDM3OGU1OWVkOTIwNWNjYzk2ZCAzYjkzZDVlN2NjN2Y3ZGQ0ZWJlZDEzYTVjYzFhNGFkOTc2ZmM5NGQ4IE0gICAgICBscy1maWxlcy5jJworCQkjICc6MTAwNjQ0IDEwMDY0NCA3ZjkyODE5ODUwODY5NzFkMzg3N2FjYTI3NzA0ZjJhYWY5YzQ0OGNlIGJjMTkwZWJjNzFiYmQ5MjNmMmI3MjhlNTA1NDA4ZjVlNTRiZDA3M2EgTSAgICAgIHJldi10cmVlLmMnCisJCSRsaW5lID1+IG0vXjooWzAtN117Nn0pIChbMC03XXs2fSkgKFswLTlhLWZBLUZdezQwfSkgKFswLTlhLWZBLUZdezQwfSkgKC4pXHQoLiopJC87CisJCW15ICRmcm9tX21vZGUgPSAkMTsKKwkJbXkgJHRvX21vZGUgPSAkMjsKKwkJbXkgJGZyb21faWQgPSAkMzsKKwkJbXkgJHRvX2lkID0gJDQ7CisJCW15ICRzdGF0dXMgPSAkNTsKKwkJbXkgJGZpbGUgPSB2YWxpZGF0ZV9pbnB1dCh1bnF1b3RlKCQ2KSk7CisJCWlmICgkc3RhdHVzIGVxICJBIikgeworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJkaWZmX2luZm9cIj4iIC4gIGZpbGVfdHlwZSgkdG9fbW9kZSkgLiAiOiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgJHRvX2lkKSAuICIobmV3KSIgLgorCQkJICAgICAgIjwvZGl2PlxuIjsKKwkJCWdpdF9kaWZmX3ByaW50KHVuZGVmLCAiL2Rldi9udWxsIiwgJHRvX2lkLCAiYi8kZmlsZSIpOworCQl9IGVsc2lmICgkc3RhdHVzIGVxICJEIikgeworCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJkaWZmX2luZm9cIj4iIC4gZmlsZV90eXBlKCRmcm9tX21vZGUpIC4gIjoiIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JGZyb21faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgJGZyb21faWQpIC4gIihkZWxldGVkKSIgLgorCQkJICAgICAgIjwvZGl2PlxuIjsKKwkJCWdpdF9kaWZmX3ByaW50KCRmcm9tX2lkLCAiYS8kZmlsZSIsIHVuZGVmLCAiL2Rldi9udWxsIik7CisJCX0gZWxzaWYgKCRzdGF0dXMgZXEgIk0iKSB7CisJCQlpZiAoJGZyb21faWQgbmUgJHRvX2lkKSB7CisJCQkJcHJpbnQgIjxkaXYgY2xhc3M9XCJkaWZmX2luZm9cIj4iIC4KKwkJCQkgICAgICBmaWxlX3R5cGUoJGZyb21fbW9kZSkgLiAiOiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoPSRmcm9tX2lkO2hiPSRoYXNoO2Y9JGZpbGUiKX0sICRmcm9tX2lkKSAuCisJCQkJICAgICAgIiAtPiAiIC4KKwkJCQkgICAgICBmaWxlX3R5cGUoJHRvX21vZGUpIC4gIjoiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWJsb2I7aD0kdG9faWQ7aGI9JGhhc2g7Zj0kZmlsZSIpfSwgJHRvX2lkKTsKKwkJCQlwcmludCAiPC9kaXY+XG4iOworCQkJCWdpdF9kaWZmX3ByaW50KCRmcm9tX2lkLCAiYS8kZmlsZSIsICAkdG9faWQsICJiLyRmaWxlIik7CisJCQl9CisJCX0KKwl9CisJcHJpbnQgIjxici8+XG4iIC4KKwkgICAgICAiPC9kaXY+IjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KKworc3ViIGdpdF9jb21taXRkaWZmX3BsYWluIHsKKwlta2RpcigkZ2l0X3RlbXAsIDA3MDApOworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCBkaWZmLXRyZWUgLXIgJGhhc2hfcGFyZW50ICRoYXNoIiBvciBkaWVfZXJyb3IodW5kZWYsICJPcGVuIGZhaWxlZC4iKTsKKwlteSAoQGRpZmZ0cmVlKSA9IG1hcCB7IGNob21wOyAkXyB9IDwkZmQ+OworCWNsb3NlICRmZCBvciBkaWVfZXJyb3IodW5kZWYsICJSZWFkaW5nIGRpZmYtdHJlZSBmYWlsZWQuIik7CisKKwkjIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBuZXh0IHRhZyBhZnRlciB0aGlzIGNvbW1pdAorCW15ICR0YWduYW1lOworCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigidGFncyIpOworCW9wZW4gJGZkLCAiLXwiLCAiJEdJVCByZXYtbGlzdCBIRUFEIjsKKwljaG9tcCAobXkgKEBjb21taXRzKSA9IDwkZmQ+KTsKKwljbG9zZSAkZmQ7CisJZm9yZWFjaCBteSAkY29tbWl0IChAY29tbWl0cykgeworCQlpZiAoZGVmaW5lZCAkcmVmcy0+eyRjb21taXR9KSB7CisJCQkkdGFnbmFtZSA9ICRyZWZzLT57JGNvbW1pdH0KKwkJfQorCQlpZiAoJGNvbW1pdCBlcSAkaGFzaCkgeworCQkJbGFzdDsKKwkJfQorCX0KKworCXByaW50ICRjZ2ktPmhlYWRlcigtdHlwZSA9PiAidGV4dC9wbGFpbiIsIC1jaGFyc2V0ID0+ICd1dGYtOCcsICctY29udGVudC1kaXNwb3NpdGlvbicgPT4gImlubGluZTsgZmlsZW5hbWU9XCJnaXQtJGhhc2gucGF0Y2hcIiIpOworCW15ICVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkaGFzaCk7CisJbXkgJWFkID0gZGF0ZV9zdHIoJGNveydhdXRob3JfZXBvY2gnfSwgJGNveydhdXRob3JfdHonfSk7CisJbXkgJGNvbW1lbnQgPSAkY297J2NvbW1lbnQnfTsKKwlwcmludCAiRnJvbTogJGNveydhdXRob3InfVxuIiAuCisJICAgICAgIkRhdGU6ICRhZHsncmZjMjgyMid9ICgkYWR7J3R6X2xvY2FsJ30pXG4iLgorCSAgICAgICJTdWJqZWN0OiAkY297J3RpdGxlJ31cbiI7CisJaWYgKGRlZmluZWQgJHRhZ25hbWUpIHsKKwkgICAgICBwcmludCAiWC1HaXQtVGFnOiAkdGFnbmFtZVxuIjsKKwl9CisJcHJpbnQgIlgtR2l0LVVybDogJG15X3VybD9wPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoXG4iIC4KKwkgICAgICAiXG4iOworCisJZm9yZWFjaCBteSAkbGluZSAoQCRjb21tZW50KSB7OworCQlwcmludCAiJGxpbmVcbiI7CisJfQorCXByaW50ICItLS1cblxuIjsKKworCWZvcmVhY2ggbXkgJGxpbmUgKEBkaWZmdHJlZSkgeworCQkkbGluZSA9fiBtL146KFswLTddezZ9KSAoWzAtN117Nn0pIChbMC05YS1mQS1GXXs0MH0pIChbMC05YS1mQS1GXXs0MH0pICguKVx0KC4qKSQvOworCQlteSAkZnJvbV9pZCA9ICQzOworCQlteSAkdG9faWQgPSAkNDsKKwkJbXkgJHN0YXR1cyA9ICQ1OworCQlteSAkZmlsZSA9ICQ2OworCQlpZiAoJHN0YXR1cyBlcSAiQSIpIHsKKwkJCWdpdF9kaWZmX3ByaW50KHVuZGVmLCAiL2Rldi9udWxsIiwgJHRvX2lkLCAiYi8kZmlsZSIsICJwbGFpbiIpOworCQl9IGVsc2lmICgkc3RhdHVzIGVxICJEIikgeworCQkJZ2l0X2RpZmZfcHJpbnQoJGZyb21faWQsICJhLyRmaWxlIiwgdW5kZWYsICIvZGV2L251bGwiLCAicGxhaW4iKTsKKwkJfSBlbHNpZiAoJHN0YXR1cyBlcSAiTSIpIHsKKwkJCWdpdF9kaWZmX3ByaW50KCRmcm9tX2lkLCAiYS8kZmlsZSIsICAkdG9faWQsICJiLyRmaWxlIiwgInBsYWluIik7CisJCX0KKwl9Cit9CisKK3N1YiBnaXRfaGlzdG9yeSB7CisJaWYgKCFkZWZpbmVkICRoYXNoX2Jhc2UpIHsKKwkJJGhhc2hfYmFzZSA9IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworCX0KKwlteSAkZnR5cGU7CisJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRoYXNoX2Jhc2UpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdC4iKTsKKwl9CisJbXkgJHJlZnMgPSByZWFkX2luZm9fcmVmKCk7CisJZ2l0X2hlYWRlcl9odG1sKCk7CisJcHJpbnQgIjxkaXYgY2xhc3M9XCJwYWdlX25hdlwiPlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXN1bW1hcnkiKX0sICJzdW1tYXJ5IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAic2hvcnRsb2ciKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9bG9nIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoX2Jhc2UiKX0sICJjb21taXQiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRoYXNoX2Jhc2UiKX0sICJjb21taXRkaWZmIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kaGFzaF9iYXNlIil9LCAidHJlZSIpIC4KKwkgICAgICAiPGJyLz48YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaF9iYXNlIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSkgLiAiXG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCWlmICghZGVmaW5lZCAkaGFzaCAmJiBkZWZpbmVkICRmaWxlX25hbWUpIHsKKwkJJGhhc2ggPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkaGFzaF9iYXNlLCAkZmlsZV9uYW1lKTsKKwl9CisJaWYgKGRlZmluZWQgJGhhc2gpIHsKKwkJJGZ0eXBlID0gZ2l0X2dldF90eXBlKCRoYXNoKTsKKwl9CisJZ2l0X3ByaW50X3BhZ2VfcGF0aCgkZmlsZV9uYW1lLCAkZnR5cGUpOworCisJb3BlbiBteSAkZmQsICItfCIsCisJCSIkR0lUIHJldi1saXN0IC0tZnVsbC1oaXN0b3J5ICRoYXNoX2Jhc2UgLS0gXCckZmlsZV9uYW1lXCciOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCXdoaWxlIChteSAkbGluZSA9IDwkZmQ+KSB7CisJCWlmICgkbGluZSA9fiBtL14oWzAtOWEtZkEtRl17NDB9KS8peworCQkJbXkgJGNvbW1pdCA9ICQxOworCQkJbXkgJWNvID0gZ2l0X3JlYWRfY29tbWl0KCRjb21taXQpOworCQkJaWYgKCElY28pIHsKKwkJCQluZXh0OworCQkJfQorCQkJbXkgJHJlZiA9ICIiOworCQkJaWYgKGRlZmluZWQgJHJlZnMtPnskY29tbWl0fSkgeworCQkJCSRyZWYgPSAiIDxzcGFuIGNsYXNzPVwidGFnXCI+IiAuIGVzY19odG1sKCRyZWZzLT57JGNvbW1pdH0pIC4gIjwvc3Bhbj4iOworCQkJfQorCQkJaWYgKCRhbHRlcm5hdGUpIHsKKwkJCQlwcmludCAiPHRyIGNsYXNzPVwiZGFya1wiPlxuIjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImxpZ2h0XCI+XG4iOworCQkJfQorCQkJJGFsdGVybmF0ZSBePSAxOworCQkJcHJpbnQgIjx0ZCB0aXRsZT1cIiRjb3snYWdlX3N0cmluZ19hZ2UnfVwiPjxpPiRjb3snYWdlX3N0cmluZ19kYXRlJ308L2k+PC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD48aT4iIC4gZXNjX2h0bWwoY2hvcF9zdHIoJGNveydhdXRob3JfbmFtZSd9LCAxNSwgMykpIC4gIjwvaT48L3RkPlxuIiAuCisJCQkgICAgICAiPHRkPiIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpLCAtY2xhc3MgPT4gImxpc3QifSwgIjxiPiIgLgorCQkJICAgICAgZXNjX2h0bWwoY2hvcF9zdHIoJGNveyd0aXRsZSd9LCA1MCkpIC4gIiRyZWY8L2I+IikgLiAiPC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZCBjbGFzcz1cImxpbmtcIj4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0Iil9LCAiY29tbWl0IikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0ZGlmZjtoPSRjb21taXQiKX0sICJjb21taXRkaWZmIikgLgorCQkJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYjtoYj0kY29tbWl0O2Y9JGZpbGVfbmFtZSIpfSwgImJsb2IiKTsKKwkJCW15ICRibG9iID0gZ2l0X2dldF9oYXNoX2J5X3BhdGgoJGhhc2hfYmFzZSwgJGZpbGVfbmFtZSk7CisJCQlteSAkYmxvYl9wYXJlbnQgPSBnaXRfZ2V0X2hhc2hfYnlfcGF0aCgkY29tbWl0LCAkZmlsZV9uYW1lKTsKKwkJCWlmIChkZWZpbmVkICRibG9iICYmIGRlZmluZWQgJGJsb2JfcGFyZW50ICYmICRibG9iIG5lICRibG9iX3BhcmVudCkgeworCQkJCXByaW50ICIgfCAiIC4KKwkJCQkkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9YmxvYmRpZmY7aD0kYmxvYjtocD0kYmxvYl9wYXJlbnQ7aGI9JGNvbW1pdDtmPSRmaWxlX25hbWUiKX0sCisJCQkJImRpZmYgdG8gY3VycmVudCIpOworCQkJfQorCQkJcHJpbnQgIjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8L3RyPlxuIjsKKwkJfQorCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJY2xvc2UgJGZkOworCWdpdF9mb290ZXJfaHRtbCgpOworfQorCitzdWIgZ2l0X3NlYXJjaCB7CisJaWYgKCFkZWZpbmVkICRzZWFyY2h0ZXh0KSB7CisJCWRpZV9lcnJvcigiIiwgIlRleHQgZmllbGQgZW1wdHkuIik7CisJfQorCWlmICghZGVmaW5lZCAkaGFzaCkgeworCQkkaGFzaCA9IGdpdF9yZWFkX2hlYWQoJHByb2plY3QpOworCX0KKwlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGhhc2gpOworCWlmICghJWNvKSB7CisJCWRpZV9lcnJvcih1bmRlZiwgIlVua25vd24gY29tbWl0IG9iamVjdC4iKTsKKwl9CisJIyBwaWNrYXhlIG1heSB0YWtlIGFsbCByZXNvdXJjZXMgb2YgeW91ciBib3ggYW5kIHJ1biBmb3Igc2V2ZXJhbCBtaW51dGVzCisJIyB3aXRoIGV2ZXJ5IHF1ZXJ5IC0gc28gZGVjaWRlIGJ5IHlvdXJzZWxmIGhvdyBwdWJsaWMgeW91IG1ha2UgdGhpcyBmZWF0dXJlIDopCisJbXkgJGNvbW1pdF9zZWFyY2ggPSAxOworCW15ICRhdXRob3Jfc2VhcmNoID0gMDsKKwlteSAkY29tbWl0dGVyX3NlYXJjaCA9IDA7CisJbXkgJHBpY2theGVfc2VhcmNoID0gMDsKKwlpZiAoJHNlYXJjaHRleHQgPX4gcy9eYXV0aG9yXFw6Ly9pKSB7CisJCSRhdXRob3Jfc2VhcmNoID0gMTsKKwl9IGVsc2lmICgkc2VhcmNodGV4dCA9fiBzL15jb21taXR0ZXJcXDovL2kpIHsKKwkJJGNvbW1pdHRlcl9zZWFyY2ggPSAxOworCX0gZWxzaWYgKCRzZWFyY2h0ZXh0ID1+IHMvXnBpY2theGVcXDovL2kpIHsKKwkJJGNvbW1pdF9zZWFyY2ggPSAwOworCQkkcGlja2F4ZV9zZWFyY2ggPSAxOworCX0KKwlnaXRfaGVhZGVyX2h0bWwoKTsKKwlwcmludCAiPGRpdiBjbGFzcz1cInBhZ2VfbmF2XCI+XG4iIC4KKwkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9c3VtbWFyeTtoPSRoYXNoIil9LCAic3VtbWFyeSIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZyIpfSwgInNob3J0bG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWxvZztoPSRoYXNoIil9LCAibG9nIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoIil9LCAiY29tbWl0IikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdGRpZmY7aD0kaGFzaCIpfSwgImNvbW1pdGRpZmYiKSAuCisJICAgICAgIiB8ICIgLiAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9dHJlZTtoPSRjb3sndHJlZSd9O2hiPSRoYXNoIil9LCAidHJlZSIpIC4KKwkgICAgICAiPGJyLz48YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKworCXByaW50ICI8ZGl2PlxuIiAuCisJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRoYXNoIiksIC1jbGFzcyA9PiAidGl0bGUifSwgZXNjX2h0bWwoJGNveyd0aXRsZSd9KSkgLiAiXG4iIC4KKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWlmICgkY29tbWl0X3NlYXJjaCkgeworCQkkLyA9ICJcMCI7CisJCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCByZXYtbGlzdCAtLWhlYWRlciAtLXBhcmVudHMgJGhhc2giIG9yIG5leHQ7CisJCXdoaWxlIChteSAkY29tbWl0X3RleHQgPSA8JGZkPikgeworCQkJaWYgKCFncmVwIG0vJHNlYXJjaHRleHQvaSwgJGNvbW1pdF90ZXh0KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkYXV0aG9yX3NlYXJjaCAmJiAhZ3JlcCBtL1xuYXV0aG9yIC4qJHNlYXJjaHRleHQvaSwgJGNvbW1pdF90ZXh0KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkY29tbWl0dGVyX3NlYXJjaCAmJiAhZ3JlcCBtL1xuY29tbWl0dGVyIC4qJHNlYXJjaHRleHQvaSwgJGNvbW1pdF90ZXh0KSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCW15IEBjb21taXRfbGluZXMgPSBzcGxpdCAiXG4iLCAkY29tbWl0X3RleHQ7CisJCQlteSAlY28gPSBnaXRfcmVhZF9jb21taXQodW5kZWYsIFxAY29tbWl0X2xpbmVzKTsKKwkJCWlmICghJWNvKSB7CisJCQkJbmV4dDsKKwkJCX0KKwkJCWlmICgkYWx0ZXJuYXRlKSB7CisJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQl9IGVsc2UgeworCQkJCXByaW50ICI8dHIgY2xhc3M9XCJsaWdodFwiPlxuIjsKKwkJCX0KKwkJCSRhbHRlcm5hdGUgXj0gMTsKKwkJCXByaW50ICI8dGQgdGl0bGU9XCIkY297J2FnZV9zdHJpbmdfYWdlJ31cIj48aT4kY297J2FnZV9zdHJpbmdfZGF0ZSd9PC9pPjwvdGQ+XG4iIC4KKwkJCSAgICAgICI8dGQ+PGk+IiAuIGVzY19odG1sKGNob3Bfc3RyKCRjb3snYXV0aG9yX25hbWUnfSwgMTUsIDUpKSAuICI8L2k+PC90ZD5cbiIgLgorCQkJICAgICAgIjx0ZD4iIC4KKwkJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY297J2lkJ30iKSwgLWNsYXNzID0+ICJsaXN0In0sICI8Yj4iIC4gZXNjX2h0bWwoY2hvcF9zdHIoJGNveyd0aXRsZSd9LCA1MCkpIC4gIjwvYj48YnIvPiIpOworCQkJbXkgJGNvbW1lbnQgPSAkY297J2NvbW1lbnQnfTsKKwkJCWZvcmVhY2ggbXkgJGxpbmUgKEAkY29tbWVudCkgeworCQkJCWlmICgkbGluZSA9fiBtL14oLiopKCRzZWFyY2h0ZXh0KSguKikkL2kpIHsKKwkJCQkJbXkgJGxlYWQgPSBlc2NfaHRtbCgkMSkgfHwgIiI7CisJCQkJCSRsZWFkID0gY2hvcF9zdHIoJGxlYWQsIDMwLCAxMCk7CisJCQkJCW15ICRtYXRjaCA9IGVzY19odG1sKCQyKSB8fCAiIjsKKwkJCQkJbXkgJHRyYWlsID0gZXNjX2h0bWwoJDMpIHx8ICIiOworCQkJCQkkdHJhaWwgPSBjaG9wX3N0cigkdHJhaWwsIDMwLCAxMCk7CisJCQkJCW15ICR0ZXh0ID0gIiRsZWFkPHNwYW4gY2xhc3M9XCJtYXRjaFwiPiRtYXRjaDwvc3Bhbj4kdHJhaWwiOworCQkJCQlwcmludCBjaG9wX3N0cigkdGV4dCwgODAsIDUpIC4gIjxici8+XG4iOworCQkJCX0KKwkJCX0KKwkJCXByaW50ICI8L3RkPlxuIiAuCisJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJICAgICAgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPWNvbW1pdDtoPSRjb3snaWQnfSIpfSwgImNvbW1pdCIpIC4KKwkJCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kY297J3RyZWUnfTtoYj0kY297J2lkJ30iKX0sICJ0cmVlIik7CisJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJICAgICAgIjwvdHI+XG4iOworCQl9CisJCWNsb3NlICRmZDsKKwl9CisKKwlpZiAoJHBpY2theGVfc2VhcmNoKSB7CisJCSQvID0gIlxuIjsKKwkJb3BlbiBteSAkZmQsICItfCIsICIkR0lUIHJldi1saXN0ICRoYXNoIHwgJEdJVCBkaWZmLXRyZWUgLXIgLS1zdGRpbiAtU1wnJHNlYXJjaHRleHRcJyI7CisJCXVuZGVmICVjbzsKKwkJbXkgQGZpbGVzOworCQl3aGlsZSAobXkgJGxpbmUgPSA8JGZkPikgeworCQkJaWYgKCVjbyAmJiAkbGluZSA9fiBtL146KFswLTddezZ9KSAoWzAtN117Nn0pIChbMC05YS1mQS1GXXs0MH0pIChbMC05YS1mQS1GXXs0MH0pICguKVx0KC4qKSQvKSB7CisJCQkJbXkgJXNldDsKKwkJCQkkc2V0eydmaWxlJ30gPSAkNjsKKwkJCQkkc2V0eydmcm9tX2lkJ30gPSAkMzsKKwkJCQkkc2V0eyd0b19pZCd9ID0gJDQ7CisJCQkJJHNldHsnaWQnfSA9ICRzZXR7J3RvX2lkJ307CisJCQkJaWYgKCRzZXR7J2lkJ30gPX4gbS8wezQwfS8pIHsKKwkJCQkJJHNldHsnaWQnfSA9ICRzZXR7J2Zyb21faWQnfTsKKwkJCQl9CisJCQkJaWYgKCRzZXR7J2lkJ30gPX4gbS8wezQwfS8pIHsKKwkJCQkJbmV4dDsKKwkJCQl9CisJCQkJcHVzaCBAZmlsZXMsIFwlc2V0OworCQkJfSBlbHNpZiAoJGxpbmUgPX4gbS9eKFswLTlhLWZBLUZdezQwfSkkLyl7CisJCQkJaWYgKCVjbykgeworCQkJCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCQkJCX0KKwkJCQkJJGFsdGVybmF0ZSBePSAxOworCQkJCQlwcmludCAiPHRkIHRpdGxlPVwiJGNveydhZ2Vfc3RyaW5nX2FnZSd9XCI+PGk+JGNveydhZ2Vfc3RyaW5nX2RhdGUnfTwvaT48L3RkPlxuIiAuCisJCQkJCSAgICAgICI8dGQ+PGk+IiAuIGVzY19odG1sKGNob3Bfc3RyKCRjb3snYXV0aG9yX25hbWUnfSwgMTUsIDUpKSAuICI8L2k+PC90ZD5cbiIgLgorCQkJCQkgICAgICAiPHRkPiIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNveydpZCd9IiksIC1jbGFzcyA9PiAibGlzdCJ9LCAiPGI+IiAuCisJCQkJCSAgICAgIGVzY19odG1sKGNob3Bfc3RyKCRjb3sndGl0bGUnfSwgNTApKSAuICI8L2I+PGJyLz4iKTsKKwkJCQkJd2hpbGUgKG15ICRzZXRyZWYgPSBzaGlmdCBAZmlsZXMpIHsKKwkJCQkJCW15ICVzZXQgPSAlJHNldHJlZjsKKwkJCQkJCXByaW50ICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1ibG9iO2g9JHNldHsnaWQnfTtoYj0kY297J2lkJ307Zj0kc2V0eydmaWxlJ30iKSwgY2xhc3MgPT4gImxpc3QifSwKKwkJCQkJCSAgICAgICI8c3BhbiBjbGFzcz1cIm1hdGNoXCI+IiAuIGVzY19odG1sKCRzZXR7J2ZpbGUnfSkgLiAiPC9zcGFuPiIpIC4KKwkJCQkJCSAgICAgICI8YnIvPlxuIjsKKwkJCQkJfQorCQkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCQkgICAgICAiPHRkIGNsYXNzPVwibGlua1wiPiIgLgorCQkJCQkgICAgICAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNveydpZCd9Iil9LCAiY29tbWl0IikgLgorCQkJCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT10cmVlO2g9JGNveyd0cmVlJ307aGI9JGNveydpZCd9Iil9LCAidHJlZSIpOworCQkJCQlwcmludCAiPC90ZD5cbiIgLgorCQkJCQkgICAgICAiPC90cj5cbiI7CisJCQkJfQorCQkJCSVjbyA9IGdpdF9yZWFkX2NvbW1pdCgkMSk7CisJCQl9CisJCX0KKwkJY2xvc2UgJGZkOworCX0KKwlwcmludCAiPC90YWJsZT5cbiI7CisJZ2l0X2Zvb3Rlcl9odG1sKCk7Cit9CisKK3N1YiBnaXRfc2hvcnRsb2cgeworCW15ICRoZWFkID0gZ2l0X3JlYWRfaGVhZCgkcHJvamVjdCk7CisJaWYgKCFkZWZpbmVkICRoYXNoKSB7CisJCSRoYXNoID0gJGhlYWQ7CisJfQorCWlmICghZGVmaW5lZCAkcGFnZSkgeworCQkkcGFnZSA9IDA7CisJfQorCW15ICRyZWZzID0gcmVhZF9pbmZvX3JlZigpOworCWdpdF9oZWFkZXJfaHRtbCgpOworCXByaW50ICI8ZGl2IGNsYXNzPVwicGFnZV9uYXZcIj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5Iil9LCAic3VtbWFyeSIpIC4KKwkgICAgICAiIHwgc2hvcnRsb2ciIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1sb2c7aD0kaGFzaCIpfSwgImxvZyIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kaGFzaCIpfSwgImNvbW1pdCIpIC4KKwkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGhhc2giKX0sICJjb21taXRkaWZmIikgLgorCSAgICAgICIgfCAiIC4gJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXRyZWU7aD0kaGFzaDtoYj0kaGFzaCIpfSwgInRyZWUiKSAuICI8YnIvPlxuIjsKKworCW15ICRsaW1pdCA9IHNwcmludGYoIi0tbWF4LWNvdW50PSVpIiwgKDEwMCAqICgkcGFnZSsxKSkpOworCW9wZW4gbXkgJGZkLCAiLXwiLCAiJEdJVCByZXYtbGlzdCAkbGltaXQgJGhhc2giIG9yIGRpZV9lcnJvcih1bmRlZiwgIk9wZW4gZmFpbGVkLiIpOworCW15IChAcmV2bGlzdCkgPSBtYXAgeyBjaG9tcDsgJF8gfSA8JGZkPjsKKwljbG9zZSAkZmQ7CisKKwlpZiAoJGhhc2ggbmUgJGhlYWQgfHwgJHBhZ2UpIHsKKwkJcHJpbnQgJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nIil9LCAiSEVBRCIpOworCX0gZWxzZSB7CisJCXByaW50ICJIRUFEIjsKKwl9CisJaWYgKCRwYWdlID4gMCkgeworCQlwcmludCAiICZzZG90OyAiIC4KKwkJJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2g7cGc9IiAuICgkcGFnZS0xKSksIC1hY2Nlc3NrZXkgPT4gInAiLCAtdGl0bGUgPT4gIkFsdC1wIn0sICJwcmV2Iik7CisJfSBlbHNlIHsKKwkJcHJpbnQgIiAmc2RvdDsgcHJldiI7CisJfQorCWlmICgkI3Jldmxpc3QgPj0gKDEwMCAqICgkcGFnZSsxKS0xKSkgeworCQlwcmludCAiICZzZG90OyAiIC4KKwkJJGNnaS0+YSh7LWhyZWYgPT4gIiRteV91cmk/IiAuIGVzY19wYXJhbSgicD0kcHJvamVjdDthPXNob3J0bG9nO2g9JGhhc2g7cGc9IiAuICgkcGFnZSsxKSksIC1hY2Nlc3NrZXkgPT4gIm4iLCAtdGl0bGUgPT4gIkFsdC1uIn0sICJuZXh0Iik7CisJfSBlbHNlIHsKKwkJcHJpbnQgIiAmc2RvdDsgbmV4dCI7CisJfQorCXByaW50ICI8YnIvPlxuIiAuCisJICAgICAgIjwvZGl2PlxuIjsKKwlwcmludCAiPGRpdj5cbiIgLgorCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zdW1tYXJ5IiksIC1jbGFzcyA9PiAidGl0bGUifSwgIiZuYnNwOyIpIC4KKwkgICAgICAiPC9kaXY+XG4iOworCXByaW50ICI8dGFibGUgY2VsbHNwYWNpbmc9XCIwXCI+XG4iOworCW15ICRhbHRlcm5hdGUgPSAwOworCWZvciAobXkgJGkgPSAoJHBhZ2UgKiAxMDApOyAkaSA8PSAkI3Jldmxpc3Q7ICRpKyspIHsKKwkJbXkgJGNvbW1pdCA9ICRyZXZsaXN0WyRpXTsKKwkJbXkgJHJlZiA9ICIiOworCQlpZiAoZGVmaW5lZCAkcmVmcy0+eyRjb21taXR9KSB7CisJCQkkcmVmID0gIiA8c3BhbiBjbGFzcz1cInRhZ1wiPiIgLiBlc2NfaHRtbCgkcmVmcy0+eyRjb21taXR9KSAuICI8L3NwYW4+IjsKKwkJfQorCQlteSAlY28gPSBnaXRfcmVhZF9jb21taXQoJGNvbW1pdCk7CisJCW15ICVhZCA9IGRhdGVfc3RyKCRjb3snYXV0aG9yX2Vwb2NoJ30pOworCQlpZiAoJGFsdGVybmF0ZSkgeworCQkJcHJpbnQgIjx0ciBjbGFzcz1cImRhcmtcIj5cbiI7CisJCX0gZWxzZSB7CisJCQlwcmludCAiPHRyIGNsYXNzPVwibGlnaHRcIj5cbiI7CisJCX0KKwkJJGFsdGVybmF0ZSBePSAxOworCQlwcmludCAiPHRkIHRpdGxlPVwiJGNveydhZ2Vfc3RyaW5nX2FnZSd9XCI+PGk+JGNveydhZ2Vfc3RyaW5nX2RhdGUnfTwvaT48L3RkPlxuIiAuCisJCSAgICAgICI8dGQ+PGk+IiAuIGVzY19odG1sKGNob3Bfc3RyKCRjb3snYXV0aG9yX25hbWUnfSwgMTApKSAuICI8L2k+PC90ZD5cbiIgLgorCQkgICAgICAiPHRkPiI7CisJCWlmIChsZW5ndGgoJGNveyd0aXRsZV9zaG9ydCd9KSA8IGxlbmd0aCgkY297J3RpdGxlJ30pKSB7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpLCAtY2xhc3MgPT4gImxpc3QiLCAtdGl0bGUgPT4gIiRjb3sndGl0bGUnfSJ9LAorCQkJICAgICAgIjxiPiIgLiBlc2NfaHRtbCgkY297J3RpdGxlX3Nob3J0J30pIC4gIiRyZWY8L2I+Iik7CisJCX0gZWxzZSB7CisJCQlwcmludCAkY2dpLT5hKHstaHJlZiA9PiAiJG15X3VyaT8iIC4gZXNjX3BhcmFtKCJwPSRwcm9qZWN0O2E9Y29tbWl0O2g9JGNvbW1pdCIpLCAtY2xhc3MgPT4gImxpc3QifSwKKwkJCSAgICAgICI8Yj4iIC4gZXNjX2h0bWwoJGNveyd0aXRsZV9zaG9ydCd9KSAuICIkcmVmPC9iPiIpOworCQl9CisJCXByaW50ICI8L3RkPlxuIiAuCisJCSAgICAgICI8dGQgY2xhc3M9XCJsaW5rXCI+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXQ7aD0kY29tbWl0Iil9LCAiY29tbWl0IikgLgorCQkgICAgICAiIHwgIiAuICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1jb21taXRkaWZmO2g9JGNvbW1pdCIpfSwgImNvbW1pdGRpZmYiKSAuCisJCSAgICAgICI8L3RkPlxuIiAuCisJCSAgICAgICI8L3RyPiI7CisJfQorCWlmICgkI3Jldmxpc3QgPj0gKDEwMCAqICgkcGFnZSsxKS0xKSkgeworCQlwcmludCAiPHRyPlxuIiAuCisJCSAgICAgICI8dGQ+IiAuCisJCSAgICAgICRjZ2ktPmEoey1ocmVmID0+ICIkbXlfdXJpPyIgLiBlc2NfcGFyYW0oInA9JHByb2plY3Q7YT1zaG9ydGxvZztoPSRoYXNoO3BnPSIgLiAoJHBhZ2UrMSkpLCAtdGl0bGUgPT4gIkFsdC1uIn0sICJuZXh0IikgLgorCQkgICAgICAiPC90ZD5cbiIgLgorCQkgICAgICAiPC90cj5cbiI7CisJfQorCXByaW50ICI8L3RhYmxlXG4+IjsKKwlnaXRfZm9vdGVyX2h0bWwoKTsKK30KZGlmZiAtLWdpdCBhL2dpdHdlYi9naXR3ZWIuY3NzIGIvZ2l0d2ViL2dpdHdlYi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmZGIxMwotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi9naXR3ZWIuY3NzCkBAIC0wLDAgKzEsMzI3IEBACitib2R5IHsKKwlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKwlmb250LXNpemU6IDEycHg7CisJYm9yZGVyOiBzb2xpZCAjZDlkOGQxOworCWJvcmRlci13aWR0aDogMXB4OworCW1hcmdpbjogMTBweDsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOworCWNvbG9yOiAjMDAwMDAwOworfQorCithIHsKKwljb2xvcjogIzAwMDBjYzsKK30KKworYTpob3ZlciwgYTp2aXNpdGVkLCBhOmFjdGl2ZSB7CisJY29sb3I6ICM4ODAwMDA7Cit9CisKK2Rpdi5wYWdlX2hlYWRlciB7CisJaGVpZ2h0OiAyNXB4OworCXBhZGRpbmc6IDhweDsKKwlmb250LXNpemU6IDE4cHg7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDhkMTsKK30KKworZGl2LnBhZ2VfaGVhZGVyIGE6dmlzaXRlZCwgYS5oZWFkZXIgeworCWNvbG9yOiAjMDAwMGNjOworfQorCitkaXYucGFnZV9oZWFkZXIgYTpob3ZlciB7CisJY29sb3I6ICM4ODAwMDA7Cit9CisKK2Rpdi5wYWdlX25hdiB7CisJcGFkZGluZzogOHB4OworfQorCitkaXYucGFnZV9uYXYgYTp2aXNpdGVkIHsKKwljb2xvcjogIzAwMDBjYzsKK30KKworZGl2LnBhZ2VfcGF0aCB7CisJcGFkZGluZzogOHB4OworCWJvcmRlcjogc29saWQgI2Q5ZDhkMTsKKwlib3JkZXItd2lkdGg6IDBweCAwcHggMXB4OworfQorCitkaXYucGFnZV9mb290ZXIgeworCWhlaWdodDogMTdweDsKKwlwYWRkaW5nOiA0cHggOHB4OworCWJhY2tncm91bmQtY29sb3I6ICNkOWQ4ZDE7Cit9CisKK2Rpdi5wYWdlX2Zvb3Rlcl90ZXh0IHsKKwlmbG9hdDogbGVmdDsKKwljb2xvcjogIzU1NTU1NTsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2Rpdi5wYWdlX2JvZHkgeworCXBhZGRpbmc6IDhweDsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorCitkaXYudGl0bGUsIGEudGl0bGUgeworCWRpc3BsYXk6IGJsb2NrOworCXBhZGRpbmc6IDZweCA4cHg7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlNjsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6ICMwMDAwMDA7Cit9CisKK2EudGl0bGU6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNkOWQ4ZDE7Cit9CisKK2Rpdi50aXRsZV90ZXh0IHsKKwlwYWRkaW5nOiA2cHggMHB4OworCWJvcmRlcjogc29saWQgI2Q5ZDhkMTsKKwlib3JkZXItd2lkdGg6IDBweCAwcHggMXB4OworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKK2Rpdi5sb2dfYm9keSB7CisJcGFkZGluZzogOHB4IDhweCA4cHggMTUwcHg7Cit9CisKK3NwYW4uYWdlIHsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJZmxvYXQ6IGxlZnQ7CisJd2lkdGg6IDE0MnB4OworCWZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworZGl2LnBhZ2VfYm9keSBzcGFuLnNpZ25vZmYgeworCWNvbG9yOiAjODg4ODg4OworfQorCitkaXYubG9nX2xpbmsgeworCXBhZGRpbmc6IDBweCA4cHg7CisJZm9udC1zaXplOiAxMHB4OworCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOworCWZvbnQtc3R5bGU6IG5vcm1hbDsKKwlwb3NpdGlvbjogcmVsYXRpdmU7CisJZmxvYXQ6IGxlZnQ7CisJd2lkdGg6IDEzNnB4OworfQorCitkaXYubGlzdF9oZWFkIHsKKwlwYWRkaW5nOiA2cHggOHB4IDRweDsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAxcHggMHB4IDBweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2EubGlzdCB7CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworCWNvbG9yOiAjMDAwMDAwOworfQorCithLmxpc3Q6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworCWNvbG9yOiAjODgwMDAwOworfQorCithLnRleHQgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogIzAwMDBjYzsKK30KKworYS50ZXh0OnZpc2l0ZWQgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogIzg4MDAwMDsKK30KKworYS50ZXh0OmhvdmVyIHsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKKwljb2xvcjogIzg4MDAwMDsKK30KKwordGFibGUgeworCXBhZGRpbmc6IDhweCA0cHg7Cit9CisKK3RhYmxlLnByb2plY3RfbGlzdCB7CisJYm9yZGVyLXNwYWNpbmc6IDA7Cit9CisKK3RhYmxlLmRpZmZfdHJlZSB7CisJYm9yZGVyLXNwYWNpbmc6IDA7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKK30KKwordGFibGUuYmxhbWUgeworCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cit9CisKK3RoIHsKKwlwYWRkaW5nOiAycHggNXB4OworCWZvbnQtc2l6ZTogMTJweDsKKwl0ZXh0LWFsaWduOiBsZWZ0OworfQorCit0ci5saWdodDpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlNjsKK30KKwordHIuZGFyayB7CisJYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjZmMDsKK30KKwordHIuZGFyazpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlNjsKK30KKwordGQgeworCXBhZGRpbmc6IDJweCA1cHg7CisJZm9udC1zaXplOiAxMnB4OworCXZlcnRpY2FsLWFsaWduOiB0b3A7Cit9CisKK3RkLmxpbmsgeworCXBhZGRpbmc6IDJweCA1cHg7CisJZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7CisJZm9udC1zaXplOiAxMHB4OworfQorCit0ZC5zaGExIHsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworfQorCit0ZC5lcnJvciB7CisJY29sb3I6IHJlZDsKKwliYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7Cit9CisKK3RhYmxlLmRpZmZfdHJlZSBzcGFuLmZpbGVfc3RhdHVzLm5ldyB7CisJY29sb3I6ICMwMDgwMDA7Cit9CisKK3RhYmxlLmRpZmZfdHJlZSBzcGFuLmZpbGVfc3RhdHVzLmRlbGV0ZWQgeworCWNvbG9yOiAjYzAwMDAwOworfQorCit0YWJsZS5kaWZmX3RyZWUgc3Bhbi5maWxlX3N0YXR1cy5tb3ZlZCwKK3RhYmxlLmRpZmZfdHJlZSBzcGFuLmZpbGVfc3RhdHVzLm1vZGVfY2huZ2UgeworCWNvbG9yOiAjNzc3Nzc3OworfQorCisvKiBhZ2UyOiA2MCo2MCoyNCoyIDw9IGFnZSAqLwordGFibGUucHJvamVjdF9saXN0IHRkLmFnZTIsIHRhYmxlLmJsYW1lIHRkLmFnZTIgeworCWZvbnQtc3R5bGU6IGl0YWxpYzsKK30KKworLyogYWdlMTogNjAqNjAqMiA8PSBhZ2UgPCA2MCo2MCoyNCoyICovCit0YWJsZS5wcm9qZWN0X2xpc3QgdGQuYWdlMSB7CisJY29sb3I6ICMwMDk5MDA7CisJZm9udC1zdHlsZTogaXRhbGljOworfQorCit0YWJsZS5ibGFtZSB0ZC5hZ2UxIHsKKwljb2xvcjogIzAwOTkwMDsKKwliYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKK30KKworLyogYWdlMDogYWdlIDwgNjAqNjAqMiAqLwordGFibGUucHJvamVjdF9saXN0IHRkLmFnZTAgeworCWNvbG9yOiAjMDA5OTAwOworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKwordGFibGUuYmxhbWUgdGQuYWdlMCB7CisJY29sb3I6ICMwMDk5MDA7CisJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3RkLnByZSwgZGl2LnByZSwgZGl2LmRpZmYgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisJZm9udC1zaXplOiAxMnB4OworCXdoaXRlLXNwYWNlOiBwcmU7Cit9CisKK3RkLm1vZGUgeworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cit9CisKK2Rpdi5kaWZmLmFkZCB7CisJY29sb3I6ICMwMDg4MDA7Cit9CisKK2Rpdi5kaWZmLnJlbSB7CisJY29sb3I6ICNjYzAwMDA7Cit9CisKK2Rpdi5kaWZmLmNodW5rX2hlYWRlciB7CisJY29sb3I6ICM5OTAwOTk7Cit9CisKK2Rpdi5kaWZmX2luZm8geworCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisJY29sb3I6ICMwMDAwOTk7CisJYmFja2dyb3VuZC1jb2xvcjogI2VkZWNlNjsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKK2Rpdi5pbmRleF9pbmNsdWRlIHsKKwlib3JkZXI6IHNvbGlkICNkOWQ4ZDE7CisJYm9yZGVyLXdpZHRoOiAwcHggMHB4IDFweDsKKwlwYWRkaW5nOiAxMnB4IDhweDsKK30KKworZGl2LnNlYXJjaCB7CisJbWFyZ2luOiA0cHggOHB4OworCXBvc2l0aW9uOiBhYnNvbHV0ZTsKKwl0b3A6IDU2cHg7CisJcmlnaHQ6IDEycHgKK30KKwordGQubGluZW5yIHsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKworYS5saW5lbnIgeworCWNvbG9yOiAjOTk5OTk5OworCXRleHQtZGVjb3JhdGlvbjogbm9uZQorfQorCithLnJzc19sb2dvIHsKKwlmbG9hdDogcmlnaHQ7CisJcGFkZGluZzogM3B4IDBweDsKKwl3aWR0aDogMzVweDsKKwlsaW5lLWhlaWdodDogMTBweDsKKwlib3JkZXI6IDFweCBzb2xpZDsKKwlib3JkZXItY29sb3I6ICNmY2M3YTUgIzdkMzMwMiAjM2UxYTAxICNmZjk1NGU7CisJY29sb3I6ICNmZmZmZmY7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZmNjYwMDsKKwlmb250LXdlaWdodDogYm9sZDsKKwlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKKwlmb250LXNpemU6IDEwcHg7CisJdGV4dC1hbGlnbjogY2VudGVyOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworYS5yc3NfbG9nbzpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlNTUwMDsKK30KKworc3Bhbi50YWcgeworCXBhZGRpbmc6IDBweCA0cHg7CisJZm9udC1zaXplOiAxMHB4OworCWZvbnQtd2VpZ2h0OiBub3JtYWw7CisJYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZhYTsKKwlib3JkZXI6IDFweCBzb2xpZDsKKwlib3JkZXItY29sb3I6ICNmZmZmY2MgI2ZmZWUwMCAjZmZlZTAwICNmZmZmY2M7Cit9CisKK3NwYW4uYXRuaWdodCB7CisJY29sb3I6ICNjYzAwMDA7Cit9CisKK3NwYW4ubWF0Y2ggeworCWNvbG9yOiAjZTAwMDAwOworfQpkaWZmIC0tZ2l0ICJhL2dpdHdlYi90ZXN0L01cMzAzXDI0NHJjaGVuIiAiYi9naXR3ZWIvdGVzdC9NXDMwM1wyNDRyY2hlbiIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3YTFkMwotLS0gL2Rldi9udWxsCisrKyAiYi9naXR3ZWIvdGVzdC9NXDMwM1wyNDRyY2hlbiIKQEAgLTAsMCArMSwyIEBACitNw6RyY2hlbgorTeRyY2hlbgpkaWZmIC0tZ2l0IGEvZ2l0d2ViL3Rlc3QvZmlsZSB3aXRoIHNwYWNlcyBiL2dpdHdlYi90ZXN0L2ZpbGUgd2l0aCBzcGFjZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwODU0MwotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi90ZXN0L2ZpbGUgd2l0aCBzcGFjZXMKQEAgLTAsMCArMSw0IEBACitUaGlzCitmaWxlbmFtZQorY29udGFpbnMKK3NwYWNlcy4KZGlmZiAtLWdpdCBhL2dpdHdlYi90ZXN0L2ZpbGUrcGx1cytzaWduIGIvZ2l0d2ViL3Rlc3QvZmlsZStwbHVzK3NpZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwNTI3OAotLS0gL2Rldi9udWxsCisrKyBiL2dpdHdlYi90ZXN0L2ZpbGUrcGx1cytzaWduCkBAIC0wLDAgKzEsNiBAQAorVGhpcworZmlsZW5hbWUKK2NvbnRhaW5zCisrCitwbHVzCitjaGFycy4KZGlmZiAtLWdpdCBhL2hhc2gtb2JqZWN0LmMgYi9oYXNoLW9iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODllNjQKLS0tIC9kZXYvbnVsbAorKysgYi9oYXNoLW9iamVjdC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEp1bmlvIEMgSGFtYW5vLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKworc3RhdGljIHZvaWQgaGFzaF9vYmplY3QoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHdyaXRlX29iamVjdCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgfHwKKwkgICAgZnN0YXQoZmQsICZzdCkgPCAwIHx8CisJICAgIGluZGV4X2ZkKHNoYTEsIGZkLCAmc3QsIHdyaXRlX29iamVjdCwgdHlwZSkpCisJCWRpZSh3cml0ZV9vYmplY3QKKwkJICAgID8gIlVuYWJsZSB0byBhZGQgJXMgdG8gZGF0YWJhc2UiCisJCSAgICA6ICJVbmFibGUgdG8gaGFzaCAlcyIsIHBhdGgpOworCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKK30KKworc3RhdGljIHZvaWQgaGFzaF9zdGRpbihjb25zdCBjaGFyICp0eXBlLCBpbnQgd3JpdGVfb2JqZWN0KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaWYgKGluZGV4X3BpcGUoc2hhMSwgMCwgdHlwZSwgd3JpdGVfb2JqZWN0KSkKKwkJZGllKCJVbmFibGUgdG8gYWRkIHN0ZGluIHRvIGRhdGFiYXNlIik7CisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBoYXNoX29iamVjdF91c2FnZVtdID0KKyJnaXQtaGFzaC1vYmplY3QgWy10IDx0eXBlPl0gWy13XSBbLS1zdGRpbl0gPGZpbGU+Li4uIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnR5cGUgPSBibG9iX3R5cGU7CisJaW50IHdyaXRlX29iamVjdCA9IDA7CisJY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKKwlpbnQgcHJlZml4X2xlbmd0aCA9IC0xOworCWludCBub19tb3JlX2ZsYWdzID0gMDsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWlmICghbm9fbW9yZV9mbGFncyAmJiBhcmd2W2ldWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJndltpXSwgIi10IikpIHsKKwkJCQlpZiAoYXJnYyA8PSArK2kpCisJCQkJCXVzYWdlKGhhc2hfb2JqZWN0X3VzYWdlKTsKKwkJCQl0eXBlID0gYXJndltpXTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi13IikpIHsKKwkJCQlpZiAocHJlZml4X2xlbmd0aCA8IDApIHsKKwkJCQkJcHJlZml4ID0gc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCQkJCQlwcmVmaXhfbGVuZ3RoID0KKwkJCQkJCXByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwkJCQl9CisJCQkJd3JpdGVfb2JqZWN0ID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tIikpIHsKKwkJCQlub19tb3JlX2ZsYWdzID0gMTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0taGVscCIpKQorCQkJCXVzYWdlKGhhc2hfb2JqZWN0X3VzYWdlKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi0tc3RkaW4iKSkgeworCQkJCWhhc2hfc3RkaW4odHlwZSwgd3JpdGVfb2JqZWN0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCQl1c2FnZShoYXNoX29iamVjdF91c2FnZSk7CisJCX0KKwkJZWxzZSB7CisJCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQkJaWYgKDAgPD0gcHJlZml4X2xlbmd0aCkKKwkJCQlhcmcgPSBwcmVmaXhfZmlsZW5hbWUocHJlZml4LCBwcmVmaXhfbGVuZ3RoLAorCQkJCQkJICAgICAgYXJnKTsKKwkJCWhhc2hfb2JqZWN0KGFyZywgdHlwZSwgd3JpdGVfb2JqZWN0KTsKKwkJCW5vX21vcmVfZmxhZ3MgPSAxOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvaHR0cC1mZXRjaC5jIGIvaHR0cC1mZXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNWZjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9odHRwLWZldGNoLmMKQEAgLTAsMCArMSwxMjk5IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJodHRwLmgiCisKKyNpZm5kZWYgTk9fRVhQQVQKKyNpbmNsdWRlIDxleHBhdC5oPgorCisvKiBEZWZpbml0aW9ucyBmb3IgREFWIHJlcXVlc3RzICovCisjZGVmaW5lIERBVl9QUk9QRklORCAiUFJPUEZJTkQiCisjZGVmaW5lIERBVl9QUk9QRklORF9SRVNQICIubXVsdGlzdGF0dXMucmVzcG9uc2UiCisjZGVmaW5lIERBVl9QUk9QRklORF9OQU1FICIubXVsdGlzdGF0dXMucmVzcG9uc2UuaHJlZiIKKyNkZWZpbmUgREFWX1BST1BGSU5EX0NPTExFQ1RJT04gIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5wcm9wc3RhdC5wcm9wLnJlc291cmNldHlwZS5jb2xsZWN0aW9uIgorI2RlZmluZSBQUk9QRklORF9BTExfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6cHJvcGZpbmQgeG1sbnM6RD1cIkRBVjpcIj5cbjxEOmFsbHByb3AvPlxuPC9EOnByb3BmaW5kPiIKKworLyogRGVmaW5pdGlvbnMgZm9yIHByb2Nlc3NpbmcgWE1MIERBViByZXNwb25zZXMgKi8KKyNpZm5kZWYgWE1MX1NUQVRVU19PSworZW51bSBYTUxfU3RhdHVzIHsKKyAgWE1MX1NUQVRVU19PSyA9IDEsCisgIFhNTF9TVEFUVVNfRVJST1IgPSAwCit9OworI2RlZmluZSBYTUxfU1RBVFVTX09LICAgIDEKKyNkZWZpbmUgWE1MX1NUQVRVU19FUlJPUiAwCisjZW5kaWYKKworLyogRmxhZ3MgdGhhdCBjb250cm9sIHJlbW90ZV9scyBwcm9jZXNzaW5nICovCisjZGVmaW5lIFBST0NFU1NfRklMRVMgKDF1IDw8IDApCisjZGVmaW5lIFBST0NFU1NfRElSUyAgKDF1IDw8IDEpCisjZGVmaW5lIFJFQ1VSU0lWRSAgICAgKDF1IDw8IDIpCisKKy8qIEZsYWdzIHRoYXQgcmVtb3RlX2xzIHBhc3NlcyB0byBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgSVNfRElSICgxdSA8PCAwKQorI2VuZGlmCisKKyNkZWZpbmUgUFJFVl9CVUZfU0laRSA0MDk2CisjZGVmaW5lIFJBTkdFX0hFQURFUl9TSVpFIDMwCisKK3N0YXRpYyBpbnQgY29tbWl0c19vbl9zdGRpbiA9IDA7CisKK3N0YXRpYyBpbnQgZ290X2FsdGVybmF0ZXMgPSAtMTsKK3N0YXRpYyBpbnQgY29ycnVwdF9vYmplY3RfZm91bmQgPSAwOworCitzdGF0aWMgc3RydWN0IGN1cmxfc2xpc3QgKm5vX3ByYWdtYV9oZWFkZXI7CisKK3N0cnVjdCBhbHRfYmFzZQoreworCWNvbnN0IGNoYXIgKmJhc2U7CisJaW50IHBhdGhfbGVuOworCWludCBnb3RfaW5kaWNlczsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja3M7CisJc3RydWN0IGFsdF9iYXNlICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCBhbHRfYmFzZSAqYWx0ID0gTlVMTDsKKworZW51bSBvYmplY3RfcmVxdWVzdF9zdGF0ZSB7CisJV0FJVElORywKKwlBQk9SVEVELAorCUFDVElWRSwKKwlDT01QTEVURSwKK307CisKK3N0cnVjdCBvYmplY3RfcmVxdWVzdAoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJc3RydWN0IGFsdF9iYXNlICpyZXBvOworCWNoYXIgKnVybDsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljaGFyIHRtcGZpbGVbUEFUSF9NQVhdOworCWludCBsb2NhbDsKKwllbnVtIG9iamVjdF9yZXF1ZXN0X3N0YXRlIHN0YXRlOworCUNVUkxjb2RlIGN1cmxfcmVzdWx0OworCWNoYXIgZXJyb3JzdHJbQ1VSTF9FUlJPUl9TSVpFXTsKKwlsb25nIGh0dHBfY29kZTsKKwl1bnNpZ25lZCBjaGFyIHJlYWxfc2hhMVsyMF07CisJU0hBX0NUWCBjOworCXpfc3RyZWFtIHN0cmVhbTsKKwlpbnQgenJldDsKKwlpbnQgcmVuYW1lOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBvYmplY3RfcmVxdWVzdCAqbmV4dDsKK307CisKK3N0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgeworCWNvbnN0IGNoYXIgKmJhc2U7CisJY2hhciAqdXJsOworCXN0cnVjdCBidWZmZXIgKmJ1ZmZlcjsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlpbnQgaHR0cF9zcGVjaWZpYzsKK307CisKKyNpZm5kZWYgTk9fRVhQQVQKK3N0cnVjdCB4bWxfY3R4Cit7CisJY2hhciAqbmFtZTsKKwlpbnQgbGVuOworCWNoYXIgKmNkYXRhOworCXZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHhtbF9jdHggKmN0eCwgaW50IHRhZ19jbG9zZWQpOworCXZvaWQgKnVzZXJEYXRhOworfTsKKworc3RydWN0IHJlbW90ZV9sc19jdHgKK3sKKwlzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG87CisJY2hhciAqcGF0aDsKKwl2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyk7CisJdm9pZCAqdXNlckRhdGE7CisJaW50IGZsYWdzOworCWNoYXIgKmRlbnRyeV9uYW1lOworCWludCBkZW50cnlfZmxhZ3M7CisJaW50IHJjOworCXN0cnVjdCByZW1vdGVfbHNfY3R4ICpwYXJlbnQ7Cit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9iamVjdF9xdWV1ZV9oZWFkID0gTlVMTDsKKworc3RhdGljIHNpemVfdCBmd3JpdGVfc2hhMV9maWxlKHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsIHNpemVfdCBubWVtYiwKKwkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgZXhwbls0MDk2XTsKKwlzaXplX3Qgc2l6ZSA9IGVsdHNpemUgKiBubWVtYjsKKwlpbnQgcG9zbiA9IDA7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxID0gKHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqKWRhdGE7CisJZG8geworCQlzc2l6ZV90IHJldHZhbCA9IHdyaXRlKG9ial9yZXEtPmxvY2FsLAorCQkJCSAgICAgICAoY2hhciAqKSBwdHIgKyBwb3NuLCBzaXplIC0gcG9zbik7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJcmV0dXJuIHBvc247CisJCXBvc24gKz0gcmV0dmFsOworCX0gd2hpbGUgKHBvc24gPCBzaXplKTsKKworCW9ial9yZXEtPnN0cmVhbS5hdmFpbF9pbiA9IHNpemU7CisJb2JqX3JlcS0+c3RyZWFtLm5leHRfaW4gPSBwdHI7CisJZG8geworCQlvYmpfcmVxLT5zdHJlYW0ubmV4dF9vdXQgPSBleHBuOworCQlvYmpfcmVxLT5zdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGV4cG4pOworCQlvYmpfcmVxLT56cmV0ID0gaW5mbGF0ZSgmb2JqX3JlcS0+c3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCQlTSEExX1VwZGF0ZSgmb2JqX3JlcS0+YywgZXhwbiwKKwkJCSAgICBzaXplb2YoZXhwbikgLSBvYmpfcmVxLT5zdHJlYW0uYXZhaWxfb3V0KTsKKwl9IHdoaWxlIChvYmpfcmVxLT5zdHJlYW0uYXZhaWxfaW4gJiYgb2JqX3JlcS0+enJldCA9PSBaX09LKTsKKwlkYXRhX3JlY2VpdmVkKys7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIGZldGNoX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqYmFzZSk7CisKK3N0YXRpYyB2b2lkIHByb2Nlc3Nfb2JqZWN0X3Jlc3BvbnNlKHZvaWQgKmNhbGxiYWNrX2RhdGEpOworCitzdGF0aWMgdm9pZCBzdGFydF9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgob2JqX3JlcS0+c2hhMSk7CisJY2hhciBwcmV2ZmlsZVtQQVRIX01BWF07CisJY2hhciAqdXJsOworCWNoYXIgKnBvc247CisJaW50IHByZXZsb2NhbDsKKwl1bnNpZ25lZCBjaGFyIHByZXZfYnVmW1BSRVZfQlVGX1NJWkVdOworCXNzaXplX3QgcHJldl9yZWFkID0gMDsKKwlsb25nIHByZXZfcG9zbiA9IDA7CisJY2hhciByYW5nZVtSQU5HRV9IRUFERVJfU0laRV07CisJc3RydWN0IGN1cmxfc2xpc3QgKnJhbmdlX2hlYWRlciA9IE5VTEw7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisKKwlzbnByaW50ZihwcmV2ZmlsZSwgc2l6ZW9mKHByZXZmaWxlKSwgIiVzLnByZXYiLCBvYmpfcmVxLT5maWxlbmFtZSk7CisJdW5saW5rKHByZXZmaWxlKTsKKwlyZW5hbWUob2JqX3JlcS0+dG1wZmlsZSwgcHJldmZpbGUpOworCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKworCWlmIChvYmpfcmVxLT5sb2NhbCAhPSAtMSkKKwkJZXJyb3IoImZkIGxlYWthZ2UgaW4gc3RhcnQ6ICVkIiwgb2JqX3JlcS0+bG9jYWwpOworCW9ial9yZXEtPmxvY2FsID0gb3BlbihvYmpfcmVxLT50bXBmaWxlLAorCQkJICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwkvKiBUaGlzIGNvdWxkIGhhdmUgZmFpbGVkIGR1ZSB0byB0aGUgImxhenkgZGlyZWN0b3J5IGNyZWF0aW9uIjsKKwkgKiB0cnkgdG8gbWtkaXIgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQuCisJICovCisJaWYgKG9ial9yZXEtPmxvY2FsIDwgMCAmJiBlcnJubyA9PSBFTk9FTlQpIHsKKwkJY2hhciAqZGlyID0gc3RycmNocihvYmpfcmVxLT50bXBmaWxlLCAnLycpOworCQlpZiAoZGlyKSB7CisJCQkqZGlyID0gMDsKKwkJCW1rZGlyKG9ial9yZXEtPnRtcGZpbGUsIDA3NzcpOworCQkJKmRpciA9ICcvJzsKKwkJfQorCQlvYmpfcmVxLT5sb2NhbCA9IG9wZW4ob2JqX3JlcS0+dG1wZmlsZSwKKwkJCQkgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCX0KKworCWlmIChvYmpfcmVxLT5sb2NhbCA8IDApIHsKKwkJb2JqX3JlcS0+c3RhdGUgPSBBQk9SVEVEOworCQllcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIGZvciAlczogJXMiLAorCQkgICAgICBvYmpfcmVxLT50bXBmaWxlLCBvYmpfcmVxLT5maWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldCgmb2JqX3JlcS0+c3RyZWFtLCAwLCBzaXplb2Yob2JqX3JlcS0+c3RyZWFtKSk7CisKKwlpbmZsYXRlSW5pdCgmb2JqX3JlcS0+c3RyZWFtKTsKKworCVNIQTFfSW5pdCgmb2JqX3JlcS0+Yyk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihvYmpfcmVxLT5yZXBvLT5iYXNlKSArIDUwKTsKKwlvYmpfcmVxLT51cmwgPSB4bWFsbG9jKHN0cmxlbihvYmpfcmVxLT5yZXBvLT5iYXNlKSArIDUwKTsKKwlzdHJjcHkodXJsLCBvYmpfcmVxLT5yZXBvLT5iYXNlKTsKKwlwb3NuID0gdXJsICsgc3RybGVuKG9ial9yZXEtPnJlcG8tPmJhc2UpOworCXN0cmNweShwb3NuLCAib2JqZWN0cy8iKTsKKwlwb3NuICs9IDg7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCSoocG9zbisrKSA9ICcvJzsKKwlzdHJjcHkocG9zbiwgaGV4ICsgMik7CisJc3RyY3B5KG9ial9yZXEtPnVybCwgdXJsKTsKKworCS8qIElmIGEgcHJldmlvdXMgdGVtcCBmaWxlIGlzIHByZXNlbnQsIHByb2Nlc3Mgd2hhdCB3YXMgYWxyZWFkeQorCSAgIGZldGNoZWQuICovCisJcHJldmxvY2FsID0gb3BlbihwcmV2ZmlsZSwgT19SRE9OTFkpOworCWlmIChwcmV2bG9jYWwgIT0gLTEpIHsKKwkJZG8geworCQkJcHJldl9yZWFkID0gcmVhZChwcmV2bG9jYWwsIHByZXZfYnVmLCBQUkVWX0JVRl9TSVpFKTsKKwkJCWlmIChwcmV2X3JlYWQ+MCkgeworCQkJCWlmIChmd3JpdGVfc2hhMV9maWxlKHByZXZfYnVmLAorCQkJCQkJICAgICAxLAorCQkJCQkJICAgICBwcmV2X3JlYWQsCisJCQkJCQkgICAgIG9ial9yZXEpID09IHByZXZfcmVhZCkgeworCQkJCQlwcmV2X3Bvc24gKz0gcHJldl9yZWFkOworCQkJCX0gZWxzZSB7CisJCQkJCXByZXZfcmVhZCA9IC0xOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAocHJldl9yZWFkID4gMCk7CisJCWNsb3NlKHByZXZsb2NhbCk7CisJfQorCXVubGluayhwcmV2ZmlsZSk7CisKKwkvKiBSZXNldCBpbmZsYXRlL1NIQTEgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHByZXZpb3VzIHRlbXAKKwkgICBmaWxlOyBhbHNvIHJld2luZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb2NhbCBmaWxlLiAqLworCWlmIChwcmV2X3JlYWQgPT0gLTEpIHsKKwkJbWVtc2V0KCZvYmpfcmVxLT5zdHJlYW0sIDAsIHNpemVvZihvYmpfcmVxLT5zdHJlYW0pKTsKKwkJaW5mbGF0ZUluaXQoJm9ial9yZXEtPnN0cmVhbSk7CisJCVNIQTFfSW5pdCgmb2JqX3JlcS0+Yyk7CisJCWlmIChwcmV2X3Bvc24+MCkgeworCQkJcHJldl9wb3NuID0gMDsKKwkJCWxzZWVrKG9ial9yZXEtPmxvY2FsLCBTRUVLX1NFVCwgMCk7CisJCQlmdHJ1bmNhdGUob2JqX3JlcS0+bG9jYWwsIDApOworCQl9CisJfQorCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX29iamVjdF9yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gb2JqX3JlcTsKKwlvYmpfcmVxLT5zbG90ID0gc2xvdDsKKworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCBvYmpfcmVxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX3NoYTFfZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0VSUk9SQlVGRkVSLCBvYmpfcmVxLT5lcnJvcnN0cik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisKKwkvKiBJZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgZGF0YSBmcm9tIGEgcHJldmlvdXMgZmV0Y2gKKwkgICBhdHRlbXB0LCBvbmx5IGZldGNoIHRoZSBkYXRhIHdlIGRvbid0IGFscmVhZHkgaGF2ZS4gKi8KKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKGdldF92ZXJib3NlbHkpCisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiUmVzdW1pbmcgZmV0Y2ggb2Ygb2JqZWN0ICVzIGF0IGJ5dGUgJWxkXG4iLAorCQkJCWhleCwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwKKwkJCQkgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCS8qIFRyeSB0byBnZXQgdGhlIHJlcXVlc3Qgc3RhcnRlZCwgYWJvcnQgdGhlIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlvYmpfcmVxLT5zdGF0ZSA9IEFDVElWRTsKKwlpZiAoIXN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCW9ial9yZXEtPnN0YXRlID0gQUJPUlRFRDsKKwkJb2JqX3JlcS0+c2xvdCA9IE5VTEw7CisJCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsgb2JqX3JlcS0+bG9jYWwgPSAtMTsKKwkJZnJlZShvYmpfcmVxLT51cmwpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfb2JqZWN0X3JlcXVlc3Qoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxKQoreworCXN0cnVjdCBzdGF0IHN0OworCisJZmNobW9kKG9ial9yZXEtPmxvY2FsLCAwNDQ0KTsKKwljbG9zZShvYmpfcmVxLT5sb2NhbCk7IG9ial9yZXEtPmxvY2FsID0gLTE7CisKKwlpZiAob2JqX3JlcS0+aHR0cF9jb2RlID09IDQxNikgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHJlcXVlc3RlZCByYW5nZSBpbnZhbGlkOyB3ZSBtYXkgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YS5cbiIpOworCX0gZWxzZSBpZiAob2JqX3JlcS0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJaWYgKHN0YXQob2JqX3JlcS0+dG1wZmlsZSwgJnN0KSA9PSAwKQorCQkJaWYgKHN0LnN0X3NpemUgPT0gMCkKKwkJCQl1bmxpbmsob2JqX3JlcS0+dG1wZmlsZSk7CisJCXJldHVybjsKKwl9CisKKwlpbmZsYXRlRW5kKCZvYmpfcmVxLT5zdHJlYW0pOworCVNIQTFfRmluYWwob2JqX3JlcS0+cmVhbF9zaGExLCAmb2JqX3JlcS0+Yyk7CisJaWYgKG9ial9yZXEtPnpyZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisJCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobWVtY21wKG9ial9yZXEtPnNoYTEsIG9ial9yZXEtPnJlYWxfc2hhMSwgMjApKSB7CisJCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwkJcmV0dXJuOworCX0KKwlvYmpfcmVxLT5yZW5hbWUgPQorCQltb3ZlX3RlbXBfdG9fZmlsZShvYmpfcmVxLT50bXBmaWxlLCBvYmpfcmVxLT5maWxlbmFtZSk7CisKKwlpZiAob2JqX3JlcS0+cmVuYW1lID09IDApCisJCXB1bGxfc2F5KCJnb3QgJXNcbiIsIHNoYTFfdG9faGV4KG9ial9yZXEtPnNoYTEpKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19vYmplY3RfcmVzcG9uc2Uodm9pZCAqY2FsbGJhY2tfZGF0YSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEgPQorCQkoc3RydWN0IG9iamVjdF9yZXF1ZXN0ICopY2FsbGJhY2tfZGF0YTsKKworCW9ial9yZXEtPmN1cmxfcmVzdWx0ID0gb2JqX3JlcS0+c2xvdC0+Y3VybF9yZXN1bHQ7CisJb2JqX3JlcS0+aHR0cF9jb2RlID0gb2JqX3JlcS0+c2xvdC0+aHR0cF9jb2RlOworCW9ial9yZXEtPnNsb3QgPSBOVUxMOworCW9ial9yZXEtPnN0YXRlID0gQ09NUExFVEU7CisKKwkvKiBVc2UgYWx0ZXJuYXRlcyBpZiBuZWNlc3NhcnkgKi8KKwlpZiAob2JqX3JlcS0+aHR0cF9jb2RlID09IDQwNCB8fAorCSAgICBvYmpfcmVxLT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9GSUxFX0NPVUxETlRfUkVBRF9GSUxFKSB7CisJCWZldGNoX2FsdGVybmF0ZXMoYWx0LT5iYXNlKTsKKwkJaWYgKG9ial9yZXEtPnJlcG8tPm5leHQgIT0gTlVMTCkgeworCQkJb2JqX3JlcS0+cmVwbyA9CisJCQkJb2JqX3JlcS0+cmVwby0+bmV4dDsKKwkJCWNsb3NlKG9ial9yZXEtPmxvY2FsKTsKKwkJCW9ial9yZXEtPmxvY2FsID0gLTE7CisJCQlzdGFydF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWZpbmlzaF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9vYmplY3RfcmVxdWVzdChzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEpCit7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICplbnRyeSA9IG9iamVjdF9xdWV1ZV9oZWFkOworCisJaWYgKG9ial9yZXEtPmxvY2FsICE9IC0xKQorCQllcnJvcigiZmQgbGVha2FnZSBpbiByZWxlYXNlOiAlZCIsIG9ial9yZXEtPmxvY2FsKTsKKwlpZiAob2JqX3JlcSA9PSBvYmplY3RfcXVldWVfaGVhZCkgeworCQlvYmplY3RfcXVldWVfaGVhZCA9IG9ial9yZXEtPm5leHQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGVudHJ5LT5uZXh0ICE9IE5VTEwgJiYgZW50cnktPm5leHQgIT0gb2JqX3JlcSkKKwkJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJCWlmIChlbnRyeS0+bmV4dCA9PSBvYmpfcmVxKQorCQkJZW50cnktPm5leHQgPSBlbnRyeS0+bmV4dC0+bmV4dDsKKwl9CisKKwlmcmVlKG9ial9yZXEtPnVybCk7CisJZnJlZShvYmpfcmVxKTsKK30KKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCit2b2lkIGZpbGxfYWN0aXZlX3Nsb3RzKHZvaWQpCit7CisJc3RydWN0IG9iamVjdF9yZXF1ZXN0ICpvYmpfcmVxID0gb2JqZWN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwlpbnQgbnVtX3RyYW5zZmVyczsKKworCXdoaWxlIChhY3RpdmVfcmVxdWVzdHMgPCBtYXhfcmVxdWVzdHMgJiYgb2JqX3JlcSAhPSBOVUxMKSB7CisJCWlmIChvYmpfcmVxLT5zdGF0ZSA9PSBXQUlUSU5HKSB7CisJCQlpZiAoaGFzX3NoYTFfZmlsZShvYmpfcmVxLT5zaGExKSkKKwkJCQlvYmpfcmVxLT5zdGF0ZSA9IENPTVBMRVRFOworCQkJZWxzZQorCQkJCXN0YXJ0X29iamVjdF9yZXF1ZXN0KG9ial9yZXEpOworCQkJY3VybF9tdWx0aV9wZXJmb3JtKGN1cmxtLCAmbnVtX3RyYW5zZmVycyk7CisJCX0KKwkJb2JqX3JlcSA9IG9ial9yZXEtPm5leHQ7CisJfQorCisJd2hpbGUgKHNsb3QgIT0gTlVMTCkgeworCQlpZiAoIXNsb3QtPmluX3VzZSAmJiBzbG90LT5jdXJsICE9IE5VTEwpIHsKKwkJCWN1cmxfZWFzeV9jbGVhbnVwKHNsb3QtPmN1cmwpOworCQkJc2xvdC0+Y3VybCA9IE5VTEw7CisJCX0KKwkJc2xvdCA9IHNsb3QtPm5leHQ7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgcHJlZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm5ld3JlcTsKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKnRhaWw7CisJY2hhciAqZmlsZW5hbWUgPSBzaGExX2ZpbGVfbmFtZShzaGExKTsKKworCW5ld3JlcSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdyZXEpKTsKKwltZW1jcHkobmV3cmVxLT5zaGExLCBzaGExLCAyMCk7CisJbmV3cmVxLT5yZXBvID0gYWx0OworCW5ld3JlcS0+dXJsID0gTlVMTDsKKwluZXdyZXEtPmxvY2FsID0gLTE7CisJbmV3cmVxLT5zdGF0ZSA9IFdBSVRJTkc7CisJc25wcmludGYobmV3cmVxLT5maWxlbmFtZSwgc2l6ZW9mKG5ld3JlcS0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYobmV3cmVxLT50bXBmaWxlLCBzaXplb2YobmV3cmVxLT50bXBmaWxlKSwKKwkJICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCW5ld3JlcS0+c2xvdCA9IE5VTEw7CisJbmV3cmVxLT5uZXh0ID0gTlVMTDsKKworCWlmIChvYmplY3RfcXVldWVfaGVhZCA9PSBOVUxMKSB7CisJCW9iamVjdF9xdWV1ZV9oZWFkID0gbmV3cmVxOworCX0gZWxzZSB7CisJCXRhaWwgPSBvYmplY3RfcXVldWVfaGVhZDsKKwkJd2hpbGUgKHRhaWwtPm5leHQgIT0gTlVMTCkgeworCQkJdGFpbCA9IHRhaWwtPm5leHQ7CisJCX0KKwkJdGFpbC0+bmV4dCA9IG5ld3JlcTsKKwl9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGZldGNoX2luZGV4KHN0cnVjdCBhbHRfYmFzZSAqcmVwbywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChzaGExKTsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICp1cmw7CisJY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlsb25nIHByZXZfcG9zbiA9IDA7CisJY2hhciByYW5nZVtSQU5HRV9IRUFERVJfU0laRV07CisJc3RydWN0IGN1cmxfc2xpc3QgKnJhbmdlX2hlYWRlciA9IE5VTEw7CisKKwlGSUxFICppbmRleGZpbGU7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJaWYgKGhhc19wYWNrX2luZGV4KHNoYTEpKQorCQlyZXR1cm4gMDsKKworCWlmIChnZXRfdmVyYm9zZWx5KQorCQlmcHJpbnRmKHN0ZGVyciwgIkdldHRpbmcgaW5kZXggZm9yIHBhY2sgJXNcbiIsIGhleCk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZXBvLT5iYXNlKSArIDY0KTsKKwlzcHJpbnRmKHVybCwgIiVzL29iamVjdHMvcGFjay9wYWNrLSVzLmlkeCIsIHJlcG8tPmJhc2UsIGhleCk7CisKKwlmaWxlbmFtZSA9IHNoYTFfcGFja19pbmRleF9uYW1lKHNoYTEpOworCXNucHJpbnRmKHRtcGZpbGUsIHNpemVvZih0bXBmaWxlKSwgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisJaW5kZXhmaWxlID0gZm9wZW4odG1wZmlsZSwgImEiKTsKKwlpZiAoIWluZGV4ZmlsZSkKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gb3BlbiBsb2NhbCBmaWxlICVzIGZvciBwYWNrIGluZGV4IiwKKwkJCSAgICAgZmlsZW5hbWUpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgaW5kZXhmaWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKwlzbG90LT5sb2NhbCA9IGluZGV4ZmlsZTsKKworCS8qIElmIHRoZXJlIGlzIGRhdGEgcHJlc2VudCBmcm9tIGEgcHJldmlvdXMgdHJhbnNmZXIgYXR0ZW1wdCwKKwkgICByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgKi8KKwlwcmV2X3Bvc24gPSBmdGVsbChpbmRleGZpbGUpOworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBpbmRleCBmb3IgcGFjayAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBnZXQgcGFjayBpbmRleCAlc1xuJXMiLCB1cmwsCisJCQkJICAgICBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZjbG9zZShpbmRleGZpbGUpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJZmNsb3NlKGluZGV4ZmlsZSk7CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IHNldHVwX2luZGV4KHN0cnVjdCBhbHRfYmFzZSAqcmVwbywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqbmV3X3BhY2s7CisJaWYgKGhhc19wYWNrX2ZpbGUoc2hhMSkpCisJCXJldHVybiAwOyAvKiBkb24ndCBsaXN0IHRoaXMgYXMgc29tZXRoaW5nIHdlIGNhbiBnZXQgKi8KKworCWlmIChmZXRjaF9pbmRleChyZXBvLCBzaGExKSkKKwkJcmV0dXJuIC0xOworCisJbmV3X3BhY2sgPSBwYXJzZV9wYWNrX2luZGV4KHNoYTEpOworCW5ld19wYWNrLT5uZXh0ID0gcmVwby0+cGFja3M7CisJcmVwby0+cGFja3MgPSBuZXdfcGFjazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19hbHRlcm5hdGVzX3Jlc3BvbnNlKHZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJc3RydWN0IGFsdGVybmF0ZXNfcmVxdWVzdCAqYWx0X3JlcSA9CisJCShzdHJ1Y3QgYWx0ZXJuYXRlc19yZXF1ZXN0ICopY2FsbGJhY2tfZGF0YTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCA9IGFsdF9yZXEtPnNsb3Q7CisJc3RydWN0IGFsdF9iYXNlICp0YWlsID0gYWx0OworCWNvbnN0IGNoYXIgKmJhc2UgPSBhbHRfcmVxLT5iYXNlOworCXN0YXRpYyBjb25zdCBjaGFyIG51bGxfYnl0ZSA9ICdcMCc7CisJY2hhciAqZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlpZiAoYWx0X3JlcS0+aHR0cF9zcGVjaWZpYykgeworCQlpZiAoc2xvdC0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0sgfHwKKwkJICAgICFhbHRfcmVxLT5idWZmZXItPnBvc24pIHsKKworCQkJLyogVHJ5IHJldXNpbmcgdGhlIHNsb3QgdG8gZ2V0IG5vbi1odHRwIGFsdGVybmF0ZXMgKi8KKwkJCWFsdF9yZXEtPmh0dHBfc3BlY2lmaWMgPSAwOworCQkJc3ByaW50ZihhbHRfcmVxLT51cmwsICIlcy9vYmplY3RzL2luZm8vYWx0ZXJuYXRlcyIsCisJCQkJYmFzZSk7CisJCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLAorCQkJCQkgYWx0X3JlcS0+dXJsKTsKKwkJCWFjdGl2ZV9yZXF1ZXN0cysrOworCQkJc2xvdC0+aW5fdXNlID0gMTsKKwkJCWlmIChzbG90LT5maW5pc2hlZCAhPSBOVUxMKQorCQkJCSgqc2xvdC0+ZmluaXNoZWQpID0gMDsKKwkJCWlmICghc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJCQlnb3RfYWx0ZXJuYXRlcyA9IC0xOworCQkJCXNsb3QtPmluX3VzZSA9IDA7CisJCQkJaWYgKHNsb3QtPmZpbmlzaGVkICE9IE5VTEwpCisJCQkJCSgqc2xvdC0+ZmluaXNoZWQpID0gMTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSBpZiAoc2xvdC0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJaWYgKHNsb3QtPmh0dHBfY29kZSAhPSA0MDQgJiYKKwkJICAgIHNsb3QtPmN1cmxfcmVzdWx0ICE9IENVUkxFX0ZJTEVfQ09VTEROVF9SRUFEX0ZJTEUpIHsKKwkJCWdvdF9hbHRlcm5hdGVzID0gLTE7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlmd3JpdGVfYnVmZmVyKCZudWxsX2J5dGUsIDEsIDEsIGFsdF9yZXEtPmJ1ZmZlcik7CisJYWx0X3JlcS0+YnVmZmVyLT5wb3NuLS07CisJZGF0YSA9IGFsdF9yZXEtPmJ1ZmZlci0+YnVmZmVyOworCisJd2hpbGUgKGkgPCBhbHRfcmVxLT5idWZmZXItPnBvc24pIHsKKwkJaW50IHBvc24gPSBpOworCQl3aGlsZSAocG9zbiA8IGFsdF9yZXEtPmJ1ZmZlci0+cG9zbiAmJiBkYXRhW3Bvc25dICE9ICdcbicpCisJCQlwb3NuKys7CisJCWlmIChkYXRhW3Bvc25dID09ICdcbicpIHsKKwkJCWludCBva2F5ID0gMDsKKwkJCWludCBzZXJ2ZXJsZW4gPSAwOworCQkJc3RydWN0IGFsdF9iYXNlICpuZXdhbHQ7CisJCQljaGFyICp0YXJnZXQgPSBOVUxMOworCQkJY2hhciAqcGF0aDsKKwkJCWlmIChkYXRhW2ldID09ICcvJykgeworCQkJCXNlcnZlcmxlbiA9IHN0cmNocihiYXNlICsgOCwgJy8nKSAtIGJhc2U7CisJCQkJb2theSA9IDE7CisJCQl9IGVsc2UgaWYgKCFtZW1jbXAoZGF0YSArIGksICIuLi8iLCAzKSkgeworCQkJCWkgKz0gMzsKKwkJCQlzZXJ2ZXJsZW4gPSBzdHJsZW4oYmFzZSk7CisJCQkJd2hpbGUgKGkgKyAyIDwgcG9zbiAmJgorCQkJCSAgICAgICAhbWVtY21wKGRhdGEgKyBpLCAiLi4vIiwgMykpIHsKKwkJCQkJZG8geworCQkJCQkJc2VydmVybGVuLS07CisJCQkJCX0gd2hpbGUgKHNlcnZlcmxlbiAmJgorCQkJCQkJIGJhc2Vbc2VydmVybGVuIC0gMV0gIT0gJy8nKTsKKwkJCQkJaSArPSAzOworCQkJCX0KKwkJCQkvKiBJZiB0aGUgc2VydmVyIGdvdCByZW1vdmVkLCBnaXZlIHVwLiAqLworCQkJCW9rYXkgPSBzdHJjaHIoYmFzZSwgJzonKSAtIGJhc2UgKyAzIDwKKwkJCQkJc2VydmVybGVuOworCQkJfSBlbHNlIGlmIChhbHRfcmVxLT5odHRwX3NwZWNpZmljKSB7CisJCQkJY2hhciAqY29sb24gPSBzdHJjaHIoZGF0YSArIGksICc6Jyk7CisJCQkJY2hhciAqc2xhc2ggPSBzdHJjaHIoZGF0YSArIGksICcvJyk7CisJCQkJaWYgKGNvbG9uICYmIHNsYXNoICYmIGNvbG9uIDwgZGF0YSArIHBvc24gJiYKKwkJCQkgICAgc2xhc2ggPCBkYXRhICsgcG9zbiAmJiBjb2xvbiA8IHNsYXNoKSB7CisJCQkJCW9rYXkgPSAxOworCQkJCX0KKwkJCX0KKwkJCS8qIHNraXAgJ29iamVjdHMnIGF0IGVuZCAqLworCQkJaWYgKG9rYXkpIHsKKwkJCQl0YXJnZXQgPSB4bWFsbG9jKHNlcnZlcmxlbiArIHBvc24gLSBpIC0gNik7CisJCQkJc3RybGNweSh0YXJnZXQsIGJhc2UsIHNlcnZlcmxlbik7CisJCQkJc3RybGNweSh0YXJnZXQgKyBzZXJ2ZXJsZW4sIGRhdGEgKyBpLCBwb3NuIC0gaSAtIDYpOworCQkJCWlmIChnZXRfdmVyYm9zZWx5KQorCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJBbHNvIGxvb2sgYXQgJXNcbiIsIHRhcmdldCk7CisJCQkJbmV3YWx0ID0geG1hbGxvYyhzaXplb2YoKm5ld2FsdCkpOworCQkJCW5ld2FsdC0+bmV4dCA9IE5VTEw7CisJCQkJbmV3YWx0LT5iYXNlID0gdGFyZ2V0OworCQkJCW5ld2FsdC0+Z290X2luZGljZXMgPSAwOworCQkJCW5ld2FsdC0+cGFja3MgPSBOVUxMOworCQkJCXBhdGggPSBzdHJzdHIodGFyZ2V0LCAiLy8iKTsKKwkJCQlpZiAocGF0aCkgeworCQkJCQlwYXRoID0gc3RyY2hyKHBhdGgrMiwgJy8nKTsKKwkJCQkJaWYgKHBhdGgpCisJCQkJCQluZXdhbHQtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCQkJCX0KKworCQkJCXdoaWxlICh0YWlsLT5uZXh0ICE9IE5VTEwpCisJCQkJCXRhaWwgPSB0YWlsLT5uZXh0OworCQkJCXRhaWwtPm5leHQgPSBuZXdhbHQ7CisJCQl9CisJCX0KKwkJaSA9IHBvc24gKyAxOworCX0KKworCWdvdF9hbHRlcm5hdGVzID0gMTsKK30KKworc3RhdGljIHZvaWQgZmV0Y2hfYWx0ZXJuYXRlcyhjb25zdCBjaGFyICpiYXNlKQoreworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNoYXIgKnVybDsKKwljaGFyICpkYXRhOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBhbHRlcm5hdGVzX3JlcXVlc3QgYWx0X3JlcTsKKworCS8qIElmIGFub3RoZXIgcmVxdWVzdCBoYXMgYWxyZWFkeSBzdGFydGVkIGZldGNoaW5nIGFsdGVybmF0ZXMsCisJICAgd2FpdCBmb3IgdGhlbSB0byBhcnJpdmUgYW5kIHJldHVybiB0byBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCdzCisJICAgY3VybCBtZXNzYWdlICovCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl3aGlsZSAoZ290X2FsdGVybmF0ZXMgPT0gMCkgeworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCX0KKyNlbmRpZgorCisJLyogTm90aGluZyB0byBkbyBpZiB0aGV5J3ZlIGFscmVhZHkgYmVlbiBmZXRjaGVkICovCisJaWYgKGdvdF9hbHRlcm5hdGVzID09IDEpCisJCXJldHVybjsKKworCS8qIFN0YXJ0IHRoZSBmZXRjaCAqLworCWdvdF9hbHRlcm5hdGVzID0gMDsKKworCWRhdGEgPSB4bWFsbG9jKDQwOTYpOworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IGRhdGE7CisKKwlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIGFsdGVybmF0ZXMgbGlzdCBmb3IgJXNcbiIsIGJhc2UpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4oYmFzZSkgKyAzMSk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL2luZm8vaHR0cC1hbHRlcm5hdGVzIiwgYmFzZSk7CisKKwkvKiBVc2UgYSBjYWxsYmFjayB0byBwcm9jZXNzIHRoZSByZXN1bHQsIHNpbmNlIGFub3RoZXIgcmVxdWVzdAorCSAgIG1heSBmYWlsIGFuZCBuZWVkIHRvIGhhdmUgYWx0ZXJuYXRlcyBsb2FkZWQgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfYWx0ZXJuYXRlc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gJmFsdF9yZXE7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisKKwlhbHRfcmVxLmJhc2UgPSBiYXNlOworCWFsdF9yZXEudXJsID0gdXJsOworCWFsdF9yZXEuYnVmZmVyID0gJmJ1ZmZlcjsKKwlhbHRfcmVxLmh0dHBfc3BlY2lmaWMgPSAxOworCWFsdF9yZXEuc2xvdCA9IHNsb3Q7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpCisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwllbHNlCisJCWdvdF9hbHRlcm5hdGVzID0gLTE7CisKKwlmcmVlKGRhdGEpOworCWZyZWUodXJsKTsKK30KKworI2lmbmRlZiBOT19FWFBBVAorc3RhdGljIHZvaWQKK3htbF9zdGFydF90YWcodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRzKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJaW50IG5ld19sZW47CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCW5ld19sZW4gPSBzdHJsZW4oY3R4LT5uYW1lKSArIHN0cmxlbihjKSArIDI7CisKKwlpZiAobmV3X2xlbiA+IGN0eC0+bGVuKSB7CisJCWN0eC0+bmFtZSA9IHhyZWFsbG9jKGN0eC0+bmFtZSwgbmV3X2xlbik7CisJCWN0eC0+bGVuID0gbmV3X2xlbjsKKwl9CisJc3RyY2F0KGN0eC0+bmFtZSwgIi4iKTsKKwlzdHJjYXQoY3R4LT5uYW1lLCBjKTsKKworCWlmIChjdHgtPmNkYXRhKSB7CisJCWZyZWUoY3R4LT5jZGF0YSk7CisJCWN0eC0+Y2RhdGEgPSBOVUxMOworCX0KKworCWN0eC0+dXNlckZ1bmMoY3R4LCAwKTsKK30KKworc3RhdGljIHZvaWQKK3htbF9lbmRfdGFnKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwljb25zdCBjaGFyICpjID0gc3RyY2hyKG5hbWUsICc6Jyk7CisJY2hhciAqZXA7CisKKwljdHgtPnVzZXJGdW5jKGN0eCwgMSk7CisKKwlpZiAoYyA9PSBOVUxMKQorCQljID0gbmFtZTsKKwllbHNlCisJCWMrKzsKKworCWVwID0gY3R4LT5uYW1lICsgc3RybGVuKGN0eC0+bmFtZSkgLSBzdHJsZW4oYykgLSAxOworCSplcCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCit4bWxfY2RhdGEodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKQoreworCXN0cnVjdCB4bWxfY3R4ICpjdHggPSAoc3RydWN0IHhtbF9jdHggKil1c2VyRGF0YTsKKwlpZiAoY3R4LT5jZGF0YSkKKwkJZnJlZShjdHgtPmNkYXRhKTsKKwljdHgtPmNkYXRhID0geG1hbGxvYyhsZW4gKyAxKTsKKwlzdHJsY3B5KGN0eC0+Y2RhdGEsIHMsIGxlbiArIDEpOworfQorCitzdGF0aWMgaW50IHJlbW90ZV9scyhzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywKKwkJICAgICB2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyksCisJCSAgICAgdm9pZCAqdXNlckRhdGEpOworCitzdGF0aWMgdm9pZCBoYW5kbGVfcmVtb3RlX2xzX2N0eChzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCkKK3sKKwlzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMgPSAoc3RydWN0IHJlbW90ZV9sc19jdHggKiljdHgtPnVzZXJEYXRhOworCisJaWYgKHRhZ19jbG9zZWQpIHsKKwkJaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfUkVTUCkgJiYgbHMtPmRlbnRyeV9uYW1lKSB7CisJCQlpZiAobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikgeworCQkJCWlmIChscy0+ZmxhZ3MgJiBQUk9DRVNTX0RJUlMpIHsKKwkJCQkJbHMtPnVzZXJGdW5jKGxzKTsKKwkJCQl9CisJCQkJaWYgKHN0cmNtcChscy0+ZGVudHJ5X25hbWUsIGxzLT5wYXRoKSAmJgorCQkJCSAgICBscy0+ZmxhZ3MgJiBSRUNVUlNJVkUpIHsKKwkJCQkJbHMtPnJjID0gcmVtb3RlX2xzKGxzLT5yZXBvLAorCQkJCQkJCSAgIGxzLT5kZW50cnlfbmFtZSwKKwkJCQkJCQkgICBscy0+ZmxhZ3MsCisJCQkJCQkJICAgbHMtPnVzZXJGdW5jLAorCQkJCQkJCSAgIGxzLT51c2VyRGF0YSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChscy0+ZmxhZ3MgJiBQUk9DRVNTX0ZJTEVTKSB7CisJCQkJbHMtPnVzZXJGdW5jKGxzKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX05BTUUpICYmIGN0eC0+Y2RhdGEpIHsKKwkJCWxzLT5kZW50cnlfbmFtZSA9IHhtYWxsb2Moc3RybGVuKGN0eC0+Y2RhdGEpIC0KKwkJCQkJCSAgbHMtPnJlcG8tPnBhdGhfbGVuICsgMSk7CisJCQlzdHJjcHkobHMtPmRlbnRyeV9uYW1lLCBjdHgtPmNkYXRhICsgbHMtPnJlcG8tPnBhdGhfbGVuKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX1BST1BGSU5EX0NPTExFQ1RJT04pKSB7CisJCQlscy0+ZGVudHJ5X2ZsYWdzIHw9IElTX0RJUjsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9SRVNQKSkgeworCQlpZiAobHMtPmRlbnRyeV9uYW1lKSB7CisJCQlmcmVlKGxzLT5kZW50cnlfbmFtZSk7CisJCX0KKwkJbHMtPmRlbnRyeV9uYW1lID0gTlVMTDsKKwkJbHMtPmRlbnRyeV9mbGFncyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHJlbW90ZV9scyhzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8sIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywKKwkJICAgICB2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyksCisJCSAgICAgdm9pZCAqdXNlckRhdGEpCit7CisJY2hhciAqdXJsID0geG1hbGxvYyhzdHJsZW4ocmVwby0+YmFzZSkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBpbl9idWZmZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqb3V0X2RhdGE7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJc3RydWN0IHJlbW90ZV9sc19jdHggbHM7CisKKwlscy5mbGFncyA9IGZsYWdzOworCWxzLnJlcG8gPSByZXBvOworCWxzLnBhdGggPSBzdHJkdXAocGF0aCk7CisJbHMuZGVudHJ5X25hbWUgPSBOVUxMOworCWxzLmRlbnRyeV9mbGFncyA9IDA7CisJbHMudXNlckRhdGEgPSB1c2VyRGF0YTsKKwlscy51c2VyRnVuYyA9IHVzZXJGdW5jOworCWxzLnJjID0gMDsKKworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlcG8tPmJhc2UsIHBhdGgpOworCisJb3V0X2J1ZmZlci5zaXplID0gc3RybGVuKFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsIFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKwlvdXRfYnVmZmVyLnBvc24gPSAwOworCW91dF9idWZmZXIuYnVmZmVyID0gb3V0X2RhdGE7CisKKwlpbl9idWZmZXIuc2l6ZSA9IDQwOTY7CisJaW5fZGF0YSA9IHhtYWxsb2MoaW5fYnVmZmVyLnNpemUpOworCWluX2J1ZmZlci5wb3NuID0gMDsKKwlpbl9idWZmZXIuYnVmZmVyID0gaW5fZGF0YTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMSIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BST1BGSU5EKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCWN0eC5uYW1lID0geGNhbGxvYygxMCwgMSk7CisJCQljdHgubGVuID0gMDsKKwkJCWN0eC5jZGF0YSA9IE5VTEw7CisJCQljdHgudXNlckZ1bmMgPSBoYW5kbGVfcmVtb3RlX2xzX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9ICZsczsKKwkJCVhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZjdHgpOworCQkJWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgeG1sX3N0YXJ0X3RhZywKKwkJCQkJICAgICAgeG1sX2VuZF90YWcpOworCQkJWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgeG1sX2NkYXRhKTsKKwkJCXJlc3VsdCA9IFhNTF9QYXJzZShwYXJzZXIsIGluX2J1ZmZlci5idWZmZXIsCisJCQkJCSAgIGluX2J1ZmZlci5wb3NuLCAxKTsKKwkJCWZyZWUoY3R4Lm5hbWUpOworCisJCQlpZiAocmVzdWx0ICE9IFhNTF9TVEFUVVNfT0spIHsKKwkJCQlscy5yYyA9IGVycm9yKCJYTUwgZXJyb3I6ICVzIiwKKwkJCQkJICAgICAgWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJICAgICAgWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlscy5yYyA9IC0xOworCQl9CisJfSBlbHNlIHsKKwkJbHMucmMgPSBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IFBST1BGSU5EIHJlcXVlc3QiKTsKKwl9CisKKwlmcmVlKGxzLnBhdGgpOworCWZyZWUodXJsKTsKKwlmcmVlKG91dF9kYXRhKTsKKwlmcmVlKGluX2J1ZmZlci5idWZmZXIpOworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCisJcmV0dXJuIGxzLnJjOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xzX3BhY2soc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgPT0gNjMgJiYKKwkgICAgIXN0cm5jbXAobHMtPmRlbnRyeV9uYW1lLCAib2JqZWN0cy9wYWNrL3BhY2stIiwgMTgpICYmCisJICAgIGhhc19leHRlbnNpb24obHMtPmRlbnRyeV9uYW1lLCAiLnBhY2siKSkgeworCQlnZXRfc2hhMV9oZXgobHMtPmRlbnRyeV9uYW1lICsgMTgsIHNoYTEpOworCQlzZXR1cF9pbmRleChscy0+cmVwbywgc2hhMSk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZmV0Y2hfaW5kaWNlcyhzdHJ1Y3QgYWx0X2Jhc2UgKnJlcG8pCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICp1cmw7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciAqZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlpZiAocmVwby0+Z290X2luZGljZXMpCisJCXJldHVybiAwOworCisJZGF0YSA9IHhtYWxsb2MoNDA5Nik7CisJYnVmZmVyLnNpemUgPSA0MDk2OworCWJ1ZmZlci5wb3NuID0gMDsKKwlidWZmZXIuYnVmZmVyID0gZGF0YTsKKworCWlmIChnZXRfdmVyYm9zZWx5KQorCQlmcHJpbnRmKHN0ZGVyciwgIkdldHRpbmcgcGFjayBsaXN0IGZvciAlc1xuIiwgcmVwby0+YmFzZSk7CisKKyNpZm5kZWYgTk9fRVhQQVQKKwlpZiAocmVtb3RlX2xzKHJlcG8sICJvYmplY3RzL3BhY2svIiwgUFJPQ0VTU19GSUxFUywKKwkJICAgICAgcHJvY2Vzc19sc19wYWNrLCBOVUxMKSA9PSAwKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVwby0+YmFzZSkgKyAyMSk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL2luZm8vcGFja3MiLCByZXBvLT5iYXNlKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZidWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJaWYgKHJlc3VsdHMuaHR0cF9jb2RlID09IDQwNCB8fAorCQkJICAgIHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfRklMRV9DT1VMRE5UX1JFQURfRklMRSkgeworCQkJCXJlcG8tPmdvdF9pbmRpY2VzID0gMTsKKwkJCQlmcmVlKGJ1ZmZlci5idWZmZXIpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlyZXBvLT5nb3RfaW5kaWNlcyA9IDA7CisJCQkJZnJlZShidWZmZXIuYnVmZmVyKTsKKwkJCQlyZXR1cm4gZXJyb3IoIiVzIiwgY3VybF9lcnJvcnN0cik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXBvLT5nb3RfaW5kaWNlcyA9IDA7CisJCWZyZWUoYnVmZmVyLmJ1ZmZlcik7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwlkYXRhID0gYnVmZmVyLmJ1ZmZlcjsKKwl3aGlsZSAoaSA8IGJ1ZmZlci5wb3NuKSB7CisJCXN3aXRjaCAoZGF0YVtpXSkgeworCQljYXNlICdQJzoKKwkJCWkrKzsKKwkJCWlmIChpICsgNTIgPD0gYnVmZmVyLnBvc24gJiYKKwkJCSAgICAhc3RybmNtcChkYXRhICsgaSwgIiBwYWNrLSIsIDYpICYmCisJCQkgICAgIXN0cm5jbXAoZGF0YSArIGkgKyA0NiwgIi5wYWNrXG4iLCA2KSkgeworCQkJCWdldF9zaGExX2hleChkYXRhICsgaSArIDYsIHNoYTEpOworCQkJCXNldHVwX2luZGV4KHJlcG8sIHNoYTEpOworCQkJCWkgKz0gNTE7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQl3aGlsZSAoaSA8IGJ1ZmZlci5wb3NuICYmIGRhdGFbaV0gIT0gJ1xuJykKKwkJCQlpKys7CisJCX0KKwkJaSsrOworCX0KKworCWZyZWUoYnVmZmVyLmJ1ZmZlcik7CisJcmVwby0+Z290X2luZGljZXMgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZldGNoX3BhY2soc3RydWN0IGFsdF9iYXNlICpyZXBvLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKnVybDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqdGFyZ2V0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICoqbHN0OworCUZJTEUgKnBhY2tmaWxlOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJaW50IHJldDsKKwlsb25nIHByZXZfcG9zbiA9IDA7CisJY2hhciByYW5nZVtSQU5HRV9IRUFERVJfU0laRV07CisJc3RydWN0IGN1cmxfc2xpc3QgKnJhbmdlX2hlYWRlciA9IE5VTEw7CisKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlpZiAoZmV0Y2hfaW5kaWNlcyhyZXBvKSkKKwkJcmV0dXJuIC0xOworCXRhcmdldCA9IGZpbmRfc2hhMV9wYWNrKHNoYTEsIHJlcG8tPnBhY2tzKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGdldF92ZXJib3NlbHkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIHBhY2sgJXNcbiIsCisJCQlzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKwkJZnByaW50ZihzdGRlcnIsICIgd2hpY2ggY29udGFpbnMgJXNcbiIsCisJCQlzaGExX3RvX2hleChzaGExKSk7CisJfQorCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVwby0+YmFzZSkgKyA2NSk7CisJc3ByaW50Zih1cmwsICIlcy9vYmplY3RzL3BhY2svcGFjay0lcy5wYWNrIiwKKwkJcmVwby0+YmFzZSwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisKKwlmaWxlbmFtZSA9IHNoYTFfcGFja19uYW1lKHRhcmdldC0+c2hhMSk7CisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMudGVtcCIsIGZpbGVuYW1lKTsKKwlwYWNrZmlsZSA9IGZvcGVuKHRtcGZpbGUsICJhIik7CisJaWYgKCFwYWNrZmlsZSkKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gb3BlbiBsb2NhbCBmaWxlICVzIGZvciBwYWNrIiwKKwkJCSAgICAgZmlsZW5hbWUpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgcGFja2ZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIG5vX3ByYWdtYV9oZWFkZXIpOworCXNsb3QtPmxvY2FsID0gcGFja2ZpbGU7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHByZXNlbnQgZnJvbSBhIHByZXZpb3VzIHRyYW5zZmVyIGF0dGVtcHQsCisJICAgcmVzdW1lIHdoZXJlIGl0IGxlZnQgb2ZmICovCisJcHJldl9wb3NuID0gZnRlbGwocGFja2ZpbGUpOworCWlmIChwcmV2X3Bvc24+MCkgeworCQlpZiAoZ2V0X3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBwYWNrICVzIGF0IGJ5dGUgJWxkXG4iLAorCQkJCXNoYTFfdG9faGV4KHRhcmdldC0+c2hhMSksIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZmNsb3NlKHBhY2tmaWxlKTsKKwkJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGdldCBwYWNrIGZpbGUgJXNcbiVzIiwgdXJsLAorCQkJCSAgICAgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlmY2xvc2UocGFja2ZpbGUpOworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJZmNsb3NlKHBhY2tmaWxlKTsKKworCXJldCA9IG1vdmVfdGVtcF90b19maWxlKHRtcGZpbGUsIGZpbGVuYW1lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbHN0ID0gJnJlcG8tPnBhY2tzOworCXdoaWxlICgqbHN0ICE9IHRhcmdldCkKKwkJbHN0ID0gJigoKmxzdCktPm5leHQpOworCSpsc3QgPSAoKmxzdCktPm5leHQ7CisKKwlpZiAodmVyaWZ5X3BhY2sodGFyZ2V0LCAwKSkKKwkJcmV0dXJuIC0xOworCWluc3RhbGxfcGFja2VkX2dpdCh0YXJnZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFib3J0X29iamVjdF9yZXF1ZXN0KHN0cnVjdCBvYmplY3RfcmVxdWVzdCAqb2JqX3JlcSkKK3sKKwlpZiAob2JqX3JlcS0+bG9jYWwgPj0gMCkgeworCQljbG9zZShvYmpfcmVxLT5sb2NhbCk7CisJCW9ial9yZXEtPmxvY2FsID0gLTE7CisJfQorCXVubGluayhvYmpfcmVxLT50bXBmaWxlKTsKKwlpZiAob2JqX3JlcS0+c2xvdCkgeworIAkJcmVsZWFzZV9hY3RpdmVfc2xvdChvYmpfcmVxLT5zbG90KTsKKwkJb2JqX3JlcS0+c2xvdCA9IE5VTEw7CisJfQorCXJlbGVhc2Vfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfb2JqZWN0KHN0cnVjdCBhbHRfYmFzZSAqcmVwbywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChzaGExKTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0X3JlcXVlc3QgKm9ial9yZXEgPSBvYmplY3RfcXVldWVfaGVhZDsKKworCXdoaWxlIChvYmpfcmVxICE9IE5VTEwgJiYgbWVtY21wKG9ial9yZXEtPnNoYTEsIHNoYTEsIDIwKSkKKwkJb2JqX3JlcSA9IG9ial9yZXEtPm5leHQ7CisJaWYgKG9ial9yZXEgPT0gTlVMTCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBmaW5kIHJlcXVlc3QgZm9yICVzIGluIHRoZSBxdWV1ZSIsIGhleCk7CisKKwlpZiAoaGFzX3NoYTFfZmlsZShvYmpfcmVxLT5zaGExKSkgeworCQlhYm9ydF9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwl3aGlsZSAob2JqX3JlcS0+c3RhdGUgPT0gV0FJVElORykgeworCQlzdGVwX2FjdGl2ZV9zbG90cygpOworCX0KKyNlbHNlCisJc3RhcnRfb2JqZWN0X3JlcXVlc3Qob2JqX3JlcSk7CisjZW5kaWYKKworCXdoaWxlIChvYmpfcmVxLT5zdGF0ZSA9PSBBQ1RJVkUpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KG9ial9yZXEtPnNsb3QpOworCX0KKwlpZiAob2JqX3JlcS0+bG9jYWwgIT0gLTEpIHsKKwkJY2xvc2Uob2JqX3JlcS0+bG9jYWwpOyBvYmpfcmVxLT5sb2NhbCA9IC0xOworCX0KKworCWlmIChvYmpfcmVxLT5zdGF0ZSA9PSBBQk9SVEVEKSB7CisJCXJldCA9IGVycm9yKCJSZXF1ZXN0IGZvciAlcyBhYm9ydGVkIiwgaGV4KTsKKwl9IGVsc2UgaWYgKG9ial9yZXEtPmN1cmxfcmVzdWx0ICE9IENVUkxFX09LICYmCisJCSAgIG9ial9yZXEtPmh0dHBfY29kZSAhPSA0MTYpIHsKKwkJaWYgKG9ial9yZXEtPmh0dHBfY29kZSA9PSA0MDQgfHwKKwkJICAgIG9ial9yZXEtPmN1cmxfcmVzdWx0ID09IENVUkxFX0ZJTEVfQ09VTEROVF9SRUFEX0ZJTEUpCisJCQlyZXQgPSAtMTsgLyogQmUgc2lsZW50LCBpdCBpcyBwcm9iYWJseSBpbiBhIHBhY2suICovCisJCWVsc2UKKwkJCXJldCA9IGVycm9yKCIlcyAoY3VybF9yZXN1bHQgPSAlZCwgaHR0cF9jb2RlID0gJWxkLCBzaGExID0gJXMpIiwKKwkJCQkgICAgb2JqX3JlcS0+ZXJyb3JzdHIsIG9ial9yZXEtPmN1cmxfcmVzdWx0LAorCQkJCSAgICBvYmpfcmVxLT5odHRwX2NvZGUsIGhleCk7CisJfSBlbHNlIGlmIChvYmpfcmVxLT56cmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQljb3JydXB0X29iamVjdF9mb3VuZCsrOworCQlyZXQgPSBlcnJvcigiRmlsZSAlcyAoJXMpIGNvcnJ1cHQiLCBoZXgsIG9ial9yZXEtPnVybCk7CisJfSBlbHNlIGlmIChtZW1jbXAob2JqX3JlcS0+c2hhMSwgb2JqX3JlcS0+cmVhbF9zaGExLCAyMCkpIHsKKwkJcmV0ID0gZXJyb3IoIkZpbGUgJXMgaGFzIGJhZCBoYXNoIiwgaGV4KTsKKwl9IGVsc2UgaWYgKG9ial9yZXEtPnJlbmFtZSA8IDApIHsKKwkJcmV0ID0gZXJyb3IoInVuYWJsZSB0byB3cml0ZSBzaGExIGZpbGVuYW1lICVzIiwKKwkJCSAgICBvYmpfcmVxLT5maWxlbmFtZSk7CisJfQorCisJcmVsZWFzZV9vYmplY3RfcmVxdWVzdChvYmpfcmVxKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZmV0Y2godW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgYWx0X2Jhc2UgKmFsdGJhc2UgPSBhbHQ7CisKKwlpZiAoIWZldGNoX29iamVjdChhbHRiYXNlLCBzaGExKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKGFsdGJhc2UpIHsKKwkJaWYgKCFmZXRjaF9wYWNrKGFsdGJhc2UsIHNoYTEpKQorCQkJcmV0dXJuIDA7CisJCWZldGNoX2FsdGVybmF0ZXMoYWx0LT5iYXNlKTsKKwkJYWx0YmFzZSA9IGFsdGJhc2UtPm5leHQ7CisJfQorCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGZpbmQgJXMgdW5kZXIgJXMiLCBzaGExX3RvX2hleChzaGExKSwKKwkJICAgICBhbHQtPmJhc2UpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZWVkc19xdW90ZShpbnQgY2gpCit7CisJaWYgKCgoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ1onKSkKKwkJCXx8ICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkKKwkJCXx8ICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJCXx8IChjaCA9PSAnLycpCisJCQl8fCAoY2ggPT0gJy0nKQorCQkJfHwgKGNoID09ICcuJykpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZXgoaW50IHYpCit7CisJaWYgKHYgPCAxMCkgcmV0dXJuICcwJyArIHY7CisJZWxzZSByZXR1cm4gJ0EnICsgdiAtIDEwOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfcmVmX3VybChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWYpCit7CisJY29uc3QgY2hhciAqY3A7CisJY2hhciAqZHAsICpxcmVmOworCWludCBsZW4sIGJhc2VsZW4sIGNoOworCisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlsZW4gPSBiYXNlbGVuICsgNjsgLyogInJlZnMvIiArIE5VTCAqLworCWZvciAoY3AgPSByZWY7IChjaCA9ICpjcCkgIT0gMDsgY3ArKywgbGVuKyspCisJCWlmIChuZWVkc19xdW90ZShjaCkpCisJCQlsZW4gKz0gMjsgLyogZXh0cmEgdHdvIGhleCBwbHVzIHJlcGxhY2VtZW50ICUgKi8KKwlxcmVmID0geG1hbGxvYyhsZW4pOworCW1lbWNweShxcmVmLCBiYXNlLCBiYXNlbGVuKTsKKwltZW1jcHkocXJlZiArIGJhc2VsZW4sICJyZWZzLyIsIDUpOworCWZvciAoY3AgPSByZWYsIGRwID0gcXJlZiArIGJhc2VsZW4gKyA1OyAoY2ggPSAqY3ApICE9IDA7IGNwKyspIHsKKwkJaWYgKG5lZWRzX3F1b3RlKGNoKSkgeworCQkJKmRwKysgPSAnJSc7CisJCQkqZHArKyA9IGhleCgoY2ggPj4gNCkgJiAweEYpOworCQkJKmRwKysgPSBoZXgoY2ggJiAweEYpOworCQl9CisJCWVsc2UKKwkJCSpkcCsrID0gY2g7CisJfQorCSpkcCA9IDA7CisKKwlyZXR1cm4gcXJlZjsKK30KKworaW50IGZldGNoX3JlZihjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisgICAgICAgIGNoYXIgKnVybDsKKyAgICAgICAgY2hhciBoZXhbNDJdOworICAgICAgICBzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKKwljb25zdCBjaGFyICpiYXNlID0gYWx0LT5iYXNlOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKyAgICAgICAgYnVmZmVyLnNpemUgPSA0MTsKKyAgICAgICAgYnVmZmVyLnBvc24gPSAwOworICAgICAgICBidWZmZXIuYnVmZmVyID0gaGV4OworICAgICAgICBoZXhbNDFdID0gJ1wwJzsKKworCXVybCA9IHF1b3RlX3JlZl91cmwoYmFzZSwgcmVmKTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spCisJCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGdldCAlcyBmb3IgJXNcbiVzIiwKKwkJCQkgICAgIHVybCwgcmVmLCBjdXJsX2Vycm9yc3RyKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisgICAgICAgIGhleFs0MF0gPSAnXDAnOworICAgICAgICBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgY29tbWl0czsKKwljb25zdCBjaGFyICoqd3JpdGVfcmVmID0gTlVMTDsKKwljaGFyICoqY29tbWl0X2lkOworCWNvbnN0IGNoYXIgKnVybDsKKwljaGFyICpwYXRoOworCWludCBhcmcgPSAxOworCWludCByYyA9IDA7CisKKwlzZXR1cF9pZGVudCgpOworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3QnKSB7CisJCQlnZXRfdHJlZSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAnYScpIHsKKwkJCWdldF9hbGwgPSAxOworCQkJZ2V0X3RyZWUgPSAxOworCQkJZ2V0X2hpc3RvcnkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndicpIHsKKwkJCWdldF92ZXJib3NlbHkgPSAxOworCQl9IGVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndycpIHsKKwkJCXdyaXRlX3JlZiA9ICZhcmd2W2FyZyArIDFdOworCQkJYXJnKys7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkgeworCQkJZ2V0X3JlY292ZXIgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1zdGRpbiIpKSB7CisJCQljb21taXRzX29uX3N0ZGluID0gMTsKKwkJfQorCQlhcmcrKzsKKwl9CisJaWYgKGFyZ2MgPCBhcmcgKyAyIC0gY29tbWl0c19vbl9zdGRpbikgeworCQl1c2FnZSgiZ2l0LWh0dHAtZmV0Y2ggWy1jXSBbLXRdIFstYV0gWy12XSBbLS1yZWNvdmVyXSBbLXcgcmVmXSBbLS1zdGRpbl0gY29tbWl0LWlkIHVybCIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGNvbW1pdHNfb25fc3RkaW4pIHsKKwkJY29tbWl0cyA9IHB1bGxfdGFyZ2V0c19zdGRpbigmY29tbWl0X2lkLCAmd3JpdGVfcmVmKTsKKwl9IGVsc2UgeworCQljb21taXRfaWQgPSAoY2hhciAqKikgJmFyZ3ZbYXJnKytdOworCQljb21taXRzID0gMTsKKwl9CisJdXJsID0gYXJndlthcmddOworCisJaHR0cF9pbml0KCk7CisKKwlub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQobm9fcHJhZ21hX2hlYWRlciwgIlByYWdtYToiKTsKKworCWFsdCA9IHhtYWxsb2Moc2l6ZW9mKCphbHQpKTsKKwlhbHQtPmJhc2UgPSB1cmw7CisJYWx0LT5nb3RfaW5kaWNlcyA9IDA7CisJYWx0LT5wYWNrcyA9IE5VTEw7CisJYWx0LT5uZXh0ID0gTlVMTDsKKwlwYXRoID0gc3Ryc3RyKHVybCwgIi8vIik7CisJaWYgKHBhdGgpIHsKKwkJcGF0aCA9IHN0cmNocihwYXRoKzIsICcvJyk7CisJCWlmIChwYXRoKQorCQkJYWx0LT5wYXRoX2xlbiA9IHN0cmxlbihwYXRoKTsKKwl9CisKKwlpZiAocHVsbChjb21taXRzLCBjb21taXRfaWQsIHdyaXRlX3JlZiwgdXJsKSkKKwkJcmMgPSAxOworCisJaHR0cF9jbGVhbnVwKCk7CisKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKG5vX3ByYWdtYV9oZWFkZXIpOworCisJaWYgKGNvbW1pdHNfb25fc3RkaW4pCisJCXB1bGxfdGFyZ2V0c19mcmVlKGNvbW1pdHMsIGNvbW1pdF9pZCwgd3JpdGVfcmVmKTsKKworCWlmIChjb3JydXB0X29iamVjdF9mb3VuZCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKyJTb21lIGxvb3NlIG9iamVjdCB3ZXJlIGZvdW5kIHRvIGJlIGNvcnJ1cHQsIGJ1dCB0aGV5IG1pZ2h0IGJlIGp1c3RcbiIKKyJhIGZhbHNlICc0MDQgTm90IEZvdW5kJyBlcnJvciBtZXNzYWdlIHNlbnQgd2l0aCBpbmNvcnJlY3QgSFRUUFxuIgorInN0YXR1cyBjb2RlLiAgU3VnZ2VzdCBydW5uaW5nIGdpdCBmc2NrLW9iamVjdHMuXG4iKTsKKwl9CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaHR0cC1wdXNoLmMgYi9odHRwLXB1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU3MzNlCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC1wdXNoLmMKQEAgLTAsMCArMSwyNTkxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJ0YWcuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAiaHR0cC5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAicmV2aXNpb24uaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorCisjaW5jbHVkZSA8ZXhwYXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgaHR0cF9wdXNoX3VzYWdlW10gPQorImdpdC1odHRwLXB1c2ggWy0tYWxsXSBbLS1mb3JjZV0gWy0tdmVyYm9zZV0gPHJlbW90ZT4gWzxoZWFkPi4uLl1cbiI7CisKKyNpZm5kZWYgWE1MX1NUQVRVU19PSworZW51bSBYTUxfU3RhdHVzIHsKKyAgWE1MX1NUQVRVU19PSyA9IDEsCisgIFhNTF9TVEFUVVNfRVJST1IgPSAwCit9OworI2RlZmluZSBYTUxfU1RBVFVTX09LICAgIDEKKyNkZWZpbmUgWE1MX1NUQVRVU19FUlJPUiAwCisjZW5kaWYKKworI2RlZmluZSBQUkVWX0JVRl9TSVpFIDQwOTYKKyNkZWZpbmUgUkFOR0VfSEVBREVSX1NJWkUgMzAKKworLyogREFWIG1ldGhvZHMgKi8KKyNkZWZpbmUgREFWX0xPQ0sgIkxPQ0siCisjZGVmaW5lIERBVl9NS0NPTCAiTUtDT0wiCisjZGVmaW5lIERBVl9NT1ZFICJNT1ZFIgorI2RlZmluZSBEQVZfUFJPUEZJTkQgIlBST1BGSU5EIgorI2RlZmluZSBEQVZfUFVUICJQVVQiCisjZGVmaW5lIERBVl9VTkxPQ0sgIlVOTE9DSyIKKyNkZWZpbmUgREFWX0RFTEVURSAiREVMRVRFIgorCisvKiBEQVYgbG9jayBmbGFncyAqLworI2RlZmluZSBEQVZfUFJPUF9MT0NLV1IgKDF1IDw8IDApCisjZGVmaW5lIERBVl9QUk9QX0xPQ0tFWCAoMXUgPDwgMSkKKyNkZWZpbmUgREFWX0xPQ0tfT0sgKDF1IDw8IDIpCisKKy8qIERBViBYTUwgcHJvcGVydGllcyAqLworI2RlZmluZSBEQVZfQ1RYX0xPQ0tFTlRSWSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkiCisjZGVmaW5lIERBVl9DVFhfTE9DS1RZUEVfV1JJVEUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5wcm9wc3RhdC5wcm9wLnN1cHBvcnRlZGxvY2subG9ja2VudHJ5LmxvY2t0eXBlLndyaXRlIgorI2RlZmluZSBEQVZfQ1RYX0xPQ0tUWVBFX0VYQ0xVU0lWRSAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3Auc3VwcG9ydGVkbG9jay5sb2NrZW50cnkubG9ja3Njb3BlLmV4Y2x1c2l2ZSIKKyNkZWZpbmUgREFWX0FDVElWRUxPQ0tfT1dORVIgIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay5vd25lci5ocmVmIgorI2RlZmluZSBEQVZfQUNUSVZFTE9DS19USU1FT1VUICIucHJvcC5sb2NrZGlzY292ZXJ5LmFjdGl2ZWxvY2sudGltZW91dCIKKyNkZWZpbmUgREFWX0FDVElWRUxPQ0tfVE9LRU4gIi5wcm9wLmxvY2tkaXNjb3ZlcnkuYWN0aXZlbG9jay5sb2NrdG9rZW4uaHJlZiIKKyNkZWZpbmUgREFWX1BST1BGSU5EX1JFU1AgIi5tdWx0aXN0YXR1cy5yZXNwb25zZSIKKyNkZWZpbmUgREFWX1BST1BGSU5EX05BTUUgIi5tdWx0aXN0YXR1cy5yZXNwb25zZS5ocmVmIgorI2RlZmluZSBEQVZfUFJPUEZJTkRfQ09MTEVDVElPTiAiLm11bHRpc3RhdHVzLnJlc3BvbnNlLnByb3BzdGF0LnByb3AucmVzb3VyY2V0eXBlLmNvbGxlY3Rpb24iCisKKy8qIERBViByZXF1ZXN0IGJvZHkgdGVtcGxhdGVzICovCisjZGVmaW5lIFBST1BGSU5EX1NVUFBPUlRFRExPQ0tfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6cHJvcGZpbmQgeG1sbnM6RD1cIkRBVjpcIj5cbjxEOnByb3AgeG1sbnM6Uj1cIiVzXCI+XG48RDpzdXBwb3J0ZWRsb2NrLz5cbjwvRDpwcm9wPlxuPC9EOnByb3BmaW5kPiIKKyNkZWZpbmUgUFJPUEZJTkRfQUxMX1JFUVVFU1QgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCIgPz5cbjxEOnByb3BmaW5kIHhtbG5zOkQ9XCJEQVY6XCI+XG48RDphbGxwcm9wLz5cbjwvRDpwcm9wZmluZD4iCisjZGVmaW5lIExPQ0tfUkVRVUVTVCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwidXRmLThcIiA/PlxuPEQ6bG9ja2luZm8geG1sbnM6RD1cIkRBVjpcIj5cbjxEOmxvY2tzY29wZT48RDpleGNsdXNpdmUvPjwvRDpsb2Nrc2NvcGU+XG48RDpsb2NrdHlwZT48RDp3cml0ZS8+PC9EOmxvY2t0eXBlPlxuPEQ6b3duZXI+XG48RDpocmVmPm1haWx0bzolczwvRDpocmVmPlxuPC9EOm93bmVyPlxuPC9EOmxvY2tpbmZvPiIKKworI2RlZmluZSBMT0NLX1RJTUUgNjAwCisjZGVmaW5lIExPQ0tfUkVGUkVTSCAzMAorCisvKiBiaXRzICMwLTE1IGluIHJldmlzaW9uLmggKi8KKworI2RlZmluZSBMT0NBTCAgICAoMXU8PDE2KQorI2RlZmluZSBSRU1PVEUgICAoMXU8PDE3KQorI2RlZmluZSBGRVRDSElORyAoMXU8PDE4KQorI2RlZmluZSBQVVNISU5HICAoMXU8PDE5KQorCisvKiBXZSBhbGxvdyAicmVjdXJzaXZlIiBzeW1ib2xpYyByZWZzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaCAqLworI2RlZmluZSBNQVhERVBUSCA1CisKK3N0YXRpYyBpbnQgcHVzaGluZyA9IDA7CitzdGF0aWMgaW50IGFib3J0ZWQgPSAwOworc3RhdGljIHNpZ25lZCBjaGFyIHJlbW90ZV9kaXJfZXhpc3RzWzI1Nl07CisKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqbm9fcHJhZ21hX2hlYWRlcjsKK3N0YXRpYyBzdHJ1Y3QgY3VybF9zbGlzdCAqZGVmYXVsdF9oZWFkZXJzOworCitzdGF0aWMgaW50IHB1c2hfdmVyYm9zZWx5ID0gMDsKK3N0YXRpYyBpbnQgcHVzaF9hbGwgPSAwOworc3RhdGljIGludCBmb3JjZV9hbGwgPSAwOworCitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICpvYmplY3RzID0gTlVMTDsKKworc3RydWN0IHJlcG8KK3sKKwljaGFyICp1cmw7CisJaW50IHBhdGhfbGVuOworCWludCBoYXNfaW5mb19yZWZzOworCWludCBjYW5fdXBkYXRlX2luZm9fcmVmczsKKwlpbnQgaGFzX2luZm9fcGFja3M7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2tzOworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9ja3M7Cit9OworCitzdGF0aWMgc3RydWN0IHJlcG8gKnJlbW90ZSA9IE5VTEw7CisKK2VudW0gdHJhbnNmZXJfc3RhdGUgeworCU5FRURfRkVUQ0gsCisJUlVOX0ZFVENIX0xPT1NFLAorCVJVTl9GRVRDSF9QQUNLRUQsCisJTkVFRF9QVVNILAorCVJVTl9NS0NPTCwKKwlSVU5fUFVULAorCVJVTl9NT1ZFLAorCUFCT1JURUQsCisJQ09NUExFVEUsCit9OworCitzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdAoreworCXN0cnVjdCBvYmplY3QgKm9iajsKKwljaGFyICp1cmw7CisJY2hhciAqZGVzdDsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2s7CisJc3RydWN0IGN1cmxfc2xpc3QgKmhlYWRlcnM7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlpbnQgbG9jYWxfZmlsZW5vOworCUZJTEUgKmxvY2FsX3N0cmVhbTsKKwllbnVtIHRyYW5zZmVyX3N0YXRlIHN0YXRlOworCUNVUkxjb2RlIGN1cmxfcmVzdWx0OworCWNoYXIgZXJyb3JzdHJbQ1VSTF9FUlJPUl9TSVpFXTsKKwlsb25nIGh0dHBfY29kZTsKKwl1bnNpZ25lZCBjaGFyIHJlYWxfc2hhMVsyMF07CisJU0hBX0NUWCBjOworCXpfc3RyZWFtIHN0cmVhbTsKKwlpbnQgenJldDsKKwlpbnQgcmVuYW1lOworCXZvaWQgKnVzZXJEYXRhOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpuZXh0OworfTsKKworc3RhdGljIHN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0X3F1ZXVlX2hlYWQgPSBOVUxMOworCitzdHJ1Y3QgeG1sX2N0eAoreworCWNoYXIgKm5hbWU7CisJaW50IGxlbjsKKwljaGFyICpjZGF0YTsKKwl2b2lkICgqdXNlckZ1bmMpKHN0cnVjdCB4bWxfY3R4ICpjdHgsIGludCB0YWdfY2xvc2VkKTsKKwl2b2lkICp1c2VyRGF0YTsKK307CisKK3N0cnVjdCByZW1vdGVfbG9jaworeworCWNoYXIgKnVybDsKKwljaGFyICpvd25lcjsKKwljaGFyICp0b2tlbjsKKwl0aW1lX3Qgc3RhcnRfdGltZTsKKwlsb25nIHRpbWVvdXQ7CisJaW50IHJlZnJlc2hpbmc7CisJc3RydWN0IHJlbW90ZV9sb2NrICpuZXh0OworfTsKKworLyogRmxhZ3MgdGhhdCBjb250cm9sIHJlbW90ZV9scyBwcm9jZXNzaW5nICovCisjZGVmaW5lIFBST0NFU1NfRklMRVMgKDF1IDw8IDApCisjZGVmaW5lIFBST0NFU1NfRElSUyAgKDF1IDw8IDEpCisjZGVmaW5lIFJFQ1VSU0lWRSAgICAgKDF1IDw8IDIpCisKKy8qIEZsYWdzIHRoYXQgcmVtb3RlX2xzIHBhc3NlcyB0byBjYWxsYmFjayBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgSVNfRElSICgxdSA8PCAwKQorCitzdHJ1Y3QgcmVtb3RlX2xzX2N0eAoreworCWNoYXIgKnBhdGg7CisJdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpOworCXZvaWQgKnVzZXJEYXRhOworCWludCBmbGFnczsKKwljaGFyICpkZW50cnlfbmFtZTsKKwlpbnQgZGVudHJ5X2ZsYWdzOworCXN0cnVjdCByZW1vdGVfbHNfY3R4ICpwYXJlbnQ7Cit9OworCitzdGF0aWMgdm9pZCBmaW5pc2hfcmVxdWVzdChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCk7CitzdGF0aWMgdm9pZCByZWxlYXNlX3JlcXVlc3Qoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Jlc3BvbnNlKHZvaWQgKmNhbGxiYWNrX2RhdGEpCit7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPQorCQkoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKiljYWxsYmFja19kYXRhOworCisJZmluaXNoX3JlcXVlc3QocmVxdWVzdCk7Cit9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorc3RhdGljIHNpemVfdCBmd3JpdGVfc2hhMV9maWxlKHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsIHNpemVfdCBubWVtYiwKKwkJCSAgICAgICB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGNoYXIgZXhwbls0MDk2XTsKKwlzaXplX3Qgc2l6ZSA9IGVsdHNpemUgKiBubWVtYjsKKwlpbnQgcG9zbiA9IDA7CisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QgPSAoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKilkYXRhOworCWRvIHsKKwkJc3NpemVfdCByZXR2YWwgPSB3cml0ZShyZXF1ZXN0LT5sb2NhbF9maWxlbm8sCisJCQkJICAgICAgIChjaGFyICopIHB0ciArIHBvc24sIHNpemUgLSBwb3NuKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcG9zbjsKKwkJcG9zbiArPSByZXR2YWw7CisJfSB3aGlsZSAocG9zbiA8IHNpemUpOworCisJcmVxdWVzdC0+c3RyZWFtLmF2YWlsX2luID0gc2l6ZTsKKwlyZXF1ZXN0LT5zdHJlYW0ubmV4dF9pbiA9IHB0cjsKKwlkbyB7CisJCXJlcXVlc3QtPnN0cmVhbS5uZXh0X291dCA9IGV4cG47CisJCXJlcXVlc3QtPnN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZXhwbik7CisJCXJlcXVlc3QtPnpyZXQgPSBpbmZsYXRlKCZyZXF1ZXN0LT5zdHJlYW0sIFpfU1lOQ19GTFVTSCk7CisJCVNIQTFfVXBkYXRlKCZyZXF1ZXN0LT5jLCBleHBuLAorCQkJICAgIHNpemVvZihleHBuKSAtIHJlcXVlc3QtPnN0cmVhbS5hdmFpbF9vdXQpOworCX0gd2hpbGUgKHJlcXVlc3QtPnN0cmVhbS5hdmFpbF9pbiAmJiByZXF1ZXN0LT56cmV0ID09IFpfT0spOworCWRhdGFfcmVjZWl2ZWQrKzsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZmV0Y2hfbG9vc2Uoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKTsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyIHByZXZmaWxlW1BBVEhfTUFYXTsKKwljaGFyICp1cmw7CisJY2hhciAqcG9zbjsKKwlpbnQgcHJldmxvY2FsOworCXVuc2lnbmVkIGNoYXIgcHJldl9idWZbUFJFVl9CVUZfU0laRV07CisJc3NpemVfdCBwcmV2X3JlYWQgPSAwOworCWxvbmcgcHJldl9wb3NuID0gMDsKKwljaGFyIHJhbmdlW1JBTkdFX0hFQURFUl9TSVpFXTsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqcmFuZ2VfaGVhZGVyID0gTlVMTDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKworCWZpbGVuYW1lID0gc2hhMV9maWxlX25hbWUocmVxdWVzdC0+b2JqLT5zaGExKTsKKwlzbnByaW50ZihyZXF1ZXN0LT5maWxlbmFtZSwgc2l6ZW9mKHJlcXVlc3QtPmZpbGVuYW1lKSwgIiVzIiwgZmlsZW5hbWUpOworCXNucHJpbnRmKHJlcXVlc3QtPnRtcGZpbGUsIHNpemVvZihyZXF1ZXN0LT50bXBmaWxlKSwKKwkJICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCisJc25wcmludGYocHJldmZpbGUsIHNpemVvZihwcmV2ZmlsZSksICIlcy5wcmV2IiwgcmVxdWVzdC0+ZmlsZW5hbWUpOworCXVubGluayhwcmV2ZmlsZSk7CisJcmVuYW1lKHJlcXVlc3QtPnRtcGZpbGUsIHByZXZmaWxlKTsKKwl1bmxpbmsocmVxdWVzdC0+dG1wZmlsZSk7CisKKwlpZiAocmVxdWVzdC0+bG9jYWxfZmlsZW5vICE9IC0xKQorCQllcnJvcigiZmQgbGVha2FnZSBpbiBzdGFydDogJWQiLCByZXF1ZXN0LT5sb2NhbF9maWxlbm8pOworCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IG9wZW4ocmVxdWVzdC0+dG1wZmlsZSwKKwkJCQkgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJLyogVGhpcyBjb3VsZCBoYXZlIGZhaWxlZCBkdWUgdG8gdGhlICJsYXp5IGRpcmVjdG9yeSBjcmVhdGlvbiI7CisJICogdHJ5IHRvIG1rZGlyIHRoZSBsYXN0IHBhdGggY29tcG9uZW50LgorCSAqLworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gPCAwICYmIGVycm5vID09IEVOT0VOVCkgeworCQljaGFyICpkaXIgPSBzdHJyY2hyKHJlcXVlc3QtPnRtcGZpbGUsICcvJyk7CisJCWlmIChkaXIpIHsKKwkJCSpkaXIgPSAwOworCQkJbWtkaXIocmVxdWVzdC0+dG1wZmlsZSwgMDc3Nyk7CisJCQkqZGlyID0gJy8nOworCQl9CisJCXJlcXVlc3QtPmxvY2FsX2ZpbGVubyA9IG9wZW4ocmVxdWVzdC0+dG1wZmlsZSwKKwkJCQkJICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wsIDA2NjYpOworCX0KKworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gPCAwKSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSAlcyBmb3IgJXM6ICVzIiwKKwkJICAgICAgcmVxdWVzdC0+dG1wZmlsZSwgcmVxdWVzdC0+ZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoJnJlcXVlc3QtPnN0cmVhbSwgMCwgc2l6ZW9mKHJlcXVlc3QtPnN0cmVhbSkpOworCisJaW5mbGF0ZUluaXQoJnJlcXVlc3QtPnN0cmVhbSk7CisKKwlTSEExX0luaXQoJnJlcXVlc3QtPmMpOworCisJdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgNTApOworCXJlcXVlc3QtPnVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIDUwKTsKKwlzdHJjcHkodXJsLCByZW1vdGUtPnVybCk7CisJcG9zbiA9IHVybCArIHN0cmxlbihyZW1vdGUtPnVybCk7CisJc3RyY3B5KHBvc24sICJvYmplY3RzLyIpOworCXBvc24gKz0gODsKKwltZW1jcHkocG9zbiwgaGV4LCAyKTsKKwlwb3NuICs9IDI7CisJKihwb3NuKyspID0gJy8nOworCXN0cmNweShwb3NuLCBoZXggKyAyKTsKKwlzdHJjcHkocmVxdWVzdC0+dXJsLCB1cmwpOworCisJLyogSWYgYSBwcmV2aW91cyB0ZW1wIGZpbGUgaXMgcHJlc2VudCwgcHJvY2VzcyB3aGF0IHdhcyBhbHJlYWR5CisJICAgZmV0Y2hlZC4gKi8KKwlwcmV2bG9jYWwgPSBvcGVuKHByZXZmaWxlLCBPX1JET05MWSk7CisJaWYgKHByZXZsb2NhbCAhPSAtMSkgeworCQlkbyB7CisJCQlwcmV2X3JlYWQgPSByZWFkKHByZXZsb2NhbCwgcHJldl9idWYsIFBSRVZfQlVGX1NJWkUpOworCQkJaWYgKHByZXZfcmVhZD4wKSB7CisJCQkJaWYgKGZ3cml0ZV9zaGExX2ZpbGUocHJldl9idWYsCisJCQkJCQkgICAgIDEsCisJCQkJCQkgICAgIHByZXZfcmVhZCwKKwkJCQkJCSAgICAgcmVxdWVzdCkgPT0gcHJldl9yZWFkKSB7CisJCQkJCXByZXZfcG9zbiArPSBwcmV2X3JlYWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJldl9yZWFkID0gLTE7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChwcmV2X3JlYWQgPiAwKTsKKwkJY2xvc2UocHJldmxvY2FsKTsKKwl9CisJdW5saW5rKHByZXZmaWxlKTsKKworCS8qIFJlc2V0IGluZmxhdGUvU0hBMSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgcHJldmlvdXMgdGVtcAorCSAgIGZpbGU7IGFsc28gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxvY2FsIGZpbGUuICovCisJaWYgKHByZXZfcmVhZCA9PSAtMSkgeworCQltZW1zZXQoJnJlcXVlc3QtPnN0cmVhbSwgMCwgc2l6ZW9mKHJlcXVlc3QtPnN0cmVhbSkpOworCQlpbmZsYXRlSW5pdCgmcmVxdWVzdC0+c3RyZWFtKTsKKwkJU0hBMV9Jbml0KCZyZXF1ZXN0LT5jKTsKKwkJaWYgKHByZXZfcG9zbj4wKSB7CisJCQlwcmV2X3Bvc24gPSAwOworCQkJbHNlZWsocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCBTRUVLX1NFVCwgMCk7CisJCQlmdHJ1bmNhdGUocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwKTsKKwkJfQorCX0KKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCByZXF1ZXN0KTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX3NoYTFfZmlsZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0VSUk9SQlVGRkVSLCByZXF1ZXN0LT5lcnJvcnN0cik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgbm9fcHJhZ21hX2hlYWRlcik7CisKKwkvKiBJZiB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgZGF0YSBmcm9tIGEgcHJldmlvdXMgZmV0Y2gKKwkgICBhdHRlbXB0LCBvbmx5IGZldGNoIHRoZSBkYXRhIHdlIGRvbid0IGFscmVhZHkgaGF2ZS4gKi8KKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIG9iamVjdCAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsCisJCQkJIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwkvKiBUcnkgdG8gZ2V0IHRoZSByZXF1ZXN0IHN0YXJ0ZWQsIGFib3J0IHRoZSByZXF1ZXN0IG9uIGVycm9yICovCisJcmVxdWVzdC0+c3RhdGUgPSBSVU5fRkVUQ0hfTE9PU0U7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9ta2NvbChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCWNoYXIgKnBvc247CisKKwlyZXF1ZXN0LT51cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAxMyk7CisJc3RyY3B5KHJlcXVlc3QtPnVybCwgcmVtb3RlLT51cmwpOworCXBvc24gPSByZXF1ZXN0LT51cmwgKyBzdHJsZW4ocmVtb3RlLT51cmwpOworCXN0cmNweShwb3NuLCAib2JqZWN0cy8iKTsKKwlwb3NuICs9IDg7CisJbWVtY3B5KHBvc24sIGhleCwgMik7CisJcG9zbiArPSAyOworCXN0cmNweShwb3NuLCAiLyIpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsgLyogdW5kbyBQVVQgc2V0dXAgKi8KKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZXF1ZXN0LT51cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9FUlJPUkJVRkZFUiwgcmVxdWVzdC0+ZXJyb3JzdHIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTUtDT0wpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJCXJlcXVlc3QtPnN0YXRlID0gUlVOX01LQ09MOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdGFydF9mZXRjaF9wYWNrZWQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJRklMRSAqcGFja2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJbG9uZyBwcmV2X3Bvc24gPSAwOworCWNoYXIgcmFuZ2VbUkFOR0VfSEVBREVSX1NJWkVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpyYW5nZV9oZWFkZXIgPSBOVUxMOworCisJc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKmNoZWNrX3JlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisKKwl0YXJnZXQgPSBmaW5kX3NoYTFfcGFjayhyZXF1ZXN0LT5vYmotPnNoYTEsIHJlbW90ZS0+cGFja3MpOworCWlmICghdGFyZ2V0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZldGNoICVzLCB3aWxsIG5vdCBiZSBhYmxlIHRvIHVwZGF0ZSBzZXJ2ZXIgaW5mbyByZWZzXG4iLCBzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpKTsKKwkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwkJcmV0dXJuOworCX0KKworCWZwcmludGYoc3RkZXJyLAkiRmV0Y2hpbmcgcGFjayAlc1xuIiwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJZnByaW50ZihzdGRlcnIsICIgd2hpY2ggY29udGFpbnMgJXNcbiIsIHNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSkpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfbmFtZSh0YXJnZXQtPnNoYTEpOworCXNucHJpbnRmKHJlcXVlc3QtPmZpbGVuYW1lLCBzaXplb2YocmVxdWVzdC0+ZmlsZW5hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CisJc25wcmludGYocmVxdWVzdC0+dG1wZmlsZSwgc2l6ZW9mKHJlcXVlc3QtPnRtcGZpbGUpLAorCQkgIiVzLnRlbXAiLCBmaWxlbmFtZSk7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyA2NCk7CisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLnBhY2siLAorCQlyZW1vdGUtPnVybCwgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXNuJ3QgYW5vdGhlciBvcGVuIHJlcXVlc3QgZm9yIHRoaXMgcGFjayAqLworCXdoaWxlIChjaGVja19yZXF1ZXN0KSB7CisJCWlmIChjaGVja19yZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fRkVUQ0hfUEFDS0VEICYmCisJCSAgICAhc3RyY21wKGNoZWNrX3JlcXVlc3QtPnVybCwgdXJsKSkgeworCQkJZnJlZSh1cmwpOworCQkJcmVsZWFzZV9yZXF1ZXN0KHJlcXVlc3QpOworCQkJcmV0dXJuOworCQl9CisJCWNoZWNrX3JlcXVlc3QgPSBjaGVja19yZXF1ZXN0LT5uZXh0OworCX0KKworCXBhY2tmaWxlID0gZm9wZW4ocmVxdWVzdC0+dG1wZmlsZSwgImEiKTsKKwlpZiAoIXBhY2tmaWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayIsCisJCQlmaWxlbmFtZSk7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlmcmVlKHVybCk7CisJCXJldHVybjsKKwl9CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+Y2FsbGJhY2tfZnVuYyA9IHByb2Nlc3NfcmVzcG9uc2U7CisJc2xvdC0+Y2FsbGJhY2tfZGF0YSA9IHJlcXVlc3Q7CisJcmVxdWVzdC0+c2xvdCA9IHNsb3Q7CisJcmVxdWVzdC0+bG9jYWxfc3RyZWFtID0gcGFja2ZpbGU7CisJcmVxdWVzdC0+dXNlckRhdGEgPSB0YXJnZXQ7CisKKwlyZXF1ZXN0LT51cmwgPSB1cmw7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsIHBhY2tmaWxlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBub19wcmFnbWFfaGVhZGVyKTsKKwlzbG90LT5sb2NhbCA9IHBhY2tmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKHBhY2tmaWxlKTsKKwlpZiAocHJldl9wb3NuPjApIHsKKwkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlJlc3VtaW5nIGZldGNoIG9mIHBhY2sgJXMgYXQgYnl0ZSAlbGRcbiIsCisJCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgcHJldl9wb3NuKTsKKwkJc3ByaW50ZihyYW5nZSwgIlJhbmdlOiBieXRlcz0lbGQtIiwgcHJldl9wb3NuKTsKKwkJcmFuZ2VfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQocmFuZ2VfaGVhZGVyLCByYW5nZSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCByYW5nZV9oZWFkZXIpOworCX0KKworCS8qIFRyeSB0byBnZXQgdGhlIHJlcXVlc3Qgc3RhcnRlZCwgYWJvcnQgdGhlIHJlcXVlc3Qgb24gZXJyb3IgKi8KKwlyZXF1ZXN0LT5zdGF0ZSA9IFJVTl9GRVRDSF9QQUNLRUQ7CisJaWYgKCFzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBHRVQgcmVxdWVzdFxuIik7CisJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9wdXQoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgocmVxdWVzdC0+b2JqLT5zaGExKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwljaGFyICpwb3NuOworCWNoYXIgdHlwZVsyMF07CisJY2hhciBoZHJbNTBdOworCXZvaWQgKnVucGFja2VkOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWludCBoZHJsZW47CisJc3NpemVfdCBzaXplOworCXpfc3RyZWFtIHN0cmVhbTsKKworCXVucGFja2VkID0gcmVhZF9zaGExX2ZpbGUocmVxdWVzdC0+b2JqLT5zaGExLCB0eXBlLCAmbGVuKTsKKwloZHJsZW4gPSBzcHJpbnRmKGhkciwgIiVzICVsdSIsIHR5cGUsIGxlbikgKyAxOworCisJLyogU2V0IGl0IHVwICovCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlkZWZsYXRlSW5pdCgmc3RyZWFtLCB6bGliX2NvbXByZXNzaW9uX2xldmVsKTsKKwlzaXplID0gZGVmbGF0ZUJvdW5kKCZzdHJlYW0sIGxlbiArIGhkcmxlbik7CisJcmVxdWVzdC0+YnVmZmVyLmJ1ZmZlciA9IHhtYWxsb2Moc2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X291dCA9IHJlcXVlc3QtPmJ1ZmZlci5idWZmZXI7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisKKwkvKiBGaXJzdCBoZWFkZXIuLiAqLworCXN0cmVhbS5uZXh0X2luID0gKHZvaWQgKiloZHI7CisJc3RyZWFtLmF2YWlsX2luID0gaGRybGVuOworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIDApID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisKKwkvKiBUaGVuIHRoZSBkYXRhIGl0c2VsZi4uICovCisJc3RyZWFtLm5leHRfaW4gPSB1bnBhY2tlZDsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpID09IFpfT0spCisJCS8qIG5vdGhpbmcgKi87CisJZGVmbGF0ZUVuZCgmc3RyZWFtKTsKKwlmcmVlKHVucGFja2VkKTsKKworCXJlcXVlc3QtPmJ1ZmZlci5zaXplID0gc3RyZWFtLnRvdGFsX291dDsKKwlyZXF1ZXN0LT5idWZmZXIucG9zbiA9IDA7CisKKwlyZXF1ZXN0LT51cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyAKKwkJCSAgICAgICBzdHJsZW4ocmVxdWVzdC0+bG9jay0+dG9rZW4pICsgNTEpOworCXN0cmNweShyZXF1ZXN0LT51cmwsIHJlbW90ZS0+dXJsKTsKKwlwb3NuID0gcmVxdWVzdC0+dXJsICsgc3RybGVuKHJlbW90ZS0+dXJsKTsKKwlzdHJjcHkocG9zbiwgIm9iamVjdHMvIik7CisJcG9zbiArPSA4OworCW1lbWNweShwb3NuLCBoZXgsIDIpOworCXBvc24gKz0gMjsKKwkqKHBvc24rKykgPSAnLyc7CisJc3RyY3B5KHBvc24sIGhleCArIDIpOworCXJlcXVlc3QtPmRlc3QgPSB4bWFsbG9jKHN0cmxlbihyZXF1ZXN0LT51cmwpICsgMTQpOworCXNwcmludGYocmVxdWVzdC0+ZGVzdCwgIkRlc3RpbmF0aW9uOiAlcyIsIHJlcXVlc3QtPnVybCk7CisJcG9zbiArPSAzODsKKwkqKHBvc24rKykgPSAnXyc7CisJc3RyY3B5KHBvc24sIHJlcXVlc3QtPmxvY2stPnRva2VuKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gcHJvY2Vzc19yZXNwb25zZTsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gcmVxdWVzdDsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmcmVxdWVzdC0+YnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgcmVxdWVzdC0+YnVmZmVyLnNpemUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9udWxsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BVVCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1BVVCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVxdWVzdC0+dXJsKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKwkJcmVxdWVzdC0+c3RhdGUgPSBSVU5fUFVUOworCX0gZWxzZSB7CisJCXJlcXVlc3QtPnN0YXRlID0gQUJPUlRFRDsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfbW92ZShzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPmNhbGxiYWNrX2Z1bmMgPSBwcm9jZXNzX3Jlc3BvbnNlOworCXNsb3QtPmNhbGxiYWNrX2RhdGEgPSByZXF1ZXN0OworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsgLyogdW5kbyBQVVQgc2V0dXAgKi8KKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX01PVkUpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIHJlcXVlc3QtPmRlc3QpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJPdmVyd3JpdGU6IFQiKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgcmVxdWVzdC0+dXJsKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlyZXF1ZXN0LT5zbG90ID0gc2xvdDsKKwkJcmVxdWVzdC0+c3RhdGUgPSBSVU5fTU9WRTsKKwl9IGVsc2UgeworCQlyZXF1ZXN0LT5zdGF0ZSA9IEFCT1JURUQ7CisJCWZyZWUocmVxdWVzdC0+dXJsKTsKKwkJcmVxdWVzdC0+dXJsID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVmcmVzaF9sb2NrKHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqaWZfaGVhZGVyOworCWNoYXIgdGltZW91dF9oZWFkZXJbMjVdOworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCWxvY2stPnJlZnJlc2hpbmcgPSAxOworCisJaWZfaGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMjUpOworCXNwcmludGYoaWZfaGVhZGVyLCAiSWY6ICg8b3BhcXVlbG9ja3Rva2VuOiVzPikiLCBsb2NrLT50b2tlbik7CisJc3ByaW50Zih0aW1lb3V0X2hlYWRlciwgIlRpbWVvdXQ6IFNlY29uZC0lbGQiLCBsb2NrLT50aW1lb3V0KTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCBpZl9oZWFkZXIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIHRpbWVvdXRfaGVhZGVyKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgbG9jay0+dXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX0xPQ0spOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnByaW50ZihzdGRlcnIsICJMT0NLIEhUVFAgZXJyb3IgJWxkXG4iLAorCQkJCXJlc3VsdHMuaHR0cF9jb2RlKTsKKwkJfSBlbHNlIHsKKwkJCWxvY2stPnN0YXJ0X3RpbWUgPSB0aW1lKE5VTEwpOworCQkJcmMgPSAxOworCQl9CisJfQorCisJbG9jay0+cmVmcmVzaGluZyA9IDA7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7CisJZnJlZShpZl9oZWFkZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBjaGVja19sb2Nrcyh2b2lkKQoreworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9jayA9IHJlbW90ZS0+bG9ja3M7CisJdGltZV90IGN1cnJlbnRfdGltZSA9IHRpbWUoTlVMTCk7CisJaW50IHRpbWVfcmVtYWluaW5nOworCisJd2hpbGUgKGxvY2spIHsKKwkJdGltZV9yZW1haW5pbmcgPSBsb2NrLT5zdGFydF90aW1lICsgbG9jay0+dGltZW91dCAtCisJCQljdXJyZW50X3RpbWU7CisJCWlmICghbG9jay0+cmVmcmVzaGluZyAmJiB0aW1lX3JlbWFpbmluZyA8IExPQ0tfUkVGUkVTSCkgeworCQkJaWYgKCFyZWZyZXNoX2xvY2sobG9jaykpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIlVuYWJsZSB0byByZWZyZXNoIGxvY2sgZm9yICVzXG4iLAorCQkJCQlsb2NrLT51cmwpOworCQkJCWFib3J0ZWQgPSAxOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlsb2NrID0gbG9jay0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVxdWVzdChzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqZW50cnkgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisKKwlpZiAocmVxdWVzdCA9PSByZXF1ZXN0X3F1ZXVlX2hlYWQpIHsKKwkJcmVxdWVzdF9xdWV1ZV9oZWFkID0gcmVxdWVzdC0+bmV4dDsKKwl9IGVsc2UgeworCQl3aGlsZSAoZW50cnktPm5leHQgIT0gTlVMTCAmJiBlbnRyeS0+bmV4dCAhPSByZXF1ZXN0KQorCQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwkJaWYgKGVudHJ5LT5uZXh0ID09IHJlcXVlc3QpCisJCQllbnRyeS0+bmV4dCA9IGVudHJ5LT5uZXh0LT5uZXh0OworCX0KKworCWlmIChyZXF1ZXN0LT5sb2NhbF9maWxlbm8gIT0gLTEpCisJCWNsb3NlKHJlcXVlc3QtPmxvY2FsX2ZpbGVubyk7CisJaWYgKHJlcXVlc3QtPmxvY2FsX3N0cmVhbSkKKwkJZmNsb3NlKHJlcXVlc3QtPmxvY2FsX3N0cmVhbSk7CisJaWYgKHJlcXVlc3QtPnVybCAhPSBOVUxMKQorCQlmcmVlKHJlcXVlc3QtPnVybCk7CisJZnJlZShyZXF1ZXN0KTsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX3JlcXVlc3Qoc3RydWN0IHRyYW5zZmVyX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IHBhY2tlZF9naXQgKnRhcmdldDsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqKmxzdDsKKworCXJlcXVlc3QtPmN1cmxfcmVzdWx0ID0gcmVxdWVzdC0+c2xvdC0+Y3VybF9yZXN1bHQ7CisJcmVxdWVzdC0+aHR0cF9jb2RlID0gcmVxdWVzdC0+c2xvdC0+aHR0cF9jb2RlOworCXJlcXVlc3QtPnNsb3QgPSBOVUxMOworCisJLyogS2VlcCBsb2NrcyBhY3RpdmUgKi8KKwljaGVja19sb2NrcygpOworCisJaWYgKHJlcXVlc3QtPmhlYWRlcnMgIT0gTlVMTCkKKwkJY3VybF9zbGlzdF9mcmVlX2FsbChyZXF1ZXN0LT5oZWFkZXJzKTsKKworCS8qIFVSTCBpcyByZXVzZWQgZm9yIE1PVkUgYWZ0ZXIgUFVUICovCisJaWYgKHJlcXVlc3QtPnN0YXRlICE9IFJVTl9QVVQpIHsKKwkJZnJlZShyZXF1ZXN0LT51cmwpOworCQlyZXF1ZXN0LT51cmwgPSBOVUxMOworCX0KKworCWlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBSVU5fTUtDT0wpIHsKKwkJaWYgKHJlcXVlc3QtPmN1cmxfcmVzdWx0ID09IENVUkxFX09LIHx8CisJCSAgICByZXF1ZXN0LT5odHRwX2NvZGUgPT0gNDA1KSB7CisJCQlyZW1vdGVfZGlyX2V4aXN0c1tyZXF1ZXN0LT5vYmotPnNoYTFbMF1dID0gMTsKKwkJCXN0YXJ0X3B1dChyZXF1ZXN0KTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTUtDT0wgJXMgZmFpbGVkLCBhYm9ydGluZyAoJWQvJWxkKVxuIiwKKwkJCQlzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpLAorCQkJCXJlcXVlc3QtPmN1cmxfcmVzdWx0LCByZXF1ZXN0LT5odHRwX2NvZGUpOworCQkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQkJYWJvcnRlZCA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKHJlcXVlc3QtPnN0YXRlID09IFJVTl9QVVQpIHsKKwkJaWYgKHJlcXVlc3QtPmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQlzdGFydF9tb3ZlKHJlcXVlc3QpOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsCSJQVVQgJXMgZmFpbGVkLCBhYm9ydGluZyAoJWQvJWxkKVxuIiwKKwkJCQlzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpLAorCQkJCXJlcXVlc3QtPmN1cmxfcmVzdWx0LCByZXF1ZXN0LT5odHRwX2NvZGUpOworCQkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQkJYWJvcnRlZCA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKHJlcXVlc3QtPnN0YXRlID09IFJVTl9NT1ZFKSB7CisJCWlmIChyZXF1ZXN0LT5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykgeworCQkJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQkJCWZwcmludGYoc3RkZXJyLCAiICAgIHNlbnQgJXNcbiIsCisJCQkJCXNoYTFfdG9faGV4KHJlcXVlc3QtPm9iai0+c2hhMSkpOworCQkJcmVxdWVzdC0+b2JqLT5mbGFncyB8PSBSRU1PVEU7CisJCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIk1PVkUgJXMgZmFpbGVkLCBhYm9ydGluZyAoJWQvJWxkKVxuIiwKKwkJCQlzaGExX3RvX2hleChyZXF1ZXN0LT5vYmotPnNoYTEpLAorCQkJCXJlcXVlc3QtPmN1cmxfcmVzdWx0LCByZXF1ZXN0LT5odHRwX2NvZGUpOworCQkJcmVxdWVzdC0+c3RhdGUgPSBBQk9SVEVEOworCQkJYWJvcnRlZCA9IDE7CisJCX0KKwl9IGVsc2UgaWYgKHJlcXVlc3QtPnN0YXRlID09IFJVTl9GRVRDSF9MT09TRSkgeworCQlmY2htb2QocmVxdWVzdC0+bG9jYWxfZmlsZW5vLCAwNDQ0KTsKKwkJY2xvc2UocmVxdWVzdC0+bG9jYWxfZmlsZW5vKTsgcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gLTE7CisKKwkJaWYgKHJlcXVlc3QtPmN1cmxfcmVzdWx0ICE9IENVUkxFX09LICYmCisJCSAgICByZXF1ZXN0LT5odHRwX2NvZGUgIT0gNDE2KSB7CisJCQlpZiAoc3RhdChyZXF1ZXN0LT50bXBmaWxlLCAmc3QpID09IDApIHsKKwkJCQlpZiAoc3Quc3Rfc2l6ZSA9PSAwKQorCQkJCQl1bmxpbmsocmVxdWVzdC0+dG1wZmlsZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAocmVxdWVzdC0+aHR0cF9jb2RlID09IDQxNikKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHJlcXVlc3RlZCByYW5nZSBpbnZhbGlkOyB3ZSBtYXkgYWxyZWFkeSBoYXZlIGFsbCB0aGUgZGF0YS5cbiIpOworCisJCQlpbmZsYXRlRW5kKCZyZXF1ZXN0LT5zdHJlYW0pOworCQkJU0hBMV9GaW5hbChyZXF1ZXN0LT5yZWFsX3NoYTEsICZyZXF1ZXN0LT5jKTsKKwkJCWlmIChyZXF1ZXN0LT56cmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQkJCXVubGluayhyZXF1ZXN0LT50bXBmaWxlKTsKKwkJCX0gZWxzZSBpZiAobWVtY21wKHJlcXVlc3QtPm9iai0+c2hhMSwgcmVxdWVzdC0+cmVhbF9zaGExLCAyMCkpIHsKKwkJCQl1bmxpbmsocmVxdWVzdC0+dG1wZmlsZSk7CisJCQl9IGVsc2UgeworCQkJCXJlcXVlc3QtPnJlbmFtZSA9CisJCQkJCW1vdmVfdGVtcF90b19maWxlKAorCQkJCQkJcmVxdWVzdC0+dG1wZmlsZSwKKwkJCQkJCXJlcXVlc3QtPmZpbGVuYW1lKTsKKwkJCQlpZiAocmVxdWVzdC0+cmVuYW1lID09IDApIHsKKwkJCQkJcmVxdWVzdC0+b2JqLT5mbGFncyB8PSAoTE9DQUwgfCBSRU1PVEUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFRyeSBmZXRjaGluZyBwYWNrZWQgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChyZXF1ZXN0LT5vYmotPmZsYWdzICYgTE9DQUwpCisJCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJCWVsc2UKKwkJCXN0YXJ0X2ZldGNoX3BhY2tlZChyZXF1ZXN0KTsKKworCX0gZWxzZSBpZiAocmVxdWVzdC0+c3RhdGUgPT0gUlVOX0ZFVENIX1BBQ0tFRCkgeworCQlpZiAocmVxdWVzdC0+Y3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGdldCBwYWNrIGZpbGUgJXNcbiVzIiwKKwkJCQlyZXF1ZXN0LT51cmwsIGN1cmxfZXJyb3JzdHIpOworCQkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDA7CisJCX0gZWxzZSB7CisJCQlmY2xvc2UocmVxdWVzdC0+bG9jYWxfc3RyZWFtKTsKKwkJCXJlcXVlc3QtPmxvY2FsX3N0cmVhbSA9IE5VTEw7CisJCQlpZiAoIW1vdmVfdGVtcF90b19maWxlKHJlcXVlc3QtPnRtcGZpbGUsCisJCQkJCSAgICAgICByZXF1ZXN0LT5maWxlbmFtZSkpIHsKKwkJCQl0YXJnZXQgPSAoc3RydWN0IHBhY2tlZF9naXQgKilyZXF1ZXN0LT51c2VyRGF0YTsKKwkJCQlsc3QgPSAmcmVtb3RlLT5wYWNrczsKKwkJCQl3aGlsZSAoKmxzdCAhPSB0YXJnZXQpCisJCQkJCWxzdCA9ICYoKCpsc3QpLT5uZXh0KTsKKwkJCQkqbHN0ID0gKCpsc3QpLT5uZXh0OworCisJCQkJaWYgKCF2ZXJpZnlfcGFjayh0YXJnZXQsIDApKQorCQkJCQlpbnN0YWxsX3BhY2tlZF9naXQodGFyZ2V0KTsKKwkJCQllbHNlCisJCQkJCXJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMgPSAwOworCQkJfQorCQl9CisJCXJlbGVhc2VfcmVxdWVzdChyZXF1ZXN0KTsKKwl9Cit9CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQordm9pZCBmaWxsX2FjdGl2ZV9zbG90cyh2b2lkKQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpuZXh0OworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisJaW50IG51bV90cmFuc2ZlcnM7CisKKwlpZiAoYWJvcnRlZCkKKwkJcmV0dXJuOworCisJd2hpbGUgKGFjdGl2ZV9yZXF1ZXN0cyA8IG1heF9yZXF1ZXN0cyAmJiByZXF1ZXN0ICE9IE5VTEwpIHsKKwkJbmV4dCA9IHJlcXVlc3QtPm5leHQ7CisJCWlmIChyZXF1ZXN0LT5zdGF0ZSA9PSBORUVEX0ZFVENIKSB7CisJCQlzdGFydF9mZXRjaF9sb29zZShyZXF1ZXN0KTsKKwkJfSBlbHNlIGlmIChwdXNoaW5nICYmIHJlcXVlc3QtPnN0YXRlID09IE5FRURfUFVTSCkgeworCQkJaWYgKHJlbW90ZV9kaXJfZXhpc3RzW3JlcXVlc3QtPm9iai0+c2hhMVswXV0gPT0gMSkgeworCQkJCXN0YXJ0X3B1dChyZXF1ZXN0KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhcnRfbWtjb2wocmVxdWVzdCk7CisJCQl9CisJCQljdXJsX211bHRpX3BlcmZvcm0oY3VybG0sICZudW1fdHJhbnNmZXJzKTsKKwkJfQorCQlyZXF1ZXN0ID0gbmV4dDsKKwl9CisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMKSB7CisJCWlmICghc2xvdC0+aW5fdXNlICYmIHNsb3QtPmN1cmwgIT0gTlVMTCkgeworCQkJY3VybF9lYXN5X2NsZWFudXAoc2xvdC0+Y3VybCk7CisJCQlzbG90LT5jdXJsID0gTlVMTDsKKwkJfQorCQlzbG90ID0gc2xvdC0+bmV4dDsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X3JlbW90ZV9vYmplY3RfbGlzdCh1bnNpZ25lZCBjaGFyIHBhcmVudCk7CisKK3N0YXRpYyB2b2lkIGFkZF9mZXRjaF9yZXF1ZXN0KHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKworCWNoZWNrX2xvY2tzKCk7CisKKwkvKgorCSAqIERvbid0IGZldGNoIHRoZSBvYmplY3QgaWYgaXQncyBrbm93biB0byBleGlzdCBsb2NhbGx5CisJICogb3IgaXMgYWxyZWFkeSBpbiB0aGUgcmVxdWVzdCBxdWV1ZQorCSAqLworCWlmIChyZW1vdGVfZGlyX2V4aXN0c1tvYmotPnNoYTFbMF1dID09IC0xKQorCQlnZXRfcmVtb3RlX29iamVjdF9saXN0KG9iai0+c2hhMVswXSk7CisJaWYgKG9iai0+ZmxhZ3MgJiAoTE9DQUwgfCBGRVRDSElORykpCisJCXJldHVybjsKKworCW9iai0+ZmxhZ3MgfD0gRkVUQ0hJTkc7CisJcmVxdWVzdCA9IHhtYWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSk7CisJcmVxdWVzdC0+b2JqID0gb2JqOworCXJlcXVlc3QtPnVybCA9IE5VTEw7CisJcmVxdWVzdC0+bG9jayA9IE5VTEw7CisJcmVxdWVzdC0+aGVhZGVycyA9IE5VTEw7CisJcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gLTE7CisJcmVxdWVzdC0+bG9jYWxfc3RyZWFtID0gTlVMTDsKKwlyZXF1ZXN0LT5zdGF0ZSA9IE5FRURfRkVUQ0g7CisJcmVxdWVzdC0+bmV4dCA9IHJlcXVlc3RfcXVldWVfaGVhZDsKKwlyZXF1ZXN0X3F1ZXVlX2hlYWQgPSByZXF1ZXN0OworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlmaWxsX2FjdGl2ZV9zbG90cygpOworCXN0ZXBfYWN0aXZlX3Nsb3RzKCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBhZGRfc2VuZF9yZXF1ZXN0KHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCB0cmFuc2Zlcl9yZXF1ZXN0ICpyZXF1ZXN0ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisKKwkvKiBLZWVwIGxvY2tzIGFjdGl2ZSAqLworCWNoZWNrX2xvY2tzKCk7CisKKwkvKgorCSAqIERvbid0IHB1c2ggdGhlIG9iamVjdCBpZiBpdCdzIGtub3duIHRvIGV4aXN0IG9uIHRoZSByZW1vdGUKKwkgKiBvciBpcyBhbHJlYWR5IGluIHRoZSByZXF1ZXN0IHF1ZXVlCisJICovCisJaWYgKHJlbW90ZV9kaXJfZXhpc3RzW29iai0+c2hhMVswXV0gPT0gLTEpCisJCWdldF9yZW1vdGVfb2JqZWN0X2xpc3Qob2JqLT5zaGExWzBdKTsKKwlpZiAob2JqLT5mbGFncyAmIChSRU1PVEUgfCBQVVNISU5HKSkKKwkJcmV0dXJuIDA7CisJdGFyZ2V0ID0gZmluZF9zaGExX3BhY2sob2JqLT5zaGExLCByZW1vdGUtPnBhY2tzKTsKKwlpZiAodGFyZ2V0KSB7CisJCW9iai0+ZmxhZ3MgfD0gUkVNT1RFOworCQlyZXR1cm4gMDsKKwl9CisKKwlvYmotPmZsYWdzIHw9IFBVU0hJTkc7CisJcmVxdWVzdCA9IHhtYWxsb2Moc2l6ZW9mKCpyZXF1ZXN0KSk7CisJcmVxdWVzdC0+b2JqID0gb2JqOworCXJlcXVlc3QtPnVybCA9IE5VTEw7CisJcmVxdWVzdC0+bG9jayA9IGxvY2s7CisJcmVxdWVzdC0+aGVhZGVycyA9IE5VTEw7CisJcmVxdWVzdC0+bG9jYWxfZmlsZW5vID0gLTE7CisJcmVxdWVzdC0+bG9jYWxfc3RyZWFtID0gTlVMTDsKKwlyZXF1ZXN0LT5zdGF0ZSA9IE5FRURfUFVTSDsKKwlyZXF1ZXN0LT5uZXh0ID0gcmVxdWVzdF9xdWV1ZV9oZWFkOworCXJlcXVlc3RfcXVldWVfaGVhZCA9IHJlcXVlc3Q7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisJc3RlcF9hY3RpdmVfc2xvdHMoKTsKKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfaW5kZXgodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICpoZXggPSBzaGExX3RvX2hleChzaGExKTsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICp1cmw7CisJY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwlsb25nIHByZXZfcG9zbiA9IDA7CisJY2hhciByYW5nZVtSQU5HRV9IRUFERVJfU0laRV07CisJc3RydWN0IGN1cmxfc2xpc3QgKnJhbmdlX2hlYWRlciA9IE5VTEw7CisKKwlGSUxFICppbmRleGZpbGU7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJLyogRG9uJ3QgdXNlIHRoZSBpbmRleCBpZiB0aGUgcGFjayBpc24ndCB0aGVyZSAqLworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIDY0KTsKKwlzcHJpbnRmKHVybCwgIiVzb2JqZWN0cy9wYWNrL3BhY2stJXMucGFjayIsIHJlbW90ZS0+dXJsLCBoZXgpOworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfTk9CT0RZLCAxKTsKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnJlZSh1cmwpOworCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gdmVyaWZ5IHBhY2sgJXMgaXMgYXZhaWxhYmxlIiwKKwkJCQkgICAgIGhleCk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0Iik7CisJfQorCisJaWYgKGhhc19wYWNrX2luZGV4KHNoYTEpKQorCQlyZXR1cm4gMDsKKworCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJZnByaW50ZihzdGRlcnIsICJHZXR0aW5nIGluZGV4IGZvciBwYWNrICVzXG4iLCBoZXgpOworCisJc3ByaW50Zih1cmwsICIlc29iamVjdHMvcGFjay9wYWNrLSVzLmlkeCIsIHJlbW90ZS0+dXJsLCBoZXgpOworCisJZmlsZW5hbWUgPSBzaGExX3BhY2tfaW5kZXhfbmFtZShzaGExKTsKKwlzbnByaW50Zih0bXBmaWxlLCBzaXplb2YodG1wZmlsZSksICIlcy50ZW1wIiwgZmlsZW5hbWUpOworCWluZGV4ZmlsZSA9IGZvcGVuKHRtcGZpbGUsICJhIik7CisJaWYgKCFpbmRleGZpbGUpCisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIG9wZW4gbG9jYWwgZmlsZSAlcyBmb3IgcGFjayBpbmRleCIsCisJCQkgICAgIGZpbGVuYW1lKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBHRVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCBpbmRleGZpbGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIG5vX3ByYWdtYV9oZWFkZXIpOworCXNsb3QtPmxvY2FsID0gaW5kZXhmaWxlOworCisJLyogSWYgdGhlcmUgaXMgZGF0YSBwcmVzZW50IGZyb20gYSBwcmV2aW91cyB0cmFuc2ZlciBhdHRlbXB0LAorCSAgIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiAqLworCXByZXZfcG9zbiA9IGZ0ZWxsKGluZGV4ZmlsZSk7CisJaWYgKHByZXZfcG9zbj4wKSB7CisJCWlmIChwdXNoX3ZlcmJvc2VseSkKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJSZXN1bWluZyBmZXRjaCBvZiBpbmRleCBmb3IgcGFjayAlcyBhdCBieXRlICVsZFxuIiwKKwkJCQloZXgsIHByZXZfcG9zbik7CisJCXNwcmludGYocmFuZ2UsICJSYW5nZTogYnl0ZXM9JWxkLSIsIHByZXZfcG9zbik7CisJCXJhbmdlX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHJhbmdlX2hlYWRlciwgcmFuZ2UpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgcmFuZ2VfaGVhZGVyKTsKKwl9CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnJlZSh1cmwpOworCQkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCQlyZXR1cm4gZXJyb3IoIlVuYWJsZSB0byBnZXQgcGFjayBpbmRleCAlc1xuJXMiLCB1cmwsCisJCQkJICAgICBjdXJsX2Vycm9yc3RyKTsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWUodXJsKTsKKwkJZmNsb3NlKGluZGV4ZmlsZSk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisKKwlmcmVlKHVybCk7CisJZmNsb3NlKGluZGV4ZmlsZSk7CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IHNldHVwX2luZGV4KHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKm5ld19wYWNrOworCisJaWYgKGZldGNoX2luZGV4KHNoYTEpKQorCQlyZXR1cm4gLTE7CisKKwluZXdfcGFjayA9IHBhcnNlX3BhY2tfaW5kZXgoc2hhMSk7CisJbmV3X3BhY2stPm5leHQgPSByZW1vdGUtPnBhY2tzOworCXJlbW90ZS0+cGFja3MgPSBuZXdfcGFjazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZXRjaF9pbmRpY2VzKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICp1cmw7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJY2hhciAqZGF0YTsKKwlpbnQgaSA9IDA7CisKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisKKwlkYXRhID0geGNhbGxvYygxLCA0MDk2KTsKKwlidWZmZXIuc2l6ZSA9IDQwOTY7CisJYnVmZmVyLnBvc24gPSAwOworCWJ1ZmZlci5idWZmZXIgPSBkYXRhOworCisJaWYgKHB1c2hfdmVyYm9zZWx5KQorCQlmcHJpbnRmKHN0ZGVyciwgIkdldHRpbmcgcGFjayBsaXN0XG4iKTsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIDIwKTsKKwlzcHJpbnRmKHVybCwgIiVzb2JqZWN0cy9pbmZvL3BhY2tzIiwgcmVtb3RlLT51cmwpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIE5VTEwpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlmcmVlKGJ1ZmZlci5idWZmZXIpOworCQkJZnJlZSh1cmwpOworCQkJaWYgKHJlc3VsdHMuaHR0cF9jb2RlID09IDQwNCkKKwkJCQlyZXR1cm4gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gZXJyb3IoIiVzIiwgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlmcmVlKGJ1ZmZlci5idWZmZXIpOworCQlmcmVlKHVybCk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QiKTsKKwl9CisJZnJlZSh1cmwpOworCisJZGF0YSA9IGJ1ZmZlci5idWZmZXI7CisJd2hpbGUgKGkgPCBidWZmZXIucG9zbikgeworCQlzd2l0Y2ggKGRhdGFbaV0pIHsKKwkJY2FzZSAnUCc6CisJCQlpKys7CisJCQlpZiAoaSArIDUyIDwgYnVmZmVyLnBvc24gJiYKKwkJCSAgICAhc3RybmNtcChkYXRhICsgaSwgIiBwYWNrLSIsIDYpICYmCisJCQkgICAgIXN0cm5jbXAoZGF0YSArIGkgKyA0NiwgIi5wYWNrXG4iLCA2KSkgeworCQkJCWdldF9zaGExX2hleChkYXRhICsgaSArIDYsIHNoYTEpOworCQkJCXNldHVwX2luZGV4KHNoYTEpOworCQkJCWkgKz0gNTE7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQl3aGlsZSAoZGF0YVtpXSAhPSAnXG4nKQorCQkJCWkrKzsKKwkJfQorCQlpKys7CisJfQorCisJZnJlZShidWZmZXIuYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmVlZHNfcXVvdGUoaW50IGNoKQoreworCWlmICgoKGNoID49ICdBJykgJiYgKGNoIDw9ICdaJykpCisJCQl8fCAoKGNoID49ICdhJykgJiYgKGNoIDw9ICd6JykpCisJCQl8fCAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpCisJCQl8fCAoY2ggPT0gJy8nKQorCQkJfHwgKGNoID09ICctJykKKwkJCXx8IChjaCA9PSAnLicpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGV4KGludCB2KQoreworCWlmICh2IDwgMTApIHJldHVybiAnMCcgKyB2OworCWVsc2UgcmV0dXJuICdBJyArIHYgLSAxMDsKK30KKworc3RhdGljIGNoYXIgKnF1b3RlX3JlZl91cmwoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcmVmKQoreworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmRwLCAqcXJlZjsKKwlpbnQgbGVuLCBiYXNlbGVuLCBjaDsKKworCWJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJbGVuID0gYmFzZWxlbiArIDE7CisJZm9yIChjcCA9IHJlZjsgKGNoID0gKmNwKSAhPSAwOyBjcCsrLCBsZW4rKykKKwkJaWYgKG5lZWRzX3F1b3RlKGNoKSkKKwkJCWxlbiArPSAyOyAvKiBleHRyYSB0d28gaGV4IHBsdXMgcmVwbGFjZW1lbnQgJSAqLworCXFyZWYgPSB4bWFsbG9jKGxlbik7CisJbWVtY3B5KHFyZWYsIGJhc2UsIGJhc2VsZW4pOworCWZvciAoY3AgPSByZWYsIGRwID0gcXJlZiArIGJhc2VsZW47IChjaCA9ICpjcCkgIT0gMDsgY3ArKykgeworCQlpZiAobmVlZHNfcXVvdGUoY2gpKSB7CisJCQkqZHArKyA9ICclJzsKKwkJCSpkcCsrID0gaGV4KChjaCA+PiA0KSAmIDB4Rik7CisJCQkqZHArKyA9IGhleChjaCAmIDB4Rik7CisJCX0KKwkJZWxzZQorCQkJKmRwKysgPSBjaDsKKwl9CisJKmRwID0gMDsKKworCXJldHVybiBxcmVmOworfQorCitpbnQgZmV0Y2hfcmVmKGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKyAgICAgICAgY2hhciAqdXJsOworICAgICAgICBjaGFyIGhleFs0Ml07CisgICAgICAgIHN0cnVjdCBidWZmZXIgYnVmZmVyOworCWNoYXIgKmJhc2UgPSByZW1vdGUtPnVybDsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisgICAgICAgIGJ1ZmZlci5zaXplID0gNDE7CisgICAgICAgIGJ1ZmZlci5wb3NuID0gMDsKKyAgICAgICAgYnVmZmVyLmJ1ZmZlciA9IGhleDsKKyAgICAgICAgaGV4WzQxXSA9ICdcMCc7CisKKwl1cmwgPSBxdW90ZV9yZWZfdXJsKGJhc2UsIHJlZik7CisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKQorCQkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBnZXQgJXMgZm9yICVzXG4lcyIsCisJCQkJICAgICB1cmwsIHJlZiwgY3VybF9lcnJvcnN0cik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCIpOworCX0KKworICAgICAgICBoZXhbNDBdID0gJ1wwJzsKKyAgICAgICAgZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbmVfcmVtb3RlX29iamVjdChjb25zdCBjaGFyICpoZXgpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisKKwlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkgIT0gMCkKKwkJcmV0dXJuOworCisJb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikKKwkJb2JqID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCisJLyogSWdub3JlIHJlbW90ZSBvYmplY3RzIHRoYXQgZG9uJ3QgZXhpc3QgbG9jYWxseSAqLworCWlmICghb2JqKQorCQlyZXR1cm47CisKKwlvYmotPmZsYWdzIHw9IFJFTU9URTsKKwlpZiAoIW9iamVjdF9saXN0X2NvbnRhaW5zKG9iamVjdHMsIG9iaikpCisJCW9iamVjdF9saXN0X2luc2VydChvYmosICZvYmplY3RzKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2xvY2twcm9wX2N0eChzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCkKK3sKKwlpbnQgKmxvY2tfZmxhZ3MgPSAoaW50ICopY3R4LT51c2VyRGF0YTsKKworCWlmICh0YWdfY2xvc2VkKSB7CisJCWlmICghc3RyY21wKGN0eC0+bmFtZSwgREFWX0NUWF9MT0NLRU5UUlkpKSB7CisJCQlpZiAoKCpsb2NrX2ZsYWdzICYgREFWX1BST1BfTE9DS0VYKSAmJgorCQkJICAgICgqbG9ja19mbGFncyAmIERBVl9QUk9QX0xPQ0tXUikpIHsKKwkJCQkqbG9ja19mbGFncyB8PSBEQVZfTE9DS19PSzsKKwkJCX0KKwkJCSpsb2NrX2ZsYWdzICY9IERBVl9MT0NLX09LOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQ1RYX0xPQ0tUWVBFX1dSSVRFKSkgeworCQkJKmxvY2tfZmxhZ3MgfD0gREFWX1BST1BfTE9DS1dSOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQ1RYX0xPQ0tUWVBFX0VYQ0xVU0lWRSkpIHsKKwkJCSpsb2NrX2ZsYWdzIHw9IERBVl9QUk9QX0xPQ0tFWDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX25ld19sb2NrX2N0eChzdHJ1Y3QgeG1sX2N0eCAqY3R4LCBpbnQgdGFnX2Nsb3NlZCkKK3sKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2sgPSAoc3RydWN0IHJlbW90ZV9sb2NrICopY3R4LT51c2VyRGF0YTsKKworCWlmICh0YWdfY2xvc2VkICYmIGN0eC0+Y2RhdGEpIHsKKwkJaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfQUNUSVZFTE9DS19PV05FUikpIHsKKwkJCWxvY2stPm93bmVyID0geG1hbGxvYyhzdHJsZW4oY3R4LT5jZGF0YSkgKyAxKTsKKwkJCXN0cmNweShsb2NrLT5vd25lciwgY3R4LT5jZGF0YSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9BQ1RJVkVMT0NLX1RJTUVPVVQpKSB7CisJCQlpZiAoIXN0cm5jbXAoY3R4LT5jZGF0YSwgIlNlY29uZC0iLCA3KSkKKwkJCQlsb2NrLT50aW1lb3V0ID0KKwkJCQkJc3RydG9sKGN0eC0+Y2RhdGEgKyA3LCBOVUxMLCAxMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9BQ1RJVkVMT0NLX1RPS0VOKSkgeworCQkJaWYgKCFzdHJuY21wKGN0eC0+Y2RhdGEsICJvcGFxdWVsb2NrdG9rZW46IiwgMTYpKSB7CisJCQkJbG9jay0+dG9rZW4gPSB4bWFsbG9jKHN0cmxlbihjdHgtPmNkYXRhKSAtIDE1KTsKKwkJCQlzdHJjcHkobG9jay0+dG9rZW4sIGN0eC0+Y2RhdGEgKyAxNik7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9uZV9yZW1vdGVfcmVmKGNoYXIgKnJlZm5hbWUpOworCitzdGF0aWMgdm9pZAoreG1sX3N0YXJ0X3RhZyh2b2lkICp1c2VyRGF0YSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHMpCit7CisJc3RydWN0IHhtbF9jdHggKmN0eCA9IChzdHJ1Y3QgeG1sX2N0eCAqKXVzZXJEYXRhOworCWNvbnN0IGNoYXIgKmMgPSBzdHJjaHIobmFtZSwgJzonKTsKKwlpbnQgbmV3X2xlbjsKKworCWlmIChjID09IE5VTEwpCisJCWMgPSBuYW1lOworCWVsc2UKKwkJYysrOworCisJbmV3X2xlbiA9IHN0cmxlbihjdHgtPm5hbWUpICsgc3RybGVuKGMpICsgMjsKKworCWlmIChuZXdfbGVuID4gY3R4LT5sZW4pIHsKKwkJY3R4LT5uYW1lID0geHJlYWxsb2MoY3R4LT5uYW1lLCBuZXdfbGVuKTsKKwkJY3R4LT5sZW4gPSBuZXdfbGVuOworCX0KKwlzdHJjYXQoY3R4LT5uYW1lLCAiLiIpOworCXN0cmNhdChjdHgtPm5hbWUsIGMpOworCisJaWYgKGN0eC0+Y2RhdGEpIHsKKwkJZnJlZShjdHgtPmNkYXRhKTsKKwkJY3R4LT5jZGF0YSA9IE5VTEw7CisJfQorCisJY3R4LT51c2VyRnVuYyhjdHgsIDApOworfQorCitzdGF0aWMgdm9pZAoreG1sX2VuZF90YWcodm9pZCAqdXNlckRhdGEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHhtbF9jdHggKmN0eCA9IChzdHJ1Y3QgeG1sX2N0eCAqKXVzZXJEYXRhOworCWNvbnN0IGNoYXIgKmMgPSBzdHJjaHIobmFtZSwgJzonKTsKKwljaGFyICplcDsKKworCWN0eC0+dXNlckZ1bmMoY3R4LCAxKTsKKworCWlmIChjID09IE5VTEwpCisJCWMgPSBuYW1lOworCWVsc2UKKwkJYysrOworCisJZXAgPSBjdHgtPm5hbWUgKyBzdHJsZW4oY3R4LT5uYW1lKSAtIHN0cmxlbihjKSAtIDE7CisJKmVwID0gMDsKK30KKworc3RhdGljIHZvaWQKK3htbF9jZGF0YSh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pCit7CisJc3RydWN0IHhtbF9jdHggKmN0eCA9IChzdHJ1Y3QgeG1sX2N0eCAqKXVzZXJEYXRhOworCWlmIChjdHgtPmNkYXRhKQorCQlmcmVlKGN0eC0+Y2RhdGEpOworCWN0eC0+Y2RhdGEgPSB4bWFsbG9jKGxlbiArIDEpOworCXN0cmxjcHkoY3R4LT5jZGF0YSwgcywgbGVuICsgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2tfcmVtb3RlKGNvbnN0IGNoYXIgKnBhdGgsIGxvbmcgdGltZW91dCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCXN0cnVjdCBidWZmZXIgaW5fYnVmZmVyOworCWNoYXIgKm91dF9kYXRhOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqdXJsOworCWNoYXIgKmVwOworCWNoYXIgdGltZW91dF9oZWFkZXJbMjVdOworCXN0cnVjdCByZW1vdGVfbG9jayAqbG9jayA9IE5VTEw7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisKKwl1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzcHJpbnRmKHVybCwgIiVzJXMiLCByZW1vdGUtPnVybCwgcGF0aCk7CisKKwkvKiBNYWtlIHN1cmUgbGVhZGluZyBkaXJlY3RvcmllcyBleGlzdCBmb3IgdGhlIHJlbW90ZSByZWYgKi8KKwllcCA9IHN0cmNocih1cmwgKyBzdHJsZW4ocmVtb3RlLT51cmwpICsgMTEsICcvJyk7CisJd2hpbGUgKGVwKSB7CisJCSplcCA9IDA7CisJCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwkJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEdFVCwgMSk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTUtDT0wpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCQlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LICYmCisJCQkgICAgcmVzdWx0cy5odHRwX2NvZGUgIT0gNDA1KSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJVbmFibGUgdG8gY3JlYXRlIGJyYW5jaCBwYXRoICVzXG4iLAorCQkJCQl1cmwpOworCQkJCWZyZWUodXJsKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IE1LQ09MIHJlcXVlc3RcbiIpOworCQkJZnJlZSh1cmwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJKmVwID0gJy8nOworCQllcCA9IHN0cmNocihlcCArIDEsICcvJyk7CisJfQorCisJb3V0X2J1ZmZlci5zaXplID0gc3RybGVuKExPQ0tfUkVRVUVTVCkgKyBzdHJsZW4oZ2l0X2RlZmF1bHRfZW1haWwpIC0gMjsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsIExPQ0tfUkVRVUVTVCwgZ2l0X2RlZmF1bHRfZW1haWwpOworCW91dF9idWZmZXIucG9zbiA9IDA7CisJb3V0X2J1ZmZlci5idWZmZXIgPSBvdXRfZGF0YTsKKworCWluX2J1ZmZlci5zaXplID0gNDA5NjsKKwlpbl9kYXRhID0geG1hbGxvYyhpbl9idWZmZXIuc2l6ZSk7CisJaW5fYnVmZmVyLnBvc24gPSAwOworCWluX2J1ZmZlci5idWZmZXIgPSBpbl9kYXRhOworCisJc3ByaW50Zih0aW1lb3V0X2hlYWRlciwgIlRpbWVvdXQ6IFNlY29uZC0lbGQiLCB0aW1lb3V0KTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCB0aW1lb3V0X2hlYWRlcik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgIkNvbnRlbnQtVHlwZTogdGV4dC94bWwiKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJm91dF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCBvdXRfYnVmZmVyLnNpemUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZpbl9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfTE9DSyk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWxvY2sgPSB4Y2FsbG9jKDEsIHNpemVvZigqbG9jaykpOworCWxvY2stPnRpbWVvdXQgPSAtMTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX25ld19sb2NrX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9IGxvY2s7CisJCQlYTUxfU2V0VXNlckRhdGEocGFyc2VyLCAmY3R4KTsKKwkJCVhNTF9TZXRFbGVtZW50SGFuZGxlcihwYXJzZXIsIHhtbF9zdGFydF90YWcsCisJCQkJCSAgICAgIHhtbF9lbmRfdGFnKTsKKwkJCVhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihwYXJzZXIsIHhtbF9jZGF0YSk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmZmVyLAorCQkJCQkgICBpbl9idWZmZXIucG9zbiwgMSk7CisJCQlmcmVlKGN0eC5uYW1lKTsKKwkJCWlmIChyZXN1bHQgIT0gWE1MX1NUQVRVU19PSykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiWE1MIGVycm9yOiAlc1xuIiwKKwkJCQkJWE1MX0Vycm9yU3RyaW5nKAorCQkJCQkJWE1MX0dldEVycm9yQ29kZShwYXJzZXIpKSk7CisJCQkJbG9jay0+dGltZW91dCA9IC0xOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgTE9DSyByZXF1ZXN0XG4iKTsKKwl9CisKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdl9oZWFkZXJzKTsKKwlmcmVlKG91dF9kYXRhKTsKKwlmcmVlKGluX2RhdGEpOworCisJaWYgKGxvY2stPnRva2VuID09IE5VTEwgfHwgbG9jay0+dGltZW91dCA8PSAwKSB7CisJCWlmIChsb2NrLT50b2tlbiAhPSBOVUxMKQorCQkJZnJlZShsb2NrLT50b2tlbik7CisJCWlmIChsb2NrLT5vd25lciAhPSBOVUxMKQorCQkJZnJlZShsb2NrLT5vd25lcik7CisJCWZyZWUodXJsKTsKKwkJZnJlZShsb2NrKTsKKwkJbG9jayA9IE5VTEw7CisJfSBlbHNlIHsKKwkJbG9jay0+dXJsID0gdXJsOworCQlsb2NrLT5zdGFydF90aW1lID0gdGltZShOVUxMKTsKKwkJbG9jay0+bmV4dCA9IHJlbW90ZS0+bG9ja3M7CisJCXJlbW90ZS0+bG9ja3MgPSBsb2NrOworCX0KKworCXJldHVybiBsb2NrOworfQorCitzdGF0aWMgaW50IHVubG9ja19yZW1vdGUoc3RydWN0IHJlbW90ZV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwlzdHJ1Y3QgcmVtb3RlX2xvY2sgKnByZXYgPSByZW1vdGUtPmxvY2tzOworCWNoYXIgKmxvY2tfdG9rZW5faGVhZGVyOworCXN0cnVjdCBjdXJsX3NsaXN0ICpkYXZfaGVhZGVycyA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCWxvY2tfdG9rZW5faGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMzEpOworCXNwcmludGYobG9ja190b2tlbl9oZWFkZXIsICJMb2NrLVRva2VuOiA8b3BhcXVlbG9ja3Rva2VuOiVzPiIsCisJCWxvY2stPnRva2VuKTsKKwlkYXZfaGVhZGVycyA9IGN1cmxfc2xpc3RfYXBwZW5kKGRhdl9oZWFkZXJzLCBsb2NrX3Rva2VuX2hlYWRlcik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfbnVsbCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgbG9jay0+dXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1VOTE9DSyk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKQorCQkJcmMgPSAxOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIlVOTE9DSyBIVFRQIGVycm9yICVsZFxuIiwKKwkJCQlyZXN1bHRzLmh0dHBfY29kZSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgVU5MT0NLIHJlcXVlc3RcbiIpOworCX0KKworCWN1cmxfc2xpc3RfZnJlZV9hbGwoZGF2X2hlYWRlcnMpOworCWZyZWUobG9ja190b2tlbl9oZWFkZXIpOworCisJaWYgKHJlbW90ZS0+bG9ja3MgPT0gbG9jaykgeworCQlyZW1vdGUtPmxvY2tzID0gbG9jay0+bmV4dDsKKwl9IGVsc2UgeworCQl3aGlsZSAocHJldiAmJiBwcmV2LT5uZXh0ICE9IGxvY2spCisJCQlwcmV2ID0gcHJldi0+bmV4dDsKKwkJaWYgKHByZXYpCisJCQlwcmV2LT5uZXh0ID0gcHJldi0+bmV4dC0+bmV4dDsKKwl9CisKKwlpZiAobG9jay0+b3duZXIgIT0gTlVMTCkKKwkJZnJlZShsb2NrLT5vd25lcik7CisJZnJlZShsb2NrLT51cmwpOworCWZyZWUobG9jay0+dG9rZW4pOworCWZyZWUobG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW90ZV9scyhjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsCisJCSAgICAgIHZvaWQgKCp1c2VyRnVuYykoc3RydWN0IHJlbW90ZV9sc19jdHggKmxzKSwKKwkJICAgICAgdm9pZCAqdXNlckRhdGEpOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2xzX29iamVjdChzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpCit7CisJdW5zaWduZWQgaW50ICpwYXJlbnQgPSAodW5zaWduZWQgaW50ICopbHMtPnVzZXJEYXRhOworCWNoYXIgKnBhdGggPSBscy0+ZGVudHJ5X25hbWU7CisJY2hhciAqb2JqX2hleDsKKworCWlmICghc3RyY21wKGxzLT5wYXRoLCBscy0+ZGVudHJ5X25hbWUpICYmIChscy0+ZmxhZ3MgJiBJU19ESVIpKSB7CisJCXJlbW90ZV9kaXJfZXhpc3RzWypwYXJlbnRdID0gMTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzdHJsZW4ocGF0aCkgIT0gNDkpCisJCXJldHVybjsKKwlwYXRoICs9IDg7CisJb2JqX2hleCA9IHhtYWxsb2Moc3RybGVuKHBhdGgpKTsKKwlzdHJsY3B5KG9ial9oZXgsIHBhdGgsIDMpOworCXN0cmNweShvYmpfaGV4ICsgMiwgcGF0aCArIDMpOworCW9uZV9yZW1vdGVfb2JqZWN0KG9ial9oZXgpOworCWZyZWUob2JqX2hleCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbHNfcmVmKHN0cnVjdCByZW1vdGVfbHNfY3R4ICpscykKK3sKKwlpZiAoIXN0cmNtcChscy0+cGF0aCwgbHMtPmRlbnRyeV9uYW1lKSAmJiAobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikpIHsKKwkJZnByaW50ZihzdGRlcnIsICIgICVzXG4iLCBscy0+ZGVudHJ5X25hbWUpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEobHMtPmRlbnRyeV9mbGFncyAmIElTX0RJUikpCisJCW9uZV9yZW1vdGVfcmVmKGxzLT5kZW50cnlfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9yZW1vdGVfbHNfY3R4KHN0cnVjdCB4bWxfY3R4ICpjdHgsIGludCB0YWdfY2xvc2VkKQoreworCXN0cnVjdCByZW1vdGVfbHNfY3R4ICpscyA9IChzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqKWN0eC0+dXNlckRhdGE7CisKKwlpZiAodGFnX2Nsb3NlZCkgeworCQlpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9SRVNQKSAmJiBscy0+ZGVudHJ5X25hbWUpIHsKKwkJCWlmIChscy0+ZGVudHJ5X2ZsYWdzICYgSVNfRElSKSB7CisJCQkJaWYgKGxzLT5mbGFncyAmIFBST0NFU1NfRElSUykgeworCQkJCQlscy0+dXNlckZ1bmMobHMpOworCQkJCX0KKwkJCQlpZiAoc3RyY21wKGxzLT5kZW50cnlfbmFtZSwgbHMtPnBhdGgpICYmCisJCQkJICAgIGxzLT5mbGFncyAmIFJFQ1VSU0lWRSkgeworCQkJCQlyZW1vdGVfbHMobHMtPmRlbnRyeV9uYW1lLAorCQkJCQkJICBscy0+ZmxhZ3MsCisJCQkJCQkgIGxzLT51c2VyRnVuYywKKwkJCQkJCSAgbHMtPnVzZXJEYXRhKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGxzLT5mbGFncyAmIFBST0NFU1NfRklMRVMpIHsKKwkJCQlscy0+dXNlckZ1bmMobHMpOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfTkFNRSkgJiYgY3R4LT5jZGF0YSkgeworCQkJbHMtPmRlbnRyeV9uYW1lID0geG1hbGxvYyhzdHJsZW4oY3R4LT5jZGF0YSkgLQorCQkJCQkJICByZW1vdGUtPnBhdGhfbGVuICsgMSk7CisJCQlzdHJjcHkobHMtPmRlbnRyeV9uYW1lLCBjdHgtPmNkYXRhICsgcmVtb3RlLT5wYXRoX2xlbik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPm5hbWUsIERBVl9QUk9QRklORF9DT0xMRUNUSU9OKSkgeworCQkJbHMtPmRlbnRyeV9mbGFncyB8PSBJU19ESVI7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5uYW1lLCBEQVZfUFJPUEZJTkRfUkVTUCkpIHsKKwkJaWYgKGxzLT5kZW50cnlfbmFtZSkgeworCQkJZnJlZShscy0+ZGVudHJ5X25hbWUpOworCQl9CisJCWxzLT5kZW50cnlfbmFtZSA9IE5VTEw7CisJCWxzLT5kZW50cnlfZmxhZ3MgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3RlX2xzKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncywKKwkJICAgICAgdm9pZCAoKnVzZXJGdW5jKShzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpLAorCQkgICAgICB2b2lkICp1c2VyRGF0YSkKK3sKKwljaGFyICp1cmwgPSB4bWFsbG9jKHN0cmxlbihyZW1vdGUtPnVybCkgKyBzdHJsZW4ocGF0aCkgKyAxKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJc3RydWN0IGJ1ZmZlciBpbl9idWZmZXI7CisJc3RydWN0IGJ1ZmZlciBvdXRfYnVmZmVyOworCWNoYXIgKmluX2RhdGE7CisJY2hhciAqb3V0X2RhdGE7CisJWE1MX1BhcnNlciBwYXJzZXIgPSBYTUxfUGFyc2VyQ3JlYXRlKE5VTEwpOworCWVudW0gWE1MX1N0YXR1cyByZXN1bHQ7CisJc3RydWN0IGN1cmxfc2xpc3QgKmRhdl9oZWFkZXJzID0gTlVMTDsKKwlzdHJ1Y3QgeG1sX2N0eCBjdHg7CisJc3RydWN0IHJlbW90ZV9sc19jdHggbHM7CisKKwlscy5mbGFncyA9IGZsYWdzOworCWxzLnBhdGggPSBzdHJkdXAocGF0aCk7CisJbHMuZGVudHJ5X25hbWUgPSBOVUxMOworCWxzLmRlbnRyeV9mbGFncyA9IDA7CisJbHMudXNlckRhdGEgPSB1c2VyRGF0YTsKKwlscy51c2VyRnVuYyA9IHVzZXJGdW5jOworCisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisJb3V0X2J1ZmZlci5zaXplID0gc3RybGVuKFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKwlvdXRfZGF0YSA9IHhtYWxsb2Mob3V0X2J1ZmZlci5zaXplICsgMSk7CisJc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsIFBST1BGSU5EX0FMTF9SRVFVRVNUKTsKKwlvdXRfYnVmZmVyLnBvc24gPSAwOworCW91dF9idWZmZXIuYnVmZmVyID0gb3V0X2RhdGE7CisKKwlpbl9idWZmZXIuc2l6ZSA9IDQwOTY7CisJaW5fZGF0YSA9IHhtYWxsb2MoaW5fYnVmZmVyLnNpemUpOworCWluX2J1ZmZlci5wb3NuID0gMDsKKwlpbl9idWZmZXIuYnVmZmVyID0gaW5fZGF0YTsKKworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJEZXB0aDogMSIpOworCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsICJDb250ZW50LVR5cGU6IHRleHQveG1sIik7CisKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZvdXRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgb3V0X2J1ZmZlci5zaXplKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9GSUxFLCAmaW5fYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BST1BGSU5EKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCisJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCXJ1bl9hY3RpdmVfc2xvdChzbG90KTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgPT0gQ1VSTEVfT0spIHsKKwkJCWN0eC5uYW1lID0geGNhbGxvYygxMCwgMSk7CisJCQljdHgubGVuID0gMDsKKwkJCWN0eC5jZGF0YSA9IE5VTEw7CisJCQljdHgudXNlckZ1bmMgPSBoYW5kbGVfcmVtb3RlX2xzX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9ICZsczsKKwkJCVhNTF9TZXRVc2VyRGF0YShwYXJzZXIsICZjdHgpOworCQkJWE1MX1NldEVsZW1lbnRIYW5kbGVyKHBhcnNlciwgeG1sX3N0YXJ0X3RhZywKKwkJCQkJICAgICAgeG1sX2VuZF90YWcpOworCQkJWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHBhcnNlciwgeG1sX2NkYXRhKTsKKwkJCXJlc3VsdCA9IFhNTF9QYXJzZShwYXJzZXIsIGluX2J1ZmZlci5idWZmZXIsCisJCQkJCSAgIGluX2J1ZmZlci5wb3NuLCAxKTsKKwkJCWZyZWUoY3R4Lm5hbWUpOworCisJCQlpZiAocmVzdWx0ICE9IFhNTF9TVEFUVVNfT0spIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlhNTCBlcnJvcjogJXNcbiIsCisJCQkJCVhNTF9FcnJvclN0cmluZygKKwkJCQkJCVhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc3RhcnQgUFJPUEZJTkQgcmVxdWVzdFxuIik7CisJfQorCisJZnJlZShscy5wYXRoKTsKKwlmcmVlKHVybCk7CisJZnJlZShvdXRfZGF0YSk7CisJZnJlZShpbl9idWZmZXIuYnVmZmVyKTsKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRhdl9oZWFkZXJzKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X3JlbW90ZV9vYmplY3RfbGlzdCh1bnNpZ25lZCBjaGFyIHBhcmVudCkKK3sKKwljaGFyIHBhdGhbXSA9ICJvYmplY3RzL1hYLyI7CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4W10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisJdW5zaWduZWQgaW50IHZhbCA9IHBhcmVudDsKKworCXBhdGhbOF0gPSBoZXhbdmFsID4+IDRdOworCXBhdGhbOV0gPSBoZXhbdmFsICYgMHhmXTsKKwlyZW1vdGVfZGlyX2V4aXN0c1t2YWxdID0gMDsKKwlyZW1vdGVfbHMocGF0aCwgKFBST0NFU1NfRklMRVMgfCBQUk9DRVNTX0RJUlMpLAorCQkgIHByb2Nlc3NfbHNfb2JqZWN0LCAmdmFsKTsKK30KKworc3RhdGljIGludCBsb2NraW5nX2F2YWlsYWJsZSh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKwlzdHJ1Y3QgYnVmZmVyIGluX2J1ZmZlcjsKKwlzdHJ1Y3QgYnVmZmVyIG91dF9idWZmZXI7CisJY2hhciAqaW5fZGF0YTsKKwljaGFyICpvdXRfZGF0YTsKKwlYTUxfUGFyc2VyIHBhcnNlciA9IFhNTF9QYXJzZXJDcmVhdGUoTlVMTCk7CisJZW51bSBYTUxfU3RhdHVzIHJlc3VsdDsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCXN0cnVjdCB4bWxfY3R4IGN0eDsKKwlpbnQgbG9ja19mbGFncyA9IDA7CisKKwlvdXRfYnVmZmVyLnNpemUgPQorCQlzdHJsZW4oUFJPUEZJTkRfU1VQUE9SVEVETE9DS19SRVFVRVNUKSArCisJCXN0cmxlbihyZW1vdGUtPnVybCkgLSAyOworCW91dF9kYXRhID0geG1hbGxvYyhvdXRfYnVmZmVyLnNpemUgKyAxKTsKKwlzbnByaW50ZihvdXRfZGF0YSwgb3V0X2J1ZmZlci5zaXplICsgMSwKKwkJIFBST1BGSU5EX1NVUFBPUlRFRExPQ0tfUkVRVUVTVCwgcmVtb3RlLT51cmwpOworCW91dF9idWZmZXIucG9zbiA9IDA7CisJb3V0X2J1ZmZlci5idWZmZXIgPSBvdXRfZGF0YTsKKworCWluX2J1ZmZlci5zaXplID0gNDA5NjsKKwlpbl9kYXRhID0geG1hbGxvYyhpbl9idWZmZXIuc2l6ZSk7CisJaW5fYnVmZmVyLnBvc24gPSAwOworCWluX2J1ZmZlci5idWZmZXIgPSBpbl9kYXRhOworCisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgIkRlcHRoOiAwIik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgIkNvbnRlbnQtVHlwZTogdGV4dC94bWwiKTsKKworCXNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRSwgJm91dF9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEVTSVpFLCBvdXRfYnVmZmVyLnNpemUpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIGZyZWFkX2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0ZJTEUsICZpbl9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBmd3JpdGVfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCByZW1vdGUtPnVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VQTE9BRCwgMSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9QUk9QRklORCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIGRhdl9oZWFkZXJzKTsKKworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ID09IENVUkxFX09LKSB7CisJCQljdHgubmFtZSA9IHhjYWxsb2MoMTAsIDEpOworCQkJY3R4LmxlbiA9IDA7CisJCQljdHguY2RhdGEgPSBOVUxMOworCQkJY3R4LnVzZXJGdW5jID0gaGFuZGxlX2xvY2twcm9wX2N0eDsKKwkJCWN0eC51c2VyRGF0YSA9ICZsb2NrX2ZsYWdzOworCQkJWE1MX1NldFVzZXJEYXRhKHBhcnNlciwgJmN0eCk7CisJCQlYTUxfU2V0RWxlbWVudEhhbmRsZXIocGFyc2VyLCB4bWxfc3RhcnRfdGFnLAorCQkJCQkgICAgICB4bWxfZW5kX3RhZyk7CisJCQlyZXN1bHQgPSBYTUxfUGFyc2UocGFyc2VyLCBpbl9idWZmZXIuYnVmZmVyLAorCQkJCQkgICBpbl9idWZmZXIucG9zbiwgMSk7CisJCQlmcmVlKGN0eC5uYW1lKTsKKworCQkJaWYgKHJlc3VsdCAhPSBYTUxfU1RBVFVTX09LKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJYTUwgZXJyb3I6ICVzXG4iLAorCQkJCQlYTUxfRXJyb3JTdHJpbmcoCisJCQkJCQlYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKKwkJCQlsb2NrX2ZsYWdzID0gMDsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFBST1BGSU5EIHJlcXVlc3RcbiIpOworCX0KKworCWZyZWUob3V0X2RhdGEpOworCWZyZWUoaW5fYnVmZmVyLmJ1ZmZlcik7CisJY3VybF9zbGlzdF9mcmVlX2FsbChkYXZfaGVhZGVycyk7CisKKwlyZXR1cm4gbG9ja19mbGFnczsKK30KKworc3RydWN0IG9iamVjdF9saXN0ICoqYWRkX29uZV9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwKQoreworCXN0cnVjdCBvYmplY3RfbGlzdCAqZW50cnkgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2xpc3QpKTsKKwllbnRyeS0+aXRlbSA9IG9iajsKKwllbnRyeS0+bmV4dCA9ICpwOworCSpwID0gZW50cnk7CisJcmV0dXJuICZlbnRyeS0+bmV4dDsKK30KKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqKnByb2Nlc3NfYmxvYihzdHJ1Y3QgYmxvYiAqYmxvYiwKKwkJCQkJIHN0cnVjdCBvYmplY3RfbGlzdCAqKnAsCisJCQkJCSBzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmYmxvYi0+b2JqZWN0OworCisJb2JqLT5mbGFncyB8PSBMT0NBTDsKKworCWlmIChvYmotPmZsYWdzICYgKFVOSU5URVJFU1RJTkcgfCBTRUVOKSkKKwkJcmV0dXJuIHA7CisKKwlvYmotPmZsYWdzIHw9IFNFRU47CisJcmV0dXJuIGFkZF9vbmVfb2JqZWN0KG9iaiwgcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwcm9jZXNzX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsCisJCQkJCSBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipwLAorCQkJCQkgc3RydWN0IG5hbWVfcGF0aCAqcGF0aCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gJnRyZWUtPm9iamVjdDsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisJc3RydWN0IG5hbWVfcGF0aCBtZTsKKworCW9iai0+ZmxhZ3MgfD0gTE9DQUw7CisKKwlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCXJldHVybiBwOworCWlmIChwYXJzZV90cmVlKHRyZWUpIDwgMCkKKwkJZGllKCJiYWQgdHJlZSBvYmplY3QgJXMiLCBzaGExX3RvX2hleChvYmotPnNoYTEpKTsKKworCW9iai0+ZmxhZ3MgfD0gU0VFTjsKKwluYW1lID0gc3RyZHVwKG5hbWUpOworCXAgPSBhZGRfb25lX29iamVjdChvYmosIHApOworCW1lLnVwID0gcGF0aDsKKwltZS5lbGVtID0gbmFtZTsKKwltZS5lbGVtX2xlbiA9IHN0cmxlbihuYW1lKTsKKworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkKKwkJCXAgPSBwcm9jZXNzX3RyZWUobG9va3VwX3RyZWUoZW50cnkuc2hhMSksIHAsICZtZSwgbmFtZSk7CisJCWVsc2UKKwkJCXAgPSBwcm9jZXNzX2Jsb2IobG9va3VwX2Jsb2IoZW50cnkuc2hhMSksIHAsICZtZSwgbmFtZSk7CisJfQorCWZyZWUodHJlZS0+YnVmZmVyKTsKKwl0cmVlLT5idWZmZXIgPSBOVUxMOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IGdldF9kZWx0YShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY29tbWl0ICpjb21taXQ7CisJc3RydWN0IG9iamVjdF9saXN0ICoqcCA9ICZvYmplY3RzOworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGNvbW1pdCA9IGdldF9yZXZpc2lvbihyZXZzKSkgIT0gTlVMTCkgeworCQlwID0gcHJvY2Vzc190cmVlKGNvbW1pdC0+dHJlZSwgcCwgTlVMTCwgIiIpOworCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBMT0NBTDsKKwkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWNvdW50ICs9IGFkZF9zZW5kX3JlcXVlc3QoJmNvbW1pdC0+b2JqZWN0LCBsb2NrKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmV2cy0+cGVuZGluZy5ucjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmVudHJ5ID0gcmV2cy0+cGVuZGluZy5vYmplY3RzICsgaTsKKwkJc3RydWN0IG9iamVjdCAqb2JqID0gZW50cnktPml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBlbnRyeS0+bmFtZTsKKworCQlpZiAob2JqLT5mbGFncyAmIChVTklOVEVSRVNUSU5HIHwgU0VFTikpCisJCQljb250aW51ZTsKKwkJaWYgKG9iai0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCQlvYmotPmZsYWdzIHw9IFNFRU47CisJCQlwID0gYWRkX29uZV9vYmplY3Qob2JqLCBwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX1RSRUUpIHsKKwkJCXAgPSBwcm9jZXNzX3RyZWUoKHN0cnVjdCB0cmVlICopb2JqLCBwLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJCXAgPSBwcm9jZXNzX2Jsb2IoKHN0cnVjdCBibG9iICopb2JqLCBwLCBOVUxMLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgidW5rbm93biBwZW5kaW5nIG9iamVjdCAlcyAoJXMpIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgbmFtZSk7CisJfQorCisJd2hpbGUgKG9iamVjdHMpIHsKKwkJaWYgKCEob2JqZWN0cy0+aXRlbS0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWNvdW50ICs9IGFkZF9zZW5kX3JlcXVlc3Qob2JqZWN0cy0+aXRlbSwgbG9jayk7CisJCW9iamVjdHMgPSBvYmplY3RzLT5uZXh0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB1cGRhdGVfcmVtb3RlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCByZW1vdGVfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdDsKKwlzdHJ1Y3Qgc2xvdF9yZXN1bHRzIHJlc3VsdHM7CisJY2hhciAqb3V0X2RhdGE7CisJY2hhciAqaWZfaGVhZGVyOworCXN0cnVjdCBidWZmZXIgb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCWludCBpOworCisJaWZfaGVhZGVyID0geG1hbGxvYyhzdHJsZW4obG9jay0+dG9rZW4pICsgMjUpOworCXNwcmludGYoaWZfaGVhZGVyLCAiSWY6ICg8b3BhcXVlbG9ja3Rva2VuOiVzPikiLCBsb2NrLT50b2tlbik7CisJZGF2X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkYXZfaGVhZGVycywgaWZfaGVhZGVyKTsKKworCW91dF9idWZmZXIuc2l6ZSA9IDQxOworCW91dF9kYXRhID0geG1hbGxvYyhvdXRfYnVmZmVyLnNpemUgKyAxKTsKKwlpID0gc25wcmludGYob3V0X2RhdGEsIG91dF9idWZmZXIuc2l6ZSArIDEsICIlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChpICE9IG91dF9idWZmZXIuc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBpbml0aWFsaXplIFBVVCByZXF1ZXN0IGJvZHlcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0X2J1ZmZlci5wb3NuID0gMDsKKwlvdXRfYnVmZmVyLmJ1ZmZlciA9IG91dF9kYXRhOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFLCAmb3V0X2J1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0lORklMRVNJWkUsIG91dF9idWZmZXIuc2l6ZSk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1JFQURGVU5DVElPTiwgZnJlYWRfYnVmZmVyKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCBEQVZfUFVUKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgZGF2X2hlYWRlcnMpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9QVVQsIDEpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIGxvY2stPnVybCk7CisKKwlpZiAoc3RhcnRfYWN0aXZlX3Nsb3Qoc2xvdCkpIHsKKwkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQlmcmVlKG91dF9kYXRhKTsKKwkJZnJlZShpZl9oZWFkZXIpOworCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIlBVVCBlcnJvcjogY3VybCByZXN1bHQ9JWQsIEhUVFAgY29kZT0lbGRcbiIsCisJCQkJcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCQkJLyogV2Ugc2hvdWxkIGF0dGVtcHQgcmVjb3Zlcnk/ICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWUob3V0X2RhdGEpOworCQlmcmVlKGlmX2hlYWRlcik7CisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIHN0YXJ0IFBVVCByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVmICpsb2NhbF9yZWZzLCAqKmxvY2FsX3RhaWw7CitzdGF0aWMgc3RydWN0IHJlZiAqcmVtb3RlX3JlZnMsICoqcmVtb3RlX3RhaWw7CisKK3N0YXRpYyBpbnQgb25lX2xvY2FsX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwlpbnQgbGVuID0gc3RybGVuKHJlZm5hbWUpICsgMTsKKwlyZWYgPSB4Y2FsbG9jKDEsIHNpemVvZigqcmVmKSArIGxlbik7CisJbWVtY3B5KHJlZi0+bmV3X3NoYTEsIHNoYTEsIDIwKTsKKwltZW1jcHkocmVmLT5uYW1lLCByZWZuYW1lLCBsZW4pOworCSpsb2NhbF90YWlsID0gcmVmOworCWxvY2FsX3RhaWwgPSAmcmVmLT5uZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbmVfcmVtb3RlX3JlZihjaGFyICpyZWZuYW1lKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwl1bnNpZ25lZCBjaGFyIHJlbW90ZV9zaGExWzIwXTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmo7CisJaW50IGxlbiA9IHN0cmxlbihyZWZuYW1lKSArIDE7CisKKwlpZiAoZmV0Y2hfcmVmKHJlZm5hbWUsIHJlbW90ZV9zaGExKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBmZXRjaCByZWYgJXMgZnJvbSAlc1xuIiwKKwkJCXJlZm5hbWUsIHJlbW90ZS0+dXJsKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogRmV0Y2ggYSBjb3B5IG9mIHRoZSBvYmplY3QgaWYgaXQgZG9lc24ndCBleGlzdCBsb2NhbGx5IC0gaXQKKwkgKiBtYXkgYmUgcmVxdWlyZWQgZm9yIHVwZGF0aW5nIHNlcnZlciBpbmZvIGxhdGVyLgorCSAqLworCWlmIChyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzICYmICFoYXNfc2hhMV9maWxlKHJlbW90ZV9zaGExKSkgeworCQlvYmogPSBsb29rdXBfdW5rbm93bl9vYmplY3QocmVtb3RlX3NoYTEpOworCQlpZiAob2JqKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwJIiAgZmV0Y2ggJXMgZm9yICVzXG4iLAorCQkJCXNoYTFfdG9faGV4KHJlbW90ZV9zaGExKSwgcmVmbmFtZSk7CisJCQlhZGRfZmV0Y2hfcmVxdWVzdChvYmopOworCQl9CisJfQorCisJcmVmID0geGNhbGxvYygxLCBzaXplb2YoKnJlZikgKyBsZW4pOworCW1lbWNweShyZWYtPm9sZF9zaGExLCByZW1vdGVfc2hhMSwgMjApOworCW1lbWNweShyZWYtPm5hbWUsIHJlZm5hbWUsIGxlbik7CisJKnJlbW90ZV90YWlsID0gcmVmOworCXJlbW90ZV90YWlsID0gJnJlZi0+bmV4dDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2xvY2FsX2hlYWRzKHZvaWQpCit7CisJbG9jYWxfdGFpbCA9ICZsb2NhbF9yZWZzOworCWZvcl9lYWNoX3JlZihvbmVfbG9jYWxfcmVmKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2Rhdl9yZW1vdGVfaGVhZHModm9pZCkKK3sKKwlyZW1vdGVfdGFpbCA9ICZyZW1vdGVfcmVmczsKKwlyZW1vdGVfbHMoInJlZnMvIiwgKFBST0NFU1NfRklMRVMgfCBQUk9DRVNTX0RJUlMgfCBSRUNVUlNJVkUpLCBwcm9jZXNzX2xzX3JlZiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfemVyb19zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlpZiAoKnNoYTErKykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2FuZF9mcmVlKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgdW5zaWduZWQgaW50IG1hcmspCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICp0ZW1wID0gbGlzdDsKKwkJdGVtcC0+aXRlbS0+b2JqZWN0LmZsYWdzICY9IH5tYXJrOworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVmX25ld2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCXN0cnVjdCBvYmplY3QgKm87CisJc3RydWN0IGNvbW1pdCAqb2xkLCAqbmV3OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgKnVzZWQ7CisJaW50IGZvdW5kID0gMDsKKworCS8qIEJvdGggbmV3IGFuZCBvbGQgbXVzdCBiZSBjb21taXQtaXNoIGFuZCBuZXcgaXMgZGVzY2VuZGFudCBvZgorCSAqIG9sZC4gIE90aGVyd2lzZSB3ZSByZXF1aXJlIC0tZm9yY2UuCisJICovCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qob2xkX3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwlvbGQgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3QobmV3X3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwluZXcgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJaWYgKHBhcnNlX2NvbW1pdChuZXcpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwl1c2VkID0gbGlzdCA9IE5VTEw7CisJY29tbWl0X2xpc3RfaW5zZXJ0KG5ldywgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCW5ldyA9IHBvcF9tb3N0X3JlY2VudF9jb21taXQoJmxpc3QsIFRNUF9NQVJLKTsKKwkJY29tbWl0X2xpc3RfaW5zZXJ0KG5ldywgJnVzZWQpOworCQlpZiAobmV3ID09IG9sZCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJdW5tYXJrX2FuZF9mcmVlKGxpc3QsIFRNUF9NQVJLKTsKKwl1bm1hcmtfYW5kX2ZyZWUodXNlZCwgVE1QX01BUkspOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHZvaWQgbWFya19lZGdlX3BhcmVudHNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlpZiAoIShwYXJlbnQtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKQorCQkJY29udGludWU7CisJCW1hcmtfdHJlZV91bmludGVyZXN0aW5nKHBhcmVudC0+dHJlZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtYXJrX2VkZ2VzX3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdF9saXN0ICpsaXN0KQoreworCWZvciAoIDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbGlzdC0+aXRlbTsKKworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQltYXJrX3RyZWVfdW5pbnRlcmVzdGluZyhjb21taXQtPnRyZWUpOworCQkJY29udGludWU7CisJCX0KKwkJbWFya19lZGdlX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCX0KK30KKworc3RhdGljIHZvaWQgYWRkX3JlbW90ZV9pbmZvX3JlZihzdHJ1Y3QgcmVtb3RlX2xzX2N0eCAqbHMpCit7CisJc3RydWN0IGJ1ZmZlciAqYnVmID0gKHN0cnVjdCBidWZmZXIgKilscy0+dXNlckRhdGE7CisJdW5zaWduZWQgY2hhciByZW1vdGVfc2hhMVsyMF07CisJc3RydWN0IG9iamVjdCAqbzsKKwlpbnQgbGVuOworCWNoYXIgKnJlZl9pbmZvOworCisJaWYgKGZldGNoX3JlZihscy0+ZGVudHJ5X25hbWUsIHJlbW90ZV9zaGExKSAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVuYWJsZSB0byBmZXRjaCByZWYgJXMgZnJvbSAlc1xuIiwKKwkJCWxzLT5kZW50cnlfbmFtZSwgcmVtb3RlLT51cmwpOworCQlhYm9ydGVkID0gMTsKKwkJcmV0dXJuOworCX0KKworCW8gPSBwYXJzZV9vYmplY3QocmVtb3RlX3NoYTEpOworCWlmICghbykgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJVbmFibGUgdG8gcGFyc2Ugb2JqZWN0ICVzIGZvciByZW1vdGUgcmVmICVzXG4iLAorCQkJc2hhMV90b19oZXgocmVtb3RlX3NoYTEpLCBscy0+ZGVudHJ5X25hbWUpOworCQlhYm9ydGVkID0gMTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHN0cmxlbihscy0+ZGVudHJ5X25hbWUpICsgNDI7CisJcmVmX2luZm8gPSB4Y2FsbG9jKGxlbiArIDEsIDEpOworCXNwcmludGYocmVmX2luZm8sICIlcwklc1xuIiwKKwkJc2hhMV90b19oZXgocmVtb3RlX3NoYTEpLCBscy0+ZGVudHJ5X25hbWUpOworCWZ3cml0ZV9idWZmZXIocmVmX2luZm8sIDEsIGxlbiwgYnVmKTsKKwlmcmVlKHJlZl9pbmZvKTsKKworCWlmIChvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCBscy0+ZGVudHJ5X25hbWUsIDApOworCQlpZiAobykgeworCQkJbGVuID0gc3RybGVuKGxzLT5kZW50cnlfbmFtZSkgKyA0NTsKKwkJCXJlZl9pbmZvID0geGNhbGxvYyhsZW4gKyAxLCAxKTsKKwkJCXNwcmludGYocmVmX2luZm8sICIlcwklc157fVxuIiwKKwkJCQlzaGExX3RvX2hleChvLT5zaGExKSwgbHMtPmRlbnRyeV9uYW1lKTsKKwkJCWZ3cml0ZV9idWZmZXIocmVmX2luZm8sIDEsIGxlbiwgYnVmKTsKKwkJCWZyZWUocmVmX2luZm8pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcmVtb3RlX2luZm9fcmVmcyhzdHJ1Y3QgcmVtb3RlX2xvY2sgKmxvY2spCit7CisJc3RydWN0IGJ1ZmZlciBidWZmZXI7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCWNoYXIgKmlmX2hlYWRlcjsKKwlzdHJ1Y3QgY3VybF9zbGlzdCAqZGF2X2hlYWRlcnMgPSBOVUxMOworCisJYnVmZmVyLmJ1ZmZlciA9IHhjYWxsb2MoMSwgNDA5Nik7CisJYnVmZmVyLnNpemUgPSA0MDk2OworCWJ1ZmZlci5wb3NuID0gMDsKKwlyZW1vdGVfbHMoInJlZnMvIiwgKFBST0NFU1NfRklMRVMgfCBSRUNVUlNJVkUpLAorCQkgIGFkZF9yZW1vdGVfaW5mb19yZWYsICZidWZmZXIpOworCWlmICghYWJvcnRlZCkgeworCQlpZl9oZWFkZXIgPSB4bWFsbG9jKHN0cmxlbihsb2NrLT50b2tlbikgKyAyNSk7CisJCXNwcmludGYoaWZfaGVhZGVyLCAiSWY6ICg8b3BhcXVlbG9ja3Rva2VuOiVzPikiLCBsb2NrLT50b2tlbik7CisJCWRhdl9oZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoZGF2X2hlYWRlcnMsIGlmX2hlYWRlcik7CisKKwkJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCQlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9JTkZJTEUsICZidWZmZXIpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSU5GSUxFU0laRSwgYnVmZmVyLnBvc24pOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUkVBREZVTkNUSU9OLCBmcmVhZF9idWZmZXIpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgREFWX1BVVCk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBkYXZfaGVhZGVycyk7CisJCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUExPQUQsIDEpOworCQljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfUFVULCAxKTsKKwkJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1VSTCwgbG9jay0+dXJsKTsKKworCQlidWZmZXIucG9zbiA9IDA7CisKKwkJaWYgKHN0YXJ0X2FjdGl2ZV9zbG90KHNsb3QpKSB7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCQlpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCAhPSBDVVJMRV9PSykgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiUFVUIGVycm9yOiBjdXJsIHJlc3VsdD0lZCwgSFRUUCBjb2RlPSVsZFxuIiwKKwkJCQkJcmVzdWx0cy5jdXJsX3Jlc3VsdCwgcmVzdWx0cy5odHRwX2NvZGUpOworCQkJfQorCQl9CisJCWZyZWUoaWZfaGVhZGVyKTsKKwl9CisJZnJlZShidWZmZXIuYnVmZmVyKTsKK30KKworc3RhdGljIGludCByZW1vdGVfZXhpc3RzKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciAqdXJsID0geG1hbGxvYyhzdHJsZW4ocmVtb3RlLT51cmwpICsgc3RybGVuKHBhdGgpICsgMSk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCisJc3ByaW50Zih1cmwsICIlcyVzIiwgcmVtb3RlLT51cmwsIHBhdGgpOworCisgICAgICAgIHNsb3QgPSBnZXRfYWN0aXZlX3Nsb3QoKTsKKwlzbG90LT5yZXN1bHRzID0gJnJlc3VsdHM7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9OT0JPRFksIDEpOworCisgICAgICAgIGlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmh0dHBfY29kZSA9PSA0MDQpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAocmVzdWx0cy5jdXJsX3Jlc3VsdCA9PSBDVVJMRV9PSykKKwkJCXJldHVybiAxOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIkhFQUQgSFRUUCBlcnJvciAlbGRcbiIsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBzdGFydCBIRUFEIHJlcXVlc3RcbiIpOworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgZmV0Y2hfc3ltcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKipzeW1yZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY2hhciAqdXJsOworCXN0cnVjdCBidWZmZXIgYnVmZmVyOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCXN0cnVjdCBzbG90X3Jlc3VsdHMgcmVzdWx0czsKKworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIHN0cmxlbihwYXRoKSArIDEpOworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCBwYXRoKTsKKworCWJ1ZmZlci5zaXplID0gNDA5NjsKKwlidWZmZXIucG9zbiA9IDA7CisJYnVmZmVyLmJ1ZmZlciA9IHhtYWxsb2MoYnVmZmVyLnNpemUpOworCisJc2xvdCA9IGdldF9hY3RpdmVfc2xvdCgpOworCXNsb3QtPnJlc3VsdHMgPSAmcmVzdWx0czsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfRklMRSwgJmJ1ZmZlcik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGZ3cml0ZV9idWZmZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQSEVBREVSLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVJMLCB1cmwpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWlmIChyZXN1bHRzLmN1cmxfcmVzdWx0ICE9IENVUkxFX09LKSB7CisJCQlkaWUoIkNvdWxkbid0IGdldCAlcyBmb3IgcmVtb3RlIHN5bXJlZlxuJXMiLAorCQkJICAgIHVybCwgY3VybF9lcnJvcnN0cik7CisJCX0KKwl9IGVsc2UgeworCQlkaWUoIlVuYWJsZSB0byBzdGFydCByZW1vdGUgc3ltcmVmIHJlcXVlc3QiKTsKKwl9CisJZnJlZSh1cmwpOworCisJaWYgKCpzeW1yZWYgIT0gTlVMTCkKKwkJZnJlZSgqc3ltcmVmKTsKKwkqc3ltcmVmID0gTlVMTDsKKwltZW1zZXQoc2hhMSwgMCwgMjApOworCisJaWYgKGJ1ZmZlci5wb3NuID09IDApCisJCXJldHVybjsKKworCS8qIElmIGl0J3MgYSBzeW1yZWYsIHNldCB0aGUgcmVmbmFtZTsgb3RoZXJ3aXNlIHRyeSBmb3IgYSBzaGExICovCisJaWYgKCFzdHJuY21wKChjaGFyICopYnVmZmVyLmJ1ZmZlciwgInJlZjogIiwgNSkpIHsKKwkJKnN5bXJlZiA9IHhtYWxsb2MoYnVmZmVyLnBvc24gLSA1KTsKKwkJc3RybGNweSgqc3ltcmVmLCAoY2hhciAqKWJ1ZmZlci5idWZmZXIgKyA1LCBidWZmZXIucG9zbiAtIDUpOworCX0gZWxzZSB7CisJCWdldF9zaGExX2hleChidWZmZXIuYnVmZmVyLCBzaGExKTsKKwl9CisKKwlmcmVlKGJ1ZmZlci5idWZmZXIpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9tZXJnZV9iYXNlKHVuc2lnbmVkIGNoYXIgKmhlYWRfc2hhMSwgdW5zaWduZWQgY2hhciAqYnJhbmNoX3NoYTEpCit7CisJaW50IHBpcGVfZmRbMl07CisJcGlkX3QgbWVyZ2VfYmFzZV9waWQ7CisJY2hhciBsaW5lW1BBVEhfTUFYICsgMjBdOworCXVuc2lnbmVkIGNoYXIgbWVyZ2Vfc2hhMVsyMF07CisJaW50IHZlcmlmaWVkID0gMDsKKworCWlmIChwaXBlKHBpcGVfZmQpIDwgMCkKKwkJZGllKCJWZXJpZnkgbWVyZ2UgYmFzZTogcGlwZSBmYWlsZWQiKTsKKworCW1lcmdlX2Jhc2VfcGlkID0gZm9yaygpOworCWlmICghbWVyZ2VfYmFzZV9waWQpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3NbXSA9IHsKKwkJCSJtZXJnZS1iYXNlIiwKKwkJCSItYSIsCisJCQlOVUxMLAorCQkJTlVMTCwKKwkJCU5VTEwKKwkJfTsKKwkJYXJnc1syXSA9IHN0cmR1cChzaGExX3RvX2hleChoZWFkX3NoYTEpKTsKKwkJYXJnc1szXSA9IHNoYTFfdG9faGV4KGJyYW5jaF9zaGExKTsKKworCQlkdXAyKHBpcGVfZmRbMV0sIDEpOworCQljbG9zZShwaXBlX2ZkWzBdKTsKKwkJY2xvc2UocGlwZV9mZFsxXSk7CisJCWV4ZWN2X2dpdF9jbWQoYXJncyk7CisJCWRpZSgibWVyZ2UtYmFzZSBzZXR1cCBmYWlsZWQiKTsKKwl9CisJaWYgKG1lcmdlX2Jhc2VfcGlkIDwgMCkKKwkJZGllKCJtZXJnZS1iYXNlIGZvcmsgZmFpbGVkIik7CisKKwlkdXAyKHBpcGVfZmRbMF0sIDApOworCWNsb3NlKHBpcGVfZmRbMF0pOworCWNsb3NlKHBpcGVfZmRbMV0pOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHN0ZGluKSAhPSBOVUxMKSB7CisJCWlmIChnZXRfc2hhMV9oZXgobGluZSwgbWVyZ2Vfc2hhMSkpCisJCQlkaWUoImV4cGVjdGVkIHNoYTEsIGdvdCBnYXJiYWdlOlxuICVzIiwgbGluZSk7CisJCWlmICghbWVtY21wKGJyYW5jaF9zaGExLCBtZXJnZV9zaGExLCAyMCkpIHsKKwkJCXZlcmlmaWVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHZlcmlmaWVkOworfQorCitzdGF0aWMgaW50IGRlbGV0ZV9yZW1vdGVfYnJhbmNoKGNoYXIgKnBhdHRlcm4sIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgcmVmICpyZWZzID0gcmVtb3RlX3JlZnM7CisJc3RydWN0IHJlZiAqcmVtb3RlX3JlZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBoZWFkX3NoYTFbMjBdOworCWNoYXIgKnN5bXJlZiA9IE5VTEw7CisJaW50IG1hdGNoOworCWludCBwYXRsZW4gPSBzdHJsZW4ocGF0dGVybik7CisJaW50IGk7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNsb3RfcmVzdWx0cyByZXN1bHRzOworCWNoYXIgKnVybDsKKworCS8qIEZpbmQgdGhlIHJlbW90ZSBicmFuY2goZXMpIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgYnJhbmNoIG5hbWUgKi8KKwlmb3IgKG1hdGNoID0gMDsgcmVmczsgcmVmcyA9IHJlZnMtPm5leHQpIHsKKwkJY2hhciAqbmFtZSA9IHJlZnMtPm5hbWU7CisJCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCQlpZiAobmFtZWxlbiA8IHBhdGxlbiB8fAorCQkgICAgbWVtY21wKG5hbWUgKyBuYW1lbGVuIC0gcGF0bGVuLCBwYXR0ZXJuLCBwYXRsZW4pKQorCQkJY29udGludWU7CisJCWlmIChuYW1lbGVuICE9IHBhdGxlbiAmJiBuYW1lW25hbWVsZW4gLSBwYXRsZW4gLSAxXSAhPSAnLycpCisJCQljb250aW51ZTsKKwkJbWF0Y2grKzsKKwkJcmVtb3RlX3JlZiA9IHJlZnM7CisJfQorCWlmIChtYXRjaCA9PSAwKQorCQlyZXR1cm4gZXJyb3IoIk5vIHJlbW90ZSBicmFuY2ggbWF0Y2hlcyAlcyIsIHBhdHRlcm4pOworCWlmIChtYXRjaCAhPSAxKQorCQlyZXR1cm4gZXJyb3IoIk1vcmUgdGhhbiBvbmUgcmVtb3RlIGJyYW5jaCBtYXRjaGVzICVzIiwKKwkJCSAgICAgcGF0dGVybik7CisKKwkvKgorCSAqIFJlbW90ZSBIRUFEIG11c3QgYmUgYSBzeW1yZWYgKG5vdCBleGFjdGx5IGZvb2xwcm9vZjsgYSByZW1vdGUKKwkgKiBzeW1saW5rIHRvIGEgc3ltcmVmIHdpbGwgbG9vayBsaWtlIGEgc3ltcmVmKQorCSAqLworCWZldGNoX3N5bXJlZigiSEVBRCIsICZzeW1yZWYsIGhlYWRfc2hhMSk7CisJaWYgKCFzeW1yZWYpCisJCXJldHVybiBlcnJvcigiUmVtb3RlIEhFQUQgaXMgbm90IGEgc3ltcmVmIik7CisKKwkvKiBSZW1vdGUgYnJhbmNoIG11c3Qgbm90IGJlIHRoZSByZW1vdGUgSEVBRCAqLworCWZvciAoaT0wOyBzeW1yZWYgJiYgaTxNQVhERVBUSDsgaSsrKSB7CisJCWlmICghc3RyY21wKHJlbW90ZV9yZWYtPm5hbWUsIHN5bXJlZikpCisJCQlyZXR1cm4gZXJyb3IoIlJlbW90ZSBicmFuY2ggJXMgaXMgdGhlIGN1cnJlbnQgSEVBRCIsCisJCQkJICAgICByZW1vdGVfcmVmLT5uYW1lKTsKKwkJZmV0Y2hfc3ltcmVmKHN5bXJlZiwgJnN5bXJlZiwgaGVhZF9zaGExKTsKKwl9CisKKwkvKiBSdW4gZXh0cmEgc2FuaXR5IGNoZWNrcyBpZiBkZWxldGUgaXMgbm90IGZvcmNlZCAqLworCWlmICghZm9yY2UpIHsKKwkJLyogUmVtb3RlIEhFQUQgbXVzdCByZXNvbHZlIHRvIGEga25vd24gb2JqZWN0ICovCisJCWlmIChzeW1yZWYpCisJCQlyZXR1cm4gZXJyb3IoIlJlbW90ZSBIRUFEIHN5bXJlZnMgdG9vIGRlZXAiKTsKKwkJaWYgKGlzX3plcm9fc2hhMShoZWFkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSByZW1vdGUgSEVBRCIpOworCQlpZiAoIWhhc19zaGExX2ZpbGUoaGVhZF9zaGExKSkKKwkJCXJldHVybiBlcnJvcigiUmVtb3RlIEhFQUQgcmVzb2x2ZXMgdG8gb2JqZWN0ICVzXG53aGljaCBkb2VzIG5vdCBleGlzdCBsb2NhbGx5LCBwZXJoYXBzIHlvdSBuZWVkIHRvIGZldGNoPyIsIHNoYTFfdG9faGV4KGhlYWRfc2hhMSkpOworCisJCS8qIFJlbW90ZSBicmFuY2ggbXVzdCByZXNvbHZlIHRvIGEga25vd24gb2JqZWN0ICovCisJCWlmIChpc196ZXJvX3NoYTEocmVtb3RlX3JlZi0+b2xkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSByZW1vdGUgYnJhbmNoICVzIiwKKwkJCQkgICAgIHJlbW90ZV9yZWYtPm5hbWUpOworCQlpZiAoIWhhc19zaGExX2ZpbGUocmVtb3RlX3JlZi0+b2xkX3NoYTEpKQorCQkJcmV0dXJuIGVycm9yKCJSZW1vdGUgYnJhbmNoICVzIHJlc29sdmVzIHRvIG9iamVjdCAlc1xud2hpY2ggZG9lcyBub3QgZXhpc3QgbG9jYWxseSwgcGVyaGFwcyB5b3UgbmVlZCB0byBmZXRjaD8iLCByZW1vdGVfcmVmLT5uYW1lLCBzaGExX3RvX2hleChyZW1vdGVfcmVmLT5vbGRfc2hhMSkpOworCisJCS8qIFJlbW90ZSBicmFuY2ggbXVzdCBiZSBhbiBhbmNlc3RvciBvZiByZW1vdGUgSEVBRCAqLworCQlpZiAoIXZlcmlmeV9tZXJnZV9iYXNlKGhlYWRfc2hhMSwgcmVtb3RlX3JlZi0+b2xkX3NoYTEpKSB7CisJCQlyZXR1cm4gZXJyb3IoIlRoZSBicmFuY2ggJyVzJyBpcyBub3QgYSBzdHJpY3Qgc3Vic2V0IG9mIHlvdXIgY3VycmVudCBIRUFELlxuSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSBpdCwgcnVuOlxuXHQnZ2l0IGh0dHAtcHVzaCAtRCAlcyAlcyciLCByZW1vdGVfcmVmLT5uYW1lLCByZW1vdGUtPnVybCwgcGF0dGVybik7CisJCX0KKwl9CisKKwkvKiBTZW5kIGRlbGV0ZSByZXF1ZXN0ICovCisJZnByaW50ZihzdGRlcnIsICJSZW1vdmluZyByZW1vdGUgYnJhbmNoICclcydcbiIsIHJlbW90ZV9yZWYtPm5hbWUpOworCXVybCA9IHhtYWxsb2Moc3RybGVuKHJlbW90ZS0+dXJsKSArIHN0cmxlbihyZW1vdGVfcmVmLT5uYW1lKSArIDEpOworCXNwcmludGYodXJsLCAiJXMlcyIsIHJlbW90ZS0+dXJsLCByZW1vdGVfcmVmLT5uYW1lKTsKKwlzbG90ID0gZ2V0X2FjdGl2ZV9zbG90KCk7CisJc2xvdC0+cmVzdWx0cyA9ICZyZXN1bHRzOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9IVFRQR0VULCAxKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgZndyaXRlX251bGwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIERBVl9ERUxFVEUpOworCWlmIChzdGFydF9hY3RpdmVfc2xvdChzbG90KSkgeworCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCWZyZWUodXJsKTsKKwkJaWYgKHJlc3VsdHMuY3VybF9yZXN1bHQgIT0gQ1VSTEVfT0spCisJCQlyZXR1cm4gZXJyb3IoIkRFTEVURSByZXF1ZXN0IGZhaWxlZCAoJWQvJWxkKVxuIiwKKwkJCQkgICAgIHJlc3VsdHMuY3VybF9yZXN1bHQsIHJlc3VsdHMuaHR0cF9jb2RlKTsKKwl9IGVsc2UgeworCQlmcmVlKHVybCk7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIHN0YXJ0IERFTEVURSByZXF1ZXN0Iik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgdHJhbnNmZXJfcmVxdWVzdCAqbmV4dF9yZXF1ZXN0OworCWludCBucl9yZWZzcGVjID0gMDsKKwljaGFyICoqcmVmc3BlYyA9IE5VTEw7CisJc3RydWN0IHJlbW90ZV9sb2NrICpyZWZfbG9jayA9IE5VTEw7CisJc3RydWN0IHJlbW90ZV9sb2NrICppbmZvX3JlZl9sb2NrID0gTlVMTDsKKwlzdHJ1Y3QgcmV2X2luZm8gcmV2czsKKwlpbnQgZGVsZXRlX2JyYW5jaCA9IDA7CisJaW50IGZvcmNlX2RlbGV0ZSA9IDA7CisJaW50IG9iamVjdHNfdG9fc2VuZDsKKwlpbnQgcmMgPSAwOworCWludCBpOworCWludCBuZXdfcmVmczsKKwlzdHJ1Y3QgcmVmICpyZWY7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJc2V0dXBfaWRlbnQoKTsKKworCXJlbW90ZSA9IHhjYWxsb2Moc2l6ZW9mKCpyZW1vdGUpLCAxKTsKKworCWFyZ3YrKzsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJcHVzaF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mb3JjZSIpKSB7CisJCQkJZm9yY2VfYWxsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJcHVzaF92ZXJib3NlbHkgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLUQiKSkgeworCQkJCWRlbGV0ZV9icmFuY2ggPSAxOworCQkJCWZvcmNlX2RlbGV0ZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJaWYgKCFyZW1vdGUtPnVybCkgeworCQkJY2hhciAqcGF0aCA9IHN0cnN0cihhcmcsICIvLyIpOworCQkJcmVtb3RlLT51cmwgPSBhcmc7CisJCQlpZiAocGF0aCkgeworCQkJCXBhdGggPSBzdHJjaHIocGF0aCsyLCAnLycpOworCQkJCWlmIChwYXRoKQorCQkJCQlyZW1vdGUtPnBhdGhfbGVuID0gc3RybGVuKHBhdGgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJcmVmc3BlYyA9IGFyZ3Y7CisJCW5yX3JlZnNwZWMgPSBhcmdjIC0gaTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyZW1vdGUtPnVybCkKKwkJdXNhZ2UoaHR0cF9wdXNoX3VzYWdlKTsKKworCWlmIChkZWxldGVfYnJhbmNoICYmIG5yX3JlZnNwZWMgIT0gMSkKKwkJZGllKCJZb3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIGJyYW5jaCBuYW1lIHdoZW4gZGVsZXRpbmcgYSByZW1vdGUgYnJhbmNoIik7CisKKwltZW1zZXQocmVtb3RlX2Rpcl9leGlzdHMsIC0xLCAyNTYpOworCisJaHR0cF9pbml0KCk7CisKKwlub19wcmFnbWFfaGVhZGVyID0gY3VybF9zbGlzdF9hcHBlbmQobm9fcHJhZ21hX2hlYWRlciwgIlByYWdtYToiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJSYW5nZToiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJEZXN0aW5hdGlvbjoiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsICJJZjoiKTsKKwlkZWZhdWx0X2hlYWRlcnMgPSBjdXJsX3NsaXN0X2FwcGVuZChkZWZhdWx0X2hlYWRlcnMsCisJCQkJCSAgICAiUHJhZ21hOiBuby1jYWNoZSIpOworCisJLyogVmVyaWZ5IERBViBjb21wbGlhbmNlL2xvY2sgc3VwcG9ydCAqLworCWlmICghbG9ja2luZ19hdmFpbGFibGUoKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBubyBEQVYgbG9ja2luZyBzdXBwb3J0IG9uIHJlbW90ZSByZXBvICVzXG4iLCByZW1vdGUtPnVybCk7CisJCXJjID0gMTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHJlbW90ZSBoYXMgc2VydmVyIGluZm8gZmlsZXMgKi8KKwlyZW1vdGUtPmNhbl91cGRhdGVfaW5mb19yZWZzID0gMDsKKwlyZW1vdGUtPmhhc19pbmZvX3JlZnMgPSByZW1vdGVfZXhpc3RzKCJpbmZvL3JlZnMiKTsKKwlyZW1vdGUtPmhhc19pbmZvX3BhY2tzID0gcmVtb3RlX2V4aXN0cygib2JqZWN0cy9pbmZvL3BhY2tzIik7CisJaWYgKHJlbW90ZS0+aGFzX2luZm9fcmVmcykgeworCQlpbmZvX3JlZl9sb2NrID0gbG9ja19yZW1vdGUoImluZm8vcmVmcyIsIExPQ0tfVElNRSk7CisJCWlmIChpbmZvX3JlZl9sb2NrKQorCQkJcmVtb3RlLT5jYW5fdXBkYXRlX2luZm9fcmVmcyA9IDE7CisJfQorCWlmIChyZW1vdGUtPmhhc19pbmZvX3BhY2tzKQorCQlmZXRjaF9pbmRpY2VzKCk7CisKKwkvKiBHZXQgYSBsaXN0IG9mIGFsbCBsb2NhbCBhbmQgcmVtb3RlIGhlYWRzIHRvIHZhbGlkYXRlIHJlZnNwZWNzICovCisJZ2V0X2xvY2FsX2hlYWRzKCk7CisJZnByaW50ZihzdGRlcnIsICJGZXRjaGluZyByZW1vdGUgaGVhZHMuLi5cbiIpOworCWdldF9kYXZfcmVtb3RlX2hlYWRzKCk7CisKKwkvKiBSZW1vdmUgYSByZW1vdGUgYnJhbmNoIGlmIC1kIG9yIC1EIHdhcyBzcGVjaWZpZWQgKi8KKwlpZiAoZGVsZXRlX2JyYW5jaCkgeworCQlpZiAoZGVsZXRlX3JlbW90ZV9icmFuY2gocmVmc3BlY1swXSwgZm9yY2VfZGVsZXRlKSA9PSAtMSkKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRlbGV0ZSByZW1vdGUgYnJhbmNoICVzXG4iLAorCQkJCXJlZnNwZWNbMF0pOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogbWF0Y2ggdGhlbSB1cCAqLworCWlmICghcmVtb3RlX3RhaWwpCisJCXJlbW90ZV90YWlsID0gJnJlbW90ZV9yZWZzOworCWlmIChtYXRjaF9yZWZzKGxvY2FsX3JlZnMsIHJlbW90ZV9yZWZzLCAmcmVtb3RlX3RhaWwsCisJCSAgICAgICBucl9yZWZzcGVjLCByZWZzcGVjLCBwdXNoX2FsbCkpCisJCXJldHVybiAtMTsKKwlpZiAoIXJlbW90ZV9yZWZzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm8gcmVmcyBpbiBjb21tb24gYW5kIG5vbmUgc3BlY2lmaWVkOyBkb2luZyBub3RoaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKworCW5ld19yZWZzID0gMDsKKwlmb3IgKHJlZiA9IHJlbW90ZV9yZWZzOyByZWY7IHJlZiA9IHJlZi0+bmV4dCkgeworCQljaGFyIG9sZF9oZXhbNjBdLCAqbmV3X2hleDsKKwkJY29uc3QgY2hhciAqY29tbWl0X2FyZ3ZbNF07CisJCWludCBjb21taXRfYXJnYzsKKwkJY2hhciAqbmV3X3NoYTFfaGV4LCAqb2xkX3NoYTFfaGV4OworCisJCWlmICghcmVmLT5wZWVyX3JlZikKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1lbWNtcChyZWYtPm9sZF9zaGExLCByZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwgMjApKSB7CisJCQlpZiAocHVzaF92ZXJib3NlbHkgfHwgMSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghZm9yY2VfYWxsICYmCisJCSAgICAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpICYmCisJCSAgICAhcmVmLT5mb3JjZSkgeworCQkJaWYgKCFoYXNfc2hhMV9maWxlKHJlZi0+b2xkX3NoYTEpIHx8CisJCQkgICAgIXJlZl9uZXdlcihyZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwKKwkJCQkgICAgICAgcmVmLT5vbGRfc2hhMSkpIHsKKwkJCQkvKiBXZSBkbyBub3QgaGF2ZSB0aGUgcmVtb3RlIHJlZiwgb3IKKwkJCQkgKiB3ZSBrbm93IHRoYXQgdGhlIHJlbW90ZSByZWYgaXMgbm90CisJCQkJICogYW4gYW5jZXN0b3Igb2Ygd2hhdCB3ZSBhcmUgdHJ5aW5nIHRvCisJCQkJICogcHVzaC4gIEVpdGhlciB3YXkgdGhpcyBjYW4gYmUgbG9zaW5nCisJCQkJICogY29tbWl0cyBhdCB0aGUgcmVtb3RlIGVuZCBhbmQgbGlrZWx5CisJCQkJICogd2Ugd2VyZSBub3QgdXAgdG8gZGF0ZSB0byBiZWdpbiB3aXRoLgorCQkJCSAqLworCQkJCWVycm9yKCJyZW1vdGUgJyVzJyBpcyBub3QgYSBzdHJpY3QgIgorCQkJCSAgICAgICJzdWJzZXQgb2YgbG9jYWwgcmVmICclcycuICIKKwkJCQkgICAgICAibWF5YmUgeW91IGFyZSBub3QgdXAtdG8tZGF0ZSBhbmQgIgorCQkJCSAgICAgICJuZWVkIHRvIHB1bGwgZmlyc3Q/IiwKKwkJCQkgICAgICByZWYtPm5hbWUsCisJCQkJICAgICAgcmVmLT5wZWVyX3JlZi0+bmFtZSk7CisJCQkJcmMgPSAtMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQltZW1jcHkocmVmLT5uZXdfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEsIDIwKTsKKwkJaWYgKGlzX3plcm9fc2hhMShyZWYtPm5ld19zaGExKSkgeworCQkJZXJyb3IoImNhbm5vdCBoYXBwZW4gYW55bW9yZSIpOworCQkJcmMgPSAtMzsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5ld19yZWZzKys7CisJCXN0cmNweShvbGRfaGV4LCBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSk7CisJCW5ld19oZXggPSBzaGExX3RvX2hleChyZWYtPm5ld19zaGExKTsKKworCQlmcHJpbnRmKHN0ZGVyciwgInVwZGF0aW5nICclcyciLCByZWYtPm5hbWUpOworCQlpZiAoc3RyY21wKHJlZi0+bmFtZSwgcmVmLT5wZWVyX3JlZi0+bmFtZSkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiB1c2luZyAnJXMnIiwgcmVmLT5wZWVyX3JlZi0+bmFtZSk7CisJCWZwcmludGYoc3RkZXJyLCAiXG4gIGZyb20gJXNcbiAgdG8gICAlc1xuIiwgb2xkX2hleCwgbmV3X2hleCk7CisKKworCQkvKiBMb2NrIHJlbW90ZSBicmFuY2ggcmVmICovCisJCXJlZl9sb2NrID0gbG9ja19yZW1vdGUocmVmLT5uYW1lLCBMT0NLX1RJTUUpOworCQlpZiAocmVmX2xvY2sgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9jayByZW1vdGUgYnJhbmNoICVzXG4iLAorCQkJCXJlZi0+bmFtZSk7CisJCQlyYyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFNldCB1cCByZXZpc2lvbiBpbmZvIGZvciB0aGlzIHJlZnNwZWMgKi8KKwkJY29tbWl0X2FyZ2MgPSAzOworCQluZXdfc2hhMV9oZXggPSBzdHJkdXAoc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSkpOworCQlvbGRfc2hhMV9oZXggPSBOVUxMOworCQljb21taXRfYXJndlsxXSA9ICItLW9iamVjdHMiOworCQljb21taXRfYXJndlsyXSA9IG5ld19zaGExX2hleDsKKwkJaWYgKCFwdXNoX2FsbCAmJiAhaXNfemVyb19zaGExKHJlZi0+b2xkX3NoYTEpKSB7CisJCQlvbGRfc2hhMV9oZXggPSB4bWFsbG9jKDQyKTsKKwkJCXNwcmludGYob2xkX3NoYTFfaGV4LCAiXiVzIiwKKwkJCQlzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSk7CisJCQljb21taXRfYXJndlszXSA9IG9sZF9zaGExX2hleDsKKwkJCWNvbW1pdF9hcmdjKys7CisJCX0KKwkJaW5pdF9yZXZpc2lvbnMoJnJldnMsIHNldHVwX2dpdF9kaXJlY3RvcnkoKSk7CisJCXNldHVwX3JldmlzaW9ucyhjb21taXRfYXJnYywgY29tbWl0X2FyZ3YsICZyZXZzLCBOVUxMKTsKKwkJZnJlZShuZXdfc2hhMV9oZXgpOworCQlpZiAob2xkX3NoYTFfaGV4KSB7CisJCQlmcmVlKG9sZF9zaGExX2hleCk7CisJCQljb21taXRfYXJndlsxXSA9IE5VTEw7CisJCX0KKworCQkvKiBHZW5lcmF0ZSBhIGxpc3Qgb2Ygb2JqZWN0cyB0aGF0IG5lZWQgdG8gYmUgcHVzaGVkICovCisJCXB1c2hpbmcgPSAwOworCQlwcmVwYXJlX3JldmlzaW9uX3dhbGsoJnJldnMpOworCQltYXJrX2VkZ2VzX3VuaW50ZXJlc3RpbmcocmV2cy5jb21taXRzKTsKKwkJb2JqZWN0c190b19zZW5kID0gZ2V0X2RlbHRhKCZyZXZzLCByZWZfbG9jayk7CisJCWZpbmlzaF9hbGxfYWN0aXZlX3Nsb3RzKCk7CisKKwkJLyogUHVzaCBtaXNzaW5nIG9iamVjdHMgdG8gcmVtb3RlLCB0aGlzIHdvdWxkIGJlIGEKKwkJICAgY29udmVuaWVudCB0aW1lIHRvIHBhY2sgdGhlbSBmaXJzdCBpZiBhcHByb3ByaWF0ZS4gKi8KKwkJcHVzaGluZyA9IDE7CisJCWlmIChvYmplY3RzX3RvX3NlbmQpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgICBzZW5kaW5nICVkIG9iamVjdHNcbiIsCisJCQkJb2JqZWN0c190b19zZW5kKTsKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCQlmaWxsX2FjdGl2ZV9zbG90cygpOworI2VuZGlmCisJCWZpbmlzaF9hbGxfYWN0aXZlX3Nsb3RzKCk7CisKKwkJLyogVXBkYXRlIHRoZSByZW1vdGUgYnJhbmNoIGlmIGFsbCB3ZW50IHdlbGwgKi8KKwkJaWYgKGFib3J0ZWQgfHwgIXVwZGF0ZV9yZW1vdGUocmVmLT5uZXdfc2hhMSwgcmVmX2xvY2spKSB7CisJCQlyYyA9IDE7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJdW5sb2NrOgorCQlpZiAoIXJjKQorCQkJZnByaW50ZihzdGRlcnIsICIgICAgZG9uZVxuIik7CisJCXVubG9ja19yZW1vdGUocmVmX2xvY2spOworCQljaGVja19sb2NrcygpOworCX0KKworCS8qIFVwZGF0ZSByZW1vdGUgc2VydmVyIGluZm8gaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAocmVtb3RlLT5oYXNfaW5mb19yZWZzICYmIG5ld19yZWZzKSB7CisJCWlmIChpbmZvX3JlZl9sb2NrICYmIHJlbW90ZS0+Y2FuX3VwZGF0ZV9pbmZvX3JlZnMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVXBkYXRpbmcgcmVtb3RlIHNlcnZlciBpbmZvXG4iKTsKKwkJCXVwZGF0ZV9yZW1vdGVfaW5mb19yZWZzKGluZm9fcmVmX2xvY2spOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gdXBkYXRlIHNlcnZlciBpbmZvXG4iKTsKKwkJfQorCX0KKwlpZiAoaW5mb19yZWZfbG9jaykKKwkJdW5sb2NrX3JlbW90ZShpbmZvX3JlZl9sb2NrKTsKKworIGNsZWFudXA6CisJZnJlZShyZW1vdGUpOworCisJY3VybF9zbGlzdF9mcmVlX2FsbChub19wcmFnbWFfaGVhZGVyKTsKKwljdXJsX3NsaXN0X2ZyZWVfYWxsKGRlZmF1bHRfaGVhZGVycyk7CisKKwlodHRwX2NsZWFudXAoKTsKKworCXJlcXVlc3QgPSByZXF1ZXN0X3F1ZXVlX2hlYWQ7CisJd2hpbGUgKHJlcXVlc3QgIT0gTlVMTCkgeworCQluZXh0X3JlcXVlc3QgPSByZXF1ZXN0LT5uZXh0OworCQlyZWxlYXNlX3JlcXVlc3QocmVxdWVzdCk7CisJCXJlcXVlc3QgPSBuZXh0X3JlcXVlc3Q7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvaHR0cC5jIGIvaHR0cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTkzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9odHRwLmMKQEAgLTAsMCArMSw0ODQgQEAKKyNpbmNsdWRlICJodHRwLmgiCisKK2ludCBkYXRhX3JlY2VpdmVkOworaW50IGFjdGl2ZV9yZXF1ZXN0cyA9IDA7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQoraW50IG1heF9yZXF1ZXN0cyA9IC0xOworQ1VSTE0gKmN1cmxtOworI2VuZGlmCisjaWZuZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKK0NVUkwgKmN1cmxfZGVmYXVsdDsKKyNlbmRpZgorY2hhciBjdXJsX2Vycm9yc3RyW0NVUkxfRVJST1JfU0laRV07CisKK2ludCBjdXJsX3NzbF92ZXJpZnkgPSAtMTsKK2NoYXIgKnNzbF9jZXJ0ID0gTlVMTDsKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCitjaGFyICpzc2xfa2V5ID0gTlVMTDsKKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDgKK2NoYXIgKnNzbF9jYXBhdGggPSBOVUxMOworI2VuZGlmCitjaGFyICpzc2xfY2FpbmZvID0gTlVMTDsKK2xvbmcgY3VybF9sb3dfc3BlZWRfbGltaXQgPSAtMTsKK2xvbmcgY3VybF9sb3dfc3BlZWRfdGltZSA9IC0xOworCitzdHJ1Y3QgY3VybF9zbGlzdCAqcHJhZ21hX2hlYWRlcjsKKworc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKmFjdGl2ZV9xdWV1ZV9oZWFkID0gTlVMTDsKKworc2l6ZV90IGZyZWFkX2J1ZmZlcih2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLCBzaXplX3Qgbm1lbWIsCisJCQkgICBzdHJ1Y3QgYnVmZmVyICpidWZmZXIpCit7CisJc2l6ZV90IHNpemUgPSBlbHRzaXplICogbm1lbWI7CisJaWYgKHNpemUgPiBidWZmZXItPnNpemUgLSBidWZmZXItPnBvc24pCisJCXNpemUgPSBidWZmZXItPnNpemUgLSBidWZmZXItPnBvc247CisJbWVtY3B5KHB0ciwgKGNoYXIgKikgYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPnBvc24sIHNpemUpOworCWJ1ZmZlci0+cG9zbiArPSBzaXplOworCXJldHVybiBzaXplOworfQorCitzaXplX3QgZndyaXRlX2J1ZmZlcihjb25zdCB2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLAorCQkJICAgIHNpemVfdCBubWVtYiwgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKQoreworCXNpemVfdCBzaXplID0gZWx0c2l6ZSAqIG5tZW1iOworCWlmIChzaXplID4gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT5wb3NuKSB7CisJCWJ1ZmZlci0+c2l6ZSA9IGJ1ZmZlci0+c2l6ZSAqIDMgLyAyOworCQlpZiAoYnVmZmVyLT5zaXplIDwgYnVmZmVyLT5wb3NuICsgc2l6ZSkKKwkJCWJ1ZmZlci0+c2l6ZSA9IGJ1ZmZlci0+cG9zbiArIHNpemU7CisJCWJ1ZmZlci0+YnVmZmVyID0geHJlYWxsb2MoYnVmZmVyLT5idWZmZXIsIGJ1ZmZlci0+c2l6ZSk7CisJfQorCW1lbWNweSgoY2hhciAqKSBidWZmZXItPmJ1ZmZlciArIGJ1ZmZlci0+cG9zbiwgcHRyLCBzaXplKTsKKwlidWZmZXItPnBvc24gKz0gc2l6ZTsKKwlkYXRhX3JlY2VpdmVkKys7CisJcmV0dXJuIHNpemU7Cit9CisKK3NpemVfdCBmd3JpdGVfbnVsbChjb25zdCB2b2lkICpwdHIsIHNpemVfdCBlbHRzaXplLAorCQkJICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcikKK3sKKwlkYXRhX3JlY2VpdmVkKys7CisJcmV0dXJuIGVsdHNpemUgKiBubWVtYjsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCitzdGF0aWMgdm9pZCBwcm9jZXNzX2N1cmxfbWVzc2FnZXModm9pZCkKK3sKKwlpbnQgbnVtX21lc3NhZ2VzOworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90OworCUNVUkxNc2cgKmN1cmxfbWVzc2FnZSA9IGN1cmxfbXVsdGlfaW5mb19yZWFkKGN1cmxtLCAmbnVtX21lc3NhZ2VzKTsKKworCXdoaWxlIChjdXJsX21lc3NhZ2UgIT0gTlVMTCkgeworCQlpZiAoY3VybF9tZXNzYWdlLT5tc2cgPT0gQ1VSTE1TR19ET05FKSB7CisJCQlpbnQgY3VybF9yZXN1bHQgPSBjdXJsX21lc3NhZ2UtPmRhdGEucmVzdWx0OworCQkJc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCQkJd2hpbGUgKHNsb3QgIT0gTlVMTCAmJgorCQkJICAgICAgIHNsb3QtPmN1cmwgIT0gY3VybF9tZXNzYWdlLT5lYXN5X2hhbmRsZSkKKwkJCQlzbG90ID0gc2xvdC0+bmV4dDsKKwkJCWlmIChzbG90ICE9IE5VTEwpIHsKKwkJCQljdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoY3VybG0sIHNsb3QtPmN1cmwpOworCQkJCXNsb3QtPmN1cmxfcmVzdWx0ID0gY3VybF9yZXN1bHQ7CisJCQkJZmluaXNoX2FjdGl2ZV9zbG90KHNsb3QpOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlJlY2VpdmVkIERPTkUgbWVzc2FnZSBmb3IgdW5rbm93biByZXF1ZXN0IVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gQ1VSTCBtZXNzYWdlIHJlY2VpdmVkOiAlZFxuIiwKKwkJCQkoaW50KWN1cmxfbWVzc2FnZS0+bXNnKTsKKwkJfQorCQljdXJsX21lc3NhZ2UgPSBjdXJsX211bHRpX2luZm9fcmVhZChjdXJsbSwgJm51bV9tZXNzYWdlcyk7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaHR0cF9vcHRpb25zKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKCFzdHJjbXAoImh0dHAuc3NsdmVyaWZ5IiwgdmFyKSkgeworCQlpZiAoY3VybF9zc2xfdmVyaWZ5ID09IC0xKSB7CisJCQljdXJsX3NzbF92ZXJpZnkgPSBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFzdHJjbXAoImh0dHAuc3NsY2VydCIsIHZhcikpIHsKKwkJaWYgKHNzbF9jZXJ0ID09IE5VTEwpIHsKKwkJCXNzbF9jZXJ0ID0geG1hbGxvYyhzdHJsZW4odmFsdWUpKzEpOworCQkJc3RyY3B5KHNzbF9jZXJ0LCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDIKKwlpZiAoIXN0cmNtcCgiaHR0cC5zc2xrZXkiLCB2YXIpKSB7CisJCWlmIChzc2xfa2V5ID09IE5VTEwpIHsKKwkJCXNzbF9rZXkgPSB4bWFsbG9jKHN0cmxlbih2YWx1ZSkrMSk7CisJCQlzdHJjcHkoc3NsX2tleSwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDgKKwlpZiAoIXN0cmNtcCgiaHR0cC5zc2xjYXBhdGgiLCB2YXIpKSB7CisJCWlmIChzc2xfY2FwYXRoID09IE5VTEwpIHsKKwkJCXNzbF9jYXBhdGggPSB4bWFsbG9jKHN0cmxlbih2YWx1ZSkrMSk7CisJCQlzdHJjcHkoc3NsX2NhcGF0aCwgdmFsdWUpOworCQl9CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmICghc3RyY21wKCJodHRwLnNzbGNhaW5mbyIsIHZhcikpIHsKKwkJaWYgKHNzbF9jYWluZm8gPT0gTlVMTCkgeworCQkJc3NsX2NhaW5mbyA9IHhtYWxsb2Moc3RybGVuKHZhbHVlKSsxKTsKKwkJCXN0cmNweShzc2xfY2FpbmZvLCB2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkJCisJaWYgKCFzdHJjbXAoImh0dHAubWF4cmVxdWVzdHMiLCB2YXIpKSB7CisJCWlmIChtYXhfcmVxdWVzdHMgPT0gLTEpCisJCQltYXhfcmVxdWVzdHMgPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlpZiAoIXN0cmNtcCgiaHR0cC5sb3dzcGVlZGxpbWl0IiwgdmFyKSkgeworCQlpZiAoY3VybF9sb3dfc3BlZWRfbGltaXQgPT0gLTEpCisJCQljdXJsX2xvd19zcGVlZF9saW1pdCA9IChsb25nKWdpdF9jb25maWdfaW50KHZhciwgdmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAoImh0dHAubG93c3BlZWR0aW1lIiwgdmFyKSkgeworCQlpZiAoY3VybF9sb3dfc3BlZWRfdGltZSA9PSAtMSkKKwkJCWN1cmxfbG93X3NwZWVkX3RpbWUgPSAobG9uZylnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmFsbCBiYWNrIG9uIHRoZSBkZWZhdWx0IG9uZXMgKi8KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitzdGF0aWMgQ1VSTCogZ2V0X2N1cmxfaGFuZGxlKHZvaWQpCit7CisJQ1VSTCogcmVzdWx0ID0gY3VybF9lYXN5X2luaXQoKTsKKworCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCBjdXJsX3NzbF92ZXJpZnkpOworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDcKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9ORVRSQywgQ1VSTF9ORVRSQ19PUFRJT05BTCk7CisjZW5kaWYKKworCWlmIChzc2xfY2VydCAhPSBOVUxMKQorCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9TU0xDRVJULCBzc2xfY2VydCk7CisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwMgorCWlmIChzc2xfa2V5ICE9IE5VTEwpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX1NTTEtFWSwgc3NsX2tleSk7CisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTA4CisJaWYgKHNzbF9jYXBhdGggIT0gTlVMTCkKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfQ0FQQVRILCBzc2xfY2FwYXRoKTsKKyNlbmRpZgorCWlmIChzc2xfY2FpbmZvICE9IE5VTEwpCisJCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0NBSU5GTywgc3NsX2NhaW5mbyk7CisJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfRkFJTE9ORVJST1IsIDEpOworCisJaWYgKGN1cmxfbG93X3NwZWVkX2xpbWl0ID4gMCAmJiBjdXJsX2xvd19zcGVlZF90aW1lID4gMCkgeworCQljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9MT1dfU1BFRURfTElNSVQsCisJCQkJIGN1cmxfbG93X3NwZWVkX2xpbWl0KTsKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfTE9XX1NQRUVEX1RJTUUsCisJCQkJIGN1cmxfbG93X3NwZWVkX3RpbWUpOworCX0KKworCWN1cmxfZWFzeV9zZXRvcHQocmVzdWx0LCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCAxKTsKKworCWlmIChnZXRlbnYoIkdJVF9DVVJMX1ZFUkJPU0UiKSkKKwkJY3VybF9lYXN5X3NldG9wdChyZXN1bHQsIENVUkxPUFRfVkVSQk9TRSwgMSk7CisKKwljdXJsX2Vhc3lfc2V0b3B0KHJlc3VsdCwgQ1VSTE9QVF9VU0VSQUdFTlQsIEdJVF9VU0VSX0FHRU5UKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgaHR0cF9pbml0KHZvaWQpCit7CisJY2hhciAqbG93X3NwZWVkX2xpbWl0OworCWNoYXIgKmxvd19zcGVlZF90aW1lOworCisJY3VybF9nbG9iYWxfaW5pdChDVVJMX0dMT0JBTF9BTEwpOworCisJcHJhZ21hX2hlYWRlciA9IGN1cmxfc2xpc3RfYXBwZW5kKHByYWdtYV9oZWFkZXIsICJQcmFnbWE6IG5vLWNhY2hlIik7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCXsKKwkJY2hhciAqaHR0cF9tYXhfcmVxdWVzdHMgPSBnZXRlbnYoIkdJVF9IVFRQX01BWF9SRVFVRVNUUyIpOworCQlpZiAoaHR0cF9tYXhfcmVxdWVzdHMgIT0gTlVMTCkKKwkJCW1heF9yZXF1ZXN0cyA9IGF0b2koaHR0cF9tYXhfcmVxdWVzdHMpOworCX0KKworCWN1cmxtID0gY3VybF9tdWx0aV9pbml0KCk7CisJaWYgKGN1cmxtID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyBjdXJsIG11bHRpIGhhbmRsZS5cbiIpOworCQlleGl0KDEpOworCX0KKyNlbmRpZgorCisJaWYgKGdldGVudigiR0lUX1NTTF9OT19WRVJJRlkiKSkKKwkJY3VybF9zc2xfdmVyaWZ5ID0gMDsKKworCXNzbF9jZXJ0ID0gZ2V0ZW52KCJHSVRfU1NMX0NFUlQiKTsKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID49IDB4MDcwOTAyCisJc3NsX2tleSA9IGdldGVudigiR0lUX1NTTF9LRVkiKTsKKyNlbmRpZgorI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDgKKwlzc2xfY2FwYXRoID0gZ2V0ZW52KCJHSVRfU1NMX0NBUEFUSCIpOworI2VuZGlmCisJc3NsX2NhaW5mbyA9IGdldGVudigiR0lUX1NTTF9DQUlORk8iKTsKKworCWxvd19zcGVlZF9saW1pdCA9IGdldGVudigiR0lUX0hUVFBfTE9XX1NQRUVEX0xJTUlUIik7CisJaWYgKGxvd19zcGVlZF9saW1pdCAhPSBOVUxMKQorCQljdXJsX2xvd19zcGVlZF9saW1pdCA9IHN0cnRvbChsb3dfc3BlZWRfbGltaXQsIE5VTEwsIDEwKTsKKwlsb3dfc3BlZWRfdGltZSA9IGdldGVudigiR0lUX0hUVFBfTE9XX1NQRUVEX1RJTUUiKTsKKwlpZiAobG93X3NwZWVkX3RpbWUgIT0gTlVMTCkKKwkJY3VybF9sb3dfc3BlZWRfdGltZSA9IHN0cnRvbChsb3dfc3BlZWRfdGltZSwgTlVMTCwgMTApOworCisJZ2l0X2NvbmZpZyhodHRwX29wdGlvbnMpOworCisJaWYgKGN1cmxfc3NsX3ZlcmlmeSA9PSAtMSkKKwkJY3VybF9zc2xfdmVyaWZ5ID0gMTsKKworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJaWYgKG1heF9yZXF1ZXN0cyA8IDEpCisJCW1heF9yZXF1ZXN0cyA9IERFRkFVTFRfTUFYX1JFUVVFU1RTOworI2VuZGlmCisKKyNpZm5kZWYgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorCWN1cmxfZGVmYXVsdCA9IGdldF9jdXJsX2hhbmRsZSgpOworI2VuZGlmCit9CisKK3ZvaWQgaHR0cF9jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWNoYXIgKndhaXRfdXJsOworI2VuZGlmCisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMKSB7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwkJaWYgKHNsb3QtPmluX3VzZSkgeworCQkJY3VybF9lYXN5X2dldGluZm8oc2xvdC0+Y3VybCwKKwkJCQkJICBDVVJMSU5GT19FRkZFQ1RJVkVfVVJMLAorCQkJCQkgICZ3YWl0X3VybCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIldhaXRpbmcgZm9yICVzXG4iLCB3YWl0X3VybCk7CisJCQlydW5fYWN0aXZlX3Nsb3Qoc2xvdCk7CisJCX0KKyNlbmRpZgorCQlpZiAoc2xvdC0+Y3VybCAhPSBOVUxMKQorCQkJY3VybF9lYXN5X2NsZWFudXAoc2xvdC0+Y3VybCk7CisJCXNsb3QgPSBzbG90LT5uZXh0OworCX0KKworI2lmbmRlZiBOT19DVVJMX0VBU1lfRFVQSEFORExFCisJY3VybF9lYXN5X2NsZWFudXAoY3VybF9kZWZhdWx0KTsKKyNlbmRpZgorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwljdXJsX211bHRpX2NsZWFudXAoY3VybG0pOworI2VuZGlmCisJY3VybF9nbG9iYWxfY2xlYW51cCgpOworCisJY3VybF9zbGlzdF9mcmVlX2FsbChwcmFnbWFfaGVhZGVyKTsKK30KKworc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKmdldF9hY3RpdmVfc2xvdCh2b2lkKQoreworCXN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90ID0gYWN0aXZlX3F1ZXVlX2hlYWQ7CisJc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKm5ld3Nsb3Q7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWludCBudW1fdHJhbnNmZXJzOworCisJLyogV2FpdCBmb3IgYSBzbG90IHRvIG9wZW4gdXAgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwgKi8KKwl3aGlsZSAoYWN0aXZlX3JlcXVlc3RzID49IG1heF9yZXF1ZXN0cykgeworCQljdXJsX211bHRpX3BlcmZvcm0oY3VybG0sICZudW1fdHJhbnNmZXJzKTsKKwkJaWYgKG51bV90cmFuc2ZlcnMgPCBhY3RpdmVfcmVxdWVzdHMpIHsKKwkJCXByb2Nlc3NfY3VybF9tZXNzYWdlcygpOworCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoc2xvdCAhPSBOVUxMICYmIHNsb3QtPmluX3VzZSkgeworCQlzbG90ID0gc2xvdC0+bmV4dDsKKwl9CisJaWYgKHNsb3QgPT0gTlVMTCkgeworCQluZXdzbG90ID0geG1hbGxvYyhzaXplb2YoKm5ld3Nsb3QpKTsKKwkJbmV3c2xvdC0+Y3VybCA9IE5VTEw7CisJCW5ld3Nsb3QtPmluX3VzZSA9IDA7CisJCW5ld3Nsb3QtPm5leHQgPSBOVUxMOworCisJCXNsb3QgPSBhY3RpdmVfcXVldWVfaGVhZDsKKwkJaWYgKHNsb3QgPT0gTlVMTCkgeworCQkJYWN0aXZlX3F1ZXVlX2hlYWQgPSBuZXdzbG90OworCQl9IGVsc2UgeworCQkJd2hpbGUgKHNsb3QtPm5leHQgIT0gTlVMTCkgeworCQkJCXNsb3QgPSBzbG90LT5uZXh0OworCQkJfQorCQkJc2xvdC0+bmV4dCA9IG5ld3Nsb3Q7CisJCX0KKwkJc2xvdCA9IG5ld3Nsb3Q7CisJfQorCisJaWYgKHNsb3QtPmN1cmwgPT0gTlVMTCkgeworI2lmZGVmIE5PX0NVUkxfRUFTWV9EVVBIQU5ETEUKKwkJc2xvdC0+Y3VybCA9IGdldF9jdXJsX2hhbmRsZSgpOworI2Vsc2UKKwkJc2xvdC0+Y3VybCA9IGN1cmxfZWFzeV9kdXBoYW5kbGUoY3VybF9kZWZhdWx0KTsKKyNlbmRpZgorCX0KKworCWFjdGl2ZV9yZXF1ZXN0cysrOworCXNsb3QtPmluX3VzZSA9IDE7CisJc2xvdC0+bG9jYWwgPSBOVUxMOworCXNsb3QtPnJlc3VsdHMgPSBOVUxMOworCXNsb3QtPmZpbmlzaGVkID0gTlVMTDsKKwlzbG90LT5jYWxsYmFja19kYXRhID0gTlVMTDsKKwlzbG90LT5jYWxsYmFja19mdW5jID0gTlVMTDsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEhFQURFUiwgTlVMTCk7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0hUVFBIRUFERVIsIHByYWdtYV9oZWFkZXIpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9FUlJPUkJVRkZFUiwgY3VybF9lcnJvcnN0cik7CisJY3VybF9lYXN5X3NldG9wdChzbG90LT5jdXJsLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9SRUFERlVOQ1RJT04sIE5VTEwpOworCWN1cmxfZWFzeV9zZXRvcHQoc2xvdC0+Y3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBOVUxMKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfVVBMT0FELCAwKTsKKwljdXJsX2Vhc3lfc2V0b3B0KHNsb3QtPmN1cmwsIENVUkxPUFRfSFRUUEdFVCwgMSk7CisKKwlyZXR1cm4gc2xvdDsKK30KKworaW50IHN0YXJ0X2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KQoreworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJQ1VSTE1jb2RlIGN1cmxtX3Jlc3VsdCA9IGN1cmxfbXVsdGlfYWRkX2hhbmRsZShjdXJsbSwgc2xvdC0+Y3VybCk7CisKKwlpZiAoY3VybG1fcmVzdWx0ICE9IENVUkxNX09LICYmCisJICAgIGN1cmxtX3Jlc3VsdCAhPSBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0pIHsKKwkJYWN0aXZlX3JlcXVlc3RzLS07CisJCXNsb3QtPmluX3VzZSA9IDA7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCXJldHVybiAxOworfQorCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK3ZvaWQgc3RlcF9hY3RpdmVfc2xvdHModm9pZCkKK3sKKwlpbnQgbnVtX3RyYW5zZmVyczsKKwlDVVJMTWNvZGUgY3VybG1fcmVzdWx0OworCisJZG8geworCQljdXJsbV9yZXN1bHQgPSBjdXJsX211bHRpX3BlcmZvcm0oY3VybG0sICZudW1fdHJhbnNmZXJzKTsKKwl9IHdoaWxlIChjdXJsbV9yZXN1bHQgPT0gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNKTsKKwlpZiAobnVtX3RyYW5zZmVycyA8IGFjdGl2ZV9yZXF1ZXN0cykgeworCQlwcm9jZXNzX2N1cmxfbWVzc2FnZXMoKTsKKwkJZmlsbF9hY3RpdmVfc2xvdHMoKTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBydW5fYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpCit7CisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKKwlsb25nIGxhc3RfcG9zID0gMDsKKwlsb25nIGN1cnJlbnRfcG9zOworCWZkX3NldCByZWFkZmRzOworCWZkX3NldCB3cml0ZWZkczsKKwlmZF9zZXQgZXhjZmRzOworCWludCBtYXhfZmQ7CisJc3RydWN0IHRpbWV2YWwgc2VsZWN0X3RpbWVvdXQ7CisJaW50IGZpbmlzaGVkID0gMDsKKworCXNsb3QtPmZpbmlzaGVkID0gJmZpbmlzaGVkOworCXdoaWxlICghZmluaXNoZWQpIHsKKwkJZGF0YV9yZWNlaXZlZCA9IDA7CisJCXN0ZXBfYWN0aXZlX3Nsb3RzKCk7CisKKwkJaWYgKCFkYXRhX3JlY2VpdmVkICYmIHNsb3QtPmxvY2FsICE9IE5VTEwpIHsKKwkJCWN1cnJlbnRfcG9zID0gZnRlbGwoc2xvdC0+bG9jYWwpOworCQkJaWYgKGN1cnJlbnRfcG9zID4gbGFzdF9wb3MpCisJCQkJZGF0YV9yZWNlaXZlZCsrOworCQkJbGFzdF9wb3MgPSBjdXJyZW50X3BvczsKKwkJfQorCisJCWlmIChzbG90LT5pbl91c2UgJiYgIWRhdGFfcmVjZWl2ZWQpIHsKKwkJCW1heF9mZCA9IDA7CisJCQlGRF9aRVJPKCZyZWFkZmRzKTsKKwkJCUZEX1pFUk8oJndyaXRlZmRzKTsKKwkJCUZEX1pFUk8oJmV4Y2Zkcyk7CisJCQlzZWxlY3RfdGltZW91dC50dl9zZWMgPSAwOworCQkJc2VsZWN0X3RpbWVvdXQudHZfdXNlYyA9IDUwMDAwOworCQkJc2VsZWN0KG1heF9mZCwgJnJlYWRmZHMsICZ3cml0ZWZkcywKKwkJCSAgICAgICAmZXhjZmRzLCAmc2VsZWN0X3RpbWVvdXQpOworCQl9CisJfQorI2Vsc2UKKwl3aGlsZSAoc2xvdC0+aW5fdXNlKSB7CisJCXNsb3QtPmN1cmxfcmVzdWx0ID0gY3VybF9lYXN5X3BlcmZvcm0oc2xvdC0+Y3VybCk7CisJCWZpbmlzaF9hY3RpdmVfc2xvdChzbG90KTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgY2xvc2Vkb3duX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KQoreworICAgICAgICBhY3RpdmVfcmVxdWVzdHMtLTsKKyAgICAgICAgc2xvdC0+aW5fdXNlID0gMDsKK30KKwordm9pZCByZWxlYXNlX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KQoreworCWNsb3NlZG93bl9hY3RpdmVfc2xvdChzbG90KTsKKwlpZiAoc2xvdC0+Y3VybCkgeworI2lmZGVmIFVTRV9DVVJMX01VTFRJCisJCWN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZShjdXJsbSwgc2xvdC0+Y3VybCk7CisjZW5kaWYKKwkJY3VybF9lYXN5X2NsZWFudXAoc2xvdC0+Y3VybCk7CisJCXNsb3QtPmN1cmwgPSBOVUxMOworCX0KKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorCWZpbGxfYWN0aXZlX3Nsb3RzKCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZmluaXNoX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KQoreworCWNsb3NlZG93bl9hY3RpdmVfc2xvdChzbG90KTsKKyAgICAgICAgY3VybF9lYXN5X2dldGluZm8oc2xvdC0+Y3VybCwgQ1VSTElORk9fSFRUUF9DT0RFLCAmc2xvdC0+aHR0cF9jb2RlKTsKKworCWlmIChzbG90LT5maW5pc2hlZCAhPSBOVUxMKQorCQkoKnNsb3QtPmZpbmlzaGVkKSA9IDE7CisKKwkvKiBTdG9yZSBzbG90IHJlc3VsdHMgc28gdGhleSBjYW4gYmUgcmVhZCBhZnRlciB0aGUgc2xvdCBpcyByZXVzZWQgKi8KKwlpZiAoc2xvdC0+cmVzdWx0cyAhPSBOVUxMKSB7CisJCXNsb3QtPnJlc3VsdHMtPmN1cmxfcmVzdWx0ID0gc2xvdC0+Y3VybF9yZXN1bHQ7CisJCXNsb3QtPnJlc3VsdHMtPmh0dHBfY29kZSA9IHNsb3QtPmh0dHBfY29kZTsKKwl9CisKKyAgICAgICAgLyogUnVuIGNhbGxiYWNrIGlmIGFwcHJvcHJpYXRlICovCisgICAgICAgIGlmIChzbG90LT5jYWxsYmFja19mdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzbG90LT5jYWxsYmFja19mdW5jKHNsb3QtPmNhbGxiYWNrX2RhdGEpOworICAgICAgICB9Cit9CisKK3ZvaWQgZmluaXNoX2FsbF9hY3RpdmVfc2xvdHModm9pZCkKK3sKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCisJd2hpbGUgKHNsb3QgIT0gTlVMTCkKKwkJaWYgKHNsb3QtPmluX3VzZSkgeworCQkJcnVuX2FjdGl2ZV9zbG90KHNsb3QpOworCQkJc2xvdCA9IGFjdGl2ZV9xdWV1ZV9oZWFkOworCQl9IGVsc2UgeworCQkJc2xvdCA9IHNsb3QtPm5leHQ7CisJCX0KK30KZGlmZiAtLWdpdCBhL2h0dHAuaCBiL2h0dHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2ExNmFjCi0tLSAvZGV2L251bGwKKysrIGIvaHR0cC5oCkBAIC0wLDAgKzEsMTA0IEBACisjaWZuZGVmIEhUVFBfSAorI2RlZmluZSBIVFRQX0gKKworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNpbmNsdWRlIDxjdXJsL2N1cmwuaD4KKyNpbmNsdWRlIDxjdXJsL2Vhc3kuaD4KKworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDgKKyNkZWZpbmUgVVNFX0NVUkxfTVVMVEkKKyNkZWZpbmUgREVGQVVMVF9NQVhfUkVRVUVTVFMgNQorI2VuZGlmCisKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNIDwgMHgwNzA3MDQKKyNkZWZpbmUgY3VybF9nbG9iYWxfY2xlYW51cCgpIGRvIHsgLyogbm90aGluZyAqLyB9IHdoaWxlKDApCisjZW5kaWYKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNIDwgMHgwNzA4MDAKKyNkZWZpbmUgY3VybF9nbG9iYWxfaW5pdChhKSBkbyB7IC8qIG5vdGhpbmcgKi8gfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNIDwgMHgwNzBjMDQKKyNkZWZpbmUgTk9fQ1VSTF9FQVNZX0RVUEhBTkRMRQorI2VuZGlmCisKK3N0cnVjdCBzbG90X3Jlc3VsdHMKK3sKKwlDVVJMY29kZSBjdXJsX3Jlc3VsdDsKKwlsb25nIGh0dHBfY29kZTsKK307CisKK3N0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90Cit7CisJQ1VSTCAqY3VybDsKKwlGSUxFICpsb2NhbDsKKwlpbnQgaW5fdXNlOworCUNVUkxjb2RlIGN1cmxfcmVzdWx0OworCWxvbmcgaHR0cF9jb2RlOworCWludCAqZmluaXNoZWQ7CisJc3RydWN0IHNsb3RfcmVzdWx0cyAqcmVzdWx0czsKKwl2b2lkICpjYWxsYmFja19kYXRhOworCXZvaWQgKCpjYWxsYmFja19mdW5jKSh2b2lkICpkYXRhKTsKKwlzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqbmV4dDsKK307CisKK3N0cnVjdCBidWZmZXIKK3sKKyAgICAgICAgc2l6ZV90IHBvc247CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICB2b2lkICpidWZmZXI7Cit9OworCisvKiBDdXJsIHJlcXVlc3QgcmVhZC93cml0ZSBjYWxsYmFja3MgKi8KK2V4dGVybiBzaXplX3QgZnJlYWRfYnVmZmVyKHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsIHNpemVfdCBubWVtYiwKKwkJCSAgIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcik7CitleHRlcm4gc2l6ZV90IGZ3cml0ZV9idWZmZXIoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgZWx0c2l6ZSwKKwkJCSAgICBzaXplX3Qgbm1lbWIsIHN0cnVjdCBidWZmZXIgKmJ1ZmZlcik7CitleHRlcm4gc2l6ZV90IGZ3cml0ZV9udWxsKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IGVsdHNpemUsCisJCQkgIHNpemVfdCBubWVtYiwgc3RydWN0IGJ1ZmZlciAqYnVmZmVyKTsKKworLyogU2xvdCBsaWZlY3ljbGUgZnVuY3Rpb25zICovCitleHRlcm4gc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKmdldF9hY3RpdmVfc2xvdCh2b2lkKTsKK2V4dGVybiBpbnQgc3RhcnRfYWN0aXZlX3Nsb3Qoc3RydWN0IGFjdGl2ZV9yZXF1ZXN0X3Nsb3QgKnNsb3QpOworZXh0ZXJuIHZvaWQgcnVuX2FjdGl2ZV9zbG90KHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICpzbG90KTsKK2V4dGVybiB2b2lkIGZpbmlzaF9hbGxfYWN0aXZlX3Nsb3RzKHZvaWQpOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9hY3RpdmVfc2xvdChzdHJ1Y3QgYWN0aXZlX3JlcXVlc3Rfc2xvdCAqc2xvdCk7CisKKyNpZmRlZiBVU0VfQ1VSTF9NVUxUSQorZXh0ZXJuIHZvaWQgZmlsbF9hY3RpdmVfc2xvdHModm9pZCk7CitleHRlcm4gdm9pZCBzdGVwX2FjdGl2ZV9zbG90cyh2b2lkKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBodHRwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBodHRwX2NsZWFudXAodm9pZCk7CisKK2V4dGVybiBpbnQgZGF0YV9yZWNlaXZlZDsKK2V4dGVybiBpbnQgYWN0aXZlX3JlcXVlc3RzOworCisjaWZkZWYgVVNFX0NVUkxfTVVMVEkKK2V4dGVybiBpbnQgbWF4X3JlcXVlc3RzOworZXh0ZXJuIENVUkxNICpjdXJsbTsKKyNlbmRpZgorI2lmbmRlZiBOT19DVVJMX0VBU1lfRFVQSEFORExFCitleHRlcm4gQ1VSTCAqY3VybF9kZWZhdWx0OworI2VuZGlmCitleHRlcm4gY2hhciBjdXJsX2Vycm9yc3RyW0NVUkxfRVJST1JfU0laRV07CisKK2V4dGVybiBpbnQgY3VybF9zc2xfdmVyaWZ5OworZXh0ZXJuIGNoYXIgKnNzbF9jZXJ0OworI2lmIExJQkNVUkxfVkVSU0lPTl9OVU0gPj0gMHgwNzA5MDIKK2V4dGVybiBjaGFyICpzc2xfa2V5OworI2VuZGlmCisjaWYgTElCQ1VSTF9WRVJTSU9OX05VTSA+PSAweDA3MDkwOAorZXh0ZXJuIGNoYXIgKnNzbF9jYXBhdGg7CisjZW5kaWYKK2V4dGVybiBjaGFyICpzc2xfY2FpbmZvOworZXh0ZXJuIGxvbmcgY3VybF9sb3dfc3BlZWRfbGltaXQ7CitleHRlcm4gbG9uZyBjdXJsX2xvd19zcGVlZF90aW1lOworCitleHRlcm4gc3RydWN0IGN1cmxfc2xpc3QgKnByYWdtYV9oZWFkZXI7CitleHRlcm4gc3RydWN0IGN1cmxfc2xpc3QgKm5vX3JhbmdlX2hlYWRlcjsKKworZXh0ZXJuIHN0cnVjdCBhY3RpdmVfcmVxdWVzdF9zbG90ICphY3RpdmVfcXVldWVfaGVhZDsKKworI2VuZGlmIC8qIEhUVFBfSCAqLwpkaWZmIC0tZ2l0IGEvaWRlbnQuYyBiL2lkZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlYzk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2lkZW50LmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBpZGVudC5jCisgKgorICogY3JlYXRlIGdpdCBpZGVudGlmaWVyIGxpbmVzIG9mIHRoZSBmb3JtICJuYW1lIDxlbWFpbD4gZGF0ZSIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTGludXMgVG9ydmFsZHMKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCitzdGF0aWMgY2hhciBnaXRfZGVmYXVsdF9kYXRlWzUwXTsKKworc3RhdGljIHZvaWQgY29weV9nZWNvcyhzdHJ1Y3QgcGFzc3dkICp3LCBjaGFyICpuYW1lLCBpbnQgc3opCit7CisJY2hhciAqc3JjLCAqZHN0OworCWludCBsZW4sIG5sZW47CisKKwlubGVuID0gc3RybGVuKHctPnB3X25hbWUpOworCisJLyogVHJhZGl0aW9uYWxseSBHRUNPUyBmaWVsZCBoYWQgb2ZmaWNlIHBob25lIG51bWJlcnMgZXRjLCBzZXBhcmF0ZWQKKwkgKiB3aXRoIGNvbW1hcy4gIEFsc28gJiBzdGFuZHMgZm9yIGNhcGl0YWxpemVkIGZvcm0gb2YgdGhlIGxvZ2luIG5hbWUuCisJICovCisKKwlmb3IgKGxlbiA9IDAsIGRzdCA9IG5hbWUsIHNyYyA9IHctPnB3X2dlY29zOyBsZW4gPCBzejsgc3JjKyspIHsKKwkJaW50IGNoID0gKnNyYzsKKwkJaWYgKGNoICE9ICcmJykgeworCQkJKmRzdCsrID0gY2g7CisJCQlpZiAoY2ggPT0gMCB8fCBjaCA9PSAnLCcpCisJCQkJYnJlYWs7CisJCQlsZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsZW4gKyBubGVuIDwgc3opIHsKKwkJCS8qIFNvcnJ5LCBNci4gTWNEb25hbGQuLi4gKi8KKwkJCSpkc3QrKyA9IHRvdXBwZXIoKnctPnB3X25hbWUpOworCQkJbWVtY3B5KGRzdCwgdy0+cHdfbmFtZSArIDEsIG5sZW4gLSAxKTsKKwkJCWRzdCArPSBubGVuIC0gMTsKKwkJfQorCX0KKwlpZiAobGVuIDwgc3opCisJCW5hbWVbbGVuXSA9IDA7CisJZWxzZQorCQlkaWUoIllvdXIgcGFyZW50cyBtdXN0IGhhdmUgaGF0ZWQgeW91ISIpOworCit9CisKK2ludCBzZXR1cF9pZGVudCh2b2lkKQoreworCWludCBsZW47CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZChnZXR1aWQoKSk7CisKKwlpZiAoIXB3KQorCQlkaWUoIllvdSBkb24ndCBleGlzdC4gR28gYXdheSEiKTsKKworCS8qIEdldCB0aGUgbmFtZSAoImdlY29zIikgKi8KKwljb3B5X2dlY29zKHB3LCBnaXRfZGVmYXVsdF9uYW1lLCBzaXplb2YoZ2l0X2RlZmF1bHRfbmFtZSkpOworCisJLyogTWFrZSB1cCBhIGZha2UgZW1haWwgYWRkcmVzcyAobmFtZSArICdAJyArIGhvc3RuYW1lIFsrICcuJyArIGRvbWFpbm5hbWVdKSAqLworCWxlbiA9IHN0cmxlbihwdy0+cHdfbmFtZSk7CisJaWYgKGxlbiA+IHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkvMikKKwkJZGllKCJZb3VyIHN5c2FkbWluIG11c3QgaGF0ZSB5b3UhIik7CisJbWVtY3B5KGdpdF9kZWZhdWx0X2VtYWlsLCBwdy0+cHdfbmFtZSwgbGVuKTsKKwlnaXRfZGVmYXVsdF9lbWFpbFtsZW4rK10gPSAnQCc7CisJZ2V0aG9zdG5hbWUoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4sIHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkgLSBsZW4pOworCWlmICghc3RyY2hyKGdpdF9kZWZhdWx0X2VtYWlsK2xlbiwgJy4nKSkgeworCQlzdHJ1Y3QgaG9zdGVudCAqaGUgPSBnZXRob3N0YnluYW1lKGdpdF9kZWZhdWx0X2VtYWlsICsgbGVuKTsKKwkJY2hhciAqZG9tYWlubmFtZTsKKworCQlsZW4gPSBzdHJsZW4oZ2l0X2RlZmF1bHRfZW1haWwpOworCQlnaXRfZGVmYXVsdF9lbWFpbFtsZW4rK10gPSAnLic7CisJCWlmIChoZSAmJiAoZG9tYWlubmFtZSA9IHN0cmNocihoZS0+aF9uYW1lLCAnLicpKSkKKwkJCXN0cmxjcHkoZ2l0X2RlZmF1bHRfZW1haWwgKyBsZW4sIGRvbWFpbm5hbWUgKyAxLCBzaXplb2YoZ2l0X2RlZmF1bHRfZW1haWwpIC0gbGVuKTsKKwkJZWxzZQorCQkJc3RybGNweShnaXRfZGVmYXVsdF9lbWFpbCArIGxlbiwgIihub25lKSIsIHNpemVvZihnaXRfZGVmYXVsdF9lbWFpbCkgLSBsZW4pOworCX0KKwkvKiBBbmQgc2V0IHRoZSBkZWZhdWx0IGRhdGUgKi8KKwlkYXRlc3RhbXAoZ2l0X2RlZmF1bHRfZGF0ZSwgc2l6ZW9mKGdpdF9kZWZhdWx0X2RhdGUpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfcmF3KGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cik7CisJaWYgKG9mZnNldCArIGxlbiA+IHNpemUpCisJCXJldHVybiBzaXplOworCW1lbWNweShidWYgKyBvZmZzZXQsIHN0ciwgbGVuKTsKKwlyZXR1cm4gb2Zmc2V0ICsgbGVuOworfQorCitzdGF0aWMgaW50IGNydWQodW5zaWduZWQgY2hhciBjKQoreworCXN0YXRpYyBjaGFyIGNydWRfYXJyYXlbMjU2XTsKKwlzdGF0aWMgaW50IGNydWRfYXJyYXlfaW5pdGlhbGl6ZWQgPSAwOworCisJaWYgKCFjcnVkX2FycmF5X2luaXRpYWxpemVkKSB7CisJCWludCBrOworCisJCWZvciAoayA9IDA7IGsgPD0gMzE7ICsraykgY3J1ZF9hcnJheVtrXSA9IDE7CisJCWNydWRfYXJyYXlbJyAnXSA9IDE7CisJCWNydWRfYXJyYXlbJy4nXSA9IDE7CisJCWNydWRfYXJyYXlbJywnXSA9IDE7CisJCWNydWRfYXJyYXlbJzonXSA9IDE7CisJCWNydWRfYXJyYXlbJzsnXSA9IDE7CisJCWNydWRfYXJyYXlbJzwnXSA9IDE7CisJCWNydWRfYXJyYXlbJz4nXSA9IDE7CisJCWNydWRfYXJyYXlbJyInXSA9IDE7CisJCWNydWRfYXJyYXlbJ1wnJ10gPSAxOworCQljcnVkX2FycmF5X2luaXRpYWxpemVkID0gMTsKKwl9CisJcmV0dXJuIGNydWRfYXJyYXlbY107Cit9CisKKy8qCisgKiBDb3B5IG92ZXIgYSBzdHJpbmcgdG8gdGhlIGRlc3RpbmF0aW9uLCBidXQgYXZvaWQgc3BlY2lhbAorICogY2hhcmFjdGVycyAoJ1xuJywgJzwnIGFuZCAnPicpIGFuZCByZW1vdmUgY3J1ZCBhdCB0aGUgZW5kCisgKi8KK3N0YXRpYyBpbnQgY29weShjaGFyICpidWYsIGludCBzaXplLCBpbnQgb2Zmc2V0LCBjb25zdCBjaGFyICpzcmMpCit7CisJaW50IGksIGxlbjsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwkvKiBSZW1vdmUgY3J1ZCBmcm9tIHRoZSBiZWdpbm5pbmcuLiAqLworCXdoaWxlICgoYyA9ICpzcmMpICE9IDApIHsKKwkJaWYgKCFjcnVkKGMpKQorCQkJYnJlYWs7CisJCXNyYysrOworCX0KKworCS8qIFJlbW92ZSBjcnVkIGZyb20gdGhlIGVuZC4uICovCisJbGVuID0gc3RybGVuKHNyYyk7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJYyA9IHNyY1tsZW4tMV07CisJCWlmICghY3J1ZChjKSkKKwkJCWJyZWFrOworCQktLWxlbjsKKwl9CisKKwkvKgorCSAqIENvcHkgdGhlIHJlc3QgdG8gdGhlIGJ1ZmZlciwgYnV0IGF2b2lkIHRoZSBzcGVjaWFsCisJICogY2hhcmFjdGVycyAnXG4nICc8JyBhbmQgJz4nIHRoYXQgYWN0IGFzIGRlbGltaXRlcnMgb24KKwkgKiBhIGlkZW50aWZpY2F0aW9uIGxpbmUKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJYyA9ICpzcmMrKzsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1xuJzogY2FzZSAnPCc6IGNhc2UgJz4nOgorCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9mZnNldCA+PSBzaXplKQorCQkJcmV0dXJuIHNpemU7CisJCWJ1ZltvZmZzZXQrK10gPSBjOworCX0KKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgY29uc3QgY2hhciBhdV9lbnZbXSA9ICJHSVRfQVVUSE9SX05BTUUiOworc3RhdGljIGNvbnN0IGNoYXIgY29fZW52W10gPSAiR0lUX0NPTU1JVFRFUl9OQU1FIjsKK3N0YXRpYyBjb25zdCBjaGFyICplbnZfaGludCA9CisiXG4qKiogRW52aXJvbm1lbnQgcHJvYmxlbTpcbiIKKyIqKiogWW91ciBuYW1lIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZyb20geW91ciBzeXN0ZW0gc2VydmljZXMgKGdlY29zKS5cbiIKKyIqKiogWW91IHdvdWxkIG5lZWQgdG8gc2V0ICVzIGFuZCAlc1xuIgorIioqKiBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IG90aGVyd2lzZSB5b3Ugd29uJ3QgYmUgYWJsZSB0byBwZXJmb3JtXG4iCisiKioqIGNlcnRhaW4gb3BlcmF0aW9ucyBiZWNhdXNlIG9mIFwiZW1wdHkgaWRlbnRcIiBlcnJvcnMuXG4iCisiKioqIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHVzZXIubmFtZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlLlxuXG4iOworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2lkZW50KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmVtYWlsLAorCQkJICAgICBjb25zdCBjaGFyICpkYXRlX3N0ciwgaW50IGVycm9yX29uX25vX25hbWUpCit7CisJc3RhdGljIGNoYXIgYnVmZmVyWzEwMDBdOworCWNoYXIgZGF0ZVs1MF07CisJaW50IGk7CisKKwlpZiAoIW5hbWUpCisJCW5hbWUgPSBnaXRfZGVmYXVsdF9uYW1lOworCWlmICghZW1haWwpCisJCWVtYWlsID0gZ2l0X2RlZmF1bHRfZW1haWw7CisKKwlpZiAoISpuYW1lKSB7CisJCWlmIChuYW1lID09IGdpdF9kZWZhdWx0X25hbWUgJiYgZW52X2hpbnQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBlbnZfaGludCwgYXVfZW52LCBjb19lbnYpOworCQkJZW52X2hpbnQgPSBOVUxMOyAvKiB3YXJuIG9ubHkgb25jZSwgZm9yICJnaXQtdmFyIC1sIiAqLworCQl9CisJCWlmIChlcnJvcl9vbl9ub19uYW1lKQorCQkJZGllKCJlbXB0eSBpZGVudCAlcyA8JXM+IG5vdCBhbGxvd2VkIiwgbmFtZSwgZW1haWwpOworCX0KKworCXN0cmNweShkYXRlLCBnaXRfZGVmYXVsdF9kYXRlKTsKKwlpZiAoZGF0ZV9zdHIpCisJCXBhcnNlX2RhdGUoZGF0ZV9zdHIsIGRhdGUsIHNpemVvZihkYXRlKSk7CisKKwlpID0gY29weShidWZmZXIsIHNpemVvZihidWZmZXIpLCAwLCBuYW1lKTsKKwlpID0gYWRkX3JhdyhidWZmZXIsIHNpemVvZihidWZmZXIpLCBpLCAiIDwiKTsKKwlpID0gY29weShidWZmZXIsIHNpemVvZihidWZmZXIpLCBpLCBlbWFpbCk7CisJaSA9IGFkZF9yYXcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgaSwgIj4gIik7CisJaSA9IGNvcHkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgaSwgZGF0ZSk7CisJaWYgKGkgPj0gc2l6ZW9mKGJ1ZmZlcikpCisJCWRpZSgiSW1wb3NzaWJseSBsb25nIHBlcnNvbmFsIGlkZW50aWZpZXIiKTsKKwlidWZmZXJbaV0gPSAwOworCXJldHVybiBidWZmZXI7Cit9CisKK2NvbnN0IGNoYXIgKmdpdF9hdXRob3JfaW5mbyhpbnQgZXJyb3Jfb25fbm9fbmFtZSkKK3sKKwlyZXR1cm4gZ2V0X2lkZW50KGdldGVudigiR0lUX0FVVEhPUl9OQU1FIiksCisJCQkgZ2V0ZW52KCJHSVRfQVVUSE9SX0VNQUlMIiksCisJCQkgZ2V0ZW52KCJHSVRfQVVUSE9SX0RBVEUiKSwKKwkJCSBlcnJvcl9vbl9ub19uYW1lKTsKK30KKworY29uc3QgY2hhciAqZ2l0X2NvbW1pdHRlcl9pbmZvKGludCBlcnJvcl9vbl9ub19uYW1lKQoreworCXJldHVybiBnZXRfaWRlbnQoZ2V0ZW52KCJHSVRfQ09NTUlUVEVSX05BTUUiKSwKKwkJCSBnZXRlbnYoIkdJVF9DT01NSVRURVJfRU1BSUwiKSwKKwkJCSBnZXRlbnYoIkdJVF9DT01NSVRURVJfREFURSIpLAorCQkJIGVycm9yX29uX25vX25hbWUpOworfQpkaWZmIC0tZ2l0IGEvaW1hcC1zZW5kLmMgYi9pbWFwLXNlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWM3MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW1hcC1zZW5kLmMKQEAgLTAsMCArMSwxMzY5IEBACisvKgorICogZ2l0LWltYXAtc2VuZCAtIGRyb3BzIHBhdGNoZXMgaW50byBhbiBpbWFwIERyYWZ0cyBmb2xkZXIKKyAqICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20gaXN5bmMvbWJzeW5jIC0gbWFpbGJveCBzeW5jaHJvbml6ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMiBNaWNoYWVsIFIuIEVsa2lucyA8bWVAbXV0dC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBPc3dhbGQgQnVkZGVuaGFnZW4gPG9zc2lAdXNlcnMuc2YubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRoZW9kb3JlIFkuIFRzJ28gPHR5dHNvQG1pdC5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWlrZSBNY0Nvcm1hY2sKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCit0eXBlZGVmIHN0cnVjdCBzdG9yZV9jb25mIHsKKwljaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnBhdGg7IC8qIHNob3VsZCB0aGlzIGJlIGhlcmU/IGl0cyBpbnRlcnByZXRhdGlvbiBpcyBkcml2ZXItc3BlY2lmaWMgKi8KKwljaGFyICptYXBfaW5ib3g7CisJY2hhciAqdHJhc2g7CisJdW5zaWduZWQgbWF4X3NpemU7IC8qIG9mZl90IGlzIG92ZXJraWxsICovCisJdW5zaWduZWQgdHJhc2hfcmVtb3RlX25ldzoxLCB0cmFzaF9vbmx5X25ldzoxOworfSBzdG9yZV9jb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IHN0cmluZ19saXN0IHsKKwlzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7CisJY2hhciBzdHJpbmdbMV07Cit9IHN0cmluZ19saXN0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGNoYW5uZWxfY29uZiB7CisJc3RydWN0IGNoYW5uZWxfY29uZiAqbmV4dDsKKwljaGFyICpuYW1lOworCXN0b3JlX2NvbmZfdCAqbWFzdGVyLCAqc2xhdmU7CisJY2hhciAqbWFzdGVyX25hbWUsICpzbGF2ZV9uYW1lOworCWNoYXIgKnN5bmNfc3RhdGU7CisJc3RyaW5nX2xpc3RfdCAqcGF0dGVybnM7CisJaW50IG1vcHMsIHNvcHM7CisJdW5zaWduZWQgbWF4X21lc3NhZ2VzOyAvKiBmb3Igc2xhdmUgb25seSAqLworfSBjaGFubmVsX2NvbmZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBfY29uZiB7CisJc3RydWN0IGdyb3VwX2NvbmYgKm5leHQ7CisJY2hhciAqbmFtZTsKKwlzdHJpbmdfbGlzdF90ICpjaGFubmVsczsKK30gZ3JvdXBfY29uZl90OworCisvKiBGb3IgbWVzc2FnZS0+c3RhdHVzICovCisjZGVmaW5lIE1fUkVDRU5UICAgICAgICgxPDwwKSAvKiB1bnN5bmNhYmxlIGZsYWc7IG1haWxkaXJfKiBkZXBlbmQgb24gdGhpcyBiZWluZyAxPDwwICovCisjZGVmaW5lIE1fREVBRCAgICAgICAgICgxPDwxKSAvKiBleHB1bmdlZCAqLworI2RlZmluZSBNX0ZMQUdTICAgICAgICAoMTw8MikgLyogZmxhZ3MgZmV0Y2hlZCAqLworCit0eXBlZGVmIHN0cnVjdCBtZXNzYWdlIHsKKwlzdHJ1Y3QgbWVzc2FnZSAqbmV4dDsKKwkvKiBzdHJpbmdfbGlzdF90ICprZXl3b3JkczsgKi8KKwlzaXplX3Qgc2l6ZTsgLyogemVybyBpbXBsaWVzICJub3QgZmV0Y2hlZCIgKi8KKwlpbnQgdWlkOworCXVuc2lnbmVkIGNoYXIgZmxhZ3MsIHN0YXR1czsKK30gbWVzc2FnZV90OworCit0eXBlZGVmIHN0cnVjdCBzdG9yZSB7CisJc3RvcmVfY29uZl90ICpjb25mOyAvKiBmb3JlaWduICovCisKKwkvKiBjdXJyZW50bHkgb3BlbiBtYWlsYm94ICovCisJY29uc3QgY2hhciAqbmFtZTsgLyogZm9yZWlnbiEgbWF5YmUgcHJlc2V0PyAqLworCWNoYXIgKnBhdGg7IC8qIG93biAqLworCW1lc3NhZ2VfdCAqbXNnczsgLyogb3duICovCisJaW50IHVpZHZhbGlkaXR5OworCXVuc2lnbmVkIGNoYXIgb3B0czsgLyogbWF5YmUgcHJlc2V0PyAqLworCS8qIG5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGRvIF9ub3RfIHJlZmxlY3Qgc3RhdHMgZnJvbSBtc2dzLCBidXQgbWFpbGJveCB0b3RhbHMgKi8KKwlpbnQgY291bnQ7IC8qICMgb2YgbWVzc2FnZXMgKi8KKwlpbnQgcmVjZW50OyAvKiAjIG9mIHJlY2VudCBtZXNzYWdlcyAtIGRvbid0IHRydXN0IHRoaXMgYmV5b25kIHRoZSBpbml0aWFsIHJlYWQgKi8KK30gc3RvcmVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgKmRhdGE7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGludCBjcmxmOjE7Cit9IG1zZ19kYXRhX3Q7CisKKyNkZWZpbmUgRFJWX09LICAgICAgICAgIDAKKyNkZWZpbmUgRFJWX01TR19CQUQgICAgIC0xCisjZGVmaW5lIERSVl9CT1hfQkFEICAgICAtMgorI2RlZmluZSBEUlZfU1RPUkVfQkFEICAgLTMKKworc3RhdGljIGludCBWZXJib3NlLCBRdWlldDsKKworc3RhdGljIHZvaWQgaW5mbyggY29uc3QgY2hhciAqLCAuLi4gKTsKK3N0YXRpYyB2b2lkIHdhcm4oIGNvbnN0IGNoYXIgKiwgLi4uICk7CisKK3N0YXRpYyBjaGFyICpuZXh0X2FyZyggY2hhciAqKiApOworCitzdGF0aWMgdm9pZCBmcmVlX2dlbmVyaWNfbWVzc2FnZXMoIG1lc3NhZ2VfdCAqICk7CisKK3N0YXRpYyBpbnQgbmZ2YXNwcmludGYoIGNoYXIgKipzdHIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSApOworc3RhdGljIGludCBuZnNucHJpbnRmKCBjaGFyICpidWYsIGludCBibGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLiApOworCisKK3N0YXRpYyB2b2lkIGFyYzRfaW5pdCggdm9pZCApOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXJjNF9nZXRieXRlKCB2b2lkICk7CisKK3R5cGVkZWYgc3RydWN0IGltYXBfc2VydmVyX2NvbmYgeworCWNoYXIgKm5hbWU7CisJY2hhciAqdHVubmVsOworCWNoYXIgKmhvc3Q7CisJaW50IHBvcnQ7CisJY2hhciAqdXNlcjsKKwljaGFyICpwYXNzOworfSBpbWFwX3NlcnZlcl9jb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IGltYXBfc3RvcmVfY29uZiB7CisJc3RvcmVfY29uZl90IGdlbjsKKwlpbWFwX3NlcnZlcl9jb25mX3QgKnNlcnZlcjsKKwl1bnNpZ25lZCB1c2VfbmFtZXNwYWNlOjE7Cit9IGltYXBfc3RvcmVfY29uZl90OworCisjZGVmaW5lIE5JTAkodm9pZCopMHgxCisjZGVmaW5lIExJU1QJKHZvaWQqKTB4MgorCit0eXBlZGVmIHN0cnVjdCBfbGlzdCB7CisJc3RydWN0IF9saXN0ICpuZXh0LCAqY2hpbGQ7CisJY2hhciAqdmFsOworCWludCBsZW47Cit9IGxpc3RfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmZDsKK30gU29ja2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlTb2NrZXRfdCBzb2NrOworCWludCBieXRlczsKKwlpbnQgb2Zmc2V0OworCWNoYXIgYnVmWzEwMjRdOworfSBidWZmZXJfdDsKKworc3RydWN0IGltYXBfY21kOworCit0eXBlZGVmIHN0cnVjdCBpbWFwIHsKKwlpbnQgdWlkbmV4dDsgLyogZnJvbSBTRUxFQ1QgcmVzcG9uc2VzICovCisJbGlzdF90ICpuc19wZXJzb25hbCwgKm5zX290aGVyLCAqbnNfc2hhcmVkOyAvKiBOQU1FU1BBQ0UgaW5mbyAqLworCXVuc2lnbmVkIGNhcHMsIHJjYXBzOyAvKiBDQVBBQklMSVRZIHJlc3VsdHMgKi8KKwkvKiBjb21tYW5kIHF1ZXVlICovCisJaW50IG5leHR0YWcsIG51bV9pbl9wcm9ncmVzcywgbGl0ZXJhbF9wZW5kaW5nOworCXN0cnVjdCBpbWFwX2NtZCAqaW5fcHJvZ3Jlc3MsICoqaW5fcHJvZ3Jlc3NfYXBwZW5kOworCWJ1ZmZlcl90IGJ1ZjsgLyogdGhpcyBpcyBCSUcsIHNvIHB1dCBpdCBsYXN0ICovCit9IGltYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgaW1hcF9zdG9yZSB7CisJc3RvcmVfdCBnZW47CisJaW50IHVpZHZhbGlkaXR5OworCWltYXBfdCAqaW1hcDsKKwljb25zdCBjaGFyICpwcmVmaXg7CisJdW5zaWduZWQgLypjdXJyZW50bmM6MSwqLyB0cmFzaG5jOjE7Cit9IGltYXBfc3RvcmVfdDsKKworc3RydWN0IGltYXBfY21kX2NiIHsKKwlpbnQgKCpjb250KSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZCAqY21kLCBjb25zdCBjaGFyICpwcm9tcHQgKTsKKwl2b2lkICgqZG9uZSkoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWQgKmNtZCwgaW50IHJlc3BvbnNlKTsKKwl2b2lkICpjdHg7CisJY2hhciAqZGF0YTsKKwlpbnQgZGxlbjsKKwlpbnQgdWlkOworCXVuc2lnbmVkIGNyZWF0ZToxLCB0cnljcmVhdGU6MTsKK307CisKK3N0cnVjdCBpbWFwX2NtZCB7CisJc3RydWN0IGltYXBfY21kICpuZXh0OworCXN0cnVjdCBpbWFwX2NtZF9jYiBjYjsKKwljaGFyICpjbWQ7CisJaW50IHRhZzsKK307CisKKyNkZWZpbmUgQ0FQKGNhcCkgKGltYXAtPmNhcHMgJiAoMSA8PCAoY2FwKSkpCisKK2VudW0gQ0FQQUJJTElUWSB7CisJTk9MT0dJTiA9IDAsCisJVUlEUExVUywKKwlMSVRFUkFMUExVUywKKwlOQU1FU1BBQ0UsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY2FwX2xpc3RbXSA9IHsKKwkiTE9HSU5ESVNBQkxFRCIsCisJIlVJRFBMVVMiLAorCSJMSVRFUkFMKyIsCisJIk5BTUVTUEFDRSIsCit9OworCisjZGVmaW5lIFJFU1BfT0sgICAgMAorI2RlZmluZSBSRVNQX05PICAgIDEKKyNkZWZpbmUgUkVTUF9CQUQgICAyCisKK3N0YXRpYyBpbnQgZ2V0X2NtZF9yZXN1bHQoIGltYXBfc3RvcmVfdCAqY3R4LCBzdHJ1Y3QgaW1hcF9jbWQgKnRjbWQgKTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqRmxhZ3NbXSA9IHsKKwkiRHJhZnQiLAorCSJGbGFnZ2VkIiwKKwkiQW5zd2VyZWQiLAorCSJTZWVuIiwKKwkiRGVsZXRlZCIsCit9OworCitzdGF0aWMgdm9pZAorc29ja2V0X3BlcnJvciggY29uc3QgY2hhciAqZnVuYywgU29ja2V0X3QgKnNvY2ssIGludCByZXQgKQoreworCWlmIChyZXQgPCAwKQorCQlwZXJyb3IoIGZ1bmMgKTsKKwllbHNlCisJCWZwcmludGYoIHN0ZGVyciwgIiVzOiB1bmV4cGVjdGVkIEVPRlxuIiwgZnVuYyApOworfQorCitzdGF0aWMgaW50Citzb2NrZXRfcmVhZCggU29ja2V0X3QgKnNvY2ssIGNoYXIgKmJ1ZiwgaW50IGxlbiApCit7CisJaW50IG4gPSByZWFkKCBzb2NrLT5mZCwgYnVmLCBsZW4gKTsKKwlpZiAobiA8PSAwKSB7CisJCXNvY2tldF9wZXJyb3IoICJyZWFkIiwgc29jaywgbiApOworCQljbG9zZSggc29jay0+ZmQgKTsKKwkJc29jay0+ZmQgPSAtMTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQKK3NvY2tldF93cml0ZSggU29ja2V0X3QgKnNvY2ssIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbiApCit7CisJaW50IG4gPSB3cml0ZSggc29jay0+ZmQsIGJ1ZiwgbGVuICk7CisJaWYgKG4gIT0gbGVuKSB7CisJCXNvY2tldF9wZXJyb3IoICJ3cml0ZSIsIHNvY2ssIG4gKTsKKwkJY2xvc2UoIHNvY2stPmZkICk7CisJCXNvY2stPmZkID0gLTE7CisJfQorCXJldHVybiBuOworfQorCisvKiBzaW1wbGUgbGluZSBidWZmZXJpbmcgKi8KK3N0YXRpYyBpbnQKK2J1ZmZlcl9nZXRzKCBidWZmZXJfdCAqIGIsIGNoYXIgKipzICkKK3sKKwlpbnQgbjsKKwlpbnQgc3RhcnQgPSBiLT5vZmZzZXQ7CisKKwkqcyA9IGItPmJ1ZiArIHN0YXJ0OworCisJZm9yICg7OykgeworCQkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggZGF0YSB0byByZWFkIHRoZSBcclxuIHNlcXVlbmNlICovCisJCWlmIChiLT5vZmZzZXQgKyAxID49IGItPmJ5dGVzKSB7CisJCQlpZiAoc3RhcnQpIHsKKwkJCQkvKiBzaGlmdCBkb3duIHVzZWQgYnl0ZXMgKi8KKwkJCQkqcyA9IGItPmJ1ZjsKKworCQkJCWFzc2VydCggc3RhcnQgPD0gYi0+Ynl0ZXMgKTsKKwkJCQluID0gYi0+Ynl0ZXMgLSBzdGFydDsKKworCQkJCWlmIChuKQorCQkJCQltZW1jcHkoIGItPmJ1ZiwgYi0+YnVmICsgc3RhcnQsIG4gKTsKKwkJCQliLT5vZmZzZXQgLT0gc3RhcnQ7CisJCQkJYi0+Ynl0ZXMgPSBuOworCQkJCXN0YXJ0ID0gMDsKKwkJCX0KKworCQkJbiA9IHNvY2tldF9yZWFkKCAmYi0+c29jaywgYi0+YnVmICsgYi0+Ynl0ZXMsCisJCQkJCSBzaXplb2YoYi0+YnVmKSAtIGItPmJ5dGVzICk7CisKKwkJCWlmIChuIDw9IDApCisJCQkJcmV0dXJuIC0xOworCisJCQliLT5ieXRlcyArPSBuOworCQl9CisKKwkJaWYgKGItPmJ1ZltiLT5vZmZzZXRdID09ICdccicpIHsKKwkJCWFzc2VydCggYi0+b2Zmc2V0ICsgMSA8IGItPmJ5dGVzICk7CisJCQlpZiAoYi0+YnVmW2ItPm9mZnNldCArIDFdID09ICdcbicpIHsKKwkJCQliLT5idWZbYi0+b2Zmc2V0XSA9IDA7ICAvKiB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCQkJCWItPm9mZnNldCArPSAyOyAvKiBuZXh0IGxpbmUgKi8KKwkJCQlpZiAoVmVyYm9zZSkKKwkJCQkJcHV0cyggKnMgKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCWItPm9mZnNldCsrOworCX0KKwkvKiBub3QgcmVhY2hlZCAqLworfQorCitzdGF0aWMgdm9pZAoraW5mbyggY29uc3QgY2hhciAqbXNnLCAuLi4gKQoreworCXZhX2xpc3QgdmE7CisKKwlpZiAoIVF1aWV0KSB7CisJCXZhX3N0YXJ0KCB2YSwgbXNnICk7CisJCXZwcmludGYoIG1zZywgdmEgKTsKKwkJdmFfZW5kKCB2YSApOworCQlmZmx1c2goIHN0ZG91dCApOworCX0KK30KKworc3RhdGljIHZvaWQKK3dhcm4oIGNvbnN0IGNoYXIgKm1zZywgLi4uICkKK3sKKwl2YV9saXN0IHZhOworCisJaWYgKFF1aWV0IDwgMikgeworCQl2YV9zdGFydCggdmEsIG1zZyApOworCQl2ZnByaW50Ziggc3RkZXJyLCBtc2csIHZhICk7CisJCXZhX2VuZCggdmEgKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICoKK25leHRfYXJnKCBjaGFyICoqcyApCit7CisJY2hhciAqcmV0OworCisJaWYgKCFzIHx8ICEqcykKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUgKGlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSAqKnMgKSkKKwkJKCpzKSsrOworCWlmICghKipzKSB7CisJCSpzID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICgqKnMgPT0gJyInKSB7CisJCSsrKnM7CisJCXJldCA9ICpzOworCQkqcyA9IHN0cmNociggKnMsICciJyApOworCX0gZWxzZSB7CisJCXJldCA9ICpzOworCQl3aGlsZSAoKipzICYmICFpc3NwYWNlKCAodW5zaWduZWQgY2hhcikgKipzICkpCisJCQkoKnMpKys7CisJfQorCWlmICgqcykgeworCQlpZiAoKipzKQorCQkJKigqcykrKyA9IDA7CisJCWlmICghKipzKQorCQkJKnMgPSBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorZnJlZV9nZW5lcmljX21lc3NhZ2VzKCBtZXNzYWdlX3QgKm1zZ3MgKQoreworCW1lc3NhZ2VfdCAqdG1zZzsKKworCWZvciAoOyBtc2dzOyBtc2dzID0gdG1zZykgeworCQl0bXNnID0gbXNncy0+bmV4dDsKKwkJZnJlZSggbXNncyApOworCX0KK30KKworc3RhdGljIGludAorZ2l0X3Zhc3ByaW50ZiggY2hhciAqKnN0cnAsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCApCit7CisJaW50IGxlbjsKKwljaGFyIHRtcFsxMDI0XTsKKworCWlmICgobGVuID0gdnNucHJpbnRmKCB0bXAsIHNpemVvZih0bXApLCBmbXQsIGFwICkpIDwgMCB8fCAhKCpzdHJwID0geG1hbGxvYyggbGVuICsgMSApKSkKKwkJcmV0dXJuIC0xOworCWlmIChsZW4gPj0gKGludClzaXplb2YodG1wKSkKKwkJdnNwcmludGYoICpzdHJwLCBmbXQsIGFwICk7CisJZWxzZQorCQltZW1jcHkoICpzdHJwLCB0bXAsIGxlbiArIDEgKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50CituZnNucHJpbnRmKCBjaGFyICpidWYsIGludCBibGVuLCBjb25zdCBjaGFyICpmbXQsIC4uLiApCit7CisJaW50IHJldDsKKwl2YV9saXN0IHZhOworCisJdmFfc3RhcnQoIHZhLCBmbXQgKTsKKwlpZiAoYmxlbiA8PSAwIHx8ICh1bnNpZ25lZCkocmV0ID0gdnNucHJpbnRmKCBidWYsIGJsZW4sIGZtdCwgdmEgKSkgPj0gKHVuc2lnbmVkKWJsZW4pCisJCWRpZSggIkZhdGFsOiBidWZmZXIgdG9vIHNtYWxsLiBQbGVhc2UgcmVwb3J0IGEgYnVnLlxuIik7CisJdmFfZW5kKCB2YSApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25mdmFzcHJpbnRmKCBjaGFyICoqc3RyLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEgKQoreworCWludCByZXQgPSBnaXRfdmFzcHJpbnRmKCBzdHIsIGZtdCwgdmEgKTsKKwlpZiAocmV0IDwgMCkKKwkJZGllKCAiRmF0YWw6IE91dCBvZiBtZW1vcnlcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgaSwgaiwgc1syNTZdOworfSByczsKKworc3RhdGljIHZvaWQKK2FyYzRfaW5pdCggdm9pZCApCit7CisJaW50IGksIGZkOworCXVuc2lnbmVkIGNoYXIgaiwgc2ksIGRhdFsxMjhdOworCisJaWYgKChmZCA9IG9wZW4oICIvZGV2L3VyYW5kb20iLCBPX1JET05MWSApKSA8IDAgJiYgKGZkID0gb3BlbiggIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkgKSkgPCAwKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIkZhdGFsOiBubyByYW5kb20gbnVtYmVyIHNvdXJjZSBhdmFpbGFibGUuXG4iICk7CisJCWV4aXQoIDMgKTsKKwl9CisJaWYgKHJlYWQoIGZkLCBkYXQsIDEyOCApICE9IDEyOCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJGYXRhbDogY2Fubm90IHJlYWQgcmFuZG9tIG51bWJlciBzb3VyY2UuXG4iICk7CisJCWV4aXQoIDMgKTsKKwl9CisJY2xvc2UoIGZkICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXJzLnNbaV0gPSBpOworCWZvciAoaSA9IGogPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJc2kgPSBycy5zW2ldOworCQlqICs9IHNpICsgZGF0W2kgJiAxMjddOworCQlycy5zW2ldID0gcnMuc1tqXTsKKwkJcnMuc1tqXSA9IHNpOworCX0KKwlycy5pID0gcnMuaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWFyYzRfZ2V0Ynl0ZSgpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXJjNF9nZXRieXRlKCB2b2lkICkKK3sKKwl1bnNpZ25lZCBjaGFyIHNpLCBzajsKKworCXJzLmkrKzsKKwlzaSA9IHJzLnNbcnMuaV07CisJcnMuaiArPSBzaTsKKwlzaiA9IHJzLnNbcnMual07CisJcnMuc1tycy5pXSA9IHNqOworCXJzLnNbcnMual0gPSBzaTsKKwlyZXR1cm4gcnMuc1soc2kgKyBzaikgJiAweGZmXTsKK30KKworc3RhdGljIHN0cnVjdCBpbWFwX2NtZCAqCit2X2lzc3VlX2ltYXBfY21kKCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kX2NiICpjYiwKKwkJICBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXAgKQoreworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwlzdHJ1Y3QgaW1hcF9jbWQgKmNtZDsKKwlpbnQgbiwgYnVmbDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWNtZCA9IHhtYWxsb2MoIHNpemVvZihzdHJ1Y3QgaW1hcF9jbWQpICk7CisJbmZ2YXNwcmludGYoICZjbWQtPmNtZCwgZm10LCBhcCApOworCWNtZC0+dGFnID0gKytpbWFwLT5uZXh0dGFnOworCisJaWYgKGNiKQorCQljbWQtPmNiID0gKmNiOworCWVsc2UKKwkJbWVtc2V0KCAmY21kLT5jYiwgMCwgc2l6ZW9mKGNtZC0+Y2IpICk7CisKKwl3aGlsZSAoaW1hcC0+bGl0ZXJhbF9wZW5kaW5nKQorCQlnZXRfY21kX3Jlc3VsdCggY3R4LCBOVUxMICk7CisKKwlidWZsID0gbmZzbnByaW50ZiggYnVmLCBzaXplb2YoYnVmKSwgY21kLT5jYi5kYXRhID8gQ0FQKExJVEVSQUxQTFVTKSA/CisJCQkgICAiJWQgJXN7JWQrfVxyXG4iIDogIiVkICVzeyVkfVxyXG4iIDogIiVkICVzXHJcbiIsCisJCQkgICBjbWQtPnRhZywgY21kLT5jbWQsIGNtZC0+Y2IuZGxlbiApOworCWlmIChWZXJib3NlKSB7CisJCWlmIChpbWFwLT5udW1faW5fcHJvZ3Jlc3MpCisJCQlwcmludGYoICIoJWQgaW4gcHJvZ3Jlc3MpICIsIGltYXAtPm51bV9pbl9wcm9ncmVzcyApOworCQlpZiAobWVtY21wKCBjbWQtPmNtZCwgIkxPR0lOIiwgNSApKQorCQkJcHJpbnRmKCAiPj4+ICVzIiwgYnVmICk7CisJCWVsc2UKKwkJCXByaW50ZiggIj4+PiAlZCBMT0dJTiA8dXNlcj4gPHBhc3M+XG4iLCBjbWQtPnRhZyApOworCX0KKwlpZiAoc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssIGJ1ZiwgYnVmbCApICE9IGJ1ZmwpIHsKKwkJZnJlZSggY21kLT5jbWQgKTsKKwkJZnJlZSggY21kICk7CisJCWlmIChjYiAmJiBjYi0+ZGF0YSkKKwkJCWZyZWUoIGNiLT5kYXRhICk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoY21kLT5jYi5kYXRhKSB7CisJCWlmIChDQVAoTElURVJBTFBMVVMpKSB7CisJCQluID0gc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssIGNtZC0+Y2IuZGF0YSwgY21kLT5jYi5kbGVuICk7CisJCQlmcmVlKCBjbWQtPmNiLmRhdGEgKTsKKwkJCWlmIChuICE9IGNtZC0+Y2IuZGxlbiB8fAorCQkJICAgIChuID0gc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssICJcclxuIiwgMiApKSAhPSAyKQorCQkJeworCQkJCWZyZWUoIGNtZC0+Y21kICk7CisJCQkJZnJlZSggY21kICk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQljbWQtPmNiLmRhdGEgPSBOVUxMOworCQl9IGVsc2UKKwkJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDE7CisJfSBlbHNlIGlmIChjbWQtPmNiLmNvbnQpCisJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDE7CisJY21kLT5uZXh0ID0gTlVMTDsKKwkqaW1hcC0+aW5fcHJvZ3Jlc3NfYXBwZW5kID0gY21kOworCWltYXAtPmluX3Byb2dyZXNzX2FwcGVuZCA9ICZjbWQtPm5leHQ7CisJaW1hcC0+bnVtX2luX3Byb2dyZXNzKys7CisJcmV0dXJuIGNtZDsKK30KKworc3RhdGljIHN0cnVjdCBpbWFwX2NtZCAqCitpc3N1ZV9pbWFwX2NtZCggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwlzdHJ1Y3QgaW1hcF9jbWQgKnJldDsKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoIGFwLCBmbXQgKTsKKwlyZXQgPSB2X2lzc3VlX2ltYXBfY21kKCBjdHgsIGNiLCBmbXQsIGFwICk7CisJdmFfZW5kKCBhcCApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2ltYXBfZXhlYyggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCXN0cnVjdCBpbWFwX2NtZCAqY21kcDsKKworCXZhX3N0YXJ0KCBhcCwgZm10ICk7CisJY21kcCA9IHZfaXNzdWVfaW1hcF9jbWQoIGN0eCwgY2IsIGZtdCwgYXAgKTsKKwl2YV9lbmQoIGFwICk7CisJaWYgKCFjbWRwKQorCQlyZXR1cm4gUkVTUF9CQUQ7CisKKwlyZXR1cm4gZ2V0X2NtZF9yZXN1bHQoIGN0eCwgY21kcCApOworfQorCitzdGF0aWMgaW50CitpbWFwX2V4ZWNfbSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uICkKK3sKKwl2YV9saXN0IGFwOworCXN0cnVjdCBpbWFwX2NtZCAqY21kcDsKKworCXZhX3N0YXJ0KCBhcCwgZm10ICk7CisJY21kcCA9IHZfaXNzdWVfaW1hcF9jbWQoIGN0eCwgY2IsIGZtdCwgYXAgKTsKKwl2YV9lbmQoIGFwICk7CisJaWYgKCFjbWRwKQorCQlyZXR1cm4gRFJWX1NUT1JFX0JBRDsKKworCXN3aXRjaCAoZ2V0X2NtZF9yZXN1bHQoIGN0eCwgY21kcCApKSB7CisJY2FzZSBSRVNQX0JBRDogcmV0dXJuIERSVl9TVE9SRV9CQUQ7CisJY2FzZSBSRVNQX05POiByZXR1cm4gRFJWX01TR19CQUQ7CisJZGVmYXVsdDogcmV0dXJuIERSVl9PSzsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2lzX2F0b20oIGxpc3RfdCAqbGlzdCApCit7CisJcmV0dXJuIGxpc3QgJiYgbGlzdC0+dmFsICYmIGxpc3QtPnZhbCAhPSBOSUwgJiYgbGlzdC0+dmFsICE9IExJU1Q7Cit9CisKK3N0YXRpYyBpbnQKK2lzX2xpc3QoIGxpc3RfdCAqbGlzdCApCit7CisJcmV0dXJuIGxpc3QgJiYgbGlzdC0+dmFsID09IExJU1Q7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2xpc3QoIGxpc3RfdCAqbGlzdCApCit7CisJbGlzdF90ICp0bXA7CisKKwlmb3IgKDsgbGlzdDsgbGlzdCA9IHRtcCkgeworCQl0bXAgPSBsaXN0LT5uZXh0OworCQlpZiAoaXNfbGlzdCggbGlzdCApKQorCQkJZnJlZV9saXN0KCBsaXN0LT5jaGlsZCApOworCQllbHNlIGlmIChpc19hdG9tKCBsaXN0ICkpCisJCQlmcmVlKCBsaXN0LT52YWwgKTsKKwkJZnJlZSggbGlzdCApOworCX0KK30KKworc3RhdGljIGludAorcGFyc2VfaW1hcF9saXN0X2woIGltYXBfdCAqaW1hcCwgY2hhciAqKnNwLCBsaXN0X3QgKipjdXJwLCBpbnQgbGV2ZWwgKQoreworCWxpc3RfdCAqY3VyOworCWNoYXIgKnMgPSAqc3AsICpwOworCWludCBuLCBieXRlczsKKworCWZvciAoOzspIHsKKwkJd2hpbGUgKGlzc3BhY2UoICh1bnNpZ25lZCBjaGFyKSpzICkpCisJCQlzKys7CisJCWlmIChsZXZlbCAmJiAqcyA9PSAnKScpIHsKKwkJCXMrKzsKKwkJCWJyZWFrOworCQl9CisJCSpjdXJwID0gY3VyID0geG1hbGxvYyggc2l6ZW9mKCpjdXIpICk7CisJCWN1cnAgPSAmY3VyLT5uZXh0OworCQljdXItPnZhbCA9IE5VTEw7IC8qIGZvciBjbGVhbiBiYWlsICovCisJCWlmICgqcyA9PSAnKCcpIHsKKwkJCS8qIHN1Ymxpc3QgKi8KKwkJCXMrKzsKKwkJCWN1ci0+dmFsID0gTElTVDsKKwkJCWlmIChwYXJzZV9pbWFwX2xpc3RfbCggaW1hcCwgJnMsICZjdXItPmNoaWxkLCBsZXZlbCArIDEgKSkKKwkJCQlnb3RvIGJhaWw7CisJCX0gZWxzZSBpZiAoaW1hcCAmJiAqcyA9PSAneycpIHsKKwkJCS8qIGxpdGVyYWwgKi8KKwkJCWJ5dGVzID0gY3VyLT5sZW4gPSBzdHJ0b2woIHMgKyAxLCAmcywgMTAgKTsKKwkJCWlmICgqcyAhPSAnfScpCisJCQkJZ290byBiYWlsOworCisJCQlzID0gY3VyLT52YWwgPSB4bWFsbG9jKCBjdXItPmxlbiApOworCisJCQkvKiBkdW1wIHdoYXRzIGxlZnQgb3ZlciBpbiB0aGUgaW5wdXQgYnVmZmVyICovCisJCQluID0gaW1hcC0+YnVmLmJ5dGVzIC0gaW1hcC0+YnVmLm9mZnNldDsKKworCQkJaWYgKG4gPiBieXRlcykKKwkJCQkvKiB0aGUgZW50aXJlIG1lc3NhZ2UgZml0IGluIHRoZSBidWZmZXIgKi8KKwkJCQluID0gYnl0ZXM7CisKKwkJCW1lbWNweSggcywgaW1hcC0+YnVmLmJ1ZiArIGltYXAtPmJ1Zi5vZmZzZXQsIG4gKTsKKwkJCXMgKz0gbjsKKwkJCWJ5dGVzIC09IG47CisKKwkJCS8qIG1hcmsgdGhhdCB3ZSB1c2VkIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLworCQkJaW1hcC0+YnVmLm9mZnNldCArPSBuOworCisJCQkvKiBub3cgcmVhZCB0aGUgcmVzdCBvZiB0aGUgbWVzc2FnZSAqLworCQkJd2hpbGUgKGJ5dGVzID4gMCkgeworCQkJCWlmICgobiA9IHNvY2tldF9yZWFkICgmaW1hcC0+YnVmLnNvY2ssIHMsIGJ5dGVzKSkgPD0gMCkKKwkJCQkJZ290byBiYWlsOworCQkJCXMgKz0gbjsKKwkJCQlieXRlcyAtPSBuOworCQkJfQorCisJCQlpZiAoYnVmZmVyX2dldHMoICZpbWFwLT5idWYsICZzICkpCisJCQkJZ290byBiYWlsOworCQl9IGVsc2UgaWYgKCpzID09ICciJykgeworCQkJLyogcXVvdGVkIHN0cmluZyAqLworCQkJcysrOworCQkJcCA9IHM7CisJCQlmb3IgKDsgKnMgIT0gJyInOyBzKyspCisJCQkJaWYgKCEqcykKKwkJCQkJZ290byBiYWlsOworCQkJY3VyLT5sZW4gPSBzIC0gcDsKKwkJCXMrKzsKKwkJCWN1ci0+dmFsID0geG1hbGxvYyggY3VyLT5sZW4gKyAxICk7CisJCQltZW1jcHkoIGN1ci0+dmFsLCBwLCBjdXItPmxlbiApOworCQkJY3VyLT52YWxbY3VyLT5sZW5dID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIGF0b20gKi8KKwkJCXAgPSBzOworCQkJZm9yICg7ICpzICYmICFpc3NwYWNlKCAodW5zaWduZWQgY2hhcikqcyApOyBzKyspCisJCQkJaWYgKGxldmVsICYmICpzID09ICcpJykKKwkJCQkJYnJlYWs7CisJCQljdXItPmxlbiA9IHMgLSBwOworCQkJaWYgKGN1ci0+bGVuID09IDMgJiYgIW1lbWNtcCAoIk5JTCIsIHAsIDMpKQorCQkJCWN1ci0+dmFsID0gTklMOworCQkJZWxzZSB7CisJCQkJY3VyLT52YWwgPSB4bWFsbG9jKCBjdXItPmxlbiArIDEgKTsKKwkJCQltZW1jcHkoIGN1ci0+dmFsLCBwLCBjdXItPmxlbiApOworCQkJCWN1ci0+dmFsW2N1ci0+bGVuXSA9IDA7CisJCQl9CisJCX0KKworCQlpZiAoIWxldmVsKQorCQkJYnJlYWs7CisJCWlmICghKnMpCisJCQlnb3RvIGJhaWw7CisJfQorCSpzcCA9IHM7CisJKmN1cnAgPSBOVUxMOworCXJldHVybiAwOworCisgIGJhaWw6CisJKmN1cnAgPSBOVUxMOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGxpc3RfdCAqCitwYXJzZV9pbWFwX2xpc3QoIGltYXBfdCAqaW1hcCwgY2hhciAqKnNwICkKK3sKKwlsaXN0X3QgKmhlYWQ7CisKKwlpZiAoIXBhcnNlX2ltYXBfbGlzdF9sKCBpbWFwLCBzcCwgJmhlYWQsIDAgKSkKKwkJcmV0dXJuIGhlYWQ7CisJZnJlZV9saXN0KCBoZWFkICk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBsaXN0X3QgKgorcGFyc2VfbGlzdCggY2hhciAqKnNwICkKK3sKKwlyZXR1cm4gcGFyc2VfaW1hcF9saXN0KCBOVUxMLCBzcCApOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VfY2FwYWJpbGl0eSggaW1hcF90ICppbWFwLCBjaGFyICpjbWQgKQoreworCWNoYXIgKmFyZzsKKwl1bnNpZ25lZCBpOworCisJaW1hcC0+Y2FwcyA9IDB4ODAwMDAwMDA7CisJd2hpbGUgKChhcmcgPSBuZXh0X2FyZyggJmNtZCApKSkKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2FwX2xpc3QpOyBpKyspCisJCQlpZiAoIXN0cmNtcCggY2FwX2xpc3RbaV0sIGFyZyApKQorCQkJCWltYXAtPmNhcHMgfD0gMSA8PCBpOworCWltYXAtPnJjYXBzID0gaW1hcC0+Y2FwczsKK30KKworc3RhdGljIGludAorcGFyc2VfcmVzcG9uc2VfY29kZSggaW1hcF9zdG9yZV90ICpjdHgsIHN0cnVjdCBpbWFwX2NtZF9jYiAqY2IsIGNoYXIgKnMgKQoreworCWltYXBfdCAqaW1hcCA9IGN0eC0+aW1hcDsKKwljaGFyICphcmcsICpwOworCisJaWYgKCpzICE9ICdbJykKKwkJcmV0dXJuIFJFU1BfT0s7CQkvKiBubyByZXNwb25zZSBjb2RlICovCisJcysrOworCWlmICghKHAgPSBzdHJjaHIoIHMsICddJyApKSkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBtYWxmb3JtZWQgcmVzcG9uc2UgY29kZVxuIiApOworCQlyZXR1cm4gUkVTUF9CQUQ7CisJfQorCSpwKysgPSAwOworCWFyZyA9IG5leHRfYXJnKCAmcyApOworCWlmICghc3RyY21wKCAiVUlEVkFMSURJVFkiLCBhcmcgKSkgeworCQlpZiAoIShhcmcgPSBuZXh0X2FyZyggJnMgKSkgfHwgIShjdHgtPmdlbi51aWR2YWxpZGl0eSA9IGF0b2koIGFyZyApKSkgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogbWFsZm9ybWVkIFVJRFZBTElESVRZIHN0YXR1c1xuIiApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKCAiVUlETkVYVCIsIGFyZyApKSB7CisJCWlmICghKGFyZyA9IG5leHRfYXJnKCAmcyApKSB8fCAhKGltYXAtPnVpZG5leHQgPSBhdG9pKCBhcmcgKSkpIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG1hbGZvcm1lZCBORVhUVUlEIHN0YXR1c1xuIiApOworCQkJcmV0dXJuIFJFU1BfQkFEOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKCAiQ0FQQUJJTElUWSIsIGFyZyApKSB7CisJCXBhcnNlX2NhcGFiaWxpdHkoIGltYXAsIHMgKTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoICJBTEVSVCIsIGFyZyApKSB7CisJCS8qIFJGQzIwNjAgc2F5cyB0aGF0IHRoZXNlIG1lc3NhZ2VzIE1VU1QgYmUgZGlzcGxheWVkCisJCSAqIHRvIHRoZSB1c2VyCisJCSAqLworCQlmb3IgKDsgaXNzcGFjZSggKHVuc2lnbmVkIGNoYXIpKnAgKTsgcCsrKTsKKwkJZnByaW50Ziggc3RkZXJyLCAiKioqIElNQVAgQUxFUlQgKioqICVzXG4iLCBwICk7CisJfSBlbHNlIGlmIChjYiAmJiBjYi0+Y3R4ICYmICFzdHJjbXAoICJBUFBFTkRVSUQiLCBhcmcgKSkgeworCQlpZiAoIShhcmcgPSBuZXh0X2FyZyggJnMgKSkgfHwgIShjdHgtPmdlbi51aWR2YWxpZGl0eSA9IGF0b2koIGFyZyApKSB8fAorCQkgICAgIShhcmcgPSBuZXh0X2FyZyggJnMgKSkgfHwgISgqKGludCAqKWNiLT5jdHggPSBhdG9pKCBhcmcgKSkpCisJCXsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG1hbGZvcm1lZCBBUFBFTkRVSUQgc3RhdHVzXG4iICk7CisJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCX0KKwl9CisJcmV0dXJuIFJFU1BfT0s7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9jbWRfcmVzdWx0KCBpbWFwX3N0b3JlX3QgKmN0eCwgc3RydWN0IGltYXBfY21kICp0Y21kICkKK3sKKwlpbWFwX3QgKmltYXAgPSBjdHgtPmltYXA7CisJc3RydWN0IGltYXBfY21kICpjbWRwLCAqKnBjbWRwLCAqbmNtZHA7CisJY2hhciAqY21kLCAqYXJnLCAqYXJnMSwgKnA7CisJaW50IG4sIHJlc3AsIHJlc3AyLCB0YWc7CisKKwlmb3IgKDs7KSB7CisJCWlmIChidWZmZXJfZ2V0cyggJmltYXAtPmJ1ZiwgJmNtZCApKQorCQkJcmV0dXJuIFJFU1BfQkFEOworCisJCWFyZyA9IG5leHRfYXJnKCAmY21kICk7CisJCWlmICgqYXJnID09ICcqJykgeworCQkJYXJnID0gbmV4dF9hcmcoICZjbWQgKTsKKwkJCWlmICghYXJnKSB7CisJCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5hYmxlIHRvIHBhcnNlIHVudGFnZ2VkIHJlc3BvbnNlXG4iICk7CisJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJfQorCisJCQlpZiAoIXN0cmNtcCggIk5BTUVTUEFDRSIsIGFyZyApKSB7CisJCQkJaW1hcC0+bnNfcGVyc29uYWwgPSBwYXJzZV9saXN0KCAmY21kICk7CisJCQkJaW1hcC0+bnNfb3RoZXIgPSBwYXJzZV9saXN0KCAmY21kICk7CisJCQkJaW1hcC0+bnNfc2hhcmVkID0gcGFyc2VfbGlzdCggJmNtZCApOworCQkJfSBlbHNlIGlmICghc3RyY21wKCAiT0siLCBhcmcgKSB8fCAhc3RyY21wKCAiQkFEIiwgYXJnICkgfHwKKwkJCQkgICAhc3RyY21wKCAiTk8iLCBhcmcgKSB8fCAhc3RyY21wKCAiQllFIiwgYXJnICkpIHsKKwkJCQlpZiAoKHJlc3AgPSBwYXJzZV9yZXNwb25zZV9jb2RlKCBjdHgsIE5VTEwsIGNtZCApKSAhPSBSRVNQX09LKQorCQkJCQlyZXR1cm4gcmVzcDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcCggIkNBUEFCSUxJVFkiLCBhcmcgKSkKKwkJCQlwYXJzZV9jYXBhYmlsaXR5KCBpbWFwLCBjbWQgKTsKKwkJCWVsc2UgaWYgKChhcmcxID0gbmV4dF9hcmcoICZjbWQgKSkpIHsKKwkJCQlpZiAoIXN0cmNtcCggIkVYSVNUUyIsIGFyZzEgKSkKKwkJCQkJY3R4LT5nZW4uY291bnQgPSBhdG9pKCBhcmcgKTsKKwkJCQllbHNlIGlmICghc3RyY21wKCAiUkVDRU5UIiwgYXJnMSApKQorCQkJCQljdHgtPmdlbi5yZWNlbnQgPSBhdG9pKCBhcmcgKTsKKwkJCX0gZWxzZSB7CisJCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5hYmxlIHRvIHBhcnNlIHVudGFnZ2VkIHJlc3BvbnNlXG4iICk7CisJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJfQorCQl9IGVsc2UgaWYgKCFpbWFwLT5pbl9wcm9ncmVzcykgeworCQkJZnByaW50Ziggc3RkZXJyLCAiSU1BUCBlcnJvcjogdW5leHBlY3RlZCByZXBseTogJXMgJXNcbiIsIGFyZywgY21kID8gY21kIDogIiIgKTsKKwkJCXJldHVybiBSRVNQX0JBRDsKKwkJfSBlbHNlIGlmICgqYXJnID09ICcrJykgeworCQkJLyogVGhpcyBjYW4gaGFwcGVuIG9ubHkgd2l0aCB0aGUgbGFzdCBjb21tYW5kIHVuZGVyd2F5LCBhcworCQkJICAgaXQgZW5mb3JjZXMgYSByb3VuZC10cmlwLiAqLworCQkJY21kcCA9IChzdHJ1Y3QgaW1hcF9jbWQgKikoKGNoYXIgKilpbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgLQorCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBpbWFwX2NtZCwgbmV4dCkpOworCQkJaWYgKGNtZHAtPmNiLmRhdGEpIHsKKwkJCQluID0gc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssIGNtZHAtPmNiLmRhdGEsIGNtZHAtPmNiLmRsZW4gKTsKKwkJCQlmcmVlKCBjbWRwLT5jYi5kYXRhICk7CisJCQkJY21kcC0+Y2IuZGF0YSA9IE5VTEw7CisJCQkJaWYgKG4gIT0gKGludCljbWRwLT5jYi5kbGVuKQorCQkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9IGVsc2UgaWYgKGNtZHAtPmNiLmNvbnQpIHsKKwkJCQlpZiAoY21kcC0+Y2IuY29udCggY3R4LCBjbWRwLCBjbWQgKSkKKwkJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmV4cGVjdGVkIGNvbW1hbmQgY29udGludWF0aW9uIHJlcXVlc3RcbiIgKTsKKwkJCQlyZXR1cm4gUkVTUF9CQUQ7CisJCQl9CisJCQlpZiAoc29ja2V0X3dyaXRlKCAmaW1hcC0+YnVmLnNvY2ssICJcclxuIiwgMiApICE9IDIpCisJCQkJcmV0dXJuIFJFU1BfQkFEOworCQkJaWYgKCFjbWRwLT5jYi5jb250KQorCQkJCWltYXAtPmxpdGVyYWxfcGVuZGluZyA9IDA7CisJCQlpZiAoIXRjbWQpCisJCQkJcmV0dXJuIERSVl9PSzsKKwkJfSBlbHNlIHsKKwkJCXRhZyA9IGF0b2koIGFyZyApOworCQkJZm9yIChwY21kcCA9ICZpbWFwLT5pbl9wcm9ncmVzczsgKGNtZHAgPSAqcGNtZHApOyBwY21kcCA9ICZjbWRwLT5uZXh0KQorCQkJCWlmIChjbWRwLT50YWcgPT0gdGFnKQorCQkJCQlnb3RvIGdvdHRhZzsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IHVuZXhwZWN0ZWQgdGFnICVzXG4iLCBhcmcgKTsKKwkJCXJldHVybiBSRVNQX0JBRDsKKwkJICBnb3R0YWc6CisJCQlpZiAoISgqcGNtZHAgPSBjbWRwLT5uZXh0KSkKKwkJCQlpbWFwLT5pbl9wcm9ncmVzc19hcHBlbmQgPSBwY21kcDsKKwkJCWltYXAtPm51bV9pbl9wcm9ncmVzcy0tOworCQkJaWYgKGNtZHAtPmNiLmNvbnQgfHwgY21kcC0+Y2IuZGF0YSkKKwkJCQlpbWFwLT5saXRlcmFsX3BlbmRpbmcgPSAwOworCQkJYXJnID0gbmV4dF9hcmcoICZjbWQgKTsKKwkJCWlmICghc3RyY21wKCAiT0siLCBhcmcgKSkKKwkJCQlyZXNwID0gRFJWX09LOworCQkJZWxzZSB7CisJCQkJaWYgKCFzdHJjbXAoICJOTyIsIGFyZyApKSB7CisJCQkJCWlmIChjbWRwLT5jYi5jcmVhdGUgJiYgY21kICYmIChjbWRwLT5jYi50cnljcmVhdGUgfHwgIW1lbWNtcCggY21kLCAiW1RSWUNSRUFURV0iLCAxMSApKSkgeyAvKiBTRUxFQ1QsIEFQUEVORCBvciBVSUQgQ09QWSAqLworCQkJCQkJcCA9IHN0cmNociggY21kcC0+Y21kLCAnIicgKTsKKwkJCQkJCWlmICghaXNzdWVfaW1hcF9jbWQoIGN0eCwgTlVMTCwgIkNSRUFURSBcIiUuKnNcIiIsIHN0cmNociggcCArIDEsICciJyApIC0gcCArIDEsIHAgKSkgeworCQkJCQkJCXJlc3AgPSBSRVNQX0JBRDsKKwkJCQkJCQlnb3RvIG5vcm1hbDsKKwkJCQkJCX0KKwkJCQkJCS8qIG5vdCB3YWl0aW5nIGhlcmUgdmlvbGF0ZXMgdGhlIHNwZWMsIGJ1dCBhIHNlcnZlciB0aGF0IGRvZXMgbm90CisJCQkJCQkgICBncm9rIHRoaXMgbm9uZXRoZWxlc3MgdmlvbGF0ZXMgaXQgdG9vLiAqLworCQkJCQkJY21kcC0+Y2IuY3JlYXRlID0gMDsKKwkJCQkJCWlmICghKG5jbWRwID0gaXNzdWVfaW1hcF9jbWQoIGN0eCwgJmNtZHAtPmNiLCAiJXMiLCBjbWRwLT5jbWQgKSkpIHsKKwkJCQkJCQlyZXNwID0gUkVTUF9CQUQ7CisJCQkJCQkJZ290byBub3JtYWw7CisJCQkJCQl9CisJCQkJCQlmcmVlKCBjbWRwLT5jbWQgKTsKKwkJCQkJCWZyZWUoIGNtZHAgKTsKKwkJCQkJCWlmICghdGNtZCkKKwkJCQkJCQlyZXR1cm4gMDsJLyogaWdub3JlZCAqLworCQkJCQkJaWYgKGNtZHAgPT0gdGNtZCkKKwkJCQkJCQl0Y21kID0gbmNtZHA7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlyZXNwID0gUkVTUF9OTzsKKwkJCQl9IGVsc2UgLyppZiAoIXN0cmNtcCggIkJBRCIsIGFyZyApKSovCisJCQkJCXJlc3AgPSBSRVNQX0JBRDsKKwkJCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGNvbW1hbmQgJyVzJyByZXR1cm5lZCByZXNwb25zZSAoJXMpIC0gJXNcbiIsCisJCQkJCSBtZW1jbXAgKGNtZHAtPmNtZCwgIkxPR0lOIiwgNSkgPworCQkJCQkJCWNtZHAtPmNtZCA6ICJMT0dJTiA8dXNlcj4gPHBhc3M+IiwKKwkJCQkJCQlhcmcsIGNtZCA/IGNtZCA6ICIiKTsKKwkJCX0KKwkJCWlmICgocmVzcDIgPSBwYXJzZV9yZXNwb25zZV9jb2RlKCBjdHgsICZjbWRwLT5jYiwgY21kICkpID4gcmVzcCkKKwkJCQlyZXNwID0gcmVzcDI7CisJCSAgbm9ybWFsOgorCQkJaWYgKGNtZHAtPmNiLmRvbmUpCisJCQkJY21kcC0+Y2IuZG9uZSggY3R4LCBjbWRwLCByZXNwICk7CisJCQlpZiAoY21kcC0+Y2IuZGF0YSkKKwkJCQlmcmVlKCBjbWRwLT5jYi5kYXRhICk7CisJCQlmcmVlKCBjbWRwLT5jbWQgKTsKKwkJCWZyZWUoIGNtZHAgKTsKKwkJCWlmICghdGNtZCB8fCB0Y21kID09IGNtZHApCisJCQkJcmV0dXJuIHJlc3A7CisJCX0KKwl9CisJLyogbm90IHJlYWNoZWQgKi8KK30KKworc3RhdGljIHZvaWQKK2ltYXBfY2xvc2Vfc2VydmVyKCBpbWFwX3N0b3JlX3QgKmljdHggKQoreworCWltYXBfdCAqaW1hcCA9IGljdHgtPmltYXA7CisKKwlpZiAoaW1hcC0+YnVmLnNvY2suZmQgIT0gLTEpIHsKKwkJaW1hcF9leGVjKCBpY3R4LCBOVUxMLCAiTE9HT1VUIiApOworCQljbG9zZSggaW1hcC0+YnVmLnNvY2suZmQgKTsKKwl9CisJZnJlZV9saXN0KCBpbWFwLT5uc19wZXJzb25hbCApOworCWZyZWVfbGlzdCggaW1hcC0+bnNfb3RoZXIgKTsKKwlmcmVlX2xpc3QoIGltYXAtPm5zX3NoYXJlZCApOworCWZyZWUoIGltYXAgKTsKK30KKworc3RhdGljIHZvaWQKK2ltYXBfY2xvc2Vfc3RvcmUoIHN0b3JlX3QgKmN0eCApCit7CisJaW1hcF9jbG9zZV9zZXJ2ZXIoIChpbWFwX3N0b3JlX3QgKiljdHggKTsKKwlmcmVlX2dlbmVyaWNfbWVzc2FnZXMoIGN0eC0+bXNncyApOworCWZyZWUoIGN0eCApOworfQorCitzdGF0aWMgc3RvcmVfdCAqCitpbWFwX29wZW5fc3RvcmUoIGltYXBfc2VydmVyX2NvbmZfdCAqc3J2YyApCit7CisJaW1hcF9zdG9yZV90ICpjdHg7CisJaW1hcF90ICppbWFwOworCWNoYXIgKmFyZywgKnJzcDsKKwlzdHJ1Y3QgaG9zdGVudCAqaGU7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHMsIGFbMl0sIHByZWF1dGg7CisJcGlkX3QgcGlkOworCisJY3R4ID0geGNhbGxvYyggc2l6ZW9mKCpjdHgpLCAxICk7CisKKwljdHgtPmltYXAgPSBpbWFwID0geGNhbGxvYyggc2l6ZW9mKCppbWFwKSwgMSApOworCWltYXAtPmJ1Zi5zb2NrLmZkID0gLTE7CisJaW1hcC0+aW5fcHJvZ3Jlc3NfYXBwZW5kID0gJmltYXAtPmluX3Byb2dyZXNzOworCisJLyogb3BlbiBjb25uZWN0aW9uIHRvIElNQVAgc2VydmVyICovCisKKwlpZiAoc3J2Yy0+dHVubmVsKSB7CisJCWluZm8oICJTdGFydGluZyB0dW5uZWwgJyVzJy4uLiAiLCBzcnZjLT50dW5uZWwgKTsKKworCQlpZiAoc29ja2V0cGFpciggUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIGEgKSkgeworCQkJcGVycm9yKCAic29ja2V0cGFpciIgKTsKKwkJCWV4aXQoIDEgKTsKKwkJfQorCisJCXBpZCA9IGZvcmsoKTsKKwkJaWYgKHBpZCA8IDApCisJCQlfZXhpdCggMTI3ICk7CisJCWlmICghcGlkKSB7CisJCQlpZiAoZHVwMiggYVswXSwgMCApID09IC0xIHx8IGR1cDIoIGFbMF0sIDEgKSA9PSAtMSkKKwkJCQlfZXhpdCggMTI3ICk7CisJCQljbG9zZSggYVswXSApOworCQkJY2xvc2UoIGFbMV0gKTsKKwkJCWV4ZWNsKCAiL2Jpbi9zaCIsICJzaCIsICItYyIsIHNydmMtPnR1bm5lbCwgTlVMTCApOworCQkJX2V4aXQoIDEyNyApOworCQl9CisKKwkJY2xvc2UgKGFbMF0pOworCisJCWltYXAtPmJ1Zi5zb2NrLmZkID0gYVsxXTsKKworCQlpbmZvKCAib2tcbiIgKTsKKwl9IGVsc2UgeworCQltZW1zZXQoICZhZGRyLCAwLCBzaXplb2YoYWRkcikgKTsKKwkJYWRkci5zaW5fcG9ydCA9IGh0b25zKCBzcnZjLT5wb3J0ICk7CisJCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKwkJaW5mbyggIlJlc29sdmluZyAlcy4uLiAiLCBzcnZjLT5ob3N0ICk7CisJCWhlID0gZ2V0aG9zdGJ5bmFtZSggc3J2Yy0+aG9zdCApOworCQlpZiAoIWhlKSB7CisJCQlwZXJyb3IoICJnZXRob3N0YnluYW1lIiApOworCQkJZ290byBiYWlsOworCQl9CisJCWluZm8oICJva1xuIiApOworCisJCWFkZHIuc2luX2FkZHIuc19hZGRyID0gKigoaW50ICopIGhlLT5oX2FkZHJfbGlzdFswXSk7CisKKwkJcyA9IHNvY2tldCggUEZfSU5FVCwgU09DS19TVFJFQU0sIDAgKTsKKworCQlpbmZvKCAiQ29ubmVjdGluZyB0byAlczolaHUuLi4gIiwgaW5ldF9udG9hKCBhZGRyLnNpbl9hZGRyICksIG50b2hzKCBhZGRyLnNpbl9wb3J0ICkgKTsKKwkJaWYgKGNvbm5lY3QoIHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpICkpIHsKKwkJCWNsb3NlKCBzICk7CisJCQlwZXJyb3IoICJjb25uZWN0IiApOworCQkJZ290byBiYWlsOworCQl9CisJCWluZm8oICJva1xuIiApOworCisJCWltYXAtPmJ1Zi5zb2NrLmZkID0gczsKKworCX0KKworCS8qIHJlYWQgdGhlIGdyZWV0aW5nIHN0cmluZyAqLworCWlmIChidWZmZXJfZ2V0cyggJmltYXAtPmJ1ZiwgJnJzcCApKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IG5vIGdyZWV0aW5nIHJlc3BvbnNlXG4iICk7CisJCWdvdG8gYmFpbDsKKwl9CisJYXJnID0gbmV4dF9hcmcoICZyc3AgKTsKKwlpZiAoIWFyZyB8fCAqYXJnICE9ICcqJyB8fCAoYXJnID0gbmV4dF9hcmcoICZyc3AgKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiBpbnZhbGlkIGdyZWV0aW5nIHJlc3BvbnNlXG4iICk7CisJCWdvdG8gYmFpbDsKKwl9CisJcHJlYXV0aCA9IDA7CisJaWYgKCFzdHJjbXAoICJQUkVBVVRIIiwgYXJnICkpCisJCXByZWF1dGggPSAxOworCWVsc2UgaWYgKHN0cmNtcCggIk9LIiwgYXJnICkgIT0gMCkgeworCQlmcHJpbnRmKCBzdGRlcnIsICJJTUFQIGVycm9yOiB1bmtub3duIGdyZWV0aW5nIHJlc3BvbnNlXG4iICk7CisJCWdvdG8gYmFpbDsKKwl9CisJcGFyc2VfcmVzcG9uc2VfY29kZSggY3R4LCBOVUxMLCByc3AgKTsKKwlpZiAoIWltYXAtPmNhcHMgJiYgaW1hcF9leGVjKCBjdHgsIE5VTEwsICJDQVBBQklMSVRZIiApICE9IFJFU1BfT0spCisJCWdvdG8gYmFpbDsKKworCWlmICghcHJlYXV0aCkgeworCisJCWluZm8gKCJMb2dnaW5nIGluLi4uXG4iKTsKKwkJaWYgKCFzcnZjLT51c2VyKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJTa2lwcGluZyBzZXJ2ZXIgJXMsIG5vIHVzZXJcbiIsIHNydmMtPmhvc3QgKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlpZiAoIXNydmMtPnBhc3MpIHsKKwkJCWNoYXIgcHJvbXB0WzgwXTsKKwkJCXNwcmludGYoIHByb21wdCwgIlBhc3N3b3JkICglc0Alcyk6ICIsIHNydmMtPnVzZXIsIHNydmMtPmhvc3QgKTsKKwkJCWFyZyA9IGdldHBhc3MoIHByb21wdCApOworCQkJaWYgKCFhcmcpIHsKKwkJCQlwZXJyb3IoICJnZXRwYXNzIiApOworCQkJCWV4aXQoIDEgKTsKKwkJCX0KKwkJCWlmICghKmFyZykgeworCQkJCWZwcmludGYoIHN0ZGVyciwgIlNraXBwaW5nIGFjY291bnQgJXNAJXMsIG5vIHBhc3N3b3JkXG4iLCBzcnZjLT51c2VyLCBzcnZjLT5ob3N0ICk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJLyoKKwkJCSAqIGdldHBhc3MoKSByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIuICBtYWtlIGEgY29weQorCQkJICogZm9yIGxvbmcgdGVybSBzdG9yYWdlLgorCQkJICovCisJCQlzcnZjLT5wYXNzID0gc3RyZHVwKCBhcmcgKTsKKwkJfQorCQlpZiAoQ0FQKE5PTE9HSU4pKSB7CisJCQlmcHJpbnRmKCBzdGRlcnIsICJTa2lwcGluZyBhY2NvdW50ICVzQCVzLCBzZXJ2ZXIgZm9yYmlkcyBMT0dJTlxuIiwgc3J2Yy0+dXNlciwgc3J2Yy0+aG9zdCApOworCQkJZ290byBiYWlsOworCQl9CisJCXdhcm4oICIqKiogSU1BUCBXYXJuaW5nICoqKiBQYXNzd29yZCBpcyBiZWluZyBzZW50IGluIHRoZSBjbGVhclxuIiApOworCQlpZiAoaW1hcF9leGVjKCBjdHgsIE5VTEwsICJMT0dJTiBcIiVzXCIgXCIlc1wiIiwgc3J2Yy0+dXNlciwgc3J2Yy0+cGFzcyApICE9IFJFU1BfT0spIHsKKwkJCWZwcmludGYoIHN0ZGVyciwgIklNQVAgZXJyb3I6IExPR0lOIGZhaWxlZFxuIiApOworCQkJZ290byBiYWlsOworCQl9CisJfSAvKiAhcHJlYXV0aCAqLworCisJY3R4LT5wcmVmaXggPSAiIjsKKwljdHgtPnRyYXNobmMgPSAxOworCXJldHVybiAoc3RvcmVfdCAqKWN0eDsKKworICBiYWlsOgorCWltYXBfY2xvc2Vfc3RvcmUoICZjdHgtPmdlbiApOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitpbWFwX21ha2VfZmxhZ3MoIGludCBmbGFncywgY2hhciAqYnVmICkKK3sKKwljb25zdCBjaGFyICpzOworCXVuc2lnbmVkIGksIGQ7CisKKwlmb3IgKGkgPSBkID0gMDsgaSA8IEFSUkFZX1NJWkUoRmxhZ3MpOyBpKyspCisJCWlmIChmbGFncyAmICgxIDw8IGkpKSB7CisJCQlidWZbZCsrXSA9ICcgJzsKKwkJCWJ1ZltkKytdID0gJ1xcJzsKKwkJCWZvciAocyA9IEZsYWdzW2ldOyAqczsgcysrKQorCQkJCWJ1ZltkKytdID0gKnM7CisJCX0KKwlidWZbMF0gPSAnKCc7CisJYnVmW2QrK10gPSAnKSc7CisJcmV0dXJuIGQ7Cit9CisKKyNkZWZpbmUgVFVJREwgOAorCitzdGF0aWMgaW50CitpbWFwX3N0b3JlX21zZyggc3RvcmVfdCAqZ2N0eCwgbXNnX2RhdGFfdCAqZGF0YSwgaW50ICp1aWQgKQoreworCWltYXBfc3RvcmVfdCAqY3R4ID0gKGltYXBfc3RvcmVfdCAqKWdjdHg7CisJaW1hcF90ICppbWFwID0gY3R4LT5pbWFwOworCXN0cnVjdCBpbWFwX2NtZF9jYiBjYjsKKwljaGFyICpmbWFwLCAqYnVmOworCWNvbnN0IGNoYXIgKnByZWZpeCwgKmJveDsKKwlpbnQgcmV0LCBpLCBqLCBkLCBsZW4sIGV4dHJhLCBub2NyOworCWludCBzdGFydCwgc2JyZWFrID0gMCwgZWJyZWFrID0gMDsKKwljaGFyIGZsYWdzdHJbMTI4XSwgdHVpZFtUVUlETCAqIDIgKyAxXTsKKworCW1lbXNldCggJmNiLCAwLCBzaXplb2YoY2IpICk7CisKKwlmbWFwID0gZGF0YS0+ZGF0YTsKKwlsZW4gPSBkYXRhLT5sZW47CisJbm9jciA9ICFkYXRhLT5jcmxmOworCWV4dHJhID0gMCwgaSA9IDA7CisJaWYgKCFDQVAoVUlEUExVUykgJiYgdWlkKSB7CisJICBubG9vcDoKKwkJc3RhcnQgPSBpOworCQl3aGlsZSAoaSA8IGxlbikKKwkJCWlmIChmbWFwW2krK10gPT0gJ1xuJykgeworCQkJCWV4dHJhICs9IG5vY3I7CisJCQkJaWYgKGkgLSAyICsgbm9jciA9PSBzdGFydCkgeworCQkJCQlzYnJlYWsgPSBlYnJlYWsgPSBpIC0gMiArIG5vY3I7CisJCQkJCWdvdG8gbWt0aWQ7CisJCQkJfQorCQkJCWlmICghbWVtY21wKCBmbWFwICsgc3RhcnQsICJYLVRVSUQ6ICIsIDggKSkgeworCQkJCQlleHRyYSAtPSAoZWJyZWFrID0gaSkgLSAoc2JyZWFrID0gc3RhcnQpICsgbm9jcjsKKwkJCQkJZ290byBta3RpZDsKKwkJCQl9CisJCQkJZ290byBubG9vcDsKKwkJCX0KKwkJLyogaW52YWxpZCBtZXNzYWdlICovCisJCWZyZWUoIGZtYXAgKTsKKwkJcmV0dXJuIERSVl9NU0dfQkFEOworCSBta3RpZDoKKwkJZm9yIChqID0gMDsgaiA8IFRVSURMOyBqKyspCisJCQlzcHJpbnRmKCB0dWlkICsgaiAqIDIsICIlMDJ4IiwgYXJjNF9nZXRieXRlKCkgKTsKKwkJZXh0cmEgKz0gOCArIFRVSURMICogMiArIDI7CisJfQorCWlmIChub2NyKQorCQlmb3IgKDsgaSA8IGxlbjsgaSsrKQorCQkJaWYgKGZtYXBbaV0gPT0gJ1xuJykKKwkJCQlleHRyYSsrOworCisJY2IuZGxlbiA9IGxlbiArIGV4dHJhOworCWJ1ZiA9IGNiLmRhdGEgPSB4bWFsbG9jKCBjYi5kbGVuICk7CisJaSA9IDA7CisJaWYgKCFDQVAoVUlEUExVUykgJiYgdWlkKSB7CisJCWlmIChub2NyKSB7CisJCQlmb3IgKDsgaSA8IHNicmVhazsgaSsrKQorCQkJCWlmIChmbWFwW2ldID09ICdcbicpIHsKKwkJCQkJKmJ1ZisrID0gJ1xyJzsKKwkJCQkJKmJ1ZisrID0gJ1xuJzsKKwkJCQl9IGVsc2UKKwkJCQkJKmJ1ZisrID0gZm1hcFtpXTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweSggYnVmLCBmbWFwLCBzYnJlYWsgKTsKKwkJCWJ1ZiArPSBzYnJlYWs7CisJCX0KKwkJbWVtY3B5KCBidWYsICJYLVRVSUQ6ICIsIDggKTsKKwkJYnVmICs9IDg7CisJCW1lbWNweSggYnVmLCB0dWlkLCBUVUlETCAqIDIgKTsKKwkJYnVmICs9IFRVSURMICogMjsKKwkJKmJ1ZisrID0gJ1xyJzsKKwkJKmJ1ZisrID0gJ1xuJzsKKwkJaSA9IGVicmVhazsKKwl9CisJaWYgKG5vY3IpIHsKKwkJZm9yICg7IGkgPCBsZW47IGkrKykKKwkJCWlmIChmbWFwW2ldID09ICdcbicpIHsKKwkJCQkqYnVmKysgPSAnXHInOworCQkJCSpidWYrKyA9ICdcbic7CisJCQl9IGVsc2UKKwkJCQkqYnVmKysgPSBmbWFwW2ldOworCX0gZWxzZQorCQltZW1jcHkoIGJ1ZiwgZm1hcCArIGksIGxlbiAtIGkgKTsKKworCWZyZWUoIGZtYXAgKTsKKworCWQgPSAwOworCWlmIChkYXRhLT5mbGFncykgeworCQlkID0gaW1hcF9tYWtlX2ZsYWdzKCBkYXRhLT5mbGFncywgZmxhZ3N0ciApOworCQlmbGFnc3RyW2QrK10gPSAnICc7CisJfQorCWZsYWdzdHJbZF0gPSAwOworCisJaWYgKCF1aWQpIHsKKwkJYm94ID0gZ2N0eC0+Y29uZi0+dHJhc2g7CisJCXByZWZpeCA9IGN0eC0+cHJlZml4OworCQljYi5jcmVhdGUgPSAxOworCQlpZiAoY3R4LT50cmFzaG5jKQorCQkJaW1hcC0+Y2FwcyA9IGltYXAtPnJjYXBzICYgfigxIDw8IExJVEVSQUxQTFVTKTsKKwl9IGVsc2UgeworCQlib3ggPSBnY3R4LT5uYW1lOworCQlwcmVmaXggPSAhc3RyY21wKCBib3gsICJJTkJPWCIgKSA/ICIiIDogY3R4LT5wcmVmaXg7CisJCWNiLmNyZWF0ZSA9IDA7CisJfQorCWNiLmN0eCA9IHVpZDsKKwlyZXQgPSBpbWFwX2V4ZWNfbSggY3R4LCAmY2IsICJBUFBFTkQgXCIlcyVzXCIgJXMiLCBwcmVmaXgsIGJveCwgZmxhZ3N0ciApOworCWltYXAtPmNhcHMgPSBpbWFwLT5yY2FwczsKKwlpZiAocmV0ICE9IERSVl9PSykKKwkJcmV0dXJuIHJldDsKKwlpZiAoIXVpZCkKKwkJY3R4LT50cmFzaG5jID0gMDsKKwllbHNlCisJCWdjdHgtPmNvdW50Kys7CisKKwlyZXR1cm4gRFJWX09LOworfQorCisjZGVmaW5lIENIVU5LU0laRSAweDEwMDAKKworc3RhdGljIGludAorcmVhZF9tZXNzYWdlKCBGSUxFICpmLCBtc2dfZGF0YV90ICptc2cgKQoreworCWludCBsZW4sIHI7CisKKwltZW1zZXQoIG1zZywgMCwgc2l6ZW9mICptc2cgKTsKKwlsZW4gPSBDSFVOS1NJWkU7CisJbXNnLT5kYXRhID0geG1hbGxvYyggbGVuKzEgKTsKKwltc2ctPmRhdGFbMF0gPSAwOworCisJd2hpbGUoIWZlb2YoIGYgKSkgeworCQlpZiAobXNnLT5sZW4gPj0gbGVuKSB7CisJCQl2b2lkICpwOworCQkJbGVuICs9IENIVU5LU0laRTsKKwkJCXAgPSB4cmVhbGxvYyhtc2ctPmRhdGEsIGxlbisxKTsKKwkJCWlmICghcCkKKwkJCQlicmVhazsKKwkJCW1zZy0+ZGF0YSA9IHA7CisJCX0KKwkJciA9IGZyZWFkKCAmbXNnLT5kYXRhW21zZy0+bGVuXSwgMSwgbGVuIC0gbXNnLT5sZW4sIGYgKTsKKwkJaWYgKHIgPD0gMCkKKwkJCWJyZWFrOworCQltc2ctPmxlbiArPSByOworCX0KKwltc2ctPmRhdGFbbXNnLT5sZW5dID0gMDsKKwlyZXR1cm4gbXNnLT5sZW47Cit9CisKK3N0YXRpYyBpbnQKK2NvdW50X21lc3NhZ2VzKCBtc2dfZGF0YV90ICptc2cgKQoreworCWludCBjb3VudCA9IDA7CisJY2hhciAqcCA9IG1zZy0+ZGF0YTsKKworCXdoaWxlICgxKSB7CisJCWlmICghc3RybmNtcCggIkZyb20gIiwgcCwgNSApKSB7CisJCQljb3VudCsrOworCQkJcCArPSA1OworCQl9CisJCXAgPSBzdHJzdHIoIHArNSwgIlxuRnJvbSAiKTsKKwkJaWYgKCFwKQorCQkJYnJlYWs7CisJCXArKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitzcGxpdF9tc2coIG1zZ19kYXRhX3QgKmFsbF9tc2dzLCBtc2dfZGF0YV90ICptc2csIGludCAqb2ZzICkKK3sKKwljaGFyICpwLCAqZGF0YTsKKworCW1lbXNldCggbXNnLCAwLCBzaXplb2YgKm1zZyApOworCWlmICgqb2ZzID49IGFsbF9tc2dzLT5sZW4pCisJCXJldHVybiAwOworCisJZGF0YSA9ICZhbGxfbXNncy0+ZGF0YVsgKm9mcyBdOworCW1zZy0+bGVuID0gYWxsX21zZ3MtPmxlbiAtICpvZnM7CisKKwlpZiAobXNnLT5sZW4gPCA1IHx8IHN0cm5jbXAoIGRhdGEsICJGcm9tICIsIDUgKSkKKwkJcmV0dXJuIDA7CisKKwlwID0gc3Ryc3RyKCBkYXRhLCAiXG5Gcm9tICIgKTsKKwlpZiAocCkKKwkJbXNnLT5sZW4gPSAmcFsxXSAtIGRhdGE7CisKKwltc2ctPmRhdGEgPSB4bWFsbG9jKCBtc2ctPmxlbiArIDEgKTsKKwlpZiAoIW1zZy0+ZGF0YSkKKwkJcmV0dXJuIDA7CisKKwltZW1jcHkoIG1zZy0+ZGF0YSwgZGF0YSwgbXNnLT5sZW4gKTsKKwltc2ctPmRhdGFbIG1zZy0+bGVuIF0gPSAwOworCisJKm9mcyArPSBtc2ctPmxlbjsKKyAJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbWFwX3NlcnZlcl9jb25mX3Qgc2VydmVyID0KK3sKKwlOVUxMLAkvKiBuYW1lICovCisJTlVMTCwJLyogdHVubmVsICovCisJTlVMTCwJLyogaG9zdCAqLworCTAsCS8qIHBvcnQgKi8KKwlOVUxMLAkvKiB1c2VyICovCisJTlVMTCwJLyogcGFzcyAqLworfTsKKworc3RhdGljIGNoYXIgKmltYXBfZm9sZGVyOworCitzdGF0aWMgaW50CitnaXRfaW1hcF9jb25maWcoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCit7CisJY2hhciBpbWFwX2tleVtdID0gImltYXAuIjsKKworCWlmIChzdHJuY21wKCBrZXksIGltYXBfa2V5LCBzaXplb2YgaW1hcF9rZXkgLSAxICkpCisJCXJldHVybiAwOworCWtleSArPSBzaXplb2YgaW1hcF9rZXkgLSAxOworCisJaWYgKCFzdHJjbXAoICJmb2xkZXIiLCBrZXkgKSkgeworCQlpbWFwX2ZvbGRlciA9IHN0cmR1cCggdmFsICk7CisJfSBlbHNlIGlmICghc3RyY21wKCAiaG9zdCIsIGtleSApKSB7CisJCXsKKwkJCWlmICghc3RybmNtcCggImltYXA6IiwgdmFsLCA1ICkpCisJCQkJdmFsICs9IDU7CisJCQlpZiAoIXNlcnZlci5wb3J0KQorCQkJCXNlcnZlci5wb3J0ID0gMTQzOworCQl9CisJCWlmICghc3RybmNtcCggIi8vIiwgdmFsLCAyICkpCisJCQl2YWwgKz0gMjsKKwkJc2VydmVyLmhvc3QgPSBzdHJkdXAoIHZhbCApOworCX0KKwllbHNlIGlmICghc3RyY21wKCAidXNlciIsIGtleSApKQorCQlzZXJ2ZXIudXNlciA9IHN0cmR1cCggdmFsICk7CisJZWxzZSBpZiAoIXN0cmNtcCggInBhc3MiLCBrZXkgKSkKKwkJc2VydmVyLnBhc3MgPSBzdHJkdXAoIHZhbCApOworCWVsc2UgaWYgKCFzdHJjbXAoICJwb3J0Iiwga2V5ICkpCisJCXNlcnZlci5wb3J0ID0gZ2l0X2NvbmZpZ19pbnQoIGtleSwgdmFsICk7CisJZWxzZSBpZiAoIXN0cmNtcCggInR1bm5lbCIsIGtleSApKQorCQlzZXJ2ZXIudHVubmVsID0gc3RyZHVwKCB2YWwgKTsKKwlyZXR1cm4gMDsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwltc2dfZGF0YV90IGFsbF9tc2dzLCBtc2c7CisJc3RvcmVfdCAqY3R4ID0gTlVMTDsKKwlpbnQgdWlkID0gMDsKKwlpbnQgb2ZzID0gMDsKKwlpbnQgcjsKKwlpbnQgdG90YWwsIG4gPSAwOworCisJLyogaW5pdCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8KKwlhcmM0X2luaXQoKTsKKworCWdpdF9jb25maWcoIGdpdF9pbWFwX2NvbmZpZyApOworCisJaWYgKCFpbWFwX2ZvbGRlcikgeworCQlmcHJpbnRmKCBzdGRlcnIsICJubyBpbWFwIHN0b3JlIHNwZWNpZmllZFxuIiApOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiByZWFkIHRoZSBtZXNzYWdlcyAqLworCWlmICghcmVhZF9tZXNzYWdlKCBzdGRpbiwgJmFsbF9tc2dzICkpIHsKKwkJZnByaW50ZihzdGRlcnIsIm5vdGhpbmcgdG8gc2VuZFxuIik7CisJCXJldHVybiAxOworCX0KKworCXRvdGFsID0gY291bnRfbWVzc2FnZXMoICZhbGxfbXNncyApOworCWlmICghdG90YWwpIHsKKwkJZnByaW50ZihzdGRlcnIsIm5vIG1lc3NhZ2VzIHRvIHNlbmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiB3cml0ZSBpdCB0byB0aGUgaW1hcCBzZXJ2ZXIgKi8KKwljdHggPSBpbWFwX29wZW5fc3RvcmUoICZzZXJ2ZXIgKTsKKwlpZiAoIWN0eCkgeworCQlmcHJpbnRmKCBzdGRlcnIsImZhaWxlZCB0byBvcGVuIHN0b3JlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZnByaW50Ziggc3RkZXJyLCAic2VuZGluZyAlZCBtZXNzYWdlJXNcbiIsIHRvdGFsLCAodG90YWwhPTEpPyJzIjoiIiApOworCWN0eC0+bmFtZSA9IGltYXBfZm9sZGVyOworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHBlcmNlbnQgPSBuICogMTAwIC8gdG90YWw7CisJCWZwcmludGYoIHN0ZGVyciwgIiU0dSUlICglZC8lZCkgZG9uZVxyIiwgcGVyY2VudCwgbiwgdG90YWwgKTsKKwkJaWYgKCFzcGxpdF9tc2coICZhbGxfbXNncywgJm1zZywgJm9mcyApKQorCQkJYnJlYWs7CisJCXIgPSBpbWFwX3N0b3JlX21zZyggY3R4LCAmbXNnLCAmdWlkICk7CisJCWlmIChyICE9IERSVl9PSykgYnJlYWs7CisJCW4rKzsKKwl9CisJZnByaW50Ziggc3RkZXJyLCJcbiIgKTsKKworCWltYXBfY2xvc2Vfc3RvcmUoIGN0eCApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbmRleC1wYWNrLmMgYi9pbmRleC1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNjU5YwotLS0gL2Rldi9udWxsCisrKyBiL2luZGV4LXBhY2suYwpAQCAtMCwwICsxLDQ3MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiY3N1bS1maWxlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgaW5kZXhfcGFja191c2FnZVtdID0KKyJnaXQtaW5kZXgtcGFjayBbLW8gaW5kZXgtZmlsZV0gcGFjay1maWxlIjsKKworc3RydWN0IG9iamVjdF9lbnRyeQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwllbnVtIG9iamVjdF90eXBlIHJlYWxfdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworfTsKKworc3RydWN0IGRlbHRhX2VudHJ5Cit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqOworCXVuc2lnbmVkIGNoYXIgYmFzZV9zaGExWzIwXTsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYWNrX25hbWU7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFja19iYXNlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFja19zaXplOworc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkgKm9iamVjdHM7CitzdGF0aWMgc3RydWN0IGRlbHRhX2VudHJ5ICpkZWx0YXM7CitzdGF0aWMgaW50IG5yX29iamVjdHM7CitzdGF0aWMgaW50IG5yX2RlbHRhczsKKworc3RhdGljIHZvaWQgb3Blbl9wYWNrX2ZpbGUodm9pZCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlmZCA9IG9wZW4ocGFja19uYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJjYW5ub3Qgb3BlbiBwYWNrZmlsZSAnJXMnOiAlcyIsIHBhY2tfbmFtZSwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJaWYgKGZzdGF0KGZkLCAmc3QpKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJY2xvc2UoZmQpOworCQlkaWUoImNhbm5vdCBmc3RhdCBwYWNrZmlsZSAnJXMnOiAlcyIsIHBhY2tfbmFtZSwKKwkJICAgIHN0cmVycm9yKGVycikpOworCX0KKwlwYWNrX3NpemUgPSBzdC5zdF9zaXplOworCXBhY2tfYmFzZSA9IG1tYXAoTlVMTCwgcGFja19zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKHBhY2tfYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJY2xvc2UoZmQpOworCQlkaWUoImNhbm5vdCBtbWFwIHBhY2tmaWxlICclcyc6ICVzIiwgcGFja19uYW1lLAorCQkgICAgc3RyZXJyb3IoZXJyKSk7CisJfQorCWNsb3NlKGZkKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfcGFja19oZWFkZXIodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3QgcGFja19oZWFkZXIgKmhkcjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCVNIQV9DVFggY3R4OworCisJLyogRW5zdXJlIHRoZXJlIGFyZSBlbm91Z2ggYnl0ZXMgZm9yIHRoZSBoZWFkZXIgYW5kIGZpbmFsIFNIQTEgKi8KKwlpZiAocGFja19zaXplIDwgc2l6ZW9mKHN0cnVjdCBwYWNrX2hlYWRlcikgKyAyMCkKKwkJZGllKCJwYWNrZmlsZSAnJXMnIGlzIHRvbyBzbWFsbCIsIHBhY2tfbmFtZSk7CisKKwkvKiBIZWFkZXIgY29uc2lzdGVuY3kgY2hlY2sgKi8KKwloZHIgPSAodm9pZCAqKXBhY2tfYmFzZTsKKwlpZiAoaGRyLT5oZHJfc2lnbmF0dXJlICE9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKSkKKwkJZGllKCJwYWNrZmlsZSAnJXMnIHNpZ25hdHVyZSBtaXNtYXRjaCIsIHBhY2tfbmFtZSk7CisJaWYgKCFwYWNrX3ZlcnNpb25fb2soaGRyLT5oZHJfdmVyc2lvbikpCisJCWRpZSgicGFja2ZpbGUgJyVzJyB2ZXJzaW9uICVkIHVuc3VwcG9ydGVkIiwKKwkJICAgIHBhY2tfbmFtZSwgbnRvaGwoaGRyLT5oZHJfdmVyc2lvbikpOworCisJbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCisJLyogQ2hlY2sgcGFja2ZpbGUgaW50ZWdyaXR5ICovCisJU0hBMV9Jbml0KCZjdHgpOworCVNIQTFfVXBkYXRlKCZjdHgsIHBhY2tfYmFzZSwgcGFja19zaXplIC0gMjApOworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7CisJaWYgKG1lbWNtcChzaGExLCBwYWNrX2Jhc2UgKyBwYWNrX3NpemUgLSAyMCwgMjApKQorCQlkaWUoInBhY2tmaWxlICclcycgU0hBMSBtaXNtYXRjaCIsIHBhY2tfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJhZF9vYmplY3QodW5zaWduZWQgbG9uZyBvZmZzZXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwKKwkJICAgICAgIC4uLikgTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisKK3N0YXRpYyB2b2lkIGJhZF9vYmplY3QodW5zaWduZWQgbG9uZyBvZmZzZXQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgcGFyYW1zOworCWNoYXIgYnVmWzEwMjRdOworCisJdmFfc3RhcnQocGFyYW1zLCBmb3JtYXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmb3JtYXQsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7CisJZGllKCJwYWNrZmlsZSAnJXMnOiBiYWQgb2JqZWN0IGF0IG9mZnNldCAlbHU6ICVzIiwKKwkgICAgcGFja19uYW1lLCBvZmZzZXQsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfZW50cnlfZGF0YSh1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpjdXJyZW50X3BvcywgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgcGFja19saW1pdCA9IHBhY2tfc2l6ZSAtIDIwOworCXVuc2lnbmVkIGxvbmcgcG9zID0gKmN1cnJlbnRfcG9zOworCXpfc3RyZWFtIHN0cmVhbTsKKwl2b2lkICpidWYgPSB4bWFsbG9jKHNpemUpOworCisJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBwYWNrX2Jhc2UgKyBwb3M7CisJc3RyZWFtLmF2YWlsX2luID0gcGFja19saW1pdCAtIHBvczsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IGluZmxhdGUoJnN0cmVhbSwgMCk7CisJCWlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQorCQkJYnJlYWs7CisJCWlmIChyZXQgIT0gWl9PSykKKwkJCWJhZF9vYmplY3Qob2Zmc2V0LCAiaW5mbGF0ZSByZXR1cm5lZCAlZCIsIHJldCk7CisJfQorCWluZmxhdGVFbmQoJnN0cmVhbSk7CisJaWYgKHN0cmVhbS50b3RhbF9vdXQgIT0gc2l6ZSkKKwkJYmFkX29iamVjdChvZmZzZXQsICJzaXplIG1pc21hdGNoIChleHBlY3RlZCAlbHUsIGdvdCAlbHUpIiwKKwkJCSAgIHNpemUsIHN0cmVhbS50b3RhbF9vdXQpOworCSpjdXJyZW50X3BvcyA9IHBhY2tfbGltaXQgLSBzdHJlYW0uYXZhaWxfaW47CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19yYXdfZW50cnkodW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgICAgICBlbnVtIG9iamVjdF90eXBlICpvYmpfdHlwZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm9ial9zaXplLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqZGVsdGFfYmFzZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm5leHRfb2JqX29mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHBhY2tfbGltaXQgPSBwYWNrX3NpemUgLSAyMDsKKwl1bnNpZ25lZCBsb25nIHBvcyA9IG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyIGM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIHNoaWZ0OworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwl2b2lkICpkYXRhOworCisJYyA9IHBhY2tfYmFzZVtwb3MrK107CisJdHlwZSA9IChjID4+IDQpICYgNzsKKwlzaXplID0gKGMgJiAxNSk7CisJc2hpZnQgPSA0OworCXdoaWxlIChjICYgMHg4MCkgeworCQlpZiAocG9zID49IHBhY2tfbGltaXQpCisJCQliYWRfb2JqZWN0KG9mZnNldCwgIm9iamVjdCBleHRlbmRzIHBhc3QgZW5kIG9mIHBhY2siKTsKKwkJYyA9IHBhY2tfYmFzZVtwb3MrK107CisJCXNpemUgKz0gKGMgJiAweDdmVUwpIDw8IHNoaWZ0OworCQlzaGlmdCArPSA3OworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0JKX0RFTFRBOgorCQlpZiAocG9zICsgMjAgPj0gcGFja19saW1pdCkKKwkJCWJhZF9vYmplY3Qob2Zmc2V0LCAib2JqZWN0IGV4dGVuZHMgcGFzdCBlbmQgb2YgcGFjayIpOworCQltZW1jcHkoZGVsdGFfYmFzZSwgcGFja19iYXNlICsgcG9zLCAyMCk7CisJCXBvcyArPSAyMDsKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIE9CSl9DT01NSVQ6CisJY2FzZSBPQkpfVFJFRToKKwljYXNlIE9CSl9CTE9COgorCWNhc2UgT0JKX1RBRzoKKwkJZGF0YSA9IHVucGFja19lbnRyeV9kYXRhKG9mZnNldCwgJnBvcywgc2l6ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJhZF9vYmplY3Qob2Zmc2V0LCAiYmFkIG9iamVjdCB0eXBlICVkIiwgdHlwZSk7CisJfQorCisJKm9ial90eXBlID0gdHlwZTsKKwkqb2JqX3NpemUgPSBzaXplOworCSpuZXh0X29ial9vZmZzZXQgPSBwb3M7CisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9kZWx0YShjb25zdCB1bnNpZ25lZCBjaGFyICpiYXNlX3NoYTEpCit7CisJaW50IGZpcnN0ID0gMCwgbGFzdCA9IG5yX2RlbHRhczsKKworICAgICAgICB3aGlsZSAoZmlyc3QgPCBsYXN0KSB7CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSAoZmlyc3QgKyBsYXN0KSAvIDI7CisgICAgICAgICAgICAgICAgc3RydWN0IGRlbHRhX2VudHJ5ICpkZWx0YSA9ICZkZWx0YXNbbmV4dF07CisgICAgICAgICAgICAgICAgaW50IGNtcDsKKworICAgICAgICAgICAgICAgIGNtcCA9IG1lbWNtcChiYXNlX3NoYTEsIGRlbHRhLT5iYXNlX3NoYTEsIDIwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaXJzdCA9IG5leHQrMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLWZpcnN0LTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9kZWx0YXNfYmFzZWRfb25fc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpiYXNlX3NoYTEsCisJCQkJICAgICBpbnQgKmZpcnN0X2luZGV4LCBpbnQgKmxhc3RfaW5kZXgpCit7CisJaW50IGZpcnN0ID0gZmluZF9kZWx0YShiYXNlX3NoYTEpOworCWludCBsYXN0ID0gZmlyc3Q7CisJaW50IGVuZCA9IG5yX2RlbHRhcyAtIDE7CisKKwlpZiAoZmlyc3QgPCAwKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKGZpcnN0ID4gMCAmJiAhbWVtY21wKGRlbHRhc1tmaXJzdC0xXS5iYXNlX3NoYTEsIGJhc2Vfc2hhMSwgMjApKQorCQktLWZpcnN0OworCXdoaWxlIChsYXN0IDwgZW5kICYmICFtZW1jbXAoZGVsdGFzW2xhc3QrMV0uYmFzZV9zaGExLCBiYXNlX3NoYTEsIDIwKSkKKwkJKytsYXN0OworCSpmaXJzdF9pbmRleCA9IGZpcnN0OworCSpsYXN0X2luZGV4ID0gbGFzdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hhMV9vYmplY3QoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCVNIQV9DVFggY3R4OworCWNoYXIgaGVhZGVyWzUwXTsKKwlpbnQgaGVhZGVyX3NpemU7CisJY29uc3QgY2hhciAqdHlwZV9zdHI7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE9CSl9DT01NSVQ6IHR5cGVfc3RyID0gY29tbWl0X3R5cGU7IGJyZWFrOworCWNhc2UgT0JKX1RSRUU6ICAgdHlwZV9zdHIgPSB0cmVlX3R5cGU7IGJyZWFrOworCWNhc2UgT0JKX0JMT0I6ICAgdHlwZV9zdHIgPSBibG9iX3R5cGU7IGJyZWFrOworCWNhc2UgT0JKX1RBRzogICAgdHlwZV9zdHIgPSB0YWdfdHlwZTsgYnJlYWs7CisJZGVmYXVsdDoKKwkJZGllKCJiYWQgdHlwZSAlZCIsIHR5cGUpOworCX0KKworCWhlYWRlcl9zaXplID0gc3ByaW50ZihoZWFkZXIsICIlcyAlbHUiLCB0eXBlX3N0ciwgc2l6ZSkgKyAxOworCisJU0hBMV9Jbml0KCZjdHgpOworCVNIQTFfVXBkYXRlKCZjdHgsIGhlYWRlciwgaGVhZGVyX3NpemUpOworCVNIQTFfVXBkYXRlKCZjdHgsIGRhdGEsIHNpemUpOworCVNIQTFfRmluYWwoc2hhMSwgJmN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc29sdmVfZGVsdGEoc3RydWN0IGRlbHRhX2VudHJ5ICpkZWx0YSwgdm9pZCAqYmFzZV9kYXRhLAorCQkJICB1bnNpZ25lZCBsb25nIGJhc2Vfc2l6ZSwgZW51bSBvYmplY3RfdHlwZSB0eXBlKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKm9iaiA9IGRlbHRhLT5vYmo7CisJdm9pZCAqZGVsdGFfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemU7CisJdm9pZCAqcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgcmVzdWx0X3NpemU7CisJZW51bSBvYmplY3RfdHlwZSBkZWx0YV90eXBlOworCXVuc2lnbmVkIGNoYXIgYmFzZV9zaGExWzIwXTsKKwl1bnNpZ25lZCBsb25nIG5leHRfb2JqX29mZnNldDsKKwlpbnQgaiwgZmlyc3QsIGxhc3Q7CisKKwlvYmotPnJlYWxfdHlwZSA9IHR5cGU7CisJZGVsdGFfZGF0YSA9IHVucGFja19yYXdfZW50cnkob2JqLT5vZmZzZXQsICZkZWx0YV90eXBlLAorCQkJCSAgICAgICZkZWx0YV9zaXplLCBiYXNlX3NoYTEsCisJCQkJICAgICAgJm5leHRfb2JqX29mZnNldCk7CisJcmVzdWx0ID0gcGF0Y2hfZGVsdGEoYmFzZV9kYXRhLCBiYXNlX3NpemUsIGRlbHRhX2RhdGEsIGRlbHRhX3NpemUsCisJCQkgICAgICZyZXN1bHRfc2l6ZSk7CisJZnJlZShkZWx0YV9kYXRhKTsKKwlpZiAoIXJlc3VsdCkKKwkJYmFkX29iamVjdChvYmotPm9mZnNldCwgImZhaWxlZCB0byBhcHBseSBkZWx0YSIpOworCXNoYTFfb2JqZWN0KHJlc3VsdCwgcmVzdWx0X3NpemUsIHR5cGUsIG9iai0+c2hhMSk7CisJaWYgKCFmaW5kX2RlbHRhc19iYXNlZF9vbl9zaGExKG9iai0+c2hhMSwgJmZpcnN0LCAmbGFzdCkpIHsKKwkJZm9yIChqID0gZmlyc3Q7IGogPD0gbGFzdDsgaisrKQorCQkJcmVzb2x2ZV9kZWx0YSgmZGVsdGFzW2pdLCByZXN1bHQsIHJlc3VsdF9zaXplLCB0eXBlKTsKKwl9CisJZnJlZShyZXN1bHQpOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfZGVsdGFfZW50cnkoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhX2EgPSBhOworCWNvbnN0IHN0cnVjdCBkZWx0YV9lbnRyeSAqZGVsdGFfYiA9IGI7CisJcmV0dXJuIG1lbWNtcChkZWx0YV9hLT5iYXNlX3NoYTEsIGRlbHRhX2ItPmJhc2Vfc2hhMSwgMjApOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9wYWNrX29iamVjdHModm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcGFja19oZWFkZXIpOworCXVuc2lnbmVkIGNoYXIgYmFzZV9zaGExWzIwXTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgZGF0YV9zaXplOworCisJLyoKKwkgKiBGaXJzdCBwYXNzOgorCSAqIC0gZmluZCBsb2NhdGlvbnMgb2YgYWxsIG9iamVjdHM7CisJICogLSBjYWxjdWxhdGUgU0hBMSBvZiBhbGwgbm9uLWRlbHRhIG9iamVjdHM7CisJICogLSByZW1lbWJlciBiYXNlIFNIQTEgZm9yIGFsbCBkZWx0YXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpvYmogPSAmb2JqZWN0c1tpXTsKKwkJb2JqLT5vZmZzZXQgPSBvZmZzZXQ7CisJCWRhdGEgPSB1bnBhY2tfcmF3X2VudHJ5KG9mZnNldCwgJm9iai0+dHlwZSwgJmRhdGFfc2l6ZSwKKwkJCQkJYmFzZV9zaGExLCAmb2Zmc2V0KTsKKwkJb2JqLT5yZWFsX3R5cGUgPSBvYmotPnR5cGU7CisJCWlmIChvYmotPnR5cGUgPT0gT0JKX0RFTFRBKSB7CisJCQlzdHJ1Y3QgZGVsdGFfZW50cnkgKmRlbHRhID0gJmRlbHRhc1tucl9kZWx0YXMrK107CisJCQlkZWx0YS0+b2JqID0gb2JqOworCQkJbWVtY3B5KGRlbHRhLT5iYXNlX3NoYTEsIGJhc2Vfc2hhMSwgMjApOworCQl9IGVsc2UKKwkJCXNoYTFfb2JqZWN0KGRhdGEsIGRhdGFfc2l6ZSwgb2JqLT50eXBlLCBvYmotPnNoYTEpOworCQlmcmVlKGRhdGEpOworCX0KKwlpZiAob2Zmc2V0ICE9IHBhY2tfc2l6ZSAtIDIwKQorCQlkaWUoInBhY2tmaWxlICclcycgaGFzIGp1bmsgYXQgdGhlIGVuZCIsIHBhY2tfbmFtZSk7CisKKwkvKiBTb3J0IGRlbHRhcyBieSBiYXNlIFNIQTEgZm9yIGZhc3Qgc2VhcmNoaW5nICovCisJcXNvcnQoZGVsdGFzLCBucl9kZWx0YXMsIHNpemVvZihzdHJ1Y3QgZGVsdGFfZW50cnkpLAorCSAgICAgIGNvbXBhcmVfZGVsdGFfZW50cnkpOworCisJLyoKKwkgKiBTZWNvbmQgcGFzczoKKwkgKiAtIGZvciBhbGwgbm9uLWRlbHRhIG9iamVjdHMsIGxvb2sgaWYgaXQgaXMgdXNlZCBhcyBhIGJhc2UgZm9yCisJICogICBkZWx0YXM7CisJICogLSBpZiB1c2VkIGFzIGEgYmFzZSwgdW5jb21wcmVzcyB0aGUgb2JqZWN0IGFuZCBhcHBseSBhbGwgZGVsdGFzLAorCSAqICAgcmVjdXJzaXZlbHkgY2hlY2tpbmcgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgaXMgdXNlZCBhcyBhIGJhc2UKKwkgKiAgIGZvciBzb21lIG1vcmUgZGVsdGFzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gJm9iamVjdHNbaV07CisJCWludCBqLCBmaXJzdCwgbGFzdDsKKworCQlpZiAob2JqLT50eXBlID09IE9CSl9ERUxUQSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZmluZF9kZWx0YXNfYmFzZWRfb25fc2hhMShvYmotPnNoYTEsICZmaXJzdCwgJmxhc3QpKQorCQkJY29udGludWU7CisJCWRhdGEgPSB1bnBhY2tfcmF3X2VudHJ5KG9iai0+b2Zmc2V0LCAmb2JqLT50eXBlLCAmZGF0YV9zaXplLAorCQkJCQliYXNlX3NoYTEsICZvZmZzZXQpOworCQlmb3IgKGogPSBmaXJzdDsgaiA8PSBsYXN0OyBqKyspCisJCQlyZXNvbHZlX2RlbHRhKCZkZWx0YXNbal0sIGRhdGEsIGRhdGFfc2l6ZSwgb2JqLT50eXBlKTsKKwkJZnJlZShkYXRhKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgdW5yZXNvbHZlZCBkZWx0YXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfZGVsdGFzOyBpKyspIHsKKwkJaWYgKGRlbHRhc1tpXS5vYmotPnJlYWxfdHlwZSA9PSBPQkpfREVMVEEpCisJCQlkaWUoInBhY2tmaWxlICclcycgaGFzIHVucmVzb2x2ZWQgZGVsdGFzIiwgIHBhY2tfbmFtZSk7CisJfQorfQorCitzdGF0aWMgaW50IHNoYTFfY29tcGFyZShjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCit7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqYSA9ICooc3RydWN0IG9iamVjdF9lbnRyeSAqKilfYTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9iOworCXJldHVybiBtZW1jbXAoYS0+c2hhMSwgYi0+c2hhMSwgMjApOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9pbmRleF9maWxlKGNvbnN0IGNoYXIgKmluZGV4X25hbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXN0cnVjdCBvYmplY3RfZW50cnkgKipzb3J0ZWRfYnlfc2hhLCAqKmxpc3QsICoqbGFzdDsKKwl1bnNpZ25lZCBpbnQgYXJyYXlbMjU2XTsKKwlpbnQgaTsKKwlTSEFfQ1RYIGN0eDsKKworCWlmIChucl9vYmplY3RzKSB7CisJCXNvcnRlZF9ieV9zaGEgPQorCQkJeGNhbGxvYyhucl9vYmplY3RzLCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSk7CisJCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCQlsYXN0ID0gc29ydGVkX2J5X3NoYSArIG5yX29iamVjdHM7CisJCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyArK2kpCisJCQlzb3J0ZWRfYnlfc2hhW2ldID0gJm9iamVjdHNbaV07CisJCXFzb3J0KHNvcnRlZF9ieV9zaGEsIG5yX29iamVjdHMsIHNpemVvZihzb3J0ZWRfYnlfc2hhWzBdKSwKKwkJICAgICAgc2hhMV9jb21wYXJlKTsKKworCX0KKwllbHNlCisJCXNvcnRlZF9ieV9zaGEgPSBsaXN0ID0gbGFzdCA9IE5VTEw7CisKKwl1bmxpbmsoaW5kZXhfbmFtZSk7CisJZiA9IHNoYTFjcmVhdGUoIiVzIiwgaW5kZXhfbmFtZSk7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBmaXJzdC1sZXZlbCB0YWJsZSAodGhlIGxpc3QgaXMgc29ydGVkLAorCSAqIGJ1dCB3ZSB1c2UgYSAyNTYtZW50cnkgbG9va3VwIHRvIGJlIGFibGUgdG8gYXZvaWQKKwkgKiBoYXZpbmcgdG8gZG8gZWlnaHQgZXh0cmEgYmluYXJ5IHNlYXJjaCBpdGVyYXRpb25zKS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqKm5leHQgPSBsaXN0OworCQl3aGlsZSAobmV4dCA8IGxhc3QpIHsKKwkJCXN0cnVjdCBvYmplY3RfZW50cnkgKm9iaiA9ICpuZXh0OworCQkJaWYgKG9iai0+c2hhMVswXSAhPSBpKQorCQkJCWJyZWFrOworCQkJbmV4dCsrOworCQl9CisJCWFycmF5W2ldID0gaHRvbmwobmV4dCAtIHNvcnRlZF9ieV9zaGEpOworCQlsaXN0ID0gbmV4dDsKKwl9CisJc2hhMXdyaXRlKGYsIGFycmF5LCAyNTYgKiBzaXplb2YoaW50KSk7CisKKwkvKiByZWNvbXB1dGUgdGhlIFNIQTEgaGFzaCBvZiBzb3J0ZWQgb2JqZWN0IG5hbWVzLgorCSAqIGN1cnJlbnRseSBwYWNrLW9iamVjdHMgZG9lcyBub3QgZG8gdGhpcywgYnV0IHRoYXQKKwkgKiBjYW4gYmUgZml4ZWQuCisJICovCisJU0hBMV9Jbml0KCZjdHgpOworCS8qCisJICogV3JpdGUgdGhlIGFjdHVhbCBTSEExIGVudHJpZXMuLgorCSAqLworCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqID0gKmxpc3QrKzsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IGh0b25sKG9iai0+b2Zmc2V0KTsKKwkJc2hhMXdyaXRlKGYsICZvZmZzZXQsIDQpOworCQlzaGExd3JpdGUoZiwgb2JqLT5zaGExLCAyMCk7CisJCVNIQTFfVXBkYXRlKCZjdHgsIG9iai0+c2hhMSwgMjApOworCX0KKwlzaGExd3JpdGUoZiwgcGFja19iYXNlICsgcGFja19zaXplIC0gMjAsIDIwKTsKKwlzaGExY2xvc2UoZiwgTlVMTCwgMSk7CisJZnJlZShzb3J0ZWRfYnlfc2hhKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY2hhciAqaW5kZXhfbmFtZSA9IE5VTEw7CisJY2hhciAqaW5kZXhfbmFtZV9idWYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItbyIpKSB7CisJCQkJaWYgKGluZGV4X25hbWUgfHwgKGkrMSkgPj0gYXJnYykKKwkJCQkJdXNhZ2UoaW5kZXhfcGFja191c2FnZSk7CisJCQkJaW5kZXhfbmFtZSA9IGFyZ3ZbKytpXTsKKwkJCX0gZWxzZQorCQkJCXVzYWdlKGluZGV4X3BhY2tfdXNhZ2UpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocGFja19uYW1lKQorCQkJdXNhZ2UoaW5kZXhfcGFja191c2FnZSk7CisJCXBhY2tfbmFtZSA9IGFyZzsKKwl9CisKKwlpZiAoIXBhY2tfbmFtZSkKKwkJdXNhZ2UoaW5kZXhfcGFja191c2FnZSk7CisJaWYgKCFpbmRleF9uYW1lKSB7CisJCWludCBsZW4gPSBzdHJsZW4ocGFja19uYW1lKTsKKwkJaWYgKCFoYXNfZXh0ZW5zaW9uKHBhY2tfbmFtZSwgIi5wYWNrIikpCisJCQlkaWUoInBhY2tmaWxlIG5hbWUgJyVzJyBkb2VzIG5vdCBlbmQgd2l0aCAnLnBhY2snIiwKKwkJCSAgICBwYWNrX25hbWUpOworCQlpbmRleF9uYW1lX2J1ZiA9IHhtYWxsb2MobGVuKTsKKwkJbWVtY3B5KGluZGV4X25hbWVfYnVmLCBwYWNrX25hbWUsIGxlbiAtIDUpOworCQlzdHJjcHkoaW5kZXhfbmFtZV9idWYgKyBsZW4gLSA1LCAiLmlkeCIpOworCQlpbmRleF9uYW1lID0gaW5kZXhfbmFtZV9idWY7CisJfQorCisJb3Blbl9wYWNrX2ZpbGUoKTsKKwlwYXJzZV9wYWNrX2hlYWRlcigpOworCW9iamVjdHMgPSB4Y2FsbG9jKG5yX29iamVjdHMsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KSk7CisJZGVsdGFzID0geGNhbGxvYyhucl9vYmplY3RzLCBzaXplb2Yoc3RydWN0IGRlbHRhX2VudHJ5KSk7CisJcGFyc2VfcGFja19vYmplY3RzKCk7CisJZnJlZShkZWx0YXMpOworCXdyaXRlX2luZGV4X2ZpbGUoaW5kZXhfbmFtZSwgc2hhMSk7CisJZnJlZShvYmplY3RzKTsKKwlmcmVlKGluZGV4X25hbWVfYnVmKTsKKworCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbG9jYWwtZmV0Y2guYyBiL2xvY2FsLWZldGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwMTg0NQotLS0gL2Rldi9udWxsCisrKyBiL2xvY2FsLWZldGNoLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKworc3RhdGljIGludCB1c2VfbGluayA9IDA7CitzdGF0aWMgaW50IHVzZV9zeW1saW5rID0gMDsKK3N0YXRpYyBpbnQgdXNlX2ZpbGVjb3B5ID0gMTsKK3N0YXRpYyBpbnQgY29tbWl0c19vbl9zdGRpbiA9IDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwYXRoOyAvKiAiUmVtb3RlIiBnaXQgcmVwb3NpdG9yeSAqLworCit2b2lkIHByZWZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja2VkX2dpdCAqcGFja3MgPSBOVUxMOworCitzdGF0aWMgdm9pZCBzZXR1cF9pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpuZXdfcGFjazsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlzdHJjcHkoZmlsZW5hbWUsIHBhdGgpOworCXN0cmNhdChmaWxlbmFtZSwgIi9vYmplY3RzL3BhY2svcGFjay0iKTsKKwlzdHJjYXQoZmlsZW5hbWUsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlzdHJjYXQoZmlsZW5hbWUsICIuaWR4Iik7CisJbmV3X3BhY2sgPSBwYXJzZV9wYWNrX2luZGV4X2ZpbGUoc2hhMSwgZmlsZW5hbWUpOworCW5ld19wYWNrLT5uZXh0ID0gcGFja3M7CisJcGFja3MgPSBuZXdfcGFjazsKK30KKworc3RhdGljIGludCBzZXR1cF9pbmRpY2VzKHZvaWQpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGU7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlzcHJpbnRmKGZpbGVuYW1lLCAiJXMvb2JqZWN0cy9wYWNrLyIsIHBhdGgpOworCWRpciA9IG9wZW5kaXIoZmlsZW5hbWUpOworCWlmICghZGlyKQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJaWYgKG5hbWVsZW4gIT0gNTAgfHwKKwkJICAgICFoYXNfZXh0ZW5zaW9uKGRlLT5kX25hbWUsICIucGFjayIpKQorCQkJY29udGludWU7CisJCWdldF9zaGExX2hleChkZS0+ZF9uYW1lICsgNSwgc2hhMSk7CisJCXNldHVwX2luZGV4KHNoYTEpOworCX0KKwljbG9zZWRpcihkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfZmlsZShjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKmhleCwKKwkJICAgICBpbnQgd2Fybl9pZl9ub3RfZXhpc3RzKQoreworCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMoZGVzdCk7CisJaWYgKHVzZV9saW5rKSB7CisJCWlmICghbGluayhzb3VyY2UsIGRlc3QpKSB7CisJCQlwdWxsX3NheSgibGluayAlc1xuIiwgaGV4KTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIElmIHdlIGdvdCBFTk9FTlQgdGhlcmUgaXMgbm8gcG9pbnQgY29udGludWluZy4gKi8KKwkJaWYgKGVycm5vID09IEVOT0VOVCkgeworCQkJaWYgKHdhcm5faWZfbm90X2V4aXN0cykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImRvZXMgbm90IGV4aXN0ICVzXG4iLCBzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWlmICh1c2Vfc3ltbGluaykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJaWYgKHN0YXQoc291cmNlLCAmc3QpKSB7CisJCQlpZiAoIXdhcm5faWZfbm90X2V4aXN0cyAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQkJcmV0dXJuIC0xOworCQkJZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgc3RhdCAlczogJXNcbiIsIHNvdXJjZSwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghc3ltbGluayhzb3VyY2UsIGRlc3QpKSB7CisJCQlwdWxsX3NheSgic3ltbGluayAlc1xuIiwgaGV4KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmICh1c2VfZmlsZWNvcHkpIHsKKwkJaW50IGlmZCwgb2ZkLCBzdGF0dXMgPSAwOworCisJCWlmZCA9IG9wZW4oc291cmNlLCBPX1JET05MWSk7CisJCWlmIChpZmQgPCAwKSB7CisJCQlpZiAoIXdhcm5faWZfbm90X2V4aXN0cyAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQkJcmV0dXJuIC0xOworCQkJZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgb3BlbiAlc1xuIiwgc291cmNlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlvZmQgPSBvcGVuKGRlc3QsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDY2Nik7CisJCWlmIChvZmQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuICVzXG4iLCBkZXN0KTsKKwkJCWNsb3NlKGlmZCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RhdHVzID0gY29weV9mZChpZmQsIG9mZCk7CisJCWNsb3NlKG9mZCk7CisJCWlmIChzdGF0dXMpCisJCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCB3cml0ZSAlc1xuIiwgZGVzdCk7CisJCWVsc2UKKwkJCXB1bGxfc2F5KCJjb3B5ICVzXG4iLCBoZXgpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBjb3B5ICVzIHdpdGggZ2l2ZW4gY29weSBtZXRob2RzLlxuIiwgaGV4KTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICp0YXJnZXQ7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJaWYgKHNldHVwX2luZGljZXMoKSkKKwkJcmV0dXJuIC0xOworCXRhcmdldCA9IGZpbmRfc2hhMV9wYWNrKHNoYTEsIHBhY2tzKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCBmaW5kICVzOiBub3Qgc2VwYXJhdGUgb3IgaW4gYW55IHBhY2siLCAKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChnZXRfdmVyYm9zZWx5KSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2V0dGluZyBwYWNrICVzXG4iLAorCQkJc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSk7CisJCWZwcmludGYoc3RkZXJyLCAiIHdoaWNoIGNvbnRhaW5zICVzXG4iLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlzcHJpbnRmKGZpbGVuYW1lLCAiJXMvb2JqZWN0cy9wYWNrL3BhY2stJXMucGFjayIsIAorCQlwYXRoLCBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKwljb3B5X2ZpbGUoZmlsZW5hbWUsIHNoYTFfcGFja19uYW1lKHRhcmdldC0+c2hhMSksCisJCSAgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgMSk7CisJc3ByaW50ZihmaWxlbmFtZSwgIiVzL29iamVjdHMvcGFjay9wYWNrLSVzLmlkeCIsIAorCQlwYXRoLCBzaGExX3RvX2hleCh0YXJnZXQtPnNoYTEpKTsKKwljb3B5X2ZpbGUoZmlsZW5hbWUsIHNoYTFfcGFja19pbmRleF9uYW1lKHRhcmdldC0+c2hhMSksCisJCSAgc2hhMV90b19oZXgodGFyZ2V0LT5zaGExKSwgMSk7CisJaW5zdGFsbF9wYWNrZWRfZ2l0KHRhcmdldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmV0Y2hfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBpbnQgb2JqZWN0X25hbWVfc3RhcnQgPSAtMTsKKwlzdGF0aWMgY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJY2hhciAqaGV4ID0gc2hhMV90b19oZXgoc2hhMSk7CisJY2hhciAqZGVzdF9maWxlbmFtZSA9IHNoYTFfZmlsZV9uYW1lKHNoYTEpOworCisgCWlmIChvYmplY3RfbmFtZV9zdGFydCA8IDApIHsKKwkJc3RyY3B5KGZpbGVuYW1lLCBwYXRoKTsgLyogZS5nLiBnaXQuZ2l0ICovCisJCXN0cmNhdChmaWxlbmFtZSwgIi9vYmplY3RzLyIpOworCQlvYmplY3RfbmFtZV9zdGFydCA9IHN0cmxlbihmaWxlbmFtZSk7CisJfQorCWZpbGVuYW1lW29iamVjdF9uYW1lX3N0YXJ0KzBdID0gaGV4WzBdOworCWZpbGVuYW1lW29iamVjdF9uYW1lX3N0YXJ0KzFdID0gaGV4WzFdOworCWZpbGVuYW1lW29iamVjdF9uYW1lX3N0YXJ0KzJdID0gJy8nOworCXN0cmNweShmaWxlbmFtZSArIG9iamVjdF9uYW1lX3N0YXJ0ICsgMywgaGV4ICsgMik7CisJcmV0dXJuIGNvcHlfZmlsZShmaWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgaGV4LCAwKTsKK30KKworaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGhhc19zaGExX2ZpbGUoc2hhMSkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIGZldGNoX2ZpbGUoc2hhMSkgJiYgZmV0Y2hfcGFjayhzaGExKTsKK30KKworaW50IGZldGNoX3JlZihjaGFyICpyZWYsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGludCByZWZfbmFtZV9zdGFydCA9IC0xOworCXN0YXRpYyBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlzdGF0aWMgY2hhciBoZXhbNDFdOworCWludCBpZmQ7CisKKwlpZiAocmVmX25hbWVfc3RhcnQgPCAwKSB7CisJCXNwcmludGYoZmlsZW5hbWUsICIlcy9yZWZzLyIsIHBhdGgpOworCQlyZWZfbmFtZV9zdGFydCA9IHN0cmxlbihmaWxlbmFtZSk7CisJfQorCXN0cmNweShmaWxlbmFtZSArIHJlZl9uYW1lX3N0YXJ0LCByZWYpOworCWlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoaWZkIDwgMCkgeworCQljbG9zZShpZmQpOworCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHJlYWQoaWZkLCBoZXgsIDQwKSAhPSA0MCB8fCBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSkgeworCQljbG9zZShpZmQpOworCQlmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCByZWFkIGZyb20gJXNcbiIsIGZpbGVuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShpZmQpOworCXB1bGxfc2F5KCJyZWYgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbG9jYWxfcHVsbF91c2FnZVtdID0KKyJnaXQtbG9jYWwtZmV0Y2ggWy1jXSBbLXRdIFstYV0gWy12XSBbLXcgZmlsZW5hbWVdIFstLXJlY292ZXJdIFstbF0gWy1zXSBbLW5dIFstLXN0ZGluXSBjb21taXQtaWQgcGF0aCI7CisKKy8qCisgKiBCeSBkZWZhdWx0IHdlIG9ubHkgdXNlIGZpbGUgY29weS4KKyAqIElmIC1sIGlzIHNwZWNpZmllZCwgYSBoYXJkIGxpbmsgaXMgYXR0ZW1wdGVkLgorICogSWYgLXMgaXMgc3BlY2lmaWVkLCB0aGVuIGEgc3ltbGluayBpcyBhdHRlbXB0ZWQuCisgKiBJZiAtbiBpcyBfbm90XyBzcGVjaWZpZWQsIHRoZW4gYSByZWd1bGFyIGZpbGUtdG8tZmlsZSBjb3B5IGlzIGRvbmUuCisgKi8KK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgY29tbWl0czsKKwljb25zdCBjaGFyICoqd3JpdGVfcmVmID0gTlVMTDsKKwljaGFyICoqY29tbWl0X2lkOworCWludCBhcmcgPSAxOworCisJc2V0dXBfaWRlbnQoKTsKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOworCisJd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworCQlpZiAoYXJndlthcmddWzFdID09ICd0JykKKwkJCWdldF90cmVlID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykKKwkJCWdldF9oaXN0b3J5ID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdhJykgeworCQkJZ2V0X2FsbCA9IDE7CisJCQlnZXRfdHJlZSA9IDE7CisJCQlnZXRfaGlzdG9yeSA9IDE7CisJCX0KKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdsJykKKwkJCXVzZV9saW5rID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdzJykKKwkJCXVzZV9zeW1saW5rID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICduJykKKwkJCXVzZV9maWxlY29weSA9IDA7CisJCWVsc2UgaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndicpCisJCQlnZXRfdmVyYm9zZWx5ID0gMTsKKwkJZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd3JykKKwkJCXdyaXRlX3JlZiA9ICZhcmd2WysrYXJnXTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXJlY292ZXIiKSkKKwkJCWdldF9yZWNvdmVyID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcChhcmd2W2FyZ10sICItLXN0ZGluIikpCisJCQljb21taXRzX29uX3N0ZGluID0gMTsKKwkJZWxzZQorCQkJdXNhZ2UobG9jYWxfcHVsbF91c2FnZSk7CisJCWFyZysrOworCX0KKwlpZiAoYXJnYyA8IGFyZyArIDIgLSBjb21taXRzX29uX3N0ZGluKQorCQl1c2FnZShsb2NhbF9wdWxsX3VzYWdlKTsKKwlpZiAoY29tbWl0c19vbl9zdGRpbikgeworCQljb21taXRzID0gcHVsbF90YXJnZXRzX3N0ZGluKCZjb21taXRfaWQsICZ3cml0ZV9yZWYpOworCX0gZWxzZSB7CisJCWNvbW1pdF9pZCA9IChjaGFyICoqKSAmYXJndlthcmcrK107CisJCWNvbW1pdHMgPSAxOworCX0KKwlwYXRoID0gYXJndlthcmddOworCisJaWYgKHB1bGwoY29tbWl0cywgY29tbWl0X2lkLCB3cml0ZV9yZWYsIHBhdGgpKQorCQlyZXR1cm4gMTsKKworCWlmIChjb21taXRzX29uX3N0ZGluKQorCQlwdWxsX3RhcmdldHNfZnJlZShjb21taXRzLCBjb21taXRfaWQsIHdyaXRlX3JlZik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xvY2tmaWxlLmMgYi9sb2NrZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMmZlYTMKLS0tIC9kZXYvbnVsbAorKysgYi9sb2NrZmlsZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEp1bmlvIEMgSGFtYW5vCisgKi8KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgc3RydWN0IGxvY2tfZmlsZSAqbG9ja19maWxlX2xpc3Q7CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9sb2NrX2ZpbGUodm9pZCkKK3sKKwl3aGlsZSAobG9ja19maWxlX2xpc3QpIHsKKwkJaWYgKGxvY2tfZmlsZV9saXN0LT5maWxlbmFtZVswXSkKKwkJCXVubGluayhsb2NrX2ZpbGVfbGlzdC0+ZmlsZW5hbWUpOworCQlsb2NrX2ZpbGVfbGlzdCA9IGxvY2tfZmlsZV9saXN0LT5uZXh0OworCX0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2xvY2tfZmlsZV9vbl9zaWduYWwoaW50IHNpZ25vKQoreworCXJlbW92ZV9sb2NrX2ZpbGUoKTsKKwlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKwlyYWlzZShzaWdubyk7Cit9CisKK3N0YXRpYyBpbnQgbG9ja19maWxlKHN0cnVjdCBsb2NrX2ZpbGUgKmxrLCBjb25zdCBjaGFyICpwYXRoKQoreworCWludCBmZDsKKwlzcHJpbnRmKGxrLT5maWxlbmFtZSwgIiVzLmxvY2siLCBwYXRoKTsKKwlmZCA9IG9wZW4obGstPmZpbGVuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19FWENMLCAwNjY2KTsKKwlpZiAoMCA8PSBmZCkgeworCQlpZiAoIWxrLT5uZXh0KSB7CisJCQlsay0+bmV4dCA9IGxvY2tfZmlsZV9saXN0OworCQkJbG9ja19maWxlX2xpc3QgPSBsazsKKwkJCXNpZ25hbChTSUdJTlQsIHJlbW92ZV9sb2NrX2ZpbGVfb25fc2lnbmFsKTsKKwkJCWF0ZXhpdChyZW1vdmVfbG9ja19maWxlKTsKKwkJfQorCQlpZiAoYWRqdXN0X3NoYXJlZF9wZXJtKGxrLT5maWxlbmFtZSkpCisJCQlyZXR1cm4gZXJyb3IoImNhbm5vdCBmaXggcGVybWlzc2lvbiBiaXRzIG9uICVzIiwKKwkJCQkgICAgIGxrLT5maWxlbmFtZSk7CisJfQorCXJldHVybiBmZDsKK30KKworaW50IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUoc3RydWN0IGxvY2tfZmlsZSAqbGssIGNvbnN0IGNoYXIgKnBhdGgsIGludCBkaWVfb25fZXJyb3IpCit7CisJaW50IGZkID0gbG9ja19maWxlKGxrLCBwYXRoKTsKKwlpZiAoZmQgPCAwICYmIGRpZV9vbl9lcnJvcikKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlICclcyc6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBjb21taXRfbG9ja19maWxlKHN0cnVjdCBsb2NrX2ZpbGUgKmxrKQoreworCWNoYXIgcmVzdWx0X2ZpbGVbUEFUSF9NQVhdOworCWludCBpOworCXN0cmNweShyZXN1bHRfZmlsZSwgbGstPmZpbGVuYW1lKTsKKwlpID0gc3RybGVuKHJlc3VsdF9maWxlKSAtIDU7IC8qIC5sb2NrICovCisJcmVzdWx0X2ZpbGVbaV0gPSAwOworCWkgPSByZW5hbWUobGstPmZpbGVuYW1lLCByZXN1bHRfZmlsZSk7CisJbGstPmZpbGVuYW1lWzBdID0gMDsKKwlyZXR1cm4gaTsKK30KKwordm9pZCByb2xsYmFja19sb2NrX2ZpbGUoc3RydWN0IGxvY2tfZmlsZSAqbGspCit7CisJaWYgKGxrLT5maWxlbmFtZVswXSkKKwkJdW5saW5rKGxrLT5maWxlbmFtZSk7CisJbGstPmZpbGVuYW1lWzBdID0gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbG9nLXRyZWUuYyBiL2xvZy10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlZGUwYwotLS0gL2Rldi9udWxsCisrKyBiL2xvZy10cmVlLmMKQEAgLTAsMCArMSwyOTIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImRpZmYuaCIKKyNpbmNsdWRlICJjb21taXQuaCIKKyNpbmNsdWRlICJsb2ctdHJlZS5oIgorCitzdGF0aWMgdm9pZCBzaG93X3BhcmVudHMoc3RydWN0IGNvbW1pdCAqY29tbWl0LCBpbnQgYWJicmV2KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKwlmb3IgKHAgPSBjb21taXQtPnBhcmVudHM7IHAgOyBwID0gcC0+bmV4dCkgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwLT5pdGVtOworCQlwcmludGYoIiAlcyIsIGRpZmZfdW5pcXVlX2FiYnJldihwYXJlbnQtPm9iamVjdC5zaGExLCBhYmJyZXYpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXBwZW5kX3NpZ25vZmYoY2hhciAqYnVmLCBpbnQgYnVmX3N6LCBpbnQgYXQsIGNvbnN0IGNoYXIgKnNpZ25vZmYpCit7CisJaW50IHNpZ25vZmZfbGVuID0gc3RybGVuKHNpZ25vZmYpOworCXN0YXRpYyBjb25zdCBjaGFyIHNpZ25lZF9vZmZfYnlbXSA9ICJTaWduZWQtb2ZmLWJ5OiAiOworCWNoYXIgKmNwID0gYnVmOworCisJLyogRG8gd2UgaGF2ZSBlbm91Z2ggc3BhY2UgdG8gYWRkIGl0PyAqLworCWlmIChidWZfc3ogLSBhdCA8PSBzdHJsZW4oc2lnbmVkX29mZl9ieSkgKyBzaWdub2ZmX2xlbiArIDIpCisJCXJldHVybiBhdDsKKworCS8qIEZpcnN0IHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNpZ24tb2ZmIGJ5IHRoZSBzaWduZXIgKi8KKwl3aGlsZSAoMSkgeworCQljcCA9IHN0cnN0cihjcCwgc2lnbmVkX29mZl9ieSk7CisJCWlmICghY3ApCisJCQlicmVhazsKKwkJY3AgKz0gc3RybGVuKHNpZ25lZF9vZmZfYnkpOworCQlpZiAoKGNwICsgc2lnbm9mZl9sZW4gPCBidWYgKyBhdCkgJiYKKwkJICAgICFzdHJuY21wKGNwLCBzaWdub2ZmLCBzaWdub2ZmX2xlbikgJiYKKwkJICAgIGlzc3BhY2UoY3Bbc2lnbm9mZl9sZW5dKSkKKwkJCXJldHVybiBhdDsgLyogd2UgYWxyZWFkeSBoYXZlIGhpbSAqLworCX0KKworCXN0cmNweShidWYgKyBhdCwgc2lnbmVkX29mZl9ieSk7CisJYXQgKz0gc3RybGVuKHNpZ25lZF9vZmZfYnkpOworCXN0cmNweShidWYgKyBhdCwgc2lnbm9mZik7CisJYXQgKz0gc2lnbm9mZl9sZW47CisJYnVmW2F0KytdID0gJ1xuJzsKKwlidWZbYXRdID0gMDsKKwlyZXR1cm4gYXQ7Cit9CisKK3ZvaWQgc2hvd19sb2coc3RydWN0IHJldl9pbmZvICpvcHQsIGNvbnN0IGNoYXIgKnNlcCkKK3sKKwlzdGF0aWMgY2hhciB0aGlzX2hlYWRlclsxNjM4NF07CisJc3RydWN0IGxvZ19pbmZvICpsb2cgPSBvcHQtPmxvZ2luZm87CisJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbG9nLT5jb21taXQsICpwYXJlbnQgPSBsb2ctPnBhcmVudDsKKwlpbnQgYWJicmV2ID0gb3B0LT5kaWZmb3B0LmFiYnJldjsKKwlpbnQgYWJicmV2X2NvbW1pdCA9IG9wdC0+YWJicmV2X2NvbW1pdCA/IG9wdC0+YWJicmV2IDogNDA7CisJY29uc3QgY2hhciAqZXh0cmE7CisJaW50IGxlbjsKKwljb25zdCBjaGFyICpzdWJqZWN0ID0gTlVMTCwgKmV4dHJhX2hlYWRlcnMgPSBvcHQtPmV4dHJhX2hlYWRlcnM7CisKKwlvcHQtPmxvZ2luZm8gPSBOVUxMOworCWlmICghb3B0LT52ZXJib3NlX2hlYWRlcikgeworCQlmcHV0cyhkaWZmX3VuaXF1ZV9hYmJyZXYoY29tbWl0LT5vYmplY3Quc2hhMSwgYWJicmV2X2NvbW1pdCksIHN0ZG91dCk7CisJCWlmIChvcHQtPnBhcmVudHMpCisJCQlzaG93X3BhcmVudHMoY29tbWl0LCBhYmJyZXZfY29tbWl0KTsKKwkJcHV0Y2hhcihvcHQtPmRpZmZvcHQubGluZV90ZXJtaW5hdGlvbik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoZSAib25lbGluZSIgZm9ybWF0IGhhcyBzZXZlcmFsIHNwZWNpYWwgY2FzZXM6CisJICogIC0gVGhlIHByZXR0eS1wcmludGVkIGNvbW1pdCBsYWNrcyBhIG5ld2xpbmUgYXQgdGhlIGVuZAorCSAqICAgIG9mIHRoZSBidWZmZXIsIGJ1dCB3ZSBkbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdlCisJICogICAgaGF2ZSBhIG5ld2xpbmUgdGhlcmUuIElmIHRoZSBzZXBhcmF0b3IgaXNuJ3QgYWxyZWFkeQorCSAqICAgIGEgbmV3bGluZSwgYWRkIGFuIGV4dHJhIG9uZS4KKwkgKiAgLSB1bmxpa2Ugb3RoZXIgbG9nIG1lc3NhZ2VzLCB0aGUgb25lLWxpbmUgZm9ybWF0IGRvZXMKKwkgKiAgICBub3QgaGF2ZSBhbiBlbXB0eSBsaW5lIGJldHdlZW4gZW50cmllcy4KKwkgKi8KKwlleHRyYSA9ICIiOworCWlmICgqc2VwICE9ICdcbicgJiYgb3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUpCisJCWV4dHJhID0gIlxuIjsKKwlpZiAob3B0LT5zaG93bl9vbmUgJiYgb3B0LT5jb21taXRfZm9ybWF0ICE9IENNSVRfRk1UX09ORUxJTkUpCisJCXB1dGNoYXIoJ1xuJyk7CisJb3B0LT5zaG93bl9vbmUgPSAxOworCisJLyoKKwkgKiBQcmludCBoZWFkZXIgbGluZSBvZiBoZWFkZXIuLgorCSAqLworCisJaWYgKG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9FTUFJTCkgeworCQljaGFyICpzaGExID0gc2hhMV90b19oZXgoY29tbWl0LT5vYmplY3Quc2hhMSk7CisJCWlmIChvcHQtPnRvdGFsID4gMCkgeworCQkJc3RhdGljIGNoYXIgYnVmZmVyWzY0XTsKKwkJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisJCQkJCSJTdWJqZWN0OiBbUEFUQ0ggJWQvJWRdICIsCisJCQkJCW9wdC0+bnIsIG9wdC0+dG90YWwpOworCQkJc3ViamVjdCA9IGJ1ZmZlcjsKKwkJfSBlbHNlIGlmIChvcHQtPnRvdGFsID09IDApCisJCQlzdWJqZWN0ID0gIlN1YmplY3Q6IFtQQVRDSF0gIjsKKwkJZWxzZQorCQkJc3ViamVjdCA9ICJTdWJqZWN0OiAiOworCisJCXByaW50ZigiRnJvbSAlcyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDFcbiIsIHNoYTEpOworCQlpZiAob3B0LT5tZXNzYWdlX2lkKQorCQkJcHJpbnRmKCJNZXNzYWdlLUlkOiA8JXM+XG4iLCBvcHQtPm1lc3NhZ2VfaWQpOworCQlpZiAob3B0LT5yZWZfbWVzc2FnZV9pZCkKKwkJCXByaW50ZigiSW4tUmVwbHktVG86IDwlcz5cblJlZmVyZW5jZXM6IDwlcz5cbiIsCisJCQkgICAgICAgb3B0LT5yZWZfbWVzc2FnZV9pZCwgb3B0LT5yZWZfbWVzc2FnZV9pZCk7CisJCWlmIChvcHQtPm1pbWVfYm91bmRhcnkpIHsKKwkJCXN0YXRpYyBjaGFyIHN1YmplY3RfYnVmZmVyWzEwMjRdOworCQkJc3RhdGljIGNoYXIgYnVmZmVyWzEwMjRdOworCQkJc25wcmludGYoc3ViamVjdF9idWZmZXIsIHNpemVvZihzdWJqZWN0X2J1ZmZlcikgLSAxLAorCQkJCSAiJXMiCisJCQkJICJNSU1FLVZlcnNpb246IDEuMFxuIgorCQkJCSAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7XG4iCisJCQkJICIgYm91bmRhcnk9XCIlcyVzXCJcbiIKKwkJCQkgIlxuIgorCQkJCSAiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FICIKKwkJCQkgImZvcm1hdC5cbiIKKwkJCQkgIi0tJXMlc1xuIgorCQkJCSAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyAiCisJCQkJICJjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWRcbiIKKwkJCQkgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcblxuIiwKKwkJCQkgZXh0cmFfaGVhZGVycyA/IGV4dHJhX2hlYWRlcnMgOiAiIiwKKwkJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSwKKwkJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSk7CisJCQlleHRyYV9oZWFkZXJzID0gc3ViamVjdF9idWZmZXI7CisKKwkJCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgLSAxLAorCQkJCSAiLS0lcyVzXG4iCisJCQkJICJDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDtcbiIKKwkJCQkgIiBuYW1lPVwiJXMuZGlmZlwiXG4iCisJCQkJICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisJCQkJICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7XG4iCisJCQkJICIgZmlsZW5hbWU9XCIlcy5kaWZmXCJcblxuIiwKKwkJCQkgbWltZV9ib3VuZGFyeV9sZWFkZXIsIG9wdC0+bWltZV9ib3VuZGFyeSwKKwkJCQkgc2hhMSwgc2hhMSk7CisJCQlvcHQtPmRpZmZvcHQuc3RhdF9zZXAgPSBidWZmZXI7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIiVzJXMlcyIsCisJCSAgICAgICBkaWZmX2dldF9jb2xvcihvcHQtPmRpZmZvcHQuY29sb3JfZGlmZiwgRElGRl9DT01NSVQpLAorCQkgICAgICAgb3B0LT5jb21taXRfZm9ybWF0ID09IENNSVRfRk1UX09ORUxJTkUgPyAiIiA6ICJjb21taXQgIiwKKwkJICAgICAgIGRpZmZfdW5pcXVlX2FiYnJldihjb21taXQtPm9iamVjdC5zaGExLCBhYmJyZXZfY29tbWl0KSk7CisJCWlmIChvcHQtPnBhcmVudHMpCisJCQlzaG93X3BhcmVudHMoY29tbWl0LCBhYmJyZXZfY29tbWl0KTsKKwkJaWYgKHBhcmVudCkKKwkJCXByaW50ZigiIChmcm9tICVzKSIsCisJCQkgICAgICAgZGlmZl91bmlxdWVfYWJicmV2KHBhcmVudC0+b2JqZWN0LnNoYTEsCisJCQkJCQkgIGFiYnJldl9jb21taXQpKTsKKwkJcHJpbnRmKCIlcyIsCisJCSAgICAgICBkaWZmX2dldF9jb2xvcihvcHQtPmRpZmZvcHQuY29sb3JfZGlmZiwgRElGRl9SRVNFVCkpOworCQlwdXRjaGFyKG9wdC0+Y29tbWl0X2Zvcm1hdCA9PSBDTUlUX0ZNVF9PTkVMSU5FID8gJyAnIDogJ1xuJyk7CisJfQorCisJLyoKKwkgKiBBbmQgdGhlbiB0aGUgcHJldHR5LXByaW50ZWQgbWVzc2FnZSBpdHNlbGYKKwkgKi8KKwlsZW4gPSBwcmV0dHlfcHJpbnRfY29tbWl0KG9wdC0+Y29tbWl0X2Zvcm1hdCwgY29tbWl0LCB+MHUsIHRoaXNfaGVhZGVyLCBzaXplb2YodGhpc19oZWFkZXIpLCBhYmJyZXYsIHN1YmplY3QsIGV4dHJhX2hlYWRlcnMpOworCisJaWYgKG9wdC0+YWRkX3NpZ25vZmYpCisJCWxlbiA9IGFwcGVuZF9zaWdub2ZmKHRoaXNfaGVhZGVyLCBzaXplb2YodGhpc19oZWFkZXIpLCBsZW4sCisJCQkJICAgICBvcHQtPmFkZF9zaWdub2ZmKTsKKwlwcmludGYoIiVzJXMlcyIsIHRoaXNfaGVhZGVyLCBleHRyYSwgc2VwKTsKK30KKworaW50IGxvZ190cmVlX2RpZmZfZmx1c2goc3RydWN0IHJldl9pbmZvICpvcHQpCit7CisJZGlmZmNvcmVfc3RkKCZvcHQtPmRpZmZvcHQpOworCisJaWYgKGRpZmZfcXVldWVfaXNfZW1wdHkoKSkgeworCQlpbnQgc2F2ZWRfZm10ID0gb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQ7CisJCW9wdC0+ZGlmZm9wdC5vdXRwdXRfZm9ybWF0ID0gRElGRl9GT1JNQVRfTk9fT1VUUFVUOworCQlkaWZmX2ZsdXNoKCZvcHQtPmRpZmZvcHQpOworCQlvcHQtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IHNhdmVkX2ZtdDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wdC0+bG9naW5mbyAmJiAhb3B0LT5ub19jb21taXRfaWQpIHsKKwkJLyogV2hlbiBzaG93aW5nIGEgdmVyYm9zZSBoZWFkZXIgKGkuZS4gbG9nIG1lc3NhZ2UpLAorCQkgKiBhbmQgbm90IGluIC0tcHJldHR5PW9uZWxpbmUgZm9ybWF0LCB3ZSB3b3VsZCB3YW50CisJCSAqIGFuIGV4dHJhIG5ld2xpbmUgYmV0d2VlbiB0aGUgZW5kIG9mIGxvZyBhbmQgdGhlCisJCSAqIG91dHB1dCBmb3IgcmVhZGFiaWxpdHkuCisJCSAqLworCQlzaG93X2xvZyhvcHQsIG9wdC0+ZGlmZm9wdC5tc2dfc2VwKTsKKwkJaWYgKG9wdC0+dmVyYm9zZV9oZWFkZXIgJiYKKwkJICAgIG9wdC0+Y29tbWl0X2Zvcm1hdCAhPSBDTUlUX0ZNVF9PTkVMSU5FKSB7CisJCQlpbnQgcGNoID0gRElGRl9GT1JNQVRfRElGRlNUQVQgfCBESUZGX0ZPUk1BVF9QQVRDSDsKKwkJCWlmICgocGNoICYgb3B0LT5kaWZmb3B0Lm91dHB1dF9mb3JtYXQpID09IHBjaCkKKwkJCQlwcmludGYoIi0tLSVjIiwgb3B0LT5kaWZmb3B0LmxpbmVfdGVybWluYXRpb24pOworCQkJZWxzZQorCQkJCXB1dGNoYXIob3B0LT5kaWZmb3B0LmxpbmVfdGVybWluYXRpb24pOworCQl9CisJfQorCWRpZmZfZmx1c2goJm9wdC0+ZGlmZm9wdCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGlmZl9yb290X3RyZWUoc3RydWN0IHJldl9pbmZvICpvcHQsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldywgY29uc3QgY2hhciAqYmFzZSkKK3sKKwlpbnQgcmV0dmFsOworCXZvaWQgKnRyZWU7CisJc3RydWN0IHRyZWVfZGVzYyBlbXB0eSwgcmVhbDsKKworCXRyZWUgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShuZXcsIHRyZWVfdHlwZSwgJnJlYWwuc2l6ZSwgTlVMTCk7CisJaWYgKCF0cmVlKQorCQlkaWUoInVuYWJsZSB0byByZWFkIHJvb3QgdHJlZSAoJXMpIiwgc2hhMV90b19oZXgobmV3KSk7CisJcmVhbC5idWYgPSB0cmVlOworCisJZW1wdHkuYnVmID0gIiI7CisJZW1wdHkuc2l6ZSA9IDA7CisJcmV0dmFsID0gZGlmZl90cmVlKCZlbXB0eSwgJnJlYWwsIGJhc2UsICZvcHQtPmRpZmZvcHQpOworCWZyZWUodHJlZSk7CisJbG9nX3RyZWVfZGlmZl9mbHVzaChvcHQpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZG9fZGlmZl9jb21iaW5lZChzdHJ1Y3QgcmV2X2luZm8gKm9wdCwgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXVuc2lnbmVkIGNvbnN0IGNoYXIgKnNoYTEgPSBjb21taXQtPm9iamVjdC5zaGExOworCisJZGlmZl90cmVlX2NvbWJpbmVkX21lcmdlKHNoYTEsIG9wdC0+ZGVuc2VfY29tYmluZWRfbWVyZ2VzLCBvcHQpOworCXJldHVybiAhb3B0LT5sb2dpbmZvOworfQorCisvKgorICogU2hvdyB0aGUgZGlmZiBvZiBhIGNvbW1pdC4KKyAqCisgKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBwcmludGVkIGFueSBsb2cgaW5mbyBtZXNzYWdlcworICovCitzdGF0aWMgaW50IGxvZ190cmVlX2RpZmYoc3RydWN0IHJldl9pbmZvICpvcHQsIHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGxvZ19pbmZvICpsb2cpCit7CisJaW50IHNob3dlZF9sb2c7CisJc3RydWN0IGNvbW1pdF9saXN0ICpwYXJlbnRzOworCXVuc2lnbmVkIGNvbnN0IGNoYXIgKnNoYTEgPSBjb21taXQtPm9iamVjdC5zaGExOworCisJaWYgKCFvcHQtPmRpZmYpCisJCXJldHVybiAwOworCisJLyogUm9vdCBjb21taXQ/ICovCisJcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKwlpZiAoIXBhcmVudHMpIHsKKwkJaWYgKG9wdC0+c2hvd19yb290X2RpZmYpCisJCQlkaWZmX3Jvb3RfdHJlZShvcHQsIHNoYTEsICIiKTsKKwkJcmV0dXJuICFvcHQtPmxvZ2luZm87CisJfQorCisJLyogTW9yZSB0aGFuIG9uZSBwYXJlbnQ/ICovCisJaWYgKHBhcmVudHMgJiYgcGFyZW50cy0+bmV4dCkgeworCQlpZiAob3B0LT5pZ25vcmVfbWVyZ2VzKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKG9wdC0+Y29tYmluZV9tZXJnZXMpCisJCQlyZXR1cm4gZG9fZGlmZl9jb21iaW5lZChvcHQsIGNvbW1pdCk7CisKKwkJLyogSWYgd2Ugc2hvdyBpbmRpdmlkdWFsIGRpZmZzLCBzaG93IHRoZSBwYXJlbnQgaW5mbyAqLworCQlsb2ctPnBhcmVudCA9IHBhcmVudHMtPml0ZW07CisJfQorCisJc2hvd2VkX2xvZyA9IDA7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgY29tbWl0ICpwYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCisJCWRpZmZfdHJlZV9zaGExKHBhcmVudC0+b2JqZWN0LnNoYTEsIHNoYTEsICIiLCAmb3B0LT5kaWZmb3B0KTsKKwkJbG9nX3RyZWVfZGlmZl9mbHVzaChvcHQpOworCisJCXNob3dlZF9sb2cgfD0gIW9wdC0+bG9naW5mbzsKKworCQkvKiBTZXQgdXAgdGhlIGxvZyBpbmZvIGZvciB0aGUgbmV4dCBwYXJlbnQsIGlmIGFueS4uICovCisJCXBhcmVudHMgPSBwYXJlbnRzLT5uZXh0OworCQlpZiAoIXBhcmVudHMpCisJCQlicmVhazsKKwkJbG9nLT5wYXJlbnQgPSBwYXJlbnRzLT5pdGVtOworCQlvcHQtPmxvZ2luZm8gPSBsb2c7CisJfQorCXJldHVybiBzaG93ZWRfbG9nOworfQorCitpbnQgbG9nX3RyZWVfY29tbWl0KHN0cnVjdCByZXZfaW5mbyAqb3B0LCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpCit7CisJc3RydWN0IGxvZ19pbmZvIGxvZzsKKwlpbnQgc2hvd247CisKKwlsb2cuY29tbWl0ID0gY29tbWl0OworCWxvZy5wYXJlbnQgPSBOVUxMOworCW9wdC0+bG9naW5mbyA9ICZsb2c7CisKKwlzaG93biA9IGxvZ190cmVlX2RpZmYob3B0LCBjb21taXQsICZsb2cpOworCWlmICghc2hvd24gJiYgb3B0LT5sb2dpbmZvICYmIG9wdC0+YWx3YXlzX3Nob3dfaGVhZGVyKSB7CisJCWxvZy5wYXJlbnQgPSBOVUxMOworCQlzaG93X2xvZyhvcHQsICIiKTsKKwkJc2hvd24gPSAxOworCX0KKwlvcHQtPmxvZ2luZm8gPSBOVUxMOworCXJldHVybiBzaG93bjsKK30KZGlmZiAtLWdpdCBhL2xvZy10cmVlLmggYi9sb2ctdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmI1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9sb2ctdHJlZS5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgTE9HX1RSRUVfSAorI2RlZmluZSBMT0dfVFJFRV9ICisKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorCitzdHJ1Y3QgbG9nX2luZm8geworCXN0cnVjdCBjb21taXQgKmNvbW1pdCwgKnBhcmVudDsKK307CisKK3ZvaWQgaW5pdF9sb2dfdHJlZV9vcHQoc3RydWN0IHJldl9pbmZvICopOworaW50IGxvZ190cmVlX2RpZmZfZmx1c2goc3RydWN0IHJldl9pbmZvICopOworaW50IGxvZ190cmVlX2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKiwgc3RydWN0IGNvbW1pdCAqKTsKK2ludCBsb2dfdHJlZV9vcHRfcGFyc2Uoc3RydWN0IHJldl9pbmZvICosIGNvbnN0IGNoYXIgKiosIGludCk7Cit2b2lkIHNob3dfbG9nKHN0cnVjdCByZXZfaW5mbyAqb3B0LCBjb25zdCBjaGFyICpzZXApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lcmdlLWJhc2UuYyBiL21lcmdlLWJhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY3MjNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVyZ2UtYmFzZS5jCkBAIC0wLDAgKzEsNTQgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorCitzdGF0aWMgaW50IHNob3dfYWxsID0gMDsKKworc3RhdGljIGludCBtZXJnZV9iYXNlKHN0cnVjdCBjb21taXQgKnJldjEsIHN0cnVjdCBjb21taXQgKnJldjIpCit7CisJc3RydWN0IGNvbW1pdF9saXN0ICpyZXN1bHQgPSBnZXRfbWVyZ2VfYmFzZXMocmV2MSwgcmV2MiwgMCk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAocmVzdWx0KSB7CisJCXByaW50ZigiJXNcbiIsIHNoYTFfdG9faGV4KHJlc3VsdC0+aXRlbS0+b2JqZWN0LnNoYTEpKTsKKwkJaWYgKCFzaG93X2FsbCkKKwkJCXJldHVybiAwOworCQlyZXN1bHQgPSByZXN1bHQtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIG1lcmdlX2Jhc2VfdXNhZ2VbXSA9CisiZ2l0LW1lcmdlLWJhc2UgWy0tYWxsXSA8Y29tbWl0LWlkPiA8Y29tbWl0LWlkPiI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgY29tbWl0ICpyZXYxLCAqcmV2MjsKKwl1bnNpZ25lZCBjaGFyIHJldjFrZXlbMjBdLCByZXYya2V5WzIwXTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9kZWZhdWx0X2NvbmZpZyk7CisKKwl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKwkJY2hhciAqYXJnID0gYXJndlsxXTsKKwkJaWYgKCFzdHJjbXAoYXJnLCAiLWEiKSB8fCAhc3RyY21wKGFyZywgIi0tYWxsIikpCisJCQlzaG93X2FsbCA9IDE7CisJCWVsc2UKKwkJCXVzYWdlKG1lcmdlX2Jhc2VfdXNhZ2UpOworCQlhcmdjLS07IGFyZ3YrKzsKKwl9CisJaWYgKGFyZ2MgIT0gMykKKwkJdXNhZ2UobWVyZ2VfYmFzZV91c2FnZSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHJldjFrZXkpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsxXSk7CisJaWYgKGdldF9zaGExKGFyZ3ZbMl0sIHJldjJrZXkpKQorCQlkaWUoIk5vdCBhIHZhbGlkIG9iamVjdCBuYW1lICVzIiwgYXJndlsyXSk7CisJcmV2MSA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHJldjFrZXkpOworCXJldjIgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShyZXYya2V5KTsKKwlpZiAoIXJldjEgfHwgIXJldjIpCisJCXJldHVybiAxOworCXJldHVybiBtZXJnZV9iYXNlKHJldjEsIHJldjIpOworfQpkaWZmIC0tZ2l0IGEvbWVyZ2UtZmlsZS5jIGIvbWVyZ2UtZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmM2NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZXJnZS1maWxlLmMKQEAgLTAsMCArMSwxNjYgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAieGRpZmYtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorCitzdGF0aWMgdm9pZCBybV90ZW1wX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJdW5saW5rKGZpbGVuYW1lKTsKKwlmcmVlKCh2b2lkICopZmlsZW5hbWUpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqd3JpdGVfdGVtcF9maWxlKG1tZmlsZV90ICpmKQoreworCWludCBmZDsKKwljb25zdCBjaGFyICp0bXAgPSBnZXRlbnYoIlRNUERJUiIpOworCWNoYXIgKmZpbGVuYW1lOworCisJaWYgKCF0bXApCisJCXRtcCA9ICIvdG1wIjsKKwlmaWxlbmFtZSA9IG1rcGF0aCgiJXMvJXMiLCB0bXAsICJnaXQtdG1wLVhYWFhYWCIpOworCWZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJZmlsZW5hbWUgPSBzdHJkdXAoZmlsZW5hbWUpOworCWlmIChmLT5zaXplICE9IHh3cml0ZShmZCwgZi0+cHRyLCBmLT5zaXplKSkgeworCQlybV90ZW1wX2ZpbGUoZmlsZW5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY2xvc2UoZmQpOworCXJldHVybiBmaWxlbmFtZTsKK30KKworc3RhdGljIHZvaWQgKnJlYWRfdGVtcF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiBOVUxMOworCWlmICghZnN0YXQoZmQsICZzdCkpIHsKKwkJKnNpemUgPSBzdC5zdF9zaXplOworCQlidWYgPSB4bWFsbG9jKHN0LnN0X3NpemUpOworCQlpZiAoc3Quc3Rfc2l6ZSAhPSB4cmVhZChmZCwgYnVmLCBzdC5zdF9zaXplKSkgeworCQkJZnJlZShidWYpOworCQkJYnVmID0gTlVMTDsKKwkJfQorCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBmaWxsX21tZmlsZV9ibG9iKG1tZmlsZV90ICpmLCBzdHJ1Y3QgYmxvYiAqb2JqKQoreworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciB0eXBlWzIwXTsKKworCWJ1ZiA9IHJlYWRfc2hhMV9maWxlKG9iai0+b2JqZWN0LnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC0xOworCWlmIChzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkKKwkJcmV0dXJuIC0xOworCWYtPnB0ciA9IGJ1ZjsKKwlmLT5zaXplID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tbWZpbGUobW1maWxlX3QgKmYpCit7CisJZnJlZShmLT5wdHIpOworfQorCitzdGF0aWMgdm9pZCAqdGhyZWVfd2F5X2ZpbGVtZXJnZShtbWZpbGVfdCAqYmFzZSwgbW1maWxlX3QgKm91ciwgbW1maWxlX3QgKnRoZWlyLCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCXZvaWQgKnJlczsKKwljb25zdCBjaGFyICp0MSwgKnQyLCAqdDM7CisKKwl0MSA9IHdyaXRlX3RlbXBfZmlsZShiYXNlKTsKKwl0MiA9IHdyaXRlX3RlbXBfZmlsZShvdXIpOworCXQzID0gd3JpdGVfdGVtcF9maWxlKHRoZWlyKTsKKwlyZXMgPSBOVUxMOworCWlmICh0MSAmJiB0MiAmJiB0MykgeworCQlpbnQgY29kZSA9IHJ1bl9jb21tYW5kKCJtZXJnZSIsIHQyLCB0MSwgdDMsIE5VTEwpOworCQlpZiAoIWNvZGUgfHwgY29kZSA9PSAtMSkKKwkJCXJlcyA9IHJlYWRfdGVtcF9maWxlKHQyLCBzaXplKTsKKwl9CisJcm1fdGVtcF9maWxlKHQxKTsKKwlybV90ZW1wX2ZpbGUodDIpOworCXJtX3RlbXBfZmlsZSh0Myk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBjb21tb25fb3V0Zih2b2lkICpwcml2XywgbW1idWZmZXJfdCAqbWIsIGludCBuYnVmKQoreworCWludCBpOworCW1tZmlsZV90ICpkc3QgPSBwcml2XzsKKworCWZvciAoaSA9IDA7IGkgPCBuYnVmOyBpKyspIHsKKwkJbWVtY3B5KGRzdC0+cHRyICsgZHN0LT5zaXplLCBtYltpXS5wdHIsIG1iW2ldLnNpemUpOworCQlkc3QtPnNpemUgKz0gbWJbaV0uc2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfY29tbW9uX2ZpbGUobW1maWxlX3QgKnJlcywgbW1maWxlX3QgKmYxLCBtbWZpbGVfdCAqZjIpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZjEtPnNpemUgPCBmMi0+c2l6ZSA/IGYxLT5zaXplIDogZjItPnNpemU7CisJdm9pZCAqcHRyID0geG1hbGxvYyhzaXplKTsKKwl4cHBhcmFtX3QgeHBwOworCXhkZW1pdGNvbmZfdCB4ZWNmZzsKKwl4ZGVtaXRjYl90IGVjYjsKKworCXhwcC5mbGFncyA9IFhERl9ORUVEX01JTklNQUw7CisJeGVjZmcuY3R4bGVuID0gMzsKKwl4ZWNmZy5mbGFncyA9IFhETF9FTUlUX0NPTU1PTjsKKwllY2Iub3V0ZiA9IGNvbW1vbl9vdXRmOworCisJcmVzLT5wdHIgPSBwdHI7CisJcmVzLT5zaXplID0gMDsKKworCWVjYi5wcml2ID0gcmVzOworCXJldHVybiB4ZGxfZGlmZihmMSwgZjIsICZ4cHAsICZ4ZWNmZywgJmVjYik7Cit9CisKK3ZvaWQgKm1lcmdlX2ZpbGUoc3RydWN0IGJsb2IgKmJhc2UsIHN0cnVjdCBibG9iICpvdXIsIHN0cnVjdCBibG9iICp0aGVpciwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwl2b2lkICpyZXMgPSBOVUxMOworCW1tZmlsZV90IGYxLCBmMiwgY29tbW9uOworCisJLyoKKwkgKiBSZW1vdmVkIGluIGVpdGhlciBicmFuY2g/CisJICoKKwkgKiBOT1RFISBUaGlzIGRlcGVuZHMgb24gdGhlIGNhbGxlciBoYXZpbmcgZG9uZSB0aGUKKwkgKiBwcm9wZXIgd2FybmluZyBhYm91dCByZW1vdmluZyBhIGZpbGUgdGhhdCBnb3QKKwkgKiBtb2RpZmllZCBpbiB0aGUgb3RoZXIgYnJhbmNoIQorCSAqLworCWlmICghb3VyIHx8ICF0aGVpcikgeworCQljaGFyIHR5cGVbMjBdOworCQlpZiAoYmFzZSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoIW91cikKKwkJCW91ciA9IHRoZWlyOworCQlyZXR1cm4gcmVhZF9zaGExX2ZpbGUob3VyLT5vYmplY3Quc2hhMSwgdHlwZSwgc2l6ZSk7CisJfQorCisJaWYgKGZpbGxfbW1maWxlX2Jsb2IoJmYxLCBvdXIpIDwgMCkKKwkJZ290byBvdXRfbm9fbW1maWxlOworCWlmIChmaWxsX21tZmlsZV9ibG9iKCZmMiwgdGhlaXIpIDwgMCkKKwkJZ290byBvdXRfZnJlZV9mMTsKKworCWlmIChiYXNlKSB7CisJCWlmIChmaWxsX21tZmlsZV9ibG9iKCZjb21tb24sIGJhc2UpIDwgMCkKKwkJCWdvdG8gb3V0X2ZyZWVfZjJfZjE7CisJfSBlbHNlIHsKKwkJaWYgKGdlbmVyYXRlX2NvbW1vbl9maWxlKCZjb21tb24sICZmMSwgJmYyKSA8IDApCisJCQlnb3RvIG91dF9mcmVlX2YyX2YxOworCX0KKwlyZXMgPSB0aHJlZV93YXlfZmlsZW1lcmdlKCZjb21tb24sICZmMSwgJmYyLCBzaXplKTsKKwlmcmVlX21tZmlsZSgmY29tbW9uKTsKK291dF9mcmVlX2YyX2YxOgorCWZyZWVfbW1maWxlKCZmMik7CitvdXRfZnJlZV9mMToKKwlmcmVlX21tZmlsZSgmZjEpOworb3V0X25vX21tZmlsZToKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbWVyZ2UtaW5kZXguYyBiL21lcmdlLWluZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5OGE2ZgotLS0gL2Rldi9udWxsCisrKyBiL21lcmdlLWluZGV4LmMKQEAgLTAsMCArMSwxNDIgQEAKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKnBnbSA9IE5VTEw7CitzdGF0aWMgY29uc3QgY2hhciAqYXJndW1lbnRzWzhdOworc3RhdGljIGludCBvbmVfc2hvdCwgcXVpZXQ7CitzdGF0aWMgaW50IGVycjsKKworc3RhdGljIHZvaWQgcnVuX3Byb2dyYW0odm9pZCkKK3sKKwlpbnQgcGlkID0gZm9yaygpLCBzdGF0dXM7CisKKwlpZiAocGlkIDwgMCkKKwkJZGllKCJ1bmFibGUgdG8gZm9yayIpOworCWlmICghcGlkKSB7CisJCWV4ZWNscChwZ20sIGFyZ3VtZW50c1swXSwKKwkJCSAgICBhcmd1bWVudHNbMV0sCisJCQkgICAgYXJndW1lbnRzWzJdLAorCQkJICAgIGFyZ3VtZW50c1szXSwKKwkJCSAgICBhcmd1bWVudHNbNF0sCisJCQkgICAgYXJndW1lbnRzWzVdLAorCQkJICAgIGFyZ3VtZW50c1s2XSwKKwkJCSAgICBhcmd1bWVudHNbN10sCisJCQkgICAgTlVMTCk7CisJCWRpZSgidW5hYmxlIHRvIGV4ZWN1dGUgJyVzJyIsIHBnbSk7CisJfQorCWlmICh3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPCAwIHx8ICFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpKSB7CisJCWlmIChvbmVfc2hvdCkgeworCQkJZXJyKys7CisJCX0gZWxzZSB7CisJCQlpZiAoIXF1aWV0KQorCQkJCWRpZSgibWVyZ2UgcHJvZ3JhbSBmYWlsZWQiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2VfZW50cnkoaW50IHBvcywgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZm91bmQ7CisJCisJaWYgKHBvcyA+PSBhY3RpdmVfbnIpCisJCWRpZSgiZ2l0LW1lcmdlLWluZGV4OiAlcyBub3QgaW4gdGhlIGNhY2hlIiwgcGF0aCk7CisJYXJndW1lbnRzWzBdID0gcGdtOworCWFyZ3VtZW50c1sxXSA9ICIiOworCWFyZ3VtZW50c1syXSA9ICIiOworCWFyZ3VtZW50c1szXSA9ICIiOworCWFyZ3VtZW50c1s0XSA9IHBhdGg7CisJYXJndW1lbnRzWzVdID0gIiI7CisJYXJndW1lbnRzWzZdID0gIiI7CisJYXJndW1lbnRzWzddID0gIiI7CisJZm91bmQgPSAwOworCWRvIHsKKwkJc3RhdGljIGNoYXIgaGV4YnVmWzRdWzYwXTsKKwkJc3RhdGljIGNoYXIgb3duYnVmWzRdWzYwXTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQlpbnQgc3RhZ2UgPSBjZV9zdGFnZShjZSk7CisKKwkJaWYgKHN0cmNtcChjZS0+bmFtZSwgcGF0aCkpCisJCQlicmVhazsKKwkJZm91bmQrKzsKKwkJc3RyY3B5KGhleGJ1ZltzdGFnZV0sIHNoYTFfdG9faGV4KGNlLT5zaGExKSk7CisJCXNwcmludGYob3duYnVmW3N0YWdlXSwgIiVvIiwgbnRvaGwoY2UtPmNlX21vZGUpICYgKH5TX0lGTVQpKTsKKwkJYXJndW1lbnRzW3N0YWdlXSA9IGhleGJ1ZltzdGFnZV07CisJCWFyZ3VtZW50c1tzdGFnZSArIDRdID0gb3duYnVmW3N0YWdlXTsKKwl9IHdoaWxlICgrK3BvcyA8IGFjdGl2ZV9ucik7CisJaWYgKCFmb3VuZCkKKwkJZGllKCJnaXQtbWVyZ2UtaW5kZXg6ICVzIG5vdCBpbiB0aGUgY2FjaGUiLCBwYXRoKTsKKwlydW5fcHJvZ3JhbSgpOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHZvaWQgbWVyZ2VfZmlsZShjb25zdCBjaGFyICpwYXRoKQoreworCWludCBwb3MgPSBjYWNoZV9uYW1lX3BvcyhwYXRoLCBzdHJsZW4ocGF0aCkpOworCisJLyoKKwkgKiBJZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY2FjaGUgYXMgc3RhZ2UwLCBpdCdzCisJICogYWxyZWFkeSBtZXJnZWQgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKHBvcyA8IDApCisJCW1lcmdlX2VudHJ5KC1wb3MtMSwgcGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX2FsbCh2b2lkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gYWN0aXZlX2NhY2hlW2ldOworCQlpZiAoIWNlX3N0YWdlKGNlKSkKKwkJCWNvbnRpbnVlOworCQlpICs9IG1lcmdlX2VudHJ5KGksIGNlLT5uYW1lKS0xOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCBmb3JjZV9maWxlID0gMDsKKworCS8qIFdpdGhvdXQgdGhpcyB3ZSBjYW5ub3QgcmVseSBvbiB3YWl0cGlkKCkgdG8gdGVsbAorCSAqIHdoYXQgaGFwcGVuZWQgdG8gb3VyIGNoaWxkcmVuLgorCSAqLworCXNpZ25hbChTSUdDSExELCBTSUdfREZMKTsKKworCWlmIChhcmdjIDwgMykKKwkJdXNhZ2UoImdpdC1tZXJnZS1pbmRleCBbLW9dIFstcV0gPG1lcmdlLXByb2dyYW0+ICgtYSB8IDxmaWxlbmFtZT4qKSIpOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCXJlYWRfY2FjaGUoKTsKKworCWkgPSAxOworCWlmICghc3RyY21wKGFyZ3ZbaV0sICItbyIpKSB7CisJCW9uZV9zaG90ID0gMTsKKwkJaSsrOworCX0KKwlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXEiKSkgeworCQlxdWlldCA9IDE7CisJCWkrKzsKKwl9CisJcGdtID0gYXJndltpKytdOworCWZvciAoOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmICghZm9yY2VfZmlsZSAmJiAqYXJnID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJCWZvcmNlX2ZpbGUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLWEiKSkgeworCQkJCW1lcmdlX2FsbCgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGllKCJnaXQtbWVyZ2UtaW5kZXg6IHVua25vd24gb3B0aW9uICVzIiwgYXJnKTsKKwkJfQorCQltZXJnZV9maWxlKGFyZyk7CisJfQorCWlmIChlcnIgJiYgIXF1aWV0KQorCQlkaWUoIm1lcmdlIHByb2dyYW0gZmFpbGVkIik7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL21lcmdlLXRyZWUuYyBiL21lcmdlLXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2YwMGJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVyZ2UtdHJlZS5jCkBAIC0wLDAgKzEsMzUzIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIG1lcmdlX3RyZWVfdXNhZ2VbXSA9ICJnaXQtbWVyZ2UtdHJlZSA8YmFzZS10cmVlPiA8YnJhbmNoMT4gPGJyYW5jaDI+IjsKK3N0YXRpYyBpbnQgcmVzb2x2ZV9kaXJlY3RvcmllcyA9IDE7CisKK3N0cnVjdCBtZXJnZV9saXN0IHsKKwlzdHJ1Y3QgbWVyZ2VfbGlzdCAqbmV4dDsKKwlzdHJ1Y3QgbWVyZ2VfbGlzdCAqbGluazsJLyogb3RoZXIgc3RhZ2VzIGZvciB0aGlzIG9iamVjdCAqLworCisJdW5zaWduZWQgaW50IHN0YWdlIDogMiwKKwkJICAgICBmbGFncyA6IDMwOworCXVuc2lnbmVkIGludCBtb2RlOworCWNvbnN0IGNoYXIgKnBhdGg7CisJc3RydWN0IGJsb2IgKmJsb2I7Cit9OworCitzdGF0aWMgc3RydWN0IG1lcmdlX2xpc3QgKm1lcmdlX3Jlc3VsdCwgKiptZXJnZV9yZXN1bHRfZW5kID0gJm1lcmdlX3Jlc3VsdDsKKworc3RhdGljIHZvaWQgYWRkX21lcmdlX2VudHJ5KHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSkKK3sKKwkqbWVyZ2VfcmVzdWx0X2VuZCA9IGVudHJ5OworCW1lcmdlX3Jlc3VsdF9lbmQgPSAmZW50cnktPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX3RyZWVzKHN0cnVjdCB0cmVlX2Rlc2MgdFszXSwgY29uc3QgY2hhciAqYmFzZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpleHBsYW5hdGlvbihzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkpCit7CisJc3dpdGNoIChlbnRyeS0+c3RhZ2UpIHsKKwljYXNlIDA6CisJCXJldHVybiAibWVyZ2VkIjsKKwljYXNlIDM6CisJCXJldHVybiAiYWRkZWQgaW4gcmVtb3RlIjsKKwljYXNlIDI6CisJCWlmIChlbnRyeS0+bGluaykKKwkJCXJldHVybiAiYWRkZWQgaW4gYm90aCI7CisJCXJldHVybiAiYWRkZWQgaW4gbG9jYWwiOworCX0KKworCS8qIEV4aXN0ZWQgaW4gYmFzZSAqLworCWVudHJ5ID0gZW50cnktPmxpbms7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuICJyZW1vdmVkIGluIGJvdGgiOworCisJaWYgKGVudHJ5LT5saW5rKQorCQlyZXR1cm4gImNoYW5nZWQgaW4gYm90aCI7CisKKwlpZiAoZW50cnktPnN0YWdlID09IDMpCisJCXJldHVybiAicmVtb3ZlZCBpbiBsb2NhbCI7CisJcmV0dXJuICJyZW1vdmVkIGluIHJlbW90ZSI7Cit9CisKK2V4dGVybiB2b2lkICptZXJnZV9maWxlKHN0cnVjdCBibG9iICosIHN0cnVjdCBibG9iICosIHN0cnVjdCBibG9iICosIHVuc2lnbmVkIGxvbmcgKik7CisKK3N0YXRpYyB2b2lkICpyZXN1bHQoc3RydWN0IG1lcmdlX2xpc3QgKmVudHJ5LCB1bnNpZ25lZCBsb25nICpzaXplKQoreworCWNoYXIgdHlwZVsyMF07CisJc3RydWN0IGJsb2IgKmJhc2UsICpvdXIsICp0aGVpcjsKKworCWlmICghZW50cnktPnN0YWdlKQorCQlyZXR1cm4gcmVhZF9zaGExX2ZpbGUoZW50cnktPmJsb2ItPm9iamVjdC5zaGExLCB0eXBlLCBzaXplKTsKKwliYXNlID0gTlVMTDsKKwlpZiAoZW50cnktPnN0YWdlID09IDEpIHsKKwkJYmFzZSA9IGVudHJ5LT5ibG9iOworCQllbnRyeSA9IGVudHJ5LT5saW5rOworCX0KKwlvdXIgPSBOVUxMOworCWlmIChlbnRyeSAmJiBlbnRyeS0+c3RhZ2UgPT0gMikgeworCQlvdXIgPSBlbnRyeS0+YmxvYjsKKwkJZW50cnkgPSBlbnRyeS0+bGluazsKKwl9CisJdGhlaXIgPSBOVUxMOworCWlmIChlbnRyeSkKKwkJdGhlaXIgPSBlbnRyeS0+YmxvYjsKKwlyZXR1cm4gbWVyZ2VfZmlsZShiYXNlLCBvdXIsIHRoZWlyLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgKm9yaWdpbihzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnksIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJY2hhciB0eXBlWzIwXTsKKwl3aGlsZSAoZW50cnkpIHsKKwkJaWYgKGVudHJ5LT5zdGFnZSA9PSAyKQorCQkJcmV0dXJuIHJlYWRfc2hhMV9maWxlKGVudHJ5LT5ibG9iLT5vYmplY3Quc2hhMSwgdHlwZSwgc2l6ZSk7CisJCWVudHJ5ID0gZW50cnktPmxpbms7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNob3dfb3V0Zih2b2lkICpwcml2XywgbW1idWZmZXJfdCAqbWIsIGludCBuYnVmKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuYnVmOyBpKyspCisJCXByaW50ZigiJS4qcyIsIChpbnQpIG1iW2ldLnNpemUsIG1iW2ldLnB0cik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfZGlmZihzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyBzaXplOworCW1tZmlsZV90IHNyYywgZHN0OworCXhwcGFyYW1fdCB4cHA7CisJeGRlbWl0Y29uZl90IHhlY2ZnOworCXhkZW1pdGNiX3QgZWNiOworCisJeHBwLmZsYWdzID0gWERGX05FRURfTUlOSU1BTDsKKwl4ZWNmZy5jdHhsZW4gPSAzOworCXhlY2ZnLmZsYWdzID0gMDsKKwllY2Iub3V0ZiA9IHNob3dfb3V0ZjsKKwllY2IucHJpdiA9IE5VTEw7CisKKwlzcmMucHRyID0gb3JpZ2luKGVudHJ5LCAmc2l6ZSk7CisJaWYgKCFzcmMucHRyKQorCQlzaXplID0gMDsKKwlzcmMuc2l6ZSA9IHNpemU7CisJZHN0LnB0ciA9IHJlc3VsdChlbnRyeSwgJnNpemUpOworCWlmICghZHN0LnB0cikKKwkJc2l6ZSA9IDA7CisJZHN0LnNpemUgPSBzaXplOworCXhkbF9kaWZmKCZzcmMsICZkc3QsICZ4cHAsICZ4ZWNmZywgJmVjYik7CisJZnJlZShzcmMucHRyKTsKKwlmcmVlKGRzdC5wdHIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3Jlc3VsdF9saXN0KHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSkKK3sKKwlwcmludGYoIiVzXG4iLCBleHBsYW5hdGlvbihlbnRyeSkpOworCWRvIHsKKwkJc3RydWN0IG1lcmdlX2xpc3QgKmxpbmsgPSBlbnRyeS0+bGluazsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmRlc2NbNF0gPSB7ICJyZXN1bHQiLCAiYmFzZSIsICJvdXIiLCAidGhlaXIiIH07CisJCXByaW50ZigiICAlLTZzICVvICVzICVzXG4iLCBkZXNjW2VudHJ5LT5zdGFnZV0sIGVudHJ5LT5tb2RlLCBzaGExX3RvX2hleChlbnRyeS0+YmxvYi0+b2JqZWN0LnNoYTEpLCBlbnRyeS0+cGF0aCk7CisJCWVudHJ5ID0gbGluazsKKwl9IHdoaWxlIChlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcmVzdWx0KHZvaWQpCit7CisJc3RydWN0IG1lcmdlX2xpc3QgKndhbGs7CisKKwl3YWxrID0gbWVyZ2VfcmVzdWx0OworCXdoaWxlICh3YWxrKSB7CisJCXNob3dfcmVzdWx0X2xpc3Qod2Fsayk7CisJCXNob3dfZGlmZih3YWxrKTsKKwkJd2FsayA9IHdhbGstPm5leHQ7CisJfQorfQorCisvKiBBbiBlbXB0eSBlbnRyeSBuZXZlciBjb21wYXJlcyBzYW1lLCBub3QgZXZlbiB0byBhbm90aGVyIGVtcHR5IGVudHJ5ICovCitzdGF0aWMgaW50IHNhbWVfZW50cnkoc3RydWN0IG5hbWVfZW50cnkgKmEsIHN0cnVjdCBuYW1lX2VudHJ5ICpiKQoreworCXJldHVybglhLT5zaGExICYmCisJCWItPnNoYTEgJiYKKwkJIW1lbWNtcChhLT5zaGExLCBiLT5zaGExLCAyMCkgJiYKKwkJYS0+bW9kZSA9PSBiLT5tb2RlOworfQorCitzdGF0aWMgc3RydWN0IG1lcmdlX2xpc3QgKmNyZWF0ZV9lbnRyeSh1bnNpZ25lZCBzdGFnZSwgdW5zaWduZWQgbW9kZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgbWVyZ2VfbGlzdCAqcmVzID0geG1hbGxvYyhzaXplb2YoKnJlcykpOworCisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKKwlyZXMtPnN0YWdlID0gc3RhZ2U7CisJcmVzLT5wYXRoID0gcGF0aDsKKwlyZXMtPm1vZGUgPSBtb2RlOworCXJlcy0+YmxvYiA9IGxvb2t1cF9ibG9iKHNoYTEpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHJlc29sdmUoY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IG5hbWVfZW50cnkgKmJyYW5jaDEsIHN0cnVjdCBuYW1lX2VudHJ5ICpyZXN1bHQpCit7CisJc3RydWN0IG1lcmdlX2xpc3QgKm9yaWcsICpmaW5hbDsKKwljb25zdCBjaGFyICpwYXRoOworCisJLyogSWYgaXQncyBhbHJlYWR5IGJyYW5jaDEsIGRvbid0IGJvdGhlciBzaG93aW5nIGl0ICovCisJaWYgKCFicmFuY2gxKQorCQlyZXR1cm47CisKKwlwYXRoID0gc3RyZHVwKG1rcGF0aCgiJXMlcyIsIGJhc2UsIHJlc3VsdC0+cGF0aCkpOworCW9yaWcgPSBjcmVhdGVfZW50cnkoMiwgYnJhbmNoMS0+bW9kZSwgYnJhbmNoMS0+c2hhMSwgcGF0aCk7CisJZmluYWwgPSBjcmVhdGVfZW50cnkoMCwgcmVzdWx0LT5tb2RlLCByZXN1bHQtPnNoYTEsIHBhdGgpOworCisJZmluYWwtPmxpbmsgPSBvcmlnOworCisJYWRkX21lcmdlX2VudHJ5KGZpbmFsKTsKK30KKworc3RhdGljIGludCB1bnJlc29sdmVkX2RpcmVjdG9yeShjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgbmFtZV9lbnRyeSBuWzNdKQoreworCWludCBiYXNlbGVuOworCWNoYXIgKm5ld2Jhc2U7CisJc3RydWN0IG5hbWVfZW50cnkgKnA7CisJc3RydWN0IHRyZWVfZGVzYyB0WzNdOworCXZvaWQgKmJ1ZjAsICpidWYxLCAqYnVmMjsKKworCWlmICghcmVzb2x2ZV9kaXJlY3RvcmllcykKKwkJcmV0dXJuIDA7CisJcCA9IG47CisJaWYgKCFwLT5tb2RlKSB7CisJCXArKzsKKwkJaWYgKCFwLT5tb2RlKQorCQkJcCsrOworCX0KKwlpZiAoIVNfSVNESVIocC0+bW9kZSkpCisJCXJldHVybiAwOworCWJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHAtPnBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwLT5wYXRoLCBwLT5wYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwLT5wYXRobGVuLCAiLyIsIDIpOworCisJYnVmMCA9IGZpbGxfdHJlZV9kZXNjcmlwdG9yKHQrMCwgblswXS5zaGExKTsKKwlidWYxID0gZmlsbF90cmVlX2Rlc2NyaXB0b3IodCsxLCBuWzFdLnNoYTEpOworCWJ1ZjIgPSBmaWxsX3RyZWVfZGVzY3JpcHRvcih0KzIsIG5bMl0uc2hhMSk7CisJbWVyZ2VfdHJlZXModCwgbmV3YmFzZSk7CisKKwlmcmVlKGJ1ZjApOworCWZyZWUoYnVmMSk7CisJZnJlZShidWYyKTsKKwlmcmVlKG5ld2Jhc2UpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbWVyZ2VfbGlzdCAqbGlua19lbnRyeSh1bnNpZ25lZCBzdGFnZSwgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IG5hbWVfZW50cnkgKm4sIHN0cnVjdCBtZXJnZV9saXN0ICplbnRyeSkKK3sKKwljb25zdCBjaGFyICpwYXRoOworCXN0cnVjdCBtZXJnZV9saXN0ICpsaW5rOworCisJaWYgKCFuLT5tb2RlKQorCQlyZXR1cm4gZW50cnk7CisJaWYgKGVudHJ5KQorCQlwYXRoID0gZW50cnktPnBhdGg7CisJZWxzZQorCQlwYXRoID0gc3RyZHVwKG1rcGF0aCgiJXMlcyIsIGJhc2UsIG4tPnBhdGgpKTsKKwlsaW5rID0gY3JlYXRlX2VudHJ5KHN0YWdlLCBuLT5tb2RlLCBuLT5zaGExLCBwYXRoKTsKKwlsaW5rLT5saW5rID0gZW50cnk7CisJcmV0dXJuIGxpbms7Cit9CisKK3N0YXRpYyB2b2lkIHVucmVzb2x2ZWQoY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IG5hbWVfZW50cnkgblszXSkKK3sKKwlzdHJ1Y3QgbWVyZ2VfbGlzdCAqZW50cnkgPSBOVUxMOworCisJaWYgKHVucmVzb2x2ZWRfZGlyZWN0b3J5KGJhc2UsIG4pKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERvIHRoZW0gaW4gcmV2ZXJzZSBvcmRlciBzbyB0aGF0IHRoZSByZXN1bHRpbmcgbGluaworCSAqIGxpc3QgaGFzIHRoZSBzdGFnZXMgaW4gb3JkZXIgLSBsaW5rX2VudHJ5IGFkZHMgbmV3CisJICogbGlua3MgYXQgdGhlIGZyb250LgorCSAqLworCWVudHJ5ID0gbGlua19lbnRyeSgzLCBiYXNlLCBuICsgMiwgZW50cnkpOworCWVudHJ5ID0gbGlua19lbnRyeSgyLCBiYXNlLCBuICsgMSwgZW50cnkpOworCWVudHJ5ID0gbGlua19lbnRyeSgxLCBiYXNlLCBuICsgMCwgZW50cnkpOworCisJYWRkX21lcmdlX2VudHJ5KGVudHJ5KTsKK30KKworLyoKKyAqIE1lcmdlIHR3byB0cmVlcyB0b2dldGhlciAodFsxXSBhbmQgdFsyXSksIHVzaW5nIGEgY29tbW9uIGJhc2UgKHRbMF0pCisgKiBhcyB0aGUgb3JpZ2luLgorICoKKyAqIFRoaXMgd2Fsa3MgdGhlIChzb3J0ZWQpIHRyZWVzIGluIGxvY2stc3RlcCwgY2hlY2tpbmcgZXZlcnkgcG9zc2libGUKKyAqIG5hbWUuIE5vdGUgdGhhdCBkaXJlY3RvcmllcyBhdXRvbWF0aWNhbGx5IHNvcnQgZGlmZmVyZW50bHkgZnJvbSBvdGhlcgorICogZmlsZXMgKHNlZSAiYmFzZV9uYW1lX2NvbXBhcmUiKSwgc28geW91J2xsIG5ldmVyIHNlZSBmaWxlL2RpcmVjdG9yeQorICogY29uZmxpY3RzLCBiZWNhdXNlIHRoZXkgd29uJ3QgZXZlciBjb21wYXJlIHRoZSBzYW1lLgorICoKKyAqIElPVywgaWYgYSBkaXJlY3RvcnkgY2hhbmdlcyB0byBhIGZpbGVuYW1lLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKKyAqIHNlZW4gYXMgdGhlIGRpcmVjdG9yeSBnb2luZyBhd2F5LCBhbmQgdGhlIGZpbGVuYW1lIGJlaW5nIGNyZWF0ZWQuCisgKgorICogVGhpbmsgb2YgdGhpcyBhcyBhIHRocmVlLXdheSBkaWZmLgorICoKKyAqIFRoZSBvdXRwdXQgd2lsbCBiZSBlaXRoZXI6CisgKiAgLSBzdWNjZXNzZnVsIG1lcmdlCisgKgkgIjAgbW9kZSBzaGExIGZpbGVuYW1lIgorICogICAgTk9URSBOT1RFIE5PVEUhIEZJWE1FISBXZSByZWFsbHkgcmVhbGx5IG5lZWQgdG8gd2FsayB0aGUgaW5kZXgKKyAqICAgIGluIHBhcmFsbGVsIHdpdGggdGhpcyB0b28hCisgKgorICogIC0gY29uZmxpY3Q6CisgKgkiMSBtb2RlIHNoYTEgZmlsZW5hbWUiCisgKgkiMiBtb2RlIHNoYTEgZmlsZW5hbWUiCisgKgkiMyBtb2RlIHNoYTEgZmlsZW5hbWUiCisgKiAgICB3aGVyZSBub3QgYWxsIG9mIHRoZSAxLzIvMyBsaW5lcyBtYXkgZXhpc3QsIG9mIGNvdXJzZS4KKyAqCisgKiBUaGUgc3VjY2Vzc2Z1bCBtZXJnZSBydWxlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSB0aHJlZS13YXkgbWVyZ2UKKyAqIGluIGdpdC1yZWFkLXRyZWUuCisgKi8KK3N0YXRpYyB2b2lkIHRocmVld2F5X2NhbGxiYWNrKGludCBuLCB1bnNpZ25lZCBsb25nIG1hc2ssIHN0cnVjdCBuYW1lX2VudHJ5ICplbnRyeSwgY29uc3QgY2hhciAqYmFzZSkKK3sKKwkvKiBTYW1lIGluIGJvdGg/ICovCisJaWYgKHNhbWVfZW50cnkoZW50cnkrMSwgZW50cnkrMikpIHsKKwkJaWYgKGVudHJ5WzBdLnNoYTEpIHsKKwkJCXJlc29sdmUoYmFzZSwgTlVMTCwgZW50cnkrMSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoc2FtZV9lbnRyeShlbnRyeSswLCBlbnRyeSsxKSkgeworCQlpZiAoZW50cnlbMl0uc2hhMSAmJiAhU19JU0RJUihlbnRyeVsyXS5tb2RlKSkgeworCQkJcmVzb2x2ZShiYXNlLCBlbnRyeSsxLCBlbnRyeSsyKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChzYW1lX2VudHJ5KGVudHJ5KzAsIGVudHJ5KzIpKSB7CisJCWlmIChlbnRyeVsxXS5zaGExICYmICFTX0lTRElSKGVudHJ5WzFdLm1vZGUpKSB7CisJCQlyZXNvbHZlKGJhc2UsIE5VTEwsIGVudHJ5KzEpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJdW5yZXNvbHZlZChiYXNlLCBlbnRyeSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lcmdlX3RyZWVzKHN0cnVjdCB0cmVlX2Rlc2MgdFszXSwgY29uc3QgY2hhciAqYmFzZSkKK3sKKwl0cmF2ZXJzZV90cmVlcygzLCB0LCBiYXNlLCB0aHJlZXdheV9jYWxsYmFjayk7Cit9CisKK3N0YXRpYyB2b2lkICpnZXRfdHJlZV9kZXNjcmlwdG9yKHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKnJldikKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXZvaWQgKmJ1ZjsKKworCWlmIChnZXRfc2hhMShyZXYsIHNoYTEpKQorCQlkaWUoInVua25vd24gcmV2ICVzIiwgcmV2KTsKKwlidWYgPSBmaWxsX3RyZWVfZGVzY3JpcHRvcihkZXNjLCBzaGExKTsKKwlpZiAoIWJ1ZikKKwkJZGllKCIlcyBpcyBub3QgYSB0cmVlIiwgcmV2KTsKKwlyZXR1cm4gYnVmOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHRyZWVfZGVzYyB0WzNdOworCXZvaWQgKmJ1ZjEsICpidWYyLCAqYnVmMzsKKworCWlmIChhcmdjIDwgNCkKKwkJdXNhZ2UobWVyZ2VfdHJlZV91c2FnZSk7CisKKwlidWYxID0gZ2V0X3RyZWVfZGVzY3JpcHRvcih0KzAsIGFyZ3ZbMV0pOworCWJ1ZjIgPSBnZXRfdHJlZV9kZXNjcmlwdG9yKHQrMSwgYXJndlsyXSk7CisJYnVmMyA9IGdldF90cmVlX2Rlc2NyaXB0b3IodCsyLCBhcmd2WzNdKTsKKwltZXJnZV90cmVlcyh0LCAiIik7CisJZnJlZShidWYxKTsKKwlmcmVlKGJ1ZjIpOworCWZyZWUoYnVmMyk7CisKKwlzaG93X3Jlc3VsdCgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWt0YWcuYyBiL21rdGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyM2U1OAotLS0gL2Rldi9udWxsCisrKyBiL21rdGFnLmMKQEAgLTAsMCArMSwxNDcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorCisvKgorICogQSBzaWduYXR1cmUgZmlsZSBoYXMgYSB2ZXJ5IHNpbXBsZSBmaXhlZCBmb3JtYXQ6IGZvdXIgbGluZXMKKyAqIG9mICJvYmplY3QgPHNoYTE+IiArICJ0eXBlIDx0eXBlbmFtZT4iICsgInRhZyA8dGFnbmFtZT4iICsKKyAqICJ0YWdnZXIgPGNvbW1pdHRlcj4iLCBmb2xsb3dlZCBieSBhIGJsYW5rIGxpbmUsIGEgZnJlZS1mb3JtIHRhZworICogbWVzc2FnZSBhbmQgYSBzaWduYXR1cmUgYmxvY2sgdGhhdCBnaXQgaXRzZWxmIGRvZXNuJ3QgY2FyZSBhYm91dCwKKyAqIGJ1dCB0aGF0IGNhbiBiZSB2ZXJpZmllZCB3aXRoIGdwZyBvciBzaW1pbGFyLgorICoKKyAqIFRoZSBmaXJzdCB0aHJlZSBsaW5lcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdCA2MyBieXRlczoKKyAqICJvYmplY3QgPHNoYTE+XG4iIGlzIDQ4IGJ5dGVzLCAidHlwZSB0YWdcbiIgYXQgOSBieXRlcyBpcyB0aGUKKyAqIHNob3J0ZXN0IHBvc3NpYmxlIHR5cGUtbGluZSwgYW5kICJ0YWcgLlxuIiBhdCA2IGJ5dGVzIGlzIHRoZQorICogc2hvcnRlc3Qgc2luZ2xlLWNoYXJhY3Rlci10YWcgbGluZS4gCisgKgorICogV2UgYWxzbyBhcnRpZmljaWFsbHkgbGltaXQgdGhlIHNpemUgb2YgdGhlIGZ1bGwgb2JqZWN0IHRvIDhrQi4KKyAqIEp1c3QgYmVjYXVzZSBJJ20gYSBsYXp5IGJhc3RhcmQsIGFuZCBpZiB5b3UgY2FuJ3QgZml0IGEgc2lnbmF0dXJlCisgKiBpbiB0aGF0IHNpemUsIHlvdSdyZSBkb2luZyBzb21ldGhpbmcgd3JvbmcuCisgKi8KKworLyogU29tZSByYW5kb20gc2l6ZSAqLworI2RlZmluZSBNQVhTSVpFICg4MTkyKQorCisvKgorICogV2UgcmVmdXNlIHRvIHRhZyBzb21ldGhpbmcgd2UgY2FuJ3QgdmVyaWZ5LiBKdXN0IGJlY2F1c2UuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X29iamVjdCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICpleHBlY3RlZF90eXBlKQoreworCWludCByZXQgPSAtMTsKKwljaGFyIHR5cGVbMTAwXTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdm9pZCAqYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJnNpemUpOworCisJaWYgKGJ1ZmZlcikgeworCQlpZiAoIXN0cmNtcCh0eXBlLCBleHBlY3RlZF90eXBlKSkKKwkJCXJldCA9IGNoZWNrX3NoYTFfc2lnbmF0dXJlKHNoYTEsIGJ1ZmZlciwgc2l6ZSwgdHlwZSk7CisJCWZyZWUoYnVmZmVyKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIE5PX0M5OV9GT1JNQVQKKyNkZWZpbmUgUERfRk1UICIlZCIKKyNlbHNlCisjZGVmaW5lIFBEX0ZNVCAiJXRkIgorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmVyaWZ5X3RhZyhjaGFyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgdHlwZWxlbjsKKwljaGFyIHR5cGVbMjBdOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqb2JqZWN0LCAqdHlwZV9saW5lLCAqdGFnX2xpbmUsICp0YWdnZXJfbGluZTsKKworCWlmIChzaXplIDwgNjQpCisJCXJldHVybiBlcnJvcigid2FubmEgZm9vbCBtZSA/IHlvdSBvYnZpb3VzbHkgZ290IHRoZSBzaXplIHdyb25nICEiKTsKKworCWJ1ZmZlcltzaXplXSA9IDA7CisKKwkvKiBWZXJpZnkgb2JqZWN0IGxpbmUgKi8KKwlvYmplY3QgPSBidWZmZXI7CisJaWYgKG1lbWNtcChvYmplY3QsICJvYmplY3QgIiwgNykpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBkb2VzIG5vdCBzdGFydCB3aXRoIFwib2JqZWN0IFwiIiwgMCk7CisKKwlpZiAoZ2V0X3NoYTFfaGV4KG9iamVjdCArIDcsIHNoYTEpKQorCQlyZXR1cm4gZXJyb3IoImNoYXIlZDogY291bGQgbm90IGdldCBTSEExIGhhc2giLCA3KTsKKworCS8qIFZlcmlmeSB0eXBlIGxpbmUgKi8KKwl0eXBlX2xpbmUgPSBvYmplY3QgKyA0ODsKKwlpZiAobWVtY21wKHR5cGVfbGluZSAtIDEsICJcbnR5cGUgIiwgNikpCisJCXJldHVybiBlcnJvcigiY2hhciVkOiBjb3VsZCBub3QgZmluZCBcIlxcbnR5cGUgXCIiLCA0Nyk7CisKKwkvKiBWZXJpZnkgdGFnLWxpbmUgKi8KKwl0YWdfbGluZSA9IHN0cmNocih0eXBlX2xpbmUsICdcbicpOworCWlmICghdGFnX2xpbmUpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IGNvdWxkIG5vdCBmaW5kIG5leHQgXCJcXG5cIiIsIHR5cGVfbGluZSAtIGJ1ZmZlcik7CisJdGFnX2xpbmUrKzsKKwlpZiAobWVtY21wKHRhZ19saW5lLCAidGFnICIsIDQpIHx8IHRhZ19saW5lWzRdID09ICdcbicpCisJCXJldHVybiBlcnJvcigiY2hhciIgUERfRk1UICI6IG5vIFwidGFnIFwiIGZvdW5kIiwgdGFnX2xpbmUgLSBidWZmZXIpOworCisJLyogR2V0IHRoZSBhY3R1YWwgdHlwZSAqLworCXR5cGVsZW4gPSB0YWdfbGluZSAtIHR5cGVfbGluZSAtIHN0cmxlbigidHlwZSBcbiIpOworCWlmICh0eXBlbGVuID49IHNpemVvZih0eXBlKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogdHlwZSB0b28gbG9uZyIsIHR5cGVfbGluZSs1IC0gYnVmZmVyKTsKKworCW1lbWNweSh0eXBlLCB0eXBlX2xpbmUrNSwgdHlwZWxlbik7CisJdHlwZVt0eXBlbGVuXSA9IDA7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgb2JqZWN0IG1hdGNoZXMgKi8KKwlpZiAodmVyaWZ5X29iamVjdChzaGExLCB0eXBlKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyJWQ6IGNvdWxkIG5vdCB2ZXJpZnkgb2JqZWN0ICVzIiwgNywgc2hhMV90b19oZXgoc2hhMSkpOworCisJLyogVmVyaWZ5IHRoZSB0YWctbmFtZTogd2UgZG9uJ3QgYWxsb3cgY29udHJvbCBjaGFyYWN0ZXJzIG9yIHNwYWNlcyBpbiBpdCAqLworCXRhZ19saW5lICs9IDQ7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqdGFnX2xpbmUrKzsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCQlpZiAoYyA+ICcgJykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gZXJyb3IoImNoYXIiIFBEX0ZNVCAiOiBjb3VsZCBub3QgdmVyaWZ5IHRhZyBuYW1lIiwgdGFnX2xpbmUgLSBidWZmZXIpOworCX0KKworCS8qIFZlcmlmeSB0aGUgdGFnZ2VyIGxpbmUgKi8KKwl0YWdnZXJfbGluZSA9IHRhZ19saW5lOworCisJaWYgKG1lbWNtcCh0YWdnZXJfbGluZSwgInRhZ2dlciIsIDYpIHx8ICh0YWdnZXJfbGluZVs2XSA9PSAnXG4nKSkKKwkJcmV0dXJuIGVycm9yKCJjaGFyIiBQRF9GTVQgIjogY291bGQgbm90IGZpbmQgXCJ0YWdnZXJcIiIsIHRhZ2dlcl9saW5lIC0gYnVmZmVyKTsKKworCS8qIFRPRE86IGNoZWNrIGZvciBjb21taXR0ZXIgaW5mbyArIGJsYW5rIGxpbmU/ICovCisJLyogQWxzbywgdGhlIG1pbmltdW0gbGVuZ3RoIGlzIHByb2JhYmx5ICsgInRhZ2dlciAuIiwgb3IgNjMrOD03MSAqLworCisJLyogVGhlIGFjdHVhbCBzdHVmZiBhZnRlcndhcmRzIHdlIGRvbid0IGNhcmUgYWJvdXQuLiAqLworCXJldHVybiAwOworfQorCisjdW5kZWYgUERfRk1UCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSA0MDk2OworCWNoYXIgKmJ1ZmZlciA9IG1hbGxvYyhzaXplKTsKKwl1bnNpZ25lZCBjaGFyIHJlc3VsdF9zaGExWzIwXTsKKworCWlmIChhcmdjICE9IDEpCisJCXVzYWdlKCJnaXQtbWt0YWcgPCBzaWduYXR1cmVmaWxlIik7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlpZiAocmVhZF9waXBlKDAsICZidWZmZXIsICZzaXplKSkgeworCQlmcmVlKGJ1ZmZlcik7CisJCWRpZSgiY291bGQgbm90IHJlYWQgZnJvbSBzdGRpbiIpOworCX0KKworCS8qIFZlcmlmeSBpdCBmb3Igc29tZSBiYXNpYyBzYW5pdHk6IGl0IG5lZWRzIHRvIHN0YXJ0IHdpdGgKKwkgICAib2JqZWN0IDxzaGExPlxudHlwZVxudGFnZ2VyICIgKi8KKwlpZiAodmVyaWZ5X3RhZyhidWZmZXIsIHNpemUpIDwgMCkKKwkJZGllKCJpbnZhbGlkIHRhZyBzaWduYXR1cmUgZmlsZSIpOworCisJaWYgKHdyaXRlX3NoYTFfZmlsZShidWZmZXIsIHNpemUsIHRhZ190eXBlLCByZXN1bHRfc2hhMSkgPCAwKQorCQlkaWUoInVuYWJsZSB0byB3cml0ZSB0YWcgZmlsZSIpOworCisJZnJlZShidWZmZXIpOworCisJcHJpbnRmKCIlc1xuIiwgc2hhMV90b19oZXgocmVzdWx0X3NoYTEpKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21rdHJlZS5jIGIvbWt0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2ZjBkMgotLS0gL2Rldi9udWxsCisrKyBiL21rdHJlZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogR0lUIC0gdGhlIHN0dXBpZCBjb250ZW50IHRyYWNrZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIEp1bmlvIEMgSGFtYW5vLCAyMDA2CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgc3RydWN0IHRyZWVlbnQgeworCXVuc2lnbmVkIG1vZGU7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgbGVuOworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsKK30gKiplbnRyaWVzOworc3RhdGljIGludCBhbGxvYywgdXNlZDsKKworc3RhdGljIHZvaWQgYXBwZW5kX3RvX3RyZWUodW5zaWduZWQgbW9kZSwgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgdHJlZWVudCAqZW50OworCWludCBsZW4gPSBzdHJsZW4ocGF0aCk7CisJaWYgKHN0cmNocihwYXRoLCAnLycpKQorCQlkaWUoInBhdGggJXMgY29udGFpbnMgc2xhc2giLCBwYXRoKTsKKworCWlmIChhbGxvYyA8PSB1c2VkKSB7CisJCWFsbG9jID0gYWxsb2NfbnIodXNlZCk7CisJCWVudHJpZXMgPSB4cmVhbGxvYyhlbnRyaWVzLCBzaXplb2YoKmVudHJpZXMpICogYWxsb2MpOworCX0KKwllbnQgPSBlbnRyaWVzW3VzZWQrK10gPSB4bWFsbG9jKHNpemVvZigqKmVudHJpZXMpICsgbGVuICsgMSk7CisJZW50LT5tb2RlID0gbW9kZTsKKwllbnQtPmxlbiA9IGxlbjsKKwltZW1jcHkoZW50LT5zaGExLCBzaGExLCAyMCk7CisJbWVtY3B5KGVudC0+bmFtZSwgcGF0aCwgbGVuKzEpOworfQorCitzdGF0aWMgaW50IGVudF9jb21wYXJlKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykKK3sKKwlzdHJ1Y3QgdHJlZWVudCAqYSA9ICooc3RydWN0IHRyZWVlbnQgKiopYV87CisJc3RydWN0IHRyZWVlbnQgKmIgPSAqKHN0cnVjdCB0cmVlZW50ICoqKWJfOworCXJldHVybiBiYXNlX25hbWVfY29tcGFyZShhLT5uYW1lLCBhLT5sZW4sIGEtPm1vZGUsCisJCQkJIGItPm5hbWUsIGItPmxlbiwgYi0+bW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3RyZWUodW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJaW50IGk7CisKKwlxc29ydChlbnRyaWVzLCB1c2VkLCBzaXplb2YoKmVudHJpZXMpLCBlbnRfY29tcGFyZSk7CisJc2l6ZSA9IDEwMDsKKwlmb3IgKHNpemUgPSBpID0gMDsgaSA8IHVzZWQ7IGkrKykKKwkJc2l6ZSArPSAzMiArIGVudHJpZXNbaV0tPmxlbjsKKwlidWZmZXIgPSB4bWFsbG9jKHNpemUpOworCW9mZnNldCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdXNlZDsgaSsrKSB7CisJCXN0cnVjdCB0cmVlZW50ICplbnQgPSBlbnRyaWVzW2ldOworCisJCWlmIChvZmZzZXQgKyBlbnQtPmxlbiArIDEwMCA8IHNpemUpIHsKKwkJCXNpemUgPSBhbGxvY19ucihvZmZzZXQgKyBlbnQtPmxlbiArIDEwMCk7CisJCQlidWZmZXIgPSB4cmVhbGxvYyhidWZmZXIsIHNpemUpOworCQl9CisJCW9mZnNldCArPSBzcHJpbnRmKGJ1ZmZlciArIG9mZnNldCwgIiVvICIsIGVudC0+bW9kZSk7CisJCW9mZnNldCArPSBzcHJpbnRmKGJ1ZmZlciArIG9mZnNldCwgIiVzIiwgZW50LT5uYW1lKTsKKwkJYnVmZmVyW29mZnNldCsrXSA9IDA7CisJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIGVudC0+c2hhMSwgMjApOworCQlvZmZzZXQgKz0gMjA7CisJfQorCXdyaXRlX3NoYTFfZmlsZShidWZmZXIsIG9mZnNldCwgdHJlZV90eXBlLCBzaGExKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgbWt0cmVlX3VzYWdlW10gPSAiZ2l0LW1rdHJlZSBbLXpdIjsKKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJc3RydWN0IHN0cmJ1ZiBzYjsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBsaW5lX3Rlcm1pbmF0aW9uID0gJ1xuJzsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXdoaWxlICgoMSA8IGFjKSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJY2hhciAqYXJnID0gYXZbMV07CisJCWlmICghc3RyY21wKCIteiIsIGFyZykpCisJCQlsaW5lX3Rlcm1pbmF0aW9uID0gMDsKKwkJZWxzZQorCQkJdXNhZ2UobWt0cmVlX3VzYWdlKTsKKwkJYWMtLTsKKwkJYXYrKzsKKwl9CisKKwlzdHJidWZfaW5pdCgmc2IpOworCXdoaWxlICgxKSB7CisJCWludCBsZW47CisJCWNoYXIgKnB0ciwgKm50cjsKKwkJdW5zaWduZWQgbW9kZTsKKwkJY2hhciB0eXBlWzIwXTsKKwkJY2hhciAqcGF0aDsKKworCQlyZWFkX2xpbmUoJnNiLCBzdGRpbiwgbGluZV90ZXJtaW5hdGlvbik7CisJCWlmIChzYi5lb2YpCisJCQlicmVhazsKKwkJbGVuID0gc2IubGVuOworCQlwdHIgPSBzYi5idWY7CisJCS8qIElucHV0IGlzIG5vbi1yZWN1cnNpdmUgbHMtdHJlZSBvdXRwdXQgZm9ybWF0CisJCSAqIG1vZGUgU1AgdHlwZSBTUCBzaGExIFRBQiBuYW1lCisJCSAqLworCQltb2RlID0gc3RydG91bChwdHIsICZudHIsIDgpOworCQlpZiAocHRyID09IG50ciB8fCAhbnRyIHx8ICpudHIgIT0gJyAnKQorCQkJZGllKCJpbnB1dCBmb3JtYXQgZXJyb3I6ICVzIiwgc2IuYnVmKTsKKwkJcHRyID0gbnRyICsgMTsgLyogdHlwZSAqLworCQludHIgPSBzdHJjaHIocHRyLCAnICcpOworCQlpZiAoIW50ciB8fCBzYi5idWYgKyBsZW4gPD0gbnRyICsgNDEgfHwKKwkJICAgIG50cls0MV0gIT0gJ1x0JyB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KG50ciArIDEsIHNoYTEpKQorCQkJZGllKCJpbnB1dCBmb3JtYXQgZXJyb3I6ICVzIiwgc2IuYnVmKTsKKwkJaWYgKHNoYTFfb2JqZWN0X2luZm8oc2hhMSwgdHlwZSwgTlVMTCkpCisJCQlkaWUoIm9iamVjdCAlcyB1bmF2YWlsYWJsZSIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJKm50cisrID0gMDsgLyogbm93IGF0IHRoZSBiZWdpbm5pbmcgb2YgU0hBMSAqLworCQlpZiAoc3RyY21wKHB0ciwgdHlwZSkpCisJCQlkaWUoIm9iamVjdCB0eXBlICVzIG1pc21hdGNoICglcykiLCBwdHIsIHR5cGUpOworCQludHIgKz0gNDE7IC8qIGF0IHRoZSBiZWdpbm5pbmcgb2YgbmFtZSAqLworCQlpZiAobGluZV90ZXJtaW5hdGlvbiAmJiBudHJbMF0gPT0gJyInKQorCQkJcGF0aCA9IHVucXVvdGVfY19zdHlsZShudHIsIE5VTEwpOworCQllbHNlCisJCQlwYXRoID0gbnRyOworCisJCWFwcGVuZF90b190cmVlKG1vZGUsIHNoYTEsIHBhdGgpOworCisJCWlmIChwYXRoICE9IG50cikKKwkJCWZyZWUocGF0aCk7CisJfQorCXdyaXRlX3RyZWUoc2hhMSk7CisJcHV0cyhzaGExX3RvX2hleChzaGExKSk7CisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL21vemlsbGEtc2hhMS9zaGExLmMgYi9tb3ppbGxhLXNoYTEvc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzUzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tb3ppbGxhLXNoYTEvc2hhMS5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiAKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqIAorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgKiBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIFNIQSAxODAtMSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKENvbXBhY3QgdmVyc2lvbikKKyAqIAorICogVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzIFBhdWwgS29jaGVyIG9mCisgKiBDcnlwdG9ncmFwaHkgUmVzZWFyY2guICBQb3J0aW9ucyBjcmVhdGVkIGJ5IFBhdWwgS29jaGVyIGFyZSAKKyAqIENvcHlyaWdodCAoQykgMTk5NS05IGJ5IENyeXB0b2dyYXBoeSBSZXNlYXJjaCwgSW5jLiAgQWxsCisgKiBSaWdodHMgUmVzZXJ2ZWQuCisgKiAKKyAqIENvbnRyaWJ1dG9yKHMpOgorICoKKyAqICAgICBQYXVsIEtvY2hlcgorICogCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiBvciBsYXRlciAodGhlCisgKiAiR1BMIiksIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSAKKyAqIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciAKKyAqIHZlcnNpb24gb2YgdGhpcyBmaWxlIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0bworICogYWxsb3cgb3RoZXJzIHRvIHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsCisgKiBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZAorICogcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZSBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieQorICogdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudAorICogbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZQorICogR1BMLgorICovCisKKyNpbmNsdWRlICJzaGExLmgiCisKK3N0YXRpYyB2b2lkIHNoYUhhc2hCbG9jayhTSEFfQ1RYICpjdHgpOworCit2b2lkIFNIQTFfSW5pdChTSEFfQ1RYICpjdHgpIHsKKyAgaW50IGk7CisKKyAgY3R4LT5sZW5XID0gMDsKKyAgY3R4LT5zaXplSGkgPSBjdHgtPnNpemVMbyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBIIHdpdGggdGhlIG1hZ2ljIGNvbnN0YW50cyAoc2VlIEZJUFMxODAgZm9yIGNvbnN0YW50cykKKyAgICovCisgIGN0eC0+SFswXSA9IDB4Njc0NTIzMDE7CisgIGN0eC0+SFsxXSA9IDB4ZWZjZGFiODk7CisgIGN0eC0+SFsyXSA9IDB4OThiYWRjZmU7CisgIGN0eC0+SFszXSA9IDB4MTAzMjU0NzY7CisgIGN0eC0+SFs0XSA9IDB4YzNkMmUxZjA7CisKKyAgZm9yIChpID0gMDsgaSA8IDgwOyBpKyspCisgICAgY3R4LT5XW2ldID0gMDsKK30KKworCit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmN0eCwgY29uc3Qgdm9pZCAqX2RhdGFJbiwgaW50IGxlbikgeworICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhSW4gPSBfZGF0YUluOworICBpbnQgaTsKKworICAvKiBSZWFkIHRoZSBkYXRhIGludG8gVyBhbmQgcHJvY2VzcyBibG9ja3MgYXMgdGhleSBnZXQgZnVsbAorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgY3R4LT5XW2N0eC0+bGVuVyAvIDRdIDw8PSA4OworICAgIGN0eC0+V1tjdHgtPmxlblcgLyA0XSB8PSAodW5zaWduZWQgaW50KWRhdGFJbltpXTsKKyAgICBpZiAoKCsrY3R4LT5sZW5XKSAlIDY0ID09IDApIHsKKyAgICAgIHNoYUhhc2hCbG9jayhjdHgpOworICAgICAgY3R4LT5sZW5XID0gMDsKKyAgICB9CisgICAgY3R4LT5zaXplTG8gKz0gODsKKyAgICBjdHgtPnNpemVIaSArPSAoY3R4LT5zaXplTG8gPCA4KTsKKyAgfQorfQorCisKK3ZvaWQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyIGhhc2hvdXRbMjBdLCBTSEFfQ1RYICpjdHgpIHsKKyAgdW5zaWduZWQgY2hhciBwYWQweDgwID0gMHg4MDsKKyAgdW5zaWduZWQgY2hhciBwYWQweDAwID0gMHgwMDsKKyAgdW5zaWduZWQgY2hhciBwYWRsZW5bOF07CisgIGludCBpOworCisgIC8qIFBhZCB3aXRoIGEgYmluYXJ5IDEgKGUuZy4gMHg4MCksIHRoZW4gemVyb2VzLCB0aGVuIGxlbmd0aAorICAgKi8KKyAgcGFkbGVuWzBdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVIaSA+PiAyNCkgJiAyNTUpOworICBwYWRsZW5bMV0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUhpID4+IDE2KSAmIDI1NSk7CisgIHBhZGxlblsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplSGkgPj4gOCkgJiAyNTUpOworICBwYWRsZW5bM10gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUhpID4+IDApICYgMjU1KTsKKyAgcGFkbGVuWzRdID0gKHVuc2lnbmVkIGNoYXIpKChjdHgtPnNpemVMbyA+PiAyNCkgJiAyNTUpOworICBwYWRsZW5bNV0gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUxvID4+IDE2KSAmIDI1NSk7CisgIHBhZGxlbls2XSA9ICh1bnNpZ25lZCBjaGFyKSgoY3R4LT5zaXplTG8gPj4gOCkgJiAyNTUpOworICBwYWRsZW5bN10gPSAodW5zaWduZWQgY2hhcikoKGN0eC0+c2l6ZUxvID4+IDApICYgMjU1KTsKKyAgU0hBMV9VcGRhdGUoY3R4LCAmcGFkMHg4MCwgMSk7CisgIHdoaWxlIChjdHgtPmxlblcgIT0gNTYpCisgICAgU0hBMV9VcGRhdGUoY3R4LCAmcGFkMHgwMCwgMSk7CisgIFNIQTFfVXBkYXRlKGN0eCwgcGFkbGVuLCA4KTsKKworICAvKiBPdXRwdXQgaGFzaAorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICBoYXNob3V0W2ldID0gKHVuc2lnbmVkIGNoYXIpKGN0eC0+SFtpIC8gNF0gPj4gMjQpOworICAgIGN0eC0+SFtpIC8gNF0gPDw9IDg7CisgIH0KKworICAvKgorICAgKiAgUmUtaW5pdGlhbGl6ZSB0aGUgY29udGV4dCAoYWxzbyB6ZXJvaXplcyBjb250ZW50cykKKyAgICovCisgIFNIQTFfSW5pdChjdHgpOworfQorCisKKyNkZWZpbmUgU0hBX1JPVChYLG4pICgoKFgpIDw8IChuKSkgfCAoKFgpID4+ICgzMi0obikpKSkKKworc3RhdGljIHZvaWQgc2hhSGFzaEJsb2NrKFNIQV9DVFggKmN0eCkgeworICBpbnQgdDsKKyAgdW5zaWduZWQgaW50IEEsQixDLEQsRSxURU1QOworCisgIGZvciAodCA9IDE2OyB0IDw9IDc5OyB0KyspCisgICAgY3R4LT5XW3RdID0KKyAgICAgIFNIQV9ST1QoY3R4LT5XW3QtM10gXiBjdHgtPldbdC04XSBeIGN0eC0+V1t0LTE0XSBeIGN0eC0+V1t0LTE2XSwgMSk7CisKKyAgQSA9IGN0eC0+SFswXTsKKyAgQiA9IGN0eC0+SFsxXTsKKyAgQyA9IGN0eC0+SFsyXTsKKyAgRCA9IGN0eC0+SFszXTsKKyAgRSA9IGN0eC0+SFs0XTsKKworICBmb3IgKHQgPSAwOyB0IDw9IDE5OyB0KyspIHsKKyAgICBURU1QID0gU0hBX1JPVChBLDUpICsgKCgoQ15EKSZCKV5EKSAgICAgKyBFICsgY3R4LT5XW3RdICsgMHg1YTgyNzk5OTsKKyAgICBFID0gRDsgRCA9IEM7IEMgPSBTSEFfUk9UKEIsIDMwKTsgQiA9IEE7IEEgPSBURU1QOworICB9CisgIGZvciAodCA9IDIwOyB0IDw9IDM5OyB0KyspIHsKKyAgICBURU1QID0gU0hBX1JPVChBLDUpICsgKEJeQ15EKSAgICAgICAgICAgKyBFICsgY3R4LT5XW3RdICsgMHg2ZWQ5ZWJhMTsKKyAgICBFID0gRDsgRCA9IEM7IEMgPSBTSEFfUk9UKEIsIDMwKTsgQiA9IEE7IEEgPSBURU1QOworICB9CisgIGZvciAodCA9IDQwOyB0IDw9IDU5OyB0KyspIHsKKyAgICBURU1QID0gU0hBX1JPVChBLDUpICsgKChCJkMpfChEJihCfEMpKSkgKyBFICsgY3R4LT5XW3RdICsgMHg4ZjFiYmNkYzsKKyAgICBFID0gRDsgRCA9IEM7IEMgPSBTSEFfUk9UKEIsIDMwKTsgQiA9IEE7IEEgPSBURU1QOworICB9CisgIGZvciAodCA9IDYwOyB0IDw9IDc5OyB0KyspIHsKKyAgICBURU1QID0gU0hBX1JPVChBLDUpICsgKEJeQ15EKSAgICAgICAgICAgKyBFICsgY3R4LT5XW3RdICsgMHhjYTYyYzFkNjsKKyAgICBFID0gRDsgRCA9IEM7IEMgPSBTSEFfUk9UKEIsIDMwKTsgQiA9IEE7IEEgPSBURU1QOworICB9CisKKyAgY3R4LT5IWzBdICs9IEE7CisgIGN0eC0+SFsxXSArPSBCOworICBjdHgtPkhbMl0gKz0gQzsKKyAgY3R4LT5IWzNdICs9IEQ7CisgIGN0eC0+SFs0XSArPSBFOworfQorCmRpZmYgLS1naXQgYS9tb3ppbGxhLXNoYTEvc2hhMS5oIGIvbW96aWxsYS1zaGExL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDgyYWZhCi0tLSAvZGV2L251bGwKKysrIGIvbW96aWxsYS1zaGExL3NoYTEuaApAQCAtMCwwICsxLDQ1IEBACisvKiAKKyAqIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgKiBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqIAorICogU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTCisgKiBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKKyAqIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAKKyAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIFNIQSAxODAtMSBIZWFkZXIgRmlsZQorICogCisgKiBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgUGF1bCBLb2NoZXIgb2YKKyAqIENyeXB0b2dyYXBoeSBSZXNlYXJjaC4gIFBvcnRpb25zIGNyZWF0ZWQgYnkgUGF1bCBLb2NoZXIgYXJlIAorICogQ29weXJpZ2h0IChDKSAxOTk1LTkgYnkgQ3J5cHRvZ3JhcGh5IFJlc2VhcmNoLCBJbmMuICBBbGwKKyAqIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIAorICogQ29udHJpYnV0b3Iocyk6CisgKgorICogICAgIFBhdWwgS29jaGVyCisgKiAKKyAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyIG9yIGxhdGVyICh0aGUKKyAqICJHUEwiKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIAorICogaW5zdGVhZCBvZiB0aG9zZSBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHVzZSBvZiB5b3VyIAorICogdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvCisgKiBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwKKyAqIGluZGljYXRlIHlvdXIgZGVjaXNpb24gYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kCisgKiByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5CisgKiB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50CisgKiBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlCisgKiBHUEwuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgSFs1XTsKKyAgdW5zaWduZWQgaW50IFdbODBdOworICBpbnQgbGVuVzsKKyAgdW5zaWduZWQgaW50IHNpemVIaSxzaXplTG87Cit9IFNIQV9DVFg7CisKK3ZvaWQgU0hBMV9Jbml0KFNIQV9DVFggKmN0eCk7Cit2b2lkIFNIQTFfVXBkYXRlKFNIQV9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YUluLCBpbnQgbGVuKTsKK3ZvaWQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyIGhhc2hvdXRbMjBdLCBTSEFfQ1RYICpjdHgpOwpkaWZmIC0tZ2l0IGEvbmFtZS1yZXYuYyBiL25hbWUtcmV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyZjE0ZQotLS0gL2Rldi9udWxsCisrKyBiL25hbWUtcmV2LmMKQEAgLTAsMCArMSwyNTYgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgbmFtZV9yZXZfdXNhZ2VbXSA9CisJImdpdC1uYW1lLXJldiBbLS10YWdzXSAoIC0tYWxsIHwgLS1zdGRpbiB8IGNvbW1pdHRpc2ggW2NvbW1pdHRpc2guLi5dIClcbiI7CisKK3R5cGVkZWYgc3RydWN0IHJldl9uYW1lIHsKKwljb25zdCBjaGFyICp0aXBfbmFtZTsKKwlpbnQgbWVyZ2VfdHJhdmVyc2FsczsKKwlpbnQgZ2VuZXJhdGlvbjsKK30gcmV2X25hbWU7CisKK3N0YXRpYyBsb25nIGN1dG9mZiA9IExPTkdfTUFYOworCitzdGF0aWMgdm9pZCBuYW1lX3JldihzdHJ1Y3QgY29tbWl0ICpjb21taXQsCisJCWNvbnN0IGNoYXIgKnRpcF9uYW1lLCBpbnQgbWVyZ2VfdHJhdmVyc2FscywgaW50IGdlbmVyYXRpb24sCisJCWludCBkZXJlZikKK3sKKwlzdHJ1Y3QgcmV2X25hbWUgKm5hbWUgPSAoc3RydWN0IHJldl9uYW1lICopY29tbWl0LT51dGlsOworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50czsKKwlpbnQgcGFyZW50X251bWJlciA9IDE7CisKKwlpZiAoIWNvbW1pdC0+b2JqZWN0LnBhcnNlZCkKKwkJcGFyc2VfY29tbWl0KGNvbW1pdCk7CisKKwlpZiAoY29tbWl0LT5kYXRlIDwgY3V0b2ZmKQorCQlyZXR1cm47CisKKwlpZiAoZGVyZWYpIHsKKwkJY2hhciAqbmV3X25hbWUgPSB4bWFsbG9jKHN0cmxlbih0aXBfbmFtZSkrMyk7CisJCXN0cmNweShuZXdfbmFtZSwgdGlwX25hbWUpOworCQlzdHJjYXQobmV3X25hbWUsICJeMCIpOworCQl0aXBfbmFtZSA9IG5ld19uYW1lOworCisJCWlmIChnZW5lcmF0aW9uKQorCQkJZGllKCJnZW5lcmF0aW9uOiAlZCwgYnV0IGRlcmVmPyIsIGdlbmVyYXRpb24pOworCX0KKworCWlmIChuYW1lID09IE5VTEwpIHsKKwkJbmFtZSA9IHhtYWxsb2Moc2l6ZW9mKHJldl9uYW1lKSk7CisJCWNvbW1pdC0+dXRpbCA9IG5hbWU7CisJCWdvdG8gY29weV9kYXRhOworCX0gZWxzZSBpZiAobmFtZS0+bWVyZ2VfdHJhdmVyc2FscyA+IG1lcmdlX3RyYXZlcnNhbHMgfHwKKwkJCShuYW1lLT5tZXJnZV90cmF2ZXJzYWxzID09IG1lcmdlX3RyYXZlcnNhbHMgJiYKKwkJCSBuYW1lLT5nZW5lcmF0aW9uID4gZ2VuZXJhdGlvbikpIHsKK2NvcHlfZGF0YToKKwkJbmFtZS0+dGlwX25hbWUgPSB0aXBfbmFtZTsKKwkJbmFtZS0+bWVyZ2VfdHJhdmVyc2FscyA9IG1lcmdlX3RyYXZlcnNhbHM7CisJCW5hbWUtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworCX0gZWxzZQorCQlyZXR1cm47CisKKwlmb3IgKHBhcmVudHMgPSBjb21taXQtPnBhcmVudHM7CisJCQlwYXJlbnRzOworCQkJcGFyZW50cyA9IHBhcmVudHMtPm5leHQsIHBhcmVudF9udW1iZXIrKykgeworCQlpZiAocGFyZW50X251bWJlciA+IDEpIHsKKwkJCWNoYXIgKm5ld19uYW1lID0geG1hbGxvYyhzdHJsZW4odGlwX25hbWUpKzgpOworCisJCQlpZiAoZ2VuZXJhdGlvbiA+IDApCisJCQkJc3ByaW50ZihuZXdfbmFtZSwgIiVzfiVkXiVkIiwgdGlwX25hbWUsCisJCQkJCQlnZW5lcmF0aW9uLCBwYXJlbnRfbnVtYmVyKTsKKwkJCWVsc2UKKwkJCQlzcHJpbnRmKG5ld19uYW1lLCAiJXNeJWQiLCB0aXBfbmFtZSwgcGFyZW50X251bWJlcik7CisKKwkJCW5hbWVfcmV2KHBhcmVudHMtPml0ZW0sIG5ld19uYW1lLAorCQkJCW1lcmdlX3RyYXZlcnNhbHMgKyAxICwgMCwgMCk7CisJCX0gZWxzZSB7CisJCQluYW1lX3JldihwYXJlbnRzLT5pdGVtLCB0aXBfbmFtZSwgbWVyZ2VfdHJhdmVyc2FscywKKwkJCQlnZW5lcmF0aW9uICsgMSwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdGFnc19vbmx5ID0gMDsKKworc3RhdGljIGludCBuYW1lX3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJaW50IGRlcmVmID0gMDsKKworCWlmICh0YWdzX29ubHkgJiYgc3RybmNtcChwYXRoLCAicmVmcy90YWdzLyIsIDEwKSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobyAmJiBvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJc3RydWN0IHRhZyAqdCA9IChzdHJ1Y3QgdGFnICopIG87CisJCWlmICghdC0+dGFnZ2VkKQorCQkJYnJlYWs7IC8qIGJyb2tlbiByZXBvc2l0b3J5ICovCisJCW8gPSBwYXJzZV9vYmplY3QodC0+dGFnZ2VkLT5zaGExKTsKKwkJZGVyZWYgPSAxOworCX0KKwlpZiAobyAmJiBvLT50eXBlID09IE9CSl9DT01NSVQpIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gKHN0cnVjdCBjb21taXQgKilvOworCisJCWlmICghc3RybmNtcChwYXRoLCAicmVmcy9oZWFkcy8iLCAxMSkpCisJCQlwYXRoID0gcGF0aCArIDExOworCQllbHNlIGlmICghc3RybmNtcChwYXRoLCAicmVmcy8iLCA1KSkKKwkJCXBhdGggPSBwYXRoICsgNTsKKworCQluYW1lX3Jldihjb21taXQsIHN0cmR1cChwYXRoKSwgMCwgMCwgZGVyZWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogcmV0dXJucyBhIHN0YXRpYyBidWZmZXIgKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBnZXRfcmV2X25hbWUoc3RydWN0IG9iamVjdCAqbykKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTAyNF07CisJc3RydWN0IHJldl9uYW1lICpuOworCXN0cnVjdCBjb21taXQgKmM7CisKKwlpZiAoby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJYyA9IChzdHJ1Y3QgY29tbWl0ICopIG87CisJbiA9IGMtPnV0aWw7CisJaWYgKCFuKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisKKwlpZiAoIW4tPmdlbmVyYXRpb24pCisJCXJldHVybiBuLT50aXBfbmFtZTsKKworCXNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlc34lZCIsIG4tPnRpcF9uYW1lLCBuLT5nZW5lcmF0aW9uKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2FycmF5IHJldnMgPSB7IDAsIDAsIE5VTEwgfTsKKwlpbnQgYXNfaXMgPSAwLCBhbGwgPSAwLCB0cmFuc2Zvcm1fc3RkaW4gPSAwOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWlmIChhcmdjIDwgMikKKwkJdXNhZ2UobmFtZV9yZXZfdXNhZ2UpOworCisJZm9yICgtLWFyZ2MsICsrYXJndjsgYXJnYzsgLS1hcmdjLCArK2FyZ3YpIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJc3RydWN0IG9iamVjdCAqbzsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCisJCWlmICghYXNfaXMgJiYgKCphcmd2KVswXSA9PSAnLScpIHsKKwkJCWlmICghc3RyY21wKCphcmd2LCAiLS0iKSkgeworCQkJCWFzX2lzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi0tdGFncyIpKSB7CisJCQkJdGFnc19vbmx5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi0tYWxsIikpIHsKKwkJCQlpZiAoYXJnYyA+IDEpCisJCQkJCWRpZSgiU3BlY2lmeSBlaXRoZXIgYSBsaXN0LCBvciAtLWFsbCwgbm90IGJvdGghIik7CisJCQkJYWxsID0gMTsKKwkJCQljdXRvZmYgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCAiLS1zdGRpbiIpKSB7CisJCQkJaWYgKGFyZ2MgPiAxKQorCQkJCQlkaWUoIlNwZWNpZnkgZWl0aGVyIGEgbGlzdCwgb3IgLS1zdGRpbiwgbm90IGJvdGghIik7CisJCQkJdHJhbnNmb3JtX3N0ZGluID0gMTsKKwkJCQljdXRvZmYgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2UobmFtZV9yZXZfdXNhZ2UpOworCQl9CisKKwkJaWYgKGdldF9zaGExKCphcmd2LCBzaGExKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IHNoYTEgZm9yICVzLiBTa2lwcGluZy5cbiIsCisJCQkJCSphcmd2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qoc2hhMSksICphcmd2LCAwKTsKKwkJaWYgKCFvIHx8IG8tPnR5cGUgIT0gT0JKX0NPTU1JVCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IGNvbW1pdCBmb3IgJXMuIFNraXBwaW5nLlxuIiwKKwkJCQkJKmFyZ3YpOworCQkJY29udGludWU7CisJCX0KKworCQljb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW87CisKKwkJaWYgKGN1dG9mZiA+IGNvbW1pdC0+ZGF0ZSkKKwkJCWN1dG9mZiA9IGNvbW1pdC0+ZGF0ZTsKKworCQlhZGRfb2JqZWN0X2FycmF5KChzdHJ1Y3Qgb2JqZWN0ICopY29tbWl0LCAqYXJndiwgJnJldnMpOworCX0KKworCWZvcl9lYWNoX3JlZihuYW1lX3JlZik7CisKKwlpZiAodHJhbnNmb3JtX3N0ZGluKSB7CisJCWNoYXIgYnVmZmVyWzIwNDhdOworCQljaGFyICpwLCAqcF9zdGFydDsKKworCQl3aGlsZSAoIWZlb2Yoc3RkaW4pKSB7CisJCQlpbnQgZm9ydHkgPSAwOworCQkJcCA9IGZnZXRzKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIHN0ZGluKTsKKwkJCWlmICghcCkKKwkJCQlicmVhazsKKworCQkJZm9yIChwX3N0YXJ0ID0gcDsgKnA7IHArKykgeworI2RlZmluZSBpc2hleCh4KSAoaXNkaWdpdCgoeCkpIHx8ICgoeCkgPj0gJ2EnICYmICh4KSA8PSAnZicpKQorCQkJCWlmICghaXNoZXgoKnApKQorCQkJCQlmb3J0eSA9IDA7CisJCQkJZWxzZSBpZiAoKytmb3J0eSA9PSA0MCAmJgorCQkJCQkJIWlzaGV4KCoocCsxKSkpIHsKKwkJCQkJdW5zaWduZWQgY2hhciBzaGExWzQwXTsKKwkJCQkJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmRlZmluZWQiOworCQkJCQljaGFyIGMgPSAqKHArMSk7CisKKwkJCQkJZm9ydHkgPSAwOworCisJCQkJCSoocCsxKSA9IDA7CisJCQkJCWlmICghZ2V0X3NoYTEocCAtIDM5LCBzaGExKSkgeworCQkJCQkJc3RydWN0IG9iamVjdCAqbyA9CisJCQkJCQkJbG9va3VwX29iamVjdChzaGExKTsKKwkJCQkJCWlmIChvKQorCQkJCQkJCW5hbWUgPSBnZXRfcmV2X25hbWUobyk7CisJCQkJCX0KKwkJCQkJKihwKzEpID0gYzsKKworCQkJCQlpZiAoIXN0cmNtcChuYW1lLCAidW5kZWZpbmVkIikpCisJCQkJCQljb250aW51ZTsKKworCQkJCQlmd3JpdGUocF9zdGFydCwgcCAtIHBfc3RhcnQgKyAxLCAxLAorCQkJCQkgICAgICAgc3Rkb3V0KTsKKwkJCQkJcHJpbnRmKCIgKCVzKSIsIG5hbWUpOworCQkJCQlwX3N0YXJ0ID0gcCArIDE7CisJCQkJfQorCQkJfQorCisJCQkvKiBmbHVzaCAqLworCQkJaWYgKHBfc3RhcnQgIT0gcCkKKwkJCQlmd3JpdGUocF9zdGFydCwgcCAtIHBfc3RhcnQsIDEsIHN0ZG91dCk7CisJCX0KKwl9IGVsc2UgaWYgKGFsbCkgeworCQlpbnQgaSwgbWF4OworCisJCW1heCA9IGdldF9tYXhfb2JqZWN0X2luZGV4KCk7CisJCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQkJc3RydWN0IG9iamVjdCAqIG9iaiA9IGdldF9pbmRleGVkX29iamVjdChpKTsKKwkJCWlmICghb2JqKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCIlcyAlc1xuIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSwgZ2V0X3Jldl9uYW1lKG9iaikpOworCQl9CisJfSBlbHNlIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCByZXZzLm5yOyBpKyspCisJCQlwcmludGYoIiVzICVzXG4iLAorCQkJCXJldnMub2JqZWN0c1tpXS5uYW1lLAorCQkJCWdldF9yZXZfbmFtZShyZXZzLm9iamVjdHNbaV0uaXRlbSkpOworCX0KKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vYmplY3QtcmVmcy5jIGIvb2JqZWN0LXJlZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWI4MDY1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqZWN0LXJlZnMuYwpAQCAtMCwwICsxLDE0MyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisKK2ludCB0cmFja19vYmplY3RfcmVmcyA9IDA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVmc19oYXNoX3NpemUsIG5yX29iamVjdF9yZWZzOworc3RhdGljIHN0cnVjdCBvYmplY3RfcmVmcyAqKnJlZnNfaGFzaDsKKworc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX29iaihzdHJ1Y3Qgb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBoYXNoID0gKih1bnNpZ25lZCBpbnQgKilvYmotPnNoYTE7CisJcmV0dXJuIGhhc2ggJSBuOworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfcmVmX2hhc2goc3RydWN0IG9iamVjdF9yZWZzICpyZWYsIHN0cnVjdCBvYmplY3RfcmVmcyAqKmhhc2gsIHVuc2lnbmVkIGludCBzaXplKQoreworCWludCBqID0gaGFzaF9vYmoocmVmLT5iYXNlLCBzaXplKTsKKworCXdoaWxlIChoYXNoW2pdKSB7CisJCWorKzsKKwkJaWYgKGogPj0gc2l6ZSkKKwkJCWogPSAwOworCX0KKwloYXNoW2pdID0gcmVmOworfQorCitzdGF0aWMgdm9pZCBncm93X3JlZnNfaGFzaCh2b2lkKQoreworCWludCBpOworCWludCBuZXdfaGFzaF9zaXplID0gKHJlZnNfaGFzaF9zaXplICsgMTAwMCkgKiAzIC8gMjsKKwlzdHJ1Y3Qgb2JqZWN0X3JlZnMgKipuZXdfaGFzaDsKKworCW5ld19oYXNoID0gY2FsbG9jKG5ld19oYXNoX3NpemUsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X3JlZnMgKikpOworCWZvciAoaSA9IDA7IGkgPCByZWZzX2hhc2hfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmID0gcmVmc19oYXNoW2ldOworCQlpZiAoIXJlZikKKwkJCWNvbnRpbnVlOworCQlpbnNlcnRfcmVmX2hhc2gocmVmLCBuZXdfaGFzaCwgbmV3X2hhc2hfc2l6ZSk7CisJfQorCWZyZWUocmVmc19oYXNoKTsKKwlyZWZzX2hhc2ggPSBuZXdfaGFzaDsKKwlyZWZzX2hhc2hfc2l6ZSA9IG5ld19oYXNoX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9vYmplY3RfcmVmcyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmKQoreworCWludCBuciA9IG5yX29iamVjdF9yZWZzICsgMTsKKworCWlmIChuciA+IHJlZnNfaGFzaF9zaXplICogMiAvIDMpCisJCWdyb3dfcmVmc19oYXNoKCk7CisJcmVmLT5iYXNlID0gb2JqOworCWluc2VydF9yZWZfaGFzaChyZWYsIHJlZnNfaGFzaCwgcmVmc19oYXNoX3NpemUpOworCW5yX29iamVjdF9yZWZzID0gbnI7Cit9CisKK3N0cnVjdCBvYmplY3RfcmVmcyAqbG9va3VwX29iamVjdF9yZWZzKHN0cnVjdCBvYmplY3QgKm9iaikKK3sKKwlpbnQgaiA9IGhhc2hfb2JqKG9iaiwgcmVmc19oYXNoX3NpemUpOworCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmOworCisJd2hpbGUgKChyZWYgPSByZWZzX2hhc2hbal0pICE9IE5VTEwpIHsKKwkJaWYgKHJlZi0+YmFzZSA9PSBvYmopCisJCQlicmVhazsKKwkJaisrOworCQlpZiAoaiA+PSByZWZzX2hhc2hfc2l6ZSkKKwkJCWogPSAwOworCX0KKwlyZXR1cm4gcmVmOworfQorCitzdHJ1Y3Qgb2JqZWN0X3JlZnMgKmFsbG9jX29iamVjdF9yZWZzKHVuc2lnbmVkIGNvdW50KQoreworCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmczsKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZigqcmVmcykgKyBjb3VudCpzaXplb2Yoc3RydWN0IG9iamVjdCAqKTsKKworCXJlZnMgPSB4Y2FsbG9jKDEsIHNpemUpOworCXJlZnMtPmNvdW50ID0gY291bnQ7CisJcmV0dXJuIHJlZnM7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9vYmplY3RfcG9pbnRlcnMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3Qgb2JqZWN0ICogY29uc3QgKnBhID0gYTsKKwljb25zdCBzdHJ1Y3Qgb2JqZWN0ICogY29uc3QgKnBiID0gYjsKKwlpZiAoKnBhID09ICpwYikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKnBhIDwgKnBiKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKwordm9pZCBzZXRfb2JqZWN0X3JlZnMoc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgb2JqZWN0X3JlZnMgKnJlZnMpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwkvKiBEbyBub3QgaW5zdGFsbCBlbXB0eSBsaXN0IG9mIHJlZmVyZW5jZXMgKi8KKwlpZiAocmVmcy0+Y291bnQgPCAxKSB7CisJCWZyZWUocmVmcyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTb3J0IHRoZSBsaXN0IGFuZCBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgKi8KKwlxc29ydChyZWZzLT5yZWYsIHJlZnMtPmNvdW50LCBzaXplb2YocmVmcy0+cmVmWzBdKSwKKwkgICAgICBjb21wYXJlX29iamVjdF9wb2ludGVycyk7CisJZm9yIChpID0gaiA9IDE7IGkgPCByZWZzLT5jb3VudDsgaSsrKSB7CisJCWlmIChyZWZzLT5yZWZbaV0gIT0gcmVmcy0+cmVmW2kgLSAxXSkKKwkJCXJlZnMtPnJlZltqKytdID0gcmVmcy0+cmVmW2ldOworCX0KKwlpZiAoaiA8IHJlZnMtPmNvdW50KSB7CisJCS8qIER1cGxpY2F0ZXMgd2VyZSBmb3VuZCAtIHJlYWxsb2NhdGUgbGlzdCAqLworCQlzaXplX3Qgc2l6ZSA9IHNpemVvZigqcmVmcykgKyBqKnNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopOworCQlyZWZzLT5jb3VudCA9IGo7CisJCXJlZnMgPSB4cmVhbGxvYyhyZWZzLCBzaXplKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVmcy0+Y291bnQ7IGkrKykKKwkJcmVmcy0+cmVmW2ldLT51c2VkID0gMTsKKwlhZGRfb2JqZWN0X3JlZnMob2JqLCByZWZzKTsKK30KKwordm9pZCBtYXJrX3JlYWNoYWJsZShzdHJ1Y3Qgb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBtYXNrKQoreworCWNvbnN0IHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmczsKKworCWlmICghdHJhY2tfb2JqZWN0X3JlZnMpCisJCWRpZSgiY2Fubm90IGRvIHJlYWNoYWJpbGl0eSB3aXRoIG9iamVjdCByZWZzIHR1cm5lZCBvZmYiKTsKKwkvKiBub3RoaW5nIHRvIGxvb2t1cCAqLworCWlmICghcmVmc19oYXNoX3NpemUpCisJCXJldHVybjsKKwkvKiBJZiB3ZSd2ZSBiZWVuIGhlcmUgYWxyZWFkeSwgZG9uJ3QgYm90aGVyICovCisJaWYgKG9iai0+ZmxhZ3MgJiBtYXNrKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBtYXNrOworCXJlZnMgPSBsb29rdXBfb2JqZWN0X3JlZnMob2JqKTsKKwlpZiAocmVmcykgeworCQl1bnNpZ25lZCBpOworCQlmb3IgKGkgPSAwOyBpIDwgcmVmcy0+Y291bnQ7IGkrKykKKwkJCW1hcmtfcmVhY2hhYmxlKHJlZnMtPnJlZltpXSwgbWFzayk7CisJfQorfQorCisKZGlmZiAtLWdpdCBhL29iamVjdC5jIGIvb2JqZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkOGVkNAotLS0gL2Rldi9udWxsCisrKyBiL29iamVjdC5jCkBAIC0wLDAgKzEsMjM4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJibG9iLmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorCitzdGF0aWMgc3RydWN0IG9iamVjdCAqKm9ial9oYXNoOworc3RhdGljIGludCBucl9vYmpzLCBvYmpfaGFzaF9zaXplOworCit1bnNpZ25lZCBpbnQgZ2V0X21heF9vYmplY3RfaW5kZXgodm9pZCkKK3sKKwlyZXR1cm4gb2JqX2hhc2hfc2l6ZTsKK30KKworc3RydWN0IG9iamVjdCAqZ2V0X2luZGV4ZWRfb2JqZWN0KHVuc2lnbmVkIGludCBpZHgpCit7CisJcmV0dXJuIG9ial9oYXNoW2lkeF07Cit9CisKK2NvbnN0IGNoYXIgKnR5cGVfbmFtZXNbXSA9IHsKKwkibm9uZSIsICJjb21taXQiLCAidHJlZSIsICJibG9iIiwgInRhZyIsCisJImJhZCB0eXBlIDUiLCAiYmFkIHR5cGUgNiIsICJkZWx0YSIsICJiYWQiLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX29iaihzdHJ1Y3Qgb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBoYXNoID0gKih1bnNpZ25lZCBpbnQgKilvYmotPnNoYTE7CisJcmV0dXJuIGhhc2ggJSBuOworfQorCitzdGF0aWMgdm9pZCBpbnNlcnRfb2JqX2hhc2goc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3Qgb2JqZWN0ICoqaGFzaCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaW50IGogPSBoYXNoX29iaihvYmosIHNpemUpOworCisJd2hpbGUgKGhhc2hbal0pIHsKKwkJaisrOworCQlpZiAoaiA+PSBzaXplKQorCQkJaiA9IDA7CisJfQorCWhhc2hbal0gPSBvYmo7Cit9CisKK3N0YXRpYyBpbnQgaGFzaHRhYmxlX2luZGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgaW50IGk7CisJbWVtY3B5KCZpLCBzaGExLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisJcmV0dXJuIChpbnQpKGkgJSBvYmpfaGFzaF9zaXplKTsKK30KKworc3RydWN0IG9iamVjdCAqbG9va3VwX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCXN0cnVjdCBvYmplY3QgKm9iajsKKworCWlmICghb2JqX2hhc2gpCisJCXJldHVybiBOVUxMOworCisJaSA9IGhhc2h0YWJsZV9pbmRleChzaGExKTsKKwl3aGlsZSAoKG9iaiA9IG9ial9oYXNoW2ldKSAhPSBOVUxMKSB7CisJCWlmICghbWVtY21wKHNoYTEsIG9iai0+c2hhMSwgMjApKQorCQkJYnJlYWs7CisJCWkrKzsKKwkJaWYgKGkgPT0gb2JqX2hhc2hfc2l6ZSkKKwkJCWkgPSAwOworCX0KKwlyZXR1cm4gb2JqOworfQorCitzdGF0aWMgdm9pZCBncm93X29iamVjdF9oYXNoKHZvaWQpCit7CisJaW50IGk7CisJaW50IG5ld19oYXNoX3NpemUgPSBvYmpfaGFzaF9zaXplIDwgMzIgPyAzMiA6IDIgKiBvYmpfaGFzaF9zaXplOworCXN0cnVjdCBvYmplY3QgKipuZXdfaGFzaDsKKworCW5ld19oYXNoID0gY2FsbG9jKG5ld19oYXNoX3NpemUsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0ICopKTsKKwlmb3IgKGkgPSAwOyBpIDwgb2JqX2hhc2hfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9IG9ial9oYXNoW2ldOworCQlpZiAoIW9iaikKKwkJCWNvbnRpbnVlOworCQlpbnNlcnRfb2JqX2hhc2gob2JqLCBuZXdfaGFzaCwgbmV3X2hhc2hfc2l6ZSk7CisJfQorCWZyZWUob2JqX2hhc2gpOworCW9ial9oYXNoID0gbmV3X2hhc2g7CisJb2JqX2hhc2hfc2l6ZSA9IG5ld19oYXNoX3NpemU7Cit9CisKK3ZvaWQgY3JlYXRlZF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IG9iamVjdCAqb2JqKQoreworCW9iai0+cGFyc2VkID0gMDsKKwlvYmotPnVzZWQgPSAwOworCW9iai0+dHlwZSA9IE9CSl9OT05FOworCW9iai0+ZmxhZ3MgPSAwOworCW1lbWNweShvYmotPnNoYTEsIHNoYTEsIDIwKTsKKworCWlmIChvYmpfaGFzaF9zaXplIC0gMSA8PSBucl9vYmpzICogMikKKwkJZ3Jvd19vYmplY3RfaGFzaCgpOworCisJaW5zZXJ0X29ial9oYXNoKG9iaiwgb2JqX2hhc2gsIG9ial9oYXNoX3NpemUpOworCW5yX29ianMrKzsKK30KKworc3RydWN0IG9iamVjdCAqbG9va3VwX29iamVjdF90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKCF0eXBlKSB7CisJCXJldHVybiBsb29rdXBfdW5rbm93bl9vYmplY3Qoc2hhMSk7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpIHsKKwkJcmV0dXJuICZsb29rdXBfYmxvYihzaGExKS0+b2JqZWN0OworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0cmVlX3R5cGUpKSB7CisJCXJldHVybiAmbG9va3VwX3RyZWUoc2hhMSktPm9iamVjdDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgY29tbWl0X3R5cGUpKSB7CisJCXJldHVybiAmbG9va3VwX2NvbW1pdChzaGExKS0+b2JqZWN0OworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0YWdfdHlwZSkpIHsKKwkJcmV0dXJuICZsb29rdXBfdGFnKHNoYTEpLT5vYmplY3Q7CisJfSBlbHNlIHsKKwkJZXJyb3IoIlVua25vd24gdHlwZSAlcyIsIHR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3VuaW9uIGFueV9vYmplY3QgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworCXN0cnVjdCBjb21taXQgY29tbWl0OworCXN0cnVjdCB0cmVlIHRyZWU7CisJc3RydWN0IGJsb2IgYmxvYjsKKwlzdHJ1Y3QgdGFnIHRhZzsKK307CisKK3N0cnVjdCBvYmplY3QgKmxvb2t1cF91bmtub3duX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iaiA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJaWYgKCFvYmopIHsKKwkJdW5pb24gYW55X29iamVjdCAqcmV0ID0geGNhbGxvYygxLCBzaXplb2YoKnJldCkpOworCQljcmVhdGVkX29iamVjdChzaGExLCAmcmV0LT5vYmplY3QpOworCQlyZXQtPm9iamVjdC50eXBlID0gT0JKX05PTkU7CisJCXJldHVybiAmcmV0LT5vYmplY3Q7CisJfQorCXJldHVybiBvYmo7Cit9CisKK3N0cnVjdCBvYmplY3QgKnBhcnNlX29iamVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljaGFyIHR5cGVbMjBdOworCXZvaWQgKmJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKHNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoYnVmZmVyKSB7CisJCXN0cnVjdCBvYmplY3QgKm9iajsKKwkJaWYgKGNoZWNrX3NoYTFfc2lnbmF0dXJlKHNoYTEsIGJ1ZmZlciwgc2l6ZSwgdHlwZSkgPCAwKQorCQkJcHJpbnRmKCJzaGExIG1pc21hdGNoICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJCWlmICghc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpIHsKKwkJCXN0cnVjdCBibG9iICpibG9iID0gbG9va3VwX2Jsb2Ioc2hhMSk7CisJCQlwYXJzZV9ibG9iX2J1ZmZlcihibG9iLCBidWZmZXIsIHNpemUpOworCQkJb2JqID0gJmJsb2ItPm9iamVjdDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpIHsKKwkJCXN0cnVjdCB0cmVlICp0cmVlID0gbG9va3VwX3RyZWUoc2hhMSk7CisJCQlvYmogPSAmdHJlZS0+b2JqZWN0OworCQkJaWYgKCF0cmVlLT5vYmplY3QucGFyc2VkKSB7CisJCQkJcGFyc2VfdHJlZV9idWZmZXIodHJlZSwgYnVmZmVyLCBzaXplKTsKKwkJCQlidWZmZXIgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgY29tbWl0X3R5cGUpKSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOworCQkJcGFyc2VfY29tbWl0X2J1ZmZlcihjb21taXQsIGJ1ZmZlciwgc2l6ZSk7CisJCQlpZiAoIWNvbW1pdC0+YnVmZmVyKSB7CisJCQkJY29tbWl0LT5idWZmZXIgPSBidWZmZXI7CisJCQkJYnVmZmVyID0gTlVMTDsKKwkJCX0KKwkJCW9iaiA9ICZjb21taXQtPm9iamVjdDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIHRhZ190eXBlKSkgeworCQkJc3RydWN0IHRhZyAqdGFnID0gbG9va3VwX3RhZyhzaGExKTsKKwkJCXBhcnNlX3RhZ19idWZmZXIodGFnLCBidWZmZXIsIHNpemUpOworCQkJb2JqID0gJnRhZy0+b2JqZWN0OworCQl9IGVsc2UgeworCQkJb2JqID0gTlVMTDsKKwkJfQorCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiBvYmo7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm9iamVjdF9saXN0X2luc2VydChzdHJ1Y3Qgb2JqZWN0ICppdGVtLAorCQkJCSAgICAgICBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipsaXN0X3ApCit7CisJc3RydWN0IG9iamVjdF9saXN0ICpuZXdfbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmplY3RfbGlzdCkpOworICAgICAgICBuZXdfbGlzdC0+aXRlbSA9IGl0ZW07CisgICAgICAgIG5ld19saXN0LT5uZXh0ID0gKmxpc3RfcDsKKyAgICAgICAgKmxpc3RfcCA9IG5ld19saXN0OworICAgICAgICByZXR1cm4gbmV3X2xpc3Q7Cit9CisKK3ZvaWQgb2JqZWN0X2xpc3RfYXBwZW5kKHN0cnVjdCBvYmplY3QgKml0ZW0sCisJCQlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipsaXN0X3ApCit7CisJd2hpbGUgKCpsaXN0X3ApIHsKKwkJbGlzdF9wID0gJigoKmxpc3RfcCktPm5leHQpOworCX0KKwkqbGlzdF9wID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9saXN0KSk7CisJKCpsaXN0X3ApLT5uZXh0ID0gTlVMTDsKKwkoKmxpc3RfcCktPml0ZW0gPSBpdGVtOworfQorCit1bnNpZ25lZCBvYmplY3RfbGlzdF9sZW5ndGgoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0KQoreworCXVuc2lnbmVkIHJldCA9IDA7CisJd2hpbGUgKGxpc3QpIHsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCXJldCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgb2JqZWN0X2xpc3RfY29udGFpbnMoc3RydWN0IG9iamVjdF9saXN0ICpsaXN0LCBzdHJ1Y3Qgb2JqZWN0ICpvYmopCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJaWYgKGxpc3QtPml0ZW0gPT0gb2JqKQorCQkJcmV0dXJuIDE7CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBhZGRfb2JqZWN0X2FycmF5KHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG9iamVjdF9hcnJheSAqYXJyYXkpCit7CisJdW5zaWduZWQgbnIgPSBhcnJheS0+bnI7CisJdW5zaWduZWQgYWxsb2MgPSBhcnJheS0+YWxsb2M7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSAqb2JqZWN0cyA9IGFycmF5LT5vYmplY3RzOworCisJaWYgKG5yID49IGFsbG9jKSB7CisJCWFsbG9jID0gKGFsbG9jICsgMzIpICogMjsKKwkJb2JqZWN0cyA9IHhyZWFsbG9jKG9iamVjdHMsIGFsbG9jICogc2l6ZW9mKCpvYmplY3RzKSk7CisJCWFycmF5LT5hbGxvYyA9IGFsbG9jOworCQlhcnJheS0+b2JqZWN0cyA9IG9iamVjdHM7CisJfQorCW9iamVjdHNbbnJdLml0ZW0gPSBvYmo7CisJb2JqZWN0c1tucl0ubmFtZSA9IG5hbWU7CisJYXJyYXktPm5yID0gKytucjsKK30KZGlmZiAtLWdpdCBhL29iamVjdC5oIGIvb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmFhYwotLS0gL2Rldi9udWxsCisrKyBiL29iamVjdC5oCkBAIC0wLDAgKzEsOTQgQEAKKyNpZm5kZWYgT0JKRUNUX0gKKyNkZWZpbmUgT0JKRUNUX0gKKworc3RydWN0IG9iamVjdF9saXN0IHsKKwlzdHJ1Y3Qgb2JqZWN0ICppdGVtOworCXN0cnVjdCBvYmplY3RfbGlzdCAqbmV4dDsKK307CisKK3N0cnVjdCBvYmplY3RfcmVmcyB7CisJdW5zaWduZWQgY291bnQ7CisJc3RydWN0IG9iamVjdCAqYmFzZTsKKwlzdHJ1Y3Qgb2JqZWN0ICpyZWZbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KK307CisKK3N0cnVjdCBvYmplY3RfYXJyYXkgeworCXVuc2lnbmVkIGludCBucjsKKwl1bnNpZ25lZCBpbnQgYWxsb2M7CisJc3RydWN0IG9iamVjdF9hcnJheV9lbnRyeSB7CisJCXN0cnVjdCBvYmplY3QgKml0ZW07CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJfSAqb2JqZWN0czsKK307CisKKyNkZWZpbmUgVFlQRV9CSVRTICAgMworI2RlZmluZSBGTEFHX0JJVFMgIDI3CisKKy8qCisgKiBUaGUgb2JqZWN0IHR5cGUgaXMgc3RvcmVkIGluIDMgYml0cy4KKyAqLworZW51bSBvYmplY3RfdHlwZSB7CisJT0JKX05PTkUgPSAwLAorCU9CSl9DT01NSVQgPSAxLAorCU9CSl9UUkVFID0gMiwKKwlPQkpfQkxPQiA9IDMsCisJT0JKX1RBRyA9IDQsCisJLyogNS82IGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisJT0JKX0RFTFRBID0gNywKKwlPQkpfQkFELAorfTsKKworc3RydWN0IG9iamVjdCB7CisJdW5zaWduZWQgcGFyc2VkIDogMTsKKwl1bnNpZ25lZCB1c2VkIDogMTsKKwl1bnNpZ25lZCB0eXBlIDogVFlQRV9CSVRTOworCXVuc2lnbmVkIGZsYWdzIDogRkxBR19CSVRTOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cit9OworCitleHRlcm4gaW50IHRyYWNrX29iamVjdF9yZWZzOworZXh0ZXJuIGNvbnN0IGNoYXIgKnR5cGVfbmFtZXNbOV07CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X21heF9vYmplY3RfaW5kZXgodm9pZCk7CitleHRlcm4gc3RydWN0IG9iamVjdCAqZ2V0X2luZGV4ZWRfb2JqZWN0KHVuc2lnbmVkIGludCk7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqdHlwZW5hbWUodW5zaWduZWQgaW50IHR5cGUpCit7CisJcmV0dXJuIHR5cGVfbmFtZXNbdHlwZSA+IE9CSl9CQUQgPyBPQkpfQkFEIDogdHlwZV07Cit9CisKK2V4dGVybiBzdHJ1Y3Qgb2JqZWN0X3JlZnMgKmxvb2t1cF9vYmplY3RfcmVmcyhzdHJ1Y3Qgb2JqZWN0ICopOworCisvKiogSW50ZXJuYWwgb25seSAqKi8KK3N0cnVjdCBvYmplY3QgKmxvb2t1cF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKy8qKiBSZXR1cm5zIHRoZSBvYmplY3QsIGhhdmluZyBsb29rZWQgaXQgdXAgYXMgYmVpbmcgdGhlIGdpdmVuIHR5cGUuICoqLworc3RydWN0IG9iamVjdCAqbG9va3VwX29iamVjdF90eXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKnR5cGUpOworCit2b2lkIGNyZWF0ZWRfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBvYmplY3QgKm9iaik7CisKKy8qKiBSZXR1cm5zIHRoZSBvYmplY3QsIGhhdmluZyBwYXJzZWQgaXQgdG8gZmluZCBvdXQgd2hhdCBpdCBpcy4gKiovCitzdHJ1Y3Qgb2JqZWN0ICpwYXJzZV9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKy8qKiBSZXR1cm5zIHRoZSBvYmplY3QsIHdpdGggcG90ZW50aWFsbHkgZXhjZXNzIG1lbW9yeSBhbGxvY2F0ZWQuICoqLworc3RydWN0IG9iamVjdCAqbG9va3VwX3Vua25vd25fb2JqZWN0KGNvbnN0IHVuc2lnbmVkICBjaGFyICpzaGExKTsKKworc3RydWN0IG9iamVjdF9yZWZzICphbGxvY19vYmplY3RfcmVmcyh1bnNpZ25lZCBjb3VudCk7Cit2b2lkIHNldF9vYmplY3RfcmVmcyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCBvYmplY3RfcmVmcyAqcmVmcyk7CisKK3ZvaWQgbWFya19yZWFjaGFibGUoc3RydWN0IG9iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgbWFzayk7CisKK3N0cnVjdCBvYmplY3RfbGlzdCAqb2JqZWN0X2xpc3RfaW5zZXJ0KHN0cnVjdCBvYmplY3QgKml0ZW0sIAorCQkJCSAgICAgICBzdHJ1Y3Qgb2JqZWN0X2xpc3QgKipsaXN0X3ApOworCit2b2lkIG9iamVjdF9saXN0X2FwcGVuZChzdHJ1Y3Qgb2JqZWN0ICppdGVtLAorCQkJc3RydWN0IG9iamVjdF9saXN0ICoqbGlzdF9wKTsKKwordW5zaWduZWQgb2JqZWN0X2xpc3RfbGVuZ3RoKHN0cnVjdCBvYmplY3RfbGlzdCAqbGlzdCk7CisKK2ludCBvYmplY3RfbGlzdF9jb250YWlucyhzdHJ1Y3Qgb2JqZWN0X2xpc3QgKmxpc3QsIHN0cnVjdCBvYmplY3QgKm9iaik7CisKKy8qIE9iamVjdCBhcnJheSBoYW5kbGluZyAuLiAqLwordm9pZCBhZGRfb2JqZWN0X2FycmF5KHN0cnVjdCBvYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG9iamVjdF9hcnJheSAqYXJyYXkpOworCisjZW5kaWYgLyogT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL3BhY2stY2hlY2suYyBiL3BhY2stY2hlY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTYyZTFiCi0tLSAvZGV2L251bGwKKysrIGIvcGFjay1jaGVjay5jCkBAIC0wLDAgKzEsMTYxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisKK3N0YXRpYyBpbnQgdmVyaWZ5X3BhY2tmaWxlKHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXhfc2l6ZSA9IHAtPmluZGV4X3NpemU7CisJdm9pZCAqaW5kZXhfYmFzZSA9IHAtPmluZGV4X2Jhc2U7CisJU0hBX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwl1bnNpZ25lZCBsb25nIHBhY2tfc2l6ZSA9IHAtPnBhY2tfc2l6ZTsKKwl2b2lkICpwYWNrX2Jhc2U7CisJc3RydWN0IHBhY2tfaGVhZGVyICpoZHI7CisJaW50IG5yX29iamVjdHMsIGVyciwgaTsKKworCS8qIEhlYWRlciBjb25zaXN0ZW5jeSBjaGVjayAqLworCWhkciA9IHAtPnBhY2tfYmFzZTsKKwlpZiAoaGRyLT5oZHJfc2lnbmF0dXJlICE9IGh0b25sKFBBQ0tfU0lHTkFUVVJFKSkKKwkJcmV0dXJuIGVycm9yKCJQYWNrZmlsZSAlcyBzaWduYXR1cmUgbWlzbWF0Y2giLCBwLT5wYWNrX25hbWUpOworCWlmICghcGFja192ZXJzaW9uX29rKGhkci0+aGRyX3ZlcnNpb24pKQorCQlyZXR1cm4gZXJyb3IoIlBhY2tmaWxlIHZlcnNpb24gJWQgdW5zdXBwb3J0ZWQiLAorCQkJICAgICBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisJbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCWlmIChudW1fcGFja2VkX29iamVjdHMocCkgIT0gbnJfb2JqZWN0cykKKwkJcmV0dXJuIGVycm9yKCJQYWNrZmlsZSBjbGFpbXMgdG8gaGF2ZSAlZCBvYmplY3RzLCAiCisJCQkgICAgICJ3aGlsZSBpZHggc2l6ZSBleHBlY3RzICVkIiwgbnJfb2JqZWN0cywKKwkJCSAgICAgbnVtX3BhY2tlZF9vYmplY3RzKHApKTsKKworCVNIQTFfSW5pdCgmY3R4KTsKKwlwYWNrX2Jhc2UgPSBwLT5wYWNrX2Jhc2U7CisJU0hBMV9VcGRhdGUoJmN0eCwgcGFja19iYXNlLCBwYWNrX3NpemUgLSAyMCk7CisJU0hBMV9GaW5hbChzaGExLCAmY3R4KTsKKwlpZiAobWVtY21wKHNoYTEsIChjaGFyICopIHBhY2tfYmFzZSArIHBhY2tfc2l6ZSAtIDIwLCAyMCkpCisJCXJldHVybiBlcnJvcigiUGFja2ZpbGUgJXMgU0hBMSBtaXNtYXRjaCB3aXRoIGl0c2VsZiIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSk7CisJaWYgKG1lbWNtcChzaGExLCAoY2hhciAqKSBpbmRleF9iYXNlICsgaW5kZXhfc2l6ZSAtIDQwLCAyMCkpCisJCXJldHVybiBlcnJvcigiUGFja2ZpbGUgJXMgU0hBMSBtaXNtYXRjaCB3aXRoIGlkeCIsCisJCQkgICAgIHAtPnBhY2tfbmFtZSk7CisKKwkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyByZWFjaGFibGUgZnJvbSBpZHggaXMgdmFsaWQuICBTaW5jZSB3ZQorCSAqIGhhdmUgdmVyaWZpZWQgdGhhdCBucl9vYmplY3RzIG1hdGNoZXMgYmV0d2VlbiBpZHggYW5kIHBhY2ssCisJICogd2UgZG8gbm90IGRvIHNjYW4tc3RyZWFtaW5nIGNoZWNrIG9uIHRoZSBwYWNrIGZpbGUuCisJICovCisJZm9yIChpID0gZXJyID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3QgcGFja19lbnRyeSBlOworCQl2b2lkICpkYXRhOworCQljaGFyIHR5cGVbMjBdOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJaWYgKG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSwgc2hhMSkpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgbnRoLXBhY2tlZC1vYmplY3QiKTsKKwkJaWYgKCFmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsICZlLCBwKSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBmaW5kLXBhY2stZW50cnktb25lIik7CisJCWRhdGEgPSB1bnBhY2tfZW50cnlfZ2VudGx5KCZlLCB0eXBlLCAmc2l6ZSk7CisJCWlmICghZGF0YSkgeworCQkJZXJyID0gZXJyb3IoImNhbm5vdCB1bnBhY2sgJXMgZnJvbSAlcyIsCisJCQkJICAgIHNoYTFfdG9faGV4KHNoYTEpLCBwLT5wYWNrX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoZWNrX3NoYTFfc2lnbmF0dXJlKHNoYTEsIGRhdGEsIHNpemUsIHR5cGUpKSB7CisJCQllcnIgPSBlcnJvcigicGFja2VkICVzIGZyb20gJXMgaXMgY29ycnVwdCIsCisJCQkJICAgIHNoYTFfdG9faGV4KHNoYTEpLCBwLT5wYWNrX25hbWUpOworCQkJZnJlZShkYXRhKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZyZWUoZGF0YSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworCisjZGVmaW5lIE1BWF9DSEFJTiA0MAorCitzdGF0aWMgdm9pZCBzaG93X3BhY2tfaW5mbyhzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19oZWFkZXIgKmhkcjsKKwlpbnQgbnJfb2JqZWN0cywgaTsKKwl1bnNpZ25lZCBpbnQgY2hhaW5faGlzdG9ncmFtW01BWF9DSEFJTl07CisKKwloZHIgPSBwLT5wYWNrX2Jhc2U7CisJbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCW1lbXNldChjaGFpbl9oaXN0b2dyYW0sIDAsIHNpemVvZihjaGFpbl9oaXN0b2dyYW0pKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspIHsKKwkJdW5zaWduZWQgY2hhciBzaGExWzIwXSwgYmFzZV9zaGExWzIwXTsKKwkJc3RydWN0IHBhY2tfZW50cnkgZTsKKwkJY2hhciB0eXBlWzIwXTsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQl1bnNpZ25lZCBsb25nIHN0b3JlX3NpemU7CisJCXVuc2lnbmVkIGludCBkZWx0YV9jaGFpbl9sZW5ndGg7CisKKwkJaWYgKG50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgaSwgc2hhMSkpCisJCQlkaWUoImludGVybmFsIGVycm9yIHBhY2stY2hlY2sgbnRoLXBhY2tlZC1vYmplY3QiKTsKKwkJaWYgKCFmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsICZlLCBwKSkKKwkJCWRpZSgiaW50ZXJuYWwgZXJyb3IgcGFjay1jaGVjayBmaW5kLXBhY2stZW50cnktb25lIik7CisKKwkJcGFja2VkX29iamVjdF9pbmZvX2RldGFpbCgmZSwgdHlwZSwgJnNpemUsICZzdG9yZV9zaXplLAorCQkJCQkgICZkZWx0YV9jaGFpbl9sZW5ndGgsCisJCQkJCSAgYmFzZV9zaGExKTsKKwkJcHJpbnRmKCIlcyAiLCBzaGExX3RvX2hleChzaGExKSk7CisJCWlmICghZGVsdGFfY2hhaW5fbGVuZ3RoKQorCQkJcHJpbnRmKCIlLTZzICVsdSAldVxuIiwgdHlwZSwgc2l6ZSwgZS5vZmZzZXQpOworCQllbHNlIHsKKwkJCXByaW50ZigiJS02cyAlbHUgJXUgJXUgJXNcbiIsIHR5cGUsIHNpemUsIGUub2Zmc2V0LAorCQkJICAgICAgIGRlbHRhX2NoYWluX2xlbmd0aCwgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJCQlpZiAoZGVsdGFfY2hhaW5fbGVuZ3RoIDwgTUFYX0NIQUlOKQorCQkJCWNoYWluX2hpc3RvZ3JhbVtkZWx0YV9jaGFpbl9sZW5ndGhdKys7CisJCQllbHNlCisJCQkJY2hhaW5faGlzdG9ncmFtWzBdKys7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NIQUlOOyBpKyspIHsKKwkJaWYgKCFjaGFpbl9oaXN0b2dyYW1baV0pCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCJjaGFpbiBsZW5ndGggJXMgJWQ6ICVkIG9iamVjdCVzXG4iLAorCQkgICAgICAgaSA/ICI9IiA6ICI+PSIsCisJCSAgICAgICBpID8gaSA6IE1BWF9DSEFJTiwKKwkJICAgICAgIGNoYWluX2hpc3RvZ3JhbVtpXSwKKwkJICAgICAgIDEgPCBjaGFpbl9oaXN0b2dyYW1baV0gPyAicyIgOiAiIik7CisJfQorfQorCitpbnQgdmVyaWZ5X3BhY2soc3RydWN0IHBhY2tlZF9naXQgKnAsIGludCB2ZXJib3NlKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXhfc2l6ZSA9IHAtPmluZGV4X3NpemU7CisJdm9pZCAqaW5kZXhfYmFzZSA9IHAtPmluZGV4X2Jhc2U7CisJU0hBX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpbnQgcmV0OworCisJcmV0ID0gMDsKKwkvKiBWZXJpZnkgU0hBMSBzdW0gb2YgdGhlIGluZGV4IGZpbGUgKi8KKwlTSEExX0luaXQoJmN0eCk7CisJU0hBMV9VcGRhdGUoJmN0eCwgaW5kZXhfYmFzZSwgaW5kZXhfc2l6ZSAtIDIwKTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCWlmIChtZW1jbXAoc2hhMSwgKGNoYXIgKikgaW5kZXhfYmFzZSArIGluZGV4X3NpemUgLSAyMCwgMjApKQorCQlyZXQgPSBlcnJvcigiUGFja2ZpbGUgaW5kZXggZm9yICVzIFNIQTEgbWlzbWF0Y2giLAorCQkJICAgIHAtPnBhY2tfbmFtZSk7CisKKwlpZiAoIXJldCkgeworCQkvKiBWZXJpZnkgcGFjayBmaWxlICovCisJCXVzZV9wYWNrZWRfZ2l0KHApOworCQlyZXQgPSB2ZXJpZnlfcGFja2ZpbGUocCk7CisJCXVudXNlX3BhY2tlZF9naXQocCk7CisJfQorCisJaWYgKHZlcmJvc2UpIHsKKwkJaWYgKHJldCkKKwkJCXByaW50ZigiJXM6IGJhZFxuIiwgcC0+cGFja19uYW1lKTsKKwkJZWxzZSB7CisJCQl1c2VfcGFja2VkX2dpdChwKTsKKwkJCXNob3dfcGFja19pbmZvKHApOworCQkJdW51c2VfcGFja2VkX2dpdChwKTsKKwkJCXByaW50ZigiJXM6IG9rXG4iLCBwLT5wYWNrX25hbWUpOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3BhY2stb2JqZWN0cy5jIGIvcGFjay1vYmplY3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYzdmMAotLS0gL2Rldi9udWxsCisrKyBiL3BhY2stb2JqZWN0cy5jCkBAIC0wLDAgKzEsMTM3NiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKyNpbmNsdWRlICJkZWx0YS5oIgorI2luY2x1ZGUgInBhY2suaCIKKyNpbmNsdWRlICJjc3VtLWZpbGUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCitzdGF0aWMgY29uc3QgY2hhciBwYWNrX3VzYWdlW10gPSAiZ2l0LXBhY2stb2JqZWN0cyBbLXFdIFstLW5vLXJldXNlLWRlbHRhXSBbLS1ub24tZW1wdHldIFstLWxvY2FsXSBbLS1pbmNyZW1lbnRhbF0gWy0td2luZG93PU5dIFstLWRlcHRoPU5dIHstLXN0ZG91dCB8IGJhc2UtbmFtZX0gPCBvYmplY3QtbGlzdCI7CisKK3N0cnVjdCBvYmplY3RfZW50cnkgeworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJdW5zaWduZWQgbG9uZyBzaXplOwkvKiB1bmNvbXByZXNzZWQgc2l6ZSAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBvZmZzZXQgaW50byB0aGUgZmluYWwgcGFjayBmaWxlOworCQkJCSAqIG5vbnplcm8gaWYgYWxyZWFkeSB3cml0dGVuLgorCQkJCSAqLworCXVuc2lnbmVkIGludCBkZXB0aDsJLyogZGVsdGEgZGVwdGggKi8KKwl1bnNpZ25lZCBpbnQgZGVsdGFfbGltaXQ7CS8qIGJhc2UgYWRqdXN0bWVudCBmb3IgaW4tcGFjayBkZWx0YSAqLworCXVuc2lnbmVkIGludCBoYXNoOwkvKiBuYW1lIGhpbnQgaGFzaCAqLworCWVudW0gb2JqZWN0X3R5cGUgdHlwZTsKKwllbnVtIG9iamVjdF90eXBlIGluX3BhY2tfdHlwZTsJLyogY291bGQgYmUgZGVsdGEgKi8KKwl1bnNpZ25lZCBsb25nIGRlbHRhX3NpemU7CS8qIGRlbHRhIGRhdGEgc2l6ZSAodW5jb21wcmVzc2VkKSAqLworCXN0cnVjdCBvYmplY3RfZW50cnkgKmRlbHRhOwkvKiBkZWx0YSBiYXNlIG9iamVjdCAqLworCXN0cnVjdCBwYWNrZWRfZ2l0ICppbl9wYWNrOyAJLyogYWxyZWFkeSBpbiBwYWNrICovCisJdW5zaWduZWQgaW50IGluX3BhY2tfb2Zmc2V0OworCXN0cnVjdCBvYmplY3RfZW50cnkgKmRlbHRhX2NoaWxkOyAvKiBkZWx0aWZpZWQgb2JqZWN0cyB3aG8gYmFzZXMgbWUgKi8KKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpkZWx0YV9zaWJsaW5nOyAvKiBvdGhlciBkZWx0aWZpZWQgb2JqZWN0cyB3aG8KKwkJCQkJICAgICAqIHVzZXMgdGhlIHNhbWUgYmFzZSBhcyBtZQorCQkJCQkgICAgICovCisJaW50IHByZWZlcnJlZF9iYXNlOwkvKiB3ZSBkbyBub3QgcGFjayB0aGlzLCBidXQgaXMgZW5jb3VyYWdlZCB0bworCQkJCSAqIGJlIHVzZWQgYXMgdGhlIGJhc2Ugb2JqZWN0dG8gZGVsdGEgaHVnZQorCQkJCSAqIG9iamVjdHMgYWdhaW5zdC4KKwkJCQkgKi8KK307CisKKy8qCisgKiBPYmplY3RzIHdlIGFyZSBnb2luZyB0byBwYWNrIGFyZSBjb2xsZWN0ZWQgaW4gb2JqZWN0cyBhcnJheSAoZHluYW1pY2FsbHkKKyAqIGV4cGFuZGVkKS4gIG5yX29iamVjdHMgJiBucl9hbGxvYyBjb250cm9scyB0aGlzIGFycmF5LiAgVGhleSBhcmUgc3RvcmVkCisgKiBpbiB0aGUgb3JkZXIgd2Ugc2VlIC0tIHR5cGljYWxseSByZXYtbGlzdCAtLW9iamVjdHMgb3JkZXIgdGhhdCBnaXZlcyB1cworICogbmljZSAibWluaW11bSBzZWVrIiBvcmRlci4KKyAqCisgKiBzb3J0ZWQtYnktc2hhIGFucyBzb3J0ZWQtYnktdHlwZSBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRoYXQgcG9pbnQgYXQKKyAqIGVsZW1lbnRzIGluIHRoZSBvYmplY3RzIGFycmF5LiAgVGhlIGZvcm1lciBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBwYWNrCisgKiBpbmRleCAobGlzdHMgb2JqZWN0IG5hbWVzIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIgdG8gaGVscCBvZmZzZXQgbG9va3VwKSwKKyAqIGFuZCB0aGUgbGF0dGVyIGlzIHVzZWQgdG8gZ3JvdXAgc2ltaWxhciB0aGluZ3MgdG9nZXRoZXIgYnkgdHJ5X2RlbHRhKCkKKyAqIGhldXJpc3RpY3MuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgb2JqZWN0X2xpc3Rfc2hhMVsyMF07CitzdGF0aWMgaW50IG5vbl9lbXB0eSA9IDA7CitzdGF0aWMgaW50IG5vX3JldXNlX2RlbHRhID0gMDsKK3N0YXRpYyBpbnQgbG9jYWwgPSAwOworc3RhdGljIGludCBpbmNyZW1lbnRhbCA9IDA7CitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqKnNvcnRlZF9ieV9zaGEsICoqc29ydGVkX2J5X3R5cGU7CitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqb2JqZWN0cyA9IE5VTEw7CitzdGF0aWMgaW50IG5yX29iamVjdHMgPSAwLCBucl9hbGxvYyA9IDAsIG5yX3Jlc3VsdCA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqYmFzZV9uYW1lOworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFja19maWxlX3NoYTFbMjBdOworc3RhdGljIGludCBwcm9ncmVzcyA9IDE7CitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHByb2dyZXNzX3VwZGF0ZSA9IDA7CitzdGF0aWMgaW50IHdpbmRvdyA9IDEwOworCisvKgorICogVGhlIG9iamVjdCBuYW1lcyBpbiBvYmplY3RzIGFycmF5IGFyZSBoYXNoZWQgd2l0aCB0aGlzIGhhc2h0YWJsZSwKKyAqIHRvIGhlbHAgbG9va2luZyB1cCB0aGUgZW50cnkgYnkgb2JqZWN0IG5hbWUuICBCaW5hcnkgc2VhcmNoIGZyb20KKyAqIHNvcnRlZF9ieV9zaGEgaXMgYWxzbyBwb3NzaWJsZSBidXQgdGhpcyB3YXMgZWFzaWVyIHRvIGNvZGUgYW5kIGZhc3Rlci4KKyAqIFRoaXMgaGFzaHRhYmxlIGlzIGJ1aWx0IGFmdGVyIGFsbCB0aGUgb2JqZWN0cyBhcmUgc2Vlbi4KKyAqLworc3RhdGljIGludCAqb2JqZWN0X2l4ID0gTlVMTDsKK3N0YXRpYyBpbnQgb2JqZWN0X2l4X2hhc2hzeiA9IDA7CisKKy8qCisgKiBQYWNrIGluZGV4IGZvciBleGlzdGluZyBwYWNrcyBnaXZlIHVzIGVhc3kgYWNjZXNzIHRvIHRoZSBvZmZzZXRzIGludG8KKyAqIGNvcnJlc3BvbmRpbmcgcGFjayBmaWxlIHdoZXJlIGVhY2ggb2JqZWN0J3MgZGF0YSBzdGFydHMsIGJ1dCB0aGUgZW50cmllcworICogZG8gbm90IHN0b3JlIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIHJlcHJlc2VudGF0aW9uICh1bmNvbXByZXNzZWQKKyAqIHNpemUgaXMgZWFzaWx5IGF2YWlsYWJsZSBieSBleGFtaW5pbmcgdGhlIHBhY2sgZW50cnkgaGVhZGVyKS4gIFdlIGJ1aWxkCisgKiBhIGhhc2h0YWJsZSBvZiBleGlzdGluZyBwYWNrcyAocGFja19yZXZpbmRleCksIGFuZCBrZWVwIHJldmVyc2UgaW5kZXgKKyAqIGhlcmUgLS0gcGFjayBpbmRleCBmaWxlIGlzIHNvcnRlZCBieSBvYmplY3QgbmFtZSBtYXBwaW5nIHRvIG9mZnNldDsgdGhpcworICogcGFja19yZXZpbmRleFtdLnJldmluZGV4IGFycmF5IGlzIGFuIG9yZGVyZWQgbGlzdCBvZiBvZmZzZXRzLCBzbyBpZiB5b3UKKyAqIGtub3cgdGhlIG9mZnNldCBvZiBhbiBvYmplY3QsIG5leHQgb2Zmc2V0IGlzIHdoZXJlIGl0cyBwYWNrZWQKKyAqIHJlcHJlc2VudGF0aW9uIGVuZHMuCisgKi8KK3N0cnVjdCBwYWNrX3JldmluZGV4IHsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwl1bnNpZ25lZCBsb25nICpyZXZpbmRleDsKK30gKnBhY2tfcmV2aW5kZXggPSBOVUxMOworc3RhdGljIGludCBwYWNrX3JldmluZGV4X2hhc2hzeiA9IDA7CisKKy8qCisgKiBzdGF0cworICovCitzdGF0aWMgaW50IHdyaXR0ZW4gPSAwOworc3RhdGljIGludCB3cml0dGVuX2RlbHRhID0gMDsKK3N0YXRpYyBpbnQgcmV1c2VkID0gMDsKK3N0YXRpYyBpbnQgcmV1c2VkX2RlbHRhID0gMDsKKworc3RhdGljIGludCBwYWNrX3JldmluZGV4X2l4KHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgdWkgPSAodW5zaWduZWQgbG9uZylwOworCWludCBpOworCisJdWkgPSB1aSBeICh1aSA+PiAxNik7IC8qIGRlZmVhdCBzdHJ1Y3R1cmUgYWxpZ25tZW50ICovCisJaSA9IChpbnQpKHVpICUgcGFja19yZXZpbmRleF9oYXNoc3opOworCXdoaWxlIChwYWNrX3JldmluZGV4W2ldLnApIHsKKwkJaWYgKHBhY2tfcmV2aW5kZXhbaV0ucCA9PSBwKQorCQkJcmV0dXJuIGk7CisJCWlmICgrK2kgPT0gcGFja19yZXZpbmRleF9oYXNoc3opCisJCQlpID0gMDsKKwl9CisJcmV0dXJuIC0xIC0gaTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrX2l4KHZvaWQpCit7CisJaW50IG51bTsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlmb3IgKG51bSA9IDAsIHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkKKwkJbnVtKys7CisJaWYgKCFudW0pCisJCXJldHVybjsKKwlwYWNrX3JldmluZGV4X2hhc2hzeiA9IG51bSAqIDExOworCXBhY2tfcmV2aW5kZXggPSB4Y2FsbG9jKHNpemVvZigqcGFja19yZXZpbmRleCksIHBhY2tfcmV2aW5kZXhfaGFzaHN6KTsKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQludW0gPSBwYWNrX3JldmluZGV4X2l4KHApOworCQludW0gPSAtIDEgLSBudW07CisJCXBhY2tfcmV2aW5kZXhbbnVtXS5wID0gcDsKKwl9CisJLyogcmV2aW5kZXggZWxlbWVudHMgYXJlIGxhemlseSBpbml0aWFsaXplZCAqLworfQorCitzdGF0aWMgaW50IGNtcF9vZmZzZXQoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXVuc2lnbmVkIGxvbmcgYSA9ICoodW5zaWduZWQgbG9uZyAqKSBhXzsKKwl1bnNpZ25lZCBsb25nIGIgPSAqKHVuc2lnbmVkIGxvbmcgKikgYl87CisJaWYgKGEgPCBiKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAoYSA9PSBiKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisvKgorICogT3JkZXJlZCBsaXN0IG9mIG9mZnNldHMgb2Ygb2JqZWN0cyBpbiB0aGUgcGFjay4KKyAqLworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrX3JldmluZGV4KHN0cnVjdCBwYWNrX3JldmluZGV4ICpyaXgpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSByaXgtPnA7CisJaW50IG51bV9lbnQgPSBudW1fcGFja2VkX29iamVjdHMocCk7CisJaW50IGk7CisJdm9pZCAqaW5kZXggPSBwLT5pbmRleF9iYXNlICsgMjU2OworCisJcml4LT5yZXZpbmRleCA9IHhtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogKG51bV9lbnQgKyAxKSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9lbnQ7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaGwgPSAqKCh1bnNpZ25lZCBpbnQgKikoKGNoYXIgKikgaW5kZXggKyAyNCppKSk7CisJCXJpeC0+cmV2aW5kZXhbaV0gPSBudG9obChobCk7CisJfQorCS8qIFRoaXMga25vd3MgdGhlIHBhY2sgZm9ybWF0IC0tIHRoZSAyMC1ieXRlIHRyYWlsZXIKKwkgKiBmb2xsb3dzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IG9iamVjdCBkYXRhLgorCSAqLworCXJpeC0+cmV2aW5kZXhbbnVtX2VudF0gPSBwLT5wYWNrX3NpemUgLSAyMDsKKwlxc29ydChyaXgtPnJldmluZGV4LCBudW1fZW50LCBzaXplb2YodW5zaWduZWQgbG9uZyksIGNtcF9vZmZzZXQpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBmaW5kX3BhY2tlZF9vYmplY3Rfc2l6ZShzdHJ1Y3QgcGFja2VkX2dpdCAqcCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIG9mcykKK3sKKwlpbnQgbnVtOworCWludCBsbywgaGk7CisJc3RydWN0IHBhY2tfcmV2aW5kZXggKnJpeDsKKwl1bnNpZ25lZCBsb25nICpyZXZpbmRleDsKKwludW0gPSBwYWNrX3JldmluZGV4X2l4KHApOworCWlmIChudW0gPCAwKQorCQlkaWUoImludGVybmFsIGVycm9yOiBwYWNrIHJldmluZGV4IHVuaW5pdGlhbGl6ZWQiKTsKKwlyaXggPSAmcGFja19yZXZpbmRleFtudW1dOworCWlmICghcml4LT5yZXZpbmRleCkKKwkJcHJlcGFyZV9wYWNrX3JldmluZGV4KHJpeCk7CisJcmV2aW5kZXggPSByaXgtPnJldmluZGV4OworCWxvID0gMDsKKwloaSA9IG51bV9wYWNrZWRfb2JqZWN0cyhwKSArIDE7CisJZG8geworCQlpbnQgbWkgPSAobG8gKyBoaSkgLyAyOworCQlpZiAocmV2aW5kZXhbbWldID09IG9mcykgeworCQkJcmV0dXJuIHJldmluZGV4W21pKzFdIC0gb2ZzOworCQl9CisJCWVsc2UgaWYgKG9mcyA8IHJldmluZGV4W21pXSkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkgKyAxOworCX0gd2hpbGUgKGxvIDwgaGkpOworCWRpZSgiaW50ZXJuYWwgZXJyb3I6IHBhY2sgcmV2aW5kZXggY29ycnVwdCIpOworfQorCitzdGF0aWMgdm9pZCAqZGVsdGFfYWdhaW5zdCh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyBvdGhlcnNpemUsIGRlbHRhX3NpemU7CisJY2hhciB0eXBlWzEwXTsKKwl2b2lkICpvdGhlcmJ1ZiA9IHJlYWRfc2hhMV9maWxlKGVudHJ5LT5kZWx0YS0+c2hhMSwgdHlwZSwgJm90aGVyc2l6ZSk7CisJdm9pZCAqZGVsdGFfYnVmOworCisJaWYgKCFvdGhlcmJ1ZikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCAlcyIsIHNoYTFfdG9faGV4KGVudHJ5LT5kZWx0YS0+c2hhMSkpOworICAgICAgICBkZWx0YV9idWYgPSBkaWZmX2RlbHRhKG90aGVyYnVmLCBvdGhlcnNpemUsCisJCQkgICAgICAgYnVmLCBzaXplLCAmZGVsdGFfc2l6ZSwgMCk7CisgICAgICAgIGlmICghZGVsdGFfYnVmIHx8IGRlbHRhX3NpemUgIT0gZW50cnktPmRlbHRhX3NpemUpCisgICAgICAgIAlkaWUoImRlbHRhIHNpemUgY2hhbmdlZCIpOworICAgICAgICBmcmVlKGJ1Zik7CisgICAgICAgIGZyZWUob3RoZXJidWYpOworCXJldHVybiBkZWx0YV9idWY7Cit9CisKKy8qCisgKiBUaGUgcGVyLW9iamVjdCBoZWFkZXIgaXMgYSBwcmV0dHkgZGVuc2UgdGhpbmcsIHdoaWNoIGlzCisgKiAgLSBmaXJzdCBieXRlOiBsb3cgZm91ciBiaXRzIGFyZSAic2l6ZSIsIHRoZW4gdGhyZWUgYml0cyBvZiAidHlwZSIsCisgKiAgICBhbmQgdGhlIGhpZ2ggYml0IGlzICJzaXplIGNvbnRpbnVlcyIuCisgKiAgLSBlYWNoIGJ5dGUgYWZ0ZXJ3YXJkczogbG93IHNldmVuIGJpdHMgYXJlIHNpemUgY29udGludWF0aW9uLAorICogICAgd2l0aCB0aGUgaGlnaCBiaXQgYmVpbmcgInNpemUgY29udGludWVzIgorICovCitzdGF0aWMgaW50IGVuY29kZV9oZWFkZXIoZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgKmhkcikKK3sKKwlpbnQgbiA9IDE7CisJdW5zaWduZWQgY2hhciBjOworCisJaWYgKHR5cGUgPCBPQkpfQ09NTUlUIHx8IHR5cGUgPiBPQkpfREVMVEEpCisJCWRpZSgiYmFkIHR5cGUgJWQiLCB0eXBlKTsKKworCWMgPSAodHlwZSA8PCA0KSB8IChzaXplICYgMTUpOworCXNpemUgPj49IDQ7CisJd2hpbGUgKHNpemUpIHsKKwkJKmhkcisrID0gYyB8IDB4ODA7CisJCWMgPSBzaXplICYgMHg3ZjsKKwkJc2l6ZSA+Pj0gNzsKKwkJbisrOworCX0KKwkqaGRyID0gYzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd3JpdGVfb2JqZWN0KHN0cnVjdCBzaGExZmlsZSAqZiwKKwkJCQkgIHN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljaGFyIHR5cGVbMTBdOworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyIGhlYWRlclsxMF07CisJdW5zaWduZWQgaGRybGVuLCBkYXRhbGVuOworCWVudW0gb2JqZWN0X3R5cGUgb2JqX3R5cGU7CisJaW50IHRvX3JldXNlID0gMDsKKworCWlmIChlbnRyeS0+cHJlZmVycmVkX2Jhc2UpCisJCXJldHVybiAwOworCisJb2JqX3R5cGUgPSBlbnRyeS0+dHlwZTsKKwlpZiAoISBlbnRyeS0+aW5fcGFjaykKKwkJdG9fcmV1c2UgPSAwOwkvKiBjYW4ndCByZXVzZSB3aGF0IHdlIGRvbid0IGhhdmUgKi8KKwllbHNlIGlmIChvYmpfdHlwZSA9PSBPQkpfREVMVEEpCisJCXRvX3JldXNlID0gMTsJLyogY2hlY2tfb2JqZWN0KCkgZGVjaWRlZCBpdCBmb3IgdXMgKi8KKwllbHNlIGlmIChvYmpfdHlwZSAhPSBlbnRyeS0+aW5fcGFja190eXBlKQorCQl0b19yZXVzZSA9IDA7CS8qIHBhY2sgaGFzIGRlbHRhIHdoaWNoIGlzIHVudXNhYmxlICovCisJZWxzZSBpZiAoZW50cnktPmRlbHRhKQorCQl0b19yZXVzZSA9IDA7CS8qIHdlIHdhbnQgdG8gcGFjayBhZnJlc2ggKi8KKwllbHNlCisJCXRvX3JldXNlID0gMTsJLyogd2UgaGF2ZSBpdCBpbi1wYWNrIHVuZGVsdGlmaWVkLAorCQkJCSAqIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBkZWx0aWZ5IGl0LgorCQkJCSAqLworCisJaWYgKCEgdG9fcmV1c2UpIHsKKwkJYnVmID0gcmVhZF9zaGExX2ZpbGUoZW50cnktPnNoYTEsIHR5cGUsICZzaXplKTsKKwkJaWYgKCFidWYpCisJCQlkaWUoInVuYWJsZSB0byByZWFkICVzIiwgc2hhMV90b19oZXgoZW50cnktPnNoYTEpKTsKKwkJaWYgKHNpemUgIT0gZW50cnktPnNpemUpCisJCQlkaWUoIm9iamVjdCAlcyBzaXplIGluY29uc2lzdGVuY3kgKCVsdSB2cyAlbHUpIiwKKwkJCSAgICBzaGExX3RvX2hleChlbnRyeS0+c2hhMSksIHNpemUsIGVudHJ5LT5zaXplKTsKKwkJaWYgKGVudHJ5LT5kZWx0YSkgeworCQkJYnVmID0gZGVsdGFfYWdhaW5zdChidWYsIHNpemUsIGVudHJ5KTsKKwkJCXNpemUgPSBlbnRyeS0+ZGVsdGFfc2l6ZTsKKwkJCW9ial90eXBlID0gT0JKX0RFTFRBOworCQl9CisJCS8qCisJCSAqIFRoZSBvYmplY3QgaGVhZGVyIGlzIGEgYnl0ZSBvZiAndHlwZScgZm9sbG93ZWQgYnkgemVybyBvcgorCQkgKiBtb3JlIGJ5dGVzIG9mIGxlbmd0aC4gIEZvciBkZWx0YXMsIHRoZSAyMCBieXRlcyBvZiBkZWx0YQorCQkgKiBzaGExIGZvbGxvd3MgdGhhdC4KKwkJICovCisJCWhkcmxlbiA9IGVuY29kZV9oZWFkZXIob2JqX3R5cGUsIHNpemUsIGhlYWRlcik7CisJCXNoYTF3cml0ZShmLCBoZWFkZXIsIGhkcmxlbik7CisKKwkJaWYgKGVudHJ5LT5kZWx0YSkgeworCQkJc2hhMXdyaXRlKGYsIGVudHJ5LT5kZWx0YSwgMjApOworCQkJaGRybGVuICs9IDIwOworCQl9CisJCWRhdGFsZW4gPSBzaGExd3JpdGVfY29tcHJlc3NlZChmLCBidWYsIHNpemUpOworCQlmcmVlKGJ1Zik7CisJfQorCWVsc2UgeworCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGVudHJ5LT5pbl9wYWNrOworCQl1c2VfcGFja2VkX2dpdChwKTsKKworCQlkYXRhbGVuID0gZmluZF9wYWNrZWRfb2JqZWN0X3NpemUocCwgZW50cnktPmluX3BhY2tfb2Zmc2V0KTsKKwkJYnVmID0gKGNoYXIgKikgcC0+cGFja19iYXNlICsgZW50cnktPmluX3BhY2tfb2Zmc2V0OworCQlzaGExd3JpdGUoZiwgYnVmLCBkYXRhbGVuKTsKKwkJdW51c2VfcGFja2VkX2dpdChwKTsKKwkJaGRybGVuID0gMDsgLyogbm90IHJlYWxseSAqLworCQlpZiAob2JqX3R5cGUgPT0gT0JKX0RFTFRBKQorCQkJcmV1c2VkX2RlbHRhKys7CisJCXJldXNlZCsrOworCX0KKwlpZiAob2JqX3R5cGUgPT0gT0JKX0RFTFRBKQorCQl3cml0dGVuX2RlbHRhKys7CisJd3JpdHRlbisrOworCXJldHVybiBoZHJsZW4gKyBkYXRhbGVuOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9vbmUoc3RydWN0IHNoYTFmaWxlICpmLAorCQkJICAgICAgIHN0cnVjdCBvYmplY3RfZW50cnkgKmUsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJaWYgKGUtPm9mZnNldCkKKwkJLyogb2Zmc2V0IHN0YXJ0cyBmcm9tIGhlYWRlciBzaXplIGFuZCBjYW5ub3QgYmUgemVybworCQkgKiBpZiBpdCBpcyB3cml0dGVuIGFscmVhZHkuCisJCSAqLworCQlyZXR1cm4gb2Zmc2V0OworCWUtPm9mZnNldCA9IG9mZnNldDsKKwlvZmZzZXQgKz0gd3JpdGVfb2JqZWN0KGYsIGUpOworCS8qIGlmIHdlIGFyZSBkZWx0aWZpZWQsIHdyaXRlIG91dCBpdHMgYmFzZSBvYmplY3QuICovCisJaWYgKGUtPmRlbHRhKQorCQlvZmZzZXQgPSB3cml0ZV9vbmUoZiwgZS0+ZGVsdGEsIG9mZnNldCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcGFja19maWxlKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHNoYTFmaWxlICpmOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBwYWNrX2hlYWRlciBoZHI7CisJdW5zaWduZWQgbGFzdF9wZXJjZW50ID0gOTk5OworCWludCBkb19wcm9ncmVzcyA9IDA7CisKKwlpZiAoIWJhc2VfbmFtZSkKKwkJZiA9IHNoYTFmZCgxLCAiPHN0ZG91dD4iKTsKKwllbHNlIHsKKwkJZiA9IHNoYTFjcmVhdGUoIiVzLSVzLiVzIiwgYmFzZV9uYW1lLAorCQkJICAgICAgIHNoYTFfdG9faGV4KG9iamVjdF9saXN0X3NoYTEpLCAicGFjayIpOworCQlkb19wcm9ncmVzcyA9IHByb2dyZXNzOworCX0KKwlpZiAoZG9fcHJvZ3Jlc3MpCisJCWZwcmludGYoc3RkZXJyLCAiV3JpdGluZyAlZCBvYmplY3RzLlxuIiwgbnJfcmVzdWx0KTsKKworCWhkci5oZHJfc2lnbmF0dXJlID0gaHRvbmwoUEFDS19TSUdOQVRVUkUpOworCWhkci5oZHJfdmVyc2lvbiA9IGh0b25sKFBBQ0tfVkVSU0lPTik7CisJaGRyLmhkcl9lbnRyaWVzID0gaHRvbmwobnJfcmVzdWx0KTsKKwlzaGExd3JpdGUoZiwgJmhkciwgc2l6ZW9mKGhkcikpOworCW9mZnNldCA9IHNpemVvZihoZHIpOworCWlmICghbnJfcmVzdWx0KQorCQlnb3RvIGRvbmU7CisJZm9yIChpID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykgeworCQlvZmZzZXQgPSB3cml0ZV9vbmUoZiwgb2JqZWN0cyArIGksIG9mZnNldCk7CisJCWlmIChkb19wcm9ncmVzcykgeworCQkJdW5zaWduZWQgcGVyY2VudCA9IHdyaXR0ZW4gKiAxMDAgLyBucl9yZXN1bHQ7CisJCQlpZiAocHJvZ3Jlc3NfdXBkYXRlIHx8IHBlcmNlbnQgIT0gbGFzdF9wZXJjZW50KSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsCisJCQkJCXBlcmNlbnQsIHdyaXR0ZW4sIG5yX3Jlc3VsdCk7CisJCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKKwkJCQlsYXN0X3BlcmNlbnQgPSBwZXJjZW50OworCQkJfQorCQl9CisJfQorCWlmIChkb19wcm9ncmVzcykKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyBkb25lOgorCXNoYTFjbG9zZShmLCBwYWNrX2ZpbGVfc2hhMSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2luZGV4X2ZpbGUodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2hhMWZpbGUgKmYgPSBzaGExY3JlYXRlKCIlcy0lcy4lcyIsIGJhc2VfbmFtZSwKKwkJCQkJc2hhMV90b19oZXgob2JqZWN0X2xpc3Rfc2hhMSksICJpZHgiKTsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdCA9IHNvcnRlZF9ieV9zaGE7CisJc3RydWN0IG9iamVjdF9lbnRyeSAqKmxhc3QgPSBsaXN0ICsgbnJfcmVzdWx0OworCXVuc2lnbmVkIGludCBhcnJheVsyNTZdOworCisJLyoKKwkgKiBXcml0ZSB0aGUgZmlyc3QtbGV2ZWwgdGFibGUgKHRoZSBsaXN0IGlzIHNvcnRlZCwKKwkgKiBidXQgd2UgdXNlIGEgMjU2LWVudHJ5IGxvb2t1cCB0byBiZSBhYmxlIHRvIGF2b2lkCisJICogaGF2aW5nIHRvIGRvIGVpZ2h0IGV4dHJhIGJpbmFyeSBzZWFyY2ggaXRlcmF0aW9ucykuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXN0cnVjdCBvYmplY3RfZW50cnkgKipuZXh0ID0gbGlzdDsKKwkJd2hpbGUgKG5leHQgPCBsYXN0KSB7CisJCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpuZXh0OworCQkJaWYgKGVudHJ5LT5zaGExWzBdICE9IGkpCisJCQkJYnJlYWs7CisJCQluZXh0Kys7CisJCX0KKwkJYXJyYXlbaV0gPSBodG9ubChuZXh0IC0gc29ydGVkX2J5X3NoYSk7CisJCWxpc3QgPSBuZXh0OworCX0KKwlzaGExd3JpdGUoZiwgYXJyYXksIDI1NiAqIHNpemVvZihpbnQpKTsKKworCS8qCisJICogV3JpdGUgdGhlIGFjdHVhbCBTSEExIGVudHJpZXMuLgorCSAqLworCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCWZvciAoaSA9IDA7IGkgPCBucl9yZXN1bHQ7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpsaXN0Kys7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBodG9ubChlbnRyeS0+b2Zmc2V0KTsKKwkJc2hhMXdyaXRlKGYsICZvZmZzZXQsIDQpOworCQlzaGExd3JpdGUoZiwgZW50cnktPnNoYTEsIDIwKTsKKwl9CisJc2hhMXdyaXRlKGYsIHBhY2tfZmlsZV9zaGExLCAyMCk7CisJc2hhMWNsb3NlKGYsIE5VTEwsIDEpOworfQorCitzdGF0aWMgaW50IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCBpOworCXVuc2lnbmVkIGludCB1aTsKKwltZW1jcHkoJnVpLCBzaGExLCBzaXplb2YodW5zaWduZWQgaW50KSk7CisJaSA9IHVpICUgb2JqZWN0X2l4X2hhc2hzejsKKwl3aGlsZSAoMCA8IG9iamVjdF9peFtpXSkgeworCQlpZiAoIW1lbWNtcChzaGExLCBvYmplY3RzW29iamVjdF9peFtpXS0xXS5zaGExLCAyMCkpCisJCQlyZXR1cm4gaTsKKwkJaWYgKCsraSA9PSBvYmplY3RfaXhfaGFzaHN6KQorCQkJaSA9IDA7CisJfQorCXJldHVybiAtMSAtIGk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpsb2NhdGVfb2JqZWN0X2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IGk7CisKKwlpZiAoIW9iamVjdF9peF9oYXNoc3opCisJCXJldHVybiBOVUxMOworCisJaSA9IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChzaGExKTsKKwlpZiAoMCA8PSBpKQorCQlyZXR1cm4gJm9iamVjdHNbb2JqZWN0X2l4W2ldLTFdOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZWhhc2hfb2JqZWN0cyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBvYmplY3RfZW50cnkgKm9lOworCisJb2JqZWN0X2l4X2hhc2hzeiA9IG5yX29iamVjdHMgKiAzOworCWlmIChvYmplY3RfaXhfaGFzaHN6IDwgMTAyNCkKKwkJb2JqZWN0X2l4X2hhc2hzeiA9IDEwMjQ7CisJb2JqZWN0X2l4ID0geHJlYWxsb2Mob2JqZWN0X2l4LCBzaXplb2YoaW50KSAqIG9iamVjdF9peF9oYXNoc3opOworCW1lbXNldChvYmplY3RfaXgsIDAsIHNpemVvZihpbnQpICogb2JqZWN0X2l4X2hhc2hzeik7CisJZm9yIChpID0gMCwgb2UgPSBvYmplY3RzOyBpIDwgbnJfb2JqZWN0czsgaSsrLCBvZSsrKSB7CisJCWludCBpeCA9IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChvZS0+c2hhMSk7CisJCWlmICgwIDw9IGl4KQorCQkJY29udGludWU7CisJCWl4ID0gLTEgLSBpeDsKKwkJb2JqZWN0X2l4W2l4XSA9IGkgKyAxOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIG5hbWVfaGFzaChjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBoYXNoID0gMDsKKworCS8qCisJICogVGhpcyBlZmZlY3RpdmVseSBqdXN0IGNyZWF0ZXMgYSBzb3J0YWJsZSBudW1iZXIgZnJvbSB0aGUKKwkgKiBsYXN0IHNpeHRlZW4gbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycy4gTGFzdCBjaGFyYWN0ZXJzCisJICogY291bnQgIm1vc3QiLCBzbyB0aGluZ3MgdGhhdCBlbmQgaW4gIi5jIiBzb3J0IHRvZ2V0aGVyLgorCSAqLworCXdoaWxlICgoYyA9ICpuYW1lKyspICE9IDApIHsKKwkJaWYgKGlzc3BhY2UoYykpCisJCQljb250aW51ZTsKKwkJaGFzaCA9IChoYXNoID4+IDIpICsgKGMgPDwgMjQpOworCX0KKwlyZXR1cm4gaGFzaDsKK30KKworc3RhdGljIGludCBhZGRfb2JqZWN0X2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGhhc2gsIGludCBleGNsdWRlKQoreworCXVuc2lnbmVkIGludCBpZHggPSBucl9vYmplY3RzOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5OworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGludCBmb3VuZF9vZmZzZXQgPSAwOworCXN0cnVjdCBwYWNrZWRfZ2l0ICpmb3VuZF9wYWNrID0gTlVMTDsKKwlpbnQgaXgsIHN0YXR1cyA9IDA7CisKKwlpZiAoIWV4Y2x1ZGUpIHsKKwkJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisJCQlpZiAoZmluZF9wYWNrX2VudHJ5X29uZShzaGExLCAmZSwgcCkpIHsKKwkJCQlpZiAoaW5jcmVtZW50YWwpCisJCQkJCXJldHVybiAwOworCQkJCWlmIChsb2NhbCAmJiAhcC0+cGFja19sb2NhbCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJaWYgKCFmb3VuZF9wYWNrKSB7CisJCQkJCWZvdW5kX29mZnNldCA9IGUub2Zmc2V0OworCQkJCQlmb3VuZF9wYWNrID0gZS5wOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoKGVudHJ5ID0gbG9jYXRlX29iamVjdF9lbnRyeShzaGExKSkgIT0gTlVMTCkKKwkJZ290byBhbHJlYWR5X2FkZGVkOworCisJaWYgKGlkeCA+PSBucl9hbGxvYykgeworCQl1bnNpZ25lZCBpbnQgbmVlZGVkID0gKGlkeCArIDEwMjQpICogMyAvIDI7CisJCW9iamVjdHMgPSB4cmVhbGxvYyhvYmplY3RzLCBuZWVkZWQgKiBzaXplb2YoKmVudHJ5KSk7CisJCW5yX2FsbG9jID0gbmVlZGVkOworCX0KKwllbnRyeSA9IG9iamVjdHMgKyBpZHg7CisJbnJfb2JqZWN0cyA9IGlkeCArIDE7CisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisJbWVtY3B5KGVudHJ5LT5zaGExLCBzaGExLCAyMCk7CisJZW50cnktPmhhc2ggPSBoYXNoOworCisJaWYgKG9iamVjdF9peF9oYXNoc3ogKiAzIDw9IG5yX29iamVjdHMgKiA0KQorCQlyZWhhc2hfb2JqZWN0cygpOworCWVsc2UgeworCQlpeCA9IGxvY2F0ZV9vYmplY3RfZW50cnlfaGFzaChlbnRyeS0+c2hhMSk7CisJCWlmICgwIDw9IGl4KQorCQkJZGllKCJpbnRlcm5hbCBlcnJvciBpbiBvYmplY3QgaGFzaGluZy4iKTsKKwkJb2JqZWN0X2l4Wy0xIC0gaXhdID0gaWR4ICsgMTsKKwl9CisJc3RhdHVzID0gMTsKKworIGFscmVhZHlfYWRkZWQ6CisJaWYgKHByb2dyZXNzX3VwZGF0ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdW50aW5nIG9iamVjdHMuLi4lZFxyIiwgbnJfb2JqZWN0cyk7CisJCXByb2dyZXNzX3VwZGF0ZSA9IDA7CisJfQorCWlmIChleGNsdWRlKQorCQllbnRyeS0+cHJlZmVycmVkX2Jhc2UgPSAxOworCWVsc2UgeworCQlpZiAoZm91bmRfcGFjaykgeworCQkJZW50cnktPmluX3BhY2sgPSBmb3VuZF9wYWNrOworCQkJZW50cnktPmluX3BhY2tfb2Zmc2V0ID0gZm91bmRfb2Zmc2V0OworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBwYmFzZV90cmVlX2NhY2hlIHsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCByZWY7CisJaW50IHRlbXBvcmFyeTsKKwl2b2lkICp0cmVlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0cmVlX3NpemU7Cit9OworCitzdGF0aWMgc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgKihwYmFzZV90cmVlX2NhY2hlWzI1Nl0pOworc3RhdGljIGludCBwYmFzZV90cmVlX2NhY2hlX2l4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJcmV0dXJuIHNoYTFbMF0gJSBBUlJBWV9TSVpFKHBiYXNlX3RyZWVfY2FjaGUpOworfQorc3RhdGljIGludCBwYmFzZV90cmVlX2NhY2hlX2l4X2luY3IoaW50IGl4KQoreworCXJldHVybiAoaXgrMSkgJSBBUlJBWV9TSVpFKHBiYXNlX3RyZWVfY2FjaGUpOworfQorCitzdGF0aWMgc3RydWN0IHBiYXNlX3RyZWUgeworCXN0cnVjdCBwYmFzZV90cmVlICpuZXh0OworCS8qIFRoaXMgaXMgYSBwaG9ueSAiY2FjaGUiIGVudHJ5OyB3ZSBhcmUgbm90CisJICogZ29pbmcgdG8gZXZpY3QgaXQgbm9yIGZpbmQgaXQgdGhyb3VnaCBfZ2V0KCkKKwkgKiBtZWNoYW5pc20gLS0gdGhpcyBpcyBmb3IgdGhlIHRvcGxldmVsIG5vZGUgdGhhdAorCSAqIHdvdWxkIGFsbW9zdCBhbHdheXMgY2hhbmdlIHdpdGggYW55IGNvbW1pdC4KKwkgKi8KKwlzdHJ1Y3QgcGJhc2VfdHJlZV9jYWNoZSBwY2FjaGU7Cit9ICpwYmFzZV90cmVlOworCitzdGF0aWMgc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgKnBiYXNlX3RyZWVfZ2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgKmVudCwgKm5lbnQ7CisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJY2hhciB0eXBlWzIwXTsKKwlpbnQgbmVpZ2g7CisJaW50IG15X2l4ID0gcGJhc2VfdHJlZV9jYWNoZV9peChzaGExKTsKKwlpbnQgYXZhaWxhYmxlX2l4ID0gLTE7CisKKwkvKiBwYmFzZS10cmVlLWNhY2hlIGFjdHMgYXMgYSBsaW1pdGVkIGhhc2h0YWJsZS4KKwkgKiB5b3VyIG9iamVjdCB3aWxsIGJlIGZvdW5kIGF0IHlvdXIgaW5kZXggb3Igd2l0aGluIGEgZmV3CisJICogc2xvdHMgYWZ0ZXIgdGhhdCBzbG90IGlmIGl0IGlzIGNhY2hlZC4KKwkgKi8KKwlmb3IgKG5laWdoID0gMDsgbmVpZ2ggPCA4OyBuZWlnaCsrKSB7CisJCWVudCA9IHBiYXNlX3RyZWVfY2FjaGVbbXlfaXhdOworCQlpZiAoZW50ICYmICFtZW1jbXAoZW50LT5zaGExLCBzaGExLCAyMCkpIHsKKwkJCWVudC0+cmVmKys7CisJCQlyZXR1cm4gZW50OworCQl9CisJCWVsc2UgaWYgKCgoYXZhaWxhYmxlX2l4IDwgMCkgJiYgKCFlbnQgfHwgIWVudC0+cmVmKSkgfHwKKwkJCSAoKDAgPD0gYXZhaWxhYmxlX2l4KSAmJgorCQkJICAoIWVudCAmJiBwYmFzZV90cmVlX2NhY2hlW2F2YWlsYWJsZV9peF0pKSkKKwkJCWF2YWlsYWJsZV9peCA9IG15X2l4OworCQlpZiAoIWVudCkKKwkJCWJyZWFrOworCQlteV9peCA9IHBiYXNlX3RyZWVfY2FjaGVfaXhfaW5jcihteV9peCk7CisJfQorCisJLyogRGlkIG5vdCBmaW5kIG9uZS4gIEVpdGhlciB3ZSBnb3QgYSBib2d1cyByZXF1ZXN0IG9yCisJICogd2UgbmVlZCB0byByZWFkIGFuZCBwZXJoYXBzIGNhY2hlLgorCSAqLworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCAmc2l6ZSk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpIHsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogV2UgbmVlZCB0byBlaXRoZXIgY2FjaGUgb3IgcmV0dXJuIGEgdGhyb3dhd2F5IGNvcHkgKi8KKworCWlmIChhdmFpbGFibGVfaXggPCAwKQorCQllbnQgPSBOVUxMOworCWVsc2UgeworCQllbnQgPSBwYmFzZV90cmVlX2NhY2hlW2F2YWlsYWJsZV9peF07CisJCW15X2l4ID0gYXZhaWxhYmxlX2l4OworCX0KKworCWlmICghZW50KSB7CisJCW5lbnQgPSB4bWFsbG9jKHNpemVvZigqbmVudCkpOworCQluZW50LT50ZW1wb3JhcnkgPSAoYXZhaWxhYmxlX2l4IDwgMCk7CisJfQorCWVsc2UgeworCQkvKiBldmljdCBhbmQgcmV1c2UgKi8KKwkJZnJlZShlbnQtPnRyZWVfZGF0YSk7CisJCW5lbnQgPSBlbnQ7CisJfQorCW1lbWNweShuZW50LT5zaGExLCBzaGExLCAyMCk7CisJbmVudC0+dHJlZV9kYXRhID0gZGF0YTsKKwluZW50LT50cmVlX3NpemUgPSBzaXplOworCW5lbnQtPnJlZiA9IDE7CisJaWYgKCFuZW50LT50ZW1wb3JhcnkpCisJCXBiYXNlX3RyZWVfY2FjaGVbbXlfaXhdID0gbmVudDsKKwlyZXR1cm4gbmVudDsKK30KKworc3RhdGljIHZvaWQgcGJhc2VfdHJlZV9wdXQoc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgKmNhY2hlKQoreworCWlmICghY2FjaGUtPnRlbXBvcmFyeSkgeworCQljYWNoZS0+cmVmLS07CisJCXJldHVybjsKKwl9CisJZnJlZShjYWNoZS0+dHJlZV9kYXRhKTsKKwlmcmVlKGNhY2hlKTsKK30KKworc3RhdGljIGludCBuYW1lX2NtcF9sZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBuYW1lW2ldICYmIG5hbWVbaV0gIT0gJ1xuJyAmJiBuYW1lW2ldICE9ICcvJzsgaSsrKQorCQk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wYmFzZV9vYmplY3Qoc3RydWN0IHRyZWVfZGVzYyAqdHJlZSwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgaW50IGNtcGxlbiwKKwkJCSAgICAgY29uc3QgY2hhciAqZnVsbG5hbWUpCit7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwl3aGlsZSAodHJlZV9lbnRyeSh0cmVlLCZlbnRyeSkpIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCQljaGFyIHR5cGVbMjBdOworCisJCWlmIChlbnRyeS5wYXRobGVuICE9IGNtcGxlbiB8fAorCQkgICAgbWVtY21wKGVudHJ5LnBhdGgsIG5hbWUsIGNtcGxlbikgfHwKKwkJICAgICFoYXNfc2hhMV9maWxlKGVudHJ5LnNoYTEpIHx8CisJCSAgICBzaGExX29iamVjdF9pbmZvKGVudHJ5LnNoYTEsIHR5cGUsICZzaXplKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobmFtZVtjbXBsZW5dICE9ICcvJykgeworCQkJdW5zaWduZWQgaGFzaCA9IG5hbWVfaGFzaChmdWxsbmFtZSk7CisJCQlhZGRfb2JqZWN0X2VudHJ5KGVudHJ5LnNoYTEsIGhhc2gsIDEpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpIHsKKwkJCXN0cnVjdCB0cmVlX2Rlc2Mgc3ViOworCQkJc3RydWN0IHBiYXNlX3RyZWVfY2FjaGUgKnRyZWU7CisJCQljb25zdCBjaGFyICpkb3duID0gbmFtZStjbXBsZW4rMTsKKwkJCWludCBkb3dubGVuID0gbmFtZV9jbXBfbGVuKGRvd24pOworCisJCQl0cmVlID0gcGJhc2VfdHJlZV9nZXQoZW50cnkuc2hhMSk7CisJCQlpZiAoIXRyZWUpCisJCQkJcmV0dXJuOworCQkJc3ViLmJ1ZiA9IHRyZWUtPnRyZWVfZGF0YTsKKwkJCXN1Yi5zaXplID0gdHJlZS0+dHJlZV9zaXplOworCisJCQlhZGRfcGJhc2Vfb2JqZWN0KCZzdWIsIGRvd24sIGRvd25sZW4sIGZ1bGxuYW1lKTsKKwkJCXBiYXNlX3RyZWVfcHV0KHRyZWUpOworCQl9CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgKmRvbmVfcGJhc2VfcGF0aHM7CitzdGF0aWMgaW50IGRvbmVfcGJhc2VfcGF0aHNfbnVtOworc3RhdGljIGludCBkb25lX3BiYXNlX3BhdGhzX2FsbG9jOworc3RhdGljIGludCBkb25lX3BiYXNlX3BhdGhfcG9zKHVuc2lnbmVkIGhhc2gpCit7CisJaW50IGxvID0gMDsKKwlpbnQgaGkgPSBkb25lX3BiYXNlX3BhdGhzX251bTsKKwl3aGlsZSAobG8gPCBoaSkgeworCQlpbnQgbWkgPSAoaGkgKyBsbykgLyAyOworCQlpZiAoZG9uZV9wYmFzZV9wYXRoc1ttaV0gPT0gaGFzaCkKKwkJCXJldHVybiBtaTsKKwkJaWYgKGRvbmVfcGJhc2VfcGF0aHNbbWldIDwgaGFzaCkKKwkJCWhpID0gbWk7CisJCWVsc2UKKwkJCWxvID0gbWkgKyAxOworCX0KKwlyZXR1cm4gLWxvLTE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGJhc2VfcGF0aCh1bnNpZ25lZCBoYXNoKQoreworCWludCBwb3MgPSAoIWRvbmVfcGJhc2VfcGF0aHMpID8gLTEgOiBkb25lX3BiYXNlX3BhdGhfcG9zKGhhc2gpOworCWlmICgwIDw9IHBvcykKKwkJcmV0dXJuIDE7CisJcG9zID0gLXBvcyAtIDE7CisJaWYgKGRvbmVfcGJhc2VfcGF0aHNfYWxsb2MgPD0gZG9uZV9wYmFzZV9wYXRoc19udW0pIHsKKwkJZG9uZV9wYmFzZV9wYXRoc19hbGxvYyA9IGFsbG9jX25yKGRvbmVfcGJhc2VfcGF0aHNfYWxsb2MpOworCQlkb25lX3BiYXNlX3BhdGhzID0geHJlYWxsb2MoZG9uZV9wYmFzZV9wYXRocywKKwkJCQkJICAgIGRvbmVfcGJhc2VfcGF0aHNfYWxsb2MgKgorCQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkKSk7CisJfQorCWRvbmVfcGJhc2VfcGF0aHNfbnVtKys7CisJaWYgKHBvcyA8IGRvbmVfcGJhc2VfcGF0aHNfbnVtKQorCQltZW1tb3ZlKGRvbmVfcGJhc2VfcGF0aHMgKyBwb3MgKyAxLAorCQkJZG9uZV9wYmFzZV9wYXRocyArIHBvcywKKwkJCShkb25lX3BiYXNlX3BhdGhzX251bSAtIHBvcyAtIDEpICogc2l6ZW9mKHVuc2lnbmVkKSk7CisJZG9uZV9wYmFzZV9wYXRoc1twb3NdID0gaGFzaDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX3ByZWZlcnJlZF9iYXNlX29iamVjdChjaGFyICpuYW1lLCB1bnNpZ25lZCBoYXNoKQoreworCXN0cnVjdCBwYmFzZV90cmVlICppdDsKKwlpbnQgY21wbGVuID0gbmFtZV9jbXBfbGVuKG5hbWUpOworCisJaWYgKGNoZWNrX3BiYXNlX3BhdGgoaGFzaCkpCisJCXJldHVybjsKKworCWZvciAoaXQgPSBwYmFzZV90cmVlOyBpdDsgaXQgPSBpdC0+bmV4dCkgeworCQlpZiAoY21wbGVuID09IDApIHsKKwkJCWhhc2ggPSBuYW1lX2hhc2goIiIpOworCQkJYWRkX29iamVjdF9lbnRyeShpdC0+cGNhY2hlLnNoYTEsIGhhc2gsIDEpOworCQl9CisJCWVsc2UgeworCQkJc3RydWN0IHRyZWVfZGVzYyB0cmVlOworCQkJdHJlZS5idWYgPSBpdC0+cGNhY2hlLnRyZWVfZGF0YTsKKwkJCXRyZWUuc2l6ZSA9IGl0LT5wY2FjaGUudHJlZV9zaXplOworCQkJYWRkX3BiYXNlX29iamVjdCgmdHJlZSwgbmFtZSwgY21wbGVuLCBuYW1lKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYWRkX3ByZWZlcnJlZF9iYXNlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHBiYXNlX3RyZWUgKml0OworCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGNoYXIgdHJlZV9zaGExWzIwXTsKKworCWRhdGEgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZShzaGExLCB0cmVlX3R5cGUsICZzaXplLCB0cmVlX3NoYTEpOworCWlmICghZGF0YSkKKwkJcmV0dXJuOworCisJZm9yIChpdCA9IHBiYXNlX3RyZWU7IGl0OyBpdCA9IGl0LT5uZXh0KSB7CisJCWlmICghbWVtY21wKGl0LT5wY2FjaGUuc2hhMSwgdHJlZV9zaGExLCAyMCkpIHsKKwkJCWZyZWUoZGF0YSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpdCA9IHhjYWxsb2MoMSwgc2l6ZW9mKCppdCkpOworCWl0LT5uZXh0ID0gcGJhc2VfdHJlZTsKKwlwYmFzZV90cmVlID0gaXQ7CisKKwltZW1jcHkoaXQtPnBjYWNoZS5zaGExLCB0cmVlX3NoYTEsIDIwKTsKKwlpdC0+cGNhY2hlLnRyZWVfZGF0YSA9IGRhdGE7CisJaXQtPnBjYWNoZS50cmVlX3NpemUgPSBzaXplOworfQorCitzdGF0aWMgdm9pZCBjaGVja19vYmplY3Qoc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkpCit7CisJY2hhciB0eXBlWzIwXTsKKworCWlmIChlbnRyeS0+aW5fcGFjayAmJiAhZW50cnktPnByZWZlcnJlZF9iYXNlKSB7CisJCXVuc2lnbmVkIGNoYXIgYmFzZVsyMF07CisJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqYmFzZV9lbnRyeTsKKworCQkvKiBXZSB3YW50IGluX3BhY2tfdHlwZSBldmVuIGlmIHdlIGRvIG5vdCByZXVzZSBkZWx0YS4KKwkJICogVGhlcmUgaXMgbm8gcG9pbnQgbm90IHJldXNpbmcgbm9uLWRlbHRhIHJlcHJlc2VudGF0aW9ucy4KKwkJICovCisJCWNoZWNrX3JldXNlX3BhY2tfZGVsdGEoZW50cnktPmluX3BhY2ssCisJCQkJICAgICAgIGVudHJ5LT5pbl9wYWNrX29mZnNldCwKKwkJCQkgICAgICAgYmFzZSwgJnNpemUsCisJCQkJICAgICAgICZlbnRyeS0+aW5fcGFja190eXBlKTsKKworCQkvKiBDaGVjayBpZiBpdCBpcyBkZWx0YSwgYW5kIHRoZSBiYXNlIGlzIGFsc28gYW4gb2JqZWN0CisJCSAqIHdlIGFyZSBnb2luZyB0byBwYWNrLiAgSWYgc28gd2Ugd2lsbCByZXVzZSB0aGUgZXhpc3RpbmcKKwkJICogZGVsdGEuCisJCSAqLworCQlpZiAoIW5vX3JldXNlX2RlbHRhICYmCisJCSAgICBlbnRyeS0+aW5fcGFja190eXBlID09IE9CSl9ERUxUQSAmJgorCQkgICAgKGJhc2VfZW50cnkgPSBsb2NhdGVfb2JqZWN0X2VudHJ5KGJhc2UpKSAmJgorCQkgICAgKCFiYXNlX2VudHJ5LT5wcmVmZXJyZWRfYmFzZSkpIHsKKworCQkJLyogRGVwdGggdmFsdWUgZG9lcyBub3QgbWF0dGVyIC0gZmluZF9kZWx0YXMoKQorCQkJICogd2lsbCBuZXZlciBjb25zaWRlciByZXVzZWQgZGVsdGEgYXMgdGhlCisJCQkgKiBiYXNlIG9iamVjdCB0byBkZWx0aWZ5IG90aGVyIG9iamVjdHMKKwkJCSAqIGFnYWluc3QsIGluIG9yZGVyIHRvIGF2b2lkIGNpcmN1bGFyIGRlbHRhcy4KKwkJCSAqLworCisJCQkvKiB1bmNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZGVsdGEgZGF0YSAqLworCQkJZW50cnktPnNpemUgPSBlbnRyeS0+ZGVsdGFfc2l6ZSA9IHNpemU7CisJCQllbnRyeS0+ZGVsdGEgPSBiYXNlX2VudHJ5OworCQkJZW50cnktPnR5cGUgPSBPQkpfREVMVEE7CisKKwkJCWVudHJ5LT5kZWx0YV9zaWJsaW5nID0gYmFzZV9lbnRyeS0+ZGVsdGFfY2hpbGQ7CisJCQliYXNlX2VudHJ5LT5kZWx0YV9jaGlsZCA9IGVudHJ5OworCisJCQlyZXR1cm47CisJCX0KKwkJLyogT3RoZXJ3aXNlIHdlIHdvdWxkIGRvIHRoZSB1c3VhbCAqLworCX0KKworCWlmIChzaGExX29iamVjdF9pbmZvKGVudHJ5LT5zaGExLCB0eXBlLCAmZW50cnktPnNpemUpKQorCQlkaWUoInVuYWJsZSB0byBnZXQgdHlwZSBvZiBvYmplY3QgJXMiLAorCQkgICAgc2hhMV90b19oZXgoZW50cnktPnNoYTEpKTsKKworCWlmICghc3RyY21wKHR5cGUsIGNvbW1pdF90eXBlKSkgeworCQllbnRyeS0+dHlwZSA9IE9CSl9DT01NSVQ7CisJfSBlbHNlIGlmICghc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpIHsKKwkJZW50cnktPnR5cGUgPSBPQkpfVFJFRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkgeworCQllbnRyeS0+dHlwZSA9IE9CSl9CTE9COworCX0gZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0YWdfdHlwZSkpIHsKKwkJZW50cnktPnR5cGUgPSBPQkpfVEFHOworCX0gZWxzZQorCQlkaWUoInVuYWJsZSB0byBwYWNrIG9iamVjdCAlcyBvZiB0eXBlICVzIiwKKwkJICAgIHNoYTFfdG9faGV4KGVudHJ5LT5zaGExKSwgdHlwZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hlY2tfZGVsdGFfbGltaXQoc3RydWN0IG9iamVjdF9lbnRyeSAqbWUsIHVuc2lnbmVkIGludCBuKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKmNoaWxkID0gbWUtPmRlbHRhX2NoaWxkOworCXVuc2lnbmVkIGludCBtID0gbjsKKwl3aGlsZSAoY2hpbGQpIHsKKwkJdW5zaWduZWQgaW50IGMgPSBjaGVja19kZWx0YV9saW1pdChjaGlsZCwgbiArIDEpOworCQlpZiAobSA8IGMpCisJCQltID0gYzsKKwkJY2hpbGQgPSBjaGlsZC0+ZGVsdGFfc2libGluZzsKKwl9CisJcmV0dXJuIG07Cit9CisKK3N0YXRpYyB2b2lkIGdldF9vYmplY3RfZGV0YWlscyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmVudHJ5OworCisJcHJlcGFyZV9wYWNrX2l4KCk7CisJZm9yIChpID0gMCwgZW50cnkgPSBvYmplY3RzOyBpIDwgbnJfb2JqZWN0czsgaSsrLCBlbnRyeSsrKQorCQljaGVja19vYmplY3QoZW50cnkpOworCisJaWYgKG5yX29iamVjdHMgPT0gbnJfcmVzdWx0KSB7CisJCS8qCisJCSAqIERlcHRoIG9mIG9iamVjdHMgdGhhdCBkZXBlbmQgb24gdGhlIGVudHJ5IC0tIHRoaXMKKwkJICogaXMgc3VidHJhY3RlZCBmcm9tIGRlcHRoLW1heCB0byBicmVhayB0b28gZGVlcAorCQkgKiBkZWx0YSBjaGFpbiBiZWNhdXNlIG9mIGRlbHRhIGRhdGEgcmV1c2luZy4KKwkJICogSG93ZXZlciwgd2UgbG9vc2VuIHRoaXMgcmVzdHJpY3Rpb24gd2hlbiB3ZSBrbm93IHdlCisJCSAqIGFyZSBjcmVhdGluZyBhIHRoaW4gcGFjayAtLSBpdCB3aWxsIGhhdmUgdG8gYmUKKwkJICogZXhwYW5kZWQgb24gdGhlIG90aGVyIGVuZCBhbnl3YXksIHNvIGRvIG5vdAorCQkgKiBhcnRpZmljaWFsbHkgY3V0IHRoZSBkZWx0YSBjaGFpbiBhbmQgbGV0IGl0IGdvIGFzCisJCSAqIGRlZXAgYXMgaXQgd2FudHMuCisJCSAqLworCQlmb3IgKGkgPSAwLCBlbnRyeSA9IG9iamVjdHM7IGkgPCBucl9vYmplY3RzOyBpKyssIGVudHJ5KyspCisJCQlpZiAoIWVudHJ5LT5kZWx0YSAmJiBlbnRyeS0+ZGVsdGFfY2hpbGQpCisJCQkJZW50cnktPmRlbHRhX2xpbWl0ID0KKwkJCQkJY2hlY2tfZGVsdGFfbGltaXQoZW50cnksIDEpOworCX0KK30KKwordHlwZWRlZiBpbnQgKCplbnRyeV9zb3J0X3QpKGNvbnN0IHN0cnVjdCBvYmplY3RfZW50cnkgKiwgY29uc3Qgc3RydWN0IG9iamVjdF9lbnRyeSAqKTsKKworc3RhdGljIGVudHJ5X3NvcnRfdCBjdXJyZW50X3NvcnQ7CisKK3N0YXRpYyBpbnQgc29ydF9jb21wYXJhdG9yKGNvbnN0IHZvaWQgKl9hLCBjb25zdCB2b2lkICpfYikKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqKV9hOworCXN0cnVjdCBvYmplY3RfZW50cnkgKmIgPSAqKHN0cnVjdCBvYmplY3RfZW50cnkgKiopX2I7CisJcmV0dXJuIGN1cnJlbnRfc29ydChhLGIpOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqKmNyZWF0ZV9zb3J0ZWRfbGlzdChlbnRyeV9zb3J0X3Qgc29ydCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdCA9IHhtYWxsb2MobnJfb2JqZWN0cyAqIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICopKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspCisJCWxpc3RbaV0gPSBvYmplY3RzICsgaTsKKwljdXJyZW50X3NvcnQgPSBzb3J0OworCXFzb3J0KGxpc3QsIG5yX29iamVjdHMsIHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICopLCBzb3J0X2NvbXBhcmF0b3IpOworCXJldHVybiBsaXN0OworfQorCitzdGF0aWMgaW50IHNoYTFfc29ydChjb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphLCBjb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiKQoreworCXJldHVybiBtZW1jbXAoYS0+c2hhMSwgYi0+c2hhMSwgMjApOworfQorCitzdGF0aWMgc3RydWN0IG9iamVjdF9lbnRyeSAqKmNyZWF0ZV9maW5hbF9vYmplY3RfbGlzdCh2b2lkKQoreworCXN0cnVjdCBvYmplY3RfZW50cnkgKipsaXN0OworCWludCBpLCBqOworCisJZm9yIChpID0gbnJfcmVzdWx0ID0gMDsgaSA8IG5yX29iamVjdHM7IGkrKykKKwkJaWYgKCFvYmplY3RzW2ldLnByZWZlcnJlZF9iYXNlKQorCQkJbnJfcmVzdWx0Kys7CisJbGlzdCA9IHhtYWxsb2MobnJfcmVzdWx0ICogc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkgKikpOworCWZvciAoaSA9IGogPSAwOyBpIDwgbnJfb2JqZWN0czsgaSsrKSB7CisJCWlmICghb2JqZWN0c1tpXS5wcmVmZXJyZWRfYmFzZSkKKwkJCWxpc3RbaisrXSA9IG9iamVjdHMgKyBpOworCX0KKwljdXJyZW50X3NvcnQgPSBzaGExX3NvcnQ7CisJcXNvcnQobGlzdCwgbnJfcmVzdWx0LCBzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeSAqKSwgc29ydF9jb21wYXJhdG9yKTsKKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIGludCB0eXBlX3NpemVfc29ydChjb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphLCBjb25zdCBzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICpiKQoreworCWlmIChhLT50eXBlIDwgYi0+dHlwZSkKKwkJcmV0dXJuIC0xOworCWlmIChhLT50eXBlID4gYi0+dHlwZSkKKwkJcmV0dXJuIDE7CisJaWYgKGEtPmhhc2ggPCBiLT5oYXNoKQorCQlyZXR1cm4gLTE7CisJaWYgKGEtPmhhc2ggPiBiLT5oYXNoKQorCQlyZXR1cm4gMTsKKwlpZiAoYS0+cHJlZmVycmVkX2Jhc2UgPCBiLT5wcmVmZXJyZWRfYmFzZSkKKwkJcmV0dXJuIC0xOworCWlmIChhLT5wcmVmZXJyZWRfYmFzZSA+IGItPnByZWZlcnJlZF9iYXNlKQorCQlyZXR1cm4gMTsKKwlpZiAoYS0+c2l6ZSA8IGItPnNpemUpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+c2l6ZSA+IGItPnNpemUpCisJCXJldHVybiAxOworCXJldHVybiBhIDwgYiA/IC0xIDogKGEgPiBiKTsKK30KKworc3RydWN0IHVucGFja2VkIHsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeTsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBkZWx0YV9pbmRleCAqaW5kZXg7Cit9OworCisvKgorICogV2Ugc2VhcmNoIGZvciBkZWx0YXMgX2JhY2t3YXJkc18gaW4gYSBsaXN0IHNvcnRlZCBieSB0eXBlIGFuZAorICogYnkgc2l6ZSwgc28gdGhhdCB3ZSBzZWUgcHJvZ3Jlc3NpdmVseSBzbWFsbGVyIGFuZCBzbWFsbGVyIGZpbGVzLgorICogVGhhdCdzIGJlY2F1c2Ugd2UgcHJlZmVyIGRlbHRhcyB0byBiZSBmcm9tIHRoZSBiaWdnZXIgZmlsZQorICogdG8gdGhlIHNtYWxsZXIgLSBkZWxldGVzIGFyZSBwb3RlbnRpYWxseSBjaGVhcGVyLCBidXQgcGVyaGFwcworICogbW9yZSBpbXBvcnRhbnRseSwgdGhlIGJpZ2dlciBmaWxlIGlzIGxpa2VseSB0aGUgbW9yZSByZWNlbnQKKyAqIG9uZS4KKyAqLworc3RhdGljIGludCB0cnlfZGVsdGEoc3RydWN0IHVucGFja2VkICp0cmcsIHN0cnVjdCB1bnBhY2tlZCAqc3JjLAorCQkgICAgIHVuc2lnbmVkIG1heF9kZXB0aCkKK3sKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICp0cmdfZW50cnkgPSB0cmctPmVudHJ5OworCXN0cnVjdCBvYmplY3RfZW50cnkgKnNyY19lbnRyeSA9IHNyYy0+ZW50cnk7CisJdW5zaWduZWQgbG9uZyB0cmdfc2l6ZSwgc3JjX3NpemUsIGRlbHRhX3NpemUsIHNpemVkaWZmLCBtYXhfc2l6ZSwgc3o7CisJY2hhciB0eXBlWzEwXTsKKwl2b2lkICpkZWx0YV9idWY7CisKKwkvKiBEb24ndCBib3RoZXIgZG9pbmcgZGlmZnMgYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMgKi8KKwlpZiAodHJnX2VudHJ5LT50eXBlICE9IHNyY19lbnRyeS0+dHlwZSkKKwkJcmV0dXJuIC0xOworCisJLyogV2UgZG8gbm90IGNvbXB1dGUgZGVsdGEgdG8gKmNyZWF0ZSogb2JqZWN0cyB3ZSBhcmUgbm90CisJICogZ29pbmcgdG8gcGFjay4KKwkgKi8KKwlpZiAodHJnX2VudHJ5LT5wcmVmZXJyZWRfYmFzZSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBXZSBkbyBub3QgYm90aGVyIHRvIHRyeSBhIGRlbHRhIHRoYXQgd2UgZGlzY2FyZGVkCisJICogb24gYW4gZWFybGllciB0cnksIGJ1dCBvbmx5IHdoZW4gcmV1c2luZyBkZWx0YSBkYXRhLgorCSAqLworCWlmICghbm9fcmV1c2VfZGVsdGEgJiYgdHJnX2VudHJ5LT5pbl9wYWNrICYmCisJICAgIHRyZ19lbnRyeS0+aW5fcGFjayA9PSBzcmNfZW50cnktPmluX3BhY2spCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiB0aGUgY3VycmVudCBvYmplY3QgaXMgYXQgcGFjayBlZGdlLCB0YWtlIHRoZSBkZXB0aCB0aGUKKwkgKiBvYmplY3RzIHRoYXQgZGVwZW5kIG9uIHRoZSBjdXJyZW50IG9iamVjdCBpbnRvIGFjY291bnQgLS0KKwkgKiBvdGhlcndpc2UgdGhleSB3b3VsZCBiZWNvbWUgdG9vIGRlZXAuCisJICovCisJaWYgKHRyZ19lbnRyeS0+ZGVsdGFfY2hpbGQpIHsKKwkJaWYgKG1heF9kZXB0aCA8PSB0cmdfZW50cnktPmRlbHRhX2xpbWl0KQorCQkJcmV0dXJuIDA7CisJCW1heF9kZXB0aCAtPSB0cmdfZW50cnktPmRlbHRhX2xpbWl0OworCX0KKwlpZiAoc3JjX2VudHJ5LT5kZXB0aCA+PSBtYXhfZGVwdGgpCisJCXJldHVybiAwOworCisJLyogTm93IHNvbWUgc2l6ZSBmaWx0ZXJpbmcgaGV1cmlzdGljcy4gKi8KKwl0cmdfc2l6ZSA9IHRyZ19lbnRyeS0+c2l6ZTsKKwltYXhfc2l6ZSA9IHRyZ19zaXplLzIgLSAyMDsKKwltYXhfc2l6ZSA9IG1heF9zaXplICogKG1heF9kZXB0aCAtIHNyY19lbnRyeS0+ZGVwdGgpIC8gbWF4X2RlcHRoOworCWlmIChtYXhfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAodHJnX2VudHJ5LT5kZWx0YSAmJiB0cmdfZW50cnktPmRlbHRhX3NpemUgPD0gbWF4X3NpemUpCisJCW1heF9zaXplID0gdHJnX2VudHJ5LT5kZWx0YV9zaXplLTE7CisJc3JjX3NpemUgPSBzcmNfZW50cnktPnNpemU7CisJc2l6ZWRpZmYgPSBzcmNfc2l6ZSA8IHRyZ19zaXplID8gdHJnX3NpemUgLSBzcmNfc2l6ZSA6IDA7CisJaWYgKHNpemVkaWZmID49IG1heF9zaXplKQorCQlyZXR1cm4gMDsKKworCS8qIExvYWQgZGF0YSBpZiBub3QgYWxyZWFkeSBkb25lICovCisJaWYgKCF0cmctPmRhdGEpIHsKKwkJdHJnLT5kYXRhID0gcmVhZF9zaGExX2ZpbGUodHJnX2VudHJ5LT5zaGExLCB0eXBlLCAmc3opOworCQlpZiAoc3ogIT0gdHJnX3NpemUpCisJCQlkaWUoIm9iamVjdCAlcyBpbmNvbnNpc3RlbnQgb2JqZWN0IGxlbmd0aCAoJWx1IHZzICVsdSkiLAorCQkJICAgIHNoYTFfdG9faGV4KHRyZ19lbnRyeS0+c2hhMSksIHN6LCB0cmdfc2l6ZSk7CisJfQorCWlmICghc3JjLT5kYXRhKSB7CisJCXNyYy0+ZGF0YSA9IHJlYWRfc2hhMV9maWxlKHNyY19lbnRyeS0+c2hhMSwgdHlwZSwgJnN6KTsKKwkJaWYgKHN6ICE9IHNyY19zaXplKQorCQkJZGllKCJvYmplY3QgJXMgaW5jb25zaXN0ZW50IG9iamVjdCBsZW5ndGggKCVsdSB2cyAlbHUpIiwKKwkJCSAgICBzaGExX3RvX2hleChzcmNfZW50cnktPnNoYTEpLCBzeiwgc3JjX3NpemUpOworCX0KKwlpZiAoIXNyYy0+aW5kZXgpIHsKKwkJc3JjLT5pbmRleCA9IGNyZWF0ZV9kZWx0YV9pbmRleChzcmMtPmRhdGEsIHNyY19zaXplKTsKKwkJaWYgKCFzcmMtPmluZGV4KQorCQkJZGllKCJvdXQgb2YgbWVtb3J5Iik7CisJfQorCisJZGVsdGFfYnVmID0gY3JlYXRlX2RlbHRhKHNyYy0+aW5kZXgsIHRyZy0+ZGF0YSwgdHJnX3NpemUsICZkZWx0YV9zaXplLCBtYXhfc2l6ZSk7CisJaWYgKCFkZWx0YV9idWYpCisJCXJldHVybiAwOworCisJdHJnX2VudHJ5LT5kZWx0YSA9IHNyY19lbnRyeTsKKwl0cmdfZW50cnktPmRlbHRhX3NpemUgPSBkZWx0YV9zaXplOworCXRyZ19lbnRyeS0+ZGVwdGggPSBzcmNfZW50cnktPmRlcHRoICsgMTsKKwlmcmVlKGRlbHRhX2J1Zik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByb2dyZXNzX2ludGVydmFsKGludCBzaWdudW0pCit7CisJcHJvZ3Jlc3NfdXBkYXRlID0gMTsKK30KKworc3RhdGljIHZvaWQgZmluZF9kZWx0YXMoc3RydWN0IG9iamVjdF9lbnRyeSAqKmxpc3QsIGludCB3aW5kb3csIGludCBkZXB0aCkKK3sKKwlpbnQgaSwgaWR4OworCXVuc2lnbmVkIGludCBhcnJheV9zaXplID0gd2luZG93ICogc2l6ZW9mKHN0cnVjdCB1bnBhY2tlZCk7CisJc3RydWN0IHVucGFja2VkICphcnJheSA9IHhtYWxsb2MoYXJyYXlfc2l6ZSk7CisJdW5zaWduZWQgcHJvY2Vzc2VkID0gMDsKKwl1bnNpZ25lZCBsYXN0X3BlcmNlbnQgPSA5OTk7CisKKwltZW1zZXQoYXJyYXksIDAsIGFycmF5X3NpemUpOworCWkgPSBucl9vYmplY3RzOworCWlkeCA9IDA7CisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIkRlbHRpZnlpbmcgJWQgb2JqZWN0cy5cbiIsIG5yX3Jlc3VsdCk7CisKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJc3RydWN0IG9iamVjdF9lbnRyeSAqZW50cnkgPSBsaXN0W2ldOworCQlzdHJ1Y3QgdW5wYWNrZWQgKm4gPSBhcnJheSArIGlkeDsKKwkJaW50IGo7CisKKwkJaWYgKCFlbnRyeS0+cHJlZmVycmVkX2Jhc2UpCisJCQlwcm9jZXNzZWQrKzsKKworCQlpZiAocHJvZ3Jlc3MpIHsKKwkJCXVuc2lnbmVkIHBlcmNlbnQgPSBwcm9jZXNzZWQgKiAxMDAgLyBucl9yZXN1bHQ7CisJCQlpZiAocGVyY2VudCAhPSBsYXN0X3BlcmNlbnQgfHwgcHJvZ3Jlc3NfdXBkYXRlKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlNHUlJSAoJXUvJXUpIGRvbmVcciIsCisJCQkJCXBlcmNlbnQsIHByb2Nlc3NlZCwgbnJfcmVzdWx0KTsKKwkJCQlwcm9ncmVzc191cGRhdGUgPSAwOworCQkJCWxhc3RfcGVyY2VudCA9IHBlcmNlbnQ7CisJCQl9CisJCX0KKworCQlpZiAoZW50cnktPmRlbHRhKQorCQkJLyogVGhpcyBoYXBwZW5zIGlmIHdlIGRlY2lkZWQgdG8gcmV1c2UgZXhpc3RpbmcKKwkJCSAqIGRlbHRhIGZyb20gYSBwYWNrLiAgIiFub19yZXVzZV9kZWx0YSAmJiIgaXMgaW1wbGllZC4KKwkJCSAqLworCQkJY29udGludWU7CisKKwkJaWYgKGVudHJ5LT5zaXplIDwgNTApCisJCQljb250aW51ZTsKKwkJZnJlZV9kZWx0YV9pbmRleChuLT5pbmRleCk7CisJCW4tPmluZGV4ID0gTlVMTDsKKwkJZnJlZShuLT5kYXRhKTsKKwkJbi0+ZGF0YSA9IE5VTEw7CisJCW4tPmVudHJ5ID0gZW50cnk7CisKKwkJaiA9IHdpbmRvdzsKKwkJd2hpbGUgKC0taiA+IDApIHsKKwkJCXVuc2lnbmVkIGludCBvdGhlcl9pZHggPSBpZHggKyBqOworCQkJc3RydWN0IHVucGFja2VkICptOworCQkJaWYgKG90aGVyX2lkeCA+PSB3aW5kb3cpCisJCQkJb3RoZXJfaWR4IC09IHdpbmRvdzsKKwkJCW0gPSBhcnJheSArIG90aGVyX2lkeDsKKwkJCWlmICghbS0+ZW50cnkpCisJCQkJYnJlYWs7CisJCQlpZiAodHJ5X2RlbHRhKG4sIG0sIGRlcHRoKSA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJLyogaWYgd2UgbWFkZSBuIGEgZGVsdGEsIGFuZCBpZiBuIGlzIGFscmVhZHkgYXQgbWF4CisJCSAqIGRlcHRoLCBsZWF2aW5nIGl0IGluIHRoZSB3aW5kb3cgaXMgcG9pbnRsZXNzLiAgd2UKKwkJICogc2hvdWxkIGV2aWN0IGl0IGZpcnN0LgorCQkgKi8KKwkJaWYgKGVudHJ5LT5kZWx0YSAmJiBkZXB0aCA8PSBlbnRyeS0+ZGVwdGgpCisJCQljb250aW51ZTsKKworCQlpZHgrKzsKKwkJaWYgKGlkeCA+PSB3aW5kb3cpCisJCQlpZHggPSAwOworCX0KKworCWlmIChwcm9ncmVzcykKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWZvciAoaSA9IDA7IGkgPCB3aW5kb3c7ICsraSkgeworCQlmcmVlX2RlbHRhX2luZGV4KGFycmF5W2ldLmluZGV4KTsKKwkJZnJlZShhcnJheVtpXS5kYXRhKTsKKwl9CisJZnJlZShhcnJheSk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfcGFjayhpbnQgd2luZG93LCBpbnQgZGVwdGgpCit7CisJZ2V0X29iamVjdF9kZXRhaWxzKCk7CisJc29ydGVkX2J5X3R5cGUgPSBjcmVhdGVfc29ydGVkX2xpc3QodHlwZV9zaXplX3NvcnQpOworCWlmICh3aW5kb3cgJiYgZGVwdGgpCisJCWZpbmRfZGVsdGFzKHNvcnRlZF9ieV90eXBlLCB3aW5kb3crMSwgZGVwdGgpOworfQorCitzdGF0aWMgaW50IHJldXNlX2NhY2hlZF9wYWNrKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBwYWNrX3RvX3N0ZG91dCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjYWNoZVtdID0gInBhY2stY2FjaGUvcGFjay0lcy4lcyI7CisJY2hhciAqY2FjaGVkX3BhY2ssICpjYWNoZWRfaWR4OworCWludCBpZmQsIG9mZCwgaWZkX2l4ID0gLTE7CisKKwljYWNoZWRfcGFjayA9IGdpdF9wYXRoKGNhY2hlLCBzaGExX3RvX2hleChzaGExKSwgInBhY2siKTsKKwlpZmQgPSBvcGVuKGNhY2hlZF9wYWNrLCBPX1JET05MWSk7CisJaWYgKGlmZCA8IDApCisJCXJldHVybiAwOworCisJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQljYWNoZWRfaWR4ID0gZ2l0X3BhdGgoY2FjaGUsIHNoYTFfdG9faGV4KHNoYTEpLCAiaWR4Iik7CisJCWlmZF9peCA9IG9wZW4oY2FjaGVkX2lkeCwgT19SRE9OTFkpOworCQlpZiAoaWZkX2l4IDwgMCkgeworCQkJY2xvc2UoaWZkKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIlJldXNpbmcgJWQgb2JqZWN0cyBwYWNrICVzXG4iLCBucl9vYmplY3RzLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCisJaWYgKHBhY2tfdG9fc3Rkb3V0KSB7CisJCWlmIChjb3B5X2ZkKGlmZCwgMSkpCisJCQlleGl0KDEpOworCQljbG9zZShpZmQpOworCX0KKwllbHNlIHsKKwkJY2hhciBuYW1lW1BBVEhfTUFYXTsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAorCQkJICIlcy0lcy4lcyIsIGJhc2VfbmFtZSwgc2hhMV90b19oZXgoc2hhMSksICJwYWNrIik7CisJCW9mZCA9IG9wZW4obmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsKKwkJaWYgKG9mZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBvcGVuICVzICglcykiLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoY29weV9mZChpZmQsIG9mZCkpCisJCQlleGl0KDEpOworCQljbG9zZShpZmQpOworCisJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwKKwkJCSAiJXMtJXMuJXMiLCBiYXNlX25hbWUsIHNoYTFfdG9faGV4KHNoYTEpLCAiaWR4Iik7CisJCW9mZCA9IG9wZW4obmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsKKwkJaWYgKG9mZCA8IDApCisJCQlkaWUoInVuYWJsZSB0byBvcGVuICVzICglcykiLCBuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlpZiAoY29weV9mZChpZmRfaXgsIG9mZCkpCisJCQlleGl0KDEpOworCQljbG9zZShpZmRfaXgpOworCQlwdXRzKHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfcHJvZ3Jlc3Nfc2lnbmFsKHZvaWQpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwlzdHJ1Y3QgaXRpbWVydmFsIHY7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gcHJvZ3Jlc3NfaW50ZXJ2YWw7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHQUxSTSwgJnNhLCBOVUxMKTsKKworCXYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMTsKKwl2Lml0X2ludGVydmFsLnR2X3VzZWMgPSAwOworCXYuaXRfdmFsdWUgPSB2Lml0X2ludGVydmFsOworCXNldGl0aW1lcihJVElNRVJfUkVBTCwgJnYsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGdpdF9wYWNrX2NvbmZpZyhjb25zdCBjaGFyICprLCBjb25zdCBjaGFyICp2KQoreworCWlmKCFzdHJjbXAoaywgInBhY2sud2luZG93IikpIHsKKwkJd2luZG93ID0gZ2l0X2NvbmZpZ19pbnQoaywgdik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKGssIHYpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJU0hBX0NUWCBjdHg7CisJY2hhciBsaW5lWzQwICsgMSArIFBBVEhfTUFYICsgMl07CisJaW50IGRlcHRoID0gMTAsIHBhY2tfdG9fc3Rkb3V0ID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICoqbGlzdDsKKwlpbnQgbnVtX3ByZWZlcnJlZF9iYXNlID0gMDsKKwlpbnQgaTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKwlnaXRfY29uZmlnKGdpdF9wYWNrX2NvbmZpZyk7CisKKwlwcm9ncmVzcyA9IGlzYXR0eSgyKTsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcCgiLS1ub24tZW1wdHkiLCBhcmcpKSB7CisJCQkJbm9uX2VtcHR5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWxvY2FsIiwgYXJnKSkgeworCQkJCWxvY2FsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLXByb2dyZXNzIiwgYXJnKSkgeworCQkJCXByb2dyZXNzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLWluY3JlbWVudGFsIiwgYXJnKSkgeworCQkJCWluY3JlbWVudGFsID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcCgiLS13aW5kb3c9IiwgYXJnLCA5KSkgeworCQkJCWNoYXIgKmVuZDsKKwkJCQl3aW5kb3cgPSBzdHJ0b3VsKGFyZys5LCAmZW5kLCAwKTsKKwkJCQlpZiAoIWFyZ1s5XSB8fCAqZW5kKQorCQkJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcCgiLS1kZXB0aD0iLCBhcmcsIDgpKSB7CisJCQkJY2hhciAqZW5kOworCQkJCWRlcHRoID0gc3RydG91bChhcmcrOCwgJmVuZCwgMCk7CisJCQkJaWYgKCFhcmdbOF0gfHwgKmVuZCkKKwkJCQkJdXNhZ2UocGFja191c2FnZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1wcm9ncmVzcyIsIGFyZykpIHsKKwkJCQlwcm9ncmVzcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLXEiLCBhcmcpKSB7CisJCQkJcHJvZ3Jlc3MgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tbm8tcmV1c2UtZGVsdGEiLCBhcmcpKSB7CisJCQkJbm9fcmV1c2VfZGVsdGEgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoIi0tc3Rkb3V0IiwgYXJnKSkgeworCQkJCXBhY2tfdG9fc3Rkb3V0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXVzYWdlKHBhY2tfdXNhZ2UpOworCQl9CisJCWlmIChiYXNlX25hbWUpCisJCQl1c2FnZShwYWNrX3VzYWdlKTsKKwkJYmFzZV9uYW1lID0gYXJnOworCX0KKworCWlmIChwYWNrX3RvX3N0ZG91dCAhPSAhYmFzZV9uYW1lKQorCQl1c2FnZShwYWNrX3VzYWdlKTsKKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCisJaWYgKHByb2dyZXNzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiR2VuZXJhdGluZyBwYWNrLi4uXG4iKTsKKwkJc2V0dXBfcHJvZ3Jlc3Nfc2lnbmFsKCk7CisJfQorCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQl1bnNpZ25lZCBoYXNoOworCisJCWlmICghZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikpIHsKKwkJCWlmIChmZW9mKHN0ZGluKSkKKwkJCQlicmVhazsKKwkJCWlmICghZmVycm9yKHN0ZGluKSkKKwkJCQlkaWUoImZnZXRzIHJldHVybmVkIE5VTEwsIG5vdCBFT0YsIG5vdCBlcnJvciEiKTsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQlkaWUoImZnZXRzOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCQljbGVhcmVycihzdGRpbik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChsaW5lWzBdID09ICctJykgeworCQkJaWYgKGdldF9zaGExX2hleChsaW5lKzEsIHNoYTEpKQorCQkJCWRpZSgiZXhwZWN0ZWQgZWRnZSBzaGExLCBnb3QgZ2FyYmFnZTpcbiAlcyIsCisJCQkJICAgIGxpbmUrMSk7CisJCQlpZiAobnVtX3ByZWZlcnJlZF9iYXNlKysgPCB3aW5kb3cpCisJCQkJYWRkX3ByZWZlcnJlZF9iYXNlKHNoYTEpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGdldF9zaGExX2hleChsaW5lLCBzaGExKSkKKwkJCWRpZSgiZXhwZWN0ZWQgc2hhMSwgZ290IGdhcmJhZ2U6XG4gJXMiLCBsaW5lKTsKKwkJaGFzaCA9IG5hbWVfaGFzaChsaW5lKzQxKTsKKwkJYWRkX3ByZWZlcnJlZF9iYXNlX29iamVjdChsaW5lKzQxLCBoYXNoKTsKKwkJYWRkX29iamVjdF9lbnRyeShzaGExLCBoYXNoLCAwKTsKKwl9CisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIkRvbmUgY291bnRpbmcgJWQgb2JqZWN0cy5cbiIsIG5yX29iamVjdHMpOworCXNvcnRlZF9ieV9zaGEgPSBjcmVhdGVfZmluYWxfb2JqZWN0X2xpc3QoKTsKKwlpZiAobm9uX2VtcHR5ICYmICFucl9yZXN1bHQpCisJCXJldHVybiAwOworCisJU0hBMV9Jbml0KCZjdHgpOworCWxpc3QgPSBzb3J0ZWRfYnlfc2hhOworCWZvciAoaSA9IDA7IGkgPCBucl9yZXN1bHQ7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICplbnRyeSA9ICpsaXN0Kys7CisJCVNIQTFfVXBkYXRlKCZjdHgsIGVudHJ5LT5zaGExLCAyMCk7CisJfQorCVNIQTFfRmluYWwob2JqZWN0X2xpc3Rfc2hhMSwgJmN0eCk7CisJaWYgKHByb2dyZXNzICYmIChucl9vYmplY3RzICE9IG5yX3Jlc3VsdCkpCisJCWZwcmludGYoc3RkZXJyLCAiUmVzdWx0IGhhcyAlZCBvYmplY3RzLlxuIiwgbnJfcmVzdWx0KTsKKworCWlmIChyZXVzZV9jYWNoZWRfcGFjayhvYmplY3RfbGlzdF9zaGExLCBwYWNrX3RvX3N0ZG91dCkpCisJCTsKKwllbHNlIHsKKwkJaWYgKG5yX3Jlc3VsdCkKKwkJCXByZXBhcmVfcGFjayh3aW5kb3csIGRlcHRoKTsKKwkJaWYgKHByb2dyZXNzICYmIHBhY2tfdG9fc3Rkb3V0KSB7CisJCQkvKiB0aGUgb3RoZXIgZW5kIHVzdWFsbHkgZGlzcGxheXMgcHJvZ3Jlc3MgaXRzZWxmICovCisJCQlzdHJ1Y3QgaXRpbWVydmFsIHYgPSB7ezAsfSx9OworCQkJc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmdiwgTlVMTCk7CisJCQlzaWduYWwoU0lHQUxSTSwgU0lHX0lHTiApOworCQkJcHJvZ3Jlc3NfdXBkYXRlID0gMDsKKwkJfQorCQl3cml0ZV9wYWNrX2ZpbGUoKTsKKwkJaWYgKCFwYWNrX3RvX3N0ZG91dCkgeworCQkJd3JpdGVfaW5kZXhfZmlsZSgpOworCQkJcHV0cyhzaGExX3RvX2hleChvYmplY3RfbGlzdF9zaGExKSk7CisJCX0KKwl9CisJaWYgKHByb2dyZXNzKQorCQlmcHJpbnRmKHN0ZGVyciwgIlRvdGFsICVkLCB3cml0dGVuICVkIChkZWx0YSAlZCksIHJldXNlZCAlZCAoZGVsdGEgJWQpXG4iLAorCQkJbnJfcmVzdWx0LCB3cml0dGVuLCB3cml0dGVuX2RlbHRhLCByZXVzZWQsIHJldXNlZF9kZWx0YSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wYWNrLXJlZHVuZGFudC5jIGIvcGFjay1yZWR1bmRhbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWZiOTYwCi0tLSAvZGV2L251bGwKKysrIGIvcGFjay1yZWR1bmRhbnQuYwpAQCAtMCwwICsxLDY4MyBAQAorLyoKKyoKKyogQ29weXJpZ2h0IDIwMDUsIEx1a2FzIFNhbmRzdHJvbSA8bHVrYXNzQGV0ZWsuY2hhbG1lcnMuc2U+CisqCisqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLgorKgorKi8KKworI2luY2x1ZGUgImNhY2hlLmgiCisKKyNkZWZpbmUgQkxLU0laRSA1MTIKKworc3RhdGljIGNvbnN0IGNoYXIgcGFja19yZWR1bmRhbnRfdXNhZ2VbXSA9CisiZ2l0LXBhY2stcmVkdW5kYW50IFsgLS12ZXJib3NlIF0gWyAtLWFsdC1vZGIgXSA8IC0tYWxsIHwgPC5wYWNrIGZpbGVuYW1lPiAuLi4+IjsKKworc3RhdGljIGludCBsb2FkX2FsbF9wYWNrcyA9IDAsIHZlcmJvc2UgPSAwLCBhbHRfb2RiID0gMDsKKworc3RydWN0IGxsaXN0X2l0ZW0geworCXN0cnVjdCBsbGlzdF9pdGVtICpuZXh0OworCXVuc2lnbmVkIGNoYXIgKnNoYTE7Cit9Oworc3RhdGljIHN0cnVjdCBsbGlzdCB7CisJc3RydWN0IGxsaXN0X2l0ZW0gKmZyb250OworCXN0cnVjdCBsbGlzdF9pdGVtICpiYWNrOworCXNpemVfdCBzaXplOworfSAqYWxsX29iamVjdHM7IC8qIGFsbCBvYmplY3RzIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiBsb2NhbCBwYWNrZmlsZXMgKi8KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgeworCXN0cnVjdCBwYWNrX2xpc3QgKm5leHQ7CisJc3RydWN0IHBhY2tlZF9naXQgKnBhY2s7CisJc3RydWN0IGxsaXN0ICp1bmlxdWVfb2JqZWN0czsKKwlzdHJ1Y3QgbGxpc3QgKmFsbF9vYmplY3RzOworfSAqbG9jYWxfcGFja3MgPSBOVUxMLCAqYWx0b2RiX3BhY2tzID0gTlVMTDsKKworc3RydWN0IHBsbCB7CisJc3RydWN0IHBsbCAqbmV4dDsKKwlzdHJ1Y3QgcGFja19saXN0ICpwbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGxpc3RfaXRlbSAqZnJlZV9ub2RlcyA9IE5VTEw7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsbGlzdF9pdGVtX3B1dChzdHJ1Y3QgbGxpc3RfaXRlbSAqaXRlbSkKK3sKKwlpdGVtLT5uZXh0ID0gZnJlZV9ub2RlczsKKwlmcmVlX25vZGVzID0gaXRlbTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbGxpc3RfaXRlbSAqbGxpc3RfaXRlbV9nZXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV3OworCWlmICggZnJlZV9ub2RlcyApIHsKKwkJbmV3ID0gZnJlZV9ub2RlczsKKwkJZnJlZV9ub2RlcyA9IGZyZWVfbm9kZXMtPm5leHQ7CisJfSBlbHNlIHsKKwkJaW50IGkgPSAxOworCQluZXcgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgbGxpc3RfaXRlbSkgKiBCTEtTSVpFKTsKKwkJZm9yKDtpIDwgQkxLU0laRTsgaSsrKSB7CisJCQlsbGlzdF9pdGVtX3B1dCgmbmV3W2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgdm9pZCBsbGlzdF9mcmVlKHN0cnVjdCBsbGlzdCAqbGlzdCkKK3sKKwl3aGlsZSgobGlzdC0+YmFjayA9IGxpc3QtPmZyb250KSkgeworCQlsaXN0LT5mcm9udCA9IGxpc3QtPmZyb250LT5uZXh0OworCQlsbGlzdF9pdGVtX3B1dChsaXN0LT5iYWNrKTsKKwl9CisJZnJlZShsaXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxsaXN0X2luaXQoc3RydWN0IGxsaXN0ICoqbGlzdCkKK3sKKwkqbGlzdCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbGlzdCkpOworCSgqbGlzdCktPmZyb250ID0gKCpsaXN0KS0+YmFjayA9IE5VTEw7CisJKCpsaXN0KS0+c2l6ZSA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGxpc3QgKiBsbGlzdF9jb3B5KHN0cnVjdCBsbGlzdCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGxpc3QgKnJldDsKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqbmV3LCAqb2xkLCAqcHJldjsKKwkKKwlsbGlzdF9pbml0KCZyZXQpOworCisJaWYgKChyZXQtPnNpemUgPSBsaXN0LT5zaXplKSA9PSAwKQorCQlyZXR1cm4gcmV0OworCisJbmV3ID0gcmV0LT5mcm9udCA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJbmV3LT5zaGExID0gbGlzdC0+ZnJvbnQtPnNoYTE7CisKKwlvbGQgPSBsaXN0LT5mcm9udC0+bmV4dDsKKwl3aGlsZSAob2xkKSB7CisJCXByZXYgPSBuZXc7CisJCW5ldyA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJCXByZXYtPm5leHQgPSBuZXc7CisJCW5ldy0+c2hhMSA9IG9sZC0+c2hhMTsKKwkJb2xkID0gb2xkLT5uZXh0OworCX0KKwluZXctPm5leHQgPSBOVUxMOworCXJldC0+YmFjayA9IG5ldzsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICogbGxpc3RfaW5zZXJ0KHN0cnVjdCBsbGlzdCAqbGlzdCwKKwkJCQkJICAgICAgIHN0cnVjdCBsbGlzdF9pdGVtICphZnRlciwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IGxsaXN0X2l0ZW0gKm5ldyA9IGxsaXN0X2l0ZW1fZ2V0KCk7CisJbmV3LT5zaGExID0gc2hhMTsKKwluZXctPm5leHQgPSBOVUxMOworCisJaWYgKGFmdGVyICE9IE5VTEwpIHsKKwkJbmV3LT5uZXh0ID0gYWZ0ZXItPm5leHQ7CisJCWFmdGVyLT5uZXh0ID0gbmV3OworCQlpZiAoYWZ0ZXIgPT0gbGlzdC0+YmFjaykKKwkJCWxpc3QtPmJhY2sgPSBuZXc7CisJfSBlbHNlIHsvKiBpbnNlcnQgaW4gZnJvbnQgKi8KKwkJaWYgKGxpc3QtPnNpemUgPT0gMCkKKwkJCWxpc3QtPmJhY2sgPSBuZXc7CisJCWVsc2UKKwkJCW5ldy0+bmV4dCA9IGxpc3QtPmZyb250OworCQlsaXN0LT5mcm9udCA9IG5ldzsKKwl9CisJbGlzdC0+c2l6ZSsrOworCXJldHVybiBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKmxsaXN0X2luc2VydF9iYWNrKHN0cnVjdCBsbGlzdCAqbGlzdCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlyZXR1cm4gbGxpc3RfaW5zZXJ0KGxpc3QsIGxpc3QtPmJhY2ssIHNoYTEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbGlzdF9pdGVtICpsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShzdHJ1Y3QgbGxpc3QgKmxpc3QsIHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBsbGlzdF9pdGVtICpoaW50KQoreworCXN0cnVjdCBsbGlzdF9pdGVtICpwcmV2ID0gTlVMTCwgKmw7CisKKwlsID0gKGhpbnQgPT0gTlVMTCkgPyBsaXN0LT5mcm9udCA6IGhpbnQ7CisJd2hpbGUgKGwpIHsKKwkJaW50IGNtcCA9IG1lbWNtcChsLT5zaGExLCBzaGExLCAyMCk7CisJCWlmIChjbXAgPiAwKSB7IC8qIHdlIGluc2VydCBiZWZvcmUgdGhpcyBlbnRyeSAqLworCQkJcmV0dXJuIGxsaXN0X2luc2VydChsaXN0LCBwcmV2LCBzaGExKTsKKwkJfQorCQlpZighY21wKSB7IC8qIGFscmVhZHkgZXhpc3RzICovCisJCQlyZXR1cm4gbDsKKwkJfQorCQlwcmV2ID0gbDsKKwkJbCA9IGwtPm5leHQ7CisJfQorCS8qIGluc2VydCBhdCB0aGUgZW5kICovCisJcmV0dXJuIGxsaXN0X2luc2VydF9iYWNrKGxpc3QsIHNoYTEpOworfQorCisvKiByZXR1cm5zIGEgcG9pbnRlciB0byBhbiBpdGVtIGluIGZyb250IG9mIHNoYTEgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsaXN0X2l0ZW0gKiBsbGlzdF9zb3J0ZWRfcmVtb3ZlKHN0cnVjdCBsbGlzdCAqbGlzdCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IGxsaXN0X2l0ZW0gKmhpbnQpCit7CisJc3RydWN0IGxsaXN0X2l0ZW0gKnByZXYsICpsOworCityZWRvX2Zyb21fc3RhcnQ6CisJbCA9IChoaW50ID09IE5VTEwpID8gbGlzdC0+ZnJvbnQgOiBoaW50OworCXByZXYgPSBOVUxMOworCXdoaWxlIChsKSB7CisJCWludCBjbXAgPSBtZW1jbXAobC0+c2hhMSwgc2hhMSwgMjApOworCQlpZiAoY21wID4gMCkgLyogbm90IGluIGxpc3QsIHNpbmNlIHNvcnRlZCAqLworCQkJcmV0dXJuIHByZXY7CisJCWlmKCFjbXApIHsgLyogZm91bmQgKi8KKwkJCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJCQlpZiAoaGludCAhPSBOVUxMICYmIGhpbnQgIT0gbGlzdC0+ZnJvbnQpIHsKKwkJCQkJLyogd2UgZG9uJ3Qga25vdyB0aGUgcHJldmlvdXMgZWxlbWVudCAqLworCQkJCQloaW50ID0gTlVMTDsKKwkJCQkJZ290byByZWRvX2Zyb21fc3RhcnQ7CisJCQkJfQorCQkJCWxpc3QtPmZyb250ID0gbC0+bmV4dDsKKwkJCX0gZWxzZQorCQkJCXByZXYtPm5leHQgPSBsLT5uZXh0OworCQkJaWYgKGwgPT0gbGlzdC0+YmFjaykKKwkJCQlsaXN0LT5iYWNrID0gcHJldjsKKwkJCWxsaXN0X2l0ZW1fcHV0KGwpOworCQkJbGlzdC0+c2l6ZS0tOworCQkJcmV0dXJuIHByZXY7CisJCX0KKwkJcHJldiA9IGw7CisJCWwgPSBsLT5uZXh0OworCX0KKwlyZXR1cm4gcHJldjsKK30KKworLyogY29tcHV0ZXMgQVxCICovCitzdGF0aWMgdm9pZCBsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKHN0cnVjdCBsbGlzdCAqQSwKKwkJCQkgICAgIHN0cnVjdCBsbGlzdCAqQikKK3sKKwlzdHJ1Y3QgbGxpc3RfaXRlbSAqaGludCwgKmI7CisKKwloaW50ID0gTlVMTDsKKwliID0gQi0+ZnJvbnQ7CisKKwl3aGlsZSAoYikgeworCQloaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShBLCBiLT5zaGExLCBoaW50KTsKKwkJYiA9IGItPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfaW5zZXJ0KHN0cnVjdCBwYWNrX2xpc3QgKipwbCwKKwkJCQkJICAgc3RydWN0IHBhY2tfbGlzdCAqZW50cnkpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWNrX2xpc3QpKTsKKwltZW1jcHkocCwgZW50cnksIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcC0+bmV4dCA9ICpwbDsKKwkqcGwgPSBwOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHNpemVfdCBwYWNrX2xpc3Rfc2l6ZShzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwl3aGlsZShwbCkgeworCQlyZXQrKzsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwYWNrX2xpc3QgKiBwYWNrX2xpc3RfZGlmZmVyZW5jZShjb25zdCBzdHJ1Y3QgcGFja19saXN0ICpBLAorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqQikKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpyZXQ7CisJY29uc3Qgc3RydWN0IHBhY2tfbGlzdCAqcGw7CisKKwlpZiAoQSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBsID0gQjsKKwl3aGlsZSAocGwgIT0gTlVMTCkgeworCQlpZiAoQS0+cGFjayA9PSBwbC0+cGFjaykKKwkJCXJldHVybiBwYWNrX2xpc3RfZGlmZmVyZW5jZShBLT5uZXh0LCBCKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IHBhY2tfbGlzdCkpOworCW1lbWNweShyZXQsIEEsIHNpemVvZihzdHJ1Y3QgcGFja19saXN0KSk7CisJcmV0LT5uZXh0ID0gcGFja19saXN0X2RpZmZlcmVuY2UoQS0+bmV4dCwgQik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY21wX3R3b19wYWNrcyhzdHJ1Y3QgcGFja19saXN0ICpwMSwgc3RydWN0IHBhY2tfbGlzdCAqcDIpCit7CisJaW50IHAxX29mZiwgcDJfb2ZmOworCXVuc2lnbmVkIGNoYXIgKnAxX2Jhc2UsICpwMl9iYXNlOworCXN0cnVjdCBsbGlzdF9pdGVtICpwMV9oaW50ID0gTlVMTCwgKnAyX2hpbnQgPSBOVUxMOworCisJcDFfb2ZmID0gcDJfb2ZmID0gMjU2ICogNCArIDQ7CisJcDFfYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopIHAxLT5wYWNrLT5pbmRleF9iYXNlOworCXAyX2Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSBwMi0+cGFjay0+aW5kZXhfYmFzZTsKKworCXdoaWxlIChwMV9vZmYgPD0gcDEtPnBhY2stPmluZGV4X3NpemUgLSAzICogMjAgJiYKKwkgICAgICAgcDJfb2ZmIDw9IHAyLT5wYWNrLT5pbmRleF9zaXplIC0gMyAqIDIwKQorCXsKKwkJaW50IGNtcCA9IG1lbWNtcChwMV9iYXNlICsgcDFfb2ZmLCBwMl9iYXNlICsgcDJfb2ZmLCAyMCk7CisJCS8qIGNtcCB+IHAxIC0gcDIgKi8KKwkJaWYgKGNtcCA9PSAwKSB7CisJCQlwMV9oaW50ID0gbGxpc3Rfc29ydGVkX3JlbW92ZShwMS0+dW5pcXVlX29iamVjdHMsCisJCQkJCXAxX2Jhc2UgKyBwMV9vZmYsIHAxX2hpbnQpOworCQkJcDJfaGludCA9IGxsaXN0X3NvcnRlZF9yZW1vdmUocDItPnVuaXF1ZV9vYmplY3RzLAorCQkJCQlwMV9iYXNlICsgcDFfb2ZmLCBwMl9oaW50KTsKKwkJCXAxX29mZis9MjQ7CisJCQlwMl9vZmYrPTI0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNtcCA8IDApIHsgLyogcDEgaGFzIHRoZSBvYmplY3QsIHAyIGRvZXNuJ3QgKi8KKwkJCXAxX29mZis9MjQ7CisJCX0gZWxzZSB7IC8qIHAyIGhhcyB0aGUgb2JqZWN0LCBwMSBkb2Vzbid0ICovCisJCQlwMl9vZmYrPTI0OworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBwbGxfZnJlZShzdHJ1Y3QgcGxsICpsKQoreworCXN0cnVjdCBwbGwgKm9sZDsKKwlzdHJ1Y3QgcGFja19saXN0ICpvcGw7CisKKwl3aGlsZSAobCkgeworCQlvbGQgPSBsOworCQl3aGlsZSAobC0+cGwpIHsKKwkJCW9wbCA9IGwtPnBsOworCQkJbC0+cGwgPSBvcGwtPm5leHQ7CisJCQlmcmVlKG9wbCk7CisJCX0KKwkJbCA9IGwtPm5leHQ7CisJCWZyZWUob2xkKTsKKwl9Cit9CisKKy8qIGFsbCB0aGUgcGVybXV0YXRpb25zIGhhdmUgdG8gYmUgZnJlZSgpZCBhdCB0aGUgc2FtZSB0aW1lLAorICogc2luY2UgdGhleSByZWZlciB0byBlYWNoIG90aGVyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxsICogZ2V0X3Blcm11dGF0aW9ucyhzdHJ1Y3QgcGFja19saXN0ICpsaXN0LCBpbnQgbikKK3sKKwlzdHJ1Y3QgcGxsICpzdWJzZXQsICpyZXQgPSBOVUxMLCAqbmV3X3BsbCA9IE5VTEwsICpwbGw7CisKKwlpZiAobGlzdCA9PSBOVUxMIHx8IHBhY2tfbGlzdF9zaXplKGxpc3QpIDwgbiB8fCBuID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKG4gPT0gMSkgeworCQl3aGlsZSAobGlzdCkgeworCQkJbmV3X3BsbCA9IHhtYWxsb2Moc2l6ZW9mKHBsbCkpOworCQkJbmV3X3BsbC0+cGwgPSBOVUxMOworCQkJcGFja19saXN0X2luc2VydCgmbmV3X3BsbC0+cGwsIGxpc3QpOworCQkJbmV3X3BsbC0+bmV4dCA9IHJldDsKKwkJCXJldCA9IG5ld19wbGw7CisJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCXdoaWxlIChsaXN0LT5uZXh0KSB7CisJCXN1YnNldCA9IGdldF9wZXJtdXRhdGlvbnMobGlzdC0+bmV4dCwgbiAtIDEpOworCQl3aGlsZSAoc3Vic2V0KSB7CisJCQluZXdfcGxsID0geG1hbGxvYyhzaXplb2YocGxsKSk7CisJCQluZXdfcGxsLT5wbCA9IHN1YnNldC0+cGw7CisJCQlwYWNrX2xpc3RfaW5zZXJ0KCZuZXdfcGxsLT5wbCwgbGlzdCk7CisJCQluZXdfcGxsLT5uZXh0ID0gcmV0OworCQkJcmV0ID0gbmV3X3BsbDsKKwkJCXN1YnNldCA9IHN1YnNldC0+bmV4dDsKKwkJfQorCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc19zdXBlcnNldChzdHJ1Y3QgcGFja19saXN0ICpwbCwgc3RydWN0IGxsaXN0ICpsaXN0KQoreworCXN0cnVjdCBsbGlzdCAqZGlmZjsKKworCWRpZmYgPSBsbGlzdF9jb3B5KGxpc3QpOworCisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UoZGlmZiwgcGwtPmFsbF9vYmplY3RzKTsKKwkJaWYgKGRpZmYtPnNpemUgPT0gMCkgeyAvKiB3ZSdyZSBkb25lICovCisJCQlsbGlzdF9mcmVlKGRpZmYpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJbGxpc3RfZnJlZShkaWZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBzaXplb2ZfdW5pb24oc3RydWN0IHBhY2tlZF9naXQgKnAxLCBzdHJ1Y3QgcGFja2VkX2dpdCAqcDIpCit7CisJc2l6ZV90IHJldCA9IDA7CisJaW50IHAxX29mZiwgcDJfb2ZmOworCWNoYXIgKnAxX2Jhc2UsICpwMl9iYXNlOworCisJcDFfb2ZmID0gcDJfb2ZmID0gMjU2ICogNCArIDQ7CisJcDFfYmFzZSA9IChjaGFyICopcDEtPmluZGV4X2Jhc2U7CisJcDJfYmFzZSA9IChjaGFyICopcDItPmluZGV4X2Jhc2U7CisKKwl3aGlsZSAocDFfb2ZmIDw9IHAxLT5pbmRleF9zaXplIC0gMyAqIDIwICYmCisJICAgICAgIHAyX29mZiA8PSBwMi0+aW5kZXhfc2l6ZSAtIDMgKiAyMCkKKwl7CisJCWludCBjbXAgPSBtZW1jbXAocDFfYmFzZSArIHAxX29mZiwgcDJfYmFzZSArIHAyX29mZiwgMjApOworCQkvKiBjbXAgfiBwMSAtIHAyICovCisJCWlmIChjbXAgPT0gMCkgeworCQkJcmV0Kys7CisJCQlwMV9vZmYrPTI0OworCQkJcDJfb2ZmKz0yNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjbXAgPCAwKSB7IC8qIHAxIGhhcyB0aGUgb2JqZWN0LCBwMiBkb2Vzbid0ICovCisJCQlwMV9vZmYrPTI0OworCQl9IGVsc2UgeyAvKiBwMiBoYXMgdGhlIG9iamVjdCwgcDEgZG9lc24ndCAqLworCQkJcDJfb2ZmKz0yNDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBhbm90aGVyIE8obl4yKSBmdW5jdGlvbiAuLi4gKi8KK3N0YXRpYyBzaXplX3QgZ2V0X3BhY2tfcmVkdW5kYW5jeShzdHJ1Y3QgcGFja19saXN0ICpwbCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpzdWJzZXQ7CisJc2l6ZV90IHJldCA9IDA7CisKKwlpZiAocGwgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHN1YnNldCA9IHBsLT5uZXh0KSkgeworCQl3aGlsZShzdWJzZXQpIHsKKwkJCXJldCArPSBzaXplb2ZfdW5pb24ocGwtPnBhY2ssIHN1YnNldC0+cGFjayk7CisJCQlzdWJzZXQgPSBzdWJzZXQtPm5leHQ7CisJCX0KKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgcGFja19zZXRfYnl0ZWNvdW50KHN0cnVjdCBwYWNrX2xpc3QgKnBsKQoreworCXNpemVfdCByZXQgPSAwOworCXdoaWxlIChwbCkgeworCQlyZXQgKz0gcGwtPnBhY2stPnBhY2tfc2l6ZTsKKwkJcmV0ICs9IHBsLT5wYWNrLT5pbmRleF9zaXplOworCQlwbCA9IHBsLT5uZXh0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtaW5pbWl6ZShzdHJ1Y3QgcGFja19saXN0ICoqbWluKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKnBsLCAqdW5pcXVlID0gTlVMTCwKKwkJKm5vbl91bmlxdWUgPSBOVUxMLCAqbWluX3Blcm0gPSBOVUxMOworCXN0cnVjdCBwbGwgKnBlcm0sICpwZXJtX2FsbCwgKnBlcm1fb2sgPSBOVUxMLCAqbmV3X3Blcm07CisJc3RydWN0IGxsaXN0ICptaXNzaW5nOworCXNpemVfdCBtaW5fcGVybV9zaXplID0gKHNpemVfdCktMSwgcGVybV9zaXplOworCWludCBuOworCisJcGwgPSBsb2NhbF9wYWNrczsKKwl3aGlsZSAocGwpIHsKKwkJaWYocGwtPnVuaXF1ZV9vYmplY3RzLT5zaXplKQorCQkJcGFja19saXN0X2luc2VydCgmdW5pcXVlLCBwbCk7CisJCWVsc2UKKwkJCXBhY2tfbGlzdF9pbnNlcnQoJm5vbl91bmlxdWUsIHBsKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJLyogZmluZCBvdXQgd2hpY2ggb2JqZWN0cyBhcmUgbWlzc2luZyBmcm9tIHRoZSBzZXQgb2YgdW5pcXVlIHBhY2tzICovCisJbWlzc2luZyA9IGxsaXN0X2NvcHkoYWxsX29iamVjdHMpOworCXBsID0gdW5pcXVlOworCXdoaWxlIChwbCkgeworCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKG1pc3NpbmcsIHBsLT5hbGxfb2JqZWN0cyk7CisJCXBsID0gcGwtPm5leHQ7CisJfQorCisJLyogcmV0dXJuIGlmIHRoZXJlIGFyZSBubyBvYmplY3RzIG1pc3NpbmcgZnJvbSB0aGUgdW5pcXVlIHNldCAqLworCWlmIChtaXNzaW5nLT5zaXplID09IDApIHsKKwkJKm1pbiA9IHVuaXF1ZTsKKwkJcmV0dXJuOworCX0KKworCS8qIGZpbmQgdGhlIHBlcm11dGF0aW9ucyB3aGljaCBjb250YWluIGFsbCBtaXNzaW5nIG9iamVjdHMgKi8KKwlmb3IgKG4gPSAxOyBuIDw9IHBhY2tfbGlzdF9zaXplKG5vbl91bmlxdWUpICYmICFwZXJtX29rOyBuKyspIHsKKwkJcGVybV9hbGwgPSBwZXJtID0gZ2V0X3Blcm11dGF0aW9ucyhub25fdW5pcXVlLCBuKTsKKwkJd2hpbGUgKHBlcm0pIHsKKwkJCWlmIChpc19zdXBlcnNldChwZXJtLT5wbCwgbWlzc2luZykpIHsKKwkJCQluZXdfcGVybSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbGwpKTsKKwkJCQltZW1jcHkobmV3X3Blcm0sIHBlcm0sIHNpemVvZihzdHJ1Y3QgcGxsKSk7CisJCQkJbmV3X3Blcm0tPm5leHQgPSBwZXJtX29rOworCQkJCXBlcm1fb2sgPSBuZXdfcGVybTsKKwkJCX0KKwkJCXBlcm0gPSBwZXJtLT5uZXh0OworCQl9CisJCWlmIChwZXJtX29rKQorCQkJYnJlYWs7CisJCXBsbF9mcmVlKHBlcm1fYWxsKTsKKwl9CisJaWYgKHBlcm1fb2sgPT0gTlVMTCkKKwkJZGllKCJJbnRlcm5hbCBlcnJvcjogTm8gY29tcGxldGUgc2V0cyBmb3VuZCFcbiIpOworCisJLyogZmluZCB0aGUgcGVybXV0YXRpb24gd2l0aCB0aGUgc21hbGxlc3Qgc2l6ZSAqLworCXBlcm0gPSBwZXJtX29rOworCXdoaWxlIChwZXJtKSB7CisJCXBlcm1fc2l6ZSA9IHBhY2tfc2V0X2J5dGVjb3VudChwZXJtLT5wbCk7CisJCWlmIChtaW5fcGVybV9zaXplID4gcGVybV9zaXplKSB7CisJCQltaW5fcGVybV9zaXplID0gcGVybV9zaXplOworCQkJbWluX3Blcm0gPSBwZXJtLT5wbDsKKwkJfQorCQlwZXJtID0gcGVybS0+bmV4dDsKKwl9CisJKm1pbiA9IG1pbl9wZXJtOworCS8qIGFkZCB0aGUgdW5pcXVlIHBhY2tzIHRvIHRoZSBsaXN0ICovCisJcGwgPSB1bmlxdWU7CisJd2hpbGUocGwpIHsKKwkJcGFja19saXN0X2luc2VydChtaW4sIHBsKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYWxsX29iamVjdHModm9pZCkKK3sKKwlzdHJ1Y3QgcGFja19saXN0ICpwbCA9IGxvY2FsX3BhY2tzOworCXN0cnVjdCBsbGlzdF9pdGVtICpoaW50LCAqbDsKKworCWxsaXN0X2luaXQoJmFsbF9vYmplY3RzKTsKKworCXdoaWxlIChwbCkgeworCQloaW50ID0gTlVMTDsKKwkJbCA9IHBsLT5hbGxfb2JqZWN0cy0+ZnJvbnQ7CisJCXdoaWxlIChsKSB7CisJCQloaW50ID0gbGxpc3RfaW5zZXJ0X3NvcnRlZF91bmlxdWUoYWxsX29iamVjdHMsCisJCQkJCQkJICBsLT5zaGExLCBoaW50KTsKKwkJCWwgPSBsLT5uZXh0OworCQl9CisJCXBsID0gcGwtPm5leHQ7CisJfQorCS8qIHJlbW92ZSBvYmplY3RzIHByZXNlbnQgaW4gcmVtb3RlIHBhY2tzICovCisJcGwgPSBhbHRvZGJfcGFja3M7CisJd2hpbGUgKHBsKSB7CisJCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UoYWxsX29iamVjdHMsIHBsLT5hbGxfb2JqZWN0cyk7CisJCXBsID0gcGwtPm5leHQ7CisJfQorfQorCisvKiB0aGlzIHNjYWxlcyBsaWtlIE8obl4yKSAqLworc3RhdGljIHZvaWQgY21wX2xvY2FsX3BhY2tzKHZvaWQpCit7CisJc3RydWN0IHBhY2tfbGlzdCAqc3Vic2V0LCAqcGwgPSBsb2NhbF9wYWNrczsKKworCXdoaWxlICgoc3Vic2V0ID0gcGwpKSB7CisJCXdoaWxlKChzdWJzZXQgPSBzdWJzZXQtPm5leHQpKQorCQkJY21wX3R3b19wYWNrcyhwbCwgc3Vic2V0KTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjYW5fYWx0X29kYl9wYWNrcyh2b2lkKQoreworCXN0cnVjdCBwYWNrX2xpc3QgKmxvY2FsLCAqYWx0OworCisJYWx0ID0gYWx0b2RiX3BhY2tzOworCXdoaWxlIChhbHQpIHsKKwkJbG9jYWwgPSBsb2NhbF9wYWNrczsKKwkJd2hpbGUgKGxvY2FsKSB7CisJCQlsbGlzdF9zb3J0ZWRfZGlmZmVyZW5jZV9pbnBsYWNlKGxvY2FsLT51bmlxdWVfb2JqZWN0cywKKwkJCQkJCQlhbHQtPmFsbF9vYmplY3RzKTsKKwkJCWxvY2FsID0gbG9jYWwtPm5leHQ7CisJCX0KKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShhbGxfb2JqZWN0cywgYWx0LT5hbGxfb2JqZWN0cyk7CisJCWFsdCA9IGFsdC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFja19saXN0ICogYWRkX3BhY2soc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJc3RydWN0IHBhY2tfbGlzdCBsOworCXNpemVfdCBvZmY7CisJdW5zaWduZWQgY2hhciAqYmFzZTsKKworCWlmICghcC0+cGFja19sb2NhbCAmJiAhKGFsdF9vZGIgfHwgdmVyYm9zZSkpCisJCXJldHVybiBOVUxMOworCisJbC5wYWNrID0gcDsKKwlsbGlzdF9pbml0KCZsLmFsbF9vYmplY3RzKTsKKworCW9mZiA9IDI1NiAqIDQgKyA0OworCWJhc2UgPSAodW5zaWduZWQgY2hhciAqKXAtPmluZGV4X2Jhc2U7CisJd2hpbGUgKG9mZiA8PSBwLT5pbmRleF9zaXplIC0gMyAqIDIwKSB7CisJCWxsaXN0X2luc2VydF9iYWNrKGwuYWxsX29iamVjdHMsIGJhc2UgKyBvZmYpOworCQlvZmYgKz0gMjQ7CisJfQorCS8qIHRoaXMgbGlzdCB3aWxsIGJlIHBydW5lZCBpbiBjbXBfdHdvX3BhY2tzIGxhdGVyICovCisJbC51bmlxdWVfb2JqZWN0cyA9IGxsaXN0X2NvcHkobC5hbGxfb2JqZWN0cyk7CisJaWYgKHAtPnBhY2tfbG9jYWwpCisJCXJldHVybiBwYWNrX2xpc3RfaW5zZXJ0KCZsb2NhbF9wYWNrcywgJmwpOworCWVsc2UKKwkJcmV0dXJuIHBhY2tfbGlzdF9pbnNlcnQoJmFsdG9kYl9wYWNrcywgJmwpOworfQorCitzdGF0aWMgc3RydWN0IHBhY2tfbGlzdCAqIGFkZF9wYWNrX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBwYWNrZWRfZ2l0OworCisJaWYgKHN0cmxlbihmaWxlbmFtZSkgPCA0MCkKKwkJZGllKCJCYWQgcGFjayBmaWxlbmFtZTogJXNcbiIsIGZpbGVuYW1lKTsKKworCXdoaWxlIChwKSB7CisJCWlmIChzdHJzdHIocC0+cGFja19uYW1lLCBmaWxlbmFtZSkpCisJCQlyZXR1cm4gYWRkX3BhY2socCk7CisJCXAgPSBwLT5uZXh0OworCX0KKwlkaWUoIkZpbGVuYW1lICVzIG5vdCBmb3VuZCBpbiBwYWNrZWRfZ2l0XG4iLCBmaWxlbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfYWxsKHZvaWQpCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBwYWNrZWRfZ2l0OworCisJd2hpbGUgKHApIHsKKwkJYWRkX3BhY2socCk7CisJCXAgPSBwLT5uZXh0OworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCXN0cnVjdCBwYWNrX2xpc3QgKm1pbiwgKnJlZCwgKnBsOworCXN0cnVjdCBsbGlzdCAqaWdub3JlOworCXVuc2lnbmVkIGNoYXIgKnNoYTE7CisJY2hhciBidWZbNDJdOyAvKiA0MCBieXRlIHNoYTEgKyBcbiArIFwwICovCisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCWlmKCFzdHJjbXAoYXJnLCAiLS0iKSkgeworCQkJaSsrOworCQkJYnJlYWs7CisJCX0KKwkJaWYoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQlsb2FkX2FsbF9wYWNrcyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZighc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQl2ZXJib3NlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmKCFzdHJjbXAoYXJnLCAiLS1hbHQtb2RiIikpIHsKKwkJCWFsdF9vZGIgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYoKmFyZyA9PSAnLScpCisJCQl1c2FnZShwYWNrX3JlZHVuZGFudF91c2FnZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCisJaWYgKGxvYWRfYWxsX3BhY2tzKQorCQlsb2FkX2FsbCgpOworCWVsc2UKKwkJd2hpbGUgKCooYXJndiArIGkpICE9IE5VTEwpCisJCQlhZGRfcGFja19maWxlKCooYXJndiArIGkrKykpOworCisJaWYgKGxvY2FsX3BhY2tzID09IE5VTEwpCisJCWRpZSgiWmVybyBwYWNrcyBmb3VuZCFcbiIpOworCisJbG9hZF9hbGxfb2JqZWN0cygpOworCisJY21wX2xvY2FsX3BhY2tzKCk7CisJaWYgKGFsdF9vZGIpCisJCXNjYW5fYWx0X29kYl9wYWNrcygpOworCisJLyogaWdub3JlIG9iamVjdHMgZ2l2ZW4gb24gc3RkaW4gKi8KKwlsbGlzdF9pbml0KCZpZ25vcmUpOworCWlmICghaXNhdHR5KDApKSB7CisJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBzdGRpbikpIHsKKwkJCXNoYTEgPSB4bWFsbG9jKDIwKTsKKwkJCWlmIChnZXRfc2hhMV9oZXgoYnVmLCBzaGExKSkKKwkJCQlkaWUoIkJhZCBzaGExIG9uIHN0ZGluOiAlcyIsIGJ1Zik7CisJCQlsbGlzdF9pbnNlcnRfc29ydGVkX3VuaXF1ZShpZ25vcmUsIHNoYTEsIE5VTEwpOworCQl9CisJfQorCWxsaXN0X3NvcnRlZF9kaWZmZXJlbmNlX2lucGxhY2UoYWxsX29iamVjdHMsIGlnbm9yZSk7CisJcGwgPSBsb2NhbF9wYWNrczsKKwl3aGlsZSAocGwpIHsKKwkJbGxpc3Rfc29ydGVkX2RpZmZlcmVuY2VfaW5wbGFjZShwbC0+dW5pcXVlX29iamVjdHMsIGlnbm9yZSk7CisJCXBsID0gcGwtPm5leHQ7CisJfQorCisJbWluaW1pemUoJm1pbik7CisKKwlpZiAodmVyYm9zZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSAlbHUgcGFja3MgYXZhaWxhYmxlIGluIGFsdC1vZGJzLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXBhY2tfbGlzdF9zaXplKGFsdG9kYl9wYWNrcykpOworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBzbWFsbGVzdCAoYnl0ZXdpc2UpIHNldCBvZiBwYWNrcyBpczpcbiIpOworCQlwbCA9IG1pbjsKKwkJd2hpbGUgKHBsKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlx0JXNcbiIsIHBsLT5wYWNrLT5wYWNrX25hbWUpOworCQkJcGwgPSBwbC0+bmV4dDsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgImNvbnRhaW5pbmcgJWx1IGR1cGxpY2F0ZSBvYmplY3RzICIKKwkJCQkid2l0aCBhIHRvdGFsIHNpemUgb2YgJWx1a2IuXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpZ2V0X3BhY2tfcmVkdW5kYW5jeShtaW4pLAorCQkJKHVuc2lnbmVkIGxvbmcpcGFja19zZXRfYnl0ZWNvdW50KG1pbikvMTAyNCk7CisJCWZwcmludGYoc3RkZXJyLCAiQSB0b3RhbCBvZiAlbHUgdW5pcXVlIG9iamVjdHMgd2VyZSBjb25zaWRlcmVkLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWFsbF9vYmplY3RzLT5zaXplKTsKKwkJZnByaW50ZihzdGRlcnIsICJSZWR1bmRhbnQgcGFja3MgKHdpdGggaW5kZXhlcyk6XG4iKTsKKwl9CisJcGwgPSByZWQgPSBwYWNrX2xpc3RfZGlmZmVyZW5jZShsb2NhbF9wYWNrcywgbWluKTsKKwl3aGlsZSAocGwpIHsKKwkJcHJpbnRmKCIlc1xuJXNcbiIsCisJCSAgICAgICBzaGExX3BhY2tfaW5kZXhfbmFtZShwbC0+cGFjay0+c2hhMSksCisJCSAgICAgICBwbC0+cGFjay0+cGFja19uYW1lKTsKKwkJcGwgPSBwbC0+bmV4dDsKKwl9CisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiJWx1TUIgb2YgcmVkdW5kYW50IHBhY2tzIGluIHRvdGFsLlxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKXBhY2tfc2V0X2J5dGVjb3VudChyZWQpLygxMDI0KjEwMjQpKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcGFjay5oIGIvcGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMDdiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBQQUNLX0gKKyNkZWZpbmUgUEFDS19ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworLyoKKyAqIFBhY2tlZCBvYmplY3QgaGVhZGVyCisgKi8KKyNkZWZpbmUgUEFDS19TSUdOQVRVUkUgMHg1MDQxNDM0YgkvKiAiUEFDSyIgKi8KKyNkZWZpbmUgUEFDS19WRVJTSU9OIDIKKyNkZWZpbmUgcGFja192ZXJzaW9uX29rKHYpICgodikgPT0gaHRvbmwoMikgfHwgKHYpID09IGh0b25sKDMpKQorc3RydWN0IHBhY2tfaGVhZGVyIHsKKwl1bnNpZ25lZCBpbnQgaGRyX3NpZ25hdHVyZTsKKwl1bnNpZ25lZCBpbnQgaGRyX3ZlcnNpb247CisJdW5zaWduZWQgaW50IGhkcl9lbnRyaWVzOworfTsKKworZXh0ZXJuIGludCB2ZXJpZnlfcGFjayhzdHJ1Y3QgcGFja2VkX2dpdCAqLCBpbnQpOworZXh0ZXJuIGludCBjaGVja19yZXVzZV9wYWNrX2RlbHRhKHN0cnVjdCBwYWNrZWRfZ2l0ICosIHVuc2lnbmVkIGxvbmcsCisJCQkJICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKiwKKwkJCQkgIGVudW0gb2JqZWN0X3R5cGUgKik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3BhZ2VyLmMgYi9wYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MGY1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9wYWdlci5jCkBAIC0wLDAgKzEsNTUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCisvKgorICogVGhpcyBpcyBzcGxpdCB1cCBmcm9tIHRoZSByZXN0IG9mIGdpdCBzbyB0aGF0IHdlIG1pZ2h0IGRvCisgKiBzb21ldGhpbmcgZGlmZmVyZW50IG9uIFdpbmRvd3MsIGZvciBleGFtcGxlLgorICovCisKK3N0YXRpYyB2b2lkIHJ1bl9wYWdlcihjb25zdCBjaGFyICpwYWdlcikKK3sKKwlleGVjbHAocGFnZXIsIHBhZ2VyLCBOVUxMKTsKKwlleGVjbCgiL2Jpbi9zaCIsICJzaCIsICItYyIsIHBhZ2VyLCBOVUxMKTsKK30KKwordm9pZCBzZXR1cF9wYWdlcih2b2lkKQoreworCXBpZF90IHBpZDsKKwlpbnQgZmRbMl07CisJY29uc3QgY2hhciAqcGFnZXIgPSBnZXRlbnYoIlBBR0VSIik7CisKKwlpZiAoIWlzYXR0eSgxKSkKKwkJcmV0dXJuOworCWlmICghcGFnZXIpCisJCXBhZ2VyID0gImxlc3MiOworCWVsc2UgaWYgKCEqcGFnZXIgfHwgIXN0cmNtcChwYWdlciwgImNhdCIpKQorCQlyZXR1cm47CisKKwlwYWdlcl9pbl91c2UgPSAxOyAvKiBtZWFucyB3ZSBhcmUgZW1pdHRpbmcgdG8gdGVybWluYWwgKi8KKworCWlmIChwaXBlKGZkKSA8IDApCisJCXJldHVybjsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIHsKKwkJY2xvc2UoZmRbMF0pOworCQljbG9zZShmZFsxXSk7CisJCXJldHVybjsKKwl9CisKKwkvKiByZXR1cm4gaW4gdGhlIGNoaWxkICovCisJaWYgKCFwaWQpIHsKKwkJZHVwMihmZFsxXSwgMSk7CisJCWNsb3NlKGZkWzBdKTsKKwkJY2xvc2UoZmRbMV0pOworCQlyZXR1cm47CisJfQorCisJLyogVGhlIG9yaWdpbmFsIHByb2Nlc3MgdHVybnMgaW50byB0aGUgUEFHRVIgKi8KKwlkdXAyKGZkWzBdLCAwKTsKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworCisJc2V0ZW52KCJMRVNTIiwgIi1SUyIsIDApOworCXJ1bl9wYWdlcihwYWdlcik7CisJZGllKCJ1bmFibGUgdG8gZXhlY3V0ZSBwYWdlciAnJXMnIiwgcGFnZXIpOworCWV4aXQoMjU1KTsKK30KZGlmZiAtLWdpdCBhL3BhdGNoLWRlbHRhLmMgYi9wYXRjaC1kZWx0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTFkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9wYXRjaC1kZWx0YS5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBwYXRjaC1kZWx0YS5jOgorICogcmVjcmVhdGUgYSBidWZmZXIgZnJvbSBhIHNvdXJjZSBhbmQgdGhlIGRlbHRhIHByb2R1Y2VkIGJ5IGRpZmYtZGVsdGEuYworICoKKyAqIChDKSAyMDA1IE5pY29sYXMgUGl0cmUgPG5pY29AY2FtLm9yZz4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJkZWx0YS5oIgorCit2b2lkICpwYXRjaF9kZWx0YShjb25zdCB2b2lkICpzcmNfYnVmLCB1bnNpZ25lZCBsb25nIHNyY19zaXplLAorCQkgIGNvbnN0IHZvaWQgKmRlbHRhX2J1ZiwgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLAorCQkgIHVuc2lnbmVkIGxvbmcgKmRzdF9zaXplKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsICp0b3A7CisJdW5zaWduZWQgY2hhciAqZHN0X2J1ZiwgKm91dCwgY21kOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChkZWx0YV9zaXplIDwgREVMVEFfU0laRV9NSU4pCisJCXJldHVybiBOVUxMOworCisJZGF0YSA9IGRlbHRhX2J1ZjsKKwl0b3AgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBkZWx0YV9idWYgKyBkZWx0YV9zaXplOworCisJLyogbWFrZSBzdXJlIHRoZSBvcmlnIGZpbGUgc2l6ZSBtYXRjaGVzIHdoYXQgd2UgZXhwZWN0ICovCisJc2l6ZSA9IGdldF9kZWx0YV9oZHJfc2l6ZSgmZGF0YSwgdG9wKTsKKwlpZiAoc2l6ZSAhPSBzcmNfc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBub3cgdGhlIHJlc3VsdCBzaXplICovCisJc2l6ZSA9IGdldF9kZWx0YV9oZHJfc2l6ZSgmZGF0YSwgdG9wKTsKKwlkc3RfYnVmID0gbWFsbG9jKHNpemUgKyAxKTsKKwlpZiAoIWRzdF9idWYpCisJCXJldHVybiBOVUxMOworCWRzdF9idWZbc2l6ZV0gPSAwOworCisJb3V0ID0gZHN0X2J1ZjsKKwl3aGlsZSAoZGF0YSA8IHRvcCkgeworCQljbWQgPSAqZGF0YSsrOworCQlpZiAoY21kICYgMHg4MCkgeworCQkJdW5zaWduZWQgbG9uZyBjcF9vZmYgPSAwLCBjcF9zaXplID0gMDsKKwkJCWlmIChjbWQgJiAweDAxKSBjcF9vZmYgPSAqZGF0YSsrOworCQkJaWYgKGNtZCAmIDB4MDIpIGNwX29mZiB8PSAoKmRhdGErKyA8PCA4KTsKKwkJCWlmIChjbWQgJiAweDA0KSBjcF9vZmYgfD0gKCpkYXRhKysgPDwgMTYpOworCQkJaWYgKGNtZCAmIDB4MDgpIGNwX29mZiB8PSAoKmRhdGErKyA8PCAyNCk7CisJCQlpZiAoY21kICYgMHgxMCkgY3Bfc2l6ZSA9ICpkYXRhKys7CisJCQlpZiAoY21kICYgMHgyMCkgY3Bfc2l6ZSB8PSAoKmRhdGErKyA8PCA4KTsKKwkJCWlmIChjbWQgJiAweDQwKSBjcF9zaXplIHw9ICgqZGF0YSsrIDw8IDE2KTsKKwkJCWlmIChjcF9zaXplID09IDApIGNwX3NpemUgPSAweDEwMDAwOworCQkJaWYgKGNwX29mZiArIGNwX3NpemUgPCBjcF9zaXplIHx8CisJCQkgICAgY3Bfb2ZmICsgY3Bfc2l6ZSA+IHNyY19zaXplIHx8CisJCQkgICAgY3Bfc2l6ZSA+IHNpemUpCisJCQkJZ290byBiYWQ7CisJCQltZW1jcHkob3V0LCAoY2hhciAqKSBzcmNfYnVmICsgY3Bfb2ZmLCBjcF9zaXplKTsKKwkJCW91dCArPSBjcF9zaXplOworCQkJc2l6ZSAtPSBjcF9zaXplOworCQl9IGVsc2UgaWYgKGNtZCkgeworCQkJaWYgKGNtZCA+IHNpemUpCisJCQkJZ290byBiYWQ7CisJCQltZW1jcHkob3V0LCBkYXRhLCBjbWQpOworCQkJb3V0ICs9IGNtZDsKKwkJCWRhdGEgKz0gY21kOworCQkJc2l6ZSAtPSBjbWQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogY21kID09IDAgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBlbmNvZGluZworCQkJICogZXh0ZW5zaW9ucy4gSW4gdGhlIG1lYW4gdGltZSB3ZSBtdXN0IGZhaWwgd2hlbgorCQkJICogZW5jb3VudGVyaW5nIHRoZW0gKG1pZ2h0IGJlIGRhdGEgY29ycnVwdGlvbikuCisJCQkgKi8KKwkJCWdvdG8gYmFkOworCQl9CisJfQorCisJLyogc2FuaXR5IGNoZWNrICovCisJaWYgKGRhdGEgIT0gdG9wIHx8IHNpemUgIT0gMCkgeworCQliYWQ6CisJCWZyZWUoZHN0X2J1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCSpkc3Rfc2l6ZSA9IG91dCAtIGRzdF9idWY7CisJcmV0dXJuIGRzdF9idWY7Cit9CmRpZmYgLS1naXQgYS9wYXRjaC1pZC5jIGIvcGF0Y2gtaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRjODBmCi0tLSAvZGV2L251bGwKKysrIGIvcGF0Y2gtaWQuYwpAQCAtMCwwICsxLDg0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIHZvaWQgZmx1c2hfY3VycmVudF9pZChpbnQgcGF0Y2hsZW4sIHVuc2lnbmVkIGNoYXIgKmlkLCBTSEFfQ1RYICpjKQoreworCXVuc2lnbmVkIGNoYXIgcmVzdWx0WzIwXTsKKwljaGFyIG5hbWVbNTBdOworCisJaWYgKCFwYXRjaGxlbikKKwkJcmV0dXJuOworCisJU0hBMV9GaW5hbChyZXN1bHQsIGMpOworCW1lbWNweShuYW1lLCBzaGExX3RvX2hleChpZCksIDQxKTsKKwlwcmludGYoIiVzICVzXG4iLCBzaGExX3RvX2hleChyZXN1bHQpLCBuYW1lKTsKKwlTSEExX0luaXQoYyk7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3NwYWNlKGNoYXIgKmxpbmUpCit7CisJY2hhciAqc3JjID0gbGluZTsKKwljaGFyICpkc3QgPSBsaW5lOworCXVuc2lnbmVkIGNoYXIgYzsKKworCXdoaWxlICgoYyA9ICpzcmMrKykgIT0gJ1wwJykgeworCQlpZiAoIWlzc3BhY2UoYykpCisJCQkqZHN0KysgPSBjOworCX0KKwlyZXR1cm4gZHN0IC0gbGluZTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfaWRfbGlzdCh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0YXRpYyBjaGFyIGxpbmVbMTAwMF07CisJU0hBX0NUWCBjdHg7CisJaW50IHBhdGNobGVuID0gMDsKKworCVNIQTFfSW5pdCgmY3R4KTsKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBzdGRpbikgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBjaGFyIG5bMjBdOworCQljaGFyICpwID0gbGluZTsKKwkJaW50IGxlbjsKKworCQlpZiAoIW1lbWNtcChsaW5lLCAiZGlmZi10cmVlICIsIDEwKSkKKwkJCXAgKz0gMTA7CisJCWVsc2UgaWYgKCFtZW1jbXAobGluZSwgImNvbW1pdCAiLCA3KSkKKwkJCXAgKz0gNzsKKworCQlpZiAoIWdldF9zaGExX2hleChwLCBuKSkgeworCQkJZmx1c2hfY3VycmVudF9pZChwYXRjaGxlbiwgc2hhMSwgJmN0eCk7CisJCQltZW1jcHkoc2hhMSwgbiwgMjApOworCQkJcGF0Y2hsZW4gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBJZ25vcmUgY29tbWl0IGNvbW1lbnRzICovCisJCWlmICghcGF0Y2hsZW4gJiYgbWVtY21wKGxpbmUsICJkaWZmICIsIDUpKQorCQkJY29udGludWU7CisKKwkJLyogSWdub3JlIGdpdC1kaWZmIGluZGV4IGhlYWRlciAqLworCQlpZiAoIW1lbWNtcChsaW5lLCAiaW5kZXggIiwgNikpCisJCQljb250aW51ZTsKKworCQkvKiBJZ25vcmUgbGluZSBudW1iZXJzIHdoZW4gY29tcHV0aW5nIHRoZSBTSEExIG9mIHRoZSBwYXRjaCAqLworCQlpZiAoIW1lbWNtcChsaW5lLCAiQEAgLSIsIDQpKQorCQkJY29udGludWU7CisKKwkJLyogQ29tcHV0ZSB0aGUgc2hhIHdpdGhvdXQgd2hpdGVzcGFjZSAqLworCQlsZW4gPSByZW1vdmVfc3BhY2UobGluZSk7CisJCXBhdGNobGVuICs9IGxlbjsKKwkJU0hBMV9VcGRhdGUoJmN0eCwgbGluZSwgbGVuKTsKKwl9CisJZmx1c2hfY3VycmVudF9pZChwYXRjaGxlbiwgc2hhMSwgJmN0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHBhdGNoX2lkX3VzYWdlW10gPSAiZ2l0LXBhdGNoLWlkIDwgcGF0Y2giOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgIT0gMSkKKwkJdXNhZ2UocGF0Y2hfaWRfdXNhZ2UpOworCisJZ2VuZXJhdGVfaWRfbGlzdCgpOworCXJldHVybiAwOworfQkKZGlmZiAtLWdpdCBhL3BhdGgtbGlzdC5jIGIvcGF0aC1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1YTEwZAotLS0gL2Rldi9udWxsCisrKyBiL3BhdGgtbGlzdC5jCkBAIC0wLDAgKzEsMTA1IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInBhdGgtbGlzdC5oIgorCisvKiBpZiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgcG9pbnQgdG8gdGhlIGluZGV4IHdoZXJlIHRoZSBlbnRyeSBjb3VsZCBiZQorICogaW5zZXJ0ZWQgKi8KK3N0YXRpYyBpbnQgZ2V0X2VudHJ5X2luZGV4KGNvbnN0IHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnBhdGgsCisJCWludCAqZXhhY3RfbWF0Y2gpCit7CisJaW50IGxlZnQgPSAtMSwgcmlnaHQgPSBsaXN0LT5ucjsKKworCXdoaWxlIChsZWZ0ICsgMSA8IHJpZ2h0KSB7CisJCWludCBtaWRkbGUgPSAobGVmdCArIHJpZ2h0KSAvIDI7CisJCWludCBjb21wYXJlID0gc3RyY21wKHBhdGgsIGxpc3QtPml0ZW1zW21pZGRsZV0ucGF0aCk7CisJCWlmIChjb21wYXJlIDwgMCkKKwkJCXJpZ2h0ID0gbWlkZGxlOworCQllbHNlIGlmIChjb21wYXJlID4gMCkKKwkJCWxlZnQgPSBtaWRkbGU7CisJCWVsc2UgeworCQkJKmV4YWN0X21hdGNoID0gMTsKKwkJCXJldHVybiBtaWRkbGU7CisJCX0KKwl9CisKKwkqZXhhY3RfbWF0Y2ggPSAwOworCXJldHVybiByaWdodDsKK30KKworLyogcmV0dXJucyAtMS1pbmRleCBpZiBhbHJlYWR5IGV4aXN0cyAqLworc3RhdGljIGludCBhZGRfZW50cnkoc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZXhhY3RfbWF0Y2g7CisJaW50IGluZGV4ID0gZ2V0X2VudHJ5X2luZGV4KGxpc3QsIHBhdGgsICZleGFjdF9tYXRjaCk7CisKKwlpZiAoZXhhY3RfbWF0Y2gpCisJCXJldHVybiAtMSAtIGluZGV4OworCisJaWYgKGxpc3QtPm5yICsgMSA+PSBsaXN0LT5hbGxvYykgeworCQlsaXN0LT5hbGxvYyArPSAzMjsKKwkJbGlzdC0+aXRlbXMgPSB4cmVhbGxvYyhsaXN0LT5pdGVtcywgbGlzdC0+YWxsb2MKKwkJCQkqIHNpemVvZihzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0pKTsKKwl9CisJaWYgKGluZGV4IDwgbGlzdC0+bnIpCisJCW1lbW1vdmUobGlzdC0+aXRlbXMgKyBpbmRleCArIDEsIGxpc3QtPml0ZW1zICsgaW5kZXgsCisJCQkJKGxpc3QtPm5yIC0gaW5kZXgpCisJCQkJKiBzaXplb2Yoc3RydWN0IHBhdGhfbGlzdF9pdGVtKSk7CisJbGlzdC0+aXRlbXNbaW5kZXhdLnBhdGggPSBsaXN0LT5zdHJkdXBfcGF0aHMgPworCQlzdHJkdXAocGF0aCkgOiAoY2hhciAqKXBhdGg7CisJbGlzdC0+aXRlbXNbaW5kZXhdLnV0aWwgPSBOVUxMOworCWxpc3QtPm5yKys7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0cnVjdCBwYXRoX2xpc3RfaXRlbSAqcGF0aF9saXN0X2luc2VydChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KQoreworCWludCBpbmRleCA9IGFkZF9lbnRyeShsaXN0LCBwYXRoKTsKKworCWlmIChpbmRleCA8IDApCisJCWluZGV4ID0gMSAtIGluZGV4OworCisJcmV0dXJuIGxpc3QtPml0ZW1zICsgaW5kZXg7Cit9CisKK2ludCBwYXRoX2xpc3RfaGFzX3BhdGgoY29uc3Qgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZXhhY3RfbWF0Y2g7CisJZ2V0X2VudHJ5X2luZGV4KGxpc3QsIHBhdGgsICZleGFjdF9tYXRjaCk7CisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdHJ1Y3QgcGF0aF9saXN0X2l0ZW0gKnBhdGhfbGlzdF9sb29rdXAoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHBhdGhfbGlzdCAqbGlzdCkKK3sKKwlpbnQgZXhhY3RfbWF0Y2gsIGkgPSBnZXRfZW50cnlfaW5kZXgobGlzdCwgcGF0aCwgJmV4YWN0X21hdGNoKTsKKwlpZiAoIWV4YWN0X21hdGNoKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbGlzdC0+aXRlbXMgKyBpOworfQorCit2b2lkIHBhdGhfbGlzdF9jbGVhcihzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBpbnQgZnJlZV9pdGVtcykKK3sKKwlpZiAobGlzdC0+aXRlbXMpIHsKKwkJaW50IGk7CisJCWlmIChmcmVlX2l0ZW1zKQorCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspIHsKKwkJCQlpZiAobGlzdC0+c3RyZHVwX3BhdGhzKQorCQkJCQlmcmVlKGxpc3QtPml0ZW1zW2ldLnBhdGgpOworCQkJCWlmIChsaXN0LT5pdGVtc1tpXS51dGlsKQorCQkJCQlmcmVlKGxpc3QtPml0ZW1zW2ldLnV0aWwpOworCQkJfQorCQlmcmVlKGxpc3QtPml0ZW1zKTsKKwl9CisJbGlzdC0+aXRlbXMgPSBOVUxMOworCWxpc3QtPm5yID0gbGlzdC0+YWxsb2MgPSAwOworfQorCit2b2lkIHByaW50X3BhdGhfbGlzdChjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpwKQoreworCWludCBpOworCWlmICggdGV4dCApCisJCXByaW50ZigiJXNcbiIsIHRleHQpOworCWZvciAoaSA9IDA7IGkgPCBwLT5ucjsgaSsrKQorCQlwcmludGYoIiVzOiVwXG4iLCBwLT5pdGVtc1tpXS5wYXRoLCBwLT5pdGVtc1tpXS51dGlsKTsKK30KKwpkaWZmIC0tZ2l0IGEvcGF0aC1saXN0LmggYi9wYXRoLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQwMWVhCi0tLSAvZGV2L251bGwKKysrIGIvcGF0aC1saXN0LmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfUEFUSF9MSVNUX0hfCisjZGVmaW5lIF9QQVRIX0xJU1RfSF8KKworc3RydWN0IHBhdGhfbGlzdF9pdGVtIHsKKwljaGFyICpwYXRoOworCXZvaWQgKnV0aWw7Cit9Oworc3RydWN0IHBhdGhfbGlzdAoreworCXN0cnVjdCBwYXRoX2xpc3RfaXRlbSAqaXRlbXM7CisJdW5zaWduZWQgaW50IG5yLCBhbGxvYzsKKwl1bnNpZ25lZCBpbnQgc3RyZHVwX3BhdGhzOjE7Cit9OworCit2b2lkIHByaW50X3BhdGhfbGlzdChjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpwKTsKKworaW50IHBhdGhfbGlzdF9oYXNfcGF0aChjb25zdCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICpwYXRoKTsKK3ZvaWQgcGF0aF9saXN0X2NsZWFyKHN0cnVjdCBwYXRoX2xpc3QgKmxpc3QsIGludCBmcmVlX2l0ZW1zKTsKK3N0cnVjdCBwYXRoX2xpc3RfaXRlbSAqcGF0aF9saXN0X2luc2VydChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KTsKK3N0cnVjdCBwYXRoX2xpc3RfaXRlbSAqcGF0aF9saXN0X2xvb2t1cChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9saXN0ICpsaXN0KTsKKworI2VuZGlmIC8qIF9QQVRIX0xJU1RfSF8gKi8KZGlmZiAtLWdpdCBhL3BhdGguYyBiL3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjg5MDVmCi0tLSAvZGV2L251bGwKKysrIGIvcGF0aC5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogSSdtIHRpcmVkIG9mIGRvaW5nICJ2c25wcmludGYoKSIgZXRjIGp1c3QgdG8gb3BlbiBhCisgKiBmaWxlLCBzbyBoZXJlJ3MgYSAicmV0dXJuIHN0YXRpYyBidWZmZXIgd2l0aCBwcmludGYiCisgKiBpbnRlcmZhY2UgZm9yIHBhdGhzLgorICoKKyAqIEl0J3Mgb2J2aW91c2x5IG5vdCB0aHJlYWQtc2FmZS4gU3VlIG1lLiBCdXQgaXQncyBxdWl0ZQorICogdXNlZnVsIGZvciBkb2luZyB0aGluZ3MgbGlrZQorICoKKyAqICAgZiA9IG9wZW4obWtwYXRoKCIlcy8lcy5naXQiLCBiYXNlLCBuYW1lKSwgT19SRE9OTFkpOworICoKKyAqIHdoaWNoIGlzIHdoYXQgaXQncyBkZXNpZ25lZCBmb3IuCisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgPHB3ZC5oPgorCitzdGF0aWMgY2hhciBwYXRobmFtZVtQQVRIX01BWF07CitzdGF0aWMgY2hhciBiYWRfcGF0aFtdID0gIi9iYWQtcGF0aC8iOworCitzdGF0aWMgY2hhciAqY2xlYW51cF9wYXRoKGNoYXIgKnBhdGgpCit7CisJLyogQ2xlYW4gaXQgdXAgKi8KKwlpZiAoIW1lbWNtcChwYXRoLCAiLi8iLCAyKSkgeworCQlwYXRoICs9IDI7CisJCXdoaWxlICgqcGF0aCA9PSAnLycpCisJCQlwYXRoKys7CisJfQorCXJldHVybiBwYXRoOworfQorCitjaGFyICpta3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXVuc2lnbmVkIGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHBhdGhuYW1lLCBQQVRIX01BWCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKGxlbiA+PSBQQVRIX01BWCkKKwkJcmV0dXJuIGJhZF9wYXRoOworCXJldHVybiBjbGVhbnVwX3BhdGgocGF0aG5hbWUpOworfQorCitjaGFyICpnaXRfcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljb25zdCBjaGFyICpnaXRfZGlyID0gZ2V0X2dpdF9kaXIoKTsKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCisJbGVuID0gc3RybGVuKGdpdF9kaXIpOworCWlmIChsZW4gPiBQQVRIX01BWC0xMDApCisJCXJldHVybiBiYWRfcGF0aDsKKwltZW1jcHkocGF0aG5hbWUsIGdpdF9kaXIsIGxlbik7CisJaWYgKGxlbiAmJiBnaXRfZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhuYW1lW2xlbisrXSA9ICcvJzsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiArPSB2c25wcmludGYocGF0aG5hbWUgKyBsZW4sIFBBVEhfTUFYIC0gbGVuLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJcmV0dXJuIGNsZWFudXBfcGF0aChwYXRobmFtZSk7Cit9CisKKworLyogZ2l0X21rc3RlbXAoKSAtIGNyZWF0ZSB0bXAgZmlsZSBob25vcmluZyBUTVBESVIgdmFyaWFibGUgKi8KK2ludCBnaXRfbWtzdGVtcChjaGFyICpwYXRoLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSkKK3sKKwljaGFyICplbnYsICpwY2ggPSBwYXRoOworCisJaWYgKChlbnYgPSBnZXRlbnYoIlRNUERJUiIpKSA9PSBOVUxMKSB7CisJCXN0cmNweShwY2gsICIvdG1wLyIpOworCQlsZW4gLT0gNTsKKwkJcGNoICs9IDU7CisJfSBlbHNlIHsKKwkJc2l6ZV90IG4gPSBzbnByaW50ZihwY2gsIGxlbiwgIiVzLyIsIGVudik7CisKKwkJbGVuIC09IG47CisJCXBjaCArPSBuOworCX0KKworCXN0cmxjcHkocGNoLCB0ZW1wbGF0ZSwgbGVuKTsKKworCXJldHVybiBta3N0ZW1wKHBhdGgpOworfQorCisKK2ludCB2YWxpZGF0ZV9zeW1yZWYoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyICpidWYsIGJ1ZmZlclsyNTZdOworCWludCBsZW4sIGZkOworCisJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBNYWtlIHN1cmUgaXQgaXMgYSAicmVmcy8uLiIgc3ltbGluayAqLworCWlmIChTX0lTTE5LKHN0LnN0X21vZGUpKSB7CisJCWxlbiA9IHJlYWRsaW5rKHBhdGgsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciktMSk7CisJCWlmIChsZW4gPj0gNSAmJiAhbWVtY21wKCJyZWZzLyIsIGJ1ZmZlciwgNSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogQW55dGhpbmcgZWxzZSwganVzdCBvcGVuIGl0IGFuZCB0cnkgdG8gc2VlIGlmIGl0IGlzIGEgc3ltYm9saWMgcmVmLgorCSAqLworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWxlbiA9IHJlYWQoZmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciktMSk7CisJY2xvc2UoZmQpOworCisJLyoKKwkgKiBJcyBpdCBhIHN5bWJvbGljIHJlZj8KKwkgKi8KKwlpZiAobGVuIDwgNCB8fCBtZW1jbXAoInJlZjoiLCBidWZmZXIsIDQpKQorCQlyZXR1cm4gLTE7CisJYnVmID0gYnVmZmVyICsgNDsKKwlsZW4gLT0gNDsKKwl3aGlsZSAobGVuICYmIGlzc3BhY2UoKmJ1ZikpCisJCWJ1ZisrLCBsZW4tLTsKKwlpZiAobGVuID49IDUgJiYgIW1lbWNtcCgicmVmcy8iLCBidWYsIDUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjaGFyICp1c2VyX3BhdGgoY2hhciAqYnVmLCBjaGFyICpwYXRoLCBpbnQgc3opCit7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJY2hhciAqc2xhc2g7CisJaW50IGxlbiwgYmFzZWxlbjsKKworCWlmICghcGF0aCB8fCBwYXRoWzBdICE9ICd+JykKKwkJcmV0dXJuIE5VTEw7CisJcGF0aCsrOworCXNsYXNoID0gc3RyY2hyKHBhdGgsICcvJyk7CisJaWYgKHBhdGhbMF0gPT0gJy8nIHx8ICFwYXRoWzBdKSB7CisJCXB3ID0gZ2V0cHd1aWQoZ2V0dWlkKCkpOworCX0KKwllbHNlIHsKKwkJaWYgKHNsYXNoKSB7CisJCQkqc2xhc2ggPSAwOworCQkJcHcgPSBnZXRwd25hbShwYXRoKTsKKwkJCSpzbGFzaCA9ICcvJzsKKwkJfQorCQllbHNlCisJCQlwdyA9IGdldHB3bmFtKHBhdGgpOworCX0KKwlpZiAoIXB3IHx8ICFwdy0+cHdfZGlyIHx8IHN6IDw9IHN0cmxlbihwdy0+cHdfZGlyKSkKKwkJcmV0dXJuIE5VTEw7CisJYmFzZWxlbiA9IHN0cmxlbihwdy0+cHdfZGlyKTsKKwltZW1jcHkoYnVmLCBwdy0+cHdfZGlyLCBiYXNlbGVuKTsKKwl3aGlsZSAoKDEgPCBiYXNlbGVuKSAmJiAoYnVmW2Jhc2VsZW4tMV0gPT0gJy8nKSkgeworCQlidWZbYmFzZWxlbi0xXSA9IDA7CisJCWJhc2VsZW4tLTsKKwl9CisJaWYgKHNsYXNoICYmIHNsYXNoWzFdKSB7CisJCWxlbiA9IHN0cmxlbihzbGFzaCk7CisJCWlmIChzeiA8PSBiYXNlbGVuICsgbGVuKQorCQkJcmV0dXJuIE5VTEw7CisJCW1lbWNweShidWYgKyBiYXNlbGVuLCBzbGFzaCwgbGVuICsgMSk7CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBGaXJzdCwgb25lIGRpcmVjdG9yeSB0byB0cnkgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIGFsZ29yaXRobS4KKyAqCisgKiAoMCkgSWYgInN0cmljdCIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIHVzZWQgYXMgZ2l2ZW4gYW5kIG5vIERXSU0gaXMKKyAqICAgICBkb25lLiBPdGhlcndpc2U6CisgKiAoMSkgIn4vcGF0aCIgdG8gbWVhbiBwYXRoIHVuZGVyIHRoZSBydW5uaW5nIHVzZXIncyBob21lIGRpcmVjdG9yeTsKKyAqICgyKSAifnVzZXIvcGF0aCIgdG8gbWVhbiBwYXRoIHVuZGVyIG5hbWVkIHVzZXIncyBob21lIGRpcmVjdG9yeTsKKyAqICgzKSAicmVsYXRpdmUvcGF0aCIgdG8gbWVhbiBjd2QgcmVsYXRpdmUgZGlyZWN0b3J5OyBvcgorICogKDQpICIvYWJzb2x1dGUvcGF0aCIgdG8gbWVhbiBhYnNvbHV0ZSBkaXJlY3RvcnkuCisgKgorICogVW5sZXNzICJzdHJpY3QiIGlzIGdpdmVuLCB3ZSB0cnkgYWNjZXNzKCkgZm9yIGV4aXN0ZW5jZSBvZiAiJXMuZ2l0Ly5naXQiLAorICogIiVzLy5naXQiLCAiJXMuZ2l0IiwgIiVzIiBpbiB0aGlzIG9yZGVyLiAgVGhlIGZpcnN0IG9uZSB0aGF0IGV4aXN0cyBpcworICogd2hhdCB3ZSB0cnkuCisgKgorICogU2Vjb25kLCB3ZSB0cnkgY2hkaXIoKSB0byB0aGF0LiAgVXBvbiBmYWlsdXJlLCB3ZSByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGVuLCB3ZSB0cnkgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGEgdmFsaWQgZ2l0IHJlcG9zaXRvcnkuCisgKiBVcG9uIGZhaWx1cmUsIHdlIHJldHVybiBOVUxMLgorICoKKyAqIElmIGFsbCBnb2VzIHdlbGwsIHdlIHJldHVybiB0aGUgZGlyZWN0b3J5IHdlIHVzZWQgdG8gY2hkaXIoKSAoYnV0CisgKiBiZWZvcmUgfnVzZXIgaXMgZXhwYW5kZWQpLCBhdm9pZGluZyBnZXRjd2QoKSByZXNvbHZpbmcgc3ltYm9saWMKKyAqIGxpbmtzLiAgVXNlciByZWxhdGl2ZSBwYXRocyBhcmUgYWxzbyByZXR1cm5lZCBhcyB0aGV5IGFyZSBnaXZlbiwKKyAqIGV4Y2VwdCBEV0lNIHN1ZmZpeGluZy4KKyAqLworY2hhciAqZW50ZXJfcmVwbyhjaGFyICpwYXRoLCBpbnQgc3RyaWN0KQoreworCXN0YXRpYyBjaGFyIHVzZWRfcGF0aFtQQVRIX01BWF07CisJc3RhdGljIGNoYXIgdmFsaWRhdGVkX3BhdGhbUEFUSF9NQVhdOworCisJaWYgKCFwYXRoKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghc3RyaWN0KSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICpzdWZmaXhbXSA9IHsKKwkJCSIuZ2l0Ly5naXQiLCAiLy5naXQiLCAiLmdpdCIsICIiLCBOVUxMLAorCQl9OworCQlpbnQgbGVuID0gc3RybGVuKHBhdGgpOworCQlpbnQgaTsKKwkJd2hpbGUgKCgxIDwgbGVuKSAmJiAocGF0aFtsZW4tMV0gPT0gJy8nKSkgeworCQkJcGF0aFtsZW4tMV0gPSAwOworCQkJbGVuLS07CisJCX0KKwkJaWYgKFBBVEhfTUFYIDw9IGxlbikKKwkJCXJldHVybiBOVUxMOworCQlpZiAocGF0aFswXSA9PSAnficpIHsKKwkJCWlmICghdXNlcl9wYXRoKHVzZWRfcGF0aCwgcGF0aCwgUEFUSF9NQVgpKQorCQkJCXJldHVybiBOVUxMOworCQkJc3RyY3B5KHZhbGlkYXRlZF9wYXRoLCBwYXRoKTsKKwkJCXBhdGggPSB1c2VkX3BhdGg7CisJCX0KKwkJZWxzZSBpZiAoUEFUSF9NQVggLSAxMCA8IGxlbikKKwkJCXJldHVybiBOVUxMOworCQllbHNlIHsKKwkJCXBhdGggPSBzdHJjcHkodXNlZF9wYXRoLCBwYXRoKTsKKwkJCXN0cmNweSh2YWxpZGF0ZWRfcGF0aCwgcGF0aCk7CisJCX0KKwkJbGVuID0gc3RybGVuKHBhdGgpOworCQlmb3IgKGkgPSAwOyBzdWZmaXhbaV07IGkrKykgeworCQkJc3RyY3B5KHBhdGggKyBsZW4sIHN1ZmZpeFtpXSk7CisJCQlpZiAoIWFjY2VzcyhwYXRoLCBGX09LKSkgeworCQkJCXN0cmNhdCh2YWxpZGF0ZWRfcGF0aCwgc3VmZml4W2ldKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN1ZmZpeFtpXSB8fCBjaGRpcihwYXRoKSkKKwkJCXJldHVybiBOVUxMOworCQlwYXRoID0gdmFsaWRhdGVkX3BhdGg7CisJfQorCWVsc2UgaWYgKGNoZGlyKHBhdGgpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChhY2Nlc3MoIm9iamVjdHMiLCBYX09LKSA9PSAwICYmIGFjY2VzcygicmVmcyIsIFhfT0spID09IDAgJiYKKwkgICAgdmFsaWRhdGVfc3ltcmVmKCJIRUFEIikgPT0gMCkgeworCQlwdXRlbnYoIkdJVF9ESVI9LiIpOworCQljaGVja19yZXBvc2l0b3J5X2Zvcm1hdCgpOworCQlyZXR1cm4gcGF0aDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGFkanVzdF9zaGFyZWRfcGVybShjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBtb2RlOworCisJaWYgKCFzaGFyZWRfcmVwb3NpdG9yeSkKKwkJcmV0dXJuIDA7CisJaWYgKGxzdGF0KHBhdGgsICZzdCkgPCAwKQorCQlyZXR1cm4gLTE7CisJbW9kZSA9IHN0LnN0X21vZGU7CisJaWYgKG1vZGUgJiBTX0lSVVNSKQorCQltb2RlIHw9IChzaGFyZWRfcmVwb3NpdG9yeSA9PSBQRVJNX0dST1VQCisJCQkgPyBTX0lSR1JQCisJCQkgOiAoc2hhcmVkX3JlcG9zaXRvcnkgPT0gUEVSTV9FVkVSWUJPRFkKKwkJCSAgICA/IChTX0lSR1JQfFNfSVJPVEgpCisJCQkgICAgOiAwKSk7CisKKwlpZiAobW9kZSAmIFNfSVdVU1IpCisJCW1vZGUgfD0gU19JV0dSUDsKKworCWlmIChtb2RlICYgU19JWFVTUikKKwkJbW9kZSB8PSAoc2hhcmVkX3JlcG9zaXRvcnkgPT0gUEVSTV9HUk9VUAorCQkJID8gU19JWEdSUAorCQkJIDogKHNoYXJlZF9yZXBvc2l0b3J5ID09IFBFUk1fRVZFUllCT0RZCisJCQkgICAgPyAoU19JWEdSUHxTX0lYT1RIKQorCQkJICAgIDogMCkpOworCWlmIChTX0lTRElSKG1vZGUpKQorCQltb2RlIHw9IFNfSVNHSUQ7CisJaWYgKGNobW9kKHBhdGgsIG1vZGUpIDwgMCkKKwkJcmV0dXJuIC0yOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcGVlay1yZW1vdGUuYyBiL3BlZWstcmVtb3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzMDk4MAotLS0gL2Rldi9udWxsCisrKyBiL3BlZWstcmVtb3RlLmMKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicmVmcy5oIgorI2luY2x1ZGUgInBrdC1saW5lLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgcGVla19yZW1vdGVfdXNhZ2VbXSA9CisiZ2l0LXBlZWstcmVtb3RlIFstLWV4ZWM9dXBsb2FkLXBhY2tdIFtob3N0Ol1kaXJlY3RvcnkiOworc3RhdGljIGNvbnN0IGNoYXIgKmV4ZWMgPSAiZ2l0LXVwbG9hZC1wYWNrIjsKKworc3RhdGljIGludCBwZWVrX3JlbW90ZShpbnQgZmRbMl0sIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCByZWYgKnJlZjsKKworCWdldF9yZW1vdGVfaGVhZHMoZmRbMF0sICZyZWYsIDAsIE5VTEwsIGZsYWdzKTsKKwlwYWNrZXRfZmx1c2goZmRbMV0pOworCisJd2hpbGUgKHJlZikgeworCQlwcmludGYoIiVzCSVzXG4iLCBzaGExX3RvX2hleChyZWYtPm9sZF9zaGExKSwgcmVmLT5uYW1lKTsKKwkJcmVmID0gcmVmLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpLCByZXQ7CisJY2hhciAqZGVzdCA9IE5VTEw7CisJaW50IGZkWzJdOworCXBpZF90IHBpZDsKKwlpbnQgbm9uZ2l0ID0gMDsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseSgmbm9uZ2l0KTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworCQlpZiAoKmFyZyA9PSAnLScpIHsKKwkJCWlmICghc3RybmNtcCgiLS1leGVjPSIsIGFyZywgNykpIHsKKwkJCQlleGVjID0gYXJnICsgNzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKCItLXRhZ3MiLCBhcmcpKSB7CisJCQkJZmxhZ3MgfD0gUkVGX1RBR1M7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1oZWFkcyIsIGFyZykpIHsKKwkJCQlmbGFncyB8PSBSRUZfSEVBRFM7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgiLS1yZWZzIiwgYXJnKSkgeworCQkJCWZsYWdzIHw9IFJFRl9OT1JNQUw7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1c2FnZShwZWVrX3JlbW90ZV91c2FnZSk7CisJCX0KKwkJZGVzdCA9IGFyZzsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFkZXN0IHx8IGkgIT0gYXJnYyAtIDEpCisJCXVzYWdlKHBlZWtfcmVtb3RlX3VzYWdlKTsKKworCXBpZCA9IGdpdF9jb25uZWN0KGZkLCBkZXN0LCBleGVjKTsKKwlpZiAocGlkIDwgMCkKKwkJcmV0dXJuIDE7CisJcmV0ID0gcGVla19yZW1vdGUoZmQsIGZsYWdzKTsKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworCWZpbmlzaF9jb25uZWN0KHBpZCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3BrdC1saW5lLmMgYi9wa3QtbGluZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTgxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9wa3QtbGluZS5jCkBAIC0wLDAgKzEsMTE0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorCisvKgorICogV3JpdGUgYSBwYWNrZXRpemVkIHN0cmVhbSwgd2hlcmUgZWFjaCBsaW5lIGlzIHByZWNlZGVkIGJ5CisgKiBpdHMgbGVuZ3RoIChpbmNsdWRpbmcgdGhlIGhlYWRlcikgYXMgYSA0LWJ5dGUgaGV4IG51bWJlci4KKyAqIEEgbGVuZ3RoIG9mICd6ZXJvJyBtZWFucyBlbmQgb2Ygc3RyZWFtIChhbmQgYSBsZW5ndGggb2YgMS0zCisgKiB3b3VsZCBiZSBhbiBlcnJvcikuIAorICoKKyAqIFRoaXMgaXMgYWxsIHByZXR0eSBzdHVwaWQsIGJ1dCB3ZSB1c2UgdGhpcyBwYWNrZXRpemVkIGxpbmUKKyAqIGZvcm1hdCB0byBtYWtlIGEgc3RyZWFtaW5nIGZvcm1hdCBwb3NzaWJsZSB3aXRob3V0IGV2ZXIKKyAqIG92ZXItcnVubmluZyB0aGUgcmVhZCBidWZmZXJzLiBUaGF0IHdheSB3ZSdsbCBuZXZlciByZWFkCisgKiBpbnRvIHdoYXQgbWlnaHQgYmUgdGhlIHBhY2sgZGF0YSAod2hpY2ggc2hvdWxkIGdvIHRvIGFub3RoZXIKKyAqIHByb2Nlc3MgZW50aXJlbHkpLgorICoKKyAqIFRoZSB3cml0aW5nIHNpZGUgY291bGQgdXNlIHN0ZGlvLCBidXQgc2luY2UgdGhlIHJlYWRpbmcKKyAqIHNpZGUgY2FuJ3QsIHdlIHN0YXkgd2l0aCBwdXJlIHJlYWQvd3JpdGUgaW50ZXJmYWNlcy4KKyAqLworc3NpemVfdCBzYWZlX3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzc2l6ZV90IG4pCit7CisJc3NpemVfdCBubiA9IG47CisJd2hpbGUgKG4pIHsKKwkJaW50IHJldCA9IHh3cml0ZShmZCwgYnVmLCBuKTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWJ1ZiA9IChjaGFyICopIGJ1ZiArIHJldDsKKwkJCW4gLT0gcmV0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFyZXQpCisJCQlkaWUoIndyaXRlIGVycm9yIChkaXNrIGZ1bGw/KSIpOworCQlkaWUoIndyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCX0KKwlyZXR1cm4gbm47Cit9CisKKy8qCisgKiBJZiB3ZSBidWZmZXJlZCB0aGluZ3MgdXAgYWJvdmUgKHdlIGRvbid0LCBidXQgd2Ugc2hvdWxkKSwKKyAqIHdlJ2QgZmx1c2ggaXQgaGVyZQorICovCit2b2lkIHBhY2tldF9mbHVzaChpbnQgZmQpCit7CisJc2FmZV93cml0ZShmZCwgIjAwMDAiLCA0KTsKK30KKworI2RlZmluZSBoZXgoYSkgKGhleGNoYXJbKGEpICYgMTVdKQordm9pZCBwYWNrZXRfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlzdGF0aWMgY2hhciBidWZmZXJbMTAwMF07CisJc3RhdGljIGNoYXIgaGV4Y2hhcltdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwluID0gdnNucHJpbnRmKGJ1ZmZlciArIDQsIHNpemVvZihidWZmZXIpIC0gNCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKG4gPj0gc2l6ZW9mKGJ1ZmZlciktNCkKKwkJZGllKCJwcm90b2NvbCBlcnJvcjogaW1wb3NzaWJseSBsb25nIGxpbmUiKTsKKwluICs9IDQ7CisJYnVmZmVyWzBdID0gaGV4KG4gPj4gMTIpOworCWJ1ZmZlclsxXSA9IGhleChuID4+IDgpOworCWJ1ZmZlclsyXSA9IGhleChuID4+IDQpOworCWJ1ZmZlclszXSA9IGhleChuKTsKKwlzYWZlX3dyaXRlKGZkLCBidWZmZXIsIG4pOworfQorCitzdGF0aWMgdm9pZCBzYWZlX3JlYWQoaW50IGZkLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUpCit7CisJaW50IG4gPSAwOworCisJd2hpbGUgKG4gPCBzaXplKSB7CisJCWludCByZXQgPSB4cmVhZChmZCwgKGNoYXIgKikgYnVmZmVyICsgbiwgc2l6ZSAtIG4pOworCQlpZiAocmV0IDwgMCkKKwkJCWRpZSgicmVhZCBlcnJvciAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoInVuZXhwZWN0ZWQgRU9GIik7CisJCW4gKz0gcmV0OworCX0KK30KKworaW50IHBhY2tldF9yZWFkX2xpbmUoaW50IGZkLCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIHNpemUpCit7CisJaW50IG47CisJdW5zaWduZWQgbGVuOworCWNoYXIgbGluZWxlbls0XTsKKworCXNhZmVfcmVhZChmZCwgbGluZWxlbiwgNCk7CisKKwlsZW4gPSAwOworCWZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKKwkJdW5zaWduZWQgY2hhciBjID0gbGluZWxlbltuXTsKKwkJbGVuIDw8PSA0OworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKwkJCWxlbiArPSBjIC0gJzAnOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKSB7CisJCQlsZW4gKz0gYyAtICdhJyArIDEwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKSB7CisJCQlsZW4gKz0gYyAtICdBJyArIDEwOworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJwcm90b2NvbCBlcnJvcjogYmFkIGxpbmUgbGVuZ3RoIGNoYXJhY3RlciIpOworCX0KKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJbGVuIC09IDQ7CisJaWYgKGxlbiA+PSBzaXplKQorCQlkaWUoInByb3RvY29sIGVycm9yOiBiYWQgbGluZSBsZW5ndGggJWQiLCBsZW4pOworCXNhZmVfcmVhZChmZCwgYnVmZmVyLCBsZW4pOworCWJ1ZmZlcltsZW5dID0gMDsKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvcGt0LWxpbmUuaCBiL3BrdC1saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmNjUzZgotLS0gL2Rldi9udWxsCisrKyBiL3BrdC1saW5lLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBQS1RMSU5FX0gKKyNkZWZpbmUgUEtUTElORV9ICisKKyNpbmNsdWRlICJnaXQtY29tcGF0LXV0aWwuaCIKKworLyoKKyAqIFNpbGx5IHBhY2tldGl6ZWQgbGluZSB3cml0aW5nIGludGVyZmFjZQorICovCit2b2lkIHBhY2tldF9mbHVzaChpbnQgZmQpOwordm9pZCBwYWNrZXRfd3JpdGUoaW50IGZkLCBjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7CisKK2ludCBwYWNrZXRfcmVhZF9saW5lKGludCBmZCwgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBzaXplKTsKK3NzaXplX3Qgc2FmZV93cml0ZShpbnQsIGNvbnN0IHZvaWQgKiwgc3NpemVfdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcHBjL3NoYTEuYyBiL3BwYy9zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyMDM5OAotLS0gL2Rldi9udWxsCisrKyBiL3BwYy9zaGExLmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIFNIQS0xIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4KKyAqCisgKiBUaGlzIHZlcnNpb24gYXNzdW1lcyB3ZSBhcmUgcnVubmluZyBvbiBhIGJpZy1lbmRpYW4gbWFjaGluZS4KKyAqIEl0IGNhbGxzIGFuIGV4dGVybmFsIHNoYTFfY29yZSgpIHRvIHByb2Nlc3MgYmxvY2tzIG9mIDY0IGJ5dGVzLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzaGExLmgiCisKK2V4dGVybiB2b2lkIHNoYTFfY29yZSh1aW50MzJfdCAqaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqcCwKKwkJICAgICAgdW5zaWduZWQgaW50IG5ibG9ja3MpOworCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpCit7CisJYy0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJYy0+aGFzaFsxXSA9IDB4RUZDREFCODk7CisJYy0+aGFzaFsyXSA9IDB4OThCQURDRkU7CisJYy0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJYy0+aGFzaFs0XSA9IDB4QzNEMkUxRjA7CisJYy0+bGVuID0gMDsKKwljLT5jbnQgPSAwOworCXJldHVybiAwOworfQorCitpbnQgU0hBMV9VcGRhdGUoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdW5zaWduZWQgbG9uZyBuYjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gcHRyOworCisJYy0+bGVuICs9ICh1aW50NjRfdCkgbiA8PCAzOworCXdoaWxlIChuICE9IDApIHsKKwkJaWYgKGMtPmNudCB8fCBuIDwgNjQpIHsKKwkJCW5iID0gNjQgLSBjLT5jbnQ7CisJCQlpZiAobmIgPiBuKQorCQkJCW5iID0gbjsKKwkJCW1lbWNweSgmYy0+YnVmLmJbYy0+Y250XSwgcCwgbmIpOworCQkJaWYgKChjLT5jbnQgKz0gbmIpID09IDY0KSB7CisJCQkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJCQljLT5jbnQgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJbmIgPSBuID4+IDY7CisJCQlzaGExX2NvcmUoYy0+aGFzaCwgcCwgbmIpOworCQkJbmIgPDw9IDY7CisJCX0KKwkJbiAtPSBuYjsKKwkJcCArPSBuYjsKKwl9CisJcmV0dXJuIDA7Cit9CQorCitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKQoreworCXVuc2lnbmVkIGludCBjbnQgPSBjLT5jbnQ7CisKKwljLT5idWYuYltjbnQrK10gPSAweDgwOworCWlmIChjbnQgPiA1NikgeworCQlpZiAoY250IDwgNjQpCisJCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDY0IC0gY250KTsKKwkJc2hhMV9jb3JlKGMtPmhhc2gsIGMtPmJ1Zi5iLCAxKTsKKwkJY250ID0gMDsKKwl9CisJaWYgKGNudCA8IDU2KQorCQltZW1zZXQoJmMtPmJ1Zi5iW2NudF0sIDAsIDU2IC0gY250KTsKKwljLT5idWYubFs3XSA9IGMtPmxlbjsKKwlzaGExX2NvcmUoYy0+aGFzaCwgYy0+YnVmLmIsIDEpOworCW1lbWNweShoYXNoLCBjLT5oYXNoLCAyMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9wcGMvc2hhMS5oIGIvcHBjL3NoYTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M1MWFhCi0tLSAvZGV2L251bGwKKysrIGIvcHBjL3NoYTEuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IHNoYV9jb250ZXh0IHsKKwl1aW50MzJfdCBoYXNoWzVdOworCXVpbnQzMl90IGNudDsKKwl1aW50NjRfdCBsZW47CisJdW5pb24geworCQl1bnNpZ25lZCBjaGFyIGJbNjRdOworCQl1aW50NjRfdCBsWzhdOworCX0gYnVmOworfSBTSEFfQ1RYOworCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHVuc2lnbmVkIGxvbmcgbik7CitpbnQgU0hBMV9GaW5hbCh1bnNpZ25lZCBjaGFyICpoYXNoLCBTSEFfQ1RYICpjKTsKZGlmZiAtLWdpdCBhL3BwYy9zaGExcHBjLlMgYi9wcGMvc2hhMXBwYy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MGNiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9wcGMvc2hhMXBwYy5TCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogU0hBLTEgaW1wbGVtZW50YXRpb24gZm9yIFBvd2VyUEMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICovCisKKy8qCisgKiBQb3dlclBDIGNhbGxpbmcgY29udmVudGlvbjoKKyAqICVyMCAtIHZvbGF0aWxlIHRlbXAKKyAqICVyMSAtIHN0YWNrIHBvaW50ZXIuCisgKiAlcjIgLSByZXNlcnZlZAorICogJXIzLSVyMTIgLSBJbmNvbWluZyBhcmd1bWVudHMgJiByZXR1cm4gdmFsdWVzOyB2b2xhdGlsZS4KKyAqICVyMTMtJXIzMSAtIENhbGxlZS1zYXZlIHJlZ2lzdGVycworICogJWxyIC0gUmV0dXJuIGFkZHJlc3MsIHZvbGF0aWxlCisgKiAlY3RyIC0gdm9sYXRpbGUKKyAqCisgKiBSZWdpc3RlciB1c2FnZSBpbiB0aGlzIHJvdXRpbmU6CisgKiAlcjAgLSB0ZW1wCisgKiAlcjMgLSBhcmd1bWVudCAocG9pbnRlciB0byA1IHdvcmRzIG9mIFNIQSBzdGF0ZSkKKyAqICVyNCAtIGFyZ3VtZW50IChwb2ludGVyIHRvIGRhdGEgdG8gaGFzaCkKKyAqICVyNSAtIENvbnRhbnQgSyBpbiBTSEEgcm91bmQgKGluaXRpYWxseSBudW1iZXIgb2YgYmxvY2tzIHRvIGhhc2gpCisgKiAlcjYtJXIxMCAtIFdvcmtpbmcgY29waWVzIG9mIFNIQSB2YXJpYWJsZXMgQS4uRSAoYWN0dWFsbHkgRS4uQSBvcmRlcikKKyAqICVyMTEtJXIyNiAtIERhdGEgYmVpbmcgaGFzaGVkIFdbXS4KKyAqICVyMjctJXIzMSAtIFByZXZpb3VzIGNvcGllcyBvZiBBLi5FLCBmb3IgZmluYWwgYWRkIGJhY2suCisgKiAlY3RyIC0gbG9vcCBjb3VudAorICovCisKKworLyoKKyAqIFdlIHJvbGwgdGhlIHJlZ2lzdGVycyBmb3IgQSwgQiwgQywgRCwgRSBhcm91bmQgb24gZWFjaAorICogaXRlcmF0aW9uOyBFIG9uIGl0ZXJhdGlvbiB0IGlzIEQgb24gaXRlcmF0aW9uIHQrMSwgYW5kIHNvIG9uLgorICogV2UgdXNlIHJlZ2lzdGVycyA2IC0gMTAgZm9yIHRoaXMuICAoUmVnaXN0ZXJzIDI3IC0gMzEgaG9sZAorICogdGhlIHByZXZpb3VzIHZhbHVlcy4pCisgKi8KKyNkZWZpbmUgUkEodCkJKCgodCkrNCklNSs2KQorI2RlZmluZSBSQih0KQkoKCh0KSszKSU1KzYpCisjZGVmaW5lIFJDKHQpCSgoKHQpKzIpJTUrNikKKyNkZWZpbmUgUkQodCkJKCgodCkrMSklNSs2KQorI2RlZmluZSBSRSh0KQkoKCh0KSswKSU1KzYpCisKKy8qIFdlIHVzZSByZWdpc3RlcnMgMTEgLSAyNiBmb3IgdGhlIFcgdmFsdWVzICovCisjZGVmaW5lIFcodCkJKCh0KSUxNisxMSkKKworLyogUmVnaXN0ZXIgNSBpcyB1c2VkIGZvciB0aGUgY29uc3RhbnQgayAqLworCisvKgorICogVGhlIGJhc2ljIFNIQS0xIHJvdW5kIGZ1bmN0aW9uIGlzOgorICogRSArPSBST1RMKEEsNSkgKyBGKEIsQyxEKSArIFdbaV0gKyBLOyAgQiA9IFJPVEwoQiwzMCkKKyAqIFRoZW4gdGhlIHZhcmlhYmxlcyBhcmUgcmVuYW1lZDogKEEsQixDLEQsRSkgPSAoRSxBLEIsQyxEKS4KKyAqCisgKiBFdmVyeSAyMCByb3VuZHMsIHRoZSBmdW5jdGlvbiBGKCkgYW5kIHRoZSBjb250YW50IEsgY2hhbmdlczoKKyAqIC0gMjAgcm91bmRzIG9mIGYwKGIsYyxkKSA9ICJiaXQgd2lzZSBiID8gYyA6IGQiID0gICheYiAmIGQpICsgKGIgJiBjKQorICogLSAyMCByb3VuZHMgb2YgZjEoYixjLGQpID0gYl5jXmQgPSAoYl5kKV5jCisgKiAtIDIwIHJvdW5kcyBvZiBmMihiLGMsZCkgPSBtYWpvcml0eShiLGMsZCkgPSAoYiZkKSArICgoYl5kKSZjKQorICogLSAyMCBtb3JlIHJvdW5kcyBvZiBmMShiLGMsZCkKKyAqCisgKiBUaGVzZSBhcmUgYWxsIHNjaGVkdWxlZCBmb3IgbmVhci1vcHRpbWFsIHBlcmZvcm1hbmNlIG9uIGEgRzQuCisgKiBUaGUgRzQgaXMgYSAzLWlzc3VlIG91dC1vZi1vcmRlciBtYWNoaW5lIHdpdGggMyBBTFVzLCBidXQgaXQgY2FuIG9ubHkKKyAqICpjb25zaWRlciogc3RhcnRpbmcgdGhlIG9sZGVzdCAzIGluc3RydWN0aW9ucyBwZXIgY3ljbGUuICBTbyB0byBnZXQKKyAqIG1heGltdW0gcGVyZm9ybWFjZSBvdXQgb2YgaXQsIHlvdSBoYXZlIHRvIHRyZWF0IGl0IGFzIGFuIGluLW9yZGVyCisgKiBtYWNoaW5lLiAgV2hpY2ggbWVhbnMgaW50ZXJsZWF2aW5nIHRoZSBjb21wdXRhdGlvbiByb3VuZCB0IHdpdGggdGhlCisgKiBjb21wdXRhdGlvbiBvZiBXW3QrNF0uCisgKgorICogVGhlIGZpcnN0IDE2IHJvdW5kcyB1c2UgVyB2YWx1ZXMgbG9hZGVkIGRpcmVjdGx5IGZyb20gbWVtb3J5LCB3aGlsZSB0aGUKKyAqIHJlbWFpbmluZyA2NCB1c2UgdmFsdWVzIGNvbXB1dGVkIGZyb20gdGhvc2UgZmlyc3QgMTYuICBXZSBwcmVsb2FkCisgKiA0IHZhbHVlcyBiZWZvcmUgc3RhcnRpbmcsIHNvIHRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiByb3VuZHM6CisgKiAtIFRoZSBmaXJzdCAxMiAoYWxsIGYwKSBhbHNvIGxvYWQgdGhlIFcgdmFsdWVzIGZyb20gbWVtb3J5LgorICogLSBUaGUgbmV4dCA2NCBjb21wdXRlIFcoaSs0KSBpbiBwYXJhbGxlbC4gOCpmMCwgMjAqZjEsIDIwKmYyLCAxNipmMS4KKyAqIC0gVGhlIGxhc3QgNCAoYWxsIGYxKSBkbyBub3QgZG8gYW55dGhpbmcgd2l0aCBXLgorICoKKyAqIFRoZXJlZm9yZSwgd2UgaGF2ZSA2IGRpZmZlcmVudCByb3VuZCBmdW5jdGlvbnM6CisgKiBTVEVQRDBfTE9BRCh0LHMpIC0gUGVyZm9ybSByb3VuZCB0IGFuZCBsb2FkIFcocykuICBzIDwgMTYKKyAqIFNURVBEMF9VUERBVEUodCxzKSAtIFBlcmZvcm0gcm91bmQgdCBhbmQgY29tcHV0ZSBXKHMpLiAgcyA+PSAxNi4KKyAqIFNURVBEMV9VUERBVEUodCxzKQorICogU1RFUEQyX1VQREFURSh0LHMpCisgKiBTVEVQRDEodCkgLSBQZXJmb3JtIHJvdW5kIHQgd2l0aCBubyBsb2FkIG9yIHVwZGF0ZS4KKyAqCisgKiBUaGUgRzUgaXMgbW9yZSBmdWxseSBvdXQtb2Ytb3JkZXIsIGFuZCBjYW4gZmluZCB0aGUgcGFyYWxsZWxpc20KKyAqIGJ5IGl0c2VsZi4gIFRoZSBiaWcgbGltaXQgaXMgdGhhdCBpdCBoYXMgYSAyLWN5Y2xlIEFMVSBsYXRlbmN5LCBzbworICogZXZlbiB0aG91Z2ggaXQncyAyLXdheSwgdGhlIGNvZGUgaGFzIHRvIGJlIHNjaGVkdWxlZCBhcyBpZiBpdCdzCisgKiA0LXdheSwgd2hpY2ggY2FuIGJlIGEgbGltaXQuICBUbyBoZWxwIGl0LCB3ZSB0cnkgdG8gc2NoZWR1bGUgdGhlCisgKiByZWFkIG9mIFJBKHQpIGFzIGxhdGUgYXMgcG9zc2libGUgc28gaXQgZG9lc24ndCBzdGFsbCB3YWl0aW5nIGZvcgorICogdGhlIHByZXZpb3VzIHJvdW5kJ3MgUkUodC0xKSwgYW5kIHdlIHRyeSB0byByb3RhdGUgUkIodCkgYXMgZWFybHkKKyAqIGFzIHBvc3NpYmxlIHdoaWxlIHJlYWRpbmcgUkModCkgKD0gUkIodC0xKSkgYXMgbGF0ZSBhcyBwb3NzaWJsZS4KKyAqLworCisvKiB0aGUgaW5pdGlhbCBsb2Fkcy4gKi8KKyNkZWZpbmUgTE9BRFcocykgXAorCWx3eglXKHMpLChzKSo0KCVyNCkKKworLyoKKyAqIFBlcmZvcm0gYSBzdGVwIHdpdGggRjAsIGFuZCBsb2FkIFcocykuICBVc2VzIFcocykgYXMgYSB0ZW1wb3JhcnkKKyAqIGJlZm9yZSBsb2FkaW5nIGl0LgorICogVGhpcyBpcyBhY3R1YWxseSAxMCBpbnN0cnVjdGlvbnMsIHdoaWNoIGlzIGFuIGF3a3dhcmQgZml0LgorICogSXQgY2FuIGV4ZWN1dGUgZ3JvdXBlZCBhcyBsaXN0ZWQsIG9yIGRlbGF5ZWQgb25lIGluc3RydWN0aW9uLgorICogKElmIGRlbGF5ZWQgdHdvIGluc3RydWN0aW9ucywgdGhlcmUgaXMgYSBzdGFsbCBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZQorICogc2Vjb25kIGxpbmUuKSAgVGh1cywgdHdvIGl0ZXJhdGlvbnMgdGFrZSA3IGN5Y2xlcywgMy41IGN5Y2xlcyBwZXIgcm91bmQuCisgKi8KKyNkZWZpbmUgU1RFUEQwX0xPQUQodCxzKSBcCithZGQgUkUodCksUkUodCksVyh0KTsgYW5kYyAgICVyMCxSRCh0KSxSQih0KTsgIGFuZCAgICBXKHMpLFJDKHQpLFJCKHQpOyBcCithZGQgUkUodCksUkUodCksJXIwOyAgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgIHJvdGx3aSBSQih0KSxSQih0KSwzMDsgICBcCithZGQgUkUodCksUkUodCksVyhzKTsgYWRkICAgICVyMCwlcjAsJXI1OyAgICAgIGx3eiAgICBXKHMpLChzKSo0KCVyNCk7ICBcCithZGQgUkUodCksUkUodCksJXIwCisKKy8qCisgKiBUaGlzIGlzIGxpa2V3aXNlIGF3a3dhcmQsIDEzIGluc3RydWN0aW9ucy4gIEhvd2V2ZXIsIGl0IGNhbiBhbHNvCisgKiBleGVjdXRlIHN0YXJ0aW5nIHdpdGggMiBvdXQgb2YgMyBwb3NzaWJsZSBtb2R1bGksIHNvIGl0IGRvZXMgMiByb3VuZHMKKyAqIGluIDkgY3ljbGVzLCA0LjUgY3ljbGVzL3JvdW5kLgorICovCisjZGVmaW5lIFNURVBEMF9VUERBVEUodCxzLGxvYWRrLi4uKSBcCithZGQgUkUodCksUkUodCksVyh0KTsgYW5kYyAgICVyMCxSRCh0KSxSQih0KTsgeG9yICAgIFcocyksVygocyktMTYpLFcoKHMpLTMpOyBcCithZGQgUkUodCksUkUodCksJXIwOyAgYW5kICAgICVyMCxSQyh0KSxSQih0KTsgeG9yICAgIFcocyksVyhzKSxXKChzKS04KTsgICAgICBcCithZGQgUkUodCksUkUodCksJXIwOyAgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgeG9yICAgIFcocyksVyhzKSxXKChzKS0xNCk7ICAgICBcCithZGQgUkUodCksUkUodCksJXI1OyAgbG9hZGs7IHJvdGx3aSBSQih0KSxSQih0KSwzMDsgIHJvdGx3aSBXKHMpLFcocyksMTsgICAgIFwKK2FkZCBSRSh0KSxSRSh0KSwlcjAKKworLyogTmljZWx5IG9wdGltYWwuICBDb252ZW5pZW50bHksIGFsc28gdGhlIG1vc3QgY29tbW9uLiAqLworI2RlZmluZSBTVEVQRDFfVVBEQVRFKHQscyxsb2Fkay4uLikgXAorYWRkIFJFKHQpLFJFKHQpLFcodCk7IHhvciAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcoKHMpLTE2KSxXKChzKS0zKTsgXAorYWRkIFJFKHQpLFJFKHQpLCVyNTsgIGxvYWRrOyB4b3IgJXIwLCVyMCxSQyh0KTsgIHhvciBXKHMpLFcocyksVygocyktOCk7ICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSAlcjAsUkEodCksNTsgICAgIHhvciAgICBXKHMpLFcocyksVygocyktMTQpOyAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSBSQih0KSxSQih0KSwzMDsgIHJvdGx3aSBXKHMpLFcocyksMQorCisvKgorICogVGhlIG5ha2VkIHZlcnNpb24sIG5vIFVQREFURSwgZm9yIHRoZSBsYXN0IDQgcm91bmRzLiAgMyBjeWNsZXMgcGVyLgorICogV2UgY291bGQgdXNlIFcocykgYXMgYSB0ZW1wIHJlZ2lzdGVyLCBidXQgd2UgZG9uJ3QgbmVlZCBpdC4KKyAqLworI2RlZmluZSBTVEVQRDEodCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkICAgUkUodCksUkUodCksVyh0KTsgeG9yICAgICVyMCxSRCh0KSxSQih0KTsgXAorcm90bHdpIFJCKHQpLFJCKHQpLDMwOyAgYWRkICAgUkUodCksUkUodCksJXI1OyAgeG9yICAgICVyMCwlcjAsUkModCk7ICAgXAorYWRkICAgIFJFKHQpLFJFKHQpLCVyMDsgcm90bHdpICVyMCxSQSh0KSw1OyAgICAgLyogc3BhcmUgc2xvdCAqLyAgICAgICAgXAorYWRkICAgIFJFKHQpLFJFKHQpLCVyMAorCisvKgorICogMTQgaW5zdHJ1Y3Rpb25zLCA1IGN5Y2xlcyBwZXIuICBUaGUgbWFqb3JpdHkgZnVuY3Rpb24gaXMgYSBiaXQKKyAqIGF3a3dhcmQgdG8gY29tcHV0ZS4gIFRoaXMgY2FuIGV4ZWN1dGUgd2l0aCBhIDEtaW5zdHJ1Y3Rpb24gZGVsYXksCisgKiBidXQgaXQgY2F1c2VzIGEgMi1pbnN0cnVjdGlvbiBkZWxheSwgd2hpY2ggdHJpZ2dlcnMgYSBzdGFsbC4KKyAqLworI2RlZmluZSBTVEVQRDJfVVBEQVRFKHQscyxsb2Fkay4uLikgXAorYWRkIFJFKHQpLFJFKHQpLFcodCk7IGFuZCAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcoKHMpLTE2KSxXKChzKS0zKTsgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHhvciAgICAlcjAsUkQodCksUkIodCk7IHhvciAgICBXKHMpLFcocyksVygocyktOCk7ICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyNTsgIGxvYWRrOyBhbmQgJXIwLCVyMCxSQyh0KTsgIHhvciBXKHMpLFcocyksVygocyktMTQpOyAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSAlcjAsUkEodCksNTsgICAgIHJvdGx3aSBXKHMpLFcocyksMTsgICAgICAgICAgICAgXAorYWRkIFJFKHQpLFJFKHQpLCVyMDsgIHJvdGx3aSBSQih0KSxSQih0KSwzMAorCisjZGVmaW5lIFNURVAwX0xPQUQ0KHQscykJCVwKKwlTVEVQRDBfTE9BRCh0LHMpOwkJXAorCVNURVBEMF9MT0FEKCh0KzEpLChzKSsxKTsJXAorCVNURVBEMF9MT0FEKCh0KSsyLChzKSsyKTsJXAorCVNURVBEMF9MT0FEKCh0KSszLChzKSszKQorCisjZGVmaW5lIFNURVBVUDQoZm4sIHQsIHMsIGxvYWRrLi4uKQkJXAorCVNURVAjI2ZuIyNfVVBEQVRFKHQscywpOwkJXAorCVNURVAjI2ZuIyNfVVBEQVRFKCh0KSsxLChzKSsxLCk7CVwKKwlTVEVQIyNmbiMjX1VQREFURSgodCkrMiwocykrMiwpOwlcCisJU1RFUCMjZm4jI19VUERBVEUoKHQpKzMsKHMpKzMsbG9hZGspCisKKyNkZWZpbmUgU1RFUFVQMjAoZm4sIHQsIHMsIGxvYWRrLi4uKQlcCisJU1RFUFVQNChmbiwgdCwgcywpOwkJXAorCVNURVBVUDQoZm4sICh0KSs0LCAocykrNCwpOwlcCisJU1RFUFVQNChmbiwgKHQpKzgsIChzKSs4LCk7CVwKKwlTVEVQVVA0KGZuLCAodCkrMTIsIChzKSsxMiwpOwlcCisJU1RFUFVQNChmbiwgKHQpKzE2LCAocykrMTYsIGxvYWRrKQorCisJLmdsb2JsCXNoYTFfY29yZQorc2hhMV9jb3JlOgorCXN0d3UJJXIxLC04MCglcjEpCisJc3RtdwklcjEzLDQoJXIxKQorCisJLyogTG9hZCB1cCBBIC0gRSAqLworCWxtdwklcjI3LDAoJXIzKQorCisJbXRjdHIJJXI1CisKKzE6CisJTE9BRFcoMCkKKwlsaXMJJXI1LDB4NWE4MgorCW1yCVJFKDApLCVyMzEKKwlMT0FEVygxKQorCW1yCVJEKDApLCVyMzAKKwltcglSQygwKSwlcjI5CisJTE9BRFcoMikKKwlvcmkJJXI1LCVyNSwweDc5OTkJLyogSzAtMTkgKi8KKwltcglSQigwKSwlcjI4CisJTE9BRFcoMykKKwltcglSQSgwKSwlcjI3CisKKwlTVEVQMF9MT0FENCgwLCA0KQorCVNURVAwX0xPQUQ0KDQsIDgpCisJU1RFUDBfTE9BRDQoOCwgMTIpCisJU1RFUFVQNChEMCwgMTIsIDE2LCkKKwlTVEVQVVA0KEQwLCAxNiwgMjAsIGxpcyAlcjUsMHg2ZWQ5KQorCisJb3JpCSVyNSwlcjUsMHhlYmExCS8qIEsyMC0zOSAqLworCVNURVBVUDIwKEQxLCAyMCwgMjQsIGxpcyAlcjUsMHg4ZjFiKQorCisJb3JpCSVyNSwlcjUsMHhiY2RjCS8qIEs0MC01OSAqLworCVNURVBVUDIwKEQyLCA0MCwgNDQsIGxpcyAlcjUsMHhjYTYyKQorCisJb3JpCSVyNSwlcjUsMHhjMWQ2CS8qIEs2MC03OSAqLworCVNURVBVUDQoRDEsIDYwLCA2NCwpCisJU1RFUFVQNChEMSwgNjQsIDY4LCkKKwlTVEVQVVA0KEQxLCA2OCwgNzIsKQorCVNURVBVUDQoRDEsIDcyLCA3NiwpCisJYWRkaQklcjQsJXI0LDY0CisJU1RFUEQxKDc2KQorCVNURVBEMSg3NykKKwlTVEVQRDEoNzgpCisJU1RFUEQxKDc5KQorCisJLyogQWRkIHJlc3VsdHMgdG8gb3JpZ2luYWwgdmFsdWVzICovCisJYWRkCSVyMzEsJXIzMSxSRSgwKQorCWFkZAklcjMwLCVyMzAsUkQoMCkKKwlhZGQJJXIyOSwlcjI5LFJDKDApCisJYWRkCSVyMjgsJXIyOCxSQigwKQorCWFkZAklcjI3LCVyMjcsUkEoMCkKKworCWJkbnoJMWIKKworCS8qIFNhdmUgZmluYWwgaGFzaCwgcmVzdG9yZSByZWdpc3RlcnMsIGFuZCByZXR1cm4gKi8KKwlzdG13CSVyMjcsMCglcjMpCisJbG13CSVyMTMsNCglcjEpCisJYWRkaQklcjEsJXIxLDgwCisJYmxyCmRpZmYgLS1naXQgYS9xdW90ZS5jIGIvcXVvdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwZGNjCi0tLSAvZGV2L251bGwKKysrIGIvcXVvdGUuYwpAQCAtMCwwICsxLDI5MCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicXVvdGUuaCIKKworLyogSGVscCB0byBjb3B5IHRoZSB0aGluZyBwcm9wZXJseSBxdW90ZWQgZm9yIHRoZSBzaGVsbCBzYWZldHkuCisgKiBhbnkgc2luZ2xlIHF1b3RlIGlzIHJlcGxhY2VkIHdpdGggJ1wnJywgYW55IGV4Y2xhbWF0aW9uIHBvaW50CisgKiBpcyByZXBsYWNlZCB3aXRoICdcIScsIGFuZCB0aGUgd2hvbGUgdGhpbmcgaXMgZW5jbG9zZWQgaW4gYQorICoKKyAqIEUuZy4KKyAqICBvcmlnaW5hbCAgICAgc3FfcXVvdGUgICAgIHJlc3VsdAorICogIG5hbWUgICAgID09PiBuYW1lICAgICAgPT0+ICduYW1lJworICogIGEgYiAgICAgID09PiBhIGIgICAgICAgPT0+ICdhIGInCisgKiAgYSdiICAgICAgPT0+IGEnXCcnYiAgICA9PT4gJ2EnXCcnYicKKyAqICBhIWIgICAgICA9PT4gYSdcISdiICAgID09PiAnYSdcISdiJworICovCisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKHgpIGRvIHsgaWYgKCsrbGVuIDwgbikgKmJwKysgPSAoeCk7IH0gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSBpbnQgbmVlZF9ic19xdW90ZShjaGFyIGMpCit7CisJcmV0dXJuIChjID09ICdcJycgfHwgYyA9PSAnIScpOworfQorCitzaXplX3Qgc3FfcXVvdGVfYnVmKGNoYXIgKmRzdCwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyIGM7CisJY2hhciAqYnAgPSBkc3Q7CisJc2l6ZV90IGxlbiA9IDA7CisKKwlFTUlUKCdcJycpOworCXdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwkJaWYgKG5lZWRfYnNfcXVvdGUoYykpIHsKKwkJCUVNSVQoJ1wnJyk7CisJCQlFTUlUKCdcXCcpOworCQkJRU1JVChjKTsKKwkJCUVNSVQoJ1wnJyk7CisJCX0gZWxzZSB7CisJCQlFTUlUKGMpOworCQl9CisJfQorCUVNSVQoJ1wnJyk7CisKKwlpZiAoIG4gKQorCQkqYnAgPSAwOworCisJcmV0dXJuIGxlbjsKK30KKwordm9pZCBzcV9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyIGM7CisKKwlmcHV0YygnXCcnLCBzdHJlYW0pOworCXdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwkJaWYgKG5lZWRfYnNfcXVvdGUoYykpIHsKKwkJCWZwdXRzKCInXFwiLCBzdHJlYW0pOworCQkJZnB1dGMoYywgc3RyZWFtKTsKKwkJCWZwdXRjKCdcJycsIHN0cmVhbSk7CisJCX0gZWxzZSB7CisJCQlmcHV0YyhjLCBzdHJlYW0pOworCQl9CisJfQorCWZwdXRjKCdcJycsIHN0cmVhbSk7Cit9CisKK2NoYXIgKnNxX3F1b3RlKGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICpidWY7CisJc2l6ZV90IGNudDsKKworCWNudCA9IHNxX3F1b3RlX2J1ZihOVUxMLCAwLCBzcmMpICsgMTsKKwlidWYgPSB4bWFsbG9jKGNudCk7CisJc3FfcXVvdGVfYnVmKGJ1ZiwgY250LCBzcmMpOworCisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqc3FfZGVxdW90ZShjaGFyICphcmcpCit7CisJY2hhciAqZHN0ID0gYXJnOworCWNoYXIgKnNyYyA9IGFyZzsKKwljaGFyIGM7CisKKwlpZiAoKnNyYyAhPSAnXCcnKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKDs7KSB7CisJCWMgPSAqKytzcmM7CisJCWlmICghYykKKwkJCXJldHVybiBOVUxMOworCQlpZiAoYyAhPSAnXCcnKSB7CisJCQkqZHN0KysgPSBjOworCQkJY29udGludWU7CisJCX0KKwkJLyogV2Ugc3RlcHBlZCBvdXQgb2Ygc3EgKi8KKwkJc3dpdGNoICgqKytzcmMpIHsKKwkJY2FzZSAnXDAnOgorCQkJKmRzdCA9IDA7CisJCQlyZXR1cm4gYXJnOworCQljYXNlICdcXCc6CisJCQljID0gKisrc3JjOworCQkJaWYgKG5lZWRfYnNfcXVvdGUoYykgJiYgKisrc3JjID09ICdcJycpIHsKKwkJCQkqZHN0KysgPSBjOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkvKiBGYWxsdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDLXN0eWxlIG5hbWUgcXVvdGluZy4KKyAqCisgKiBEb2VzIG9uZSBvZiB0aHJlZSB0aGluZ3M6CisgKgorICogKDEpIGlmIG91dGJ1ZiBhbmQgb3V0ZnAgYXJlIGJvdGggTlVMTCwgaW5zcGVjdCB0aGUgaW5wdXQgbmFtZSBhbmQKKyAqICAgICBjb3VudHMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBuZWVkZWQgdG8gaG9sZCBjX3N0eWxlCisgKiAgICAgcXVvdGVkIHZlcnNpb24gb2YgbmFtZSwgY291bnRpbmcgdGhlIGRvdWJsZSBxdW90ZXMgYXJvdW5kCisgKiAgICAgaXQgYnV0IG5vdCB0ZXJtaW5hdGluZyBOVUwsIGFuZCByZXR1cm5zIGl0LiAgSG93ZXZlciwgaWYgbmFtZQorICogICAgIGRvZXMgbm90IG5lZWQgY19zdHlsZSBxdW90aW5nLCBpdCByZXR1cm5zIDAuCisgKgorICogKDIpIGlmIG91dGJ1ZiBpcyBub3QgTlVMTCwgaXQgbXVzdCBwb2ludCBhdCBhIGJ1ZmZlciBsYXJnZSBlbm91Z2gKKyAqICAgICB0byBob2xkIHRoZSBjX3N0eWxlIHF1b3RlZCB2ZXJzaW9uIG9mIG5hbWUsIGVuY2xvc2luZyBkb3VibGUKKyAqICAgICBxdW90ZXMsIGFuZCB0ZXJtaW5hdGluZyBOVUwuICBGaWxscyBvdXRidWYgd2l0aCBjX3N0eWxlIHF1b3RlZAorICogICAgIHZlcnNpb24gb2YgbmFtZSBlbmNsb3NlZCBpbiBkb3VibGUtcXVvdGUgcGFpci4gIFJldHVybiB2YWx1ZQorICogICAgIGlzIHVuZGVmaW5lZC4KKyAqCisgKiAoMykgaWYgb3V0ZnAgaXMgbm90IE5VTEwsIG91dHB1dHMgY19zdHlsZSBxdW90ZWQgdmVyc2lvbiBvZiBuYW1lLAorICogICAgIGJ1dCBub3QgZW5jbG9zZWQgaW4gZG91YmxlLXF1b3RlIHBhaXIuICBSZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLgorICovCisKK3N0YXRpYyBpbnQgcXVvdGVfY19zdHlsZV9jb3VudGVkKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSBjaGFyICpvdXRidWYsIEZJTEUgKm91dGZwLCBpbnQgbm9fZHEpCit7CisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKGMpIFwKKwkob3V0YnVmID8gKCpvdXRidWYrKyA9IChjKSkgOiBvdXRmcCA/IGZwdXRjKGMsIG91dGZwKSA6IChjb3VudCsrKSkKKworI2RlZmluZSBFTUlUUSgpIEVNSVQoJ1xcJykKKworCWNvbnN0IGNoYXIgKnNwOworCWludCBjaCwgY291bnQgPSAwLCBuZWVkcXVvdGUgPSAwOworCisJaWYgKCFub19kcSkKKwkJRU1JVCgnIicpOworCWZvciAoc3AgPSBuYW1lOyBzcCA8IG5hbWUgKyBuYW1lbGVuOyBzcCsrKSB7CisJCWNoID0gKnNwOworCQlpZiAoIWNoKQorCQkJYnJlYWs7CisJCWlmICgoY2ggPCAnICcpIHx8IChjaCA9PSAnIicpIHx8IChjaCA9PSAnXFwnKSB8fAorCQkgICAgKGNoID09IDAxNzcpKSB7CisJCQluZWVkcXVvdGUgPSAxOworCQkJc3dpdGNoIChjaCkgeworCQkJY2FzZSAnXGEnOiBFTUlUUSgpOyBjaCA9ICdhJzsgYnJlYWs7CisJCQljYXNlICdcYic6IEVNSVRRKCk7IGNoID0gJ2InOyBicmVhazsKKwkJCWNhc2UgJ1xmJzogRU1JVFEoKTsgY2ggPSAnZic7IGJyZWFrOworCQkJY2FzZSAnXG4nOiBFTUlUUSgpOyBjaCA9ICduJzsgYnJlYWs7CisJCQljYXNlICdccic6IEVNSVRRKCk7IGNoID0gJ3InOyBicmVhazsKKwkJCWNhc2UgJ1x0JzogRU1JVFEoKTsgY2ggPSAndCc7IGJyZWFrOworCQkJY2FzZSAnXHYnOiBFTUlUUSgpOyBjaCA9ICd2JzsgYnJlYWs7CisKKwkJCWNhc2UgJ1xcJzogLyogZmFsbHRocnUgKi8KKwkJCWNhc2UgJyInOiBFTUlUUSgpOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogb2N0YWwgKi8KKwkJCQlFTUlUUSgpOworCQkJCUVNSVQoKChjaCA+PiA2KSAmIDAzKSArICcwJyk7CisJCQkJRU1JVCgoKGNoID4+IDMpICYgMDcpICsgJzAnKTsKKwkJCQljaCA9IChjaCAmIDA3KSArICcwJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlFTUlUKGNoKTsKKwl9CisJaWYgKCFub19kcSkKKwkJRU1JVCgnIicpOworCWlmIChvdXRidWYpCisJCSpvdXRidWYgPSAwOworCisJcmV0dXJuIG5lZWRxdW90ZSA/IGNvdW50IDogMDsKK30KKworaW50IHF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqb3V0YnVmLCBGSUxFICpvdXRmcCwgaW50IG5vX2RxKQoreworCWludCBjbnQgPSBzdHJsZW4obmFtZSk7CisJcmV0dXJuIHF1b3RlX2Nfc3R5bGVfY291bnRlZChuYW1lLCBjbnQsIG91dGJ1Ziwgb3V0ZnAsIG5vX2RxKTsKK30KKworLyoKKyAqIEMtc3R5bGUgbmFtZSB1bnF1b3RpbmcuCisgKgorICogUXVvdGVkIHNob3VsZCBwb2ludCBhdCB0aGUgb3BlbmluZyBkb3VibGUgcXVvdGUuICBSZXR1cm5zCisgKiBhbiBhbGxvY2F0ZWQgbWVtb3J5IHRoYXQgaG9sZHMgdW5xdW90ZWQgbmFtZSwgd2hpY2ggdGhlIGNhbGxlcgorICogc2hvdWxkIGZyZWUgd2hlbiBkb25lLiAgVXBkYXRlcyBlbmRwIHBvaW50ZXIgdG8gcG9pbnQgYXQKKyAqIG9uZSBwYXN0IHRoZSBlbmRpbmcgZG91YmxlIHF1b3RlIGlmIGdpdmVuLgorICovCisKK2NoYXIgKnVucXVvdGVfY19zdHlsZShjb25zdCBjaGFyICpxdW90ZWQsIGNvbnN0IGNoYXIgKiplbmRwKQoreworCWNvbnN0IGNoYXIgKnNwOworCWNoYXIgKm5hbWUgPSBOVUxMLCAqb3V0cCA9IE5VTEw7CisJaW50IGNvdW50ID0gMCwgY2gsIGFjOworCisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKGMpIChvdXRwID8gKCpvdXRwKysgPSAoYykpIDogKGNvdW50KyspKQorCisJaWYgKCpxdW90ZWQrKyAhPSAnIicpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJLyogZmlyc3QgcGFzcyBjb3VudHMgYW5kIGFsbG9jYXRlcywgc2Vjb25kIHBhc3MgZmlsbHMgKi8KKwkJZm9yIChzcCA9IHF1b3RlZDsgKGNoID0gKnNwKyspICE9ICciJzsgKSB7CisJCQlpZiAoY2ggPT0gJ1xcJykgeworCQkJCXN3aXRjaCAoY2ggPSAqc3ArKykgeworCQkJCWNhc2UgJ2EnOiBjaCA9ICdcYSc7IGJyZWFrOworCQkJCWNhc2UgJ2InOiBjaCA9ICdcYic7IGJyZWFrOworCQkJCWNhc2UgJ2YnOiBjaCA9ICdcZic7IGJyZWFrOworCQkJCWNhc2UgJ24nOiBjaCA9ICdcbic7IGJyZWFrOworCQkJCWNhc2UgJ3InOiBjaCA9ICdccic7IGJyZWFrOworCQkJCWNhc2UgJ3QnOiBjaCA9ICdcdCc7IGJyZWFrOworCQkJCWNhc2UgJ3YnOiBjaCA9ICdcdic7IGJyZWFrOworCisJCQkJY2FzZSAnXFwnOiBjYXNlICciJzoKKwkJCQkJYnJlYWs7IC8qIHZlcmJhdGltICovCisKKwkJCQljYXNlICcwJzoKKwkJCQljYXNlICcxJzoKKwkJCQljYXNlICcyJzoKKwkJCQljYXNlICczJzoKKwkJCQljYXNlICc0JzoKKwkJCQljYXNlICc1JzoKKwkJCQljYXNlICc2JzoKKwkJCQljYXNlICc3JzoKKwkJCQkJLyogb2N0YWwgKi8KKwkJCQkJYWMgPSAoKGNoIC0gJzAnKSA8PCA2KTsKKwkJCQkJaWYgKChjaCA9ICpzcCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQlhYyB8PSAoKGNoIC0gJzAnKSA8PCAzKTsKKwkJCQkJaWYgKChjaCA9ICpzcCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQkJCXJldHVybiBOVUxMOworCQkJCQlhYyB8PSAoY2ggLSAnMCcpOworCQkJCQljaCA9IGFjOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTlVMTDsgLyogbWFsZm9ybWVkICovCisJCQkJfQorCQkJfQorCQkJRU1JVChjaCk7CisJCX0KKworCQlpZiAobmFtZSkgeworCQkJKm91dHAgPSAwOworCQkJaWYgKGVuZHApCisJCQkJKmVuZHAgPSBzcDsKKwkJCXJldHVybiBuYW1lOworCQl9CisJCW91dHAgPSBuYW1lID0geG1hbGxvYyhjb3VudCArIDEpOworCX0KK30KKwordm9pZCB3cml0ZV9uYW1lX3F1b3RlZChjb25zdCBjaGFyICpwcmVmaXgsIGludCBwcmVmaXhfbGVuLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHF1b3RlLCBGSUxFICpvdXQpCit7CisJaW50IG5lZWRxdW90ZTsKKworCWlmICghcXVvdGUpIHsKKwlub19xdW90ZToKKwkJaWYgKHByZWZpeF9sZW4pCisJCQlmcHJpbnRmKG91dCwgIiUuKnMiLCBwcmVmaXhfbGVuLCBwcmVmaXgpOworCQlmcHV0cyhuYW1lLCBvdXQpOworCQlyZXR1cm47CisJfQorCisJbmVlZHF1b3RlID0gMDsKKwlpZiAocHJlZml4X2xlbikKKwkJbmVlZHF1b3RlID0gcXVvdGVfY19zdHlsZV9jb3VudGVkKHByZWZpeCwgcHJlZml4X2xlbiwKKwkJCQkJCSAgTlVMTCwgTlVMTCwgMCk7CisJaWYgKCFuZWVkcXVvdGUpCisJCW5lZWRxdW90ZSA9IHF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgTlVMTCwgMCk7CisJaWYgKG5lZWRxdW90ZSkgeworCQlmcHV0YygnIicsIG91dCk7CisJCWlmIChwcmVmaXhfbGVuKQorCQkJcXVvdGVfY19zdHlsZV9jb3VudGVkKHByZWZpeCwgcHJlZml4X2xlbiwKKwkJCQkJICAgICAgTlVMTCwgb3V0LCAxKTsKKwkJcXVvdGVfY19zdHlsZShuYW1lLCBOVUxMLCBvdXQsIDEpOworCQlmcHV0YygnIicsIG91dCk7CisJfQorCWVsc2UKKwkJZ290byBub19xdW90ZTsKK30KZGlmZiAtLWdpdCBhL3F1b3RlLmggYi9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTQ4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9xdW90ZS5oCkBAIC0wLDAgKzEsNDggQEAKKyNpZm5kZWYgUVVPVEVfSAorI2RlZmluZSBRVU9URV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBIZWxwIHRvIGNvcHkgdGhlIHRoaW5nIHByb3Blcmx5IHF1b3RlZCBmb3IgdGhlIHNoZWxsIHNhZmV0eS4KKyAqIGFueSBzaW5nbGUgcXVvdGUgaXMgcmVwbGFjZWQgd2l0aCAnXCcnLCBhbnkgZXhjbGFtYXRpb24gcG9pbnQKKyAqIGlzIHJlcGxhY2VkIHdpdGggJ1whJywgYW5kIHRoZSB3aG9sZSB0aGluZyBpcyBlbmNsb3NlZCBpbiBhCisgKiBzaW5nbGUgcXVvdGUgcGFpci4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBwYXNzaW5nIHRoZSByZXN1bHQgdG8gc3lzdGVtKCkgYXMgYW4KKyAqIGFyZ3VtZW50OgorICoKKyAqIHNwcmludGYoY21kLCAiZm9vYmFyICVzICVzIiwgc3FfcXVvdGUoYXJnMCksIHNxX3F1b3RlKGFyZzEpKQorICoKKyAqIHdvdWxkIGJlIGFwcHJvcHJpYXRlLiAgSWYgdGhlIHN5c3RlbSgpIGlzIGdvaW5nIHRvIGNhbGwgc3NoIHRvCisgKiBydW4gdGhlIGNvbW1hbmQgb24gdGhlIG90aGVyIHNpZGU6CisgKgorICogc3ByaW50ZihjbWQsICJnaXQtZGlmZi10cmVlICVzICVzIiwgc3FfcXVvdGUoYXJnMCksIHNxX3F1b3RlKGFyZzEpKTsKKyAqIHNwcmludGYocmNtZCwgInNzaCAlcyAlcyIsIHNxX3F1b3RlKGhvc3QpLCBzcV9xdW90ZShjbWQpKTsKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGFib3ZlIGV4YW1wbGVzIGxlYWsgbWVtb3J5ISAgUmVtZW1iZXIgdG8gZnJlZSByZXN1bHQgZnJvbQorICogc3FfcXVvdGUoKSBpbiBhIHJlYWwgYXBwbGljYXRpb24uCisgKgorICogc3FfcXVvdGVfYnVmKCkgd3JpdGVzIHRvIGFuIGV4aXN0aW5nIGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZTsgaXQKKyAqIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuCisgKiBleGNsdWRpbmcgdGhlIGZpbmFsIG51bGwgcmVnYXJkbGVzcyBvZiB0aGUgYnVmZmVyIHNpemUuCisgKi8KKworZXh0ZXJuIGNoYXIgKnNxX3F1b3RlKGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gdm9pZCBzcV9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gc2l6ZV90IHNxX3F1b3RlX2J1ZihjaGFyICpkc3QsIHNpemVfdCBuLCBjb25zdCBjaGFyICpzcmMpOworCisvKiBUaGlzIHVud3JhcHMgd2hhdCBzcV9xdW90ZSgpIHByb2R1Y2VzIGluIHBsYWNlLCBidXQgcmV0dXJucworICogTlVMTCBpZiB0aGUgaW5wdXQgZG9lcyBub3QgbG9vayBsaWtlIHdoYXQgc3FfcXVvdGUgd291bGQgaGF2ZQorICogcHJvZHVjZWQuCisgKi8KK2V4dGVybiBjaGFyICpzcV9kZXF1b3RlKGNoYXIgKik7CisKK2V4dGVybiBpbnQgcXVvdGVfY19zdHlsZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICpvdXRidWYsIEZJTEUgKm91dGZwLAorCQkJIGludCBub2RxKTsKK2V4dGVybiBjaGFyICp1bnF1b3RlX2Nfc3R5bGUoY29uc3QgY2hhciAqcXVvdGVkLCBjb25zdCBjaGFyICoqZW5kcCk7CisKK2V4dGVybiB2b2lkIHdyaXRlX25hbWVfcXVvdGVkKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IHByZWZpeF9sZW4sCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgcXVvdGUsIEZJTEUgKm91dCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmVhZC1jYWNoZS5jIGIvcmVhZC1jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmNkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWFkLWNhY2hlLmMKQEAgLTAsMCArMSw5ODcgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKi8KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNhY2hlLXRyZWUuaCIKKworLyogSW5kZXggZXh0ZW5zaW9ucy4KKyAqCisgKiBUaGUgZmlyc3QgbGV0dGVyIHNob3VsZCBiZSAnQScuLidaJyBmb3IgZXh0ZW5zaW9ucyB0aGF0IGFyZSBub3QKKyAqIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IG9wZXJhdGlvbiAoaS5lLiBvcHRpbWl6YXRpb24gZGF0YSkuCisgKiBXaGVuIG5ldyBleHRlbnNpb25zIGFyZSBhZGRlZCB0aGF0IF9uZWVkc18gdG8gYmUgdW5kZXJzdG9vZCBpbgorICogb3JkZXIgdG8gY29ycmVjdGx5IGludGVycHJldCB0aGUgaW5kZXggZmlsZSwgcGljayBjaGFyYWN0ZXIgdGhhdAorICogaXMgb3V0c2lkZSB0aGUgcmFuZ2UsIHRvIGNhdXNlIHRoZSByZWFkZXIgdG8gYWJvcnQuCisgKi8KKworI2RlZmluZSBDQUNIRV9FWFQocykgKCAoc1swXTw8MjQpfChzWzFdPDwxNil8KHNbMl08PDgpfChzWzNdKSApCisjZGVmaW5lIENBQ0hFX0VYVF9UUkVFIDB4NTQ1MjQ1NDUJLyogIlRSRUUiICovCisKK3N0cnVjdCBjYWNoZV9lbnRyeSAqKmFjdGl2ZV9jYWNoZSA9IE5VTEw7CitzdGF0aWMgdGltZV90IGluZGV4X2ZpbGVfdGltZXN0YW1wOwordW5zaWduZWQgaW50IGFjdGl2ZV9uciA9IDAsIGFjdGl2ZV9hbGxvYyA9IDAsIGFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMDsKKworc3RydWN0IGNhY2hlX3RyZWUgKmFjdGl2ZV9jYWNoZV90cmVlID0gTlVMTDsKKworaW50IGNhY2hlX2Vycm5vID0gMDsKKworc3RhdGljIHZvaWQgKmNhY2hlX21tYXAgPSBOVUxMOworc3RhdGljIHNpemVfdCBjYWNoZV9tbWFwX3NpemUgPSAwOworCisvKgorICogVGhpcyBvbmx5IHVwZGF0ZXMgdGhlICJub24tY3JpdGljYWwiIHBhcnRzIG9mIHRoZSBkaXJlY3RvcnkKKyAqIGNhY2hlLCBpZSB0aGUgcGFydHMgdGhhdCBhcmVuJ3QgdHJhY2tlZCBieSBHSVQsIGFuZCBvbmx5IHVzZWQKKyAqIHRvIHZhbGlkYXRlIHRoZSBjYWNoZS4KKyAqLwordm9pZCBmaWxsX3N0YXRfY2FjaGVfaW5mbyhzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3Qgc3RhdCAqc3QpCit7CisJY2UtPmNlX2N0aW1lLnNlYyA9IGh0b25sKHN0LT5zdF9jdGltZSk7CisJY2UtPmNlX210aW1lLnNlYyA9IGh0b25sKHN0LT5zdF9tdGltZSk7CisjaWZkZWYgVVNFX05TRUMKKwljZS0+Y2VfY3RpbWUubnNlYyA9IGh0b25sKHN0LT5zdF9jdGltLnR2X25zZWMpOworCWNlLT5jZV9tdGltZS5uc2VjID0gaHRvbmwoc3QtPnN0X210aW0udHZfbnNlYyk7CisjZW5kaWYKKwljZS0+Y2VfZGV2ID0gaHRvbmwoc3QtPnN0X2Rldik7CisJY2UtPmNlX2lubyA9IGh0b25sKHN0LT5zdF9pbm8pOworCWNlLT5jZV91aWQgPSBodG9ubChzdC0+c3RfdWlkKTsKKwljZS0+Y2VfZ2lkID0gaHRvbmwoc3QtPnN0X2dpZCk7CisJY2UtPmNlX3NpemUgPSBodG9ubChzdC0+c3Rfc2l6ZSk7CisKKwlpZiAoYXNzdW1lX3VuY2hhbmdlZCkKKwkJY2UtPmNlX2ZsYWdzIHw9IGh0b25zKENFX1ZBTElEKTsKK30KKworc3RhdGljIGludCBjZV9jb21wYXJlX2RhdGEoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCWludCBtYXRjaCA9IC0xOworCWludCBmZCA9IG9wZW4oY2UtPm5hbWUsIE9fUkRPTkxZKTsKKworCWlmIChmZCA+PSAwKSB7CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWlmICghaW5kZXhfZmQoc2hhMSwgZmQsIHN0LCAwLCBOVUxMKSkKKwkJCW1hdGNoID0gbWVtY21wKHNoYTEsIGNlLT5zaGExLCAyMCk7CisJCS8qIGluZGV4X2ZkKCkgY2xvc2VkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYWxyZWFkeSAqLworCX0KKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBpbnQgY2VfY29tcGFyZV9saW5rKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHVuc2lnbmVkIGxvbmcgZXhwZWN0ZWRfc2l6ZSkKK3sKKwlpbnQgbWF0Y2ggPSAtMTsKKwljaGFyICp0YXJnZXQ7CisJdm9pZCAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwljaGFyIHR5cGVbMTBdOworCWludCBsZW47CisKKwl0YXJnZXQgPSB4bWFsbG9jKGV4cGVjdGVkX3NpemUpOworCWxlbiA9IHJlYWRsaW5rKGNlLT5uYW1lLCB0YXJnZXQsIGV4cGVjdGVkX3NpemUpOworCWlmIChsZW4gIT0gZXhwZWN0ZWRfc2l6ZSkgeworCQlmcmVlKHRhcmdldCk7CisJCXJldHVybiAtMTsKKwl9CisJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoY2UtPnNoYTEsIHR5cGUsICZzaXplKTsKKwlpZiAoIWJ1ZmZlcikgeworCQlmcmVlKHRhcmdldCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHNpemUgPT0gZXhwZWN0ZWRfc2l6ZSkKKwkJbWF0Y2ggPSBtZW1jbXAoYnVmZmVyLCB0YXJnZXQsIHNpemUpOworCWZyZWUoYnVmZmVyKTsKKwlmcmVlKHRhcmdldCk7CisJcmV0dXJuIG1hdGNoOworfQorCitzdGF0aWMgaW50IGNlX21vZGlmaWVkX2NoZWNrX2ZzKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlzd2l0Y2ggKHN0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQlpZiAoY2VfY29tcGFyZV9kYXRhKGNlLCBzdCkpCisJCQlyZXR1cm4gREFUQV9DSEFOR0VEOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCWlmIChjZV9jb21wYXJlX2xpbmsoY2UsIHN0LT5zdF9zaXplKSkKKwkJCXJldHVybiBEQVRBX0NIQU5HRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBUWVBFX0NIQU5HRUQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlX21hdGNoX3N0YXRfYmFzaWMoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgc3RydWN0IHN0YXQgKnN0KQoreworCXVuc2lnbmVkIGludCBjaGFuZ2VkID0gMDsKKworCXN3aXRjaCAobnRvaGwoY2UtPmNlX21vZGUpICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQljaGFuZ2VkIHw9ICFTX0lTUkVHKHN0LT5zdF9tb2RlKSA/IFRZUEVfQ0hBTkdFRCA6IDA7CisJCS8qIFdlIGNvbnNpZGVyIG9ubHkgdGhlIG93bmVyIHggYml0IHRvIGJlIHJlbGV2YW50IGZvcgorCQkgKiAibW9kZSBjaGFuZ2VzIgorCQkgKi8KKwkJaWYgKHRydXN0X2V4ZWN1dGFibGVfYml0ICYmCisJCSAgICAoMDEwMCAmIChudG9obChjZS0+Y2VfbW9kZSkgXiBzdC0+c3RfbW9kZSkpKQorCQkJY2hhbmdlZCB8PSBNT0RFX0NIQU5HRUQ7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJY2hhbmdlZCB8PSAhU19JU0xOSyhzdC0+c3RfbW9kZSkgPyBUWVBFX0NIQU5HRUQgOiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoImludGVybmFsIGVycm9yOiBjZV9tb2RlIGlzICVvIiwgbnRvaGwoY2UtPmNlX21vZGUpKTsKKwl9CisJaWYgKGNlLT5jZV9tdGltZS5zZWMgIT0gaHRvbmwoc3QtPnN0X210aW1lKSkKKwkJY2hhbmdlZCB8PSBNVElNRV9DSEFOR0VEOworCWlmIChjZS0+Y2VfY3RpbWUuc2VjICE9IGh0b25sKHN0LT5zdF9jdGltZSkpCisJCWNoYW5nZWQgfD0gQ1RJTUVfQ0hBTkdFRDsKKworI2lmZGVmIFVTRV9OU0VDCisJLyoKKwkgKiBuc2VjIHNlZW1zIHVucmVsaWFibGUgLSBub3QgYWxsIGZpbGVzeXN0ZW1zIHN1cHBvcnQgaXQsIHNvCisJICogYXMgbG9uZyBhcyBpdCBpcyBpbiB0aGUgaW5vZGUgY2FjaGUgeW91IGdldCByaWdodCBuc2VjCisJICogYnV0IGFmdGVyIGl0IGdldHMgZmx1c2hlZCwgeW91IGdldCB6ZXJvIG5zZWMuCisJICovCisJaWYgKGNlLT5jZV9tdGltZS5uc2VjICE9IGh0b25sKHN0LT5zdF9tdGltLnR2X25zZWMpKQorCQljaGFuZ2VkIHw9IE1USU1FX0NIQU5HRUQ7CisJaWYgKGNlLT5jZV9jdGltZS5uc2VjICE9IGh0b25sKHN0LT5zdF9jdGltLnR2X25zZWMpKQorCQljaGFuZ2VkIHw9IENUSU1FX0NIQU5HRUQ7CisjZW5kaWYJCisKKwlpZiAoY2UtPmNlX3VpZCAhPSBodG9ubChzdC0+c3RfdWlkKSB8fAorCSAgICBjZS0+Y2VfZ2lkICE9IGh0b25sKHN0LT5zdF9naWQpKQorCQljaGFuZ2VkIHw9IE9XTkVSX0NIQU5HRUQ7CisJaWYgKGNlLT5jZV9pbm8gIT0gaHRvbmwoc3QtPnN0X2lubykpCisJCWNoYW5nZWQgfD0gSU5PREVfQ0hBTkdFRDsKKworI2lmZGVmIFVTRV9TVERFVgorCS8qCisJICogc3RfZGV2IGJyZWFrcyBvbiBuZXR3b3JrIGZpbGVzeXN0ZW1zIHdoZXJlIGRpZmZlcmVudAorCSAqIGNsaWVudHMgd2lsbCBoYXZlIGRpZmZlcmVudCB2aWV3cyBvZiB3aGF0ICJkZXZpY2UiCisJICogdGhlIGZpbGVzeXN0ZW0gaXMgb24KKwkgKi8KKwlpZiAoY2UtPmNlX2RldiAhPSBodG9ubChzdC0+c3RfZGV2KSkKKwkJY2hhbmdlZCB8PSBJTk9ERV9DSEFOR0VEOworI2VuZGlmCisKKwlpZiAoY2UtPmNlX3NpemUgIT0gaHRvbmwoc3QtPnN0X3NpemUpKQorCQljaGFuZ2VkIHw9IERBVEFfQ0hBTkdFRDsKKworCXJldHVybiBjaGFuZ2VkOworfQorCitpbnQgY2VfbWF0Y2hfc3RhdChzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBzdHJ1Y3Qgc3RhdCAqc3QsIGludCBpZ25vcmVfdmFsaWQpCit7CisJdW5zaWduZWQgaW50IGNoYW5nZWQ7CisKKwkvKgorCSAqIElmIGl0J3MgbWFya2VkIGFzIGFsd2F5cyB2YWxpZCBpbiB0aGUgaW5kZXgsIGl0J3MKKwkgKiB2YWxpZCB3aGF0ZXZlciB0aGUgY2hlY2tlZC1vdXQgY29weSBzYXlzLgorCSAqLworCWlmICghaWdub3JlX3ZhbGlkICYmIChjZS0+Y2VfZmxhZ3MgJiBodG9ucyhDRV9WQUxJRCkpKQorCQlyZXR1cm4gMDsKKworCWNoYW5nZWQgPSBjZV9tYXRjaF9zdGF0X2Jhc2ljKGNlLCBzdCk7CisKKwkvKgorCSAqIFdpdGhpbiAxIHNlY29uZCBvZiB0aGlzIHNlcXVlbmNlOgorCSAqIAllY2hvIHh5enp5ID5maWxlICYmIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZQorCSAqIHJ1bm5pbmcgdGhpcyBjb21tYW5kOgorCSAqIAllY2hvIGZyb3R6ID5maWxlCisJICogd291bGQgZ2l2ZSBhIGZhbHNlbHkgY2xlYW4gY2FjaGUgZW50cnkuICBUaGUgbXRpbWUgYW5kCisJICogbGVuZ3RoIG1hdGNoIHRoZSBjYWNoZSwgYW5kIG90aGVyIHN0YXQgZmllbGRzIGRvIG5vdCBjaGFuZ2UuCisJICoKKwkgKiBXZSBjb3VsZCBkZXRlY3QgdGhpcyBhdCB1cGRhdGUtaW5kZXggdGltZSAodGhlIGNhY2hlIGVudHJ5CisJICogYmVpbmcgcmVnaXN0ZXJlZC91cGRhdGVkIHJlY29yZHMgdGhlIHNhbWUgdGltZSBhcyAibm93IikKKwkgKiBhbmQgZGVsYXkgdGhlIHJldHVybiBmcm9tIGdpdC11cGRhdGUtaW5kZXgsIGJ1dCB0aGF0IHdvdWxkCisJICogZWZmZWN0aXZlbHkgbWVhbiB3ZSBjYW4gbWFrZSBhdCBtb3N0IG9uZSBjb21taXQgcGVyIHNlY29uZCwKKwkgKiB3aGljaCBpcyBub3QgYWNjZXB0YWJsZS4gIEluc3RlYWQsIHdlIGNoZWNrIGNhY2hlIGVudHJpZXMKKwkgKiB3aG9zZSBtdGltZSBhcmUgdGhlIHNhbWUgYXMgdGhlIGluZGV4IGZpbGUgdGltZXN0YW1wIG1vcmUKKwkgKiBjYXJlZnVsbHkgdGhhbiBvdGhlcnMuCisJICovCisJaWYgKCFjaGFuZ2VkICYmCisJICAgIGluZGV4X2ZpbGVfdGltZXN0YW1wICYmCisJICAgIGluZGV4X2ZpbGVfdGltZXN0YW1wIDw9IG50b2hsKGNlLT5jZV9tdGltZS5zZWMpKQorCQljaGFuZ2VkIHw9IGNlX21vZGlmaWVkX2NoZWNrX2ZzKGNlLCBzdCk7CisKKwlyZXR1cm4gY2hhbmdlZDsKK30KKworaW50IGNlX21vZGlmaWVkKHN0cnVjdCBjYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBzdGF0ICpzdCwgaW50IHJlYWxseSkKK3sKKwlpbnQgY2hhbmdlZCwgY2hhbmdlZF9mczsKKwljaGFuZ2VkID0gY2VfbWF0Y2hfc3RhdChjZSwgc3QsIHJlYWxseSk7CisJaWYgKCFjaGFuZ2VkKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIElmIHRoZSBtb2RlIG9yIHR5cGUgaGFzIGNoYW5nZWQsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJ5aW5nCisJICogdG8gcmVmcmVzaCB0aGUgZW50cnkgLSBpdCdzIG5vdCBnb2luZyB0byBtYXRjaAorCSAqLworCWlmIChjaGFuZ2VkICYgKE1PREVfQ0hBTkdFRCB8IFRZUEVfQ0hBTkdFRCkpCisJCXJldHVybiBjaGFuZ2VkOworCisJLyogSW1tZWRpYXRlbHkgYWZ0ZXIgcmVhZC10cmVlIG9yIHVwZGF0ZS1pbmRleCAtLWNhY2hlaW5mbywKKwkgKiB0aGUgbGVuZ3RoIGZpZWxkIGlzIHplcm8uICBGb3Igb3RoZXIgY2FzZXMgdGhlIGNlX3NpemUKKwkgKiBzaG91bGQgbWF0Y2ggdGhlIFNIQTEgcmVjb3JkZWQgaW4gdGhlIGluZGV4IGVudHJ5LgorCSAqLworCWlmICgoY2hhbmdlZCAmIERBVEFfQ0hBTkdFRCkgJiYgY2UtPmNlX3NpemUgIT0gaHRvbmwoMCkpCisJCXJldHVybiBjaGFuZ2VkOworCisJY2hhbmdlZF9mcyA9IGNlX21vZGlmaWVkX2NoZWNrX2ZzKGNlLCBzdCk7CisJaWYgKGNoYW5nZWRfZnMpCisJCXJldHVybiBjaGFuZ2VkIHwgY2hhbmdlZF9mczsKKwlyZXR1cm4gMDsKK30KKworaW50IGJhc2VfbmFtZV9jb21wYXJlKGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgbGVuMSwgaW50IG1vZGUxLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lMiwgaW50IGxlbjIsIGludCBtb2RlMikKK3sKKwl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKwlpbnQgbGVuID0gbGVuMSA8IGxlbjIgPyBsZW4xIDogbGVuMjsKKwlpbnQgY21wOworCisJY21wID0gbWVtY21wKG5hbWUxLCBuYW1lMiwgbGVuKTsKKwlpZiAoY21wKQorCQlyZXR1cm4gY21wOworCWMxID0gbmFtZTFbbGVuXTsKKwljMiA9IG5hbWUyW2xlbl07CisJaWYgKCFjMSAmJiBTX0lTRElSKG1vZGUxKSkKKwkJYzEgPSAnLyc7CisJaWYgKCFjMiAmJiBTX0lTRElSKG1vZGUyKSkKKwkJYzIgPSAnLyc7CisJcmV0dXJuIChjMSA8IGMyKSA/IC0xIDogKGMxID4gYzIpID8gMSA6IDA7Cit9CisKK2ludCBjYWNoZV9uYW1lX2NvbXBhcmUoY29uc3QgY2hhciAqbmFtZTEsIGludCBmbGFnczEsIGNvbnN0IGNoYXIgKm5hbWUyLCBpbnQgZmxhZ3MyKQoreworCWludCBsZW4xID0gZmxhZ3MxICYgQ0VfTkFNRU1BU0s7CisJaW50IGxlbjIgPSBmbGFnczIgJiBDRV9OQU1FTUFTSzsKKwlpbnQgbGVuID0gbGVuMSA8IGxlbjIgPyBsZW4xIDogbGVuMjsKKwlpbnQgY21wOworCisJY21wID0gbWVtY21wKG5hbWUxLCBuYW1lMiwgbGVuKTsKKwlpZiAoY21wKQorCQlyZXR1cm4gY21wOworCWlmIChsZW4xIDwgbGVuMikKKwkJcmV0dXJuIC0xOworCWlmIChsZW4xID4gbGVuMikKKwkJcmV0dXJuIDE7CisKKwkvKiBDb21wYXJlIHN0YWdlcyAgKi8KKwlmbGFnczEgJj0gQ0VfU1RBR0VNQVNLOworCWZsYWdzMiAmPSBDRV9TVEFHRU1BU0s7CisKKwlpZiAoZmxhZ3MxIDwgZmxhZ3MyKQorCQlyZXR1cm4gLTE7CisJaWYgKGZsYWdzMSA+IGZsYWdzMikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjYWNoZV9uYW1lX3Bvcyhjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IDA7CisJbGFzdCA9IGFjdGl2ZV9ucjsKKwl3aGlsZSAobGFzdCA+IGZpcnN0KSB7CisJCWludCBuZXh0ID0gKGxhc3QgKyBmaXJzdCkgPj4gMTsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSA9IGFjdGl2ZV9jYWNoZVtuZXh0XTsKKwkJaW50IGNtcCA9IGNhY2hlX25hbWVfY29tcGFyZShuYW1lLCBuYW1lbGVuLCBjZS0+bmFtZSwgbnRvaHMoY2UtPmNlX2ZsYWdzKSk7CisJCWlmICghY21wKQorCQkJcmV0dXJuIG5leHQ7CisJCWlmIChjbXAgPCAwKSB7CisJCQlsYXN0ID0gbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZpcnN0ID0gbmV4dCsxOworCX0KKwlyZXR1cm4gLWZpcnN0LTE7Cit9CisKKy8qIFJlbW92ZSBlbnRyeSwgcmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgZW50cmllcyB0byBnby4uICovCitpbnQgcmVtb3ZlX2NhY2hlX2VudHJ5X2F0KGludCBwb3MpCit7CisJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAxOworCWFjdGl2ZV9uci0tOworCWlmIChwb3MgPj0gYWN0aXZlX25yKQorCQlyZXR1cm4gMDsKKwltZW1tb3ZlKGFjdGl2ZV9jYWNoZSArIHBvcywgYWN0aXZlX2NhY2hlICsgcG9zICsgMSwgKGFjdGl2ZV9uciAtIHBvcykgKiBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHJlbW92ZV9maWxlX2Zyb21fY2FjaGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcG9zID0gY2FjaGVfbmFtZV9wb3MocGF0aCwgc3RybGVuKHBhdGgpKTsKKwlpZiAocG9zIDwgMCkKKwkJcG9zID0gLXBvcy0xOworCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIgJiYgIXN0cmNtcChhY3RpdmVfY2FjaGVbcG9zXS0+bmFtZSwgcGF0aCkpCisJCXJlbW92ZV9jYWNoZV9lbnRyeV9hdChwb3MpOworCXJldHVybiAwOworfQorCitpbnQgYWRkX2ZpbGVfdG9faW5kZXgoY29uc3QgY2hhciAqcGF0aCwgaW50IHZlcmJvc2UpCit7CisJaW50IHNpemUsIG5hbWVsZW47CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGNhY2hlX2VudHJ5ICpjZTsKKworCWlmIChsc3RhdChwYXRoLCAmc3QpKQorCQlkaWUoIiVzOiB1bmFibGUgdG8gc3RhdCAoJXMpIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKworCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSAmJiAhU19JU0xOSyhzdC5zdF9tb2RlKSkKKwkJZGllKCIlczogY2FuIG9ubHkgYWRkIHJlZ3VsYXIgZmlsZXMgb3Igc3ltYm9saWMgbGlua3MiLCBwYXRoKTsKKworCW5hbWVsZW4gPSBzdHJsZW4ocGF0aCk7CisJc2l6ZSA9IGNhY2hlX2VudHJ5X3NpemUobmFtZWxlbik7CisJY2UgPSB4Y2FsbG9jKDEsIHNpemUpOworCW1lbWNweShjZS0+bmFtZSwgcGF0aCwgbmFtZWxlbik7CisJY2UtPmNlX2ZsYWdzID0gaHRvbnMobmFtZWxlbik7CisJZmlsbF9zdGF0X2NhY2hlX2luZm8oY2UsICZzdCk7CisKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKHN0LnN0X21vZGUpOworCWlmICghdHJ1c3RfZXhlY3V0YWJsZV9iaXQpIHsKKwkJLyogSWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgZW50cnksIHBpY2sgdGhlIG1vZGUgYml0cworCQkgKiBmcm9tIGl0LgorCQkgKi8KKwkJaW50IHBvcyA9IGNhY2hlX25hbWVfcG9zKHBhdGgsIG5hbWVsZW4pOworCQlpZiAocG9zID49IDApCisJCQljZS0+Y2VfbW9kZSA9IGFjdGl2ZV9jYWNoZVtwb3NdLT5jZV9tb2RlOworCX0KKworCWlmIChpbmRleF9wYXRoKGNlLT5zaGExLCBwYXRoLCAmc3QsIDEpKQorCQlkaWUoInVuYWJsZSB0byBpbmRleCBmaWxlICVzIiwgcGF0aCk7CisJaWYgKGFkZF9jYWNoZV9lbnRyeShjZSwgQUREX0NBQ0hFX09LX1RPX0FERCkpCisJCWRpZSgidW5hYmxlIHRvIGFkZCAlcyB0byBpbmRleCIscGF0aCk7CisJaWYgKHZlcmJvc2UpCisJCXByaW50ZigiYWRkICclcydcbiIsIHBhdGgpOworCWNhY2hlX3RyZWVfaW52YWxpZGF0ZV9wYXRoKGFjdGl2ZV9jYWNoZV90cmVlLCBwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNlX3NhbWVfbmFtZShzdHJ1Y3QgY2FjaGVfZW50cnkgKmEsIHN0cnVjdCBjYWNoZV9lbnRyeSAqYikKK3sKKwlpbnQgbGVuID0gY2VfbmFtZWxlbihhKTsKKwlyZXR1cm4gY2VfbmFtZWxlbihiKSA9PSBsZW4gJiYgIW1lbWNtcChhLT5uYW1lLCBiLT5uYW1lLCBsZW4pOworfQorCitpbnQgY2VfcGF0aF9tYXRjaChjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBjb25zdCBjaGFyICoqcGF0aHNwZWMpCit7CisJY29uc3QgY2hhciAqbWF0Y2gsICpuYW1lOworCWludCBsZW47CisKKwlpZiAoIXBhdGhzcGVjKQorCQlyZXR1cm4gMTsKKworCWxlbiA9IGNlX25hbWVsZW4oY2UpOworCW5hbWUgPSBjZS0+bmFtZTsKKwl3aGlsZSAoKG1hdGNoID0gKnBhdGhzcGVjKyspICE9IE5VTEwpIHsKKwkJaW50IG1hdGNobGVuID0gc3RybGVuKG1hdGNoKTsKKwkJaWYgKG1hdGNobGVuID4gbGVuKQorCQkJY29udGludWU7CisJCWlmIChtZW1jbXAobmFtZSwgbWF0Y2gsIG1hdGNobGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobWF0Y2hsZW4gJiYgbmFtZVttYXRjaGxlbi0xXSA9PSAnLycpCisJCQlyZXR1cm4gMTsKKwkJaWYgKG5hbWVbbWF0Y2hsZW5dID09ICcvJyB8fCAhbmFtZVttYXRjaGxlbl0pCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFtYXRjaGxlbikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGZ1bmRhbWVudGFsbHkgZG9uJ3QgbGlrZSBzb21lIHBhdGhzOiB3ZSBkb24ndCB3YW50CisgKiBkb3Qgb3IgZG90LWRvdCBhbnl3aGVyZSwgYW5kIGZvciBvYnZpb3VzIHJlYXNvbnMgZG9uJ3QKKyAqIHdhbnQgdG8gcmVjdXJzZSBpbnRvICIuZ2l0IiBlaXRoZXIuCisgKgorICogQWxzbywgd2UgZG9uJ3Qgd2FudCBkb3VibGUgc2xhc2hlcyBvciBzbGFzaGVzIGF0IHRoZQorICogZW5kIHRoYXQgY2FuIG1ha2UgcGF0aG5hbWVzIGFtYmlndW91cy4KKyAqLworc3RhdGljIGludCB2ZXJpZnlfZG90ZmlsZShjb25zdCBjaGFyICpyZXN0KQoreworCS8qCisJICogVGhlIGZpcnN0IGNoYXJhY3RlciB3YXMgJy4nLCBidXQgdGhhdAorCSAqIGhhcyBhbHJlYWR5IGJlZW4gZGlzY2FyZGVkLCB3ZSBub3cgdGVzdAorCSAqIHRoZSByZXN0LgorCSAqLworCXN3aXRjaCAoKnJlc3QpIHsKKwkvKiAiLiIgaXMgbm90IGFsbG93ZWQgKi8KKwljYXNlICdcMCc6IGNhc2UgJy8nOgorCQlyZXR1cm4gMDsKKworCS8qCisJICogIi5naXQiIGZvbGxvd2VkIGJ5ICBOVUwgb3Igc2xhc2ggaXMgYmFkLiBUaGlzCisJICogc2hhcmVzIHRoZSBwYXRoIGVuZCB0ZXN0IHdpdGggdGhlICIuLiIgY2FzZS4KKwkgKi8KKwljYXNlICdnJzoKKwkJaWYgKHJlc3RbMV0gIT0gJ2knKQorCQkJYnJlYWs7CisJCWlmIChyZXN0WzJdICE9ICd0JykKKwkJCWJyZWFrOworCQlyZXN0ICs9IDI7CisJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlICcuJzoKKwkJaWYgKHJlc3RbMV0gPT0gJ1wwJyB8fCByZXN0WzFdID09ICcvJykKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IHZlcmlmeV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhciBjOworCisJZ290byBpbnNpZGU7CisJZm9yICg7OykgeworCQlpZiAoIWMpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGMgPT0gJy8nKSB7CitpbnNpZGU6CisJCQljID0gKnBhdGgrKzsKKwkJCXN3aXRjaCAoYykgeworCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgJy8nOiBjYXNlICdcMCc6CisJCQkJYnJlYWs7CisJCQljYXNlICcuJzoKKwkJCQlpZiAodmVyaWZ5X2RvdGZpbGUocGF0aCkpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJYyA9ICpwYXRoKys7CisJfQorfQorCisvKgorICogRG8gd2UgaGF2ZSBhbm90aGVyIGZpbGUgdGhhdCBoYXMgdGhlIGJlZ2lubmluZyBjb21wb25lbnRzIGJlaW5nIGEKKyAqIHByb3BlciBzdXBlcnNldCBvZiB0aGUgbmFtZSB3ZSdyZSB0cnlpbmcgdG8gYWRkPworICovCitzdGF0aWMgaW50IGhhc19maWxlX25hbWUoY29uc3Qgc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgaW50IHBvcywgaW50IG9rX3RvX3JlcGxhY2UpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGxlbiA9IGNlX25hbWVsZW4oY2UpOworCWludCBzdGFnZSA9IGNlX3N0YWdlKGNlKTsKKwljb25zdCBjaGFyICpuYW1lID0gY2UtPm5hbWU7CisKKwl3aGlsZSAocG9zIDwgYWN0aXZlX25yKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqcCA9IGFjdGl2ZV9jYWNoZVtwb3MrK107CisKKwkJaWYgKGxlbiA+PSBjZV9uYW1lbGVuKHApKQorCQkJYnJlYWs7CisJCWlmIChtZW1jbXAobmFtZSwgcC0+bmFtZSwgbGVuKSkKKwkJCWJyZWFrOworCQlpZiAoY2Vfc3RhZ2UocCkgIT0gc3RhZ2UpCisJCQljb250aW51ZTsKKwkJaWYgKHAtPm5hbWVbbGVuXSAhPSAnLycpCisJCQljb250aW51ZTsKKwkJcmV0dmFsID0gLTE7CisJCWlmICghb2tfdG9fcmVwbGFjZSkKKwkJCWJyZWFrOworCQlyZW1vdmVfY2FjaGVfZW50cnlfYXQoLS1wb3MpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogRG8gd2UgaGF2ZSBhbm90aGVyIGZpbGUgd2l0aCBhIHBhdGhuYW1lIHRoYXQgaXMgYSBwcm9wZXIKKyAqIHN1YnNldCBvZiB0aGUgbmFtZSB3ZSdyZSB0cnlpbmcgdG8gYWRkPworICovCitzdGF0aWMgaW50IGhhc19kaXJfbmFtZShjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcG9zLCBpbnQgb2tfdG9fcmVwbGFjZSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgc3RhZ2UgPSBjZV9zdGFnZShjZSk7CisJY29uc3QgY2hhciAqbmFtZSA9IGNlLT5uYW1lOworCWNvbnN0IGNoYXIgKnNsYXNoID0gbmFtZSArIGNlX25hbWVsZW4oY2UpOworCisJZm9yICg7OykgeworCQlpbnQgbGVuOworCisJCWZvciAoOzspIHsKKwkJCWlmICgqLS1zbGFzaCA9PSAnLycpCisJCQkJYnJlYWs7CisJCQlpZiAoc2xhc2ggPD0gY2UtPm5hbWUpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlsZW4gPSBzbGFzaCAtIG5hbWU7CisKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3MobmFtZSwgbnRvaHMoY3JlYXRlX2NlX2ZsYWdzKGxlbiwgc3RhZ2UpKSk7CisJCWlmIChwb3MgPj0gMCkgeworCQkJcmV0dmFsID0gLTE7CisJCQlpZiAob2tfdG9fcmVwbGFjZSkKKwkJCQlicmVhazsKKwkJCXJlbW92ZV9jYWNoZV9lbnRyeV9hdChwb3MpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUcml2aWFsIG9wdGltaXphdGlvbjogaWYgd2UgZmluZCBhbiBlbnRyeSB0aGF0CisJCSAqIGFscmVhZHkgbWF0Y2hlcyB0aGUgc3ViLWRpcmVjdG9yeSwgdGhlbiB3ZSBrbm93CisJCSAqIHdlJ3JlIG9rLCBhbmQgd2UgY2FuIGV4aXQuCisJCSAqLworCQlwb3MgPSAtcG9zLTE7CisJCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCXN0cnVjdCBjYWNoZV9lbnRyeSAqcCA9IGFjdGl2ZV9jYWNoZVtwb3NdOworCQkJaWYgKChjZV9uYW1lbGVuKHApIDw9IGxlbikgfHwKKwkJCSAgICAocC0+bmFtZVtsZW5dICE9ICcvJykgfHwKKwkJCSAgICBtZW1jbXAocC0+bmFtZSwgbmFtZSwgbGVuKSkKKwkJCQlicmVhazsgLyogbm90IG91ciBzdWJkaXJlY3RvcnkgKi8KKwkJCWlmIChjZV9zdGFnZShwKSA9PSBzdGFnZSkKKwkJCQkvKiBwIGlzIGF0IHRoZSBzYW1lIHN0YWdlIGFzIG91ciBlbnRyeSwgYW5kCisJCQkJICogaXMgYSBzdWJkaXJlY3Rvcnkgb2Ygd2hhdCB3ZSBhcmUgbG9va2luZworCQkJCSAqIGF0LCBzbyB3ZSBjYW5ub3QgaGF2ZSBjb25mbGljdHMgYXQgb3VyCisJCQkJICogbGV2ZWwgb3IgYW55dGhpbmcgc2hvcnRlci4KKwkJCQkgKi8KKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJcG9zKys7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyogV2UgbWF5IGJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFscmVhZHkgaGF2ZSBwYXRoL2ZpbGUgYW5kIHBhdGgKKyAqIGlzIGJlaW5nIGFkZGVkLCBvciB3ZSBhbHJlYWR5IGhhdmUgcGF0aCBhbmQgcGF0aC9maWxlIGlzIGJlaW5nCisgKiBhZGRlZC4gIEVpdGhlciBvbmUgd291bGQgcmVzdWx0IGluIGEgbm9uc2Vuc2UgdHJlZSB0aGF0IGhhcyBwYXRoCisgKiB0d2ljZSB3aGVuIGdpdC13cml0ZS10cmVlIHRyaWVzIHRvIHdyaXRlIGl0IG91dC4gIFByZXZlbnQgaXQuCisgKiAKKyAqIElmIG9rLXRvLXJlcGxhY2UgaXMgc3BlY2lmaWVkLCB3ZSByZW1vdmUgdGhlIGNvbmZsaWN0aW5nIGVudHJpZXMKKyAqIGZyb20gdGhlIGNhY2hlIHNvIHRoZSBjYWxsZXIgc2hvdWxkIHJlY29tcHV0ZSB0aGUgaW5zZXJ0IHBvc2l0aW9uLgorICogV2hlbiB0aGlzIGhhcHBlbnMsIHdlIHJldHVybiBub24temVyby4KKyAqLworc3RhdGljIGludCBjaGVja19maWxlX2RpcmVjdG9yeV9jb25mbGljdChjb25zdCBzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcG9zLCBpbnQgb2tfdG9fcmVwbGFjZSkKK3sKKwkvKgorCSAqIFdlIGNoZWNrIGlmIHRoZSBwYXRoIGlzIGEgc3ViLXBhdGggb2YgYSBzdWJzZXF1ZW50IHBhdGhuYW1lCisJICogZmlyc3QsIHNpbmNlIHJlbW92aW5nIHRob3NlIHdpbGwgbm90IGNoYW5nZSB0aGUgcG9zaXRpb24KKwkgKiBpbiB0aGUgYXJyYXkKKwkgKi8KKwlpbnQgcmV0dmFsID0gaGFzX2ZpbGVfbmFtZShjZSwgcG9zLCBva190b19yZXBsYWNlKTsKKwkvKgorCSAqIFRoZW4gY2hlY2sgaWYgdGhlIHBhdGggbWlnaHQgaGF2ZSBhIGNsYXNoaW5nIHN1Yi1kaXJlY3RvcnkKKwkgKiBiZWZvcmUgaXQuCisJICovCisJcmV0dXJuIHJldHZhbCArIGhhc19kaXJfbmFtZShjZSwgcG9zLCBva190b19yZXBsYWNlKTsKK30KKworaW50IGFkZF9jYWNoZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgb3B0aW9uKQoreworCWludCBwb3M7CisJaW50IG9rX3RvX2FkZCA9IG9wdGlvbiAmIEFERF9DQUNIRV9PS19UT19BREQ7CisJaW50IG9rX3RvX3JlcGxhY2UgPSBvcHRpb24gJiBBRERfQ0FDSEVfT0tfVE9fUkVQTEFDRTsKKwlpbnQgc2tpcF9kZl9jaGVjayA9IG9wdGlvbiAmIEFERF9DQUNIRV9TS0lQX0RGQ0hFQ0s7CisKKwlwb3MgPSBjYWNoZV9uYW1lX3BvcyhjZS0+bmFtZSwgbnRvaHMoY2UtPmNlX2ZsYWdzKSk7CisKKwkvKiBleGlzdGluZyBtYXRjaD8gSnVzdCByZXBsYWNlIGl0LiAqLworCWlmIChwb3MgPj0gMCkgeworCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJCWFjdGl2ZV9jYWNoZVtwb3NdID0gY2U7CisJCXJldHVybiAwOworCX0KKwlwb3MgPSAtcG9zLTE7CisKKwkvKgorCSAqIEluc2VydGluZyBhIG1lcmdlZCBlbnRyeSAoInN0YWdlIDAiKSBpbnRvIHRoZSBpbmRleAorCSAqIHdpbGwgYWx3YXlzIHJlcGxhY2UgYWxsIG5vbi1tZXJnZWQgZW50cmllcy4uCisJICovCisJaWYgKHBvcyA8IGFjdGl2ZV9uciAmJiBjZV9zdGFnZShjZSkgPT0gMCkgeworCQl3aGlsZSAoY2Vfc2FtZV9uYW1lKGFjdGl2ZV9jYWNoZVtwb3NdLCBjZSkpIHsKKwkJCW9rX3RvX2FkZCA9IDE7CisJCQlpZiAoIXJlbW92ZV9jYWNoZV9lbnRyeV9hdChwb3MpKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFva190b19hZGQpCisJCXJldHVybiAtMTsKKwlpZiAoIXZlcmlmeV9wYXRoKGNlLT5uYW1lKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFza2lwX2RmX2NoZWNrICYmCisJICAgIGNoZWNrX2ZpbGVfZGlyZWN0b3J5X2NvbmZsaWN0KGNlLCBwb3MsIG9rX3RvX3JlcGxhY2UpKSB7CisJCWlmICghb2tfdG9fcmVwbGFjZSkKKwkJCXJldHVybiAtMTsKKwkJcG9zID0gY2FjaGVfbmFtZV9wb3MoY2UtPm5hbWUsIG50b2hzKGNlLT5jZV9mbGFncykpOworCQlwb3MgPSAtcG9zLTE7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBhcnJheSBpcyBiaWcgZW5vdWdoIC4uICovCisJaWYgKGFjdGl2ZV9uciA9PSBhY3RpdmVfYWxsb2MpIHsKKwkJYWN0aXZlX2FsbG9jID0gYWxsb2NfbnIoYWN0aXZlX2FsbG9jKTsKKwkJYWN0aXZlX2NhY2hlID0geHJlYWxsb2MoYWN0aXZlX2NhY2hlLCBhY3RpdmVfYWxsb2MgKiBzaXplb2Yoc3RydWN0IGNhY2hlX2VudHJ5ICopKTsKKwl9CisKKwkvKiBBZGQgaXQgaW4uLiAqLworCWFjdGl2ZV9ucisrOworCWlmIChhY3RpdmVfbnIgPiBwb3MpCisJCW1lbW1vdmUoYWN0aXZlX2NhY2hlICsgcG9zICsgMSwgYWN0aXZlX2NhY2hlICsgcG9zLCAoYWN0aXZlX25yIC0gcG9zIC0gMSkgKiBzaXplb2YoY2UpKTsKKwlhY3RpdmVfY2FjaGVbcG9zXSA9IGNlOworCWFjdGl2ZV9jYWNoZV9jaGFuZ2VkID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICJyZWZyZXNoIiBkb2VzIG5vdCBjYWxjdWxhdGUgYSBuZXcgc2hhMSBmaWxlIG9yIGJyaW5nIHRoZQorICogY2FjaGUgdXAtdG8tZGF0ZSBmb3IgbW9kZS9jb250ZW50IGNoYW5nZXMuIEJ1dCB3aGF0IGl0CisgKiBfZG9lc18gZG8gaXMgdG8gInJlLW1hdGNoIiB0aGUgc3RhdCBpbmZvcm1hdGlvbiBvZiBhIGZpbGUKKyAqIHdpdGggdGhlIGNhY2hlLCBzbyB0aGF0IHlvdSBjYW4gcmVmcmVzaCB0aGUgY2FjaGUgZm9yIGEKKyAqIGZpbGUgdGhhdCBoYXNuJ3QgYmVlbiBjaGFuZ2VkIGJ1dCB3aGVyZSB0aGUgc3RhdCBlbnRyeSBpcworICogb3V0IG9mIGRhdGUuCisgKgorICogRm9yIGV4YW1wbGUsIHlvdSdkIHdhbnQgdG8gZG8gdGhpcyBhZnRlciBkb2luZyBhICJnaXQtcmVhZC10cmVlIiwKKyAqIHRvIGxpbmsgdXAgdGhlIHN0YXQgY2FjaGUgZGV0YWlscyB3aXRoIHRoZSBwcm9wZXIgZmlsZXMuCisgKi8KK3N0cnVjdCBjYWNoZV9lbnRyeSAqcmVmcmVzaF9jYWNoZV9lbnRyeShzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlLCBpbnQgcmVhbGx5KQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBjYWNoZV9lbnRyeSAqdXBkYXRlZDsKKwlpbnQgY2hhbmdlZCwgc2l6ZTsKKworCWlmIChsc3RhdChjZS0+bmFtZSwgJnN0KSA8IDApIHsKKwkJY2FjaGVfZXJybm8gPSBlcnJubzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2hhbmdlZCA9IGNlX21hdGNoX3N0YXQoY2UsICZzdCwgcmVhbGx5KTsKKwlpZiAoIWNoYW5nZWQpIHsKKwkJaWYgKHJlYWxseSAmJiBhc3N1bWVfdW5jaGFuZ2VkICYmCisJCSAgICAhKGNlLT5jZV9mbGFncyAmIGh0b25zKENFX1ZBTElEKSkpCisJCQk7IC8qIG1hcmsgdGhpcyBvbmUgVkFMSUQgYWdhaW4gKi8KKwkJZWxzZQorCQkJcmV0dXJuIGNlOworCX0KKworCWlmIChjZV9tb2RpZmllZChjZSwgJnN0LCByZWFsbHkpKSB7CisJCWNhY2hlX2Vycm5vID0gRUlOVkFMOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzaXplID0gY2Vfc2l6ZShjZSk7CisJdXBkYXRlZCA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtY3B5KHVwZGF0ZWQsIGNlLCBzaXplKTsKKwlmaWxsX3N0YXRfY2FjaGVfaW5mbyh1cGRhdGVkLCAmc3QpOworCisJLyogSW4gdGhpcyBjYXNlLCBpZiByZWFsbHkgaXMgbm90IHNldCwgd2Ugc2hvdWxkIGxlYXZlCisJICogQ0VfVkFMSUQgYml0IGFsb25lLiAgT3RoZXJ3aXNlLCBwYXRocyBtYXJrZWQgd2l0aAorCSAqIC0tbm8tYXNzdW1lLXVuY2hhbmdlZCAoaS5lLiB0aGluZ3MgdG8gYmUgZWRpdGVkKSB3aWxsCisJICogcmVhY3F1aXJlIENFX1ZBTElEIGJpdCBhdXRvbWF0aWNhbGx5LCB3aGljaCBpcyBub3QKKwkgKiByZWFsbHkgd2hhdCB3ZSB3YW50LgorCSAqLworCWlmICghcmVhbGx5ICYmIGFzc3VtZV91bmNoYW5nZWQgJiYgIShjZS0+Y2VfZmxhZ3MgJiBodG9ucyhDRV9WQUxJRCkpKQorCQl1cGRhdGVkLT5jZV9mbGFncyAmPSB+aHRvbnMoQ0VfVkFMSUQpOworCisJcmV0dXJuIHVwZGF0ZWQ7Cit9CisKK2ludCByZWZyZXNoX2NhY2hlKHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgaTsKKwlpbnQgaGFzX2Vycm9ycyA9IDA7CisJaW50IHJlYWxseSA9IChmbGFncyAmIFJFRlJFU0hfUkVBTExZKSAhPSAwOworCWludCBhbGxvd191bm1lcmdlZCA9IChmbGFncyAmIFJFRlJFU0hfVU5NRVJHRUQpICE9IDA7CisJaW50IHF1aWV0ID0gKGZsYWdzICYgUkVGUkVTSF9RVUlFVCkgIT0gMDsKKwlpbnQgbm90X25ldyA9IChmbGFncyAmIFJFRlJFU0hfSUdOT1JFX01JU1NJTkcpICE9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWN0aXZlX25yOyBpKyspIHsKKwkJc3RydWN0IGNhY2hlX2VudHJ5ICpjZSwgKm5ldzsKKwkJY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmIChjZV9zdGFnZShjZSkpIHsKKwkJCXdoaWxlICgoaSA8IGFjdGl2ZV9ucikgJiYKKwkJCSAgICAgICAhIHN0cmNtcChhY3RpdmVfY2FjaGVbaV0tPm5hbWUsIGNlLT5uYW1lKSkKKwkJCQlpKys7CisJCQlpLS07CisJCQlpZiAoYWxsb3dfdW5tZXJnZWQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzOiBuZWVkcyBtZXJnZVxuIiwgY2UtPm5hbWUpOworCQkJaGFzX2Vycm9ycyA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCW5ldyA9IHJlZnJlc2hfY2FjaGVfZW50cnkoY2UsIHJlYWxseSk7CisJCWlmIChuZXcgPT0gY2UpCisJCQljb250aW51ZTsKKwkJaWYgKCFuZXcpIHsKKwkJCWlmIChub3RfbmV3ICYmIGNhY2hlX2Vycm5vID09IEVOT0VOVCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZWFsbHkgJiYgY2FjaGVfZXJybm8gPT0gRUlOVkFMKSB7CisJCQkJLyogSWYgd2UgYXJlIGRvaW5nIC0tcmVhbGx5LXJlZnJlc2ggdGhhdAorCQkJCSAqIG1lYW5zIHRoZSBpbmRleCBpcyBub3QgdmFsaWQgYW55bW9yZS4KKwkJCQkgKi8KKwkJCQljZS0+Y2VfZmxhZ3MgJj0gfmh0b25zKENFX1ZBTElEKTsKKwkJCQlhY3RpdmVfY2FjaGVfY2hhbmdlZCA9IDE7CisJCQl9CisJCQlpZiAocXVpZXQpCisJCQkJY29udGludWU7CisJCQlwcmludGYoIiVzOiBuZWVkcyB1cGRhdGVcbiIsIGNlLT5uYW1lKTsKKwkJCWhhc19lcnJvcnMgPSAxOworCQkJY29udGludWU7CisJCX0KKwkJYWN0aXZlX2NhY2hlX2NoYW5nZWQgPSAxOworCQkvKiBZb3UgY2FuIE5PVCBqdXN0IGZyZWUgYWN0aXZlX2NhY2hlW2ldIGhlcmUsIHNpbmNlIGl0CisJCSAqIG1pZ2h0IG5vdCBiZSBuZWNlc3NhcmlseSBtYWxsb2MoKWVkIGJ1dCBjYW4gYWxzbyBjb21lCisJCSAqIGZyb20gbW1hcCgpLiAqLworCQlhY3RpdmVfY2FjaGVbaV0gPSBuZXc7CisJfQorCXJldHVybiBoYXNfZXJyb3JzOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9oZHIoc3RydWN0IGNhY2hlX2hlYWRlciAqaGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJU0hBX0NUWCBjOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoaGRyLT5oZHJfc2lnbmF0dXJlICE9IGh0b25sKENBQ0hFX1NJR05BVFVSRSkpCisJCXJldHVybiBlcnJvcigiYmFkIHNpZ25hdHVyZSIpOworCWlmIChoZHItPmhkcl92ZXJzaW9uICE9IGh0b25sKDIpKQorCQlyZXR1cm4gZXJyb3IoImJhZCBpbmRleCB2ZXJzaW9uIik7CisJU0hBMV9Jbml0KCZjKTsKKwlTSEExX1VwZGF0ZSgmYywgaGRyLCBzaXplIC0gMjApOworCVNIQTFfRmluYWwoc2hhMSwgJmMpOworCWlmIChtZW1jbXAoc2hhMSwgKGNoYXIgKikgaGRyICsgc2l6ZSAtIDIwLCAyMCkpCisJCXJldHVybiBlcnJvcigiYmFkIGluZGV4IGZpbGUgc2hhMSBzaWduYXR1cmUiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2luZGV4X2V4dGVuc2lvbihjb25zdCBjaGFyICpleHQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc3opCit7CisJc3dpdGNoIChDQUNIRV9FWFQoZXh0KSkgeworCWNhc2UgQ0FDSEVfRVhUX1RSRUU6CisJCWFjdGl2ZV9jYWNoZV90cmVlID0gY2FjaGVfdHJlZV9yZWFkKGRhdGEsIHN6KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCpleHQgPCAnQScgfHwgJ1onIDwgKmV4dCkKKwkJCXJldHVybiBlcnJvcigiaW5kZXggdXNlcyAlLjRzIGV4dGVuc2lvbiwgd2hpY2ggd2UgZG8gbm90IHVuZGVyc3RhbmQiLAorCQkJCSAgICAgZXh0KTsKKwkJZnByaW50ZihzdGRlcnIsICJpZ25vcmluZyAlLjRzIGV4dGVuc2lvblxuIiwgZXh0KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcmVhZF9jYWNoZSh2b2lkKQoreworCXJldHVybiByZWFkX2NhY2hlX2Zyb20oZ2V0X2luZGV4X2ZpbGUoKSk7Cit9CisKKy8qIHJlbWVtYmVyIHRvIGRpc2NhcmRfY2FjaGUoKSBiZWZvcmUgcmVhZGluZyBhIGRpZmZlcmVudCBjYWNoZSEgKi8KK2ludCByZWFkX2NhY2hlX2Zyb20oY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZmQsIGk7CisJc3RydWN0IHN0YXQgc3Q7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGNhY2hlX2hlYWRlciAqaGRyOworCisJZXJybm8gPSBFQlVTWTsKKwlpZiAoY2FjaGVfbW1hcCkKKwkJcmV0dXJuIGFjdGl2ZV9ucjsKKworCWVycm5vID0gRU5PRU5UOworCWluZGV4X2ZpbGVfdGltZXN0YW1wID0gMDsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCXJldHVybiAwOworCQlkaWUoImluZGV4IGZpbGUgb3BlbiBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJY2FjaGVfbW1hcCA9IE1BUF9GQUlMRUQ7CisJaWYgKCFmc3RhdChmZCwgJnN0KSkgeworCQljYWNoZV9tbWFwX3NpemUgPSBzdC5zdF9zaXplOworCQllcnJubyA9IEVJTlZBTDsKKwkJaWYgKGNhY2hlX21tYXBfc2l6ZSA+PSBzaXplb2Yoc3RydWN0IGNhY2hlX2hlYWRlcikgKyAyMCkKKwkJCWNhY2hlX21tYXAgPSBtbWFwKE5VTEwsIGNhY2hlX21tYXBfc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwl9CisJY2xvc2UoZmQpOworCWlmIChjYWNoZV9tbWFwID09IE1BUF9GQUlMRUQpCisJCWRpZSgiaW5kZXggZmlsZSBtbWFwIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCWhkciA9IGNhY2hlX21tYXA7CisJaWYgKHZlcmlmeV9oZHIoaGRyLCBjYWNoZV9tbWFwX3NpemUpIDwgMCkKKwkJZ290byB1bm1hcDsKKworCWFjdGl2ZV9uciA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCWFjdGl2ZV9hbGxvYyA9IGFsbG9jX25yKGFjdGl2ZV9ucik7CisJYWN0aXZlX2NhY2hlID0geGNhbGxvYyhhY3RpdmVfYWxsb2MsIHNpemVvZihzdHJ1Y3QgY2FjaGVfZW50cnkgKikpOworCisJb2Zmc2V0ID0gc2l6ZW9mKCpoZHIpOworCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfbnI7IGkrKykgeworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlID0gKHN0cnVjdCBjYWNoZV9lbnRyeSAqKSAoKGNoYXIgKikgY2FjaGVfbW1hcCArIG9mZnNldCk7CisJCW9mZnNldCA9IG9mZnNldCArIGNlX3NpemUoY2UpOworCQlhY3RpdmVfY2FjaGVbaV0gPSBjZTsKKwl9CisJaW5kZXhfZmlsZV90aW1lc3RhbXAgPSBzdC5zdF9tdGltZTsKKwl3aGlsZSAob2Zmc2V0IDw9IGNhY2hlX21tYXBfc2l6ZSAtIDIwIC0gOCkgeworCQkvKiBBZnRlciBhbiBhcnJheSBvZiBhY3RpdmVfbnIgaW5kZXggZW50cmllcywKKwkJICogdGhlcmUgY2FuIGJlIGFyYml0cmFyeSBudW1iZXIgb2YgZXh0ZW5kZWQKKwkJICogc2VjdGlvbnMsIGVhY2ggb2Ygd2hpY2ggaXMgcHJlZml4ZWQgd2l0aAorCQkgKiBleHRlbnNpb24gbmFtZSAoNC1ieXRlKSBhbmQgc2VjdGlvbiBsZW5ndGgKKwkJICogaW4gNC1ieXRlIG5ldHdvcmsgYnl0ZSBvcmRlci4KKwkJICovCisJCXVuc2lnbmVkIGxvbmcgZXh0c2l6ZTsKKwkJbWVtY3B5KCZleHRzaXplLCAoY2hhciAqKSBjYWNoZV9tbWFwICsgb2Zmc2V0ICsgNCwgNCk7CisJCWV4dHNpemUgPSBudG9obChleHRzaXplKTsKKwkJaWYgKHJlYWRfaW5kZXhfZXh0ZW5zaW9uKCgoY29uc3QgY2hhciAqKSBjYWNoZV9tbWFwKSArIG9mZnNldCwKKwkJCQkJIChjaGFyICopIGNhY2hlX21tYXAgKyBvZmZzZXQgKyA4LAorCQkJCQkgZXh0c2l6ZSkgPCAwKQorCQkJZ290byB1bm1hcDsKKwkJb2Zmc2V0ICs9IDg7CisJCW9mZnNldCArPSBleHRzaXplOworCX0KKwlyZXR1cm4gYWN0aXZlX25yOworCit1bm1hcDoKKwltdW5tYXAoY2FjaGVfbW1hcCwgY2FjaGVfbW1hcF9zaXplKTsKKwllcnJubyA9IEVJTlZBTDsKKwlkaWUoImluZGV4IGZpbGUgY29ycnVwdCIpOworfQorCisjZGVmaW5lIFdSSVRFX0JVRkZFUl9TSVpFIDgxOTIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHdyaXRlX2J1ZmZlcltXUklURV9CVUZGRVJfU0laRV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyB3cml0ZV9idWZmZXJfbGVuOworCitzdGF0aWMgaW50IGNlX3dyaXRlKFNIQV9DVFggKmNvbnRleHQsIGludCBmZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuKSB7CisJCXVuc2lnbmVkIGludCBidWZmZXJlZCA9IHdyaXRlX2J1ZmZlcl9sZW47CisJCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gV1JJVEVfQlVGRkVSX1NJWkUgLSBidWZmZXJlZDsKKwkJaWYgKHBhcnRpYWwgPiBsZW4pCisJCQlwYXJ0aWFsID0gbGVuOworCQltZW1jcHkod3JpdGVfYnVmZmVyICsgYnVmZmVyZWQsIGRhdGEsIHBhcnRpYWwpOworCQlidWZmZXJlZCArPSBwYXJ0aWFsOworCQlpZiAoYnVmZmVyZWQgPT0gV1JJVEVfQlVGRkVSX1NJWkUpIHsKKwkJCVNIQTFfVXBkYXRlKGNvbnRleHQsIHdyaXRlX2J1ZmZlciwgV1JJVEVfQlVGRkVSX1NJWkUpOworCQkJaWYgKHdyaXRlKGZkLCB3cml0ZV9idWZmZXIsIFdSSVRFX0JVRkZFUl9TSVpFKSAhPSBXUklURV9CVUZGRVJfU0laRSkKKwkJCQlyZXR1cm4gLTE7CisJCQlidWZmZXJlZCA9IDA7CisJCX0KKwkJd3JpdGVfYnVmZmVyX2xlbiA9IGJ1ZmZlcmVkOworCQlsZW4gLT0gcGFydGlhbDsKKwkJZGF0YSA9IChjaGFyICopIGRhdGEgKyBwYXJ0aWFsOworIAl9CisgCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2luZGV4X2V4dF9oZWFkZXIoU0hBX0NUWCAqY29udGV4dCwgaW50IGZkLAorCQkJCSAgdW5zaWduZWQgaW50IGV4dCwgdW5zaWduZWQgaW50IHN6KQoreworCWV4dCA9IGh0b25sKGV4dCk7CisJc3ogPSBodG9ubChzeik7CisJaWYgKChjZV93cml0ZShjb250ZXh0LCBmZCwgJmV4dCwgNCkgPCAwKSB8fAorCSAgICAoY2Vfd3JpdGUoY29udGV4dCwgZmQsICZzeiwgNCkgPCAwKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlX2ZsdXNoKFNIQV9DVFggKmNvbnRleHQsIGludCBmZCkKK3sKKwl1bnNpZ25lZCBpbnQgbGVmdCA9IHdyaXRlX2J1ZmZlcl9sZW47CisKKwlpZiAobGVmdCkgeworCQl3cml0ZV9idWZmZXJfbGVuID0gMDsKKwkJU0hBMV9VcGRhdGUoY29udGV4dCwgd3JpdGVfYnVmZmVyLCBsZWZ0KTsKKwl9CisKKwkvKiBGbHVzaCBmaXJzdCBpZiBub3QgZW5vdWdoIHNwYWNlIGZvciBTSEExIHNpZ25hdHVyZSAqLworCWlmIChsZWZ0ICsgMjAgPiBXUklURV9CVUZGRVJfU0laRSkgeworCQlpZiAod3JpdGUoZmQsIHdyaXRlX2J1ZmZlciwgbGVmdCkgIT0gbGVmdCkKKwkJCXJldHVybiAtMTsKKwkJbGVmdCA9IDA7CisJfQorCisJLyogQXBwZW5kIHRoZSBTSEExIHNpZ25hdHVyZSBhdCB0aGUgZW5kICovCisJU0hBMV9GaW5hbCh3cml0ZV9idWZmZXIgKyBsZWZ0LCBjb250ZXh0KTsKKwlsZWZ0ICs9IDIwOworCWlmICh3cml0ZShmZCwgd3JpdGVfYnVmZmVyLCBsZWZ0KSAhPSBsZWZ0KQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNlX3NtdWRnZV9yYWNpbHlfY2xlYW5fZW50cnkoc3RydWN0IGNhY2hlX2VudHJ5ICpjZSkKK3sKKwkvKgorCSAqIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaW4gdGhpcyBmdW5jdGlvbiBpcyB0byBzbXVkZ2UgdGhlCisJICogZmFsc2VseSBjbGVhbiBlbnRyeSBkdWUgdG8gdG91Y2gtdXBkYXRlLXRvdWNoIHJhY2UsIHNvIHdlIGxlYXZlCisJICogZXZlcnl0aGluZyBlbHNlIGFzIHRoZXkgYXJlLiAgV2UgYXJlIGNhbGxlZCBmb3IgZW50cmllcyB3aG9zZQorCSAqIGNlX210aW1lIG1hdGNoIHRoZSBpbmRleCBmaWxlIG10aW1lLgorCSAqLworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGxzdGF0KGNlLT5uYW1lLCAmc3QpIDwgMCkKKwkJcmV0dXJuOworCWlmIChjZV9tYXRjaF9zdGF0X2Jhc2ljKGNlLCAmc3QpKQorCQlyZXR1cm47CisJaWYgKGNlX21vZGlmaWVkX2NoZWNrX2ZzKGNlLCAmc3QpKSB7CisJCS8qIFRoaXMgaXMgInJhY2lseSBjbGVhbiI7IHNtdWRnZSBpdC4gIE5vdGUgdGhhdCB0aGlzCisJCSAqIGlzIGEgdHJpY2t5IGNvZGUuICBBdCBmaXJzdCBnbGFuY2UsIGl0IG1heSBhcHBlYXIKKwkJICogdGhhdCBpdCBjYW4gYnJlYWsgd2l0aCB0aGlzIHNlcXVlbmNlOgorCQkgKgorCQkgKiAkIGVjaG8geHl6enkgPmZyb3R6CisJCSAqICQgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90egorCQkgKiAkIDogPmZyb3R6CisJCSAqICQgc2xlZXAgMworCQkgKiAkIGVjaG8gZmlsZnJlID5uaXRmb2wKKwkJICogJCBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbAorCQkgKgorCQkgKiBidXQgaXQgZG9lcyBub3QuICBXaGUgdGhlIHNlY29uZCB1cGRhdGUtaW5kZXggcnVucywKKwkJICogaXQgbm90aWNlcyB0aGF0IHRoZSBlbnRyeSAiZnJvdHoiIGhhcyB0aGUgc2FtZSB0aW1lc3RhbXAKKwkJICogYXMgaW5kZXgsIGFuZCBpZiB3ZSB3ZXJlIHRvIHNtdWRnZSBpdCBieSByZXNldHRpbmcgaXRzCisJCSAqIHNpemUgdG8gemVybyBoZXJlLCB0aGVuIHRoZSBvYmplY3QgbmFtZSByZWNvcmRlZAorCQkgKiBpbiBpbmRleCBpcyB0aGUgNi1ieXRlIGZpbGUgYnV0IHRoZSBjYWNoZWQgc3RhdCBpbmZvcm1hdGlvbgorCQkgKiBiZWNvbWVzIHplcm8gLS0tIHdoaWNoIHdvdWxkIHRoZW4gbWF0Y2ggd2hhdCB3ZSB3b3VsZAorCQkgKiBvYnRhaW4gZnJvbSB0aGUgZmlsZXN5c3RlbSBuZXh0IHRpbWUgd2Ugc3RhdCgiZnJvdHoiKS4gCisJCSAqCisJCSAqIEhvd2V2ZXIsIHRoZSBzZWNvbmQgdXBkYXRlLWluZGV4LCBiZWZvcmUgY2FsbGluZworCQkgKiB0aGlzIGZ1bmN0aW9uLCBub3RpY2VzIHRoYXQgdGhlIGNhY2hlZCBzaXplIGlzIDYKKwkJICogYnl0ZXMgYW5kIHdoYXQgaXMgb24gdGhlIGZpbGVzeXN0ZW0gaXMgYW4gZW1wdHkKKwkJICogZmlsZSwgYW5kIG5ldmVyIGNhbGxzIHVzLCBzbyB0aGUgY2FjaGVkIHNpemUgaW5mb3JtYXRpb24KKwkJICogZm9yICJmcm90eiIgc3RheXMgNiB3aGljaCBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZXN5c3RlbS4KKwkJICovCisJCWNlLT5jZV9zaXplID0gaHRvbmwoMCk7CisJfQorfQorCitpbnQgd3JpdGVfY2FjaGUoaW50IG5ld2ZkLCBzdHJ1Y3QgY2FjaGVfZW50cnkgKipjYWNoZSwgaW50IGVudHJpZXMpCit7CisJU0hBX0NUWCBjOworCXN0cnVjdCBjYWNoZV9oZWFkZXIgaGRyOworCWludCBpLCByZW1vdmVkOworCisJZm9yIChpID0gcmVtb3ZlZCA9IDA7IGkgPCBlbnRyaWVzOyBpKyspCisJCWlmICghY2FjaGVbaV0tPmNlX21vZGUpCisJCQlyZW1vdmVkKys7CisKKwloZHIuaGRyX3NpZ25hdHVyZSA9IGh0b25sKENBQ0hFX1NJR05BVFVSRSk7CisJaGRyLmhkcl92ZXJzaW9uID0gaHRvbmwoMik7CisJaGRyLmhkcl9lbnRyaWVzID0gaHRvbmwoZW50cmllcyAtIHJlbW92ZWQpOworCisJU0hBMV9Jbml0KCZjKTsKKwlpZiAoY2Vfd3JpdGUoJmMsIG5ld2ZkLCAmaGRyLCBzaXplb2YoaGRyKSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBjYWNoZVtpXTsKKwkJaWYgKCFjZS0+Y2VfbW9kZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5kZXhfZmlsZV90aW1lc3RhbXAgJiYKKwkJICAgIGluZGV4X2ZpbGVfdGltZXN0YW1wIDw9IG50b2hsKGNlLT5jZV9tdGltZS5zZWMpKQorCQkJY2Vfc211ZGdlX3JhY2lseV9jbGVhbl9lbnRyeShjZSk7CisJCWlmIChjZV93cml0ZSgmYywgbmV3ZmQsIGNlLCBjZV9zaXplKGNlKSkgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIFdyaXRlIGV4dGVuc2lvbiBkYXRhIGhlcmUgKi8KKwlpZiAoYWN0aXZlX2NhY2hlX3RyZWUpIHsKKwkJdW5zaWduZWQgbG9uZyBzejsKKwkJdm9pZCAqZGF0YSA9IGNhY2hlX3RyZWVfd3JpdGUoYWN0aXZlX2NhY2hlX3RyZWUsICZzeik7CisJCWlmIChkYXRhICYmCisJCSAgICAhd3JpdGVfaW5kZXhfZXh0X2hlYWRlcigmYywgbmV3ZmQsIENBQ0hFX0VYVF9UUkVFLCBzeikgJiYKKwkJICAgICFjZV93cml0ZSgmYywgbmV3ZmQsIGRhdGEsIHN6KSkKKwkJCTsKKwkJZWxzZSB7CisJCQlmcmVlKGRhdGEpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiBjZV9mbHVzaCgmYywgbmV3ZmQpOworfQpkaWZmIC0tZ2l0IGEvcmVjZWl2ZS1wYWNrLmMgYi9yZWNlaXZlLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzkyOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVjZWl2ZS1wYWNrLmMKQEAgLTAsMCArMSwzNDAgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInJ1bi1jb21tYW5kLmgiCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgcmVjZWl2ZV9wYWNrX3VzYWdlW10gPSAiZ2l0LXJlY2VpdmUtcGFjayA8Z2l0LWRpcj4iOworCitzdGF0aWMgY29uc3QgY2hhciAqdW5wYWNrZXJbXSA9IHsgInVucGFjay1vYmplY3RzIiwgTlVMTCB9OworCitzdGF0aWMgaW50IHJlcG9ydF9zdGF0dXMgPSAwOworCitzdGF0aWMgY2hhciBjYXBhYmlsaXRpZXNbXSA9ICJyZXBvcnQtc3RhdHVzIjsKK3N0YXRpYyBpbnQgY2FwYWJpbGl0aWVzX3NlbnQgPSAwOworCitzdGF0aWMgaW50IHNob3dfcmVmKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaWYgKGNhcGFiaWxpdGllc19zZW50KQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJZWxzZQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzJWMlc1xuIiwKKwkJCSAgICAgc2hhMV90b19oZXgoc2hhMSksIHBhdGgsIDAsIGNhcGFiaWxpdGllcyk7CisJY2FwYWJpbGl0aWVzX3NlbnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkX2luZm8odm9pZCkKK3sKKwlmb3JfZWFjaF9yZWYoc2hvd19yZWYpOworCWlmICghY2FwYWJpbGl0aWVzX3NlbnQpCisJCXNob3dfcmVmKCJjYXBhYmlsaXRpZXNee30iLCBudWxsX3NoYTEpOworCit9CisKK3N0cnVjdCBjb21tYW5kIHsKKwlzdHJ1Y3QgY29tbWFuZCAqbmV4dDsKKwljb25zdCBjaGFyICplcnJvcl9zdHJpbmc7CisJdW5zaWduZWQgY2hhciBvbGRfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBuZXdfc2hhMVsyMF07CisJY2hhciByZWZfbmFtZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLworfTsKKworc3RhdGljIHN0cnVjdCBjb21tYW5kICpjb21tYW5kcyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgaXNfYWxsX3plcm9lcyhjb25zdCBjaGFyICpoZXgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IDQwOyBpKyspCisJCWlmICgqaGV4KysgIT0gJzAnKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X29sZF9yZWYoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqaGV4X2NvbnRlbnRzKQoreworCWludCBmZCwgcmV0OworCWNoYXIgYnVmZmVyWzYwXTsKKworCWlmIChpc19hbGxfemVyb2VzKGhleF9jb250ZW50cykpCisJCXJldHVybiAwOworCWZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldCA9IHJlYWQoZmQsIGJ1ZmZlciwgNDApOworCWNsb3NlKGZkKTsKKwlpZiAocmV0ICE9IDQwKQorCQlyZXR1cm4gLTE7CisJaWYgKG1lbWNtcChidWZmZXIsIGhleF9jb250ZW50cywgNDApKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyIHVwZGF0ZV9ob29rW10gPSAiaG9va3MvdXBkYXRlIjsKKworc3RhdGljIGludCBydW5fdXBkYXRlX2hvb2soY29uc3QgY2hhciAqcmVmbmFtZSwKKwkJCSAgIGNoYXIgKm9sZF9oZXgsIGNoYXIgKm5ld19oZXgpCit7CisJaW50IGNvZGU7CisKKwlpZiAoYWNjZXNzKHVwZGF0ZV9ob29rLCBYX09LKSA8IDApCisJCXJldHVybiAwOworCWNvZGUgPSBydW5fY29tbWFuZCh1cGRhdGVfaG9vaywgcmVmbmFtZSwgb2xkX2hleCwgbmV3X2hleCwgTlVMTCk7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gMDsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfRk9SSzoKKwkJcmV0dXJuIGVycm9yKCJob29rIGZvcmsgZmFpbGVkIik7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0VYRUM6CisJCXJldHVybiBlcnJvcigiaG9vayBleGVjdXRlIGZhaWxlZCIpOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEOgorCQlyZXR1cm4gZXJyb3IoIndhaXRwaWQgZmFpbGVkIik7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOgorCQlyZXR1cm4gZXJyb3IoIndhaXRwaWQgaXMgY29uZnVzZWQiKTsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUw6CisJCXJldHVybiBlcnJvcigiJXMgZGllZCBvZiBzaWduYWwiLCB1cGRhdGVfaG9vayk7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQlyZXR1cm4gZXJyb3IoIiVzIGRpZWQgc3RyYW5nZWx5IiwgdXBkYXRlX2hvb2spOworCWRlZmF1bHQ6CisJCWVycm9yKCIlcyBleGl0ZWQgd2l0aCBlcnJvciBjb2RlICVkIiwgdXBkYXRlX2hvb2ssIC1jb2RlKTsKKwkJcmV0dXJuIC1jb2RlOworCX0KK30KKworc3RhdGljIGludCB1cGRhdGUoc3RydWN0IGNvbW1hbmQgKmNtZCkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gY21kLT5yZWZfbmFtZTsKKwl1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSA9IGNtZC0+b2xkX3NoYTE7CisJdW5zaWduZWQgY2hhciAqbmV3X3NoYTEgPSBjbWQtPm5ld19zaGExOworCWNoYXIgbmV3X2hleFs2MF0sICpvbGRfaGV4LCAqbG9ja19uYW1lOworCWludCBuZXdmZCwgbmFtZWxlbiwgd3JpdHRlbjsKKworCWNtZC0+ZXJyb3Jfc3RyaW5nID0gTlVMTDsKKwlpZiAoIXN0cm5jbXAobmFtZSwgInJlZnMvIiwgNSkgJiYgY2hlY2tfcmVmX2Zvcm1hdChuYW1lICsgNSkpIHsKKwkJY21kLT5lcnJvcl9zdHJpbmcgPSAiZnVubnkgcmVmbmFtZSI7CisJCXJldHVybiBlcnJvcigicmVmdXNpbmcgdG8gY3JlYXRlIGZ1bm55IHJlZiAnJXMnIGxvY2FsbHkiLAorCQkJICAgICBuYW1lKTsKKwl9CisKKwluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWxvY2tfbmFtZSA9IHhtYWxsb2MobmFtZWxlbiArIDEwKTsKKwltZW1jcHkobG9ja19uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwltZW1jcHkobG9ja19uYW1lICsgbmFtZWxlbiwgIi5sb2NrIiwgNik7CisKKwlzdHJjcHkobmV3X2hleCwgc2hhMV90b19oZXgobmV3X3NoYTEpKTsKKwlvbGRfaGV4ID0gc2hhMV90b19oZXgob2xkX3NoYTEpOworCWlmICghaGFzX3NoYTFfZmlsZShuZXdfc2hhMSkpIHsKKwkJY21kLT5lcnJvcl9zdHJpbmcgPSAiYmFkIHBhY2siOworCQlyZXR1cm4gZXJyb3IoInVucGFjayBzaG91bGQgaGF2ZSBnZW5lcmF0ZWQgJXMsICIKKwkJCSAgICAgImJ1dCBJIGNhbid0IGZpbmQgaXQhIiwgbmV3X2hleCk7CisJfQorCXNhZmVfY3JlYXRlX2xlYWRpbmdfZGlyZWN0b3JpZXMobG9ja19uYW1lKTsKKworCW5ld2ZkID0gb3Blbihsb2NrX25hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgMDY2Nik7CisJaWYgKG5ld2ZkIDwgMCkgeworCQljbWQtPmVycm9yX3N0cmluZyA9ICJjYW4ndCBsb2NrIjsKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gY3JlYXRlICVzICglcykiLAorCQkJICAgICBsb2NrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJLyogV3JpdGUgdGhlIHJlZiB3aXRoIGFuIGVuZGluZyAnXG4nICovCisJbmV3X2hleFs0MF0gPSAnXG4nOworCW5ld19oZXhbNDFdID0gMDsKKwl3cml0dGVuID0gd3JpdGUobmV3ZmQsIG5ld19oZXgsIDQxKTsKKwkvKiBSZW1vdmUgdGhlICdcbicgYWdhaW4gKi8KKwluZXdfaGV4WzQwXSA9IDA7CisKKwljbG9zZShuZXdmZCk7CisJaWYgKHdyaXR0ZW4gIT0gNDEpIHsKKwkJdW5saW5rKGxvY2tfbmFtZSk7CisJCWNtZC0+ZXJyb3Jfc3RyaW5nID0gImNhbid0IHdyaXRlIjsKKwkJcmV0dXJuIGVycm9yKCJ1bmFibGUgdG8gd3JpdGUgJXMiLCBsb2NrX25hbWUpOworCX0KKwlpZiAodmVyaWZ5X29sZF9yZWYobmFtZSwgb2xkX2hleCkgPCAwKSB7CisJCXVubGluayhsb2NrX25hbWUpOworCQljbWQtPmVycm9yX3N0cmluZyA9ICJyYWNlZCI7CisJCXJldHVybiBlcnJvcigiJXMgY2hhbmdlZCBkdXJpbmcgcHVzaCIsIG5hbWUpOworCX0KKwlpZiAocnVuX3VwZGF0ZV9ob29rKG5hbWUsIG9sZF9oZXgsIG5ld19oZXgpKSB7CisJCXVubGluayhsb2NrX25hbWUpOworCQljbWQtPmVycm9yX3N0cmluZyA9ICJob29rIGRlY2xpbmVkIjsKKwkJcmV0dXJuIGVycm9yKCJob29rIGRlY2xpbmVkIHRvIHVwZGF0ZSAlcyIsIG5hbWUpOworCX0KKwllbHNlIGlmIChyZW5hbWUobG9ja19uYW1lLCBuYW1lKSA8IDApIHsKKwkJdW5saW5rKGxvY2tfbmFtZSk7CisJCWNtZC0+ZXJyb3Jfc3RyaW5nID0gImNhbid0IHJlbmFtZSI7CisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIHJlcGxhY2UgJXMiLCBuYW1lKTsKKwl9CisJZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIC0+ICVzXG4iLCBuYW1lLCBvbGRfaGV4LCBuZXdfaGV4KTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgY2hhciB1cGRhdGVfcG9zdF9ob29rW10gPSAiaG9va3MvcG9zdC11cGRhdGUiOworCitzdGF0aWMgdm9pZCBydW5fdXBkYXRlX3Bvc3RfaG9vayhzdHJ1Y3QgY29tbWFuZCAqY21kKQoreworCXN0cnVjdCBjb21tYW5kICpjbWRfcDsKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICoqYXJndjsKKworCWlmIChhY2Nlc3ModXBkYXRlX3Bvc3RfaG9vaywgWF9PSykgPCAwKQorCQlyZXR1cm47CisJZm9yIChhcmdjID0gMSwgY21kX3AgPSBjbWQ7IGNtZF9wOyBjbWRfcCA9IGNtZF9wLT5uZXh0KSB7CisJCWlmIChjbWRfcC0+ZXJyb3Jfc3RyaW5nKQorCQkJY29udGludWU7CisJCWFyZ2MrKzsKKwl9CisJYXJndiA9IHhtYWxsb2Moc2l6ZW9mKCphcmd2KSAqICgxICsgYXJnYykpOworCWFyZ3ZbMF0gPSB1cGRhdGVfcG9zdF9ob29rOworCisJZm9yIChhcmdjID0gMSwgY21kX3AgPSBjbWQ7IGNtZF9wOyBjbWRfcCA9IGNtZF9wLT5uZXh0KSB7CisJCWNoYXIgKnA7CisJCWlmIChjbWRfcC0+ZXJyb3Jfc3RyaW5nKQorCQkJY29udGludWU7CisJCXAgPSB4bWFsbG9jKHN0cmxlbihjbWRfcC0+cmVmX25hbWUpICsgMSk7CisJCXN0cmNweShwLCBjbWRfcC0+cmVmX25hbWUpOworCQlhcmd2W2FyZ2NdID0gcDsKKwkJYXJnYysrOworCX0KKwlhcmd2W2FyZ2NdID0gTlVMTDsKKwlydW5fY29tbWFuZF92X29wdChhcmdjLCBhcmd2LCBSVU5fQ09NTUFORF9OT19TVERJTyk7Cit9CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIGFmdGVyKGlmKSB3ZSd2ZSBzdWNjZXNzZnVsbHkKKyAqIHVucGFja2VkIHRoZSBkYXRhIHBheWxvYWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4ZWN1dGVfY29tbWFuZHModm9pZCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqY21kID0gY29tbWFuZHM7CisKKwl3aGlsZSAoY21kKSB7CisJCXVwZGF0ZShjbWQpOworCQljbWQgPSBjbWQtPm5leHQ7CisJfQorCXJ1bl91cGRhdGVfcG9zdF9ob29rKGNvbW1hbmRzKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9oZWFkX2luZm8odm9pZCkKK3sKKwlzdHJ1Y3QgY29tbWFuZCAqKnAgPSAmY29tbWFuZHM7CisJZm9yICg7OykgeworCQlzdGF0aWMgY2hhciBsaW5lWzEwMDBdOworCQl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXSwgbmV3X3NoYTFbMjBdOworCQlzdHJ1Y3QgY29tbWFuZCAqY21kOworCQljaGFyICpyZWZuYW1lOworCQlpbnQgbGVuLCByZWZsZW47CisKKwkJbGVuID0gcGFja2V0X3JlYWRfbGluZSgwLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAobGluZVtsZW4tMV0gPT0gJ1xuJykKKwkJCWxpbmVbLS1sZW5dID0gMDsKKwkJaWYgKGxlbiA8IDgzIHx8CisJCSAgICBsaW5lWzQwXSAhPSAnICcgfHwKKwkJICAgIGxpbmVbODFdICE9ICcgJyB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUsIG9sZF9zaGExKSB8fAorCQkgICAgZ2V0X3NoYTFfaGV4KGxpbmUgKyA0MSwgbmV3X3NoYTEpKQorCQkJZGllKCJwcm90b2NvbCBlcnJvcjogZXhwZWN0ZWQgb2xkL25ldy9yZWYsIGdvdCAnJXMnIiwKKwkJCSAgICBsaW5lKTsKKworCQlyZWZuYW1lID0gbGluZSArIDgyOworCQlyZWZsZW4gPSBzdHJsZW4ocmVmbmFtZSk7CisJCWlmIChyZWZsZW4gKyA4MiA8IGxlbikgeworCQkJaWYgKHN0cnN0cihyZWZuYW1lICsgcmVmbGVuICsgMSwgInJlcG9ydC1zdGF0dXMiKSkKKwkJCQlyZXBvcnRfc3RhdHVzID0gMTsKKwkJfQorCQljbWQgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbWFuZCkgKyBsZW4gLSA4MCk7CisJCW1lbWNweShjbWQtPm9sZF9zaGExLCBvbGRfc2hhMSwgMjApOworCQltZW1jcHkoY21kLT5uZXdfc2hhMSwgbmV3X3NoYTEsIDIwKTsKKwkJbWVtY3B5KGNtZC0+cmVmX25hbWUsIGxpbmUgKyA4MiwgbGVuIC0gODEpOworCQljbWQtPmVycm9yX3N0cmluZyA9ICJuL2EgKHVucGFja2VyIGVycm9yKSI7CisJCWNtZC0+bmV4dCA9IE5VTEw7CisJCSpwID0gY21kOworCQlwID0gJmNtZC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp1bnBhY2soaW50ICplcnJvcl9jb2RlKQoreworCWludCBjb2RlID0gcnVuX2NvbW1hbmRfdl9vcHQoMSwgdW5wYWNrZXIsIFJVTl9HSVRfQ01EKTsKKworCSplcnJvcl9jb2RlID0gMDsKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIDA6CisJCXJldHVybiBOVUxMOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9GT1JLOgorCQlyZXR1cm4gInVucGFjayBmb3JrIGZhaWxlZCI7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX0VYRUM6CisJCXJldHVybiAidW5wYWNrIGV4ZWN1dGUgZmFpbGVkIjsKKwljYXNlIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDoKKwkJcmV0dXJuICJ3YWl0cGlkIGZhaWxlZCI7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOgorCQlyZXR1cm4gIndhaXRwaWQgaXMgY29uZnVzZWQiOworCWNhc2UgLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDoKKwkJcmV0dXJuICJ1bnBhY2tlciBkaWVkIG9mIHNpZ25hbCI7CisJY2FzZSAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElUOgorCQlyZXR1cm4gInVucGFja2VyIGRpZWQgc3RyYW5nZWx5IjsKKwlkZWZhdWx0OgorCQkqZXJyb3JfY29kZSA9IC1jb2RlOworCQlyZXR1cm4gInVucGFja2VyIGV4aXRlZCB3aXRoIGVycm9yIGNvZGUiOworCX0KK30KKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKnVucGFja19zdGF0dXMpCit7CisJc3RydWN0IGNvbW1hbmQgKmNtZDsKKwlwYWNrZXRfd3JpdGUoMSwgInVucGFjayAlc1xuIiwKKwkJICAgICB1bnBhY2tfc3RhdHVzID8gdW5wYWNrX3N0YXR1cyA6ICJvayIpOworCWZvciAoY21kID0gY29tbWFuZHM7IGNtZDsgY21kID0gY21kLT5uZXh0KSB7CisJCWlmICghY21kLT5lcnJvcl9zdHJpbmcpCisJCQlwYWNrZXRfd3JpdGUoMSwgIm9rICVzXG4iLAorCQkJCSAgICAgY21kLT5yZWZfbmFtZSk7CisJCWVsc2UKKwkJCXBhY2tldF93cml0ZSgxLCAibmcgJXMgJXNcbiIsCisJCQkJICAgICBjbWQtPnJlZl9uYW1lLCBjbWQtPmVycm9yX3N0cmluZyk7CisJfQorCXBhY2tldF9mbHVzaCgxKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWNoYXIgKmRpciA9IE5VTEw7CisKKwlhcmd2Kys7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSAqYXJndisrOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJLyogRG8gZmxhZyBoYW5kbGluZyBoZXJlICovCisJCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCQl9CisJCWlmIChkaXIpCisJCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCQlkaXIgPSBhcmc7CisJfQorCWlmICghZGlyKQorCQl1c2FnZShyZWNlaXZlX3BhY2tfdXNhZ2UpOworCisJaWYoIWVudGVyX3JlcG8oZGlyLCAwKSkKKwkJZGllKCInJXMnOiB1bmFibGUgdG8gY2hkaXIgb3Igbm90IGEgZ2l0IGFyY2hpdmUiLCBkaXIpOworCisJd3JpdGVfaGVhZF9pbmZvKCk7CisKKwkvKiBFT0YgKi8KKwlwYWNrZXRfZmx1c2goMSk7CisKKwlyZWFkX2hlYWRfaW5mbygpOworCWlmIChjb21tYW5kcykgeworCQlpbnQgY29kZTsKKwkJY29uc3QgY2hhciAqdW5wYWNrX3N0YXR1cyA9IHVucGFjaygmY29kZSk7CisJCWlmICghdW5wYWNrX3N0YXR1cykKKwkJCWV4ZWN1dGVfY29tbWFuZHMoKTsKKwkJaWYgKHJlcG9ydF9zdGF0dXMpCisJCQlyZXBvcnQodW5wYWNrX3N0YXR1cyk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmVmcy5jIGIvcmVmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWY5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWZzLmMKQEAgLTAsMCArMSw1MTggQEAKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIFdlIGFsbG93ICJyZWN1cnNpdmUiIHN5bWJvbGljIHJlZnMuIE9ubHkgd2l0aGluIHJlYXNvbiwgdGhvdWdoICovCisjZGVmaW5lIE1BWERFUFRIIDUKKworY29uc3QgY2hhciAqcmVzb2x2ZV9yZWYoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IHJlYWRpbmcpCit7CisJaW50IGRlcHRoID0gTUFYREVQVEgsIGxlbjsKKwljaGFyIGJ1ZmZlclsyNTZdOworCisJZm9yICg7OykgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqYnVmOworCQlpbnQgZmQ7CisKKwkJaWYgKC0tZGVwdGggPCAwKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogU3BlY2lhbCBjYXNlOiBub24tZXhpc3RpbmcgZmlsZS4KKwkJICogTm90IGhhdmluZyB0aGUgcmVmcy9oZWFkcy9uZXctYnJhbmNoIGlzIE9LCisJCSAqIGlmIHdlIGFyZSB3cml0aW5nIGludG8gaXQsIHNvIGlzIC5naXQvSEVBRAorCQkgKiB0aGF0IHBvaW50cyBhdCByZWZzL2hlYWRzL21hc3RlciBzdGlsbCB0byBiZQorCQkgKiBib3JuLiAgSXQgaXMgTk9UIE9LIGlmIHdlIGFyZSByZXNvbHZpbmcgZm9yCisJCSAqIHJlYWRpbmcuCisJCSAqLworCQlpZiAobHN0YXQocGF0aCwgJnN0KSA8IDApIHsKKwkJCWlmIChyZWFkaW5nIHx8IGVycm5vICE9IEVOT0VOVCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW1lbXNldChzaGExLCAwLCAyMCk7CisJCQlyZXR1cm4gcGF0aDsKKwkJfQorCisJCS8qIEZvbGxvdyAibm9ybWFsaXplZCIgLSBpZSAicmVmcy8uLiIgc3ltbGlua3MgYnkgaGFuZCAqLworCQlpZiAoU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQkJbGVuID0gcmVhZGxpbmsocGF0aCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJCWlmIChsZW4gPj0gNSAmJiAhbWVtY21wKCJyZWZzLyIsIGJ1ZmZlciwgNSkpIHsKKwkJCQlwYXRoID0gZ2l0X3BhdGgoIiUuKnMiLCBsZW4sIGJ1ZmZlcik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBBbnl0aGluZyBlbHNlLCBqdXN0IG9wZW4gaXQgYW5kIHRyeSB0byB1c2UgaXQgYXMKKwkJICogYSByZWYKKwkJICovCisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gcmVhZChmZCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKS0xKTsKKwkJY2xvc2UoZmQpOworCisJCS8qCisJCSAqIElzIGl0IGEgc3ltYm9saWMgcmVmPworCQkgKi8KKwkJaWYgKGxlbiA8IDQgfHwgbWVtY21wKCJyZWY6IiwgYnVmZmVyLCA0KSkKKwkJCWJyZWFrOworCQlidWYgPSBidWZmZXIgKyA0OworCQlsZW4gLT0gNDsKKwkJd2hpbGUgKGxlbiAmJiBpc3NwYWNlKCpidWYpKQorCQkJYnVmKyssIGxlbi0tOworCQl3aGlsZSAobGVuICYmIGlzc3BhY2UoYnVmW2xlbi0xXSkpCisJCQlidWZbLS1sZW5dID0gMDsKKwkJcGF0aCA9IGdpdF9wYXRoKCIlLipzIiwgbGVuLCBidWYpOworCX0KKwlpZiAobGVuIDwgNDAgfHwgZ2V0X3NoYTFfaGV4KGJ1ZmZlciwgc2hhMSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBwYXRoOworfQorCitpbnQgY3JlYXRlX3N5bXJlZihjb25zdCBjaGFyICpnaXRfSEVBRCwgY29uc3QgY2hhciAqcmVmc19oZWFkc19tYXN0ZXIpCit7CisJY29uc3QgY2hhciAqbG9ja3BhdGg7CisJY2hhciByZWZbMTAwMF07CisJaW50IGZkLCBsZW4sIHdyaXR0ZW47CisKKyNpZm5kZWYgTk9fU1lNTElOS19IRUFECisJaWYgKHByZWZlcl9zeW1saW5rX3JlZnMpIHsKKwkJdW5saW5rKGdpdF9IRUFEKTsKKwkJaWYgKCFzeW1saW5rKHJlZnNfaGVhZHNfbWFzdGVyLCBnaXRfSEVBRCkpCisJCQlyZXR1cm4gMDsKKwkJZnByaW50ZihzdGRlcnIsICJubyBzeW1saW5rIC0gZmFsbGluZyBiYWNrIHRvIHN5bWJvbGljIHJlZlxuIik7CisJfQorI2VuZGlmCisKKwlsZW4gPSBzbnByaW50ZihyZWYsIHNpemVvZihyZWYpLCAicmVmOiAlc1xuIiwgcmVmc19oZWFkc19tYXN0ZXIpOworCWlmIChzaXplb2YocmVmKSA8PSBsZW4pIHsKKwkJZXJyb3IoInJlZm5hbWUgdG9vIGxvbmc6ICVzIiwgcmVmc19oZWFkc19tYXN0ZXIpOworCQlyZXR1cm4gLTE7CisJfQorCWxvY2twYXRoID0gbWtwYXRoKCIlcy5sb2NrIiwgZ2l0X0hFQUQpOworCWZkID0gb3Blbihsb2NrcGF0aCwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjY2KTsJCisJd3JpdHRlbiA9IHdyaXRlKGZkLCByZWYsIGxlbik7CisJY2xvc2UoZmQpOworCWlmICh3cml0dGVuICE9IGxlbikgeworCQl1bmxpbmsobG9ja3BhdGgpOworCQllcnJvcigiVW5hYmxlIHRvIHdyaXRlIHRvICVzIiwgbG9ja3BhdGgpOworCQlyZXR1cm4gLTI7CisJfQorCWlmIChyZW5hbWUobG9ja3BhdGgsIGdpdF9IRUFEKSA8IDApIHsKKwkJdW5saW5rKGxvY2twYXRoKTsKKwkJZXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgJXMiLCBnaXRfSEVBRCk7CisJCXJldHVybiAtMzsKKwl9CisJaWYgKGFkanVzdF9zaGFyZWRfcGVybShnaXRfSEVBRCkpIHsKKwkJdW5saW5rKGxvY2twYXRoKTsKKwkJZXJyb3IoIlVuYWJsZSB0byBmaXggcGVybWlzc2lvbnMgb24gJXMiLCBsb2NrcGF0aCk7CisJCXJldHVybiAtNDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWFkX3JlZihjb25zdCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAocmVzb2x2ZV9yZWYoZmlsZW5hbWUsIHNoYTEsIDEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fZm9yX2VhY2hfcmVmKGNvbnN0IGNoYXIgKmJhc2UsIGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSwgaW50IHRyaW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJRElSICpkaXIgPSBvcGVuZGlyKGdpdF9wYXRoKCIlcyIsIGJhc2UpKTsKKworCWlmIChkaXIpIHsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCWludCBiYXNlbGVuID0gc3RybGVuKGJhc2UpOworCQljaGFyICpwYXRoID0geG1hbGxvYyhiYXNlbGVuICsgMjU3KTsKKworCQlpZiAoIXN0cm5jbXAoYmFzZSwgIi4vIiwgMikpIHsKKwkJCWJhc2UgKz0gMjsKKwkJCWJhc2VsZW4gLT0gMjsKKwkJfQorCQltZW1jcHkocGF0aCwgYmFzZSwgYmFzZWxlbik7CisJCWlmIChiYXNlbGVuICYmIGJhc2VbYmFzZWxlbi0xXSAhPSAnLycpCisJCQlwYXRoW2Jhc2VsZW4rK10gPSAnLyc7CisKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaW50IG5hbWVsZW47CisKKwkJCWlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykKKwkJCQljb250aW51ZTsKKwkJCW5hbWVsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSk7CisJCQlpZiAobmFtZWxlbiA+IDI1NSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChoYXNfZXh0ZW5zaW9uKGRlLT5kX25hbWUsICIubG9jayIpKQorCQkJCWNvbnRpbnVlOworCQkJbWVtY3B5KHBhdGggKyBiYXNlbGVuLCBkZS0+ZF9uYW1lLCBuYW1lbGVuKzEpOworCQkJaWYgKHN0YXQoZ2l0X3BhdGgoIiVzIiwgcGF0aCksICZzdCkgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCQlyZXR2YWwgPSBkb19mb3JfZWFjaF9yZWYocGF0aCwgZm4sIHRyaW0pOworCQkJCWlmIChyZXR2YWwpCisJCQkJCWJyZWFrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHJlYWRfcmVmKGdpdF9wYXRoKCIlcyIsIHBhdGgpLCBzaGExKSA8IDApIHsKKwkJCQllcnJvcigiJXMgcG9pbnRzIG5vd2hlcmUhIiwgcGF0aCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWhhc19zaGExX2ZpbGUoc2hhMSkpIHsKKwkJCQllcnJvcigiJXMgZG9lcyBub3QgcG9pbnQgdG8gYSB2YWxpZCAiCisJCQkJICAgICAgImNvbW1pdCBvYmplY3QhIiwgcGF0aCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR2YWwgPSBmbihwYXRoICsgdHJpbSwgc2hhMSk7CisJCQlpZiAocmV0dmFsKQorCQkJCWJyZWFrOworCQl9CisJCWZyZWUocGF0aCk7CisJCWNsb3NlZGlyKGRpcik7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBoZWFkX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpZiAoIXJlYWRfcmVmKGdpdF9wYXRoKCJIRUFEIiksIHNoYTEpKQorCQlyZXR1cm4gZm4oIkhFQUQiLCBzaGExKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGZvcl9lYWNoX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpCit7CisJcmV0dXJuIGRvX2Zvcl9lYWNoX3JlZigicmVmcyIsIGZuLCAwKTsKK30KKworaW50IGZvcl9lYWNoX3RhZ19yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKQoreworCXJldHVybiBkb19mb3JfZWFjaF9yZWYoInJlZnMvdGFncyIsIGZuLCAxMCk7Cit9CisKK2ludCBmb3JfZWFjaF9icmFuY2hfcmVmKGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSkKK3sKKwlyZXR1cm4gZG9fZm9yX2VhY2hfcmVmKCJyZWZzL2hlYWRzIiwgZm4sIDExKTsKK30KKworaW50IGZvcl9lYWNoX3JlbW90ZV9yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKQoreworCXJldHVybiBkb19mb3JfZWFjaF9yZWYoInJlZnMvcmVtb3RlcyIsIGZuLCAxMyk7Cit9CisKK2ludCBnZXRfcmVmX3NoYTEoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWlmIChjaGVja19yZWZfZm9ybWF0KHJlZikpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gcmVhZF9yZWYoZ2l0X3BhdGgoInJlZnMvJXMiLCByZWYpLCBzaGExKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSAicmVmIiBpcyBzb21ldGhpbmcgcmVhc29uYWJsZSB0byBoYXZlIHVuZGVyICIuZ2l0L3JlZnMvIjsKKyAqIFdlIGRvIG5vdCBsaWtlIGl0IGlmOgorICoKKyAqIC0gYW55IHBhdGggY29tcG9uZW50IG9mIGl0IGJlZ2lucyB3aXRoICIuIiwgb3IKKyAqIC0gaXQgaGFzIGRvdWJsZSBkb3RzICIuLiIsIG9yCisgKiAtIGl0IGhhcyBBU0NJSSBjb250cm9sIGNoYXJhY3RlciwgIn4iLCAiXiIsICI6IiBvciBTUCwgYW55d2hlcmUsIG9yCisgKiAtIGl0IGVuZHMgd2l0aCBhICIvIi4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBiYWRfcmVmX2NoYXIoaW50IGNoKQoreworCXJldHVybiAoKCh1bnNpZ25lZCkgY2gpIDw9ICcgJyB8fAorCQljaCA9PSAnficgfHwgY2ggPT0gJ14nIHx8IGNoID09ICc6JyB8fAorCQkvKiAyLjEzIFBhdHRlcm4gTWF0Y2hpbmcgTm90YXRpb24gKi8KKwkJY2ggPT0gJz8nIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnWycpOworfQorCitpbnQgY2hlY2tfcmVmX2Zvcm1hdChjb25zdCBjaGFyICpyZWYpCit7CisJaW50IGNoLCBsZXZlbDsKKwljb25zdCBjaGFyICpjcCA9IHJlZjsKKworCWxldmVsID0gMDsKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoKGNoID0gKmNwKyspID09ICcvJykKKwkJCTsgLyogdG9sZXJhdGUgZHVwbGljYXRlZCBzbGFzaGVzICovCisJCWlmICghY2gpCisJCQlyZXR1cm4gLTE7IC8qIHNob3VsZCBub3QgZW5kIHdpdGggc2xhc2hlcyAqLworCisJCS8qIHdlIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXRoIGNvbXBvbmVudCAqLworCQlpZiAoY2ggPT0gJy4nIHx8IGJhZF9yZWZfY2hhcihjaCkpCisJCQlyZXR1cm4gLTE7CisKKwkJLyogc2NhbiB0aGUgcmVzdCBvZiB0aGUgcGF0aCBjb21wb25lbnQgKi8KKwkJd2hpbGUgKChjaCA9ICpjcCsrKSAhPSAwKSB7CisJCQlpZiAoYmFkX3JlZl9jaGFyKGNoKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoY2ggPT0gJy8nKQorCQkJCWJyZWFrOworCQkJaWYgKGNoID09ICcuJyAmJiAqY3AgPT0gJy4nKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQlsZXZlbCsrOworCQlpZiAoIWNoKSB7CisJCQlpZiAobGV2ZWwgPCAyKQorCQkJCXJldHVybiAtMTsgLyogYXQgbGVhc3Qgb2YgZm9ybSAiaGVhZHMvYmxhaCIgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHJlZl9sb2NrICp2ZXJpZnlfbG9jayhzdHJ1Y3QgcmVmX2xvY2sgKmxvY2ssCisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsIGludCBtdXN0ZXhpc3QpCit7CisJY2hhciBidWZbNDBdOworCWludCBuciwgZmQgPSBvcGVuKGxvY2stPnJlZl9maWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCAmJiAobXVzdGV4aXN0IHx8IGVycm5vICE9IEVOT0VOVCkpIHsKKwkJZXJyb3IoIkNhbid0IHZlcmlmeSByZWYgJXMiLCBsb2NrLT5yZWZfZmlsZSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiBOVUxMOworCX0KKwluciA9IHJlYWQoZmQsIGJ1ZiwgNDApOworCWNsb3NlKGZkKTsKKwlpZiAobnIgIT0gNDAgfHwgZ2V0X3NoYTFfaGV4KGJ1ZiwgbG9jay0+b2xkX3NoYTEpIDwgMCkgeworCQllcnJvcigiQ2FuJ3QgdmVyaWZ5IHJlZiAlcyIsIGxvY2stPnJlZl9maWxlKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChtZW1jbXAobG9jay0+b2xkX3NoYTEsIG9sZF9zaGExLCAyMCkpIHsKKwkJZXJyb3IoIlJlZiAlcyBpcyBhdCAlcyBidXQgZXhwZWN0ZWQgJXMiLCBsb2NrLT5yZWZfZmlsZSwKKwkJCXNoYTFfdG9faGV4KGxvY2stPm9sZF9zaGExKSwgc2hhMV90b19oZXgob2xkX3NoYTEpKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBsb2NrOworfQorCitzdGF0aWMgc3RydWN0IHJlZl9sb2NrICpsb2NrX3JlZl9zaGExX2Jhc2ljKGNvbnN0IGNoYXIgKnBhdGgsCisJaW50IHBsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsIGludCBtdXN0ZXhpc3QpCit7CisJY29uc3QgY2hhciAqb3JpZ19wYXRoID0gcGF0aDsKKwlzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlsb2NrID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJlZl9sb2NrKSk7CisJbG9jay0+bG9ja19mZCA9IC0xOworCisJcGxlbiA9IHN0cmxlbihwYXRoKSAtIHBsZW47CisJcGF0aCA9IHJlc29sdmVfcmVmKHBhdGgsIGxvY2stPm9sZF9zaGExLCBtdXN0ZXhpc3QpOworCWlmICghcGF0aCkgeworCQlpbnQgbGFzdF9lcnJubyA9IGVycm5vOworCQllcnJvcigidW5hYmxlIHRvIHJlc29sdmUgcmVmZXJlbmNlICVzOiAlcyIsCisJCQlvcmlnX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXVubG9ja19yZWYobG9jayk7CisJCWVycm5vID0gbGFzdF9lcnJubzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWxvY2stPmxrID0geGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGxvY2tfZmlsZSkpOworCisJbG9jay0+cmVmX2ZpbGUgPSBzdHJkdXAocGF0aCk7CisJbG9jay0+bG9nX2ZpbGUgPSBzdHJkdXAoZ2l0X3BhdGgoImxvZ3MvJXMiLCBsb2NrLT5yZWZfZmlsZSArIHBsZW4pKTsKKwlsb2NrLT5mb3JjZV93cml0ZSA9IGxzdGF0KGxvY2stPnJlZl9maWxlLCAmc3QpICYmIGVycm5vID09IEVOT0VOVDsKKworCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKGxvY2stPnJlZl9maWxlKSkKKwkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeSBmb3IgJXMiLCBsb2NrLT5yZWZfZmlsZSk7CisJbG9jay0+bG9ja19mZCA9IGhvbGRfbG9ja19maWxlX2Zvcl91cGRhdGUobG9jay0+bGssIGxvY2stPnJlZl9maWxlLCAxKTsKKworCXJldHVybiBvbGRfc2hhMSA/IHZlcmlmeV9sb2NrKGxvY2ssIG9sZF9zaGExLCBtdXN0ZXhpc3QpIDogbG9jazsKK30KKworc3RydWN0IHJlZl9sb2NrICpsb2NrX3JlZl9zaGExKGNvbnN0IGNoYXIgKnJlZiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvbGRfc2hhMSwgaW50IG11c3RleGlzdCkKK3sKKwlpZiAoY2hlY2tfcmVmX2Zvcm1hdChyZWYpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbG9ja19yZWZfc2hhMV9iYXNpYyhnaXRfcGF0aCgicmVmcy8lcyIsIHJlZiksCisJCTUgKyBzdHJsZW4ocmVmKSwgb2xkX3NoYTEsIG11c3RleGlzdCk7Cit9CisKK3N0cnVjdCByZWZfbG9jayAqbG9ja19hbnlfcmVmX2Zvcl91cGRhdGUoY29uc3QgY2hhciAqcmVmLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgbXVzdGV4aXN0KQoreworCXJldHVybiBsb2NrX3JlZl9zaGExX2Jhc2ljKGdpdF9wYXRoKCIlcyIsIHJlZiksCisJCXN0cmxlbihyZWYpLCBvbGRfc2hhMSwgbXVzdGV4aXN0KTsKK30KKwordm9pZCB1bmxvY2tfcmVmKHN0cnVjdCByZWZfbG9jayAqbG9jaykKK3sKKwlpZiAobG9jay0+bG9ja19mZCA+PSAwKSB7CisJCWNsb3NlKGxvY2stPmxvY2tfZmQpOworCQkvKiBEbyBub3QgZnJlZSBsb2NrLT5sayAtLSBhdGV4aXQoKSBzdGlsbCBsb29rcyBhdCB0aGVtICovCisJCWlmIChsb2NrLT5saykKKwkJCXJvbGxiYWNrX2xvY2tfZmlsZShsb2NrLT5sayk7CisJfQorCWlmIChsb2NrLT5yZWZfZmlsZSkKKwkJZnJlZShsb2NrLT5yZWZfZmlsZSk7CisJaWYgKGxvY2stPmxvZ19maWxlKQorCQlmcmVlKGxvY2stPmxvZ19maWxlKTsKKwlmcmVlKGxvY2spOworfQorCitzdGF0aWMgaW50IGxvZ19yZWZfd3JpdGUoc3RydWN0IHJlZl9sb2NrICpsb2NrLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKm1zZykKK3sKKwlpbnQgbG9nZmQsIHdyaXR0ZW4sIG9mbGFncyA9IE9fQVBQRU5EIHwgT19XUk9OTFk7CisJdW5zaWduZWQgbWF4bGVuLCBsZW47CisJY2hhciAqbG9ncmVjOworCWNvbnN0IGNoYXIgKmNvbW1pdHRlcjsKKworCWlmIChsb2dfYWxsX3JlZl91cGRhdGVzKSB7CisJCWlmIChzYWZlX2NyZWF0ZV9sZWFkaW5nX2RpcmVjdG9yaWVzKGxvY2stPmxvZ19maWxlKSA8IDApCisJCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGZvciAlcyIsCisJCQkJbG9jay0+bG9nX2ZpbGUpOworCQlvZmxhZ3MgfD0gT19DUkVBVDsKKwl9CisKKwlsb2dmZCA9IG9wZW4obG9jay0+bG9nX2ZpbGUsIG9mbGFncywgMDY2Nik7CisJaWYgKGxvZ2ZkIDwgMCkgeworCQlpZiAoIWxvZ19hbGxfcmVmX3VwZGF0ZXMgJiYgZXJybm8gPT0gRU5PRU5UKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBlcnJvcigiVW5hYmxlIHRvIGFwcGVuZCB0byAlczogJXMiLAorCQkJbG9jay0+bG9nX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJY29tbWl0dGVyID0gZ2l0X2NvbW1pdHRlcl9pbmZvKDEpOworCWlmIChtc2cpIHsKKwkJbWF4bGVuID0gc3RybGVuKGNvbW1pdHRlcikgKyBzdHJsZW4obXNnKSArIDIqNDAgKyA1OworCQlsb2dyZWMgPSB4bWFsbG9jKG1heGxlbik7CisJCWxlbiA9IHNucHJpbnRmKGxvZ3JlYywgbWF4bGVuLCAiJXMgJXMgJXNcdCVzXG4iLAorCQkJc2hhMV90b19oZXgobG9jay0+b2xkX3NoYTEpLAorCQkJc2hhMV90b19oZXgoc2hhMSksCisJCQljb21taXR0ZXIsCisJCQltc2cpOworCX0KKwllbHNlIHsKKwkJbWF4bGVuID0gc3RybGVuKGNvbW1pdHRlcikgKyAyKjQwICsgNDsKKwkJbG9ncmVjID0geG1hbGxvYyhtYXhsZW4pOworCQlsZW4gPSBzbnByaW50Zihsb2dyZWMsIG1heGxlbiwgIiVzICVzICVzXG4iLAorCQkJc2hhMV90b19oZXgobG9jay0+b2xkX3NoYTEpLAorCQkJc2hhMV90b19oZXgoc2hhMSksCisJCQljb21taXR0ZXIpOworCX0KKwl3cml0dGVuID0gbGVuIDw9IG1heGxlbiA/IHdyaXRlKGxvZ2ZkLCBsb2dyZWMsIGxlbikgOiAtMTsKKwlmcmVlKGxvZ3JlYyk7CisJY2xvc2UobG9nZmQpOworCWlmICh3cml0dGVuICE9IGxlbikKKwkJcmV0dXJuIGVycm9yKCJVbmFibGUgdG8gYXBwZW5kIHRvICVzIiwgbG9jay0+bG9nX2ZpbGUpOworCXJldHVybiAwOworfQorCitpbnQgd3JpdGVfcmVmX3NoYTEoc3RydWN0IHJlZl9sb2NrICpsb2NrLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNvbnN0IGNoYXIgKmxvZ21zZykKK3sKKwlzdGF0aWMgY2hhciB0ZXJtID0gJ1xuJzsKKworCWlmICghbG9jaykKKwkJcmV0dXJuIC0xOworCWlmICghbG9jay0+Zm9yY2Vfd3JpdGUgJiYgIW1lbWNtcChsb2NrLT5vbGRfc2hhMSwgc2hhMSwgMjApKSB7CisJCXVubG9ja19yZWYobG9jayk7CisJCXJldHVybiAwOworCX0KKwlpZiAod3JpdGUobG9jay0+bG9ja19mZCwgc2hhMV90b19oZXgoc2hhMSksIDQwKSAhPSA0MCB8fAorCSAgICB3cml0ZShsb2NrLT5sb2NrX2ZkLCAmdGVybSwgMSkgIT0gMQorCQl8fCBjbG9zZShsb2NrLT5sb2NrX2ZkKSA8IDApIHsKKwkJZXJyb3IoIkNvdWxkbid0IHdyaXRlICVzIiwgbG9jay0+bGstPmZpbGVuYW1lKTsKKwkJdW5sb2NrX3JlZihsb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAobG9nX3JlZl93cml0ZShsb2NrLCBzaGExLCBsb2dtc2cpIDwgMCkgeworCQl1bmxvY2tfcmVmKGxvY2spOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChjb21taXRfbG9ja19maWxlKGxvY2stPmxrKSkgeworCQllcnJvcigiQ291bGRuJ3Qgc2V0ICVzIiwgbG9jay0+cmVmX2ZpbGUpOworCQl1bmxvY2tfcmVmKGxvY2spOworCQlyZXR1cm4gLTE7CisJfQorCWxvY2stPmxvY2tfZmQgPSAtMTsKKwl1bmxvY2tfcmVmKGxvY2spOworCXJldHVybiAwOworfQorCitpbnQgcmVhZF9yZWZfYXQoY29uc3QgY2hhciAqcmVmLCB1bnNpZ25lZCBsb25nIGF0X3RpbWUsIHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJY29uc3QgY2hhciAqbG9nZmlsZSwgKmxvZ2RhdGEsICpsb2dlbmQsICpyZWMsICpsYXN0Z3QsICpsYXN0cmVjOworCWNoYXIgKnR6X2M7CisJaW50IGxvZ2ZkLCB0ejsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl1bnNpZ25lZCBsb25nIGRhdGU7CisJdW5zaWduZWQgY2hhciBsb2dnZWRfc2hhMVsyMF07CisKKwlsb2dmaWxlID0gZ2l0X3BhdGgoImxvZ3MvJXMiLCByZWYpOworCWxvZ2ZkID0gb3Blbihsb2dmaWxlLCBPX1JET05MWSwgMCk7CisJaWYgKGxvZ2ZkIDwgMCkKKwkJZGllKCJVbmFibGUgdG8gcmVhZCBsb2cgJXM6ICVzIiwgbG9nZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwlmc3RhdChsb2dmZCwgJnN0KTsKKwlpZiAoIXN0LnN0X3NpemUpCisJCWRpZSgiTG9nICVzIGlzIGVtcHR5LiIsIGxvZ2ZpbGUpOworCWxvZ2RhdGEgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGxvZ2ZkLCAwKTsKKwljbG9zZShsb2dmZCk7CisKKwlsYXN0cmVjID0gTlVMTDsKKwlyZWMgPSBsb2dlbmQgPSBsb2dkYXRhICsgc3Quc3Rfc2l6ZTsKKwl3aGlsZSAobG9nZGF0YSA8IHJlYykgeworCQlpZiAobG9nZGF0YSA8IHJlYyAmJiAqKHJlYy0xKSA9PSAnXG4nKQorCQkJcmVjLS07CisJCWxhc3RndCA9IE5VTEw7CisJCXdoaWxlIChsb2dkYXRhIDwgcmVjICYmICoocmVjLTEpICE9ICdcbicpIHsKKwkJCXJlYy0tOworCQkJaWYgKCpyZWMgPT0gJz4nKQorCQkJCWxhc3RndCA9IHJlYzsKKwkJfQorCQlpZiAoIWxhc3RndCkKKwkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCWRhdGUgPSBzdHJ0b3VsKGxhc3RndCArIDEsICZ0el9jLCAxMCk7CisJCWlmIChkYXRlIDw9IGF0X3RpbWUpIHsKKwkJCWlmIChsYXN0cmVjKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChsYXN0cmVjLCBsb2dnZWRfc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKGdldF9zaGExX2hleChyZWMgKyA0MSwgc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKG1lbWNtcChsb2dnZWRfc2hhMSwgc2hhMSwgMjApKSB7CisJCQkJCXR6ID0gc3RydG91bCh0el9jLCBOVUxMLCAxMCk7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIndhcm5pbmc6IExvZyAlcyBoYXMgZ2FwIGFmdGVyICVzLlxuIiwKKwkJCQkJCWxvZ2ZpbGUsIHNob3dfcmZjMjgyMl9kYXRlKGRhdGUsIHR6KSk7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoZGF0ZSA9PSBhdF90aW1lKSB7CisJCQkJaWYgKGdldF9zaGExX2hleChyZWMgKyA0MSwgc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoZ2V0X3NoYTFfaGV4KHJlYyArIDQxLCBsb2dnZWRfc2hhMSkpCisJCQkJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJCQkJaWYgKG1lbWNtcChsb2dnZWRfc2hhMSwgc2hhMSwgMjApKSB7CisJCQkJCXR6ID0gc3RydG91bCh0el9jLCBOVUxMLCAxMCk7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkJIndhcm5pbmc6IExvZyAlcyB1bmV4cGVjdGVkbHkgZW5kZWQgb24gJXMuXG4iLAorCQkJCQkJbG9nZmlsZSwgc2hvd19yZmMyODIyX2RhdGUoZGF0ZSwgdHopKTsKKwkJCQl9CisJCQl9CisJCQltdW5tYXAoKHZvaWQqKWxvZ2RhdGEsIHN0LnN0X3NpemUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGFzdHJlYyA9IHJlYzsKKwl9CisKKwlyZWMgPSBsb2dkYXRhOworCXdoaWxlIChyZWMgPCBsb2dlbmQgJiYgKnJlYyAhPSAnPicgJiYgKnJlYyAhPSAnXG4nKQorCQlyZWMrKzsKKwlpZiAocmVjID09IGxvZ2VuZCB8fCAqcmVjID09ICdcbicpCisJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJZGF0ZSA9IHN0cnRvdWwocmVjICsgMSwgJnR6X2MsIDEwKTsKKwl0eiA9IHN0cnRvdWwodHpfYywgTlVMTCwgMTApOworCWlmIChnZXRfc2hhMV9oZXgobG9nZGF0YSwgc2hhMSkpCisJCWRpZSgiTG9nICVzIGlzIGNvcnJ1cHQuIiwgbG9nZmlsZSk7CisJbXVubWFwKCh2b2lkKilsb2dkYXRhLCBzdC5zdF9zaXplKTsKKwlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IExvZyAlcyBvbmx5IGdvZXMgYmFjayB0byAlcy5cbiIsCisJCWxvZ2ZpbGUsIHNob3dfcmZjMjgyMl9kYXRlKGRhdGUsIHR6KSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yZWZzLmggYi9yZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzMTU1YwotLS0gL2Rldi9udWxsCisrKyBiL3JlZnMuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIFJFRlNfSAorI2RlZmluZSBSRUZTX0gKKworc3RydWN0IHJlZl9sb2NrIHsKKwljaGFyICpyZWZfZmlsZTsKKwljaGFyICpsb2dfZmlsZTsKKwlzdHJ1Y3QgbG9ja19maWxlICpsazsKKwl1bnNpZ25lZCBjaGFyIG9sZF9zaGExWzIwXTsKKwlpbnQgbG9ja19mZDsKKwlpbnQgZm9yY2Vfd3JpdGU7Cit9OworCisvKgorICogQ2FsbHMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBmb3IgZWFjaCByZWYgZmlsZSB1bnRpbCBpdCByZXR1cm5zIG5vbnplcm8sCisgKiBhbmQgcmV0dXJucyB0aGUgdmFsdWUKKyAqLworZXh0ZXJuIGludCBoZWFkX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpOworZXh0ZXJuIGludCBmb3JfZWFjaF9yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKTsKK2V4dGVybiBpbnQgZm9yX2VhY2hfdGFnX3JlZihpbnQgKCpmbikoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkpOworZXh0ZXJuIGludCBmb3JfZWFjaF9icmFuY2hfcmVmKGludCAoKmZuKShjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKSk7CitleHRlcm4gaW50IGZvcl9lYWNoX3JlbW90ZV9yZWYoaW50ICgqZm4pKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpKTsKKworLyoqIFJlYWRzIHRoZSByZWZzIGZpbGUgc3BlY2lmaWVkIGludG8gc2hhMSAqKi8KK2V4dGVybiBpbnQgZ2V0X3JlZl9zaGExKGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKKy8qKiBMb2NrcyBhICJyZWZzLyIgcmVmIHJldHVybmluZyB0aGUgbG9jayBvbiBzdWNjZXNzIGFuZCBOVUxMIG9uIGZhaWx1cmUuICoqLworZXh0ZXJuIHN0cnVjdCByZWZfbG9jayAqbG9ja19yZWZfc2hhMShjb25zdCBjaGFyICpyZWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExLCBpbnQgbXVzdGV4aXN0KTsKKworLyoqIExvY2tzIGFueSByZWYgKGZvciAnSEVBRCcgdHlwZSByZWZzKS4gKi8KK2V4dGVybiBzdHJ1Y3QgcmVmX2xvY2sgKmxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKGNvbnN0IGNoYXIgKnJlZiwgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsIGludCBtdXN0ZXhpc3QpOworCisvKiogUmVsZWFzZSBhbnkgbG9jayB0YWtlbiBidXQgbm90IHdyaXR0ZW4uICoqLworZXh0ZXJuIHZvaWQgdW5sb2NrX3JlZihzdHJ1Y3QgcmVmX2xvY2sgKmxvY2spOworCisvKiogV3JpdGVzIHNoYTEgaW50byB0aGUgcmVmIHNwZWNpZmllZCBieSB0aGUgbG9jay4gKiovCitleHRlcm4gaW50IHdyaXRlX3JlZl9zaGExKHN0cnVjdCByZWZfbG9jayAqbG9jaywgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqbXNnKTsKKworLyoqIFJlYWRzIGxvZyBmb3IgdGhlIHZhbHVlIG9mIHJlZiBkdXJpbmcgYXRfdGltZS4gKiovCitleHRlcm4gaW50IHJlYWRfcmVmX2F0KGNvbnN0IGNoYXIgKnJlZiwgdW5zaWduZWQgbG9uZyBhdF90aW1lLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworLyoqIFJldHVybnMgMCBpZiB0YXJnZXQgaGFzIHRoZSByaWdodCBmb3JtYXQgZm9yIGEgcmVmLiAqKi8KK2V4dGVybiBpbnQgY2hlY2tfcmVmX2Zvcm1hdChjb25zdCBjaGFyICp0YXJnZXQpOworCisjZW5kaWYgLyogUkVGU19IICovCmRpZmYgLS1naXQgYS9yZXZpc2lvbi5jIGIvcmV2aXNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkxZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvcmV2aXNpb24uYwpAQCAtMCwwICsxLDEwOTIgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAiZGlmZi5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJyZXZpc2lvbi5oIgorCitzdGF0aWMgY2hhciAqcGF0aF9uYW1lKHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG5hbWVfcGF0aCAqcDsKKwljaGFyICpuLCAqbTsKKwlpbnQgbmxlbiA9IHN0cmxlbihuYW1lKTsKKwlpbnQgbGVuID0gbmxlbiArIDE7CisKKwlmb3IgKHAgPSBwYXRoOyBwOyBwID0gcC0+dXApIHsKKwkJaWYgKHAtPmVsZW1fbGVuKQorCQkJbGVuICs9IHAtPmVsZW1fbGVuICsgMTsKKwl9CisJbiA9IHhtYWxsb2MobGVuKTsKKwltID0gbiArIGxlbiAtIChubGVuICsgMSk7CisJc3RyY3B5KG0sIG5hbWUpOworCWZvciAocCA9IHBhdGg7IHA7IHAgPSBwLT51cCkgeworCQlpZiAocC0+ZWxlbV9sZW4pIHsKKwkJCW0gLT0gcC0+ZWxlbV9sZW4gKyAxOworCQkJbWVtY3B5KG0sIHAtPmVsZW0sIHAtPmVsZW1fbGVuKTsKKwkJCW1bcC0+ZWxlbV9sZW5dID0gJy8nOworCQl9CisJfQorCXJldHVybiBuOworfQorCit2b2lkIGFkZF9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqLAorCQlzdHJ1Y3Qgb2JqZWN0X2FycmF5ICpwLAorCQlzdHJ1Y3QgbmFtZV9wYXRoICpwYXRoLAorCQljb25zdCBjaGFyICpuYW1lKQoreworCWFkZF9vYmplY3RfYXJyYXkob2JqLCBwYXRoX25hbWUocGF0aCwgbmFtZSksIHApOworfQorCitzdGF0aWMgdm9pZCBtYXJrX2Jsb2JfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgYmxvYiAqYmxvYikKK3sKKwlpZiAoYmxvYi0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJcmV0dXJuOworCWJsb2ItPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworfQorCit2b2lkIG1hcmtfdHJlZV91bmludGVyZXN0aW5nKHN0cnVjdCB0cmVlICp0cmVlKQoreworCXN0cnVjdCB0cmVlX2Rlc2MgZGVzYzsKKwlzdHJ1Y3QgbmFtZV9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmdHJlZS0+b2JqZWN0OworCisJaWYgKG9iai0+ZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQlyZXR1cm47CisJb2JqLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCWlmICghaGFzX3NoYTFfZmlsZShvYmotPnNoYTEpKQorCQlyZXR1cm47CisJaWYgKHBhcnNlX3RyZWUodHJlZSkgPCAwKQorCQlkaWUoImJhZCB0cmVlICVzIiwgc2hhMV90b19oZXgob2JqLT5zaGExKSk7CisKKwlkZXNjLmJ1ZiA9IHRyZWUtPmJ1ZmZlcjsKKwlkZXNjLnNpemUgPSB0cmVlLT5zaXplOworCXdoaWxlICh0cmVlX2VudHJ5KCZkZXNjLCAmZW50cnkpKSB7CisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcobG9va3VwX3RyZWUoZW50cnkuc2hhMSkpOworCQllbHNlCisJCQltYXJrX2Jsb2JfdW5pbnRlcmVzdGluZyhsb29rdXBfYmxvYihlbnRyeS5zaGExKSk7CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSB0cmVlIGFueSBtb3JlCisJICogYWZ0ZXIgaXQgaGFzIGJlZW4gbWFya2VkIHVuaW50ZXJlc3RpbmcuCisJICovCisJZnJlZSh0cmVlLT5idWZmZXIpOworCXRyZWUtPmJ1ZmZlciA9IE5VTEw7Cit9CisKK3ZvaWQgbWFya19wYXJlbnRzX3VuaW50ZXJlc3Rpbmcoc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50cyA9IGNvbW1pdC0+cGFyZW50czsKKworCXdoaWxlIChwYXJlbnRzKSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IHBhcmVudHMtPml0ZW07CisJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpIHsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisKKwkJCS8qCisJCQkgKiBOb3JtYWxseSB3ZSBoYXZlbid0IHBhcnNlZCB0aGUgcGFyZW50CisJCQkgKiB5ZXQsIHNvIHdlIHdvbid0IGhhdmUgYSBwYXJlbnQgb2YgYSBwYXJlbnQKKwkJCSAqIGhlcmUuIEhvd2V2ZXIsIGl0IG1heSB0dXJuIG91dCB0aGF0IHdlJ3ZlCisJCQkgKiByZWFjaGVkIHRoaXMgY29tbWl0IHNvbWUgb3RoZXIgd2F5ICh3aGVyZSBpdAorCQkJICogd2Fzbid0IHVuaW50ZXJlc3RpbmcpLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQKKwkJCSAqIHRvIG1hcmsgaXRzIHBhcmVudHMgcmVjdXJzaXZlbHkgdG9vLi4KKwkJCSAqLworCQkJaWYgKGNvbW1pdC0+cGFyZW50cykKKwkJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhjb21taXQpOworCQl9CisKKwkJLyoKKwkJICogQSBtaXNzaW5nIGNvbW1pdCBpcyBvayBpZmYgaXRzIHBhcmVudCBpcyBtYXJrZWQKKwkJICogdW5pbnRlcmVzdGluZy4KKwkJICoKKwkJICogV2UganVzdCBtYXJrIHN1Y2ggYSB0aGluZyBwYXJzZWQsIHNvIHRoYXQgd2hlbgorCQkgKiBpdCBpcyBwb3BwZWQgbmV4dCB0aW1lIGFyb3VuZCwgd2Ugd29uJ3QgYmUgdHJ5aW5nCisJCSAqIHRvIHBhcnNlIGl0IGFuZCBnZXQgYW4gZXJyb3IuCisJCSAqLworCQlpZiAoIWhhc19zaGExX2ZpbGUoY29tbWl0LT5vYmplY3Quc2hhMSkpCisJCQljb21taXQtPm9iamVjdC5wYXJzZWQgPSAxOworCQlwYXJlbnRzID0gcGFyZW50cy0+bmV4dDsKKwl9Cit9CisKK3ZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKQoreworCWFkZF9vYmplY3RfYXJyYXkob2JqLCBuYW1lLCAmcmV2cy0+cGVuZGluZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpnZXRfcmVmZXJlbmNlKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBvYmplY3QgKm9iamVjdDsKKworCW9iamVjdCA9IHBhcnNlX29iamVjdChzaGExKTsKKwlpZiAoIW9iamVjdCkKKwkJZGllKCJiYWQgb2JqZWN0ICVzIiwgbmFtZSk7CisJb2JqZWN0LT5mbGFncyB8PSBmbGFnczsKKwlyZXR1cm4gb2JqZWN0OworfQorCitzdGF0aWMgc3RydWN0IGNvbW1pdCAqaGFuZGxlX2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBvYmplY3QgKm9iamVjdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gb2JqZWN0LT5mbGFnczsKKworCS8qCisJICogVGFnIG9iamVjdD8gTG9vayB3aGF0IGl0IHBvaW50cyB0by4uCisJICovCisJd2hpbGUgKG9iamVjdC0+dHlwZSA9PSBPQkpfVEFHKSB7CisJCXN0cnVjdCB0YWcgKnRhZyA9IChzdHJ1Y3QgdGFnICopIG9iamVjdDsKKwkJaWYgKHJldnMtPnRhZ19vYmplY3RzICYmICEoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSkKKwkJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsIHRhZy0+dGFnKTsKKwkJb2JqZWN0ID0gcGFyc2Vfb2JqZWN0KHRhZy0+dGFnZ2VkLT5zaGExKTsKKwkJaWYgKCFvYmplY3QpCisJCQlkaWUoImJhZCBvYmplY3QgJXMiLCBzaGExX3RvX2hleCh0YWctPnRhZ2dlZC0+c2hhMSkpOworCX0KKworCS8qCisJICogQ29tbWl0IG9iamVjdD8gSnVzdCByZXR1cm4gaXQsIHdlJ2xsIGRvIGFsbCB0aGUgY29tcGxleAorCSAqIHJlYWNoYWJpbGl0eSBjcnVkLgorCSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gT0JKX0NPTU1JVCkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSAoc3RydWN0IGNvbW1pdCAqKW9iamVjdDsKKwkJaWYgKHBhcnNlX2NvbW1pdChjb21taXQpIDwgMCkKKwkJCWRpZSgidW5hYmxlIHRvIHBhcnNlIGNvbW1pdCAlcyIsIG5hbWUpOworCQlpZiAoZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSB7CisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQkJbWFya19wYXJlbnRzX3VuaW50ZXJlc3RpbmcoY29tbWl0KTsKKwkJCXJldnMtPmxpbWl0ZWQgPSAxOworCQl9CisJCXJldHVybiBjb21taXQ7CisJfQorCisJLyoKKwkgKiBUcmVlIG9iamVjdD8gRWl0aGVyIG1hcmsgaXQgdW5pbml0ZXJlc3RpbmcsIG9yIGFkZCBpdAorCSAqIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gbG9vayBhdCBsYXRlci4uCisJICovCisJaWYgKG9iamVjdC0+dHlwZSA9PSBPQkpfVFJFRSkgeworCQlzdHJ1Y3QgdHJlZSAqdHJlZSA9IChzdHJ1Y3QgdHJlZSAqKW9iamVjdDsKKwkJaWYgKCFyZXZzLT50cmVlX29iamVjdHMpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKGZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQkJbWFya190cmVlX3VuaW50ZXJlc3RpbmcodHJlZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCAiIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogQmxvYiBvYmplY3Q/IFlvdSBrbm93IHRoZSBkcmlsbCBieSBub3cuLgorCSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gT0JKX0JMT0IpIHsKKwkJc3RydWN0IGJsb2IgKmJsb2IgPSAoc3RydWN0IGJsb2IgKilvYmplY3Q7CisJCWlmICghcmV2cy0+YmxvYl9vYmplY3RzKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChmbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfYmxvYl91bmludGVyZXN0aW5nKGJsb2IpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgIiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZGllKCIlcyBpcyB1bmtub3duIG9iamVjdCIsIG5hbWUpOworfQorCitzdGF0aWMgaW50IGV2ZXJ5Ym9keV91bmludGVyZXN0aW5nKHN0cnVjdCBjb21taXRfbGlzdCAqb3JpZykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QgPSBvcmlnOworCXdoaWxlIChsaXN0KSB7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCWxpc3QgPSBsaXN0LT5uZXh0OworCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB0cmVlX2RpZmZlcmVuY2UgPSBSRVZfVFJFRV9TQU1FOworCitzdGF0aWMgdm9pZCBmaWxlX2FkZF9yZW1vdmUoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0aW9ucywKKwkJICAgIGludCBhZGRyZW1vdmUsIHVuc2lnbmVkIG1vZGUsCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgZGlmZiA9IFJFVl9UUkVFX0RJRkZFUkVOVDsKKworCS8qCisJICogSXMgaXQgYW4gYWRkIG9mIGEgbmV3IGZpbGU/IEl0IG1lYW5zIHRoYXQgdGhlIG9sZCB0cmVlCisJICogZGlkbid0IGhhdmUgaXQgYXQgYWxsLCBzbyB3ZSB3aWxsIHR1cm4gIlJFVl9UUkVFX1NBTUUiIC0+CisJICogIlJFVl9UUkVFX05FVyIsIGJ1dCBsZWF2ZSBhbnkgIlJFVl9UUkVFX0RJRkZFUkVOVCIgYWxvbmUKKwkgKiAoYW5kIGlmIGl0IGFscmVhZHkgd2FzICJSRVZfVFJFRV9ORVciLCB3ZSdsbCBrZWVwIGl0CisJICogIlJFVl9UUkVFX05FVyIgb2YgY291cnNlKS4KKwkgKi8KKwlpZiAoYWRkcmVtb3ZlID09ICcrJykgeworCQlkaWZmID0gdHJlZV9kaWZmZXJlbmNlOworCQlpZiAoZGlmZiAhPSBSRVZfVFJFRV9TQU1FKQorCQkJcmV0dXJuOworCQlkaWZmID0gUkVWX1RSRUVfTkVXOworCX0KKwl0cmVlX2RpZmZlcmVuY2UgPSBkaWZmOworfQorCitzdGF0aWMgdm9pZCBmaWxlX2NoYW5nZShzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHRpb25zLAorCQkgdW5zaWduZWQgb2xkX21vZGUsIHVuc2lnbmVkIG5ld19tb2RlLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqb2xkX3NoYTEsCisJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXdfc2hhMSwKKwkJIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJdHJlZV9kaWZmZXJlbmNlID0gUkVWX1RSRUVfRElGRkVSRU5UOworfQorCitpbnQgcmV2X2NvbXBhcmVfdHJlZShzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCB0cmVlICp0MSwgc3RydWN0IHRyZWUgKnQyKQoreworCWlmICghdDEpCisJCXJldHVybiBSRVZfVFJFRV9ORVc7CisJaWYgKCF0MikKKwkJcmV0dXJuIFJFVl9UUkVFX0RJRkZFUkVOVDsKKwl0cmVlX2RpZmZlcmVuY2UgPSBSRVZfVFJFRV9TQU1FOworCWlmIChkaWZmX3RyZWVfc2hhMSh0MS0+b2JqZWN0LnNoYTEsIHQyLT5vYmplY3Quc2hhMSwgIiIsCisJCQkgICAmcmV2cy0+cHJ1bmluZykgPCAwKQorCQlyZXR1cm4gUkVWX1RSRUVfRElGRkVSRU5UOworCXJldHVybiB0cmVlX2RpZmZlcmVuY2U7Cit9CisKK2ludCByZXZfc2FtZV90cmVlX2FzX2VtcHR5KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IHRyZWUgKnQxKQoreworCWludCByZXR2YWw7CisJdm9pZCAqdHJlZTsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGVtcHR5LCByZWFsOworCisJaWYgKCF0MSkKKwkJcmV0dXJuIDA7CisKKwl0cmVlID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UodDEtPm9iamVjdC5zaGExLCB0cmVlX3R5cGUsICZyZWFsLnNpemUsIE5VTEwpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIDA7CisJcmVhbC5idWYgPSB0cmVlOworCisJZW1wdHkuYnVmID0gIiI7CisJZW1wdHkuc2l6ZSA9IDA7CisKKwl0cmVlX2RpZmZlcmVuY2UgPSAwOworCXJldHZhbCA9IGRpZmZfdHJlZSgmZW1wdHksICZyZWFsLCAiIiwgJnJldnMtPnBydW5pbmcpOworCWZyZWUodHJlZSk7CisKKwlyZXR1cm4gcmV0dmFsID49IDAgJiYgIXRyZWVfZGlmZmVyZW5jZTsKK30KKworc3RhdGljIHZvaWQgdHJ5X3RvX3NpbXBsaWZ5X2NvbW1pdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKipwcCwgKnBhcmVudDsKKwlpbnQgdHJlZV9jaGFuZ2VkID0gMCwgdHJlZV9zYW1lID0gMDsKKworCWlmICghY29tbWl0LT50cmVlKQorCQlyZXR1cm47CisKKwlpZiAoIWNvbW1pdC0+cGFyZW50cykgeworCQlpZiAoIXJldl9zYW1lX3RyZWVfYXNfZW1wdHkocmV2cywgY29tbWl0LT50cmVlKSkKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFRSRUVDSEFOR0U7CisJCXJldHVybjsKKwl9CisKKwlwcCA9ICZjb21taXQtPnBhcmVudHM7CisJd2hpbGUgKChwYXJlbnQgPSAqcHApICE9IE5VTEwpIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKworCQlwYXJzZV9jb21taXQocCk7CisJCXN3aXRjaCAocmV2X2NvbXBhcmVfdHJlZShyZXZzLCBwLT50cmVlLCBjb21taXQtPnRyZWUpKSB7CisJCWNhc2UgUkVWX1RSRUVfU0FNRToKKwkJCXRyZWVfc2FtZSA9IDE7CisJCQlpZiAoIXJldnMtPnNpbXBsaWZ5X2hpc3RvcnkgfHwgKHAtPm9iamVjdC5mbGFncyAmIFVOSU5URVJFU1RJTkcpKSB7CisJCQkJLyogRXZlbiBpZiBhIG1lcmdlIHdpdGggYW4gdW5pbnRlcmVzdGluZworCQkJCSAqIHNpZGUgYnJhbmNoIGJyb3VnaHQgdGhlIGVudGlyZSBjaGFuZ2UKKwkJCQkgKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiwgd2UgZG8gbm90IHdhbnQKKwkJCQkgKiB0byBsb3NlIHRoZSBvdGhlciBicmFuY2hlcyBvZiB0aGlzCisJCQkJICogbWVyZ2UsIHNvIHdlIGp1c3Qga2VlcCBnb2luZy4KKwkJCQkgKi8KKwkJCQlwcCA9ICZwYXJlbnQtPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwYXJlbnQtPm5leHQgPSBOVUxMOworCQkJY29tbWl0LT5wYXJlbnRzID0gcGFyZW50OworCQkJcmV0dXJuOworCisJCWNhc2UgUkVWX1RSRUVfTkVXOgorCQkJaWYgKHJldnMtPnJlbW92ZV9lbXB0eV90cmVlcyAmJgorCQkJICAgIHJldl9zYW1lX3RyZWVfYXNfZW1wdHkocmV2cywgcC0+dHJlZSkpIHsKKwkJCQkvKiBXZSBhcmUgYWRkaW5nIGFsbCB0aGUgc3BlY2lmaWVkCisJCQkJICogcGF0aHMgZnJvbSB0aGlzIHBhcmVudCwgc28gdGhlCisJCQkJICogaGlzdG9yeSBiZXlvbmQgdGhpcyBwYXJlbnQgaXMgbm90CisJCQkJICogaW50ZXJlc3RpbmcuICBSZW1vdmUgaXRzIHBhcmVudHMKKwkJCQkgKiAodGhleSBhcmUgZ3JhbmRwYXJlbnRzIGZvciB1cykuCisJCQkJICogSU9XLCB3ZSBwcmV0ZW5kIHRoaXMgcGFyZW50IGlzIGEKKwkJCQkgKiAicm9vdCIgY29tbWl0LgorCQkJCSAqLworCQkJCXBhcnNlX2NvbW1pdChwKTsKKwkJCQlwLT5wYXJlbnRzID0gTlVMTDsKKwkJCX0KKwkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSBSRVZfVFJFRV9ESUZGRVJFTlQ6CisJCQl0cmVlX2NoYW5nZWQgPSAxOworCQkJcHAgPSAmcGFyZW50LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKwkJZGllKCJiYWQgdHJlZSBjb21wYXJlIGZvciBjb21taXQgJXMiLCBzaGExX3RvX2hleChjb21taXQtPm9iamVjdC5zaGExKSk7CisJfQorCWlmICh0cmVlX2NoYW5nZWQgJiYgIXRyZWVfc2FtZSkKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVFJFRUNIQU5HRTsKK30KKworc3RhdGljIHZvaWQgYWRkX3BhcmVudHNfdG9fbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHN0cnVjdCBjb21taXQgKmNvbW1pdCwgc3RydWN0IGNvbW1pdF9saXN0ICoqbGlzdCkKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudCA9IGNvbW1pdC0+cGFyZW50czsKKworCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEFEREVEKQorCQlyZXR1cm47CisJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gQURERUQ7CisKKwkvKgorCSAqIElmIHRoZSBjb21taXQgaXMgdW5pbnRlcmVzdGluZywgZG9uJ3QgdHJ5IHRvCisJICogcHJ1bmUgcGFyZW50cyAtIHdlIHdhbnQgdGhlIG1heGltYWwgdW5pbnRlcmVzdGluZworCSAqIHNldC4KKwkgKgorCSAqIE5vcm1hbGx5IHdlIGhhdmVuJ3QgcGFyc2VkIHRoZSBwYXJlbnQKKwkgKiB5ZXQsIHNvIHdlIHdvbid0IGhhdmUgYSBwYXJlbnQgb2YgYSBwYXJlbnQKKwkgKiBoZXJlLiBIb3dldmVyLCBpdCBtYXkgdHVybiBvdXQgdGhhdCB3ZSd2ZQorCSAqIHJlYWNoZWQgdGhpcyBjb21taXQgc29tZSBvdGhlciB3YXkgKHdoZXJlIGl0CisJICogd2Fzbid0IHVuaW50ZXJlc3RpbmcpLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQKKwkgKiB0byBtYXJrIGl0cyBwYXJlbnRzIHJlY3Vyc2l2ZWx5IHRvby4uCisJICovCisJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykgeworCQl3aGlsZSAocGFyZW50KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpwID0gcGFyZW50LT5pdGVtOworCQkJcGFyZW50ID0gcGFyZW50LT5uZXh0OworCQkJcGFyc2VfY29tbWl0KHApOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCQlpZiAocC0+cGFyZW50cykKKwkJCQltYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhwKTsKKwkJCWlmIChwLT5vYmplY3QuZmxhZ3MgJiBTRUVOKQorCQkJCWNvbnRpbnVlOworCQkJcC0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJCQlpbnNlcnRfYnlfZGF0ZShwLCBsaXN0KTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBPaywgdGhlIGNvbW1pdCB3YXNuJ3QgdW5pbnRlcmVzdGluZy4gVHJ5IHRvCisJICogc2ltcGxpZnkgdGhlIGNvbW1pdCBoaXN0b3J5IGFuZCBmaW5kIHRoZSBwYXJlbnQKKwkgKiB0aGF0IGhhcyBubyBkaWZmZXJlbmNlcyBpbiB0aGUgcGF0aCBzZXQgaWYgb25lIGV4aXN0cy4KKwkgKi8KKwlpZiAocmV2cy0+cHJ1bmVfZm4pCisJCXJldnMtPnBydW5lX2ZuKHJldnMsIGNvbW1pdCk7CisKKwlpZiAocmV2cy0+bm9fd2FsaykKKwkJcmV0dXJuOworCisJcGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCXdoaWxlIChwYXJlbnQpIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9IHBhcmVudC0+aXRlbTsKKworCQlwYXJlbnQgPSBwYXJlbnQtPm5leHQ7CisKKwkJcGFyc2VfY29tbWl0KHApOworCQlpZiAocC0+b2JqZWN0LmZsYWdzICYgU0VFTikKKwkJCWNvbnRpbnVlOworCQlwLT5vYmplY3QuZmxhZ3MgfD0gU0VFTjsKKwkJaW5zZXJ0X2J5X2RhdGUocCwgbGlzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBsaW1pdF9saXN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QgPSByZXZzLT5jb21taXRzOworCXN0cnVjdCBjb21taXRfbGlzdCAqbmV3bGlzdCA9IE5VTEw7CisJc3RydWN0IGNvbW1pdF9saXN0ICoqcCA9ICZuZXdsaXN0OworCisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICplbnRyeSA9IGxpc3Q7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCXN0cnVjdCBvYmplY3QgKm9iaiA9ICZjb21taXQtPm9iamVjdDsKKworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJZnJlZShlbnRyeSk7CisKKwkJaWYgKHJldnMtPm1heF9hZ2UgIT0gLTEgJiYgKGNvbW1pdC0+ZGF0ZSA8IHJldnMtPm1heF9hZ2UpKQorCQkJb2JqLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQlpZiAocmV2cy0+dW5wYWNrZWQgJiYgaGFzX3NoYTFfcGFjayhvYmotPnNoYTEpKQorCQkJb2JqLT5mbGFncyB8PSBVTklOVEVSRVNUSU5HOworCQlhZGRfcGFyZW50c190b19saXN0KHJldnMsIGNvbW1pdCwgJmxpc3QpOworCQlpZiAob2JqLT5mbGFncyAmIFVOSU5URVJFU1RJTkcpIHsKKwkJCW1hcmtfcGFyZW50c191bmludGVyZXN0aW5nKGNvbW1pdCk7CisJCQlpZiAoZXZlcnlib2R5X3VuaW50ZXJlc3RpbmcobGlzdCkpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmV2cy0+bWluX2FnZSAhPSAtMSAmJiAoY29tbWl0LT5kYXRlID4gcmV2cy0+bWluX2FnZSkpCisJCQljb250aW51ZTsKKwkJcCA9ICZjb21taXRfbGlzdF9pbnNlcnQoY29tbWl0LCBwKS0+bmV4dDsKKwl9CisJaWYgKHJldnMtPmJvdW5kYXJ5KSB7CisJCS8qIG1hcmsgdGhlIG9uZXMgdGhhdCBhcmUgb24gdGhlIHJlc3VsdCBsaXN0IGZpcnN0ICovCisJCWZvciAobGlzdCA9IG5ld2xpc3Q7IGxpc3Q7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsaXN0LT5pdGVtOworCQkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gVE1QX01BUks7CisJCX0KKwkJZm9yIChsaXN0ID0gbmV3bGlzdDsgbGlzdDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGxpc3QtPml0ZW07CisJCQlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSAmY29tbWl0LT5vYmplY3Q7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudDsKKwkJCWlmIChvYmotPmZsYWdzICYgVU5JTlRFUkVTVElORykKKwkJCQljb250aW51ZTsKKwkJCWZvciAocGFyZW50ID0gY29tbWl0LT5wYXJlbnRzOworCQkJICAgICBwYXJlbnQ7CisJCQkgICAgIHBhcmVudCA9IHBhcmVudC0+bmV4dCkgeworCQkJCXN0cnVjdCBjb21taXQgKnBjb21taXQgPSBwYXJlbnQtPml0ZW07CisJCQkJaWYgKCEocGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVU5JTlRFUkVTVElORykpCisJCQkJCWNvbnRpbnVlOworCQkJCXBjb21taXQtPm9iamVjdC5mbGFncyB8PSBCT1VOREFSWTsKKwkJCQlpZiAocGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVE1QX01BUkspCisJCQkJCWNvbnRpbnVlOworCQkJCXBjb21taXQtPm9iamVjdC5mbGFncyB8PSBUTVBfTUFSSzsKKwkJCQlwID0gJmNvbW1pdF9saXN0X2luc2VydChwY29tbWl0LCBwKS0+bmV4dDsKKwkJCX0KKwkJfQorCQlmb3IgKGxpc3QgPSBuZXdsaXN0OyBsaXN0OyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gbGlzdC0+aXRlbTsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzICY9IH5UTVBfTUFSSzsKKwkJfQorCX0KKwlyZXZzLT5jb21taXRzID0gbmV3bGlzdDsKK30KKworc3RhdGljIGludCBhbGxfZmxhZ3M7CitzdGF0aWMgc3RydWN0IHJldl9pbmZvICphbGxfcmV2czsKKworc3RhdGljIGludCBoYW5kbGVfb25lX3JlZihjb25zdCBjaGFyICpwYXRoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBvYmplY3QgKm9iamVjdCA9IGdldF9yZWZlcmVuY2UoYWxsX3JldnMsIHBhdGgsIHNoYTEsIGFsbF9mbGFncyk7CisJYWRkX3BlbmRpbmdfb2JqZWN0KGFsbF9yZXZzLCBvYmplY3QsICIiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2FsbChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIHVuc2lnbmVkIGZsYWdzKQoreworCWFsbF9yZXZzID0gcmV2czsKKwlhbGxfZmxhZ3MgPSBmbGFnczsKKwlmb3JfZWFjaF9yZWYoaGFuZGxlX29uZV9yZWYpOworfQorCitzdGF0aWMgaW50IGFkZF9wYXJlbnRzX29ubHkoc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICphcmcsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXN0cnVjdCBvYmplY3QgKml0OworCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisKKwlpZiAoKmFyZyA9PSAnXicpIHsKKwkJZmxhZ3MgXj0gVU5JTlRFUkVTVElORzsKKwkJYXJnKys7CisJfQorCWlmIChnZXRfc2hhMShhcmcsIHNoYTEpKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoMSkgeworCQlpdCA9IGdldF9yZWZlcmVuY2UocmV2cywgYXJnLCBzaGExLCAwKTsKKwkJaWYgKGl0LT50eXBlICE9IE9CSl9UQUcpCisJCQlicmVhazsKKwkJbWVtY3B5KHNoYTEsICgoc3RydWN0IHRhZyopaXQpLT50YWdnZWQtPnNoYTEsIDIwKTsKKwl9CisJaWYgKGl0LT50eXBlICE9IE9CSl9DT01NSVQpCisJCXJldHVybiAwOworCWNvbW1pdCA9IChzdHJ1Y3QgY29tbWl0ICopaXQ7CisJZm9yIChwYXJlbnRzID0gY29tbWl0LT5wYXJlbnRzOyBwYXJlbnRzOyBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkgeworCQlpdCA9ICZwYXJlbnRzLT5pdGVtLT5vYmplY3Q7CisJCWl0LT5mbGFncyB8PSBmbGFnczsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIGl0LCBhcmcpOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBpbml0X3JldmlzaW9ucyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwltZW1zZXQocmV2cywgMCwgc2l6ZW9mKCpyZXZzKSk7CisKKwlyZXZzLT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwlyZXZzLT5pZ25vcmVfbWVyZ2VzID0gMTsKKwlyZXZzLT5zaW1wbGlmeV9oaXN0b3J5ID0gMTsKKwlyZXZzLT5wcnVuaW5nLnJlY3Vyc2l2ZSA9IDE7CisJcmV2cy0+cHJ1bmluZy5hZGRfcmVtb3ZlID0gZmlsZV9hZGRfcmVtb3ZlOworCXJldnMtPnBydW5pbmcuY2hhbmdlID0gZmlsZV9jaGFuZ2U7CisJcmV2cy0+bGlmbyA9IDE7CisJcmV2cy0+ZGVuc2UgPSAxOworCXJldnMtPnByZWZpeCA9IHByZWZpeDsKKwlyZXZzLT5tYXhfYWdlID0gLTE7CisJcmV2cy0+bWluX2FnZSA9IC0xOworCXJldnMtPm1heF9jb3VudCA9IC0xOworCisJcmV2cy0+cHJ1bmVfZm4gPSBOVUxMOworCXJldnMtPnBydW5lX2RhdGEgPSBOVUxMOworCisJcmV2cy0+dG9wb19zZXR0ZXIgPSB0b3BvX3NvcnRfZGVmYXVsdF9zZXR0ZXI7CisJcmV2cy0+dG9wb19nZXR0ZXIgPSB0b3BvX3NvcnRfZGVmYXVsdF9nZXR0ZXI7CisKKwlyZXZzLT5jb21taXRfZm9ybWF0ID0gQ01JVF9GTVRfREVGQVVMVDsKKworCWRpZmZfc2V0dXAoJnJldnMtPmRpZmZvcHQpOworfQorCitzdGF0aWMgdm9pZCBhZGRfcGVuZGluZ19jb21taXRfbGlzdChzdHJ1Y3QgcmV2X2luZm8gKnJldnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXdoaWxlIChjb21taXRfbGlzdCkgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3QgPSAmY29tbWl0X2xpc3QtPml0ZW0tPm9iamVjdDsKKwkJb2JqZWN0LT5mbGFncyB8PSBmbGFnczsKKwkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsIG9iamVjdCwgc2hhMV90b19oZXgob2JqZWN0LT5zaGExKSk7CisJCWNvbW1pdF9saXN0ID0gY29tbWl0X2xpc3QtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmVwYXJlX3Nob3dfbWVyZ2Uoc3RydWN0IHJldl9pbmZvICpyZXZzKQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqYmFzZXM7CisJc3RydWN0IGNvbW1pdCAqaGVhZCwgKm90aGVyOworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqKnBydW5lID0gTlVMTDsKKwlpbnQgaSwgcHJ1bmVfbnVtID0gMTsgLyogY291bnRpbmcgdGVybWluYXRpbmcgTlVMTCAqLworCisJaWYgKGdldF9zaGExKCJIRUFEIiwgc2hhMSkgfHwgIShoZWFkID0gbG9va3VwX2NvbW1pdChzaGExKSkpCisJCWRpZSgiLS1tZXJnZSB3aXRob3V0IEhFQUQ/Iik7CisJaWYgKGdldF9zaGExKCJNRVJHRV9IRUFEIiwgc2hhMSkgfHwgIShvdGhlciA9IGxvb2t1cF9jb21taXQoc2hhMSkpKQorCQlkaWUoIi0tbWVyZ2Ugd2l0aG91dCBNRVJHRV9IRUFEPyIpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmaGVhZC0+b2JqZWN0LCAiSEVBRCIpOworCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmb3RoZXItPm9iamVjdCwgIk1FUkdFX0hFQUQiKTsKKwliYXNlcyA9IGdldF9tZXJnZV9iYXNlcyhoZWFkLCBvdGhlciwgMSk7CisJd2hpbGUgKGJhc2VzKSB7CisJCXN0cnVjdCBjb21taXQgKml0ID0gYmFzZXMtPml0ZW07CisJCXN0cnVjdCBjb21taXRfbGlzdCAqbiA9IGJhc2VzLT5uZXh0OworCQlmcmVlKGJhc2VzKTsKKwkJYmFzZXMgPSBuOworCQlpdC0+b2JqZWN0LmZsYWdzIHw9IFVOSU5URVJFU1RJTkc7CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCAmaXQtPm9iamVjdCwgIihtZXJnZS1iYXNlKSIpOworCX0KKworCWlmICghYWN0aXZlX25yKQorCQlyZWFkX2NhY2hlKCk7CisJZm9yIChpID0gMDsgaSA8IGFjdGl2ZV9ucjsgaSsrKSB7CisJCXN0cnVjdCBjYWNoZV9lbnRyeSAqY2UgPSBhY3RpdmVfY2FjaGVbaV07CisJCWlmICghY2Vfc3RhZ2UoY2UpKQorCQkJY29udGludWU7CisJCWlmIChjZV9wYXRoX21hdGNoKGNlLCByZXZzLT5wcnVuZV9kYXRhKSkgeworCQkJcHJ1bmVfbnVtKys7CisJCQlwcnVuZSA9IHhyZWFsbG9jKHBydW5lLCBzaXplb2YoKnBydW5lKSAqIHBydW5lX251bSk7CisJCQlwcnVuZVtwcnVuZV9udW0tMl0gPSBjZS0+bmFtZTsKKwkJCXBydW5lW3BydW5lX251bS0xXSA9IE5VTEw7CisJCX0KKwkJd2hpbGUgKChpKzEgPCBhY3RpdmVfbnIpICYmCisJCSAgICAgICBjZV9zYW1lX25hbWUoY2UsIGFjdGl2ZV9jYWNoZVtpKzFdKSkKKwkJCWkrKzsKKwl9CisJcmV2cy0+cHJ1bmVfZGF0YSA9IHBydW5lOworfQorCisvKgorICogUGFyc2UgcmV2aXNpb24gaW5mb3JtYXRpb24sIGZpbGxpbmcgaW4gdGhlICJyZXZfaW5mbyIgc3RydWN0dXJlLAorICogYW5kIHJlbW92aW5nIHRoZSB1c2VkIGFyZ3VtZW50cyBmcm9tIHRoZSBhcmd1bWVudCBsaXN0LgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgbGVmdCB0aGF0IHdlcmVuJ3QgcmVjb2duaXplZAorICogKHdoaWNoIGFyZSBhbHNvIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBhcmd1bWVudCBsaXN0KQorICovCitpbnQgc2V0dXBfcmV2aXNpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgc3RydWN0IHJldl9pbmZvICpyZXZzLCBjb25zdCBjaGFyICpkZWYpCit7CisJaW50IGksIGZsYWdzLCBzZWVuX2Rhc2hkYXNoLCBzaG93X21lcmdlOworCWNvbnN0IGNoYXIgKip1bnJlY29nbml6ZWQgPSBhcmd2ICsgMTsKKwlpbnQgbGVmdCA9IDE7CisKKwkvKiBGaXJzdCwgc2VhcmNoIGZvciAiLS0iICovCisJc2Vlbl9kYXNoZGFzaCA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOworCQlpZiAoc3RyY21wKGFyZywgIi0tIikpCisJCQljb250aW51ZTsKKwkJYXJndltpXSA9IE5VTEw7CisJCWFyZ2MgPSBpOworCQlyZXZzLT5wcnVuZV9kYXRhID0gZ2V0X3BhdGhzcGVjKHJldnMtPnByZWZpeCwgYXJndiArIGkgKyAxKTsKKwkJc2Vlbl9kYXNoZGFzaCA9IDE7CisJCWJyZWFrOworCX0KKworCWZsYWdzID0gc2hvd19tZXJnZSA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisJCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJCWNoYXIgKmRvdGRvdDsKKwkJaW50IGxvY2FsX2ZsYWdzOworCisJCWlmICgqYXJnID09ICctJykgeworCQkJaW50IG9wdHM7CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1tYXgtY291bnQ9IiwgMTIpKSB7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmcgKyAxMik7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBhY2NlcHQgLTxkaWdpdD4sIGxpa2UgdHJhZGl0aW9uYWwgImhlYWQiICovCisJCQlpZiAoKCphcmcgPT0gJy0nKSAmJiBpc2RpZ2l0KGFyZ1sxXSkpIHsKKwkJCQlyZXZzLT5tYXhfY291bnQgPSBhdG9pKGFyZyArIDEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLW4iKSkgeworCQkJCWlmIChhcmdjIDw9IGkgKyAxKQorCQkJCQlkaWUoIi1uIHJlcXVpcmVzIGFuIGFyZ3VtZW50Iik7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmd2WysraV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywiLW4iLDIpKSB7CisJCQkJcmV2cy0+bWF4X2NvdW50ID0gYXRvaShhcmcgKyAyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLW1heC1hZ2U9IiwgMTApKSB7CisJCQkJcmV2cy0+bWF4X2FnZSA9IGF0b2koYXJnICsgMTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tc2luY2U9IiwgOCkpIHsKKwkJCQlyZXZzLT5tYXhfYWdlID0gYXBwcm94aWRhdGUoYXJnICsgOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1hZnRlcj0iLCA4KSkgeworCQkJCXJldnMtPm1heF9hZ2UgPSBhcHByb3hpZGF0ZShhcmcgKyA4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLW1pbi1hZ2U9IiwgMTApKSB7CisJCQkJcmV2cy0+bWluX2FnZSA9IGF0b2koYXJnICsgMTApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tYmVmb3JlPSIsIDkpKSB7CisJCQkJcmV2cy0+bWluX2FnZSA9IGFwcHJveGlkYXRlKGFyZyArIDkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJuY21wKGFyZywgIi0tdW50aWw9IiwgOCkpIHsKKwkJCQlyZXZzLT5taW5fYWdlID0gYXBwcm94aWRhdGUoYXJnICsgOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJaGFuZGxlX2FsbChyZXZzLCBmbGFncyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vdCIpKSB7CisJCQkJZmxhZ3MgXj0gVU5JTlRFUkVTVElORzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZGVmYXVsdCIpKSB7CisJCQkJaWYgKCsraSA+PSBhcmdjKQorCQkJCQlkaWUoImJhZCAtLWRlZmF1bHQgYXJndW1lbnQiKTsKKwkJCQlkZWYgPSBhcmd2W2ldOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1tZXJnZSIpKSB7CisJCQkJc2hvd19tZXJnZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXRvcG8tb3JkZXIiKSkgeworCQkJCXJldnMtPnRvcG9fb3JkZXIgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1kYXRlLW9yZGVyIikpIHsKKwkJCQlyZXZzLT5saWZvID0gMDsKKwkJCQlyZXZzLT50b3BvX29yZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tcGFyZW50cyIpKSB7CisJCQkJcmV2cy0+cGFyZW50cyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWRlbnNlIikpIHsKKwkJCQlyZXZzLT5kZW5zZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXNwYXJzZSIpKSB7CisJCQkJcmV2cy0+ZGVuc2UgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1yZW1vdmUtZW1wdHkiKSkgeworCQkJCXJldnMtPnJlbW92ZV9lbXB0eV90cmVlcyA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLW1lcmdlcyIpKSB7CisJCQkJcmV2cy0+bm9fbWVyZ2VzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYm91bmRhcnkiKSkgeworCQkJCXJldnMtPmJvdW5kYXJ5ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tb2JqZWN0cyIpKSB7CisJCQkJcmV2cy0+dGFnX29iamVjdHMgPSAxOworCQkJCXJldnMtPnRyZWVfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+YmxvYl9vYmplY3RzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tb2JqZWN0cy1lZGdlIikpIHsKKwkJCQlyZXZzLT50YWdfb2JqZWN0cyA9IDE7CisJCQkJcmV2cy0+dHJlZV9vYmplY3RzID0gMTsKKwkJCQlyZXZzLT5ibG9iX29iamVjdHMgPSAxOworCQkJCXJldnMtPmVkZ2VfaGludCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXVucGFja2VkIikpIHsKKwkJCQlyZXZzLT51bnBhY2tlZCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItciIpKSB7CisJCQkJcmV2cy0+ZGlmZiA9IDE7CisJCQkJcmV2cy0+ZGlmZm9wdC5yZWN1cnNpdmUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXQiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCXJldnMtPmRpZmZvcHQucmVjdXJzaXZlID0gMTsKKwkJCQlyZXZzLT5kaWZmb3B0LnRyZWVfaW5fcmVjdXJzaXZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1tIikpIHsKKwkJCQlyZXZzLT5pZ25vcmVfbWVyZ2VzID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi1jIikpIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgPSAwOworCQkJCXJldnMtPmNvbWJpbmVfbWVyZ2VzID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tY2MiKSkgeworCQkJCXJldnMtPmRpZmYgPSAxOworCQkJCXJldnMtPmRlbnNlX2NvbWJpbmVkX21lcmdlcyA9IDE7CisJCQkJcmV2cy0+Y29tYmluZV9tZXJnZXMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgeworCQkJCXJldnMtPnZlcmJvc2VfaGVhZGVyID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLXByZXR0eSIsIDgpKSB7CisJCQkJcmV2cy0+dmVyYm9zZV9oZWFkZXIgPSAxOworCQkJCXJldnMtPmNvbW1pdF9mb3JtYXQgPSBnZXRfY29tbWl0X2Zvcm1hdChhcmcrOCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXJvb3QiKSkgeworCQkJCXJldnMtPnNob3dfcm9vdF9kaWZmID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tbm8tY29tbWl0LWlkIikpIHsKKwkJCQlyZXZzLT5ub19jb21taXRfaWQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hbHdheXMiKSkgeworCQkJCXJldnMtPmFsd2F5c19zaG93X2hlYWRlciA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLW5vLWFiYnJldiIpKSB7CisJCQkJcmV2cy0+YWJicmV2ID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tYWJicmV2IikpIHsKKwkJCQlyZXZzLT5hYmJyZXYgPSBERUZBVUxUX0FCQlJFVjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RybmNtcChhcmcsICItLWFiYnJldj0iLCA5KSkgeworCQkJCXJldnMtPmFiYnJldiA9IHN0cnRvdWwoYXJnICsgOSwgTlVMTCwgMTApOworCQkJCWlmIChyZXZzLT5hYmJyZXYgPCBNSU5JTVVNX0FCQlJFVikKKwkJCQkJcmV2cy0+YWJicmV2ID0gTUlOSU1VTV9BQkJSRVY7CisJCQkJZWxzZSBpZiAocmV2cy0+YWJicmV2ID4gNDApCisJCQkJCXJldnMtPmFiYnJldiA9IDQwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1hYmJyZXYtY29tbWl0IikpIHsKKwkJCQlyZXZzLT5hYmJyZXZfY29tbWl0ID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tZnVsbC1kaWZmIikpIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlyZXZzLT5mdWxsX2RpZmYgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mdWxsLWhpc3RvcnkiKSkgeworCQkJCXJldnMtPnNpbXBsaWZ5X2hpc3RvcnkgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJb3B0cyA9IGRpZmZfb3B0X3BhcnNlKCZyZXZzLT5kaWZmb3B0LCBhcmd2K2ksIGFyZ2MtaSk7CisJCQlpZiAob3B0cyA+IDApIHsKKwkJCQlyZXZzLT5kaWZmID0gMTsKKwkJCQlpICs9IG9wdHMgLSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKnVucmVjb2duaXplZCsrID0gYXJnOworCQkJbGVmdCsrOworCQkJY29udGludWU7CisJCX0KKwkJZG90ZG90ID0gc3Ryc3RyKGFyZywgIi4uIik7CisJCWlmIChkb3Rkb3QpIHsKKwkJCXVuc2lnbmVkIGNoYXIgZnJvbV9zaGExWzIwXTsKKwkJCWNvbnN0IGNoYXIgKm5leHQgPSBkb3Rkb3QgKyAyOworCQkJY29uc3QgY2hhciAqdGhpcyA9IGFyZzsKKwkJCWludCBzeW1tZXRyaWMgPSAqbmV4dCA9PSAnLic7CisJCQl1bnNpZ25lZCBpbnQgZmxhZ3NfZXhjbHVkZSA9IGZsYWdzIF4gVU5JTlRFUkVTVElORzsKKworCQkJKmRvdGRvdCA9IDA7CisJCQluZXh0ICs9IHN5bW1ldHJpYzsKKworCQkJaWYgKCEqbmV4dCkKKwkJCQluZXh0ID0gIkhFQUQiOworCQkJaWYgKGRvdGRvdCA9PSBhcmcpCisJCQkJdGhpcyA9ICJIRUFEIjsKKwkJCWlmICghZ2V0X3NoYTEodGhpcywgZnJvbV9zaGExKSAmJgorCQkJICAgICFnZXRfc2hhMShuZXh0LCBzaGExKSkgeworCQkJCXN0cnVjdCBjb21taXQgKmEsICpiOworCQkJCXN0cnVjdCBjb21taXRfbGlzdCAqZXhjbHVkZTsKKworCQkJCWEgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShmcm9tX3NoYTEpOworCQkJCWIgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKwkJCQlpZiAoIWEgfHwgIWIpIHsKKwkJCQkJZGllKHN5bW1ldHJpYyA/CisJCQkJCSAgICAiSW52YWxpZCBzeW1tZXRyaWMgZGlmZmVyZW5jZSBleHByZXNzaW9uICVzLi4uJXMiIDoKKwkJCQkJICAgICJJbnZhbGlkIHJldmlzaW9uIHJhbmdlICVzLi4lcyIsCisJCQkJCSAgICBhcmcsIG5leHQpOworCQkJCX0KKworCQkJCWlmICghc2Vlbl9kYXNoZGFzaCkgeworCQkJCQkqZG90ZG90ID0gJy4nOworCQkJCQl2ZXJpZnlfbm9uX2ZpbGVuYW1lKHJldnMtPnByZWZpeCwgYXJnKTsKKwkJCQl9CisKKwkJCQlpZiAoc3ltbWV0cmljKSB7CisJCQkJCWV4Y2x1ZGUgPSBnZXRfbWVyZ2VfYmFzZXMoYSwgYiwgMSk7CisJCQkJCWFkZF9wZW5kaW5nX2NvbW1pdF9saXN0KHJldnMsIGV4Y2x1ZGUsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzX2V4Y2x1ZGUpOworCQkJCQlmcmVlX2NvbW1pdF9saXN0KGV4Y2x1ZGUpOworCQkJCQlhLT5vYmplY3QuZmxhZ3MgfD0gZmxhZ3M7CisJCQkJfSBlbHNlCisJCQkJCWEtPm9iamVjdC5mbGFncyB8PSBmbGFnc19leGNsdWRlOworCQkJCWItPm9iamVjdC5mbGFncyB8PSBmbGFnczsKKwkJCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgJmEtPm9iamVjdCwgdGhpcyk7CisJCQkJYWRkX3BlbmRpbmdfb2JqZWN0KHJldnMsICZiLT5vYmplY3QsIG5leHQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKmRvdGRvdCA9ICcuJzsKKwkJfQorCQlkb3Rkb3QgPSBzdHJzdHIoYXJnLCAiXkAiKTsKKwkJaWYgKGRvdGRvdCAmJiAhZG90ZG90WzJdKSB7CisJCQkqZG90ZG90ID0gMDsKKwkJCWlmIChhZGRfcGFyZW50c19vbmx5KHJldnMsIGFyZywgZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCQkJKmRvdGRvdCA9ICdeJzsKKwkJfQorCQlsb2NhbF9mbGFncyA9IDA7CisJCWlmICgqYXJnID09ICdeJykgeworCQkJbG9jYWxfZmxhZ3MgPSBVTklOVEVSRVNUSU5HOworCQkJYXJnKys7CisJCX0KKwkJaWYgKGdldF9zaGExKGFyZywgc2hhMSkpIHsKKwkJCWludCBqOworCisJCQlpZiAoc2Vlbl9kYXNoZGFzaCB8fCBsb2NhbF9mbGFncykKKwkJCQlkaWUoImJhZCByZXZpc2lvbiAnJXMnIiwgYXJnKTsKKworCQkJLyogSWYgd2UgZGlkbid0IGhhdmUgYSAiLS0iOgorCQkJICogKDEpIGFsbCBmaWxlbmFtZXMgbXVzdCBleGlzdDsKKwkJCSAqICgyKSBhbGwgcmV2LWFyZ3MgbXVzdCBub3QgYmUgaW50ZXJwcmV0YWJsZQorCQkJICogICAgIGFzIGEgdmFsaWQgZmlsZW5hbWUuCisJCQkgKiBidXQgdGhlIGxhdHRlciB3ZSBoYXZlIGNoZWNrZWQgaW4gdGhlIG1haW4gbG9vcC4KKwkJCSAqLworCQkJZm9yIChqID0gaTsgaiA8IGFyZ2M7IGorKykKKwkJCQl2ZXJpZnlfZmlsZW5hbWUocmV2cy0+cHJlZml4LCBhcmd2W2pdKTsKKworCQkJcmV2cy0+cHJ1bmVfZGF0YSA9IGdldF9wYXRoc3BlYyhyZXZzLT5wcmVmaXgsIGFyZ3YgKyBpKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghc2Vlbl9kYXNoZGFzaCkKKwkJCXZlcmlmeV9ub25fZmlsZW5hbWUocmV2cy0+cHJlZml4LCBhcmcpOworCQlvYmplY3QgPSBnZXRfcmVmZXJlbmNlKHJldnMsIGFyZywgc2hhMSwgZmxhZ3MgXiBsb2NhbF9mbGFncyk7CisJCWFkZF9wZW5kaW5nX29iamVjdChyZXZzLCBvYmplY3QsIGFyZyk7CisJfQorCWlmIChzaG93X21lcmdlKQorCQlwcmVwYXJlX3Nob3dfbWVyZ2UocmV2cyk7CisJaWYgKGRlZiAmJiAhcmV2cy0+cGVuZGluZy5ucikgeworCQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCQlzdHJ1Y3Qgb2JqZWN0ICpvYmplY3Q7CisJCWlmIChnZXRfc2hhMShkZWYsIHNoYTEpKQorCQkJZGllKCJiYWQgZGVmYXVsdCByZXZpc2lvbiAnJXMnIiwgZGVmKTsKKwkJb2JqZWN0ID0gZ2V0X3JlZmVyZW5jZShyZXZzLCBkZWYsIHNoYTEsIDApOworCQlhZGRfcGVuZGluZ19vYmplY3QocmV2cywgb2JqZWN0LCBkZWYpOworCX0KKworCWlmIChyZXZzLT50b3BvX29yZGVyIHx8IHJldnMtPnVucGFja2VkKQorCQlyZXZzLT5saW1pdGVkID0gMTsKKworCWlmIChyZXZzLT5wcnVuZV9kYXRhKSB7CisJCWRpZmZfdHJlZV9zZXR1cF9wYXRocyhyZXZzLT5wcnVuZV9kYXRhLCAmcmV2cy0+cHJ1bmluZyk7CisJCXJldnMtPnBydW5lX2ZuID0gdHJ5X3RvX3NpbXBsaWZ5X2NvbW1pdDsKKwkJaWYgKCFyZXZzLT5mdWxsX2RpZmYpCisJCQlkaWZmX3RyZWVfc2V0dXBfcGF0aHMocmV2cy0+cHJ1bmVfZGF0YSwgJnJldnMtPmRpZmZvcHQpOworCX0KKwlpZiAocmV2cy0+Y29tYmluZV9tZXJnZXMpIHsKKwkJcmV2cy0+aWdub3JlX21lcmdlcyA9IDA7CisJCWlmIChyZXZzLT5kZW5zZV9jb21iaW5lZF9tZXJnZXMgJiYgIXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCkKKwkJCXJldnMtPmRpZmZvcHQub3V0cHV0X2Zvcm1hdCA9IERJRkZfRk9STUFUX1BBVENIOworCX0KKwlyZXZzLT5kaWZmb3B0LmFiYnJldiA9IHJldnMtPmFiYnJldjsKKwlpZiAoZGlmZl9zZXR1cF9kb25lKCZyZXZzLT5kaWZmb3B0KSA8IDApCisJCWRpZSgiZGlmZl9zZXR1cF9kb25lIGZhaWxlZCIpOworCisJcmV0dXJuIGxlZnQ7Cit9CisKK3ZvaWQgcHJlcGFyZV9yZXZpc2lvbl93YWxrKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlpbnQgbnIgPSByZXZzLT5wZW5kaW5nLm5yOworCXN0cnVjdCBvYmplY3RfYXJyYXlfZW50cnkgKmxpc3QgPSByZXZzLT5wZW5kaW5nLm9iamVjdHM7CisKKwlyZXZzLT5wZW5kaW5nLm5yID0gMDsKKwlyZXZzLT5wZW5kaW5nLmFsbG9jID0gMDsKKwlyZXZzLT5wZW5kaW5nLm9iamVjdHMgPSBOVUxMOworCXdoaWxlICgtLW5yID49IDApIHsKKwkJc3RydWN0IGNvbW1pdCAqY29tbWl0ID0gaGFuZGxlX2NvbW1pdChyZXZzLCBsaXN0LT5pdGVtLCBsaXN0LT5uYW1lKTsKKwkJaWYgKGNvbW1pdCkgeworCQkJaWYgKCEoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBTRUVOKSkgeworCQkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFNFRU47CisJCQkJaW5zZXJ0X2J5X2RhdGUoY29tbWl0LCAmcmV2cy0+Y29tbWl0cyk7CisJCQl9CisJCX0KKwkJbGlzdCsrOworCX0KKworCWlmIChyZXZzLT5ub193YWxrKQorCQlyZXR1cm47CisJaWYgKHJldnMtPmxpbWl0ZWQpCisJCWxpbWl0X2xpc3QocmV2cyk7CisJaWYgKHJldnMtPnRvcG9fb3JkZXIpCisJCXNvcnRfaW5fdG9wb2xvZ2ljYWxfb3JkZXJfZm4oJnJldnMtPmNvbW1pdHMsIHJldnMtPmxpZm8sCisJCQkJCSAgICAgcmV2cy0+dG9wb19zZXR0ZXIsCisJCQkJCSAgICAgcmV2cy0+dG9wb19nZXR0ZXIpOworfQorCitzdGF0aWMgaW50IHJld3JpdGVfb25lKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqKnBwKQoreworCWZvciAoOzspIHsKKwkJc3RydWN0IGNvbW1pdCAqcCA9ICpwcDsKKwkJaWYgKCFyZXZzLT5saW1pdGVkKQorCQkJYWRkX3BhcmVudHNfdG9fbGlzdChyZXZzLCBwLCAmcmV2cy0+Y29tbWl0cyk7CisJCWlmIChwLT5wYXJlbnRzICYmIHAtPnBhcmVudHMtPm5leHQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHAtPm9iamVjdC5mbGFncyAmIChUUkVFQ0hBTkdFIHwgVU5JTlRFUkVTVElORykpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFwLT5wYXJlbnRzKQorCQkJcmV0dXJuIC0xOworCQkqcHAgPSBwLT5wYXJlbnRzLT5pdGVtOworCX0KK30KKworc3RhdGljIHZvaWQgcmV3cml0ZV9wYXJlbnRzKHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqKnBwID0gJmNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAoKnBwKSB7CisJCXN0cnVjdCBjb21taXRfbGlzdCAqcGFyZW50ID0gKnBwOworCQlpZiAocmV3cml0ZV9vbmUocmV2cywgJnBhcmVudC0+aXRlbSkgPCAwKSB7CisJCQkqcHAgPSBwYXJlbnQtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlwcCA9ICZwYXJlbnQtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBtYXJrX2JvdW5kYXJ5X3RvX3Nob3coc3RydWN0IGNvbW1pdCAqY29tbWl0KQoreworCXN0cnVjdCBjb21taXRfbGlzdCAqcCA9IGNvbW1pdC0+cGFyZW50czsKKwl3aGlsZSAocCkgeworCQljb21taXQgPSBwLT5pdGVtOworCQlwID0gcC0+bmV4dDsKKwkJaWYgKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgQk9VTkRBUlkpCisJCQljb21taXQtPm9iamVjdC5mbGFncyB8PSBCT1VOREFSWV9TSE9XOworCX0KK30KKworc3RydWN0IGNvbW1pdCAqZ2V0X3JldmlzaW9uKHN0cnVjdCByZXZfaW5mbyAqcmV2cykKK3sKKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmxpc3QgPSByZXZzLT5jb21taXRzOworCisJaWYgKCFsaXN0KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIENoZWNrIHRoZSBtYXhfY291bnQgLi4uICovCisJc3dpdGNoIChyZXZzLT5tYXhfY291bnQpIHsKKwljYXNlIC0xOgorCQlicmVhazsKKwljYXNlIDA6CisJCXJldHVybiBOVUxMOworCWRlZmF1bHQ6CisJCXJldnMtPm1heF9jb3VudC0tOworCX0KKworCWRvIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICplbnRyeSA9IHJldnMtPmNvbW1pdHM7CisJCXN0cnVjdCBjb21taXQgKmNvbW1pdCA9IGVudHJ5LT5pdGVtOworCisJCXJldnMtPmNvbW1pdHMgPSBlbnRyeS0+bmV4dDsKKwkJZnJlZShlbnRyeSk7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZW4ndCBkb25lIHRoZSBsaXN0IGxpbWl0aW5nLCB3ZSBuZWVkIHRvIGxvb2sgYXQKKwkJICogdGhlIHBhcmVudHMgaGVyZS4gV2UgYWxzbyBuZWVkIHRvIGRvIHRoZSBkYXRlLWJhc2VkIGxpbWl0aW5nCisJCSAqIHRoYXQgd2UnZCBvdGhlcndpc2UgaGF2ZSBkb25lIGluIGxpbWl0X2xpc3QoKS4KKwkJICovCisJCWlmICghcmV2cy0+bGltaXRlZCkgeworCQkJaWYgKChyZXZzLT51bnBhY2tlZCAmJgorCQkJICAgICBoYXNfc2hhMV9wYWNrKGNvbW1pdC0+b2JqZWN0LnNoYTEpKSB8fAorCQkJICAgIChyZXZzLT5tYXhfYWdlICE9IC0xICYmCisJCQkgICAgIChjb21taXQtPmRhdGUgPCByZXZzLT5tYXhfYWdlKSkpCisJCQkJY29udGludWU7CisJCQlhZGRfcGFyZW50c190b19saXN0KHJldnMsIGNvbW1pdCwgJnJldnMtPmNvbW1pdHMpOworCQl9CisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIFNIT1dOKQorCQkJY29udGludWU7CisKKwkJLyogV2Ugd2FudCB0byBzaG93IGJvdW5kYXJ5IGNvbW1pdHMgb25seSB3aGVuIHRoZWlyCisJCSAqIGNoaWxkcmVuIGFyZSBzaG93bi4gIFdoZW4gcGF0aC1saW1pdGVyIGlzIGluIGVmZmVjdCwKKwkJICogcmV3cml0ZV9wYXJlbnRzKCkgZHJvcHMgc29tZSBjb21taXRzIGZyb20gZ2V0dGluZyBzaG93biwKKwkJICogYW5kIHRoZXJlIGlzIG5vIHBvaW50IHNob3dpbmcgYm91bmRhcnkgcGFyZW50cyB0aGF0CisJCSAqIGFyZSBub3Qgc2hvd24uICBBZnRlciByZXdyaXRlX3BhcmVudHMoKSByZXdyaXRlcyB0aGUKKwkJICogcGFyZW50cyBvZiBhIGNvbW1pdCB0aGF0IGlzIHNob3duLCB3ZSBtYXJrIHRoZSBib3VuZGFyeQorCQkgKiBwYXJlbnRzIHdpdGggQk9VTkRBUllfU0hPVy4KKwkJICovCisJCWlmIChjb21taXQtPm9iamVjdC5mbGFncyAmIEJPVU5EQVJZX1NIT1cpIHsKKwkJCWNvbW1pdC0+b2JqZWN0LmZsYWdzIHw9IFNIT1dOOworCQkJcmV0dXJuIGNvbW1pdDsKKwkJfQorCQlpZiAoY29tbWl0LT5vYmplY3QuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKQorCQkJY29udGludWU7CisJCWlmIChyZXZzLT5taW5fYWdlICE9IC0xICYmIChjb21taXQtPmRhdGUgPiByZXZzLT5taW5fYWdlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmV2cy0+bm9fbWVyZ2VzICYmCisJCSAgICBjb21taXQtPnBhcmVudHMgJiYgY29tbWl0LT5wYXJlbnRzLT5uZXh0KQorCQkJY29udGludWU7CisJCWlmIChyZXZzLT5wcnVuZV9mbiAmJiByZXZzLT5kZW5zZSkgeworCQkJLyogQ29tbWl0IHdpdGhvdXQgY2hhbmdlcz8gKi8KKwkJCWlmICghKGNvbW1pdC0+b2JqZWN0LmZsYWdzICYgVFJFRUNIQU5HRSkpIHsKKwkJCQkvKiBkcm9wIG1lcmdlcyB1bmxlc3Mgd2Ugd2FudCBwYXJlbnRob29kICovCisJCQkJaWYgKCFyZXZzLT5wYXJlbnRzKQorCQkJCQljb250aW51ZTsKKwkJCQkvKiBub24tbWVyZ2UgLSBhbHdheXMgaWdub3JlIGl0ICovCisJCQkJaWYgKCFjb21taXQtPnBhcmVudHMgfHwgIWNvbW1pdC0+cGFyZW50cy0+bmV4dCkKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocmV2cy0+cGFyZW50cykKKwkJCQlyZXdyaXRlX3BhcmVudHMocmV2cywgY29tbWl0KTsKKwkJfQorCQlpZiAocmV2cy0+Ym91bmRhcnkpCisJCQltYXJrX2JvdW5kYXJ5X3RvX3Nob3coY29tbWl0KTsKKwkJY29tbWl0LT5vYmplY3QuZmxhZ3MgfD0gU0hPV047CisJCXJldHVybiBjb21taXQ7CisJfSB3aGlsZSAocmV2cy0+Y29tbWl0cyk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9yZXZpc2lvbi5oIGIvcmV2aXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzNiOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmV2aXNpb24uaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBSRVZJU0lPTl9ICisjZGVmaW5lIFJFVklTSU9OX0gKKworI2RlZmluZSBTRUVOCQkoMXU8PDApCisjZGVmaW5lIFVOSU5URVJFU1RJTkcgICAoMXU8PDEpCisjZGVmaW5lIFRSRUVDSEFOR0UJKDF1PDwyKQorI2RlZmluZSBTSE9XTgkJKDF1PDwzKQorI2RlZmluZSBUTVBfTUFSSwkoMXU8PDQpIC8qIGZvciBpc29sYXRlZCBjYXNlczsgY2xlYW4gYWZ0ZXIgdXNlICovCisjZGVmaW5lIEJPVU5EQVJZCSgxdTw8NSkKKyNkZWZpbmUgQk9VTkRBUllfU0hPVwkoMXU8PDYpCisjZGVmaW5lIEFEREVECQkoMXU8PDcpCS8qIFBhcmVudHMgYWxyZWFkeSBwYXJzZWQgYW5kIGFkZGVkPyAqLworCitzdHJ1Y3QgcmV2X2luZm87CitzdHJ1Y3QgbG9nX2luZm87CisKK3R5cGVkZWYgdm9pZCAocHJ1bmVfZm5fdCkoc3RydWN0IHJldl9pbmZvICpyZXZzLCBzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworCitzdHJ1Y3QgcmV2X2luZm8geworCS8qIFN0YXJ0aW5nIGxpc3QgKi8KKwlzdHJ1Y3QgY29tbWl0X2xpc3QgKmNvbW1pdHM7CisJc3RydWN0IG9iamVjdF9hcnJheSBwZW5kaW5nOworCisJLyogQmFzaWMgaW5mb3JtYXRpb24gKi8KKwljb25zdCBjaGFyICpwcmVmaXg7CisJdm9pZCAqcHJ1bmVfZGF0YTsKKwlwcnVuZV9mbl90ICpwcnVuZV9mbjsKKworCS8qIFRyYXZlcnNhbCBmbGFncyAqLworCXVuc2lnbmVkIGludAlkZW5zZToxLAorCQkJbm9fbWVyZ2VzOjEsCisJCQlub193YWxrOjEsCisJCQlyZW1vdmVfZW1wdHlfdHJlZXM6MSwKKwkJCXNpbXBsaWZ5X2hpc3Rvcnk6MSwKKwkJCWxpZm86MSwKKwkJCXRvcG9fb3JkZXI6MSwKKwkJCXRhZ19vYmplY3RzOjEsCisJCQl0cmVlX29iamVjdHM6MSwKKwkJCWJsb2Jfb2JqZWN0czoxLAorCQkJZWRnZV9oaW50OjEsCisJCQlsaW1pdGVkOjEsCisJCQl1bnBhY2tlZDoxLAorCQkJYm91bmRhcnk6MSwKKwkJCXBhcmVudHM6MTsKKworCS8qIERpZmYgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQJZGlmZjoxLAorCQkJZnVsbF9kaWZmOjEsCisJCQlzaG93X3Jvb3RfZGlmZjoxLAorCQkJbm9fY29tbWl0X2lkOjEsCisJCQl2ZXJib3NlX2hlYWRlcjoxLAorCQkJaWdub3JlX21lcmdlczoxLAorCQkJY29tYmluZV9tZXJnZXM6MSwKKwkJCWRlbnNlX2NvbWJpbmVkX21lcmdlczoxLAorCQkJYWx3YXlzX3Nob3dfaGVhZGVyOjE7CisKKwkvKiBGb3JtYXQgaW5mbyAqLworCXVuc2lnbmVkIGludAlzaG93bl9vbmU6MSwKKwkJCWFiYnJldl9jb21taXQ6MTsKKwl1bnNpZ25lZCBpbnQJYWJicmV2OworCWVudW0gY21pdF9mbXQJY29tbWl0X2Zvcm1hdDsKKwlzdHJ1Y3QgbG9nX2luZm8gKmxvZ2luZm87CisJaW50CQluciwgdG90YWw7CisJY29uc3QgY2hhcgkqbWltZV9ib3VuZGFyeTsKKwljb25zdCBjaGFyCSptZXNzYWdlX2lkOworCWNvbnN0IGNoYXIJKnJlZl9tZXNzYWdlX2lkOworCWNvbnN0IGNoYXIJKmFkZF9zaWdub2ZmOworCWNvbnN0IGNoYXIJKmV4dHJhX2hlYWRlcnM7CisKKwkvKiBzcGVjaWFsIGxpbWl0cyAqLworCWludCBtYXhfY291bnQ7CisJdW5zaWduZWQgbG9uZyBtYXhfYWdlOworCXVuc2lnbmVkIGxvbmcgbWluX2FnZTsKKworCS8qIGRpZmYgaW5mbyBmb3IgcGF0Y2hlcyBhbmQgZm9yIHBhdGhzIGxpbWl0aW5nICovCisJc3RydWN0IGRpZmZfb3B0aW9ucyBkaWZmb3B0OworCXN0cnVjdCBkaWZmX29wdGlvbnMgcHJ1bmluZzsKKworCXRvcG9fc29ydF9zZXRfZm5fdCB0b3BvX3NldHRlcjsKKwl0b3BvX3NvcnRfZ2V0X2ZuX3QgdG9wb19nZXR0ZXI7Cit9OworCisjZGVmaW5lIFJFVl9UUkVFX1NBTUUJCTAKKyNkZWZpbmUgUkVWX1RSRUVfTkVXCQkxCisjZGVmaW5lIFJFVl9UUkVFX0RJRkZFUkVOVAkyCisKKy8qIHJldmlzaW9uLmMgKi8KK2V4dGVybiBpbnQgcmV2X3NhbWVfdHJlZV9hc19lbXB0eShzdHJ1Y3QgcmV2X2luZm8gKiwgc3RydWN0IHRyZWUgKnQxKTsKK2V4dGVybiBpbnQgcmV2X2NvbXBhcmVfdHJlZShzdHJ1Y3QgcmV2X2luZm8gKiwgc3RydWN0IHRyZWUgKnQxLCBzdHJ1Y3QgdHJlZSAqdDIpOworCitleHRlcm4gdm9pZCBpbml0X3JldmlzaW9ucyhzdHJ1Y3QgcmV2X2luZm8gKnJldnMsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IHNldHVwX3JldmlzaW9ucyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIHN0cnVjdCByZXZfaW5mbyAqcmV2cywgY29uc3QgY2hhciAqZGVmKTsKK2V4dGVybiB2b2lkIHByZXBhcmVfcmV2aXNpb25fd2FsayhzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworZXh0ZXJuIHN0cnVjdCBjb21taXQgKmdldF9yZXZpc2lvbihzdHJ1Y3QgcmV2X2luZm8gKnJldnMpOworCitleHRlcm4gdm9pZCBtYXJrX3BhcmVudHNfdW5pbnRlcmVzdGluZyhzdHJ1Y3QgY29tbWl0ICpjb21taXQpOworZXh0ZXJuIHZvaWQgbWFya190cmVlX3VuaW50ZXJlc3Rpbmcoc3RydWN0IHRyZWUgKnRyZWUpOworCitzdHJ1Y3QgbmFtZV9wYXRoIHsKKwlzdHJ1Y3QgbmFtZV9wYXRoICp1cDsKKwlpbnQgZWxlbV9sZW47CisJY29uc3QgY2hhciAqZWxlbTsKK307CisKK2V4dGVybiB2b2lkIGFkZF9vYmplY3Qoc3RydWN0IG9iamVjdCAqb2JqLAorCQkgICAgICAgc3RydWN0IG9iamVjdF9hcnJheSAqcCwKKwkJICAgICAgIHN0cnVjdCBuYW1lX3BhdGggKnBhdGgsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHZvaWQgYWRkX3BlbmRpbmdfb2JqZWN0KHN0cnVjdCByZXZfaW5mbyAqcmV2cywgc3RydWN0IG9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yc2guYyBiL3JzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MTY2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9yc2guYwpAQCAtMCwwICsxLDExNiBAQAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgInJzaC5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2RlZmluZSBDT01NQU5EX1NJWkUgNDA5NgorCisvKgorICogQXBwZW5kIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGJ1ZmZlciwgd2l0aCBvciB3aXRob3V0IHNoZWxsIHF1b3RpbmcuCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVmZmVyIG92ZXJmbG93ZWQuCisgKi8KK3N0YXRpYyBpbnQgYWRkX3RvX3N0cmluZyhjaGFyICoqcHRycCwgaW50ICpzaXplcCwgY29uc3QgY2hhciAqc3RyLCBpbnQgcXVvdGUpCit7CisJY2hhciAqcCA9ICpwdHJwOworCWludCBzaXplID0gKnNpemVwOworCWludCBvYzsKKwlpbnQgZXJyID0gMDsKKworCWlmICggcXVvdGUgKSB7CisJCW9jID0gc3FfcXVvdGVfYnVmKHAsIHNpemUsIHN0cik7CisJfSBlbHNlIHsKKwkJb2MgPSBzdHJsZW4oc3RyKTsKKwkJbWVtY3B5KHAsIHN0ciwgKG9jID49IHNpemUpID8gc2l6ZS0xIDogb2MpOworCX0KKworCWlmICggb2MgPj0gc2l6ZSApIHsKKwkJZXJyID0gMTsKKwkJb2MgPSBzaXplLTE7CisJfQorCisJKnB0cnAgICs9IG9jOworCSoqcHRycCAgPSAnXDAnOworCSpzaXplcCAtPSBvYzsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc2V0dXBfY29ubmVjdGlvbihpbnQgKmZkX2luLCBpbnQgKmZkX291dCwgY29uc3QgY2hhciAqcmVtb3RlX3Byb2csIAorCQkgICAgIGNoYXIgKnVybCwgaW50IHJtdF9hcmdjLCBjaGFyICoqcm10X2FyZ3YpCit7CisJY2hhciAqaG9zdDsKKwljaGFyICpwYXRoOworCWludCBzdlsyXTsKKwljaGFyIGNvbW1hbmRbQ09NTUFORF9TSVpFXTsKKwljaGFyICpwb3NuOworCWludCBzaXplbjsKKwlpbnQgb2Y7CisJaW50IGk7CisJcGlkX3QgcGlkOworCisJaWYgKCFzdHJjbXAodXJsLCAiLSIpKSB7CisJCSpmZF9pbiA9IDA7CisJCSpmZF9vdXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlob3N0ID0gc3Ryc3RyKHVybCwgIi8vIik7CisJaWYgKGhvc3QpIHsKKwkJaG9zdCArPSAyOworCQlwYXRoID0gc3RyY2hyKGhvc3QsICcvJyk7CisJfSBlbHNlIHsKKwkJaG9zdCA9IHVybDsKKwkJcGF0aCA9IHN0cmNocihob3N0LCAnOicpOworCQlpZiAocGF0aCkKKwkJCSoocGF0aCsrKSA9ICdcMCc7CisJfQorCWlmICghcGF0aCkgeworCQlyZXR1cm4gZXJyb3IoIkJhZCBVUkw6ICVzIiwgdXJsKTsKKwl9CisJLyogJEdJVF9SU0ggPGhvc3Q+ICJlbnYgR0lUX0RJUj08cGF0aD4gPHJlbW90ZV9wcm9nPiA8YXJncy4uLj4iICovCisJc2l6ZW4gPSBDT01NQU5EX1NJWkU7CisJcG9zbiA9IGNvbW1hbmQ7CisJb2YgPSAwOworCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgImVudiAiLCAwKTsKKwlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sIEdJVF9ESVJfRU5WSVJPTk1FTlQgIj0iLCAwKTsKKwlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sIHBhdGgsIDEpOworCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgIiAiLCAwKTsKKwlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sIHJlbW90ZV9wcm9nLCAxKTsKKworCWZvciAoIGkgPSAwIDsgaSA8IHJtdF9hcmdjIDsgaSsrICkgeworCQlvZiB8PSBhZGRfdG9fc3RyaW5nKCZwb3NuLCAmc2l6ZW4sICIgIiwgMCk7CisJCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgcm10X2FyZ3ZbaV0sIDEpOworCX0KKworCW9mIHw9IGFkZF90b19zdHJpbmcoJnBvc24sICZzaXplbiwgIiAtIiwgMCk7CisKKwlpZiAoIG9mICkKKwkJcmV0dXJuIGVycm9yKCJDb21tYW5kIGxpbmUgdG9vIGxvbmciKTsKKworCWlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzdikpCisJCXJldHVybiBlcnJvcigiQ291bGRuJ3QgY3JlYXRlIHNvY2tldCIpOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IGZvcmsiKTsKKwlpZiAoIXBpZCkgeworCQljb25zdCBjaGFyICpzc2gsICpzc2hfYmFzZW5hbWU7CisJCXNzaCA9IGdldGVudigiR0lUX1NTSCIpOworCQlpZiAoIXNzaCkgc3NoID0gInNzaCI7CisJCXNzaF9iYXNlbmFtZSA9IHN0cnJjaHIoc3NoLCAnLycpOworCQlpZiAoIXNzaF9iYXNlbmFtZSkKKwkJCXNzaF9iYXNlbmFtZSA9IHNzaDsKKwkJZWxzZQorCQkJc3NoX2Jhc2VuYW1lKys7CisJCWNsb3NlKHN2WzFdKTsKKwkJZHVwMihzdlswXSwgMCk7CisJCWR1cDIoc3ZbMF0sIDEpOworCQlleGVjbHAoc3NoLCBzc2hfYmFzZW5hbWUsIGhvc3QsIGNvbW1hbmQsIE5VTEwpOworCX0KKwljbG9zZShzdlswXSk7CisJKmZkX2luID0gc3ZbMV07CisJKmZkX291dCA9IHN2WzFdOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcnNoLmggYi9yc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQxOTQyCi0tLSAvZGV2L251bGwKKysrIGIvcnNoLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIFJTSF9ICisjZGVmaW5lIFJTSF9ICisKK2ludCBzZXR1cF9jb25uZWN0aW9uKGludCAqZmRfaW4sIGludCAqZmRfb3V0LCBjb25zdCBjaGFyICpyZW1vdGVfcHJvZywgCisJCSAgICAgY2hhciAqdXJsLCBpbnQgcm10X2FyZ2MsIGNoYXIgKipybXRfYXJndik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcnVuLWNvbW1hbmQuYyBiL3J1bi1jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2N2VlOQotLS0gL2Rldi9udWxsCisrKyBiL3J1bi1jb21tYW5kLmMKQEAgLTAsMCArMSw3NCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK2ludCBydW5fY29tbWFuZF92X29wdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBmbGFncykKK3sKKwlwaWRfdCBwaWQgPSBmb3JrKCk7CisKKwlpZiAocGlkIDwgMCkKKwkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfRk9SSzsKKwlpZiAoIXBpZCkgeworCQlpZiAoZmxhZ3MgJiBSVU5fQ09NTUFORF9OT19TVERJTykgeworCQkJaW50IGZkID0gb3BlbigiL2Rldi9udWxsIiwgT19SRFdSKTsKKwkJCWR1cDIoZmQsIDApOworCQkJZHVwMihmZCwgMSk7CisJCQljbG9zZShmZCk7CisJCX0KKwkJaWYgKGZsYWdzICYgUlVOX0dJVF9DTUQpIHsKKwkJCWV4ZWN2X2dpdF9jbWQoYXJndik7CisJCX0gZWxzZSB7CisJCQlleGVjdnAoYXJndlswXSwgKGNoYXIgKmNvbnN0KikgYXJndik7CisJCX0KKwkJZGllKCJleGVjICVzIGZhaWxlZC4iLCBhcmd2WzBdKTsKKwl9CisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzLCBjb2RlOworCQlpbnQgcmV0dmFsID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQllcnJvcigid2FpdHBpZCBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKHJldHZhbCkpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDsKKwkJfQorCQlpZiAocmV0dmFsICE9IHBpZCkKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElEOworCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfU0lHTkFMOworCisJCWlmICghV0lGRVhJVEVEKHN0YXR1cykpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX05PRVhJVDsKKwkJY29kZSA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCWlmIChjb2RlKQorCQkJcmV0dXJuIC1jb2RlOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK2ludCBydW5fY29tbWFuZF92KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gcnVuX2NvbW1hbmRfdl9vcHQoYXJnYywgYXJndiwgMCk7Cit9CisKK2ludCBydW5fY29tbWFuZChjb25zdCBjaGFyICpjbWQsIC4uLikKK3sKKwlpbnQgYXJnYzsKKwljb25zdCBjaGFyICphcmd2W01BWF9SVU5fQ09NTUFORF9BUkdTXTsKKwljb25zdCBjaGFyICphcmc7CisJdmFfbGlzdCBwYXJhbTsKKworCXZhX3N0YXJ0KHBhcmFtLCBjbWQpOworCWFyZ3ZbMF0gPSAoY2hhciopIGNtZDsKKwlhcmdjID0gMTsKKwl3aGlsZSAoYXJnYyA8IE1BWF9SVU5fQ09NTUFORF9BUkdTKSB7CisJCWFyZyA9IGFyZ3ZbYXJnYysrXSA9IHZhX2FyZyhwYXJhbSwgY2hhciAqKTsKKwkJaWYgKCFhcmcpCisJCQlicmVhazsKKwl9CisJdmFfZW5kKHBhcmFtKTsKKwlpZiAoTUFYX1JVTl9DT01NQU5EX0FSR1MgPD0gYXJnYykKKwkJcmV0dXJuIGVycm9yKCJ0b28gbWFueSBhcmdzIHRvIHJ1biAlcyIsIGNtZCk7CisJcmV0dXJuIHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ2MsIGFyZ3YsIDApOworfQpkaWZmIC0tZ2l0IGEvcnVuLWNvbW1hbmQuaCBiL3J1bi1jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNDc3YQotLS0gL2Rldi9udWxsCisrKyBiL3J1bi1jb21tYW5kLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmbmRlZiBSVU5fQ09NTUFORF9ICisjZGVmaW5lIFJVTl9DT01NQU5EX0gKKworI2RlZmluZSBNQVhfUlVOX0NPTU1BTkRfQVJHUyAyNTYKK2VudW0geworCUVSUl9SVU5fQ09NTUFORF9GT1JLID0gMTAwMDAsCisJRVJSX1JVTl9DT01NQU5EX0VYRUMsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSUQsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfV1JPTkdfUElELAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTCwKKwlFUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQsCit9OworCisjZGVmaW5lIFJVTl9DT01NQU5EX05PX1NURElPIDEKKyNkZWZpbmUgUlVOX0dJVF9DTUQJICAgICAyCS8qSWYgdGhpcyBpcyB0byBiZSBnaXQgc3ViLWNvbW1hbmQgKi8KK2ludCBydW5fY29tbWFuZF92X29wdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQpOworaW50IHJ1bl9jb21tYW5kX3YoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKK2ludCBydW5fY29tbWFuZChjb25zdCBjaGFyICpjbWQsIC4uLik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VuZC1wYWNrLmMgYi9zZW5kLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJjOGJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VuZC1wYWNrLmMKQEAgLTAsMCArMSw0MTQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHNlbmRfcGFja191c2FnZVtdID0KKyJnaXQtc2VuZC1wYWNrIFstLWFsbF0gWy0tZXhlYz1naXQtcmVjZWl2ZS1wYWNrXSA8cmVtb3RlPiBbPGhlYWQ+Li4uXVxuIgorIiAgLS1hbGwgYW5kIGV4cGxpY2l0IDxoZWFkPiBzcGVjaWZpY2F0aW9uIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKK3N0YXRpYyBjb25zdCBjaGFyICpleGVjID0gImdpdC1yZWNlaXZlLXBhY2siOworc3RhdGljIGludCB2ZXJib3NlID0gMDsKK3N0YXRpYyBpbnQgc2VuZF9hbGwgPSAwOworc3RhdGljIGludCBmb3JjZV91cGRhdGUgPSAwOworc3RhdGljIGludCB1c2VfdGhpbl9wYWNrID0gMDsKKworc3RhdGljIGludCBpc196ZXJvX3NoYTEoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCWlmICgqc2hhMSsrKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBleGVjX3BhY2tfb2JqZWN0cyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICphcmdzW10gPSB7CisJCSJwYWNrLW9iamVjdHMiLAorCQkiLS1zdGRvdXQiLAorCQlOVUxMCisJfTsKKwlleGVjdl9naXRfY21kKGFyZ3MpOworCWRpZSgiZ2l0LXBhY2stb2JqZWN0cyBleGVjIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQgZXhlY19yZXZfbGlzdChzdHJ1Y3QgcmVmICpyZWZzKQoreworCXN0cnVjdCByZWYgKnJlZjsKKwlzdGF0aWMgY29uc3QgY2hhciAqYXJnc1sxMDAwXTsKKwlpbnQgaSA9IDAsIGo7CisKKwlhcmdzW2krK10gPSAicmV2LWxpc3QiOwkvKiAwICovCisJaWYgKHVzZV90aGluX3BhY2spCS8qIDEgKi8KKwkJYXJnc1tpKytdID0gIi0tb2JqZWN0cy1lZGdlIjsKKwllbHNlCisJCWFyZ3NbaSsrXSA9ICItLW9iamVjdHMiOworCisJLyogRmlyc3Qgc2VuZCB0aGUgb25lcyB3ZSBjYXJlIGFib3V0IG1vc3QgKi8KKwlmb3IgKHJlZiA9IHJlZnM7IHJlZjsgcmVmID0gcmVmLT5uZXh0KSB7CisJCWlmICg5MDAgPCBpKQorCQkJZGllKCJnaXQtcmV2LWxpc3QgZW52aXJvbm1lbnQgb3ZlcmZsb3ciKTsKKwkJaWYgKCFpc196ZXJvX3NoYTEocmVmLT5uZXdfc2hhMSkpIHsKKwkJCWNoYXIgKmJ1ZiA9IG1hbGxvYygxMDApOworCQkJYXJnc1tpKytdID0gYnVmOworCQkJc25wcmludGYoYnVmLCA1MCwgIiVzIiwgc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSkpOworCQkJYnVmICs9IDUwOworCQkJaWYgKCFpc196ZXJvX3NoYTEocmVmLT5vbGRfc2hhMSkgJiYKKwkJCSAgICBoYXNfc2hhMV9maWxlKHJlZi0+b2xkX3NoYTEpKSB7CisJCQkJYXJnc1tpKytdID0gYnVmOworCQkJCXNucHJpbnRmKGJ1ZiwgNTAsICJeJXMiLAorCQkJCQkgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQkJfQorCQl9CisJfQorCisJLyogVGhlbiBhIGhhbmRmdWwgb2YgdGhlIHJlbWFpbmRlcgorCSAqIE5FRURTV09SSzogd2Ugd291bGQgYmUgYmV0dGVyIG9mZiBpZiB1c2VkIHRoZSBuZXdlciBvbmVzIGZpcnN0LgorCSAqLworCWZvciAocmVmID0gcmVmcywgaiA9IGkgKyAxNjsKKwkgICAgIGkgPCA5MDAgJiYgaSA8IGogJiYgcmVmOworCSAgICAgcmVmID0gcmVmLT5uZXh0KSB7CisJCWlmIChpc196ZXJvX3NoYTEocmVmLT5uZXdfc2hhMSkgJiYKKwkJICAgICFpc196ZXJvX3NoYTEocmVmLT5vbGRfc2hhMSkgJiYKKwkJICAgIGhhc19zaGExX2ZpbGUocmVmLT5vbGRfc2hhMSkpIHsKKwkJCWNoYXIgKmJ1ZiA9IG1hbGxvYyg0Mik7CisJCQlhcmdzW2krK10gPSBidWY7CisJCQlzbnByaW50ZihidWYsIDQyLCAiXiVzIiwgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQl9CisJfQorCWFyZ3NbaV0gPSBOVUxMOworCWV4ZWN2X2dpdF9jbWQoYXJncyk7CisJZGllKCJnaXQtcmV2LWxpc3QgZXhlYyBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJldl9saXN0KGludCBmZCwgc3RydWN0IHJlZiAqcmVmcykKK3sKKwlpbnQgcGlwZV9mZFsyXTsKKwlwaWRfdCBwYWNrX29iamVjdHNfcGlkOworCisJaWYgKHBpcGUocGlwZV9mZCkgPCAwKQorCQlkaWUoInJldi1saXN0IHNldHVwOiBwaXBlIGZhaWxlZCIpOworCXBhY2tfb2JqZWN0c19waWQgPSBmb3JrKCk7CisJaWYgKCFwYWNrX29iamVjdHNfcGlkKSB7CisJCWR1cDIocGlwZV9mZFswXSwgMCk7CisJCWR1cDIoZmQsIDEpOworCQljbG9zZShwaXBlX2ZkWzBdKTsKKwkJY2xvc2UocGlwZV9mZFsxXSk7CisJCWNsb3NlKGZkKTsKKwkJZXhlY19wYWNrX29iamVjdHMoKTsKKwkJZGllKCJwYWNrLW9iamVjdHMgc2V0dXAgZmFpbGVkIik7CisJfQorCWlmIChwYWNrX29iamVjdHNfcGlkIDwgMCkKKwkJZGllKCJwYWNrLW9iamVjdHMgZm9yayBmYWlsZWQiKTsKKwlkdXAyKHBpcGVfZmRbMV0sIDEpOworCWNsb3NlKHBpcGVfZmRbMF0pOworCWNsb3NlKHBpcGVfZmRbMV0pOworCWNsb3NlKGZkKTsKKwlleGVjX3Jldl9saXN0KHJlZnMpOworfQorCitzdGF0aWMgaW50IHBhY2tfb2JqZWN0cyhpbnQgZmQsIHN0cnVjdCByZWYgKnJlZnMpCit7CisJcGlkX3QgcmV2X2xpc3RfcGlkOworCisJcmV2X2xpc3RfcGlkID0gZm9yaygpOworCWlmICghcmV2X2xpc3RfcGlkKSB7CisJCXJldl9saXN0KGZkLCByZWZzKTsKKwkJZGllKCJyZXYtbGlzdCBzZXR1cCBmYWlsZWQiKTsKKwl9CisJaWYgKHJldl9saXN0X3BpZCA8IDApCisJCWRpZSgicmV2LWxpc3QgZm9yayBmYWlsZWQiKTsKKwkvKgorCSAqIFdlIGRvbid0IHdhaXQgZm9yIHRoZSByZXYtbGlzdCBwaXBlbGluZSBpbiB0aGUgcGFyZW50OgorCSAqIHdlIGVuZCB1cCB3YWl0aW5nIGZvciB0aGUgb3RoZXIgZW5kIGluc3RlYWQKKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdW5tYXJrX2FuZF9mcmVlKHN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgdW5zaWduZWQgaW50IG1hcmspCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJc3RydWN0IGNvbW1pdF9saXN0ICp0ZW1wID0gbGlzdDsKKwkJdGVtcC0+aXRlbS0+b2JqZWN0LmZsYWdzICY9IH5tYXJrOworCQlsaXN0ID0gdGVtcC0+bmV4dDsKKwkJZnJlZSh0ZW1wKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVmX25ld2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld19zaGExLAorCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9sZF9zaGExKQoreworCXN0cnVjdCBvYmplY3QgKm87CisJc3RydWN0IGNvbW1pdCAqb2xkLCAqbmV3OworCXN0cnVjdCBjb21taXRfbGlzdCAqbGlzdCwgKnVzZWQ7CisJaW50IGZvdW5kID0gMDsKKworCS8qIEJvdGggbmV3IGFuZCBvbGQgbXVzdCBiZSBjb21taXQtaXNoIGFuZCBuZXcgaXMgZGVzY2VuZGFudCBvZgorCSAqIG9sZC4gIE90aGVyd2lzZSB3ZSByZXF1aXJlIC0tZm9yY2UuCisJICovCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3Qob2xkX3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwlvbGQgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJbyA9IGRlcmVmX3RhZyhwYXJzZV9vYmplY3QobmV3X3NoYTEpLCBOVUxMLCAwKTsKKwlpZiAoIW8gfHwgby0+dHlwZSAhPSBPQkpfQ09NTUlUKQorCQlyZXR1cm4gMDsKKwluZXcgPSAoc3RydWN0IGNvbW1pdCAqKSBvOworCisJaWYgKHBhcnNlX2NvbW1pdChuZXcpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwl1c2VkID0gbGlzdCA9IE5VTEw7CisJY29tbWl0X2xpc3RfaW5zZXJ0KG5ldywgJmxpc3QpOworCXdoaWxlIChsaXN0KSB7CisJCW5ldyA9IHBvcF9tb3N0X3JlY2VudF9jb21taXQoJmxpc3QsIDEpOworCQljb21taXRfbGlzdF9pbnNlcnQobmV3LCAmdXNlZCk7CisJCWlmIChuZXcgPT0gb2xkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwl1bm1hcmtfYW5kX2ZyZWUobGlzdCwgMSk7CisJdW5tYXJrX2FuZF9mcmVlKHVzZWQsIDEpOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCByZWYgKmxvY2FsX3JlZnMsICoqbG9jYWxfdGFpbDsKK3N0YXRpYyBzdHJ1Y3QgcmVmICpyZW1vdGVfcmVmcywgKipyZW1vdGVfdGFpbDsKKworc3RhdGljIGludCBvbmVfbG9jYWxfcmVmKGNvbnN0IGNoYXIgKnJlZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHJlZiAqcmVmOworCWludCBsZW4gPSBzdHJsZW4ocmVmbmFtZSkgKyAxOworCXJlZiA9IHhjYWxsb2MoMSwgc2l6ZW9mKCpyZWYpICsgbGVuKTsKKwltZW1jcHkocmVmLT5uZXdfc2hhMSwgc2hhMSwgMjApOworCW1lbWNweShyZWYtPm5hbWUsIHJlZm5hbWUsIGxlbik7CisJKmxvY2FsX3RhaWwgPSByZWY7CisJbG9jYWxfdGFpbCA9ICZyZWYtPm5leHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9sb2NhbF9oZWFkcyh2b2lkKQoreworCWxvY2FsX3RhaWwgPSAmbG9jYWxfcmVmczsKKwlmb3JfZWFjaF9yZWYob25lX2xvY2FsX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgcmVjZWl2ZV9zdGF0dXMoaW50IGluKQoreworCWNoYXIgbGluZVsxMDAwXTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbGVuID0gcGFja2V0X3JlYWRfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwlpZiAobGVuIDwgMTAgfHwgbWVtY21wKGxpbmUsICJ1bnBhY2sgIiwgNykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkaWQgbm90IHJlY2VpdmUgc3RhdHVzIGJhY2tcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChtZW1jbXAobGluZSwgInVucGFjayBva1xuIiwgMTApKSB7CisJCWZwdXRzKGxpbmUsIHN0ZGVycik7CisJCXJldCA9IC0xOworCX0KKwl3aGlsZSAoMSkgeworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKGluLCBsaW5lLCBzaXplb2YobGluZSkpOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlpZiAobGVuIDwgMyB8fAorCQkgICAgKG1lbWNtcChsaW5lLCAib2siLCAyKSAmJiBtZW1jbXAobGluZSwgIm5nIiwgMikpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgInByb3RvY29sIGVycm9yOiAlc1xuIiwgbGluZSk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghbWVtY21wKGxpbmUsICJvayIsIDIpKQorCQkJY29udGludWU7CisJCWZwdXRzKGxpbmUsIHN0ZGVycik7CisJCXJldCA9IC0xOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlbmRfcGFjayhpbnQgaW4sIGludCBvdXQsIGludCBucl9yZWZzcGVjLCBjaGFyICoqcmVmc3BlYykKK3sKKwlzdHJ1Y3QgcmVmICpyZWY7CisJaW50IG5ld19yZWZzOworCWludCByZXQgPSAwOworCWludCBhc2tfZm9yX3N0YXR1c19yZXBvcnQgPSAwOworCWludCBleHBlY3Rfc3RhdHVzX3JlcG9ydCA9IDA7CisKKwkvKiBObyBmdW5ueSBidXNpbmVzcyB3aXRoIHRoZSBtYXRjaGVyICovCisJcmVtb3RlX3RhaWwgPSBnZXRfcmVtb3RlX2hlYWRzKGluLCAmcmVtb3RlX3JlZnMsIDAsIE5VTEwsIFJFRl9OT1JNQUwpOworCWdldF9sb2NhbF9oZWFkcygpOworCisJLyogRG9lcyB0aGUgb3RoZXIgZW5kIHN1cHBvcnQgdGhlIHJlcG9ydGluZz8gKi8KKwlpZiAoc2VydmVyX3N1cHBvcnRzKCJyZXBvcnQtc3RhdHVzIikpCisJCWFza19mb3Jfc3RhdHVzX3JlcG9ydCA9IDE7CisKKwkvKiBtYXRjaCB0aGVtIHVwICovCisJaWYgKCFyZW1vdGVfdGFpbCkKKwkJcmVtb3RlX3RhaWwgPSAmcmVtb3RlX3JlZnM7CisJaWYgKG1hdGNoX3JlZnMobG9jYWxfcmVmcywgcmVtb3RlX3JlZnMsICZyZW1vdGVfdGFpbCwKKwkJICAgICAgIG5yX3JlZnNwZWMsIHJlZnNwZWMsIHNlbmRfYWxsKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFyZW1vdGVfcmVmcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHJlZnMgaW4gY29tbW9uIGFuZCBub25lIHNwZWNpZmllZDsgZG9pbmcgbm90aGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHksIHRlbGwgdGhlIG90aGVyIGVuZCEKKwkgKi8KKwluZXdfcmVmcyA9IDA7CisJZm9yIChyZWYgPSByZW1vdGVfcmVmczsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJY2hhciBvbGRfaGV4WzYwXSwgKm5ld19oZXg7CisJCWlmICghcmVmLT5wZWVyX3JlZikKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1lbWNtcChyZWYtPm9sZF9zaGExLCByZWYtPnBlZXJfcmVmLT5uZXdfc2hhMSwgMjApKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiclcyc6IHVwLXRvLWRhdGVcbiIsIHJlZi0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoaXMgcGFydCBkZXRlcm1pbmVzIHdoYXQgY2FuIG92ZXJ3cml0ZSB3aGF0LgorCQkgKiBUaGUgcnVsZXMgYXJlOgorCQkgKgorCQkgKiAoMCkgeW91IGNhbiBhbHdheXMgdXNlIC0tZm9yY2Ugb3IgK0E6QiBub3RhdGlvbiB0bworCQkgKiAgICAgc2VsZWN0aXZlbHkgZm9yY2UgaW5kaXZpZHVhbCByZWYgcGFpcnMuCisJCSAqCisJCSAqICgxKSBpZiB0aGUgb2xkIHRoaW5nIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBPSy4KKwkJICoKKwkJICogKDIpIGlmIHlvdSBkbyBub3QgaGF2ZSB0aGUgb2xkIHRoaW5nLCB5b3UgYXJlIG5vdCBhbGxvd2VkCisJCSAqICAgICB0byBvdmVyd3JpdGUgaXQ7IHlvdSB3b3VsZCBub3Qga25vdyB3aGF0IHlvdSBhcmUgbG9zaW5nCisJCSAqICAgICBvdGhlcndpc2UuCisJCSAqCisJCSAqICgzKSBpZiBib3RoIG5ldyBhbmQgb2xkIGFyZSBjb21taXQtaXNoLCBhbmQgbmV3IGlzIGEKKwkJICogICAgIGRlc2NlbmRhbnQgb2Ygb2xkLCBpdCBpcyBPSy4KKwkJICovCisKKwkJaWYgKCFmb3JjZV91cGRhdGUgJiYKKwkJICAgICFpc196ZXJvX3NoYTEocmVmLT5vbGRfc2hhMSkgJiYKKwkJICAgICFyZWYtPmZvcmNlKSB7CisJCQlpZiAoIWhhc19zaGExX2ZpbGUocmVmLT5vbGRfc2hhMSkgfHwKKwkJCSAgICAhcmVmX25ld2VyKHJlZi0+cGVlcl9yZWYtPm5ld19zaGExLAorCQkJCSAgICAgICByZWYtPm9sZF9zaGExKSkgeworCQkJCS8qIFdlIGRvIG5vdCBoYXZlIHRoZSByZW1vdGUgcmVmLCBvcgorCQkJCSAqIHdlIGtub3cgdGhhdCB0aGUgcmVtb3RlIHJlZiBpcyBub3QKKwkJCQkgKiBhbiBhbmNlc3RvciBvZiB3aGF0IHdlIGFyZSB0cnlpbmcgdG8KKwkJCQkgKiBwdXNoLiAgRWl0aGVyIHdheSB0aGlzIGNhbiBiZSBsb3NpbmcKKwkJCQkgKiBjb21taXRzIGF0IHRoZSByZW1vdGUgZW5kIGFuZCBsaWtlbHkKKwkJCQkgKiB3ZSB3ZXJlIG5vdCB1cCB0byBkYXRlIHRvIGJlZ2luIHdpdGguCisJCQkJICovCisJCQkJZXJyb3IoInJlbW90ZSAnJXMnIGlzIG5vdCBhIHN0cmljdCAiCisJCQkJICAgICAgInN1YnNldCBvZiBsb2NhbCByZWYgJyVzJy4gIgorCQkJCSAgICAgICJtYXliZSB5b3UgYXJlIG5vdCB1cC10by1kYXRlIGFuZCAiCisJCQkJICAgICAgIm5lZWQgdG8gcHVsbCBmaXJzdD8iLAorCQkJCSAgICAgIHJlZi0+bmFtZSwKKwkJCQkgICAgICByZWYtPnBlZXJfcmVmLT5uYW1lKTsKKwkJCQlyZXQgPSAtMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQltZW1jcHkocmVmLT5uZXdfc2hhMSwgcmVmLT5wZWVyX3JlZi0+bmV3X3NoYTEsIDIwKTsKKwkJaWYgKGlzX3plcm9fc2hhMShyZWYtPm5ld19zaGExKSkgeworCQkJZXJyb3IoImNhbm5vdCBoYXBwZW4gYW55bW9yZSIpOworCQkJcmV0ID0gLTM7CisJCQljb250aW51ZTsKKwkJfQorCQluZXdfcmVmcysrOworCQlzdHJjcHkob2xkX2hleCwgc2hhMV90b19oZXgocmVmLT5vbGRfc2hhMSkpOworCQluZXdfaGV4ID0gc2hhMV90b19oZXgocmVmLT5uZXdfc2hhMSk7CisKKwkJaWYgKGFza19mb3Jfc3RhdHVzX3JlcG9ydCkgeworCQkJcGFja2V0X3dyaXRlKG91dCwgIiVzICVzICVzJWMlcyIsCisJCQkJICAgICBvbGRfaGV4LCBuZXdfaGV4LCByZWYtPm5hbWUsIDAsCisJCQkJICAgICAicmVwb3J0LXN0YXR1cyIpOworCQkJYXNrX2Zvcl9zdGF0dXNfcmVwb3J0ID0gMDsKKwkJCWV4cGVjdF9zdGF0dXNfcmVwb3J0ID0gMTsKKwkJfQorCQllbHNlCisJCQlwYWNrZXRfd3JpdGUob3V0LCAiJXMgJXMgJXMiLAorCQkJCSAgICAgb2xkX2hleCwgbmV3X2hleCwgcmVmLT5uYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJ1cGRhdGluZyAnJXMnIiwgcmVmLT5uYW1lKTsKKwkJaWYgKHN0cmNtcChyZWYtPm5hbWUsIHJlZi0+cGVlcl9yZWYtPm5hbWUpKQorCQkJZnByaW50ZihzdGRlcnIsICIgdXNpbmcgJyVzJyIsIHJlZi0+cGVlcl9yZWYtPm5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuICBmcm9tICVzXG4gIHRvICAgJXNcbiIsIG9sZF9oZXgsIG5ld19oZXgpOworCX0KKworCXBhY2tldF9mbHVzaChvdXQpOworCWlmIChuZXdfcmVmcykKKwkJcGFja19vYmplY3RzKG91dCwgcmVtb3RlX3JlZnMpOworCWNsb3NlKG91dCk7CisKKwlpZiAoZXhwZWN0X3N0YXR1c19yZXBvcnQpIHsKKwkJaWYgKHJlY2VpdmVfc3RhdHVzKGluKSkKKwkJCXJldCA9IC00OworCX0KKworCWlmICghbmV3X3JlZnMgJiYgcmV0ID09IDApCisJCWZwcmludGYoc3RkZXJyLCAiRXZlcnl0aGluZyB1cC10by1kYXRlXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgbnJfaGVhZHMgPSAwOworCWNoYXIgKmRlc3QgPSBOVUxMOworCWNoYXIgKipoZWFkcyA9IE5VTEw7CisJaW50IGZkWzJdLCByZXQ7CisJcGlkX3QgcGlkOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCWFyZ3YrKzsKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrLCBhcmd2KyspIHsKKwkJY2hhciAqYXJnID0gKmFyZ3Y7CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS1leGVjPSIsIDcpKSB7CisJCQkJZXhlYyA9IGFyZyArIDc7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLWFsbCIpKSB7CisJCQkJc2VuZF9hbGwgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzdHJjbXAoYXJnLCAiLS1mb3JjZSIpKSB7CisJCQkJZm9yY2VfdXBkYXRlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghc3RyY21wKGFyZywgIi0tdmVyYm9zZSIpKSB7CisJCQkJdmVyYm9zZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItLXRoaW4iKSkgeworCQkJCXVzZV90aGluX3BhY2sgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2Uoc2VuZF9wYWNrX3VzYWdlKTsKKwkJfQorCQlpZiAoIWRlc3QpIHsKKwkJCWRlc3QgPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCQloZWFkcyA9IGFyZ3Y7CisJCW5yX2hlYWRzID0gYXJnYyAtIGk7CisJCWJyZWFrOworCX0KKwlpZiAoIWRlc3QpCisJCXVzYWdlKHNlbmRfcGFja191c2FnZSk7CisJaWYgKGhlYWRzICYmIHNlbmRfYWxsKQorCQl1c2FnZShzZW5kX3BhY2tfdXNhZ2UpOworCXBpZCA9IGdpdF9jb25uZWN0KGZkLCBkZXN0LCBleGVjKTsKKwlpZiAocGlkIDwgMCkKKwkJcmV0dXJuIDE7CisJcmV0ID0gc2VuZF9wYWNrKGZkWzBdLCBmZFsxXSwgbnJfaGVhZHMsIGhlYWRzKTsKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworCWZpbmlzaF9jb25uZWN0KHBpZCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NlcnZlci1pbmZvLmMgYi9zZXJ2ZXItaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjYyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXItaW5mby5jCkBAIC0wLDAgKzEsMjQ4IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidGFnLmgiCisKKy8qIHJlZnMgKi8KK3N0YXRpYyBGSUxFICppbmZvX3JlZl9mcDsKKworc3RhdGljIGludCBhZGRfaW5mb19yZWYoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCisJZnByaW50ZihpbmZvX3JlZl9mcCwgIiVzCSVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcGF0aCk7CisJaWYgKG8tPnR5cGUgPT0gT0JKX1RBRykgeworCQlvID0gZGVyZWZfdGFnKG8sIHBhdGgsIDApOworCQlpZiAobykKKwkJCWZwcmludGYoaW5mb19yZWZfZnAsICIlcwklc157fVxuIiwKKwkJCQlzaGExX3RvX2hleChvLT5zaGExKSwgcGF0aCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9pbmZvX3JlZnMoaW50IGZvcmNlKQoreworCWNoYXIgKnBhdGgwID0gc3RyZHVwKGdpdF9wYXRoKCJpbmZvL3JlZnMiKSk7CisJaW50IGxlbiA9IHN0cmxlbihwYXRoMCk7CisJY2hhciAqcGF0aDEgPSB4bWFsbG9jKGxlbiArIDIpOworCisJc3RyY3B5KHBhdGgxLCBwYXRoMCk7CisJc3RyY3B5KHBhdGgxICsgbGVuLCAiKyIpOworCisJc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhwYXRoMCk7CisJaW5mb19yZWZfZnAgPSBmb3BlbihwYXRoMSwgInciKTsKKwlpZiAoIWluZm9fcmVmX2ZwKQorCQlyZXR1cm4gZXJyb3IoInVuYWJsZSB0byB1cGRhdGUgJXMiLCBwYXRoMCk7CisJZm9yX2VhY2hfcmVmKGFkZF9pbmZvX3JlZik7CisJZmNsb3NlKGluZm9fcmVmX2ZwKTsKKwlyZW5hbWUocGF0aDEsIHBhdGgwKTsKKwlmcmVlKHBhdGgwKTsKKwlmcmVlKHBhdGgxKTsKKwlyZXR1cm4gMDsKK30KKworLyogcGFja3MgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFja19pbmZvIHsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlpbnQgb2xkX251bTsKKwlpbnQgbmV3X251bTsKKwlpbnQgbnJfYWxsb2M7CisJaW50IG5yX2hlYWRzOworCXVuc2lnbmVkIGNoYXIgKCpoZWFkKVsyMF07Cit9ICoqaW5mbzsKK3N0YXRpYyBpbnQgbnVtX3BhY2s7CitzdGF0aWMgY29uc3QgY2hhciAqb2JqZGlyOworc3RhdGljIGludCBvYmpkaXJsZW47CisKK3N0YXRpYyBzdHJ1Y3QgcGFja19pbmZvICpmaW5kX3BhY2tfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFjazsgaSsrKSB7CisJCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gaW5mb1tpXS0+cDsKKwkJLyogc2tpcCAiL3BhY2svIiBhZnRlciAiLmdpdC9vYmplY3RzIiAqLworCQlpZiAoIXN0cmNtcChwLT5wYWNrX25hbWUgKyBvYmpkaXJsZW4gKyA2LCBuYW1lKSkKKwkJCXJldHVybiBpbmZvW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJucyBub24temVybyB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBpbmZvIGluIHRoZQorICogb2xkIGZpbGUgaXMgdXNlbGVzcy4KKyAqLworc3RhdGljIGludCBwYXJzZV9wYWNrX2RlZihjb25zdCBjaGFyICpsaW5lLCBpbnQgb2xkX2NudCkKK3sKKwlzdHJ1Y3QgcGFja19pbmZvICppID0gZmluZF9wYWNrX2J5X25hbWUobGluZSArIDIpOworCWlmIChpKSB7CisJCWktPm9sZF9udW0gPSBvbGRfY250OworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSB7CisJCS8qIFRoZSBmaWxlIGRlc2NyaWJlcyBhIHBhY2sgdGhhdCBpcyBubyBsb25nZXIgaGVyZSAqLworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIFJldHVybnMgbm9uLXplcm8gd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgaW5mbyBpbiB0aGUKKyAqIG9sZCBmaWxlIGlzIHVzZWxlc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9wYWNrX2luZm9fZmlsZShjb25zdCBjaGFyICppbmZvZmlsZSkKK3sKKwlGSUxFICpmcDsKKwljaGFyIGxpbmVbMTAwMF07CisJaW50IG9sZF9jbnQgPSAwOworCisJZnAgPSBmb3BlbihpbmZvZmlsZSwgInIiKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gMTsgLyogbm9uZXhpc3RlbnQgaXMgbm90IGFuIGVycm9yLiAqLworCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnApKSB7CisJCWludCBsZW4gPSBzdHJsZW4obGluZSk7CisJCWlmIChsaW5lW2xlbi0xXSA9PSAnXG4nKQorCQkJbGluZVstLWxlbl0gPSAwOworCisJCWlmICghbGVuKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChsaW5lWzBdKSB7CisJCWNhc2UgJ1AnOiAvKiBQIG5hbWUgKi8KKwkJCWlmIChwYXJzZV9wYWNrX2RlZihsaW5lLCBvbGRfY250KyspKQorCQkJCWdvdG8gb3V0X3N0YWxlOworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOiAvKiB3ZSB1c2VkIHRvIGVtaXQgRCBidXQgdGhhdCB3YXMgbWlzZ3VpZGVkLiAqLworCQkJZ290byBvdXRfc3RhbGU7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6IC8qIHdlIHVzZWQgdG8gZW1pdCBUIGJ1dCBub2JvZHkgdXNlcyBpdC4gKi8KKwkJCWdvdG8gb3V0X3N0YWxlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvcigidW5yZWNvZ25pemVkOiAlcyIsIGxpbmUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMDsKKyBvdXRfc3RhbGU6CisJZmNsb3NlKGZwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjb21wYXJlX2luZm8oY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBwYWNrX2luZm8gKiBjb25zdCogYSA9IGFfOworCXN0cnVjdCBwYWNrX2luZm8gKiBjb25zdCogYiA9IGJfOworCisJaWYgKDAgPD0gKCphKS0+b2xkX251bSAmJiAwIDw9ICgqYiktPm9sZF9udW0pCisJCS8qIEtlZXAgdGhlIG9yZGVyIGluIHRoZSBvcmlnaW5hbCAqLworCQlyZXR1cm4gKCphKS0+b2xkX251bSAtICgqYiktPm9sZF9udW07CisJZWxzZSBpZiAoMCA8PSAoKmEpLT5vbGRfbnVtKQorCQkvKiBPbmx5IEEgZXhpc3RlZCBpbiB0aGUgb3JpZ2luYWwgc28gQiBpcyBvYnZpb3VzbHkgbmV3ZXIgKi8KKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKDAgPD0gKCpiKS0+b2xkX251bSkKKwkJLyogVGhlIG90aGVyIHdheSBhcm91bmQuICovCisJCXJldHVybiAxOworCisJLyogdGhlbiBpdCBkb2VzIG5vdCBtYXR0ZXIgYnV0IGF0IGxlYXN0IGtlZXAgdGhlIGNvbXBhcmlzb24gc3RhYmxlICovCisJaWYgKCgqYSktPnAgPT0gKCpiKS0+cCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKCphKS0+cCA8ICgqYiktPnApCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBpbml0X3BhY2tfaW5mbyhjb25zdCBjaGFyICppbmZvZmlsZSwgaW50IGZvcmNlKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCWludCBzdGFsZTsKKwlpbnQgaSA9IDA7CisKKwlvYmpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCW9iamRpcmxlbiA9IHN0cmxlbihvYmpkaXIpOworCisJcHJlcGFyZV9wYWNrZWRfZ2l0KCk7CisJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJLyogd2UgaWdub3JlIHRoaW5ncyBvbiBhbHRlcm5hdGUgcGF0aCBzaW5jZSB0aGV5IGFyZQorCQkgKiBub3QgYXZhaWxhYmxlIHRvIHRoZSBwdWxsZXJzIGluIGdlbmVyYWwuCisJCSAqLworCQlpZiAoIXAtPnBhY2tfbG9jYWwpCisJCQljb250aW51ZTsKKwkJaSsrOworCX0KKwludW1fcGFjayA9IGk7CisJaW5mbyA9IHhjYWxsb2MobnVtX3BhY2ssIHNpemVvZihzdHJ1Y3QgcGFja19pbmZvICopKTsKKwlmb3IgKGkgPSAwLCBwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKCFwLT5wYWNrX2xvY2FsKQorCQkJY29udGludWU7CisJCWluZm9baV0gPSB4Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGFja19pbmZvKSk7CisJCWluZm9baV0tPnAgPSBwOworCQlpbmZvW2ldLT5vbGRfbnVtID0gLTE7CisJCWkrKzsKKwl9CisKKwlpZiAoaW5mb2ZpbGUgJiYgIWZvcmNlKQorCQlzdGFsZSA9IHJlYWRfcGFja19pbmZvX2ZpbGUoaW5mb2ZpbGUpOworCWVsc2UKKwkJc3RhbGUgPSAxOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWNrOyBpKyspIHsKKwkJaWYgKHN0YWxlKSB7CisJCQlpbmZvW2ldLT5vbGRfbnVtID0gLTE7CisJCQlpbmZvW2ldLT5ucl9oZWFkcyA9IDA7CisJCX0KKwl9CisKKwkvKiByZW51bWJlciB0aGVtICovCisJcXNvcnQoaW5mbywgbnVtX3BhY2ssIHNpemVvZihpbmZvWzBdKSwgY29tcGFyZV9pbmZvKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhY2s7IGkrKykKKwkJaW5mb1tpXS0+bmV3X251bSA9IGk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3BhY2tfaW5mb19maWxlKEZJTEUgKmZwKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFjazsgaSsrKQorCQlmcHJpbnRmKGZwLCAiUCAlc1xuIiwgaW5mb1tpXS0+cC0+cGFja19uYW1lICsgb2JqZGlybGVuICsgNik7CisJZnB1dGMoJ1xuJywgZnApOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9pbmZvX3BhY2tzKGludCBmb3JjZSkKK3sKKwljaGFyIGluZm9maWxlW1BBVEhfTUFYXTsKKwljaGFyIG5hbWVbUEFUSF9NQVhdOworCWludCBuYW1lbGVuOworCUZJTEUgKmZwOworCisJbmFtZWxlbiA9IHNwcmludGYoaW5mb2ZpbGUsICIlcy9pbmZvL3BhY2tzIiwgZ2V0X29iamVjdF9kaXJlY3RvcnkoKSk7CisJc3RyY3B5KG5hbWUsIGluZm9maWxlKTsKKwlzdHJjcHkobmFtZSArIG5hbWVsZW4sICIrIik7CisKKwlpbml0X3BhY2tfaW5mbyhpbmZvZmlsZSwgZm9yY2UpOworCisJc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhuYW1lKTsKKwlmcCA9IGZvcGVuKG5hbWUsICJ3Iik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIGVycm9yKCJjYW5ub3Qgb3BlbiAlcyIsIG5hbWUpOworCXdyaXRlX3BhY2tfaW5mb19maWxlKGZwKTsKKwlmY2xvc2UoZnApOworCXJlbmFtZShuYW1lLCBpbmZvZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHB1YmxpYyAqLworaW50IHVwZGF0ZV9zZXJ2ZXJfaW5mbyhpbnQgZm9yY2UpCit7CisJLyogV2Ugd291bGQgYWRkIG1vcmUgZHVtYi1zZXJ2ZXIgc3VwcG9ydCBmaWxlcyBsYXRlciwKKwkgKiBpbmNsdWRpbmcgaW5kZXggb2YgYXZhaWxhYmxlIHBhY2sgZmlsZXMgYW5kIHRoZWlyCisJICogaW50ZW5kZWQgYXVkaWVuY2VzLgorCSAqLworCWludCBlcnJzID0gMDsKKworCWVycnMgPSBlcnJzIHwgdXBkYXRlX2luZm9fcmVmcyhmb3JjZSk7CisJZXJycyA9IGVycnMgfCB1cGRhdGVfaW5mb19wYWNrcyhmb3JjZSk7CisKKwkvKiByZW1vdmUgbGVmdG92ZXIgcmV2LWNhY2hlIGZpbGUgaWYgdGhlcmUgaXMgYW55ICovCisJdW5saW5rKGdpdF9wYXRoKCJpbmZvL3Jldi1jYWNoZSIpKTsKKworCXJldHVybiBlcnJzOworfQpkaWZmIC0tZ2l0IGEvc2V0dXAuYyBiL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmZGJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NldHVwLmMKQEAgLTAsMCArMSwyNjQgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitjb25zdCBjaGFyICpwcmVmaXhfcGF0aChjb25zdCBjaGFyICpwcmVmaXgsIGludCBsZW4sIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY29uc3QgY2hhciAqb3JpZyA9IHBhdGg7CisJZm9yICg7OykgeworCQljaGFyIGM7CisJCWlmICgqcGF0aCAhPSAnLicpCisJCQlicmVhazsKKwkJYyA9IHBhdGhbMV07CisJCS8qICIuIiAqLworCQlpZiAoIWMpIHsKKwkJCXBhdGgrKzsKKwkJCWJyZWFrOworCQl9CisJCS8qICIuLyIgKi8KKwkJaWYgKGMgPT0gJy8nKSB7CisJCQlwYXRoICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyAhPSAnLicpCisJCQlicmVhazsKKwkJYyA9IHBhdGhbMl07CisJCWlmICghYykKKwkJCXBhdGggKz0gMjsKKwkJZWxzZSBpZiAoYyA9PSAnLycpCisJCQlwYXRoICs9IDM7CisJCWVsc2UKKwkJCWJyZWFrOworCQkvKiAiLi4iIGFuZCAiLi4vIiAqLworCQkvKiBSZW1vdmUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHByZWZpeCAqLworCQlkbyB7CisJCQlpZiAoIWxlbikKKwkJCQlkaWUoIiclcycgaXMgb3V0c2lkZSByZXBvc2l0b3J5Iiwgb3JpZyk7CisJCQlsZW4tLTsKKwkJfSB3aGlsZSAobGVuICYmIHByZWZpeFtsZW4tMV0gIT0gJy8nKTsKKwkJY29udGludWU7CisJfQorCWlmIChsZW4pIHsKKwkJaW50IHNwZWNsZW4gPSBzdHJsZW4ocGF0aCk7CisJCWNoYXIgKm4gPSB4bWFsbG9jKHNwZWNsZW4gKyBsZW4gKyAxKTsKKwkKKwkJbWVtY3B5KG4sIHByZWZpeCwgbGVuKTsKKwkJbWVtY3B5KG4gKyBsZW4sIHBhdGgsIHNwZWNsZW4rMSk7CisJCXBhdGggPSBuOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworLyogCisgKiBVbmxpa2UgcHJlZml4X3BhdGgsIHRoaXMgc2hvdWxkIGJlIHVzZWQgaWYgdGhlIG5hbWVkIGZpbGUgZG9lcworICogbm90IGhhdmUgdG8gaW50ZXJhY3Qgd2l0aCBpbmRleCBlbnRyeTsgaS5lLiBuYW1lIG9mIGEgcmFuZG9tIGZpbGUKKyAqIG9uIHRoZSBmaWxlc3lzdGVtLgorICovCitjb25zdCBjaGFyICpwcmVmaXhfZmlsZW5hbWUoY29uc3QgY2hhciAqcGZ4LCBpbnQgcGZ4X2xlbiwgY29uc3QgY2hhciAqYXJnKQoreworCXN0YXRpYyBjaGFyIHBhdGhbUEFUSF9NQVhdOworCWlmICghcGZ4IHx8ICEqcGZ4IHx8IGFyZ1swXSA9PSAnLycpCisJCXJldHVybiBhcmc7CisJbWVtY3B5KHBhdGgsIHBmeCwgcGZ4X2xlbik7CisJc3RyY3B5KHBhdGggKyBwZnhfbGVuLCBhcmcpOworCXJldHVybiBwYXRoOworfQorCisvKgorICogVmVyaWZ5IGEgZmlsZW5hbWUgdGhhdCB3ZSBnb3QgYXMgYW4gYXJndW1lbnQgZm9yIGEgcGF0aHNwZWMKKyAqIGVudHJ5LiBOb3RlIHRoYXQgYSBmaWxlbmFtZSB0aGF0IGJlZ2lucyB3aXRoICItIiBuZXZlciB2ZXJpZmllcworICogYXMgdHJ1ZSwgYmVjYXVzZSBldmVuIGlmIHN1Y2ggYSBmaWxlbmFtZSB3ZXJlIHRvIGV4aXN0LCB3ZSB3YW50CisgKiBpdCB0byBiZSBwcmVjZWRlZCBieSB0aGUgIi0tIiBtYXJrZXIgKG9yIHdlIHdhbnQgdGhlIHVzZXIgdG8KKyAqIHVzZSBhIGZvcm1hdCBsaWtlICIuLy1maWxlbmFtZSIpCisgKi8KK3ZvaWQgdmVyaWZ5X2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqYXJnKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoKmFyZyA9PSAnLScpCisJCWRpZSgiYmFkIGZsYWcgJyVzJyB1c2VkIGFmdGVyIGZpbGVuYW1lIiwgYXJnKTsKKwluYW1lID0gcHJlZml4ID8gcHJlZml4X2ZpbGVuYW1lKHByZWZpeCwgc3RybGVuKHByZWZpeCksIGFyZykgOiBhcmc7CisJaWYgKCFsc3RhdChuYW1lLCAmc3QpKQorCQlyZXR1cm47CisJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJZGllKCJhbWJpZ3VvdXMgYXJndW1lbnQgJyVzJzogdW5rbm93biByZXZpc2lvbiBvciBwYXRoIG5vdCBpbiB0aGUgd29ya2luZyB0cmVlLlxuIgorCQkgICAgIlVzZSAnLS0nIHRvIHNlcGFyYXRlIHBhdGhzIGZyb20gcmV2aXNpb25zIiwgYXJnKTsKKwlkaWUoIiclcyc6ICVzIiwgYXJnLCBzdHJlcnJvcihlcnJubykpOworfQorCisvKgorICogT3Bwb3NpdGUgb2YgdGhlIGFib3ZlOiB0aGUgY29tbWFuZCBsaW5lIGRpZCBub3QgaGF2ZSAtLSBtYXJrZXIKKyAqIGFuZCB3ZSBwYXJzZWQgdGhlIGFyZyBhcyBhIHJlZm5hbWUuICBJdCBzaG91bGQgbm90IGJlIGludGVycHJldGFibGUKKyAqIGFzIGEgZmlsZW5hbWUuCisgKi8KK3ZvaWQgdmVyaWZ5X25vbl9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKCphcmcgPT0gJy0nKQorCQlyZXR1cm47IC8qIGZsYWcgKi8KKwluYW1lID0gcHJlZml4ID8gcHJlZml4X2ZpbGVuYW1lKHByZWZpeCwgc3RybGVuKHByZWZpeCksIGFyZykgOiBhcmc7CisJaWYgKCFsc3RhdChuYW1lLCAmc3QpKQorCQlkaWUoImFtYmlndW91cyBhcmd1bWVudCAnJXMnOiBib3RoIHJldmlzaW9uIGFuZCBmaWxlbmFtZVxuIgorCQkgICAgIlVzZSAnLS0nIHRvIHNlcGFyYXRlIGZpbGVuYW1lcyBmcm9tIHJldmlzaW9ucyIsIGFyZyk7CisJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJZGllKCInJXMnOiAlcyIsIGFyZywgc3RyZXJyb3IoZXJybm8pKTsKK30KKworY29uc3QgY2hhciAqKmdldF9wYXRoc3BlYyhjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKipwYXRoc3BlYykKK3sKKwljb25zdCBjaGFyICplbnRyeSA9ICpwYXRoc3BlYzsKKwljb25zdCBjaGFyICoqcDsKKwlpbnQgcHJlZml4bGVuOworCisJaWYgKCFwcmVmaXggJiYgIWVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZW50cnkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKnNwZWNbMl07CisJCXNwZWNbMF0gPSBwcmVmaXg7CisJCXNwZWNbMV0gPSBOVUxMOworCQlyZXR1cm4gc3BlYzsKKwl9CisKKwkvKiBPdGhlcndpc2Ugd2UgaGF2ZSB0byByZS13cml0ZSB0aGUgZW50cmllcy4uICovCisJcCA9IHBhdGhzcGVjOworCXByZWZpeGxlbiA9IHByZWZpeCA/IHN0cmxlbihwcmVmaXgpIDogMDsKKwlkbyB7CisJCSpwID0gcHJlZml4X3BhdGgocHJlZml4LCBwcmVmaXhsZW4sIGVudHJ5KTsKKwl9IHdoaWxlICgoZW50cnkgPSAqKytwKSAhPSBOVUxMKTsKKwlyZXR1cm4gKGNvbnN0IGNoYXIgKiopIHBhdGhzcGVjOworfQorCisvKgorICogVGVzdCBpZiBpdCBsb29rcyBsaWtlIHdlJ3JlIGF0IHRoZSB0b3AgbGV2ZWwgZ2l0IGRpcmVjdG9yeS4KKyAqIFdlIHdhbnQgdG8gc2VlOgorICoKKyAqICAtIGVpdGhlciBhIC5naXQvb2JqZWN0cy8gZGlyZWN0b3J5IF9vcl8gdGhlIHByb3BlcgorICogICAgR0lUX09CSkVDVF9ESVJFQ1RPUlkgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAqICAtIGEgcmVmcy8gZGlyZWN0b3J5IHVuZGVyICIuZ2l0IgorICogIC0gZWl0aGVyIGEgSEVBRCBzeW1saW5rIG9yIGEgSEVBRCBmaWxlIHRoYXQgaXMgZm9ybWF0dGVkIGFzCisgKiAgICBhIHByb3BlciAicmVmOiIuCisgKi8KK3N0YXRpYyBpbnQgaXNfdG9wbGV2ZWxfZGlyZWN0b3J5KHZvaWQpCit7CisJaWYgKGFjY2VzcygiLmdpdC9yZWZzLyIsIFhfT0spIHx8CisJICAgIGFjY2VzcyhnZXRlbnYoREJfRU5WSVJPTk1FTlQpID8KKwkJICAgZ2V0ZW52KERCX0VOVklST05NRU5UKSA6ICIuZ2l0L29iamVjdHMvIiwgWF9PSykgfHwKKwkgICAgdmFsaWRhdGVfc3ltcmVmKCIuZ2l0L0hFQUQiKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK2NvbnN0IGNoYXIgKnNldHVwX2dpdF9kaXJlY3RvcnlfZ2VudGx5KGludCAqbm9uZ2l0X29rKQoreworCXN0YXRpYyBjaGFyIGN3ZFtQQVRIX01BWCsxXTsKKwlpbnQgbGVuLCBvZmZzZXQ7CisKKwkvKgorCSAqIElmIEdJVF9ESVIgaXMgc2V0IGV4cGxpY2l0bHksIHdlJ3JlIG5vdCBnb2luZworCSAqIHRvIGRvIGFueSBkaXNjb3ZlcnksIGJ1dCB3ZSBzdGlsbCBkbyByZXBvc2l0b3J5CisJICogdmFsaWRhdGlvbi4KKwkgKi8KKwlpZiAoZ2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpKSB7CisJCWNoYXIgcGF0aFtQQVRIX01BWF07CisJCWludCBsZW4gPSBzdHJsZW4oZ2V0ZW52KEdJVF9ESVJfRU5WSVJPTk1FTlQpKTsKKwkJaWYgKHNpemVvZihwYXRoKSAtIDQwIDwgbGVuKQorCQkJZGllKCInJCVzJyB0b28gYmlnIiwgR0lUX0RJUl9FTlZJUk9OTUVOVCk7CisJCW1lbWNweShwYXRoLCBnZXRlbnYoR0lUX0RJUl9FTlZJUk9OTUVOVCksIGxlbik7CisJCQorCQlzdHJjcHkocGF0aCArIGxlbiwgIi9yZWZzIik7CisJCWlmIChhY2Nlc3MocGF0aCwgWF9PSykpCisJCQlnb3RvIGJhZF9kaXJfZW52aXJvbjsKKwkJc3RyY3B5KHBhdGggKyBsZW4sICIvSEVBRCIpOworCQlpZiAodmFsaWRhdGVfc3ltcmVmKHBhdGgpKQorCQkJZ290byBiYWRfZGlyX2Vudmlyb247CisJCWlmIChnZXRlbnYoREJfRU5WSVJPTk1FTlQpKSB7CisJCQlpZiAoYWNjZXNzKGdldGVudihEQl9FTlZJUk9OTUVOVCksIFhfT0spKQorCQkJCWdvdG8gYmFkX2Rpcl9lbnZpcm9uOworCQl9CisJCWVsc2UgeworCQkJc3RyY3B5KHBhdGggKyBsZW4sICIvb2JqZWN0cyIpOworCQkJaWYgKGFjY2VzcyhwYXRoLCBYX09LKSkKKwkJCQlnb3RvIGJhZF9kaXJfZW52aXJvbjsKKwkJfQorCQlyZXR1cm4gTlVMTDsKKwliYWRfZGlyX2Vudmlyb246CisJCWlmIChub25naXRfb2spIHsKKwkJCSpub25naXRfb2sgPSAxOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcGF0aFtsZW5dID0gMDsKKwkJZGllKCJOb3QgYSBnaXQgcmVwb3NpdG9yeTogJyVzJyIsIHBhdGgpOworCX0KKworCWlmICghZ2V0Y3dkKGN3ZCwgc2l6ZW9mKGN3ZCkpIHx8IGN3ZFswXSAhPSAnLycpCisJCWRpZSgiVW5hYmxlIHRvIHJlYWQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSIpOworCisJb2Zmc2V0ID0gbGVuID0gc3RybGVuKGN3ZCk7CisJZm9yICg7OykgeworCQlpZiAoaXNfdG9wbGV2ZWxfZGlyZWN0b3J5KCkpCisJCQlicmVhazsKKwkJY2hkaXIoIi4uIik7CisJCWRvIHsKKwkJCWlmICghb2Zmc2V0KSB7CisJCQkJaWYgKG5vbmdpdF9vaykgeworCQkJCQlpZiAoY2hkaXIoY3dkKSkKKwkJCQkJCWRpZSgiQ2Fubm90IGNvbWUgYmFjayB0byBjd2QiKTsKKwkJCQkJKm5vbmdpdF9vayA9IDE7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlkaWUoIk5vdCBhIGdpdCByZXBvc2l0b3J5Iik7CisJCQl9CisJCX0gd2hpbGUgKGN3ZFstLW9mZnNldF0gIT0gJy8nKTsKKwl9CisKKwlpZiAob2Zmc2V0ID09IGxlbikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBNYWtlICJvZmZzZXQiIHBvaW50IHRvIHBhc3QgdGhlICcvJywgYW5kIGFkZCBhICcvJyBhdCB0aGUgZW5kICovCisJb2Zmc2V0Kys7CisJY3dkW2xlbisrXSA9ICcvJzsKKwljd2RbbGVuXSA9IDA7CisJcmV0dXJuIGN3ZCArIG9mZnNldDsKK30KKworaW50IGdpdF9jb25maWdfcGVybShjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICh2YWx1ZSkgeworCQlpZiAoIXN0cmNtcCh2YWx1ZSwgInVtYXNrIikpCisJCQlyZXR1cm4gUEVSTV9VTUFTSzsKKwkJaWYgKCFzdHJjbXAodmFsdWUsICJncm91cCIpKQorCQkJcmV0dXJuIFBFUk1fR1JPVVA7CisJCWlmICghc3RyY21wKHZhbHVlLCAiYWxsIikgfHwKKwkJICAgICFzdHJjbXAodmFsdWUsICJ3b3JsZCIpIHx8CisJCSAgICAhc3RyY21wKHZhbHVlLCAiZXZlcnlib2R5IikpCisJCQlyZXR1cm4gUEVSTV9FVkVSWUJPRFk7CisJfQorCXJldHVybiBnaXRfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7Cit9CisKK2ludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgICAgaWYgKHN0cmNtcCh2YXIsICJjb3JlLnJlcG9zaXRvcnlmb3JtYXR2ZXJzaW9uIikgPT0gMCkKKyAgICAgICAgICAgICAgIHJlcG9zaXRvcnlfZm9ybWF0X3ZlcnNpb24gPSBnaXRfY29uZmlnX2ludCh2YXIsIHZhbHVlKTsKKwllbHNlIGlmIChzdHJjbXAodmFyLCAiY29yZS5zaGFyZWRyZXBvc2l0b3J5IikgPT0gMCkKKwkJc2hhcmVkX3JlcG9zaXRvcnkgPSBnaXRfY29uZmlnX3Blcm0odmFyLCB2YWx1ZSk7CisgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdCh2b2lkKQoreworCWdpdF9jb25maWcoY2hlY2tfcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbik7CisJaWYgKEdJVF9SRVBPX1ZFUlNJT04gPCByZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKQorCQlkaWUgKCJFeHBlY3RlZCBnaXQgcmVwbyB2ZXJzaW9uIDw9ICVkLCBmb3VuZCAlZCIsCisJCSAgICAgR0lUX1JFUE9fVkVSU0lPTiwgcmVwb3NpdG9yeV9mb3JtYXRfdmVyc2lvbik7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IGNoYXIgKnNldHVwX2dpdF9kaXJlY3Rvcnkodm9pZCkKK3sKKwljb25zdCBjaGFyICpyZXR2YWwgPSBzZXR1cF9naXRfZGlyZWN0b3J5X2dlbnRseShOVUxMKTsKKwljaGVja19yZXBvc2l0b3J5X2Zvcm1hdCgpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9zaGExX2ZpbGUuYyBiL3NoYTFfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYjk1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGExX2ZpbGUuYwpAQCAtMCwwICsxLDE4NzQgQEAKKy8qCisgKiBHSVQgLSBUaGUgaW5mb3JtYXRpb24gbWFuYWdlciBmcm9tIGhlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgKgorICogVGhpcyBoYW5kbGVzIGJhc2ljIGdpdCBzaGExIG9iamVjdCBmaWxlcyAtIHBhY2tpbmcsIHVucGFja2luZywKKyAqIGNyZWF0aW9uIGV0Yy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworI2lmbmRlZiBPX05PQVRJTUUKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19QUENfXykpCisjZGVmaW5lIE9fTk9BVElNRSAwMTAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgT19OT0FUSU1FIDAKKyNlbmRpZgorI2VuZGlmCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgbnVsbF9zaGExWzIwXSA9IHsgMCwgfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzaGExX2ZpbGVfb3Blbl9mbGFnID0gT19OT0FUSU1FOworCitzdGF0aWMgdW5zaWduZWQgaGV4dmFsKGNoYXIgYykKK3sKKwlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCXJldHVybiBjIC0gJzAnOworCWlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJcmV0dXJuIGMgLSAnYScgKyAxMDsKKwlpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCisJCXJldHVybiBjIC0gJ0EnICsgMTA7CisJcmV0dXJuIH4wOworfQorCitpbnQgZ2V0X3NoYTFfaGV4KGNvbnN0IGNoYXIgKmhleCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdmFsID0gKGhleHZhbChoZXhbMF0pIDw8IDQpIHwgaGV4dmFsKGhleFsxXSk7CisJCWlmICh2YWwgJiB+MHhmZikKKwkJCXJldHVybiAtMTsKKwkJKnNoYTErKyA9IHZhbDsKKwkJaGV4ICs9IDI7CisJfQorCXJldHVybiAwOworfQorCitpbnQgc2FmZV9jcmVhdGVfbGVhZGluZ19kaXJlY3RvcmllcyhjaGFyICpwYXRoKQoreworCWNoYXIgKnBvcyA9IHBhdGg7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoKnBvcyA9PSAnLycpCisJCXBvcysrOworCisJd2hpbGUgKHBvcykgeworCQlwb3MgPSBzdHJjaHIocG9zLCAnLycpOworCQlpZiAoIXBvcykKKwkJCWJyZWFrOworCQkqcG9zID0gMDsKKwkJaWYgKCFzdGF0KHBhdGgsICZzdCkpIHsKKwkJCS8qIHBhdGggZXhpc3RzICovCisJCQlpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCQkqcG9zID0gJy8nOworCQkJCXJldHVybiAtMzsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChta2RpcihwYXRoLCAwNzc3KSkgeworCQkJKnBvcyA9ICcvJzsKKwkJCXJldHVybiAtMTsKKwkJfQorCQllbHNlIGlmIChhZGp1c3Rfc2hhcmVkX3Blcm0ocGF0aCkpIHsKKwkJCSpwb3MgPSAnLyc7CisJCQlyZXR1cm4gLTI7CisJCX0KKwkJKnBvcysrID0gJy8nOworCX0KKwlyZXR1cm4gMDsKK30KKworY2hhciAqIHNoYTFfdG9faGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGludCBidWZubzsKKwlzdGF0aWMgY2hhciBoZXhidWZmZXJbNF1bNTBdOworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCWNoYXIgKmJ1ZmZlciA9IGhleGJ1ZmZlclszICYgKytidWZub10sICpidWYgPSBidWZmZXI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdmFsID0gKnNoYTErKzsKKwkJKmJ1ZisrID0gaGV4W3ZhbCA+PiA0XTsKKwkJKmJ1ZisrID0gaGV4W3ZhbCAmIDB4Zl07CisJfQorCSpidWYgPSAnXDAnOworCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgZmlsbF9zaGExX3BhdGgoY2hhciAqcGF0aGJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlzdGF0aWMgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwkJdW5zaWduZWQgaW50IHZhbCA9IHNoYTFbaV07CisJCWNoYXIgKnBvcyA9IHBhdGhidWYgKyBpKjIgKyAoaSA+IDApOworCQkqcG9zKysgPSBoZXhbdmFsID4+IDRdOworCQkqcG9zID0gaGV4W3ZhbCAmIDB4Zl07CisJfQorfQorCisvKgorICogTk9URSEgVGhpcyByZXR1cm5zIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgYnVmZmVyLCBzbyB5b3UgaGF2ZSB0byBiZQorICogY2FyZWZ1bCBhYm91dCB1c2luZyBpdC4gRG8gYSAic3RyZHVwKCkiIGlmIHlvdSBuZWVkIHRvIHNhdmUgdGhlCisgKiBmaWxlbmFtZS4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCB0aGlzIHJldHVybnMgdGhlIGxvY2F0aW9uIGZvciBjcmVhdGluZy4gIFJlYWRpbmcKKyAqIFNIQTEgZmlsZSBjYW4gaGFwcGVuIGZyb20gYW55IGFsdGVybmF0ZSBkaXJlY3RvcnkgbGlzdGVkIGluIHRoZQorICogREJfRU5WSVJPTk1FTlQgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgaXMgbm90IGZvdW5kIGluCisgKiB0aGUgcHJpbWFyeSBvYmplY3QgZGF0YWJhc2UuCisgKi8KK2NoYXIgKnNoYTFfZmlsZV9uYW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGNoYXIgKm5hbWUsICpiYXNlOworCisJaWYgKCFiYXNlKSB7CisJCWNvbnN0IGNoYXIgKnNoYTFfZmlsZV9kaXJlY3RvcnkgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCQlpbnQgbGVuID0gc3RybGVuKHNoYTFfZmlsZV9kaXJlY3RvcnkpOworCQliYXNlID0geG1hbGxvYyhsZW4gKyA2MCk7CisJCW1lbWNweShiYXNlLCBzaGExX2ZpbGVfZGlyZWN0b3J5LCBsZW4pOworCQltZW1zZXQoYmFzZStsZW4sIDAsIDYwKTsKKwkJYmFzZVtsZW5dID0gJy8nOworCQliYXNlW2xlbiszXSA9ICcvJzsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxOworCX0KKwlmaWxsX3NoYTFfcGF0aChuYW1lLCBzaGExKTsKKwlyZXR1cm4gYmFzZTsKK30KKworY2hhciAqc2hhMV9wYWNrX25hbWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKwlzdGF0aWMgY2hhciAqbmFtZSwgKmJhc2UsICpidWY7CisJaW50IGk7CisKKwlpZiAoIWJhc2UpIHsKKwkJY29uc3QgY2hhciAqc2hhMV9maWxlX2RpcmVjdG9yeSA9IGdldF9vYmplY3RfZGlyZWN0b3J5KCk7CisJCWludCBsZW4gPSBzdHJsZW4oc2hhMV9maWxlX2RpcmVjdG9yeSk7CisJCWJhc2UgPSB4bWFsbG9jKGxlbiArIDYwKTsKKwkJc3ByaW50ZihiYXNlLCAiJXMvcGFjay9wYWNrLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAucGFjayIsIHNoYTFfZmlsZV9kaXJlY3RvcnkpOworCQluYW1lID0gYmFzZSArIGxlbiArIDExOworCX0KKworCWJ1ZiA9IG5hbWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgdmFsID0gKnNoYTErKzsKKwkJKmJ1ZisrID0gaGV4W3ZhbCA+PiA0XTsKKwkJKmJ1ZisrID0gaGV4W3ZhbCAmIDB4Zl07CisJfQorCQorCXJldHVybiBiYXNlOworfQorCitjaGFyICpzaGExX3BhY2tfaW5kZXhfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCXN0YXRpYyBjaGFyICpuYW1lLCAqYmFzZSwgKmJ1ZjsKKwlpbnQgaTsKKworCWlmICghYmFzZSkgeworCQljb25zdCBjaGFyICpzaGExX2ZpbGVfZGlyZWN0b3J5ID0gZ2V0X29iamVjdF9kaXJlY3RvcnkoKTsKKwkJaW50IGxlbiA9IHN0cmxlbihzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJYmFzZSA9IHhtYWxsb2MobGVuICsgNjApOworCQlzcHJpbnRmKGJhc2UsICIlcy9wYWNrL3BhY2stMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MC5pZHgiLCBzaGExX2ZpbGVfZGlyZWN0b3J5KTsKKwkJbmFtZSA9IGJhc2UgKyBsZW4gKyAxMTsKKwl9CisKKwlidWYgPSBuYW1lOworCisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHZhbCA9ICpzaGExKys7CisJCSpidWYrKyA9IGhleFt2YWwgPj4gNF07CisJCSpidWYrKyA9IGhleFt2YWwgJiAweGZdOworCX0KKwkKKwlyZXR1cm4gYmFzZTsKK30KKworc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdF9vZGJfbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqKmFsdF9vZGJfdGFpbDsKKworc3RhdGljIHZvaWQgcmVhZF9pbmZvX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqIGFsdGVybmF0ZXMsIGludCBkZXB0aCk7CisKKy8qCisgKiBQcmVwYXJlIGFsdGVybmF0ZSBvYmplY3QgZGF0YWJhc2UgcmVnaXN0cnkuCisgKgorICogVGhlIHZhcmlhYmxlIGFsdF9vZGJfbGlzdCBwb2ludHMgYXQgdGhlIGxpc3Qgb2Ygc3RydWN0CisgKiBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlLiAgVGhlIGVsZW1lbnRzIG9uIHRoaXMgbGlzdCBjb21lIGZyb20KKyAqIG5vbi1lbXB0eSBlbGVtZW50cyBmcm9tIGNvbG9uIHNlcGFyYXRlZCBBTFRFUk5BVEVfREJfRU5WSVJPTk1FTlQKKyAqIGVudmlyb25tZW50IHZhcmlhYmxlLCBhbmQgJEdJVF9PQkpFQ1RfRElSRUNUT1JZL2luZm8vYWx0ZXJuYXRlcywKKyAqIHdob3NlIGNvbnRlbnRzIGlzIHNpbWlsYXIgdG8gdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSBidXQgY2FuIGJlCisgKiBMRiBzZXBhcmF0ZWQuICBJdHMgYmFzZSBwb2ludHMgYXQgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBidWZmZXIgdGhhdAorICogY29udGFpbnMgIi90aGUvZGlyZWN0b3J5L2NvcnJlc3BvbmRpbmcvdG8vLmdpdC9vYmplY3RzLy4uLiIsIHdoaWxlCisgKiBpdHMgbmFtZSBwb2ludHMganVzdCBhZnRlciB0aGUgc2xhc2ggYXQgdGhlIGVuZCBvZiAiLmdpdC9vYmplY3RzLyIKKyAqIGluIHRoZSBleGFtcGxlIGFib3ZlLCBhbmQgaGFzIGVub3VnaCBzcGFjZSB0byBob2xkIDQwLWJ5dGUgaGV4CisgKiBTSEExLCBhbiBleHRyYSBzbGFzaCBmb3IgdGhlIGZpcnN0IGxldmVsIGluZGlyZWN0aW9uLCBhbmQgdGhlCisgKiB0ZXJtaW5hdGluZyBOVUwuCisgKi8KK3N0YXRpYyBpbnQgbGlua19hbHRfb2RiX2VudHJ5KGNvbnN0IGNoYXIgKiBlbnRyeSwgaW50IGxlbiwgY29uc3QgY2hhciAqIHJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICpvYmpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCXN0cnVjdCBhbHRlcm5hdGVfb2JqZWN0X2RhdGFiYXNlICplbnQ7CisJc3RydWN0IGFsdGVybmF0ZV9vYmplY3RfZGF0YWJhc2UgKmFsdDsKKwkvKiA0MyA9IDQwLWJ5dGUgKyAyICcvJyArIHRlcm1pbmF0aW5nIE5VTCAqLworCWludCBwZnhsZW4gPSBsZW47CisJaW50IGVudGxlbiA9IHBmeGxlbiArIDQzOworCWludCBiYXNlX2xlbiA9IC0xOworCisJaWYgKCplbnRyeSAhPSAnLycgJiYgcmVsYXRpdmVfYmFzZSkgeworCQkvKiBSZWxhdGl2ZSBhbHQtb2RiICovCisJCWlmIChiYXNlX2xlbiA8IDApCisJCQliYXNlX2xlbiA9IHN0cmxlbihyZWxhdGl2ZV9iYXNlKSArIDE7CisJCWVudGxlbiArPSBiYXNlX2xlbjsKKwkJcGZ4bGVuICs9IGJhc2VfbGVuOworCX0KKwllbnQgPSB4bWFsbG9jKHNpemVvZigqZW50KSArIGVudGxlbik7CisKKwlpZiAoKmVudHJ5ICE9ICcvJyAmJiByZWxhdGl2ZV9iYXNlKSB7CisJCW1lbWNweShlbnQtPmJhc2UsIHJlbGF0aXZlX2Jhc2UsIGJhc2VfbGVuIC0gMSk7CisJCWVudC0+YmFzZVtiYXNlX2xlbiAtIDFdID0gJy8nOworCQltZW1jcHkoZW50LT5iYXNlICsgYmFzZV9sZW4sIGVudHJ5LCBsZW4pOworCX0KKwllbHNlCisJCW1lbWNweShlbnQtPmJhc2UsIGVudHJ5LCBwZnhsZW4pOworCisJZW50LT5uYW1lID0gZW50LT5iYXNlICsgcGZ4bGVuICsgMTsKKwllbnQtPmJhc2VbcGZ4bGVuICsgM10gPSAnLyc7CisJZW50LT5iYXNlW3BmeGxlbl0gPSBlbnQtPmJhc2VbZW50bGVuLTFdID0gMDsKKworCS8qIERldGVjdCBjYXNlcyB3aGVyZSBhbHRlcm5hdGUgZGlzYXBwZWFyZWQgKi8KKwlpZiAoc3RhdChlbnQtPmJhc2UsICZzdCkgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJZXJyb3IoIm9iamVjdCBkaXJlY3RvcnkgJXMgZG9lcyBub3QgZXhpc3Q7ICIKKwkJICAgICAgImNoZWNrIC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMuIiwKKwkJICAgICAgZW50LT5iYXNlKTsKKwkJZnJlZShlbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogUHJldmVudCB0aGUgY29tbW9uIG1pc3Rha2Ugb2YgbGlzdGluZyB0aGUgc2FtZQorCSAqIHRoaW5nIHR3aWNlLCBvciBvYmplY3QgZGlyZWN0b3J5IGl0c2VsZi4KKwkgKi8KKwlmb3IgKGFsdCA9IGFsdF9vZGJfbGlzdDsgYWx0OyBhbHQgPSBhbHQtPm5leHQpIHsKKwkJaWYgKCFtZW1jbXAoZW50LT5iYXNlLCBhbHQtPmJhc2UsIHBmeGxlbikpIHsKKwkJCWZyZWUoZW50KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlpZiAoIW1lbWNtcChlbnQtPmJhc2UsIG9iamRpciwgcGZ4bGVuKSkgeworCQlmcmVlKGVudCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhZGQgdGhlIGFsdGVybmF0ZSBlbnRyeSAqLworCSphbHRfb2RiX3RhaWwgPSBlbnQ7CisJYWx0X29kYl90YWlsID0gJihlbnQtPm5leHQpOworCWVudC0+bmV4dCA9IE5VTEw7CisKKwkvKiByZWN1cnNpdmVseSBhZGQgYWx0ZXJuYXRlcyAqLworCXJlYWRfaW5mb19hbHRlcm5hdGVzKGVudC0+YmFzZSwgZGVwdGggKyAxKTsKKworCWVudC0+YmFzZVtwZnhsZW5dID0gJy8nOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpbmtfYWx0X29kYl9lbnRyaWVzKGNvbnN0IGNoYXIgKmFsdCwgY29uc3QgY2hhciAqZXAsIGludCBzZXAsCisJCQkJIGNvbnN0IGNoYXIgKnJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwljb25zdCBjaGFyICpjcCwgKmxhc3Q7CisKKwlpZiAoZGVwdGggPiA1KSB7CisJCWVycm9yKCIlczogaWdub3JpbmcgYWx0ZXJuYXRlIG9iamVjdCBzdG9yZXMsIG5lc3RpbmcgdG9vIGRlZXAuIiwKKwkJCQlyZWxhdGl2ZV9iYXNlKTsKKwkJcmV0dXJuOworCX0KKworCWxhc3QgPSBhbHQ7CisJd2hpbGUgKGxhc3QgPCBlcCkgeworCQljcCA9IGxhc3Q7CisJCWlmIChjcCA8IGVwICYmICpjcCA9PSAnIycpIHsKKwkJCXdoaWxlIChjcCA8IGVwICYmICpjcCAhPSBzZXApCisJCQkJY3ArKzsKKwkJCWxhc3QgPSBjcCArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgIT0gc2VwKQorCQkJY3ArKzsKKwkJaWYgKGxhc3QgIT0gY3ApIHsKKwkJCWlmICgoKmxhc3QgIT0gJy8nKSAmJiBkZXB0aCkgeworCQkJCWVycm9yKCIlczogaWdub3JpbmcgcmVsYXRpdmUgYWx0ZXJuYXRlIG9iamVjdCBzdG9yZSAlcyIsCisJCQkJCQlyZWxhdGl2ZV9iYXNlLCBsYXN0KTsKKwkJCX0gZWxzZSB7CisJCQkJbGlua19hbHRfb2RiX2VudHJ5KGxhc3QsIGNwIC0gbGFzdCwKKwkJCQkJCXJlbGF0aXZlX2Jhc2UsIGRlcHRoKTsKKwkJCX0KKwkJfQorCQl3aGlsZSAoY3AgPCBlcCAmJiAqY3AgPT0gc2VwKQorCQkJY3ArKzsKKwkJbGFzdCA9IGNwOworCX0KK30KKworc3RhdGljIHZvaWQgcmVhZF9pbmZvX2FsdGVybmF0ZXMoY29uc3QgY2hhciAqIHJlbGF0aXZlX2Jhc2UsIGludCBkZXB0aCkKK3sKKwljaGFyICptYXA7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlpbnQgZmQ7CisKKwlzcHJpbnRmKHBhdGgsICIlcy9pbmZvL2FsdGVybmF0ZXMiLCByZWxhdGl2ZV9iYXNlKTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybjsKKwlpZiAoZnN0YXQoZmQsICZzdCkgfHwgKHN0LnN0X3NpemUgPT0gMCkpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCW1hcCA9IG1tYXAoTlVMTCwgc3Quc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJCXJldHVybjsKKworCWxpbmtfYWx0X29kYl9lbnRyaWVzKG1hcCwgbWFwICsgc3Quc3Rfc2l6ZSwgJ1xuJywgcmVsYXRpdmVfYmFzZSwgZGVwdGgpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7Cit9CisKK3ZvaWQgcHJlcGFyZV9hbHRfb2RiKHZvaWQpCit7CisJY29uc3QgY2hhciAqYWx0OworCisJYWx0ID0gZ2V0ZW52KEFMVEVSTkFURV9EQl9FTlZJUk9OTUVOVCk7CisJaWYgKCFhbHQpIGFsdCA9ICIiOworCisJaWYgKGFsdF9vZGJfdGFpbCkKKwkJcmV0dXJuOworCWFsdF9vZGJfdGFpbCA9ICZhbHRfb2RiX2xpc3Q7CisJbGlua19hbHRfb2RiX2VudHJpZXMoYWx0LCBhbHQgKyBzdHJsZW4oYWx0KSwgJzonLCBOVUxMLCAwKTsKKworCXJlYWRfaW5mb19hbHRlcm5hdGVzKGdldF9vYmplY3RfZGlyZWN0b3J5KCksIDApOworfQorCitzdGF0aWMgY2hhciAqZmluZF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgc3RydWN0IHN0YXQgKnN0KQoreworCWNoYXIgKm5hbWUgPSBzaGExX2ZpbGVfbmFtZShzaGExKTsKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCisJaWYgKCFzdGF0KG5hbWUsIHN0KSkKKwkJcmV0dXJuIG5hbWU7CisJcHJlcGFyZV9hbHRfb2RiKCk7CisJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCW5hbWUgPSBhbHQtPm5hbWU7CisJCWZpbGxfc2hhMV9wYXRoKG5hbWUsIHNoYTEpOworCQlpZiAoIXN0YXQoYWx0LT5iYXNlLCBzdCkpCisJCQlyZXR1cm4gYWx0LT5iYXNlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBQQUNLX01BWF9TWiAoMTw8MjYpCitzdGF0aWMgaW50IHBhY2tfdXNlZF9jdHI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYWNrX21hcHBlZDsKK3N0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrZWRfZ2l0OworCitzdGF0aWMgaW50IGNoZWNrX3BhY2tlZF9naXRfaWR4KGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGxvbmcgKmlkeF9zaXplXywKKwkJCQl2b2lkICoqaWR4X21hcF8pCit7CisJdm9pZCAqaWR4X21hcDsKKwl1bnNpZ25lZCBpbnQgKmluZGV4OworCXVuc2lnbmVkIGxvbmcgaWR4X3NpemU7CisJaW50IG5yLCBpOworCWludCBmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCXN0cnVjdCBzdGF0IHN0OworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoZnN0YXQoZmQsICZzdCkpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCWlkeF9zaXplID0gc3Quc3Rfc2l6ZTsKKwlpZHhfbWFwID0gbW1hcChOVUxMLCBpZHhfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKwlpZiAoaWR4X21hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm4gLTE7CisKKwlpbmRleCA9IGlkeF9tYXA7CisJKmlkeF9tYXBfID0gaWR4X21hcDsKKwkqaWR4X3NpemVfID0gaWR4X3NpemU7CisKKwkvKiBjaGVjayBpbmRleCBtYXAgKi8KKwlpZiAoaWR4X3NpemUgPCA0KjI1NiArIDIwICsgMjApCisJCXJldHVybiBlcnJvcigiaW5kZXggZmlsZSB0b28gc21hbGwiKTsKKwluciA9IDA7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBuID0gbnRvaGwoaW5kZXhbaV0pOworCQlpZiAobiA8IG5yKQorCQkJcmV0dXJuIGVycm9yKCJub24tbW9ub3RvbmljIGluZGV4Iik7CisJCW5yID0gbjsKKwl9CisKKwkvKgorCSAqIFRvdGFsIHNpemU6CisJICogIC0gMjU2IGluZGV4IGVudHJpZXMgNCBieXRlcyBlYWNoCisJICogIC0gMjQtYnl0ZSBlbnRyaWVzICogbnIgKDIwLWJ5dGUgc2hhMSArIDQtYnl0ZSBvZmZzZXQpCisJICogIC0gMjAtYnl0ZSBTSEExIG9mIHRoZSBwYWNrZmlsZQorCSAqICAtIDIwLWJ5dGUgU0hBMSBmaWxlIGNoZWNrc3VtCisJICovCisJaWYgKGlkeF9zaXplICE9IDQqMjU2ICsgbnIgKiAyNCArIDIwICsgMjApCisJCXJldHVybiBlcnJvcigid3JvbmcgaW5kZXggZmlsZSBzaXplIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1bnVzZV9vbmVfcGFja2VkX2dpdCh2b2lkKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwLCAqbHJ1ID0gTlVMTDsKKworCWZvciAocCA9IHBhY2tlZF9naXQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChwLT5wYWNrX3VzZV9jbnQgfHwgIXAtPnBhY2tfYmFzZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWxydSB8fCBwLT5wYWNrX2xhc3RfdXNlZCA8IGxydS0+cGFja19sYXN0X3VzZWQpCisJCQlscnUgPSBwOworCX0KKwlpZiAoIWxydSkKKwkJcmV0dXJuIDA7CisJbXVubWFwKGxydS0+cGFja19iYXNlLCBscnUtPnBhY2tfc2l6ZSk7CisJbHJ1LT5wYWNrX2Jhc2UgPSBOVUxMOworCXJldHVybiAxOworfQorCit2b2lkIHVudXNlX3BhY2tlZF9naXQoc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJcC0+cGFja191c2VfY250LS07Cit9CisKK2ludCB1c2VfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlpZiAoIXAtPnBhY2tfc2l6ZSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJLyogV2UgY3JlYXRlZCB0aGUgc3RydWN0IGJlZm9yZSB3ZSBoYWQgdGhlIHBhY2sgKi8KKwkJc3RhdChwLT5wYWNrX25hbWUsICZzdCk7CisJCWlmICghU19JU1JFRyhzdC5zdF9tb2RlKSkKKwkJCWRpZSgicGFja2ZpbGUgJXMgbm90IGEgcmVndWxhciBmaWxlIiwgcC0+cGFja19uYW1lKTsKKwkJcC0+cGFja19zaXplID0gc3Quc3Rfc2l6ZTsKKwl9CisJaWYgKCFwLT5wYWNrX2Jhc2UpIHsKKwkJaW50IGZkOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJdm9pZCAqbWFwOworCisJCXBhY2tfbWFwcGVkICs9IHAtPnBhY2tfc2l6ZTsKKwkJd2hpbGUgKFBBQ0tfTUFYX1NaIDwgcGFja19tYXBwZWQgJiYgdW51c2Vfb25lX3BhY2tlZF9naXQoKSkKKwkJCTsgLyogbm90aGluZyAqLworCQlmZCA9IG9wZW4ocC0+cGFja19uYW1lLCBPX1JET05MWSk7CisJCWlmIChmZCA8IDApCisJCQlkaWUoInBhY2tmaWxlICVzIGNhbm5vdCBiZSBvcGVuZWQiLCBwLT5wYWNrX25hbWUpOworCQlpZiAoZnN0YXQoZmQsICZzdCkpIHsKKwkJCWNsb3NlKGZkKTsKKwkJCWRpZSgicGFja2ZpbGUgJXMgY2Fubm90IGJlIG9wZW5lZCIsIHAtPnBhY2tfbmFtZSk7CisJCX0KKwkJaWYgKHN0LnN0X3NpemUgIT0gcC0+cGFja19zaXplKQorCQkJZGllKCJwYWNrZmlsZSAlcyBzaXplIG1pc21hdGNoLiIsIHAtPnBhY2tfbmFtZSk7CisJCW1hcCA9IG1tYXAoTlVMTCwgcC0+cGFja19zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQkJZGllKCJwYWNrZmlsZSAlcyBjYW5ub3QgYmUgbWFwcGVkLiIsIHAtPnBhY2tfbmFtZSk7CisJCXAtPnBhY2tfYmFzZSA9IG1hcDsKKworCQkvKiBDaGVjayBpZiB0aGUgcGFjayBmaWxlIG1hdGNoZXMgd2l0aCB0aGUgaW5kZXggZmlsZS4KKwkJICogdGhpcyBpcyBjaGVhcC4KKwkJICovCisJCWlmIChtZW1jbXAoKGNoYXIqKShwLT5pbmRleF9iYXNlKSArIHAtPmluZGV4X3NpemUgLSA0MCwKKwkJCSAgIChjaGFyICopIHAtPnBhY2tfYmFzZSArIHAtPnBhY2tfc2l6ZSAtIDIwLAorCQkJICAgMjApKSB7CisKKwkJCWRpZSgicGFja2ZpbGUgJXMgZG9lcyBub3QgbWF0Y2ggaW5kZXguIiwgcC0+cGFja19uYW1lKTsKKwkJfQorCX0KKwlwLT5wYWNrX2xhc3RfdXNlZCA9IHBhY2tfdXNlZF9jdHIrKzsKKwlwLT5wYWNrX3VzZV9jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBhY2tlZF9naXQgKmFkZF9wYWNrZWRfZ2l0KGNoYXIgKnBhdGgsIGludCBwYXRoX2xlbiwgaW50IGxvY2FsKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGxvbmcgaWR4X3NpemU7CisJdm9pZCAqaWR4X21hcDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCisJaWYgKGNoZWNrX3BhY2tlZF9naXRfaWR4KHBhdGgsICZpZHhfc2l6ZSwgJmlkeF9tYXApKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGRvIHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nIC5wYWNrIGZpbGU/ICovCisJc3RyY3B5KHBhdGggKyBwYXRoX2xlbiAtIDQsICIucGFjayIpOworCWlmIChzdGF0KHBhdGgsICZzdCkgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJbXVubWFwKGlkeF9tYXAsIGlkeF9zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIG9rLCBpdCBsb29rcyBzYW5lIGFzIGZhciBhcyB3ZSBjYW4gY2hlY2sgd2l0aG91dAorCSAqIGFjdHVhbGx5IG1hcHBpbmcgdGhlIHBhY2sgZmlsZS4KKwkgKi8KKwlwID0geG1hbGxvYyhzaXplb2YoKnApICsgcGF0aF9sZW4gKyAyKTsKKwlzdHJjcHkocC0+cGFja19uYW1lLCBwYXRoKTsKKwlwLT5pbmRleF9zaXplID0gaWR4X3NpemU7CisJcC0+cGFja19zaXplID0gc3Quc3Rfc2l6ZTsKKwlwLT5pbmRleF9iYXNlID0gaWR4X21hcDsKKwlwLT5uZXh0ID0gTlVMTDsKKwlwLT5wYWNrX2Jhc2UgPSBOVUxMOworCXAtPnBhY2tfbGFzdF91c2VkID0gMDsKKwlwLT5wYWNrX3VzZV9jbnQgPSAwOworCXAtPnBhY2tfbG9jYWwgPSBsb2NhbDsKKwlpZiAoKHBhdGhfbGVuID4gNDQpICYmICFnZXRfc2hhMV9oZXgocGF0aCArIHBhdGhfbGVuIC0gNDQsIHNoYTEpKQorCQltZW1jcHkocC0+c2hhMSwgc2hhMSwgMjApOworCXJldHVybiBwOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgKnBhdGggPSBzaGExX3BhY2tfaW5kZXhfbmFtZShzaGExKTsKKwlyZXR1cm4gcGFyc2VfcGFja19pbmRleF9maWxlKHNoYTEsIHBhdGgpOworfQorCitzdHJ1Y3QgcGFja2VkX2dpdCAqcGFyc2VfcGFja19pbmRleF9maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKmlkeF9wYXRoKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXVuc2lnbmVkIGxvbmcgaWR4X3NpemU7CisJdm9pZCAqaWR4X21hcDsKKwljaGFyICpwYXRoOworCisJaWYgKGNoZWNrX3BhY2tlZF9naXRfaWR4KGlkeF9wYXRoLCAmaWR4X3NpemUsICZpZHhfbWFwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYXRoID0gc2hhMV9wYWNrX25hbWUoc2hhMSk7CisKKwlwID0geG1hbGxvYyhzaXplb2YoKnApICsgc3RybGVuKHBhdGgpICsgMik7CisJc3RyY3B5KHAtPnBhY2tfbmFtZSwgcGF0aCk7CisJcC0+aW5kZXhfc2l6ZSA9IGlkeF9zaXplOworCXAtPnBhY2tfc2l6ZSA9IDA7CisJcC0+aW5kZXhfYmFzZSA9IGlkeF9tYXA7CisJcC0+bmV4dCA9IE5VTEw7CisJcC0+cGFja19iYXNlID0gTlVMTDsKKwlwLT5wYWNrX2xhc3RfdXNlZCA9IDA7CisJcC0+cGFja191c2VfY250ID0gMDsKKwltZW1jcHkocC0+c2hhMSwgc2hhMSwgMjApOworCXJldHVybiBwOworfQorCit2b2lkIGluc3RhbGxfcGFja2VkX2dpdChzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjaykKK3sKKwlwYWNrLT5uZXh0ID0gcGFja2VkX2dpdDsKKwlwYWNrZWRfZ2l0ID0gcGFjazsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9wYWNrZWRfZ2l0X29uZShjaGFyICpvYmpkaXIsIGludCBsb2NhbCkKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWludCBsZW47CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwlzcHJpbnRmKHBhdGgsICIlcy9wYWNrIiwgb2JqZGlyKTsKKwlsZW4gPSBzdHJsZW4ocGF0aCk7CisJZGlyID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoIWRpcikgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJZXJyb3IoInVuYWJsZSB0byBvcGVuIG9iamVjdCBwYWNrIGRpcmVjdG9yeTogJXM6ICVzIiwKKwkJCSAgICAgIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybjsKKwl9CisJcGF0aFtsZW4rK10gPSAnLyc7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQlpbnQgbmFtZWxlbiA9IHN0cmxlbihkZS0+ZF9uYW1lKTsKKwkJc3RydWN0IHBhY2tlZF9naXQgKnA7CisKKwkJaWYgKCFoYXNfZXh0ZW5zaW9uKGRlLT5kX25hbWUsICIuaWR4IikpCisJCQljb250aW51ZTsKKworCQkvKiB3ZSBoYXZlIC5pZHguICBJcyBpdCBhIGZpbGUgd2UgY2FuIG1hcD8gKi8KKwkJc3RyY3B5KHBhdGggKyBsZW4sIGRlLT5kX25hbWUpOworCQlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJaWYgKCFtZW1jbXAocGF0aCwgcC0+cGFja19uYW1lLCBsZW4gKyBuYW1lbGVuIC0gNCkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHApCisJCQljb250aW51ZTsKKwkJcCA9IGFkZF9wYWNrZWRfZ2l0KHBhdGgsIGxlbiArIG5hbWVsZW4sIGxvY2FsKTsKKwkJaWYgKCFwKQorCQkJY29udGludWU7CisJCXAtPm5leHQgPSBwYWNrZWRfZ2l0OworCQlwYWNrZWRfZ2l0ID0gcDsKKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworc3RhdGljIGludCBwcmVwYXJlX3BhY2tlZF9naXRfcnVuX29uY2UgPSAwOwordm9pZCBwcmVwYXJlX3BhY2tlZF9naXQodm9pZCkKK3sKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCisJaWYgKHByZXBhcmVfcGFja2VkX2dpdF9ydW5fb25jZSkKKwkJcmV0dXJuOworCXByZXBhcmVfcGFja2VkX2dpdF9vbmUoZ2V0X29iamVjdF9kaXJlY3RvcnkoKSwgMSk7CisJcHJlcGFyZV9hbHRfb2RiKCk7CisJZm9yIChhbHQgPSBhbHRfb2RiX2xpc3Q7IGFsdDsgYWx0ID0gYWx0LT5uZXh0KSB7CisJCWFsdC0+bmFtZVstMV0gPSAwOworCQlwcmVwYXJlX3BhY2tlZF9naXRfb25lKGFsdC0+YmFzZSwgMCk7CisJCWFsdC0+bmFtZVstMV0gPSAnLyc7CisJfQorCXByZXBhcmVfcGFja2VkX2dpdF9ydW5fb25jZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHJlcHJlcGFyZV9wYWNrZWRfZ2l0KHZvaWQpCit7CisJcHJlcGFyZV9wYWNrZWRfZ2l0X3J1bl9vbmNlID0gMDsKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKK30KKworaW50IGNoZWNrX3NoYTFfc2lnbmF0dXJlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHZvaWQgKm1hcCwgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICp0eXBlKQoreworCWNoYXIgaGVhZGVyWzEwMF07CisJdW5zaWduZWQgY2hhciByZWFsX3NoYTFbMjBdOworCVNIQV9DVFggYzsKKworCVNIQTFfSW5pdCgmYyk7CisJU0hBMV9VcGRhdGUoJmMsIGhlYWRlciwgMStzcHJpbnRmKGhlYWRlciwgIiVzICVsdSIsIHR5cGUsIHNpemUpKTsKKwlTSEExX1VwZGF0ZSgmYywgbWFwLCBzaXplKTsKKwlTSEExX0ZpbmFsKHJlYWxfc2hhMSwgJmMpOworCXJldHVybiBtZW1jbXAoc2hhMSwgcmVhbF9zaGExLCAyMCkgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkICptYXBfc2hhMV9maWxlX2ludGVybmFsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqbWFwOworCWludCBmZDsKKwljaGFyICpmaWxlbmFtZSA9IGZpbmRfc2hhMV9maWxlKHNoYTEsICZzdCk7CisKKwlpZiAoIWZpbGVuYW1lKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBzaGExX2ZpbGVfb3Blbl9mbGFnKTsKKwlpZiAoZmQgPCAwKSB7CisJCS8qIFNlZSBpZiBpdCB3b3JrcyB3aXRob3V0IE9fTk9BVElNRSAqLworCQlzd2l0Y2ggKHNoYTFfZmlsZV9vcGVuX2ZsYWcpIHsKKwkJZGVmYXVsdDoKKwkJCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCQkJaWYgKGZkID49IDApCisJCQkJYnJlYWs7CisJCS8qIEZhbGx0aHJvdWdoICovCisJCWNhc2UgMDoKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogSWYgaXQgZmFpbGVkIG9uY2UsIGl0IHdpbGwgcHJvYmFibHkgZmFpbCBhZ2Fpbi4KKwkJICogU3RvcCB1c2luZyBPX05PQVRJTUUKKwkJICovCisJCXNoYTFfZmlsZV9vcGVuX2ZsYWcgPSAwOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQorCQlyZXR1cm4gTlVMTDsKKwkqc2l6ZSA9IHN0LnN0X3NpemU7CisJcmV0dXJuIG1hcDsKK30KKworc3RhdGljIGludCB1bnBhY2tfc2hhMV9oZWFkZXIoel9zdHJlYW0gKnN0cmVhbSwgdW5zaWduZWQgY2hhciAqbWFwLCB1bnNpZ25lZCBsb25nIG1hcHNpemUsIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZzaXopCit7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGludCB3b3JkLCBiaXRzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlzdGF0aWMgY29uc3QgY2hhciAqdHlwZW5hbWVbOF0gPSB7CisJCU5VTEwsCS8qIE9CSl9FWFQgKi8KKwkJImNvbW1pdCIsICJ0cmVlIiwgImJsb2IiLCAidGFnIiwKKwkJTlVMTCwgTlVMTCwgTlVMTAorCX07CisJY29uc3QgY2hhciAqdHlwZTsKKworCS8qIEdldCB0aGUgZGF0YSBzdHJlYW0gKi8KKwltZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoKnN0cmVhbSkpOworCXN0cmVhbS0+bmV4dF9pbiA9IG1hcDsKKwlzdHJlYW0tPmF2YWlsX2luID0gbWFwc2l6ZTsKKwlzdHJlYW0tPm5leHRfb3V0ID0gYnVmZmVyOworCXN0cmVhbS0+YXZhaWxfb3V0ID0gYnVmc2l6OworCisJLyoKKwkgKiBJcyBpdCBhIHpsaWItY29tcHJlc3NlZCBidWZmZXI/IElmIHNvLCB0aGUgZmlyc3QgYnl0ZQorCSAqIG11c3QgYmUgMHg3OCAoMTUtYml0IHdpbmRvdyBzaXplLCBkZWZsYXRlZCksIGFuZCB0aGUKKwkgKiBmaXJzdCAxNi1iaXQgd29yZCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IDMxCisJICovCisJd29yZCA9IChtYXBbMF0gPDwgOCkgKyBtYXBbMV07CisJaWYgKG1hcFswXSA9PSAweDc4ICYmICEod29yZCAlIDMxKSkgeworCQlpbmZsYXRlSW5pdChzdHJlYW0pOworCQlyZXR1cm4gaW5mbGF0ZShzdHJlYW0sIDApOworCX0KKworCWMgPSAqbWFwKys7CisJbWFwc2l6ZS0tOworCXR5cGUgPSB0eXBlbmFtZVsoYyA+PiA0KSAmIDddOworCWlmICghdHlwZSkKKwkJcmV0dXJuIC0xOworCisJYml0cyA9IDQ7CisJc2l6ZSA9IGMgJiAweGY7CisJd2hpbGUgKChjICYgMHg4MCkpIHsKKwkJaWYgKGJpdHMgPj0gOCpzaXplb2YobG9uZykpCisJCQlyZXR1cm4gLTE7CisJCWMgPSAqbWFwKys7CisJCXNpemUgKz0gKGMgJiAweDdmKSA8PCBiaXRzOworCQliaXRzICs9IDc7CisJCW1hcHNpemUtLTsKKwl9CisKKwkvKiBTZXQgdXAgdGhlIHN0cmVhbSBmb3IgdGhlIHJlc3QuLiAqLworCXN0cmVhbS0+bmV4dF9pbiA9IG1hcDsKKwlzdHJlYW0tPmF2YWlsX2luID0gbWFwc2l6ZTsKKwlpbmZsYXRlSW5pdChzdHJlYW0pOworCisJLyogQW5kIGdlbmVyYXRlIHRoZSBmYWtlIHRyYWRpdGlvbmFsIGhlYWRlciAqLworCXN0cmVhbS0+dG90YWxfb3V0ID0gMSArIHNucHJpbnRmKGJ1ZmZlciwgYnVmc2l6LCAiJXMgJWx1IiwgdHlwZSwgc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfc2hhMV9yZXN0KHpfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBieXRlcyA9IHN0cmxlbihidWZmZXIpICsgMTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSB4bWFsbG9jKDErc2l6ZSk7CisJdW5zaWduZWQgbG9uZyBuOworCisJbiA9IHN0cmVhbS0+dG90YWxfb3V0IC0gYnl0ZXM7CisJaWYgKG4gPiBzaXplKQorCQluID0gc2l6ZTsKKwltZW1jcHkoYnVmLCAoY2hhciAqKSBidWZmZXIgKyBieXRlcywgbik7CisJYnl0ZXMgPSBuOworCWlmIChieXRlcyA8IHNpemUpIHsKKwkJc3RyZWFtLT5uZXh0X291dCA9IGJ1ZiArIGJ5dGVzOworCQlzdHJlYW0tPmF2YWlsX291dCA9IHNpemUgLSBieXRlczsKKwkJd2hpbGUgKGluZmxhdGUoc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJCS8qIG5vdGhpbmcgKi87CisJfQorCWJ1ZltzaXplXSA9IDA7CisJaW5mbGF0ZUVuZChzdHJlYW0pOworCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBXZSB1c2VkIHRvIGp1c3QgdXNlICJzc2NhbmYoKSIsIGJ1dCB0aGF0J3MgYWN0dWFsbHkgd2F5CisgKiB0b28gcGVybWlzc2l2ZSBmb3Igd2hhdCB3ZSB3YW50IHRvIGNoZWNrLiBTbyBkbyBhbiBhbmFsCisgKiBvYmplY3QgaGVhZGVyIHBhcnNlIGJ5IGhhbmQuCisgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfc2hhMV9oZWFkZXIoY2hhciAqaGRyLCBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkvKgorCSAqIFRoZSB0eXBlIGNhbiBiZSBhdCBtb3N0IHRlbiBieXRlcyAoaW5jbHVkaW5nIHRoZSAKKwkgKiB0ZXJtaW5hdGluZyAnXDAnIHRoYXQgd2UgYWRkKSwgYW5kIGlzIGZvbGxvd2VkIGJ5CisJICogYSBzcGFjZS4gCisJICovCisJaSA9IDEwOworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKmhkcisrOworCQlpZiAoYyA9PSAnICcpCisJCQlicmVhazsKKwkJaWYgKCEtLWkpCisJCQlyZXR1cm4gLTE7CisJCSp0eXBlKysgPSBjOworCX0KKwkqdHlwZSA9IDA7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBmb2xsb3cgaW1tZWRpYXRlbHksIGFuZCBiZSBpbiBjYW5vbmljYWwKKwkgKiBkZWNpbWFsIGZvcm1hdCAoaWUgIjAxMCIgaXMgbm90IHZhbGlkKS4KKwkgKi8KKwlzaXplID0gKmhkcisrIC0gJzAnOworCWlmIChzaXplID4gOSkKKwkJcmV0dXJuIC0xOworCWlmIChzaXplKSB7CisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYyA9ICpoZHIgLSAnMCc7CisJCQlpZiAoYyA+IDkpCisJCQkJYnJlYWs7CisJCQloZHIrKzsKKwkJCXNpemUgPSBzaXplICogMTAgKyBjOworCQl9CisJfQorCSpzaXplcCA9IHNpemU7CisKKwkvKgorCSAqIFRoZSBsZW5ndGggbXVzdCBiZSBmb2xsb3dlZCBieSBhIHplcm8gYnl0ZQorCSAqLworCXJldHVybiAqaGRyID8gLTEgOiAwOworfQorCit2b2lkICogdW5wYWNrX3NoYTFfZmlsZSh2b2lkICptYXAsIHVuc2lnbmVkIGxvbmcgbWFwc2l6ZSwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwlpbnQgcmV0OworCXpfc3RyZWFtIHN0cmVhbTsKKwljaGFyIGhkcls4MTkyXTsKKworCXJldCA9IHVucGFja19zaGExX2hlYWRlcigmc3RyZWFtLCBtYXAsIG1hcHNpemUsIGhkciwgc2l6ZW9mKGhkcikpOworCWlmIChyZXQgPCBaX09LIHx8IHBhcnNlX3NoYTFfaGVhZGVyKGhkciwgdHlwZSwgc2l6ZSkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB1bnBhY2tfc2hhMV9yZXN0KCZzdHJlYW0sIGhkciwgKnNpemUpOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhIG11dHVhbGx5IHJlY3Vyc2l2ZSBmdW5jdGlvbiAqLworc3RhdGljIGludCBwYWNrZWRfb2JqZWN0X2luZm8oc3RydWN0IHBhY2tfZW50cnkgKmVudHJ5LAorCQkJICAgICAgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApOworCitzdGF0aWMgaW50IHBhY2tlZF9kZWx0YV9pbmZvKHVuc2lnbmVkIGNoYXIgKmJhc2Vfc2hhMSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBkZWx0YV9zaXplLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGxlZnQsCisJCQkgICAgIGNoYXIgKnR5cGUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnNpemVwLAorCQkJICAgICBzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBiYXNlX2VudDsKKworCWlmIChsZWZ0IDwgMjApCisJCWRpZSgidHJ1bmNhdGVkIHBhY2sgZmlsZSIpOworCisJLyogVGhlIGJhc2UgZW50cnkgX211c3RfIGJlIGluIHRoZSBzYW1lIHBhY2sgKi8KKwlpZiAoIWZpbmRfcGFja19lbnRyeV9vbmUoYmFzZV9zaGExLCAmYmFzZV9lbnQsIHApKQorCQlkaWUoImZhaWxlZCB0byBmaW5kIGRlbHRhLXBhY2sgYmFzZSBvYmplY3QgJXMiLAorCQkgICAgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisKKwkvKiBXZSBjaG9vc2UgdG8gb25seSBnZXQgdGhlIHR5cGUgb2YgdGhlIGJhc2Ugb2JqZWN0IGFuZAorCSAqIGlnbm9yZSBwb3RlbnRpYWxseSBjb3JydXB0IHBhY2sgZmlsZSB0aGF0IGV4cGVjdHMgdGhlIGRlbHRhCisJICogYmFzZWQgb24gYSBiYXNlIHdpdGggYSB3cm9uZyBzaXplLiAgVGhpcyBzYXZlcyB0b25zIG9mCisJICogaW5mbGF0ZSgpIGNhbGxzLgorCSAqLworCisJaWYgKHBhY2tlZF9vYmplY3RfaW5mbygmYmFzZV9lbnQsIHR5cGUsIE5VTEwpKQorCQlkaWUoImNhbm5vdCBnZXQgaW5mbyBmb3IgZGVsdGEtcGFjayBiYXNlIik7CisKKwlpZiAoc2l6ZXApIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJdW5zaWduZWQgY2hhciBkZWx0YV9oZWFkWzY0XTsKKwkJdW5zaWduZWQgbG9uZyByZXN1bHRfc2l6ZTsKKwkJel9zdHJlYW0gc3RyZWFtOworCQlpbnQgc3Q7CisKKwkJbWVtc2V0KCZzdHJlYW0sIDAsIHNpemVvZihzdHJlYW0pKTsKKworCQlkYXRhID0gc3RyZWFtLm5leHRfaW4gPSBiYXNlX3NoYTEgKyAyMDsKKwkJc3RyZWFtLmF2YWlsX2luID0gbGVmdCAtIDIwOworCQlzdHJlYW0ubmV4dF9vdXQgPSBkZWx0YV9oZWFkOworCQlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGRlbHRhX2hlYWQpOworCisJCWluZmxhdGVJbml0KCZzdHJlYW0pOworCQlzdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCQlpbmZsYXRlRW5kKCZzdHJlYW0pOworCQlpZiAoKHN0ICE9IFpfU1RSRUFNX0VORCkgJiYKKwkJICAgIHN0cmVhbS50b3RhbF9vdXQgIT0gc2l6ZW9mKGRlbHRhX2hlYWQpKQorCQkJZGllKCJkZWx0YSBkYXRhIHVucGFjay1pbml0aWFsIGZhaWxlZCIpOworCisJCS8qIEV4YW1pbmUgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgZGVsdGEgdG8gZmlndXJlIG91dAorCQkgKiB0aGUgcmVzdWx0IHNpemUuCisJCSAqLworCQlkYXRhID0gZGVsdGFfaGVhZDsKKworCQkvKiBpZ25vcmUgYmFzZSBzaXplICovCisJCWdldF9kZWx0YV9oZHJfc2l6ZSgmZGF0YSwgZGVsdGFfaGVhZCtzaXplb2YoZGVsdGFfaGVhZCkpOworCisJCS8qIFJlYWQgdGhlIHJlc3VsdCBzaXplICovCisJCXJlc3VsdF9zaXplID0gZ2V0X2RlbHRhX2hkcl9zaXplKCZkYXRhLCBkZWx0YV9oZWFkK3NpemVvZihkZWx0YV9oZWFkKSk7CisJCSpzaXplcCA9IHJlc3VsdF9zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdW5wYWNrX29iamVjdF9oZWFkZXIoc3RydWN0IHBhY2tlZF9naXQgKnAsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCWVudW0gb2JqZWN0X3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXVuc2lnbmVkIHNoaWZ0OworCXVuc2lnbmVkIGNoYXIgKnBhY2ssIGM7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKG9mZnNldCA+PSBwLT5wYWNrX3NpemUpCisJCWRpZSgib2JqZWN0IG9mZnNldCBvdXRzaWRlIG9mIHBhY2sgZmlsZSIpOworCisJcGFjayA9ICAodW5zaWduZWQgY2hhciAqKSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJYyA9ICpwYWNrKys7CisJb2Zmc2V0Kys7CisJKnR5cGUgPSAoYyA+PiA0KSAmIDc7CisJc2l6ZSA9IGMgJiAxNTsKKwlzaGlmdCA9IDQ7CisJd2hpbGUgKGMgJiAweDgwKSB7CisJCWlmIChvZmZzZXQgPj0gcC0+cGFja19zaXplKQorCQkJZGllKCJvYmplY3Qgb2Zmc2V0IG91dHNpZGUgb2YgcGFjayBmaWxlIik7CisJCWMgPSAqcGFjaysrOworCQlvZmZzZXQrKzsKKwkJc2l6ZSArPSAoYyAmIDB4N2YpIDw8IHNoaWZ0OworCQlzaGlmdCArPSA3OworCX0KKwkqc2l6ZXAgPSBzaXplOworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBjaGVja19yZXVzZV9wYWNrX2RlbHRhKHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgKnNpemVwLAorCQkJICAgZW51bSBvYmplY3RfdHlwZSAqa2luZHApCit7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJaW50IHN0YXR1cyA9IC0xOworCisJdXNlX3BhY2tlZF9naXQocCk7CisJcHRyID0gb2Zmc2V0OworCXB0ciA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsIHB0ciwga2luZHAsIHNpemVwKTsKKwlpZiAoKmtpbmRwICE9IE9CSl9ERUxUQSkKKwkJZ290byBkb25lOworCW1lbWNweShiYXNlLCAoY2hhciAqKSBwLT5wYWNrX2Jhc2UgKyBwdHIsIDIwKTsKKwlzdGF0dXMgPSAwOworIGRvbmU6CisJdW51c2VfcGFja2VkX2dpdChwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHBhY2tlZF9vYmplY3RfaW5mb19kZXRhaWwoc3RydWN0IHBhY2tfZW50cnkgKmUsCisJCQkgICAgICAgY2hhciAqdHlwZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICpzaXplLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0b3JlX3NpemUsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpkZWx0YV9jaGFpbl9sZW5ndGgsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqYmFzZV9zaGExKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gZS0+cDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrOworCWVudW0gb2JqZWN0X3R5cGUga2luZDsKKworCW9mZnNldCA9IHVucGFja19vYmplY3RfaGVhZGVyKHAsIGUtPm9mZnNldCwgJmtpbmQsIHNpemUpOworCXBhY2sgPSAodW5zaWduZWQgY2hhciAqKSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJaWYgKGtpbmQgIT0gT0JKX0RFTFRBKQorCQkqZGVsdGFfY2hhaW5fbGVuZ3RoID0gMDsKKwllbHNlIHsKKwkJdW5zaWduZWQgaW50IGNoYWluX2xlbmd0aCA9IDA7CisJCWlmIChwLT5wYWNrX3NpemUgPD0gb2Zmc2V0ICsgMjApCisJCQlkaWUoInBhY2sgZmlsZSAlcyByZWNvcmRzIGFuIGluY29tcGxldGUgZGVsdGEgYmFzZSIsCisJCQkgICAgcC0+cGFja19uYW1lKTsKKwkJbWVtY3B5KGJhc2Vfc2hhMSwgcGFjaywgMjApOworCQlkbyB7CisJCQlzdHJ1Y3QgcGFja19lbnRyeSBiYXNlX2VudDsKKwkJCXVuc2lnbmVkIGxvbmcganVuazsKKworCQkJZmluZF9wYWNrX2VudHJ5X29uZShwYWNrLCAmYmFzZV9lbnQsIHApOworCQkJb2Zmc2V0ID0gdW5wYWNrX29iamVjdF9oZWFkZXIocCwgYmFzZV9lbnQub2Zmc2V0LAorCQkJCQkJICAgICAgJmtpbmQsICZqdW5rKTsKKwkJCXBhY2sgPSAodW5zaWduZWQgY2hhciAqKSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJCQljaGFpbl9sZW5ndGgrKzsKKwkJfSB3aGlsZSAoa2luZCA9PSBPQkpfREVMVEEpOworCQkqZGVsdGFfY2hhaW5fbGVuZ3RoID0gY2hhaW5fbGVuZ3RoOworCX0KKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9DT01NSVQ6CisJCXN0cmNweSh0eXBlLCBjb21taXRfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgT0JKX1RSRUU6CisJCXN0cmNweSh0eXBlLCB0cmVlX3R5cGUpOworCQlicmVhazsKKwljYXNlIE9CSl9CTE9COgorCQlzdHJjcHkodHlwZSwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVEFHOgorCQlzdHJjcHkodHlwZSwgdGFnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkaWUoImNvcnJ1cHRlZCBwYWNrIGZpbGUgJXMgY29udGFpbmluZyBvYmplY3Qgb2Yga2luZCAlZCIsCisJCSAgICBwLT5wYWNrX25hbWUsIGtpbmQpOworCX0KKwkqc3RvcmVfc2l6ZSA9IDA7IC8qIG5vdHlldCAqLworfQorCitzdGF0aWMgaW50IHBhY2tlZF9vYmplY3RfaW5mbyhzdHJ1Y3QgcGFja19lbnRyeSAqZW50cnksCisJCQkgICAgICBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nICpzaXplcCkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcCA9IGVudHJ5LT5wOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplLCBsZWZ0OworCXVuc2lnbmVkIGNoYXIgKnBhY2s7CisJZW51bSBvYmplY3RfdHlwZSBraW5kOworCWludCByZXR2YWw7CisKKwlpZiAodXNlX3BhY2tlZF9naXQocCkpCisJCWRpZSgiY2Fubm90IG1hcCBwYWNrZWQgZmlsZSIpOworCisJb2Zmc2V0ID0gdW5wYWNrX29iamVjdF9oZWFkZXIocCwgZW50cnktPm9mZnNldCwgJmtpbmQsICZzaXplKTsKKwlwYWNrID0gKHVuc2lnbmVkIGNoYXIgKikgcC0+cGFja19iYXNlICsgb2Zmc2V0OworCWxlZnQgPSBwLT5wYWNrX3NpemUgLSBvZmZzZXQ7CisKKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9ERUxUQToKKwkJcmV0dmFsID0gcGFja2VkX2RlbHRhX2luZm8ocGFjaywgc2l6ZSwgbGVmdCwgdHlwZSwgc2l6ZXAsIHApOworCQl1bnVzZV9wYWNrZWRfZ2l0KHApOworCQlyZXR1cm4gcmV0dmFsOworCWNhc2UgT0JKX0NPTU1JVDoKKwkJc3RyY3B5KHR5cGUsIGNvbW1pdF90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVFJFRToKKwkJc3RyY3B5KHR5cGUsIHRyZWVfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgT0JKX0JMT0I6CisJCXN0cmNweSh0eXBlLCBibG9iX3R5cGUpOworCQlicmVhazsKKwljYXNlIE9CSl9UQUc6CisJCXN0cmNweSh0eXBlLCB0YWdfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRpZSgiY29ycnVwdGVkIHBhY2sgZmlsZSAlcyBjb250YWluaW5nIG9iamVjdCBvZiBraW5kICVkIiwKKwkJICAgIHAtPnBhY2tfbmFtZSwga2luZCk7CisJfQorCWlmIChzaXplcCkKKwkJKnNpemVwID0gc2l6ZTsKKwl1bnVzZV9wYWNrZWRfZ2l0KHApOworCXJldHVybiAwOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhIG11dHVhbGx5IHJlY3Vyc2l2ZSBmdW5jdGlvbiAqLworc3RhdGljIHZvaWQgKnVucGFja19lbnRyeShzdHJ1Y3QgcGFja19lbnRyeSAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcgKik7CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfZGVsdGFfZW50cnkodW5zaWduZWQgY2hhciAqYmFzZV9zaGExLAorCQkJCXVuc2lnbmVkIGxvbmcgZGVsdGFfc2l6ZSwKKwkJCQl1bnNpZ25lZCBsb25nIGxlZnQsCisJCQkJY2hhciAqdHlwZSwKKwkJCQl1bnNpZ25lZCBsb25nICpzaXplcCwKKwkJCQlzdHJ1Y3QgcGFja2VkX2dpdCAqcCkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBiYXNlX2VudDsKKwl2b2lkICpkYXRhLCAqZGVsdGFfZGF0YSwgKnJlc3VsdCwgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBkYXRhX3NpemUsIHJlc3VsdF9zaXplLCBiYXNlX3NpemU7CisJel9zdHJlYW0gc3RyZWFtOworCWludCBzdDsKKworCWlmIChsZWZ0IDwgMjApCisJCWRpZSgidHJ1bmNhdGVkIHBhY2sgZmlsZSIpOworCisJLyogVGhlIGJhc2UgZW50cnkgX211c3RfIGJlIGluIHRoZSBzYW1lIHBhY2sgKi8KKwlpZiAoIWZpbmRfcGFja19lbnRyeV9vbmUoYmFzZV9zaGExLCAmYmFzZV9lbnQsIHApKQorCQlkaWUoImZhaWxlZCB0byBmaW5kIGRlbHRhLXBhY2sgYmFzZSBvYmplY3QgJXMiLAorCQkgICAgc2hhMV90b19oZXgoYmFzZV9zaGExKSk7CisJYmFzZSA9IHVucGFja19lbnRyeV9nZW50bHkoJmJhc2VfZW50LCB0eXBlLCAmYmFzZV9zaXplKTsKKwlpZiAoIWJhc2UpCisJCWRpZSgiZmFpbGVkIHRvIHJlYWQgZGVsdGEtcGFjayBiYXNlIG9iamVjdCAlcyIsCisJCSAgICBzaGExX3RvX2hleChiYXNlX3NoYTEpKTsKKworCWRhdGEgPSBiYXNlX3NoYTEgKyAyMDsKKwlkYXRhX3NpemUgPSBsZWZ0IC0gMjA7CisJZGVsdGFfZGF0YSA9IHhtYWxsb2MoZGVsdGFfc2l6ZSk7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCisJc3RyZWFtLm5leHRfaW4gPSBkYXRhOworCXN0cmVhbS5hdmFpbF9pbiA9IGRhdGFfc2l6ZTsKKwlzdHJlYW0ubmV4dF9vdXQgPSBkZWx0YV9kYXRhOworCXN0cmVhbS5hdmFpbF9vdXQgPSBkZWx0YV9zaXplOworCisJaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJc3QgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCWlmICgoc3QgIT0gWl9TVFJFQU1fRU5EKSB8fCBzdHJlYW0udG90YWxfb3V0ICE9IGRlbHRhX3NpemUpCisJCWRpZSgiZGVsdGEgZGF0YSB1bnBhY2sgZmFpbGVkIik7CisKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlLCBiYXNlX3NpemUsCisJCQkgICAgIGRlbHRhX2RhdGEsIGRlbHRhX3NpemUsCisJCQkgICAgICZyZXN1bHRfc2l6ZSk7CisJaWYgKCFyZXN1bHQpCisJCWRpZSgiZmFpbGVkIHRvIGFwcGx5IGRlbHRhIik7CisJZnJlZShkZWx0YV9kYXRhKTsKKwlmcmVlKGJhc2UpOworCSpzaXplcCA9IHJlc3VsdF9zaXplOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkICp1bnBhY2tfbm9uX2RlbHRhX2VudHJ5KHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsZWZ0KQoreworCWludCBzdDsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0geG1hbGxvYyhzaXplICsgMSk7CisJYnVmZmVyW3NpemVdID0gMDsKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCXN0cmVhbS5uZXh0X2luID0gZGF0YTsKKwlzdHJlYW0uYXZhaWxfaW4gPSBsZWZ0OworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZmZlcjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCWluZmxhdGVJbml0KCZzdHJlYW0pOworCXN0ID0gaW5mbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCk7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlpZiAoKHN0ICE9IFpfU1RSRUFNX0VORCkgfHwgc3RyZWFtLnRvdGFsX291dCAhPSBzaXplKSB7CisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgKnVucGFja19lbnRyeShzdHJ1Y3QgcGFja19lbnRyeSAqZW50cnksCisJCQkgIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemVwKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwID0gZW50cnktPnA7CisJdm9pZCAqcmV0dmFsOworCisJaWYgKHVzZV9wYWNrZWRfZ2l0KHApKQorCQlkaWUoImNhbm5vdCBtYXAgcGFja2VkIGZpbGUiKTsKKwlyZXR2YWwgPSB1bnBhY2tfZW50cnlfZ2VudGx5KGVudHJ5LCB0eXBlLCBzaXplcCk7CisJdW51c2VfcGFja2VkX2dpdChwKTsKKwlpZiAoIXJldHZhbCkKKwkJZGllKCJjb3JydXB0ZWQgcGFjayBmaWxlICVzIiwgcC0+cGFja19uYW1lKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB1c2VfcGFja2VkX2dpdCgpL3VudXNlX3BhY2tlZF9naXQoKSBwYWlyICovCit2b2lkICp1bnBhY2tfZW50cnlfZ2VudGx5KHN0cnVjdCBwYWNrX2VudHJ5ICplbnRyeSwKKwkJCSAgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJc3RydWN0IHBhY2tlZF9naXQgKnAgPSBlbnRyeS0+cDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZSwgbGVmdDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrOworCWVudW0gb2JqZWN0X3R5cGUga2luZDsKKwl2b2lkICpyZXR2YWw7CisKKwlvZmZzZXQgPSB1bnBhY2tfb2JqZWN0X2hlYWRlcihwLCBlbnRyeS0+b2Zmc2V0LCAma2luZCwgJnNpemUpOworCXBhY2sgPSAodW5zaWduZWQgY2hhciAqKSBwLT5wYWNrX2Jhc2UgKyBvZmZzZXQ7CisJbGVmdCA9IHAtPnBhY2tfc2l6ZSAtIG9mZnNldDsKKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9ERUxUQToKKwkJcmV0dmFsID0gdW5wYWNrX2RlbHRhX2VudHJ5KHBhY2ssIHNpemUsIGxlZnQsIHR5cGUsIHNpemVwLCBwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwljYXNlIE9CSl9DT01NSVQ6CisJCXN0cmNweSh0eXBlLCBjb21taXRfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgT0JKX1RSRUU6CisJCXN0cmNweSh0eXBlLCB0cmVlX3R5cGUpOworCQlicmVhazsKKwljYXNlIE9CSl9CTE9COgorCQlzdHJjcHkodHlwZSwgYmxvYl90eXBlKTsKKwkJYnJlYWs7CisJY2FzZSBPQkpfVEFHOgorCQlzdHJjcHkodHlwZSwgdGFnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisJKnNpemVwID0gc2l6ZTsKKwlyZXR2YWwgPSB1bnBhY2tfbm9uX2RlbHRhX2VudHJ5KHBhY2ssIHNpemUsIGxlZnQpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBudW1fcGFja2VkX29iamVjdHMoY29uc3Qgc3RydWN0IHBhY2tlZF9naXQgKnApCit7CisJLyogU2VlIGNoZWNrX3BhY2tlZF9naXRfaWR4KCkgKi8KKwlyZXR1cm4gKHAtPmluZGV4X3NpemUgLSAyMCAtIDIwIC0gNCoyNTYpIC8gMjQ7Cit9CisKK2ludCBudGhfcGFja2VkX29iamVjdF9zaGExKGNvbnN0IHN0cnVjdCBwYWNrZWRfZ2l0ICpwLCBpbnQgbiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIqIHNoYTEpCit7CisJdm9pZCAqaW5kZXggPSBwLT5pbmRleF9iYXNlICsgMjU2OworCWlmIChuIDwgMCB8fCBudW1fcGFja2VkX29iamVjdHMocCkgPD0gbikKKwkJcmV0dXJuIC0xOworCW1lbWNweShzaGExLCAoY2hhciAqKSBpbmRleCArICgyNCAqIG4pICsgNCwgMjApOworCXJldHVybiAwOworfQorCitpbnQgZmluZF9wYWNrX2VudHJ5X29uZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJc3RydWN0IHBhY2tfZW50cnkgKmUsIHN0cnVjdCBwYWNrZWRfZ2l0ICpwKQoreworCXVuc2lnbmVkIGludCAqbGV2ZWwxX29mcyA9IHAtPmluZGV4X2Jhc2U7CisJaW50IGhpID0gbnRvaGwobGV2ZWwxX29mc1sqc2hhMV0pOworCWludCBsbyA9ICgoKnNoYTEgPT0gMHgwKSA/IDAgOiBudG9obChsZXZlbDFfb2ZzWypzaGExIC0gMV0pKTsKKwl2b2lkICppbmRleCA9IHAtPmluZGV4X2Jhc2UgKyAyNTY7CisKKwlkbyB7CisJCWludCBtaSA9IChsbyArIGhpKSAvIDI7CisJCWludCBjbXAgPSBtZW1jbXAoKGNoYXIgKikgaW5kZXggKyAoMjQgKiBtaSkgKyA0LCBzaGExLCAyMCk7CisJCWlmICghY21wKSB7CisJCQllLT5vZmZzZXQgPSBudG9obCgqKCh1bnNpZ25lZCBpbnQgKikgKChjaGFyICopIGluZGV4ICsgKDI0ICogbWkpKSkpOworCQkJbWVtY3B5KGUtPnNoYTEsIHNoYTEsIDIwKTsKKwkJCWUtPnAgPSBwOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGNtcCA+IDApCisJCQloaSA9IG1pOworCQllbHNlCisJCQlsbyA9IG1pKzE7CisJfSB3aGlsZSAobG8gPCBoaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9wYWNrX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHN0cnVjdCBwYWNrX2VudHJ5ICplKQoreworCXN0cnVjdCBwYWNrZWRfZ2l0ICpwOworCXByZXBhcmVfcGFja2VkX2dpdCgpOworCisJZm9yIChwID0gcGFja2VkX2dpdDsgcDsgcCA9IHAtPm5leHQpIHsKKwkJaWYgKGZpbmRfcGFja19lbnRyeV9vbmUoc2hhMSwgZSwgcCkpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBwYWNrZWRfZ2l0ICpmaW5kX3NoYTFfcGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCAKKwkJCQkgIHN0cnVjdCBwYWNrZWRfZ2l0ICpwYWNrcykKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCisJZm9yIChwID0gcGFja3M7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChmaW5kX3BhY2tfZW50cnlfb25lKHNoYTEsICZlLCBwKSkKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKKwkKK30KKworaW50IHNoYTFfb2JqZWN0X2luZm8oY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZXApCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIG1hcHNpemUsIHNpemU7CisJdm9pZCAqbWFwOworCXpfc3RyZWFtIHN0cmVhbTsKKwljaGFyIGhkclsxMjhdOworCisJbWFwID0gbWFwX3NoYTFfZmlsZV9pbnRlcm5hbChzaGExLCAmbWFwc2l6ZSk7CisJaWYgKCFtYXApIHsKKwkJc3RydWN0IHBhY2tfZW50cnkgZTsKKworCQlpZiAoZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlKSkKKwkJCXJldHVybiBwYWNrZWRfb2JqZWN0X2luZm8oJmUsIHR5cGUsIHNpemVwKTsKKwkJcmVwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwkJaWYgKGZpbmRfcGFja19lbnRyeShzaGExLCAmZSkpCisJCQlyZXR1cm4gcGFja2VkX29iamVjdF9pbmZvKCZlLCB0eXBlLCBzaXplcCk7CisJCXJldHVybiBlcnJvcigidW5hYmxlIHRvIGZpbmQgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCWlmICh1bnBhY2tfc2hhMV9oZWFkZXIoJnN0cmVhbSwgbWFwLCBtYXBzaXplLCBoZHIsIHNpemVvZihoZHIpKSA8IDApCisJCXN0YXR1cyA9IGVycm9yKCJ1bmFibGUgdG8gdW5wYWNrICVzIGhlYWRlciIsCisJCQkgICAgICAgc2hhMV90b19oZXgoc2hhMSkpOworCWlmIChwYXJzZV9zaGExX2hlYWRlcihoZHIsIHR5cGUsICZzaXplKSA8IDApCisJCXN0YXR1cyA9IGVycm9yKCJ1bmFibGUgdG8gcGFyc2UgJXMgaGVhZGVyIiwgc2hhMV90b19oZXgoc2hhMSkpOworCWVsc2UgeworCQlzdGF0dXMgPSAwOworCQlpZiAoc2l6ZXApCisJCQkqc2l6ZXAgPSBzaXplOworCX0KKwlpbmZsYXRlRW5kKCZzdHJlYW0pOworCW11bm1hcChtYXAsIG1hcHNpemUpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkICpyZWFkX3BhY2tlZF9zaGExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGNoYXIgKnR5cGUsIHVuc2lnbmVkIGxvbmcgKnNpemUpCit7CisJc3RydWN0IHBhY2tfZW50cnkgZTsKKworCWlmICghZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlKSkgeworCQllcnJvcigiY2Fubm90IHJlYWQgc2hhMV9maWxlIGZvciAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiB1bnBhY2tfZW50cnkoJmUsIHR5cGUsIHNpemUpOworfQorCit2b2lkICogcmVhZF9zaGExX2ZpbGUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hcHNpemU7CisJdm9pZCAqbWFwLCAqYnVmOworCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwlpZiAoZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlKSkKKwkJcmV0dXJuIHJlYWRfcGFja2VkX3NoYTEoc2hhMSwgdHlwZSwgc2l6ZSk7CisJbWFwID0gbWFwX3NoYTFfZmlsZV9pbnRlcm5hbChzaGExLCAmbWFwc2l6ZSk7CisJaWYgKG1hcCkgeworCQlidWYgPSB1bnBhY2tfc2hhMV9maWxlKG1hcCwgbWFwc2l6ZSwgdHlwZSwgc2l6ZSk7CisJCW11bm1hcChtYXAsIG1hcHNpemUpOworCQlyZXR1cm4gYnVmOworCX0KKwlyZXByZXBhcmVfcGFja2VkX2dpdCgpOworCWlmIChmaW5kX3BhY2tfZW50cnkoc2hhMSwgJmUpKQorCQlyZXR1cm4gcmVhZF9wYWNrZWRfc2hhMShzaGExLCB0eXBlLCBzaXplKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCAqcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKKwkJCQkgY29uc3QgY2hhciAqcmVxdWlyZWRfdHlwZSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqc2l6ZSwKKwkJCQkgdW5zaWduZWQgY2hhciAqYWN0dWFsX3NoYTFfcmV0dXJuKQoreworCWNoYXIgdHlwZVsyMF07CisJdm9pZCAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgaXNpemU7CisJdW5zaWduZWQgY2hhciBhY3R1YWxfc2hhMVsyMF07CisKKwltZW1jcHkoYWN0dWFsX3NoYTEsIHNoYTEsIDIwKTsKKwl3aGlsZSAoMSkgeworCQlpbnQgcmVmX2xlbmd0aCA9IC0xOworCQljb25zdCBjaGFyICpyZWZfdHlwZSA9IE5VTEw7CisKKwkJYnVmZmVyID0gcmVhZF9zaGExX2ZpbGUoYWN0dWFsX3NoYTEsIHR5cGUsICZpc2l6ZSk7CisJCWlmICghYnVmZmVyKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghc3RyY21wKHR5cGUsIHJlcXVpcmVkX3R5cGUpKSB7CisJCQkqc2l6ZSA9IGlzaXplOworCQkJaWYgKGFjdHVhbF9zaGExX3JldHVybikKKwkJCQltZW1jcHkoYWN0dWFsX3NoYTFfcmV0dXJuLCBhY3R1YWxfc2hhMSwgMjApOworCQkJcmV0dXJuIGJ1ZmZlcjsKKwkJfQorCQkvKiBIYW5kbGUgcmVmZXJlbmNlcyAqLworCQllbHNlIGlmICghc3RyY21wKHR5cGUsIGNvbW1pdF90eXBlKSkKKwkJCXJlZl90eXBlID0gInRyZWUgIjsKKwkJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCB0YWdfdHlwZSkpCisJCQlyZWZfdHlwZSA9ICJvYmplY3QgIjsKKwkJZWxzZSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlyZWZfbGVuZ3RoID0gc3RybGVuKHJlZl90eXBlKTsKKworCQlpZiAobWVtY21wKGJ1ZmZlciwgcmVmX3R5cGUsIHJlZl9sZW5ndGgpIHx8CisJCSAgICBnZXRfc2hhMV9oZXgoKGNoYXIgKikgYnVmZmVyICsgcmVmX2xlbmd0aCwgYWN0dWFsX3NoYTEpKSB7CisJCQlmcmVlKGJ1ZmZlcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlmcmVlKGJ1ZmZlcik7CisJCS8qIE5vdyB3ZSBoYXZlIHRoZSBJRCBvZiB0aGUgcmVmZXJyZWQtdG8gb2JqZWN0IGluCisJCSAqIGFjdHVhbF9zaGExLiAgQ2hlY2sgYWdhaW4uICovCisJfQorfQorCitjaGFyICp3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZSh2b2lkICpidWYsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkgICAgICB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqaGRyLAorCQkJICAgICAgaW50ICpoZHJsZW4pCit7CisJU0hBX0NUWCBjOworCisJLyogR2VuZXJhdGUgdGhlIGhlYWRlciAqLworCSpoZHJsZW4gPSBzcHJpbnRmKChjaGFyICopaGRyLCAiJXMgJWx1IiwgdHlwZSwgbGVuKSsxOworCisJLyogU2hhMS4uICovCisJU0hBMV9Jbml0KCZjKTsKKwlTSEExX1VwZGF0ZSgmYywgaGRyLCAqaGRybGVuKTsKKwlTSEExX1VwZGF0ZSgmYywgYnVmLCBsZW4pOworCVNIQTFfRmluYWwoc2hhMSwgJmMpOworCisJcmV0dXJuIHNoYTFfZmlsZV9uYW1lKHNoYTEpOworfQorCisvKgorICogTGluayB0aGUgdGVtcGZpbGUgdG8gdGhlIGZpbmFsIHBsYWNlLCBwb3NzaWJseSBjcmVhdGluZyB0aGUKKyAqIGxhc3QgZGlyZWN0b3J5IGxldmVsIGFzIHlvdSBkbyBzby4KKyAqCisgKiBSZXR1cm5zIHRoZSBlcnJubyBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgbGlua190ZW1wX3RvX2ZpbGUoY29uc3QgY2hhciAqdG1wZmlsZSwgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHJldDsKKwljaGFyICpkaXI7CisKKwlpZiAoIWxpbmsodG1wZmlsZSwgZmlsZW5hbWUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVHJ5IHRvIG1rZGlyIHRoZSBsYXN0IHBhdGggY29tcG9uZW50IGlmIHRoYXQgZmFpbGVkLgorCSAqCisJICogUmUtdHJ5IHRoZSAibGluaygpIiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG1rZGlyCisJICogc3VjY2VlZHMsIHNpbmNlIGEgcmFjZSBtaWdodCBtZWFuIHRoYXQgc29tZWJvZHkKKwkgKiBlbHNlIHN1Y2NlZWRlZC4KKwkgKi8KKwlyZXQgPSBlcnJubzsKKwlkaXIgPSBzdHJyY2hyKGZpbGVuYW1lLCAnLycpOworCWlmIChkaXIpIHsKKwkJKmRpciA9IDA7CisJCW1rZGlyKGZpbGVuYW1lLCAwNzc3KTsKKwkJaWYgKGFkanVzdF9zaGFyZWRfcGVybShmaWxlbmFtZSkpCisJCQlyZXR1cm4gLTI7CisJCSpkaXIgPSAnLyc7CisJCWlmICghbGluayh0bXBmaWxlLCBmaWxlbmFtZSkpCisJCQlyZXR1cm4gMDsKKwkJcmV0ID0gZXJybm87CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBNb3ZlIHRoZSBqdXN0IHdyaXR0ZW4gb2JqZWN0IGludG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UKKyAqLworaW50IG1vdmVfdGVtcF90b19maWxlKGNvbnN0IGNoYXIgKnRtcGZpbGUsIGNoYXIgKmZpbGVuYW1lKQoreworCWludCByZXQgPSBsaW5rX3RlbXBfdG9fZmlsZSh0bXBmaWxlLCBmaWxlbmFtZSk7CisKKwkvKgorCSAqIENvZGEgaGFjayAtIGNvZGEgZG9lc24ndCBsaWtlIGNyb3NzLWRpcmVjdG9yeSBsaW5rcywKKwkgKiBzbyB3ZSBmYWxsIGJhY2sgdG8gYSByZW5hbWUsIHdoaWNoIHdpbGwgbWVhbiB0aGF0IGl0CisJICogd29uJ3QgYmUgYWJsZSB0byBjaGVjayBjb2xsaXNpb25zLCBidXQgdGhhdCdzIG5vdCBhCisJICogYmlnIGRlYWwuCisJICoKKwkgKiBUaGUgc2FtZSBob2xkcyBmb3IgRkFUIGZvcm1hdHRlZCBtZWRpYS4KKwkgKgorCSAqIFdoZW4gdGhpcyBzdWNjZWVkcywgd2UganVzdCByZXR1cm4gMC4gV2UgaGF2ZSBub3RoaW5nCisJICogbGVmdCB0byB1bmxpbmsuCisJICovCisJaWYgKHJldCAmJiByZXQgIT0gRUVYSVNUKSB7CisJCWlmICghcmVuYW1lKHRtcGZpbGUsIGZpbGVuYW1lKSkKKwkJCXJldHVybiAwOworCQlyZXQgPSBlcnJubzsKKwl9CisJdW5saW5rKHRtcGZpbGUpOworCWlmIChyZXQpIHsKKwkJaWYgKHJldCAhPSBFRVhJU1QpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZW5hbWUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogRklYTUUhISEgQ29sbGlzaW9uIGNoZWNrIGhlcmUgPyAqLworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2J1ZmZlcihpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwl3aGlsZSAobGVuKSB7CisJCXNzaXplX3Qgc2l6ZTsKKworCQlzaXplID0gd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKwkJaWYgKCFzaXplKQorCQkJcmV0dXJuIGVycm9yKCJmaWxlIHdyaXRlOiBkaXNrIGZ1bGwiKTsKKwkJaWYgKHNpemUgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIGVycm9yKCJmaWxlIHdyaXRlIGVycm9yICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQl9CisJCWxlbiAtPSBzaXplOworCQlidWYgPSAoY2hhciAqKSBidWYgKyBzaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9iaW5hcnlfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmhkciwgZW51bSBvYmplY3RfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlpbnQgaGRyX2xlbjsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwljID0gKHR5cGUgPDwgNCkgfCAobGVuICYgMTUpOworCWxlbiA+Pj0gNDsKKwloZHJfbGVuID0gMTsKKwl3aGlsZSAobGVuKSB7CisJCSpoZHIrKyA9IGMgfCAweDgwOworCQloZHJfbGVuKys7CisJCWMgPSAobGVuICYgMHg3Zik7CisJCWxlbiA+Pj0gNzsKKwl9CisJKmhkciA9IGM7CisJcmV0dXJuIGhkcl9sZW47Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX29iamVjdF9oZWFkZXIoel9zdHJlYW0gKnN0cmVhbSwgY29uc3QgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJaW50IG9ial90eXBlLCBoZHI7CisKKwlpZiAodXNlX2xlZ2FjeV9oZWFkZXJzKSB7CisJCXdoaWxlIChkZWZsYXRlKHN0cmVhbSwgMCkgPT0gWl9PSykKKwkJCS8qIG5vdGhpbmcgKi87CisJCXJldHVybjsKKwl9CisJaWYgKCFzdHJjbXAodHlwZSwgYmxvYl90eXBlKSkKKwkJb2JqX3R5cGUgPSBPQkpfQkxPQjsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpCisJCW9ial90eXBlID0gT0JKX1RSRUU7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCBjb21taXRfdHlwZSkpCisJCW9ial90eXBlID0gT0JKX0NPTU1JVDsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsIHRhZ190eXBlKSkKKwkJb2JqX3R5cGUgPSBPQkpfVEFHOworCWVsc2UKKwkJZGllKCJ0cnlpbmcgdG8gZ2VuZXJhdGUgYm9ndXMgb2JqZWN0IG9mIHR5cGUgJyVzJyIsIHR5cGUpOworCWhkciA9IHdyaXRlX2JpbmFyeV9oZWFkZXIoc3RyZWFtLT5uZXh0X291dCwgb2JqX3R5cGUsIGxlbik7CisJc3RyZWFtLT50b3RhbF9vdXQgPSBoZHI7CisJc3RyZWFtLT5uZXh0X291dCArPSBoZHI7CisJc3RyZWFtLT5hdmFpbF9vdXQgLT0gaGRyOworfQorCitpbnQgd3JpdGVfc2hhMV9maWxlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKnJldHVybnNoYTEpCit7CisJaW50IHNpemU7CisJdW5zaWduZWQgY2hhciAqY29tcHJlc3NlZDsKKwl6X3N0cmVhbSBzdHJlYW07CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyICpmaWxlbmFtZTsKKwlzdGF0aWMgY2hhciB0bXBmaWxlW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIGhkcls1MF07CisJaW50IGZkLCBoZHJsZW47CisKKwkvKiBOb3JtYWxseSBpZiB3ZSBoYXZlIGl0IGluIHRoZSBwYWNrIHRoZW4gd2UgZG8gbm90IGJvdGhlciB3cml0aW5nCisJICogaXQgb3V0IGludG8gLmdpdC9vYmplY3RzLz8/Lz97Mzh9IGZpbGUuCisJICovCisJZmlsZW5hbWUgPSB3cml0ZV9zaGExX2ZpbGVfcHJlcGFyZShidWYsIGxlbiwgdHlwZSwgc2hhMSwgaGRyLCAmaGRybGVuKTsKKwlpZiAocmV0dXJuc2hhMSkKKwkJbWVtY3B5KHJldHVybnNoYTEsIHNoYTEsIDIwKTsKKwlpZiAoaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7CisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJLyoKKwkJICogRklYTUUhISEgV2UgbWlnaHQgZG8gY29sbGlzaW9uIGNoZWNraW5nIGhlcmUsIGJ1dCB3ZSdkCisJCSAqIG5lZWQgdG8gdW5jb21wcmVzcyB0aGUgb2xkIGZpbGUgYW5kIGNoZWNrIGl0LiBMYXRlci4KKwkJICovCisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInNoYTEgZmlsZSAlczogJXNcbiIsIGZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMvb2JqX1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCisJZmQgPSBta3N0ZW1wKHRtcGZpbGUpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBzaGExIGZpbGVuYW1lICVzOiAlc1xuIiwgdG1wZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFNldCBpdCB1cCAqLworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisJZGVmbGF0ZUluaXQoJnN0cmVhbSwgemxpYl9jb21wcmVzc2lvbl9sZXZlbCk7CisJc2l6ZSA9IDggKyBkZWZsYXRlQm91bmQoJnN0cmVhbSwgbGVuK2hkcmxlbik7CisJY29tcHJlc3NlZCA9IHhtYWxsb2Moc2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X291dCA9IGNvbXByZXNzZWQ7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisKKwkvKiBGaXJzdCBoZWFkZXIuLiAqLworCXN0cmVhbS5uZXh0X2luID0gaGRyOworCXN0cmVhbS5hdmFpbF9pbiA9IGhkcmxlbjsKKwlzZXR1cF9vYmplY3RfaGVhZGVyKCZzdHJlYW0sIHR5cGUsIGxlbik7CisKKwkvKiBUaGVuIHRoZSBkYXRhIGl0c2VsZi4uICovCisJc3RyZWFtLm5leHRfaW4gPSBidWY7CisJc3RyZWFtLmF2YWlsX2luID0gbGVuOworCXdoaWxlIChkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKSA9PSBaX09LKQorCQkvKiBub3RoaW5nICovOworCWRlZmxhdGVFbmQoJnN0cmVhbSk7CisJc2l6ZSA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKwlpZiAod3JpdGVfYnVmZmVyKGZkLCBjb21wcmVzc2VkLCBzaXplKSA8IDApCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZSIpOworCWZjaG1vZChmZCwgMDQ0NCk7CisJY2xvc2UoZmQpOworCWZyZWUoY29tcHJlc3NlZCk7CisKKwlyZXR1cm4gbW92ZV90ZW1wX3RvX2ZpbGUodG1wZmlsZSwgZmlsZW5hbWUpOworfQorCisvKgorICogV2UgbmVlZCB0byB1bnBhY2sgYW5kIHJlY29tcHJlc3MgdGhlIG9iamVjdCBmb3Igd3JpdGluZworICogaXQgb3V0IHRvIGEgZGlmZmVyZW50IGZpbGUuCisgKi8KK3N0YXRpYyB2b2lkICpyZXBhY2tfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIHVuc2lnbmVkIGxvbmcgKm9ianNpemUpCit7CisJc2l6ZV90IHNpemU7CisJel9zdHJlYW0gc3RyZWFtOworCXVuc2lnbmVkIGNoYXIgKnVucGFja2VkOworCXVuc2lnbmVkIGxvbmcgbGVuOworCWNoYXIgdHlwZVsyMF07CisJY2hhciBoZHJbNTBdOworCWludCBoZHJsZW47CisJdm9pZCAqYnVmOworCisJLyogbmVlZCB0byB1bnBhY2sgYW5kIHJlY29tcHJlc3MgaXQgYnkgaXRzZWxmICovCisJdW5wYWNrZWQgPSByZWFkX3BhY2tlZF9zaGExKHNoYTEsIHR5cGUsICZsZW4pOworCisJaGRybGVuID0gc3ByaW50ZihoZHIsICIlcyAlbHUiLCB0eXBlLCBsZW4pICsgMTsKKworCS8qIFNldCBpdCB1cCAqLworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisJZGVmbGF0ZUluaXQoJnN0cmVhbSwgemxpYl9jb21wcmVzc2lvbl9sZXZlbCk7CisJc2l6ZSA9IGRlZmxhdGVCb3VuZCgmc3RyZWFtLCBsZW4gKyBoZHJsZW4pOworCWJ1ZiA9IHhtYWxsb2Moc2l6ZSk7CisKKwkvKiBDb21wcmVzcyBpdCAqLworCXN0cmVhbS5uZXh0X291dCA9IGJ1ZjsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZTsKKworCS8qIEZpcnN0IGhlYWRlci4uICovCisJc3RyZWFtLm5leHRfaW4gPSAodm9pZCAqKWhkcjsKKwlzdHJlYW0uYXZhaWxfaW4gPSBoZHJsZW47CisJd2hpbGUgKGRlZmxhdGUoJnN0cmVhbSwgMCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKworCS8qIFRoZW4gdGhlIGRhdGEgaXRzZWxmLi4gKi8KKwlzdHJlYW0ubmV4dF9pbiA9IHVucGFja2VkOworCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwl3aGlsZSAoZGVmbGF0ZSgmc3RyZWFtLCBaX0ZJTklTSCkgPT0gWl9PSykKKwkJLyogbm90aGluZyAqLzsKKwlkZWZsYXRlRW5kKCZzdHJlYW0pOworCWZyZWUodW5wYWNrZWQpOworCisJKm9ianNpemUgPSBzdHJlYW0udG90YWxfb3V0OworCXJldHVybiBidWY7Cit9CisKK2ludCB3cml0ZV9zaGExX3RvX2ZkKGludCBmZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgb2Jqc2l6ZTsKKwl2b2lkICpidWYgPSBtYXBfc2hhMV9maWxlX2ludGVybmFsKHNoYTEsICZvYmpzaXplKTsKKworCWlmIChidWYpIHsKKwkJcmV0dmFsID0gd3JpdGVfYnVmZmVyKGZkLCBidWYsIG9ianNpemUpOworCQltdW5tYXAoYnVmLCBvYmpzaXplKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlidWYgPSByZXBhY2tfb2JqZWN0KHNoYTEsICZvYmpzaXplKTsKKwlyZXR2YWwgPSB3cml0ZV9idWZmZXIoZmQsIGJ1Ziwgb2Jqc2l6ZSk7CisJZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB3cml0ZV9zaGExX2Zyb21fZmQoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGZkLCBjaGFyICpidWZmZXIsCisJCSAgICAgICBzaXplX3QgYnVmc2l6ZSwgc2l6ZV90ICpidWZwb3NuKQoreworCWNoYXIgdG1wZmlsZVtQQVRIX01BWF07CisJaW50IGxvY2FsOworCXpfc3RyZWFtIHN0cmVhbTsKKwl1bnNpZ25lZCBjaGFyIHJlYWxfc2hhMVsyMF07CisJdW5zaWduZWQgY2hhciBkaXNjYXJkWzQwOTZdOworCWludCByZXQ7CisJU0hBX0NUWCBjOworCisJc25wcmludGYodG1wZmlsZSwgc2l6ZW9mKHRtcGZpbGUpLCAiJXMvb2JqX1hYWFhYWCIsIGdldF9vYmplY3RfZGlyZWN0b3J5KCkpOworCisJbG9jYWwgPSBta3N0ZW1wKHRtcGZpbGUpOworCWlmIChsb2NhbCA8IDApCisJCXJldHVybiBlcnJvcigiQ291bGRuJ3Qgb3BlbiAlcyBmb3IgJXMiLAorCQkJICAgICB0bXBmaWxlLCBzaGExX3RvX2hleChzaGExKSk7CisKKwltZW1zZXQoJnN0cmVhbSwgMCwgc2l6ZW9mKHN0cmVhbSkpOworCisJaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisKKwlTSEExX0luaXQoJmMpOworCisJZG8geworCQlzc2l6ZV90IHNpemU7CisJCWlmICgqYnVmcG9zbikgeworCQkJc3RyZWFtLmF2YWlsX2luID0gKmJ1ZnBvc247CisJCQlzdHJlYW0ubmV4dF9pbiA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsKKwkJCWRvIHsKKwkJCQlzdHJlYW0ubmV4dF9vdXQgPSBkaXNjYXJkOworCQkJCXN0cmVhbS5hdmFpbF9vdXQgPSBzaXplb2YoZGlzY2FyZCk7CisJCQkJcmV0ID0gaW5mbGF0ZSgmc3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCQkJCVNIQTFfVXBkYXRlKCZjLCBkaXNjYXJkLCBzaXplb2YoZGlzY2FyZCkgLQorCQkJCQkgICAgc3RyZWFtLmF2YWlsX291dCk7CisJCQl9IHdoaWxlIChzdHJlYW0uYXZhaWxfaW4gJiYgcmV0ID09IFpfT0spOworCQkJaWYgKHdyaXRlX2J1ZmZlcihsb2NhbCwgYnVmZmVyLCAqYnVmcG9zbiAtIHN0cmVhbS5hdmFpbF9pbikgPCAwKQorCQkJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHNoYTEgZmlsZSIpOworCQkJbWVtbW92ZShidWZmZXIsIGJ1ZmZlciArICpidWZwb3NuIC0gc3RyZWFtLmF2YWlsX2luLAorCQkJCXN0cmVhbS5hdmFpbF9pbik7CisJCQkqYnVmcG9zbiA9IHN0cmVhbS5hdmFpbF9pbjsKKwkJCWlmIChyZXQgIT0gWl9PSykKKwkJCQlicmVhazsKKwkJfQorCQlzaXplID0gcmVhZChmZCwgYnVmZmVyICsgKmJ1ZnBvc24sIGJ1ZnNpemUgLSAqYnVmcG9zbik7CisJCWlmIChzaXplIDw9IDApIHsKKwkJCWNsb3NlKGxvY2FsKTsKKwkJCXVubGluayh0bXBmaWxlKTsKKwkJCWlmICghc2l6ZSkKKwkJCQlyZXR1cm4gZXJyb3IoIkNvbm5lY3Rpb24gY2xvc2VkPyIpOworCQkJcGVycm9yKCJSZWFkaW5nIGZyb20gY29ubmVjdGlvbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpidWZwb3NuICs9IHNpemU7CisJfSB3aGlsZSAoMSk7CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKworCWNsb3NlKGxvY2FsKTsKKwlTSEExX0ZpbmFsKHJlYWxfc2hhMSwgJmMpOworCWlmIChyZXQgIT0gWl9TVFJFQU1fRU5EKSB7CisJCXVubGluayh0bXBmaWxlKTsKKwkJcmV0dXJuIGVycm9yKCJGaWxlICVzIGNvcnJ1cHRlZCIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKwl9CisJaWYgKG1lbWNtcChzaGExLCByZWFsX3NoYTEsIDIwKSkgeworCQl1bmxpbmsodG1wZmlsZSk7CisJCXJldHVybiBlcnJvcigiRmlsZSAlcyBoYXMgYmFkIGhhc2giLCBzaGExX3RvX2hleChzaGExKSk7CisJfQorCisJcmV0dXJuIG1vdmVfdGVtcF90b19maWxlKHRtcGZpbGUsIHNoYTFfZmlsZV9uYW1lKHNoYTEpKTsKK30KKworaW50IGhhc19wYWNrX2luZGV4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaWYgKHN0YXQoc2hhMV9wYWNrX2luZGV4X25hbWUoc2hhMSksICZzdCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgaGFzX3BhY2tfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdGF0IHN0OworCWlmIChzdGF0KHNoYTFfcGFja19uYW1lKHNoYTEpLCAmc3QpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50IGhhc19zaGExX3BhY2soY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgcGFja19lbnRyeSBlOworCXJldHVybiBmaW5kX3BhY2tfZW50cnkoc2hhMSwgJmUpOworfQorCitpbnQgaGFzX3NoYTFfZmlsZShjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBwYWNrX2VudHJ5IGU7CisKKwlpZiAoZmluZF9wYWNrX2VudHJ5KHNoYTEsICZlKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGZpbmRfc2hhMV9maWxlKHNoYTEsICZzdCkgPyAxIDogMDsKK30KKworLyoKKyAqIHJlYWRzIGZyb20gZmQgYXMgbG9uZyBhcyBwb3NzaWJsZSBpbnRvIGEgc3VwcGxpZWQgYnVmZmVyIG9mIHNpemUgYnl0ZXMuCisgKiBJZiBuZWNlc3NhcnkgdGhlIGJ1ZmZlcidzIHNpemUgaXMgaW5jcmVhc2VkIHVzaW5nIHJlYWxsb2MoKQorICoKKyAqIHJldHVybnMgMCBpZiBhbnl0aGluZyB3ZW50IGZpbmUgYW5kIC0xIG90aGVyd2lzZQorICoKKyAqIE5PVEU6IGJvdGggYnVmIGFuZCBzaXplIG1heSBjaGFuZ2UsIGJ1dCBldmVuIHdoZW4gLTEgaXMgcmV0dXJuZWQKKyAqIHlvdSBzdGlsbCBoYXZlIHRvIGZyZWUoKSBpdCB5b3Vyc2VsZi4KKyAqLworaW50IHJlYWRfcGlwZShpbnQgZmQsIGNoYXIqKiByZXR1cm5fYnVmLCB1bnNpZ25lZCBsb25nKiByZXR1cm5fc2l6ZSkKK3sKKwljaGFyKiBidWYgPSAqcmV0dXJuX2J1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSAqcmV0dXJuX3NpemU7CisJaW50IGlyZXQ7CisJdW5zaWduZWQgbG9uZyBvZmYgPSAwOworCisJZG8geworCQlpcmV0ID0geHJlYWQoZmQsIGJ1ZiArIG9mZiwgc2l6ZSAtIG9mZik7CisJCWlmIChpcmV0ID4gMCkgeworCQkJb2ZmICs9IGlyZXQ7CisJCQlpZiAob2ZmID09IHNpemUpIHsKKwkJCQlzaXplICo9IDI7CisJCQkJYnVmID0gcmVhbGxvYyhidWYsIHNpemUpOworCQkJfQorCQl9CisJfSB3aGlsZSAoaXJldCA+IDApOworCisJKnJldHVybl9idWYgPSBidWY7CisJKnJldHVybl9zaXplID0gb2ZmOworCisJaWYgKGlyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbmRleF9waXBlKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgY29uc3QgY2hhciAqdHlwZSwgaW50IHdyaXRlX29iamVjdCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSA0MDk2OworCWNoYXIgKmJ1ZiA9IG1hbGxvYyhzaXplKTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgaGRyWzUwXTsKKwlpbnQgaGRybGVuOworCisJaWYgKHJlYWRfcGlwZShmZCwgJmJ1ZiwgJnNpemUpKSB7CisJCWZyZWUoYnVmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghdHlwZSkKKwkJdHlwZSA9IGJsb2JfdHlwZTsKKwlpZiAod3JpdGVfb2JqZWN0KQorCQlyZXQgPSB3cml0ZV9zaGExX2ZpbGUoYnVmLCBzaXplLCB0eXBlLCBzaGExKTsKKwllbHNlIHsKKwkJd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUoYnVmLCBzaXplLCB0eXBlLCBzaGExLCBoZHIsICZoZHJsZW4pOworCQlyZXQgPSAwOworCX0KKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworaW50IGluZGV4X2ZkKHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBmZCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0LCBjb25zdCBjaGFyICp0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHN0LT5zdF9zaXplOworCXZvaWQgKmJ1ZjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgaGRyWzUwXTsKKwlpbnQgaGRybGVuOworCisJYnVmID0gIiI7CisJaWYgKHNpemUpCisJCWJ1ZiA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworCWNsb3NlKGZkKTsKKwlpZiAoYnVmID09IE1BUF9GQUlMRUQpCisJCXJldHVybiAtMTsKKworCWlmICghdHlwZSkKKwkJdHlwZSA9IGJsb2JfdHlwZTsKKwlpZiAod3JpdGVfb2JqZWN0KQorCQlyZXQgPSB3cml0ZV9zaGExX2ZpbGUoYnVmLCBzaXplLCB0eXBlLCBzaGExKTsKKwllbHNlIHsKKwkJd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUoYnVmLCBzaXplLCB0eXBlLCBzaGExLCBoZHIsICZoZHJsZW4pOworCQlyZXQgPSAwOworCX0KKwlpZiAoc2l6ZSkKKwkJbXVubWFwKGJ1Ziwgc2l6ZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGluZGV4X3BhdGgodW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnN0LCBpbnQgd3JpdGVfb2JqZWN0KQoreworCWludCBmZDsKKwljaGFyICp0YXJnZXQ7CisKKwlzd2l0Y2ggKHN0LT5zdF9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGUkVHOgorCQlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwKQorCQkJcmV0dXJuIGVycm9yKCJvcGVuKFwiJXNcIik6ICVzIiwgcGF0aCwKKwkJCQkgICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChpbmRleF9mZChzaGExLCBmZCwgc3QsIHdyaXRlX29iamVjdCwgTlVMTCkgPCAwKQorCQkJcmV0dXJuIGVycm9yKCIlczogZmFpbGVkIHRvIGluc2VydCBpbnRvIGRhdGFiYXNlIiwKKwkJCQkgICAgIHBhdGgpOworCQlicmVhazsKKwljYXNlIFNfSUZMTks6CisJCXRhcmdldCA9IHhtYWxsb2Moc3QtPnN0X3NpemUrMSk7CisJCWlmIChyZWFkbGluayhwYXRoLCB0YXJnZXQsIHN0LT5zdF9zaXplKzEpICE9IHN0LT5zdF9zaXplKSB7CisJCQljaGFyICplcnJzdHIgPSBzdHJlcnJvcihlcnJubyk7CisJCQlmcmVlKHRhcmdldCk7CisJCQlyZXR1cm4gZXJyb3IoInJlYWRsaW5rKFwiJXNcIik6ICVzIiwgcGF0aCwKKwkJCSAgICAgICAgICAgICBlcnJzdHIpOworCQl9CisJCWlmICghd3JpdGVfb2JqZWN0KSB7CisJCQl1bnNpZ25lZCBjaGFyIGhkcls1MF07CisJCQlpbnQgaGRybGVuOworCQkJd3JpdGVfc2hhMV9maWxlX3ByZXBhcmUodGFyZ2V0LCBzdC0+c3Rfc2l6ZSwgYmxvYl90eXBlLAorCQkJCQkJc2hhMSwgaGRyLCAmaGRybGVuKTsKKwkJfSBlbHNlIGlmICh3cml0ZV9zaGExX2ZpbGUodGFyZ2V0LCBzdC0+c3Rfc2l6ZSwgYmxvYl90eXBlLCBzaGExKSkKKwkJCXJldHVybiBlcnJvcigiJXM6IGZhaWxlZCB0byBpbnNlcnQgaW50byBkYXRhYmFzZSIsCisJCQkJICAgICBwYXRoKTsKKwkJZnJlZSh0YXJnZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZXJyb3IoIiVzOiB1bnN1cHBvcnRlZCBmaWxlIHR5cGUiLCBwYXRoKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zaGExX25hbWUuYyBiL3NoYTFfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YTA1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGExX25hbWUuYwpAQCAtMCwwICsxLDU0NSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAidGFnLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgImJsb2IuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyBpbnQgZmluZF9zaG9ydF9vYmplY3RfZmlsZW5hbWUoaW50IGxlbiwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqYWx0OworCWNoYXIgaGV4WzQwXTsKKwlpbnQgZm91bmQgPSAwOworCXN0YXRpYyBzdHJ1Y3QgYWx0ZXJuYXRlX29iamVjdF9kYXRhYmFzZSAqZmFrZWVudDsKKworCWlmICghZmFrZWVudCkgeworCQljb25zdCBjaGFyICpvYmpkaXIgPSBnZXRfb2JqZWN0X2RpcmVjdG9yeSgpOworCQlpbnQgb2JqZGlyX2xlbiA9IHN0cmxlbihvYmpkaXIpOworCQlpbnQgZW50bGVuID0gb2JqZGlyX2xlbiArIDQzOworCQlmYWtlZW50ID0geG1hbGxvYyhzaXplb2YoKmZha2VlbnQpICsgZW50bGVuKTsKKwkJbWVtY3B5KGZha2VlbnQtPmJhc2UsIG9iamRpciwgb2JqZGlyX2xlbik7CisJCWZha2VlbnQtPm5hbWUgPSBmYWtlZW50LT5iYXNlICsgb2JqZGlyX2xlbiArIDE7CisJCWZha2VlbnQtPm5hbWVbLTFdID0gJy8nOworCX0KKwlmYWtlZW50LT5uZXh0ID0gYWx0X29kYl9saXN0OworCisJc3ByaW50ZihoZXgsICIlLjJzIiwgbmFtZSk7CisJZm9yIChhbHQgPSBmYWtlZW50OyBhbHQgJiYgZm91bmQgPCAyOyBhbHQgPSBhbHQtPm5leHQpIHsKKwkJc3RydWN0IGRpcmVudCAqZGU7CisJCURJUiAqZGlyOworCQlzcHJpbnRmKGFsdC0+bmFtZSwgIiUuMnMvIiwgbmFtZSk7CisJCWRpciA9IG9wZW5kaXIoYWx0LT5iYXNlKTsKKwkJaWYgKCFkaXIpCisJCQljb250aW51ZTsKKwkJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQkJaWYgKHN0cmxlbihkZS0+ZF9uYW1lKSAhPSAzOCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChtZW1jbXAoZGUtPmRfbmFtZSwgbmFtZSArIDIsIGxlbiAtIDIpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFmb3VuZCkgeworCQkJCW1lbWNweShoZXggKyAyLCBkZS0+ZF9uYW1lLCAzOCk7CisJCQkJZm91bmQrKzsKKwkJCX0KKwkJCWVsc2UgaWYgKG1lbWNtcChoZXggKyAyLCBkZS0+ZF9uYW1lLCAzOCkpIHsKKwkJCQlmb3VuZCA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJY2xvc2VkaXIoZGlyKTsKKwl9CisJaWYgKGZvdW5kID09IDEpCisJCXJldHVybiBnZXRfc2hhMV9oZXgoaGV4LCBzaGExKSA9PSAwOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCBtYXRjaF9zaGEodW5zaWduZWQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICphLCBjb25zdCB1bnNpZ25lZCBjaGFyICpiKQoreworCWRvIHsKKwkJaWYgKCphICE9ICpiKQorCQkJcmV0dXJuIDA7CisJCWErKzsKKwkJYisrOworCQlsZW4gLT0gMjsKKwl9IHdoaWxlIChsZW4gPiAxKTsKKwlpZiAobGVuKQorCQlpZiAoKCphIF4gKmIpICYgMHhmMCkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGZpbmRfc2hvcnRfcGFja2VkX29iamVjdChpbnQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICptYXRjaCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcDsKKwl1bnNpZ25lZCBjaGFyIGZvdW5kX3NoYTFbMjBdOworCWludCBmb3VuZCA9IDA7CisKKwlwcmVwYXJlX3BhY2tlZF9naXQoKTsKKwlmb3IgKHAgPSBwYWNrZWRfZ2l0OyBwICYmIGZvdW5kIDwgMjsgcCA9IHAtPm5leHQpIHsKKwkJdW5zaWduZWQgbnVtID0gbnVtX3BhY2tlZF9vYmplY3RzKHApOworCQl1bnNpZ25lZCBmaXJzdCA9IDAsIGxhc3QgPSBudW07CisJCXdoaWxlIChmaXJzdCA8IGxhc3QpIHsKKwkJCXVuc2lnbmVkIG1pZCA9IChmaXJzdCArIGxhc3QpIC8gMjsKKwkJCXVuc2lnbmVkIGNoYXIgbm93WzIwXTsKKwkJCWludCBjbXA7CisKKwkJCW50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgbWlkLCBub3cpOworCQkJY21wID0gbWVtY21wKG1hdGNoLCBub3csIDIwKTsKKwkJCWlmICghY21wKSB7CisJCQkJZmlyc3QgPSBtaWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY21wID4gMCkgeworCQkJCWZpcnN0ID0gbWlkKzE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsYXN0ID0gbWlkOworCQl9CisJCWlmIChmaXJzdCA8IG51bSkgeworCQkJdW5zaWduZWQgY2hhciBub3dbMjBdLCBuZXh0WzIwXTsKKwkJCW50aF9wYWNrZWRfb2JqZWN0X3NoYTEocCwgZmlyc3QsIG5vdyk7CisJCQlpZiAobWF0Y2hfc2hhKGxlbiwgbWF0Y2gsIG5vdykpIHsKKwkJCQlpZiAobnRoX3BhY2tlZF9vYmplY3Rfc2hhMShwLCBmaXJzdCsxLCBuZXh0KSB8fAorCQkJCSAgICAhbWF0Y2hfc2hhKGxlbiwgbWF0Y2gsIG5leHQpKSB7CisJCQkJCS8qIHVuaXF1ZSB3aXRoaW4gdGhpcyBwYWNrICovCisJCQkJCWlmICghZm91bmQpIHsKKwkJCQkJCW1lbWNweShmb3VuZF9zaGExLCBub3csIDIwKTsKKwkJCQkJCWZvdW5kKys7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAobWVtY21wKGZvdW5kX3NoYTEsIG5vdywgMjApKSB7CisJCQkJCQlmb3VuZCA9IDI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJLyogbm90IGV2ZW4gdW5pcXVlIHdpdGhpbiB0aGlzIHBhY2sgKi8KKwkJCQkJZm91bmQgPSAyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGZvdW5kID09IDEpCisJCW1lbWNweShzaGExLCBmb3VuZF9zaGExLCAyMCk7CisJcmV0dXJuIGZvdW5kOworfQorCisjZGVmaW5lIFNIT1JUX05BTUVfTk9UX0ZPVU5EICgtMSkKKyNkZWZpbmUgU0hPUlRfTkFNRV9BTUJJR1VPVVMgKC0yKQorCitzdGF0aWMgaW50IGZpbmRfdW5pcXVlX3Nob3J0X29iamVjdChpbnQgbGVuLCBjaGFyICpjYW5vbmljYWwsCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgKnJlcywgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgaGFzX3VucGFja2VkLCBoYXNfcGFja2VkOworCXVuc2lnbmVkIGNoYXIgdW5wYWNrZWRfc2hhMVsyMF0sIHBhY2tlZF9zaGExWzIwXTsKKworCWhhc191bnBhY2tlZCA9IGZpbmRfc2hvcnRfb2JqZWN0X2ZpbGVuYW1lKGxlbiwgY2Fub25pY2FsLCB1bnBhY2tlZF9zaGExKTsKKwloYXNfcGFja2VkID0gZmluZF9zaG9ydF9wYWNrZWRfb2JqZWN0KGxlbiwgcmVzLCBwYWNrZWRfc2hhMSk7CisJaWYgKCFoYXNfdW5wYWNrZWQgJiYgIWhhc19wYWNrZWQpCisJCXJldHVybiBTSE9SVF9OQU1FX05PVF9GT1VORDsKKwlpZiAoMSA8IGhhc191bnBhY2tlZCB8fCAxIDwgaGFzX3BhY2tlZCkKKwkJcmV0dXJuIFNIT1JUX05BTUVfQU1CSUdVT1VTOworCWlmIChoYXNfdW5wYWNrZWQgIT0gaGFzX3BhY2tlZCkgeworCQltZW1jcHkoc2hhMSwgKGhhc19wYWNrZWQgPyBwYWNrZWRfc2hhMSA6IHVucGFja2VkX3NoYTEpLCAyMCk7CisJCXJldHVybiAwOworCX0KKwkvKiBCb3RoIGhhdmUgdW5pcXVlIG9uZXMgLS0gZG8gdGhleSBtYXRjaD8gKi8KKwlpZiAobWVtY21wKHBhY2tlZF9zaGExLCB1bnBhY2tlZF9zaGExLCAyMCkpCisJCXJldHVybiBTSE9SVF9OQU1FX0FNQklHVU9VUzsKKwltZW1jcHkoc2hhMSwgcGFja2VkX3NoYTEsIDIwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfc2hvcnRfc2hhMShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExLAorCQkJICBpbnQgcXVpZXRseSkKK3sKKwlpbnQgaSwgc3RhdHVzOworCWNoYXIgY2Fub25pY2FsWzQwXTsKKwl1bnNpZ25lZCBjaGFyIHJlc1syMF07CisKKwlpZiAobGVuIDwgTUlOSU1VTV9BQkJSRVYpCisJCXJldHVybiAtMTsKKwltZW1zZXQocmVzLCAwLCAyMCk7CisJbWVtc2V0KGNhbm9uaWNhbCwgJ3gnLCA0MCk7CisJZm9yIChpID0gMDsgaSA8IGxlbiA7aSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IG5hbWVbaV07CisJCXVuc2lnbmVkIGNoYXIgdmFsOworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQl2YWwgPSBjIC0gJzAnOworCQllbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKKwkJCXZhbCA9IGMgLSAnYScgKyAxMDsKKwkJZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSdGJykgeworCQkJdmFsID0gYyAtICdBJyArIDEwOworCQkJYyAtPSAnQScgLSAnYSc7CisJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQljYW5vbmljYWxbaV0gPSBjOworCQlpZiAoIShpICYgMSkpCisJCQl2YWwgPDw9IDQ7CisJCXJlc1tpID4+IDFdIHw9IHZhbDsKKwl9CisKKwlzdGF0dXMgPSBmaW5kX3VuaXF1ZV9zaG9ydF9vYmplY3QoaSwgY2Fub25pY2FsLCByZXMsIHNoYTEpOworCWlmICghcXVpZXRseSAmJiAoc3RhdHVzID09IFNIT1JUX05BTUVfQU1CSUdVT1VTKSkKKwkJcmV0dXJuIGVycm9yKCJzaG9ydCBTSEExICUuKnMgaXMgYW1iaWd1b3VzLiIsIGxlbiwgY2Fub25pY2FsKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitjb25zdCBjaGFyICpmaW5kX3VuaXF1ZV9hYmJyZXYoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgaW50IGxlbikKK3sKKwlpbnQgc3RhdHVzLCBpc19udWxsOworCXN0YXRpYyBjaGFyIGhleFs0MV07CisKKwlpc19udWxsID0gIW1lbWNtcChzaGExLCBudWxsX3NoYTEsIDIwKTsKKwltZW1jcHkoaGV4LCBzaGExX3RvX2hleChzaGExKSwgNDApOworCWlmIChsZW4gPT0gNDAgfHwgIWxlbikKKwkJcmV0dXJuIGhleDsKKwl3aGlsZSAobGVuIDwgNDApIHsKKwkJdW5zaWduZWQgY2hhciBzaGExX3JldFsyMF07CisJCXN0YXR1cyA9IGdldF9zaG9ydF9zaGExKGhleCwgbGVuLCBzaGExX3JldCwgMSk7CisJCWlmICghc3RhdHVzIHx8CisJCSAgICAoaXNfbnVsbCAmJiBzdGF0dXMgIT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpKSB7CisJCQloZXhbbGVuXSA9IDA7CisJCQlyZXR1cm4gaGV4OworCQl9CisJCWlmIChzdGF0dXMgIT0gU0hPUlRfTkFNRV9BTUJJR1VPVVMpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuKys7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGFtYmlndW91c19wYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGludCBsZW4pCit7CisJaW50IHNsYXNoID0gMTsKKwlpbnQgY250OworCisJZm9yIChjbnQgPSAwOyBjbnQgPCBsZW47IGNudCsrKSB7CisJCXN3aXRjaCAoKnBhdGgrKykgeworCQljYXNlICdcMCc6CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQlpZiAoc2xhc2gpCisJCQkJYnJlYWs7CisJCQlzbGFzaCA9IDE7CisJCQljb250aW51ZTsKKwkJY2FzZSAnLic6CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCXNsYXNoID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc2xhc2g7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfYmFzaWMoY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpmbXRbXSA9IHsKKwkJIiUuKnMiLAorCQkicmVmcy8lLipzIiwKKwkJInJlZnMvdGFncy8lLipzIiwKKwkJInJlZnMvaGVhZHMvJS4qcyIsCisJCSJyZWZzL3JlbW90ZXMvJS4qcyIsCisJCSJyZWZzL3JlbW90ZXMvJS4qcy9IRUFEIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKndhcm5pbmcgPSAid2FybmluZzogcmVmbmFtZSAnJS4qcycgaXMgYW1iaWd1b3VzLlxuIjsKKwljb25zdCBjaGFyICoqcCwgKnBhdGhuYW1lOworCWNoYXIgKnJlYWxfcGF0aCA9IE5VTEw7CisJaW50IHJlZnNfZm91bmQgPSAwLCBhbTsKKwl1bnNpZ25lZCBsb25nIGF0X3RpbWUgPSAodW5zaWduZWQgbG9uZyktMTsKKwl1bnNpZ25lZCBjaGFyICp0aGlzX3Jlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFfZnJvbV9yZWZbMjBdOworCisJaWYgKGxlbiA9PSA0MCAmJiAhZ2V0X3NoYTFfaGV4KHN0ciwgc2hhMSkpCisJCXJldHVybiAwOworCisJLyogQXQgYSBnaXZlbiBwZXJpb2Qgb2YgdGltZT8gIkB7MiBob3VycyBhZ299IiAqLworCWZvciAoYW0gPSAxOyBhbSA8IGxlbiAtIDE7IGFtKyspIHsKKwkJaWYgKHN0clthbV0gPT0gJ0AnICYmIHN0clthbSsxXSA9PSAneycgJiYgc3RyW2xlbi0xXSA9PSAnfScpIHsKKwkJCWludCBkYXRlX2xlbiA9IGxlbiAtIGFtIC0gMzsKKwkJCWNoYXIgKmRhdGVfc3BlYyA9IHhtYWxsb2MoZGF0ZV9sZW4gKyAxKTsKKwkJCXN0cmxjcHkoZGF0ZV9zcGVjLCBzdHIgKyBhbSArIDIsIGRhdGVfbGVuICsgMSk7CisJCQlhdF90aW1lID0gYXBwcm94aWRhdGUoZGF0ZV9zcGVjKTsKKwkJCWZyZWUoZGF0ZV9zcGVjKTsKKwkJCWxlbiA9IGFtOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBBY2NlcHQgb25seSB1bmFtYmlndW91cyByZWYgcGF0aHMuICovCisJaWYgKGFtYmlndW91c19wYXRoKHN0ciwgbGVuKSkKKwkJcmV0dXJuIC0xOworCisJZm9yIChwID0gZm10OyAqcDsgcCsrKSB7CisJCXRoaXNfcmVzdWx0ID0gcmVmc19mb3VuZCA/IHNoYTFfZnJvbV9yZWYgOiBzaGExOworCQlwYXRobmFtZSA9IHJlc29sdmVfcmVmKGdpdF9wYXRoKCpwLCBsZW4sIHN0ciksIHRoaXNfcmVzdWx0LCAxKTsKKwkJaWYgKHBhdGhuYW1lKSB7CisJCQlpZiAoIXJlZnNfZm91bmQrKykKKwkJCQlyZWFsX3BhdGggPSBzdHJkdXAocGF0aG5hbWUpOworCQkJaWYgKCF3YXJuX2FtYmlndW91c19yZWZzKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFyZWZzX2ZvdW5kKQorCQlyZXR1cm4gLTE7CisKKwlpZiAod2Fybl9hbWJpZ3VvdXNfcmVmcyAmJiByZWZzX2ZvdW5kID4gMSkKKwkJZnByaW50ZihzdGRlcnIsIHdhcm5pbmcsIGxlbiwgc3RyKTsKKworCWlmIChhdF90aW1lICE9ICh1bnNpZ25lZCBsb25nKS0xKSB7CisJCXJlYWRfcmVmX2F0KAorCQkJcmVhbF9wYXRoICsgc3RybGVuKGdpdF9wYXRoKCIuIikpIC0gMSwKKwkJCWF0X3RpbWUsCisJCQlzaGExKTsKKwl9CisKKwlmcmVlKHJlYWxfcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NoYTFfMShjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworc3RhdGljIGludCBnZXRfcGFyZW50KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCByZXQgPSBnZXRfc2hhMV8xKG5hbWUsIGxlbiwgc2hhMSk7CisJc3RydWN0IGNvbW1pdCAqY29tbWl0OworCXN0cnVjdCBjb21taXRfbGlzdCAqcDsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJY29tbWl0ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2Uoc2hhMSk7CisJaWYgKCFjb21taXQpCisJCXJldHVybiAtMTsKKwlpZiAocGFyc2VfY29tbWl0KGNvbW1pdCkpCisJCXJldHVybiAtMTsKKwlpZiAoIWlkeCkgeworCQltZW1jcHkocmVzdWx0LCBjb21taXQtPm9iamVjdC5zaGExLCAyMCk7CisJCXJldHVybiAwOworCX0KKwlwID0gY29tbWl0LT5wYXJlbnRzOworCXdoaWxlIChwKSB7CisJCWlmICghLS1pZHgpIHsKKwkJCW1lbWNweShyZXN1bHQsIHAtPml0ZW0tPm9iamVjdC5zaGExLCAyMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwID0gcC0+bmV4dDsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdldF9udGhfYW5jZXN0b3IoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICpyZXN1bHQsIGludCBnZW5lcmF0aW9uKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJaW50IHJldCA9IGdldF9zaGExXzEobmFtZSwgbGVuLCBzaGExKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJd2hpbGUgKGdlbmVyYXRpb24tLSkgeworCQlzdHJ1Y3QgY29tbWl0ICpjb21taXQgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKKworCQlpZiAoIWNvbW1pdCB8fCBwYXJzZV9jb21taXQoY29tbWl0KSB8fCAhY29tbWl0LT5wYXJlbnRzKQorCQkJcmV0dXJuIC0xOworCQltZW1jcHkoc2hhMSwgY29tbWl0LT5wYXJlbnRzLT5pdGVtLT5vYmplY3Quc2hhMSwgMjApOworCX0KKwltZW1jcHkocmVzdWx0LCBzaGExLCAyMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVlbF9vbmlvbihjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCXVuc2lnbmVkIGNoYXIgb3V0ZXJbMjBdOworCWNvbnN0IGNoYXIgKnNwOworCXVuc2lnbmVkIGludCBleHBlY3RlZF90eXBlID0gMDsKKwlzdHJ1Y3Qgb2JqZWN0ICpvOworCisJLyoKKwkgKiAicmVmXnt0eXBlfSIgZGVyZWZlcmVuY2VzIHJlZiByZXBlYXRlZGx5IHVudGlsIHlvdSBjYW5ub3QKKwkgKiBkZXJlZmVyZW5jZSBhbnltb3JlLCBvciB5b3UgZ2V0IGFuIG9iamVjdCBvZiBnaXZlbiB0eXBlLAorCSAqIHdoaWNoZXZlciBjb21lcyBmaXJzdC4gICJyZWZee30iIG1lYW5zIGp1c3QgZGVyZWZlcmVuY2UKKwkgKiB0YWdzIHVudGlsIHlvdSBnZXQgYSBub24tdGFnLiAgInJlZl4wIiBpcyBhIHNob3J0aGFuZCBmb3IKKwkgKiAicmVmXntjb21taXR9Ii4gICJjb21taXRee3RyZWV9IiBjb3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlCisJICogdG9wLWxldmVsIHRyZWUgb2YgdGhlIGdpdmVuIGNvbW1pdC4KKwkgKi8KKwlpZiAobGVuIDwgNCB8fCBuYW1lW2xlbi0xXSAhPSAnfScpCisJCXJldHVybiAtMTsKKworCWZvciAoc3AgPSBuYW1lICsgbGVuIC0gMTsgbmFtZSA8PSBzcDsgc3AtLSkgeworCQlpbnQgY2ggPSAqc3A7CisJCWlmIChjaCA9PSAneycgJiYgbmFtZSA8IHNwICYmIHNwWy0xXSA9PSAnXicpCisJCQlicmVhazsKKwl9CisJaWYgKHNwIDw9IG5hbWUpCisJCXJldHVybiAtMTsKKworCXNwKys7IC8qIGJlZ2lubmluZyBvZiB0eXBlIG5hbWUsIG9yIGNsb3NpbmcgYnJhY2UgZm9yIGVtcHR5ICovCisJaWYgKCFzdHJuY21wKGNvbW1pdF90eXBlLCBzcCwgNikgJiYgc3BbNl0gPT0gJ30nKQorCQlleHBlY3RlZF90eXBlID0gT0JKX0NPTU1JVDsKKwllbHNlIGlmICghc3RybmNtcCh0cmVlX3R5cGUsIHNwLCA0KSAmJiBzcFs0XSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfVFJFRTsKKwllbHNlIGlmICghc3RybmNtcChibG9iX3R5cGUsIHNwLCA0KSAmJiBzcFs0XSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfQkxPQjsKKwllbHNlIGlmIChzcFswXSA9PSAnfScpCisJCWV4cGVjdGVkX3R5cGUgPSBPQkpfTk9ORTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmIChnZXRfc2hhMV8xKG5hbWUsIHNwIC0gbmFtZSAtIDIsIG91dGVyKSkKKwkJcmV0dXJuIC0xOworCisJbyA9IHBhcnNlX29iamVjdChvdXRlcik7CisJaWYgKCFvKQorCQlyZXR1cm4gLTE7CisJaWYgKCFleHBlY3RlZF90eXBlKSB7CisJCW8gPSBkZXJlZl90YWcobywgbmFtZSwgc3AgLSBuYW1lIC0gMik7CisJCWlmICghbyB8fCAoIW8tPnBhcnNlZCAmJiAhcGFyc2Vfb2JqZWN0KG8tPnNoYTEpKSkKKwkJCXJldHVybiAtMTsKKwkJbWVtY3B5KHNoYTEsIG8tPnNoYTEsIDIwKTsKKwl9CisJZWxzZSB7CisJCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBzeW50YXggbG9vayBjb3JyZWN0LCBzbworCQkgKiBpZiB3ZSBkbyBub3QgZ2V0IHRoZSBuZWVkZWQgb2JqZWN0LCB3ZSBzaG91bGQKKwkJICogYmFyZi4KKwkJICovCisKKwkJd2hpbGUgKDEpIHsKKwkJCWlmICghbyB8fCAoIW8tPnBhcnNlZCAmJiAhcGFyc2Vfb2JqZWN0KG8tPnNoYTEpKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoby0+dHlwZSA9PSBleHBlY3RlZF90eXBlKSB7CisJCQkJbWVtY3B5KHNoYTEsIG8tPnNoYTEsIDIwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChvLT50eXBlID09IE9CSl9UQUcpCisJCQkJbyA9ICgoc3RydWN0IHRhZyopIG8pLT50YWdnZWQ7CisJCQllbHNlIGlmIChvLT50eXBlID09IE9CSl9DT01NSVQpCisJCQkJbyA9ICYoKChzdHJ1Y3QgY29tbWl0ICopIG8pLT50cmVlLT5vYmplY3QpOworCQkJZWxzZQorCQkJCXJldHVybiBlcnJvcigiJS4qczogZXhwZWN0ZWQgJXMgdHlwZSwgYnV0IHRoZSBvYmplY3QgZGVyZWZlcmVuY2VzIHRvICVzIHR5cGUiLAorCQkJCQkgICAgIGxlbiwgbmFtZSwgdHlwZW5hbWUoZXhwZWN0ZWRfdHlwZSksCisJCQkJCSAgICAgdHlwZW5hbWUoby0+dHlwZSkpOworCQkJaWYgKCFvLT5wYXJzZWQpCisJCQkJcGFyc2Vfb2JqZWN0KG8tPnNoYTEpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9zaGExXzEoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpbnQgcmV0LCBoYXNfc3VmZml4OworCWNvbnN0IGNoYXIgKmNwOworCisJLyogIm5hbWV+MyIgaXMgIm5hbWVeXl4iLAorCSAqICJuYW1lfiIgYW5kICJuYW1lfjAiIGFyZSBuYW1lIC0tIG5vdCAibmFtZV4wIiEKKwkgKiAibmFtZV4iIGlzIG5vdCAibmFtZV4wIjsgaXQgaXMgIm5hbWVeMSIuCisJICovCisJaGFzX3N1ZmZpeCA9IDA7CisJZm9yIChjcCA9IG5hbWUgKyBsZW4gLSAxOyBuYW1lIDw9IGNwOyBjcC0tKSB7CisJCWludCBjaCA9ICpjcDsKKwkJaWYgKCcwJyA8PSBjaCAmJiBjaCA8PSAnOScpCisJCQljb250aW51ZTsKKwkJaWYgKGNoID09ICd+JyB8fCBjaCA9PSAnXicpCisJCQloYXNfc3VmZml4ID0gY2g7CisJCWJyZWFrOworCX0KKworCWlmIChoYXNfc3VmZml4KSB7CisJCWludCBudW0gPSAwOworCQlpbnQgbGVuMSA9IGNwIC0gbmFtZTsKKwkJY3ArKzsKKwkJd2hpbGUgKGNwIDwgbmFtZSArIGxlbikKKwkJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJCWlmIChoYXNfc3VmZml4ID09ICdeJykgeworCQkJaWYgKCFudW0gJiYgbGVuMSA9PSBsZW4gLSAxKQorCQkJCW51bSA9IDE7CisJCQlyZXR1cm4gZ2V0X3BhcmVudChuYW1lLCBsZW4xLCBzaGExLCBudW0pOworCQl9CisJCS8qIGVsc2UgaWYgKGhhc19zdWZmaXggPT0gJ34nKSAtLSBnb2VzIHdpdGhvdXQgc2F5aW5nICovCisJCXJldHVybiBnZXRfbnRoX2FuY2VzdG9yKG5hbWUsIGxlbjEsIHNoYTEsIG51bSk7CisJfQorCisJcmV0ID0gcGVlbF9vbmlvbihuYW1lLCBsZW4sIHNoYTEpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGdldF9zaGExX2Jhc2ljKG5hbWUsIGxlbiwgc2hhMSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCXJldHVybiBnZXRfc2hvcnRfc2hhMShuYW1lLCBsZW4sIHNoYTEsIDApOworfQorCisvKgorICogVGhpcyBpcyBsaWtlICJnZXRfc2hhMV9iYXNpYygpIiwgZXhjZXB0IGl0IGFsbG93cyAic2hhMSBleHByZXNzaW9ucyIsCisgKiBub3RhYmx5ICJ4eXpeIiBmb3IgInBhcmVudCBvZiB4eXoiCisgKi8KK2ludCBnZXRfc2hhMShjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWludCByZXQsIGJyYWNrZXRfZGVwdGg7CisJdW5zaWduZWQgdW51c2VkOworCWludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWNvbnN0IGNoYXIgKmNwOworCisJcHJlcGFyZV9hbHRfb2RiKCk7CisJcmV0ID0gZ2V0X3NoYTFfMShuYW1lLCBuYW1lbGVuLCBzaGExKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIHJldDsKKwkvKiBzaGExOnBhdGggLS0+IG9iamVjdCBuYW1lIG9mIHBhdGggaW4gZW50IHNoYTEKKwkgKiA6cGF0aCAtPiBvYmplY3QgbmFtZSBvZiBwYXRoIGluIGluZGV4CisJICogOlswLTNdOnBhdGggLT4gb2JqZWN0IG5hbWUgb2YgcGF0aCBpbiBpbmRleCBhdCBzdGFnZQorCSAqLworCWlmIChuYW1lWzBdID09ICc6JykgeworCQlpbnQgc3RhZ2UgPSAwOworCQlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCQlpbnQgcG9zOworCQlpZiAobmFtZWxlbiA8IDMgfHwKKwkJICAgIG5hbWVbMl0gIT0gJzonIHx8CisJCSAgICBuYW1lWzFdIDwgJzAnIHx8ICczJyA8IG5hbWVbMV0pCisJCQljcCA9IG5hbWUgKyAxOworCQllbHNlIHsKKwkJCXN0YWdlID0gbmFtZVsxXSAtICcwJzsKKwkJCWNwID0gbmFtZSArIDM7CisJCX0KKwkJbmFtZWxlbiA9IG5hbWVsZW4gLSAoY3AgLSBuYW1lKTsKKwkJaWYgKCFhY3RpdmVfY2FjaGUpCisJCQlyZWFkX2NhY2hlKCk7CisJCWlmIChhY3RpdmVfbnIgPCAwKQorCQkJcmV0dXJuIC0xOworCQlwb3MgPSBjYWNoZV9uYW1lX3BvcyhjcCwgbmFtZWxlbik7CisJCWlmIChwb3MgPCAwKQorCQkJcG9zID0gLXBvcyAtIDE7CisJCXdoaWxlIChwb3MgPCBhY3RpdmVfbnIpIHsKKwkJCWNlID0gYWN0aXZlX2NhY2hlW3Bvc107CisJCQlpZiAoY2VfbmFtZWxlbihjZSkgIT0gbmFtZWxlbiB8fAorCQkJICAgIG1lbWNtcChjZS0+bmFtZSwgY3AsIG5hbWVsZW4pKQorCQkJCWJyZWFrOworCQkJaWYgKGNlX3N0YWdlKGNlKSA9PSBzdGFnZSkgeworCQkJCW1lbWNweShzaGExLCBjZS0+c2hhMSwgMjApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcG9zKys7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGNwID0gbmFtZSwgYnJhY2tldF9kZXB0aCA9IDA7ICpjcDsgY3ArKykgeworCQlpZiAoKmNwID09ICd7JykKKwkJCWJyYWNrZXRfZGVwdGgrKzsKKwkJZWxzZSBpZiAoYnJhY2tldF9kZXB0aCAmJiAqY3AgPT0gJ30nKQorCQkJYnJhY2tldF9kZXB0aC0tOworCQllbHNlIGlmICghYnJhY2tldF9kZXB0aCAmJiAqY3AgPT0gJzonKQorCQkJYnJlYWs7CisJfQorCWlmICgqY3AgPT0gJzonKSB7CisJCXVuc2lnbmVkIGNoYXIgdHJlZV9zaGExWzIwXTsKKwkJaWYgKCFnZXRfc2hhMV8xKG5hbWUsIGNwLW5hbWUsIHRyZWVfc2hhMSkpCisJCQlyZXR1cm4gZ2V0X3RyZWVfZW50cnkodHJlZV9zaGExLCBjcCsxLCBzaGExLAorCQkJCQkgICAgICAmdW51c2VkKTsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NoZWxsLmMgYi9zaGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDhjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC5jCkBAIC0wLDAgKzEsNjEgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKworc3RhdGljIGludCBkb19nZW5lcmljX2NtZChjb25zdCBjaGFyICptZSwgY2hhciAqYXJnKQoreworCWNvbnN0IGNoYXIgKm15X2FyZ3ZbNF07CisKKwlpZiAoIWFyZyB8fCAhKGFyZyA9IHNxX2RlcXVvdGUoYXJnKSkpCisJCWRpZSgiYmFkIGFyZ3VtZW50Iik7CisJaWYgKHN0cm5jbXAobWUsICJnaXQtIiwgNCkpCisJCWRpZSgiYmFkIGNvbW1hbmQiKTsKKworCW15X2FyZ3ZbMF0gPSBtZSArIDQ7CisJbXlfYXJndlsxXSA9IGFyZzsKKwlteV9hcmd2WzJdID0gTlVMTDsKKworCXJldHVybiBleGVjdl9naXRfY21kKG15X2FyZ3YpOworfQorCitzdGF0aWMgc3RydWN0IGNvbW1hbmRzIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmV4ZWMpKGNvbnN0IGNoYXIgKm1lLCBjaGFyICphcmcpOworfSBjbWRfbGlzdFtdID0geworCXsgImdpdC1yZWNlaXZlLXBhY2siLCBkb19nZW5lcmljX2NtZCB9LAorCXsgImdpdC11cGxvYWQtcGFjayIsIGRvX2dlbmVyaWNfY21kIH0sCisJeyBOVUxMIH0sCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqcHJvZzsKKwlzdHJ1Y3QgY29tbWFuZHMgKmNtZDsKKworCS8qIFdlIHdhbnQgdG8gc2VlICItYyBjbWQgYXJncyIsIGFuZCBub3RoaW5nIGVsc2UgKi8KKwlpZiAoYXJnYyAhPSAzIHx8IHN0cmNtcChhcmd2WzFdLCAiLWMiKSkKKwkJZGllKCJXaGF0IGRvIHlvdSB0aGluayBJIGFtPyBBIHNoZWxsPyIpOworCisJcHJvZyA9IGFyZ3ZbMl07CisJYXJndiArPSAyOworCWFyZ2MgLT0gMjsKKwlmb3IgKGNtZCA9IGNtZF9saXN0IDsgY21kLT5uYW1lIDsgY21kKyspIHsKKwkJaW50IGxlbiA9IHN0cmxlbihjbWQtPm5hbWUpOworCQljaGFyICphcmc7CisJCWlmIChzdHJuY21wKGNtZC0+bmFtZSwgcHJvZywgbGVuKSkKKwkJCWNvbnRpbnVlOworCQlhcmcgPSBOVUxMOworCQlzd2l0Y2ggKHByb2dbbGVuXSkgeworCQljYXNlICdcMCc6CisJCQlhcmcgPSBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQkJYXJnID0gcHJvZyArIGxlbiArIDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWV4aXQoY21kLT5leGVjKGNtZC0+bmFtZSwgYXJnKSk7CisJfQorCWRpZSgidW5yZWNvZ25pemVkIGNvbW1hbmQgJyVzJyIsIHByb2cpOworfQpkaWZmIC0tZ2l0IGEvc2hvdy1pbmRleC5jIGIvc2hvdy1pbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMWQ2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaG93LWluZGV4LmMKQEAgLTAsMCArMSwyOCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBucjsKKwl1bnNpZ25lZCBpbnQgZW50cnlbNl07CisJc3RhdGljIHVuc2lnbmVkIGludCB0b3BfaW5kZXhbMjU2XTsKKworCWlmIChmcmVhZCh0b3BfaW5kZXgsIHNpemVvZih0b3BfaW5kZXgpLCAxLCBzdGRpbikgIT0gMSkKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBpZGV4Iik7CisJbnIgPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQl1bnNpZ25lZCBuID0gbnRvaGwodG9wX2luZGV4W2ldKTsKKwkJaWYgKG4gPCBucikKKwkJCWRpZSgiY29ycnVwdCBpbmRleCBmaWxlIik7CisJCW5yID0gbjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJdW5zaWduZWQgb2Zmc2V0OworCisJCWlmIChmcmVhZChlbnRyeSwgMjQsIDEsIHN0ZGluKSAhPSAxKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCBlbnRyeSAldS8ldSIsIGksIG5yKTsKKwkJb2Zmc2V0ID0gbnRvaGwoZW50cnlbMF0pOworCQlwcmludGYoIiV1ICVzXG4iLCBvZmZzZXQsIHNoYTFfdG9faGV4KCh2b2lkICopKGVudHJ5KzEpKSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3NoLWZldGNoLmMgYi9zc2gtZmV0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q4ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3NoLWZldGNoLmMKQEAgLTAsMCArMSwxNzUgQEAKKyNpZm5kZWYgQ09VTlRFUlBBUlRfRU5WX05BTUUKKyNkZWZpbmUgQ09VTlRFUlBBUlRfRU5WX05BTUUgIkdJVF9TU0hfVVBMT0FEIgorI2VuZGlmCisjaWZuZGVmIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRQorI2RlZmluZSBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUUgImdpdC1zc2gtdXBsb2FkIgorI2VuZGlmCisjaWZuZGVmIE1ZX1BST0dSQU1fTkFNRQorI2RlZmluZSBNWV9QUk9HUkFNX05BTUUgImdpdC1zc2gtZmV0Y2giCisjZW5kaWYKKworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY29tbWl0LmgiCisjaW5jbHVkZSAicnNoLmgiCisjaW5jbHVkZSAiZmV0Y2guaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKK3N0YXRpYyBpbnQgZmRfaW47CitzdGF0aWMgaW50IGZkX291dDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9jYWxfdmVyc2lvbiA9IDE7CisKK3N0YXRpYyBzc2l6ZV90IGZvcmNlX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQoreworCXNzaXplX3QgcmV0ID0gMDsKKwl3aGlsZSAocmV0IDwgbGVuZ3RoKSB7CisJCXNzaXplX3Qgc2l6ZSA9IHdyaXRlKGZkLCAoY2hhciAqKSBidWZmZXIgKyByZXQsIGxlbmd0aCAtIHJldCk7CisJCWlmIChzaXplIDwgMCkgeworCQkJcmV0dXJuIHNpemU7CisJCX0KKwkJaWYgKHNpemUgPT0gMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgKz0gc2l6ZTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwcmVmZXRjaGVzID0gMDsKKworc3RhdGljIHN0cnVjdCBvYmplY3RfbGlzdCAqaW5fdHJhbnNpdCA9IE5VTEw7CitzdGF0aWMgc3RydWN0IG9iamVjdF9saXN0ICoqZW5kX29mX3RyYW5zaXQgPSAmaW5fdHJhbnNpdDsKKwordm9pZCBwcmVmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQoreworCWNoYXIgdHlwZSA9ICdvJzsKKwlzdHJ1Y3Qgb2JqZWN0X2xpc3QgKm5vZGU7CisJaWYgKHByZWZldGNoZXMgPiAxMDApIHsKKwkJZmV0Y2goaW5fdHJhbnNpdC0+aXRlbS0+c2hhMSk7CisJfQorCW5vZGUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqZWN0X2xpc3QpKTsKKwlub2RlLT5uZXh0ID0gTlVMTDsKKwlub2RlLT5pdGVtID0gbG9va3VwX3Vua25vd25fb2JqZWN0KHNoYTEpOworCSplbmRfb2ZfdHJhbnNpdCA9IG5vZGU7CisJZW5kX29mX3RyYW5zaXQgPSAmbm9kZS0+bmV4dDsKKwlmb3JjZV93cml0ZShmZF9vdXQsICZ0eXBlLCAxKTsKKwlmb3JjZV93cml0ZShmZF9vdXQsIHNoYTEsIDIwKTsKKwlwcmVmZXRjaGVzKys7Cit9CisKK3N0YXRpYyBjaGFyIGNvbm5fYnVmWzQwOTZdOworc3RhdGljIHNpemVfdCBjb25uX2J1Zl9wb3NuID0gMDsKKworaW50IGZldGNoKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJaW50IHJldDsKKwlzaWduZWQgY2hhciByZW1vdGU7CisJc3RydWN0IG9iamVjdF9saXN0ICp0ZW1wOworCisJaWYgKG1lbWNtcChzaGExLCBpbl90cmFuc2l0LT5pdGVtLT5zaGExLCAyMCkpIHsKKwkJLyogd2UgbXVzdCBoYXZlIGFscmVhZHkgZmV0Y2hlZCBpdCB0byBjbGVhbiB0aGUgcXVldWUgKi8KKwkJcmV0dXJuIGhhc19zaGExX2ZpbGUoc2hhMSkgPyAwIDogLTE7CisJfQorCXByZWZldGNoZXMtLTsKKwl0ZW1wID0gaW5fdHJhbnNpdDsKKwlpbl90cmFuc2l0ID0gaW5fdHJhbnNpdC0+bmV4dDsKKwlpZiAoIWluX3RyYW5zaXQpCisJCWVuZF9vZl90cmFuc2l0ID0gJmluX3RyYW5zaXQ7CisJZnJlZSh0ZW1wKTsKKworCWlmIChjb25uX2J1Zl9wb3NuKSB7CisJCXJlbW90ZSA9IGNvbm5fYnVmWzBdOworCQltZW1tb3ZlKGNvbm5fYnVmLCBjb25uX2J1ZiArIDEsIC0tY29ubl9idWZfcG9zbik7CisJfSBlbHNlIHsKKwkJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGUsIDEpIDwgMSkKKwkJCXJldHVybiAtMTsKKwl9CisJLyogZnByaW50ZihzdGRlcnIsICJHb3QgJWRcbiIsIHJlbW90ZSk7ICovCisJaWYgKHJlbW90ZSA8IDApCisJCXJldHVybiByZW1vdGU7CisJcmV0ID0gd3JpdGVfc2hhMV9mcm9tX2ZkKHNoYTEsIGZkX2luLCBjb25uX2J1ZiwgNDA5NiwgJmNvbm5fYnVmX3Bvc24pOworCWlmICghcmV0KQorCQlwdWxsX3NheSgiZ290ICVzXG4iLCBzaGExX3RvX2hleChzaGExKSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfdmVyc2lvbih2b2lkKQoreworCWNoYXIgdHlwZSA9ICd2JzsKKwl3cml0ZShmZF9vdXQsICZ0eXBlLCAxKTsKKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpIHsKKwkJcmV0dXJuIGVycm9yKCJDb3VsZG4ndCByZWFkIHZlcnNpb24gZnJvbSByZW1vdGUgZW5kIik7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZmV0Y2hfcmVmKGNoYXIgKnJlZiwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzaWduZWQgY2hhciByZW1vdGU7CisJY2hhciB0eXBlID0gJ3InOworCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworCXdyaXRlKGZkX291dCwgcmVmLCBzdHJsZW4ocmVmKSArIDEpOworCXJlYWQoZmRfaW4sICZyZW1vdGUsIDEpOworCWlmIChyZW1vdGUgPCAwKQorCQlyZXR1cm4gcmVtb3RlOworCXJlYWQoZmRfaW4sIHNoYTEsIDIwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc3NoX2ZldGNoX3VzYWdlW10gPQorICBNWV9QUk9HUkFNX05BTUUKKyAgIiBbLWNdIFstdF0gWy1hXSBbLXZdIFstLXJlY292ZXJdIFstdyByZWZdIGNvbW1pdC1pZCB1cmwiOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKndyaXRlX3JlZiA9IE5VTEw7CisJY2hhciAqY29tbWl0X2lkOworCWNoYXIgKnVybDsKKwlpbnQgYXJnID0gMTsKKwljb25zdCBjaGFyICpwcm9nOworCisJcHJvZyA9IGdldGVudigiR0lUX1NTSF9QVVNIIik7CisJaWYgKCFwcm9nKSBwcm9nID0gImdpdC1zc2gtdXBsb2FkIjsKKworCXNldHVwX2lkZW50KCk7CisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKwkJaWYgKGFyZ3ZbYXJnXVsxXSA9PSAndCcpIHsKKwkJCWdldF90cmVlID0gMTsKKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2MnKSB7CisJCQlnZXRfaGlzdG9yeSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdhJykgeworCQkJZ2V0X2FsbCA9IDE7CisJCQlnZXRfdHJlZSA9IDE7CisJCQlnZXRfaGlzdG9yeSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykgeworCQkJZ2V0X3ZlcmJvc2VseSA9IDE7CisJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd3JykgeworCQkJd3JpdGVfcmVmID0gYXJndlthcmcgKyAxXTsKKwkJCWFyZysrOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpIHsKKwkJCWdldF9yZWNvdmVyID0gMTsKKwkJfQorCQlhcmcrKzsKKwl9CisJaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CisJCXVzYWdlKHNzaF9mZXRjaF91c2FnZSk7CisJCXJldHVybiAxOworCX0KKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisJdXJsID0gYXJndlthcmcgKyAxXTsKKworCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgcHJvZywgdXJsLCBhcmcsIGFyZ3YgKyAxKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZ2V0X3ZlcnNpb24oKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAocHVsbCgxLCAmY29tbWl0X2lkLCAmd3JpdGVfcmVmLCB1cmwpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3NoLXB1bGwuYyBiL3NzaC1wdWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4Y2U0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NzaC1wdWxsLmMKQEAgLTAsMCArMSw0IEBACisjZGVmaW5lIENPVU5URVJQQVJUX0VOVl9OQU1FICJHSVRfU1NIX1BVU0giCisjZGVmaW5lIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRSAiZ2l0LXNzaC1wdXNoIgorI2RlZmluZSBNWV9QUk9HUkFNX05BTUUgImdpdC1zc2gtcHVsbCIKKyNpbmNsdWRlICJzc2gtZmV0Y2guYyIKZGlmZiAtLWdpdCBhL3NzaC1wdXNoLmMgYi9zc2gtcHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjJkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zc2gtcHVzaC5jCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBDT1VOVEVSUEFSVF9FTlZfTkFNRSAiR0lUX1NTSF9QVUxMIgorI2RlZmluZSBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUUgImdpdC1zc2gtcHVsbCIKKyNkZWZpbmUgTVlfUFJPR1JBTV9OQU1FICJnaXQtc3NoLXB1c2giCisjaW5jbHVkZSAic3NoLXVwbG9hZC5jIgpkaWZmIC0tZ2l0IGEvc3NoLXVwbG9hZC5jIGIvc3NoLXVwbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTY2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zc2gtdXBsb2FkLmMKQEAgLTAsMCArMSwxNDYgQEAKKyNpZm5kZWYgQ09VTlRFUlBBUlRfRU5WX05BTUUKKyNkZWZpbmUgQ09VTlRFUlBBUlRfRU5WX05BTUUgIkdJVF9TU0hfRkVUQ0giCisjZW5kaWYKKyNpZm5kZWYgQ09VTlRFUlBBUlRfUFJPR1JBTV9OQU1FCisjZGVmaW5lIENPVU5URVJQQVJUX1BST0dSQU1fTkFNRSAiZ2l0LXNzaC1mZXRjaCIKKyNlbmRpZgorI2lmbmRlZiBNWV9QUk9HUkFNX05BTUUKKyNkZWZpbmUgTVlfUFJPR1JBTV9OQU1FICJnaXQtc3NoLXVwbG9hZCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJyc2guaCIKKyNpbmNsdWRlICJyZWZzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbG9jYWxfdmVyc2lvbiA9IDE7CitzdGF0aWMgdW5zaWduZWQgY2hhciByZW1vdGVfdmVyc2lvbiA9IDA7CisKK3N0YXRpYyBpbnQgdmVyYm9zZSA9IDA7CisKK3N0YXRpYyBpbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgeworCXNzaXplX3Qgc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXNpZ25lZCBjaGFyIHJlbW90ZTsKKwlpbnQgcG9zbiA9IDA7CisJZG8geworCQlzaXplID0gcmVhZChmZF9pbiwgc2hhMSArIHBvc24sIDIwIC0gcG9zbik7CisJCWlmIChzaXplIDwgMCkgeworCQkJcGVycm9yKCJnaXQtc3NoLXVwbG9hZDogcmVhZCAiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoIXNpemUpCisJCQlyZXR1cm4gLTE7CisJCXBvc24gKz0gc2l6ZTsKKwl9IHdoaWxlIChwb3NuIDwgMjApOworCQorCWlmICh2ZXJib3NlKQorCQlmcHJpbnRmKHN0ZGVyciwgIlNlcnZpbmcgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCXJlbW90ZSA9IDA7CisJCisJaWYgKCFoYXNfc2hhMV9maWxlKHNoYTEpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC11cGxvYWQ6IGNvdWxkIG5vdCBmaW5kICVzXG4iLAorCQkJc2hhMV90b19oZXgoc2hhMSkpOworCQlyZW1vdGUgPSAtMTsKKwl9CisJCisJd3JpdGUoZmRfb3V0LCAmcmVtb3RlLCAxKTsKKwkKKwlpZiAocmVtb3RlIDwgMCkKKwkJcmV0dXJuIDA7CisJCisJcmV0dXJuIHdyaXRlX3NoYTFfdG9fZmQoZmRfb3V0LCBzaGExKTsKK30KKworc3RhdGljIGludCBzZXJ2ZV92ZXJzaW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKK3sKKwlpZiAocmVhZChmZF9pbiwgJnJlbW90ZV92ZXJzaW9uLCAxKSA8IDEpCisJCXJldHVybiAtMTsKKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJ2ZV9yZWYoaW50IGZkX2luLCBpbnQgZmRfb3V0KQoreworCWNoYXIgcmVmW1BBVEhfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCWludCBwb3NuID0gMDsKKwlzaWduZWQgY2hhciByZW1vdGUgPSAwOworCWRvIHsKKwkJaWYgKHJlYWQoZmRfaW4sIHJlZiArIHBvc24sIDEpIDwgMSkKKwkJCXJldHVybiAtMTsKKwkJcG9zbisrOworCX0gd2hpbGUgKHJlZltwb3NuIC0gMV0pOworCisJaWYgKHZlcmJvc2UpCisJCWZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgcmVmKTsKKworCWlmIChnZXRfcmVmX3NoYTEocmVmLCBzaGExKSkKKwkJcmVtb3RlID0gLTE7CisJd3JpdGUoZmRfb3V0LCAmcmVtb3RlLCAxKTsKKwlpZiAocmVtb3RlKQorCQlyZXR1cm4gMDsKKwl3cml0ZShmZF9vdXQsIHNoYTEsIDIwKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgc2VydmljZShpbnQgZmRfaW4sIGludCBmZF9vdXQpIHsKKwljaGFyIHR5cGU7CisJaW50IHJldHZhbDsKKwlkbyB7CisJCXJldHZhbCA9IHJlYWQoZmRfaW4sICZ0eXBlLCAxKTsKKwkJaWYgKHJldHZhbCA8IDEpIHsKKwkJCWlmIChyZXR2YWwgPCAwKQorCQkJCXBlcnJvcigiZ2l0LXNzaC11cGxvYWQ6IHJlYWQgIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHR5cGUgPT0gJ3YnICYmIHNlcnZlX3ZlcnNpb24oZmRfaW4sIGZkX291dCkpCisJCQlyZXR1cm47CisJCWlmICh0eXBlID09ICdvJyAmJiBzZXJ2ZV9vYmplY3QoZmRfaW4sIGZkX291dCkpCisJCQlyZXR1cm47CisJCWlmICh0eXBlID09ICdyJyAmJiBzZXJ2ZV9yZWYoZmRfaW4sIGZkX291dCkpCisJCQlyZXR1cm47CisJfSB3aGlsZSAoMSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHNzaF9wdXNoX3VzYWdlW10gPQorCU1ZX1BST0dSQU1fTkFNRSAiIFstY10gWy10XSBbLWFdIFstdyByZWZdIGNvbW1pdC1pZCB1cmwiOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGFyZyA9IDE7CisgICAgICAgIGNoYXIgKmNvbW1pdF9pZDsKKyAgICAgICAgY2hhciAqdXJsOworCWludCBmZF9pbiwgZmRfb3V0OworCWNvbnN0IGNoYXIgKnByb2c7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwljaGFyIGhleFs0MV07CisKKwlwcm9nID0gZ2V0ZW52KENPVU5URVJQQVJUX0VOVl9OQU1FKTsKKwlpZiAoIXByb2cpIHByb2cgPSBDT1VOVEVSUEFSVF9QUk9HUkFNX05BTUU7CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisKKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2W2FyZ11bMV0gPT0gJ3cnKQorCQkJYXJnKys7CisgICAgICAgICAgICAgICAgYXJnKys7CisgICAgICAgIH0KKwlpZiAoYXJnYyA8IGFyZyArIDIpCisJCXVzYWdlKHNzaF9wdXNoX3VzYWdlKTsKKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisJdXJsID0gYXJndlthcmcgKyAxXTsKKwlpZiAoZ2V0X3NoYTEoY29tbWl0X2lkLCBzaGExKSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGNvbW1pdF9pZCk7CisJbWVtY3B5KGhleCwgc2hhMV90b19oZXgoc2hhMSksIHNpemVvZihoZXgpKTsKKwlhcmd2W2FyZ10gPSBoZXg7CisKKwlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsIHByb2csIHVybCwgYXJnLCBhcmd2ICsgMSkpCisJCXJldHVybiAxOworCisJc2VydmljZShmZF9pbiwgZmRfb3V0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3N0cmJ1Zi5jIGIvc3RyYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ZDhiZQotLS0gL2Rldi9udWxsCisrKyBiL3N0cmJ1Zi5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInN0cmJ1Zi5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisKK3ZvaWQgc3RyYnVmX2luaXQoc3RydWN0IHN0cmJ1ZiAqc2IpIHsKKwlzYi0+YnVmID0gTlVMTDsKKwlzYi0+ZW9mID0gc2ItPmFsbG9jID0gc2ItPmxlbiA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0cmJ1Zl9iZWdpbihzdHJ1Y3Qgc3RyYnVmICpzYikgeworCWZyZWUoc2ItPmJ1Zik7CisJc3RyYnVmX2luaXQoc2IpOworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgc3RyYnVmX2FkZChzdHJ1Y3Qgc3RyYnVmICpzYiwgaW50IGNoKSB7CisJaWYgKHNiLT5hbGxvYyA8PSBzYi0+bGVuKSB7CisJCXNiLT5hbGxvYyA9IHNiLT5hbGxvYyAqIDMgLyAyICsgMTY7CisJCXNiLT5idWYgPSB4cmVhbGxvYyhzYi0+YnVmLCBzYi0+YWxsb2MpOworCX0KKwlzYi0+YnVmW3NiLT5sZW4rK10gPSBjaDsKK30KKworc3RhdGljIHZvaWQgc3RyYnVmX2VuZChzdHJ1Y3Qgc3RyYnVmICpzYikgeworCXN0cmJ1Zl9hZGQoc2IsIDApOworfQorCit2b2lkIHJlYWRfbGluZShzdHJ1Y3Qgc3RyYnVmICpzYiwgRklMRSAqZnAsIGludCB0ZXJtKSB7CisJaW50IGNoOworCXN0cmJ1Zl9iZWdpbihzYik7CisJaWYgKGZlb2YoZnApKSB7CisJCXNiLT5lb2YgPSAxOworCQlyZXR1cm47CisJfQorCXdoaWxlICgoY2ggPSBmZ2V0YyhmcCkpICE9IEVPRikgeworCQlpZiAoY2ggPT0gdGVybSkKKwkJCWJyZWFrOworCQlzdHJidWZfYWRkKHNiLCBjaCk7CisJfQorCWlmIChjaCA9PSBFT0YgJiYgc2ItPmxlbiA9PSAwKQorCQlzYi0+ZW9mID0gMTsKKwlzdHJidWZfZW5kKHNiKTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RyYnVmLmggYi9zdHJidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGNjMDEyCi0tLSAvZGV2L251bGwKKysrIGIvc3RyYnVmLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBTVFJCVUZfSAorI2RlZmluZSBTVFJCVUZfSAorc3RydWN0IHN0cmJ1ZiB7CisJaW50IGFsbG9jOworCWludCBsZW47CisJaW50IGVvZjsKKwljaGFyICpidWY7Cit9OworCitleHRlcm4gdm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIHZvaWQgcmVhZF9saW5lKHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQpOworCisjZW5kaWYgLyogU1RSQlVGX0ggKi8KZGlmZiAtLWdpdCBhL3N5bWJvbGljLXJlZi5jIGIvc3ltYm9saWMtcmVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzYzg3YwotLS0gL2Rldi9udWxsCisrKyBiL3N5bWJvbGljLXJlZi5jCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgY2hhciBnaXRfc3ltYm9saWNfcmVmX3VzYWdlW10gPQorImdpdC1zeW1ib2xpYy1yZWYgbmFtZSBbcmVmXSI7CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N5bXJlZihjb25zdCBjaGFyICpIRUFEKQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisJY29uc3QgY2hhciAqZ2l0X0hFQUQgPSBzdHJkdXAoZ2l0X3BhdGgoIiVzIiwgSEVBRCkpOworCWNvbnN0IGNoYXIgKmdpdF9yZWZzX2hlYWRzX21hc3RlciA9IHJlc29sdmVfcmVmKGdpdF9IRUFELCBzaGExLCAwKTsKKwlpZiAoZ2l0X3JlZnNfaGVhZHNfbWFzdGVyKSB7CisJCS8qIHdlIHdhbnQgdG8gc3RyaXAgdGhlIC5naXQvIHBhcnQgKi8KKwkJaW50IHBmeGxlbiA9IHN0cmxlbihnaXRfSEVBRCkgLSBzdHJsZW4oSEVBRCk7CisJCXB1dHMoZ2l0X3JlZnNfaGVhZHNfbWFzdGVyICsgcGZ4bGVuKTsKKwl9CisJZWxzZQorCQlkaWUoIk5vIHN1Y2ggcmVmOiAlcyIsIEhFQUQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCWNoZWNrX3N5bXJlZihhcmd2WzFdKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQljcmVhdGVfc3ltcmVmKHN0cmR1cChnaXRfcGF0aCgiJXMiLCBhcmd2WzFdKSksIGFyZ3ZbMl0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1c2FnZShnaXRfc3ltYm9saWNfcmVmX3VzYWdlKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90Ly5naXRpZ25vcmUgYi90Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkNjdjMAotLS0gL2Rldi9udWxsCisrKyBiL3QvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit0cmFzaApkaWZmIC0tZ2l0IGEvdC9NYWtlZmlsZSBiL3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4MzUwOQotLS0gL2Rldi9udWxsCisrKyBiL3QvTWFrZWZpbGUKQEAgLTAsMCArMSwzOSBAQAorIyBSdW4gdGVzdHMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKKyNHSVRfVEVTVF9PUFRTPS0tdmVyYm9zZSAtLWRlYnVnCitTSEVMTF9QQVRIID89ICQoU0hFTEwpCitUQVIgPz0gJChUQVIpCisKKyMgU2hlbGwgcXVvdGU7CitTSEVMTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChTSEVMTF9QQVRIKSkKKworVCA9ICQod2lsZGNhcmQgdFswLTldWzAtOV1bMC05XVswLTldLSouc2gpCitUU1ZOID0gJCh3aWxkY2FyZCB0OTFbMC05XVswLTldLSouc2gpCisKK2lmZGVmIE5PX1BZVEhPTgorCUdJVF9URVNUX09QVFMgKz0gLS1uby1weXRob24KK2VuZGlmCisKK2FsbDogJChUKSBjbGVhbgorCiskKFQpOgorCUBlY2hvICIqKiogJEAgKioqIjsgR0lUX0NPTkZJRz0uZ2l0L2NvbmZpZyAnJChTSEVMTF9QQVRIX1NRKScgJEAgJChHSVRfVEVTVF9PUFRTKQorCitjbGVhbjoKKwlybSAtZnIgdHJhc2gKKworIyB3ZSBjYW4gdGVzdCBOT19PUFRJTUlaRV9DT01NSVRTIGluZGVwZW5kZW50bHkgb2YgTENfQUxMCitmdWxsLXN2bi10ZXN0OgorCSQoTUFLRSkgJChUU1ZOKSBHSVRfU1ZOX05PX0xJQj0xIEdJVF9TVk5fTk9fT1BUSU1JWkVfQ09NTUlUUz0xIExDX0FMTD1DCisJJChNQUtFKSAkKFRTVk4pIEdJVF9TVk5fTk9fTElCPTAgR0lUX1NWTl9OT19PUFRJTUlaRV9DT01NSVRTPTEgTENfQUxMPUMKKwkkKE1BS0UpICQoVFNWTikgR0lUX1NWTl9OT19MSUI9MSBHSVRfU1ZOX05PX09QVElNSVpFX0NPTU1JVFM9MCBcCisJCQkJCQkJTENfQUxMPWVuX1VTLlVURi04CisJJChNQUtFKSAkKFRTVk4pIEdJVF9TVk5fTk9fTElCPTAgR0lUX1NWTl9OT19PUFRJTUlaRV9DT01NSVRTPTAgXAorCQkJCQkJCUxDX0FMTD1lbl9VUy5VVEYtOAorCisuUEhPTlk6ICQoVCkgY2xlYW4KKy5OT1RQQVJBTExFTDoKKwpkaWZmIC0tZ2l0IGEvdC9SRUFETUUgYi90L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRiNTgwCi0tLSAvZGV2L251bGwKKysrIGIvdC9SRUFETUUKQEAgLTAsMCArMSwyMDkgQEAKK0NvcmUgR0lUIFRlc3RzCis9PT09PT09PT09PT09PQorCitUaGlzIGRpcmVjdG9yeSBob2xkcyBtYW55IHRlc3Qgc2NyaXB0cyBmb3IgY29yZSBHSVQgdG9vbHMuICBUaGUKK2ZpcnN0IHBhcnQgb2YgdGhpcyBzaG9ydCBkb2N1bWVudCBkZXNjcmliZXMgaG93IHRvIHJ1biB0aGUgdGVzdHMKK2FuZCByZWFkIHRoZWlyIG91dHB1dC4KKworV2hlbiBmaXhpbmcgdGhlIHRvb2xzIG9yIGFkZGluZyBlbmhhbmNlbWVudHMsIHlvdSBhcmUgc3Ryb25nbHkKK2VuY291cmFnZWQgdG8gYWRkIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5IHRvIGNvdmVyIHdoYXQgeW91IGFyZQordHJ5aW5nIHRvIGZpeCBvciBlbmhhbmNlLiAgVGhlIGxhdGVyIHBhcnQgb2YgdGhpcyBzaG9ydCBkb2N1bWVudAorZGVzY3JpYmVzIGhvdyB5b3VyIHRlc3Qgc2NyaXB0cyBzaG91bGQgYmUgb3JnYW5pemVkLgorCisKK1J1bm5pbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0KKworVGhlIGVhc2llc3Qgd2F5IHRvIHJ1biB0ZXN0cyBpcyB0byBzYXkgIm1ha2UiLiAgVGhpcyBydW5zIGFsbAordGhlIHRlc3RzLgorCisgICAgKioqIHQwMDAwLWJhc2ljLnNoICoqKgorICAgICogICBvayAxOiAuZ2l0L29iamVjdHMgc2hvdWxkIGJlIGVtcHR5IGFmdGVyIGdpdC1pbml0LWRiIGluIGFuIGVtcHR5IHJlcG8uCisgICAgKiAgIG9rIDI6IC5naXQvb2JqZWN0cyBzaG91bGQgaGF2ZSAyNTYgc3ViZGlyZWN0b3JpZXMuCisgICAgKiAgIG9rIDM6IGdpdC11cGRhdGUtaW5kZXggd2l0aG91dCAtLWFkZCBzaG91bGQgZmFpbCBhZGRpbmcuCisgICAgLi4uCisgICAgKiAgIG9rIDIzOiBubyBkaWZmIGFmdGVyIGNoZWNrb3V0IGFuZCBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaC4KKyAgICAqIHBhc3NlZCBhbGwgMjMgdGVzdChzKQorICAgICoqKiB0MDEwMC1lbnZpcm9ubWVudC1uYW1lcy5zaCAqKioKKyAgICAqICAgb2sgMTogdXNpbmcgb2xkIG5hbWVzIHNob3VsZCBpc3N1ZSB3YXJuaW5ncy4KKyAgICAqICAgb2sgMjogdXNpbmcgb2xkIG5hbWVzIGJ1dCBoYXZpbmcgbmV3IG5hbWVzIHNob3VsZCBub3QgaXNzdWUgd2FybmluZ3MuCisgICAgLi4uCisKK09yIHlvdSBjYW4gcnVuIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkgZnJvbSBjb21tYW5kIGxpbmUsIGxpa2UKK3RoaXM6CisKKyAgICAkIHNoIC4vdDMwMDEtbHMtZmlsZXMta2lsbGVkLnNoCisgICAgKiAgIG9rIDE6IGdpdC11cGRhdGUtaW5kZXggLS1hZGQgdG8gYWRkIHZhcmlvdXMgcGF0aHMuCisgICAgKiAgIG9rIDI6IGdpdC1scy1maWxlcyAtayB0byBzaG93IGtpbGxlZCBmaWxlcy4KKyAgICAqICAgb2sgMzogdmFsaWRhdGUgZ2l0LWxzLWZpbGVzIC1rIG91dHB1dC4KKyAgICAqIHBhc3NlZCBhbGwgMyB0ZXN0KHMpCisKK1lvdSBjYW4gcGFzcyAtLXZlcmJvc2UgKG9yIC12KSwgLS1kZWJ1ZyAob3IgLWQpLCBhbmQgLS1pbW1lZGlhdGUKKyhvciAtaSkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIHRoZSB0ZXN0LgorCistLXZlcmJvc2U6OgorCVRoaXMgbWFrZXMgdGhlIHRlc3QgbW9yZSB2ZXJib3NlLiAgU3BlY2lmaWNhbGx5LCB0aGUKKwljb21tYW5kIGJlaW5nIHJ1biBhbmQgdGhlaXIgb3V0cHV0IGlmIGFueSBhcmUgYWxzbworCW91dHB1dC4KKworLS1kZWJ1Zzo6CisJVGhpcyBtYXkgaGVscCB0aGUgcGVyc29uIHdobyBpcyBkZXZlbG9waW5nIGEgbmV3IHRlc3QuCisJSXQgY2F1c2VzIHRoZSBjb21tYW5kIGRlZmluZWQgd2l0aCB0ZXN0X2RlYnVnIHRvIHJ1bi4KKworLS1pbW1lZGlhdGU6OgorCVRoaXMgY2F1c2VzIHRoZSB0ZXN0IHRvIGltbWVkaWF0ZWx5IGV4aXQgdXBvbiB0aGUgZmlyc3QKKwlmYWlsZWQgdGVzdC4KKworCitOYW1pbmcgVGVzdHMKKy0tLS0tLS0tLS0tLQorCitUaGUgdGVzdCBmaWxlcyBhcmUgbmFtZWQgYXM6CisKKwl0Tk5OTi1jb21tYW5kbmFtZS1kZXRhaWxzLnNoCisKK3doZXJlIE4gaXMgYSBkZWNpbWFsIGRpZ2l0LgorCitGaXJzdCBkaWdpdCB0ZWxscyB0aGUgZmFtaWx5OgorCisJMCAtIHRoZSBhYnNvbHV0ZSBiYXNpY3MgYW5kIGdsb2JhbCBzdHVmZgorCTEgLSB0aGUgYmFzaWMgY29tbWFuZHMgY29uY2VybmluZyBkYXRhYmFzZQorCTIgLSB0aGUgYmFzaWMgY29tbWFuZHMgY29uY2VybmluZyB0aGUgd29ya2luZyB0cmVlCisJMyAtIHRoZSBvdGhlciBiYXNpYyBjb21tYW5kcyAoZS5nLiBscy1maWxlcykKKwk0IC0gdGhlIGRpZmYgY29tbWFuZHMKKwk1IC0gdGhlIHB1bGwgYW5kIGV4cG9ydGluZyBjb21tYW5kcworCTYgLSB0aGUgcmV2aXNpb24gdHJlZSBjb21tYW5kcyAoZXZlbiBlLmcuIG1lcmdlLWJhc2UpCisJNyAtIHRoZSBwb3JjZWxhaW5pc2ggY29tbWFuZHMgY29uY2VybmluZyB0aGUgd29ya2luZyB0cmVlCisKK1NlY29uZCBkaWdpdCB0ZWxscyB0aGUgcGFydGljdWxhciBjb21tYW5kIHdlIGFyZSB0ZXN0aW5nLgorCitUaGlyZCBkaWdpdCAob3B0aW9uYWxseSkgdGVsbHMgdGhlIHBhcnRpY3VsYXIgc3dpdGNoIG9yIGdyb3VwIG9mIHN3aXRjaGVzCit3ZSBhcmUgdGVzdGluZy4KKworSWYgeW91IGNyZWF0ZSBmaWxlcyB1bmRlciB0LyBkaXJlY3RvcnkgKGkuZS4gaGVyZSkgdGhhdCBpcyBub3QKK3RoZSB0b3AtbGV2ZWwgdGVzdCBzY3JpcHQsIG5ldmVyIG5hbWUgdGhlIGZpbGUgdG8gbWF0Y2ggdGhlIGFib3ZlCitwYXR0ZXJuLiAgVGhlIE1ha2VmaWxlIGhlcmUgY29uc2lkZXJzIGFsbCBzdWNoIGZpbGVzIGFzIHRoZQordG9wLWxldmVsIHRlc3Qgc2NyaXB0IGFuZCB0cmllcyB0byBydW4gYWxsIG9mIHRoZW0uICBBIGNhcmUgaXMKK2VzcGVjaWFsbHkgbmVlZGVkIGlmIHlvdSBhcmUgY3JlYXRpbmcgYSBjb21tb24gdGVzdCBsaWJyYXJ5CitmaWxlLCBzaW1pbGFyIHRvIHRlc3QtbGliLnNoLCBiZWNhdXNlIHN1Y2ggYSBsaWJyYXJ5IGZpbGUgbWF5Citub3QgYmUgc3VpdGFibGUgZm9yIHN0YW5kYWxvbmUgZXhlY3V0aW9uLgorCisKK1dyaXRpbmcgVGVzdHMKKy0tLS0tLS0tLS0tLS0KKworVGhlIHRlc3Qgc2NyaXB0IGlzIHdyaXR0ZW4gYXMgYSBzaGVsbCBzY3JpcHQuICBJdCBzaG91bGQgc3RhcnQKK3dpdGggdGhlIHN0YW5kYXJkICIjIS9iaW4vc2giIHdpdGggY29weXJpZ2h0IG5vdGljZXMsIGFuZCBhbgorYXNzaWdubWVudCB0byB2YXJpYWJsZSAndGVzdF9kZXNjcmlwdGlvbicsIGxpa2UgdGhpczoKKworCSMhL2Jpbi9zaAorCSMKKwkjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworCSMKKworCXRlc3RfZGVzY3JpcHRpb249J3h4eCB0ZXN0IChvcHRpb24gLS1mcm90eikKKworCVRoaXMgdGVzdCByZWdpc3RlcnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaW4gdGhlIGNhY2hlCisJYW5kIHRyaWVzIHRvIHJ1biBnaXQtbHMtZmlsZXMgd2l0aCBvcHRpb24gLS1mcm90ei4nCisKKworU291cmNlICd0ZXN0LWxpYi5zaCcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIGFzc2lnbmluZyB0ZXN0X2Rlc2NyaXB0aW9uLCB0aGUgdGVzdCBzY3JpcHQgc2hvdWxkIHNvdXJjZQordGVzdC1saWIuc2ggbGlrZSB0aGlzOgorCisJLiAuL3Rlc3QtbGliLnNoCisKK1RoaXMgdGVzdCBoYXJuZXNzIGxpYnJhcnkgZG9lcyB0aGUgZm9sbG93aW5nIHRoaW5nczoKKworIC0gSWYgdGhlIHNjcmlwdCBpcyBpbnZva2VkIHdpdGggY29tbWFuZCBsaW5lIGFyZ3VtZW50IC0taGVscAorICAgKG9yIC1oKSwgaXQgc2hvd3MgdGhlIHRlc3RfZGVzY3JpcHRpb24gYW5kIGV4aXRzLgorCisgLSBDcmVhdGVzIGFuIGVtcHR5IHRlc3QgZGlyZWN0b3J5IHdpdGggYW4gZW1wdHkgLmdpdC9vYmplY3RzCisgICBkYXRhYmFzZSBhbmQgY2hkaXIoMikgaW50byBpdC4gIFRoaXMgZGlyZWN0b3J5IGlzICd0L3RyYXNoJworICAgaWYgeW91IG11c3Qga25vdywgYnV0IEkgZG8gbm90IHRoaW5rIHlvdSBjYXJlLgorCisgLSBEZWZpbmVzIHN0YW5kYXJkIHRlc3QgaGVscGVyIGZ1bmN0aW9ucyBmb3IgeW91ciBzY3JpcHRzIHRvCisgICB1c2UuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIG1ha2UgYWxsIHNjcmlwdHMgYmVoYXZlCisgICBjb25zaXN0ZW50bHkgd2hlbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIC0tdmVyYm9zZSAob3IgLXYpLAorICAgLS1kZWJ1ZyAob3IgLWQpLCBhbmQgLS1pbW1lZGlhdGUgKG9yIC1pKSBpcyBnaXZlbi4KKworCitFbmQgd2l0aCB0ZXN0X2RvbmUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3VyIHNjcmlwdCB3aWxsIGJlIGEgc2VxdWVuY2Ugb2YgdGVzdHMsIHVzaW5nIGhlbHBlciBmdW5jdGlvbnMKK2Zyb20gdGhlIHRlc3QgaGFybmVzcyBsaWJyYXJ5LiAgQXQgdGhlIGVuZCBvZiB0aGUgc2NyaXB0LCBjYWxsCisndGVzdF9kb25lJy4KKworCitUZXN0IGhhcm5lc3MgbGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgaGFuZGZ1bCBoZWxwZXIgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIHRlc3QgaGFybmVzcworbGlicmFyeSBmb3IgeW91ciBzY3JpcHQgdG8gdXNlLgorCisgLSB0ZXN0X2V4cGVjdF9zdWNjZXNzIDxtZXNzYWdlPiA8c2NyaXB0PgorCisgICBUaGlzIHRha2VzIHR3byBzdHJpbmdzIGFzIHBhcmFtZXRlciwgYW5kIGV2YWx1YXRlcyB0aGUKKyAgIDxzY3JpcHQ+LiAgSWYgaXQgeWllbGRzIHN1Y2Nlc3MsIHRlc3QgaXMgY29uc2lkZXJlZAorICAgc3VjY2Vzc2Z1bC4gIDxtZXNzYWdlPiBzaG91bGQgc3RhdGUgd2hhdCBpdCBpcyB0ZXN0aW5nLgorCisgICBFeGFtcGxlOgorCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdnaXQtd3JpdGUtdHJlZSBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSB0cmVlLicgXAorCSAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKScKKworIC0gdGVzdF9leHBlY3RfZmFpbHVyZSA8bWVzc2FnZT4gPHNjcmlwdD4KKworICAgVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgdGVzdF9leHBlY3Rfc3VjY2Vzcy4gIElmIDxzY3JpcHQ+CisgICB5aWVsZHMgc3VjY2VzcywgdGVzdCBpcyBjb25zaWRlcmVkIGEgZmFpbHVyZS4KKworICAgRXhhbXBsZToKKworCXRlc3RfZXhwZWN0X2ZhaWx1cmUgXAorCSAgICAnZ2l0LXVwZGF0ZS1pbmRleCB3aXRob3V0IC0tYWRkIHNob3VsZCBmYWlsIGFkZGluZy4nIFwKKwkgICAgJ2dpdC11cGRhdGUtaW5kZXggc2hvdWxkLWJlLWVtcHR5JworCisgLSB0ZXN0X2RlYnVnIDxzY3JpcHQ+CisKKyAgIFRoaXMgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIDxzY3JpcHQ+LCBhbmQgZXZhbHVhdGVzIGl0IG9ubHkKKyAgIHdoZW4gdGhlIHRlc3Qgc2NyaXB0IGlzIHN0YXJ0ZWQgd2l0aCAtLWRlYnVnIGNvbW1hbmQgbGluZQorICAgYXJndW1lbnQuICBUaGlzIGlzIHByaW1hcmlseSBtZWFudCBmb3IgdXNlIGR1cmluZyB0aGUKKyAgIGRldmVsb3BtZW50IG9mIGEgbmV3IHRlc3Qgc2NyaXB0LgorCisgLSB0ZXN0X2RvbmUKKworICAgWW91ciB0ZXN0IHNjcmlwdCBtdXN0IGhhdmUgdGVzdF9kb25lIGF0IHRoZSBlbmQuICBJdHMgcHVycG9zZQorICAgaXMgdG8gc3VtbWFyaXplIHN1Y2Nlc3NlcyBhbmQgZmFpbHVyZXMgaW4gdGhlIHRlc3Qgc2NyaXB0IGFuZAorICAgZXhpdCB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisKKworVGlwcyBmb3IgV3JpdGluZyBUZXN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB3aXRoIGFueSBwcm9ncmFtbWluZyBwcm9qZWN0cywgZXhpc3RpbmcgcHJvZ3JhbXMgYXJlIHRoZSBiZXN0Citzb3VyY2Ugb2YgdGhlIGluZm9ybWF0aW9uLiAgSG93ZXZlciwgZG8gX25vdF8gZW11bGF0ZQordDAwMDAtYmFzaWMuc2ggd2hlbiB3cml0aW5nIHlvdXIgdGVzdHMuICBUaGUgdGVzdCBpcyBzcGVjaWFsIGluCit0aGF0IGl0IHRyaWVzIHRvIHZhbGlkYXRlIHRoZSB2ZXJ5IGNvcmUgb2YgR0lULiAgRm9yIGV4YW1wbGUsIGl0Citrbm93cyB0aGF0IHRoZXJlIHdpbGwgYmUgMjU2IHN1YmRpcmVjdG9yaWVzIHVuZGVyIC5naXQvb2JqZWN0cy8sCithbmQgaXQga25vd3MgdGhhdCB0aGUgb2JqZWN0IElEIG9mIGFuIGVtcHR5IHRyZWUgaXMgYSBjZXJ0YWluCis0MC1ieXRlIHN0cmluZy4gIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGRvbmUgc28gaW4gdDAwMDAtYmFzaWMuc2gKK2JlY2F1c2UgdGhlIHRoaW5ncyB0aGUgdmVyeSBiYXNpYyBjb3JlIHRlc3QgdHJpZXMgdG8gYWNoaWV2ZSBpcwordG8gc2VydmUgYXMgYSBiYXNpcyBmb3IgcGVvcGxlIHdobyBhcmUgY2hhbmdpbmcgdGhlIEdJVCBpbnRlcm5hbAorZHJhc3RpY2FsbHkuICBGb3IgdGhlc2UgcGVvcGxlLCBhZnRlciBtYWtpbmcgY2VydGFpbiBjaGFuZ2VzLAorbm90IHNlZWluZyBmYWlsdXJlcyBmcm9tIHRoZSBiYXNpYyB0ZXN0IF9pc18gYSBmYWlsdXJlLiAgQW5kCitzdWNoIGRyYXN0aWMgY2hhbmdlcyB0byB0aGUgY29yZSBHSVQgdGhhdCBldmVuIGNoYW5nZXMgdGhlc2UKK290aGVyd2lzZSBzdXBwb3NlZGx5IHN0YWJsZSBvYmplY3QgSURzIHNob3VsZCBiZSBhY2NvbXBhbmllZCBieQorYW4gdXBkYXRlIHRvIHQwMDAwLWJhc2ljLnNoLgorCitIb3dldmVyLCBvdGhlciB0ZXN0cyB0aGF0IHNpbXBseSByZWx5IG9uIGJhc2ljIHBhcnRzIG9mIHRoZSBjb3JlCitHSVQgd29ya2luZyBwcm9wZXJseSBzaG91bGQgbm90IGhhdmUgdGhhdCBsZXZlbCBvZiBpbnRpbWF0ZQora25vd2xlZGdlIG9mIHRoZSBjb3JlIEdJVCBpbnRlcm5hbHMuICBJZiBhbGwgdGhlIHRlc3Qgc2NyaXB0cworaGFyZGNvZGVkIHRoZSBvYmplY3QgSURzIGxpa2UgdDAwMDAtYmFzaWMuc2ggZG9lcywgdGhhdCBkZWZlYXRzCit0aGUgcHVycG9zZSBvZiB0MDAwMC1iYXNpYy5zaCwgd2hpY2ggaXMgdG8gaXNvbGF0ZSB0aGF0IGxldmVsIG9mCit2YWxpZGF0aW9uIGluIG9uZSBwbGFjZS4gIFlvdXIgdGVzdCBhbHNvIGVuZHMgdXAgbmVlZGluZwordXBkYXRpbmcgd2hlbiBzdWNoIGEgY2hhbmdlIHRvIHRoZSBpbnRlcm5hbCBoYXBwZW5zLCBzbyBkbyBfbm90XworZG8gaXQgYW5kIGxlYXZlIHRoZSBsb3cgbGV2ZWwgb2YgdmFsaWRhdGlvbiB0byB0MDAwMC1iYXNpYy5zaC4KZGlmZiAtLWdpdCBhL3QvYW5ub3RhdGUtdGVzdHMuc2ggYi90L2Fubm90YXRlLXRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYWYyZmUKLS0tIC9kZXYvbnVsbAorKysgYi90L2Fubm90YXRlLXRlc3RzLnNoCkBAIC0wLDAgKzEsMTIwIEBACisjIFRoaXMgZmlsZSBpc24ndCB1c2VkIGFzIGEgdGVzdCBzY3JpcHQgZGlyZWN0bHksIGluc3RlYWQgaXQgaXMKKyMgc291cmNlZCBmcm9tIHQ4MDAxLWFubm90YXRlLnNoIGFuZCB0ODAwMS1ibGFtZS5zaC4KKworY2hlY2tfY291bnQgKCkgeworCWhlYWQ9CisJY2FzZSAiJDEiIGluIC1oKSBoZWFkPSIkMiI7IHNoaWZ0OyBzaGlmdCA7OyBlc2FjCisJJFBST0cgZmlsZSAkaGVhZCA+LnJlc3VsdCB8fCByZXR1cm4gMQorCWNhdCAucmVzdWx0IHwgcGVybCAtZSAnCisJCW15ICVleHBlY3QgPSAoQEFSR1YpOworCQlteSAlY291bnQgPSAoKTsKKwkJd2hpbGUgKDxTVERJTj4pIHsKKwkJCWlmICgvXlswLTlhLWZdK1x0XCgoW15cdF0rKVx0LykgeworCQkJCW15ICRhdXRob3IgPSAkMTsKKwkJCQlmb3IgKCRhdXRob3IpIHsgcy9eXHMqLy87IHMvXHMqJC8vOyB9CisJCQkJaWYgKGV4aXN0cyAkZXhwZWN0eyRhdXRob3J9KSB7CisJCQkJCSRjb3VudHskYXV0aG9yfSsrOworCQkJCX0KKwkJCX0KKwkJfQorCQlteSAkYmFkID0gMDsKKwkJd2hpbGUgKG15ICgkYXV0aG9yLCAkY291bnQpID0gZWFjaCAlY291bnQpIHsKKwkJCW15ICRvazsKKwkJCWlmICgkZXhwZWN0eyRhdXRob3J9ICE9ICRjb3VudCkgeworCQkJCSRiYWQgPSAxOworCQkJCSRvayA9ICJiYWQiOworCQkJfQorCQkJZWxzZSB7CisJCQkJJG9rID0gImdvb2QiOworCQkJfQorCQkJcHJpbnQgU1RERVJSICJBdXRob3IgJGF1dGhvciAoZXhwZWN0ZWQgJGV4cGVjdHskYXV0aG9yfSwgYXR0cmlidXRlZCAkY291bnQpICRva1xuIjsKKwkJfQorCQlleGl0KCRiYWQpOworCScgIiRAIgorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZWZlcmVuY2UgdHJlZScgXAorICAgICdlY2hvICIxQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUiID5maWxlICYmCisgICAgIGVjaG8gImxhenkgZG9nIiA+PmZpbGUgJiYKKyAgICAgZ2l0IGFkZCBmaWxlCisgICAgIEdJVF9BVVRIT1JfTkFNRT0iQSIgZ2l0IGNvbW1pdCAtYSAtbSAiSW5pdGlhbC4iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgYWxsIGxpbmVzIGJsYW1lZCBvbiBBJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1NldHVwIG5ldyBsaW5lcyBibGFtZWQgb24gQicgXAorICAgICdlY2hvICIyQSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUiID4+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj4gZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkIiIGdpdCBjb21taXQgLWEgLW0gIlNlY29uZC4iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCB0d28gb24gQicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbWVyZ2Utc2V0dXAgcGFydCAxJyBcCisgICAgJ2dpdCBjaGVja291dCAtYiBicmFuY2gxIG1hc3RlciAmJgorICAgICBlY2hvICIzQSBzbG93IGdyZWVuIGZveCBqdW1wcyBpbnRvIHRoZSIgPj4gZmlsZSAmJgorICAgICBlY2hvICJ3ZWxsLiIgPj4gZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkIxIiBnaXQgY29tbWl0IC1hIC1tICJCcmFuY2gxLTEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCB0d28gb24gQiwgdHdvIG9uIEIxJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDIgQjEgMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21lcmdlLXNldHVwIHBhcnQgMicgXAorICAgICdnaXQgY2hlY2tvdXQgLWIgYnJhbmNoMiBtYXN0ZXIgJiYKKyAgICAgc2VkIC1lICJzLzJBIHF1aWNrIGJyb3duLzRBIHF1aWNrIGJyb3duIGxhenkgZG9nLyIgPCBmaWxlID4gZmlsZS5uZXcgJiYKKyAgICAgbXYgZmlsZS5uZXcgZmlsZSAmJgorICAgICBHSVRfQVVUSE9SX05BTUU9IkIyIiBnaXQgY29tbWl0IC1hIC1tICJCcmFuY2gyLTEiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVHdvIGxpbmVzIGJsYW1lZCBvbiBBLCBvbmUgb24gQiwgb25lIG9uIEIyJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDEgQjIgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21lcmdlLXNldHVwIHBhcnQgMycgXAorICAgICdnaXQgcHVsbCAuIGJyYW5jaDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUd28gbGluZXMgYmxhbWVkIG9uIEEsIG9uZSBvbiBCLCB0d28gb24gQjEsIG9uZSBvbiBCMicgXAorICAgICdjaGVja19jb3VudCBBIDIgQiAxIEIxIDIgQjIgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0Fubm90YXRpbmcgYW4gb2xkIHJldmlzaW9uIHdvcmtzJyBcCisgICAgJ2NoZWNrX2NvdW50IC1oIG1hc3RlciBBIDIgQiAyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnQW5ub3RhdGluZyBhbiBvbGQgcmV2aXNpb24gd29ya3MnIFwKKyAgICAnY2hlY2tfY291bnQgLWggbWFzdGVyXiBBIDInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtZXJnZS1zZXR1cCBwYXJ0IDQnIFwKKyAgICAnZWNobyAiZXZpbCBtZXJnZS4iID4+ZmlsZSAmJgorICAgICBnaXQgY29tbWl0IC1hIC0tYW1lbmQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdUd28gbGluZXMgYmxhbWVkIG9uIEEsIG9uZSBvbiBCLCB0d28gb24gQjEsIG9uZSBvbiBCMiwgb25lIG9uIEEgVSBUaG9yJyBcCisgICAgJ2NoZWNrX2NvdW50IEEgMiBCIDEgQjEgMiBCMiAxICJBIFUgVGhvciIgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FuIGluY29tcGxldGUgbGluZSBhZGRlZCcgXAorICAgICdlY2hvICJpbmNvbXBsZXRlIiB8IHRyIC1kICJcXDAxMiIgPj5maWxlICYmCisgICAgR0lUX0FVVEhPUl9OQU1FPSJDIiBnaXQgY29tbWl0IC1hIC1tICJJbmNvbXBsZXRlIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1dpdGggaW5jb21wbGV0ZSBsaW5lcy4nIFwKKyAgICAnY2hlY2tfY291bnQgQSAyIEIgMSBCMSAyIEIyIDEgIkEgVSBUaG9yIiAxIEMgMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NvbWUgZWRpdCcgXAorICAgICdwZXJsIC1wIC1pLm9yaWcgLWUgInMvXjFBLipcbiQvLzsgcy9eM0EvOTkvIiBmaWxlICYmCisgICAgR0lUX0FVVEhPUl9OQU1FPSJEIiBnaXQgY29tbWl0IC1hIC1tICJlZGl0IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NvbWUgZWRpdCcgXAorICAgICdjaGVja19jb3VudCBBIDEgQiAxIEIxIDEgQjIgMSAiQSBVIFRob3IiIDEgQyAxIEQgMScKZGlmZiAtLWdpdCBhL3QvZGlmZi1saWIuc2ggYi90L2RpZmYtbGliLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0NWExYjAKLS0tIC9kZXYvbnVsbAorKysgYi90L2RpZmYtbGliLnNoCkBAIC0wLDAgKzEsNDEgQEAKKzoKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCitzYW5pdGl6ZV9kaWZmX3Jhdz0nL146L3MvICciJF94NDAiJyAnIiRfeDQwIicgXChbQS1aXVwpWzAtOV0qCS8gWCBYIFwxIwkvJworY29tcGFyZV9kaWZmX3JhdyAoKSB7CisgICAgIyBXaGVuIGhldXJpc3RpY3MgYXJlIGltcHJvdmVkLCB0aGUgc2NvcmUgbnVtYmVycyB3b3VsZCBjaGFuZ2UuCisgICAgIyBJZ25vcmUgdGhlbSB3aGlsZSBjb21wYXJpbmcuCisgICAgIyBBbHNvIHdlIGRvIG5vdCBjaGVjayBTSEExIGhhc2ggZ2VuZXJhdGlvbiBpbiB0aGlzIHRlc3QsIHdoaWNoCisgICAgIyBpcyBhIGpvYiBmb3IgdDAwMDAtYmFzaWMuc2gKKworICAgIHNlZCAtZSAiJHNhbml0aXplX2RpZmZfcmF3IiA8IiQxIiA+LnRtcC0xCisgICAgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXciIDwiJDIiID4udG1wLTIKKyAgICBkaWZmIC11IC50bXAtMSAudG1wLTIgJiYgcm0gLWYgLnRtcC0xIC50bXAtMgorfQorCitzYW5pdGl6ZV9kaWZmX3Jhd196PScvXjovcy8gJyIkX3g0MCInICciJF94NDAiJyBcKFtBLVpdXClbMC05XSokLyBYIFggXDEjLycKK2NvbXBhcmVfZGlmZl9yYXdfeiAoKSB7CisgICAgIyBXaGVuIGhldXJpc3RpY3MgYXJlIGltcHJvdmVkLCB0aGUgc2NvcmUgbnVtYmVycyB3b3VsZCBjaGFuZ2UuCisgICAgIyBJZ25vcmUgdGhlbSB3aGlsZSBjb21wYXJpbmcuCisgICAgIyBBbHNvIHdlIGRvIG5vdCBjaGVjayBTSEExIGhhc2ggZ2VuZXJhdGlvbiBpbiB0aGlzIHRlc3QsIHdoaWNoCisgICAgIyBpcyBhIGpvYiBmb3IgdDAwMDAtYmFzaWMuc2gKKworICAgIHRyICdcMCcgJ1wwMTInIDwiJDEiIHwgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXdfeiIgPi50bXAtMQorICAgIHRyICdcMCcgJ1wwMTInIDwiJDIiIHwgc2VkIC1lICIkc2FuaXRpemVfZGlmZl9yYXdfeiIgPi50bXAtMgorICAgIGRpZmYgLXUgLnRtcC0xIC50bXAtMiAmJiBybSAtZiAudG1wLTEgLnRtcC0yCit9CisKK2NvbXBhcmVfZGlmZl9wYXRjaCAoKSB7CisgICAgIyBXaGVuIGhldXJpc3RpY3MgYXJlIGltcHJvdmVkLCB0aGUgc2NvcmUgbnVtYmVycyB3b3VsZCBjaGFuZ2UuCisgICAgIyBJZ25vcmUgdGhlbSB3aGlsZSBjb21wYXJpbmcuCisgICAgc2VkIC1lICcKKwkvXltkaXNdKmltaWxhcml0eSBpbmRleCBbMC05XSolJC9kCisJL15pbmRleCBbMC05YS1mXSpcLlwuWzAtOWEtZl0vZAorICAgICcgPCIkMSIgPi50bXAtMQorICAgIHNlZCAtZSAnCisJL15bZGlzXSppbWlsYXJpdHkgaW5kZXggWzAtOV0qJSQvZAorCS9eaW5kZXggWzAtOWEtZl0qXC5cLlswLTlhLWZdL2QKKyAgICAnIDwiJDIiID4udG1wLTIKKyAgICBkaWZmIC11IC50bXAtMSAudG1wLTIgJiYgcm0gLWYgLnRtcC0xIC50bXAtMgorfQpkaWZmIC0tZ2l0IGEvdC9saWItZ2l0LXN2bi5zaCBiL3QvbGliLWdpdC1zdm4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhMWU3MgotLS0gL2Rldi9udWxsCisrKyBiL3QvbGliLWdpdC1zdm4uc2gKQEAgLTAsMCArMSw1MCBAQAorLiAuL3Rlc3QtbGliLnNoCisKK2lmIHRlc3QgLW4gIiROT19TVk5fVEVTVFMiCit0aGVuCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LXN2biB0ZXN0cywgTk9fU1ZOX1RFU1RTIGRlZmluZWQnIDoKKwl0ZXN0X2RvbmUKKwlleGl0CitmaQorCitHSVRfRElSPSRQV0QvLmdpdAorR0lUX1NWTl9ESVI9JEdJVF9ESVIvc3ZuL2dpdC1zdm4KK1NWTl9UUkVFPSRHSVRfU1ZOX0RJUi9zdm4tdHJlZQorCitwZXJsIC1lICd1c2UgU1ZOOjpDb3JlJyA+L2Rldi9udWxsIDI+JjEKK2lmIHRlc3QgJD8gLW5lIDAKK3RoZW4KKyAgIGVjaG8gJ1BlcmwgU1ZOIGxpYnJhcmllcyBub3QgZm91bmQsIHRlc3RzIHJlcXVpcmluZyB0aG9zZSB3aWxsIGJlIHNraXBwZWQnCisgICBHSVRfU1ZOX05PX0xJQj0xCitmaQorCitzdm5hZG1pbiA+L2Rldi9udWxsIDI+JjEKK2lmIHRlc3QgJD8gLW5lIDEKK3RoZW4KKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzICdza2lwcGluZyBnaXQtc3ZuIHRlc3RzLCBzdm5hZG1pbiBub3QgZm91bmQnIDoKKyAgICB0ZXN0X2RvbmUKKyAgICBleGl0CitmaQorCitzdm4gPi9kZXYvbnVsbCAyPiYxCitpZiB0ZXN0ICQ/IC1uZSAxCit0aGVuCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyAnc2tpcHBpbmcgZ2l0LXN2biB0ZXN0cywgc3ZuIG5vdCBmb3VuZCcgOgorICAgIHRlc3RfZG9uZQorICAgIGV4aXQKK2ZpCisKK3N2bnJlcG89JFBXRC9zdm5yZXBvCisKK3NldCAtZQorCitpZiBzdm5hZG1pbiBjcmVhdGUgLS1oZWxwIHwgZ3JlcCBmcy10eXBlID4vZGV2L251bGwKK3RoZW4KKwlzdm5hZG1pbiBjcmVhdGUgLS1mcy10eXBlIGZzZnMgIiRzdm5yZXBvIgorZWxzZQorCXN2bmFkbWluIGNyZWF0ZSAiJHN2bnJlcG8iCitmaQorCitzdm5yZXBvPSJmaWxlOi8vJHN2bnJlcG8vdGVzdC1naXQtc3ZuIgorCisKZGlmZiAtLWdpdCBhL3QvbGliLXJlYWQtdHJlZS1tLTN3YXkuc2ggYi90L2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxOTU2MDMKLS0tIC9kZXYvbnVsbAorKysgYi90L2xpYi1yZWFkLXRyZWUtbS0zd2F5LnNoCkBAIC0wLDAgKzEsMTU4IEBACis6IEluY2x1ZGVkIGZyb20gdDEwMDAtcmVhZC10cmVlLW0tM3dheS5zaCBhbmQgb3RoZXJzCisjIE9yaWdpbmFsIHRyZWUuCitta2RpciBaCitmb3IgYSBpbiBOIEQgTQorZG8KKyAgICBmb3IgYiBpbiBOIEQgTQorICAgIGRvCisgICAgICAgIHA9JGEkYgorCWVjaG8gVGhpcyBpcyAkcCBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLiA+JHAKKwllY2hvIFRoaXMgaXMgWi8kcCBmcm9tIHRoZSBvcmlnaW5hbCB0cmVlLiA+Wi8kcAorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSAgICAiYWRkaW5nIHRlc3QgZmlsZSAkcCBhbmQgWi8kcCIgXAorCSAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAkcCAmJgorCSAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIFovJHAnCisgICAgZG9uZQorZG9uZQorZWNobyBUaGlzIGlzIFNTIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUuID5TUwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZGluZyB0ZXN0IGZpbGUgU1MnIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBTUycKK2NhdCA+VFQgPDxcRU9GCitUaGlzIGlzIGEgdHJpdmlhbCBtZXJnZSBzYW1wbGUgdGV4dC4KK0JyYW5jaCBBIGlzIGV4cGVjdGVkIHRvIHVwY2FzZSB0aGlzIHdvcmQsIGhlcmUuCitUaGVyZSBhcmUgc29tZSBmaWxsZXIgbGluZXMgdG8gYXZvaWQgZGlmZiBjb250ZXh0Citjb25mbGljdHMgaGVyZSwKK2xpa2UgdGhpcyBvbmUsCithbmQgdGhpcyBvbmUsCithbmQgdGhpcyBvbmUgaXMgeWV0IGFub3RoZXIgb25lIG9mIHRoZW0uCitBdCB0aGUgdmVyeSBlbmQsIGhlcmUgY29tZXMgYW5vdGhlciBsaW5lLCB0aGF0IGlzCit0aGUgd29yZCwgZXhwZWN0ZWQgdG8gYmUgdXBjYXNlZCBieSBCcmFuY2ggQi4KK1RoaXMgY29uY2x1ZGVzIHRoZSB0cml2aWFsIG1lcmdlIHNhbXBsZSBmaWxlLgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWRkaW5nIHRlc3QgZmlsZSBUVCcgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIFRUJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgaW5pdGlhbCB0cmVlJyBcCisgICAgJ3RyZWVfTz0kKGdpdC13cml0ZS10cmVlKScKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCcmFuY2ggQSBhbmQgQiBtYWtlcyB0aGUgY2hhbmdlcyBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIG1hdHJpeC4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCcmFuY2ggQQorCit0b19yZW1vdmU9JChlY2hvIEQ/IFovRD8pCitybSAtZiAkdG9fcmVtb3ZlCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBBIChyZW1vdmFsKScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlICR0b19yZW1vdmUnCisKK2ZvciBwIGluIE0/IFovTT8KK2RvCisgICAgZWNobyBUaGlzIGlzIG1vZGlmaWVkICRwIGluIHRoZSBicmFuY2ggQS4gPiRwCisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ2NoYW5nZSBpbiBicmFuY2ggQSAobW9kaWZpY2F0aW9uKScgXAorICAgICAgICAiZ2l0LXVwZGF0ZS1pbmRleCAkcCIKK2RvbmUKKworZm9yIHAgaW4gQU4gQUEgWi9BTiBaL0FBCitkbworICAgIGVjaG8gVGhpcyBpcyBhZGRlZCAkcCBpbiB0aGUgYnJhbmNoIEEuID4kcAorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdjaGFuZ2UgaW4gYnJhbmNoIEEgKGFkZGl0aW9uKScgXAorCSJnaXQtdXBkYXRlLWluZGV4IC0tYWRkICRwIgorZG9uZQorCitlY2hvIFRoaXMgaXMgU1MgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPlNTCitlY2hvIFRoaXMgaXMgTEwgZnJvbSB0aGUgbW9kaWZpZWQgdHJlZS4gPkxMCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBBIChhZGRpdGlvbiknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBMTCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IFNTJworbXYgVFQgVFQtCitzZWQgLWUgJy9CcmFuY2ggQS9zL3dvcmQvV09SRC9nJyA8VFQtID5UVAorcm0gLWYgVFQtCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBBIChlZGl0KScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IFRUJworCitta2RpciBERgorZWNobyBCcmFuY2ggQSBtYWtlcyBhIGZpbGUgYXQgREYvREYsIGNyZWF0aW5nIGEgZGlyZWN0b3J5IERGLiA+REYvREYKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEEgKGNoYW5nZSBmaWxlIHRvIGRpcmVjdG9yeSknIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERi9ERicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlY29yZGluZyBicmFuY2ggQSB0cmVlJyBcCisgICAgJ3RyZWVfQT0kKGdpdC13cml0ZS10cmVlKScKKwkgICAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnJhbmNoIEIKKyMgU3RhcnQgZnJvbSBPCisKK3JtIC1yZiBbTkRNQVNMVF1bTkRNQVNMVF0gWiBERgorbWtkaXIgWgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYWRpbmcgb3JpZ2luYWwgdHJlZSBhbmQgY2hlY2tpbmcgb3V0JyBcCisgICAgJ2dpdC1yZWFkLXRyZWUgJHRyZWVfTyAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWEnCisKK3RvX3JlbW92ZT0kKGVjaG8gP0QgWi8/RCkKK3JtIC1mICR0b19yZW1vdmUKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEIgKHJlbW92YWwpJyBcCisgICAgImdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgJHRvX3JlbW92ZSIKKworZm9yIHAgaW4gP00gWi8/TQorZG8KKyAgICBlY2hvIFRoaXMgaXMgbW9kaWZpZWQgJHAgaW4gdGhlIGJyYW5jaCBCLiA+JHAKKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hhbmdlIGluIGJyYW5jaCBCIChtb2RpZmljYXRpb24pJyBcCisJImdpdC11cGRhdGUtaW5kZXggJHAiCitkb25lCisKK2ZvciBwIGluIE5BIEFBIFovTkEgWi9BQQorZG8KKyAgICBlY2hvIFRoaXMgaXMgYWRkZWQgJHAgaW4gdGhlIGJyYW5jaCBCLiA+JHAKKyAgICB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknY2hhbmdlIGluIGJyYW5jaCBCIChhZGRpdGlvbiknIFwKKwkiZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAkcCIKK2RvbmUKK2VjaG8gVGhpcyBpcyBTUyBmcm9tIHRoZSBtb2RpZmllZCB0cmVlLiA+U1MKK2VjaG8gVGhpcyBpcyBMTCBmcm9tIHRoZSBtb2RpZmllZCB0cmVlLiA+TEwKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGFuZ2UgaW4gYnJhbmNoIEIgKGFkZGl0aW9uIGFuZCBtb2RpZmljYXRpb24pJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgTEwgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBTUycKK212IFRUIFRULQorc2VkIC1lICcvQnJhbmNoIEIvcy93b3JkL1dPUkQvZycgPFRULSA+VFQKK3JtIC1mIFRULQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBpbiBicmFuY2ggQiAobW9kaWZpY2F0aW9uKScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IFRUJworCitlY2hvIEJyYW5jaCBCIG1ha2VzIGEgZmlsZSBhdCBERi4gPkRGCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hhbmdlIGluIGJyYW5jaCBCIChhZGRpdGlvbiBvZiBhIGZpbGUgdG8gY29uZmxpY3Qgd2l0aCBkaXJlY3RvcnkpJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgREYnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWNvcmRpbmcgYnJhbmNoIEIgdHJlZScgXAorICAgICd0cmVlX0I9JChnaXQtd3JpdGUtdHJlZSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdrZWVwIGNvbnRlbnRzIG9mIDMgdHJlZXMgZm9yIGVhc3kgYWNjZXNzJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9PICYmCisgICAgIG1rZGlyIC5vcmlnLU8gJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PS5vcmlnLU8vIC1mIC1xIC1hICYmCisgICAgIHJtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9BICYmCisgICAgIG1rZGlyIC5vcmlnLUEgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PS5vcmlnLUEvIC1mIC1xIC1hICYmCisgICAgIHJtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIG1rZGlyIC5vcmlnLUIgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PS5vcmlnLUIvIC1mIC1xIC1hJwpkaWZmIC0tZ2l0IGEvdC90MDAwMC1iYXNpYy5zaCBiL3QvdDAwMDAtYmFzaWMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM5YmJiNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDAwMDAtYmFzaWMuc2gKQEAgLTAsMCArMSwyNzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCB0aGUgdmVyeSBiYXNpY3MgcGFydCAjMS4KKworVGhlIHJlc3Qgb2YgdGhlIHRlc3Qgc3VpdGUgZG9lcyBub3QgY2hlY2sgdGhlIGJhc2ljIG9wZXJhdGlvbiBvZiBnaXQKK3BsdW1iaW5nIGNvbW1hbmRzIHRvIHdvcmsgdmVyeSBjYXJlZnVsbHkuICBUaGVpciBqb2IgaXMgdG8gY29uY2VudHJhdGUKK29uIHRyaWNreSBmZWF0dXJlcyB0aGF0IGNhdXNlZCBidWdzIGluIHRoZSBwYXN0IHRvIGRldGVjdCByZWdyZXNzaW9uLgorCitUaGlzIHRlc3QgcnVucyB2ZXJ5IGJhc2ljIGZlYXR1cmVzLCBsaWtlIHJlZ2lzdGVyaW5nIHRoaW5ncyBpbiBjYWNoZSwKK3dyaXRpbmcgdHJlZSwgZXRjLgorCitOb3RlIHRoYXQgdGhpcyB0ZXN0ICpkZWxpYmVyYXRlbHkqIGhhcmQtY29kZXMgbWFueSBleHBlY3RlZCBvYmplY3QKK0lEcy4gIFdoZW4gb2JqZWN0IElEIGNvbXB1dGF0aW9uIGNoYW5nZXMsIGxpa2UgaW4gdGhlIHByZXZpb3VzIGNhc2Ugb2YKK3N3YXBwaW5nIGNvbXByZXNzaW9uIGFuZCBoYXNoaW5nIG9yZGVyLCB0aGUgcGVyc29uIHdobyBpcyBtYWtpbmcgdGhlCittb2RpZmljYXRpb24gKnNob3VsZCogdGFrZSBub3RpY2UgYW5kIHVwZGF0ZSB0aGUgdGVzdCB2ZWN0b3JzIGhlcmUuCisnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSXQgYXBwZWFycyB0aGF0IHBlb3BsZSBhcmUgZ2V0dGluZyBiaXR0ZW4gYnkgbm90IGluc3RhbGxpbmcKKyMgJ21lcmdlJyAodXN1YWxseSBwYXJ0IG9mIFJDUyBwYWNrYWdlIGluIGJpbmFyeSBkaXN0cmlidXRpb25zKQorIyBvciBoYXZlIHRvbyBvbGQgcHl0aG9uIHdpdGhvdXQgc3VicHJvY2Vzcy4gIENoZWNrIHRoZW0gYW5kIGVycm9yCisjIG91dCBiZWZvcmUgcnVubmluZyBhbnkgdGVzdHMuICBBbHNvIGNhdGNoIHRoZSBib2dvc2l0eSBvZiB0cnlpbmcKKyMgdG8gcnVuIHRlc3RzIHdpdGhvdXQgYnVpbGRpbmcgd2hpbGUgd2UgYXJlIGF0IGl0LgorCisuLi9naXQgPi9kZXYvbnVsbAoraWYgdGVzdCAkPyAhPSAxCit0aGVuCisJZWNobyA+JjIgJ1lvdSBkbyBub3Qgc2VlbSB0byBoYXZlIGJ1aWx0IGdpdCB5ZXQuJworCWV4aXQgMQorZmkKKworbWVyZ2UgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAoraWYgdGVzdCAkPyA9IDEyNwordGhlbgorCWVjaG8gPiYyICdZb3UgZG8gbm90IHNlZW0gdG8gaGF2ZSAibWVyZ2UiIGluc3RhbGxlZC4KK1BsZWFzZSBjaGVjayBJTlNUQUxMIGRvY3VtZW50LicKKwlleGl0IDEKK2ZpCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0ICIkbm9fcHl0aG9uIiB8fCAiJFBZVEhPTiIgLWMgJ2ltcG9ydCBzdWJwcm9jZXNzJyB8fCB7CisJZWNobyA+JjIgJ1lvdXIgcHl0aG9uIHNlZW0gdG8gbGFjayAic3VicHJvY2VzcyIgbW9kdWxlLgorUGxlYXNlIGNoZWNrIElOU1RBTEwgZG9jdW1lbnQuJworCWV4aXQgMQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGluaXQtZGIgaGFzIGJlZW4gZG9uZSBpbiBhbiBlbXB0eSByZXBvc2l0b3J5LgorIyBtYWtlIHN1cmUgaXQgaXMgZW1wdHkuCisKK2ZpbmQgLmdpdC9vYmplY3RzIC10eXBlIGYgLXByaW50ID5zaG91bGQtYmUtZW1wdHkKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcuZ2l0L29iamVjdHMgc2hvdWxkIGJlIGVtcHR5IGFmdGVyIGdpdC1pbml0LWRiIGluIGFuIGVtcHR5IHJlcG8uJyBcCisgICAgJ2NtcCAtcyAvZGV2L251bGwgc2hvdWxkLWJlLWVtcHR5JyAKKworIyBhbHNvIGl0IHNob3VsZCBoYXZlIDIgc3ViZGlyZWN0b3JpZXM7IG5vIGZhbi1vdXQgYW55bW9yZSwgcGFjaywgYW5kIGluZm8uCisjIDMgaXMgY291bnRpbmcgIm9iamVjdHMiIGl0c2VsZgorZmluZCAuZ2l0L29iamVjdHMgLXR5cGUgZCAtcHJpbnQgPmZ1bGwtb2YtZGlyZWN0b3JpZXMKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcuZ2l0L29iamVjdHMgc2hvdWxkIGhhdmUgMyBzdWJkaXJlY3Rvcmllcy4nIFwKKyAgICAndGVzdCAkKHdjIC1sIDwgZnVsbC1vZi1kaXJlY3RvcmllcykgPSAzJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJhc2ljcyBvZiB0aGUgYmFzaWNzCisKKyMgdXBkYXRpbmcgYSBuZXcgZmlsZSB3aXRob3V0IC0tYWRkIHNob3VsZCBmYWlsLgordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggd2l0aG91dCAtLWFkZCBzaG91bGQgZmFpbCBhZGRpbmcuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggc2hvdWxkLWJlLWVtcHR5JworCisjIGFuZCB3aXRoIC0tYWRkIGl0IHNob3VsZCBzdWNjZWVkLCBldmVuIGlmIGl0IGlzIGVtcHR5IChpdCB1c2VkIHRvIGZhaWwpLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggd2l0aCAtLWFkZCBzaG91bGQgc3VjY2VlZC4nIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBzaG91bGQtYmUtZW1wdHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUnIFwKKyAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKScKKworIyB3ZSBrbm93IHRoZSBzaGFwZSBhbmQgY29udGVudHMgb2YgdGhlIHRyZWUgYW5kIGtub3cgdGhlIG9iamVjdCBJRCBmb3IgaXQuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb2JqZWN0IElEIG9mIGEga25vd24gdHJlZS4nIFwKKyAgICAndGVzdCAiJHRyZWUiID0gN2JiOTQzNTU5YTMwNWJkZDZiZGVlMmNlZjZlNWRmMjQxM2MzZDMwYScKKworIyBSZW1vdmluZyBwYXRocy4KK3JtIC1mIHNob3VsZC1iZS1lbXB0eSBmdWxsLW9mLWRpcmVjdG9yaWVzCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCB3aXRob3V0IC0tcmVtb3ZlIHNob3VsZCBmYWlsIHJlbW92aW5nLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IHNob3VsZC1iZS1lbXB0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggd2l0aCAtLXJlbW92ZSBzaG91bGQgYmUgYWJsZSB0byByZW1vdmUuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgc2hvdWxkLWJlLWVtcHR5JworCisjIEVtcHR5IHRyZWUgY2FuIGJlIHdyaXR0ZW4gd2l0aCByZWNlbnQgd3JpdGUtdHJlZS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtd3JpdGUtdHJlZSBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSB0cmVlLicgXAorICAgICd0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb2JqZWN0IElEIG9mIGEga25vd24gdHJlZS4nIFwKKyAgICAndGVzdCAiJHRyZWUiID0gNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCcKKworIyBWYXJpb3VzIHR5cGVzIG9mIG9iamVjdHMKK21rZGlyIHBhdGgyIHBhdGgzIHBhdGgzL3N1YnAzCitmb3IgcCBpbiBwYXRoMCBwYXRoMi9maWxlMiBwYXRoMy9maWxlMyBwYXRoMy9zdWJwMy9maWxlMworZG8KKyAgICBlY2hvICJoZWxsbyAkcCIgPiRwCisgICAgbG4gLXMgImhlbGxvICRwIiAke3B9c3ltCitkb25lCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnYWRkaW5nIHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cyB3aXRoIGdpdC11cGRhdGUtaW5kZXggLS1hZGQuJyBcCisgICAgJ2ZpbmQgcGF0aCogISAtdHlwZSBkIC1wcmludCB8IHhhcmdzIGdpdC11cGRhdGUtaW5kZXggLS1hZGQnCisKKyMgU2hvdyB0aGVtIGFuZCBzZWUgdGhhdCBtYXRjaGVzIHdoYXQgd2UgZXhwZWN0LgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Nob3dpbmcgc3RhZ2Ugd2l0aCBnaXQtbHMtZmlsZXMgLS1zdGFnZScgXAorICAgICdnaXQtbHMtZmlsZXMgLS1zdGFnZSA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0IDAJcGF0aDAKKzEyMDAwMCAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxIDAJcGF0aDBzeW0KKzEwMDY0NCAzZmVmZjk0OWVkMDBhNjJkOWY3YWY5N2MxNWNkOGEzMDU5NWU3YWM3IDAJcGF0aDIvZmlsZTIKKzEyMDAwMCBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4IDAJcGF0aDIvZmlsZTJzeW0KKzEwMDY0NCAwYWEzNGNhZTY4ZDA4Nzg1NzhhZDExOWM4NmNhMmI1ZWQ1YjI4Mzc2IDAJcGF0aDMvZmlsZTMKKzEyMDAwMCA4NTk5MTAzOTY5YjQzYWZmN2U0MzBlZmVhNzljYTQ2MzY0NjY3OTRmIDAJcGF0aDMvZmlsZTNzeW0KKzEwMDY0NCAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmIDAJcGF0aDMvc3VicDMvZmlsZTMKKzEyMDAwMCA2NjQ5YTFlYmU5ZTlmMWM1NTNiNjZmNWE2ZTc0MTM2YTA3Y2NjNTdjIDAJcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdC1scy1maWxlcyBvdXRwdXQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAnZGlmZiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdC13cml0ZS10cmVlLicgXAorICAgICd0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkdHJlZSIgPSAwODc3MDRhOTZiYWYxYzJkMWM4NjlhOGIwODQ0ODFlMTIxYzg4YjViJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2hvd2luZyB0cmVlIHdpdGggZ2l0LWxzLXRyZWUnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgPmN1cnJlbnQnCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IGJsb2IgZjg3MjkwZjhlYjJjYmJlYTc4NTcyMTQ0NTlhMDczOTkyN2VhYjE1NAlwYXRoMAorMTIwMDAwIGJsb2IgMTVhOTg0MzNhZTMzMTE0YjA4NWYzZWIzYmIwM2I4MzJiMzE4MGEwMQlwYXRoMHN5bQorMDQwMDAwIHRyZWUgNThhMDljMjNlMmNhMTUyMTkzZjI3ODZlMDY5ODZiN2I2NzEyYmRiZQlwYXRoMgorMDQwMDAwIHRyZWUgMjFhZTgyNjljYWNiZTU3YWUwOTEzOGRjYzNhMjg4N2Y5MDRkMDJiMwlwYXRoMworRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLXRyZWUgb3V0cHV0IGZvciBhIGtub3duIHRyZWUuJyBcCisgICAgJ2RpZmYgY3VycmVudCBleHBlY3RlZCcKKworIyBUaGlzIGNoYW5nZWQgaW4gbHMtdHJlZSBwYXRoc3BlYyBjaGFuZ2UgLS0gcmVjdXJzaXZlIGRvZXMKKyMgbm90IHNob3cgdHJlZSBub2RlcyBhbnltb3JlLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3Nob3dpbmcgdHJlZSB3aXRoIGdpdC1scy10cmVlIC1yJyBcCisgICAgJ2dpdC1scy10cmVlIC1yICR0cmVlID5jdXJyZW50JworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBibG9iIGY4NzI5MGY4ZWIyY2JiZWE3ODU3MjE0NDU5YTA3Mzk5MjdlYWIxNTQJcGF0aDAKKzEyMDAwMCBibG9iIDE1YTk4NDMzYWUzMzExNGIwODVmM2ViM2JiMDNiODMyYjMxODBhMDEJcGF0aDBzeW0KKzEwMDY0NCBibG9iIDNmZWZmOTQ5ZWQwMGE2MmQ5ZjdhZjk3YzE1Y2Q4YTMwNTk1ZTdhYzcJcGF0aDIvZmlsZTIKKzEyMDAwMCBibG9iIGQ4Y2UxNjFhZGRjNTE3Mzg2N2EzYzNjNzMwOTI0Mzg4ZGFlZGJjMzgJcGF0aDIvZmlsZTJzeW0KKzEwMDY0NCBibG9iIDBhYTM0Y2FlNjhkMDg3ODU3OGFkMTE5Yzg2Y2EyYjVlZDViMjgzNzYJcGF0aDMvZmlsZTMKKzEyMDAwMCBibG9iIDg1OTkxMDM5NjliNDNhZmY3ZTQzMGVmZWE3OWNhNDYzNjQ2Njc5NGYJcGF0aDMvZmlsZTNzeW0KKzEwMDY0NCBibG9iIDAwZmI1OTA4Y2I5N2MyNTY0YTk3ODNjMGM2NDA4NzMzM2IzYjQ2NGYJcGF0aDMvc3VicDMvZmlsZTMKKzEyMDAwMCBibG9iIDY2NDlhMWViZTllOWYxYzU1M2I2NmY1YTZlNzQxMzZhMDdjY2M1N2MJcGF0aDMvc3VicDMvZmlsZTNzeW0KK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy10cmVlIC1yIG91dHB1dCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICdkaWZmIGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMgQnV0IHdpdGggLXIgLXQgd2UgY2FuIGhhdmUgYm90aC4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzaG93aW5nIHRyZWUgd2l0aCBnaXQtbHMtdHJlZSAtciAtdCcgXAorICAgICdnaXQtbHMtdHJlZSAtciAtdCAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisxMDA2NDQgYmxvYiBmODcyOTBmOGViMmNiYmVhNzg1NzIxNDQ1OWEwNzM5OTI3ZWFiMTU0CXBhdGgwCisxMjAwMDAgYmxvYiAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxCXBhdGgwc3ltCiswNDAwMDAgdHJlZSA1OGEwOWMyM2UyY2ExNTIxOTNmMjc4NmUwNjk4NmI3YjY3MTJiZGJlCXBhdGgyCisxMDA2NDQgYmxvYiAzZmVmZjk0OWVkMDBhNjJkOWY3YWY5N2MxNWNkOGEzMDU5NWU3YWM3CXBhdGgyL2ZpbGUyCisxMjAwMDAgYmxvYiBkOGNlMTYxYWRkYzUxNzM4NjdhM2MzYzczMDkyNDM4OGRhZWRiYzM4CXBhdGgyL2ZpbGUyc3ltCiswNDAwMDAgdHJlZSAyMWFlODI2OWNhY2JlNTdhZTA5MTM4ZGNjM2EyODg3ZjkwNGQwMmIzCXBhdGgzCisxMDA2NDQgYmxvYiAwYWEzNGNhZTY4ZDA4Nzg1NzhhZDExOWM4NmNhMmI1ZWQ1YjI4Mzc2CXBhdGgzL2ZpbGUzCisxMjAwMDAgYmxvYiA4NTk5MTAzOTY5YjQzYWZmN2U0MzBlZmVhNzljYTQ2MzY0NjY3OTRmCXBhdGgzL2ZpbGUzc3ltCiswNDAwMDAgdHJlZSAzYzVlNTM5OWYzYTMzM2VkZGVjY2U3YTliOTQ2NWI2M2Y2NWY1MWUyCXBhdGgzL3N1YnAzCisxMDA2NDQgYmxvYiAwMGZiNTkwOGNiOTdjMjU2NGE5NzgzYzBjNjQwODczMzNiM2I0NjRmCXBhdGgzL3N1YnAzL2ZpbGUzCisxMjAwMDAgYmxvYiA2NjQ5YTFlYmU5ZTlmMWM1NTNiNjZmNWE2ZTc0MTM2YTA3Y2NjNTdjCXBhdGgzL3N1YnAzL2ZpbGUzc3ltCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtdHJlZSAtciBvdXRwdXQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAnZGlmZiBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyBwYXJ0aWFsIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUgLS1wcmVmaXguJyBcCisgICAgJ3B0cmVlPSQoZ2l0LXdyaXRlLXRyZWUgLS1wcmVmaXg9cGF0aDMpJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG9iamVjdCBJRCBmb3IgYSBrbm93biB0cmVlLicgXAorICAgICd0ZXN0ICIkcHRyZWUiID0gMjFhZTgyNjljYWNiZTU3YWUwOTEzOGRjYzNhMjg4N2Y5MDRkMDJiMycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgcGFydGlhbCB0cmVlIG91dCB3aXRoIGdpdC13cml0ZS10cmVlIC0tcHJlZml4LicgXAorICAgICdwdHJlZT0kKGdpdC13cml0ZS10cmVlIC0tcHJlZml4PXBhdGgzL3N1YnAzKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvYmplY3QgSUQgZm9yIGEga25vd24gdHJlZS4nIFwKKyAgICAndGVzdCAiJHB0cmVlIiA9IDNjNWU1Mzk5ZjNhMzMzZWRkZWNjZTdhOWI5NDY1YjYzZjY1ZjUxZTInCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3JtIC5naXQvaW5kZXgKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtcmVhZC10cmVlIGZvbGxvd2VkIGJ5IHdyaXRlLXRyZWUgc2hvdWxkIGJlIGlkZW1wb3RlbnQuJyBcCisgICAgJ2dpdC1yZWFkLXRyZWUgJHRyZWUgJiYKKyAgICAgdGVzdCAtZiAuZ2l0L2luZGV4ICYmCisgICAgIG5ld3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICAgdGVzdCAiJG5ld3RyZWUiID0gIiR0cmVlIicKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGY4NzI5MGY4ZWIyY2JiZWE3ODU3MjE0NDU5YTA3Mzk5MjdlYWIxNTQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgwCis6MTIwMDAwIDEyMDAwMCAxNWE5ODQzM2FlMzMxMTRiMDg1ZjNlYjNiYjAzYjgzMmIzMTgwYTAxIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMHN5bQorOjEwMDY0NCAxMDA2NDQgM2ZlZmY5NDllZDAwYTYyZDlmN2FmOTdjMTVjZDhhMzA1OTVlN2FjNyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDIvZmlsZTIKKzoxMjAwMDAgMTIwMDAwIGQ4Y2UxNjFhZGRjNTE3Mzg2N2EzYzNjNzMwOTI0Mzg4ZGFlZGJjMzggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgyL2ZpbGUyc3ltCis6MTAwNjQ0IDEwMDY0NCAwYWEzNGNhZTY4ZDA4Nzg1NzhhZDExOWM4NmNhMmI1ZWQ1YjI4Mzc2IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMy9maWxlMworOjEyMDAwMCAxMjAwMDAgODU5OTEwMzk2OWI0M2FmZjdlNDMwZWZlYTc5Y2E0NjM2NDY2Nzk0ZiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIE0JcGF0aDMvZmlsZTNzeW0KKzoxMDA2NDQgMTAwNjQ0IDAwZmI1OTA4Y2I5N2MyNTY0YTk3ODNjMGM2NDA4NzMzM2IzYjQ2NGYgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBNCXBhdGgzL3N1YnAzL2ZpbGUzCis6MTIwMDAwIDEyMDAwMCA2NjQ5YTFlYmU5ZTlmMWM1NTNiNjZmNWE2ZTc0MTM2YTA3Y2NjNTdjIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgTQlwYXRoMy9zdWJwMy9maWxlM3N5bQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZ2l0LWRpZmYtZmlsZXMgb3V0cHV0IGZvciBhIGtub3cgY2FjaGUvd29yayB0cmVlIHN0YXRlLicgXAorICAgICdnaXQtZGlmZi1maWxlcyA+Y3VycmVudCAmJiBkaWZmID4vZGV2L251bGwgLWIgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoIHNob3VsZCBzdWNjZWVkLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ25vIGRpZmYgYWZ0ZXIgY2hlY2tvdXQgYW5kIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoLicgXAorICAgICdnaXQtZGlmZi1maWxlcyA+Y3VycmVudCAmJiBjbXAgLXMgY3VycmVudCAvZGV2L251bGwnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1A9MDg3NzA0YTk2YmFmMWMyZDFjODY5YThiMDg0NDgxZTEyMWM4OGI1YgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1jb21taXQtdHJlZSByZWNvcmRzIHRoZSBjb3JyZWN0IHRyZWUgaW4gYSBjb21taXQuJyBcCisgICAgJ2NvbW1pdDA9JChlY2hvIE5PIHwgZ2l0LWNvbW1pdC10cmVlICRQKSAmJgorICAgICB0cmVlPSQoZ2l0IHNob3cgLS1wcmV0dHk9cmF3ICRjb21taXQwIHwKKwkgc2VkIC1uIC1lICJzL150cmVlIC8vcCIgLWUgIi9eYXV0aG9yIC9xIikgJiYKKyAgICAgdGVzdCAieiR0cmVlIiA9ICJ6JFAiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWNvbW1pdC10cmVlIHJlY29yZHMgdGhlIGNvcnJlY3QgcGFyZW50IGluIGEgY29tbWl0LicgXAorICAgICdjb21taXQxPSQoZWNobyBOTyB8IGdpdC1jb21taXQtdHJlZSAkUCAtcCAkY29tbWl0MCkgJiYKKyAgICAgcGFyZW50PSQoZ2l0IHNob3cgLS1wcmV0dHk9cmF3ICRjb21taXQxIHwKKwkgc2VkIC1uIC1lICJzL15wYXJlbnQgLy9wIiAtZSAiL15hdXRob3IgL3EiKSAmJgorICAgICB0ZXN0ICJ6JGNvbW1pdDAiID0gInokcGFyZW50IicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1jb21taXQtdHJlZSBvbWl0cyBkdXBsaWNhdGVkIHBhcmVudCBpbiBhIGNvbW1pdC4nIFwKKyAgICAnY29tbWl0Mj0kKGVjaG8gTk8gfCBnaXQtY29tbWl0LXRyZWUgJFAgLXAgJGNvbW1pdDAgLXAgJGNvbW1pdDApICYmCisgICAgIHBhcmVudD0kKGdpdCBzaG93IC0tcHJldHR5PXJhdyAkY29tbWl0MiB8CisJIHNlZCAtbiAtZSAicy9ecGFyZW50IC8vcCIgLWUgIi9eYXV0aG9yIC9xIiB8CisJIHNvcnQgLXUpICYmCisgICAgIHRlc3QgInokY29tbWl0MCIgPSAieiRwYXJlbnQiICYmCisgICAgIG51bXBhcmVudD0kKGdpdCBzaG93IC0tcHJldHR5PXJhdyAkY29tbWl0MiB8CisJIHNlZCAtbiAtZSAicy9ecGFyZW50IC8vcCIgLWUgIi9eYXV0aG9yIC9xIiB8CisJIHdjIC1sKSAmJgorICAgICB0ZXN0ICRudW1wYXJlbnQgPSAxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDAwMTAtcmFjeS1naXQuc2ggYi90L3QwMDEwLXJhY3ktZ2l0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NWE5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QwMDEwLXJhY3ktZ2l0LnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdyYWN5IEdJVCcKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgVGhpcyB0ZXN0IGNhbiBnaXZlIGZhbHNlIHN1Y2Nlc3MgaWYgeW91ciBtYWNoaW5lIGlzIHN1ZmZpY2llbnRseQorIyBzbG93IG9yIHlvdXIgdHJpYWwgaGFwcGVuZWQgdG8gaGFwcGVuIG9uIHNlY29uZCBib3VuZGFyeS4KKworZm9yIHRyaWFsIGluIDAgMSAyIDMgNAorZG8KKwlybSAtZiAuZ2l0L2luZGV4CisJZWNobyBmcm90eiA+aW5mb2NvbQorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgaW5mb2NvbQorCWVjaG8geHl6enkgPmluZm9jb20KKworCWZpbGVzPWBnaXQgZGlmZi1maWxlcyAtcGAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiUmFjeSBHSVQgdHJpYWwgIyR0cmlhbCBwYXJ0IEEiIFwKKwkndGVzdCAiIiAhPSAiJGZpbGVzIicKKworCXNsZWVwIDEKKwllY2hvIHh5enp5ID5jb3JuZXJzdG9uZQorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgY29ybmVyc3RvbmUKKworCWZpbGVzPWBnaXQgZGlmZi1maWxlcyAtcGAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiUmFjeSBHSVQgdHJpYWwgIyR0cmlhbCBwYXJ0IEIiIFwKKwkndGVzdCAiIiAhPSAiJGZpbGVzIicKKworZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMDAtcmVhZC10cmVlLW0tM3dheS5zaCBiL3QvdDEwMDAtcmVhZC10cmVlLW0tM3dheS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGFmOGMzCi0tLSAvZGV2L251bGwKKysrIGIvdC90MTAwMC1yZWFkLXRyZWUtbS0zd2F5LnNoCkBAIC0wLDAgKzEsNTE0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1RocmVlIHdheSBtZXJnZSB3aXRoIHJlYWQtdHJlZSAtbQorCitUaGlzIHRlc3QgdHJpZXMgdGhyZWUtd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tCisKK1RoZXJlIGlzIG9uZSBhbmNlc3RvciAoY2FsbGVkIE8gZm9yIE9yaWdpbmFsKSBhbmQgdHdvIGJyYW5jaGVzIEEKK2FuZCBCIGRlcml2ZWQgZnJvbSBpdC4gIFdlIHdhbnQgdG8gZG8gYSAzLXdheSBtZXJnZSBiZXR3ZWVuIEEgYW5kCitCLCB1c2luZyBPIGFzIHRoZSBjb21tb24gYW5jZXN0b3IuCisKKyAgICBtZXJnZSBBIE8gQgorCitEZWNpc2lvbnMgYXJlIG1hZGUgYnkgY29tcGFyaW5nIGNvbnRlbnRzIG9mIE8sIEEgYW5kIEIgcGF0aG5hbWUKK2J5IHBhdGhuYW1lLiAgVGhlIHJlc3VsdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcgZ3VpZGluZworcHJpbmNpcGxlOgorCisgLSBJZiBvbmx5IEEgZG9lcyBzb21ldGhpbmcgdG8gaXQgYW5kIEIgZG9lcyBub3QgdG91Y2ggaXQsIHRha2UKKyAgIHdoYXRldmVyIEEgZG9lcy4KKworIC0gSWYgb25seSBCIGRvZXMgc29tZXRoaW5nIHRvIGl0IGFuZCBBIGRvZXMgbm90IHRvdWNoIGl0LCB0YWtlCisgICB3aGF0ZXZlciBCIGRvZXMuCisKKyAtIElmIGJvdGggQSBhbmQgQiBkb2VzIHNvbWV0aGluZyBidXQgaW4gdGhlIHNhbWUgd2F5LCB0YWtlCisgICB3aGF0ZXZlciB0aGV5IGRvLgorCisgLSBJZiBBIGFuZCBCIGRvZXMgc29tZXRoaW5nIGJ1dCBkaWZmZXJlbnQgdGhpbmdzLCB3ZSBuZWVkIGEKKyAgIDMtd2F5IG1lcmdlOgorCisgICAtIFdlIGNhbm5vdCBkbyBhbnl0aGluZyBhYm91dCB0aGUgZm9sbG93aW5nIGNhc2VzOgorCisgICAgICogTyBkb2VzIG5vdCBoYXZlIGl0LiAgQSBhbmQgQiBib3RoIG11c3QgYmUgYWRkaW5nIHRvIHRoZQorICAgICAgIHNhbWUgcGF0aCBpbmRlcGVuZGVudGx5LgorCisgICAgICogQSBkZWxldGVzIGl0LiAgQiBtdXN0IGJlIG1vZGlmeWluZy4KKworICAgLSBPdGhlcndpc2UsIEEgYW5kIEIgYXJlIG1vZGlmeWluZy4gIFJ1biAzLXdheSBtZXJnZS4KKworRmlyc3QsIHRoZSBjYXNlIG1hdHJpeC4KKworIC0gVmVydGljYWwgYXhpcyBpcyBmb3IgQSdcJydzIGFjdGlvbnMuCisgLSBIb3Jpem9udGFsIGF4aXMgaXMgZm9yIEInXCcncyBhY3Rpb25zLgorCisuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgQSAgICAgICAgQiB8IE5vIEFjdGlvbiAgfCAgIERlbGV0ZSAgIHwgICBNb2RpZnkgICB8ICAgIEFkZCAgICAgfAorfC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS18Cit8IE5vIEFjdGlvbiAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwKK3wgICAgICAgICAgICB8IHNlbGVjdCBPICAgfCBkZWxldGUgICAgIHwgc2VsZWN0IEIgICB8IHNlbGVjdCBCICAgfAorfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8Cit8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLXwKK3wgRGVsZXRlICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgKioqKioqKioqKiB8ICAgIGNhbiAgICAgfAorfCAgICAgICAgICAgIHwgZGVsZXRlICAgICB8IGRlbGV0ZSAgICAgfCBtZXJnZSAgICAgIHwgICAgbm90ICAgICB8Cit8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgaGFwcGVuICAgIHwKK3wtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tfAorfCBNb2RpZnkgICAgIHwgICAgICAgICAgICB8ICoqKioqKioqKiogfCA/Pz8/Pz8/Pz8/IHwgICAgY2FuICAgICB8Cit8ICAgICAgICAgICAgfCBzZWxlY3QgQSAgIHwgbWVyZ2UgICAgICB8IHNlbGVjdCBBPUIgfCAgICBub3QgICAgIHwKK3wgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgbWVyZ2UgICAgICB8ICBoYXBwZW4gICAgfAorfC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS18Cit8IEFkZCAgICAgICAgfCAgICAgICAgICAgIHwgICAgY2FuICAgICB8ICAgIGNhbiAgICAgfCA/Pz8/Pz8/Pz8/IHwKK3wgICAgICAgICAgICB8IHNlbGVjdCBBICAgfCAgICBub3QgICAgIHwgICAgbm90ICAgICB8IHNlbGVjdCBBPUIgfAorfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICBoYXBwZW4gICAgfCAgaGFwcGVuICAgIHwgbWVyZ2UgICAgICB8CisuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKworSW4gYWRkaXRpb246CisKKyBTUzogYSBzcGVjaWFsIGNhc2Ugb2YgTU0sIHdoZXJlIEEgYW5kIEIgbWFrZXMgdGhlIHNhbWUgbW9kaWZpY2F0aW9uLgorIExMOiBhIHNwZWNpYWwgY2FzZSBvZiBBQSwgd2hlcmUgQSBhbmQgQiBjcmVhdGVzIHRoZSBzYW1lIGZpbGUuCisgVFQ6IGEgc3BlY2lhbCBjYXNlIG9mIE1NLCB3aGVyZSBBIGFuZCBCIG1ha2VzIG1lcmdlYWJsZSBjaGFuZ2VzLgorIERGOiBhIHNwZWNpYWwgY2FzZSwgd2hlcmUgQSBtYWtlcyBhIGRpcmVjdG9yeSBhbmQgQiBtYWtlcyBhIGZpbGUuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9saWItcmVhZC10cmVlLW0tM3dheS5zaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRyaXZpYWwgIm1ham9yaXR5IHdoZW4gMyBzdGFnZXMgZXhpc3QiIG1lcmdlIHBsdXMgIzJBTFQsICMzQUxUCisjIGFuZCAjNUFMVCB0cml2aWFsIG1lcmdlcy4KKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBYIDIJQUEKKzEwMDY0NCBYIDMJQUEKKzEwMDY0NCBYIDAJQU4KKzEwMDY0NCBYIDEJREQKKzEwMDY0NCBYIDMJREYKKzEwMDY0NCBYIDIJREYvREYKKzEwMDY0NCBYIDEJRE0KKzEwMDY0NCBYIDMJRE0KKzEwMDY0NCBYIDEJRE4KKzEwMDY0NCBYIDMJRE4KKzEwMDY0NCBYIDAJTEwKKzEwMDY0NCBYIDEJTUQKKzEwMDY0NCBYIDIJTUQKKzEwMDY0NCBYIDEJTU0KKzEwMDY0NCBYIDIJTU0KKzEwMDY0NCBYIDMJTU0KKzEwMDY0NCBYIDAJTU4KKzEwMDY0NCBYIDAJTkEKKzEwMDY0NCBYIDEJTkQKKzEwMDY0NCBYIDIJTkQKKzEwMDY0NCBYIDAJTk0KKzEwMDY0NCBYIDAJTk4KKzEwMDY0NCBYIDAJU1MKKzEwMDY0NCBYIDEJVFQKKzEwMDY0NCBYIDIJVFQKKzEwMDY0NCBYIDMJVFQKKzEwMDY0NCBYIDIJWi9BQQorMTAwNjQ0IFggMwlaL0FBCisxMDA2NDQgWCAwCVovQU4KKzEwMDY0NCBYIDEJWi9ERAorMTAwNjQ0IFggMQlaL0RNCisxMDA2NDQgWCAzCVovRE0KKzEwMDY0NCBYIDEJWi9ETgorMTAwNjQ0IFggMwlaL0ROCisxMDA2NDQgWCAxCVovTUQKKzEwMDY0NCBYIDIJWi9NRAorMTAwNjQ0IFggMQlaL01NCisxMDA2NDQgWCAyCVovTU0KKzEwMDY0NCBYIDMJWi9NTQorMTAwNjQ0IFggMAlaL01OCisxMDA2NDQgWCAwCVovTkEKKzEwMDY0NCBYIDEJWi9ORAorMTAwNjQ0IFggMglaL05ECisxMDA2NDQgWCAwCVovTk0KKzEwMDY0NCBYIDAJWi9OTgorRU9GCisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorCitjaGVja19yZXN1bHQgKCkgeworICAgIGdpdC1scy1maWxlcyAtLXN0YWdlIHwgc2VkIC1lICdzLyAnIiRfeDQwIicgLyBYIC8nID5jdXJyZW50ICYmCisgICAgZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50Cit9CisKKyMgVGhpcyBpcyBkb25lIG9uIGFuIGVtcHR5IHdvcmsgZGlyZWN0b3J5LCB3aGljaCBpcyB0aGUgbm9ybWFsCisjIG1lcmdlIHBlcnNvbiBiZWhhdmlvdXIuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMy13YXkgbWVyZ2Ugd2l0aCBnaXQtcmVhZC10cmVlIC1tLCBlbXB0eSBjYWNoZScgXAorICAgICJybSAtZnIgW05ETUFMVFNdW05ETUFMVFNGXSBaICYmCisgICAgIHJtIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKKyMgVGhpcyBzdGFydHMgb3V0IHdpdGggdGhlIGZpcnN0IGhlYWQsIHdoaWNoIGlzIHRoZSBub3JtYWwKKyMgcGF0Y2ggc3VibWl0dGVyIGJlaGF2aW91ci4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICczLXdheSBtZXJnZSB3aXRoIGdpdC1yZWFkLXRyZWUgLW0sIG1hdGNoIEgnIFwKKyAgICAicm0gLWZyIFtORE1BTFRTXVtORE1BTFRTRl0gWiAmJgorICAgICBybSAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKKzogPDxcRU5EX09GX0NBU0VfVEFCTEUKKworV2UgaGF2ZSBzbyBmYXIgdGVzdGVkIG9ubHkgZW1wdHkgaW5kZXggYW5kIGNsZWFuLWFuZC1tYXRjaGluZy1BIGluZGV4CitjYXNlIHdoaWNoIGFyZSB0cml2aWFsLiAgTWFrZSBzdXJlIGluZGV4IHJlcXVpcmVtZW50cyBhcmUgYWxzbworY2hlY2tlZC4KKworImdpdC1yZWFkLXRyZWUgLW0gTyBBIEIiCisKKyAgICAgTyAgICAgICBBICAgICAgIEIgICAgICAgICByZXN1bHQgICAgICBpbmRleCByZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMSAgbWlzc2luZyBtaXNzaW5nIG1pc3NpbmcgICAtICAgICAgICAgICBtdXN0IG5vdCBleGlzdC4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMiAgbWlzc2luZyBtaXNzaW5nIGV4aXN0cyAgICB0YWtlIEIqICAgICBtdXN0IG1hdGNoIEIsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgMyAgbWlzc2luZyBleGlzdHMgIG1pc3NpbmcgICB0YWtlIEEqICAgICBtdXN0IG1hdGNoIEEsIGlmIGV4aXN0cy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgNCAgbWlzc2luZyBleGlzdHMgIEEhPUIgICAgICBubyBtZXJnZSAgICBtdXN0IG1hdGNoIEEgYW5kIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAtdG8tZGF0ZSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA1ICBtaXNzaW5nIGV4aXN0cyAgQT09QiAgICAgIHRha2UgQSAgICAgIG11c3QgbWF0Y2ggQSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA2ICBleGlzdHMgIG1pc3NpbmcgbWlzc2luZyAgIHJlbW92ZSAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA3ICBleGlzdHMgIG1pc3NpbmcgTyE9QiAgICAgIG5vIG1lcmdlICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA4ICBleGlzdHMgIG1pc3NpbmcgTz09QiAgICAgIHJlbW92ZSAgICAgIG11c3Qgbm90IGV4aXN0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA5ICBleGlzdHMgIE8hPUEgICAgbWlzc2luZyAgIG5vIG1lcmdlICAgIG11c3QgbWF0Y2ggQSBhbmQgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cC10by1kYXRlLCBpZiBleGlzdHMuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTAgIGV4aXN0cyAgTz09QSAgICBtaXNzaW5nICAgcmVtb3ZlICAgICAgZGl0dG8KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxMSAgZXhpc3RzICBPIT1BICAgIE8hPUIgICAgICBubyBtZXJnZSAgICBtdXN0IG1hdGNoIEEgYW5kIGJlCisgICAgICAgICAgICAgICAgICAgICBBIT1CICAgICAgICAgICAgICAgICAgdXAtdG8tZGF0ZSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDEyICBleGlzdHMgIE8hPUEgICAgTyE9QiAgICAgIHRha2UgQSAgICAgIG11c3QgbWF0Y2ggQSwgaWYgZXhpc3RzLgorICAgICAgICAgICAgICAgICAgICAgQT09QgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDEzICBleGlzdHMgIE8hPUEgICAgTz09QiAgICAgIHRha2UgQSAgICAgIG11c3QgbWF0Y2ggQSwgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDE0ICBleGlzdHMgIE89PUEgICAgTyE9QiAgICAgIHRha2UgQiAgICAgIGlmIGV4aXN0cywgbXVzdCBlaXRoZXIgKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggQSBhbmQgYmUgdXAtdG8tZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAoMikgbWF0Y2ggQi4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxNSAgZXhpc3RzICBPPT1BICAgIE89PUIgICAgICB0YWtlIEIgICAgICBtdXN0IG1hdGNoIEEgaWYgZXhpc3RzLgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDE2ICBleGlzdHMgIE89PUEgICAgTz09QiAgICAgIGJhcmYgICAgICAgIG11c3QgbWF0Y2ggQSBpZiBleGlzdHMuCisgICAgICptdWx0aSogaW4gb25lICBpbiBhbm90aGVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05vdGU6IHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBpbiBjYXNlIDIgYW5kIDMuICBUaGUgdHJlZSBBIG1heSBjb250YWluCitERiAoZmlsZSkgd2hlbiB0cmVlIEIgcmVxdWlyZSBERiB0byBiZSBhIGRpcmVjdG9yeSBieSBoYXZpbmcgREYvREYKKyhmaWxlKS4KKworRU5EX09GX0NBU0VfVEFCTEUKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzEgLSBtdXN0IG5vdCBoYXZlIGFuIGVudHJ5IG5vdCBpbiBBLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IFhYICYmCisgICAgIGVjaG8gWFggPlhYICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgWFggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIgLSBtdXN0IG1hdGNoIEIgaW4gIU8gJiYgIUEgJiYgQiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5BICYmCisgICAgIGNwIC5vcmlnLUIvTkEgTkEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOQSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMiAtIG1hdGNoaW5nIEIgYWxvbmUgaXMgT0sgaW4gIU8gJiYgIUEgJiYgQiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5BICYmCisgICAgIGNwIC5vcmlnLUIvTkEgTkEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOQSAmJgorICAgICBlY2hvIGV4dHJhID4+TkEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzMgLSBtdXN0IG1hdGNoIEEgaW4gIU8gJiYgQSAmJiAhQiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEFOICYmCisgICAgIGNwIC5vcmlnLUEvQU4gQU4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzMgLSBtYXRjaGluZyBBIGFsb25lIGlzIE9LIGluICFPICYmIEEgJiYgIUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBBTiAmJgorICAgICBjcCAub3JpZy1BL0FOIEFOICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQU4gJiYKKyAgICAgZWNobyBleHRyYSA+PkFOICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICczIChmYWlsKSAtIG11c3QgbWF0Y2ggQSBpbiAhTyAmJiBBICYmICFCIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggQU4gJiYKKyAgICAgY3AgLm9yaWctQS9BTiBBTiAmJgorICAgICBlY2hvIGV4dHJhID4+QU4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNCAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gIU8gJiYgQSAmJiBCICYmIEEhPUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBBQSAmJgorICAgICBjcCAub3JpZy1BL0FBIEFBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQUEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc0IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gIU8gJiYgQSAmJiBCICYmIEEhPUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBBQSAmJgorICAgICBjcCAub3JpZy1BL0FBIEFBICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQUEgJiYKKyAgICAgZWNobyBleHRyYSA+PkFBICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc0IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gIU8gJiYgQSAmJiBCICYmIEEhPUIgY2FzZS4nIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBBQSAmJgorICAgICBjcCAub3JpZy1BL0FBIEFBICYmCisgICAgIGVjaG8gZXh0cmEgPj5BQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEFBICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc1IC0gbXVzdCBtYXRjaCBpbiAhTyAmJiBBICYmIEIgJiYgQT09QiBjYXNlLicgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IExMICYmCisgICAgIGNwIC5vcmlnLUEvTEwgTEwgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBMTCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzUgLSBtdXN0IG1hdGNoIGluICFPICYmIEEgJiYgQiAmJiBBPT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTEwgJiYKKyAgICAgY3AgLm9yaWctQS9MTCBMTCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIExMICYmCisgICAgIGVjaG8gZXh0cmEgPj5MTCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzUgKGZhaWwpIC0gbXVzdCBtYXRjaCBBIGluICFPICYmIEEgJiYgQiAmJiBBPT1CIGNhc2UuJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTEwgJiYKKyAgICAgY3AgLm9yaWctQS9MTCBMTCAmJgorICAgICBlY2hvIGV4dHJhID4+TEwgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBMTCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnNiAtIG11c3Qgbm90IGV4aXN0IGluIE8gJiYgIUEgJiYgIUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEREICYmCisgICAgIGVjaG8gREQgPkRECisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgREQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzcgLSBtdXN0IG5vdCBleGlzdCBpbiBPICYmICFBICYmIEIgJiYgTyE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggRE0gJiYKKyAgICAgY3AgLm9yaWctQi9ETSBETSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIERNICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICc4IC0gbXVzdCBub3QgZXhpc3QgaW4gTyAmJiAhQSAmJiBCICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IEROICYmCisgICAgIGNwIC5vcmlnLUIvRE4gRE4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBETiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE8hPUEgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1EICYmCisgICAgIGNwIC5vcmlnLUEvTUQgTUQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNRCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzkgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgIUIgJiYgTyE9QSBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTUQgJiYKKyAgICAgY3AgLm9yaWctQS9NRCBNRCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1EICYmCisgICAgIGVjaG8gZXh0cmEgPj5NRCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnOSAoZmFpbCkgLSBtdXN0IG1hdGNoIGFuZCBiZSB1cC10by1kYXRlIGluIE8gJiYgQSAmJiAhQiAmJiBPIT1BIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBNRCAmJgorICAgICBjcCAub3JpZy1BL01EIE1EICYmCisgICAgIGVjaG8gZXh0cmEgPj5NRCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1EICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMCAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE89PUEgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5EICYmCisgICAgIGNwIC5vcmlnLUEvTkQgTkQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBORCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzEwIChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE89PUEgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5EICYmCisgICAgIGNwIC5vcmlnLUEvTkQgTkQgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBORCAmJgorICAgICBlY2hvIGV4dHJhID4+TkQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzEwIChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmICFCICYmIE89PUEgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5EICYmCisgICAgIGNwIC5vcmlnLUEvTkQgTkQgJiYKKyAgICAgZWNobyBleHRyYSA+Pk5EICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTkQgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzExIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE8hPUIgJiYgQSE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU0gJiYKKyAgICAgY3AgLm9yaWctQS9NTSBNTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTEgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE8hPUIgJiYgQSE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU0gJiYKKyAgICAgY3AgLm9yaWctQS9NTSBNTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1NICYmCisgICAgIGVjaG8gZXh0cmEgPj5NTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTEgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE8hPUIgJiYgQSE9QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU0gJiYKKyAgICAgY3AgLm9yaWctQS9NTSBNTSAmJgorICAgICBlY2hvIGV4dHJhID4+TU0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTIgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBBPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBTUyAmJgorICAgICBjcCAub3JpZy1BL1NTIFNTICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgU1MgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMiAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIEE9PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IFNTICYmCisgICAgIGNwIC5vcmlnLUEvU1MgU1MgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBTUyAmJgorICAgICBlY2hvIGV4dHJhID4+U1MgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiAmJgorICAgICBjaGVja19yZXN1bHQiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICcxMiAoZmFpbCkgLSBtdXN0IG1hdGNoIEEgaW4gTyAmJiBBICYmIEIgJiYgTyE9QSAmJiBBPT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBTUyAmJgorICAgICBjcCAub3JpZy1BL1NTIFNTICYmCisgICAgIGVjaG8gZXh0cmEgPj5TUyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIFNTICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMyAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPIT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE1OICYmCisgICAgIGNwIC5vcmlnLUEvTU4gTU4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBNTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEzIC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE8hPUEgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTU4gJiYKKyAgICAgY3AgLm9yaWctQS9NTiBNTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE1OICYmCisgICAgIGVjaG8gZXh0cmEgPj5NTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUEvTk0gTk0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gbWF5IG1hdGNoIEIgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTSAmJgorICAgICBjcCAub3JpZy1CL05NIE5NICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk0gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IgJiYKKyAgICAgY2hlY2tfcmVzdWx0IgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnMTQgKGZhaWwpIC0gbXVzdCBtYXRjaCBhbmQgYmUgdXAtdG8tZGF0ZSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE8hPUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5NICYmCisgICAgIGNwIC5vcmlnLUEvTk0gTk0gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTSAmJgorICAgICBlY2hvIGV4dHJhID4+Tk0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzE0IChmYWlsKSAtIG11c3QgbWF0Y2ggYW5kIGJlIHVwLXRvLWRhdGUgaW4gTyAmJiBBICYmIEIgJiYgTz09QSAmJiBPIT1CIGNhc2UnIFwKKyAgICAicm0gLWYgLmdpdC9pbmRleCBOTSAmJgorICAgICBjcCAub3JpZy1BL05NIE5NICYmCisgICAgIGVjaG8gZXh0cmEgPj5OTSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5NICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gJHRyZWVfTyAkdHJlZV9BICR0cmVlX0IiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5OICYmCisgICAgIGNwIC5vcmlnLUEvTk4gTk4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBOTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE1IC0gbXVzdCBtYXRjaCBBIGluIE8gJiYgQSAmJiBCICYmIE89PUEgJiYgTz09QiBjYXNlJyBcCisgICAgInJtIC1mIC5naXQvaW5kZXggTk4gJiYKKyAgICAgY3AgLm9yaWctQS9OTiBOTiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIE5OICYmCisgICAgIGVjaG8gZXh0cmEgPj5OTiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlX08gJHRyZWVfQSAkdHJlZV9CICYmCisgICAgIGNoZWNrX3Jlc3VsdCIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJzE1IChmYWlsKSAtIG11c3QgbWF0Y2ggQSBpbiBPICYmIEEgJiYgQiAmJiBPPT1BICYmIE89PUIgY2FzZScgXAorICAgICJybSAtZiAuZ2l0L2luZGV4IE5OICYmCisgICAgIGNwIC5vcmlnLUEvTk4gTk4gJiYKKyAgICAgZWNobyBleHRyYSA+Pk5OICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgTk4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZV9PICR0cmVlX0EgJHRyZWVfQiIKKworIyAjMTYKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNiAtIEEgbWF0Y2hlcyBpbiBvbmUgYW5kIEIgbWF0Y2hlcyBpbiBhbm90aGVyLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IEYxNiAmJgorICAgIGVjaG8gRjE2ID5GMTYgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEYxNiAmJgorICAgIHRyZWUwPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICBlY2hvIEUxNiA+RjE2ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCBGMTYgJiYKKyAgICB0cmVlMT1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZTAgJHRyZWUxICR0cmVlMSAkdHJlZTAgJiYKKyAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMDAxLXJlYWQtdHJlZS1tLTJ3YXkuc2ggYi90L3QxMDAxLXJlYWQtdHJlZS1tLTJ3YXkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzVlNGM5YQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMDEtcmVhZC10cmVlLW0tMndheS5zaApAQCAtMCwwICsxLDM0NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUd28gd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tICRIICRNCisKK1RoaXMgdGVzdCB0cmllcyB0d28td2F5IG1lcmdlIChha2EgZmFzdCBmb3J3YXJkIHdpdGggY2FycnkgZm9yd2FyZCkuCisKK1RoZXJlIGlzIHRoZSBoZWFkIChjYWxsZWQgSCkgYW5kIGFub3RoZXIgY29tbWl0IChjYWxsZWQgTSksIHdoaWNoIGlzCitzaW1wbHkgYWhlYWQgb2YgSC4gIFRoZSBpbmRleCBhbmQgdGhlIHdvcmsgdHJlZSBjb250YWlucyBhIHN0YXRlIHRoYXQKK2lzIGRlcml2ZWQgZnJvbSBILCBidXQgbWF5IGFsc28gaGF2ZSBsb2NhbCBjaGFuZ2VzLiAgVGhpcyB0ZXN0IGNoZWNrcworYWxsIHRoZSBjb21iaW5hdGlvbnMgZGVzY3JpYmVkIGluIHRoZSB0d28tdHJlZSBtZXJnZSAiY2FycnkgZm9yd2FyZCIKK3J1bGVzLCBmb3VuZCBpbiA8RG9jdW1lbnRhdGlvbi9naXQtcmVhZC10cmVlLnR4dD4uCisKK0luIHRoZSB0ZXN0LCB0aGVzZSBwYXRocyBhcmUgdXNlZDoKKyAgICAgICAgYm96YmFyICAtIGluIEgsIHN0YXlzIGluIE0sIG1vZGlmaWVkIGZyb20gYm96YmFyIHRvIGdudXN0bworICAgICAgICBmcm90eiAgIC0gbm90IGluIEggYWRkZWQgaW4gTQorICAgICAgICBuaXRmb2wgIC0gaW4gSCwgc3RheXMgaW4gTSB1bm1vZGlmaWVkCisgICAgICAgIHJlenJvdiAgLSBpbiBILCBkZWxldGVkIGluIE0KKyAgICAgICAgeW9taW4gICAtIG5vdCBpbiBIIG5vciBNCisnCisuIC4vdGVzdC1saWIuc2gKKworcmVhZF90cmVlX3R3b3dheSAoKSB7CisgICAgZ2l0LXJlYWQtdHJlZSAtbSAiJDEiICIkMiIgJiYgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UKK30KKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCitjb21wYXJlX2NoYW5nZSAoKSB7CisJc2VkIC1uID5jdXJyZW50IFwKKwkgICAgLWUgJy9eLS0tIC9kOyAvXisrKyAvZDsgL15AQCAvZDsnIFwKKwkgICAgLWUgJ3MvXlwoWy0rXVswLTddWzAtN11bMC03XVswLTddWzAtN11bMC03XVwpICciJF94NDAiJyAvXDEgWCAvcCcgXAorCSAgICAiJDEiCisJZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50Cit9CisKK2NoZWNrX2NhY2hlX2F0ICgpIHsKKwljbGVhbl9pZl9lbXB0eT1gZ2l0LWRpZmYtZmlsZXMgLS0gIiQxImAKKwljYXNlICIkY2xlYW5faWZfZW1wdHkiIGluCisJJycpICBlY2hvICIkMTogY2xlYW4iIDs7CisJPyopICBlY2hvICIkMTogZGlydHkiIDs7CisJZXNhYworCWNhc2UgIiQyLCRjbGVhbl9pZl9lbXB0eSIgaW4KKwljbGVhbiwpCQk6ICAgICA7OworCWNsZWFuLD8qKQlmYWxzZSA7OworCWRpcnR5LCkJCWZhbHNlIDs7CisJZGlydHksPyopCTogICAgIDs7CisJZXNhYworfQorCitjYXQgPmJvemJhci1vbGQgPDxcRU9GCitUaGlzIGlzIGEgc2FtcGxlIGZpbGUgdXNlZCBpbiB0d28td2F5IGZhc3QgZm9yd2FyZCBtZXJnZQordGVzdHMuICBJdHMgc2Vjb25kIGxpbmUgZW5kcyB3aXRoIGEgbWFnaWMgd29yZCBib3piYXIKK3doaWNoIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhlIG1lcmdlZCBoZWFkIHRvIGdudXN0by4KK0l0IGhhcyBzb21lIGV4dHJhIGxpbmVzIHNvIHRoYXQgZXh0ZXJuYWwgdG9vbHMgY2FuCitzdWNjZXNzZnVsbHkgbWVyZ2UgaW5kZXBlbmRlbnQgY2hhbmdlcyBtYWRlIHRvIGxhdGVyCitsaW5lcyAoc3VjaCBhcyB0aGlzIG9uZSksIGF2b2lkaW5nIGxpbmUgY29uZmxpY3RzLgorRU9GCisKK3NlZCAtZSAncy9ib3piYXIvZ251c3RvIChlYXJsaWVyIGJvemJhcikvJyBib3piYXItb2xkID5ib3piYXItbmV3CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgIHNldHVwIFwKKyAgICAnZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZWNobyBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBjYXQgYm96YmFyLW9sZCA+Ym96YmFyICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZWNobyB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgYm96YmFyIHJlenJvdiAmJgorICAgICB0cmVlSD1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZUggJHRyZWVIICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlSCAmJgorCisgICAgIGNhdCBib3piYXItbmV3ID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiBib3piYXIgLS1mb3JjZS1yZW1vdmUgcmV6cm92ICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5NLm91dCAmJgorICAgICB0cmVlTT1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZU0gJHRyZWVNICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlTSAmJgorICAgICBnaXQtZGlmZi10cmVlICR0cmVlSCAkdHJlZU0nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxLCAyLCAzIC0gbm8gY2FycnkgZm9yd2FyZCcgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MS0zLm91dCAmJgorICAgICBkaWZmIC11IE0ub3V0IDEtMy5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgYm96YmFyIGRpcnR5ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGRpcnR5ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBkaXJ0eScKKworZWNobyAnKzEwMDY0NCBYIDAJeW9taW4nID5leHBlY3RlZAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNCAtIGNhcnJ5IGZvcndhcmQgbG9jYWwgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID40Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC11IE0ub3V0IDQub3V0ID40ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNGRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNSAtIGNhcnJ5IGZvcndhcmQgbG9jYWwgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgZWNobyB5b21pbiB5b21pbiA+eW9taW4gJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID41Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC11IE0ub3V0IDUub3V0ID41ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IHlvbWluIGRpcnR5JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNiAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+Ni5vdXQgJiYKKyAgICAgZGlmZiAtdSBNLm91dCA2Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBjbGVhbicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzcgLSBsb2NhbCBhZGRpdGlvbiBhbHJlYWR5IGhhcyB0aGUgc2FtZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjcub3V0ICYmCisgICAgIGRpZmYgLXUgTS5vdXQgNy5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc4IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gZnJvdHogZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOSAtIGNvbmZsaWN0aW5nIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGVjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEwIC0gcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTAub3V0ICYmCisgICAgIGRpZmYgLXUgTS5vdXQgMTAub3V0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTEgLSBkaXJ0eSBwYXRoIHJlbW92ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTIgLSB1bm1hdGNoaW5nIGxvY2FsIGNoYW5nZXMgYmVpbmcgcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTMgLSB1bm1hdGNoaW5nIGxvY2FsIGNoYW5nZXMgYmVpbmcgcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK2NhdCA+ZXhwZWN0ZWQgPDxFT0YKKy0xMDA2NDQgWCAwCW5pdGZvbAorKzEwMDY0NCBYIDAJbml0Zm9sCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE0IC0gdW5jaGFuZ2VkIGluIHR3byBoZWFkcy4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xNC5vdXQgfHwgcmV0dXJuIDEKKyAgICAgZGlmZiAtdSBNLm91dCAxNC5vdXQgPjE0ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgMTRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCBuaXRmb2wgY2xlYW4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNSAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE1Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC11IE0ub3V0IDE1Lm91dCA+MTVkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE2IC0gY29uZmxpY3RpbmcgbG9jYWwgY2hhbmdlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBlY2hvIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNyAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgZWNobyBib3piYXIgYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGlmIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE4IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIGNhdCBib3piYXItbmV3ID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID4xOC5vdXQgJiYKKyAgICAgZGlmZiAtdSBNLm91dCAxOC5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgYm96YmFyIGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTkgLSBsb2NhbCBjaGFuZ2UgYWxyZWFkeSBoYXZpbmcgYSBnb29kIHJlc3VsdCwgZnVydGhlciBtb2RpZmllZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgY2F0IGJvemJhci1uZXcgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhciAmJgorICAgICByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE5Lm91dCAmJgorICAgICBkaWZmIC11IE0ub3V0IDE5Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcyMCAtIG5vIGxvY2FsIGNoYW5nZSwgdXNlIG5ldyB0cmVlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVIICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtdSAtZiAtcSAtYSAmJgorICAgICBjYXQgYm96YmFyLW9sZCA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIHJlYWRfdHJlZV90d293YXkgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MjAub3V0ICYmCisgICAgIGRpZmYgLXUgTS5vdXQgMjAub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGJvemJhciBkaXJ0eScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIxIC0gbm8gbG9jYWwgY2hhbmdlLCBkaXJ0eSBjYWNoZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlSCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLXEgLWEgJiYKKyAgICAgY2F0IGJvemJhci1vbGQgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhciAmJgorICAgICBpZiByZWFkX3RyZWVfdHdvd2F5ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKKyMgVGhpcyBmYWlscyB3aXRoIHN0cmFpZ2h0IHR3by13YXkgZmFzdCBmb3J3YXJkLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIyIC0gbG9jYWwgY2hhbmdlIGNhY2hlIHVwZGF0ZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZUggJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC11IC1mIC1xIC1hICYmCisgICAgIHNlZCAtZSAicy9zdWNoIGFzL1NVQ0ggQVMvIiBib3piYXItb2xkID5ib3piYXIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBib3piYXIgJiYKKyAgICAgaWYgcmVhZF90cmVlX3R3b3dheSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCisjIEFsc28gbWFrZSBzdXJlIHdlIGRpZCBub3QgYnJlYWsgREYgdnMgREYvREYgY2FzZS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdERiB2cyBERi9ERiBjYXNlIHNldHVwLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4ICYmCisgICAgIGVjaG8gREYgPkRGICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgREYgJiYKKyAgICAgdHJlZURGPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlREYgJHRyZWVERiAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZURGICYmCisKKyAgICAgcm0gLWYgREYgJiYKKyAgICAgbWtkaXIgREYgJiYKKyAgICAgZWNobyBERi9ERiA+REYvREYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBERiBERi9ERiAmJgorICAgICB0cmVlREZERj1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gdHJlZURGREYgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlREZERiAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+REZERi5vdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdERiB2cyBERi9ERiBjYXNlIHRlc3QuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggJiYKKyAgICAgcm0gLWZyIERGICYmCisgICAgIGVjaG8gREYgPkRGICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgREYgJiYKKyAgICAgcmVhZF90cmVlX3R3b3dheSAkdHJlZURGICR0cmVlREZERiAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+REZERmNoZWNrLm91dCAmJgorICAgICBkaWZmIC11IERGREYub3V0IERGREZjaGVjay5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgREYvREYgZGlydHkgJiYKKyAgICAgOicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QxMDAyLXJlYWQtdHJlZS1tLXUtMndheS5zaCBiL3QvdDEwMDItcmVhZC10cmVlLW0tdS0yd2F5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhM2M4MTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAyLXJlYWQtdHJlZS1tLXUtMndheS5zaApAQCAtMCwwICsxLDM0NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUd28gd2F5IG1lcmdlIHdpdGggcmVhZC10cmVlIC1tIC11ICRIICRNCisKK1RoaXMgaXMgaWRlbnRpY2FsIHRvIHQxMDAxLCBidXQgdXNlcyAtdSB0byB1cGRhdGUgdGhlIHdvcmsgdHJlZSBhcyB3ZWxsLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCitjb21wYXJlX2NoYW5nZSAoKSB7CisJc2VkID5jdXJyZW50IFwKKwkgICAgLWUgJy9eLS0tIC9kOyAvXisrKyAvZDsgL15AQCAvZDsnIFwKKwkgICAgLWUgJ3MvXlwoLlswLTddWzAtN11bMC03XVswLTddWzAtN11bMC03XVwpICciJF94NDAiJyAvXDEgWCAvJyAiJDEiCisJZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50Cit9CisKK2NoZWNrX2NhY2hlX2F0ICgpIHsKKwljbGVhbl9pZl9lbXB0eT1gZ2l0LWRpZmYtZmlsZXMgLS0gIiQxImAKKwljYXNlICIkY2xlYW5faWZfZW1wdHkiIGluCisJJycpICBlY2hvICIkMTogY2xlYW4iIDs7CisJPyopICBlY2hvICIkMTogZGlydHkiIDs7CisJZXNhYworCWNhc2UgIiQyLCRjbGVhbl9pZl9lbXB0eSIgaW4KKwljbGVhbiwpCQk6ICAgICA7OworCWNsZWFuLD8qKQlmYWxzZSA7OworCWRpcnR5LCkJCWZhbHNlIDs7CisJZGlydHksPyopCTogICAgIDs7CisJZXNhYworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICBzZXR1cCBcCisgICAgJ2VjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGVjaG8gbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZWNobyBib3piYXIgPmJvemJhciAmJgorICAgICBlY2hvIHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgbml0Zm9sIGJvemJhciByZXpyb3YgJiYKKyAgICAgdHJlZUg9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVIICR0cmVlSCAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZUggJiYKKworICAgICBlY2hvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogYm96YmFyIC0tZm9yY2UtcmVtb3ZlIHJlenJvdiAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+TS5vdXQgJiYKKyAgICAgdHJlZU09YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVNICR0cmVlTSAmJgorICAgICBnaXQtbHMtdHJlZSAkdHJlZU0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPk0uc3VtICYmCisgICAgIGdpdC1kaWZmLXRyZWUgJHRyZWVIICR0cmVlTScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEsIDIsIDMgLSBubyBjYXJyeSBmb3J3YXJkJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjEtMy5vdXQgJiYKKyAgICAgY21wIE0ub3V0IDEtMy5vdXQgJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDMuc3VtICYmCisgICAgIGNtcCBNLnN1bSBhY3R1YWwzLnN1bSAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4gJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgZnJvdHogY2xlYW4gJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgbml0Zm9sIGNsZWFuJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNCAtIGNhcnJ5IGZvcndhcmQgbG9jYWwgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvICIrMTAwNjQ0IFggMAl5b21pbiIgPmV4cGVjdGVkICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID40Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC1VMCBNLm91dCA0Lm91dCA+NGRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCB5b21pbiBjbGVhbiAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsNC5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDQuc3VtICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluMSAmJgorICAgICBkaWZmIHlvbWluIHlvbWluMSAmJgorICAgICBybSAtZiB5b21pbjEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc1IC0gY2FycnkgZm9yd2FyZCBsb2NhbCBhZGRpdGlvbi4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICYmCisgICAgIGVjaG8geW9taW4gPnlvbWluICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgeW9taW4gJiYKKyAgICAgZWNobyB5b21pbiB5b21pbiA+eW9taW4gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID41Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC1VMCBNLm91dCA1Lm91dCA+NWRpZmYub3V0CisgICAgIGNvbXBhcmVfY2hhbmdlIDVkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBjaGVja19jYWNoZV9hdCB5b21pbiBkaXJ0eSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsNS5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDUuc3VtICYmCisgICAgIDogZGlydHkgaW5kZXggc2hvdWxkIGhhdmUgcHJldmVudGVkIC11IGZyb20gY2hlY2tpbmcgaXQgb3V0LiAmJgorICAgICBlY2hvIHlvbWluIHlvbWluID55b21pbjEgJiYKKyAgICAgZGlmZiB5b21pbiB5b21pbjEgJiYKKyAgICAgcm0gLWYgeW9taW4xJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnNiAtIGxvY2FsIGFkZGl0aW9uIGFscmVhZHkgaGFzIHRoZSBzYW1lLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjYub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDYub3V0ICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IGZyb3R6IGNsZWFuICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwzLnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMy5zdW0gJiYKKyAgICAgZWNobyBmcm90eiA+ZnJvdHoxICYmCisgICAgIGRpZmYgZnJvdHogZnJvdHoxICYmCisgICAgIHJtIC1mIGZyb3R6MScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzcgLSBsb2NhbCBhZGRpdGlvbiBhbHJlYWR5IGhhcyB0aGUgc2FtZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZnJvdHogJiYKKyAgICAgZWNobyBmcm90eiBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID43Lm91dCAmJgorICAgICBkaWZmIC1VMCBNLm91dCA3Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBmcm90eiBkaXJ0eSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6IG5pdGZvbCA+YWN0dWFsNy5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDcuc3VtOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpICYmCisgICAgIDogZGlydHkgaW5kZXggc2hvdWxkIGhhdmUgcHJldmVudGVkIC11IGZyb20gY2hlY2tpbmcgaXQgb3V0LiAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90ejEgJiYKKyAgICAgZGlmZiBmcm90eiBmcm90ejEgJiYKKyAgICAgcm0gLWYgZnJvdHoxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnOCAtIGNvbmZsaWN0aW5nIGFkZGl0aW9uLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBmcm90eiBmcm90eiA+ZnJvdHogJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmcm90eiAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICc5IC0gY29uZmxpY3RpbmcgYWRkaXRpb24uJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGZyb3R6IGZyb3R6ID5mcm90eiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgIGVjaG8gZnJvdHogPmZyb3R6ICYmCisgICAgIGlmIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTTsgdGhlbiBmYWxzZTsgZWxzZSA6OyBmaScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzEwIC0gcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjEwLm91dCAmJgorICAgICBjbXAgTS5vdXQgMTAub3V0ICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxMC5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDEwLnN1bScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzExIC0gZGlydHkgcGF0aCByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgPnJlenJvdiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHJlenJvdiAmJgorICAgICBlY2hvIHJlenJvdiByZXpyb3YgPnJlenJvdiAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxMiAtIHVubWF0Y2hpbmcgbG9jYWwgY2hhbmdlcyBiZWluZyByZW1vdmVkLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyByZXpyb3YgcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCByZXpyb3YgJiYKKyAgICAgaWYgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTMgLSB1bm1hdGNoaW5nIGxvY2FsIGNoYW5nZXMgYmVpbmcgcmVtb3ZlZC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gcmV6cm92IHJlenJvdiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIGVjaG8gcmV6cm92ID5yZXpyb3YgJiYKKyAgICAgaWYgZ2l0LXJlYWQtdHJlZSAtbSAtdSAkdHJlZUggJHRyZWVNOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpJworCitjYXQgPmV4cGVjdGVkIDw8RU9GCistMTAwNjQ0IFggMAluaXRmb2wKKysxMDA2NDQgWCAwCW5pdGZvbAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNCAtIHVuY2hhbmdlZCBpbiB0d28gaGVhZHMuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG5pdGZvbCAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE0Lm91dCB8fCByZXR1cm4gMQorICAgICBkaWZmIC1VMCBNLm91dCAxNC5vdXQgPjE0ZGlmZi5vdXQKKyAgICAgY29tcGFyZV9jaGFuZ2UgMTRkaWZmLm91dCBleHBlY3RlZCAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6ID5hY3R1YWwxNC5zdW0gJiYKKyAgICAgZ3JlcCAtdiBuaXRmb2wgTS5zdW0gPiBleHBlY3RlZDE0LnN1bSAmJgorICAgICBjbXAgZXhwZWN0ZWQxNC5zdW0gYWN0dWFsMTQuc3VtICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxNGEuc3VtICYmCisgICAgIGlmIGNtcCBNLnN1bSBhY3R1YWwxNGEuc3VtOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBjbGVhbiAmJgorICAgICBlY2hvIG5pdGZvbCBuaXRmb2wgPm5pdGZvbDEgJiYKKyAgICAgZGlmZiBuaXRmb2wgbml0Zm9sMSAmJgorICAgICBybSAtZiBuaXRmb2wxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTUgLSB1bmNoYW5nZWQgaW4gdHdvIGhlYWRzLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sID5uaXRmb2wgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBuaXRmb2wgJiYKKyAgICAgZWNobyBuaXRmb2wgbml0Zm9sIG5pdGZvbCA+bml0Zm9sICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTUub3V0IHx8IHJldHVybiAxCisgICAgIGRpZmYgLVUwIE0ub3V0IDE1Lm91dCA+MTVkaWZmLm91dAorICAgICBjb21wYXJlX2NoYW5nZSAxNWRpZmYub3V0IGV4cGVjdGVkICYmCisgICAgIGNoZWNrX2NhY2hlX2F0IG5pdGZvbCBkaXJ0eSAmJgorICAgICBzdW0gYm96YmFyIGZyb3R6ID5hY3R1YWwxNS5zdW0gJiYKKyAgICAgZ3JlcCAtdiBuaXRmb2wgTS5zdW0gPiBleHBlY3RlZDE1LnN1bSAmJgorICAgICBjbXAgZXhwZWN0ZWQxNS5zdW0gYWN0dWFsMTUuc3VtICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxNWEuc3VtICYmCisgICAgIGlmIGNtcCBNLnN1bSBhY3R1YWwxNWEuc3VtOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpICYmCisgICAgIGVjaG8gbml0Zm9sIG5pdGZvbCBuaXRmb2wgPm5pdGZvbDEgJiYKKyAgICAgZGlmZiBuaXRmb2wgbml0Zm9sMSAmJgorICAgICBybSAtZiBuaXRmb2wxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMTYgLSBjb25mbGljdGluZyBsb2NhbCBjaGFuZ2UuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxNyAtIGNvbmZsaWN0aW5nIGxvY2FsIGNoYW5nZS4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCBuaXRmb2wgYm96YmFyIHJlenJvdiBmcm90eiAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgJHRyZWVIICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gYm96YmFyIGJvemJhciBib3piYXIgPmJvemJhciAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICcxOCAtIGxvY2FsIGNoYW5nZSBhbHJlYWR5IGhhdmluZyBhIGdvb2QgcmVzdWx0LicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBnbnVzdG8gPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU0gJiYKKyAgICAgZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgPjE4Lm91dCAmJgorICAgICBkaWZmIC1VMCBNLm91dCAxOC5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgYm96YmFyIGNsZWFuICYmCisgICAgIHN1bSBib3piYXIgZnJvdHogbml0Zm9sID5hY3R1YWwxOC5zdW0gJiYKKyAgICAgY21wIE0uc3VtIGFjdHVhbDE4LnN1bScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzE5IC0gbG9jYWwgY2hhbmdlIGFscmVhZHkgaGF2aW5nIGEgZ29vZCByZXN1bHQsIGZ1cnRoZXIgbW9kaWZpZWQuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGVjaG8gZ251c3RvIGdudXN0byA+Ym96YmFyICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MTkub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDE5Lm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgZGlydHkgJiYKKyAgICAgc3VtIGZyb3R6IG5pdGZvbCA+YWN0dWFsMTkuc3VtICYmCisgICAgIGdyZXAgLXYgYm96YmFyICBNLnN1bSA+IGV4cGVjdGVkMTkuc3VtICYmCisgICAgIGNtcCBleHBlY3RlZDE5LnN1bSBhY3R1YWwxOS5zdW0gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDE5YS5zdW0gJiYKKyAgICAgaWYgY21wIE0uc3VtIGFjdHVhbDE5YS5zdW07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkgJiYKKyAgICAgZWNobyBnbnVzdG8gZ251c3RvID5ib3piYXIxICYmCisgICAgIGRpZmYgYm96YmFyIGJvemJhcjEgJiYKKyAgICAgcm0gLWYgYm96YmFyMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJzIwIC0gbm8gbG9jYWwgY2hhbmdlLCB1c2UgbmV3IHRyZWUuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXggbml0Zm9sIGJvemJhciByZXpyb3YgZnJvdHogJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICR0cmVlSCAmJgorICAgICBlY2hvIGJvemJhciA+Ym96YmFyICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgYm96YmFyICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLW0gLXUgJHRyZWVIICR0cmVlTSAmJgorICAgICBnaXQtbHMtZmlsZXMgLS1zdGFnZSA+MjAub3V0ICYmCisgICAgIGRpZmYgLVUwIE0ub3V0IDIwLm91dCAmJgorICAgICBjaGVja19jYWNoZV9hdCBib3piYXIgY2xlYW4gJiYKKyAgICAgc3VtIGJvemJhciBmcm90eiBuaXRmb2wgPmFjdHVhbDIwLnN1bSAmJgorICAgICBjbXAgTS5zdW0gYWN0dWFsMjAuc3VtJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnMjEgLSBubyBsb2NhbCBjaGFuZ2UsIGRpcnR5IGNhY2hlLicgXAorICAgICdybSAtZiAuZ2l0L2luZGV4IG5pdGZvbCBib3piYXIgcmV6cm92IGZyb3R6ICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAtdSAkdHJlZUggJiYKKyAgICAgZWNobyBib3piYXIgPmJvemJhciAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGJvemJhciAmJgorICAgICBlY2hvIGdudXN0byBnbnVzdG8gPmJvemJhciAmJgorICAgICBpZiBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlSCAkdHJlZU07IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmknCisKKyMgQWxzbyBtYWtlIHN1cmUgd2UgZGlkIG5vdCBicmVhayBERiB2cyBERi9ERiBjYXNlLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0RGIHZzIERGL0RGIGNhc2Ugc2V0dXAuJyBcCisgICAgJ3JtIC1mIC5naXQvaW5kZXgKKyAgICAgZWNobyBERiA+REYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERiAmJgorICAgICB0cmVlREY9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvIHRyZWVERiAkdHJlZURGICYmCisgICAgIGdpdC1scy10cmVlICR0cmVlREYgJiYKKworICAgICBybSAtZiBERiAmJgorICAgICBta2RpciBERiAmJgorICAgICBlY2hvIERGL0RGID5ERi9ERiAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIERGIERGL0RGICYmCisgICAgIHRyZWVERkRGPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyB0cmVlREZERiAkdHJlZURGREYgJiYKKyAgICAgZ2l0LWxzLXRyZWUgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5ERkRGLm91dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0RGIHZzIERGL0RGIGNhc2UgdGVzdC4nIFwKKyAgICAncm0gLWYgLmdpdC9pbmRleCAmJgorICAgICBybSAtZnIgREYgJiYKKyAgICAgZWNobyBERiA+REYgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBERiAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tIC11ICR0cmVlREYgJHRyZWVERkRGICYmCisgICAgIGdpdC1scy1maWxlcyAtLXN0YWdlID5ERkRGY2hlY2sub3V0ICYmCisgICAgIGRpZmYgLVUwIERGREYub3V0IERGREZjaGVjay5vdXQgJiYKKyAgICAgY2hlY2tfY2FjaGVfYXQgREYvREYgY2xlYW4nCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTAwMy1yZWFkLXRyZWUtcHJlZml4LnNoIGIvdC90MTAwMy1yZWFkLXRyZWUtcHJlZml4LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ4YWIxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMDAzLXJlYWQtdHJlZS1wcmVmaXguc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtcmVhZC10cmVlIC0tcHJlZml4IHRlc3QuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwllY2hvIGhlbGxvID5vbmUgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG9uZSAmJgorCXRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorCWVjaG8gdHJlZSBpcyAkdHJlZQorJworCitlY2hvICdvbmUKK3R3by9vbmUnID5leHBlY3QKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVhZC10cmVlIC0tcHJlZml4JyAnCisJZ2l0LXJlYWQtdHJlZSAtLXByZWZpeD10d28vICR0cmVlICYmCisJZ2l0LWxzLWZpbGVzID5hY3R1YWwgJiYKKwljbXAgZXhwZWN0IGFjdHVhbAorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDEwMjAtc3ViZGlyZWN0b3J5LnNoIGIvdC90MTAyMC1zdWJkaXJlY3Rvcnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQwOWI4NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEwMjAtc3ViZGlyZWN0b3J5LnNoCkBAIC0wLDAgKzEsMTA5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1RyeSB2YXJpb3VzIGNvcmUtbGV2ZWwgY29tbWFuZHMgaW4gc3ViZGlyZWN0b3J5LgorJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJbG9uZz0iYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6IiAmJgorCWZvciBjIGluICRsb25nOyBkbyBlY2hvICRjOyBkb25lID5vbmUgJiYKKwlta2RpciBkaXIgJiYKKwlmb3IgYyBpbiB4IHkgeiAkbG9uZyBhIGIgYzsgZG8gZWNobyAkYzsgZG9uZSA+ZGlyL3R3byAmJgorCWNwIG9uZSBvcmlnaW5hbC5vbmUgJiYKKwljcCBkaXIvdHdvIG9yaWdpbmFsLnR3bworJworSEVSRT1gcHdkYAorTEY9JworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggYW5kIGxzLWZpbGVzJyAnCisJY2QgJEhFUkUgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIG9uZSAmJgorCWNhc2UgImBnaXQtbHMtZmlsZXNgIiBpbgorCW9uZSkgZWNobyBvayBvbmUgOzsKKwkqKSBlY2hvIGJhZCBvbmU7IGV4aXQgMSA7OworCWVzYWMgJiYKKwljZCBkaXIgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHR3byAmJgorCWNhc2UgImBnaXQtbHMtZmlsZXNgIiBpbgorCXR3bykgZWNobyBvayB0d28gOzsKKwkqKSBlY2hvIGJhZCB0d287IGV4aXQgMSA7OworCWVzYWMgJiYKKwljZCAuLiAmJgorCWNhc2UgImBnaXQtbHMtZmlsZXNgIiBpbgorCWRpci90d28iJExGIm9uZSkgZWNobyBvayBib3RoIDs7CisJKikgZWNobyBiYWQ7IGV4aXQgMSA7OworCWVzYWMKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2F0LWZpbGUnICcKKwljZCAkSEVSRSAmJgorCXR3bz1gZ2l0LWxzLWZpbGVzIC1zIGRpci90d29gICYmCisJdHdvPWBleHByICIkdHdvIiA6ICJbMC03XSogXFwoWzAtOWEtZl0qXFwpImAgJiYKKwllY2hvICIkdHdvIiAmJgorCWdpdC1jYXQtZmlsZSAtcCAiJHR3byIgPmFjdHVhbCAmJgorCWNtcCBkaXIvdHdvIGFjdHVhbCAmJgorCWNkIGRpciAmJgorCWdpdC1jYXQtZmlsZSAtcCAiJHR3byIgPmFjdHVhbCAmJgorCWNtcCB0d28gYWN0dWFsCisnCitybSAtZiBhY3R1YWwgZGlyL2FjdHVhbAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmLWZpbGVzJyAnCisJY2QgJEhFUkUgJiYKKwllY2hvIGEgPj5vbmUgJiYKKwllY2hvIGQgPj5kaXIvdHdvICYmCisJY2FzZSAiYGdpdC1kaWZmLWZpbGVzIC0tbmFtZS1vbmx5YCIgaW4KKwlkaXIvdHdvIiRMRiJvbmUpIGVjaG8gb2sgdG9wIDs7CisJKikgZWNobyBiYWQgdG9wOyBleGl0IDEgOzsKKwllc2FjICYmCisJIyBkaWZmIHNob3VsZCBub3Qgb21pdCBsZWFkaW5nIHBhdGhzCisJY2QgZGlyICYmCisJY2FzZSAiYGdpdC1kaWZmLWZpbGVzIC0tbmFtZS1vbmx5YCIgaW4KKwlkaXIvdHdvIiRMRiJvbmUpIGVjaG8gb2sgc3ViZGlyIDs7CisJKikgZWNobyBiYWQgc3ViZGlyOyBleGl0IDEgOzsKKwllc2FjICYmCisJY2FzZSAiYGdpdC1kaWZmLWZpbGVzIC0tbmFtZS1vbmx5IC5gIiBpbgorCWRpci90d28pIGVjaG8gb2sgc3ViZGlyIGxpbWl0ZWQgOzsKKwkqKSBlY2hvIGJhZCBzdWJkaXIgbGltaXRlZDsgZXhpdCAxIDs7CisJZXNhYworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd3cml0ZS10cmVlJyAnCisJY2QgJEhFUkUgJiYKKwl0b3A9YGdpdC13cml0ZS10cmVlYCAmJgorCWVjaG8gJHRvcCAmJgorCWNkIGRpciAmJgorCXN1Yj1gZ2l0LXdyaXRlLXRyZWVgICYmCisJZWNobyAkc3ViICYmCisJdGVzdCAieiR0b3AiID0gInokc3ViIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dC1pbmRleCcgJworCWNkICRIRVJFICYmCisJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11IG9uZSAmJgorCWNtcCBvbmUgb3JpZ2luYWwub25lICYmCisJY2QgZGlyICYmCisJZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC11IHR3byAmJgorCWNtcCB0d28gLi4vb3JpZ2luYWwudHdvCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYWQtdHJlZScgJworCWNkICRIRVJFICYmCisJcm0gLWYgb25lIGRpci90d28gJiYKKwl0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKwlnaXQtcmVhZC10cmVlIC0tcmVzZXQgLXUgIiR0cmVlIiAmJgorCWNtcCBvbmUgb3JpZ2luYWwub25lICYmCisJY21wIGRpci90d28gb3JpZ2luYWwudHdvICYmCisJY2QgZGlyICYmCisJcm0gLWYgdHdvICYmCisJZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IC11ICIkdHJlZSIgJiYKKwljbXAgdHdvIC4uL29yaWdpbmFsLnR3byAmJgorCWNtcCAuLi9vbmUgLi4vb3JpZ2luYWwub25lCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTEwMC1jb21taXQtdHJlZS1vcHRpb25zLnNoIGIvdC90MTEwMC1jb21taXQtdHJlZS1vcHRpb25zLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE5YTBlZDQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxMTAwLWNvbW1pdC10cmVlLW9wdGlvbnMuc2gKQEAgLTAsMCArMSw0NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBSZW5lIFNjaGFyZmUKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWNvbW1pdC10cmVlIG9wdGlvbnMgdGVzdAorCitUaGlzIHRlc3QgY2hlY2tzIHRoYXQgZ2l0LWNvbW1pdC10cmVlIGNhbiBjcmVhdGUgYSBzcGVjaWZpYyBjb21taXQKK29iamVjdCBieSBkZWZpbmluZyBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgaXQgdW5kZXJzdGFuZHMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPmV4cGVjdGVkIDw8RU9GCit0cmVlIDRiODI1ZGM2NDJjYjZlYjlhMDYwZTU0YmY4ZDY5Mjg4ZmJlZTQ5MDQKK2F1dGhvciBBdXRob3IgTmFtZSA8YXV0aG9yQGVtYWlsPiAxMTE3MTQ4NDAwICswMDAwCitjb21taXR0ZXIgQ29tbWl0dGVyIE5hbWUgPGNvbW1pdHRlckBlbWFpbD4gMTExNzE1MDIwMCArMDAwMAorCitjb21tZW50IHRleHQKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndGVzdCBwcmVwYXJhdGlvbjogd3JpdGUgZW1wdHkgdHJlZScgXAorICAgICdnaXQtd3JpdGUtdHJlZSA+dHJlZWlkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29uc3RydWN0IGNvbW1pdCcgXAorICAgICdlY2hvIGNvbW1lbnQgdGV4dCB8CisgICAgIEdJVF9BVVRIT1JfTkFNRT0iQXV0aG9yIE5hbWUiIFwKKyAgICAgR0lUX0FVVEhPUl9FTUFJTD0iYXV0aG9yQGVtYWlsIiBcCisgICAgIEdJVF9BVVRIT1JfREFURT0iMjAwNS0wNS0yNiAyMzowMCIgXAorICAgICBHSVRfQ09NTUlUVEVSX05BTUU9IkNvbW1pdHRlciBOYW1lIiBcCisgICAgIEdJVF9DT01NSVRURVJfRU1BSUw9ImNvbW1pdHRlckBlbWFpbCIgXAorICAgICBHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKyAgICAgVFo9R01UIGdpdC1jb21taXQtdHJlZSBgY2F0IHRyZWVpZGAgPmNvbW1pdGlkIDI+L2Rldi9udWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVhZCBjb21taXQnIFwKKyAgICAnZ2l0LWNhdC1maWxlIGNvbW1pdCBgY2F0IGNvbW1pdGlkYCA+Y29tbWl0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tcGFyZSBjb21taXQnIFwKKyAgICAnZGlmZiBleHBlY3RlZCBjb21taXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MTIwMC10dXRvcmlhbC5zaCBiL3QvdDEyMDAtdHV0b3JpYWwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdkYjIwZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEyMDAtdHV0b3JpYWwuc2gKQEAgLTAsMCArMSwxNjIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGdpdC1yZXYtcGFyc2Ugd2l0aCBkaWZmZXJlbnQgcGFyZW50IG9wdGlvbnMnCisKKy4gLi90ZXN0LWxpYi5zaAorCitlY2hvICJIZWxsbyBXb3JsZCIgPiBoZWxsbworZWNobyAiU2lsbHkgZXhhbXBsZSIgPiBleGFtcGxlCisKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgaGVsbG8gZXhhbXBsZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdibG9iJyAidGVzdCBibG9iID0gXCIkKGdpdC1jYXQtZmlsZSAtdCA1NTdkYjAzKVwiIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdibG9iIDU1N2RiMDMnICJ0ZXN0IFwiSGVsbG8gV29ybGRcIiA9IFwiJChnaXQtY2F0LWZpbGUgYmxvYiA1NTdkYjAzKVwiIgorCitlY2hvICJJdCdzIGEgbmV3IGRheSBmb3IgZ2l0IiA+PmhlbGxvCitjYXQgPiBkaWZmLmV4cGVjdCA8PCBFT0YKK2RpZmYgLS1naXQgYS9oZWxsbyBiL2hlbGxvCitpbmRleCA1NTdkYjAzLi4yNjM0MTRmIDEwMDY0NAorLS0tIGEvaGVsbG8KKysrKyBiL2hlbGxvCitAQCAtMSArMSwyIEBACisgSGVsbG8gV29ybGQKKytJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CitFT0YKK2dpdC1kaWZmLWZpbGVzIC1wID4gZGlmZi5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLWZpbGVzIC1wJyAnY21wIGRpZmYuZXhwZWN0IGRpZmYub3V0cHV0JworZ2l0IGRpZmYgPiBkaWZmLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IGRpZmYnICdjbXAgZGlmZi5leHBlY3QgZGlmZi5vdXRwdXQnCisKK3RyZWU9JChnaXQtd3JpdGUtdHJlZSAyPi9kZXYvbnVsbCkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndHJlZScgInRlc3QgODk4OGRhMTVkMDc3ZDQ4MjlmYzUxZDg1NDRjMDk3ZGVmNjY0NGRiYiA9ICR0cmVlIgorCitvdXRwdXQ9IiQoZWNobyAiSW5pdGlhbCBjb21taXQiIHwgZ2l0LWNvbW1pdC10cmVlICQoZ2l0LXdyaXRlLXRyZWUpIDI+JjEgPiAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyKSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tbWl0JyAidGVzdCAnQ29tbWl0dGluZyBpbml0aWFsIHRyZWUgODk4OGRhMTVkMDc3ZDQ4MjlmYzUxZDg1NDRjMDk3ZGVmNjY0NGRiYicgPSBcIiRvdXRwdXRcIiIKKworZ2l0LWRpZmYtaW5kZXggLXAgSEVBRCA+IGRpZmYub3V0cHV0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi1pbmRleCAtcCBIRUFEJyAnY21wIGRpZmYuZXhwZWN0IGRpZmYub3V0cHV0JworCitnaXQgZGlmZiBIRUFEID4gZGlmZi5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBkaWZmIEhFQUQnICdjbXAgZGlmZi5leHBlY3QgZGlmZi5vdXRwdXQnCisKKyNybSBoZWxsbworI3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1yZWFkLXRyZWUgLS1yZXNldCBIRUFEJyAiZ2l0LXJlYWQtdHJlZSAtLXJlc2V0IEhFQUQgOyB0ZXN0IFwiaGVsbG86IG5lZWRzIHVwZGF0ZVwiID0gXCIkKGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoKVwiIgorCitjYXQgPiB3aGF0Y2hhbmdlZC5leHBlY3QgPDwgRU9GCitjb21taXQgVkFSSUFCTEUKK0F1dGhvcjogVkFSSUFCTEUKK0RhdGU6ICAgVkFSSUFCTEUKKworICAgIEluaXRpYWwgY29tbWl0CisKK2RpZmYgLS1naXQgYS9leGFtcGxlIGIvZXhhbXBsZQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmYyNGM3NGEKKy0tLSAvZGV2L251bGwKKysrKyBiL2V4YW1wbGUKK0BAIC0wLDAgKzEgQEAKKytTaWxseSBleGFtcGxlCitkaWZmIC0tZ2l0IGEvaGVsbG8gYi9oZWxsbworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjU1N2RiMDMKKy0tLSAvZGV2L251bGwKKysrKyBiL2hlbGxvCitAQCAtMCwwICsxIEBACisrSGVsbG8gV29ybGQKK0VPRgorCitnaXQtd2hhdGNoYW5nZWQgLXAgLS1yb290IHwgXAorCXNlZCAtZSAiMXMvXlwoLlx7N1x9XCkuXHs0MFx9L1wxVkFSSUFCTEUvIiBcCisJCS1lICIyLDNzL15cKC5cezhcfVwpLiokL1wxVkFSSUFCTEUvIiBcCis+IHdoYXRjaGFuZ2VkLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LXdoYXRjaGFuZ2VkIC1wIC0tcm9vdCcgJ2NtcCB3aGF0Y2hhbmdlZC5leHBlY3Qgd2hhdGNoYW5nZWQub3V0cHV0JworCitnaXQgdGFnIG15LWZpcnN0LXRhZwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHRhZyBteS1maXJzdC10YWcnICdjbXAgLmdpdC9yZWZzL2hlYWRzL21hc3RlciAuZ2l0L3JlZnMvdGFncy9teS1maXJzdC10YWcnCisKKyMgVE9ETzogdGVzdCBnaXQtY2xvbmUKKworZ2l0IGNoZWNrb3V0IC1iIG15YnJhbmNoCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2gnICdjbXAgLmdpdC9yZWZzL2hlYWRzL21hc3RlciAuZ2l0L3JlZnMvaGVhZHMvbXlicmFuY2gnCisKK2NhdCA+IGJyYW5jaC5leHBlY3QgPDxFT0YKKyAgbWFzdGVyCisqIG15YnJhbmNoCitFT0YKKworZ2l0IGJyYW5jaCA+IGJyYW5jaC5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBicmFuY2gnICdjbXAgYnJhbmNoLmV4cGVjdCBicmFuY2gub3V0cHV0JworCitnaXQgY2hlY2tvdXQgbXlicmFuY2gKK2VjaG8gIldvcmssIHdvcmssIHdvcmsiID4+aGVsbG8KK2dpdCBjb21taXQgLW0gJ1NvbWUgd29yay4nIC1pIGhlbGxvCisKK2dpdCBjaGVja291dCBtYXN0ZXIKKworZWNobyAiUGxheSwgcGxheSwgcGxheSIgPj5oZWxsbworZWNobyAiTG90cyBvZiBmdW4iID4+ZXhhbXBsZQorZ2l0IGNvbW1pdCAtbSAnU29tZSBmdW4uJyAtaSBoZWxsbyBleGFtcGxlCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2dpdCByZXNvbHZlIG5vdyBmYWlscycgJ2dpdCByZXNvbHZlIEhFQUQgbXlicmFuY2ggIk1lcmdlIHdvcmsgaW4gbXlicmFuY2giJworCitjYXQgPiBoZWxsbyA8PCBFT0YKK0hlbGxvIFdvcmxkCitJdCdzIGEgbmV3IGRheSBmb3IgZ2l0CitQbGF5LCBwbGF5LCBwbGF5CitXb3JrLCB3b3JrLCB3b3JrCitFT0YKKworZ2l0IGNvbW1pdCAtbSAnTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4nIC1pIGhlbGxvCisKK3Rlc3RfZG9uZQorCitjYXQgPiBzaG93LWJyYW5jaC5leHBlY3QgPDwgRU9GCisqIFttYXN0ZXJdIE1lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuCisgISBbbXlicmFuY2hdIFNvbWUgd29yay4KKy0tCistICBbbWFzdGVyXSBNZXJnZWQgIm15YnJhbmNoIiBjaGFuZ2VzLgorKisgW215YnJhbmNoXSBTb21lIHdvcmsuCitFT0YKKworZ2l0IHNob3ctYnJhbmNoIC0tdG9wby1vcmRlciBtYXN0ZXIgbXlicmFuY2ggPiBzaG93LWJyYW5jaC5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBzaG93LWJyYW5jaCcgJ2NtcCBzaG93LWJyYW5jaC5leHBlY3Qgc2hvdy1icmFuY2gub3V0cHV0JworCitnaXQgY2hlY2tvdXQgbXlicmFuY2gKKworY2F0ID4gcmVzb2x2ZS5leHBlY3QgPDwgRU9GCitVcGRhdGluZyBmcm9tIFZBUklBQkxFIHRvIFZBUklBQkxFCisgZXhhbXBsZSB8ICAgIDEgKworIGhlbGxvICAgfCAgICAxICsKKyAyIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKK0VPRgorCitnaXQgcmVzb2x2ZSBIRUFEIG1hc3RlciAiTWVyZ2UgdXBzdHJlYW0gY2hhbmdlcy4iIHwgXAorCXNlZCAtZSAiMXMvWzAtOWEtZl1cezQwXH0vVkFSSUFCTEUvZyIgPiByZXNvbHZlLm91dHB1dAordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHJlc29sdmUnICdjbXAgcmVzb2x2ZS5leHBlY3QgcmVzb2x2ZS5vdXRwdXQnCisKK2NhdCA+IHNob3ctYnJhbmNoMi5leHBlY3QgPDwgRU9GCishIFttYXN0ZXJdIE1lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuCisgKiBbbXlicmFuY2hdIE1lcmdlZCAibXlicmFuY2giIGNoYW5nZXMuCistLQorLS0gW21hc3Rlcl0gTWVyZ2VkICJteWJyYW5jaCIgY2hhbmdlcy4KK0VPRgorCitnaXQgc2hvdy1icmFuY2ggLS10b3BvLW9yZGVyIG1hc3RlciBteWJyYW5jaCA+IHNob3ctYnJhbmNoMi5vdXRwdXQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCBzaG93LWJyYW5jaCcgJ2NtcCBzaG93LWJyYW5jaDIuZXhwZWN0IHNob3ctYnJhbmNoMi5vdXRwdXQnCisKKyMgVE9ETzogdGVzdCBnaXQgZmV0Y2gKKworIyBUT0RPOiB0ZXN0IGdpdCBwdXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdCByZXBhY2snICdnaXQgcmVwYWNrJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0IHBydW5lLXBhY2tlZCcgJ2dpdCBwcnVuZS1wYWNrZWQnCit0ZXN0X2V4cGVjdF9mYWlsdXJlICctPiBvbmx5IHBhY2tlZCBvYmplY3RzJyAnZmluZCAtdHlwZSBmIC5naXQvb2JqZWN0cy9bMC05YS1mXVswLTlhLWZdJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90MTMwMC1yZXBvLWNvbmZpZy5zaCBiL3QvdDEzMDAtcmVwby1jb25maWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGRlMjQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDEzMDAtcmVwby1jb25maWcuc2gKQEAgLTAsMCArMSwzMzcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGdpdC1yZXBvLWNvbmZpZyBpbiBkaWZmZXJlbnQgc2V0dGluZ3MnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0IC1mIC5naXQvY29uZmlnICYmIHJtIC5naXQvY29uZmlnCisKK2dpdC1yZXBvLWNvbmZpZyBjb3JlLnBlbmd1aW4gImxpdHRsZSBibHVlIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gbGl0dGxlIGJsdWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LXJlcG8tY29uZmlnIENvcmUuTW92aWUgQmFkUGh5c2ljcworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gbGl0dGxlIGJsdWUKKwlNb3ZpZSA9IEJhZFBoeXNpY3MKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtaXhlZCBjYXNlJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LXJlcG8tY29uZmlnIENvcmVzLldoYXRFdmVyIFNlY29uZAorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbY29yZV0KKwlwZW5ndWluID0gbGl0dGxlIGJsdWUKKwlNb3ZpZSA9IEJhZFBoeXNpY3MKK1tDb3Jlc10KKwlXaGF0RXZlciA9IFNlY29uZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NpbWlsYXIgc2VjdGlvbicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2dpdC1yZXBvLWNvbmZpZyBDT1JFLlVQUEVSQ0FTRSB0cnVlCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK1tjb3JlXQorCXBlbmd1aW4gPSBsaXR0bGUgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworCVVQUEVSQ0FTRSA9IHRydWUKK1tDb3Jlc10KKwlXaGF0RXZlciA9IFNlY29uZAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NpbWlsYXIgc2VjdGlvbicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlcGxhY2Ugd2l0aCBub24tbWF0Y2gnIFwKKwknZ2l0LXJlcG8tY29uZmlnIGNvcmUucGVuZ3VpbiBraW5ncGluICFibHVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZXBsYWNlIHdpdGggbm9uLW1hdGNoIChhY3R1YWxseSBtYXRjaGluZyknIFwKKwknZ2l0LXJlcG8tY29uZmlnIGNvcmUucGVuZ3VpbiAidmVyeSBibHVlIiAha2luZ3BpbicKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2NvcmVdCisJcGVuZ3VpbiA9IHZlcnkgYmx1ZQorCU1vdmllID0gQmFkUGh5c2ljcworCVVQUEVSQ0FTRSA9IHRydWUKKwlwZW5ndWluID0ga2luZ3BpbgorW0NvcmVzXQorCVdoYXRFdmVyID0gU2Vjb25kCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbm9uLW1hdGNoIHJlc3VsdCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2NhdCA+IC5naXQvY29uZmlnIDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorCQloYWhhICAgPSJiZXRhIiAjIGxhc3Qgc2lsbHkgY29tbWVudAoraGFoYSA9IGhlbGxvCisJaGFoYSA9IGJlbGxvCitbbmV4dFNlY3Rpb25dIG5vTmV3bGluZSA9IG91Y2gKK0VPRgorCitjcCAuZ2l0L2NvbmZpZyAuZ2l0L2NvbmZpZzIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGlwbGUgdW5zZXQnIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tdW5zZXQtYWxsIGJldGEuaGFoYScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorW25leHRTZWN0aW9uXSBub05ld2xpbmUgPSBvdWNoCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGlwbGUgdW5zZXQgaXMgY29ycmVjdCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK212IC5naXQvY29uZmlnMiAuZ2l0L2NvbmZpZworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLXJlcGxhY2UtYWxsJyBcCisJJ2dpdC1yZXBvLWNvbmZpZyAtLXJlcGxhY2UtYWxsIGJldGEuaGFoYSBnYW1tYScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorCWhhaGEgPSBnYW1tYQorW25leHRTZWN0aW9uXSBub05ld2xpbmUgPSBvdWNoCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYWxsIHJlcGxhY2VkJyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LXJlcG8tY29uZmlnIGJldGEuaGFoYSBhbHBoYQorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CisJaGFoYSA9IGFscGhhCitbbmV4dFNlY3Rpb25dIG5vTmV3bGluZSA9IG91Y2gKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWFsbHkgbWVhbiB0ZXN0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LXJlcG8tY29uZmlnIG5leHRzZWN0aW9uLm5vbmV3bGluZSB3b3cKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorCWhhaGEgPSBhbHBoYQorW25leHRTZWN0aW9uXQorCW5vbmV3bGluZSA9IHdvdworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYWxseSByZWFsbHkgbWVhbiB0ZXN0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2V0IHZhbHVlJyAndGVzdCBhbHBoYSA9ICQoZ2l0LXJlcG8tY29uZmlnIGJldGEuaGFoYSknCitnaXQtcmVwby1jb25maWcgLS11bnNldCBiZXRhLmhhaGEKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorW25leHRTZWN0aW9uXQorCW5vbmV3bGluZSA9IHdvdworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Vuc2V0JyAnY21wIC5naXQvY29uZmlnIGV4cGVjdCcKKworZ2l0LXJlcG8tY29uZmlnIG5leHRzZWN0aW9uLk5vTmV3TGluZSAid293MiBmb3IgbWUiICJmb3IgbWUkIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293CisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhcicgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vbi1tYXRjaCcgXAorCSdnaXQtcmVwby1jb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lICFmb3InCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25vbi1tYXRjaCB2YWx1ZScgXAorCSd0ZXN0IHdvdyA9ICQoZ2l0LXJlcG8tY29uZmlnIC0tZ2V0IG5leHRzZWN0aW9uLm5vbmV3bGluZSAhZm9yKScKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYW1iaWd1b3VzIGdldCcgXAorCSdnaXQtcmVwby1jb25maWcgLS1nZXQgbmV4dHNlY3Rpb24ubm9uZXdsaW5lJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnZXQgbXVsdGl2YXInIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LWFsbCBuZXh0c2VjdGlvbi5ub25ld2xpbmUnCisKK2dpdC1yZXBvLWNvbmZpZyBuZXh0c2VjdGlvbi5ub25ld2xpbmUgIndvdzMiICJ3b3ckIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJbm9uZXdsaW5lID0gd293MworCU5vTmV3TGluZSA9IHdvdzIgZm9yIG1lCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbXVsdGl2YXIgcmVwbGFjZScgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FtYmlndW91cyB2YWx1ZScgJ2dpdC1yZXBvLWNvbmZpZyBuZXh0c2VjdGlvbi5ub25ld2xpbmUnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FtYmlndW91cyB1bnNldCcgXAorCSdnaXQtcmVwby1jb25maWcgLS11bnNldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2ludmFsaWQgdW5zZXQnIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tdW5zZXQgc29tZXNlY3Rpb24ubm9uZXdsaW5lJworCitnaXQtcmVwby1jb25maWcgLS11bnNldCBuZXh0c2VjdGlvbi5ub25ld2xpbmUgIndvdzMkIgorCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYmV0YV0gOyBzaWxseSBjb21tZW50ICMgYW5vdGhlciBjb21tZW50Citub0luZGVudD0gc2lsbHlWYWx1ZSA7ICdub3RoZXIgc2lsbHkgY29tbWVudAorCisjIGVtcHR5IGxpbmUKKwkJOyBjb21tZW50CitbbmV4dFNlY3Rpb25dCisJTm9OZXdMaW5lID0gd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXZhciB1bnNldCcgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2ludmFsaWQga2V5JyAnZ2l0LXJlcG8tY29uZmlnIGludmFsLjJrZXkgYmxhYmxhJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb3JyZWN0IGtleScgJ2dpdC1yZXBvLWNvbmZpZyAxMjM0NTYuYTEyMyA5ODcnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2hpZXJhcmNoaWNhbCBzZWN0aW9uJyBcCisJJ2dpdC1yZXBvLWNvbmZpZyBWZXJzaW9uLjEuMi4zZVguQWxwaGEgYmV0YScKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2JldGFdIDsgc2lsbHkgY29tbWVudCAjIGFub3RoZXIgY29tbWVudAorbm9JbmRlbnQ9IHNpbGx5VmFsdWUgOyAnbm90aGVyIHNpbGx5IGNvbW1lbnQKKworIyBlbXB0eSBsaW5lCisJCTsgY29tbWVudAorW25leHRTZWN0aW9uXQorCU5vTmV3TGluZSA9IHdvdzIgZm9yIG1lCitbMTIzNDU2XQorCWExMjMgPSA5ODcKK1tWZXJzaW9uICIxLjIuM2VYIl0KKwlBbHBoYSA9IGJldGEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdoaWVyYXJjaGljYWwgc2VjdGlvbiB2YWx1ZScgJ2NtcCAuZ2l0L2NvbmZpZyBleHBlY3QnCisKK2NhdCA+IGV4cGVjdCA8PCBFT0YKK2JldGEubm9pbmRlbnQ9c2lsbHlWYWx1ZQorbmV4dHNlY3Rpb24ubm9uZXdsaW5lPXdvdzIgZm9yIG1lCisxMjM0NTYuYTEyMz05ODcKK3ZlcnNpb24uMS4yLjNlWC5hbHBoYT1iZXRhCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnd29ya2luZyAtLWxpc3QnIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tbGlzdCA+IG91dHB1dCAmJiBjbXAgb3V0cHV0IGV4cGVjdCcKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorYmV0YS5ub2luZGVudCBzaWxseVZhbHVlCituZXh0c2VjdGlvbi5ub25ld2xpbmUgd293MiBmb3IgbWUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICctLWdldC1yZWdleHAnIFwKKwknZ2l0LXJlcG8tY29uZmlnIC0tZ2V0LXJlZ2V4cCBpbiA+IG91dHB1dCAmJiBjbXAgb3V0cHV0IGV4cGVjdCcKKworY2F0ID4gLmdpdC9jb25maWcgPDwgRU9GCitbbm92YWx1ZV0KKwl2YXJpYWJsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dldCB2YXJpYWJsZSB3aXRoIG5vIHZhbHVlJyBcCisJJ2dpdC1yZXBvLWNvbmZpZyAtLWdldCBub3ZhbHVlLnZhcmlhYmxlIF4kJworCitnaXQtcmVwby1jb25maWcgPiBvdXRwdXQgMj4mMQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdubyBhcmd1bWVudHMsIGJ1dCBubyBjcmFzaCcgXAorCSJ0ZXN0ICQ/ID0gMTI5ICYmIGdyZXAgdXNhZ2Ugb3V0cHV0IgorCitjYXQgPiAuZ2l0L2NvbmZpZyA8PCBFT0YKK1thLmJdCisJYyA9IGQKK0VPRgorCitnaXQtcmVwby1jb25maWcgYS54IHkKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2EuYl0KKwljID0gZAorW2FdCisJeCA9IHkKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICduZXcgc2VjdGlvbiBpcyBwYXJ0aWFsIG1hdGNoIG9mIGFub3RoZXInICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitnaXQtcmVwby1jb25maWcgYi54IHkKK2dpdC1yZXBvLWNvbmZpZyBhLmIgYworCitjYXQgPiBleHBlY3QgPDwgRU9GCitbYS5iXQorCWMgPSBkCitbYV0KKwl4ID0geQorCWIgPSBjCitbYl0KKwl4ID0geQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ25ldyB2YXJpYWJsZSBpbnNlcnRzIGludG8gcHJvcGVyIHNlY3Rpb24nICdjbXAgLmdpdC9jb25maWcgZXhwZWN0JworCitjYXQgPiBvdGhlci1jb25maWcgPDwgRU9GCitbZWluXQorCWJhaG4gPSBzdHJhc3NlCitFT0YKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorZWluLmJhaG49c3RyYXNzZQorRU9GCisKK0dJVF9DT05GSUc9b3RoZXItY29uZmlnIGdpdC1yZXBvLWNvbmZpZyAtbCA+IG91dHB1dAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhbHRlcm5hdGl2ZSBHSVRfQ09ORklHJyAnY21wIG91dHB1dCBleHBlY3QnCisKK0dJVF9DT05GSUc9b3RoZXItY29uZmlnIGdpdC1yZXBvLWNvbmZpZyBhbndvaG5lci5wYXJrIGF1c3dlaXMKKworY2F0ID4gZXhwZWN0IDw8IEVPRgorW2Vpbl0KKwliYWhuID0gc3RyYXNzZQorW2Fud29obmVyXQorCXBhcmsgPSBhdXN3ZWlzCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS1zZXQgaW4gYWx0ZXJuYXRpdmUgR0lUX0NPTkZJRycgJ2NtcCBvdGhlci1jb25maWcgZXhwZWN0JworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90MTQwMC11cGRhdGUtcmVmLnNoIGIvdC90MTQwMC11cGRhdGUtcmVmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkYzgwYmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QxNDAwLXVwZGF0ZS1yZWYuc2gKQEAgLTAsMCArMSwyMzcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgU2hhd24gUGVhcmNlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZ2l0LXVwZGF0ZS1yZWYgYW5kIGJhc2ljIHJlZiBsb2dnaW5nJworLiAuL3Rlc3QtbGliLnNoCisKK1o9MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorQT0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitCPTIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIKK0M9MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMworRD00NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0CitFPTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUKK0Y9NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NgorbT1yZWZzL2hlYWRzL21hc3Rlcgorbl9kaXI9cmVmcy9oZWFkcy9ndQorbj0kbl9kaXIvZml4ZXMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSIgXAorCSdnaXQtdXBkYXRlLXJlZiAkbSAkQSAmJgorCSB0ZXN0ICRBID0gJChjYXQgLmdpdC8kbSknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiY3JlYXRlICRtIiBcCisJJ2dpdC11cGRhdGUtcmVmICRtICRCICRBICYmCisJIHRlc3QgJEIgPSAkKGNhdCAuZ2l0LyRtKScKK3JtIC1mIC5naXQvJG0KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImZhaWwgdG8gY3JlYXRlICRuIiBcCisJJ3RvdWNoIC5naXQvJG5fZGlyCisJIGdpdC11cGRhdGUtcmVmICRuICRBID5vdXQgMj5lcnIKKwkgdGVzdCAkPyA9IDEgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBvdXQpIiAmJgorCSBncmVwICJlcnJvcjogdW5hYmxlIHRvIHJlc29sdmUgcmVmZXJlbmNlIiBlcnIgJiYKKwkgZ3JlcCAkbiBlcnInCitybSAtZiAuZ2l0LyRuX2RpciBvdXQgZXJyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJjcmVhdGUgJG0gKGJ5IEhFQUQpIiBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEEgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IC5naXQvJG0pJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAoYnkgSEVBRCkiIFwKKwknZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQiAkQSAmJgorCSB0ZXN0ICRCID0gJChjYXQgLmdpdC8kbSknCitybSAtZiAuZ2l0LyRtCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorCScobm90KSBjcmVhdGUgSEVBRCB3aXRoIG9sZCBzaGExJyBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEEgJEInCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwkiKG5vdCkgcHJpb3IgY3JlYXRlZCAuZ2l0LyRtIiBcCisJJ3Rlc3QgLWYgLmdpdC8kbScKK3JtIC1mIC5naXQvJG0KKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSBIRUFEIiBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEEnCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwknKG5vdCkgY2hhbmdlIEhFQUQgd2l0aCB3cm9uZyBTSEExJyBcCisJJ2dpdC11cGRhdGUtcmVmIEhFQUQgJEIgJFonCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKwkiKG5vdCkgY2hhbmdlZCAuZ2l0LyRtIiBcCisJJ3Rlc3QgJEIgPSAkKGNhdCAuZ2l0LyRtKScKK3JtIC1mIC5naXQvJG0KKworbWtkaXIgLXAgLmdpdC9sb2dzL3JlZnMvaGVhZHMKK3RvdWNoIC5naXQvbG9ncy9yZWZzL2hlYWRzL21hc3RlcgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAobG9nZ2VkIGJ5IHRvdWNoKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQSAtbSAiSW5pdGlhbCBDcmVhdGlvbiIgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IC5naXQvJG0pJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInVwZGF0ZSAkbSAobG9nZ2VkIGJ5IHRvdWNoKSIgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzEiIFwKKwkgZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkQiAkQSAtbSAiU3dpdGNoIiAmJgorCSB0ZXN0ICRCID0gJChjYXQgLmdpdC8kbSknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkic2V0ICRtIChsb2dnZWQgYnkgdG91Y2gpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MSIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEICRBICYmCisJIHRlc3QgJEEgPSAkKGNhdCAuZ2l0LyRtKScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjAwICswMDAwCUluaXRpYWwgQ3JlYXRpb24KKyRBICRCICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMjYwICswMDAwCVN3aXRjaAorJEIgJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA4NjAgKzAwMDAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInZlcmlmeWluZyAkbSdzIGxvZyIgXAorCSdkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0nCitybSAtcmYgLmdpdC8kbSAuZ2l0L2xvZ3MgZXhwZWN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdlbmFibGUgY29yZS5sb2dBbGxSZWZVcGRhdGVzJyBcCisJJ2dpdC1yZXBvLWNvbmZpZyBjb3JlLmxvZ0FsbFJlZlVwZGF0ZXMgdHJ1ZSAmJgorCSB0ZXN0IHRydWUgPSAkKGdpdC1yZXBvLWNvbmZpZyAtLWJvb2wgLS1nZXQgY29yZS5sb2dBbGxSZWZVcGRhdGVzKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJImNyZWF0ZSAkbSAobG9nZ2VkIGJ5IGNvbmZpZykiIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMyIiBcCisJIGdpdC11cGRhdGUtcmVmIEhFQUQgJEEgLW0gIkluaXRpYWwgQ3JlYXRpb24iICYmCisJIHRlc3QgJEEgPSAkKGNhdCAuZ2l0LyRtKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJ1cGRhdGUgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMyIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEICRCICRBIC1tICJTd2l0Y2giICYmCisJIHRlc3QgJEIgPSAkKGNhdCAuZ2l0LyRtKScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSJzZXQgJG0gKGxvZ2dlZCBieSBjb25maWcpIiBcCisJJ0dJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MyIgXAorCSBnaXQtdXBkYXRlLXJlZiBIRUFEICRBICYmCisJIHRlc3QgJEEgPSAkKGNhdCAuZ2l0LyRtKScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRBICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzIwICswMDAwCUluaXRpYWwgQ3JlYXRpb24KKyRBICRCICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwMzgwICswMDAwCVN3aXRjaAorJEIgJEEgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTA5ODAgKzAwMDAKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJInZlcmlmeWluZyAkbSdzIGxvZyIgXAorCSdkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0nCitybSAtZiAuZ2l0LyRtIC5naXQvbG9ncy8kbSBleHBlY3QKKworZ2l0LXVwZGF0ZS1yZWYgJG0gJEQKK2NhdCA+LmdpdC9sb2dzLyRtIDw8RU9GCiskQyAkQSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDMyMCAtMDUwMAorJEEgJEIgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAzODAgLTA1MDAKKyRGICRaICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwNjgwIC0wNTAwCiskWiAkRSAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDk4MCAtMDUwMAorRU9GCisKK2VkPSJUaHUsIDI2IE1heSAyMDA1IDE4OjMyOjAwIC0wNTAwIgorZ2Q9IlRodSwgMjYgTWF5IDIwMDUgMTg6MzM6MDAgLTA1MDAiCitsZD0iVGh1LCAyNiBNYXkgMjAwNSAxODo0MzowMCAtMDUwMCIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjUgMjAwNX0iIChiZWZvcmUgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI1IDIwMDV9IiA+byAyPmUgJiYKKwkgdGVzdCAkQyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJG0gb25seSBnb2VzIGJhY2sgdG8gJGVkLiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJIlF1ZXJ5IG1hc3RlckB7MjAwNS0wNS0yNX0gKGJlZm9yZSBoaXN0b3J5KSIgXAorCSdybSAtZiBvIGUKKwkgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBtYXN0ZXJAezIwMDUtMDUtMjV9ID5vIDI+ZSAmJgorCSB0ZXN0ICRDID0gJChjYXQgbykgJiYKKwkgZWNobyB0ZXN0ICJ3YXJuaW5nOiBMb2cgLmdpdC9sb2dzLyRtIG9ubHkgZ29lcyBiYWNrIHRvICRlZC4iID0gIiQoY2F0IGUpIicKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdRdWVyeSAibWFzdGVyQHtNYXkgMjYgMjAwNSAyMzozMTo1OX0iICgxIHNlY29uZCBiZWZvcmUgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzE6NTl9IiA+byAyPmUgJiYKKwkgdGVzdCAkQyA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJG0gb25seSBnb2VzIGJhY2sgdG8gJGVkLiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAe01heSAyNiAyMDA1IDIzOjMyOjAwfSIgKGV4YWN0bHkgaGlzdG9yeSBzdGFydCknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7TWF5IDI2IDIwMDUgMjM6MzI6MDB9IiA+byAyPmUgJiYKKwkgdGVzdCAkQSA9ICQoY2F0IG8pICYmCisJIHRlc3QgIiIgPSAiJChjYXQgZSkiJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJJ1F1ZXJ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzM6MDF9IiAobWlkZGxlIG9mIGhpc3Rvcnkgd2l0aCBnYXApJyBcCisJJ3JtIC1mIG8gZQorCSBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5ICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6MzM6MDF9IiA+byAyPmUgJiYKKwkgdGVzdCAkQiA9ICQoY2F0IG8pICYmCisJIHRlc3QgIndhcm5pbmc6IExvZyAuZ2l0L2xvZ3MvJG0gaGFzIGdhcCBhZnRlciAkZ2QuIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzozODowMH0iIChtaWRkbGUgb2YgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzozODowMH0iID5vIDI+ZSAmJgorCSB0ZXN0ICRaID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0MzowMH0iIChleGFjdCBlbmQgb2YgaGlzdG9yeSknIFwKKwkncm0gLWYgbyBlCisJIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgIm1hc3RlckB7MjAwNS0wNS0yNiAyMzo0MzowMH0iID5vIDI+ZSAmJgorCSB0ZXN0ICRFID0gJChjYXQgbykgJiYKKwkgdGVzdCAiIiA9ICIkKGNhdCBlKSInCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknUXVlcnkgIm1hc3RlckB7MjAwNS0wNS0yOH0iIChwYXN0IGVuZCBvZiBoaXN0b3J5KScgXAorCSdybSAtZiBvIGUKKwkgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSAibWFzdGVyQHsyMDA1LTA1LTI4fSIgPm8gMj5lICYmCisJIHRlc3QgJEQgPSAkKGNhdCBvKSAmJgorCSB0ZXN0ICJ3YXJuaW5nOiBMb2cgLmdpdC9sb2dzLyRtIHVuZXhwZWN0ZWRseSBlbmRlZCBvbiAkbGQuIiA9ICIkKGNhdCBlKSInCisKKworcm0gLWYgLmdpdC8kbSAuZ2l0L2xvZ3MvJG0gZXhwZWN0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBpbml0aWFsIGZpbGVzJyBcCisgICAgJ2VjaG8gVEVTVCA+RiAmJgorICAgICBnaXQtYWRkIEYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzozMCIgZ2l0LWNvbW1pdCAtbSBhZGQgLWEgJiYKKwkgaF9URVNUPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorCSBlY2hvIFRoZSBvdGhlciBkYXkgdGhpcyBkaWQgbm90IHdvcmsuID5NICYmCisJIGVjaG8gQW5kIHRoZW4gQm9iIHRvbGQgbWUgaG93IHRvIGZpeCBpdC4gPj5NICYmCisJIGVjaG8gT1RIRVIgPkYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQxIiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0MSIgZ2l0LWNvbW1pdCAtRiBNIC1hICYmCisJIGhfT1RIRVI9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJIGVjaG8gRklYRUQgPkYgJiYKKwkgR0lUX0FVVEhPUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjQ0IiBcCisJIEdJVF9DT01NSVRURVJfREFURT0iMjAwNS0wNS0yNiAyMzo0NCIgZ2l0LWNvbW1pdCAtLWFtZW5kICYmCisJIGhfRklYRUQ9JChnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUQpICYmCisJIGVjaG8gVEVTVCtGSVhFRCA+RiAmJgorCSBlY2hvIE1lcmdlZCBpbml0aWFsIGNvbW1pdCBhbmQgYSBsYXRlciBjb21taXQuID5NICYmCisJIGVjaG8gJGhfVEVTVCA+LmdpdC9NRVJHRV9IRUFEICYmCisJIEdJVF9BVVRIT1JfREFURT0iMjAwNS0wNS0yNiAyMzo0NSIgXAorCSBHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6NDUiIGdpdC1jb21taXQgLUYgTSAmJgorCSBoX01FUkdFRD0kKGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKKwkgcm0gLWYgTScKKworY2F0ID5leHBlY3QgPDxFT0YKKyRaICRoX1RFU1QgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyMDAgKzAwMDAJY29tbWl0IChpbml0aWFsKTogYWRkCiskaF9URVNUICRoX09USEVSICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUwODYwICswMDAwCWNvbW1pdDogVGhlIG90aGVyIGRheSB0aGlzIGRpZCBub3Qgd29yay4KKyRoX09USEVSICRoX0ZJWEVEICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUxMDQwICswMDAwCWNvbW1pdCAoYW1lbmQpOiBUaGUgb3RoZXIgZGF5IHRoaXMgZGlkIG5vdCB3b3JrLgorJGhfRklYRUQgJGhfTUVSR0VEICRHSVRfQ09NTUlUVEVSX05BTUUgPCRHSVRfQ09NTUlUVEVSX0VNQUlMPiAxMTE3MTUxMTAwICswMDAwCWNvbW1pdCAobWVyZ2UpOiBNZXJnZWQgaW5pdGlhbCBjb21taXQgYW5kIGEgbGF0ZXIgY29tbWl0LgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWNvbW1pdCBsb2dnZWQgdXBkYXRlcycgXAorCSdkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvJG0nCit1bnNldCBoX1RFU1QgaF9PVEhFUiBoX0ZJWEVEIGhfTUVSR0VECisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXI6RiAoZXhwZWN0IE9USEVSKScgXAorCSd0ZXN0IE9USEVSID0gJChnaXQtY2F0LWZpbGUgYmxvYiBtYXN0ZXI6RiknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWNhdC1maWxlIGJsb2IgbWFzdGVyQHsyMDA1LTA1LTI2IDIzOjMwfTpGIChleHBlY3QgVEVTVCknIFwKKwkndGVzdCBURVNUID0gJChnaXQtY2F0LWZpbGUgYmxvYiAibWFzdGVyQHsyMDA1LTA1LTI2IDIzOjMwfTpGIiknCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwknZ2l0LWNhdC1maWxlIGJsb2IgbWFzdGVyQHsyMDA1LTA1LTI2IDIzOjQyfTpGIChleHBlY3QgT1RIRVIpJyBcCisJJ3Rlc3QgT1RIRVIgPSAkKGdpdC1jYXQtZmlsZSBibG9iICJtYXN0ZXJAezIwMDUtMDUtMjYgMjM6NDJ9OkYiKScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDAwLWNoZWNrb3V0LWNhY2hlLWNsYXNoLnNoIGIvdC90MjAwMC1jaGVja291dC1jYWNoZS1jbGFzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wM2VhNGRlCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwMC1jaGVja291dC1jYWNoZS1jbGFzaC5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCB0ZXN0LgorCitUaGlzIHRlc3QgcmVnaXN0ZXJzIHRoZSBmb2xsb3dpbmcgZmlsZXN5c3RlbSBzdHJ1Y3R1cmUgaW4gdGhlCitjYWNoZToKKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworQW5kIHRoZW4gdHJpZXMgdG8gY2hlY2tvdXQgaW4gYSB3b3JrIHRyZWUgdGhhdCBoYXMgdGhlIGZvbGxvd2luZzoKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEgICAgICAgLSBhIGZpbGUKKworVGhlIGdpdC1jaGVja291dC1pbmRleCBjb21tYW5kIHNob3VsZCBmYWlsIHdoZW4gYXR0ZW1wdGluZyB0byBjaGVja291dAorcGF0aDAsIGZpbmRpbmcgaXQgaXMgb2NjdXBpZWQgYnkgYSBkaXJlY3RvcnksIGFuZCBwYXRoMS9maWxlMSwgZmluZGluZworcGF0aDEgaXMgb2NjdXBpZWQgYnkgYSBub24tZGlyZWN0b3J5LiAgV2l0aCAiLWYiIGZsYWcsIGl0IHNob3VsZCByZW1vdmUKK3RoZSBjb25mbGljdGluZyBwYXRocyBhbmQgc3VjY2VlZC4KKycKKy4gLi90ZXN0LWxpYi5zaAorCitkYXRlID5wYXRoMAorbWtkaXIgcGF0aDEKK2RhdGUgPnBhdGgxL2ZpbGUxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHZhcmlvdXMgcGF0aHMuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEvZmlsZTEnCisKK3JtIC1mciBwYXRoMCBwYXRoMQorbWtkaXIgcGF0aDAKK2RhdGUgPnBhdGgwL2ZpbGUwCitkYXRlID5wYXRoMQorCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0LWNoZWNrb3V0LWluZGV4IHdpdGhvdXQgLWYgc2hvdWxkIGZhaWwgb24gY29uZmxpY3Rpbmcgd29yayB0cmVlLicgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtY2hlY2tvdXQtaW5kZXggd2l0aCAtZiBzaG91bGQgc3VjY2VlZC4nIFwKKyAgICAnZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWNoZWNrb3V0LWluZGV4IGNvbmZsaWN0aW5nIHBhdGhzLicgXAorICAgICd0ZXN0IC1mIHBhdGgwICYmIHRlc3QgLWQgcGF0aDEgJiYgdGVzdCAtZiBwYXRoMS9maWxlMScKKwordGVzdF9kb25lCisKKwpkaWZmIC0tZ2l0IGEvdC90MjAwMS1jaGVja291dC1jYWNoZS1jbGFzaC5zaCBiL3QvdDIwMDEtY2hlY2tvdXQtY2FjaGUtY2xhc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGRjYWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIwMDEtY2hlY2tvdXQtY2FjaGUtY2xhc2guc2gKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggdGVzdC4KKworVGhpcyB0ZXN0IHJlZ2lzdGVycyB0aGUgZm9sbG93aW5nIGZpbGVzeXN0ZW0gc3RydWN0dXJlIGluIHRoZSBjYWNoZToKKworICAgIHBhdGgwL2ZpbGUwCS0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKworYW5kIGF0dGVtcHRzIHRvIGNoZWNrIGl0IG91dCB3aGVuIHRoZSB3b3JrIHRyZWUgaGFzOgorCisgICAgcGF0aDAvZmlsZTAgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMSAgICAgICAtIGEgc3ltbGluayBwb2ludGluZyBhdCAicGF0aDAiCisKK0NoZWNrb3V0IGNhY2hlIHNob3VsZCBmYWlsIHRvIGV4dHJhY3QgcGF0aDEvZmlsZTEgYmVjYXVzZSB0aGUgbGVhZGluZworcGF0aCBwYXRoMSBpcyBvY2N1cGllZCBieSBhIG5vbi1kaXJlY3RvcnkuICBXaXRoICItZiIgaXQgc2hvdWxkIHJlbW92ZQordGhlIHN5bWxpbmsgcGF0aDEgYW5kIGNyZWF0ZSBkaXJlY3RvcnkgcGF0aDEgYW5kIGZpbGUgcGF0aDEvZmlsZTEuCisnCisuIC4vdGVzdC1saWIuc2gKKworc2hvd19maWxlcygpIHsKKwkjIHNob3cgZmlsZXN5c3RlbSBmaWxlcywganVzdCBbLWRsXSBmb3IgdHlwZSBhbmQgbmFtZQorCWZpbmQgcGF0aD8gLWxzIHwKKwlzZWQgLWUgJ3MvXlswLTldKiAqIFswLTldKiAqIFwoWy1iY2RsXVwpW14gXSogKlswLTldKiAqW14gXSogKlteIF0qICpbMC05XSogW0EtWl1bYS16XVthLXpdIFswLTldWzAtOV0gW14gXSogL2ZzOiBcMSAvJworCSMgd2hhdCdzIGluIHRoZSBjYWNoZSwganVzdCBtb2RlIGFuZCBuYW1lCisJZ2l0LWxzLWZpbGVzIC0tc3RhZ2UgfAorCXNlZCAtZSAncy9eXChbMC05XSpcKSBbMC05YS1mXSogWzAtM10gL2NhOiBcMSAvJworCSMgd2hhdCdzIGluIHRoZSB0cmVlLCBqdXN0IG1vZGUgYW5kIG5hbWUuCisJZ2l0LWxzLXRyZWUgLXIgIiQxIiB8CisJc2VkIC1lICdzL15cKFswLTldKlwpCVteIF0qCVswLTlhLWZdKgkvdHI6IFwxIC8nCit9CisKK21rZGlyIHBhdGgwCitkYXRlID5wYXRoMC9maWxlMAordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAvZmlsZTAnIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMC9maWxlMCcKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0aW5nIHRyZWUgb3V0IHdpdGggZ2l0LXdyaXRlLXRyZWUnIFwKKyAgICAndHJlZTE9JChnaXQtd3JpdGUtdHJlZSknCit0ZXN0X2RlYnVnICdzaG93X2ZpbGVzICR0cmVlMScKKworbWtkaXIgcGF0aDEKK2RhdGUgPnBhdGgxL2ZpbGUxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMS9maWxlMScgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgxL2ZpbGUxJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3dyaXRpbmcgdHJlZSBvdXQgd2l0aCBnaXQtd3JpdGUtdHJlZScgXAorICAgICd0cmVlMj0kKGdpdC13cml0ZS10cmVlKScKK3Rlc3RfZGVidWcgJ3Nob3dfZmlsZXMgJHRyZWUyJworCitybSAtZnIgcGF0aDEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkIHByZXZpb3VzbHkgd3JpdHRlbiB0cmVlIGFuZCBjaGVja291dC4nIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZTEgJiYgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTEnCisKK2xuIC1zIHBhdGgwIHBhdGgxCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBhIHN5bWxpbmsuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDEnCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnd3JpdGluZyB0cmVlIG91dCB3aXRoIGdpdC13cml0ZS10cmVlJyBcCisgICAgJ3RyZWUzPSQoZ2l0LXdyaXRlLXRyZWUpJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTMnCisKKyMgTW9ydGVuIHNheXMgIkdvdCB0aGF0PyIgaGVyZS4KKyMgVGVzdCBiZWdpbnMuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZWFkIHByZXZpb3VzbHkgd3JpdHRlbiB0cmVlIGFuZCBjaGVja291dC4nIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAkdHJlZTIgJiYgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hJwordGVzdF9kZWJ1ZyAnc2hvd19maWxlcyAkdHJlZTInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyBvdXQgY29uZmxpY3RpbmcgcGF0aCB3aXRoIC1mJyBcCisgICAgJ3Rlc3QgISAtaCBwYXRoMCAmJiB0ZXN0IC1kIHBhdGgwICYmCisgICAgIHRlc3QgISAtaCBwYXRoMSAmJiB0ZXN0IC1kIHBhdGgxICYmCisgICAgIHRlc3QgISAtaCBwYXRoMC9maWxlMCAmJiB0ZXN0IC1mIHBhdGgwL2ZpbGUwICYmCisgICAgIHRlc3QgISAtaCBwYXRoMS9maWxlMSAmJiB0ZXN0IC1mIHBhdGgxL2ZpbGUxJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90MjAwMi1jaGVja291dC1jYWNoZS11LnNoIGIvdC90MjAwMi1jaGVja291dC1jYWNoZS11LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzNTJkZGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMDAyLWNoZWNrb3V0LWNhY2hlLXUuc2gKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggLXUgdGVzdC4KKworV2l0aCAtdSBmbGFnLCBnaXQtY2hlY2tvdXQtaW5kZXggaW50ZXJuYWxseSBydW5zIHRoZSBlcXVpdmFsZW50IG9mCitnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCBvbiB0aGUgY2hlY2tlZCBvdXQgZW50cnkuJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyYXRpb24nICcKK2VjaG8gZnJvdHogPnBhdGgwICYmCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwICYmCit0PSQoZ2l0LXdyaXRlLXRyZWUpJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyd3aXRob3V0IC11LCBnaXQtY2hlY2tvdXQtaW5kZXggc211ZGdlcyBzdGF0IGluZm9ybWF0aW9uLicgJworcm0gLWYgcGF0aDAgJiYKK2dpdC1yZWFkLXRyZWUgJHQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtZiAtYSAmJgorZ2l0LWRpZmYtZmlsZXMgfCBkaWZmIC0gL2Rldi9udWxsJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyd3aXRoIC11LCBnaXQtY2hlY2tvdXQtaW5kZXggcGlja3MgdXAgc3RhdCBpbmZvcm1hdGlvbiBmcm9tIG5ldyBmaWxlcy4nICcKK3JtIC1mIHBhdGgwICYmCitnaXQtcmVhZC10cmVlICR0ICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLXUgLWYgLWEgJiYKK2dpdC1kaWZmLWZpbGVzIHwgZGlmZiAtIC9kZXYvbnVsbCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QyMDAzLWNoZWNrb3V0LWNhY2hlLW1rZGlyLnNoIGIvdC90MjAwMy1jaGVja291dC1jYWNoZS1ta2Rpci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOWJjOTBhCi0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwMy1jaGVja291dC1jYWNoZS1ta2Rpci5zaApAQCAtMCwwICsxLDk2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVja291dC1pbmRleCAtLXByZWZpeCB0ZXN0LgorCitUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IC0tcHJlZml4IG9wdGlvbiB3b3JrcyBhcyBhZHZlcnRpc2VkLCBhbmQKK2Fsc28gdmVyaWZpZXMgdGhhdCBzdWNoIGxlYWRpbmcgcGF0aCBtYXkgY29udGFpbiBzeW1saW5rcywgdW5saWtlCit0aGUgR0lUIGNvbnRyb2xsZWQgcGF0aHMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnbWtkaXIgcGF0aDEgJiYKKyAgICBlY2hvIGZyb3R6ID5wYXRoMCAmJgorICAgIGVjaG8gcmV6cm92ID5wYXRoMS9maWxlMSAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEvZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdoYXZlIHN5bWxpbmsgaW4gcGxhY2Ugd2hlcmUgZGlyIGlzIGV4cGVjdGVkLicgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgJiYKKyAgICAgbWtkaXIgcGF0aDIgJiYKKyAgICAgbG4gLXMgcGF0aDIgcGF0aDEgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hICYmCisgICAgIHRlc3QgISAtaCBwYXRoMSAmJiB0ZXN0IC1kIHBhdGgxICYmCisgICAgIHRlc3QgLWYgcGF0aDEvZmlsZTEgJiYgdGVzdCAhIC1mIHBhdGgyL2ZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIC0tcHJlZml4PXBhdGgyLycgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgJiYKKyAgICAgbWtkaXIgcGF0aDIgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC0tcHJlZml4PXBhdGgyLyAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHBhdGgyL3BhdGgwICYmCisgICAgIHRlc3QgLWYgcGF0aDIvcGF0aDEvZmlsZTEgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgwICYmCisgICAgIHRlc3QgISAtZiBwYXRoMS9maWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAtJyBcCisgICAgJ3JtIC1mciBwYXRoMCBwYXRoMSBwYXRoMiB0bXAqICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAtIC1mIC1hICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgwICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgISAtZiBwYXRoMCAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDEvZmlsZTEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgLS1wcmVmaXg9dG1wLSBidXQgd2l0aCBhIGNvbmZsaWN0aW5nIGZpbGUgYW5kIGRpcicgXAorICAgICdybSAtZnIgcGF0aDAgcGF0aDEgcGF0aDIgdG1wKiAmJgorICAgICBlY2hvIG5pdGZvbCA+dG1wLXBhdGgxICYmCisgICAgIG1rZGlyIHRtcC1wYXRoMCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wLSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMCAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMS9maWxlMSAmJgorICAgICB0ZXN0ICEgLWYgcGF0aDAgJiYKKyAgICAgdGVzdCAhIC1mIHBhdGgxL2ZpbGUxJworCisjIExpbnVzIGZpeCAjMQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAvb3JhcnkvIHdoZXJlIHRtcCBpcyBhIHN5bWxpbmsnIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgbWtkaXIgdG1wMSB0bXAxL29yYXJ5ICYmCisgICAgIGxuIC1zIHRtcDEgdG1wICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtLXByZWZpeD10bXAvb3JhcnkvIC1mIC1hICYmCisgICAgIHRlc3QgLWQgdG1wMS9vcmFyeSAmJgorICAgICB0ZXN0IC1mIHRtcDEvb3JhcnkvcGF0aDAgJiYKKyAgICAgdGVzdCAtZiB0bXAxL29yYXJ5L3BhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgLWggdG1wJworCisjIExpbnVzIGZpeCAjMgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAvb3JhcnktIHdoZXJlIHRtcCBpcyBhIHN5bWxpbmsnIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgbWtkaXIgdG1wMSAmJgorICAgICBsbiAtcyB0bXAxIHRtcCAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wL29yYXJ5LSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcDEvb3JhcnktcGF0aDAgJiYKKyAgICAgdGVzdCAtZiB0bXAxL29yYXJ5LXBhdGgxL2ZpbGUxICYmCisgICAgIHRlc3QgLWggdG1wJworCisjIExpbnVzIGZpeCAjMwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VzZSAtLXByZWZpeD10bXAtIHdoZXJlIHRtcC1wYXRoMSBpcyBhIHN5bWxpbmsnIFwKKyAgICAncm0gLWZyIHBhdGgwIHBhdGgxIHBhdGgyIHRtcCogJiYKKyAgICAgbWtkaXIgdG1wMSAmJgorICAgICBsbiAtcyB0bXAxIHRtcC1wYXRoMSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLS1wcmVmaXg9dG1wLSAtZiAtYSAmJgorICAgICB0ZXN0IC1mIHRtcC1wYXRoMCAmJgorICAgICB0ZXN0ICEgLWggdG1wLXBhdGgxICYmCisgICAgIHRlc3QgLWQgdG1wLXBhdGgxICYmCisgICAgIHRlc3QgLWYgdG1wLXBhdGgxL2ZpbGUxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIwMDQtY2hlY2tvdXQtY2FjaGUtdGVtcC5zaCBiL3QvdDIwMDQtY2hlY2tvdXQtY2FjaGUtdGVtcC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTAwOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MjAwNC1jaGVja291dC1jYWNoZS10ZW1wLnNoCkBAIC0wLDAgKzEsMjEyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFNoYXduIFBlYXJjZQorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtY2hlY2tvdXQtaW5kZXggLS10ZW1wIHRlc3QuCisKK1dpdGggLS10ZW1wIGZsYWcsIGdpdC1jaGVja291dC1pbmRleCB3cml0ZXMgdG8gdGVtcG9yYXJ5IG1lcmdlIGZpbGVzCityYXRoZXIgdGhhbiB0aGUgdHJhY2tlZCBwYXRoLicKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ3ByZXBhcmF0aW9uJyAnCitta2RpciBhc3ViZGlyICYmCitlY2hvIHRyZWUxcGF0aDAgPnBhdGgwICYmCitlY2hvIHRyZWUxcGF0aDEgPnBhdGgxICYmCitlY2hvIHRyZWUxcGF0aDMgPnBhdGgzICYmCitlY2hvIHRyZWUxcGF0aDQgPnBhdGg0ICYmCitlY2hvIHRyZWUxYXN1YmRpci9wYXRoNSA+YXN1YmRpci9wYXRoNSAmJgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMSBwYXRoMyBwYXRoNCBhc3ViZGlyL3BhdGg1ICYmCit0MT0kKGdpdC13cml0ZS10cmVlKSAmJgorcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2VjaG8gdHJlZTJwYXRoMCA+cGF0aDAgJiYKK2VjaG8gdHJlZTJwYXRoMSA+cGF0aDEgJiYKK2VjaG8gdHJlZTJwYXRoMiA+cGF0aDIgJiYKK2VjaG8gdHJlZTJwYXRoNCA+cGF0aDQgJiYKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEgcGF0aDIgcGF0aDQgJiYKK3QyPSQoZ2l0LXdyaXRlLXRyZWUpICYmCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZWNobyB0cmVlMnBhdGgwID5wYXRoMCAmJgorZWNobyB0cmVlM3BhdGgxID5wYXRoMSAmJgorZWNobyB0cmVlM3BhdGgyID5wYXRoMiAmJgorZWNobyB0cmVlM3BhdGgzID5wYXRoMyAmJgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMCBwYXRoMSBwYXRoMiBwYXRoMyAmJgordDM9JChnaXQtd3JpdGUtdHJlZSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IG9uZSBzdGFnZSAwIHRvIHRlbXBvcmFyeSBmaWxlJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorZ2l0LXJlYWQtdHJlZSAkdDEgJiYKK2dpdC1jaGVja291dC1pbmRleCAtLXRlbXAgLS0gcGF0aDEgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMSAmJgordGVzdCAkKGN1dCAiLWQJIiAtZjIgb3V0KSA9IHBhdGgxICYmCitwPSQoY3V0ICItZAkiIC1mMSBvdXQpICYmCit0ZXN0IC1mICRwICYmCit0ZXN0ICQoY2F0ICRwKSA9IHRyZWUxcGF0aDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IGFsbCBzdGFnZSAwIHRvIHRlbXBvcmFyeSBmaWxlcycgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2dpdC1yZWFkLXRyZWUgJHQxICYmCitnaXQtY2hlY2tvdXQtaW5kZXggLWEgLS10ZW1wID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDUgJiYKK2ZvciBmIGluIHBhdGgwIHBhdGgxIHBhdGgzIHBhdGg0IGFzdWJkaXIvcGF0aDUKK2RvCisJdGVzdCAkKGdyZXAgJGYgb3V0IHwgY3V0ICItZAkiIC1mMikgPSAkZiAmJgorCXA9JChncmVwICRmIG91dCB8IGN1dCAiLWQJIiAtZjEpICYmCisJdGVzdCAtZiAkcCAmJgorCXRlc3QgJChjYXQgJHApID0gdHJlZTEkZgorZG9uZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisncHJlcGFyZSAzLXdheSBtZXJnZScgJworcm0gLWYgcGF0aCogLm1lcmdlXyogb3V0IC5naXQvaW5kZXggJiYKK2dpdC1yZWFkLXRyZWUgLW0gJHQxICR0MiAkdDMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IG9uZSBzdGFnZSAyIHRvIHRlbXBvcmFyeSBmaWxlJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtLXN0YWdlPTIgLS10ZW1wIC0tIHBhdGgxID5vdXQgJiYKK3Rlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKK3Rlc3QgJChjdXQgIi1kCSIgLWYyIG91dCkgPSBwYXRoMSAmJgorcD0kKGN1dCAiLWQJIiAtZjEgb3V0KSAmJgordGVzdCAtZiAkcCAmJgordGVzdCAkKGNhdCAkcCkgPSB0cmVlMnBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBhbGwgc3RhZ2UgMiB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tYWxsIC0tc3RhZ2U9MiAtLXRlbXAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMyAmJgorZm9yIGYgaW4gcGF0aDEgcGF0aDIgcGF0aDQKK2RvCisJdGVzdCAkKGdyZXAgJGYgb3V0IHwgY3V0ICItZAkiIC1mMikgPSAkZiAmJgorCXA9JChncmVwICRmIG91dCB8IGN1dCAiLWQJIiAtZjEpICYmCisJdGVzdCAtZiAkcCAmJgorCXRlc3QgJChjYXQgJHApID0gdHJlZTIkZgorZG9uZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlcy9vbmUgZmlsZSB0byBub3RoaW5nJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtLXN0YWdlPWFsbCAtLXRlbXAgLS0gcGF0aDAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gMCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlcy9vbmUgZmlsZSB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tc3RhZ2U9YWxsIC0tdGVtcCAtLSBwYXRoMSA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gcGF0aDEgJiYKK2N1dCAiLWQJIiAtZjEgb3V0IHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgLWYgJHMxICYmCit0ZXN0IC1mICRzMiAmJgordGVzdCAtZiAkczMgJiYKK3Rlc3QgJChjYXQgJHMxKSA9IHRyZWUxcGF0aDEgJiYKK3Rlc3QgJChjYXQgJHMyKSA9IHRyZWUycGF0aDEgJiYKK3Rlc3QgJChjYXQgJHMzKSA9IHRyZWUzcGF0aDEpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCBzb21lIHN0YWdlcy9vbmUgZmlsZSB0byB0ZW1wb3JhcnkgZmlsZXMnICcKK3JtIC1mIHBhdGgqIC5tZXJnZV8qIG91dCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tc3RhZ2U9YWxsIC0tdGVtcCAtLSBwYXRoMiA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gcGF0aDIgJiYKK2N1dCAiLWQJIiAtZjEgb3V0IHwgKHJlYWQgczEgczIgczMgJiYKK3Rlc3QgJHMxID0gLiAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgLWYgJHMzICYmCit0ZXN0ICQoY2F0ICRzMikgPSB0cmVlMnBhdGgyICYmCit0ZXN0ICQoY2F0ICRzMykgPSB0cmVlM3BhdGgyKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnY2hlY2tvdXQgYWxsIHN0YWdlcy9hbGwgZmlsZXMgdG8gdGVtcG9yYXJ5IGZpbGVzJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgJiYKK2dpdC1jaGVja291dC1pbmRleCAtYSAtLXN0YWdlPWFsbCAtLXRlbXAgPm91dCAmJgordGVzdCAkKHdjIC1sIDxvdXQpID0gNScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisnLS0gcGF0aDA6IG5vIGVudHJ5JyAnCit0ZXN0IHgkKGdyZXAgcGF0aDAgb3V0IHwgY3V0ICItZAkiIC1mMikgPSB4JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyctLSBwYXRoMTogYWxsIDMgc3RhZ2VzJyAnCit0ZXN0ICQoZ3JlcCBwYXRoMSBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGgxICYmCitncmVwIHBhdGgxIG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoMSAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoMSAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMSknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGgyOiBubyBzdGFnZSAxLCBoYXZlIHN0YWdlIDIgYW5kIDMnICcKK3Rlc3QgJChncmVwIHBhdGgyIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDIgJiYKK2dyZXAgcGF0aDIgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0ICRzMSA9IC4gJiYKK3Rlc3QgLWYgJHMyICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoMiAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMiknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGgzOiBubyBzdGFnZSAyLCBoYXZlIHN0YWdlIDEgYW5kIDMnICcKK3Rlc3QgJChncmVwIHBhdGgzIG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDMgJiYKK2dyZXAgcGF0aDMgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAkczIgPSAuICYmCit0ZXN0IC1mICRzMyAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoMyAmJgordGVzdCAkKGNhdCAkczMpID0gdHJlZTNwYXRoMyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIHBhdGg0OiBubyBzdGFnZSAzLCBoYXZlIHN0YWdlIDEgYW5kIDMnICcKK3Rlc3QgJChncmVwIHBhdGg0IG91dCB8IGN1dCAiLWQJIiAtZjIpID0gcGF0aDQgJiYKK2dyZXAgcGF0aDQgb3V0IHwgY3V0ICItZAkiIC1mMSB8IChyZWFkIHMxIHMyIHMzICYmCit0ZXN0IC1mICRzMSAmJgordGVzdCAtZiAkczIgJiYKK3Rlc3QgJHMzID0gLiAmJgordGVzdCAkKGNhdCAkczEpID0gdHJlZTFwYXRoNCAmJgordGVzdCAkKGNhdCAkczIpID0gdHJlZTJwYXRoNCknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJy0tIGFzdWJkaXIvcGF0aDU6IG5vIHN0YWdlIDIgYW5kIDMgaGF2ZSBzdGFnZSAxJyAnCit0ZXN0ICQoZ3JlcCBhc3ViZGlyL3BhdGg1IG91dCB8IGN1dCAiLWQJIiAtZjIpID0gYXN1YmRpci9wYXRoNSAmJgorZ3JlcCBhc3ViZGlyL3BhdGg1IG91dCB8IGN1dCAiLWQJIiAtZjEgfCAocmVhZCBzMSBzMiBzMyAmJgordGVzdCAtZiAkczEgJiYKK3Rlc3QgJHMyID0gLiAmJgordGVzdCAkczMgPSAuICYmCit0ZXN0ICQoY2F0ICRzMSkgPSB0cmVlMWFzdWJkaXIvcGF0aDUpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKydjaGVja291dCAtLXRlbXAgd2l0aGluIHN1YmRpcicgJworKGNkIGFzdWJkaXIgJiYKKyBnaXQtY2hlY2tvdXQtaW5kZXggLWEgLS1zdGFnZT1hbGwgPm91dCAmJgorIHRlc3QgJCh3YyAtbCA8b3V0KSA9IDEgJiYKKyB0ZXN0ICQoZ3JlcCBwYXRoNSBvdXQgfCBjdXQgIi1kCSIgLWYyKSA9IHBhdGg1ICYmCisgZ3JlcCBwYXRoNSBvdXQgfCBjdXQgIi1kCSIgLWYxIHwgKHJlYWQgczEgczIgczMgJiYKKyB0ZXN0IC1mIC4uLyRzMSAmJgorIHRlc3QgJHMyID0gLiAmJgorIHRlc3QgJHMzID0gLiAmJgorIHRlc3QgJChjYXQgLi4vJHMxKSA9IHRyZWUxYXN1YmRpci9wYXRoNSkKKyknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorJ2NoZWNrb3V0IC0tdGVtcCBzeW1saW5rJyAnCitybSAtZiBwYXRoKiAubWVyZ2VfKiBvdXQgLmdpdC9pbmRleCAmJgorbG4gLXMgYiBhICYmCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGEgJiYKK3Q0PSQoZ2l0LXdyaXRlLXRyZWUpICYmCitybSAtZiAuZ2l0L2luZGV4ICYmCitnaXQtcmVhZC10cmVlICR0NCAmJgorZ2l0LWNoZWNrb3V0LWluZGV4IC0tdGVtcCAtYSA+b3V0ICYmCit0ZXN0ICQod2MgLWwgPG91dCkgPSAxICYmCit0ZXN0ICQoY3V0ICItZAkiIC1mMiBvdXQpID0gYSAmJgorcD0kKGN1dCAiLWQJIiAtZjEgb3V0KSAmJgordGVzdCAtZiAkcCAmJgordGVzdCAkKGNhdCAkcCkgPSBiJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIxMDAtdXBkYXRlLWNhY2hlLWJhZHBhdGguc2ggYi90L3QyMTAwLXVwZGF0ZS1jYWNoZS1iYWRwYXRoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViYzBhM2IKLS0tIC9kZXYvbnVsbAorKysgYi90L3QyMTAwLXVwZGF0ZS1jYWNoZS1iYWRwYXRoLnNoCkBAIC0wLDAgKzEsNTEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXVwZGF0ZS1pbmRleCBub25zZW5zZS1wYXRoIHRlc3QuCisKK1RoaXMgdGVzdCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluIHRoZSBjYWNoZToKKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEgICAgICAgLSBhIHN5bWxpbmsKKyAgICBwYXRoMi9maWxlMiAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgzL2ZpbGUzIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK2FuZCB0cmllcyB0byBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHRoZSBmb2xsb3dpbmc6CisKKyAgICBwYXRoMC9maWxlMCAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgxL2ZpbGUxIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDIgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMyAgICAgICAtIGEgc3ltbGluaworCitBbGwgb2YgdGhlIGF0dGVtcHRzIHNob3VsZCBmYWlsLgorJworCisuIC4vdGVzdC1saWIuc2gKKworbWtkaXIgcGF0aDIgcGF0aDMKK2RhdGUgPnBhdGgwCitsbiAtcyB4eXp6eSBwYXRoMQorZGF0ZSA+cGF0aDIvZmlsZTIKK2RhdGUgPnBhdGgzL2ZpbGUzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHRvIGFkZCB2YXJpb3VzIHBhdGhzLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tIHBhdGgwIHBhdGgxIHBhdGgyL2ZpbGUyIHBhdGgzL2ZpbGUzJworCitybSAtZnIgcGF0aD8KKworbWtkaXIgcGF0aDAgcGF0aDEKK2RhdGUgPnBhdGgyCitsbiAtcyBmcm90eiBwYXRoMworZGF0ZSA+cGF0aDAvZmlsZTAKK2RhdGUgPnBhdGgxL2ZpbGUxCisKK2ZvciBwIGluIHBhdGgwL2ZpbGUwIHBhdGgxL2ZpbGUxIHBhdGgyIHBhdGgzCitkbworCXRlc3RfZXhwZWN0X2ZhaWx1cmUgXAorCSAgICAiZ2l0LXVwZGF0ZS1pbmRleCB0byBhZGQgY29uZmxpY3RpbmcgcGF0aCAkcCBzaG91bGQgZmFpbC4iIFwKKwkgICAgImdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS0gJHAiCitkb25lCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDIxMDEtdXBkYXRlLWluZGV4LXJldXBkYXRlLnNoIGIvdC90MjEwMS11cGRhdGUtaW5kZXgtcmV1cGRhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTc4ZWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDIxMDEtdXBkYXRlLWluZGV4LXJldXBkYXRlLnNoCkBAIC0wLDAgKzEsODQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXVwZGF0ZS1pbmRleCAtLWFnYWluIHRlc3QuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCAzYjE4ZTUxMmRiYTc5ZTRjODMwMGRkMDhhZWIzN2Y4ZTcyOGI4ZGFkIDAJZmlsZTEKKzEwMDY0NCA5ZGI4ODkzODU2YThhMDJlYWE3MzQ3MDA1NGI3YzFjNWE3YzgyZTQ3IDAJZmlsZTIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRlLWluZGV4IC0tYWRkJyBcCisJJ2VjaG8gaGVsbG8gd29ybGQgPmZpbGUxICYmCisJIGVjaG8gZ29vZGJ5ZSBwZW9wbGUgPmZpbGUyICYmCisJIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZTEgZmlsZTIgJiYKKwkgZ2l0LWxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggLS1hZ2FpbicgXAorCSdybSAtZiBmaWxlMSAmJgorCWVjaG8gaGVsbG8gZXZlcnlib2R5ID5maWxlMiAmJgorCWlmIGdpdC11cGRhdGUtaW5kZXggLS1hZ2FpbgorCXRoZW4KKwkJZWNobyBzaG91bGQgaGF2ZSByZWZ1c2VkIHRvIHJlbW92ZSBmaWxlMQorCQlleGl0IDEKKwllbHNlCisJCWVjaG8gaGFwcHkgLSBmYWlsZWQgYXMgZXhwZWN0ZWQKKwlmaSAmJgorCSBnaXQtbHMtZmlsZXMgLXMgPmN1cnJlbnQgJiYKKwkgY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IDBmMWFlMTQyMmMyYmY0M2YxMTdkM2RiZDcxNWM5ODhhOWVkMjEwM2YgMAlmaWxlMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggLS1yZW1vdmUgLS1hZ2FpbicgXAorCSdnaXQtdXBkYXRlLWluZGV4IC0tcmVtb3ZlIC0tYWdhaW4gJiYKKwkgZ2l0LWxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJIGNtcCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaXJzdCBjb21taXQnICdnaXQtY29tbWl0IC1tIGluaXRpYWwnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorMTAwNjQ0IDUzYWI0NDZjM2Y0ZTQyY2U5YmI3MjhhMGNjYjI4M2ExMDFiZTQ5NzkgMAlkaXIxL2ZpbGUzCisxMDA2NDQgMGYxYWUxNDIyYzJiZjQzZjExN2QzZGJkNzE1Yzk4OGE5ZWQyMTAzZiAwCWZpbGUyCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3VwZGF0ZS1pbmRleCBhZ2FpbicgXAorCSdta2RpciAtcCBkaXIxICYmCisJZWNobyBoZWxsbyB3b3JsZCA+ZGlyMS9maWxlMyAmJgorCWVjaG8gZ29vZGJ5ZSBwZW9wbGUgPmZpbGUyICYmCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMiBkaXIxL2ZpbGUzICYmCisJZWNobyBoZWxsbyBldmVyeWJvZHkgPmZpbGUyCisJZWNobyBoYXBweSA+ZGlyMS9maWxlMyAmJgorCWdpdC11cGRhdGUtaW5kZXggLS1hZ2FpbiAmJgorCWdpdC1scy1maWxlcyAtcyA+Y3VycmVudCAmJgorCWNtcCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCBkN2ZiM2Y2OTVmMDZjNzU5ZGJmM2FiMDAwNDZlN2NjMmRhMjJkMTBmIDAJZGlyMS9maWxlMworMTAwNjQ0IDBmMWFlMTQyMmMyYmY0M2YxMTdkM2RiZDcxNWM5ODhhOWVkMjEwM2YgMAlmaWxlMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggLS11cGRhdGUgZnJvbSBzdWJkaXInIFwKKwknZWNobyBub3Qgc28gaGFwcHkgPmZpbGUyICYmCisJY2QgZGlyMSAmJgorCWNhdCAuLi9maWxlMiA+ZmlsZTMgJiYKKwlnaXQtdXBkYXRlLWluZGV4IC0tYWdhaW4gJiYKKwljZCAuLiAmJgorCWdpdC1scy1maWxlcyAtcyA+Y3VycmVudCAmJgorCWNtcCBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKzEwMDY0NCA1OTRmYjViYjE3NTlkOTA5OThlMmJmMmEzODI2MWFlOGUyNDNjNzYwIDAJZGlyMS9maWxlMworMTAwNjQ0IDBmMWFlMTQyMmMyYmY0M2YxMTdkM2RiZDcxNWM5ODhhOWVkMjEwM2YgMAlmaWxlMgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd1cGRhdGUtaW5kZXggLS11cGRhdGUgd2l0aCBwYXRoc3BlYycgXAorCSdlY2hvIHZlcnkgaGFwcHkgPmZpbGUyICYmCisJY2F0IGZpbGUyID5kaXIxL2ZpbGUzICYmCisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFnYWluIGRpcjEvICYmCisJZ2l0LWxzLWZpbGVzIC1zID5jdXJyZW50ICYmCisJY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzAwMC1scy1maWxlcy1vdGhlcnMuc2ggYi90L3QzMDAwLWxzLWZpbGVzLW90aGVycy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZGNiZTAzCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzAwMC1scy1maWxlcy1vdGhlcnMuc2gKQEAgLTAsMCArMSw1NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbHMtZmlsZXMgdGVzdCAoLS1vdGhlcnMgc2hvdWxkIHBpY2sgdXAgc3ltbGlua3MpLgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtZmlsZXMgLS1vdGhlcnMgd2l0aCB0aGUgZm9sbG93aW5nIG9uIHRoZQorZmlsZXN5c3RlbS4KKworICAgIHBhdGgwICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDEJLSBhIHN5bWxpbmsKKyAgICBwYXRoMi9maWxlMiAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorICAgIHBhdGgzLWp1bmsgIC0gYSBmaWxlIHRvIGNvbmZ1c2UgdGhpbmdzCisgICAgcGF0aDMvZmlsZTMgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKycKKy4gLi90ZXN0LWxpYi5zaAorCitkYXRlID5wYXRoMAorbG4gLXMgeHl6enkgcGF0aDEKK21rZGlyIHBhdGgyIHBhdGgzCitkYXRlID5wYXRoMi9maWxlMgorZGF0ZSA+cGF0aDItanVuaworZGF0ZSA+cGF0aDMvZmlsZTMKK2RhdGUgPnBhdGgzLWp1bmsKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDMtanVuayBwYXRoMy9maWxlMworCitjYXQgPmV4cGVjdGVkMSA8PEVPRgorZXhwZWN0ZWQxCitleHBlY3RlZDIKK291dHB1dAorcGF0aDAKK3BhdGgxCitwYXRoMi1qdW5rCitwYXRoMi9maWxlMgorRU9GCitzZWQgLWUgJ3N8cGF0aDIvZmlsZTJ8cGF0aDIvfCcgPGV4cGVjdGVkMSA+ZXhwZWN0ZWQyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgdG8gc2hvdyBvdXRwdXQuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyA+b3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHNob3VsZCBwaWNrIHVwIHN5bWxpbmtzLicgXAorICAgICdkaWZmIG91dHB1dCBleHBlY3RlZDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgLS1kaXJlY3RvcnkgdG8gc2hvdyBvdXRwdXQuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLWRpcmVjdG9yeSA+b3V0cHV0JworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgLS1kaXJlY3Rvcnkgc2hvdWxkIG5vdCBnZXQgY29uZnVzZWQuJyBcCisgICAgJ2RpZmYgb3V0cHV0IGV4cGVjdGVkMicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMDAxLWxzLWZpbGVzLW90aGVycy1leGNsdWRlLnNoIGIvdC90MzAwMS1scy1maWxlcy1vdGhlcnMtZXhjbHVkZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTc5YjdjCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzAwMS1scy1maWxlcy1vdGhlcnMtZXhjbHVkZS5zaApAQCAtMCwwICsxLDgyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUKKworVGhpcyB0ZXN0IHJ1bnMgZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIGFuZCB0ZXN0cyAtLWV4Y2x1ZGUgcGF0dGVybnMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitybSAtZnIgb25lIHRocmVlCitmb3IgZGlyIGluIC4gb25lIG9uZS90d28gdGhyZWUKK2RvCisgIG1rZGlyIC1wICRkaXIgJiYKKyAgZm9yIGkgaW4gMSAyIDMgNCA1IDYgNyA4CisgIGRvCisgICAgPiRkaXIvYS4kaQorICBkb25lCitkb25lCisKK2NhdCA+ZXhwZWN0IDw8RU9GCithLjIKK2EuNAorYS41CithLjgKK29uZS9hLjMKK29uZS9hLjQKK29uZS9hLjUKK29uZS9hLjcKK29uZS90d28vYS4yCitvbmUvdHdvL2EuMworb25lL3R3by9hLjUKK29uZS90d28vYS43CitvbmUvdHdvL2EuOAordGhyZWUvYS4yCit0aHJlZS9hLjMKK3RocmVlL2EuNAordGhyZWUvYS41Cit0aHJlZS9hLjgKK0VPRgorCitlY2hvICcuZ2l0aWdub3JlCitvdXRwdXQKK2V4cGVjdAorLmdpdGlnbm9yZQorKi43CishKi44JyA+LmdpdC9pZ25vcmUKKworZWNobyAnKi4xCisvKi4zCishKi42JyA+LmdpdGlnbm9yZQorZWNobyAnKi4yCit0d28vKi40CishKi43CisqLjgnID5vbmUvLmdpdGlnbm9yZQorZWNobyAnISouMgorISouOCcgPm9uZS90d28vLmdpdGlnbm9yZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHdpdGggdmFyaW91cyBleGNsdWRlIG9wdGlvbnMuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyBcCisgICAgICAgLS1leGNsdWRlPVwqLjYgXAorICAgICAgIC0tZXhjbHVkZS1wZXItZGlyZWN0b3J5PS5naXRpZ25vcmUgXAorICAgICAgIC0tZXhjbHVkZS1mcm9tPS5naXQvaWdub3JlIFwKKyAgICAgICA+b3V0cHV0ICYmCisgICAgIGRpZmYgLXUgZXhwZWN0IG91dHB1dCcKKworIyBUZXN0IFxyXG4gKE1TRE9TLWxpa2Ugc3lzdGVtcykKK3ByaW50ZiAnKi4xXHJcbi8qLjNcclxuISouNlxyXG4nID4uZ2l0aWdub3JlCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgd2l0aCBcclxuIGxpbmUgZW5kaW5ncy4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIFwKKyAgICAgICAtLWV4Y2x1ZGU9XCouNiBcCisgICAgICAgLS1leGNsdWRlLXBlci1kaXJlY3Rvcnk9LmdpdGlnbm9yZSBcCisgICAgICAgLS1leGNsdWRlLWZyb209LmdpdC9pZ25vcmUgXAorICAgICAgID5vdXRwdXQgJiYKKyAgICAgZGlmZiAtdSBleHBlY3Qgb3V0cHV0JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMDItbHMtZmlsZXMtZGFzaHBhdGguc2ggYi90L3QzMDAyLWxzLWZpbGVzLWRhc2hwYXRoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0MmYxMzgKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDAyLWxzLWZpbGVzLWRhc2hwYXRoLnNoCkBAIC0wLDAgKzEsNjkgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWxzLWZpbGVzIHRlc3QgKC0tIHRvIHRlcm1pbmF0ZSB0aGUgcGF0aCBsaXN0KS4KKworVGhpcyB0ZXN0IHJ1bnMgZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHdpdGggdGhlIGZvbGxvd2luZyBvbiB0aGUKK2ZpbGVzeXN0ZW0uCisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIC1mb28JLSBhIGZpbGUgd2l0aCBhIGZ1bm55IG5hbWUuCisgICAgLS0JCS0gYW5vdGhlciBmaWxlIHdpdGggYSBmdW5ueSBuYW1lLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCXNldHVwIFwKKwknZWNobyBmcm90eiA+cGF0aDAgJiYKKwllY2hvIGZyb3R6ID4uLy1mb28gJiYKKwllY2hvIGZyb3R6ID4uLy0tJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIHdpdGhvdXQgcGF0aCByZXN0cmljdGlvbi4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzID5vdXRwdXQgJiYKKyAgICAgZGlmZiAtdSBvdXRwdXQgLSA8PEVPRgorLS0KKy1mb28KK291dHB1dAorcGF0aDAKK0VPRgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIHdpdGggcGF0aCByZXN0cmljdGlvbi4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tb3RoZXJzIHBhdGgwID5vdXRwdXQgJiYKKwlkaWZmIC11IG91dHB1dCAtIDw8RU9GCitwYXRoMAorRU9GCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgd2l0aCBwYXRoIHJlc3RyaWN0aW9uIHdpdGggLS0uJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLSBwYXRoMCA+b3V0cHV0ICYmCisJZGlmZiAtdSBvdXRwdXQgLSA8PEVPRgorcGF0aDAKK0VPRgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIHdpdGggcGF0aCByZXN0cmljdGlvbiB3aXRoIC0tIC0tLicgXAorICAgICdnaXQtbHMtZmlsZXMgLS1vdGhlcnMgLS0gLS0gPm91dHB1dCAmJgorCWRpZmYgLXUgb3V0cHV0IC0gPDxFT0YKKy0tCitFT0YKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdC1scy1maWxlcyB3aXRoIG5vIHBhdGggcmVzdHJpY3Rpb24uJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLW90aGVycyAtLSA+b3V0cHV0ICYmCisJZGlmZiAtdSBvdXRwdXQgLSA8PEVPRgorLS0KKy1mb28KK291dHB1dAorcGF0aDAKK0VPRgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDMwMTAtbHMtZmlsZXMta2lsbGVkLW1vZGlmaWVkLnNoIGIvdC90MzAxMC1scy1maWxlcy1raWxsZWQtbW9kaWZpZWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWZjMTk3NgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMwMTAtbHMtZmlsZXMta2lsbGVkLW1vZGlmaWVkLnNoCkBAIC0wLDAgKzEsOTYgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWxzLWZpbGVzIC1rIGFuZCAtbSBmbGFncyB0ZXN0LgorCitUaGlzIHRlc3QgcHJlcGFyZXMgdGhlIGZvbGxvd2luZyBpbiB0aGUgY2FjaGU6CisKKyAgICBwYXRoMCAgICAgICAtIGEgZmlsZQorICAgIHBhdGgxICAgICAgIC0gYSBzeW1saW5rCisgICAgcGF0aDIvZmlsZTIgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMy9maWxlMyAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeQorCithbmQgdGhlIGZvbGxvd2luZyBvbiB0aGUgZmlsZXN5c3RlbToKKworICAgIHBhdGgwL2ZpbGUwIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvZmlsZTEgLSBhIGZpbGUgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMiAgICAgICAtIGEgZmlsZQorICAgIHBhdGgzICAgICAgIC0gYSBzeW1saW5rCisgICAgcGF0aDQJLSBhIGZpbGUKKyAgICBwYXRoNQktIGEgc3ltbGluaworICAgIHBhdGg2L2ZpbGU2IC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK2dpdC1scy1maWxlcyAtayBzaG91bGQgcmVwb3J0IHRoYXQgZXhpc3RpbmcgZmlsZXN5c3RlbQorb2JqZWN0cyBleGNlcHQgcGF0aDQsIHBhdGg1IGFuZCBwYXRoNi9maWxlNiB0byBiZSBraWxsZWQuCisKK0Fsc28gZm9yIG1vZGlmaWNhdGlvbiB0ZXN0LCB0aGUgY2FjaGUgYW5kIHdvcmtpbmcgdHJlZSBoYXZlOgorCisgICAgcGF0aDcgICAgICAgLSBhbiBlbXB0eSBmaWxlLCBtb2RpZmllZCB0byBhIG5vbi1lbXB0eSBmaWxlLgorICAgIHBhdGg4ICAgICAgIC0gYSBub24tZW1wdHkgZmlsZSwgbW9kaWZpZWQgdG8gYW4gZW1wdHkgZmlsZS4KKyAgICBwYXRoOQktIGFuIGVtcHR5IGZpbGUsIGNhY2hlIGRpcnRpZWQuCisgICAgcGF0aDEwCS0gYSBub24tZW1wdHkgZmlsZSwgY2FjaGUgZGlydGllZC4KKworV2Ugc2hvdWxkIHJlcG9ydCBwYXRoMCwgcGF0aDEsIHBhdGgyL2ZpbGUyLCBwYXRoMy9maWxlMywgcGF0aDcgYW5kIHBhdGg4Cittb2RpZmllZCB3aXRob3V0IHJlcG9ydGluZyBwYXRoOSBhbmQgcGF0aDEwLgorJworLiAuL3Rlc3QtbGliLnNoCisKK2RhdGUgPnBhdGgwCitsbiAtcyB4eXp6eSBwYXRoMQorbWtkaXIgcGF0aDIgcGF0aDMKK2RhdGUgPnBhdGgyL2ZpbGUyCitkYXRlID5wYXRoMy9maWxlMworOiA+cGF0aDcKK2RhdGUgPnBhdGg4Cis6ID5wYXRoOQorZGF0ZSA+cGF0aDEwCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB0byBhZGQgdmFyaW91cyBwYXRocy4nIFwKKyAgICAiZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLSBwYXRoMCBwYXRoMSBwYXRoPy9maWxlPyBwYXRoNyBwYXRoOCBwYXRoOSBwYXRoMTAiCisKK3JtIC1mciBwYXRoPyA7IyBsZWF2ZSBwYXRoMTAgYWxvbmUKK2RhdGUgPnBhdGgyCitsbiAtcyBmcm90eiBwYXRoMworbG4gLXMgbml0Zm9sIHBhdGg1Citta2RpciBwYXRoMCBwYXRoMSBwYXRoNgorZGF0ZSA+cGF0aDAvZmlsZTAKK2RhdGUgPnBhdGgxL2ZpbGUxCitkYXRlID5wYXRoNi9maWxlNgorZGF0ZSA+cGF0aDcKKzogPnBhdGg4Cis6ID5wYXRoOQordG91Y2ggcGF0aDEwCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtbHMtZmlsZXMgLWsgdG8gc2hvdyBraWxsZWQgZmlsZXMuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtayA+Lm91dHB1dCcKK2NhdCA+LmV4cGVjdGVkIDw8RU9GCitwYXRoMC9maWxlMAorcGF0aDEvZmlsZTEKK3BhdGgyCitwYXRoMworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQtbHMtZmlsZXMgLWsgb3V0cHV0LicgXAorICAgICdkaWZmIC5vdXRwdXQgLmV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC1tIHRvIHNob3cgbW9kaWZpZWQgZmlsZXMuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtbSA+Lm91dHB1dCcKK2NhdCA+LmV4cGVjdGVkIDw8RU9GCitwYXRoMAorcGF0aDEKK3BhdGgyL2ZpbGUyCitwYXRoMy9maWxlMworcGF0aDcKK3BhdGg4CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGdpdC1scy1maWxlcyAtbSBvdXRwdXQuJyBcCisgICAgJ2RpZmYgLm91dHB1dCAuZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzAyMC1scy1maWxlcy1lcnJvci11bm1hdGNoLnNoIGIvdC90MzAyMC1scy1maWxlcy1lcnJvci11bm1hdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1NTU1OWUKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzMDIwLWxzLWZpbGVzLWVycm9yLXVubWF0Y2guc2gKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBDYXJsIEQuIFdvcnRoCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy1maWxlcyB0ZXN0IGZvciAtLWVycm9yLXVubWF0Y2ggb3B0aW9uCisKK1RoaXMgdGVzdCBydW5zIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggdG8gZW5zdXJlIGl0IGNvcnJlY3RseQorcmV0dXJucyBhbiBlcnJvciB3aGVuIGEgbm9uLWV4aXN0ZW50IHBhdGggaXMgcHJvdmlkZWQgb24gdGhlIGNvbW1hbmQKK2xpbmUuCisnCisuIC4vdGVzdC1saWIuc2gKKwordG91Y2ggZm9vIGJhcgorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmb28gYmFyCitnaXQtY29tbWl0IC1tICJhZGQgZm9vIGJhciIKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2dpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggc2hvdWxkIGZhaWwgd2l0aCB1bm1hdGNoZWQgcGF0aC4nIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBmb28gYmFyLWRvZXMtbm90LW1hdGNoJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWxzLWZpbGVzIC0tZXJyb3ItdW5tYXRjaCBzaG91bGQgc3VjY2VlZCBlaXRoIG1hdGNoZWQgcGF0aHMuJyBcCisgICAgJ2dpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vIGJhcicKKwordGVzdF9kb25lCisxCmRpZmYgLS1naXQgYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2ggYi90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmVjMDZkMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaApAQCAtMCwwICsxLDE1OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtbHMtdHJlZSB0ZXN0LgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtdHJlZSB3aXRoIHRoZSBmb2xsb3dpbmcgaW4gYSB0cmVlLgorCisgICAgcGF0aDAgICAgICAgLSBhIGZpbGUKKyAgICBwYXRoMQktIGEgc3ltbGluaworICAgIHBhdGgyL2ZvbyAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDIvYmF6Ym8gLSBhIHN5bWxpbmsgaW4gYSBkaXJlY3RvcnkKKyAgICBwYXRoMi9iYXovYiAtIGEgZmlsZSBpbiBhIGRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeQorCitUaGUgbmV3IHBhdGggcmVzdHJpY3Rpb24gY29kZSBzaG91bGQgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBwYXRoMiBhbmQKK3BhdGgyL2Jhei4gIEFsc28gcGF0aDAvIHNob3VsZCBzbm93IG5vdGhpbmcuCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3NldHVwJyBcCisgICAgJ21rZGlyIHBhdGgyIHBhdGgyL2JheiAmJgorICAgICBlY2hvIEhpID5wYXRoMCAmJgorICAgICBsbiAtcyBwYXRoMCBwYXRoMSAmJgorICAgICBlY2hvIExvID5wYXRoMi9mb28gJiYKKyAgICAgbG4gLXMgLi4vcGF0aDEgcGF0aDIvYmF6Ym8gJiYKKyAgICAgZWNobyBNaSA+cGF0aDIvYmF6L2IgJiYKKyAgICAgZmluZCBwYXRoPyBcKCAtdHlwZSBmIC1vIC10eXBlIGwgXCkgLXByaW50IHwKKyAgICAgeGFyZ3MgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAmJgorICAgICB0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyAkdHJlZScKKworX3g0MD0nWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXScKK194NDA9IiRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAiCit0ZXN0X291dHB1dCAoKSB7CisgICAgc2VkIC1lICJzLyAkX3g0MAkvIFgJLyIgPGN1cnJlbnQgPmNoZWNrCisgICAgZGlmZiAtdSBleHBlY3RlZCBjaGVjaworfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBwbGFpbicgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorMDQwMDAwIHRyZWUgWAlwYXRoMgorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSByZWN1cnNpdmUnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJcGF0aDAKKzEyMDAwMCBibG9iIFgJcGF0aDEKKzEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKzEyMDAwMCBibG9iIFgJcGF0aDIvYmF6Ym8KKzEwMDY0NCBibG9iIFgJcGF0aDIvZm9vCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHJlY3Vyc2l2ZSB3aXRoIC10JyBcCisgICAgJ2dpdC1scy10cmVlIC1yIC10ICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCXBhdGgwCisxMjAwMDAgYmxvYiBYCXBhdGgxCiswNDAwMDAgdHJlZSBYCXBhdGgyCiswNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorMTAwNjQ0IGJsb2IgWAlwYXRoMi9iYXovYgorMTIwMDAwIGJsb2IgWAlwYXRoMi9iYXpibworMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgcmVjdXJzaXZlIHdpdGggLWQnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgLWQgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aCcgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKworIyBpdCB1c2VkIHRvIGJlIHBhdGgxIGFuZCB0aGVuIHBhdGgwLCBidXQgd2l0aCBwYXRoc3BlYyBzZW1hbnRpY3MKKyMgdGhleSBhcmUgc2hvd24gaW4gY2Fub25pY2FsIG9yZGVyLgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMSBwYXRoMCcgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMAorMTIwMDAwIGJsb2IgWAlwYXRoMQorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgwLycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMC8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyBJdCB1c2VkIHRvIHNob3cgcGF0aDIgYW5kIGl0cyBpbW1lZGlhdGUgY2hpbGRyZW4gYnV0CisjIHdpdGggcGF0aHNwZWMgc2VtYW50aWNzIGl0IHNob3dzIG9ubHkgcGF0aDIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlcmVkIHdpdGggcGF0aDInIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDIgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKworIyAuLi4gYW5kIHBhdGgyLyBzaG93cyB0aGUgY2hpbGRyZW4uCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyLycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMi8gPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDIvYmF6CisxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisxMDA2NDQgYmxvYiBYCXBhdGgyL2ZvbworRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCisjIFRoZSBzYW1lIGNoYW5nZSAtLSBleGFjdCBtYXRjaCBkb2VzIG5vdCBzaG93IGNoaWxkcmVuIG9mCisjIHBhdGgyL2JhegordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyZWQgd2l0aCBwYXRoMi9iYXonIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDIvYmF6ID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXJlZCB3aXRoIHBhdGgyL2JhaycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMi9iYWsgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgLXQgZmlsdGVyZWQgd2l0aCBwYXRoMi9iYWsnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXQgJHRyZWUgcGF0aDIvYmFrID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCiswNDAwMDAgdHJlZSBYCXBhdGgyCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzEwMS1scy10cmVlLWRpcm5hbWUuc2ggYi90L3QzMTAxLWxzLXRyZWUtZGlybmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzhkZWIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzEwMS1scy10cmVlLWRpcm5hbWUuc2gKQEAgLTAsMCArMSwxMzggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMgQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydCBGaXR6c2ltb25zCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1scy10cmVlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWVzIGhhbmRsaW5nLgorCitUaGlzIHRlc3QgcnVucyBnaXQtbHMtdHJlZSB3aXRoIHRoZSBmb2xsb3dpbmcgaW4gYSB0cmVlLgorCisgICAgMS50eHQgICAgICAgICAgICAgIC0gYSBmaWxlCisgICAgMi50eHQgICAgICAgICAgICAgIC0gYSBmaWxlCisgICAgcGF0aDAvYS9iL2MvMS50eHQgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDEvYi9jLzEudHh0ICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDIvMS50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvMS50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisgICAgcGF0aDMvMi50eHQgICAgICAgIC0gYSBmaWxlIGluIGEgZGlyZWN0b3J5CisKK1Rlc3QgdGhlIGhhbmRsaW5nIG9mIG11bGl0cGxlIGRpcmVjdG9yaWVzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlsZQorZW50cmllcy4gIEFsc28gdGVzdCBvZGQgZmlsZW5hbWUgYW5kIG1pc3NpbmcgZW50cmllcyBoYW5kbGluZy4KKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnZWNobyAxMTEgPjEudHh0ICYmCisgICAgIGVjaG8gMjIyID4yLnR4dCAmJgorICAgICBta2RpciBwYXRoMCBwYXRoMC9hIHBhdGgwL2EvYiBwYXRoMC9hL2IvYyAmJgorICAgICBlY2hvIDExMSA+cGF0aDAvYS9iL2MvMS50eHQgJiYKKyAgICAgbWtkaXIgcGF0aDEgcGF0aDEvYiBwYXRoMS9iL2MgJiYKKyAgICAgZWNobyAxMTEgPnBhdGgxL2IvYy8xLnR4dCAmJgorICAgICBta2RpciBwYXRoMiAmJgorICAgICBlY2hvIDExMSA+cGF0aDIvMS50eHQgJiYKKyAgICAgbWtkaXIgcGF0aDMgJiYKKyAgICAgZWNobyAxMTEgPnBhdGgzLzEudHh0ICYmCisgICAgIGVjaG8gMjIyID5wYXRoMy8yLnR4dCAmJgorICAgICBmaW5kICoudHh0IHBhdGgqIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKSAtcHJpbnQgfAorICAgICB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitfeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworX3g0MD0iJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCIKK3Rlc3Rfb3V0cHV0ICgpIHsKKyAgICBzZWQgLWUgInMvICRfeDQwCS8gWAkvIiA8Y3VycmVudCA+Y2hlY2sKKyAgICBkaWZmIC11IGV4cGVjdGVkIGNoZWNrCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIHBsYWluJyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCisxMDA2NDQgYmxvYiBYCTEudHh0CisxMDA2NDQgYmxvYiBYCTIudHh0CiswNDAwMDAgdHJlZSBYCXBhdGgwCiswNDAwMDAgdHJlZSBYCXBhdGgxCiswNDAwMDAgdHJlZSBYCXBhdGgyCiswNDAwMDAgdHJlZSBYCXBhdGgzCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKyMgUmVjdXJzaXZlIGRvZXMgbm90IHNob3cgdHJlZSBub2RlcyBhbnltb3JlLi4uCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSByZWN1cnNpdmUnIFwKKyAgICAnZ2l0LWxzLXRyZWUgLXIgJHRyZWUgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJMS50eHQKKzEwMDY0NCBibG9iIFgJMi50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDAvYS9iL2MvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDEvYi9jLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgyLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzIudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciAxLnR4dCcgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSAxLnR4dCA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAkxLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgcGF0aDEvYi9jLzEudHh0JyBcCisgICAgJ2dpdC1scy10cmVlICR0cmVlIHBhdGgxL2IvYy8xLnR4dCA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAlwYXRoMS9iL2MvMS50eHQKK0VPRgorICAgICB0ZXN0X291dHB1dCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xzLXRyZWUgZmlsdGVyIGFsbCAxLnR4dCBmaWxlcycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSAxLnR4dCBwYXRoMC9hL2IvYy8xLnR4dCBwYXRoMS9iL2MvMS50eHQgcGF0aDIvMS50eHQgcGF0aDMvMS50eHQgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzEwMDY0NCBibG9iIFgJMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDAvYS9iL2MvMS50eHQKKzEwMDY0NCBibG9iIFgJcGF0aDEvYi9jLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgyLzEudHh0CisxMDA2NDQgYmxvYiBYCXBhdGgzLzEudHh0CitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKyMgSSBhbSBub3Qgc28gc3VyZSBhYm91dCB0aGlzIG9uZSBhZnRlciBscy10cmVlIGRvaW5nIHBhdGhzcGVjIG1hdGNoLgorIyBIYXZpbmcgYm90aCBwYXRoMC9hIGFuZCBwYXRoMC9hL2IvYyBtYWtlcyBwYXRoMC9hIHJlZHVuZGFudCwgYW5kCisjIGl0IGJlaGF2ZXMgYXMgaWYgcGF0aDAvYS9iL2MsIHBhdGgxL2IvYywgcGF0aDIgYW5kIHBhdGgzIGFyZSBzcGVjaWZpZWQuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgZGlyZWN0b3JpZXMnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDMgcGF0aDIgcGF0aDAvYS9iL2MgcGF0aDEvYi9jIHBhdGgwL2EgPmN1cnJlbnQgJiYKKyAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKzA0MDAwMCB0cmVlIFgJcGF0aDAvYS9iL2MKKzA0MDAwMCB0cmVlIFgJcGF0aDEvYi9jCiswNDAwMDAgdHJlZSBYCXBhdGgyCiswNDAwMDAgdHJlZSBYCXBhdGgzCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKKyMgQWdhaW4sIGR1cGxpY2F0ZXMgYXJlIGZpbHRlcmVkIGF3YXkgc28gdGhpcyBpcyBlcXVpdmFsZW50IHRvCisjIGhhdmluZyAxLnR4dCBhbmQgcGF0aDMKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdscy10cmVlIGZpbHRlciBvZGQgbmFtZXMnIFwKKyAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgMS50eHQgLzEudHh0IC8vMS50eHQgcGF0aDMvMS50eHQgL3BhdGgzLzEudHh0IC8vcGF0aDMvLzEudHh0IHBhdGgzIC9wYXRoMy8gcGF0aDMvLyA+Y3VycmVudCAmJgorICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorMTAwNjQ0IGJsb2IgWAkxLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8xLnR4dAorMTAwNjQ0IGJsb2IgWAlwYXRoMy8yLnR4dAorRU9GCisgICAgIHRlc3Rfb3V0cHV0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbHMtdHJlZSBmaWx0ZXIgbWlzc2luZyBmaWxlcyBhbmQgZXh0cmEgc2xhc2hlcycgXAorICAgICdnaXQtbHMtdHJlZSAkdHJlZSAxLnR4dC8gYWJjLnR4dCBwYXRoMy8vMjMudHh0IHBhdGgzLzIudHh0Ly8vID5jdXJyZW50ICYmCisgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCitFT0YKKyAgICAgdGVzdF9vdXRwdXQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzIwMC1icmFuY2guc2ggYi90L3QzMjAwLWJyYW5jaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjA0ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzIwMC1icmFuY2guc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBBbW9zIFdhdGVybGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgYnJhbmNoIC0tZm9vIHNob3VsZCBub3QgY3JlYXRlIGJvZ3VzIGJyYW5jaAorCitUaGlzIHRlc3QgcnVucyBnaXQgYnJhbmNoIC0taGVscCBhbmQgY2hlY2tzIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHByb3Blcmx5CitoYW5kbGVkLiAgU3BlY2lmaWNhbGx5LCB0aGF0IGEgYm9ndXMgYnJhbmNoIGlzIG5vdCBjcmVhdGVkLgorJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIGFuIHRyaXZpYWwgcmVwb3NpdG9yeScgXAorICAgICdlY2hvIEhlbGxvID4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiSW5pdGlhbCBjb21taXQuIiAmJgorICAgICBIRUFEPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2dpdCBicmFuY2ggLS1oZWxwIHNob3VsZCByZXR1cm4gc3VjY2VzcyBub3cuJyBcCisgICAgJ2dpdC1icmFuY2ggLS1oZWxwJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZ2l0IGJyYW5jaCAtLWhlbHAgc2hvdWxkIG5vdCBoYXZlIGNyZWF0ZWQgYSBib2d1cyBicmFuY2gnIFwKKyAgICAndGVzdCAtZiAuZ2l0L3JlZnMvaGVhZHMvLS1oZWxwJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCBhYmMgc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCcgXAorICAgICdnaXQtYnJhbmNoIGFiYyAmJiB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy9hYmMnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgYnJhbmNoIGEvYi9jIHNob3VsZCBjcmVhdGUgYSBicmFuY2gnIFwKKyAgICAnZ2l0LWJyYW5jaCBhL2IvYyAmJiB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy9hL2IvYycKKworY2F0ID5leHBlY3QgPDxFT0YKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgJEhFQUQgJEdJVF9DT01NSVRURVJfTkFNRSA8JEdJVF9DT01NSVRURVJfRU1BSUw+IDExMTcxNTAyMDAgKzAwMDAJYnJhbmNoOiBDcmVhdGVkIGZyb20gSEVBRAorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCAtbCBkL2UvZiBzaG91bGQgY3JlYXRlIGEgYnJhbmNoIGFuZCBhIGxvZycgXAorCSdHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDUtMDUtMjYgMjM6MzAiIFwKKyAgICAgZ2l0LWJyYW5jaCAtbCBkL2UvZiAmJgorCSB0ZXN0IC1mIC5naXQvcmVmcy9oZWFkcy9kL2UvZiAmJgorCSB0ZXN0IC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL2QvZS9mICYmCisJIGRpZmYgZXhwZWN0IC5naXQvbG9ncy9yZWZzL2hlYWRzL2QvZS9mJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0IGJyYW5jaCAtZCBkL2UvZiBzaG91bGQgZGVsZXRlIGEgYnJhbmNoIGFuZCBhIGxvZycgXAorCSdnaXQtYnJhbmNoIC1kIGQvZS9mICYmCisJIHRlc3QgISAtZiAuZ2l0L3JlZnMvaGVhZHMvZC9lL2YgJiYKKwkgdGVzdCAhIC1mIC5naXQvbG9ncy9yZWZzL2hlYWRzL2QvZS9mJworCitjYXQgPmV4cGVjdCA8PEVPRgorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAkSEVBRCAkR0lUX0NPTU1JVFRFUl9OQU1FIDwkR0lUX0NPTU1JVFRFUl9FTUFJTD4gMTExNzE1MDIwMCArMDAwMAljaGVja291dDogQ3JlYXRlZCBmcm9tIG1hc3Rlcl4wCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQgY2hlY2tvdXQgLWIgZy9oL2kgLWwgc2hvdWxkIGNyZWF0ZSBhIGJyYW5jaCBhbmQgYSBsb2cnIFwKKwknR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI2IDIzOjMwIiBcCisgICAgIGdpdC1jaGVja291dCAtYiBnL2gvaSAtbCBtYXN0ZXIgJiYKKwkgdGVzdCAtZiAuZ2l0L3JlZnMvaGVhZHMvZy9oL2kgJiYKKwkgdGVzdCAtZiAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9nL2gvaSAmJgorCSBkaWZmIGV4cGVjdCAuZ2l0L2xvZ3MvcmVmcy9oZWFkcy9nL2gvaScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzMzAwLWZ1bm55LW5hbWVzLnNoIGIvdC90MzMwMC1mdW5ueS1uYW1lcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMTIyNzBlCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzMwMC1mdW5ueS1uYW1lcy5zaApAQCAtMCwwICsxLDE2MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdQYXRobmFtZXMgd2l0aCBmdW5ueSBjaGFyYWN0ZXJzLgorCitUaGlzIHRlc3QgdHJpZXMgcGF0aG5hbWVzIHdpdGggZnVubnkgY2hhcmFjdGVycyBpbiB0aGUgd29ya2luZwordHJlZSwgaW5kZXgsIGFuZCB0cmVlIG9iamVjdHMuCisnCisKKy4gLi90ZXN0LWxpYi5zaAorCitwMD0nbm8tZnVubnknCitwMT0ndGFicwksIiAoZHEpIGFuZCBzcGFjZXMnCitwMj0nanVzdCBzcGFjZScKKworY2F0ID4iJHAwIiA8PFxFT0YKKzEuIEEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgY2F0LCBvb3BzIGRvZy4KKzIuIEEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgY2F0LCBvb3BzIGRvZy4KKzMuIEEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgY2F0LCBvb3BzIGRvZy4KK0VPRgorCitjYXQgPiIkcDEiICIkcDAiCitlY2hvICdGb28gQmFyIEJheicgPiIkcDIiCisKK3Rlc3QgLWYgIiRwMSIgJiYgY21wICIkcDAiICIkcDEiIHx8IHsKKwkjIHNpbmNlIEZBVC9OVEZTIGRvZXMgbm90IGFsbG93IHRhYnMgaW4gZmlsZW5hbWVzLCBza2lwIHRoaXMgdGVzdAorCXNheSAnWW91ciBmaWxlc3lzdGVtIGRvZXMgbm90IGFsbG93IHRhYnMgaW4gZmlsZW5hbWVzLCB0ZXN0IHNraXBwZWQuJworCXRlc3RfZG9uZQorfQorCitlY2hvICdqdXN0IHNwYWNlCituby1mdW5ueScgPmV4cGVjdGVkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtbHMtZmlsZXMgbm8tZnVubnknIFwKKwknZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAiJHAwIiAiJHAyIiAmJgorCWdpdC1scy1maWxlcyA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKwordDA9YGdpdC13cml0ZS10cmVlYAorZWNobyAiJHQwIiA+dDAKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitqdXN0IHNwYWNlCituby1mdW5ueQorInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1scy1maWxlcyB3aXRoLWZ1bm55JyBcCisJJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgIiRwMSIgJiYKKwlnaXQtbHMtZmlsZXMgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK2VjaG8gJ2p1c3Qgc3BhY2UKK25vLWZ1bm55Cit0YWJzCSwiIChkcSkgYW5kIHNwYWNlcycgPmV4cGVjdGVkCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtbHMtZmlsZXMgLXogd2l0aC1mdW5ueScgXAorCSdnaXQtbHMtZmlsZXMgLXogfCB0ciBcXDAgXFwwMTIgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK3QxPWBnaXQtd3JpdGUtdHJlZWAKK2VjaG8gIiR0MSIgPnQxCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgoranVzdCBzcGFjZQorbm8tZnVubnkKKyJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtbHMtdHJlZSB3aXRoIGZ1bm55JyBcCisJJ2dpdC1scy10cmVlIC1yICR0MSB8IHNlZCAtZSAicy9eW14JXSoJLy8iID5jdXJyZW50ICYmCisJIGRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitBCSJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi1pbmRleCB3aXRoLWZ1bm55JyBcCisJJ2dpdC1kaWZmLWluZGV4IC0tbmFtZS1zdGF0dXMgJHQwID5jdXJyZW50ICYmCisJZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtdHJlZSAtLW5hbWUtc3RhdHVzICR0MCAkdDEgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK2VjaG8gJ0EKK3RhYnMJLCIgKGRxKSBhbmQgc3BhY2VzJyA+ZXhwZWN0ZWQKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLWluZGV4IC16IHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtaW5kZXggLXogLS1uYW1lLXN0YXR1cyAkdDAgfCB0ciBcXDAgXFwwMTIgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgLXogd2l0aC1mdW5ueScgXAorCSdnaXQtZGlmZi10cmVlIC16IC0tbmFtZS1zdGF0dXMgJHQwICR0MSB8IHRyIFxcMCBcXDAxMiA+Y3VycmVudCAmJgorCWRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCitDTlVNCW5vLWZ1bm55CSJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIC1DIHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtdHJlZSAtQyAtLWZpbmQtY29waWVzLWhhcmRlciAtLW5hbWUtc3RhdHVzIFwKKwkJJHQwICR0MSB8IHNlZCAtZSAncy9eQ1swLTldKi9DTlVNLycgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorUk5VTQluby1mdW5ueQkidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSBkZWxldGUgd2l0aC1mdW5ueScgXAorCSdnaXQtdXBkYXRlLWluZGV4IC0tZm9yY2UtcmVtb3ZlICIkcDAiICYmCisJZ2l0LWRpZmYtaW5kZXggLU0gLS1uYW1lLXN0YXR1cyBcCisJCSR0MCB8IHNlZCAtZSAncy9eUlswLTldKi9STlVNLycgPmN1cnJlbnQgJiYKKwlkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL25vLWZ1bm55ICJiL3RhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitzaW1pbGFyaXR5IGluZGV4IE5VTSUKK3JlbmFtZSBmcm9tIG5vLWZ1bm55CityZW5hbWUgdG8gInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgZGVsZXRlIHdpdGgtZnVubnknIFwKKwknZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHQwIHwKKwkgc2VkIC1lICJzL2luZGV4IFswLTldKiUvaW5kZXggTlVNJS8iID5jdXJyZW50ICYmCisJIGRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2htb2QgK3ggIiRwMSIKK2NhdCA+IGV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL25vLWZ1bm55ICJiL3RhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCitvbGQgbW9kZSAxMDA2NDQKK25ldyBtb2RlIDEwMDc1NQorc2ltaWxhcml0eSBpbmRleCBOVU0lCityZW5hbWUgZnJvbSBuby1mdW5ueQorcmVuYW1lIHRvICJ0YWJzXHQsXCIgKGRxKSBhbmQgc3BhY2VzIgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtZGlmZi10cmVlIGRlbGV0ZSB3aXRoLWZ1bm55JyBcCisJJ2dpdC1kaWZmLWluZGV4IC1NIC1wICR0MCB8CisJIHNlZCAtZSAicy9pbmRleCBbMC05XSolL2luZGV4IE5VTSUvIiA+Y3VycmVudCAmJgorCSBkaWZmIC11IGV4cGVjdGVkIGN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCisgInRhYnNcdCxcIiAoZHEpIGFuZCBzcGFjZXMiCisgMSBmaWxlcyBjaGFuZ2VkLCAwIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2dpdC1kaWZmLXRyZWUgcmVuYW1lIHdpdGgtZnVubnkgYXBwbGllZCcgXAorCSdnaXQtZGlmZi1pbmRleCAtTSAtcCAkdDAgfAorCSBnaXQtYXBwbHkgLS1zdGF0IHwgc2VkIC1lICJzL3wuKi8vIiAtZSAicy8gKlwkLy8iID5jdXJyZW50ICYmCisJIGRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKworY2F0ID4gZXhwZWN0ZWQgPDxcRU9GCisgbm8tZnVubnkKKyAidGFic1x0LFwiIChkcSkgYW5kIHNwYWNlcyIKKyAyIGZpbGVzIGNoYW5nZWQsIDMgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZ2l0LWRpZmYtdHJlZSBkZWxldGUgd2l0aC1mdW5ueSBhcHBsaWVkJyBcCisJJ2dpdC1kaWZmLWluZGV4IC1wICR0MCB8CisJIGdpdC1hcHBseSAtLXN0YXQgfCBzZWQgLWUgInMvfC4qLy8iIC1lICJzLyAqXCQvLyIgPmN1cnJlbnQgJiYKKwkgZGlmZiAtdSBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdnaXQtYXBwbHkgbm9uLWdpdCBkaWZmJyBcCisJJ2dpdC1kaWZmLWluZGV4IC1wICR0MCB8CisJIHNlZCAtbmUgIi9eWy0rQF0vcCIgfAorCSBnaXQtYXBwbHkgLS1zdGF0IHwgc2VkIC1lICJzL3wuKi8vIiAtZSAicy8gKlwkLy8iID5jdXJyZW50ICYmCisJIGRpZmYgLXUgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNDAwLXJlYmFzZS5zaCBiL3QvdDM0MDAtcmViYXNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5ZDMxMzEKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNDAwLXJlYmFzZS5zaApAQCAtMCwwICsxLDM0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCByZWJhc2Ugc2hvdWxkIG5vdCBkZXN0cm95IGF1dGhvciBpbmZvcm1hdGlvbgorCitUaGlzIHRlc3QgcnVucyBnaXQgcmViYXNlIGFuZCBjaGVja3MgdGhhdCB0aGUgYXV0aG9yIGluZm9ybWF0aW9uIGlzIG5vdCBsb3N0LgorJworLiAuL3Rlc3QtbGliLnNoCisKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPWJvZ3VzX2VtYWlsX2FkZHJlc3MKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVwb3NpdG9yeSB3aXRoIHRvcGljIGJyYW5jaCwgdGhlbiByZWJhc2UgYWdhaW5zdCBtYXN0ZXInIFwKKyAgICAnZWNobyBGaXJzdCA+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBBLiIgJiYKKyAgICAgZ2l0IGNoZWNrb3V0IC1iIG15LXRvcGljLWJyYW5jaCAmJgorICAgICBlY2hvIFNlY29uZCA+IEIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBCICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBCLiIgJiYKKyAgICAgZ2l0IGNoZWNrb3V0IC1mIG1hc3RlciAmJgorICAgICBlY2hvIFRoaXJkID4+IEEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCBBICYmCisgICAgIGdpdC1jb21taXQgLW0gIk1vZGlmeSBBLiIgJiYKKyAgICAgZ2l0IGNoZWNrb3V0IC1mIG15LXRvcGljLWJyYW5jaCAmJgorICAgICBnaXQgcmViYXNlIG1hc3RlcicKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ3RoZSByZWJhc2Ugb3BlcmF0aW9uIHNob3VsZCBub3QgaGF2ZSBkZXN0cm95ZWQgYXV0aG9yIGluZm9ybWF0aW9uJyBcCisgICAgJ2dpdCBsb2cgfCBncmVwICJBdXRob3I6IiB8IGdyZXAgIjw+IicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNDAxLXJlYmFzZS1wYXJ0aWFsLnNoIGIvdC90MzQwMS1yZWJhc2UtcGFydGlhbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNjBhNjcwCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzQwMS1yZWJhc2UtcGFydGlhbC5zaApAQCAtMCwwICsxLDY0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IFlhbm4gRGlyc29uLCBiYXNlZCBvbiB0MzQwMCBieSBBbW9zIFdhdGVybGFuZAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQgcmViYXNlIHNob3VsZCBkZXRlY3QgcGF0Y2hlcyBpbnRlZ3JhdGVkIHVwc3RyZWFtCisKK1RoaXMgdGVzdCBjaGVycnktcGlja3Mgb25lIGxvY2FsIGNoYW5nZSBvZiB0d28gaW50byBtYXN0ZXIgYnJhbmNoLCBhbmQKK2NoZWNrcyB0aGF0IGdpdCByZWJhc2Ugc3VjY2VlZHMgd2l0aCBvbmx5IHRoZSBzZWNvbmQgcGF0Y2ggaW4gdGhlCitsb2NhbCBicmFuY2guCisnCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVwb3NpdG9yeSB3aXRoIHRvcGljIGJyYW5jaCcgXAorICAgICdlY2hvIEZpcnN0ID4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEEuIiAmJgorCisgICAgIGdpdC1jaGVja291dCAtYiBteS10b3BpYy1icmFuY2ggJiYKKworICAgICBlY2hvIFNlY29uZCA+IEIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBCICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBCLiIgJiYKKworICAgICBlY2hvIEFub3RoZXJTZWNvbmQgPiBDICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQyAmJgorICAgICBnaXQtY29tbWl0IC1tICJBZGQgQy4iICYmCisKKyAgICAgZ2l0LWNoZWNrb3V0IC1mIG1hc3RlciAmJgorCisgICAgIGVjaG8gVGhpcmQgPj4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiTW9kaWZ5IEEuIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncGljayB0b3AgcGF0Y2ggZnJvbSB0b3BpYyBicmFuY2ggaW50byBtYXN0ZXInIFwKKyAgICAnZ2l0LWNoZXJyeS1waWNrIG15LXRvcGljLWJyYW5jaF4wICYmCisgICAgIGdpdC1jaGVja291dCAtZiBteS10b3BpYy1icmFuY2ggJiYKKyAgICAgZ2l0LWJyYW5jaCBtYXN0ZXItbWVyZ2UgbWFzdGVyICYmCisgICAgIGdpdC1icmFuY2ggbXktdG9waWMtYnJhbmNoLW1lcmdlIG15LXRvcGljLWJyYW5jaAorJworCit0ZXN0X2RlYnVnIFwKKyAgICAnZ2l0LWNoZXJyeSBtYXN0ZXIgJiYKKyAgICAgZ2l0LWZvcm1hdC1wYXRjaCAtayAtLXN0ZG91dCAtLWZ1bGwtaW5kZXggbWFzdGVyID4vZGV2L251bGwgJiYKKyAgICAgZ2l0ayAtLWFsbCAmIHNsZWVwIDEKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3JlYmFzZSB0b3BpYyBicmFuY2ggYWdhaW5zdCBuZXcgbWFzdGVyIGFuZCBjaGVjayBnaXQtYW0gZGlkIG5vdCBnZXQgaGFsdGVkJyBcCisgICAgJ2dpdC1yZWJhc2UgbWFzdGVyICYmIHRlc3QgISAtZCAuZG90ZXN0JworCitpZiB0ZXN0IC16ICIkbm9fcHl0aG9uIgordGhlbgorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCSdyZWJhc2UgLS1tZXJnZSB0b3BpYyBicmFuY2ggdGhhdCB3YXMgcGFydGlhbGx5IG1lcmdlZCB1cHN0cmVhbScgXAorCSdnaXQtY2hlY2tvdXQgLWYgbXktdG9waWMtYnJhbmNoLW1lcmdlICYmCisJIGdpdC1yZWJhc2UgLS1tZXJnZSBtYXN0ZXItbWVyZ2UgJiYKKwkgdGVzdCAhIC1kIC5naXQvLmRvdGVzdC1tZXJnZScKK2ZpCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwMi1yZWJhc2UtbWVyZ2Uuc2ggYi90L3QzNDAyLXJlYmFzZS1tZXJnZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMzRjNmNmCi0tLSAvZGV2L251bGwKKysrIGIvdC90MzQwMi1yZWJhc2UtbWVyZ2Uuc2gKQEAgLTAsMCArMSwxMTIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHJlYmFzZSAtLW1lcmdlIHRlc3QnCisKKy4gLi90ZXN0LWxpYi5zaAorCitpZiB0ZXN0ICIkbm9fcHl0aG9uIjsgdGhlbgorCWVjaG8gIlNraXBwaW5nOiBubyBweXRob24gPT4gbm8gcmVjdXJzaXZlIG1lcmdlIgorCXRlc3RfZG9uZQorCWV4aXQgMAorZmkKKworVD0iQSBxdWljayBicm93biBmb3gKK2p1bXBzIG92ZXIgdGhlIGxhenkgZG9nLiIKK2ZvciBpIGluIDEgMiAzIDQgNSA2IDcgOCA5IDEwCitkbworCWVjaG8gIiRpICRUIgorZG9uZSA+b3JpZ2luYWwKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZ2l0IGFkZCBvcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLW0iaW5pdGlhbCIgJiYKKwlnaXQgYnJhbmNoIHNpZGUgJiYKKwllY2hvICIxMSAkVCIgPj5vcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLWEgLW0ibWFzdGVyIHVwZGF0ZXMgYSBiaXQuIiAmJgorCisJZWNobyAiMTIgJFQiID4+b3JpZ2luYWwgJiYKKwlnaXQgY29tbWl0IC1hIC1tIm1hc3RlciB1cGRhdGVzIGEgYml0IG1vcmUuIiAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwkoZWNobyAiMCAkVCIgOyBjYXQgb3JpZ2luYWwpID5yZW5hbWVkICYmCisJZ2l0IGFkZCByZW5hbWVkICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWZvcmNlLXJlbW92ZSBvcmlnaW5hbCAmJgorCWdpdCBjb21taXQgLWEgLW0ic2lkZSByZW5hbWVzIGFuZCBlZGl0cy4iICYmCisKKwl0ciAiW2Etel0iICJbQS1aXSIgPG9yaWdpbmFsID5uZXdmaWxlICYmCisJZ2l0IGFkZCBuZXdmaWxlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSJzaWRlIGVkaXRzIGZ1cnRoZXIuIiAmJgorCisJdHIgIlthLW1dIiAiW0EtTV0iIDxvcmlnaW5hbCA+bmV3ZmlsZSAmJgorCXJtIC1mIG9yaWdpbmFsICYmCisJZ2l0IGNvbW1pdCAtYSAtbSJzaWRlIGVkaXRzIG9uY2UgYWdhaW4uIiAmJgorCisJZ2l0IGJyYW5jaCB0ZXN0LXJlYmFzZSBzaWRlICYmCisJZ2l0IGJyYW5jaCB0ZXN0LXJlYmFzZS1waWNrIHNpZGUgJiYKKwlnaXQgYnJhbmNoIHRlc3QtcmVmZXJlbmNlLXBpY2sgc2lkZSAmJgorCWdpdCBjaGVja291dCAtYiB0ZXN0LW1lcmdlIHNpZGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncmVmZXJlbmNlIG1lcmdlJyAnCisJZ2l0IG1lcmdlIC1zIHJlY3Vyc2l2ZSAicmVmZXJlbmNlIG1lcmdlIiBIRUFEIG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHJlYmFzZSAnCisJZ2l0IGNoZWNrb3V0IHRlc3QtcmViYXNlICYmCisJZ2l0IHJlYmFzZSAtLW1lcmdlIG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZSBhbmQgcmViYXNlIHNob3VsZCBtYXRjaCcgJworCWdpdCBkaWZmLXRyZWUgLXIgdGVzdC1yZWJhc2UgdGVzdC1tZXJnZSA+ZGlmZmVyZW5jZSAmJgorCWlmIHRlc3QgLXMgZGlmZmVyZW5jZQorCXRoZW4KKwkJY2F0IGRpZmZlcmVuY2UKKwkJKGV4aXQgMSkKKwllbHNlCisJCWVjaG8gaGFwcHkKKwlmaQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgdGhlIG90aGVyIHdheScgJworCWdpdCByZXNldCAtLWhhcmQgbWFzdGVyICYmCisJZ2l0IHJlYmFzZSAtLW1lcmdlIHNpZGUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UgYW5kIHJlYmFzZSBzaG91bGQgbWF0Y2gnICcKKwlnaXQgZGlmZi10cmVlIC1yIHRlc3QtcmViYXNlIHRlc3QtbWVyZ2UgPmRpZmZlcmVuY2UgJiYKKwlpZiB0ZXN0IC1zIGRpZmZlcmVuY2UKKwl0aGVuCisJCWNhdCBkaWZmZXJlbmNlCisJCShleGl0IDEpCisJZWxzZQorCQllY2hvIGhhcHB5CisJZmkKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncGlja2luZyByZWJhc2UnICcKKwlnaXQgcmVzZXQgLS1oYXJkIHNpZGUgJiYKKwlnaXQgcmViYXNlIC0tbWVyZ2UgLS1vbnRvIG1hc3RlciBzaWRlXl4gJiYKKwltYj0kKGdpdCBtZXJnZS1iYXNlIG1hc3RlciBIRUFEKSAmJgorCWlmIHRlc3QgIiRtYiIgPSAiJChnaXQgcmV2LXBhcnNlIG1hc3RlcikiCisJdGhlbgorCQllY2hvIGhhcHB5CisJZWxzZQorCQlnaXQgc2hvdy1icmFuY2gKKwkJKGV4aXQgMSkKKwlmaSAmJgorCWY9JChnaXQgZGlmZi10cmVlIC0tbmFtZS1vbmx5IEhFQUReIEhFQUQpICYmCisJZz0kKGdpdCBkaWZmLXRyZWUgLS1uYW1lLW9ubHkgSEVBRF5eIEhFQUReKSAmJgorCWNhc2UgIiRmLCRnIiBpbgorCW5ld2ZpbGUsbmV3ZmlsZSkKKwkJZWNobyBoYXBweSA7OworCSopCisJCWVjaG8gIiRmIgorCQllY2hvICIkZyIKKwkJKGV4aXQgMSkKKwllc2FjCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90MzQwMy1yZWJhc2Utc2tpcC5zaCBiL3QvdDM0MDMtcmViYXNlLXNraXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGFiNjNjNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM0MDMtcmViYXNlLXNraXAuc2gKQEAgLTAsMCArMSw2MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0IHJlYmFzZSAtLW1lcmdlIC0tc2tpcCB0ZXN0cycKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgd2UgYXNzdW1lIHRoZSBkZWZhdWx0IGdpdC1hbSAtMyAtLXNraXAgc3RyYXRlZ3kgaXMgdGVzdGVkIGluZGVwZW5kZW50bHkKKyMgYW5kIGFsd2F5cyB3b3JrcyA6KQorCitpZiB0ZXN0ICIkbm9fcHl0aG9uIjsgdGhlbgorCWVjaG8gIlNraXBwaW5nOiBubyBweXRob24gPT4gbm8gcmVjdXJzaXZlIG1lcmdlIgorCXRlc3RfZG9uZQorCWV4aXQgMAorZmkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJZWNobyBoZWxsbyA+IGhlbGxvICYmCisJZ2l0IGFkZCBoZWxsbyAmJgorCWdpdCBjb21taXQgLW0gImhlbGxvIiAmJgorCWdpdCBicmFuY2ggc2tpcC1yZWZlcmVuY2UgJiYKKworCWVjaG8gd29ybGQgPj4gaGVsbG8gJiYKKwlnaXQgY29tbWl0IC1hIC1tICJoZWxsbyB3b3JsZCIgJiYKKwllY2hvIGdvb2RieWUgPj4gaGVsbG8gJiYKKwlnaXQgY29tbWl0IC1hIC1tICJnb29kYnllIiAmJgorCisJZ2l0IGNoZWNrb3V0IC1mIHNraXAtcmVmZXJlbmNlICYmCisJZWNobyBtb28gPiBoZWxsbyAmJgorCWdpdCBjb21taXQgLWEgLW0gIndlIHNob3VsZCBza2lwIHRoaXMiICYmCisJZWNobyBtb28gPiBjb3cgJiYKKwlnaXQgYWRkIGNvdyAmJgorCWdpdCBjb21taXQgLW0gInRoaXMgc2hvdWxkIG5vdCBiZSBza2lwcGVkIiAmJgorCWdpdCBicmFuY2ggcHJlLXJlYmFzZSBza2lwLXJlZmVyZW5jZSAmJgorCWdpdCBicmFuY2ggc2tpcC1tZXJnZSBza2lwLXJlZmVyZW5jZQorCScKKwordGVzdF9leHBlY3RfZmFpbHVyZSAncmViYXNlIHdpdGggZ2l0IGFtIC0zIChkZWZhdWx0KScgJ2dpdCByZWJhc2UgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdyZWJhc2UgLS1za2lwIHdpdGggYW0gLTMnICcKKwlnaXQgcmVzZXQgLS1oYXJkIEhFQUQgJiYKKwlnaXQgcmViYXNlIC0tc2tpcAorCScKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NoZWNrb3V0IHNraXAtbWVyZ2UnICdnaXQgY2hlY2tvdXQgLWYgc2tpcC1tZXJnZScKKwordGVzdF9leHBlY3RfZmFpbHVyZSAncmViYXNlIHdpdGggLS1tZXJnZScgJ2dpdCByZWJhc2UgLS1tZXJnZSBtYXN0ZXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3JlYmFzZSAtLXNraXAgd2l0aCAtLW1lcmdlJyAnCisJZ2l0IHJlc2V0IC0taGFyZCBIRUFEICYmCisJZ2l0IHJlYmFzZSAtLXNraXAKKwknCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlIGFuZCByZWZlcmVuY2UgdHJlZXMgZXF1YWwnIFwKKwkndGVzdCAteiAiYGdpdC1kaWZmLXRyZWUgc2tpcC1tZXJnZSBza2lwLXJlZmVyZW5jZWAiJworCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsICYgc2xlZXAgMScKKwordGVzdF9kb25lCisKZGlmZiAtLWdpdCBhL3QvdDM1MDAtY2hlcnJ5LnNoIGIvdC90MzUwMC1jaGVycnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTgzYmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDM1MDAtY2hlcnJ5LnNoCkBAIC0wLDAgKzEsNTQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgWWFubiBEaXJzb24sIGJhc2VkIG9uIHQzNDAwIGJ5IEFtb3MgV2F0ZXJsYW5kCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1jaGVycnkgc2hvdWxkIGRldGVjdCBwYXRjaGVzIGludGVncmF0ZWQgdXBzdHJlYW0KKworVGhpcyB0ZXN0IGNoZXJyeS1waWNrcyBvbmUgbG9jYWwgY2hhbmdlIG9mIHR3byBpbnRvIG1hc3RlciBicmFuY2gsIGFuZAorY2hlY2tzIHRoYXQgZ2l0LWNoZXJyeSBvbmx5IHJldHVybnMgdGhlIHNlY29uZCBwYXRjaCBpbiB0aGUgbG9jYWwgYnJhbmNoCisnCisuIC4vdGVzdC1saWIuc2gKKworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Ym9ndXNfZW1haWxfYWRkcmVzcworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSByZXBvc2l0b3J5IHdpdGggdG9waWMgYnJhbmNoLCBhbmQgY2hlY2sgY2hlcnJ5IGZpbmRzIHRoZSAyIHBhdGNoZXMgZnJvbSB0aGVyZScgXAorICAgICdlY2hvIEZpcnN0ID4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiQWRkIEEuIiAmJgorCisgICAgIGdpdC1jaGVja291dCAtYiBteS10b3BpYy1icmFuY2ggJiYKKworICAgICBlY2hvIFNlY29uZCA+IEIgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBCICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBCLiIgJiYKKworICAgICBzbGVlcCAyICYmCisgICAgIGVjaG8gQW5vdGhlclNlY29uZCA+IEMgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBDICYmCisgICAgIGdpdC1jb21taXQgLW0gIkFkZCBDLiIgJiYKKworICAgICBnaXQtY2hlY2tvdXQgLWYgbWFzdGVyICYmCisgICAgIHJtIC1mIEIgQyAmJgorCisgICAgIGVjaG8gVGhpcmQgPj4gQSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IEEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAiTW9kaWZ5IEEuIiAmJgorCisgICAgIGV4cHIgIiQoZWNobyAkKGdpdC1jaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCkgKSIgOiAiKyBbXiBdKiArIC4qIgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY2hlY2sgdGhhdCBjaGVycnkgd2l0aCBsaW1pdCByZXR1cm5zIG9ubHkgdGhlIHRvcCBwYXRjaCdcCisgICAgJ2V4cHIgIiQoZWNobyAkKGdpdC1jaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCBteS10b3BpYy1icmFuY2heMSkgKSIgOiAiKyBbXiBdKiIKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZXJyeS1waWNrIG9uZSBvZiB0aGUgMiBwYXRjaGVzLCBhbmQgY2hlY2sgY2hlcnJ5IHJlY29nbml6ZWQgb25lIGFuZCBvbmx5IG9uZSBhcyBuZXcnIFwKKyAgICAnZ2l0LWNoZXJyeS1waWNrIG15LXRvcGljLWJyYW5jaF4wICYmCisgICAgIGVjaG8gJChnaXQtY2hlcnJ5IG1hc3RlciBteS10b3BpYy1icmFuY2gpICYmCisgICAgIGV4cHIgIiQoZWNobyAkKGdpdC1jaGVycnkgbWFzdGVyIG15LXRvcGljLWJyYW5jaCkgKSIgOiAiKyBbXiBdKiAtIC4qIgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDM2MDAtcm0uc2ggYi90L3QzNjAwLXJtLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIwMWQxNjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNjAwLXJtLnNoCkBAIC0wLDAgKzEsODcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgQ2FybCBELiBXb3J0aAorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IG9mIHRoZSB2YXJpb3VzIG9wdGlvbnMgdG8gZ2l0LXJtLicKKworLiAuL3Rlc3QtbGliLnNoCisKKyMgU2V0dXAgc29tZSBmaWxlcyB0byBiZSByZW1vdmVkLCBzb21lIHdpdGggZnVubnkgY2hhcmFjdGVycwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ0luaXRpYWxpemUgdGVzdCBkaXJlY3RvcnknIFwKKyAgICAidG91Y2ggLS0gZm9vIGJhciBiYXogJ3NwYWNlIGVtYmVkZGVkJyAtcSAmJgorICAgICBnaXQtYWRkIC0tIGZvbyBiYXIgYmF6ICdzcGFjZSBlbWJlZGRlZCcgLXEgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSAnYWRkIG5vcm1hbCBmaWxlcycgJiYKKyAgICAgdGVzdF90YWJzPXkgJiYKKyAgICAgaWYgdG91Y2ggLS0gJ3RhYgllbWJlZGRlZCcgJ25ld2xpbmUKK2VtYmVkZGVkJworICAgICB0aGVuCisgICAgIGdpdC1hZGQgLS0gJ3RhYgllbWJlZGRlZCcgJ25ld2xpbmUKK2VtYmVkZGVkJyAmJgorICAgICBnaXQtY29tbWl0IC1tICdhZGQgZmlsZXMgd2l0aCB0YWJzIGFuZCBuZXdsaW5lcycKKyAgICAgZWxzZQorICAgICAgICAgc2F5ICdZb3VyIGZpbGVzeXN0ZW0gZG9lcyBub3QgYWxsb3cgdGFicyBpbiBmaWxlbmFtZXMuJworICAgICAgICAgdGVzdF90YWJzPW4KKyAgICAgZmkiCisKKyMgTGF0ZXIgd2Ugd2lsbCB0cnkgcmVtb3ZpbmcgYW4gdW5yZW1vdmFibGUgcGF0aCB0byBtYWtlIHN1cmUKKyMgZ2l0LXJtIGJhcmZzLCBidXQgaWYgdGhlIHRlc3QgaXMgcnVuIGFzIHJvb3QgdGhhdCBjYW5ub3QgYmUKKyMgYXJyYW5nZWQuCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnRGV0ZXJtaW5lIHJtIGJlaGF2aW9yJyBcCisgICAgJzogPnRlc3QtZmlsZQorICAgICBjaG1vZCBhLXcgLgorICAgICBybSAtZiB0ZXN0LWZpbGUKKyAgICAgdGVzdCAtZiB0ZXN0LWZpbGUgJiYgdGVzdF9mYWlsZWRfcmVtb3ZlPXkKKyAgICAgY2htb2QgNzc1IC4KKyAgICAgcm0gLWYgdGVzdC1maWxlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUHJlLWNoZWNrIHRoYXQgZm9vIGV4aXN0cyBhbmQgaXMgaW4gaW5kZXggYmVmb3JlIGdpdC1ybSBmb28nIFwKKyAgICAnWyAtZiBmb28gXSAmJiBnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCBnaXQtcm0gZm9vIHN1Y2NlZWRzJyBcCisgICAgJ2dpdC1ybSBmb28nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdQb3N0LWNoZWNrIHRoYXQgZm9vIGV4aXN0cyBidXQgaXMgbm90IGluIGluZGV4IGFmdGVyIGdpdC1ybSBmb28nIFwKKyAgICAnWyAtZiBmb28gXSAmJiAhIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggZm9vJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUHJlLWNoZWNrIHRoYXQgYmFyIGV4aXN0cyBhbmQgaXMgaW4gaW5kZXggYmVmb3JlICJnaXQtcm0gLWYgYmFyIicgXAorICAgICdbIC1mIGJhciBdICYmIGdpdC1scy1maWxlcyAtLWVycm9yLXVubWF0Y2ggYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCB0aGF0ICJnaXQtcm0gLWYgYmFyIiBzdWNjZWVkcycgXAorICAgICdnaXQtcm0gLWYgYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnUG9zdC1jaGVjayB0aGF0IGJhciBkb2VzIG5vdCBleGlzdCBhbmQgaXMgbm90IGluIGluZGV4IGFmdGVyICJnaXQtcm0gLWYgYmFyIicgXAorICAgICchIFsgLWYgYmFyIF0gJiYgISBnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCAiZ2l0LXJtIC0tIC1xIiBzdWNjZWVkcyAocmVtb3ZlIGEgZmlsZSB0aGF0IGxvb2tzIGxpa2UgYW4gb3B0aW9uKScgXAorICAgICdnaXQtcm0gLS0gLXEnCisKK3Rlc3QgIiR0ZXN0X3RhYnMiID0geSAmJiB0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAiVGVzdCB0aGF0IFwiZ2l0LXJtIC1mXCIgc3VjY2VlZHMgd2l0aCBlbWJlZGRlZCBzcGFjZSwgdGFiLCBvciBuZXdsaW5lIGNoYXJhY3RlcnMuIiBcCisgICAgImdpdC1ybSAtZiAnc3BhY2UgZW1iZWRkZWQnICd0YWIJZW1iZWRkZWQnICduZXdsaW5lCitlbWJlZGRlZCciCisKK2lmIHRlc3QgIiR0ZXN0X2ZhaWxlZF9yZW1vdmUiID0geTsgdGhlbgorY2htb2QgYS13IC4KK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdUZXN0IHRoYXQgImdpdC1ybSAtZiIgZmFpbHMgaWYgaXRzIHJtIGZhaWxzJyBcCisgICAgJ2dpdC1ybSAtZiBiYXonCitjaG1vZCA3NzUgLgorZWxzZQorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NraXBwaW5nIHJlbW92YWwgZmFpbHVyZSAocGVyaGFwcyBydW5uaW5nIGFzIHJvb3Q/KScgOgorZmkKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1doZW4gdGhlIHJtIGluICJnaXQtcm0gLWYiIGZhaWxzLCBpdCBzaG91bGQgbm90IHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBpbmRleCcgXAorICAgICdnaXQtbHMtZmlsZXMgLS1lcnJvci11bm1hdGNoIGJheicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzNzAwLWFkZC5zaCBiL3QvdDM3MDAtYWRkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjZDA1YzMKLS0tIC9kZXYvbnVsbAorKysgYi90L3QzNzAwLWFkZC5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IENhcmwgRC4gV29ydGgKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBvZiBnaXQtYWRkLCBpbmNsdWRpbmcgdGhlIC0tIG9wdGlvbi4nCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnVGVzdCBvZiBnaXQtYWRkJyBcCisgICAgJ3RvdWNoIGZvbyAmJiBnaXQtYWRkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Bvc3QtY2hlY2sgdGhhdCBmb28gaXMgaW4gdGhlIGluZGV4JyBcCisgICAgJ2dpdC1scy1maWxlcyBmb28gfCBncmVwIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1Rlc3QgdGhhdCAiZ2l0LWFkZCAtLSAtcSIgd29ya3MnIFwKKyAgICAndG91Y2ggLS0gLXEgJiYgZ2l0LWFkZCAtLSAtcScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3QzODAwLW1rdGFnLnNoIGIvdC90MzgwMC1ta3RhZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjIzYjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90MzgwMC1ta3RhZy5zaApAQCAtMCwwICsxLDIyNyBAQAorIyEvYmluL3NoCisjCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1ta3RhZzogdGFnIG9iamVjdCB2ZXJpZnkgdGVzdCcKKworLiAuL3Rlc3QtbGliLnNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNoZWNrIHRoZSB0YWcuc2lnIGZpbGUsIGV4cGVjdGluZyB2ZXJpZnlfdGFnKCkgdG8gZmFpbCwKKyMgYW5kIGNoZWNraW5nIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgbWF0Y2hlcyB0aGUgcGF0dGVybgorIyBnaXZlbiBpbiB0aGUgZXhwZWN0LnBhdCBmaWxlLgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAoKSB7CisgICAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICAgICIkMSIgXAorICAgICAgICAnZ2l0LW1rdGFnIDx0YWcuc2lnIDI+bWVzc2FnZSB8fAorICAgICAgICAgZWdyZXAgLXEgLWYgZXhwZWN0LnBhdCBtZXNzYWdlJworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmaXJzdCBjcmVhdGUgYSBjb21taXQsIHNvIHdlIGhhdmUgYSB2YWxpZCBvYmplY3QvdHlwZQorIyBmb3IgdGhlIHRhZy4KK2VjaG8gSGVsbG8gPkEKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgQQorZ2l0LWNvbW1pdCAtbSAiSW5pdGlhbCBjb21taXQiCitoZWFkPSQoZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDEuIGxlbmd0aCBjaGVjaworCitjYXQgPnRhZy5zaWcgPDxFT0YKK3RvbyBzaG9ydCBmb3IgYSB0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogLipzaXplIHdyb25nLiokCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ1RhZyBvYmplY3QgbGVuZ3RoIGNoZWNrJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDIuIG9iamVjdCBsaW5lIGxhYmVsIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgoreHh4eHh4IDEzOWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnCit0YWcgbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjA6IC4qIm9iamVjdCAiJAorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcib2JqZWN0IiBsaW5lIGxhYmVsIGNoZWNrJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDMuIG9iamVjdCBsaW5lIFNIQTEgY2hlY2sKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3Qgeno5ZTliMzM5ODZiMWMyNjcwZmZmNTJjNTA2NzYwMzExN2IzZTg5NQordHlwZSB0YWcKK3RhZyBteXRhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyNzogLipTSEExIGhhc2gkCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJyJvYmplY3QiIGxpbmUgU0hBMSBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICA0LiB0eXBlIGxpbmUgbGFiZWwgY2hlY2sKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgNzc5ZTliMzM5ODZiMWMyNjcwZmZmNTJjNTA2NzYwMzExN2IzZTg5NQoreHh4eCB0YWcKK3RhZyBteXRhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyNDc6IC4qIltcXW50eXBlICIkCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJyJ0eXBlIiBsaW5lIGxhYmVsIGNoZWNrJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDUuIHR5cGUgbGluZSBlb2wgY2hlY2sKKworZWNobyAib2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUiID50YWcuc2lnCitlY2hvIC1uICJ0eXBlIHRhZ3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3MiID4+dGFnLnNpZworCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjQ4OiAuKiJbXF1uIiQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInR5cGUiIGxpbmUgZW9sIGNoZWNrJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDYuIHRhZyBsaW5lIGxhYmVsIGNoZWNrICMxCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnCit4eHggbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjU3OiBubyAidGFnICIgZm91bmQkCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJyJ0YWciIGxpbmUgbGFiZWwgY2hlY2sgIzEnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgNy4gdGFnIGxpbmUgbGFiZWwgY2hlY2sgIzIKKworY2F0ID50YWcuc2lnIDw8RU9GCitvYmplY3QgNzc5ZTliMzM5ODZiMWMyNjcwZmZmNTJjNTA2NzYwMzExN2IzZTg5NQordHlwZSB0YWdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cKK3RhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyODc6IG5vICJ0YWcgIiBmb3VuZCQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInRhZyIgbGluZSBsYWJlbCBjaGVjayAjMicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICA4LiB0eXBlIGxpbmUgdHlwZS1uYW1lIGxlbmd0aCBjaGVjaworCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCA3NzllOWIzMzk4NmIxYzI2NzBmZmY1MmM1MDY3NjAzMTE3YjNlODk1Cit0eXBlIHRhZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZwordGFnIG15dGFnCitFT0YKKworY2F0ID5leHBlY3QucGF0IDw8RU9GCiteZXJyb3I6IGNoYXI1MzogdHlwZSB0b28gbG9uZyQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInR5cGUiIGxpbmUgdHlwZS1uYW1lIGxlbmd0aCBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICA5LiB2ZXJpZnkgb2JqZWN0IChTSEExL3R5cGUpIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0IDc3OWU5YjMzOTg2YjFjMjY3MGZmZjUyYzUwNjc2MDMxMTdiM2U4OTUKK3R5cGUgdGFnZ2dnCit0YWcgbXl0YWcKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjc6IGNvdWxkIG5vdCB2ZXJpZnkgb2JqZWN0LiokCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ3ZlcmlmeSBvYmplY3QgKFNIQTEvdHlwZSkgY2hlY2snCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxMC4gdmVyaWZ5IHRhZy1uYW1lIGNoZWNrCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15CXRhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyNjc6IGNvdWxkIG5vdCB2ZXJpZnkgdGFnIG5hbWUkCitFT0YKKworY2hlY2tfdmVyaWZ5X2ZhaWx1cmUgJ3ZlcmlmeSB0YWctbmFtZSBjaGVjaycKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDExLiB0YWdnZXIgbGluZSBsYWJsZSBjaGVjayAjMQorCitjYXQgPnRhZy5zaWcgPDxFT0YKK29iamVjdCAkaGVhZAordHlwZSBjb21taXQKK3RhZyBteXRhZworRU9GCisKK2NhdCA+ZXhwZWN0LnBhdCA8PEVPRgorXmVycm9yOiBjaGFyNzA6IGNvdWxkIG5vdCBmaW5kICJ0YWdnZXIiJAorRU9GCisKK2NoZWNrX3ZlcmlmeV9mYWlsdXJlICcidGFnZ2VyIiBsaW5lIGxhYmVsIGNoZWNrICMxJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTIuIHRhZ2dlciBsaW5lIGxhYmxlIGNoZWNrICMyCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIKK0VPRgorCitjYXQgPmV4cGVjdC5wYXQgPDxFT0YKK15lcnJvcjogY2hhcjcwOiBjb3VsZCBub3QgZmluZCAidGFnZ2VyIiQKK0VPRgorCitjaGVja192ZXJpZnlfZmFpbHVyZSAnInRhZ2dlciIgbGluZSBsYWJlbCBjaGVjayAjMicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDEzLiBjcmVhdGUgdmFsaWQgdGFnCisKK2NhdCA+dGFnLnNpZyA8PEVPRgorb2JqZWN0ICRoZWFkCit0eXBlIGNvbW1pdAordGFnIG15dGFnCit0YWdnZXIgYW5vdGhlckBleGFtcGxlLmNvbQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGUgdmFsaWQgdGFnJyBcCisgICAgJ2dpdC1ta3RhZyA8dGFnLnNpZyA+LmdpdC9yZWZzL3RhZ3MvbXl0YWcgMj5tZXNzYWdlJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgMTQuIGNoZWNrIG15dGFnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVjayBteXRhZycgXAorICAgICdnaXQtdGFnIC1sIHwgZ3JlcCBteXRhZycKKworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDAtZGlmZi1mb3JtYXQuc2ggYi90L3Q0MDAwLWRpZmYtZm9ybWF0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3Yjk2ODEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDAwLWRpZmYtZm9ybWF0LnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBidWlsdC1pbiBkaWZmIG91dHB1dCBlbmdpbmUuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaAorCitlY2hvID5wYXRoMCAnTGluZSAxCitMaW5lIDIKK2xpbmUgMycKK2NhdCBwYXRoMCA+cGF0aDEKK2NobW9kICt4IHBhdGgxCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1cGRhdGUtY2FjaGUgLS1hZGQgdHdvIGZpbGVzIHdpdGggYW5kIHdpdGhvdXQgK3guJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAgcGF0aDEnCisKK212IHBhdGgwIHBhdGgwLQorc2VkIC1lICdzL2xpbmUvTGluZS8nIDxwYXRoMC0gPnBhdGgwCitjaG1vZCAreCBwYXRoMAorcm0gLWYgcGF0aDEKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdnaXQtZGlmZi1maWxlcyAtcCBhZnRlciBlZGl0aW5nIHdvcmsgdHJlZS4nIFwKKyAgICAnZ2l0LWRpZmYtZmlsZXMgLXAgPmN1cnJlbnQnCisKKyMgdGhhdCdzIGFzIGZhciBhcyBpdCBjb21lcworaWYgWyAiJChnaXQgcmVwby1jb25maWcgLS1nZXQgY29yZS5maWxlbW9kZSkiID0gZmFsc2UgXQordGhlbgorCXNheSAnZmlsZW1vZGUgZGlzYWJsZWQgb24gdGhlIGZpbGVzeXN0ZW0nCisJdGVzdF9kb25lCitmaQorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL3BhdGgwIGIvcGF0aDAKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CistLS0gYS9wYXRoMAorKysrIGIvcGF0aDAKK0BAIC0xLDMgKzEsMyBAQAorIExpbmUgMQorIExpbmUgMgorLWxpbmUgMworK0xpbmUgMworZGlmZiAtLWdpdCBhL3BhdGgxIGIvcGF0aDEKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQorLS0tIGEvcGF0aDEKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLUxpbmUgMQorLUxpbmUgMgorLWxpbmUgMworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBnaXQtZGlmZi1maWxlcyAtcCBvdXRwdXQuJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDEtZGlmZi1yZW5hbWUuc2ggYi90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlM2MyMGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDAxLWRpZmYtcmVuYW1lLnNoCkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCByZW5hbWUgZGV0ZWN0aW9uIGluIGRpZmYgZW5naW5lLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKworZWNobyA+cGF0aDAgJ0xpbmUgMQorTGluZSAyCitMaW5lIDMKK0xpbmUgNAorTGluZSA1CitMaW5lIDYKK0xpbmUgNworTGluZSA4CitMaW5lIDkKK0xpbmUgMTAKK2xpbmUgMTEKK0xpbmUgMTIKK0xpbmUgMTMKK0xpbmUgMTQKK0xpbmUgMTUKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3VwZGF0ZS1jYWNoZSAtLWFkZCBhIGZpbGUuJyBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd3cml0ZSB0aGF0IHRyZWUuJyBcCisgICAgJ3RyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYgZWNobyAkdHJlZScKKworc2VkIC1lICdzL2xpbmUvTGluZS8nIDxwYXRoMCA+cGF0aDEKK3JtIC1mIHBhdGgwCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVuYW1lZCBhbmQgZWRpdGVkIHRoZSBmaWxlLicgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIHBhdGgwIHBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLXAgLU0gYWZ0ZXIgcmVuYW1lIGFuZCBlZGl0aW5nLicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtcCAtTSAkdHJlZSA+Y3VycmVudCcKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvcGF0aDAgYi9wYXRoMQorcmVuYW1lIGZyb20gcGF0aDAKK3JlbmFtZSB0byBwYXRoMQorLS0tIGEvcGF0aDAKKysrKyBiL3BhdGgxCitAQCAtOCw3ICs4LDcgQEAgTGluZSA3CisgTGluZSA4CisgTGluZSA5CisgTGluZSAxMAorLWxpbmUgMTEKKytMaW5lIDExCisgTGluZSAxMgorIExpbmUgMTMKKyBMaW5lIDE0CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSBvdXRwdXQuJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDItZGlmZi1iYXNpYy5zaCBiL3QvdDQwMDItZGlmZi1iYXNpYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NmVkYTYzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwMi1kaWZmLWJhc2ljLnNoCkBAIC0wLDAgKzEsMjQ3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgZGlmZiByYXctb3V0cHV0LgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vbGliLXJlYWQtdHJlZS1tLTN3YXkuc2gKKworY2F0ID4udGVzdC1wbGFpbi1PQSA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgY2NiYTcyYWQzODg4YTM1MjBiMzllZmNmNzgwYjllZTY0MTY3NTM1ZCBBCUFBCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDdlNDI2ZmIwNzk0NzlmZDY3ZjZkODFmOTg0ZTRlYzY0OWE0NGJjMjUgQQlBTgorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmQ1MGY2NWQzYmRhYjkxYzYzNDQ0Mjk0ZDM4ZjA4YWVmZjMyOGU0MiBBCURGCis6MTAwNjQ0IDAwMDAwMCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlETQorOjEwMDY0NCAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJRE4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMWQ0MTEyMmViZGQ3YTY0MGYyOWQzYzljYzRmOWQ3MDA5NDM3NDc2MiBBCUxMCis6MTAwNjQ0IDEwMDY0NCAwM2YyNGM4YzQ3MDBiYWJjY2ZkMjhiNjU0ZTdlOGVhYzQwMmFkNmNkIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgTQlNRAorOjEwMDY0NCAxMDA2NDQgYjI1ODUwOGFmYjdjZWI0NDk5ODFiZDlkNjNkMmQzZTk3MWJmOGQzNCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGJkMDg0YjBjMjdjN2I2Y2MzNGYxMWQ2ZDA1MDlhMjliZTNjYWY5NzAgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBNCU1OCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIE0JVFQKKzowNDAwMDAgMDQwMDAwIDdkNjcwZmRjZGI5OTI5ZjZjN2RhYzE5NmZmNzg2ODljZDFjNTY2YTEgNWU1ZjIyMDcyYmIzOWY2ZTEyY2Y2NjNhNTdjYjYzNGM3NmVlZmI0OSBNCVoKK0VPRgorCitjYXQgPi50ZXN0LXJlY3Vyc2l2ZS1PQSA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgY2NiYTcyYWQzODg4YTM1MjBiMzllZmNmNzgwYjllZTY0MTY3NTM1ZCBBCUFBCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDdlNDI2ZmIwNzk0NzlmZDY3ZjZkODFmOTg0ZTRlYzY0OWE0NGJjMjUgQQlBTgorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNjhhNmQ4YjkxZGExMTA0NWNmNGFhM2E1YWI5ZjJhNzgxYzcwMTI0OSBBCURGL0RGCis6MTAwNjQ0IDAwMDAwMCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlETQorOjEwMDY0NCAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJRE4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMWQ0MTEyMmViZGQ3YTY0MGYyOWQzYzljYzRmOWQ3MDA5NDM3NDc2MiBBCUxMCis6MTAwNjQ0IDEwMDY0NCAwM2YyNGM4YzQ3MDBiYWJjY2ZkMjhiNjU0ZTdlOGVhYzQwMmFkNmNkIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgTQlNRAorOjEwMDY0NCAxMDA2NDQgYjI1ODUwOGFmYjdjZWI0NDk5ODFiZDlkNjNkMmQzZTk3MWJmOGQzNCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGJkMDg0YjBjMjdjN2I2Y2MzNGYxMWQ2ZDA1MDlhMjliZTNjYWY5NzAgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBNCU1OCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIE0JVFQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgOGFjYjhlOTc1MGUzZjY0NGJmMzIzZmNmM2QzMzg4NDlkYjEwNmM3NyBBCVovQUEKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDg3NDk0MjYyMDg0Y2VmZWU3ZWQ0ODRkMjBjOGRjMDU4MDc5MTI3MiBBCVovQU4KKzoxMDA2NDQgMDAwMDAwIDg3OTAwN2VmYWU2MjRkMmIxMzA3MjE0YjI0YTk1NmYwYThkNjg2YTggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovREQKKzoxMDA2NDQgMDAwMDAwIDliNTQxYjIyNzVjMDZlM2E3YjEzZjI4YmFkZjUyOTRlMmFlNjNkZjQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovRE0KKzoxMDA2NDQgMDAwMDAwIGJlYjVkMzhjNTUyODNkMjgwNjg1ZWEyMWEwZTUwY2ZjYzBjYTA2NGEgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECVovRE4KKzoxMDA2NDQgMTAwNjQ0IGQ0MWZkYTQxYjdlYzRkZTQ2YjQzY2I3ZWE0MmE0NTAwMWFlMzkzZDUgYTc5YWMzYmU5Mzc3NjM5ZTFjN2QxZWRmMWFlMWIzYTVmMGNjZDhhOSBNCVovTUQKKzoxMDA2NDQgMTAwNjQ0IDRjYTIyYmFlMjUyN2QzZDllMTY3NjQ5OGEwZmJhM2IzNTViZDEyNzggNjE0MjJiYTljMmM4NzM0MTYwNjFhODhjZDQwYTU5YTM1YjU3NjQ3NCBNCVovTU0KKzoxMDA2NDQgMTAwNjQ0IGIxNmQ3YjI1Yjg2OWYyYmViMTI0ZWZhNTM0NjdkOGExNTUwYWQ2OTQgYTVjNTQ0YzIxY2ZjYjA3ZWI4MGE0ZDg5YTViN2QxNTcwMDAyZWRmZCBNCVovTU4KK0VPRgorY2F0ID4udGVzdC1wbGFpbi1PQiA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmFhMmI1MzM1YjE2NDMxYTBlZjcxZTVjMGEyOGJlNjkxODNjZjZhMiBBCUFBCis6MTAwNjQ0IDAwMDAwMCBiY2M2OGVmOTk3MDE3NDY2ZDVjOTA5NGJjZjc2OTIyOTVmNTg4YzlhIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTQyMGFiODFlMjU0MTQ1ZDI2ZDZmYzBjZGRlZTY0YzFhY2Q0Nzg3IEEJREYKKzoxMDA2NDQgMTAwNjQ0IDE0MWMxZjE2NDIzMjhlNGJjNDZhN2Q4MDFhNzFkYTM5MmU2Njc5MWUgM2M0ZDhkZTVmYmFkMDg1NzJiYWI4ZTEwZWVmOGRiYjI2NGNmMDIzMSBNCURNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDFkNDExMjJlYmRkN2E2NDBmMjlkM2M5Y2M0ZjlkNzAwOTQzNzQ3NjIgQQlMTAorOjEwMDY0NCAwMDAwMDAgMDNmMjRjOGM0NzAwYmFiY2NmZDI4YjY1NGU3ZThlYWM0MDJhZDZjZCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTUQKKzoxMDA2NDQgMTAwNjQ0IGIyNTg1MDhhZmI3Y2ViNDQ5OTgxYmQ5ZDYzZDJkM2U5NzFiZjhkMzQgMTk5ODlkNDU1OWFhZTQxN2ZlZGVlMjQwY2NmMmJhMzE1ZWE0ZGMyYiBNCU1NCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDE1ODg1ODgxZWE2OTExNTM1MWMwOWIzODM3MWYwMzQ4YTNmYjhjNjcgQQlOQQorOjEwMDY0NCAwMDAwMDAgYTRlMTc5ZTQyOTFlNTUzNmE1ZTFjODJlMDkxMDUyNzcyZDJjNWE5MyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTkQKKzoxMDA2NDQgMTAwNjQ0IGM4ZjI1NzgxZThmMTc5MmUzZTQwYjc0MjI1ZTIwNTUzMDQxYjUyMjYgY2RiOWE4YzNkYTU3MTUwMmFjMzAyMjVlOWMxN2JlY2NiODM4Nzk4MyBNCU5NCis6MTAwNjQ0IDEwMDY0NCA0MGM5NTlmOTg0YzhiODlhMmIwMjUyMGQxN2YwMGQ3MTdmMDI0Mzk3IDJhYzU0N2FlOTYxNGEwMGQxYjI4Mjc1ZGU2MDgxMzFmN2EwZTI1OWYgTQlTUworOjEwMDY0NCAxMDA2NDQgNGFjMTM0NTg4OTlhYjkwOGVmM2IxMTI4ZmEzNzhkYWVmYzg4ZDM1NiBjNGU0YTEyMjMxYjlmYTc5YTAwNTNjYjYwNzdmY2IyMWJiNWIxMzVhIE0JVFQKKzowNDAwMDAgMDQwMDAwIDdkNjcwZmRjZGI5OTI5ZjZjN2RhYzE5NmZmNzg2ODljZDFjNTY2YTEgMWJhNTIzOTU1ZDUxNjA2ODFhZjY1Y2I3NzY0MTFmNTc0YzFlODE1NSBNCVoKK0VPRgorY2F0ID4udGVzdC1yZWN1cnNpdmUtT0IgPDxcRU9GCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZhYTJiNTMzNWIxNjQzMWEwZWY3MWU1YzBhMjhiZTY5MTgzY2Y2YTIgQQlBQQorOjEwMDY0NCAwMDAwMDAgYmNjNjhlZjk5NzAxNzQ2NmQ1YzkwOTRiY2Y3NjkyMjk1ZjU4OGM5YSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJREQKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzE0MjBhYjgxZTI1NDE0NWQyNmQ2ZmMwY2RkZWU2NGMxYWNkNDc4NyBBCURGCis6MTAwNjQ0IDEwMDY0NCAxNDFjMWYxNjQyMzI4ZTRiYzQ2YTdkODAxYTcxZGEzOTJlNjY3OTFlIDNjNGQ4ZGU1ZmJhZDA4NTcyYmFiOGUxMGVlZjhkYmIyNjRjZjAyMzEgTQlETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxZDQxMTIyZWJkZDdhNjQwZjI5ZDNjOWNjNGY5ZDcwMDk0Mzc0NzYyIEEJTEwKKzoxMDA2NDQgMDAwMDAwIDAzZjI0YzhjNDcwMGJhYmNjZmQyOGI2NTRlN2U4ZWFjNDAyYWQ2Y2QgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU1ECis6MTAwNjQ0IDEwMDY0NCBiMjU4NTA4YWZiN2NlYjQ0OTk4MWJkOWQ2M2QyZDNlOTcxYmY4ZDM0IDE5OTg5ZDQ1NTlhYWU0MTdmZWRlZTI0MGNjZjJiYTMxNWVhNGRjMmIgTQlNTQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxNTg4NTg4MWVhNjkxMTUzNTFjMDliMzgzNzFmMDM0OGEzZmI4YzY3IEEJTkEKKzoxMDA2NDQgMDAwMDAwIGE0ZTE3OWU0MjkxZTU1MzZhNWUxYzgyZTA5MTA1Mjc3MmQyYzVhOTMgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU5ECis6MTAwNjQ0IDEwMDY0NCBjOGYyNTc4MWU4ZjE3OTJlM2U0MGI3NDIyNWUyMDU1MzA0MWI1MjI2IGNkYjlhOGMzZGE1NzE1MDJhYzMwMjI1ZTljMTdiZWNjYjgzODc5ODMgTQlOTQorOjEwMDY0NCAxMDA2NDQgNDBjOTU5Zjk4NGM4Yjg5YTJiMDI1MjBkMTdmMDBkNzE3ZjAyNDM5NyAyYWM1NDdhZTk2MTRhMDBkMWIyODI3NWRlNjA4MTMxZjdhMGUyNTlmIE0JU1MKKzoxMDA2NDQgMTAwNjQ0IDRhYzEzNDU4ODk5YWI5MDhlZjNiMTEyOGZhMzc4ZGFlZmM4OGQzNTYgYzRlNGExMjIzMWI5ZmE3OWEwMDUzY2I2MDc3ZmNiMjFiYjViMTM1YSBNCVRUCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDZjMGI5OTI4NmQwYmNlNTUxYWM0YTdiM2RmZjhiNzA2ZWRmZjM3MTUgQQlaL0FBCis6MTAwNjQ0IDAwMDAwMCA4NzkwMDdlZmFlNjI0ZDJiMTMwNzIxNGIyNGE5NTZmMGE4ZDY4NmE4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0RECis6MTAwNjQ0IDEwMDY0NCA5YjU0MWIyMjc1YzA2ZTNhN2IxM2YyOGJhZGY1Mjk0ZTJhZTYzZGY0IGQ3NzM3MWQxNTgxN2ZjYWE1N2VlZWMyN2Y3NzBjNTA1YmE5NzRlYzEgTQlaL0RNCis6MTAwNjQ0IDAwMDAwMCBkNDFmZGE0MWI3ZWM0ZGU0NmI0M2NiN2VhNDJhNDUwMDFhZTM5M2Q1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL01ECis6MTAwNjQ0IDEwMDY0NCA0Y2EyMmJhZTI1MjdkM2Q5ZTE2NzY0OThhMGZiYTNiMzU1YmQxMjc4IDY5N2FhZDc3MTVhMWU3MzA2Y2E3NjI5MGEzZGQ0MjA4ZmJhZWRkZmEgTQlaL01NCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGQxMjk3OWMyMmZmZjY5YzU5Y2E5NDA5ZTdhOGZlM2VlMjVlYWVlODAgQQlaL05BCis6MTAwNjQ0IDAwMDAwMCBhMTgzOTNjNjM2Yjk4ZTliZDcyOTZiOGI0MzdlYTQ5OTJiNzI0NDBjIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL05ECis6MTAwNjQ0IDEwMDY0NCAzZmRiZTE3ZmQwMTMzMDNhMmU5ODFlMWNhMWM2Y2Q2ZTcyNzg5MDg3IDdlMDlkNmEzYTE0YmQ2MzA5MTNlOGM3NTY5M2NlYTMyMTU3YjYwNmQgTQlaL05NCitFT0YKK2NhdCA+LnRlc3QtcGxhaW4tQUIgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBjY2JhNzJhZDM4ODhhMzUyMGIzOWVmY2Y3ODBiOWVlNjQxNjc1MzVkIDZhYTJiNTMzNWIxNjQzMWEwZWY3MWU1YzBhMjhiZTY5MTgzY2Y2YTIgTQlBQQorOjEwMDY0NCAwMDAwMDAgN2U0MjZmYjA3OTQ3OWZkNjdmNmQ4MWY5ODRlNGVjNjQ5YTQ0YmMyNSAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJQU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNzE0MjBhYjgxZTI1NDE0NWQyNmQ2ZmMwY2RkZWU2NGMxYWNkNDc4NyBBCURGCis6MDQwMDAwIDAwMDAwMCA2ZDUwZjY1ZDNiZGFiOTFjNjM0NDQyOTRkMzhmMDhhZWZmMzI4ZTQyIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlERgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzYzRkOGRlNWZiYWQwODU3MmJhYjhlMTBlZWY4ZGJiMjY0Y2YwMjMxIEEJRE0KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMzVhYmRlMTUwNmRkZjgwNjU3MmZmNGQ0MDdiZDA2ODg1ZDBmOGVlOSBBCUROCis6MTAwNjQ0IDAwMDAwMCAxMDNkOWY4OWI1MGI5YWFkMDMwNTRiNTc5YmU1ZTdhYTY2NWYyZDU3IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlNRAorOjEwMDY0NCAxMDA2NDQgYjQzMWIyNzJkODI5ZmYzYWE0ZDFhNTA4NWY0Mzk0YWI0ZDMzMDViNiAxOTk4OWQ0NTU5YWFlNDE3ZmVkZWUyNDBjY2YyYmEzMTVlYTRkYzJiIE0JTU0KKzoxMDA2NDQgMTAwNjQ0IGE3MTZkNThkZTRhNTcwZTAwMzhmNWMzMDdiZDhkYjM0ZGFlYTAyMWYgYmQwODRiMGMyN2M3YjZjYzM0ZjExZDZkMDUwOWEyOWJlM2NhZjk3MCBNCU1OCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDE1ODg1ODgxZWE2OTExNTM1MWMwOWIzODM3MWYwMzQ4YTNmYjhjNjcgQQlOQQorOjEwMDY0NCAwMDAwMDAgYTRlMTc5ZTQyOTFlNTUzNmE1ZTFjODJlMDkxMDUyNzcyZDJjNWE5MyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJTkQKKzoxMDA2NDQgMTAwNjQ0IGM4ZjI1NzgxZThmMTc5MmUzZTQwYjc0MjI1ZTIwNTUzMDQxYjUyMjYgY2RiOWE4YzNkYTU3MTUwMmFjMzAyMjVlOWMxN2JlY2NiODM4Nzk4MyBNCU5NCis6MTAwNjQ0IDEwMDY0NCA0Yzg2ZjlhODVmYmM1ZTY4MDRlZTJlMTdhNzk3NTM4ZmJlNzg1YmNhIGM0ZTRhMTIyMzFiOWZhNzlhMDA1M2NiNjA3N2ZjYjIxYmI1YjEzNWEgTQlUVAorOjA0MDAwMCAwNDAwMDAgNWU1ZjIyMDcyYmIzOWY2ZTEyY2Y2NjNhNTdjYjYzNGM3NmVlZmI0OSAxYmE1MjM5NTVkNTE2MDY4MWFmNjVjYjc3NjQxMWY1NzRjMWU4MTU1IE0JWgorRU9GCitjYXQgPi50ZXN0LXJlY3Vyc2l2ZS1BQiA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IGNjYmE3MmFkMzg4OGEzNTIwYjM5ZWZjZjc4MGI5ZWU2NDE2NzUzNWQgNmFhMmI1MzM1YjE2NDMxYTBlZjcxZTVjMGEyOGJlNjkxODNjZjZhMiBNCUFBCis6MTAwNjQ0IDAwMDAwMCA3ZTQyNmZiMDc5NDc5ZmQ2N2Y2ZDgxZjk4NGU0ZWM2NDlhNDRiYzI1IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlBTgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA3MTQyMGFiODFlMjU0MTQ1ZDI2ZDZmYzBjZGRlZTY0YzFhY2Q0Nzg3IEEJREYKKzoxMDA2NDQgMDAwMDAwIDY4YTZkOGI5MWRhMTEwNDVjZjRhYTNhNWFiOWYyYTc4MWM3MDEyNDkgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECURGL0RGCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDNjNGQ4ZGU1ZmJhZDA4NTcyYmFiOGUxMGVlZjhkYmIyNjRjZjAyMzEgQQlETQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWFiZGUxNTA2ZGRmODA2NTcyZmY0ZDQwN2JkMDY4ODVkMGY4ZWU5IEEJRE4KKzoxMDA2NDQgMDAwMDAwIDEwM2Q5Zjg5YjUwYjlhYWQwMzA1NGI1NzliZTVlN2FhNjY1ZjJkNTcgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECU1ECis6MTAwNjQ0IDEwMDY0NCBiNDMxYjI3MmQ4MjlmZjNhYTRkMWE1MDg1ZjQzOTRhYjRkMzMwNWI2IDE5OTg5ZDQ1NTlhYWU0MTdmZWRlZTI0MGNjZjJiYTMxNWVhNGRjMmIgTQlNTQorOjEwMDY0NCAxMDA2NDQgYTcxNmQ1OGRlNGE1NzBlMDAzOGY1YzMwN2JkOGRiMzRkYWVhMDIxZiBiZDA4NGIwYzI3YzdiNmNjMzRmMTFkNmQwNTA5YTI5YmUzY2FmOTcwIE0JTU4KKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTU4ODU4ODFlYTY5MTE1MzUxYzA5YjM4MzcxZjAzNDhhM2ZiOGM2NyBBCU5BCis6MTAwNjQ0IDAwMDAwMCBhNGUxNzllNDI5MWU1NTM2YTVlMWM4MmUwOTEwNTI3NzJkMmM1YTkzIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlORAorOjEwMDY0NCAxMDA2NDQgYzhmMjU3ODFlOGYxNzkyZTNlNDBiNzQyMjVlMjA1NTMwNDFiNTIyNiBjZGI5YThjM2RhNTcxNTAyYWMzMDIyNWU5YzE3YmVjY2I4Mzg3OTgzIE0JTk0KKzoxMDA2NDQgMTAwNjQ0IDRjODZmOWE4NWZiYzVlNjgwNGVlMmUxN2E3OTc1MzhmYmU3ODViY2EgYzRlNGExMjIzMWI5ZmE3OWEwMDUzY2I2MDc3ZmNiMjFiYjViMTM1YSBNCVRUCis6MTAwNjQ0IDEwMDY0NCA4YWNiOGU5NzUwZTNmNjQ0YmYzMjNmY2YzZDMzODg0OWRiMTA2Yzc3IDZjMGI5OTI4NmQwYmNlNTUxYWM0YTdiM2RmZjhiNzA2ZWRmZjM3MTUgTQlaL0FBCis6MTAwNjQ0IDAwMDAwMCAwODc0OTQyNjIwODRjZWZlZTdlZDQ4NGQyMGM4ZGMwNTgwNzkxMjcyIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL0FOCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGQ3NzM3MWQxNTgxN2ZjYWE1N2VlZWMyN2Y3NzBjNTA1YmE5NzRlYzEgQQlaL0RNCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGJlYjVkMzhjNTUyODNkMjgwNjg1ZWEyMWEwZTUwY2ZjYzBjYTA2NGEgQQlaL0ROCis6MTAwNjQ0IDAwMDAwMCBhNzlhYzNiZTkzNzc2MzllMWM3ZDFlZGYxYWUxYjNhNWYwY2NkOGE5IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL01ECis6MTAwNjQ0IDEwMDY0NCA2MTQyMmJhOWMyYzg3MzQxNjA2MWE4OGNkNDBhNTlhMzViNTc2NDc0IDY5N2FhZDc3MTVhMWU3MzA2Y2E3NjI5MGEzZGQ0MjA4ZmJhZWRkZmEgTQlaL01NCis6MTAwNjQ0IDEwMDY0NCBhNWM1NDRjMjFjZmNiMDdlYjgwYTRkODlhNWI3ZDE1NzAwMDJlZGZkIGIxNmQ3YjI1Yjg2OWYyYmViMTI0ZWZhNTM0NjdkOGExNTUwYWQ2OTQgTQlaL01OCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGQxMjk3OWMyMmZmZjY5YzU5Y2E5NDA5ZTdhOGZlM2VlMjVlYWVlODAgQQlaL05BCis6MTAwNjQ0IDAwMDAwMCBhMTgzOTNjNjM2Yjk4ZTliZDcyOTZiOGI0MzdlYTQ5OTJiNzI0NDBjIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgRAlaL05ECis6MTAwNjQ0IDEwMDY0NCAzZmRiZTE3ZmQwMTMzMDNhMmU5ODFlMWNhMWM2Y2Q2ZTcyNzg5MDg3IDdlMDlkNmEzYTE0YmQ2MzA5MTNlOGM3NTY5M2NlYTMyMTU3YjYwNmQgTQlaL05NCitFT0YKKworeDQwPSdbMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdJworeDQwPSIkeDQwJHg0MCR4NDAkeDQwJHg0MCR4NDAkeDQwJHg0MCIKK3o0MD0nMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKK2NtcF9kaWZmX2ZpbGVzX291dHB1dCAoKSB7CisgICAgIyBkaWZmLWZpbGVzIG5ldmVyIHJlcG9ydHMgYWRkaXRpb25zLiAgQWxzbyBpdCBkb2VzIG5vdCBmaWxsIGluIHRoZQorICAgICMgb2JqZWN0IElEIGZvciB0aGUgY2hhbmdlZCBmaWxlcyBiZWNhdXNlIGl0IHdhbnRzIHlvdSB0byBsb29rIGF0IHRoZQorICAgICMgZmlsZXN5c3RlbS4KKyAgICBzZWQgPCIkMiIgPi50ZXN0LXRtcCBcCisJLWUgJy9eOjAwMDAwMCAvZDtzLyckeDQwJ1woIFtNQ1JORFVdWzAtOV0qXCkJLyckejQwJ1wxCS8nICYmCisgICAgZGlmZiAiJDEiIC50ZXN0LXRtcAorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX08gJHRyZWVfQSA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1wbGFpbi1PQScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAkdHJlZV9PICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9BJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX08gJHRyZWVfQiA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1wbGFpbi1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAkdHJlZV9PICR0cmVlX0IgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLU9CJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIG9mIGtub3duIHRyZWVzLicgXAorICAgICdnaXQtZGlmZi10cmVlICR0cmVlX0EgJHRyZWVfQiA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1wbGFpbi1BQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtdHJlZSBvZiBrbm93biB0cmVlcy4nIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLUFCJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1jYWNoZSBPIHdpdGggQSBpbiBjYWNoZScgXAorICAgICdnaXQtcmVhZC10cmVlICR0cmVlX0EgJiYKKyAgICAgZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWVfTyA+LnRlc3QtYSAmJgorICAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWNhY2hlIE8gd2l0aCBCIGluIGNhY2hlJyBcCisgICAgJ2dpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZV9PID4udGVzdC1hICYmCisgICAgIGNtcCAtcyAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtY2FjaGUgQSB3aXRoIEIgaW4gY2FjaGUnIFwKKyAgICAnZ2l0LXJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIGdpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlX0EgPi50ZXN0LWEgJiYKKyAgICAgY21wIC1zIC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLUFCJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi1maWxlcyB3aXRoIE8gaW4gY2FjaGUgYW5kIEEgY2hlY2tlZCBvdXQnIFwKKyAgICAncm0gLWZyIFogW0EtWl1bQS1aXSAmJgorICAgICBnaXQtcmVhZC10cmVlICR0cmVlX0EgJiYKKyAgICAgZ2l0LWNoZWNrb3V0LWluZGV4IC1mIC1hICYmCisgICAgIGdpdC1yZWFkLXRyZWUgLS1yZXNldCAkdHJlZV9PIHx8IHJldHVybiAxCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1yZWZyZXNoID4vZGV2L251bGwgOyMgdGhpcyBjYW4gZXhpdCBub24temVybworICAgICBnaXQtZGlmZi1maWxlcyA+LnRlc3QtYSAmJgorICAgICBjbXBfZGlmZl9maWxlc19vdXRwdXQgLnRlc3QtYSAudGVzdC1yZWN1cnNpdmUtT0EnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmLWZpbGVzIHdpdGggTyBpbiBjYWNoZSBhbmQgQiBjaGVja2VkIG91dCcgXAorICAgICdybSAtZnIgWiBbQS1aXVtBLVpdICYmCisgICAgIGdpdC1yZWFkLXRyZWUgJHRyZWVfQiAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLWEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtLXJlc2V0ICR0cmVlX08gfHwgcmV0dXJuIDEKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlZnJlc2ggPi9kZXYvbnVsbCA7IyB0aGlzIGNhbiBleGl0IG5vbi16ZXJvCisgICAgIGdpdC1kaWZmLWZpbGVzID4udGVzdC1hICYmCisgICAgIGNtcF9kaWZmX2ZpbGVzX291dHB1dCAudGVzdC1hIC50ZXN0LXJlY3Vyc2l2ZS1PQicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYtZmlsZXMgd2l0aCBBIGluIGNhY2hlIGFuZCBCIGNoZWNrZWQgb3V0JyBcCisgICAgJ3JtIC1mciBaIFtBLVpdW0EtWl0gJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAkdHJlZV9CICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtZiAtYSAmJgorICAgICBnaXQtcmVhZC10cmVlIC0tcmVzZXQgJHRyZWVfQSB8fCByZXR1cm4gMQorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tcmVmcmVzaCA+L2Rldi9udWxsIDsjIHRoaXMgY2FuIGV4aXQgbm9uLXplcm8KKyAgICAgZ2l0LWRpZmYtZmlsZXMgPi50ZXN0LWEgJiYKKyAgICAgY21wX2RpZmZfZmlsZXNfb3V0cHV0IC50ZXN0LWEgLnRlc3QtcmVjdXJzaXZlLUFCJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5vdyB3ZSBoYXZlIGVzdGFibGlzaGVkIHRoZSBiYXNlbGluZSwgd2UgZG8gbm90IGhhdmUgdG8KKyMgcmVseSBvbiBpbmRpdmlkdWFsIG9iamVjdCBJRCB2YWx1ZXMgdGhhdCBtdWNoLgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIE8gQSA9PSBkaWZmLXRyZWUgLVIgQSBPJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgJHRyZWVfTyAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtUiAkdHJlZV9BICR0cmVlX08gPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIC1yIE8gQSA9PSBkaWZmLXRyZWUgLXIgLVIgQSBPJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfTyAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtciAtUiAkdHJlZV9BICR0cmVlX08gPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIEIgQSA9PSBkaWZmLXRyZWUgLVIgQSBCJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgJHRyZWVfQiAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtUiAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZi10cmVlIC1yIEIgQSA9PSBkaWZmLXRyZWUgLXIgLVIgQSBCJyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgJHRyZWVfQiAkdHJlZV9BID4udGVzdC1hICYmCisgICAgZ2l0LWRpZmYtdHJlZSAtciAtUiAkdHJlZV9BICR0cmVlX0IgPi50ZXN0LWIgJiYKKyAgICBjbXAgLXMgLnRlc3QtYSAudGVzdC1iJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDMtZGlmZi1yZW5hbWUtMS5zaCBiL3QvdDQwMDMtZGlmZi1yZW5hbWUtMS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzUxOTcwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwMy1kaWZmLXJlbmFtZS0xLnNoCkBAIC0wLDAgKzEsMTI4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J01vcmUgcmVuYW1lIGRldGVjdGlvbgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGVjaG8gZnJvdHogPnJlenJvdiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQ09QWUlORyByZXpyb3YgJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZWNobyAkdHJlZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlJyBcCisgICAgJ3NlZCAtZSAncy9IT1dFVkVSL0hvd2V2ZXIvJyA8Q09QWUlORyA+Q09QWUlORy4xICYmCisgICAgc2VkIC1lICdzL0dQTC9HLlAuTC9nJyA8Q09QWUlORyA+Q09QWUlORy4yICYmCisgICAgcm0gLWYgQ09QWUlORyAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLj8nCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HLjEgYW5kIENPUFlJTkcuMiwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFNvIHdlIHNheSB5b3UKKyMgY29weS1hbmQtZWRpdCBvbmUsIGFuZCByZW5hbWUtYW5kLWVkaXQgdGhlIG90aGVyLiAgV2UgZG8gbm90IHNheQorIyBhbnl0aGluZyBhYm91dCByZXpyb3YuCisKK0dJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPmN1cnJlbnQKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcuMQorY29weSBmcm9tIENPUFlJTkcKK2NvcHkgdG8gQ09QWUlORy4xCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HLjEKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIb3dldmVyLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKK2RpZmYgLS1naXQgYS9DT1BZSU5HIGIvQ09QWUlORy4yCityZW5hbWUgZnJvbSBDT1BZSU5HCityZW5hbWUgdG8gQ09QWUlORy4yCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HLjIKK0BAIC0yICsyIEBACistIE5vdGUgdGhhdCB0aGUgb25seSB2YWxpZCB2ZXJzaW9uIG9mIHRoZSBHUEwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorKyBOb3RlIHRoYXQgdGhlIG9ubHkgdmFsaWQgdmVyc2lvbiBvZiB0aGUgRy5QLkwgYXMgZmFyIGFzIHRoaXMgcHJvamVjdAorQEAgLTYgKzYgQEAKKy0gSE9XRVZFUiwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCisrIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEcuUC5MdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitAQCAtMTIgKzEyIEBACistCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLCBvciBhIGxhdGVyIHZlcnNpb24KKysJVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHLlAuTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgYWdhaW4nIFwKKyAgICAnbXYgQ09QWUlORy4yIENPUFlJTkcgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuMSBDT1BZSU5HLjInCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HIGFuZCBDT1BZSU5HLjEsCisjIGJvdGggYXJlIHNsaWdodGx5IGVkaXRlZCwgYW5kIHVuY2hhbmdlZCByZXpyb3YuICBTbyB3ZSBzYXkgeW91CisjIGVkaXRlZCBvbmUsIGFuZCBjb3B5LWFuZC1lZGl0IHRoZSBvdGhlci4gIFdlIGRvIG5vdCBzYXkKKyMgYW55dGhpbmcgYWJvdXQgcmV6cm92LgorCitHSVRfRElGRl9PUFRTPS0tdW5pZmllZD0wIGdpdC1kaWZmLWluZGV4IC1DIC1wICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HCistLS0gYS9DT1BZSU5HCisrKysgYi9DT1BZSU5HCitAQCAtMiArMiBAQAorLSBOb3RlIHRoYXQgdGhlIG9ubHkgdmFsaWQgdmVyc2lvbiBvZiB0aGUgR1BMIGFzIGZhciBhcyB0aGlzIHByb2plY3QKKysgTm90ZSB0aGF0IHRoZSBvbmx5IHZhbGlkIHZlcnNpb24gb2YgdGhlIEcuUC5MIGFzIGZhciBhcyB0aGlzIHByb2plY3QKK0BAIC02ICs2IEBACistIEhPV0VWRVIsIGluIG9yZGVyIHRvIGFsbG93IGEgbWlncmF0aW9uIHRvIEdQTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorKyBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHLlAuTHYzIGlmIHRoYXQgc2VlbXMgbGlrZQorQEAgLTEyICsxMiBAQAorLQlUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Miwgb3IgYSBsYXRlciB2ZXJzaW9uCisrCVRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgRy5QLkwgdjIsIG9yIGEgbGF0ZXIgdmVyc2lvbgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HLjEKK2NvcHkgZnJvbSBDT1BZSU5HCitjb3B5IHRvIENPUFlJTkcuMQorLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORy4xCitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUgb25jZSBhZ2FpbicgXAorICAgICdjYXQgLi4vLi4vQ09QWUlORyA+Q09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xJworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORyBhbmQgQ09QWUlORy4xLAorIyBidXQgQ09QWUlORyBpcyBub3QgZWRpdGVkLiAgV2Ugc2F5IHlvdSBjb3B5LWFuZC1lZGl0IENPUFlJTkcuMTsgdGhpcworIyBpcyBvbmx5IHBvc3NpYmxlIGJlY2F1c2UgLUMgbW9kZSBub3cgcmVwb3J0cyB0aGUgdW5tb2RpZmllZCBmaWxlIHRvCisjIHRoZSBkaWZmLWNvcmUuICBVbmNoYW5nZWQgcmV6cm92LCBhbHRob3VnaCBiZWluZyBmZWQgdG8KKyMgZ2l0LWRpZmYtaW5kZXggYXMgd2VsbCwgc2hvdWxkIG5vdCBiZSBtZW50aW9uZWQuCisKK0dJVF9ESUZGX09QVFM9LS11bmlmaWVkPTAgXAorICAgIGdpdC1kaWZmLWluZGV4IC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyIC1wICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorZGlmZiAtLWdpdCBhL0NPUFlJTkcgYi9DT1BZSU5HLjEKK2NvcHkgZnJvbSBDT1BZSU5HCitjb3B5IHRvIENPUFlJTkcuMQorLS0tIGEvQ09QWUlORworKysrIGIvQ09QWUlORy4xCitAQCAtNiArNiBAQAorLSBIT1dFVkVSLCBpbiBvcmRlciB0byBhbGxvdyBhIG1pZ3JhdGlvbiB0byBHUEx2MyBpZiB0aGF0IHNlZW1zIGxpa2UKKysgSG93ZXZlciwgaW4gb3JkZXIgdG8gYWxsb3cgYSBtaWdyYXRpb24gdG8gR1BMdjMgaWYgdGhhdCBzZWVtcyBsaWtlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9wYXRjaCBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDQtZGlmZi1yZW5hbWUtc3ltbGluay5zaCBiL3QvdDQwMDQtZGlmZi1yZW5hbWUtc3ltbGluay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjNhYWEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwNC1kaWZmLXJlbmFtZS1zeW1saW5rLnNoCkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nTW9yZSByZW5hbWUgZGV0ZWN0aW9uIHRlc3RzLgorCitUaGUgcmVuYW1lIGRldGVjdGlvbiBsb2dpYyBzaG91bGQgYmUgYWJsZSB0byBkZXRlY3QgcHVyZSByZW5hbWUgb3IKK2NvcHkgb2Ygc3ltYm9saWMgbGlua3MsIGJ1dCBzaG91bGQgbm90IHByb2R1Y2UgcmVuYW1lL2NvcHkgZm9sbG93ZWQKK2J5IGFuIGVkaXQgZm9yIHRoZW0uCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyB4eXp6eSB8IHRyIC1kICdcXFxcJzAxMiA+eW9taW4gJiYKKyAgICAgbG4gLXMgeHl6enkgZnJvdHogJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6IHlvbWluICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGVjaG8gJHRyZWUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZScgXAorICAgICdtdiBmcm90eiByZXpyb3YgJiYKKyAgICAgcm0gLWYgeW9taW4gJiYKKyAgICAgbG4gLXMgeHl6enkgbml0Zm9sICYmCisgICAgIGxuIC1zIHh6enp5IGJvemJhciAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgZnJvdHogcmV6cm92IG5pdGZvbCBib3piYXIgeW9taW4nCisKKyMgdHJlZSBoYXMgZnJvdHogcG9pbnRpbmcgYXQgeHl6enksIGFuZCB5b21pbiB0aGF0IGNvbnRhaW5zIHh5enp5IHRvCisjIGNvbmZ1c2UgdGhpbmdzLiAgd29yayB0cmVlIGhhcyByZXpyb3YgKHh5enp5KSBuaXRmb2wgKHh5enp5KSBhbmQKKyMgYm96YmFyICh4enp6eSkuCisjIHJlenJvdiBhbmQgbml0Zm9sIGFyZSByZW5hbWUvY29weSBvZiBmcm90eiBhbmQgYm96YmFyIHNob3VsZCBiZQorIyBhIG5ldyBjcmVhdGlvbi4KKworR0lUX0RJRkZfT1BUUz0tLXVuaWZpZWQ9MCBnaXQtZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKK2RpZmYgLS1naXQgYS9ib3piYXIgYi9ib3piYXIKK25ldyBmaWxlIG1vZGUgMTIwMDAwCistLS0gL2Rldi9udWxsCisrKysgYi9ib3piYXIKK0BAIC0wLDAgKzEgQEAKKyt4enp6eQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9uaXRmb2wKK3NpbWlsYXJpdHkgaW5kZXggMTAwJQorY29weSBmcm9tIGZyb3R6Citjb3B5IHRvIG5pdGZvbAorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvcmV6cm92CitzaW1pbGFyaXR5IGluZGV4IDEwMCUKK3JlbmFtZSBmcm9tIGZyb3R6CityZW5hbWUgdG8gcmV6cm92CitkaWZmIC0tZ2l0IGEveW9taW4gYi95b21pbgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CistLS0gYS95b21pbgorKysrIC9kZXYvbnVsbAorQEAgLTEgKzAsMCBAQAorLXh5enp5CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZGlmZiBvdXRwdXQnIFwKKyAgICAnY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAwNS1kaWZmLXJlbmFtZS0yLnNoIGIvdC90NDAwNS1kaWZmLXJlbmFtZS0yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4NGZkMjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA1LWRpZmYtcmVuYW1lLTIuc2gKQEAgLTAsMCArMSw4NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdTYW1lIHJlbmFtZSBkZXRlY3Rpb24gYXMgdDQwMDMgYnV0IHRlc3RpbmcgZGlmZi1yYXcuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnY2F0IC4uLy4uL0NPUFlJTkcgPkNPUFlJTkcgJiYKKyAgICAgZWNobyBmcm90eiA+cmV6cm92ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBDT1BZSU5HIHJlenJvdiAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBlY2hvICR0cmVlJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncHJlcGFyZSB3b3JrIHRyZWUnIFwKKyAgICAnc2VkIC1lICdzL0hPV0VWRVIvSG93ZXZlci8nIDxDT1BZSU5HID5DT1BZSU5HLjEgJiYKKyAgICBzZWQgLWUgJ3MvR1BML0cuUC5ML2cnIDxDT1BZSU5HID5DT1BZSU5HLjIgJiYKKyAgICBybSAtZiBDT1BZSU5HICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBDT1BZSU5HIENPUFlJTkcuPycKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcuMSBhbmQgQ09QWUlORy4yLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2F5IENPUFlJTkcuMQorIyBhbmQgQ09QWUlORy4yIGFyZSBiYXNlZCBvbiBDT1BZSU5HLCBhbmQgZG8gbm90IHNheSBhbnl0aGluZyBhYm91dAorIyByZXpyb3YuCisKK2dpdC1kaWZmLWluZGV4IC1NICR0cmVlID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQJQ09QWUlORwlDT1BZSU5HLjEKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDZjNjc5NjFiYmFlZDM0YTEyN2Y3NmQyNjFmNGMwYmY3M2VkYTQ3MSBSMTIzNAlDT1BZSU5HCUNPUFlJTkcuMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlIGFnYWluJyBcCisgICAgJ212IENPUFlJTkcuMiBDT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEgQ09QWUlORy4yJworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgQ09QWUlORyBhbmQgQ09QWUlORy4xLAorIyBib3RoIGFyZSBzbGlnaHRseSBlZGl0ZWQsIGFuZCB1bmNoYW5nZWQgcmV6cm92LiAgV2Ugc2F5IENPUFlJTkcuMQorIyBpcyBiYXNlZCBvbiBDT1BZSU5HIGFuZCBDT1BZSU5HIGlzIHN0aWxsIHRoZXJlLCBhbmQgZG8gbm90IHNheSBhbnl0aGluZworIyBhYm91dCByZXpyb3YuCisKK2dpdC1kaWZmLWluZGV4IC1DICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNmM2Nzk2MWJiYWVkMzRhMTI3Zjc2ZDI2MWY0YzBiZjczZWRhNDcxIE0JQ09QWUlORworOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CUNPUFlJTkcJQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgdGhlIHNhbWUgQ09QWUlORyBhbmQKKyMgY29weS1lZGl0ZWQgQ09QWUlORy4xLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNob3VsZCBub3Qgc2F5CisjIGFueXRoaW5nIGFib3V0IHJlenJvdiBub3IgQ09QWUlORywgc2luY2UgdGhlIHJldmlzZWQgYWdhaW4gZGlmZi1yYXcKKyMgbm93cyBob3cgdG8gc2F5IENvcHkuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBvbmNlIGFnYWluJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEnCisKK2dpdC1kaWZmLWluZGV4IC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CUNPUFlJTkcJQ09QWUlORy4xCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDA2LWRpZmYtbW9kZS5zaCBiL3QvdDQwMDYtZGlmZi1tb2RlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhhZDY5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDA2LWRpZmYtbW9kZS5zaApAQCAtMCwwICsxLDQ0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgbW9kZSBjaGFuZ2UgZGlmZnMuCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc2V0dXAnIFwKKyAgICAnZWNobyBmcm90eiA+cmV6cm92ICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgcmV6cm92ICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBlY2hvICR0cmVlJworCitpZiBbICIkKGdpdCByZXBvLWNvbmZpZyAtLWdldCBjb3JlLmZpbGVtb2RlKSIgPSBmYWxzZSBdCit0aGVuCisJc2F5ICdmaWxlbW9kZSBkaXNhYmxlZCBvbiB0aGUgZmlsZXN5c3RlbSwgdXNpbmcgdXBkYXRlLWluZGV4IC0tY2htb2Q9K3gnCisJdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisJICAgICdnaXQtdXBkYXRlLWluZGV4IC0tY2htb2Q9K3gnIFwKKwkgICAgJ2dpdC11cGRhdGUtaW5kZXggcmV6cm92ICYmCisJICAgICBnaXQtdXBkYXRlLWluZGV4IC0tY2htb2Q9K3ggcmV6cm92ICYmCisJICAgICBnaXQtZGlmZi1pbmRleCAkdHJlZSA+Y3VycmVudCcKK2Vsc2UKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkgICAgJ2NobW9kJyBcCisJICAgICdjaG1vZCAreCByZXpyb3YgJiYKKwkgICAgIGdpdC11cGRhdGUtaW5kZXggcmV6cm92ICYmCisJICAgICBnaXQtZGlmZi1pbmRleCAkdHJlZSA+Y3VycmVudCcKK2ZpCisKK194NDA9J1swLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl0nCitfeDQwPSIkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwJF94NDAkX3g0MCRfeDQwIgorc2VkIC1lICdzL1woOjEwMDY0NCAxMDA3NTVcKSBcKCciJF94NDAiJ1wpIFwyIC9cMSBYIFggLycgPGN1cnJlbnQgPmNoZWNrCitlY2hvICI6MTAwNjQ0IDEwMDc1NSBYIFggTQlyZXpyb3YiID5leHBlY3RlZAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5JyBcCisgICAgJ2RpZmYgLXUgZXhwZWN0ZWQgY2hlY2snCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MDA3LXJlbmFtZS0zLnNoIGIvdC90NDAwNy1yZW5hbWUtMy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYjZiYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwNy1yZW5hbWUtMy5zaApAQCAtMCwwICsxLDkwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J1JlbmFtZSBpbnRlcmFjdGlvbiB3aXRoIHBhdGhzcGVjLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ21rZGlyIHBhdGgwIHBhdGgxICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIHBhdGgwL0NPUFlJTkcgJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZWNobyAkdHJlZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlJyBcCisgICAgJ2NwIHBhdGgwL0NPUFlJTkcgcGF0aDEvQ09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIHBhdGgwL0NPUFlJTkcgcGF0aDEvQ09QWUlORycKKworIyBJbiB0aGUgdHJlZSwgdGhlcmUgaXMgb25seSBwYXRoMC9DT1BZSU5HLiAgSW4gdGhlIGNhY2hlLCBwYXRoMCBhbmQKKyMgcGF0aDEgYm90aCBoYXZlIENPUFlJTkcgYW5kIHRoZSBsYXR0ZXIgaXMgYSBjb3B5IG9mIHBhdGgwL0NPUFlJTkcuCisjIENvbXBhcmluZyB0aGUgZnVsbCB0cmVlIHdpdGggY2FjaGUgc2hvdWxkIHRlbGwgdXMgc28uCisKK2dpdC1kaWZmLWluZGV4IC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyICR0cmVlID5jdXJyZW50CisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgQzEwMAlwYXRoMC9DT1BZSU5HCXBhdGgxL0NPUFlJTkcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgdGhlIHJlc3VsdCAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworIyBJbiB0aGUgdHJlZSwgdGhlcmUgaXMgb25seSBwYXRoMC9DT1BZSU5HLiAgSW4gdGhlIGNhY2hlLCBwYXRoMCBhbmQKKyMgcGF0aDEgYm90aCBoYXZlIENPUFlJTkcgYW5kIHRoZSBsYXR0ZXIgaXMgYSBjb3B5IG9mIHBhdGgwL0NPUFlJTkcuCisjIEhvd2V2ZXIgd2hlbiB3ZSBzYXkgd2UgY2FyZSBvbmx5IGFib3V0IHBhdGgxLCB3ZSBzaG91bGQganVzdCBzZWUKKyMgcGF0aDEvQ09QWUlORyBzdWRkZW5seSBhcHBlYXJpbmcgZnJvbSBub3doZXJlLCBub3QgZGV0ZWN0ZWQgYXMKKyMgYSBjb3B5IGZyb20gcGF0aDAvQ09QWUlORy4KKworZ2l0LWRpZmYtaW5kZXggLUMgJHRyZWUgcGF0aDEgPmN1cnJlbnQKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBBCXBhdGgxL0NPUFlJTkcKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgdGhlIHJlc3VsdCAoIzIpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3R3ZWFrIHdvcmsgdHJlZScgXAorICAgICdybSAtZiBwYXRoMC9DT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgcGF0aDAvQ09QWUlORycKKworIyBJbiB0aGUgdHJlZSwgdGhlcmUgaXMgb25seSBwYXRoMC9DT1BZSU5HLiAgSW4gdGhlIGNhY2hlLCBwYXRoMCBkb2VzCisjIG5vdCBoYXZlIENPUFlJTkcgYW55bW9yZSBhbmQgcGF0aDEgaGFzIENPUFlJTkcgd2hpY2ggaXMgYSBjb3B5IG9mCisjIHBhdGgwL0NPUFlJTkcuICBTaG93aW5nIHRoZSBmdWxsIHRyZWUgd2l0aCBjYWNoZSBzaG91bGQgdGVsbCB1cyBhYm91dAorIyB0aGUgcmVuYW1lLgorCitnaXQtZGlmZi1pbmRleCAtQyAkdHJlZSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIFIxMDAJcGF0aDAvQ09QWUlORwlwYXRoMS9DT1BZSU5HCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHRoZSByZXN1bHQgKCMzKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMgSW4gdGhlIHRyZWUsIHRoZXJlIGlzIG9ubHkgcGF0aDAvQ09QWUlORy4gIEluIHRoZSBjYWNoZSwgcGF0aDAgZG9lcworIyBub3QgaGF2ZSBDT1BZSU5HIGFueW1vcmUgYW5kIHBhdGgxIGhhcyBDT1BZSU5HIHdoaWNoIGlzIGEgY29weSBvZgorIyBwYXRoMC9DT1BZSU5HLiAgV2hlbiB3ZSBzYXkgd2UgY2FyZSBvbmx5IGFib3V0IHBhdGgxLCB3ZSBzaG91bGQganVzdAorIyBzZWUgcGF0aDEvQ09QWUlORyBhcHBlYXJpbmcgZnJvbSBub3doZXJlLgorCitnaXQtZGlmZi1pbmRleCAtQyAkdHJlZSBwYXRoMSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIEEJcGF0aDEvQ09QWUlORworRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSB0aGUgcmVzdWx0ICgjNCknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDgtZGlmZi1icmVhay1yZXdyaXRlLnNoIGIvdC90NDAwOC1kaWZmLWJyZWFrLXJld3JpdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjYzYWMxZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMDgtZGlmZi1icmVhay1yZXdyaXRlLnNoCkBAIC0wLDAgKzEsMTg4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J0JyZWFrIGFuZCB0aGVuIHJlbmFtZQorCitXZSBoYXZlIHR3byB2ZXJ5IGRpZmZlcmVudCBmaWxlcywgZmlsZTAgYW5kIGZpbGUxLCByZWdpc3RlcmVkIGluIGEgdHJlZS4KKworV2UgdXBkYXRlIGZpbGUxIHNvIGRyYXN0aWNhbGx5IHRoYXQgaXQgaXMgbW9yZSBzaW1pbGFyIHRvIGZpbGUwLCBhbmQKK3RoZW4gcmVtb3ZlIGZpbGUwLiAgV2l0aCAtQiwgY2hhbmdlcyB0byBmaWxlMSBzaG91bGQgYmUgYnJva2VuIGludG8KK3NlcGFyYXRlIGRlbGV0ZSBhbmQgY3JlYXRlLCByZXN1bHRpbmcgaW4gcmVtb3ZhbCBvZiBmaWxlMCwgcmVtb3ZhbCBvZgorb3JpZ2luYWwgZmlsZTEgYW5kIGNyZWF0aW9uIG9mIGNvbXBsZXRlbHkgcmV3cml0dGVuIGZpbGUxLgorCitGdXJ0aGVyLCB3aXRoIC1CIGFuZCAtTSB0b2dldGhlciwgdGhlc2UgdGhyZWUgbW9kaWZpY2F0aW9ucyBzaG91bGQKK3R1cm4gaW50byByZW5hbWUtZWRpdCBvZiBmaWxlMCBpbnRvIGZpbGUxLgorCitTdGFydGluZyBmcm9tIHRoZSBzYW1lIHR3byBmaWxlcyBpbiB0aGUgdHJlZSwgd2Ugc3dhcCBmaWxlMCBhbmQgZmlsZTEuCitXaXRoIC1CLCB0aGlzIHNob3VsZCBiZSBkZXRlY3RlZCBhcyB0d28gY29tcGxldGUgcmV3cml0ZXMsIHJlc3VsdGluZyBpbgorZm91ciBjaGFuZ2VzIGluIHRvdGFsLgorCitGdXJ0aGVyLCB3aXRoIC1CIGFuZCAtTSB0b2dldGhlciwgdGhlc2Ugc2hvdWxkIHR1cm4gaW50byB0d28gcmVuYW1lcy4KKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgc2V0dXAgXAorICAgICdjYXQgLi4vLi4vUkVBRE1FID5maWxlMCAmJgorICAgICBjYXQgLi4vLi4vQ09QWUlORyA+ZmlsZTEgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZpbGUwIGZpbGUxICYmCisgICAgdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGVjaG8gIiR0cmVlIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoYW5nZSBmaWxlMSB3aXRoIGNvcHktZWRpdCBvZiBmaWxlMCBhbmQgcmVtb3ZlIGZpbGUwJyBcCisgICAgJ3NlZCAtZSAicy9naXQvR0lULyIgZmlsZTAgPmZpbGUxICYmCisgICAgIHJtIC1mIGZpbGUwICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLXJlbW92ZSBmaWxlMCBmaWxlMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUInIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgLS1jYWNoZWQgIiR0cmVlIiA+Y3VycmVudCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMDAwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBECWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDExZTMzMTQ2NWE4OWMzOTRkYzI1Yzc4MGRlMjMwMDQzNzUwYzFlYzggTTEwMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgKCMxKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CIGFuZCAtTScgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAtTSAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiAwOGJiMmZiNjcxZGVmZjRjMDNhNGQ0YTBhMTMxNWRmZjk4ZDU3MzJjIFIxMDAJZmlsZTAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CIC1NICgjMiknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc3dhcCBmaWxlMCBhbmQgZmlsZTEnIFwKKyAgICAncm0gLWYgZmlsZTAgZmlsZTEgJiYKKyAgICAgZ2l0LXJlYWQtdHJlZSAtbSAkdHJlZSAmJgorICAgICBnaXQtY2hlY2tvdXQtaW5kZXggLWYgLXUgLWEgJiYKKyAgICAgbXYgZmlsZTAgdG1wICYmCisgICAgIG12IGZpbGUxIGZpbGUwICYmCisgICAgIG12IHRtcCBmaWxlMSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IGZpbGUwIGZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIE0xMDAJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBNMTAwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAoIzMpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUIgYW5kIC1NJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CIC1NICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgUjEwMAlmaWxlMQlmaWxlMAorOjEwMDY0NCAxMDA2NDQgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIFIxMDAJZmlsZTAJZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CIC1NICgjNCknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbWFrZSBmaWxlMCBpbnRvIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCcgXAorICAgICdybSAtZiBmaWxlMCAmJgorICAgICBsbiAtcyBmcm90eiBmaWxlMCAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IGZpbGUwIGZpbGUxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMjAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiA2N2JlNDIxZjg4ODI0NTc4ODU3NjI0ZjdiM2RjNzVlOTlhOGExNDgxIFQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiBNMTAwCWZpbGUxCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIHJlc3VsdCBvZiAtQiAoIzUpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXcgZXhwZWN0ZWQgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3J1biBkaWZmIHdpdGggLUInIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLUIgLU0gIiR0cmVlIiA+Y3VycmVudCcKKworIyBUaGlzIHNob3VsZCBub3QgbWlzdGFrZSBmaWxlMCBhcyB0aGUgY29weSBzb3VyY2Ugb2YgbmV3IGZpbGUxCisjIGR1ZSB0byB0eXBlIGRpZmZlcmVuY2VzLgorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTIwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgNjdiZTQyMWY4ODgyNDU3ODg1NzYyNGY3YjNkYzc1ZTk5YThhMTQ4MSBUCWZpbGUwCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgTTEwMAlmaWxlMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgLU0gKCM2KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1NJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1NICIkdHJlZSIgPmN1cnJlbnQnCisKKyMgVGhpcyBzaG91bGQgbm90IG1pc3Rha2UgZmlsZTAgYXMgdGhlIGNvcHkgc291cmNlIG9mIG5ldyBmaWxlMQorIyBkdWUgdG8gdHlwZSBkaWZmZXJlbmNlcy4KK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEyMDAwMCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDY3YmU0MjFmODg4MjQ1Nzg4NTc2MjRmN2IzZGM3NWU5OWE4YTE0ODEgVAlmaWxlMAorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIE0JZmlsZTEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1NICgjNyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZmlsZTEgZWRpdGVkIHRvIGxvb2sgbGlrZSBmaWxlMCBhbmQgZmlsZTAgcmVuYW1lLWVkaXRlZCB0byBmaWxlMicgXAorICAgICdybSAtZiBmaWxlMCBmaWxlMSAmJgorICAgICBnaXQtcmVhZC10cmVlIC1tICR0cmVlICYmCisgICAgIGdpdC1jaGVja291dC1pbmRleCAtZiAtdSAtYSAmJgorICAgICBzZWQgLWUgInMvZ2l0L0dJVC8iIGZpbGUwID5maWxlMSAmJgorICAgICBzZWQgLWUgInMvZ2l0L0dFVC8iIGZpbGUwID5maWxlMiAmJgorICAgICBybSAtZiBmaWxlMAorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZpbGUwIGZpbGUxIGZpbGUyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncnVuIGRpZmYgd2l0aCAtQicgXAorICAgICdnaXQtZGlmZi1pbmRleCAtQiAiJHRyZWUiID5jdXJyZW50JworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAwMDAwMDAgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEQJZmlsZTAKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDhiYjJmYjY3MWRlZmY0YzAzYTRkNGEwYTEzMTVkZmY5OGQ1NzMyYyBNMTAwCWZpbGUxCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGY1ZGVhYzdiZTU5ZTdlZWFiODY1N2ZkOWFlNzA2ZmQ2YTU3ZGFlZDIgQQlmaWxlMgorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSByZXN1bHQgb2YgLUIgKCM4KScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3IGV4cGVjdGVkIGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdydW4gZGlmZiB3aXRoIC1CIC1NJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC1CIC1NICIkdHJlZSIgPmN1cnJlbnQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCis6MTAwNjQ0IDEwMDY0NCBmNWRlYWM3YmU1OWU3ZWVhYjg2NTdmZDlhZTcwNmZkNmE1N2RhZWQyIDA4YmIyZmI2NzFkZWZmNGMwM2E0ZDRhMGExMzE1ZGZmOThkNTczMmMgQzA5NQlmaWxlMAlmaWxlMQorOjEwMDY0NCAxMDA2NDQgZjVkZWFjN2JlNTllN2VlYWI4NjU3ZmQ5YWU3MDZmZDZhNTdkYWVkMiA1OWY4MzJlNWM4YjNmN2U0ODZiZTE1YWQwY2QzZTk1YmE5YWY4OTk4IFIwOTUJZmlsZTAJZmlsZTIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgcmVzdWx0IG9mIC1CIC1NICgjOSknIFwKKyAgICAnY29tcGFyZV9kaWZmX3JhdyBleHBlY3RlZCBjdXJyZW50JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQwMDktZGlmZi1yZW5hbWUtNC5zaCBiL3QvdDQwMDktZGlmZi1yZW5hbWUtNC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjJmOGIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAwOS1kaWZmLXJlbmFtZS00LnNoCkBAIC0wLDAgKzEsOTUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nU2FtZSByZW5hbWUgZGV0ZWN0aW9uIGFzIHQ0MDAzIGJ1dCB0ZXN0aW5nIGRpZmYtcmF3IC16LgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2ggOyMgdGVzdC1saWIgY2hkaXIncyBpbnRvIHRyYXNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGVjaG8gZnJvdHogPnJlenJvdiAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgQ09QWUlORyByZXpyb3YgJiYKKyAgICB0cmVlPSQoZ2l0LXdyaXRlLXRyZWUpICYmCisgICAgZWNobyAkdHJlZScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgd29yayB0cmVlJyBcCisgICAgJ3NlZCAtZSAncy9IT1dFVkVSL0hvd2V2ZXIvJyA8Q09QWUlORyA+Q09QWUlORy4xICYmCisgICAgc2VkIC1lICdzL0dQTC9HLlAuTC9nJyA8Q09QWUlORyA+Q09QWUlORy4yICYmCisgICAgcm0gLWYgQ09QWUlORyAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLj8nCisKKyMgdHJlZSBoYXMgQ09QWUlORyBhbmQgcmV6cm92LiAgd29yayB0cmVlIGhhcyBDT1BZSU5HLjEgYW5kIENPUFlJTkcuMiwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNheSBDT1BZSU5HLjEKKyMgYW5kIENPUFlJTkcuMiBhcmUgYmFzZWQgb24gQ09QWUlORywgYW5kIGRvIG5vdCBzYXkgYW55dGhpbmcgYWJvdXQKKyMgcmV6cm92LgorCitnaXQtZGlmZi1pbmRleCAteiAtTSAkdHJlZSA+Y3VycmVudAorCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CitDT1BZSU5HCitDT1BZSU5HLjEKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDZjNjc5NjFiYmFlZDM0YTEyN2Y3NmQyNjFmNGMwYmY3M2VkYTQ3MSBSMTIzNAorQ09QWUlORworQ09QWUlORy4yCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIG91dHB1dCBmcm9tIHJlbmFtZS9jb3B5IGRldGVjdGlvbiAoIzEpJyBcCisgICAgJ2NvbXBhcmVfZGlmZl9yYXdfeiBjdXJyZW50IGV4cGVjdGVkJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBhZ2FpbicgXAorICAgICdtdiBDT1BZSU5HLjIgQ09QWUlORyAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIENPUFlJTkcgQ09QWUlORy4xIENPUFlJTkcuMicKKworIyB0cmVlIGhhcyBDT1BZSU5HIGFuZCByZXpyb3YuICB3b3JrIHRyZWUgaGFzIENPUFlJTkcgYW5kIENPUFlJTkcuMSwKKyMgYm90aCBhcmUgc2xpZ2h0bHkgZWRpdGVkLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNheSBDT1BZSU5HLjEKKyMgaXMgYmFzZWQgb24gQ09QWUlORyBhbmQgQ09QWUlORyBpcyBzdGlsbCB0aGVyZSwgYW5kIGRvIG5vdCBzYXkgYW55dGhpbmcKKyMgYWJvdXQgcmV6cm92LgorCitnaXQtZGlmZi1pbmRleCAteiAtQyAkdHJlZSA+Y3VycmVudAorY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDZmZjg3YzQ2NjQ5ODFlNDM5NzYyNTc5MWM4ZWEzYmJiNWYyMjc5YTMgMDZjNjc5NjFiYmFlZDM0YTEyN2Y3NmQyNjFmNGMwYmY3M2VkYTQ3MSBNCitDT1BZSU5HCis6MTAwNjQ0IDEwMDY0NCA2ZmY4N2M0NjY0OTgxZTQzOTc2MjU3OTFjOGVhM2JiYjVmMjI3OWEzIDA2MDNiMzIzOGEwNzZkYzZjODAyMmFlZGM2NjQ4ZmE1MjNhMTcxNzggQzEyMzQKK0NPUFlJTkcKK0NPUFlJTkcuMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd2YWxpZGF0ZSBvdXRwdXQgZnJvbSByZW5hbWUvY29weSBkZXRlY3Rpb24gKCMyKScgXAorICAgICdjb21wYXJlX2RpZmZfcmF3X3ogY3VycmVudCBleHBlY3RlZCcKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHRyZWUgaGFzIENPUFlJTkcgYW5kIHJlenJvdi4gIHdvcmsgdHJlZSBoYXMgdGhlIHNhbWUgQ09QWUlORyBhbmQKKyMgY29weS1lZGl0ZWQgQ09QWUlORy4xLCBhbmQgdW5jaGFuZ2VkIHJlenJvdi4gIFdlIHNob3VsZCBub3Qgc2F5CisjIGFueXRoaW5nIGFib3V0IHJlenJvdiBub3IgQ09QWUlORywgc2luY2UgdGhlIHJldmlzZWQgYWdhaW4gZGlmZi1yYXcKKyMgbm93cyBob3cgdG8gc2F5IENvcHkuCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHdvcmsgdHJlZSBvbmNlIGFnYWluJyBcCisgICAgJ2NhdCAuLi8uLi9DT1BZSU5HID5DT1BZSU5HICYmCisgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgQ09QWUlORyBDT1BZSU5HLjEnCisKK2dpdC1kaWZmLWluZGV4IC16IC1DIC0tZmluZC1jb3BpZXMtaGFyZGVyICR0cmVlID5jdXJyZW50CitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyAwNjAzYjMyMzhhMDc2ZGM2YzgwMjJhZWRjNjY0OGZhNTIzYTE3MTc4IEMxMjM0CitDT1BZSU5HCitDT1BZSU5HLjEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgb3V0cHV0IGZyb20gcmVuYW1lL2NvcHkgZGV0ZWN0aW9uICgjMyknIFwKKyAgICAnY29tcGFyZV9kaWZmX3Jhd196IGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxMC1kaWZmLXBhdGhzcGVjLnNoIGIvdC90NDAxMC1kaWZmLXBhdGhzcGVjLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllMTU0NGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEwLWRpZmYtcGF0aHNwZWMuc2gKQEAgLTAsMCArMSw2NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdQYXRoc3BlYyByZXN0cmljdGlvbnMKKworUHJlcGFyZToKKyAgICAgICAgZmlsZTAKKyAgICAgICAgcGF0aDEvZmlsZTEKKycKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi9kaWZmLWxpYi5zaCA7IyB0ZXN0LWxpYiBjaGRpcidzIGludG8gdHJhc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgc2V0dXAgXAorICAgICdlY2hvIGZyb3R6ID5maWxlMCAmJgorICAgICBta2RpciBwYXRoMSAmJgorICAgICBlY2hvIHJlenJvdiA+cGF0aDEvZmlsZTEgJiYKKyAgICAgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBmaWxlMCBwYXRoMS9maWxlMSAmJgorICAgICB0cmVlPWBnaXQtd3JpdGUtdHJlZWAgJiYKKyAgICAgZWNobyAiJHRyZWUiICYmCisgICAgIGVjaG8gbml0Zm9sID5maWxlMCAmJgorICAgICBlY2hvIHlvbWluID5wYXRoMS9maWxlMSAmJgorICAgICBnaXQtdXBkYXRlLWluZGV4IGZpbGUwIHBhdGgxL2ZpbGUxJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbGltaXQgdG8gcGF0aCBzaG91bGQgc2hvdyBub3RoaW5nJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIHBhdGggPmN1cnJlbnQgJiYKKyAgICAgY29tcGFyZV9kaWZmX3JhdyBjdXJyZW50IGV4cGVjdGVkJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorOjEwMDY0NCAxMDA2NDQgNzY2NDk4ZDkzYTRiMDYwNTdhOGU0OWQyM2Y0MDY4ZjExNzBmZjM4ZiAwYTQxZTExNWFiNjFiZTAzMjhhMTliMjlmMThjZGNiNDkzMzhkNTE2IE0JcGF0aDEvZmlsZTEKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2xpbWl0IHRvIHBhdGgxIHNob3VsZCBzaG93IHBhdGgxL2ZpbGUxJyBcCisgICAgJ2dpdC1kaWZmLWluZGV4IC0tY2FjaGVkICR0cmVlIC0tIHBhdGgxID5jdXJyZW50ICYmCisgICAgIGNvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDc2NjQ5OGQ5M2E0YjA2MDU3YThlNDlkMjNmNDA2OGYxMTcwZmYzOGYgMGE0MWUxMTVhYjYxYmUwMzI4YTE5YjI5ZjE4Y2RjYjQ5MzM4ZDUxNiBNCXBhdGgxL2ZpbGUxCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdsaW1pdCB0byBwYXRoMS8gc2hvdWxkIHNob3cgcGF0aDEvZmlsZTEnIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWUgLS0gcGF0aDEvID5jdXJyZW50ICYmCisgICAgIGNvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKworY2F0ID5leHBlY3RlZCA8PFxFT0YKKzoxMDA2NDQgMTAwNjQ0IDc2NjQ5OGQ5M2E0YjA2MDU3YThlNDlkMjNmNDA2OGYxMTcwZmYzOGYgMGE0MWUxMTVhYjYxYmUwMzI4YTE5YjI5ZjE4Y2RjYjQ5MzM4ZDUxNiBNCWZpbGUwCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdsaW1pdCB0byBmaWxlMCBzaG91bGQgc2hvdyBmaWxlMCcgXAorICAgICdnaXQtZGlmZi1pbmRleCAtLWNhY2hlZCAkdHJlZSAtLSBmaWxlMCA+Y3VycmVudCAmJgorICAgICBjb21wYXJlX2RpZmZfcmF3IGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdsaW1pdCB0byBmaWxlMC8gc2hvdWxkIGVtaXQgbm90aGluZy4nIFwKKyAgICAnZ2l0LWRpZmYtaW5kZXggLS1jYWNoZWQgJHRyZWUgLS0gZmlsZTAvID5jdXJyZW50ICYmCisgICAgIGNvbXBhcmVfZGlmZl9yYXcgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDExLWRpZmYtc3ltbGluay5zaCBiL3QvdDQwMTEtZGlmZi1zeW1saW5rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3OWE4MzEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDExLWRpZmYtc3ltbGluay5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvaGFubmVzIFNjaGluZGVsaW4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdCBkaWZmIG9mIHN5bWxpbmtzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vZGlmZi1saWIuc2gKKworY2F0ID4gZXhwZWN0ZWQgPDwgRU9GCitkaWZmIC0tZ2l0IGEvZnJvdHogYi9mcm90egorbmV3IGZpbGUgbW9kZSAxMjAwMDAKK2luZGV4IDAwMDAwMDAuLjdjNDY1YWYKKy0tLSAvZGV2L251bGwKKysrKyBiL2Zyb3R6CitAQCAtMCwwICsxIEBACisreHl6enkKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdkaWZmIG5ldyBzeW1saW5rJyBcCisgICAgJ2xuIC1zIHh5enp5IGZyb3R6ICYmCisgICAgZ2l0LXVwZGF0ZS1pbmRleCAmJgorICAgIHRyZWU9JChnaXQtd3JpdGUtdHJlZSkgJiYKKyAgICBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZyb3R6ICYmCisgICAgR0lUX0RJRkZfT1BUUz0tLXVuaWZpZWQ9MCBnaXQtZGlmZi1pbmRleCAtTSAtcCAkdHJlZSA+IGN1cnJlbnQgJiYKKyAgICBjb21wYXJlX2RpZmZfcGF0Y2ggY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgdW5jaGFuZ2VkIHN5bWxpbmsnIFwKKyAgICAndHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorICAgIGdpdC11cGRhdGUtaW5kZXggZnJvdHogJiYKKyAgICB0ZXN0IC16ICIkKGdpdC1kaWZmLWluZGV4IC0tbmFtZS1vbmx5ICR0cmVlKSInCisKK2NhdCA+IGV4cGVjdGVkIDw8IEVPRgorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvZnJvdHoKK2RlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAoraW5kZXggN2M0NjVhZi4uMDAwMDAwMAorLS0tIGEvZnJvdHoKKysrKyAvZGV2L251bGwKK0BAIC0xICswLDAgQEAKKy14eXp6eQorXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2RpZmYgcmVtb3ZlZCBzeW1saW5rJyBcCisgICAgJ3JtIGZyb3R6ICYmCisgICAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPiBjdXJyZW50ICYmCisgICAgY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+IGV4cGVjdGVkIDw8IEVPRgorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvZnJvdHoKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZiBpZGVudGljYWwsIGJ1dCBuZXdseSBjcmVhdGVkIHN5bWxpbmsnIFwKKyAgICAnc2xlZXAgMyAmJgorICAgIGxuIC1zIHh5enp5IGZyb3R6ICYmCisgICAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPiBjdXJyZW50ICYmCisgICAgY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK2NhdCA+IGV4cGVjdGVkIDw8IEVPRgorZGlmZiAtLWdpdCBhL2Zyb3R6IGIvZnJvdHoKK2luZGV4IDdjNDY1YWYuLmRmMWRiNTQgMTIwMDAwCistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xICsxIEBACisteHl6enkKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorK3l4eXl6CitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZGlmZiBkaWZmZXJlbnQgc3ltbGluaycgXAorICAgICdybSBmcm90eiAmJgorICAgIGxuIC1zIHl4eXl6IGZyb3R6ICYmCisgICAgZ2l0LWRpZmYtaW5kZXggLU0gLXAgJHRyZWUgPiBjdXJyZW50ICYmCisgICAgY29tcGFyZV9kaWZmX3BhdGNoIGN1cnJlbnQgZXhwZWN0ZWQnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxMi1kaWZmLWJpbmFyeS5zaCBiL3QvdDQwMTItZGlmZi1iaW5hcnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzIzNjA2YwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTItZGlmZi1iaW5hcnkuc2gKQEAgLTAsMCArMSw4MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdCaW5hcnkgZGlmZiBhbmQgYXBwbHkKKycKKworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmUgcmVwb3NpdG9yeScgXAorCSdlY2hvIEFJVCA+YSAmJiBlY2hvIEJJVCA+YiAmJiBlY2hvIENJVCA+YyAmJiBlY2hvIERJVCA+ZCAmJgorCSBnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGEgYiBjIGQgJiYKKwkgZWNobyBnaXQgPmEgJiYKKwkgY2F0IC4uL3Rlc3Q0MDEyLnBuZyA+YiAmJgorCSBlY2hvIGdpdCA+YyAmJgorCSBjYXQgYiBiID5kJworCitjYXQgPiBleHBlY3RlZCA8PFxFT0YKKyBhIHwgICAgMiArLQorIGIgfCAgQmluCisgYyB8ICAgIDIgKy0KKyBkIHwgIEJpbgorIDQgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQorRU9GCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaWZmIHdpdGhvdXQgLS1iaW5hcnknIFwKKwknZ2l0LWRpZmYgfCBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA+Y3VycmVudCAmJgorCSBjbXAgY3VycmVudCBleHBlY3RlZCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlmZiB3aXRoIC0tYmluYXJ5JyBcCisJJ2dpdC1kaWZmIC0tYmluYXJ5IHwgZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPmN1cnJlbnQgJiYKKwkgY21wIGN1cnJlbnQgZXhwZWN0ZWQnCisKKyMgYXBwbHkgbmVlZHMgdG8gYmUgYWJsZSB0byBza2lwIHRoZSBiaW5hcnkgbWF0ZXJpYWwgY29ycmVjdGx5CisjIGluIG9yZGVyIHRvIHJlcG9ydCB0aGUgbGluZSBudW1iZXIgb2YgYSBjb3JydXB0IHBhdGNoLgordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgZGV0ZWN0aW5nIGNvcnJ1cHQgcGF0Y2ggY29ycmVjdGx5JyBcCisJJ2dpdC1kaWZmIHwgc2VkIC1lICdzLy1DSVQveENJVC8nID5icm9rZW4gJiYKKwkgaWYgZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgYnJva2VuIDI+ZGV0ZWN0ZWQKKwkgdGhlbgorCQllY2hvIHVuaGFwcHkgLSBzaG91bGQgaGF2ZSBkZXRlY3RlZCBhbiBlcnJvcgorCQkoZXhpdCAxKQorCSBlbHNlCisJCWVjaG8gaGFwcHkKKwkgZmkgJiYKKwkgZGV0ZWN0ZWQ9YGNhdCBkZXRlY3RlZGAgJiYKKwkgZGV0ZWN0ZWQ9YGV4cHIgIiRkZXRlY3RlZCIgOiAiZmF0YWwuKmF0IGxpbmUgXFwoWzAtOV0qXFwpXCQiYCAmJgorCSBkZXRlY3RlZD1gc2VkIC1uZSAiJHtkZXRlY3RlZH1wIiBicm9rZW5gICYmCisJIHRlc3QgIiRkZXRlY3RlZCIgPSB4Q0lUJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBkZXRlY3RpbmcgY29ycnVwdCBwYXRjaCBjb3JyZWN0bHknIFwKKwknZ2l0LWRpZmYgLS1iaW5hcnkgfCBzZWQgLWUgJ3MvLUNJVC94Q0lULycgPmJyb2tlbiAmJgorCSBpZiBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBicm9rZW4gMj5kZXRlY3RlZAorCSB0aGVuCisJCWVjaG8gdW5oYXBweSAtIHNob3VsZCBoYXZlIGRldGVjdGVkIGFuIGVycm9yCisJCShleGl0IDEpCisJIGVsc2UKKwkJZWNobyBoYXBweQorCSBmaSAmJgorCSBkZXRlY3RlZD1gY2F0IGRldGVjdGVkYCAmJgorCSBkZXRlY3RlZD1gZXhwciAiJGRldGVjdGVkIiA6ICJmYXRhbC4qYXQgbGluZSBcXChbMC05XSpcXClcJCJgICYmCisJIGRldGVjdGVkPWBzZWQgLW5lICIke2RldGVjdGVkfXAiIGJyb2tlbmAgJiYKKwkgdGVzdCAiJGRldGVjdGVkIiA9IHhDSVQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXRpYWwgY29tbWl0JyAnZ2l0LWNvbW1pdCAtYSAtbSBpbml0aWFsJworCisjIFRyeSByZW1vdmFsIChiKSwgbW9kaWZpY2F0aW9uIChkKSwgYW5kIGNyZWF0aW9uIChlKS4KK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2RpZmYtaW5kZXggd2l0aCAtLWJpbmFyeScgXAorCSdlY2hvIEFJVCA+YSAmJiBtdiBiIGUgJiYgZWNobyBDSVQgPmMgJiYgY2F0IGUgPmQgJiYKKwkgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCAtLXJlbW92ZSBhIGIgYyBkIGUgJiYKKwkgdHJlZTA9YGdpdC13cml0ZS10cmVlYCAmJgorCSBnaXQtZGlmZiAtLWNhY2hlZCAtLWJpbmFyeSA+Y3VycmVudCAmJgorCSBnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgcGF0Y2gnIFwKKwknZ2l0LXJlc2V0IC0taGFyZCAmJgorCSBnaXQtYXBwbHkgLS1iaW5hcnkgLS1pbmRleCA8Y3VycmVudCAmJgorCSB0cmVlMT1gZ2l0LXdyaXRlLXRyZWVgICYmCisJIHRlc3QgIiR0cmVlMSIgPSAiJHRyZWUwIicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MDEzLWRpZmYtdmFyaW91cy5zaCBiL3QvdDQwMTMtZGlmZi12YXJpb3VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxYzQ1NDMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzLWRpZmYtdmFyaW91cy5zaApAQCAtMCwwICsxLDI1MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdWYXJpb3VzIGRpZmYgZm9ybWF0dGluZyBvcHRpb25zJworCisuIC4vdGVzdC1saWIuc2gKKworTEY9JworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCUdJVF9BVVRIT1JfREFURT0iMjAwNi0wNi0yNiAwMDowMDowMCArMDAwMCIgJiYKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDA6MDAgKzAwMDAiICYmCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURSBHSVRfQ09NTUlUVEVSX0RBVEUgJiYKKworCW1rZGlyIGRpciAmJgorCWZvciBpIGluIDEgMiAzOyBkbyBlY2hvICRpOyBkb25lID5maWxlMCAmJgorCWZvciBpIGluIEEgQjsgZG8gZWNobyAkaTsgZG9uZSA+ZGlyL3N1YiAmJgorCWNhdCBmaWxlMCA+ZmlsZTIgJiYKKwlnaXQgYWRkIGZpbGUwIGZpbGUyIGRpci9zdWIgJiYKKwlnaXQgY29tbWl0IC1tIEluaXRpYWwgJiYKKworCWdpdCBicmFuY2ggaW5pdGlhbCAmJgorCWdpdCBicmFuY2ggc2lkZSAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAxOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMTowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZm9yIGkgaW4gNCA1IDY7IGRvIGVjaG8gJGk7IGRvbmUgPj5maWxlMCAmJgorCWZvciBpIGluIEMgRDsgZG8gZWNobyAkaTsgZG9uZSA+PmRpci9zdWIgJiYKKwlybSAtZiBmaWxlMiAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgZmlsZTAgZmlsZTIgZGlyL3N1YiAmJgorCWdpdCBjb21taXQgLW0gIlNlY29uZCR7TEZ9JHtMRn1UaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LiIgJiYKKworCUdJVF9BVVRIT1JfREFURT0iMjAwNi0wNi0yNiAwMDowMjowMCArMDAwMCIgJiYKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDI6MDAgKzAwMDAiICYmCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURSBHSVRfQ09NTUlUVEVSX0RBVEUgJiYKKworCWZvciBpIGluIEEgQiBDOyBkbyBlY2hvICRpOyBkb25lID5maWxlMSAmJgorCWdpdCBhZGQgZmlsZTEgJiYKKwlmb3IgaSBpbiBFIEY7IGRvIGVjaG8gJGk7IGRvbmUgPj5kaXIvc3ViICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBkaXIvc3ViICYmCisJZ2l0IGNvbW1pdCAtbSBUaGlyZCAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjAzOjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowMzowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlmb3IgaSBpbiBBIEIgQzsgZG8gZWNobyAkaTsgZG9uZSA+PmZpbGUwICYmCisJZm9yIGkgaW4gMSAyOyBkbyBlY2hvICRpOyBkb25lID4+ZGlyL3N1YiAmJgorCWNhdCBkaXIvc3ViID5maWxlMyAmJgorCWdpdCBhZGQgZmlsZTMgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUwIGRpci9zdWIgJiYKKwlnaXQgY29tbWl0IC1tIFNpZGUgJiYKKworCUdJVF9BVVRIT1JfREFURT0iMjAwNi0wNi0yNiAwMDowNDowMCArMDAwMCIgJiYKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IjIwMDYtMDYtMjYgMDA6MDQ6MDAgKzAwMDAiICYmCisJZXhwb3J0IEdJVF9BVVRIT1JfREFURSBHSVRfQ09NTUlUVEVSX0RBVEUgJiYKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgcHVsbCAtcyBvdXJzIC4gc2lkZSAmJgorCisJR0lUX0FVVEhPUl9EQVRFPSIyMDA2LTA2LTI2IDAwOjA1OjAwICswMDAwIiAmJgorCUdJVF9DT01NSVRURVJfREFURT0iMjAwNi0wNi0yNiAwMDowNTowMCArMDAwMCIgJiYKKwlleHBvcnQgR0lUX0FVVEhPUl9EQVRFIEdJVF9DT01NSVRURVJfREFURSAmJgorCisJZm9yIGkgaW4gQSBCIEM7IGRvIGVjaG8gJGk7IGRvbmUgPj5maWxlMCAmJgorCWZvciBpIGluIDEgMjsgZG8gZWNobyAkaTsgZG9uZSA+PmRpci9zdWIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUwIGRpci9zdWIgJiYKKworCWdpdCBjb21taXQgLS1hbWVuZCAmJgorCWdpdCBzaG93LWJyYW5jaAorJworCis6IDw8XEVPRgorISBbaW5pdGlhbF0gSW5pdGlhbAorICogW21hc3Rlcl0gTWVyZ2UgYnJhbmNoICdzaWRlJworICAhIFtzaWRlXSBTaWRlCistLS0KKyAtICBbbWFzdGVyXSBNZXJnZSBicmFuY2ggJ3NpZGUnCisgKisgW3NpZGVdIFNpZGUKKyAqICBbbWFzdGVyXl0gU2Vjb25kCisrKisgW2luaXRpYWxdIEluaXRpYWwKK0VPRgorCitWPWBnaXQgdmVyc2lvbiB8IHNlZCAtZSAncy9eZ2l0IHZlcnNpb24gLy8nIC1lICdzL1wuL1xcLi9nJ2AKK3doaWxlIHJlYWQgY21kCitkbworCWNhc2UgIiRjbWQiIGluCisJJycgfCAnIycqKSBjb250aW51ZSA7OworCWVzYWMKKwl0ZXN0PWBlY2hvICIkY21kIiB8IHNlZCAtZSAnc3xbLyBdWy8gXSp8X3xnJ2AKKwljbnQ9YGV4cHIgJHRlc3RfY291bnQgKyAxYAorCXBmeD1gcHJpbnRmICIlMDRkIiAkY250YAorCWV4cGVjdD0iLi4vdDQwMTMvZGlmZi4kdGVzdCIKKwlhY3R1YWw9IiRwZngtZGlmZi4kdGVzdCIKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdpdCAkY21kIiAnCisJCXsKKwkJCWVjaG8gIlwkIGdpdCAkY21kIgorCQkJZ2l0ICRjbWQgfAorCQkJc2VkIC1lICJzL15cXCgtKlxcKSRWXFwoLSpcXClcJC9cXDFnLWktdC0tdi1lLXItcy1pLW8tblwyLyIgXAorCQkJICAgIC1lICJzL15cXCggKmJvdW5kYXJ5PVwiLSpcXCkkVlxcKC0qXFwpXCJcJC9cXDFnLWktdC0tdi1lLXItcy1pLW8tblwyXCIvIgorCQkJZWNobyAiXCQiCisJCX0gPiIkYWN0dWFsIiAmJgorCQlpZiB0ZXN0IC1mICIkZXhwZWN0IgorCQl0aGVuCisJCQlkaWZmIC11ICIkZXhwZWN0IiAiJGFjdHVhbCIgJiYKKwkJCXJtIC1mICIkYWN0dWFsIgorCQllbHNlCisJCQkjIHRoaXMgaXMgdG8gaGVscCBkZXZlbG9waW5nIG5ldyB0ZXN0cy4KKwkJCWNwICIkYWN0dWFsIiAiJGV4cGVjdCIKKwkJCWZhbHNlCisJCWZpCisJJworZG9uZSA8PFxFT0YKK2RpZmYtdHJlZSBpbml0aWFsCitkaWZmLXRyZWUgLXIgaW5pdGlhbAorZGlmZi10cmVlIC1yIC0tYWJicmV2IGluaXRpYWwKK2RpZmYtdHJlZSAtciAtLWFiYnJldj00IGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtLWFiYnJldiBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC1yIGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgLXIgLS1hYmJyZXYgaW5pdGlhbAorZGlmZi10cmVlIC0tcm9vdCAtciAtLWFiYnJldj00IGluaXRpYWwKK2RpZmYtdHJlZSAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC1wIGluaXRpYWwKK2RpZmYtdHJlZSAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCitkaWZmLXRyZWUgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKK2RpZmYtdHJlZSAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKK2RpZmYtdHJlZSAtLXJvb3QgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCisKK2RpZmYtdHJlZSAtLXByZXR0eSBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1zdGF0IGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXN1bW1hcnkgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tc3RhdCAtLXN1bW1hcnkgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtcCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tc3RhdCBpbml0aWFsCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXN1bW1hcnkgaW5pdGlhbAorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdW1tYXJ5IC1yIGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdGF0IC0tc3VtbWFyeSBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLXAgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC1wIGluaXRpYWwKK2RpZmYtdHJlZSAtLXByZXR0eT1vbmVsaW5lIC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCitkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgLS1wYXRjaC13aXRoLXJhdyBpbml0aWFsCisKK2RpZmYtdHJlZSAtLXByZXR0eSBzaWRlCitkaWZmLXRyZWUgLS1wcmV0dHkgLXAgc2lkZQorZGlmZi10cmVlIC0tcHJldHR5IC0tcGF0Y2gtd2l0aC1zdGF0IHNpZGUKKworZGlmZi10cmVlIG1hc3RlcgorZGlmZi10cmVlIC1wIG1hc3RlcgorZGlmZi10cmVlIC1wIC1tIG1hc3RlcgorZGlmZi10cmVlIC1jIG1hc3RlcgorZGlmZi10cmVlIC1jIC0tYWJicmV2IG1hc3RlcgorZGlmZi10cmVlIC0tY2MgbWFzdGVyCisjIHN0YXQgb25seSBzaG91bGQgc2hvdyB0aGUgZGlmZnN0YXQgd2l0aCB0aGUgZmlyc3QgcGFyZW50CitkaWZmLXRyZWUgLWMgLS1zdGF0IG1hc3RlcgorZGlmZi10cmVlIC0tY2MgLS1zdGF0IG1hc3RlcgorZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitkaWZmLXRyZWUgLS1jYyAtLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBzdGF0IHN1bW1hcnkgc2hvdWxkIHNob3cgdGhlIGRpZmZzdGF0IGFuZCBzdW1tYXJ5IHdpdGggdGhlIGZpcnN0IHBhcmVudAorZGlmZi10cmVlIC1jIC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorZGlmZi10cmVlIC0tY2MgLS1zdGF0IC0tc3VtbWFyeSBzaWRlCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCisjIGltcHJvdmVkIGJ5IFRpbW8ncyBwYXRjaAorZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyB0aGlzIGlzIGNvcnJlY3QKK2RpZmYtdHJlZSAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBzaWRlCisKK2xvZyBtYXN0ZXIKK2xvZyAtcCBtYXN0ZXIKK2xvZyAtLXJvb3QgbWFzdGVyCitsb2cgLS1yb290IC1wIG1hc3RlcgorbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorbG9nIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKK2xvZyAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2xvZyAtLXJvb3QgLWMgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK2xvZyAtLXJvb3QgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitsb2cgLVNGIG1hc3RlcgorbG9nIC1TRiAtcCBtYXN0ZXIKKword2hhdGNoYW5nZWQgbWFzdGVyCit3aGF0Y2hhbmdlZCAtcCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcm9vdCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcm9vdCAtcCBtYXN0ZXIKK3doYXRjaGFuZ2VkIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3Rlcgord2hhdGNoYW5nZWQgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3Rlcgord2hhdGNoYW5nZWQgLS1yb290IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKKyMgaW1wcm92ZWQgYnkgVGltbydzIHBhdGNoCit3aGF0Y2hhbmdlZCAtLXJvb3QgLWMgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorIyBpbXByb3ZlZCBieSBUaW1vJ3MgcGF0Y2gKK3doYXRjaGFuZ2VkIC0tcm9vdCAtLWNjIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK3doYXRjaGFuZ2VkIC1TRiBtYXN0ZXIKK3doYXRjaGFuZ2VkIC1TRiAtcCBtYXN0ZXIKKworbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlciAtLSBkaXIvCit3aGF0Y2hhbmdlZCAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIgLS0gZGlyLworbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIgLS0gZGlyLword2hhdGNoYW5nZWQgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlciAtLSBkaXIvCisKK3Nob3cgaW5pdGlhbAorc2hvdyAtLXJvb3QgaW5pdGlhbAorc2hvdyBzaWRlCitzaG93IG1hc3Rlcgorc2hvdyAtLXN0YXQgc2lkZQorc2hvdyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK3Nob3cgLS1wYXRjaC13aXRoLXN0YXQgc2lkZQorc2hvdyAtLXBhdGNoLXdpdGgtcmF3IHNpZGUKK3Nob3cgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IHNpZGUKKworZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IGluaXRpYWwuLnNpZGUKK2Zvcm1hdC1wYXRjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeCitmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyCitmb3JtYXQtcGF0Y2ggLS1hdHRhY2ggLS1zdGRvdXQgaW5pdGlhbC4uc2lkZQorZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3Rlcl4KK2Zvcm1hdC1wYXRjaCAtLWF0dGFjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXIKKworZGlmZiAtLWFiYnJldiBpbml0aWFsLi5zaWRlCitkaWZmIC1yIGluaXRpYWwuLnNpZGUKK2RpZmYgLS1zdGF0IGluaXRpYWwuLnNpZGUKK2RpZmYgLXIgLS1zdGF0IGluaXRpYWwuLnNpZGUKK2RpZmYgaW5pdGlhbC4uc2lkZQorZGlmZiAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsLi5zaWRlCitkaWZmIC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbC4uc2lkZQorZGlmZiAtLXBhdGNoLXdpdGgtc3RhdCAtciBpbml0aWFsLi5zaWRlCitkaWZmIC0tcGF0Y2gtd2l0aC1yYXcgLXIgaW5pdGlhbC4uc2lkZQorRU9GCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTlmNzhhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tY2MgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1jYyBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY2MgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxYWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfc2lkZQpAQCAtMCwwICsxLDM5IEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgc2lkZQorYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYyM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpAQCAtMCwwICsxLDM0IEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY2MgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNjIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmViM2IKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyAtLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM2MmJlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF8tLXN1bW1hcnlfc2lkZQpAQCAtMCwwICsxLDggQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLWNjIC0tc3RhdCAtLXN1bW1hcnkgc2lkZQorYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfLS1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU3ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLWNjXy0tc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmLXRyZWUgLS1jYyAtLXN0YXQgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1jY19tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlY2I0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tY2NfbWFzdGVyCkBAIC0wLDAgKzEsMzAgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLWNjIG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorZGlmZiAtLWNjIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jYyBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxNzdhYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTA1YjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiOGI0NQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkZGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc5ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKQEAgLTAsMCArMSwzMyBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYSBJbml0aWFsCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDM1ZDI0MmJhNzlhZTg5YWM2OTVlMjZiM2Q0YzI3YThlNmYwMjhmOWUgQQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjMzMzYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDM0IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYSBJbml0aWFsCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy1wX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfLS1yb290Xy1wX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1MDkyYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfLXBfaW5pdGlhbApAQCAtMCwwICsxLDI5IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSAtLXJvb3QgLXAgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYSBJbml0aWFsCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tLXJvb3RfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkyMGFjCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy0tcm9vdF9pbml0aWFsCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLS1yb290IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EgSW5pdGlhbAorOjAwMDAwMCAwNDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBkYTdhMzNmYTc3ZDgwNjZkNjY5ODY0Mzk0MGNlNTg2MGZlMmQ3ZmIzIEEJZGlyCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lXy1wX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNzZiZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHk9b25lbGluZV8tcF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5PW9uZWxpbmUgLXAgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5PW9uZWxpbmVfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTA5NzBkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eT1vbmVsaW5lX2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHk9b25lbGluZSBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODUzMTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTA4MjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tcGF0Y2gtd2l0aC1zdGF0IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1wYXRjaC13aXRoLXN0YXRfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDMwZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXBhdGNoLXdpdGgtc3RhdF9zaWRlCkBAIC0wLDAgKzEsNDMgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXBhdGNoLXdpdGgtc3RhdCBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyMDNiZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApAQCAtMCwwICsxLDM4IEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCisKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMzVkMjQyYmE3OWFlODlhYzY5NWUyNmIzZDRjMjdhOGU2ZjAyOGY5ZSBBCWRpci9zdWIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmE2YWYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMzkgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgaW5pdGlhbAorY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JmY2UyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1zdGF0Xy0tc3VtbWFyeV9pbml0aWFsCkBAIC0wLDAgKzEsMTUgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdGF0IC0tc3VtbWFyeSBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1zdGF0X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1NGFhNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3RhdF9pbml0aWFsCkBAIC0wLDAgKzEsMTIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdGF0IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV8tcl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1zdW1tYXJ5Xy1yX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYWFmYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV8tcl9pbml0aWFsCkBAIC0wLDAgKzEsMTEgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdW1tYXJ5IC1yIGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLS1zdW1tYXJ5X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0ODIwNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy0tc3VtbWFyeV9pbml0aWFsCkBAIC0wLDAgKzEsMTEgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXJvb3QgLS1zdW1tYXJ5IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCisgY3JlYXRlIG1vZGUgMDQwMDAwIGRpcgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfLXBfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy1wX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0MTFmNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1yb290Xy1wX2luaXRpYWwKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC0tcm9vdCAtcCBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tcm9vdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGUzMmVhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXJvb3RfaW5pdGlhbApAQCAtMCwwICsxLDExIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1yb290IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCis6MDAwMDAwIDA0MDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIGRhN2EzM2ZhNzdkODA2NmQ2Njk4NjQzOTQwY2U1ODYwZmUyZDdmYjMgQQlkaXIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN0YXRfLS1zdW1tYXJ5X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF8tLXN1bW1hcnlfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI5ODNhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN0YXRfLS1zdW1tYXJ5X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1zdGF0IC0tc3VtbWFyeSBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5Xy0tc3RhdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN0YXRfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmRjZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN0YXRfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtLXN0YXQgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tLXN1bW1hcnlfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1zdW1tYXJ5X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjMmM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLS1zdW1tYXJ5X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgLS1zdW1tYXJ5IGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLXBfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLXBfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzk5NDJmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IC1wIGluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLXBfc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1wcmV0dHlfLXBfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTkzYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV8tcF9zaWRlCkBAIC0wLDAgKzEsMzggQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXByZXR0eSAtcCBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzE1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLS1wcmV0dHkgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV9zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXByZXR0eV9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjZlMWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcHJldHR5X3NpZGUKQEAgLTAsMCArMSwxMSBAQAorJCBnaXQgZGlmZi10cmVlIC0tcHJldHR5IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCis6MDQwMDAwIDA0MDAwMCBkYTdhMzNmYTc3ZDgwNjZkNjY5ODY0Mzk0MGNlNTg2MGZlMmQ3ZmIzIGY5NzdlZDQ2YWU2ODczYzFjMzBhYjg3OGUxNWE0YWNjZWRjMzYxOGIgTQlkaXIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgZjQ2MTVkYTY3NGMwOWRmMzIyZDZiYThkNmIyMWVjZmIxYjFiYTUxMCBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDcyODllMzViZmYzMjcyN2MwOGRkYTIwNzUxMWJlYzEzOGZkYjllYTUgQQlmaWxlMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1hYmJyZXZfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tYWJicmV2X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhODRiMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tYWJicmV2X2luaXRpYWwKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmLXRyZWUgLS1yb290IC0tYWJicmV2IGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKKzowMDAwMDAgMDQwMDAwIDAwMDAwMDAuLi4gZGE3YTMzZi4uLiBBCWRpcgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDFlNzljMy4uLiBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5NWU0NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1yYXdfaW5pdGlhbApAQCAtMCwwICsxLDMzIEBACiskIGdpdCBkaWZmLXRyZWUgLS1yb290IC0tcGF0Y2gtd2l0aC1yYXcgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWQyNDJiYTc5YWU4OWFjNjk1ZTI2YjNkNGMyN2E4ZTZmMDI4ZjllIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbCBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2MmI2MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgZGlmZi10cmVlIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsCis0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXBfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjE5YzcyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXBfaW5pdGlhbApAQCAtMCwwICsxLDI5IEBACiskIGdpdCBkaWZmLXRyZWUgLS1yb290IC1wIGluaXRpYWwKKzQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXJfLS1hYmJyZXY9NF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXJfLS1hYmJyZXY9NF9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNTM2MTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldj00X2luaXRpYWwKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmLXRyZWUgLS1yb290IC1yIC0tYWJicmV2PTQgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAxMDA2NDQgMDAwMC4uLiAzNWQyLi4uIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMC4uLiAwMWU3Li4uIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAuLi4gMDFlNy4uLiBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl8tLWFiYnJldl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXJfLS1hYmJyZXZfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I0NjBmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXJfLS1hYmJyZXZfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXIgLS1hYmJyZXYgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAzNWQyNDJiLi4uIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDFlNzljMy4uLiBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF8tcl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXJfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQ0MzVlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfLXJfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgLXIgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAzNWQyNDJiYTc5YWU4OWFjNjk1ZTI2YjNkNGMyN2E4ZTZmMDI4ZjllIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDFlNzljMzJhOGM5OWM1NTdmMDc1N2RhN2NiNmQ2NWIzNDE0NDY2ZCBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy0tcm9vdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfaW5pdGlhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGY2YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tLXJvb3RfaW5pdGlhbApAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtLXJvb3QgaW5pdGlhbAorNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorOjAwMDAwMCAwNDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBkYTdhMzNmYTc3ZDgwNjZkNjY5ODY0Mzk0MGNlNTg2MGZlMmQ3ZmIzIEEJZGlyCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxZTc5YzMyYThjOTljNTU3ZjA3NTdkYTdjYjZkNjViMzQxNDQ2NmQgQQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMWU3OWMzMmE4Yzk5YzU1N2YwNzU3ZGE3Y2I2ZDY1YjM0MTQ0NjZkIEEJZmlsZTIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1hYmJyZXZfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLWFiYnJldl9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhlNGFhMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1hYmJyZXZfbWFzdGVyCkBAIC0wLDAgKzEsNSBAQAorJCBnaXQgZGlmZi10cmVlIC1jIC0tYWJicmV2IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorOjoxMDA2NDQgMTAwNjQ0IDEwMDY0NCBjZWFkMzJlLi4uIDcyODllMzUuLi4gOTkyOTEzYy4uLiBNTQlkaXIvc3ViCis6OjEwMDY0NCAxMDA2NDQgMTAwNjQ0IGI0MTQxMDguLi4gZjQ2MTVkYS4uLiAxMGE4YTlmLi4uIE1NCWZpbGUwCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzlmNjQxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpAQCAtMCwwICsxLDYgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtYyAtLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmNjYTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jXy0tc3RhdF8tLXN1bW1hcnlfc2lkZQpAQCAtMCwwICsxLDggQEAKKyQgZ2l0IGRpZmYtdHJlZSAtYyAtLXN0YXQgLS1zdW1tYXJ5IHNpZGUKK2M3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLWNfLS1zdGF0X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmZlNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY18tLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZi10cmVlIC1jIC0tc3RhdCBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY19tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1jX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQyYmIyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tY19tYXN0ZXIKQEAgLTAsMCArMSw1IEBACiskIGdpdCBkaWZmLXRyZWUgLWMgbWFzdGVyCis1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0Cis6OjEwMDY0NCAxMDA2NDQgMTAwNjQ0IGNlYWQzMmU5MjViMTQyMGM4NGMxNGNiZjdjZjc1NWU3ZTQ1YWY4YWQgNzI4OWUzNWJmZjMyNzI3YzA4ZGRhMjA3NTExYmVjMTM4ZmRiOWVhNSA5OTI5MTNjNWFhMGE1NDc2ZDEwYzQ5ZWQwZjIxZmMwYzZkMWFlZGYzIE1NCWRpci9zdWIKKzo6MTAwNjQ0IDEwMDY0NCAxMDA2NDQgYjQxNDEwOGU4MWU1MDkxZmUwOTc0YTE4NThiNGQwZDIyYjEwN2Y3MCBmNDYxNWRhNjc0YzA5ZGYzMjJkNmJhOGQ2YjIxZWNmYjFiMWJhNTEwIDEwYThhOWYzNjU3ZjkxYTE1NmI5ZjAxODRlZDc5YTIwYWRlZjlmN2YgTU0JZmlsZTAKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfLW1fbWFzdGVyIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcF8tbV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwYmVhMAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfLW1fbWFzdGVyCkBAIC0wLDAgKzEsODAgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtcCAtbSBtYXN0ZXIKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggY2VhZDMyZS4uOTkyOTEzYyAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC00LDMgKzQsNSBAQCBDCisgRAorIEUKKyBGCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCBiNDE0MTA4Li4xMGE4YTlmIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtNCwzICs0LDYgQEAKKyA0CisgNQorIDYKKytBCisrQgorK0MKKzU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggNzI4OWUzNS4uOTkyOTEzYyAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDQgKzEsOCBAQAorIEEKKyBCCisrQworK0QKKytFCisrRgorIDEKKyAyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggZjQ2MTVkYS4uMTBhOGE5ZiAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsNiArMSw5IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CisgQQorIEIKKyBDCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDcyODllMzUuLjAwMDAwMDAKKy0tLSBhL2ZpbGUzCisrKysgL2Rldi9udWxsCitAQCAtMSw0ICswLDAgQEAKKy1BCistQgorLTEKKy0yCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1wX2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1wX2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwY2U4OAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfaW5pdGlhbApAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtcCBpbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1wX21hc3RlciBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxODI4NzUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1wX21hc3RlcgpAQCAtMCwwICsxLDIgQEAKKyQgZ2l0IGRpZmYtdHJlZSAtcCBtYXN0ZXIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXJfLS1hYmJyZXY9NF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldj00X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhM2FhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmLXRyZWVfLXJfLS1hYmJyZXY9NF9pbml0aWFsCkBAIC0wLDAgKzEsMiBAQAorJCBnaXQgZGlmZi10cmVlIC1yIC0tYWJicmV2PTQgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl8tLWFiYnJldl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yXy0tYWJicmV2X2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLXIgLS1hYmJyZXYgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV8tcl9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjVkODMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlXy1yX2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgLXIgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV9pbml0aWFsIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV9pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OWZjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX2luaXRpYWwKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgaW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZGlmZi10cmVlX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTkyMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmYtdHJlZV9tYXN0ZXIKQEAgLTAsMCArMSwyIEBACiskIGdpdCBkaWZmLXRyZWUgbWFzdGVyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tLWFiYnJldl9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1hYmJyZXZfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODhlNjZmCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1hYmJyZXZfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDMyIEBACiskIGdpdCBkaWZmIC0tYWJicmV2IGluaXRpYWwuLnNpZGUKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1yYXdfLXJfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1yYXdfLXJfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkwZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd18tcl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzYgQEAKKyQgZ2l0IGRpZmYgLS1wYXRjaC13aXRoLXJhdyAtciBpbml0aWFsLi5zaWRlCis6MTAwNjQ0IDEwMDY0NCAzNWQyNDJiLi4uIDcyODllMzUuLi4gTQlkaXIvc3ViCis6MTAwNjQ0IDEwMDY0NCAwMWU3OWMzLi4uIGY0NjE1ZGEuLi4gTQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiA3Mjg5ZTM1Li4uIEEJZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXJhd19pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMWQ1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtcmF3X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSwzNiBAQAorJCBnaXQgZGlmZiAtLXBhdGNoLXdpdGgtcmF3IGluaXRpYWwuLnNpZGUKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gNzI4OWUzNS4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gZjQ2MTVkYS4uLiBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDcyODllMzUuLi4gQQlmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tLXBhdGNoLXdpdGgtc3RhdF8tcl9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfLXJfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQzMTdhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfLXJfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDM3IEBACiskIGdpdCBkaWZmIC0tcGF0Y2gtd2l0aC1zdGF0IC1yIGluaXRpYWwuLnNpZGUKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLS1wYXRjaC13aXRoLXN0YXRfaW5pdGlhbC4uc2lkZSBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwuLnNpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MDYyOQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tcGF0Y2gtd2l0aC1zdGF0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSwzNyBAQAorJCBnaXQgZGlmZiAtLXBhdGNoLXdpdGgtc3RhdCBpbml0aWFsLi5zaWRlCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmXy0tc3RhdF9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLS1zdGF0X2luaXRpYWwuLnNpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxN2I1ZAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5kaWZmXy0tc3RhdF9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsNiBAQAorJCBnaXQgZGlmZiAtLXN0YXQgaW5pdGlhbC4uc2lkZQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmRpZmZfLXJfLS1zdGF0X2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl8tcl8tLXN0YXRfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDUyMjBkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLXJfLS1zdGF0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSw2IEBACiskIGdpdCBkaWZmIC1yIC0tc3RhdCBpbml0aWFsLi5zaWRlCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZGlmZl8tcl9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmRpZmZfLXJfaW5pdGlhbC4uc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmIyZmUyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmRpZmZfLXJfaW5pdGlhbC4uc2lkZQpAQCAtMCwwICsxLDMyIEBACiskIGdpdCBkaWZmIC1yIGluaXRpYWwuLnNpZGUKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5kaWZmX2luaXRpYWwuLnNpZGUgYi90L3Q0MDEzL2RpZmYuZGlmZl9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWRhZjUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZGlmZl9pbml0aWFsLi5zaWRlCkBAIC0wLDAgKzEsMzIgQEAKKyQgZ2l0IGRpZmYgaW5pdGlhbC4uc2lkZQorZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXIgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc0NWUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXIKQEAgLTAsMCArMSwxNzAgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLWF0dGFjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXIKK0Zyb20gMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAxOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFNlY29uZAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOworIGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsKKyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CisgZmlsZW5hbWU9IjFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFRoaXJkCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7CisgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOworIG5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKKyBmaWxlbmFtZT0iOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMC5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7CisgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsKKyBuYW1lPSJjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhLmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CisgZmlsZW5hbWU9ImM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4gYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLm1hc3Rlcl4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkMWNkMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1hdHRhY2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXgpAQCAtMCwwICsxLDExMCBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLm1hc3Rlcl4KK0Zyb20gMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAxOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFNlY29uZAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOworIGJvdW5kYXJ5PSItLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbiIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtODsgZm9ybWF0PWZpeGVkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQveC1wYXRjaDsKKyBuYW1lPSIxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0LmRpZmYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CisgZmlsZW5hbWU9IjFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQuZGlmZiIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uLS0KKworCisKK0Zyb20gOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAyOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFRoaXJkCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7CisgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBmb3JtYXQ9Zml4ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOworIG5hbWU9IjlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKKyBmaWxlbmFtZT0iOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMC5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworLS0tLS0tLS0tLS0tLS1nLWktdC0tdi1lLXItcy1pLW8tbi0tCisKKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLWF0dGFjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjlkMGIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tYXR0YWNoXy0tc3Rkb3V0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSw2MSBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tYXR0YWNoIC0tc3Rkb3V0IGluaXRpYWwuLnNpZGUKK0Zyb20gYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAzOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFNpZGUKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsKKyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4iCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCistLS0tLS0tLS0tLS0tLWctaS10LS12LWUtci1zLWktby1uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTg7IGZvcm1hdD1maXhlZAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4KK0NvbnRlbnQtVHlwZTogdGV4dC94LXBhdGNoOworIG5hbWU9ImM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEuZGlmZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKKyBmaWxlbmFtZT0iYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YS5kaWZmIgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKKy0tLS0tLS0tLS0tLS0tZy1pLXQtLXYtZS1yLXMtaS1vLW4tLQorCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzMzAyZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyCkBAIC0wLDAgKzEsMTI0IEBACiskIGdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgaW5pdGlhbC4ubWFzdGVyCitGcm9tIDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMTowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTZWNvbmQKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKy0tIAorZy1pLXQtLXYtZS1yLXMtaS1vLW4KKworCitGcm9tIDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMjowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBUaGlyZAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKy0tIAorZy1pLXQtLXYtZS1yLXMtaS1vLW4KKworCitGcm9tIGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMzowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTaWRlCisKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCistLSAKK2ctaS10LS12LWUtci1zLWktby1uCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXiBiL3QvdDQwMTMvZGlmZi5mb3JtYXQtcGF0Y2hfLS1zdGRvdXRfaW5pdGlhbC4ubWFzdGVyXgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2QwZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF9pbml0aWFsLi5tYXN0ZXJeCkBAIC0wLDAgKzEsNzkgQEAKKyQgZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBpbml0aWFsLi5tYXN0ZXJeCitGcm9tIDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMTowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBTZWNvbmQKKworVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKy0tIAorZy1pLXQtLXYtZS1yLXMtaS1vLW4KKworCitGcm9tIDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogTW9uLCAyNiBKdW4gMjAwNiAwMDowMjowMCArMDAwMAorU3ViamVjdDogW1BBVENIXSBUaGlyZAorCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKy0tIAorZy1pLXQtLXYtZS1yLXMtaS1vLW4KKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlIGIvdC90NDAxMy9kaWZmLmZvcm1hdC1wYXRjaF8tLXN0ZG91dF9pbml0aWFsLi5zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGE0NjUKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuZm9ybWF0LXBhdGNoXy0tc3Rkb3V0X2luaXRpYWwuLnNpZGUKQEAgLTAsMCArMSw0NiBAQAorJCBnaXQgZm9ybWF0LXBhdGNoIC0tc3Rkb3V0IGluaXRpYWwuLnNpZGUKK0Zyb20gYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBNb24sIDI2IEp1biAyMDA2IDAwOjAzOjAwICswMDAwCitTdWJqZWN0OiBbUEFUQ0hdIFNpZGUKKworLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKy0tIAorZy1pLXQtLXYtZS1yLXMtaS1vLW4KKworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8gYi90L3Q0MDEzL2RpZmYubG9nXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXJfLS1fZGlyXwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ViOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8KQEAgLTAsMCArMSw3NCBAQAorJCBnaXQgbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIgLS0gZGlyLworY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDc3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlcgpAQCAtMCwwICsxLDEyOSBAQAorJCBnaXQgbG9nIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3Rlcl8tLV9kaXJfIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTg3YTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXJfLS1fZGlyXwpAQCAtMCwwICsxLDc0IEBACiskIGdpdCBsb2cgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyIC0tIGRpci8KK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjQwOTcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwxOTkgQEAKKyQgZ2l0IGxvZyAtLXJvb3QgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1jYyBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY2MgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwNTBhZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwxNjcgQEAKKyQgZ2l0IGxvZyAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGM2YzAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwxNjEgQEAKKyQgZ2l0IGxvZyAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLWNfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0ZTBmMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwxOTkgQEAKKyQgZ2l0IGxvZyAtLXJvb3QgLWMgLS1wYXRjaC13aXRoLXN0YXQgLS1zdW1tYXJ5IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tY29tYmluZWQgZGlyL3N1YgoraW5kZXggY2VhZDMyZSw3Mjg5ZTM1Li45OTI5MTNjCistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQEAgLTEsNiAtMSw0ICsxLDggQEBACisgIEEKKyAgQgorICtDCisgK0QKKyArRQorICtGCisrIDEKKysgMgorZGlmZiAtLWNvbWJpbmVkIGZpbGUwCitpbmRleCBiNDE0MTA4LGY0NjE1ZGEuLjEwYThhOWYKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEBAIC0xLDYgLTEsNiArMSw5IEBAQAorICAxCisgIDIKKyAgMworICs0CisgKzUKKyArNgorKyBBCisrIEIKKysgQworCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1wX21hc3RlciBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290Xy1wX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTdhMmViCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ18tLXJvb3RfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMTQyIEBACiskIGdpdCBsb2cgLS1yb290IC1wIG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy0tcm9vdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3Y2NmYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLS1yb290X21hc3RlcgpAQCAtMCwwICsxLDM0IEBACiskIGdpdCBsb2cgLS1yb290IG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy1TRl8tcF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy1TRl8tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMjQzOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLVNGXy1wX21hc3RlcgpAQCAtMCwwICsxLDE4IEBACiskIGdpdCBsb2cgLVNGIC1wIG1hc3RlcgorY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYubG9nXy1TRl9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nXy1TRl9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE2MmVkMgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLVNGX21hc3RlcgpAQCAtMCwwICsxLDggQEAKKyQgZ2l0IGxvZyAtU0YgbWFzdGVyCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5sb2dfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLmxvZ18tcF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmZWZlZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5sb2dfLXBfbWFzdGVyCkBAIC0wLDAgKzEsMTE1IEBACiskIGdpdCBsb2cgLXAgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLmxvZ19tYXN0ZXIgYi90L3Q0MDEzL2RpZmYubG9nX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ5ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLmxvZ19tYXN0ZXIKQEAgLTAsMCArMSwzNCBAQAorJCBnaXQgbG9nIG1hc3RlcgorY29tbWl0IDU5ZDMxNGFkNmYzNTZkZDA4NjAxYTRjZDVlNTMwMzgxZGEzZTNjNjQKK01lcmdlOiA5YTZkNDk0Li4uIGM3YTJhYjkuLi4KK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowNDowMCAyMDA2ICswMDAwCisKKyAgICBNZXJnZSBicmFuY2ggJ3NpZGUnCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtcmF3X3NpZGUgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtcmF3X3NpZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIxYjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1yYXdfc2lkZQpAQCAtMCwwICsxLDQyIEBACiskIGdpdCBzaG93IC0tcGF0Y2gtd2l0aC1yYXcgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gNzI4OWUzNS4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gZjQ2MTVkYS4uLiBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDcyODllMzUuLi4gQQlmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfc2lkZSBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3N2YyYjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfc2lkZQpAQCAtMCwwICsxLDQ0IEBACiskIGdpdCBzaG93IC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYuc2hvd18tLXBhdGNoLXdpdGgtc3RhdF9zaWRlIGIvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXN0YXRfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE0YzUzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfLS1wYXRjaC13aXRoLXN0YXRfc2lkZQpAQCAtMCwwICsxLDQzIEBACiskIGdpdCBzaG93IC0tcGF0Y2gtd2l0aC1zdGF0IHNpZGUKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93Xy0tcm9vdF9pbml0aWFsIGIvdC90NDAxMy9kaWZmLnNob3dfLS1yb290X2luaXRpYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4OTEzNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tcm9vdF9pbml0aWFsCkBAIC0wLDAgKzEsMzQgQEAKKyQgZ2l0IHNob3cgLS1yb290IGluaXRpYWwKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93Xy0tc3RhdF8tLXN1bW1hcnlfc2lkZSBiL3QvdDQwMTMvZGlmZi5zaG93Xy0tc3RhdF8tLXN1bW1hcnlfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ1OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfLS1zdGF0Xy0tc3VtbWFyeV9zaWRlCkBAIC0wLDAgKzEsMTMgQEAKKyQgZ2l0IHNob3cgLS1zdGF0IC0tc3VtbWFyeSBzaWRlCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLnNob3dfLS1zdGF0X3NpZGUgYi90L3Q0MDEzL2RpZmYuc2hvd18tLXN0YXRfc2lkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjIyMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfLS1zdGF0X3NpZGUKQEAgLTAsMCArMSwxMiBAQAorJCBnaXQgc2hvdyAtLXN0YXQgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93X2luaXRpYWwgYi90L3Q0MDEzL2RpZmYuc2hvd19pbml0aWFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDA2NmEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd19pbml0aWFsCkBAIC0wLDAgKzEsNyBAQAorJCBnaXQgc2hvdyBpbml0aWFsCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93X21hc3RlciBiL3QvdDQwMTMvZGlmZi5zaG93X21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTZlMWYyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLnNob3dfbWFzdGVyCkBAIC0wLDAgKzEsMzYgQEAKKyQgZ2l0IHNob3cgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworZGlmZiAtLWNjIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jYyBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi5zaG93X3NpZGUgYi90L3Q0MDEzL2RpZmYuc2hvd19zaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGEwNzMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYuc2hvd19zaWRlCkBAIC0wLDAgKzEsMzggQEAKKyQgZ2l0IHNob3cgc2lkZQorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyXy0tX2Rpcl8gYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDY3Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3Rlcl8tLV9kaXJfCkBAIC0wLDAgKzEsNjEgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIgLS0gZGlyLworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxYmJlMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKQEAgLTAsMCArMSwxMTYgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcGF0Y2gtd2l0aC1zdGF0IG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3Rlcl8tLV9kaXJfIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcGF0Y2gtd2l0aC1zdGF0X21hc3Rlcl8tLV9kaXJfCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzg5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyXy0tX2Rpcl8KQEAgLTAsMCArMSw2MSBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyIC0tIGRpci8KK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyAxIGZpbGVzIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIDEgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgMSBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLWNjXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhY2YyNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1jY18tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCkBAIC0wLDAgKzEsMTk5IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXJvb3QgLS1jYyAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitjb21taXQgNTlkMzE0YWQ2ZjM1NmRkMDg2MDFhNGNkNWU1MzAzODFkYTNlM2M2NAorTWVyZ2U6IDlhNmQ0OTQuLi4gYzdhMmFiOS4uLgorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjA0OjAwIDIwMDYgKzAwMDAKKworICAgIE1lcmdlIGJyYW5jaCAnc2lkZScKKworIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1jYyBkaXIvc3ViCitpbmRleCBjZWFkMzJlLDcyODllMzUuLjk5MjkxM2MKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAQCAtMSw2IC0xLDQgKzEsOCBAQEAKKyAgQQorICBCCisgK0MKKyArRAorICtFCisgK0YKKysgMQorKyAyCitkaWZmIC0tY2MgZmlsZTAKK2luZGV4IGI0MTQxMDgsZjQ2MTVkYS4uMTBhOGE5ZgorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQEAgLTEsNiAtMSw2ICsxLDkgQEBACisgIDEKKyAgMgorICAzCisgKzQKKyArNQorICs2CisrIEEKKysgQgorKyBDCisKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMyAgIHwgICAgNCArKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA5IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUzCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMSAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTEKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCA4NDIyZDQwLi5jZWFkMzJlIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTIsMyArMiw1IEBAIEEKKyBCCisgQworIEQKKytFCisrRgorZGlmZiAtLWdpdCBhL2ZpbGUxIGIvZmlsZTEKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi5iMWU2NzIyCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMQorQEAgLTAsMCArMSwzIEBACisrQQorK0IKKytDCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisgZGVsZXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKworY29tbWl0IDQ0NGFjNTUzYWM3NjEyY2M4ODk2OTAzMWIwMmIzNzY3ZmI4YTM1M2EKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMDowMCAyMDA2ICswMDAwCisKKyAgICBJbml0aWFsCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzICsrKworIDMgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBkaXIvc3ViCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUwCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUyCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjM1ZDI0MmIKKy0tLSAvZGV2L251bGwKKysrKyBiL2Rpci9zdWIKK0BAIC0wLDAgKzEsMiBAQAorK0EKKytCCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUwCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTIKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworJApkaWZmIC0tZ2l0IGEvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF8tLXN1bW1hcnlfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTExNTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKQEAgLTAsMCArMSwxNjAgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcm9vdCAtLXBhdGNoLXdpdGgtc3RhdCAtLXN1bW1hcnkgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMworCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGZpbGUxCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZGlyL3N1YgorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMAorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF8tLXBhdGNoLXdpdGgtc3RhdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwMzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLS1wYXRjaC13aXRoLXN0YXRfbWFzdGVyCkBAIC0wLDAgKzEsMTU0IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtLXJvb3QgLS1wYXRjaC13aXRoLXN0YXQgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTMgICB8ICAgIDQgKysrKworIDMgZmlsZXMgY2hhbmdlZCwgOSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjcyODllMzUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorKzEKKysyCitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uZjQ2MTVkYSAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrQQorK0IKKytDCitkaWZmIC0tZ2l0IGEvZmlsZTMgYi9maWxlMworbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjcyODllMzUKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUzCitAQCAtMCwwICsxLDQgQEAKKytBCisrQgorKzEKKysyCisKK2NvbW1pdCA5YTZkNDk0OWI2Yjc2OTU2ZDlkNWUyNmYyNzkxZWMyY2VmZjVmZGMwCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDI6MDAgMjAwNiArMDAwMAorCisgICAgVGhpcmQKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTEgICB8ICAgIDMgKysrCisgMiBmaWxlcyBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUyICAgfCAgICAzIC0tLQorIDMgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyArKysKKyAzIGZpbGVzIGNoYW5nZWQsIDggaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy1jXy0tcGF0Y2gtd2l0aC1zdGF0Xy0tc3VtbWFyeV9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmNjc2NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLWNfLS1wYXRjaC13aXRoLXN0YXRfLS1zdW1tYXJ5X21hc3RlcgpAQCAtMCwwICsxLDE5OSBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1yb290IC1jIC0tcGF0Y2gtd2l0aC1zdGF0IC0tc3VtbWFyeSBtYXN0ZXIKK2NvbW1pdCA1OWQzMTRhZDZmMzU2ZGQwODYwMWE0Y2Q1ZTUzMDM4MWRhM2UzYzY0CitNZXJnZTogOWE2ZDQ5NC4uLiBjN2EyYWI5Li4uCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDQ6MDAgMjAwNiArMDAwMAorCisgICAgTWVyZ2UgYnJhbmNoICdzaWRlJworCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyAyIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKworZGlmZiAtLWNvbWJpbmVkIGRpci9zdWIKK2luZGV4IGNlYWQzMmUsNzI4OWUzNS4uOTkyOTEzYworLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEBAIC0xLDYgLTEsNCArMSw4IEBAQAorICBBCisgIEIKKyArQworICtECisgK0UKKyArRgorKyAxCisrIDIKK2RpZmYgLS1jb21iaW5lZCBmaWxlMAoraW5kZXggYjQxNDEwOCxmNDYxNWRhLi4xMGE4YTlmCistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAQCAtMSw2IC0xLDYgKzEsOSBAQEAKKyAgMQorICAyCisgIDMKKyArNAorICs1CisgKzYKKysgQQorKyBCCisrIEMKKworY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUwICAgfCAgICAzICsrKworIGZpbGUzICAgfCAgICA0ICsrKysKKyAzIGZpbGVzIGNoYW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTMKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCistLS0KKyBkaXIvc3ViIHwgICAgMiArKworIGZpbGUxICAgfCAgICAzICsrKworIDIgZmlsZXMgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIGNyZWF0ZSBtb2RlIDEwMDY0NCBmaWxlMQorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorLS0tCisgZGlyL3N1YiB8ICAgIDIgKysKKyBmaWxlMCAgIHwgICAgMyArKysKKyBmaWxlMiAgIHwgICAgMyAtLS0KKyAzIGZpbGVzIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKKyBkZWxldGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi44NDIyZDQwIDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKytDCisrRAorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmI0MTQxMDggMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworKzQKKys1CisrNgorZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK2RlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDFlNzljMy4uMDAwMDAwMAorLS0tIGEvZmlsZTIKKysrKyAvZGV2L251bGwKK0BAIC0xLDMgKzAsMCBAQAorLTEKKy0yCistMworCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKy0tLQorIGRpci9zdWIgfCAgICAyICsrCisgZmlsZTAgICB8ICAgIDMgKysrCisgZmlsZTIgICB8ICAgIDMgKysrCisgMyBmaWxlcyBjaGFuZ2VkLCA4IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCisgY3JlYXRlIG1vZGUgMTAwNjQ0IGRpci9zdWIKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTAKKyBjcmVhdGUgbW9kZSAxMDA2NDQgZmlsZTIKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMzVkMjQyYgorLS0tIC9kZXYvbnVsbAorKysrIGIvZGlyL3N1YgorQEAgLTAsMCArMSwyIEBACisrQQorK0IKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uMDFlNzljMworLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTAKK0BAIC0wLDAgKzEsMyBAQAorKzEKKysyCisrMworZGlmZiAtLWdpdCBhL2ZpbGUyIGIvZmlsZTIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMgorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy1wX21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjFmMDYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLS1yb290Xy1wX21hc3RlcgpAQCAtMCwwICsxLDEzNSBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLS1yb290IC1wIG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uNzI4OWUzNSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrMQorKzIKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5mNDYxNWRhIDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKytBCisrQgorK0MKK2RpZmYgLS1naXQgYS9maWxlMyBiL2ZpbGUzCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uNzI4OWUzNQorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTMKK0BAIC0wLDAgKzEsNCBAQAorK0EKKytCCisrMQorKzIKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDg0MjJkNDAuLmNlYWQzMmUgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMiwzICsyLDUgQEAgQQorIEIKKyBDCisgRAorK0UKKytGCitkaWZmIC0tZ2l0IGEvZmlsZTEgYi9maWxlMQorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLmIxZTY3MjIKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUxCitAQCAtMCwwICsxLDMgQEAKKytBCisrQgorK0MKKworY29tbWl0IDFiZGU0YWU1ZjM2YzhkOWFiZTNhMGZjZTBjNmFhYjNjNGExMmZlNDQKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMTowMCAyMDA2ICswMDAwCisKKyAgICBTZWNvbmQKKyAgICAKKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgY29tbWl0LgorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK2luZGV4IDM1ZDI0MmIuLjg0MjJkNDAgMTAwNjQ0CistLS0gYS9kaXIvc3ViCisrKysgYi9kaXIvc3ViCitAQCAtMSwyICsxLDQgQEAKKyBBCisgQgorK0MKKytECitkaWZmIC0tZ2l0IGEvZmlsZTAgYi9maWxlMAoraW5kZXggMDFlNzljMy4uYjQxNDEwOCAxMDA2NDQKKy0tLSBhL2ZpbGUwCisrKysgYi9maWxlMAorQEAgLTEsMyArMSw2IEBACisgMQorIDIKKyAzCisrNAorKzUKKys2CitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMWU3OWMzLi4wMDAwMDAwCistLS0gYS9maWxlMgorKysrIC9kZXYvbnVsbAorQEAgLTEsMyArMCwwIEBACistMQorLTIKKy0zCisKK2NvbW1pdCA0NDRhYzU1M2FjNzYxMmNjODg5NjkwMzFiMDJiMzc2N2ZiOGEzNTNhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDA6MDAgMjAwNiArMDAwMAorCisgICAgSW5pdGlhbAorCitkaWZmIC0tZ2l0IGEvZGlyL3N1YiBiL2Rpci9zdWIKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4zNWQyNDJiCistLS0gL2Rldi9udWxsCisrKysgYi9kaXIvc3ViCitAQCAtMCwwICsxLDIgQEAKKytBCisrQgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4wMWU3OWMzCistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMAorQEAgLTAsMCArMSwzIEBACisrMQorKzIKKyszCitkaWZmIC0tZ2l0IGEvZmlsZTIgYi9maWxlMgorbmV3IGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAwMDAwMDAuLjAxZTc5YzMKKy0tLSAvZGV2L251bGwKKysrKyBiL2ZpbGUyCitAQCAtMCwwICsxLDMgQEAKKysxCisrMgorKzMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy0tcm9vdF9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNWNiNgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tLXJvb3RfbWFzdGVyCkBAIC0wLDAgKzEsNDIgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIC0tcm9vdCBtYXN0ZXIKK2NvbW1pdCBjN2EyYWI5ZThlYWM3YjExNzQ0MmE2MDdkNWE5YjM5NTBhZTM0ZDVhCitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDM6MDAgMjAwNiArMDAwMAorCisgICAgU2lkZQorCis6MTAwNjQ0IDEwMDY0NCAzNWQyNDJiLi4uIDcyODllMzUuLi4gTQlkaXIvc3ViCis6MTAwNjQ0IDEwMDY0NCAwMWU3OWMzLi4uIGY0NjE1ZGEuLi4gTQlmaWxlMAorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiA3Mjg5ZTM1Li4uIEEJZmlsZTMKKworY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCis6MTAwNjQ0IDEwMDY0NCA4NDIyZDQwLi4uIGNlYWQzMmUuLi4gTQlkaXIvc3ViCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIGIxZTY3MjIuLi4gQQlmaWxlMQorCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gODQyMmQ0MC4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gYjQxNDEwOC4uLiBNCWZpbGUwCis6MTAwNjQ0IDAwMDAwMCAwMWU3OWMzLi4uIDAwMDAwMDAuLi4gRAlmaWxlMgorCitjb21taXQgNDQ0YWM1NTNhYzc2MTJjYzg4OTY5MDMxYjAyYjM3NjdmYjhhMzUzYQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAwOjAwIDIwMDYgKzAwMDAKKworICAgIEluaXRpYWwKKworOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAzNWQyNDJiLi4uIEEJZGlyL3N1YgorOjAwMDAwMCAxMDA2NDQgMDAwMDAwMC4uLiAwMWU3OWMzLi4uIEEJZmlsZTAKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gMDFlNzljMy4uLiBBCWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLVNGXy1wX21hc3RlciBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tU0ZfLXBfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWRhODQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLVNGXy1wX21hc3RlcgpAQCAtMCwwICsxLDE4IEBACiskIGdpdCB3aGF0Y2hhbmdlZCAtU0YgLXAgbWFzdGVyCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tU0ZfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1TRl9tYXN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5OTMyMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF8tU0ZfbWFzdGVyCkBAIC0wLDAgKzEsOSBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLVNGIG1hc3RlcgorY29tbWl0IDlhNmQ0OTQ5YjZiNzY5NTZkOWQ1ZTI2ZjI3OTFlYzJjZWZmNWZkYzAKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMjowMCAyMDA2ICswMDAwCisKKyAgICBUaGlyZAorCis6MTAwNjQ0IDEwMDY0NCA4NDIyZDQwLi4uIGNlYWQzMmUuLi4gTQlkaXIvc3ViCiskCmRpZmYgLS1naXQgYS90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfLXBfbWFzdGVyIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1wX21hc3RlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThkNDMyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDAxMy9kaWZmLndoYXRjaGFuZ2VkXy1wX21hc3RlcgpAQCAtMCwwICsxLDEwMiBAQAorJCBnaXQgd2hhdGNoYW5nZWQgLXAgbWFzdGVyCitjb21taXQgYzdhMmFiOWU4ZWFjN2IxMTc0NDJhNjA3ZDVhOWIzOTUwYWUzNGQ1YQorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAzOjAwIDIwMDYgKzAwMDAKKworICAgIFNpZGUKKworZGlmZiAtLWdpdCBhL2Rpci9zdWIgYi9kaXIvc3ViCitpbmRleCAzNWQyNDJiLi43Mjg5ZTM1IDEwMDY0NAorLS0tIGEvZGlyL3N1YgorKysrIGIvZGlyL3N1YgorQEAgLTEsMiArMSw0IEBACisgQQorIEIKKysxCisrMgorZGlmZiAtLWdpdCBhL2ZpbGUwIGIvZmlsZTAKK2luZGV4IDAxZTc5YzMuLmY0NjE1ZGEgMTAwNjQ0CistLS0gYS9maWxlMAorKysrIGIvZmlsZTAKK0BAIC0xLDMgKzEsNiBAQAorIDEKKyAyCisgMworK0EKKytCCisrQworZGlmZiAtLWdpdCBhL2ZpbGUzIGIvZmlsZTMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi43Mjg5ZTM1CistLS0gL2Rldi9udWxsCisrKysgYi9maWxlMworQEAgLTAsMCArMSw0IEBACisrQQorK0IKKysxCisrMgorCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggODQyMmQ0MC4uY2VhZDMyZSAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0yLDMgKzIsNSBAQCBBCisgQgorIEMKKyBECisrRQorK0YKK2RpZmYgLS1naXQgYS9maWxlMSBiL2ZpbGUxCituZXcgZmlsZSBtb2RlIDEwMDY0NAoraW5kZXggMDAwMDAwMC4uYjFlNjcyMgorLS0tIC9kZXYvbnVsbAorKysrIGIvZmlsZTEKK0BAIC0wLDAgKzEsMyBAQAorK0EKKytCCisrQworCitjb21taXQgMWJkZTRhZTVmMzZjOGQ5YWJlM2EwZmNlMGM2YWFiM2M0YTEyZmU0NAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAxOjAwIDIwMDYgKzAwMDAKKworICAgIFNlY29uZAorICAgIAorICAgIFRoaXMgaXMgdGhlIHNlY29uZCBjb21taXQuCisKK2RpZmYgLS1naXQgYS9kaXIvc3ViIGIvZGlyL3N1YgoraW5kZXggMzVkMjQyYi4uODQyMmQ0MCAxMDA2NDQKKy0tLSBhL2Rpci9zdWIKKysrKyBiL2Rpci9zdWIKK0BAIC0xLDIgKzEsNCBAQAorIEEKKyBCCisrQworK0QKK2RpZmYgLS1naXQgYS9maWxlMCBiL2ZpbGUwCitpbmRleCAwMWU3OWMzLi5iNDE0MTA4IDEwMDY0NAorLS0tIGEvZmlsZTAKKysrKyBiL2ZpbGUwCitAQCAtMSwzICsxLDYgQEAKKyAxCisgMgorIDMKKys0CisrNQorKzYKK2RpZmYgLS1naXQgYS9maWxlMiBiL2ZpbGUyCitkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKK2luZGV4IDAxZTc5YzMuLjAwMDAwMDAKKy0tLSBhL2ZpbGUyCisrKysgL2Rldi9udWxsCitAQCAtMSwzICswLDAgQEAKKy0xCistMgorLTMKKyQKZGlmZiAtLWdpdCBhL3QvdDQwMTMvZGlmZi53aGF0Y2hhbmdlZF9tYXN0ZXIgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfbWFzdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkM2JjYzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDEzL2RpZmYud2hhdGNoYW5nZWRfbWFzdGVyCkBAIC0wLDAgKzEsMzIgQEAKKyQgZ2l0IHdoYXRjaGFuZ2VkIG1hc3RlcgorY29tbWl0IGM3YTJhYjllOGVhYzdiMTE3NDQyYTYwN2Q1YTliMzk1MGFlMzRkNWEKK0F1dGhvcjogQSBVIFRob3IgPGF1dGhvckBleGFtcGxlLmNvbT4KK0RhdGU6ICAgTW9uIEp1biAyNiAwMDowMzowMCAyMDA2ICswMDAwCisKKyAgICBTaWRlCisKKzoxMDA2NDQgMTAwNjQ0IDM1ZDI0MmIuLi4gNzI4OWUzNS4uLiBNCWRpci9zdWIKKzoxMDA2NDQgMTAwNjQ0IDAxZTc5YzMuLi4gZjQ2MTVkYS4uLiBNCWZpbGUwCis6MDAwMDAwIDEwMDY0NCAwMDAwMDAwLi4uIDcyODllMzUuLi4gQQlmaWxlMworCitjb21taXQgOWE2ZDQ5NDliNmI3Njk1NmQ5ZDVlMjZmMjc5MWVjMmNlZmY1ZmRjMAorQXV0aG9yOiBBIFUgVGhvciA8YXV0aG9yQGV4YW1wbGUuY29tPgorRGF0ZTogICBNb24gSnVuIDI2IDAwOjAyOjAwIDIwMDYgKzAwMDAKKworICAgIFRoaXJkCisKKzoxMDA2NDQgMTAwNjQ0IDg0MjJkNDAuLi4gY2VhZDMyZS4uLiBNCWRpci9zdWIKKzowMDAwMDAgMTAwNjQ0IDAwMDAwMDAuLi4gYjFlNjcyMi4uLiBBCWZpbGUxCisKK2NvbW1pdCAxYmRlNGFlNWYzNmM4ZDlhYmUzYTBmY2UwYzZhYWIzYzRhMTJmZTQ0CitBdXRob3I6IEEgVSBUaG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CitEYXRlOiAgIE1vbiBKdW4gMjYgMDA6MDE6MDAgMjAwNiArMDAwMAorCisgICAgU2Vjb25kCisgICAgCisgICAgVGhpcyBpcyB0aGUgc2Vjb25kIGNvbW1pdC4KKworOjEwMDY0NCAxMDA2NDQgMzVkMjQyYi4uLiA4NDIyZDQwLi4uIE0JZGlyL3N1YgorOjEwMDY0NCAxMDA2NDQgMDFlNzljMy4uLiBiNDE0MTA4Li4uIE0JZmlsZTAKKzoxMDA2NDQgMDAwMDAwIDAxZTc5YzMuLi4gMDAwMDAwMC4uLiBECWZpbGUyCiskCmRpZmYgLS1naXQgYS90L3Q0MDE0LWZvcm1hdC1wYXRjaC5zaCBiL3QvdDQwMTQtZm9ybWF0LXBhdGNoLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3OTU4NzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MDE0LWZvcm1hdC1wYXRjaC5zaApAQCAtMCwwICsxLDY5IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J0Zvcm1hdC1wYXRjaCBza2lwcGluZyBhbHJlYWR5IGluY29ycG9yYXRlZCBwYXRjaGVzJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlmb3IgaSBpbiAxIDIgMyA0IDUgNiA3IDggOSAxMDsgZG8gZWNobyAiJGkiOyBkb25lID5maWxlICYmCisJZ2l0IGFkZCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSBJbml0aWFsICYmCisJZ2l0IGNoZWNrb3V0IC1iIHNpZGUgJiYKKworCWZvciBpIGluIDEgMiA1IDYgQSBCIEMgNyA4IDkgMTA7IGRvIGVjaG8gIiRpIjsgZG9uZSA+ZmlsZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggZmlsZSAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgY2hhbmdlICMxIiAmJgorCisJZm9yIGkgaW4gRCBFIEY7IGRvIGVjaG8gIiRpIjsgZG9uZSA+PmZpbGUgJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZpbGUgJiYKKwlnaXQgY29tbWl0IC1tICJTaWRlIGNoYW5nZSAjMiIgJiYKKwlnaXQgdGFnIEMyICYmCisKKwlmb3IgaSBpbiA1IDYgMSAyIDMgQSA0IEIgQyA3IDggOSAxMCBEIEUgRjsgZG8gZWNobyAiJGkiOyBkb25lID5maWxlICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmaWxlICYmCisJZ2l0IGNvbW1pdCAtbSAiU2lkZSBjaGFuZ2UgIzMiICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBDMiB8IGdpdCBhcHBseSAtLWluZGV4ICYmCisJZ2l0IGNvbW1pdCAtbSAiTWFzdGVyIGFjY2VwdHMgbW9yYWwgZXF1aXZhbGVudCBvZiAjMiIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJmb3JtYXQtcGF0Y2ggLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW0iICcKKworCWdpdCBmb3JtYXQtcGF0Y2ggLS1zdGRvdXQgbWFzdGVyLi5zaWRlID5wYXRjaDAgJiYKKwljbnQ9YGdyZXAgIl5Gcm9tICIgcGF0Y2gwIHwgd2MgLWxgICYmCisJdGVzdCAkY250ID0gMworCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgImZvcm1hdC1wYXRjaCAtLWlnbm9yZS1pZi1pbi11cHN0cmVhbSIgJworCisJZ2l0IGZvcm1hdC1wYXRjaCAtLXN0ZG91dCBcCisJCS0taWdub3JlLWlmLWluLXVwc3RyZWFtIG1hc3Rlci4uc2lkZSA+cGF0Y2gxICYmCisJY250PWBncmVwICJeRnJvbSAiIHBhdGNoMSB8IHdjIC1sYCAmJgorCXRlc3QgJGNudCA9IDIKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJmb3JtYXQtcGF0Y2ggcmVzdWx0IGFwcGxpZXMiICcKKworCWdpdCBjaGVja291dCAtYiByZWJ1aWxkLTAgbWFzdGVyICYmCisJZ2l0IGFtIC0zIHBhdGNoMCAmJgorCWNudD1gZ2l0IHJldi1saXN0IG1hc3Rlci4uIHwgd2MgLWxgICYmCisJdGVzdCAkY250ID0gMgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJmb3JtYXQtcGF0Y2ggLS1pZ25vcmUtaWYtaW4tdXBzdHJlYW0gcmVzdWx0IGFwcGxpZXMiICcKKworCWdpdCBjaGVja291dCAtYiByZWJ1aWxkLTEgbWFzdGVyICYmCisJZ2l0IGFtIC0zIHBhdGNoMSAmJgorCWNudD1gZ2l0IHJldi1saXN0IG1hc3Rlci4uIHwgd2MgLWxgICYmCisJdGVzdCAkY250ID0gMgorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDAtYXBwbHktc3RhdC5zaCBiL3QvdDQxMDAtYXBwbHktc3RhdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTc5ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC1hcHBseS1zdGF0LnNoCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgdGVzdC4KKworJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZW5hbWUnIFwKKyAgICAnZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPC4uL3Q0MTAwL3QtYXBwbHktMS5wYXRjaCA+Y3VycmVudCAmJgorICAgIGRpZmYgLXUgLi4vdDQxMDAvdC1hcHBseS0xLmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29weScgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS0yLnBhdGNoID5jdXJyZW50ICYmCisgICAgZGlmZiAtdSAuLi90NDEwMC90LWFwcGx5LTIuZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdyZXdyaXRlJyBcCisgICAgJ2dpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IDwuLi90NDEwMC90LWFwcGx5LTMucGF0Y2ggPmN1cnJlbnQgJiYKKyAgICBkaWZmIC11IC4uL3Q0MTAwL3QtYXBwbHktMy5leHBlY3QgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vZGUnIFwKKyAgICAnZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPC4uL3Q0MTAwL3QtYXBwbHktNC5wYXRjaCA+Y3VycmVudCAmJgorICAgIGRpZmYgLXUgLi4vdDQxMDAvdC1hcHBseS00LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnbm9uIGdpdCcgXAorICAgICdnaXQtYXBwbHkgLS1zdGF0IC0tc3VtbWFyeSA8Li4vdDQxMDAvdC1hcHBseS01LnBhdGNoID5jdXJyZW50ICYmCisgICAgZGlmZiAtdSAuLi90NDEwMC90LWFwcGx5LTUuZXhwZWN0IGN1cnJlbnQnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdub24gZ2l0JyBcCisgICAgJ2dpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IDwuLi90NDEwMC90LWFwcGx5LTYucGF0Y2ggPmN1cnJlbnQgJiYKKyAgICBkaWZmIC11IC4uL3Q0MTAwL3QtYXBwbHktNi5leHBlY3QgY3VycmVudCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ25vbiBnaXQnIFwKKyAgICAnZ2l0LWFwcGx5IC0tc3RhdCAtLXN1bW1hcnkgPC4uL3Q0MTAwL3QtYXBwbHktNy5wYXRjaCA+Y3VycmVudCAmJgorICAgIGRpZmYgLXUgLi4vdDQxMDAvdC1hcHBseS03LmV4cGVjdCBjdXJyZW50JworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTEuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTEuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGU2NGQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktMS5leHBlY3QKQEAgLTAsMCArMSwxMSBAQAorIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dCB8ICAgMTIgKysrKysrLS0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0IHwgICAxMCArKysrKy0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQudHh0ICAgICAgICAgIHwgICAgNiArKystLS0KKyBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsrKy0tLQorIHNzaC1wdWxsLmMgICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKystLQorIHNzaC1wdXNoLmMgICAgICAgICAgICAgICAgICAgICB8ICAgMTQgKysrKysrKy0tLS0tLS0KKyA2IGZpbGVzIGNoYW5nZWQsIDI2IGluc2VydGlvbnMoKyksIDI2IGRlbGV0aW9ucygtKQorIHJlbmFtZSBEb2N1bWVudGF0aW9uL3tnaXQtcnB1bGwudHh0ID0+IGdpdC1zc2gtcHVsbC50eHR9ICg5MCUpCisgcmVuYW1lIERvY3VtZW50YXRpb24ve2dpdC1ycHVzaC50eHQgPT4gZ2l0LXNzaC1wdXNoLnR4dH0gKDcxJSkKKyByZW5hbWUgcnB1bGwuYyA9PiBzc2gtcHVsbC5jICg5NyUpCisgcmVuYW1lIHJwdXNoLmMgPT4gc3NoLXB1c2guYyAoOTMlKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTEucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktMS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU4NzUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTEucGF0Y2gKQEAgLTAsMCArMSwxOTQgQEAKKzQxOGFhZjg0N2E4YjNmZmZmYjRmNzc3YTJkZDUyNjJjYTVjZTBlZjcgKGZyb20gZGM5Mzg0MTcxNWRmYTlhOWNkZGE2ZjJjNGEyNWVlYzgzMWVhN2FhMCkKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKK3NpbWlsYXJpdHkgaW5kZXggOTAlCityZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKK3JlbmFtZSB0byBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CitAQCAtMSwyMSArMSwyMSBAQAorLWdpdC1ycHVsbCgxKQorLT09PT09PT09PT09PQorK2dpdC1zc2gtcHVsbCgxKQorKz09PT09PT09PT09PT09PQorIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtcnB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorK2dpdC1zc2gtcHVsbCAtIFB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisgCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtcnB1bGwnIFstY10gWy10XSBbLWFdIFstZF0gWy12XSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsCisrJ2dpdC1zc2gtcHVsbCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKyAKKyBERVNDUklQVElPTgorIC0tLS0tLS0tLS0tCistUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1ycHVzaCBvbgorLXRoZSBvdGhlciBlbmQuCisrUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1zc2gtcHVzaAorK29uIHRoZSBvdGhlciBlbmQuCisgCisgT1BUSU9OUworIC0tLS0tLS0KK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKK3NpbWlsYXJpdHkgaW5kZXggNzElCityZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKK3JlbmFtZSB0byBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdXNoLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CitAQCAtMSwxOSArMSwxOSBAQAorLWdpdC1ycHVzaCgxKQorLT09PT09PT09PT09PQorK2dpdC1zc2gtcHVzaCgxKQorKz09PT09PT09PT09PT09PQorIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtcnB1c2ggLSBIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsCisrZ2l0LXNzaC1wdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbAorIAorIAorIFNZTk9QU0lTCisgLS0tLS0tLS0KKy0nZ2l0LXJwdXNoJworKydnaXQtc3NoLXB1c2gnCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwuCisrSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbC4KKyAKKyAKKyBBdXRob3IKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQudHh0CitAQCAtMTQ4LDcgKzE0OCw3IEBAIGxpbms6Z2l0LXJlc29sdmUtc2NyaXB0Lmh0bWxbZ2l0LXJlc29sdmUKKyBsaW5rOmdpdC10YWctc2NyaXB0Lmh0bWxbZ2l0LXRhZy1zY3JpcHRdOjoKKyAJQW4gZXhhbXBsZSBzY3JpcHQgdG8gY3JlYXRlIGEgdGFnIG9iamVjdCBzaWduZWQgd2l0aCBHUEcKKyAKKy1saW5rOmdpdC1ycHVsbC5odG1sW2dpdC1ycHVsbF06OgorK2xpbms6Z2l0LXNzaC1wdWxsLmh0bWxbZ2l0LXNzaC1wdWxsXTo6CisgCVB1bGxzIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeSBvdmVyIHNzaCBjb25uZWN0aW9uCisgCisgSW50ZXJvZ2F0b3JzOgorQEAgLTE1Niw4ICsxNTYsOCBAQCBJbnRlcm9nYXRvcnM6CisgbGluazpnaXQtZGlmZi1oZWxwZXIuaHRtbFtnaXQtZGlmZi1oZWxwZXJdOjoKKyAJR2VuZXJhdGVzIHBhdGNoIGZvcm1hdCBvdXRwdXQgZm9yIGdpdC1kaWZmLSoKKyAKKy1saW5rOmdpdC1ycHVzaC5odG1sW2dpdC1ycHVzaF06OgorLQlIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsCisrbGluazpnaXQtc3NoLXB1c2guaHRtbFtnaXQtc3NoLXB1c2hdOjoKKysJSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbAorIAorIAorIAorZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKKy0tLSBhL01ha2VmaWxlCisrKysgYi9NYWtlZmlsZQorQEAgLTMwLDcgKzMwLDcgQEAgUFJPRz0gICBnaXQtdXBkYXRlLWNhY2hlIGdpdC1kaWZmLWZpbGVzIAorIAlnaXQtY2hlY2tvdXQtY2FjaGUgZ2l0LWRpZmYtdHJlZSBnaXQtcmV2LXRyZWUgZ2l0LWxzLWZpbGVzIFwKKyAJZ2l0LWNoZWNrLWZpbGVzIGdpdC1scy10cmVlIGdpdC1tZXJnZS1iYXNlIGdpdC1tZXJnZS1jYWNoZSBcCisgCWdpdC11bnBhY2stZmlsZSBnaXQtZXhwb3J0IGdpdC1kaWZmLWNhY2hlIGdpdC1jb252ZXJ0LWNhY2hlIFwKKy0JZ2l0LWh0dHAtcHVsbCBnaXQtcnB1c2ggZ2l0LXJwdWxsIGdpdC1yZXYtbGlzdCBnaXQtbWt0YWcgXAorKwlnaXQtaHR0cC1wdWxsIGdpdC1zc2gtcHVzaCBnaXQtc3NoLXB1bGwgZ2l0LXJldi1saXN0IGdpdC1ta3RhZyBcCisgCWdpdC1kaWZmLWhlbHBlciBnaXQtdGFyLXRyZWUgZ2l0LWxvY2FsLXB1bGwgZ2l0LXdyaXRlLWJsb2IgXAorIAlnaXQtZ2V0LXRhci1jb21taXQtaWQgZ2l0LW1rZGVsdGEgZ2l0LWFwcGx5IGdpdC1zdHJpcHNwYWNlCisgCitAQCAtMTA1LDggKzEwNSw4IEBAIGdpdC1kaWZmLWNhY2hlOiBkaWZmLWNhY2hlLmMKKyBnaXQtY29udmVydC1jYWNoZTogY29udmVydC1jYWNoZS5jCisgZ2l0LWh0dHAtcHVsbDogaHR0cC1wdWxsLmMgcHVsbC5jCisgZ2l0LWxvY2FsLXB1bGw6IGxvY2FsLXB1bGwuYyBwdWxsLmMKKy1naXQtcnB1c2g6IHJzaC5jCistZ2l0LXJwdWxsOiByc2guYyBwdWxsLmMKKytnaXQtc3NoLXB1c2g6IHJzaC5jCisrZ2l0LXNzaC1wdWxsOiByc2guYyBwdWxsLmMKKyBnaXQtcmV2LWxpc3Q6IHJldi1saXN0LmMKKyBnaXQtbWt0YWc6IG1rdGFnLmMKKyBnaXQtZGlmZi1oZWxwZXI6IGRpZmYtaGVscGVyLmMKK2RpZmYgLS1naXQgYS9ycHVsbC5jIGIvc3NoLXB1bGwuYworc2ltaWxhcml0eSBpbmRleCA5NyUKK3JlbmFtZSBmcm9tIHJwdWxsLmMKK3JlbmFtZSB0byBzc2gtcHVsbC5jCistLS0gYS9ycHVsbC5jCisrKysgYi9zc2gtcHVsbC5jCitAQCAtNjQsMTMgKzY0LDEzIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAJCWFyZysrOworIAl9CisgCWlmIChhcmdjIDwgYXJnICsgMikgeworLQkJdXNhZ2UoImdpdC1ycHVsbCBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybCIpOworKwkJdXNhZ2UoImdpdC1zc2gtcHVsbCBbLWNdIFstdF0gWy1hXSBbLXZdIFstZF0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybCIpOworIAkJcmV0dXJuIDE7CisgCX0KKyAJY29tbWl0X2lkID0gYXJndlthcmddOworIAl1cmwgPSBhcmd2W2FyZyArIDFdOworIAorLQlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtcnB1c2giLCB1cmwsIGFyZywgYXJndiArIDEpKQorKwlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtc3NoLXB1c2giLCB1cmwsIGFyZywgYXJndiArIDEpKQorIAkJcmV0dXJuIDE7CisgCisgCWlmIChnZXRfdmVyc2lvbigpKQorZGlmZiAtLWdpdCBhL3JwdXNoLmMgYi9zc2gtcHVzaC5jCitzaW1pbGFyaXR5IGluZGV4IDkzJQorcmVuYW1lIGZyb20gcnB1c2guYworcmVuYW1lIHRvIHNzaC1wdXNoLmMKKy0tLSBhL3JwdXNoLmMKKysrKyBiL3NzaC1wdXNoLmMKK0BAIC0xNiw3ICsxNiw3IEBAIGludCBzZXJ2ZV9vYmplY3QoaW50IGZkX2luLCBpbnQgZmRfb3V0KSAKKyAJZG8geworIAkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworIAkJaWYgKHNpemUgPCAwKSB7CistCQkJcGVycm9yKCJnaXQtcnB1c2g6IHJlYWQgIik7CisrCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisgCQkJcmV0dXJuIC0xOworIAkJfQorIAkJaWYgKCFzaXplKQorQEAgLTMwLDcgKzMwLDcgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAlidWYgPSBtYXBfc2hhMV9maWxlKHNoYTEsICZvYmpzaXplKTsKKyAJCisgCWlmICghYnVmKSB7CistCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogY291bGQgbm90IGZpbmQgJXNcbiIsIAorKwkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKyAJCQlzaGExX3RvX2hleChzaGExKSk7CisgCQlyZW1vdGUgPSAtMTsKKyAJfQorQEAgLTQ1LDkgKzQ1LDkgQEAgaW50IHNlcnZlX29iamVjdChpbnQgZmRfaW4sIGludCBmZF9vdXQpIAorIAkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworIAkJaWYgKHNpemUgPD0gMCkgeworIAkJCWlmICghc2l6ZSkgeworLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogd3JpdGUgY2xvc2VkIik7CisrCQkJCWZwcmludGYoc3RkZXJyLCAiZ2l0LXNzaC1wdXNoOiB3cml0ZSBjbG9zZWQiKTsKKyAJCQl9IGVsc2UgeworLQkJCQlwZXJyb3IoImdpdC1ycHVzaDogd3JpdGUgIik7CisrCQkJCXBlcnJvcigiZ2l0LXNzaC1wdXNoOiB3cml0ZSAiKTsKKyAJCQl9CisgCQkJcmV0dXJuIC0xOworIAkJfQorQEAgLTcxLDcgKzcxLDcgQEAgdm9pZCBzZXJ2aWNlKGludCBmZF9pbiwgaW50IGZkX291dCkgeworIAkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworIAkJaWYgKHJldHZhbCA8IDEpIHsKKyAJCQlpZiAocmV0dmFsIDwgMCkKKy0JCQkJcGVycm9yKCJycHVzaDogcmVhZCAiKTsKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisgCQkJcmV0dXJuOworIAkJfQorIAkJaWYgKHR5cGUgPT0gJ3YnICYmIHNlcnZlX3ZlcnNpb24oZmRfaW4sIGZkX291dCkpCitAQCAtOTEsMTIgKzkxLDEyIEBAIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAgICAgICAgICAgICAgICAgYXJnKys7CisgICAgICAgICB9CisgICAgICAgICBpZiAoYXJnYyA8IGFyZyArIDIpIHsKKy0JCXVzYWdlKCJnaXQtcnB1c2ggWy1jXSBbLXRdIFstYV0gY29tbWl0LWlkIHVybCIpOworKwkJdXNhZ2UoImdpdC1zc2gtcHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgfQorIAljb21taXRfaWQgPSBhcmd2W2FyZ107CisgCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisgCQlyZXR1cm4gMTsKKyAKKyAJc2VydmljZShmZF9pbiwgZmRfb3V0KTsKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0yLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0yLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU2NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTIuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIE1ha2VmaWxlICAgICAgICAgfCAgICAyICstCisgZ2l0LWZldGNoLXNjcmlwdCB8ICAgIDUgLS0tLS0KKyBnaXQtcHVsbC1zY3JpcHQgIHwgICAzNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCAyIGluc2VydGlvbnMoKyksIDM5IGRlbGV0aW9ucygtKQorIGNvcHkgZ2l0LXB1bGwtc2NyaXB0ID0+IGdpdC1mZXRjaC1zY3JpcHQgKDg3JSkKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0yLnBhdGNoIGIvdC90NDEwMC90LWFwcGx5LTIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkYzgwOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS0yLnBhdGNoCkBAIC0wLDAgKzEsNzIgQEAKKzdlZjc2OTI1ZDljMTllZjc0ODc0ZTE3MzVlMjQzNmU1NmQwYzQ4OTcgKGZyb20gNmIxNGQ3ZmFmMGJhZDAyNmE4MWEyN2JhYzA3YjQ3NjkxZjYyMWI4ZikKK2RpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0yMCw3ICsyMCw3IEBAIElOU1RBTEw9aW5zdGFsbAorIAorIFNDUklQVFM9Z2l0LWFwcGx5LXBhdGNoLXNjcmlwdCBnaXQtbWVyZ2Utb25lLWZpbGUtc2NyaXB0IGdpdC1wcnVuZS1zY3JpcHQgXAorIAlnaXQtcHVsbC1zY3JpcHQgZ2l0LXRhZy1zY3JpcHQgZ2l0LXJlc29sdmUtc2NyaXB0IGdpdC13aGF0Y2hhbmdlZCBcCistCWdpdC1kZWx0YWZ5LXNjcmlwdAorKwlnaXQtZGVsdGFmeS1zY3JpcHQgZ2l0LWZldGNoLXNjcmlwdAorIAorIFBST0c9ICAgZ2l0LXVwZGF0ZS1jYWNoZSBnaXQtZGlmZi1maWxlcyBnaXQtaW5pdC1kYiBnaXQtd3JpdGUtdHJlZSBcCisgCWdpdC1yZWFkLXRyZWUgZ2l0LWNvbW1pdC10cmVlIGdpdC1jYXQtZmlsZSBnaXQtZnNjay1jYWNoZSBcCitkaWZmIC0tZ2l0IGEvZ2l0LXB1bGwtc2NyaXB0IGIvZ2l0LWZldGNoLXNjcmlwdAorc2ltaWxhcml0eSBpbmRleCA4NyUKK2NvcHkgZnJvbSBnaXQtcHVsbC1zY3JpcHQKK2NvcHkgdG8gZ2l0LWZldGNoLXNjcmlwdAorLS0tIGEvZ2l0LXB1bGwtc2NyaXB0CisrKysgYi9naXQtZmV0Y2gtc2NyaXB0CitAQCAtMzksOCArMzksMyBAQCBkb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiCisgCisgZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCisgZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorLQorLWdpdC1yZXNvbHZlLXNjcmlwdCBcCistCSIkKGNhdCAiJEdJVF9ESVIiL0hFQUQpIiBcCistCSIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIiBcCistCSIkbWVyZ2VfcmVwbyIKK2RpZmYgLS1naXQgYS9naXQtcHVsbC1zY3JpcHQgYi9naXQtcHVsbC1zY3JpcHQKKy0tLSBhL2dpdC1wdWxsLXNjcmlwdAorKysrIGIvZ2l0LXB1bGwtc2NyaXB0CitAQCAtNiwzOSArNiw3IEBAIG1lcmdlX25hbWU9JHsyOi1IRUFEfQorIDogJHtHSVRfRElSPS5naXR9CisgOiAke0dJVF9PQkpFQ1RfRElSRUNUT1JZPSIke1NIQTFfRklMRV9ESVJFQ1RPUlktIiRHSVRfRElSL29iamVjdHMifSJ9CisgCistZG93bmxvYWRfb25lICgpIHsKKy0JIyByZW1vdGVfcGF0aD0iJDEiIGxvY2FsX2ZpbGU9IiQyIgorLQljYXNlICIkMSIgaW4KKy0JaHR0cDovLyopCistCQl3Z2V0IC1xIC1PICIkMiIgIiQxIiA7OworLQkvKikKKy0JCXRlc3QgLWYgIiQxIiAmJiBjYXQgPiIkMiIgIiQxIiA7OworLQkqKQorLQkJcnN5bmMgLUwgIiQxIiAiJDIiIDs7CistCWVzYWMKKy19CistCistZG93bmxvYWRfb2JqZWN0cyAoKSB7CistCSMgcmVtb3RlX3JlcG89IiQxIiBoZWFkX3NoYTE9IiQyIgorLQljYXNlICIkMSIgaW4KKy0JaHR0cDovLyopCistCQlnaXQtaHR0cC1wdWxsIC1hICIkMiIgIiQxLyIKKy0JCTs7CistCS8qKQorLQkJZ2l0LWxvY2FsLXB1bGwgLWwgLWEgIiQyIiAiJDEvIgorLQkJOzsKKy0JKikKKy0JCXJzeW5jIC1hdnogLS1pZ25vcmUtZXhpc3RpbmcgXAorLQkJCSIkMS9vYmplY3RzLy4iICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiLy4KKy0JCTs7CistCWVzYWMKKy19CistCistZWNobyAiR2V0dGluZyByZW1vdGUgJG1lcmdlX25hbWUiCistZG93bmxvYWRfb25lICIkbWVyZ2VfcmVwby8kbWVyZ2VfbmFtZSIgIiRHSVRfRElSIi9NRVJHRV9IRUFECistCistZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCistZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorK2dpdC1mZXRjaC1zY3JpcHQgIiRtZXJnZV9yZXBvIiAiJG1lcmdlX25hbWUiCisgCisgZ2l0LXJlc29sdmUtc2NyaXB0IFwKKyAJIiQoY2F0ICIkR0lUX0RJUiIvSEVBRCkiIFwKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS0zLmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS0zLmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJhNTUyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTMuZXhwZWN0CkBAIC0wLDAgKzEsNyBAQAorIERvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0IHwgICAyMCArLQorIGxzLXRyZWUuYyAgICAgICAgICAgICAgICAgICAgIHwgIDQ1OSArKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCAgIHwgICAgMyAKKyB0cmVlLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgCisgdHJlZS5oICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAxIAorIDUgZmlsZXMgY2hhbmdlZCwgMjYyIGluc2VydGlvbnMoKyksIDIyMyBkZWxldGlvbnMoLSkKKyByZXdyaXRlIGxzLXRyZWUuYyAoODIlKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTMucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktMy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNkYmFhCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTMucGF0Y2gKQEAgLTAsMCArMSw1NjcgQEAKKzZhZjFmMDE5MmZmODc0MGZlNzdkYjdjZjAyYzczOWNjZmJkZjExOWMgKGZyb20gMmJjMjU2NDE0NTgzNTk5NjczNGQ2ZWQ1ZDE4ODBmODViMTcyMzNkNikKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKK0BAIC00LDIzICs0LDI2IEBAIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtbHMtdHJlZSAtIERpc3BsYXlzIGEgdHJlZSBvYmplY3QgaW4gaHVtYW4gcmVhZGFibGUgZm9ybQorK2dpdC1scy10cmVlIC0gTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QuCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtbHMtdHJlZScgWy1yXSBbLXpdIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorKydnaXQtbHMtdHJlZScgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUNvbnZlcnRzIHRoZSB0cmVlIG9iamVjdCB0byBhIGh1bWFuIHJlYWRhYmxlIChhbmQgc2NyaXB0IHByb2Nlc3NhYmxlKQorLWZvcm0uCisrTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QsIGxpa2Ugd2hhdCAiL2Jpbi9scyAtYSIgZG9lcworK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIAorIE9QVElPTlMKKyAtLS0tLS0tCisgPHRyZWUtaXNoPjo6CisgCUlkIG9mIGEgdHJlZS4KKyAKKystZDo6CisrCXNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4KKysKKyAtcjo6CisgCXJlY3Vyc2UgaW50byBzdWItdHJlZXMKKyAKK0BAIC0yOCwxOCArMzEsMTkgQEAgT1BUSU9OUworIAlcMCBsaW5lIHRlcm1pbmF0aW9uIG9uIG91dHB1dAorIAorIHBhdGhzOjoKKy0JT3B0aW9uYWxseSwgcmVzdHJpY3QgdGhlIG91dHB1dCBvZiBnaXQtbHMtdHJlZSB0byBzcGVjaWZpYworLQlwYXRocy4gRGlyZWN0b3JpZXMgd2lsbCBvbmx5IGxpc3QgdGhlaXIgdHJlZSBibG9iIGlkcy4KKy0JSW1wbGllcyAtci4KKysJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3dzIHRoZW0uICBPdGhlcndpc2UgaW1wbGljaXRseQorKwl1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisrCisgCisgT3V0cHV0IEZvcm1hdAorIC0tLS0tLS0tLS0tLS0KKy0gICAgICAgIDxtb2RlPlx0CTx0eXBlPlx0CTxvYmplY3Q+XHQJPGZpbGU+CisrICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKyAKKyAKKyBBdXRob3IKKyAtLS0tLS0KKyBXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKytDb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorIAorIERvY3VtZW50YXRpb24KKyAtLS0tLS0tLS0tLS0tLQorZGlmZiAtLWdpdCBhL2xzLXRyZWUuYyBiL2xzLXRyZWUuYworZGlzc2ltaWxhcml0eSBpbmRleCA4MiUKKy0tLSBscy10cmVlLmMKKysrKyBscy10cmVlLmMKK0BAIC0xLDIxMiArMSwyNDcgQEAKKy0vKgorLSAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorLSAqCistICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorLSAqLworLSNpbmNsdWRlICJjYWNoZS5oIgorLQorLXN0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7Cistc3RhdGljIGludCByZWN1cnNpdmUgPSAwOworLQorLXN0cnVjdCBwYXRoX3ByZWZpeCB7CistCXN0cnVjdCBwYXRoX3ByZWZpeCAqcHJldjsKKy0JY29uc3QgY2hhciAqbmFtZTsKKy19OworLQorLSNkZWZpbmUgREVCVUcoZm10LCAuLi4pCQorLQorLXN0YXRpYyBpbnQgc3RyaW5nX3BhdGhfcHJlZml4KGNoYXIgKmJ1ZmYsIHNpemVfdCBibGVuLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWludCBsZW4gPSAwOworLQlpZiAocHJlZml4KSB7CistCQlpZiAocHJlZml4LT5wcmV2KSB7CistCQkJbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsYmxlbixwcmVmaXgtPnByZXYpOworLQkJCWJ1ZmYgKz0gbGVuOworLQkJCWJsZW4gLT0gbGVuOworLQkJCWlmIChibGVuID4gMCkgeworLQkJCQkqYnVmZiA9ICcvJzsKKy0JCQkJbGVuKys7CistCQkJCWJ1ZmYrKzsKKy0JCQkJYmxlbi0tOworLQkJCX0KKy0JCX0KKy0JCXN0cm5jcHkoYnVmZixwcmVmaXgtPm5hbWUsYmxlbik7CistCQlyZXR1cm4gbGVuICsgc3RybGVuKHByZWZpeC0+bmFtZSk7CistCX0KKy0KKy0JcmV0dXJuIDA7CistfQorLQorLXN0YXRpYyB2b2lkIHByaW50X3BhdGhfcHJlZml4KHN0cnVjdCBwYXRoX3ByZWZpeCAqcHJlZml4KQorLXsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCXByaW50X3BhdGhfcHJlZml4KHByZWZpeC0+cHJldik7CistCQkJcHV0Y2hhcignLycpOworLQkJfQorLQkJZnB1dHMocHJlZml4LT5uYW1lLCBzdGRvdXQpOworLQl9CistfQorLQorLS8qCistICogcmV0dXJuOgorLSAqIAktMSBpZiBwcmVmaXggaXMgKm5vdCogYSBzdWJzZXQgb2YgcGF0aAorLSAqIAkgMCBpZiBwcmVmaXggPT0gcGF0aAorLSAqIAkgMSBpZiBwcmVmaXggaXMgYSBzdWJzZXQgb2YgcGF0aAorLSAqLworLXN0YXRpYyBpbnQgcGF0aGNtcChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWNoYXIgYnVmZltQQVRIX01BWF07CistCWludCBsZW4sc2xlbjsKKy0KKy0JaWYgKHByZWZpeCA9PSBOVUxMKQorLQkJcmV0dXJuIDE7CistCistCWxlbiA9IHN0cmluZ19wYXRoX3ByZWZpeChidWZmLCBzaXplb2YgYnVmZiwgcHJlZml4KTsKKy0Jc2xlbiA9IHN0cmxlbihwYXRoKTsKKy0KKy0JaWYgKHNsZW4gPCBsZW4pCistCQlyZXR1cm4gLTE7CistCistCWlmIChzdHJuY21wKHBhdGgsYnVmZixsZW4pID09IDApIHsKKy0JCWlmIChzbGVuID09IGxlbikKKy0JCQlyZXR1cm4gMDsKKy0JCWVsc2UKKy0JCQlyZXR1cm4gMTsKKy0JfQorLQorLQlyZXR1cm4gLTE7CistfQkKKy0KKy0vKgorLSAqIG1hdGNoIG1heSBiZSBOVUxMLCBvciBhICpzb3J0ZWQqIGxpc3Qgb2YgcGF0aHMKKy0gKi8KKy1zdGF0aWMgdm9pZCBsaXN0X3JlY3Vyc2l2ZSh2b2lkICpidWZmZXIsCistCQkJICAgY29uc3QgY2hhciAqdHlwZSwKKy0JCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCistCQkJICAgc3RydWN0IHBhdGhfcHJlZml4ICpwcmVmaXgsCistCQkJICAgY2hhciAqKm1hdGNoLCBpbnQgbWF0Y2hlcykKKy17CistCXN0cnVjdCBwYXRoX3ByZWZpeCB0aGlzX3ByZWZpeDsKKy0JdGhpc19wcmVmaXgucHJldiA9IHByZWZpeDsKKy0KKy0JaWYgKHN0cmNtcCh0eXBlLCAidHJlZSIpKQorLQkJZGllKCJleHBlY3RlZCBhICd0cmVlJyBub2RlIik7CistCistCWlmIChtYXRjaGVzKQorLQkJcmVjdXJzaXZlID0gMTsKKy0KKy0Jd2hpbGUgKHNpemUpIHsKKy0JCWludCBuYW1lbGVuID0gc3RybGVuKGJ1ZmZlcikrMTsKKy0JCXZvaWQgKmVsdGJ1ZiA9IE5VTEw7CistCQljaGFyIGVsdHR5cGVbMjBdOworLQkJdW5zaWduZWQgbG9uZyBlbHRzaXplOworLQkJdW5zaWduZWQgY2hhciAqc2hhMSA9IGJ1ZmZlciArIG5hbWVsZW47CistCQljaGFyICpwYXRoID0gc3RyY2hyKGJ1ZmZlciwgJyAnKSArIDE7CistCQl1bnNpZ25lZCBpbnQgbW9kZTsKKy0JCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworLQkJaW50IG10eXBlID0gLTE7CistCQlpbnQgbWluZGV4OworLQorLQkJaWYgKHNpemUgPCBuYW1lbGVuICsgMjAgfHwgc3NjYW5mKGJ1ZmZlciwgIiVvIiwgJm1vZGUpICE9IDEpCistCQkJZGllKCJjb3JydXB0ICd0cmVlJyBmaWxlIik7CistCQlidWZmZXIgPSBzaGExICsgMjA7CistCQlzaXplIC09IG5hbWVsZW4gKyAyMDsKKy0KKy0JCXRoaXNfcHJlZml4Lm5hbWUgPSBwYXRoOworLQkJZm9yICggbWluZGV4ID0gMDsgbWluZGV4IDwgbWF0Y2hlczsgbWluZGV4KyspIHsKKy0JCQltdHlwZSA9IHBhdGhjbXAobWF0Y2hbbWluZGV4XSwmdGhpc19wcmVmaXgpOworLQkJCWlmIChtdHlwZSA+PSAwKSB7CistCQkJCW1hdGNoZWQgPSBtYXRjaFttaW5kZXhdOworLQkJCQlicmVhazsKKy0JCQl9CistCQl9CistCistCQkvKgorLQkJICogSWYgd2UncmUgbm90IG1hdGNoaW5nLCBvciBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoLAorLQkJICogcHJpbnQgb3V0IHRoZSBpbmZvCistCQkgKi8KKy0JCWlmICghbWF0Y2hlcyB8fCAobWF0Y2hlZCAhPSBOVUxMICYmIG10eXBlID09IDApKSB7CistCQkJcHJpbnRmKCIlMDZvICVzICVzXHQiLCBtb2RlLAorLQkJCSAgICAgICBTX0lTRElSKG1vZGUpID8gInRyZWUiIDogImJsb2IiLAorLQkJCSAgICAgICBzaGExX3RvX2hleChzaGExKSk7CistCQkJcHJpbnRfcGF0aF9wcmVmaXgoJnRoaXNfcHJlZml4KTsKKy0JCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworLQkJfQorLQorLQkJaWYgKCEgcmVjdXJzaXZlIHx8ICEgU19JU0RJUihtb2RlKSkKKy0JCQljb250aW51ZTsKKy0KKy0JCWlmIChtYXRjaGVzICYmICEgbWF0Y2hlZCkKKy0JCQljb250aW51ZTsKKy0KKy0JCWlmICghIChlbHRidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCBlbHR0eXBlLCAmZWx0c2l6ZSkpICkgeworLQkJCWVycm9yKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQljb250aW51ZTsKKy0JCX0KKy0KKy0JCS8qIElmIHRoaXMgaXMgYW4gZXhhY3QgZGlyZWN0b3J5IG1hdGNoLCB3ZSBtYXkgaGF2ZQorLQkJICogZGlyZWN0b3J5IGZpbGVzIGZvbGxvd2luZyB0aGlzIHBhdGguIE1hdGNoIG9uIHRoZW0uCistCQkgKiBPdGhlcndpc2UsIHdlJ3JlIGF0IGEgcGFjaCBzdWJjb21wb25lbnQsIGFuZCB3ZSBuZWVkCistCQkgKiB0byB0cnkgdG8gbWF0Y2ggYWdhaW4uCistCQkgKi8KKy0JCWlmIChtdHlwZSA9PSAwKQorLQkJCW1pbmRleCsrOworLQorLQkJbGlzdF9yZWN1cnNpdmUoZWx0YnVmLCBlbHR0eXBlLCBlbHRzaXplLCAmdGhpc19wcmVmaXgsICZtYXRjaFttaW5kZXhdLCBtYXRjaGVzLW1pbmRleCk7CistCQlmcmVlKGVsdGJ1Zik7CistCX0KKy19CistCistc3RhdGljIGludCBxY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisteworLQlyZXR1cm4gc3RyY21wKCooY2hhciAqKilhLCAqKGNoYXIgKiopYik7CistfQorLQorLXN0YXRpYyBpbnQgbGlzdCh1bnNpZ25lZCBjaGFyICpzaGExLGNoYXIgKipwYXRoKQorLXsKKy0Jdm9pZCAqYnVmZmVyOworLQl1bnNpZ25lZCBsb25nIHNpemU7CistCWludCBucGF0aHM7CistCistCWZvciAobnBhdGhzID0gMDsgcGF0aFtucGF0aHNdICE9IE5VTEw7IG5wYXRocysrKQorLQkJOworLQorLQlxc29ydChwYXRoLG5wYXRocyxzaXplb2YoY2hhciAqKSxxY21wKTsKKy0KKy0JYnVmZmVyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgTlVMTCk7CistCWlmICghYnVmZmVyKQorLQkJZGllKCJ1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUiKTsKKy0JbGlzdF9yZWN1cnNpdmUoYnVmZmVyLCAidHJlZSIsIHNpemUsIE5VTEwsIHBhdGgsIG5wYXRocyk7CistCWZyZWUoYnVmZmVyKTsKKy0JcmV0dXJuIDA7CistfQorLQorLXN0YXRpYyBjb25zdCBjaGFyICpsc190cmVlX3VzYWdlID0gImdpdC1scy10cmVlIFstcl0gWy16XSA8a2V5PiBbcGF0aHMuLi5dIjsKKy0KKy1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisteworLQl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworLQorLQl3aGlsZSAoMSA8IGFyZ2MgJiYgYXJndlsxXVswXSA9PSAnLScpIHsKKy0JCXN3aXRjaCAoYXJndlsxXVsxXSkgeworLQkJY2FzZSAneic6CistCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CistCQkJYnJlYWs7CistCQljYXNlICdyJzoKKy0JCQlyZWN1cnNpdmUgPSAxOworLQkJCWJyZWFrOworLQkJZGVmYXVsdDoKKy0JCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKy0JCX0KKy0JCWFyZ2MtLTsgYXJndisrOworLQl9CistCistCWlmIChhcmdjIDwgMikKKy0JCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworLQlpZiAoZ2V0X3NoYTEoYXJndlsxXSwgc2hhMSkgPCAwKQorLQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CistCWlmIChsaXN0KHNoYTEsICZhcmd2WzJdKSA8IDApCistCQlkaWUoImxpc3QgZmFpbGVkIik7CistCXJldHVybiAwOworLX0KKysvKgorKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorKyAqCisrICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorKyAqLworKyNpbmNsdWRlICJjYWNoZS5oIgorKyNpbmNsdWRlICJibG9iLmgiCisrI2luY2x1ZGUgInRyZWUuaCIKKysKKytzdGF0aWMgaW50IGxpbmVfdGVybWluYXRpb24gPSAnXG4nOworKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKysjZGVmaW5lIExTX1RSRUVfT05MWSAyCisrc3RhdGljIGludCBsc19vcHRpb25zID0gMDsKKysKKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCByb290X2VudHJ5OworKworK3N0YXRpYyB2b2lkIHByZXBhcmVfcm9vdCh1bnNpZ25lZCBjaGFyICpzaGExKQorK3sKKysJdW5zaWduZWQgY2hhciByc2hhWzIwXTsKKysJdW5zaWduZWQgbG9uZyBzaXplOworKwl2b2lkICpidWY7CisrCXN0cnVjdCB0cmVlICpyb290X3RyZWU7CisrCisrCWJ1ZiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKHNoYTEsICJ0cmVlIiwgJnNpemUsIHJzaGEpOworKwlmcmVlKGJ1Zik7CisrCWlmICghYnVmKQorKwkJZGllKCJDb3VsZCBub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysKKysJcm9vdF90cmVlID0gbG9va3VwX3RyZWUocnNoYSk7CisrCWlmICghcm9vdF90cmVlKQorKwkJZGllKCJDb3VsZCBub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysKKysJLyogUHJlcGFyZSBhIGZha2UgZW50cnkgKi8KKysJcm9vdF9lbnRyeS5kaXJlY3RvcnkgPSAxOworKwlyb290X2VudHJ5LmV4ZWN1dGFibGUgPSByb290X2VudHJ5LnN5bWxpbmsgPSAwOworKwlyb290X2VudHJ5Lm1vZGUgPSBTX0lGRElSOworKwlyb290X2VudHJ5Lm5hbWUgPSAiIjsKKysJcm9vdF9lbnRyeS5pdGVtLnRyZWUgPSByb290X3RyZWU7CisrCXJvb3RfZW50cnkucGFyZW50ID0gTlVMTDsKKyt9CisrCisrc3RhdGljIGludCBwcmVwYXJlX2NoaWxkcmVuKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmVsZW0pCisreworKwlpZiAoIWVsZW0tPmRpcmVjdG9yeSkKKysJCXJldHVybiAtMTsKKysJaWYgKCFlbGVtLT5pdGVtLnRyZWUtPm9iamVjdC5wYXJzZWQpIHsKKysJCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmU7CisrCQlpZiAocGFyc2VfdHJlZShlbGVtLT5pdGVtLnRyZWUpKQorKwkJCXJldHVybiAtMTsKKysJCS8qIFNldCB1cCB0aGUgcGFyZW50IGxpbmsgKi8KKysJCWZvciAoZSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsgZTsgZSA9IGUtPm5leHQpCisrCQkJZS0+cGFyZW50ID0gZWxlbTsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmZpbmRfZW50cnlfMChzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplbGVtLAorKwkJCQkJICAgIGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwljb25zdCBjaGFyICplcDsKKysJaW50IGxlbjsKKysKKysJd2hpbGUgKHBhdGggPCBwYXRoX2VuZCkgeworKwkJaWYgKHByZXBhcmVfY2hpbGRyZW4oZWxlbSkpCisrCQkJcmV0dXJuIE5VTEw7CisrCisrCQkvKiBJbiBlbGVtLT50cmVlLT5lbnRyaWVzLCBmaW5kIHRoZSBvbmUgdGhhdCBoYXMgbmFtZQorKwkJICogdGhhdCBtYXRjaGVzIHdoYXQgaXMgYmV0d2VlbiBwYXRoIGFuZCBlcC4KKysJCSAqLworKwkJZWxlbSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsKKysKKysJCWVwID0gc3RyY2hyKHBhdGgsICcvJyk7CisrCQlpZiAoIWVwIHx8IHBhdGhfZW5kIDw9IGVwKQorKwkJCWVwID0gcGF0aF9lbmQ7CisrCQlsZW4gPSBlcCAtIHBhdGg7CisrCisrCQl3aGlsZSAoZWxlbSkgeworKwkJCWlmICgoc3RybGVuKGVsZW0tPm5hbWUpID09IGxlbikgJiYKKysJCQkgICAgIXN0cm5jbXAoZWxlbS0+bmFtZSwgcGF0aCwgbGVuKSkKKysJCQkJYnJlYWs7CisrCQkJZWxlbSA9IGVsZW0tPm5leHQ7CisrCQl9CisrCQlpZiAocGF0aF9lbmQgPD0gZXAgfHwgIWVsZW0pCisrCQkJcmV0dXJuIGVsZW07CisrCQl3aGlsZSAoKmVwID09ICcvJyAmJiBlcCA8IHBhdGhfZW5kKQorKwkJCWVwKys7CisrCQlwYXRoID0gZXA7CisrCX0KKysJcmV0dXJuIE5VTEw7CisrfQorKworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5KGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJLyogRmluZCB0cmVlIGVsZW1lbnQsIGRlc2NlbmRpbmcgZnJvbSByb290LCB0aGF0CisrCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lZCBwYXRoLCBsYXppbHkgZXhwYW5kaW5nCisrCSAqIHRoZSB0cmVlIGlmIHBvc3NpYmxlLgorKwkgKi8KKysJaWYgKHBhdGggPT0gcGF0aF9lbmQpIHsKKysJCS8qIFNwZWNpYWwuICBUaGlzIGlzIHRoZSByb290IGxldmVsICovCisrCQlyZXR1cm4gJnJvb3RfZW50cnk7CisrCX0KKysJcmV0dXJuIGZpbmRfZW50cnlfMCgmcm9vdF9lbnRyeSwgcGF0aCwgcGF0aF9lbmQpOworK30KKysKKytzdGF0aWMgdm9pZCBzaG93X2VudHJ5X25hbWUoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCS8qIFRoaXMgaXMgeXVja3kuICBUaGUgcm9vdCBsZXZlbCBpcyB0aGVyZSBmb3IKKysJICogb3VyIGNvbnZlbmllbmNlIGJ1dCB3ZSByZWFsbHkgd2FudCB0byBkbyBhCisrCSAqIGZvcmVzdC4KKysJICovCisrCWlmIChlLT5wYXJlbnQgJiYgZS0+cGFyZW50ICE9ICZyb290X2VudHJ5KSB7CisrCQlzaG93X2VudHJ5X25hbWUoZS0+cGFyZW50KTsKKysJCXB1dGNoYXIoJy8nKTsKKysJfQorKwlwcmludGYoIiVzIiwgZS0+bmFtZSk7CisrfQorKworK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV90eXBlKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gKGUtPmRpcmVjdG9yeSA/ICJ0cmVlIiA6ICJibG9iIik7CisrfQorKworK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV9oZXgoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSkKKyt7CisrCXJldHVybiBzaGExX3RvX2hleChlLT5kaXJlY3RvcnkKKysJCQkgICA/IGUtPml0ZW0udHJlZS0+b2JqZWN0LnNoYTEKKysJCQkgICA6IGUtPml0ZW0uYmxvYi0+b2JqZWN0LnNoYTEpOworK30KKysKKysvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBtdXR1YWxseSByZWN1cnNpdmUgcm91dGluZXMgKi8KKytzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqLCBpbnQpOworKworK3N0YXRpYyBpbnQgc2hvd19jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplLCBpbnQgbGV2ZWwpCisreworKwlpZiAocHJlcGFyZV9jaGlsZHJlbihlKSkKKysJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGxzLXRyZWUgc2hvd19jaGlsZHJlbiBjYWxsZWQgd2l0aCBub24gdHJlZSIpOworKwllID0gZS0+aXRlbS50cmVlLT5lbnRyaWVzOworKwl3aGlsZSAoZSkgeworKwkJc2hvd19lbnRyeShlLCBsZXZlbCk7CisrCQllID0gZS0+bmV4dDsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWludCBlcnIgPSAwOyAKKysKKysJaWYgKGUgIT0gJnJvb3RfZW50cnkpIHsKKysJCXByaW50ZigiJTA2byAlcyAlcwkiLCBlLT5tb2RlLCBlbnRyeV90eXBlKGUpLAorKwkJICAgICAgIGVudHJ5X2hleChlKSk7CisrCQlzaG93X2VudHJ5X25hbWUoZSk7CisrCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworKwl9CisrCisrCWlmIChlLT5kaXJlY3RvcnkpIHsKKysJCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBjYXNlczoKKysJCSAqICgxKSBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgcmVxdWVzdCAoZXhwbGljaXQgcGF0aCBmcm9tIHRoZQorKwkJICogICAgIGNvbW1hbmQgbGluZSwgb3IgInJvb3QiIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgbGluZSkuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIHNob3cgZGlyZWN0IGNoaWxkcmVuLiAgV2UgZG8gbm90IAorKwkJICogICAgIHJlY3Vyc2UgaW50byB0aGVtLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBkbyByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIGRvIG5vdCByZWN1cnNlIGludG8gY2hpbGRyZW4uCisrCQkgKiAoMikgV2UgY2FtZSBoZXJlIGJlY2F1c2Ugb3VyIGNhbGxlciBpcyBlaXRoZXIgKDEtYSkgb3IKKysJCSAqICAgICAoMS1iKS4KKysJCSAqICBhLiBXaXRob3V0IGFueSBmbGFnLiAgV2UgZG8gbm90IHNob3cgb3VyIGNoaWxkcmVuICh3aGljaAorKwkJICogICAgIGFyZSBncmFuZGNoaWxkcmVuIGZvciB0aGUgb3JpZ2luYWwgcmVxdWVzdCkuCisrCQkgKiAgYi4gV2l0aCAtci4gIFdlIGNvbnRpbnVlIHRvIHJlY3Vyc2UgaW50byBvdXIgY2hpbGRyZW4uCisrCQkgKiAgYy4gV2l0aCAtZC4gIFdlIHNob3VsZCBub3QgaGF2ZSBjb21lIGhlcmUgdG8gYmVnaW4gd2l0aC4KKysJCSAqLworKwkJaWYgKGxldmVsID09IDAgJiYgIShsc19vcHRpb25zICYgTFNfVFJFRV9PTkxZKSkKKysJCQkvKiBjYXNlICgxKS1hIGFuZCAoMSktYiAqLworKwkJCWVyciA9IGVyciB8IHNob3dfY2hpbGRyZW4oZSwgbGV2ZWwrMSk7CisrCQllbHNlIGlmIChsZXZlbCAmJiBsc19vcHRpb25zICYgTFNfUkVDVVJTSVZFKQorKwkJCS8qIGNhc2UgKDIpLWIgKi8KKysJCQllcnIgPSBlcnIgfCBzaG93X2NoaWxkcmVuKGUsIGxldmVsKzEpOworKwl9CisrCXJldHVybiBlcnI7CisrfQorKworK3N0YXRpYyBpbnQgbGlzdF9vbmUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqcGF0aF9lbmQpCisreworKwlpbnQgZXJyID0gMDsKKysJc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZSA9IGZpbmRfZW50cnkocGF0aCwgcGF0aF9lbmQpOworKwlpZiAoIWUpIHsKKysJCS8qIHRyYWRpdGlvbmFsbHkgbHMtdHJlZSBkb2VzIG5vdCBjb21wbGFpbiBhYm91dAorKwkJICogbWlzc2luZyBwYXRoLiAgV2UgbWF5IGNoYW5nZSB0aGlzIGxhdGVyIHRvIG1hdGNoCisrCQkgKiB3aGF0ICIvYmluL2xzIC1hIiBkb2VzLCB3aGljaCBpcyB0byBjb21wbGFpbi4KKysJCSAqLworKwkJcmV0dXJuIGVycjsKKysJfQorKwllcnIgPSBlcnIgfCBzaG93X2VudHJ5KGUsIDApOworKwlyZXR1cm4gZXJyOworK30KKysKKytzdGF0aWMgaW50IGxpc3QoY2hhciAqKnBhdGgpCisreworKwlpbnQgaTsKKysJaW50IGVyciA9IDA7CisrCWZvciAoaSA9IDA7IHBhdGhbaV07IGkrKykgeworKwkJaW50IGxlbiA9IHN0cmxlbihwYXRoW2ldKTsKKysJCXdoaWxlICgwIDw9IGxlbiAmJiBwYXRoW2ldW2xlbl0gPT0gJy8nKQorKwkJCWxlbi0tOworKwkJZXJyID0gZXJyIHwgbGlzdF9vbmUocGF0aFtpXSwgcGF0aFtpXSArIGxlbik7CisrCX0KKysJcmV0dXJuIGVycjsKKyt9CisrCisrc3RhdGljIGNvbnN0IGNoYXIgKmxzX3RyZWVfdXNhZ2UgPQorKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworKworK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyt7CisrCXN0YXRpYyBjaGFyICpwYXRoMFtdID0geyAiIiwgTlVMTCB9OworKwljaGFyICoqcGF0aDsKKysJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKysKKysJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisrCQlzd2l0Y2ggKGFyZ3ZbMV1bMV0pIHsKKysJCWNhc2UgJ3onOgorKwkJCWxpbmVfdGVybWluYXRpb24gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSAncic6CisrCQkJbHNfb3B0aW9ucyB8PSBMU19SRUNVUlNJVkU7CisrCQkJYnJlYWs7CisrCQljYXNlICdkJzoKKysJCQlsc19vcHRpb25zIHw9IExTX1RSRUVfT05MWTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisrCQl9CisrCQlhcmdjLS07IGFyZ3YrKzsKKysJfQorKworKwlpZiAoYXJnYyA8IDIpCisrCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKysJaWYgKGdldF9zaGExKGFyZ3ZbMV0sIHNoYTEpIDwgMCkKKysJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworKworKwlwYXRoID0gKGFyZ2MgPT0gMikgPyBwYXRoMCA6IChhcmd2ICsgMik7CisrCXByZXBhcmVfcm9vdChzaGExKTsKKysJaWYgKGxpc3QocGF0aCkgPCAwKQorKwkJZGllKCJsaXN0IGZhaWxlZCIpOworKwlyZXR1cm4gMDsKKyt9CitkaWZmIC0tZ2l0IGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoIGIvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCistLS0gYS90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKKysrKyBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorQEAgLTc0LDggKzc0LDggQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICdscy10cmVlIGZpbHRlcmVkJyBcCisgICAgICdnaXQtbHMtdHJlZSAkdHJlZSBwYXRoMSBwYXRoMCA+Y3VycmVudCAmJgorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKy0xMDA2NDQgYmxvYiBYCXBhdGgwCisgMTIwMDAwIGJsb2IgWAlwYXRoMQorKzEwMDY0NCBibG9iIFgJcGF0aDAKKyBFT0YKKyAgICAgIHRlc3Rfb3V0cHV0JworIAorQEAgLTg1LDcgKzg1LDYgQEAgdGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgICBjYXQgPmV4cGVjdGVkIDw8XEVPRiAmJgorIDA0MDAwMCB0cmVlIFgJcGF0aDIKKyAwNDAwMDAgdHJlZSBYCXBhdGgyL2JhegorLTEwMDY0NCBibG9iIFgJcGF0aDIvYmF6L2IKKyAxMjAwMDAgYmxvYiBYCXBhdGgyL2JhemJvCisgMTAwNjQ0IGJsb2IgWAlwYXRoMi9mb28KKyBFT0YKK2RpZmYgLS1naXQgYS90cmVlLmMgYi90cmVlLmMKKy0tLSBhL3RyZWUuYworKysrIGIvdHJlZS5jCitAQCAtMTMzLDcgKzEzMyw3IEBAIGludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwKKyAJCX0KKyAJCWlmIChvYmopCisgCQkJYWRkX3JlZigmaXRlbS0+b2JqZWN0LCBvYmopOworLQorKwkJZW50cnktPnBhcmVudCA9IE5VTEw7IC8qIG5lZWRzIHRvIGJlIGZpbGxlZCBieSB0aGUgdXNlciAqLworIAkJKmxpc3RfcCA9IGVudHJ5OworIAkJbGlzdF9wID0gJmVudHJ5LT5uZXh0OworIAl9CitkaWZmIC0tZ2l0IGEvdHJlZS5oIGIvdHJlZS5oCistLS0gYS90cmVlLmgKKysrKyBiL3RyZWUuaAorQEAgLTE2LDYgKzE2LDcgQEAgc3RydWN0IHRyZWVfZW50cnlfbGlzdCB7CisgCQlzdHJ1Y3QgdHJlZSAqdHJlZTsKKyAJCXN0cnVjdCBibG9iICpibG9iOworIAl9IGl0ZW07CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKnBhcmVudDsKKyB9OworIAorIHN0cnVjdCB0cmVlIHsKZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS00LmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS00LmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWMwMjhiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTQuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIHQvdDAwMDAtYmFzaWMuc2ggfCAgICAwIAorIHQvdGVzdC1saWIuc2ggICAgfCAgICAwIAorIDIgZmlsZXMgY2hhbmdlZCwgMCBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQorIG1vZGUgY2hhbmdlIDEwMDY0NCA9PiAxMDA3NTUgdC90MDAwMC1iYXNpYy5zaAorIG1vZGUgY2hhbmdlIDEwMDY0NCA9PiAxMDA3NTUgdC90ZXN0LWxpYi5zaApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTQucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTU2YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTQucGF0Y2gKQEAgLTAsMCArMSw3IEBACitjZWVkZTU5ZWE5MGNlYmFkNTJiYTljODI2M2ZlZjNmYjZlZjE3NTkzIChmcm9tIDM2OGY5OWQ1N2U4ZWQxNzI0M2YyZTE2NDQzMTQ0OWQ0OGJmY2EyZmIpCitkaWZmIC0tZ2l0IGEvdC90MDAwMC1iYXNpYy5zaCBiL3QvdDAwMDAtYmFzaWMuc2gKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CitkaWZmIC0tZ2l0IGEvdC90ZXN0LWxpYi5zaCBiL3QvdGVzdC1saWIuc2gKK29sZCBtb2RlIDEwMDY0NAorbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS90L3Q0MTAwL3QtYXBwbHktNS5leHBlY3QgYi90L3Q0MTAwL3QtYXBwbHktNS5leHBlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4N2RmMQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDAvdC1hcHBseS01LmV4cGVjdApAQCAtMCwwICsxLDE5IEBACisgRG9jdW1lbnRhdGlvbi9naXQtcnB1bGwudHh0ICAgIHwgICA1MCAtLS0tLS0tLS0tLS0tLS0tLS0tCisgRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0ICAgIHwgICAzMCAtLS0tLS0tLS0tLS0KKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQgfCAgIDUwICsrKysrKysrKysrKysrKysrKysKKyBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQgfCAgIDMwICsrKysrKysrKysrKworIERvY3VtZW50YXRpb24vZ2l0LnR4dCAgICAgICAgICB8ICAgIDYgKy0KKyBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICstCisgcnB1bGwuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICA4MyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHJwdXNoLmMgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMDQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHNzaC1wdWxsLmMgICAgICAgICAgICAgICAgICAgICB8ICAgODMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBzc2gtcHVzaC5jICAgICAgICAgICAgICAgICAgICAgfCAgMTA0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyAxMCBmaWxlcyBjaGFuZ2VkLCAyNzMgaW5zZXJ0aW9ucygrKSwgMjczIGRlbGV0aW9ucygtKQorIGRlbGV0ZSBEb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKyBkZWxldGUgRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CisgY3JlYXRlIERvY3VtZW50YXRpb24vZ2l0LXNzaC1wdWxsLnR4dAorIGNyZWF0ZSBEb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVzaC50eHQKKyBkZWxldGUgcnB1bGwuYworIGRlbGV0ZSBycHVzaC5jCisgY3JlYXRlIHNzaC1wdWxsLmMKKyBjcmVhdGUgc3NoLXB1c2guYwpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTUucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTExNjIzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTUucGF0Y2gKQEAgLTAsMCArMSw2MTIgQEAKK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1ycHVsbC50eHQKKy0tLSBhL0RvY3VtZW50YXRpb24vZ2l0LXJwdWxsLnR4dAorKysrIC9kZXYvbnVsbAorQEAgLTEsNTAgKzAsMCBAQAorLWdpdC1ycHVsbCgxKQorLT09PT09PT09PT09PQorLXYwLjEsIE1heSAyMDA1CistCistTkFNRQorLS0tLS0KKy1naXQtcnB1bGwgLSBQdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbgorLQorLQorLQorLVNZTk9QU0lTCistLS0tLS0tLS0KKy0nZ2l0LXJwdWxsJyBbLWNdIFstdF0gWy1hXSBbLWRdIFstdl0gWy0tcmVjb3Zlcl0gY29tbWl0LWlkIHVybAorLQorLURFU0NSSVBUSU9OCistLS0tLS0tLS0tLS0KKy1QdWxscyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkgb3ZlciBzc2ggY29ubmVjdGlvbiwgaW52b2tpbmcgZ2l0LXJwdXNoIG9uCistdGhlIG90aGVyIGVuZC4KKy0KKy1PUFRJT05TCistLS0tLS0tLQorLS1jOjoKKy0JR2V0IHRoZSBjb21taXQgb2JqZWN0cy4KKy0tdDo6CistCUdldCB0cmVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbW1pdCBvYmplY3RzLgorLS1hOjoKKy0JR2V0IGFsbCB0aGUgb2JqZWN0cy4KKy0tZDo6CistCURvIG5vdCBjaGVjayBmb3IgZGVsdGEgYmFzZSBvYmplY3RzICh1c2UgdGhpcyBvcHRpb24KKy0Jb25seSB3aGVuIHlvdSBrbm93IHRoZSByZW1vdGUgcmVwb3NpdG9yeSBpcyBub3QKKy0JZGVsdGlmaWVkKS4KKy0tLXJlY292ZXI6OgorLQlDaGVjayBkZXBlbmRlbmN5IG9mIGRlbHRpZmllZCBvYmplY3QgbW9yZSBjYXJlZnVsbHkgdGhhbgorLQl1c3VhbCwgdG8gcmVjb3ZlciBhZnRlciBlYXJsaWVyIHB1bGwgdGhhdCB3YXMgaW50ZXJydXB0ZWQuCistLXY6OgorLQlSZXBvcnQgd2hhdCBpcyBkb3dubG9hZGVkLgorLQorLQorLUF1dGhvcgorLS0tLS0tLQorLVdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLQorLURvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLQorLURvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCistCistR0lUCistLS0tCistUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCistCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtcnB1c2gudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1ycHVzaC50eHQKKysrKyAvZGV2L251bGwKK0BAIC0xLDMwICswLDAgQEAKKy1naXQtcnB1c2goMSkKKy09PT09PT09PT09PT0KKy12MC4xLCBNYXkgMjAwNQorLQorLU5BTUUKKy0tLS0tCistZ2l0LXJwdXNoIC0gSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1ycHVsbAorLQorLQorLVNZTk9QU0lTCistLS0tLS0tLS0KKy0nZ2l0LXJwdXNoJworLQorLURFU0NSSVBUSU9OCistLS0tLS0tLS0tLS0KKy1IZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXJwdWxsLgorLQorLQorLUF1dGhvcgorLS0tLS0tLQorLVdyaXR0ZW4gYnkgTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQG9zZGwub3JnPgorLQorLURvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0tLQorLURvY3VtZW50YXRpb24gYnkgRGF2aWQgR3JlYXZlcywgSnVuaW8gQyBIYW1hbm8gYW5kIHRoZSBnaXQtbGlzdCA8Z2l0QHZnZXIua2VybmVsLm9yZz4uCistCistR0lUCistLS0tCistUGFydCBvZiB0aGUgbGluazpnaXQuaHRtbFtnaXRdIHN1aXRlCistCitkaWZmIGEvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0IGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1bGwudHh0CistLS0gL2Rldi9udWxsCisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC1zc2gtcHVsbC50eHQKK0BAIC0wLDAgKzEsNTAgQEAKKytnaXQtc3NoLXB1bGwoMSkKKys9PT09PT09PT09PT09PT0KKyt2MC4xLCBNYXkgMjAwNQorKworK05BTUUKKystLS0tCisrZ2l0LXNzaC1wdWxsIC0gUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKysKKysKKysKKytTWU5PUFNJUworKy0tLS0tLS0tCisrJ2dpdC1zc2gtcHVsbCcgWy1jXSBbLXRdIFstYV0gWy1kXSBbLXZdIFstLXJlY292ZXJdIGNvbW1pdC1pZCB1cmwKKysKKytERVNDUklQVElPTgorKy0tLS0tLS0tLS0tCisrUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24sIGludm9raW5nIGdpdC1zc2gtcHVzaAorK29uIHRoZSBvdGhlciBlbmQuCisrCisrT1BUSU9OUworKy0tLS0tLS0KKystYzo6CisrCUdldCB0aGUgY29tbWl0IG9iamVjdHMuCisrLXQ6OgorKwlHZXQgdHJlZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb21taXQgb2JqZWN0cy4KKystYTo6CisrCUdldCBhbGwgdGhlIG9iamVjdHMuCisrLWQ6OgorKwlEbyBub3QgY2hlY2sgZm9yIGRlbHRhIGJhc2Ugb2JqZWN0cyAodXNlIHRoaXMgb3B0aW9uCisrCW9ubHkgd2hlbiB5b3Uga25vdyB0aGUgcmVtb3RlIHJlcG9zaXRvcnkgaXMgbm90CisrCWRlbHRpZmllZCkuCisrLS1yZWNvdmVyOjoKKysJQ2hlY2sgZGVwZW5kZW5jeSBvZiBkZWx0aWZpZWQgb2JqZWN0IG1vcmUgY2FyZWZ1bGx5IHRoYW4KKysJdXN1YWwsIHRvIHJlY292ZXIgYWZ0ZXIgZWFybGllciBwdWxsIHRoYXQgd2FzIGludGVycnVwdGVkLgorKy12OjoKKysJUmVwb3J0IHdoYXQgaXMgZG93bmxvYWRlZC4KKysKKysKKytBdXRob3IKKystLS0tLS0KKytXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKysKKytEb2N1bWVudGF0aW9uCisrLS0tLS0tLS0tLS0tLS0KKytEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorKworK0dJVAorKy0tLQorK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorKworZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LXNzaC1wdXNoLnR4dAorLS0tIC9kZXYvbnVsbAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtc3NoLXB1c2gudHh0CitAQCAtMCwwICsxLDMwIEBACisrZ2l0LXNzaC1wdXNoKDEpCisrPT09PT09PT09PT09PT09CisrdjAuMSwgTWF5IDIwMDUKKysKKytOQU1FCisrLS0tLQorK2dpdC1zc2gtcHVzaCAtIEhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtc3NoLXB1bGwKKysKKysKKytTWU5PUFNJUworKy0tLS0tLS0tCisrJ2dpdC1zc2gtcHVzaCcKKysKKytERVNDUklQVElPTgorKy0tLS0tLS0tLS0tCisrSGVscGVyICJzZXJ2ZXItc2lkZSIgcHJvZ3JhbSB1c2VkIGJ5IGdpdC1zc2gtcHVsbC4KKysKKysKKytBdXRob3IKKystLS0tLS0KKytXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKysKKytEb2N1bWVudGF0aW9uCisrLS0tLS0tLS0tLS0tLS0KKytEb2N1bWVudGF0aW9uIGJ5IERhdmlkIEdyZWF2ZXMsIEp1bmlvIEMgSGFtYW5vIGFuZCB0aGUgZ2l0LWxpc3QgPGdpdEB2Z2VyLmtlcm5lbC5vcmc+LgorKworK0dJVAorKy0tLQorK1BhcnQgb2YgdGhlIGxpbms6Z2l0Lmh0bWxbZ2l0XSBzdWl0ZQorKworZGlmZiBhL0RvY3VtZW50YXRpb24vZ2l0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQudHh0CisrKysgYi9Eb2N1bWVudGF0aW9uL2dpdC50eHQKK0BAIC0xNDgsNyArMTQ4LDcgQEAgbGluazpnaXQtcmVzb2x2ZS1zY3JpcHQuaHRtbFtnaXQtcmVzb2x2ZQorIGxpbms6Z2l0LXRhZy1zY3JpcHQuaHRtbFtnaXQtdGFnLXNjcmlwdF06OgorIAlBbiBleGFtcGxlIHNjcmlwdCB0byBjcmVhdGUgYSB0YWcgb2JqZWN0IHNpZ25lZCB3aXRoIEdQRworIAorLWxpbms6Z2l0LXJwdWxsLmh0bWxbZ2l0LXJwdWxsXTo6CisrbGluazpnaXQtc3NoLXB1bGwuaHRtbFtnaXQtc3NoLXB1bGxdOjoKKyAJUHVsbHMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5IG92ZXIgc3NoIGNvbm5lY3Rpb24KKyAKKyBJbnRlcm9nYXRvcnM6CitAQCAtMTU2LDggKzE1Niw4IEBAIEludGVyb2dhdG9yczoKKyBsaW5rOmdpdC1kaWZmLWhlbHBlci5odG1sW2dpdC1kaWZmLWhlbHBlcl06OgorIAlHZW5lcmF0ZXMgcGF0Y2ggZm9ybWF0IG91dHB1dCBmb3IgZ2l0LWRpZmYtKgorIAorLWxpbms6Z2l0LXJwdXNoLmh0bWxbZ2l0LXJwdXNoXTo6CistCUhlbHBlciAic2VydmVyLXNpZGUiIHByb2dyYW0gdXNlZCBieSBnaXQtcnB1bGwKKytsaW5rOmdpdC1zc2gtcHVzaC5odG1sW2dpdC1zc2gtcHVzaF06OgorKwlIZWxwZXIgInNlcnZlci1zaWRlIiBwcm9ncmFtIHVzZWQgYnkgZ2l0LXNzaC1wdWxsCisgCisgCisgCitkaWZmIGEvTWFrZWZpbGUgYi9NYWtlZmlsZQorLS0tIGEvTWFrZWZpbGUKKysrKyBiL01ha2VmaWxlCitAQCAtMzAsNyArMzAsNyBAQCBQUk9HPSAgIGdpdC11cGRhdGUtY2FjaGUgZ2l0LWRpZmYtZmlsZXMgCisgCWdpdC1jaGVja291dC1jYWNoZSBnaXQtZGlmZi10cmVlIGdpdC1yZXYtdHJlZSBnaXQtbHMtZmlsZXMgXAorIAlnaXQtY2hlY2stZmlsZXMgZ2l0LWxzLXRyZWUgZ2l0LW1lcmdlLWJhc2UgZ2l0LW1lcmdlLWNhY2hlIFwKKyAJZ2l0LXVucGFjay1maWxlIGdpdC1leHBvcnQgZ2l0LWRpZmYtY2FjaGUgZ2l0LWNvbnZlcnQtY2FjaGUgXAorLQlnaXQtaHR0cC1wdWxsIGdpdC1ycHVzaCBnaXQtcnB1bGwgZ2l0LXJldi1saXN0IGdpdC1ta3RhZyBcCisrCWdpdC1odHRwLXB1bGwgZ2l0LXNzaC1wdXNoIGdpdC1zc2gtcHVsbCBnaXQtcmV2LWxpc3QgZ2l0LW1rdGFnIFwKKyAJZ2l0LWRpZmYtaGVscGVyIGdpdC10YXItdHJlZSBnaXQtbG9jYWwtcHVsbCBnaXQtd3JpdGUtYmxvYiBcCisgCWdpdC1nZXQtdGFyLWNvbW1pdC1pZCBnaXQtbWtkZWx0YSBnaXQtYXBwbHkgZ2l0LXN0cmlwc3BhY2UKKyAKK0BAIC0xMDUsOCArMTA1LDggQEAgZ2l0LWRpZmYtY2FjaGU6IGRpZmYtY2FjaGUuYworIGdpdC1jb252ZXJ0LWNhY2hlOiBjb252ZXJ0LWNhY2hlLmMKKyBnaXQtaHR0cC1wdWxsOiBodHRwLXB1bGwuYyBwdWxsLmMKKyBnaXQtbG9jYWwtcHVsbDogbG9jYWwtcHVsbC5jIHB1bGwuYworLWdpdC1ycHVzaDogcnNoLmMKKy1naXQtcnB1bGw6IHJzaC5jIHB1bGwuYworK2dpdC1zc2gtcHVzaDogcnNoLmMKKytnaXQtc3NoLXB1bGw6IHJzaC5jIHB1bGwuYworIGdpdC1yZXYtbGlzdDogcmV2LWxpc3QuYworIGdpdC1ta3RhZzogbWt0YWcuYworIGdpdC1kaWZmLWhlbHBlcjogZGlmZi1oZWxwZXIuYworZGlmZiBhL3JwdWxsLmMgYi9ycHVsbC5jCistLS0gYS9ycHVsbC5jCisrKysgL2Rldi9udWxsCitAQCAtMSw4MyArMCwwIEBACistI2luY2x1ZGUgImNhY2hlLmgiCistI2luY2x1ZGUgImNvbW1pdC5oIgorLSNpbmNsdWRlICJyc2guaCIKKy0jaW5jbHVkZSAicHVsbC5oIgorLQorLXN0YXRpYyBpbnQgZmRfaW47Cistc3RhdGljIGludCBmZF9vdXQ7CistCistc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworLQorLWludCBmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQorLXsKKy0JaW50IHJldDsKKy0Jc2lnbmVkIGNoYXIgcmVtb3RlOworLQljaGFyIHR5cGUgPSAnbyc7CistCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKQorLQkJcmV0dXJuIDA7CistCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworLQl3cml0ZShmZF9vdXQsIHNoYTEsIDIwKTsKKy0JaWYgKHJlYWQoZmRfaW4sICZyZW1vdGUsIDEpIDwgMSkKKy0JCXJldHVybiAtMTsKKy0JaWYgKHJlbW90ZSA8IDApCistCQlyZXR1cm4gcmVtb3RlOworLQlyZXQgPSB3cml0ZV9zaGExX2Zyb21fZmQoc2hhMSwgZmRfaW4pOworLQlpZiAoIXJldCkKKy0JCXB1bGxfc2F5KCJnb3QgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JcmV0dXJuIHJldDsKKy19CistCistaW50IGdldF92ZXJzaW9uKHZvaWQpCisteworLQljaGFyIHR5cGUgPSAndic7CistCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworLQl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKy0JaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKSB7CistCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IHJlYWQgdmVyc2lvbiBmcm9tIHJlbW90ZSBlbmQiKTsKKy0JfQorLQlyZXR1cm4gMDsKKy19CistCistaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorLXsKKy0JY2hhciAqY29tbWl0X2lkOworLQljaGFyICp1cmw7CistCWludCBhcmcgPSAxOworLQorLQl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CistCQlpZiAoYXJndlthcmddWzFdID09ICd0JykgeworLQkJCWdldF90cmVlID0gMTsKKy0JCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworLQkJCWdldF9oaXN0b3J5ID0gMTsKKy0JCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdkJykgeworLQkJCWdldF9kZWx0YSA9IDA7CistCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpIHsKKy0JCQlnZXRfZGVsdGEgPSAyOworLQkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2EnKSB7CistCQkJZ2V0X2FsbCA9IDE7CistCQkJZ2V0X3RyZWUgPSAxOworLQkJCWdldF9oaXN0b3J5ID0gMTsKKy0JCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykgeworLQkJCWdldF92ZXJib3NlbHkgPSAxOworLQkJfQorLQkJYXJnKys7CistCX0KKy0JaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CistCQl1c2FnZSgiZ2l0LXJwdWxsIFstY10gWy10XSBbLWFdIFstdl0gWy1kXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsIik7CistCQlyZXR1cm4gMTsKKy0JfQorLQljb21taXRfaWQgPSBhcmd2W2FyZ107CistCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVzaCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCistCQlyZXR1cm4gMTsKKy0KKy0JaWYgKGdldF92ZXJzaW9uKCkpCistCQlyZXR1cm4gMTsKKy0KKy0JaWYgKHB1bGwoY29tbWl0X2lkKSkKKy0JCXJldHVybiAxOworLQorLQlyZXR1cm4gMDsKKy19CitkaWZmIGEvcnB1c2guYyBiL3JwdXNoLmMKKy0tLSBhL3JwdXNoLmMKKysrKyAvZGV2L251bGwKK0BAIC0xLDEwNCArMCwwIEBACistI2luY2x1ZGUgImNhY2hlLmgiCistI2luY2x1ZGUgInJzaC5oIgorLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CistI2luY2x1ZGUgPGVycm5vLmg+CistCistdW5zaWduZWQgY2hhciBsb2NhbF92ZXJzaW9uID0gMTsKKy11bnNpZ25lZCBjaGFyIHJlbW90ZV92ZXJzaW9uID0gMDsKKy0KKy1pbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgeworLQlzc2l6ZV90IHNpemU7CistCWludCBwb3NuID0gMDsKKy0JY2hhciBzaGExWzIwXTsKKy0JdW5zaWduZWQgbG9uZyBvYmpzaXplOworLQl2b2lkICpidWY7CistCXNpZ25lZCBjaGFyIHJlbW90ZTsKKy0JZG8geworLQkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworLQkJaWYgKHNpemUgPCAwKSB7CistCQkJcGVycm9yKCJnaXQtcnB1c2g6IHJlYWQgIik7CistCQkJcmV0dXJuIC0xOworLQkJfQorLQkJaWYgKCFzaXplKQorLQkJCXJldHVybiAtMTsKKy0JCXBvc24gKz0gc2l6ZTsKKy0JfSB3aGlsZSAocG9zbiA8IDIwKTsKKy0JCistCS8qIGZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOyAqLworLQlyZW1vdGUgPSAwOworLQkKKy0JYnVmID0gbWFwX3NoYTFfZmlsZShzaGExLCAmb2Jqc2l6ZSk7CistCQorLQlpZiAoIWJ1ZikgeworLQkJZnByaW50ZihzdGRlcnIsICJnaXQtcnB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKy0JCQlzaGExX3RvX2hleChzaGExKSk7CistCQlyZW1vdGUgPSAtMTsKKy0JfQorLQkKKy0Jd3JpdGUoZmRfb3V0LCAmcmVtb3RlLCAxKTsKKy0JCistCWlmIChyZW1vdGUgPCAwKQorLQkJcmV0dXJuIDA7CistCQorLQlwb3NuID0gMDsKKy0JZG8geworLQkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworLQkJaWYgKHNpemUgPD0gMCkgeworLQkJCWlmICghc2l6ZSkgeworLQkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1ycHVzaDogd3JpdGUgY2xvc2VkIik7CistCQkJfSBlbHNlIHsKKy0JCQkJcGVycm9yKCJnaXQtcnB1c2g6IHdyaXRlICIpOworLQkJCX0KKy0JCQlyZXR1cm4gLTE7CistCQl9CistCQlwb3NuICs9IHNpemU7CistCX0gd2hpbGUgKHBvc24gPCBvYmpzaXplKTsKKy0JcmV0dXJuIDA7CistfQorLQorLWludCBzZXJ2ZV92ZXJzaW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKKy17CistCWlmIChyZWFkKGZkX2luLCAmcmVtb3RlX3ZlcnNpb24sIDEpIDwgMSkKKy0JCXJldHVybiAtMTsKKy0Jd3JpdGUoZmRfb3V0LCAmbG9jYWxfdmVyc2lvbiwgMSk7CistCXJldHVybiAwOworLX0KKy0KKy12b2lkIHNlcnZpY2UoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CistCWNoYXIgdHlwZTsKKy0JaW50IHJldHZhbDsKKy0JZG8geworLQkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworLQkJaWYgKHJldHZhbCA8IDEpIHsKKy0JCQlpZiAocmV0dmFsIDwgMCkKKy0JCQkJcGVycm9yKCJycHVzaDogcmVhZCAiKTsKKy0JCQlyZXR1cm47CistCQl9CistCQlpZiAodHlwZSA9PSAndicgJiYgc2VydmVfdmVyc2lvbihmZF9pbiwgZmRfb3V0KSkKKy0JCQlyZXR1cm47CistCQlpZiAodHlwZSA9PSAnbycgJiYgc2VydmVfb2JqZWN0KGZkX2luLCBmZF9vdXQpKQorLQkJCXJldHVybjsKKy0JfSB3aGlsZSAoMSk7CistfQorLQorLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKy17CistCWludCBhcmcgPSAxOworLSAgICAgICAgY2hhciAqY29tbWl0X2lkOworLSAgICAgICAgY2hhciAqdXJsOworLQlpbnQgZmRfaW4sIGZkX291dDsKKy0Jd2hpbGUgKGFyZyA8IGFyZ2MgJiYgYXJndlthcmddWzBdID09ICctJykgeworLSAgICAgICAgICAgICAgICBhcmcrKzsKKy0gICAgICAgIH0KKy0gICAgICAgIGlmIChhcmdjIDwgYXJnICsgMikgeworLQkJdXNhZ2UoImdpdC1ycHVzaCBbLWNdIFstdF0gWy1hXSBjb21taXQtaWQgdXJsIik7CistICAgICAgICAgICAgICAgIHJldHVybiAxOworLSAgICAgICAgfQorLQljb21taXRfaWQgPSBhcmd2W2FyZ107CistCXVybCA9IGFyZ3ZbYXJnICsgMV07CistCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1ycHVsbCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCistCQlyZXR1cm4gMTsKKy0KKy0Jc2VydmljZShmZF9pbiwgZmRfb3V0KTsKKy0JcmV0dXJuIDA7CistfQorZGlmZiBhL3NzaC1wdWxsLmMgYi9zc2gtcHVsbC5jCistLS0gL2Rldi9udWxsCisrKysgYi9zc2gtcHVsbC5jCitAQCAtMCwwICsxLDgzIEBACisrI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgImNvbW1pdC5oIgorKyNpbmNsdWRlICJyc2guaCIKKysjaW5jbHVkZSAicHVsbC5oIgorKworK3N0YXRpYyBpbnQgZmRfaW47Cisrc3RhdGljIGludCBmZF9vdXQ7CisrCisrc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVtb3RlX3ZlcnNpb24gPSAwOworK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxvY2FsX3ZlcnNpb24gPSAxOworKworK2ludCBmZXRjaCh1bnNpZ25lZCBjaGFyICpzaGExKQorK3sKKysJaW50IHJldDsKKysJc2lnbmVkIGNoYXIgcmVtb3RlOworKwljaGFyIHR5cGUgPSAnbyc7CisrCWlmIChoYXNfc2hhMV9maWxlKHNoYTEpKQorKwkJcmV0dXJuIDA7CisrCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworKwl3cml0ZShmZF9vdXQsIHNoYTEsIDIwKTsKKysJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGUsIDEpIDwgMSkKKysJCXJldHVybiAtMTsKKysJaWYgKHJlbW90ZSA8IDApCisrCQlyZXR1cm4gcmVtb3RlOworKwlyZXQgPSB3cml0ZV9zaGExX2Zyb21fZmQoc2hhMSwgZmRfaW4pOworKwlpZiAoIXJldCkKKysJCXB1bGxfc2F5KCJnb3QgJXNcbiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKysJcmV0dXJuIHJldDsKKyt9CisrCisraW50IGdldF92ZXJzaW9uKHZvaWQpCisreworKwljaGFyIHR5cGUgPSAndic7CisrCXdyaXRlKGZkX291dCwgJnR5cGUsIDEpOworKwl3cml0ZShmZF9vdXQsICZsb2NhbF92ZXJzaW9uLCAxKTsKKysJaWYgKHJlYWQoZmRfaW4sICZyZW1vdGVfdmVyc2lvbiwgMSkgPCAxKSB7CisrCQlyZXR1cm4gZXJyb3IoIkNvdWxkbid0IHJlYWQgdmVyc2lvbiBmcm9tIHJlbW90ZSBlbmQiKTsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisrCisraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorK3sKKysJY2hhciAqY29tbWl0X2lkOworKwljaGFyICp1cmw7CisrCWludCBhcmcgPSAxOworKworKwl3aGlsZSAoYXJnIDwgYXJnYyAmJiBhcmd2W2FyZ11bMF0gPT0gJy0nKSB7CisrCQlpZiAoYXJndlthcmddWzFdID09ICd0JykgeworKwkJCWdldF90cmVlID0gMTsKKysJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdjJykgeworKwkJCWdldF9oaXN0b3J5ID0gMTsKKysJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICdkJykgeworKwkJCWdldF9kZWx0YSA9IDA7CisrCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlthcmddLCAiLS1yZWNvdmVyIikpIHsKKysJCQlnZXRfZGVsdGEgPSAyOworKwkJfSBlbHNlIGlmIChhcmd2W2FyZ11bMV0gPT0gJ2EnKSB7CisrCQkJZ2V0X2FsbCA9IDE7CisrCQkJZ2V0X3RyZWUgPSAxOworKwkJCWdldF9oaXN0b3J5ID0gMTsKKysJCX0gZWxzZSBpZiAoYXJndlthcmddWzFdID09ICd2JykgeworKwkJCWdldF92ZXJib3NlbHkgPSAxOworKwkJfQorKwkJYXJnKys7CisrCX0KKysJaWYgKGFyZ2MgPCBhcmcgKyAyKSB7CisrCQl1c2FnZSgiZ2l0LXNzaC1wdWxsIFstY10gWy10XSBbLWFdIFstdl0gWy1kXSBbLS1yZWNvdmVyXSBjb21taXQtaWQgdXJsIik7CisrCQlyZXR1cm4gMTsKKysJfQorKwljb21taXRfaWQgPSBhcmd2W2FyZ107CisrCXVybCA9IGFyZ3ZbYXJnICsgMV07CisrCisrCWlmIChzZXR1cF9jb25uZWN0aW9uKCZmZF9pbiwgJmZkX291dCwgImdpdC1zc2gtcHVzaCIsIHVybCwgYXJnLCBhcmd2ICsgMSkpCisrCQlyZXR1cm4gMTsKKysKKysJaWYgKGdldF92ZXJzaW9uKCkpCisrCQlyZXR1cm4gMTsKKysKKysJaWYgKHB1bGwoY29tbWl0X2lkKSkKKysJCXJldHVybiAxOworKworKwlyZXR1cm4gMDsKKyt9CitkaWZmIGEvc3NoLXB1c2guYyBiL3NzaC1wdXNoLmMKKy0tLSAvZGV2L251bGwKKysrKyBiL3NzaC1wdXNoLmMKK0BAIC0wLDAgKzEsMTA0IEBACisrI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgInJzaC5oIgorKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisrI2luY2x1ZGUgPGVycm5vLmg+CisrCisrdW5zaWduZWQgY2hhciBsb2NhbF92ZXJzaW9uID0gMTsKKyt1bnNpZ25lZCBjaGFyIHJlbW90ZV92ZXJzaW9uID0gMDsKKysKKytpbnQgc2VydmVfb2JqZWN0KGludCBmZF9pbiwgaW50IGZkX291dCkgeworKwlzc2l6ZV90IHNpemU7CisrCWludCBwb3NuID0gMDsKKysJY2hhciBzaGExWzIwXTsKKysJdW5zaWduZWQgbG9uZyBvYmpzaXplOworKwl2b2lkICpidWY7CisrCXNpZ25lZCBjaGFyIHJlbW90ZTsKKysJZG8geworKwkJc2l6ZSA9IHJlYWQoZmRfaW4sIHNoYTEgKyBwb3NuLCAyMCAtIHBvc24pOworKwkJaWYgKHNpemUgPCAwKSB7CisrCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisrCQkJcmV0dXJuIC0xOworKwkJfQorKwkJaWYgKCFzaXplKQorKwkJCXJldHVybiAtMTsKKysJCXBvc24gKz0gc2l6ZTsKKysJfSB3aGlsZSAocG9zbiA8IDIwKTsKKysJCisrCS8qIGZwcmludGYoc3RkZXJyLCAiU2VydmluZyAlc1xuIiwgc2hhMV90b19oZXgoc2hhMSkpOyAqLworKwlyZW1vdGUgPSAwOworKwkKKysJYnVmID0gbWFwX3NoYTFfZmlsZShzaGExLCAmb2Jqc2l6ZSk7CisrCQorKwlpZiAoIWJ1ZikgeworKwkJZnByaW50ZihzdGRlcnIsICJnaXQtc3NoLXB1c2g6IGNvdWxkIG5vdCBmaW5kICVzXG4iLCAKKysJCQlzaGExX3RvX2hleChzaGExKSk7CisrCQlyZW1vdGUgPSAtMTsKKysJfQorKwkKKysJd3JpdGUoZmRfb3V0LCAmcmVtb3RlLCAxKTsKKysJCisrCWlmIChyZW1vdGUgPCAwKQorKwkJcmV0dXJuIDA7CisrCQorKwlwb3NuID0gMDsKKysJZG8geworKwkJc2l6ZSA9IHdyaXRlKGZkX291dCwgYnVmICsgcG9zbiwgb2Jqc2l6ZSAtIHBvc24pOworKwkJaWYgKHNpemUgPD0gMCkgeworKwkJCWlmICghc2l6ZSkgeworKwkJCQlmcHJpbnRmKHN0ZGVyciwgImdpdC1zc2gtcHVzaDogd3JpdGUgY2xvc2VkIik7CisrCQkJfSBlbHNlIHsKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHdyaXRlICIpOworKwkJCX0KKysJCQlyZXR1cm4gLTE7CisrCQl9CisrCQlwb3NuICs9IHNpemU7CisrCX0gd2hpbGUgKHBvc24gPCBvYmpzaXplKTsKKysJcmV0dXJuIDA7CisrfQorKworK2ludCBzZXJ2ZV92ZXJzaW9uKGludCBmZF9pbiwgaW50IGZkX291dCkKKyt7CisrCWlmIChyZWFkKGZkX2luLCAmcmVtb3RlX3ZlcnNpb24sIDEpIDwgMSkKKysJCXJldHVybiAtMTsKKysJd3JpdGUoZmRfb3V0LCAmbG9jYWxfdmVyc2lvbiwgMSk7CisrCXJldHVybiAwOworK30KKysKKyt2b2lkIHNlcnZpY2UoaW50IGZkX2luLCBpbnQgZmRfb3V0KSB7CisrCWNoYXIgdHlwZTsKKysJaW50IHJldHZhbDsKKysJZG8geworKwkJcmV0dmFsID0gcmVhZChmZF9pbiwgJnR5cGUsIDEpOworKwkJaWYgKHJldHZhbCA8IDEpIHsKKysJCQlpZiAocmV0dmFsIDwgMCkKKysJCQkJcGVycm9yKCJnaXQtc3NoLXB1c2g6IHJlYWQgIik7CisrCQkJcmV0dXJuOworKwkJfQorKwkJaWYgKHR5cGUgPT0gJ3YnICYmIHNlcnZlX3ZlcnNpb24oZmRfaW4sIGZkX291dCkpCisrCQkJcmV0dXJuOworKwkJaWYgKHR5cGUgPT0gJ28nICYmIHNlcnZlX29iamVjdChmZF9pbiwgZmRfb3V0KSkKKysJCQlyZXR1cm47CisrCX0gd2hpbGUgKDEpOworK30KKysKKytpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisreworKwlpbnQgYXJnID0gMTsKKysgICAgICAgIGNoYXIgKmNvbW1pdF9pZDsKKysgICAgICAgIGNoYXIgKnVybDsKKysJaW50IGZkX2luLCBmZF9vdXQ7CisrCXdoaWxlIChhcmcgPCBhcmdjICYmIGFyZ3ZbYXJnXVswXSA9PSAnLScpIHsKKysgICAgICAgICAgICAgICAgYXJnKys7CisrICAgICAgICB9CisrICAgICAgICBpZiAoYXJnYyA8IGFyZyArIDIpIHsKKysJCXVzYWdlKCJnaXQtc3NoLXB1c2ggWy1jXSBbLXRdIFstYV0gY29tbWl0LWlkIHVybCIpOworKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKysgICAgICAgIH0KKysJY29tbWl0X2lkID0gYXJndlthcmddOworKwl1cmwgPSBhcmd2W2FyZyArIDFdOworKwlpZiAoc2V0dXBfY29ubmVjdGlvbigmZmRfaW4sICZmZF9vdXQsICJnaXQtc3NoLXB1bGwiLCB1cmwsIGFyZywgYXJndiArIDEpKQorKwkJcmV0dXJuIDE7CisrCisrCXNlcnZpY2UoZmRfaW4sIGZkX291dCk7CisrCXJldHVybiAwOworK30KZGlmZiAtLWdpdCBhL3QvdDQxMDAvdC1hcHBseS02LmV4cGVjdCBiL3QvdDQxMDAvdC1hcHBseS02LmV4cGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzM0M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTYuZXhwZWN0CkBAIC0wLDAgKzEsNSBAQAorIE1ha2VmaWxlICAgICAgICAgfCAgICAyICstCisgZ2l0LWZldGNoLXNjcmlwdCB8ICAgNDEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKyBnaXQtcHVsbC1zY3JpcHQgIHwgICAzNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMyBmaWxlcyBjaGFuZ2VkLCA0MyBpbnNlcnRpb25zKCspLCAzNCBkZWxldGlvbnMoLSkKKyBjcmVhdGUgZ2l0LWZldGNoLXNjcmlwdApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTYucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTc1MzYzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTYucGF0Y2gKQEAgLTAsMCArMSwxMDEgQEAKK2RpZmYgYS9NYWtlZmlsZSBiL01ha2VmaWxlCistLS0gYS9NYWtlZmlsZQorKysrIGIvTWFrZWZpbGUKK0BAIC0yMCw3ICsyMCw3IEBAIElOU1RBTEw9aW5zdGFsbAorIAorIFNDUklQVFM9Z2l0LWFwcGx5LXBhdGNoLXNjcmlwdCBnaXQtbWVyZ2Utb25lLWZpbGUtc2NyaXB0IGdpdC1wcnVuZS1zY3JpcHQgXAorIAlnaXQtcHVsbC1zY3JpcHQgZ2l0LXRhZy1zY3JpcHQgZ2l0LXJlc29sdmUtc2NyaXB0IGdpdC13aGF0Y2hhbmdlZCBcCistCWdpdC1kZWx0YWZ5LXNjcmlwdAorKwlnaXQtZGVsdGFmeS1zY3JpcHQgZ2l0LWZldGNoLXNjcmlwdAorIAorIFBST0c9ICAgZ2l0LXVwZGF0ZS1jYWNoZSBnaXQtZGlmZi1maWxlcyBnaXQtaW5pdC1kYiBnaXQtd3JpdGUtdHJlZSBcCisgCWdpdC1yZWFkLXRyZWUgZ2l0LWNvbW1pdC10cmVlIGdpdC1jYXQtZmlsZSBnaXQtZnNjay1jYWNoZSBcCitkaWZmIGEvZ2l0LWZldGNoLXNjcmlwdCBiL2dpdC1mZXRjaC1zY3JpcHQKKy0tLSAvZGV2L251bGwKKysrKyBiL2dpdC1mZXRjaC1zY3JpcHQKK0BAIC0wLDAgKzEsNDEgQEAKKysjIS9iaW4vc2gKKysjCisrbWVyZ2VfcmVwbz0kMQorK21lcmdlX25hbWU9JHsyOi1IRUFEfQorKworKzogJHtHSVRfRElSPS5naXR9CisrOiAke0dJVF9PQkpFQ1RfRElSRUNUT1JZPSIke1NIQTFfRklMRV9ESVJFQ1RPUlktIiRHSVRfRElSL29iamVjdHMifSJ9CisrCisrZG93bmxvYWRfb25lICgpIHsKKysJIyByZW1vdGVfcGF0aD0iJDEiIGxvY2FsX2ZpbGU9IiQyIgorKwljYXNlICIkMSIgaW4KKysJaHR0cDovLyopCisrCQl3Z2V0IC1xIC1PICIkMiIgIiQxIiA7OworKwkvKikKKysJCXRlc3QgLWYgIiQxIiAmJiBjYXQgPiIkMiIgIiQxIiA7OworKwkqKQorKwkJcnN5bmMgLUwgIiQxIiAiJDIiIDs7CisrCWVzYWMKKyt9CisrCisrZG93bmxvYWRfb2JqZWN0cyAoKSB7CisrCSMgcmVtb3RlX3JlcG89IiQxIiBoZWFkX3NoYTE9IiQyIgorKwljYXNlICIkMSIgaW4KKysJaHR0cDovLyopCisrCQlnaXQtaHR0cC1wdWxsIC1hICIkMiIgIiQxLyIKKysJCTs7CisrCS8qKQorKwkJZ2l0LWxvY2FsLXB1bGwgLWwgLWEgIiQyIiAiJDEvIgorKwkJOzsKKysJKikKKysJCXJzeW5jIC1hdnogLS1pZ25vcmUtZXhpc3RpbmcgXAorKwkJCSIkMS9vYmplY3RzLy4iICIkR0lUX09CSkVDVF9ESVJFQ1RPUlkiLy4KKysJCTs7CisrCWVzYWMKKyt9CisrCisrZWNobyAiR2V0dGluZyByZW1vdGUgJG1lcmdlX25hbWUiCisrZG93bmxvYWRfb25lICIkbWVyZ2VfcmVwby8kbWVyZ2VfbmFtZSIgIiRHSVRfRElSIi9NRVJHRV9IRUFECisrCisrZWNobyAiR2V0dGluZyBvYmplY3QgZGF0YWJhc2UiCisrZG93bmxvYWRfb2JqZWN0cyAiJG1lcmdlX3JlcG8iICIkKGNhdCAiJEdJVF9ESVIiL01FUkdFX0hFQUQpIgorZGlmZiBhL2dpdC1wdWxsLXNjcmlwdCBiL2dpdC1wdWxsLXNjcmlwdAorLS0tIGEvZ2l0LXB1bGwtc2NyaXB0CisrKysgYi9naXQtcHVsbC1zY3JpcHQKK0BAIC02LDM5ICs2LDcgQEAgbWVyZ2VfbmFtZT0kezI6LUhFQUR9CisgOiAke0dJVF9ESVI9LmdpdH0KKyA6ICR7R0lUX09CSkVDVF9ESVJFQ1RPUlk9IiR7U0hBMV9GSUxFX0RJUkVDVE9SWS0iJEdJVF9ESVIvb2JqZWN0cyJ9In0KKyAKKy1kb3dubG9hZF9vbmUgKCkgeworLQkjIHJlbW90ZV9wYXRoPSIkMSIgbG9jYWxfZmlsZT0iJDIiCistCWNhc2UgIiQxIiBpbgorLQlodHRwOi8vKikKKy0JCXdnZXQgLXEgLU8gIiQyIiAiJDEiIDs7CistCS8qKQorLQkJdGVzdCAtZiAiJDEiICYmIGNhdCA+IiQyIiAiJDEiIDs7CistCSopCistCQlyc3luYyAtTCAiJDEiICIkMiIgOzsKKy0JZXNhYworLX0KKy0KKy1kb3dubG9hZF9vYmplY3RzICgpIHsKKy0JIyByZW1vdGVfcmVwbz0iJDEiIGhlYWRfc2hhMT0iJDIiCistCWNhc2UgIiQxIiBpbgorLQlodHRwOi8vKikKKy0JCWdpdC1odHRwLXB1bGwgLWEgIiQyIiAiJDEvIgorLQkJOzsKKy0JLyopCistCQlnaXQtbG9jYWwtcHVsbCAtbCAtYSAiJDIiICIkMS8iCistCQk7OworLQkqKQorLQkJcnN5bmMgLWF2eiAtLWlnbm9yZS1leGlzdGluZyBcCistCQkJIiQxL29iamVjdHMvLiIgIiRHSVRfT0JKRUNUX0RJUkVDVE9SWSIvLgorLQkJOzsKKy0JZXNhYworLX0KKy0KKy1lY2hvICJHZXR0aW5nIHJlbW90ZSAkbWVyZ2VfbmFtZSIKKy1kb3dubG9hZF9vbmUgIiRtZXJnZV9yZXBvLyRtZXJnZV9uYW1lIiAiJEdJVF9ESVIiL01FUkdFX0hFQUQKKy0KKy1lY2hvICJHZXR0aW5nIG9iamVjdCBkYXRhYmFzZSIKKy1kb3dubG9hZF9vYmplY3RzICIkbWVyZ2VfcmVwbyIgIiQoY2F0ICIkR0lUX0RJUiIvTUVSR0VfSEVBRCkiCisrZ2l0LWZldGNoLXNjcmlwdCAiJG1lcmdlX3JlcG8iICIkbWVyZ2VfbmFtZSIKKyAKKyBnaXQtcmVzb2x2ZS1zY3JpcHQgXAorIAkiJChjYXQgIiRHSVRfRElSIi9IRUFEKSIgXApkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTcuZXhwZWN0IGIvdC90NDEwMC90LWFwcGx5LTcuZXhwZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODMxNjQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAwL3QtYXBwbHktNy5leHBlY3QKQEAgLTAsMCArMSw2IEBACisgRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQgfCAgIDIwICstCisgbHMtdHJlZS5jICAgICAgICAgICAgICAgICAgICAgfCAgMzMzICsrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tCisgdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoICAgfCAgICAzIAorIHRyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMiAKKyB0cmVlLmggICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgCisgNSBmaWxlcyBjaGFuZ2VkLCAxOTkgaW5zZXJ0aW9ucygrKSwgMTYwIGRlbGV0aW9ucygtKQpkaWZmIC0tZ2l0IGEvdC90NDEwMC90LWFwcGx5LTcucGF0Y2ggYi90L3Q0MTAwL3QtYXBwbHktNy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M2NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMC90LWFwcGx5LTcucGF0Y2gKQEAgLTAsMCArMSw0OTQgQEAKK2RpZmYgYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0LWxzLXRyZWUudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1scy10cmVlLnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtbHMtdHJlZS50eHQKK0BAIC00LDIzICs0LDI2IEBAIHYwLjEsIE1heSAyMDA1CisgCisgTkFNRQorIC0tLS0KKy1naXQtbHMtdHJlZSAtIERpc3BsYXlzIGEgdHJlZSBvYmplY3QgaW4gaHVtYW4gcmVhZGFibGUgZm9ybQorK2dpdC1scy10cmVlIC0gTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QuCisgCisgCisgU1lOT1BTSVMKKyAtLS0tLS0tLQorLSdnaXQtbHMtdHJlZScgWy1yXSBbLXpdIDx0cmVlLWlzaD4gW3BhdGhzLi4uXQorKydnaXQtbHMtdHJlZScgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aHMuLi5dCisgCisgREVTQ1JJUFRJT04KKyAtLS0tLS0tLS0tLQorLUNvbnZlcnRzIHRoZSB0cmVlIG9iamVjdCB0byBhIGh1bWFuIHJlYWRhYmxlIChhbmQgc2NyaXB0IHByb2Nlc3NhYmxlKQorLWZvcm0uCisrTGlzdHMgdGhlIGNvbnRlbnRzIG9mIGEgdHJlZSBvYmplY3QsIGxpa2Ugd2hhdCAiL2Jpbi9scyAtYSIgZG9lcworK2luIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIAorIE9QVElPTlMKKyAtLS0tLS0tCisgPHRyZWUtaXNoPjo6CisgCUlkIG9mIGEgdHJlZS4KKyAKKystZDo6CisrCXNob3cgb25seSB0aGUgbmFtZWQgdHJlZSBlbnRyeSBpdHNlbGYsIG5vdCBpdHMgY2hpbGRyZW4KKysKKyAtcjo6CisgCXJlY3Vyc2UgaW50byBzdWItdHJlZXMKKyAKK0BAIC0yOCwxOCArMzEsMTkgQEAgT1BUSU9OUworIAlcMCBsaW5lIHRlcm1pbmF0aW9uIG9uIG91dHB1dAorIAorIHBhdGhzOjoKKy0JT3B0aW9uYWxseSwgcmVzdHJpY3QgdGhlIG91dHB1dCBvZiBnaXQtbHMtdHJlZSB0byBzcGVjaWZpYworLQlwYXRocy4gRGlyZWN0b3JpZXMgd2lsbCBvbmx5IGxpc3QgdGhlaXIgdHJlZSBibG9iIGlkcy4KKy0JSW1wbGllcyAtci4KKysJV2hlbiBwYXRocyBhcmUgZ2l2ZW4sIHNob3dzIHRoZW0uICBPdGhlcndpc2UgaW1wbGljaXRseQorKwl1c2VzIHRoZSByb290IGxldmVsIG9mIHRoZSB0cmVlIGFzIHRoZSBzb2xlIHBhdGggYXJndW1lbnQuCisrCisgCisgT3V0cHV0IEZvcm1hdAorIC0tLS0tLS0tLS0tLS0KKy0gICAgICAgIDxtb2RlPlx0CTx0eXBlPlx0CTxvYmplY3Q+XHQJPGZpbGU+CisrICAgICAgICA8bW9kZT4gU1AgPHR5cGU+IFNQIDxvYmplY3Q+IFRBQiA8ZmlsZT4KKyAKKyAKKyBBdXRob3IKKyAtLS0tLS0KKyBXcml0dGVuIGJ5IExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0Bvc2RsLm9yZz4KKytDb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggYnkgSnVuaW8gQyBIYW1hbm8gPGp1bmtpb0Bjb3gubmV0PgorIAorIERvY3VtZW50YXRpb24KKyAtLS0tLS0tLS0tLS0tLQorZGlmZiBhL2xzLXRyZWUuYyBiL2xzLXRyZWUuYworLS0tIGEvbHMtdHJlZS5jCisrKysgYi9scy10cmVlLmMKK0BAIC00LDE4OCArNCwyMTcgQEAKKyAgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CisgICovCisgI2luY2x1ZGUgImNhY2hlLmgiCisrI2luY2x1ZGUgImJsb2IuaCIKKysjaW5jbHVkZSAidHJlZS5oIgorIAorIHN0YXRpYyBpbnQgbGluZV90ZXJtaW5hdGlvbiA9ICdcbic7Cistc3RhdGljIGludCByZWN1cnNpdmUgPSAwOworKyNkZWZpbmUgTFNfUkVDVVJTSVZFIDEKKysjZGVmaW5lIExTX1RSRUVfT05MWSAyCisrc3RhdGljIGludCBsc19vcHRpb25zID0gMDsKKyAKKy1zdHJ1Y3QgcGF0aF9wcmVmaXggeworLQlzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZXY7CistCWNvbnN0IGNoYXIgKm5hbWU7CistfTsKKy0KKy0jZGVmaW5lIERFQlVHKGZtdCwgLi4uKQkKKy0KKy1zdGF0aWMgaW50IHN0cmluZ19wYXRoX3ByZWZpeChjaGFyICpidWZmLCBzaXplX3QgYmxlbiwgc3RydWN0IHBhdGhfcHJlZml4ICpwcmVmaXgpCisteworLQlpbnQgbGVuID0gMDsKKy0JaWYgKHByZWZpeCkgeworLQkJaWYgKHByZWZpeC0+cHJldikgeworLQkJCWxlbiA9IHN0cmluZ19wYXRoX3ByZWZpeChidWZmLGJsZW4scHJlZml4LT5wcmV2KTsKKy0JCQlidWZmICs9IGxlbjsKKy0JCQlibGVuIC09IGxlbjsKKy0JCQlpZiAoYmxlbiA+IDApIHsKKy0JCQkJKmJ1ZmYgPSAnLyc7CistCQkJCWxlbisrOworLQkJCQlidWZmKys7CistCQkJCWJsZW4tLTsKKy0JCQl9CistCQl9CistCQlzdHJuY3B5KGJ1ZmYscHJlZml4LT5uYW1lLGJsZW4pOworLQkJcmV0dXJuIGxlbiArIHN0cmxlbihwcmVmaXgtPm5hbWUpOworLQl9Cisrc3RhdGljIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3Qgcm9vdF9lbnRyeTsKKyAKKy0JcmV0dXJuIDA7Cisrc3RhdGljIHZvaWQgcHJlcGFyZV9yb290KHVuc2lnbmVkIGNoYXIgKnNoYTEpCisreworKwl1bnNpZ25lZCBjaGFyIHJzaGFbMjBdOworKwl1bnNpZ25lZCBsb25nIHNpemU7CisrCXZvaWQgKmJ1ZjsKKysJc3RydWN0IHRyZWUgKnJvb3RfdHJlZTsKKysKKysJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgcnNoYSk7CisrCWZyZWUoYnVmKTsKKysJaWYgKCFidWYpCisrCQlkaWUoIkNvdWxkIG5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworKworKwlyb290X3RyZWUgPSBsb29rdXBfdHJlZShyc2hhKTsKKysJaWYgKCFyb290X3RyZWUpCisrCQlkaWUoIkNvdWxkIG5vdCByZWFkICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworKworKwkvKiBQcmVwYXJlIGEgZmFrZSBlbnRyeSAqLworKwlyb290X2VudHJ5LmRpcmVjdG9yeSA9IDE7CisrCXJvb3RfZW50cnkuZXhlY3V0YWJsZSA9IHJvb3RfZW50cnkuc3ltbGluayA9IDA7CisrCXJvb3RfZW50cnkubW9kZSA9IFNfSUZESVI7CisrCXJvb3RfZW50cnkubmFtZSA9ICIiOworKwlyb290X2VudHJ5Lml0ZW0udHJlZSA9IHJvb3RfdHJlZTsKKysJcm9vdF9lbnRyeS5wYXJlbnQgPSBOVUxMOworIH0KKyAKKy1zdGF0aWMgdm9pZCBwcmludF9wYXRoX3ByZWZpeChzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKytzdGF0aWMgaW50IHByZXBhcmVfY2hpbGRyZW4oc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZWxlbSkKKyB7CistCWlmIChwcmVmaXgpIHsKKy0JCWlmIChwcmVmaXgtPnByZXYpIHsKKy0JCQlwcmludF9wYXRoX3ByZWZpeChwcmVmaXgtPnByZXYpOworLQkJCXB1dGNoYXIoJy8nKTsKKy0JCX0KKy0JCWZwdXRzKHByZWZpeC0+bmFtZSwgc3Rkb3V0KTsKKysJaWYgKCFlbGVtLT5kaXJlY3RvcnkpCisrCQlyZXR1cm4gLTE7CisrCWlmICghZWxlbS0+aXRlbS50cmVlLT5vYmplY3QucGFyc2VkKSB7CisrCQlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplOworKwkJaWYgKHBhcnNlX3RyZWUoZWxlbS0+aXRlbS50cmVlKSkKKysJCQlyZXR1cm4gLTE7CisrCQkvKiBTZXQgdXAgdGhlIHBhcmVudCBsaW5rICovCisrCQlmb3IgKGUgPSBlbGVtLT5pdGVtLnRyZWUtPmVudHJpZXM7IGU7IGUgPSBlLT5uZXh0KQorKwkJCWUtPnBhcmVudCA9IGVsZW07CisgCX0KKysJcmV0dXJuIDA7CisgfQorIAorLS8qCistICogcmV0dXJuOgorLSAqIAktMSBpZiBwcmVmaXggaXMgKm5vdCogYSBzdWJzZXQgb2YgcGF0aAorLSAqIAkgMCBpZiBwcmVmaXggPT0gcGF0aAorLSAqIAkgMSBpZiBwcmVmaXggaXMgYSBzdWJzZXQgb2YgcGF0aAorLSAqLworLXN0YXRpYyBpbnQgcGF0aGNtcChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCkKKy17CistCWNoYXIgYnVmZltQQVRIX01BWF07CistCWludCBsZW4sc2xlbjsKKytzdGF0aWMgc3RydWN0IHRyZWVfZW50cnlfbGlzdCAqZmluZF9lbnRyeV8wKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmVsZW0sCisrCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKysJCQkJCSAgICBjb25zdCBjaGFyICpwYXRoX2VuZCkKKyt7CisrCWNvbnN0IGNoYXIgKmVwOworKwlpbnQgbGVuOworKworKwl3aGlsZSAocGF0aCA8IHBhdGhfZW5kKSB7CisrCQlpZiAocHJlcGFyZV9jaGlsZHJlbihlbGVtKSkKKysJCQlyZXR1cm4gTlVMTDsKKyAKKy0JaWYgKHByZWZpeCA9PSBOVUxMKQorLQkJcmV0dXJuIDE7CisrCQkvKiBJbiBlbGVtLT50cmVlLT5lbnRyaWVzLCBmaW5kIHRoZSBvbmUgdGhhdCBoYXMgbmFtZQorKwkJICogdGhhdCBtYXRjaGVzIHdoYXQgaXMgYmV0d2VlbiBwYXRoIGFuZCBlcC4KKysJCSAqLworKwkJZWxlbSA9IGVsZW0tPml0ZW0udHJlZS0+ZW50cmllczsKKyAKKy0JbGVuID0gc3RyaW5nX3BhdGhfcHJlZml4KGJ1ZmYsIHNpemVvZiBidWZmLCBwcmVmaXgpOworLQlzbGVuID0gc3RybGVuKHBhdGgpOworKwkJZXAgPSBzdHJjaHIocGF0aCwgJy8nKTsKKysJCWlmICghZXAgfHwgcGF0aF9lbmQgPD0gZXApCisrCQkJZXAgPSBwYXRoX2VuZDsKKysJCWxlbiA9IGVwIC0gcGF0aDsKKysKKysJCXdoaWxlIChlbGVtKSB7CisrCQkJaWYgKChzdHJsZW4oZWxlbS0+bmFtZSkgPT0gbGVuKSAmJgorKwkJCSAgICAhc3RybmNtcChlbGVtLT5uYW1lLCBwYXRoLCBsZW4pKQorKwkJCQlicmVhazsKKysJCQllbGVtID0gZWxlbS0+bmV4dDsKKysJCX0KKysJCWlmIChwYXRoX2VuZCA8PSBlcCB8fCAhZWxlbSkKKysJCQlyZXR1cm4gZWxlbTsKKysJCXdoaWxlICgqZXAgPT0gJy8nICYmIGVwIDwgcGF0aF9lbmQpCisrCQkJZXArKzsKKysJCXBhdGggPSBlcDsKKysJfQorKwlyZXR1cm4gTlVMTDsKKyt9CisgCistCWlmIChzbGVuIDwgbGVuKQorLQkJcmV0dXJuIC0xOworK3N0YXRpYyBzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpmaW5kX2VudHJ5KGNvbnN0IGNoYXIgKnBhdGgsCisrCQkJCQkgIGNvbnN0IGNoYXIgKnBhdGhfZW5kKQorK3sKKysJLyogRmluZCB0cmVlIGVsZW1lbnQsIGRlc2NlbmRpbmcgZnJvbSByb290LCB0aGF0CisrCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lZCBwYXRoLCBsYXppbHkgZXhwYW5kaW5nCisrCSAqIHRoZSB0cmVlIGlmIHBvc3NpYmxlLgorKwkgKi8KKysJaWYgKHBhdGggPT0gcGF0aF9lbmQpIHsKKysJCS8qIFNwZWNpYWwuICBUaGlzIGlzIHRoZSByb290IGxldmVsICovCisrCQlyZXR1cm4gJnJvb3RfZW50cnk7CisrCX0KKysJcmV0dXJuIGZpbmRfZW50cnlfMCgmcm9vdF9lbnRyeSwgcGF0aCwgcGF0aF9lbmQpOworK30KKyAKKy0JaWYgKHN0cm5jbXAocGF0aCxidWZmLGxlbikgPT0gMCkgeworLQkJaWYgKHNsZW4gPT0gbGVuKQorLQkJCXJldHVybiAwOworLQkJZWxzZQorLQkJCXJldHVybiAxOworK3N0YXRpYyB2b2lkIHNob3dfZW50cnlfbmFtZShzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplKQorK3sKKysJLyogVGhpcyBpcyB5dWNreS4gIFRoZSByb290IGxldmVsIGlzIHRoZXJlIGZvcgorKwkgKiBvdXIgY29udmVuaWVuY2UgYnV0IHdlIHJlYWxseSB3YW50IHRvIGRvIGEKKysJICogZm9yZXN0LgorKwkgKi8KKysJaWYgKGUtPnBhcmVudCAmJiBlLT5wYXJlbnQgIT0gJnJvb3RfZW50cnkpIHsKKysJCXNob3dfZW50cnlfbmFtZShlLT5wYXJlbnQpOworKwkJcHV0Y2hhcignLycpOworIAl9CisrCXByaW50ZigiJXMiLCBlLT5uYW1lKTsKKyt9CisgCistCXJldHVybiAtMTsKKy19CQorK3N0YXRpYyBjb25zdCBjaGFyICplbnRyeV90eXBlKHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gKGUtPmRpcmVjdG9yeSA/ICJ0cmVlIiA6ICJibG9iIik7CisrfQorIAorLS8qCistICogbWF0Y2ggbWF5IGJlIE5VTEwsIG9yIGEgKnNvcnRlZCogbGlzdCBvZiBwYXRocworLSAqLworLXN0YXRpYyB2b2lkIGxpc3RfcmVjdXJzaXZlKHZvaWQgKmJ1ZmZlciwKKy0JCQkgICBjb25zdCBjaGFyICp0eXBlLAorLQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKy0JCQkgICBzdHJ1Y3QgcGF0aF9wcmVmaXggKnByZWZpeCwKKy0JCQkgICBjaGFyICoqbWF0Y2gsIGludCBtYXRjaGVzKQorLXsKKy0Jc3RydWN0IHBhdGhfcHJlZml4IHRoaXNfcHJlZml4OworLQl0aGlzX3ByZWZpeC5wcmV2ID0gcHJlZml4OworLQorLQlpZiAoc3RyY21wKHR5cGUsICJ0cmVlIikpCistCQlkaWUoImV4cGVjdGVkIGEgJ3RyZWUnIG5vZGUiKTsKKy0KKy0JaWYgKG1hdGNoZXMpCistCQlyZWN1cnNpdmUgPSAxOworLQorLQl3aGlsZSAoc2l6ZSkgeworLQkJaW50IG5hbWVsZW4gPSBzdHJsZW4oYnVmZmVyKSsxOworLQkJdm9pZCAqZWx0YnVmID0gTlVMTDsKKy0JCWNoYXIgZWx0dHlwZVsyMF07CistCQl1bnNpZ25lZCBsb25nIGVsdHNpemU7CistCQl1bnNpZ25lZCBjaGFyICpzaGExID0gYnVmZmVyICsgbmFtZWxlbjsKKy0JCWNoYXIgKnBhdGggPSBzdHJjaHIoYnVmZmVyLCAnICcpICsgMTsKKy0JCXVuc2lnbmVkIGludCBtb2RlOworLQkJY29uc3QgY2hhciAqbWF0Y2hlZCA9IE5VTEw7CistCQlpbnQgbXR5cGUgPSAtMTsKKy0JCWludCBtaW5kZXg7CistCistCQlpZiAoc2l6ZSA8IG5hbWVsZW4gKyAyMCB8fCBzc2NhbmYoYnVmZmVyLCAiJW8iLCAmbW9kZSkgIT0gMSkKKy0JCQlkaWUoImNvcnJ1cHQgJ3RyZWUnIGZpbGUiKTsKKy0JCWJ1ZmZlciA9IHNoYTEgKyAyMDsKKy0JCXNpemUgLT0gbmFtZWxlbiArIDIwOworLQorLQkJdGhpc19wcmVmaXgubmFtZSA9IHBhdGg7CistCQlmb3IgKCBtaW5kZXggPSAwOyBtaW5kZXggPCBtYXRjaGVzOyBtaW5kZXgrKykgeworLQkJCW10eXBlID0gcGF0aGNtcChtYXRjaFttaW5kZXhdLCZ0aGlzX3ByZWZpeCk7CistCQkJaWYgKG10eXBlID49IDApIHsKKy0JCQkJbWF0Y2hlZCA9IG1hdGNoW21pbmRleF07CistCQkJCWJyZWFrOworLQkJCX0KKy0JCX0KKytzdGF0aWMgY29uc3QgY2hhciAqZW50cnlfaGV4KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUpCisreworKwlyZXR1cm4gc2hhMV90b19oZXgoZS0+ZGlyZWN0b3J5CisrCQkJICAgPyBlLT5pdGVtLnRyZWUtPm9iamVjdC5zaGExCisrCQkJICAgOiBlLT5pdGVtLmJsb2ItPm9iamVjdC5zaGExKTsKKyt9CisgCistCQkvKgorLQkJICogSWYgd2UncmUgbm90IG1hdGNoaW5nLCBvciBpZiB0aGlzIGlzIGFuIGV4YWN0IG1hdGNoLAorLQkJICogcHJpbnQgb3V0IHRoZSBpbmZvCistCQkgKi8KKy0JCWlmICghbWF0Y2hlcyB8fCAobWF0Y2hlZCAhPSBOVUxMICYmIG10eXBlID09IDApKSB7CistCQkJcHJpbnRmKCIlMDZvICVzICVzXHQiLCBtb2RlLAorLQkJCSAgICAgICBTX0lTRElSKG1vZGUpID8gInRyZWUiIDogImJsb2IiLAorLQkJCSAgICAgICBzaGExX3RvX2hleChzaGExKSk7CistCQkJcHJpbnRfcGF0aF9wcmVmaXgoJnRoaXNfcHJlZml4KTsKKy0JCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworLQkJfQorKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIG11dHVhbGx5IHJlY3Vyc2l2ZSByb3V0aW5lcyAqLworK3N0YXRpYyBpbnQgc2hvd19lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICosIGludCk7CisgCistCQlpZiAoISByZWN1cnNpdmUgfHwgISBTX0lTRElSKG1vZGUpKQorLQkJCWNvbnRpbnVlOworK3N0YXRpYyBpbnQgc2hvd19jaGlsZHJlbihzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICplLCBpbnQgbGV2ZWwpCisreworKwlpZiAocHJlcGFyZV9jaGlsZHJlbihlKSkKKysJCWRpZSgiaW50ZXJuYWwgZXJyb3I6IGxzLXRyZWUgc2hvd19jaGlsZHJlbiBjYWxsZWQgd2l0aCBub24gdHJlZSIpOworKwllID0gZS0+aXRlbS50cmVlLT5lbnRyaWVzOworKwl3aGlsZSAoZSkgeworKwkJc2hvd19lbnRyeShlLCBsZXZlbCk7CisrCQllID0gZS0+bmV4dDsKKysJfQorKwlyZXR1cm4gMDsKKyt9CisgCistCQlpZiAobWF0Y2hlcyAmJiAhIG1hdGNoZWQpCistCQkJY29udGludWU7Cisrc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUsIGludCBsZXZlbCkKKyt7CisrCWludCBlcnIgPSAwOyAKKyAKKy0JCWlmICghIChlbHRidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCBlbHR0eXBlLCAmZWx0c2l6ZSkpICkgeworLQkJCWVycm9yKCJjYW5ub3QgcmVhZCAlcyIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKy0JCQljb250aW51ZTsKKy0JCX0KKysJaWYgKGUgIT0gJnJvb3RfZW50cnkpIHsKKysJCXByaW50ZigiJTA2byAlcyAlcwkiLCBlLT5tb2RlLCBlbnRyeV90eXBlKGUpLAorKwkJICAgICAgIGVudHJ5X2hleChlKSk7CisrCQlzaG93X2VudHJ5X25hbWUoZSk7CisrCQlwdXRjaGFyKGxpbmVfdGVybWluYXRpb24pOworKwl9CisgCistCQkvKiBJZiB0aGlzIGlzIGFuIGV4YWN0IGRpcmVjdG9yeSBtYXRjaCwgd2UgbWF5IGhhdmUKKy0JCSAqIGRpcmVjdG9yeSBmaWxlcyBmb2xsb3dpbmcgdGhpcyBwYXRoLiBNYXRjaCBvbiB0aGVtLgorLQkJICogT3RoZXJ3aXNlLCB3ZSdyZSBhdCBhIHBhY2ggc3ViY29tcG9uZW50LCBhbmQgd2UgbmVlZAorLQkJICogdG8gdHJ5IHRvIG1hdGNoIGFnYWluLgorKwlpZiAoZS0+ZGlyZWN0b3J5KSB7CisrCQkvKiBJZiB0aGlzIGlzIGEgZGlyZWN0b3J5LCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisrCQkgKiAoMSkgVGhpcyBpcyB0aGUgdG9wLWxldmVsIHJlcXVlc3QgKGV4cGxpY2l0IHBhdGggZnJvbSB0aGUKKysJCSAqICAgICBjb21tYW5kIGxpbmUsIG9yICJyb290IiBpZiB0aGVyZSBpcyBubyBjb21tYW5kIGxpbmUpLgorKwkJICogIGEuIFdpdGhvdXQgYW55IGZsYWcuICBXZSBzaG93IGRpcmVjdCBjaGlsZHJlbi4gIFdlIGRvIG5vdCAKKysJCSAqICAgICByZWN1cnNlIGludG8gdGhlbS4KKysJCSAqICBiLiBXaXRoIC1yLiAgV2UgZG8gcmVjdXJzZSBpbnRvIGNoaWxkcmVuLgorKwkJICogIGMuIFdpdGggLWQuICBXZSBkbyBub3QgcmVjdXJzZSBpbnRvIGNoaWxkcmVuLgorKwkJICogKDIpIFdlIGNhbWUgaGVyZSBiZWNhdXNlIG91ciBjYWxsZXIgaXMgZWl0aGVyICgxLWEpIG9yCisrCQkgKiAgICAgKDEtYikuCisrCQkgKiAgYS4gV2l0aG91dCBhbnkgZmxhZy4gIFdlIGRvIG5vdCBzaG93IG91ciBjaGlsZHJlbiAod2hpY2gKKysJCSAqICAgICBhcmUgZ3JhbmRjaGlsZHJlbiBmb3IgdGhlIG9yaWdpbmFsIHJlcXVlc3QpLgorKwkJICogIGIuIFdpdGggLXIuICBXZSBjb250aW51ZSB0byByZWN1cnNlIGludG8gb3VyIGNoaWxkcmVuLgorKwkJICogIGMuIFdpdGggLWQuICBXZSBzaG91bGQgbm90IGhhdmUgY29tZSBoZXJlIHRvIGJlZ2luIHdpdGguCisgCQkgKi8KKy0JCWlmIChtdHlwZSA9PSAwKQorLQkJCW1pbmRleCsrOworLQorLQkJbGlzdF9yZWN1cnNpdmUoZWx0YnVmLCBlbHR0eXBlLCBlbHRzaXplLCAmdGhpc19wcmVmaXgsICZtYXRjaFttaW5kZXhdLCBtYXRjaGVzLW1pbmRleCk7CistCQlmcmVlKGVsdGJ1Zik7CisrCQlpZiAobGV2ZWwgPT0gMCAmJiAhKGxzX29wdGlvbnMgJiBMU19UUkVFX09OTFkpKQorKwkJCS8qIGNhc2UgKDEpLWEgYW5kICgxKS1iICovCisrCQkJZXJyID0gZXJyIHwgc2hvd19jaGlsZHJlbihlLCBsZXZlbCsxKTsKKysJCWVsc2UgaWYgKGxldmVsICYmIGxzX29wdGlvbnMgJiBMU19SRUNVUlNJVkUpCisrCQkJLyogY2FzZSAoMiktYiAqLworKwkJCWVyciA9IGVyciB8IHNob3dfY2hpbGRyZW4oZSwgbGV2ZWwrMSk7CisgCX0KKysJcmV0dXJuIGVycjsKKyB9CisgCistc3RhdGljIGludCBxY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCisrc3RhdGljIGludCBsaXN0X29uZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwYXRoX2VuZCkKKyB7CistCXJldHVybiBzdHJjbXAoKihjaGFyICoqKWEsICooY2hhciAqKiliKTsKKysJaW50IGVyciA9IDA7CisrCXN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgKmUgPSBmaW5kX2VudHJ5KHBhdGgsIHBhdGhfZW5kKTsKKysJaWYgKCFlKSB7CisrCQkvKiB0cmFkaXRpb25hbGx5IGxzLXRyZWUgZG9lcyBub3QgY29tcGxhaW4gYWJvdXQKKysJCSAqIG1pc3NpbmcgcGF0aC4gIFdlIG1heSBjaGFuZ2UgdGhpcyBsYXRlciB0byBtYXRjaAorKwkJICogd2hhdCAiL2Jpbi9scyAtYSIgZG9lcywgd2hpY2ggaXMgdG8gY29tcGxhaW4uCisrCQkgKi8KKysJCXJldHVybiBlcnI7CisrCX0KKysJZXJyID0gZXJyIHwgc2hvd19lbnRyeShlLCAwKTsKKysJcmV0dXJuIGVycjsKKyB9CisgCistc3RhdGljIGludCBsaXN0KHVuc2lnbmVkIGNoYXIgKnNoYTEsY2hhciAqKnBhdGgpCisrc3RhdGljIGludCBsaXN0KGNoYXIgKipwYXRoKQorIHsKKy0Jdm9pZCAqYnVmZmVyOworLQl1bnNpZ25lZCBsb25nIHNpemU7CistCWludCBucGF0aHM7CistCistCWZvciAobnBhdGhzID0gMDsgcGF0aFtucGF0aHNdICE9IE5VTEw7IG5wYXRocysrKQorLQkJOworLQorLQlxc29ydChwYXRoLG5wYXRocyxzaXplb2YoY2hhciAqKSxxY21wKTsKKy0KKy0JYnVmZmVyID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgInRyZWUiLCAmc2l6ZSwgTlVMTCk7CistCWlmICghYnVmZmVyKQorLQkJZGllKCJ1bmFibGUgdG8gcmVhZCBzaGExIGZpbGUiKTsKKy0JbGlzdF9yZWN1cnNpdmUoYnVmZmVyLCAidHJlZSIsIHNpemUsIE5VTEwsIHBhdGgsIG5wYXRocyk7CistCWZyZWUoYnVmZmVyKTsKKy0JcmV0dXJuIDA7CisrCWludCBpOworKwlpbnQgZXJyID0gMDsKKysJZm9yIChpID0gMDsgcGF0aFtpXTsgaSsrKSB7CisrCQlpbnQgbGVuID0gc3RybGVuKHBhdGhbaV0pOworKwkJd2hpbGUgKDAgPD0gbGVuICYmIHBhdGhbaV1bbGVuXSA9PSAnLycpCisrCQkJbGVuLS07CisrCQllcnIgPSBlcnIgfCBsaXN0X29uZShwYXRoW2ldLCBwYXRoW2ldICsgbGVuKTsKKysJfQorKwlyZXR1cm4gZXJyOworIH0KKyAKKy1zdGF0aWMgY29uc3QgY2hhciAqbHNfdHJlZV91c2FnZSA9ICJnaXQtbHMtdHJlZSBbLXJdIFstel0gPGtleT4gW3BhdGhzLi4uXSI7Cisrc3RhdGljIGNvbnN0IGNoYXIgKmxzX3RyZWVfdXNhZ2UgPQorKwkiZ2l0LWxzLXRyZWUgWy1kXSBbLXJdIFstel0gPHRyZWUtaXNoPiBbcGF0aC4uLl0iOworIAorIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyB7CisrCXN0YXRpYyBjaGFyICpwYXRoMFtdID0geyAiIiwgTlVMTCB9OworKwljaGFyICoqcGF0aDsKKyAJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKyAKKyAJd2hpbGUgKDEgPCBhcmdjICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CitAQCAtMTk0LDcgKzIyMywxMCBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgCQkJbGluZV90ZXJtaW5hdGlvbiA9IDA7CisgCQkJYnJlYWs7CisgCQljYXNlICdyJzoKKy0JCQlyZWN1cnNpdmUgPSAxOworKwkJCWxzX29wdGlvbnMgfD0gTFNfUkVDVVJTSVZFOworKwkJCWJyZWFrOworKwkJY2FzZSAnZCc6CisrCQkJbHNfb3B0aW9ucyB8PSBMU19UUkVFX09OTFk7CisgCQkJYnJlYWs7CisgCQlkZWZhdWx0OgorIAkJCXVzYWdlKGxzX3RyZWVfdXNhZ2UpOworQEAgLTIwNiw3ICsyMzgsMTAgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIAkJdXNhZ2UobHNfdHJlZV91c2FnZSk7CisgCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSA8IDApCisgCQl1c2FnZShsc190cmVlX3VzYWdlKTsKKy0JaWYgKGxpc3Qoc2hhMSwgJmFyZ3ZbMl0pIDwgMCkKKysKKysJcGF0aCA9IChhcmdjID09IDIpID8gcGF0aDAgOiAoYXJndiArIDIpOworKwlwcmVwYXJlX3Jvb3Qoc2hhMSk7CisrCWlmIChsaXN0KHBhdGgpIDwgMCkKKyAJCWRpZSgibGlzdCBmYWlsZWQiKTsKKyAJcmV0dXJuIDA7CisgfQorZGlmZiBhL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaCBiL3QvdDMxMDAtbHMtdHJlZS1yZXN0cmljdC5zaAorLS0tIGEvdC90MzEwMC1scy10cmVlLXJlc3RyaWN0LnNoCisrKysgYi90L3QzMTAwLWxzLXRyZWUtcmVzdHJpY3Quc2gKK0BAIC03NCw4ICs3NCw4IEBAIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAnbHMtdHJlZSBmaWx0ZXJlZCcgXAorICAgICAnZ2l0LWxzLXRyZWUgJHRyZWUgcGF0aDEgcGF0aDAgPmN1cnJlbnQgJiYKKyAgICAgIGNhdCA+ZXhwZWN0ZWQgPDxcRU9GICYmCistMTAwNjQ0IGJsb2IgWAlwYXRoMAorIDEyMDAwMCBibG9iIFgJcGF0aDEKKysxMDA2NDQgYmxvYiBYCXBhdGgwCisgRU9GCisgICAgICB0ZXN0X291dHB1dCcKKyAKK0BAIC04NSw3ICs4NSw2IEBAIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgY2F0ID5leHBlY3RlZCA8PFxFT0YgJiYKKyAwNDAwMDAgdHJlZSBYCXBhdGgyCisgMDQwMDAwIHRyZWUgWAlwYXRoMi9iYXoKKy0xMDA2NDQgYmxvYiBYCXBhdGgyL2Jhei9iCisgMTIwMDAwIGJsb2IgWAlwYXRoMi9iYXpibworIDEwMDY0NCBibG9iIFgJcGF0aDIvZm9vCisgRU9GCitkaWZmIGEvdHJlZS5jIGIvdHJlZS5jCistLS0gYS90cmVlLmMKKysrKyBiL3RyZWUuYworQEAgLTEzMyw3ICsxMzMsNyBAQCBpbnQgcGFyc2VfdHJlZV9idWZmZXIoc3RydWN0IHRyZWUgKml0ZW0sCisgCQl9CisgCQlpZiAob2JqKQorIAkJCWFkZF9yZWYoJml0ZW0tPm9iamVjdCwgb2JqKTsKKy0KKysJCWVudHJ5LT5wYXJlbnQgPSBOVUxMOyAvKiBuZWVkcyB0byBiZSBmaWxsZWQgYnkgdGhlIHVzZXIgKi8KKyAJCSpsaXN0X3AgPSBlbnRyeTsKKyAJCWxpc3RfcCA9ICZlbnRyeS0+bmV4dDsKKyAJfQorZGlmZiBhL3RyZWUuaCBiL3RyZWUuaAorLS0tIGEvdHJlZS5oCisrKysgYi90cmVlLmgKK0BAIC0xNiw2ICsxNiw3IEBAIHN0cnVjdCB0cmVlX2VudHJ5X2xpc3QgeworIAkJc3RydWN0IHRyZWUgKnRyZWU7CisgCQlzdHJ1Y3QgYmxvYiAqYmxvYjsKKyAJfSBpdGVtOworKwlzdHJ1Y3QgdHJlZV9lbnRyeV9saXN0ICpwYXJlbnQ7CisgfTsKKyAKKyBzdHJ1Y3QgdHJlZSB7CmRpZmYgLS1naXQgYS90L3Q0MTAxLWFwcGx5LW5vbmwuc2ggYi90L3Q0MTAxLWFwcGx5LW5vbmwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDI2ZmFjOAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEtYXBwbHktbm9ubC5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBzaG91bGQgaGFuZGxlIGZpbGVzIHdpdGggaW5jb21wbGV0ZSBsaW5lcy4KKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworKGVjaG8gYTsgZWNobyBiKSA+ZnJvdHouMAorKGVjaG8gYTsgZWNobyBiOyBlY2hvIGMpID5mcm90ei4xCisoZWNobyBhOyBlY2hvIGIgfCB0ciAtZCAnXDAxMicpID5mcm90ei4yCisoZWNobyBhOyBlY2hvIGM7IGVjaG8gYiB8IHRyIC1kICdcMDEyJykgPmZyb3R6LjMKKworZm9yIGkgaW4gMCAxIDIgMworZG8KKyAgZm9yIGogaW4gMCAxIDIgMworICBkbworICAgIHRlc3QgJGkgLWVxICRqICYmIGNvbnRpbnVlCisgICAgY2F0IGZyb3R6LiRpID5mcm90egorICAgIHRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICAgICAiYXBwbHkgZGlmZiBiZXR3ZWVuICRpIGFuZCAkaiIgXAorCSJnaXQtYXBwbHkgPC4uL3Q0MTAxL2RpZmYuJGktJGogJiYgZGlmZiBmcm90ei4kaiBmcm90eiIKKyAgZG9uZQorZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4wLTEgYi90L3Q0MTAxL2RpZmYuMC0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTBhODgKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMC0xCkBAIC0wLDAgKzEsNiBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwyICsxLDMgQEAKKyBhCisgYgorK2MKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4wLTIgYi90L3Q0MTAxL2RpZmYuMC0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDYwYTIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMC0yCkBAIC0wLDAgKzEsNyBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwyICsxLDIgQEAKKyBhCistYgorK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjAtMyBiL3QvdDQxMDEvZGlmZi4wLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MWM0MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4wLTMKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDIgKzEsMyBAQAorIGEKKy1iCisrYworK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjEtMCBiL3QvdDQxMDEvZGlmZi4xLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMmU5MgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4xLTAKQEAgLTAsMCArMSw2IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMiBAQAorIGEKKyBiCistYwpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjEtMiBiL3QvdDQxMDEvZGlmZi4xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0NDBhNQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4xLTIKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMiBAQAorIGEKKy1iCistYworK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjEtMyBiL3QvdDQxMDEvZGlmZi4xLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhZmY5NwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4xLTMKQEAgLTAsMCArMSw4IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDMgKzEsMyBAQAorIGEKKy1iCisgYworK2IKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMS9kaWZmLjItMCBiL3QvdDQxMDEvZGlmZi4yLTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlNzFlZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDEvZGlmZi4yLTAKQEAgLTAsMCArMSw3IEBACistLS0gYS9mcm90egorKysrIGIvZnJvdHoKK0BAIC0xLDIgKzEsMiBAQAorIGEKKy1iCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKytiCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMi0xIGIvdC90NDEwMS9kaWZmLjItMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZkOWZkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjItMQpAQCAtMCwwICsxLDggQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMiArMSwzIEBACisgYQorLWIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorK2IKKytjCmRpZmYgLS1naXQgYS90L3Q0MTAxL2RpZmYuMi0zIGIvdC90NDEwMS9kaWZmLjItMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMzYzgzCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMS9kaWZmLjItMwpAQCAtMCwwICsxLDcgQEAKKy0tLSBhL2Zyb3R6CisrKysgYi9mcm90egorQEAgLTEsMiArMSwzIEBACisgYQorK2MKKyBiCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4zLTAgYi90L3Q0MTAxL2RpZmYuMy0wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjFhNDEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMy0wCkBAIC0wLDAgKzEsOCBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwzICsxLDIgQEAKKyBhCistYworLWIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorK2IKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4zLTEgYi90L3Q0MTAxL2RpZmYuMy0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OTljNjAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMy0xCkBAIC0wLDAgKzEsOCBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwzICsxLDMgQEAKKyBhCisrYgorIGMKKy1iCitcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3QvdDQxMDEvZGlmZi4zLTIgYi90L3Q0MTAxL2RpZmYuMy0yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZDFiYTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTAxL2RpZmYuMy0yCkBAIC0wLDAgKzEsNyBAQAorLS0tIGEvZnJvdHoKKysrKyBiL2Zyb3R6CitAQCAtMSwzICsxLDIgQEAKKyBhCistYworIGIKK1wgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdC90NDEwMi1hcHBseS1yZW5hbWUuc2ggYi90L3Q0MTAyLWFwcGx5LXJlbmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMmRhNmEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NDEwMi1hcHBseS1yZW5hbWUuc2gKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgaGFuZGxpbmcgY29weS9yZW5hbWUgcGF0Y2guCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIHNldHVwCisKK2NhdCA+dGVzdC1wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9mb28gYi9iYXIKK3NpbWlsYXJpdHkgaW5kZXggNDclCityZW5hbWUgZnJvbSBmb28KK3JlbmFtZSB0byBiYXIKKy0tLSBhL2ZvbworKysrIGIvYmFyCitAQCAtMSArMSBAQAorLVRoaXMgaXMgZm9vCisrVGhpcyBpcyBiYXIKK0VPRgorCitlY2hvICdUaGlzIGlzIGZvbycgPmZvbworY2htb2QgK3ggZm9vCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgXAorICAgICdnaXQtdXBkYXRlLWluZGV4IC0tYWRkIGZvbycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBhcHBseSBcCisgICAgJ2dpdC1hcHBseSAtLWluZGV4IC0tc3RhdCAtLXN1bW1hcnkgLS1hcHBseSB0ZXN0LXBhdGNoJworCitpZiBbICIkKGdpdCByZXBvLWNvbmZpZyAtLWdldCBjb3JlLmZpbGVtb2RlKSIgPSBmYWxzZSBdCit0aGVuCisJc2F5ICdmaWxlbW9kZSBkaXNhYmxlZCBvbiB0aGUgZmlsZXN5c3RlbScKK2Vsc2UKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIHZhbGlkYXRlIFwKKwkgICAgJ3Rlc3QgLWYgYmFyICYmIGxzIC1sIGJhciB8IGdyZXAgIl4tLi54Li4uLi4uIicKK2ZpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IHJldmVyc2UnIFwKKyAgICAnZ2l0LWFwcGx5IC1SIC0taW5kZXggLS1zdGF0IC0tc3VtbWFyeSAtLWFwcGx5IHRlc3QtcGF0Y2ggJiYKKyAgICAgdGVzdCAiJChjYXQgZm9vKSIgPSAiVGhpcyBpcyBmb28iJworCitjYXQgPnRlc3QtcGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvZm9vIGIvYmFyCitzaW1pbGFyaXR5IGluZGV4IDQ3JQorY29weSBmcm9tIGZvbworY29weSB0byBiYXIKKy0tLSBhL2ZvbworKysrIGIvYmFyCitAQCAtMSArMSBAQAorLVRoaXMgaXMgZm9vCisrVGhpcyBpcyBiYXIKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBjb3B5JyBcCisgICAgJ2dpdC1hcHBseSAtLWluZGV4IC0tc3RhdCAtLXN1bW1hcnkgLS1hcHBseSB0ZXN0LXBhdGNoICYmCisgICAgIHRlc3QgIiQoY2F0IGJhcikiID0gIlRoaXMgaXMgYmFyIiAtYSAiJChjYXQgZm9vKSIgPSAiVGhpcyBpcyBmb28iJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDMtYXBwbHktYmluYXJ5LnNoIGIvdC90NDEwMy1hcHBseS1iaW5hcnkuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmYwNTI2OQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDMtYXBwbHktYmluYXJ5LnNoCkBAIC0wLDAgKzEsMTE1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBoYW5kbGluZyBiaW5hcnkgcGF0Y2hlcworCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPmZpbGUxIDw8RU9GCitBIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4KK0EgdGlueSBsaXR0bGUgcGVuZ3VpbiBydW5zIGFyb3VuZCBpbiBjaXJjbGVzLgorVGhlcmUgaXMgYSBmbGFnIHdpdGggTGludXggd3JpdHRlbiBvbiBpdC4KK0Egc2xvdyBibGFjay1hbmQtd2hpdGUgcGFuZGEganVzdCBzaXRzIHRoZXJlLAorbXVuY2hpbmcgb24gaGlzIGJhbWJvby4KK0VPRgorY2F0IGZpbGUxID5maWxlMgorY2F0IGZpbGUxID5maWxlNAorCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZpbGUxIGZpbGUyIGZpbGU0CitnaXQtY29tbWl0IC1tICdJbml0aWFsIFZlcnNpb24nIDI+L2Rldi9udWxsCisKK2dpdC1jaGVja291dCAtYiBiaW5hcnkKK3RyICd4JyAnXDAnIDxmaWxlMSA+ZmlsZTMKK2NhdCBmaWxlMyA+ZmlsZTQKK2dpdC1hZGQgZmlsZTIKK3RyICdcMCcgJ3YnIDxmaWxlMyA+ZmlsZTEKK3JtIC1mIGZpbGUyCitnaXQtdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGZpbGUxIGZpbGUyIGZpbGUzIGZpbGU0CitnaXQtY29tbWl0IC1tICdTZWNvbmQgVmVyc2lvbicKKworZ2l0LWRpZmYtdHJlZSAtcCBtYXN0ZXIgYmluYXJ5ID5CLmRpZmYKK2dpdC1kaWZmLXRyZWUgLXAgLUMgbWFzdGVyIGJpbmFyeSA+Qy5kaWZmCisKK2dpdC1kaWZmLXRyZWUgLXAgLS1iaW5hcnkgbWFzdGVyIGJpbmFyeSA+QkYuZGlmZgorZ2l0LWRpZmYtdHJlZSAtcCAtLWJpbmFyeSAtQyBtYXN0ZXIgYmluYXJ5ID5DRi5kaWZmCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXQgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIG5vdCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IEIuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhdCBiaW5hcnkgZGlmZiAoY29weSkgLS0gc2hvdWxkIG5vdCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLXN0YXQgLS1zdW1tYXJ5IEMuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY2hlY2sgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgQi5kaWZmJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdjaGVjayBiaW5hcnkgZGlmZiAoY29weSkgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgQy5kaWZmJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdjaGVjayBpbmNvbXBsZXRlIGJpbmFyeSBkaWZmIHdpdGggcmVwbGFjZW1lbnQgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2dpdC1jaGVja291dCBtYXN0ZXIKKwkgZ2l0LWFwcGx5IC0tY2hlY2sgLS1hbGxvdy1iaW5hcnktcmVwbGFjZW1lbnQgQi5kaWZmJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdjaGVjayBpbmNvbXBsZXRlIGJpbmFyeSBkaWZmIHdpdGggcmVwbGFjZW1lbnQgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdnaXQtY2hlY2tvdXQgbWFzdGVyCisJIGdpdC1hcHBseSAtLWNoZWNrIC0tYWxsb3ctYmluYXJ5LXJlcGxhY2VtZW50IEMuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgYmluYXJ5IGRpZmYgd2l0aCByZXBsYWNlbWVudC4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBCRi5kaWZmJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBiaW5hcnkgZGlmZiB3aXRoIHJlcGxhY2VtZW50IChjb3B5KS4nIFwKKwknZ2l0LWNoZWNrb3V0IG1hc3RlcgorCSBnaXQtYXBwbHkgLS1jaGVjayAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCBDRi5kaWZmJworCisjIE5vdyB3ZSBzdGFydCBhcHBseWluZyB0aGVtLgorCitkb19yZXNldCAoKSB7CisJcm0gLWYgZmlsZT8KKwlnaXQtcmVzZXQgLS1oYXJkCisJZ2l0LWNoZWNrb3V0IC1mIG1hc3RlcgorfQorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhcHBseSBiaW5hcnkgZGlmZiAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQKKwkgZ2l0LWFwcGx5IEIuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSAtLWluZGV4IEIuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgQy5kaWZmJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlICdhcHBseSBiaW5hcnkgZGlmZiAoY29weSkgLS0gc2hvdWxkIGZhaWwuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSAtLWluZGV4IEMuZGlmZicKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnYXBwbHkgYmluYXJ5IGRpZmYgd2l0aG91dCByZXBsYWNlbWVudCAtLSBzaG91bGQgZmFpbC4nIFwKKwknZG9fcmVzZXQKKwkgZ2l0LWFwcGx5IEJGLmRpZmYnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGJpbmFyeSBkaWZmIHdpdGhvdXQgcmVwbGFjZW1lbnQgKGNvcHkpIC0tIHNob3VsZCBmYWlsLicgXAorCSdkb19yZXNldAorCSBnaXQtYXBwbHkgQ0YuZGlmZicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgYmluYXJ5IGRpZmYuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCAtLWluZGV4IEJGLmRpZmYgJiYKKwkgdGVzdCAteiAiJChnaXQtZGlmZiAtLW5hbWUtc3RhdHVzIGJpbmFyeSkiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdhcHBseSBiaW5hcnkgZGlmZiAoY29weSkuJyBcCisJJ2RvX3Jlc2V0CisJIGdpdC1hcHBseSAtLWFsbG93LWJpbmFyeS1yZXBsYWNlbWVudCAtLWluZGV4IENGLmRpZmYgJiYKKwkgdGVzdCAteiAiJChnaXQtZGlmZiAtLW5hbWUtc3RhdHVzIGJpbmFyeSkiJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDQxMDktYXBwbHktbXVsdGlmcmFnLnNoIGIvdC90NDEwOS1hcHBseS1tdWx0aWZyYWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTk4OGUxYQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMDktYXBwbHktbXVsdGlmcmFnLnNoCkBAIC0wLDAgKzEsMTc2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjIENvcHlyaWdodCAoYykgMjAwNSBSb2JlcnQgRml0enNpbW9ucworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgdGVzdCBwYXRjaGVzIHdpdGggbXVsdGlwbGUgZnJhZ21lbnRzLgorCisnCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitjYXQgPiBwYXRjaDEucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbWFpbi5jIGIvbWFpbi5jCituZXcgZmlsZSBtb2RlIDEwMDY0NAorLS0tIC9kZXYvbnVsbAorKysrIGIvbWFpbi5jCitAQCAtMCwwICsxLDIzIEBACisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrCisraW50IGZ1bmMoaW50IG51bSk7Cisrdm9pZCBwcmludF9pbnQoaW50IG51bSk7CisrCisraW50IG1haW4oKSB7CisrCWludCBpOworKworKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworKwkJcHJpbnRfaW50KGZ1bmMoaSkpOworKwl9CisrCisrCXJldHVybiAwOworK30KKysKKytpbnQgZnVuYyhpbnQgbnVtKSB7CisrCXJldHVybiBudW0gKiBudW07CisrfQorKworK3ZvaWQgcHJpbnRfaW50KGludCBudW0pIHsKKysJcHJpbnRmKCIlZCIsIG51bSk7CisrfQorKworRU9GCitjYXQgPiBwYXRjaDIucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbWFpbi5jIGIvbWFpbi5jCistLS0gYS9tYWluLmMKKysrKyBiL21haW4uYworQEAgLTEsNyArMSw5IEBACisrI2luY2x1ZGUgPHN0ZGxpYi5oPgorICNpbmNsdWRlIDxzdGRpby5oPgorIAorIGludCBmdW5jKGludCBudW0pOworIHZvaWQgcHJpbnRfaW50KGludCBudW0pOworK3ZvaWQgcHJpbnRfbG4oKTsKKyAKKyBpbnQgbWFpbigpIHsKKyAJaW50IGk7CitAQCAtMTAsNiArMTIsOCBAQAorIAkJcHJpbnRfaW50KGZ1bmMoaSkpOworIAl9CisgCisrCXByaW50X2xuKCk7CisrCisgCXJldHVybiAwOworIH0KKyAKK0BAIC0yMSwzICsyNSw3IEBACisgCXByaW50ZigiJWQiLCBudW0pOworIH0KKyAKKyt2b2lkIHByaW50X2xuKCkgeworKwlwcmludGYoIlxuIik7CisrfQorKworRU9GCitjYXQgPiBwYXRjaDMucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbWFpbi5jIGIvbWFpbi5jCistLS0gYS9tYWluLmMKKysrKyBiL21haW4uYworQEAgLTEsOSArMSw3IEBACistI2luY2x1ZGUgPHN0ZGxpYi5oPgorICNpbmNsdWRlIDxzdGRpby5oPgorIAorIGludCBmdW5jKGludCBudW0pOworIHZvaWQgcHJpbnRfaW50KGludCBudW0pOworLXZvaWQgcHJpbnRfbG4oKTsKKyAKKyBpbnQgbWFpbigpIHsKKyAJaW50IGk7CitAQCAtMTIsOCArMTAsNiBAQAorIAkJcHJpbnRfaW50KGZ1bmMoaSkpOworIAl9CisgCistCXByaW50X2xuKCk7CistCisgCXJldHVybiAwOworIH0KKyAKK0BAIC0yNSw3ICsyMSwzIEBACisgCXByaW50ZigiJWQiLCBudW0pOworIH0KKyAKKy12b2lkIHByaW50X2xuKCkgeworLQlwcmludGYoIlxuIik7CistfQorLQorRU9GCitjYXQgPiBwYXRjaDQucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbWFpbi5jIGIvbWFpbi5jCistLS0gYS9tYWluLmMKKysrKyBiL21haW4uYworQEAgLTEsMTMgKzEsMTQgQEAKKyAjaW5jbHVkZSA8c3RkaW8uaD4KKyAKKyBpbnQgZnVuYyhpbnQgbnVtKTsKKy12b2lkIHByaW50X2ludChpbnQgbnVtKTsKKytpbnQgZnVuYzIoaW50IG51bSk7CisgCisgaW50IG1haW4oKSB7CisgCWludCBpOworIAorIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworLQkJcHJpbnRfaW50KGZ1bmMoaSkpOworKwkJcHJpbnRmKCIlZCIsIGZ1bmMoaSkpOworKwkJcHJpbnRmKCIlZCIsIGZ1bmMzKGkpKTsKKyAJfQorIAorIAlyZXR1cm4gMDsKK0BAIC0xNyw3ICsxOCw3IEBACisgCXJldHVybiBudW0gKiBudW07CisgfQorIAorLXZvaWQgcHJpbnRfaW50KGludCBudW0pIHsKKy0JcHJpbnRmKCIlZCIsIG51bSk7CisraW50IGZ1bmMyKGludCBudW0pIHsKKysJcmV0dXJuIG51bSAqIG51bSAqIG51bTsKKyB9CisgCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGdpdC1hcHBseSAoMSkiIFwKKyAgICAnZ2l0LWFwcGx5IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2gnCittdiBtYWluLmMgbWFpbi5jLmdpdAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gcGF0Y2ggKDEpIiBcCisgICAgJ2NhdCBwYXRjaDEucGF0Y2ggcGF0Y2gyLnBhdGNoIHwgcGF0Y2ggLXAxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gY21wICgxKSIgXAorICAgICdjbXAgbWFpbi5jLmdpdCBtYWluLmMnCisKK3JtIC1mIG1haW4uYyBtYWluLmMuZ2l0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBnaXQtYXBwbHkgKDIpIiBcCisgICAgJ2dpdC1hcHBseSBwYXRjaDEucGF0Y2ggcGF0Y2gyLnBhdGNoIHBhdGNoMy5wYXRjaCcKK212IG1haW4uYyBtYWluLmMuZ2l0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBwYXRjaCAoMikiIFwKKyAgICAnY2F0IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggcGF0Y2gzLnBhdGNoIHwgcGF0Y2ggLXAxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJTID0gY21wICgyKSIgXAorICAgICdjbXAgbWFpbi5jLmdpdCBtYWluLmMnCisKK3JtIC1mIG1haW4uYyBtYWluLmMuZ2l0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBnaXQtYXBwbHkgKDMpIiBcCisgICAgJ2dpdC1hcHBseSBwYXRjaDEucGF0Y2ggcGF0Y2g0LnBhdGNoJworbXYgbWFpbi5jIG1haW4uYy5naXQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IHBhdGNoICgzKSIgXAorICAgICdjYXQgcGF0Y2gxLnBhdGNoIHBhdGNoNC5wYXRjaCB8IHBhdGNoIC1wMScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGNtcCAoMykiIFwKKyAgICAnY21wIG1haW4uYy5naXQgbWFpbi5jJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NDExMC1hcHBseS1zY2FuLnNoIGIvdC90NDExMC1hcHBseS1zY2FuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwNWY3NDQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTEwLWFwcGx5LXNjYW4uc2gKQEAgLTAsMCArMSwxMDEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMgQ29weXJpZ2h0IChjKSAyMDA1IFJvYmVydCBGaXR6c2ltb25zCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSB0ZXN0IGZvciBwYXRjaGVzIHdoaWNoIHJlcXVpcmUgc2Nhbm5pbmcgZm9yd2FyZHMgYW5kIGJhY2t3YXJkcy4KKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworY2F0ID4gcGF0Y2gxLnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CituZXcgZmlsZSBtb2RlIDEwMDY0NAorLS0tIC9kZXYvbnVsbAorKysrIGIvbmV3LnR4dAorQEAgLTAsMCArMSwxMiBAQAorK2ExCisrYTExCisrYTExMQorK2ExMTExCisrYjEKKytiMTEKKytiMTExCisrYjExMTEKKytjMQorK2MxMQorK2MxMTEKKytjMTExMQorRU9GCitjYXQgPiBwYXRjaDIucGF0Y2ggPDxcRU9GCitkaWZmIC0tZ2l0IGEvbmV3LnR4dCBiL25ldy50eHQKKy0tLSBhL25ldy50eHQKKysrKyBiL25ldy50eHQKK0BAIC0xLDcgKzEsMyBAQAorLWExCistYTExCistYTExMQorLWExMTExCisgYjEKKyBiMTEKKyBiMTExCitFT0YKK2NhdCA+IHBhdGNoMy5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uZXcudHh0IGIvbmV3LnR4dAorLS0tIGEvbmV3LnR4dAorKysrIGIvbmV3LnR4dAorQEAgLTYsNiArNiwxMCBAQAorIGIxMQorIGIxMTEKKyBiMTExMQorK2IyCisrYjIyCisrYjIyMgorK2IyMjIyCisgYzEKKyBjMTEKKyBjMTExCitFT0YKK2NhdCA+IHBhdGNoNC5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9uZXcudHh0IGIvbmV3LnR4dAorLS0tIGEvbmV3LnR4dAorKysrIGIvbmV3LnR4dAorQEAgLTEsMyArMSw3IEBACisrYTEKKythMTEKKythMTExCisrYTExMTEKKyBiMQorIGIxMQorIGIxMTEKK0VPRgorY2F0ID4gcGF0Y2g1LnBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL25ldy50eHQgYi9uZXcudHh0CistLS0gYS9uZXcudHh0CisrKysgYi9uZXcudHh0CitAQCAtMTAsMyArMTAsNyBAQAorIGMxMQorIGMxMTEKKyBjMTExMQorK2MyCisrYzIyCisrYzIyMgorK2MyMjIyCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IGdpdC1hcHBseSBzY2FuIiBcCisgICAgJ2dpdC1hcHBseSBwYXRjaDEucGF0Y2ggcGF0Y2gyLnBhdGNoIHBhdGNoMy5wYXRjaCBwYXRjaDQucGF0Y2ggcGF0Y2g1LnBhdGNoJworbXYgbmV3LnR4dCBhcHBseS50eHQKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiUyA9IHBhdGNoIHNjYW4iIFwKKyAgICAnY2F0IHBhdGNoMS5wYXRjaCBwYXRjaDIucGF0Y2ggcGF0Y2gzLnBhdGNoIHBhdGNoNC5wYXRjaCBwYXRjaDUucGF0Y2ggfCBwYXRjaCcKK212IG5ldy50eHQgcGF0Y2gudHh0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIlMgPSBjbXAiIFwKKyAgICAnY21wIGFwcGx5LnR4dCBwYXRjaC50eHQnCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q0MTEyLWFwcGx5LXJlbmFtZXMuc2ggYi90L3Q0MTEyLWFwcGx5LXJlbmFtZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjllOTYwMwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDQxMTItYXBwbHktcmVuYW1lcy5zaApAQCAtMCwwICsxLDEyNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgc2hvdWxkIG5vdCBnZXQgY29uZnVzZWQgd2l0aCByZW5hbWUvY29weS4KKworJworCisuIC4vdGVzdC1saWIuc2gKKworIyBzZXR1cAorCitta2RpciAtcCBrbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjCisKK2NhdCA+a2xpYmMvYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmggPDxcRU9GCisvKgorICogYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKyAqLworCisjaWZuZGVmIF9LTElCQ19BUkNIU0VUSk1QX0gKKyNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorCitzdHJ1Y3QgX19qbXBfYnVmIHsKKyAgdW5zaWduZWQgbG9uZyBfX3JieDsKKyAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKyAgdW5zaWduZWQgbG9uZyBfX3JicDsKKyAgdW5zaWduZWQgbG9uZyBfX3IxMjsKKyAgdW5zaWduZWQgbG9uZyBfX3IxMzsKKyAgdW5zaWduZWQgbG9uZyBfX3IxNDsKKyAgdW5zaWduZWQgbG9uZyBfX3IxNTsKKyAgdW5zaWduZWQgbG9uZyBfX3JpcDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9fam1wX2J1ZiBqbXBfYnVmWzFdOworCisjZW5kaWYgLyogX1NFVEpNUF9IICovCitFT0YKKworY2F0ID5wYXRjaCA8PFxFT0YKK2RpZmYgLS1naXQgYS9rbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaCBiL2luY2x1ZGUvYXJjaC9jcmlzL2tsaWJjL2FyY2hzZXRqbXAuaAorc2ltaWxhcml0eSBpbmRleCA3NiUKK2NvcHkgZnJvbSBrbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorY29weSB0byBpbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2V0am1wLmgKKy0tLSBhL2tsaWJjL2FyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisrKysgYi9pbmNsdWRlL2FyY2gvY3Jpcy9rbGliYy9hcmNoc2V0am1wLmgKK0BAIC0xLDIxICsxLDI0IEBACisgLyoKKy0gKiBhcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorKyAqIGFyY2gvY3Jpcy9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorICAqLworIAorICNpZm5kZWYgX0tMSUJDX0FSQ0hTRVRKTVBfSAorICNkZWZpbmUgX0tMSUJDX0FSQ0hTRVRKTVBfSAorIAorIHN0cnVjdCBfX2ptcF9idWYgeworLSAgdW5zaWduZWQgbG9uZyBfX3JieDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yc3A7CistICB1bnNpZ25lZCBsb25nIF9fcmJwOworLSAgdW5zaWduZWQgbG9uZyBfX3IxMjsKKy0gIHVuc2lnbmVkIGxvbmcgX19yMTM7CistICB1bnNpZ25lZCBsb25nIF9fcjE0OworLSAgdW5zaWduZWQgbG9uZyBfX3IxNTsKKy0gIHVuc2lnbmVkIGxvbmcgX19yaXA7CisrICB1bnNpZ25lZCBsb25nIF9fcjA7CisrICB1bnNpZ25lZCBsb25nIF9fcjE7CisrICB1bnNpZ25lZCBsb25nIF9fcjI7CisrICB1bnNpZ25lZCBsb25nIF9fcjM7CisrICB1bnNpZ25lZCBsb25nIF9fcjQ7CisrICB1bnNpZ25lZCBsb25nIF9fcjU7CisrICB1bnNpZ25lZCBsb25nIF9fcjY7CisrICB1bnNpZ25lZCBsb25nIF9fcjc7CisrICB1bnNpZ25lZCBsb25nIF9fcjg7CisrICB1bnNpZ25lZCBsb25nIF9fc3A7CisrICB1bnNpZ25lZCBsb25nIF9fc3JwOworIH07CisgCisgdHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisgCistI2VuZGlmIC8qIF9TRVRKTVBfSCAqLworKyNlbmRpZiAvKiBfS0xJQkNfQVJDSFNFVEpNUF9IICovCitkaWZmIC0tZ2l0IGEva2xpYmMvYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmggYi9pbmNsdWRlL2FyY2gvbTMyci9rbGliYy9hcmNoc2V0am1wLmgKK3NpbWlsYXJpdHkgaW5kZXggNjYlCityZW5hbWUgZnJvbSBrbGliYy9hcmNoL3g4Nl82NC9pbmNsdWRlL2tsaWJjL2FyY2hzZXRqbXAuaAorcmVuYW1lIHRvIGluY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaAorLS0tIGEva2xpYmMvYXJjaC94ODZfNjQvaW5jbHVkZS9rbGliYy9hcmNoc2V0am1wLmgKKysrKyBiL2luY2x1ZGUvYXJjaC9tMzJyL2tsaWJjL2FyY2hzZXRqbXAuaAorQEAgLTEsMjEgKzEsMjEgQEAKKyAvKgorLSAqIGFyY2gveDg2XzY0L2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisrICogYXJjaC9tMzJyL2luY2x1ZGUva2xpYmMvYXJjaHNldGptcC5oCisgICovCisgCisgI2lmbmRlZiBfS0xJQkNfQVJDSFNFVEpNUF9ICisgI2RlZmluZSBfS0xJQkNfQVJDSFNFVEpNUF9ICisgCisgc3RydWN0IF9fam1wX2J1ZiB7CistICB1bnNpZ25lZCBsb25nIF9fcmJ4OworLSAgdW5zaWduZWQgbG9uZyBfX3JzcDsKKy0gIHVuc2lnbmVkIGxvbmcgX19yYnA7CisrICB1bnNpZ25lZCBsb25nIF9fcjg7CisrICB1bnNpZ25lZCBsb25nIF9fcjk7CisrICB1bnNpZ25lZCBsb25nIF9fcjEwOworKyAgdW5zaWduZWQgbG9uZyBfX3IxMTsKKyAgIHVuc2lnbmVkIGxvbmcgX19yMTI7CisgICB1bnNpZ25lZCBsb25nIF9fcjEzOworICAgdW5zaWduZWQgbG9uZyBfX3IxNDsKKyAgIHVuc2lnbmVkIGxvbmcgX19yMTU7CistICB1bnNpZ25lZCBsb25nIF9fcmlwOworIH07CisgCisgdHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmIGptcF9idWZbMV07CisgCistI2VuZGlmIC8qIF9TRVRKTVBfSCAqLworKyNlbmRpZiAvKiBfS0xJQkNfQVJDSFNFVEpNUF9IICovCitFT0YKKworZmluZCBrbGliYyAtdHlwZSBmIC1wcmludCB8IHhhcmdzIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgLS0KKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY2hlY2sgcmVuYW1lL2NvcHkgcGF0Y2gnICdnaXQtYXBwbHkgLS1jaGVjayBwYXRjaCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgcmVuYW1lL2NvcHkgcGF0Y2gnICdnaXQtYXBwbHkgLS1pbmRleCBwYXRjaCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTEzLWFwcGx5LWVuZGluZy5zaCBiL3QvdDQxMTMtYXBwbHktZW5kaW5nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmZDBjZjYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTEzLWFwcGx5LWVuZGluZy5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IENhdGFsaW4gTWFyaW5hcworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgdHJ5aW5nIHRvIGFkZCBhbiBlbmRpbmcgbGluZS4KKworJworLiAuL3Rlc3QtbGliLnNoCisKKyMgc2V0dXAKKworY2F0ID50ZXN0LXBhdGNoIDw8XEVPRgorZGlmZiAtLWdpdCBhL2ZpbGUgYi9maWxlCistLS0gYS9maWxlCisrKysgYi9maWxlCitAQCAtMSwyICsxLDMgQEAKKyBhCisgYgorK2MKK0VPRgorCitlY2hvICdhJyA+ZmlsZQorZWNobyAnYicgPj5maWxlCitlY2hvICdjJyA+PmZpbGUKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCBcCisgICAgJ2dpdC11cGRhdGUtaW5kZXggLS1hZGQgZmlsZScKKworIyB0ZXN0CisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGF0IHRoZSBlbmQnIFwKKyAgICAnZ2l0LWFwcGx5IC0taW5kZXggdGVzdC1wYXRjaCcKKworY2F0ID50ZXN0LXBhdGNoIDw8XEVPRgorZGlmZiBhL2ZpbGUgYi9maWxlCistLS0gYS9maWxlCisrKysgYi9maWxlCitAQCAtMSwyICsxLDMgQEAKKythCisgYgorIGMKK0VPRgorCitlY2hvID5maWxlICdhCitiCitjJworZ2l0LXVwZGF0ZS1pbmRleCBmaWxlCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgJ2FwcGx5IGF0IHRoZSBiZWdpbm5pbmcnIFwKKwknZ2l0LWFwcGx5IC0taW5kZXggdGVzdC1wYXRjaCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q0MTE0LWFwcGx5LXR5cGVjaGFuZ2Uuc2ggYi90L3Q0MTE0LWFwcGx5LXR5cGVjaGFuZ2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2E4MWQ3MjEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTE0LWFwcGx5LXR5cGVjaGFuZ2Uuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hcHBseSBzaG91bGQgbm90IGdldCBjb25mdXNlZCB3aXRoIHR5cGUgY2hhbmdlcy4KKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc2V0dXAgcmVwb3NpdG9yeSBhbmQgY29tbWl0cycgJworCWVjaG8gImhlbGxvIHdvcmxkIiA+IGZvbyAmJgorCWVjaG8gImhpIHBsYW5ldCIgPiBiYXIgJiYKKwlnaXQgdXBkYXRlLWluZGV4IC0tYWRkIGZvbyBiYXIgJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKwlnaXQgYnJhbmNoIGluaXRpYWwgJiYKKwlybSAtZiBmb28gJiYKKwlsbiAtcyBiYXIgZm9vICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBmb28gJiYKKwlnaXQgY29tbWl0IC1tICJmb28gc3ltbGlua2VkIHRvIGJhciIgJiYKKwlnaXQgYnJhbmNoIGZvby1zeW1saW5rZWQtdG8tYmFyICYmCisJcm0gLWYgZm9vICYmCisJZWNobyAiaG93IGZhciBpcyB0aGUgc3VuPyIgPiBmb28gJiYKKwlnaXQgdXBkYXRlLWluZGV4IGZvbyAmJgorCWdpdCBjb21taXQgLW0gImZvbyBiYWNrIHRvIGZpbGUiICYmCisJZ2l0IGJyYW5jaCBmb28tYmFjay10by1maWxlICYmCisJcm0gLWYgZm9vICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSBmb28gJiYKKwlta2RpciBmb28gJiYKKwllY2hvICJpZiBvbmx5IEkga25ldyIgPiBmb28vYmF6ICYmCisJZ2l0IHVwZGF0ZS1pbmRleCAtLWFkZCBmb28vYmF6ICYmCisJZ2l0IGNvbW1pdCAtbSAiZm9vIGJlY29tZXMgYSBkaXJlY3RvcnkiICYmCisJZ2l0IGJyYW5jaCAiZm9vLWJlY29tZXMtYS1kaXJlY3RvcnkiICYmCisJZWNobyAiaGVsbG8gd29ybGQiID4gZm9vL2JheiAmJgorCWdpdCB1cGRhdGUtaW5kZXggZm9vL2JheiAmJgorCWdpdCBjb21taXQgLW0gImZvby9iYXogaXMgdGhlIG9yaWdpbmFsIGZvbyIgJiYKKwlnaXQgYnJhbmNoIGZvby1iYXotcmVuYW1lZC1mcm9tLWZvbworCScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlsZSByZW5hbWVkIGZyb20gZm9vIHRvIGZvby9iYXonICcKKwlnaXQgY2hlY2tvdXQgLWYgaW5pdGlhbCAmJgorCWdpdCBkaWZmLXRyZWUgLU0gLXAgSEVBRCBmb28tYmF6LXJlbmFtZWQtZnJvbS1mb28gPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmlsZSByZW5hbWVkIGZyb20gZm9vL2JheiB0byBmb28nICcKKwlnaXQgY2hlY2tvdXQgLWYgZm9vLWJhei1yZW5hbWVkLWZyb20tZm9vICYmCisJZ2l0IGRpZmYtdHJlZSAtTSAtcCBIRUFEIGluaXRpYWwgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnZGlyZWN0b3J5IGJlY29tZXMgZmlsZScgJworCWdpdCBjaGVja291dCAtZiBmb28tYmVjb21lcy1hLWRpcmVjdG9yeSAmJgorCWdpdCBkaWZmLXRyZWUgLXAgSEVBRCBpbml0aWFsID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbGUgYmVjb21lcyBkaXJlY3RvcnknICcKKwlnaXQgY2hlY2tvdXQgLWYgaW5pdGlhbCAmJgorCWdpdCBkaWZmLXRyZWUgLXAgSEVBRCBmb28tYmVjb21lcy1hLWRpcmVjdG9yeSA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaWxlIGJlY29tZXMgc3ltbGluaycgJworCWdpdCBjaGVja291dCAtZiBpbml0aWFsICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEIGZvby1zeW1saW5rZWQtdG8tYmFyID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N5bWxpbmsgYmVjb21lcyBmaWxlJyAnCisJZ2l0IGNoZWNrb3V0IC1mIGZvby1zeW1saW5rZWQtdG8tYmFyICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEIGZvby1iYWNrLXRvLWZpbGUgPiBwYXRjaCAmJgorCWdpdCBhcHBseSAtLWluZGV4IDwgcGF0Y2gKKwknCit0ZXN0X2RlYnVnICdjYXQgcGF0Y2gnCisKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3ltbGluayBiZWNvbWVzIGRpcmVjdG9yeScgJworCWdpdCBjaGVja291dCAtZiBmb28tc3ltbGlua2VkLXRvLWJhciAmJgorCWdpdCBkaWZmLXRyZWUgLXAgSEVBRCBmb28tYmVjb21lcy1hLWRpcmVjdG9yeSA+IHBhdGNoICYmCisJZ2l0IGFwcGx5IC0taW5kZXggPCBwYXRjaAorCScKK3Rlc3RfZGVidWcgJ2NhdCBwYXRjaCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdkaXJlY3RvcnkgYmVjb21lcyBzeW1saW5rJyAnCisJZ2l0IGNoZWNrb3V0IC1mIGZvby1iZWNvbWVzLWEtZGlyZWN0b3J5ICYmCisJZ2l0IGRpZmYtdHJlZSAtcCBIRUFEIGZvby1zeW1saW5rZWQtdG8tYmFyID4gcGF0Y2ggJiYKKwlnaXQgYXBwbHkgLS1pbmRleCA8IHBhdGNoCisJJwordGVzdF9kZWJ1ZyAnY2F0IHBhdGNoJworCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NDExNS1hcHBseS1zeW1saW5rLnNoIGIvdC90NDExNS1hcHBseS1zeW1saW5rLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1ZjJjZmIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q0MTE1LWFwcGx5LXN5bWxpbmsuc2gKQEAgLTAsMCArMSw0OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtYXBwbHkgc3ltbGlua3MgYW5kIHBhcnRpYWwgZmlsZXMKKworJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisKKwlsbiAtcyBwYXRoMS9wYXRoMi9wYXRoMy9wYXRoNC9wYXRoNSBsaW5rMSAmJgorCWdpdCBhZGQgbGluaz8gJiYKKwlnaXQgY29tbWl0IC1tIGluaXRpYWwgJiYKKworCWdpdCBicmFuY2ggc2lkZSAmJgorCisJcm0gLWYgbGluaz8gJiYKKworCWxuIC1zIGh0YXA2IGxpbmsxICYmCisJZ2l0IHVwZGF0ZS1pbmRleCBsaW5rPyAmJgorCWdpdCBjb21taXQgLW0gc2Vjb25kICYmCisKKwlnaXQgZGlmZi10cmVlIC1wIEhFQUReIEhFQUQgPnBhdGNoICAmJgorCWdpdCBhcHBseSAtLXN0YXQgLS1zdW1tYXJ5IHBhdGNoCisKKycKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnYXBwbHkgc3ltbGluayBwYXRjaCcgJworCisJZ2l0IGNoZWNrb3V0IHNpZGUgJiYKKwlnaXQgYXBwbHkgcGF0Y2ggJiYKKwlnaXQgZGlmZi1maWxlcyAtcCA+cGF0Y2hlZCAmJgorCWRpZmYgLXUgcGF0Y2ggcGF0Y2hlZAorCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2FwcGx5IC0taW5kZXggc3ltbGluayBwYXRjaCcgJworCisJZ2l0IGNoZWNrb3V0IC1mIHNpZGUgJiYKKwlnaXQgYXBwbHkgLS1pbmRleCBwYXRjaCAmJgorCWdpdCBkaWZmLWluZGV4IC0tY2FjaGVkIC1wIEhFQUQgPnBhdGNoZWQgJiYKKwlkaWZmIC11IHBhdGNoIHBhdGNoZWQKKworJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDUwMDAtdGFyLXRyZWUuc2ggYi90L3Q1MDAwLXRhci10cmVlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3OGViNjYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MDAwLXRhci10cmVlLnNoCkBAIC0wLDAgKzEsOTggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgUmVuZSBTY2hhcmZlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC10YXItdHJlZSBhbmQgZ2l0LWdldC10YXItY29tbWl0LWlkIHRlc3QKKworVGhpcyB0ZXN0IGNvdmVycyB0aGUgdG9waWNzIG9mIGZpbGUgY29udGVudHMsIGNvbW1pdCBkYXRlIGhhbmRsaW5nIGFuZAorY29tbWl0IGlkIGVtYmVkZGluZzoKKworICBUaGUgY29udGVudHMgb2YgdGhlIHJlcG9zaXRvcnkgaXMgY29tcGFyZWQgdG8gdGhlIGV4dHJhY3RlZCB0YXIKKyAgYXJjaGl2ZS4gIFRoZSByZXBvc2l0b3J5IGNvbnRhaW5zIHNpbXBsZSB0ZXh0IGZpbGVzLCBzeW1saW5rcyBhbmQgYQorICBiaW5hcnkgZmlsZSAoL2Jpbi9zaCkuICBPbmx5IHBhdGhlcyBzaG9ydGVyIHRoYW4gOTkgY2hhcmFjdGVycyBhcmUKKyAgdXNlZC4KKworICBnaXQtdGFyLXRyZWUgYXBwbGllcyB0aGUgY29tbWl0IGRhdGUgdG8gZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpdAorICBjcmVhdGVzLiAgVGhlIHRlc3Qgc2V0cyB0aGUgY29tbWl0IGRhdGUgdG8gYSBzcGVjaWZpYyB2YWx1ZSBhbmQgY2hlY2tzCisgIGlmIHRoZSB0YXIgYXJjaGl2ZSBjb250YWlucyB0aGF0IHZhbHVlLgorCisgIFdoZW4gZ2l2aW5nIGdpdC10YXItdHJlZSBhIGNvbW1pdCBpZCAoaW4gY29udHJhc3QgdG8gYSB0cmVlIGlkKSBpdAorICBlbWJlZHMgdGhpcyBjb21taXQgaWQgaW50byB0aGUgdGFyIGFyY2hpdmUgYXMgYSBjb21tZW50LiAgVGhlIHRlc3QKKyAgY2hlY2tzIHRoZSBhYmlsaXR5IG9mIGdpdC1nZXQtdGFyLWNvbW1pdC1pZCB0byBmaWd1cmUgaXQgb3V0IGZyb20gdGhlCisgIHRhciBmaWxlLgorCisnCisKKy4gLi90ZXN0LWxpYi5zaAorVEFSPSR7VEFSOi10YXJ9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwb3B1bGF0ZSB3b3JrZGlyJyBcCisgICAgJ21rZGlyIGEgYiBjICYmCisgICAgIGVjaG8gc2ltcGxlIHRleHRmaWxlID5hL2EgJiYKKyAgICAgbWtkaXIgYS9iaW4gJiYKKyAgICAgY3AgL2Jpbi9zaCBhL2JpbiAmJgorICAgICBsbiAtcyBhIGEvbDEgJiYKKyAgICAgKHA9bG9uZ19wYXRoX3RvX2FfZmlsZSAmJiBjZCBhICYmCisgICAgICBmb3IgZGVwdGggaW4gMSAyIDMgNCA1OyBkbyBta2RpciAkcCAmJiBjZCAkcDsgZG9uZSAmJgorICAgICAgZWNobyB0ZXh0ID5maWxlX3dpdGhfbG9uZ19wYXRoKSAmJgorICAgICAoY2QgYSAmJiBmaW5kIC4pIHwgc29ydCA+YS5sc3QnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdhZGQgZmlsZXMgdG8gcmVwb3NpdG9yeScgXAorICAgICdmaW5kIGEgLXR5cGUgZiB8IHhhcmdzIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgJiYKKyAgICAgZmluZCBhIC10eXBlIGwgfCB4YXJncyBnaXQtdXBkYXRlLWluZGV4IC0tYWRkICYmCisgICAgIHRyZWVpZD1gZ2l0LXdyaXRlLXRyZWVgICYmCisgICAgIGVjaG8gJHRyZWVpZCA+dHJlZWlkICYmCisgICAgIGdpdC11cGRhdGUtcmVmIEhFQUQgJChUWj1HTVQgR0lUX0NPTU1JVFRFUl9EQVRFPSIyMDA1LTA1LTI3IDIyOjAwOjAwIiBcCisgICAgIGdpdC1jb21taXQtdHJlZSAkdHJlZWlkIDwvZGV2L251bGwpJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXRhci10cmVlJyBcCisgICAgJ2dpdC10YXItdHJlZSBIRUFEID5iLnRhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUnIFwKKyAgICAnVFo9R01UICRUQVIgdHZmIGIudGFyIGEvYSB8CisgICAgIGF3ayBce3ByaW50XCBcJDQsXCBcKGxlbmd0aFwoXCQ1XClcPDdcKVwgP1wgXCQ1XCI6MDBcIlwgOlwgXCQ1XH0gXAorICAgICA+Yi5tdGltZSAmJgorICAgICBlY2hvICIyMDA1LTA1LTI3IDIyOjAwOjAwIiA+ZXhwZWN0ZWQubXRpbWUgJiYKKyAgICAgZGlmZiBleHBlY3RlZC5tdGltZSBiLm10aW1lJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LWdldC10YXItY29tbWl0LWlkJyBcCisgICAgJ2dpdC1nZXQtdGFyLWNvbW1pdC1pZCA8Yi50YXIgPmIuY29tbWl0aWQgJiYKKyAgICAgZGlmZiAuZ2l0LyQoZ2l0LXN5bWJvbGljLXJlZiBIRUFEKSBiLmNvbW1pdGlkJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZXh0cmFjdCB0YXIgYXJjaGl2ZScgXAorICAgICcoY2QgYiAmJiAkVEFSIHhmIC0pIDxiLnRhcicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ZhbGlkYXRlIGZpbGVuYW1lcycgXAorICAgICcoY2QgYi9hICYmIGZpbmQgLikgfCBzb3J0ID5iLmxzdCAmJgorICAgICBkaWZmIGEubHN0IGIubHN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZSBjb250ZW50cycgXAorICAgICdkaWZmIC1yIGEgYi9hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnZ2l0LXRhci10cmVlIHdpdGggcHJlZml4JyBcCisgICAgJ2dpdC10YXItdHJlZSBIRUFEIHByZWZpeCA+Yy50YXInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdleHRyYWN0IHRhciBhcmNoaXZlIHdpdGggcHJlZml4JyBcCisgICAgJyhjZCBjICYmICRUQVIgeGYgLSkgPGMudGFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZW5hbWVzIHdpdGggcHJlZml4JyBcCisgICAgJyhjZCBjL3ByZWZpeC9hICYmIGZpbmQgLikgfCBzb3J0ID5jLmxzdCAmJgorICAgICBkaWZmIGEubHN0IGMubHN0JworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmFsaWRhdGUgZmlsZSBjb250ZW50cyB3aXRoIHByZWZpeCcgXAorICAgICdkaWZmIC1yIGEgYy9wcmVmaXgvYScKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MTAwLW1haWxpbmZvLnNoIGIvdC90NTEwMC1tYWlsaW5mby5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xN2MxYjgwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC1tYWlsaW5mby5zaApAQCAtMCwwICsxLDI4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1tYWlsaW5mbyBhbmQgZ2l0LW1haWxzcGxpdCB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3BsaXQgc2FtcGxlIGJveCcgXAorCSdnaXQtbWFpbHNwbGl0IC1vLiAuLi90NTEwMC9zYW1wbGUubWJveCA+bGFzdCAmJgorCWxhc3Q9YGNhdCBsYXN0YCAmJgorCWVjaG8gdG90YWwgaXMgJGxhc3QgJiYKKwl0ZXN0IGBjYXQgbGFzdGAgPSA1JworCitmb3IgbWFpbCBpbiBgZWNobyAwMCpgCitkbworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIm1haWxpbmZvICRtYWlsIiBcCisJCSJnaXQtbWFpbGluZm8gLXUgbXNnJG1haWwgcGF0Y2gkbWFpbCA8JG1haWwgPmluZm8kbWFpbCAmJgorCQllY2hvIG1zZyAmJgorCQlkaWZmIC4uL3Q1MTAwL21zZyRtYWlsIG1zZyRtYWlsICYmCisJCWVjaG8gcGF0Y2ggJiYKKwkJZGlmZiAuLi90NTEwMC9wYXRjaCRtYWlsIHBhdGNoJG1haWwgJiYKKwkJZWNobyBpbmZvICYmCisJCWRpZmYgLi4vdDUxMDAvaW5mbyRtYWlsIGluZm8kbWFpbCIKK2RvbmUKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDAxIGIvdC90NTEwMC9pbmZvMDAwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA1Mjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwMQpAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogQSBVIFRob3IKK0VtYWlsOiBhLnUudGhvckBleGFtcGxlLmNvbQorU3ViamVjdDogYSBjb21taXQuCitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwMiBiL3QvdDUxMDAvaW5mbzAwMDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliYjBmZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDIKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IEEgVSBUaG9yCitFbWFpbDogYS51LnRob3JAZXhhbXBsZS5jb20KK1N1YmplY3Q6IGFub3RoZXIgcGF0Y2gKK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDAzIGIvdC90NTEwMC9pbmZvMDAwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDBkMTIyCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwMwpAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogQSBVIFRob3IKK0VtYWlsOiBhLnUudGhvckBleGFtcGxlLmNvbQorU3ViamVjdDogdGhpcmQgcGF0Y2gKK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL2luZm8wMDA0IGIvdC90NTEwMC9pbmZvMDAwNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZjMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9pbmZvMDAwNApAQCAtMCwwICsxLDUgQEAKK0F1dGhvcjogWU9TSElGVUpJIEhpZGVha2kgLyDlkInol6Toi7HmmI4KK0VtYWlsOiB5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZworU3ViamVjdDogR0lUOiBUcnkgYWxsIGFkZHJlc3NlcyBmb3IgZ2l2ZW4gcmVtb3RlIG5hbWUKK0RhdGU6IFRodSwgMjEgSnVsIDIwMDUgMDk6MTA6MzYgLTA0MDAgKEVEVCkKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9pbmZvMDAwNSBiL3QvdDUxMDAvaW5mbzAwMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNDZmYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvaW5mbzAwMDUKQEAgLTAsMCArMSw1IEBACitBdXRob3I6IERhdmlkIEvDpWdlZGFsCitFbWFpbDogZGF2aWRrQGx5c2F0b3IubGl1LnNlCitTdWJqZWN0OiBGaXhlZCB0d28gYnVncyBpbiBnaXQtY3ZzaW1wb3J0LXNjcmlwdC4KK0RhdGU6IE1vbiwgMTUgQXVnIDIwMDUgMjA6MTg6MjUgKzAyMDAKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDAxIGIvdC90NTEwMC9tc2cwMDAxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNzVhOWEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDEKQEAgLTAsMCArMSwyIEBACitIZXJlIGlzIGEgcGF0Y2ggZnJvbSBBIFUgVGhvci4KKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9tc2cwMDAyIGIvdC90NTEwMC9tc2cwMDAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTQ2ZWMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1MTAwL21zZzAwMDIKQEAgLTAsMCArMSwyMSBAQAorSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCisKK0kgaGF2ZSBpbmNsdWRlZCBhbiBleHRyYSBibGFuayBsaW5lIGFib3ZlLCBidXQgaXQgZG9lcyBub3QgaGF2ZSB0byBiZQorc3RyaXBwZWQgYXdheSBoZXJlLCBhbG9uZyB3aXRoIHRoZSAgICAgICAgICAgICAgIAkJICAgCit3aGl0ZXNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBhYm92ZSBsaW5lLiAgVGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgc3F1YXNoZWQKK3doZW4gdGhlIG1lc3NhZ2UgaXMgbWFkZSBpbnRvIGEgY29tbWl0IGxvZyBieSBzdHJpcHNwYWNlLAorQWxzbywgdGhlcmUgYXJlIHRocmVlIGJsYW5rIGxpbmVzIGFmdGVyIHRoaXMgcGFyYWdyYXBoLAordHdvIHRydWx5IGJsYW5rIGFuZCBhbm90aGVyIGZ1bGwgb2Ygc3BhY2VzIGluIGJldHdlZW4uCisKKyAgICAgICAgICAgIAorCitIb3BlIHRoaXMgaGVscHMuCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvbXNnMDAwMyBiL3QvdDUxMDAvbXNnMDAwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM2ODEwCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9tc2cwMDAzCkBAIC0wLDAgKzEsOSBAQAorSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDQgYi90L3Q1MTAwL21zZzAwMDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4YmEzYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwNApAQCAtMCwwICsxLDcgQEAKK0hlbGxvLgorCitUcnkgYWxsIGFkZHJlc3NlcyBmb3IgZ2l2ZW4gcmVtb3RlIG5hbWUgdW50aWwgaXQgc3VjY2VlZHMuCitBbHNvIHN1cHBvcnRzIElQdjYuCisKK1NpZ25lZC1vZi1ieTogSGlkZWFraSBZT1NISUZVSkkgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorCmRpZmYgLS1naXQgYS90L3Q1MTAwL21zZzAwMDUgYi90L3Q1MTAwL21zZzAwMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5NGNkNwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvbXNnMDAwNQpAQCAtMCwwICsxLDEzIEBACitUaGUgZ2l0LWN2c2ltcG9ydC1zY3JpcHQgaGFkIGEgY29wdWxlIG9mIHNtYWxsIGJ1Z3MgdGhhdCBwcmV2ZW50ZWQgbWUKK2Zyb20gaW1wb3J0aW5nIGEgYmlnIENWUyByZXBvc2l0b3J5LgorCitUaGUgZmlyc3Qgd2FzIHRoYXQgaXQgZGlkbid0IGhhbmRsZSByZW1vdmVkIGZpbGVzIHdpdGggYSBtdWx0aS1kaWdpdAorcHJpbWFyeSByZXZpc2lvbiBudW1iZXIuCisKK1RoZSBzZWNvbmQgd2FzIHRoYXQgaXQgd2FzIGFza2luZyB0aGUgQ1ZTIHNlcnZlciBmb3IgIkYiIG1lc3NhZ2VzLAorYWx0aG91Z2ggdGhleSB3ZXJlIG5vdCBoYW5kbGVkLgorCitJIGFsc28gdXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdCBzY3JpcHQgdG8gY29ycmVzcG9uZCB0bworYWN0dWFsIGZsYWdzLgorCitTaWduZWQtb2ZmLWJ5OiBEYXZpZCBLw6VnZWRhbCA8ZGF2aWRrQGx5c2F0b3IubGl1LnNlPgpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDEgYi90L3Q1MTAwL3BhdGNoMDAwMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDEKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDIgYi90L3Q1MTAwL3BhdGNoMDAwMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDIKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDMgYi90L3Q1MTAwL3BhdGNoMDAwMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2UxNTUxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDMKQEAgLTAsMCArMSwxNCBAQAorLS0tCisgZm9vIHwgICAgMiArLQorIDEgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9ucygtKQorCitkaWZmIC0tZ2l0IGEvZm9vIGIvZm9vCitpbmRleCA5MTIzY2RjLi45MThkY2Y4IDEwMDY0NAorLS0tIGEvZm9vCisrKysgYi9mb28KK0BAIC0xICsxIEBACistRnJpIEp1biAgOSAwMDo0NDowNCBQRFQgMjAwNgorK0ZyaSBKdW4gIDkgMDA6NDQ6MTMgUERUIDIwMDYKKy0tIAorMS40LjAuZzZmMmIKKwpkaWZmIC0tZ2l0IGEvdC90NTEwMC9wYXRjaDAwMDQgYi90L3Q1MTAwL3BhdGNoMDAwNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTY0NThlCi0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9wYXRjaDAwMDQKQEAgLTAsMCArMSw5MyBAQAorZGlmZiAtLWdpdCBhL2Nvbm5lY3QuYyBiL2Nvbm5lY3QuYworLS0tIGEvY29ubmVjdC5jCisrKysgYi9jb25uZWN0LmMKK0BAIC05Niw0MiArOTYsNTcgQEAgc3RhdGljIGVudW0gcHJvdG9jb2wgZ2V0X3Byb3RvY29sKGNvbnN0IAorIAlkaWUoIkkgZG9uJ3QgaGFuZGxlIHByb3RvY29sICclcyciLCBuYW1lKTsKKyB9CisgCistc3RhdGljIHZvaWQgbG9va3VwX2hvc3QoY29uc3QgY2hhciAqaG9zdCwgc3RydWN0IHNvY2thZGRyICppbikKKy17CistCXN0cnVjdCBhZGRyaW5mbyAqcmVzOworLQlpbnQgcmV0OworLQorLQlyZXQgPSBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCBOVUxMLCAmcmVzKTsKKy0JaWYgKHJldCkKKy0JCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihyZXQpKTsKKy0JKmluID0gKnJlcy0+YWlfYWRkcjsKKy0JZnJlZWFkZHJpbmZvKHJlcyk7CistfQorKyNkZWZpbmUgU1RSXyhzKQkjIHMKKysjZGVmaW5lIFNUUihzKQlTVFJfKHMpCisgCisgc3RhdGljIGludCBnaXRfdGNwX2Nvbm5lY3QoaW50IGZkWzJdLCBjb25zdCBjaGFyICpwcm9nLCBjaGFyICpob3N0LCBjaGFyICpwYXRoKQorIHsKKy0Jc3RydWN0IHNvY2thZGRyIGFkZHI7CistCWludCBwb3J0ID0gREVGQVVMVF9HSVRfUE9SVCwgc29ja2ZkOworLQljaGFyICpjb2xvbjsKKy0KKy0JY29sb24gPSBzdHJjaHIoaG9zdCwgJzonKTsKKy0JaWYgKGNvbG9uKSB7CistCQljaGFyICplbmQ7CistCQl1bnNpZ25lZCBsb25nIG4gPSBzdHJ0b3VsKGNvbG9uKzEsICZlbmQsIDApOworLQkJaWYgKGNvbG9uWzFdICYmICEqZW5kKSB7CistCQkJKmNvbG9uID0gMDsKKy0JCQlwb3J0ID0gbjsKKysJaW50IHNvY2tmZCA9IC0xOworKwljaGFyICpjb2xvbiwgKmVuZDsKKysJY2hhciAqcG9ydCA9IFNUUihERUZBVUxUX0dJVF9QT1JUKTsKKysJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWkwLCAqYWk7CisrCWludCBnYWk7CisrCisrCWlmIChob3N0WzBdID09ICdbJykgeworKwkJZW5kID0gc3RyY2hyKGhvc3QgKyAxLCAnXScpOworKwkJaWYgKGVuZCkgeworKwkJCSplbmQgPSAwOworKwkJCWVuZCsrOworKwkJCWhvc3QrKzsKKysJCX0gZWxzZQorKwkJCWVuZCA9IGhvc3Q7CisrCX0gZWxzZQorKwkJZW5kID0gaG9zdDsKKysJY29sb24gPSBzdHJjaHIoZW5kLCAnOicpOworKworKwlpZiAoY29sb24pCisrCQlwb3J0ID0gY29sb24gKyAxOworKworKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKysJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKysJaGludHMuYWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKysKKysJZ2FpID0gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgJmhpbnRzLCAmYWkpOworKwlpZiAoZ2FpKQorKwkJZGllKCJVbmFibGUgdG8gbG9vayB1cCAlcyAoJXMpIiwgaG9zdCwgZ2FpX3N0cmVycm9yKGdhaSkpOworKworKwlmb3IgKGFpMCA9IGFpOyBhaTsgYWkgPSBhaS0+YWlfbmV4dCkgeworKwkJc29ja2ZkID0gc29ja2V0KGFpLT5haV9mYW1pbHksIGFpLT5haV9zb2NrdHlwZSwgYWktPmFpX3Byb3RvY29sKTsKKysJCWlmIChzb2NrZmQgPCAwKQorKwkJCWNvbnRpbnVlOworKwkJaWYgKGNvbm5lY3Qoc29ja2ZkLCBhaS0+YWlfYWRkciwgYWktPmFpX2FkZHJsZW4pIDwgMCkgeworKwkJCWNsb3NlKHNvY2tmZCk7CisrCQkJc29ja2ZkID0gLTE7CisrCQkJY29udGludWU7CisgCQl9CisrCQlicmVhazsKKyAJfQorIAorLQlsb29rdXBfaG9zdChob3N0LCAmYWRkcik7CistCSgoc3RydWN0IHNvY2thZGRyX2luICopJmFkZHIpLT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworKwlmcmVlYWRkcmluZm8oYWkwKTsKKyAKKy0Jc29ja2ZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAJaWYgKHNvY2tmZCA8IDApCisgCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgc29ja2V0ICglcykiLCBzdHJlcnJvcihlcnJubykpOworLQlpZiAoY29ubmVjdChzb2NrZmQsICh2b2lkICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKQorLQkJZGllKCJ1bmFibGUgdG8gY29ubmVjdCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKysKKyAJZmRbMF0gPSBzb2NrZmQ7CisgCWZkWzFdID0gc29ja2ZkOworIAlwYWNrZXRfd3JpdGUoc29ja2ZkLCAiJXMgJXNcbiIsIHByb2csIHBhdGgpOworCistLSAKK1lPU0hJRlVKSSBIaWRlYWtpIEAgVVNBR0kgUHJvamVjdCAgPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorR1BHLUZQICA6IDkwMjIgNjVFQiAxRUNGIDNBRDEgMEJERiAgODBEOCA0ODA3IEY4OTQgRTA2MiAwRUVBCisKZGlmZiAtLWdpdCBhL3QvdDUxMDAvcGF0Y2gwMDA1IGIvdC90NTEwMC9wYXRjaDAwMDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyNGIyNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDUxMDAvcGF0Y2gwMDA1CkBAIC0wLDAgKzEsNjkgQEAKKy0tLQorCisgRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQgfCAgICA5ICsrKysrKysrLQorIGdpdC1jdnNpbXBvcnQtc2NyaXB0ICAgICAgICAgICAgICAgICAgIHwgICAgNCArKy0tCisgMiBmaWxlcyBjaGFuZ2VkLCAxMCBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQorCis1MDQ1MmY5YzBjMmRmMWYwNGQ4M2EyNjI2NmJhNzA0YjEzODYxNjMyCitkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQgYi9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dAorLS0tIGEvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQKKysrKyBiL0RvY3VtZW50YXRpb24vZ2l0LWN2c2ltcG9ydC1zY3JpcHQudHh0CitAQCAtMjksNiArMjksMTAgQEAgT1BUSU9OUworIAljdXJyZW50bHksIG9ubHkgdGhlIDpsb2NhbDosIDpleHQ6IGFuZCA6cHNlcnZlcjogYWNjZXNzIG1ldGhvZHMgCisgCWFyZSBzdXBwb3J0ZWQuCisgCisrLUMgPHRhcmdldC1kaXI+OjoKKysgICAgICAgIFRoZSBHSVQgcmVwb3NpdG9yeSB0byBpbXBvcnQgdG8uICBJZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QKKysgICAgICAgIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKysKKyAtaTo6CisgCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKyAJZW5zdXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGNhY2hlIHJlbWFpbiB1bnRvdWNoZWQgYW5kIHdpbGwKK0BAIC00NCw3ICs0OCw3IEBAIE9QVElPTlMKKyAKKyAtcCA8b3B0aW9ucy1mb3ItY3ZzcHM+OjoKKyAJQWRkaXRpb25hbCBvcHRpb25zIGZvciBjdnNwcy4KKy0JVGhlIG9wdGlvbnMgJy14JyBhbmQgJy1BJyBhcmUgaW1wbGljaXQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlLgorKwlUaGUgb3B0aW9ucyAnLXUnIGFuZCAnLUEnIGFyZSBpbXBsaWNpdCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUuCisgCisgCUlmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgb3B0aW9ucywgc2VwYXJhdGUgdGhlbSB3aXRoIGEgY29tbWEuCisgCitAQCAtNTcsNiArNjEsOSBAQCBPUFRJT05TCisgLWg6OgorIAlQcmludCBhIHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCisgCisrLXogPGZ1eno+OjoKKysgICAgICAgIFBhc3MgdGhlIHRpbWVzdGFtcCBmdXp6IGZhY3RvciB0byBjdnNwcy4KKysKKyBPVVRQVVQKKyAtLS0tLS0KKyBJZiAnLXYnIGlzIHNwZWNpZmllZCwgdGhlIHNjcmlwdCByZXBvcnRzIHdoYXQgaXQgaXMgZG9pbmcuCitkaWZmIC0tZ2l0IGEvZ2l0LWN2c2ltcG9ydC1zY3JpcHQgYi9naXQtY3ZzaW1wb3J0LXNjcmlwdAorLS0tIGEvZ2l0LWN2c2ltcG9ydC1zY3JpcHQKKysrKyBiL2dpdC1jdnNpbXBvcnQtc2NyaXB0CitAQCAtMTkwLDcgKzE5MCw3IEBAIHN1YiBjb25uIHsKKyAJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiUm9vdCAkcmVwb1xuIik7CisgCisgCSMgVHJpYWwgYW5kIGVycm9yIHNheXMgdGhhdCB0aGlzIHByb2JhYmx5IGlzIHRoZSBtaW5pbXVtIHNldAorLQkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJWYWxpZC1yZXNwb25zZXMgb2sgZXJyb3IgVmFsaWQtcmVxdWVzdHMgTW9kZSBNIE1iaW5hcnkgRSBGIENoZWNrZWQtaW4gQ3JlYXRlZCBVcGRhdGVkIE1lcmdlZCBSZW1vdmVkXG4iKTsKKysJJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vZGUgTSBNYmluYXJ5IEUgQ2hlY2tlZC1pbiBDcmVhdGVkIFVwZGF0ZWQgTWVyZ2VkIFJlbW92ZWRcbiIpOworIAorIAkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJ2YWxpZC1yZXF1ZXN0c1xuIik7CisgCSRzZWxmLT57J3NvY2tldG8nfS0+Zmx1c2goKTsKK0BAIC02OTEsNyArNjkxLDcgQEAgd2hpbGUoPENWUz4pIHsKKyAJCXVubGluaygkdG1wbmFtZSk7CisgCQlteSAkbW9kZSA9IHBtb2RlKCRjdnMtPnsnbW9kZSd9KTsKKyAJCXB1c2goQG5ldyxbJG1vZGUsICRzaGEsICRmbl0pOyAjIG1heSBiZSByZXN1cnJlY3RlZCEKKy0JfSBlbHNpZigkc3RhdGUgPT0gOSBhbmQgL15ccysoXFMrKTpcZCg/OlwuXGQrKSstPihcZCg/OlwuXGQrKSspXChERUFEXClccyokLykgeworKwl9IGVsc2lmKCRzdGF0ZSA9PSA5IGFuZCAvXlxzKyhcUyspOlxkKyg/OlwuXGQrKSstPihcZCsoPzpcLlxkKykrKVwoREVBRFwpXHMqJC8pIHsKKyAJCW15ICRmbiA9ICQxOworIAkJJGZuID1+IHMjXi8rIyM7CisgCQlwdXNoKEBvbGQsJGZuKTsKKworLS0gCitEYXZpZCBL5WdlZGFsCistCitUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgZ2l0IiBpbgordGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKK01vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAorCmRpZmYgLS1naXQgYS90L3Q1MTAwL3NhbXBsZS5tYm94IGIvdC90NTEwMC9zYW1wbGUubWJveApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzY4NDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTEwMC9zYW1wbGUubWJveApAQCAtMCwwICsxLDMxNyBAQAorRnJvbSBub2JvZHkgTW9uIFNlcCAxNyAwMDowMDowMCAyMDAxCitGcm9tOiBBIFUgVGhvciA8YS51LnRob3JAZXhhbXBsZS5jb20+CitEYXRlOiBGcmksIDkgSnVuIDIwMDYgMDA6NDQ6MTYgLTA3MDAKK1N1YmplY3Q6IFtQQVRDSF0gYSBjb21taXQuCisKK0hlcmUgaXMgYSBwYXRjaCBmcm9tIEEgVSBUaG9yLgorCistLS0KKyBmb28gfCAgICAyICstCisgMSBmaWxlcyBjaGFuZ2VkLCAxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9mb28gYi9mb28KK2luZGV4IDkxMjNjZGMuLjkxOGRjZjggMTAwNjQ0CistLS0gYS9mb28KKysrKyBiL2ZvbworQEAgLTEgKzEgQEAKKy1GcmkgSnVuICA5IDAwOjQ0OjA0IFBEVCAyMDA2CisrRnJpIEp1biAgOSAwMDo0NDoxMyBQRFQgMjAwNgorLS0gCisxLjQuMC5nNmYyYgorCitGcm9tIG5vYm9keSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEEgVSBUaG9yIDxhLnUudGhvckBleGFtcGxlLmNvbT4KK0RhdGU6IEZyaSwgOSBKdW4gMjAwNiAwMDo0NDoxNiAtMDcwMAorU3ViamVjdDogW1BBVENIXSBhbm90aGVyIHBhdGNoCisKK0hlcmUgaXMgYSBwYXRjaCBmcm9tIEEgVSBUaG9yLiAgVGhpcyBhZGRyZXNzZXMgdGhlIGlzc3VlIHJhaXNlZCBpbiB0aGUKK21lc3NhZ2U6CisKK0Zyb206IE5pdCBQaWNrZXIgPG5pdC5waWNrZXJAZXhhbXBsZS5uZXQ+CitTdWJqZWN0OiBmb28gaXMgdG9vIG9sZAorTWVzc2FnZS1JZDogPG5pdHBpY2tlci4xMjEyMTIxMkBleGFtcGxlLm5ldD4KKworSG9wZWZ1bGx5IHRoaXMgd291bGQgZml4IHRoZSBwcm9ibGVtIHN0YXRlZCB0aGVyZS4KKworCitJIGhhdmUgaW5jbHVkZWQgYW4gZXh0cmEgYmxhbmsgbGluZSBhYm92ZSwgYnV0IGl0IGRvZXMgbm90IGhhdmUgdG8gYmUKK3N0cmlwcGVkIGF3YXkgaGVyZSwgYWxvbmcgd2l0aCB0aGUgICAgICAgICAgICAgICAJCSAgIAord2hpdGVzcGFjZXMgYXQgdGhlIGVuZCBvZiB0aGUgYWJvdmUgbGluZS4gIFRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHNxdWFzaGVkCit3aGVuIHRoZSBtZXNzYWdlIGlzIG1hZGUgaW50byBhIGNvbW1pdCBsb2cgYnkgc3RyaXBzcGFjZSwKK0Fsc28sIHRoZXJlIGFyZSB0aHJlZSBibGFuayBsaW5lcyBhZnRlciB0aGlzIHBhcmFncmFwaCwKK3R3byB0cnVseSBibGFuayBhbmQgYW5vdGhlciBmdWxsIG9mIHNwYWNlcyBpbiBiZXR3ZWVuLgorCisgICAgICAgICAgICAKKworSG9wZSB0aGlzIGhlbHBzLgorCistLS0KKyBmb28gfCAgICAyICstCisgMSBmaWxlcyBjaGFuZ2VkLCAxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9mb28gYi9mb28KK2luZGV4IDkxMjNjZGMuLjkxOGRjZjggMTAwNjQ0CistLS0gYS9mb28KKysrKyBiL2ZvbworQEAgLTEgKzEgQEAKKy1GcmkgSnVuICA5IDAwOjQ0OjA0IFBEVCAyMDA2CisrRnJpIEp1biAgOSAwMDo0NDoxMyBQRFQgMjAwNgorLS0gCisxLjQuMC5nNmYyYgorCitGcm9tIG5vYm9keSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IEp1bmlvIEMgSGFtYW5vIDxqdW5pb0BrZXJuZWwub3JnPgorRGF0ZTogRnJpLCA5IEp1biAyMDA2IDAwOjQ0OjE2IC0wNzAwCitTdWJqZWN0OiByZTogW1BBVENIXSBhbm90aGVyIHBhdGNoCisKK0Zyb206IEEgVSBUaG9yIDxhLnUudGhvckBleGFtcGxlLmNvbT4KK1N1YmplY3Q6IFtQQVRDSF0gdGhpcmQgcGF0Y2gKKworSGVyZSBpcyBhIHBhdGNoIGZyb20gQSBVIFRob3IuICBUaGlzIGFkZHJlc3NlcyB0aGUgaXNzdWUgcmFpc2VkIGluIHRoZQorbWVzc2FnZToKKworRnJvbTogTml0IFBpY2tlciA8bml0LnBpY2tlckBleGFtcGxlLm5ldD4KK1N1YmplY3Q6IGZvbyBpcyB0b28gb2xkCitNZXNzYWdlLUlkOiA8bml0cGlja2VyLjEyMTIxMjEyQGV4YW1wbGUubmV0PgorCitIb3BlZnVsbHkgdGhpcyB3b3VsZCBmaXggdGhlIHByb2JsZW0gc3RhdGVkIHRoZXJlLgorCistLS0KKyBmb28gfCAgICAyICstCisgMSBmaWxlcyBjaGFuZ2VkLCAxIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb25zKC0pCisKK2RpZmYgLS1naXQgYS9mb28gYi9mb28KK2luZGV4IDkxMjNjZGMuLjkxOGRjZjggMTAwNjQ0CistLS0gYS9mb28KKysrKyBiL2ZvbworQEAgLTEgKzEgQEAKKy1GcmkgSnVuICA5IDAwOjQ0OjA0IFBEVCAyMDA2CisrRnJpIEp1biAgOSAwMDo0NDoxMyBQRFQgMjAwNgorLS0gCisxLjQuMC5nNmYyYgorCitGcm9tIG5vYm9keSBTYXQgQXVnIDI3IDIzOjA3OjQ5IDIwMDUKK1BhdGg6IG5ld3MuZ21hbmUub3JnIW5vdC1mb3ItbWFpbAorTWVzc2FnZS1JRDogPDIwMDUwNzIxLjA5MTAzNi4wMTExOTUxNi55b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KK0Zyb206IFlPU0hJRlVKSSBIaWRlYWtpIC8gPT9pc28tMjAyMi1qcD9CP0d5UkNOVWhHSXpGUlRFQWJLRUk9Pz0gCisJPHlvc2hmdWppQGxpbnV4LWlwdjYub3JnPgorTmV3c2dyb3VwczogZ21hbmUuY29tcC52ZXJzaW9uLWNvbnRyb2wuZ2l0CitTdWJqZWN0OiBbUEFUQ0ggMS8yXSBHSVQ6IFRyeSBhbGwgYWRkcmVzc2VzIGZvciBnaXZlbiByZW1vdGUgbmFtZQorRGF0ZTogVGh1LCAyMSBKdWwgMjAwNSAwOToxMDozNiAtMDQwMCAoRURUKQorTGluZXM6IDk5CitPcmdhbml6YXRpb246IFVTQUdJL1dJREUgUHJvamVjdAorQXBwcm92ZWQ6IG5ld3NAZ21hbmUub3JnCitOTlRQLVBvc3RpbmctSG9zdDogbWFpbi5nbWFuZS5vcmcKK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IFRleHQvUGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1gtVHJhY2U6IHNlYS5nbWFuZS5vcmcgMTEyMTk1MTQzNCAyOTM1MCA4MC45MS4yMjkuMiAoMjEgSnVsIDIwMDUgMTM6MTA6MzQgR01UKQorWC1Db21wbGFpbnRzLVRvOiB1c2VuZXRAc2VhLmdtYW5lLm9yZworTk5UUC1Qb3N0aW5nLURhdGU6IFRodSwgMjEgSnVsIDIwMDUgMTM6MTA6MzQgKzAwMDAgKFVUQykKKworSGVsbG8uCisKK1RyeSBhbGwgYWRkcmVzc2VzIGZvciBnaXZlbiByZW1vdGUgbmFtZSB1bnRpbCBpdCBzdWNjZWVkcy4KK0Fsc28gc3VwcG9ydHMgSVB2Ni4KKworU2lnbmVkLW9mLWJ5OiBIaWRlYWtpIFlPU0hJRlVKSSA8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CisKK2RpZmYgLS1naXQgYS9jb25uZWN0LmMgYi9jb25uZWN0LmMKKy0tLSBhL2Nvbm5lY3QuYworKysrIGIvY29ubmVjdC5jCitAQCAtOTYsNDIgKzk2LDU3IEBAIHN0YXRpYyBlbnVtIHByb3RvY29sIGdldF9wcm90b2NvbChjb25zdCAKKyAJZGllKCJJIGRvbid0IGhhbmRsZSBwcm90b2NvbCAnJXMnIiwgbmFtZSk7CisgfQorIAorLXN0YXRpYyB2b2lkIGxvb2t1cF9ob3N0KGNvbnN0IGNoYXIgKmhvc3QsIHN0cnVjdCBzb2NrYWRkciAqaW4pCisteworLQlzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKy0JaW50IHJldDsKKy0KKy0JcmV0ID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgTlVMTCwgJnJlcyk7CistCWlmIChyZXQpCistCQlkaWUoIlVuYWJsZSB0byBsb29rIHVwICVzICglcykiLCBob3N0LCBnYWlfc3RyZXJyb3IocmV0KSk7CistCSppbiA9ICpyZXMtPmFpX2FkZHI7CistCWZyZWVhZGRyaW5mbyhyZXMpOworLX0KKysjZGVmaW5lIFNUUl8ocykJIyBzCisrI2RlZmluZSBTVFIocykJU1RSXyhzKQorIAorIHN0YXRpYyBpbnQgZ2l0X3RjcF9jb25uZWN0KGludCBmZFsyXSwgY29uc3QgY2hhciAqcHJvZywgY2hhciAqaG9zdCwgY2hhciAqcGF0aCkKKyB7CistCXN0cnVjdCBzb2NrYWRkciBhZGRyOworLQlpbnQgcG9ydCA9IERFRkFVTFRfR0lUX1BPUlQsIHNvY2tmZDsKKy0JY2hhciAqY29sb247CistCistCWNvbG9uID0gc3RyY2hyKGhvc3QsICc6Jyk7CistCWlmIChjb2xvbikgeworLQkJY2hhciAqZW5kOworLQkJdW5zaWduZWQgbG9uZyBuID0gc3RydG91bChjb2xvbisxLCAmZW5kLCAwKTsKKy0JCWlmIChjb2xvblsxXSAmJiAhKmVuZCkgeworLQkJCSpjb2xvbiA9IDA7CistCQkJcG9ydCA9IG47CisrCWludCBzb2NrZmQgPSAtMTsKKysJY2hhciAqY29sb24sICplbmQ7CisrCWNoYXIgKnBvcnQgPSBTVFIoREVGQVVMVF9HSVRfUE9SVCk7CisrCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKmFpMCwgKmFpOworKwlpbnQgZ2FpOworKworKwlpZiAoaG9zdFswXSA9PSAnWycpIHsKKysJCWVuZCA9IHN0cmNocihob3N0ICsgMSwgJ10nKTsKKysJCWlmIChlbmQpIHsKKysJCQkqZW5kID0gMDsKKysJCQllbmQrKzsKKysJCQlob3N0Kys7CisrCQl9IGVsc2UKKysJCQllbmQgPSBob3N0OworKwl9IGVsc2UKKysJCWVuZCA9IGhvc3Q7CisrCWNvbG9uID0gc3RyY2hyKGVuZCwgJzonKTsKKysKKysJaWYgKGNvbG9uKQorKwkJcG9ydCA9IGNvbG9uICsgMTsKKysKKysJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisrCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisrCWhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CisrCisrCWdhaSA9IGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsICZoaW50cywgJmFpKTsKKysJaWYgKGdhaSkKKysJCWRpZSgiVW5hYmxlIHRvIGxvb2sgdXAgJXMgKCVzKSIsIGhvc3QsIGdhaV9zdHJlcnJvcihnYWkpKTsKKysKKysJZm9yIChhaTAgPSBhaTsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKKysJCXNvY2tmZCA9IHNvY2tldChhaS0+YWlfZmFtaWx5LCBhaS0+YWlfc29ja3R5cGUsIGFpLT5haV9wcm90b2NvbCk7CisrCQlpZiAoc29ja2ZkIDwgMCkKKysJCQljb250aW51ZTsKKysJCWlmIChjb25uZWN0KHNvY2tmZCwgYWktPmFpX2FkZHIsIGFpLT5haV9hZGRybGVuKSA8IDApIHsKKysJCQljbG9zZShzb2NrZmQpOworKwkJCXNvY2tmZCA9IC0xOworKwkJCWNvbnRpbnVlOworIAkJfQorKwkJYnJlYWs7CisgCX0KKyAKKy0JbG9va3VwX2hvc3QoaG9zdCwgJmFkZHIpOworLQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZhZGRyKS0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKysJZnJlZWFkZHJpbmZvKGFpMCk7CisgCistCXNvY2tmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgCWlmIChzb2NrZmQgPCAwKQorIAkJZGllKCJ1bmFibGUgdG8gY3JlYXRlIHNvY2tldCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKKy0JaWYgKGNvbm5lY3Qoc29ja2ZkLCAodm9pZCAqKSZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkKKy0JCWRpZSgidW5hYmxlIHRvIGNvbm5lY3QgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisrCisgCWZkWzBdID0gc29ja2ZkOworIAlmZFsxXSA9IHNvY2tmZDsKKyAJcGFja2V0X3dyaXRlKHNvY2tmZCwgIiVzICVzXG4iLCBwcm9nLCBwYXRoKTsKKworLS0gCitZT1NISUZVSkkgSGlkZWFraSBAIFVTQUdJIFByb2plY3QgIDx5b3NoZnVqaUBsaW51eC1pcHY2Lm9yZz4KK0dQRy1GUCAgOiA5MDIyIDY1RUIgMUVDRiAzQUQxIDBCREYgIDgwRDggNDgwNyBGODk0IEUwNjIgMEVFQQorCitGcm9tIG5vYm9keSBTYXQgQXVnIDI3IDIzOjA3OjQ5IDIwMDUKK1BhdGg6IG5ld3MuZ21hbmUub3JnIW5vdC1mb3ItbWFpbAorTWVzc2FnZS1JRDogPHU1dGFjampkcHhxLmZzZkBseXNhdG9yLmxpdS5zZT4KK0Zyb206ID0/aXNvLTg4NTktMT9RP0RhdmlkX0s9RTVnZWRhbD89IDxkYXZpZGtAbHlzYXRvci5saXUuc2U+CitOZXdzZ3JvdXBzOiBnbWFuZS5jb21wLnZlcnNpb24tY29udHJvbC5naXQKK1N1YmplY3Q6IFtQQVRDSF0gRml4ZWQgdHdvIGJ1Z3MgaW4gZ2l0LWN2c2ltcG9ydC1zY3JpcHQuCitEYXRlOiBNb24sIDE1IEF1ZyAyMDA1IDIwOjE4OjI1ICswMjAwCitMaW5lczogODMKK0FwcHJvdmVkOiBuZXdzQGdtYW5lLm9yZworTk5UUC1Qb3N0aW5nLUhvc3Q6IG1haW4uZ21hbmUub3JnCitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTEKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFFVT1RFRC1QUklOVEFCTEUKK1gtVHJhY2U6IHNlYS5nbWFuZS5vcmcgMTEyNDEzMDI0NyAzMTgzOSA4MC45MS4yMjkuMiAoMTUgQXVnIDIwMDUgMTg6MjQ6MDcgR01UKQorWC1Db21wbGFpbnRzLVRvOiB1c2VuZXRAc2VhLmdtYW5lLm9yZworTk5UUC1Qb3N0aW5nLURhdGU6IE1vbiwgMTUgQXVnIDIwMDUgMTg6MjQ6MDcgKzAwMDAgKFVUQykKK0NjOiAiSnVuaW8gQy4gSGFtYW5vIiA8anVua2lvQGNveC5uZXQ+CitPcmlnaW5hbC1YLUZyb206IGdpdC1vd25lckB2Z2VyLmtlcm5lbC5vcmcgTW9uIEF1ZyAxNSAyMDoyNDowNSAyMDA1CisKK1RoZSBnaXQtY3ZzaW1wb3J0LXNjcmlwdCBoYWQgYSBjb3B1bGUgb2Ygc21hbGwgYnVncyB0aGF0IHByZXZlbnRlZCBtZQorZnJvbSBpbXBvcnRpbmcgYSBiaWcgQ1ZTIHJlcG9zaXRvcnkuCisKK1RoZSBmaXJzdCB3YXMgdGhhdCBpdCBkaWRuJ3QgaGFuZGxlIHJlbW92ZWQgZmlsZXMgd2l0aCBhIG11bHRpLWRpZ2l0CitwcmltYXJ5IHJldmlzaW9uIG51bWJlci4KKworVGhlIHNlY29uZCB3YXMgdGhhdCBpdCB3YXMgYXNraW5nIHRoZSBDVlMgc2VydmVyIGZvciAiRiIgbWVzc2FnZXMsCithbHRob3VnaCB0aGV5IHdlcmUgbm90IGhhbmRsZWQuCisKK0kgYWxzbyB1cGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGF0IHNjcmlwdCB0byBjb3JyZXNwb25kIHRvCithY3R1YWwgZmxhZ3MuCisKK1NpZ25lZC1vZmYtYnk6IERhdmlkIEs9RTVnZWRhbCA8ZGF2aWRrQGx5c2F0b3IubGl1LnNlPgorLS0tCisKKyBEb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dCB8ICAgIDkgKysrKysrKystCisgZ2l0LWN2c2ltcG9ydC1zY3JpcHQgICAgICAgICAgICAgICAgICAgfCAgICA0ICsrLS0KKyAyIGZpbGVzIGNoYW5nZWQsIDEwIGluc2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCisKKzUwNDUyZjljMGMyZGYxZjA0ZDgzYTI2MjY2YmE3MDRiMTM4NjE2MzIKK2RpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dCBiL0RvY3VtZW50YXRpb24vZ2l0PQorLWN2c2ltcG9ydC1zY3JpcHQudHh0CistLS0gYS9Eb2N1bWVudGF0aW9uL2dpdC1jdnNpbXBvcnQtc2NyaXB0LnR4dAorKysrIGIvRG9jdW1lbnRhdGlvbi9naXQtY3ZzaW1wb3J0LXNjcmlwdC50eHQKK0BAIC0yOSw2ICsyOSwxMCBAQCBPUFRJT05TCisgCWN1cnJlbnRseSwgb25seSB0aGUgOmxvY2FsOiwgOmV4dDogYW5kIDpwc2VydmVyOiBhY2Nlc3MgbWV0aG9kcz0yMAorIAlhcmUgc3VwcG9ydGVkLgorPTIwCisrLUMgPHRhcmdldC1kaXI+OjoKKysgICAgICAgIFRoZSBHSVQgcmVwb3NpdG9yeSB0byBpbXBvcnQgdG8uICBJZiB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QKKysgICAgICAgIGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKysKKyAtaTo6CisgCUltcG9ydC1vbmx5OiBkb24ndCBwZXJmb3JtIGEgY2hlY2tvdXQgYWZ0ZXIgaW1wb3J0aW5nLiAgVGhpcyBvcHRpb24KKyAJZW5zdXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGNhY2hlIHJlbWFpbiB1bnRvdWNoZWQgYW5kIHdpbGwKK0BAIC00NCw3ICs0OCw3IEBAIE9QVElPTlMKKz0yMAorIC1wIDxvcHRpb25zLWZvci1jdnNwcz46OgorIAlBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIGN2c3BzLgorLQlUaGUgb3B0aW9ucyAnLXgnIGFuZCAnLUEnIGFyZSBpbXBsaWNpdCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGhlcmUuCisrCVRoZSBvcHRpb25zICctdScgYW5kICctQScgYXJlIGltcGxpY2l0IGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaGVyZS4KKz0yMAorIAlJZiB5b3UgbmVlZCB0byBwYXNzIG11bHRpcGxlIG9wdGlvbnMsIHNlcGFyYXRlIHRoZW0gd2l0aCBhIGNvbW1hLgorPTIwCitAQCAtNTcsNiArNjEsOSBAQCBPUFRJT05TCisgLWg6OgorIAlQcmludCBhIHNob3J0IHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuCis9MjAKKysteiA8ZnV6ej46OgorKyAgICAgICAgUGFzcyB0aGUgdGltZXN0YW1wIGZ1enogZmFjdG9yIHRvIGN2c3BzLgorKworIE9VVFBVVAorIC0tLS0tLQorIElmICctdicgaXMgc3BlY2lmaWVkLCB0aGUgc2NyaXB0IHJlcG9ydHMgd2hhdCBpdCBpcyBkb2luZy4KK2RpZmYgLS1naXQgYS9naXQtY3ZzaW1wb3J0LXNjcmlwdCBiL2dpdC1jdnNpbXBvcnQtc2NyaXB0CistLS0gYS9naXQtY3ZzaW1wb3J0LXNjcmlwdAorKysrIGIvZ2l0LWN2c2ltcG9ydC1zY3JpcHQKK0BAIC0xOTAsNyArMTkwLDcgQEAgc3ViIGNvbm4geworIAkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJSb290ICRyZXBvXG4iKTsKKz0yMAorIAkjIFRyaWFsIGFuZCBlcnJvciBzYXlzIHRoYXQgdGhpcyBwcm9iYWJseSBpcyB0aGUgbWluaW11bSBzZXQKKy0JJHNlbGYtPnsnc29ja2V0byd9LT53cml0ZSgiVmFsaWQtcmVzcG9uc2VzIG9rIGVycm9yIFZhbGlkLXJlcXVlc3RzIE1vPQorZGUgTSBNYmluYXJ5IEUgRiBDaGVja2VkLWluIENyZWF0ZWQgVXBkYXRlZCBNZXJnZWQgUmVtb3ZlZFxuIik7CisrCSRzZWxmLT57J3NvY2tldG8nfS0+d3JpdGUoIlZhbGlkLXJlc3BvbnNlcyBvayBlcnJvciBWYWxpZC1yZXF1ZXN0cyBNbz0KK2RlIE0gTWJpbmFyeSBFIENoZWNrZWQtaW4gQ3JlYXRlZCBVcGRhdGVkIE1lcmdlZCBSZW1vdmVkXG4iKTsKKz0yMAorIAkkc2VsZi0+eydzb2NrZXRvJ30tPndyaXRlKCJ2YWxpZC1yZXF1ZXN0c1xuIik7CisgCSRzZWxmLT57J3NvY2tldG8nfS0+Zmx1c2goKTsKK0BAIC02OTEsNyArNjkxLDcgQEAgd2hpbGUoPENWUz4pIHsKKyAJCXVubGluaygkdG1wbmFtZSk7CisgCQlteSAkbW9kZSA9M0QgcG1vZGUoJGN2cy0+eydtb2RlJ30pOworIAkJcHVzaChAbmV3LFskbW9kZSwgJHNoYSwgJGZuXSk7ICMgbWF5IGJlIHJlc3VycmVjdGVkIQorLQl9IGVsc2lmKCRzdGF0ZSA9M0Q9M0QgOSBhbmQgL15ccysoXFMrKTpcZCg/OlwuXGQrKSstPihcZCg/OlwuXGQrKSspXCg9CitERUFEXClccyokLykgeworKwl9IGVsc2lmKCRzdGF0ZSA9M0Q9M0QgOSBhbmQgL15ccysoXFMrKTpcZCsoPzpcLlxkKykrLT4oXGQrKD86XC5cZCspKyk9CitcKERFQURcKVxzKiQvKSB7CisgCQlteSAkZm4gPTNEICQxOworIAkJJGZuID0zRH4gcyNeLysjIzsKKyAJCXB1c2goQG9sZCwkZm4pOworCistLT0yMAorRGF2aWQgSz1FNWdlZGFsCistCitUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgZ2l0IiBpbgordGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKK01vcmUgbWFqb3Jkb21vIGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbAorCmRpZmYgLS1naXQgYS90L3Q1MzAwLXBhY2stb2JqZWN0LnNoIGIvdC90NTMwMC1wYWNrLW9iamVjdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTQ1YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NTMwMC1wYWNrLW9iamVjdC5zaApAQCAtMCwwICsxLDE5OSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtcGFjay1vYmplY3QKKworJworLiAuL3Rlc3QtbGliLnNoCisKK1RSQVNIPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdzZXR1cCcgXAorICAgICdybSAtZiAuZ2l0L2luZGV4KgorICAgICBmb3IgaSBpbiBhIGIgYworICAgICBkbworCSAgICAgZGQgaWY9L2Rldi96ZXJvIGJzPTRrIGNvdW50PTEgfCB0ciAiXFwwIiAkaSA+JGkgJiYKKwkgICAgIGdpdC11cGRhdGUtaW5kZXggLS1hZGQgJGkgfHwgcmV0dXJuIDEKKyAgICAgZG9uZSAmJgorICAgICBjYXQgYyA+ZCAmJiBlY2hvIGZvbyA+PmQgJiYgZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBkICYmCisgICAgIHRyZWU9YGdpdC13cml0ZS10cmVlYCAmJgorICAgICBjb21taXQ9YGdpdC1jb21taXQtdHJlZSAkdHJlZSA8L2Rldi9udWxsYCAmJiB7CisJIGVjaG8gJHRyZWUgJiYKKwkgZWNobyAkY29tbWl0ICYmCisJIGdpdC1scy10cmVlICR0cmVlIHwgc2VkIC1lICJzLy4qIFxcKFswLTlhLWZdKlxcKQkuKi9cXDEvIgorICAgICB9ID5vYmotbGlzdCAmJiB7CisJIGdpdC1kaWZmLXRyZWUgLS1yb290IC1wICRjb21taXQgJiYKKwkgd2hpbGUgcmVhZCBvYmplY3QKKwkgZG8KKwkgICAgdD1gZ2l0LWNhdC1maWxlIC10ICRvYmplY3RgICYmCisJICAgIGdpdC1jYXQtZmlsZSAkdCAkb2JqZWN0IHx8IHJldHVybiAxCisJIGRvbmUgPG9iai1saXN0CisgICAgIH0gPmV4cGVjdCcKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3BhY2sgd2l0aG91dCBkZWx0YScgXAorICAgICdwYWNrbmFtZV8xPSQoZ2l0LXBhY2stb2JqZWN0cyAtLXdpbmRvdz0wIHRlc3QtMSA8b2JqLWxpc3QpJworCitybSAtZnIgLmdpdDIKK21rZGlyIC5naXQyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1bnBhY2sgd2l0aG91dCBkZWx0YScgXAorICAgICJHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBnaXQtaW5pdC1kYiAmJgorICAgICBnaXQtdW5wYWNrLW9iamVjdHMgLW4gPHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgJiYKKyAgICAgZ2l0LXVucGFjay1vYmplY3RzIDx0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIgorCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQorY2QgIiRUUkFTSC8uZ2l0MiIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNrIHVucGFjayB3aXRob3V0IGRlbHRhJyBcCisgICAgJyhjZCAuLi8uZ2l0ICYmIGZpbmQgb2JqZWN0cyAtdHlwZSBmIC1wcmludCkgfAorICAgICB3aGlsZSByZWFkIHBhdGgKKyAgICAgZG8KKyAgICAgICAgIGNtcCAkcGF0aCAuLi8uZ2l0LyRwYXRoIHx8IHsKKwkgICAgIGVjaG8gJHBhdGggZGlmZmVycy4KKwkgICAgIHJldHVybiAxCisJIH0KKyAgICAgZG9uZScKK2NkICIkVFJBU0giCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwYWNrIHdpdGggZGVsdGEnIFwKKyAgICAncHdkICYmCisgICAgIHBhY2tuYW1lXzI9JChnaXQtcGFjay1vYmplY3RzIHRlc3QtMiA8b2JqLWxpc3QpJworCitybSAtZnIgLmdpdDIKK21rZGlyIC5naXQyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1bnBhY2sgd2l0aCBkZWx0YScgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBnaXQtaW5pdC1kYiAmJgorICAgICBnaXQtdW5wYWNrLW9iamVjdHMgLW4gPHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgJiYKKyAgICAgZ2l0LXVucGFjay1vYmplY3RzIDx0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrJworCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQorY2QgIiRUUkFTSC8uZ2l0MiIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVjayB1bnBhY2sgd2l0aCBkZWx0YScgXAorICAgICcoY2QgLi4vLmdpdCAmJiBmaW5kIG9iamVjdHMgLXR5cGUgZiAtcHJpbnQpIHwKKyAgICAgd2hpbGUgcmVhZCBwYXRoCisgICAgIGRvCisgICAgICAgICBjbXAgJHBhdGggLi4vLmdpdC8kcGF0aCB8fCB7CisJICAgICBlY2hvICRwYXRoIGRpZmZlcnMuCisJICAgICByZXR1cm4gMQorCSB9CisgICAgIGRvbmUnCitjZCAiJFRSQVNIIgorCitybSAtZnIgLmdpdDIKK21rZGlyIC5naXQyCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICd1c2UgcGFja2VkIG9iamVjdHMnIFwKKyAgICAnR0lUX09CSkVDVF9ESVJFQ1RPUlk9LmdpdDIvb2JqZWN0cyAmJgorICAgICBleHBvcnQgR0lUX09CSkVDVF9ESVJFQ1RPUlkgJiYKKyAgICAgZ2l0LWluaXQtZGIgJiYKKyAgICAgY3AgdGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5pZHggLmdpdDIvb2JqZWN0cy9wYWNrICYmIHsKKwkgZ2l0LWRpZmYtdHJlZSAtLXJvb3QgLXAgJGNvbW1pdCAmJgorCSB3aGlsZSByZWFkIG9iamVjdAorCSBkbworCSAgICB0PWBnaXQtY2F0LWZpbGUgLXQgJG9iamVjdGAgJiYKKwkgICAgZ2l0LWNhdC1maWxlICR0ICRvYmplY3QgfHwgcmV0dXJuIDEKKwkgZG9uZSA8b2JqLWxpc3QKKyAgICB9ID5jdXJyZW50ICYmCisgICAgZGlmZiBleHBlY3QgY3VycmVudCcKKworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndXNlIHBhY2tlZCBkZWx0aWZpZWQgb2JqZWN0cycgXAorICAgICdHSVRfT0JKRUNUX0RJUkVDVE9SWT0uZ2l0Mi9vYmplY3RzICYmCisgICAgIGV4cG9ydCBHSVRfT0JKRUNUX0RJUkVDVE9SWSAmJgorICAgICBybSAtZiAuZ2l0Mi9vYmplY3RzL3BhY2svdGVzdC0/LmlkeCAmJgorICAgICBjcCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrIHRlc3QtMi0ke3BhY2tuYW1lXzJ9LmlkeCAuZ2l0Mi9vYmplY3RzL3BhY2sgJiYgeworCSBnaXQtZGlmZi10cmVlIC0tcm9vdCAtcCAkY29tbWl0ICYmCisJIHdoaWxlIHJlYWQgb2JqZWN0CisJIGRvCisJICAgIHQ9YGdpdC1jYXQtZmlsZSAtdCAkb2JqZWN0YCAmJgorCSAgICBnaXQtY2F0LWZpbGUgJHQgJG9iamVjdCB8fCByZXR1cm4gMQorCSBkb25lIDxvYmotbGlzdAorICAgIH0gPmN1cnJlbnQgJiYKKyAgICBkaWZmIGV4cGVjdCBjdXJyZW50JworCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAndmVyaWZ5IHBhY2snIFwKKyAgICAnZ2l0LXZlcmlmeS1wYWNrIHRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHgnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjb3JydXB0IGEgcGFjayBhbmQgc2VlIGlmIHZlcmlmeSBjYXRjaGVzJyBcCisgICAgJ2NwIHRlc3QtMS0ke3BhY2tuYW1lXzF9LmlkeCB0ZXN0LTMuaWR4ICYmCisgICAgIGNwIHRlc3QtMi0ke3BhY2tuYW1lXzJ9LnBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgaWYgZ2l0LXZlcmlmeS1wYWNrIHRlc3QtMy5pZHgKKyAgICAgdGhlbiBmYWxzZQorICAgICBlbHNlIDo7CisgICAgIGZpICYmCisKKyAgICAgOiBQQUNLX1NJR05BVFVSRSAmJgorICAgICBjcCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMucGFjayBjb3VudD0xIGJzPTEgY29udj1ub3RydW5jIHNlZWs9MiAmJgorICAgICBpZiBnaXQtdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmkgJiYKKworICAgICA6IFBBQ0tfVkVSU0lPTiAmJgorICAgICBjcCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMucGFjayBjb3VudD0xIGJzPTEgY29udj1ub3RydW5jIHNlZWs9NyAmJgorICAgICBpZiBnaXQtdmVyaWZ5LXBhY2sgdGVzdC0zLmlkeAorICAgICB0aGVuIGZhbHNlCisgICAgIGVsc2UgOjsKKyAgICAgZmkgJiYKKworICAgICA6IFRZUEUvU0laRSBieXRlIG9mIHRoZSBmaXJzdCBwYWNrZWQgb2JqZWN0IGRhdGEgJiYKKyAgICAgY3AgdGVzdC0xLSR7cGFja25hbWVfMX0ucGFjayB0ZXN0LTMucGFjayAmJgorICAgICBkZCBpZj0vZGV2L3plcm8gb2Y9dGVzdC0zLnBhY2sgY291bnQ9MSBicz0xIGNvbnY9bm90cnVuYyBzZWVrPTEyICYmCisgICAgIGlmIGdpdC12ZXJpZnktcGFjayB0ZXN0LTMuaWR4CisgICAgIHRoZW4gZmFsc2UKKyAgICAgZWxzZSA6OworICAgICBmaSAmJgorCisgICAgIDogc3VtIG9mIHRoZSBpbmRleCBmaWxlIGl0c2VsZiAmJgorICAgICBsPWB3YyAtYyA8dGVzdC0zLmlkeGAgJiYKKyAgICAgbD1gZXhwciAkbCAtIDIwYCAmJgorICAgICBjcCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGRkIGlmPS9kZXYvemVybyBvZj10ZXN0LTMuaWR4IGNvdW50PTIwIGJzPTEgY29udj1ub3RydW5jIHNlZWs9JGwgJiYKKyAgICAgaWYgZ2l0LXZlcmlmeS1wYWNrIHRlc3QtMy5wYWNrCisgICAgIHRoZW4gZmFsc2UKKyAgICAgZWxzZSA6OworICAgICBmaSAmJgorCisgICAgIDonCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdidWlsZCBwYWNrIGluZGV4IGZvciBhbiBleGlzdGluZyBwYWNrJyBcCisgICAgJ2NwIHRlc3QtMS0ke3BhY2tuYW1lXzF9LnBhY2sgdGVzdC0zLnBhY2sgJiYKKyAgICAgZ2l0LWluZGV4LXBhY2sgLW8gdG1wLmlkeCB0ZXN0LTMucGFjayAmJgorICAgICBjbXAgdG1wLmlkeCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5pZHggJiYKKworICAgICBnaXQtaW5kZXgtcGFjayB0ZXN0LTMucGFjayAmJgorICAgICBjbXAgdGVzdC0zLmlkeCB0ZXN0LTEtJHtwYWNrbmFtZV8xfS5pZHggJiYKKworICAgICBjcCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5wYWNrIHRlc3QtMy5wYWNrICYmCisgICAgIGdpdC1pbmRleC1wYWNrIC1vIHRtcC5pZHggdGVzdC0yLSR7cGFja25hbWVfMn0ucGFjayAmJgorICAgICBjbXAgdG1wLmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHggJiYKKworICAgICBnaXQtaW5kZXgtcGFjayB0ZXN0LTMucGFjayAmJgorICAgICBjbXAgdGVzdC0zLmlkeCB0ZXN0LTItJHtwYWNrbmFtZV8yfS5pZHggJiYKKworICAgICA6JworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU0MDAtc2VuZC1wYWNrLnNoIGIvdC90NTQwMC1zZW5kLXBhY2suc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjM2OTRhYwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDU0MDAtc2VuZC1wYWNrLnNoCkBAIC0wLDAgKzEsNjcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nU2VlIHdoeSByZXdpbmRpbmcgaGVhZCBicmVha3Mgc2VuZC1wYWNrCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCit0b3VjaCBjcGlvLXRlc3QKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3dvcmtpbmcgY3BpbycgJ2VjaG8gY3Bpby10ZXN0IHwgY3BpbyAtbyA+IC9kZXYvbnVsbCcKKworY250PScxJwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCisJdHJlZT0kKGdpdC13cml0ZS10cmVlKSAmJgorCWNvbW1pdD0kKGVjaG8gIkNvbW1pdCAjMCIgfCBnaXQtY29tbWl0LXRyZWUgJHRyZWUpICYmCisJemVybz0kY29tbWl0ICYmCisJcGFyZW50PSR6ZXJvICYmCisJZm9yIGkgaW4gJGNudAorCWRvCisJICAgIHNsZWVwIDEgJiYKKwkgICAgY29tbWl0PSQoZWNobyAiQ29tbWl0ICMkaSIgfCBnaXQtY29tbWl0LXRyZWUgJHRyZWUgLXAgJHBhcmVudCkgJiYKKwkgICAgcGFyZW50PSRjb21taXQgfHwgcmV0dXJuIDEKKwlkb25lICYmCisJZ2l0LXVwZGF0ZS1yZWYgSEVBRCAiJGNvbW1pdCIgJiYKKwlnaXQtY2xvbmUgLWwgLi8uIHZpY3RpbSAmJgorCWNkIHZpY3RpbSAmJgorCWdpdC1sb2cgJiYKKwljZCAuLiAmJgorCWdpdC11cGRhdGUtcmVmIEhFQUQgIiR6ZXJvIiAmJgorCXBhcmVudD0kemVybyAmJgorCWZvciBpIGluICRjbnQKKwlkbworCSAgICBzbGVlcCAxICYmCisJICAgIGNvbW1pdD0kKGVjaG8gIlJlYmFzZSAjJGkiIHwgZ2l0LWNvbW1pdC10cmVlICR0cmVlIC1wICRwYXJlbnQpICYmCisJICAgIHBhcmVudD0kY29tbWl0IHx8IHJldHVybiAxCisJZG9uZSAmJgorCWdpdC11cGRhdGUtcmVmIEhFQUQgIiRjb21taXQiICYmCisJZWNobyBSZWJhc2UgJiYKKwlnaXQtbG9nJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAgICAgJ3B1c2hpbmcgcmV3b3VuZCBoZWFkIHNob3VsZCBub3QgYmFyZiBidXQgcmVxdWlyZSAtLWZvcmNlJyAnIAorCSMgc2hvdWxkIG5vdCBmYWlsIGJ1dCByZWZ1c2UgdG8gdXBkYXRlLgorCWlmIGdpdC1zZW5kLXBhY2sgLi92aWN0aW0vLmdpdC8gbWFzdGVyCisJdGhlbgorCQkjIG5vdyBpdCBzaG91bGQgZmFpbCB3aXRoIFBhc2t5IHBhdGNoCisJCWVjaG8gPiYyIEdhYWgsIGl0IHNob3VsZCBoYXZlIGZhaWxlZC4KKwkJZmFsc2UKKwllbHNlCisJCWVjaG8gPiYyIFRoYW5rcywgaXQgY29ycmVjdGx5IGZhaWxlZC4KKwkJdHJ1ZQorCWZpICYmCisJaWYgY21wIHZpY3RpbS8uZ2l0L3JlZnMvaGVhZHMvbWFzdGVyIC5naXQvcmVmcy9oZWFkcy9tYXN0ZXIKKwl0aGVuCisJCSMgc2hvdWxkIGhhdmUgYmVlbiBsZWZ0IGFzIGl0IHdhcyEKKwkJZmFsc2UKKwllbHNlCisJCXRydWUKKwlmaSAmJgorCSMgdGhpcyBzaG91bGQgdXBkYXRlCisJZ2l0LXNlbmQtcGFjayAtLWZvcmNlIC4vdmljdGltLy5naXQvIG1hc3RlciAmJgorCWNtcCB2aWN0aW0vLmdpdC9yZWZzL2hlYWRzL21hc3RlciAuZ2l0L3JlZnMvaGVhZHMvbWFzdGVyCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NTUwMC1mZXRjaC1wYWNrLnNoIGIvdC90NTUwMC1mZXRjaC1wYWNrLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3NjI1YTYKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NTAwLWZldGNoLXBhY2suc2gKQEAgLTAsMCArMSwxMzEgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0aW5nIG11bHRpX2FjayBwYWNrIGZldGNoaW5nCisKKycKKy4gLi90ZXN0LWxpYi5zaAorCisjIFRlc3QgZmV0Y2gtcGFjay91cGxvYWQtcGFjayBwYWlyLgorCisjIFNvbWUgY29udmVuaWVuY2UgZnVuY3Rpb25zCisKK2FkZCAoKSB7CisJbmFtZT0kMQorCXRleHQ9IiRAIgorCWJyYW5jaD1gZWNobyAkbmFtZSB8IHNlZCAtZSAncy9eXCguXCkuKiQvXDEvJ2AKKwlwYXJlbnRzPSIiCisKKwlzaGlmdAorCXdoaWxlIHRlc3QgJDE7IGRvCisJCXBhcmVudHM9IiRwYXJlbnRzIC1wICQxIgorCQlzaGlmdAorCWRvbmUKKworCWVjaG8gIiR0ZXh0IiA+IHRlc3QudHh0CisJZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCB0ZXN0LnR4dAorCXRyZWU9JChnaXQtd3JpdGUtdHJlZSkKKwkjIG1ha2Ugc3VyZSB0aW1lc3RhbXBzIGFyZSBpbiBjb3JyZWN0IG9yZGVyCisJc2VjPSQoKCRzZWMrMSkpCisJY29tbWl0PSQoZWNobyAiJHRleHQiIHwgR0lUX0FVVEhPUl9EQVRFPSRzZWMgXAorCQlnaXQtY29tbWl0LXRyZWUgJHRyZWUgJHBhcmVudHMgMj4+bG9nMi50eHQpCisJZXhwb3J0ICRuYW1lPSRjb21taXQKKwllY2hvICRjb21taXQgPiAuZ2l0L3JlZnMvaGVhZHMvJGJyYW5jaAorCWV2YWwgJHticmFuY2h9VElQPSRjb21taXQKK30KKworY291bnRfb2JqZWN0cyAoKSB7CisJbHMgLmdpdC9vYmplY3RzLz8/LyogMj4+bG9nMi50eHQgfCB3YyAtbCB8IHRyIC1kICIgIgorfQorCit0ZXN0X2V4cGVjdF9vYmplY3RfY291bnQgKCkgeworCW1lc3NhZ2U9JDEKKwljb3VudD0kMgorCisJb3V0cHV0PSIkKGNvdW50X29iamVjdHMpIgorCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorCQkibmV3IG9iamVjdCBjb3VudCAkbWVzc2FnZSIgXAorCQkidGVzdCAkY291bnQgPSAkb3V0cHV0IgorfQorCitwdWxsX3RvX2NsaWVudCAoKSB7CisJbnVtYmVyPSQxCisJaGVhZHM9JDIKKwljb3VudD0kMworCW5vX3N0cmljdF9jb3VudF9jaGVjaz0kNAorCisJY2QgY2xpZW50CisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiJG51bWJlciBwdWxsIiBcCisJCSJnaXQtZmV0Y2gtcGFjayAtayAtdiAuLiAkaGVhZHMiCisJY2FzZSAiJGhlYWRzIiBpbiAqQSopIGVjaG8gJEFUSVAgPiAuZ2l0L3JlZnMvaGVhZHMvQTs7IGVzYWMKKwljYXNlICIkaGVhZHMiIGluICpCKikgZWNobyAkQlRJUCA+IC5naXQvcmVmcy9oZWFkcy9COzsgZXNhYworCWdpdC1zeW1ib2xpYy1yZWYgSEVBRCByZWZzL2hlYWRzL2BlY2hvICRoZWFkcyB8IHNlZCAtZSAncy9eXCguXCkuKiQvXDEvJ2AKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImZzY2siICdnaXQtZnNjay1vYmplY3RzIC0tZnVsbCA+IGZzY2sudHh0IDI+JjEnCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVjayBkb3dubG9hZGVkIHJlc3VsdHMnIFwKKwknbXYgLmdpdC9vYmplY3RzL3BhY2svcGFjay0qIC4gJiYKKwkgcD1gbHMgLTEgcGFjay0qLnBhY2tgICYmCisJIGdpdC11bnBhY2stb2JqZWN0cyA8JHAgJiYKKwkgZ2l0LWZzY2stb2JqZWN0cyAtLWZ1bGwnCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJuZXcgb2JqZWN0IGNvdW50IGFmdGVyICRudW1iZXIgcHVsbCIgXAorCSdpZHg9YGVjaG8gcGFjay0qLmlkeGAgJiYKKwkgcGFja19jb3VudD1gZ2l0LXNob3ctaW5kZXggPCRpZHggfCB3YyAtbGAgJiYKKwkgdGVzdCAkcGFja19jb3VudCA9ICRjb3VudCcKKwl0ZXN0IC16ICIkcGFja19jb3VudCIgJiYgcGFja19jb3VudD0wCisJaWYgWyAteiAiJG5vX3N0cmljdF9jb3VudF9jaGVjayIgXTsgdGhlbgorCQl0ZXN0X2V4cGVjdF9zdWNjZXNzICJtaW5pbWFsIGNvdW50IiAidGVzdCAkY291bnQgPSAkcGFja19jb3VudCIKKwllbHNlCisJCXRlc3QgJGNvdW50ICE9ICRwYWNrX2NvdW50ICYmIFwKKwkJCWVjaG8gIldBUk5JTkc6ICRwYWNrX2NvdW50IG9iamVjdHMgdHJhbnNtaXR0ZWQsIG9ubHkgJGNvdW50IG9mIHdoaWNoIHdlcmUgbmVlZGVkIgorCWZpCisJcm0gLWYgcGFjay0qCisJY2QgLi4KK30KKworIyBIZXJlIGJlZ2lucyB0aGUgYWN0dWFsIHRlc3RpbmcKKworIyBBMSAtIC4uLiAtIEEyMCAtIEEyMQorIyAgICBcCisjICAgICAgQjEgIC0gICBCMiAtIC4uIC0gQjcwCisKKyMgY2xpZW50IHB1bGxzIEEyMCwgQjEuIFRoZW4gdHJhY2tzIG9ubHkgQi4gVGhlbiBwdWxscyBBLgorCisoCisJbWtkaXIgY2xpZW50ICYmCisJY2QgY2xpZW50ICYmCisJZ2l0LWluaXQtZGIgMj4+IGxvZzIudHh0CispCisKK2FkZCBBMQorCitwcmV2PTE7IGN1cj0yOyB3aGlsZSBbICRjdXIgLWxlIDEwIF07IGRvCisJYWRkIEEkY3VyICQoZXZhbCBlY2hvIFwkQSRwcmV2KQorCXByZXY9JGN1cgorCWN1cj0kKCgkY3VyKzEpKQorZG9uZQorCithZGQgQjEgJEExCisKK2VjaG8gJEFUSVAgPiAuZ2l0L3JlZnMvaGVhZHMvQQorZWNobyAkQlRJUCA+IC5naXQvcmVmcy9oZWFkcy9CCitnaXQtc3ltYm9saWMtcmVmIEhFQUQgcmVmcy9oZWFkcy9CCisKK3B1bGxfdG9fY2xpZW50IDFzdCAiQiBBIiAkKCgxMSozKSkKKworYWRkIEExMSAkQTEwCisKK3ByZXY9MTsgY3VyPTI7IHdoaWxlIFsgJGN1ciAtbGUgNjUgXTsgZG8KKwlhZGQgQiRjdXIgJChldmFsIGVjaG8gXCRCJHByZXYpCisJcHJldj0kY3VyCisJY3VyPSQoKCRjdXIrMSkpCitkb25lCisKK3B1bGxfdG9fY2xpZW50IDJuZCAiQiIgJCgoNjQqMykpCisKK3B1bGxfdG9fY2xpZW50IDNyZCAiQSIgJCgoMSozKSkgIyBvbGQgZmFpbHMKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NjAwLWNsb25lLWZhaWwtY2xlYW51cC5zaCBiL3QvdDU2MDAtY2xvbmUtZmFpbC1jbGVhbnVwLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjNmEzNjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NjAwLWNsb25lLWZhaWwtY2xlYW51cC5zaApAQCAtMCwwICsxLDM2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IENhcmwgRC4gV29ydGggPGN3b3J0aEBjd29ydGgub3JnPgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSd0ZXN0IGdpdC1jbG9uZSB0byBjbGVhbnVwIGFmdGVyIGZhaWx1cmUKKworVGhpcyB0ZXN0IGNvdmVycyB0aGUgZmFjdCB0aGF0IGlmIGdpdC1jbG9uZSBmYWlscywgaXQgc2hvdWxkIHJlbW92ZQordGhlIGRpcmVjdG9yeSBpdCBjcmVhdGVkLCB0byBhdm9pZCB0aGUgdXNlciBoYXZpbmcgdG8gbWFudWFsbHkKK3JlbW92ZSB0aGUgZGlyZWN0b3J5IGJlZm9yZSBhdHRlbXB0aW5nIGEgY2xvbmUgYWdhaW4uJworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2Nsb25lIG9mIG5vbi1leGlzdGVudCBzb3VyY2Ugc2hvdWxkIGZhaWwnIFwKKyAgICAnZ2l0LWNsb25lIGZvbyBiYXInCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdmYWlsZWQgY2xvbmUgc2hvdWxkIG5vdCBsZWF2ZSBhIGRpcmVjdG9yeScgXAorICAgICdjZCBiYXInCisKKyMgTmVlZCBhIHJlcG8gdG8gY2xvbmUKK3Rlc3RfY3JlYXRlX3JlcG8gZm9vCisKKyMgY2xvbmUgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXJlIGlzIG5vIEhFQUQuIElzIHRoYXQgYSBidWc/CisoY2QgZm9vICYmIHRvdWNoIGZpbGUgJiYgZ2l0IGFkZCBmaWxlICYmIGdpdCBjb21taXQgLW0gJ2FkZCBmaWxlJyA+L2Rldi9udWxsIDI+JjEpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjbG9uZSBzaG91bGQgd29yayBub3cgdGhhdCBzb3VyY2UgZXhpc3RzJyBcCisgICAgJ2dpdC1jbG9uZSBmb28gYmFyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnc3VjY2Vzc2Z1bGwgY2xvbmUgbXVzdCBsZWF2ZSB0aGUgZGlyZWN0b3J5JyBcCisgICAgJ2NkIGJhcicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q1NzAwLWNsb25lLXJlZmVyZW5jZS5zaCBiL3QvdDU3MDAtY2xvbmUtcmVmZXJlbmNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkOWNhYWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NzAwLWNsb25lLXJlZmVyZW5jZS5zaApAQCAtMCwwICsxLDc4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IE1hcnRpbiBXYWl0eiA8dGFsaUBhZG1pbmdpbGRlLm9yZz4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCBjbG9uZSAtLXJlZmVyZW5jZScKKy4gLi90ZXN0LWxpYi5zaAorCitiYXNlX2Rpcj1gcHdkYAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwcmVwYXJpbmcgZmlyc3QgcmVwb3NpdG9yeScgXAorJ3Rlc3RfY3JlYXRlX3JlcG8gQSAmJiBjZCBBICYmCitlY2hvIGZpcnN0ID4gZmlsZTEgJiYKK2dpdCBhZGQgZmlsZTEgJiYKK2dpdCBjb21taXQgLW0gaW5pdGlhbCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIHNlY29uZCByZXBvc2l0b3J5JyBcCisnZ2l0IGNsb25lIEEgQiAmJiBjZCBCICYmCitlY2hvIHNlY29uZCA+IGZpbGUyICYmCitnaXQgYWRkIGZpbGUyICYmCitnaXQgY29tbWl0IC1tIGFkZGl0aW9uICYmCitnaXQgcmVwYWNrIC1hIC1kICYmCitnaXQgcHJ1bmUnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2Nsb25pbmcgd2l0aCByZWZlcmVuY2UnIFwKKydnaXQgY2xvbmUgLWwgLXMgLS1yZWZlcmVuY2UgQiBBIEMnCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2V4aXN0ZW5jZSBvZiBpbmZvL2FsdGVybmF0ZXMnIFwKKyd0ZXN0IGB3YyAtbCA8Qy8uZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzYCA9IDInCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1bGxpbmcgZnJvbSByZWZlcmVuY2UnIFwKKydjZCBDICYmCitnaXQgcHVsbCAuLi9CJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aGF0IHJlZmVyZW5jZSBnZXRzIHVzZWQnIFwKKydjZCBDICYmCitlY2hvICIwIG9iamVjdHMsIDAga2lsb2J5dGVzIiA+IGV4cGVjdGVkICYmCitnaXQgY291bnQtb2JqZWN0cyA+IGN1cnJlbnQgJiYKK2RpZmYgZXhwZWN0ZWQgY3VycmVudCcKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndXBkYXRpbmcgb3JpZ2luJyBcCisnY2QgQSAmJgorZWNobyB0aGlyZCA+IGZpbGUzICYmCitnaXQgYWRkIGZpbGUzICYmCitnaXQgY29tbWl0IC1tIHVwZGF0ZSAmJgorZ2l0IHJlcGFjayAtYSAtZCAmJgorZ2l0IHBydW5lJworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsaW5nIGNoYW5nZXMgZnJvbSBvcmlnaW4nIFwKKydjZCBDICYmCitnaXQgcHVsbCBvcmlnaW4nCisKK2NkICIkYmFzZV9kaXIiCisKKyMgdGhlIDIgbG9jYWwgb2JqZWN0cyBhcmUgY29tbWl0IGFuZCB0cmVlIGZyb20gdGhlIG1lcmdlCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0aGF0IGFsdGVybmF0ZSB0byBvcmlnaW4gZ2V0cyB1c2VkJyBcCisnY2QgQyAmJgorZWNobyAiMiBvYmplY3RzIiA+IGV4cGVjdGVkICYmCitnaXQgY291bnQtb2JqZWN0cyB8IGN1dCAtZCwgLWYxID4gY3VycmVudCAmJgorZGlmZiBleHBlY3RlZCBjdXJyZW50JworCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDU3MTAtaW5mby1hbHRlcm5hdGUuc2ggYi90L3Q1NzEwLWluZm8tYWx0ZXJuYXRlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJlMWI0OGEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q1NzEwLWluZm8tYWx0ZXJuYXRlLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IE1hcnRpbiBXYWl0eiA8dGFsaUBhZG1pbmdpbGRlLm9yZz4KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0ndGVzdCB0cmFuc2l0aXZlIGluZm8vYWx0ZXJuYXRlIGVudHJpZXMnCisuIC4vdGVzdC1saWIuc2gKKworIyB0ZXN0IHRoYXQgYSBmaWxlIGlzIG5vdCByZWFjaGFibGUgaW4gdGhlIGN1cnJlbnQgcmVwb3NpdG9yeQorIyBidXQgdGhhdCBpdCBpcyBhZnRlciBjcmVhdGluZyBhIGluZm8vYWx0ZXJuYXRlIGVudHJ5CityZWFjaGFibGVfdmlhKCkgeworCWFsdGVybmF0ZT0iJDEiCisJZmlsZT0iJDIiCisJaWYgZ2l0IGNhdC1maWxlIC1lICJIRUFEOiRmaWxlIjsgdGhlbiByZXR1cm4gMTsgZmkKKwllY2hvICIkYWx0ZXJuYXRlIiA+PiAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGUKKwlnaXQgY2F0LWZpbGUgLWUgIkhFQUQ6JGZpbGUiCit9CisKK3Rlc3RfdmFsaWRfcmVwbygpIHsKKwlnaXQgZnNjay1vYmplY3RzIC0tZnVsbCA+IGZzY2subG9nICYmCisJdGVzdCBgd2MgLWwgPCBmc2NrLmxvZ2AgPSAwCit9CisKK2Jhc2VfZGlyPWBwd2RgCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmluZyBmaXJzdCByZXBvc2l0b3J5JyBcCisndGVzdF9jcmVhdGVfcmVwbyBBICYmIGNkIEEgJiYKK2VjaG8gIkhlbGxvIFdvcmxkIiA+IGZpbGUxICYmCitnaXQgYWRkIGZpbGUxICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgZmlsZTEgJiYKK2dpdCByZXBhY2sgLWEgLWQgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIHNlY29uZCByZXBvc2l0b3J5JyBcCisnZ2l0IGNsb25lIC1sIC1zIEEgQiAmJiBjZCBCICYmCitlY2hvICJmb28gYmFyIiA+IGZpbGUyICYmCitnaXQgYWRkIGZpbGUyICYmCitnaXQgY29tbWl0IC1tICJuZXh0IGNvbW1pdCIgZmlsZTIgJiYKK2dpdCByZXBhY2sgLWEgLWQgLWwgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAncHJlcGFyaW5nIHRoaXJkIHJlcG9zaXRvcnknIFwKKydnaXQgY2xvbmUgLWwgLXMgQiBDICYmIGNkIEMgJiYKK2VjaG8gIkdvb2RieWUsIGNydWVsIHdvcmxkIiA+IGZpbGUzICYmCitnaXQgYWRkIGZpbGUzICYmCitnaXQgY29tbWl0IC1tICJvbmUgbW9yZSIgZmlsZTMgJiYKK2dpdCByZXBhY2sgLWEgLWQgLWwgJiYKK2dpdCBwcnVuZScKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3RfZmFpbHVyZSAnY3JlYXRpbmcgdG9vIGRlZXAgbmVzdGluZycgXAorJ2dpdCBjbG9uZSAtbCAtcyBDIEQgJiYKK2dpdCBjbG9uZSAtbCAtcyBEIEUgJiYKK2dpdCBjbG9uZSAtbCAtcyBFIEYgJiYKK2dpdCBjbG9uZSAtbCAtcyBGIEcgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmFsaWRpdHkgb2YgdGhpcmQgcmVwb3NpdG9yeScgXAorJ2NkIEMgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndmFsaWRpdHkgb2YgZm91cnRoIHJlcG9zaXRvcnknIFwKKydjZCBEICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2JyZWFraW5nIG9mIGxvb3BzJyBcCisiZWNobyAnJGJhc2VfZGlyL0IvLmdpdC9vYmplY3RzJyA+PiAnJGJhc2VfZGlyJy9BLy5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMmJgorY2QgQyAmJgordGVzdF92YWxpZF9yZXBvIgorCitjZCAiJGJhc2VfZGlyIgorCit0ZXN0X2V4cGVjdF9mYWlsdXJlICd0aGF0IGluZm8vYWx0ZXJuYXRlcyBpcyBuZWNlc3NhcnknIFwKKydjZCBDICYmCitybSAuZ2l0L29iamVjdHMvaW5mby9hbHRlcm5hdGVzICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3RoYXQgcmVsYXRpdmUgYWx0ZXJuYXRlIGlzIHBvc3NpYmxlIGZvciBjdXJyZW50IGRpcicgXAorJ2NkIEMgJiYKK2VjaG8gIi4uLy4uLy4uL0IvLmdpdC9vYmplY3RzIiA+IC5naXQvb2JqZWN0cy9pbmZvL2FsdGVybmF0ZXMgJiYKK3Rlc3RfdmFsaWRfcmVwbycKKworY2QgIiRiYXNlX2RpciIKKwordGVzdF9leHBlY3RfZmFpbHVyZSAndGhhdCByZWxhdGl2ZSBhbHRlcm5hdGUgaXMgb25seSBwb3NzaWJsZSBmb3IgY3VycmVudCBkaXInIFwKKydjZCBEICYmCit0ZXN0X3ZhbGlkX3JlcG8nCisKK2NkICIkYmFzZV9kaXIiCisKK3Rlc3RfZG9uZQorCmRpZmYgLS1naXQgYS90L3Q2MDAwbGliLnNoIGIvdC90NjAwMGxpYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDAyNjIxCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAwMGxpYi5zaApAQCAtMCwwICsxLDExNiBAQAorWyAtZCAuZ2l0L3JlZnMvdGFncyBdIHx8IG1rZGlyIC1wIC5naXQvcmVmcy90YWdzCisKKzo+IHNlZC5zY3JpcHQKKworIyBBbnN3ZXIgdGhlIHNoYTEgaGFzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFnLiBUaGUgdGFnIG11c3QgZXhpc3QgaW4gLmdpdCBvciAuZ2l0L3JlZnMvdGFncwordGFnKCkKK3sKKwlfdGFnPSQxCisJWyAtZiAuZ2l0L3JlZnMvdGFncy8kX3RhZyBdIHx8IGVycm9yICJ0YWc6IFwiJF90YWdcIiBkb2VzIG5vdCBleGlzdCIKKwljYXQgLmdpdC9yZWZzL3RhZ3MvJF90YWcKK30KKworIyBHZW5lcmF0ZSBhIGNvbW1pdCB1c2luZyB0aGUgdGV4dCBzcGVjaWZpZWQgdG8gbWFrZSBpdCB1bmlxdWUgYW5kIHRoZSB0cmVlCisjIG5hbWVkIGJ5IHRoZSB0YWcgc3BlY2lmaWVkLgordW5pcXVlX2NvbW1pdCgpCit7CisJX3RleHQ9JDEKKyAgICAgICAgX3RyZWU9JDIKKwlzaGlmdCAyCisgICAgCWVjaG8gJF90ZXh0IHwgZ2l0LWNvbW1pdC10cmVlICQodGFnICRfdHJlZSkgIiRAIgorfQorCisjIFNhdmUgdGhlIG91dHB1dCBvZiBhIGNvbW1hbmQgaW50byB0aGUgdGFnIHNwZWNpZmllZC4gUHJlcGVuZAorIyBhIHN1YnN0aXR1dGlvbiBzY3JpcHQgZm9yIHRoZSB0YWcgb250byB0aGUgZnJvbnQgb2Ygc2VkLnNjcmlwdAorc2F2ZV90YWcoKQoreworCV90YWc9JDEJCisJWyAtbiAiJF90YWciIF0gfHwgZXJyb3IgInVzYWdlOiBzYXZlX3RhZyB0YWcgY29tbWl0LWFyZ3MgLi4uIgorCXNoaWZ0IDEKKyAgICAJIiRAIiA+LmdpdC9yZWZzL3RhZ3MvJF90YWcKKworICAgICAgICBlY2hvICJzLyQodGFnICRfdGFnKS8kX3RhZy9nIiA+IHNlZC5zY3JpcHQudG1wCisJY2F0IHNlZC5zY3JpcHQgPj4gc2VkLnNjcmlwdC50bXAKKwlybSBzZWQuc2NyaXB0CisJbXYgc2VkLnNjcmlwdC50bXAgc2VkLnNjcmlwdAorfQorCisjIFJlcGxhY2UgdW5oZWxwZnVsIHNoYTEgaGFzaHNlcyB3aXRoIHRoZWlyIHN5bWJvbGljIGVxdWl2YWxlbnRzIAorZW50YWcoKQoreworCXNlZCAtZiBzZWQuc2NyaXB0Cit9CisKKyMgRXhlY3V0ZSBhIGNvbW1hbmQgYWZ0ZXIgZmlyc3Qgc2F2aW5nLCB0aGVuIHNldHRpbmcgdGhlIEdJVF9BVVRIT1JfRU1BSUwKKyMgdGFnIHRvIGEgc3BlY2lmaWVkIHZhbHVlLiBSZXN0b3JlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvbiByZXR1cm4uCithc19hdXRob3IoKQoreworCV9hdXRob3I9JDEKKwlzaGlmdCAxCisgICAgICAgIF9zYXZlPSRHSVRfQVVUSE9SX0VNQUlMCisKKwlleHBvcnQgR0lUX0FVVEhPUl9FTUFJTD0iJF9hdXRob3IiCisJIiRAIgorCWlmIHRlc3QgLXogIiRfc2F2ZSIKKwl0aGVuCisJCXVuc2V0IEdJVF9BVVRIT1JfRU1BSUwKKwllbHNlCisJCWV4cG9ydCBHSVRfQVVUSE9SX0VNQUlMPSIkX3NhdmUiCisJZmkKK30KKworY29tbWl0X2RhdGUoKQoreworICAgICAgICBfY29tbWl0PSQxCisJZ2l0LWNhdC1maWxlIGNvbW1pdCAkX2NvbW1pdCB8IHNlZCAtbiAicy9eY29tbWl0dGVyIC4qPiBcKFswLTldKlwpIC4qL1wxL3AiIAorfQorCitvbl9jb21taXR0ZXJfZGF0ZSgpCit7CisgICAgX2RhdGU9JDEKKyAgICBzaGlmdCAxCisgICAgZXhwb3J0IEdJVF9DT01NSVRURVJfREFURT0iJF9kYXRlIgorICAgICIkQCIKKyAgICB1bnNldCBHSVRfQ09NTUlUVEVSX0RBVEUKK30KKworIyBFeGVjdXRlIGEgY29tbWFuZCBhbmQgc3VwcHJlc3MgYW55IGVycm9yIG91dHB1dC4KK2hpZGVfZXJyb3IoKQoreworCSIkQCIgMj4vZGV2L251bGwKK30KKworY2hlY2tfb3V0cHV0KCkKK3sKKwlfbmFtZT0kMQorCXNoaWZ0IDEKKwlpZiBldmFsICIkKiIgfCBlbnRhZyA+ICRfbmFtZS5hY3R1YWwKKwl0aGVuCisJCWRpZmYgJF9uYW1lLmV4cGVjdGVkICRfbmFtZS5hY3R1YWwKKwllbHNlCisJCXJldHVybiAxOworCWZpCit9CisKKyMgVHVybiBhIHJlYXNvbmFibGUgdGVzdCBkZXNjcmlwdGlvbiBpbnRvIGEgcmVhc29uYWJsZSB0ZXN0IG5hbWUuCisjIEFsbCBhbHBoYW51bXMgdHJhbnNsYXRlZCBpbnRvIC0ncyB3aGljaCBhcmUgdGhlbiBjb21wcmVzc2VkIGFuZCBzdHJpcHBlZAorIyBmcm9tIGZyb250IGFuZCBiYWNrLgorbmFtZV9mcm9tX2Rlc2NyaXB0aW9uKCkKK3sKKyAgICAgICAgdHIgIiciICctJyB8IHRyICd+YCFAIyQlXiYqKClfKz17fVtdfFw7OiI8PiwvPyAnICctJyB8IHRyIC1zICctJyB8IHRyICdbQS1aXScgJ1thLXpdJyB8IHNlZCAicy9eLSovLztzLy0qXCQvLyIKK30KKworCisjIEV4ZWN1dGUgdGhlIHRlc3QgZGVzY3JpYmVkIGJ5IHRoZSBmaXJzdCBhcmd1bWVudCwgYnkgZXZhbCdpbmcKKyMgY29tbWFuZCBsaW5lIHNwZWNpZmllZCBpbiB0aGUgMm5kIGFyZ3VtZW50LiBDaGVjayB0aGUgc3RhdHVzIGNvZGUKKyMgaXMgemVybyBhbmQgdGhhdCB0aGUgb3V0cHV0IG1hdGNoZXMgdGhlIHN0cmVhbSByZWFkIGZyb20gCisjIHN0ZGluLgordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MoKQorewkKKwlfZGVzY3JpcHRpb249JDEKKyAgICAgICAgX3Rlc3Q9JDIKKyAgICAgICAgWyAkIyAtZXEgMiBdIHx8IGVycm9yICJ1c2FnZTogdGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgZGVzY3JpcHRpb24gdGVzdCA8PEVPRiAuLi4gRU9GIgorICAgICAgICBfbmFtZT0kKGVjaG8gJF9kZXNjcmlwdGlvbiB8IG5hbWVfZnJvbV9kZXNjcmlwdGlvbikKKwljYXQgPiAkX25hbWUuZXhwZWN0ZWQKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkX2Rlc2NyaXB0aW9uIiAiY2hlY2tfb3V0cHV0ICRfbmFtZSBcIiRfdGVzdFwiIiAKK30KZGlmZiAtLWdpdCBhL3QvdDYwMDItcmV2LWxpc3QtYmlzZWN0LnNoIGIvdC90NjAwMi1yZXYtbGlzdC1iaXNlY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzgzMWUzNAotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMDItcmV2LWxpc3QtYmlzZWN0LnNoCkBAIC0wLDAgKzEsMjM4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEpvbiBTZXltb3VyCisjCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0cyBnaXQtcmV2LWxpc3QgLS1iaXNlY3QgZnVuY3Rpb25hbGl0eScKKworLiAuL3Rlc3QtbGliLnNoCisuIC4uL3Q2MDAwbGliLnNoICMgdDZ4eHggc3BlY2lmaWMgZnVuY3Rpb25zCisKKyMgdXNhZ2U6IHRlc3RfYmlzZWN0aW9uIG1heC1kaWZmIGJpc2VjdC1vcHRpb24gaGVhZCBecHJ1bmUuLi4KKyMKKyMgZS5nLiB0ZXN0X2Jpc2VjdGlvbiAxIC0tYmlzZWN0IGwxIF5sMAorIwordGVzdF9iaXNlY3Rpb25fZGlmZigpCit7CisJX21heF9kaWZmPSQxCisJX2Jpc2VjdF9vcHRpb249JDIKKwlzaGlmdCAyCisJX2Jpc2VjdGlvbj0kKGdpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gIiRAIikKKwlfbGlzdF9zaXplPSQoZ2l0LXJldi1saXN0ICIkQCIgfCB3YyAtbCkKKyAgICAgICAgX2hlYWQ9JDEKKwlzaGlmdCAxCisJX2Jpc2VjdGlvbl9zaXplPSQoZ2l0LXJldi1saXN0ICRfYmlzZWN0aW9uICIkQCIgfCB3YyAtbCkKKwlbIC1uICIkX2xpc3Rfc2l6ZSIgLWEgLW4gIiRfYmlzZWN0aW9uX3NpemUiIF0gfHwKKwllcnJvciAidGVzdF9iaXNlY3Rpb25fZGlmZiBmYWlsZWQiCisKKwkjIFRlc3QgaWYgYmlzZWN0aW9uIHNpemUgaXMgY2xvc2UgdG8gaGFsZiBvZiBsaXN0IHNpemUgd2l0aGluCisJIyB0b2xlcmFuY2UuCisJIyAKKwlfYmlzZWN0X2Vycj1gZXhwciAkX2xpc3Rfc2l6ZSAtICRfYmlzZWN0aW9uX3NpemUgXCogMmAKKwl0ZXN0ICIkX2Jpc2VjdF9lcnIiIC1sdCAwICYmIF9iaXNlY3RfZXJyPWBleHByIDAgLSAkX2Jpc2VjdF9lcnJgCisJX2Jpc2VjdF9lcnI9YGV4cHIgJF9iaXNlY3RfZXJyIC8gMmAgOyAjIGZsb29yCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKwkiYmlzZWN0aW9uIGRpZmYgJF9iaXNlY3Rfb3B0aW9uICRfaGVhZCAkKiA8PSAkX21heF9kaWZmIiBcCisJJ3Rlc3QgJF9iaXNlY3RfZXJyIC1sZSAkX21heF9kaWZmJworfQorCitkYXRlID5wYXRoMAorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMAorc2F2ZV90YWcgdHJlZSBnaXQtd3JpdGUtdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgcm9vdCB1bmlxdWVfY29tbWl0IHJvb3QgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIGwwIHVuaXF1ZV9jb21taXQgbDAgdHJlZSAtcCByb290Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgbDEgdW5pcXVlX2NvbW1pdCBsMSB0cmVlIC1wIGwwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgbDIgdW5pcXVlX2NvbW1pdCBsMiB0cmVlIC1wIGwxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgYTAgdW5pcXVlX2NvbW1pdCBhMCB0cmVlIC1wIGwyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgYTEgdW5pcXVlX2NvbW1pdCBhMSB0cmVlIC1wIGEwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNiIgc2F2ZV90YWcgYjEgdW5pcXVlX2NvbW1pdCBiMSB0cmVlIC1wIGEwCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNyIgc2F2ZV90YWcgYzEgdW5pcXVlX2NvbW1pdCBjMSB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOCIgc2F2ZV90YWcgYjIgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOSIgc2F2ZV90YWcgYjMgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMCIgc2F2ZV90YWcgYzIgdW5pcXVlX2NvbW1pdCBjMiB0cmVlIC1wIGMxIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMSIgc2F2ZV90YWcgYzMgdW5pcXVlX2NvbW1pdCBjMyB0cmVlIC1wIGMyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMiIgc2F2ZV90YWcgYTIgdW5pcXVlX2NvbW1pdCBhMiB0cmVlIC1wIGExCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMyIgc2F2ZV90YWcgYTMgdW5pcXVlX2NvbW1pdCBhMyB0cmVlIC1wIGEyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNCIgc2F2ZV90YWcgYjQgdW5pcXVlX2NvbW1pdCBiNCB0cmVlIC1wIGIzIC1wIGEzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNSIgc2F2ZV90YWcgYTQgdW5pcXVlX2NvbW1pdCBhNCB0cmVlIC1wIGEzIC1wIGI0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNiIgc2F2ZV90YWcgbDMgdW5pcXVlX2NvbW1pdCBsMyB0cmVlIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNyIgc2F2ZV90YWcgbDQgdW5pcXVlX2NvbW1pdCBsNCB0cmVlIC1wIGwzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOCIgc2F2ZV90YWcgbDUgdW5pcXVlX2NvbW1pdCBsNSB0cmVlIC1wIGw0CitnaXQtdXBkYXRlLXJlZiBIRUFEICQodGFnIGw1KQorCisKKyMgICAgIEUKKyMgICAgLyBcCisjICAgZTEgIHwKKyMgICB8ICAgfAorIyAgIGUyICB8CisjICAgfCAgIHwKKyMgICBlMyAgfAorIyAgIHwgICB8CisjICAgZTQgIHwKKyMgICB8ICAgfAorIyAgIHwgICBmMQorIyAgIHwgICB8CisjICAgfCAgIGYyCisjICAgfCAgIHwKKyMgICB8ICAgZjMKKyMgICB8ICAgfAorIyAgIHwgICBmNAorIyAgIHwgICB8CisjICAgZTUgIHwKKyMgICB8ICAgfAorIyAgIGU2ICB8CisjICAgfCAgIHwKKyMgICBlNyAgfAorIyAgIHwgICB8CisjICAgZTggIHwKKyMgICAgXCAvCisjICAgICBGCisKKworb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDAiIGhpZGVfZXJyb3Igc2F2ZV90YWcgRiB1bmlxdWVfY29tbWl0IEYgdHJlZQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIGU4IHVuaXF1ZV9jb21taXQgZTggdHJlZSAtcCBGCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMiIgc2F2ZV90YWcgZTcgdW5pcXVlX2NvbW1pdCBlNyB0cmVlIC1wIGU4Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowMyIgc2F2ZV90YWcgZTYgdW5pcXVlX2NvbW1pdCBlNiB0cmVlIC1wIGU3Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNCIgc2F2ZV90YWcgZTUgdW5pcXVlX2NvbW1pdCBlNSB0cmVlIC1wIGU2Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowNSIgc2F2ZV90YWcgZjQgdW5pcXVlX2NvbW1pdCBmNCB0cmVlIC1wIEYKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA2IiBzYXZlX3RhZyBmMyB1bmlxdWVfY29tbWl0IGYzIHRyZWUgLXAgZjQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA3IiBzYXZlX3RhZyBmMiB1bmlxdWVfY29tbWl0IGYyIHRyZWUgLXAgZjMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA4IiBzYXZlX3RhZyBmMSB1bmlxdWVfY29tbWl0IGYxIHRyZWUgLXAgZjIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjA5IiBzYXZlX3RhZyBlNCB1bmlxdWVfY29tbWl0IGU0IHRyZWUgLXAgZTUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEwIiBzYXZlX3RhZyBlMyB1bmlxdWVfY29tbWl0IGUzIHRyZWUgLXAgZTQKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjExIiBzYXZlX3RhZyBlMiB1bmlxdWVfY29tbWl0IGUyIHRyZWUgLXAgZTMKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEyIiBzYXZlX3RhZyBlMSB1bmlxdWVfY29tbWl0IGUxIHRyZWUgLXAgZTIKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjEzIiBzYXZlX3RhZyBFIHVuaXF1ZV9jb21taXQgRSB0cmVlIC1wIGUxIC1wIGYxCisKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAwIiBoaWRlX2Vycm9yIHNhdmVfdGFnIFUgdW5pcXVlX2NvbW1pdCBVIHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAxIiBzYXZlX3RhZyB1MCB1bmlxdWVfY29tbWl0IHUwIHRyZWUgLXAgVQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDEiIHNhdmVfdGFnIHUxIHVuaXF1ZV9jb21taXQgdTEgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDIiIHNhdmVfdGFnIHUyIHVuaXF1ZV9jb21taXQgdTIgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDMiIHNhdmVfdGFnIHUzIHVuaXF1ZV9jb21taXQgdTMgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDQiIHNhdmVfdGFnIHU0IHVuaXF1ZV9jb21taXQgdTQgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDUiIHNhdmVfdGFnIHU1IHVuaXF1ZV9jb21taXQgdTUgdHJlZSAtcCB1MAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIFYgdW5pcXVlX2NvbW1pdCBWIHRyZWUgLXAgdTEgLXAgdTIgLXAgdTMgLXAgdTQgLXAgdTUKKwordGVzdF9zZXF1ZW5jZSgpCit7CisJX2Jpc2VjdF9vcHRpb249JDEJCisJCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBsMCBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gbDEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGwyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMCBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYTEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGEyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBhMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYjEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGIyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBiMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gYzEgXnJvb3QKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGMyIF5yb290CisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBjMyBecm9vdAorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gRSBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTEgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGUyIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlMyBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTQgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGU1IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBlNiBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZTcgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGYxIF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBmMiBeRgorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gZjMgXkYKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIGY0IF5GCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiBFIF5GCisKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDEgJF9iaXNlY3Rfb3B0aW9uIFYgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIFYgXlUgXnUxIF51MiBedTMKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHUxIF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1MiBeVQorCXRlc3RfYmlzZWN0aW9uX2RpZmYgMCAkX2Jpc2VjdF9vcHRpb24gdTMgXlUKKwl0ZXN0X2Jpc2VjdGlvbl9kaWZmIDAgJF9iaXNlY3Rfb3B0aW9uIHU0IF5VCisJdGVzdF9iaXNlY3Rpb25fZGlmZiAwICRfYmlzZWN0X29wdGlvbiB1NSBeVQorCQorIworIyB0aGUgZm9sbG93aW5nIGlsbHVzdHJhdGVzIExpbnVzJyBiaW5hcnkgYnVnIGJsYXR0IGlkZWEuCisjCisjIGFzc3VtZSB0aGUgYnVnIGlzIGFjdHVhbGx5IGF0IGwzLCBidXQgeW91IGRvbid0IGtub3cgdGhhdCAtIGFsbCB5b3Uga25vdyBpcyB0aGF0IGwzIGlzIGJyb2tlbgorIyBhbmQgaXQgd2Fzbid0IGJyb2tlbiBiZWZvcmUKKyMKKyMga2VlcCBiaXNlY3RpbmcgdGhlIGxpc3QsIGFkdmFuY2luZyB0aGUgImJhZCIgaGVhZCBhbmQgYWNjdW11bGF0aW5nICJnb29kIiBoZWFkcyB1bnRpbAorIyB0aGUgYmlzZWN0aW9uIHBvaW50IGlzIHRoZSBoZWFkIC0gdGhpcyBpcyB0aGUgYmFkIHBvaW50LgorIworCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiLS1iaXNlY3QgbDUgXnJvb3QiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290JyA8PEVPRgorYzMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290IF5jMyIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDUgXnJvb3QgXmMzJyA8PEVPRgorYjQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw1IF5yb290IF5jMyBeYjQiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGw1IF5jMyBeYjQnIDw8RU9GCitsMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gbDMgXnJvb3QgXmMzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXnJvb3QgXmMzIF5iNCcgPDxFT0YKK2E0CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsNSBeYjMgXmEzIF5iNCBeYTQiICdnaXQtcmV2LWxpc3QgJF9iaXNlY3Rfb3B0aW9uIGwzIF5iMyBeYTMgXmE0JyA8PEVPRgorbDMKK0VPRgorCisjCisjIGlmIGwzIGlzIGJhZCwgdGhlbiBsNCBpcyBiYWQgdG9vIC0gc28gYWR2YW5jZSB0aGUgYmFkIHBvaW50ZXIgYnkgbWFraW5nIGI0IHRoZSBrbm93biBiYWQgaGVhZAorIworCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiJF9iaXNlY3Rfb3B0aW9uIGw0IF5hMiBeYTMgXmIgXmE0IiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBsNCBeYTIgXmEzIF5hNCcgPDxFT0YKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBsMyBeYTIgXmEzIF5iIF5hNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gbDMgXmEyIF5hMyBeYTQnIDw8RU9GCitsMworRU9GCisKKyMgZm91bmQhCisKKyMKKyMgYXMgYW5vdGhlciBleGFtcGxlLCBsZXQncyBjb25zaWRlciBhNCB0byBiZSB0aGUgYmFkIGhlYWQsIGluIHdoaWNoIGNhc2UKKyMKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQnIDw8RU9GCitjMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCBeYzInIDw8RU9GCitjMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIF5jMyIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQgXmMyIF5jMycgPDxFT0YKK2E0CitFT0YKKworIyBmb3VuZCEKKworIworIyBvciBjb25zaWRlciBjMyB0byBiZSB0aGUgYmFkIGhlYWQKKyMKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIiRfYmlzZWN0X29wdGlvbiBhNCBeYTIgXmEzIF5iNCIgJ2dpdC1yZXYtbGlzdCAkX2Jpc2VjdF9vcHRpb24gYTQgXmEyIF5hMyBeYjQnIDw8RU9GCitjMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICIkX2Jpc2VjdF9vcHRpb24gYzMgXmEyIF5hMyBeYjQgXmMyIiAnZ2l0LXJldi1saXN0ICRfYmlzZWN0X29wdGlvbiBjMyBeYTIgXmEzIF5iNCBeYzInIDw8RU9GCitjMworRU9GCisKKyMgZm91bmQhCisKK30KKwordGVzdF9zZXF1ZW5jZSAiLS1iaXNlY3QiCisKKyMKKyMKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAwMy1yZXYtbGlzdC10b3BvLW9yZGVyLnNoIGIvdC90NjAwMy1yZXYtbGlzdC10b3BvLW9yZGVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ5OWE5YWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDAzLXJldi1saXN0LXRvcG8tb3JkZXIuc2gKQEAgLTAsMCArMSw0MDggQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9uIFNleW1vdXIKKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nVGVzdHMgZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciBmdW5jdGlvbmFsaXR5JworCisuIC4vdGVzdC1saWIuc2gKKy4gLi4vdDYwMDBsaWIuc2ggIyB0Nnh4eCBzcGVjaWZpYyBmdW5jdGlvbnMKKworbGlzdF9kdXBsaWNhdGVzKCkKK3sKKyAgICAiJEAiIHwgc29ydCB8IHVuaXEgLWQKK30KKworZGF0ZSA+cGF0aDAKK2dpdC11cGRhdGUtaW5kZXggLS1hZGQgcGF0aDAKK3NhdmVfdGFnIHRyZWUgZ2l0LXdyaXRlLXRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAwIiBoaWRlX2Vycm9yIHNhdmVfdGFnIHJvb3QgdW5pcXVlX2NvbW1pdCByb290IHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjAxIiBzYXZlX3RhZyBsMCB1bmlxdWVfY29tbWl0IGwwIHRyZWUgLXAgcm9vdAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDIiIHNhdmVfdGFnIGwxIHVuaXF1ZV9jb21taXQgbDEgdHJlZSAtcCBsMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDMiIHNhdmVfdGFnIGwyIHVuaXF1ZV9jb21taXQgbDIgdHJlZSAtcCBsMQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDQiIHNhdmVfdGFnIGEwIHVuaXF1ZV9jb21taXQgYTAgdHJlZSAtcCBsMgorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDUiIHNhdmVfdGFnIGExIHVuaXF1ZV9jb21taXQgYTEgdHJlZSAtcCBhMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDYiIHNhdmVfdGFnIGIxIHVuaXF1ZV9jb21taXQgYjEgdHJlZSAtcCBhMAorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDciIHNhdmVfdGFnIGMxIHVuaXF1ZV9jb21taXQgYzEgdHJlZSAtcCBiMQorb25fY29tbWl0dGVyX2RhdGUgIjE5NzEtMDgtMTYgMDA6MDA6MDgiIGFzX2F1dGhvciBmb29iYXJAZXhhbXBsZS5jb20gc2F2ZV90YWcgYjIgdW5pcXVlX2NvbW1pdCBiMiB0cmVlIC1wIGIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDowOSIgc2F2ZV90YWcgYjMgdW5pcXVlX2NvbW1pdCBiMyB0cmVlIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMCIgc2F2ZV90YWcgYzIgdW5pcXVlX2NvbW1pdCBjMiB0cmVlIC1wIGMxIC1wIGIyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMSIgc2F2ZV90YWcgYzMgdW5pcXVlX2NvbW1pdCBjMyB0cmVlIC1wIGMyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMiIgc2F2ZV90YWcgYTIgdW5pcXVlX2NvbW1pdCBhMiB0cmVlIC1wIGExCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxMyIgc2F2ZV90YWcgYTMgdW5pcXVlX2NvbW1pdCBhMyB0cmVlIC1wIGEyCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNCIgc2F2ZV90YWcgYjQgdW5pcXVlX2NvbW1pdCBiNCB0cmVlIC1wIGIzIC1wIGEzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNSIgc2F2ZV90YWcgYTQgdW5pcXVlX2NvbW1pdCBhNCB0cmVlIC1wIGEzIC1wIGI0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNiIgc2F2ZV90YWcgbDMgdW5pcXVlX2NvbW1pdCBsMyB0cmVlIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxNyIgc2F2ZV90YWcgbDQgdW5pcXVlX2NvbW1pdCBsNCB0cmVlIC1wIGwzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOCIgc2F2ZV90YWcgbDUgdW5pcXVlX2NvbW1pdCBsNSB0cmVlIC1wIGw0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoxOSIgc2F2ZV90YWcgbTEgdW5pcXVlX2NvbW1pdCBtMSB0cmVlIC1wIGE0IC1wIGMzCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMCIgc2F2ZV90YWcgbTIgdW5pcXVlX2NvbW1pdCBtMiB0cmVlIC1wIGMzIC1wIGE0Citvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMSIgaGlkZV9lcnJvciBzYXZlX3RhZyBhbHRfcm9vdCB1bmlxdWVfY29tbWl0IGFsdF9yb290IHRyZWUKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIyIiBzYXZlX3RhZyByMCB1bmlxdWVfY29tbWl0IHIwIHRyZWUgLXAgYWx0X3Jvb3QKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjIzIiBzYXZlX3RhZyByMSB1bmlxdWVfY29tbWl0IHIxIHRyZWUgLXAgcjAKK29uX2NvbW1pdHRlcl9kYXRlICIxOTcxLTA4LTE2IDAwOjAwOjI0IiBzYXZlX3RhZyBsNXIxIHVuaXF1ZV9jb21taXQgbDVyMSB0cmVlIC1wIGw1IC1wIHIxCitvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyNSIgc2F2ZV90YWcgcjFsNSB1bmlxdWVfY29tbWl0IHIxbDUgdHJlZSAtcCByMSAtcCBsNQorCisKKyMKKyMgbm90ZTogYXMgb2YgMjAvNiwgaXQgaXNuJ3QgcG9zc2libGUgdG8gY3JlYXRlIGR1cGxpY2F0ZSBwYXJlbnRzLCBzbyB0aGlzCisjIGNhbid0IGJlIHRlc3RlZC4KKyMKKyNvbl9jb21taXR0ZXJfZGF0ZSAiMTk3MS0wOC0xNiAwMDowMDoyMCIgc2F2ZV90YWcgbTMgdW5pcXVlX2NvbW1pdCBtMyB0cmVlIC1wIGMzIC1wIGE0IC1wIGMzCitoaWRlX2Vycm9yIHNhdmVfdGFnIGUxIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTEgdHJlZQorc2F2ZV90YWcgZTIgYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlMiB0cmVlIC1wIGUxCitzYXZlX3RhZyBmMSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGYxIHRyZWUgLXAgZTEKK3NhdmVfdGFnIGUzIGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTMgdHJlZSAtcCBlMgorc2F2ZV90YWcgZjIgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmMiB0cmVlIC1wIGYxCitzYXZlX3RhZyBlNCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU0IHRyZWUgLXAgZTMgLXAgZjIKK3NhdmVfdGFnIGU1IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTUgdHJlZSAtcCBlNAorc2F2ZV90YWcgZjMgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmMyB0cmVlIC1wIGYyCitzYXZlX3RhZyBmNCBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY0IHRyZWUgLXAgZjMKK3NhdmVfdGFnIGU2IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTYgdHJlZSAtcCBlNSAtcCBmNAorc2F2ZV90YWcgZjUgYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmNSB0cmVlIC1wIGY0CitzYXZlX3RhZyBmNiBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY2IHRyZWUgLXAgZjUgLXAgZTYKK3NhdmVfdGFnIGU3IGFzX2F1dGhvciBlQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZTcgdHJlZSAtcCBlNgorc2F2ZV90YWcgZTggYXNfYXV0aG9yIGVAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBlOCB0cmVlIC1wIGU3CitzYXZlX3RhZyBlOSBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGU5IHRyZWUgLXAgZTgKK3NhdmVfdGFnIGY3IGFzX2F1dGhvciBmQGV4YW1wbGUuY29tIHVuaXF1ZV9jb21taXQgZjcgdHJlZSAtcCBmNgorc2F2ZV90YWcgZjggYXNfYXV0aG9yIGZAZXhhbXBsZS5jb20gdW5pcXVlX2NvbW1pdCBmOCB0cmVlIC1wIGY3CitzYXZlX3RhZyBmOSBhc19hdXRob3IgZkBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGY5IHRyZWUgLXAgZjgKK3NhdmVfdGFnIGUxMCBhc19hdXRob3IgZUBleGFtcGxlLmNvbSB1bmlxdWVfY29tbWl0IGUxIHRyZWUgLXAgZTkgLXAgZjgKKworaGlkZV9lcnJvciBzYXZlX3RhZyBnMCB1bmlxdWVfY29tbWl0IGcwIHRyZWUKK3NhdmVfdGFnIGcxIHVuaXF1ZV9jb21taXQgZzEgdHJlZSAtcCBnMAorc2F2ZV90YWcgaDEgdW5pcXVlX2NvbW1pdCBnMiB0cmVlIC1wIGcwCitzYXZlX3RhZyBnMiB1bmlxdWVfY29tbWl0IGczIHRyZWUgLXAgZzEgLXAgaDEKK3NhdmVfdGFnIGgyIHVuaXF1ZV9jb21taXQgZzQgdHJlZSAtcCBnMgorc2F2ZV90YWcgZzMgdW5pcXVlX2NvbW1pdCBnNSB0cmVlIC1wIGcyCitzYXZlX3RhZyBnNCB1bmlxdWVfY29tbWl0IGc2IHRyZWUgLXAgZzMgLXAgaDIKKworZ2l0LXVwZGF0ZS1yZWYgSEVBRCAkKHRhZyBsNSkKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3Jldi1saXN0IGhhcyBjb3JyZWN0IG51bWJlciBvZiBlbnRyaWVzJyAnZ2l0LXJldi1saXN0IEhFQUQgfCB3YyAtbCB8IHRyIC1kIFwiIFwiJyA8PEVPRgorMTkKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnc2ltcGxlIHRvcG8gb3JkZXInICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBIRUFEJyA8PEVPRgorbDUKK2w0CitsMworYTQKK2MzCitjMgorYzEKK2I0CithMworYTIKK2ExCitiMworYjIKK2IxCithMAorbDIKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICd0d28gZGlhbW9uZHMgdG9wbyBvcmRlciAoZzYpJyAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgZzQnIDw8RU9GCitnNAoraDIKK2czCitnMgoraDEKK2cxCitnMAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcycgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTMgYjMgYzMnIDw8RU9GCithMworYTIKK2ExCitjMworYzIKK2MxCitiMworYjIKK2IxCithMAorbDIKK2wxCitsMAorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcywgcHJ1bmUgYXQgYTEnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGEzIGIzIGMzIF5hMScgPDxFT0YKK2EzCithMgorYzMKK2MyCitjMQorYjMKK2IyCitiMQorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdtdWx0aXBsZSBoZWFkcywgcHJ1bmUgYXQgbDEnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGEzIGIzIGMzIF5sMScgPDxFT0YKK2EzCithMgorYTEKK2MzCitjMgorYzEKK2IzCitiMgorYjEKK2EwCitsMgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdjcm9zcy1lcG9jaCwgaGVhZCBhdCBsNSwgcHJ1bmUgYXQgbDEnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGw1IF5sMScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ2R1cGxpY2F0ZWQgaGVhZCBhcmd1bWVudHMnICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGw1IGw1IF5sMScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCithMQorYjMKK2IyCitiMQorYTAKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3BydW5lIG5lYXIgdG9wbycgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgYTQgXmMzJyA8PEVPRgorYTQKK2I0CithMworYTIKK2ExCitiMworRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJoZWFkIGhhcyBubyBwYXJlbnQiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICByb290JyA8PEVPRgorcm9vdAorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICJ0d28gbm9kZXMgLSBvbmUgaGVhZCwgb25lIGJhc2UiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMCcgPDxFT0YKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgInRocmVlIG5vZGVzIG9uZSBoZWFkLCBvbmUgaW50ZXJuYWwsIG9uZSBiYXNlIiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDEnIDw8RU9GCitsMQorbDAKK3Jvb3QKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5yb290IiAnZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciAgbDIgXnJvb3QnIDw8RU9GCitsMgorbDEKK2wwCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsMiBebDAiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsMiBebDAnIDw8RU9GCitsMgorbDEKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGwyIF5sMSIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGwyIF5sMScgPDxFT0YKK2wyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsNSBeYTQiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsNSBeYTQnIDw8RU9GCitsNQorbDQKK2wzCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImxpbmVhciBwcnVuZSBsNSBebDMiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICBsNSBebDMnIDw8RU9GCitsNQorbDQKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAibGluZWFyIHBydW5lIGw1IF5sNCIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1IF5sNCcgPDxFT0YKK2w1CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIm1heC1jb3VudCAxMCAtIHRvcG8gb3JkZXIiICdnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyICAtLW1heC1jb3VudD0xMCBsNScgPDxFT0YKK2w1CitsNAorbDMKK2E0CitjMworYzIKK2MxCitiNAorYTMKK2EyCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgIm1heC1jb3VudCAxMCAtIG5vbiB0b3BvIG9yZGVyIiAnZ2l0LXJldi1saXN0IC0tbWF4LWNvdW50PTEwIGw1JyA8PEVPRgorbDUKK2w0CitsMworYTQKK2I0CithMworYTIKK2MzCitjMgorYjMKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtYWdlPWMzLCBubyAtLXRvcG8tb3JkZXInICJnaXQtcmV2LWxpc3QgLS1tYXgtYWdlPSQoY29tbWl0X2RhdGUgYzMpIGw1IiA8PEVPRgorbDUKK2w0CitsMworYTQKK2I0CithMworYTIKK2MzCitFT0YKKworIworIyB0aGlzIHRlc3QgZmFpbHMgb24gLS10b3BvLW9yZGVyIC0gYSBmaXggaXMgcmVxdWlyZWQKKyMKKyN0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnLS1tYXgtYWdlPWMzLCAtLXRvcG8tb3JkZXInICJnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIC0tbWF4LWFnZT0kKGNvbW1pdF9kYXRlIGMzKSBsNSIgPDxFT0YKKyNsNQorI2w0CisjbDMKKyNhNAorI2MzCisjYjQKKyNhMworI2EyCisjRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBhNCwgYzMsIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGE0IGMzIiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBjMywgYTQsIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQtcmV2LWxpc3QgLS10b3BvLW9yZGVyIGMzIGE0IiA8PEVPRgorRU9GCisKK3Rlc3Rfb3V0cHV0X2V4cGVjdF9zdWNjZXNzICdvbmUgc3BlY2lmaWVkIGhlYWQgcmVhY2hhYmxlIGZyb20gYW5vdGhlciBhNCwgYzMsIG5vIC0tdG9wby1vcmRlcicgImxpc3RfZHVwbGljYXRlcyBnaXQtcmV2LWxpc3QgYTQgYzMiIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ29uZSBzcGVjaWZpZWQgaGVhZCByZWFjaGFibGUgZnJvbSBhbm90aGVyIGMzLCBhNCwgbm8gLS10b3BvLW9yZGVyJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBjMyBhNCIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZ3JhcGggd2l0aCBjMyBhbmQgYTQgcGFyZW50cyBvZiBoZWFkJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBtMSIgPDxFT0YKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAnZ3JhcGggd2l0aCBhNCBhbmQgYzMgcGFyZW50cyBvZiBoZWFkJyAibGlzdF9kdXBsaWNhdGVzIGdpdC1yZXYtbGlzdCBtMiIgPDxFT0YKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJoZWFkIF5oZWFkIC0tdG9wby1vcmRlciIgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGEzIF5hMycgPDxFT0YKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJoZWFkIF5oZWFkIG5vIC0tdG9wby1vcmRlciIgJ2dpdC1yZXYtbGlzdCBhMyBeYTMnIDw8RU9GCitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3NpbXBsZSB0b3BvIG9yZGVyIChsNXIxKScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIGw1cjEnIDw8RU9GCitsNXIxCityMQorcjAKK2FsdF9yb290CitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgJ3NpbXBsZSB0b3BvIG9yZGVyIChyMWw1KScgJ2dpdC1yZXYtbGlzdCAtLXRvcG8tb3JkZXIgIHIxbDUnIDw8RU9GCityMWw1CitsNQorbDQKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CityMQorcjAKK2FsdF9yb290CitFT0YKKwordGVzdF9vdXRwdXRfZXhwZWN0X3N1Y2Nlc3MgImRvbid0IHByaW50IHRoaW5ncyB1bnJlYWNoYWJsZSBmcm9tIG9uZSBicmFuY2giICJnaXQtcmV2LWxpc3QgYTMgXmIzIC0tdG9wby1vcmRlciIgPDxFT0YKK2EzCithMgorYTEKK0VPRgorCit0ZXN0X291dHB1dF9leHBlY3Rfc3VjY2VzcyAiLS10b3BvLW9yZGVyIGE0IGwzIiAiZ2l0LXJldi1saXN0IC0tdG9wby1vcmRlciBhNCBsMyIgPDxFT0YKK2wzCithNAorYzMKK2MyCitjMQorYjQKK2EzCithMgorYTEKK2IzCitiMgorYjEKK2EwCitsMgorbDEKK2wwCityb290CitFT0YKKworIworIworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMDQtcmV2LWxpc3QtcGF0aC1vcHRpbS5zaCBiL3QvdDYwMDQtcmV2LWxpc3QtcGF0aC1vcHRpbS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTgyZGJiCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAwNC1yZXYtbGlzdC1wYXRoLW9wdGltLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtcmV2LWxpc3QgdHJpdmlhbCBwYXRoIG9wdGltaXphdGlvbiB0ZXN0JworCisuIC4vdGVzdC1saWIuc2gKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBzZXR1cCAnCitlY2hvIEhlbGxvID4gYSAmJgorZ2l0IGFkZCBhICYmCitnaXQgY29tbWl0IC1tICJJbml0aWFsIGNvbW1pdCIgYQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHBhdGgtb3B0aW1pemF0aW9uICcKKyAgICBjb21taXQ9JChlY2hvICJVbmNoYW5nZWQgdHJlZSIgfCBnaXQtY29tbWl0LXRyZWUgIkhFQURee3RyZWV9IiAtcCBIRUFEKSAmJgorICAgIHRlc3QgJChnaXQtcmV2LWxpc3QgJGNvbW1pdCB8IHdjIC1sKSA9IDIgJiYKKyAgICB0ZXN0ICQoZ2l0LXJldi1saXN0ICRjb21taXQgLS0gLiB8IHdjIC1sKSA9IDEKKycKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDEwLW1lcmdlLWJhc2Uuc2ggYi90L3Q2MDEwLW1lcmdlLWJhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE1OTIwYgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDYwMTAtbWVyZ2UtYmFzZS5zaApAQCAtMCwwICsxLDEwNCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdNZXJnZSBiYXNlIGNvbXB1dGF0aW9uLgorJworCisuIC4vdGVzdC1saWIuc2gKKworVD0kKGdpdC13cml0ZS10cmVlKQorCitNPTExMzAwMDAwMDAKK1o9KzAwMDAKKworZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUw9Z2l0QGNvbW0uaXRlci54egorZXhwb3J0IEdJVF9DT01NSVRURVJfTkFNRT0nQyBPIE1taXRlcicKK2V4cG9ydCBHSVRfQVVUSE9SX05BTUU9J0EgVSBUaG9yJworZXhwb3J0IEdJVF9BVVRIT1JfRU1BSUw9Z2l0QGF1LnRob3IueHoKKworZG9pdCgpIHsKKwlPRkZTRVQ9JDE7IHNoaWZ0CisJTkFNRT0kMTsgc2hpZnQKKwlQQVJFTlRTPQorCWZvciBQCisJZG8KKwkJUEFSRU5UUz0iJHtQQVJFTlRTfS1wICRQICIKKwlkb25lCisJR0lUX0NPTU1JVFRFUl9EQVRFPSIkKCgkTSArICRPRkZTRVQpKSAkWiIKKwlHSVRfQVVUSE9SX0RBVEU9JEdJVF9DT01NSVRURVJfREFURQorCWV4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUgR0lUX0FVVEhPUl9EQVRFCisJY29tbWl0PSQoZWNobyAkTkFNRSB8IGdpdC1jb21taXQtdHJlZSAkVCAkUEFSRU5UUykKKwllY2hvICRjb21taXQgPi5naXQvcmVmcy90YWdzLyROQU1FCisJZWNobyAkY29tbWl0Cit9CisKKyMgU2V0dXAuLi4KK0U9JChkb2l0IDUgRSkKK0Q9JChkb2l0IDQgRCAkRSkKK0Y9JChkb2l0IDYgRiAkRSkKK0M9JChkb2l0IDMgQyAkRCkKK0I9JChkb2l0IDIgQiAkQykKK0E9JChkb2l0IDEgQSAkQikKK0c9JChkb2l0IDcgRyAkQiAkRSkKK0g9JChkb2l0IDggSCAkQSAkRikKKworIyBTZXR1cCBmb3Igc2Vjb25kIHRlc3QgdG8gZGVtb25zdHJhdGUgdGhhdCByZWx5aW5nIG9uIHRpbWVzdGFtcHMgaW4gYQorIyBkaXN0cmlidXRlZCBTQ00gdG8gcHJvdmlkZSBhIF9jb25zaXN0ZW50XyBwYXJ0aWFsIG9yZGVyaW5nIG9mIGNvbW1pdHMKKyMgbGVhZHMgdG8gaW5zYW5pdHkuCisjCisjICAgICAgICAgICAgICAgUmVsYXRpdmUKKyMgU3RydWN0dXJlICAgICB0aW1lc3RhbXBzCisjCisjICAgUEwgIFBSICAgICAgICArNCAgKzQKKyMgIC8gIFwvICBcICAgICAgLyAgXC8gIFwKKyMgTDIgIEMyICBSMiAgICArMyAgLTEgICszCisjIHwgICB8ICAgfCAgICAgfCAgIHwgICB8CisjIEwxICBDMSAgUjEgICAgKzIgIC0yICArMgorIyB8ICAgfCAgIHwgICAgIHwgICB8ICAgfAorIyBMMCAgQzAgIFIwICAgICsxICAtMyAgKzEKKyMgICBcIHwgIC8gICAgICAgIFwgfCAgLworIyAgICAgUyAgICAgICAgICAgICAwCisjCisjIFRoZSBsZWZ0IGFuZCByaWdodCBjaGFpbnMgb2YgY29tbWl0cyBjYW4gYmUgb2YgYW55IGxlbmd0aCBhbmQgY29tcGxleGl0eSBhcworIyBsb25nIGFzIGFsbCBvZiB0aGUgdGltZXN0YW1wcyBhcmUgZ3JlYXRlciB0aGFuIHRoYXQgb2YgUy4KKworUz0kKGRvaXQgIDAgUykKKworQzA9JChkb2l0IC0zIEMwICRTKQorQzE9JChkb2l0IC0yIEMxICRDMCkKK0MyPSQoZG9pdCAtMSBDMiAkQzEpCisKK0wwPSQoZG9pdCAgMSBMMCAkUykKK0wxPSQoZG9pdCAgMiBMMSAkTDApCitMMj0kKGRvaXQgIDMgTDIgJEwxKQorCitSMD0kKGRvaXQgIDEgUjAgJFMpCitSMT0kKGRvaXQgIDIgUjEgJFIwKQorUjI9JChkb2l0ICAzIFIyICRSMSkKKworUEw9JChkb2l0ICA0IFBMICRMMiAkQzIpCitQUj0kKGRvaXQgIDQgUFIgJEMyICRSMikKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcHV0ZSBtZXJnZS1iYXNlIChzaW5nbGUpJyBcCisgICAgJ01CPSQoZ2l0LW1lcmdlLWJhc2UgRyBIKSAmJgorICAgICBleHByICIkKGdpdC1uYW1lLXJldiAiJE1CIikiIDogIlswLTlhLWZdKiB0YWdzL0IiJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjb21wdXRlIG1lcmdlLWJhc2UgKGFsbCknIFwKKyAgICAnTUI9JChnaXQtbWVyZ2UtYmFzZSAtLWFsbCBHIEgpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXB1dGUgbWVyZ2UtYmFzZSB3aXRoIHNob3ctYnJhbmNoJyBcCisgICAgJ01CPSQoZ2l0LXNob3ctYnJhbmNoIC0tbWVyZ2UtYmFzZSBHIEgpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQiInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2NvbXB1dGUgbWVyZ2UtYmFzZSAoc2luZ2xlKScgXAorICAgICdNQj0kKGdpdC1tZXJnZS1iYXNlIFBMIFBSKSAmJgorICAgICBleHByICIkKGdpdC1uYW1lLXJldiAiJE1CIikiIDogIlswLTlhLWZdKiB0YWdzL0MyIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnY29tcHV0ZSBtZXJnZS1iYXNlIChhbGwpJyBcCisgICAgJ01CPSQoZ2l0LW1lcmdlLWJhc2UgLS1hbGwgUEwgUFIpICYmCisgICAgIGV4cHIgIiQoZ2l0LW5hbWUtcmV2ICIkTUIiKSIgOiAiWzAtOWEtZl0qIHRhZ3MvQzIiJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYwMjAtbWVyZ2UtZGYuc2ggYi90L3Q2MDIwLW1lcmdlLWRmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmExOWQ0OWQKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MDIwLW1lcmdlLWRmLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgRnJlZHJpayBLdWl2aW5lbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IG1lcmdlIHdpdGggZGlyZWN0b3J5L2ZpbGUgY29uZmxpY3RzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmUgcmVwb3NpdG9yeScgXAorJ2VjaG8gIkhlbGxvIiA+IGluaXQgJiYKK2dpdCBhZGQgaW5pdCAmJgorZ2l0IGNvbW1pdCAtbSAiSW5pdGlhbCBjb21taXQiICYmCitnaXQgYnJhbmNoIEIgJiYKK21rZGlyIGRpciAmJgorZWNobyAiZm9vIiA+IGRpci9mb28gJiYKK2dpdCBhZGQgZGlyL2ZvbyAmJgorZ2l0IGNvbW1pdCAtbSAiRmlsZTogZGlyL2ZvbyIgJiYKK2dpdCBjaGVja291dCBCICYmCitlY2hvICJmaWxlIGRpciIgPiBkaXIgJiYKK2dpdCBhZGQgZGlyICYmCitnaXQgY29tbWl0IC1tICJGaWxlOiBkaXIiJworCit0ZXN0X2V4cGVjdF9jb2RlIDEgJ01lcmdlIHdpdGggZC9mIGNvbmZsaWN0cycgJ2dpdCBtZXJnZSAibWVyZ2UgbXNnIiBCIG1hc3RlcicKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q2MDIxLW1lcmdlLWNyaXNzLWNyb3NzLnNoIGIvdC90NjAyMS1tZXJnZS1jcmlzcy1jcm9zcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZjczNjZkCi0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyMS1tZXJnZS1jcmlzcy1jcm9zcy5zaApAQCAtMCwwICsxLDk4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA1IEZyZWRyaWsgS3VpdmluZW4KKyMKKworIyBTZWUgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTE0NjMzNTg1MDAzNjImdz0yIGZvciBhCisjIG5pY2UgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGlzIGlzIGFib3V0LgorCisKK3Rlc3RfZGVzY3JpcHRpb249J1Rlc3QgY3Jpc3MtY3Jvc3MgbWVyZ2UnCisuIC4vdGVzdC1saWIuc2gKKworaWYgdGVzdCAiJG5vX3B5dGhvbiI7IHRoZW4KKwllY2hvICJTa2lwcGluZzogbm8gcHl0aG9uID0+IG5vIHJlY3Vyc2l2ZSBtZXJnZSIKKwl0ZXN0X2RvbmUKKwlleGl0IDAKK2ZpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3ByZXBhcmUgcmVwb3NpdG9yeScgXAorJ2VjaG8gIjEKKzIKKzMKKzQKKzUKKzYKKzcKKzgKKzkiID4gZmlsZSAmJgorZ2l0IGFkZCBmaWxlICYmIAorZ2l0IGNvbW1pdCAtbSAiSW5pdGlhbCBjb21taXQiIGZpbGUgJiYKK2dpdCBicmFuY2ggQSAmJgorZ2l0IGJyYW5jaCBCICYmCitnaXQgY2hlY2tvdXQgQSAmJgorZWNobyAiMQorMgorMworNAorNQorNgorNworOCBjaGFuZ2VkIGluIEI4LCBicmFuY2ggQQorOSIgPiBmaWxlICYmCitnaXQgY29tbWl0IC1tICJCOCIgZmlsZSAmJgorZ2l0IGNoZWNrb3V0IEIgJiYKK2VjaG8gIjEKKzIKKzMgY2hhbmdlZCBpbiBDMywgYnJhbmNoIEIKKzQKKzUKKzYKKzcKKzgKKzkKKyIgPiBmaWxlICYmCitnaXQgY29tbWl0IC1tICJDMyIgZmlsZSAmJgorZ2l0IGJyYW5jaCBDMyAmJgorZ2l0IG1lcmdlICJwcmUgRTMgbWVyZ2UiIEIgQSAmJgorZWNobyAiMQorMgorMyBjaGFuZ2VkIGluIEUzLCBicmFuY2ggQi4gTmV3IGZpbGUgc2l6ZQorNAorNQorNgorNworOCBjaGFuZ2VkIGluIEI4LCBicmFuY2ggQQorOQorIiA+IGZpbGUgJiYKK2dpdCBjb21taXQgLW0gIkUzIiBmaWxlICYmCitnaXQgY2hlY2tvdXQgQSAmJgorZ2l0IG1lcmdlICJwcmUgRDggbWVyZ2UiIEEgQzMgJiYKK2VjaG8gIjEKKzIKKzMgY2hhbmdlZCBpbiBDMywgYnJhbmNoIEIKKzQKKzUKKzYKKzcKKzggY2hhbmdlZCBpbiBEOCwgYnJhbmNoIEEuIE5ldyBmaWxlIHNpemUgMgorOSIgPiBmaWxlICYmCitnaXQgY29tbWl0IC1tIEQ4IGZpbGUnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NyaXNzLWNyb3NzIG1lcmdlJyAnZ2l0IG1lcmdlICJmaW5hbCBtZXJnZSIgQSBCJworCitjYXQgPiBmaWxlLWV4cGVjdCA8PEVPRgorMQorMgorMyBjaGFuZ2VkIGluIEUzLCBicmFuY2ggQi4gTmV3IGZpbGUgc2l6ZQorNAorNQorNgorNworOCBjaGFuZ2VkIGluIEQ4LCBicmFuY2ggQS4gTmV3IGZpbGUgc2l6ZSAyCis5CitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnQ3Jpc3MtY3Jvc3MgbWVyZ2UgcmVzdWx0JyAnY21wIGZpbGUgZmlsZS1leHBlY3QnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NjAyMi1tZXJnZS1yZW5hbWUuc2ggYi90L3Q2MDIyLW1lcmdlLXJlbmFtZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YWMyNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdC90NjAyMi1tZXJnZS1yZW5hbWUuc2gKQEAgLTAsMCArMSwyMDggQEAKKyMhL2Jpbi9zaAorCit0ZXN0X2Rlc2NyaXB0aW9uPSdNZXJnZS1yZWN1cnNpdmUgbWVyZ2luZyByZW5hbWVzJworLiAuL3Rlc3QtbGliLnNoCisKK2lmIHRlc3QgIiRub19weXRob24iOyB0aGVuCisJZWNobyAiU2tpcHBpbmc6IG5vIHB5dGhvbiA9PiBubyByZWN1cnNpdmUgbWVyZ2UiCisJdGVzdF9kb25lCisJZXhpdCAwCitmaQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwIFwKKycKK2NhdCA+QSA8PFxFT0YgJiYKK2EgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCitiIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorYyBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKK2QgZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkCitlIGVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZQorZiBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYKK2cgZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnCitoIGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaAoraSBpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWkKK2ogampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqCitrIGtra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2traworbCBsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGwKK20gbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tCituIG5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubgorbyBvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb28KK0VPRgorCitjYXQgPk0gPDxcRU9GICYmCitBIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQQorQiBCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkIKK0MgQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDCitEIERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERAorRSBFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUUKK0YgRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGCitHIEdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRworSCBISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEgKK0kgSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJCitKIEpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSgorSyBLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0sKK0wgTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCitNIE1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQorTiBOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4KK08gT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PCitFT0YKKworZ2l0IGFkZCBBIE0gJiYKK2dpdCBjb21taXQgLW0gaW5pdGlhbCAmJgorZ2l0IGJyYW5jaCB3aGl0ZSAmJgorZ2l0IGJyYW5jaCByZWQgJiYKK2dpdCBicmFuY2ggYmx1ZSAmJgorCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogbWFzdGVyIGNoYW5nZXMgYSBsaW5lLyIgPEEgPkErICYmCittdiBBKyBBICYmCitnaXQgY29tbWl0IC1hIC1tICJtYXN0ZXIgdXBkYXRlcyBBIiAmJgorCitnaXQgY2hlY2tvdXQgd2hpdGUgJiYKK3NlZCAtZSAiL15nIC9zLy4qL2cgOiB3aGl0ZSBjaGFuZ2VzIGEgbGluZS8iIDxBID5CICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQiBNIE4gJiYKK2dpdCBjb21taXQgLW0gIndoaXRlIHJlbmFtZXMgQS0+QiwgTS0+TiIgJiYKKworZ2l0IGNoZWNrb3V0IHJlZCAmJgorc2VkIC1lICIvXmcgL3MvLiovZyA6IHJlZCBjaGFuZ2VzIGEgbGluZS8iIDxBID5CICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQiBNIE4gJiYKK2dpdCBjb21taXQgLW0gInJlZCByZW5hbWVzIEEtPkIsIE0tPk4iICYmCisKK2dpdCBjaGVja291dCBibHVlICYmCitzZWQgLWUgIi9eZyAvcy8uKi9nIDogYmx1ZSBjaGFuZ2VzIGEgbGluZS8iIDxBID5DICYmCitzZWQgLWUgIi9eRyAvcy8uKi9HIDogY29sb3JlZCBicmFuY2ggY2hhbmdlcyBhIGxpbmUvIiA8TSA+TiAmJgorcm0gLWYgQSBNICYmCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIEEgQyBNIE4gJiYKK2dpdCBjb21taXQgLW0gImJsdWUgcmVuYW1lcyBBLT5DLCBNLT5OIiAmJgorCitnaXQgY2hlY2tvdXQgbWFzdGVyJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsIHJlbmFtaW5nIGJyYW5jaCBpbnRvIHVucmVuYW1pbmcgb25lJyBcCisnCisJZ2l0IHNob3ctYnJhbmNoCisJZ2l0IHB1bGwgLiB3aGl0ZSAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJZXhpdCAxCisJfQorCWdpdCBscy1maWxlcyAtcworCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEIgfCB3YyAtbCkiIC1lcSAzIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IHN0YWdlcyBmb3IgQiIKKwkJZXhpdCAxCQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtcyBOIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbWVyZ2VkIE4iCisJCWV4aXQgMQkKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIG1hc3RlciB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCWV4aXQgMQorCX0KKwl0ZXN0ICIkKGdpdCBkaWZmIHdoaXRlIE4gfCB3YyAtbCkiIC1lcSAwIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSB0YWtlbiBjb2xvcmVkIGJyYW5jaCIKKwkJZXhpdCAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsIHJlbmFtaW5nIGJyYW5jaCBpbnRvIGFub3RoZXIgcmVuYW1pbmcgb25lJyBcCisnCisJcm0gLWYgQgorCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgY2hlY2tvdXQgcmVkCisJZ2l0IHB1bGwgLiB3aGl0ZSAmJiB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgY29uZmxpY3RlZCIKKwkJZXhpdCAxCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEIgfCB3YyAtbCkiIC1lcSAzIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IHN0YWdlcyIKKwkJZXhpdCAxCQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtcyBOIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbWVyZ2VkIE4iCisJCWV4aXQgMQkKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIHJlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCWV4aXQgMQorCX0KKwl0ZXN0ICIkKGdpdCBkaWZmIHdoaXRlIE4gfCB3YyAtbCkiIC1lcSAwIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSB0YWtlbiBjb2xvcmVkIGJyYW5jaCIKKwkJZXhpdCAxCisJfQorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdwdWxsIHVucmVuYW1pbmcgYnJhbmNoIGludG8gcmVuYW1pbmcgb25lJyBcCisnCisJZ2l0IHJlc2V0IC0taGFyZAorCWdpdCBzaG93LWJyYW5jaAorCWdpdCBwdWxsIC4gbWFzdGVyICYmIHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBjb25mbGljdGVkIgorCQlleGl0IDEKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQiB8IHdjIC1sKSIgLWVxIDMgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgc3RhZ2VzIgorCQlleGl0IDEJCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC1zIE4gfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBtZXJnZWQgTiIKKwkJZXhpdCAxCQorCX0KKwlzZWQgLW5lICIvXmcveworCXAKKwlxCisJfSIgQiB8IGdyZXAgcmVkIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsaXN0ZWQgb3VyIGNoYW5nZSBmaXJzdCIKKwkJZXhpdCAxCisJfQorCXRlc3QgIiQoZ2l0IGRpZmYgd2hpdGUgTiB8IHdjIC1sKSIgLWVxIDAgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIHRha2VuIGNvbG9yZWQgYnJhbmNoIgorCQlleGl0IDEKKwl9CisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3B1bGwgY29uZmxpY3RpbmcgcmVuYW1lcycgXAorJworCWdpdCByZXNldCAtLWhhcmQKKwlnaXQgc2hvdy1icmFuY2gKKwlnaXQgcHVsbCAuIGJsdWUgJiYgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGNvbmZsaWN0ZWQiCisJCWV4aXQgMQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtdSBBIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGVmdCBhIHN0YWdlIgorCQlleGl0IDEJCisJfQorCXRlc3QgIiQoZ2l0IGxzLWZpbGVzIC11IEIgfCB3YyAtbCkiIC1lcSAxIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSBsZWZ0IGEgc3RhZ2UiCisJCWV4aXQgMQkKKwl9CisJdGVzdCAiJChnaXQgbHMtZmlsZXMgLXUgQyB8IHdjIC1sKSIgLWVxIDEgfHwgeworCQllY2hvICJCQUQ6IHNob3VsZCBoYXZlIGxlZnQgYSBzdGFnZSIKKwkJZXhpdCAxCQorCX0KKwl0ZXN0ICIkKGdpdCBscy1maWxlcyAtcyBOIHwgd2MgLWwpIiAtZXEgMSB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbWVyZ2VkIE4iCisJCWV4aXQgMQkKKwl9CisJc2VkIC1uZSAiL15nL3sKKwlwCisJcQorCX0iIEIgfCBncmVwIHJlZCB8fCB7CisJCWVjaG8gIkJBRDogc2hvdWxkIGhhdmUgbGlzdGVkIG91ciBjaGFuZ2UgZmlyc3QiCisJCWV4aXQgMQorCX0KKwl0ZXN0ICIkKGdpdCBkaWZmIHdoaXRlIE4gfCB3YyAtbCkiIC1lcSAwIHx8IHsKKwkJZWNobyAiQkFEOiBzaG91bGQgaGF2ZSB0YWtlbiBjb2xvcmVkIGJyYW5jaCIKKwkJZXhpdCAxCisJfQorJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDYxMDEtcmV2LXBhcnNlLXBhcmVudHMuc2ggYi90L3Q2MTAxLXJldi1wYXJzZS1wYXJlbnRzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkMzU0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MTAxLXJldi1wYXJzZS1wYXJlbnRzLnNoCkBAIC0wLDAgKzEsMzMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUgSm9oYW5uZXMgU2NoaW5kZWxpbgorIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdUZXN0IGdpdC1yZXYtcGFyc2Ugd2l0aCBkaWZmZXJlbnQgcGFyZW50IG9wdGlvbnMnCisKKy4gLi90ZXN0LWxpYi5zaAorLiAuLi90NjAwMGxpYi5zaCAjIHQ2eHh4IHNwZWNpZmljIGZ1bmN0aW9ucworCitkYXRlID5wYXRoMAorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBwYXRoMAorc2F2ZV90YWcgdHJlZSBnaXQtd3JpdGUtdHJlZQoraGlkZV9lcnJvciBzYXZlX3RhZyBzdGFydCB1bmlxdWVfY29tbWl0ICJzdGFydCIgdHJlZQorc2F2ZV90YWcgc2Vjb25kIHVuaXF1ZV9jb21taXQgInNlY29uZCIgdHJlZSAtcCBzdGFydAoraGlkZV9lcnJvciBzYXZlX3RhZyBzdGFydDIgdW5pcXVlX2NvbW1pdCAic3RhcnQyIiB0cmVlCitzYXZlX3RhZyB0d29fcGFyZW50cyB1bmlxdWVfY29tbWl0ICJuZXh0IiB0cmVlIC1wIHNlY29uZCAtcCBzdGFydDIKK3NhdmVfdGFnIGZpbmFsIHVuaXF1ZV9jb21taXQgImZpbmFsIiB0cmVlIC1wIHR3b19wYXJlbnRzCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3N0YXJ0IGlzIHZhbGlkJyAnZ2l0LXJldi1wYXJzZSBzdGFydCB8IGdyZXAgIl5bMC05YS1mXVx7NDBcfSQiJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhcnReMCcgInRlc3QgJChjYXQgLmdpdC9yZWZzL3RhZ3Mvc3RhcnQpID0gJChnaXQtcmV2LXBhcnNlIHN0YXJ0XjApIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnc3RhcnReMSBub3QgdmFsaWQnICJpZiBnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHN0YXJ0XjE7IHRoZW4gZmFsc2U7IGVsc2UgOjsgZmkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdzZWNvbmReMSA9IHNlY29uZF4nICJ0ZXN0ICQoZ2l0LXJldi1wYXJzZSBzZWNvbmReMSkgPSAkKGdpdC1yZXYtcGFyc2Ugc2Vjb25kXikiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjFeMScgInRlc3QgJChnaXQtcmV2LXBhcnNlIHN0YXJ0KSA9ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF4xXjFeMSkiCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdmaW5hbF4xXjFeMSA9IGZpbmFsXl5eJyAidGVzdCAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4xXjEpID0gJChnaXQtcmV2LXBhcnNlIGZpbmFsXl5eKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMicgInRlc3QgJChnaXQtcmV2LXBhcnNlIHN0YXJ0MikgPSAkKGdpdC1yZXYtcGFyc2UgZmluYWxeMV4yKSIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZpbmFsXjFeMiAhPSBmaW5hbF4xXjEnICJ0ZXN0ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF4xXjIpICE9ICQoZ2l0LXJldi1wYXJzZSBmaW5hbF4xXjEpIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmluYWxeMV4zIG5vdCB2YWxpZCcgImlmIGdpdC1yZXYtcGFyc2UgLS12ZXJpZnkgZmluYWxeMV4zOyB0aGVuIGZhbHNlOyBlbHNlIDo7IGZpIgordGVzdF9leHBlY3RfZmFpbHVyZSAnLS12ZXJpZnkgc3RhcnQyXjEnICdnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHN0YXJ0Ml4xJwordGVzdF9leHBlY3Rfc3VjY2VzcyAnLS12ZXJpZnkgc3RhcnQyXjAnICdnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHN0YXJ0Ml4wJworCit0ZXN0X2RvbmUKKwpkaWZmIC0tZ2l0IGEvdC90NjIwMC1mbXQtbWVyZ2UtbXNnLnNoIGIvdC90NjIwMC1mbXQtbWVyZ2UtbXNnLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzZTQ5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q2MjAwLWZtdC1tZXJnZS1tc2cuc2gKQEAgLTAsMCArMSwxNjMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYsIEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2ZtdC1tZXJnZS1tc2cgdGVzdCcKKworLiAuL3Rlc3QtbGliLnNoCisKK2RhdGVzdGFtcD0xMTUxOTM5OTIzCitzZXRkYXRlICgpIHsKKwlHSVRfQ09NTUlUVEVSX0RBVEU9IiRkYXRlc3RhbXAgKzAyMDAiCisJR0lUX0FVVEhPUl9EQVRFPSIkZGF0ZXN0YW1wICswMjAwIgorCWRhdGVzdGFtcD1gZXhwciAiJGRhdGVzdGFtcCIgKyAxYAorCWV4cG9ydCBHSVRfQ09NTUlUVEVSX0RBVEUgR0lUX0FVVEhPUl9EQVRFCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3Mgc2V0dXAgJworCWVjaG8gb25lID5vbmUgJiYKKwlnaXQgYWRkIG9uZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1tICJJbml0aWFsIiAmJgorCisJZWNobyB1bm8gPm9uZSAmJgorCWVjaG8gZG9zID50d28gJiYKKwlnaXQgYWRkIHR3byAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJTZWNvbmQiICYmCisKKwlnaXQgY2hlY2tvdXQgLWIgbGVmdCAmJgorCisJZWNobyAkZGF0ZXN0YW1wID5vbmUgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiQ29tbW9uICMxIiAmJgorCisJZWNobyAkZGF0ZXN0YW1wID5vbmUgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiQ29tbW9uICMyIiAmJgorCisJZ2l0IGJyYW5jaCByaWdodCAmJgorCisJZWNobyAkZGF0ZXN0YW1wID50d28gJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiTGVmdCAjMyIgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dHdvICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIkxlZnQgIzQiICYmCisKKwllY2hvICRkYXRlc3RhbXAgPnR3byAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJMZWZ0ICM1IiAmJgorCisJZ2l0IGNoZWNrb3V0IHJpZ2h0ICYmCisKKwllY2hvICRkYXRlc3RhbXAgPnRocmVlICYmCisJZ2l0IGFkZCB0aHJlZSAmJgorCXNldGRhdGUgJiYKKwlnaXQgY29tbWl0IC1hIC1tICJSaWdodCAjMyIgJiYKKworCWVjaG8gJGRhdGVzdGFtcCA+dGhyZWUgJiYKKwlzZXRkYXRlICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAiUmlnaHQgIzQiICYmCisKKwllY2hvICRkYXRlc3RhbXAgPnRocmVlICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBjb21taXQgLWEgLW0gIlJpZ2h0ICM1IiAmJgorCisJZ2l0IHNob3ctYnJhbmNoCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitNZXJnZSBicmFuY2ggJ2xlZnQnCitFT0YKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnbWVyZ2UtbXNnIHRlc3QgIzEnICcKKworCWdpdCBjaGVja291dCBtYXN0ZXIgJiYKKwlnaXQgZmV0Y2ggLiBsZWZ0ICYmCisKKwlnaXQgZm10LW1lcmdlLW1zZyA8LmdpdC9GRVRDSF9IRUFEID5hY3R1YWwgJiYKKwlkaWZmIC11IGFjdHVhbCBleHBlY3RlZAorJworCitjYXQgPmV4cGVjdGVkIDw8XEVPRgorTWVyZ2UgYnJhbmNoICdsZWZ0JyBvZiAuLi90cmFzaAorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLW1zZyB0ZXN0ICMyJyAnCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJZ2l0IGZldGNoIC4uL3RyYXNoIGxlZnQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWRpZmYgLXUgYWN0dWFsIGV4cGVjdGVkCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitNZXJnZSBicmFuY2ggJ2xlZnQnCisKKyogbGVmdDoKKyAgTGVmdCAjNQorICBMZWZ0ICM0CisgIExlZnQgIzMKKyAgQ29tbW9uICMyCisgIENvbW1vbiAjMQorRU9GCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21lcmdlLW1zZyB0ZXN0ICMzJyAnCisKKwlnaXQgcmVwby1jb25maWcgbWVyZ2Uuc3VtbWFyeSB0cnVlICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBmZXRjaCAuIGxlZnQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWRpZmYgLXUgYWN0dWFsIGV4cGVjdGVkCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCitNZXJnZSBicmFuY2hlcyAnbGVmdCcgYW5kICdyaWdodCcKKworKiBsZWZ0OgorICBMZWZ0ICM1CisgIExlZnQgIzQKKyAgTGVmdCAjMworICBDb21tb24gIzIKKyAgQ29tbW9uICMxCisKKyogcmlnaHQ6CisgIFJpZ2h0ICM1CisgIFJpZ2h0ICM0CisgIFJpZ2h0ICMzCisgIENvbW1vbiAjMgorICBDb21tb24gIzEKK0VPRgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjNCcgJworCisJZ2l0IHJlcG8tY29uZmlnIG1lcmdlLnN1bW1hcnkgdHJ1ZSAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlciAmJgorCXNldGRhdGUgJiYKKwlnaXQgZmV0Y2ggLiBsZWZ0IHJpZ2h0ICYmCisKKwlnaXQgZm10LW1lcmdlLW1zZyA8LmdpdC9GRVRDSF9IRUFEID5hY3R1YWwgJiYKKwlkaWZmIC11IGFjdHVhbCBleHBlY3RlZAorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdtZXJnZS1tc2cgdGVzdCAjNScgJworCisJZ2l0IHJlcG8tY29uZmlnIG1lcmdlLnN1bW1hcnkgeWVzICYmCisKKwlnaXQgY2hlY2tvdXQgbWFzdGVyICYmCisJc2V0ZGF0ZSAmJgorCWdpdCBmZXRjaCAuIGxlZnQgcmlnaHQgJiYKKworCWdpdCBmbXQtbWVyZ2UtbXNnIDwuZ2l0L0ZFVENIX0hFQUQgPmFjdHVhbCAmJgorCWRpZmYgLXUgYWN0dWFsIGV4cGVjdGVkCisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90NzAwMS1tdi5zaCBiL3QvdDcwMDEtbXYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTAwY2E5MwotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcwMDEtbXYuc2gKQEAgLTAsMCArMSw4MSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1tdiBpbiBzdWJkaXJzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdwcmVwYXJlIHJlZmVyZW5jZSB0cmVlJyBcCisgICAgJ21rZGlyIHBhdGgwIHBhdGgxICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtYWRkIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSBhZGQgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtb3ZpbmcgdGhlIGZpbGUgb3V0IG9mIHN1YmRpcmVjdG9yeScgXAorICAgICdjZCBwYXRoMCAmJiBnaXQtbXYgQ09QWUlORyAuLi9wYXRoMS9DT1BZSU5HJworCisjIGluIHBhdGgwIGN1cnJlbnRseQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbW1pdGluZyB0aGUgY2hhbmdlJyBcCisgICAgJ2NkIC4uICYmIGdpdC1jb21taXQgLW0gbW92ZS1vdXQgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyB0aGUgY29tbWl0JyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICBncmVwIC1FICJeUjEwMC4rcGF0aDAvQ09QWUlORy4rcGF0aDEvQ09QWUlORyInCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtb3ZpbmcgdGhlIGZpbGUgYmFjayBpbnRvIHN1YmRpcmVjdG9yeScgXAorICAgICdjZCBwYXRoMCAmJiBnaXQtbXYgLi4vcGF0aDEvQ09QWUlORyBDT1BZSU5HJworCisjIGluIHBhdGgwIGN1cnJlbnRseQordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbW1pdGluZyB0aGUgY2hhbmdlJyBcCisgICAgJ2NkIC4uICYmIGdpdC1jb21taXQgLW0gbW92ZS1pbiAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIHRoZSBjb21taXQnIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgIGdyZXAgLUUgIl5SMTAwLitwYXRoMS9DT1BZSU5HLitwYXRoMC9DT1BZSU5HIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2FkZGluZyBhbm90aGVyIGZpbGUnIFwKKyAgICAnY3AgLi4vLi4vUkVBRE1FIHBhdGgwL1JFQURNRSAmJgorICAgICBnaXQtYWRkIHBhdGgwL1JFQURNRSAmJgorICAgICBnaXQtY29tbWl0IC1tIGFkZDIgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdtb3Zpbmcgd2hvbGUgc3ViZGlyZWN0b3J5JyBcCisgICAgJ2dpdC1tdiBwYXRoMCBwYXRoMicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NvbW1pdGluZyB0aGUgY2hhbmdlJyBcCisgICAgJ2dpdC1jb21taXQgLW0gZGlyLW1vdmUgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjaGVja2luZyB0aGUgY29tbWl0JyBcCisgICAgJ2dpdC1kaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICAgZ3JlcCAtRSAiXlIxMDAuK3BhdGgwL0NPUFlJTkcuK3BhdGgyL0NPUFlJTkciICYmCisgICAgIGdpdC1kaWZmLXRyZWUgLXIgLU0gLS1uYW1lLXN0YXR1cyAgSEVBRF4gSEVBRCB8IFwKKyAgICAgZ3JlcCAtRSAiXlIxMDAuK3BhdGgwL1JFQURNRS4rcGF0aDIvUkVBRE1FIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ21vdmluZyB3aG9sZSBzdWJkaXJlY3RvcnkgaW50byBzdWJkaXJlY3RvcnknIFwKKyAgICAnZ2l0LW12IHBhdGgyIHBhdGgxJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnY29tbWl0aW5nIHRoZSBjaGFuZ2UnIFwKKyAgICAnZ2l0LWNvbW1pdCAtbSBkaXItbW92ZSAtYScKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIHRoZSBjb21taXQnIFwKKyAgICAnZ2l0LWRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgICBncmVwIC1FICJeUjEwMC4rcGF0aDIvQ09QWUlORy4rcGF0aDEvcGF0aDIvQ09QWUlORyIgJiYKKyAgICAgZ2l0LWRpZmYtdHJlZSAtciAtTSAtLW5hbWUtc3RhdHVzICBIRUFEXiBIRUFEIHwgXAorICAgICBncmVwIC1FICJeUjEwMC4rcGF0aDIvUkVBRE1FLitwYXRoMS9wYXRoMi9SRUFETUUiJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnZG8gbm90IG1vdmUgZGlyZWN0b3J5IG92ZXIgZXhpc3RpbmcgZGlyZWN0b3J5JyBcCisgICAgJ21rZGlyIHBhdGgwICYmIG1rZGlyIHBhdGgwL3BhdGgyICYmIGdpdC1tdiBwYXRoMiBwYXRoMCcKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q3MDAyLWdyZXAuc2ggYi90L3Q3MDAyLWdyZXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDBhN2Q3NgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDcwMDItZ3JlcC5zaApAQCAtMCwwICsxLDg1IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEp1bmlvIEMgSGFtYW5vCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdCBncmVwIC13CisnCisKKy4gLi90ZXN0LWxpYi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKwl7CisJCWVjaG8gZm9vIG1tYXAgYmFyCisJCWVjaG8gZm9vX21tYXAgYmFyCisJCWVjaG8gZm9vX21tYXAgYmFyIG1tYXAKKwkJZWNobyBmb28gbW1hcCBiYXJfbW1hcAorCQllY2hvIGZvb19tbWFwIGJhciBtbWFwIGJhegorCX0gPmZpbGUgJiYKKwllY2hvIHggeCB4eCB4ID54ICYmCisJZWNobyB5IHl5ID55ICYmCisJZWNobyB6enogPiB6ICYmCisJZ2l0IGFkZCBmaWxlIHggeSB6ICYmCisJZ2l0IGNvbW1pdCAtbSBpbml0aWFsCisnCisKK2ZvciBIIGluIEhFQUQgJycKK2RvCisJY2FzZSAiJEgiIGluCisJSEVBRCkJSEM9J0hFQUQ6JyBMPSdIRUFEJyA7OworCScnKQlIQz0gTD0naW4gd29ya2luZyB0cmVlJyA7OworCWVzYWMKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLXcgJEwiICcKKwkJeworCQkJZWNobyAke0hDfWZpbGU6MTpmb28gbW1hcCBiYXIKKwkJCWVjaG8gJHtIQ31maWxlOjM6Zm9vX21tYXAgYmFyIG1tYXAKKwkJCWVjaG8gJHtIQ31maWxlOjQ6Zm9vIG1tYXAgYmFyX21tYXAKKwkJCWVjaG8gJHtIQ31maWxlOjU6Zm9vX21tYXAgYmFyIG1tYXAgYmF6CisJCX0gPmV4cGVjdGVkICYmCisJCWdpdCBncmVwIC1uIC13IC1lIG1tYXAgJEggPmFjdHVhbCAmJgorCQlkaWZmIGV4cGVjdGVkIGFjdHVhbAorCScKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgImdyZXAgLXcgJEwgKHgpIiAnCisJCXsKKwkJCWVjaG8gJHtIQ314OjE6eCB4IHh4IHgKKwkJfSA+ZXhwZWN0ZWQgJiYKKwkJZ2l0IGdyZXAgLW4gLXcgLWUgInggeHgqIHgiICRIID5hY3R1YWwgJiYKKwkJZGlmZiBleHBlY3RlZCBhY3R1YWwKKwknCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJncmVwIC13ICRMICh5LTEpIiAnCisJCXsKKwkJCWVjaG8gJHtIQ315OjE6eSB5eQorCQl9ID5leHBlY3RlZCAmJgorCQlnaXQgZ3JlcCAtbiAtdyAtZSAiXnkiICRIID5hY3R1YWwgJiYKKwkJZGlmZiBleHBlY3RlZCBhY3R1YWwKKwknCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJncmVwIC13ICRMICh5LTIpIiAnCisJCTogPmV4cGVjdGVkICYmCisJCWlmIGdpdCBncmVwIC1uIC13IC1lICJeeSB5IiAkSCA+YWN0dWFsCisJCXRoZW4KKwkJCWVjaG8gc2hvdWxkIG5vdCBoYXZlIG1hdGNoZWQKKwkJCWNhdCBhY3R1YWwKKwkJCWZhbHNlCisJCWVsc2UKKwkJCWRpZmYgZXhwZWN0ZWQgYWN0dWFsCisJCWZpCisJJworCisJdGVzdF9leHBlY3Rfc3VjY2VzcyAiZ3JlcCAtdyAkTCAoeikiICcKKwkJOiA+ZXhwZWN0ZWQgJiYKKwkJaWYgZ2l0IGdyZXAgLW4gLXcgLWUgIl56IiAkSCA+YWN0dWFsCisJCXRoZW4KKwkJCWVjaG8gc2hvdWxkIG5vdCBoYXZlIG1hdGNoZWQKKwkJCWNhdCBhY3R1YWwKKwkJCWZhbHNlCisJCWVsc2UKKwkJCWRpZmYgZXhwZWN0ZWQgYWN0dWFsCisJCWZpCisJJworZG9uZQorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcxMDEtcmVzZXQuc2ggYi90L3Q3MTAxLXJlc2V0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MTkxNDAKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MTAxLXJlc2V0LnNoCkBAIC0wLDAgKzEsNjMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgU2hhd24gUGVhcmNlCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1yZXNldCBzaG91bGQgY3VsbCBlbXB0eSBzdWJkaXJzJworLiAuL3Rlc3QtbGliLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBpbml0aWFsIGZpbGVzJyBcCisgICAgJ21rZGlyIHBhdGgwICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDAvQ09QWUlORyAmJgorICAgICBnaXQtYWRkIHBhdGgwL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWNvbW1pdCAtbSBhZGQgLWEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdjcmVhdGluZyBzZWNvbmQgZmlsZXMnIFwKKyAgICAnbWtkaXIgcGF0aDEgJiYKKyAgICAgbWtkaXIgcGF0aDEvcGF0aDIgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMS9wYXRoMi9DT1BZSU5HICYmCisgICAgIGNwIC4uLy4uL0NPUFlJTkcgcGF0aDEvQ09QWUlORyAmJgorICAgICBjcCAuLi8uLi9DT1BZSU5HIENPUFlJTkcgJiYKKyAgICAgY3AgLi4vLi4vQ09QWUlORyBwYXRoMC9DT1BZSU5HLVRPTyAmJgorICAgICBnaXQtYWRkIHBhdGgxL3BhdGgyL0NPUFlJTkcgJiYKKyAgICAgZ2l0LWFkZCBwYXRoMS9DT1BZSU5HICYmCisgICAgIGdpdC1hZGQgQ09QWUlORyAmJgorICAgICBnaXQtYWRkIHBhdGgwL0NPUFlJTkctVE9PICYmCisgICAgIGdpdC1jb21taXQgLW0gY2hhbmdlIC1hJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAncmVzZXR0aW5nIHRyZWUgSEVBRF4nIFwKKyAgICAnZ2l0LXJlc2V0IC0taGFyZCBIRUFEXicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ2NoZWNraW5nIGluaXRpYWwgZmlsZXMgZXhpc3QgYWZ0ZXIgcmV3aW5kJyBcCisgICAgJ3Rlc3QgLWQgcGF0aDAgJiYKKyAgICAgdGVzdCAtZiBwYXRoMC9DT1BZSU5HJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9wYXRoMi9DT1BZSU5HJyBcCisgICAgJ3Rlc3QgLWYgcGF0aDEvcGF0aDIvQ09QWUlORycKKwordGVzdF9leHBlY3RfZmFpbHVyZSBcCisgICAgJ2NoZWNraW5nIGxhY2sgb2YgcGF0aDEvQ09QWUlORycgXAorICAgICd0ZXN0IC1mIHBhdGgxL0NPUFlJTkcnCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgXAorICAgICdjaGVja2luZyBsYWNrIG9mIENPUFlJTkcnIFwKKyAgICAndGVzdCAtZiBDT1BZSU5HJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9DT1BZSU5HLVRPTycgXAorICAgICd0ZXN0IC1mIHBhdGgwL0NPUFlJTkctVE9PJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMS9wYXRoMicgXAorICAgICd0ZXN0IC1kIHBhdGgxL3BhdGgyJworCit0ZXN0X2V4cGVjdF9mYWlsdXJlIFwKKyAgICAnY2hlY2tpbmcgbGFjayBvZiBwYXRoMScgXAorICAgICd0ZXN0IC1kIHBhdGgxJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDcyMDEtY28uc2ggYi90L3Q3MjAxLWNvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI2NGU4YjcKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q3MjAxLWNvLnNoCkBAIC0wLDAgKzEsNzIgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgSnVuaW8gQyBIYW1hbm8KKyMKKwordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LWNoZWNrb3V0IHRlc3RzLicKKworLiAuL3Rlc3QtbGliLnNoCisKK2ZpbGwgKCkgeworCWZvciBpCisJZG8KKwkJZWNobyAiJGkiCisJZG9uZQorfQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIHNldHVwICcKKworCWZpbGwgMSAyIDMgNCA1ID5vbmUgJiYKKwlmaWxsIGEgYiBjIGQgZSA+dHdvICYmCisJZ2l0IGFkZCBvbmUgdHdvICYmCisJZ2l0IGNvbW1pdCAtbSAiSW5pdGlhbCBBIG9uZSwgQSB0d28iICYmCisKKwlnaXQgY2hlY2tvdXQgLWIgc2lkZSAmJgorCWZpbGwgMSAyIDMgPm9uZSAmJgorCWZpbGwgQSBCIEMgRCBFID50aHJlZSAmJgorCXJtIC1mIHR3byAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgLS1yZW1vdmUgb25lIHR3byB0aHJlZSAmJgorCWdpdCBjb21taXQgLW0gIlNpZGUgTSBvbmUsIEQgdHdvLCBBIHRocmVlIiAmJgorCisJZ2l0IGNoZWNrb3V0IG1hc3RlcgorJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCB3aXRoIGRpcnR5IHRyZWUgd2l0aG91dCAtbSIgJworCisJZmlsbCAwIDEgMiAzIDQgNSA+b25lICYmCisJaWYgZ2l0IGNoZWNrb3V0IHNpZGUKKwl0aGVuCisJCWVjaG8gTm90IGhhcHB5CisJCWZhbHNlCisJZWxzZQorCQllY2hvICJoYXBweSAtIGZhaWxlZCBjb3JyZWN0bHkiCisJZmkKKworJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCAtbSB3aXRoIGRpcnR5IHRyZWUiICcKKworCWdpdCBjaGVja291dCAtZiBtYXN0ZXIgJiYKKwlnaXQgY2xlYW4gJiYKKworCWZpbGwgMCAxIDIgMyA0IDUgPm9uZSAmJgorCWdpdCBjaGVja291dCAtbSBzaWRlICYmCisKKwlmaWxsICIgIG1hc3RlciIgIiogc2lkZSIgPmV4cGVjdC5icmFuY2ggJiYKKwlnaXQgYnJhbmNoID5jdXJyZW50LmJyYW5jaCAmJgorCWRpZmYgZXhwZWN0LmJyYW5jaCBjdXJyZW50LmJyYW5jaCAmJgorCisJZmlsbCAiTQlvbmUiICJBCXRocmVlIiAiRAl0d28iID5leHBlY3QubWFzdGVyICYmCisJZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyBtYXN0ZXIgPmN1cnJlbnQubWFzdGVyICYmCisJZGlmZiBleHBlY3QubWFzdGVyIGN1cnJlbnQubWFzdGVyICYmCisKKwlmaWxsICJNCW9uZSIgPmV4cGVjdC5zaWRlICYmCisJZ2l0IGRpZmYgLS1uYW1lLXN0YXR1cyBzaWRlID5jdXJyZW50LnNpZGUgJiYKKwlkaWZmIGV4cGVjdC5zaWRlIGN1cnJlbnQuc2lkZSAmJgorCisJOiA+ZXhwZWN0LmluZGV4ICYmCisJZ2l0IGRpZmYgLS1jYWNoZWQgPmN1cnJlbnQuaW5kZXggJiYKKwlkaWZmIGV4cGVjdC5pbmRleCBjdXJyZW50LmluZGV4CisnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90ODAwMS1hbm5vdGF0ZS5zaCBiL3QvdDgwMDEtYW5ub3RhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2E2NDkwZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDgwMDEtYW5ub3RhdGUuc2gKQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1hbm5vdGF0ZScKKy4gLi90ZXN0LWxpYi5zaAorCitQUk9HPSdnaXQgYW5ub3RhdGUnCisuIC4uL2Fubm90YXRlLXRlc3RzLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdBbm5vdGF0aW5nIGFuIG9sZCByZXZpc2lvbiB3b3JrcycgXAorICAgICdbICQoZ2l0IGFubm90YXRlIGZpbGUgbWFzdGVyIHwgYXdrICJ7cHJpbnQgXCQzfSIgfCBncmVwIC1jICJeQSQiKSAtZXEgMiBdICYmIFwKKyAgICAgWyAkKGdpdCBhbm5vdGF0ZSBmaWxlIG1hc3RlciB8IGF3ayAie3ByaW50IFwkM30iIHwgZ3JlcCAtYyAiXkIkIikgLWVxIDIgXScKKworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDgwMDItYmxhbWUuc2ggYi90L3Q4MDAyLWJsYW1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3NzczOTMKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q4MDAyLWJsYW1lLnNoCkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1ibGFtZScKKy4gLi90ZXN0LWxpYi5zaAorCitQUk9HPSdnaXQgYmxhbWUgLWMnCisuIC4uL2Fubm90YXRlLXRlc3RzLnNoCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTAwMS1zZW5kLWVtYWlsLnNoIGIvdC90OTAwMS1zZW5kLWVtYWlsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU5ZWEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MDAxLXNlbmQtZW1haWwuc2gKQEAgLTAsMCArMSw0NCBAQAorIyEvYmluL3NoCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zZW5kLWVtYWlsJworLiAuL3Rlc3QtbGliLnNoCisKK1BST0c9J2dpdCBzZW5kLWVtYWlsJwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ3ByZXBhcmUgcmVmZXJlbmNlIHRyZWUnIFwKKyAgICAnZWNobyAiMUEgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIiA+ZmlsZSAmJgorICAgICBlY2hvICJsYXp5IGRvZyIgPj5maWxlICYmCisgICAgIGdpdCBhZGQgZmlsZQorICAgICBHSVRfQVVUSE9SX05BTUU9IkEiIGdpdCBjb21taXQgLWEgLW0gIkluaXRpYWwuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1NldHVwIGhlbHBlciB0b29sJyBcCisgICAgJyhlY2hvICIjIS9iaW4vc2giCisgICAgICBlY2hvIHNoaWZ0CisgICAgICBlY2hvIGZvciBhCisgICAgICBlY2hvIGRvCisgICAgICBlY2hvICIgIGVjaG8gXCIhXCRhIVwiIgorICAgICAgZWNobyAiZG9uZSA+Y29tbWFuZGxpbmUiCisgICAgICBlY2hvICJjYXQgPiBtc2d0eHQiCisgICAgICApID5mYWtlLnNlbmRtYWlsCisgICAgIGNobW9kICt4IC4vZmFrZS5zZW5kbWFpbAorICAgICBnaXQgYWRkIGZha2Uuc2VuZG1haWwKKyAgICAgR0lUX0FVVEhPUl9OQU1FPSJBIiBnaXQgY29tbWl0IC1hIC1tICJTZWNvbmQuIicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnRXh0cmFjdCBwYXRjaGVzJyAnCisgICAgcGF0Y2hlcz1gZ2l0IGZvcm1hdC1wYXRjaCAtbiBIRUFEXjFgCisnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1NlbmQgcGF0Y2hlcycgJworICAgICBnaXQgc2VuZC1lbWFpbCAtZnJvbT0iRXhhbXBsZSA8bm9ib2R5QGV4YW1wbGUuY29tPiIgLS10bz1ub2JvZHlAZXhhbXBsZS5jb20gLS1zbXRwLXNlcnZlcj0iJChwd2QpL2Zha2Uuc2VuZG1haWwiICRwYXRjaGVzIDI+ZXJyb3JzCisnCisKK2NhdCA+ZXhwZWN0ZWQgPDxcRU9GCishbm9ib2R5QGV4YW1wbGUuY29tIQorIWF1dGhvckBleGFtcGxlLmNvbSEKK0VPRgordGVzdF9leHBlY3Rfc3VjY2VzcyBcCisgICAgJ1ZlcmlmeSBjb21tYW5kbGluZScgXAorICAgICdkaWZmIGNvbW1hbmRsaW5lIGV4cGVjdGVkJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDAtZ2l0LXN2bi1iYXNpYy5zaCBiL3QvdDkxMDAtZ2l0LXN2bi1iYXNpYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGEzY2NkCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwMC1naXQtc3ZuLWJhc2ljLnNoCkBAIC0wLDAgKzEsMjMzIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGJhc2ljIHRlc3RzJworR0lUX1NWTl9MQ19BTEw9JExDX0FMTAorCitjYXNlICIkTENfQUxMIiBpbgorKi5VVEYtOCkKKwloYXZlX3V0Zjg9dAorCTs7CisqKQorCWhhdmVfdXRmOD0KKwk7OworZXNhYworCisuIC4vbGliLWdpdC1zdm4uc2gKKworZWNobyAnZGVmaW5lIE5PX1NWTl9URVNUUyB0byBza2lwIGdpdC1zdm4gdGVzdHMnCisKK21rZGlyIGltcG9ydAorY2QgaW1wb3J0CisKK2VjaG8gZm9vID4gZm9vCitpZiB0ZXN0IC16ICIkTk9fU1lNTElOSyIKK3RoZW4KKwlsbiAtcyBmb28gZm9vLmxpbmsKK2ZpCitta2RpciAtcCBkaXIvYS9iL2MvZC9lCitlY2hvICdkZWVwIGRpcicgPiBkaXIvYS9iL2MvZC9lL2ZpbGUKK21rZGlyIC1wIGJhcgorZWNobyAnenp6JyA+IGJhci96enoKK2VjaG8gJyMhL2Jpbi9zaCcgPiBleGVjLnNoCitjaG1vZCAreCBleGVjLnNoCitzdm4gaW1wb3J0IC1tICdpbXBvcnQgZm9yIGdpdC1zdm4nIC4gIiRzdm5yZXBvIiA+L2Rldi9udWxsCisKK2NkIC4uCitybSAtcmYgaW1wb3J0CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgXAorICAgICdpbml0aWFsaXplIGdpdC1zdm4nIFwKKyAgICAiZ2l0LXN2biBpbml0ICRzdm5yZXBvIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzIFwKKyAgICAnaW1wb3J0IGFuIFNWTiByZXZpc2lvbiBpbnRvIGdpdCcgXAorICAgICdnaXQtc3ZuIGZldGNoJworCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJjaGVja291dCBmcm9tIHN2biIgInN2biBjbyAkc3ZucmVwbyAkU1ZOX1RSRUUiCisKK25hbWU9J3RyeSBhIGRlZXAgLS1ybWRpciB3aXRoIGEgY29tbWl0JworZ2l0IGNoZWNrb3V0IC1mIC1iIG15YnJhbmNoIHJlbW90ZXMvZ2l0LXN2bgorbXYgZGlyL2EvYi9jL2QvZS9maWxlIGRpci9maWxlCitjcCBkaXIvZmlsZSBmaWxlCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tcmVtb3ZlIGRpci9hL2IvYy9kL2UvZmlsZSBkaXIvZmlsZSBmaWxlCitnaXQgY29tbWl0IC1tICIkbmFtZSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiIFwKKyAgICAiZ2l0LXN2biBjb21taXQgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciByZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoICYmCisgICAgIHN2biB1cCAkU1ZOX1RSRUUgJiYKKyAgICAgdGVzdCAtZCAkU1ZOX1RSRUUvZGlyICYmIHRlc3QgISAtZCAkU1ZOX1RSRUUvZGlyL2EiCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZmlsZSB0byBkaXJlY3RvcnkgIzEnCitta2RpciBkaXIvbmV3X2ZpbGUKK212IGRpci9maWxlIGRpci9uZXdfZmlsZS9maWxlCittdiBkaXIvbmV3X2ZpbGUgZGlyL2ZpbGUKK2dpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgZGlyL2ZpbGUKK2dpdCB1cGRhdGUtaW5kZXggLS1hZGQgZGlyL2ZpbGUvZmlsZQorZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIiRuYW1lIiBcCisgICAgJ2dpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaCcgXAorICAgIHx8IHRydWUKKworCituYW1lPSdkZXRlY3Qgbm9kZSBjaGFuZ2UgZnJvbSBkaXJlY3RvcnkgdG8gZmlsZSAjMScKK3JtIC1yZiBkaXIgJEdJVF9ESVIvaW5kZXgKK2dpdCBjaGVja291dCAtZiAtYiBteWJyYW5jaDIgcmVtb3Rlcy9naXQtc3ZuCittdiBiYXIvenp6IHp6egorcm0gLXJmIGJhcgorbXYgenp6IGJhcgorZ2l0IHVwZGF0ZS1pbmRleCAtLXJlbW92ZSAtLSBiYXIvenp6CitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tIGJhcgorZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIiRuYW1lIiBcCisgICAgJ2dpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDInIFwKKyAgICB8fCB0cnVlCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZmlsZSB0byBkaXJlY3RvcnkgIzInCitybSAtZiAkR0lUX0RJUi9pbmRleAorZ2l0IGNoZWNrb3V0IC1mIC1iIG15YnJhbmNoMyByZW1vdGVzL2dpdC1zdm4KK3JtIGJhci96enoKK2dpdC11cGRhdGUtaW5kZXggLS1yZW1vdmUgYmFyL3p6egorbWtkaXIgYmFyL3p6egorZWNobyB5eXkgPiBiYXIvenp6L3l5eQorZ2l0LXVwZGF0ZS1pbmRleCAtLWFkZCBiYXIvenp6L3l5eQorZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIiRuYW1lIiBcCisgICAgJ2dpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDMnIFwKKyAgICB8fCB0cnVlCisKKworbmFtZT0nZGV0ZWN0IG5vZGUgY2hhbmdlIGZyb20gZGlyZWN0b3J5IHRvIGZpbGUgIzInCitybSAtZiAkR0lUX0RJUi9pbmRleAorZ2l0IGNoZWNrb3V0IC1mIC1iIG15YnJhbmNoNCByZW1vdGVzL2dpdC1zdm4KK3JtIC1yZiBkaXIKK2dpdCB1cGRhdGUtaW5kZXggLS1yZW1vdmUgLS0gZGlyL2ZpbGUKK3RvdWNoIGRpcgorZWNobyBhc2RmID4gZGlyCitnaXQgdXBkYXRlLWluZGV4IC0tYWRkIC0tIGRpcgorZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKK3Rlc3RfZXhwZWN0X2ZhaWx1cmUgIiRuYW1lIiBcCisgICAgJ2dpdC1zdm4gY29tbWl0IC0tZmluZC1jb3BpZXMtaGFyZGVyIC0tcm1kaXIgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaDQnIFwKKyAgICB8fCB0cnVlCisKKworbmFtZT0ncmVtb3ZlIGV4ZWN1dGFibGUgYml0IGZyb20gYSBmaWxlJworcm0gLWYgJEdJVF9ESVIvaW5kZXgKK2dpdCBjaGVja291dCAtZiAtYiBteWJyYW5jaDUgcmVtb3Rlcy9naXQtc3ZuCitjaG1vZCAteCBleGVjLnNoCitnaXQgdXBkYXRlLWluZGV4IGV4ZWMuc2gKK2dpdCBjb21taXQgLW0gIiRuYW1lIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorICAgICJnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisgICAgIHN2biB1cCAkU1ZOX1RSRUUgJiYKKyAgICAgdGVzdCAhIC14ICRTVk5fVFJFRS9leGVjLnNoIgorCisKK25hbWU9J2FkZCBleGVjdXRhYmxlIGJpdCBiYWNrIGZpbGUnCitjaG1vZCAreCBleGVjLnNoCitnaXQgdXBkYXRlLWluZGV4IGV4ZWMuc2gKK2dpdCBjb21taXQgLW0gIiRuYW1lIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorICAgICJnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisgICAgIHN2biB1cCAkU1ZOX1RSRUUgJiYKKyAgICAgdGVzdCAteCAkU1ZOX1RSRUUvZXhlYy5zaCIKKworCisKK2lmIHRlc3QgLXogIiROT19TWU1MSU5LIgordGhlbgorCW5hbWU9J2V4ZWN1dGFibGUgZmlsZSBiZWNvbWVzIGEgc3ltbGluayB0byBiYXIvenp6IChmaWxlKScKKwlybSBleGVjLnNoCisJbG4gLXMgYmFyL3p6eiBleGVjLnNoCisJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLnNoCisJZ2l0IGNvbW1pdCAtbSAiJG5hbWUiCisKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorCSAgICAiZ2l0LXN2biBjb21taXQgLS1maW5kLWNvcGllcy1oYXJkZXIgLS1ybWRpciByZW1vdGVzL2dpdC1zdm4uLm15YnJhbmNoNSAmJgorCSAgICAgc3ZuIHVwICRTVk5fVFJFRSAmJgorCSAgICAgdGVzdCAtTCAkU1ZOX1RSRUUvZXhlYy5zaCIKKworCW5hbWU9J25ldyBzeW1saW5rIGlzIGFkZGVkIHRvIGEgZmlsZSB0aGF0IHdhcyBhbHNvIGp1c3QgbWFkZSBleGVjdXRhYmxlJworCWNobW9kICt4IGJhci96enoKKwlsbiAtcyBiYXIvenp6IGV4ZWMtMi5zaAorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgYmFyL3p6eiBleGVjLTIuc2gKKwlnaXQgY29tbWl0IC1tICIkbmFtZSIKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiBcCisJICAgICJnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisJICAgICBzdm4gdXAgJFNWTl9UUkVFICYmCisJICAgICB0ZXN0IC14ICRTVk5fVFJFRS9iYXIvenp6ICYmCisJICAgICB0ZXN0IC1MICRTVk5fVFJFRS9leGVjLTIuc2giCisKKwluYW1lPSdtb2RpZnkgYSBzeW1saW5rIHRvIGJlY29tZSBhIGZpbGUnCisJZWNobyBnaXQgaGVscCA+IGhlbHAgfHwgdHJ1ZQorCXJtIGV4ZWMtMi5zaAorCWNwIGhlbHAgZXhlYy0yLnNoCisJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLTIuc2gKKwlnaXQgY29tbWl0IC1tICIkbmFtZSIKKworCXRlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiBcCisJICAgICJnaXQtc3ZuIGNvbW1pdCAtLWZpbmQtY29waWVzLWhhcmRlciAtLXJtZGlyIHJlbW90ZXMvZ2l0LXN2bi4ubXlicmFuY2g1ICYmCisJICAgICBzdm4gdXAgJFNWTl9UUkVFICYmCisJICAgICB0ZXN0IC1mICRTVk5fVFJFRS9leGVjLTIuc2ggJiYKKwkgICAgIHRlc3QgISAtTCAkU1ZOX1RSRUUvZXhlYy0yLnNoICYmCisJICAgICBkaWZmIC11IGhlbHAgJFNWTl9UUkVFL2V4ZWMtMi5zaCIKK2ZpCisKKworaWYgdGVzdCAiJGhhdmVfdXRmOCIgPSB0Cit0aGVuCisJbmFtZT0iY29tbWl0IHdpdGggVVRGLTggbWVzc2FnZTogbG9jYWxlOiAkR0lUX1NWTl9MQ19BTEwiCisJZWNobyAnIyBoZWxsbycgPj4gZXhlYy0yLnNoCisJZ2l0IHVwZGF0ZS1pbmRleCBleGVjLTIuc2gKKwlnaXQgY29tbWl0IC1tICfDqcOv4oiPJworCWV4cG9ydCBMQ19BTEw9IiRHSVRfU1ZOX0xDX0FMTCIKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgImdpdC1zdm4gY29tbWl0IEhFQUQiCisJdW5zZXQgTENfQUxMCitlbHNlCisJZWNobyAiVVRGLTggbG9jYWxlIG5vdCBzZXQsIHRlc3Qgc2tpcHBlZCAoJEdJVF9TVk5fTENfQUxMKSIKK2ZpCisKK25hbWU9J3Rlc3QgZmV0Y2ggZnVuY3Rpb25hbGl0eSAoc3ZuID0+IGdpdCkgd2l0aCBhbHRlcm5hdGUgR0lUX1NWTl9JRCcKK0dJVF9TVk5fSUQ9YWx0CitleHBvcnQgR0lUX1NWTl9JRAordGVzdF9leHBlY3Rfc3VjY2VzcyAiJG5hbWUiIFwKKyAgICAiZ2l0LXN2biBpbml0ICRzdm5yZXBvICYmIGdpdC1zdm4gZmV0Y2ggJiYKKyAgICAgZ2l0LXJldi1saXN0IC0tcHJldHR5PXJhdyByZW1vdGVzL2dpdC1zdm4gfCBncmVwIF50cmVlIHwgdW5pcSA+IGEgJiYKKyAgICAgZ2l0LXJldi1saXN0IC0tcHJldHR5PXJhdyByZW1vdGVzL2FsdCB8IGdyZXAgXnRyZWUgfCB1bmlxID4gYiAmJgorICAgICBkaWZmIC11IGEgYiIKKworaWYgdGVzdCAtbiAiJE5PX1NZTUxJTksiCit0aGVuCisJdGVzdF9kb25lCisJZXhpdCAwCitmaQorCituYW1lPSdjaGVjayBpbXBvcnRlZCB0cmVlIGNoZWNrc3VtcyBleHBlY3RlZCB0cmVlIGNoZWNrc3VtcycKK3JtIC1mIGV4cGVjdGVkCitpZiB0ZXN0ICIkaGF2ZV91dGY4IiA9IHQKK3RoZW4KKwllY2hvIHRyZWUgYmY1MjIzNTM1ODZiMWI4ODM0ODhmMmJjNzNkYWIwZDlmNzc0YjlhOSA+IGV4cGVjdGVkCitmaQorY2F0ID4+IGV4cGVjdGVkIDw8XEVPRgordHJlZSA4MzY1NGJiMzZmMDE5YWU0ZmU3N2EwMTcxZjgxMDc1OTcyMDg3NjI0Cit0cmVlIDAzMWI4ZDU1N2FmYzZmZWE1Mjg5NGVhZWJiNDViZWM1MmYxYmE2ZDEKK3RyZWUgMGIwOTRjYmZmMTcxNjhmMjRjMzAyZTI5N2Y1NWJmYWM2NWViOGJkMwordHJlZSBkNjY3MjcwYTFmN2IxMDlmNWViM2FhZWEyMWVkZTE0YjU2YmZkZDZlCit0cmVlIDU2YTMwYjk2NjYxOWI4NjM2NzRmNTk3ODY5NmY0YTM1OTRmMmZjYTkKK3RyZWUgZDY2NzI3MGExZjdiMTA5ZjVlYjNhYWVhMjFlZGUxNGI1NmJmZGQ2ZQordHJlZSA4ZjUxZjc0Y2YwMTYzYWZjOWFkNjhhNGIxNTM3Mjg4YzQ1NThiNWE0CitFT0YKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgIiRuYW1lIiAiZGlmZiAtdSBhIGV4cGVjdGVkIgorCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDEtZ2l0LXN2bi1wcm9wcy5zaCBiL3QvdDkxMDEtZ2l0LXN2bi1wcm9wcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNWEyMzVmCi0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwMS1naXQtc3ZuLXByb3BzLnNoCkBAIC0wLDAgKzEsMTI2IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2IEVyaWMgV29uZworIworCit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIHByb3BlcnR5IHRlc3RzJworLiAuL2xpYi1naXQtc3ZuLnNoCisKK21rZGlyIGltcG9ydAorCithX2NybGY9CithX2xmPQorYV9jcj0KK2FfbmVfY3JsZj0KK2FfbmVfbGY9CithX25lX2NyPQorYV9lbXB0eT0KK2FfZW1wdHlfbGY9CithX2VtcHR5X2NyPQorYV9lbXB0eV9jcmxmPQorCitjZCBpbXBvcnQKKwljYXQgPj4ga3cuYyA8PFxFT0YKKy8qIFNvbWVib2R5IHByZW1hdHVyZWx5IHB1dCBhIGtleXdvcmQgaW50byB0aGlzIGZpbGUgKi8KKy8qICRJZCQgKi8KK0VPRgorCisJcHJpbnRmICJIZWxsb1xyXG5Xb3JsZFxyXG4iID4gY3JsZgorCWFfY3JsZj1gZ2l0LWhhc2gtb2JqZWN0IC13IGNybGZgCisJcHJpbnRmICJIZWxsb1xyV29ybGRcciIgPiBjcgorCWFfY3I9YGdpdC1oYXNoLW9iamVjdCAtdyBjcmAKKwlwcmludGYgIkhlbGxvXG5Xb3JsZFxuIiA+IGxmCisJYV9sZj1gZ2l0LWhhc2gtb2JqZWN0IC13IGxmYAorCisJcHJpbnRmICJIZWxsb1xyXG5Xb3JsZCIgPiBuZV9jcmxmCisJYV9uZV9jcmxmPWBnaXQtaGFzaC1vYmplY3QgLXcgbmVfY3JsZmAKKwlwcmludGYgIkhlbGxvXG5Xb3JsZCIgPiBuZV9sZgorCWFfbmVfbGY9YGdpdC1oYXNoLW9iamVjdCAtdyBuZV9sZmAKKwlwcmludGYgIkhlbGxvXHJXb3JsZCIgPiBuZV9jcgorCWFfbmVfY3I9YGdpdC1oYXNoLW9iamVjdCAtdyBuZV9jcmAKKworCXRvdWNoIGVtcHR5CisJYV9lbXB0eT1gZ2l0LWhhc2gtb2JqZWN0IC13IGVtcHR5YAorCXByaW50ZiAiXG4iID4gZW1wdHlfbGYKKwlhX2VtcHR5X2xmPWBnaXQtaGFzaC1vYmplY3QgLXcgZW1wdHlfbGZgCisJcHJpbnRmICJcciIgPiBlbXB0eV9jcgorCWFfZW1wdHlfY3I9YGdpdC1oYXNoLW9iamVjdCAtdyBlbXB0eV9jcmAKKwlwcmludGYgIlxyXG4iID4gZW1wdHlfY3JsZgorCWFfZW1wdHlfY3JsZj1gZ2l0LWhhc2gtb2JqZWN0IC13IGVtcHR5X2NybGZgCisKKwlzdm4gaW1wb3J0IC1tICdpbXBvcnQgZm9yIGdpdC1zdm4nIC4gIiRzdm5yZXBvIiA+L2Rldi9udWxsCitjZCAuLgorCitybSAtcmYgaW1wb3J0Cit0ZXN0X2V4cGVjdF9zdWNjZXNzICdjaGVja291dCB3b3JraW5nIGNvcHkgZnJvbSBzdm4nICJzdm4gY28gJHN2bnJlcG8gdGVzdF93YyIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3NldHVwIHNvbWUgY29tbWl0cyB0byBzdm4nIFwKKwknY2QgdGVzdF93YyAmJgorCQllY2hvIEdyZWV0aW5ncyA+PiBrdy5jICYmCisJCXN2biBjb21taXQgLW0gIk5vdCB5ZXQgYW4gSWQiICYmCisJCXN2biB1cCAmJgorCQllY2hvIEhlbGxvIHdvcmxkID4+IGt3LmMgJiYKKwkJc3ZuIGNvbW1pdCAtbSAiTW9kaWZpZWQgZmlsZSwgYnV0IHN0aWxsIG5vdCB5ZXQgYW4gSWQiICYmCisJCXN2biB1cCAmJgorCQlzdm4gcHJvcHNldCBzdm46a2V5d29yZHMgSWQga3cuYyAmJgorCQlzdm4gY29tbWl0IC1tICJQcm9wc2V0IElkIiAmJgorCQlzdm4gdXAgJiYKKwljZCAuLicKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdGlhbGl6ZSBnaXQtc3ZuJyAiZ2l0LXN2biBpbml0ICRzdm5yZXBvIgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggcmV2aXNpb25zIGZyb20gc3ZuJyAnZ2l0LXN2biBmZXRjaCcKKworbmFtZT0ndGVzdCBzdm46a2V5d29yZHMgaWdub3JpbmcnCit0ZXN0X2V4cGVjdF9zdWNjZXNzICIkbmFtZSIgXAorCSdnaXQgY2hlY2tvdXQgLWIgbXlicmFuY2ggcmVtb3Rlcy9naXQtc3ZuICYmCisJZWNobyBIaSBhZ2FpbiA+PiBrdy5jICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAidGVzdCBrZXl3b2FyZHMgaWdub3JpbmciICYmCisJZ2l0LXN2biBjb21taXQgcmVtb3Rlcy9naXQtc3ZuLi5teWJyYW5jaCAmJgorCWdpdCBwdWxsIC4gcmVtb3Rlcy9naXQtc3ZuJworCitleHBlY3Q9Jy8qICRJZCQgKi8nCitnb3Q9ImBzZWQgLW5lIDJwIGt3LmNgIgordGVzdF9leHBlY3Rfc3VjY2VzcyAncmF3ICRJZCQgZm91bmQgaW4ga3cuYycgInRlc3QgJyRleHBlY3QnID0gJyRnb3QnIgorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICJwcm9wc2V0IENSIG9uIGNybGYgZmlsZXMiIFwKKwknY2QgdGVzdF93YyAmJgorCQlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIGVtcHR5ICYmCisJCXN2biBwcm9wc2V0IHN2bjplb2wtc3R5bGUgQ1IgY3JsZiAmJgorCQlzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSIG5lX2NybGYgJiYKKwkJc3ZuIGNvbW1pdCAtbSAicHJvcHNldCBDUiBvbiBjcmxmIGZpbGVzIiAmJgorCQlzdm4gdXAgJiYKKwkgY2QgLi4nCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2ZldGNoIGFuZCBwdWxsIGxhdGVzdCBmcm9tIHN2biBhbmQgY2hlY2tvdXQgYSBuZXcgd2MnIFwKKwkiZ2l0LXN2biBmZXRjaCAmJgorCSBnaXQgcHVsbCAuIHJlbW90ZXMvZ2l0LXN2biAmJgorCSBzdm4gY28gJHN2bnJlcG8gbmV3X3djIgorCitmb3IgaSBpbiBjcmxmIG5lX2NybGYgbGYgbmVfbGYgY3IgbmVfY3IgZW1wdHlfY3IgZW1wdHlfbGYgZW1wdHkgZW1wdHlfY3JsZgorZG8KKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICJDb21wYXJpbmcgJGkiICJjbXAgJGkgbmV3X3djLyRpIgorZG9uZQorCisKK2NkIHRlc3Rfd2MKKwlwcmludGYgJyRJZCRcckhlbGxvXHJXb3JsZFxyJyA+IGNyCisJcHJpbnRmICckSWQkXHJIZWxsb1xyV29ybGQnID4gbmVfY3IKKwlhX2NyPWBwcmludGYgJyRJZCRcclxuSGVsbG9cclxuV29ybGRcclxuJyB8IGdpdC1oYXNoLW9iamVjdCAtLXN0ZGluYAorCWFfbmVfY3I9YHByaW50ZiAnJElkJFxyXG5IZWxsb1xyXG5Xb3JsZCcgfCBnaXQtaGFzaC1vYmplY3QgLS1zdGRpbmAKKwl0ZXN0X2V4cGVjdF9zdWNjZXNzICdTZXQgQ1JMRiBvbiBjciBmaWxlcycgXAorCSdzdm4gcHJvcHNldCBzdm46ZW9sLXN0eWxlIENSTEYgY3IgJiYKKwkgc3ZuIHByb3BzZXQgc3ZuOmVvbC1zdHlsZSBDUkxGIG5lX2NyICYmCisJIHN2biBwcm9wc2V0IHN2bjprZXl3b3JkcyBJZCBjciAmJgorCSBzdm4gcHJvcHNldCBzdm46a2V5d29yZHMgSWQgbmVfY3IgJiYKKwkgc3ZuIGNvbW1pdCAtbSAicHJvcHNldCBDUkxGIG9uIGNyIGZpbGVzIiAmJgorCSBzdm4gdXAnCitjZCAuLgordGVzdF9leHBlY3Rfc3VjY2VzcyAnZmV0Y2ggYW5kIHB1bGwgbGF0ZXN0IGZyb20gc3ZuJyBcCisJJ2dpdC1zdm4gZmV0Y2ggJiYgZ2l0IHB1bGwgLiByZW1vdGVzL2dpdC1zdm4nCisKK2JfY3I9ImBnaXQtaGFzaC1vYmplY3QgY3JgIgorYl9uZV9jcj0iYGdpdC1oYXNoLW9iamVjdCBuZV9jcmAiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NSTEYgKyAkSWQkJyAidGVzdCAnJGFfY3InID0gJyRiX2NyJyIKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ0NSTEYgKyAkSWQkIChubyBuZXdsaW5lKScgInRlc3QgJyRhX25lX2NyJyA9ICckYl9uZV9jciciCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwMi1naXQtc3ZuLWRlZXAtcm1kaXIuc2ggYi90L3Q5MTAyLWdpdC1zdm4tZGVlcC1ybWRpci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjkzZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdC90OTEwMi1naXQtc3ZuLWRlZXAtcm1kaXIuc2gKQEAgLTAsMCArMSwyOSBAQAordGVzdF9kZXNjcmlwdGlvbj0nZ2l0LXN2biBybWRpcicKKy4gLi9saWItZ2l0LXN2bi5zaAorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIHJlcG8nICIKKwlta2RpciBpbXBvcnQgJiYKKwljZCBpbXBvcnQgJiYKKwlta2RpciAtcCBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMSAmJgorCW1rZGlyIC1wIGRlZXBseS9uZXN0ZWQvZGlyZWN0b3J5L251bWJlci8yICYmCisJZWNobyBmb28gPiBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMS9maWxlICYmCisJZWNobyBmb28gPiBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMi9hbm90aGVyICYmCisJc3ZuIGltcG9ydCAtbSAnaW1wb3J0IGZvciBnaXQtc3ZuJyAuICRzdm5yZXBvICYmCisJY2QgLi4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ21pcnJvciB2aWEgZ2l0LXN2bicgIgorCWdpdC1zdm4gaW5pdCAkc3ZucmVwbyAmJgorCWdpdC1zdm4gZmV0Y2ggJiYKKwlnaXQgY2hlY2tvdXQgLWYgLWIgdGVzdC1ybWRpciByZW1vdGVzL2dpdC1zdm4KKwkiCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ1RyeSBhIGNvbW1pdCBvbiBybWRpcicgIgorCWdpdCBybSAtZiBkZWVwbHkvbmVzdGVkL2RpcmVjdG9yeS9udW1iZXIvMi9hbm90aGVyICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAncmVtb3ZlIGFub3RoZXInICYmCisJZ2l0LXN2biBjb21taXQgLS1ybWRpciBIRUFEICYmCisJc3ZuIGxzIC1SICRzdm5yZXBvIHwgZ3JlcCBeZGVlcGx5L25lc3RlZC9kaXJlY3RvcnkvbnVtYmVyLzEKKwkiCisKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Q5MTAzLWdpdC1zdm4tZ3JhZnQtYnJhbmNoZXMuc2ggYi90L3Q5MTAzLWdpdC1zdm4tZ3JhZnQtYnJhbmNoZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2M2MmQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDMtZ2l0LXN2bi1ncmFmdC1icmFuY2hlcy5zaApAQCAtMCwwICsxLDYzIEBACit0ZXN0X2Rlc2NyaXB0aW9uPSdnaXQtc3ZuIGdyYWZ0LWJyYW5jaGVzJworLiAuL2xpYi1naXQtc3ZuLnNoCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXRpYWxpemUgcmVwbycgIgorCW1rZGlyIGltcG9ydCAmJgorCWNkIGltcG9ydCAmJgorCW1rZGlyIC1wIHRydW5rIGJyYW5jaGVzIHRhZ3MgJiYKKwllY2hvIGhlbGxvID4gdHJ1bmsvcmVhZG1lICYmCisJc3ZuIGltcG9ydCAtbSAnaW1wb3J0IGZvciBnaXQtc3ZuJyAuICRzdm5yZXBvICYmCisJY2QgLi4gJiYKKwlzdm4gY3AgLW0gJ3RhZyBhJyAkc3ZucmVwby90cnVuayAkc3ZucmVwby90YWdzL2EgJiYKKwlzdm4gY3AgLW0gJ2JyYW5jaCBhJyAkc3ZucmVwby90cnVuayAkc3ZucmVwby9icmFuY2hlcy9hICYmCisJc3ZuIGNvICRzdm5yZXBvIHdjICYmCisJY2Qgd2MgJiYKKwllY2hvIGZlZWRtZSA+PiBicmFuY2hlcy9hL3JlYWRtZSAmJgorCXN2biBjb21taXQgLW0gaHVuZ3J5ICYmCisJc3ZuIHVwICYmCisJY2QgdHJ1bmsgJiYKKwlzdm4gbWVyZ2UgLXIzOjQgJHN2bnJlcG8vYnJhbmNoZXMvYSAmJgorCXN2biBjb21taXQgLW0gJ21lcmdlIHdpdGggYScgJiYKKwljZCAuLi8uLiAmJgorCXN2biBsb2cgLXYgJHN2bnJlcG8gJiYKKwlnaXQtc3ZuIGluaXQgLWkgdHJ1bmsgJHN2bnJlcG8vdHJ1bmsgJiYKKwlnaXQtc3ZuIGluaXQgLWkgYSAkc3ZucmVwby9icmFuY2hlcy9hICYmCisJZ2l0LXN2biBpbml0IC1pIHRhZ3MvYSAkc3ZucmVwby90YWdzL2EgJiYKKwlnaXQtc3ZuIGZldGNoIC1pIHRhZ3MvYSAmJgorCWdpdC1zdm4gZmV0Y2ggLWkgYSAmJgorCWdpdC1zdm4gZmV0Y2ggLWkgdHJ1bmsKKwkiCisKK3IxPWBnaXQtcmV2LWxpc3QgcmVtb3Rlcy90cnVuayB8IHRhaWwgLW4xYAorcjI9YGdpdC1yZXYtbGlzdCByZW1vdGVzL3RhZ3MvYSB8IHRhaWwgLW4xYAorcjM9YGdpdC1yZXYtbGlzdCByZW1vdGVzL2EgfCB0YWlsIC1uMWAKK3I0PWBnaXQtcmV2LWxpc3QgcmVtb3Rlcy9hIHwgaGVhZCAtbjFgCityNT1gZ2l0LXJldi1saXN0IHJlbW90ZXMvdHJ1bmsgfCBoZWFkIC1uMWAKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAndGVzdCBncmFmdC1icmFuY2hlcyByZWdleGVzIGFuZCBjb3BpZXMnICIKKwl0ZXN0IC1uICIkcjEiICYmCisJdGVzdCAtbiAiJHIyIiAmJgorCXRlc3QgLW4gIiRyMyIgJiYKKwl0ZXN0IC1uICIkcjQiICYmCisJdGVzdCAtbiAiJHI1IiAmJgorCWdpdC1zdm4gZ3JhZnQtYnJhbmNoZXMgJiYKKwlncmVwICdeJHIyICRyMScgJEdJVF9ESVIvaW5mby9ncmFmdHMgJiYKKwlncmVwICdeJHIzICRyMScgJEdJVF9ESVIvaW5mby9ncmFmdHMgJiYKKwlncmVwICdeJHI1ICcgJEdJVF9ESVIvaW5mby9ncmFmdHMgfCBncmVwICckcjQnIHwgZ3JlcCAnJHIxJworCSIKKwordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCAmIHNsZWVwIDEnCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ3Rlc3QgZ3JhZnQtYnJhbmNoZXMgd2l0aCB0cmVlLWpvaW5zJyAiCisJcm0gJEdJVF9ESVIvaW5mby9ncmFmdHMgJiYKKwlnaXQtc3ZuIGdyYWZ0LWJyYW5jaGVzIC0tbm8tZGVmYXVsdC1yZWdleCAtLW5vLWdyYWZ0LWNvcHkgLUIgJiYKKwlncmVwICdeJHIzICcgJEdJVF9ESVIvaW5mby9ncmFmdHMgfCBncmVwICckcjEnIHwgZ3JlcCAnJHIyJyAmJgorCWdyZXAgJ14kcjIgJHIxJyAkR0lUX0RJUi9pbmZvL2dyYWZ0cyAmJgorCWdyZXAgJ14kcjUgJyAkR0lUX0RJUi9pbmZvL2dyYWZ0cyB8IGdyZXAgJyRyMScgfCBncmVwICckcjQnCisJIgorCisjIHRoZSByZXN1bHQgb2YgdGhpcyBpcyBraW5kYSBmdW5reSwgd2UgaGF2ZSBhIHN0cmFuZ2UgaGlzdG9yeSBhbmQKKyMgdGhpcyBpcyBqdXN0IGEgdGVzdCA6KQordGVzdF9kZWJ1ZyAnZ2l0ayAtLWFsbCAmJworCit0ZXN0X2RvbmUKZGlmZiAtLWdpdCBhL3QvdDkxMDQtZ2l0LXN2bi1mb2xsb3ctcGFyZW50LnNoIGIvdC90OTEwNC1naXQtc3ZuLWZvbGxvdy1wYXJlbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDE0ODhmZgotLS0gL2Rldi9udWxsCisrKyBiL3QvdDkxMDQtZ2l0LXN2bi1mb2xsb3ctcGFyZW50LnNoCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYgRXJpYyBXb25nCisjCisKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gLS1mb2xsb3ctcGFyZW50IGZldGNoaW5nJworLiAuL2xpYi1naXQtc3ZuLnNoCisKK2lmIHRlc3QgLW4gIiRHSVRfU1ZOX05PX0xJQiIgJiYgdGVzdCAiJEdJVF9TVk5fTk9fTElCIiAtbmUgMAordGhlbgorCWVjaG8gJ1NraXBwaW5nOiAtLWZvbGxvdy1wYXJlbnQgbmVlZHMgU1ZOIGxpYnJhcmllcycKKwl0ZXN0X2RvbmUKKwlleGl0IDAKK2ZpCisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgJ2luaXRpYWxpemUgcmVwbycgIgorCW1rZGlyIGltcG9ydCAmJgorCWNkIGltcG9ydCAmJgorCW1rZGlyIC1wIHRydW5rICYmCisJZWNobyBoZWxsbyA+IHRydW5rL3JlYWRtZSAmJgorCXN2biBpbXBvcnQgLW0gJ2luaXRpYWwnIC4gJHN2bnJlcG8gJiYKKwljZCAuLiAmJgorCXN2biBjbyAkc3ZucmVwbyB3YyAmJgorCWNkIHdjICYmCisJZWNobyB3b3JsZCA+PiB0cnVuay9yZWFkbWUgJiYKKwlzdm4gY29tbWl0IC1tICdhbm90aGVyIGNvbW1pdCcgJiYKKwlzdm4gdXAgJiYKKwlzdm4gbXYgLW0gJ3JlbmFtZSB0byB0aHVuaycgdHJ1bmsgdGh1bmsgJiYKKwlzdm4gdXAgJiYKKwllY2hvIGdvb2RieWUgPj4gdGh1bmsvcmVhZG1lICYmCisJc3ZuIGNvbW1pdCAtbSAnYnllIG5vdycgJiYKKwljZCAuLgorCSIKKwordGVzdF9leHBlY3Rfc3VjY2VzcyAnaW5pdCBhbmQgZmV0Y2ggLS1mb2xsb3ctcGFyZW50IGEgbW92ZWQgZGlyZWN0b3J5JyAiCisJZ2l0LXN2biBpbml0IC1pIHRodW5rICRzdm5yZXBvL3RodW5rICYmCisJZ2l0LXN2biBmZXRjaCAtLWZvbGxvdy1wYXJlbnQgLWkgdGh1bmsgJiYKKwlnaXQtcmV2LXBhcnNlIC0tdmVyaWZ5IHJlZnMvcmVtb3Rlcy90cnVuayAmJgorCXRlc3QgJyQ/JyAtZXEgJzAnCisJIgorCit0ZXN0X2RlYnVnICdnaXRrIC0tYWxsICYnCisKK3Rlc3RfZG9uZQpkaWZmIC0tZ2l0IGEvdC90OTEwNS1naXQtc3ZuLWNvbW1pdC1kaWZmLnNoIGIvdC90OTEwNS1naXQtc3ZuLWNvbW1pdC1kaWZmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5OTRiNzIKLS0tIC9kZXYvbnVsbAorKysgYi90L3Q5MTA1LWdpdC1zdm4tY29tbWl0LWRpZmYuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBFcmljIFdvbmcKK3Rlc3RfZGVzY3JpcHRpb249J2dpdC1zdm4gY29tbWl0LWRpZmYnCisuIC4vbGliLWdpdC1zdm4uc2gKKworaWYgdGVzdCAtbiAiJEdJVF9TVk5fTk9fTElCIiAmJiB0ZXN0ICIkR0lUX1NWTl9OT19MSUIiIC1uZSAwCit0aGVuCisJZWNobyAnU2tpcHBpbmc6IGNvbW1pdC1kaWZmIG5lZWRzIFNWTiBsaWJyYXJpZXMnCisJdGVzdF9kb25lCisJZXhpdCAwCitmaQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICdpbml0aWFsaXplIHJlcG8nICIKKwlta2RpciBpbXBvcnQgJiYKKwljZCBpbXBvcnQgJiYKKwllY2hvIGhlbGxvID4gcmVhZG1lICYmCisJc3ZuIGltcG9ydCAtbSAnaW5pdGlhbCcgLiAkc3ZucmVwbyAmJgorCWNkIC4uICYmCisJZWNobyBoZWxsbyA+IHJlYWRtZSAmJgorCWdpdCB1cGRhdGUtaW5kZXggLS1hZGQgcmVhZG1lICYmCisJZ2l0IGNvbW1pdCAtYSAtbSAnaW5pdGlhbCcgJiYKKwllY2hvIHdvcmxkID4+IHJlYWRtZSAmJgorCWdpdCBjb21taXQgLWEgLW0gJ2Fub3RoZXInCisJIgorCitoZWFkPWBnaXQgcmV2LXBhcnNlIC0tdmVyaWZ5IEhFQUReMGAKK3ByZXY9YGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRF4xYAorCisjIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGNvbW1pdC1kaWZmIGNvbW1hbmQgYXJlIHRoZSBzYW1lIGFzIHRoZSByZWd1bGFyCisjIGNvbW1pdCwgc28gb25seSBhIGJhc2ljIHRlc3Qgb2YgZnVuY3Rpb25hbGl0eSBpcyBuZWVkZWQgc2luY2Ugd2UndmUKKyMgYWxyZWFkeSB0ZXN0ZWQgY29tbWl0IGV4dGVuc2l2ZWx5IGVsc2V3aGVyZQorCit0ZXN0X2V4cGVjdF9zdWNjZXNzICd0ZXN0IHRoZSBjb21taXQtZGlmZiBjb21tYW5kJyAiCisJdGVzdCAtbiAnJHByZXYnICYmIHRlc3QgLW4gJyRoZWFkJyAmJgorCWdpdC1zdm4gY29tbWl0LWRpZmYgJyRwcmV2JyAnJGhlYWQnICckc3ZucmVwbycgJiYKKwlzdm4gY28gJHN2bnJlcG8gd2MgJiYKKwljbXAgcmVhZG1lIHdjL3JlYWRtZQorCSIKKwordGVzdF9kb25lCmRpZmYgLS1naXQgYS90L3Rlc3QtbGliLnNoIGIvdC90ZXN0LWxpYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NzBhOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdC90ZXN0LWxpYi5zaApAQCAtMCwwICsxLDIyMSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBKdW5pbyBDIEhhbWFubworIworCisjIEZvciByZXBlYXRhYmlsaXR5LCByZXNldCB0aGUgZW52aXJvbm1lbnQgdG8ga25vd24gdmFsdWUuCitMQU5HPUMKK0xDX0FMTD1DCitQQUdFUj1jYXQKK1RaPVVUQworZXhwb3J0IExBTkcgTENfQUxMIFBBR0VSIFRaCitFRElUT1I9OgorVklTVUFMPToKK3Vuc2V0IEFVVEhPUl9EQVRFCit1bnNldCBBVVRIT1JfRU1BSUwKK3Vuc2V0IEFVVEhPUl9OQU1FCit1bnNldCBDT01NSVRfQVVUSE9SX0VNQUlMCit1bnNldCBDT01NSVRfQVVUSE9SX05BTUUKK3Vuc2V0IEdJVF9BTFRFUk5BVEVfT0JKRUNUX0RJUkVDVE9SSUVTCit1bnNldCBHSVRfQVVUSE9SX0RBVEUKK0dJVF9BVVRIT1JfRU1BSUw9YXV0aG9yQGV4YW1wbGUuY29tCitHSVRfQVVUSE9SX05BTUU9J0EgVSBUaG9yJwordW5zZXQgR0lUX0NPTU1JVFRFUl9EQVRFCitHSVRfQ09NTUlUVEVSX0VNQUlMPWNvbW1pdHRlckBleGFtcGxlLmNvbQorR0lUX0NPTU1JVFRFUl9OQU1FPSdDIE8gTWl0dGVyJwordW5zZXQgR0lUX0RJRkZfT1BUUwordW5zZXQgR0lUX0RJUgordW5zZXQgR0lUX0VYVEVSTkFMX0RJRkYKK3Vuc2V0IEdJVF9JTkRFWF9GSUxFCit1bnNldCBHSVRfT0JKRUNUX0RJUkVDVE9SWQordW5zZXQgR0lUX1RSQUNFCit1bnNldCBTSEExX0ZJTEVfRElSRUNUT1JJRVMKK3Vuc2V0IFNIQTFfRklMRV9ESVJFQ1RPUlkKK2V4cG9ydCBHSVRfQVVUSE9SX0VNQUlMIEdJVF9BVVRIT1JfTkFNRQorZXhwb3J0IEdJVF9DT01NSVRURVJfRU1BSUwgR0lUX0NPTU1JVFRFUl9OQU1FCitleHBvcnQgRURJVE9SIFZJU1VBTAorCisjIEVhY2ggdGVzdCBzaG91bGQgc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGlzLCBhZnRlciBjb3B5cmlnaHQgbm90aWNlczoKKyMKKyMgdGVzdF9kZXNjcmlwdGlvbj0nRGVzY3JpcHRpb24gb2YgdGhpcyB0ZXN0Li4uCisjIFRoaXMgdGVzdCBjaGVja3MgaWYgY29tbWFuZCB4eXp6eSBkb2VzIHRoZSByaWdodCB0aGluZy4uLgorIyAnCisjIC4gLi90ZXN0LWxpYi5zaAorCitlcnJvciAoKSB7CisJZWNobyAiKiBlcnJvcjogJCoiCisJdHJhcCAtIGV4aXQKKwlleGl0IDEKK30KKworc2F5ICgpIHsKKwllY2hvICIqICQqIgorfQorCit0ZXN0ICIke3Rlc3RfZGVzY3JpcHRpb259IiAhPSAiIiB8fAorZXJyb3IgIlRlc3Qgc2NyaXB0IGRpZCBub3Qgc2V0IHRlc3RfZGVzY3JpcHRpb24uIgorCit3aGlsZSB0ZXN0ICIkIyIgLW5lIDAKK2RvCisJY2FzZSAiJDEiIGluCisJLWR8LS1kfC0tZGV8LS1kZWJ8LS1kZWJ1fC0tZGVidWcpCisJCWRlYnVnPXQ7IHNoaWZ0IDs7CisJLWl8LS1pfC0taW18LS1pbW18LS1pbW1lfC0taW1tZWR8LS1pbW1lZGl8LS1pbW1lZGlhfC0taW1tZWRpYXR8LS1pbW1lZGlhdGUpCisJCWltbWVkaWF0ZT10OyBzaGlmdCA7OworCS1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKKwkJZWNobyAiJHRlc3RfZGVzY3JpcHRpb24iCisJCWV4aXQgMCA7OworCS12fC0tdnwtLXZlfC0tdmVyfC0tdmVyYnwtLXZlcmJvfC0tdmVyYm9zfC0tdmVyYm9zZSkKKwkJdmVyYm9zZT10OyBzaGlmdCA7OworCS0tbm8tcHl0aG9uKQorCQlub19weXRob249dDsgc2hpZnQgOzsKKwkqKQorCQlicmVhayA7OworCWVzYWMKK2RvbmUKKworZXhlYyA1PiYxCitpZiB0ZXN0ICIkdmVyYm9zZSIgPSAidCIKK3RoZW4KKwlleGVjIDQ+JjIgMz4mMQorZWxzZQorCWV4ZWMgND4vZGV2L251bGwgMz4vZGV2L251bGwKK2ZpCisKK3Rlc3RfZmFpbHVyZT0wCit0ZXN0X2NvdW50PTAKKwordHJhcCAnZWNobyA+JjUgIkZBVEFMOiBVbmV4cGVjdGVkIGV4aXQgd2l0aCBjb2RlICQ/IjsgZXhpdCAxJyBleGl0CisKKworIyBZb3UgYXJlIG5vdCBleHBlY3RlZCB0byBjYWxsIHRlc3Rfb2tfIGFuZCB0ZXN0X2ZhaWx1cmVfIGRpcmVjdGx5LCB1c2UKKyMgdGhlIHRleHRfZXhwZWN0XyogZnVuY3Rpb25zIGluc3RlYWQuCisKK3Rlc3Rfb2tfICgpIHsKKwl0ZXN0X2NvdW50PSQoZXhwciAiJHRlc3RfY291bnQiICsgMSkKKwlzYXkgIiAgb2sgJHRlc3RfY291bnQ6ICRAIgorfQorCit0ZXN0X2ZhaWx1cmVfICgpIHsKKwl0ZXN0X2NvdW50PSQoZXhwciAiJHRlc3RfY291bnQiICsgMSkKKwl0ZXN0X2ZhaWx1cmU9JChleHByICIkdGVzdF9mYWlsdXJlIiArIDEpOworCXNheSAiRkFJTCAkdGVzdF9jb3VudDogJDEiCisJc2hpZnQKKwllY2hvICIkQCIgfCBzZWQgLWUgJ3MvXi8JLycKKwl0ZXN0ICIkaW1tZWRpYXRlIiA9ICIiIHx8IHsgdHJhcCAtIGV4aXQ7IGV4aXQgMTsgfQorfQorCisKK3Rlc3RfZGVidWcgKCkgeworCXRlc3QgIiRkZWJ1ZyIgPSAiIiB8fCBldmFsICIkMSIKK30KKwordGVzdF9ydW5fICgpIHsKKwlldmFsID4mMyAyPiY0ICIkMSIKKwlldmFsX3JldD0iJD8iCisJcmV0dXJuIDAKK30KKwordGVzdF9leHBlY3RfZmFpbHVyZSAoKSB7CisJdGVzdCAiJCMiID0gMiB8fAorCWVycm9yICJidWcgaW4gdGhlIHRlc3Qgc2NyaXB0OiBub3QgMiBwYXJhbWV0ZXJzIHRvIHRlc3QtZXhwZWN0LWZhaWx1cmUiCisJc2F5ID4mMyAiZXhwZWN0aW5nIGZhaWx1cmU6ICQyIgorCXRlc3RfcnVuXyAiJDIiCisJaWYgWyAiJD8iID0gMCAtYSAiJGV2YWxfcmV0IiAhPSAwIF0KKwl0aGVuCisJCXRlc3Rfb2tfICIkMSIKKwllbHNlCisJCXRlc3RfZmFpbHVyZV8gIiRAIgorCWZpCit9CisKK3Rlc3RfZXhwZWN0X3N1Y2Nlc3MgKCkgeworCXRlc3QgIiQjIiA9IDIgfHwKKwllcnJvciAiYnVnIGluIHRoZSB0ZXN0IHNjcmlwdDogbm90IDIgcGFyYW1ldGVycyB0byB0ZXN0LWV4cGVjdC1zdWNjZXNzIgorCXNheSA+JjMgImV4cGVjdGluZyBzdWNjZXNzOiAkMiIKKwl0ZXN0X3J1bl8gIiQyIgorCWlmIFsgIiQ/IiA9IDAgLWEgIiRldmFsX3JldCIgPSAwIF0KKwl0aGVuCisJCXRlc3Rfb2tfICIkMSIKKwllbHNlCisJCXRlc3RfZmFpbHVyZV8gIiRAIgorCWZpCit9CisKK3Rlc3RfZXhwZWN0X2NvZGUgKCkgeworCXRlc3QgIiQjIiA9IDMgfHwKKwllcnJvciAiYnVnIGluIHRoZSB0ZXN0IHNjcmlwdDogbm90IDMgcGFyYW1ldGVycyB0byB0ZXN0LWV4cGVjdC1jb2RlIgorCXNheSA+JjMgImV4cGVjdGluZyBleGl0IGNvZGUgJDE6ICQzIgorCXRlc3RfcnVuXyAiJDMiCisJaWYgWyAiJD8iID0gMCAtYSAiJGV2YWxfcmV0IiA9ICIkMSIgXQorCXRoZW4KKwkJdGVzdF9va18gIiQyIgorCWVsc2UKKwkJdGVzdF9mYWlsdXJlXyAiJEAiCisJZmkKK30KKworIyBNb3N0IHRlc3RzIGNhbiB1c2UgdGhlIGNyZWF0ZWQgcmVwb3NpdG9yeSwgYnV0IHNvbWUgYW15IG5lZWQgdG8gY3JlYXRlIG1vcmUuCisjIFVzYWdlOiB0ZXN0X2NyZWF0ZV9yZXBvIDxkaXJlY3Rvcnk+Cit0ZXN0X2NyZWF0ZV9yZXBvICgpIHsKKwl0ZXN0ICIkIyIgPSAxIHx8CisJZXJyb3IgImJ1ZyBpbiB0aGUgdGVzdCBzY3JpcHQ6IG5vdCAxIHBhcmFtZXRlciB0byB0ZXN0LWNyZWF0ZS1yZXBvIgorCW93ZD1gcHdkYAorCXJlcG89IiQxIgorCW1rZGlyICIkcmVwbyIKKwljZCAiJHJlcG8iIHx8IGVycm9yICJDYW5ub3Qgc2V0dXAgdGVzdCBlbnZpcm9ubWVudCIKKwkiJEdJVF9FWEVDX1BBVEgvZ2l0IiBpbml0LWRiIC0tdGVtcGxhdGU9JEdJVF9FWEVDX1BBVEgvdGVtcGxhdGVzL2JsdC8gMj4vZGV2L251bGwgfHwKKwllcnJvciAiY2Fubm90IHJ1biBnaXQgaW5pdC1kYiAtLSBoYXZlIHlvdSBidWlsdCB0aGluZ3MgeWV0PyIKKwltdiAuZ2l0L2hvb2tzIC5naXQvaG9va3MtZGlzYWJsZWQKKwljZCAiJG93ZCIKK30KKwkKK3Rlc3RfZG9uZSAoKSB7CisJdHJhcCAtIGV4aXQKKwljYXNlICIkdGVzdF9mYWlsdXJlIiBpbgorCTApCisJCSMgV2UgY291bGQ6CisJCSMgY2QgLi4gJiYgcm0gLWZyIHRyYXNoCisJCSMgYnV0IHRoYXQgbWVhbnMgd2UgZm9yYmlkIGFueSB0ZXN0cyB0aGF0IHVzZSB0aGVpciBvd24KKwkJIyBzdWJkaXJlY3RvcnkgZnJvbSBjYWxsaW5nIHRlc3RfZG9uZSB3aXRob3V0IGNvbWluZyBiYWNrCisJCSMgdG8gd2hlcmUgdGhleSBzdGFydGVkIGZyb20uCisJCSMgVGhlIE1ha2VmaWxlIHByb3ZpZGVkIHdpbGwgY2xlYW4gdGhpcyB0ZXN0IGFyZWEgc28KKwkJIyB3ZSB3aWxsIGxlYXZlIHRoaW5ncyBhcyB0aGV5IGFyZS4KKworCQlzYXkgInBhc3NlZCBhbGwgJHRlc3RfY291bnQgdGVzdChzKSIKKwkJZXhpdCAwIDs7CisKKwkqKQorCQlzYXkgImZhaWxlZCAkdGVzdF9mYWlsdXJlIGFtb25nICR0ZXN0X2NvdW50IHRlc3QocykiCisJCWV4aXQgMSA7OworCisJZXNhYworfQorCisjIFRlc3QgdGhlIGJpbmFyaWVzIHdlIGhhdmUganVzdCBidWlsdC4gIFRoZSB0ZXN0cyBhcmUga2VwdCBpbgorIyB0LyBzdWJkaXJlY3RvcnkgYW5kIGFyZSBydW4gaW4gdHJhc2ggc3ViZGlyZWN0b3J5LgorUEFUSD0kKHB3ZCkvLi46JFBBVEgKK0dJVF9FWEVDX1BBVEg9JChwd2QpLy4uCitleHBvcnQgUEFUSCBHSVRfRVhFQ19QQVRICisKKyMgU2ltaWxhcmx5IHVzZSAuLi9jb21wYXQvc3VicHJvY2Vzcy5weSBpZiBvdXIgcHl0aG9uIGRvZXMgbm90CisjIGhhdmUgc3VicHJvY2Vzcy5weSBvbiBpdHMgb3duLgorUFlUSE9OPWBzZWQgLWUgJzF7CisJcy9eIyEvLworCXEKK30nIC4uL2dpdC1tZXJnZS1yZWN1cnNpdmVgIHx8IHsKKwllcnJvciAiWW91IGhhdmVuJ3QgYnVpbHQgdGhpbmdzIHlldCwgaGF2ZSB5b3U/IgorfQorIiRQWVRIT04iIC1jICdpbXBvcnQgc3VicHJvY2VzcycgMj4vZGV2L251bGwgfHwgeworCVBZVEhPTlBBVEg9JChwd2QpLy4uL2NvbXBhdAorCWV4cG9ydCBQWVRIT05QQVRICit9Cit0ZXN0IC1kIC4uL3RlbXBsYXRlcy9ibHQgfHwgeworCWVycm9yICJZb3UgaGF2ZW4ndCBidWlsdCB0aGluZ3MgeWV0LCBoYXZlIHlvdT8iCit9CisKKyMgVGVzdCByZXBvc2l0b3J5Cit0ZXN0PXRyYXNoCitybSAtZnIgIiR0ZXN0IgordGVzdF9jcmVhdGVfcmVwbyAkdGVzdAorY2QgIiR0ZXN0IgpkaWZmIC0tZ2l0IGEvdC90ZXN0NDAxMi5wbmcgYi90L3Rlc3Q0MDEyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE4MWQxCi0tLSAvZGV2L251bGwKKysrIGIvdC90ZXN0NDAxMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGFnLmMgYi90YWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRhYzFiCi0tLSAvZGV2L251bGwKKysrIGIvdGFnLmMKQEAgLTAsMCArMSwxMDcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInRhZy5oIgorCitjb25zdCBjaGFyICp0YWdfdHlwZSA9ICJ0YWciOworCitzdHJ1Y3Qgb2JqZWN0ICpkZXJlZl90YWcoc3RydWN0IG9iamVjdCAqbywgY29uc3QgY2hhciAqd2FybiwgaW50IHdhcm5sZW4pCit7CisJd2hpbGUgKG8gJiYgby0+dHlwZSA9PSBPQkpfVEFHKQorCQlvID0gcGFyc2Vfb2JqZWN0KCgoc3RydWN0IHRhZyAqKW8pLT50YWdnZWQtPnNoYTEpOworCWlmICghbyAmJiB3YXJuKSB7CisJCWlmICghd2FybmxlbikKKwkJCXdhcm5sZW4gPSBzdHJsZW4od2Fybik7CisJCWVycm9yKCJtaXNzaW5nIG9iamVjdCByZWZlcmVuY2VkIGJ5ICclLipzJyIsIHdhcm5sZW4sIHdhcm4pOworCX0KKwlyZXR1cm4gbzsKK30KKworc3RydWN0IHRhZyAqbG9va3VwX3RhZyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKQoreworICAgICAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBsb29rdXBfb2JqZWN0KHNoYTEpOworICAgICAgICBpZiAoIW9iaikgeworICAgICAgICAgICAgICAgIHN0cnVjdCB0YWcgKnJldCA9IGFsbG9jX3RhZ19ub2RlKCk7CisgICAgICAgICAgICAgICAgY3JlYXRlZF9vYmplY3Qoc2hhMSwgJnJldC0+b2JqZWN0KTsKKyAgICAgICAgICAgICAgICByZXQtPm9iamVjdC50eXBlID0gT0JKX1RBRzsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IE9CSl9UQUc7CisgICAgICAgIGlmIChvYmotPnR5cGUgIT0gT0JKX1RBRykgeworICAgICAgICAgICAgICAgIGVycm9yKCJPYmplY3QgJXMgaXMgYSAlcywgbm90IGEgdHJlZSIsCisgICAgICAgICAgICAgICAgICAgICAgc2hhMV90b19oZXgoc2hhMSksIHR5cGVuYW1lKG9iai0+dHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoc3RydWN0IHRhZyAqKSBvYmo7Cit9CisKK2ludCBwYXJzZV90YWdfYnVmZmVyKHN0cnVjdCB0YWcgKml0ZW0sIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgdHlwZWxlbiwgdGFnbGVuOworCXVuc2lnbmVkIGNoYXIgb2JqZWN0WzIwXTsKKwljb25zdCBjaGFyICp0eXBlX2xpbmUsICp0YWdfbGluZSwgKnNpZ19saW5lOworCWNoYXIgdHlwZVsyMF07CisKKyAgICAgICAgaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGl0ZW0tPm9iamVjdC5wYXJzZWQgPSAxOworCisJaWYgKHNpemUgPCA2NCkKKwkJcmV0dXJuIC0xOworCWlmIChtZW1jbXAoIm9iamVjdCAiLCBkYXRhLCA3KSB8fCBnZXRfc2hhMV9oZXgoKGNoYXIgKikgZGF0YSArIDcsIG9iamVjdCkpCisJCXJldHVybiAtMTsKKworCXR5cGVfbGluZSA9IChjaGFyICopIGRhdGEgKyA0ODsKKwlpZiAobWVtY21wKCJcbnR5cGUgIiwgdHlwZV9saW5lLTEsIDYpKQorCQlyZXR1cm4gLTE7CisKKwl0YWdfbGluZSA9IHN0cmNocih0eXBlX2xpbmUsICdcbicpOworCWlmICghdGFnX2xpbmUgfHwgbWVtY21wKCJ0YWcgIiwgKyt0YWdfbGluZSwgNCkpCisJCXJldHVybiAtMTsKKworCXNpZ19saW5lID0gc3RyY2hyKHRhZ19saW5lLCAnXG4nKTsKKwlpZiAoIXNpZ19saW5lKQorCQlyZXR1cm4gLTE7CisJc2lnX2xpbmUrKzsKKworCXR5cGVsZW4gPSB0YWdfbGluZSAtIHR5cGVfbGluZSAtIHN0cmxlbigidHlwZSBcbiIpOworCWlmICh0eXBlbGVuID49IDIwKQorCQlyZXR1cm4gLTE7CisJbWVtY3B5KHR5cGUsIHR5cGVfbGluZSArIDUsIHR5cGVsZW4pOworCXR5cGVbdHlwZWxlbl0gPSAnXDAnOworCXRhZ2xlbiA9IHNpZ19saW5lIC0gdGFnX2xpbmUgLSBzdHJsZW4oInRhZyBcbiIpOworCWl0ZW0tPnRhZyA9IHhtYWxsb2ModGFnbGVuICsgMSk7CisJbWVtY3B5KGl0ZW0tPnRhZywgdGFnX2xpbmUgKyA0LCB0YWdsZW4pOworCWl0ZW0tPnRhZ1t0YWdsZW5dID0gJ1wwJzsKKworCWl0ZW0tPnRhZ2dlZCA9IGxvb2t1cF9vYmplY3RfdHlwZShvYmplY3QsIHR5cGUpOworCWlmIChpdGVtLT50YWdnZWQgJiYgdHJhY2tfb2JqZWN0X3JlZnMpIHsKKwkJc3RydWN0IG9iamVjdF9yZWZzICpyZWZzID0gYWxsb2Nfb2JqZWN0X3JlZnMoMSk7CisJCXJlZnMtPnJlZlswXSA9IGl0ZW0tPnRhZ2dlZDsKKwkJc2V0X29iamVjdF9yZWZzKCZpdGVtLT5vYmplY3QsIHJlZnMpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfdGFnKHN0cnVjdCB0YWcgKml0ZW0pCit7CisJY2hhciB0eXBlWzIwXTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0OworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWRhdGEgPSByZWFkX3NoYTFfZmlsZShpdGVtLT5vYmplY3Quc2hhMSwgdHlwZSwgJnNpemUpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIGVycm9yKCJDb3VsZCBub3QgcmVhZCAlcyIsCisJCQkgICAgIHNoYTFfdG9faGV4KGl0ZW0tPm9iamVjdC5zaGExKSk7CisJaWYgKHN0cmNtcCh0eXBlLCB0YWdfdHlwZSkpIHsKKwkJZnJlZShkYXRhKTsKKwkJcmV0dXJuIGVycm9yKCJPYmplY3QgJXMgbm90IGEgdGFnIiwKKwkJCSAgICAgc2hhMV90b19oZXgoaXRlbS0+b2JqZWN0LnNoYTEpKTsKKwl9CisJcmV0ID0gcGFyc2VfdGFnX2J1ZmZlcihpdGVtLCBkYXRhLCBzaXplKTsKKwlmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90YWcuaCBiL3RhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMGNiMDAKLS0tIC9kZXYvbnVsbAorKysgYi90YWcuaApAQCAtMCwwICsxLDIwIEBACisjaWZuZGVmIFRBR19ICisjZGVmaW5lIFRBR19ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnRhZ190eXBlOworCitzdHJ1Y3QgdGFnIHsKKwlzdHJ1Y3Qgb2JqZWN0IG9iamVjdDsKKwlzdHJ1Y3Qgb2JqZWN0ICp0YWdnZWQ7CisJY2hhciAqdGFnOworCWNoYXIgKnNpZ25hdHVyZTsgLyogbm90IGFjdHVhbGx5IGltcGxlbWVudGVkICovCit9OworCitleHRlcm4gc3RydWN0IHRhZyAqbG9va3VwX3RhZyhjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKK2V4dGVybiBpbnQgcGFyc2VfdGFnX2J1ZmZlcihzdHJ1Y3QgdGFnICppdGVtLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIGludCBwYXJzZV90YWcoc3RydWN0IHRhZyAqaXRlbSk7CitleHRlcm4gc3RydWN0IG9iamVjdCAqZGVyZWZfdGFnKHN0cnVjdCBvYmplY3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOworCisjZW5kaWYgLyogVEFHX0ggKi8KZGlmZiAtLWdpdCBhL3Rhci5oIGIvdGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2NzcwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rhci5oCkBAIC0wLDAgKzEsMjUgQEAKKyNkZWZpbmUgVFlQRUZMQUdfQVVUTwkJJ1wwJworI2RlZmluZSBUWVBFRkxBR19SRUcJCScwJworI2RlZmluZSBUWVBFRkxBR19MTksJCScyJworI2RlZmluZSBUWVBFRkxBR19ESVIJCSc1JworI2RlZmluZSBUWVBFRkxBR19HTE9CQUxfSEVBREVSCSdnJworI2RlZmluZSBUWVBFRkxBR19FWFRfSEVBREVSCSd4JworCitzdHJ1Y3QgdXN0YXJfaGVhZGVyIHsKKwljaGFyIG5hbWVbMTAwXTsJCS8qICAgMCAqLworCWNoYXIgbW9kZVs4XTsJCS8qIDEwMCAqLworCWNoYXIgdWlkWzhdOwkJLyogMTA4ICovCisJY2hhciBnaWRbOF07CQkvKiAxMTYgKi8KKwljaGFyIHNpemVbMTJdOwkJLyogMTI0ICovCisJY2hhciBtdGltZVsxMl07CQkvKiAxMzYgKi8KKwljaGFyIGNoa3N1bVs4XTsJCS8qIDE0OCAqLworCWNoYXIgdHlwZWZsYWdbMV07CS8qIDE1NiAqLworCWNoYXIgbGlua25hbWVbMTAwXTsJLyogMTU3ICovCisJY2hhciBtYWdpY1s2XTsJCS8qIDI1NyAqLworCWNoYXIgdmVyc2lvblsyXTsJLyogMjYzICovCisJY2hhciB1bmFtZVszMl07CQkvKiAyNjUgKi8KKwljaGFyIGduYW1lWzMyXTsJCS8qIDI5NyAqLworCWNoYXIgZGV2bWFqb3JbOF07CS8qIDMyOSAqLworCWNoYXIgZGV2bWlub3JbOF07CS8qIDMzNyAqLworCWNoYXIgcHJlZml4WzE1NV07CS8qIDM0NSAqLworfTsKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy8uZ2l0aWdub3JlIGIvdGVtcGxhdGVzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1OWVjYgotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorYmx0Citib2lsZXJwbGF0ZXMubWFkZQpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL01ha2VmaWxlIGIvdGVtcGxhdGVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMWFlMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NiBAQAorIyBtYWtlIGFuZCBpbnN0YWxsIHNhbXBsZSB0ZW1wbGF0ZXMKKworSU5TVEFMTCA/PSBpbnN0YWxsCitUQVIgPz0gdGFyCitwcmVmaXggPz0gJChIT01FKQordGVtcGxhdGVfZGlyID89ICQocHJlZml4KS9zaGFyZS9naXQtY29yZS90ZW1wbGF0ZXMvCisjIERFU1RESVI9CisKKyMgU2hlbGwgcXVvdGUgKGRvIG5vdCB1c2UgJChjYWxsKSB0byBhY2NvbW9kYXRlIGFuY2llbnQgc2V0dXBzKTsKK0RFU1RESVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKERFU1RESVIpKQordGVtcGxhdGVfZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJCh0ZW1wbGF0ZV9kaXIpKQorCithbGw6IGJvaWxlcnBsYXRlcy5tYWRlIGN1c3RvbQorCisjIFB1dCB0ZW1wbGF0ZXMgdGhhdCBjYW4gYmUgY29waWVkIHN0cmFpZ2h0IGZyb20gdGhlIHNvdXJjZQorIyBpbiBhIGZpbGUgZGlyZWMtLXRvcnktLWZpbGUgaW4gdGhlIHNvdXJjZS4gIFRoZXkgd2lsbCBiZQorIyBqdXN0IGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24uCisKK2Jwc3JjID0gJChmaWx0ZXItb3V0ICV+LCQod2lsZGNhcmQgKi0tKikpCitib2lsZXJwbGF0ZXMubWFkZSA6ICQoYnBzcmMpCisJbHMgKi0tKiAyPi9kZXYvbnVsbCB8IFwKKwl3aGlsZSByZWFkIGJvaWxlcnBsYXRlOyBcCisJZG8gXAorCQljYXNlICIkJGJvaWxlcnBsYXRlIiBpbiAqfikgY29udGludWUgOzsgZXNhYyAmJiBcCisJCWRzdD1gZWNobyAiJCRib2lsZXJwbGF0ZSIgfCBzZWQgLWUgJ3N8XnRoaXN8Lnw7c3wtLXwvfGcnYCAmJiBcCisJCWRpcj1gZXhwciAiJCRkc3QiIDogJ1woLipcKS8nYCAmJiBcCisJCW1rZGlyIC1wIGJsdC8kJGRpciAmJiBcCisJCWNhc2UgIiQkYm9pbGVycGxhdGUiIGluIFwKKwkJKi0tKSA7OyBcCisJCSopIGNwICQkYm9pbGVycGxhdGUgYmx0LyQkZHN0IDs7IFwKKwkJZXNhYyB8fCBleGl0OyBcCisJZG9uZSB8fCBleGl0CisJZGF0ZSA+JEAKKworIyBJZiB5b3UgbmVlZCBidWlsZC10YWlsb3JlZCB0ZW1wbGF0ZXMsIGJ1aWxkIHRoZW0gaW50byBibHQvCisjIGRpcmVjdG9yeSB5b3Vyc2VsZiBoZXJlLgorY3VzdG9tOgorCTogbm8gY3VzdG9tIHRlbXBsYXRlcyB5ZXQKKworY2xlYW46CisJcm0gLXJmIGJsdCBib2lsZXJwbGF0ZXMubWFkZQorCitpbnN0YWxsOiBhbGwKKwkkKElOU1RBTEwpIC1kIC1tNzU1ICckKERFU1RESVJfU1EpJCh0ZW1wbGF0ZV9kaXJfU1EpJworCShjZCBibHQgJiYgJChUQVIpIGNmIC0gLikgfCBcCisJKGNkICckKERFU1RESVJfU1EpJCh0ZW1wbGF0ZV9kaXJfU1EpJyAmJiAkKFRBUikgeGYgLSkKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9icmFuY2hlcy0tIGIvdGVtcGxhdGVzL2JyYW5jaGVzLS0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlODg3MAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9icmFuY2hlcy0tCkBAIC0wLDAgKzEgQEAKKzogdGhpcyBpcyBqdXN0IHRvIGVuc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cy4KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tYXBwbHlwYXRjaC1tc2cgYi90ZW1wbGF0ZXMvaG9va3MtLWFwcGx5cGF0Y2gtbXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGUxZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLWFwcGx5cGF0Y2gtbXNnCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIGNoZWNrIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UgdGFrZW4gYnkKKyMgYXBwbHlwYXRjaCBmcm9tIGFuIGUtbWFpbCBtZXNzYWdlLgorIworIyBUaGUgaG9vayBzaG91bGQgZXhpdCB3aXRoIG5vbi16ZXJvIHN0YXR1cyBhZnRlciBpc3N1aW5nIGFuCisjIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaWYgaXQgd2FudHMgdG8gc3RvcCB0aGUgY29tbWl0LiAgVGhlIGhvb2sgaXMKKyMgYWxsb3dlZCB0byBlZGl0IHRoZSBjb21taXQgbWVzc2FnZSBmaWxlLgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCisuIGdpdC1zaC1zZXR1cAordGVzdCAteCAiJEdJVF9ESVIvaG9va3MvY29tbWl0LW1zZyIgJiYKKwlleGVjICIkR0lUX0RJUi9ob29rcy9jb21taXQtbXNnIiAkezErIiRAIn0KKzoKZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tY29tbWl0LW1zZyBiL3RlbXBsYXRlcy9ob29rcy0tY29tbWl0LW1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM4MjJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2hvb2tzLS1jb21taXQtbXNnCkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIGNoZWNrIHRoZSBjb21taXQgbG9nIG1lc3NhZ2UuCisjIENhbGxlZCBieSBnaXQtY29tbWl0IHdpdGggb25lIGFyZ3VtZW50LCB0aGUgbmFtZSBvZiB0aGUgZmlsZQorIyB0aGF0IGhhcyB0aGUgY29tbWl0IG1lc3NhZ2UuICBUaGUgaG9vayBzaG91bGQgZXhpdCB3aXRoIG5vbi16ZXJvCisjIHN0YXR1cyBhZnRlciBpc3N1aW5nIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaWYgaXQgd2FudHMgdG8gc3RvcCB0aGUKKyMgY29tbWl0LiAgVGhlIGhvb2sgaXMgYWxsb3dlZCB0byBlZGl0IHRoZSBjb21taXQgbWVzc2FnZSBmaWxlLgorIworIyBUbyBlbmFibGUgdGhpcyBob29rLCBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlLgorCisjIFRoaXMgZXhhbXBsZSBjYXRjaGVzIGR1cGxpY2F0ZSBTaWduZWQtb2ZmLWJ5IGxpbmVzLgorCit0ZXN0ICIiID0gIiQoZ3JlcCAnXlNpZ25lZC1vZmYtYnk6ICcgIiQxIiB8CisJIHNvcnQgfCB1bmlxIC1jIHwgc2VkIC1lICcvXlsgCV0qMSAvZCcpIgpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wb3N0LWNvbW1pdCBiL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1jb21taXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlNmYzNAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcG9zdC1jb21taXQKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0aGF0IGlzIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwKKyMgY29tbWl0IGlzIG1hZGUuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUuCisKKzogTm90aGluZwpkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2hvb2tzLS1wb3N0LXVwZGF0ZSBiL3RlbXBsYXRlcy9ob29rcy0tcG9zdC11cGRhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiYTg5MwotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcG9zdC11cGRhdGUKQEAgLTAsMCArMSw4IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBwcmVwYXJlIGEgcGFja2VkIHJlcG9zaXRvcnkgZm9yIHVzZSBvdmVyCisjIGR1bWIgdHJhbnNwb3J0cy4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZSBieSAiY2htb2QgK3ggcG9zdC11cGRhdGUiLgorCitleGVjIGdpdC11cGRhdGUtc2VydmVyLWluZm8KZGlmZiAtLWdpdCBhL3RlbXBsYXRlcy9ob29rcy0tcHJlLWFwcGx5cGF0Y2ggYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1hcHBseXBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNTZjZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1hcHBseXBhdGNoCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9zaAorIworIyBBbiBleGFtcGxlIGhvb2sgc2NyaXB0IHRvIHZlcmlmeSB3aGF0IGlzIGFib3V0IHRvIGJlIGNvbW1pdHRlZAorIyBieSBhcHBseXBhdGNoIGZyb20gYW4gZS1tYWlsIG1lc3NhZ2UuCisjCisjIFRoZSBob29rIHNob3VsZCBleGl0IHdpdGggbm9uLXplcm8gc3RhdHVzIGFmdGVyIGlzc3VpbmcgYW4KKyMgYXBwcm9wcmlhdGUgbWVzc2FnZSBpZiBpdCB3YW50cyB0byBzdG9wIHRoZSBjb21taXQuCisjCisjIFRvIGVuYWJsZSB0aGlzIGhvb2ssIG1ha2UgdGhpcyBmaWxlIGV4ZWN1dGFibGUuCisKKy4gZ2l0LXNoLXNldHVwCit0ZXN0IC14ICIkR0lUX0RJUi9ob29rcy9wcmUtY29tbWl0IiAmJgorCWV4ZWMgIiRHSVRfRElSL2hvb2tzL3ByZS1jb21taXQiICR7MSsiJEAifQorOgorCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1jb21taXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzYTllZgotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcHJlLWNvbW1pdApAQCAtMCwwICsxLDcxIEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byB2ZXJpZnkgd2hhdCBpcyBhYm91dCB0byBiZSBjb21taXR0ZWQuCisjIENhbGxlZCBieSBnaXQtY29tbWl0IHdpdGggbm8gYXJndW1lbnRzLiAgVGhlIGhvb2sgc2hvdWxkCisjIGV4aXQgd2l0aCBub24temVybyBzdGF0dXMgYWZ0ZXIgaXNzdWluZyBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGlmCisjIGl0IHdhbnRzIHRvIHN0b3AgdGhlIGNvbW1pdC4KKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vaywgbWFrZSB0aGlzIGZpbGUgZXhlY3V0YWJsZS4KKworIyBUaGlzIGlzIHNsaWdodGx5IG1vZGlmaWVkIGZyb20gQW5kcmV3IE1vcnRvbidzIFBlcmZlY3QgUGF0Y2guCisjIExpbmVzIHlvdSBpbnRyb2R1Y2Ugc2hvdWxkIG5vdCBoYXZlIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisjIEFsc28gY2hlY2sgZm9yIGFuIGluZGVudGF0aW9uIHRoYXQgaGFzIFNQIGJlZm9yZSBhIFRBQi4KKworaWYgZ2l0LXJldi1wYXJzZSAtLXZlcmlmeSBIRUFEIDI+L2Rldi9udWxsCit0aGVuCisJZ2l0LWRpZmYtaW5kZXggLXAgLU0gLS1jYWNoZWQgSEVBRAorZWxzZQorCSMgTkVFRFNXT1JLOiB3ZSBzaG91bGQgcHJvZHVjZSBhIGRpZmYgd2l0aCBhbiBlbXB0eSB0cmVlIGhlcmUKKwkjIGlmIHdlIHdhbnQgdG8gZG8gdGhlIHNhbWUgdmVyaWZpY2F0aW9uIGZvciB0aGUgaW5pdGlhbCBpbXBvcnQuCisJOgorZmkgfAorcGVybCAtZSAnCisgICAgbXkgJGZvdW5kX2JhZCA9IDA7CisgICAgbXkgJGZpbGVuYW1lOworICAgIG15ICRyZXBvcnRlZF9maWxlbmFtZSA9ICIiOworICAgIG15ICRsaW5lbm87CisgICAgc3ViIGJhZF9saW5lIHsKKwlteSAoJHdoeSwgJGxpbmUpID0gQF87CisJaWYgKCEkZm91bmRfYmFkKSB7CisJICAgIHByaW50IFNUREVSUiAiKlxuIjsKKwkgICAgcHJpbnQgU1RERVJSICIqIFlvdSBoYXZlIHNvbWUgc3VzcGljaW91cyBwYXRjaCBsaW5lczpcbiI7CisJICAgIHByaW50IFNUREVSUiAiKlxuIjsKKwkgICAgJGZvdW5kX2JhZCA9IDE7CisJfQorCWlmICgkcmVwb3J0ZWRfZmlsZW5hbWUgbmUgJGZpbGVuYW1lKSB7CisJICAgIHByaW50IFNUREVSUiAiKiBJbiAkZmlsZW5hbWVcbiI7CisJICAgICRyZXBvcnRlZF9maWxlbmFtZSA9ICRmaWxlbmFtZTsKKwl9CisJcHJpbnQgU1RERVJSICIqICR3aHkgKGxpbmUgJGxpbmVubylcbiI7CisJcHJpbnQgU1RERVJSICIkZmlsZW5hbWU6JGxpbmVubzokbGluZVxuIjsKKyAgICB9CisgICAgd2hpbGUgKDw+KSB7CisJaWYgKG18XmRpZmYgLS1naXQgYS8oLiopIGIvXDEkfCkgeworCSAgICAkZmlsZW5hbWUgPSAkMTsKKwkgICAgbmV4dDsKKwl9CisJaWYgKC9eQEAgLVxTKyBcKyhcZCspLykgeworCSAgICAkbGluZW5vID0gJDEgLSAxOworCSAgICBuZXh0OworCX0KKwlpZiAoL14gLykgeworCSAgICAkbGluZW5vKys7CisJICAgIG5leHQ7CisJfQorCWlmIChzL15cKy8vKSB7CisJICAgICRsaW5lbm8rKzsKKwkgICAgY2hvbXA7CisJICAgIGlmICgvXHMkLykgeworCQliYWRfbGluZSgidHJhaWxpbmcgd2hpdGVzcGFjZSIsICRfKTsKKwkgICAgfQorCSAgICBpZiAoL15ccyogCS8pIHsKKwkJYmFkX2xpbmUoImluZGVudCBTUCBmb2xsb3dlZCBieSBhIFRBQiIsICRfKTsKKwkgICAgfQorCSAgICBpZiAoL14oPzpbPD49XSl7N30vKSB7CisJCWJhZF9saW5lKCJ1bnJlc29sdmVkIG1lcmdlIGNvbmZsaWN0IiwgJF8pOworCSAgICB9CisJfQorICAgIH0KKyAgICBleGl0KCRmb3VuZF9iYWQpOworJworCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXByZS1yZWJhc2UgYi90ZW1wbGF0ZXMvaG9va3MtLXByZS1yZWJhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxYzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy9ob29rcy0tcHJlLXJlYmFzZQpAQCAtMCwwICsxLDE1MCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNiBKdW5pbyBDIEhhbWFubworIworCitwdWJsaXNoPW5leHQKK2Jhc2VicmFuY2g9IiQxIgoraWYgdGVzdCAiJCMiID0gMgordGhlbgorCXRvcGljPSJyZWZzL2hlYWRzLyQyIgorZWxzZQorCXRvcGljPWBnaXQgc3ltYm9saWMtcmVmIEhFQURgCitmaQorCitjYXNlICIkYmFzZWJyYW5jaCwkdG9waWMiIGluCittYXN0ZXIscmVmcy9oZWFkcy8/Py8qKQorCTs7CisqKQorCWV4aXQgMCA7IyB3ZSBkbyBub3QgaW50ZXJydXB0IG90aGVycy4KKwk7OworZXNhYworCisjIE5vdyB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgdG9waWMgYnJhbmNoIGJlaW5nIHJlYmFzZWQKKyMgb24gdG9wIG9mIG1hc3Rlci4gIElzIGl0IE9LIHRvIHJlYmFzZSBpdD8KKworIyBJcyB0b3BpYyBmdWxseSBtZXJnZWQgdG8gbWFzdGVyPworbm90X2luX21hc3Rlcj1gZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgXm1hc3RlciAiJHRvcGljImAKK2lmIHRlc3QgLXogIiRub3RfaW5fbWFzdGVyIgordGhlbgorCWVjaG8gPiYyICIkdG9waWMgaXMgZnVsbHkgbWVyZ2VkIHRvIG1hc3RlcjsgYmV0dGVyIHJlbW92ZSBpdC4iCisJZXhpdCAxIDsjIHdlIGNvdWxkIGFsbG93IGl0LCBidXQgdGhlcmUgaXMgbm8gcG9pbnQuCitmaQorCisjIElzIHRvcGljIGV2ZXIgbWVyZ2VkIHRvIG5leHQ/ICBJZiBzbyB5b3Ugc2hvdWxkIG5vdCBiZSByZWJhc2luZyBpdC4KK29ubHlfbmV4dF8xPWBnaXQtcmV2LWxpc3QgXm1hc3RlciAiXiR0b3BpYyIgJHtwdWJsaXNofSB8IHNvcnRgCitvbmx5X25leHRfMj1gZ2l0LXJldi1saXN0IF5tYXN0ZXIgICAgICAgICAgICR7cHVibGlzaH0gfCBzb3J0YAoraWYgdGVzdCAiJG9ubHlfbmV4dF8xIiA9ICIkb25seV9uZXh0XzIiCit0aGVuCisJbm90X2luX3RvcGljPWBnaXQtcmV2LWxpc3QgIl4kdG9waWMiIG1hc3RlcmAKKwlpZiB0ZXN0IC16ICIkbm90X2luX3RvcGljIgorCXRoZW4KKwkJZWNobyA+JjIgIiR0b3BpYyBpcyBhbHJlYWR5IHVwLXRvLWRhdGUgd2l0aCBtYXN0ZXIiCisJCWV4aXQgMSA7IyB3ZSBjb3VsZCBhbGxvdyBpdCwgYnV0IHRoZXJlIGlzIG5vIHBvaW50LgorCWVsc2UKKwkJZXhpdCAwCisJZmkKK2Vsc2UKKwlub3RfaW5fbmV4dD1gZ2l0LXJldi1saXN0IC0tcHJldHR5PW9uZWxpbmUgXiR7cHVibGlzaH0gIiR0b3BpYyJgCisJcGVybCAtZSAnCisJCW15ICR0b3BpYyA9ICRBUkdWWzBdOworCQlteSAkbXNnID0gIiogJHRvcGljIGhhcyBjb21taXRzIGFscmVhZHkgbWVyZ2VkIHRvIHB1YmxpYyBicmFuY2g6XG4iOworCQlteSAoJW5vdF9pbl9uZXh0KSA9IG1hcCB7CisJCQkvXihbMC05YS1mXSspIC87CisJCQkoJDEgPT4gMSk7CisJCX0gc3BsaXQoL1xuLywgJEFSR1ZbMV0pOworCQlmb3IgbXkgJGVsZW0gKG1hcCB7CisJCQkJL14oWzAtOWEtZl0rKSAoLiopJC87CisJCQkJWyQxID0+ICQyXTsKKwkJCX0gc3BsaXQoL1xuLywgJEFSR1ZbMl0pKSB7CisJCQlpZiAoIWV4aXN0cyAkbm90X2luX25leHR7JGVsZW0tPlswXX0pIHsKKwkJCQlpZiAoJG1zZykgeworCQkJCQlwcmludCBTVERFUlIgJG1zZzsKKwkJCQkJdW5kZWYgJG1zZzsKKwkJCQl9CisJCQkJcHJpbnQgU1RERVJSICIgJGVsZW0tPlsxXVxuIjsKKwkJCX0KKwkJfQorCScgIiR0b3BpYyIgIiRub3RfaW5fbmV4dCIgIiRub3RfaW5fbWFzdGVyIgorCWV4aXQgMQorZmkKKworZXhpdCAwCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworVGhpcyBzYW1wbGUgaG9vayBzYWZlZ3VhcmRzIHRvcGljIGJyYW5jaGVzIHRoYXQgaGF2ZSBiZWVuCitwdWJsaXNoZWQgZnJvbSBiZWluZyByZXdvdW5kLgorCitUaGUgd29ya2Zsb3cgYXNzdW1lZCBoZXJlIGlzOgorCisgKiBPbmNlIGEgdG9waWMgYnJhbmNoIGZvcmtzIGZyb20gIm1hc3RlciIsICJtYXN0ZXIiIGlzIG5ldmVyCisgICBtZXJnZWQgaW50byBpdCBhZ2FpbiAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpLgorCisgKiBPbmNlIGEgdG9waWMgYnJhbmNoIGlzIGZ1bGx5IGNvb2tlZCBhbmQgbWVyZ2VkIGludG8gIm1hc3RlciIsCisgICBpdCBpcyBkZWxldGVkLiAgSWYgeW91IG5lZWQgdG8gYnVpbGQgb24gdG9wIG9mIGl0IHRvIGNvcnJlY3QKKyAgIGVhcmxpZXIgbWlzdGFrZXMsIGEgbmV3IHRvcGljIGJyYW5jaCBpcyBjcmVhdGVkIGJ5IGZvcmtpbmcgYXQKKyAgIHRoZSB0aXAgb2YgdGhlICJtYXN0ZXIiLiAgVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQKKyAgIGl0IG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHlvdXIgaGlzdG9yeSBzaW1wbGUuCisKKyAqIFdoZW5ldmVyIHlvdSBuZWVkIHRvIHRlc3Qgb3IgcHVibGlzaCB5b3VyIGNoYW5nZXMgdG8gdG9waWMKKyAgIGJyYW5jaGVzLCBtZXJnZSB0aGVtIGludG8gIm5leHQiIGJyYW5jaC4KKworVGhlIHNjcmlwdCwgYmVpbmcgYW4gZXhhbXBsZSwgaGFyZGNvZGVzIHRoZSBwdWJsaXNoIGJyYW5jaCBuYW1lCit0byBiZSAibmV4dCIsIGJ1dCBpdCBpcyB0cml2aWFsIHRvIG1ha2UgaXQgY29uZmlndXJhYmxlIHZpYQorJEdJVF9ESVIvY29uZmlnIG1lY2hhbmlzbS4KKworV2l0aCB0aGlzIHdvcmtmbG93LCB5b3Ugd291bGQgd2FudCB0byBrbm93OgorCisoMSkgLi4uIGlmIGEgdG9waWMgYnJhbmNoIGhhcyBldmVyIGJlZW4gbWVyZ2VkIHRvICJuZXh0Ii4gIFlvdW5nCisgICAgdG9waWMgYnJhbmNoZXMgY2FuIGhhdmUgc3R1cGlkIG1pc3Rha2VzIHlvdSB3b3VsZCByYXRoZXIKKyAgICBjbGVhbiB1cCBiZWZvcmUgcHVibGlzaGluZywgYW5kIHRoaW5ncyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgICBtZXJnZWQgaW50byBvdGhlciBicmFuY2hlcyBjYW4gYmUgZWFzaWx5IHJlYmFzZWQgd2l0aG91dAorICAgIGFmZmVjdGluZyBvdGhlciBwZW9wbGUuICBCdXQgb25jZSBpdCBpcyBwdWJsaXNoZWQsIHlvdSB3b3VsZAorICAgIG5vdCB3YW50IHRvIHJld2luZCBpdC4KKworKDIpIC4uLiBpZiBhIHRvcGljIGJyYW5jaCBoYXMgYmVlbiBmdWxseSBtZXJnZWQgdG8gIm1hc3RlciIuCisgICAgVGhlbiB5b3UgY2FuIGRlbGV0ZSBpdC4gIE1vcmUgaW1wb3J0YW50bHksIHlvdSBzaG91bGQgbm90CisgICAgYnVpbGQgb24gdG9wIG9mIGl0IC0tIG90aGVyIHBlb3BsZSBtYXkgYWxyZWFkeSB3YW50IHRvCisgICAgY2hhbmdlIHRoaW5ncyByZWxhdGVkIHRvIHRoZSB0b3BpYyBhcyBwYXRjaGVzIGFnYWluc3QgeW91cgorICAgICJtYXN0ZXIiLCBzbyBpZiB5b3UgbmVlZCBmdXJ0aGVyIGNoYW5nZXMsIGl0IGlzIGJldHRlciB0bworICAgIGZvcmsgdGhlIHRvcGljIChwZXJoYXBzIHdpdGggdGhlIHNhbWUgbmFtZSkgYWZyZXNoIGZyb20gdGhlCisgICAgdGlwIG9mICJtYXN0ZXIiLgorCitMZXQncyBsb29rIGF0IHRoaXMgZXhhbXBsZToKKworCQkgICBvLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vICJuZXh0IgorCQkgIC8gICAgICAgLyAgICAgICAgICAgLyAgICAgICAgICAgLworCQkgLyAgIGEtLS1hLS0tYiBBICAgICAvICAgICAgICAgICAvCisJCS8gICAvICAgICAgICAgICAgICAgLyAgICAgICAgICAgLworCSAgICAgICAvICAgLyAgIGMtLS1jLS0tYy0tLWMgQiAgICAgICAgIC8KKwkgICAgICAvICAgLyAgIC8gICAgICAgICAgICAgXCAgICAgICAgIC8KKwkgICAgIC8gICAvICAgLyAgIGItLS1iIEMgICAgIFwgICAgICAgLworCSAgICAvICAgLyAgIC8gICAvICAgICAgICAgICAgIFwgICAgIC8KKyAgICAtLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tby0tLW8tLS1vLS0tbyAibWFzdGVyIgorCisKK0EsIEIgYW5kIEMgYXJlIHRvcGljIGJyYW5jaGVzLgorCisgKiBBIGhhcyBvbmUgZml4IHNpbmNlIGl0IHdhcyBtZXJnZWQgdXAgdG8gIm5leHQiLgorCisgKiBCIGhhcyBmaW5pc2hlZC4gIEl0IGhhcyBiZWVuIGZ1bGx5IG1lcmdlZCB1cCB0byAibWFzdGVyIiBhbmQgIm5leHQiLAorICAgYW5kIGlzIHJlYWR5IHRvIGJlIGRlbGV0ZWQuCisKKyAqIEMgaGFzIG5vdCBtZXJnZWQgdG8gIm5leHQiIGF0IGFsbC4KKworV2Ugd291bGQgd2FudCB0byBhbGxvdyBDIHRvIGJlIHJlYmFzZWQsIHJlZnVzZSBBLCBhbmQgZW5jb3VyYWdlCitCIHRvIGJlIGRlbGV0ZWQuCisKK1RvIGNvbXB1dGUgKDEpOgorCisJZ2l0LXJldi1saXN0IF5tYXN0ZXIgXnRvcGljIG5leHQKKwlnaXQtcmV2LWxpc3QgXm1hc3RlciAgICAgICAgbmV4dAorCisJaWYgdGhlc2UgbWF0Y2gsIHRvcGljIGhhcyBub3QgbWVyZ2VkIGluIG5leHQgYXQgYWxsLgorCitUbyBjb21wdXRlICgyKToKKworCWdpdC1yZXYtbGlzdCBtYXN0ZXIuLnRvcGljCisKKwlpZiB0aGlzIGlzIGVtcHR5LCBpdCBpcyBmdWxseSBtZXJnZWQgdG8gIm1hc3RlciIuCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvaG9va3MtLXVwZGF0ZSBiL3RlbXBsYXRlcy9ob29rcy0tdXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDVhYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZW1wbGF0ZXMvaG9va3MtLXVwZGF0ZQpAQCAtMCwwICsxLDg5IEBACisjIS9iaW4vc2gKKyMKKyMgQW4gZXhhbXBsZSBob29rIHNjcmlwdCB0byBtYWlsIG91dCBjb21taXQgdXBkYXRlIGluZm9ybWF0aW9uLgorIyBJdCBhbHNvIGJsb2NrcyB0YWdzIHRoYXQgYXJlbid0IGFubm90YXRlZC4KKyMgQ2FsbGVkIGJ5IGdpdC1yZWNlaXZlLXBhY2sgd2l0aCBhcmd1bWVudHM6IHJlZm5hbWUgc2hhMS1vbGQgc2hhMS1uZXcKKyMKKyMgVG8gZW5hYmxlIHRoaXMgaG9vazoKKyMgKDEpIGNoYW5nZSB0aGUgcmVjaXBpZW50IGUtbWFpbCBhZGRyZXNzCisjICgyKSBtYWtlIHRoaXMgZmlsZSBleGVjdXRhYmxlIGJ5ICJjaG1vZCAreCB1cGRhdGUiLgorIworCitwcm9qZWN0PSQoY2F0ICRHSVRfRElSL2Rlc2NyaXB0aW9uKQorcmVjaXBpZW50cz0iY29tbWl0LWxpc3RAc29tZXdoZXJlLmNvbSBjb21taXQtbGlzdEBzb21ld2hlcmVlbHNlLmNvbSIKKworcmVmX3R5cGU9JChnaXQgY2F0LWZpbGUgLXQgIiQzIikKKworIyBPbmx5IGFsbG93IGFubm90YXRlZCB0YWdzIGluIGEgc2hhcmVkIHJlcG8KKyMgUmVtb3ZlIHRoaXMgY29kZSB0byB0cmVhdCBkdW1iIHRhZ3MgdGhlIHNhbWUgYXMgZXZlcnl0aGluZyBlbHNlCitjYXNlICIkMSIsIiRyZWZfdHlwZSIgaW4KK3JlZnMvdGFncy8qLGNvbW1pdCkKKwllY2hvICIqKiogVW4tYW5ub3RhdGVkIHRhZ3MgYXJlIG5vdCBhbGxvd2VkIGluIHRoaXMgcmVwbyIgPiYyCisJZWNobyAiKioqIFVzZSAnZ2l0IHRhZyBbIC1hIHwgLXMgXScgZm9yIHRhZ3MgeW91IHdhbnQgdG8gcHJvcGFnYXRlLiIKKwlleGl0IDE7OworcmVmcy90YWdzLyosdGFnKQorCWVjaG8gIiMjIyBQdXNoaW5nIHZlcnNpb24gJyR7MSMjcmVmcy90YWdzL30nIHRvIHRoZSBtYXNzZXMiID4mMgorCSMgcmVjaXBpZW50cz0icmVsZWFzZS1hbm5vdW5jZUBzb213ZWhlcmUuY29tIGFubm91bmNlQHNvbWV3aGVyZWVsc2UuY29tIgorCTs7Citlc2FjCisKKyMgc2V0IHRoaXMgIHRvICdjYXQnIHRvIGdldCBhIHZlcnkgZGV0YWlsZWQgbGlzdGluZy4KKyMgc2hvcnQgb25seSBraWNrcyBpbiB3aGVuIGFuIGFubm90YXRlZCB0YWcgaXMgYWRkZWQKK3Nob3J0PSdnaXQgc2hvcnRsb2cnCisKKyMgc2VlICdkYXRlIC0taGVscCcgZm9yIGluZm8gb24gaG93IHRvIHdyaXRlIHRoaXMKKyMgVGhlIGRlZmF1bHQgaXMgYSBodW1hbi1yZWFkYWJsZSBpc284NjAxLWxpa2UgZm9ybWF0IHdpdGggbWludXRlCisjIHByZWNpc2lvbiAoJzIwMDYtMDEtMjUgMTU6NTggKzAxMDAnIGZvciBleGFtcGxlKQorZGF0ZV9mb3JtYXQ9IiVGICVSICV6IgorCisoaWYgZXhwciAiJDIiIDogJzAqJCcgPi9kZXYvbnVsbAordGhlbgorCSMgbmV3IHJlZgorCWNhc2UgIiQxIiBpbgorCXJlZnMvdGFncy8qKQorCQkjIGEgcHVzaGVkIGFuZCBhbm5vdGF0ZWQgdGFnICh1c3VhbGx5KSBtZWFucyBhIG5ldyB2ZXJzaW9uCisJCXRhZz0iJHsxIyNyZWZzL3RhZ3MvfSIKKwkJaWYgWyAiJHJlZl90eXBlIiA9IHRhZyBdOyB0aGVuCisJCQlldmFsICQoZ2l0IGNhdC1maWxlIHRhZyAkMyB8IFwKKwkJCQlzZWQgLW4gJzRzL3RhZ2dlciBcKFtePl0qPlwpW14wLTldKlwoWzAtOV0qXCkuKi90YWdnZXI9IlwxIiB0cz0iXDIiL3AnKQorCQkJZGF0ZT0kKGRhdGUgLS1kYXRlPSIxOTcwLTAxLTAxIDAwOjAwOjAwICR0cyBzZWNvbmRzIiArIiRkYXRlX2Zvcm1hdCIpCisJCQllY2hvICJUYWcgJyR0YWcnIGNyZWF0ZWQgYnkgJHRhZ2dlciBhdCAkZGF0ZSIKKwkJCWdpdCBjYXQtZmlsZSB0YWcgJDMgfCBzZWQgLW4gJzUsJHAnCisJCQllY2hvCisJCWZpCisJCXByZXY9JChnaXQgZGVzY3JpYmUgIiQzXiIgfCBzZWQgJ3MvLWcuKi8vJykKKwkJIyB0aGUgZmlyc3QgdGFnIGluIGEgcmVwbyB3aWxsIHlpZWxkIG5vICRwcmV2CisJCWlmIFsgLXogIiRwcmV2IiBdOyB0aGVuCisJCQllY2hvICJDaGFuZ2VzIHNpbmNlIHRoZSBkYXduIG9mIHRpbWU6IgorCQkJZ2l0IHJldi1saXN0IC0tcHJldHR5ICQzIHwgJHNob3J0CisJCWVsc2UKKwkJCWVjaG8gIkNoYW5nZXMgc2luY2UgJHByZXY6IgorCQkJZ2l0IHJldi1saXN0IC0tcHJldHR5ICRwcmV2Li4kMyB8ICRzaG9ydAorCQkJZWNobyAtLS0KKwkJCWdpdCBkaWZmIC0tc3RhdCAkcHJldi4uJDMKKwkJCWVjaG8gLS0tCisJCWZpCisJCTs7CisKKwlyZWZzL2hlYWRzLyopCisJCWJyYW5jaD0iJHsxIyNyZWZzL2hlYWRzL30iCisJCWVjaG8gIk5ldyBicmFuY2ggJyRicmFuY2gnIGF2YWlsYWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWl0czoiCisJCWdpdC1yZXYtbGlzdCAtLXByZXR0eSAiJDMiICQoZ2l0LXJldi1wYXJzZSAtLW5vdCAtLWFsbCkKKwkJOzsKKwllc2FjCitlbHNlCisJYmFzZT0kKGdpdC1tZXJnZS1iYXNlICIkMiIgIiQzIikKKwljYXNlICIkYmFzZSIgaW4KKwkiJDIiKQorCQlnaXQgZGlmZiAtLXN0YXQgIiQzIiAiXiRiYXNlIgorCQllY2hvCisJCWVjaG8gIk5ldyBjb21taXRzOiIKKwkJOzsKKwkqKQorCQllY2hvICJSZWJhc2VkIHJlZiwgY29tbWl0cyBmcm9tIGNvbW1vbiBhbmNlc3RvcjoiCisJCTs7CisJZXNhYworCWdpdC1yZXYtbGlzdCAtLXByZXR0eSAiJDMiICJeJGJhc2UiCitmaSkgfAorbWFpbCAtcyAiJHByb2plY3Q6IENoYW5nZXMgdG8gJyR7MSMjcmVmcy9oZWFkcy99JyIgJHJlY2lwaWVudHMKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVtcGxhdGVzL2luZm8tLWV4Y2x1ZGUgYi90ZW1wbGF0ZXMvaW5mby0tZXhjbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg3YjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL2luZm8tLWV4Y2x1ZGUKQEAgLTAsMCArMSw2IEBACisjIGdpdC1scy1maWxlcyAtLW90aGVycyAtLWV4Y2x1ZGUtZnJvbT0uZ2l0L2luZm8vZXhjbHVkZQorIyBMaW5lcyB0aGF0IHN0YXJ0IHdpdGggJyMnIGFyZSBjb21tZW50cy4KKyMgRm9yIGEgcHJvamVjdCBtb3N0bHkgaW4gQywgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSBhIGdvb2Qgc2V0IG9mCisjIGV4Y2x1ZGUgcGF0dGVybnMgKHVuY29tbWVudCB0aGVtIGlmIHlvdSB3YW50IHRvIHVzZSB0aGVtKToKKyMgKi5bb2FdCisjICp+CmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvcmVtb3Rlcy0tIGIvdGVtcGxhdGVzL3JlbW90ZXMtLQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU4ODcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVtcGxhdGVzL3JlbW90ZXMtLQpAQCAtMCwwICsxIEBACis6IHRoaXMgaXMganVzdCB0byBlbnN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMuCmRpZmYgLS1naXQgYS90ZW1wbGF0ZXMvdGhpcy0tZGVzY3JpcHRpb24gYi90ZW1wbGF0ZXMvdGhpcy0tZGVzY3JpcHRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMjVlOAotLS0gL2Rldi9udWxsCisrKyBiL3RlbXBsYXRlcy90aGlzLS1kZXNjcmlwdGlvbgpAQCAtMCwwICsxIEBACitVbm5hbWVkIHJlcG9zaXRvcnk7IGVkaXQgdGhpcyBmaWxlIHRvIG5hbWUgaXQgZm9yIGdpdHdlYi4KZGlmZiAtLWdpdCBhL3Rlc3QtZGF0ZS5jIGIvdGVzdC1kYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlODAyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZGF0ZS5jCkBAIC0wLDAgKzEsMjMgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKwkJY2hhciByZXN1bHRbMTAwXTsKKwkJdGltZV90IHQ7CisKKwkJbWVtY3B5KHJlc3VsdCwgImJhZCIsIDQpOworCQlwYXJzZV9kYXRlKGFyZ3ZbaV0sIHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworCQl0ID0gc3RydG91bChyZXN1bHQsIE5VTEwsIDApOworCQlwcmludGYoIiVzIC0+ICVzIC0+ICVzIiwgYXJndltpXSwgcmVzdWx0LCBjdGltZSgmdCkpOworCisJCXQgPSBhcHByb3hpZGF0ZShhcmd2W2ldKTsKKwkJcHJpbnRmKCIlcyAtPiAlc1xuIiwgYXJndltpXSwgY3RpbWUoJnQpKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0LWRlbHRhLmMgYi90ZXN0LWRlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlOGVlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZGVsdGEuYwpAQCAtMCwwICsxLDgzIEBACisvKgorICogdGVzdC1kZWx0YS5jOiB0ZXN0IGNvZGUgdG8gZXhlcmNpc2UgZGlmZi1kZWx0YS5jIGFuZCBwYXRjaC1kZWx0YS5jCisgKgorICogKEMpIDIwMDUgTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgorICoKKyAqIFRoaXMgY29kZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAiZGVsdGEuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VbXSA9CisJInRlc3QtZGVsdGEgKC1kfC1wKSA8ZnJvbV9maWxlPiA8ZGF0YV9maWxlPiA8b3V0X2ZpbGU+IjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHN0YXQgc3Q7CisJdm9pZCAqZnJvbV9idWYsICpkYXRhX2J1ZiwgKm91dF9idWY7CisJdW5zaWduZWQgbG9uZyBmcm9tX3NpemUsIGRhdGFfc2l6ZSwgb3V0X3NpemU7CisKKwlpZiAoYXJnYyAhPSA1IHx8IChzdHJjbXAoYXJndlsxXSwgIi1kIikgJiYgc3RyY21wKGFyZ3ZbMV0sICItcCIpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlc1xuIiwgdXNhZ2UpOworCQlyZXR1cm4gMTsKKwl9CisKKwlmZCA9IG9wZW4oYXJndlsyXSwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgfHwgZnN0YXQoZmQsICZzdCkpIHsKKwkJcGVycm9yKGFyZ3ZbMl0pOworCQlyZXR1cm4gMTsKKwl9CisJZnJvbV9zaXplID0gc3Quc3Rfc2l6ZTsKKwlmcm9tX2J1ZiA9IG1tYXAoTlVMTCwgZnJvbV9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKGZyb21fYnVmID09IE1BUF9GQUlMRUQpIHsKKwkJcGVycm9yKGFyZ3ZbMl0pOworCQljbG9zZShmZCk7CisJCXJldHVybiAxOworCX0KKwljbG9zZShmZCk7CisKKwlmZCA9IG9wZW4oYXJndlszXSwgT19SRE9OTFkpOworCWlmIChmZCA8IDAgfHwgZnN0YXQoZmQsICZzdCkpIHsKKwkJcGVycm9yKGFyZ3ZbM10pOworCQlyZXR1cm4gMTsKKwl9CisJZGF0YV9zaXplID0gc3Quc3Rfc2l6ZTsKKwlkYXRhX2J1ZiA9IG1tYXAoTlVMTCwgZGF0YV9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKGRhdGFfYnVmID09IE1BUF9GQUlMRUQpIHsKKwkJcGVycm9yKGFyZ3ZbM10pOworCQljbG9zZShmZCk7CisJCXJldHVybiAxOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAoYXJndlsxXVsxXSA9PSAnZCcpCisJCW91dF9idWYgPSBkaWZmX2RlbHRhKGZyb21fYnVmLCBmcm9tX3NpemUsCisJCQkJICAgICBkYXRhX2J1ZiwgZGF0YV9zaXplLAorCQkJCSAgICAgJm91dF9zaXplLCAwKTsKKwllbHNlCisJCW91dF9idWYgPSBwYXRjaF9kZWx0YShmcm9tX2J1ZiwgZnJvbV9zaXplLAorCQkJCSAgICAgIGRhdGFfYnVmLCBkYXRhX3NpemUsCisJCQkJICAgICAgJm91dF9zaXplKTsKKwlpZiAoIW91dF9idWYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJkZWx0YSBvcGVyYXRpb24gZmFpbGVkIChyZXR1cm5lZCBOVUxMKVxuIik7CisJCXJldHVybiAxOworCX0KKworCWZkID0gb3BlbiAoYXJndls0XSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKKwlpZiAoZmQgPCAwIHx8IHdyaXRlKGZkLCBvdXRfYnVmLCBvdXRfc2l6ZSkgIT0gb3V0X3NpemUpIHsKKwkJcGVycm9yKGFyZ3ZbNF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3Qtc2hhMS5jIGIvdGVzdC1zaGExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkN2U5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qtc2hhMS5jCkBAIC0wLDAgKzEsNDcgQEAKKyNpbmNsdWRlICJjYWNoZS5oIgorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlTSEFfQ1RYIGN0eDsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOworCXVuc2lnbmVkIGJ1ZnN6ID0gODE5MjsKKwljaGFyICpidWZmZXI7CisKKwlpZiAoYWMgPT0gMikKKwkJYnVmc3ogPSBzdHJ0b3VsKGF2WzFdLCBOVUxMLCAxMCkgKiAxMDI0ICogMTAyNDsKKworCWlmICghYnVmc3opCisJCWJ1ZnN6ID0gODE5MjsKKworCXdoaWxlICgoYnVmZmVyID0gbWFsbG9jKGJ1ZnN6KSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImJ1ZnN6ICV1IGlzIHRvbyBiaWcsIGhhbHZpbmcuLi5cbiIsIGJ1ZnN6KTsKKwkJYnVmc3ogLz0gMjsKKwkJaWYgKGJ1ZnN6IDwgMTAyNCkKKwkJCWRpZSgiT09QUyIpOworCX0KKworCVNIQTFfSW5pdCgmY3R4KTsKKworCXdoaWxlICgxKSB7CisJCXNzaXplX3Qgc3osIHRoaXNfc3o7CisJCWNoYXIgKmNwID0gYnVmZmVyOworCQl1bnNpZ25lZCByb29tID0gYnVmc3o7CisJCXRoaXNfc3ogPSAwOworCQl3aGlsZSAocm9vbSkgeworCQkJc3ogPSB4cmVhZCgwLCBjcCwgcm9vbSk7CisJCQlpZiAoc3ogPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChzeiA8IDApCisJCQkJZGllKCJ0ZXN0LXNoYTE6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXRoaXNfc3ogKz0gc3o7CisJCQljcCArPSBzejsKKwkJCXJvb20gLT0gc3o7CisJCX0KKwkJaWYgKHRoaXNfc3ogPT0gMCkKKwkJCWJyZWFrOworCQlTSEExX1VwZGF0ZSgmY3R4LCBidWZmZXIsIHRoaXNfc3opOworCX0KKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCXB1dHMoc2hhMV90b19oZXgoc2hhMSkpOworCWV4aXQoMCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0LXNoYTEuc2ggYi90ZXN0LXNoYTEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQwODU2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qtc2hhMS5zaApAQCAtMCwwICsxLDgzIEBACisjIS9iaW4vc2gKKworZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9MTAwIDI+L2Rldi9udWxsIHwKKy91c3IvYmluL3RpbWUgLi90ZXN0LXNoYTEgPi9kZXYvbnVsbAorCit3aGlsZSByZWFkIGV4cGVjdCBjbnQgcGZ4CitkbworCWNhc2UgIiRleHBlY3QiIGluICcjJyopIGNvbnRpbnVlIDs7IGVzYWMKKwlhY3R1YWw9YAorCQl7CisJCQl0ZXN0IC16ICIkcGZ4IiB8fCBlY2hvICIkcGZ4IgorCQkJZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9JGNudCAyPi9kZXYvbnVsbCB8CisJCQl0ciAnW1wwXScgJ1tnXScKKwkJfSB8IC4vdGVzdC1zaGExICRjbnQKKwlgCisJaWYgdGVzdCAiJGV4cGVjdCIgPSAiJGFjdHVhbCIKKwl0aGVuCisJCWVjaG8gIk9LOiAkZXhwZWN0ICRjbnQgJHBmeCIKKwllbHNlCisJCWVjaG8gPiYyICJPT1BTOiAkY250IgorCQllY2hvID4mMiAiZXhwZWN0OiAkZXhwZWN0IgorCQllY2hvID4mMiAiYWN0dWFsOiAkYWN0dWFsIgorCQlleGl0IDEKKwlmaQorZG9uZSA8PEVPRgorZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOSAwCiszZjc4Njg1MGUzODc1NTBmZGFiODM2ZWQ3ZTZkYzg4MWRlMjMwMDFiIDAgYQorNTI3N2NiYjQ1YTE1OTAyMTM3ZDMzMmQ5N2U4OWNmODEzNjU0NTQ4NSAwIGFiCiswM2NmZDc0MzY2MWYwNzk3NWZhMmYxMjIwYzUxOTRjYmFmZjQ4NDUxIDAgYWJjCiszMzMwYjQzNzM2NDBmOWU0NjA0OTkxZTczYzdlODZiZmQ4ZGEyZGMzIDAgYWJjZAorZWMxMTMxMjM4NmFkNTYxNjc0ZjcyNGI4Y2NhN2NmMTc5NmUyNmQxZCAwIGFiY2RlCitiZGMzN2MwNzRlYzRlZTYwNTBkNjhiYzEzM2M2YjkxMmYzNjQ3NGRmIDAgYWJjZGVmCis2OWJjYTk5YjkyMzg1OWYyZGM0ODZiNTViODdmNDk2ODliNzM1OGM3IDAgYWJjZGVmZworZTQxNGFmNzE2MWM5NTU0MDg5ZjQxMDZkNmYxNzk3ZWYxNGE3MzY2NiAwIGFiY2RlZmdoCiswNzA3ZjI5NzAwNDNmOWY3YzIyMDI5NDgyZGIyNzczM2RlYWVjMDI5IDAgYWJjZGVmZ2hpCithNGRkOGFhNzRhNTYzNjcyOGZlNTI0NTE2MzZlMmUxNzcyNjAzM2FhIDEKKzk5ODZiNDVlMmY0ZDcwODYzNzI1MzNiYjY5NTNhODY1MmZhMzY0NGEgMSBmcm90egorMjNkOGQ0Zjc4OGU4NTI2YjQ4Nzc1NDhhMzI1Nzc1NDNjYmFhZjUxZiAxMAorOGNkMjNmODIyYWI0NGM3ZjQ4MWI4YzkyZDU5MWY2ZDFmY2FkNDMxYyAxMCBmcm90egorZjNiNTYwNGE0ZTYwNDg5OWMxMjMzZWRiM2JmMWNjMGVkZTRkOGMzMiA1MTIKK2IwOTViZDgzN2EzNzE1OTMwNDgxMzZlNDI5ZTlhYzRiNDc2ZTFiYjMgNTEyIGZyb3R6CiswOGZhODFkNjE5MDk0OGRlNWNjY2EzOTY2MzQwY2M0OGMxMGNjZWFjIDEyMDAgeHl6enkKK2UzM2EyOTFmNDJjMzBhMTU5NzMzZGQ5OGI4YjNlNGZmMzQxNThjYTAgNDA5MCA0RworI2EzYmY3ODNiYzIwY2FhOTU4ZjZjYjI0ZGQxNDBhN2IyMTk4NDgzOGQgOTk5OSBuaXRmb2wKK0VPRgorCitleGl0CisKKyMgZ2VuZXJhdGluZyB0ZXN0IHZlY3RvcnMKKyMgaW5wdXRzIGFyZSBudW1iZXIgb2YgbWVnYWJ5dGVzIGZvbGxvd2VkIGJ5IHNvbWUgcmFuZG9tIHN0cmluZyB0byBwcmVmaXguCisKK3doaWxlIHJlYWQgY250IHBmeAorZG8KKwlhY3R1YWw9YAorCQl7CisJCQl0ZXN0IC16ICIkcGZ4IiB8fCBlY2hvICIkcGZ4IgorCQkJZGQgaWY9L2Rldi96ZXJvIGJzPTEwNDg1NzYgY291bnQ9JGNudCAyPi9kZXYvbnVsbCB8CisJCQl0ciAnW1wwXScgJ1tnXScKKwkJfSB8IHNoYTFzdW0gfAorCQlzZWQgLWUgJ3MvIC4qLy8nCisJYAorCWVjaG8gIiRhY3R1YWwgJGNudCAkcGZ4IgorZG9uZSA8PEVPRgorMAorMCBhCiswIGFiCiswIGFiYworMCBhYmNkCiswIGFiY2RlCiswIGFiY2RlZgorMCBhYmNkZWZnCiswIGFiY2RlZmdoCiswIGFiY2RlZmdoaQorMQorMSBmcm90egorMTAKKzEwIGZyb3R6Cis1MTIKKzUxMiBmcm90egorMTIwMCB4eXp6eQorNDA5MCA0RworOTk5OSBuaXRmb2wKK0VPRgpkaWZmIC0tZ2l0IGEvdHJlZS1kaWZmLmMgYi90cmVlLWRpZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2RmOGFhCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS1kaWZmLmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmVlIGRpZmYgZ2VuZXJhdGlvbgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJkaWZmLmgiCisjaW5jbHVkZSAidHJlZS5oIgorCitzdGF0aWMgY2hhciAqbWFsbG9jX2Jhc2UoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcGF0aCwgaW50IHBhdGhsZW4pCit7CisJaW50IGJhc2VsZW4gPSBzdHJsZW4oYmFzZSk7CisJY2hhciAqbmV3YmFzZSA9IHhtYWxsb2MoYmFzZWxlbiArIHBhdGhsZW4gKyAyKTsKKwltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5ld2Jhc2UgKyBiYXNlbGVuLCBwYXRoLCBwYXRobGVuKTsKKwltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4gKyBwYXRobGVuLCAiLyIsIDIpOworCXJldHVybiBuZXdiYXNlOworfQorCitzdGF0aWMgaW50IHNob3dfZW50cnkoc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0LCBjb25zdCBjaGFyICpwcmVmaXgsIHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IGNoYXIgKmJhc2UpOworCitzdGF0aWMgaW50IGNvbXBhcmVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICp0MSwgc3RydWN0IHRyZWVfZGVzYyAqdDIsIGNvbnN0IGNoYXIgKmJhc2UsIHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwl1bnNpZ25lZCBtb2RlMSwgbW9kZTI7CisJY29uc3QgY2hhciAqcGF0aDEsICpwYXRoMjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCAqc2hhMjsKKwlpbnQgY21wLCBwYXRobGVuMSwgcGF0aGxlbjI7CisKKwlzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KHQxLCAmcGF0aDEsICZtb2RlMSk7CisJc2hhMiA9IHRyZWVfZW50cnlfZXh0cmFjdCh0MiwgJnBhdGgyLCAmbW9kZTIpOworCisJcGF0aGxlbjEgPSBzdHJsZW4ocGF0aDEpOworCXBhdGhsZW4yID0gc3RybGVuKHBhdGgyKTsKKwljbXAgPSBiYXNlX25hbWVfY29tcGFyZShwYXRoMSwgcGF0aGxlbjEsIG1vZGUxLCBwYXRoMiwgcGF0aGxlbjIsIG1vZGUyKTsKKwlpZiAoY21wIDwgMCkgeworCQlzaG93X2VudHJ5KG9wdCwgIi0iLCB0MSwgYmFzZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGNtcCA+IDApIHsKKwkJc2hvd19lbnRyeShvcHQsICIrIiwgdDIsIGJhc2UpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCFvcHQtPmZpbmRfY29waWVzX2hhcmRlciAmJgorCSAgICAhbWVtY21wKHNoYTEsIHNoYTIsIDIwKSAmJiBtb2RlMSA9PSBtb2RlMikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBmaWxlbW9kZSBoYXMgY2hhbmdlZCB0by9mcm9tIGEgZGlyZWN0b3J5IGZyb20vdG8gYSByZWd1bGFyCisJICogZmlsZSwgd2UgbmVlZCB0byBjb25zaWRlciBpdCBhIHJlbW92ZSBhbmQgYW4gYWRkLgorCSAqLworCWlmIChTX0lTRElSKG1vZGUxKSAhPSBTX0lTRElSKG1vZGUyKSkgeworCQlzaG93X2VudHJ5KG9wdCwgIi0iLCB0MSwgYmFzZSk7CisJCXNob3dfZW50cnkob3B0LCAiKyIsIHQyLCBiYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9wdC0+cmVjdXJzaXZlICYmIFNfSVNESVIobW9kZTEpKSB7CisJCWludCByZXR2YWw7CisJCWNoYXIgKm5ld2Jhc2UgPSBtYWxsb2NfYmFzZShiYXNlLCBwYXRoMSwgcGF0aGxlbjEpOworCQlpZiAob3B0LT50cmVlX2luX3JlY3Vyc2l2ZSkKKwkJCW9wdC0+Y2hhbmdlKG9wdCwgbW9kZTEsIG1vZGUyLAorCQkJCSAgICBzaGExLCBzaGEyLCBiYXNlLCBwYXRoMSk7CisJCXJldHZhbCA9IGRpZmZfdHJlZV9zaGExKHNoYTEsIHNoYTIsIG5ld2Jhc2UsIG9wdCk7CisJCWZyZWUobmV3YmFzZSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJb3B0LT5jaGFuZ2Uob3B0LCBtb2RlMSwgbW9kZTIsIHNoYTEsIHNoYTIsIGJhc2UsIHBhdGgxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlcmVzdGluZyhzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJY29uc3QgY2hhciAqcGF0aDsKKwl1bnNpZ25lZCBtb2RlOworCWludCBpOworCWludCBiYXNlbGVuLCBwYXRobGVuOworCisJaWYgKCFvcHQtPm5yX3BhdGhzKQorCQlyZXR1cm4gMTsKKworCSh2b2lkKXRyZWVfZW50cnlfZXh0cmFjdChkZXNjLCAmcGF0aCwgJm1vZGUpOworCisJcGF0aGxlbiA9IHN0cmxlbihwYXRoKTsKKwliYXNlbGVuID0gc3RybGVuKGJhc2UpOworCisJZm9yIChpPTA7IGkgPCBvcHQtPm5yX3BhdGhzOyBpKyspIHsKKwkJY29uc3QgY2hhciAqbWF0Y2ggPSBvcHQtPnBhdGhzW2ldOworCQlpbnQgbWF0Y2hsZW4gPSBvcHQtPnBhdGhsZW5zW2ldOworCisJCWlmIChiYXNlbGVuID49IG1hdGNobGVuKSB7CisJCQkvKiBJZiBpdCBkb2Vzbid0IG1hdGNoLCBtb3ZlIGFsb25nLi4uICovCisJCQlpZiAoc3RybmNtcChiYXNlLCBtYXRjaCwgbWF0Y2hsZW4pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBUaGUgYmFzZSBpcyBhIHN1YmRpcmVjdG9yeSBvZiBhIHBhdGggd2hpY2ggd2FzIHNwZWNpZmllZC4gKi8KKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogRG9lcyB0aGUgYmFzZSBtYXRjaD8gKi8KKwkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIGJhc2VsZW4pKQorCQkJY29udGludWU7CisKKwkJbWF0Y2ggKz0gYmFzZWxlbjsKKwkJbWF0Y2hsZW4gLT0gYmFzZWxlbjsKKworCQlpZiAocGF0aGxlbiA+IG1hdGNobGVuKQorCQkJY29udGludWU7CisKKwkJaWYgKG1hdGNobGVuID4gcGF0aGxlbikgeworCQkJaWYgKG1hdGNoW3BhdGhsZW5dICE9ICcvJykKKwkJCQljb250aW51ZTsKKwkJCWlmICghU19JU0RJUihtb2RlKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJuY21wKHBhdGgsIG1hdGNoLCBwYXRobGVuKSkKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsgLyogTm8gbWF0Y2hlcyAqLworfQorCisvKiBBIHdob2xlIHN1Yi10cmVlIHdlbnQgYXdheSBvciBhcHBlYXJlZCAqLworc3RhdGljIHZvaWQgc2hvd190cmVlKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpiYXNlKQoreworCXdoaWxlIChkZXNjLT5zaXplKSB7CisJCWlmIChpbnRlcmVzdGluZyhkZXNjLCBiYXNlLCBvcHQpKQorCQkJc2hvd19lbnRyeShvcHQsIHByZWZpeCwgZGVzYywgYmFzZSk7CisJCXVwZGF0ZV90cmVlX2VudHJ5KGRlc2MpOworCX0KK30KKworLyogQSBmaWxlIGVudHJ5IHdlbnQgYXdheSBvciBhcHBlYXJlZCAqLworc3RhdGljIGludCBzaG93X2VudHJ5KHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCwgY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjLCBjb25zdCBjaGFyICpiYXNlKQoreworCXVuc2lnbmVkIG1vZGU7CisJY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KGRlc2MsICZwYXRoLCAmbW9kZSk7CisKKwlpZiAob3B0LT5yZWN1cnNpdmUgJiYgU19JU0RJUihtb2RlKSkgeworCQljaGFyIHR5cGVbMjBdOworCQljaGFyICpuZXdiYXNlID0gbWFsbG9jX2Jhc2UoYmFzZSwgcGF0aCwgc3RybGVuKHBhdGgpKTsKKwkJc3RydWN0IHRyZWVfZGVzYyBpbm5lcjsKKwkJdm9pZCAqdHJlZTsKKworCQl0cmVlID0gcmVhZF9zaGExX2ZpbGUoc2hhMSwgdHlwZSwgJmlubmVyLnNpemUpOworCQlpZiAoIXRyZWUgfHwgc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpCisJCQlkaWUoImNvcnJ1cHQgdHJlZSBzaGEgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwkJaW5uZXIuYnVmID0gdHJlZTsKKwkJc2hvd190cmVlKG9wdCwgcHJlZml4LCAmaW5uZXIsIG5ld2Jhc2UpOworCisJCWZyZWUodHJlZSk7CisJCWZyZWUobmV3YmFzZSk7CisJCXJldHVybiAwOworCX0KKworCW9wdC0+YWRkX3JlbW92ZShvcHQsIHByZWZpeFswXSwgbW9kZSwgc2hhMSwgYmFzZSwgcGF0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWZmX3RyZWUoc3RydWN0IHRyZWVfZGVzYyAqdDEsIHN0cnVjdCB0cmVlX2Rlc2MgKnQyLCBjb25zdCBjaGFyICpiYXNlLCBzdHJ1Y3QgZGlmZl9vcHRpb25zICpvcHQpCit7CisJd2hpbGUgKHQxLT5zaXplIHwgdDItPnNpemUpIHsKKwkJaWYgKG9wdC0+bnJfcGF0aHMgJiYgdDEtPnNpemUgJiYgIWludGVyZXN0aW5nKHQxLCBiYXNlLCBvcHQpKSB7CisJCQl1cGRhdGVfdHJlZV9lbnRyeSh0MSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob3B0LT5ucl9wYXRocyAmJiB0Mi0+c2l6ZSAmJiAhaW50ZXJlc3RpbmcodDIsIGJhc2UsIG9wdCkpIHsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdDEtPnNpemUpIHsKKwkJCXNob3dfZW50cnkob3B0LCAiKyIsIHQyLCBiYXNlKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghdDItPnNpemUpIHsKKwkJCXNob3dfZW50cnkob3B0LCAiLSIsIHQxLCBiYXNlKTsKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAoY29tcGFyZV90cmVlX2VudHJ5KHQxLCB0MiwgYmFzZSwgb3B0KSkgeworCQljYXNlIC0xOgorCQkJdXBkYXRlX3RyZWVfZW50cnkodDEpOworCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQxKTsKKwkJCS8qIEZhbGx0aHJvdWdoICovCisJCWNhc2UgMToKKwkJCXVwZGF0ZV90cmVlX2VudHJ5KHQyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRpZSgiZ2l0LWRpZmYtdHJlZTogaW50ZXJuYWwgZXJyb3IiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBkaWZmX3RyZWVfc2hhMShjb25zdCB1bnNpZ25lZCBjaGFyICpvbGQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ldywgY29uc3QgY2hhciAqYmFzZSwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCXZvaWQgKnRyZWUxLCAqdHJlZTI7CisJc3RydWN0IHRyZWVfZGVzYyB0MSwgdDI7CisJaW50IHJldHZhbDsKKworCXRyZWUxID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uob2xkLCB0cmVlX3R5cGUsICZ0MS5zaXplLCBOVUxMKTsKKwlpZiAoIXRyZWUxKQorCQlkaWUoInVuYWJsZSB0byByZWFkIHNvdXJjZSB0cmVlICglcykiLCBzaGExX3RvX2hleChvbGQpKTsKKwl0cmVlMiA9IHJlYWRfb2JqZWN0X3dpdGhfcmVmZXJlbmNlKG5ldywgdHJlZV90eXBlLCAmdDIuc2l6ZSwgTlVMTCk7CisJaWYgKCF0cmVlMikKKwkJZGllKCJ1bmFibGUgdG8gcmVhZCBkZXN0aW5hdGlvbiB0cmVlICglcykiLCBzaGExX3RvX2hleChuZXcpKTsKKwl0MS5idWYgPSB0cmVlMTsKKwl0Mi5idWYgPSB0cmVlMjsKKwlyZXR2YWwgPSBkaWZmX3RyZWUoJnQxLCAmdDIsIGJhc2UsIG9wdCk7CisJZnJlZSh0cmVlMSk7CisJZnJlZSh0cmVlMik7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjb3VudF9wYXRocyhjb25zdCBjaGFyICoqcGF0aHMpCit7CisJaW50IGkgPSAwOworCXdoaWxlICgqcGF0aHMrKykKKwkJaSsrOworCXJldHVybiBpOworfQorCit2b2lkIGRpZmZfdHJlZV9yZWxlYXNlX3BhdGhzKHN0cnVjdCBkaWZmX29wdGlvbnMgKm9wdCkKK3sKKwlmcmVlKG9wdC0+cGF0aGxlbnMpOworfQorCit2b2lkIGRpZmZfdHJlZV9zZXR1cF9wYXRocyhjb25zdCBjaGFyICoqcCwgc3RydWN0IGRpZmZfb3B0aW9ucyAqb3B0KQoreworCW9wdC0+bnJfcGF0aHMgPSAwOworCW9wdC0+cGF0aGxlbnMgPSBOVUxMOworCW9wdC0+cGF0aHMgPSBOVUxMOworCisJaWYgKHApIHsKKwkJaW50IGk7CisKKwkJb3B0LT5wYXRocyA9IHA7CisJCW9wdC0+bnJfcGF0aHMgPSBjb3VudF9wYXRocyhwKTsKKwkJaWYgKG9wdC0+bnJfcGF0aHMgPT0gMCkgeworCQkJb3B0LT5wYXRobGVucyA9IE5VTEw7CisJCQlyZXR1cm47CisJCX0KKwkJb3B0LT5wYXRobGVucyA9IHhtYWxsb2Mob3B0LT5ucl9wYXRocyAqIHNpemVvZihpbnQpKTsKKwkJZm9yIChpPTA7IGkgPCBvcHQtPm5yX3BhdGhzOyBpKyspCisJCQlvcHQtPnBhdGhsZW5zW2ldID0gc3RybGVuKHBbaV0pOworCX0KK30KZGlmZiAtLWdpdCBhL3RyZWUtd2Fsay5jIGIvdHJlZS13YWxrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4M2U5OAotLS0gL2Rldi9udWxsCisrKyBiL3RyZWUtd2Fsay5jCkBAIC0wLDAgKzEsMjEyIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLXdhbGsuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisKK3ZvaWQgKmZpbGxfdHJlZV9kZXNjcmlwdG9yKHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKKwl2b2lkICpidWYgPSBOVUxMOworCisJaWYgKHNoYTEpIHsKKwkJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uoc2hhMSwgdHJlZV90eXBlLCAmc2l6ZSwgTlVMTCk7CisJCWlmICghYnVmKQorCQkJZGllKCJ1bmFibGUgdG8gcmVhZCB0cmVlICVzIiwgc2hhMV90b19oZXgoc2hhMSkpOworCX0KKwlkZXNjLT5zaXplID0gc2l6ZTsKKwlkZXNjLT5idWYgPSBidWY7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBlbnRyeV9jb21wYXJlKHN0cnVjdCBuYW1lX2VudHJ5ICphLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqYikKK3sKKwlyZXR1cm4gYmFzZV9uYW1lX2NvbXBhcmUoCisJCQlhLT5wYXRoLCBhLT5wYXRobGVuLCBhLT5tb2RlLAorCQkJYi0+cGF0aCwgYi0+cGF0aGxlbiwgYi0+bW9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGVudHJ5X2NsZWFyKHN0cnVjdCBuYW1lX2VudHJ5ICphKQoreworCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKK30KKworc3RhdGljIHZvaWQgZW50cnlfZXh0cmFjdChzdHJ1Y3QgdHJlZV9kZXNjICp0LCBzdHJ1Y3QgbmFtZV9lbnRyeSAqYSkKK3sKKwlhLT5zaGExID0gdHJlZV9lbnRyeV9leHRyYWN0KHQsICZhLT5wYXRoLCAmYS0+bW9kZSk7CisJYS0+cGF0aGxlbiA9IHN0cmxlbihhLT5wYXRoKTsKK30KKwordm9pZCB1cGRhdGVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICpkZXNjKQoreworCWNvbnN0IHZvaWQgKmJ1ZiA9IGRlc2MtPmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBkZXNjLT5zaXplOworCWludCBsZW4gPSBzdHJsZW4oYnVmKSArIDEgKyAyMDsKKworCWlmIChzaXplIDwgbGVuKQorCQlkaWUoImNvcnJ1cHQgdHJlZSBmaWxlIik7CisJZGVzYy0+YnVmID0gKGNoYXIgKikgYnVmICsgbGVuOworCWRlc2MtPnNpemUgPSBzaXplIC0gbGVuOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X21vZGUoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgKm1vZGVwKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwl1bnNpZ25lZCBpbnQgbW9kZSA9IDA7CisKKwl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgeworCQlpZiAoYyA8ICcwJyB8fCBjID4gJzcnKQorCQkJcmV0dXJuIE5VTEw7CisJCW1vZGUgPSAobW9kZSA8PCAzKSArIChjIC0gJzAnKTsKKwl9CisJKm1vZGVwID0gbW9kZTsKKwlyZXR1cm4gc3RyOworfQorCitjb25zdCB1bnNpZ25lZCBjaGFyICp0cmVlX2VudHJ5X2V4dHJhY3Qoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgY29uc3QgY2hhciAqKnBhdGhwLCB1bnNpZ25lZCBpbnQgKm1vZGVwKQoreworCWNvbnN0IHZvaWQgKnRyZWUgPSBkZXNjLT5idWY7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZGVzYy0+c2l6ZTsKKwlpbnQgbGVuID0gc3RybGVuKHRyZWUpKzE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSA9ICh1bnNpZ25lZCBjaGFyICopIHRyZWUgKyBsZW47CisJY29uc3QgY2hhciAqcGF0aDsKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCXBhdGggPSBnZXRfbW9kZSh0cmVlLCAmbW9kZSk7CisJaWYgKCFwYXRoIHx8IHNpemUgPCBsZW4gKyAyMCkKKwkJZGllKCJjb3JydXB0IHRyZWUgZmlsZSIpOworCSpwYXRocCA9IHBhdGg7CisJKm1vZGVwID0gY2Fub25fbW9kZShtb2RlKTsKKwlyZXR1cm4gc2hhMTsKK30KKworaW50IHRyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqZGVzYywgc3RydWN0IG5hbWVfZW50cnkgKmVudHJ5KQoreworCWNvbnN0IHZvaWQgKnRyZWUgPSBkZXNjLT5idWY7CisJY29uc3QgY2hhciAqcGF0aDsKKwl1bnNpZ25lZCBsb25nIGxlbiwgc2l6ZSA9IGRlc2MtPnNpemU7CisKKwlpZiAoIXNpemUpCisJCXJldHVybiAwOworCisJcGF0aCA9IGdldF9tb2RlKHRyZWUsICZlbnRyeS0+bW9kZSk7CisJaWYgKCFwYXRoKQorCQlkaWUoImNvcnJ1cHQgdHJlZSBmaWxlIik7CisKKwllbnRyeS0+cGF0aCA9IHBhdGg7CisJbGVuID0gc3RybGVuKHBhdGgpOworCWVudHJ5LT5wYXRobGVuID0gbGVuOworCisJcGF0aCArPSBsZW4gKyAxOworCWVudHJ5LT5zaGExID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcGF0aDsKKworCXBhdGggKz0gMjA7CisJbGVuID0gcGF0aCAtIChjaGFyICopIHRyZWU7CisJaWYgKGxlbiA+IHNpemUpCisJCWRpZSgiY29ycnVwdCB0cmVlIGZpbGUiKTsKKworCWRlc2MtPmJ1ZiA9IHBhdGg7CisJZGVzYy0+c2l6ZSA9IHNpemUgLSBsZW47CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgdHJhdmVyc2VfdHJlZXMoaW50IG4sIHN0cnVjdCB0cmVlX2Rlc2MgKnQsIGNvbnN0IGNoYXIgKmJhc2UsIHRyYXZlcnNlX2NhbGxiYWNrX3QgY2FsbGJhY2spCit7CisJc3RydWN0IG5hbWVfZW50cnkgKmVudHJ5ID0geG1hbGxvYyhuKnNpemVvZigqZW50cnkpKTsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IG5hbWVfZW50cnkgZW50cnlbM107CisJCXVuc2lnbmVkIGxvbmcgbWFzayA9IDA7CisJCWludCBpLCBsYXN0OworCisJCWxhc3QgPSAtMTsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJaWYgKCF0W2ldLnNpemUpCisJCQkJY29udGludWU7CisJCQllbnRyeV9leHRyYWN0KHQraSwgZW50cnkraSk7CisJCQlpZiAobGFzdCA+PSAwKSB7CisJCQkJaW50IGNtcCA9IGVudHJ5X2NvbXBhcmUoZW50cnkraSwgZW50cnkrbGFzdCk7CisKKwkJCQkvKgorCQkJCSAqIElzIHRoZSBuZXcgbmFtZSBiaWdnZXIgdGhhbiB0aGUgb2xkIG9uZT8KKwkJCQkgKiBJZ25vcmUgaXQKKwkJCQkgKi8KKwkJCQlpZiAoY21wID4gMCkKKwkJCQkJY29udGludWU7CisJCQkJLyoKKwkJCQkgKiBJcyB0aGUgbmV3IG5hbWUgc21hbGxlciB0aGFuIHRoZSBvbGQgb25lPworCQkJCSAqIElnbm9yZSBhbGwgb2xkIG9uZXMKKwkJCQkgKi8KKwkJCQlpZiAoY21wIDwgMCkKKwkJCQkJbWFzayA9IDA7CisJCQl9CisJCQltYXNrIHw9IDF1bCA8PCBpOworCQkJbGFzdCA9IGk7CisJCX0KKwkJaWYgKCFtYXNrKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVXBkYXRlIHRoZSB0cmVlIGVudHJpZXMgd2UndmUgd2Fsa2VkLCBhbmQgY2xlYXIKKwkJICogYWxsIHRoZSB1bnVzZWQgbmFtZS1lbnRyaWVzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJaWYgKG1hc2sgJiAoMXVsIDw8IGkpKSB7CisJCQkJdXBkYXRlX3RyZWVfZW50cnkodCtpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVudHJ5X2NsZWFyKGVudHJ5ICsgaSk7CisJCX0KKwkJY2FsbGJhY2sobiwgbWFzaywgZW50cnksIGJhc2UpOworCX0KKwlmcmVlKGVudHJ5KTsKK30KKworc3RhdGljIGludCBmaW5kX3RyZWVfZW50cnkoc3RydWN0IHRyZWVfZGVzYyAqdCwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCB1bnNpZ25lZCAqbW9kZSkKK3sKKwlpbnQgbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwl3aGlsZSAodC0+c2l6ZSkgeworCQljb25zdCBjaGFyICplbnRyeTsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwkJaW50IGVudHJ5bGVuLCBjbXA7CisKKwkJc2hhMSA9IHRyZWVfZW50cnlfZXh0cmFjdCh0LCAmZW50cnksIG1vZGUpOworCQl1cGRhdGVfdHJlZV9lbnRyeSh0KTsKKwkJZW50cnlsZW4gPSBzdHJsZW4oZW50cnkpOworCQlpZiAoZW50cnlsZW4gPiBuYW1lbGVuKQorCQkJY29udGludWU7CisJCWNtcCA9IG1lbWNtcChuYW1lLCBlbnRyeSwgZW50cnlsZW4pOworCQlpZiAoY21wID4gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY21wIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoZW50cnlsZW4gPT0gbmFtZWxlbikgeworCQkJbWVtY3B5KHJlc3VsdCwgc2hhMSwgMjApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKG5hbWVbZW50cnlsZW5dICE9ICcvJykKKwkJCWNvbnRpbnVlOworCQlpZiAoIVNfSVNESVIoKm1vZGUpKQorCQkJYnJlYWs7CisJCWlmICgrK2VudHJ5bGVuID09IG5hbWVsZW4pIHsKKwkJCW1lbWNweShyZXN1bHQsIHNoYTEsIDIwKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBnZXRfdHJlZV9lbnRyeShzaGExLCBuYW1lICsgZW50cnlsZW4sIHJlc3VsdCwgbW9kZSk7CisJfQorCXJldHVybiAtMTsKK30KKworaW50IGdldF90cmVlX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRyZWVfc2hhMSwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqc2hhMSwgdW5zaWduZWQgKm1vZGUpCit7CisJaW50IHJldHZhbDsKKwl2b2lkICp0cmVlOworCXN0cnVjdCB0cmVlX2Rlc2MgdDsKKworCXRyZWUgPSByZWFkX29iamVjdF93aXRoX3JlZmVyZW5jZSh0cmVlX3NoYTEsIHRyZWVfdHlwZSwgJnQuc2l6ZSwgTlVMTCk7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gLTE7CisJdC5idWYgPSB0cmVlOworCXJldHZhbCA9IGZpbmRfdHJlZV9lbnRyeSgmdCwgbmFtZSwgc2hhMSwgbW9kZSk7CisJZnJlZSh0cmVlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS90cmVlLXdhbGsuaCBiL3RyZWUtd2Fsay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2JlZmEKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLXdhbGsuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIFRSRUVfV0FMS19ICisjZGVmaW5lIFRSRUVfV0FMS19ICisKK3N0cnVjdCB0cmVlX2Rlc2MgeworCWNvbnN0IHZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9OworCitzdHJ1Y3QgbmFtZV9lbnRyeSB7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMTsKKwljb25zdCBjaGFyICpwYXRoOworCXVuc2lnbmVkIGludCBtb2RlOworCWludCBwYXRobGVuOworfTsKKwordm9pZCB1cGRhdGVfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9kZXNjICopOworY29uc3QgdW5zaWduZWQgY2hhciAqdHJlZV9lbnRyeV9leHRyYWN0KHN0cnVjdCB0cmVlX2Rlc2MgKiwgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopOworCisvKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBkb2VzIGJvdGggb2YgdGhlIGFib3ZlIGFuZCByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3MgKi8KK2ludCB0cmVlX2VudHJ5KHN0cnVjdCB0cmVlX2Rlc2MgKiwgc3RydWN0IG5hbWVfZW50cnkgKik7CisKK3ZvaWQgKmZpbGxfdHJlZV9kZXNjcmlwdG9yKHN0cnVjdCB0cmVlX2Rlc2MgKmRlc2MsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpOworCit0eXBlZGVmIHZvaWQgKCp0cmF2ZXJzZV9jYWxsYmFja190KShpbnQgbiwgdW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3QgbmFtZV9lbnRyeSAqZW50cnksIGNvbnN0IGNoYXIgKmJhc2UpOworCit2b2lkIHRyYXZlcnNlX3RyZWVzKGludCBuLCBzdHJ1Y3QgdHJlZV9kZXNjICp0LCBjb25zdCBjaGFyICpiYXNlLCB0cmF2ZXJzZV9jYWxsYmFja190IGNhbGxiYWNrKTsKKworaW50IGdldF90cmVlX2VudHJ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkICopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RyZWUuYyBiL3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjAzMmUzCi0tLSAvZGV2L251bGwKKysrIGIvdHJlZS5jCkBAIC0wLDAgKzEsMjMwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ0cmVlLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUtd2Fsay5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitjb25zdCBjaGFyICp0cmVlX3R5cGUgPSAidHJlZSI7CisKK3N0YXRpYyBpbnQgcmVhZF9vbmVfZW50cnkoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCB1bnNpZ25lZCBtb2RlLCBpbnQgc3RhZ2UpCit7CisJaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlzdHJ1Y3QgY2FjaGVfZW50cnkgKmNlOworCisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiBSRUFEX1RSRUVfUkVDVVJTSVZFOworCisJbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKwlzaXplID0gY2FjaGVfZW50cnlfc2l6ZShiYXNlbGVuICsgbGVuKTsKKwljZSA9IHhjYWxsb2MoMSwgc2l6ZSk7CisKKwljZS0+Y2VfbW9kZSA9IGNyZWF0ZV9jZV9tb2RlKG1vZGUpOworCWNlLT5jZV9mbGFncyA9IGNyZWF0ZV9jZV9mbGFncyhiYXNlbGVuICsgbGVuLCBzdGFnZSk7CisJbWVtY3B5KGNlLT5uYW1lLCBiYXNlLCBiYXNlbGVuKTsKKwltZW1jcHkoY2UtPm5hbWUgKyBiYXNlbGVuLCBwYXRobmFtZSwgbGVuKzEpOworCW1lbWNweShjZS0+c2hhMSwgc2hhMSwgMjApOworCXJldHVybiBhZGRfY2FjaGVfZW50cnkoY2UsIEFERF9DQUNIRV9PS19UT19BRER8QUREX0NBQ0hFX1NLSVBfREZDSEVDSyk7Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfdHJlZV9lbnRyeShjb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwgY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgaW50IG1vZGUsIGNvbnN0IGNoYXIgKipwYXRocykKK3sKKwljb25zdCBjaGFyICptYXRjaDsKKwlpbnQgcGF0aGxlbjsKKworCWlmICghcGF0aHMpCisJCXJldHVybiAxOworCXBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7CisJd2hpbGUgKChtYXRjaCA9ICpwYXRocysrKSAhPSBOVUxMKSB7CisJCWludCBtYXRjaGxlbiA9IHN0cmxlbihtYXRjaCk7CisKKwkJaWYgKGJhc2VsZW4gPj0gbWF0Y2hsZW4pIHsKKwkJCS8qIElmIGl0IGRvZXNuJ3QgbWF0Y2gsIG1vdmUgYWxvbmcuLi4gKi8KKwkJCWlmIChzdHJuY21wKGJhc2UsIG1hdGNoLCBtYXRjaGxlbikpCisJCQkJY29udGludWU7CisJCQkvKiBUaGUgYmFzZSBpcyBhIHN1YmRpcmVjdG9yeSBvZiBhIHBhdGggd2hpY2ggd2FzIHNwZWNpZmllZC4gKi8KKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogRG9lcyB0aGUgYmFzZSBtYXRjaD8gKi8KKwkJaWYgKHN0cm5jbXAoYmFzZSwgbWF0Y2gsIGJhc2VsZW4pKQorCQkJY29udGludWU7CisKKwkJbWF0Y2ggKz0gYmFzZWxlbjsKKwkJbWF0Y2hsZW4gLT0gYmFzZWxlbjsKKworCQlpZiAocGF0aGxlbiA+IG1hdGNobGVuKQorCQkJY29udGludWU7CisKKwkJaWYgKG1hdGNobGVuID4gcGF0aGxlbikgeworCQkJaWYgKG1hdGNoW3BhdGhsZW5dICE9ICcvJykKKwkJCQljb250aW51ZTsKKwkJCWlmICghU19JU0RJUihtb2RlKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJuY21wKHBhdGgsIG1hdGNoLCBwYXRobGVuKSkKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJlYWRfdHJlZV9yZWN1cnNpdmUoc3RydWN0IHRyZWUgKnRyZWUsCisJCQljb25zdCBjaGFyICpiYXNlLCBpbnQgYmFzZWxlbiwKKwkJCWludCBzdGFnZSwgY29uc3QgY2hhciAqKm1hdGNoLAorCQkJcmVhZF90cmVlX2ZuX3QgZm4pCit7CisJc3RydWN0IHRyZWVfZGVzYyBkZXNjOworCXN0cnVjdCBuYW1lX2VudHJ5IGVudHJ5OworCisJaWYgKHBhcnNlX3RyZWUodHJlZSkpCisJCXJldHVybiAtMTsKKworCWRlc2MuYnVmID0gdHJlZS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IHRyZWUtPnNpemU7CisKKwl3aGlsZSAodHJlZV9lbnRyeSgmZGVzYywgJmVudHJ5KSkgeworCQlpZiAoIW1hdGNoX3RyZWVfZW50cnkoYmFzZSwgYmFzZWxlbiwgZW50cnkucGF0aCwgZW50cnkubW9kZSwgbWF0Y2gpKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChmbihlbnRyeS5zaGExLCBiYXNlLCBiYXNlbGVuLCBlbnRyeS5wYXRoLCBlbnRyeS5tb2RlLCBzdGFnZSkpIHsKKwkJY2FzZSAwOgorCQkJY29udGludWU7CisJCWNhc2UgUkVBRF9UUkVFX1JFQ1VSU0lWRToKKwkJCWJyZWFrOzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoU19JU0RJUihlbnRyeS5tb2RlKSkgeworCQkJaW50IHJldHZhbDsKKwkJCWNoYXIgKm5ld2Jhc2U7CisKKwkJCW5ld2Jhc2UgPSB4bWFsbG9jKGJhc2VsZW4gKyAxICsgZW50cnkucGF0aGxlbik7CisJCQltZW1jcHkobmV3YmFzZSwgYmFzZSwgYmFzZWxlbik7CisJCQltZW1jcHkobmV3YmFzZSArIGJhc2VsZW4sIGVudHJ5LnBhdGgsIGVudHJ5LnBhdGhsZW4pOworCQkJbmV3YmFzZVtiYXNlbGVuICsgZW50cnkucGF0aGxlbl0gPSAnLyc7CisJCQlyZXR2YWwgPSByZWFkX3RyZWVfcmVjdXJzaXZlKGxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLAorCQkJCQkJICAgICBuZXdiYXNlLAorCQkJCQkJICAgICBiYXNlbGVuICsgZW50cnkucGF0aGxlbiArIDEsCisJCQkJCQkgICAgIHN0YWdlLCBtYXRjaCwgZm4pOworCQkJZnJlZShuZXdiYXNlKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIC0xOworCQkJY29udGludWU7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWFkX3RyZWUoc3RydWN0IHRyZWUgKnRyZWUsIGludCBzdGFnZSwgY29uc3QgY2hhciAqKm1hdGNoKQoreworCXJldHVybiByZWFkX3RyZWVfcmVjdXJzaXZlKHRyZWUsICIiLCAwLCBzdGFnZSwgbWF0Y2gsIHJlYWRfb25lX2VudHJ5KTsKK30KKworc3RydWN0IHRyZWUgKmxvb2t1cF90cmVlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RydWN0IG9iamVjdCAqb2JqID0gbG9va3VwX29iamVjdChzaGExKTsKKwlpZiAoIW9iaikgeworCQlzdHJ1Y3QgdHJlZSAqcmV0ID0gYWxsb2NfdHJlZV9ub2RlKCk7CisJCWNyZWF0ZWRfb2JqZWN0KHNoYTEsICZyZXQtPm9iamVjdCk7CisJCXJldC0+b2JqZWN0LnR5cGUgPSBPQkpfVFJFRTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCFvYmotPnR5cGUpCisJCW9iai0+dHlwZSA9IE9CSl9UUkVFOworCWlmIChvYmotPnR5cGUgIT0gT0JKX1RSRUUpIHsKKwkJZXJyb3IoIk9iamVjdCAlcyBpcyBhICVzLCBub3QgYSB0cmVlIiwKKwkJICAgICAgc2hhMV90b19oZXgoc2hhMSksIHR5cGVuYW1lKG9iai0+dHlwZSkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgdHJlZSAqKSBvYmo7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2tfdHJlZV9yZWZzKHN0cnVjdCB0cmVlICppdGVtKQoreworCWludCBuX3JlZnMgPSAwLCBpOworCXN0cnVjdCBvYmplY3RfcmVmcyAqcmVmczsKKwlzdHJ1Y3QgdHJlZV9kZXNjIGRlc2M7CisJc3RydWN0IG5hbWVfZW50cnkgZW50cnk7CisKKwkvKiBDb3VudCBob3cgbWFueSBlbnRyaWVzIHRoZXJlIGFyZS4uICovCisJZGVzYy5idWYgPSBpdGVtLT5idWZmZXI7CisJZGVzYy5zaXplID0gaXRlbS0+c2l6ZTsKKwl3aGlsZSAoZGVzYy5zaXplKSB7CisJCW5fcmVmcysrOworCQl1cGRhdGVfdHJlZV9lbnRyeSgmZGVzYyk7CisJfQorCisJLyogQWxsb2NhdGUgb2JqZWN0IHJlZnMgYW5kIHdhbGsgaXQgYWdhaW4uLiAqLworCWkgPSAwOworCXJlZnMgPSBhbGxvY19vYmplY3RfcmVmcyhuX3JlZnMpOworCWRlc2MuYnVmID0gaXRlbS0+YnVmZmVyOworCWRlc2Muc2l6ZSA9IGl0ZW0tPnNpemU7CisJd2hpbGUgKHRyZWVfZW50cnkoJmRlc2MsICZlbnRyeSkpIHsKKwkJc3RydWN0IG9iamVjdCAqb2JqOworCisJCWlmIChTX0lTRElSKGVudHJ5Lm1vZGUpKQorCQkJb2JqID0gJmxvb2t1cF90cmVlKGVudHJ5LnNoYTEpLT5vYmplY3Q7CisJCWVsc2UKKwkJCW9iaiA9ICZsb29rdXBfYmxvYihlbnRyeS5zaGExKS0+b2JqZWN0OworCQlyZWZzLT5yZWZbaSsrXSA9IG9iajsKKwl9CisJc2V0X29iamVjdF9yZWZzKCZpdGVtLT5vYmplY3QsIHJlZnMpOworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfdHJlZV9idWZmZXIoc3RydWN0IHRyZWUgKml0ZW0sIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChpdGVtLT5vYmplY3QucGFyc2VkKQorCQlyZXR1cm4gMDsKKwlpdGVtLT5vYmplY3QucGFyc2VkID0gMTsKKwlpdGVtLT5idWZmZXIgPSBidWZmZXI7CisJaXRlbS0+c2l6ZSA9IHNpemU7CisKKwlpZiAodHJhY2tfb2JqZWN0X3JlZnMpCisJCXRyYWNrX3RyZWVfcmVmcyhpdGVtKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHBhcnNlX3RyZWUoc3RydWN0IHRyZWUgKml0ZW0pCit7CisJIGNoYXIgdHlwZVsyMF07CisJIHZvaWQgKmJ1ZmZlcjsKKwkgdW5zaWduZWQgbG9uZyBzaXplOworCisJaWYgKGl0ZW0tPm9iamVjdC5wYXJzZWQpCisJCXJldHVybiAwOworCWJ1ZmZlciA9IHJlYWRfc2hhMV9maWxlKGl0ZW0tPm9iamVjdC5zaGExLCB0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiBlcnJvcigiQ291bGQgbm90IHJlYWQgJXMiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCWlmIChzdHJjbXAodHlwZSwgdHJlZV90eXBlKSkgeworCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiBlcnJvcigiT2JqZWN0ICVzIG5vdCBhIHRyZWUiLAorCQkJICAgICBzaGExX3RvX2hleChpdGVtLT5vYmplY3Quc2hhMSkpOworCX0KKwlyZXR1cm4gcGFyc2VfdHJlZV9idWZmZXIoaXRlbSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RydWN0IHRyZWUgKnBhcnNlX3RyZWVfaW5kaXJlY3QoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJZG8geworCQlpZiAoIW9iaikKKwkJCXJldHVybiBOVUxMOworCQlpZiAob2JqLT50eXBlID09IE9CSl9UUkVFKQorCQkJcmV0dXJuIChzdHJ1Y3QgdHJlZSAqKSBvYmo7CisJCWVsc2UgaWYgKG9iai0+dHlwZSA9PSBPQkpfQ09NTUlUKQorCQkJb2JqID0gJigoKHN0cnVjdCBjb21taXQgKikgb2JqKS0+dHJlZS0+b2JqZWN0KTsKKwkJZWxzZSBpZiAob2JqLT50eXBlID09IE9CSl9UQUcpCisJCQlvYmogPSAoKHN0cnVjdCB0YWcgKikgb2JqKS0+dGFnZ2VkOworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCFvYmotPnBhcnNlZCkKKwkJCXBhcnNlX29iamVjdChvYmotPnNoYTEpOworCX0gd2hpbGUgKDEpOworfQpkaWZmIC0tZ2l0IGEvdHJlZS5oIGIvdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMjVjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90cmVlLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBUUkVFX0gKKyNkZWZpbmUgVFJFRV9ICisKKyNpbmNsdWRlICJvYmplY3QuaCIKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnRyZWVfdHlwZTsKKworc3RydWN0IHRyZWUgeworCXN0cnVjdCBvYmplY3Qgb2JqZWN0OworCXZvaWQgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7Cit9OworCitzdHJ1Y3QgdHJlZSAqbG9va3VwX3RyZWUoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSk7CisKK2ludCBwYXJzZV90cmVlX2J1ZmZlcihzdHJ1Y3QgdHJlZSAqaXRlbSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitpbnQgcGFyc2VfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSk7CisKKy8qIFBhcnNlcyBhbmQgcmV0dXJucyB0aGUgdHJlZSBpbiB0aGUgZ2l2ZW4gZW50LCBjaGFzaW5nIHRhZ3MgYW5kIGNvbW1pdHMuICovCitzdHJ1Y3QgdHJlZSAqcGFyc2VfdHJlZV9pbmRpcmVjdChjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExKTsKKworI2RlZmluZSBSRUFEX1RSRUVfUkVDVVJTSVZFIDEKK3R5cGVkZWYgaW50ICgqcmVhZF90cmVlX2ZuX3QpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworCitleHRlcm4gaW50IHJlYWRfdHJlZV9yZWN1cnNpdmUoc3RydWN0IHRyZWUgKnRyZWUsCisJCQkgICAgICAgY29uc3QgY2hhciAqYmFzZSwgaW50IGJhc2VsZW4sCisJCQkgICAgICAgaW50IHN0YWdlLCBjb25zdCBjaGFyICoqbWF0Y2gsCisJCQkgICAgICAgcmVhZF90cmVlX2ZuX3QgZm4pOworCitleHRlcm4gaW50IHJlYWRfdHJlZShzdHJ1Y3QgdHJlZSAqdHJlZSwgaW50IHN0YWdlLCBjb25zdCBjaGFyICoqcGF0aHMpOworCisjZW5kaWYgLyogVFJFRV9IICovCmRpZmYgLS1naXQgYS91bnBhY2stZmlsZS5jIGIvdW5wYWNrLWZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RkZjFkCi0tLSAvZGV2L251bGwKKysrIGIvdW5wYWNrLWZpbGUuYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJibG9iLmgiCisKK3N0YXRpYyBjaGFyICpjcmVhdGVfdGVtcF9maWxlKHVuc2lnbmVkIGNoYXIgKnNoYTEpCit7CisJc3RhdGljIGNoYXIgcGF0aFs1MF07CisJdm9pZCAqYnVmOworCWNoYXIgdHlwZVsxMDBdOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgZmQ7CisKKwlidWYgPSByZWFkX3NoYTFfZmlsZShzaGExLCB0eXBlLCAmc2l6ZSk7CisJaWYgKCFidWYgfHwgc3RyY21wKHR5cGUsIGJsb2JfdHlwZSkpCisJCWRpZSgidW5hYmxlIHRvIHJlYWQgYmxvYiBvYmplY3QgJXMiLCBzaGExX3RvX2hleChzaGExKSk7CisKKwlzdHJjcHkocGF0aCwgIi5tZXJnZV9maWxlX1hYWFhYWCIpOworCWZkID0gbWtzdGVtcChwYXRoKTsKKwlpZiAoZmQgPCAwKQorCQlkaWUoInVuYWJsZSB0byBjcmVhdGUgdGVtcC1maWxlIik7CisJaWYgKHdyaXRlKGZkLCBidWYsIHNpemUpICE9IHNpemUpCisJCWRpZSgidW5hYmxlIHRvIHdyaXRlIHRlbXAtZmlsZSIpOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gcGF0aDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CisKKwlpZiAoYXJnYyAhPSAyKQorCQl1c2FnZSgiZ2l0LXVucGFjay1maWxlIDxzaGExPiIpOworCWlmIChnZXRfc2hhMShhcmd2WzFdLCBzaGExKSkKKwkJZGllKCJOb3QgYSB2YWxpZCBvYmplY3QgbmFtZSAlcyIsIGFyZ3ZbMV0pOworCisJc2V0dXBfZ2l0X2RpcmVjdG9yeSgpOworCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKworCXB1dHMoY3JlYXRlX3RlbXBfZmlsZShzaGExKSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bnBhY2stb2JqZWN0cy5jIGIvdW5wYWNrLW9iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMxZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5wYWNrLW9iamVjdHMuYwpAQCAtMCwwICsxLDMxMSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAib2JqZWN0LmgiCisjaW5jbHVkZSAiZGVsdGEuaCIKKyNpbmNsdWRlICJwYWNrLmgiCisjaW5jbHVkZSAiYmxvYi5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgInRyZWUuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKK3N0YXRpYyBpbnQgZHJ5X3J1biwgcXVpZXQ7CitzdGF0aWMgY29uc3QgY2hhciB1bnBhY2tfdXNhZ2VbXSA9ICJnaXQtdW5wYWNrLW9iamVjdHMgWy1uXSBbLXFdIDwgcGFjay1maWxlIjsKKworLyogV2UgYWx3YXlzIHJlYWQgaW4gNGtCIGNodW5rcy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls0MDk2XTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9mZnNldCwgbGVuLCBlb2Y7CitzdGF0aWMgU0hBX0NUWCBjdHg7CisKKy8qCisgKiBNYWtlIHN1cmUgYXQgbGVhc3QgIm1pbiIgYnl0ZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLCBhbmQKKyAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCAqIGZpbGwoaW50IG1pbikKK3sKKwlpZiAobWluIDw9IGxlbikKKwkJcmV0dXJuIGJ1ZmZlciArIG9mZnNldDsKKwlpZiAoZW9mKQorCQlkaWUoInVuYWJsZSB0byBmaWxsIGlucHV0Iik7CisJaWYgKG1pbiA+IHNpemVvZihidWZmZXIpKQorCQlkaWUoImNhbm5vdCBmaWxsICVkIGJ5dGVzIiwgbWluKTsKKwlpZiAob2Zmc2V0KSB7CisJCVNIQTFfVXBkYXRlKCZjdHgsIGJ1ZmZlciwgb2Zmc2V0KTsKKwkJbWVtY3B5KGJ1ZmZlciwgYnVmZmVyICsgb2Zmc2V0LCBsZW4pOworCQlvZmZzZXQgPSAwOworCX0KKwlkbyB7CisJCWludCByZXQgPSB4cmVhZCgwLCBidWZmZXIgKyBsZW4sIHNpemVvZihidWZmZXIpIC0gbGVuKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlpZiAoIXJldCkKKwkJCQlkaWUoImVhcmx5IEVPRiIpOworCQkJZGllKCJyZWFkIGVycm9yIG9uIGlucHV0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwkJbGVuICs9IHJldDsKKwl9IHdoaWxlIChsZW4gPCBtaW4pOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkIHVzZShpbnQgYnl0ZXMpCit7CisJaWYgKGJ5dGVzID4gbGVuKQorCQlkaWUoInVzZWQgbW9yZSBieXRlcyB0aGFuIHdlcmUgYXZhaWxhYmxlIik7CisJbGVuIC09IGJ5dGVzOworCW9mZnNldCArPSBieXRlczsKK30KKworc3RhdGljIHZvaWQgKmdldF9kYXRhKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl6X3N0cmVhbSBzdHJlYW07CisJdm9pZCAqYnVmID0geG1hbGxvYyhzaXplKTsKKworCW1lbXNldCgmc3RyZWFtLCAwLCBzaXplb2Yoc3RyZWFtKSk7CisKKwlzdHJlYW0ubmV4dF9vdXQgPSBidWY7CisJc3RyZWFtLmF2YWlsX291dCA9IHNpemU7CisJc3RyZWFtLm5leHRfaW4gPSBmaWxsKDEpOworCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwlpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKworCWZvciAoOzspIHsKKwkJaW50IHJldCA9IGluZmxhdGUoJnN0cmVhbSwgMCk7CisJCXVzZShsZW4gLSBzdHJlYW0uYXZhaWxfaW4pOworCQlpZiAoc3RyZWFtLnRvdGFsX291dCA9PSBzaXplICYmIHJldCA9PSBaX1NUUkVBTV9FTkQpCisJCQlicmVhazsKKwkJaWYgKHJldCAhPSBaX09LKQorCQkJZGllKCJpbmZsYXRlIHJldHVybmVkICVkXG4iLCByZXQpOworCQlzdHJlYW0ubmV4dF9pbiA9IGZpbGwoMSk7CisJCXN0cmVhbS5hdmFpbF9pbiA9IGxlbjsKKwl9CisJaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwlyZXR1cm4gYnVmOworfQorCitzdHJ1Y3QgZGVsdGFfaW5mbyB7CisJdW5zaWduZWQgY2hhciBiYXNlX3NoYTFbMjBdOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl2b2lkICpkZWx0YTsKKwlzdHJ1Y3QgZGVsdGFfaW5mbyAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVsdGFfaW5mbyAqZGVsdGFfbGlzdDsKKworc3RhdGljIHZvaWQgYWRkX2RlbHRhX3RvX2xpc3QodW5zaWduZWQgY2hhciAqYmFzZV9zaGExLCB2b2lkICpkZWx0YSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCBkZWx0YV9pbmZvICppbmZvID0geG1hbGxvYyhzaXplb2YoKmluZm8pKTsKKworCW1lbWNweShpbmZvLT5iYXNlX3NoYTEsIGJhc2Vfc2hhMSwgMjApOworCWluZm8tPnNpemUgPSBzaXplOworCWluZm8tPmRlbHRhID0gZGVsdGE7CisJaW5mby0+bmV4dCA9IGRlbHRhX2xpc3Q7CisJZGVsdGFfbGlzdCA9IGluZm87Cit9CisKK3N0YXRpYyB2b2lkIGFkZGVkX29iamVjdCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICp0eXBlLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgdm9pZCB3cml0ZV9vYmplY3Qodm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKnR5cGUpCit7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKwlpZiAod3JpdGVfc2hhMV9maWxlKGJ1Ziwgc2l6ZSwgdHlwZSwgc2hhMSkgPCAwKQorCQlkaWUoImZhaWxlZCB0byB3cml0ZSBvYmplY3QiKTsKKwlhZGRlZF9vYmplY3Qoc2hhMSwgdHlwZSwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIGludCByZXNvbHZlX2RlbHRhKGNvbnN0IGNoYXIgKnR5cGUsCisJdm9pZCAqYmFzZSwgdW5zaWduZWQgbG9uZyBiYXNlX3NpemUsIAorCXZvaWQgKmRlbHRhLCB1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUpCit7CisJdm9pZCAqcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgcmVzdWx0X3NpemU7CisKKwlyZXN1bHQgPSBwYXRjaF9kZWx0YShiYXNlLCBiYXNlX3NpemUsCisJCQkgICAgIGRlbHRhLCBkZWx0YV9zaXplLAorCQkJICAgICAmcmVzdWx0X3NpemUpOworCWlmICghcmVzdWx0KQorCQlkaWUoImZhaWxlZCB0byBhcHBseSBkZWx0YSIpOworCWZyZWUoZGVsdGEpOworCXdyaXRlX29iamVjdChyZXN1bHQsIHJlc3VsdF9zaXplLCB0eXBlKTsKKwlmcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZGVkX29iamVjdCh1bnNpZ25lZCBjaGFyICpzaGExLCBjb25zdCBjaGFyICp0eXBlLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IGRlbHRhX2luZm8gKipwID0gJmRlbHRhX2xpc3Q7CisJc3RydWN0IGRlbHRhX2luZm8gKmluZm87CisKKwl3aGlsZSAoKGluZm8gPSAqcCkgIT0gTlVMTCkgeworCQlpZiAoIW1lbWNtcChpbmZvLT5iYXNlX3NoYTEsIHNoYTEsIDIwKSkgeworCQkJKnAgPSBpbmZvLT5uZXh0OworCQkJcCA9ICZkZWx0YV9saXN0OworCQkJcmVzb2x2ZV9kZWx0YSh0eXBlLCBkYXRhLCBzaXplLCBpbmZvLT5kZWx0YSwgaW5mby0+c2l6ZSk7CisJCQlmcmVlKGluZm8pOworCQkJY29udGludWU7CisJCX0KKwkJcCA9ICZpbmZvLT5uZXh0OworCX0KK30KKworc3RhdGljIGludCB1bnBhY2tfbm9uX2RlbHRhX2VudHJ5KGVudW0gb2JqZWN0X3R5cGUga2luZCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXZvaWQgKmJ1ZiA9IGdldF9kYXRhKHNpemUpOworCWNvbnN0IGNoYXIgKnR5cGU7CisKKwlzd2l0Y2ggKGtpbmQpIHsKKwljYXNlIE9CSl9DT01NSVQ6IHR5cGUgPSBjb21taXRfdHlwZTsgYnJlYWs7CisJY2FzZSBPQkpfVFJFRTogICB0eXBlID0gdHJlZV90eXBlOyBicmVhazsKKwljYXNlIE9CSl9CTE9COiAgIHR5cGUgPSBibG9iX3R5cGU7IGJyZWFrOworCWNhc2UgT0JKX1RBRzogICAgdHlwZSA9IHRhZ190eXBlOyBicmVhazsKKwlkZWZhdWx0OiBkaWUoImJhZCB0eXBlICVkIiwga2luZCk7CisJfQorCWlmICghZHJ5X3J1bikKKwkJd3JpdGVfb2JqZWN0KGJ1Ziwgc2l6ZSwgdHlwZSk7CisJZnJlZShidWYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVucGFja19kZWx0YV9lbnRyeSh1bnNpZ25lZCBsb25nIGRlbHRhX3NpemUpCit7CisJdm9pZCAqZGVsdGFfZGF0YSwgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBiYXNlX3NpemU7CisJY2hhciB0eXBlWzIwXTsKKwl1bnNpZ25lZCBjaGFyIGJhc2Vfc2hhMVsyMF07CisJaW50IHJlc3VsdDsKKworCW1lbWNweShiYXNlX3NoYTEsIGZpbGwoMjApLCAyMCk7CisJdXNlKDIwKTsKKworCWRlbHRhX2RhdGEgPSBnZXRfZGF0YShkZWx0YV9zaXplKTsKKwlpZiAoZHJ5X3J1bikgeworCQlmcmVlKGRlbHRhX2RhdGEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWhhc19zaGExX2ZpbGUoYmFzZV9zaGExKSkgeworCQlhZGRfZGVsdGFfdG9fbGlzdChiYXNlX3NoYTEsIGRlbHRhX2RhdGEsIGRlbHRhX3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisJYmFzZSA9IHJlYWRfc2hhMV9maWxlKGJhc2Vfc2hhMSwgdHlwZSwgJmJhc2Vfc2l6ZSk7CisJaWYgKCFiYXNlKQorCQlkaWUoImZhaWxlZCB0byByZWFkIGRlbHRhLXBhY2sgYmFzZSBvYmplY3QgJXMiLCBzaGExX3RvX2hleChiYXNlX3NoYTEpKTsKKwlyZXN1bHQgPSByZXNvbHZlX2RlbHRhKHR5cGUsIGJhc2UsIGJhc2Vfc2l6ZSwgZGVsdGFfZGF0YSwgZGVsdGFfc2l6ZSk7CisJZnJlZShiYXNlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCB1bnBhY2tfb25lKHVuc2lnbmVkIG5yLCB1bnNpZ25lZCB0b3RhbCkKK3sKKwl1bnNpZ25lZCBzaGlmdDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrLCBjOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwllbnVtIG9iamVjdF90eXBlIHR5cGU7CisKKwlwYWNrID0gZmlsbCgxKTsKKwljID0gKnBhY2s7CisJdXNlKDEpOworCXR5cGUgPSAoYyA+PiA0KSAmIDc7CisJc2l6ZSA9IChjICYgMTUpOworCXNoaWZ0ID0gNDsKKwl3aGlsZSAoYyAmIDB4ODApIHsKKwkJcGFjayA9IGZpbGwoMSk7CisJCWMgPSAqcGFjaysrOworCQl1c2UoMSk7CisJCXNpemUgKz0gKGMgJiAweDdmKSA8PCBzaGlmdDsKKwkJc2hpZnQgKz0gNzsKKwl9CisJaWYgKCFxdWlldCkgeworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3NlYzsKKwkJc3RhdGljIHVuc2lnbmVkIGxhc3RfcGVyY2VudDsKKwkJc3RydWN0IHRpbWV2YWwgbm93OworCQl1bnNpZ25lZCBwZXJjZW50YWdlID0gKG5yICogMTAwKSAvIHRvdGFsOworCisJCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKwkJaWYgKHBlcmNlbnRhZ2UgIT0gbGFzdF9wZXJjZW50IHx8IG5vdy50dl9zZWMgIT0gbGFzdF9zZWMpIHsKKwkJCWxhc3Rfc2VjID0gbm93LnR2X3NlYzsKKwkJCWxhc3RfcGVyY2VudCA9IHBlcmNlbnRhZ2U7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiU0dSUlICgldS8ldSkgZG9uZVxyIiwgcGVyY2VudGFnZSwgbnIsIHRvdGFsKTsKKwkJfQorCX0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE9CSl9DT01NSVQ6CisJY2FzZSBPQkpfVFJFRToKKwljYXNlIE9CSl9CTE9COgorCWNhc2UgT0JKX1RBRzoKKwkJdW5wYWNrX25vbl9kZWx0YV9lbnRyeSh0eXBlLCBzaXplKTsKKwkJcmV0dXJuOworCWNhc2UgT0JKX0RFTFRBOgorCQl1bnBhY2tfZGVsdGFfZW50cnkoc2l6ZSk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkaWUoImJhZCBvYmplY3QgdHlwZSAlZCIsIHR5cGUpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5wYWNrX2FsbCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBwYWNrX2hlYWRlciAqaGRyID0gZmlsbChzaXplb2Yoc3RydWN0IHBhY2tfaGVhZGVyKSk7CisJdW5zaWduZWQgbnJfb2JqZWN0cyA9IG50b2hsKGhkci0+aGRyX2VudHJpZXMpOworCisJaWYgKG50b2hsKGhkci0+aGRyX3NpZ25hdHVyZSkgIT0gUEFDS19TSUdOQVRVUkUpCisJCWRpZSgiYmFkIHBhY2sgZmlsZSIpOworCWlmICghcGFja192ZXJzaW9uX29rKGhkci0+aGRyX3ZlcnNpb24pKQorCQlkaWUoInVua25vd24gcGFjayBmaWxlIHZlcnNpb24gJWQiLCBudG9obChoZHItPmhkcl92ZXJzaW9uKSk7CisJZnByaW50ZihzdGRlcnIsICJVbnBhY2tpbmcgJWQgb2JqZWN0c1xuIiwgbnJfb2JqZWN0cyk7CisKKwl1c2Uoc2l6ZW9mKHN0cnVjdCBwYWNrX2hlYWRlcikpOworCWZvciAoaSA9IDA7IGkgPCBucl9vYmplY3RzOyBpKyspCisJCXVucGFja19vbmUoaSsxLCBucl9vYmplY3RzKTsKKwlpZiAoZGVsdGFfbGlzdCkKKwkJZGllKCJ1bnJlc29sdmVkIGRlbHRhcyBsZWZ0IGFmdGVyIHVucGFja2luZyIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXF1aWV0ID0gIWlzYXR0eSgyKTsKKworCWZvciAoaSA9IDEgOyBpIDwgYXJnYzsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisKKwkJaWYgKCphcmcgPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICItbiIpKSB7CisJCQkJZHJ5X3J1biA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXN0cmNtcChhcmcsICItcSIpKSB7CisJCQkJcXVpZXQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdXNhZ2UodW5wYWNrX3VzYWdlKTsKKwkJfQorCisJCS8qIFdlIGRvbid0IHRha2UgYW55IG5vbi1mbGFnIGFyZ3VtZW50cyBub3cuLiBNYXliZSBzb21lIGRheSAqLworCQl1c2FnZSh1bnBhY2tfdXNhZ2UpOworCX0KKwlTSEExX0luaXQoJmN0eCk7CisJdW5wYWNrX2FsbCgpOworCVNIQTFfVXBkYXRlKCZjdHgsIGJ1ZmZlciwgb2Zmc2V0KTsKKwlTSEExX0ZpbmFsKHNoYTEsICZjdHgpOworCWlmIChtZW1jbXAoZmlsbCgyMCksIHNoYTEsIDIwKSkKKwkJZGllKCJmaW5hbCBzaGExIGRpZCBub3QgbWF0Y2giKTsKKwl1c2UoMjApOworCisJLyogV3JpdGUgdGhlIGxhc3QgcGFydCBvZiB0aGUgYnVmZmVyIHRvIHN0ZG91dCAqLworCXdoaWxlIChsZW4pIHsKKwkJaW50IHJldCA9IHh3cml0ZSgxLCBidWZmZXIgKyBvZmZzZXQsIGxlbik7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQlsZW4gLT0gcmV0OworCQlvZmZzZXQgKz0gcmV0OworCX0KKworCS8qIEFsbCBkb25lICovCisJaWYgKCFxdWlldCkKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXBkYXRlLXNlcnZlci1pbmZvLmMgYi91cGRhdGUtc2VydmVyLWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZjMzgzCi0tLSAvZGV2L251bGwKKysrIGIvdXBkYXRlLXNlcnZlci1pbmZvLmMKQEAgLTAsMCArMSwyNSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHVwZGF0ZV9zZXJ2ZXJfaW5mb191c2FnZVtdID0KKyJnaXQtdXBkYXRlLXNlcnZlci1pbmZvIFstLWZvcmNlXSI7CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBpOworCWludCBmb3JjZSA9IDA7CisJZm9yIChpID0gMTsgaSA8IGFjOyBpKyspIHsKKwkJaWYgKGF2W2ldWzBdID09ICctJykgeworCQkJaWYgKCFzdHJjbXAoIi0tZm9yY2UiLCBhdltpXSkgfHwKKwkJCSAgICAhc3RyY21wKCItZiIsIGF2W2ldKSkKKwkJCQlmb3JjZSA9IDE7CisJCQllbHNlCisJCQkJdXNhZ2UodXBkYXRlX3NlcnZlcl9pbmZvX3VzYWdlKTsKKwkJfQorCX0KKwlpZiAoaSAhPSBhYykKKwkJdXNhZ2UodXBkYXRlX3NlcnZlcl9pbmZvX3VzYWdlKTsKKworCXNldHVwX2dpdF9kaXJlY3RvcnkoKTsKKworCXJldHVybiAhIXVwZGF0ZV9zZXJ2ZXJfaW5mbyhmb3JjZSk7Cit9CmRpZmYgLS1naXQgYS91cGxvYWQtcGFjay5jIGIvdXBsb2FkLXBhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VjZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdXBsb2FkLXBhY2suYwpAQCAtMCwwICsxLDUyMSBAQAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgInJlZnMuaCIKKyNpbmNsdWRlICJwa3QtbGluZS5oIgorI2luY2x1ZGUgInRhZy5oIgorI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgImNvbW1pdC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIHVwbG9hZF9wYWNrX3VzYWdlW10gPSAiZ2l0LXVwbG9hZC1wYWNrIFstLXN0cmljdF0gWy0tdGltZW91dD1ubl0gPGRpcj4iOworCisjZGVmaW5lIFRIRVlfSEFWRSAoMVUgPDwgMCkKKyNkZWZpbmUgT1VSX1JFRiAoMVUgPDwgMSkKKyNkZWZpbmUgV0FOVEVEICgxVSA8PCAyKQorI2RlZmluZSBNQVhfSEFTIDI1NgorI2RlZmluZSBNQVhfTkVFRFMgMjU2CitzdGF0aWMgaW50IG5yX2hhcyA9IDAsIG5yX25lZWRzID0gMCwgbXVsdGlfYWNrID0gMCwgbnJfb3VyX3JlZnMgPSAwOworc3RhdGljIGludCB1c2VfdGhpbl9wYWNrID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhhc19zaGExW01BWF9IQVNdWzIwXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5lZWRzX3NoYTFbTUFYX05FRURTXVsyMF07CitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWVvdXQgPSAwOworc3RhdGljIGludCB1c2Vfc2lkZWJhbmQgPSAwOworCitzdGF0aWMgdm9pZCByZXNldF90aW1lb3V0KHZvaWQpCit7CisJYWxhcm0odGltZW91dCk7Cit9CisKK3N0YXRpYyBpbnQgc3RyaXAoY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwlpZiAobGVuICYmIGxpbmVbbGVuLTFdID09ICdcbicpCisJCWxpbmVbLS1sZW5dID0gMDsKKwlyZXR1cm4gbGVuOworfQorCisjZGVmaW5lIFBBQ0tFVF9NQVggMTAwMAorc3RhdGljIHNzaXplX3Qgc2VuZF9jbGllbnRfZGF0YShpbnQgZmQsIGNvbnN0IGNoYXIgKmRhdGEsIHNzaXplX3Qgc3opCit7CisJc3NpemVfdCBzc3o7CisJY29uc3QgY2hhciAqcDsKKworCWlmICghZGF0YSkgeworCQlpZiAoIXVzZV9zaWRlYmFuZCkKKwkJCXJldHVybiAwOworCQlwYWNrZXRfZmx1c2goMSk7CisJfQorCisJaWYgKCF1c2Vfc2lkZWJhbmQpIHsKKwkJaWYgKGZkID09IDMpCisJCQkvKiBlbWVyZ2VuY3kgcXVpdCAqLworCQkJZmQgPSAyOworCQlpZiAoZmQgPT0gMikgeworCQkJeHdyaXRlKGZkLCBkYXRhLCBzeik7CisJCQlyZXR1cm4gc3o7CisJCX0KKwkJcmV0dXJuIHNhZmVfd3JpdGUoZmQsIGRhdGEsIHN6KTsKKwl9CisJcCA9IGRhdGE7CisJc3N6ID0gc3o7CisJd2hpbGUgKHN6KSB7CisJCXVuc2lnbmVkIG47CisJCWNoYXIgaGRyWzVdOworCisJCW4gPSBzejsKKwkJaWYgKFBBQ0tFVF9NQVggLSA1IDwgbikKKwkJCW4gPSBQQUNLRVRfTUFYIC0gNTsKKwkJc3ByaW50ZihoZHIsICIlMDR4IiwgbiArIDUpOworCQloZHJbNF0gPSBmZDsKKwkJc2FmZV93cml0ZSgxLCBoZHIsIDUpOworCQlzYWZlX3dyaXRlKDEsIHAsIG4pOworCQlwICs9IG47CisJCXN6IC09IG47CisJfQorCXJldHVybiBzc3o7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9wYWNrX2ZpbGUodm9pZCkKK3sKKwkvKiBQaXBlcyBiZXR3ZWVuIHJldi1saXN0IHRvIHBhY2stb2JqZWN0cywgcGFjay1vYmplY3RzIHRvIHVzCisJICogYW5kIHBhY2stb2JqZWN0cyBlcnJvciBzdHJlYW0gZm9yIHByb2dyZXNzIGJhci4KKwkgKi8KKwlpbnQgbHBfcGlwZVsyXSwgcHVfcGlwZVsyXSwgcGVfcGlwZVsyXTsKKwlwaWRfdCBwaWRfcmV2X2xpc3QsIHBpZF9wYWNrX29iamVjdHM7CisJaW50IGNyZWF0ZV9mdWxsX3BhY2sgPSAobnJfb3VyX3JlZnMgPT0gbnJfbmVlZHMgJiYgIW5yX2hhcyk7CisJY2hhciBkYXRhWzgxOTNdLCBwcm9ncmVzc1sxMjhdOworCWNoYXIgYWJvcnRfbXNnW10gPSAiYWJvcnRpbmcgZHVlIHRvIHBvc3NpYmxlIHJlcG9zaXRvcnkgIgorCQkiY29ycnVwdGlvbiBvbiB0aGUgcmVtb3RlIHNpZGUuIjsKKwlpbnQgYnVmZmVyZWQgPSAtMTsKKworCWlmIChwaXBlKGxwX3BpcGUpIDwgMCkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBjcmVhdGUgcGlwZSIpOworCXBpZF9yZXZfbGlzdCA9IGZvcmsoKTsKKwlpZiAocGlkX3Jldl9saXN0IDwgMCkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBmb3JrIGdpdC1yZXYtbGlzdCIpOworCisJaWYgKCFwaWRfcmV2X2xpc3QpIHsKKwkJaW50IGk7CisJCWludCBhcmdzOworCQljb25zdCBjaGFyICoqYXJndjsKKwkJY29uc3QgY2hhciAqKnA7CisJCWNoYXIgKmJ1ZjsKKworCQlpZiAoY3JlYXRlX2Z1bGxfcGFjaykgeworCQkJYXJncyA9IDEwOworCQkJdXNlX3RoaW5fcGFjayA9IDA7IC8qIG5vIHBvaW50IGRvaW5nIGl0ICovCisJCX0KKwkJZWxzZQorCQkJYXJncyA9IG5yX2hhcyArIG5yX25lZWRzICsgNTsKKwkJcCA9IHhtYWxsb2MoYXJncyAqIHNpemVvZihjaGFyICopKTsKKwkJYXJndiA9IChjb25zdCBjaGFyICoqKSBwOworCQlidWYgPSB4bWFsbG9jKGFyZ3MgKiA0NSk7CisKKwkJZHVwMihscF9waXBlWzFdLCAxKTsKKwkJY2xvc2UoMCk7CisJCWNsb3NlKGxwX3BpcGVbMF0pOworCQljbG9zZShscF9waXBlWzFdKTsKKwkJKnArKyA9ICJyZXYtbGlzdCI7CisJCSpwKysgPSB1c2VfdGhpbl9wYWNrID8gIi0tb2JqZWN0cy1lZGdlIiA6ICItLW9iamVjdHMiOworCQlpZiAoY3JlYXRlX2Z1bGxfcGFjayB8fCBNQVhfTkVFRFMgPD0gbnJfbmVlZHMpCisJCQkqcCsrID0gIi0tYWxsIjsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfbmVlZHM7IGkrKykgeworCQkJCSpwKysgPSBidWY7CisJCQkJbWVtY3B5KGJ1Ziwgc2hhMV90b19oZXgobmVlZHNfc2hhMVtpXSksIDQxKTsKKwkJCQlidWYgKz0gNDE7CisJCQl9CisJCX0KKwkJaWYgKCFjcmVhdGVfZnVsbF9wYWNrKQorCQkJZm9yIChpID0gMDsgaSA8IG5yX2hhczsgaSsrKSB7CisJCQkJKnArKyA9IGJ1ZjsKKwkJCQkqYnVmKysgPSAnXic7CisJCQkJbWVtY3B5KGJ1Ziwgc2hhMV90b19oZXgoaGFzX3NoYTFbaV0pLCA0MSk7CisJCQkJYnVmICs9IDQxOworCQkJfQorCQkqcCsrID0gTlVMTDsKKwkJZXhlY3ZfZ2l0X2NtZChhcmd2KTsKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBleGVjIGdpdC1yZXYtbGlzdCIpOworCX0KKworCWlmIChwaXBlKHB1X3BpcGUpIDwgMCkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBjcmVhdGUgcGlwZSIpOworCWlmIChwaXBlKHBlX3BpcGUpIDwgMCkKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBjcmVhdGUgcGlwZSIpOworCXBpZF9wYWNrX29iamVjdHMgPSBmb3JrKCk7CisJaWYgKHBpZF9wYWNrX29iamVjdHMgPCAwKSB7CisJCS8qIGRhZW1vbiBzZXRzIHRoaW5ncyB1cCB0byBpZ25vcmUgVEVSTSAqLworCQlraWxsKHBpZF9yZXZfbGlzdCwgU0lHS0lMTCk7CisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiB1bmFibGUgdG8gZm9yayBnaXQtcGFjay1vYmplY3RzIik7CisJfQorCWlmICghcGlkX3BhY2tfb2JqZWN0cykgeworCQlkdXAyKGxwX3BpcGVbMF0sIDApOworCQlkdXAyKHB1X3BpcGVbMV0sIDEpOworCQlkdXAyKHBlX3BpcGVbMV0sIDIpOworCisJCWNsb3NlKGxwX3BpcGVbMF0pOworCQljbG9zZShscF9waXBlWzFdKTsKKwkJY2xvc2UocHVfcGlwZVswXSk7CisJCWNsb3NlKHB1X3BpcGVbMV0pOworCQljbG9zZShwZV9waXBlWzBdKTsKKwkJY2xvc2UocGVfcGlwZVsxXSk7CisJCWV4ZWNsX2dpdF9jbWQoInBhY2stb2JqZWN0cyIsICItLXN0ZG91dCIsICItLXByb2dyZXNzIiwgTlVMTCk7CisJCWtpbGwocGlkX3Jldl9saXN0LCBTSUdLSUxMKTsKKwkJZGllKCJnaXQtdXBsb2FkLXBhY2s6IHVuYWJsZSB0byBleGVjIGdpdC1wYWNrLW9iamVjdHMiKTsKKwl9CisKKwljbG9zZShscF9waXBlWzBdKTsKKwljbG9zZShscF9waXBlWzFdKTsKKworCS8qIFdlIHJlYWQgZnJvbSBwZV9waXBlWzBdIHRvIGNhcHR1cmUgc3RkZXJyIG91dHB1dCBmb3IKKwkgKiBwcm9ncmVzcyBiYXIsIGFuZCBwdV9waXBlWzBdIHRvIGNhcHR1cmUgdGhlIHBhY2sgZGF0YS4KKwkgKi8KKwljbG9zZShwZV9waXBlWzFdKTsKKwljbG9zZShwdV9waXBlWzFdKTsKKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKndobzsKKwkJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJCXBpZF90IHBpZDsKKwkJaW50IHN0YXR1czsKKwkJc3NpemVfdCBzejsKKwkJaW50IHBlLCBwdSwgcG9sbHNpemU7CisKKwkJcmVzZXRfdGltZW91dCgpOworCisJCXBvbGxzaXplID0gMDsKKwkJcGUgPSBwdSA9IC0xOworCisJCWlmICgwIDw9IHB1X3BpcGVbMF0pIHsKKwkJCXBmZFtwb2xsc2l6ZV0uZmQgPSBwdV9waXBlWzBdOworCQkJcGZkW3BvbGxzaXplXS5ldmVudHMgPSBQT0xMSU47CisJCQlwdSA9IHBvbGxzaXplOworCQkJcG9sbHNpemUrKzsKKwkJfQorCQlpZiAoMCA8PSBwZV9waXBlWzBdKSB7CisJCQlwZmRbcG9sbHNpemVdLmZkID0gcGVfcGlwZVswXTsKKwkJCXBmZFtwb2xsc2l6ZV0uZXZlbnRzID0gUE9MTElOOworCQkJcGUgPSBwb2xsc2l6ZTsKKwkJCXBvbGxzaXplKys7CisJCX0KKworCQlpZiAocG9sbHNpemUpIHsKKwkJCWlmIChwb2xsKHBmZCwgcG9sbHNpemUsIC0xKSA8IDApIHsKKwkJCQlpZiAoZXJybm8gIT0gRUlOVFIpIHsKKwkJCQkJZXJyb3IoInBvbGwgZmFpbGVkLCByZXN1bWluZzogJXMiLAorCQkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJCQlzbGVlcCgxKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoMCA8PSBwdSAmJiAocGZkW3B1XS5yZXZlbnRzICYgKFBPTExJTnxQT0xMSFVQKSkpIHsKKwkJCQkvKiBEYXRhIHJlYWR5OyB3ZSBrZWVwIHRoZSBsYXN0IGJ5dGUKKwkJCQkgKiB0byBvdXJzZWx2ZXMgaW4gY2FzZSB3ZSBkZXRlY3QKKwkJCQkgKiBicm9rZW4gcmV2LWxpc3QsIHNvIHRoYXQgd2UgY2FuCisJCQkJICogbGVhdmUgdGhlIHN0cmVhbSBjb3JydXB0ZWQuICBUaGlzCisJCQkJICogaXMgdW5mb3J0dW5hdGUgLS0gdW5wYWNrLW9iamVjdHMKKwkJCQkgKiB3b3VsZCBoYXBwaWx5IGFjY2VwdCBhIHZhbGlkIHBhY2sKKwkJCQkgKiBkYXRhIHdpdGggdHJhaWxpbmcgZ2FyYmFnZSwgc28KKwkJCQkgKiBhcHBlbmRpbmcgZ2FyYmFnZSBhZnRlciB3ZSBwYXNzIGFsbAorCQkJCSAqIHRoZSBwYWNrIGRhdGEgaXMgbm90IGdvb2QgZW5vdWdoIHRvCisJCQkJICogc2lnbmFsIGJyZWFrYWdlIHRvIGRvd25zdHJlYW0uCisJCQkJICovCisJCQkJY2hhciAqY3AgPSBkYXRhOworCQkJCXNzaXplX3Qgb3V0c3ogPSAwOworCQkJCWlmICgwIDw9IGJ1ZmZlcmVkKSB7CisJCQkJCSpjcCsrID0gYnVmZmVyZWQ7CisJCQkJCW91dHN6Kys7CisJCQkJfQorCQkJCXN6ID0gcmVhZChwdV9waXBlWzBdLCBjcCwKKwkJCQkJICBzaXplb2YoZGF0YSkgLSBvdXRzeik7CisJCQkJaWYgKDAgPCBzeikKKwkJCQkJCTsKKwkJCQllbHNlIGlmIChzeiA9PSAwKSB7CisJCQkJCWNsb3NlKHB1X3BpcGVbMF0pOworCQkJCQlwdV9waXBlWzBdID0gLTE7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJZ290byBmYWlsOworCQkJCXN6ICs9IG91dHN6OworCQkJCWlmICgxIDwgc3opIHsKKwkJCQkJYnVmZmVyZWQgPSBkYXRhW3N6LTFdICYgMHhGRjsKKwkJCQkJc3otLTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlidWZmZXJlZCA9IC0xOworCQkJCXN6ID0gc2VuZF9jbGllbnRfZGF0YSgxLCBkYXRhLCBzeik7CisJCQkJaWYgKHN6IDwgMCkKKwkJCQkJZ290byBmYWlsOworCQkJfQorCQkJaWYgKDAgPD0gcGUgJiYgKHBmZFtwZV0ucmV2ZW50cyAmIChQT0xMSU58UE9MTEhVUCkpKSB7CisJCQkJLyogU3RhdHVzIHJlYWR5OyB3ZSBzaGlwIHRoYXQgaW4gdGhlIHNpZGUtYmFuZAorCQkJCSAqIG9yIGR1bXAgdG8gdGhlIHN0YW5kYXJkIGVycm9yLgorCQkJCSAqLworCQkJCXN6ID0gcmVhZChwZV9waXBlWzBdLCBwcm9ncmVzcywKKwkJCQkJICBzaXplb2YocHJvZ3Jlc3MpKTsKKwkJCQlpZiAoMCA8IHN6KQorCQkJCQlzZW5kX2NsaWVudF9kYXRhKDIsIHByb2dyZXNzLCBzeik7CisJCQkJZWxzZSBpZiAoc3ogPT0gMCkgeworCQkJCQljbG9zZShwZV9waXBlWzBdKTsKKwkJCQkJcGVfcGlwZVswXSA9IC0xOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCisJCS8qIFNlZSBpZiB0aGUgY2hpbGRyZW4gYXJlIHN0aWxsIHRoZXJlICovCisJCWlmIChwaWRfcmV2X2xpc3QgfHwgcGlkX3BhY2tfb2JqZWN0cykgeworCQkJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgV05PSEFORyk7CisJCQlpZiAoIXBpZCkKKwkJCQljb250aW51ZTsKKwkJCXdobyA9ICgocGlkID09IHBpZF9yZXZfbGlzdCkgPyAiZ2l0LXJldi1saXN0IiA6CisJCQkgICAgICAgKHBpZCA9PSBwaWRfcGFja19vYmplY3RzKSA/ICJnaXQtcGFjay1vYmplY3RzIiA6CisJCQkgICAgICAgTlVMTCk7CisJCQlpZiAoIXdobykgeworCQkJCWlmIChwaWQgPCAwKSB7CisJCQkJCWVycm9yKCJnaXQtdXBsb2FkLXBhY2s6ICVzIiwKKwkJCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJZ290byBmYWlsOworCQkJCX0KKwkJCQllcnJvcigiZ2l0LXVwbG9hZC1wYWNrOiB3ZSB3ZXJlbid0ICIKKwkJCQkgICAgICAid2FpdGluZyBmb3IgJWQiLCBwaWQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpID4gMCkgeworCQkJCWVycm9yKCJnaXQtdXBsb2FkLXBhY2s6ICVzIGRpZWQgd2l0aCBlcnJvci4iLAorCQkJCSAgICAgIHdobyk7CisJCQkJZ290byBmYWlsOworCQkJfQorCQkJaWYgKHBpZCA9PSBwaWRfcmV2X2xpc3QpCisJCQkJcGlkX3Jldl9saXN0ID0gMDsKKwkJCWlmIChwaWQgPT0gcGlkX3BhY2tfb2JqZWN0cykKKwkJCQlwaWRfcGFja19vYmplY3RzID0gMDsKKwkJCWlmIChwaWRfcmV2X2xpc3QgfHwgcGlkX3BhY2tfb2JqZWN0cykKKwkJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGJvdGggZGllZCBoYXBwaWx5ICovCisJCWlmIChwb2xsc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZsdXNoIHRoZSBkYXRhICovCisJCWlmICgwIDw9IGJ1ZmZlcmVkKSB7CisJCQlkYXRhWzBdID0gYnVmZmVyZWQ7CisJCQlzeiA9IHNlbmRfY2xpZW50X2RhdGEoMSwgZGF0YSwgMSk7CisJCQlpZiAoc3ogPCAwKQorCQkJCWdvdG8gZmFpbDsKKwkJCWZwcmludGYoc3RkZXJyLCAiZmx1c2hlZC5cbiIpOworCQl9CisJCXNlbmRfY2xpZW50X2RhdGEoMSwgTlVMTCwgMCk7CisJCXJldHVybjsKKwl9CisgZmFpbDoKKwlpZiAocGlkX3BhY2tfb2JqZWN0cykKKwkJa2lsbChwaWRfcGFja19vYmplY3RzLCBTSUdLSUxMKTsKKwlpZiAocGlkX3Jldl9saXN0KQorCQlraWxsKHBpZF9yZXZfbGlzdCwgU0lHS0lMTCk7CisJc2VuZF9jbGllbnRfZGF0YSgzLCBhYm9ydF9tc2csIHNpemVvZihhYm9ydF9tc2cpKTsKKwlkaWUoImdpdC11cGxvYWQtcGFjazogJXMiLCBhYm9ydF9tc2cpOworfQorCitzdGF0aWMgaW50IGdvdF9zaGExKGNoYXIgKmhleCwgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlpZiAoZ2V0X3NoYTFfaGV4KGhleCwgc2hhMSkpCisJCWRpZSgiZ2l0LXVwbG9hZC1wYWNrOiBleHBlY3RlZCBTSEExIG9iamVjdCwgZ290ICclcyciLCBoZXgpOworCWlmICghaGFzX3NoYTFfZmlsZShzaGExKSkKKwkJcmV0dXJuIDA7CisJaWYgKG5yX2hhcyA8IE1BWF9IQVMpIHsKKwkJc3RydWN0IG9iamVjdCAqbyA9IGxvb2t1cF9vYmplY3Qoc2hhMSk7CisJCWlmICghKG8gJiYgby0+cGFyc2VkKSkKKwkJCW8gPSBwYXJzZV9vYmplY3Qoc2hhMSk7CisJCWlmICghbykKKwkJCWRpZSgib29wcyAoJXMpIiwgc2hhMV90b19oZXgoc2hhMSkpOworCQlpZiAoby0+dHlwZSA9PSBPQkpfQ09NTUlUKSB7CisJCQlzdHJ1Y3QgY29tbWl0X2xpc3QgKnBhcmVudHM7CisJCQlpZiAoby0+ZmxhZ3MgJiBUSEVZX0hBVkUpCisJCQkJcmV0dXJuIDA7CisJCQlvLT5mbGFncyB8PSBUSEVZX0hBVkU7CisJCQlmb3IgKHBhcmVudHMgPSAoKHN0cnVjdCBjb21taXQqKW8pLT5wYXJlbnRzOworCQkJICAgICBwYXJlbnRzOworCQkJICAgICBwYXJlbnRzID0gcGFyZW50cy0+bmV4dCkKKwkJCQlwYXJlbnRzLT5pdGVtLT5vYmplY3QuZmxhZ3MgfD0gVEhFWV9IQVZFOworCQl9CisJCW1lbWNweShoYXNfc2hhMVtucl9oYXMrK10sIHNoYTEsIDIwKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbW1vbl9jb21taXRzKHZvaWQpCit7CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdLCBsYXN0X3NoYTFbMjBdOworCWludCBsZW47CisKKwl0cmFja19vYmplY3RfcmVmcyA9IDA7CisJc2F2ZV9jb21taXRfYnVmZmVyID0gMDsKKworCWZvcig7OykgeworCQlsZW4gPSBwYWNrZXRfcmVhZF9saW5lKDAsIGxpbmUsIHNpemVvZihsaW5lKSk7CisJCXJlc2V0X3RpbWVvdXQoKTsKKworCQlpZiAoIWxlbikgeworCQkJaWYgKG5yX2hhcyA9PSAwIHx8IG11bHRpX2FjaykKKwkJCQlwYWNrZXRfd3JpdGUoMSwgIk5BS1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlsZW4gPSBzdHJpcChsaW5lLCBsZW4pOworCQlpZiAoIXN0cm5jbXAobGluZSwgImhhdmUgIiwgNSkpIHsKKwkJCWlmIChnb3Rfc2hhMShsaW5lKzUsIHNoYTEpICYmCisJCQkJCShtdWx0aV9hY2sgfHwgbnJfaGFzID09IDEpKSB7CisJCQkJaWYgKG5yX2hhcyA+PSBNQVhfSEFTKQorCQkJCQltdWx0aV9hY2sgPSAwOworCQkJCXBhY2tldF93cml0ZSgxLCAiQUNLICVzJXNcbiIsCisJCQkJCXNoYTFfdG9faGV4KHNoYTEpLAorCQkJCQltdWx0aV9hY2sgPyAgIiBjb250aW51ZSIgOiAiIik7CisJCQkJaWYgKG11bHRpX2FjaykKKwkJCQkJbWVtY3B5KGxhc3Rfc2hhMSwgc2hhMSwgMjApOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAobGluZSwgImRvbmUiKSkgeworCQkJaWYgKG5yX2hhcyA+IDApIHsKKwkJCQlpZiAobXVsdGlfYWNrKQorCQkJCQlwYWNrZXRfd3JpdGUoMSwgIkFDSyAlc1xuIiwKKwkJCQkJCQlzaGExX3RvX2hleChsYXN0X3NoYTEpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXBhY2tldF93cml0ZSgxLCAiTkFLXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlkaWUoImdpdC11cGxvYWQtcGFjazogZXhwZWN0ZWQgU0hBMSBsaXN0LCBnb3QgJyVzJyIsIGxpbmUpOworCX0KK30KKworc3RhdGljIGludCByZWNlaXZlX25lZWRzKHZvaWQpCit7CisJc3RhdGljIGNoYXIgbGluZVsxMDAwXTsKKwlpbnQgbGVuLCBuZWVkczsKKworCW5lZWRzID0gMDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBvYmplY3QgKm87CisJCXVuc2lnbmVkIGNoYXIgZHVtbXlbMjBdLCAqc2hhMV9idWY7CisJCWxlbiA9IHBhY2tldF9yZWFkX2xpbmUoMCwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKwkJcmVzZXRfdGltZW91dCgpOworCQlpZiAoIWxlbikKKwkJCXJldHVybiBuZWVkczsKKworCQlzaGExX2J1ZiA9IGR1bW15OworCQlpZiAobmVlZHMgPT0gTUFYX05FRURTKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkid2FybmluZzogc3VwcG9ydGluZyBvbmx5IGEgbWF4IG9mICVkIHJlcXVlc3RzLiAiCisJCQkJInNlbmRpbmcgZXZlcnl0aGluZyBpbnN0ZWFkLlxuIiwKKwkJCQlNQVhfTkVFRFMpOworCQl9CisJCWVsc2UgaWYgKG5lZWRzIDwgTUFYX05FRURTKQorCQkJc2hhMV9idWYgPSBuZWVkc19zaGExW25lZWRzXTsKKworCQlpZiAoc3RybmNtcCgid2FudCAiLCBsaW5lLCA1KSB8fCBnZXRfc2hhMV9oZXgobGluZSs1LCBzaGExX2J1ZikpCisJCQlkaWUoImdpdC11cGxvYWQtcGFjazogcHJvdG9jb2wgZXJyb3IsICIKKwkJCSAgICAiZXhwZWN0ZWQgdG8gZ2V0IHNoYSwgbm90ICclcyciLCBsaW5lKTsKKwkJaWYgKHN0cnN0cihsaW5lKzQ1LCAibXVsdGlfYWNrIikpCisJCQltdWx0aV9hY2sgPSAxOworCQlpZiAoc3Ryc3RyKGxpbmUrNDUsICJ0aGluLXBhY2siKSkKKwkJCXVzZV90aGluX3BhY2sgPSAxOworCQlpZiAoc3Ryc3RyKGxpbmUrNDUsICJzaWRlLWJhbmQiKSkKKwkJCXVzZV9zaWRlYmFuZCA9IDE7CisKKwkJLyogV2UgaGF2ZSBzZW50IGFsbCBvdXIgcmVmcyBhbHJlYWR5LCBhbmQgdGhlIG90aGVyIGVuZAorCQkgKiBzaG91bGQgaGF2ZSBjaG9zZW4gb3V0IG9mIHRoZW07IG90aGVyd2lzZSB0aGV5IGFyZQorCQkgKiBhc2tpbmcgZm9yIG5vbnNlbnNlLgorCQkgKgorCQkgKiBIbXBoLiAgV2UgbWF5IGxhdGVyIHdhbnQgdG8gYWxsb3cgIndhbnQiIGxpbmUgdGhhdAorCQkgKiBhc2tzIGZvciBzb21ldGhpbmcgbGlrZSAibWFzdGVyfjEwIiAoc3ltYm9saWMpLi4uCisJCSAqIHdvdWxkIGl0IG1ha2Ugc2Vuc2U/ICBJIGRvbid0IGtub3cuCisJCSAqLworCQlvID0gbG9va3VwX29iamVjdChzaGExX2J1Zik7CisJCWlmICghbyB8fCAhKG8tPmZsYWdzICYgT1VSX1JFRikpCisJCQlkaWUoImdpdC11cGxvYWQtcGFjazogbm90IG91ciByZWYgJXMiLCBsaW5lKzUpOworCQlpZiAoIShvLT5mbGFncyAmIFdBTlRFRCkpIHsKKwkJCW8tPmZsYWdzIHw9IFdBTlRFRDsKKwkJCW5lZWRzKys7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9yZWYoY29uc3QgY2hhciAqcmVmbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY2FwYWJpbGl0aWVzID0gIm11bHRpX2FjayB0aGluLXBhY2sgc2lkZS1iYW5kIjsKKwlzdHJ1Y3Qgb2JqZWN0ICpvID0gcGFyc2Vfb2JqZWN0KHNoYTEpOworCisJaWYgKCFvKQorCQlkaWUoImdpdC11cGxvYWQtcGFjazogY2Fubm90IGZpbmQgb2JqZWN0ICVzOiIsIHNoYTFfdG9faGV4KHNoYTEpKTsKKworCWlmIChjYXBhYmlsaXRpZXMpCisJCXBhY2tldF93cml0ZSgxLCAiJXMgJXMlYyVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcmVmbmFtZSwKKwkJCTAsIGNhcGFiaWxpdGllcyk7CisJZWxzZQorCQlwYWNrZXRfd3JpdGUoMSwgIiVzICVzXG4iLCBzaGExX3RvX2hleChzaGExKSwgcmVmbmFtZSk7CisJY2FwYWJpbGl0aWVzID0gTlVMTDsKKwlpZiAoIShvLT5mbGFncyAmIE9VUl9SRUYpKSB7CisJCW8tPmZsYWdzIHw9IE9VUl9SRUY7CisJCW5yX291cl9yZWZzKys7CisJfQorCWlmIChvLT50eXBlID09IE9CSl9UQUcpIHsKKwkJbyA9IGRlcmVmX3RhZyhvLCByZWZuYW1lLCAwKTsKKwkJcGFja2V0X3dyaXRlKDEsICIlcyAlc157fVxuIiwgc2hhMV90b19oZXgoby0+c2hhMSksIHJlZm5hbWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1cGxvYWRfcGFjayh2b2lkKQoreworCXJlc2V0X3RpbWVvdXQoKTsKKwloZWFkX3JlZihzZW5kX3JlZik7CisJZm9yX2VhY2hfcmVmKHNlbmRfcmVmKTsKKwlwYWNrZXRfZmx1c2goMSk7CisJbnJfbmVlZHMgPSByZWNlaXZlX25lZWRzKCk7CisJaWYgKCFucl9uZWVkcykKKwkJcmV0dXJuIDA7CisJZ2V0X2NvbW1vbl9jb21taXRzKCk7CisJY3JlYXRlX3BhY2tfZmlsZSgpOworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZGlyOworCWludCBpOworCWludCBzdHJpY3QgPSAwOworCisJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworCQljaGFyICphcmcgPSBhcmd2W2ldOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCWlmICghc3RyY21wKGFyZywgIi0tc3RyaWN0IikpIHsKKwkJCXN0cmljdCA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cm5jbXAoYXJnLCAiLS10aW1lb3V0PSIsIDEwKSkgeworCQkJdGltZW91dCA9IGF0b2koYXJnKzEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGFyZywgIi0tIikpIHsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCQorCWlmIChpICE9IGFyZ2MtMSkKKwkJdXNhZ2UodXBsb2FkX3BhY2tfdXNhZ2UpOworCWRpciA9IGFyZ3ZbaV07CisKKwlpZiAoIWVudGVyX3JlcG8oZGlyLCBzdHJpY3QpKQorCQlkaWUoIiclcyc6IHVuYWJsZSB0byBjaGRpciBvciBub3QgYSBnaXQgYXJjaGl2ZSIsIGRpcik7CisKKwl1cGxvYWRfcGFjaygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXNhZ2UuYyBiL3VzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjMmU5NgotLS0gL2Rldi9udWxsCisrKyBiL3VzYWdlLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgImdpdC1jb21wYXQtdXRpbC5oIgorCitzdGF0aWMgdm9pZCByZXBvcnQoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCWZwdXRzKHByZWZpeCwgc3RkZXJyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgcGFyYW1zKTsKKwlmcHV0cygiXG4iLCBzdGRlcnIpOworfQorCitzdGF0aWMgTk9SRVRVUk4gdm9pZCB1c2FnZV9idWlsdGluKGNvbnN0IGNoYXIgKmVycikKK3sKKwlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlc1xuIiwgZXJyKTsKKwlleGl0KDEyOSk7Cit9CisKK3N0YXRpYyBOT1JFVFVSTiB2b2lkIGRpZV9idWlsdGluKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJcmVwb3J0KCJmYXRhbDogIiwgZXJyLCBwYXJhbXMpOworCWV4aXQoMTI4KTsKK30KKworc3RhdGljIHZvaWQgZXJyb3JfYnVpbHRpbihjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgiZXJyb3I6ICIsIGVyciwgcGFyYW1zKTsKK30KKworCisvKiBJZiB3ZSBhcmUgaW4gYSBkbG9wZW4oKWVkIC5zbyB3cml0ZSB0byBhIGdsb2JhbCB2YXJpYWJsZSB3b3VsZCBzZWdmYXVsdAorICogKHVnaCksIHNvIGtlZXAgdGhpbmdzIHN0YXRpYy4gKi8KK3N0YXRpYyB2b2lkICgqdXNhZ2Vfcm91dGluZSkoY29uc3QgY2hhciAqZXJyKSBOT1JFVFVSTiA9IHVzYWdlX2J1aWx0aW47CitzdGF0aWMgdm9pZCAoKmRpZV9yb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSBOT1JFVFVSTiA9IGRpZV9idWlsdGluOworc3RhdGljIHZvaWQgKCplcnJvcl9yb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSA9IGVycm9yX2J1aWx0aW47CisKK3ZvaWQgc2V0X3VzYWdlX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVycikgTk9SRVRVUk4pCit7CisJdXNhZ2Vfcm91dGluZSA9IHJvdXRpbmU7Cit9CisKK3ZvaWQgc2V0X2RpZV9yb3V0aW5lKHZvaWQgKCpyb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSBOT1JFVFVSTikKK3sKKwlkaWVfcm91dGluZSA9IHJvdXRpbmU7Cit9CisKK3ZvaWQgc2V0X2Vycm9yX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpKQoreworCWVycm9yX3JvdXRpbmUgPSByb3V0aW5lOworfQorCisKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZXJyKQoreworCXVzYWdlX3JvdXRpbmUoZXJyKTsKK30KKwordm9pZCBkaWUoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJZGllX3JvdXRpbmUoZXJyLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQorCitpbnQgZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIGVycik7CisJZXJyb3Jfcm91dGluZShlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdmFyLmMgYi92YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdhMzNiCi0tLSAvZGV2L251bGwKKysrIGIvdmFyLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgRXJpYyBCaWVkZXJtYW4sIDIwMDUKKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgY29uc3QgY2hhciB2YXJfdXNhZ2VbXSA9ICJnaXQtdmFyIFstbCB8IDx2YXJpYWJsZT5dIjsKKworc3RydWN0IGdpdF92YXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqKCpyZWFkKShpbnQpOworfTsKK3N0YXRpYyBzdHJ1Y3QgZ2l0X3ZhciBnaXRfdmFyc1tdID0geworCXsgIkdJVF9DT01NSVRURVJfSURFTlQiLCBnaXRfY29tbWl0dGVyX2luZm8gfSwKKwl7ICJHSVRfQVVUSE9SX0lERU5UIiwgICBnaXRfYXV0aG9yX2luZm8gfSwKKwl7ICIiLCBOVUxMIH0sCit9OworCitzdGF0aWMgdm9pZCBsaXN0X3ZhcnModm9pZCkKK3sKKwlzdHJ1Y3QgZ2l0X3ZhciAqcHRyOworCWZvcihwdHIgPSBnaXRfdmFyczsgcHRyLT5yZWFkOyBwdHIrKykgeworCQlwcmludGYoIiVzPSVzXG4iLCBwdHItPm5hbWUsIHB0ci0+cmVhZCgwKSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcmVhZF92YXIoY29uc3QgY2hhciAqdmFyKQoreworCXN0cnVjdCBnaXRfdmFyICpwdHI7CisJY29uc3QgY2hhciAqdmFsOworCXZhbCA9IE5VTEw7CisJZm9yKHB0ciA9IGdpdF92YXJzOyBwdHItPnJlYWQ7IHB0cisrKSB7CisJCWlmIChzdHJjbXAodmFyLCBwdHItPm5hbWUpID09IDApIHsKKwkJCXZhbCA9IHB0ci0+cmVhZCgxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodmFsdWUpCisJCXByaW50ZigiJXM9JXNcbiIsIHZhciwgdmFsdWUpOworCWVsc2UKKwkJcHJpbnRmKCIlc1xuIiwgdmFyKTsKKwlyZXR1cm4gZ2l0X2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqdmFsOworCWlmIChhcmdjICE9IDIpIHsKKwkJdXNhZ2UodmFyX3VzYWdlKTsKKwl9CisKKwlzZXR1cF9naXRfZGlyZWN0b3J5KCk7CisJc2V0dXBfaWRlbnQoKTsKKwl2YWwgPSBOVUxMOworCisJaWYgKHN0cmNtcChhcmd2WzFdLCAiLWwiKSA9PSAwKSB7CisJCWdpdF9jb25maWcoc2hvd19jb25maWcpOworCQlsaXN0X3ZhcnMoKTsKKwkJcmV0dXJuIDA7CisJfQorCWdpdF9jb25maWcoZ2l0X2RlZmF1bHRfY29uZmlnKTsKKwl2YWwgPSByZWFkX3Zhcihhcmd2WzFdKTsKKwlpZiAoIXZhbCkKKwkJdXNhZ2UodmFyX3VzYWdlKTsKKwkKKwlwcmludGYoIiVzXG4iLCB2YWwpOworCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdmVyaWZ5LXBhY2suYyBiL3ZlcmlmeS1wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3OTcwZAotLS0gL2Rldi9udWxsCisrKyBiL3ZlcmlmeS1wYWNrLmMKQEAgLTAsMCArMSw3OCBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicGFjay5oIgorCitzdGF0aWMgaW50IHZlcmlmeV9vbmVfcGFjayhjb25zdCBjaGFyICpwYXRoLCBpbnQgdmVyYm9zZSkKK3sKKwljaGFyIGFyZ1tQQVRIX01BWF07CisJaW50IGxlbjsKKwlzdHJ1Y3QgcGFja2VkX2dpdCAqcGFjazsKKwlpbnQgZXJyOworCisJbGVuID0gc3RybGNweShhcmcsIHBhdGgsIFBBVEhfTUFYKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gZXJyb3IoIm5hbWUgdG9vIGxvbmc6ICVzIiwgcGF0aCk7CisKKwkvKgorCSAqIEluIGFkZGl0aW9uIHRvICJmb28uaWR4IiB3ZSBhY2NlcHQgImZvby5wYWNrIiBhbmQgImZvbyI7CisJICogbm9ybWFsaXplIHRoZXNlIGZvcm1zIHRvICJmb28uaWR4IiBmb3IgYWRkX3BhY2tlZF9naXQoKS4KKwkgKi8KKwlpZiAoaGFzX2V4dGVuc2lvbihhcmcsICIucGFjayIpKSB7CisJCXN0cmNweShhcmcgKyBsZW4gLSA1LCAiLmlkeCIpOworCQlsZW4tLTsKKwl9IGVsc2UgaWYgKCFoYXNfZXh0ZW5zaW9uKGFyZywgIi5pZHgiKSkgeworCQlpZiAobGVuICsgNCA+PSBQQVRIX01BWCkKKwkJCXJldHVybiBlcnJvcigibmFtZSB0b28gbG9uZzogJXMuaWR4IiwgYXJnKTsKKwkJc3RyY3B5KGFyZyArIGxlbiwgIi5pZHgiKTsKKwkJbGVuICs9IDQ7CisJfQorCisJLyoKKwkgKiBhZGRfcGFja2VkX2dpdCgpIHVzZXMgb3VyIGJ1ZmZlciAoY29udGFpbmluZyAiZm9vLmlkeCIpIHRvCisJICogYnVpbGQgdGhlIHBhY2sgZmlsZW5hbWUgKCJmb28ucGFjayIpLiAgTWFrZSBzdXJlIGl0IGZpdHMuCisJICovCisJaWYgKGxlbiArIDEgPj0gUEFUSF9NQVgpIHsKKwkJYXJnW2xlbiAtIDRdID0gJ1wwJzsKKwkJcmV0dXJuIGVycm9yKCJuYW1lIHRvbyBsb25nOiAlcy5wYWNrIiwgYXJnKTsKKwl9CisKKwlwYWNrID0gYWRkX3BhY2tlZF9naXQoYXJnLCBsZW4sIDEpOworCWlmICghcGFjaykKKwkJcmV0dXJuIGVycm9yKCJwYWNrZmlsZSAlcyBub3QgZm91bmQuIiwgYXJnKTsKKworCWVyciA9IHZlcmlmeV9wYWNrKHBhY2ssIHZlcmJvc2UpOworCWZyZWUocGFjayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3QgY2hhciB2ZXJpZnlfcGFja191c2FnZVtdID0gImdpdC12ZXJpZnktcGFjayBbLXZdIDxwYWNrPi4uLiI7CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBlcnIgPSAwOworCWludCB2ZXJib3NlID0gMDsKKwlpbnQgbm9fbW9yZV9vcHRpb25zID0gMDsKKwlpbnQgbm90aGluZ19kb25lID0gMTsKKworCXdoaWxlICgxIDwgYWMpIHsKKwkJaWYgKCFub19tb3JlX29wdGlvbnMgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CisJCQlpZiAoIXN0cmNtcCgiLXYiLCBhdlsxXSkpCisJCQkJdmVyYm9zZSA9IDE7CisJCQllbHNlIGlmICghc3RyY21wKCItLSIsIGF2WzFdKSkKKwkJCQlub19tb3JlX29wdGlvbnMgPSAxOworCQkJZWxzZQorCQkJCXVzYWdlKHZlcmlmeV9wYWNrX3VzYWdlKTsKKwkJfQorCQllbHNlIHsKKwkJCWlmICh2ZXJpZnlfb25lX3BhY2soYXZbMV0sIHZlcmJvc2UpKQorCQkJCWVyciA9IDE7CisJCQlub3RoaW5nX2RvbmUgPSAwOworCQl9CisJCWFjLS07IGF2Kys7CisJfQorCisJaWYgKG5vdGhpbmdfZG9uZSkKKwkJdXNhZ2UodmVyaWZ5X3BhY2tfdXNhZ2UpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3hkaWZmLWludGVyZmFjZS5jIGIveGRpZmYtaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4MmRhNwotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmLWludGVyZmFjZS5jCkBAIC0wLDAgKzEsMTA0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZGlmZi1pbnRlcmZhY2UuaCIKKworc3RhdGljIGludCBwYXJzZV9udW0oY2hhciAqKmNwX3AsIGludCAqbnVtX3ApCit7CisJY2hhciAqY3AgPSAqY3BfcDsKKwlpbnQgbnVtID0gMDsKKwlpbnQgcmVhZF9zb21lOworCisJd2hpbGUgKCcwJyA8PSAqY3AgJiYgKmNwIDw9ICc5JykKKwkJbnVtID0gbnVtICogMTAgKyAqY3ArKyAtICcwJzsKKwlpZiAoIShyZWFkX3NvbWUgPSBjcCAtICpjcF9wKSkKKwkJcmV0dXJuIC0xOworCSpjcF9wID0gY3A7CisJKm51bV9wID0gbnVtOworCXJldHVybiAwOworfQorCitpbnQgcGFyc2VfaHVua19oZWFkZXIoY2hhciAqbGluZSwgaW50IGxlbiwKKwkJICAgICAgaW50ICpvYiwgaW50ICpvbiwKKwkJICAgICAgaW50ICpuYiwgaW50ICpubikKK3sKKwljaGFyICpjcDsKKwljcCA9IGxpbmUgKyA0OworCWlmIChwYXJzZV9udW0oJmNwLCBvYikpIHsKKwliYWRfbGluZToKKwkJcmV0dXJuIGVycm9yKCJtYWxmb3JtZWQgZGlmZiBvdXRwdXQ6ICVzIiwgbGluZSk7CisJfQorCWlmICgqY3AgPT0gJywnKSB7CisJCWNwKys7CisJCWlmIChwYXJzZV9udW0oJmNwLCBvbikpCisJCQlnb3RvIGJhZF9saW5lOworCX0KKwllbHNlCisJCSpvbiA9IDE7CisJaWYgKCpjcCsrICE9ICcgJyB8fCAqY3ArKyAhPSAnKycpCisJCWdvdG8gYmFkX2xpbmU7CisJaWYgKHBhcnNlX251bSgmY3AsIG5iKSkKKwkJZ290byBiYWRfbGluZTsKKwlpZiAoKmNwID09ICcsJykgeworCQljcCsrOworCQlpZiAocGFyc2VfbnVtKCZjcCwgbm4pKQorCQkJZ290byBiYWRfbGluZTsKKwl9CisJZWxzZQorCQkqbm4gPSAxOworCXJldHVybiAtISFtZW1jbXAoY3AsICIgQEAiLCAzKTsKK30KKworc3RhdGljIHZvaWQgY29uc3VtZV9vbmUodm9pZCAqcHJpdl8sIGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZSAqcHJpdiA9IHByaXZfOworCWNoYXIgKmVwOworCXdoaWxlIChzaXplKSB7CisJCXVuc2lnbmVkIGxvbmcgdGhpc19zaXplOworCQllcCA9IG1lbWNocihzLCAnXG4nLCBzaXplKTsKKwkJdGhpc19zaXplID0gKGVwID09IE5VTEwpID8gc2l6ZSA6IChlcCAtIHMgKyAxKTsKKwkJcHJpdi0+Y29uc3VtZShwcml2LCBzLCB0aGlzX3NpemUpOworCQlzaXplIC09IHRoaXNfc2l6ZTsKKwkJcyArPSB0aGlzX3NpemU7CisJfQorfQorCitpbnQgeGRpZmZfb3V0Zih2b2lkICpwcml2XywgbW1idWZmZXJfdCAqbWIsIGludCBuYnVmKQoreworCXN0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlICpwcml2ID0gcHJpdl87CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKSB7CisJCWlmIChtYltpXS5wdHJbbWJbaV0uc2l6ZS0xXSAhPSAnXG4nKSB7CisJCQkvKiBJbmNvbXBsZXRlIGxpbmUgKi8KKwkJCXByaXYtPnJlbWFpbmRlciA9IHJlYWxsb2MocHJpdi0+cmVtYWluZGVyLAorCQkJCQkJICBwcml2LT5yZW1haW5kZXJfc2l6ZSArCisJCQkJCQkgIG1iW2ldLnNpemUpOworCQkJbWVtY3B5KHByaXYtPnJlbWFpbmRlciArIHByaXYtPnJlbWFpbmRlcl9zaXplLAorCQkJICAgICAgIG1iW2ldLnB0ciwgbWJbaV0uc2l6ZSk7CisJCQlwcml2LT5yZW1haW5kZXJfc2l6ZSArPSBtYltpXS5zaXplOworCQkJY29udGludWU7CisJCX0KKworCQkvKiB3ZSBoYXZlIGEgY29tcGxldGUgbGluZSAqLworCQlpZiAoIXByaXYtPnJlbWFpbmRlcikgeworCQkJY29uc3VtZV9vbmUocHJpdiwgbWJbaV0ucHRyLCBtYltpXS5zaXplKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaXYtPnJlbWFpbmRlciA9IHJlYWxsb2MocHJpdi0+cmVtYWluZGVyLAorCQkJCQkgIHByaXYtPnJlbWFpbmRlcl9zaXplICsKKwkJCQkJICBtYltpXS5zaXplKTsKKwkJbWVtY3B5KHByaXYtPnJlbWFpbmRlciArIHByaXYtPnJlbWFpbmRlcl9zaXplLAorCQkgICAgICAgbWJbaV0ucHRyLCBtYltpXS5zaXplKTsKKwkJY29uc3VtZV9vbmUocHJpdiwgcHJpdi0+cmVtYWluZGVyLAorCQkJICAgIHByaXYtPnJlbWFpbmRlcl9zaXplICsgbWJbaV0uc2l6ZSk7CisJCWZyZWUocHJpdi0+cmVtYWluZGVyKTsKKwkJcHJpdi0+cmVtYWluZGVyID0gTlVMTDsKKwkJcHJpdi0+cmVtYWluZGVyX3NpemUgPSAwOworCX0KKwlpZiAocHJpdi0+cmVtYWluZGVyKSB7CisJCWNvbnN1bWVfb25lKHByaXYsIHByaXYtPnJlbWFpbmRlciwgcHJpdi0+cmVtYWluZGVyX3NpemUpOworCQlmcmVlKHByaXYtPnJlbWFpbmRlcik7CisJCXByaXYtPnJlbWFpbmRlciA9IE5VTEw7CisJCXByaXYtPnJlbWFpbmRlcl9zaXplID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS94ZGlmZi1pbnRlcmZhY2UuaCBiL3hkaWZmLWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDY5MDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi1pbnRlcmZhY2UuaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIFhESUZGX0lOVEVSRkFDRV9ICisjZGVmaW5lIFhESUZGX0lOVEVSRkFDRV9ICisKKyNpbmNsdWRlICJ4ZGlmZi94ZGlmZi5oIgorCitzdHJ1Y3QgeGRpZmZfZW1pdF9zdGF0ZTsKKwordHlwZWRlZiB2b2lkICgqeGRpZmZfZW1pdF9jb25zdW1lX2ZuKSh2b2lkICosIGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7CisKK3N0cnVjdCB4ZGlmZl9lbWl0X3N0YXRlIHsKKwl4ZGlmZl9lbWl0X2NvbnN1bWVfZm4gY29uc3VtZTsKKwljaGFyICpyZW1haW5kZXI7CisJdW5zaWduZWQgbG9uZyByZW1haW5kZXJfc2l6ZTsKK307CisKK2ludCB4ZGlmZl9vdXRmKHZvaWQgKnByaXZfLCBtbWJ1ZmZlcl90ICptYiwgaW50IG5idWYpOworaW50IHBhcnNlX2h1bmtfaGVhZGVyKGNoYXIgKmxpbmUsIGludCBsZW4sCisJCSAgICAgIGludCAqb2IsIGludCAqb24sCisJCSAgICAgIGludCAqbmIsIGludCAqbm4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3hkaWZmL3hkaWZmLmggYi94ZGlmZi94ZGlmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjgxNzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZi5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWERJRkZfSCkKKyNkZWZpbmUgWERJRkZfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qICNpZmRlZiBfX2NwbHVzcGx1cyAqLworCisKKyNkZWZpbmUgWERGX05FRURfTUlOSU1BTCAoMSA8PCAxKQorI2RlZmluZSBYREZfSUdOT1JFX1dISVRFU1BBQ0UgKDEgPDwgMikKKyNkZWZpbmUgWERGX0lHTk9SRV9XSElURVNQQUNFX0NIQU5HRSAoMSA8PCAzKQorI2RlZmluZSBYREZfV0hJVEVTUEFDRV9GTEFHUyAoWERGX0lHTk9SRV9XSElURVNQQUNFIHwgWERGX0lHTk9SRV9XSElURVNQQUNFX0NIQU5HRSkKKworI2RlZmluZSBYRExfUEFUQ0hfTk9STUFMICctJworI2RlZmluZSBYRExfUEFUQ0hfUkVWRVJTRSAnKycKKyNkZWZpbmUgWERMX1BBVENIX01PREVNQVNLICgoMSA8PCA4KSAtIDEpCisjZGVmaW5lIFhETF9QQVRDSF9JR05PUkVCU1BBQ0UgKDEgPDwgOCkKKworI2RlZmluZSBYRExfRU1JVF9GVU5DTkFNRVMgKDEgPDwgMCkKKyNkZWZpbmUgWERMX0VNSVRfQ09NTU9OICgxIDw8IDEpCisKKyNkZWZpbmUgWERMX01NQl9SRUFET05MWSAoMSA8PCAwKQorCisjZGVmaW5lIFhETF9NTUZfQVRPTUlDICgxIDw8IDApCisKKyNkZWZpbmUgWERMX0JET1BfSU5TIDEKKyNkZWZpbmUgWERMX0JET1BfQ1BZIDIKKyNkZWZpbmUgWERMX0JET1BfSU5TQiAzCisKKwordHlwZWRlZiBzdHJ1Y3Qgc19tbWZpbGUgeworCWNoYXIgKnB0cjsKKwlsb25nIHNpemU7Cit9IG1tZmlsZV90OworCit0eXBlZGVmIHN0cnVjdCBzX21tYnVmZmVyIHsKKwljaGFyICpwdHI7CisJbG9uZyBzaXplOworfSBtbWJ1ZmZlcl90OworCit0eXBlZGVmIHN0cnVjdCBzX3hwcGFyYW0geworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cit9IHhwcGFyYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGVtaXRjYiB7CisJdm9pZCAqcHJpdjsKKwlpbnQgKCpvdXRmKSh2b2lkICosIG1tYnVmZmVyX3QgKiwgaW50KTsKK30geGRlbWl0Y2JfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGVtaXRjb25mIHsKKwlsb25nIGN0eGxlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfSB4ZGVtaXRjb25mX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfYmRpZmZwYXJhbSB7CisJbG9uZyBic2l6ZTsKK30gYmRpZmZwYXJhbV90OworCisKKyNkZWZpbmUgeGRsX21hbGxvYyh4KSBtYWxsb2MoeCkKKyNkZWZpbmUgeGRsX2ZyZWUocHRyKSBmcmVlKHB0cikKKyNkZWZpbmUgeGRsX3JlYWxsb2MocHRyLHgpIHJlYWxsb2MocHRyLHgpCisKK3ZvaWQgKnhkbF9tbWZpbGVfZmlyc3QobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSk7Cit2b2lkICp4ZGxfbW1maWxlX25leHQobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSk7Citsb25nIHhkbF9tbWZpbGVfc2l6ZShtbWZpbGVfdCAqbW1mKTsKKworaW50IHhkbF9kaWZmKG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCSAgICAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZywgeGRlbWl0Y2JfdCAqZWNiKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogI2lmZGVmIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWERJRkZfSCkgKi8KKwpkaWZmIC0tZ2l0IGEveGRpZmYveGRpZmZpLmMgYi94ZGlmZi94ZGlmZmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZlNzZhCi0tLSAvZGV2L251bGwKKysrIGIveGRpZmYveGRpZmZpLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMJRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlICJ4aW5jbHVkZS5oIgorCisKKworI2RlZmluZSBYRExfTUFYX0NPU1RfTUlOIDI1NgorI2RlZmluZSBYRExfSEVVUl9NSU5fQ09TVCAyNTYKKyNkZWZpbmUgWERMX0xJTkVfTUFYIChsb25nKSgoMVVMIDw8ICg4ICogc2l6ZW9mKGxvbmcpIC0gMSkpIC0gMSkKKyNkZWZpbmUgWERMX1NOQUtFX0NOVCAyMAorI2RlZmluZSBYRExfS19IRVVSIDQKKworCisKK3R5cGVkZWYgc3RydWN0IHNfeGRwc3BsaXQgeworCWxvbmcgaTEsIGkyOworCWludCBtaW5fbG8sIG1pbl9oaTsKK30geGRwc3BsaXRfdDsKKworCisKKworc3RhdGljIGxvbmcgeGRsX3NwbGl0KHVuc2lnbmVkIGxvbmcgY29uc3QgKmhhMSwgbG9uZyBvZmYxLCBsb25nIGxpbTEsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29uc3QgKmhhMiwgbG9uZyBvZmYyLCBsb25nIGxpbTIsCisJCSAgICAgIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRwc3BsaXRfdCAqc3BsLAorCQkgICAgICB4ZGFsZ29lbnZfdCAqeGVudik7CitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2FkZF9jaGFuZ2UoeGRjaGFuZ2VfdCAqeHNjciwgbG9uZyBpMSwgbG9uZyBpMiwgbG9uZyBjaGcxLCBsb25nIGNoZzIpOworc3RhdGljIGludCB4ZGxfY2hhbmdlX2NvbXBhY3QoeGRmaWxlX3QgKnhkZiwgeGRmaWxlX3QgKnhkZm8sIGxvbmcgZmxhZ3MpOworCisKKworCisKKy8qCisgKiBTZWUgIkFuIE8oTkQpIERpZmZlcmVuY2UgQWxnb3JpdGhtIGFuZCBpdHMgVmFyaWF0aW9ucyIsIGJ5IEV1Z2VuZSBNeWVycy4KKyAqIEJhc2ljYWxseSBjb25zaWRlcnMgYSAiYm94IiAob2ZmMSwgb2ZmMiwgbGltMSwgbGltMikgYW5kIHNjYW4gZnJvbSBib3RoCisgKiB0aGUgZm9yd2FyZCBkaWFnb25hbCBzdGFydGluZyBmcm9tIChvZmYxLCBvZmYyKSBhbmQgdGhlIGJhY2t3YXJkIGRpYWdvbmFsCisgKiBzdGFydGluZyBmcm9tIChsaW0xLCBsaW0yKS4gSWYgdGhlIEsgdmFsdWVzIG9uIHRoZSBzYW1lIGRpYWdvbmFsIGNyb3NzZXMKKyAqIHJldHVybnMgdGhlIGZ1cnRoZXN0IHBvaW50IG9mIHJlYWNoLiBXZSBtaWdodCBlbmQgdXAgaGF2aW5nIHRvIGV4cGVuc2l2ZQorICogY2FzZXMgdXNpbmcgdGhpcyBhbGdvcml0aG0gaXMgZnVsbCwgc28gYSBsaXR0bGUgYml0IG9mIGhldXJpc3RpYyBpcyBuZWVkZWQKKyAqIHRvIGN1dCB0aGUgc2VhcmNoIGFuZCB0byByZXR1cm4gYSBzdWJvcHRpbWFsIHBvaW50LgorICovCitzdGF0aWMgbG9uZyB4ZGxfc3BsaXQodW5zaWduZWQgbG9uZyBjb25zdCAqaGExLCBsb25nIG9mZjEsIGxvbmcgbGltMSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBjb25zdCAqaGEyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJICAgICAgbG9uZyAqa3ZkZiwgbG9uZyAqa3ZkYiwgaW50IG5lZWRfbWluLCB4ZHBzcGxpdF90ICpzcGwsCisJCSAgICAgIHhkYWxnb2Vudl90ICp4ZW52KSB7CisJbG9uZyBkbWluID0gb2ZmMSAtIGxpbTIsIGRtYXggPSBsaW0xIC0gb2ZmMjsKKwlsb25nIGZtaWQgPSBvZmYxIC0gb2ZmMiwgYm1pZCA9IGxpbTEgLSBsaW0yOworCWxvbmcgb2RkID0gKGZtaWQgLSBibWlkKSAmIDE7CisJbG9uZyBmbWluID0gZm1pZCwgZm1heCA9IGZtaWQ7CisJbG9uZyBibWluID0gYm1pZCwgYm1heCA9IGJtaWQ7CisJbG9uZyBlYywgZCwgaTEsIGkyLCBwcmV2MSwgYmVzdCwgZGQsIHYsIGs7CisKKwkvKgorCSAqIFNldCBpbml0aWFsIGRpYWdvbmFsIHZhbHVlcyBmb3IgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBwYXRoLgorCSAqLworCWt2ZGZbZm1pZF0gPSBvZmYxOworCWt2ZGJbYm1pZF0gPSBsaW0xOworCisJZm9yIChlYyA9IDE7OyBlYysrKSB7CisJCWludCBnb3Rfc25ha2UgPSAwOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZXh0ZW50IHRoZSBkaWFnb25hbCAiZG9tYWluIiBieSBvbmUuIElmIHRoZSBuZXh0CisJCSAqIHZhbHVlcyBleGl0cyB0aGUgYm94IGJvdW5kYXJpZXMgd2UgbmVlZCB0byBjaGFuZ2UgaXQgaW4gdGhlCisJCSAqIG9wcG9zaXRlIGRpcmVjdGlvbiBiZWNhdXNlIChtYXggLSBtaW4pIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisJCSAqIEFsc28gd2UgaW5pdGlhbGl6ZSB0aGUgZXh0ZXJuYWwgSyB2YWx1ZSB0byAtMSBzbyB0aGF0IHdlIGNhbgorCQkgKiBhdm9pZCBleHRyYSBjb25kaXRpb25zIGNoZWNrIGluc2lkZSB0aGUgY29yZSBsb29wLgorCQkgKi8KKwkJaWYgKGZtaW4gPiBkbWluKQorCQkJa3ZkZlstLWZtaW4gLSAxXSA9IC0xOworCQllbHNlCisJCQkrK2ZtaW47CisJCWlmIChmbWF4IDwgZG1heCkKKwkJCWt2ZGZbKytmbWF4ICsgMV0gPSAtMTsKKwkJZWxzZQorCQkJLS1mbWF4OworCisJCWZvciAoZCA9IGZtYXg7IGQgPj0gZm1pbjsgZCAtPSAyKSB7CisJCQlpZiAoa3ZkZltkIC0gMV0gPj0ga3ZkZltkICsgMV0pCisJCQkJaTEgPSBrdmRmW2QgLSAxXSArIDE7CisJCQllbHNlCisJCQkJaTEgPSBrdmRmW2QgKyAxXTsKKwkJCXByZXYxID0gaTE7CisJCQlpMiA9IGkxIC0gZDsKKwkJCWZvciAoOyBpMSA8IGxpbTEgJiYgaTIgPCBsaW0yICYmIGhhMVtpMV0gPT0gaGEyW2kyXTsgaTErKywgaTIrKyk7CisJCQlpZiAoaTEgLSBwcmV2MSA+IHhlbnYtPnNuYWtlX2NudCkKKwkJCQlnb3Rfc25ha2UgPSAxOworCQkJa3ZkZltkXSA9IGkxOworCQkJaWYgKG9kZCAmJiBibWluIDw9IGQgJiYgZCA8PSBibWF4ICYmIGt2ZGJbZF0gPD0gaTEpIHsKKwkJCQlzcGwtPmkxID0gaTE7CisJCQkJc3BsLT5pMiA9IGkyOworCQkJCXNwbC0+bWluX2xvID0gc3BsLT5taW5faGkgPSAxOworCQkJCXJldHVybiBlYzsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZXh0ZW50IHRoZSBkaWFnb25hbCAiZG9tYWluIiBieSBvbmUuIElmIHRoZSBuZXh0CisJCSAqIHZhbHVlcyBleGl0cyB0aGUgYm94IGJvdW5kYXJpZXMgd2UgbmVlZCB0byBjaGFuZ2UgaXQgaW4gdGhlCisJCSAqIG9wcG9zaXRlIGRpcmVjdGlvbiBiZWNhdXNlIChtYXggLSBtaW4pIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisJCSAqIEFsc28gd2UgaW5pdGlhbGl6ZSB0aGUgZXh0ZXJuYWwgSyB2YWx1ZSB0byAtMSBzbyB0aGF0IHdlIGNhbgorCQkgKiBhdm9pZCBleHRyYSBjb25kaXRpb25zIGNoZWNrIGluc2lkZSB0aGUgY29yZSBsb29wLgorCQkgKi8KKwkJaWYgKGJtaW4gPiBkbWluKQorCQkJa3ZkYlstLWJtaW4gLSAxXSA9IFhETF9MSU5FX01BWDsKKwkJZWxzZQorCQkJKytibWluOworCQlpZiAoYm1heCA8IGRtYXgpCisJCQlrdmRiWysrYm1heCArIDFdID0gWERMX0xJTkVfTUFYOworCQllbHNlCisJCQktLWJtYXg7CisKKwkJZm9yIChkID0gYm1heDsgZCA+PSBibWluOyBkIC09IDIpIHsKKwkJCWlmIChrdmRiW2QgLSAxXSA8IGt2ZGJbZCArIDFdKQorCQkJCWkxID0ga3ZkYltkIC0gMV07CisJCQllbHNlCisJCQkJaTEgPSBrdmRiW2QgKyAxXSAtIDE7CisJCQlwcmV2MSA9IGkxOworCQkJaTIgPSBpMSAtIGQ7CisJCQlmb3IgKDsgaTEgPiBvZmYxICYmIGkyID4gb2ZmMiAmJiBoYTFbaTEgLSAxXSA9PSBoYTJbaTIgLSAxXTsgaTEtLSwgaTItLSk7CisJCQlpZiAocHJldjEgLSBpMSA+IHhlbnYtPnNuYWtlX2NudCkKKwkJCQlnb3Rfc25ha2UgPSAxOworCQkJa3ZkYltkXSA9IGkxOworCQkJaWYgKCFvZGQgJiYgZm1pbiA8PSBkICYmIGQgPD0gZm1heCAmJiBpMSA8PSBrdmRmW2RdKSB7CisJCQkJc3BsLT5pMSA9IGkxOworCQkJCXNwbC0+aTIgPSBpMjsKKwkJCQlzcGwtPm1pbl9sbyA9IHNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQlpZiAobmVlZF9taW4pCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiB0aGUgZWRpdCBjb3N0IGlzIGFib3ZlIHRoZSBoZXVyaXN0aWMgdHJpZ2dlciBhbmQgaWYKKwkJICogd2UgZ290IGEgZ29vZCBzbmFrZSwgd2Ugc2FtcGxlIGN1cnJlbnQgZGlhZ29uYWxzIHRvIHNlZQorCQkgKiBpZiBzb21lIG9mIHRoZSwgaGF2ZSByZWFjaGVkIGFuICJpbnRlcmVzdGluZyIgcGF0aC4gT3VyCisJCSAqIG1lYXN1cmUgaXMgYSBmdW5jdGlvbiBvZiB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgZGlhZ29uYWwKKwkJICogY29ybmVyIChpMSArIGkyKSBwZW5hbGl6ZWQgd2l0aCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKKwkJICogbWlkIGRpYWdvbmFsIGl0c2VsZi4gSWYgdGhpcyB2YWx1ZSBpcyBhYm92ZSB0aGUgY3VycmVudAorCQkgKiBlZGl0IGNvc3QgdGltZXMgYSBtYWdpYyBmYWN0b3IgKFhETF9LX0hFVVIpIHdlIGNvbnNpZGVyCisJCSAqIGl0IGludGVyZXN0aW5nLgorCQkgKi8KKwkJaWYgKGdvdF9zbmFrZSAmJiBlYyA+IHhlbnYtPmhldXJfbWluKSB7CisJCQlmb3IgKGJlc3QgPSAwLCBkID0gZm1heDsgZCA+PSBmbWluOyBkIC09IDIpIHsKKwkJCQlkZCA9IGQgPiBmbWlkID8gZCAtIGZtaWQ6IGZtaWQgLSBkOworCQkJCWkxID0ga3ZkZltkXTsKKwkJCQlpMiA9IGkxIC0gZDsKKwkJCQl2ID0gKGkxIC0gb2ZmMSkgKyAoaTIgLSBvZmYyKSAtIGRkOworCisJCQkJaWYgKHYgPiBYRExfS19IRVVSICogZWMgJiYgdiA+IGJlc3QgJiYKKwkJCQkgICAgb2ZmMSArIHhlbnYtPnNuYWtlX2NudCA8PSBpMSAmJiBpMSA8IGxpbTEgJiYKKwkJCQkgICAgb2ZmMiArIHhlbnYtPnNuYWtlX2NudCA8PSBpMiAmJiBpMiA8IGxpbTIpIHsKKwkJCQkJZm9yIChrID0gMTsgaGExW2kxIC0ga10gPT0gaGEyW2kyIC0ga107IGsrKykKKwkJCQkJCWlmIChrID09IHhlbnYtPnNuYWtlX2NudCkgeworCQkJCQkJCWJlc3QgPSB2OworCQkJCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQkJCQlzcGwtPmkyID0gaTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGJlc3QgPiAwKSB7CisJCQkJc3BsLT5taW5fbG8gPSAxOworCQkJCXNwbC0+bWluX2hpID0gMDsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisKKwkJCWZvciAoYmVzdCA9IDAsIGQgPSBibWF4OyBkID49IGJtaW47IGQgLT0gMikgeworCQkJCWRkID0gZCA+IGJtaWQgPyBkIC0gYm1pZDogYm1pZCAtIGQ7CisJCQkJaTEgPSBrdmRiW2RdOworCQkJCWkyID0gaTEgLSBkOworCQkJCXYgPSAobGltMSAtIGkxKSArIChsaW0yIC0gaTIpIC0gZGQ7CisKKwkJCQlpZiAodiA+IFhETF9LX0hFVVIgKiBlYyAmJiB2ID4gYmVzdCAmJgorCQkJCSAgICBvZmYxIDwgaTEgJiYgaTEgPD0gbGltMSAtIHhlbnYtPnNuYWtlX2NudCAmJgorCQkJCSAgICBvZmYyIDwgaTIgJiYgaTIgPD0gbGltMiAtIHhlbnYtPnNuYWtlX2NudCkgeworCQkJCQlmb3IgKGsgPSAwOyBoYTFbaTEgKyBrXSA9PSBoYTJbaTIgKyBrXTsgaysrKQorCQkJCQkJaWYgKGsgPT0geGVudi0+c25ha2VfY250IC0gMSkgeworCQkJCQkJCWJlc3QgPSB2OworCQkJCQkJCXNwbC0+aTEgPSBpMTsKKwkJCQkJCQlzcGwtPmkyID0gaTI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGJlc3QgPiAwKSB7CisJCQkJc3BsLT5taW5fbG8gPSAwOworCQkJCXNwbC0+bWluX2hpID0gMTsKKwkJCQlyZXR1cm4gZWM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBFbm91Z2ggaXMgZW5vdWdoLiBXZSBzcGVudCB0b28gbXVjaCB0aW1lIGhlcmUgYW5kIG5vdyB3ZSBjb2xsZWN0CisJCSAqIHRoZSBmdXJ0aGVzdCByZWFjaGluZyBwYXRoIHVzaW5nIHRoZSAoaTEgKyBpMikgbWVhc3VyZS4KKwkJICovCisJCWlmIChlYyA+PSB4ZW52LT5teGNvc3QpIHsKKwkJCWxvbmcgZmJlc3QsIGZiZXN0MSwgYmJlc3QsIGJiZXN0MTsKKworCQkJZmJlc3QgPSBmYmVzdDEgPSAtMTsKKwkJCWZvciAoZCA9IGZtYXg7IGQgPj0gZm1pbjsgZCAtPSAyKSB7CisJCQkJaTEgPSBYRExfTUlOKGt2ZGZbZF0sIGxpbTEpOworCQkJCWkyID0gaTEgLSBkOworCQkJCWlmIChsaW0yIDwgaTIpCisJCQkJCWkxID0gbGltMiArIGQsIGkyID0gbGltMjsKKwkJCQlpZiAoZmJlc3QgPCBpMSArIGkyKSB7CisJCQkJCWZiZXN0ID0gaTEgKyBpMjsKKwkJCQkJZmJlc3QxID0gaTE7CisJCQkJfQorCQkJfQorCisJCQliYmVzdCA9IGJiZXN0MSA9IFhETF9MSU5FX01BWDsKKwkJCWZvciAoZCA9IGJtYXg7IGQgPj0gYm1pbjsgZCAtPSAyKSB7CisJCQkJaTEgPSBYRExfTUFYKG9mZjEsIGt2ZGJbZF0pOworCQkJCWkyID0gaTEgLSBkOworCQkJCWlmIChpMiA8IG9mZjIpCisJCQkJCWkxID0gb2ZmMiArIGQsIGkyID0gb2ZmMjsKKwkJCQlpZiAoaTEgKyBpMiA8IGJiZXN0KSB7CisJCQkJCWJiZXN0ID0gaTEgKyBpMjsKKwkJCQkJYmJlc3QxID0gaTE7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGxpbTEgKyBsaW0yKSAtIGJiZXN0IDwgZmJlc3QgLSAob2ZmMSArIG9mZjIpKSB7CisJCQkJc3BsLT5pMSA9IGZiZXN0MTsKKwkJCQlzcGwtPmkyID0gZmJlc3QgLSBmYmVzdDE7CisJCQkJc3BsLT5taW5fbG8gPSAxOworCQkJCXNwbC0+bWluX2hpID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc3BsLT5pMSA9IGJiZXN0MTsKKwkJCQlzcGwtPmkyID0gYmJlc3QgLSBiYmVzdDE7CisJCQkJc3BsLT5taW5fbG8gPSAwOworCQkJCXNwbC0+bWluX2hpID0gMTsKKwkJCX0KKwkJCXJldHVybiBlYzsKKwkJfQorCX0KKworCXJldHVybiAtMTsKK30KKworCisvKgorICogUnVsZTogIkRpdmlkZSBldCBJbXBlcmEiLiBSZWN1cnNpdmVseSBzcGxpdCB0aGUgYm94IGluIHN1Yi1ib3hlcyBieSBjYWxsaW5nCisgKiB0aGUgYm94IHNwbGl0dGluZyBmdW5jdGlvbi4gTm90ZSB0aGF0IHRoZSByZWFsIGpvYiAobWFya2luZyBjaGFuZ2VkIGxpbmVzKQorICogaXMgZG9uZSBpbiB0aGUgdHdvIGJvdW5kYXJ5IHJlYWNoaW5nIGNoZWNrcy4KKyAqLworaW50IHhkbF9yZWNzX2NtcChkaWZmZGF0YV90ICpkZDEsIGxvbmcgb2ZmMSwgbG9uZyBsaW0xLAorCQkgZGlmZmRhdGFfdCAqZGQyLCBsb25nIG9mZjIsIGxvbmcgbGltMiwKKwkJIGxvbmcgKmt2ZGYsIGxvbmcgKmt2ZGIsIGludCBuZWVkX21pbiwgeGRhbGdvZW52X3QgKnhlbnYpIHsKKwl1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTEgPSBkZDEtPmhhLCAqaGEyID0gZGQyLT5oYTsKKworCS8qCisJICogU2hyaW5rIHRoZSBib3ggYnkgd2Fsa2luZyB0aHJvdWdoIGVhY2ggZGlhZ29uYWwgc25ha2UgKFNXIGFuZCBORSkuCisJICovCisJZm9yICg7IG9mZjEgPCBsaW0xICYmIG9mZjIgPCBsaW0yICYmIGhhMVtvZmYxXSA9PSBoYTJbb2ZmMl07IG9mZjErKywgb2ZmMisrKTsKKwlmb3IgKDsgb2ZmMSA8IGxpbTEgJiYgb2ZmMiA8IGxpbTIgJiYgaGExW2xpbTEgLSAxXSA9PSBoYTJbbGltMiAtIDFdOyBsaW0xLS0sIGxpbTItLSk7CisKKwkvKgorCSAqIElmIG9uZSBkaW1lbnNpb24gaXMgZW1wdHksIHRoZW4gYWxsIHJlY29yZHMgb24gdGhlIG90aGVyIG9uZSBtdXN0CisJICogYmUgb2J2aW91c2x5IGNoYW5nZWQuCisJICovCisJaWYgKG9mZjEgPT0gbGltMSkgeworCQljaGFyICpyY2hnMiA9IGRkMi0+cmNoZzsKKwkJbG9uZyAqcmluZGV4MiA9IGRkMi0+cmluZGV4OworCisJCWZvciAoOyBvZmYyIDwgbGltMjsgb2ZmMisrKQorCQkJcmNoZzJbcmluZGV4MltvZmYyXV0gPSAxOworCX0gZWxzZSBpZiAob2ZmMiA9PSBsaW0yKSB7CisJCWNoYXIgKnJjaGcxID0gZGQxLT5yY2hnOworCQlsb25nICpyaW5kZXgxID0gZGQxLT5yaW5kZXg7CisKKwkJZm9yICg7IG9mZjEgPCBsaW0xOyBvZmYxKyspCisJCQlyY2hnMVtyaW5kZXgxW29mZjFdXSA9IDE7CisJfSBlbHNlIHsKKwkJbG9uZyBlYzsKKwkJeGRwc3BsaXRfdCBzcGw7CisJCXNwbC5pMSA9IHNwbC5pMiA9IDA7CisKKwkJLyoKKwkJICogRGl2aWRlIC4uLgorCQkgKi8KKwkJaWYgKChlYyA9IHhkbF9zcGxpdChoYTEsIG9mZjEsIGxpbTEsIGhhMiwgb2ZmMiwgbGltMiwga3ZkZiwga3ZkYiwKKwkJCQkgICAgbmVlZF9taW4sICZzcGwsIHhlbnYpKSA8IDApIHsKKworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogLi4uIGV0IEltcGVyYS4KKwkJICovCisJCWlmICh4ZGxfcmVjc19jbXAoZGQxLCBvZmYxLCBzcGwuaTEsIGRkMiwgb2ZmMiwgc3BsLmkyLAorCQkJCSBrdmRmLCBrdmRiLCBzcGwubWluX2xvLCB4ZW52KSA8IDAgfHwKKwkJICAgIHhkbF9yZWNzX2NtcChkZDEsIHNwbC5pMSwgbGltMSwgZGQyLCBzcGwuaTIsIGxpbTIsCisJCQkJIGt2ZGYsIGt2ZGIsIHNwbC5taW5faGksIHhlbnYpIDwgMCkgeworCisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgeGRsX2RvX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCXhkZmVudl90ICp4ZSkgeworCWxvbmcgbmRpYWdzOworCWxvbmcgKmt2ZCwgKmt2ZGYsICprdmRiOworCXhkYWxnb2Vudl90IHhlbnY7CisJZGlmZmRhdGFfdCBkZDEsIGRkMjsKKworCWlmICh4ZGxfcHJlcGFyZV9lbnYobWYxLCBtZjIsIHhwcCwgeGUpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBzZXR1cCBLIHZlY3RvcnMgdG8gYmUgdXNlZCBieSB0aGUgZGlmZmVyZW50aWFsIGFsZ29yaXRobS4KKwkgKiBPbmUgaXMgdG8gc3RvcmUgdGhlIGZvcndhcmQgcGF0aCBhbmQgb25lIHRvIHN0b3JlIHRoZSBiYWNrd2FyZCBwYXRoLgorCSAqLworCW5kaWFncyA9IHhlLT54ZGYxLm5yZWZmICsgeGUtPnhkZjIubnJlZmYgKyAzOworCWlmICghKGt2ZCA9IChsb25nICopIHhkbF9tYWxsb2MoKDIgKiBuZGlhZ3MgKyAyKSAqIHNpemVvZihsb25nKSkpKSB7CisKKwkJeGRsX2ZyZWVfZW52KHhlKTsKKwkJcmV0dXJuIC0xOworCX0KKwlrdmRmID0ga3ZkOworCWt2ZGIgPSBrdmRmICsgbmRpYWdzOworCWt2ZGYgKz0geGUtPnhkZjIubnJlZmYgKyAxOworCWt2ZGIgKz0geGUtPnhkZjIubnJlZmYgKyAxOworCisJeGVudi5teGNvc3QgPSB4ZGxfYm9nb3NxcnQobmRpYWdzKTsKKwlpZiAoeGVudi5teGNvc3QgPCBYRExfTUFYX0NPU1RfTUlOKQorCQl4ZW52Lm14Y29zdCA9IFhETF9NQVhfQ09TVF9NSU47CisJeGVudi5zbmFrZV9jbnQgPSBYRExfU05BS0VfQ05UOworCXhlbnYuaGV1cl9taW4gPSBYRExfSEVVUl9NSU5fQ09TVDsKKworCWRkMS5ucmVjID0geGUtPnhkZjEubnJlZmY7CisJZGQxLmhhID0geGUtPnhkZjEuaGE7CisJZGQxLnJjaGcgPSB4ZS0+eGRmMS5yY2hnOworCWRkMS5yaW5kZXggPSB4ZS0+eGRmMS5yaW5kZXg7CisJZGQyLm5yZWMgPSB4ZS0+eGRmMi5ucmVmZjsKKwlkZDIuaGEgPSB4ZS0+eGRmMi5oYTsKKwlkZDIucmNoZyA9IHhlLT54ZGYyLnJjaGc7CisJZGQyLnJpbmRleCA9IHhlLT54ZGYyLnJpbmRleDsKKworCWlmICh4ZGxfcmVjc19jbXAoJmRkMSwgMCwgZGQxLm5yZWMsICZkZDIsIDAsIGRkMi5ucmVjLAorCQkJIGt2ZGYsIGt2ZGIsICh4cHAtPmZsYWdzICYgWERGX05FRURfTUlOSU1BTCkgIT0gMCwgJnhlbnYpIDwgMCkgeworCisJCXhkbF9mcmVlKGt2ZCk7CisJCXhkbF9mcmVlX2Vudih4ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl4ZGxfZnJlZShrdmQpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHhkY2hhbmdlX3QgKnhkbF9hZGRfY2hhbmdlKHhkY2hhbmdlX3QgKnhzY3IsIGxvbmcgaTEsIGxvbmcgaTIsIGxvbmcgY2hnMSwgbG9uZyBjaGcyKSB7CisJeGRjaGFuZ2VfdCAqeGNoOworCisJaWYgKCEoeGNoID0gKHhkY2hhbmdlX3QgKikgeGRsX21hbGxvYyhzaXplb2YoeGRjaGFuZ2VfdCkpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwl4Y2gtPm5leHQgPSB4c2NyOworCXhjaC0+aTEgPSBpMTsKKwl4Y2gtPmkyID0gaTI7CisJeGNoLT5jaGcxID0gY2hnMTsKKwl4Y2gtPmNoZzIgPSBjaGcyOworCisJcmV0dXJuIHhjaDsKK30KKworCitzdGF0aWMgaW50IHhkbF9jaGFuZ2VfY29tcGFjdCh4ZGZpbGVfdCAqeGRmLCB4ZGZpbGVfdCAqeGRmbywgbG9uZyBmbGFncykgeworCWxvbmcgaXgsIGl4bywgaXhzLCBpeHJlZiwgZ3Jwc2l6LCBucmVjID0geGRmLT5ucmVjOworCWNoYXIgKnJjaGcgPSB4ZGYtPnJjaGcsICpyY2hnbyA9IHhkZm8tPnJjaGc7CisJeHJlY29yZF90ICoqcmVjcyA9IHhkZi0+cmVjczsKKworCS8qCisJICogVGhpcyBpcyB0aGUgc2FtZSBvZiB3aGF0IEdOVSBkaWZmIGRvZXMuIE1vdmUgYmFjayBhbmQgZm9yd2FyZAorCSAqIGNoYW5nZSBncm91cHMgZm9yIGEgY29uc2lzdGVudCBhbmQgcHJldHR5IGRpZmYgb3V0cHV0LiBUaGlzIGFsc28KKwkgKiBoZWxwcyBpbiBmaW5kaW5nIGpvaW5hYmxlIGNoYW5nZSBncm91cHMgYW5kIHJlZHVjZSB0aGUgZGlmZiBzaXplLgorCSAqLworCWZvciAoaXggPSBpeG8gPSAwOzspIHsKKwkJLyoKKwkJICogRmluZCB0aGUgZmlyc3QgY2hhbmdlZCBsaW5lIGluIHRoZSB0by1iZS1jb21wYWN0ZWQgZmlsZS4KKwkJICogV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGJvdGggaW5kZXhlcywgc28gaWYgd2UgZmluZCBhCisJCSAqIGNoYW5nZWQgbGluZXMgZ3JvdXAgb24gdGhlIG90aGVyIGZpbGUsIHdoaWxlIHNjYW5uaW5nIHRoZQorCQkgKiB0by1iZS1jb21wYWN0ZWQgZmlsZSwgd2UgbmVlZCB0byBza2lwIGl0IHByb3Blcmx5LiBOb3RlCisJCSAqIHRoYXQgbG9vcHMgdGhhdCBhcmUgdGVzdGluZyBmb3IgY2hhbmdlZCBsaW5lcyBvbiByY2hnKiBkbworCQkgKiBub3QgbmVlZCBpbmRleCBib3VuZGluZyBzaW5jZSB0aGUgYXJyYXkgaXMgcHJlcGFyZWQgd2l0aAorCQkgKiBhIHplcm8gYXQgcG9zaXRpb24gLTEgYW5kIE4uCisJCSAqLworCQlmb3IgKDsgaXggPCBucmVjICYmICFyY2hnW2l4XTsgaXgrKykKKwkJCXdoaWxlIChyY2hnb1tpeG8rK10pOworCQlpZiAoaXggPT0gbnJlYykKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFJlY29yZCB0aGUgc3RhcnQgb2YgYSBjaGFuZ2VkLWdyb3VwIGluIHRoZSB0by1iZS1jb21wYWN0ZWQgZmlsZQorCQkgKiBhbmQgZmluZCB0aGUgZW5kIG9mIGl0LCBvbiBib3RoIHRvLWJlLWNvbXBhY3RlZCBhbmQgb3RoZXIgZmlsZQorCQkgKiBpbmRleGVzIChpeCBhbmQgaXhvKS4KKwkJICovCisJCWl4cyA9IGl4OworCQlmb3IgKGl4Kys7IHJjaGdbaXhdOyBpeCsrKTsKKwkJZm9yICg7IHJjaGdvW2l4b107IGl4bysrKTsKKworCQlkbyB7CisJCQlncnBzaXogPSBpeCAtIGl4czsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBsaW5lIGJlZm9yZSB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIGlzIGVxdWFsIHRvCisJCQkgKiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBjdXJyZW50IGNoYW5nZSBncm91cCwgc2hpZnQgYmFja3dhcmQKKwkJCSAqIHRoZSBncm91cC4KKwkJCSAqLworCQkJd2hpbGUgKGl4cyA+IDAgJiYgcmVjc1tpeHMgLSAxXS0+aGEgPT0gcmVjc1tpeCAtIDFdLT5oYSAmJgorCQkJICAgICAgIHhkbF9yZWNtYXRjaChyZWNzW2l4cyAtIDFdLT5wdHIsIHJlY3NbaXhzIC0gMV0tPnNpemUsIHJlY3NbaXggLSAxXS0+cHRyLCByZWNzW2l4IC0gMV0tPnNpemUsIGZsYWdzKSkgeworCQkJCXJjaGdbLS1peHNdID0gMTsKKwkJCQlyY2hnWy0taXhdID0gMDsKKworCQkJCS8qCisJCQkJICogVGhpcyBjaGFuZ2UgbWlnaHQgaGF2ZSBqb2luZWQgdHdvIGNoYW5nZSBncm91cHMsCisJCQkJICogc28gd2UgdHJ5IHRvIHRha2UgdGhpcyBzY2VuYXJpbyBpbiBhY2NvdW50IGJ5IG1vdmluZworCQkJCSAqIHRoZSBzdGFydCBpbmRleCBhY2NvcmRpbmdseSAoYW5kIHNvIHRoZSBvdGhlci1maWxlCisJCQkJICogZW5kLW9mLWdyb3VwIGluZGV4KS4KKwkJCQkgKi8KKwkJCQlmb3IgKDsgcmNoZ1tpeHMgLSAxXTsgaXhzLS0pOworCQkJCXdoaWxlIChyY2hnb1stLWl4b10pOworCQkJfQorCisJCQkvKgorCQkJICogUmVjb3JkIHRoZSBlbmQtb2YtZ3JvdXAgcG9zaXRpb24gaW4gY2FzZSB3ZSBhcmUgbWF0Y2hlZAorCQkJICogd2l0aCBhIGdyb3VwIG9mIGNoYW5nZXMgaW4gdGhlIG90aGVyIGZpbGUgKHRoYXQgaXMsIHRoZQorCQkJICogY2hhbmdlIHJlY29yZCBiZWZvcmUgdGhlIGVuZi1vZi1ncm91cCBpbmRleCBpbiB0aGUgb3RoZXIKKwkJCSAqIGZpbGUgaXMgc2V0KS4KKwkJCSAqLworCQkJaXhyZWYgPSByY2hnb1tpeG8gLSAxXSA/IGl4OiBucmVjOworCisJCQkvKgorCQkJICogSWYgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGN1cnJlbnQgY2hhbmdlIGdyb3VwLCBpcyBlcXVhbCB0bworCQkJICogdGhlIGxpbmUgbmV4dCBvZiB0aGUgY3VycmVudCBjaGFuZ2UgZ3JvdXAsIHNoaWZ0IGZvcndhcmQKKwkJCSAqIHRoZSBncm91cC4KKwkJCSAqLworCQkJd2hpbGUgKGl4IDwgbnJlYyAmJiByZWNzW2l4c10tPmhhID09IHJlY3NbaXhdLT5oYSAmJgorCQkJICAgICAgIHhkbF9yZWNtYXRjaChyZWNzW2l4c10tPnB0ciwgcmVjc1tpeHNdLT5zaXplLCByZWNzW2l4XS0+cHRyLCByZWNzW2l4XS0+c2l6ZSwgZmxhZ3MpKSB7CisJCQkJcmNoZ1tpeHMrK10gPSAwOworCQkJCXJjaGdbaXgrK10gPSAxOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGNoYW5nZSBtaWdodCBoYXZlIGpvaW5lZCB0d28gY2hhbmdlIGdyb3VwcywKKwkJCQkgKiBzbyB3ZSB0cnkgdG8gdGFrZSB0aGlzIHNjZW5hcmlvIGluIGFjY291bnQgYnkgbW92aW5nCisJCQkJICogdGhlIHN0YXJ0IGluZGV4IGFjY29yZGluZ2x5IChhbmQgc28gdGhlIG90aGVyLWZpbGUKKwkJCQkgKiBlbmQtb2YtZ3JvdXAgaW5kZXgpLiBLZWVwIHRyYWNraW5nIHRoZSByZWZlcmVuY2UKKwkJCQkgKiBpbmRleCBpbiBjYXNlIHdlIGFyZSBzaGlmdGluZyB0b2dldGhlciB3aXRoIGEKKwkJCQkgKiBjb3JyZXNwb25kaW5nIGdyb3VwIG9mIGNoYW5nZXMgaW4gdGhlIG90aGVyIGZpbGUuCisJCQkJICovCisJCQkJZm9yICg7IHJjaGdbaXhdOyBpeCsrKTsKKwkJCQl3aGlsZSAocmNoZ29bKytpeG9dKQorCQkJCQlpeHJlZiA9IGl4OworCQkJfQorCQl9IHdoaWxlIChncnBzaXogIT0gaXggLSBpeHMpOworCisJCS8qCisJCSAqIFRyeSB0byBtb3ZlIGJhY2sgdGhlIHBvc3NpYmx5IG1lcmdlZCBncm91cCBvZiBjaGFuZ2VzLCB0byBtYXRjaAorCQkgKiB0aGUgcmVjb3JkZWQgcG9zdGlvbiBpbiB0aGUgb3RoZXIgZmlsZS4KKwkJICovCisJCXdoaWxlIChpeHJlZiA8IGl4KSB7CisJCQlyY2hnWy0taXhzXSA9IDE7CisJCQlyY2hnWy0taXhdID0gMDsKKwkJCXdoaWxlIChyY2hnb1stLWl4b10pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHhkbF9idWlsZF9zY3JpcHQoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICoqeHNjcikgeworCXhkY2hhbmdlX3QgKmNzY3IgPSBOVUxMLCAqeGNoOworCWNoYXIgKnJjaGcxID0geGUtPnhkZjEucmNoZywgKnJjaGcyID0geGUtPnhkZjIucmNoZzsKKwlsb25nIGkxLCBpMiwgbDEsIGwyOworCisJLyoKKwkgKiBUcml2aWFsLiBDb2xsZWN0cyAiZ3JvdXBzIiBvZiBjaGFuZ2VzIGFuZCBjcmVhdGVzIGFuIGVkaXQgc2NyaXB0LgorCSAqLworCWZvciAoaTEgPSB4ZS0+eGRmMS5ucmVjLCBpMiA9IHhlLT54ZGYyLm5yZWM7IGkxID49IDAgfHwgaTIgPj0gMDsgaTEtLSwgaTItLSkKKwkJaWYgKHJjaGcxW2kxIC0gMV0gfHwgcmNoZzJbaTIgLSAxXSkgeworCQkJZm9yIChsMSA9IGkxOyByY2hnMVtpMSAtIDFdOyBpMS0tKTsKKwkJCWZvciAobDIgPSBpMjsgcmNoZzJbaTIgLSAxXTsgaTItLSk7CisKKwkJCWlmICghKHhjaCA9IHhkbF9hZGRfY2hhbmdlKGNzY3IsIGkxLCBpMiwgbDEgLSBpMSwgbDIgLSBpMikpKSB7CisJCQkJeGRsX2ZyZWVfc2NyaXB0KGNzY3IpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWNzY3IgPSB4Y2g7CisJCX0KKworCSp4c2NyID0gY3NjcjsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgeGRsX2ZyZWVfc2NyaXB0KHhkY2hhbmdlX3QgKnhzY3IpIHsKKwl4ZGNoYW5nZV90ICp4Y2g7CisKKwl3aGlsZSAoKHhjaCA9IHhzY3IpICE9IE5VTEwpIHsKKwkJeHNjciA9IHhzY3ItPm5leHQ7CisJCXhkbF9mcmVlKHhjaCk7CisJfQorfQorCisKK2ludCB4ZGxfZGlmZihtbWZpbGVfdCAqbWYxLCBtbWZpbGVfdCAqbWYyLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkgICAgIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcsIHhkZW1pdGNiX3QgKmVjYikgeworCXhkY2hhbmdlX3QgKnhzY3I7CisJeGRmZW52X3QgeGU7CisKKwlpZiAoeGRsX2RvX2RpZmYobWYxLCBtZjIsIHhwcCwgJnhlKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCWlmICh4ZGxfY2hhbmdlX2NvbXBhY3QoJnhlLnhkZjEsICZ4ZS54ZGYyLCB4cHAtPmZsYWdzKSA8IDAgfHwKKwkgICAgeGRsX2NoYW5nZV9jb21wYWN0KCZ4ZS54ZGYyLCAmeGUueGRmMSwgeHBwLT5mbGFncykgPCAwIHx8CisJICAgIHhkbF9idWlsZF9zY3JpcHQoJnhlLCAmeHNjcikgPCAwKSB7CisKKwkJeGRsX2ZyZWVfZW52KCZ4ZSk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHhzY3IpIHsKKwkJaWYgKHhkbF9lbWl0X2RpZmYoJnhlLCB4c2NyLCBlY2IsIHhlY2ZnKSA8IDApIHsKKworCQkJeGRsX2ZyZWVfc2NyaXB0KHhzY3IpOworCQkJeGRsX2ZyZWVfZW52KCZ4ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJeGRsX2ZyZWVfc2NyaXB0KHhzY3IpOworCX0KKwl4ZGxfZnJlZV9lbnYoJnhlKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS94ZGlmZi94ZGlmZmkuaCBiL3hkaWZmL3hkaWZmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYjcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZGlmZmkuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKFhESUZGSV9IKQorI2RlZmluZSBYRElGRklfSAorCisKK3R5cGVkZWYgc3RydWN0IHNfZGlmZmRhdGEgeworCWxvbmcgbnJlYzsKKwl1bnNpZ25lZCBsb25nIGNvbnN0ICpoYTsKKwlsb25nICpyaW5kZXg7CisJY2hhciAqcmNoZzsKK30gZGlmZmRhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGFsZ29lbnYgeworCWxvbmcgbXhjb3N0OworCWxvbmcgc25ha2VfY250OworCWxvbmcgaGV1cl9taW47Cit9IHhkYWxnb2Vudl90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkY2hhbmdlIHsKKwlzdHJ1Y3Qgc194ZGNoYW5nZSAqbmV4dDsKKwlsb25nIGkxLCBpMjsKKwlsb25nIGNoZzEsIGNoZzI7Cit9IHhkY2hhbmdlX3Q7CisKKworCitpbnQgeGRsX3JlY3NfY21wKGRpZmZkYXRhX3QgKmRkMSwgbG9uZyBvZmYxLCBsb25nIGxpbTEsCisJCSBkaWZmZGF0YV90ICpkZDIsIGxvbmcgb2ZmMiwgbG9uZyBsaW0yLAorCQkgbG9uZyAqa3ZkZiwgbG9uZyAqa3ZkYiwgaW50IG5lZWRfbWluLCB4ZGFsZ29lbnZfdCAqeGVudik7CitpbnQgeGRsX2RvX2RpZmYobW1maWxlX3QgKm1mMSwgbW1maWxlX3QgKm1mMiwgeHBwYXJhbV90IGNvbnN0ICp4cHAsCisJCXhkZmVudl90ICp4ZSk7CitpbnQgeGRsX2J1aWxkX3NjcmlwdCh4ZGZlbnZfdCAqeGUsIHhkY2hhbmdlX3QgKip4c2NyKTsKK3ZvaWQgeGRsX2ZyZWVfc2NyaXB0KHhkY2hhbmdlX3QgKnhzY3IpOworaW50IHhkbF9lbWl0X2RpZmYoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICp4c2NyLCB4ZGVtaXRjYl90ICplY2IsCisJCSAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZyk7CisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWERJRkZJX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3hlbWl0LmMgYi94ZGlmZi94ZW1pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGM1NjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZW1pdC5jCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzCURhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSAieGluY2x1ZGUuaCIKKworCisKKworc3RhdGljIGxvbmcgeGRsX2dldF9yZWMoeGRmaWxlX3QgKnhkZiwgbG9uZyByaSwgY2hhciBjb25zdCAqKnJlYyk7CitzdGF0aWMgaW50IHhkbF9lbWl0X3JlY29yZCh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICpwcmUsIHhkZW1pdGNiX3QgKmVjYik7CitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2dldF9odW5rKHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpOworCisKKworCitzdGF0aWMgbG9uZyB4ZGxfZ2V0X3JlYyh4ZGZpbGVfdCAqeGRmLCBsb25nIHJpLCBjaGFyIGNvbnN0ICoqcmVjKSB7CisKKwkqcmVjID0geGRmLT5yZWNzW3JpXS0+cHRyOworCisJcmV0dXJuIHhkZi0+cmVjc1tyaV0tPnNpemU7Cit9CisKKworc3RhdGljIGludCB4ZGxfZW1pdF9yZWNvcmQoeGRmaWxlX3QgKnhkZiwgbG9uZyByaSwgY2hhciBjb25zdCAqcHJlLCB4ZGVtaXRjYl90ICplY2IpIHsKKwlsb25nIHNpemUsIHBzaXplID0gc3RybGVuKHByZSk7CisJY2hhciBjb25zdCAqcmVjOworCisJc2l6ZSA9IHhkbF9nZXRfcmVjKHhkZiwgcmksICZyZWMpOworCWlmICh4ZGxfZW1pdF9kaWZmcmVjKHJlYywgc2l6ZSwgcHJlLCBwc2l6ZSwgZWNiKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFN0YXJ0aW5nIGF0IHRoZSBwYXNzZWQgY2hhbmdlIGF0b20sIGZpbmQgdGhlIGxhdGVzdCBjaGFuZ2UgYXRvbSB0byBiZSBpbmNsdWRlZAorICogaW5zaWRlIHRoZSBkaWZmZXJlbnRpYWwgaHVuayBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgorICovCitzdGF0aWMgeGRjaGFuZ2VfdCAqeGRsX2dldF9odW5rKHhkY2hhbmdlX3QgKnhzY3IsIHhkZW1pdGNvbmZfdCBjb25zdCAqeGVjZmcpIHsKKwl4ZGNoYW5nZV90ICp4Y2gsICp4Y2hwOworCisJZm9yICh4Y2hwID0geHNjciwgeGNoID0geHNjci0+bmV4dDsgeGNoOyB4Y2hwID0geGNoLCB4Y2ggPSB4Y2gtPm5leHQpCisJCWlmICh4Y2gtPmkxIC0gKHhjaHAtPmkxICsgeGNocC0+Y2hnMSkgPiAyICogeGVjZmctPmN0eGxlbikKKwkJCWJyZWFrOworCisJcmV0dXJuIHhjaHA7Cit9CisKKworc3RhdGljIHZvaWQgeGRsX2ZpbmRfZnVuYyh4ZGZpbGVfdCAqeGYsIGxvbmcgaSwgY2hhciAqYnVmLCBsb25nIHN6LCBsb25nICpsbCkgeworCisJLyoKKwkgKiBCZSBxdWl0ZSBzdHVwaWQgYWJvdXQgdGhpcyBmb3Igbm93LiAgRmluZCBhIGxpbmUgaW4gdGhlIG9sZCBmaWxlCisJICogYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgaHVuayAoYW5kIGNvbnRleHQpIHdoaWNoIHN0YXJ0cyB3aXRoIGEKKwkgKiBwbGF1c2libGUgY2hhcmFjdGVyLgorCSAqLworCisJY29uc3QgY2hhciAqcmVjOworCWxvbmcgbGVuOworCisJKmxsID0gMDsKKwl3aGlsZSAoaS0tID4gMCkgeworCQlsZW4gPSB4ZGxfZ2V0X3JlYyh4ZiwgaSwgJnJlYyk7CisJCWlmIChsZW4gPiAwICYmCisJCSAgICAoaXNhbHBoYSgodW5zaWduZWQgY2hhcikqcmVjKSB8fCAvKiBpZGVudGlmaWVyPyAqLworCQkgICAgICpyZWMgPT0gJ18nIHx8CS8qIGFsc28gaWRlbnRpZmllcj8gKi8KKwkJICAgICAqcmVjID09ICcoJyB8fAkvKiBsaXNwIGRlZnVuPyAqLworCQkgICAgICpyZWMgPT0gJyMnKSkgewkvKiAjZGVmaW5lPyAqLworCQkJaWYgKGxlbiA+IHN6KQorCQkJCWxlbiA9IHN6OworCQkJaWYgKGxlbiAmJiByZWNbbGVuIC0gMV0gPT0gJ1xuJykKKwkJCQlsZW4tLTsKKwkJCW1lbWNweShidWYsIHJlYywgbGVuKTsKKwkJCSpsbCA9IGxlbjsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworCitpbnQgeGRsX2VtaXRfY29tbW9uKHhkZmVudl90ICp4ZSwgeGRjaGFuZ2VfdCAqeHNjciwgeGRlbWl0Y2JfdCAqZWNiLAorCQkgICAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZykgeworCXhkZmlsZV90ICp4ZGYgPSAmeGUtPnhkZjE7CisJY29uc3QgY2hhciAqcmNoZyA9IHhkZi0+cmNoZzsKKwlsb25nIGl4OworCisJZm9yIChpeCA9IDA7IGl4IDwgeGRmLT5ucmVjOyBpeCsrKSB7CisJCWlmIChyY2hnW2l4XSkKKwkJCWNvbnRpbnVlOworCQlpZiAoeGRsX2VtaXRfcmVjb3JkKHhkZiwgaXgsICIiLCBlY2IpKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHhkbF9lbWl0X2RpZmYoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICp4c2NyLCB4ZGVtaXRjYl90ICplY2IsCisJCSAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZykgeworCWxvbmcgczEsIHMyLCBlMSwgZTIsIGxjdHg7CisJeGRjaGFuZ2VfdCAqeGNoLCAqeGNoZTsKKwljaGFyIGZ1bmNidWZbNDBdOworCWxvbmcgZnVuY2xlbiA9IDA7CisKKwlpZiAoeGVjZmctPmZsYWdzICYgWERMX0VNSVRfQ09NTU9OKQorCQlyZXR1cm4geGRsX2VtaXRfY29tbW9uKHhlLCB4c2NyLCBlY2IsIHhlY2ZnKTsKKworCWZvciAoeGNoID0geGNoZSA9IHhzY3I7IHhjaDsgeGNoID0geGNoZS0+bmV4dCkgeworCQl4Y2hlID0geGRsX2dldF9odW5rKHhjaCwgeGVjZmcpOworCisJCXMxID0gWERMX01BWCh4Y2gtPmkxIC0geGVjZmctPmN0eGxlbiwgMCk7CisJCXMyID0gWERMX01BWCh4Y2gtPmkyIC0geGVjZmctPmN0eGxlbiwgMCk7CisKKwkJbGN0eCA9IHhlY2ZnLT5jdHhsZW47CisJCWxjdHggPSBYRExfTUlOKGxjdHgsIHhlLT54ZGYxLm5yZWMgLSAoeGNoZS0+aTEgKyB4Y2hlLT5jaGcxKSk7CisJCWxjdHggPSBYRExfTUlOKGxjdHgsIHhlLT54ZGYyLm5yZWMgLSAoeGNoZS0+aTIgKyB4Y2hlLT5jaGcyKSk7CisKKwkJZTEgPSB4Y2hlLT5pMSArIHhjaGUtPmNoZzEgKyBsY3R4OworCQllMiA9IHhjaGUtPmkyICsgeGNoZS0+Y2hnMiArIGxjdHg7CisKKwkJLyoKKwkJICogRW1pdCBjdXJyZW50IGh1bmsgaGVhZGVyLgorCQkgKi8KKworCQlpZiAoeGVjZmctPmZsYWdzICYgWERMX0VNSVRfRlVOQ05BTUVTKSB7CisJCQl4ZGxfZmluZF9mdW5jKCZ4ZS0+eGRmMSwgczEsIGZ1bmNidWYsCisJCQkJICAgICAgc2l6ZW9mKGZ1bmNidWYpLCAmZnVuY2xlbik7CisJCX0KKwkJaWYgKHhkbF9lbWl0X2h1bmtfaGRyKHMxICsgMSwgZTEgLSBzMSwgczIgKyAxLCBlMiAtIHMyLAorCQkJCSAgICAgIGZ1bmNidWYsIGZ1bmNsZW4sIGVjYikgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCS8qCisJCSAqIEVtaXQgcHJlLWNvbnRleHQuCisJCSAqLworCQlmb3IgKDsgczEgPCB4Y2gtPmkxOyBzMSsrKQorCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjEsIHMxLCAiICIsIGVjYikgPCAwKQorCQkJCXJldHVybiAtMTsKKworCQlmb3IgKHMxID0geGNoLT5pMSwgczIgPSB4Y2gtPmkyOzsgeGNoID0geGNoLT5uZXh0KSB7CisJCQkvKgorCQkJICogTWVyZ2UgcHJldmlvdXMgd2l0aCBjdXJyZW50IGNoYW5nZSBhdG9tLgorCQkJICovCisJCQlmb3IgKDsgczEgPCB4Y2gtPmkxICYmIHMyIDwgeGNoLT5pMjsgczErKywgczIrKykKKwkJCQlpZiAoeGRsX2VtaXRfcmVjb3JkKCZ4ZS0+eGRmMSwgczEsICIgIiwgZWNiKSA8IDApCisJCQkJCXJldHVybiAtMTsKKworCQkJLyoKKwkJCSAqIFJlbW92ZXMgbGluZXMgZnJvbSB0aGUgZmlyc3QgZmlsZS4KKwkJCSAqLworCQkJZm9yIChzMSA9IHhjaC0+aTE7IHMxIDwgeGNoLT5pMSArIHhjaC0+Y2hnMTsgczErKykKKwkJCQlpZiAoeGRsX2VtaXRfcmVjb3JkKCZ4ZS0+eGRmMSwgczEsICItIiwgZWNiKSA8IDApCisJCQkJCXJldHVybiAtMTsKKworCQkJLyoKKwkJCSAqIEFkZHMgbGluZXMgZnJvbSB0aGUgc2Vjb25kIGZpbGUuCisJCQkgKi8KKwkJCWZvciAoczIgPSB4Y2gtPmkyOyBzMiA8IHhjaC0+aTIgKyB4Y2gtPmNoZzI7IHMyKyspCisJCQkJaWYgKHhkbF9lbWl0X3JlY29yZCgmeGUtPnhkZjIsIHMyLCAiKyIsIGVjYikgPCAwKQorCQkJCQlyZXR1cm4gLTE7CisKKwkJCWlmICh4Y2ggPT0geGNoZSkKKwkJCQlicmVhazsKKwkJCXMxID0geGNoLT5pMSArIHhjaC0+Y2hnMTsKKwkJCXMyID0geGNoLT5pMiArIHhjaC0+Y2hnMjsKKwkJfQorCisJCS8qCisJCSAqIEVtaXQgcG9zdC1jb250ZXh0LgorCQkgKi8KKwkJZm9yIChzMSA9IHhjaGUtPmkxICsgeGNoZS0+Y2hnMTsgczEgPCBlMTsgczErKykKKwkJCWlmICh4ZGxfZW1pdF9yZWNvcmQoJnhlLT54ZGYxLCBzMSwgIiAiLCBlY2IpIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3hkaWZmL3hlbWl0LmggYi94ZGlmZi94ZW1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Mjk0MTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94ZW1pdC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWEVNSVRfSCkKKyNkZWZpbmUgWEVNSVRfSAorCisKKworaW50IHhkbF9lbWl0X2RpZmYoeGRmZW52X3QgKnhlLCB4ZGNoYW5nZV90ICp4c2NyLCB4ZGVtaXRjYl90ICplY2IsCisJCSAgeGRlbWl0Y29uZl90IGNvbnN0ICp4ZWNmZyk7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhFTUlUX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3hpbmNsdWRlLmggYi94ZGlmZi94aW5jbHVkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTlkYTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94aW5jbHVkZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWElOQ0xVREVfSCkKKyNkZWZpbmUgWElOQ0xVREVfSAorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAieG1hY3Jvcy5oIgorI2luY2x1ZGUgInhkaWZmLmgiCisjaW5jbHVkZSAieHR5cGVzLmgiCisjaW5jbHVkZSAieHV0aWxzLmgiCisjaW5jbHVkZSAieHByZXBhcmUuaCIKKyNpbmNsdWRlICJ4ZGlmZmkuaCIKKyNpbmNsdWRlICJ4ZW1pdC5oIgorCisKKyNlbmRpZiAvKiAjaWYgIWRlZmluZWQoWElOQ0xVREVfSCkgKi8KKwpkaWZmIC0tZ2l0IGEveGRpZmYveG1hY3Jvcy5oIGIveGRpZmYveG1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMmZkZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94bWFjcm9zLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYTUFDUk9TX0gpCisjZGVmaW5lIFhNQUNST1NfSAorCisKKyNkZWZpbmUgR1JfUFJJTUUgMHg5ZTM3MDAwMVVMCisKKworI2RlZmluZSBYRExfTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSk6IChiKSkKKyNkZWZpbmUgWERMX01BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpOiAoYikpCisjZGVmaW5lIFhETF9BQlModikgKCh2KSA+PSAwID8gKHYpOiAtKHYpKQorI2RlZmluZSBYRExfSVNESUdJVChjKSAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQorI2RlZmluZSBYRExfSEFTSExPTkcodiwgYikgKCgodW5zaWduZWQgbG9uZykodikgKiBHUl9QUklNRSkgPj4gKChDSEFSX0JJVCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkgLSAoYikpKQorI2RlZmluZSBYRExfUFRSRlJFRShwKSBkbyB7IGlmIChwKSB7IHhkbF9mcmVlKHApOyAocCkgPSBOVUxMOyB9IH0gd2hpbGUgKDApCisjZGVmaW5lIFhETF9MRTMyX1BVVChwLCB2KSBcCitkbyB7IFwKKwl1bnNpZ25lZCBjaGFyICpfX3AgPSAodW5zaWduZWQgY2hhciAqKSAocCk7IFwKKwkqX19wKysgPSAodW5zaWduZWQgY2hhcikgKHYpOyBcCisJKl9fcCsrID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gOCk7IFwKKwkqX19wKysgPSAodW5zaWduZWQgY2hhcikgKCh2KSA+PiAxNik7IFwKKwkqX19wID0gKHVuc2lnbmVkIGNoYXIpICgodikgPj4gMjQpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBYRExfTEUzMl9HRVQocCwgdikgXAorZG8geyBcCisJdW5zaWduZWQgY2hhciBjb25zdCAqX19wID0gKHVuc2lnbmVkIGNoYXIgY29uc3QgKikgKHApOyBcCisJKHYpID0gKHVuc2lnbmVkIGxvbmcpIF9fcFswXSB8ICgodW5zaWduZWQgbG9uZykgX19wWzFdKSA8PCA4IHwgXAorCQkoKHVuc2lnbmVkIGxvbmcpIF9fcFsyXSkgPDwgMTYgfCAoKHVuc2lnbmVkIGxvbmcpIF9fcFszXSkgPDwgMjQ7IFwKK30gd2hpbGUgKDApCisKKworI2VuZGlmIC8qICNpZiAhZGVmaW5lZChYTUFDUk9TX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3hwcmVwYXJlLmMgYi94ZGlmZi94cHJlcGFyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTdiMzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94cHJlcGFyZS5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogIExpYlhEaWZmIGJ5IERhdmlkZSBMaWJlbnppICggRmlsZSBEaWZmZXJlbnRpYWwgTGlicmFyeSApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2luY2x1ZGUgInhpbmNsdWRlLmgiCisKKworCisjZGVmaW5lIFhETF9LUERJU19SVU4gNAorI2RlZmluZSBYRExfTUFYX0VRTElNSVQgMTAyNAorCisKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGxjbGFzcyB7CisJc3RydWN0IHNfeGRsY2xhc3MgKm5leHQ7CisJdW5zaWduZWQgbG9uZyBoYTsKKwljaGFyIGNvbnN0ICpsaW5lOworCWxvbmcgc2l6ZTsKKwlsb25nIGlkeDsKK30geGRsY2xhc3NfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc194ZGxjbGFzc2lmaWVyIHsKKwl1bnNpZ25lZCBpbnQgaGJpdHM7CisJbG9uZyBoc2l6ZTsKKwl4ZGxjbGFzc190ICoqcmNoYXNoOworCWNoYXN0b3JlX3QgbmNoYTsKKwlsb25nIGNvdW50OworCWxvbmcgZmxhZ3M7Cit9IHhkbGNsYXNzaWZpZXJfdDsKKworCisKKworc3RhdGljIGludCB4ZGxfaW5pdF9jbGFzc2lmaWVyKHhkbGNsYXNzaWZpZXJfdCAqY2YsIGxvbmcgc2l6ZSwgbG9uZyBmbGFncyk7CitzdGF0aWMgdm9pZCB4ZGxfZnJlZV9jbGFzc2lmaWVyKHhkbGNsYXNzaWZpZXJfdCAqY2YpOworc3RhdGljIGludCB4ZGxfY2xhc3NpZnlfcmVjb3JkKHhkbGNsYXNzaWZpZXJfdCAqY2YsIHhyZWNvcmRfdCAqKnJoYXNoLCB1bnNpZ25lZCBpbnQgaGJpdHMsCisJCQkgICAgICAgeHJlY29yZF90ICpyZWMpOworc3RhdGljIGludCB4ZGxfcHJlcGFyZV9jdHgobW1maWxlX3QgKm1mLCBsb25nIG5hcmVjLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkJCSAgIHhkbGNsYXNzaWZpZXJfdCAqY2YsIHhkZmlsZV90ICp4ZGYpOworc3RhdGljIHZvaWQgeGRsX2ZyZWVfY3R4KHhkZmlsZV90ICp4ZGYpOworc3RhdGljIGludCB4ZGxfY2xlYW5fbW1hdGNoKGNoYXIgY29uc3QgKmRpcywgbG9uZyBpLCBsb25nIHMsIGxvbmcgZSk7CitzdGF0aWMgaW50IHhkbF9jbGVhbnVwX3JlY29yZHMoeGRmaWxlX3QgKnhkZjEsIHhkZmlsZV90ICp4ZGYyKTsKK3N0YXRpYyBpbnQgeGRsX3RyaW1fZW5kcyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpOworc3RhdGljIGludCB4ZGxfb3B0aW1pemVfY3R4cyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpOworCisKKworCitzdGF0aWMgaW50IHhkbF9pbml0X2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZiwgbG9uZyBzaXplLCBsb25nIGZsYWdzKSB7CisJbG9uZyBpOworCisJY2YtPmZsYWdzID0gZmxhZ3M7CisKKwljZi0+aGJpdHMgPSB4ZGxfaGFzaGJpdHMoKHVuc2lnbmVkIGludCkgc2l6ZSk7CisJY2YtPmhzaXplID0gMSA8PCBjZi0+aGJpdHM7CisKKwlpZiAoeGRsX2NoYV9pbml0KCZjZi0+bmNoYSwgc2l6ZW9mKHhkbGNsYXNzX3QpLCBzaXplIC8gNCArIDEpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisJaWYgKCEoY2YtPnJjaGFzaCA9ICh4ZGxjbGFzc190ICoqKSB4ZGxfbWFsbG9jKGNmLT5oc2l6ZSAqIHNpemVvZih4ZGxjbGFzc190ICopKSkpIHsKKworCQl4ZGxfY2hhX2ZyZWUoJmNmLT5uY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgY2YtPmhzaXplOyBpKyspCisJCWNmLT5yY2hhc2hbaV0gPSBOVUxMOworCisJY2YtPmNvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2NsYXNzaWZpZXIoeGRsY2xhc3NpZmllcl90ICpjZikgeworCisJeGRsX2ZyZWUoY2YtPnJjaGFzaCk7CisJeGRsX2NoYV9mcmVlKCZjZi0+bmNoYSk7Cit9CisKKworc3RhdGljIGludCB4ZGxfY2xhc3NpZnlfcmVjb3JkKHhkbGNsYXNzaWZpZXJfdCAqY2YsIHhyZWNvcmRfdCAqKnJoYXNoLCB1bnNpZ25lZCBpbnQgaGJpdHMsCisJCQkgICAgICAgeHJlY29yZF90ICpyZWMpIHsKKwlsb25nIGhpOworCWNoYXIgY29uc3QgKmxpbmU7CisJeGRsY2xhc3NfdCAqcmNyZWM7CisKKwlsaW5lID0gcmVjLT5wdHI7CisJaGkgPSAobG9uZykgWERMX0hBU0hMT05HKHJlYy0+aGEsIGNmLT5oYml0cyk7CisJZm9yIChyY3JlYyA9IGNmLT5yY2hhc2hbaGldOyByY3JlYzsgcmNyZWMgPSByY3JlYy0+bmV4dCkKKwkJaWYgKHJjcmVjLT5oYSA9PSByZWMtPmhhICYmCisJCQkJeGRsX3JlY21hdGNoKHJjcmVjLT5saW5lLCByY3JlYy0+c2l6ZSwKKwkJCQkJcmVjLT5wdHIsIHJlYy0+c2l6ZSwgY2YtPmZsYWdzKSkKKwkJCWJyZWFrOworCisJaWYgKCFyY3JlYykgeworCQlpZiAoIShyY3JlYyA9IHhkbF9jaGFfYWxsb2MoJmNmLT5uY2hhKSkpIHsKKworCQkJcmV0dXJuIC0xOworCQl9CisJCXJjcmVjLT5pZHggPSBjZi0+Y291bnQrKzsKKwkJcmNyZWMtPmxpbmUgPSBsaW5lOworCQlyY3JlYy0+c2l6ZSA9IHJlYy0+c2l6ZTsKKwkJcmNyZWMtPmhhID0gcmVjLT5oYTsKKwkJcmNyZWMtPm5leHQgPSBjZi0+cmNoYXNoW2hpXTsKKwkJY2YtPnJjaGFzaFtoaV0gPSByY3JlYzsKKwl9CisKKwlyZWMtPmhhID0gKHVuc2lnbmVkIGxvbmcpIHJjcmVjLT5pZHg7CisKKwloaSA9IChsb25nKSBYRExfSEFTSExPTkcocmVjLT5oYSwgaGJpdHMpOworCXJlYy0+bmV4dCA9IHJoYXNoW2hpXTsKKwlyaGFzaFtoaV0gPSByZWM7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhkbF9wcmVwYXJlX2N0eChtbWZpbGVfdCAqbWYsIGxvbmcgbmFyZWMsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkJICAgeGRsY2xhc3NpZmllcl90ICpjZiwgeGRmaWxlX3QgKnhkZikgeworCXVuc2lnbmVkIGludCBoYml0czsKKwlsb25nIGksIG5yZWMsIGhzaXplLCBic2l6ZTsKKwl1bnNpZ25lZCBsb25nIGhhdjsKKwljaGFyIGNvbnN0ICpibGssICpjdXIsICp0b3AsICpwcmV2OworCXhyZWNvcmRfdCAqY3JlYzsKKwl4cmVjb3JkX3QgKipyZWNzLCAqKnJyZWNzOworCXhyZWNvcmRfdCAqKnJoYXNoOworCXVuc2lnbmVkIGxvbmcgKmhhOworCWNoYXIgKnJjaGc7CisJbG9uZyAqcmluZGV4OworCisJaWYgKHhkbF9jaGFfaW5pdCgmeGRmLT5yY2hhLCBzaXplb2YoeHJlY29yZF90KSwgbmFyZWMgLyA0ICsgMSkgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShyZWNzID0gKHhyZWNvcmRfdCAqKikgeGRsX21hbGxvYyhuYXJlYyAqIHNpemVvZih4cmVjb3JkX3QgKikpKSkgeworCisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhiaXRzID0geGRsX2hhc2hiaXRzKCh1bnNpZ25lZCBpbnQpIG5hcmVjKTsKKwloc2l6ZSA9IDEgPDwgaGJpdHM7CisJaWYgKCEocmhhc2ggPSAoeHJlY29yZF90ICoqKSB4ZGxfbWFsbG9jKGhzaXplICogc2l6ZW9mKHhyZWNvcmRfdCAqKSkpKSB7CisKKwkJeGRsX2ZyZWUocmVjcyk7CisJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgaHNpemU7IGkrKykKKwkJcmhhc2hbaV0gPSBOVUxMOworCisJbnJlYyA9IDA7CisJaWYgKChjdXIgPSBibGsgPSB4ZGxfbW1maWxlX2ZpcnN0KG1mLCAmYnNpemUpKSAhPSBOVUxMKSB7CisJCWZvciAodG9wID0gYmxrICsgYnNpemU7OykgeworCQkJaWYgKGN1ciA+PSB0b3ApIHsKKwkJCQlpZiAoIShjdXIgPSBibGsgPSB4ZGxfbW1maWxlX25leHQobWYsICZic2l6ZSkpKQorCQkJCQlicmVhazsKKwkJCQl0b3AgPSBibGsgKyBic2l6ZTsKKwkJCX0KKwkJCXByZXYgPSBjdXI7CisJCQloYXYgPSB4ZGxfaGFzaF9yZWNvcmQoJmN1ciwgdG9wLCB4cHAtPmZsYWdzKTsKKwkJCWlmIChucmVjID49IG5hcmVjKSB7CisJCQkJbmFyZWMgKj0gMjsKKwkJCQlpZiAoIShycmVjcyA9ICh4cmVjb3JkX3QgKiopIHhkbF9yZWFsbG9jKHJlY3MsIG5hcmVjICogc2l6ZW9mKHhyZWNvcmRfdCAqKSkpKSB7CisKKwkJCQkJeGRsX2ZyZWUocmhhc2gpOworCQkJCQl4ZGxfZnJlZShyZWNzKTsKKwkJCQkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCXJlY3MgPSBycmVjczsKKwkJCX0KKwkJCWlmICghKGNyZWMgPSB4ZGxfY2hhX2FsbG9jKCZ4ZGYtPnJjaGEpKSkgeworCisJCQkJeGRsX2ZyZWUocmhhc2gpOworCQkJCXhkbF9mcmVlKHJlY3MpOworCQkJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQljcmVjLT5wdHIgPSBwcmV2OworCQkJY3JlYy0+c2l6ZSA9IChsb25nKSAoY3VyIC0gcHJldik7CisJCQljcmVjLT5oYSA9IGhhdjsKKwkJCXJlY3NbbnJlYysrXSA9IGNyZWM7CisKKwkJCWlmICh4ZGxfY2xhc3NpZnlfcmVjb3JkKGNmLCByaGFzaCwgaGJpdHMsIGNyZWMpIDwgMCkgeworCisJCQkJeGRsX2ZyZWUocmhhc2gpOworCQkJCXhkbF9mcmVlKHJlY3MpOworCQkJCXhkbF9jaGFfZnJlZSgmeGRmLT5yY2hhKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShyY2hnID0gKGNoYXIgKikgeGRsX21hbGxvYygobnJlYyArIDIpICogc2l6ZW9mKGNoYXIpKSkpIHsKKworCQl4ZGxfZnJlZShyaGFzaCk7CisJCXhkbF9mcmVlKHJlY3MpOworCQl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KHJjaGcsIDAsIChucmVjICsgMikgKiBzaXplb2YoY2hhcikpOworCisJaWYgKCEocmluZGV4ID0gKGxvbmcgKikgeGRsX21hbGxvYygobnJlYyArIDEpICogc2l6ZW9mKGxvbmcpKSkpIHsKKworCQl4ZGxfZnJlZShyY2hnKTsKKwkJeGRsX2ZyZWUocmhhc2gpOworCQl4ZGxfZnJlZShyZWNzKTsKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghKGhhID0gKHVuc2lnbmVkIGxvbmcgKikgeGRsX21hbGxvYygobnJlYyArIDEpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpIHsKKworCQl4ZGxfZnJlZShyaW5kZXgpOworCQl4ZGxfZnJlZShyY2hnKTsKKwkJeGRsX2ZyZWUocmhhc2gpOworCQl4ZGxfZnJlZShyZWNzKTsKKwkJeGRsX2NoYV9mcmVlKCZ4ZGYtPnJjaGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJeGRmLT5ucmVjID0gbnJlYzsKKwl4ZGYtPnJlY3MgPSByZWNzOworCXhkZi0+aGJpdHMgPSBoYml0czsKKwl4ZGYtPnJoYXNoID0gcmhhc2g7CisJeGRmLT5yY2hnID0gcmNoZyArIDE7CisJeGRmLT5yaW5kZXggPSByaW5kZXg7CisJeGRmLT5ucmVmZiA9IDA7CisJeGRmLT5oYSA9IGhhOworCXhkZi0+ZHN0YXJ0ID0gMDsKKwl4ZGYtPmRlbmQgPSBucmVjIC0gMTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHhkbF9mcmVlX2N0eCh4ZGZpbGVfdCAqeGRmKSB7CisKKwl4ZGxfZnJlZSh4ZGYtPnJoYXNoKTsKKwl4ZGxfZnJlZSh4ZGYtPnJpbmRleCk7CisJeGRsX2ZyZWUoeGRmLT5yY2hnIC0gMSk7CisJeGRsX2ZyZWUoeGRmLT5oYSk7CisJeGRsX2ZyZWUoeGRmLT5yZWNzKTsKKwl4ZGxfY2hhX2ZyZWUoJnhkZi0+cmNoYSk7Cit9CisKKworaW50IHhkbF9wcmVwYXJlX2VudihtbWZpbGVfdCAqbWYxLCBtbWZpbGVfdCAqbWYyLCB4cHBhcmFtX3QgY29uc3QgKnhwcCwKKwkJICAgIHhkZmVudl90ICp4ZSkgeworCWxvbmcgZW5sMSwgZW5sMjsKKwl4ZGxjbGFzc2lmaWVyX3QgY2Y7CisKKwllbmwxID0geGRsX2d1ZXNzX2xpbmVzKG1mMSkgKyAxOworCWVubDIgPSB4ZGxfZ3Vlc3NfbGluZXMobWYyKSArIDE7CisKKwlpZiAoeGRsX2luaXRfY2xhc3NpZmllcigmY2YsIGVubDEgKyBlbmwyICsgMSwgeHBwLT5mbGFncykgPCAwKSB7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh4ZGxfcHJlcGFyZV9jdHgobWYxLCBlbmwxLCB4cHAsICZjZiwgJnhlLT54ZGYxKSA8IDApIHsKKworCQl4ZGxfZnJlZV9jbGFzc2lmaWVyKCZjZik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKHhkbF9wcmVwYXJlX2N0eChtZjIsIGVubDIsIHhwcCwgJmNmLCAmeGUtPnhkZjIpIDwgMCkgeworCisJCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjEpOworCQl4ZGxfZnJlZV9jbGFzc2lmaWVyKCZjZik7CisJCXJldHVybiAtMTsKKwl9CisKKwl4ZGxfZnJlZV9jbGFzc2lmaWVyKCZjZik7CisKKwlpZiAoeGRsX29wdGltaXplX2N0eHMoJnhlLT54ZGYxLCAmeGUtPnhkZjIpIDwgMCkgeworCisJCXhkbF9mcmVlX2N0eCgmeGUtPnhkZjIpOworCQl4ZGxfZnJlZV9jdHgoJnhlLT54ZGYxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgeGRsX2ZyZWVfZW52KHhkZmVudl90ICp4ZSkgeworCisJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMik7CisJeGRsX2ZyZWVfY3R4KCZ4ZS0+eGRmMSk7Cit9CisKKworc3RhdGljIGludCB4ZGxfY2xlYW5fbW1hdGNoKGNoYXIgY29uc3QgKmRpcywgbG9uZyBpLCBsb25nIHMsIGxvbmcgZSkgeworCWxvbmcgciwgcmRpczAsIHJwZGlzMCwgcmRpczEsIHJwZGlzMTsKKworCS8qCisJICogU2NhbnMgdGhlIGxpbmVzIGJlZm9yZSAnaScgdG8gZmluZCBhIHJ1biBvZiBsaW5lcyB0aGF0IGVpdGhlcgorCSAqIGhhdmUgbm8gbWF0Y2ggKGRpc1tqXSA9PSAwKSBvciBoYXZlIG11bHRpcGxlIG1hdGNoZXMgKGRpc1tqXSA+IDEpLgorCSAqIE5vdGUgdGhhdCB3ZSBhbHdheXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZGlzW2ldID4gMSwgc28gdGhlCisJICogY3VycmVudCBsaW5lIChpKSBpcyBhbHJlYWR5IGEgbXVsdGltYXRjaCBsaW5lLgorCSAqLworCWZvciAociA9IDEsIHJkaXMwID0gMCwgcnBkaXMwID0gMTsgKGkgLSByKSA+PSBzOyByKyspIHsKKwkJaWYgKCFkaXNbaSAtIHJdKQorCQkJcmRpczArKzsKKwkJZWxzZSBpZiAoZGlzW2kgLSByXSA9PSAyKQorCQkJcnBkaXMwKys7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwkvKgorCSAqIElmIHRoZSBydW4gYmVmb3JlIHRoZSBsaW5lICdpJyBmb3VuZCBvbmx5IG11bHRpbWF0Y2ggbGluZXMsIHdlCisJICogcmV0dXJuIDAgYW5kIGhlbmNlIHdlIGRvbid0IG1ha2UgdGhlIGN1cnJlbnQgbGluZSAoaSkgZGlzY2FyZGVkLgorCSAqIFdlIHdhbnQgdG8gZGlzY2FyZCBtdWx0aW1hdGNoIGxpbmVzIG9ubHkgd2hlbiB0aGV5IGFwcGVhciBpbiB0aGUKKwkgKiBtaWRkbGUgb2YgcnVucyB3aXRoIG5vbWF0Y2ggbGluZXMgKGRpc1tqXSA9PSAwKS4KKwkgKi8KKwlpZiAocmRpczAgPT0gMCkKKwkJcmV0dXJuIDA7CisJZm9yIChyID0gMSwgcmRpczEgPSAwLCBycGRpczEgPSAxOyAoaSArIHIpIDw9IGU7IHIrKykgeworCQlpZiAoIWRpc1tpICsgcl0pCisJCQlyZGlzMSsrOworCQllbHNlIGlmIChkaXNbaSArIHJdID09IDIpCisJCQlycGRpczErKzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCS8qCisJICogSWYgdGhlIHJ1biBhZnRlciB0aGUgbGluZSAnaScgZm91bmQgb25seSBtdWx0aW1hdGNoIGxpbmVzLCB3ZQorCSAqIHJldHVybiAwIGFuZCBoZW5jZSB3ZSBkb24ndCBtYWtlIHRoZSBjdXJyZW50IGxpbmUgKGkpIGRpc2NhcmRlZC4KKwkgKi8KKwlpZiAocmRpczEgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmRpczEgKz0gcmRpczA7CisJcnBkaXMxICs9IHJwZGlzMDsKKworCXJldHVybiBycGRpczEgKiBYRExfS1BESVNfUlVOIDwgKHJwZGlzMSArIHJkaXMxKTsKK30KKworCisvKgorICogVHJ5IHRvIHJlZHVjZSB0aGUgcHJvYmxlbSBjb21wbGV4aXR5LCBkaXNjYXJkIHJlY29yZHMgdGhhdCBoYXZlIG5vCisgKiBtYXRjaGVzIG9uIHRoZSBvdGhlciBmaWxlLiBBbHNvLCBsaW5lcyB0aGF0IGhhdmUgbXVsdGlwbGUgbWF0Y2hlcworICogbWlnaHQgYmUgcG90ZW50aWFsbHkgZGlzY2FyZGVkIGlmIHRoZXkgaGFwcGVhciBpbiBhIHJ1biBvZiBkaXNjYXJkYWJsZS4KKyAqLworc3RhdGljIGludCB4ZGxfY2xlYW51cF9yZWNvcmRzKHhkZmlsZV90ICp4ZGYxLCB4ZGZpbGVfdCAqeGRmMikgeworCWxvbmcgaSwgbm0sIHJoaSwgbnJlZmYsIG1saW07CisJdW5zaWduZWQgbG9uZyBoYXY7CisJeHJlY29yZF90ICoqcmVjczsKKwl4cmVjb3JkX3QgKnJlYzsKKwljaGFyICpkaXMsICpkaXMxLCAqZGlzMjsKKworCWlmICghKGRpcyA9IChjaGFyICopIHhkbF9tYWxsb2MoeGRmMS0+bnJlYyArIHhkZjItPm5yZWMgKyAyKSkpIHsKKworCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChkaXMsIDAsIHhkZjEtPm5yZWMgKyB4ZGYyLT5ucmVjICsgMik7CisJZGlzMSA9IGRpczsKKwlkaXMyID0gZGlzMSArIHhkZjEtPm5yZWMgKyAxOworCisJaWYgKChtbGltID0geGRsX2JvZ29zcXJ0KHhkZjEtPm5yZWMpKSA+IFhETF9NQVhfRVFMSU1JVCkKKwkJbWxpbSA9IFhETF9NQVhfRVFMSU1JVDsKKwlmb3IgKGkgPSB4ZGYxLT5kc3RhcnQsIHJlY3MgPSAmeGRmMS0+cmVjc1t4ZGYxLT5kc3RhcnRdOyBpIDw9IHhkZjEtPmRlbmQ7IGkrKywgcmVjcysrKSB7CisJCWhhdiA9ICgqcmVjcyktPmhhOworCQlyaGkgPSAobG9uZykgWERMX0hBU0hMT05HKGhhdiwgeGRmMi0+aGJpdHMpOworCQlmb3IgKG5tID0gMCwgcmVjID0geGRmMi0+cmhhc2hbcmhpXTsgcmVjOyByZWMgPSByZWMtPm5leHQpCisJCQlpZiAocmVjLT5oYSA9PSBoYXYgJiYgKytubSA9PSBtbGltKQorCQkJCWJyZWFrOworCQlkaXMxW2ldID0gKG5tID09IDApID8gMDogKG5tID49IG1saW0pID8gMjogMTsKKwl9CisKKwlpZiAoKG1saW0gPSB4ZGxfYm9nb3NxcnQoeGRmMi0+bnJlYykpID4gWERMX01BWF9FUUxJTUlUKQorCQltbGltID0gWERMX01BWF9FUUxJTUlUOworCWZvciAoaSA9IHhkZjItPmRzdGFydCwgcmVjcyA9ICZ4ZGYyLT5yZWNzW3hkZjItPmRzdGFydF07IGkgPD0geGRmMi0+ZGVuZDsgaSsrLCByZWNzKyspIHsKKwkJaGF2ID0gKCpyZWNzKS0+aGE7CisJCXJoaSA9IChsb25nKSBYRExfSEFTSExPTkcoaGF2LCB4ZGYxLT5oYml0cyk7CisJCWZvciAobm0gPSAwLCByZWMgPSB4ZGYxLT5yaGFzaFtyaGldOyByZWM7IHJlYyA9IHJlYy0+bmV4dCkKKwkJCWlmIChyZWMtPmhhID09IGhhdiAmJiArK25tID09IG1saW0pCisJCQkJYnJlYWs7CisJCWRpczJbaV0gPSAobm0gPT0gMCkgPyAwOiAobm0gPj0gbWxpbSkgPyAyOiAxOworCX0KKworCWZvciAobnJlZmYgPSAwLCBpID0geGRmMS0+ZHN0YXJ0LCByZWNzID0gJnhkZjEtPnJlY3NbeGRmMS0+ZHN0YXJ0XTsKKwkgICAgIGkgPD0geGRmMS0+ZGVuZDsgaSsrLCByZWNzKyspIHsKKwkJaWYgKGRpczFbaV0gPT0gMSB8fAorCQkgICAgKGRpczFbaV0gPT0gMiAmJiAheGRsX2NsZWFuX21tYXRjaChkaXMxLCBpLCB4ZGYxLT5kc3RhcnQsIHhkZjEtPmRlbmQpKSkgeworCQkJeGRmMS0+cmluZGV4W25yZWZmXSA9IGk7CisJCQl4ZGYxLT5oYVtucmVmZl0gPSAoKnJlY3MpLT5oYTsKKwkJCW5yZWZmKys7CisJCX0gZWxzZQorCQkJeGRmMS0+cmNoZ1tpXSA9IDE7CisJfQorCXhkZjEtPm5yZWZmID0gbnJlZmY7CisKKwlmb3IgKG5yZWZmID0gMCwgaSA9IHhkZjItPmRzdGFydCwgcmVjcyA9ICZ4ZGYyLT5yZWNzW3hkZjItPmRzdGFydF07CisJICAgICBpIDw9IHhkZjItPmRlbmQ7IGkrKywgcmVjcysrKSB7CisJCWlmIChkaXMyW2ldID09IDEgfHwKKwkJICAgIChkaXMyW2ldID09IDIgJiYgIXhkbF9jbGVhbl9tbWF0Y2goZGlzMiwgaSwgeGRmMi0+ZHN0YXJ0LCB4ZGYyLT5kZW5kKSkpIHsKKwkJCXhkZjItPnJpbmRleFtucmVmZl0gPSBpOworCQkJeGRmMi0+aGFbbnJlZmZdID0gKCpyZWNzKS0+aGE7CisJCQlucmVmZisrOworCQl9IGVsc2UKKwkJCXhkZjItPnJjaGdbaV0gPSAxOworCX0KKwl4ZGYyLT5ucmVmZiA9IG5yZWZmOworCisJeGRsX2ZyZWUoZGlzKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBFYXJseSB0cmltIGluaXRpYWwgYW5kIHRlcm1pbmFsIG1hdGNoaW5nIHJlY29yZHMuCisgKi8KK3N0YXRpYyBpbnQgeGRsX3RyaW1fZW5kcyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpIHsKKwlsb25nIGksIGxpbTsKKwl4cmVjb3JkX3QgKipyZWNzMSwgKipyZWNzMjsKKworCXJlY3MxID0geGRmMS0+cmVjczsKKwlyZWNzMiA9IHhkZjItPnJlY3M7CisJZm9yIChpID0gMCwgbGltID0gWERMX01JTih4ZGYxLT5ucmVjLCB4ZGYyLT5ucmVjKTsgaSA8IGxpbTsKKwkgICAgIGkrKywgcmVjczErKywgcmVjczIrKykKKwkJaWYgKCgqcmVjczEpLT5oYSAhPSAoKnJlY3MyKS0+aGEpCisJCQlicmVhazsKKworCXhkZjEtPmRzdGFydCA9IHhkZjItPmRzdGFydCA9IGk7CisKKwlyZWNzMSA9IHhkZjEtPnJlY3MgKyB4ZGYxLT5ucmVjIC0gMTsKKwlyZWNzMiA9IHhkZjItPnJlY3MgKyB4ZGYyLT5ucmVjIC0gMTsKKwlmb3IgKGxpbSAtPSBpLCBpID0gMDsgaSA8IGxpbTsgaSsrLCByZWNzMS0tLCByZWNzMi0tKQorCQlpZiAoKCpyZWNzMSktPmhhICE9ICgqcmVjczIpLT5oYSkKKwkJCWJyZWFrOworCisJeGRmMS0+ZGVuZCA9IHhkZjEtPm5yZWMgLSBpIC0gMTsKKwl4ZGYyLT5kZW5kID0geGRmMi0+bnJlYyAtIGkgLSAxOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB4ZGxfb3B0aW1pemVfY3R4cyh4ZGZpbGVfdCAqeGRmMSwgeGRmaWxlX3QgKnhkZjIpIHsKKworCWlmICh4ZGxfdHJpbV9lbmRzKHhkZjEsIHhkZjIpIDwgMCB8fAorCSAgICB4ZGxfY2xlYW51cF9yZWNvcmRzKHhkZjEsIHhkZjIpIDwgMCkgeworCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEveGRpZmYveHByZXBhcmUuaCBiL3hkaWZmL3hwcmVwYXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0YzU2OQotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3hwcmVwYXJlLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMyAgRGF2aWRlIExpYmVuemkKKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZiAhZGVmaW5lZChYUFJFUEFSRV9IKQorI2RlZmluZSBYUFJFUEFSRV9ICisKKworCitpbnQgeGRsX3ByZXBhcmVfZW52KG1tZmlsZV90ICptZjEsIG1tZmlsZV90ICptZjIsIHhwcGFyYW1fdCBjb25zdCAqeHBwLAorCQkgICAgeGRmZW52X3QgKnhlKTsKK3ZvaWQgeGRsX2ZyZWVfZW52KHhkZmVudl90ICp4ZSk7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhQUkVQQVJFX0gpICovCisKZGlmZiAtLWdpdCBhL3hkaWZmL3h0eXBlcy5oIGIveGRpZmYveHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5M2E2NgotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3h0eXBlcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWFRZUEVTX0gpCisjZGVmaW5lIFhUWVBFU19ICisKKworCit0eXBlZGVmIHN0cnVjdCBzX2NoYW5vZGUgeworCXN0cnVjdCBzX2NoYW5vZGUgKm5leHQ7CisJbG9uZyBpY3VycjsKK30gY2hhbm9kZV90OworCit0eXBlZGVmIHN0cnVjdCBzX2NoYXN0b3JlIHsKKwljaGFub2RlX3QgKmhlYWQsICp0YWlsOworCWxvbmcgaXNpemUsIG5zaXplOworCWNoYW5vZGVfdCAqYW5jdXI7CisJY2hhbm9kZV90ICpzbmN1cjsKKwlsb25nIHNjdXJyOworfSBjaGFzdG9yZV90OworCit0eXBlZGVmIHN0cnVjdCBzX3hyZWNvcmQgeworCXN0cnVjdCBzX3hyZWNvcmQgKm5leHQ7CisJY2hhciBjb25zdCAqcHRyOworCWxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGhhOworfSB4cmVjb3JkX3Q7CisKK3R5cGVkZWYgc3RydWN0IHNfeGRmaWxlIHsKKwljaGFzdG9yZV90IHJjaGE7CisJbG9uZyBucmVjOworCXVuc2lnbmVkIGludCBoYml0czsKKwl4cmVjb3JkX3QgKipyaGFzaDsKKwlsb25nIGRzdGFydCwgZGVuZDsKKwl4cmVjb3JkX3QgKipyZWNzOworCWNoYXIgKnJjaGc7CisJbG9uZyAqcmluZGV4OworCWxvbmcgbnJlZmY7CisJdW5zaWduZWQgbG9uZyAqaGE7Cit9IHhkZmlsZV90OworCit0eXBlZGVmIHN0cnVjdCBzX3hkZmVudiB7CisJeGRmaWxlX3QgeGRmMSwgeGRmMjsKK30geGRmZW52X3Q7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhUWVBFU19IKSAqLworCmRpZmYgLS1naXQgYS94ZGlmZi94dXRpbHMuYyBiL3hkaWZmL3h1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YmRkMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ZGlmZi94dXRpbHMuYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqICBMaWJYRGlmZiBieSBEYXZpZGUgTGliZW56aSAoIEZpbGUgRGlmZmVyZW50aWFsIExpYnJhcnkgKQorICogIENvcHlyaWdodCAoQykgMjAwMwlEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKi8KKworI2luY2x1ZGUgInhpbmNsdWRlLmgiCisKKworCisjZGVmaW5lIFhETF9HVUVTU19OTElORVMgMjU2CisKKworCisKK2xvbmcgeGRsX2JvZ29zcXJ0KGxvbmcgbikgeworCWxvbmcgaTsKKworCS8qCisJICogQ2xhc3NpY2FsIGludGVnZXIgc3F1YXJlIHJvb3QgYXBwcm94aW1hdGlvbiB1c2luZyBzaGlmdHMuCisJICovCisJZm9yIChpID0gMTsgbiA+IDA7IG4gPj49IDIpCisJCWkgPDw9IDE7CisKKwlyZXR1cm4gaTsKK30KKworCitpbnQgeGRsX2VtaXRfZGlmZnJlYyhjaGFyIGNvbnN0ICpyZWMsIGxvbmcgc2l6ZSwgY2hhciBjb25zdCAqcHJlLCBsb25nIHBzaXplLAorCQkgICAgIHhkZW1pdGNiX3QgKmVjYikgeworCWludCBpID0gMjsKKwltbWJ1ZmZlcl90IG1iWzNdOworCisJbWJbMF0ucHRyID0gKGNoYXIgKikgcHJlOworCW1iWzBdLnNpemUgPSBwc2l6ZTsKKwltYlsxXS5wdHIgPSAoY2hhciAqKSByZWM7CisJbWJbMV0uc2l6ZSA9IHNpemU7CisJaWYgKHNpemUgPiAwICYmIHJlY1tzaXplIC0gMV0gIT0gJ1xuJykgeworCQltYlsyXS5wdHIgPSAoY2hhciAqKSAiXG5cXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlXG4iOworCQltYlsyXS5zaXplID0gc3RybGVuKG1iWzJdLnB0cik7CisJCWkrKzsKKwl9CisJaWYgKGVjYi0+b3V0ZihlY2ItPnByaXYsIG1iLCBpKSA8IDApIHsKKworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKnhkbF9tbWZpbGVfZmlyc3QobW1maWxlX3QgKm1tZiwgbG9uZyAqc2l6ZSkKK3sKKwkqc2l6ZSA9IG1tZi0+c2l6ZTsKKwlyZXR1cm4gbW1mLT5wdHI7Cit9CisKKwordm9pZCAqeGRsX21tZmlsZV9uZXh0KG1tZmlsZV90ICptbWYsIGxvbmcgKnNpemUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKworbG9uZyB4ZGxfbW1maWxlX3NpemUobW1maWxlX3QgKm1tZikKK3sKKwlyZXR1cm4gbW1mLT5zaXplOworfQorCisKK2ludCB4ZGxfY2hhX2luaXQoY2hhc3RvcmVfdCAqY2hhLCBsb25nIGlzaXplLCBsb25nIGljb3VudCkgeworCisJY2hhLT5oZWFkID0gY2hhLT50YWlsID0gTlVMTDsKKwljaGEtPmlzaXplID0gaXNpemU7CisJY2hhLT5uc2l6ZSA9IGljb3VudCAqIGlzaXplOworCWNoYS0+YW5jdXIgPSBjaGEtPnNuY3VyID0gTlVMTDsKKwljaGEtPnNjdXJyID0gMDsKKworCXJldHVybiAwOworfQorCisKK3ZvaWQgeGRsX2NoYV9mcmVlKGNoYXN0b3JlX3QgKmNoYSkgeworCWNoYW5vZGVfdCAqY3VyLCAqdG1wOworCisJZm9yIChjdXIgPSBjaGEtPmhlYWQ7ICh0bXAgPSBjdXIpICE9IE5VTEw7KSB7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwkJeGRsX2ZyZWUodG1wKTsKKwl9Cit9CisKKwordm9pZCAqeGRsX2NoYV9hbGxvYyhjaGFzdG9yZV90ICpjaGEpIHsKKwljaGFub2RlX3QgKmFuY3VyOworCXZvaWQgKmRhdGE7CisKKwlpZiAoIShhbmN1ciA9IGNoYS0+YW5jdXIpIHx8IGFuY3VyLT5pY3VyciA9PSBjaGEtPm5zaXplKSB7CisJCWlmICghKGFuY3VyID0gKGNoYW5vZGVfdCAqKSB4ZGxfbWFsbG9jKHNpemVvZihjaGFub2RlX3QpICsgY2hhLT5uc2l6ZSkpKSB7CisKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWFuY3VyLT5pY3VyciA9IDA7CisJCWFuY3VyLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGNoYS0+dGFpbCkKKwkJCWNoYS0+dGFpbC0+bmV4dCA9IGFuY3VyOworCQlpZiAoIWNoYS0+aGVhZCkKKwkJCWNoYS0+aGVhZCA9IGFuY3VyOworCQljaGEtPnRhaWwgPSBhbmN1cjsKKwkJY2hhLT5hbmN1ciA9IGFuY3VyOworCX0KKworCWRhdGEgPSAoY2hhciAqKSBhbmN1ciArIHNpemVvZihjaGFub2RlX3QpICsgYW5jdXItPmljdXJyOworCWFuY3VyLT5pY3VyciArPSBjaGEtPmlzaXplOworCisJcmV0dXJuIGRhdGE7Cit9CisKKwordm9pZCAqeGRsX2NoYV9maXJzdChjaGFzdG9yZV90ICpjaGEpIHsKKwljaGFub2RlX3QgKnNuY3VyOworCisJaWYgKCEoY2hhLT5zbmN1ciA9IHNuY3VyID0gY2hhLT5oZWFkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwljaGEtPnNjdXJyID0gMDsKKworCXJldHVybiAoY2hhciAqKSBzbmN1ciArIHNpemVvZihjaGFub2RlX3QpICsgY2hhLT5zY3VycjsKK30KKworCit2b2lkICp4ZGxfY2hhX25leHQoY2hhc3RvcmVfdCAqY2hhKSB7CisJY2hhbm9kZV90ICpzbmN1cjsKKworCWlmICghKHNuY3VyID0gY2hhLT5zbmN1cikpCisJCXJldHVybiBOVUxMOworCWNoYS0+c2N1cnIgKz0gY2hhLT5pc2l6ZTsKKwlpZiAoY2hhLT5zY3VyciA9PSBzbmN1ci0+aWN1cnIpIHsKKwkJaWYgKCEoc25jdXIgPSBjaGEtPnNuY3VyID0gc25jdXItPm5leHQpKQorCQkJcmV0dXJuIE5VTEw7CisJCWNoYS0+c2N1cnIgPSAwOworCX0KKworCXJldHVybiAoY2hhciAqKSBzbmN1ciArIHNpemVvZihjaGFub2RlX3QpICsgY2hhLT5zY3VycjsKK30KKworCitsb25nIHhkbF9ndWVzc19saW5lcyhtbWZpbGVfdCAqbWYpIHsKKwlsb25nIG5sID0gMCwgc2l6ZSwgdHNpemUgPSAwOworCWNoYXIgY29uc3QgKmRhdGEsICpjdXIsICp0b3A7CisKKwlpZiAoKGN1ciA9IGRhdGEgPSB4ZGxfbW1maWxlX2ZpcnN0KG1mLCAmc2l6ZSkpICE9IE5VTEwpIHsKKwkJZm9yICh0b3AgPSBkYXRhICsgc2l6ZTsgbmwgPCBYRExfR1VFU1NfTkxJTkVTOykgeworCQkJaWYgKGN1ciA+PSB0b3ApIHsKKwkJCQl0c2l6ZSArPSAobG9uZykgKGN1ciAtIGRhdGEpOworCQkJCWlmICghKGN1ciA9IGRhdGEgPSB4ZGxfbW1maWxlX25leHQobWYsICZzaXplKSkpCisJCQkJCWJyZWFrOworCQkJCXRvcCA9IGRhdGEgKyBzaXplOworCQkJfQorCQkJbmwrKzsKKwkJCWlmICghKGN1ciA9IG1lbWNocihjdXIsICdcbicsIHRvcCAtIGN1cikpKQorCQkJCWN1ciA9IHRvcDsKKwkJCWVsc2UKKwkJCQljdXIrKzsKKwkJfQorCQl0c2l6ZSArPSAobG9uZykgKGN1ciAtIGRhdGEpOworCX0KKworCWlmIChubCAmJiB0c2l6ZSkKKwkJbmwgPSB4ZGxfbW1maWxlX3NpemUobWYpIC8gKHRzaXplIC8gbmwpOworCisJcmV0dXJuIG5sICsgMTsKK30KKworaW50IHhkbF9yZWNtYXRjaChjb25zdCBjaGFyICpsMSwgbG9uZyBzMSwgY29uc3QgY2hhciAqbDIsIGxvbmcgczIsIGxvbmcgZmxhZ3MpCit7CisJaW50IGkxLCBpMjsKKworCWlmIChmbGFncyAmIFhERl9JR05PUkVfV0hJVEVTUEFDRSkgeworCQlmb3IgKGkxID0gaTIgPSAwOyBpMSA8IHMxICYmIGkyIDwgczI7IGkxKyssIGkyKyspIHsKKwkJCWlmIChpc3NwYWNlKGwxW2kxXSkpCisJCQkJd2hpbGUgKGlzc3BhY2UobDFbaTFdKSAmJiBpMSA8IHMxKQorCQkJCQlpMSsrOworCQkJZWxzZSBpZiAoaXNzcGFjZShsMltpMl0pKQorCQkJCXdoaWxlIChpc3NwYWNlKGwyW2kyXSkgJiYgaTIgPCBzMikKKwkJCQkJaTIrKzsKKwkJCWVsc2UgaWYgKGwxW2kxXSAhPSBsMltpMl0pCisJCQkJcmV0dXJuIGwyW2kyXSAtIGwxW2kxXTsKKwkJfQorCQlpZiAoaTEgPj0gczEpCisJCQlyZXR1cm4gMTsKKwkJZWxzZSBpZiAoaTIgPj0gczIpCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChmbGFncyAmIFhERl9JR05PUkVfV0hJVEVTUEFDRV9DSEFOR0UpIHsKKwkJZm9yIChpMSA9IGkyID0gMDsgaTEgPCBzMSAmJiBpMiA8IHMyOyBpMSsrLCBpMisrKSB7CisJCQlpZiAoaXNzcGFjZShsMVtpMV0pKSB7CisJCQkJaWYgKCFpc3NwYWNlKGwyW2kyXSkpCisJCQkJCXJldHVybiAtMTsKKwkJCQl3aGlsZSAoaXNzcGFjZShsMVtpMV0pICYmIGkxIDwgczEpCisJCQkJCWkxKys7CisJCQkJd2hpbGUgKGlzc3BhY2UobDJbaTJdKSAmJiBpMiA8IHMyKQorCQkJCQlpMisrOworCQkJfSBlbHNlIGlmIChsMVtpMV0gIT0gbDJbaTJdKQorCQkJCXJldHVybiBsMltpMl0gLSBsMVtpMV07CisJCX0KKwkJaWYgKGkxID49IHMxKQorCQkJcmV0dXJuIDE7CisJCWVsc2UgaWYgKGkyID49IHMyKQorCQkJcmV0dXJuIC0xOworCX0gZWxzZQorCQlyZXR1cm4gczEgPT0gczIgJiYgIW1lbWNtcChsMSwgbDIsIHMxKTsKKworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIHhkbF9oYXNoX3JlY29yZChjaGFyIGNvbnN0ICoqZGF0YSwgY2hhciBjb25zdCAqdG9wLCBsb25nIGZsYWdzKSB7CisJdW5zaWduZWQgbG9uZyBoYSA9IDUzODE7CisJY2hhciBjb25zdCAqcHRyID0gKmRhdGE7CisKKwlmb3IgKDsgcHRyIDwgdG9wICYmICpwdHIgIT0gJ1xuJzsgcHRyKyspIHsKKwkJaWYgKGlzc3BhY2UoKnB0cikgJiYgKGZsYWdzICYgWERGX1dISVRFU1BBQ0VfRkxBR1MpKSB7CisJCQl3aGlsZSAocHRyIDwgdG9wICYmIGlzc3BhY2UoKnB0cikgJiYgcHRyWzFdICE9ICdcbicpCisJCQkJcHRyKys7CisJCQlpZiAoZmxhZ3MgJiBYREZfSUdOT1JFX1dISVRFU1BBQ0VfQ0hBTkdFKSB7CisJCQkJaGEgKz0gKGhhIDw8IDUpOworCQkJCWhhIF49ICh1bnNpZ25lZCBsb25nKSAnICc7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQloYSArPSAoaGEgPDwgNSk7CisJCWhhIF49ICh1bnNpZ25lZCBsb25nKSAqcHRyOworCX0KKwkqZGF0YSA9IHB0ciA8IHRvcCA/IHB0ciArIDE6IHB0cjsKKworCXJldHVybiBoYTsKK30KKworCit1bnNpZ25lZCBpbnQgeGRsX2hhc2hiaXRzKHVuc2lnbmVkIGludCBzaXplKSB7CisJdW5zaWduZWQgaW50IHZhbCA9IDEsIGJpdHMgPSAwOworCisJZm9yICg7IHZhbCA8IHNpemUgJiYgYml0cyA8IENIQVJfQklUICogc2l6ZW9mKHVuc2lnbmVkIGludCk7IHZhbCA8PD0gMSwgYml0cysrKTsKKwlyZXR1cm4gYml0cyA/IGJpdHM6IDE7Cit9CisKKworaW50IHhkbF9udW1fb3V0KGNoYXIgKm91dCwgbG9uZyB2YWwpIHsKKwljaGFyICpwdHIsICpzdHIgPSBvdXQ7CisJY2hhciBidWZbMzJdOworCisJcHRyID0gYnVmICsgc2l6ZW9mKGJ1ZikgLSAxOworCSpwdHIgPSAnXDAnOworCWlmICh2YWwgPCAwKSB7CisJCSotLXB0ciA9ICctJzsKKwkJdmFsID0gLXZhbDsKKwl9CisJZm9yICg7IHZhbCAmJiBwdHIgPiBidWY7IHZhbCAvPSAxMCkKKwkJKi0tcHRyID0gIjAxMjM0NTY3ODkiW3ZhbCAlIDEwXTsKKwlpZiAoKnB0cikKKwkJZm9yICg7ICpwdHI7IHB0cisrLCBzdHIrKykKKwkJCSpzdHIgPSAqcHRyOworCWVsc2UKKwkJKnN0cisrID0gJzAnOworCSpzdHIgPSAnXDAnOworCisJcmV0dXJuIHN0ciAtIG91dDsKK30KKworCitsb25nIHhkbF9hdG9sKGNoYXIgY29uc3QgKnN0ciwgY2hhciBjb25zdCAqKm5leHQpIHsKKwlsb25nIHZhbCwgYmFzZTsKKwljaGFyIGNvbnN0ICp0b3A7CisKKwlmb3IgKHRvcCA9IHN0cjsgWERMX0lTRElHSVQoKnRvcCk7IHRvcCsrKTsKKwlpZiAobmV4dCkKKwkJKm5leHQgPSB0b3A7CisJZm9yICh2YWwgPSAwLCBiYXNlID0gMSwgdG9wLS07IHRvcCA+PSBzdHI7IHRvcC0tLCBiYXNlICo9IDEwKQorCQl2YWwgKz0gYmFzZSAqIChsb25nKSgqdG9wIC0gJzAnKTsKKwlyZXR1cm4gdmFsOworfQorCisKK2ludCB4ZGxfZW1pdF9odW5rX2hkcihsb25nIHMxLCBsb25nIGMxLCBsb25nIHMyLCBsb25nIGMyLAorCQkgICAgICBjb25zdCBjaGFyICpmdW5jLCBsb25nIGZ1bmNsZW4sIHhkZW1pdGNiX3QgKmVjYikgeworCWludCBuYiA9IDA7CisJbW1idWZmZXJfdCBtYjsKKwljaGFyIGJ1ZlsxMjhdOworCisJbWVtY3B5KGJ1ZiwgIkBAIC0iLCA0KTsKKwluYiArPSA0OworCisJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMxID8gczE6IHMxIC0gMSk7CisKKwlpZiAoYzEgIT0gMSkgeworCQltZW1jcHkoYnVmICsgbmIsICIsIiwgMSk7CisJCW5iICs9IDE7CisKKwkJbmIgKz0geGRsX251bV9vdXQoYnVmICsgbmIsIGMxKTsKKwl9CisKKwltZW1jcHkoYnVmICsgbmIsICIgKyIsIDIpOworCW5iICs9IDI7CisKKwluYiArPSB4ZGxfbnVtX291dChidWYgKyBuYiwgYzIgPyBzMjogczIgLSAxKTsKKworCWlmIChjMiAhPSAxKSB7CisJCW1lbWNweShidWYgKyBuYiwgIiwiLCAxKTsKKwkJbmIgKz0gMTsKKworCQluYiArPSB4ZGxfbnVtX291dChidWYgKyBuYiwgYzIpOworCX0KKworCW1lbWNweShidWYgKyBuYiwgIiBAQCIsIDMpOworCW5iICs9IDM7CisJaWYgKGZ1bmMgJiYgZnVuY2xlbikgeworCQlidWZbbmIrK10gPSAnICc7CisJCWlmIChmdW5jbGVuID4gc2l6ZW9mKGJ1ZikgLSBuYiAtIDEpCisJCQlmdW5jbGVuID0gc2l6ZW9mKGJ1ZikgLSBuYiAtIDE7CisJCW1lbWNweShidWYgKyBuYiwgZnVuYywgZnVuY2xlbik7CisJCW5iICs9IGZ1bmNsZW47CisJfQorCWJ1ZltuYisrXSA9ICdcbic7CisKKwltYi5wdHIgPSBidWY7CisJbWIuc2l6ZSA9IG5iOworCWlmIChlY2ItPm91dGYoZWNiLT5wcml2LCAmbWIsIDEpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3hkaWZmL3h1dGlscy5oIGIveGRpZmYveHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL3hkaWZmL3h1dGlscy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiAgTGliWERpZmYgYnkgRGF2aWRlIExpYmVuemkgKCBGaWxlIERpZmZlcmVudGlhbCBMaWJyYXJ5ICkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkZSBMaWJlbnppCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKiAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWYgIWRlZmluZWQoWFVUSUxTX0gpCisjZGVmaW5lIFhVVElMU19ICisKKworCitsb25nIHhkbF9ib2dvc3FydChsb25nIG4pOworaW50IHhkbF9lbWl0X2RpZmZyZWMoY2hhciBjb25zdCAqcmVjLCBsb25nIHNpemUsIGNoYXIgY29uc3QgKnByZSwgbG9uZyBwc2l6ZSwKKwkJICAgICB4ZGVtaXRjYl90ICplY2IpOworaW50IHhkbF9jaGFfaW5pdChjaGFzdG9yZV90ICpjaGEsIGxvbmcgaXNpemUsIGxvbmcgaWNvdW50KTsKK3ZvaWQgeGRsX2NoYV9mcmVlKGNoYXN0b3JlX3QgKmNoYSk7Cit2b2lkICp4ZGxfY2hhX2FsbG9jKGNoYXN0b3JlX3QgKmNoYSk7Cit2b2lkICp4ZGxfY2hhX2ZpcnN0KGNoYXN0b3JlX3QgKmNoYSk7Cit2b2lkICp4ZGxfY2hhX25leHQoY2hhc3RvcmVfdCAqY2hhKTsKK2xvbmcgeGRsX2d1ZXNzX2xpbmVzKG1tZmlsZV90ICptZik7CitpbnQgeGRsX3JlY21hdGNoKGNvbnN0IGNoYXIgKmwxLCBsb25nIHMxLCBjb25zdCBjaGFyICpsMiwgbG9uZyBzMiwgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIHhkbF9oYXNoX3JlY29yZChjaGFyIGNvbnN0ICoqZGF0YSwgY2hhciBjb25zdCAqdG9wLCBsb25nIGZsYWdzKTsKK3Vuc2lnbmVkIGludCB4ZGxfaGFzaGJpdHModW5zaWduZWQgaW50IHNpemUpOworaW50IHhkbF9udW1fb3V0KGNoYXIgKm91dCwgbG9uZyB2YWwpOworbG9uZyB4ZGxfYXRvbChjaGFyIGNvbnN0ICpzdHIsIGNoYXIgY29uc3QgKipuZXh0KTsKK2ludCB4ZGxfZW1pdF9odW5rX2hkcihsb25nIHMxLCBsb25nIGMxLCBsb25nIHMyLCBsb25nIGMyLAorCQkgICAgICBjb25zdCBjaGFyICpmdW5jLCBsb25nIGZ1bmNsZW4sIHhkZW1pdGNiX3QgKmVjYik7CisKKworCisjZW5kaWYgLyogI2lmICFkZWZpbmVkKFhVVElMU19IKSAqLworCg==